]> code.delx.au - gnu-emacs-elpa/commitdiff
Mark merge point of f90-interface-browser.
authorStefan Monnier <monnier@iro.umontreal.ca>
Thu, 15 Aug 2013 04:04:04 +0000 (00:04 -0400)
committerStefan Monnier <monnier@iro.umontreal.ca>
Thu, 15 Aug 2013 04:04:04 +0000 (00:04 -0400)
1002 files changed:
.bzrignore [new symlink]
.gitignore [new file with mode: 0644]
COPYING [new file with mode: 0644]
GNUmakefile [new file with mode: 0644]
README [new file with mode: 0644]
admin/archive-contents.el [new file with mode: 0644]
admin/forward-diffs.py [new file with mode: 0755]
admin/org-synch.el [new file with mode: 0644]
admin/org-synch.sh [new file with mode: 0755]
admin/overmaint.txt [new file with mode: 0644]
admin/update-archive.sh [new file with mode: 0755]
copyright_exceptions [new file with mode: 0644]
externals-list [new file with mode: 0644]
html/index.html [new file with mode: 0644]
html/layout.css [new file with mode: 0644]
packages/README [new file with mode: 0644]
packages/ack/README.rst [new file with mode: 0644]
packages/ack/ack.el [new file with mode: 0644]
packages/ack/pcmpl-ack.el [new file with mode: 0644]
packages/adaptive-wrap/adaptive-wrap.el [new file with mode: 0644]
packages/all/all.el [new file with mode: 0644]
packages/auctex/README [new file with mode: 0644]
packages/auctex/auctex-pkg.el [new file with mode: 0644]
packages/auctex/auctex.info [new file with mode: 0644]
packages/auctex/auctex.info-1 [new file with mode: 0644]
packages/auctex/auctex.info-2 [new file with mode: 0644]
packages/auctex/bib-cite.el [new file with mode: 0644]
packages/auctex/context-en.el [new file with mode: 0644]
packages/auctex/context-nl.el [new file with mode: 0644]
packages/auctex/context.el [new file with mode: 0644]
packages/auctex/dir [new file with mode: 0644]
packages/auctex/doc/auctex.texi [new file with mode: 0644]
packages/auctex/doc/changes.texi [new file with mode: 0644]
packages/auctex/doc/copying.texi [new file with mode: 0644]
packages/auctex/doc/faq.texi [new file with mode: 0644]
packages/auctex/doc/fdl.texi [new file with mode: 0644]
packages/auctex/doc/history.texi [new file with mode: 0644]
packages/auctex/doc/install.texi [new file with mode: 0644]
packages/auctex/doc/intro.texi [new file with mode: 0644]
packages/auctex/doc/macros.texi [new file with mode: 0644]
packages/auctex/doc/preview-dtxdoc.texi [new file with mode: 0644]
packages/auctex/doc/preview-faq.texi [new file with mode: 0644]
packages/auctex/doc/preview-latex.texi [new file with mode: 0644]
packages/auctex/doc/preview-problems.texi [new file with mode: 0644]
packages/auctex/doc/preview-readme.texi [new file with mode: 0644]
packages/auctex/doc/preview-todo.texi [new file with mode: 0644]
packages/auctex/doc/quickstart.texi [new file with mode: 0644]
packages/auctex/doc/todo.texi [new file with mode: 0644]
packages/auctex/doc/version.texi [new file with mode: 0644]
packages/auctex/doc/wininstall.texi [new file with mode: 0644]
packages/auctex/font-latex.el [new file with mode: 0644]
packages/auctex/images/amstex.xpm [new file with mode: 0644]
packages/auctex/images/bibtex.xpm [new file with mode: 0644]
packages/auctex/images/dropdown.xpm [new file with mode: 0644]
packages/auctex/images/dvipdf.xpm [new file with mode: 0644]
packages/auctex/images/dvips.xpm [new file with mode: 0644]
packages/auctex/images/error.xpm [new file with mode: 0644]
packages/auctex/images/exec.xpm [new file with mode: 0644]
packages/auctex/images/execbibtex.xpm [new file with mode: 0644]
packages/auctex/images/execdvips.xpm [new file with mode: 0644]
packages/auctex/images/execerror.xpm [new file with mode: 0644]
packages/auctex/images/execpdftex.xpm [new file with mode: 0644]
packages/auctex/images/exectex.xpm [new file with mode: 0644]
packages/auctex/images/execviewdvi.xpm [new file with mode: 0644]
packages/auctex/images/execviewpdf.xpm [new file with mode: 0644]
packages/auctex/images/execviewps.xpm [new file with mode: 0644]
packages/auctex/images/gv.xpm [new file with mode: 0644]
packages/auctex/images/jumpdvi.xpm [new file with mode: 0644]
packages/auctex/images/ltx-symb-turn-off.xpm [new file with mode: 0644]
packages/auctex/images/ltx-symb-turn-on.xpm [new file with mode: 0644]
packages/auctex/images/pdftex.xpm [new file with mode: 0644]
packages/auctex/images/prverr16.xpm [new file with mode: 0644]
packages/auctex/images/prverr20.xpm [new file with mode: 0644]
packages/auctex/images/prverr24.xbm [new file with mode: 0644]
packages/auctex/images/prverr24.xpm [new file with mode: 0644]
packages/auctex/images/prvtex-cap-up.xpm [new file with mode: 0644]
packages/auctex/images/prvtex12.xbm [new file with mode: 0644]
packages/auctex/images/prvtex12.xpm [new file with mode: 0644]
packages/auctex/images/prvtex16.xbm [new file with mode: 0644]
packages/auctex/images/prvtex16.xpm [new file with mode: 0644]
packages/auctex/images/prvtex20.xpm [new file with mode: 0644]
packages/auctex/images/prvtex24.xbm [new file with mode: 0644]
packages/auctex/images/prvtex24.xpm [new file with mode: 0644]
packages/auctex/images/prvwrk12.xpm [new file with mode: 0644]
packages/auctex/images/prvwrk14.xpm [new file with mode: 0644]
packages/auctex/images/prvwrk16.xpm [new file with mode: 0644]
packages/auctex/images/prvwrk20.xpm [new file with mode: 0644]
packages/auctex/images/prvwrk24.xbm [new file with mode: 0644]
packages/auctex/images/prvwrk24.xpm [new file with mode: 0644]
packages/auctex/images/pspdf.xpm [new file with mode: 0644]
packages/auctex/images/sep.xpm [new file with mode: 0644]
packages/auctex/images/tex.xpm [new file with mode: 0644]
packages/auctex/images/view.xpm [new file with mode: 0644]
packages/auctex/images/viewdvi.xpm [new file with mode: 0644]
packages/auctex/images/viewpdf.xpm [new file with mode: 0644]
packages/auctex/images/viewps.xpm [new file with mode: 0644]
packages/auctex/latex.el [new file with mode: 0644]
packages/auctex/latex/prauctex.cfg [new file with mode: 0644]
packages/auctex/latex/prauctex.def [new file with mode: 0644]
packages/auctex/latex/prcounters.def [new file with mode: 0644]
packages/auctex/latex/preview.sty [new file with mode: 0644]
packages/auctex/latex/prfootnotes.def [new file with mode: 0644]
packages/auctex/latex/prlyx.def [new file with mode: 0644]
packages/auctex/latex/prshowbox.def [new file with mode: 0644]
packages/auctex/latex/prshowlabels.def [new file with mode: 0644]
packages/auctex/latex/prtightpage.def [new file with mode: 0644]
packages/auctex/latex/prtracingall.def [new file with mode: 0644]
packages/auctex/multi-prompt.el [new file with mode: 0644]
packages/auctex/preview-latex.info [new file with mode: 0644]
packages/auctex/preview.el [new file with mode: 0644]
packages/auctex/prv-emacs.el [new file with mode: 0644]
packages/auctex/style/.nosearch [new file with mode: 0644]
packages/auctex/style/CJK.el [new file with mode: 0644]
packages/auctex/style/CJKutf8.el [new file with mode: 0644]
packages/auctex/style/MinionPro.el [new file with mode: 0644]
packages/auctex/style/alltt.el [new file with mode: 0644]
packages/auctex/style/alphanum.el [new file with mode: 0644]
packages/auctex/style/amsart.el [new file with mode: 0644]
packages/auctex/style/amsbook.el [new file with mode: 0644]
packages/auctex/style/amsbsy.el [new file with mode: 0644]
packages/auctex/style/amsmath.el [new file with mode: 0644]
packages/auctex/style/amsopn.el [new file with mode: 0644]
packages/auctex/style/amstex.el [new file with mode: 0644]
packages/auctex/style/amstext.el [new file with mode: 0644]
packages/auctex/style/amsthm.el [new file with mode: 0644]
packages/auctex/style/article.el [new file with mode: 0644]
packages/auctex/style/austrian.el [new file with mode: 0644]
packages/auctex/style/babel.el [new file with mode: 0644]
packages/auctex/style/beamer.el [new file with mode: 0644]
packages/auctex/style/book.el [new file with mode: 0644]
packages/auctex/style/booktabs.el [new file with mode: 0644]
packages/auctex/style/bulgarian.el [new file with mode: 0644]
packages/auctex/style/captcont.el [new file with mode: 0644]
packages/auctex/style/comment.el [new file with mode: 0644]
packages/auctex/style/csquotes.el [new file with mode: 0644]
packages/auctex/style/czech.el [new file with mode: 0644]
packages/auctex/style/danish.el [new file with mode: 0644]
packages/auctex/style/dk-bib.el [new file with mode: 0644]
packages/auctex/style/dk.el [new file with mode: 0644]
packages/auctex/style/doc.el [new file with mode: 0644]
packages/auctex/style/dutch.el [new file with mode: 0644]
packages/auctex/style/emp.el [new file with mode: 0644]
packages/auctex/style/fancyref.el [new file with mode: 0644]
packages/auctex/style/flashcards.el [new file with mode: 0644]
packages/auctex/style/foils.el [new file with mode: 0644]
packages/auctex/style/francais.el [new file with mode: 0644]
packages/auctex/style/frenchb.el [new file with mode: 0644]
packages/auctex/style/german.el [new file with mode: 0644]
packages/auctex/style/graphics.el [new file with mode: 0644]
packages/auctex/style/graphicx.el [new file with mode: 0644]
packages/auctex/style/harvard.el [new file with mode: 0644]
packages/auctex/style/hyperref.el [new file with mode: 0644]
packages/auctex/style/icelandic.el [new file with mode: 0644]
packages/auctex/style/index.el [new file with mode: 0644]
packages/auctex/style/inputenc.el [new file with mode: 0644]
packages/auctex/style/italian.el [new file with mode: 0644]
packages/auctex/style/j-article.el [new file with mode: 0644]
packages/auctex/style/j-book.el [new file with mode: 0644]
packages/auctex/style/j-report.el [new file with mode: 0644]
packages/auctex/style/jarticle.el [new file with mode: 0644]
packages/auctex/style/jbook.el [new file with mode: 0644]
packages/auctex/style/jreport.el [new file with mode: 0644]
packages/auctex/style/jsarticle.el [new file with mode: 0644]
packages/auctex/style/jsbook.el [new file with mode: 0644]
packages/auctex/style/jura.el [new file with mode: 0644]
packages/auctex/style/jurabib.el [new file with mode: 0644]
packages/auctex/style/letter.el [new file with mode: 0644]
packages/auctex/style/listings.el [new file with mode: 0644]
packages/auctex/style/ltx-base.el [new file with mode: 0644]
packages/auctex/style/ltxdoc.el [new file with mode: 0644]
packages/auctex/style/makeidx.el [new file with mode: 0644]
packages/auctex/style/mdwlist.el [new file with mode: 0644]
packages/auctex/style/multido.el [new file with mode: 0644]
packages/auctex/style/multind.el [new file with mode: 0644]
packages/auctex/style/natbib.el [new file with mode: 0644]
packages/auctex/style/naustrian.el [new file with mode: 0644]
packages/auctex/style/ngerman.el [new file with mode: 0644]
packages/auctex/style/nicefrac.el [new file with mode: 0644]
packages/auctex/style/nomencl.el [new file with mode: 0644]
packages/auctex/style/paralist.el [new file with mode: 0644]
packages/auctex/style/pdfsync.el [new file with mode: 0644]
packages/auctex/style/plfonts.el [new file with mode: 0644]
packages/auctex/style/plhb.el [new file with mode: 0644]
packages/auctex/style/polish.el [new file with mode: 0644]
packages/auctex/style/polski.el [new file with mode: 0644]
packages/auctex/style/pst-grad.el [new file with mode: 0644]
packages/auctex/style/pst-node.el [new file with mode: 0644]
packages/auctex/style/pst-plot.el [new file with mode: 0644]
packages/auctex/style/pst-slpe.el [new file with mode: 0644]
packages/auctex/style/pstricks.el [new file with mode: 0644]
packages/auctex/style/report.el [new file with mode: 0644]
packages/auctex/style/ruby.el [new file with mode: 0644]
packages/auctex/style/scrartcl.el [new file with mode: 0644]
packages/auctex/style/scrbase.el [new file with mode: 0644]
packages/auctex/style/scrbook.el [new file with mode: 0644]
packages/auctex/style/scrlttr2.el [new file with mode: 0644]
packages/auctex/style/scrpage2.el [new file with mode: 0644]
packages/auctex/style/scrreprt.el [new file with mode: 0644]
packages/auctex/style/shortvrb.el [new file with mode: 0644]
packages/auctex/style/slides.el [new file with mode: 0644]
packages/auctex/style/slovak.el [new file with mode: 0644]
packages/auctex/style/subfigure.el [new file with mode: 0644]
packages/auctex/style/swedish.el [new file with mode: 0644]
packages/auctex/style/tabularx.el [new file with mode: 0644]
packages/auctex/style/units.el [new file with mode: 0644]
packages/auctex/style/url.el [new file with mode: 0644]
packages/auctex/style/varioref.el [new file with mode: 0644]
packages/auctex/style/verbatim.el [new file with mode: 0644]
packages/auctex/style/virtex.el [new file with mode: 0644]
packages/auctex/tex-bar.el [new file with mode: 0644]
packages/auctex/tex-buf.el [new file with mode: 0644]
packages/auctex/tex-fold.el [new file with mode: 0644]
packages/auctex/tex-font.el [new file with mode: 0644]
packages/auctex/tex-fptex.el [new file with mode: 0644]
packages/auctex/tex-info.el [new file with mode: 0644]
packages/auctex/tex-jp.el [new file with mode: 0644]
packages/auctex/tex-mik.el [new file with mode: 0644]
packages/auctex/tex-site.el [new file with mode: 0644]
packages/auctex/tex-style.el [new file with mode: 0644]
packages/auctex/tex.el [new file with mode: 0644]
packages/auctex/texmathp.el [new file with mode: 0644]
packages/auctex/toolbar-x.el [new file with mode: 0644]
packages/cl-lib/cl-lib.el [new file with mode: 0644]
packages/coffee-mode/README.md [new file with mode: 0644]
packages/coffee-mode/coffee-mode-pkg.el [new file with mode: 0644]
packages/coffee-mode/coffee-mode.el [new file with mode: 0644]
packages/coffee-mode/examples/basic.coffee [new file with mode: 0644]
packages/coffee-mode/examples/edge.coffee [new file with mode: 0644]
packages/coffee-mode/examples/imenu.coffee [new file with mode: 0644]
packages/company/.dir-locals.el [new file with mode: 0644]
packages/company/.gitignore [new file with mode: 0644]
packages/company/.travis.yml [new file with mode: 0644]
packages/company/Makefile [new file with mode: 0644]
packages/company/NEWS.md [new file with mode: 0644]
packages/company/README.md [new file with mode: 0644]
packages/company/company-abbrev.el [new file with mode: 0644]
packages/company/company-capf.el [new file with mode: 0644]
packages/company/company-clang.el [new file with mode: 0644]
packages/company/company-css.el [new file with mode: 0644]
packages/company/company-dabbrev-code.el [new file with mode: 0644]
packages/company/company-dabbrev.el [new file with mode: 0644]
packages/company/company-eclim.el [new file with mode: 0644]
packages/company/company-elisp.el [new file with mode: 0644]
packages/company/company-etags.el [new file with mode: 0644]
packages/company/company-files.el [new file with mode: 0644]
packages/company/company-gtags.el [new file with mode: 0644]
packages/company/company-ispell.el [new file with mode: 0644]
packages/company/company-keywords.el [new file with mode: 0644]
packages/company/company-nxml.el [new file with mode: 0644]
packages/company/company-oddmuse.el [new file with mode: 0644]
packages/company/company-pysmell.el [new file with mode: 0644]
packages/company/company-ropemacs.el [new file with mode: 0644]
packages/company/company-semantic.el [new file with mode: 0644]
packages/company/company-template.el [new file with mode: 0644]
packages/company/company-tempo.el [new file with mode: 0644]
packages/company/company-tests.el [new file with mode: 0644]
packages/company/company-xcode.el [new file with mode: 0644]
packages/company/company.el [new file with mode: 0644]
packages/csv-mode/csv-mode.el [new file with mode: 0644]
packages/debbugs/Debbugs.wsdl [new file with mode: 0644]
packages/debbugs/README [new file with mode: 0644]
packages/debbugs/debbugs-gnu.el [new file with mode: 0644]
packages/debbugs/debbugs-pkg.el [new file with mode: 0644]
packages/debbugs/debbugs.el [new file with mode: 0644]
packages/debbugs/debbugs.texi [new file with mode: 0644]
packages/dict-tree/dict-tree.el [new file with mode: 0644]
packages/djvu/djvu.el [new file with mode: 0644]
packages/docbook/docbook.el [new file with mode: 0644]
packages/ediprolog/ediprolog.el [new file with mode: 0644]
packages/eldoc-eval/README.md [new file with mode: 0644]
packages/eldoc-eval/eldoc-eval.el [new file with mode: 0644]
packages/elpa.rss [new file with mode: 0644]
packages/enwc/COPYING [new file with mode: 0644]
packages/enwc/doc/connman.txt [new file with mode: 0644]
packages/enwc/doc/enwc.texi [new file with mode: 0644]
packages/enwc/doc/fdl.texi [new file with mode: 0644]
packages/enwc/doc/nm-dbus.txt [new file with mode: 0644]
packages/enwc/doc/settings.txt [new file with mode: 0644]
packages/enwc/doc/version.texi [new file with mode: 0644]
packages/enwc/enwc-cm.el [new file with mode: 0644]
packages/enwc/enwc-nm.el [new file with mode: 0644]
packages/enwc/enwc-pkg.el [new file with mode: 0644]
packages/enwc/enwc-setup.el [new file with mode: 0644]
packages/enwc/enwc-wicd.el [new file with mode: 0644]
packages/enwc/enwc.el [new file with mode: 0644]
packages/epoch-view/epoch-view.el [new file with mode: 0644]
packages/f90-interface-browser/f90-interface-browser.el [moved from f90-interface-browser.el with 100% similarity]
packages/f90-interface-browser/f90-tests.el [moved from f90-tests.el with 100% similarity]
packages/ggtags/ggtags.el [new file with mode: 0644]
packages/heap/heap.el [new file with mode: 0644]
packages/ioccur/ioccur.el [new file with mode: 0644]
packages/jgraph-mode/jgraph-mode.el [new file with mode: 0644]
packages/js2-mode/js2-imenu-extras.el [new file with mode: 0644]
packages/js2-mode/js2-mode.el [new file with mode: 0644]
packages/jumpc/jumpc.el [new file with mode: 0644]
packages/lex/lex-parse-re.el [new file with mode: 0644]
packages/lex/lex-pkg.el [new file with mode: 0644]
packages/lex/lex.el [new file with mode: 0644]
packages/lmc/lmc.el [new file with mode: 0644]
packages/load-dir/load-dir.el [new file with mode: 0644]
packages/markchars/markchars.el [new file with mode: 0644]
packages/memory-usage/memory-usage.el [new file with mode: 0644]
packages/minimap/minimap.el [new file with mode: 0644]
packages/muse/README [new file with mode: 0644]
packages/muse/cgi.el [new file with mode: 0644]
packages/muse/dir [new file with mode: 0644]
packages/muse/htmlize-hack.el [new file with mode: 0644]
packages/muse/httpd.el [new file with mode: 0644]
packages/muse/muse-backlink.el [new file with mode: 0644]
packages/muse/muse-blosxom.el [new file with mode: 0644]
packages/muse/muse-book.el [new file with mode: 0644]
packages/muse/muse-colors.el [new file with mode: 0644]
packages/muse/muse-context.el [new file with mode: 0644]
packages/muse/muse-docbook.el [new file with mode: 0644]
packages/muse/muse-groff.el [new file with mode: 0644]
packages/muse/muse-html.el [new file with mode: 0644]
packages/muse/muse-http.el [new file with mode: 0644]
packages/muse/muse-ikiwiki.el [new file with mode: 0644]
packages/muse/muse-import-docbook.el [new file with mode: 0644]
packages/muse/muse-import-latex.el [new file with mode: 0644]
packages/muse/muse-import-xml.el [new file with mode: 0644]
packages/muse/muse-ipc.el [new file with mode: 0644]
packages/muse/muse-journal.el [new file with mode: 0644]
packages/muse/muse-latex.el [new file with mode: 0644]
packages/muse/muse-latex2png.el [new file with mode: 0644]
packages/muse/muse-mode.el [new file with mode: 0644]
packages/muse/muse-pkg.el [new file with mode: 0644]
packages/muse/muse-poem.el [new file with mode: 0644]
packages/muse/muse-project.el [new file with mode: 0644]
packages/muse/muse-protocols.el [new file with mode: 0644]
packages/muse/muse-publish.el [new file with mode: 0644]
packages/muse/muse-regexps.el [new file with mode: 0644]
packages/muse/muse-texinfo.el [new file with mode: 0644]
packages/muse/muse-wiki.el [new file with mode: 0644]
packages/muse/muse-xml-common.el [new file with mode: 0644]
packages/muse/muse-xml.el [new file with mode: 0644]
packages/muse/muse.el [new file with mode: 0644]
packages/muse/muse.info [new file with mode: 0644]
packages/muse/texi/Makefile [new file with mode: 0644]
packages/muse/texi/dir-template [new file with mode: 0644]
packages/muse/texi/doclicense.texi [new file with mode: 0644]
packages/muse/texi/muse.texi [new file with mode: 0644]
packages/nhexl-mode/nhexl-mode.el [new file with mode: 0644]
packages/nlinum/nlinum.el [new file with mode: 0644]
packages/notes-mode/COPYING [new file with mode: 0644]
packages/notes-mode/HTML/notes-mode.html [new file with mode: 0644]
packages/notes-mode/HTML/notes-mode/notes-mode.html [new file with mode: 0644]
packages/notes-mode/HTML/notes-mode/notes-mode_1.html [new file with mode: 0644]
packages/notes-mode/HTML/notes-mode/notes-mode_2.html [new file with mode: 0644]
packages/notes-mode/HTML/notes-mode/notes-mode_3.html [new file with mode: 0644]
packages/notes-mode/HTML/notes-mode/notes-mode_4.html [new file with mode: 0644]
packages/notes-mode/HTML/notes-mode/notes-mode_5.html [new file with mode: 0644]
packages/notes-mode/HTML/notes-mode/notes-mode_6.html [new file with mode: 0644]
packages/notes-mode/HTML/notes-mode/notes-mode_7.html [new file with mode: 0644]
packages/notes-mode/HTML/notes-mode/notes-mode_abt.html [new file with mode: 0644]
packages/notes-mode/HTML/notes-mode/notes-mode_fot.html [new file with mode: 0644]
packages/notes-mode/HTML/notes-mode/notes-mode_toc.html [new file with mode: 0644]
packages/notes-mode/HTML/notes-mode_1.html [new file with mode: 0644]
packages/notes-mode/HTML/notes-mode_2.html [new file with mode: 0644]
packages/notes-mode/HTML/notes-mode_3.html [new file with mode: 0644]
packages/notes-mode/HTML/notes-mode_4.html [new file with mode: 0644]
packages/notes-mode/HTML/notes-mode_5.html [new file with mode: 0644]
packages/notes-mode/HTML/notes-mode_6.html [new file with mode: 0644]
packages/notes-mode/HTML/notes-mode_7.html [new file with mode: 0644]
packages/notes-mode/HTML/notes-mode_abt.html [new file with mode: 0644]
packages/notes-mode/HTML/notes-mode_fot.html [new file with mode: 0644]
packages/notes-mode/HTML/notes-mode_toc.html [new file with mode: 0644]
packages/notes-mode/Makefile.in [new file with mode: 0644]
packages/notes-mode/Notes.pm [new file with mode: 0755]
packages/notes-mode/NotesIndex.pm [new file with mode: 0755]
packages/notes-mode/NotesVars.pm [new file with mode: 0755]
packages/notes-mode/README [new file with mode: 0644]
packages/notes-mode/catsubject [new file with mode: 0755]
packages/notes-mode/dir [new file with mode: 0644]
packages/notes-mode/mkall [new file with mode: 0755]
packages/notes-mode/mkconfig [new file with mode: 0755]
packages/notes-mode/mkindex [new file with mode: 0755]
packages/notes-mode/mkindexcache [new file with mode: 0755]
packages/notes-mode/mknew [new file with mode: 0755]
packages/notes-mode/mkprevnext [new file with mode: 0755]
packages/notes-mode/mkrawindex [new file with mode: 0755]
packages/notes-mode/notes-aux.el [new file with mode: 0644]
packages/notes-mode/notes-emacs.el [new file with mode: 0644]
packages/notes-mode/notes-first.el [new file with mode: 0644]
packages/notes-mode/notes-index-mode.el [new file with mode: 0644]
packages/notes-mode/notes-mode-pkg.el [new file with mode: 0644]
packages/notes-mode/notes-mode.el [new file with mode: 0644]
packages/notes-mode/notes-mode.info [new file with mode: 0644]
packages/notes-mode/notes-mode.texi [new file with mode: 0644]
packages/notes-mode/notes-url.el [new file with mode: 0644]
packages/notes-mode/notes-variables.el [new file with mode: 0644]
packages/notes-mode/notes-xemacs.el [new file with mode: 0644]
packages/notes-mode/notesinit [new file with mode: 0755]
packages/notes-mode/release [new file with mode: 0644]
packages/notes-mode/sample.notesrc [new file with mode: 0755]
packages/notes-mode/setcrontab [new file with mode: 0755]
packages/num3-mode/num3-mode.el [new file with mode: 0644]
packages/oauth2/oauth2.el [new file with mode: 0644]
packages/omn-mode/omn-mode.el [new file with mode: 0644]
packages/quarter-plane/quarter-plane.el [new file with mode: 0644]
packages/queue/queue.el [new file with mode: 0644]
packages/rainbow-mode/rainbow-mode.el [new file with mode: 0644]
packages/register-list/register-list.el [new file with mode: 0755]
packages/shen-mode/README [new file with mode: 0644]
packages/shen-mode/inf-shen.el [new file with mode: 0644]
packages/shen-mode/shen-mode-pkg.el [new file with mode: 0644]
packages/shen-mode/shen-mode.el [new file with mode: 0644]
packages/sisu-mode/sisu-mode.el [new file with mode: 0644]
packages/smart-operator/smart-operator.el [new file with mode: 0644]
packages/sml-mode/README [new file with mode: 0644]
packages/sml-mode/TODO [new file with mode: 0644]
packages/sml-mode/mltags [new file with mode: 0755]
packages/sml-mode/sml-mode.el [new file with mode: 0644]
packages/sml-mode/sml-mode.spec [new file with mode: 0644]
packages/sml-mode/sml-mode.texi [new file with mode: 0644]
packages/sml-mode/testcases.sml [new file with mode: 0644]
packages/sokoban/sokoban-pkg.el [new file with mode: 0644]
packages/sokoban/sokoban.el [new file with mode: 0644]
packages/sokoban/sokoban.levels [new file with mode: 0644]
packages/svg-clock/svg-clock.el [new file with mode: 0644]
packages/tNFA/tNFA.el [new file with mode: 0644]
packages/trie/trie.el [new file with mode: 0644]
packages/undo-tree/undo-tree.el [new file with mode: 0644]
packages/uni-confusables/confusables.txt [new file with mode: 0644]
packages/uni-confusables/gen-confusables.el [new file with mode: 0644]
packages/uni-confusables/uni-confusables-pkg.el [new file with mode: 0644]
packages/uni-confusables/uni-confusables.el [new file with mode: 0644]
packages/vlf/vlf.el [new file with mode: 0644]
packages/websocket/COPYING [new file with mode: 0644]
packages/websocket/README.org [new file with mode: 0644]
packages/websocket/testserver.py [new file with mode: 0644]
packages/websocket/websocket-functional-test.el [new file with mode: 0644]
packages/websocket/websocket-test.el [new file with mode: 0644]
packages/websocket/websocket.el [new file with mode: 0644]
packages/windresize/windresize.el [new file with mode: 0755]
packages/xclip/xclip.el [new file with mode: 0644]
packages/yasnippet/README [new file with mode: 0644]
packages/yasnippet/dropdown-list.el [new file with mode: 0644]
packages/yasnippet/snippets/c++-mode/.yas-parents [new file with mode: 0644]
packages/yasnippet/snippets/c++-mode/beginend [new file with mode: 0644]
packages/yasnippet/snippets/c++-mode/class [new file with mode: 0644]
packages/yasnippet/snippets/c++-mode/ns [new file with mode: 0644]
packages/yasnippet/snippets/c++-mode/template [new file with mode: 0644]
packages/yasnippet/snippets/c++-mode/using [new file with mode: 0644]
packages/yasnippet/snippets/c-mode/.yas-parents [new file with mode: 0644]
packages/yasnippet/snippets/c-mode/fopen [new file with mode: 0644]
packages/yasnippet/snippets/c-mode/printf [new file with mode: 0644]
packages/yasnippet/snippets/cc-mode/.yas-parents [new file with mode: 0644]
packages/yasnippet/snippets/cc-mode/do [new file with mode: 0644]
packages/yasnippet/snippets/cc-mode/for [new file with mode: 0644]
packages/yasnippet/snippets/cc-mode/if [new file with mode: 0644]
packages/yasnippet/snippets/cc-mode/inc [new file with mode: 0644]
packages/yasnippet/snippets/cc-mode/inc.1 [new file with mode: 0644]
packages/yasnippet/snippets/cc-mode/main [new file with mode: 0644]
packages/yasnippet/snippets/cc-mode/once [new file with mode: 0644]
packages/yasnippet/snippets/cc-mode/struct [new file with mode: 0644]
packages/yasnippet/snippets/cperl-mode/.yas-parents [new file with mode: 0644]
packages/yasnippet/snippets/csharp-mode/.yas-parents [new file with mode: 0644]
packages/yasnippet/snippets/csharp-mode/attrib [new file with mode: 0644]
packages/yasnippet/snippets/csharp-mode/attrib.1 [new file with mode: 0644]
packages/yasnippet/snippets/csharp-mode/attrib.2 [new file with mode: 0644]
packages/yasnippet/snippets/csharp-mode/class [new file with mode: 0644]
packages/yasnippet/snippets/csharp-mode/comment [new file with mode: 0644]
packages/yasnippet/snippets/csharp-mode/comment.1 [new file with mode: 0644]
packages/yasnippet/snippets/csharp-mode/comment.2 [new file with mode: 0644]
packages/yasnippet/snippets/csharp-mode/comment.3 [new file with mode: 0644]
packages/yasnippet/snippets/csharp-mode/method [new file with mode: 0644]
packages/yasnippet/snippets/csharp-mode/namespace [new file with mode: 0644]
packages/yasnippet/snippets/csharp-mode/prop [new file with mode: 0644]
packages/yasnippet/snippets/csharp-mode/region [new file with mode: 0644]
packages/yasnippet/snippets/csharp-mode/using [new file with mode: 0644]
packages/yasnippet/snippets/csharp-mode/using.1 [new file with mode: 0644]
packages/yasnippet/snippets/csharp-mode/using.2 [new file with mode: 0644]
packages/yasnippet/snippets/css-mode/.yas-parents [new file with mode: 0644]
packages/yasnippet/snippets/css-mode/bg [new file with mode: 0644]
packages/yasnippet/snippets/css-mode/bg.1 [new file with mode: 0644]
packages/yasnippet/snippets/css-mode/bor [new file with mode: 0644]
packages/yasnippet/snippets/css-mode/cl [new file with mode: 0644]
packages/yasnippet/snippets/css-mode/disp.block [new file with mode: 0644]
packages/yasnippet/snippets/css-mode/disp.inline [new file with mode: 0644]
packages/yasnippet/snippets/css-mode/disp.none [new file with mode: 0644]
packages/yasnippet/snippets/css-mode/ff [new file with mode: 0644]
packages/yasnippet/snippets/css-mode/fs [new file with mode: 0644]
packages/yasnippet/snippets/css-mode/mar.bottom [new file with mode: 0644]
packages/yasnippet/snippets/css-mode/mar.left [new file with mode: 0644]
packages/yasnippet/snippets/css-mode/mar.mar [new file with mode: 0644]
packages/yasnippet/snippets/css-mode/mar.margin [new file with mode: 0644]
packages/yasnippet/snippets/css-mode/mar.right [new file with mode: 0644]
packages/yasnippet/snippets/css-mode/mar.top [new file with mode: 0644]
packages/yasnippet/snippets/css-mode/pad.bottom [new file with mode: 0644]
packages/yasnippet/snippets/css-mode/pad.left [new file with mode: 0644]
packages/yasnippet/snippets/css-mode/pad.pad [new file with mode: 0644]
packages/yasnippet/snippets/css-mode/pad.padding [new file with mode: 0644]
packages/yasnippet/snippets/css-mode/pad.right [new file with mode: 0644]
packages/yasnippet/snippets/css-mode/pad.top [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/.read_me [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/.yas-parents [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/add-hook.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/and.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/append.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/apply.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/aref.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/aset.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/assq.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/autoload.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/backward-char.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/beginning-of-line.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/bounds-of-thing-at-point.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/buffer-file-name.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/buffer-modified-p.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/buffer-substring-no-properties.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/buffer-substring.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/car.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/cdr.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/concat.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/cond.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/condition-case.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/cons.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/consp.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/copy-directory.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/copy-file.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/current-buffer.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/custom-autoload.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/defalias.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/defcustom.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/define-key.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/defsubst.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/defun.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/defvar.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/delete-char.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/delete-directory.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/delete-file.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/delete-region.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/directory-files.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/dolist.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/end-of-line.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/eq.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/equal.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/error.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/expand-file-name.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/f.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/fboundp.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/file-name-directory.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/file-name-extension.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/file-name-nondirectory.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/file-name-sans-extension.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/file-relative-name.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/find-file.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/format.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/forward-char.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/forward-line.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/funcall.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/function.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/get.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/global-set-key.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/goto-char.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/if.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/insert-file-contents.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/insert.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/interactive.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/kbd.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/kill-buffer.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/lambda.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/length.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/let.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/line-beginning-position.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/line-end-position.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/list.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/looking-at.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/make-directory.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/make-local-variable.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/mapc.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/mapcar.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/match-beginning.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/match-end.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/match-string.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/memq.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/message.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/not.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/nth.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/null.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/number-to-string.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/or.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/point-max.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/point-min.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/point.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/princ.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/print.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/progn.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/push.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/put.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/re-search-backward.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/re-search-forward.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/region-active-p.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/region-beginning.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/region-end.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/rename-file.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/repeat.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/replace-regexp-in-string.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/replace-regexp.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/require.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/save-buffer.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/save-excursion.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/search-backward-regexp.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/search-backward.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/search-forward-regexp.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/search-forward.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/set-buffer.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/set-file-modes.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/set-mark.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/set.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/setq.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/skip-chars-backward.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/skip-chars-forward.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/split-string.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/string-match.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/string-to-number.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/string.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/string=.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/stringp.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/substring.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/thing-at-point.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/unless.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/vector.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/when.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/while.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/widget-get.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/with-current-buffer.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/x-dired.process_marked.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/x-file.process.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/x-file.read-lines.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/x-find-replace.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/x-grabstring.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/x-grabthing.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/x-traverse_dir.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/x-word-or-region.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/y-or-n-p.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/emacs-lisp-mode/yes-or-no-p.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/erlang-mode/.yas-parents [new file with mode: 0644]
packages/yasnippet/snippets/erlang-mode/after [new file with mode: 0644]
packages/yasnippet/snippets/erlang-mode/begin [new file with mode: 0644]
packages/yasnippet/snippets/erlang-mode/beh [new file with mode: 0644]
packages/yasnippet/snippets/erlang-mode/case [new file with mode: 0644]
packages/yasnippet/snippets/erlang-mode/compile [new file with mode: 0644]
packages/yasnippet/snippets/erlang-mode/def [new file with mode: 0644]
packages/yasnippet/snippets/erlang-mode/exp [new file with mode: 0644]
packages/yasnippet/snippets/erlang-mode/fun [new file with mode: 0644]
packages/yasnippet/snippets/erlang-mode/if [new file with mode: 0644]
packages/yasnippet/snippets/erlang-mode/ifdef [new file with mode: 0644]
packages/yasnippet/snippets/erlang-mode/ifndef [new file with mode: 0644]
packages/yasnippet/snippets/erlang-mode/imp [new file with mode: 0644]
packages/yasnippet/snippets/erlang-mode/inc [new file with mode: 0644]
packages/yasnippet/snippets/erlang-mode/inc.lib [new file with mode: 0644]
packages/yasnippet/snippets/erlang-mode/loop [new file with mode: 0644]
packages/yasnippet/snippets/erlang-mode/mod [new file with mode: 0644]
packages/yasnippet/snippets/erlang-mode/rcv [new file with mode: 0644]
packages/yasnippet/snippets/erlang-mode/rcv.after [new file with mode: 0644]
packages/yasnippet/snippets/erlang-mode/rec [new file with mode: 0644]
packages/yasnippet/snippets/erlang-mode/try [new file with mode: 0644]
packages/yasnippet/snippets/erlang-mode/undef [new file with mode: 0644]
packages/yasnippet/snippets/f90-mode/.yas-parents [new file with mode: 0644]
packages/yasnippet/snippets/f90-mode/au [new file with mode: 0644]
packages/yasnippet/snippets/f90-mode/bd [new file with mode: 0644]
packages/yasnippet/snippets/f90-mode/c [new file with mode: 0644]
packages/yasnippet/snippets/f90-mode/ch [new file with mode: 0644]
packages/yasnippet/snippets/f90-mode/cx [new file with mode: 0644]
packages/yasnippet/snippets/f90-mode/dc [new file with mode: 0644]
packages/yasnippet/snippets/f90-mode/do [new file with mode: 0644]
packages/yasnippet/snippets/f90-mode/dp [new file with mode: 0644]
packages/yasnippet/snippets/f90-mode/eq [new file with mode: 0644]
packages/yasnippet/snippets/f90-mode/ib [new file with mode: 0644]
packages/yasnippet/snippets/f90-mode/ic [new file with mode: 0644]
packages/yasnippet/snippets/f90-mode/ich [new file with mode: 0644]
packages/yasnippet/snippets/f90-mode/if [new file with mode: 0644]
packages/yasnippet/snippets/f90-mode/ii [new file with mode: 0644]
packages/yasnippet/snippets/f90-mode/il [new file with mode: 0644]
packages/yasnippet/snippets/f90-mode/in [new file with mode: 0644]
packages/yasnippet/snippets/f90-mode/inc [new file with mode: 0644]
packages/yasnippet/snippets/f90-mode/intr [new file with mode: 0644]
packages/yasnippet/snippets/f90-mode/ir [new file with mode: 0644]
packages/yasnippet/snippets/f90-mode/l [new file with mode: 0644]
packages/yasnippet/snippets/f90-mode/pa [new file with mode: 0644]
packages/yasnippet/snippets/f90-mode/pr [new file with mode: 0644]
packages/yasnippet/snippets/f90-mode/re [new file with mode: 0644]
packages/yasnippet/snippets/f90-mode/st [new file with mode: 0644]
packages/yasnippet/snippets/f90-mode/su [new file with mode: 0644]
packages/yasnippet/snippets/f90-mode/wr [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/.yas-make-groups [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/.yas-parents [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/b.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/body [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/br [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/code [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/code.class [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/div [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/div.class [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/div.id [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/div.id-class [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/dov [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/form [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/head [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/header/h1 [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/header/h2 [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/header/h3 [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/header/h4 [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/header/h5 [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/header/h6 [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/hr [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/href [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/html [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/html.xmlns [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/i.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/img [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/input [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/link.stylesheet [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/link.stylesheet-ie [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/list/dd [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/list/dl [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/list/dl.id [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/list/dt [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/list/li [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/list/li.class [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/list/ol [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/list/ol.class [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/list/ol.id [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/list/ul [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/list/ul.class [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/list/ul.id [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/mailto [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/meta/doctype [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/meta/doctype.xhml1 [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/meta/doctype.xhtml1_1 [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/meta/doctype.xhtml1_strict [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/meta/doctype.xhtml1_transitional [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/meta/meta [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/meta/meta.http-equiv [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/p [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/pre [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/q.yasnippet [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/quote [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/script.javascript [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/script.javascript-src [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/span [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/span.class [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/span.id [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/style [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/table/table [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/table/td [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/table/th [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/table/tr [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/textarea [new file with mode: 0644]
packages/yasnippet/snippets/html-mode/title [new file with mode: 0644]
packages/yasnippet/snippets/latex-mode/.yas-parents [new file with mode: 0644]
packages/yasnippet/snippets/latex-mode/begin [new file with mode: 0644]
packages/yasnippet/snippets/markdown-mode/+ [new file with mode: 0644]
packages/yasnippet/snippets/markdown-mode/- [new file with mode: 0644]
packages/yasnippet/snippets/markdown-mode/.yas-parents [new file with mode: 0644]
packages/yasnippet/snippets/markdown-mode/_ [new file with mode: 0644]
packages/yasnippet/snippets/markdown-mode/__ [new file with mode: 0644]
packages/yasnippet/snippets/markdown-mode/` [new file with mode: 0644]
packages/yasnippet/snippets/markdown-mode/h1.1 [new file with mode: 0644]
packages/yasnippet/snippets/markdown-mode/h1.2 [new file with mode: 0644]
packages/yasnippet/snippets/markdown-mode/h2.1 [new file with mode: 0644]
packages/yasnippet/snippets/markdown-mode/h2.2 [new file with mode: 0644]
packages/yasnippet/snippets/markdown-mode/h3 [new file with mode: 0644]
packages/yasnippet/snippets/markdown-mode/h4 [new file with mode: 0644]
packages/yasnippet/snippets/markdown-mode/h5 [new file with mode: 0644]
packages/yasnippet/snippets/markdown-mode/h6 [new file with mode: 0644]
packages/yasnippet/snippets/markdown-mode/hr.1 [new file with mode: 0644]
packages/yasnippet/snippets/markdown-mode/hr.2 [new file with mode: 0644]
packages/yasnippet/snippets/markdown-mode/img [new file with mode: 0644]
packages/yasnippet/snippets/markdown-mode/link [new file with mode: 0644]
packages/yasnippet/snippets/markdown-mode/ol [new file with mode: 0644]
packages/yasnippet/snippets/markdown-mode/rimg [new file with mode: 0644]
packages/yasnippet/snippets/markdown-mode/rlb [new file with mode: 0644]
packages/yasnippet/snippets/markdown-mode/rlink [new file with mode: 0644]
packages/yasnippet/snippets/nxml-mode/.yas-make-groups [new file with mode: 0644]
packages/yasnippet/snippets/nxml-mode/.yas-parents [new file with mode: 0644]
packages/yasnippet/snippets/nxml-mode/body [new file with mode: 0644]
packages/yasnippet/snippets/nxml-mode/br [new file with mode: 0644]
packages/yasnippet/snippets/nxml-mode/code [new file with mode: 0644]
packages/yasnippet/snippets/nxml-mode/div [new file with mode: 0644]
packages/yasnippet/snippets/nxml-mode/form [new file with mode: 0644]
packages/yasnippet/snippets/nxml-mode/head [new file with mode: 0644]
packages/yasnippet/snippets/nxml-mode/header/h1 [new file with mode: 0644]
packages/yasnippet/snippets/nxml-mode/header/h2 [new file with mode: 0644]
packages/yasnippet/snippets/nxml-mode/header/h3 [new file with mode: 0644]
packages/yasnippet/snippets/nxml-mode/header/h4 [new file with mode: 0644]
packages/yasnippet/snippets/nxml-mode/header/h5 [new file with mode: 0644]
packages/yasnippet/snippets/nxml-mode/header/h6 [new file with mode: 0644]
packages/yasnippet/snippets/nxml-mode/hr [new file with mode: 0644]
packages/yasnippet/snippets/nxml-mode/href [new file with mode: 0644]
packages/yasnippet/snippets/nxml-mode/html [new file with mode: 0644]
packages/yasnippet/snippets/nxml-mode/img [new file with mode: 0644]
packages/yasnippet/snippets/nxml-mode/input [new file with mode: 0644]
packages/yasnippet/snippets/nxml-mode/li [new file with mode: 0644]
packages/yasnippet/snippets/nxml-mode/link [new file with mode: 0644]
packages/yasnippet/snippets/nxml-mode/meta/doctype [new file with mode: 0644]
packages/yasnippet/snippets/nxml-mode/meta/doctype.xhtml1_strict [new file with mode: 0644]
packages/yasnippet/snippets/nxml-mode/meta/doctype.xhtml1_transitional [new file with mode: 0644]
packages/yasnippet/snippets/nxml-mode/meta/meta [new file with mode: 0644]
packages/yasnippet/snippets/nxml-mode/name [new file with mode: 0644]
packages/yasnippet/snippets/nxml-mode/ol [new file with mode: 0644]
packages/yasnippet/snippets/nxml-mode/p [new file with mode: 0644]
packages/yasnippet/snippets/nxml-mode/pre [new file with mode: 0644]
packages/yasnippet/snippets/nxml-mode/quote [new file with mode: 0644]
packages/yasnippet/snippets/nxml-mode/span [new file with mode: 0644]
packages/yasnippet/snippets/nxml-mode/style [new file with mode: 0644]
packages/yasnippet/snippets/nxml-mode/table [new file with mode: 0644]
packages/yasnippet/snippets/nxml-mode/tag.1l [new file with mode: 0644]
packages/yasnippet/snippets/nxml-mode/tag.2l [new file with mode: 0644]
packages/yasnippet/snippets/nxml-mode/td [new file with mode: 0644]
packages/yasnippet/snippets/nxml-mode/th [new file with mode: 0644]
packages/yasnippet/snippets/nxml-mode/title [new file with mode: 0644]
packages/yasnippet/snippets/nxml-mode/tr [new file with mode: 0644]
packages/yasnippet/snippets/nxml-mode/ul [new file with mode: 0644]
packages/yasnippet/snippets/objc-mode/.yas-parents [new file with mode: 0644]
packages/yasnippet/snippets/objc-mode/prop [new file with mode: 0644]
packages/yasnippet/snippets/perl-mode/.yas-parents [new file with mode: 0644]
packages/yasnippet/snippets/perl-mode/eval [new file with mode: 0644]
packages/yasnippet/snippets/perl-mode/for [new file with mode: 0644]
packages/yasnippet/snippets/perl-mode/fore [new file with mode: 0644]
packages/yasnippet/snippets/perl-mode/if [new file with mode: 0644]
packages/yasnippet/snippets/perl-mode/ife [new file with mode: 0644]
packages/yasnippet/snippets/perl-mode/ifee [new file with mode: 0644]
packages/yasnippet/snippets/perl-mode/sub [new file with mode: 0644]
packages/yasnippet/snippets/perl-mode/unless [new file with mode: 0644]
packages/yasnippet/snippets/perl-mode/while [new file with mode: 0644]
packages/yasnippet/snippets/perl-mode/xfore [new file with mode: 0644]
packages/yasnippet/snippets/perl-mode/xif [new file with mode: 0644]
packages/yasnippet/snippets/perl-mode/xunless [new file with mode: 0644]
packages/yasnippet/snippets/perl-mode/xwhile [new file with mode: 0644]
packages/yasnippet/snippets/python-mode/.yas-parents [new file with mode: 0644]
packages/yasnippet/snippets/python-mode/__ [new file with mode: 0644]
packages/yasnippet/snippets/python-mode/class [new file with mode: 0644]
packages/yasnippet/snippets/python-mode/def [new file with mode: 0644]
packages/yasnippet/snippets/python-mode/defm [new file with mode: 0644]
packages/yasnippet/snippets/python-mode/for [new file with mode: 0644]
packages/yasnippet/snippets/python-mode/ifmain [new file with mode: 0644]
packages/yasnippet/snippets/python-mode/prop [new file with mode: 0644]
packages/yasnippet/snippets/python-mode/propg [new file with mode: 0644]
packages/yasnippet/snippets/python-mode/propsg [new file with mode: 0644]
packages/yasnippet/snippets/python-mode/while [new file with mode: 0644]
packages/yasnippet/snippets/rst-mode/.yas-parents [new file with mode: 0644]
packages/yasnippet/snippets/rst-mode/chap [new file with mode: 0644]
packages/yasnippet/snippets/rst-mode/sec [new file with mode: 0644]
packages/yasnippet/snippets/rst-mode/tit [new file with mode: 0644]
packages/yasnippet/snippets/ruby-mode/.yas-make-groups [new file with mode: 0644]
packages/yasnippet/snippets/ruby-mode/.yas-parents [new file with mode: 0644]
packages/yasnippet/snippets/ruby-mode/collections/all [new file with mode: 0644]
packages/yasnippet/snippets/ruby-mode/collections/any [new file with mode: 0644]
packages/yasnippet/snippets/ruby-mode/collections/classify [new file with mode: 0644]
packages/yasnippet/snippets/ruby-mode/collections/collect [new file with mode: 0644]
packages/yasnippet/snippets/ruby-mode/collections/deli [new file with mode: 0644]
packages/yasnippet/snippets/ruby-mode/collections/det [new file with mode: 0644]
packages/yasnippet/snippets/ruby-mode/collections/ea [new file with mode: 0644]
packages/yasnippet/snippets/ruby-mode/collections/eac [new file with mode: 0644]
packages/yasnippet/snippets/ruby-mode/collections/eai [new file with mode: 0644]
packages/yasnippet/snippets/ruby-mode/collections/eav [new file with mode: 0644]
packages/yasnippet/snippets/ruby-mode/collections/eawi [new file with mode: 0644]
packages/yasnippet/snippets/ruby-mode/collections/inject [new file with mode: 0644]
packages/yasnippet/snippets/ruby-mode/collections/reject [new file with mode: 0644]
packages/yasnippet/snippets/ruby-mode/collections/select [new file with mode: 0644]
packages/yasnippet/snippets/ruby-mode/collections/zip [new file with mode: 0644]
packages/yasnippet/snippets/ruby-mode/control structure/forin [new file with mode: 0644]
packages/yasnippet/snippets/ruby-mode/control structure/if [new file with mode: 0644]
packages/yasnippet/snippets/ruby-mode/control structure/ife [new file with mode: 0644]
packages/yasnippet/snippets/ruby-mode/control structure/tim [new file with mode: 0644]
packages/yasnippet/snippets/ruby-mode/control structure/until [new file with mode: 0644]
packages/yasnippet/snippets/ruby-mode/control structure/upt [new file with mode: 0644]
packages/yasnippet/snippets/ruby-mode/control structure/when [new file with mode: 0644]
packages/yasnippet/snippets/ruby-mode/control structure/while [new file with mode: 0644]
packages/yasnippet/snippets/ruby-mode/definitions/Comp [new file with mode: 0644]
packages/yasnippet/snippets/ruby-mode/definitions/am [new file with mode: 0644]
packages/yasnippet/snippets/ruby-mode/definitions/cla [new file with mode: 0644]
packages/yasnippet/snippets/ruby-mode/definitions/cls [new file with mode: 0644]
packages/yasnippet/snippets/ruby-mode/definitions/mm [new file with mode: 0644]
packages/yasnippet/snippets/ruby-mode/definitions/r [new file with mode: 0644]
packages/yasnippet/snippets/ruby-mode/definitions/rw [new file with mode: 0644]
packages/yasnippet/snippets/ruby-mode/definitions/w [new file with mode: 0644]
packages/yasnippet/snippets/ruby-mode/general/# [new file with mode: 0644]
packages/yasnippet/snippets/ruby-mode/general/=b [new file with mode: 0644]
packages/yasnippet/snippets/ruby-mode/general/app [new file with mode: 0644]
packages/yasnippet/snippets/ruby-mode/general/bm [new file with mode: 0644]
packages/yasnippet/snippets/ruby-mode/general/case [new file with mode: 0644]
packages/yasnippet/snippets/ruby-mode/general/dee [new file with mode: 0644]
packages/yasnippet/snippets/ruby-mode/general/rb [new file with mode: 0644]
packages/yasnippet/snippets/ruby-mode/general/req [new file with mode: 0644]
packages/yasnippet/snippets/ruby-mode/general/rreq [new file with mode: 0644]
packages/yasnippet/snippets/ruby-mode/general/y [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/.yas-parents [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/act [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/act.arg [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/actor [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/ano [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/app [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/arr.new [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/arr.val-new [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/asof [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/ass [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/ass.true [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/at.author [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/at.param [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/at.return [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/at.version [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/bang [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/case [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/case.match-all [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/cast [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/cc [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/cl [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/cl.abs [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/cl.abs-arg [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/cl.arg [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/clof [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/co [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/cons [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/cons.nil [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/def.arg [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/def.arg-body [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/def.arg-ret [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/def.arg-ret-body [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/def.body [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/def.ret [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/def.ret-body [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/def.simple [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/doc.class [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/doc.def [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/doc.file [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/doc.file-scala [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/doc.file-scala-api [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/doc.scaladoc [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/expect [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/ext [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/for.extract [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/for.if [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/for.loop [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/for.multi [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/foreach [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/hmap.new [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/hmap.val-new [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/hset.new [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/hset.val-new [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/if [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/if.else [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/imp [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/intercept [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/isof [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/ls.new [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/ls.val-new [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/main [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/map [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/map.new [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/match [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/match.can [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/match.option [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/mix [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/ob [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/pac [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/pr.newline [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/pr.simple [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/pr.string [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/pr.trace [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/pri [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/pri.param [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/pro [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/pro.param [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/suite [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/test [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/throw [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/tr [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/tr.ext [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/tr.ext-with [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/tr.with [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/try [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/try.catch-finally [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/try.finally [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/tup.arrow [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/tup.paren [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/val [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/val.new [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/val.ret [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/var [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/var.new [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/var.ret [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/whi [new file with mode: 0644]
packages/yasnippet/snippets/scala-mode/with [new file with mode: 0644]
packages/yasnippet/snippets/snippet-mode/.yas-parents [new file with mode: 0644]
packages/yasnippet/snippets/snippet-mode/field [new file with mode: 0644]
packages/yasnippet/snippets/snippet-mode/mirror [new file with mode: 0644]
packages/yasnippet/snippets/snippet-mode/vars [new file with mode: 0644]
packages/yasnippet/snippets/sql-mode/.yas-parents [new file with mode: 0644]
packages/yasnippet/snippets/sql-mode/column [new file with mode: 0644]
packages/yasnippet/snippets/sql-mode/constraint [new file with mode: 0644]
packages/yasnippet/snippets/sql-mode/constraint.1 [new file with mode: 0644]
packages/yasnippet/snippets/sql-mode/create [new file with mode: 0644]
packages/yasnippet/snippets/sql-mode/create.1 [new file with mode: 0644]
packages/yasnippet/snippets/sql-mode/references [new file with mode: 0644]
packages/yasnippet/snippets/text-mode/email [new file with mode: 0644]
packages/yasnippet/snippets/text-mode/time [new file with mode: 0644]
packages/yasnippet/yasnippet-pkg.el [new file with mode: 0644]
packages/yasnippet/yasnippet.el [new file with mode: 0644]

diff --git a/.bzrignore b/.bzrignore
new file mode 120000 (symlink)
index 0000000..3e4e48b
--- /dev/null
@@ -0,0 +1 @@
+.gitignore
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..548f54c
--- /dev/null
@@ -0,0 +1,7 @@
+*.elc
+*~
+ChangeLog
+core
+packages/*/*-autoloads.el
+packages/*/*-pkg.el
+packages/dismal
diff --git a/COPYING b/COPYING
new file mode 100644 (file)
index 0000000..94a9ed0
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    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 <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/GNUmakefile b/GNUmakefile
new file mode 100644 (file)
index 0000000..1067e4c
--- /dev/null
@@ -0,0 +1,166 @@
+# Makefile for GNU Emacs Lisp Package Archive.
+
+EMACS=emacs --batch
+
+ARCHIVE_TMP=archive-tmp
+SITE_DIR=site
+
+.PHONY: archive-tmp changelogs process-archive archive-full org-fetch clean all do-it
+
+all: all-in-place
+
+CR_EXCEPTIONS=copyright_exceptions
+.PHONY: check_copyrights
+check_copyrights:
+       @echo "Compute exceptions >$(CR_EXCEPTIONS)~"
+       @(cd packages;                                                  \
+       export LANG=C;                                                  \
+       find . -name '*.el' -print0 |                                   \
+           xargs -0 grep -L 'Free Software Foundation, Inc' |          \
+           grep -v '\(\.dir-locals\|.-\(pkg\|autoloads\)\)\.el$$';     \
+       find . -name '*.el' -print |                                    \
+           while read f; do                                            \
+               fquoted="$$(echo $$f|tr '|' '_')";                      \
+               sed -n -e '/[Cc]opyright.*, *[1-9][-0-9]*,\?$$/N'       \
+                   -e '/Free Software Foundation/d'                    \
+                   -e "s|^\\(.*[Cc]opyright\\)|$$fquoted:\\1|p"        \
+                  "$$f";                                               \
+           done) | sort >$(CR_EXCEPTIONS)~
+       diff -u "$(CR_EXCEPTIONS)" "$(CR_EXCEPTIONS)~"
+
+## Deploy the package archive to archive/, with packages in
+## archive/packages/:
+archive: archive-tmp
+       $(MAKE) $(MFLAGS) process-archive
+
+archive-tmp: packages
+       -rm -r $(ARCHIVE_TMP)
+       mkdir -p $(ARCHIVE_TMP)
+       cp -a packages/. $(ARCHIVE_TMP)/packages
+
+process-archive:
+       # FIXME, we could probably speed this up significantly with
+       # rules like "%.tar: ../%/ChangeLog" so we only rebuild the packages
+       # that have indeed changed.
+       cd $(ARCHIVE_TMP)/packages; \
+         $(EMACS) -l $(CURDIR)/admin/archive-contents.el \
+           -f batch-make-archive
+       @cd $(ARCHIVE_TMP)/packages; \
+         for pt in *; do \
+             if [ -d $$pt ]; then \
+                 echo "Creating tarball $${pt}.tar" && \
+                 tar -cf $${pt}.tar $$pt --remove-files; \
+             fi; \
+         done
+       mkdir -p archive/packages
+       mv archive/packages archive/packages-old
+       mv $(ARCHIVE_TMP)/packages archive/packages
+       chmod -R a+rX archive/packages
+       rm -rf archive/packages-old
+       rm -rf $(ARCHIVE_TMP)
+
+## Deploy the package archive to archive/ including the Org daily:
+archive-full: archive-tmp org-fetch
+       $(MAKE) $(MFLAGS) process-archive
+       #mkdir -p archive/admin
+       #cp admin/* archive/admin/
+
+# FIXME: Turn it into an `external', which will require adding the notion of
+# "snapshot" packages.
+org-fetch: archive-tmp
+       cd $(ARCHIVE_TMP)/packages; \
+       pkgname=`curl -s http://orgmode.org/elpa/|perl -ne 'push @f, $$1 if m/(org-\d{8})\.tar/; END { @f = sort @f; print "$$f[-1]\n"}'`; \
+       wget -q http://orgmode.org/elpa/$${pkgname}.tar -O $${pkgname}.tar; \
+       if [ -f $${pkgname}.tar ]; then \
+               tar xf $${pkgname}.tar; \
+               rm -f $${pkgname}.tar; \
+               mv $${pkgname} org; \
+       fi
+
+clean:
+       rm -rf archive $(ARCHIVE_TMP) $(SITE_DIR)
+
+########## Rules for in-place installation ####################################
+pkgs := $(foreach pkg, $(wildcard packages/*), \
+          $(if $(shell [ -d "$(pkg)" ] && echo true), $(pkg)))
+
+define SET-diff
+$(shell echo "$(1)" "$(2)" "$(2)" | tr ' ' '\n' | sort | uniq -u)
+endef
+
+define FILTER-nonsrc
+$(filter-out %-autoloads.el %-pkg.el, $(1))
+endef
+
+define RULE-srcdeps
+$(1): $$(call FILTER-nonsrc, $$(wildcard $$(dir $(1))/*.el))
+endef
+
+# Compute the set of autolods files and their dependencies.
+autoloads := $(foreach pkg, $(pkgs), $(pkg)/$(notdir $(pkg))-autoloads.el)
+
+$(foreach al, $(autoloads), $(eval $(call RULE-srcdeps, $(al))))
+%-autoloads.el:
+       @echo 'EMACS -f package-generate-autoloads $@'
+       @cd $(dir $@); \
+         $(EMACS) -l $(CURDIR)/admin/archive-contents.el \
+             --eval "(archive--refresh-pkg-file)" \
+             --eval "(require 'package)" \
+             --eval "(package-generate-autoloads '$$(basename $$(pwd)) \
+                                                 \"$$(pwd)\")"
+
+# Put into elcs the set of elc files we need to keep up-to-date.
+# I.e. one for each .el file except for the -pkg.el, the -autoloads.el, and
+# the .el files that are marked "no-byte-compile".
+els := $(call FILTER-nonsrc, $(wildcard packages/*/*.el))
+naive_elcs := $(patsubst %.el, %.elc, $(els))
+current_elcs := $(wildcard packages/*/*.elc)
+
+extra_els := $(call SET-diff, $(els), $(patsubst %.elc, %.el, $(current_elcs)))
+nbc_els := $(foreach el, $(extra_els), \
+             $(if $(shell grep '^;.*no-byte-compile: t' "$(el)"), $(el)))
+elcs := $(call SET-diff, $(naive_elcs), $(patsubst %.el, %.elc, $(nbc_els)))
+
+# '(dolist (al (quote ($(patsubst %, "%", $(autoloads))))) (load (expand-file-name al) nil t))'
+%.elc: %.el
+       @echo 'EMACS -f batch-byte-compile $<'
+       @$(EMACS) \
+           --eval "(setq package-directory-list '(\"$(abspath packages)\"))" \
+           --eval '(package-initialize)' \
+           -L $(dir $@) -f batch-byte-compile $<
+
+.PHONY: elcs
+elcs: $(elcs)
+
+# Remove .elc files that don't have a corresponding .el file any more.
+extra_elcs := $(call SET-diff, $(current_elcs), $(naive_elcs))
+.PHONY: $(extra_elcs)
+$(extra_elcs):; rm $@
+
+# # Put into single_pkgs the set of -pkg.el files we need to keep up-to-date.
+# # I.e. all the -pkg.el files for the single-file packages.
+# single_pkgs:=$(foreach pkg, $(pkgs), \
+#                $(word $(words $(call FILTER-nonsrc, \
+#                                      $(wildcard $(pkg)/*.el))), \
+#                   $(pkg)/$(notdir $(pkg))-pkg.el))
+# #$(foreach al, $(single_pkgs), $(eval $(call RULE-srcdeps, $(al))))
+# %-pkg.el: %.el
+#      @echo 'EMACS -f package-generate-description-file $@'
+#      @$(EMACS) \
+#          --eval '(require (quote package))' \
+#          --eval '(setq b (find-file-noselect "$<"))' \
+#          --eval '(setq d (with-current-buffer b (package-buffer-info)))' \
+#          --eval '(package-generate-description-file d "$(dir $@)")'
+
+.PHONY: all-in-place
+all-in-place: $(extra_elcs) $(autoloads) # $(single_pkgs)
+       # Do them in a sub-make, so that autoloads are done first.
+       $(MAKE) elcs
+
+
+############### Rules to prepare the externals ################################
+
+.PHONY:
+externals:
+       $(EMACS) -l admin/archive-contents.el \
+           -f archive-add/remove/update-externals
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..097e430
--- /dev/null
+++ b/README
@@ -0,0 +1,116 @@
+Copyright (C) 2010-2011 Free Software Foundation, Inc.
+See the end of the file for license conditions.
+
+
+This branch contains the sources, deployment scripts, and auxilliary
+files for the Emacs Lisp package archive (elpa.gnu.org).
+
+This file explains the branch layout, how to add and edit packages,
+and how to deploy the archive (either on elpa.gnu.org, or a local copy
+for testing purposes).
+
+
+* DIRECTORY LAYOUT
+
+** admin/    -- scripts for administering the package archive.
+** html/     -- HTML for the elpa.gnu.org website.
+** packages/ -- source code for the packages.
+
+
+* PACKAGES
+
+** Contents of the packages/ directory:
+This directory holds the package sources, with one subdirectory for
+each package.
+
+** To add a package:
+
+*** Add a simple (1-file) package as packages/NAME/NAME.el.
+
+*** Add a multi-file package as a directory, packages/NAME.
+
+*** Commit your changes the usual way ("bzr add", "bzr commit", etc).
+
+Changes in the Bzr repository do not immediately propagate to the
+user-facing archive (what users see when they do `M-x list-packages').
+That is done by deploying the archive.
+
+
+* DEPLOYMENT
+
+** To use the package repository as a "site installation" of packages:
+
+  make site
+
+This compiles and generates autoloads for all the packages in the
+packages/ directory, and creates a site/ directory containing symlinks
+to the package directories.
+
+Now you have to add this site/ directory to `package-directory-list',
+and all the packages will be available.
+
+** To deploy the package repository as a remotely-accessible archive:
+
+  make archive
+
+or
+
+  make archive-full
+
+This deploys the packages to the archive/ directory.  Unlike "make
+site", this makes a full copy of the packages, and tars up multi-file
+packages.
+
+A full deployment also copies the admin scripts to archive/admin, and
+fetches externally hosted packages (currently, the Org daily builds)
+and adds them to the archive.
+
+** To access a deployed archive
+
+To access the archive via HTPP, have a symlink (say) /var/www/packages
+pointing to DEST/packages, and set up Emacs with
+
+  (setq package-archives '(("new-elpa" . "http://foo.com/packages")))
+
+You can also access the archive via normal file access.  Such "local
+archives" are useful for debugging:
+
+  (setq package-archives '(("local-elpa" . "DEST/packages")))
+
+** Notes specific to elpa.gnu.org
+
+The way things are set up on this machine, we refresh the archive by
+logging in (login access set up by FSF admins), and
+
+su elpa
+cd ~elpa/elpa
+bzr up
+
+Then make a full archive deployment, as discussed above.  The symlink
+/var/www/packages points to the staging package directory under
+/home/elpa/.
+
+The Org mode dailies are also fetched and added by the script
+admin/org-synch.sh, run as a cron job.
+
+\f
+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 <http://www.gnu.org/licenses/>.
+
+\f
+Local variables:
+mode: outline
+paragraph-separate: "[         \f]*$"
+end:
diff --git a/admin/archive-contents.el b/admin/archive-contents.el
new file mode 100644 (file)
index 0000000..e2154df
--- /dev/null
@@ -0,0 +1,532 @@
+;;; archive-contents.el --- Auto-generate an Emacs Lisp package archive.  -*- lexical-binding:t -*-
+
+;; Copyright (C) 2011, 2012, 2013  Free Software Foundation, Inc
+
+;; Author: Stefan Monnier <monnier@iro.umontreal.ca>
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;; Code:
+
+(eval-when-compile (require 'cl))
+(require 'lisp-mnt)
+(require 'package)
+(require 'pcase)
+
+(defconst archive-contents-subdirectory-regexp
+  "\\([^.].*?\\)-\\([0-9]+\\(?:[.][0-9]+\\|\\(?:pre\\|beta\\|alpha\\)[0-9]+\\)*\\)")
+
+(defconst archive-re-no-dot "\\`\\([^.]\\|\\.\\([^.]\\|\\..\\)\\).*"
+  "Regular expression matching all files except \".\" and \"..\".")
+
+(defun archive--convert-require (elt)
+  (list (car elt)
+       (version-to-list (car (cdr elt)))))
+
+(defun archive--strip-rcs-id (str)
+  "Strip RCS version ID from the version string STR.
+If the result looks like a dotted numeric version, return it.
+Otherwise return nil."
+  (when str
+    (when (string-match "\\`[ \t]*[$]Revision:[ \t]+" str)
+      (setq str (substring str (match-end 0))))
+    (condition-case nil
+       (if (version-to-list str)
+           str)
+      (error nil))))
+
+(defun archive--delete-elc-files (dir &optional only-orphans)
+  "Recursively delete all .elc files in DIR.
+Delete backup files also."
+  (dolist (f (directory-files dir t archive-re-no-dot))
+    (cond ((file-directory-p f)
+          (archive--delete-elc-files f))
+         ((or (and (string-match "\\.elc\\'" f)
+                    (not (and only-orphans
+                              (file-readable-p (replace-match ".el" t t f)))))
+              (backup-file-name-p f))
+          (delete-file f)))))
+
+(defun batch-make-archive ()
+  "Process package content directories and generate the archive-contents file."
+  (let ((packages '(1))) ; format-version.
+    (dolist (dir (directory-files default-directory nil archive-re-no-dot))
+      (condition-case v
+         (if (not (file-directory-p dir))
+             (message "Skipping non-package file %s" dir)
+           (let* ((pkg (file-name-nondirectory dir))
+                  (autoloads-file (expand-file-name (concat pkg "-autoloads.el") dir))
+                  simple-p)
+             ;; Omit autoloads and .elc files from the package.
+             (if (file-exists-p autoloads-file)
+                 (delete-file autoloads-file))
+             (archive--delete-elc-files dir)
+             ;; Test whether this is a simple or multi-file package.
+             (setq simple-p (archive--simple-package-p dir pkg))
+             (push (if (car simple-p)
+                       (apply #'archive--process-simple-package
+                              dir pkg (cdr simple-p))
+                      (apply 'archive--write-pkg-file dir pkg (cdr simple-p))
+                     (archive--process-multi-file-package dir pkg))
+                   packages)))
+       (error (error "Error in %s: %S" dir v))))
+    (with-temp-buffer
+      (pp (nreverse packages) (current-buffer))
+      (write-region nil nil "archive-contents"))))
+
+(defconst archive--revno-re "[0-9a-f]+")
+
+(defun archive-prepare-packages (srcdir)
+  "Prepare the `packages' directory inside the Git checkout.
+Expects to be called from within the `packages' directory.
+\"Prepare\" here is for subsequent construction of the packages and archive,
+so it is meant to refresh any generated files we may need.
+Currently only refreshes the ChangeLog files."
+  (setq srcdir (file-name-as-directory (expand-file-name srcdir)))
+  (let* ((wit ".changelog-witness")
+         (prevno (with-temp-buffer
+                   (ignore-errors (insert-file-contents wit))
+                   (if (looking-at (concat archive--revno-re "$"))
+                       (match-string 0)
+                     (error "Can't find previous revision name"))))
+         (new-revno
+          (or (with-temp-buffer
+                (let ((default-directory srcdir))
+                  (call-process "git" nil '(t) nil "rev-parse" "HEAD")
+                  (goto-char (point-min))
+                  (when (looking-at (concat archive--revno-re "$"))
+                    (match-string 0))))
+              (error "Couldn't find the current revision's name")))
+         (pkgs '()))
+    (unless (equal prevno new-revno)
+      (with-temp-buffer
+        (let ((default-directory srcdir))
+          (unless (zerop (call-process "git" nil '(t) nil "diff"
+                                       "--dirstat=cumulative,0"
+                                       prevno))
+            (error "Error signaled by git diff --dirstat %d" prevno)))
+        (goto-char (point-min))
+        (while (re-search-forward "^[ \t.0-9%]* packages/\\([-[:alnum:]]+\\)/$"
+                                  nil t)
+          (push (match-string 1) pkgs))))
+    (let ((default-directory (expand-file-name "packages/")))
+      (dolist (pkg pkgs)
+        (condition-case v
+            (if (file-directory-p pkg)
+                (archive--make-changelog pkg (expand-file-name "packages/"
+                                                               srcdir)))
+          (error (message "Error: %S" v)))))
+    (write-region new-revno nil wit nil 'quiet)
+    ;; Also update the ChangeLog of external packages.
+    (let ((default-directory (expand-file-name "packages/")))
+      (dolist (dir (directory-files "."))
+        (and (not (member dir '("." "..")))
+             (file-directory-p dir)
+             (let ((index (expand-file-name
+                           (concat "packages/" dir "/.git/index")
+                           srcdir))
+                   (cl (expand-file-name "ChangeLog" dir)))
+               (and (file-exists-p index)
+                    (or (not (file-exists-p cl))
+                        (file-newer-than-file-p index cl))))
+             (archive--make-changelog
+              dir (expand-file-name "packages/" srcdir)))))
+    ))
+
+(defun archive--simple-package-p (dir pkg)
+  "Test whether DIR contains a simple package named PKG.
+Return a list (SIMPLE VERSION DESCRIPTION REQ), where
+SIMPLE is non-nil if the package is indeed simple;
+VERSION is the version string of the simple package;
+DESCRIPTION is the brief description of the package;
+REQ is a list of requirements.
+Otherwise, return nil."
+  (let* ((pkg-file (expand-file-name (concat pkg "-pkg.el") dir))
+        (mainfile (expand-file-name (concat pkg ".el") dir))
+         (files (directory-files dir nil "\\.el\\'"))
+        version description req)
+    (setq files (delete (concat pkg "-pkg.el") files))
+    (setq files (delete (concat pkg "-autoloads.el") files))
+    (cond
+     ((and (not (file-exists-p pkg-file))
+           (file-exists-p mainfile))
+      (with-temp-buffer
+       (insert-file-contents mainfile)
+       (goto-char (point-min))
+       (if (not (looking-at ";;;.*---[ \t]*\\(.*?\\)[ \t]*\\(-\\*-.*-\\*-[ \t]*\\)?$"))
+            (error "Can't parse first line of %s" mainfile)
+          (setq description (match-string 1))
+          (setq version
+                (or (archive--strip-rcs-id (lm-header "package-version"))
+                    (archive--strip-rcs-id (lm-header "version"))
+                    (error "Missing `version' header")))
+          ;; Grab the other fields, which are not mandatory.
+          (let ((requires-str (lm-header "package-requires")))
+            (if requires-str
+                (setq req (mapcar 'archive--convert-require
+                                  (car (read-from-string requires-str))))))
+          (list (= (length files) 1) version description req))))
+     ((not (file-exists-p pkg-file))
+      (error "Can find single file nor package desc file in %s" dir)))))
+
+(defun archive--process-simple-package (dir pkg vers desc req)
+  "Deploy the contents of DIR into the archive as a simple package.
+Rename DIR/PKG.el to PKG-VERS.el, delete DIR, and return the descriptor."
+  ;; Write DIR/foo.el to foo-VERS.el and delete DIR
+  (rename-file (expand-file-name (concat pkg ".el") dir)
+              (concat pkg "-" vers ".el"))
+  ;; Add the content of the ChangeLog.
+  (let ((cl (expand-file-name "ChangeLog" dir)))
+    (with-current-buffer (find-file-noselect (concat pkg "-" vers ".el"))
+      (goto-char (point-max))
+      (re-search-backward "^;;;.*ends here")
+      (re-search-backward "^(provide")
+      (skip-chars-backward " \t\n")
+      (insert "\n\n;;;; ChangeLog:\n\n")
+      (let* ((start (point))
+             (end (copy-marker start t)))
+        (insert-file-contents cl)
+        (goto-char end)
+        (unless (bolp) (insert "\n"))
+        (while (progn (forward-line -1) (>= (point) start))
+          (insert ";; ")))
+      (set (make-local-variable 'backup-inhibited) t)
+      (basic-save-buffer)               ;Less chatty than save-buffer.
+      (kill-buffer)))
+  (delete-directory dir t)
+  (cons (intern pkg) (vector (version-to-list vers) req desc 'single)))
+
+(defun archive--make-changelog (dir srcdir)
+  "Export Git log info of DIR into a ChangeLog file."
+  (message "Refreshing ChangeLog in %S" dir)
+  (let ((default-directory (file-name-as-directory (expand-file-name dir))))
+    (with-temp-buffer
+      (set-buffer-multibyte nil)
+      (let ((coding-system-for-read 'binary)
+            (coding-system-for-write 'binary))
+        (if (file-readable-p "ChangeLog") (insert-file-contents "ChangeLog"))
+        (let ((old-md5 (md5 (current-buffer))))
+          (erase-buffer)
+          (let ((default-directory
+                  (file-name-as-directory (expand-file-name dir srcdir))))
+            (call-process "git" nil (current-buffer) nil
+                          "log" "--date=short"
+                          "--format=%cd  %aN  <%ae>%n%n%w(80,8,8)%B%n"
+                          "."))
+          (tabify (point-min) (point-max))
+          (goto-char (point-min))
+          (while (re-search-forward "\n\n\n+" nil t)
+            (replace-match "\n\n"))
+          (if (equal old-md5 (md5 (current-buffer)))
+              (message "ChangeLog's md5 unchanged for %S" dir)
+            (write-region (point-min) (point-max) "ChangeLog" nil 'quiet)))))))
+
+(defun archive--process-multi-file-package (dir pkg)
+  "Deploy the contents of DIR into the archive as a multi-file package.
+Rename DIR/ to PKG-VERS/, and return the descriptor."
+  (let* ((exp (archive--multi-file-package-def dir pkg))
+        (vers (nth 2 exp))
+        (req (mapcar 'archive--convert-require (nth 4 exp))))
+    (unless (equal (nth 1 exp) pkg)
+      (error (format "Package name %s doesn't match file name %s"
+                    (nth 1 exp) pkg)))
+    (rename-file dir (concat pkg "-" vers))
+    (cons (intern pkg) (vector (version-to-list vers) req (nth 3 exp) 'tar))))
+
+(defun archive--multi-file-package-def (dir pkg)
+  "Return the `define-package' form in the file DIR/PKG-pkg.el."
+  (let ((pkg-file (expand-file-name (concat pkg "-pkg.el") dir)))
+    (with-temp-buffer
+      (unless (file-exists-p pkg-file)
+       (error "File not found: %s" pkg-file))
+      (insert-file-contents pkg-file)
+      (goto-char (point-min))
+      (read (current-buffer)))))
+
+(defun archive--refresh-pkg-file ()
+  (let* ((dir (directory-file-name default-directory))
+         (pkg (file-name-nondirectory dir))
+         (simple-p (archive--simple-package-p dir pkg)))
+    (if simple-p
+        (progn
+          ;; (message "Refreshing pkg description of %s" pkg)
+          (apply 'archive--write-pkg-file dir pkg (cdr simple-p)))
+      ;; (message "Not refreshing pkg description of %s" pkg)
+      )))
+
+(defun archive--write-pkg-file (pkg-dir name version desc requires &rest ignored)
+  (let ((pkg-file (expand-file-name (concat name "-pkg.el") pkg-dir))
+       (print-level nil)
+        (print-quoted t)
+       (print-length nil))
+    (write-region
+     (concat (format ";; Generated package description from %s.el\n"
+                    name)
+            (prin1-to-string
+             (list 'define-package
+                   name
+                   version
+                   desc
+                   (list 'quote
+                         ;; Turn version lists into string form.
+                         (mapcar
+                          (lambda (elt)
+                            (list (car elt)
+                                  (package-version-join (cadr elt))))
+                          requires))))
+            "\n")
+     nil
+     pkg-file)))
+
+;;; Make the HTML pages for online browsing.
+
+(defun archive--html-header (title)
+  (format "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">
+<html>
+<head>
+  <title>%s</title>
+  <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">
+</head>
+<body>
+<h1 align=\"center\">%s</h1>\n"
+          title title))
+
+(defun archive--html-bytes-format (bytes) ;Aka memory-usage-format.
+  (setq bytes (/ bytes 1024.0))
+  (let ((units '(;; "B"
+                 "kB" "MB" "GB" "TB")))
+    (while (>= bytes 1024)
+      (setq bytes (/ bytes 1024.0))
+      (setq units (cdr units)))
+    (cond
+     ;; ((integerp bytes) (format "%4d%s" bytes (car units)))
+     ((>= bytes 100) (format "%4.0f%s" bytes (car units)))
+     ((>= bytes 10) (format "%4.1f%s" bytes (car units)))
+     (t (format "%4.2f%s" bytes (car units))))))
+
+(defun archive--get-prop (prop name srcdir mainsrcfile)
+  (let ((kprop (intern (format ":%s" (downcase prop)))))
+    (or
+     (let ((pkgdescfile (expand-file-name (format "%s-pkg.el" name)
+                                          srcdir)))
+       (when (file-readable-p pkgdescfile)
+         (with-temp-buffer
+           (insert-file-contents pkgdescfile)
+           (let ((desc (read (current-buffer))))
+             (plist-get (cdr desc) kprop)))))
+     (when (file-readable-p mainsrcfile)
+       (with-temp-buffer
+         (insert-file-contents mainsrcfile)
+         (lm-header prop))))))
+
+(defun archive--get-section (hsection fsection srcdir mainsrcfile)
+  (when (consp fsection)
+    (while (cdr-safe fsection)
+      (setq fsection
+            (if (file-readable-p (expand-file-name (car fsection) srcdir))
+                (car fsection)
+              (cdr fsection))))
+    (when (consp fsection) (setq fsection (car fsection))))
+  (cond
+   ((file-readable-p (expand-file-name fsection srcdir))
+    (with-temp-buffer
+      (insert-file-contents (expand-file-name fsection srcdir))
+      (buffer-string)))
+   ((file-readable-p mainsrcfile)
+    (with-temp-buffer
+      (insert-file-contents mainsrcfile)
+      (let ((start (lm-section-start hsection)))
+        (when start
+          (insert
+           (prog1
+               (buffer-substring start (lm-section-end hsection))
+             (erase-buffer)))
+          (emacs-lisp-mode)
+          (goto-char (point-min))
+          (delete-region (point) (line-beginning-position 2))
+          (uncomment-region (point-min) (point-max))
+          (when (looking-at "^\\([ \t]*\n\\)+")
+            (replace-match ""))
+          (goto-char (point-max))
+          (skip-chars-backward " \t\n")
+          (delete-region (point) (point-max))
+          (buffer-string)))))))
+
+(defun archive--quote (txt)
+  (replace-regexp-in-string "<" "&lt;"
+                            (replace-regexp-in-string "&" "&amp;" txt)))
+
+(defun archive--insert-repolinks (name srcdir mainsrcfile)
+  (let ((url (archive--get-prop "URL" name srcdir mainsrcfile)))
+    (if url
+        (insert (format "<p>Origin: <a href=%S>%s</a></p>\n"
+                        url (archive--quote url)))
+      (let* ((externals
+              (with-temp-buffer
+                (insert-file-contents
+                 (expand-file-name "../../../elpa/externals-list" srcdir))
+                (read (current-buffer))))
+             (external (eq :external (nth 1 (assoc name externals))))
+             (git-sv "http://git.savannah.gnu.org/")
+             (urls (if external
+                       '("cgit/emacs/elpa.git/?h=externals/"
+                         "gitweb/?p=emacs/elpa.git;a=shortlog;h=refs/heads/externals/")
+                     '("cgit/emacs/elpa.git/tree/packages/"
+                       "gitweb/?p=emacs/elpa.git;a=tree;f=packages/"))))
+        (insert (format
+                 (concat "<p>Browse repository: <a href=%S>%s</a>"
+                         " or <a href=%S>%s</a></p>\n")
+                 (concat git-sv (nth 0 urls) name)
+                 'CGit
+                 (concat git-sv (nth 1 urls) name)
+                 'Gitweb))))))
+
+(defun archive--html-make-pkg (pkg files)
+  (let* ((name (symbol-name (car pkg)))
+         (latest (package-version-join (aref (cdr pkg) 0)))
+         (srcdir (expand-file-name name "../../build/packages"))
+         (mainsrcfile (expand-file-name (format "%s.el" name) srcdir))
+         (desc (aref (cdr pkg) 2)))
+    (with-temp-buffer
+      (insert (archive--html-header (format "GNU ELPA - %s" name)))
+      (insert (format "<p>Description: %s</p>\n" (archive--quote desc)))
+      (let* ((file (cdr (assoc latest files)))
+             (attrs (file-attributes file)))
+        (insert (format "<p>Latest: <a href=%S>%s</a>, %s, %s</p>\n"
+                        file (archive--quote file)
+                        (format-time-string "%Y-%b-%d" (nth 5 attrs))
+                        (archive--html-bytes-format (nth 7 attrs)))))
+      (let ((maint (archive--get-prop "Maintainer" name srcdir mainsrcfile)))
+        (when maint
+          (insert (format "<p>Maintainer: %s</p>\n" (archive--quote maint)))))
+      (archive--insert-repolinks name srcdir mainsrcfile)
+      (let ((rm (archive--get-section
+                 "Commentary" '("README" "README.rst" "README.md" "README.org")
+                 srcdir mainsrcfile)))
+        (when rm
+          (write-region rm nil (concat name "-readme.txt"))
+          (insert "<h2>Full description</h2><pre>\n" (archive--quote rm)
+                  "\n</pre>\n")))
+      (unless (< (length files) 2)
+        (insert (format "<h2>Old versions</h2><table cellpadding=\"3\" border=\"1\">\n"))
+        (dolist (file files)
+          (unless (equal (pop file) latest)
+            (let ((attrs (file-attributes file)))
+              (insert (format "<tr><td><a href=%S>%s</a></td><td>%s</td><td>%s</td>\n"
+                              file (archive--quote file)
+                              (format-time-string "%Y-%b-%d" (nth 5 attrs))
+                              (archive--html-bytes-format (nth 7 attrs)))))))
+        (insert "</table>\n"))
+      (let ((news (archive--get-section
+                   "News" '("NEWS" "NEWS.rst" "NEWS.md" "NEWS.org")
+                   srcdir mainsrcfile)))
+        (when news
+          (insert "<h2>News</h2><pre>\n" (archive--quote news) "\n</pre>\n")))
+      (insert "</body>\n")
+      (write-region (point-min) (point-max) (concat name ".html")))))
+
+(defun archive--html-make-index (pkgs)
+  (with-temp-buffer
+    (insert (archive--html-header "GNU ELPA Packages"))
+    (insert "<table cellpadding=\"3\" border=\"1\">\n")
+    (insert "<tr><th>Package</th><th>Version</th><th>Description</th></tr>\n")
+    (dolist (pkg pkgs)
+      (insert (format "<tr><td><a href=\"%s.html\">%s</a></td><td>%s</td><td>%s</td></tr>\n"
+                      (car pkg) (car pkg)
+                      (package-version-join (aref (cdr pkg) 0))
+                      (aref (cdr pkg) 2))))
+    (insert "</table></body>\n")
+    (write-region (point-min) (point-max) "index.html")))
+
+(defun batch-html-make-index ()
+  (let ((packages (make-hash-table :test #'equal))
+        (archive-contents
+         (with-temp-buffer
+           (insert-file-contents "archive-contents")
+           (goto-char (point-min))
+           ;; Skip the first element which is a version number.
+           (cdr (read (current-buffer))))))
+    (dolist (file (directory-files default-directory nil))
+      (cond
+       ((member file '("." ".." "elpa.rss" "index.html" "archive-contents")))
+       ((string-match "\\.html\\'" file))
+       ((string-match "-readme\\.txt\\'" file)
+        (let ((name (substring file 0 (match-beginning 0))))
+          (puthash name (gethash name packages) packages)))
+       ((string-match "-\\([0-9][^-]*\\)\\.\\(tar\\|el\\)\\'" file)
+        (let ((name (substring file 0 (match-beginning 0)))
+              (version (match-string 1 file)))
+          (push (cons version file) (gethash name packages))))
+       (t (message "Unknown file %S" file))))
+    (dolist (pkg archive-contents)
+      (archive--html-make-pkg pkg (gethash (symbol-name (car pkg)) packages)))
+    ;; FIXME: Add (old?) packages that are in `packages' but not in
+    ;; archive-contents.
+    (archive--html-make-index archive-contents)))
+
+;;; Maintain external packages.
+
+(defconst archive--elpa-git-url "git://git.sv.gnu.org/emacs/elpa")
+
+(defun archive-add/remove/update-externals ()
+  (let ((exts (with-current-buffer (find-file-noselect "externals-list")
+                (goto-char (point-min))
+                (read (current-buffer)))))
+    (let ((default-directory (expand-file-name "packages/")))
+      ;; Remove "old/odd" externals.
+      (dolist (dir (directory-files "."))
+        (cond
+         ((member dir '("." "..")) nil)
+         ((assoc dir exts) nil)
+         ((file-directory-p (expand-file-name (format "%s/.git" dir)))
+          (let ((status
+                 (with-temp-buffer
+                   (let ((default-directory (file-name-as-directory
+                                             (expand-file-name dir))))
+                     (call-process "git" nil t nil "status" "--porcelain")
+                     (buffer-string)))))
+            (if (zerop (length status))
+                (progn (delete-directory dir 'recursive t)
+                       (message "Deleted all of %s" dir))
+              (message "Keeping leftover unclean %s:\n%s" dir status))))))
+      (pcase-dolist (`(,dir ,kind ,_url) exts)
+        (cond
+         ((eq kind :subtree) nil)       ;Nothing to do.
+         ((not (eq kind :external))
+          (message "Unknown external package kind `%S' for %s" kind dir))
+         ((not (file-exists-p dir))
+          (let* ((branch (concat "externals/" dir))
+                 (output
+                  (with-temp-buffer
+                    ;; FIXME: Use git-new-workdir!
+                    (call-process "git" nil t nil "clone"
+                                  "--reference" ".." "--branch" branch
+                                  archive--elpa-git-url dir)
+                    (buffer-string))))
+            (message "Cloning branch %s:\n%s" dir output)))
+         ((not (file-directory-p (concat dir "/.git")))
+          (message "%s is in the way of an external, please remove!" dir))
+         (t
+          (let ((default-directory (file-name-as-directory
+                                    (expand-file-name dir))))
+            (with-temp-buffer
+              (message "Running git pull in %S" default-directory)
+              (call-process "git" nil t nil "pull")
+              (message "Updated %s:%s" dir (buffer-string))))
+          ))))))
+
+(provide 'archive-contents)
+;;; archive-contents.el ends here
diff --git a/admin/forward-diffs.py b/admin/forward-diffs.py
new file mode 100755 (executable)
index 0000000..67c7d8a
--- /dev/null
@@ -0,0 +1,418 @@
+#!/usr/bin/python
+### forward-diffs.py --- forward emacs-diffs mails to maintainers
+
+## Copyright (C) 2012 Free Software Foundation, Inc.
+
+## Author: Glenn Morris <rgm@gnu.org>
+
+## 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 <http://www.gnu.org/licenses/>.
+
+### Commentary:
+
+## Forward emails from an emacs-diffs style mailing list to the
+## maintainer(s) of the modified files.
+
+## Two modes of operation:
+
+## 1) Create the maintfile (really this is just an optimization):
+## forward-diffs.py --create -p packagesdir -m maintfile
+
+## You can start with an empty maintfile and normal operation in 2)
+## will append information as needed.
+
+## 2) Call from eg procmail to forward diffs.  Example usage:
+
+## :0c
+## * ^TO_emacs-elpa-diffs@gnu\.org
+## | forward-diffs.py -p packagedir -m maintfile -l logfile \
+## -o overmaint -s sender
+
+## where 
+
+## packagedir = /path/to/packages
+## sender = your email address
+## logfile = file to write log to (you might want to rotate/compress/examine it)
+## maintfile = file listing files and their maintainers, with format:
+##
+## package1/file1   email1
+## package2/file2   email2,email3
+## package3         email4
+##
+## Use "nomail" for the email field to not send a mail.
+## An entry that is a directory applies to all files in that directory
+## that do not have specific maintainers.
+##
+## overmaint = like maintfile, but takes precedence over it.
+
+### Code:
+
+import optparse
+import sys
+import re
+import email
+import smtplib
+import datetime
+import os
+
+
+## Scan FILE for Author or Maintainer (preferred) headers.
+## Return a list of all email addresses found in MAINTS.
+def scan_file(file, maints):
+
+    try:
+        fd = open( file, 'r')
+    except Exception as err:
+        lfile.write('Error opening file %s: %s\n' % (file, str(err)))
+        return 1
+
+    ## Max number of lines to scan looking for a maintainer.
+    ## (20 seems to be the highest at present).
+    max_lines = 50
+    nline = 0
+    cont = 0
+    type = ""
+
+    for line in fd:
+
+        nline += 1
+
+        if ( nline > max_lines ): break
+
+        ## Try and de-obfuscate.  Worth it?
+        line = re.sub( '(?i) AT ', '@', line )
+        line = re.sub( '(?i) DOT ', '.', line )
+
+        if cont:           # continued header?
+            reg = re.match( ('%s[ \t]+[^:]*?<?([\w.-]+@[\w.-]+)>?' % prefix), line, re.I )
+            if not reg:         # not a continued header
+                cont = 0
+                prefix = ""
+                if ( type == "maint" ): break
+                type = ""
+
+        ## Check for one header immediately after another.
+        if not cont:
+            reg = re.match( '([^ ]+)? *(Author|Maintainer)s?: .*?<?([\w.-]+@[\w.-]+)>?', line, re.I )
+            
+
+        if not reg: continue
+
+        if cont:
+            email = reg.group(1)
+            maints.append(email)
+        else:
+            cont = 1
+            prefix = reg.group(1) or ""
+            type = reg.group(2)
+            email = reg.group(3)
+            type = "maint" if re.search( 'Maintainer', type, re.I ) else "auth"
+            ## maints = [] does the wrong thing.
+            if type == "maint": del maints[:]
+            maints.append(email)
+
+    fd.close()
+
+
+## Scan all the files under dir for maintainer information.
+## Write to stdout, or optional argument outfile (which is overwritten).
+def scan_dir(dir, outfile=None):
+
+    dir = re.sub( '/+$', '', dir) + '/' # ensure trailing /
+
+    if not os.path.isdir(dir):
+        sys.stderr.write('No such directory: %s\n' % dir)
+        sys.exit(1)
+
+    fd = 0
+    if outfile:
+        try:
+            fd = open( outfile, 'w' )
+        except Exception as err:
+            sys.stderr.write("Error opening `%s': %s\n" % (outfile, str(err)))
+            sys.exit(1)
+
+
+    for dirpath, dirnames, filenames in os.walk(dir):
+        for file in filenames:
+            path = os.path.join(dirpath, file)
+            maints = []
+            scan_file(path, maints)
+            ## This would skip printing empty maints.
+            ## That would mean we would scan the file each time for no reason.
+            ## But empty maintainers are an error at present.
+            if not maints: continue
+            path = re.sub( '^%s' % dir, '', path )
+            string = "%-50s %s\n" % (path, ",".join(maints))
+            if fd:
+                fd.write(string)
+            else:
+                print string,
+
+    if fd: fd.close()
+
+
+usage="""usage: %prog <-p /path/to/packages> <-m maintfile>
+   <-l logfile -s sender|--create> [-o overmaintfile] [--prefix prefix]
+   [--sendmail] [--debug]
+Take an emacs-diffs mail on stdin, and forward it to the maintainer(s)."""
+
+parser = optparse.OptionParser()
+parser.set_usage ( usage )
+parser.add_option( "-m", dest="maintfile", default=None,
+                   help="file listing packages and maintainers")
+parser.add_option( "-l", dest="logfile", default=None,
+                   help="file to append output to")
+parser.add_option( "-o", dest="overmaintfile", default=None,
+                   help="override file listing packages and maintainers")
+parser.add_option( "-p", dest="packagedir", default=None,
+                   help="path to packages directory")
+parser.add_option( "-s", dest="sender", default=None,
+                   help="sender address for forwards")
+parser.add_option( "--create", dest="create", default=False,
+                   action="store_true", help="create maintfile")
+parser.add_option( "--no-scan", dest="noscan", default=False,
+                   action="store_true",
+                   help="don't scan for maintainers; implies --no-update")
+parser.add_option( "--no-update", dest="noupdate", default=False,
+                   action="store_true",
+                   help="do not update the maintfile")
+parser.add_option( "--prefix", dest="prefix", default="packages/",
+                   help="prefix to remove from modified file name [default: %default]")
+parser.add_option( "--sendmail", dest="sendmail", default=False,
+                   action="store_true", help="use sendmail rather than smtp")
+parser.add_option( "--debug", dest="debug", default=False,
+                   action="store_true", help="debug only, do not send mail")
+
+
+( opts, args ) = parser.parse_args()
+
+
+if not opts.maintfile:
+    parser.error('No maintfile specified')
+
+if not opts.packagedir:
+    parser.error('No packagedir specified')
+
+if not os.path.isdir(opts.packagedir):
+    sys.stderr.write('No such directory: %s\n' % opts.packagedir)
+    sys.exit(1)
+
+
+if not opts.create:
+    if not opts.logfile:
+        parser.error('No logfile specified')
+
+    if not opts.sender:
+        parser.error('No sender specified')
+
+
+## Create the maintfile.
+if opts.create:
+    scan_dir( opts.packagedir, opts.maintfile )
+    sys.exit()
+
+
+try:
+    lfile = open( opts.logfile, 'a' )
+except Exception as err:
+    sys.stderr.write('Error opening logfile: %s\n' % str(err))
+    sys.exit(1)
+
+
+try:
+    mfile = open( opts.maintfile, 'r' )
+except Exception as err:
+    lfile.write('Error opening maintfile: %s\n' % str(err))
+    sys.exit(1)
+
+## Each element is package/file: maint1, maint2, ...
+maints = {}
+
+for line in mfile:
+    if re.match( '#| *$', line ): continue
+    ## FIXME error here if empty maintainer.
+    (pfile, maint) = line.split()
+    maints[pfile] = maint.split(',')
+
+mfile.close()
+
+
+if opts.overmaintfile:
+    try:
+        ofile = open( opts.overmaintfile, 'r' )
+    except Exception as err:
+        lfile.write('Error opening overmaintfile: %s\n' % str(err))
+        sys.exit(1)
+
+    for line in ofile:
+        if re.match( '#| *$', line ): continue
+        (pfile, maint) = line.split()
+        maints[pfile] = maint.split(',')
+
+    ofile.close()
+
+
+stdin = sys.stdin
+
+text = stdin.read()
+
+
+resent_via = 'GNU Emacs diff forwarder'
+
+message = email.message_from_string( text )
+
+(msg_name, msg_from) = email.utils.parseaddr( message['from'] )
+
+lfile.write('\nDate: %s\n' % str(datetime.datetime.now()))
+lfile.write('Message-ID: %s\n' % message['message-id'])
+lfile.write('From: %s\n' % msg_from)
+
+if resent_via == message['x-resent-via']:
+    lfile.write('Mail loop; aborting\n')
+    sys.exit(1)
+
+
+start = False
+pfiles_seen = []
+maints_seen = []
+
+for line in text.splitlines():
+
+    if re.match( 'modified:$', line ):
+        start = True
+        continue
+
+    if not start: continue
+
+    ## An empty line or a line with non-empty first character.
+    if re.match( '( *$|[^ ])', line ): break
+
+
+    if opts.prefix:
+        reg = re.match( '%s([^ ]+)' % opts.prefix, line.strip() )
+        if not reg: continue
+        pfile = reg.group(1)
+    else:
+        pfile = line.strip()
+
+
+    lfile.write('File: %s\n' % pfile)
+
+    ## Should not be possible for files (rather than packages)...
+    if pfile in pfiles_seen:
+        lfile.write('Already seen this file\n')
+        continue
+
+    pfiles_seen.append(pfile)
+
+
+    if not pfile in maints:
+
+        lfile.write('Unknown maintainer\n')
+
+        if not opts.noscan:
+
+            lfile.write('Scanning file...\n')
+            thismaint = []
+            thisfile = os.path.join( opts.packagedir, pfile )
+            scan_file( thisfile, thismaint )
+
+            if thismaint:
+                maints[pfile] = thismaint
+
+                ## Append maintainer to file.
+                if not opts.noupdate:
+                    try:
+                        mfile = open( opts.maintfile, 'a' )
+                        string = "%-50s %s\n" % (pfile, ",".join(thismaint))
+                        mfile.write(string)
+                        mfile.close()
+                        lfile.write('Appended to maintfile\n')
+                    except Exception as err:
+                        lfile.write('Error appending to maintfile: %s\n' % 
+                                    str(err))
+
+    ## Didn't scan, or scanning did not work.
+    ## Look for a directory maintainer.
+    if not pfile in maints:
+        lfile.write('No file maintainer, trying directories...\n')
+        while True:
+            (pfile, tail) = os.path.split(pfile)
+            if not pfile: break
+            if pfile in maints: break
+
+
+    if not pfile in maints:
+        lfile.write('No maintainer, skipping\n')
+        continue
+
+
+    for maint in maints[pfile]:
+
+        lfile.write('Maint: %s\n' % maint)
+
+
+        if maint in maints_seen:
+            lfile.write('Already seen this maintainer\n')
+            continue
+
+        maints_seen.append(maint)
+
+
+        if maint == "nomail":
+            lfile.write('Not resending, no mail is requested\n')
+            continue
+
+
+        if maint == msg_from:
+            lfile.write('Not resending, since maintainer = committer\n')
+            continue
+
+
+        forward = message
+        forward.add_header('X-Resent-Via', resent_via)
+        forward.add_header('Resent-To', maint)
+        forward.add_header('Resent-From', opts.sender)
+
+        lfile.write('Resending via %s...\n' % ('sendmail'
+                    if opts.sendmail else 'smtp') )
+
+
+        if opts.debug: continue
+
+
+        if opts.sendmail:
+             s = os.popen("/usr/sbin/sendmail -i -f %s %s" %
+                          (opts.sender, maint), "w")
+             s.write(forward.as_string())
+             status = s.close()
+             if status:
+                 lfile.write('Sendmail exit status: %s\n' % status)
+
+        else:
+
+            try:
+                s = smtplib.SMTP('localhost')
+            except Exception as err:
+                lfile.write('Error opening smtp: %s\n' % str(err))
+                sys.exit(1)
+
+            try:
+                s.sendmail(opts.sender, maint, forward.as_string())
+            except Exception as err:
+                lfile.write('Error sending smtp: %s\n' % str(err))
+
+            s.quit()
+
+### forward-diffs.py ends here
diff --git a/admin/org-synch.el b/admin/org-synch.el
new file mode 100644 (file)
index 0000000..cc7e923
--- /dev/null
@@ -0,0 +1,22 @@
+(defun org-synch (package-file)
+  (let* ((archive-file "archive-contents")
+        (package-name 'org)
+         (date (substring package-file 4 12))
+         (date-int (string-to-number date))
+        contents entry)
+    (unless (and (integerp date-int)
+                 (> date-int 20100000)
+                 (< date-int 21000000))
+      (error "Package date is bad"))
+    (unless (file-exists-p package-file)
+      (error "No package file found"))
+    (when (file-exists-p archive-file)
+      (find-file archive-file)
+      (setq contents (read (current-buffer))
+           entry (assq package-name contents))
+      (unless entry
+       (error "No entry for %s in archive-contents" package-name))
+      (aset (cdr entry) 0 (version-to-list date))
+      (erase-buffer)
+      (insert (pp-to-string contents) "\n")
+      (save-buffer 0))))
diff --git a/admin/org-synch.sh b/admin/org-synch.sh
new file mode 100755 (executable)
index 0000000..02696b2
--- /dev/null
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# this script expects $1 to be the download directory and $2 to have org-synch.el
+
+PATH="/bin:/usr/bin:/usr/local/bin:${PATH}"
+
+pkgname=`curl -s http://orgmode.org/elpa/|perl -ne 'push @f, $1 if m/(org-\d{8}\.tar)/; END { @f = sort @f; print "$f[-1]\n"}'`
+
+cd $1
+wget -q http://orgmode.org/elpa/${pkgname} -O ${pkgname}-tmp
+if [ -f ${pkgname}-tmp ]; then
+    rm -f org*.tar
+    mv ${pkgname}-tmp ${pkgname} && \
+    emacs -batch -l $2/org-synch.el --eval "(org-synch \"${pkgname}\")"
+fi
diff --git a/admin/overmaint.txt b/admin/overmaint.txt
new file mode 100644 (file)
index 0000000..328d1aa
--- /dev/null
@@ -0,0 +1,12 @@
+# This file lists files and the email addresses of their maintainers.
+# It is used by the forward-diffs.py script.
+# This file overrides the automatically generated maintfile.
+# Use nomail to suppress sending mail.
+# File names are relative to the packages/ directory.
+# Lines starting with # are ignored.
+# Examples:
+#some-package/some-file.el    nomail
+#some-package/otherfile.el    none@example.com
+
+register-alist/register-list.el  bzg@gnu.org
+windresize/windresize.el.el      bzg@gnu.org
diff --git a/admin/update-archive.sh b/admin/update-archive.sh
new file mode 100755 (executable)
index 0000000..fb7b91d
--- /dev/null
@@ -0,0 +1,100 @@
+#!/bin/sh -x
+
+makelog=""
+buildir="$(pwd)"
+
+export LANG=C
+case "$1" in
+    "--batch")
+        makelog="$(pwd)/make.log"
+        exec >"$makelog" 2>&1
+        ;;
+esac
+
+# Send an email to warn about a problem.
+signal_error () {
+    title="$*"
+    if [ "" = "$makelog" ]; then
+        echo "Error: $title"
+    else
+        mx_gnu_org="$(host -t mx gnu.org | sed 's/.*[  ]//')"
+        (sleep 5; echo "HELO elpa.gnu.org"
+         sleep 1; echo "MAIL FROM: <elpa@elpa.gnu.org>"
+         sleep 1; echo "RCPT TO: <emacs-elpa-diffs@gnu.org>"
+         sleep 1; echo "DATA"
+         sleep 1; cat <<ENDDOC
+From: ELPA update <elpa@elpa.gnu.org>
+To: emacs-elpa-diffs@gnu.org
+Subject: $title
+
+ENDDOC
+         cat "$makelog"
+         echo "."; sleep 1) | telnet "$mx_gnu_org" smtp
+    fi
+    exit 1
+}
+
+
+cd ../elpa
+
+# Fetch changes.
+git pull || signal_error "git pull failed"
+
+# Remember we're inside the "elpa" branch which we don't want to trust,
+# So always refer to the makefile and admins files from $builddir".
+
+# Setup and update externals.
+emacs --batch -l "$buildir/admin/archive-contents.el" \
+      -f archive-add/remove/update-externals
+
+make -f "$buildir/GNUmakefile" check_copyrights ||
+    signal_error "check_copyright failed"
+
+cd "$buildir"
+
+rsync -av --delete --exclude=ChangeLog --exclude=.git ../elpa/packages ./
+
+# Refresh the ChangeLog files.  This needs to be done in
+# the source tree, because it needs the VCS data!
+emacs -batch -l admin/archive-contents.el \
+      -eval '(archive-prepare-packages "../elpa")'
+
+
+rm -rf archive                  # In case there's one left over!
+make archive-full || {
+    signal_error "make archive-full failed"
+}
+latest="emacs-packages-latest.tgz"
+(cd archive
+ tar zcf "$latest" packages)
+(cd ../
+ mkdir -p staging/packages
+ # Not sure why we have `staging-old', but let's keep it for now.
+ rm -rf staging-old
+ cp -a staging staging-old
+ # Move new files into place but don't throw out old package versions.
+ for f in build/archive/packages/*; do
+     dst="staging/packages/$(basename "$f")"
+     # Actually, let's never overwrite an existing version.  So changes can
+     # be installed without causing a new package to be built until the
+     # version field is changed.  Some files need to be excluded from the
+     # "immutable" policy, most importantly "archive-contents"
+     # and "*-readme.txt".
+     case $dst in
+         */archive-contents | *-readme.txt ) mv "$f" "$dst" ;;
+         * ) if [ -r "$dst" ]
+             then rm "$f"
+             else
+                 # FIXME: Announce the new package/version on
+                 # gnu.emacs.sources!
+                 mv "$f" "$dst"
+             fi ;;
+     esac
+ done
+ mv build/archive/"$latest" staging/
+ rm -rf build/archive)
+
+# Make the HTML and readme.txt files.
+(cd ../staging/packages
+ emacs --batch -l ../../build/admin/archive-contents.el \
+       --eval '(batch-html-make-index)')
diff --git a/copyright_exceptions b/copyright_exceptions
new file mode 100644 (file)
index 0000000..7f669a9
--- /dev/null
@@ -0,0 +1,49 @@
+./auctex/latex.el:   "pounds" "copyright"
+./auctex/multi-prompt.el
+./auctex/style/amsart.el
+./auctex/style/amsbook.el
+./auctex/style/amsbsy.el
+./auctex/style/amsmath.el:;; FIXME: What about the copyright for <= 2001?
+./auctex/style/amsopn.el
+./auctex/style/amstext.el
+./auctex/style/article.el
+./auctex/style/beamer.el
+./auctex/style/book.el
+./auctex/style/czech.el
+./auctex/style/danish.el
+./auctex/style/dk.el
+./auctex/style/dutch.el
+./auctex/style/foils.el
+./auctex/style/german.el
+./auctex/style/graphics.el
+./auctex/style/j-article.el
+./auctex/style/j-book.el
+./auctex/style/j-report.el
+./auctex/style/jarticle.el
+./auctex/style/jbook.el
+./auctex/style/jreport.el
+./auctex/style/jsarticle.el
+./auctex/style/jsbook.el
+./auctex/style/jurabib.el:;; you assign the copyright to the FSF.
+./auctex/style/letter.el
+./auctex/style/natbib.el
+./auctex/style/ngerman.el
+./auctex/style/plfonts.el
+./auctex/style/plhb.el
+./auctex/style/report.el
+./auctex/style/scrartcl.el
+./auctex/style/scrbook.el
+./auctex/style/scrlttr2.el
+./auctex/style/scrpage2.el
+./auctex/style/scrreprt.el
+./auctex/style/slovak.el
+./auctex/style/swedish.el
+./auctex/style/virtex.el
+./auctex/tex-fold.el:    ("(C)" ("copyright"))
+./auctex/tex-info.el:   '("copyright" nil)
+./muse/htmlize-hack.el
+./uni-confusables/gen-confusables.el:      (insert ";; Copyright (C) 1991-2009, 2010 Unicode, Inc.
+./uni-confusables/gen-confusables.el:;; for the copyright and permission notice.\n\n")
+./uni-confusables/uni-confusables.el
+./uni-confusables/uni-confusables.el:;; Copyright (C) 1991-2009, 2010 Unicode, Inc.
+./uni-confusables/uni-confusables.el:;; for the copyright and permission notice.
diff --git a/externals-list b/externals-list
new file mode 100644 (file)
index 0000000..ef40b34
--- /dev/null
@@ -0,0 +1,35 @@
+;; -*- emacs-lisp -*-
+
+;; List of packages that are maintained externally.
+;; The list is made of elements of the form (NAME KIND URL).
+;;
+;; Where NAME is the name of the package;
+;;
+;; KIND can be one of:
+;;  :subtree  = a "git subtree" in the `master' branch.
+;;  :external = kept in a separate `externals/<name>' branch.
+;;
+;; And URL is the URL of the remote git repository that we want to track.
+;; It can be nil, in which case we don't track anything (useless for
+;; :subtree, but not for :external).
+
+;; The FIXMEs indicate that the branch can't be merged as is because it needs
+;; some manual intervention (typically, because the two branches have
+;; diverged).
+
+(("ack"                        :subtree "https://github.com/leoliu/ack-el")
+ ;;FIXME:("auctex"     :subtree "git://git.sv.gnu.org/auctex.git")
+ ("coffee-mode"                :subtree "https://github.com/defunkt/coffee-mode")
+ ("company"            :subtree "https://github.com/company-mode/company-mode.git")
+ ("dismal"             :external nil)
+ ("eldoc-eval"         :subtree "https://github.com/thierryvolpiatto/eldoc-eval.git")
+ ("enwc"               :subtree "bzr::bzr://bzr.savannah.nongnu.org/enwc/trunk")
+ ("f90-interface-browser" :subtree "http://github.com/wence-/f90-iface")
+ ("ggtags"             :subtree "https://github.com/leoliu/ggtags")
+ ("ioccur"             :subtree "https://github.com/thierryvolpiatto/ioccur.git")
+ ("js2-mode"           :subtree "https://github.com/mooz/js2-mode.git")
+ ;;FIXME:("org"                :external ??) ;; Need to introduce snapshots!!
+ ;;FIXME:("vlf"                :subtree ??)
+ ("websocket"          :subtree "https://github.com/ahyatt/emacs-websocket.git")
+ ;;FIXME:("yasnippet"  :subtree "https://github.com/capitaomorte/yasnippet.git")
+ )
diff --git a/html/index.html b/html/index.html
new file mode 100644 (file)
index 0000000..e734c88
--- /dev/null
@@ -0,0 +1,23 @@
+<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+  <title>GNU Emacs Lisp Package Archive</title>
+  <link rel="icon" type="image/png" href="gnu-head-mini.png">
+  <link rel="stylesheet" type="text/css" href="layout.css">
+</head>
+<body>
+
+<h1>GNU Emacs Lisp Package Archive</h1>
+
+<p>
+This is the default package repository for 
+<a href="http://www.gnu.org/software/emacs/">GNU Emacs</a>.
+
+<p>
+To use it, type <tt>M-x list-packages</tt> in Emacs.
+(This requires Emacs version 24.1 or higher.)
+
+<p>
+  You can grab the <a href="emacs-packages-latest.tgz">latest package snapshot</a> or look at the <a href="/packages">package list</a> directly.
+</body>
+</html>
diff --git a/html/layout.css b/html/layout.css
new file mode 100644 (file)
index 0000000..f6c1395
--- /dev/null
@@ -0,0 +1,87 @@
+/* This is heavily cut-down version of http://www.gnu.org/layout.css */
+
+
+/*
+layout.css -- css stylesheet used on www.gnu.org
+
+Copyright (C) 2006, 2007, 2008, 2009 Free Software Foundation
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+*/
+
+html, body{
+        padding: 0;
+        color: #35382a;
+        max-width: 58em; margin: 0 auto 0; position: relative; min-width: 902px;
+        padding-left: 10px; padding-right: 10px;
+        background-color: #fff;  padding-bottom: 1.8em;  margin-top: 0.5em; 
+}
+
+body{
+    font-family: sans-serif;
+}
+
+a:hover{ color: red; }
+
+h1 {
+ background-color: #3465a4; color: white; font-size: 2em;
+ margin-bottom: 0.3em; font-weight:bold; text-align: center; line-height: 1.6em; }
+
+h2, h3, {line-height: 1.5em;}
+
+h2{ font-size: 1.6em; }
+
+h3{ font-size: 1.3em; }
+
+img{ border: 0; }
+
+.nocenter{ text-align: left; }
+
+ul { list-style: square; margin-left: 1.4em; list-style-image:url(bullet.gif);  }
+
+ol{ list-style: decimal; margin-left: 1.9em; }
+
+li, dd,  p{
+    padding-bottom: 1em; line-height: 1.5em; }
+
+dt{ font-weight: bold;  }
+
+pre {
+padding-left: 1.5em;
+padding-right: 1.5em;
+margin-top: 1em;
+margin-bottom: 1em;
+font-size: 0.9em;
+display: block;
+background-color: #eeeeee;
+color: #000000;
+font-family: monospace;
+}
+
+strong, b{ font-weight: bold; }
+
+em, i, var{ font-style: italic; }
+
+blockquote{ margin: 1em; font-style: italic; }
+
+code, kbd, samp, tt{ font-family: monospace; }
+
+.center{ text-align:center; }
+
+.big{ font-size: 130%; padding-top: 0.7em; }
+
+.inline-list li { display: inline }
+
+.highlight{background-color: #ff6;}
+
+h2 a{color: yellow !important;}
diff --git a/packages/README b/packages/README
new file mode 100644 (file)
index 0000000..426de05
--- /dev/null
@@ -0,0 +1,34 @@
+This directory contains most of the source code of the GNU ELPA packages.
+
+Each directory in here corresponds to a package, which can be
+either a single-file package or a multifile package.
+
+A nightly cron job refreshes the GNU ELPA archive from this repository.
+
+This cron job only creates a new package when the "version" (as specified in
+the foo-pkg.el or in the "Version:" header) of a package is modified.
+This means that you can safely work on the next version here without
+worrying about the unstable code making it to GNU ELPA, and simply update
+the "version" when you want to release the new code.
+
+* External branches:
+
+Some packages have an external upstream branch.
+You should ideally be able to "bzr merge <URL>" from them, and it often
+works, but it generally requires some hand-holding to set it up.
+More specifically, the first "bzr merge" (ideally done when installing the
+package into `elpa') needs to be a "bzr join" since there's no
+common ancestor.  Worse, "bzr join" doesn't work so well with bzr-git, so
+you need to do a bit of gymnastics:
+
+   git clone <giturl>   # Done because bzr-git works better locally
+   bzr branch <localgit> tmp
+   cd tmp
+   bzr mkdir .newroot
+   bzr mv * .newroot/
+   ... maybe other bzr mv .<blabla> .newroot/ ...
+   bzr split .newroot
+   mv .newroot .../elpa/packages/<package>
+   cd .../elpa/packages/
+   bzr join <package>
+   
diff --git a/packages/ack/README.rst b/packages/ack/README.rst
new file mode 100644 (file)
index 0000000..9d4e14f
--- /dev/null
@@ -0,0 +1,74 @@
+==============================================================
+ Emacs Interface to `Ack <http://beyondgrep.com>`_-like Tools
+==============================================================
+This package brings the full power of `ack <http://beyondgrep.com>`_
+to `emacs <http://www.gnu.org/software/emacs>`_ by allowing you to run
+it seamlessly with its large set of options. Ack-like tools such as
+`the silver searcher <https://github.com/ggreer/the_silver_searcher>`_
+and ``git/hg/bzr grep`` are well supported too.
+
+It is part of `GNU ELPA <http://elpa.gnu.org>`_ - the official package
+archive for `emacs <http://www.gnu.org/software/emacs>`_. Patches,
+feature requests and bug reports are welcome.
+
+Features
+--------
+
+- Keep all features of `ack <http://beyondgrep.com>`_ and more
+- Handle colors using the standard library ``ansi-color.el``
+- Completion for ack options while reading from the minibuffer
+- Support `the silver search (ag)
+  <https://github.com/ggreer/the_silver_searcher>`_
+- Support ``git grep``, ``hg grep`` and ``bzr grep``
+
+Install
+-------
+
+``M-x package-install RET ack RET``
+
+Screenshots
+-----------
+
+* ack
+
+.. figure:: http://i.imgur.com/VwWyzAe.png
+   :target: http://i.imgur.com/VwWyzAe.png
+   :alt: ack.png
+
+* git grep
+
+.. figure:: http://i.imgur.com/rwjC4pa.png
+   :target: http://i.imgur.com/rwjC4pa.png
+   :alt: ack-git-grep.png
+
+Usage
+-----
+
+- Type ``M-x ack`` and provide a pattern to search.
+- Type ``C-u M-x ack`` to search from current project root.
+- Type ``C-u C-u M-x ack`` to interactively choose a directory to search.
+
+While reading ack command and args from the minibuffer, the following
+key bindings may be useful:
+
+- ``M-I`` => insert a template for case-insensitive file name search
+- ``M-G`` => insert a template for ``git grep``, ``hg grep`` or ``bzr grep``
+- ``M-Y`` => grab the symbol at point from the window before entering
+  the minibuffer
+- ``TAB`` => completion for ack options
+
+Emacs23
+-------
+
+Check out the `emacs23
+<https://github.com/leoliu/ack-el/tree/emacs23>`_ branch.
+
+Bugs
+----
+
+https://github.com/leoliu/ack-el/issues
+
+Contributors
+------------
+Phillip Lord
diff --git a/packages/ack/ack.el b/packages/ack/ack.el
new file mode 100644 (file)
index 0000000..f7a91d0
--- /dev/null
@@ -0,0 +1,387 @@
+;;; ack.el --- Interface to ack-like source code search tools   -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2012-2013  Free Software Foundation, Inc.
+
+;; Author: Leo Liu <sdl.web@gmail.com>
+;; Version: 1.2
+;; Keywords: tools, processes, convenience
+;; Created: 2012-03-24
+;; URL: https://github.com/leoliu/ack-el
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This package provides an interface to ack http://beyondgrep.com --
+;; a tool like grep, designed for programmers with large trees of
+;; heterogeneous source code. It builds on standard packages
+;; `compile.el' and `ansi-color.el' and lets you seamlessly run `ack'
+;; with its large set of options.
+;;
+;; Ack-like tools such as the silver search (ag) and git/hg/bzr grep
+;; are well supported too.
+
+;;; Usage:
+
+;; +  Type `M-x ack' and provide a pattern to search.
+;; +  Type `C-u M-x ack' to search from current project root.
+;; +  Type `C-u C-u M-x ack' to interactively choose a directory to
+;;    search.
+;;
+;; Note: use `ack-default-directory-function' for customised
+;; behaviour.
+;;
+;; When in the minibuffer the following key bindings may be useful:
+;;
+;; +  `M-I' inserts a template for case-insensitive file name search
+;; +  `M-G' inserts a template for `git grep', `hg grep' or `bzr grep'
+;; +  `M-Y' inserts the symbol at point from the window before entering
+;;    the minibuffer
+;; +  `TAB' completes ack options
+
+;;; Bugs: https://github.com/leoliu/ack-el/issues
+
+;;; Code:
+
+(require 'compile)
+(require 'ansi-color)
+(autoload 'shell-completion-vars "shell")
+
+(eval-when-compile
+  (unless (fboundp 'setq-local)
+    (defmacro setq-local (var val)
+      (list 'set (list 'make-local-variable (list 'quote var)) val))))
+
+(defgroup ack nil
+  "Run `ack' and display the results."
+  :group 'tools
+  :group 'processes)
+
+;; Used implicitly by `define-compilation-mode'
+(defcustom ack-scroll-output nil
+  "Similar to `compilation-scroll-output' but for the *Ack* buffer."
+  :type 'boolean
+  :group 'ack)
+
+(defcustom ack-command
+  ;; Note: on GNU/Linux ack may be renamed to ack-grep
+  (concat (file-name-nondirectory (or (executable-find "ack-grep")
+                                      (executable-find "ack")
+                                      (executable-find "ag")
+                                      "ack")) " ")
+  "The default command for \\[ack].
+
+Note also options to ack can be specified in ACK_OPTIONS
+environment variable and .ackrc, which you can disable by the
+--noenv switch."
+  :type 'string
+  :safe 'stringp
+  :group 'ack)
+
+(defcustom ack-buffer-name-function nil
+  "If non-nil, a function to compute the name of an ack buffer.
+See `compilation-buffer-name-function' for details."
+  :type '(choice function (const nil))
+  :group 'ack)
+
+(defcustom ack-vc-grep-commands
+  '((".git" . "git --no-pager grep --color -n -i")
+    (".hg" . "hg grep -n -i")
+    ;; Plugin bzr-grep required for bzr < 2.6
+    (".bzr" . "bzr grep --color=always -n -i"))
+  "An alist of vc grep commands for `ack-skel-vc-grep'.
+Each element is of the form (VC_DIR . CMD)."
+  :type '(repeat (cons string string))
+  :group 'ack)
+
+(defcustom ack-default-directory-function 'ack-default-directory
+  "A function to return the default directory for `ack'.
+It is called with one arg, the prefix arg to `ack'."
+  :type 'function
+  :group 'ack)
+
+(defcustom ack-project-root-patterns
+  (list (concat "\\`" (regexp-quote dir-locals-file) "\\'")
+        "\\`Project\\.ede\\'"
+        "\\.xcodeproj\\'"               ; xcode
+        "\\`\\.ropeproject\\'"          ; python rope
+        "\\`\\.\\(?:CVS\\|bzr\\|git\\|hg\\|svn\\)\\'")
+  "A list of regexps to match files in a project root.
+Used by `ack-guess-project-root'."
+  :type '(repeat string)
+  :group 'ack)
+
+(defcustom ack-minibuffer-setup-hook nil
+  "Ack-specific hook for `minibuffer-setup-hook'."
+  :type 'hook
+  :group 'ack)
+
+;;; ======== END of USER OPTIONS ========
+
+(defvar ack-history nil "History list for ack.")
+
+(defvar ack-first-column 0
+  "Value to use for `compilation-first-column' in ack buffers.")
+
+(defvar ack-error-screen-columns nil
+  "Value to use for `compilation-error-screen-columns' in ack buffers.")
+
+(defvar ack-error "ack match"
+  "Stem of message to print when no matches are found.")
+
+(defun ack-filter ()
+  "Handle match highlighting escape sequences inserted by the ack process.
+This function is called from `compilation-filter-hook'."
+  (save-excursion
+    (let ((ansi-color-apply-face-function
+           (lambda (beg end face)
+             (when face
+               (ansi-color-apply-overlay-face beg end face)
+               (put-text-property beg end 'ack-color t)))))
+      (ansi-color-apply-on-region compilation-filter-start (point)))))
+
+(defvar ack-mode-font-lock-keywords
+  '(("^--$" 0 'shadow)
+    ;; Command output lines.
+    (": \\(.+\\): \\(?:Permission denied\\|No such \\(?:file or directory\\|device or address\\)\\)$"
+     1 'compilation-error)
+    ;; Remove match from ack-error-regexp-alist before fontifying
+    ("^Ack \\(?:started\\|finished\\) at.*"
+     (0 '(face nil compilation-message nil message nil help-echo nil mouse-face nil) t))
+    ("^Ack \\(exited abnormally\\|interrupt\\|killed\\|terminated\\)\\(?:.*with code \\([0-9]+\\)\\)?.*"
+     (0 '(face nil compilation-message nil message nil help-echo nil mouse-face nil) t)
+     (1 'compilation-error)
+     (2 'compilation-error nil t)))
+  "Additional things to highlight in ack output.
+This gets tacked on the end of the generated expressions.")
+
+(defun ack--column-start ()
+  (or (let* ((beg (match-end 0))
+             (end (save-excursion
+                    (goto-char beg)
+                    (line-end-position)))
+             (mbeg (text-property-any beg end 'ack-color t)))
+        (when mbeg (- mbeg beg)))
+      ;; Use column number from `ack' itself if available
+      (when (match-string 4)
+        (1- (string-to-number (match-string 4))))))
+
+(defun ack--column-end ()
+  (let* ((beg (match-end 0))
+         (end (save-excursion
+                (goto-char beg)
+                (line-end-position)))
+         (mbeg (text-property-any beg end 'ack-color t))
+         (mend (and mbeg (next-single-property-change
+                          mbeg 'ack-color nil end))))
+    (when mend (- mend beg))))
+
+(defun ack--file ()
+  (let (file)
+    (save-excursion
+      (while (progn
+               (forward-line -1)
+               (looking-at-p "^--$")))
+      (setq file (or (get-text-property (line-beginning-position) 'ack-file)
+                     (progn
+                       (put-text-property (line-beginning-position)
+                                          (line-end-position)
+                                          'font-lock-face compilation-info-face)
+                       (buffer-substring-no-properties
+                        (line-beginning-position) (line-end-position))))))
+    (put-text-property (line-beginning-position)
+                       (min (1+ (line-end-position)) (point-max)) 'ack-file file)
+    (list file)))
+
+;;; `compilation-mode-font-lock-keywords' ->
+;;; `compilation--ensure-parse' -> `compilation--parse-region' ->
+;;; `compilation-parse-errors' -> `compilation-error-properties'.
+;;; `compilation-error-properties' returns nil if a previous pattern
+;;; in the regexp alist has already been applied in a region.
+
+(defconst ack-error-regexp-alist
+  `(;; grouping line (--group or --heading)
+    ("^\\([1-9][0-9]*\\)\\(:\\|-\\)\\(?:\\(?4:[1-9][0-9]*\\)\\2\\)?"
+     ack--file 1 (ack--column-start . ack--column-end)
+     nil nil (4 compilation-column-face nil t))
+    ;; none grouping line (--nogroup or --noheading)
+    ("^\\(.+?\\)\\(:\\|-\\)\\([1-9][0-9]*\\)\\2\\(?:\\(?4:[1-9][0-9]*\\)\\2\\)?"
+     1 3 (ack--column-start . ack--column-end)
+     nil nil (4 compilation-column-face nil t))
+    ("^Binary file \\(.+\\) matches$" 1 nil nil 0 1))
+  "Ack version of `compilation-error-regexp-alist' (which see).")
+
+(defvar ack-process-setup-function 'ack-process-setup)
+
+(defun ack-process-setup ()
+  ;; Handle `hg grep' output
+  (when (string-match-p "^[ \t]*hg[ \t]" (car compilation-arguments))
+    (setq compilation-error-regexp-alist
+          '(("^\\(.+?:[0-9]+:\\)\\(?:\\([0-9]+\\):\\)?" 1 2)))
+    (setq-local compilation-parse-errors-filename-function
+                (lambda (file)
+                  (save-match-data
+                    (if (string-match "\\(.+\\):\\([0-9]+\\):" file)
+                        (match-string 1 file)
+                      file)))))
+  ;; Handle `bzr grep' output
+  (when (string-match-p "^[ \t]*bzr[ \t]" (car compilation-arguments))
+    (setq-local compilation-parse-errors-filename-function
+                (lambda (file)
+                  (save-match-data
+                    ;; 'bzr grep -r' has files like `termcolor.py~147'
+                    (if (string-match "\\(.+\\)~\\([0-9]+\\)" file)
+                        (match-string 1 file)
+                      file))))))
+
+(define-compilation-mode ack-mode "Ack"
+  "A compilation mode tailored for ack."
+  (setq-local compilation-disable-input t)
+  (setq-local compilation-error-face 'compilation-info)
+  (add-hook 'compilation-filter-hook 'ack-filter nil t))
+
+;;; `compilation-display-error' is introduced in 24.4
+(unless (fboundp 'compilation-display-error)
+  (defun ack-mode-display-match ()
+    "Display in another window the match in current line."
+    (interactive)
+    (setq compilation-current-error (point))
+    (next-error-no-select 0))
+  (define-key ack-mode-map "\C-o" #'ack-mode-display-match))
+
+(defun ack-skel-file ()
+  "Insert a template for case-insensitive file name search."
+  (interactive)
+  (delete-minibuffer-contents)
+  (let ((ack (or (car (split-string ack-command nil t)) "ack")))
+    (if (equal ack "ag")
+        (skeleton-insert `(nil ,ack " -ig '" _ "'"))
+      (skeleton-insert `(nil ,ack " -g '(?i:" _ ")'")))))
+
+;; Work around bug http://debbugs.gnu.org/13811
+(defvar ack--project-root nil)          ; dynamically bound in `ack'
+
+(defun ack-skel-vc-grep ()
+  "Insert a template for vc grep search."
+  (interactive)
+  (let* ((regexp (concat "\\`" (regexp-opt
+                                (mapcar 'car ack-vc-grep-commands))
+                         "\\'"))
+         (root (or (ack-guess-project-root default-directory regexp)
+                   (error "Cannot locate vc project root")))
+         (which (car (directory-files root nil regexp)))
+         (backend (downcase (substring which 1)))
+         (cmd (or (cdr (assoc which ack-vc-grep-commands))
+                  (error "No command provided for `%s grep'" backend))))
+    (setq ack--project-root root)
+    (delete-minibuffer-contents)
+    (skeleton-insert `(nil ,cmd " '" _ "'"))))
+
+(defun ack-yank-symbol-at-point ()
+  "Yank the symbol from the window before entering the minibuffer."
+  (interactive)
+  (let ((symbol (and (minibuffer-selected-window)
+                     (with-current-buffer
+                         (window-buffer (minibuffer-selected-window))
+                       (thing-at-point 'symbol)))))
+    (if symbol (insert symbol)
+      (minibuffer-message "No symbol found"))))
+
+(defvar ack-minibuffer-local-map
+  (let ((map (make-sparse-keymap)))
+    (set-keymap-parent map minibuffer-local-map)
+    (define-key map "\t" 'completion-at-point)
+    (define-key map "\M-I" 'ack-skel-file)
+    (define-key map "\M-G" 'ack-skel-vc-grep)
+    (define-key map "\M-Y" 'ack-yank-symbol-at-point)
+    (define-key map "'" 'skeleton-pair-insert-maybe)
+    map)
+  "Keymap used for reading `ack' command and args in minibuffer.")
+
+(defun ack-guess-project-root (start-directory &optional regexp)
+  (let ((regexp (or regexp
+                    (mapconcat 'identity ack-project-root-patterns "\\|")))
+        (parent (file-name-directory
+                 (directory-file-name (expand-file-name start-directory)))))
+    (if (directory-files start-directory nil regexp)
+        start-directory
+      (unless (equal parent start-directory)
+        (ack-guess-project-root parent regexp)))))
+
+(defun ack-default-directory (arg)
+  "A function for `ack-default-directory-function'.
+With no \\[universal-argument], return `default-directory';
+With one \\[universal-argument], find the project root according to
+`ack-project-root-patterns';
+Otherwise, interactively choose a directory."
+  (cond
+   ((not arg) default-directory)
+   ((= (prefix-numeric-value arg) 4)
+    (or (ack-guess-project-root default-directory)
+        (ack-default-directory '(16))))
+   (t (read-directory-name "In directory: " nil nil t))))
+
+(defun ack-update-minibuffer-prompt (&optional _beg _end _len)
+  (when (minibufferp)
+    (let ((inhibit-read-only t))
+      (save-excursion
+        (goto-char (minibuffer-prompt-end))
+        (when (looking-at "\\(\\w+\\)\\s-")
+          (put-text-property
+           (point-min) (minibuffer-prompt-end)
+           'display
+           (format "Run %s in `%s': "
+                   (match-string-no-properties 1)
+                   (file-name-nondirectory
+                    (directory-file-name ack--project-root)))))))))
+
+(defun ack-minibuffer-setup-function ()
+  (shell-completion-vars)
+  (add-hook 'after-change-functions
+            #'ack-update-minibuffer-prompt nil t)
+  (ack-update-minibuffer-prompt)
+  (run-hooks 'ack-minibuffer-setup-hook))
+
+;;;###autoload
+(defun ack (command-args &optional directory)
+  "Run ack using COMMAND-ARGS and collect output in a buffer.
+When called interactively, the value of DIRECTORY is provided by
+`ack-default-directory-function'.
+
+The following keys are available while reading from the
+minibuffer:
+
+\\{ack-minibuffer-local-map}"
+  (interactive
+   (let ((ack--project-root (or (funcall ack-default-directory-function
+                                    current-prefix-arg)
+                           default-directory))
+         ;; Disable completion cycling; see http://debbugs.gnu.org/12221
+         (completion-cycle-threshold nil))
+     (list (minibuffer-with-setup-hook 'ack-minibuffer-setup-function
+             (read-from-minibuffer "Ack: "
+                                   ack-command
+                                   ack-minibuffer-local-map
+                                   nil 'ack-history))
+           ack--project-root)))
+  (let ((default-directory (expand-file-name
+                            (or directory default-directory))))
+    ;; Change to the compilation buffer so that `ack-buffer-name-function' can
+    ;; make use of `compilation-arguments'.
+    (with-current-buffer (compilation-start command-args 'ack-mode)
+      (when ack-buffer-name-function
+        (rename-buffer (funcall ack-buffer-name-function "ack"))))))
+
+(provide 'ack)
+;;; ack.el ends here
diff --git a/packages/ack/pcmpl-ack.el b/packages/ack/pcmpl-ack.el
new file mode 100644 (file)
index 0000000..3029367
--- /dev/null
@@ -0,0 +1,141 @@
+;;; pcmpl-ack.el --- completion for ack    -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2012-2013  Free Software Foundation, Inc.
+
+;; Author: Leo Liu <sdl.web@gmail.com>
+;; Keywords: tools, processes, convenience
+;; Created: 2012-09-26
+;; URL: https://github.com/leoliu/ack-el
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Provide pcompletion support for the cli tool `ack' which can be
+;; downloaded from http://beyondgrep.com.
+;;
+;; Install:
+;;   (autoload 'pcomplete/ack "pcmpl-ack")
+;;
+;; Usage:
+;;   - To complete short options type '-' first
+;;   - To complete long options type '--' first
+;;   - Color name completion is supported following
+;;       --color-filename=, --color-match= and --color-lineno=
+;;   - Type completion is supported following --type=
+
+;;; Code:
+
+(require 'pcomplete)
+
+(defcustom pcmpl-ack-program
+  (file-name-nondirectory (or (executable-find "ack-grep")
+                              (executable-find "ack")
+                              "ack"))
+  "Name of the ack program."
+  :type 'file
+  :group 'pcomplete)
+
+(defvar pcmpl-ack-color-options
+  '("clear"
+    "reset"
+    "dark"
+    "bold"
+    "underline"
+    "underscore"
+    "blink"
+    "reverse"
+    "concealed"
+    "black"
+    "red"
+    "green"
+    "yellow"
+    "blue"
+    "magenta"
+    "on_black"
+    "on_red"
+    "on_green"
+    "on_yellow"
+    "on_blue"
+    "on_magenta"
+    "on_cyan"
+    "on_white")
+  "Color names for the `ack' command.")
+
+(defun pcmpl-ack-run (buffer &rest args)
+  "Run ack with ARGS and send the output to BUFFER."
+  (condition-case nil
+      (apply 'call-process (or pcmpl-ack-program "ack") nil buffer nil args)
+    (file-error -1)))
+
+(defun pcmpl-ack-short-options ()
+  "Short options for the `ack' command."
+  (with-temp-buffer
+    (let (options)
+      (when (zerop (pcmpl-ack-run t "--help"))
+        (goto-char (point-min))
+        (while (re-search-forward "^  -\\([^-]\\)" nil t)
+          (push (match-string 1) options))
+        (mapconcat 'identity (nreverse options) "")))))
+
+(defun pcmpl-ack-long-options (&optional arg)
+  "Long options for the `ack' command."
+  (with-temp-buffer
+    (let (options)
+      (when (zerop (pcmpl-ack-run t (or arg "--help")))
+        (goto-char (point-min))
+        (while (re-search-forward
+                "\\(?:   ?\\|, \\)\\(--\\(\\[no\\]\\)?\\([[:alnum:]-]+=?\\)\\)"
+                nil t)
+          (if (not (match-string 2))
+              (push (match-string 1) options)
+            (push (concat "--" (match-string 3)) options)
+            (push (concat "--no" (match-string 3)) options)))
+        (nreverse options)))))
+
+(defun pcmpl-ack-type-options ()
+  "A list of types for the `ack' command."
+  (pcmpl-ack-long-options "--help-types"))
+
+;;;###autoload
+(defun pcomplete/ack ()
+  "Completion for the `ack' command.
+Start an argument with '-' to complete short options and '--' for
+long options."
+  ;; No space after =
+  (while t
+    (if (pcomplete-match "^-" 0)
+        (cond
+         ((pcomplete-match "^--color-\\w+=\\(\\S-*\\)" 0)
+          (pcomplete-here* pcmpl-ack-color-options
+                           (pcomplete-match-string 1 0) t))
+         ((pcomplete-match "^--\\(?:no\\)?ignore-dir=\\(\\S-*\\)" 0)
+          (pcomplete-here* (pcomplete-dirs)
+                           (pcomplete-match-string 1 0) t))
+         ((pcomplete-match "^--type=\\(\\S-*\\)" 0)
+          (pcomplete-here* (mapcar (lambda (type-option)
+                                     (substring type-option 2))
+                                   (pcmpl-ack-type-options))
+                           (pcomplete-match-string 1 0) t))
+         ((pcomplete-match "^--" 0)
+          (pcomplete-here* (append (pcmpl-ack-long-options)
+                                   (pcmpl-ack-type-options))))
+         (t (pcomplete-opt (pcmpl-ack-short-options))))
+      (pcomplete-here* (pcomplete-dirs-or-entries)))))
+
+;;;###autoload
+(defalias 'pcomplete/ack-grep 'pcomplete/ack)
+
+(provide 'pcmpl-ack)
+;;; pcmpl-ack.el ends here
diff --git a/packages/adaptive-wrap/adaptive-wrap.el b/packages/adaptive-wrap/adaptive-wrap.el
new file mode 100644 (file)
index 0000000..3787a99
--- /dev/null
@@ -0,0 +1,115 @@
+;;; adaptive-wrap.el --- Smart line-wrapping with wrap-prefix
+
+;; Copyright (C) 2011-2013  Free Software Foundation, Inc.
+
+;; Author: Stephen Berman <stephen.berman@gmx.net>
+;;         Stefan Monnier <monnier@iro.umontreal.ca>
+;; Version: 0.5
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This package provides the `adaptive-wrap-prefix-mode' minor mode which sets
+;; the wrap-prefix property on the fly so that single-long-line paragraphs get
+;; word-wrapped in a way similar to what you'd get with M-q using
+;; adaptive-fill-mode, but without actually changing the buffer's text.
+
+;;; Code:
+
+(require 'easymenu)
+
+(defcustom adaptive-wrap-extra-indent 0
+  "Number of extra spaces to indent in `adaptive-wrap-prefix-mode'.
+
+`adaptive-wrap-prefix-mode' indents the visual lines to
+the level of the actual line plus `adaptive-wrap-extra-indent'.
+A negative value will do a relative de-indent.
+
+Examples:
+
+actual indent = 2
+extra indent = -1
+
+  Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
+ eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
+ enim ad minim veniam, quis nostrud exercitation ullamco laboris
+ nisi ut aliquip ex ea commodo consequat.
+
+actual indent = 2
+extra indent = 2
+
+  Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
+    eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
+    enim ad minim veniam, quis nostrud exercitation ullamco laboris
+    nisi ut aliquip ex ea commodo consequat."
+  :type 'integer
+  :group 'visual-line)
+(make-variable-buffer-local 'adaptive-wrap-extra-indent)
+
+(defun adaptive-wrap-fill-context-prefix (beg en)
+  "Like `fill-context-prefix', but with length adjusted by `adaptive-wrap-extra-indent'."
+  ;; Note: fill-context-prefix may return nil; See:
+  ;; http://article.gmane.org/gmane.emacs.devel/156285
+  (let* ((fcp (or (fill-context-prefix beg en) ""))
+         (fcp-len (string-width fcp))
+         (fill-char (if (< 0 fcp-len)
+                        (string-to-char (substring fcp -1))
+                      ?\ )))
+    (cond
+     ((= 0 adaptive-wrap-extra-indent)
+      fcp)
+     ((< 0 adaptive-wrap-extra-indent)
+      (concat fcp
+              (make-string adaptive-wrap-extra-indent fill-char)))
+     ((< 0 (+ adaptive-wrap-extra-indent fcp-len))
+      (substring fcp
+                 0
+                 (+ adaptive-wrap-extra-indent fcp-len)))
+     (t
+      ""))))
+
+(defun adaptive-wrap-prefix-function (beg end)
+  "Indent the region between BEG and END with adaptive filling."
+  (goto-char beg)
+  (while (< (point) end)
+    (let ((lbp (line-beginning-position)))
+      (put-text-property (point)
+                         (progn (search-forward "\n" end 'move) (point))
+                         'wrap-prefix
+                         (adaptive-wrap-fill-context-prefix lbp (point))))))
+
+;;;###autoload
+(define-minor-mode adaptive-wrap-prefix-mode
+  "Wrap the buffer text with adaptive filling."
+  :lighter ""
+  :group 'visual-line
+  (if adaptive-wrap-prefix-mode
+      (jit-lock-register #'adaptive-wrap-prefix-function)
+    (jit-lock-unregister #'adaptive-wrap-prefix-function)
+    (with-silent-modifications
+      (save-restriction
+        (widen)
+        (remove-text-properties (point-min) (point-max) '(wrap-prefix nil))))))
+
+(define-key-after (lookup-key menu-bar-options-menu [line-wrapping])
+  [adaptive-wrap]
+  '(menu-item "Adaptive Wrap" adaptive-wrap-prefix-mode
+             :visible (menu-bar-menu-frame-live-and-visible-p)
+             :help "Show wrapped long lines with an adjustable prefix"
+             :button (:toggle . (bound-and-true-p adaptive-wrap-prefix-mode)))
+  word-wrap)
+
+(provide 'adaptive-wrap)
+;;; adaptive-wrap.el ends here
diff --git a/packages/all/all.el b/packages/all/all.el
new file mode 100644 (file)
index 0000000..845b85a
--- /dev/null
@@ -0,0 +1,203 @@
+;;; all.el --- Edit all lines matching a given regexp
+
+;; Copyright (C) 1985-1987,1992,1994,2011-2012 Free Software Foundation, Inc.
+
+;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
+;; Version: 1.0
+;; Keywords: matching
+
+;; LCD Archive Entry:
+;; all|Per Abrahamsen|abraham@dina.kvl.dk|
+;; Edit all lines matching a given regexp|
+;; $Date: 1997/03/04 10:29:42 $|$Revision: 5.2 $|~/misc/all.Z|
+
+;; 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, 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Just like occur, except that changes in the *All* buffer are
+;; propagated to the original buffer.
+
+;; You can no longer use mouse-2 to find a match in the original file,
+;; since the default definition of mouse is too useful.
+;; However, `C-c C-c' still works.
+
+;; Line numbers are not listed in the *All* buffer.
+
+;; Ok, it is _not_ just like occur.
+
+;; Some limitations:
+
+;; - Undo in the *All* buffer is an ordinary change in the original.
+;; - Changes to the original buffer are not reflected in the *All* buffer.
+;; - A single change in the *All* buffer must be limited to a single match.
+
+;;; Code: 
+
+(defvar all-mode-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map "\C-c\C-c" 'all-mode-goto)
+    map))
+
+(defvar all-buffer nil)
+(make-variable-buffer-local 'all-buffer)
+
+(define-derived-mode all-mode fundamental-mode "All"
+  "Major mode for output from \\[all].
+
+All changes made in this buffer will be propagated to the buffer where
+you ran \\[all].
+
+Press \\[all-mode-goto] to go to the same spot in the original buffer."
+  (add-hook 'before-change-functions 'all-before-change-function nil 'local)
+  (add-hook 'after-change-functions 'all-after-change-function nil 'local))
+
+(defun all-mode-find (pos)
+  ;; Find position in original buffer corresponding to POS.
+  (let ((overlay (all-mode-find-overlay pos)))
+    (if overlay
+       (+ (marker-position (overlay-get overlay 'all-marker))
+          (- pos (overlay-start overlay))))))
+
+(defun all-mode-find-overlay (pos)
+  ;; Find the overlay containing POS.
+  (let ((overlays (overlays-at pos)))
+    (while (and overlays (null (overlay-get (car overlays) 'all-marker)))
+      (setq overlays (cdr overlays)))
+    (car-safe overlays)))
+
+(defun all-mode-goto ()
+  "Move point to the corresponding position in the original buffer."
+  (interactive)
+  (let ((pos (all-mode-find (point))))
+    (if pos
+       (pop-to-buffer all-buffer)
+      (error "This text is not from the original buffer"))
+    (goto-char pos)))
+
+(defvar all-initialization-p nil)
+
+(defun all-before-change-function (from to)
+  ;; Check that change is legal.
+  (and all-buffer
+       (not all-initialization-p)
+       (let ((start (all-mode-find-overlay from))
+            (end (all-mode-find-overlay to)))
+        (not (and start (eq start end))))
+       (error "Changes should be limited to a single text piece")))
+
+(defun all-after-change-function (from to length)
+  ;; Propagate changes from *All* buffer.
+  (and all-buffer
+       (null all-initialization-p)
+       (let ((buffer (current-buffer))
+            (pos (all-mode-find from)))
+        (if pos
+            (with-current-buffer all-buffer
+              (save-excursion
+                (goto-char pos)
+                 (delete-region pos (+ pos length))
+                (insert-buffer-substring buffer from to)))))))
+
+;;;###autoload
+(defun all (regexp &optional nlines)
+  "Show all lines in the current buffer containing a match for REGEXP.
+
+If a match spreads across multiple lines, all those lines are shown.
+
+Each line is displayed with NLINES lines before and after, or -NLINES
+before if NLINES is negative.
+NLINES defaults to `list-matching-lines-default-context-lines'.
+Interactively it is the prefix arg.
+
+The lines are shown in a buffer named `*All*'.
+Any changes made in that buffer will be propagated to this buffer."
+  (interactive
+   (list (let* ((default (car regexp-history)))
+           (read-string
+            (if default
+                (format 
+                 "Edit lines matching regexp (default `%s'): " default)
+              "Edit lines matching regexp: ")
+            nil 'regexp-history default))
+         current-prefix-arg))
+  (setq nlines (if nlines (prefix-numeric-value nlines)
+                list-matching-lines-default-context-lines))
+  (let ((all-initialization-p t)
+        (buffer (current-buffer))
+       (prevend nil)
+       (prevstart nil)
+       (prevpos (point-min)))
+    (with-output-to-temp-buffer "*All*"
+      (with-current-buffer standard-output
+       (all-mode)
+       (setq all-buffer buffer)
+       (insert "Lines matching ")
+       (prin1 regexp)
+       (insert " in buffer " (buffer-name buffer) ?. ?\n)
+       (insert "--------\n"))
+      (if (eq buffer standard-output)
+         (goto-char (point-max)))
+      (save-excursion
+       (goto-char (point-min))
+       ;; Find next match, but give up if prev match was at end of buffer.
+       (while (and (not (= prevpos (point-max)))
+                   (re-search-forward regexp nil t))
+         (goto-char (match-beginning 0))
+         (beginning-of-line)
+         (setq prevpos (point))
+         (goto-char (match-end 0))
+         (let* ((start (save-excursion
+                         (goto-char (match-beginning 0))
+                         (forward-line (if (< nlines 0) nlines (- nlines)))
+                         (point)))
+                (end (save-excursion
+                       (goto-char (match-end 0))
+                       (if (> nlines 0)
+                           (forward-line (1+ nlines))
+                           (forward-line 1))
+                       (point))))
+           (cond ((null prevend)
+                  (setq prevstart start
+                       prevend end))
+                 ((> start prevend)
+                  (all-insert prevstart prevend regexp nlines)
+                  (setq prevstart start
+                        prevend end))
+                 (t
+                  (setq prevend end)))))
+       (if prevend
+           (all-insert prevstart prevend regexp nlines))))))
+
+(defun all-insert (start end regexp nlines)
+  ;; Insert match.
+  (let ((marker (copy-marker start))
+        (buffer (current-buffer)))
+    (with-current-buffer standard-output
+      (let ((from (point))
+            to)
+        (insert-buffer-substring buffer start end)
+        (setq to (point))
+        (overlay-put (make-overlay from to) 'all-marker marker)
+        (goto-char from)
+        (while (re-search-forward regexp to t)
+          (put-text-property (match-beginning 0) (match-end 0)
+                             'face 'match))
+        (goto-char to)
+        (if (> nlines 0)
+            (insert "--------\n"))))))
+
+(provide 'all)
+
+;;; all.el ends here
diff --git a/packages/auctex/README b/packages/auctex/README
new file mode 100644 (file)
index 0000000..f04b9cf
--- /dev/null
@@ -0,0 +1,243 @@
+This is the README file for the AUCTeX distribution.
+
+     Copyright (C) 2008 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without
+     modification, are permitted in any medium without royalty provided
+     the copyright notice and this notice are preserved.
+
+Introduction to AUCTeX
+**********************
+
+This file gives a brief overview of what AUCTeX is.  It is *not* an
+attempt to document AUCTeX.  Real documentation for AUCTeX is available
+in the manual, which should be available as an info file after
+installation.
+
+AUCTeX is a comprehensive customizable integrated environment for
+writing input files for TeX, LaTeX, ConTeXt, Texinfo, and docTeX using
+Emacs or XEmacs.
+
+It supports you in the insertion of macros, environments, and sectioning
+commands by providing completion alternatives and prompting for
+parameters.  It automatically indents your text as you type it and lets
+you format a whole file at once.  The outlining and folding facilities
+provide you with a focused and clean view of your text.
+
+AUCTeX lets you process your source files by running TeX and related
+tools (such as output filters, post processors for generating indices
+and bibliographies, and viewers) from inside Emacs.  AUCTeX lets you
+browse through the errors TeX reported, while it moves the cursor
+directly to the reported error, and displays some documentation for
+that particular error.  This will even work when the document is spread
+over several files.
+
+One component of AUCTeX that LaTeX users will find attractive is
+preview-latex, a combination of folding and in-source previewing that
+provides true "What You See Is What You Get" experience in your
+sourcebuffer, while letting you retain full control.  For more
+information, see further below.
+
+More detailed information about the features and usage of AUCTeX can be
+found in the AUCTeX manual.  You can access it from within Emacs by
+typing `C-h i d m auctex <RET>'.  If you prefer the standalone info
+reader, issue the command `info auctex' in a terminal.
+
+AUCTeX is written entirely in Emacs Lisp, and hence you can easily add
+new features for your own needs.  It is a GNU project and distributed
+under the `GNU General Public License Version 3'.
+
+The most recent version is always available at
+`http://ftp.gnu.org/pub/gnu/auctex/'.
+
+WWW users may want to check out the AUCTeX page at
+`http://www.gnu.org/software/auctex/'.
+
+For comprehensive information about how to install AUCTeX read the file
+`INSTALL' or `INSTALL.windows', respectively.
+
+If you are considering upgrading AUCTeX, the recent changes are
+described in the `CHANGES' file.
+
+If you want to discuss AUCTeX with other users or its developers, there
+are several mailing lists you can use.
+
+Send a mail with the subject "subscribe" to <auctex-request@gnu.org> in
+order to join the general discussion list for AUCTeX.  Articles should
+be sent to <auctex@gnu.org>.  In a similar way, you can subscribe to
+the <info-auctex@gnu.org> list for just getting important announcements
+about AUCTeX.  The list <bug-auctex@gnu.org> is for bug reports which
+you should usually file with the `M-x TeX-submit-bug-report <RET>'
+command.  If you want to address the developers of AUCTeX themselves
+with technical issues, they can be found on the discussion list
+<auctex-devel@gnu.org>.
+
+preview-latex in a nutshell
+***************************
+
+Does your neck hurt from turning between previewer windows and the
+source too often? This AUCTeX component will render your displayed
+LaTeX equations right into the editing window where they belong.
+
+The purpose of preview-latex is to embed LaTeX environments such as
+display math or figures into the source buffers and switch conveniently
+between source and image representation.
+
+1 What use is it?
+*****************
+
+WYSIWYG (what you see is what you get) sometimes is considered all the
+rage, sometimes frowned upon.  Do we really want it?  Wrong question.
+The right question is _what_ we want from it.  Except when finetuning
+the layout, we don't want to use printer fonts for on-screen text
+editing.  The low resolution and contrast of a computer screen render
+all but the coarsest printer fonts (those for low-quality newsprint)
+unappealing, and the margins and pagination of the print are not wanted
+on the screen, either.  On the other hand, more complex visual
+compositions like math formulas and tables can't easily be taken in
+when seen only in the source.  preview-latex strikes a balance: it only
+uses graphic renditions of the output for certain, configurable
+constructs, does this only when told, and then right in the source code.
+Switching back and forth between the source and preview is easy and
+natural and can be done for each image independently.  Behind the scenes
+of preview-latex, a sophisticated framework of other programs like
+`dvipng', Dvips and Ghostscript are employed together with a special
+LaTeX style file for extracting the material of interest in the
+background and providing fast interactive response.
+
+2 Activating preview-latex
+**************************
+
+After installation, the package may need to be activated (and remember
+to activate AUCTeX too).  In XEmacs, and in any prepackaged versions
+worth their salt, activation should be automatic upon installation.  If
+this seems not the case, complain to your installation provider.
+
+The usual activation (if it is not done automatically) would be
+
+     (load "preview-latex.el" nil t t)
+
+If you still don't get a "Preview" menu in LaTeX mode in spite of
+AUCTeX showing its "Command", your installation is broken.  One
+possible cause are duplicate Lisp files that might be detectable with
+`<M-x> list-load-path-shadows <RET>'.
+
+3 Getting started
+*****************
+
+Once activated, preview-latex and its documentation will be accessible
+via its menus (note that preview-latex requires AUCTeX to be loaded).
+When you have loaded a LaTeX document (a sample document `circ.tex' is
+included in the distribution, but most documents including math and/or
+figures should do), you can use its menu or `C-c C-p C-d' (for
+`Preview/Document').  Previews will now be generated for various
+objects in your document.  You can use the time to take a short look at
+the other menu entries and key bindings in the `Preview' menu.  You'll
+see the previewed objects change into a roadworks sign when
+preview-latex has determined just what it is going to preview.  Note
+that you can freely navigate the buffer while this is going on.  When
+the process is finished you will see the objects typeset in your buffer.
+
+It is a bad idea, however, to edit the buffer before the roadworks signs
+appear, since that is the moment when the correlation between the
+original text and the buffer locations gets established.  If the buffer
+changes before that point of time, the previews will not be placed where
+they belong. If you do want to change some obvious error you just
+spotted, we recommend you stop the background process by pressing `C-c
+C-k'.
+
+To see/edit the LaTeX code for a specific object, put the point (the
+cursor) on it and press `C-c C-p C-p' (for `Preview/at point').  It
+will also do to click with the middle mouse button on the preview.  Now
+you can edit the code, and generate a new preview by again pressing
+`C-c C-p C-p' (or by clicking with the middle mouse button on the icon
+before the edited text).
+
+If you are using the `desktop' package, previews will remain from one
+session to the next as long as you don't kill your buffer.  If you are
+using XEmacs, you will probably need to upgrade the package to the
+newest one; things are being fixed just as I am writing this.
+
+4 Basic modes of operation
+**************************
+
+preview-latex has a number of methods for generating its graphics.  Its
+default operation is equivalent to using the `LaTeX' command from
+AUCTeX.  If this happens to be a call of PDFLaTeX generating PDF output
+(you need at least AUCTeX 11.51 for this), then Ghostscript will be
+called directly on the resulting PDF file.  If a DVI file gets
+produced, first Dvips and then Ghostscript get called by default.
+
+The image type to be generated by Ghostscript can be configured with
+
+     M-x customize-variable RET preview-image-type RET
+
+The default is `png' (the most efficient image type).  A special
+setting is `dvipng' in case you have the `dvipng' program installed.
+In this case, `dvipng' will be used for converting DVI files and
+Ghostscript (with a `PNG' device) for converting PDF files.  `dvipng'
+is much faster than the combination of Dvips and Ghostscript.  You can
+get downloads, access to its CVS archive and further information from
+its project site (http://savannah.nongnu.org/projects/dvipng).
+
+5 More documentation
+********************
+
+After the installation, documentation in the form of an info manual
+will be available.  You can access it with the standalone info reader
+with
+
+     info preview-latex
+
+or by pressing `C-h i d m preview-latex <RET>' in Emacs.  Once
+preview-latex is activated, you can instead use `C-c C-p <TAB>' (or the
+menu entry `Preview/Read documentation').
+
+Depending on your installation, a printable manual may also be
+available in the form of `preview-latex.dvi' or `preview-latex.ps'.
+
+Detailed documentation for the LaTeX style used for extracting the
+preview images is placed in `preview.dvi' in a suitable directory
+during installation; on typical teTeX-based systems,
+
+     texdoc preview
+
+will display it.
+
+6 Availability
+**************
+
+The preview-latex project is now part of AUCTeX and accessible as part
+of the AUCTeX project page (http://savannah.gnu.org/projects/auctex).
+You can get its files from the AUCTeX download area
+(ftp://ftp.gnu.org/pub/gnu/auctex).  As of AUCTeX 11.81, preview-latex
+should already be integrated into AUCTeX, so no separate download will
+be necessary.
+
+You will also find `.rpm' files there for Fedora and possibly SuSE.
+Anonymous CVS is available as well.
+
+7 Contacts
+**********
+
+Bug reports should be sent by using `M-x preview-report-bug <RET>', as
+this will fill in a lot of information interesting to us.  If the
+installation fails (but this should be a rare event), report bugs to
+<bug-auctex@gnu.org>.
+
+There is a general discussion list for AUCTeX which also covers
+preview-latex, look at `http://lists.gnu.org/mailman/listinfo/auctex'.
+For more information on the mailing list, send a message with just the
+word "help" as subject or body to <auctex-request@gnu.org>.  For the
+developers, there is the <auctex-devel@gnu.org> list; it would probably
+make sense to direct feature requests and questions about internal
+details there.  There is a low-volume read-only announcement list
+available to which you can subscribe by sending a mail with "subscribe"
+in the subject to <info-auctex-request@gnu.org>.
+
+Offers to support further development will be appreciated.  If you want
+to show your appreciation with a donation to the main developer, you can
+do so via PayPal to <dak@gnu.org>, and of course you can arrange for
+service contracts or for added functionality.  Take a look at the
+`TODO' list for suggestions in that area.
+
diff --git a/packages/auctex/auctex-pkg.el b/packages/auctex/auctex-pkg.el
new file mode 100644 (file)
index 0000000..6b3dca3
--- /dev/null
@@ -0,0 +1 @@
+(define-package "auctex" "11.86.1" "Integrated environment for *TeX*" nil :url "http://www.gnu.org/software/auctex/")
diff --git a/packages/auctex/auctex.info b/packages/auctex/auctex.info
new file mode 100644 (file)
index 0000000..fde0099
--- /dev/null
@@ -0,0 +1,119 @@
+This is auctex.info, produced by makeinfo version 4.13 from auctex.texi.
+
+This manual is for AUCTeX (version 11.86 from 2010-02-21), a
+sophisticated TeX environment for Emacs.
+
+   Copyright (C) 1992, 1993, 1994, 1995, 2001, 2002, 2004, 2005, 2006,
+2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+
+     Permission is granted to copy, distribute and/or modify this
+     document under the terms of the GNU Free Documentation License,
+     Version 1.3 or any later version published by the Free Software
+     Foundation; with no Invariant Sections, no Front-Cover Texts and
+     no Back-Cover Texts.  A copy of the license is included in the
+     section entitled "GNU Free Documentation License."
+
+INFO-DIR-SECTION Emacs
+START-INFO-DIR-ENTRY
+* AUCTeX: (auctex).     A sophisticated TeX environment for Emacs.
+END-INFO-DIR-ENTRY
+INFO-DIR-SECTION TeX
+START-INFO-DIR-ENTRY
+* AUCTeX: (auctex).     A sophisticated TeX environment for Emacs.
+END-INFO-DIR-ENTRY
+
+\1f
+Indirect:
+auctex.info-1: 961
+auctex.info-2: 291546
+\1f
+Tag Table:
+(Indirect)
+Node: Top\7f961
+Node: Copying\7f6965
+Node: Introduction\7f8921
+Node: Summary\7f9191
+Node: Installation\7f11935
+Node: Prerequisites\7f12901
+Node: Configure\7f15930
+Node: Build/install\7f21352
+Node: Loading the package\7f21843
+Node: Advice for package providers\7f23650
+Node: Advice for non-privileged users\7f27598
+Node: Installation under MS Windows\7f31555
+Node: Customizing\7f46789
+Node: Quick Start\7f48372
+Ref: Quick Start-Footnote-1\7f50165
+Node: Editing Facilities\7f50312
+Node: Processing Facilities\7f55108
+Node: Editing\7f59002
+Node: Quotes\7f60237
+Node: Font Specifiers\7f63978
+Node: Sectioning\7f65804
+Node: Environments\7f70118
+Node: Equations\7f72484
+Node: Floats\7f73075
+Node: Itemize-like\7f74614
+Node: Tabular-like\7f75156
+Node: Customizing Environments\7f75785
+Node: Mathematics\7f76025
+Node: Completion\7f78952
+Node: Commenting\7f83017
+Node: Indenting\7f84345
+Node: Filling\7f90138
+Node: Display\7f95459
+Node: Font Locking\7f96772
+Node: Fontification of macros\7f98847
+Node: Fontification of quotes\7f108294
+Node: Fontification of math\7f109789
+Node: Verbatim content\7f111509
+Node: Faces\7f112283
+Node: Known problems\7f112772
+Node: Folding\7f113700
+Node: Outline\7f124133
+Node: Processing\7f125387
+Node: Commands\7f126550
+Node: Starting a Command\7f127106
+Node: Selecting a Command\7f130849
+Node: Processor Options\7f133731
+Node: Viewing\7f139415
+Node: Starting Viewers\7f139789
+Node: I/O Correlation\7f145957
+Node: Debugging\7f148330
+Node: Checking\7f149844
+Node: Control\7f151148
+Node: Cleaning\7f151877
+Node: Documentation\7f153090
+Node: Customization\7f153870
+Node: Modes and Hooks\7f154363
+Node: Multifile\7f155571
+Node: Parsing Files\7f160282
+Node: Internationalization\7f164687
+Node: European\7f165868
+Node: Japanese\7f172689
+Node: Automatic\7f174386
+Node: Automatic Global\7f176910
+Node: Automatic Private\7f178071
+Node: Automatic Local\7f179384
+Node: Style Files\7f180471
+Node: Simple Style\7f181264
+Node: Adding Macros\7f182355
+Node: Adding Environments\7f187859
+Node: Adding Other\7f192128
+Node: Hacking the Parser\7f192715
+Node: Appendices\7f196588
+Node: Copying this Manual\7f196839
+Node: GNU Free Documentation License\7f197762
+Node: Changes\7f222900
+Node: Development\7f246154
+Node: Mid-term Goals\7f246800
+Node: Wishlist\7f248362
+Node: Bugs\7f255300
+Node: FAQ\7f256695
+Node: Indices\7f262843
+Node: Key Index\7f263006
+Node: Function Index\7f268016
+Node: Variable Index\7f275687
+Node: Concept Index\7f291546
+\1f
+End Tag Table
diff --git a/packages/auctex/auctex.info-1 b/packages/auctex/auctex.info-1
new file mode 100644 (file)
index 0000000..478d5bd
--- /dev/null
@@ -0,0 +1,6658 @@
+This is auctex.info, produced by makeinfo version 4.13 from auctex.texi.
+
+This manual is for AUCTeX (version 11.86 from 2010-02-21), a
+sophisticated TeX environment for Emacs.
+
+   Copyright (C) 1992, 1993, 1994, 1995, 2001, 2002, 2004, 2005, 2006,
+2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+
+     Permission is granted to copy, distribute and/or modify this
+     document under the terms of the GNU Free Documentation License,
+     Version 1.3 or any later version published by the Free Software
+     Foundation; with no Invariant Sections, no Front-Cover Texts and
+     no Back-Cover Texts.  A copy of the license is included in the
+     section entitled "GNU Free Documentation License."
+
+INFO-DIR-SECTION Emacs
+START-INFO-DIR-ENTRY
+* AUCTeX: (auctex).     A sophisticated TeX environment for Emacs.
+END-INFO-DIR-ENTRY
+INFO-DIR-SECTION TeX
+START-INFO-DIR-ENTRY
+* AUCTeX: (auctex).     A sophisticated TeX environment for Emacs.
+END-INFO-DIR-ENTRY
+
+\1f
+File: auctex.info,  Node: Top,  Next: Copying,  Up: (dir)
+
+AUCTeX
+******
+
+This manual may be copied under the conditions spelled out in *note
+Copying this Manual::.
+
+   AUCTeX is an integrated environment for editing LaTeX, ConTeXt,
+docTeX, Texinfo, and TeX files.
+
+   Although AUCTeX contains a large number of features, there are no
+reasons to despair.  You can continue to write TeX and LaTeX documents
+the way you are used to, and only start using the multiple features in
+small steps.  AUCTeX is not monolithic, each feature described in this
+manual is useful by itself, but together they provide an environment
+where you will make very few LaTeX errors, and makes it easy to find
+the errors that may slip through anyway.
+
+   It is a good idea to make a printout of AUCTeX's reference card
+`tex-ref.tex' or one of its typeset versions.
+
+   If you want to make AUCTeX aware of style files and multi-file
+documents right away, insert the following in your `.emacs' file.
+
+     (setq TeX-auto-save t)
+     (setq TeX-parse-self t)
+     (setq-default TeX-master nil)
+
+   Another thing you should enable is RefTeX, a comprehensive solution
+for managing cross references, bibliographies, indices, document
+navigation and a few other things.  (*note Installation:
+(reftex)Installation.)
+
+   For detailed information about the preview-latex subsystem of
+AUCTeX, see *note Introduction: (preview-latex)Top.
+
+   There is a mailing list for general discussion about AUCTeX: write a
+mail with "subscribe" in the subject to <auctex-request@gnu.org> to
+join it.  Send contributions to <auctex@gnu.org>.
+
+   Bug reports should go to <bug-auctex@gnu.org>, suggestions for new
+features, and pleas for help should go to either <auctex-devel@gnu.org>
+(the AUCTeX developers), or to <auctex@gnu.org> if they might have
+general interest.  Please use the command `M-x TeX-submit-bug-report
+RET' to report bugs if possible.  You can subscribe to a low-volume
+announcement list by sending "subscribe" in the subject of a mail to
+<info-auctex-request@gnu.org>.
+
+* Menu:
+
+* Copying::                     Copying
+* Introduction::                Introduction to AUCTeX
+* Editing::                     Editing the Document Source
+* Display::                     Controlling Screen Display
+* Processing::                  Starting Processors, Viewers and Other Programs
+* Customization::               Customization and Extension
+* Appendices::                  Copying, Changes, Development, FAQ
+* Indices::                     Indices
+
+ --- The Detailed Node Listing ---
+
+Introduction
+
+* Summary::                     Overview of AUCTeX
+* Installation::                Installing AUCTeX
+* Quick Start::                 Quick Start
+
+Editing the Document Source
+
+* Quotes::                      Inserting double quotes
+* Font Specifiers::             Inserting Font Specifiers
+* Sectioning::                  Inserting chapters, sections, etc.
+* Environments::                Inserting Environment Templates
+* Mathematics::                 Entering Mathematics
+* Completion::                  Completion of macros
+* Commenting::                  Commenting text
+* Indenting::                   Reflecting syntactic constructs with whitespace
+* Filling::                     Automatic and manual line breaking
+
+Inserting Environment Templates
+
+* Equations::                   Equations
+* Floats::                      Floats
+* Itemize-like::                Itemize-like Environments
+* Tabular-like::                Tabular-like Environments
+* Customizing Environments::    Customizing Environments
+
+Controlling Screen Display
+
+* Font Locking::                Font Locking
+* Folding::                     Folding Macros and Environments
+* Outline::                     Outlining the Document
+
+Font Locking
+
+* Fontification of macros::     Fontification of macros
+* Fontification of quotes::     Fontification of quotes
+* Fontification of math::       Fontification of math constructs
+* Verbatim content::            Verbatim macros and environments
+* Faces::                       Faces used by font-latex
+
+Starting Processors, Viewers and Other Programs
+
+* Commands::                    Invoking external commands.
+* Viewing::                     Invoking external viewers.
+* Debugging::                   Debugging TeX and LaTeX output.
+* Checking::                    Checking the document.
+* Control::                     Controlling the processes.
+* Cleaning::                    Cleaning intermediate and output files.
+* Documentation::               Documentation about macros and packages.
+
+Viewing the Formatted Output
+
+* Starting Viewers::            Starting viewers
+* I/O Correlation::             Forward and inverse search
+
+Customization and Extension
+
+* Multifile::                   Multifile Documents
+* Parsing Files::               Automatic Parsing of TeX Files
+* Internationalization::        Language Support
+* Automatic::                   Automatic Customization
+* Style Files::                 Writing Your Own Style Support
+
+Language Support
+
+* European::                    Using AUCTeX with European Languages
+* Japanese::                    Using AUCTeX with Japanese
+
+Automatic Customization
+
+* Automatic Global::            Automatic Customization for the Site
+* Automatic Private::           Automatic Customization for a User
+* Automatic Local::             Automatic Customization for a Directory
+
+Writing Your Own Style Support
+
+* Simple Style::                A Simple Style File
+* Adding Macros::               Adding Support for Macros
+* Adding Environments::         Adding Support for Environments
+* Adding Other::                Adding Other Information
+* Hacking the Parser::          Automatic Extraction of New Things
+
+Copying, Changes, Development, FAQ
+
+* Copying this Manual::
+* Changes::
+* Development::
+* FAQ::
+
+Copying this Manual
+
+* GNU Free Documentation License:: License for copying this manual.
+
+Indices
+
+* Key Index::
+* Function Index::
+* Variable Index::
+* Concept Index::
+
+\1f
+File: auctex.info,  Node: Copying,  Next: Introduction,  Prev: Top,  Up: Top
+
+Copying
+*******
+
+AUCTeX primarily consists of Lisp files for Emacs (and XEmacs), but
+there are also installation scripts and files and TeX support files.
+All of those are "free"; this means that everyone is free to use them
+and free to redistribute them on a free basis.  The files of AUCTeX are
+not in the public domain; they are copyrighted and there are
+restrictions on their distribution, but these restrictions are designed
+to permit everything that a good cooperating citizen would want to do.
+What is not allowed is to try to prevent others from further sharing
+any version of these programs that they might get from you.
+
+   Specifically, we want to make sure that you have the right to give
+away copies of the files that constitute AUCTeX, that you receive source
+code or else can get it if you want it, that you can change these files
+or use pieces of them in new free programs, and that you know you can do
+these things.
+
+   To make sure that everyone has such rights, we have to forbid you to
+deprive anyone else of these rights.  For example, if you distribute
+copies of parts of AUCTeX, you must give the recipients all the rights
+that you have.  You must make sure that they, too, receive or can get
+the source code.  And you must tell them their rights.
+
+   Also, for our own protection, we must make certain that everyone
+finds out that there is no warranty for AUCTeX.  If any parts are
+modified by someone else and passed on, we want their recipients to
+know that what they have is not what we distributed, so that any
+problems introduced by others will not reflect on our reputation.
+
+   The precise conditions of the licenses for the files currently being
+distributed as part of AUCTeX are found in the General Public Licenses
+that accompany them.  This manual specifically is covered by the GNU
+Free Documentation License (*note Copying this Manual::).
+
+\1f
+File: auctex.info,  Node: Introduction,  Next: Editing,  Prev: Copying,  Up: Top
+
+1 Introduction
+**************
+
+* Menu:
+
+* Summary::                     Overview of AUCTeX
+* Installation::                Installing AUCTeX
+* Quick Start::                 Quick Start
+
+\1f
+File: auctex.info,  Node: Summary,  Next: Installation,  Up: Introduction
+
+1.1 Overview of AUCTeX
+======================
+
+   AUCTeX is a comprehensive customizable integrated environment for
+writing input files for TeX, LaTeX, ConTeXt, Texinfo, and docTeX using
+Emacs or XEmacs.
+
+   It supports you in the insertion of macros, environments, and
+sectioning commands by providing completion alternatives and prompting
+for parameters.  It automatically indents your text as you type it and
+lets you format a whole file at once.  The outlining and folding
+facilities provide you with a focused and clean view of your text.
+
+   AUCTeX lets you process your source files by running TeX and related
+tools (such as output filters, post processors for generating indices
+and bibliographies, and viewers) from inside Emacs.  AUCTeX lets you
+browse through the errors TeX reported, while it moves the cursor
+directly to the reported error, and displays some documentation for
+that particular error.  This will even work when the document is spread
+over several files.
+
+   One component of AUCTeX that LaTeX users will find attractive is
+preview-latex, a combination of folding and in-source previewing that
+provides true "What You See Is What You Get" experience in your
+sourcebuffer, while letting you retain full control.
+
+   More detailed information about the features and usage of AUCTeX can
+be found in the remainder of this manual.
+
+   AUCTeX is written entirely in Emacs Lisp, and hence you can easily
+add new features for your own needs.  It is a GNU project and
+distributed under the `GNU General Public License Version 3'.
+
+   The most recent version is always available at
+`http://ftp.gnu.org/pub/gnu/auctex/'.
+
+   WWW users may want to check out the AUCTeX page at
+`http://www.gnu.org/software/auctex/'.
+
+   For comprehensive information about how to install AUCTeX *Note
+Installation::, or *note Installation under MS Windows::, respectively.
+
+   If you are considering upgrading AUCTeX, the recent changes are
+described in *note Changes::.
+
+   If you want to discuss AUCTeX with other users or its developers,
+there are several mailing lists you can use.
+
+   Send a mail with the subject "subscribe" to <auctex-request@gnu.org>
+in order to join the general discussion list for AUCTeX.  Articles
+should be sent to <auctex@gnu.org>.  In a similar way, you can
+subscribe to the <info-auctex@gnu.org> list for just getting important
+announcements about AUCTeX.  The list <bug-auctex@gnu.org> is for bug
+reports which you should usually file with the `M-x
+TeX-submit-bug-report <RET>' command.  If you want to address the
+developers of AUCTeX themselves with technical issues, they can be
+found on the discussion list <auctex-devel@gnu.org>.
+
+\1f
+File: auctex.info,  Node: Installation,  Next: Quick Start,  Prev: Summary,  Up: Introduction
+
+1.2 Installing AUCTeX
+=====================
+
+   Installing AUCTeX should be simple: merely `./configure', `make',
+and `make install' for a standard site-wide installation (most other
+installations can be done by specifying a `--prefix=...' option).
+
+   On many systems, this will already activate the package, making its
+modes the default instead of the built-in modes of Emacs.  If this is
+not the case, consult *note Loading the package::.  Please read through
+this document fully before installing anything.  The installation
+procedure has changed as compared to earlier versions.  Users of
+MS Windows are asked to consult *Note Installation under MS Windows::.
+
+* Menu:
+
+* Prerequisites::
+* Configure::
+* Build/install::
+* Loading the package::
+* Advice for package providers::
+* Advice for non-privileged users::
+* Installation under MS Windows::
+* Customizing::
+
+\1f
+File: auctex.info,  Node: Prerequisites,  Next: Configure,  Up: Installation
+
+1.2.1 Prerequisites
+-------------------
+
+   * A recent version of Emacs, alternatively XEmacs
+
+     Emacs 20 is no longer supported, and neither is XEmacs with a
+     version of `xemacs-base' older than 1.84 (released in sumo from
+     02/02/2004).  Using preview-latex requires a version of Emacs
+     compiled with image support.  While the X11 version of Emacs 21
+     will likely work, Emacs 22 and later is the preferred platform.
+
+    Windows
+          Precompiled versions are available from
+          `ftp://ftp.gnu.org/gnu/emacs/windows/'.
+
+    Mac OS X
+          For an overview of precompiled versions of Emacs for Mac OS X
+          see for example
+          `http://www.emacswiki.org/cgi-bin/wiki/EmacsForMacOS'.
+
+    GNU/Linux
+          Most GNU/Linux distributions nowadays provide a variant of
+          Emacs 22 or later via their package repositories.
+
+    Self-compiled
+          Compiling Emacs yourself requires a C compiler and a number
+          of tools and development libraries.  Details are beyond the
+          scope of this manual.  Instructions for checking out the
+          source code can be found at
+          `https://savannah.gnu.org/bzr/?group=emacs'.
+
+     If you really need to use Emacs 21 on platforms where this implies
+     missing image support, you should disable the installation of
+     preview-latex (see below).
+
+     While XEmacs (version 21.4.15, 21.4.17 or later) is supported,
+     doing this in a satisfactory manner has proven to be difficult.
+     This is mostly due to technical shortcomings and differing API's
+     which are hard to come by.  If AUCTeX is your main application for
+     XEmacs, you are likely to get better results and support by
+     switching to Emacs.  Of course, you can improve support for your
+     favorite editor by giving feedback in case you encounter bugs.
+
+   * A working TeX installation
+
+     Well, AUCTeX would be pointless without that.  Processing
+     documentation requires TeX, LaTeX and Texinfo during installation.
+     preview-latex requires Dvips for its operation in DVI mode.  The
+     default configuration of AUCTeX is tailored for teTeX or
+     TeXlive-based distributions, but can be adapted easily.
+
+   * A recent Ghostscript
+
+     This is needed for operation of preview-latex in both DVI and PDF
+     mode.  Most versions of Ghostscript nowadays in use should work
+     fine (version 7.0 and newer).  If you encounter problems, check
+     *note Problems with Ghostscript: (preview-latex)Problems with
+     Ghostscript.
+
+   * The `texinfo' package
+
+     Strictly speaking, you can get away without it if you are building
+     from the distribution tarball, have not modified any files and
+     don't need a printed version of the manual: the pregenerated info
+     file is included in the tarball.  At least version 4.0 is required.
+
+
+   For some known issues with various software, see *note Known
+problems: (preview-latex)Known problems.
+
+\1f
+File: auctex.info,  Node: Configure,  Next: Build/install,  Prev: Prerequisites,  Up: Installation
+
+1.2.2 Configure
+---------------
+
+The first step is to configure the source code, telling it where
+various files will be.  To do so, run
+
+     ./configure OPTIONS
+
+   (Note: if you have fetched AUCTeX from CVS rather than a regular
+release, you will have to first follow the instructions in
+`README.CVS').
+
+   On many machines, you will not need to specify any options, but if
+`configure' cannot determine something on its own, you'll need to help
+it out with one of these options:
+
+`--prefix=`/usr/local''
+     All automatic placements for package components will be chosen from
+     sensible existing hierarchies below this: directories like `man',
+     `share' and `bin' are supposed to be directly below PREFIX.
+
+     Only if no workable placement can be found there, in some cases an
+     alternative search will be made in a prefix deduced from a suitable
+     binary.
+
+     `/usr/local' is the default PREFIX, intended to be suitable for a
+     site-wide installation.  If you are packaging this as an operating
+     system component for distribution, the setting `/usr' will
+     probably be the right choice.  If you are planning to install the
+     package as a single non-priviledged user, you will typically set
+     PREFIX to your home directory.
+
+`--with-emacs[=/PATH/TO/EMACS]'
+     If you are using a pretest which isn't in your `$PATH', or
+     `configure' is not finding the right Emacs executable, you can
+     specify it with this option.
+
+`--with-xemacs[=/PATH/TO/XEMACS]'
+     Configure for generation under XEmacs (Emacs is the default).
+     Again, the name of the right XEmacs executable can be specified,
+     complete with path if necessary.
+
+`--with-packagedir=/DIR'
+     This XEmacs-only option configures the directory for XEmacs
+     packages.  A typical user-local setting would be
+     `~/.xemacs/xemacs-packages'.  If this directory exists and is
+     below PREFIX, it should be detected automatically.  This will
+     install and activate the package.
+
+`--without-packagedir'
+     This XEmacs-only option switches the detection of a package
+     directory and corresponding installation off.  Consequently, the
+     Emacs installation scheme will be used.  This might be appropriate
+     if you are using a different package system/installer than the
+     XEmacs one and want to avoid conflicts.
+
+     The Emacs installation scheme has the following options:
+
+`--with-lispdir=/DIR'
+     This Emacs-only option specifies the location of the `site-lisp'
+     directory within `load-path' under which the files will get
+     installed (the bulk will get installed in a subdirectory).
+     `./configure' should figure this out by itself.
+
+`--with-auctexstartfile=`auctex.el''
+`--with-previewstartfile=`preview-latex.el''
+     This is the name of the respective startup files.  If LISPDIR
+     contains a subdirectory `site-start.d', the start files are placed
+     there, and `site-start.el' should load them automatically.  Please
+     be aware that you must not move the start files after installation
+     since other files are found _relative_ to them.
+
+`--with-packagelispdir=`auctex''
+     This is the directory where the bulk of the package gets located.
+     The startfile adds this into LOAD-PATH.
+
+`--with-auto-dir=/DIR'
+     You can use this option to specify the directory containing
+     automatically generated information.  It is not necessary for most
+     TeX installs, but may be used if you don't like the directory that
+     configure is suggesting.
+
+`--help'
+     This is not an option specific to AUCTeX. A number of standard
+     options to `configure' exist, and we do not have the room to
+     describe them here; a short description of each is available, using
+     `--help'.  If you use `--help=recursive', then also
+     preview-latex-specific options will get listed.
+
+`--disable-preview'
+     This disables configuration and installation of preview-latex.
+     This option is not actually recommended.  If your Emacs does not
+     support images, you should really upgrade to a newer version.
+     Distributors should, if possible, refrain from distributing AUCTeX
+     and preview-latex separately in order to avoid confusion and
+     upgrade hassles if users install partial packages on their own.
+
+`--with-texmf-dir=/DIR
+     --without-texmf-dir'
+     This option is used for specifying a TDS-compliant directory
+     hierarchy.  Using `--with-texmf-dir=/DIR' you can specify where
+     the TeX TDS directory hierarchy resides, and the TeX files will
+     get installed in `/DIR/tex/latex/preview/'.
+
+     If you use the `--without-texmf-dir' option, the TeX-related files
+     will be kept in the Emacs Lisp tree, and at runtime the
+     `TEXINPUTS' environment variable will be made to point there.  You
+     can install those files into your own TeX tree at some later time
+     with `M-x preview-install-styles RET'.
+
+`--with-tex-dir=/DIR'
+     If you want to specify an exact directory for the preview TeX
+     files, use `--with-tex-dir=/DIR'. In this case, the files will be
+     placed in `/DIR', and you'll also need the following option:
+
+`--with-doc-dir=/DIR'
+     This option may be used to specify where the TeX documentation
+     goes.  It is to be used when you are using `--with-tex-dir=/DIR',
+     but is normally not necessary otherwise.
+
+\1f
+File: auctex.info,  Node: Build/install,  Next: Loading the package,  Prev: Configure,  Up: Installation
+
+1.2.3 Build/install
+-------------------
+
+Once `configure' has been run, simply enter
+
+     make
+
+at the prompt to byte-compile the lisp files, extract the TeX files and
+build the documentation files.  To install the files into the locations
+chosen earlier, type
+
+     make install
+
+   You may need special privileges to install, e.g., if you are
+installing into system directories.
+
+\1f
+File: auctex.info,  Node: Loading the package,  Next: Advice for package providers,  Prev: Build/install,  Up: Installation
+
+1.2.4 Loading the package
+-------------------------
+
+You can detect the successful activation of AUCTeX and preview-latex in
+the menus after loading a LaTeX file like `preview/circ.tex': AUCTeX
+then gives you a `Command' menu, and preview-latex gives you a
+`Preview' menu.
+
+   For XEmacs, if the installation occured into a valid package
+directory (which is the default), then this should work out of the box.
+
+   With Emacs (or if you explicitly disabled use of the package system),
+the startup files `auctex.el' and `preview-latex.el' may already be in
+a directory of the `site-start.d/' variety if your Emacs installation
+provides it.  In that case they should be automatically loaded on
+startup and nothing else needs to be done.  If not, they should at
+least have been placed somewhere in your `load-path'.  You can then
+load them by placing the lines
+
+     (load "auctex.el" nil t t)
+     (load "preview-latex.el" nil t t)
+
+   into your init file.
+
+   If you explicitly used `--with-lispdir', you may need to add the
+specified directory into Emacs' `load-path' variable by adding
+something like
+
+     (add-to-list 'load-path "~/elisp")
+
+   before the above lines into your Emacs startup file.
+
+   For site-wide activation in GNU Emacs, see *Note Advice for package
+providers::.
+
+   Once activated, the modes provided by AUCTeX are used per default for
+all supported file types.  If you want to change the modes for which it
+is operative instead of the default, use
+     M-x customize-variable <RET> TeX-modes <RET>
+
+   If you want to remove a preinstalled AUCTeX completely before any of
+its modes have been used,
+     (unload-feature 'tex-site)
+   should accomplish that.
+
+\1f
+File: auctex.info,  Node: Advice for package providers,  Next: Advice for non-privileged users,  Prev: Loading the package,  Up: Installation
+
+1.2.5 Providing AUCTeX as a package
+-----------------------------------
+
+As a package provider, you should make sure that your users will be
+served best according to their intentions, and keep in mind that a
+system might be used by more than one user, with different preferences.
+
+   There are people that prefer the built-in Emacs modes for editing
+TeX files, in particular plain TeX users.  There are various ways to
+tell AUCTeX even after auto-activation that it should not get used, and
+they are described in *note Introduction to AUCTeX: Introduction.
+
+   So if you have users that don't want to use the preinstalled AUCTeX,
+they can easily get rid of it.  Activating AUCTeX by default is
+therefore a good choice.
+
+   If the installation procedure did not achieve this already by placing
+`auctex.el' and `preview-latex.el' into a possibly existing
+`site-start.d' directory, you can do this by placing
+
+     (load "auctex.el" nil t t)
+     (load "preview-latex.el" nil t t)
+
+in the system-wide `site-start.el'.
+
+   If your package is intended as an XEmacs package or to accompany a
+precompiled version of Emacs, you might not know which TeX system will
+be available when preview-latex gets used.  In this case you should
+build using the `--without-texmf-dir' option described previously.
+This can also be convenient for systems that are intended to support
+more than a single TeX distribution.  Since more often than not TeX
+packages for operating system distributions are either much more
+outdated or much less complete than separately provided systems like
+TeX Live, this method may be generally preferable when providing
+packages.
+
+   The following package structure would be adequate for a typical fully
+supported Unix-like installation:
+
+`preview-tetex'
+     Style files and documentation for `preview.sty', placed into a TeX
+     tree where it is accessible from the teTeX executables usually
+     delivered with a system.  If there are other commonly used TeX
+     system packages, it might be appropriate to provide separate
+     packages for those.
+
+`auctex-emacs-tetex'
+     This package will require the installation of `preview-tetex' and
+     will record in `TeX-macro-global' where to find the TeX tree.  It
+     is also a good idea to run
+          emacs -batch -f TeX-auto-generate-global
+     when either AUCTeX or teTeX get installed or upgraded.  If your
+     users might want to work with a different TeX distribution
+     (nowadays pretty common), instead consider the following:
+
+`auctex-emacs'
+     This package will be compiled with `--without-texmf-dir' and will
+     consequently contain the `preview' style files in its private
+     directory.  It will probably not be possible to initialize
+     `TeX-macro-global' to a sensible value, so running
+     `TeX-auto-generate-global' does not appear useful.  This package
+     would neither conflict with nor provide `preview-tetex'.
+
+`auctex-xemacs-tetex'
+`auctex-xemacs'
+     Those are the obvious XEmacs equivalents.  For XEmacs, there is the
+     additional problem that the XEmacs sumo package tree already
+     possibly provides its own version of AUCTeX, and the user might
+     even have used the XEmacs package manager to updating this
+     package, or even installing a private AUCTeX version.  So you
+     should make sure that such a package will not conflict with
+     existing XEmacs packages and will be at an appropriate place in
+     the load order (after site-wide and user-specific locations, but
+     before a distribution-specific sumo package tree).  Using the
+     `--without-packagedir' option might be one idea to avoid
+     conflicts.  Another might be to refrain from providing an XEmacs
+     package and just rely on the user or system administrator to
+     instead use the XEmacs package system.
+
+\1f
+File: auctex.info,  Node: Advice for non-privileged users,  Next: Installation under MS Windows,  Prev: Advice for package providers,  Up: Installation
+
+1.2.6 Installation for non-privileged users
+-------------------------------------------
+
+Often people without system administration privileges want to install
+software for their private use.  In that case you need to pass more
+options to the `configure' script.  For XEmacs users, this is fairly
+easy, because the XEmacs package system has been designed to make this
+sort of thing practical: but GNU Emacs users (and XEmacs users for whom
+the package system is for some reason misbehaving) may need to do a
+little more work.
+
+   The main expedient is using the `--prefix' option to the `configure'
+script, and let it point to the personal home directory.  In that way,
+resulting binaries will be installed under the `bin' subdirectory of
+your home directory, manual pages under `man' and so on.  It is
+reasonably easy to maintain a bunch of personal software, since the
+prefix argument is supported by most `configure' scripts.
+
+   You'll have to add something like
+`/home/myself/share/emacs/site-lisp' to your `load-path' variable, if
+it isn't there already.
+
+   XEmacs users can achieve the same end by pointing `configure' at an
+appropriate package directory (normally
+`--with-packagedir=~/.xemacs/xemacs-packages' will serve).  The package
+directory stands a good chance at being detected automatically as long
+as it is in a subtree of the specified PREFIX.
+
+   Now here is another thing to ponder: perhaps you want to make it easy
+for other users to share parts of your personal Emacs configuration.  In
+general, you can do this by writing `~myself/' anywhere where you
+specify paths to something installed in your personal subdirectories,
+not merely `~/', since the latter, when used by other users, will point
+to non-existent files.
+
+   For yourself, it will do to manipulate environment variables in your
+`.profile' resp. `.login' files.  But if people will be copying just
+Elisp files, their copies will not work.  While it would in general be
+preferable if the added components where available from a shell level,
+too (like when you call the standalone info reader, or try using
+`preview.sty' for functionality besides of Emacs previews), it will be
+a big help already if things work from inside of Emacs.
+
+   Here is how to do the various parts:
+
+Making the Elisp available
+..........................
+
+In GNU Emacs, it should be sufficient if people just do
+
+     (load "~myself/share/emacs/site-lisp/auctex.el" nil t t)
+     (load "~myself/share/emacs/site-lisp/preview-latex.el" nil t t)
+
+   where the path points to your personal installation.  The rest of the
+package should be found relative from there without further ado.
+
+   In XEmacs, you should ask the other users to add symbolic links in
+the subdirectories `lisp', `info' and `etc' of their
+`~/.xemacs/xemacs-packages/' directory.  (Alas, there is presently no
+easy programmatic way to do this, except to have a script do the
+symlinking for them.)
+
+Making the Info files available
+...............................
+
+For making the info files accessible from within Elisp, something like
+the following might be convenient to add into your or other people's
+startup files:
+
+     (eval-after-load 'info
+        '(add-to-list 'Info-directory-list "~myself/info"))
+
+   In XEmacs, as long as XEmacs can see the package, there should be no
+need to do anything at all; the info files should be immediately
+visible.  However, you might want to set `INFOPATH' anyway, for the
+sake of standalone readers outside of XEmacs. (The info files in XEmacs
+are normally in `~/.xemacs/xemacs-packages/info'.)
+
+Making the LaTeX style available
+................................
+
+If you want others to be able to share your installation, you should
+configure it using `--without-texmf-dir', in which case things should
+work as well for them as for you.
+
+\1f
+File: auctex.info,  Node: Installation under MS Windows,  Next: Customizing,  Prev: Advice for non-privileged users,  Up: Installation
+
+1.2.7 Installation under MS Windows
+-----------------------------------
+
+In a Nutshell
+.............
+
+The following are brief installation instructions for the impatient.  In
+case you don't understand some of this, run into trouble of some sort,
+or need more elaborate information, refer to the detailed instructions
+further below.
+
+  1. Install the prerequisites, i.e. Emacs or XEmacs, MSYS or Cygwin, a
+     TeX system, and Ghostscript.
+
+  2. Open the MSYS shell or a Cygwin shell and change to the directory
+     containing the unzipped file contents.
+
+  3. Configure AUCTeX:
+
+     For Emacs: Many people like to install AUCTeX into the pseudo file
+     system hierarchy set up by the Emacs installation.  Assuming Emacs
+     is installed in `C:/Program Files/Emacs' and the directory for
+     local additions of your TeX system, e.g. MiKTeX, is
+     `C:/localtexmf', you can do this by typing the following statement
+     at the shell prompt:
+
+          ./configure --prefix='C:/Program Files/Emacs' \
+            --infodir='C:/Program Files/Emacs/info' \
+            --with-texmf-dir='C:/localtexmf'
+
+     For XEmacs: You can install AUCTeX as an XEmacs package.  Assuming
+     XEmacs is installed in `C:/Program Files/XEmacs' and the directory
+     for local additions of your TeX system, e.g. MiKTeX, is
+     `C:/localtexmf', you can do this by typing the following command at
+     the shell prompt:
+
+          ./configure --with-xemacs='C:/Program Files/XEmacs/bin/xemacs' \
+            --with-texmf-dir='C:/localtexmf'
+
+     The commands above are examples for common usage.  More on
+     configuration options can be found in the detailed installation
+     instructions below.
+
+     If the configuration script failed to find all required programs,
+     make sure that these programs are in your system path and add
+     directories containing the programs to the `PATH' environment
+     variable if necessary.  Here is how to do that in W2000/XP:
+
+       1. On the desktop, right click "My Computer" and select
+          properties.
+
+       2. Click on "Advanced" in the "System Properties" window.
+
+       3. Select "Environment Variables".
+
+       4. Select "path" in "System Variables" and click "edit".  Move
+          to the front in the line (this might require scrolling) and
+          add the missing path including drive letter, ended with a
+          semicolon.
+
+  4. If there were no further error messages, type
+
+          make
+
+     In case there were, please refer to the detailed description below.
+
+  5. Finish the installation by typing
+
+          make install
+
+Detailed Installation Instructions
+..................................
+
+Installation of AUCTeX under Windows is in itself not more complicated
+than on other platforms.  However, meeting the prerequisites might
+require more work than on some other platforms, and feel less natural.
+
+   If you are experiencing any problems, even if you think they are of
+your own making, be sure to report them to <auctex-devel@gnu.org> so
+that we can explain things better in future.
+
+   Windows is a problematic platform for installation scripts.  The main
+problem is that the installation procedure requires consistent file
+names in order to find its way in the directory hierarchy, and Windows
+path names are a mess.
+
+   The installation procedure tries finding stuff in system search paths
+and in Emacs paths.  For that to succeed, you have to use the same
+syntax and spelling and case of paths everywhere: in your system search
+paths, in Emacs' `load-path' variable, as argument to the scripts.  If
+your path names contain spaces or other `shell-unfriendly' characters,
+most notably backslashes for directory separators, place the whole path
+in `"double quote marks"' whenever you specify it on a command line.
+
+   Avoid `helpful' magic file names like `/cygdrive/c' and
+`C:\PROGRA~1\' like the plague.  It is quite unlikely that the scripts
+will be able to identify the actual file names involved.  Use the full
+paths, making use of normal Windows drive letters like ` 'C:/Program
+Files/Emacs' ' where required, and using the same combination of upper-
+and lowercase letters as in the actual files.  File names containing
+shell-special characters like spaces or backslashes (if you prefer that
+syntax) need to get properly quoted to the shell: the above example
+used single quotes for that.
+
+   Ok, now here are the steps to perform:
+
+  1. You need to unpack the AUCTeX distribution (which you seemingly
+     have done since you are reading this).  It must be unpacked in a
+     separate installation directory outside of your Emacs file
+     hierarchy: the installation will later copy all necessary files to
+     their final destination, and you can ultimately remove the
+     directory where you unpacked the files.
+
+     Line endings are a problem under Windows.  The distribution
+     contains only text files, and theoretically most of the involved
+     tools should get along with that.  However, the files are
+     processed by various utilities, and it is conceivable that not all
+     of them will use the same line ending conventions.  If you
+     encounter problems, it might help if you try unpacking (or
+     checking out) the files in binary mode, if your tools allow that.
+
+     If you don't have a suitable unpacking tool, skip to the next
+     step: this should provide you with a working `unzip' command.
+
+  2. The installation of AUCTeX will require the MSYS tool set from
+     `http://www.mingw.org/' or the Cygwin tool set from
+     `http://cygwin.com/'.  The latter is slower and larger (the
+     download size of the base system is about 15 MB) but comes with a
+     package manager that allows for updating the tool set and
+     installing additional packages like, for example, the spell
+     checker aspell.
+
+     If Cygwin specific paths like `/cygdrive/c' crop up in the course
+     of the installation, using a non-Cygwin Emacs could conceivably
+     cause trouble.  Using Cygwin either for everything or nothing
+     might save headaches, _if_ things don't work out.
+
+  3. Install a current version of XEmacs from `http://www.xemacs.org/'
+     or Emacs from `ftp://ftp.gnu.org/gnu/emacs/windows/'.  Emacs is
+     the recommended choice because it is currently the primary
+     platform for AUCTeX development.
+
+  4. You need a working TeX installation.  One popular installation
+     under Windows is MiKTeX (http://www.miktex.org).  Another much more
+     extensive system is TeX Live (http://www.tug.org/texlive) which is
+     rather close to its Unix cousins.
+
+  5. A working copy of Ghostscript (http://www.cs.wisc.edu/~ghost/) is
+     required for preview-latex operation.  Examining the output from
+          gswin32c -h
+     on a Windows command line should tell you whether your Ghostscript
+     supports the `png16m' device needed for PNG support.  MiKTeX
+     apparently comes with its own Ghostscript called `mgs.exe'.
+
+  6. Perl (http://www.perl.org) is needed for rebuilding the
+     documentation if you are working with a copy from CVS or have
+     touched documentation source files in the preview-latex part.  If
+     the line endings of the file `preview/latex/preview.dtx' don't
+     correspond with what Perl calls `\n' when reading text files,
+     you'll run into trouble.
+
+  7. Now the fun stuff starts.  If you have not yet done so, unpack the
+     AUCTeX distribution into a separate directory after rereading the
+     instructions for unpacking above.
+
+  8. Ready for takeoff. Start some shell (typically `bash') capable of
+     running `configure', change into the installation directory and
+     call `./configure' with appropriate options.
+
+     Typical options you'll want to specify will be
+    `--prefix=DRIVE:/PATH/TO/EMACS-HIERARCHY'
+          which tells `configure' where to perform the installation. It
+          may also make `configure' find Emacs or XEmacs automatically;
+          if this doesn't happen, try one of `--with-emacs' or
+          `--with-xemacs' as described below.  All automatic detection
+          of files and directories restricts itself to directories
+          below the PREFIX or in the same hierarchy as the program
+          accessing the files.  Usually, directories like `man',
+          `share' and `bin' will be situated right under PREFIX.
+
+          This option also affects the defaults for placing the Texinfo
+          documentation files (see also `--infodir' below) and
+          automatically generated style hooks.
+
+          If you have a central directory hierarchy (not untypical with
+          Cygwin) for such stuff, you might want to specify its root
+          here.  You stand a good chance that this will be the only
+          option you need to supply, as long as your TeX-related
+          executables are in your system path, which they better be for
+          AUCTeX's operation, anyway.
+
+    `--with-emacs'
+          if you are installing for a version of Emacs.  You can use
+          `--with-emacs=DRIVE:/PATH/TO/EMACS' to specify the name of the
+          installed Emacs executable, complete with its path if
+          necessary (if Emacs is not within a directory specified in
+          your `PATH' environment setting).
+
+    `--with-xemacs'
+          if you are installing for a version of XEmacs.  Again, you
+          can use `--with-xemacs=DRIVE:/PATH/TO/XEMACS' to specify the
+          name of the installed XEmacs executable complete with its
+          path if necessary.  It may also be necessary to specify this
+          option if a copy of Emacs is found in your `PATH' environment
+          setting, but you still would like to install a copy of AUCTeX
+          for XEmacs.
+
+    `--with-packagedir=DRIVE:/DIR'
+          is an XEmacs-only option giving the location of the package
+          directory.  This will install and activate the package.
+          Emacs uses a different installation scheme:
+
+    `--with-lispdir=DRIVE:/PATH/TO/SITE-LISP'
+          This Emacs-only option tells a place in `load-path' below
+          which the files are situated.  The startup files `auctex.el'
+          and `preview-latex.el' will get installed here unless a
+          subdirectory `site-start.d' exists which will then be used
+          instead.  The other files from AUCTeX will be installed in a
+          subdirectory called `auctex'.
+
+          If you think that you need a different setup, please refer to
+          the full installation instructions in *note Configure::.
+
+    `--infodir=DRIVE:/PATH/TO/INFO/DIRECTORY'
+          If you are installing into an Emacs directory, info files
+          have to be put into the `info' folder below that directory.
+          The configuration script will usually try to install into the
+          folder `share/info', so you have to override this by
+          specifying something like `--infodir='C:/Program Files/info''
+          for the configure call.
+
+    `--with-auto-dir=DRIVE:/DIR'
+          Directory containing automatically generated information.
+          You should not normally need to set this, as `--prefix'
+          should take care of this.
+
+    `--disable-preview'
+          Use this option if your Emacs version is unable to support
+          image display.  This will be the case if you are using a
+          native variant of Emacs 21.
+
+    `--with-texmf-dir=DRIVE:/DIR'
+          This will specify the directory where your TeX installation
+          sits.  If your TeX installation does not conform to the TDS
+          (TeX directory standard), you may need to specify more
+          options to get everything in place.
+
+     For more information about any of the above and additional
+     options, see *note Configure::.
+
+     Calling `./configure --help=recursive' will tell about other
+     options, but those are almost never required.
+
+     Some executables might not be found in your path.  That is not a
+     good idea, but you can get around by specifying environment
+     variables to `configure':
+          GS="DRIVE:/PATH/TO/GSWIN32C.EXE" ./configure ...
+     should work for this purpose.  `gswin32c.exe' is the usual name for
+     the required _command line_ executable under Windows; in contrast,
+     `gswin32.exe' is likely to fail.
+
+     As an alternative to specifying variables for the `configure' call
+     you can add directories containing the required executables to the
+     `PATH' variable of your Windows system.  This is especially a good
+     idea if Emacs has trouble finding the respective programs later
+     during normal operation.
+
+  9. Run `make' in the installation directory.
+
+ 10. Run `make install' in the installation directory.
+
+ 11. With XEmacs, AUCTeX and preview-latex should now be active by
+     default.  With Emacs, activation depends on a working
+     `site-start.d' directory or similar setup, since then the startup
+     files `auctex.el' and `preview-latex.el' will have been placed
+     there.  If this has not been done, you should be able to load the
+     startup files manually with
+          (load "auctex.el" nil t t)
+          (load "preview-latex.el" nil t t)
+     in either a site-wide `site-start.el' or your personal startup file
+     (usually accessible as `~/.emacs' from within Emacs and
+     `~/.xemacs/init.el' from within XEmacs).
+
+     The default configuration of AUCTeX is probably not the best fit
+     for Windows systems.  You might want to add
+          (require 'tex-mik)
+     or
+          (require 'tex-fptex)
+     in order to get more appropriate values for MiKTeX and fpTeX,
+     respectively after loading `auctex.el' and `preview-latex.el'.
+
+     You can always use
+
+          M-x customize-group RET AUCTeX RET
+
+     in order to customize more stuff, or use the `Customize' menu.
+
+ 12. Load `preview/circ.tex' into Emacs or XEmacs and see if you get the
+     `Command' menu. Try using it to LaTeX the file.
+
+ 13. Check whether the `Preview' menu is available in this file.  Use it
+     to generate previews for the document.
+
+     If this barfs and tells you that image type `png' is not supported,
+     you can either add PNG support to your Emacs installation or
+     choose another image format to be used by preview-latex.
+
+     Adding support for an image format usually involves the
+     installation of a library, e.g. from `http://gnuwin32.sf.net/'.
+     If you got your Emacs from `gnu.org' you might want to check its
+     README file (ftp://ftp.gnu.org/gnu/emacs/windows/README) for
+     details.
+
+     A different image format can be chosen by setting the variable
+     `preview-image-type'.  While it is recommended to keep the
+     `dvipng' or `png' setting, you can temporarily select a different
+     format like `pnm' to check if the lack of PNG support is the only
+     problem with your Emacs installation.
+
+     Try adding the line
+
+          (setq preview-image-type 'pnm)
+
+     to your init file for a quick test.  You should remove the line
+     after the test again, because PNM files take away *vast* amounts
+     of disk space, and thus also of load/save time.
+
+   Well, that about is all.  Have fun!
+
+\1f
+File: auctex.info,  Node: Customizing,  Prev: Installation under MS Windows,  Up: Installation
+
+1.2.8 Customizing
+-----------------
+
+Most of the site-specific customization should already have happened
+during configuration of AUCTeX.  Any further customization can be done
+with customization buffers directly in Emacs.  Just type `M-x
+customize-group RET AUCTeX RET' to open the customization group for
+AUCTeX or use the menu entries provided in the mode menus.  Editing the
+file `tex-site.el' as suggested in former versions of AUCTeX should not
+be done anymore because the installation routine will overwrite those
+changes.
+
+   You might check some variables with a special significance.  They are
+accessible directly by typing `M-x customize-variable RET <variable>
+RET'.
+
+ -- User Option: TeX-macro-global
+     Directories containing the site's TeX style files.
+
+   Normally, AUCTeX will only allow you to complete macros and
+environments which are built-in, specified in AUCTeX style files or
+defined by yourself.  If you issue the `M-x TeX-auto-generate-global'
+command after loading AUCTeX, you will be able to complete on all
+macros available in the standard style files used by your document.  To
+do this, you must set this variable to a list of directories where the
+standard style files are located.  The directories will be searched
+recursively, so there is no reason to list subdirectories explicitly.
+Automatic configuration will already have set the variable for you if
+it could use the program `kpsewhich'.  In this case you normally don't
+have to alter anything.
+
+\1f
+File: auctex.info,  Node: Quick Start,  Prev: Installation,  Up: Introduction
+
+1.3 Quick Start
+===============
+
+AUCTeX is a powerful program offering many features and configuration
+options.  If you are new to AUCTeX this might be deterrent.
+Fortunately you do not have to learn everything at once.  This Quick
+Start Guide will give you the knowledge of the most important commands
+and enable you to prepare your first LaTeX document with AUCTeX after
+only a few minutes of reading.
+
+   In this introduction, we assume that AUCTeX is already installed on
+your system.  If this is not the case, you should read the file
+`INSTALL' in the base directory of the unpacked distribution tarball.
+These installation instructions are available in this manual as well,
+*note Installation::.  We also assume that you are familiar with the
+way keystrokes are written in Emacs manuals.  If not, have a look at
+the Emacs Tutorial in the Help menu.
+
+   If AUCTeX is installed, you might still need to activate it, by
+inserting
+
+     (load "auctex.el" nil t t)
+
+   in your user init file.(1)  In order to get support for many of the
+LaTeX packages you will use in your documents, you should enable
+document parsing as well, which can be achieved by putting
+
+     (setq TeX-auto-save t)
+     (setq TeX-parse-self t)
+
+   into your init file.  Finally, if you often use `\include' or
+`\input', you should make AUCTeX aware of the multi-file document
+structure.  You can do this by inserting
+
+     (setq-default TeX-master nil)
+
+   into your init file.  Each time you open a new file, AUCTeX will then
+ask you for a master file.
+
+* Menu:
+
+* Editing Facilities::          Functions for editing TeX files
+* Processing Facilities::       Creating and viewing output, debugging
+
+   ---------- Footnotes ----------
+
+   (1) This usually is a file in your home directory called `.emacs' if
+you are utilizing GNU Emacs or `.xemacs/init.el' if you are using
+XEmacs.
+
+\1f
+File: auctex.info,  Node: Editing Facilities,  Next: Processing Facilities,  Up: Quick Start
+
+1.3.1 Functions for editing TeX files
+-------------------------------------
+
+1.3.1.1 Making your TeX code more readable
+..........................................
+
+AUCTeX can do syntax highlighting of your source code, that means
+commands will get special colors or fonts.  You can enable it locally by
+typing `M-x font-lock-mode RET'.  If you want to have font locking
+activated generally, enable `global-font-lock-mode', e.g. with `M-x
+customize-variable RET global-font-lock-mode RET'.
+
+   AUCTeX will indent new lines to indicate their syntactical
+relationship to the surrounding text.  For example, the text of a
+`\footnote' or text inside of an environment will be indented relative
+to the text around it.  If the indenting has gotten wrong after adding
+or deleting some characters, use <TAB> to reindent the line, `M-q' for
+the whole paragraph, or `M-x LaTeX-fill-buffer RET' for the whole
+buffer.
+
+1.3.1.2 Entering sectioning commands
+....................................
+
+Insertion of sectioning macros, that is `\chapter', `\section',
+`\subsection', etc. and accompanying `\label' commands may be eased by
+using `C-c C-s'.  You will be asked for the section level.  As nearly
+everywhere in AUCTeX, you can use the <TAB> or <SPC> key to get a list
+of available level names, and to auto-complete what you started typing.
+Next, you will be asked for the printed title of the section, and last
+you will be asked for a label to be associated with the section.
+
+1.3.1.3 Inserting environments
+..............................
+
+Similarly, you can insert environments, that is `\begin{}'-`\end{}'
+pairs: Type `C-c C-e', and select an environment type.  Again, you can
+use <TAB> or <SPC> to get a list, and to complete what you type.
+Actually, the list will not only provide standard LaTeX environments,
+but also take your `\documentclass' and `\usepackage' commands into
+account if you have parsing enabled by setting `TeX-parse-self' to `t'.
+If you use a couple of environments frequently, you can use the up and
+down arrow keys (or `M-p' and `M-n') in the minibuffer to get back to
+the previously inserted commands.
+
+   Some environments need additional arguments.  Often, AUCTeX knows
+about this and asks you to enter a value.
+
+1.3.1.4 Inserting macros
+........................
+
+`C-c C-m', or simply `C-c RET' will give you a prompt that asks you for
+a LaTeX macro.  You can use <TAB> for completion, or the up/down arrow
+keys (or `M-p' and `M-n') to browse the command history.  In many
+cases, AUCTeX knows which arguments a macro needs and will ask you for
+that.  It even can differentiate between mandatory and optional
+arguments--for details, see *note Completion::.
+
+   An additional help for inserting macros is provided by the
+possibility to complete macros right in the buffer.  With point at the
+end of a partially written macro, you can complete it by typing `M-TAB'.
+
+1.3.1.5 Changing the font
+.........................
+
+AUCTeX provides convenient keyboard shortcuts for inserting macros
+which specify the font to be used for typesetting certain parts of the
+text.  They start with `C-c C-f', and the last `C-' combination tells
+AUCTeX which font you want:
+
+`C-c C-f C-b'
+     Insert bold face `\textbf{-!-}' text.
+
+`C-c C-f C-i'
+     Insert italics `\textit{-!-}' text.
+
+`C-c C-f C-e'
+     Insert emphasized `\emph{-!-}' text.
+
+`C-c C-f C-s'
+     Insert slanted `\textsl{-!-}' text.
+
+`C-c C-f C-r'
+     Insert roman \textrm{-!-} text.
+
+`C-c C-f C-f'
+     Insert  sans serif `\textsf{-!-}' text.
+
+`C-c C-f C-t'
+     Insert typewriter `\texttt{-!-}' text.
+
+`C-c C-f C-c'
+     Insert SMALL CAPS `\textsc{-!-}' text.
+
+`C-c C-f C-d'
+     Delete the innermost font specification containing point.
+
+
+   If you want to change font attributes of existing text, mark it as a
+region, and then invoke the commands.  If no region is selected, the
+command will be inserted with empty braces, and you can start typing the
+changed text.
+
+   Most of those commands will also work in math mode, but then macros
+like `\mathbf' will be inserted.
+
+1.3.1.6 Other useful features
+.............................
+
+AUCTeX also tries to help you when inserting the right "quote" signs
+for your language, dollar signs to typeset math, or pairs of braces.
+It offers shortcuts for commenting out text (`C-c ;' for the current
+region or `C-c %' for the paragraph you are in).  The same keystrokes
+will remove the % signs, if the region or paragraph is commented out
+yet.  With `TeX-fold-mode', you can hide certain parts (like footnotes,
+references etc.) that you do not edit currently.  Support for Emacs'
+outline mode is provided as well.  And there's more, but this is beyond
+the scope of this Quick Start Guide.
+
+\1f
+File: auctex.info,  Node: Processing Facilities,  Prev: Editing Facilities,  Up: Quick Start
+
+1.3.2 Creating and viewing output, debugging
+--------------------------------------------
+
+1.3.2.1 One Command for LaTeX, helpers, viewers, and printing
+.............................................................
+
+If you have typed some text and want to run LaTeX (or TeX, or other
+programs--see below) on it, type `C-c C-c'.  If applicable, you will be
+asked whether you want to save changes, and which program you want to
+invoke.  In many cases, the choice that AUCTeX suggests will be just
+what you want: first `latex', then a viewer.  If a `latex' run produces
+or changes input files for `makeindex', the next suggestion will be to
+run that program, and AUCTeX knows that you need to run `latex' again
+afterwards--the same holds for BibTeX.
+
+   When no processor invocation is necessary anymore, AUCTeX will
+suggest to run a viewer, or you can chose to create a PostScript file
+using `dvips', or to directly print it.
+
+   At this place, a warning needs to be given: First, although AUCTeX is
+really good in detecting the standard situations when an additional
+`latex' run is necessary, it cannot detect it always.  Second, the
+creation of PostScript files or direct printing currently only works
+when your output file is a DVI file, not a PDF file.
+
+   Ah, you didn't know you can do both?  That brings us to the next
+topic.
+
+1.3.2.2 Choosing an output format
+.................................
+
+From a LaTeX file, you can produce DVI output, or a PDF file directly
+via `pdflatex'.  You can switch on source specials for easier
+navigation in the output file, or tell `latex' to stop after an error
+(usually `\noninteractive' is used, to allow you to detect all errors
+in a single run).
+
+   These options are controlled by toggles, the keystrokes should be
+easy to memorize:
+
+`C-c C-t C-p'
+     This command toggles between DVI and PDF output
+
+`C-c C-t C-i'
+     toggles interactive mode
+
+`C-c C-t C-s'
+     toggles source specials support
+
+`C-c C-t C-o'
+     toggles usage of Omega/lambda.
+
+
+1.3.2.3 Debugging LaTeX
+.......................
+
+When AUCTeX runs a program, it creates an output buffer in which it
+displays the output of the command.  If there is a syntactical error in
+your file, `latex' will not complete successfully. AUCTeX will tell you
+that, and you can get to the place where the first error occured by
+pressing `C-c `' (the last character is a backtick).  The view will be
+split in two windows, the output will be displayed in the lower buffer,
+and both buffers will be centered around the place where the error
+ocurred.  You can then try to fix it in the document buffer, and use
+the same keystrokes to get to the next error.  This procedure may be
+repeated until all errors have been dealt with.  By pressing `C-c C-w'
+(`TeX-toggle-debug-boxes') you can toggle whether AUCTeX should notify
+you of overfull and underfull boxes in addition to regular errors.
+
+   If a command got stuck in a seemingly infinite loop, or you want to
+stop execution for other reasons, you can use `C-c C-k' (for "kill").
+Similar to `C-l', which centers the buffer you are in around your
+current position, `C-c C-l' centers the output buffer so that the last
+lines added at the bottom become visible.
+
+1.3.2.4 Running LaTeX on parts of your document
+...............................................
+
+If you want to check how some part of your text looks like, and do not
+want to wait until the whole document has been typeset, then mark it as
+a region and use `C-c C-r'.  It behaves just like `C-c C-c', but it
+only uses the document preamble and the region you marked.
+
+   If you are using `\include' or `\input' to structure your document,
+try `C-c C-b' while you are editing one of the included files.  It will
+run `latex' only on the current buffer, using the preamble from the
+master file.
+
+\1f
+File: auctex.info,  Node: Editing,  Next: Display,  Prev: Introduction,  Up: Top
+
+2 Editing the Document Source
+*****************************
+
+The most commonly used commands/macros of AUCTeX are those which simply
+insert templates for often used TeX, LaTeX, or ConTeXt constructs, like
+font changes, handling of environments, etc.  These features are very
+simple, and easy to learn, and help you avoid mistakes like mismatched
+braces, or `\begin{}'-`\end{}' pairs.
+
+   Apart from that this chapter contains a description of some features
+for entering more specialized sorts of text, for formatting the source
+by indenting and filling and for navigating through the document.
+
+* Menu:
+
+* Quotes::                      Inserting double quotes
+* Font Specifiers::             Inserting Font Specifiers
+* Sectioning::                  Inserting chapters, sections, etc.
+* Environments::                Inserting Environment Templates
+* Mathematics::                 Entering Mathematics
+* Completion::                  Completion of macros
+* Commenting::                  Commenting text
+* Indenting::                   Reflecting syntactic constructs with whitespace
+* Filling::                     Automatic and manual line breaking
+
+\1f
+File: auctex.info,  Node: Quotes,  Next: Font Specifiers,  Up: Editing
+
+2.1 Insertion of Quotes, Dollars, and Braces
+============================================
+
+Quotation Marks
+---------------
+
+In TeX, literal double quotes `"like this"' are seldom used, instead
+two single quotes are used ```like this'''.  To help you insert these
+efficiently, AUCTeX allows you to continue to press `"' to insert two
+single quotes.  To get a literal double quote, press `"' twice.
+
+ -- Command: TeX-insert-quote COUNT
+     (`"') Insert the appropriate quote marks for TeX.
+
+     Inserts the value of `TeX-open-quote' (normally ```') or
+     `TeX-close-quote' (normally `''') depending on the context.  With
+     prefix argument, always inserts `"' characters.
+
+ -- User Option: TeX-open-quote
+     String inserted by typing `"' to open a quotation.  (*Note
+     European::, for language-specific quotation mark insertion.)
+
+ -- User Option: TeX-close-quote
+     String inserted by typing `"' to close a quotation.  (*Note
+     European::, for language-specific quotation mark insertion.)
+
+ -- User Option: TeX-quote-after-quote
+     Determines the behavior of `"'.  If it is non-nil, typing `"' will
+     insert a literal double quote.  The respective values of
+     `TeX-open-quote' and `TeX-close-quote' will be inserted after
+     typing `"' once again.
+
+   The `babel' package provides special support for the requirements of
+typesetting quotation marks in many different languages.  If you use
+this package, either directly or by loading a language-specific style
+file, you should also use the special commands for quote insertion
+instead of the standard quotes shown above.  AUCTeX is able to
+recognize several of these languages and will change quote insertion
+accordingly.  *Note European::, for details about this feature and how
+to control it.
+
+   In case you are using the `csquotes' package, you should customize
+`LaTeX-csquotes-open-quote', `LaTeX-csquotes-close-quote' and
+`LaTeX-csquotes-quote-after-quote'.  The quotation characters will only
+be used if both variables--`LaTeX-csquotes-open-quote' and
+`LaTeX-csquotes-close-quote'--are non-empty strings.  But then the
+`csquotes'-related values will take precedence over the
+language-specific ones.
+
+Dollar Signs
+------------
+
+In AUCTeX, dollar signs should match like they do in TeX.  This has
+been partially implemented, we assume dollar signs always match within
+a paragraph.  The first `$' you insert in a paragraph will do nothing
+special.  The second `$' will match the first.  This will be indicated
+by moving the cursor temporarily over the first dollar sign.
+
+ -- Command: TeX-insert-dollar ARG
+     (`$') Insert dollar sign.
+
+     Show matching dollar sign if this dollar sign end the TeX math
+     mode.  Ensure double dollar signs match up correctly by inserting
+     extra dollar signs when needed if `TeX-math-close-double-dollar'
+     is non-nil.
+
+     With optional ARG, insert that many dollar signs.
+
+ -- User Option: TeX-math-close-double-dollar
+     Control the insertion of double dollar signs for delimiting display
+     math.  (Note that you should not use double dollar signs in LaTeX
+     because this practice can lead to wrong spacing in typeset
+     documents.)  If the variable is non-nil and you enter a dollar
+     sign that matches a double dollar sign `$$' AUCTeX will
+     automatically insert two dollar signs.
+
+Braces
+------
+
+To avoid unbalanced braces, it is useful to insert them pairwise.  You
+can do this by typing `C-c {'.
+
+ -- Command: TeX-insert-braces
+     (`C-c {') Make a pair of braces and position the cursor to type
+     inside of them.  If there is an active region, put braces around
+     it and leave point after the closing brace.
+
+\1f
+File: auctex.info,  Node: Font Specifiers,  Next: Sectioning,  Prev: Quotes,  Up: Editing
+
+2.2 Inserting Font Specifiers
+=============================
+
+Perhaps the most used keyboard commands of AUCTeX are the short-cuts
+available for easy insertion of font changing macros.
+
+   If you give an argument (that is, type `C-u') to the font command,
+the innermost font will be replaced, i.e. the font in the TeX group
+around point will be changed.  The following table shows the available
+commands, with `-!-' indicating the position where the text will be
+inserted.
+
+`C-c C-f C-b'
+     Insert bold face `\textbf{-!-}' text.
+
+`C-c C-f C-i'
+     Insert italics `\textit{-!-}' text.
+
+`C-c C-f C-e'
+     Insert emphasized `\emph{-!-}' text.
+
+`C-c C-f C-s'
+     Insert slanted `\textsl{-!-}' text.
+
+`C-c C-f C-r'
+     Insert roman \textrm{-!-} text.
+
+`C-c C-f C-f'
+     Insert sans serif `\textsf{-!-}' text.
+
+`C-c C-f C-t'
+     Insert typewriter `\texttt{-!-}' text.
+
+`C-c C-f C-c'
+     Insert SMALL CAPS `\textsc{-!-}' text.
+
+`C-c C-f C-d'
+     Delete the innermost font specification containing point.
+
+
+ -- Command: TeX-font replace what
+     (`C-c C-f') Insert template for font change command.
+
+     If REPLACE is not nil, replace current font.  WHAT determines the
+     font to use, as specified by `TeX-font-list'.
+
+ -- User Option: TeX-font-list
+     List of fonts used by `TeX-font'.
+
+     Each entry is a list with three elements.  The first element is the
+     key to activate the font.  The second element is the string to
+     insert before point, and the third element is the string to insert
+     after point.  An optional fourth element means always replace if
+     not nil.
+
+ -- User Option: LaTeX-font-list
+     List of fonts used by `TeX-font' in LaTeX mode.  It has the same
+     structure as `TeX-font-list'.
+
+\1f
+File: auctex.info,  Node: Sectioning,  Next: Environments,  Prev: Font Specifiers,  Up: Editing
+
+2.3 Inserting chapters, sections, etc.
+======================================
+
+Insertion of sectioning macros, that is `\chapter', `\section',
+`\subsection', etc. and accompanying `\label''s may be eased by using
+`C-c C-s'.  This command is highly customizable, the following
+describes the default behavior.
+
+   When invoking you will be asked for a section macro to insert.  An
+appropriate default is automatically selected by AUCTeX, that is
+either: at the top of the document; the top level sectioning for that
+document style, and any other place: The same as the last occurring
+sectioning command.
+
+   Next, you will be asked for the actual name of that section, and
+last you will be asked for a label to be associated with that section.
+The label will be prefixed by the value specified in
+`LaTeX-section-hook'.
+
+ -- Command: LaTeX-section ARG
+     (`C-c C-s') Insert a sectioning command.
+
+     Determine the type of section to be inserted, by the argument ARG.
+
+        * If ARG is nil or missing, use the current level.
+
+        * If ARG is a list (selected by C-u), go downward one level.
+
+        * If ARG is negative, go up that many levels.
+
+        * If ARG is positive or zero, use absolute level:
+             + 0 : part
+
+             + 1 : chapter
+
+             + 2 : section
+
+             + 3 : subsection
+
+             + 4 : subsubsection
+
+             + 5 : paragraph
+
+             + 6 : subparagraph
+
+     The following variables can be set to customize the function.
+
+    `LaTeX-section-hook'
+          Hooks to be run when inserting a section.
+
+    `LaTeX-section-label'
+          Prefix to all section references.
+
+
+   The precise behavior of `LaTeX-section' is defined by the contents
+of `LaTeX-section-hook'.
+
+ -- User Option: LaTeX-section-hook
+     List of hooks to run when a new section is inserted.
+
+     The following variables are set before the hooks are run
+
+    LEVEL
+          Numeric section level, default set by prefix arg to
+          `LaTeX-section'.
+
+    NAME
+          Name of the sectioning command, derived from LEVEL.
+
+    TITLE
+          The title of the section, default to an empty string.
+
+    TOC
+          Entry for the table of contents list, default nil.
+
+    DONE-MARK
+          Position of point afterwards, default nil meaning after the
+          inserted text.
+
+     A number of hooks are already defined.  Most likely, you will be
+     able to get the desired functionality by choosing from these hooks.
+
+    `LaTeX-section-heading'
+          Query the user about the name of the sectioning command.
+          Modifies LEVEL and NAME.
+
+    `LaTeX-section-title'
+          Query the user about the title of the section. Modifies TITLE.
+
+    `LaTeX-section-toc'
+          Query the user for the toc entry.  Modifies TOC.
+
+    `LaTeX-section-section'
+          Insert LaTeX section command according to NAME, TITLE, and
+          TOC.  If TOC is nil, no toc entry is inserted.  If TOC or
+          TITLE are empty strings, DONE-MARK will be placed at the
+          point they should be inserted.
+
+    `LaTeX-section-label'
+          Insert a label after the section command.  Controlled by the
+          variable `LaTeX-section-label'.
+
+     To get a full featured `LaTeX-section' command, insert
+
+          (setq LaTeX-section-hook
+                '(LaTeX-section-heading
+               LaTeX-section-title
+               LaTeX-section-toc
+               LaTeX-section-section
+               LaTeX-section-label))
+
+     in your `.emacs' file.
+
+   The behavior of `LaTeX-section-label' is determined by the variable
+`LaTeX-section-label'.
+
+ -- User Option: LaTeX-section-label
+     Default prefix when asking for a label.
+
+     If it is a string, it is used unchanged for all kinds of sections.
+     If it is nil, no label is inserted.  If it is a list, the list is
+     searched for a member whose car is equal to the name of the
+     sectioning command being inserted.  The cdr is then used as the
+     prefix.  If the name is not found, or if the cdr is nil, no label
+     is inserted.
+
+     By default, chapters have a prefix of `cha:' while sections and
+     subsections have a prefix of `sec:'.  Labels are not automatically
+     inserted for other types of sections.
+
+\1f
+File: auctex.info,  Node: Environments,  Next: Mathematics,  Prev: Sectioning,  Up: Editing
+
+2.4 Inserting Environment Templates
+===================================
+
+A large apparatus is available that supports insertions of environments,
+that is `\begin{}' -- `\end{}' pairs.
+
+   AUCTeX is aware of most of the actual environments available in a
+specific document.  This is achieved by examining your `\documentclass'
+command, and consulting a precompiled list of environments available in
+a large number of styles.
+
+   You insert an environment with `C-c C-e', and select an environment
+type.  Depending on the environment, AUCTeX may ask more questions
+about the optional parts of the selected environment type.  With `C-u
+C-c C-e' you will change the current environment.
+
+ -- Command: LaTeX-environment ARG
+     (`C-c C-e')  AUCTeX will prompt you for an environment to insert.
+     At this prompt, you may press <TAB> or <SPC> to complete a
+     partially written name, and/or to get a list of available
+     environments.  After selection of a specific environment AUCTeX may
+     prompt you for further specifications.
+
+     If the optional argument ARG is not-nil (i.e. you have given a
+     prefix argument), the current environment is modified and no new
+     environment is inserted.
+
+   As a default selection, AUCTeX will suggest the environment last
+inserted or, as the first choice the value of the variable
+`LaTeX-default-environment'.
+
+ -- User Option: LaTeX-default-environment
+     Default environment to insert when invoking `LaTeX-environment'
+     first time.
+
+   If the document is empty, or the cursor is placed at the top of the
+document, AUCTeX will default to insert a `document' environment.
+
+   Most of these are described further in the following sections, and
+you may easily specify more.  *Note Customizing Environments::.
+
+* Menu:
+
+* Equations::                   Equations
+* Floats::                      Floats
+* Itemize-like::                Itemize-like Environments
+* Tabular-like::                Tabular-like Environments
+* Customizing Environments::    Customizing Environments
+
+   You can close the current environment with `C-c ]', but we suggest
+that you use `C-c C-e' to insert complete environments instead.
+
+ -- Command: LaTeX-close-environment
+     (`C-c ]') Insert an `\end' that matches the current environment.
+
+\1f
+File: auctex.info,  Node: Equations,  Next: Floats,  Up: Environments
+
+2.4.1 Equations
+---------------
+
+When inserting equation-like environments, the `\label' will have a
+default prefix, which is controlled by the following variables:
+
+ -- User Option: LaTeX-equation-label
+     Prefix to use for `equation' labels.
+
+ -- User Option: LaTeX-eqnarray-label
+     Prefix to use for `eqnarray' labels.
+
+ -- User Option: LaTeX-amsmath-label
+     Prefix to use for amsmath equation labels.  Amsmath equations
+     include `align', `alignat', `xalignat', `aligned', `flalign' and
+     `gather'.
+
+\1f
+File: auctex.info,  Node: Floats,  Next: Itemize-like,  Prev: Equations,  Up: Environments
+
+2.4.2 Floats
+------------
+
+Figures and tables (i.e., floats) may also be inserted using AUCTeX.
+After choosing either `figure' or `table' in the environment list
+described above, you will be prompted for a number of additional things.
+
+FLOAT POSITION
+     This is the optional argument of float environments that controls
+     how they are placed in the final document.  In LaTeX this is a
+     sequence of the letters `htbp' as described in the LaTeX manual.
+     The value will default to the value of `LaTeX-float'.  
+
+CAPTION
+     This is the caption of the float.  The default is to insert the
+     caption at the bottom of the float.  You can specify floats where
+     the caption should be placed at the top with
+     `LaTeX-top-caption-list'.  
+
+LABEL
+     The label of this float.  The label will have a default prefix,
+     which is controlled by the variables `LaTeX-figure-label' and
+     `LaTeX-table-label'.  
+
+   Moreover, you will be asked if you want the contents of the float
+environment to be horizontally centered.  Upon a positive answer a
+`\centering' macro will be inserted at the beginning of the float
+environment.
+
+ -- User Option: LaTeX-float
+     Default placement for floats.
+
+ -- User Option: LaTeX-figure-label
+     Prefix to use for figure labels.
+
+ -- User Option: LaTeX-table-label
+     Prefix to use for table labels.
+
+ -- User Option: LaTeX-top-caption-list
+     List of float environments with top caption.
+
+\1f
+File: auctex.info,  Node: Itemize-like,  Next: Tabular-like,  Prev: Floats,  Up: Environments
+
+2.4.3 Itemize-like Environments
+-------------------------------
+
+In an itemize-like environment, nodes (i.e., `\item's) may be inserted
+using `C-c <LFD>'.
+
+ -- Command: LaTeX-insert-item
+     (`C-c <LFD>') Close the current item, move to the next line and
+     insert an appropriate `\item' for the current environment. That is,
+     `itemize' and `enumerate' will have `\item ' inserted, while
+     `description' will have `\item[]' inserted.
+
+\1f
+File: auctex.info,  Node: Tabular-like,  Next: Customizing Environments,  Prev: Itemize-like,  Up: Environments
+
+2.4.4 Tabular-like Environments
+-------------------------------
+
+When inserting Tabular-like environments, that is, `tabular' `array'
+etc., you will be prompted for a template for that environment.
+Related variables:
+
+ -- User Option: LaTeX-default-format
+     Default format string for array and tabular environments.
+
+ -- User Option: LaTeX-default-position
+     Default position string for array and tabular environments.  If
+     nil, act like the empty string is given, but don't prompt for a
+     position.
+
+\1f
+File: auctex.info,  Node: Customizing Environments,  Prev: Tabular-like,  Up: Environments
+
+2.4.5 Customizing Environments
+------------------------------
+
+*Note Adding Environments::, for how to customize the list of known
+environments.
+
+\1f
+File: auctex.info,  Node: Mathematics,  Next: Completion,  Prev: Environments,  Up: Editing
+
+2.5 Entering Mathematics
+========================
+
+TeX is written by a mathematician, and has always contained good
+support for formatting mathematical text.  AUCTeX supports this
+tradition, by offering a special minor mode for entering text with many
+mathematical symbols.  You can enter this mode by typing `C-c ~'.
+
+ -- Command: LaTeX-math-mode
+     (`C-c ~') Toggle LaTeX Math mode.  This is a minor mode rebinding
+     the key `LaTeX-math-abbrev-prefix' to allow easy typing of
+     mathematical symbols.  ``' will read a character from the keyboard,
+     and insert the symbol as specified in `LaTeX-math-default' and
+     `LaTeX-math-list'.  If given a prefix argument, the symbol will be
+     surrounded by dollar signs.
+
+   You can use another prefix key (instead of ``') by  setting the
+variable `LaTeX-math-abbrev-prefix'.
+
+   To enable LaTeX Math mode by default, add the following in your
+`.emacs' file:
+     (add-hook 'LaTeX-mode-hook 'LaTeX-math-mode)
+
+ -- User Option: LaTeX-math-abbrev-prefix
+     A string containing the prefix of `LaTeX-math-mode' commands; This
+     value defaults to ``'.
+
+     The string has to be a key or key sequence in a format understood
+     by the `kbd' macro.  This corresponds to the syntax usually used
+     in the manuals for Emacs Emacs Lisp.
+
+   The variable `LaTeX-math-list' allows you to add your own mappings.
+
+ -- User Option: LaTeX-math-list
+     A list containing user-defined keys and commands to be used in
+     LaTeX Math mode.  Each entry should be a list of two to four
+     elements.
+
+     First, the key to be used after `LaTeX-math-abbrev-prefix' for
+     macro insertion.  If it is nil, the symbol has no associated
+     keystroke (it is available in the menu, though).
+
+     Second, a string representing the name of the macro (without a
+     leading backslash.)
+
+     Third, a string representing the name of a submenu the command
+     should be added to.  Use a list of strings in case of nested menus.
+
+     Fourth, the position of a Unicode character to be displayed in the
+     menu alongside the macro name.  This is an integer value.
+
+ -- User Option: LaTeX-math-menu-unicode
+     Whether the LaTeX menu should try using Unicode for effect.  Your
+     Emacs built must be able to display include Unicode characters in
+     menus for this feature.
+
+   AUCTeX's reference card `tex-ref.tex' includes a list of all math
+mode commands.
+
+   AUCTeX can help you write subscripts and superscripts in math
+constructs by automatically inserting a pair of braces after typing <_>
+or <^> respectively and putting point between the braces.  In order to
+enable this feature, set the variable
+`TeX-electric-sub-and-superscript' to a non-nil value.
+
+ -- User Option: TeX-electric-sub-and-superscript
+     If non-nil, insert braces after typing <^> and <_> in math mode.
+
+\1f
+File: auctex.info,  Node: Completion,  Next: Commenting,  Prev: Mathematics,  Up: Editing
+
+2.6 Completion
+==============
+
+Emacs lisp programmers probably know the `lisp-complete-symbol'
+command, usually bound to `M-<TAB>'.  Users of the wonderful ispell
+mode know and love the `ispell-complete-word' command from that
+package.  Similarly, AUCTeX has a `TeX-complete-symbol' command, by
+default bound to `M-<TAB>' which is equivalent to `M-C-i'.  Using
+`TeX-complete-symbol' makes it easier to type and remember the names of
+long LaTeX macros.
+
+   In order to use `TeX-complete-symbol', you should write a backslash
+and the start of the macro.  Typing `M-<TAB>' will now complete as much
+of the macro, as it unambiguously can.  For example, if you type
+``\renewc'' and then `M-<TAB>', it will expand to ``\renewcommand''.
+
+ -- Command: TeX-complete-symbol
+     (`M-<TAB>')  Complete TeX symbol before point.
+
+   A more direct way to insert a macro is with `TeX-insert-macro',
+bound to `C-c C-m' which is equivalent to `C-c <RET>'.  It has the
+advantage over completion that it knows about the argument of most
+standard LaTeX macros, and will prompt for them.  It also knows about
+the type of the arguments, so it will for example give completion for
+the argument to `\include'.  Some examples are listed below.
+
+ -- Command: TeX-insert-macro
+     (`C-c C-m' or `C-c <RET>') Prompt (with completion) for the name
+     of a TeX macro, and if AUCTeX knows the macro, prompt for each
+     argument.
+
+   As a default selection, AUCTeX will suggest the macro last inserted
+or, as the first choice the value of the variable `TeX-default-macro'.
+
+ -- User Option: TeX-insert-macro-default-style
+     Specifies whether `TeX-insert-macro' will ask for all optional
+     arguments.
+
+     If set to the symbol `show-optional-args', `TeX-insert-macro' asks
+     for optional arguments of TeX macros.  If set to
+     `mandatory-args-only', `TeX-insert-macro' asks only for mandatory
+     arguments.  When `TeX-insert-macro' is called with prefix argument
+     (`C-u'), it's the other way round.
+
+     Note that for some macros, there are special mechanisms, e.g.
+     `LaTeX-includegraphics-options-alist'.
+
+
+ -- User Option: TeX-default-macro
+     Default macro to insert when invoking `TeX-insert-macro' first
+     time.
+
+   A faster alternative is to bind the function `TeX-electric-macro' to
+`\'.  This can be done by setting the variable `TeX-electric-escape'
+
+ -- User Option: TeX-electric-escape
+     If this is non-nil when AUCTeX is loaded, the TeX escape character
+     `\' will be bound to `TeX-electric-macro'
+
+   The difference between `TeX-insert-macro' and `TeX-electric-macro'
+is that space will complete and exit from the minibuffer in
+`TeX-electric-macro'.  Use <TAB> if you merely want to complete.
+
+ -- Command: TeX-electric-macro
+     Prompt (with completion) for the name of a TeX macro, and if
+     AUCTeX knows the macro, prompt for each argument.  Space will
+     complete and exit.
+
+   By default AUCTeX will put an empty set braces `{}' after a macro
+with no arguments to stop it from eating the next whitespace.  This can
+be stopped by entering `LaTeX-math-mode', *note Mathematics::, or by
+setting `TeX-insert-braces' to nil.
+
+ -- User Option: TeX-insert-braces
+     If non-nil, append a empty pair of braces after inserting a macro.
+
+   Completions work because AUCTeX can analyze TeX files, and store
+symbols in Emacs Lisp files for later retrieval.  *Note Automatic::, for
+more information.
+
+   AUCTeX will also make completion for many macro arguments, for
+example existing labels when you enter a `\ref' macro with
+`TeX-insert-macro' or `TeX-electric-macro', and BibTeX entries when you
+enter a `\cite' macro.  For this kind of completion to work, parsing
+must be enabled as described in *note Parsing Files::.  For `\cite' you
+must also make sure that the BibTeX files have been saved at least once
+after you enabled automatic parsing on save, and that the basename of
+the BibTeX file does not conflict with the basename of one of TeX files.
+
+\1f
+File: auctex.info,  Node: Commenting,  Next: Indenting,  Prev: Completion,  Up: Editing
+
+2.7 Commenting
+==============
+
+It is often necessary to comment out temporarily a region of TeX or
+LaTeX code.  This can be done with the commands `C-c ;' and `C-c %'.
+`C-c ;' will comment out all lines in the current region, while `C-c %'
+will comment out the current paragraph.  Type `C-c ;' again to
+uncomment all lines of a commented region, or `C-c %' again to
+uncomment all comment lines around point.  These commands will insert
+or remove a single `%' respectively.
+
+ -- Command: TeX-comment-or-uncomment-region
+     (`C-c ;') Add or remove `%' from the beginning of each line in the
+     current region.  Uncommenting works only if the region encloses
+     solely commented lines.  If AUCTeX should not try to guess if the
+     region should be commented or uncommented the commands
+     `TeX-comment-region' and `TeX-uncomment-region' can be used to
+     explicitly comment or uncomment the region in concern.
+
+ -- Command: TeX-comment-or-uncomment-paragraph
+     (`C-c %') Add or remove `%' from the beginning of each line in the
+     current paragraph.  When removing `%' characters the paragraph is
+     considered to consist of all preceding and succeeding lines
+     starting with a `%', until the first non-comment line.
+
+\1f
+File: auctex.info,  Node: Indenting,  Next: Filling,  Prev: Commenting,  Up: Editing
+
+2.8 Indenting
+=============
+
+Indentation means the addition of whitespace at the beginning of lines
+to reflect special syntactical constructs.  This makes it easier to see
+the structure of the document, and to catch errors such as a missing
+closing brace.  Thus, the indentation is done for precisely the same
+reasons that you would indent ordinary computer programs.
+
+   Indentation is done by LaTeX environments and by TeX groups, that is
+the body of an environment is indented by the value of
+`LaTeX-indent-level' (default 2).  Also, items of an `itemize-like'
+environment are indented by the value of `LaTeX-item-indent', default
+-2.  (Items are identified with the help of `LaTeX-item-regexp'.)  If
+more environments are nested, they are indented `accumulated' just like
+most programming languages usually are seen indented in nested
+constructs.  
+
+   You can explicitely indent single lines, usually by pressing <TAB>,
+or marked regions by calling `indent-region' on it.  If you have
+`auto-fill-mode' enabled and a line is broken while you type it, Emacs
+automatically cares about the indentation in the following line.  If
+you want to have a similar behavior upon typing <RET>, you can
+customize the variable `TeX-newline-function' and change the default of
+`newline' which does no indentation to `newline-and-indent' which
+indents the new line or `reindent-then-newline-and-indent' which
+indents both the current and the new line.  
+
+   There are certain LaTeX environments which should be indented in a
+special way, like `tabular' or `verbatim'.  Those environments may be
+specified in the variable `LaTeX-indent-environment-list' together with
+their special indentation functions.  Taking the `verbatim' environment
+as an example you can see that `current-indentation' is used as the
+indentation function.  This will stop AUCTeX from doing any indentation
+in the environment if you hit <TAB> for example.  
+
+   There are environments in `LaTeX-indent-environment-list' which do
+not bring a special indentation function with them.  This is due to the
+fact that first the respective functions are not implemented yet and
+second that filling will be disabled for the specified environments.
+This shall prevent the source code from being messed up by accidently
+filling those environments with the standard filling routine.  If you
+think that providing special filling routines for such environments
+would be an appropriate and challenging task for you, you are invited to
+contribute. (*Note Filling::, for further information about the filling
+functionality) 
+
+   The check for the indentation function may be enabled or disabled by
+customizing the variable `LaTeX-indent-environment-check'.  
+
+   As a side note with regard to formatting special environments: Newer
+Emacsen include `align.el' and therefore provide some support for
+formatting `tabular' and `tabbing' environments with the function
+`align-current' which will nicely align columns in the source code.
+
+   AUCTeX is able to format commented parts of your code just as any
+other part.  This means LaTeX environments and TeX groups in comments
+will be indented syntactically correct if the variable
+`LaTeX-syntactic-comments' is set to t.  If you disable it, comments
+will be filled like normal text and no syntactic indentation will be
+done.  
+
+   Following you will find a list of most commands and variables related
+to indenting with a small summary in each case:
+
+`<TAB>'
+     `LaTeX-indent-line' will indent the current line.
+
+`<LFD>'
+     `newline-and-indent' inserts a new line (much like <RET>) and
+     moves the cursor to an appropriate position by the left margin.
+
+     Most keyboards nowadays lack a linefeed key and `C-j' may be
+     tedious to type.  Therefore you can customize AUCTeX to perform
+     indentation upon typing <RET> as well.  The respective option is
+     called `TeX-newline-function'.
+
+`C-j'
+     Alias for <LFD>
+
+ -- User Option: LaTeX-indent-environment-list
+     List of environments with special indentation.  The second element
+     in each entry is the function to calculate the indentation level in
+     columns.
+
+     The filling code currently cannot handle tabular-like environments
+     which will be completely messed-up if you try to format them.
+     This is why most of these environments are included in this
+     customization option without a special indentation function.  This
+     will prevent that they get filled.
+
+ -- User Option: LaTeX-indent-level
+     Number of spaces to add to the indentation for each `\begin' not
+     matched by a `\end'.
+
+ -- User Option: LaTeX-item-indent
+     Number of spaces to add to the indentation for `\item''s in list
+     environments.
+
+ -- User Option: TeX-brace-indent-level
+     Number of spaces to add to the indentation for each `{' not
+     matched by a `}'.
+
+ -- User Option: LaTeX-syntactic-comments
+     If non-nil comments will be filled and indented according to LaTeX
+     syntax.  Otherwise they will be filled like normal text.
+
+ -- User Option: TeX-newline-function
+     Used to specify the function which is called when <RET> is pressed.
+     This will normally be `newline' which simply inserts a new line.
+     In case you want to have AUCTeX do indentation as well when you
+     press <RET>, use the built-in functions `newline-and-indent' or
+     `reindent-then-newline-and-indent'.  The former inserts a new line
+     and indents the following line, i.e. it moves the cursor to the
+     right position and therefore acts as if you pressed <LFD>.  The
+     latter function additionally indents the current line.  If you
+     choose `Other', you can specify your own fancy function to be
+     called when <RET> is pressed.
+
+\1f
+File: auctex.info,  Node: Filling,  Prev: Indenting,  Up: Editing
+
+2.9 Filling
+===========
+
+Filling deals with the insertion of line breaks to prevent lines from
+becoming wider than what is specified in `fill-column'.  The linebreaks
+will be inserted automatically if `auto-fill-mode' is enabled.  In this
+case the source is not only filled but also indented automatically as
+you write it.
+
+   `auto-fill-mode' can be enabled for AUCTeX by calling
+`turn-on-auto-fill' in one of the hooks AUCTeX is running.  *Note Modes
+and Hooks::.  As an example, if you want to enable `auto-fill-mode' in
+`LaTeX-mode', put the following into your init file:
+
+     (add-hook 'LaTeX-mode-hook 'turn-on-auto-fill)
+
+   You can manually fill explicitely marked regions, paragraphs,
+environments, complete sections, or the whole buffer.  (Note that manual
+filling in AUCTeX will indent the start of the region to be filled in
+contrast to many other Emacs modes.)
+
+   There are some syntactical constructs which are handled specially
+with regard to filling.  These are so-called code comments and paragraph
+commands.
+
+   Code comments are comments preceded by code or text in the same line.
+Upon filling a region, code comments themselves will not get filled.
+Filling is done from the start of the region to the line with the code
+comment and continues after it.  In order to prevent overfull lines in
+the source code, a linebreak will be inserted before the last
+non-comment word by default.  This can be changed by customizing
+`LaTeX-fill-break-before-code-comments'.  If you have overfull lines
+with code comments you can fill those explicitely by calling
+`LaTeX-fill-paragraph' or pressing `M-q' with the cursor positioned on
+them.  This will add linebreaks in the comment and indent subsequent
+comment lines to the column of the comment in the first line of the
+code comment.  In this special case `M-q' only acts on the current line
+and not on the whole paragraph.
+
+   Lines with `\par' are treated similarly to code comments, i.e.
+`\par' will be treated as paragraph boundary which should not be
+followed by other code or text.  But it is not treated as a real
+paragraph boundary like an empty line where filling a paragraph would
+stop.
+
+   Paragraph commands like `\section' or `\noindent' (the list of
+commands is defined by `LaTeX-paragraph-commands') are often to be
+placed in their own line(s).  This means they should not be consecuted
+with any preceding or following adjacent lines of text.  AUCTeX will
+prevent this from happening if you do not put any text except another
+macro after the end of the last brace of the respective macro.  If
+there is other text after the macro, AUCTeX regards this as a sign that
+the macro is part of the following paragraph.  
+
+   Here are some examples:
+
+     \begin{quote}
+       text text text text
+
+     \begin{quote}\label{foo}
+       text text text text
+
+   If you press `M-q' on the first line in both examples, nothing will
+change.  But if you write
+
+     \begin{quote} text
+       text text text text
+
+   and press `M-q', you will get
+
+     \begin{quote} text text text text text
+
+   Besides code comments and paragraph commands, another speciality of
+filling in AUCTeX involves commented lines.  You should be aware that
+these comments are treated as islands in the rest of the LaTeX code if
+syntactic filling is enabled.  This means, for example, if you try to
+fill an environment with `LaTeX-fill-environment' and have the cursor
+placed on a commented line which does not have a surrounding
+environment inside the comment, AUCTeX will report an error.  
+
+   The relevant commands and variables with regard to filling are:
+
+`C-c C-q C-p'
+     `LaTeX-fill-paragraph' will fill and indent the current paragraph.
+
+`M-q'
+     Alias for `C-c C-q C-p'
+
+`C-c C-q C-e'
+     `LaTeX-fill-environment' will fill and indent the current
+     environment.  This may e.g. be the `document' environment, in
+     which case the entire document will be formatted.
+
+`C-c C-q C-s'
+     `LaTeX-fill-section' will fill and indent the current logical
+     sectional unit.
+
+`C-c C-q C-r'
+     `LaTeX-fill-region' will fill and indent the current region.
+
+ -- User Option: LaTeX-fill-break-at-separators
+     List of separators before or after which respectively linebreaks
+     will be inserted if they do not fit into one line.  The separators
+     can be curly braces, brackets, switches for inline math (`$', `\(',
+     `\)') and switches for display math (`\[', `\]').  Such formatting
+     can be useful to make macros and math more visible or to prevent
+     overfull lines in the LaTeX source in case a package for
+     displaying formatted TeX output inside the Emacs buffer, like
+     preview-latex, is used.
+
+ -- User Option: LaTeX-fill-break-before-code-comments
+     Code comments are comments preceded by some other text in the same
+     line.  When a paragraph containing such a comment is to be filled,
+     the comment start will be seen as a border after which no line
+     breaks will be inserted in the same line.  If the option
+     `LaTeX-fill-break-before-code-comments' is enabled (which is the
+     default) and the comment does not fit into the line, a line break
+     will be inserted before the last non-comment word to minimize the
+     chance that the line becomes overfull.
+
+\1f
+File: auctex.info,  Node: Display,  Next: Processing,  Prev: Editing,  Up: Top
+
+3 Controlling Screen Display
+****************************
+
+It is often desirable to get visual help of what markup code in a text
+actually does whithout having to decipher it explicitely.  For this
+purpose Emacs and AUCTeX provide font locking (also known as syntax
+highlighting) which visually sets off markup code like macros or
+environments by using different colors or fonts.  For example text to be
+typeset in italics can be displayed with an italic font in the editor as
+well, or labels and references get their own distinct color.
+
+   While font locking helps you grasp the purpose of markup code and
+separate markup from content, the markup code can still be distracting.
+AUCTeX lets you hide those parts and show them again at request with
+its built-in support for hiding macros and environments which we call
+folding here.
+
+   Besides folding of macros and environments, AUCTeX provides support
+for Emacs' outline mode which lets you narrow the buffer content to
+certain sections of your text by hiding the parts not belonging to these
+sections.
+
+* Menu:
+
+* Font Locking::                Font Locking
+* Folding::                     Folding Macros and Environments
+* Outline::                     Outlining the Document
+
+\1f
+File: auctex.info,  Node: Font Locking,  Next: Folding,  Up: Display
+
+3.1 Font Locking
+================
+
+Font locking is supposed to improve readability of the source code by
+highlighting certain keywords with different colors or fonts.  It
+thereby lets you recognize the function of markup code to a certain
+extent without having to read the markup command.  For general
+information on controlling font locking with Emacs' Font Lock mode, see
+*note Font Lock Mode: (emacs)Font Lock.
+
+ -- User Option: TeX-install-font-lock
+     Once font locking is enabled globally or for the major modes
+     provided by AUCTeX, the font locking patterns and functionality of
+     font-latex are activated by default.  You can switch to a
+     different font locking scheme or disable font locking in AUCTeX by
+     customizing the variable `TeX-install-font-lock'.
+
+     Besides font-latex AUCTeX ships with a scheme which is derived
+     from Emacs' default LaTeX mode and activated by choosing
+     `tex-font-setup'.  Be aware that this scheme is not coupled with
+     AUCTeX's style system and not the focus of development.  Therefore
+     and due to font-latex being much more feature-rich the following
+     explanations will only cover font-latex.
+
+     In case you want to hook in your own fontification scheme, you can
+     choose `other' and insert the name of the function which sets up
+     your font locking patterns.  If you want to disable fontification
+     in AUCTeX completely, choose `ignore'.
+
+   font-latex provides many options for customization which are
+accessible with `M-x customize-group RET font-latex RET'.  For this
+description the various options are explained in conceptional groups.
+
+* Menu:
+
+* Fontification of macros::     Fontification of macros
+* Fontification of quotes::     Fontification of quotes
+* Fontification of math::       Fontification of math constructs
+* Verbatim content::            Verbatim macros and environments
+* Faces::                       Faces used by font-latex
+* Known problems::              Known fontification problems
+
+\1f
+File: auctex.info,  Node: Fontification of macros,  Next: Fontification of quotes,  Up: Font Locking
+
+3.1.1 Fontification of macros
+-----------------------------
+
+Highlighting of macros can be customized by adapting keyword lists which
+can be found in the customization group `font-latex-keywords'.
+
+   Three types of macros can be handled differently with respect to
+fontification:
+
+  1. Commands of the form `\foo[bar]{baz}' which consist of the macro
+     itself, optional arguments in square brackets and mandatory
+     arguments in curly braces.  For the command itself the face
+     `font-lock-keyword-face' will be used and for the optional
+     arguments the face `font-lock-variable-name-face'.  The face
+     applied to the mandatory argument depends on the macro class
+     represented by the respective built-in variables.
+
+  2. Declaration macros of the form `{\foo text}' which consist of the
+     macro which may be enclosed in a TeX group together with text to be
+     affected by the macro.  In case a TeX group is present, the macro
+     will get the face `font-lock-keyword-face' and the text will get
+     the face configured for the respective macro class.  If no TeX
+     group is present, the latter face will be applied to the macro
+     itself.
+
+  3. Simple macros of the form `\foo' which do not have any arguments or
+     groupings.  The respective face will be applied to the macro
+     itself.
+
+   Customization variables for `\foo[bar]{baz}' type macros allow both
+the macro name and the sequence of arguments to be specified.  The
+latter is done with a string which can contain the characters
+`*'
+     indicating the existence of a starred variant for the macro,
+
+`['
+     for optional arguments in brackets,
+
+`{'
+     for mandatory arguments in braces,
+
+`\'
+     for mandatory arguments consisting of a single macro and
+
+`|'
+     as a prefix indicating that two alternatives are following.
+   For example the specifier for `\documentclass' would be `[{' because
+the macro has one optional followed by one mandatory argument.  The
+specifier for `\newcommand' would be `*|{\[[{' because there is a
+starred variant, the mandatory argument following the macro name can be
+a macro or a TeX group which can be followed by two optional arguments
+and the last token is a mandatory argument in braces.
+
+   Customization variables for the `{\foo text}' and `\foo' types are
+simple lists of strings where each entry is a macro name (without the
+leading backslash).
+
+General macro classes
+---------------------
+
+font-latex provides keyword lists for different macro classes which are
+described in the following table:
+
+`font-latex-match-function-keywords'
+     Keywords for macros defining or related to functions, like
+     `\newcommand'.
+     Type: `\macro[...]{...}'
+     Face: `font-lock-function-name-face'
+
+`font-latex-match-reference-keywords'
+     Keywords for macros defining or related to references, like `\ref'.
+     Type: `\macro[...]{...}'
+     Face: `font-lock-constant-face'
+
+`font-latex-match-textual-keywords'
+     Keywords for macros specifying textual content, like `\caption'.
+     Type: `\macro[...]{...}'
+     Face: `font-lock-type-face'
+
+`font-latex-match-variable-keywords'
+     Keywords for macros defining or related to variables, like
+     `\setlength'.
+     Type: `\macro[...]{...}'
+     Face: `font-lock-variable-name-face'
+
+`font-latex-match-warning-keywords'
+     Keywords for important macros, e.g. affecting line or page break,
+     like `\clearpage'.
+     Type: `\macro'
+     Face: `font-latex-warning-face'
+
+Sectioning commands
+-------------------
+
+Sectioning commands are macros like `\chapter' or `\section'.  For
+these commands there are two fontification schemes which may be
+selected by customizing the variable `font-latex-fontify-sectioning'.
+
+ -- User Option: font-latex-fontify-sectioning
+     Per default sectioning commands will be shown in a larger,
+     proportional font, which corresponds to a number for this
+     variable.  The font size varies with the sectioning level, e.g.
+     `\part' (`font-latex-sectioning-0-face') has a larger font than
+     `\paragraph' (`font-latex-sectioning-5-face').  Typically, values
+     from 1.05 to 1.3 for `font-latex-fontify-sectioning' give best
+     results, depending on your font setup.  If you rather like to use
+     the base font and a different color, set the variable to the symbol
+     `color'.  In this case the face `font-lock-type-face' will be used
+     to fontify the argument of the sectioning commands.
+
+   You can make font-latex aware of your own sectioning commands be
+adding them to the keyword lists:
+`font-latex-match-sectioning-0-keywords'
+(`font-latex-sectioning-0-face') ...
+`font-latex-match-sectioning-5-keywords'
+(`font-latex-sectioning-5-face').
+
+   Related to sectioning there is special support for slide titles which
+may be fontified with the face `font-latex-slide-title-face'.  You can
+add macros which should appear in this face by customizing the variable
+`font-latex-match-slide-title-keywords'.
+
+Commands for changing fonts
+---------------------------
+
+LaTeX provides various macros for changing fonts or font attributes.
+For example, you can select an italic font with `\textit{...}' or bold
+with `\textbf{...}'.  An alternative way to specify these fonts is to
+use special macros in TeX groups, like `{\itshape ...}' for italics and
+`{\bfseries ...}' for bold.  As mentioned above, we call the former
+variants commands and the latter declarations.
+
+   Besides the macros for changing fonts provided by LaTeX there is an
+infinite number of other macros--either defined by yourself for logical
+markup or defined by macro packages--which affect the font in the
+typeset text.  While LaTeX's built-in macros and macros of packages
+known by AUCTeX are already handled by font-latex, different keyword
+lists per type style and macro type are provided for entering your own
+macros which are listed in the table below.
+
+`font-latex-match-bold-command-keywords'
+     Keywords for commands specifying a bold type style.
+     Face: `font-latex-bold-face'
+
+`font-latex-match-italic-command-keywords'
+     Keywords for commands specifying an italic font.
+     Face: `font-latex-italic-face'
+
+`font-latex-match-math-command-keywords'
+     Keywords for commands specifying a math font.
+     Face: `font-latex-math-face'
+
+`font-latex-match-type-command-keywords'
+     Keywords for commands specifying a typewriter font.
+     Face: `font-lock-type-face'
+
+`font-latex-match-bold-declaration-keywords'
+     Keywords for declarations specifying a bold type style.
+     Face: `font-latex-bold-face'
+
+`font-latex-match-italic-declaration-keywords'
+     Keywords for declarations specifying an italic font.
+     Face: `font-latex-italic-face'
+
+`font-latex-match-type-declaration-keywords'
+     Keywords for declarations specifying a typewriter font.
+     Face: `font-latex-type-face'
+
+Deactivating defaults of built-in keyword classes
+-------------------------------------------------
+
+font-latex ships with predefined lists of keywords for the classes
+described above.  You can disable these defaults per class by
+customizing the variable `font-latex-deactivated-keyword-classes'.
+This is a list of strings for keyword classes to be deactivated.  Valid
+entries are "warning", "variable", "reference", "function" ,
+"sectioning-0", "sectioning-1", "sectioning-2", "sectioning-3",
+"sectioning-4", "sectioning-5", "textual", "bold-command",
+"italic-command", "math-command", "type-command", "bold-declaration",
+"italic-declaration", "type-declaration".
+
+   You can also get rid of certain keywords only.  For example if you
+want to remove highlighting of footnotes as references you can put the
+following stanza into your init file:
+
+     (eval-after-load "font-latex"
+       '(setq-default
+         font-latex-match-reference-keywords-local
+         (remove "footnote" font-latex-match-reference-keywords-local)))
+
+   But note that this means fiddling with font-latex's internals and is
+not guaranteed to work in future versions of font-latex.
+
+User-defined keyword classes
+----------------------------
+
+In case the customization options explained above do not suffice for
+your needs, you can specify your own keyword classes by customizing the
+variable `font-latex-user-keyword-classes'.
+
+ -- User Option: font-latex-user-keyword-classes
+     Every keyword class consists of four parts, a name, a list of
+     keywords, a face and a specifier for the type of macros to be
+     highlighted.
+
+     When adding new entries, you have to use unique values for the
+     class names, i.e. they must not clash with names of the built-in
+     keyword classes or other names given by you.  Additionally the
+     names must not contain spaces.
+
+     The list of keywords defines which commands and declarations
+     should be covered by the keyword class.  A keyword can either be a
+     simple command name omitting the leading backslash or a list
+     consisting of the command name and a string specifying the
+     sequence of arguments for the command.
+
+     The face argument can either be an existing face or font
+     specifications made by you.  (The latter option is not available
+     on XEmacs.)
+
+     There are three alternatives for the type of keywords--"Command
+     with arguments", "Declaration inside TeX group" and "Command
+     without arguments"--which correspond with the macro types
+     explained above.
+
+\1f
+File: auctex.info,  Node: Fontification of quotes,  Next: Fontification of math,  Prev: Fontification of macros,  Up: Font Locking
+
+3.1.2 Fontification of quotes
+-----------------------------
+
+Text in quotation marks is displayed with the face
+`font-latex-string-face'.  Besides the various forms of opening and
+closing double and single quotation marks, so-called guillemets (<<, >>)
+can be used for quoting.  Because there are two styles of using
+them--French style: << text >>; German style: >>text<<--you can
+customize the variable `font-latex-quotes' to tell font-latex which
+type you are using if the correct value cannot be derived from document
+properties.
+
+ -- User Option: font-latex-quotes
+     The default value of `font-latex-quotes' is `auto' which means
+     that font-latex will try to derive the correct type of quotation
+     mark matching from document properties like the language option
+     supplied to the babel LaTeX package.
+
+     If the automatic detection fails for you and you mostly use one
+     specific style you can set it to a specific language-dependent
+     value as well.  Set the value to `german' if you are using
+     >>German quotes<< and to `french' if you are using << French
+     quotes >>.  font-latex will recognize the different ways these
+     quotes can be given in your source code, i.e. (`"<', `">'), (`<<',
+     `>>') and the respective 8-bit variants.
+
+     If you set `font-latex-quotes' to nil, quoted content will not be
+     fontified.
+
+\1f
+File: auctex.info,  Node: Fontification of math,  Next: Verbatim content,  Prev: Fontification of quotes,  Up: Font Locking
+
+3.1.3 Fontification of mathematical constructs
+----------------------------------------------
+
+In LaTeX mathematics can be indicated by a variety of different
+methods: toggles (like dollar signs), macros and environments.  Math
+constructs known by font-latex are displayed with the face
+`font-latex-math-face'.  Support for dollar signs and shorthands like
+`\(...\)' or `\[...\]' is built-in and not customizable.  Support for
+other math macros and environments can be adapted by customizing the
+variables `font-latex-match-math-command-keywords' and
+`font-latex-math-environments' respectively.
+
+   In order to make math constructs more readable, font-latex displays
+subscript and superscript parts in a smaller font and raised or lowered
+respectively.  This fontification feature can be controlled with the
+variables `font-latex-fontify-script' and `font-latex-script-display'.
+
+ -- User Option: font-latex-fontify-script
+     If non-nil, fontify subscript and superscript strings.
+
+     Note that this feature is not available on XEmacs, for which it is
+     disabled per default.  In GNU Emacs raising and lowering is not
+     enabled for versions 21.3 and before due to it working not
+     properly.
+
+ -- User Option: font-latex-script-display
+     Display specification for subscript and superscript content.  The
+     car is used for subscript, the cdr is used for superscript.  The
+     feature is implemented using so-called display properties.  For
+     information on what exactly to specify for the values, see *note
+     Other Display Specifications: (elisp)Other Display Specs.
+
+\1f
+File: auctex.info,  Node: Verbatim content,  Next: Faces,  Prev: Fontification of math,  Up: Font Locking
+
+3.1.4 Verbatim macros and environments
+--------------------------------------
+
+Usually it is not desirable to have content to be typeset verbatim
+highlighted according to LaTeX syntax.  Therefore this content will be
+fontified uniformly with the face `font-latex-verbatim-face'.
+
+   font-latex differentiates three different types of verbatim
+constructs for fontification.  Macros with special characters like | as
+delimiters, macros with braces, and environments.  Which macros and
+environments are recognized is controlled by the variables
+`LaTeX-verbatim-macros-with-delims',
+`LaTeX-verbatim-macros-with-braces', and `LaTeX-verbatim-environments'
+respectively.
+
+\1f
+File: auctex.info,  Node: Faces,  Next: Known problems,  Prev: Verbatim content,  Up: Font Locking
+
+3.1.5 Faces used by font-latex
+------------------------------
+
+In case you want to change the colors and fonts used by font-latex
+please refer to the faces mentioned in the explanations above and use
+`M-x customize-face RET <face> RET'.  All faces defined by font-latex
+are accessible through a customization group by typing `M-x
+customize-group RET font-latex-highlighting-faces RET'.
+
+\1f
+File: auctex.info,  Node: Known problems,  Prev: Faces,  Up: Font Locking
+
+3.1.6 Known fontification problems
+----------------------------------
+
+In certain cases the fontification machinery fails to interpret buffer
+contents correctly.  This can lead to color bleed, i.e. large parts of a
+buffer get fontified with an inappropriate face.  A typical situation
+for this to happen is the use of a dollar sign (`$') in a verbatim
+macro or environment.  If font-latex is not aware of the verbatim
+construct, it assumes the dollar sign to be a toggle for mathematics and
+fontifies the following buffer content with the respective face until it
+finds a closing dollar sign or till the end of the buffer.
+
+   As a remedy you can make the verbatim construct known to font-latex,
+*note Verbatim content::.  If this is not possible, you can insert a
+commented dollar sign (`%$') at the next suitable end of line as a
+quick workaround.
+
+\1f
+File: auctex.info,  Node: Folding,  Next: Outline,  Prev: Font Locking,  Up: Display
+
+3.2 Folding Macros and Environments
+===================================
+
+A popular complaint about markup languages like TeX and LaTeX is that
+there is too much clutter in the source text and that one cannot focus
+well on the content.  There are macros where you are only interested in
+the content they are enclosing, like font specifiers where the content
+might already be fontified in a special way by font locking.  Or macros
+the content of which you only want to see when actually editing it,
+like footnotes or citations.  Similarly you might find certain
+environments or comments distracting when trying to concentrate on the
+body of your document.
+
+   With AUCTeX's folding functionality you can collapse those items and
+replace them by a fixed string, the content of one of their arguments,
+or a mixture of both.  If you want to make the original text visible
+again in order to view or edit it, move point sideways onto the
+placeholder (also called display string) or left-click with the mouse
+pointer on it.  (The latter is currently only supported on Emacs.)  The
+macro or environment will unfold automatically, stay open as long as
+point is inside of it and collapse again once you move point out of it.
+(Note that folding of environments currently does not work in every
+AUCTeX mode.)
+
+   In order to use this feature, you have to activate `TeX-fold-mode'
+which will activate the auto-reveal feature and the necessary commands
+to hide and show macros and environments.  You can activate the mode in
+a certain buffer by typing the command `M-x TeX-fold-mode RET' or using
+the keyboard shortcut `C-c C-o C-f'.  If you want to use it every time
+you edit a LaTeX document, add it to a hook: 
+
+     (add-hook 'LaTeX-mode-hook (lambda ()
+                                  (TeX-fold-mode 1)))
+
+   If it should be activated in all AUCTeX modes, use `TeX-mode-hook'
+instead of `LaTeX-mode-hook'.
+
+   Once the mode is active there are several commands available to hide
+and show macros, environments and comments:
+
+ -- Command: TeX-fold-buffer
+     (`C-c C-o C-b') Hide all foldable items in the current buffer
+     according to the setting of `TeX-fold-type-list'.
+
+     If you want to have this done automatically every time you open a
+     file, add it to a hook and make sure the function is called after
+     font locking is set up for the buffer.  The following code should
+     accomplish this:
+
+          (add-hook 'find-file-hook 'TeX-fold-buffer t)
+
+     The command can be used any time to refresh the whole buffer and
+     fold any new macros and environments which were inserted after the
+     last invocation of the command.
+
+ -- User Option: TeX-fold-type-list
+     List of symbols determining the item classes to consider for
+     folding.  This can be macros, environments and comments.  Per
+     default only macros and environments are folded.
+
+ -- User Option: TeX-fold-force-fontify
+     In order for all folded content to get the right faces, the whole
+     buffer has to be fontified before folding is carried out.
+     `TeX-fold-buffer' therefore will force fontification of unfontified
+     regions.  As this will prolong the time folding takes, you can
+     prevent forced fontification by customizing the variable
+     `TeX-fold-force-fontify'.
+
+ -- User Option: TeX-fold-preserve-comments
+     By default items found in comments will be folded.  If your
+     comments often contain unfinished code this might lead to
+     problems.  Give this variable a non-nil value and foldable items
+     in your comments will be left alone.
+
+ -- Command: TeX-fold-region
+     (`C-c C-o C-r') Hide all configured macros in the marked region.
+
+ -- Command: TeX-fold-paragraph
+     (`C-c C-o C-p') Hide all configured macros in the paragraph
+     containing point.
+
+ -- Command: TeX-fold-macro
+     (`C-c C-o C-m') Hide the macro on which point currently is located.
+     If the name of the macro is found in `TeX-fold-macro-spec-list',
+     the respective display string will be shown instead.  If it is not
+     found, the name of the macro in sqare brackets or the default
+     string for unspecified macros
+     (`TeX-fold-unspec-macro-display-string') will be shown, depending
+     on the value of the variable `TeX-fold-unspec-use-name'.
+
+ -- Command: TeX-fold-env
+     (`C-c C-o C-e') Hide the environment on which point currently is
+     located.  The behavior regarding the display string is analogous to
+     `TeX-fold-macro' and determined by the variables
+     `TeX-fold-env-spec-list' and `TeX-fold-unspec-env-display-string'
+     respectively.
+
+ -- Command: TeX-fold-math
+     Hide the math macro on which point currently is located.  If the
+     name of the macro is found in `TeX-fold-math-spec-list', the
+     respective display string will be shown instead.  If it is not
+     found, the name of the macro in sqare brackets or the default
+     string for unspecified macros
+     (`TeX-fold-unspec-macro-display-string') will be shown, depending
+     on the value of the variable `TeX-fold-unspec-use-name'.
+
+ -- Command: TeX-fold-comment
+     (`C-c C-o C-c') Hide the comment point is located on.
+
+ -- Command: TeX-fold-clearout-buffer
+     (`C-c C-o b') Permanently unfold all macros and environments in the
+     current buffer.
+
+ -- Command: TeX-fold-clearout-region
+     (`C-c C-o r') Permanently unfold all macros and environments in the
+     marked region.
+
+ -- Command: TeX-fold-clearout-paragraph
+     (`C-c C-o p') Permanently unfold all macros and environments in the
+     paragraph containing point.
+
+ -- Command: TeX-fold-clearout-item
+     (`C-c C-o i') Permanently show the macro or environment on which
+     point currently is located.  In contrast to temporarily opening the
+     macro when point is moved sideways onto it, the macro will be
+     permanently unfolded and will not collapse again once point is
+     leaving it.
+
+ -- Command: TeX-fold-dwim
+     (`C-c C-o C-o') Hide or show items according to the current
+     context.  If there is folded content, unfold it.  If there is a
+     marked region, fold all configured content in this region.  If
+     there is no folded content but a macro or environment, fold it.
+
+   In case you want to use a different prefix than `C-c C-o' for these
+commands you can customize the variable `TeX-fold-command-prefix'.
+(Note that this will not change the key binding for activating the
+mode.)
+
+   The commands above will only take macros or environments into
+consideration which are specified in the variables
+`TeX-fold-macro-spec-list' or `TeX-fold-env-spec-list' respectively.
+
+ -- User Option: TeX-fold-macro-spec-list
+     List of replacement specifiers and macros to fold.  The specifier
+     can be a string, an integer or a function symbol.
+
+     If you specify a string, it will be used as a display replacement
+     for the whole macro.  Numbers in braces, brackets, parens or angle
+     brackets will be replaced by the respective macro argument.  For
+     example `{1}' will be replaced by the first mandatory argument of
+     the macro.  One can also define alternatives within the specifier
+     which are used if an argument is not found.  Alternatives are
+     separated by `||'.  They are most useful with optional arguments.
+     As an example, the default specifier for `\item' is `[1]:||*' which
+     means that if there is an optional argument, its value is shown
+     followed by a colon.  If there is no optional argument, only an
+     asterisk is used as the display string.
+
+     If you specify a number as the first element, the content of the
+     respective mandatory argument of a LaTeX macro will be used as the
+     placeholder.
+
+     If the first element is a function symbol, the function will be
+     called with all mandatory arguments of the macro and the result of
+     the function call will be used as a replacement for the macro.
+
+     The placeholder is made by copying the text from the buffer
+     together with its properties, i.e. its face as well.  If
+     fontification has not happened when this is done (e.g. because of
+     lazy font locking) the intended fontification will not show up.
+     As a workaround you can leave Emacs idle a few seconds and wait
+     for stealth font locking to finish before you fold the buffer.  Or
+     you just re-fold the buffer with `TeX-fold-buffer' when you notice
+     a wrong fontification.
+
+ -- User Option: TeX-fold-env-spec-list
+     List of display strings or argument numbers and environments to
+     fold.  Argument numbers refer to the `\begin' statement.  That
+     means if you have e.g. `\begin{tabularx}{\linewidth}{XXX} ...
+     \end{tabularx}' and specify 3 as the argument number, the resulting
+     display string will be "XXX".
+
+ -- User Option: TeX-fold-math-spec-list
+     List of display strings and math macros to fold.
+
+   The variables `TeX-fold-macro-spec-list', `TeX-fold-env-spec-list',
+and `TeX-fold-math-spec-list' apply to any AUCTeX mode.  If you want to
+make settings which are only applied to LaTeX mode, you can use the
+mode-specific variables `LaTeX-fold-macro-spec-list',
+`LaTeX-fold-env-spec-list', and `LaTeX-fold-math-spec-list'
+
+ -- User Option: TeX-fold-unspec-macro-display-string
+     Default display string for macros which are not specified in
+     `TeX-fold-macro-spec-list'.
+
+ -- User Option: TeX-fold-unspec-env-display-string
+     Default display string for environments which are not specified in
+     `TeX-fold-env-spec-list'.
+
+ -- User Option: TeX-fold-unspec-use-name
+     If non-nil the name of the macro or environment surrounded by
+     square brackets is used as display string, otherwise the defaults
+     specified in `TeX-fold-unspec-macro-display-string' or
+     `TeX-fold-unspec-env-display-string' respectively.
+
+   When you hover with the mouse pointer over folded content, its
+original text will be shown in a tooltip or the echo area depending on
+Tooltip mode being activate.  In order to avoid exorbitantly big
+tooltips and to cater for the limited space in the echo area the
+content will be cropped after a certain amount of characters defined by
+the variable `TeX-fold-help-echo-max-length'.
+
+ -- User Option: TeX-fold-help-echo-max-length
+     Maximum length of original text displayed in a tooltip or the echo
+     area for folded content.  Set it to zero in order to disable this
+     feature.
+
+\1f
+File: auctex.info,  Node: Outline,  Prev: Folding,  Up: Display
+
+3.3 Outlining the Document
+==========================
+
+AUCTeX supports the standard outline minor mode using LaTeX/ConTeXt
+sectioning commands as header lines.  *Note Outline Mode:
+(emacs)Outline Mode.
+
+   You can add your own headings by setting the variable
+`TeX-outline-extra'.
+
+ -- Variable: TeX-outline-extra
+     List of extra TeX outline levels.
+
+     Each element is a list with two entries.  The first entry is the
+     regular expression matching a header, and the second is the level
+     of the header.  A `^' is automatically prepended to the regular
+     expressions in the list, so they must match text at the beginning
+     of the line.
+
+     See `LaTeX-section-list' or `ConTeXt-INTERFACE-section-list' for
+     existing header levels.
+
+   The following example add `\item' and `\bibliography' headers, with
+`\bibliography' at the same outline level as `\section', and `\item'
+being below `\subparagraph'.
+
+     (setq TeX-outline-extra
+           '(("[ \t]*\\\\\\(bib\\)?item\\b" 7)
+       ("\\\\bibliography\\b" 2)))
+
+   You may want to check out the unbundled `out-xtra' package for even
+better outline support.  It is available from your favorite emacs lisp
+archive.
+
+\1f
+File: auctex.info,  Node: Processing,  Next: Customization,  Prev: Display,  Up: Top
+
+4 Starting Processors, Viewers and Other Programs
+*************************************************
+
+The most powerful features of AUCTeX may be those allowing you to run
+TeX, LaTeX, ConTeXt and other external commands like BibTeX and
+`makeindex' from within Emacs, viewing and printing the results, and
+moreover allowing you to _debug_ your documents.
+
+   AUCTeX comes with a special tool bar for TeX and LaTeX which
+provides buttons for the most important commands.  You can enable or
+disable it by customizing the options `plain-TeX-enable-toolbar' and
+`LaTeX-enable-toolbar' in the `TeX-tool-bar' customization group.
+
+* Menu:
+
+* Commands::                    Invoking external commands.
+* Viewing::                     Invoking external viewers.
+* Debugging::                   Debugging TeX and LaTeX output.
+* Checking::                    Checking the document.
+* Control::                     Controlling the processes.
+* Cleaning::                    Cleaning intermediate and output files.
+* Documentation::               Documentation about macros and packages.
+
+\1f
+File: auctex.info,  Node: Commands,  Next: Viewing,  Up: Processing
+
+4.1 Executing Commands
+======================
+
+Formatting the document with TeX, LaTeX or ConTeXt, viewing with a
+previewer, printing the document, running BibTeX, making an index, or
+checking the document with `lacheck' or `chktex' all require running an
+external command.
+
+* Menu:
+
+* Starting a Command::          Starting a Command on a Document or Region
+* Selecting a Command::         Selecting and Executing a Command
+* Processor Options::           Options for TeX Processors
+
+\1f
+File: auctex.info,  Node: Starting a Command,  Next: Selecting a Command,  Up: Commands
+
+4.1.1 Starting a Command on a Document or Region
+------------------------------------------------
+
+There are two ways to run an external command, you can either run it on
+the current document with `TeX-command-master', or on the current
+region with `TeX-command-region'.  A special case of running TeX on a
+region is `TeX-command-buffer' which differs from `TeX-command-master'
+if the current buffer is not its own master file.
+
+ -- Command: TeX-command-master
+     (`C-c C-c')  Query the user for a command, and run it on the master
+     file associated with the current buffer.  The name of the master
+     file is controlled by the variable `TeX-master'.  The available
+     commands are controlled by the variable `TeX-command-list'.  
+
+ -- Command: TeX-command-region
+     (`C-c C-r') Query the user for a command, and run it on the
+     contents of the selected region.  The region contents are written
+     into the region file, after extracting the header and trailer from
+     the master file.  If mark is inactive (which can happen with
+     Transient Mark mode), use the old region.  See also the command
+     `TeX-pin-region' about how to fix a region.
+
+     The name of the region file is controlled by the variable
+     `TeX-region'.  The name of the master file is controlled by the
+     variable `TeX-master'.  The header is all text up to the line
+     matching the regular expression `TeX-header-end'.  The trailer is
+     all text from the line matching the regular expression
+     `TeX-trailer-start'.  The available commands are controlled by the
+     variable `TeX-command-list'.  
+
+ -- Command: TeX-command-buffer
+     (`C-c C-b') Query the user for a command, and apply it to the
+     contents of the current buffer.  The buffer contents are written
+     into the region file, after extracting the header and trailer from
+     the master file.  The command is then actually run on the region
+     file.  See above for details.
+
+ -- User Option: TeX-region
+     The name of the file for temporarily storing the text when
+     formatting the current region.
+
+ -- User Option: TeX-header-end
+     A regular expression matching the end of the header.  By default,
+     this is `\begin{document}' in LaTeX mode and `%**end of header' in
+     TeX mode.
+
+ -- User Option: TeX-trailer-start
+     A regular expression matching the start of the trailer.  By
+     default, this is `\end{document}' in LaTeX mode and `\bye' in TeX
+     mode.
+
+   If you want to change the values of `TeX-header-end' and
+`TeX-trailer-start' you can do this for all files by setting the
+variables in a mode hook or per file by specifying them as file
+variables (*note File Variables: (emacs)File Variables.).
+
+ -- Command: TeX-pin-region
+     (`C-c C-t C-r') If you don't have a mode like Transient Mark mode
+     active, where marks get disabled automatically, the region would
+     need to get properly set before each call to `TeX-command-region'.
+     If you fix the current region with `C-c C-t C-r', then it will get
+     used for more commands even though mark and point may change.  An
+     explicitly activated mark, however, will always define a new
+     region when calling `TeX-command-region'.
+
+   AUCTeX will allow one process for each document, plus one process
+for the region file to be active at the same time.  Thus, if you are
+editing N different documents, you can have N plus one processes
+running at the same time.  If the last process you started was on the
+region, the commands described in *note Debugging:: and *note Control::
+will work on that process, otherwise they will work on the process
+associated with the current document.
+
+\1f
+File: auctex.info,  Node: Selecting a Command,  Next: Processor Options,  Prev: Starting a Command,  Up: Commands
+
+4.1.2 Selecting and Executing a Command
+---------------------------------------
+
+Once you started the command selection with `C-c C-c', `C-c C-s' or
+`C-c C-b' you will be prompted for the type of command.  AUCTeX will
+try to guess which command is appropriate in the given situation and
+propose it as default.  Usually this is a processor like `TeX' or
+`LaTeX' if the document was changed or a viewer if the document was
+just typeset.  Other commands can be selected in the minibuffer with
+completion support by typing <TAB>.
+
+   The available commands are defined by the variable
+`TeX-command-list'.  Per default it includes commands for typesetting
+the document (e.g. `LaTeX'), for viewing the output (`View'), for
+printing (`Print'), for generating an index (`Index') or for spell
+checking (`Spell') to name but a few.  You can also add your own
+commands by adding entries to `TeX-command-list'.  Refer to its doc
+string for information about its syntax.  You might also want to look
+at `TeX-expand-list' to learn about the expanders you can use in
+`TeX-command-list'.
+
+   Note that the default of the variable occasionally changes.
+Therefore it is advisable to add to the list rather than overwriting
+it.  You can do this with a call to `add-to-list' in your init file.
+For example, if you wanted to add a command for running a program called
+`foo' on the master or region file, you could do this with the
+following form.
+
+     (eval-after-load "tex"
+       '(add-to-list 'TeX-command-list
+               '("Foo" "foo %s" TeX-run-command t t :help "Run foo") t))
+
+   As mentioned before, AUCTeX will try to guess what command you want
+to invoke.  If you want to use another command than `TeX', `LaTeX' or
+whatever processor AUCTeX thinks is appropriate for the current mode,
+set the variable `TeX-command-default'.  You can do this for all files
+by setting it in a mode hook or per file by specifying it as a file
+variable (*note File Variables: (emacs)File Variables.).
+
+ -- User Option: TeX-command-default
+     The default command to run in this buffer.  Must be an entry in
+     `TeX-command-list'.
+
+   After confirming a command to execute, AUCTeX will try to save any
+buffers related to the document, and check if the document needs to be
+reformatted.  If the variable `TeX-save-query' is non-nil, AUCTeX will
+query before saving each file.  By default AUCTeX will check emacs
+buffers associated with files in the current directory, in one of the
+`TeX-macro-private' directories, and in the `TeX-macro-global'
+directories.  You can change this by setting the variable
+`TeX-check-path'.
+
+ -- User Option: TeX-check-path
+     Directory path to search for dependencies.
+
+     If nil, just check the current file.  Used when checking if any
+     files have changed.
+
+\1f
+File: auctex.info,  Node: Processor Options,  Prev: Selecting a Command,  Up: Commands
+
+4.1.3 Options for TeX Processors
+--------------------------------
+
+There are some options you can customize affecting which processors are
+invoked or the way this is done and which output they produce as a
+result.  These options control if DVI or PDF output should be produced,
+if TeX should be started in interactive or nonstop mode, if source
+specials or a SyncTeX file should be produced for making inverse and
+forward search possible or which TeX engine should be used instead of
+regular TeX, like PDFTeX, Omega or XeTeX.
+
+ -- Command: TeX-PDF-mode
+     (`C-c C-t C-p') This command toggles the PDF mode of AUCTeX, a
+     buffer-local minor mode.  You can customize `TeX-PDF-mode' to give
+     it a different default.  The default is used when AUCTeX does not
+     have additional clue about what a document might want.  This
+     option usually results in calling either PDFTeX or ordinary TeX.
+
+ -- User Option: TeX-DVI-via-PDFTeX
+     If this is set, DVI will also be produced by calling PDFTeX,
+     setting `\pdfoutput=0'.  This makes it possible to use PDFTeX
+     features like character protrusion even when producing DVI files.
+     Contemporary TeX distributions do this anyway, so that you need
+     not enable the option within AUCTeX.
+
+ -- Command: TeX-interactive-mode
+     (`C-c C-t C-i') This command toggles the interactive mode of
+     AUCTeX, a global minor mode.  You can customize
+     `TeX-interactive-mode' to give it a different default.  In
+     interactive mode, TeX will pause with an error prompt when errors
+     are encountered and wait for the user to type something.
+
+ -- Command: TeX-source-correlate-mode
+     (`C-c C-t C-s') Toggles support for forward and inverse search.
+     Forward search refers to jumping to the place in the previewed
+     document corresponding to where point is located in the document
+     source and inverse search to the other way round.  *Note I/O
+     Correlation::.
+
+     You can permanently activate `TeX-source-correlate-mode' by
+     customizing the variable `TeX-source-correlate-mode'.  There is a
+     bunch of customization options for the mode, use `M-x
+     customize-group <RET> TeX-view <RET>' to find out more.
+
+     AUCTeX is aware of three different means to do I/O correlation:
+     source specials (only DVI output), the pdfsync LaTeX package (only
+     PDF output) and SyncTeX.  The choice between source specials and
+     SyncTeX can be controlled with the variable
+     `TeX-source-correlate-method'.
+
+     Should you use source specials it has to be stressed _very_
+     strongly however, that source specials can cause differences in
+     page breaks and spacing, can seriously interfere with various
+     packages and should thus _never_ be used for the final version of
+     a document.  In particular, fine-tuning the page breaks should be
+     done with source specials switched off.
+
+   AUCTeX also allows you to easily select different TeX engines for
+processing, either by using the entries in the `TeXing Options' submenu
+below the `Command' menu or by calling the function `TeX-engine-set'.
+These eventually set the variable `TeX-engine' which you can also
+modify directly.
+
+ -- User Option: TeX-engine
+     This variable allows you to choose which TeX engine should be used
+     for typesetting the document, i.e. the executables which will be
+     used when you invoke the `TeX' or `LaTeX' commands.  The value
+     should be one of the symbols defined in `TeX-engine-alist-builtin'
+     or `TeX-engine-alist'.  The symbols `default', `xetex', `luatex'
+     and `omega' are available from the built-in list.
+
+   Note that `TeX-engine' is buffer-local, so setting the variable
+directly or via the above mentioned menu or function will not take
+effect in other buffers.  If you want to activate an engine for all
+AUCTeX modes, set `TeX-engine' in your init file, e.g. by using `M-x
+customize-variable <RET>'.  If you want to activate it for a certain
+AUCTeX mode only, set the variable in the respective mode hook.  If you
+want to activate it for certain files, set it through file variables
+(*note File Variables: (emacs)File Variables.).
+
+   Should you need to change the executable names related to the
+different engine settings, there are some variables you can tweak.
+Those are `TeX-command', `LaTeX-command', `TeX-Omega-command',
+`LaTeX-Omega-command', `ConTeXt-engine' and `ConTeXt-Omega-engine'.
+The rest of the executables is defined directly in
+`TeX-engine-alist-builtin'.  If you want to override an entry from
+that, add an entry to `TeX-engine-alist' that starts with the same
+symbol as that the entry in the built-in list and specify the
+executables you want to use instead.  You can also add entries to
+`TeX-engine-alist' in order to add support for engines not covered per
+default.
+
+ -- User Option: TeX-engine-alist
+     Alist of TeX engines and associated commands.  Each entry is a
+     list with a maximum of five elements.  The first element is a
+     symbol used to identify the engine.  The second is a string
+     describing the engine.  The third is the command to be used for
+     plain TeX.  The fourth is the command to be used for LaTeX.  The
+     fifth is the command to be used for the `--engine' parameter of
+     ConTeXt's `texexec' program.  Each command can either be a
+     variable or a string.  An empty string or nil means there is no
+     command available.
+
+   You can customize AUCTeX to show the processor output as it is
+produced.
+
+ -- User Option: TeX-show-compilation
+     If non-nil, the output of TeX compilation is shown in another
+     window.
+
+\1f
+File: auctex.info,  Node: Viewing,  Next: Debugging,  Prev: Commands,  Up: Processing
+
+4.2 Viewing the Formatted Output
+================================
+
+AUCTeX allows you to start external programs for previewing the
+formatted output of your document.
+
+* Menu:
+
+* Starting Viewers::            Starting viewers
+* I/O Correlation::             Forward and inverse search
+
+\1f
+File: auctex.info,  Node: Starting Viewers,  Next: I/O Correlation,  Up: Viewing
+
+4.2.1 Starting Viewers
+----------------------
+
+Viewers are normally invoked by pressing `C-c C-c' once the document is
+formatted, which will propose the View command, or by activating the
+respective entry in the Command menu.  Alternatively you can type `C-c
+C-v' which calls the function `TeX-view'.
+
+ -- Command: TeX-view
+     (`C-c C-v') Start a viewer without confirmation.  The viewer is
+     started either on a region or the master file, depending on the
+     last command issued.  This is especially useful for jumping to the
+     location corresponding to point in the viewer when using
+     `TeX-source-correlate-mode'.
+
+   AUCTeX will try to guess which type of viewer (DVI, PostScript or
+PDF) has to be used and what options are to be passed over to it.  This
+decision is based on the output files present in the working directory
+as well as the class and style options used in the document.  For
+example, if there is a DVI file in your working directory, a DVI viewer
+will be invoked.  In case of a PDF file it will be a PDF viewer.  If
+you specified a special paper format like `a5paper' or use the
+`landscape' option, this will be passed to the viewer by the
+appropriate options.  Especially some DVI viewers depend on this kind
+of information in order to display your document correctly.  In case
+you are using `pstricks' or `psfrag' in your document, a DVI viewer
+cannot display the contents correctly and a PostScript viewer will be
+invoked instead.
+
+   The association between the tests for the conditions mentioned above
+and the viewers is made in the variable `TeX-view-program-selection'.
+Therefore this variable is the starting point for customization if you
+want to use other viewers than the ones suggested by default.
+
+ -- User Option: TeX-view-program-selection
+     This is a list of predicates and viewers which is evaluated from
+     front to back in order to find out which viewer to call under the
+     given conditions.  In the first element of each list item you can
+     reference one or more predicates defined in
+     `TeX-view-predicate-list' or `TeX-view-predicate-list-builtin'.
+     In the second element you can reference a viewer defined in
+     `TeX-view-program-list' or `TeX-view-program-list-builtin'.  The
+     viewer of the first item with a positively evaluated predicate is
+     selected.
+
+   So `TeX-view-program-selection' only contains references to the
+actual implementations of predicates and viewer commands respectively
+which can be found elsewhere.  AUCTeX comes with a set of preconfigured
+predicates and viewer commands which are stored in the variables
+`TeX-view-predicate-list-builtin' and `TeX-view-program-list-builtin'
+respectively.  If you are not satisfied with those and want to
+overwrite one of them or add your own definitions, you can do so via
+the variables `TeX-view-predicate-list' and `TeX-view-program-list'.
+
+ -- User Option: TeX-view-predicate-list
+     This is a list of predicates for viewer selection and invocation.
+     The first element of each list item is a symbol and the second
+     element a Lisp form to be evaluated.  The form should return nil
+     if the predicate is not fulfilled.
+
+     A built-in predicate from `TeX-view-predicate-list-builtin' can be
+     overwritten by defining a new predicate with the same symbol.
+
+ -- User Option: TeX-view-program-list
+     This is a list of viewer specifications each consisting of a
+     symbolic name and either a command line or a function to be
+     invoked when the viewer is called.  If a command line is used,
+     parts of it can be conditionalized by prefixing them with
+     predicates from `TeX-view-predicate-list' or
+     `TeX-view-predicate-list-builtin'.  (See the doc string for the
+     exact format to use.)  The command line can also contain
+     placeholders as defined in `TeX-expand-list' which are expanded
+     before the viewer is called.
+
+     A built-in viewer spec from `TeX-view-program-list-builtin' can be
+     overwritten by defining a new viewer spec with the same name.
+
+   Note that the viewer selection and invocation as described above will
+only work if certain default settings in AUCTeX are intact.  For one,
+the whole viewer selection machinery will only be triggered if the `%V'
+expander in `TeX-expand-list' is unchanged.  So if you have trouble
+with the viewer invocation you might check if there is an older
+customization of the variable in place.  In addition, the use of a
+function in `TeX-view-program-list' only works if the View command in
+`TeX-command-list' makes use of the hook `TeX-run-discard-or-function'.
+
+   Note also that the implementation described above replaces an older
+one which was less flexible.  This old implementation works with the
+variables `TeX-output-view-style' and `TeX-view-style' which are used
+to associate file types and style options with viewers.  If desired you
+can reactivate it by using the placeholder `%vv' for the View command
+in `TeX-command-list'.  Note however, that it is bound to be removed
+from AUCTeX once the new implementation proved to be satisfactory.  For
+the time being, find a short description of the mentioned customization
+options below.
+
+ -- User Option: TeX-output-view-style
+     List of output file extensions, style options and view options.
+     Each item of the list consists of three elements.  If the first
+     element (a regular expression) matches the output file extension,
+     and the second element (a regular expression) matches the name of
+     one of the style options, any occurrence of the string `%V' in a
+     command in `TeX-command-list' will be replaced with the third
+     element.
+
+ -- User Option: TeX-view-style
+     List of style options and view options.  This is the predecessor of
+     `TeX-output-view-style' which does not provide the possibility to
+     specify output file extensions.  It is used as a fallback in case
+     none of the alternatives specified in `TeX-output-view-style'
+     match.  In case none of the entries in `TeX-view-style' match
+     either, no suggestion for a viewer is made.
+
+\1f
+File: auctex.info,  Node: I/O Correlation,  Prev: Starting Viewers,  Up: Viewing
+
+4.2.2 Forward and Inverse Search
+--------------------------------
+
+Forward and inverse search refer to the correlation between the document
+source in the editor and the typeset document in the viewer.  Forward
+search allows you to jump to the place in the previewed document
+corresponding to a certain line in the document source and inverse
+search vice versa.
+
+   AUCTeX supports three methods for forward and inverse search: source
+specials (only DVI output), the pdfsync LaTeX package (only PDF output)
+and SyncTeX (any type of output).  If you want to make use of forward
+and inverse searching with source specials or SyncTeX, switch on
+`TeX-source-correlate-mode'.  *Note Processor Options::, on how to do
+that.  The use of the pdfsync package is detected automatically if
+document parsing is enabled.
+
+   Forward search happens automatically upon calling the viewer, e.g. by
+typing `C-c C-v' (`TeX-view').  This will open the viewer or bring it
+to front and display the output page corresponding to the position of
+point in the source file.  AUCTeX will automatically pass the necessary
+command line options to the viewer for this to happen.
+
+   Upon opening the viewer you will be asked if you want to start a
+server process (Gnuserv or Emacs server) which is necessary for inverse
+search.  This happens only if there is no server running already.  You
+can customize the variable `TeX-source-correlate-start-server' to
+inhibit the question and always or never start the server respectively.
+
+ -- User Option: TeX-source-correlate-start-server
+     If `TeX-source-correlate-mode' is active and a viewer is invoked,
+     the default behavior is to ask if a server process should be
+     started.  Set this variable to `t' if the question should be
+     inhibited and the server should always be started.  Set it to
+     `nil' if the server should never be started.  Inverse search will
+     not be available in the latter case.
+
+   Inverse search, i.e. jumping to the part of your document source in
+Emacs corresponding to a certain position in the viewer, is triggered
+from the viewer, typically by a mouse click.  Refer to the documentation
+of your viewer to find out how it has to be configured and what you have
+to do exactly.  In xdvi you normally have to use `C-down-mouse-1'.
+
+\1f
+File: auctex.info,  Node: Debugging,  Next: Checking,  Prev: Viewing,  Up: Processing
+
+4.3 Catching the errors
+=======================
+
+Once you've formatted your document you may `debug' it, i.e. browse
+through the errors (La)TeX reported.
+
+ -- Command: TeX-next-error
+     (`C-c `')  Go to the next error reported by TeX.  The view will be
+     split in two, with the cursor placed as close as possible to the
+     error in the top view.  In the bottom view, the error message will
+     be displayed along with some explanatory text.
+
+   Normally AUCTeX will only report real errors, but you may as well
+ask it to report `bad boxes' and warnings as well.
+
+ -- Command: TeX-toggle-debug-bad-boxes
+     (`C-c C-t C-b') Toggle whether AUCTeX should stop at bad boxes
+     (i.e. overfull and underfull boxes) as well as normal errors.
+
+ -- Command: TeX-toggle-debug-warnings
+     (`C-c C-t C-w') Toggle whether AUCTeX should stop at warnings as
+     well as normal errors.
+
+   As default, AUCTeX will display a special help buffer containing the
+error reported by TeX along with the documentation.  There is however
+an `expert' option, which allows you to display the real TeX output.
+
+ -- User Option: TeX-display-help
+     If t AUCTeX will automatically display a help text whenever an
+     error is encountered using `TeX-next-error' (`C-c `').  If nil a
+     terse information about the error is displayed in the echo area.
+     If `expert' AUCTeX will display the output buffer with the raw TeX
+     output.
+
+\1f
+File: auctex.info,  Node: Checking,  Next: Control,  Prev: Debugging,  Up: Processing
+
+4.4 Checking for problems
+=========================
+
+Running TeX or LaTeX will only find regular errors in the document, not
+examples of bad style.  Furthermore, description of the errors may
+often be confusing.  The utility `lacheck' can be used to find style
+errors, such as forgetting to escape the space after an abbreviation or
+using `...' instead of `\ldots' and many other problems like that.  You
+start `lacheck' with `C-c C-c Check <RET>'.  The result will be a list
+of errors in the `*compilation*' buffer.  You can go through the errors
+with `C-x `' (`next-error', *note Compilation: (emacs)Compilation.),
+which will move point to the location of the next error.
+
+   Another newer program which can be used to find errors is `chktex'.
+It is much more configurable than `lacheck', but doesn't find all the
+problems `lacheck' does, at least in its default configuration.  You
+must install the programs before using them, and for `chktex' you may
+also need modify `TeX-command-list' unless you use its `lacheck'
+compatibility wrapper.  You can get `lacheck' from
+`<URL:ftp://ftp.ctan.org/tex-archive/support/lacheck/>' or
+alternatively `chktex' from
+`<URL:ftp://ftp.ctan.org/tex-archive/support/chktex/>'.
+
+\1f
+File: auctex.info,  Node: Control,  Next: Cleaning,  Prev: Checking,  Up: Processing
+
+4.5 Controlling the output
+==========================
+
+A number of commands are available for controlling the output of an
+application running under AUCTeX
+
+ -- Command: TeX-kill-job
+     (`C-c C-k')  Kill currently running external application.  This
+     may be either of TeX, LaTeX, previewer, BibTeX, etc.
+
+ -- Command: TeX-recenter-output-buffer
+     (`C-c C-l')  Recenter the output buffer so that the bottom line is
+     visible.
+
+ -- Command: TeX-home-buffer
+     (`C-c ^') Go to the `master' file in the document associated with
+     the current buffer, or if already there, to the file where the
+     current process was started.
+
+\1f
+File: auctex.info,  Node: Cleaning,  Next: Documentation,  Prev: Control,  Up: Processing
+
+4.6 Cleaning intermediate and output files
+==========================================
+
+ -- Command: TeX-clean
+     Remove generated intermediate files.  In case a prefix argument is
+     given, remove output files as well.
+
+     Canonical access to the function is provided by the `Clean' and
+     `Clean All' entries in `TeX-command-list', invokable with `C-c
+     C-c' or the Command menu.
+
+     The patterns governing which files to remove can be adapted
+     separately for each AUCTeX mode by means of the variables
+     `plain-TeX-clean-intermediate-suffixes',
+     `plain-TeX-clean-output-suffixes',
+     `LaTeX-clean-intermediate-suffixes', `LaTeX-clean-output-suffixes',
+     `docTeX-clean-intermediate-suffixes',
+     `docTeX-clean-output-suffixes',
+     `Texinfo-clean-intermediate-suffixes',
+     `Texinfo-clean-output-suffixes',
+     `ConTeXt-clean-intermediate-suffixes' and
+     `ConTeXt-clean-output-suffixes'.
+
+ -- User Option: TeX-clean-confirm
+     Control if deletion of intermediate and output files has to be
+     confirmed before it is actually done.  If non-nil, ask before
+     deleting files.
+
+\1f
+File: auctex.info,  Node: Documentation,  Prev: Cleaning,  Up: Processing
+
+4.7 Documentation about macros and packages
+===========================================
+
+ -- Command: TeX-doc
+     (`C-c ?')  Get documentation about macros, packages or TeX & Co.
+     in general.  The function will prompt for the name of a command or
+     manual, providing a list of available keywords for completion.  If
+     point is on a command or word with available documentation, this
+     will be suggested as default.
+
+     In case no documentation could be found, a prompt for querying the
+     `texdoc' program is shown, should the latter be available.
+
+     The command can be invoked by the key binding mentioned above as
+     well as the `Find Documentation...' entry in the mode menu.
+
+\1f
+File: auctex.info,  Node: Customization,  Next: Appendices,  Prev: Processing,  Up: Top
+
+5 Customization and Extension
+*****************************
+
+* Menu:
+
+* Modes and Hooks::             Modes and Hooks
+* Multifile::                   Multifile Documents
+* Parsing Files::               Automatic Parsing of TeX Files
+* Internationalization::        Language Support
+* Automatic::                   Automatic Customization
+* Style Files::                 Writing Your Own Style Support
+
+\1f
+File: auctex.info,  Node: Modes and Hooks,  Next: Multifile,  Up: Customization
+
+5.1 Modes and Hooks
+===================
+
+AUCTeX supports a wide variety of derivatives and extensions of TeX.
+Besides plain TeX those are LaTeX, AMS-TeX, ConTeXt, Texinfo and
+docTeX.  For each of them there is a separate major mode in AUCTeX and
+each major mode runs `text-mode-hook', `TeX-mode-hook' as well as a
+hook special to the mode in this order.  The following table provides
+an overview of the respective mode functions and hooks.
+
+Type        Mode function      Hook
+------------------------------------------------------- 
+Plain TeX   `plain-TeX-mode'   `plain-TeX-mode-hook'
+LaTeX       `LaTeX-mode'       `LaTeX-mode-hook'
+AMS-TeX     `ams-tex-mode'     `AmS-TeX-mode-hook'
+ConTeXt     `ConTeXt-mode'     `ConTeXt-mode-hook'
+Texinfo     `Texinfo-mode'     `Texinfo-mode-hook'
+DocTeX      `docTeX-mode'      `docTeX-mode-hook'
+
+   If you need to make a customization via a hook which is only relevant
+for one of the modes listed above, put it into the respective mode hook,
+if it is relevant for any AUCTeX mode, add it to `TeX-mode-hook' and if
+it is relevant for all text modes, append it to `text-mode-hook'.
+
+\1f
+File: auctex.info,  Node: Multifile,  Next: Parsing Files,  Prev: Modes and Hooks,  Up: Customization
+
+5.2 Multifile Documents
+=======================
+
+You may wish to spread a document over many files (as you are likely to
+do if there are multiple authors, or if you have not yet discovered the
+power of the outline commands (*note Outline::)).  This can be done by
+having a "master" file in which you include the various files with the
+TeX macro `\input' or the LaTeX macro `\include'.  These files may also
+include other files themselves.  However, to format the document you
+must run the commands on the top level master file.
+
+   When you, for example, ask AUCTeX to run a command on the master
+file, it has no way of knowing the name of the master file.  By default,
+it will assume that the current file is the master file.  If you insert
+the following in your `.emacs' file AUCTeX will use a more advanced
+algorithm.
+
+     (setq-default TeX-master nil) ; Query for master file.
+
+   If AUCTeX finds the line indicating the end of the header in a master
+file (`TeX-header-end'), it can figure out for itself that this is a
+master file.  Otherwise, it will ask for the name of the master file
+associated with the buffer.  To avoid asking you again, AUCTeX will
+automatically insert the name of the master file as a file variable
+(*note File Variables: (emacs)File Variables.).  You can also insert
+the file variable yourself, by putting the following text at the end of
+your files.  
+
+     %%% Local Variables:
+     %%% TeX-master: "master"
+     %%% End:
+
+   You should always set this variable to the name of the top level
+document.  If you always use the same name for your top level
+documents, you can set `TeX-master' in your `.emacs' file.
+
+     (setq-default TeX-master "master") ; All master files called "master".
+
+ -- User Option: TeX-master
+     The master file associated with the current buffer.  If the file
+     being edited is actually included from another file, then you can
+     tell AUCTeX the name of the master file by setting this variable.
+     If there are multiple levels of nesting, specify the top level
+     file.
+
+     If this variable is `nil', AUCTeX will query you for the name.
+
+     If the variable is `t', then AUCTeX will assume the file is a
+     master file itself.
+
+     If the variable is `shared', then AUCTeX will query for the name,
+     but will not change the file.
+
+ -- User Option: TeX-one-master
+     Regular expression matching ordinary TeX files.
+
+     You should set this variable to match the name of all files, for
+     which it is a good idea to append a `TeX-master' file variable
+     entry automatically.  When AUCTeX adds the name of the master file
+     as a file variable, it does not need to ask next time you edit the
+     file.
+
+     If you dislike AUCTeX automatically modifying your files, you can
+     set this variable to `"<none>"'.  By default, AUCTeX will modify
+     any file with an extension of `.tex'.
+
+ -- Command: TeX-master-file-ask
+     (`C-c _') Query for the name of a master file and add the
+     respective File Variables (*note File Variables: (emacs)File
+     Variables.) to the file for setting this variable permanently.
+
+     AUCTeX will not ask for a master file when it encounters existing
+     files.  This function shall give you the possibility to insert the
+     variable manually.
+
+   AUCTeX keeps track of macros, environments, labels, and style files
+that are used in a given document.  For this to work with multifile
+documents, AUCTeX has to have a place to put the information about the
+files in the document.  This is done by having an `auto' subdirectory
+placed in the directory where your document is located.  Each time you
+save a file, AUCTeX will write information about the file into the
+`auto' directory.  When you load a file, AUCTeX will read the
+information in the `auto' directory about the file you loaded _and the
+master file specified by `TeX-master'_.  Since the master file (perhaps
+indirectly) includes all other files in the document, AUCTeX will get
+information from all files in the document.  This means that you will
+get from each file, for example, completion for all labels defined
+anywhere in the document.
+
+   AUCTeX will create the `auto' directory automatically if
+`TeX-auto-save' is non-nil.  Without it, the files in the document will
+not know anything about each other, except for the name of the master
+file.  *Note Automatic Local::.
+
+ -- Command: TeX-save-document
+     (`C-c C-d') Save all buffers known to belong to the current
+     document.
+
+ -- User Option: TeX-save-query
+     If non-nil, then query the user before saving each file with
+     `TeX-save-document'.
+
+\1f
+File: auctex.info,  Node: Parsing Files,  Next: Internationalization,  Prev: Multifile,  Up: Customization
+
+5.3 Automatic Parsing of TeX Files
+==================================
+
+AUCTeX depends heavily on being able to extract information from the
+buffers by parsing them.  Since parsing the buffer can be somewhat slow,
+the parsing is initially disabled.  You are encouraged to enable them by
+adding the following lines to your `.emacs' file.
+
+     (setq TeX-parse-self t) ; Enable parse on load.
+     (setq TeX-auto-save t) ; Enable parse on save.
+
+   The latter command will make AUCTeX store the parsed information in
+an `auto' subdirectory in the directory each time the TeX files are
+stored, *note Automatic Local::.  If AUCTeX finds the pre-parsed
+information when loading a file, it will not need to reparse the buffer.
+The information in the `auto' directory is also useful for multifile
+documents, *note Multifile::, since it allows each file to access the
+parsed information from all the other files in the document.  This is
+done by first reading the information from the master file, and then
+recursively the information from each file stored in the master file.
+
+   The variables can also be done on a per file basis, by changing the
+file local variables.
+
+     %%% Local Variables:
+     %%% TeX-parse-self: t
+     %%% TeX-auto-save: t
+     %%% End:
+
+   Even when you have disabled the automatic parsing, you can force the
+generation of style information by pressing `C-c C-n'.  This is often
+the best choice, as you will be able to decide when it is necessary to
+reparse the file.
+
+ -- User Option: TeX-parse-self
+     Parse file after loading it if no style hook is found for it.
+
+ -- User Option: TeX-auto-save
+     Automatically save style information when saving the buffer.
+
+ -- Command: TeX-normal-mode ARG
+     (`C-c C-n') Remove all information about this buffer, and apply the
+     style hooks again.  Save buffer first including style information.
+     With optional argument, also reload the style hooks.
+
+   When AUCTeX saves your buffer, it can optionally convert all tabs in
+your buffer into spaces.  Tabs confuse AUCTeX's error message parsing
+and so should generally be avoided.  However, tabs are significant in
+some environments, and so by default AUCTeX does not remove them.  To
+convert tabs to spaces when saving a buffer, insert the following in
+your `.emacs' file:
+
+     (setq TeX-auto-untabify t)
+
+ -- User Option: TeX-auto-untabify
+     Automatically remove all tabs from a file before saving it.
+
+   Instead of disabling the parsing entirely, you can also speed it
+significantly up by limiting the information it will search for (and
+store) when parsing the buffer.  You can do this by setting the default
+values for the buffer local variables `TeX-auto-regexp-list' and
+`TeX-auto-parse-length' in your `.emacs' file.
+
+     ;; Only parse LaTeX class and package information.
+     (setq-default TeX-auto-regexp-list 'LaTeX-auto-minimal-regexp-list)
+     ;; The class and package information is usually near the beginning.
+     (setq-default TeX-auto-parse-length 2000)
+
+   This example will speed the parsing up significantly, but AUCTeX
+will no longer be able to provide completion for labels, macros,
+environments, or bibitems specified in the document, nor will it know
+what files belong to the document.
+
+   These variables can also be specified on a per file basis, by
+changing the file local variables.
+
+     %%% Local Variables:
+     %%% TeX-auto-regexp-list: TeX-auto-full-regexp-list
+     %%% TeX-auto-parse-length: 999999
+     %%% End:
+
+ -- User Option: TeX-auto-regexp-list
+     List of regular expressions used for parsing the current file.
+
+ -- User Option: TeX-auto-parse-length
+     Maximal length of TeX file that will be parsed.
+
+   The pre-specified lists of regexps are defined below.  You can use
+these before loading AUCTeX by quoting them, as in the example above.
+
+ -- Constant: TeX-auto-empty-regexp-list
+     Parse nothing
+
+ -- Constant: LaTeX-auto-minimal-regexp-list
+     Only parse LaTeX class and packages.
+
+ -- Constant: LaTeX-auto-label-regexp-list
+     Only parse LaTeX labels.
+
+ -- Constant: LaTeX-auto-regexp-list
+     Parse common LaTeX commands.
+
+ -- Constant: plain-TeX-auto-regexp-list
+     Parse common plain TeX commands.
+
+ -- Constant: TeX-auto-full-regexp-list
+     Parse all TeX and LaTeX commands that AUCTeX can use.
+
+\1f
+File: auctex.info,  Node: Internationalization,  Next: Automatic,  Prev: Parsing Files,  Up: Customization
+
+5.4 Language Support
+====================
+
+TeX and Emacs are usable for European (Latin, Cyrillic, Greek) based
+languages.  Some LaTeX and EmacsLisp packages are available for easy
+typesetting and editing documents in European languages.
+
+   For CJK (Chinese, Japanese, and Korean) languages, Emacs or XEmacs
+with MULE (MULtilingual Enhancement to GNU Emacs) support is required.
+MULE is part of Emacs by default since Emacs 20.  XEmacs has to be
+configured with the `--with-mule' option.  Special versions of TeX are
+needed for CJK languages: CTeX and ChinaTeX for Chinese, ASCII pTeX and
+NTT jTeX for Japanese, HLaTeX and kTeX for Korean.  The CJK-LaTeX
+package is required for supporting multiple CJK scripts within a single
+document.
+
+   Note that Unicode is not fully supported in Emacs 21 and XEmacs 21.
+CJK characters are not usable.  Please use the MULE-UCS EmacsLisp
+package or Emacs 22 (not released yet) if you need CJK.
+
+* Menu:
+
+* European::                    Using AUCTeX with European Languages
+* Japanese::                    Using AUCTeX with Japanese
+
+\1f
+File: auctex.info,  Node: European,  Next: Japanese,  Up: Internationalization
+
+5.4.1 Using AUCTeX with European Languages
+------------------------------------------
+
+5.4.1.1 Typing and Displaying Non-ASCII Characters
+..................................................
+
+First you will need a way to write non-ASCII characters.  You can either
+use macros, or teach TeX about the ISO character sets.  I prefer the
+latter, it has the advantage that the usual standard emacs word
+movement and case change commands will work.
+
+   With LaTeX2e, just add `\usepackage[latin1]{inputenc}'.  Other
+languages than Western European ones will probably have other encoding
+needs.
+
+   To be able to display non-ASCII characters you will need an
+appropriate font and a version of GNU Emacs capable of displaying 8-bit
+characters (e.g. Emacs 21).  The manner in which this is supported
+differs between Emacsen, so you need to take a look at your respective
+documentation.
+
+   A compromise is to use an European character set when editing the
+file, and convert to TeX macros when reading and writing the files.
+
+`iso-cvt.el'
+     Much like `iso-tex.el' but is bundled with Emacs 19.23 and later.
+
+`x-compose.el'
+     Similar package bundled with new versions of XEmacs.
+
+`X-Symbol'
+     a much more complete package for both Emacs and XEmacs that can
+     also handle a lot of mathematical characters and input methods.
+
+5.4.1.2 Style Files for Different Languages
+...........................................
+
+AUCTeX supports style files for several languages.  Each style file may
+modify AUCTeX to better support the language, and will run a language
+specific hook that will allow you to for example change ispell
+dictionary, or run code to change the keyboard remapping.  The
+following will for example choose a Danish dictionary for documents
+including `\usepackage[danish]{babel}'.  This requires parsing to be
+enabled, *note Parsing Files::.
+
+     (add-hook 'TeX-language-dk-hook
+         (lambda () (ispell-change-dictionary "danish")))
+
+   The following style files are recognized:
+
+`bulgarian'
+     Runs style hook `TeX-language-bg-hook'.  Gives `"' word syntax,
+     makes the <"> key insert a literal `"'.  Typing <"> twice will
+     insert insert `"`' or `"'' depending on context.  Typing <-> twice
+     will insert `"=', three times `--'.
+
+`czech'
+     Runs style hook `TeX-language-cz-hook'.  Pressing <"> will insert
+     `\uv{' and `}' depending on context.
+
+`danish'
+     Runs style hook `TeX-language-dk-hook'.  Pressing <"> will insert
+     `"`' and `"'' depending on context.  Typing <-> twice will insert
+     `"=', i.e. a hyphen string allowing hyphenation in the composing
+     words.
+
+`dutch'
+     Runs style hook `TeX-language-nl-hook'.
+
+`german'
+`ngerman'
+     Runs style hook `TeX-language-de-hook'.  Gives `"' word syntax,
+     makes the <"> key insert a literal `"'.  Pressing the key twice
+     will give you opening or closing German quotes (`"`' or `"'').
+     Typing <-> twice will insert `"=', three times `--'.
+
+`frenchb'
+`francais'
+     Runs style hook `TeX-language-fr-hook'.  Pressing <"> will insert
+     `\\og' and `\\fg' depending on context.  Note that the language
+     name for customizing `TeX-quote-language-alist' is `french'.
+
+`icelandic'
+     Runs style hook `TeX-language-is-hook'.  Gives `"' word syntax,
+     makes the <"> key insert a literal `"'.  Typing <"> twice will
+     insert insert `"`' or `"'' depending on context.  Typing <-> twice
+     will insert `"=', three times `--'.
+
+`italian'
+     Runs style hook `TeX-language-it-hook'.  Pressing <"> will insert
+     `"<' and `">' depending on context.
+
+`polish'
+     Runs style hook `TeX-language-pl-hook'.  Gives `"' word syntax and
+     makes the <"> key insert a literal `"'.  Pressing <"> twice will
+     insert `"`' or `"'' depending on context.
+
+`polski'
+     Runs style hook `TeX-language-pl-hook'.  Makes the <"> key insert
+     a literal `"'.  Pressing <"> twice will insert `,,' or `'''
+     depending on context.
+
+`slovak'
+     Runs style hook `TeX-language-sk-hook'.  Pressing <"> will insert
+     `\uv{' and `}' depending on context.
+
+`swedish'
+     Runs style hook `TeX-language-sv-hook'.  Pressing <"> will insert
+     `'''.  Typing <-> twice will insert `"=', three times `--'.
+
+   Replacement of language-specific hyphen strings like `"=' with
+dashes does not require to type <-> three times in a row.  You can put
+point after the hypen string anytime and trigger the replacement by
+typing <->.
+
+   In case you are not satisfied with the suggested behavior of quote
+and hyphen insertion you can change it by customizing the variables
+`TeX-quote-language-alist' and `LaTeX-babel-hyphen-language-alist'
+respectively.
+
+ -- User Option: TeX-quote-language-alist
+     Used for overriding the default language-specific quote insertion
+     behavior.  This is an alist where each element is a list
+     consisting of four items.  The first item is the name of the
+     language in concern as a string.  See the list of supported
+     languages above.  The second item is the opening quotation mark.
+     The third item is the closing quotation mark.  Opening and closing
+     quotation marks can be specified directly as strings or as
+     functions returning a string.  The fourth item is a boolean
+     controlling quote insertion.  It should be non-nil if if the
+     special quotes should only be used after inserting a literal `"'
+     character first, i.e. on second key press.
+
+ -- User Option: LaTeX-babel-hyphen-language-alist
+     Used for overriding the behavior of hyphen insertion for specific
+     languages.  Every element in this alist is a list of three items.
+     The first item should specify the affected language as a string.
+     The second item denotes the hyphen string to be used as a string.
+     The third item, a boolean, controls the behavior of hyphen
+     insertion and should be non-nil if the special hyphen should be
+     inserted after inserting a literal `-' character, i.e. on second
+     key press.
+
+   The defaults of hyphen insertion are defined by the variables
+`LaTeX-babel-hyphen' and `LaTeX-babel-hyphen-after-hyphen' respectively.
+
+ -- User Option: LaTeX-babel-hyphen
+     String to be used when typing <->.  This usually is a hyphen
+     alternative or hyphenation aid provided by `babel' and the related
+     language style files, like `"=', `"~' or `"-'.
+
+     Set it to an empty string or nil in order to disable
+     language-specific hyphen insertion.
+
+ -- User Option: LaTeX-babel-hyphen-after-hyphen
+     Control insertion of hyphen strings.  If non-nil insert normal
+     hyphen on first key press and swap it with the language-specific
+     hyphen string specified in the variable `LaTeX-babel-hyphen' on
+     second key press.  If nil do it the other way round.
+
+\1f
+File: auctex.info,  Node: Japanese,  Prev: European,  Up: Internationalization
+
+5.4.2 Using AUCTeX with Japanese TeX
+------------------------------------
+
+To write Japanese text with AUCTeX, you need to have versions of TeX
+and Emacs that support Japanese.  There exist at least two variants of
+TeX for Japanese text (NTT jTeX and ASCII pTeX).  AUCTeX can be used
+with MULE (MULtilingual Enhancement to GNU Emacs) supported Emacsen.
+
+   To use the Japanese TeX variants, simply activate
+`japanese-plain-tex-mode' or `japanese-latex-mode' and everything
+should work.  If not, send mail to Masayuki Ataka
+`<ataka@milk.freemail.ne.jp>', who kindly donated the code for
+supporting Japanese in AUCTeX.  None of the primary AUCTeX maintainers
+understand Japanese, so they cannot help you.
+
+   If you usually use AUCTeX in Japanese, setting the following
+variables is useful.
+
+ -- User Option: TeX-default-mode
+     Mode to enter for a new file when it cannott be determined whether
+     the file is plain TeX or LaTeX or what.
+
+     If you want to enter Japanese LaTeX mode whenever this may happen,
+     set the variable like this:
+          (setq TeX-default-mode 'japanese-latex-mode)
+
+ -- User Option: japanese-TeX-command-default
+     The default command for `TeX-command' in Japanese TeX mode.
+
+     The default value is `"pTeX"'.
+
+ -- User Option: japanese-LaTeX-command-default
+     The default command for `TeX-command' in Japanese LaTeX mode.
+
+     The default value is `"LaTeX"'.
+
+ -- User Option: japanese-LaTeX-default-style
+     The default style/class when creating a new Japanese LaTeX
+     document.
+
+     The default value is `"jarticle"'.
+
+   See `tex-jp.el' for more information.
+
+\1f
+File: auctex.info,  Node: Automatic,  Next: Style Files,  Prev: Internationalization,  Up: Customization
+
+5.5 Automatic Customization
+===========================
+
+Since AUCTeX is so highly customizable, it makes sense that it is able
+to customize itself.  The automatic customization consists of scanning
+TeX files and extracting symbols, environments, and things like that.
+
+   The automatic customization is done on three different levels.  The
+global level is the level shared by all users at your site, and consists
+of scanning the standard TeX style files, and any extra styles added
+locally for all users on the site.  The private level deals with those
+style files you have written for your own use, and use in different
+documents.  You may have a `~/lib/TeX/' directory where you store
+useful style files for your own use.  The local level is for a specific
+directory, and deals with writing customization for the files for your
+normal TeX documents.
+
+   If compared with the environment variable `TEXINPUTS', the global
+level corresponds to the directories built into TeX.  The private level
+corresponds to the directories you add yourself, except for `.', which
+is the local level.
+
+* Menu:
+
+* Automatic Global::            Automatic Customization for the Site
+* Automatic Private::           Automatic Customization for a User
+* Automatic Local::             Automatic Customization for a Directory
+
+   By default AUCTeX will search for customization files in all the
+global, private, and local style directories, but you can also set the
+path directly.  This is useful if you for example want to add another
+person's style hooks to your path.  Please note that all matching files
+found in `TeX-style-path' are loaded, and all hooks defined in the
+files will be executed.
+
+ -- User Option: TeX-style-path
+     List of directories to search for AUCTeX style files.  Each must
+     end with a slash.
+
+   By default, when AUCTeX searches a directory for files, it will
+recursively search through subdirectories.
+
+ -- User Option: TeX-file-recurse
+     Whether to search TeX directories recursively: nil means do not
+     recurse, a positive integer means go that far deep in the directory
+     hierarchy, t means recurse indefinitely.
+
+   By default, AUCTeX will ignore files name `.', `..', `SCCS', `RCS',
+and `CVS'.
+
+ -- User Option: TeX-ignore-file
+     Regular expression matching file names to ignore.
+
+     These files or directories will not be considered when searching
+     for TeX files in a directory.
+
+\1f
+File: auctex.info,  Node: Automatic Global,  Next: Automatic Private,  Up: Automatic
+
+5.5.1 Automatic Customization for the Site
+------------------------------------------
+
+Assuming that the automatic customization at the global level was done
+when AUCTeX was installed, your choice is now: will you use it?  If you
+use it, you will benefit by having access to all the symbols and
+environments available for completion purposes.  The drawback is slower
+load time when you edit a new file and perhaps too many confusing
+symbols when you try to do a completion.
+
+   You can disable the automatic generated global style hooks by setting
+the variable `TeX-auto-global' to nil.
+
+ -- User Option: TeX-macro-global
+     Directories containing the site's TeX style files.
+
+ -- User Option: TeX-style-global
+     Directory containing hand generated TeX information.  Must end
+     with a slash.
+
+     These correspond to TeX macros shared by all users of a site.
+
+ -- User Option: TeX-auto-global
+     Directory containing automatically generated information.
+
+     For storing automatic extracted information about the TeX macros
+     shared by all users of a site.
+
+\1f
+File: auctex.info,  Node: Automatic Private,  Next: Automatic Local,  Prev: Automatic Global,  Up: Automatic
+
+5.5.2 Automatic Customization for a User
+----------------------------------------
+
+You should specify where you store your private TeX macros, so AUCTeX
+can extract their information.  The extracted information will go to
+the directories listed in `TeX-auto-private'
+
+   Use `M-x TeX-auto-generate <RET>' to extract the information.
+
+ -- User Option: TeX-macro-private
+     Directories where you store your personal TeX macros.  The value
+     defaults to the directories listed in the `TEXINPUTS' and
+     `BIBINPUTS' environment variables or to the respective directories
+     in `$TEXMFHOME' if no results can be obtained from the environment
+     variables.
+
+ -- User Option: TeX-auto-private
+     List of directories containing automatically generated AUCTeX style
+     files.  These correspond to the personal TeX macros.
+
+ -- Command: TeX-auto-generate TEX AUTO
+     (`M-x TeX-auto-generate <RET>') Generate style hook for TEX and
+     store it in AUTO.  If TEX is a directory, generate style hooks for
+     all files in the directory.
+
+ -- User Option: TeX-style-private
+     List of directories containing hand generated AUCTeX style files.
+     These correspond to the personal TeX macros.
+
+\1f
+File: auctex.info,  Node: Automatic Local,  Prev: Automatic Private,  Up: Automatic
+
+5.5.3 Automatic Customization for a Directory
+---------------------------------------------
+
+AUCTeX can update the style information about a file each time you save
+it, and it will do this if the directory `TeX-auto-local' exist.
+`TeX-auto-local' is by default set to `"auto"', so simply creating an
+`auto' directory will enable automatic saving of style information.
+
+   The advantage of doing this is that macros, labels, etc. defined in
+any file in a multifile document will be known in all the files in the
+document.  The disadvantage is that saving will be slower.  To disable,
+set `TeX-auto-local' to nil.
+
+ -- User Option: TeX-style-local
+     Directory containing hand generated TeX information.  Must end
+     with a slash.
+
+     These correspond to TeX macros found in the current directory.
+
+ -- User Option: TeX-auto-local
+     Directory containing automatically generated TeX information.
+     Must end with a slash.
+
+     These correspond to TeX macros found in the current directory.
+
+\1f
+File: auctex.info,  Node: Style Files,  Prev: Automatic,  Up: Customization
+
+5.6 Writing Your Own Style Support
+==================================
+
+*Note Automatic::, for a discussion about automatically generated
+global, private, and local style files.  The hand generated style files
+are equivalent, except that they by default are found in `style'
+directories instead of `auto' directories.
+
+* Menu:
+
+* Simple Style::                A Simple Style File
+* Adding Macros::               Adding Support for Macros
+* Adding Environments::         Adding Support for Environments
+* Adding Other::                Adding Other Information
+* Hacking the Parser::          Automatic Extraction of New Things
+
+   If you write some useful support for a public TeX style file, please
+send it to us.
+
+\1f
+File: auctex.info,  Node: Simple Style,  Next: Adding Macros,  Up: Style Files
+
+5.6.1 A Simple Style File
+-------------------------
+
+Here is a simple example of a style file.
+
+     ;;; book.el - Special code for book style.
+
+     (TeX-add-style-hook
+      "book"
+      (lambda ()
+        (LaTeX-largest-level-set "chapter")))
+
+   This file specifies that the largest kind of section in a LaTeX
+document using the book document style is chapter.  The interesting
+thing to notice is that the style file defines an (anonymous) function,
+and adds it to the list of loaded style hooks by calling
+`TeX-add-style-hook'.
+
+   The first time the user indirectly tries to access some style
+specific information, such as the largest sectioning command available,
+the style hooks for all files directly or indirectly read by the
+current document is executed.  The actual files will only be evaluated
+once, but the hooks will be called for each buffer using the style file.
+
+ -- Function: TeX-add-style-hook STYLE HOOK
+     Add HOOK to the list of functions to run when we use the TeX file
+     STYLE.
+
+\1f
+File: auctex.info,  Node: Adding Macros,  Next: Adding Environments,  Prev: Simple Style,  Up: Style Files
+
+5.6.2 Adding Support for Macros
+-------------------------------
+
+The most common thing to define in a style hook is new symbols (TeX
+macros).  Most likely along with a description of the arguments to the
+function, since the symbol itself can be defined automatically.
+
+   Here are a few examples from `latex.el'.
+
+     (TeX-add-style-hook
+      "latex"
+      (lambda ()
+        (TeX-add-symbols
+         '("arabic" TeX-arg-counter)
+         '("label" TeX-arg-define-label)
+         '("ref" TeX-arg-label)
+         '("newcommand" TeX-arg-define-macro [ "Number of arguments" ] t)
+         '("newtheorem" TeX-arg-define-environment
+           [ TeX-arg-environment "Numbered like" ]
+           t [ TeX-arg-counter "Within counter" ]))))
+
+ -- Function: TeX-add-symbols SYMBOL ...
+     Add each SYMBOL to the list of known symbols.
+
+   Each argument to `TeX-add-symbols' is a list describing one symbol.
+The head of the list is the name of the symbol, the remaining elements
+describe each argument.
+
+   If there are no additional elements, the symbol will be inserted with
+point inside braces.  Otherwise, each argument of this function should
+match an argument of the TeX macro.  What is done depends on the
+argument type.
+
+   If a macro is defined multiple times, AUCTeX will chose the one with
+the longest definition (i.e. the one with the most arguments).
+
+   Thus, to overwrite
+       '("tref" 1) ; one argument
+   you can specify
+       '("tref" TeX-arg-label ignore) ; two arguments
+
+   `ignore' is a function that does not do anything, so when you insert
+a `tref' you will be prompted for a label and no more.
+
+   You can use the following types of specifiers for arguments:
+
+`string'
+     Use the string as a prompt to prompt for the argument.
+
+`number'
+     Insert that many braces, leave point inside the first.
+
+`nil'
+     Insert empty braces.
+
+`t'
+     Insert empty braces, leave point between the braces.
+
+`other symbols'
+     Call the symbol as a function.  You can define your own hook, or
+     use one of the predefined argument hooks.
+
+`list'
+     If the car is a string, insert it as a prompt and the next element
+     as initial input.  Otherwise, call the car of the list with the
+     remaining elements as arguments.
+
+`vector'
+     Optional argument.  If it has more than one element, parse it as a
+     list, otherwise parse the only element as above.  Use square
+     brackets instead of curly braces, and is not inserted on empty user
+     input.
+
+   A lot of argument hooks have already been defined.  The first
+argument to all hooks is a flag indicating if it is an optional
+argument.  It is up to the hook to determine what to do with the
+remaining arguments, if any.  Typically the next argument is used to
+overwrite the default prompt.
+
+`TeX-arg-conditional'
+     Implements if EXPR THEN ELSE.  If EXPR evaluates to true, parse
+     THEN as an argument list, else parse ELSE as an argument list.
+
+`TeX-arg-literal'
+     Insert its arguments into the buffer.  Used for specifying extra
+     syntax for a macro.
+
+`TeX-arg-free'
+     Parse its arguments but use no braces when they are inserted.
+
+`TeX-arg-eval'
+     Evaluate arguments and insert the result in the buffer.
+
+`TeX-arg-label'
+     Prompt for a label completing with known labels.
+
+`TeX-arg-macro'
+     Prompt for a TeX macro with completion.
+
+`TeX-arg-environment'
+     Prompt for a LaTeX environment with completion.
+
+`TeX-arg-cite'
+     Prompt for a BibTeX citation.
+
+`TeX-arg-counter'
+     Prompt for a LaTeX counter.
+
+`TeX-arg-savebox'
+     Prompt for a LaTeX savebox.
+
+`TeX-arg-file'
+     Prompt for a filename in the current directory, and use it without
+     the extension.
+
+`TeX-arg-input-file'
+     Prompt for the name of an input file in TeX's search path, and use
+     it without the extension.  Run the style hooks for the file.
+
+`TeX-arg-define-label'
+     Prompt for a label completing with known labels.  Add label to
+     list of defined labels.
+
+`TeX-arg-define-macro'
+     Prompt for a TeX macro with completion.  Add macro to list of
+     defined macros.
+
+`TeX-arg-define-environment'
+     Prompt for a LaTeX environment with completion.  Add environment to
+     list of defined environments.
+
+`TeX-arg-define-cite'
+     Prompt for a BibTeX citation.
+
+`TeX-arg-define-counter'
+     Prompt for a LaTeX counter.
+
+`TeX-arg-define-savebox'
+     Prompt for a LaTeX savebox.
+
+`TeX-arg-corner'
+     Prompt for a LaTeX side or corner position with completion.
+
+`TeX-arg-lr'
+     Prompt for a LaTeX side with completion.
+
+`TeX-arg-tb'
+     Prompt for a LaTeX side with completion.
+
+`TeX-arg-pagestyle'
+     Prompt for a LaTeX pagestyle with completion.
+
+`TeX-arg-verb'
+     Prompt for delimiter and text.
+
+`TeX-arg-pair'
+     Insert a pair of numbers, use arguments for prompt. The numbers are
+     surrounded by parentheses and separated with a comma.
+
+`TeX-arg-size'
+     Insert width and height as a pair.  No arguments.
+
+`TeX-arg-coordinate'
+     Insert x and y coordinates as a pair.  No arguments.
+
+   If you add new hooks, you can assume that point is placed directly
+after the previous argument, or after the macro name if this is the
+first argument.  Please leave point located after the argument you are
+inserting.  If you want point to be located somewhere else after all
+hooks have been processed, set the value of `exit-mark'.  It will point
+nowhere, until the argument hook sets it.
+
+\1f
+File: auctex.info,  Node: Adding Environments,  Next: Adding Other,  Prev: Adding Macros,  Up: Style Files
+
+5.6.3 Adding Support for Environments
+-------------------------------------
+
+Adding support for environments is very much like adding support for
+TeX macros, except that each environment normally only takes one
+argument, an environment hook.  The example is again a short version of
+`latex.el'.
+
+     (TeX-add-style-hook
+      "latex"
+      (lambda ()
+        (LaTeX-add-environments
+         '("document" LaTeX-env-document)
+         '("enumerate" LaTeX-env-item)
+         '("itemize" LaTeX-env-item)
+         '("list" LaTeX-env-list))))
+
+   It is completely up to the environment hook to insert the
+environment, but the function `LaTeX-insert-environment' may be of some
+help.  The hook will be called with the name of the environment as its
+first argument, and extra arguments can be provided by adding them to a
+list after the hook.
+
+   For simple environments with arguments, for example defined with
+`\newenvironment', you can make AUCTeX prompt for the arguments by
+giving the prompt strings in the call to `LaTeX-add-environments'.  The
+fact that an argument is optional can be indicated by wrapping the
+prompt string in a vector.
+
+   For example, if you have defined a `loop' environment with the three
+arguments FROM, TO, and STEP, you can add support for them in a style
+file.
+
+     %% loop.sty
+
+     \newenvironment{loop}[3]{...}{...}
+
+     ;; loop.el
+
+     (TeX-add-style-hook
+      "loop"
+      (lambda ()
+        (LaTeX-add-environments
+         '("loop" "From" "To" "Step"))))
+
+   If an environment is defined multiple times, AUCTeX will choose the
+one with the longest definition.  Thus, if you have an enumerate style
+file, and want it to replace the standard LaTeX enumerate hook above,
+you could define an `enumerate.el' file as follows, and place it in the
+appropriate style directory.
+
+     (TeX-add-style-hook
+      "latex"
+      (lambda ()
+        (LaTeX-add-environments
+         '("enumerate" LaTeX-env-enumerate foo))))
+
+     (defun LaTeX-env-enumerate (environment &optional ignore) ...)
+
+   The symbol `foo' will be passed to `LaTeX-env-enumerate' as the
+second argument, but since we only added it to overwrite the definition
+in `latex.el' it is just ignored.
+
+ -- Function: LaTeX-add-environments ENV ...
+     Add each ENV to list of loaded environments.
+
+ -- Function: LaTeX-insert-environment ENV [ EXTRA ]
+     Insert environment of type ENV, with optional argument EXTRA.
+
+   Following is a list of available hooks for `LaTeX-add-environments':
+
+`LaTeX-env-item'
+     Insert the given environment and the first item.
+
+`LaTeX-env-figure'
+     Insert the given figure-like environment with a caption and a
+     label.
+
+`LaTeX-env-array'
+     Insert the given array-like environment with position and column
+     specifications.
+
+`LaTeX-env-label'
+     Insert the given environment with a label.
+
+`LaTeX-env-list'
+     Insert the given list-like environment, a specifier for the label
+     and the first item.
+
+`LaTeX-env-minipage'
+     Insert the given minipage-like environment with position and width
+     specifications.
+
+`LaTeX-env-tabular*'
+     Insert the given tabular*-like environment with width, position and
+     column specifications.
+
+`LaTeX-env-picture'
+     Insert the given environment with width and height specifications.
+
+`LaTeX-env-bib'
+     Insert the given environment with a label for a bibitem.
+
+`LaTeX-env-contents'
+     Insert the given environment with a filename as its argument.
+
+`LaTeX-env-args'
+     Insert the given environment with arguments.  You can use this as
+     a hook in case you want to specify multiple complex arguments just
+     like in elements of `TeX-add-symbols'.  This is most useful if the
+     specification of arguments to be prompted for with strings and
+     strings wrapped in a vector as described above is too limited.
+
+     Here is an example from `listings.el' which calls a function with
+     one argument in order to prompt for a key=value list to be
+     inserted as an optional argument of the `lstlisting' environment:
+
+          (LaTeX-add-environments
+           `("lstlisting" LaTeX-env-args
+             [TeX-arg-key-val ,LaTeX-listings-key-val-options]))
+
+\1f
+File: auctex.info,  Node: Adding Other,  Next: Hacking the Parser,  Prev: Adding Environments,  Up: Style Files
+
+5.6.4 Adding Other Information
+------------------------------
+
+You can also specify bibliographical databases and labels in the style
+file.  This is probably of little use, since this information will
+usually be automatically generated from the TeX file anyway.
+
+ -- Function: LaTeX-add-bibliographies BIBLIOGRAPHY ...
+     Add each BIBLIOGRAPHY to list of loaded bibliographies.
+
+ -- Function: LaTeX-add-labels LABEL ...
+     Add each LABEL to the list of known labels.
+
+\1f
+File: auctex.info,  Node: Hacking the Parser,  Prev: Adding Other,  Up: Style Files
+
+5.6.5 Automatic Extraction of New Things
+----------------------------------------
+
+The automatic TeX information extractor works by searching for regular
+expressions in the TeX files, and storing the matched information.  You
+can add support for new constructs to the parser, something that is
+needed when you add new commands to define symbols.
+
+   For example, in the file `macro.tex' I define the following macro.
+
+     \newcommand{\newmacro}[5]{%
+     \def#1{#3\index{#4@#5~cite{#4}}\nocite{#4}}%
+     \def#2{#5\index{#4@#5~cite{#4}}\nocite{#4}}%
+     }
+
+   AUCTeX will automatically figure out that `newmacro' is a macro that
+takes five arguments.  However, it is not smart enough to automatically
+see that each time we use the macro, two new macros are defined.  We
+can specify this information in a style hook file.
+
+     ;;; macro.el --- Special code for my own macro file.
+
+     ;;; Code:
+
+     (defvar TeX-newmacro-regexp
+       '("\\\\newmacro{\\\\\\([a-zA-Z]+\\)}{\\\\\\([a-zA-Z]+\\)}"
+         (1 2) TeX-auto-multi)
+       "Matches \newmacro definitions.")
+
+     (defvar TeX-auto-multi nil
+       "Temporary for parsing \\newmacro definitions.")
+
+     (defun TeX-macro-cleanup ()
+       "Move symbols from `TeX-auto-multi' to `TeX-auto-symbol'."
+       (mapcar (lambda (list)
+           (mapcar (lambda (symbol)
+                     (setq TeX-auto-symbol
+                           (cons symbol TeX-auto-symbol)))
+                   list))
+         TeX-auto-multi))
+
+     (defun TeX-macro-prepare ()
+       "Clear `Tex-auto-multi' before use."
+       (setq TeX-auto-multi nil))
+
+     (add-hook 'TeX-auto-prepare-hook 'TeX-macro-prepare)
+     (add-hook 'TeX-auto-cleanup-hook 'TeX-macro-cleanup)
+
+     (TeX-add-style-hook
+      "macro"
+      (lambda ()
+        (TeX-auto-add-regexp TeX-newmacro-regexp)
+        (TeX-add-symbols '("newmacro"
+                     TeX-arg-macro
+                     (TeX-arg-macro "Capitalized macro: \\")
+                     t
+                     "BibTeX entry: "
+                     nil))))
+
+     ;;; macro.el ends here
+
+   When this file is first loaded, it adds a new entry to
+`TeX-newmacro-regexp', and defines a function to be called before the
+parsing starts, and one to be called after the parsing is done.  It
+also declares a variable to contain the data collected during parsing.
+Finally, it adds a style hook which describes the `newmacro' macro, as
+we have seen it before.
+
+   So the general strategy is: Add a new entry to `TeX-newmacro-regexp'.
+Declare a variable to contain intermediate data during parsing.  Add
+hook to be called before and after parsing.  In this case, the hook
+before parsing just initializes the variable, and the hook after parsing
+collects the data from the variable, and adds them to the list of
+symbols found.
+
+ -- Variable: TeX-auto-regexp-list
+     List of regular expressions matching TeX macro definitions.
+
+     The list has the following format ((REGEXP MATCH TABLE) ...), that
+     is, each entry is a list with three elements.
+
+     REGEXP.  Regular expression matching the macro we want to parse.
+
+     MATCH.  A number or list of numbers, each representing one
+     parenthesized subexpression matched by REGEXP.
+
+     TABLE.  The symbol table to store the data.  This can be a
+     function, in which case the function is called with the argument
+     MATCH.  Use `TeX-match-buffer' to get match data.  If it is not a
+     function, it is presumed to be the name of a variable containing a
+     list of match data.  The matched data (a string if MATCH is a
+     number, a list of strings if MATCH is a list of numbers) is put in
+     front of the table.
+
+ -- Variable: TeX-auto-prepare-hook nil
+     List of functions to be called before parsing a TeX file.
+
+ -- Variable: TeX-auto-cleanup-hook nil
+     List of functions to be called after parsing a TeX file.
+
+\1f
+File: auctex.info,  Node: Appendices,  Next: Indices,  Prev: Customization,  Up: Top
+
+Appendix A Copying, Changes, Development, FAQ
+*********************************************
+
+* Menu:
+
+* Copying this Manual::
+* Changes::
+* Development::
+* FAQ::
+
+\1f
+File: auctex.info,  Node: Copying this Manual,  Next: Changes,  Up: Appendices
+
+A.1 Copying this Manual
+=======================
+
+The copyright notice for this manual is:
+
+   This manual is for AUCTeX (version 11.86 from 2010-02-21), a
+sophisticated TeX environment for Emacs.
+
+   Copyright (C) 1992, 1993, 1994, 1995, 2001, 2002, 2004, 2005, 2006,
+2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+
+     Permission is granted to copy, distribute and/or modify this
+     document under the terms of the GNU Free Documentation License,
+     Version 1.3 or any later version published by the Free Software
+     Foundation; with no Invariant Sections, no Front-Cover Texts and
+     no Back-Cover Texts.  A copy of the license is included in the
+     section entitled "GNU Free Documentation License."
+
+The full license text can be read here:
+
+* Menu:
+
+* GNU Free Documentation License:: License for copying this manual.
+
+\1f
+File: auctex.info,  Node: GNU Free Documentation License,  Up: Copying this Manual
+
+A.1.1 GNU Free Documentation License
+------------------------------------
+
+                     Version 1.3, 3 November 2008
+
+     Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software
+     Foundation, Inc.  `http://fsf.org/'
+
+     Everyone is permitted to copy and distribute verbatim copies
+     of this license document, but changing it is not allowed.
+
+  0. PREAMBLE
+
+     The purpose of this License is to make a manual, textbook, or other
+     functional and useful document "free" in the sense of freedom: to
+     assure everyone the effective freedom to copy and redistribute it,
+     with or without modifying it, either commercially or
+     noncommercially.  Secondarily, this License preserves for the
+     author and publisher a way to get credit for their work, while not
+     being considered responsible for modifications made by others.
+
+     This License is a kind of "copyleft", which means that derivative
+     works of the document must themselves be free in the same sense.
+     It complements the GNU General Public License, which is a copyleft
+     license designed for free software.
+
+     We have designed this License in order to use it for manuals for
+     free software, because free software needs free documentation: a
+     free program should come with manuals providing the same freedoms
+     that the software does.  But this License is not limited to
+     software manuals; it can be used for any textual work, regardless
+     of subject matter or whether it is published as a printed book.
+     We recommend this License principally for works whose purpose is
+     instruction or reference.
+
+  1. APPLICABILITY AND DEFINITIONS
+
+     This License applies to any manual or other work, in any medium,
+     that contains a notice placed by the copyright holder saying it
+     can be distributed under the terms of this License.  Such a notice
+     grants a world-wide, royalty-free license, unlimited in duration,
+     to use that work under the conditions stated herein.  The
+     "Document", below, refers to any such manual or work.  Any member
+     of the public is a licensee, and is addressed as "you".  You
+     accept the license if you copy, modify or distribute the work in a
+     way requiring permission under copyright law.
+
+     A "Modified Version" of the Document means any work containing the
+     Document or a portion of it, either copied verbatim, or with
+     modifications and/or translated into another language.
+
+     A "Secondary Section" is a named appendix or a front-matter section
+     of the Document that deals exclusively with the relationship of the
+     publishers or authors of the Document to the Document's overall
+     subject (or to related matters) and contains nothing that could
+     fall directly within that overall subject.  (Thus, if the Document
+     is in part a textbook of mathematics, a Secondary Section may not
+     explain any mathematics.)  The relationship could be a matter of
+     historical connection with the subject or with related matters, or
+     of legal, commercial, philosophical, ethical or political position
+     regarding them.
+
+     The "Invariant Sections" are certain Secondary Sections whose
+     titles are designated, as being those of Invariant Sections, in
+     the notice that says that the Document is released under this
+     License.  If a section does not fit the above definition of
+     Secondary then it is not allowed to be designated as Invariant.
+     The Document may contain zero Invariant Sections.  If the Document
+     does not identify any Invariant Sections then there are none.
+
+     The "Cover Texts" are certain short passages of text that are
+     listed, as Front-Cover Texts or Back-Cover Texts, in the notice
+     that says that the Document is released under this License.  A
+     Front-Cover Text may be at most 5 words, and a Back-Cover Text may
+     be at most 25 words.
+
+     A "Transparent" copy of the Document means a machine-readable copy,
+     represented in a format whose specification is available to the
+     general public, that is suitable for revising the document
+     straightforwardly with generic text editors or (for images
+     composed of pixels) generic paint programs or (for drawings) some
+     widely available drawing editor, and that is suitable for input to
+     text formatters or for automatic translation to a variety of
+     formats suitable for input to text formatters.  A copy made in an
+     otherwise Transparent file format whose markup, or absence of
+     markup, has been arranged to thwart or discourage subsequent
+     modification by readers is not Transparent.  An image format is
+     not Transparent if used for any substantial amount of text.  A
+     copy that is not "Transparent" is called "Opaque".
+
+     Examples of suitable formats for Transparent copies include plain
+     ASCII without markup, Texinfo input format, LaTeX input format,
+     SGML or XML using a publicly available DTD, and
+     standard-conforming simple HTML, PostScript or PDF designed for
+     human modification.  Examples of transparent image formats include
+     PNG, XCF and JPG.  Opaque formats include proprietary formats that
+     can be read and edited only by proprietary word processors, SGML or
+     XML for which the DTD and/or processing tools are not generally
+     available, and the machine-generated HTML, PostScript or PDF
+     produced by some word processors for output purposes only.
+
+     The "Title Page" means, for a printed book, the title page itself,
+     plus such following pages as are needed to hold, legibly, the
+     material this License requires to appear in the title page.  For
+     works in formats which do not have any title page as such, "Title
+     Page" means the text near the most prominent appearance of the
+     work's title, preceding the beginning of the body of the text.
+
+     The "publisher" means any person or entity that distributes copies
+     of the Document to the public.
+
+     A section "Entitled XYZ" means a named subunit of the Document
+     whose title either is precisely XYZ or contains XYZ in parentheses
+     following text that translates XYZ in another language.  (Here XYZ
+     stands for a specific section name mentioned below, such as
+     "Acknowledgements", "Dedications", "Endorsements", or "History".)
+     To "Preserve the Title" of such a section when you modify the
+     Document means that it remains a section "Entitled XYZ" according
+     to this definition.
+
+     The Document may include Warranty Disclaimers next to the notice
+     which states that this License applies to the Document.  These
+     Warranty Disclaimers are considered to be included by reference in
+     this License, but only as regards disclaiming warranties: any other
+     implication that these Warranty Disclaimers may have is void and
+     has no effect on the meaning of this License.
+
+  2. VERBATIM COPYING
+
+     You may copy and distribute the Document in any medium, either
+     commercially or noncommercially, provided that this License, the
+     copyright notices, and the license notice saying this License
+     applies to the Document are reproduced in all copies, and that you
+     add no other conditions whatsoever to those of this License.  You
+     may not use technical measures to obstruct or control the reading
+     or further copying of the copies you make or distribute.  However,
+     you may accept compensation in exchange for copies.  If you
+     distribute a large enough number of copies you must also follow
+     the conditions in section 3.
+
+     You may also lend copies, under the same conditions stated above,
+     and you may publicly display copies.
+
+  3. COPYING IN QUANTITY
+
+     If you publish printed copies (or copies in media that commonly
+     have printed covers) of the Document, numbering more than 100, and
+     the Document's license notice requires Cover Texts, you must
+     enclose the copies in covers that carry, clearly and legibly, all
+     these Cover Texts: Front-Cover Texts on the front cover, and
+     Back-Cover Texts on the back cover.  Both covers must also clearly
+     and legibly identify you as the publisher of these copies.  The
+     front cover must present the full title with all words of the
+     title equally prominent and visible.  You may add other material
+     on the covers in addition.  Copying with changes limited to the
+     covers, as long as they preserve the title of the Document and
+     satisfy these conditions, can be treated as verbatim copying in
+     other respects.
+
+     If the required texts for either cover are too voluminous to fit
+     legibly, you should put the first ones listed (as many as fit
+     reasonably) on the actual cover, and continue the rest onto
+     adjacent pages.
+
+     If you publish or distribute Opaque copies of the Document
+     numbering more than 100, you must either include a
+     machine-readable Transparent copy along with each Opaque copy, or
+     state in or with each Opaque copy a computer-network location from
+     which the general network-using public has access to download
+     using public-standard network protocols a complete Transparent
+     copy of the Document, free of added material.  If you use the
+     latter option, you must take reasonably prudent steps, when you
+     begin distribution of Opaque copies in quantity, to ensure that
+     this Transparent copy will remain thus accessible at the stated
+     location until at least one year after the last time you
+     distribute an Opaque copy (directly or through your agents or
+     retailers) of that edition to the public.
+
+     It is requested, but not required, that you contact the authors of
+     the Document well before redistributing any large number of
+     copies, to give them a chance to provide you with an updated
+     version of the Document.
+
+  4. MODIFICATIONS
+
+     You may copy and distribute a Modified Version of the Document
+     under the conditions of sections 2 and 3 above, provided that you
+     release the Modified Version under precisely this License, with
+     the Modified Version filling the role of the Document, thus
+     licensing distribution and modification of the Modified Version to
+     whoever possesses a copy of it.  In addition, you must do these
+     things in the Modified Version:
+
+       A. Use in the Title Page (and on the covers, if any) a title
+          distinct from that of the Document, and from those of
+          previous versions (which should, if there were any, be listed
+          in the History section of the Document).  You may use the
+          same title as a previous version if the original publisher of
+          that version gives permission.
+
+       B. List on the Title Page, as authors, one or more persons or
+          entities responsible for authorship of the modifications in
+          the Modified Version, together with at least five of the
+          principal authors of the Document (all of its principal
+          authors, if it has fewer than five), unless they release you
+          from this requirement.
+
+       C. State on the Title page the name of the publisher of the
+          Modified Version, as the publisher.
+
+       D. Preserve all the copyright notices of the Document.
+
+       E. Add an appropriate copyright notice for your modifications
+          adjacent to the other copyright notices.
+
+       F. Include, immediately after the copyright notices, a license
+          notice giving the public permission to use the Modified
+          Version under the terms of this License, in the form shown in
+          the Addendum below.
+
+       G. Preserve in that license notice the full lists of Invariant
+          Sections and required Cover Texts given in the Document's
+          license notice.
+
+       H. Include an unaltered copy of this License.
+
+       I. Preserve the section Entitled "History", Preserve its Title,
+          and add to it an item stating at least the title, year, new
+          authors, and publisher of the Modified Version as given on
+          the Title Page.  If there is no section Entitled "History" in
+          the Document, create one stating the title, year, authors,
+          and publisher of the Document as given on its Title Page,
+          then add an item describing the Modified Version as stated in
+          the previous sentence.
+
+       J. Preserve the network location, if any, given in the Document
+          for public access to a Transparent copy of the Document, and
+          likewise the network locations given in the Document for
+          previous versions it was based on.  These may be placed in
+          the "History" section.  You may omit a network location for a
+          work that was published at least four years before the
+          Document itself, or if the original publisher of the version
+          it refers to gives permission.
+
+       K. For any section Entitled "Acknowledgements" or "Dedications",
+          Preserve the Title of the section, and preserve in the
+          section all the substance and tone of each of the contributor
+          acknowledgements and/or dedications given therein.
+
+       L. Preserve all the Invariant Sections of the Document,
+          unaltered in their text and in their titles.  Section numbers
+          or the equivalent are not considered part of the section
+          titles.
+
+       M. Delete any section Entitled "Endorsements".  Such a section
+          may not be included in the Modified Version.
+
+       N. Do not retitle any existing section to be Entitled
+          "Endorsements" or to conflict in title with any Invariant
+          Section.
+
+       O. Preserve any Warranty Disclaimers.
+
+     If the Modified Version includes new front-matter sections or
+     appendices that qualify as Secondary Sections and contain no
+     material copied from the Document, you may at your option
+     designate some or all of these sections as invariant.  To do this,
+     add their titles to the list of Invariant Sections in the Modified
+     Version's license notice.  These titles must be distinct from any
+     other section titles.
+
+     You may add a section Entitled "Endorsements", provided it contains
+     nothing but endorsements of your Modified Version by various
+     parties--for example, statements of peer review or that the text
+     has been approved by an organization as the authoritative
+     definition of a standard.
+
+     You may add a passage of up to five words as a Front-Cover Text,
+     and a passage of up to 25 words as a Back-Cover Text, to the end
+     of the list of Cover Texts in the Modified Version.  Only one
+     passage of Front-Cover Text and one of Back-Cover Text may be
+     added by (or through arrangements made by) any one entity.  If the
+     Document already includes a cover text for the same cover,
+     previously added by you or by arrangement made by the same entity
+     you are acting on behalf of, you may not add another; but you may
+     replace the old one, on explicit permission from the previous
+     publisher that added the old one.
+
+     The author(s) and publisher(s) of the Document do not by this
+     License give permission to use their names for publicity for or to
+     assert or imply endorsement of any Modified Version.
+
+  5. COMBINING DOCUMENTS
+
+     You may combine the Document with other documents released under
+     this License, under the terms defined in section 4 above for
+     modified versions, provided that you include in the combination
+     all of the Invariant Sections of all of the original documents,
+     unmodified, and list them all as Invariant Sections of your
+     combined work in its license notice, and that you preserve all
+     their Warranty Disclaimers.
+
+     The combined work need only contain one copy of this License, and
+     multiple identical Invariant Sections may be replaced with a single
+     copy.  If there are multiple Invariant Sections with the same name
+     but different contents, make the title of each such section unique
+     by adding at the end of it, in parentheses, the name of the
+     original author or publisher of that section if known, or else a
+     unique number.  Make the same adjustment to the section titles in
+     the list of Invariant Sections in the license notice of the
+     combined work.
+
+     In the combination, you must combine any sections Entitled
+     "History" in the various original documents, forming one section
+     Entitled "History"; likewise combine any sections Entitled
+     "Acknowledgements", and any sections Entitled "Dedications".  You
+     must delete all sections Entitled "Endorsements."
+
+  6. COLLECTIONS OF DOCUMENTS
+
+     You may make a collection consisting of the Document and other
+     documents released under this License, and replace the individual
+     copies of this License in the various documents with a single copy
+     that is included in the collection, provided that you follow the
+     rules of this License for verbatim copying of each of the
+     documents in all other respects.
+
+     You may extract a single document from such a collection, and
+     distribute it individually under this License, provided you insert
+     a copy of this License into the extracted document, and follow
+     this License in all other respects regarding verbatim copying of
+     that document.
+
+  7. AGGREGATION WITH INDEPENDENT WORKS
+
+     A compilation of the Document or its derivatives with other
+     separate and independent documents or works, in or on a volume of
+     a storage or distribution medium, is called an "aggregate" if the
+     copyright resulting from the compilation is not used to limit the
+     legal rights of the compilation's users beyond what the individual
+     works permit.  When the Document is included in an aggregate, this
+     License does not apply to the other works in the aggregate which
+     are not themselves derivative works of the Document.
+
+     If the Cover Text requirement of section 3 is applicable to these
+     copies of the Document, then if the Document is less than one half
+     of the entire aggregate, the Document's Cover Texts may be placed
+     on covers that bracket the Document within the aggregate, or the
+     electronic equivalent of covers if the Document is in electronic
+     form.  Otherwise they must appear on printed covers that bracket
+     the whole aggregate.
+
+  8. TRANSLATION
+
+     Translation is considered a kind of modification, so you may
+     distribute translations of the Document under the terms of section
+     4.  Replacing Invariant Sections with translations requires special
+     permission from their copyright holders, but you may include
+     translations of some or all Invariant Sections in addition to the
+     original versions of these Invariant Sections.  You may include a
+     translation of this License, and all the license notices in the
+     Document, and any Warranty Disclaimers, provided that you also
+     include the original English version of this License and the
+     original versions of those notices and disclaimers.  In case of a
+     disagreement between the translation and the original version of
+     this License or a notice or disclaimer, the original version will
+     prevail.
+
+     If a section in the Document is Entitled "Acknowledgements",
+     "Dedications", or "History", the requirement (section 4) to
+     Preserve its Title (section 1) will typically require changing the
+     actual title.
+
+  9. TERMINATION
+
+     You may not copy, modify, sublicense, or distribute the Document
+     except as expressly provided under this License.  Any attempt
+     otherwise to copy, modify, sublicense, or distribute it is void,
+     and will automatically terminate your rights under this License.
+
+     However, if you cease all violation of this License, then your
+     license from a particular copyright holder is reinstated (a)
+     provisionally, unless and until the copyright holder explicitly
+     and finally terminates your license, and (b) permanently, if the
+     copyright holder fails to notify you of the violation by some
+     reasonable means prior to 60 days after the cessation.
+
+     Moreover, your license from a particular copyright holder is
+     reinstated permanently if the copyright holder notifies you of the
+     violation by some reasonable means, this is the first time you have
+     received notice of violation of this License (for any work) from
+     that copyright holder, and you cure the violation prior to 30 days
+     after your receipt of the notice.
+
+     Termination of your rights under this section does not terminate
+     the licenses of parties who have received copies or rights from
+     you under this License.  If your rights have been terminated and
+     not permanently reinstated, receipt of a copy of some or all of
+     the same material does not give you any rights to use it.
+
+ 10. FUTURE REVISIONS OF THIS LICENSE
+
+     The Free Software Foundation may publish new, revised versions of
+     the GNU Free Documentation License from time to time.  Such new
+     versions will be similar in spirit to the present version, but may
+     differ in detail to address new problems or concerns.  See
+     `http://www.gnu.org/copyleft/'.
+
+     Each version of the License is given a distinguishing version
+     number.  If the Document specifies that a particular numbered
+     version of this License "or any later version" applies to it, you
+     have the option of following the terms and conditions either of
+     that specified version or of any later version that has been
+     published (not as a draft) by the Free Software Foundation.  If
+     the Document does not specify a version number of this License,
+     you may choose any version ever published (not as a draft) by the
+     Free Software Foundation.  If the Document specifies that a proxy
+     can decide which future versions of this License can be used, that
+     proxy's public statement of acceptance of a version permanently
+     authorizes you to choose that version for the Document.
+
+ 11. RELICENSING
+
+     "Massive Multiauthor Collaboration Site" (or "MMC Site") means any
+     World Wide Web server that publishes copyrightable works and also
+     provides prominent facilities for anybody to edit those works.  A
+     public wiki that anybody can edit is an example of such a server.
+     A "Massive Multiauthor Collaboration" (or "MMC") contained in the
+     site means any set of copyrightable works thus published on the MMC
+     site.
+
+     "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0
+     license published by Creative Commons Corporation, a not-for-profit
+     corporation with a principal place of business in San Francisco,
+     California, as well as future copyleft versions of that license
+     published by that same organization.
+
+     "Incorporate" means to publish or republish a Document, in whole or
+     in part, as part of another Document.
+
+     An MMC is "eligible for relicensing" if it is licensed under this
+     License, and if all works that were first published under this
+     License somewhere other than this MMC, and subsequently
+     incorporated in whole or in part into the MMC, (1) had no cover
+     texts or invariant sections, and (2) were thus incorporated prior
+     to November 1, 2008.
+
+     The operator of an MMC Site may republish an MMC contained in the
+     site under CC-BY-SA on the same site at any time before August 1,
+     2009, provided the MMC is eligible for relicensing.
+
+
+ADDENDUM: How to use this License for your documents
+----------------------------------------------------
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and license
+notices just after the title page:
+
+       Copyright (C)  YEAR  YOUR NAME.
+       Permission is granted to copy, distribute and/or modify this document
+       under the terms of the GNU Free Documentation License, Version 1.3
+       or any later version published by the Free Software Foundation;
+       with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+       Texts.  A copy of the license is included in the section entitled ``GNU
+       Free Documentation License''.
+
+   If you have Invariant Sections, Front-Cover Texts and Back-Cover
+Texts, replace the "with...Texts." line with this:
+
+         with the Invariant Sections being LIST THEIR TITLES, with
+         the Front-Cover Texts being LIST, and with the Back-Cover Texts
+         being LIST.
+
+   If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+   If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License, to
+permit their use in free software.
+
+\1f
+File: auctex.info,  Node: Changes,  Next: Development,  Prev: Copying this Manual,  Up: Appendices
+
+A.2 Changes and New Features
+============================
+
+News in 11.86
+-------------
+
+   * Parsing of LaTeX output was improved.  It is now less likely that
+     AUCTeX opens a non-existent file upon calling `TeX-next-error'; a
+     problem for example encountered when using MiKTeX 2.8.  In addition
+     quoted file names as emitted by MiKTeX are now supported.
+
+   * A new framework for the definition and selection of viewers was
+     implemented.  If you have customizations regarding viewers you
+     will have to redo them in this new framework or reenable the old
+     one.  *Note Starting Viewers::, for details.
+
+   * Comprehensive editing support for PSTricks was added.
+
+   * Support for various LaTeX packages was added, e.g. `tabularx',
+     `CJK', and `hyperref'.
+
+   * An easy way to switch between TeX engines (PDFTeX, LuaTeX, XeTeX,
+     Omega) was added.
+
+   * Support for SyncTeX was added.  This involves the command line
+     options for LaTeX and the viewer.
+
+   * Folding can now be customized to use macro arguments as replacement
+     text.
+
+   * `preview.sty' now works with XeTeX.
+
+   * A lot of smaller and larger bugs have been squashed.
+
+News in 11.85
+-------------
+
+   * Font locking has been improved significantly.  It is now less
+     prone to color bleeding which could lead to high resource usage.
+     In addition it now includes information about LaTeX macro syntax
+     and can indicate syntactically incorrect macros in LaTeX mode.
+
+   * The license was updated to GPLv3.
+
+   * Support for the nomencl, flashcards and comment LaTeX packages as
+     well as the Icelandic language option of babel were added.
+
+   * Support for folding of math macros was added.
+
+   * Lots of minor bugs in features and documentation fixed.
+
+News in 11.84
+-------------
+
+   * There have been problems with the `-without-texmf-dir' option to
+     `configure' when the value of `-with-kpathsea-sep' was set or
+     determined for an installation system with a default different
+     from that of the runtime system.  `with-kpathsea-sep' has been
+     removed; the setting is now usually determined at runtime.
+
+     Due to this and other problems, preview-latex in the released
+     XEmacs package failed under Windows or with anything except recent
+     21.5 XEmacsen.
+
+   * AUCTeX and preview-latex have been changed in order to accommodate
+     file names containing spaces.  preview-latex now tolerates bad
+     PostScript code polluting the stack (like some Omega fonts).
+
+   * `preview.sty' had in some cases failed to emit PostScript header
+     specials.
+
+   * Support for folding of comments was added.
+
+   * The `polish' language option of the babel LaTeX package as well as
+     the polski LaTeX package are now supported.  Most notably this
+     means that AUCTeX will help to insert quotation marks as defined
+     by polish.sty (`"`..."'') and polski.sty (`,,...''').
+
+   * The TeX tool bar is now available and enabled by default in plain
+     TeX mode.  *Note Processing Facilities::.
+
+   * Bug fix in the display of math subscripts and superscripts.
+
+   * Bug fix `TeX-doc' for Emacs 21.
+
+   * There has been quite a number of other bug fixes to various
+     features and documentation across the board.
+
+
+News in 11.83
+-------------
+
+   * The new function `TeX-doc' provides easy access to documentation
+     about commands and packages or information related to TeX and
+     friends in general.  *Note Documentation::.
+
+   * You can now get rid of generated intermediate and output files by
+     means of the new `Clean' and `Clean All' entries in
+     `TeX-command-list' accessible with `C-c C-c' or the Command menu.
+     *Note Cleaning::.
+
+   * Support for forward search with PDF files was added.  That means
+     you can jump to a place in the output file corresponding to the
+     position in the source file.  *Note Viewing::.
+
+     Adding support for this feature required the default value of the
+     variable `TeX-output-view-style' to be changed.  Please make sure
+     you either remove any customizations overriding the new default or
+     incorporate the changes into your customizations if you want to
+     use this feature.
+
+   * TeX error messages of the `-file-line-error' kind are now
+     understood in AUCTeX and preview-latex (parsers are still
+     separate).
+
+   * Bug fix in XyMTeX support.
+
+   * The LaTeX tool bar is now enabled by default.  *Note Processing
+     Facilities::.
+
+
+News in 11.82
+-------------
+
+   * Support for the MinionPro LaTeX package was added.
+
+   * Warnings and underfull/overfull boxes are now being indicated in
+     the echo area after a LaTeX run, if the respective debugging
+     options are activated with `TeX-toggle-debug-warnings' (`C-c C-t
+     C-w') or `TeX-toggle-debug-bad-boxes' (`C-c C-t C-b').  In this
+     case `TeX-next-error' will find these warnings in addition to
+     normal errors.
+
+     The key binding `C-c C-w' for `TeX-toggle-debug-bad-boxes' (which
+     was renamed from `TeX-toggle-debug-boxes') now is deprecated.
+
+   * AUCTeX now can automatically insert a pair of braces after typing
+     <_> or <^> in math constructs if the new variable
+     `TeX-electric-sub-and-superscript' is set to a non-nil value.
+
+   * Some language-specific support for French was added.  There now is
+     completion support for the commands provided by the `frenchb' (and
+     `francais') options of the babel LaTeX package and easier input of
+     French quotation marks (`\\og ...\\fg') which can now be inserted
+     by typing <">.
+
+   * Completion support for options of some LaTeX packages was added.
+
+   * Already in version 11.81 the way to activate AUCTeX changed
+     substantially.  This should now be done with `(load "auctex.el" nil
+     t t)' instead of the former `(require 'tex-site)'.  Related to this
+     change `tex-mik.el' does not load `tex-site.el' anymore.  That
+     means if you used only `(require 'tex-mik)' in order to activate
+     AUCTeX, you have to add `(load "auctex.el" nil t t)' before the
+     latter statement.  *Note Loading the package::.
+
+   * Handling of verbatim constructs was consolidated across AUCTeX.
+     This resulted in the font-latex-specific variables
+     `font-latex-verb-like-commands', `font-latex-verbatim-macros', and
+     `font-latex-verbatim-environments' being removed and the more
+     general variables `LaTeX-verbatim-macros-with-delims',
+     `LaTeX-verbatim-macros-with-braces', and
+     `LaTeX-verbatim-environments' being added.
+
+   * The output of a BibTeX run is now checked for warnings and errors,
+     which are reported in the echo area.
+
+   * The aliases for `font-latex-title-fontify' were removed.  Use
+     `font-latex-fontify-sectioning' instead.
+
+   * The problem that Japanese macros where broken across lines was
+     fixed.
+
+   * Various bug fixes.
+
+News in 11.81
+-------------
+
+   * `LaTeX-mark-section' now marks subsections of a given section as
+     well.  The former behavior is available via the prefix argument.
+
+   * preview-latex which was previously available separately became a
+     subsystem of AUCTeX.  There is no documented provision for building
+     or installing preview-latex separately.  It is still possible to
+     use and install AUCTeX without preview-latex, however.
+
+   * The installation procedures have been overhauled and now also
+     install startup files as part of the process (those had to be
+     copied manually previously).  You are advised to remove previous
+     installations of AUCTeX and preview-latex before starting the
+     installation procedure.  A standard installation from an
+     unmodified tarball no longer requires Makeinfo or Perl.
+
+     Also note that the way AUCTeX is supposed to be activated changed.
+     Instead of `(require 'tex-site)' you should now use `(load
+     "auctex.el" nil t t)'.  While the former method may still work,
+     the new method has the advantage that you can deactivate a
+     preactivated AUCTeX with the statement `(unload-feature
+     'tex-site)' before any of its modes have been used.  This may be
+     important especially for site-wide installations.
+
+   * Support for the babel LaTeX package was added.
+
+   * Folding a buffer now ensures that the whole buffer is fontified
+     before the actual folding is carried out.  If this results in
+     unbearably long execution times, you can fall back to the old
+     behavior of relying on stealth font locking to do this job in the
+     background by customizing the variable `TeX-fold-force-fontify'.
+
+   * Folded content now reveals part of its original text in a tooltip
+     or the echo area when hovering with the mouse pointer over it.
+
+   * The language-specific insertion of quotation marks was
+     generalized.  The variables `LaTeX-german-open-quote',
+     `LaTeX-german-close-quote', `LaTeX-german-quote-after-quote',
+     `LaTeX-italian-open-quote', `LaTeX-italian-close-quote', and
+     `LaTeX-italian-quote-after-quote' are now obsolete.  If you are not
+     satisfied with the default settings, you should customize
+     `TeX-quote-language-alist' instead.
+
+   * Similar to language-specific quote insertion, AUCTeX now helps you
+     with hyphens in different languages as well.  *Note European::,
+     for details.
+
+   * Fill problems in Japanese text introduced in AUCTeX 11.55 were
+     fixed.  AUCTeX tries not to break lines between 1-byte and 2-byte
+     chars.  These features will work in Chinese text, too.
+
+   * The scaling factor of the fontification of sectioning commands can
+     now be customized using the variable
+     `font-latex-fontify-sectioning'.  This variable was previously
+     called `font-latex-title-fontify'; In this release we provide an
+     alias but this will disappear in one of the the next releases.
+     The faces for the sectioning commands are now called
+     `font-latex-sectioning-N-face' (N=0...5) instead of
+     `font-latex-title-N-face' (N=1...4).  Analogously the names of the
+     variables holding the related keyword lists were changed from
+     `font-latex-title-N-keywords' to
+     `font-latex-sectioning-N-keywords'.  *Note Font Locking::, for
+     details.  Make sure to adjust your customizations.
+
+   * Titles in beamer slides marked by the "\frametitle" command are
+     know displayed with the new face `font-latex-slide-title-face'.
+     You can add macros to be highlighted with this face to
+     `font-latex-match-slide-title-keywords'.
+
+   * Of course a lot of bugs have been fixed.
+
+News in 11.55
+-------------
+
+   * A bug was fixed which lead to the insertion of trailing whitespace
+     during filling.  In particular extra spaces were added to sentence
+     endings at the end of lines.  You can make this whitespace visible
+     by setting the variable `show-trailing-whitespace' to `t'.  If you
+     want to delete all trailing whitespace in a buffer, type `M-x
+     delete-trailing-whitespace RET'.
+
+   * A bug was fixed which lead to a `*Compile-Log*' buffer popping up
+     when the first LaTeX file was loaded in an Emacs session.
+
+   * On some systems the presence of an outdated Emacspeak package lead
+     to the error message `File mode specification error: (error
+     "Variable binding depth exceeds max-specpdl-size")'.  Precautions
+     were added which prevent this error from happening.  But
+     nevertheless, it is advised to upgrade or uninstall the outdated
+     Emacspeak package.
+
+   * The value of `TeX-macro-global' is not determined during
+     configuration anymore but at load time of AUCTeX.  Consequently the
+     associated configuration option `--with-tex-input-dirs' was
+     removed.
+
+   * Support for the LaTeX Japanese classes `jsarticle' and `jsbook'
+     was added.
+
+News in 11.54
+-------------
+
+   * The parser (used e.g. for `TeX-auto-generate-global') was extended
+     to recognize keywords common in LaTeX packages and classes, like
+     "\DeclareRobustCommand" or "\RequirePackage".  Additionally a bug
+     was fixed which led to duplicate entries in AUCTeX style files.
+
+   * Folding can now be done for paragraphs and regions besides single
+     constructs and the whole buffer.  With the new `TeX-fold-dwim'
+     command content can both be hidden and shown with a single key
+     binding.  In course of these changes new key bindings for
+     unfolding commands where introduced.  The old bindings are still
+     present but will be phased out in future releases.
+
+   * Info files of the manual now have a .info extension.
+
+   * There is an experimental tool bar support now.  It is not
+     activated by default.  If you want to use it, add
+          (add-hook 'LaTeX-mode-hook 'LaTeX-install-toolbar)
+     to your init file.
+
+   * The manual now contains a new chapter "Quick Start".  It explains
+     the main features and how to use them, and should be enough for a
+     new user to start using AUCTeX.
+
+   * A new section "Font Locking" was added to the manual which explains
+     syntax highlighting in AUCTeX and its customization.  Together with
+     the sections related to folding and outlining, the section is part
+     of the new chapter "Display".
+
+   * Keywords for syntax highlighting of LaTeX constructs to be typeset
+     in bold, italic or typewriter fonts may now be customized.
+     Besides the built-in classes, new keyword classes may be added by
+     customizing the variable `font-latex-user-keyword-classes'.  The
+     customization options can be found in the customization group
+     `font-latex-keywords'.
+
+   * Verbatim content is now displayed with the `fixed-pitch' face. (GNU
+     Emacs only)
+
+   * Syntax highlighting should not spill out of verbatim content
+     anymore. (GNU Emacs only)
+
+   * Verbatim commands like `\verb|...|' will not be broken anymore
+     during filling.
+
+   * You can customize the completion for graphic files with
+     `LaTeX-includegraphics-read-file'.
+
+   * Support for the LaTeX packages `url', `listings', `jurabib' and
+     `csquotes' was added with regard to command completion and syntax
+     highlighting.
+
+   * Performance of fontification and filling was improved.
+
+   * Insertion of nodes in Texinfo mode now supports completion of
+     existing node names.
+
+   * Setting the variable `LaTeX-float' to `nil' now means that you
+     will not be prompted for the float position of figures and tables.
+     You can get the old behaviour of `nil' by setting the variable to
+     `""', i.e. an empty string.  See also *note Floats::.
+
+   * The XEmacs-specific bug concerning `overlays-at' was fixed.
+
+   * Lots of bug fixes.
+
+News in 11.53
+-------------
+
+   * The LaTeX math menu can include Unicode characters if your Emacs
+     built supports it.  See the variable `LaTeX-math-menu-unicode',
+     *note Mathematics::.
+
+   * Bug fixes for XEmacs.
+
+   * Completion for graphic files in the TeX search path has been added.
+
+   * `start' is used for the viewer for MiKTeX and fpTeX.
+
+   * The variable `TeX-fold-preserve-comments' can now be customized to
+     deactivate folding in comments.
+
+News in 11.52
+-------------
+
+   * Installation and menus under XEmacs work again (maybe for the first
+     time).
+
+   * Fontification of subscripts and superscripts is now disabled when
+     the fontification engine is not able to support it properly.
+
+   * Bug fixes in the build process.
+
+News in 11.51
+-------------
+
+   * PDFTeX and Source Special support did not work with ConTeXt, this
+     has been fixed.  Similar for Source Special support under Windows.
+
+   * Omega support has been added.
+
+   * Bug fixes in the build process.
+
+   * `TeX-fold' now supports folding of environments in Texinfo mode.
+
+News in 11.50
+-------------
+
+   * The use of source specials when processing or viewing the document
+     can now be controlled with the new `TeX-source-specials' minor mode
+     which can be toggled via an entry in the Command menu or the key
+     binding `C-c C-t C-s'.  If you have customized the variable
+     `TeX-command-list', you have to re-initialize it for this to work.
+     This means to open a customization buffer for the variable by
+     typing `M-x customize-variable RET TeX-command-list RET', selecting
+     "Erase Customization" and do your customization again with the new
+     default.
+
+   * The content of the command menu now depends on the mode (plain TeX,
+     LaTeX, ConTeXt etc.).  Any former customization of the variable
+     `TeX-command-list' has to be erased.  Otherwise the command menu
+     and the customization will not work correctly.
+
+   * Support for hiding and auto-revealing macros, e.g. footnotes or
+     citations, and environments in a buffer was added, *note Folding::.
+
+   * You can now control if indentation is done upon typing <RET> by
+     customizing the variable `TeX-newline-function', *note Indenting::.
+
+   * Limited support for `doc.sty' and `ltxdoc.cls' (`dtx' files) was
+     added.  The new docTeX mode provides functionality for editing
+     documentation parts.  This includes formatting (indenting and
+     filling), adding and completion of macros and environments while
+     staying in comments as well as syntax highlighting.  (Please note
+     that the mode is not finished yet.  For example syntax
+     highlighting does not work yet in XEmacs.)
+
+   * For macro completion in docTeX mode the AUCTeX style files
+     `doc.el', `ltxdoc.el' and `ltx-base.el' were included.  The latter
+     provides general support for low-level LaTeX macros and may be
+     used with LaTeX class and style files as well.  It is currently
+     not loaded automatically for those files.
+
+   * Support for ConTeXt with a separate ConTeXt mode is now included.
+     Macro definitions for completion are available in Dutch and
+     English.
+
+   * The filling and indentation code was overhauled and is now able to
+     format commented parts of the source syntactically correct.  Newly
+     available functionality and customization options are explained in
+     the manual.
+
+   * Filling and indentation in XEmacs with preview-latex and activated
+     previews lead to the insertion of whitespace before multi-line
+     previews.  AUCTeX now contains facilities to prevent this problem.
+
+   * If `TeX-master' is set to `t', AUCTeX will now query for a master
+     file only when a new file is opened.  Existing files will be left
+     alone.  The new function `TeX-master-file-ask' (bound to `C-c _'
+     is provided for adding the variable manually.
+
+   * Sectioning commands are now shown in a larger font on display
+     devices which support such fontification.  The variable
+     `font-latex-title-fontify' can be customized to restore the old
+     appearance, i.e. the usage of a different color instead of a
+     change in size.
+
+   * Support for `alphanum.sty', `beamer.cls', `booktabs.sty',
+     `captcont.sty', `emp.sty', `paralist.sty', `subfigure.sty' and
+     `units.sty'/`nicefrac.sty' was added.  Credits go to the authors
+     mentioned in the respective AUCTeX style files.
+
+   * Inserting graphics with `C-c RET \includegraphics RET' was
+     improved.  See the variable `LaTeX-includegraphics-options-alist'.
+
+   * If `LaTeX-default-position' is `nil', don't prompt for position
+     arguments in Tabular-like environments, see *note Tabular-like::.
+
+   * Completion for available packages when using `C-c RET \usepackage
+     RET' was improved on systems using the kpathsea library.
+
+   * The commenting functionality was fixed.  The separate functions for
+     commenting and uncommenting were unified in one function for
+     paragraphs and regions respectively which do both.
+
+   * Syntax highlighting can be customized to fontify quotes delimited
+     by either >>German<< or <<French>> quotation marks by changing the
+     variable `font-latex-quotes'.
+
+   * Certain TeX/LaTeX keywords for functions, references, variables
+     and warnings will now be fontified specially.  You may add your own
+     keywords by customizing the variables
+     `font-latex-match-function-keywords',
+     `font-latex-match-reference-keywords',
+     `font-latex-match-variable-keywords' and
+     `font-latex-match-warning-keywords'.
+
+   * If you include the style files `german' or `ngerman' in a document
+     (directly or via the `babel' package), you should now customize
+     `LaTeX-german-open-quote', `LaTeX-german-close-quote' and
+     `LaTeX-german-quote-after-quote' instead of `TeX-open-quote',
+     `TeX-close-quote' and `TeX-quote-after-quote' if you want to
+     influence the type of quote insertion.
+
+   * Upon viewing an output file, the right viewer and command line
+     options for it are now determined automatically by looking at the
+     extension of the output file and certain options used in the
+     source file.  The behavior can be adapted or extended respectively
+     by customizing the variable `TeX-output-view-style'.
+
+   * You can control whether `TeX-insert-macro' (`C-c RET') ask for all
+     optional arguments by customizing the variable
+     `TeX-insert-macro-default-style', *note Completion::.
+
+   * `TeX-run-discard' is now able to completely detach a process that
+     it started.
+
+   * The build process was enhanced and is now based on `autoconf'
+     making installing AUCTeX a mostly automatic process.  See *note
+     Installation:: and *note Installation under MS Windows:: for
+     details.
+
+News in 11.14
+-------------
+
+   * Many more LaTeX and LaTeX2e commands are supported.  Done by
+     Masayuki Ataka  <ataka@milk.freemail.ne.jp>
+
+News in 11.12
+-------------
+
+   * Support for the KOMA-Script classes.  Contributed by Mark Trettin
+     <Mark.Trettin@gmx.de>.
+
+News in 11.11
+-------------
+
+   * Support for `prosper.sty', see `http://prosper.sourceforge.net/'.
+     Contributed by Phillip Lord <p.lord@russet.org.uk>.
+
+News in 11.10
+-------------
+
+   * `comment-region' now inserts %% by default.  Suggested by "Davide
+     G. M. Salvetti" <salve@debian.org>.
+
+News in 11.06
+-------------
+
+   * You can now switch between using the `font-latex' (all emacsen),
+     the `tex-font' (Emacs 21 only) or no special package for font
+     locking.  Customize `TeX-install-font-lock' for this.
+
+News in 11.04
+-------------
+
+   * Now use -t landscape by default when landscape option appears.
+     Suggested by Erik Frisk <frisk@isy.liu.se>.
+
+News in 11.03
+-------------
+
+   * Use `tex-fptex.el' for fpTeX support.  Contributed by Fabrice
+     Popineau <Fabrice.Popineau@supelec.fr>.
+
+News in 11.02
+-------------
+
+   * New user option `LaTeX-top-caption-list' specifies environments
+     where the caption should go at top.  Contributed by
+     ataka@milk.freemail.ne.jp (Masayuki Ataka).
+
+   * Allow explicit dimensions in `graphicx.sty'.  Contributed by
+     ataka@milk.freemail.ne.jp (Masayuki Ataka).
+
+   * Limited support for `verbatim.sty'.  Contributed by
+     ataka@milk.freemail.ne.jp (Masayuki Ataka).
+
+   * Better support for asmmath items.  Patch by
+     ataka@milk.freemail.ne.jp (Masayuki Ataka).
+
+   * More accurate error parsing.  Added by David Kastrup
+     <David.Kastrup@t-online.de>.
+
+News in 11.01
+-------------
+
+   * Bug fixes.
+
+Older versions
+--------------
+
+See the file `history.texi' for older changes.
+
+\1f
+File: auctex.info,  Node: Development,  Next: FAQ,  Prev: Changes,  Up: Appendices
+
+A.3 Future Development
+======================
+
+The following sections describe future development of AUCTeX.  Besides
+mid-term goals, bug reports and requests we cannot fix or honor right
+away are being gathered here.  If you have some time for Emacs Lisp
+hacking, you are encouraged to try to provide a solution to one of the
+following problems.  If you don't know Lisp, you may help us to improve
+the documentation.  It might be a good idea to discuss proposed changes
+on the mailing list of AUCTeX first.
+
+* Menu:
+
+* Mid-term Goals::
+* Wishlist::
+* Bugs::
+
+\1f
+File: auctex.info,  Node: Mid-term Goals,  Next: Wishlist,  Up: Development
+
+A.3.1 Mid-term Goals
+--------------------
+
+   * Integration of preview-latex into AUCTeX
+
+     As of AUCTeX 11.81 preview-latex is a part of AUCTeX in the sense
+     that the installation routines were merged and preview-latex is
+     being packaged with AUCTeX.
+
+     Further integration will happen at the backend.  This involves
+     folding of error parsing and task management of both packages
+     which will ease development efforts and avoid redundant work.
+
+   * More flexible option and command handling
+
+     The current state of command handling with `TeX-command-list' is
+     not very flexible because there is no distinction between
+     executables and command line options to be passed to them.
+
+     Customization of `TeX-command-list' by the user will interfere with
+     updates of AUCTeX.
+
+   * Error help catalogs
+
+     Currently, the help for errors is more or less hardwired into
+     `tex.el'.  For supporting error help in other languages, it would
+     be sensible to instead arrange error messages in language-specific
+     files, make a common info file from all such catalogs in a given
+     language and look the error texts up in an appropriate index.  The
+     user would then specify a preference list of languages, and the
+     errors would be looked up in the catalogs in sequence until they
+     were identified.
+
+   * Combining `docTeX' with RefTeX
+
+     Macro cross references should also be usable for document
+     navigation using RefTeX.
+
+
+\1f
+File: auctex.info,  Node: Wishlist,  Next: Bugs,  Prev: Mid-term Goals,  Up: Development
+
+A.3.2 Wishlist
+--------------
+
+   * Documentation lookup for macros
+
+     A parser could gather information about which macros are defined in
+     which LaTeX packages and store the information in a hashtable which
+     can be used in a backend for `TeX-doc' in order to open the
+     matching documentation for a given macro.  The information could
+     also be used to insert an appropriate `\usepackage' statement if
+     the user tries to insert a macro for which the respective package
+     has not been requested yet.
+
+   * Spell checking of macros
+
+     A special ispell dictionary for macros could be nice to have.
+
+   * Quick error overviews
+
+     An error overview window (extract from the log file with just the
+     error lines, clickable like a "grep" buffer) and/or fringe
+     indicators for errors in the main text would be nice.
+
+   * A math entry grid
+
+     A separate frame with a table of math character graphics to click
+     on in order to insert the respective sequence into the buffer (cf.
+     the "grid" of x-symbol).
+
+   * Crossreferencing support
+
+     It would be nice if you could index process your favorite
+     collection of `.dtx' files (such as the LaTeX source), just call a
+     command on arbitrary control sequence, and get either the DVI
+     viewer opened right at the definition of that macro (using Source
+     Specials), or the source code of the `.dtx' file.
+
+   * Better plain TeX support
+
+     For starters, `LaTeX-math-mode' is not very LaTeX-specific in the
+     first place, and similar holds for indentation and formatting.
+
+   * Poor man's Source Specials In particular in PDF mode (and where
+     Source Specials cause problems), alternatives would be desirable.
+     One could implement inverse search by something like Heiko
+     Oberdiek's `vpe.sty', and forward search by using the `.aux' file
+     info to correlate labels in the text (possibly in cooperation with
+     RefTeX) with previewer pages.
+
+     In AUCTeX 11.83, support for forward search with PDF files was
+     added.  Currently this only works if you use the pdfsync LaTeX
+     package and xpdf as your PDF viewer.  *Note Viewing::.
+
+   * Page count when compiling should (optionally) go to modeline of the
+     window where the compilation command was invoked, instead of the
+     output window.  Suggested by Karsten Tinnefeld
+     <tinnefeld@irb.informatik.uni-dortmund.de>.
+
+   * Command to insert a macrodefinition in the preamble, without moving
+     point from the current location.  Suggested by "Jeffrey C. Ely"
+     <ely@nwu.edu>.
+
+   * A database of all commands defined in all stylefiles.  When a
+     command or environment gets entered that is provided in one of the
+     styles, insert the appropriate `\usepackage' in the preamble.
+
+   * A way to add and overwrite math mode entries in style files, and to
+     decide where they should be.  Suggested by Remo Badii
+     <Remo.Badii@psi.ch>.
+
+   * Create template for (first) line of tabular environment.
+
+   * I think prompting for the master is the intended behaviour.  It
+     corresponds to a `shared' value for TeX-master.
+
+     There should probably be a `none' value which wouldn't query for
+     the master, but instead disable all features that relies on
+     TeX-master.
+
+     This default value for TeX-master could then be controled with
+     mapping based on the extension.
+
+   * Multiple argument completion for `\bibliography'.  In general, I
+     ought to make `,' special for these kind of completions.
+
+   * Suggest `makeindex' when appropriate.
+
+   * Use index files (when available) to speed up `C-c C-m include
+     <RET>'.
+
+   * Option not to calculate very slow completions like for `C-c C-m
+     include <RET>'.
+
+   * Font menu should be created from `TeX-font-list'.
+
+   * Installation procedure written purely in emacs lisp.
+
+   * Included PostScript files should also be counted as part of the
+     document.
+
+   * A nice hierarchical by-topic organization of all officially
+     documented LaTeX macros, available from the menu bar.
+
+   * `TeX-command-default' should be set from the master file, if not
+     set locally.  Suggested by Peter Whaite `<peta@cim.mcgill.ca>'.
+
+   * Make AUCTeX work with `crypt++'.  Suggested by Chris Moore
+     `<Chris.Moore@src.bae.co.uk>'.
+
+   * Make AUCTeX work with `longlines'.  This would also apply to
+     preview-latex, though it might make sense to unify error processing
+     before attempting this.
+
+   * The `Spell' command should apply to all files in a document.  Maybe
+     it could try to restrict to files that have been modified since
+     last spell check?  Suggested by Ravinder Bhumbla
+     `<rbhumbla@ucsd.edu>'.
+
+   * Make <.> check for abbreviations and sentences ending with capital
+     letters.
+
+   * Use Emacs 19 minibuffer history to choose between previewers, and
+     other stuff.  Suggested by John Interrante
+     `<interran@uluru.Stanford.EDU>'.
+
+   * Make features.
+
+     A new command `TeX-update' (`C-c C-u') could be used to create an
+     up-to-date dvi file by repeatedly running BibTeX, MakeIndex and
+     (La)TeX, until an error occurs or we are done.
+
+     An alternative is to have an `Update' command that ensures the
+     `dvi' file is up to date.  This could be called before printing and
+     previewing.
+
+   * Documentation of variables that can be set in a style hook.
+
+     We need a list of what can safely be done in an ordinary style
+     hook.  You can not set a variable that AUCTeX depends on, unless
+     AUCTeX knows that it has to run the style hooks first.
+
+     Here is the start of such a list.
+    `LaTeX-add-environments'
+
+    `TeX-add-symbols'
+
+    `LaTeX-add-labels'
+
+    `LaTeX-add-bibliographies'
+
+    `LaTeX-largest-level'
+
+   * Completion for counters and sboxes.
+
+   * Outline should be (better) supported in TeX mode.
+
+     At least, support headers, trailers, as well as TeX-outline-extra.
+
+   * `TeX-header-start' and `TeX-trailer-end'.
+
+     We might want these, just for fun (and outlines)
+
+   * Plain TeX and LaTeX specific header and trailer expressions.
+
+     We should have a way to globally specify the default value of the
+     header and trailer regexps.
+
+   * Get closer to original `TeX-mode' keybindings.
+
+     A third initialization file (`tex-mode.el') containing an emulator
+     of the standard `TeX-mode' would help convince some people to
+     change to AUCTeX.
+
+   * Make `TeX-next-error' parse ahead and store the results in a list,
+     using markers to remember buffer positions in order to be more
+     robust with regard to line numbers and changed files.  This is what
+     `next-error' does. (Or did, until Emacs 19).
+
+   * Finish the Texinfo mode.  For one thing, many Texinfo mode
+     commands do not accept braces around their arguments.
+
+   * Hook up the letter environment with `bbdb.el'.
+
+
+\1f
+File: auctex.info,  Node: Bugs,  Prev: Wishlist,  Up: Development
+
+A.3.3 Bugs
+----------
+
+   * The parsed files and style hooks for `example.dtx', `example.sty',
+     `example.drv' and `example.bib' all clash.  Bad.
+
+   * `C-c `' should always stay in the current window, also when it
+     finds a new file.
+
+   * Do not overwrite emacs warnings about existing auto-save files when
+     loading a new file.
+
+   * Maybe the regexp for matching a TeX symbol during parsing should be
+     `"\\\\\\([a-zA-Z]+\\|.\\)"' --
+     `<thiemann@informatik.uni-tuebingen.de>' Peter Thiemann.
+
+   * AUCTeX should not parse verbatim environments.
+
+   * Make ``' check for math context in `LaTeX-math-mode'. and simply
+     self insert if not in a math context.
+
+   * Make `TeX-insert-dollar' more robust.  Currently it can be fooled
+     by `\mbox''es and escaped double dollar for example.
+
+   * Correct indentation for tabular, tabbing, table, math, and array
+     environments.
+
+   * No syntactic font locking of verbatim macros and environments.
+     (XEmacs only)
+
+   * Font locking inside of verbatim macros and environments is not
+     inhibited.  This may result in syntax highlighting of unbalanced
+     dollar signs and the like spilling out of the verbatim content.
+     (XEmacs only)
+
+   * Folding of LaTeX constructs spanning more than one line may result
+     in overfull lines. (XEmacs only)
+
+\1f
+File: auctex.info,  Node: FAQ,  Prev: Development,  Up: Appendices
+
+A.4 Frequently Asked Questions
+==============================
+
+  1. Something is not working correctly.  What should I do?
+
+     Well, you might have guessed it, the first place to look is in the
+     available documentation packaged with AUCTeX.  This could be the
+     release notes (in the `RELEASE' file) or the news section of the
+     manual in case you are experiencing problems after an upgrade, the
+     `INSTALL' file in case you are having problems with the
+     installation, the section about bugs in the manual in case you
+     encountered a bug or the relevant sections in the manual for other
+     related problems.
+
+     If this did not help, you can send a bug report to the AUCTeX bug
+     reporting list by using the command `M-x TeX-submit-bug-report
+     RET'.  But before you do this, you can try to get more information
+     about the problem at hand which might also help you locate the
+     cause of the error yourself.
+
+     First, you can try to generate a so-called backtrace which shows
+     functions involved in a program error.  In order to do this, start
+     Emacs with the command line `emacs --debug-init' and/or put the
+     line
+
+          (setq debug-on-error t)
+
+     as the first line into your init file.  XEmacs users might want to
+     add `(setq stack-trace-on-error t)' as well.  After Emacs has
+     started, you can load a file which triggers the error and a new
+     window should pop up showing the backtrace.  If you get such a
+     backtrace, please include it in the bug report.
+
+     Second, you can try to figure out if something in your personal or
+     site configuration triggers the error by starting Emacs without
+     such customizations.  You can do this by invoking Emacs with the
+     command line `emacs -q -no-site-file'.  Once Emacs is running,
+     copy the line
+
+          (load "auctex.el" nil t t)
+
+     into the `*scratch*' buffer and type `M-x eval-buffer RET'.  This
+     makes sure that AUCTeX will be used for the file types it
+     supports.  After you have done so, you can load the file
+     triggering the error.  If everything is working now, you know that
+     you have to search either in the site configuration file or your
+     personal init file for statements related to the problem.
+
+  2. What versions of Emacs and XEmacs are supported?
+
+     AUCTeX was tested with Emacs 21 and XEmacs 21.4.15.  Older
+     versions may work but are unsupported.  Older versions of XEmacs
+     might possibly made to work by updating the `xemacs-base' package
+     through the XEmacs package system.  If you are looking for a
+     recommendation, it would appear that the smoothest working
+     platform on all operating systems at the current point of time
+     would be Emacs 22.1.  At the time of this writing, however, it has
+     not been released and is still under development.  The quality of
+     the development version is quite solid, so we recommend giving it
+     a try.  With a developer version, of course, you have to be
+     prepared to update in case you managed to get your snapshot at a
+     bad time.  The second best choice would be the latest released
+     Emacs 21.4.  However, Unicode support is less good, there is no
+     version for the popular GTK toolkit, and the native versions for
+     Windows and MacOS don't offer toolbar and preview-latex support.
+
+     Our success with XEmacs has been less than convincing.  Under the
+     Windows operating system, nominally the only option for a released,
+     stable Emacs variant supporting toolbars and preview-latex would be
+     XEmacs 21.4.  However, code for core functionality like formatting
+     and syntax highlighting tends to be different and often older than
+     even Emacs 21.4, and Unicode support as delivered is problematic
+     at best, missing on Windows.  Both AUCTeX and XEmacs developers
+     don't hear much from active users of the combination.  Partly for
+     that reason, problems tend to go unnoticed for long amounts of
+     time and are often found, if at all, after releases.  No
+     experiences or recommendations can be given for beta or developer
+     versions of XEmacs.
+
+  3. What should I do when `./configure' does not find programs like
+     latex?
+
+     This is problem often encountered on Windows.  Make sure that the
+     `PATH' environment variable includes the directories containing the
+     relevant programs, as described in *note Installation under MS
+     Windows: (auctex)Installation under MS Windows.
+
+  4. Why doesn't the completion, style file, or multi-file stuff work?
+
+     It must be enabled first, insert this in your init file:
+
+          (setq-default TeX-master nil)
+          (setq TeX-parse-self t)
+          (setq TeX-auto-save t)
+
+     Read also the chapters about parsing and multifile documents in the
+     manual.
+
+  5. Why doesn't `TeX-save-document' work?
+
+     `TeX-check-path' has to contain "./" somewhere.
+
+  6. Why is the information in `foo.tex' forgotten when I save
+     `foo.bib'?
+
+     For various reasons, AUCTeX ignores the extension when it stores
+     information about a file, so you should use unique base names for
+     your files.  E.g. rename `foo.bib' to `foob.bib'.
+
+  7. Why doesn't AUCTeX signal when processing a document is done?
+
+     If the message in the minibuffer stays "Type `C-c C-l' to display
+     results of compilation.", you probably have a misconfiguration in
+     your init file (`.emacs', `init.el' or similar).  To track this
+     down either search in the `*Messages*' buffer for an error message
+     or put `(setq debug-on-error t)' as the first line into your init
+     file, restart Emacs and open a LaTeX file.  Emacs will complain
+     loudly by opening a debugging buffer as soon as an error occurs.
+     The information in the debugging buffer can help you find the
+     cause of the error in your init file.
+
+  8. What does AUC stand for?
+
+     AUCTeX came into being at Aalborg University in Denmark.  Back then
+     the Danish name of the university was Aalborg Universitetscenter;
+     AUC for short.
+
+
+\1f
+File: auctex.info,  Node: Indices,  Prev: Appendices,  Up: Top
+
+Indices
+*******
+
+* Menu:
+
+* Key Index::
+* Function Index::
+* Variable Index::
+* Concept Index::
+
+\1f
+File: auctex.info,  Node: Key Index,  Next: Function Index,  Up: Indices
+
+Key Index
+=========
+
+\0\b[index\0\b]
+* Menu:
+
+* ":                                     Quotes.              (line  15)
+* $:                                     Quotes.              (line  62)
+* <LFD>:                                 Indenting.           (line  72)
+* <TAB>:                                 Indenting.           (line  69)
+* C-c %:                                 Commenting.          (line  23)
+* C-c ;:                                 Commenting.          (line  15)
+* C-c <LFD>:                             Itemize-like.        (line  10)
+* C-c ?:                                 Documentation.       (line   7)
+* C-c ]:                                 Environments.        (line  56)
+* C-c ^:                                 Control.             (line  18)
+* C-c _:                                 Multifile.           (line  70)
+* C-c `:                                 Debugging.           (line  10)
+* C-c C-b:                               Starting a Command.  (line  35)
+* C-c C-c:                               Starting a Command.  (line  13)
+* C-c C-d:                               Multifile.           (line  98)
+* C-c C-e:                               Environments.        (line  20)
+* C-c C-f:                               Font Specifiers.     (line  44)
+* C-c C-f C-b <1>:                       Font Specifiers.     (line  16)
+* C-c C-f C-b:                           Editing Facilities.  (line  73)
+* C-c C-f C-c <1>:                       Font Specifiers.     (line  37)
+* C-c C-f C-c:                           Editing Facilities.  (line  94)
+* C-c C-f C-e <1>:                       Font Specifiers.     (line  22)
+* C-c C-f C-e:                           Editing Facilities.  (line  79)
+* C-c C-f C-f <1>:                       Font Specifiers.     (line  31)
+* C-c C-f C-f:                           Editing Facilities.  (line  88)
+* C-c C-f C-i <1>:                       Font Specifiers.     (line  19)
+* C-c C-f C-i:                           Editing Facilities.  (line  76)
+* C-c C-f C-r <1>:                       Font Specifiers.     (line  28)
+* C-c C-f C-r:                           Editing Facilities.  (line  85)
+* C-c C-f C-s <1>:                       Font Specifiers.     (line  25)
+* C-c C-f C-s:                           Editing Facilities.  (line  82)
+* C-c C-f C-t <1>:                       Font Specifiers.     (line  34)
+* C-c C-f C-t:                           Editing Facilities.  (line  91)
+* C-c C-k:                               Control.             (line  10)
+* C-c C-l:                               Control.             (line  14)
+* C-c C-m:                               Completion.          (line  30)
+* C-c C-n:                               Parsing Files.       (line  44)
+* C-c C-o b:                             Folding.             (line 113)
+* C-c C-o C-b:                           Folding.             (line  44)
+* C-c C-o C-c:                           Folding.             (line 110)
+* C-c C-o C-e:                           Folding.             (line  94)
+* C-c C-o C-f:                           Folding.             (line  32)
+* C-c C-o C-m:                           Folding.             (line  85)
+* C-c C-o C-o:                           Folding.             (line 132)
+* C-c C-o C-p:                           Folding.             (line  81)
+* C-c C-o C-r:                           Folding.             (line  78)
+* C-c C-o i:                             Folding.             (line 125)
+* C-c C-o p:                             Folding.             (line 121)
+* C-c C-o r:                             Folding.             (line 117)
+* C-c C-q C-e:                           Filling.             (line  92)
+* C-c C-q C-p:                           Filling.             (line  86)
+* C-c C-q C-r:                           Filling.             (line 101)
+* C-c C-q C-s:                           Filling.             (line  97)
+* C-c C-r:                               Starting a Command.  (line  19)
+* C-c C-s:                               Sectioning.          (line  23)
+* C-c C-t C-b:                           Debugging.           (line  19)
+* C-c C-t C-i:                           Processor Options.   (line  29)
+* C-c C-t C-p:                           Processor Options.   (line  15)
+* C-c C-t C-r:                           Starting a Command.  (line  61)
+* C-c C-t C-s:                           Processor Options.   (line  36)
+* C-c C-t C-w:                           Debugging.           (line  23)
+* C-c C-v:                               Starting Viewers.    (line  12)
+* C-c {:                                 Quotes.              (line  86)
+* C-c ~:                                 Mathematics.         (line  12)
+* C-j:                                   Indenting.           (line  81)
+* M-<TAB>:                               Completion.          (line  20)
+* M-q:                                   Filling.             (line  89)
+
+\1f
+File: auctex.info,  Node: Function Index,  Next: Variable Index,  Prev: Key Index,  Up: Indices
+
+Function Index
+==============
+
+\0\b[index\0\b]
+* Menu:
+
+* LaTeX-add-bibliographies:              Adding Other.        (line  11)
+* LaTeX-add-environments:                Adding Environments. (line  67)
+* LaTeX-add-labels:                      Adding Other.        (line  14)
+* LaTeX-close-environment:               Environments.        (line  56)
+* LaTeX-env-args:                        Adding Environments. (line 109)
+* LaTeX-env-array:                       Adding Environments. (line  81)
+* LaTeX-env-bib:                         Adding Environments. (line 103)
+* LaTeX-env-contents:                    Adding Environments. (line 106)
+* LaTeX-env-figure:                      Adding Environments. (line  77)
+* LaTeX-env-item:                        Adding Environments. (line  74)
+* LaTeX-env-label:                       Adding Environments. (line  85)
+* LaTeX-env-list:                        Adding Environments. (line  88)
+* LaTeX-env-minipage:                    Adding Environments. (line  92)
+* LaTeX-env-picture:                     Adding Environments. (line 100)
+* LaTeX-env-tabular*:                    Adding Environments. (line  96)
+* LaTeX-environment:                     Environments.        (line  20)
+* LaTeX-fill-environment:                Filling.             (line  81)
+* LaTeX-fill-paragraph:                  Filling.             (line  86)
+* LaTeX-fill-region:                     Filling.             (line 101)
+* LaTeX-fill-section:                    Filling.             (line  97)
+* LaTeX-indent-line:                     Indenting.           (line  69)
+* LaTeX-insert-environment:              Adding Environments. (line  70)
+* LaTeX-insert-item:                     Itemize-like.        (line  10)
+* LaTeX-math-mode:                       Mathematics.         (line  12)
+* LaTeX-section:                         Sectioning.          (line  23)
+* LaTeX-section-heading:                 Sectioning.          (line  85)
+* LaTeX-section-label:                   Sectioning.          (line 101)
+* LaTeX-section-section:                 Sectioning.          (line  95)
+* LaTeX-section-title:                   Sectioning.          (line  89)
+* LaTeX-section-toc:                     Sectioning.          (line  92)
+* TeX-add-style-hook:                    Simple Style.        (line  28)
+* TeX-add-symbols:                       Adding Macros.       (line  25)
+* TeX-arg-cite:                          Adding Macros.       (line 105)
+* TeX-arg-conditional:                   Adding Macros.       (line  82)
+* TeX-arg-coordinate:                    Adding Macros.       (line 165)
+* TeX-arg-corner:                        Adding Macros.       (line 143)
+* TeX-arg-counter:                       Adding Macros.       (line 108)
+* TeX-arg-define-cite:                   Adding Macros.       (line 134)
+* TeX-arg-define-counter:                Adding Macros.       (line 137)
+* TeX-arg-define-environment:            Adding Macros.       (line 130)
+* TeX-arg-define-label:                  Adding Macros.       (line 122)
+* TeX-arg-define-macro:                  Adding Macros.       (line 126)
+* TeX-arg-define-savebox:                Adding Macros.       (line 140)
+* TeX-arg-environment:                   Adding Macros.       (line 102)
+* TeX-arg-eval:                          Adding Macros.       (line  93)
+* TeX-arg-file:                          Adding Macros.       (line 114)
+* TeX-arg-free:                          Adding Macros.       (line  90)
+* TeX-arg-input-file:                    Adding Macros.       (line 118)
+* TeX-arg-label:                         Adding Macros.       (line  96)
+* TeX-arg-literal:                       Adding Macros.       (line  86)
+* TeX-arg-lr:                            Adding Macros.       (line 146)
+* TeX-arg-macro:                         Adding Macros.       (line  99)
+* TeX-arg-pagestyle:                     Adding Macros.       (line 152)
+* TeX-arg-pair:                          Adding Macros.       (line 158)
+* TeX-arg-savebox:                       Adding Macros.       (line 111)
+* TeX-arg-size:                          Adding Macros.       (line 162)
+* TeX-arg-tb:                            Adding Macros.       (line 149)
+* TeX-arg-verb:                          Adding Macros.       (line 155)
+* TeX-auto-generate:                     Automatic Private.   (line  24)
+* TeX-clean:                             Cleaning.            (line   7)
+* TeX-command-buffer:                    Starting a Command.  (line  35)
+* TeX-command-master:                    Starting a Command.  (line  13)
+* TeX-command-region:                    Starting a Command.  (line  19)
+* TeX-comment-or-uncomment-paragraph:    Commenting.          (line  23)
+* TeX-comment-or-uncomment-region:       Commenting.          (line  15)
+* TeX-complete-symbol:                   Completion.          (line  20)
+* TeX-doc:                               Documentation.       (line   7)
+* TeX-electric-macro:                    Completion.          (line  67)
+* TeX-fold-buffer:                       Folding.             (line  44)
+* TeX-fold-clearout-buffer:              Folding.             (line 113)
+* TeX-fold-clearout-item:                Folding.             (line 125)
+* TeX-fold-clearout-paragraph:           Folding.             (line 121)
+* TeX-fold-clearout-region:              Folding.             (line 117)
+* TeX-fold-comment:                      Folding.             (line 110)
+* TeX-fold-dwim:                         Folding.             (line 132)
+* TeX-fold-env:                          Folding.             (line  94)
+* TeX-fold-macro:                        Folding.             (line  85)
+* TeX-fold-math:                         Folding.             (line 101)
+* TeX-fold-mode:                         Folding.             (line  32)
+* TeX-fold-paragraph:                    Folding.             (line  81)
+* TeX-fold-region:                       Folding.             (line  78)
+* TeX-font:                              Font Specifiers.     (line  44)
+* TeX-header-end:                        Multifile.           (line  29)
+* TeX-home-buffer:                       Control.             (line  18)
+* TeX-insert-braces:                     Quotes.              (line  86)
+* TeX-insert-dollar:                     Quotes.              (line  62)
+* TeX-insert-macro:                      Completion.          (line  30)
+* TeX-insert-quote:                      Quotes.              (line  15)
+* TeX-interactive-mode:                  Processor Options.   (line  29)
+* TeX-kill-job:                          Control.             (line  10)
+* TeX-master-file-ask:                   Multifile.           (line  70)
+* TeX-next-error:                        Debugging.           (line  10)
+* TeX-normal-mode:                       Parsing Files.       (line  44)
+* TeX-PDF-mode:                          Processor Options.   (line  15)
+* TeX-pin-region:                        Starting a Command.  (line  61)
+* TeX-recenter-output-buffer:            Control.             (line  14)
+* TeX-save-document:                     Multifile.           (line  98)
+* TeX-source-correlate-mode <1>:         I/O Correlation.     (line  12)
+* TeX-source-correlate-mode:             Processor Options.   (line  36)
+* TeX-toggle-debug-bad-boxes:            Debugging.           (line  19)
+* TeX-toggle-debug-warnings:             Debugging.           (line  23)
+* TeX-view <1>:                          I/O Correlation.     (line  20)
+* TeX-view:                              Starting Viewers.    (line  12)
+
+\1f
+File: auctex.info,  Node: Variable Index,  Next: Concept Index,  Prev: Function Index,  Up: Indices
+
+Variable Index
+==============
+
+\0\b[index\0\b]
+* Menu:
+
+* ConTeXt-clean-intermediate-suffixes:   Cleaning.            (line   7)
+* ConTeXt-clean-output-suffixes:         Cleaning.            (line   7)
+* ConTeXt-engine:                        Processor Options.   (line  83)
+* ConTeXt-Omega-engine:                  Processor Options.   (line  83)
+* docTeX-clean-intermediate-suffixes:    Cleaning.            (line   7)
+* docTeX-clean-output-suffixes:          Cleaning.            (line   7)
+* font-latex-deactivated-keyword-classes: Fontification of macros.
+                                                              (line 174)
+* font-latex-fontify-script:             Fontification of math.
+                                                              (line  21)
+* font-latex-fontify-sectioning:         Fontification of macros.
+                                                              (line 102)
+* font-latex-match-bold-command-keywords: Fontification of macros.
+                                                              (line 143)
+* font-latex-match-bold-declaration-keywords: Fontification of macros.
+                                                              (line 143)
+* font-latex-match-function-keywords:    Fontification of macros.
+                                                              (line  66)
+* font-latex-match-italic-command-keywords: Fontification of macros.
+                                                              (line 143)
+* font-latex-match-italic-declaration-keywords: Fontification of macros.
+                                                              (line 143)
+* font-latex-match-math-command-keywords <1>: Fontification of math.
+                                                              (line   6)
+* font-latex-match-math-command-keywords: Fontification of macros.
+                                                              (line 143)
+* font-latex-match-reference-keywords:   Fontification of macros.
+                                                              (line  66)
+* font-latex-match-sectioning-0-keywords: Fontification of macros.
+                                                              (line 113)
+* font-latex-match-sectioning-1-keywords: Fontification of macros.
+                                                              (line 113)
+* font-latex-match-sectioning-2-keywords: Fontification of macros.
+                                                              (line 113)
+* font-latex-match-sectioning-3-keywords: Fontification of macros.
+                                                              (line 113)
+* font-latex-match-sectioning-4-keywords: Fontification of macros.
+                                                              (line 113)
+* font-latex-match-sectioning-5-keywords: Fontification of macros.
+                                                              (line 113)
+* font-latex-match-slide-title-keywords: Fontification of macros.
+                                                              (line 120)
+* font-latex-match-textual-keywords:     Fontification of macros.
+                                                              (line  66)
+* font-latex-match-type-command-keywords: Fontification of macros.
+                                                              (line 143)
+* font-latex-match-type-declaration-keywords: Fontification of macros.
+                                                              (line 143)
+* font-latex-match-variable-keywords:    Fontification of macros.
+                                                              (line  66)
+* font-latex-match-warning-keywords:     Fontification of macros.
+                                                              (line  66)
+* font-latex-math-environments:          Fontification of math.
+                                                              (line   6)
+* font-latex-quotes:                     Fontification of quotes.
+                                                              (line  16)
+* font-latex-script-display:             Fontification of math.
+                                                              (line  29)
+* font-latex-sectioning-0-face:          Fontification of macros.
+                                                              (line 102)
+* font-latex-sectioning-1-face:          Fontification of macros.
+                                                              (line 102)
+* font-latex-sectioning-2-face:          Fontification of macros.
+                                                              (line 102)
+* font-latex-sectioning-3-face:          Fontification of macros.
+                                                              (line 102)
+* font-latex-sectioning-4-face:          Fontification of macros.
+                                                              (line 102)
+* font-latex-sectioning-5-face:          Fontification of macros.
+                                                              (line 102)
+* font-latex-slide-title-face:           Fontification of macros.
+                                                              (line 120)
+* font-latex-user-keyword-classes:       Fontification of macros.
+                                                              (line 204)
+* japanese-LaTeX-command-default:        Japanese.            (line   6)
+* japanese-LaTeX-default-style:          Japanese.            (line   6)
+* japanese-TeX-command-default:          Japanese.            (line   6)
+* LaTeX-amsmath-label:                   Equations.           (line  16)
+* LaTeX-auto-label-regexp-list:          Parsing Files.       (line 100)
+* LaTeX-auto-minimal-regexp-list:        Parsing Files.       (line  97)
+* LaTeX-auto-regexp-list:                Parsing Files.       (line 103)
+* LaTeX-babel-hyphen:                    European.            (line 150)
+* LaTeX-babel-hyphen-after-hyphen:       European.            (line 158)
+* LaTeX-babel-hyphen-language-alist:     European.            (line 137)
+* LaTeX-clean-intermediate-suffixes:     Cleaning.            (line   7)
+* LaTeX-clean-output-suffixes:           Cleaning.            (line   7)
+* LaTeX-command:                         Processor Options.   (line  83)
+* LaTeX-csquotes-close-quote:            Quotes.              (line  44)
+* LaTeX-csquotes-open-quote:             Quotes.              (line  44)
+* LaTeX-csquotes-quote-after-quote:      Quotes.              (line  44)
+* LaTeX-default-environment:             Environments.        (line  35)
+* LaTeX-default-format:                  Tabular-like.        (line  11)
+* LaTeX-default-position:                Tabular-like.        (line  14)
+* LaTeX-enable-toolbar:                  Processing.          (line  11)
+* LaTeX-eqnarray-label:                  Equations.           (line  13)
+* LaTeX-equation-label:                  Equations.           (line  10)
+* LaTeX-figure-label:                    Floats.              (line  25)
+* LaTeX-fill-break-at-separators:        Filling.             (line 104)
+* LaTeX-fill-break-before-code-comments: Filling.             (line 114)
+* LaTeX-float:                           Floats.              (line  14)
+* LaTeX-fold-env-spec-list:              Folding.             (line 189)
+* LaTeX-fold-macro-spec-list:            Folding.             (line 189)
+* LaTeX-fold-math-spec-list:             Folding.             (line 189)
+* LaTeX-font-list:                       Font Specifiers.     (line  59)
+* LaTeX-indent-environment-check:        Indenting.           (line  51)
+* LaTeX-indent-environment-list:         Indenting.           (line  37)
+* LaTeX-indent-level:                    Indenting.           (line  19)
+* LaTeX-item-indent:                     Indenting.           (line  19)
+* LaTeX-item-regexp:                     Indenting.           (line  19)
+* LaTeX-math-abbrev-prefix:              Mathematics.         (line  27)
+* LaTeX-math-list:                       Mathematics.         (line  37)
+* LaTeX-math-menu-unicode:               Mathematics.         (line  55)
+* LaTeX-Omega-command:                   Processor Options.   (line  83)
+* LaTeX-paragraph-commands:              Filling.             (line  55)
+* LaTeX-section-hook:                    Sectioning.          (line  50)
+* LaTeX-section-label:                   Sectioning.          (line  53)
+* LaTeX-syntactic-comments:              Indenting.           (line  63)
+* LaTeX-table-label:                     Floats.              (line  25)
+* LaTeX-top-caption-list:                Floats.              (line  20)
+* LaTeX-verbatim-environments:           Verbatim content.    (line  10)
+* LaTeX-verbatim-macros-with-braces:     Verbatim content.    (line  10)
+* LaTeX-verbatim-macros-with-delims:     Verbatim content.    (line  10)
+* plain-TeX-auto-regexp-list:            Parsing Files.       (line 106)
+* plain-TeX-clean-intermediate-suffixes: Cleaning.            (line   7)
+* plain-TeX-clean-output-suffixes:       Cleaning.            (line   7)
+* plain-TeX-enable-toolbar:              Processing.          (line  11)
+* TeX-auto-cleanup-hook:                 Hacking the Parser.  (line 101)
+* TeX-auto-empty-regexp-list:            Parsing Files.       (line  94)
+* TeX-auto-full-regexp-list:             Parsing Files.       (line 109)
+* TeX-auto-global:                       Automatic Global.    (line  26)
+* TeX-auto-local:                        Automatic Local.     (line  23)
+* TeX-auto-parse-length:                 Parsing Files.       (line  88)
+* TeX-auto-prepare-hook:                 Hacking the Parser.  (line  98)
+* TeX-auto-private:                      Automatic Private.   (line  20)
+* TeX-auto-regexp-list <1>:              Hacking the Parser.  (line  79)
+* TeX-auto-regexp-list:                  Parsing Files.       (line  85)
+* TeX-auto-save:                         Parsing Files.       (line  41)
+* TeX-auto-untabify:                     Parsing Files.       (line  58)
+* TeX-brace-indent-level:                Indenting.           (line 103)
+* TeX-check-path:                        Selecting a Command. (line  56)
+* TeX-clean-confirm:                     Cleaning.            (line  27)
+* TeX-close-quote:                       Quotes.              (line  26)
+* TeX-command:                           Processor Options.   (line  83)
+* TeX-command-default:                   Selecting a Command. (line  43)
+* TeX-command-list <1>:                  Selecting a Command. (line  14)
+* TeX-command-list:                      Starting a Command.  (line  16)
+* TeX-default-macro:                     Completion.          (line  52)
+* TeX-default-mode:                      Japanese.            (line   6)
+* TeX-display-help:                      Debugging.           (line  31)
+* TeX-DVI-via-PDFTeX:                    Processor Options.   (line  22)
+* TeX-electric-escape:                   Completion.          (line  59)
+* TeX-electric-sub-and-superscript:      Mathematics.         (line  69)
+* TeX-engine:                            Processor Options.   (line  67)
+* TeX-engine-alist:                      Processor Options.   (line  83)
+* TeX-engine-alist-builtin:              Processor Options.   (line  83)
+* TeX-expand-list:                       Selecting a Command. (line  14)
+* TeX-file-recurse:                      Automatic.           (line  46)
+* TeX-fold-command-prefix:               Folding.             (line 137)
+* TeX-fold-env-spec-list:                Folding.             (line 180)
+* TeX-fold-force-fontify:                Folding.             (line  64)
+* TeX-fold-help-echo-max-length:         Folding.             (line 217)
+* TeX-fold-macro-spec-list:              Folding.             (line 147)
+* TeX-fold-math-spec-list:               Folding.             (line 187)
+* TeX-fold-preserve-comments:            Folding.             (line  72)
+* TeX-fold-type-list:                    Folding.             (line  59)
+* TeX-fold-unspec-env-display-string:    Folding.             (line 200)
+* TeX-fold-unspec-macro-display-string:  Folding.             (line 196)
+* TeX-fold-unspec-use-name:              Folding.             (line 204)
+* TeX-font-list:                         Font Specifiers.     (line  50)
+* TeX-header-end:                        Starting a Command.  (line  32)
+* TeX-ignore-file:                       Automatic.           (line  54)
+* TeX-insert-braces:                     Completion.          (line  77)
+* TeX-insert-macro-default-style:        Completion.          (line  38)
+* TeX-install-font-lock:                 Font Locking.        (line  14)
+* TeX-interactive-mode:                  Processor Options.   (line  29)
+* TeX-language-bg-hook:                  European.            (line  53)
+* TeX-language-cz-hook:                  European.            (line  53)
+* TeX-language-de-hook:                  European.            (line  53)
+* TeX-language-dk-hook:                  European.            (line  53)
+* TeX-language-is-hook:                  European.            (line  53)
+* TeX-language-it-hook:                  European.            (line  53)
+* TeX-language-nl-hook:                  European.            (line  53)
+* TeX-language-pl-hook:                  European.            (line  53)
+* TeX-language-sk-hook:                  European.            (line  53)
+* TeX-language-sv-hook:                  European.            (line  53)
+* TeX-macro-global <1>:                  Automatic Global.    (line  17)
+* TeX-macro-global:                      Customizing.         (line  20)
+* TeX-macro-private:                     Automatic Private.   (line  13)
+* TeX-master <1>:                        Multifile.           (line  42)
+* TeX-master:                            Starting a Command.  (line  16)
+* TeX-math-close-double-dollar:          Quotes.              (line  72)
+* TeX-newline-function:                  Indenting.           (line  29)
+* TeX-Omega-command:                     Processor Options.   (line  83)
+* TeX-one-master:                        Multifile.           (line  57)
+* TeX-open-quote:                        Quotes.              (line  22)
+* TeX-outline-extra:                     Outline.             (line  14)
+* TeX-output-view-style:                 Starting Viewers.    (line 100)
+* TeX-parse-self:                        Parsing Files.       (line  38)
+* TeX-PDF-mode:                          Processor Options.   (line  15)
+* TeX-quote-after-quote:                 Quotes.              (line  30)
+* TeX-quote-language-alist:              European.            (line 124)
+* TeX-region:                            Starting a Command.  (line  32)
+* TeX-save-query:                        Multifile.           (line 102)
+* TeX-show-compilation:                  Processor Options.   (line 110)
+* TeX-source-correlate-method:           Processor Options.   (line  47)
+* TeX-source-correlate-mode:             Processor Options.   (line  36)
+* TeX-source-correlate-start-server:     I/O Correlation.     (line  26)
+* TeX-style-global:                      Automatic Global.    (line  20)
+* TeX-style-local:                       Automatic Local.     (line  17)
+* TeX-style-path:                        Automatic.           (line  39)
+* TeX-style-private:                     Automatic Private.   (line  29)
+* TeX-trailer-start:                     Starting a Command.  (line  32)
+* TeX-view-predicate-list:               Starting Viewers.    (line  58)
+* TeX-view-program-list:                 Starting Viewers.    (line  67)
+* TeX-view-program-selection:            Starting Viewers.    (line  38)
+* TeX-view-style:                        Starting Viewers.    (line 109)
+* Texinfo-clean-intermediate-suffixes:   Cleaning.            (line   7)
+* Texinfo-clean-output-suffixes:         Cleaning.            (line   7)
+
diff --git a/packages/auctex/auctex.info-2 b/packages/auctex/auctex.info-2
new file mode 100644 (file)
index 0000000..8710032
Binary files /dev/null and b/packages/auctex/auctex.info-2 differ
diff --git a/packages/auctex/bib-cite.el b/packages/auctex/bib-cite.el
new file mode 100644 (file)
index 0000000..afd7aa2
--- /dev/null
@@ -0,0 +1,2622 @@
+;;; bib-cite.el --- test
+;; bib-cite.el - Display \cite, \ref or \label / Extract refs from BiBTeX file.
+
+;; Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2003, 2004, 2005
+;; Free Software Foundation
+
+;; Author:    Peter S. Galbraith <psg@debian.org>
+;; Created:   06 July 1994
+;; Version:   3.28  (Feb 23 2005)
+;; Keywords:  bibtex, cite, auctex, emacs, xemacs
+
+;;; This file is not part of GNU Emacs.
+
+;; This package 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, or (at your option)
+;; any later version.
+
+;; This package 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; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;; LCD Archive Entry:
+;; bib-cite|Peter Galbraith|GalbraithP@dfo-mpo.gc.ca|
+;; Display \cite, \ref or \label / Extract refs from BiBTeX file.|
+;; 21-May-1997|3.01|~/misc/bib-cite.el.gz|
+
+;; ----------------------------------------------------------------------------
+;;; Commentary:
+;; This minor-mode is used in various TeX modes to display or edit references
+;; associated with \cite commands, or matching \ref and \label commands.
+
+;; New versions of this package (if they exist) may be found at:
+;;   http://people.debian.org/~psg/elisp/bib-cite.el
+;; and in AUCTeX's CVS archive at
+;;   http://savannah.gnu.org/cgi-bin/viewcvs/auctex/auctex/
+
+;; Operating Systems:
+;;  Works in unix, DOS and OS/2.  Developped under Linux.
+
+;; AUCTeX users:
+;;  AUCTeX is a super-charged LaTeX mode for emacs. Get it at:
+;;
+;;    ftp://ftp.gnu.org/pub/gnu/auctex/
+;;
+;;  WWW users may want to check out the AUCTeX page at
+;;    http://www.gnu.org/software/auctex/
+;;
+;;  bib-cite.el is included in the AUCTeX distribution.  Therefore, if
+;;  you use AUCTeX and didn't obtained bib-cite.el separately, make sure
+;;  that you are actually using the more recent version.
+
+;; RefTeX users:
+;;  RefTeX is a package with similar functions to bib-cite.
+;;    http://www.astro.uva.nl/~dominik/Tools/reftex/
+;;  RefTeX is bundled and preinstalled with Emacs since version 20.2.
+;;  It was also bundled with XEmacs 19.16--20.x.
+;;
+;;  I suggest that you use RefTeX to help you type-in text as it's functions
+;;  are better suited to this task than bib-cite, and use bib-cite's features
+;;  when you proof-read the text.
+;;  If you wish bib-cite to use RefTeX's reftex-view-crossref command to
+;;  display and find \label's and \cite bibliography entries, set the variable
+;;  bib-cite-use-reftex-view-crossref to t.
+
+;; MS-DOS users:
+;;  Multifile documents are supported by bib-cite by using etags (TAGS files)
+;;  which contains a bug for MSDOS (at least for emacs 19.27 it does).
+;;  Get the file
+;;    http://people.debian.org/~psg/elisp/bib-cite.etags-bug-report
+;;  to see what patches to make to etags.c to fix it.
+
+;; Description:
+;; ~~~~~~~~~~~
+;; This package is used in various TeX modes to display or edit references
+;; associated with \cite commands, or matching \eqref, \ref and \label
+;; commands  (so I actually overstep BiBTeX bounds here...).
+;;
+;; These are the functions:
+;;
+;;    bib-display bib-display-mouse
+;;                           - Display citation, \ref or \label under point
+;;    bib-find    bib-find-mouse
+;;                           - Edit citation, \ref or \label under point
+;;    bib-find-next          - Find next occurrence of a \ref or \eqref
+;;    bib-make-bibliography  - Make BiBTeX file containing only cite keys used.
+;;    bib-apropos            - Search BiBTeX source files for keywords.
+;;    bib-etags              - Refreshes (or builds) the TAGS files for
+;;                             multi-file documents.
+;;    bib-create-auto-file   - Used in bibtex-mode to create cite key
+;;                             completion .el file for AUCTeX.
+;;    bib-highlight-mouse    - Highlight \cite, \ref and \label commands in
+;;                             green when the mouse is over them.
+
+;; About Cite Commands and related functions:
+;; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+;;  Various flavors of \cite commands are allowed (as long as they contain
+;;  the word `cite') and they may optionally have bracketed [] options.
+;;  Bibtex Cross-references are displayed, and @string abbreviations are
+;;  substituted or included.
+;;
+;;  The \cite text is found (by emacs) in the bibtex source files listed in the
+;;  \bibliography command.  The BiBTeX files can be located in a search path
+;;  defined by an environment variable (typically BIBINPUTS, but you can change
+;;  this).
+;;
+;;  All citations used in a buffer can also be listed in a new bibtex buffer by
+;;  using bib-make-bibliography.  This is useful to make a bibtex file for a
+;;  document from a large bibtex database.  In this case, cross-references are
+;;  included, as well as the @string commands used. The @string abbreviations
+;;  are not substituted.
+;;
+;;  The bibtex files can also be searched for entries matching a regular
+;;  expression using bib-apropos.
+
+;; Usage instructions:
+;; ~~~~~~~~~~~~~~~~~~
+;;  bib-display   Bound to Mouse-3 when specially highlighted.
+;;                In Hyperbole, bound to the Assist key.
+;;                Bound to `\C-c b d'
+;;
+;;   bib-display will show the bibtex entry or the corresponding label or
+;;   ref commands from anywhere within a document.
+;;    With cursor on the \cite command itslef
+;;        -> display all citations of the cite command from the BiBTeX source.
+;;    With cursor on a particular cite key within the brackets
+;;        -> display that citation's text from the BiBTeX source file(s).
+;;
+;;       Example:
+;;
+;;       \cite{Wadhams81,Bourke.et.al87,SchneiderBudeus94}
+;;         ^Cursor -> Display-all-citations    ^Cursor -> Display-this-citation
+;;
+;;    With cursor on a \label command
+;;        -> Display first matching \ref command in the document
+;;    With cursor on a \ref command
+;;        -> Display environment associated with the matching \label command.
+;;
+;;   Finding a ref or label within a multi-file document requires a TAGS file,
+;;   which is automatically generated for you.  This enables you to then use
+;;   any tags related emacs features.
+;;
+;;  bib-find      Bound to Mouse-2 when specially highlighted.
+;;                In Hyperbole, bound to the Action key.
+;;                Bound to `\C-c b f'
+;;
+;;    bib-find will select the buffer and move point to the BiBTeX source file
+;;    at the proper citation for a cite command, or move point to anywhere
+;;    within a document for a label or ref command.  The ref chosen is the
+;;    first occurrance within a document (using a TAGS file).  If point is
+;;    moved within the same buffer, mark is set before the move and a message
+;;    stating so is given.  If point is moved to another file, this is done in
+;;    a new window using tag functions.
+;;
+;;    The next occurrence of a \ref or \eqref command may be found by invoking
+;;    bib-find-next, usually bound to `C-c b n'.
+;;
+;;    For multi-file documents, you must be using AUCTeX (so that bib-cite can
+;;    find the master file) and all \input and \include commands must be first
+;;    on a line (not preceeded by any non-white text).
+;;
+;;  bib-make-bibliography:     Bound to `\C-c b m'
+;;
+;;   Extract citations used in the current document from the \bibliography{}
+;;   file(s).  Put them into a new suitably-named buffer.  In a AUCTeX
+;;   multi-file document, the .aux files are used to find the cite keys (for
+;;   speed).  You will be warned if these are out of date.
+;;
+;;   This buffer is not saved to a file.  It is your job to save it to whatever
+;;   name you wish.  Note that AUCTeX has a unique name space for LaTeX and
+;;   BiBTeX files, so you should *not* name the bib file associated with
+;;   example.tex as example.bib!  Rather, name it something like
+;;   example-bib.bib.
+;;
+;;  bib-apropos:               Bound to `\C-c b a'
+;;
+;;   Searches the \bibliography{} file(s) for entries containing a keyword and
+;;   display them in the *help* buffer.  You can trim down your search by using
+;;   bib-apropos in the *Help* buffer after the first invocation.  the current
+;;   buffer is also searched for keyword matches if it is in bibtex-mode.
+;;
+;;   It doesn't display cross-references nor does it substitute or display
+;;   @string commands used.  It could easily be added, but it's faster this
+;;   way.  Drop me a line if this would be a useful addition.
+;;
+;;   If you find yourself entering a cite command and have forgotten which key
+;;   you want, but have entered a few initial characters as in `\cite{Gal',
+;;   then invoke bib-apropos.  It will take that string (in this case `Gal') as
+;;   an initial response to the apropos prompt.  You are free to edit it, or
+;;   simply press carriage return.
+;;
+;;  bib-etags:                 Bound to `\C-c b e'
+;;
+;;   Creates a TAGS file for AUCTeX's multi-file document (or refreshes it).
+;;   This is used by bib-find when editing multi-file documents.  The TAGS file
+;;   is created automatically, but it isn't refreshed automatically.  So if
+;;   bib-find can't find something, try running bib-etags again.
+;;
+;;  bib-create-auto-file:
+;;
+;;   Use this when editing a BiBTeX buffer to generate the AUCTeX .el file
+;;   which tell emacs about all its cite keys.  I've added this command to
+;;   bibtex-mode pull-down menu.
+;;
+;;  bib-highlight-mouse:       Bound to `\C-c b h'
+;;
+;;   Highlights \cite, \ref and \label commands in green when the mouse is over
+;;   them.  By default, a call to this function is added to LaTeX-mode-hook
+;;   (via bib-cite-initialize) if you set bib-highlight-mouse-t to true.  But
+;;   you may want to run this command to refresh the highlighting for newly
+;;   edited text.
+
+;; Installation instructions:
+;; ~~~~~~~~~~~~~~~~~~~~~~~~~
+;;  bib-cite is a minor-mode, so you could invoke it in a LaTeX-mode hook.
+;;  e.g. If you are using AUCTeX (http://www.gnu.org/software/auctex/), you
+;;  could use:
+;;
+;;   (autoload 'turn-on-bib-cite "bib-cite")
+;;   (add-hook 'LaTeX-mode-hook 'turn-on-bib-cite)
+;;
+;;  If you are using Emacs' regular LaTeX-mode, use instead:
+;;
+;;   (autoload 'turn-on-bib-cite "bib-cite")
+;;   (add-hook 'latex-mode-hook 'turn-on-bib-cite)
+;;
+;;  bib-cite can be used with AUCTeX, or stand-alone.  If used with AUCTeX on a
+;;  multi-file document (and AUCTeX's parsing is used), then all \bibliography
+;;  commands in the document will be found and used.
+;;  ---
+;;  The following variable can be unset (like shown) to tell bib-cite to
+;;  not give advice messages about which commands to use to find the next
+;;  occurrence of a search:
+;;
+;;    (setq bib-novice nil)
+;;  ---
+;;  If you wish bib-cite to use RefTeX's reftex-view-crossref command to
+;;  display and find \label's and \cite bibliography entries, set the variable
+;;  bib-cite-use-reftex-view-crossref to t:
+;;
+;;    (setq bib-cite-use-reftex-view-crossref t)
+;;  ---
+;;  The following variable determines whether we will attempt to highlight
+;;  citation, ref and label commands in green when they are under the
+;;  mouse.  When highlighted, the mouse keys work to call bib-display
+;;  (bound to [mouse-3]) and bib-find (bound to [mouse-2]).  If you use a
+;;  mode other than LaTeX-mode, you'll want to call bib-highlight-mouse with
+;;  a hook (See how we do this at the end of this file with the add-hook
+;;  command).
+;;
+;;    (setq bib-highlight-mouse-t nil)
+;;  ---
+;;  The variable bib-switch-to-buffer-function sets the function used to
+;;  select buffers (if they differ from the original) in bib-cite commands
+;;  bib-make-bibliography, bib-display, bib-find
+;;  You may use `switch-to-buffer' `switch-to-buffer-other-window' or
+;;  `switch-to-buffer-other-frame'.
+;;  ---
+;;  If you use DOS or OS/2, you may have to set the following variable:
+;;
+;;    (setq bib-dos-or-os2-variable t)
+;;
+;;    if bib-cite.el fails to determine that you are using DOS or OS/2.
+;;  Try `C-h v bib-dos-or-os2-variable' to see if it needs to be set manually.
+;;  ---
+;;  bib-cite needs to call the etags program with its output file option
+;;  and also with the append option (usually -a).
+;;  I figured that DOS and OS/2 would use "etags /o=" instead of the unix
+;;  variant "etags -o ", but users have reported differently.  So while the
+;;  unix notation is used here, you can reset it if you need to like so:
+;;
+;;    (setq bib-etags-command  "etags  /r='/.*\\\(eq\|page\|[fvF]\)ref.*/' /o=")
+;;    (setq bib-etags-append-command
+;;                             "etags  /r='/.*\\\(eq\|page\|[fvF]\)ref.*/' /a /o=")
+;;  ---
+;;  For multi-file documents, a TAGS file is generated by etags.
+;;  By default, its name is TAGS.  You can change this like so:
+;;
+;;    (setq bib-etags-filename "TAGSLaTeX")
+;;  ---
+;;  If your environment variable to find BiBTeX files is not BIBINPUTS, then
+;;  reset it with the following variable (here, assuming it's TEXBIB instead):
+;;
+;;    (setq bib-bibtex-env-variable "TEXBIB")
+;;
+;;  Note that any directory ending in a double slash will cause bib-cite to
+;;  search recursively through subdirectories for your .bib files.  This can
+;;  be slow, so use this judiciously.
+;;  e.g.  setenv BIBINPUTS .:/home/psg/LaTeX/bibinputs//
+;;        -> all directories below /home/psg/LaTeX/bibinputs/ will be
+;;           searched.
+;;
+;;  If your bibtex setup works but Emacs can't see the environment variable
+;;  correctly (Check `C-h v process-environment'), then customize the
+;;  variable `bib-cite-inputs'  (e.g. `M-x customize-variable bib-cite-imputs')
+;;
+;;  ---
+;;  If you do not wish bib-display to substitute @string abbreviations,
+;;  then set the following variable like so:
+;;
+;;    (setq bib-substitute-string-in-display nil)
+;;  ---
+;;  Warnings are given when @string abbreviations are not defined in your bib
+;;  files.  The exception is for months, usually defined in style files. If you
+;;  use other definitions in styles file (e.g. journals), then you may add them
+;;  to the `bib-substitute-string-in-display' list variable.
+
+;; If you find circumstances in which this package fails, please let me know.
+
+;; Things for me to do in later versions:
+;; - treat @Strings correctly, not just in isolation.
+;; - use  `kpsewhich -expand-path='$BIBINPUTS'`  instead of BIBINPUTS.
+;; - jmv@di.uminho.pt (Jose Manuel Valenca) wants:
+;;   - prompt for \cite as well as \label and \ref
+;;     (and use AUCTeX's completion list)
+;;   - implement string concatenation, with #[ \t\n]*STRING_NAME
+;;   - Create new command to substitute @string text in any bibtex buffer.
+;; ----------------------------------------------------------------------------
+;;; Change log:
+;; V3.28 Feb 23 2005 - Ralf Angeli
+;;  - Some doc fixes in the commentary section.
+;; V3.27 Feb 09 2005 - PSG
+;;  - Patch from Peter Heslin.  TeX-master can now have symbol values.
+;; V3.26 Aug 06 2004 - Reiner Steib
+;;  - Changed URL of AUCTeX. Use "AUCTeX", not "auc-tex" (skipped Change log).
+;; V3.25 Feb 15 2004 - PSG
+;;  - Check existence of font-lock-unset-defaults; no longer defined in CVS
+;;    Emacs. Thanks to Adrian Lanz for reporting the problem.
+;; V3.24 Oct 28 2003 - PSG
+;;  - bib-cite-file-directory-p: new function to replace ff-paths code.
+;; V3.23 Oct 09 2003 - PSG
+;;  - some checkdoc cleanup; not yet complete.
+;; V3.22 Sep 17 2003 - PSG
+;;  - bib-cite-aux-inputs:  new defcustom.
+;;  - minor cleanup for `match-string'.
+;; V3.21 Sep 08 2003 - PSG
+;;  - Ripping out off-topic imenu code.
+;; V3.20 Aug 14 2003 - PSG
+;;  - psg-checkfor-file-list: Allow for relative directoties as entries in
+;;    BIBINPUTS.
+;;  - bib-cite-inputs:  new defcustom equivalent to BIBINPUTS.
+;;  - bib-label-help-echo-format: fixed defcustom.
+;;  - psg-list-env: code cleanup.
+;;  - trailing whitespace cleanup.
+;; V3.19 Apr 06 2003 - PSG
+;;    Remove code that ran when defcustom not present.
+;;    Remove hilit19 obsolete code.
+;; V3.18 Mar 27 2003 - Bruce Ravel <ravel@phys.washington.edu>
+;;    Play well with the varioref and fancyref latex styles (vref, fref, Fref).
+;; V3.17 May 01 2001 - (RCS V1.38)
+;;  - XEmacs has imenu after all.
+;; V3.16 Dec 20 99 - (RCS V1.37)
+;;  - Added customize support.
+;; V3.15 Dec 20 99 - (RCS V1.36)
+;;  - Removed stupid debugging code that I had left in.
+;; V3.14 Dec 20 99 -
+;;  - New variable bib-ref-regexp for \ref regexp to match \label constructs
+;;    and added \pageref. (RCS V1.34)
+;;  - Edited bib-etags-command snd bib-etags-append-command to match.
+;; V3.13 Dec 20 99 - (RCS V1.32)
+;;  - License changed to GPL.
+;;  - Kai Engelhardt <ke@socs.uts.edu.au> bib-master-file takes .ltx extension
+;;  - imenu--create-LaTeX-index-for-document and bib-document-TeX-files
+;;    edited to accept .ltx extension.
+;;  - Michael Steiner <steiner@cs.uni-sb.de> added journals to @string
+;;    abbrevs and contributed `member-cis' to complaces @strings in a
+;;    case-insensitive manner.
+;; V3.12 Dec 10 98 - Bruce Ravel <bruce.ravel@nist.gov> (RCS V1.30)
+;;    Fixed bib-label-help.
+;; V3.11 Oct 06 98 - PSG (RCS V1.29)
+;;    Quote \ character fot replace-match;
+;;    Applies to: @String{JGR = "J. Geophys.\ Res."}
+;; V3.10 Sep 21 98 - Matt Hodges <mph1002@cam.ac.uk> (RCS V1.28)
+;;    Removed instance of expand-file-name due to new behaviour in Emacs-20.3.
+;; V3.09 Sep 09 98 - PSG (RCS V1.27)
+;;    Added support for \eqref; Added bib-find-next.
+;; V3.08 Aug 20 98 - PSG (RCS V1.26)
+;;    Fixed imenu bug (prev-pos (point-max))
+;; V3.07 Nov 20 97 - Christoph Wedler <wedler@fmi.uni-passau.de>  (RCS V1.24)
+;;    bib-ext-list variable made permanent-local, otherwise VC registration
+;;    would use two extents for each reference etc. This was not a visible bug.
+;; V3.06 Nov 12 97 - PSG (RCS V1.23)
+;;    Support use of reftex's reftex-view-crossref command.
+;; V3.05 Nov 12 97 - Vladimir Alexiev <vladimir@cs.ualberta.ca> (RCS V1.22)
+;;    regexp-quote the bibliography keys so a key like galbraith+kelley97 works
+;; V3.04 Aug 25 97 - Christoph Wedler  <wedler@fmi.uni-passau.de> (RCS V1.20)
+;;    (bib-highlight-mouse): Would bug out on detached extents,
+;;    e.g. when killing a whole citation.
+;; V3.03 Jul 16 97 - Christoph Wedler  <wedler@fmi.uni-passau.de> (RCS V1.18)
+;;    turn-on-bib-cite back to non-interactive.
+;; V3.02 Jul 11 97 - Christoph Wedler  <wedler@fmi.uni-passau.de> (RCS V1.17)
+;;    * auctex/bib-cite.el (turn-on-bib-cite): Make interactive.
+;;    Argument to `bib-cite-minor-mode' is 1.
+;;    (bib-label-help-echo-format): New variable.
+;;    (bib-label-help-echo): New function.
+;;    (bib-label-help): Addition argument format.
+;;    (bib-highlight-mouse): Set extent property `help-echo' for XEmacs.
+;; V3.01 May 22 97 - Diego Calvanese <calvanes@dis.uniroma1.it> (RCS V1.16)
+;;    bib-make-bibliography handles commas separated citations in aux files.
+;; V3.00 May 16 97 - Peter Galbraith (RCS V1.15)
+;;    bib-cite is now a minor mode.
+;; V2.32 Apr 30 97 - Anders Stenman <stenman@isy.liu.se> (RCS V1.14)
+;;  - Support for balloon-help.
+;; V2.31 Mar 20 97 - Christoph Wedler <wedler@fmi.uni-passau.de> (RCS V1.12)
+;;  - Better fontification of help buffer as bibtex or latex for XEmacs.
+;; V2.30 Feb 10 97 - Peter Galbraith (RCS V1.11)
+;;  - Better fontification of help buffer as bibtex or latex.
+;; V2.29 Jan 29 97 - Peter Galbraith (RCS V1.10)
+;;  - imenu looks for `\label{stuff}' instead of `\label'
+;; V2.28 Jan 22 97 - Peter Galbraith (RCS V1.9)
+;;  - Bug in bib-create-auto-file.
+;; V2.27 Dec 31 96 - Peter Galbraith (RCS V1.8)
+;;  - allow spaces between cite keys.
+;;  - Vladimir Alexiev <vladimir@cs.ualberta.ca>
+;;     Allow () delimiters as well as {}.
+;;     Better check on bibtex-menu
+;;     Erase *bibtex-bibliography* buffer.
+;; V2.26 Sep 24 96 - Peter Galbraith (RCS V1.7)
+;;  imenu bug fix.
+;; V2.25 Sep 23 96 - Anders Stenman <stenman@isy.liu.se> (RCS V1.6)
+;;  XEmacs bib-cite-fontify-help-as-latex bug fix.
+;; V2.24 Aug 19 96 - Peter Galbraith (RCS V1.3)
+;;  XEmacs bug fix, minor defvars - Vladimir Alexiev <vladimir@cs.ualberta.ca>
+;; V2.23 Aug 13 96 - Peter Galbraith (RCS V1.2)
+;;   XEmacs - Add bib-cite entries to bibtex-mode popup menu.
+;; V2.22 July 22 96 - Peter Galbraith (RCS V1.1)
+;;   local-map has `m' for bib-make-bibliography instead of `b'
+;;   set-buffer-menubar in XEmacs so that menu disappears after use.
+;; V2.21 July 12 96 - Peter Galbraith
+;;   Define `\C-c b' keymap for both plain tex and auctex, in XEmacs and emacs.
+;;   Separate menu-bar menu in gnu emacs.
+;;   font-lock support for bib-display'ed citations (bibtex fontification)
+;;    and for matching \ref{} and \labels (latex fontification).
+;;   buffer-substring-no-properties in bib-apropos
+;;    (bug in completing-read with mouse faces)
+;;   imenu-sort-function made local and nil.
+;;   imenu--LaTeX-name-and-position fixed for section name containing "\"
+;;   Various other things... (whitespace within label strings, etc...)
+;; V2.20 June 25 96 - Peter Galbraith
+;;   imenu fixed for emacs-19.31.
+;; V2.19 May 13 96
+;;  PSG:
+;;  - @string substitution fixed; bib-edit-citation fixed when buffer exists;
+;;  Christoph Wedler <wedler@fmi.uni-passau.de>:
+;;  - Added bib-switch-to-buffer-function
+;;  - (setq tags-always-exact nil) for xemacs
+;;  - removed eval-after-load foe xemacs
+;; V2.18 May 06 96 - PSG
+;;   New eval-after-load from Fred Devernay <Frederic.Devernay@sophia.inria.fr>
+;; V2.17 May 03 96 - PSG
+;;   Fixed bug introduced in V2.16, reported by Dennis Dams <wsindd@win.tue.nl>
+;; V2.16 May 02 96 - Vladimir Alexiev <vladimir@cs.ualberta.ca>
+;; - somewhat compatible with Hyperbole by binding bib-find and bib-display to
+;;   the Action and Assist keys inside the bib-highlight-mouse-keymap.
+;; - makes more liberal provisions for users with a tty.
+;; V2.15 Apr 09 96 -
+;; - fix "Buffer read-only" error caused by mouse-face text properties
+;;   patch by Piet van Oostrum <piet@cs.ruu.nl>
+;; - Use tmm non-X menu, patch by Vladimir Alexiev <vladimir@cs.ualberta.ca>
+;; - input{file.txt} would not work.
+;;   bug report: David Kastrup <dak@pool.informatik.rwth-aachen.de>
+;; V2.14 Feb 26 96 - PSG - define eval-after-load for xemacs
+;; Frederic Devernay's <Frederic.Devernay@sophia.inria.fr> suggestion.
+;; V2.13 Feb 08 96 - Peter Galbraith - Fixed recursive use of bib-apropos.
+;; V2.12 Jan 19 96 - Peter Galbraith
+;;   emacs-19.30's [down-mouse-1] is defined (rather than [mouse-1]), so
+;;   bib-highlight-mouse-keymap now has [down-mouse-1] defined to override it.
+;; V2.11  Nov 21 95 - Peter Galbraith
+;; - Fixed bib-create-auto-file when bib file loaded before LaTeX file.
+;; - Michal Mnuk's better imenu labels menu <Michal.Mnuk@risc.uni-linz.ac.at>
+;; - [mouse-1] and [mouse-2] key defs for highlighted regions.
+;; - Improve X menus.
+;; - Skip over style files in bib-document-TeX-files.
+;; - Add menus and mouse highlighting for xemacs
+;;   Anders Stenman <stenman@isy.liu.se> Dima Barsky <D.Barsky@ee.surrey.ac.uk>
+;; - Check bib-use-imenu before calling LaTeX-hook-setq-imenu.
+;;   From: Kurt Hornik <hornik@ci.tuwien.ac.at>
+;; - Remove mouse face properties before inserting new ones.
+;;   From: Peter Whaite <peta@Whippet.McRCIM.McGill.EDU>
+;; V2.10  Aug 17 95 - Peter Galbraith - fatal bugs in bib-make-bibliography.
+;; V2.09  Jul 19 95 - Peter Galbraith
+;;   - Had introduced bug in search-directory-tree. synced with ff-paths.el.
+;; V2.08  Jul 13 95 - Peter Galbraith
+;;     Fred Douglis <douglis@research.att.com> says etags should be required
+;; V2.07  Jul 04 95 - Peter Galbraith
+;;   - Minor changes with filename manipulations (careful with DOS...)
+;;   - Problem if auc-tex not already loaded -> LaTeX-mode-map
+;; V2.06  Jul 03 95 - Peter Galbraith - Added recursion through BIBINPUTS path.
+;; V2.05  Jun 22 95 - Peter Galbraith  Bug: Hanno Wirth <wirth@jake.igd.fhg.de>
+;;   bib-get-citations would truncate @String{KEY ="J. {\"u} Res."}
+;; V2.04  Jun 19 95 - Peter Galbraith -
+;;   - use bibtex-mode syntax table in bib buffer, else bib-apropos truncates
+;;     an article if it contains an unbalanced closing parenthesis.
+;;   - bib-highlight-mouse would mark a buffer modified
+;; V2.03  May 16 95 - Peter Galbraith -
+;;   auc-tec menu compatible with old "AUC TeX" pull-down name
+;; V2.02  May 10 95 - Peter Galbraith -
+;;   bug report by Bodo Huckestein <bh@thp.Uni-Koeln.DE> (getenv env) under DOS
+;; V2.01  Mar 27 95 - Peter Galbraith - No imenu on xemacs; check BIBINPUT also
+;; V2.00  Mar 27 95 - Peter Galbraith
+;;   - bib-find and bib-display replace bib-edit-citation and
+;;      bib-display-citation
+;;   - bib-apropos now take initial guess from start of cite argument at point.
+;;   - Multi-file support for bib-make-bibliography using .aux files.
+;;   - \label and \ref functionality for bib-find and bib-display:
+;;     - \label may appear within an \begin\end or to label a (sub-)section.
+;;     - Cursor on \label, goto first \ref, set next i-search to pattern.
+;;     - Cursor on \ref, goto \label or display it's environment or section.
+;;     - Works on hidden code!
+;; V1.08  Jan 16 95 - Peter Galbraith
+;;     bib-apropos can be used within *Help* buffer to trim a search.
+;; V1.07  Dec 13 94 - Peter Galbraith
+;;   - Fixed: multi-line @string commands in non-inserted display.
+;;   - Fixed: quoted \ character in @string commands.
+;;   - BiBTeX comments should not affect bib-cite
+;;   - Fixed bib-apropos (from Christoph Wedler <wedler@fmi.uni-passau.de>)
+;;      Faster now, and avoids infinite loops.
+;;   - Added bib-edit-citation to edit a bibtex files about current citation.
+;;   - Allow space and newlines between citations: \cite{ entry1, entry2}
+;;   - Added bib-substitute-string-in-display,  bib-string-ignored-warning
+;;     and bib-string-regexp.
+;;   - bib-display-citation (from Markus Stricker <stricki@vision.ee.ethz.ch>)
+;;      Could not find entry with trailing spaces
+;; V1.06  Nov 20 94 - Peter Galbraith
+;;   - Fixed bib-apropos for:
+;;        hilighting without invoking bibtex mode.
+;;        display message when no matches found.
+;;        would search only last bib file listed (forgot to `goto-char 1')
+;;   - Fixed bib-make-bibliography that would only see first citation in a
+;;     multi-key \cite command (found by Michail Rozman <roz@physik.uni-ulm.de>
+;;   - bib-make-bibliography didn't see \cite[A-Z]* commands.
+;;     Found by Richard Stanton <stanton@haas.berkeley.edu>
+;;     **************************************************
+;;   - * Completely rewritten code to support crossrefs *
+;;     **************************************************
+;;   - autodetection of OS/2 and DOS for bib-dos-or-os2-variable
+;;   - Created bib-display-citation-mouse
+;;   - bib-apropos works in bibtex-mode on the current buffer
+;;   - bibtex entry may have comma on next line (!)
+;;       @ARTICLE{Kiryati-91
+;;         , YEAR          = {1991    }
+;;         ...
+;; V1.05  Nov 02 94 - Peter Galbraith
+;;   - bug fix by rossmann@TI.Uni-Trier.DE (Jan Rossmann)
+;;     for (boundp 'TeX-check-path) instead of fboundp.  Thanks!
+;;   - Translate environment variable set by bib-bibtex-env-variable.
+;;     (suggested by Richard Stanton <stanton@haas.berkeley.edu>)
+;;   - add bib-dos-or-os2-variable to set environment variable path separator
+;;   - Add key-defs for any tex-mode and auc-tex menu-bar entries.
+;;       [in auc-tec TeX-mode-map is common to both TeX and LaTeX at startup
+;;        (but TeX-mode-map is only copied to LaTeX-mode-map at initilisation)
+;;        in plain emacs, use tex-mode-map for both TeX and LaTeX.]
+;;   - Add key def for bibtex-mode to create auc-tex's parsing file.
+;;   - Fix bugs found by <thompson@loon.econ.wisc.edu>
+;;     - fix bib-get-citation for options
+;;     - fix bib-get-citation for commas preceeded citation command
+;;     - better regexp for citations and their keys.
+;;     - Added @string support for any entry (not just journal entries).
+;;       (I had to disallow numbers in @string keys because of years.
+;;        Is that ok?)
+;;   - added bib-apropos
+;; V1.04  Oct 24 94 - Peter Galbraith
+;;   - Don't require dired-aux, rather define the function we need from it.
+;;   - Regexp-quote the re-search for keys.
+;;   - Name the bib-make-bibliography buffer diffently than LaTeX buffer
+;;     because auc-tex's parsing gets confused if same name base is used.
+;; V1.03  Oct 24 94 - Peter Galbraith - require dired-aux for dired-split
+;; V1.02  Oct 19 94 - Peter Galbraith
+;;   - If using auc-tex with parsing activated, use auc-tex's functions
+;;     to find all \bibliography files in a multi-file document.
+;;   - Find bib files in pwd, BIBINPUTS environment variable path and
+;;     TeX-check-path elisp variable path.
+;;   - Have the parser ignore \bibliography that is on a commented `%' line.
+;;     (patched by Karl Eichwalder <karl@pertron.central.de>)
+;;   - Allow for spaces between entry type and key in bib files:
+;;     (e.g  @Article{  key} )
+;;     (suggested by Nathan E. Doss <doss@ERC.MsState.Edu>)
+;;   - Allows options in \cite command (e.g. agu++ package \cite[e.g.][]{key})
+;;   - Includes @String{} abbreviations for `journal' entries
+;; V1.01 July 07 94 - Peter Galbraith - \bibliography command may have list of
+;;                                      BibTeX files.  All must be readable.
+;; V1.00 July 06 94 - Peter Galbraith - Created
+;; ----------------------------------------------------------------------------
+;;; Code:
+
+(eval-when-compile (require 'cl))
+
+(defgroup bib-cite nil
+  "bib-cite, LaTeX minor-mode to display \\cite, \\ref and \\label commands."
+  :group 'tex)
+
+(defcustom bib-cite-use-reftex-view-crossref nil
+  "*Non-nil means, RefTeX will be used to find cross references.
+When this variable is non-nil, both `bib-find' and `bib-display' will
+call a function in RefTeX to find or display the cross reference of a
+\\ref or \\cite macro at point."
+  :group 'bib-cite
+  :type 'boolean)
+
+(defcustom bib-novice t
+  "*Give advice to novice users about what commands to use next."
+  :group 'bib-cite
+  :type 'boolean)
+
+(defcustom bib-switch-to-buffer-function 'switch-to-buffer
+  "*Function used to select buffers if they differ from the original.
+You may use `switch-to-buffer' `switch-to-buffer-other-window' or
+`switch-to-buffer-other-frame'."
+  :group 'bib-cite
+  :type '(choice (function-item switch-to-buffer)
+                (function-item switch-to-buffer-other-window)
+                (function-item switch-to-buffer-other-frame)))
+
+(defcustom bib-highlight-mouse-t t
+  "*Call bib-highlight-mouse from `LaTeX-mode-hook' to add green highlight."
+  :group 'bib-cite
+  :type 'boolean)
+
+(defcustom bib-label-help-echo-format "button2 finds %s, button3 displays %s"
+  "*Format string for info if the mouse is over LaTeX commands.
+If nil, do not display info."
+  :group 'bib-cite
+  :type '(radio (const :tag "Don't display info" nil)
+                string))
+
+(defcustom bib-bibtex-env-variable "BIBINPUTS"
+  "*Environment variable setting the path where BiBTeX input files are found.
+BiBTeX 0.99b manual says this should be TEXBIB.
+Another version says it should BSTINPUTS.  I don't know anymore!
+
+The colon character (:) is the default path separator in unix, but you may
+use semi-colon (;) for DOS or OS/2 if you set bib-dos-or-os2-variable to t."
+  :group 'bib-cite
+  :type 'string)
+
+(defcustom bib-cite-inputs nil
+  "*List of directories to search for .bib files.
+This is in addition to those listed in the environment variable specified by
+`bib-bibtex-env-variable'."
+  :group 'bib-cite
+  :type '(repeat (file :format "%v")))
+
+(defcustom bib-cite-aux-inputs nil
+  "*List of directories to search for .aux files.
+MiKTeX has the LaTeX option -aux-directory to store .aux files in an alternate
+directory.  You may set this variable to let bib-cite find these .aux files."
+  :group 'bib-cite
+  :type '(repeat (file :format "%v")))
+
+(defcustom bib-dos-or-os2-variable (or (equal 'emx system-type)
+                                      (equal 'ms-dos system-type))
+  ;; Under OS/2 system-type equals emx
+  ;; Under DOS  system-type equals ms-dos
+  "*Whether you use DOS or OS/2 for bib-make-bibliography/bib-display.
+
+It tells bib-make-bibliography and bib-display to translate
+the BIBINPUTS environment variable using the \";\" character as
+a path separator and to translate DOS' backslash to slash.
+
+e.g. Use a path like \"c:\\emtex\\bibinput;c:\\latex\\bibinput\"
+
+\(You can change the environment variable which is searched by setting the  elisp variable bib-bibtex-env-variable)"
+  :group 'bib-cite
+  :type 'boolean)
+
+(defcustom bib-etags-command "etags -r '/.*\\\\\\(eq\\|page\\|[fvF]\\)ref.*/' -o "
+  "*Variable for the etags command and its output option.
+In unix, this is usually \"etags -r '/.*\\\(eq\|page\|[fvF]\)ref.*/' -o \"
+\(we use the -r option to tell etags to list AMS-LaTeX's \\eqref command.)
+In DOS and OS/2, this *may* be different, e.g. using slashes like \"etags /o=\"
+If so, set it this variable."
+  :group 'bib-cite
+  :type 'string)
+
+(defcustom bib-etags-append-command "etags -r '/.*\\\\\\(eq\\|page\\|[fvF]\\)ref.*/' -a -o "
+  "*Variable for the etags command and its append and output option.
+In unix, this is usually \"etags -r '/.*\\\(eq\|page\|[fvF]\)ref.*/' -a -o \"
+In DOS and OS/2, this *may* be \"etags /a /o=\"  If so, set it this variable."
+  :group 'bib-cite
+  :type 'string)
+
+(defcustom bib-etags-filename "TAGS"
+   "*Variable for the filename generated by etags, by defaults this TAGS.
+but you may want to change this to something like TAGSLaTeX such that it can
+coexist with some other tags file in your master file directory."
+  :group 'bib-cite
+  :type 'string)
+
+(defcustom bib-ref-regexp "\\\\\\(eq\\|page\\|[fvF]\\)?ref"
+  "*Regular expression for \\ref LaTeX commands that have a matching \\label.
+without the curly bracket.
+
+If you change this variable and you use multi-file documents, make sure you
+also edit the variables bib-etags-command and bib-etags-append-command."
+  :group 'bib-cite
+  :type 'regexp)
+
+(defcustom bib-substitute-string-in-display t
+  "*Determines if bib-display will substitute @string definitions.
+If t, then the @string text is substituted.
+If nil, the text is not substituted but the @string entry is included."
+  :group 'bib-cite
+  :type 'boolean)
+
+(defcustom bib-string-ignored-warning
+  '("jan" "feb" "mar" "apr" "may" "jun" "jul" "aug" "sep" "sept" "oct" "nov"
+    "dec" "acmcs" "acta" "cacm" "ibmjrd" "ibmjs" "ieeese" "ieeetcad"
+    "ieeetc" "ipl" "jacm" "jcss" "scp" "sicomp" "tcs" "tocs" "tods" "tog"
+    "toms" "toois" "toplas" )
+  "*@string abbreviations for which a warning is not given if not defined.
+These are usually month abbreviations (or journals) defined in a style file."
+  :group 'bib-cite
+  :type '(repeat (string :tag "Entry")))
+
+;;<<<<<<User-Modifiable variables end here.
+
+(defvar bib-ref-regexpc (concat bib-ref-regexp "{")
+  "*Regular expression for \\ref LaTeX commands that have a matching \\label.
+A opening curly bracket is appended to the regexp.")
+
+(defvar bib-cite-is-XEmacs
+  (not (null (save-match-data (string-match "XEmacs\\|Lucid" emacs-version)))))
+
+(defvar bib-cite-minor-mode nil)
+
+(defvar bib-highlight-mouse-keymap (make-sparse-keymap)
+  "Keymap for mouse bindings in highlighted texts in bicite.")
+
+(defvar bib-ext-list nil
+  "Xemacs buffer-local list of bib-cite extents.")
+(make-variable-buffer-local 'bib-ext-list)
+(put 'bib-ext-list 'permanent-local t)
+
+(defvar bib-cite-minor-mode-menu nil)
+
+;;;###autoload
+(defun bib-cite-minor-mode (arg)
+  "Toggle bib-cite mode.
+When bib-cite mode is enabled, citations, labels and refs are highlighted
+when the mouse is over them.  Clicking on these highlights with [mouse-2]
+runs bib-find, and [mouse-3] runs bib-display."
+  (interactive "P")
+  (set (make-local-variable 'bib-cite-minor-mode)
+       (if arg
+          (> (prefix-numeric-value arg) 0)
+        (not bib-cite-minor-mode)))
+  (cond
+   (bib-cite-minor-mode                 ;Setup the minor-mode
+    ;; Christoph Wedler's <wedler@fmi.uni-passau.de> suggestion for xemacs
+    ;; Added for version 2.19
+    (if (boundp 'tags-always-exact)
+       (progn
+         (make-local-variable 'tags-always-exact)
+         (setq tags-always-exact nil)))
+    ;; mouse overlay
+    (if bib-highlight-mouse-t
+       (progn
+         (bib-cite-setup-highlight-mouse-keymap)
+         (bib-highlight-mouse)
+         (make-local-hook 'after-change-functions)
+         (add-hook 'after-change-functions
+                   'bib-cite-setup-mouse-function nil t)))
+    (if bib-cite-is-XEmacs
+       (progn
+         (or (local-variable-p 'current-menubar (current-buffer))
+             (set-buffer-menubar current-menubar))
+         (add-submenu nil bib-cite-minor-mode-menu))))
+   (t
+   ;;;Undo the minor-mode
+    ;; mouse overlay
+    (cond
+     (bib-cite-is-XEmacs
+      (while bib-ext-list
+       (delete-extent (car bib-ext-list))
+       (setq bib-ext-list (cdr bib-ext-list))))
+     (t
+      (remove-hook 'after-change-functions 'bib-cite-setup-mouse-function t)
+      (let ((before-change-functions) (after-change-functions))
+       ;; FIXME This detroys all mouse-faces and local-maps!
+       ;; FIXME Hope no other package is using them in this buffer!
+       (remove-text-properties (point-min) (point-max)
+                               '(mouse-face t local-map t)))))
+    (if bib-cite-is-XEmacs
+       (delete-menu-item '("BCite"))))))
+
+;;This must be eval'ed when the LaTeX mode is in use.
+;; bib-highlight-mouse-keymap is a local variable so each buffer can have it's
+;; own.
+(defun bib-cite-setup-highlight-mouse-keymap ()
+  "Set up the bib-cite text in the current buffer to be clickable."
+  (make-local-variable 'bib-highlight-mouse-keymap)
+  (setq bib-highlight-mouse-keymap
+   ;;; First, copy the local keymap so we don't have `disappearing' menus
+   ;;; when the mouse is moved over a \ref, \label or \cite command.
+
+   ;;; FIXME: Check out (mouse-major-mode-menu) to see how it grabs the local
+   ;;;        menus to display.  Maybe on `highlighted' commands we could only
+   ;;;        display the bib-cite stuff (or a subset of it).
+       (let ((m (copy-keymap (current-local-map))))
+         (cond
+          (bib-cite-is-XEmacs
+           (set-keymap-name m 'bib-highlight-mouse-keymap)
+           (cond
+            ;;action-key stuff from Vladimir Alexiev <vladimir@cs.ualberta.ca>
+            ((commandp 'action-key)
+             ;; for hyperbole. The Right Way is to define implicit buttons
+             ;; (defib) bib-cite and label-ref instead of overriding
+             ;; action-key and assist key, so that eg smart key help can
+             ;; be obtained, but I'm lazy.
+             (substitute-key-definition 'action-key 'bib-find m global-map)
+             (substitute-key-definition 'assist-key 'bib-display m global-map)
+             (substitute-key-definition 'action-key-depress
+                                        'bib-find-mouse m global-map)
+             (substitute-key-definition 'assist-key-depress
+                                        'bib-display-mouse m global-map)
+             (substitute-key-definition 'action-mouse-key nil m global-map)
+             (substitute-key-definition 'assist-mouse-key nil m global-map))
+            (t                               ; xemacs, not hyperbole
+             (define-key m "\e\r" 'bib-find-mouse) ;   bug Fixed in V2.17
+             (define-key m "\e\n" 'bib-display-mouse) ;bug Fixed in V2.17
+             ;;(define-key m [(shift button1)] 'bib-display-mouse)
+             (define-key m [button3] 'bib-display-mouse)
+             (define-key m [button2] 'bib-find-mouse))))
+           (t                                 ; emacs 19
+            (cond
+             ((commandp 'action-key)
+              (substitute-key-definition 'action-key 'bib-find m global-map)
+              (substitute-key-definition 'assist-key 'bib-display m global-map)
+              (substitute-key-definition 'action-mouse-key-emacs19
+                                         'bib-find-mouse m global-map)
+              (substitute-key-definition 'assist-mouse-key-emacs19
+                                         'bib-display-mouse m global-map)
+              (substitute-key-definition 'action-key-depress-emacs19
+                                         nil m global-map)
+              (substitute-key-definition 'assist-key-depress-emacs19
+                                         nil m global-map))
+             (t                               ; emacs 19, not hyperbole
+              (define-key m [down-mouse-3] 'bib-display-mouse)
+              (define-key m [mouse-2] 'bib-find-mouse)))))
+         m)))
+
+;;;###autoload
+(defun turn-on-bib-cite ()
+  "Unconditionally turn on Bib Cite mode."
+  (bib-cite-minor-mode 1))
+
+(defun bib-cite-setup-mouse-function (beg end old-len)
+  (save-excursion
+    (save-match-data
+      (save-restriction
+       (narrow-to-region
+        (progn (goto-char beg) (beginning-of-line) (point))
+        (progn (goto-char end) (forward-line 1) (point)))
+       (bib-highlight-mouse)))))
+
+(defvar bib-cite-minor-mode-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map "\C-cba" 'bib-apropos)
+    (define-key map "\C-cbb" 'bib-make-bibliography)
+    (define-key map "\C-cbd" 'bib-display)
+    (define-key map "\C-cbe" 'bib-etags)
+    (define-key map "\C-cbf" 'bib-find)
+    (define-key map "\C-cbn" 'bib-find-next)
+    (define-key map "\C-cbh" 'bib-highlight-mouse)
+    map)
+  "Bib-cite minor-mode keymap.")
+
+(easy-menu-define
+ bib-cite-minor-mode-menu bib-cite-minor-mode-map "Menu keymap for bib-cite."
+ '("BCite"
+   ["Make BibTeX bibliography buffer" bib-make-bibliography t]
+   ["Display citation or matching \\ref or \\label" bib-display t]
+   ["Find BibTeX citation or matching \\ref or \\label" bib-find t]
+   ["Search apropos BibTeX files" bib-apropos t]
+   ["Build TAGS file for multi-file document" bib-etags (bib-master-file)]
+   ["Refresh \\cite, \\ref and \\label mouse highlight"
+    bib-highlight-mouse t]))
+
+;; Install ourselves:
+(or (assq 'bib-cite-minor-mode minor-mode-alist)
+    (setq minor-mode-alist
+         (cons '(bib-cite-minor-mode " BCite") minor-mode-alist)))
+(or (assq 'bib-cite-minor-mode minor-mode-map-alist)
+    (setq minor-mode-map-alist
+         (cons (cons 'bib-cite-minor-mode bib-cite-minor-mode-map)
+               minor-mode-map-alist)))
+
+
+;;; Add a menu entry to bibtex.el (Perhaps I should not do this).
+(cond
+ ((and (string-match "XEmacs\\|Lucid" emacs-version)
+       (or window-system
+          (fboundp 'smart-menu)))      ;text menus by Bob Weiner
+  ;;
+  ;; xemacs under X with AUCTeX
+  ;;
+
+  ;; Add to bibtex.el's popup menu
+  (defvar bib-cite-xemacs-bibtex-mode-menu
+    '("---"
+      "Bib-Cite"
+      "---"
+      ["Search apropos BibTeX files" bib-apropos t]
+      ["Create AUCTeX auto parsing file" bib-create-auto-file t])
+    "Submenu of bibtex-mode menu, used by bib-cite.")
+
+  (if (boundp 'bibtex-menu)
+      ;; Add menu now
+      (setq bibtex-menu
+           (append
+            bibtex-menu
+            bib-cite-xemacs-bibtex-mode-menu))
+    ;; Setup to add menu later
+    (defun bib-cite-bibtex-mode-hook ()
+      (if (boundp 'bibtex-menu)
+         (progn
+           (setq bibtex-menu
+                 (append
+                  bibtex-menu
+                  bib-cite-xemacs-bibtex-mode-menu))
+           (remove-hook 'bibtex-mode-hook 'bib-cite-bibtex-mode-hook))))
+    (add-hook 'bibtex-mode-hook 'bib-cite-bibtex-mode-hook))
+  )
+
+ ((and (not (string-match "XEmacs\\|Lucid" emacs-version))
+       (string-equal "19" (substring emacs-version 0 2))
+       (or window-system
+          (fboundp 'tmm-menubar)))     ; 19.30 - Will autoload if necessary
+  ;;
+  ;; emacs-19 under X-windows (or non-X with tmm)
+  ;;
+
+  ;; This *almost* makes me want to switch over to XEmacs...
+
+  ;; to AUCTeX auto file for a bibtex buffer
+  (eval-after-load
+   "bibtex"
+   '(progn
+      (cond
+       ((lookup-key bibtex-mode-map [menu-bar move/edit])
+       (define-key-after
+         (lookup-key bibtex-mode-map [menu-bar move/edit])
+         [bib-nil] '("---" . nil) '"--")
+       (define-key-after
+         (lookup-key bibtex-mode-map [menu-bar move/edit])
+         [bib-apropos] '("Search Apropos" . bib-apropos) 'bib-nil)
+       (define-key-after
+         (lookup-key bibtex-mode-map [menu-bar move/edit])
+         [auc-tex-parse]
+         '("Create AUCTeX auto parsing file" . bib-create-auto-file)
+         'bib-apropos))
+       ((lookup-key bibtex-mode-map [menu-bar bibtex-edit])
+       (define-key-after
+         (lookup-key bibtex-mode-map [menu-bar bibtex-edit])
+         [bib-nil] '("---" . nil) '"--")
+       (define-key-after
+         (lookup-key bibtex-mode-map [menu-bar bibtex-edit])
+         [bib-apropos] '("Search Apropos" . bib-apropos) 'bib-nil)
+       (define-key-after
+         (lookup-key bibtex-mode-map [menu-bar bibtex-edit])
+         [auc-tex-parse]
+         '("Create AUCTeX auto parsing file" . bib-create-auto-file)
+         'bib-apropos)))))))
+
+;; Following from bibtex.el
+(defvar
+  bib-cite-bibtex-font-lock-keywords
+  '(("^\\( \\|\t\\)*\\(@[A-Za-z]+\\)[ \t]*[({]\\([][A-Za-z0-9.:;?!`'()/*@_+=|<>-]+\\)?"
+     (2 font-lock-function-name-face)
+     (3 font-lock-reference-face nil t))
+    ;; reference type and reference label
+    ("^[ \t]*\\(OPT[^\"#%'(),={} \t\n0-9][^\"#%'(),={} \t\n]*\\)[ \t]*="
+     1 font-lock-comment-face)
+    ;; optional field names (treated as comments)
+    ("^[ \t]*\\([^\"#%'(),={} \t\n0-9][^\"#%'(),={} \t\n]*\\)[ \t]*="
+     1 font-lock-variable-name-face)
+    ;; field names
+    "Default expressions to fontify in BibTeX mode."))
+
+(defvar bib-cite-bibtex-mode-syntax-table
+  (let ((st (make-syntax-table)))
+    ;; [alarson:19920214.1004CST] make double quote a string quote
+    (modify-syntax-entry ?\" "\"" st)
+    (modify-syntax-entry ?$ "$$  " st)
+    (modify-syntax-entry ?% "<   " st)
+    (modify-syntax-entry ?'  "w   " st)
+    (modify-syntax-entry ?@  "w   " st)
+    (modify-syntax-entry ?\\ "\\" st)
+    (modify-syntax-entry ?\f ">   " st)
+    (modify-syntax-entry ?\n ">   " st)
+    (modify-syntax-entry ?~ " " st)
+    st))
+;; Code from bibtex.el ends
+
+;; @string starts with a letter and does not contain any of ""#%'(),={}
+;; Here we do not check that the field contains only one string field and
+;; nothing else.
+(defvar bib-string-regexp
+      "^[, \t]*[a-zA-Z]+[ \t]*=[ \t]*\\([a-zA-Z][^#%'(),={}\" \t\n]*\\)"
+      "Regular expression for field containing a @string.")
+
+(defun bib-display ()
+  "Display BibTeX citation or matching \\ref or \\label command under point.
+
+If text under cursor is a \\cite command, then display its BibTeX info from
+\\bibliography input file.
+   Example with cursor located over cite command or arguments:
+     \cite{Wadhams81,Bourke.et.al87,SchneiderBudeus94}
+       ^Display-all-citations          ^Display-this-citation
+
+If text under cursor is a \\ref command, then display environment associated
+with its matching \\label command.
+
+If text under cursor is a \\label command, then display the text around
+the first matching \\ref command.
+
+The user is prompted for a \\label or \\ref is nothing suitable is found under
+the cursor.  The first prompt is for a label.  If you answer with an empty
+string, a second prompt for a ref will be given.
+
+A TAGS file is created and used for multi-file documents under auctex."
+  (interactive)
+  (let ((cite)(ref)(label))
+    (save-excursion
+      (if (not (looking-at "\\\\"))
+         (search-backward "\\" nil t))
+      (if (looking-at bib-ref-regexpc)
+         (setq ref t)
+       (if (looking-at "\\\\label{")
+           (setq label t)
+         (setq cite t))))
+    (cond
+     ;; reftex doesn't handle label->ref
+     ((and bib-cite-use-reftex-view-crossref
+          (or ref cite))
+      ;;;FIXME: reftex doesn't want point on \ref or \cite part, but on keyword
+      (require 'reftex)
+      (reftex-view-crossref nil))
+     (cite
+      (bib-display-citation))
+     (t
+      (bib-display-label)))))
+
+(defun bib-find ()
+  "Edit BibTeX citation or find matching \\ref or \\label command under point.
+
+For multi-entry cite commands, the cursor should be on the actual cite key
+desired (otherwise a random entry will be selected).
+e.g.: \cite{Wadhams81,Bourke.et.al87,SchneiderBudeus94}
+                       ^Display-this-citation
+
+If text under cursor is a \\ref command, then point is moved to its matching
+\\label command.
+
+If text under cursor is a \\label command, then point is moved to the first
+matching \\ref command.
+
+The user is prompted for a \\label or \\ref is nothing suitable is found under
+the cursor.  The first prompt is for a label.  If you answer with an empty
+string, a second prompt for a ref will be given.
+
+A TAGS file is created and used for multi-file documents under auctex."
+  (interactive)
+  (let ((cite)(ref)(label))
+    (save-excursion
+      (if (not (looking-at "\\\\"))
+         (search-backward "\\" nil t))
+      (if (looking-at bib-ref-regexpc)
+         (setq ref t)
+       (if (looking-at "\\\\label{")
+           (setq label t)
+         (setq cite t))))
+    (cond
+     ;; reftex doesn't handle label->ref
+     ((and bib-cite-use-reftex-view-crossref
+          (or ref cite))
+      (require 'reftex)
+      (reftex-view-crossref t))
+     (cite
+      (bib-edit-citation))
+     (t
+      (bib-find-label)))))
+
+(defvar bib-cite-search-ring nil
+  "Bib-cite intenal variable to hold last \\ref or \\eqref find.")
+
+(defun bib-find-next (&optional prev-p)
+  "Find next occurrence of a \ref or \eqref.
+This is made necessary because we now use a regexp to find tags in multi-file
+documents, and the Emacs command `find-tag' doesn't allow to interactively
+find the next occurrence of a regexp."
+  (interactive "P")
+  (if (bib-master-file)                 ;Multi-file document
+      (if prev-p
+         (find-tag t '- t)
+       (find-tag t t t))
+    (if bib-cite-search-ring
+       ;;FIXME: Should first make sure I move off initial \ref{}.
+       (let ((regexp (concat bib-ref-regexpc bib-cite-search-ring "}")))
+         (if prev-p
+             (if (not (re-search-backward regexp nil t))
+                 (message "No previous occurrence of reference %s"
+                          bib-cite-search-ring))
+           (if (not (re-search-forward regexp nil t))
+               (message "No next occurrence of reference %s"
+                        bib-cite-search-ring))))
+      (message "Sorry, no previous reference to find.  Use bib-find?"))))
+
+(defun bib-display-mouse (EVENT)
+  "Display BibTeX citation or matching \\ref or \\label under mouse EVENT.
+See bib-display."
+  (interactive "e")
+  (mouse-set-point EVENT)
+  (bib-display))
+
+(defun bib-find-mouse (EVENT)
+  "Edit BibTeX citation or find matching \\ref or \\label under mouse EVENT.
+See bib-find."
+  (interactive "e")
+  (mouse-set-point EVENT)
+  (bib-find))
+
+(defun bib-apropos ()
+  "Display BibTeX entries containing a keyword from bibliography file.
+The files specified in the \\bibliography command are searched unless
+the current buffer is in `bibtex-mode' or is the Help buffer.  In those
+cases, *it* is searched.  This allows you to trim down a search further
+by using bib-apropos sequentially."
+  ;;(interactive "sBibTeX apropos: ")
+  (interactive)
+  (let* ((keylist (and (boundp 'TeX-auto-update) ;Avoid error in FRAMEPOP
+                      (fboundp 'LaTeX-bibitem-list) ;Use this if using auctex
+                      (LaTeX-bibitem-list)))
+        (keyword (bib-apropos-keyword-at-point))
+        (keyword (completing-read "BiBTeX apropos: " keylist nil nil keyword))
+        (the-text)(key-point)(start-point)
+        (new-buffer-f (and (not (string-match "^bib" mode-name))
+                           (not (string-equal "*Help*" (buffer-name)))))
+        (bib-buffer (or (and new-buffer-f (bib-get-bibliography nil))
+                        (current-buffer))))
+    (save-excursion
+      (set-buffer bib-buffer)
+      (goto-char (point-min))
+      (while (and (re-search-forward "^[ \t]*@" nil t)
+                 (re-search-forward keyword nil t))
+       (setq key-point (point))        ;To make sure this is within entry
+       (re-search-backward "^[ \t]*@" nil t)
+       (setq start-point (point))
+       (forward-list 1)
+       (if (< (point) key-point)       ;And this is that test...
+           (goto-char key-point)       ;Not within entry, skip it.
+         (setq the-text
+               (cons (concat (buffer-substring start-point (point)) "\n")
+                     the-text))))
+      (if (not the-text)
+         (message "Sorry, no matches found.")
+       (with-output-to-temp-buffer "*Help*"
+         (mapcar 'princ (nreverse the-text)))
+       (bib-cite-fontify-help-as-bibtex)
+       (if bib-novice
+           (message
+            (substitute-command-keys
+             (concat "Use \\[bib-apropos] again in the *help* buffer"
+                     " to trim the search")))))
+      (if new-buffer-f
+         (kill-buffer bib-buffer)))))
+
+(defvar bib-document-citekeys-obarray-warnings nil
+  "Bib-cite internal variable.")
+
+(defun bib-make-bibliography ()
+  "Extract citations used in the current document from \bibliography{} file(s).
+Put them into a buffer named after the current buffer, with extension .bib.
+
+In an AUCTeX multi-file document, parsing must be on and the citation keys
+are extracted from the .aux files.
+
+In a plain LaTeX buffer (not multi-file), the cite keys are extracted from
+the text itself.  Therefore the text need not have been previously processed
+by LaTeX.
+
+This function is useful when you want to share a LaTeX file, and therefore want
+to create a bibtex file containing only the references used in the document."
+  (interactive)
+  (let* ((the-keys-obarray (or (bib-document-citekeys-obarray)
+                              (bib-buffer-citekeys-obarray)))
+                                       ;1st in case of error
+        (new-buffer
+         (create-file-buffer
+          (concat (substring (buffer-name) 0
+                             (or (string-match "\\." (buffer-name))
+                                 (length (buffer-name))))
+                  "-bib.bib")))
+        (bib-buffer (bib-get-bibliography nil))
+        (the-warnings (bib-get-citations the-keys-obarray
+                                         bib-buffer
+                                         new-buffer
+                                         nil)))
+    (kill-buffer bib-buffer)
+;;; (switch-to-buffer new-buffer)
+    (funcall bib-switch-to-buffer-function new-buffer)
+    (bibtex-mode)
+    (if (or bib-document-citekeys-obarray-warnings
+           the-warnings)
+       (progn
+         (cond
+          ((and bib-document-citekeys-obarray-warnings the-warnings)
+           (with-output-to-temp-buffer "*Help*"
+             (princ bib-document-citekeys-obarray-warnings the-warnings)))
+          (bib-document-citekeys-obarray-warnings
+           (with-output-to-temp-buffer "*Help*"
+             (princ bib-document-citekeys-obarray-warnings)))
+          (the-warnings
+           (with-output-to-temp-buffer "*Help*" (princ the-warnings))))
+         (setq bib-document-citekeys-obarray-warnings nil) ;Reset
+         (bib-cite-fontify-red)))
+    (if bib-novice
+       (message
+        (substitute-command-keys
+         "Use \\[save-buffer] to save this buffer to a file.")))))
+
+(defun bib-cite-fontify-red (&optional limit)
+  "Fontify *Help* buffer in red-bold up to optional LIMIT."
+  (if (and window-system                ;Not exactly correct for XEmacs
+          (not (facep 'red-bold)))
+      (progn
+       (copy-face 'bold 'red-bold)
+       (set-face-foreground 'red-bold "red")))
+  (save-excursion
+    (set-buffer "*Help*")
+    (let ((before-change-functions) (after-change-functions))
+      (put-text-property (point-min)(or limit (point-max))
+                        'face 'red-bold))))
+
+(defun bib-cite-fontify-help-xemacs (defaults)
+  (if (fboundp 'font-lock-set-defaults-1) ; >= XEmcas 19.14
+      (progn
+       (set-buffer "*Help*")
+       (setq font-lock-defaults-computed nil
+             font-lock-keywords nil)
+       (font-lock-set-defaults-1
+        (and defaults (font-lock-find-font-lock-defaults defaults)))
+       (font-lock-fontify-buffer)
+       (setq font-lock-defaults-computed nil
+             font-lock-keywords nil)
+       (font-lock-set-defaults-1))))
+
+(defun bib-cite-fontify-help-as-bibtex ()
+  (save-excursion
+    (cond
+     ((not (featurep 'font-lock))
+      nil)                              ;No font-lock! Stop here.
+     ;; font-lock under Emacs and XEmacs
+     ((string-match "XEmacs\\|Lucid" emacs-version)
+      ;; XEmacs
+      (bib-cite-fontify-help-xemacs 'bibtex-mode))
+     (t
+      ;; Emacs
+      (set-buffer "*Help*")
+      (let ((font-lock-defaults
+            '(bib-cite-bibtex-font-lock-keywords
+              nil t ((?$ . "\"")(?\" . ".")))))
+       (if font-lock-mode
+           (font-lock-mode)
+         (if (fboundp 'font-lock-unset-defaults) (font-lock-unset-defaults))
+         (font-lock-unfontify-buffer))
+       (font-lock-fontify-buffer))))))
+
+(defun bib-cite-fontify-help-as-latex ()
+  (save-excursion
+    (cond
+     ((not (featurep 'font-lock))
+      nil)                              ;No font-lock! Stop here.
+     ;; font-lock under Emacs and XEmacs
+     ((string-match "XEmacs\\|Lucid" emacs-version)
+      ;; XEmacs, not necessary to do s.th. special for font-latex, we do *not*
+      ;; want the buffer-local faces!
+      (bib-cite-fontify-help-xemacs 'latex-mode))
+     (t
+      ;; Emacs
+      (set-buffer "*Help*")
+      ;; Actually, don't want to `permanently' affect *Help* buffer...
+      ;;(if (featurep 'font-latex)
+      ;; (font-latex-setup)
+      ;; Rather I should deal with this in the `let' form:
+      ;; (make-local-variable 'font-lock-string-face)
+      ;; (setq font-lock-string-face font-latex-math-face
+      ;;       font-latex-string-face (default-value 'font-lock-string-face))
+      (let ((font-lock-defaults
+            (if (featurep 'font-latex)
+                '((font-latex-keywords font-latex-keywords-1
+                                       font-latex-keywords-2)
+                  nil nil ((?\( . ".") (?\) . ".") (?$ . "\"")) nil
+                  (font-lock-comment-start-regexp . "%")
+                  (font-lock-mark-block-function . mark-paragraph))
+              '(tex-font-lock-keywords nil nil ((?$ . "\""))))))
+       (if font-lock-mode
+           (font-lock-mode)
+         (if (fboundp 'font-lock-unset-defaults) (font-lock-unset-defaults))
+         (font-lock-unfontify-buffer))
+       (font-lock-fontify-buffer))))))
+
+(defvar bib-document-TeX-files-warnings nil
+  "Bib-cite internal variable.")
+
+(defun bib-etags (&optional masterdir)
+  "Invoke etags on all tex files of the document in directory MASTERDIR.
+Store the TAGS file in the master-directory.
+Expect errors if you use this outside of auctex or within a plain
+single-file document.  Also makes sure that the TAGS buffer is updated.
+See variables bib-etags-command and bib-etags-filename"
+  (interactive)
+  (require 'etags)
+  (let* ((the-file-list (bib-document-TeX-files))
+        (the-file (car the-file-list))
+        (dir (or masterdir (bib-master-directory)))
+        (the-tags-file (expand-file-name bib-etags-filename dir))
+        (the-tags-buffer (get-file-buffer the-tags-file)))
+    ;; Create TAGS file with first TeX file (master file)
+    (shell-command (concat bib-etags-command the-tags-file " " the-file))
+    (setq the-file-list (cdr the-file-list))
+    ;; Append to TAGS file for all other TeX files.
+    (while the-file-list
+      (setq the-file (car the-file-list))
+      (shell-command
+       (concat bib-etags-append-command the-tags-file " " the-file))
+      (setq the-file-list (cdr the-file-list)))
+    (if the-tags-buffer                 ;buffer existed; we must refresh it.
+       (save-excursion
+         (set-buffer the-tags-buffer)
+         (revert-buffer t t)))
+
+    ;; Check value of tags-file-name against the-tags-file
+    (or (equal the-tags-file  tags-file-name) ;make sure it's current
+       (visit-tags-table the-tags-file))
+
+    ;(set (make-local-variable 'tags-file-name) the-tags-file))
+    ;; above should not be needed
+
+    ;; Weird Bug:
+    ;;  (visit-tags-table-buffer) seems to get called twice when called by
+    ;;  find-tag on an undefined tag. The second time, it's in the TAGS
+    ;;  buffer and returns an error because TAGS buffer does have
+    ;;  tags-file-name set.
+    ;;  To get around this.  I'm setting this variable in the TAGS buffer.
+    ;; Skip this in XEmacs (Changed by Anders Stenman)
+    (if (and (not (string-match "XEmacs\\|Lucid" emacs-version))
+            (get-file-buffer the-tags-file))
+       (save-excursion
+         (set-buffer (get-file-buffer the-tags-file))
+         (set (make-local-variable 'tags-file-name) the-tags-file))))
+
+
+  (if bib-document-TeX-files-warnings   ;free variable loose in emacs!
+      (progn
+       (with-output-to-temp-buffer "*Help*"
+         (princ bib-document-TeX-files-warnings))
+       (setq bib-document-TeX-files-warnings nil) ;Reset
+       (bib-cite-fontify-red))))
+
+(defun bib-Is-hidden ()
+  "Return true is current point is hidden."
+  (if (not selective-display)
+      nil                               ;Not hidden if not using this...
+    (save-excursion
+      (if (not (re-search-backward "[\n\^M]" nil t))
+         nil                           ;Play safe
+       (if (string-equal (match-string 0) "\n")
+           nil
+         t)))))
+
+(defun bib-highlight-mouse ()
+  "Make that nice green highlight when the mouse is over LaTeX commands."
+  (interactive)
+;;;Comment this out.  User should be able to use bib-highlight-mouse
+;;;to try it out regardless of bib-highlight-mouse-t.
+;;;Check bib-highlight-mouse-t only in automated cases.
+;;;
+;;;  (if (and bib-highlight-mouse-t
+;;;           ;;window-system)        ;Do nothing unless under X
+;;;           )
+;;; *all of code was here*
+;;;      )
+  (save-excursion
+    (let ((s)(e)(extent)(local-extent-list bib-ext-list)
+         (inhibit-read-only t)
+         (modified (buffer-modified-p))) ;put-text-property changing this?
+      ;; * peta Wed Nov  8 16:27:29 1995 -- better remove the mouse face
+      ;;   properties first.
+      (setq bib-ext-list nil)          ;Reconstructed below...
+      (if (string-match "XEmacs\\|Lucid" emacs-version)
+         (while local-extent-list
+           (setq extent (car local-extent-list))
+           (if (or (extent-detached-p extent)
+                   (and (<= (point-min)(extent-start-position extent))
+                        (>= (point-max)(extent-end-position extent))))
+               (delete-extent extent)
+             (setq bib-ext-list (cons extent bib-ext-list)))
+           (setq local-extent-list (cdr local-extent-list)))
+       ;; Remove properties for regular emacs
+       ;; FIXME This detroys all mouse-faces and local-maps!
+       ;; FIXME Hope no other package is using them in this buffer!
+       (let ((before-change-functions) (after-change-functions))
+         (remove-text-properties (point-min) (point-max)
+                                 '(mouse-face t local-map t))))
+      (goto-char (point-min))
+      (while
+         (re-search-forward
+          (concat
+           "\\\\\\(" (substring bib-ref-regexp 2)
+           "\\|label\\|[A-Za-z]*cite[A-Za-z]*\\(\\[.*\\]\\)?\\){[^}]*}")
+          nil t)
+       (setq s (match-beginning 0))
+       (setq e (match-end 0))
+       (cond
+        ((string-match "XEmacs\\|Lucid" emacs-version)
+         (setq extent (make-extent s e))
+         (setq bib-ext-list (cons extent bib-ext-list))
+         (set-extent-property extent 'highlight t)
+         (set-extent-property extent 'start-open t)
+         (set-extent-property extent 'balloon-help 'bib-label-help)
+         (set-extent-property extent 'help-echo 'bib-label-help-echo)
+         (set-extent-property extent 'keymap bib-highlight-mouse-keymap))
+        (t
+         (let ((before-change-functions) (after-change-functions)
+               ;;(this-overlay (make-overlay s e))
+               )
+;;; Even using overlays doens't help here.  If bib-highlight-mouse-keymap
+;;; does not include the AucTeX menus, then these disappear when we click
+;;; onto a \cite command.  Perhaps using bib-cite as a minor mode will fix
+;;; this?  For now, bib-cite must be loaded after these menus are built.
+;;; It must therefore be loaded in a mode-hook.
+           (put-text-property s e 'local-map bib-highlight-mouse-keymap)
+           (put-text-property s e 'mouse-face 'highlight)
+         ;;(overlay-put this-overlay 'local-map bib-highlight-mouse-keymap)
+         ;;(overlay-put this-overlay 'mouse-face 'highlight)
+           ))))
+      (set-buffer-modified-p modified))))
+
+(defun bib-toggle-highlight ()
+  "Toggle the enabling of bib-cite entries as clickable things."
+;; FIXME: do something about after-change stuff?
+  (interactive)
+  (if (setq bib-highlight-mouse-t (not bib-highlight-mouse-t))
+      (bib-highlight-mouse)
+    (let ((modified (buffer-modified-p))
+         (inhibit-read-only t))
+      (cond
+       ((string-match "XEmacs\\|Lucid" emacs-version)
+       (while bib-ext-list
+         (delete-extent (car bib-ext-list))
+         (setq bib-ext-list (cdr bib-ext-list))))
+       (t
+       (let ((before-change-functions) (after-change-functions))
+         (remove-text-properties (point-min) (point-max)
+                                 '(mouse-face local-map)))))
+      (set-buffer-modified-p modified))))
+
+(defun bib-label-help-echo (object)
+  (if bib-label-help-echo-format
+      (bib-label-help object bib-label-help-echo-format)))
+
+;;; Balloon-help callback. Anders Stenman <stenman@isy.liu.se>
+;;;             Patched by Bruce Ravel <bruce.ravel@nist.gov>
+(defun bib-label-help (object &optional format)
+  (or format (setq format "Use mouse button 2 to find the %s.
+Use mouse button 3 to display the %s."))
+  (save-match-data
+    (let* ((string (extent-string object))
+          (type (cond ((string-match "^\\\\[A-Za-z]*cite[A-Za-z]*" string) "citation")
+                      ((string-match
+                        (concat "^" bib-ref-regexp) string) "\\label{}")
+                      ((string-match "^\\\\label" string) "\\ref{}")
+                      (t "this (unknown) reference"))))
+      (format format type type))))
+
+;;----------------------------------------------------------------------------
+;; Routines to display or edit a citation's bibliography
+
+(defun bib-display-citation ()
+  "Do the displaying of cite info.  Return t if found cite key, nil otherwise.
+Example with cursor located over cite command or arguments:
+\cite{Wadhams81,Bourke.et.al87,SchneiderBudeus94}
+   ^Display-all-citations          ^Display-this-citation"
+  (save-excursion
+    (let* ((the-keys-obarray (bib-get-citekeys-obarray)) ;1st in case of error
+          (work-buffer (get-buffer-create "*bibtex-work*"))
+          (bib-buffer (bib-get-bibliography nil))
+          (the-warnings (bib-get-citations
+                         the-keys-obarray
+                         bib-buffer
+                         work-buffer
+                         bib-substitute-string-in-display))
+          (the-warn-point))
+      (if the-warnings
+         (progn
+           (set-buffer work-buffer)
+           (goto-char 1)
+           (insert the-warnings)
+           (setq the-warn-point (point))))
+      (with-output-to-temp-buffer
+         "*Help*"
+       (set-buffer work-buffer)
+       (princ (buffer-substring 1 (point-max))))
+      (bib-cite-fontify-help-as-bibtex)
+      (if the-warn-point
+         (bib-cite-fontify-red the-warn-point))
+      (kill-buffer bib-buffer)
+      (kill-buffer work-buffer))))
+
+(defun bib-edit-citation ()
+  "Do the edit of cite info.  Return t if found cite key, nil otherwise.
+Find and and put edit point in bib file associated with a BibTeX citation
+under cursor from \bibliography input file.
+In a multi-entry cite command, the cursor should be on the actual cite key
+desired (otherwise a random entry will be selected).
+e.g.: \cite{Wadhams81,Bourke.et.al87,SchneiderBudeus94}
+                       ^Display-this-citation"
+  (let ((the-keys-obarray (bib-get-citekeys-obarray)) ;1st in case of error
+       (bib-buffer (bib-get-bibliography t))
+       (the-key)(the-file))
+    (save-excursion
+      (mapatoms                     ;Do this for each cite-key found...
+       (lambda (cite-key)
+        (setq the-key (symbol-name cite-key)))
+       the-keys-obarray)
+      (set-buffer bib-buffer)
+      (goto-char (point-min))
+      (if (not (re-search-forward
+               (concat "@[^{(]+[{(][\t ]*" (regexp-quote the-key) "[ ,\n]")
+               nil t))
+         (progn
+           (kill-buffer bib-buffer)
+           (error "Sorry, could not find bib entry for %s" the-key))
+       (re-search-backward "%%%Filename: \\([^\n]*\\)" nil t)
+       (setq the-file (match-string 1))
+       (kill-buffer bib-buffer)))
+;;; (find-file the-file)
+    (funcall bib-switch-to-buffer-function (find-file-noselect the-file))
+    (goto-char (point-min))             ;V2.19 fix
+    (re-search-forward (concat "@[^{(]+[{(][\t ]*"
+                              (regexp-quote the-key)
+                              "[ ,\n]") nil t)))
+
+;;--------------------------------------------------------------------------
+;; Function for bib-apropos
+
+(defun bib-apropos-keyword-at-point ()
+  "Return the keyword under point for initial input to bib-apropos prompt."
+  (save-excursion
+    (let ((here (point)))
+      (cond
+       ((and (re-search-backward "[\n{, ]" nil t)
+            (string-equal "{" (buffer-substring (match-beginning 0)
+                                                (match-end 0))))
+       (if (fboundp 'buffer-substring-no-properties)
+           (buffer-substring-no-properties (1+ (point)) here)
+       (buffer-substring (1+ (point)) here)))))))
+
+;;--------------------------------------------------------------------------
+;; Functions for Displaying or moving to matching \ref or \label command
+
+(defun bib-display-label ()
+"Display environment or first ref associated with a label.
+The label or ref name is extracted from the text under the cursor, or the
+user is prompted is nothing suitable is found.  The first prompt is for a
+label.  If you answer with an empty string, a second prompt for a ref will
+be given."
+  (let ((the-regexp (bib-guess-or-prompt-for-label)))
+    (if (not the-regexp)
+       (message "No name given")
+      (bib-display-or-find-label the-regexp t))))
+
+(defun bib-find-label ()
+  "Move to a label, or the first occurance of a ref.
+The label or ref name is extracted from the text under the cursor.
+If nothing suitable is found, the user is prompted. The first prompt is for a
+label. If you answer with an empty string, a second prompt for a ref will be
+given.
+
+If within a single file document:
+  You can move back with C-xC-x as the mark is set before moving.
+  You can search for next occurrances of a ref command with C-sC-s.
+
+If within a multi-file document (in auctex only)
+  You can move back with C-xC-x if within the same buffer.  If not, just
+  select your previous buffer.
+  You can search for next occurrances of a ref command with tag commands:
+     C-u M-.     Find next alternate definition of last tag specified.
+     C-u - M-.   Go back to previous tag found."
+  (let ((the-regexp (bib-guess-or-prompt-for-label)))
+    (if (not the-regexp)
+       (message "No name given")
+      (bib-display-or-find-label the-regexp nil))))
+
+;;--------------------------------------------------------------------------
+;; Functions for Displaying or moving to matching \ref or \label command
+
+(defun bib-display-or-find-label (the-regexp displayf)
+;; work horse for bib-find-label and bib-display-label
+  (let* ((masterfile (bib-master-file))
+        (masterdir (and masterfile
+                        (file-name-directory masterfile)))
+        (new-point)(new-buffer))
+    (save-excursion
+      ;; Now we are either in a simple file, or with a multi-file document
+      (cond
+       (masterfile                   ;Multi-file document
+       (cond
+        (displayf                  ;Display only
+         (set-buffer (bib-etags-find-noselect the-regexp masterdir))
+         (re-search-forward the-regexp nil t)
+         ;; ...because tags puts point on beginning of line
+         (if (string-match "^\\\\\\\\label" the-regexp)
+             (bib-display-this-environment) ;display the label's environment
+           (bib-display-this-ref)))    ;     display the ref's context
+        (t                         ;Move to it
+         (setq new-buffer (bib-etags-find-noselect the-regexp masterdir))
+         (if bib-novice
+             (message
+              (substitute-command-keys
+               (concat "Use \\[bib-find-next] to find the next occurrence "
+                       "and C-u \\[bib-find-next] to find previous."))))
+         (if (equal new-buffer (current-buffer))
+             (setq new-point (point)))))) ;Moving with the same buffer
+       (t                           ;Single-file document
+       (goto-char (point-min))
+       (cond
+        ((re-search-forward the-regexp nil t)
+         (if displayf
+             (if (string-match "^\\\\label" the-regexp)
+                 (bib-display-this-environment) ;Display the environment
+               (bib-display-this-ref)) ;         display the ref's context
+           (setq new-point (match-beginning 0))  ;or move there
+           (if (string-match "{\\(.*\\)}" the-regexp)
+               (setq bib-cite-search-ring (match-string 1 the-regexp)))
+           (if bib-novice
+               (message
+                (substitute-command-keys
+                 (concat "Use \\[bib-find-next] to find the next occurrence "
+                         "and C-u \\[bib-find-next] to find previous."))))))
+        (t
+         (message "Sorry, cannot find it (%s)" the-regexp))))))
+    (if new-point
+       (progn
+         (push-mark (point) t nil)   ;We've moving there... push mark
+         (goto-char new-point))
+      (if new-buffer                    ;We've changing buffer
+         ;;(switch-to-buffer new-buffer)
+         (funcall bib-switch-to-buffer-function new-buffer)))
+    (if (bib-Is-hidden)
+       (save-excursion
+         (beginning-of-line)
+         (show-entry)))))
+
+(defvar bib-label-prompt-map nil)
+(if bib-label-prompt-map
+    ()
+  (setq bib-label-prompt-map (copy-keymap minibuffer-local-completion-map))
+  (define-key bib-label-prompt-map " " 'self-insert-command))
+
+(defun bib-guess-or-prompt-for-label ()
+  "Guess from context, or prompt the user for a label command."
+  (save-excursion
+    (if (not (looking-at "\\\\"))        ;If not on beginning of a command
+            (re-search-backward "[\\]"
+                                (save-excursion (beginning-of-line)(point))
+                                t))
+    (cond
+     ((looking-at bib-ref-regexpc)   ;On \ref, looking for matching \label
+      (let ((b (progn (search-forward "{" nil t)(forward-char -1)(point)))
+           (e (progn (forward-sexp 1)(point))))
+       (concat "\\\\label" (regexp-quote (buffer-substring b e)))))
+     ((looking-at "\\\\label{")         ;On \label, looking for matching \ref
+      (let ((b (progn (search-forward "{" nil t)(forward-char -1)(point)))
+           (e (progn (forward-sexp 1)(point))))
+       (concat  bib-ref-regexp (regexp-quote (buffer-substring b e)))))
+     (t                                 ;Prompt the user
+      (let* ((minibuffer-local-completion-map bib-label-prompt-map)
+            (the-alist (create-alist-from-list
+                        (cdr (reverse LaTeX-label-list))))
+       ;;; LaTeX-label-list example:
+       ;;;  '(("label3" "label4")("label1" "label2") nil)
+       ;; so let's get rid of that nil part in embedded list.
+            (the-name
+             (if (string-equal "18" (substring emacs-version 0 2))
+                 (completing-read "Label: " the-alist nil nil nil)
+               (completing-read "Label: " the-alist nil nil nil
+                                'LaTeX-find-label-hist-alist))))
+       (if (not (equal the-name ""))
+           (concat "\\\\label{" (regexp-quote the-name) "}")
+         ;; else try to get a \ref
+         (if (string-equal "18" (substring emacs-version 0 2))
+             (setq the-name (completing-read "Ref: " the-alist nil nil nil))
+           (setq the-name (completing-read "Ref: " the-alist nil nil nil
+                                           'LaTeX-find-label-hist-alist)))
+         (if (not (equal the-name ""))
+             (concat bib-ref-regexpc (regexp-quote the-name) "}")
+           nil)))))))
+
+(defun bib-display-this-ref ()
+  "Display a few lines around current point."
+  (cond
+   ((bib-Is-hidden)
+    (with-output-to-temp-buffer "*BiBTemp*"
+      (princ
+       (buffer-substring
+       (save-excursion
+         (let ((i 3))
+           (while (and (> i 0)
+                       (re-search-backward "[\n\^M]" nil t)
+                       (setq i (1- i)))))
+         (point))
+       (save-excursion
+         (let ((i 3))
+           (while (and (> i 0)
+                       (re-search-forward "[\n\^M]" nil t)
+                       (setq i (1- i)))))
+         (point)))))
+    (set-buffer "*BiBTemp*")
+    (while (search-forward "\^M" nil t)
+      (replace-match "\n" nil t))
+    (goto-char 1)
+    (if (looking-at "\n")  ;Remove first empty line...
+       (delete-char 1))
+    (with-output-to-temp-buffer "*Help*"
+      (princ (buffer-substring 1 (point-max))))
+    (bib-cite-fontify-help-as-latex)
+    (kill-buffer "*BiBTemp*"))
+   (t
+    (with-output-to-temp-buffer ;     display the ref's context
+       "*Help*"
+      (princ
+       (buffer-substring (save-excursion (forward-line -2)(point))
+                        (save-excursion (forward-line 3)(point)))))
+    (bib-cite-fontify-help-as-latex))))
+
+(defun bib-display-this-environment ()
+  "Display the environment associated with a label, or its section name.
+Assumes point is already on the label.
+Does not save excursion."
+;; Bugs:  The method used here to detect the environment is *not* foolproof.
+;;        It will get confused, for example, between two figure environments,
+;;        picking out both instead of the section label above them.  But since
+;;        users typically puts their labels next to the section declaration,
+;;        I'm satisfied with this... for now.
+;; I could have used the following AUCTeX functions:
+;;  LaTeX-current-environment
+;;    Function: Return the name (a string) of the enclosing LaTeX environment.
+;;  LaTeX-current-section
+;;    Function: Return the level of the section that contain point.
+;; but then this code would only work as part of AUCTeX...
+  (let ((the-point (point))
+       (end-point (point))
+       (the-environment)(foundf))
+    (while (and (not foundf)
+               (goto-char end-point) ;Past end of last search
+               (re-search-forward "\\(^\\|\^M\\)[ \t]*\\\\end{\\([^}]*\\)}"
+                                  nil t))
+      (setq end-point (point))
+      (setq the-environment (match-string 2))
+      (and (not (string-match "document" the-environment))
+          (re-search-backward (concat "\\(^\\|\^M\\)[ \t]*\\\\begin{"
+                                      (regexp-quote the-environment) "}"))
+          (<= (point) the-point)
+          (setq foundf t)))
+    (if foundf                          ;A good environment
+       (progn
+         (cond ((bib-Is-hidden)        ;Better way is: replace-within-string
+                (with-output-to-temp-buffer "*BiBTemp*"
+                  (princ (buffer-substring (point) end-point)))
+                (set-buffer "*BiBTemp*")
+                (while (search-forward "\^M" nil t)
+                  (replace-match "\n" nil t))
+                (goto-char 1)
+                (if (looking-at "\n")  ;Remove first empty line...
+                    (delete-char 1))
+                (with-output-to-temp-buffer "*Help*"
+                  (princ (buffer-substring 1 (point-max))))
+                (kill-buffer "*BiBTemp*"))
+               (t
+                (with-output-to-temp-buffer "*Help*"
+                  (princ (buffer-substring (point) end-point)))))
+         (bib-cite-fontify-help-as-latex))
+      ;; Just find the section declaration
+      (goto-char the-point)
+      (if (re-search-backward
+;;;        "\\(^\\|\^M\\)[ \t]*\\\\\\(sub\\)*section{\\([^}]*\\)}" nil t)
+;;; Michael Steiner <steiner@cs.uni-sb.de> patch
+          "\\(^\\|\^M\\)[ \t]*\\\\\\(\\(sub\\)*section\\|chapter\\|part\\)\\*?\
+{\\([^}]*\\)}"
+          nil t)
+         (message (match-string 0))
+       (error
+        "Sorry, could not find an environment or section declaration")))))
+
+(defvar LaTeX-find-label-hist-alist nil "History list for LaTeX-find-label.")
+(defvar LaTeX-label-list nil "Used by AUCTeX to store label names.")
+
+
+(defun create-alist-from-list (the-list)
+  "Return a single list from a THE-LIST that may contain either items or lists.
+e.g. turns
+'((\"label3\" \"label4\")(\"label1\" \"label2\") \"label\")
+into
+'((\"label3\") (\"label4\") (\"label1\") (\"label2\") (\"label\"))"
+  (mapcar 'list (bib-cite-mh-list-to-string the-list)))
+
+;;;
+;;; Following two functions from mh-utils.el (part of GNU emacs)
+;;; I have changed the names in case these functions change what they do.
+;;;
+
+(defun bib-cite-mh-list-to-string (l)
+  "Flattens the list L and make every element of the new list into a string."
+  (nreverse (bib-cite-mh-list-to-string-1 l)))
+
+(defun bib-cite-mh-list-to-string-1 (l)
+  (let ((new-list nil))
+    (while l
+      (cond ((null (car l)))
+           ((symbolp (car l))
+            (setq new-list (cons (symbol-name (car l)) new-list)))
+           ((numberp (car l))
+            (setq new-list (cons (int-to-string (car l)) new-list)))
+           ((equal (car l) ""))
+           ((stringp (car l)) (setq new-list (cons (car l) new-list)))
+           ((listp (car l))
+            (setq new-list (nconc (bib-cite-mh-list-to-string-1 (car l))
+                                  new-list)))
+           (t (error "Bad element in mh-list-to-string: %s" (car l))))
+      (setq l (cdr l)))
+    new-list))
+
+;; -------------------------------------------------------------------------
+;; Routines to extract cite keys from text
+
+;;    ... is truly remarkable, as shown in \citeN{Thomson77,Test56}. Every
+;; \cite[{\it e.g.}]{Thomson77,Test56}
+
+(defun bib-get-citations (keys-obarray bib-buffer new-buffer substitute)
+  "Put citations of KEYS-OBARRAY from BIB-BUFFER into NEW-BUFFER.
+Substitute strings if SUBSTITUTE is t
+Return the-warnings as text."
+  (let ((the-warnings)                  ;The only variable to remember...
+       (case-fold-search t))           ;All other results go into new-buffer
+    ;; bibtex is not case-sensitive for keys.
+    (save-excursion
+      (let ((the-text))
+       (set-buffer bib-buffer)
+       (mapatoms                         ;Do this for each cite-key found...
+        (lambda (cite-key)
+          (goto-char (point-min))
+          (if (re-search-forward
+               (concat "@[^{(]+[{(][\t ]*"
+                       (regexp-quote (symbol-name cite-key))
+                       "\\([, ]\\\|$\\)")
+               ;;           ^^     ^  comma, space or end-of-line
+               nil t)
+              (setq the-text (concat the-text
+                                     (buffer-substring
+                                      (progn (beginning-of-line)(point))
+                                      (progn (forward-sexp 2)(point)))
+                                     "\n\n"))
+            (setq the-warnings (concat the-warnings
+                                       "Cannot find entry for: "
+                                       (symbol-name cite-key) "\n"))))
+        keys-obarray)
+       (if (not the-text)
+           (error "Sorry, could not find any of the references"))
+       ;; Insert the citations in the new buffer
+       (set-buffer new-buffer)
+       (insert the-text)
+       (goto-char 1))
+
+      ;; We are at beginning of new-buffer.
+      ;; Now handle crossrefs
+      (let ((crossref-obarray (make-vector 201 0)))
+       (while (re-search-forward
+               "[, \t]*crossref[ \t]*=[ \t]*\\(\"\\|\{\\)" nil t)
+         ;;handle {text} or "text" cases
+         (if (string-equal "{" (match-string 1))
+             (re-search-forward "[^\}]+" nil t)
+           (re-search-forward "[^\"]+" nil t))
+         (intern (match-string 0) crossref-obarray))
+       ;; Now find the corresponding keys,
+       ;; but add them only if not already in `keys-obarray'
+       (set-buffer bib-buffer)
+       (goto-char 1)
+       (let ((the-text))
+         (mapatoms                     ;Do this for each crossref key found...
+          (lambda (crossref-key)
+            (if (not (intern-soft (symbol-name crossref-key) keys-obarray))
+                (progn
+                  ;; Not in keys-obarray, so not yet displayed.
+                  (goto-char (point-min))
+                  (if (re-search-forward
+                       (concat "@[^{(]+[{(][\t ]*"
+                               (regexp-quote (symbol-name crossref-key))
+                               "\\(,\\|$\\)")
+                       nil t)
+                      (setq the-text
+                            (concat the-text
+                                    (buffer-substring
+                                     (progn (beginning-of-line)(point))
+                                     (progn (forward-sexp 2)(point)))
+                                    "\n\n"))
+                    (setq the-warnings
+                          (concat the-warnings
+                                  "Cannot find crossref entry for: "
+                                  (symbol-name crossref-key) "\n"))))))
+          crossref-obarray)
+         ;; Insert the citations in the new buffer
+         (set-buffer new-buffer)
+         (goto-char (point-max))
+         (if the-text
+             (insert the-text)))
+       (goto-char 1))
+
+      ;; Now we have all citations in new-buffer, collect all used @String keys
+      ;; Ex:  journal =      JPO,
+      (let ((strings-obarray (make-vector 201 0)))
+       (while (re-search-forward bib-string-regexp nil t)
+         (intern (match-string 1) strings-obarray))
+       ;; Now find the corresponding @String commands
+       ;; Collect either the @string commands, or the string to substitute
+       (set-buffer bib-buffer)
+       (goto-char 1)
+       (let ((string-alist)
+             (the-text))
+         (mapatoms                     ;Do this for each string-key found...
+          (lambda (string-key)
+            (goto-char (point-min))
+            ;; search for @string{ key = {text}} or @string{ key = "text"}
+            (if (re-search-forward
+                 (concat "^[ \t]*@string[{(]"
+                         (regexp-quote (symbol-name string-key))
+                         "[\t ]*=[\t ]*\\(\"\\|\{\\)")
+                 nil t)
+                (let ((the-string-start (1- (match-end 1))) ;catch bracket
+                      ;;handle {text} or "text" cases
+                      (the-string-end
+                       (cond
+                        ((string-equal "\"" (match-string 1))
+                         (re-search-forward "[^\\]\"" nil t)
+                         (point))
+                        (t
+                         (forward-char -1)
+                         (forward-list 1)
+                         (point)))))
+                  (if substitute      ;Collect substitutions
+                      (setq string-alist
+                            (append
+                             string-alist
+                             (list
+                              (cons (symbol-name string-key)
+                                       ;(regexp-quote
+                                    (buffer-substring the-string-start
+                                                      the-string-end)))));)
+                    ;;Collect the strings command themseves
+                    (setq the-text
+                          (concat the-text
+                                  (buffer-substring
+                                   (progn (forward-char 1)(point))
+                                   (re-search-backward "^[ \t]*@string[{(]"
+                                                       nil t))
+                                  "\n"))))
+              ;; @string entry not found
+              (if (not (member-cis (symbol-name string-key)
+                                   bib-string-ignored-warning))
+                  (setq the-warnings
+                        (concat the-warnings
+                                "Cannot find @String entry for: "
+                                (symbol-name string-key) "\n")))))
+          strings-obarray)
+         ;; Now we have `the-text' of @string commands,
+         ;; or the `string-alist' to substitute.
+         (set-buffer new-buffer)
+         (if substitute
+             (while string-alist
+               (goto-char 1)
+               (let* ((the-key (car (car string-alist)))
+                      (the-string (cdr (car string-alist)))
+                      (slashed-string  ; "J. of Geo.\" -> "J. of Geo.\\\\"
+                       (dired-replace-in-string
+                        "\\\\" "\\\\" the-string)))
+
+                 (while (re-search-forward
+                         (concat "\\(^[, \t]*[a-zA-Z]+[ \t]*=[ \t]*\\)"
+                                 (regexp-quote the-key)
+                                 "\\([, \t\n]\\)")
+                         nil t)
+                   (replace-match (concat "\\1" slashed-string "\\2") t nil)))
+               (setq string-alist (cdr string-alist)))
+           ;; substitute is nil; Simply insert text of @string commands
+           (goto-char 1)
+           (if the-text
+               (insert the-text "\n")))
+         (goto-char 1))))
+
+    ;; We are done!
+    ;; Return the warnings...
+    the-warnings))
+
+;;; Following contributed by Michael Steiner <steiner@cs.uni-sb.de> The
+;;  @string abbreviation are not case-sensitive, so we replaced the `member'
+;;  test above with `member-cis' defined here:
+(defun member-cis (ELT LIST)
+  "Return non-nil if ELT is an element of LIST.
+All elements should be strings.
+Comparison is case-insensitive."
+  ;; If list is exhausted,
+  (if (null LIST)
+      nil ;; if null then we haven't found the element ...
+    ;; else split list and ...
+    (let((listelt (car LIST))(listrest (cdr LIST)))
+      ;; see if car is equal to ELT
+      (if (string-equal (downcase ELT) (downcase listelt))
+         t ;; if so return true
+       ;; else recurse for rest of list
+       (member-cis ELT listrest)))))
+
+(defun bib-get-citekeys-obarray ()
+  "Return obarray of citation key (within curly brackets) under cursor."
+  (save-excursion
+    ;; First find *only* a key *within a cite command
+    (let ((the-point (point))
+         (keys-obarray (make-vector 201 0)))
+      ;; First try to match a cite command
+      (if (and (skip-chars-backward "a-zA-Z") ;Stops on \ or {
+              (looking-at "[a-zA-Z]*cite[a-zA-Z]*"))
+         (progn
+           ;;skip over any optional arguments to \cite[][]{key} command
+           (skip-chars-forward "a-zA-Z")
+           (while (looking-at "\\[")
+             (forward-list 1))
+           (re-search-forward "{[ \n]*\\([^,} \n]+\\)" nil t)
+           (intern (match-string 1) keys-obarray)
+           (while (and (skip-chars-forward " \n") ;no effect on while
+                       (looking-at ","))
+             (forward-char 1)
+             ;;The following re-search skips over leading spaces
+             (re-search-forward "\\([^,} \n]+\\)" nil t)
+             (intern (match-string 1) keys-obarray)))
+       ;; Assume we are on the keyword
+       (goto-char the-point)
+       (let ((the-start (re-search-backward "[\n{, ]" nil t))
+             (the-end (progn (goto-char the-point)
+                             (re-search-forward "[\n}, ]" nil t))))
+         (if (and the-start the-end)
+             (intern (buffer-substring (1+ the-start) (1- the-end))
+                     keys-obarray)
+           ;; Neither...
+           (error "Sorry, can't find a reference here"))))
+      keys-obarray)))
+
+(defun bib-buffer-citekeys-obarray ()
+  "Extract citations keys used in the current buffer."
+  (let ((keys-obarray (make-vector 201 0)))
+    (save-excursion
+      (goto-char (point-min))
+      ;; Following must allow for \cite[e.g.][]{key} !!!
+      ;; regexp for \cite{key1,key2} was "\\\\[a-Z]*cite[a-Z]*{\\([^,}]+\\)"
+      (while (re-search-forward "\\\\[a-zA-Z]*cite[a-zA-Z]*\\(\\[\\|{\\)"
+                               nil t)
+       (backward-char 1)
+       (while (looking-at "\\[")       ; ...so skip all bracketted options
+         (forward-sexp 1))
+       ;; then lookup first key
+       (if (looking-at "{[ \n]*\\([^,} \n]+\\)")
+           (progn
+             (intern (match-string 1) keys-obarray)
+             (goto-char (match-end 1))
+             (while (and (skip-chars-forward " \n")
+                         (looking-at ","))
+               (forward-char 1)
+               (re-search-forward "\\([^,} \n]+\\)" nil t)
+               (intern (match-string 1) keys-obarray)))))
+      (if keys-obarray
+         keys-obarray
+       (error "Sorry, could not find any citation keys in this buffer")))))
+
+;;---------------------------------------------------------------------------
+;; Multi-file document programming requirements:
+;; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+;; bib-make-bibliography
+;;    bib-document-citekeys-obarray needs the master .aux file to extract
+;;   citation keys.
+;;    Included .aux files (corresponding to \include'd LaTeX files) are
+;;   then specified relative to the master-file-directory.
+;;
+;; bib-get-bibliography (used by interactive commands to extract bib sources)
+;;
+;;    bibtex source filenames are returned from (LaTeX-bibliography-list)
+;;   unformatted.  Since only a single \bibliogragrphy command is allowed
+;;   by BiBTeX in a document, it is safe to assume that their path is
+;;   relative to the master file's directory (since the path is relative
+;;   to where the BiBTeX program is actually ran).
+;;
+
+;; (See TeX-check-files, used in TeX-save-document.  All documents related
+;;  files are returned by (TeX-style-list) and stored in TeX-active-styles.
+;;  Original idea was to search TeX-check-path for files listed in
+;;  TeX-active-styles (with possible relative or full paths) that end in .tex.)
+
+(defun bib-master-directory ()
+  "Return the directory associated with the master file.
+If no master file, then return current default."
+  (let ((masterfile (bib-master-file)))
+    (if masterfile
+       (file-name-directory (expand-file-name (TeX-master-file)))
+      default-directory)))
+
+(defun bib-master-file ()
+  "Return master file full path, or nil if not a multi-file document."
+;; I wish there were a better way to tell about non multi-file documents...
+  (let ((master
+        (cond
+         ((not (boundp 'TeX-master))
+          ;; This buffer doesn't know what a master file is, so return now.
+          nil)
+         ((and TeX-master              ;Set, but not to t
+               (not (symbolp TeX-master))) ; then we have an actual name
+          (expand-file-name TeX-master))
+         ((and (eq TeX-master 't)      ;Test if master file itself
+               (progn                  ;But also require at least one \include
+                 (save-excursion
+                   (goto-char 1)       ;Too bad I have to do this search...
+                   ;; Require that user uses \input{file}
+                   ;; rather than            \input file
+                   (re-search-forward "^[ \t]*\\\\\\(include\\|input\\){"
+                                      nil t))))
+          (buffer-file-name))
+         (t
+          nil))))
+    (cond
+     ((not master)
+      nil)
+     ((string-match ".\\(tex\\|ltx\\)$" master)
+      master)
+     ((file-readable-p (concat master ".ltx"))
+      (concat master ".ltx"))
+     (t
+      (concat master ".tex")))))
+
+;; I don't use this one because files are not returned in order...
+;; (defun bib-document-TeX-files ()
+;; ;; Return all tex input files associated with a known multi-file document.
+;;   (let ((master-directory (bib-master-directory))
+;;         (the-list (cons (file-name-nondirectory (TeX-master-file))
+;;                         (TeX-style-list)))
+;;      ;; TeX-style-list returns "../master" for the main file if TeX-master
+;;      ;; was set like that.  "../master" would not be found relative
+;;      ;; to the master-directory!  So let's add it to the list w/o directory.
+;;         (the-result)
+;;         (the-file))
+;;     (while the-list
+;;       (setq the-file (expand-file-name (car the-list) master-directory))
+;;       (setq the-list (cdr the-list))
+;;       (and (not (string-match ".tex$" the-file))
+;;            (setq the-file (concat the-file ".tex")))
+;;       (and (file-readable-p the-file)
+;;            (not (member the-file the-result)) ;listed already?
+;;            (setq the-result (cons the-file the-result))))
+;;     the-result))
+
+(defun bib-document-TeX-files ()
+  "Return all tex input files associated with a *known* multi-file document.
+For a multi-file document in auctex only.
+No checking is done that this is a real multi-file document.
+Sets global variable bib-document-TeX-files-warnings."
+  (setq bib-document-TeX-files-warnings nil)
+  (let* ((masterfile (bib-master-file))
+        (dir (and masterfile (file-name-directory masterfile)))
+        (tex-buffer (get-buffer-create "*tex-document*"))
+        (the-list (list masterfile))
+        (the-file))
+    (if (not masterfile)
+       (progn
+         (kill-buffer tex-buffer)
+         (error
+          "Sorry, but this is not a multi-file document (Try C-u C-c C-n if using auctex)")))
+    (save-excursion
+      (set-buffer tex-buffer)
+      ;; set its directory so relative includes work without expanding
+      (setq default-directory dir)
+      (insert-file-contents masterfile)
+      (goto-char (point-min))
+      (while (re-search-forward "^[ \t]*\\\\\\(input\\|include\\){\\(.*\\)}"
+                               nil t)
+       (let ((the-file (match-string 2)))
+         (if (string-match ".sty$" the-file) ;Skip over style files!
+             nil
+           (if (and (not (file-readable-p (expand-file-name the-file dir)))
+                    (not (string-match ".ltx$" the-file))
+                    (file-readable-p
+                     (expand-file-name (concat the-file ".ltx") dir)))
+               (setq the-file (concat the-file ".ltx")))
+           (if (and (not (file-readable-p (expand-file-name the-file dir)))
+                    (not (string-match ".tex$" the-file)))
+               (setq the-file (concat the-file ".tex")))
+           (setq the-file (expand-file-name the-file dir))
+           (if (not (file-readable-p the-file))
+               (setq bib-document-TeX-files-warnings
+                     (concat
+                      bib-document-TeX-files-warnings
+                      (format "Warning: File not found: %s" the-file)))
+             (setq the-list (cons (expand-file-name the-file dir) the-list))
+             (end-of-line)(insert "\n")
+             (insert-file-contents the-file))))))
+    (kill-buffer tex-buffer)
+    (nreverse the-list)))
+
+(defun bib-document-citekeys-obarray ()
+  "Return cite keys obarray for multi-file document.
+Return nil if not a multi-file document.
+This is a AUCTeX supported feature only.
+Also, see bib-buffer-citekeys-obarray.
+Sets global variable bib-document-citekeys-obarray-warnings."
+  (setq bib-document-citekeys-obarray-warnings nil)
+  (let ((master-tex (bib-master-file))
+       (master-aux))
+    (if (not master-tex)
+       nil                             ;Not a multifile document.  No need...
+      (setq master-aux (bib-return-aux-file-from-tex master-tex "aux"))
+      (or (file-readable-p master-aux)
+         (error "Sorry, cannot read file %s" master-aux))
+      (and (file-newer-than-file-p master-tex master-aux)
+          (setq bib-document-citekeys-obarray-warnings
+                (format "Warning: %s is out of date relative to %s.\n"
+                        master-aux master-tex)))
+      (let ((work-buffer (get-buffer-create "*bib-cite-work*"))
+           (keys-obarray (make-vector 201 0)))
+       (save-excursion
+         (set-buffer work-buffer)
+         (insert-file-contents master-aux)
+         ;; Because we will be looking for \input statements, we need to set
+         ;; the default directory to that of the master file.
+         (setq default-directory (file-name-directory master-tex))
+         ;; bib-make-bibliography will need this also to find .bib files
+         ;; look for \@input{chap1/part1.aux}
+         (while (re-search-forward "^\\\\@input{\\(.*\\)}$" nil t)
+           (let* ((auxfile (match-string 1))
+                  (texfile (bib-return-aux-file-from-tex auxfile "tex")))
+             (if (not (file-readable-p auxfile))
+                 (setq bib-document-citekeys-obarray-warnings
+                       (concat
+                        bib-document-citekeys-obarray-warnings
+                        (format "Warning: %s is not found or readable.\n"
+                                auxfile)))
+               (if (file-newer-than-file-p texfile auxfile)
+                   (setq bib-document-citekeys-obarray-warnings
+                         (concat
+                          bib-document-citekeys-obarray-warnings
+                          (format
+                           "Warning: %s is out of date relative to %s.\n"
+                           auxfile texfile))))
+               (end-of-line)(insert "\n")
+               (insert-file-contents auxfile))))
+         (goto-char 1)
+
+;;; Patched by calvanes@dis.uniroma1.it (Diego Calvanese)
+;;;      ;; look for \citation{gertsenshtein59}
+;;;       (while (re-search-forward "^\\\\citation{\\(.*\\)}$" nil t)
+;;;         (intern (buffer-substring (match-beginning 1)(match-end 1))
+;;;                 keys-obarray))
+         ;; look for \citation{gertsenshtein59,vardi88,...,ullmann90}
+         ;; comma-separation generated by certain LaTeX styles.
+         (while (re-search-forward "^\\\\citation{\\(.*\\)}$" nil t)
+           (let ((string (match-string 1))
+                 (start 0))
+             (while (string-match "\\([^,\n]+\\)" string start)
+               (intern (substring string (match-beginning 1) (match-end 1))
+                       keys-obarray)
+               (setq start (match-end 0))))))
+       (kill-buffer work-buffer)
+       keys-obarray))))
+
+(defun bib-return-aux-file-from-tex (texname ext)
+  "Given name.name.XXX in TEXNAME return name.name.EXT."
+;; FIXME: Check if in ./, else search
+  (let* ((filename (if (string-match "\\(.*\\)\\.[^\\.]+" texname)
+                      (concat (match-string 1 texname) "." ext)
+                    (concat texname "." ext)))
+        (sansdir (file-name-nondirectory filename)))
+    (if (file-exists-p filename)
+       filename
+      ;; Search bib-cite-aux-inputs path
+      (let ((filename (psg-checkfor-file-list sansdir bib-cite-aux-inputs)))
+       (if (and filename (file-exists-p filename))
+           filename
+         (error "Could not find file %s" sansdir))))))
+
+(defun bib-etags-find-noselect (tag &optional masterdir)
+  "Returns a buffer with point on TAG.
+Buffer is not selected.
+Makes sure TAGS file exists, etc."
+  (require 'etags)
+  (let* ((master (or masterdir (bib-master-directory)))
+        (the-buffer (current-buffer))
+        (new-buffer)
+        (the-tags-file-name (expand-file-name bib-etags-filename master)))
+    (or (file-exists-p the-tags-file-name) ;make sure TAGS exists
+       (bib-etags master))
+    (or (equal the-tags-file-name tags-file-name) ;make sure it's current
+       (visit-tags-table the-tags-file-name))
+    ;; find-tag-noselect should set the TAGS file for the new buffer
+    ;; that's what C-h f visit-tags-table says...
+    (cond
+     ((string-match "XEmacs\\|Lucid" emacs-version)
+      (find-tag tag)
+      (setq new-buffer (current-buffer))
+      (set-buffer the-buffer))
+     (t
+      (setq new-buffer (find-tag-noselect tag nil t))
+                                       ; -> Seems to set buffer to TAGS
+      (set-buffer the-buffer)))
+    new-buffer))
+
+;; --------------------------------------------------------------------------
+;; The following routines make a temporary bibliography buffer
+;; holding all bibtex files found.
+
+(defun bib-get-bibliography (include-filenames-f)
+  "Returns a new bibliography buffer holding all bibtex files in the document.
+
+If using AUCTeX, and either TeX-parse-self is set or C-c C-n is used to
+parse the document, then the entire multifile document will be searched
+for \bibliography commands.
+
+If this fails, the current buffer is searched for the first \bibliography
+command.
+
+If include-filenames-f is true, include as a special header the filename
+of each bib file.
+
+Puts the buffer in text-mode such that forward-sexp works with german \"
+accents embeded in bibtex entries."
+  (let ((bib-list (or (and (fboundp 'LaTeX-bibliography-list)
+                          (boundp 'TeX-auto-update)
+                          (LaTeX-bibliography-list))
+;; LaTeX-bibliography-list (if bound) returns an unformatted list of
+;; bib files used in the document, but only if parsing is turned on
+;; or C-c C-n was used.
+                     (bib-bibliography-list)))
+       (bib-buffer (get-buffer-create "*bibtex-bibliography*"))
+       ;; Path is relative to the master directory
+       (default-directory (bib-master-directory))
+       (the-name)(the-warnings)(the-file))
+    (save-excursion
+      ;; such that forward-sexp works with embeeded \" in german,
+      ;; and unbalanced ()
+      (set-buffer bib-buffer)
+      (erase-buffer)
+      (set-syntax-table text-mode-syntax-table)
+;;      (if (boundp 'bibtex-mode-syntax-table)
+;;          (set-syntax-table bibtex-mode-syntax-table)
+;;        (text-mode))
+      )
+    ;;We have a list of bib files
+    ;;Search for them, include them, list those not readable
+    (while bib-list
+      (setq the-name (car (car bib-list))) ;Extract the string only
+      (setq bib-list (cdr bib-list))
+      (setq the-name
+           (substring the-name
+                      (string-match "[^ ]+" the-name) ;remove leading spaces
+                      (string-match "[ ]+$" the-name))) ;remove trailing space
+      (if (not (string-match "\\.bib$" the-name))
+         (setq the-name (concat the-name ".bib")))
+      (setq the-file
+           (or (and (file-readable-p the-name) the-name)
+               (psg-checkfor-file-list
+                the-name (psg-list-env bib-bibtex-env-variable))
+               ;; Check for BIBINPUT env variable as well (by popular demand!)
+               (psg-checkfor-file-list the-name (psg-list-env "BIBINPUT"))
+               (and bib-cite-inputs
+                    (psg-checkfor-file-list the-name bib-cite-inputs))
+               (and (boundp 'TeX-check-path)
+                    (psg-checkfor-file-list the-name TeX-check-path))))
+      (if the-file
+         (progn
+           (save-excursion
+             (set-buffer bib-buffer)
+             (goto-char (point-max))
+             (if include-filenames-f
+                 (insert "%%%Filename: " the-file "\n"))
+             (insert-file-contents the-file nil)
+             (goto-char 1)))
+       (setq the-warnings
+             (concat the-warnings "Could not read file: " the-name "\n"))))
+    (if the-warnings
+       (progn
+         (with-output-to-temp-buffer "*Help*"
+           (princ the-warnings))
+         (kill-buffer bib-buffer)
+         (error
+          "Sorry, can't find all bibtex files in \\bibliography command"))
+      bib-buffer)))
+
+(defun bib-bibliography-list ()
+  "Return list of bib files listed in first \\bibliography command in buffer.
+Similar output to AUCTeX's LaTeX-bibliography-list
+The first element may contain trailing whitespace (if there was any in input)
+although BiBTeX doesn't allow it!"
+  (save-excursion
+    (goto-char 1)
+    (if (not (re-search-forward "^[ \t]*\\\\bibliography{[ \t]*\\([^},]+\\)"
+                               nil t))
+       (error "Sorry, can't find \\bibliography command anywhere")
+      (let ((the-list (list (match-string 1)))
+           (doNext t))
+       (while doNext
+         (if (looking-at ",")
+             (setq the-list
+                   (append the-list
+                           (list (buffer-substring
+                                  (progn (skip-chars-forward ", ")(point))
+                                  (progn (re-search-forward "[,}]" nil t)
+                                         (backward-char 1)
+                                         (skip-chars-backward ", ")
+                                         (point))))))
+           (setq doNext nil)))
+       (mapcar 'list the-list)))))
+
+;; BibTeX-mode key def to create AUCTeX's parsing file.
+(defun bib-create-auto-file ()
+  "Force the creation of the AUCTeX auto file for a bibtex buffer."
+  (interactive)
+  (if (not (require 'latex))
+      (error "Sorry, This is only useful if you have AUCTeX"))
+  (let ((TeX-auto-save t)
+       (TeX-auto-update t)
+       (TeX-auto-regexp-list BibTeX-auto-regexp-list))
+    ;; TeX-auto-write
+    ;; -> calls TeX-auto-store
+    ;;    -> calls TeX-auto-parse
+    ;;       clears LaTeX-auto-bibtem (temporary holding space for bibitems)
+    ;;       searches buffer using regexp in TeX-auto-regexp-list
+    ;;    -> if LaTeX-auto-bibtem (the temporary holding space for bibitems)
+    ;;       holds stuffs like
+    ;;         ("Zimmermann:1991" "Anger_et_al:1993")
+    ;;       as determined by
+    ;;         (member nil (mapcar 'TeX-auto-entry-clear-p TeX-auto-parser))
+    ;;       then it creates the auto file.
+
+    ;; TeX-auto-write may call TeX-master-file which may fail if
+    ;; TeX-header-end is unset (by LaTeX-common-initialization in latex-mode)
+    (if (not TeX-header-end)
+       (setq TeX-header-end LaTeX-header-end))
+
+    (TeX-auto-write)))
+
+;; --------------------------------------------------------------------------
+;; The following routines are also defined in other packages...
+
+(defun psg-checkfor-file-list (filename list)
+  "Check for presence of FILENAME in directory LIST.  Return 1st found path."
+  ;;USAGE: (psg-checkfor-file-list "gri" (psg-list-env "PATH"))
+  ;;USAGE: (psg-checkfor-file-list "gri-mode.el" load-path)
+  ;;USAGE: (psg-checkfor-file-list "gri.cmd" (psg-translate-ff-list "gri.tmp"))
+  (let ((the-list list)
+       (filespec))
+    (while the-list
+      (if (not (car the-list))          ; it is nil
+         (setq filespec (expand-file-name filename))
+       (setq filespec
+             (concat
+              (expand-file-name (file-name-as-directory (car the-list)))
+              filename)))
+      (if (file-exists-p filespec)
+           (setq the-list nil)
+       (setq filespec nil)
+       (setq the-list (cdr the-list))))
+    (if filespec
+       filespec
+      ;; If I have not found a file yet, then check if some directories
+      ;; ended in // and recurse through them.
+      (let ((the-list list))
+       (while the-list
+         (if (not (string-match "//$" (car the-list))) nil
+           (setq filespec (car
+                           (search-directory-tree
+                            (substring (car the-list) 0 (match-beginning 0))
+                            (concat "^" filename "$")
+                            t
+                            t)))
+           (if filespec                ;Success!
+               (setq the-list nil)))
+         (setq the-list (cdr the-list)))
+       filespec))))
+
+
+(defun search-directory-tree (directories extension-regexp recurse first-file)
+  "Return a list of all reachable files in DIRECTORIES ending with EXTENSION.
+DIRECTORIES is a list or a single-directory string
+EXTENSION-REGEXP is actually (any) regexp, usually \\\\.bib$
+If RECURSE is t, then we will recurse into the directory tree,
+             nil, we will only search the list given.
+If FIRST-FILE is t, stop after first file is found."
+  (or (listp directories)
+      (setq directories (list directories)))
+
+  (let (match)
+    (while directories
+      (let* ((directory (file-name-as-directory  (car directories)))
+            (content (and directory
+                          (file-readable-p directory)
+                          (file-directory-p directory)
+                          (directory-files directory))))
+       (setq directories (cdr directories))
+       (while content
+         (let ((file (expand-file-name (car content) directory)))
+           (cond ((string-match "[.]+$" (car content))) ;This or parent dir
+                 ((not (file-readable-p file)))
+                 ((and recurse
+                       (file-directory-p file))
+                  (setq directories
+                        (cons (file-name-as-directory file) directories)))
+                 ((string-match extension-regexp
+                                (file-name-nondirectory file))
+                  (and first-file
+                       (setq content nil
+                             directories nil))
+                  (setq match (cons file match)))))
+         (setq content (cdr content)))))
+
+    match))
+
+;;; (defun psg-checkfor-file-list (filename list)
+;;;   (let ((the-list list)
+;;;         (filespec))
+;;;     (while the-list
+;;;       (if (not (car the-list))          ; it is nil
+;;;           (setq filespec (concat "~/" filename))
+;;;         (setq filespec
+;;;               (concat (file-name-as-directory (car the-list)) filename)))
+;;;       (if (file-exists-p filespec)
+;;;             (setq the-list nil)
+;;;         (setq filespec nil)
+;;;         (setq the-list (cdr the-list))))
+;;;     filespec))
+
+(or (fboundp 'dired-replace-in-string)
+    ;; This code is part of GNU emacs
+    (defun dired-replace-in-string (regexp newtext string)
+      ;; Replace REGEXP with NEWTEXT everywhere in STRING and return result.
+      ;; NEWTEXT is taken literally---no \\DIGIT escapes will be recognized.
+      (let ((result "") (start 0) mb me)
+       (while (string-match regexp string start)
+         (setq mb (match-beginning 0)
+               me (match-end 0)
+               result (concat result (substring string start mb) newtext)
+               start me))
+       (concat result (substring string start)))))
+
+
+;; Could use fset here to equal TeX-split-string to dired-split if only
+;; dired-split is defined.  That would eliminate a check in psg-list-env.
+(and (not (fboundp 'TeX-split-string))
+     (not (fboundp 'dired-split))
+     ;; This code is part of AUCTeX
+     (defun TeX-split-string (char string)
+       "Returns a list of strings. given REGEXP the STRING is split into
+sections which in string was seperated by REGEXP.
+
+Examples:
+
+      (TeX-split-string \"\:\" \"abc:def:ghi\")
+         -> (\"abc\" \"def\" \"ghi\")
+
+      (TeX-split-string \" *\" \"dvips -Plw -p3 -c4 testfile.dvi\")
+
+         -> (\"dvips\" \"-Plw\" \"-p3\" \"-c4\" \"testfile.dvi\")
+
+If CHAR is nil, or \"\", an error will occur."
+
+       (let ((regexp char)
+            (start 0)
+            (result '()))
+        (while (string-match regexp string start)
+          (let ((match (string-match regexp string start)))
+            (setq result (cons (substring string start match) result))
+            (setq start (match-end 0))))
+        (setq result (cons (substring string start nil) result))
+        (nreverse result))))
+
+(defun bib-cite-file-directory-p (file)
+  "Like default `file-directory-p' but allow FILE to end in // for ms-windows."
+  (save-match-data
+    (if (string-match "\\(.*\\)//$" file)
+       (file-directory-p (match-string 1 file))
+      (file-directory-p file))))
+
+(defun psg-list-env (env)
+  "Return a list of directory elements in ENV variable (w/o leading $)
+argument may consist of environment variable plus a trailing directory, e.g.
+HOME or HOME/bin (trailing directory not supported in dos or OS/2).
+
+bib-dos-or-os2-variable affects:
+  path separator used (: or ;)
+  whether backslashes are converted to slashes"
+  (if (not (getenv env))
+      nil                               ;Because dired-replace-in-string fails
+    (let* ((value (if bib-dos-or-os2-variable
+                     (dired-replace-in-string "\\\\" "/" (getenv env))
+                   (getenv env)))
+          (sep-char (or (and bib-dos-or-os2-variable ";") ":"))
+          (entries (and value
+                        (or (and (fboundp 'TeX-split-string)
+                                 (TeX-split-string sep-char value))
+                            (dired-split sep-char value)))))
+      (loop for x in entries if (bib-cite-file-directory-p x) collect x))))
+
+(provide 'bib-cite)
+;;; bib-cite.el ends here
diff --git a/packages/auctex/context-en.el b/packages/auctex/context-en.el
new file mode 100644 (file)
index 0000000..c331cc8
--- /dev/null
@@ -0,0 +1,212 @@
+;;; context-en.el --- Support for the ConTeXt english interface.
+
+;; Copyright (C) 2003, 2004 Free Software Foundation, Inc.
+
+;; Maintainer: Berend de Boer <berend@pobox.com>
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file is loaded by context.el when required.
+
+;;; Code:
+
+;; Build upon ConTeXt
+(require 'context)
+
+;;; ConText macro names
+
+;;; Code:
+(defvar ConTeXt-environment-list-en
+  '("alignment" "appendices"
+    "background" "backmatter" "bodymatter" "bodypart" "buffer"
+    "code" "color" "columns" "combination"
+    "encoding" "extroductions"
+    "fact" "formula" "framedcode" "framedtext" "frontmatter"
+    "helptext" "hiding"
+    "itemize"
+    "legend" "line" "linecorrection" "linenumbering" "lines"
+    "localenvironment" "localfootnotes"
+    "makeup" "mapping" "marginblock" "marginedge" "marginrule" "mode"
+    "narrower" "notmode"
+    "opposite"
+    "packed" "pagecomment" "pagefigure" "positioning" "postponing"
+    "quotation"
+    "raster" "register"
+    "standardmakeup"
+    "table" "tabulate" "TEXpage" "text" "textbackground" "typing"
+    "unpacked"
+    ;; project structure
+    "component" "environment" "product" "project"
+    ;; flowcharts, if you have loaded this module
+    "FLOWcell" "FLOWchart"
+    ;; typesetting computer languages
+    "EIFFEL" "JAVA" "JAVASCRIPT" "MP" "PASCAL" "PERL" "SQL" "TEX" "XML"
+    ;; some metapost environments
+    "MPpositiongraphic" "useMPgraphic" "MPcode" "reusableMPgraphic"
+    "uniqueMPgraphic")
+  "List of the ConTeXt en interface start/stop pairs.")
+
+(defvar ConTeXt-define-list-en
+  '("accent"
+    "background" "blank" "block" "blocks" "bodyfont" "bodyfontenvironment"
+    "buffer"
+    "casemap" "character" "color" "colorgroup" "combinedlist" "command"
+    "description" "enumeration"
+    "float" "font" "fontsynonym" "framedtext" "head"
+    "indenting" "label"
+    "logo" "overlay"
+    "palet" "program" "startstop" "type" "typing")
+  "List of the names of ConTeXt en interface  macro's that define things.")
+
+(defvar ConTeXt-setup-list-en
+  '("align" "arranging" "background" "backgrounds" "blackrules"
+    "blank" "block" "bodyfont" "bodyfontenvironment" "bottom"
+    "bottomtexts" "buffer" "capitals" "caption" "captions" "color"
+    "colors" "columns" "combinations" "combinedlist" "descriptions"
+    "enumerations" "externalfigures" "fillinlines" "fillinrules" "float"
+    "floats" "footer" "footertexts" "footnodedefinition" "footnotes"
+    "framed" "framedtexts" "head" "header" "headertexts" "headnumber"
+    "heads" "headtext" "hyphenmark" "indentations" "indenting" "inmargin"
+    "interlinespace" "itemize" "items" "labeltext" "language" "layout"
+    "linenumbering" "lines" "list" "makeup" "marginblocks"
+    "marginrules" "marking" "narrower" "oppositeplacing"
+    "pagecomment" "pagenumber" "pagenumbering" "palet" "papersize" "paragraphs"
+    "quote" "referencing" "register"
+    "screens" "section" "sectionblock" "sorting" "spacing"
+    "subpagenumber" "synonyms" "text" "textrules" "texttexts" "thinrules"
+    "tolerance" "top" "toptexts" "type" "typing" "underbar" "whitespace")
+  "List of the names of ConTeXt en interface  macro's that setup things.")
+
+;; referencing in ConTeXt
+(defvar ConTeXt-referencing-list-en
+  '("in" "at" "about" "pagereference" "textreference" "reference")
+  "List of ConTeXt en macro's that are used for referencing."
+)
+
+;; lists some place macro's as well, should perhaps be under separate menu
+(defvar ConTeXt-other-macro-list-en
+  '("abbreviation" "adaptlayout" "at" "combinepages" "copypages"
+    "externalfigure" "framed" "from" "input" "insertpages" "filterpages"
+    "getbuffer" "goto"
+    "hideblocks" "keepblocks"
+    "leftaligned" "midaligned"
+    "obeyspaces"
+    "page"
+    "placecontent" "placeexternalfigure" "placefigure" "placelogos" "placetable"
+    "processblocks" "protect"
+    "raggedcenter" "rightaligned" "rotate"
+    "scale" "selectblocks" "showexternalfigures" "slicepages"
+    "useexternalfigure" "unprotect" "url" "useblocks" "usemodule" "useURL"
+    "version")
+  "List of ConTeXt en interface macro's that are not an environment nor a setup.")
+
+(defun ConTeXt-define-command-en (what)
+  "The ConTeXt en interface way of creating a define command."
+  (concat "define" what))
+
+(defun ConTeXt-setup-command-en (what)
+  "The ConTeXt en interface way of creating a setup command."
+  (concat "setup" what))
+
+(defvar ConTeXt-project-structure-list-en
+  '("project" "environment" "product" "component")
+  "List of the names of ConTeXt project structure elements for its en interface.  List should be in logical order.")
+
+(defvar ConTeXt-section-block-list-en
+  '("frontmatter" "bodymatter" "appendices" "backmatter")
+  "List of the names of ConTeXt section blocks for its en interface.  List should be in logical order.")
+
+
+;; TODO:
+;; ConTeXt has alternative sections like title and subject. Currently
+;; the level is used to find the section name, so the alternative
+;; names are never found. Have to start using the section name instead
+;; of the number.
+(defvar ConTeXt-section-list-en
+  '(("part" 0)
+    ("chapter" 1)
+    ("section" 2)
+    ("subsection" 3)
+    ("subsubsection" 4))
+  ;; ("title" 1)
+  ;; ("subject" 2)
+  ;; ("subsubject" 3)
+  ;; ("subsubsubject" 4)
+  "List of the names of ConTeXt sections for its en interface.")
+
+(defvar ConTeXt-text-en "text"
+  "The ConTeXt en interface body text group.")
+
+(defvar ConTeXt-item-list-en
+  '("item" "its" "mar" "ran" "sub" "sym")
+  "The ConTeXt macro's that are variants of item.")
+
+(defcustom ConTeXt-default-environment-en "itemize"
+  "*The default environment when creating new ones with `ConTeXt-environment'."
+  :group 'ConTeXt-en-environment
+  :type 'string)
+
+
+;; Emacs en menu names and labels should go here
+;; to be done
+
+
+;;; Mode
+
+(defun ConTeXt-en-mode-initialization ()
+  "ConTeXt english interface specific initialization."
+  (mapc 'ConTeXt-add-environments (reverse ConTeXt-environment-list-en))
+
+  (TeX-add-symbols
+   '("but" ConTeXt-arg-define-ref (TeX-arg-literal " "))
+   '("item" ConTeXt-arg-define-ref (TeX-arg-literal " "))
+   '("items" [ConTeXt-arg-setup] (TeX-arg-string "Comma separated list"))
+   '("its" ConTeXt-arg-define-ref (TeX-arg-literal " "))
+   '("nop" (TeX-arg-literal " "))
+   '("ran" TeX-arg-string (TeX-arg-literal " "))
+   '("sub" ConTeXt-arg-define-ref (TeX-arg-literal " "))
+   '("sym" (TeX-arg-string "Symbol") (TeX-arg-literal " "))))
+
+;;;###autoload
+(defun context-en-mode ()
+  "Major mode for editing files for ConTeXt using its english interface.
+
+Special commands:
+\\{ConTeXt-mode-map}
+
+Entering `context-mode' calls the value of `text-mode-hook',
+then the value of TeX-mode-hook, and then the value
+of context-mode-hook."
+  (interactive)
+  ;; set the ConTeXt interface
+  (setq ConTeXt-current-interface "en")
+
+  ;; initialization
+  (ConTeXt-mode-common-initialization)
+  (ConTeXt-en-mode-initialization)
+
+  ;; set mode line
+  (setq TeX-base-mode-name "ConTeXt-en")
+  (TeX-set-mode-name))
+
+(provide 'context-en)
+
+;;; context-en.el ends here
diff --git a/packages/auctex/context-nl.el b/packages/auctex/context-nl.el
new file mode 100644 (file)
index 0000000..9369d0e
--- /dev/null
@@ -0,0 +1,187 @@
+;;; context-nl.el --- Support for the ConTeXt dutch interface.
+
+;; Copyright (C) 2003, 2004 Free Software Foundation, Inc.
+
+;; Maintainer: Berend de Boer <berend@pobox.com>
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file is loaded by context.el when required.
+
+;;; Code:
+
+;; Build upon ConTeXt
+(require 'context)
+
+;;; ConText macro names
+
+(defvar ConTeXt-environment-list-nl
+  '("achtergrond" "alinea" "bloktekst" "buffer" "citaat" "combinatie"
+    "commentaar" "deelomgeving" "document" "doordefinitie"
+    "doornummering" "figuur" "formule" "gegeven" "interactiemenu"
+    "kadertekst" "kantlijn" "kleur" "kolommen" "legenda" "lokaal"
+    "lokalevoetnoten" "margeblok" "naamopmaak" "naast"
+    "opelkaar" "opmaak" "opsomming" "overlay" "overzicht"
+    "paginafiguur" "positioneren" "profiel"
+    "regel" "regelcorrectie" "regelnummeren" "regels"
+    "smaller" "symboolset" "synchronisatie"
+    "tabel" "tabellen" "tabulatie" "tekstlijn" "typen"
+    "uitlijnen" "uitstellen" "vanelkaar" "verbergen" "versie"
+    ;; project structure
+    "omgeving" "onderdeel" "produkt" "project"
+    ;; flowcharts, if you have loaded this module
+    "FLOWcell" "FLOWchart"
+    ;; typesetting computer languages
+    "EIFFEL" "JAVA" "JAVASCRIPT" "MP" "PASCAL" "PERL" "SQL" "TEX" "XML"
+    ;; some metapost environments
+    "MPpositiongraphic" "useMPgraphic" "MPcode" "reusableMPgraphic"
+    "uniqueMPgraphic")
+  "List of the ConTeXt nl interface start/stop pairs.")
+
+(defvar ConTeXt-define-list-nl
+  '("achtergrond" "startstop" "typen")
+  "List of ConTeXt nl interface macro's that define things.")
+
+(defvar ConTeXt-setup-list-nl
+  '("achtergronden" "achtergrond" "alineas" "arrangeren" "blanko"
+    "blok" "blokjes" "blokkopje" "blokkopjes" "boven" "boventeksten"
+    "brieven" "buffer" "buttons" "citeren" "clip" "combinaties"
+    "commentaar" "doordefinieren" "doornummeren" "doorspringen"
+    "dunnelijnen" "externefiguren" "formules" "formulieren"
+    "hoofd" "hoofdteksten" "inmarge" "inspringen" "interactiebalk"
+    "interactie" "interactiemenu" "interactiescherm" "interlinie"
+    "invullijnen" "invulregels" "items" "kaderteksten" "kantlijn"
+    "kapitalen" "kleuren" "kleur" "kolommen" "kop" "kopnummer"
+    "koppelteken" "koppen" "koptekst" "korps" "korpsomgeving"
+    "labeltekst" "layout" "legenda" "lijndikte" "lijn" "lijst"
+    "margeblokken" "markering" "naastplaatsen" "nummeren" "omlijnd"
+    "onder" "onderstrepen" "onderteksten" "opmaak" "opsomming"
+    "paginanummer" "paginanummering" "paginaovergangen" "palet"
+    "papierformaat" "papier" "paragraafnummeren" "plaatsblok"
+    "plaatsblokken" "plaatsblokkensplitsen" "positioneren" "profielen"
+    "programmas" "publicaties" "rasters" "referentielijst" "refereren"
+    "regelnummeren" "regels" "register" "roteren" "samengesteldelijst"
+    "sectieblok" "sectie" "sheets" "smaller" "sorteren" "spatiering"
+    "stickers" "strut" "strut" "subpaginanummer" "symboolset"
+    "synchronisatiebalk" "synchronisatie" "synoniemen" "systeem"
+    "taal" "tabellen" "tab" "tabulatie" "tekst" "tekstlijnen"
+    "tekstpositie" "tekstteksten" "tekstvariabele" "tolerantie" "type"
+    "typen" "uitlijnen" "uitvoer" "url" "velden" "veld" "versies"
+    "voet" "voetnootdefinitie" "voetnoten" "voetteksten" "witruimte")
+  "List of the names of ConTeXt nl interface macro's that setup things.")
+
+(defvar ConTeXt-other-macro-list-nl
+  '("regellinks" "regelmidden" "regelrechts" "toonexternefiguren")
+  "List of ConTeXt nl interface macro's that are not an environment nor a setup.")
+
+(defun ConTeXt-define-command-nl (what)
+  "The ConTeXt nl interface way of creating a define command."
+  (concat "definieer" what))
+
+(defun ConTeXt-setup-command-nl (what)
+  "The ConTeXt nl interface way of creating a setup command."
+  (concat "stel" what "in"))
+
+(defvar ConTeXt-project-structure-list-nl
+  '("project" "omgeving" "produkt" "onderdeel")
+  "List of the names of ConTeXt project structure elements for its nl interface.  List should be in logical order.")
+
+(defvar ConTeXt-section-block-list-nl
+  '("inleidingen" "hoofdteksten" "bijlagen" "uitleidingen")
+  "List of the names of ConTeXt section blocks for its nl interface.  List should be in logical order.")
+
+
+;; TODO:
+;; ConTeXt has alternative sections like title and subject. Currently
+;; the level is used to find the section name, so the alternative
+;; names are never found. Have to start using the section name instead
+;; of the number.
+(defvar ConTeXt-section-list-nl
+  '(("deel" 0)
+    ("hoofdstuk" 1)
+    ("paragraaf" 2)
+    ("subparagraaf" 3)
+    ("subsubparagraaf" 4))
+  ;; ("title" 1)
+  ;; ("subject" 2)
+  ;; ("subsubject" 3)
+  ;; ("subsubsubject" 4)
+  "List of the names of ConTeXt sections for its nl interface.")
+
+(defvar ConTeXt-text-nl "tekst"
+  "The ConTeXt nl interface body text group.")
+
+(defvar ConTeXt-item-list-nl
+  '("som" "its" "mar" "ran" "sub" "sym")
+  "The ConTeXt macro's that are variants of item.")
+
+(defcustom ConTeXt-default-environment-nl "opsomming"
+  "*The default environment when creating new ones with `ConTeXt-environment'."
+  :group 'ConTeXt-nl-environment
+  :type 'string)
+
+
+;; Emacs en menu names and labels should go here
+;; to be done
+
+
+;;; Mode
+
+(defun ConTeXt-nl-mode-initialization ()
+  "ConTeXt dutch interface specific initialization."
+  (mapc 'ConTeXt-add-environments (reverse ConTeXt-environment-list-nl))
+
+  (TeX-add-symbols
+   '("but" ConTeXt-arg-define-ref (TeX-arg-literal " "))
+   '("som" ConTeXt-arg-define-ref (TeX-arg-literal " "))
+   '("items" [ConTeXt-arg-setup] (TeX-arg-string "Comma separated list"))
+   '("its" ConTeXt-arg-define-ref (TeX-arg-literal " "))
+   '("nop" (TeX-arg-literal " "))
+   '("ran" TeX-arg-string (TeX-arg-literal " "))
+   '("sub" ConTeXt-arg-define-ref (TeX-arg-literal " "))
+   '("sym" (TeX-arg-string "Symbol") (TeX-arg-literal " "))))
+
+;;;###autoload
+(defun context-nl-mode ()
+  "Major mode for editing files for ConTeXt using its dutch interface.
+
+Special commands:
+\\{ConTeXt-mode-map}
+
+Entering `context-mode' calls the value of `text-mode-hook',
+then the value of TeX-mode-hook, and then the value
+of context-mode-hook."
+  (interactive)
+
+  ;; set the ConTeXt interface
+  (setq ConTeXt-current-interface "nl")
+
+  ;; initialization
+  (ConTeXt-mode-common-initialization)
+  (ConTeXt-nl-mode-initialization)
+
+  ;; set mode line
+  (setq TeX-base-mode-name "ConTeXt-nl")
+  (TeX-set-mode-name))
+
+(provide 'context-nl)
+
+;;; context-nl.el ends here
diff --git a/packages/auctex/context.el b/packages/auctex/context.el
new file mode 100644 (file)
index 0000000..f7042a6
--- /dev/null
@@ -0,0 +1,1653 @@
+;;; context.el --- Support for ConTeXt documents.
+
+;; Copyright (C) 2003, 2004, 2005, 2006, 2008 Free Software Foundation, Inc.
+
+;; Maintainer: Berend de Boer <berend@pobox.com>
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This is in progress ConTeXt support for AUCTeX. Please report
+;; anomalies or things you believe should be added.
+
+;; AUCTeX is closely interwoven with LaTeX.  We have to split up
+;; things without breaking 'em.
+
+;; some parts are stolen from latex.el and adapted to ConTeXt.
+
+;; TODO
+;; 1. indentation still bad.
+;; 2. paragraph refilling doesn't work 100%, and is very slow.
+;; 4. Remove dependency on LaTeX by moving LaTeX commands to TeX.
+;; 5. Most ConTeXt macro's don't currently have lisp code to query for
+;;    arguments. As ConTeXt arguments are quite complex, the LaTeX way
+;;    of querying for arguments just doesn't cut it.
+;; 6. Check auto-parsing: does it detect % interface=nl for example?
+;; 7. Complete adding ConTeXt macro's. Perhaps parse cont-en.xml and
+;;    generate the interfaces?
+;; 8. Add to menu: make TeX hash (mktexlsr), context format and metapost format.
+
+;; TODO Documentation
+;; 1. multifile done differently with ConTeXt
+
+;;; Code:
+
+(require 'tex-buf)
+(require 'tex)
+;; need functions like TeX-look-at and LaTeX-split-long-menu
+(require 'latex)
+
+(defgroup ConTeXt-macro nil
+  "Special support for ConTeXt macros in AUCTeX."
+  :prefix "TeX-"
+  :group 'ConTeXt
+  :group 'TeX-macro)
+
+
+;;; variables
+
+;; globals used in certain macro's.
+(defvar done-mark nil
+  "Position of point afterwards, default nil (meaning end).")
+
+(defvar reference nil
+  "Set by `ConTeXt-section-ref', used by `ConTeXt-section-section'.")
+
+(defvar title nil
+  "Set by `ConTeXt-section-title', used by `ConTeXt-section-section'.")
+
+
+;; others
+
+(defvar ConTeXt-known-interfaces '("cz" "de" "en" "it" "nl" "ro" "uk"))
+
+(defcustom ConTeXt-default-interface "en"
+  "Default interface to be used when running ConTeXt."
+  :group 'ConTeXt
+  :type 'string)
+
+(defvar ConTeXt-current-interface "en"
+  "Interface to be used for inserting macros and ConTeXt run.")
+(make-variable-buffer-local 'ConTeXt-current-interface)
+
+(defvar ConTeXt-menu-changed nil)
+;; Need to update ConTeXt menu.
+(make-variable-buffer-local 'ConTeXt-menu-changed)
+
+(defvar ConTeXt-largest-level nil
+  "Largest sectioning level within current document.")
+(make-variable-buffer-local 'ConTeXt-largest-level)
+
+(defun ConTeXt-largest-level ()
+  (TeX-update-style)
+  ConTeXt-largest-level)
+
+
+;;; Syntax
+
+(defvar ConTeXt-optop "["
+  "The ConTeXt optional argument opening character.")
+
+(defvar ConTeXt-optcl "]"
+  "The ConTeXt optional argument closing character.")
+
+
+;; Define a ConTeXt macro
+
+(defvar ConTeXt-define-list ()
+  "Calls ConTeXt-XX-define-list where XX is the current interface.")
+
+(defun ConTeXt-define-command (what)
+  "The ConTeXt macro to define WHAT."
+  (funcall
+   (intern (concat "ConTeXt-define-command-" ConTeXt-current-interface)) what))
+
+(defun ConTeXt-insert-define (define)
+  "Insert the ConTeXt define macro DEFINE."
+  (insert TeX-esc (ConTeXt-define-command define))
+  (newline)
+  (indent-according-to-mode)
+  (ConTeXt-arg-setup nil))
+
+
+;; Setup a ConTeXt macro
+
+(defvar ConTeXt-setup-list ()
+  "Calls ConTeXt-XX-setup-list where XX is the current interface.")
+
+(defun ConTeXt-setup-command (what)
+  "The ConTeXt macro to setup WHAT."
+  (funcall
+   (intern (concat "ConTeXt-setup-command-" ConTeXt-current-interface)) what))
+
+(defun ConTeXt-insert-setup (setup)
+  "Insert the ConTeXt setup macro SETUP."
+  (insert TeX-esc (ConTeXt-setup-command setup))
+  (newline)
+  (indent-according-to-mode)
+  (ConTeXt-arg-setup nil))
+
+
+;; Referencing ConTeXt macro's
+
+(defvar ConTeXt-referencing-list ()
+  "Calls ConTeXt-XX-other-macro-list where XX is the current interface.")
+
+(defun ConTeXt-referencing-command (what)
+  "The ConTeXt macro to call WHAT is itself, no interface specific calls."
+  what)
+
+(defun ConTeXt-insert-referencing (what)
+  "Insert the ConTeXt referencing SETUP."
+  (insert TeX-esc (ConTeXt-referencing-command what))
+  (newline)
+  (indent-according-to-mode)
+  (ConTeXt-arg-setup nil))
+
+
+;; Other ConTeXt macro's
+
+(defvar ConTeXt-other-macro-list ()
+  "Calls ConTeXt-XX-other-macro-list where XX is the current interface.")
+
+(defun ConTeXt-other-macro-command (what)
+  "The ConTeXt macro to call WHAT is itself, no interface specific calls."
+  what)
+
+(defun ConTeXt-insert-other-macro (other-macro)
+  "Insert the ConTeXt other macro's macro SETUP."
+  (insert TeX-esc (ConTeXt-other-macro-command other-macro))
+  (newline)
+  (indent-according-to-mode)
+  (ConTeXt-arg-setup nil))
+
+
+;;; Project structure
+
+(defvar ConTeXt-project-structure-list ()
+  "Calls ConTeXt-XX-project-structure where XX is the current interface.")
+
+(defun ConTeXt-project-structure (N)
+  "Insert a ConTeXt project structure where N is in index into `ConTeXt-project-structure-list'."
+  (funcall (intern(concat
+                  "ConTeXt-project-"
+                  (nth N ConTeXt-project-structure-list)
+                  "-insert"))))
+
+(defun ConTeXt-project-project-insert ()
+  "Insert a basic template for a new ConTeXt project."
+  (save-excursion
+    (insert "% The following names are examples only\n")
+    (insert TeX-esc (ConTeXt-environment-start-name) (nth 0 ConTeXt-project-structure-list) " myproject")
+    (newline 2)
+    (insert TeX-esc (nth 1 ConTeXt-project-structure-list) " myenvironment")
+    (newline 2)
+    (insert TeX-esc (nth 2 ConTeXt-project-structure-list) " myproduct1")
+    (newline 2)
+    (insert TeX-esc (nth 2 ConTeXt-project-structure-list) " myproduct2")
+    (newline 2)
+    (insert TeX-esc (ConTeXt-environment-stop-name) (nth 0 ConTeXt-project-structure-list))))
+
+(defun ConTeXt-project-environment-insert ()
+  "Insert a basic template for the environment of a ConTeXt project."
+  (save-excursion
+    (insert "% The name 'myenvironment' is an example only.\n"
+           "% It must match the name in your project file.\n")
+    (insert TeX-esc (ConTeXt-environment-start-name)
+           (nth 1 ConTeXt-project-structure-list) " myenvironment\n\n")
+    (insert "% Put environment charateristics that must be defined at the "
+           "highest level here\n\n")
+    (insert TeX-esc (ConTeXt-environment-stop-name)
+           (nth 1 ConTeXt-project-structure-list))))
+
+(defun ConTeXt-project-product-insert ()
+  "Insert a basic template for a product of a ConTeXt project."
+  (save-excursion
+    (insert "% The following names are examples only\n")
+    (insert TeX-esc (ConTeXt-environment-start-name)
+           (nth 2 ConTeXt-project-structure-list) " myproduct1")
+    (newline 2)
+    (insert TeX-esc (nth 0 ConTeXt-project-structure-list) " myproject")
+    (newline 2)
+    (insert "% Components are optional. "
+           "You can also just start your document here.\n")
+    (insert TeX-esc (nth 3 ConTeXt-project-structure-list) " mycomponent1")
+    (newline 2)
+    (insert TeX-esc (nth 3 ConTeXt-project-structure-list) " mycomponent2")
+    (newline 2)
+    (insert TeX-esc (ConTeXt-environment-stop-name)
+           (nth 2 ConTeXt-project-structure-list))))
+
+(defun ConTeXt-project-component-insert ()
+  "Insert a basic template for a component of a ConTeXt project."
+  (save-excursion
+    (insert "% The following names are examples only\n")
+    (insert TeX-esc (ConTeXt-environment-start-name)
+           (nth 3 ConTeXt-project-structure-list) " mycomponent1")
+    (newline 2)
+    (insert TeX-esc (nth 0 ConTeXt-project-structure-list) " myproject\n")
+    (insert TeX-esc (nth 2 ConTeXt-project-structure-list) " myproduct1")
+    (newline 2)
+    (insert "% ... text here ...")
+    (newline 2)
+    (insert TeX-esc (ConTeXt-environment-stop-name)
+           (nth 3 ConTeXt-project-structure-list))))
+
+
+;;; Section blocks
+
+(defvar ConTeXt-section-block-list ()
+  "Calls ConTeXt-XX-section-list where XX is the current interface.")
+
+(defun ConTeXt-section-block (section-block)
+  "Insert the ConTeXt section block SECTION-BLOCK."
+  (ConTeXt-environment-menu section-block))
+
+
+;;; Sections
+
+(defun ConTeXt-section (arg)
+  "Insert a template for a ConTeXt section.
+Determinate the type of section to be inserted, by the argument ARG.
+
+If ARG is nil or missing, use the current level.
+If ARG is a list (selected by \\[universal-argument]), go downward one level.
+If ARG is negative, go up that many levels.
+If ARG is positive or zero, use absolute level:
+
+       0 : part
+       1 : chapter
+       2 : section
+       3 : subsection
+       4 : subsubsection
+       5 : subsubsubsection
+
+Or:
+
+       0 : title
+       1 : subject
+       2 : subsubject
+       3 : subsubsubject
+
+The following variables can be set to customize:
+
+`ConTeXt-section-hook'    Hooks to run when inserting a section.
+`ConTeXt-section-ref'   Prefix to all section references."
+
+  (interactive "*P")
+  (let* ((val (prefix-numeric-value arg))
+        (level (cond ((null arg)
+                      (ConTeXt-current-section))
+                     ((listp arg)
+                      (ConTeXt-down-section))
+                     ((< val 0)
+                      (ConTeXt-up-section (- val)))
+                     (t val)))
+        (name (ConTeXt-section-name level))
+        (toc nil)
+        (title "")
+        (done-mark (make-marker)))
+    (newline)
+    (run-hooks 'ConTeXt-section-hook)
+    (newline)
+    (if (marker-position done-mark)
+       (goto-char (marker-position done-mark)))
+    (set-marker done-mark nil)))
+
+;; LaTeX has a max function here, which makes no sense.
+;; I think you want to insert a section that is max ConTeXt-largest-level
+(defun ConTeXt-current-section ()
+  "Return the level of the section that contain point.
+See also `ConTeXt-section' for description of levels."
+  (save-excursion
+    (min (ConTeXt-largest-level)
+        (if (re-search-backward outline-regexp nil t)
+            (+ 1 (- (ConTeXt-outline-level) (ConTeXt-outline-offset)))
+          (ConTeXt-largest-level)))))
+
+(defun ConTeXt-down-section ()
+  "Return the value of a section one level under the current.
+Tries to find what kind of section that have been used earlier in the
+text, if this fail, it will just return one less than the current
+section."
+  (save-excursion
+    (let ((current (ConTeXt-current-section))
+         (next nil)
+         (regexp outline-regexp))
+      (if (not (re-search-backward regexp nil t))
+         (1+ current)
+       (while (not next)
+         (cond
+          ((eq (ConTeXt-current-section) current)
+           (if (re-search-forward regexp nil t)
+               (if (<= (setq next (ConTeXt-current-section)) current) ;Wow!
+                   (setq next (1+ current)))
+             (setq next (1+ current))))
+          ((not (re-search-backward regexp nil t))
+           (setq next (1+ current)))))
+       next))))
+
+(defun ConTeXt-up-section (arg)
+  "Return the value of the section ARG levels above this one."
+  (save-excursion
+    (if (zerop arg)
+       (ConTeXt-current-section)
+      (let ((current (ConTeXt-current-section)))
+       (while (and (>= (ConTeXt-current-section) current)
+                   (re-search-backward outline-regexp
+                                       nil t)))
+       (ConTeXt-up-section (1- arg))))))
+
+(defvar ConTeXt-section-list ()
+  "ConTeXt-XX-section-list where XX is the current interface.")
+
+(defun ConTeXt-section-name (level)
+  "Return the name of the section corresponding to LEVEL."
+  (let ((entry (TeX-member level ConTeXt-section-list
+                          (function (lambda (a b) (equal a (nth 1 b)))))))
+    (if entry
+       (nth 0 entry)
+      nil)))
+
+(defun ConTeXt-section-level (name)
+  "Return the level of the section NAME."
+  (let ((entry (TeX-member name ConTeXt-section-list
+                          (function (lambda (a b) (equal a (nth 0 b)))))))
+
+    (if entry
+       (nth 1 entry)
+      nil)))
+
+
+;;; Section Hooks.
+
+(defcustom ConTeXt-section-hook
+  '(ConTeXt-section-heading
+    ConTeXt-section-title
+    ConTeXt-section-ref
+    ConTeXt-section-section)
+  "List of hooks to run when a new section is inserted.
+
+The following variables are set before the hooks are run
+
+level - numeric section level, see the documentation of `ConTeXt-section'.
+name - name of the sectioning command, derived from `level'.
+title - The title of the section, default to an empty string.
+`done-mark' - Position of point afterwards, default nil (meaning end).
+
+The following standard hook exist -
+
+ConTeXt-section-heading: Query the user about the name of the
+sectioning command.  Modifies `level' and `name'.
+
+ConTeXt-section-title: Query the user about the title of the
+section.  Modifies `title'.
+
+ConTeXt-section-section: Insert ConTeXt section command according to
+`name', `title', and `reference'.  If `title' is an empty string,
+`done-mark' will be placed at the point they should be inserted.
+
+ConTeXt-section-ref: Insert a reference for this section command.
+
+To get a full featured `ConTeXt-section' command, insert
+
+ (setq ConTeXt-section-hook
+                        '(ConTeXt-section-heading
+                                ConTeXt-section-title
+                                ConTeXt-section-section
+                                ConTeXt-section-ref))
+
+in your .emacs file."
+  :group 'ConTeXt-macro
+  :type 'hook
+  :options
+  '(ConTeXt-section-heading
+    ConTeXt-section-title
+    ConTeXt-section-ref
+    ConTeXt-section-section))
+
+(defun ConTeXt-section-heading ()
+  "Hook to prompt for ConTeXt section name.
+Insert this hook into `ConTeXt-section-hook' to allow the user to change
+the name of the sectioning command inserted with `\\[ConTeXt-section]'."
+  (let ((string (completing-read
+                (concat "Select level: (default " name ") ")
+                ConTeXt-section-list
+                nil nil nil)))
+    ;; Update name
+    (if (not (zerop (length string)))
+       (setq name string))))
+
+(defun ConTeXt-section-title ()
+  "Hook to prompt for ConTeXt section title.
+Insert this hook into `ConTeXt-section-hook' to allow the user to change
+the title of the section inserted with `\\[ConTeXt-section]."
+  (setq title (read-string "What title: ")))
+
+(defun ConTeXt-section-section ()
+  "Hook to insert ConTeXt section command into the file.
+Insert this hook into `ConTeXt-section-hook' after those hooks which sets
+the `name', `title', and `reference' variables, but before those hooks which
+assumes the section already is inserted."
+  (insert TeX-esc name)
+  (cond ((null reference))
+       ((zerop (length reference))
+        (insert ConTeXt-optop)
+        (set-marker done-mark (point))
+        (insert ConTeXt-optcl))
+       (t
+        (insert ConTeXt-optop reference ConTeXt-optcl)))
+  (insert TeX-grop)
+  (if (zerop (length title))
+      (set-marker done-mark (point)))
+  (insert title TeX-grcl)
+  (newline)
+  ;; If RefTeX is available, tell it that we've just made a new section
+  (and (fboundp 'reftex-notice-new-section)
+       (funcall (symbol-function 'reftex-notice-new-section))))
+
+(defun ConTeXt-section-ref ()
+  "Hook to insert a reference after the sectioning command.
+Insert this hook into `ConTeXt-section-hook' to prompt for a label to be
+inserted after the sectioning command."
+
+  (setq reference (completing-read
+                  (TeX-argument-prompt t nil
+                                       "Comma separated list of references")
+                  (LaTeX-label-list) nil nil))
+  ;; No reference or empty string entered?
+  (if (string-equal "" reference)
+      (setq reference nil)))
+
+
+;; Various
+(defun TeX-ConTeXt-sentinel (process name)
+  "Cleanup TeX output buffer after running ConTeXt."
+  (cond ((TeX-TeX-sentinel-check process name))
+       ((save-excursion
+          ;; in a full ConTeXt run there will multiple texutil
+          ;; outputs. Just looking for "another run needed" would
+          ;; find the first occurence
+          (goto-char (point-max))
+          (re-search-backward "TeXUtil " nil t)
+          (re-search-forward "another run needed" nil t))
+        (message (concat "You should run ConTeXt again "
+                         "to get references right, "
+                         (TeX-current-pages)))
+        (setq TeX-command-next TeX-command-default))
+       ((re-search-forward "removed files :" nil t)
+        (message "sucessfully cleaned up"))
+       ((re-search-forward "^ ?TeX\\(Exec\\|Util\\)" nil t) ;; strange regexp --pg
+        (message (concat name ": successfully formatted "
+                         (TeX-current-pages)))
+        (setq TeX-command-next TeX-command-Show))
+       (t
+        (message (concat name ": problems after "
+                         (TeX-current-pages)))
+        (setq TeX-command-next TeX-command-default))))
+
+
+;;; Environments
+
+(defgroup ConTeXt-environment nil
+  "Environments in AUCTeX."
+  :group 'ConTeXt-macro)
+
+;; TODO: interface awareness
+(defcustom ConTeXt-default-environment "itemize"
+  "*The default environment when creating new ones with `ConTeXt-environment'."
+  :group 'ConTeXt-environment
+  :type 'string)
+(make-variable-buffer-local 'ConTeXt-default-environment)
+
+(TeX-auto-add-type "environment" "ConTeXt")
+
+(fset 'ConTeXt-add-environments-auto
+      (symbol-function 'ConTeXt-add-environments))
+(defun ConTeXt-add-environments (&rest environments)
+  "Add ENVIRONMENTS to the list of known environments."
+  (apply 'ConTeXt-add-environments-auto environments)
+  (setq ConTeXt-menu-changed t))
+
+;; (defvar ConTeXt-environment-list ()
+;;     "ConTeXt-environment-list-XX where XX is the current interface.")
+
+(defvar ConTeXt-environment-history nil)
+
+(defun ConTeXt-environment-start-name ()
+  "Return the \\start translated to the language in current interface."
+  ;; it is "inizia", others are "start"
+  (cond ((equal ConTeXt-current-interface "it")
+        "inizia")
+       ((member ConTeXt-current-interface ConTeXt-known-interfaces)
+        "start")
+       (t
+        ;; this should not happen
+        (error "Unknown interface: %s" ConTeXt-current-interface))))
+
+(defun ConTeXt-environment-stop-name ()
+  "Return the \\stop translated to the language in current interface."
+  ;; it is "termina", others are "stop"
+  (cond ((equal ConTeXt-current-interface "it")
+        "termina")
+       ((member ConTeXt-current-interface ConTeXt-known-interfaces)
+        "stop")
+       (t
+        ;; this should not happen
+        (error "Unknown interface: %s" ConTeXt-current-interface))))
+
+
+(defun ConTeXt-environment (arg)
+  "Make ConTeXt environment (\\start...-\\stop... pair).
+With optional ARG, modify current environment."
+  (interactive "*P")
+  (let ((environment (
+                     completing-read (concat "Environment type: (default "
+                                             (if (TeX-near-bobp)
+                                                 "text"
+                                               ConTeXt-default-environment)
+                                             ") ")
+                     ConTeXt-environment-list
+                     nil nil nil
+                     'ConTeXt-environment-history)
+                    ))
+    ;; Get default
+    (cond ((and (zerop (length environment))
+               (TeX-near-bobp))
+          (setq environment "text"))
+         ((zerop (length environment))
+          (setq environment ConTeXt-default-environment))
+         (t
+          (setq ConTeXt-default-environment environment)))
+
+    (let ((entry (assoc environment ConTeXt-environment-list)))
+      (when (null entry)
+       (ConTeXt-add-environments (list environment)))
+      (if arg
+         (ConTeXt-modify-environment environment)
+       (ConTeXt-environment-menu environment)))))
+
+(defun ConTeXt-modify-environment (environment)
+  "Modify current environment."
+  (save-excursion
+    (ConTeXt-find-matching-stop)
+    (re-search-backward (concat (regexp-quote TeX-esc)
+                               (ConTeXt-environment-stop-name)
+                               " *\\([a-zA-Z]*\\)")
+                       (save-excursion (beginning-of-line 1) (point)))
+    (replace-match
+     (concat TeX-esc (ConTeXt-environment-stop-name) environment) t t)
+    (beginning-of-line 1)
+    (ConTeXt-find-matching-start)
+    (re-search-forward (concat (regexp-quote TeX-esc)
+                              (ConTeXt-environment-start-name)
+                              " *\\([a-zA-Z]*\\)")
+                      (save-excursion (end-of-line 1) (point)))
+    (replace-match
+     (concat TeX-esc (ConTeXt-environment-start-name) environment) t t)))
+
+
+(defun ConTeXt-environment-menu (environment)
+  "Insert ENVIRONMENT around point or region."
+  (let ((entry (assoc environment ConTeXt-environment-list)))
+    (cond ((not (and entry (nth 1 entry)))
+          (ConTeXt-insert-environment environment))
+         ((numberp (nth 1 entry))
+          (let ((count (nth 1 entry))
+                (args ""))
+            (while (> count 0)
+              (setq args (concat args TeX-grop TeX-grcl))
+              (setq count (- count 1)))
+            (ConTeXt-insert-environment environment args)))
+         ((stringp (nth 1 entry))
+          (let ((prompts (cdr entry))
+                (args ""))
+            (while prompts
+              (setq args (concat args
+                                 TeX-grop
+                                 (read-from-minibuffer
+                                  (concat (car prompts) ": "))
+                                 TeX-grcl))
+              (setq prompts (cdr prompts)))
+            (ConTeXt-insert-environment environment args)))
+         (t
+          (apply (nth 1 entry) environment (nthcdr 2 entry))))))
+
+(defun ConTeXt-close-environment ()
+  "Insert \\stop... to match the current environment."
+  (interactive "*")
+  (beginning-of-line)
+  (let ((empty-line (looking-at "[ \t]*$")))
+    (end-of-line)
+    (if (not empty-line)
+       (newline)))
+  (insert TeX-esc (ConTeXt-environment-stop-name)
+         (ConTeXt-current-environment))
+  ;; indent broken, so don't do it.
+  ;;(indent-according-to-mode)
+  (end-of-line)
+  (newline))
+
+(defun ConTeXt-insert-environment (environment &optional extra)
+  "Insert ENVIRONMENT, with optional argument EXTRA."
+  (if (and (TeX-active-mark)
+          (not (eq (mark) (point))))
+      (save-excursion
+       (if (< (mark) (point))
+           (exchange-point-and-mark))
+       (insert TeX-esc (ConTeXt-environment-start-name) environment)
+       (newline)
+       (forward-line -1)
+       (indent-according-to-mode)
+       (if extra (insert extra))
+       (goto-char (mark))
+       (or (TeX-looking-at-backward "^[ \t]*")
+           (newline))
+       (insert TeX-esc (ConTeXt-environment-stop-name) environment)
+       (newline)
+       (forward-line -1)
+       (indent-according-to-mode)
+       ;;(goto-char (point))
+       )
+    (or (TeX-looking-at-backward "^[ \t]*")
+       (newline))
+    (insert TeX-esc (ConTeXt-environment-start-name) environment)
+    (indent-according-to-mode)
+    (if extra (insert extra))
+    (end-of-line)
+    (newline-and-indent)
+    (newline)
+    (insert TeX-esc (ConTeXt-environment-stop-name) environment)
+    (or (looking-at "[ \t]*$")
+       (save-excursion (newline-and-indent)))
+    (indent-according-to-mode)
+    (end-of-line 0)))
+
+\f
+;; with the following we can call a function on an environment. Say
+;; you have metapost stuff within your TeX file, go to the environment
+;; and run ConTeXt-work-on-environment (suggested Key: C-c !). AUCTeX
+;; sees that you are inside e.g. \startMPpage....\stopMPpage and
+;; looks in ConTeXt-environment-helper for a function to be called.
+
+;; % so pressing C-c ! inside the following ...
+;;\startuseMPgraphic{Logo}{Scale}
+;; % Top rectangle
+;; filldraw (0,0)--(2cm,0)--(2cm,1cm)--(0,1cm)--cycle withcolor blue ;
+;; % Bottom black rectangle
+;; drawfill (0,0)--(2cm,0)--(2cm,-1cm)--(0,-1cm)--cycle withcolor black;
+;; % White Text
+;; draw btex \bf AB etex withcolor white ;
+;; % resize to size
+;; currentpicture := currentpicture scaled \MPvar{Scale} ;
+;; \stopuseMPgraphic
+
+;; % ...should give you a "new buffer" (currently narrowed to region
+;; % and switched to metapost-mode and recursive-edit)
+
+;; % Top rectangle
+;; filldraw (0,0)--(2cm,0)--(2cm,1cm)--(0,1cm)--cycle withcolor blue ;
+;; % Bottom black rectangle
+;; drawfill (0,0)--(2cm,0)--(2cm,-1cm)--(0,-1cm)--cycle withcolor black;
+;; % White Text
+;; draw btex \bf AB etex withcolor white ;
+;; % resize to size
+;; currentpicture := currentpicture scaled \MPvar{Scale} ;
+
+
+(defvar ConTeXt-environment-helper
+  '(("useMPgraphic" . ConTeXt-mp-region)
+    ("MPpage" . ConTeXt-mp-region))
+  "Alist that holds functions to call for working on regions.
+An entry looks like: (\"environment\" . function)")
+
+(defun ConTeXt-mp-region ()
+  "Edit region in `metapost-mode'."
+  (ConTeXt-mark-environment t)
+  (narrow-to-region (mark) (point))
+  (metapost-mode)
+  (message "Type `M-x exit-recursive-edit' to get back")
+  (recursive-edit)
+  (context-mode)
+  (widen))
+
+;; find smarter name. Suggestions welcome
+(defun ConTeXt-work-on-environment ()
+  "Takes current environment and does something on it (todo: documentation)."
+  (interactive)
+  (let ((fun (cdr (assoc (ConTeXt-current-environment)
+                        ConTeXt-environment-helper))))
+    (when (functionp fun)
+      (funcall fun))))
+
+(defun ConTeXt-current-environment ()
+  "Return the name of the current environment."
+  ;; don't make this interactive.
+  (let ((beg))
+    (save-excursion
+      (ConTeXt-last-unended-start)
+      (setq beg (+ (point) (length (ConTeXt-environment-start-name)) 1))
+      (goto-char (match-end 0))
+      (skip-chars-forward "a-zA-Z")
+      (buffer-substring beg (point)))))
+
+(defun ConTeXt-last-unended-start ()
+  "Leave point at the beginning of the last `\\start...' that is unstopped looking from the current cursor."
+  (while (and (re-search-backward "\\\\start[a-zA-Z]*\\|\\\\stop[a-zA-Z]*")
+             (looking-at "\\\\stop[a-zA-Z]*"))
+    (ConTeXt-last-unended-start)))
+
+(defun ConTeXt-mark-environment (&optional inner)
+  "Set mark to end of current environment (\\start...-\\stop...) and
+point to the matching begin.
+If optional INNER is not nil, include \\start... and \\stop, otherwise only
+the contents."
+  (interactive)
+  (let ((cur (point)))
+    (ConTeXt-find-matching-stop inner)
+    (set-mark (point))
+    (goto-char cur)
+    (ConTeXt-find-matching-start inner)
+    (TeX-activate-region)))
+
+(defun ConTeXt-find-matching-stop (&optional inner)
+  "Find end of current \\start...\\stop-Pair.
+If INNER is non-nil, go to the point just past before
+\\stop... macro.  Otherwise goto the point just past \\stop..."
+  (interactive)
+  (let ((regexp (concat (regexp-quote TeX-esc)
+                       "\\("
+                       (ConTeXt-environment-start-name)
+                       "\\|"
+                       (ConTeXt-environment-stop-name)
+                       "\\)"
+                       ))
+       (level 1)
+       (pos))
+    ;;jump over the \start... when at the beginning of it.
+    (when (looking-at (concat (regexp-quote TeX-esc)
+                             (ConTeXt-environment-start-name)))
+      (re-search-forward regexp nil t))
+    (while (and (> level 0)
+               (re-search-forward regexp nil t)
+               (goto-char (1- (match-beginning 1)))
+               (cond ((looking-at (concat (regexp-quote TeX-esc)
+                                          (ConTeXt-environment-start-name)))
+                      (re-search-forward regexp nil t)
+                      (setq level (1+ level)))
+                     ((looking-at (concat (regexp-quote TeX-esc)
+                                          (ConTeXt-environment-stop-name)))
+                      (re-search-forward regexp nil t)
+                      (setq level (1- level))))))
+    ;; now we have to look if we want to start behind the \start... macro
+    (if inner
+       (beginning-of-line)
+      (skip-chars-forward "a-zA-Z"))))
+
+(defun ConTeXt-find-matching-start (&optional inner)
+  "Find beginning of current \\start...\\stop-Pair.
+If INNER is non-nil, go to the point just past the \\start... macro."
+  (interactive)
+  (let ((regexp (concat (regexp-quote TeX-esc)
+                       "\\("
+                       (ConTeXt-environment-start-name)
+                       "\\|"
+                       (ConTeXt-environment-stop-name)
+                       "\\)"
+                       ))
+       (level 1)
+       (pos))
+    (while (and (> level 0)
+               (re-search-backward regexp nil t)
+               (cond ((looking-at (concat (regexp-quote TeX-esc)
+                                          (ConTeXt-environment-stop-name)))
+                      (setq level (1+ level)))
+                     ((looking-at (concat (regexp-quote TeX-esc)
+                                          (ConTeXt-environment-start-name)))
+                      (setq level (1- level))))))
+    ;; now we have to look if we want to start behind the \start... macro
+    (when inner
+      ;; \startfoo can have 0 or more {} and [] pairs. I assume that
+      ;; skipping all those parens will be smart enough. It fails when
+      ;; the first part in the \start-\stop-environment is { or [, like
+      ;; in \startquotation   {\em important} \stopquotation. There is
+      ;; yet another pitfall: \startsetups SomeSetup foo bar
+      ;; \stopsetups will use SomeSetup as the argument and the
+      ;; environment
+      (skip-chars-forward "\\\\a-zA-Z")
+      (save-excursion
+       (while (progn
+                (skip-chars-forward "\t\n ")
+                (forward-comment 1)
+                (skip-chars-forward "\t\n ")
+                (looking-at "\\s\("))
+         (forward-list 1)
+         (setq pos (point))))
+      (when pos
+       (goto-char pos))
+      (unless (bolp)
+       (forward-line)))))
+
+;;; items
+
+(defun ConTeXt-insert-item ()
+  "Insert a new item."
+  (interactive "*")
+  (or (TeX-looking-at-backward "^[ \t]*")
+      (newline))
+  (TeX-insert-macro "item")
+  (indent-according-to-mode))
+
+
+;;; Macro Argument Hooks
+
+(defun ConTeXt-optional-argument-insert (arg &optional prefix)
+  "Insert ARG surrounded by square brackets."
+  (insert ConTeXt-optop)
+  (insert arg)
+  (insert ConTeXt-optcl))
+
+(defun ConTeXt-required-argument-insert (arg &optional prefix)
+  "Insert ARG surrounded by curly braces."
+  (insert TeX-grop)
+  (insert arg)
+  (insert TeX-grcl))
+
+(defun ConTeXt-argument-insert (arg optional &optional prefix)
+  "Insert ARG surrounded by curly braces.
+
+If OPTIONAL, only insert it if not empty, and then use square brackets."
+  (if optional
+      (if
+         (not (string-equal arg ""))
+         (ConTeXt-optional-argument-insert arg prefix))
+    (ConTeXt-required-argument-insert arg prefix)))
+
+(defun ConTeXt-arg-ref (optional &optional prompt definition)
+  "Prompt for a reference completing with known references."
+  (let ((ref (completing-read (TeX-argument-prompt optional prompt "ref")
+                             (LaTeX-label-list))))
+    (if (and definition (not (string-equal "" ref)))
+       (LaTeX-add-labels ref))
+    (ConTeXt-argument-insert ref optional)))
+
+(defun ConTeXt-arg-define-ref (&optional prompt)
+  "Prompt for an optional reference completing with known references."
+  (ConTeXt-arg-ref t prompt t))
+
+(defun ConTeXt-arg-setup (optional &optional prompt)
+  "Prompt for setup arguments."
+  (let ((setup (read-from-minibuffer
+               (TeX-argument-prompt optional prompt "Setup"))))
+    (ConTeXt-argument-insert setup t)))
+
+
+;; paragraph (re)-formatting
+
+(defvar ConTeXt-item-list ()
+  "List of macro's considered items.")
+
+(defvar ConTeXt-extra-paragraph-commands
+  '("crlf" "par")
+  "List of ConTeXt macros that should have their own line besides the section(-block) commands.")
+
+(defun ConTeXt-paragraph-commands-regexp ()
+  "Return a regexp matching macros that should have their own line."
+  (concat
+   (regexp-quote TeX-esc) "\\("
+   "[][]\\|"  ; display math delimitors (is this applicable to ConTeXt??)
+   (ConTeXt-environment-start-name) "\\|"
+   (ConTeXt-environment-stop-name) "\\|"
+   (mapconcat 'car ConTeXt-section-list "\\b\\|") "\\b\\|"
+   (mapconcat 'identity ConTeXt-extra-paragraph-commands "\\b\\|")
+   "\\b\\|"
+   (mapconcat 'identity ConTeXt-item-list "\\b\\|") "\\b\\)"))
+
+
+;; Outline support
+
+(defun ConTeXt-environment-full-start-name (environment)
+  "Return the ConTeXt macro name that starts ENVIRONMENT.
+It is interface aware"
+  (concat (ConTeXt-environment-start-name) environment))
+
+(defun ConTeXt-outline-regexp (&optional anywhere)
+  "Return regexp for ConTeXt section blocks and sections.
+
+If optional argument ANYWHERE is not nil, do not require that the
+header is at the start of a line."
+  (concat
+   (if anywhere "" "^")
+   "[ \t]*"
+   (regexp-quote TeX-esc)
+   "\\("
+   (mapconcat 'ConTeXt-environment-full-start-name ConTeXt-section-block-list "\\|") "\\|"
+   (mapconcat 'car ConTeXt-section-list "\\|")
+   "\\)\\b"
+   (if TeX-outline-extra
+       "\\|"
+     "")
+   (mapconcat 'car TeX-outline-extra "\\|")
+   "\\|" (ConTeXt-header-end) "\\b"
+   "\\|" (ConTeXt-trailer-start) "\\b"))
+
+(defvar ConTeXt-text "Name of ConTeXt macro that begins the text body.")
+
+(defun ConTeXt-header-end ()
+  "Default end of header marker for ConTeXt documents."
+  (concat
+   (regexp-quote TeX-esc)
+   (ConTeXt-environment-start-name)
+   ConTeXt-text))
+
+(defun ConTeXt-trailer-start ()
+  "Default start of trailer marker for ConTeXt documents."
+  (concat
+   (regexp-quote TeX-esc)
+   (ConTeXt-environment-stop-name)
+   ConTeXt-text))
+
+(defun ConTeXt-outline-offset ()
+  "Offset to add to `ConTeXt-section-list' levels to get outline level."
+  (- 4 (ConTeXt-largest-level)))
+
+(defun ConTeXt-start-environment-regexp (list)
+  "Regular expression that matches a start of all environments mentioned in LIST."
+  (concat
+   "start\\("
+   (mapconcat 'identity list "\\|")
+   "\\)\\b"))
+
+;; The top headings are \starttext, \startfrontmatter, \startbodymatter etc.
+;; \part, \chapter etc. are children of that.
+(defun ConTeXt-outline-level ()
+  "Find the level of current outline heading in an ConTeXt document."
+  (cond ((looking-at (concat (ConTeXt-header-end) "\\b")) 1)
+       ((looking-at (concat (ConTeXt-trailer-start) "\\b")) 1)
+       ((TeX-look-at TeX-outline-extra)
+        (max 1 (+ (TeX-look-at TeX-outline-extra)
+                  (ConTeXt-outline-offset))))
+       (t
+        (save-excursion
+          (skip-chars-forward " \t")
+          (forward-char 1)
+          (cond ((looking-at (ConTeXt-start-environment-regexp
+                              ConTeXt-section-block-list)) 1)
+                ((TeX-look-at ConTeXt-section-list)
+                 (max 1 (+ (TeX-look-at ConTeXt-section-list)
+                           (ConTeXt-outline-offset))))
+                (t
+                 (error "Unrecognized header")))))))
+
+
+;;; Fonts
+
+(defcustom ConTeXt-font-list '((?\C-b "{\\bf " "}")
+                          (?\C-c "{\\sc " "}")
+                          (?\C-e "{\\em " "}")
+                          (?\C-i "{\\it " "}")
+                          (?\C-r "{\\rm " "}")
+                          (?\C-s "{\\sl " "}")
+                          (?\C-t "{\\tt " "}")
+                          (?\C-d "" "" t))
+  "List of fonts used by `TeX-font'.
+
+Each entry is a list.
+The first element is the key to activate the font.
+The second element is the string to insert before point, and the third
+element is the string to insert after point.
+If the fourth and fifth element are strings, they specify the prefix and
+suffix to be used in math mode.
+An optional fourth (or sixth) element means always replace if t."
+  :group 'TeX-macro
+  :type '(repeat
+          (group
+           :value (?\C-a "" "")
+           (character :tag "Key")
+           (string :tag "Prefix")
+           (string :tag "Suffix")
+           (option (group
+                    :inline t
+                    (string :tag "Math Prefix")
+                    (string :tag "Math Suffix")))
+           (option (sexp :format "Replace\n" :value t)))))
+
+
+;; Imenu support
+
+(defun ConTeXt-outline-name ()
+  "Guess a name for the current header line."
+  (save-excursion
+    (if (re-search-forward "{\\([^\}]*\\)}" (point-at-eol) t)
+       (match-string 1)
+      (buffer-substring-no-properties (point) (point-at-eol)))))
+
+;; This imenu also includes commented out chapters. Perhaps a feature
+;; for LaTeX, not sure we want or need that for ConTeXt.
+
+(defun ConTeXt-imenu-create-index-function ()
+  "Imenu support function for ConTeXt."
+  (TeX-update-style)
+  (let (entries level (regexp (ConTeXt-outline-regexp)))
+    (goto-char (point-max))
+    (while (re-search-backward regexp nil t)
+      (let* ((name (ConTeXt-outline-name))
+            (level (make-string (1- (ConTeXt-outline-level)) ?\ ))
+            (label (concat level level name))
+            (mark (make-marker)))
+       (set-marker mark (point))
+       (set-text-properties 0 (length label) nil label)
+       (setq entries (cons (cons label mark) entries))))
+    entries))
+
+
+;; Indentation, copied from Berend's context mode.
+;; TODO: doesn't work great.
+
+(defvar ConTeXt-indent-allhanging t)
+(defvar ConTeXt-indent-arg 2)
+(defvar ConTeXt-indent-basic 2)
+(defvar ConTeXt-indent-item ConTeXt-indent-basic)
+(defvar ConTeXt-indent-item-re "\\\\\item\\>")
+
+(defvar ConTeXt-indent-syntax-table (make-syntax-table TeX-mode-syntax-table)
+  "Syntax table used while computing indentation.")
+
+(progn
+  (modify-syntax-entry ?$ "." ConTeXt-indent-syntax-table)
+  (modify-syntax-entry ?\( "." ConTeXt-indent-syntax-table)
+  (modify-syntax-entry ?\) "." ConTeXt-indent-syntax-table))
+
+(defun ConTeXt-indent-line (&optional arg)
+  (with-syntax-table ConTeXt-indent-syntax-table
+    ;; TODO: Rather than ignore $, we should try to be more clever about it.
+    (let ((indent
+          (save-excursion
+            (beginning-of-line)
+            (ConTeXt-find-indent))))
+      (if (< indent 0) (setq indent 0))
+      (if (<= (current-column) (current-indentation))
+         (indent-line-to indent)
+       (save-excursion (indent-line-to indent))))))
+
+(defun ConTeXt-find-indent (&optional virtual)
+  "Find the proper indentation of text after point.
+VIRTUAL if non-nil indicates that we're only trying to find the
+indentation in order to determine the indentation of something
+else.  There might be text before point."
+  (save-excursion
+    (skip-chars-forward " \t")
+    (or
+     ;; Trust the current indentation, if such info is applicable.
+     (and virtual (>= (current-indentation) (current-column))
+         (current-indentation))
+     ;; Put leading close-paren where the matching open brace would be.
+     (condition-case nil
+        (and (eq (char-syntax (char-after)) ?\))
+             (save-excursion
+               (skip-syntax-forward " )")
+               (backward-sexp 1)
+               (ConTeXt-find-indent 'virtual)))
+       (error nil))
+     ;; Default (maybe an argument)
+     (let ((pos (point))
+          (char (char-after))
+          (indent 0)
+          up-list-pos)
+       ;; Look for macros to be outdented
+       (cond ((looking-at (concat (regexp-quote TeX-esc)
+                                 (ConTeXt-environment-stop-name)))
+             (setq indent (- indent ConTeXt-indent-basic)))
+            ((looking-at ConTeXt-indent-item-re)
+             (setq indent (- indent ConTeXt-indent-item))))
+       ;; Find the previous point which determines our current indentation.
+       (condition-case err
+          (progn
+            (backward-sexp 1)
+            (while (> (current-column) (current-indentation))
+              (backward-sexp 1)))
+        (scan-error
+         (setq up-list-pos (nth 2 err))))
+       (cond
+       ((= (point-min) pos) 0)  ; We're really just indenting the first line.
+       ((integerp up-list-pos)
+        ;; Have to indent relative to the open-paren.
+        (goto-char up-list-pos)
+        (if (and (not ConTeXt-indent-allhanging)
+                 (> pos (progn (down-list 1)
+                               (forward-comment (point-max))
+                               (point))))
+            ;; Align with the first element after the open-paren.
+            (current-column)
+          ;; We're the first element after a hanging brace.
+          (goto-char up-list-pos)
+          (+ indent ConTeXt-indent-basic (ConTeXt-find-indent 'virtual))))
+       ;; We're now at the "beginning" of a line.
+       ((not (and (not virtual) (eq (char-after) ?\\)))
+        ;; Nothing particular here: just keep the same indentation.
+        (+ indent (current-column)))
+       ;; We're now looking at an item.
+       ((looking-at ConTeXt-indent-item-re)
+        ;; Indenting relative to an item, have to re-add the outdenting.
+        (+ indent (current-column) ConTeXt-indent-item))
+       ;; We're looking at an environment starter.
+       ((and (looking-at (concat (regexp-quote TeX-esc)
+                                 (ConTeXt-environment-start-name)))
+             (not (looking-at (concat (regexp-quote TeX-esc)
+                                      (ConTeXt-environment-start-name)
+                                      ConTeXt-text)))) ; other environments?
+        (+ indent (current-column) ConTeXt-indent-basic))
+       (t
+        (let ((col (current-column)))
+          (if (not (and char (eq (char-syntax char) ?\()))
+              ;; If the first char was not an open-paren, there's
+              ;; a risk that this is really not an argument to the
+              ;; macro at all.
+              (+ indent col)
+            (forward-sexp 1)
+            (if (< (line-end-position)
+                   (save-excursion (forward-comment (point-max))
+                                   (point)))
+                ;; we're indenting the first argument.
+                (min (current-column) (+ ConTeXt-indent-arg col))
+              (skip-syntax-forward " ")
+              (current-column))))))))))
+
+
+;; XML inside ConTeXt support
+
+(defun ConTeXt-last-unended-start-xml ()
+  "Leave point at the beginning of the last `tag' that is unstopped."
+  (while (and (re-search-backward "<[_A-Za-z][-:._A-Za-z0-9]*\\([ \t\r\n]\\|[_A-Za-z][-:._A-Za-z0-9]*\=\"[^\"]*\"\\)*>\\|</[_A-Za-z][-:_A-Za-z0-9]*>")
+             (looking-at "</[_A-Za-z][-:._A-Za-z0-9]*>"))
+    (ConTeXt-last-unended-start-xml)))
+
+(defun ConTeXt-close-xml-tag ()
+  "Create an </...> to match the last unclosed <...>.  Not fool-proof."
+  (interactive "*")
+  (let ((new-line-needed (bolp)) text indentation)
+    (save-excursion
+      (condition-case nil
+         (ConTeXt-last-unended-start-xml)
+       (error (error "Couldn't find unended XML tag")))
+      (setq indentation (current-column))
+      (re-search-forward "<\\([_A-Za-z][-:._A-Za-z0-9]*\\)")
+      (setq text (buffer-substring (match-beginning 1) (match-end 1))))
+    (indent-to indentation)
+    (insert "</" text ">")
+    (if new-line-needed (insert ?\n))))
+
+
+;; Key bindings
+
+(defvar ConTeXt-mode-map
+  (let ((map (make-sparse-keymap)))
+    (set-keymap-parent map TeX-mode-map)
+
+    (define-key map "\e\C-a"  'ConTeXt-find-matching-start)
+    (define-key map "\e\C-e"  'ConTeXt-find-matching-stop)
+    ;; likely to change in the future
+    (define-key map "\C-c!"    'ConTeXt-work-on-environment)
+    (define-key map "\C-c\C-e" 'ConTeXt-environment)
+    (define-key map "\C-c\n"   'ConTeXt-insert-item)
+    (or (key-binding "\e\r")
+       (define-key map "\e\r"    'ConTeXt-insert-item)) ;*** Alias
+    (define-key map "\C-c]" 'ConTeXt-close-environment)
+    (define-key map "\C-c\C-s" 'ConTeXt-section)
+    ;; XML in ConTeXt support
+    (define-key map "\C-c/" 'ConTeXt-close-xml-tag)
+    map)
+  "Keymap used in `ConTeXt-mode'.")
+
+
+;;; Menu building
+
+;; functions to create menu entries
+
+;; ConTeXt \start... \stop... pairs
+;; (Choose a different name than the one in LaTeX mode.  Otherwise the
+;; contents of the "Insert Environment" and "Change Environment" menus
+;; will not be updated correctly upon loading and switching between
+;; LaTeX and ConTeXt files.  AFAICS this is due to a bug in
+;; easymenu.el not returning the correct keymap when
+;; `easy-menu-change' (and therefore `easy-menu-get-map') is called.
+;; It just sees an entry with a matching name and returns this first
+;; match.)
+(defvar ConTeXt-environment-menu-name "Insert Environment   (C-c C-e)")
+
+(defun ConTeXt-environment-menu-entry (entry)
+  "Create an entry for the environment menu."
+  (vector (car entry) (list 'ConTeXt-environment-menu (car entry)) t))
+
+(defvar ConTeXt-environment-modify-menu-name "Change Environment   (C-u C-c C-e)")
+
+(defun ConTeXt-environment-modify-menu-entry (entry)
+  "Create an entry for the change environment menu."
+  (vector (car entry) (list 'ConTeXt-modify-environment (car entry)) t))
+
+;; ConTeXt define macros
+(defvar ConTeXt-define-menu-name "Define")
+
+(defun ConTeXt-define-menu-entry (entry)
+  "Create an entry for the define menu."
+  (vector entry (list 'ConTeXt-define-menu entry)))
+
+(defun ConTeXt-define-menu (define)
+  "Insert DEFINE from menu."
+  (ConTeXt-insert-define define))
+
+;; ConTeXt setup macros
+(defvar ConTeXt-setup-menu-name "Setup")
+
+(defun ConTeXt-setup-menu-entry (entry)
+  "Create an entry for the setup menu."
+  (vector entry (list 'ConTeXt-setup-menu entry)))
+
+(defun ConTeXt-setup-menu (setup)
+  "Insert SETUP from menu."
+  (ConTeXt-insert-setup setup))
+
+;; ConTeXt referencing macros
+(defvar ConTeXt-referencing-menu-name "Referencing")
+
+(defun ConTeXt-referencing-menu-entry (entry)
+  "Create an entry for the referencing menu."
+  (vector entry (list 'ConTeXt-referencing-menu entry)))
+
+(defun ConTeXt-referencing-menu (referencing)
+  "Insert REFERENCING from menu."
+  (ConTeXt-insert-referencing referencing))
+
+;; ConTeXt other macros
+(defvar ConTeXt-other-macro-menu-name "Other macro")
+
+(defun ConTeXt-other-macro-menu-entry (entry)
+  "Create an entry for the other macro menu."
+  (vector entry (list 'ConTeXt-other-macro-menu entry)))
+
+(defun ConTeXt-other-macro-menu (other-macro)
+  "Insert OTHER MACRO from menu."
+  (ConTeXt-insert-other-macro other-macro))
+
+
+;; meta-structure project structure menu entries
+
+(defvar ConTeXt-project-structure-menu-name "Project Structure")
+
+(defun ConTeXt-project-structure-menu (project-structure)
+  "Insert project structure from menu."
+  (ConTeXt-project-structure
+   (let ((l ConTeXt-project-structure-list))
+     (- (length l) (length (member project-structure l))))))
+
+(defun ConTeXt-project-structure-menu-entry (entry)
+  "Create an ENTRY for the project structure menu."
+  (vector entry (list 'ConTeXt-project-structure-menu entry)))
+
+
+;; meta-structure section blocks menu entries
+
+(defvar ConTeXt-section-block-menu-name "Section Block")
+
+(defun ConTeXt-section-block-menu (section-block)
+  "Insert section block from menu."
+  (ConTeXt-section-block section-block))
+
+(defun ConTeXt-section-block-menu-entry (entry)
+  "Create an ENTRY for the section block menu."
+  (vector entry (list 'ConTeXt-section-block-menu entry)))
+
+
+;; section menu entries
+
+(defvar ConTeXt-section-menu-name "Section  (C-c C-s)")
+
+(defun ConTeXt-section-enable-symbol (level)
+  "Symbol used to enable section LEVEL in the menu bar."
+  (intern (concat "ConTeXt-section-" (int-to-string level) "-enable")))
+
+(defun ConTeXt-section-enable (entry)
+  "Enable or disable section ENTRY from `ConTeXt-section-list'."
+  (let ((level (nth 1 entry)))
+    (set (ConTeXt-section-enable-symbol level)
+        (>= level ConTeXt-largest-level))))
+
+(defun ConTeXt-section-menu (level)
+  "Insert section from menu."
+  (let ((ConTeXt-section-hook (delq 'ConTeXt-section-heading
+                                   (copy-sequence ConTeXt-section-hook))))
+    (ConTeXt-section level)))
+
+(defun ConTeXt-section-menu-entry (entry)
+  "Create an ENTRY for the section menu."
+  (let ((enable (ConTeXt-section-enable-symbol (nth 1 entry))))
+    (set enable t)
+    (vector (car entry) (list 'ConTeXt-section-menu (nth 1 entry)) enable)))
+
+
+;; etexshow support
+
+(defun ConTeXt-etexshow ()
+  "Call etexshow, if available, to show the definition of a ConText macro."
+  (interactive)
+  (if (fboundp 'etexshow)
+      (let ()
+       (require 'etexshow)
+       (funcall (symbol-function 'etexshow-cmd)))
+    (error "etexshow is not installed.  Get it from http://levana.de/emacs/")))
+
+;; menu itself
+
+(easy-menu-define ConTeXt-mode-command-menu
+  ConTeXt-mode-map
+  "Command menu used in ConTeXt mode."
+  (TeX-mode-specific-command-menu 'context-mode))
+
+;; it seems the menu is evaluated at compile/load-time
+;; we don't have ConTeXt-current-interface at that time
+;; so make sure to do updates based on that variable in
+;; ConTeXt-menu-update
+(easy-menu-define ConTeXt-mode-menu
+  ConTeXt-mode-map
+  "Menu used in ConTeXt mode."
+  (TeX-menu-with-help
+   `("ConTeXt"
+     (,ConTeXt-project-structure-menu-name)
+     (,ConTeXt-section-block-menu-name)
+     (,ConTeXt-section-menu-name)
+     ["Add Table of Contents to Emacs Menu" (imenu-add-to-menubar "TOC") t]
+     "-"
+     ["Macro ..." TeX-insert-macro
+      :help "Insert a macro and possibly arguments"]
+     ["Complete" TeX-complete-symbol
+      :help "Complete the current macro or environment name"]
+     ["Show ConTeXt Macro Definition" ConTeXt-etexshow]
+     "-"
+     (,ConTeXt-environment-menu-name)
+     (,ConTeXt-environment-modify-menu-name)
+     ["Item" ConTeXt-insert-item
+      :help "Insert a new \\item into current environment"]
+     (,ConTeXt-define-menu-name)
+     (,ConTeXt-setup-menu-name)
+     (,ConTeXt-other-macro-menu-name)
+     "-"
+     ("Insert Font"
+      ["Emphasize"  (TeX-font nil ?\C-e) :keys "C-c C-f C-e"]
+      ["Bold"       (TeX-font nil ?\C-b) :keys "C-c C-f C-b"]
+      ["Typewriter" (TeX-font nil ?\C-t) :keys "C-c C-f C-t"]
+      ["Small Caps" (TeX-font nil ?\C-c) :keys "C-c C-f C-c"]
+      ["Sans Serif" (TeX-font nil ?\C-f) :keys "C-c C-f C-f"]
+      ["Italic"     (TeX-font nil ?\C-i) :keys "C-c C-f C-i"]
+      ["Slanted"    (TeX-font nil ?\C-s) :keys "C-c C-f C-s"]
+      ["Roman"      (TeX-font nil ?\C-r) :keys "C-c C-f C-r"]
+      ["Calligraphic" (TeX-font nil ?\C-a) :keys "C-c C-f C-a"])
+     ("Replace Font"
+      ["Emphasize"  (TeX-font t ?\C-e) :keys "C-u C-c C-f C-e"]
+      ["Bold"       (TeX-font t ?\C-b) :keys "C-u C-c C-f C-b"]
+      ["Typewriter" (TeX-font t ?\C-t) :keys "C-u C-c C-f C-t"]
+      ["Small Caps" (TeX-font t ?\C-c) :keys "C-u C-c C-f C-c"]
+      ["Sans Serif" (TeX-font t ?\C-f) :keys "C-u C-c C-f C-f"]
+      ["Italic"     (TeX-font t ?\C-i) :keys "C-u C-c C-f C-i"]
+      ["Slanted"    (TeX-font t ?\C-s) :keys "C-u C-c C-f C-s"]
+      ["Roman"      (TeX-font t ?\C-r) :keys "C-u C-c C-f C-r"]
+      ["Calligraphic" (TeX-font t ?\C-a) :keys "C-u C-c C-f C-a"])
+     ["Delete Font" (TeX-font t ?\C-d) :keys "C-c C-f C-d"]
+     "-"
+     ["Comment or Uncomment Region"
+      TeX-comment-or-uncomment-region
+      :help "Make the selected region outcommented or active again"]
+     ["Comment or Uncomment Paragraph"
+      TeX-comment-or-uncomment-paragraph
+      :help "Make the current paragraph outcommented or active again"]
+     ,TeX-fold-menu
+     "-" . ,TeX-common-menu-entries)))
+
+(defun ConTeXt-menu-update (&optional menu)
+  "Update entries on AUCTeX menu."
+  (or (not (memq major-mode '(context-mode)))
+      (null ConTeXt-menu-changed)
+      (not (fboundp 'easy-menu-change))
+      (progn
+       (TeX-update-style)
+       (setq ConTeXt-menu-changed nil)
+       (message "Updating section menu...")
+       (mapc 'ConTeXt-section-enable ConTeXt-section-list)
+       (message "Updating environment menu...")
+       (easy-menu-change '("ConTeXt") ConTeXt-environment-menu-name
+                         (LaTeX-split-long-menu
+                          (mapcar 'ConTeXt-environment-menu-entry
+                                  (ConTeXt-environment-list))))
+       (message "Updating modify environment menu...")
+       (easy-menu-change '("ConTeXt") ConTeXt-environment-modify-menu-name
+                         (LaTeX-split-long-menu
+                          (mapcar 'ConTeXt-environment-modify-menu-entry
+                                  (ConTeXt-environment-list))))
+       (message "Updating define menu...")
+       (easy-menu-change '("ConTeXt") ConTeXt-define-menu-name
+                         (LaTeX-split-long-menu
+                          (mapcar 'ConTeXt-define-menu-entry
+                                  ConTeXt-define-list)))
+       (message "Updating setup menu...")
+       (easy-menu-change '("ConTeXt") ConTeXt-setup-menu-name
+                         (LaTeX-split-long-menu
+                          (mapcar 'ConTeXt-setup-menu-entry
+                                  ConTeXt-setup-list)))
+       (message "Updating referencing menu...")
+       (easy-menu-change '("ConTeXt") ConTeXt-referencing-menu-name
+                         (LaTeX-split-long-menu
+                          (mapcar 'ConTeXt-referencing-menu-entry
+                                  ConTeXt-referencing-list)))
+       (message "Updating other macro's menu...")
+       (easy-menu-change '("ConTeXt") ConTeXt-other-macro-menu-name
+                         (LaTeX-split-long-menu
+                          (mapcar 'ConTeXt-other-macro-menu-entry
+                                  ConTeXt-other-macro-list)))
+       (message "Updating project structure menu...")
+       (easy-menu-change '("ConTeXt") ConTeXt-project-structure-menu-name
+                         (LaTeX-split-long-menu
+                          (mapcar 'ConTeXt-project-structure-menu-entry
+                                  ConTeXt-project-structure-list)))
+       (message "Updating section block menu...")
+       (easy-menu-change '("ConTeXt") ConTeXt-section-block-menu-name
+                         (LaTeX-split-long-menu
+                          (mapcar 'ConTeXt-section-block-menu-entry
+                                  ConTeXt-section-block-list)))
+       (message "Updating section menu...")
+       (easy-menu-change '("ConTeXt") ConTeXt-section-menu-name
+                         (LaTeX-split-long-menu
+                          (mapcar 'ConTeXt-section-menu-entry
+                                  ConTeXt-section-list)))
+       (message "Updating...done")
+       (and menu (easy-menu-return-item ConTeXt-mode-menu menu))
+       )))
+
+;;; Option expander
+
+(defvar ConTeXt-texexec-option-nonstop "--nonstop "
+  "Command line option for texexec to use nonstopmode.")
+
+(defun ConTeXt-expand-options ()
+  "Expand options for texexec command."
+  (concat
+   (let ((engine (nth 4 (assq TeX-engine (TeX-engine-alist)))))
+     (when engine
+       (format "--engine=%s " engine)))
+   (unless (eq ConTeXt-current-interface "en")
+     (format "--interface=%s " ConTeXt-current-interface))
+   (when TeX-source-correlate-mode
+     (format "--passon=\"%s\" "
+            (if (eq TeX-source-correlate-method-active 'synctex)
+                TeX-synctex-tex-flags
+              TeX-source-specials-tex-flags)))
+   (unless TeX-interactive-mode
+     ConTeXt-texexec-option-nonstop)))
+
+;;; Mode
+
+;; ConTeXt variables that are interface aware
+;; They are mapped to interface specific variables
+
+(defvar ConTeXt-language-variable-list
+  '(ConTeXt-define-list ConTeXt-setup-list ConTeXt-referencing-list ConTeXt-other-macro-list
+          ConTeXt-project-structure-list
+          ConTeXt-section-block-list ConTeXt-section-list
+                      ConTeXt-text ConTeXt-item-list))
+
+(defcustom ConTeXt-clean-intermediate-suffixes
+  ;; See *suffixes in texutil.pl.
+  '("\\.tui" "\\.tup" "\\.ted" "\\.tes" "\\.top" "\\.log" "\\.tmp" "\\.run"
+    "\\.bck" "\\.rlg" "\\.mpt" "\\.mpx" "\\.mpd" "\\.mpo" "\\.tuo" "\\.tub"
+    "\\.top" "-mpgraph\\.mp" "-mpgraph\\.mpd" "-mpgraph\\.mpo" "-mpgraph\\.mpy"
+    "-mprun\\.mp" "-mprun\\.mpd" "-mprun\\.mpo" "-mprun\\.mpy")
+  "List of regexps matching suffixes of files to be deleted.
+The regexps will be anchored at the end of the file name to be matched,
+i.e. you do _not_ have to cater for this yourself by adding \\\\' or $."
+  :type '(repeat regexp)
+  :group 'TeX-command)
+
+(defcustom ConTeXt-clean-output-suffixes
+  '("\\.dvi" "\\.pdf" "\\.ps")
+  "List of regexps matching suffixes of files to be deleted.
+The regexps will be anchored at the end of the file name to be matched,
+i.e. you do _not_ have to cater for this yourself by adding \\\\' or $."
+  :type '(repeat regexp)
+  :group 'TeX-command)
+
+(defun ConTeXt-mode-common-initialization ()
+  "Initialization code that is common for all ConTeXt interfaces."
+  ;; `plain-TeX-common-initialization' kills all local variables, but
+  ;; we need to keep ConTeXt-current-interface, so save and restore
+  ;; it.
+  (let (save-ConTeXt-current-interface)
+    (setq save-ConTeXt-current-interface ConTeXt-current-interface)
+    (plain-TeX-common-initialization)
+    (setq ConTeXt-current-interface save-ConTeXt-current-interface))
+  (setq major-mode 'context-mode)
+
+  ;; Make language specific variables buffer local
+  (dolist (symbol ConTeXt-language-variable-list)
+    (make-variable-buffer-local symbol))
+
+  (require (intern (concat "context-" ConTeXt-current-interface)))
+  (dolist (symbol ConTeXt-language-variable-list)
+    (set symbol (symbol-value (intern (concat (symbol-name symbol) "-"
+                                             ConTeXt-current-interface)))))
+
+
+  ;; What's the deepest level at we can collapse a document?
+  ;; set only if user has not set it. Need to be set before menu is created.
+  ;; level 2 is "section"
+  (or ConTeXt-largest-level
+      (setq ConTeXt-largest-level 2))
+
+  ;; keybindings
+  (use-local-map ConTeXt-mode-map)
+
+  ;; Indenting
+  (set (make-local-variable 'indent-line-function) 'ConTeXt-indent-line)
+  (set (make-local-variable 'fill-indent-according-to-mode) t)
+
+  ;; Paragraph formatting
+  (set (make-local-variable 'LaTeX-syntactic-comments) nil)
+  (set (make-local-variable 'LaTeX-paragraph-commands-regexp)
+       (ConTeXt-paragraph-commands-regexp))
+  (set (make-local-variable 'paragraph-ignore-fill-prefix) t)
+  (set (make-local-variable 'fill-paragraph-function) 'LaTeX-fill-paragraph)
+  (set (make-local-variable 'adaptive-fill-mode) nil)
+  (setq paragraph-start
+       (concat
+        "[ \t]*\\("
+        (ConTeXt-paragraph-commands-regexp) "\\|"
+        "\\$\\$\\|" ; Plain TeX display math
+        "$\\)"))
+  (setq paragraph-separate
+       (concat
+        "[ \t]*\\("
+        "\\$\\$" ; Plain TeX display math
+        "\\|$\\)"))
+
+  ;; Keybindings and menu
+  (use-local-map ConTeXt-mode-map)
+  (easy-menu-add ConTeXt-mode-menu ConTeXt-mode-map)
+  (easy-menu-add ConTeXt-mode-command-menu ConTeXt-mode-map)
+  (setq ConTeXt-menu-changed t)
+
+  (if (= emacs-major-version 20)
+      (make-local-hook 'activate-menubar-hook))
+  (add-hook 'activate-menubar-hook 'ConTeXt-menu-update nil t)
+
+  ;; Outline support
+  (require 'outline)
+  (set (make-local-variable 'outline-level) 'ConTeXt-outline-level)
+  (set (make-local-variable 'outline-regexp) (ConTeXt-outline-regexp t))
+  ;;(make-local-variable 'outline-heading-end-regexp)
+  (setq TeX-header-end (ConTeXt-header-end)
+       TeX-trailer-start (ConTeXt-trailer-start))
+
+  ;; font switch support
+  (set (make-local-variable 'TeX-font-list) ConTeXt-font-list)
+
+  ;; imenu support
+  (set (make-local-variable 'imenu-create-index-function)
+       'ConTeXt-imenu-create-index-function)
+
+  ;; run hooks
+  (setq TeX-command-default "ConTeXt")
+  (setq TeX-sentinel-default-function 'TeX-ConTeXt-sentinel)
+  (TeX-run-mode-hooks 'text-mode-hook 'TeX-mode-hook 'ConTeXt-mode-hook))
+
+(defun context-guess-current-interface ()
+  "Guess what ConTeXt interface the current buffer is using."
+  (interactive)
+  (save-excursion
+    (goto-char (point-min))
+    (setq ConTeXt-current-interface
+         (cond ((re-search-forward "%.*?interface=en" (+ 512 (point)) t)
+                "en")
+               ((re-search-forward "%.*?interface=nl" (+ 512 (point)) t)
+                "nl")
+               ((re-search-forward "\\\\starttext" (+ 1024 (point)) t)
+                "en")
+               ((re-search-forward "\\\\starttekst" (+ 1024 (point)) t)
+                "nl")
+               (t
+                ConTeXt-default-interface)))))
+
+;;;###autoload
+(defalias 'ConTeXt-mode 'context-mode)
+
+;;;###autoload
+(defun context-mode ()
+  "Major mode in AUCTeX for editing ConTeXt files.
+
+Special commands:
+\\{ConTeXt-mode-map}
+
+Entering `context-mode' calls the value of `text-mode-hook',
+then the value of `TeX-mode-hook', and then the value
+of context-mode-hook."
+  (interactive)
+  (context-guess-current-interface)
+  (require (intern (concat "context-" ConTeXt-current-interface)))
+  (funcall (intern (concat "context-" ConTeXt-current-interface "-mode"))))
+
+(provide 'context)
+
+;;; context.el ends here
diff --git a/packages/auctex/dir b/packages/auctex/dir
new file mode 100644 (file)
index 0000000..0b85f60
--- /dev/null
@@ -0,0 +1,25 @@
+This is the file .../info/dir, which contains the
+topmost node of the Info hierarchy, called (dir)Top.
+The first time you invoke Info you start off looking at this node.
+\1f
+File: dir,     Node: Top       This is the top of the INFO tree
+
+  This (the Directory node) gives a menu of major topics.
+  Typing "q" exits, "?" lists all Info commands, "d" returns here,
+  "h" gives a primer for first-timers,
+  "mEmacs<Return>" visits the Emacs manual, etc.
+
+  In Emacs, you can click mouse button 2 on a menu item or cross reference
+  to select it.
+
+* Menu:
+
+Emacs
+* AUCTeX: (auctex).             A sophisticated TeX environment for Emacs.
+* preview-latex: (preview-latex).
+                                Preview LaTeX fragments in Emacs
+
+TeX
+* AUCTeX: (auctex).             A sophisticated TeX environment for Emacs.
+* preview-latex: (preview-latex).
+                                Preview LaTeX fragments in Emacs
diff --git a/packages/auctex/doc/auctex.texi b/packages/auctex/doc/auctex.texi
new file mode 100644 (file)
index 0000000..848cf8f
--- /dev/null
@@ -0,0 +1,4257 @@
+\input texinfo
+@comment %**start of header
+@setfilename auctex.info
+@include version.texi
+@settitle AUCTeX @value{VERSION}
+@c footnotestyle separate
+@c paragraphindent 2
+@comment %**end of header
+@include macros.texi
+@copying
+This manual is for @AUCTeX{}
+(version @value{VERSION} from @value{UPDATED}),
+a sophisticated TeX environment for Emacs.
+
+Copyright @copyright{} 1992, 1993, 1994, 1995, 2001, 2002, 2004, 2005,
+2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+
+@quotation
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, no Front-Cover Texts and no Back-Cover Texts.  A
+copy of the license is included in the section entitled ``GNU Free
+Documentation License.''
+@end quotation
+@end copying
+
+@dircategory Emacs
+@direntry
+* AUCTeX: (auctex).     A sophisticated TeX environment for Emacs.
+@end direntry
+@dircategory TeX
+@direntry
+* AUCTeX: (auctex).     A sophisticated TeX environment for Emacs.
+@end direntry
+
+@iftex
+@tolerance 10000 @emergencystretch 3em
+@end iftex
+
+@finalout
+@titlepage
+@title @AUCTeX{}
+@subtitle A sophisticated @TeX{} environment for Emacs
+@subtitle Version @value{VERSION}, @value{UPDATED}
+@author Kresten Krab Thorup
+@author Per Abrahamsen
+@author David Kastrup and others
+@page
+@vskip 0pt plus 1filll
+@insertcopying
+@end titlepage
+
+@c Use @ifinfo _and_ @ifhtml here because Texinfo 3 cannot cope with
+@c @ifnottex around a top node.
+@ifinfo
+@node top
+@top @AUCTeX{}
+
+This manual may be copied under the conditions spelled out in
+@ref{Copying this Manual}.
+
+@end ifinfo
+@ifhtml
+@node top
+@top @AUCTeX{}
+@insertcopying
+@end ifhtml
+
+@contents
+
+@iftex
+@unnumbered Executive Summary
+@end iftex
+
+@AUCTeX{} is an integrated environment for editing @LaTeX{}, @ConTeXt{},
+doc@TeX{}, Texinfo, and @TeX{} files.
+
+Although @AUCTeX{} contains a large number of features, there are no
+reasons to despair.  You can continue to write @TeX{} and @LaTeX{}
+documents the way you are used to, and only start using the multiple
+features in small steps.  @AUCTeX{} is not monolithic, each feature
+described in this manual is useful by itself, but together they provide
+an environment where you will make very few @LaTeX{} errors, and makes it
+easy to find the errors that may slip through anyway.
+
+It is a good idea to make a printout of @AUCTeX{}'s reference card
+@file{tex-ref.tex} or one of its typeset versions.
+
+If you want to make @AUCTeX{} aware of style files and multi-file
+documents right away, insert the following in your @file{.emacs} file.
+
+@lisp
+(setq TeX-auto-save t)
+(setq TeX-parse-self t)
+(setq-default TeX-master nil)
+@end lisp
+
+Another thing you should enable is Ref@TeX{}, a comprehensive solution
+for managing cross references, bibliographies, indices, document
+navigation and a few other things.  (@pxref{Installation,,,reftex,The
+Ref@TeX{} manual})
+
+For detailed information about the @previewlatex{} subsystem of
+@AUCTeX{}, see @ref{Top,,Introduction,preview-latex,The @previewlatex{}
+Manual}.
+
+There is a mailing list for general discussion about @AUCTeX{}: write a
+mail with ``subscribe'' in the subject to
+@email{auctex-request@@gnu.org} to join it.  Send contributions to
+@email{auctex@@gnu.org}.
+
+Bug reports should go to @email{bug-auctex@@gnu.org}, suggestions for
+new features, and pleas for help should go to either
+@email{auctex-devel@@gnu.org} (the @AUCTeX{} developers), or to
+@email{auctex@@gnu.org} if they might have general interest.  Please use
+the command @kbd{M-x TeX-submit-bug-report RET} to report bugs if
+possible.  You can subscribe to a low-volume announcement list by
+sending ``subscribe'' in the subject of a mail to
+@email{info-auctex-request@@gnu.org}.
+
+@menu
+* Copying::                     Copying
+* Introduction::                Introduction to @AUCTeX{}
+* Editing::                     Editing the Document Source
+* Display::                     Controlling Screen Display
+* Processing::                  Starting Processors, Viewers and Other Programs
+* Customization::               Customization and Extension
+* Appendices::                  Copying, Changes, Development, FAQ
+* Indices::                     Indices
+
+@detailmenu
+ --- The Detailed Node Listing ---
+
+Introduction
+
+* Summary::                     Overview of @AUCTeX{}
+* Installation::                Installing @AUCTeX{}
+* Quick Start::                 Quick Start
+
+Editing the Document Source
+
+* Quotes::                      Inserting double quotes
+* Font Specifiers::             Inserting Font Specifiers
+* Sectioning::                  Inserting chapters, sections, etc.
+* Environments::                Inserting Environment Templates
+* Mathematics::                 Entering Mathematics
+* Completion::                  Completion of macros
+* Commenting::                  Commenting text
+* Indenting::                   Reflecting syntactic constructs with whitespace
+* Filling::                     Automatic and manual line breaking
+
+Inserting Environment Templates
+
+* Equations::                   Equations
+* Floats::                      Floats
+* Itemize-like::                Itemize-like Environments
+* Tabular-like::                Tabular-like Environments
+* Customizing Environments::    Customizing Environments
+
+Controlling Screen Display
+
+* Font Locking::                Font Locking
+* Folding::                     Folding Macros and Environments
+* Outline::                     Outlining the Document
+
+Font Locking
+
+* Fontification of macros::     Fontification of macros
+* Fontification of quotes::     Fontification of quotes
+* Fontification of math::       Fontification of math constructs
+* Verbatim content::            Verbatim macros and environments
+* Faces::                       Faces used by font-latex
+
+Starting Processors, Viewers and Other Programs
+
+* Commands::                    Invoking external commands.
+* Viewing::                     Invoking external viewers.
+* Debugging::                   Debugging @TeX{} and @LaTeX{} output.
+* Checking::                    Checking the document.
+* Control::                     Controlling the processes.
+* Cleaning::                    Cleaning intermediate and output files.
+* Documentation::               Documentation about macros and packages.
+
+Viewing the Formatted Output
+
+* Starting Viewers::            Starting viewers
+* I/O Correlation::             Forward and inverse search
+
+Customization and Extension
+
+* Multifile::                   Multifile Documents
+* Parsing Files::               Automatic Parsing of @TeX{} Files
+* Internationalization::        Language Support
+* Automatic::                   Automatic Customization
+* Style Files::                 Writing Your Own Style Support
+
+Language Support
+
+* European::                    Using @AUCTeX{} with European Languages
+* Japanese::                    Using @AUCTeX{} with Japanese
+
+Automatic Customization
+
+* Automatic Global::            Automatic Customization for the Site
+* Automatic Private::           Automatic Customization for a User
+* Automatic Local::             Automatic Customization for a Directory
+
+Writing Your Own Style Support
+
+* Simple Style::                A Simple Style File
+* Adding Macros::               Adding Support for Macros
+* Adding Environments::         Adding Support for Environments
+* Adding Other::                Adding Other Information
+* Hacking the Parser::          Automatic Extraction of New Things
+
+Copying, Changes, Development, FAQ
+
+* Copying this Manual::         
+* Changes::                     
+* Development::                 
+* FAQ::                         
+
+Copying this Manual
+
+* GNU Free Documentation License:: License for copying this manual.
+
+Indices
+
+* Key Index::                   
+* Function Index::              
+* Variable Index::              
+* Concept Index::               
+
+@end detailmenu
+@end menu
+
+@node Copying
+@unnumbered Copying
+@cindex Copying
+@cindex Copyright
+@cindex GPL
+@cindex General Public License
+@cindex License
+@cindex Free
+@cindex Free software
+@cindex Distribution
+@cindex Right
+@cindex Warranty
+
+@c This text adapted from the Texinfo 2.16 distribution.
+
+@AUCTeX{} primarily consists of Lisp files for Emacs (and XEmacs), but
+there are also installation scripts and files and @TeX{} support files.
+All of those are @dfn{free}; this means that everyone is free to use
+them and free to redistribute them on a free basis.  The files of
+@AUCTeX{} are not in the public domain; they are copyrighted and there
+are restrictions on their distribution, but these restrictions are
+designed to permit everything that a good cooperating citizen would want
+to do.  What is not allowed is to try to prevent others from further
+sharing any version of these programs that they might get from you.
+
+Specifically, we want to make sure that you have the right to give away
+copies of the files that constitute @AUCTeX{}, that you receive source
+code or else can get it if you want it, that you can change these files
+or use pieces of them in new free programs, and that you know you can do
+these things.
+
+To make sure that everyone has such rights, we have to forbid you to
+deprive anyone else of these rights.  For example, if you distribute
+copies of parts of @AUCTeX{}, you must give the recipients all the
+rights that you have.  You must make sure that they, too, receive or can
+get the source code.  And you must tell them their rights.
+
+Also, for our own protection, we must make certain that everyone finds
+out that there is no warranty for @AUCTeX{}.  If any parts are modified
+by someone else and passed on, we want their recipients to know that
+what they have is not what we distributed, so that any problems
+introduced by others will not reflect on our reputation.
+
+The precise conditions of the licenses for the files currently being
+distributed as part of @AUCTeX{} are found in the General Public
+Licenses that accompany them.  This manual specifically is covered by
+the GNU Free Documentation License (@pxref{Copying this Manual}).
+
+@node Introduction
+@chapter Introduction
+
+@menu
+* Summary::                     Overview of @AUCTeX{}
+* Installation::                Installing @AUCTeX{}
+* Quick Start::                 Quick Start
+@end menu
+
+@lowersections
+@include intro.texi
+
+@include install.texi
+
+@include quickstart.texi
+@raisesections
+
+@node Editing
+@chapter Editing the Document Source
+
+The most commonly used commands/macros of @AUCTeX{} are those which
+simply insert templates for often used @TeX{}, @LaTeX{}, or @ConTeXt{}
+constructs, like font changes, handling of environments, etc.  These
+features are very simple, and easy to learn, and help you avoid mistakes
+like mismatched braces, or @samp{\begin@{@}}-@samp{\end@{@}} pairs.
+
+Apart from that this chapter contains a description of some features for
+entering more specialized sorts of text, for formatting the source by
+indenting and filling and for navigating through the document.
+
+@menu
+* Quotes::                      Inserting double quotes
+* Font Specifiers::             Inserting Font Specifiers
+* Sectioning::                  Inserting chapters, sections, etc.
+* Environments::                Inserting Environment Templates
+* Mathematics::                 Entering Mathematics
+* Completion::                  Completion of macros
+* Commenting::                  Commenting text
+* Indenting::                   Reflecting syntactic constructs with whitespace
+* Filling::                     Automatic and manual line breaking
+@end menu
+
+@node Quotes
+@section Insertion of Quotes, Dollars, and Braces
+
+@cindex Quotes
+@cindex Double quotes
+@cindex Braces
+@cindex Brackets
+@cindex Dollars
+@cindex Math mode delimiters
+@cindex Matching dollar signs
+@cindex Display math mode
+
+@subheading Quotation Marks
+
+In @TeX{}, literal double quotes @samp{"like this"} are seldom used,
+instead two single quotes are used @samp{``like this''}.  To help you
+insert these efficiently, @AUCTeX{} allows you to continue to press
+@kbd{"} to insert two single quotes.  To get a literal double quote,
+press @kbd{"} twice.
+
+@deffn Command TeX-insert-quote @var{count}
+@kindex "
+(@kbd{"}) Insert the appropriate quote marks for @TeX{}.
+
+Inserts the value of @code{TeX-open-quote} (normally @samp{``}) or
+@code{TeX-close-quote} (normally @samp{''}) depending on the context.
+With prefix argument, always inserts @samp{"} characters.
+@end deffn
+
+@defopt TeX-open-quote
+String inserted by typing @kbd{"} to open a quotation.
+(@xref{European}, for language-specific quotation mark insertion.)
+@end defopt
+
+@defopt TeX-close-quote
+String inserted by typing @kbd{"} to close a quotation.
+(@xref{European}, for language-specific quotation mark insertion.)
+@end defopt
+
+@defopt TeX-quote-after-quote
+Determines the behavior of @kbd{"}.  If it is non-nil, typing @kbd{"}
+will insert a literal double quote.  The respective values of
+@code{TeX-open-quote} and @code{TeX-close-quote} will be inserted
+after typing @kbd{"} once again.
+@end defopt
+
+The @samp{babel} package provides special support for the requirements
+of typesetting quotation marks in many different languages.  If you use
+this package, either directly or by loading a language-specific style
+file, you should also use the special commands for quote insertion
+instead of the standard quotes shown above.  @AUCTeX{} is able to
+recognize several of these languages and will change quote insertion
+accordingly.  @xref{European}, for details about this feature and how to
+control it.
+
+@vindex LaTeX-csquotes-open-quote
+@vindex LaTeX-csquotes-close-quote
+@vindex LaTeX-csquotes-quote-after-quote
+In case you are using the @samp{csquotes} package, you should customize
+@code{LaTeX-csquotes-open-quote}, @code{LaTeX-csquotes-close-quote} and
+@code{LaTeX-csquotes-quote-after-quote}.  The quotation characters will
+only be used if both variables---@code{LaTeX-csquotes-open-quote} and
+@code{LaTeX-csquotes-close-quote}---are non-empty strings.  But then the
+@samp{csquotes}-related values will take precedence over the
+language-specific ones.
+
+@subheading Dollar Signs
+
+In @AUCTeX{}, dollar signs should match like they do in @TeX{}.  This
+has been partially implemented, we assume dollar signs always match
+within a paragraph.  The first @samp{$} you insert in a paragraph will
+do nothing special.  The second @samp{$} will match the first.  This
+will be indicated by moving the cursor temporarily over the first dollar
+sign.
+
+@deffn Command TeX-insert-dollar @var{arg}
+@kindex $
+(@kbd{$}) Insert dollar sign.
+
+Show matching dollar sign if this dollar sign end the @TeX{} math mode.
+Ensure double dollar signs match up correctly by inserting extra dollar
+signs when needed if @code{TeX-math-close-double-dollar} is non-nil.
+
+With optional @var{arg}, insert that many dollar signs.
+@end deffn
+
+@defopt TeX-math-close-double-dollar
+Control the insertion of double dollar signs for delimiting display
+math.  (Note that you should not use double dollar signs in @LaTeX{}
+because this practice can lead to wrong spacing in typeset documents.)
+If the variable is non-nil and you enter a dollar sign that matches a
+double dollar sign @samp{$$} @AUCTeX{} will automatically insert two
+dollar signs.
+@end defopt
+
+@subheading Braces
+
+To avoid unbalanced braces, it is useful to insert them pairwise.  You
+can do this by typing @kbd{C-c @{}.
+
+@deffn Command TeX-insert-braces
+@kindex C-c @{
+(@kbd{C-c @{}) Make a pair of braces and position the cursor
+to type inside of them.  If there is an active region, put braces around
+it and leave point after the closing brace.
+@end deffn
+
+@node Font Specifiers
+@section Inserting Font Specifiers
+
+@cindex Fonts
+@cindex Font macros
+@cindex Changing font
+@cindex Specifying a font
+
+Perhaps the most used keyboard commands of @AUCTeX{} are the short-cuts
+available for easy insertion of font changing macros.
+
+If you give an argument (that is, type @kbd{C-u}) to the font command,
+the innermost font will be replaced, i.e. the font in the @TeX{} group
+around point will be changed.  The following table shows the available
+commands, with @code{@point{}} indicating the position where the text
+will be inserted.
+
+@table @kbd
+@item C-c C-f C-b
+@kindex C-c C-f C-b
+@cindex @code{\textbf}
+Insert @b{bold face} @samp{\textbf@{@point{}@}} text.
+
+@item C-c C-f C-i
+@kindex C-c C-f C-i
+@cindex @code{\textit}
+Insert @i{italics} @samp{\textit@{@point{}@}} text.
+
+@item C-c C-f C-e
+@kindex C-c C-f C-e
+@cindex @code{\emph}
+Insert @i{emphasized} @samp{\emph@{@point{}@}} text.
+
+@item C-c C-f C-s
+@kindex C-c C-f C-s
+@cindex @code{\textsl}
+Insert @i{slanted} @samp{\textsl@{@point{}@}} text.
+
+@item C-c C-f C-r
+@kindex C-c C-f C-r
+@cindex @code{\textrm}
+Insert roman @r{\textrm@{@point{}@}} text.
+
+@item C-c C-f C-f
+@kindex C-c C-f C-f
+@cindex @code{\textsf}
+Insert @sans{sans serif} @samp{\textsf@{@point{}@}} text.
+
+@item C-c C-f C-t
+@kindex C-c C-f C-t
+@cindex @code{\texttt}
+Insert @t{typewriter} @samp{\texttt@{@point{}@}} text.
+
+@item C-c C-f C-c
+@kindex C-c C-f C-c
+@cindex @code{\textsc}
+Insert @sc{small caps} @samp{\textsc@{@point{}@}} text.
+
+@item C-c C-f C-d
+@kindex C-c C-f C-c
+@cindex Deleting fonts
+Delete the innermost font specification containing point.
+
+@end table
+
+@deffn Command TeX-font replace what
+@kindex C-c C-f
+(@kbd{C-c C-f}) Insert template for font change command.
+
+If @var{replace} is not nil, replace current font.  @var{what}
+determines the font to use, as specified by @code{TeX-font-list}.
+@end deffn
+
+@defopt TeX-font-list
+List of fonts used by @code{TeX-font}.
+
+Each entry is a list with three elements.  The first element is the
+key to activate the font.  The second element is the string to insert
+before point, and the third element is the string to insert after
+point.  An optional fourth element means always replace if not nil.
+@end defopt
+
+@defopt LaTeX-font-list
+List of fonts used by @code{TeX-font} in LaTeX mode.  It has the same
+structure as @code{TeX-font-list}.
+@end defopt
+
+@node Sectioning
+@section Inserting chapters, sections, etc.
+@cindex Sectioning
+@cindex Sections
+@cindex Chapters
+@cindex @code{\chapter}
+@cindex @code{\section}
+@cindex @code{\subsection}
+@cindex @code{\label}
+
+Insertion of sectioning macros, that is @samp{\chapter},
+@samp{\section}, @samp{\subsection}, etc. and accompanying
+@samp{\label}'s may be eased by using @kbd{C-c C-s}.  This command is
+highly customizable, the following describes the default behavior.
+
+When invoking you will be asked for a section macro to insert.  An
+appropriate default is automatically selected by @AUCTeX{}, that is
+either: at the top of the document; the top level sectioning for that
+document style, and any other place: The same as the last occurring
+sectioning command.
+
+Next, you will be asked for the actual name of that section, and
+last you will be asked for a label to be associated with that section.
+The label will be prefixed by the value specified in
+@code{LaTeX-section-hook}.
+
+@deffn Command LaTeX-section @var{arg}
+@kindex C-c C-s
+(@kbd{C-c C-s}) Insert a sectioning command.
+
+Determine the type of section to be inserted, by the argument
+@var{arg}.
+
+@itemize @bullet
+@item
+If @var{arg} is nil or missing, use the current level.
+@item
+If @var{arg} is a list (selected by C-u), go downward one level.
+@item
+If @var{arg} is negative, go up that many levels.
+@item
+If @var{arg} is positive or zero, use absolute level:
+@itemize +
+@item
+0 : part
+@item
+1 : chapter
+@item
+2 : section
+@item
+3 : subsection
+@item
+4 : subsubsection
+@item
+5 : paragraph
+@item
+6 : subparagraph
+@end itemize
+@end itemize
+
+The following variables can be set to customize the function.
+
+@vtable @code
+@item LaTeX-section-hook
+Hooks to be run when inserting a section.
+@item LaTeX-section-label
+Prefix to all section references.
+@end vtable
+
+@end deffn
+
+The precise behavior of @code{LaTeX-section} is defined by the contents
+of @code{LaTeX-section-hook}.
+
+@defopt LaTeX-section-hook
+List of hooks to run when a new section is inserted.
+
+The following variables are set before the hooks are run
+
+@table @var
+@item level
+Numeric section level, default set by prefix arg to @code{LaTeX-section}.
+@item name
+Name of the sectioning command, derived from @var{level}.
+@item title
+The title of the section, default to an empty string.
+@item toc
+Entry for the table of contents list, default nil.
+@item done-mark
+Position of point afterwards, default nil meaning after the inserted
+text.
+@end table
+
+A number of hooks are already defined.  Most likely, you will be able to
+get the desired functionality by choosing from these hooks.
+
+@ftable @code
+@item LaTeX-section-heading
+Query the user about the name of the sectioning command.  Modifies
+@var{level} and @var{name}.
+@item LaTeX-section-title
+Query the user about the title of the section. Modifies @var{title}.
+@item LaTeX-section-toc
+Query the user for the toc entry.  Modifies @var{toc}.
+@item LaTeX-section-section
+Insert @LaTeX{} section command according to @var{name}, @var{title},
+and @var{toc}.  If @var{toc} is nil, no toc entry is inserted.  If
+@var{toc} or @var{title} are empty strings, @var{done-mark} will be
+placed at the point they should be inserted.
+@item LaTeX-section-label
+Insert a label after the section command.  Controlled by the variable
+@code{LaTeX-section-label}.
+@end ftable
+
+To get a full featured @code{LaTeX-section} command, insert
+
+@lisp
+(setq LaTeX-section-hook
+      '(LaTeX-section-heading
+       LaTeX-section-title
+       LaTeX-section-toc
+       LaTeX-section-section
+       LaTeX-section-label))
+@end lisp
+
+in your @file{.emacs} file.
+@end defopt
+
+The behavior of @code{LaTeX-section-label} is determined by the
+variable @code{LaTeX-section-label}.
+
+@defopt LaTeX-section-label
+Default prefix when asking for a label.
+
+If it is a string, it is used unchanged for all kinds of sections.
+If it is nil, no label is inserted.
+If it is a list, the list is searched for a member whose car is equal
+to the name of the sectioning command being inserted.  The cdr is then
+used as the prefix.  If the name is not found, or if the cdr is nil,
+no label is inserted.
+
+@cindex Prefix for labels
+@cindex Label prefix
+@cindex Labels
+By default, chapters have a prefix of @samp{cha:} while sections and
+subsections have a prefix of @samp{sec:}.  Labels are not automatically
+inserted for other types of sections.
+@end defopt
+
+@node Environments
+@section Inserting Environment Templates
+@cindex Environments
+@cindex @samp{\begin}
+@cindex @samp{\end}
+
+A large apparatus is available that supports insertions of environments,
+that is @samp{\begin@{@}} --- @samp{\end@{@}} pairs.
+
+@AUCTeX{} is aware of most of the actual environments available in a
+specific document.  This is achieved by examining your
+@samp{\documentclass} command, and consulting a precompiled list of
+environments available in a large number of styles.
+
+You insert an environment with @kbd{C-c C-e}, and select an environment
+type.  Depending on the environment, @AUCTeX{} may ask more questions
+about the optional parts of the selected environment type.  With
+@kbd{C-u C-c C-e} you will change the current environment.
+
+@deffn Command LaTeX-environment @var{arg}
+@kindex C-c C-e
+(@kbd{C-c C-e})  @AUCTeX{} will prompt you for an environment
+to insert.  At this prompt, you may press @key{TAB} or @key{SPC} to
+complete a partially written name, and/or to get a list of available
+environments.  After selection of a specific environment @AUCTeX{} may
+prompt you for further specifications.
+
+If the optional argument @var{arg} is not-nil (i.e. you have given a
+prefix argument), the current environment is modified and no new
+environment is inserted.
+@end deffn
+
+As a default selection, @AUCTeX{} will suggest the environment last
+inserted or, as the first choice the value of the variable
+@code{LaTeX-default-environment}.
+
+@defopt LaTeX-default-environment
+Default environment to insert when invoking @samp{LaTeX-environment}
+first time.
+@end defopt
+
+If the document is empty, or the cursor is placed at the top of the
+document, @AUCTeX{} will default to insert a `document' environment.
+
+Most of these are described further in the following sections, and you
+may easily specify more.  @xref{Customizing Environments}.
+
+@menu
+* Equations::                   Equations
+* Floats::                      Floats
+* Itemize-like::                Itemize-like Environments
+* Tabular-like::                Tabular-like Environments
+* Customizing Environments::    Customizing Environments
+@end menu
+
+You can close the current environment with @kbd{C-c ]}, but we suggest
+that you use @kbd{C-c C-e} to insert complete environments instead.
+
+@deffn Command LaTeX-close-environment
+@kindex C-c ]
+(@kbd{C-c ]}) Insert an @samp{\end} that matches the current environment.
+@end deffn
+
+@node Equations
+@subsection Equations
+@cindex Equations
+@cindex Equation
+@cindex Eqnarray
+@cindex amsmath
+
+When inserting equation-like environments, the @samp{\label} will have a
+default prefix, which is controlled by the following variables:
+
+@defopt LaTeX-equation-label
+Prefix to use for `equation' labels.
+@end defopt
+
+@defopt LaTeX-eqnarray-label
+Prefix to use for `eqnarray' labels.
+@end defopt
+
+@defopt LaTeX-amsmath-label
+Prefix to use for amsmath equation labels.  Amsmath equations include
+@samp{align}, @samp{alignat}, @samp{xalignat}, @samp{aligned},
+@samp{flalign} and @samp{gather}.
+@end defopt
+
+@node Floats
+@subsection Floats
+@cindex Floats
+@cindex Figures
+@cindex Figure environment
+@cindex Tables
+@cindex Table environment
+
+Figures and tables (i.e., floats) may also be inserted using @AUCTeX{}.
+After choosing either `figure' or `table' in the environment list
+described above, you will be prompted for a number of additional things.
+
+@table @var
+@item float position
+This is the optional argument of float environments that controls how
+they are placed in the final document.  In @LaTeX{} this is a sequence
+of the letters @samp{htbp} as described in the @LaTeX{} manual.  The
+value will default to the value of @code{LaTeX-float}.
+@vindex LaTeX-float
+
+@item caption
+This is the caption of the float.  The default is to insert the caption
+at the bottom of the float.  You can specify floats where the caption
+should be placed at the top with @code{LaTeX-top-caption-list}.
+@vindex LaTeX-top-caption-list
+
+@item label
+The label of this float.  The label will have a default prefix, which is
+controlled by the variables @code{LaTeX-figure-label} and
+@code{LaTeX-table-label}.
+@vindex LaTeX-figure-label
+@vindex LaTeX-table-label
+@cindex Prefix for labels
+@cindex Label prefix
+@cindex Labels
+@end table
+
+Moreover, you will be asked if you want the contents of the float
+environment to be horizontally centered.  Upon a positive answer a
+@samp{\centering} macro will be inserted at the beginning of the float
+environment.
+
+@defopt LaTeX-float
+Default placement for floats.
+@end defopt
+
+@defopt LaTeX-figure-label
+Prefix to use for figure labels.
+@end defopt
+
+@defopt LaTeX-table-label
+Prefix to use for table labels.
+@end defopt
+
+@defopt LaTeX-top-caption-list
+List of float environments with top caption.
+@end defopt
+
+@node Itemize-like
+@subsection Itemize-like Environments
+@cindex Itemize
+@cindex Enumerates
+@cindex Descriptions
+@cindex Items
+@cindex \item
+
+In an itemize-like environment, nodes (i.e., @samp{\item}s) may be
+inserted using @kbd{C-c @key{LFD}}.
+
+@deffn Command LaTeX-insert-item
+@kindex C-c @key{LFD}
+(@kbd{C-c @key{LFD}}) Close the current item, move to the next line and
+insert an appropriate @samp{\item} for the current environment. That is,
+`itemize' and `enumerate' will have @samp{\item } inserted, while
+`description' will have @samp{\item[]} inserted.
+@end deffn
+
+@node Tabular-like
+@subsection Tabular-like Environments
+
+When inserting Tabular-like environments, that is, `tabular' `array'
+etc., you will be prompted for a template for that environment.
+Related variables:
+
+@defopt LaTeX-default-format
+Default format string for array and tabular environments.
+@end defopt
+
+@defopt LaTeX-default-position
+Default position string for array and tabular environments.  If nil,
+act like the empty string is given, but don't prompt for a position.
+@end defopt
+
+@node Customizing Environments
+@subsection Customizing Environments
+
+@xref{Adding Environments}, for how to customize the list of known
+environments.
+
+@node Mathematics
+@section Entering Mathematics
+@cindex Mathematics
+@cindex Symbols
+@cindex Abbreviations
+
+@TeX{} is written by a mathematician, and has always contained good
+support for formatting mathematical text.  @AUCTeX{} supports this
+tradition, by offering a special minor mode for entering text with many
+mathematical symbols.  You can enter this mode by typing @kbd{C-c
+~}.
+
+@deffn Command LaTeX-math-mode
+@kindex C-c ~
+(@kbd{C-c ~}) Toggle LaTeX Math mode.  This is a minor mode rebinding
+the key @code{LaTeX-math-abbrev-prefix} to allow easy typing of
+mathematical symbols.  @kbd{`} will read a character from the keyboard,
+and insert the symbol as specified in @code{LaTeX-math-default} and
+@code{LaTeX-math-list}.  If given a prefix argument, the symbol will be
+surrounded by dollar signs.
+@end deffn
+
+You can use another prefix key (instead of @kbd{`}) by  setting the
+variable @code{LaTeX-math-abbrev-prefix}.
+
+To enable LaTeX Math mode by default, add the following in your
+@file{.emacs} file:
+@lisp
+(add-hook 'LaTeX-mode-hook 'LaTeX-math-mode)
+@end lisp
+
+@defopt LaTeX-math-abbrev-prefix
+A string containing the prefix of @code{LaTeX-math-mode} commands; This
+value defaults to @kbd{`}.
+
+The string has to be a key or key sequence in a format understood by the
+@code{kbd} macro.  This corresponds to the syntax usually used in the
+manuals for Emacs Emacs Lisp.
+@end defopt
+
+The variable @code{LaTeX-math-list} allows you to add your own mappings.
+
+@defopt LaTeX-math-list
+A list containing user-defined keys and commands to be used in LaTeX
+Math mode.  Each entry should be a list of two to four elements.
+
+First, the key to be used after @code{LaTeX-math-abbrev-prefix} for
+macro insertion.  If it is nil, the symbol has no associated
+keystroke (it is available in the menu, though).
+
+Second, a string representing the name of the macro (without a leading
+backslash.)
+
+Third, a string representing the name of a submenu the command should be
+added to.  Use a list of strings in case of nested menus.
+
+Fourth, the position of a Unicode character to be displayed in the menu
+alongside the macro name.  This is an integer value.
+@end defopt
+
+@defopt LaTeX-math-menu-unicode
+Whether the LaTeX menu should try using Unicode for effect.  Your Emacs
+built must be able to display include Unicode characters in menus for
+this feature.
+@end defopt
+
+@AUCTeX{}'s reference card @file{tex-ref.tex} includes a list of all
+math mode commands.
+
+@AUCTeX{} can help you write subscripts and superscripts in math
+constructs by automatically inserting a pair of braces after typing
+@key{_} or @key{^} respectively and putting point between the braces.
+In order to enable this feature, set the variable
+@code{TeX-electric-sub-and-superscript} to a non-nil value.
+
+@defopt TeX-electric-sub-and-superscript
+If non-nil, insert braces after typing @key{^} and @key{_} in math mode.
+@end defopt
+
+@node Completion
+@section Completion
+@cindex Completion
+@cindex Expansion
+@cindex Macro expansion
+@cindex Macro completion
+@cindex Macro arguments
+@cindex Arguments to @TeX{} macros
+
+Emacs lisp programmers probably know the @code{lisp-complete-symbol}
+command, usually bound to @kbd{M-@key{TAB}}.  Users of the wonderful
+ispell mode know and love the @code{ispell-complete-word} command from
+that package.  Similarly, @AUCTeX{} has a @code{TeX-complete-symbol}
+command, by default bound to @kbd{M-@key{TAB}} which is equivalent to
+@kbd{M-C-i}.  Using @code{TeX-complete-symbol} makes it easier to type
+and remember the names of long @LaTeX{} macros.
+
+In order to use @code{TeX-complete-symbol}, you should write a backslash
+and the start of the macro.  Typing @kbd{M-@key{TAB}} will now complete
+as much of the macro, as it unambiguously can.  For example, if you type
+`@samp{\renewc}' and then @kbd{M-@key{TAB}}, it will expand to
+`@samp{\renewcommand}'.
+
+@deffn Command TeX-complete-symbol
+@kindex M-@key{TAB}
+(@kbd{M-@key{TAB}})  Complete @TeX{} symbol before point.
+@end deffn
+
+A more direct way to insert a macro is with @code{TeX-insert-macro},
+bound to @kbd{C-c C-m} which is equivalent to @kbd{C-c @key{RET}}.  It
+has the advantage over completion that it knows about the argument of
+most standard @LaTeX{} macros, and will prompt for them.  It also knows
+about the type of the arguments, so it will for example give completion
+for the argument to @samp{\include}.  Some examples are listed below.
+
+@deffn Command TeX-insert-macro
+@kindex C-c C-m
+(@kbd{C-c C-m} or @kbd{C-c @key{RET}}) Prompt (with completion) for the
+name of a @TeX{} macro, and if @AUCTeX{} knows the macro, prompt for
+each argument.
+@end deffn
+
+As a default selection, @AUCTeX{} will suggest the macro last inserted
+or, as the first choice the value of the variable
+@code{TeX-default-macro}.
+
+@defopt TeX-insert-macro-default-style
+Specifies whether @code{TeX-insert-macro} will ask for all optional
+arguments.
+
+If set to the symbol @code{show-optional-args}, @code{TeX-insert-macro}
+asks for optional arguments of @TeX{} macros.  If set to
+@code{mandatory-args-only}, @code{TeX-insert-macro} asks only for
+mandatory arguments.  When @code{TeX-insert-macro} is called with prefix
+argument (@kbd{C-u}), it's the other way round.
+
+Note that for some macros, there are special mechanisms, e.g.
+@code{LaTeX-includegraphics-options-alist}.
+
+@end defopt
+
+
+@defopt TeX-default-macro
+Default macro to insert when invoking @code{TeX-insert-macro} first time.
+@end defopt
+
+A faster alternative is to bind the function @code{TeX-electric-macro}
+to @samp{\}.  This can be done by setting the variable
+@code{TeX-electric-escape}
+
+@defopt TeX-electric-escape
+If this is non-nil when @AUCTeX{} is loaded, the @TeX{} escape
+character @samp{\} will be bound to @code{TeX-electric-macro}
+@end defopt
+
+The difference between @code{TeX-insert-macro} and
+@code{TeX-electric-macro} is that space will complete and exit from the
+minibuffer in @code{TeX-electric-macro}.  Use @key{TAB} if you merely
+want to complete.
+
+@deffn Command TeX-electric-macro
+Prompt (with completion) for the name of a @TeX{} macro,
+and if @AUCTeX{} knows the macro, prompt for each argument.
+Space will complete and exit.
+@end deffn
+
+By default @AUCTeX{} will put an empty set braces @samp{@{@}} after a
+macro with no arguments to stop it from eating the next whitespace.
+This can be stopped by entering @code{LaTeX-math-mode},
+@pxref{Mathematics}, or by setting @code{TeX-insert-braces} to nil.
+
+@defopt TeX-insert-braces
+If non-nil, append a empty pair of braces after inserting a macro.
+@end defopt
+
+Completions work because @AUCTeX{} can analyze @TeX{} files, and store
+symbols in Emacs Lisp files for later retrieval.  @xref{Automatic}, for
+more information.
+
+@cindex \cite, completion of
+@cindex Bib@TeX{}, completion
+@cindex cite, completion of
+@cindex bibliography, completion
+@cindex citations, completion of
+@cindex \label, completion
+@cindex \ref, completion
+@cindex labels, completion of
+@AUCTeX{} will also make completion for many macro arguments, for
+example existing labels when you enter a @samp{\ref} macro with
+@code{TeX-insert-macro} or @code{TeX-electric-macro}, and Bib@TeX{}
+entries when you enter a @samp{\cite} macro.  For this kind of
+completion to work, parsing must be enabled as described in
+@pxref{Parsing Files}.  For @samp{\cite} you must also make sure that
+the Bib@TeX{} files have been saved at least once after you enabled
+automatic parsing on save, and that the basename of the Bib@TeX{} file
+does not conflict with the basename of one of @TeX{} files.
+
+@node Commenting
+@section Commenting
+
+It is often necessary to comment out temporarily a region of @TeX{} or
+@LaTeX{} code.  This can be done with the commands @kbd{C-c ;} and
+@kbd{C-c %}.  @kbd{C-c ;} will comment out all lines in the current
+region, while @kbd{C-c %} will comment out the current paragraph.
+Type @kbd{C-c ;} again to uncomment all lines of a commented region,
+or @kbd{C-c %} again to uncomment all comment lines around point.
+These commands will insert or remove a single @samp{%} respectively.
+
+@deffn Command TeX-comment-or-uncomment-region
+@kindex C-c ;
+(@kbd{C-c ;}) Add or remove @samp{%} from the beginning of each line
+in the current region.  Uncommenting works only if the region encloses
+solely commented lines.  If @AUCTeX{} should not try to guess if the
+region should be commented or uncommented the commands
+@code{TeX-comment-region} and @code{TeX-uncomment-region} can be used
+to explicitly comment or uncomment the region in concern.
+@end deffn
+
+@deffn Command TeX-comment-or-uncomment-paragraph
+@kindex C-c %
+(@kbd{C-c %}) Add or remove @samp{%} from the beginning of each line
+in the current paragraph.  When removing @samp{%} characters the
+paragraph is considered to consist of all preceding and succeeding
+lines starting with a @samp{%}, until the first non-comment line.
+@end deffn
+
+@node Indenting
+@section Indenting
+@cindex Formatting
+@cindex Indenting
+@cindex Indentation
+@cindex Reformatting
+@cindex Reindenting
+
+Indentation means the addition of whitespace at the beginning of lines
+to reflect special syntactical constructs.  This makes it easier to see
+the structure of the document, and to catch errors such as a missing
+closing brace.  Thus, the indentation is done for precisely the same
+reasons that you would indent ordinary computer programs.
+
+Indentation is done by @LaTeX{} environments and by @TeX{} groups, that
+is the body of an environment is indented by the value of
+@code{LaTeX-indent-level} (default 2).  Also, items of an `itemize-like'
+environment are indented by the value of @code{LaTeX-item-indent},
+default @minus{}2.  (Items are identified with the help of
+@code{LaTeX-item-regexp}.)  If more environments are nested, they are
+indented `accumulated' just like most programming languages usually are
+seen indented in nested constructs.
+@vindex LaTeX-indent-level
+@vindex LaTeX-item-indent
+@vindex LaTeX-item-regexp
+
+You can explicitely indent single lines, usually by pressing @key{TAB},
+or marked regions by calling @code{indent-region} on it.  If you have
+@code{auto-fill-mode} enabled and a line is broken while you type it,
+Emacs automatically cares about the indentation in the following line.
+If you want to have a similar behavior upon typing @key{RET}, you can
+customize the variable @code{TeX-newline-function} and change the
+default of @code{newline} which does no indentation to
+@code{newline-and-indent} which indents the new line or
+@code{reindent-then-newline-and-indent} which indents both the current
+and the new line.
+@vindex TeX-newline-function
+
+There are certain @LaTeX{} environments which should be indented in a
+special way, like @samp{tabular} or @samp{verbatim}.  Those environments
+may be specified in the variable @code{LaTeX-indent-environment-list}
+together with their special indentation functions.  Taking the
+@samp{verbatim} environment as an example you can see that
+@code{current-indentation} is used as the indentation function.  This
+will stop @AUCTeX{} from doing any indentation in the environment if you
+hit @key{TAB} for example.
+@vindex LaTeX-indent-environment-list
+
+There are environments in @code{LaTeX-indent-environment-list} which do
+not bring a special indentation function with them.  This is due to the
+fact that first the respective functions are not implemented yet and
+second that filling will be disabled for the specified environments.
+This shall prevent the source code from being messed up by accidently
+filling those environments with the standard filling routine.  If you
+think that providing special filling routines for such environments
+would be an appropriate and challenging task for you, you are invited to
+contribute. (@xref{Filling}, for further information about the filling
+functionality)
+@vindex LaTeX-indent-environment-list
+
+The check for the indentation function may be enabled or disabled by
+customizing the variable @code{LaTeX-indent-environment-check}.
+@vindex LaTeX-indent-environment-check
+
+As a side note with regard to formatting special environments: Newer
+Emacsen include @file{align.el} and therefore provide some support for
+formatting @samp{tabular} and @samp{tabbing} environments with the
+function @code{align-current} which will nicely align columns in the
+source code.
+
+@AUCTeX{} is able to format commented parts of your code just as any
+other part.  This means @LaTeX{} environments and @TeX{} groups in
+comments will be indented syntactically correct if the variable
+@code{LaTeX-syntactic-comments} is set to t.  If you disable it,
+comments will be filled like normal text and no syntactic indentation
+will be done.
+@vindex LaTeX-syntactic-comments
+
+Following you will find a list of most commands and variables related
+to indenting with a small summary in each case:
+
+@table @kbd
+@item @key{TAB}
+@kindex @key{TAB}
+@findex LaTeX-indent-line
+@code{LaTeX-indent-line} will indent the current line.
+
+@item @key{LFD}
+@kindex @key{LFD}
+@code{newline-and-indent} inserts a new line (much like @key{RET}) and
+moves the cursor to an appropriate position by the left margin.
+
+Most keyboards nowadays lack a linefeed key and @kbd{C-j} may be tedious
+to type.  Therefore you can customize @AUCTeX{} to perform indentation
+upon typing @key{RET} as well.  The respective option is called
+@code{TeX-newline-function}.
+
+@item C-j
+@kindex C-j
+Alias for @key{LFD}
+@end table
+
+@defopt LaTeX-indent-environment-list
+List of environments with special indentation.  The second element in
+each entry is the function to calculate the indentation level in
+columns.
+
+The filling code currently cannot handle tabular-like environments
+which will be completely messed-up if you try to format them.  This is
+why most of these environments are included in this customization
+option without a special indentation function.  This will prevent that
+they get filled.
+@end defopt
+
+@defopt LaTeX-indent-level
+Number of spaces to add to the indentation for each @samp{\begin} not
+matched by a @samp{\end}.
+@end defopt
+
+@defopt LaTeX-item-indent
+Number of spaces to add to the indentation for @samp{\item}'s in list
+environments.
+@end defopt
+
+@defopt TeX-brace-indent-level
+Number of spaces to add to the indentation for each @samp{@{} not
+matched by a @samp{@}}.
+@end defopt
+
+@defopt LaTeX-syntactic-comments
+If non-nil comments will be filled and indented according to @LaTeX{}
+syntax.  Otherwise they will be filled like normal text.
+@end defopt
+
+@defopt TeX-newline-function
+Used to specify the function which is called when @key{RET} is pressed.
+This will normally be @code{newline} which simply inserts a new line.
+In case you want to have @AUCTeX{} do indentation as well when you press
+@key{RET}, use the built-in functions @code{newline-and-indent} or
+@code{reindent-then-newline-and-indent}.  The former inserts a new line
+and indents the following line, i.e. it moves the cursor to the right
+position and therefore acts as if you pressed @key{LFD}.  The latter
+function additionally indents the current line.  If you choose
+@samp{Other}, you can specify your own fancy function to be called when
+@key{RET} is pressed.
+@end defopt
+
+
+@node Filling
+@section Filling
+@cindex Filling
+@cindex Formatting
+@cindex Reformatting
+@cindex Refilling
+
+Filling deals with the insertion of line breaks to prevent lines from
+becoming wider than what is specified in @code{fill-column}.  The
+linebreaks will be inserted automatically if @code{auto-fill-mode} is
+enabled.  In this case the source is not only filled but also indented
+automatically as you write it.
+
+@code{auto-fill-mode} can be enabled for @AUCTeX{} by calling
+@code{turn-on-auto-fill} in one of the hooks @AUCTeX{} is running.
+@xref{Modes and Hooks}.  As an example, if you want to enable
+@code{auto-fill-mode} in @code{LaTeX-mode}, put the following into your
+init file:
+
+@lisp
+(add-hook 'LaTeX-mode-hook 'turn-on-auto-fill)
+@end lisp
+
+You can manually fill explicitely marked regions, paragraphs,
+environments, complete sections, or the whole buffer.  (Note that manual
+filling in @AUCTeX{} will indent the start of the region to be filled in
+contrast to many other Emacs modes.)
+
+There are some syntactical constructs which are handled specially with
+regard to filling.  These are so-called code comments and paragraph
+commands.
+
+Code comments are comments preceded by code or text in the same line.
+Upon filling a region, code comments themselves will not get filled.
+Filling is done from the start of the region to the line with the code
+comment and continues after it.  In order to prevent overfull lines in
+the source code, a linebreak will be inserted before the last
+non-comment word by default.  This can be changed by customizing
+@code{LaTeX-fill-break-before-code-comments}.  If you have overfull
+lines with code comments you can fill those explicitely by calling
+@code{LaTeX-fill-paragraph} or pressing @kbd{M-q} with the cursor
+positioned on them.  This will add linebreaks in the comment and indent
+subsequent comment lines to the column of the comment in the first line
+of the code comment.  In this special case @kbd{M-q} only acts on the
+current line and not on the whole paragraph.
+
+Lines with @samp{\par} are treated similarly to code comments,
+i.e. @samp{\par} will be treated as paragraph boundary which should not
+be followed by other code or text.  But it is not treated as a real
+paragraph boundary like an empty line where filling a paragraph would
+stop.
+
+Paragraph commands like @samp{\section} or @samp{\noindent} (the list of
+commands is defined by @code{LaTeX-paragraph-commands}) are often to be
+placed in their own line(s).  This means they should not be consecuted
+with any preceding or following adjacent lines of text.  @AUCTeX{} will
+prevent this from happening if you do not put any text except another
+macro after the end of the last brace of the respective macro.  If
+there is other text after the macro, @AUCTeX{} regards this as a sign
+that the macro is part of the following paragraph.
+@vindex LaTeX-paragraph-commands
+
+Here are some examples:
+
+@example
+\begin@{quote@}
+  text text text text
+@end example
+
+@example
+\begin@{quote@}\label@{foo@}
+  text text text text
+@end example
+
+If you press @kbd{M-q} on the first line in both examples, nothing will
+change.  But if you write
+
+@example
+\begin@{quote@} text
+  text text text text
+@end example
+
+and press @kbd{M-q}, you will get
+
+@example
+\begin@{quote@} text text text text text
+@end example
+
+Besides code comments and paragraph commands, another speciality of
+filling in @AUCTeX{} involves commented lines.  You should be aware that
+these comments are treated as islands in the rest of the @LaTeX{} code
+if syntactic filling is enabled.  This means, for example, if you try to
+fill an environment with @code{LaTeX-fill-environment} and have the
+cursor placed on a commented line which does not have a surrounding
+environment inside the comment, @AUCTeX{} will report an error.
+@findex LaTeX-fill-environment
+
+The relevant commands and variables with regard to filling are:
+
+@table @kbd
+@item C-c C-q C-p
+@kindex C-c C-q C-p
+@findex LaTeX-fill-paragraph
+@code{LaTeX-fill-paragraph} will fill and indent the current paragraph.
+
+@item M-q
+@kindex M-q
+Alias for @kbd{C-c C-q C-p}
+
+@item C-c C-q C-e
+@kindex C-c C-q C-e
+@findex LaTeX-fill-environment
+@code{LaTeX-fill-environment} will fill and indent the current
+environment.  This may e.g. be the `document' environment, in which case
+the entire document will be formatted.
+
+@item C-c C-q C-s
+@kindex C-c C-q C-s
+@findex LaTeX-fill-section
+@code{LaTeX-fill-section} will fill and indent the current logical
+sectional unit.
+
+@item C-c C-q C-r
+@kindex C-c C-q C-r
+@findex LaTeX-fill-region
+@code{LaTeX-fill-region} will fill and indent the current region.
+@end table
+
+@defopt LaTeX-fill-break-at-separators
+List of separators before or after which respectively linebreaks will
+be inserted if they do not fit into one line.  The separators can be
+curly braces, brackets, switches for inline math (@samp{$}, @samp{\(},
+@samp{\)}) and switches for display math (@samp{\[}, @samp{\]}).  Such
+formatting can be useful to make macros and math more visible or to
+prevent overfull lines in the @LaTeX{} source in case a package for
+displaying formatted @TeX{} output inside the Emacs buffer, like
+preview-latex, is used.
+@end defopt
+
+@defopt LaTeX-fill-break-before-code-comments
+Code comments are comments preceded by some other text in the same line.
+When a paragraph containing such a comment is to be filled, the comment
+start will be seen as a border after which no line breaks will be
+inserted in the same line.  If the option
+@code{LaTeX-fill-break-before-code-comments} is enabled (which is the
+default) and the comment does not fit into the line, a line break will
+be inserted before the last non-comment word to minimize the chance that
+the line becomes overfull.
+@end defopt
+
+@node Display
+@chapter Controlling Screen Display
+
+It is often desirable to get visual help of what markup code in a text
+actually does whithout having to decipher it explicitely.  For this
+purpose Emacs and @AUCTeX{} provide font locking (also known as syntax
+highlighting) which visually sets off markup code like macros or
+environments by using different colors or fonts.  For example text to be
+typeset in italics can be displayed with an italic font in the editor as
+well, or labels and references get their own distinct color.
+
+While font locking helps you grasp the purpose of markup code and
+separate markup from content, the markup code can still be distracting.
+@AUCTeX{} lets you hide those parts and show them again at request with
+its built-in support for hiding macros and environments which we call
+folding here.
+
+Besides folding of macros and environments, @AUCTeX{} provides support
+for Emacs' outline mode which lets you narrow the buffer content to
+certain sections of your text by hiding the parts not belonging to these
+sections.
+
+@menu
+* Font Locking::                Font Locking
+* Folding::                     Folding Macros and Environments
+* Outline::                     Outlining the Document
+@end menu
+
+@node Font Locking
+@section Font Locking
+@cindex Font Locking
+@cindex Syntax Highlighting
+@cindex font-latex
+
+Font locking is supposed to improve readability of the source code by
+highlighting certain keywords with different colors or fonts.  It
+thereby lets you recognize the function of markup code to a certain
+extent without having to read the markup command.  For general
+information on controlling font locking with Emacs' Font Lock mode, see
+@ref{Font Lock, , Font Lock Mode, emacs, GNU Emacs Manual}.
+
+@defopt TeX-install-font-lock
+Once font locking is enabled globally or for the major modes provided by
+@AUCTeX{}, the font locking patterns and functionality of @fontlatex{}
+are activated by default.  You can switch to a different font locking
+scheme or disable font locking in @AUCTeX{} by customizing the variable
+@code{TeX-install-font-lock}.
+
+Besides @fontlatex{} @AUCTeX{} ships with a scheme which is derived
+from Emacs' default @LaTeX{} mode and activated by choosing
+@code{tex-font-setup}.  Be aware that this scheme is not coupled with
+@AUCTeX{}'s style system and not the focus of development.  Therefore
+and due to @fontlatex{} being much more feature-rich the following
+explanations will only cover @fontlatex{}.
+
+In case you want to hook in your own fontification scheme, you can
+choose @code{other} and insert the name of the function which sets up
+your font locking patterns.  If you want to disable fontification in
+@AUCTeX{} completely, choose @code{ignore}.
+@end defopt
+
+@fontlatex{} provides many options for customization which are
+accessible with @kbd{M-x customize-group RET font-latex RET}.  For this
+description the various options are explained in conceptional groups.
+
+@menu
+* Fontification of macros::     Fontification of macros
+* Fontification of quotes::     Fontification of quotes
+* Fontification of math::       Fontification of math constructs
+* Verbatim content::            Verbatim macros and environments
+* Faces::                       Faces used by font-latex
+* Known problems::              Known fontification problems
+@end menu
+
+@node Fontification of macros
+@subsection Fontification of macros
+
+Highlighting of macros can be customized by adapting keyword lists which
+can be found in the customization group @code{font-latex-keywords}.
+
+Three types of macros can be handled differently with respect to
+fontification:
+
+@enumerate
+@item
+Commands of the form @samp{\foo[bar]@{baz@}} which consist of the macro
+itself, optional arguments in square brackets and mandatory arguments in
+curly braces.  For the command itself the face
+@code{font-lock-keyword-face} will be used and for the optional
+arguments the face @code{font-lock-variable-name-face}.  The face
+applied to the mandatory argument depends on the macro class represented
+by the respective built-in variables.
+@item
+Declaration macros of the form @samp{@{\foo text@}} which consist of the
+macro which may be enclosed in a @TeX{} group together with text to be
+affected by the macro.  In case a @TeX{} group is present, the macro
+will get the face @code{font-lock-keyword-face} and the text will get
+the face configured for the respective macro class.  If no @TeX{} group
+is present, the latter face will be applied to the macro itself.
+@item
+Simple macros of the form @samp{\foo} which do not have any arguments or
+groupings.  The respective face will be applied to the macro itself.
+@end enumerate
+
+Customization variables for @samp{\foo[bar]@{baz@}} type macros allow
+both the macro name and the sequence of arguments to be specified.  The
+latter is done with a string which can contain the characters
+@table @samp
+@item *
+indicating the existence of a starred variant for the macro,
+@item [
+for optional arguments in brackets,
+@item @{
+for mandatory arguments in braces,
+@item \
+for mandatory arguments consisting of a single macro and
+@item |
+as a prefix indicating that two alternatives are following.
+@end table
+For example the specifier for @samp{\documentclass} would be @samp{[@{}
+because the macro has one optional followed by one mandatory argument.
+The specifier for @samp{\newcommand} would be @samp{*|@{\[[@{} because
+there is a starred variant, the mandatory argument following the macro
+name can be a macro or a @TeX{} group which can be followed by two
+optional arguments and the last token is a mandatory argument in braces.
+
+Customization variables for the @samp{@{\foo text@}} and @samp{\foo}
+types are simple lists of strings where each entry is a macro name
+(without the leading backslash).
+
+@subheading General macro classes
+
+@fontlatex{} provides keyword lists for different macro classes which
+are described in the following table:
+
+@vindex font-latex-match-function-keywords
+@vindex font-latex-match-reference-keywords
+@vindex font-latex-match-textual-keywords
+@vindex font-latex-match-variable-keywords
+@vindex font-latex-match-warning-keywords
+@table @code
+@item font-latex-match-function-keywords
+Keywords for macros defining or related to functions, like
+@samp{\newcommand}.@*
+Type: @samp{\macro[...]@{...@}}@*
+Face: @code{font-lock-function-name-face}
+
+@item font-latex-match-reference-keywords
+Keywords for macros defining or related to references, like
+@samp{\ref}.@*
+Type: @samp{\macro[...]@{...@}}@*
+Face: @code{font-lock-constant-face}
+
+@item font-latex-match-textual-keywords
+Keywords for macros specifying textual content, like @samp{\caption}.@*
+Type: @samp{\macro[...]@{...@}}@*
+Face: @code{font-lock-type-face}
+
+@item font-latex-match-variable-keywords
+Keywords for macros defining or related to variables, like
+@samp{\setlength}.@*
+Type: @samp{\macro[...]@{...@}}@*
+Face: @code{font-lock-variable-name-face}
+
+@item font-latex-match-warning-keywords
+Keywords for important macros, e.g. affecting line or page break, like
+@samp{\clearpage}.@*
+Type: @samp{\macro}@*
+Face: @code{font-latex-warning-face}
+@end table
+
+@subheading Sectioning commands
+@cindex Sectioning commands, fontification of
+
+Sectioning commands are macros like @samp{\chapter} or @samp{\section}.
+For these commands there are two fontification schemes which may be
+selected by customizing the variable @code{font-latex-fontify-sectioning}.
+
+@defopt font-latex-fontify-sectioning
+@c Is @vindex correct?
+@vindex font-latex-sectioning-0-face
+@vindex font-latex-sectioning-1-face
+@vindex font-latex-sectioning-2-face
+@vindex font-latex-sectioning-3-face
+@vindex font-latex-sectioning-4-face
+@vindex font-latex-sectioning-5-face
+Per default sectioning commands will be shown in a larger, proportional
+font, which corresponds to a number for this variable.  The font size
+varies with the sectioning level, e.g. @samp{\part}
+(@code{font-latex-sectioning-0-face}) has a larger font than
+@samp{\paragraph} (@code{font-latex-sectioning-5-face}).  Typically,
+values from 1.05 to 1.3 for @code{font-latex-fontify-sectioning} give
+best results, depending on your font setup.  If you rather like to use
+the base font and a different color, set the variable to the symbol
+@samp{color}.  In this case the face @code{font-lock-type-face} will be
+used to fontify the argument of the sectioning commands.
+@end defopt
+
+@vindex font-latex-match-sectioning-0-keywords
+@vindex font-latex-match-sectioning-1-keywords
+@vindex font-latex-match-sectioning-2-keywords
+@vindex font-latex-match-sectioning-3-keywords
+@vindex font-latex-match-sectioning-4-keywords
+@vindex font-latex-match-sectioning-5-keywords
+You can make @fontlatex{} aware of your own sectioning commands be
+adding them to the keyword lists:
+@code{font-latex-match-sectioning-0-keywords}
+(@code{font-latex-sectioning-0-face}) @dots{}
+@code{font-latex-match-sectioning-5-keywords}
+(@code{font-latex-sectioning-5-face}).
+
+@vindex font-latex-slide-title-face
+@vindex font-latex-match-slide-title-keywords
+Related to sectioning there is special support for slide titles which
+may be fontified with the face @code{font-latex-slide-title-face}.  You
+can add macros which should appear in this face by customizing the
+variable @code{font-latex-match-slide-title-keywords}.
+
+@subheading Commands for changing fonts
+
+@LaTeX{} provides various macros for changing fonts or font attributes.
+For example, you can select an italic font with @samp{\textit@{...@}} or
+bold with @samp{\textbf@{...@}}.  An alternative way to specify these
+fonts is to use special macros in @TeX{} groups, like @samp{@{\itshape
+...@}} for italics and @samp{@{\bfseries ...@}} for bold.  As mentioned
+above, we call the former variants commands and the latter
+declarations.
+
+Besides the macros for changing fonts provided by @LaTeX{} there is an
+infinite number of other macros---either defined by yourself for logical
+markup or defined by macro packages---which affect the font in the
+typeset text.  While @LaTeX{}'s built-in macros and macros of packages
+known by @AUCTeX{} are already handled by @fontlatex{}, different
+keyword lists per type style and macro type are provided for entering
+your own macros which are listed in the table below.
+
+@vindex font-latex-match-bold-command-keywords
+@vindex font-latex-match-italic-command-keywords
+@vindex font-latex-match-math-command-keywords
+@vindex font-latex-match-type-command-keywords
+@vindex font-latex-match-bold-declaration-keywords
+@vindex font-latex-match-italic-declaration-keywords
+@vindex font-latex-match-type-declaration-keywords
+@table @code
+@item font-latex-match-bold-command-keywords
+Keywords for commands specifying a bold type style.@*
+Face: @code{font-latex-bold-face}
+@item font-latex-match-italic-command-keywords
+Keywords for commands specifying an italic font.@*
+Face: @code{font-latex-italic-face}
+@item font-latex-match-math-command-keywords
+Keywords for commands specifying a math font.@*
+Face: @code{font-latex-math-face}
+@item font-latex-match-type-command-keywords
+Keywords for commands specifying a typewriter font.@*
+Face: @code{font-lock-type-face}
+@item font-latex-match-bold-declaration-keywords
+Keywords for declarations specifying a bold type style.@*
+Face: @code{font-latex-bold-face}
+@item font-latex-match-italic-declaration-keywords
+Keywords for declarations specifying an italic font.@*
+Face: @code{font-latex-italic-face}
+@item font-latex-match-type-declaration-keywords
+Keywords for declarations specifying a typewriter font.@*
+Face: @code{font-latex-type-face}
+@end table
+
+@subheading Deactivating defaults of built-in keyword classes
+
+@vindex font-latex-deactivated-keyword-classes
+@fontlatex{} ships with predefined lists of keywords for the classes
+described above.  You can disable these defaults per class by
+customizing the variable @code{font-latex-deactivated-keyword-classes}.
+This is a list of strings for keyword classes to be deactivated.  Valid
+entries are "warning", "variable", "reference", "function" ,
+"sectioning-0", "sectioning-1", "sectioning-2", "sectioning-3",
+"sectioning-4", "sectioning-5", "textual", "bold-command",
+"italic-command", "math-command", "type-command", "bold-declaration",
+"italic-declaration", "type-declaration".
+
+You can also get rid of certain keywords only.  For example if you want
+to remove highlighting of footnotes as references you can put the
+following stanza into your init file:
+
+@lisp
+(eval-after-load "font-latex"
+  '(setq-default
+    font-latex-match-reference-keywords-local
+    (remove "footnote" font-latex-match-reference-keywords-local)))
+@end lisp
+
+But note that this means fiddling with @fontlatex{}'s internals and is
+not guaranteed to work in future versions of @fontlatex{}.
+
+@subheading User-defined keyword classes
+
+In case the customization options explained above do not suffice for
+your needs, you can specify your own keyword classes by customizing the
+variable @code{font-latex-user-keyword-classes}.
+
+@defopt font-latex-user-keyword-classes
+Every keyword class consists of four parts, a name, a list of keywords,
+a face and a specifier for the type of macros to be highlighted.
+
+When adding new entries, you have to use unique values for the class
+names, i.e. they must not clash with names of the built-in keyword
+classes or other names given by you.  Additionally the names must not
+contain spaces.
+
+The list of keywords defines which commands and declarations should be
+covered by the keyword class.  A keyword can either be a simple command
+name omitting the leading backslash or a list consisting of the command
+name and a string specifying the sequence of arguments for the command.
+
+The face argument can either be an existing face or font specifications
+made by you.  (The latter option is not available on XEmacs.)
+
+There are three alternatives for the type of keywords---``Command with
+arguments'', ``Declaration inside @TeX{} group'' and ``Command without
+arguments''---which correspond with the macro types explained above.
+@end defopt
+
+@node Fontification of quotes
+@subsection Fontification of quotes
+@cindex Quotes, fontification of
+
+Text in quotation marks is displayed with the face
+@code{font-latex-string-face}.  Besides the various forms of opening and
+closing double and single quotation marks, so-called guillemets (<<, >>)
+can be used for quoting.  Because there are two styles of using
+them---French style: << text >>; German style: >>text<<---you can
+customize the variable @code{font-latex-quotes} to tell @fontlatex{}
+which type you are using if the correct value cannot be derived from
+document properties.
+
+@defopt font-latex-quotes
+The default value of @code{font-latex-quotes} is @samp{auto} which means
+that @fontlatex{} will try to derive the correct type of quotation mark
+matching from document properties like the language option supplied to
+the babel @LaTeX{} package.
+
+If the automatic detection fails for you and you mostly use one specific
+style you can set it to a specific language-dependent value as well.
+Set the value to @samp{german} if you are using >>German quotes<< and to
+@samp{french} if you are using << French quotes >>.  @fontlatex{} will
+recognize the different ways these quotes can be given in your source
+code, i.e. (@samp{"<}, @samp{">}), (@samp{<<}, @samp{>>}) and the
+respective 8-bit variants.
+
+If you set @code{font-latex-quotes} to nil, quoted content will not be
+fontified.
+@end defopt
+
+
+@node Fontification of math
+@subsection Fontification of mathematical constructs
+@cindex Math, fontification of
+@cindex Subscript, fontification of
+@cindex Superscript, fontification of
+
+@vindex font-latex-match-math-command-keywords
+@vindex font-latex-math-environments
+In @LaTeX{} mathematics can be indicated by a variety of different
+methods: toggles (like dollar signs), macros and environments.  Math
+constructs known by @fontlatex{} are displayed with the face
+@code{font-latex-math-face}.  Support for dollar signs and shorthands
+like @samp{\(...\)} or @samp{\[...\]} is built-in and not customizable.
+Support for other math macros and environments can be adapted by
+customizing the variables @code{font-latex-match-math-command-keywords}
+and @code{font-latex-math-environments} respectively.
+
+In order to make math constructs more readable, @fontlatex{} displays
+subscript and superscript parts in a smaller font and raised or lowered
+respectively.  This fontification feature can be controlled with the
+variables @code{font-latex-fontify-script} and
+@code{font-latex-script-display}.
+
+@defopt font-latex-fontify-script
+If non-nil, fontify subscript and superscript strings.
+
+Note that this feature is not available on XEmacs, for which it is
+disabled per default.  In GNU Emacs raising and lowering is not enabled
+for versions 21.3 and before due to it working not properly.
+@end defopt
+
+@defopt font-latex-script-display
+Display specification for subscript and superscript content.  The car is
+used for subscript, the cdr is used for superscript.  The feature is
+implemented using so-called display properties.  For information on what
+exactly to specify for the values, see @ref{Other Display Specs, , Other
+Display Specifications, elisp, GNU Emacs Lisp Reference Manual}.
+@end defopt
+
+@node Verbatim content
+@subsection Verbatim macros and environments
+@cindex Verbatim, fontification of
+
+Usually it is not desirable to have content to be typeset verbatim
+highlighted according to @LaTeX{} syntax.  Therefore this content will
+be fontified uniformly with the face @code{font-latex-verbatim-face}.
+
+@vindex LaTeX-verbatim-macros-with-delims
+@vindex LaTeX-verbatim-macros-with-braces
+@vindex LaTeX-verbatim-environments
+@fontlatex{} differentiates three different types of verbatim
+constructs for fontification.  Macros with special characters like | as
+delimiters, macros with braces, and environments.  Which macros and
+environments are recognized is controlled by the variables
+@code{LaTeX-verbatim-macros-with-delims},
+@code{LaTeX-verbatim-macros-with-braces}, and
+@code{LaTeX-verbatim-environments} respectively.
+
+@node Faces
+@subsection Faces used by @fontlatex{}
+@cindex Faces
+
+In case you want to change the colors and fonts used by @fontlatex{}
+please refer to the faces mentioned in the explanations above and use
+@kbd{M-x customize-face RET <face> RET}.  All faces defined by
+@fontlatex{} are accessible through a customization group by typing
+@kbd{M-x customize-group RET font-latex-highlighting-faces RET}.
+
+@node Known problems
+@subsection Known fontification problems
+@cindex Dollar signs, color bleed with
+@cindex Math, fontification problems with
+
+In certain cases the fontification machinery fails to interpret buffer
+contents correctly.  This can lead to color bleed, i.e. large parts of a
+buffer get fontified with an inappropriate face.  A typical situation
+for this to happen is the use of a dollar sign (@samp{$}) in a verbatim
+macro or environment.  If @fontlatex{} is not aware of the verbatim
+construct, it assumes the dollar sign to be a toggle for mathematics and
+fontifies the following buffer content with the respective face until it
+finds a closing dollar sign or till the end of the buffer.
+
+As a remedy you can make the verbatim construct known to @fontlatex{},
+@pxref{Verbatim content}.  If this is not possible, you can insert a
+commented dollar sign (@samp{%$}) at the next suitable end of line as a
+quick workaround.
+@c As a last resort one can set `font-lock-keywords-only', but we should
+@c probably not advise users to do this.
+
+
+@node Folding
+@section Folding Macros and Environments
+@cindex Outlining
+@cindex Folding
+@cindex Reveal
+@cindex Auto-Reveal
+@cindex Hide Macros
+
+A popular complaint about markup languages like @TeX{} and @LaTeX{} is
+that there is too much clutter in the source text and that one cannot
+focus well on the content.  There are macros where you are only
+interested in the content they are enclosing, like font specifiers where
+the content might already be fontified in a special way by font locking.
+Or macros the content of which you only want to see when actually
+editing it, like footnotes or citations.  Similarly you might find
+certain environments or comments distracting when trying to concentrate
+on the body of your document.
+
+With @AUCTeX{}'s folding functionality you can collapse those items and
+replace them by a fixed string, the content of one of their arguments,
+or a mixture of both.  If you want to make the original text visible
+again in order to view or edit it, move point sideways onto the
+placeholder (also called display string) or left-click with the mouse
+pointer on it.  (The latter is currently only supported on Emacs.)  The
+macro or environment will unfold automatically, stay open as long as
+point is inside of it and collapse again once you move point out of it.
+(Note that folding of environments currently does not work in every
+@AUCTeX{} mode.)
+
+In order to use this feature, you have to activate @code{TeX-fold-mode}
+which will activate the auto-reveal feature and the necessary commands
+to hide and show macros and environments.  You can activate the mode in
+a certain buffer by typing the command @kbd{M-x TeX-fold-mode RET} or
+using the keyboard shortcut @kbd{C-c C-o C-f}.  If you want to use it
+every time you edit a @LaTeX{} document, add it to a hook:
+@findex TeX-fold-mode
+@kindex C-c C-o C-f
+
+@lisp
+(add-hook 'LaTeX-mode-hook (lambda ()
+                             (TeX-fold-mode 1)))
+@end lisp
+
+If it should be activated in all @AUCTeX{} modes, use
+@code{TeX-mode-hook} instead of @code{LaTeX-mode-hook}.
+
+Once the mode is active there are several commands available to hide
+and show macros, environments and comments:
+
+@deffn Command TeX-fold-buffer
+@kindex C-c C-o C-b
+(@kbd{C-c C-o C-b}) Hide all foldable items in the current buffer
+according to the setting of @code{TeX-fold-type-list}.
+
+If you want to have this done automatically every time you open a file,
+add it to a hook and make sure the function is called after font locking
+is set up for the buffer.  The following code should accomplish this:
+
+@lisp
+(add-hook 'find-file-hook 'TeX-fold-buffer t)
+@end lisp
+
+The command can be used any time to refresh the whole buffer and fold
+any new macros and environments which were inserted after the last
+invocation of the command.
+@end deffn
+
+@defopt TeX-fold-type-list
+List of symbols determining the item classes to consider for folding.
+This can be macros, environments and comments.  Per default only macros
+and environments are folded.
+@end defopt
+
+@defopt TeX-fold-force-fontify
+In order for all folded content to get the right faces, the whole buffer
+has to be fontified before folding is carried out.
+@code{TeX-fold-buffer} therefore will force fontification of unfontified
+regions.  As this will prolong the time folding takes, you can prevent
+forced fontification by customizing the variable
+@code{TeX-fold-force-fontify}.
+@end defopt
+
+@defopt TeX-fold-preserve-comments
+By default items found in comments will be folded.  If your comments
+often contain unfinished code this might lead to problems.  Give this
+variable a non-nil value and foldable items in your comments will be
+left alone.
+@end defopt
+
+@deffn Command TeX-fold-region
+@kindex C-c C-o C-r
+(@kbd{C-c C-o C-r}) Hide all configured macros in the marked region.
+@end deffn
+
+@deffn Command TeX-fold-paragraph
+@kindex C-c C-o C-p
+(@kbd{C-c C-o C-p}) Hide all configured macros in the paragraph
+containing point.
+@end deffn
+
+@deffn Command TeX-fold-macro
+@kindex C-c C-o C-m
+(@kbd{C-c C-o C-m}) Hide the macro on which point currently is located.
+If the name of the macro is found in @code{TeX-fold-macro-spec-list},
+the respective display string will be shown instead.  If it is not
+found, the name of the macro in sqare brackets or the default string for
+unspecified macros (@code{TeX-fold-unspec-macro-display-string}) will be
+shown, depending on the value of the variable
+@code{TeX-fold-unspec-use-name}.
+@end deffn
+
+@deffn Command TeX-fold-env
+@kindex C-c C-o C-e
+(@kbd{C-c C-o C-e}) Hide the environment on which point currently is
+located.  The behavior regarding the display string is analogous to
+@code{TeX-fold-macro} and determined by the variables
+@code{TeX-fold-env-spec-list} and
+@code{TeX-fold-unspec-env-display-string} respectively.
+@end deffn
+
+@deffn Command TeX-fold-math
+Hide the math macro on which point currently is located.  If the name of
+the macro is found in @code{TeX-fold-math-spec-list}, the respective
+display string will be shown instead.  If it is not found, the name of
+the macro in sqare brackets or the default string for unspecified macros
+(@code{TeX-fold-unspec-macro-display-string}) will be shown, depending
+on the value of the variable @code{TeX-fold-unspec-use-name}.
+@end deffn
+
+@deffn Command TeX-fold-comment
+@kindex C-c C-o C-c
+(@kbd{C-c C-o C-c}) Hide the comment point is located on.
+@end deffn
+
+@deffn Command TeX-fold-clearout-buffer
+@kindex C-c C-o b
+(@kbd{C-c C-o b}) Permanently unfold all macros and environments in the
+current buffer.
+@end deffn
+
+@deffn Command TeX-fold-clearout-region
+@kindex C-c C-o r
+(@kbd{C-c C-o r}) Permanently unfold all macros and environments in the
+marked region.
+@end deffn
+
+@deffn Command TeX-fold-clearout-paragraph
+@kindex C-c C-o p
+(@kbd{C-c C-o p}) Permanently unfold all macros and environments in the
+paragraph containing point.
+@end deffn
+
+@deffn Command TeX-fold-clearout-item
+@kindex C-c C-o i
+(@kbd{C-c C-o i}) Permanently show the macro or environment on which
+point currently is located.  In contrast to temporarily opening the
+macro when point is moved sideways onto it, the macro will be
+permanently unfolded and will not collapse again once point is leaving
+it.
+@end deffn
+
+@deffn Command TeX-fold-dwim
+@kindex C-c C-o C-o
+(@kbd{C-c C-o C-o}) Hide or show items according to the current context.
+If there is folded content, unfold it.  If there is a marked region,
+fold all configured content in this region.  If there is no folded
+content but a macro or environment, fold it.
+@end deffn
+
+@vindex TeX-fold-command-prefix
+In case you want to use a different prefix than @kbd{C-c C-o} for these
+commands you can customize the variable @code{TeX-fold-command-prefix}.
+(Note that this will not change the key binding for activating the
+mode.)
+
+The commands above will only take macros or environments into
+consideration which are specified in the variables
+@code{TeX-fold-macro-spec-list} or @code{TeX-fold-env-spec-list}
+respectively.
+
+@defopt TeX-fold-macro-spec-list
+List of replacement specifiers and macros to fold.  The specifier can be
+a string, an integer or a function symbol.
+
+If you specify a string, it will be used as a display replacement for
+the whole macro.  Numbers in braces, brackets, parens or angle brackets
+will be replaced by the respective macro argument.  For example
+@samp{@{1@}} will be replaced by the first mandatory argument of the
+macro.  One can also define alternatives within the specifier which are
+used if an argument is not found.  Alternatives are separated by
+@samp{||}.  They are most useful with optional arguments.  As an
+example, the default specifier for @samp{\item} is @samp{[1]:||*} which
+means that if there is an optional argument, its value is shown followed
+by a colon.  If there is no optional argument, only an asterisk is used
+as the display string.
+
+If you specify a number as the first element, the content of the
+respective mandatory argument of a @LaTeX{} macro will be used as the
+placeholder.
+
+If the first element is a function symbol, the function will be called
+with all mandatory arguments of the macro and the result of the function
+call will be used as a replacement for the macro.
+
+The placeholder is made by copying the text from the buffer together with
+its properties, i.e. its face as well.  If fontification has not
+happened when this is done (e.g. because of lazy font locking) the
+intended fontification will not show up.  As a workaround you can leave
+Emacs idle a few seconds and wait for stealth font locking to finish
+before you fold the buffer.  Or you just re-fold the buffer with
+@code{TeX-fold-buffer} when you notice a wrong fontification.
+@end defopt
+
+@defopt TeX-fold-env-spec-list
+List of display strings or argument numbers and environments to fold.
+Argument numbers refer to the @samp{\begin} statement.  That means if
+you have e.g. @samp{\begin@{tabularx@}@{\linewidth@}@{XXX@} ...
+\end@{tabularx@}} and specify 3 as the argument number, the resulting
+display string will be ``XXX''.
+@end defopt
+
+@defopt TeX-fold-math-spec-list
+List of display strings and math macros to fold.
+@end defopt
+
+@vindex LaTeX-fold-macro-spec-list
+@vindex LaTeX-fold-env-spec-list
+@vindex LaTeX-fold-math-spec-list
+The variables @code{TeX-fold-macro-spec-list},
+@code{TeX-fold-env-spec-list}, and @code{TeX-fold-math-spec-list} apply
+to any @AUCTeX{} mode.  If you want to make settings which are only
+applied to @LaTeX{} mode, you can use the mode-specific variables
+@code{LaTeX-fold-macro-spec-list}, @code{LaTeX-fold-env-spec-list}, and
+@code{LaTeX-fold-math-spec-list}
+
+@defopt TeX-fold-unspec-macro-display-string
+Default display string for macros which are not specified in
+@code{TeX-fold-macro-spec-list}.
+@end defopt
+
+@defopt TeX-fold-unspec-env-display-string
+Default display string for environments which are not specified in
+@code{TeX-fold-env-spec-list}.
+@end defopt
+
+@defopt TeX-fold-unspec-use-name
+If non-nil the name of the macro or environment surrounded by square
+brackets is used as display string, otherwise the defaults specified in
+@code{TeX-fold-unspec-macro-display-string} or
+@code{TeX-fold-unspec-env-display-string} respectively.
+@end defopt
+
+When you hover with the mouse pointer over folded content, its original
+text will be shown in a tooltip or the echo area depending on Tooltip
+mode being activate.  In order to avoid exorbitantly big tooltips and to
+cater for the limited space in the echo area the content will be cropped
+after a certain amount of characters defined by the variable
+@code{TeX-fold-help-echo-max-length}.
+
+@defopt TeX-fold-help-echo-max-length
+Maximum length of original text displayed in a tooltip or the echo area
+for folded content.  Set it to zero in order to disable this feature.
+@end defopt
+
+
+@node Outline
+@section Outlining the Document
+@cindex Outlining
+@cindex Headers
+@cindex Sections
+@cindex Overview
+@cindex Folding
+
+@AUCTeX{} supports the standard outline minor mode using
+@LaTeX{}/@ConTeXt{} sectioning commands as header lines.  @xref{Outline
+Mode, , Outline Mode, emacs, GNU Emacs Manual}.
+
+You can add your own headings by setting the variable
+@code{TeX-outline-extra}.
+
+@defvar TeX-outline-extra
+List of extra @TeX{} outline levels.
+
+Each element is a list with two entries.  The first entry is the regular
+expression matching a header, and the second is the level of the header.
+A @samp{^} is automatically prepended to the regular expressions in the
+list, so they must match text at the beginning of the line.
+
+See @code{LaTeX-section-list} or @code{ConTeXt-INTERFACE-section-list}
+for existing header levels.
+@end defvar
+
+The following example add @samp{\item} and @samp{\bibliography} headers,
+with @samp{\bibliography} at the same outline level as @samp{\section},
+and @samp{\item} being below @samp{\subparagraph}.
+
+@lisp
+(setq TeX-outline-extra
+      '(("[ \t]*\\\\\\(bib\\)?item\\b" 7)
+       ("\\\\bibliography\\b" 2)))
+@end lisp
+
+You may want to check out the unbundled @file{out-xtra} package for even
+better outline support.  It is available from your favorite emacs lisp
+archive.
+
+@node Processing
+@chapter Starting Processors, Viewers and Other Programs
+
+The most powerful features of @AUCTeX{} may be those allowing you to run
+@TeX{}, @LaTeX{}, @ConTeXt{} and other external commands like Bib@TeX{}
+and @code{makeindex} from within Emacs, viewing and printing the
+results, and moreover allowing you to @emph{debug} your documents.
+
+@cindex tool bar, toolbar
+@vindex LaTeX-enable-toolbar
+@vindex plain-TeX-enable-toolbar
+@AUCTeX{} comes with a special tool bar for @TeX{} and @LaTeX{} which
+provides buttons for the most important commands.  You can enable or
+disable it by customizing the options @code{plain-TeX-enable-toolbar}
+and @code{LaTeX-enable-toolbar} in the @code{TeX-tool-bar} customization
+group.
+
+@menu
+* Commands::                    Invoking external commands.
+* Viewing::                     Invoking external viewers.
+* Debugging::                   Debugging @TeX{} and @LaTeX{} output.
+* Checking::                    Checking the document.
+* Control::                     Controlling the processes.
+* Cleaning::                    Cleaning intermediate and output files.
+* Documentation::               Documentation about macros and packages.
+@end menu
+
+@node Commands
+@section Executing Commands
+@cindex Formatting
+@cindex Running @LaTeX{}
+@cindex Running @TeX{}
+@cindex @LaTeX{}
+@cindex @TeX{}
+@cindex Running commands
+@cindex Default command
+@cindex Header
+@cindex Trailer
+@cindex Setting the header
+@cindex Setting the trailer
+@cindex Region
+@cindex Region file
+@cindex Setting the default command
+@cindex Commands
+@cindex External Commands
+@cindex Indexing
+@cindex Making an index
+@cindex Running @code{makeindex}
+@cindex @code{makeindex}
+@cindex Bib@TeX{}
+@cindex Bibliography
+@cindex Literature
+@cindex Running Bib@TeX{}
+@cindex Making a bibliography
+@cindex Printing
+@cindex Writing to a printer
+
+Formatting the document with @TeX{}, @LaTeX{} or @ConTeXt{}, viewing
+with a previewer, printing the document, running Bib@TeX{}, making an
+index, or checking the document with @command{lacheck} or
+@command{chktex} all require running an external command.
+
+@menu
+* Starting a Command::          Starting a Command on a Document or Region
+* Selecting a Command::         Selecting and Executing a Command
+* Processor Options::           Options for @TeX{} Processors
+@end menu
+
+@node Starting a Command
+@subsection Starting a Command on a Document or Region
+
+There are two ways to run an external command, you can either run it on
+the current document with @code{TeX-command-master}, or on the current
+region with @code{TeX-command-region}.  A special case of running @TeX{}
+on a region is @code{TeX-command-buffer} which differs from
+@code{TeX-command-master} if the current buffer is not its own master
+file.
+
+@deffn Command TeX-command-master
+@kindex C-c C-c
+(@kbd{C-c C-c})  Query the user for a command, and run it on the master
+file associated with the current buffer.  The name of the master file is
+controlled by the variable @code{TeX-master}.  The available commands are
+controlled by the variable @code{TeX-command-list}.
+@vindex TeX-master
+@vindex TeX-command-list
+@end deffn
+
+@deffn Command TeX-command-region
+@kindex C-c C-r
+(@kbd{C-c C-r}) Query the user for a command, and run it on the contents
+of the selected region.  The region contents are written into the region
+file, after extracting the header and trailer from the master file.  If
+mark is inactive (which can happen with Transient Mark mode), use the
+old region.  See also the command @code{TeX-pin-region} about how to fix
+a region.
+
+The name of the region file is controlled by the variable
+@code{TeX-region}.  The name of the master file is controlled by the
+variable @code{TeX-master}.  The header is all text up to the line
+matching the regular expression @code{TeX-header-end}.  The trailer is
+all text from the line matching the regular expression
+@code{TeX-trailer-start}.  The available commands are controlled by the
+variable @code{TeX-command-list}.
+@vindex TeX-region
+@vindex TeX-header-end
+@vindex TeX-trailer-start
+@vindex TeX-master
+@vindex TeX-command-list
+@end deffn
+
+@deffn Command TeX-command-buffer
+@kindex C-c C-b
+(@kbd{C-c C-b}) Query the user for a command, and apply it to the
+contents of the current buffer.  The buffer contents are written into
+the region file, after extracting the header and trailer from the master
+file.  The command is then actually run on the region file.  See above
+for details.
+@end deffn
+
+@defopt TeX-region
+The name of the file for temporarily storing the text when formatting
+the current region.
+@end defopt
+
+@defopt TeX-header-end
+A regular expression matching the end of the header.  By default, this
+is @samp{\begin@{document@}} in @LaTeX{} mode and @samp{%**end of
+header} in @TeX{} mode.
+@end defopt
+
+@defopt TeX-trailer-start
+A regular expression matching the start of the trailer.  By default,
+this is @samp{\end@{document@}} in @LaTeX{} mode and @samp{\bye} in
+@TeX{} mode.
+@end defopt
+
+If you want to change the values of @code{TeX-header-end} and
+@code{TeX-trailer-start} you can do this for all files by setting the
+variables in a mode hook or per file by specifying them as file
+variables (@pxref{File Variables,,,emacs,The Emacs Editor}).
+
+@deffn Command TeX-pin-region
+@kindex C-c C-t C-r
+(@kbd{C-c C-t C-r}) If you don't have a mode like Transient Mark mode
+active, where marks get disabled automatically, the region would need to
+get properly set before each call to @code{TeX-command-region}.  If you
+fix the current region with @kbd{C-c C-t C-r}, then it will get used for
+more commands even though mark and point may change.  An explicitly
+activated mark, however, will always define a new region when calling
+@code{TeX-command-region}.
+@end deffn
+
+@AUCTeX{} will allow one process for each document, plus one process
+for the region file to be active at the same time.  Thus, if you are
+editing @var{n} different documents, you can have @var{n} plus one
+processes running at the same time.  If the last process you started was
+on the region, the commands described in @ref{Debugging} and
+@ref{Control} will work on that process, otherwise they will work on the
+process associated with the current document.
+
+@node Selecting a Command
+@subsection Selecting and Executing a Command
+
+Once you started the command selection with @kbd{C-c C-c}, @kbd{C-c C-s}
+or @kbd{C-c C-b} you will be prompted for the type of command.
+@AUCTeX{} will try to guess which command is appropriate in the given
+situation and propose it as default.  Usually this is a processor like
+@samp{TeX} or @samp{LaTeX} if the document was changed or a viewer if
+the document was just typeset.  Other commands can be selected in the
+minibuffer with completion support by typing @key{TAB}.
+
+@vindex TeX-command-list
+@vindex TeX-expand-list
+The available commands are defined by the variable
+@code{TeX-command-list}.  Per default it includes commands for
+typesetting the document (e.g. @samp{LaTeX}), for viewing the output
+(@samp{View}), for printing (@samp{Print}), for generating an index
+(@samp{Index}) or for spell checking (@samp{Spell}) to name but a few.
+You can also add your own commands by adding entries to
+@code{TeX-command-list}.  Refer to its doc string for information about
+its syntax.  You might also want to look at @code{TeX-expand-list} to
+learn about the expanders you can use in @code{TeX-command-list}.
+
+Note that the default of the variable occasionally changes.  Therefore
+it is advisable to add to the list rather than overwriting it.  You can
+do this with a call to @code{add-to-list} in your init file.  For
+example, if you wanted to add a command for running a program called
+@samp{foo} on the master or region file, you could do this with the
+following form.
+
+@lisp
+(eval-after-load "tex"
+  '(add-to-list 'TeX-command-list
+               '("Foo" "foo %s" TeX-run-command t t :help "Run foo") t))
+@end lisp
+
+As mentioned before, @AUCTeX{} will try to guess what command you want
+to invoke.  If you want to use another command than @samp{TeX},
+@samp{LaTeX} or whatever processor @AUCTeX{} thinks is appropriate for
+the current mode, set the variable @code{TeX-command-default}.  You can
+do this for all files by setting it in a mode hook or per file by
+specifying it as a file variable (@pxref{File Variables,,,emacs,The
+Emacs Editor}).
+
+@defopt TeX-command-default
+The default command to run in this buffer.  Must be an entry in
+@code{TeX-command-list}.
+@end defopt
+
+After confirming a command to execute, @AUCTeX{} will try to save any
+buffers related to the document, and check if the document needs to be
+reformatted.  If the variable @code{TeX-save-query} is non-nil,
+@AUCTeX{} will query before saving each file.  By default @AUCTeX{} will
+check emacs buffers associated with files in the current directory, in
+one of the @code{TeX-macro-private} directories, and in the
+@code{TeX-macro-global} directories.  You can change this by setting the
+variable @code{TeX-check-path}.
+
+@defopt TeX-check-path
+Directory path to search for dependencies.
+
+If nil, just check the current file.
+Used when checking if any files have changed.
+@end defopt
+
+@node Processor Options
+@subsection Options for @TeX{} Processors
+
+There are some options you can customize affecting which processors are
+invoked or the way this is done and which output they produce as a
+result.  These options control if @acronym{DVI} or @acronym{PDF} output
+should be produced, if @TeX{} should be started in interactive or
+nonstop mode, if source specials or a Sync@TeX{} file should be produced
+for making inverse and forward search possible or which @TeX{} engine
+should be used instead of regular @TeX{}, like PDF@TeX{}, Omega or
+Xe@TeX{}.
+
+@deffn Command TeX-PDF-mode
+@kindex C-c C-t C-p
+@vindex TeX-PDF-mode
+@cindex PDF mode
+(@kbd{C-c C-t C-p})
+This command toggles the @acronym{PDF} mode of @AUCTeX{}, a buffer-local
+minor mode.  You can customize @code{TeX-PDF-mode} to give it a
+different default.  The default is used when @AUCTeX{} does not have
+additional clue about what a document might want.  This option usually
+results in calling either PDF@TeX{} or ordinary @TeX{}.
+@end deffn
+
+@defopt TeX-DVI-via-PDFTeX
+If this is set, @acronym{DVI} will also be produced by calling
+PDF@TeX{}, setting @code{\pdfoutput=0}.  This makes it possible to use
+PDF@TeX{} features like character protrusion even when producing
+@acronym{DVI} files.  Contemporary @TeX{} distributions do this anyway,
+so that you need not enable the option within @AUCTeX{}.
+@end defopt
+
+@deffn Command TeX-interactive-mode
+@kindex C-c C-t C-i
+@vindex TeX-interactive-mode
+(@kbd{C-c C-t C-i}) This command toggles the interactive mode of
+@AUCTeX{}, a global minor mode.  You can customize
+@code{TeX-interactive-mode} to give it a different default.  In
+interactive mode, @TeX{} will pause with an error prompt when errors are
+encountered and wait for the user to type something.
+@end deffn
+
+@cindex I/O correlation
+@cindex SyncTeX
+@cindex Source specials
+@cindex PDFSync
+@deffn Command TeX-source-correlate-mode
+@kindex C-c C-t C-s
+@vindex TeX-source-correlate-mode
+(@kbd{C-c C-t C-s}) Toggles support for forward and inverse search.
+Forward search refers to jumping to the place in the previewed document
+corresponding to where point is located in the document source and
+inverse search to the other way round.  @xref{I/O Correlation}.
+
+You can permanently activate @code{TeX-source-correlate-mode} by
+customizing the variable @code{TeX-source-correlate-mode}.  There is a
+bunch of customization options for the mode, use @kbd{M-x
+customize-group @key{RET} TeX-view @key{RET}} to find out more.
+
+@vindex TeX-source-correlate-method
+@AUCTeX{} is aware of three different means to do I/O correlation:
+source specials (only DVI output), the pdfsync @LaTeX{} package (only
+PDF output) and Sync@TeX{}.  The choice between source specials and
+Sync@TeX{} can be controlled with the variable
+@code{TeX-source-correlate-method}.
+
+Should you use source specials it has to be stressed @emph{very}
+strongly however, that source specials can cause differences in page
+breaks and spacing, can seriously interfere with various packages and
+should thus @emph{never} be used for the final version of a document.
+In particular, fine-tuning the page breaks should be done with source
+specials switched off.
+@end deffn
+
+@AUCTeX{} also allows you to easily select different @TeX{} engines for
+processing, either by using the entries in the @samp{TeXing Options}
+submenu below the @samp{Command} menu or by calling the function
+@code{TeX-engine-set}.  These eventually set the variable
+@code{TeX-engine} which you can also modify directly.
+
+@defopt TeX-engine
+This variable allows you to choose which @TeX{} engine should be used
+for typesetting the document, i.e. the executables which will be used
+when you invoke the @samp{TeX} or @samp{LaTeX} commands.  The value
+should be one of the symbols defined in @code{TeX-engine-alist-builtin}
+or @code{TeX-engine-alist}.  The symbols @samp{default}, @samp{xetex},
+@samp{luatex} and @samp{omega} are available from the built-in list.
+@end defopt
+
+Note that @code{TeX-engine} is buffer-local, so setting the variable
+directly or via the above mentioned menu or function will not take
+effect in other buffers.  If you want to activate an engine for all
+@AUCTeX{} modes, set @code{TeX-engine} in your init file, e.g. by using
+@kbd{M-x customize-variable <RET>}.  If you want to activate it for a
+certain @AUCTeX{} mode only, set the variable in the respective mode
+hook.  If you want to activate it for certain files, set it through file
+variables (@pxref{File Variables,,,emacs,The Emacs Editor}).
+
+@vindex TeX-command
+@vindex LaTeX-command
+@vindex TeX-Omega-command
+@vindex LaTeX-Omega-command
+@vindex ConTeXt-engine
+@vindex ConTeXt-Omega-engine
+@vindex TeX-engine-alist
+@vindex TeX-engine-alist-builtin
+Should you need to change the executable names related to the different
+engine settings, there are some variables you can tweak.  Those are
+@code{TeX-command}, @code{LaTeX-command}, @code{TeX-Omega-command},
+@code{LaTeX-Omega-command}, @code{ConTeXt-engine} and
+@code{ConTeXt-Omega-engine}.  The rest of the executables is defined
+directly in @code{TeX-engine-alist-builtin}.  If you want to override an
+entry from that, add an entry to @code{TeX-engine-alist} that starts
+with the same symbol as that the entry in the built-in list and specify
+the executables you want to use instead.  You can also add entries to
+@code{TeX-engine-alist} in order to add support for engines not covered
+per default.
+
+@defopt TeX-engine-alist
+Alist of TeX engines and associated commands.  Each entry is a list with
+a maximum of five elements.  The first element is a symbol used to
+identify the engine.  The second is a string describing the engine.  The
+third is the command to be used for plain TeX.  The fourth is the
+command to be used for LaTeX.  The fifth is the command to be used for
+the @samp{--engine} parameter of ConTeXt's @samp{texexec} program.  Each
+command can either be a variable or a string.  An empty string or nil
+means there is no command available.
+@end defopt
+
+You can customize @AUCTeX{} to show the processor output as it is
+produced.
+
+@defopt TeX-show-compilation
+If non-nil, the output of @TeX{} compilation is shown in another window.
+@end defopt
+
+@node Viewing
+@section Viewing the Formatted Output
+@cindex Viewing
+@cindex Previewing
+@cindex Starting a previewer
+
+@AUCTeX{} allows you to start external programs for previewing the
+formatted output of your document.
+
+@menu
+* Starting Viewers::            Starting viewers
+* I/O Correlation::             Forward and inverse search
+@end menu
+
+@node Starting Viewers
+@subsection Starting Viewers
+
+Viewers are normally invoked by pressing @kbd{C-c C-c} once the document
+is formatted, which will propose the View command, or by activating the
+respective entry in the Command menu.  Alternatively you can type
+@kbd{C-c C-v} which calls the function @code{TeX-view}.
+
+@deffn Command TeX-view
+@kindex C-c C-v
+(@kbd{C-c C-v}) Start a viewer without confirmation.  The viewer is
+started either on a region or the master file, depending on the last
+command issued.  This is especially useful for jumping to the location
+corresponding to point in the viewer when using
+@code{TeX-source-correlate-mode}.
+@end deffn
+
+@AUCTeX{} will try to guess which type of viewer (@acronym{DVI},
+PostScript or @acronym{PDF}) has to be used and what options are to be
+passed over to it.  This decision is based on the output files present
+in the working directory as well as the class and style options used in
+the document.  For example, if there is a @acronym{DVI} file in your
+working directory, a @acronym{DVI} viewer will be invoked.  In case of a
+@acronym{PDF} file it will be a @acronym{PDF} viewer.  If you specified
+a special paper format like @samp{a5paper} or use the @samp{landscape}
+option, this will be passed to the viewer by the appropriate options.
+Especially some @acronym{DVI} viewers depend on this kind of information
+in order to display your document correctly.  In case you are using
+@samp{pstricks} or @samp{psfrag} in your document, a @acronym{DVI}
+viewer cannot display the contents correctly and a PostScript viewer
+will be invoked instead.
+
+The association between the tests for the conditions mentioned above and
+the viewers is made in the variable @code{TeX-view-program-selection}.
+Therefore this variable is the starting point for customization if you
+want to use other viewers than the ones suggested by default.
+
+@defopt TeX-view-program-selection
+This is a list of predicates and viewers which is evaluated from front
+to back in order to find out which viewer to call under the given
+conditions.  In the first element of each list item you can reference
+one or more predicates defined in @code{TeX-view-predicate-list} or
+@code{TeX-view-predicate-list-builtin}.  In the second element you can
+reference a viewer defined in @code{TeX-view-program-list} or
+@code{TeX-view-program-list-builtin}.  The viewer of the first item with
+a positively evaluated predicate is selected.
+@end defopt
+
+So @code{TeX-view-program-selection} only contains references to the
+actual implementations of predicates and viewer commands respectively
+which can be found elsewhere.  @AUCTeX{} comes with a set of
+preconfigured predicates and viewer commands which are stored in the
+variables @code{TeX-view-predicate-list-builtin} and
+@code{TeX-view-program-list-builtin} respectively.  If you are not
+satisfied with those and want to overwrite one of them or add your own
+definitions, you can do so via the variables
+@code{TeX-view-predicate-list} and @code{TeX-view-program-list}.
+
+@defopt TeX-view-predicate-list
+This is a list of predicates for viewer selection and invocation.  The
+first element of each list item is a symbol and the second element a
+Lisp form to be evaluated.  The form should return nil if the predicate
+is not fulfilled.
+
+A built-in predicate from @code{TeX-view-predicate-list-builtin} can be
+overwritten by defining a new predicate with the same symbol.
+@end defopt
+
+@defopt TeX-view-program-list
+This is a list of viewer specifications each consisting of a symbolic
+name and either a command line or a function to be invoked when the
+viewer is called.  If a command line is used, parts of it can be
+conditionalized by prefixing them with predicates from
+@code{TeX-view-predicate-list} or
+@code{TeX-view-predicate-list-builtin}.  (See the doc string for the
+exact format to use.)  The command line can also contain placeholders as
+defined in @code{TeX-expand-list} which are expanded before the viewer
+is called.
+
+A built-in viewer spec from @code{TeX-view-program-list-builtin} can be
+overwritten by defining a new viewer spec with the same name.
+@end defopt
+
+Note that the viewer selection and invocation as described above will
+only work if certain default settings in @AUCTeX{} are intact.  For one,
+the whole viewer selection machinery will only be triggered if the
+@samp{%V} expander in @code{TeX-expand-list} is unchanged.  So if you
+have trouble with the viewer invocation you might check if there is an
+older customization of the variable in place.  In addition, the use of a
+function in @code{TeX-view-program-list} only works if the View command
+in @code{TeX-command-list} makes use of the hook
+@code{TeX-run-discard-or-function}.
+
+Note also that the implementation described above replaces an older one
+which was less flexible.  This old implementation works with the
+variables @code{TeX-output-view-style} and @code{TeX-view-style} which
+are used to associate file types and style options with viewers.  If
+desired you can reactivate it by using the placeholder @samp{%vv} for
+the View command in @code{TeX-command-list}.  Note however, that it is
+bound to be removed from @AUCTeX{} once the new implementation proved to
+be satisfactory.  For the time being, find a short description of the
+mentioned customization options below.
+
+@defopt TeX-output-view-style
+List of output file extensions, style options and view options.  Each
+item of the list consists of three elements.  If the first element (a
+regular expression) matches the output file extension, and the second
+element (a regular expression) matches the name of one of the style
+options, any occurrence of the string @code{%V} in a command in
+@code{TeX-command-list} will be replaced with the third element.
+@end defopt
+
+@defopt TeX-view-style
+List of style options and view options.  This is the predecessor of
+@code{TeX-output-view-style} which does not provide the possibility to
+specify output file extensions.  It is used as a fallback in case none
+of the alternatives specified in @code{TeX-output-view-style} match.  In
+case none of the entries in @code{TeX-view-style} match either, no
+suggestion for a viewer is made.
+@end defopt
+
+@node I/O Correlation
+@subsection Forward and Inverse Search
+@cindex Inverse search
+@cindex Forward search
+@cindex I/O correlation
+@cindex Source specials
+@cindex SyncTeX
+@cindex PDFSync
+
+Forward and inverse search refer to the correlation between the document
+source in the editor and the typeset document in the viewer.  Forward
+search allows you to jump to the place in the previewed document
+corresponding to a certain line in the document source and inverse
+search vice versa.
+
+@findex TeX-source-correlate-mode
+@AUCTeX{} supports three methods for forward and inverse search: source
+specials (only DVI output), the pdfsync @LaTeX{} package (only PDF
+output) and Sync@TeX{} (any type of output).  If you want to make use of
+forward and inverse searching with source specials or Sync@TeX{}, switch
+on @code{TeX-source-correlate-mode}.  @xref{Processor Options}, on how
+to do that.  The use of the pdfsync package is detected automatically if
+document parsing is enabled.
+
+@findex TeX-view
+Forward search happens automatically upon calling the viewer, e.g. by
+typing @kbd{C-c C-v} (@code{TeX-view}).  This will open the viewer or
+bring it to front and display the output page corresponding to the
+position of point in the source file.  @AUCTeX{} will automatically pass
+the necessary command line options to the viewer for this to happen.
+
+@vindex TeX-source-correlate-start-server
+Upon opening the viewer you will be asked if you want to start a server
+process (Gnuserv or Emacs server) which is necessary for inverse search.
+This happens only if there is no server running already.  You can
+customize the variable @code{TeX-source-correlate-start-server} to
+inhibit the question and always or never start the server respectively.
+
+@defopt TeX-source-correlate-start-server
+If @code{TeX-source-correlate-mode} is active and a viewer is invoked,
+the default behavior is to ask if a server process should be started.
+Set this variable to @code{t} if the question should be inhibited and
+the server should always be started.  Set it to @code{nil} if the server
+should never be started.  Inverse search will not be available in the
+latter case.
+@end defopt
+
+Inverse search, i.e. jumping to the part of your document source in
+Emacs corresponding to a certain position in the viewer, is triggered
+from the viewer, typically by a mouse click.  Refer to the documentation
+of your viewer to find out how it has to be configured and what you have
+to do exactly.  In xdvi you normally have to use @kbd{C-down-mouse-1}.
+
+@node Debugging
+@section Catching the errors
+@cindex Debugging
+@cindex Errors
+@cindex Parsing errors
+@cindex Parsing TeX output
+@cindex Next error
+@cindex Parsing @LaTeX{} errors
+@cindex Overfull boxes
+@cindex Bad boxes
+@cindex Underfull boxes
+
+Once you've formatted your document you may `debug' it, i.e. browse
+through the errors (La)@TeX{} reported.
+
+@deffn Command TeX-next-error
+@kindex C-c `
+(@kbd{C-c `})  Go to the next error reported by @TeX{}.  The view will
+be split in two, with the cursor placed as close as possible to the
+error in the top view.  In the bottom view, the error message will be
+displayed along with some explanatory text.
+@end deffn
+
+Normally @AUCTeX{} will only report real errors, but you may as well
+ask it to report `bad boxes' and warnings as well.
+
+@deffn Command TeX-toggle-debug-bad-boxes
+@kindex C-c C-t C-b
+(@kbd{C-c C-t C-b}) Toggle whether @AUCTeX{} should stop at bad boxes
+(i.e. overfull and underfull boxes) as well as normal errors.
+@end deffn
+
+@deffn Command TeX-toggle-debug-warnings
+@kindex C-c C-t C-w
+(@kbd{C-c C-t C-w}) Toggle whether @AUCTeX{} should stop at warnings as
+well as normal errors.
+@end deffn
+
+As default, @AUCTeX{} will display a special help buffer containing the
+error reported by @TeX{} along with the documentation.  There is however
+an `expert' option, which allows you to display the real @TeX{} output.
+
+@defopt TeX-display-help
+If t @AUCTeX{} will automatically display a help text whenever an error
+is encountered using @code{TeX-next-error} (@kbd{C-c `}).  If nil a
+terse information about the error is displayed in the echo area.  If
+@code{expert} @AUCTeX{} will display the output buffer with the raw
+@TeX{} output.
+@end defopt
+
+@node Checking
+@section Checking for problems
+@cindex Checking
+@cindex @code{lacheck}
+@cindex @code{chktex}
+@cindex Finding errors
+@cindex Running @code{lacheck}
+@cindex Running @code{chktex}
+@cindex Style
+@cindex Problems
+
+Running @TeX{} or @LaTeX{} will only find regular errors in the
+document, not examples of bad style.  Furthermore, description of the
+errors may often be confusing.  The utility @code{lacheck} can be used
+to find style errors, such as forgetting to escape the space after an
+abbreviation or using @samp{...} instead of @samp{\ldots} and many other
+problems like that.  You start @code{lacheck} with @kbd{C-c C-c Check
+@key{RET}}.  The result will be a list of errors in the
+@samp{*compilation*} buffer.  You can go through the errors with
+@kbd{C-x `} (@code{next-error}, @pxref{Compilation,,,emacs,The Emacs
+Editor}), which will move point to the location of the next error.
+
+Another newer program which can be used to find errors is @code{chktex}.
+It is much more configurable than @code{lacheck}, but doesn't find all
+the problems @code{lacheck} does, at least in its default configuration.
+You must install the programs before using them, and for @code{chktex}
+you may also need modify @code{TeX-command-list} unless you use its
+@code{lacheck} compatibility wrapper.  You can get @code{lacheck} from
+@file{<URL:ftp://ftp.ctan.org/tex-archive/support/lacheck/>} or
+alternatively @code{chktex} from
+@file{<URL:ftp://ftp.ctan.org/tex-archive/support/chktex/>}.
+
+@node Control
+@section Controlling the output
+@cindex Controlling the output
+@cindex Output
+@cindex Redisplay output
+@cindex Processes
+@cindex Killing a process
+@cindex Finding the master file
+@cindex Master file
+@cindex Stopping a process
+@cindex Current file
+@cindex Finding the current file
+
+A number of commands are available for controlling the output of an
+application running under @AUCTeX{}
+
+@deffn Command TeX-kill-job
+@kindex C-c C-k
+(@kbd{C-c C-k})  Kill currently running external application.
+This may be either of @TeX{}, @LaTeX{}, previewer, Bib@TeX{}, etc.
+@end deffn
+
+@deffn Command TeX-recenter-output-buffer
+@kindex C-c C-l
+(@kbd{C-c C-l})  Recenter the output buffer so that the bottom line is
+visible.
+@end deffn
+
+@deffn Command TeX-home-buffer
+@kindex C-c ^
+(@kbd{C-c ^}) Go to the `master' file in the document associated with
+the current buffer, or if already there, to the file where the current
+process was started.
+@end deffn
+
+@node Cleaning
+@section Cleaning intermediate and output files
+@cindex Cleaning
+
+@deffn Command TeX-clean
+@vindex plain-TeX-clean-intermediate-suffixes
+@vindex plain-TeX-clean-output-suffixes
+@vindex LaTeX-clean-intermediate-suffixes
+@vindex LaTeX-clean-output-suffixes
+@vindex docTeX-clean-intermediate-suffixes
+@vindex docTeX-clean-output-suffixes
+@vindex Texinfo-clean-intermediate-suffixes
+@vindex Texinfo-clean-output-suffixes
+@vindex ConTeXt-clean-intermediate-suffixes
+@vindex ConTeXt-clean-output-suffixes
+Remove generated intermediate files.  In case a prefix argument is
+given, remove output files as well.
+
+Canonical access to the function is provided by the @samp{Clean} and
+@samp{Clean All} entries in @code{TeX-command-list}, invokable with
+@kbd{C-c C-c} or the Command menu.
+
+The patterns governing which files to remove can be adapted separately
+for each @AUCTeX{} mode by means of the variables
+@code{plain-TeX-clean-intermediate-suffixes},
+@code{plain-TeX-clean-output-suffixes},
+@code{LaTeX-clean-intermediate-suffixes},
+@code{LaTeX-clean-output-suffixes},
+@code{docTeX-clean-intermediate-suffixes},
+@code{docTeX-clean-output-suffixes},
+@code{Texinfo-clean-intermediate-suffixes},
+@code{Texinfo-clean-output-suffixes},
+@code{ConTeXt-clean-intermediate-suffixes} and
+@code{ConTeXt-clean-output-suffixes}.
+@end deffn
+
+@defopt TeX-clean-confirm
+Control if deletion of intermediate and output files has to be confirmed
+before it is actually done.  If non-nil, ask before deleting files.
+@end defopt
+
+@node Documentation
+@section Documentation about macros and packages
+@cindex Documentation
+
+@deffn Command TeX-doc
+@kindex C-c ?
+(@kbd{C-c ?})  Get documentation about macros, packages or @TeX{} &
+Co. in general.  The function will prompt for the name of a command or
+manual, providing a list of available keywords for completion.  If point
+is on a command or word with available documentation, this will be
+suggested as default.
+
+In case no documentation could be found, a prompt for querying the
+@samp{texdoc} program is shown, should the latter be available.
+
+The command can be invoked by the key binding mentioned above as well as
+the @samp{Find Documentation...} entry in the mode menu.
+@end deffn
+
+@node Customization
+@chapter Customization and Extension
+
+@menu
+* Modes and Hooks::             Modes and Hooks
+* Multifile::                   Multifile Documents
+* Parsing Files::               Automatic Parsing of @TeX{} Files
+* Internationalization::        Language Support
+* Automatic::                   Automatic Customization
+* Style Files::                 Writing Your Own Style Support
+@end menu
+
+@node Modes and Hooks
+@section Modes and Hooks
+
+@AUCTeX{} supports a wide variety of derivatives and extensions of
+@TeX{}.  Besides plain @TeX{} those are @LaTeX{}, AMS-@TeX{},
+@ConTeXt{}, Texinfo and doc@TeX{}.  For each of them there is a separate
+major mode in @AUCTeX{} and each major mode runs @code{text-mode-hook},
+@code{TeX-mode-hook} as well as a hook special to the mode in this
+order.  The following table provides an overview of the respective mode
+functions and hooks.
+
+@multitable {Plain @TeX{}} {@code{plain-TeX-mode}} {@code{plain-TeX-mode-hook}}
+@headitem Type @tab Mode function @tab Hook
+@item Plain @TeX{} @tab @code{plain-TeX-mode} @tab @code{plain-TeX-mode-hook}
+@item @LaTeX{}     @tab @code{LaTeX-mode}     @tab @code{LaTeX-mode-hook}
+@item AMS-@TeX{}   @tab @code{ams-tex-mode}   @tab @code{AmS-TeX-mode-hook}
+@item @ConTeXt{}   @tab @code{ConTeXt-mode}   @tab @code{ConTeXt-mode-hook}
+@item Texinfo      @tab @code{Texinfo-mode}   @tab @code{Texinfo-mode-hook}
+@item Doc@TeX{}    @tab @code{docTeX-mode}    @tab @code{docTeX-mode-hook}
+@end multitable
+
+If you need to make a customization via a hook which is only relevant
+for one of the modes listed above, put it into the respective mode hook,
+if it is relevant for any @AUCTeX{} mode, add it to @code{TeX-mode-hook}
+and if it is relevant for all text modes, append it to
+@code{text-mode-hook}.
+
+@node Multifile
+@section Multifile Documents
+@cindex Multifile Documents
+@cindex Documents
+@cindex Documents with multiple files
+@cindex Multiple Files
+@cindex Many Files
+@cindex Including
+@cindex \include
+@cindex Inputing
+@cindex \input
+@cindex Master file
+
+You may wish to spread a document over many files (as you are likely to do if
+there are multiple authors, or if you have not yet discovered the power
+of the outline commands (@pxref{Outline})).  This can be done by having a
+``master'' file in which you include the various files with the @TeX{}
+macro @samp{\input} or the @LaTeX{} macro @samp{\include}.  These
+files may also include other files themselves.  However, to format the
+document you must run the commands on the top level master file.
+
+When you, for example, ask @AUCTeX{} to run a command on the master file,
+it has no way of knowing the name of the master file.  By default,
+it will assume that the current file is the master file.  If you insert
+the following in your @file{.emacs} file @AUCTeX{} will use a more
+advanced algorithm.
+
+@lisp
+(setq-default TeX-master nil) ; Query for master file.
+@end lisp
+
+If @AUCTeX{} finds the line indicating the end of the header in a master
+file (@code{TeX-header-end}), it can figure out for itself that this is
+a master file.  Otherwise, it will ask for the name of the master file
+associated with the buffer.  To avoid asking you again, @AUCTeX{} will
+automatically insert the name of the master file as a file variable
+(@pxref{File Variables,,,emacs,The Emacs Editor}).  You can also insert
+the file variable yourself, by putting the following text at the end of
+your files.
+@findex TeX-header-end
+
+@example
+%%% Local Variables:
+%%% TeX-master: "master"
+%%% End:
+@end example
+
+You should always set this variable to the name of the top level document.  If
+you always use the same name for your top level documents, you can set
+@code{TeX-master} in your @file{.emacs} file.
+
+@lisp
+(setq-default TeX-master "master") ; All master files called "master".
+@end lisp
+
+@defopt TeX-master
+The master file associated with the current buffer.  If the file being
+edited is actually included from another file, then you can tell @AUCTeX{}
+the name of the master file by setting this variable.  If there are
+multiple levels of nesting, specify the top level file.
+
+If this variable is @code{nil}, @AUCTeX{} will query you for the
+name.
+
+If the variable is @code{t}, then @AUCTeX{} will assume the file is a master
+file itself.
+
+If the variable is @code{shared}, then @AUCTeX{} will query for the name,
+but will not change the file.
+@end defopt
+
+@defopt TeX-one-master
+Regular expression matching ordinary @TeX{} files.
+
+You should set this variable to match the name of all files, for which
+it is a good idea to append a @code{TeX-master} file variable entry
+automatically.  When @AUCTeX{} adds the name of the master file as a
+file variable, it does not need to ask next time you edit the file.
+
+If you dislike @AUCTeX{} automatically modifying your files, you can
+set this variable to @samp{"<none>"}.  By default, @AUCTeX{} will modify
+any file with an extension of @samp{.tex}.
+@end defopt
+
+@deffn Command TeX-master-file-ask
+@kindex C-c _
+(@kbd{C-c _}) Query for the name of a master file and add the respective
+File Variables (@pxref{File Variables,,,emacs,The Emacs Editor}) to the
+file for setting this variable permanently.
+
+@AUCTeX{} will not ask for a master file when it encounters existing
+files.  This function shall give you the possibility to insert the
+variable manually.
+@end deffn
+
+@AUCTeX{} keeps track of macros, environments, labels, and style
+files that are used in a given document.  For this to work with
+multifile documents, @AUCTeX{} has to have a place to put the
+information about the files in the document.  This is done by having an
+@file{auto} subdirectory placed in the directory where your document is
+located.  Each time you save a file, @AUCTeX{} will write information
+about the file into the @file{auto} directory.  When you load a file,
+@AUCTeX{} will read the information in the @file{auto} directory
+about the file you loaded @emph{and the master file specified by
+@code{TeX-master}}.  Since the master file (perhaps indirectly) includes
+all other files in the document, @AUCTeX{} will get information from
+all files in the document.  This means that you will get from each file,
+for example, completion for all labels defined anywhere in the document.
+
+@AUCTeX{} will create the @file{auto} directory automatically if
+@code{TeX-auto-save} is non-nil.  Without it, the files in the document
+will not know anything about each other, except for the name of the
+master file.  @xref{Automatic Local}.
+
+@deffn Command TeX-save-document
+@kindex C-c C-d
+(@kbd{C-c C-d}) Save all buffers known to belong to the current document.
+@end deffn
+
+@defopt TeX-save-query
+If non-nil, then query the user before saving each file with
+@code{TeX-save-document}.
+@end defopt
+
+
+@node Parsing Files
+@section Automatic Parsing of @TeX{} Files
+@cindex Parsing @TeX{}
+@cindex Automatic Parsing
+@cindex Tabs
+@cindex Tabify
+@cindex Untabify
+
+@AUCTeX{} depends heavily on being able to extract information from the
+buffers by parsing them.  Since parsing the buffer can be somewhat slow,
+the parsing is initially disabled.  You are encouraged to enable them by
+adding the following lines to your @file{.emacs} file.
+
+@lisp
+(setq TeX-parse-self t) ; Enable parse on load.
+(setq TeX-auto-save t) ; Enable parse on save.
+@end lisp
+
+The latter command will make @AUCTeX{} store the parsed information in
+an @file{auto} subdirectory in the directory each time the @TeX{} files
+are stored, @pxref{Automatic Local}.  If @AUCTeX{} finds the pre-parsed
+information when loading a file, it will not need to reparse the buffer.
+The information in the @file{auto} directory is also useful for
+multifile documents, @pxref{Multifile}, since it allows each file to
+access the parsed information from all the other files in the document.
+This is done by first reading the information from the master file, and
+then recursively the information from each file stored in the master
+file.
+
+The variables can also be done on a per file basis, by changing the file
+local variables.
+
+@example
+%%% Local Variables:
+%%% TeX-parse-self: t
+%%% TeX-auto-save: t
+%%% End:
+@end example
+
+Even when you have disabled the automatic parsing, you can force the
+generation of style information by pressing @kbd{C-c C-n}.  This is
+often the best choice, as you will be able to decide when it is
+necessary to reparse the file.
+
+@defopt TeX-parse-self
+Parse file after loading it if no style hook is found for it.
+@end defopt
+
+@defopt TeX-auto-save
+Automatically save style information when saving the buffer.
+@end defopt
+
+@deffn Command TeX-normal-mode @var{arg}
+@kindex C-c C-n
+(@kbd{C-c C-n}) Remove all information about this buffer, and apply the
+style hooks again.  Save buffer first including style information.  With
+optional argument, also reload the style hooks.
+@end deffn
+
+When @AUCTeX{} saves your buffer, it can optionally convert all tabs in
+your buffer into spaces.
+Tabs confuse @AUCTeX{}'s error message parsing and so should generally be
+avoided.  However, tabs are significant in some environments, and so by
+default @AUCTeX{} does not remove them.
+To convert tabs to spaces when saving a buffer, insert the
+following in your @file{.emacs} file:
+
+@lisp
+(setq TeX-auto-untabify t)
+@end lisp
+
+@defopt TeX-auto-untabify
+Automatically remove all tabs from a file before saving it.
+@end defopt
+
+Instead of disabling the parsing entirely, you can also speed it
+significantly up by limiting the information it will search for (and
+store) when parsing the buffer.  You can do this by setting the default
+values for the buffer local variables @code{TeX-auto-regexp-list} and
+@code{TeX-auto-parse-length} in your @file{.emacs} file.
+
+@lisp
+;; Only parse LaTeX class and package information.
+(setq-default TeX-auto-regexp-list 'LaTeX-auto-minimal-regexp-list)
+;; The class and package information is usually near the beginning.
+(setq-default TeX-auto-parse-length 2000)
+@end lisp
+
+This example will speed the parsing up significantly, but @AUCTeX{}
+will no longer be able to provide completion for labels, macros,
+environments, or bibitems specified in the document, nor will it know
+what files belong to the document.
+
+These variables can also be specified on a per file basis, by changing
+the file local variables.
+
+@example
+%%% Local Variables:
+%%% TeX-auto-regexp-list: TeX-auto-full-regexp-list
+%%% TeX-auto-parse-length: 999999
+%%% End:
+@end example
+
+@defopt TeX-auto-regexp-list
+List of regular expressions used for parsing the current file.
+@end defopt
+
+@defopt TeX-auto-parse-length
+Maximal length of @TeX{} file that will be parsed.
+@end defopt
+
+The pre-specified lists of regexps are defined below.  You can use these
+before loading @AUCTeX{} by quoting them, as in the example above.
+
+@defvr Constant TeX-auto-empty-regexp-list
+Parse nothing
+@end defvr
+
+@defvr Constant LaTeX-auto-minimal-regexp-list
+Only parse @LaTeX{} class and packages.
+@end defvr
+
+@defvr Constant LaTeX-auto-label-regexp-list
+Only parse @LaTeX{} labels.
+@end defvr
+
+@defvr Constant LaTeX-auto-regexp-list
+Parse common @LaTeX{} commands.
+@end defvr
+
+@defvr Constant plain-TeX-auto-regexp-list
+Parse common plain @TeX{} commands.
+@end defvr
+
+@defvr Constant TeX-auto-full-regexp-list
+Parse all @TeX{} and @LaTeX{} commands that @AUCTeX{} can use.
+@end defvr
+
+@node Internationalization
+@section Language Support
+@cindex Internationalization
+@cindex Language Support
+@cindex Character set
+@cindex National letters
+@cindex CJK language
+@cindex MULE
+@cindex C@TeX{}
+@cindex China@TeX{}
+@cindex p@TeX{}
+@cindex ASCII p@TeX{}
+@cindex j@TeX{}
+@cindex NTT j@TeX{}
+@cindex k@TeX{}
+@cindex H@LaTeX{}
+@cindex CJK-@LaTeX{}
+@cindex UNICODE
+@cindex MULE-UCS
+
+@TeX{} and Emacs are usable for European (Latin, Cyrillic, Greek) based
+languages.  Some @LaTeX{} and EmacsLisp packages are available for easy
+typesetting and editing documents in European languages.
+
+@c Some Texinfo macros are not used because they require quite recent
+@c texinfo versions (2005-03-05):
+@c Second arg of @acronym is available with 4.7, @comma is available in
+@c 4.7, @abbr is available in 4.8.
+@c -> @abbr{MULE, MULtilingual Enhancement to GNU Emacs}
+@c -> @acronym{CJK, Chinese@comma{} Japanese@comma{} and Korean}
+
+For @acronym{CJK} (Chinese, Japanese, and Korean) languages, Emacs or
+XEmacs with @acronym{MULE} (MULtilingual Enhancement to GNU Emacs)
+support is required.  @acronym{MULE} is part of Emacs by default since
+Emacs 20.  XEmacs has to be configured with the @samp{--with-mule}
+option.  Special versions of @TeX{} are needed for @acronym{CJK}
+languages: C@TeX{} and China@TeX{} for Chinese, ASCII p@TeX{} and NTT
+j@TeX{} for Japanese, H@LaTeX{} and k@TeX{} for Korean.  The
+@acronym{CJK}-@LaTeX{} package is required for supporting multiple
+@acronym{CJK} scripts within a single document.
+
+Note that Unicode is not fully supported in Emacs 21 and XEmacs 21.
+@acronym{CJK} characters are not usable.  Please use the
+@acronym{MULE}-@acronym{UCS} EmacsLisp package or Emacs 22 (not released
+yet) if you need @acronym{CJK}.
+
+@c FIXME: We need more information for CTeX, ChinaTeX, KTeX, and HLaTeX.
+
+@menu
+* European::                    Using @AUCTeX{} with European Languages
+* Japanese::                    Using @AUCTeX{} with Japanese
+@end menu
+
+@node European
+@subsection Using @AUCTeX{} with European Languages
+@cindex Europe
+@cindex European Characters
+@cindex ISO 8859 Latin 1
+@cindex Latin 1
+@cindex ISO 8859 Latin 2
+@cindex Latin 2
+@cindex ANSI
+
+@subsubsection Typing and Displaying Non-ASCII Characters
+
+First you will need a way to write non-ASCII characters.  You can either
+use macros, or teach @TeX{} about the ISO character sets.  I prefer the
+latter, it has the advantage that the usual standard emacs word
+movement and case change commands will work.
+
+With @LaTeX{}2e, just add @samp{\usepackage[latin1]@{inputenc@}}.  Other
+languages than Western European ones will probably have other encoding
+needs.
+
+To be able to display non-ASCII characters you will need an appropriate
+font and a version of GNU Emacs capable of displaying 8-bit characters
+(e.g. Emacs 21).  The manner in which this is supported differs between
+Emacsen, so you need to take a look at your respective documentation.
+
+A compromise is to use an European character set when editing the file,
+and convert to @TeX{} macros when reading and writing the files.
+
+@table @file
+@item iso-cvt.el
+@cindex @file{iso-cvt.el}
+Much like @file{iso-tex.el} but is bundled with Emacs 19.23 and later.
+
+@item x-compose.el
+@cindex @file{x-compose.el}
+Similar package bundled with new versions of XEmacs.
+
+@item X-Symbol
+@cindex X-Symbol
+a much more complete package for both Emacs and XEmacs that can also
+handle a lot of mathematical characters and input methods.
+@end table
+
+@subsubsection Style Files for Different Languages
+
+@cindex ispell
+@AUCTeX{} supports style files for several languages.  Each style file
+may modify @AUCTeX{} to better support the language, and will run
+a language specific hook that will allow you to for example change
+ispell dictionary, or run code to change the keyboard remapping.  The
+following will for example choose a Danish dictionary for documents
+including @samp{\usepackage[danish]@{babel@}}.
+This requires parsing to be enabled, @pxref{Parsing Files}.
+
+@lisp
+(add-hook 'TeX-language-dk-hook
+         (lambda () (ispell-change-dictionary "danish")))
+@end lisp
+
+The following style files are recognized:
+
+@c In alphabetic order of the hooks:
+@vindex TeX-language-bg-hook
+@vindex TeX-language-cz-hook
+@vindex TeX-language-dk-hook
+@vindex TeX-language-nl-hook
+@vindex TeX-language-de-hook
+@vindex TeX-language-it-hook
+@vindex TeX-language-is-hook
+@vindex TeX-language-pl-hook
+@vindex TeX-language-sk-hook
+@vindex TeX-language-sv-hook
+@cindex Bulgarian
+@cindex Czech
+@cindex Italian
+@cindex Danish
+@cindex Dutch
+@cindex German
+@cindex Polish
+@cindex Slovak
+@cindex Swedish
+@table @file
+@item bulgarian
+Runs style hook @code{TeX-language-bg-hook}.  Gives @samp{"} word
+syntax, makes the @key{"} key insert a literal @samp{"}.  Typing @key{"}
+twice will insert insert @samp{"`} or @samp{"'} depending on context.
+Typing @key{-} twice will insert @samp{"=}, three times @samp{--}.
+
+@item czech
+Runs style hook @code{TeX-language-cz-hook}.  Pressing @key{"} will
+insert @samp{\uv@{} and @samp{@}} depending on context.
+
+@c Is the difference between dk and danish really intented?
+@item danish
+Runs style hook @code{TeX-language-dk-hook}.  Pressing @key{"} will
+insert @samp{"`} and @samp{"'} depending on context.  Typing @key{-}
+twice will insert @samp{"=}, i.e. a hyphen string allowing hyphenation
+in the composing words.
+@c dk.sty seems to be obsolete, so we don't want to encourage using it.
+@c @item dk
+@c Runs style hook @code{TeX-language-dk-hook}.
+
+@item dutch
+Runs style hook @code{TeX-language-nl-hook}.
+
+@item german
+@itemx ngerman
+Runs style hook @code{TeX-language-de-hook}.  Gives @samp{"} word
+syntax, makes the @key{"} key insert a literal @samp{"}.  Pressing the
+key twice will give you opening or closing German quotes (@samp{"`} or
+@samp{"'}).  Typing @key{-} twice will insert @samp{"=}, three times
+@samp{--}.
+
+@item frenchb
+@itemx francais
+Runs style hook @code{TeX-language-fr-hook}.  Pressing @key{"} will
+insert @samp{\\og} and @samp{\\fg} depending on context.  Note that the
+language name for customizing @code{TeX-quote-language-alist} is
+@samp{french}.
+
+@item icelandic
+Runs style hook @code{TeX-language-is-hook}.  Gives @samp{"} word
+syntax, makes the @key{"} key insert a literal @samp{"}.  Typing @key{"}
+twice will insert insert @samp{"`} or @samp{"'} depending on context.
+Typing @key{-} twice will insert @samp{"=}, three times @samp{--}.
+
+@item italian
+Runs style hook @code{TeX-language-it-hook}.  Pressing @key{"} will
+insert @samp{"<} and @samp{">} depending on context.
+
+@item polish
+Runs style hook @code{TeX-language-pl-hook}.  Gives @samp{"} word syntax
+and makes the @key{"} key insert a literal @samp{"}.  Pressing @key{"}
+twice will insert @samp{"`} or @samp{"'} depending on context.
+
+@item polski
+Runs style hook @code{TeX-language-pl-hook}.  Makes the @key{"} key
+insert a literal @samp{"}.  Pressing @key{"} twice will insert @samp{,,}
+or @samp{''} depending on context.
+
+@item slovak
+Runs style hook @code{TeX-language-sk-hook}.  Pressing @key{"} will
+insert @samp{\uv@{} and @samp{@}} depending on context.
+
+@item swedish
+Runs style hook @code{TeX-language-sv-hook}.  Pressing @key{"} will
+insert @samp{''}.  Typing @key{-} twice will insert @samp{"=}, three
+times @samp{--}.
+@end table
+
+Replacement of language-specific hyphen strings like @samp{"=} with
+dashes does not require to type @key{-} three times in a row.  You can
+put point after the hypen string anytime and trigger the replacement by
+typing @key{-}.
+
+In case you are not satisfied with the suggested behavior of quote and
+hyphen insertion you can change it by customizing the variables
+@code{TeX-quote-language-alist} and
+@code{LaTeX-babel-hyphen-language-alist} respectively.
+
+@defopt TeX-quote-language-alist
+Used for overriding the default language-specific quote insertion
+behavior.  This is an alist where each element is a list consisting of
+four items.  The first item is the name of the language in concern as a
+string.  See the list of supported languages above.  The second item is
+the opening quotation mark.  The third item is the closing quotation
+mark.  Opening and closing quotation marks can be specified directly as
+strings or as functions returning a string.  The fourth item is a
+boolean controlling quote insertion.  It should be non-nil if if the
+special quotes should only be used after inserting a literal @samp{"}
+character first, i.e. on second key press.
+@end defopt
+
+@defopt LaTeX-babel-hyphen-language-alist
+Used for overriding the behavior of hyphen insertion for specific
+languages.  Every element in this alist is a list of three items.  The
+first item should specify the affected language as a string.  The second
+item denotes the hyphen string to be used as a string.  The third item,
+a boolean, controls the behavior of hyphen insertion and should be
+non-nil if the special hyphen should be inserted after inserting a
+literal @samp{-} character, i.e. on second key press.
+@end defopt
+
+The defaults of hyphen insertion are defined by the variables
+@code{LaTeX-babel-hyphen} and @code{LaTeX-babel-hyphen-after-hyphen}
+respectively.
+
+@defopt LaTeX-babel-hyphen
+String to be used when typing @key{-}.  This usually is a hyphen
+alternative or hyphenation aid provided by @samp{babel} and the related
+language style files, like @samp{"=}, @samp{"~} or @samp{"-}.
+
+Set it to an empty string or nil in order to disable language-specific
+hyphen insertion.
+@end defopt
+
+@defopt LaTeX-babel-hyphen-after-hyphen
+Control insertion of hyphen strings.  If non-nil insert normal hyphen on
+first key press and swap it with the language-specific hyphen string
+specified in the variable @code{LaTeX-babel-hyphen} on second key press.
+If nil do it the other way round.
+@end defopt
+
+@node Japanese
+@subsection Using @AUCTeX{} with Japanese @TeX{}
+@cindex Japan
+@cindex Japanese
+@cindex Nippon
+@cindex MULE
+@cindex NTT j@TeX{}
+@cindex j@TeX{}
+@cindex j@LaTeX{}
+@cindex ASCII p@TeX{}
+@cindex p@TeX{}
+@cindex p@LaTeX{}
+@cindex @file{tex-jp.el}
+@vindex TeX-default-mode
+@vindex japanese-TeX-command-default
+@vindex japanese-LaTeX-command-default
+@vindex japanese-LaTeX-default-style
+
+To write Japanese text with @AUCTeX{}, you need to have versions of
+@TeX{} and Emacs that support Japanese.  There exist at least two
+variants of @TeX{} for Japanese text (NTT j@TeX{} and ASCII p@TeX{}).
+@AUCTeX{} can be used with @acronym{MULE, MULtilingual Enhancement to GNU
+Emacs} supported Emacsen.
+
+To use the Japanese @TeX{} variants, simply activate
+@code{japanese-plain-tex-mode} or @code{japanese-latex-mode} and
+everything should work.  If not, send mail to Masayuki Ataka
+@samp{<ataka@@milk.freemail.ne.jp>}, who kindly donated the code for
+supporting Japanese in @AUCTeX{}.  None of the primary @AUCTeX{}
+maintainers understand Japanese, so they cannot help you.
+
+If you usually use @AUCTeX{} in Japanese, setting the following
+variables is useful.
+
+@defopt TeX-default-mode
+Mode to enter for a new file when it cannott be determined whether the
+file is plain @TeX{} or @LaTeX{} or what.
+
+If you want to enter Japanese @LaTeX{} mode whenever this may happen,
+set the variable like this:
+@lisp
+(setq TeX-default-mode 'japanese-latex-mode)
+@end lisp
+@end defopt
+
+@defopt japanese-TeX-command-default
+The default command for @code{TeX-command} in Japanese @TeX{} mode.
+
+The default value is @samp{"pTeX"}.
+@end defopt
+
+@defopt japanese-LaTeX-command-default
+The default command for @code{TeX-command} in Japanese @LaTeX{} mode.
+
+The default value is @samp{"LaTeX"}.
+@end defopt
+
+@defopt japanese-LaTeX-default-style
+The default style/class when creating a new Japanese @LaTeX{} document.
+
+The default value is @samp{"jarticle"}.
+@end defopt
+
+See @file{tex-jp.el} for more information.
+
+@node Automatic
+@section Automatic Customization
+@cindex Automatic Customization
+@cindex Extracting @TeX{} symbols
+@cindex Automatic
+@cindex @file{auto} directories.
+@cindex Parsing @TeX{}
+@cindex @TeX{} parsing
+@cindex Generating symbols
+
+Since @AUCTeX{} is so highly customizable, it makes sense that it is able
+to customize itself.  The automatic customization consists of scanning
+@TeX{} files and extracting symbols, environments, and things like that.
+
+The automatic customization is done on three different levels.  The
+global level is the level shared by all users at your site, and consists
+of scanning the standard @TeX{} style files, and any extra styles added
+locally for all users on the site.  The private level deals with those
+style files you have written for your own use, and use in different
+documents.  You may have a @file{~/lib/TeX/} directory where you store
+useful style files for your own use.  The local level is for a specific
+directory, and deals with writing customization for the files for your
+normal @TeX{} documents.
+
+If compared with the environment variable @code{TEXINPUTS}, the
+global level corresponds to the directories built into @TeX{}.  The
+private level corresponds to the directories you add yourself, except for
+@file{.}, which is the local level.
+
+@menu
+* Automatic Global::            Automatic Customization for the Site
+* Automatic Private::           Automatic Customization for a User
+* Automatic Local::             Automatic Customization for a Directory
+@end menu
+
+By default @AUCTeX{} will search for customization files in all the
+global, private, and local style directories, but you can also set the
+path directly.  This is useful if you for example want to add another
+person's style hooks to your path.  Please note that all matching files
+found in @code{TeX-style-path} are loaded, and all hooks defined in the
+files will be executed.
+
+@defopt TeX-style-path
+List of directories to search for @AUCTeX{} style files.
+Each must end with a slash.
+@end defopt
+
+By default, when @AUCTeX{} searches a directory for files, it will
+recursively search through subdirectories.
+
+@defopt TeX-file-recurse
+Whether to search @TeX{} directories recursively: nil means do not
+recurse, a positive integer means go that far deep in the directory
+hierarchy, t means recurse indefinitely.
+@end defopt
+
+By default, @AUCTeX{} will ignore files name @file{.}, @file{..},
+@file{SCCS}, @file{RCS}, and @file{CVS}.
+
+@defopt TeX-ignore-file
+Regular expression matching file names to ignore.
+
+These files or directories will not be considered when searching for
+@TeX{} files in a directory.
+@end defopt
+
+@node Automatic Global
+@subsection Automatic Customization for the Site
+@cindex Global style hook directory
+@cindex Global macro directory
+@cindex Site macro directory
+@cindex Global @TeX{} macro directory
+@cindex Site @TeX{} macro directory
+@cindex Global directories
+@cindex Site information
+
+Assuming that the automatic customization at the global level was done
+when @AUCTeX{} was installed, your choice is now: will you use it?  If
+you use it, you will benefit by having access to all the symbols and
+environments available for completion purposes.  The drawback is slower
+load time when you edit a new file and perhaps too many confusing
+symbols when you try to do a completion.
+
+You can disable the automatic generated global style hooks by setting
+the variable @code{TeX-auto-global} to nil.
+
+@defopt TeX-macro-global
+Directories containing the site's @TeX{} style files.
+@end defopt
+
+@defopt TeX-style-global
+Directory containing hand generated @TeX{} information.
+Must end with a slash.
+
+These correspond to @TeX{} macros shared by all users of a site.
+@end defopt
+
+@defopt TeX-auto-global
+Directory containing automatically generated information.
+
+For storing automatic extracted information about the @TeX{} macros
+shared by all users of a site.
+@end defopt
+
+@node Automatic Private
+@subsection Automatic Customization for a User
+@cindex Private style hook directory
+@cindex Private macro directory
+@cindex Personal macro directory
+@cindex Private @TeX{} macro directory
+@cindex Personal @TeX{} macro directory
+@cindex Private directories
+@cindex Personal information
+
+You should specify where you store your private @TeX{} macros, so
+@AUCTeX{} can extract their information.  The extracted information will
+go to the directories listed in @code{TeX-auto-private}
+
+Use @kbd{M-x TeX-auto-generate @key{RET}} to extract the information.
+
+@defopt TeX-macro-private
+Directories where you store your personal @TeX{} macros.  The value
+defaults to the directories listed in the @samp{TEXINPUTS} and
+@samp{BIBINPUTS} environment variables or to the respective directories
+in @code{$TEXMFHOME} if no results can be obtained from the environment
+variables.
+@end defopt
+
+@defopt TeX-auto-private
+List of directories containing automatically generated @AUCTeX{} style
+files.  These correspond to the personal @TeX{} macros.
+@end defopt
+
+@deffn Command TeX-auto-generate @var{TEX} @var{AUTO}
+(@kbd{M-x TeX-auto-generate @key{RET}}) Generate style hook for
+@var{TEX} and store it in @var{AUTO}.  If @var{TEX} is a directory,
+generate style hooks for all files in the directory.
+@end deffn
+
+@defopt TeX-style-private
+List of directories containing hand generated @AUCTeX{} style files.
+These correspond to the personal @TeX{} macros.
+@end defopt
+
+@node Automatic Local
+@subsection Automatic Customization for a Directory
+@cindex Local style hooks
+@cindex Updating style hooks
+@cindex Automatic updating style hooks
+@cindex Local style hooks
+@cindex Local style directory
+
+@AUCTeX{} can update the style information about a file each time you
+save it, and it will do this if the directory @code{TeX-auto-local}
+exist. @code{TeX-auto-local} is by default set to @samp{"auto"}, so
+simply creating an @file{auto} directory will enable automatic saving of
+style information.
+
+The advantage of doing this is that macros, labels, etc. defined in any
+file in a multifile document will be known in all the files in the
+document.  The disadvantage is that saving will be slower.  To disable,
+set @code{TeX-auto-local} to nil.
+
+@defopt TeX-style-local
+Directory containing hand generated @TeX{} information.
+Must end with a slash.
+
+These correspond to @TeX{} macros found in the current directory.
+@end defopt
+
+@defopt TeX-auto-local
+Directory containing automatically generated @TeX{} information.
+Must end with a slash.
+
+These correspond to @TeX{} macros found in the current directory.
+@end defopt
+
+@node Style Files
+@section Writing Your Own Style Support
+@cindex Style files
+@cindex Style hooks
+@cindex @file{style}
+
+@xref{Automatic}, for a discussion about automatically generated global,
+private, and local style files.  The hand generated style files are
+equivalent, except that they by default are found in @file{style}
+directories instead of @file{auto} directories.
+
+@menu
+* Simple Style::                A Simple Style File
+* Adding Macros::               Adding Support for Macros
+* Adding Environments::         Adding Support for Environments
+* Adding Other::                Adding Other Information
+* Hacking the Parser::          Automatic Extraction of New Things
+@end menu
+
+If you write some useful support for a public @TeX{} style file, please
+send it to us.
+
+@node Simple Style
+@subsection A Simple Style File
+@cindex @file{book.el}
+@cindex Sample style file
+@cindex Style file
+@cindex Example of a style file.
+@cindex Style hook
+@cindex Adding a style hook
+
+Here is a simple example of a style file.
+
+@lisp
+;;; book.el - Special code for book style.
+
+(TeX-add-style-hook
+ "book"
+ (lambda () 
+   (LaTeX-largest-level-set "chapter")))
+@end lisp
+
+This file specifies that the largest kind of section in a @LaTeX{} document
+using the book document style is chapter.  The interesting thing to
+notice is that the style file defines an (anonymous) function, and adds it
+to the list of loaded style hooks by calling @code{TeX-add-style-hook}.
+
+The first time the user indirectly tries to access some style specific
+information, such as the largest sectioning command available, the style
+hooks for all files directly or indirectly read by the current document
+is executed.  The actual files will only be evaluated once, but the
+hooks will be called for each buffer using the style file.
+
+@defun TeX-add-style-hook @var{style} @var{hook}
+Add @var{hook} to the list of functions to run when we use the @TeX{}
+file @var{style}.
+@end defun
+
+@node Adding Macros
+@subsection Adding Support for Macros
+@cindex Adding macros
+@cindex Macros, adding
+@cindex Defining macros in style hooks
+
+The most common thing to define in a style hook is new symbols (@TeX{}
+macros).  Most likely along with a description of the arguments to the
+function, since the symbol itself can be defined automatically.
+
+Here are a few examples from @file{latex.el}.
+
+@lisp
+(TeX-add-style-hook
+ "latex"
+ (lambda ()
+   (TeX-add-symbols
+    '("arabic" TeX-arg-counter)
+    '("label" TeX-arg-define-label)
+    '("ref" TeX-arg-label)
+    '("newcommand" TeX-arg-define-macro [ "Number of arguments" ] t)
+    '("newtheorem" TeX-arg-define-environment
+      [ TeX-arg-environment "Numbered like" ]
+      t [ TeX-arg-counter "Within counter" ]))))
+@end lisp
+
+@defun TeX-add-symbols @var{symbol} @dots{}
+Add each @var{symbol} to the list of known symbols.
+@end defun
+
+Each argument to @code{TeX-add-symbols} is a list describing one symbol.
+The head of the list is the name of the symbol, the remaining elements
+describe each argument.
+
+If there are no additional elements, the symbol will be inserted with
+point inside braces.  Otherwise, each argument of this function should
+match an argument of the @TeX{} macro.  What is done depends on the argument
+type.
+
+If a macro is defined multiple times, @AUCTeX{} will chose the one with
+the longest definition (i.e. the one with the most arguments).
+
+Thus, to overwrite
+@example
+       '("tref" 1) ; one argument
+@end example
+you can specify
+@example
+       '("tref" TeX-arg-label ignore) ; two arguments
+@end example
+
+@code{ignore} is a function that does not do anything, so when you
+insert a @samp{tref} you will be prompted for a label and no more.
+
+You can use the following types of specifiers for arguments:
+
+@table @code
+@item string
+Use the string as a prompt to prompt for the argument.
+
+@item number
+Insert that many braces, leave point inside the first.
+
+@item nil
+Insert empty braces.
+
+@item t
+Insert empty braces, leave point between the braces.
+
+@item other symbols
+Call the symbol as a function.  You can define your
+own hook, or use one of the predefined argument hooks.
+
+@item list
+If the car is a string, insert it as a prompt and the next
+element as initial input.  Otherwise, call the car of the list with
+the remaining elements as arguments.
+
+@item vector
+Optional argument.  If it has more than one element, parse it
+as a list, otherwise parse the only element as above.  Use square
+brackets instead of curly braces, and is not inserted on empty user
+input.
+@end table
+
+A lot of argument hooks have already been defined.  The first argument to
+all hooks is a flag indicating if it is an optional argument.  It is up
+to the hook to determine what to do with the remaining arguments, if
+any.  Typically the next argument is used to overwrite the default
+prompt.
+
+@ftable @code
+@item TeX-arg-conditional
+Implements if EXPR THEN ELSE.  If EXPR evaluates to true, parse THEN as an
+argument list, else parse ELSE as an argument list.
+
+@item TeX-arg-literal
+Insert its arguments into the buffer.  Used for specifying extra syntax
+for a macro.
+
+@item TeX-arg-free
+Parse its arguments but use no braces when they are inserted.
+
+@item TeX-arg-eval
+Evaluate arguments and insert the result in the buffer.
+
+@item TeX-arg-label
+Prompt for a label completing with known labels.
+
+@item TeX-arg-macro
+Prompt for a @TeX{} macro with completion.
+
+@item TeX-arg-environment
+Prompt for a @LaTeX{} environment with completion.
+
+@item TeX-arg-cite
+Prompt for a Bib@TeX{} citation.
+
+@item TeX-arg-counter
+Prompt for a @LaTeX{} counter.
+
+@item TeX-arg-savebox
+Prompt for a @LaTeX{} savebox.
+
+@item TeX-arg-file
+Prompt for a filename in the current directory, and use it without the
+extension.
+
+@item TeX-arg-input-file
+Prompt for the name of an input file in @TeX{}'s search path, and use it
+without the extension.  Run the style hooks for the file.
+
+@item TeX-arg-define-label
+Prompt for a label completing with known labels.  Add label to list of
+defined labels.
+
+@item TeX-arg-define-macro
+Prompt for a @TeX{} macro with completion.  Add macro to list of defined
+macros.
+
+@item TeX-arg-define-environment
+Prompt for a @LaTeX{} environment with completion.  Add environment to
+list of defined environments.
+
+@item TeX-arg-define-cite
+Prompt for a Bib@TeX{} citation.
+
+@item TeX-arg-define-counter
+Prompt for a @LaTeX{} counter.
+
+@item TeX-arg-define-savebox
+Prompt for a @LaTeX{} savebox.
+
+@item TeX-arg-corner
+Prompt for a @LaTeX{} side or corner position with completion.
+
+@item TeX-arg-lr
+Prompt for a @LaTeX{} side with completion.
+
+@item TeX-arg-tb
+Prompt for a @LaTeX{} side with completion.
+
+@item TeX-arg-pagestyle
+Prompt for a @LaTeX{} pagestyle with completion.
+
+@item TeX-arg-verb
+Prompt for delimiter and text.
+
+@item TeX-arg-pair
+Insert a pair of numbers, use arguments for prompt. The numbers are
+surrounded by parentheses and separated with a comma.
+
+@item TeX-arg-size
+Insert width and height as a pair.  No arguments.
+
+@item TeX-arg-coordinate
+Insert x and y coordinates as a pair.  No arguments.
+@end ftable
+
+If you add new hooks, you can assume that point is placed directly after
+the previous argument, or after the macro name if this is the first
+argument.  Please leave point located after the argument you are
+inserting.  If you want point to be located somewhere else after all
+hooks have been processed, set the value of @code{exit-mark}.  It will
+point nowhere, until the argument hook sets it.
+
+@node Adding Environments
+@subsection Adding Support for Environments
+@cindex Adding environments
+@cindex Environments, adding
+@cindex Defining environments in style hooks
+
+Adding support for environments is very much like adding support for
+@TeX{} macros, except that each environment normally only takes one
+argument, an environment hook.  The example is again a short version of
+@file{latex.el}.
+
+@lisp
+(TeX-add-style-hook
+ "latex"
+ (lambda ()
+   (LaTeX-add-environments
+    '("document" LaTeX-env-document)
+    '("enumerate" LaTeX-env-item)
+    '("itemize" LaTeX-env-item)
+    '("list" LaTeX-env-list))))
+@end lisp
+
+It is completely up to the environment hook to insert the environment,
+but the function @code{LaTeX-insert-environment} may be of some help.
+The hook will be called with the name of the environment as its first
+argument, and extra arguments can be provided by adding them to a list
+after the hook.
+
+For simple environments with arguments, for example defined with
+@samp{\newenvironment}, you can make @AUCTeX{} prompt for the arguments
+by giving the prompt strings in the call to
+@code{LaTeX-add-environments}.  The fact that an argument is optional
+can be indicated by wrapping the prompt string in a vector.
+
+For example, if you have defined a @code{loop} environment with the
+three arguments @var{from}, @var{to}, and @var{step}, you can add
+support for them in a style file.
+
+@example
+%% loop.sty
+
+\newenvironment@{loop@}[3]@{...@}@{...@}
+@end example
+
+@lisp
+;; loop.el
+
+(TeX-add-style-hook
+ "loop"
+ (lambda ()
+   (LaTeX-add-environments
+    '("loop" "From" "To" "Step"))))
+@end lisp
+
+If an environment is defined multiple times, @AUCTeX{} will choose the
+one with the longest definition.  Thus, if you have an enumerate style
+file, and want it to replace the standard @LaTeX{} enumerate hook above,
+you could define an @file{enumerate.el} file as follows, and place it in
+the appropriate style directory.
+
+@lisp
+(TeX-add-style-hook
+ "latex"
+ (lambda ()
+   (LaTeX-add-environments
+    '("enumerate" LaTeX-env-enumerate foo))))
+
+(defun LaTeX-env-enumerate (environment &optional ignore) ...)
+@end lisp
+
+The symbol @code{foo} will be passed to @code{LaTeX-env-enumerate} as
+the second argument, but since we only added it to overwrite the
+definition in @file{latex.el} it is just ignored.
+
+@defun LaTeX-add-environments @var{env} @dots{}
+Add each @var{env} to list of loaded environments.
+@end defun
+
+@defun LaTeX-insert-environment @var{env} [ @var{extra} ]
+Insert environment of type @var{env}, with optional argument @var{extra}.
+@end defun
+
+Following is a list of available hooks for
+@code{LaTeX-add-environments}:
+
+@ftable @code
+@item LaTeX-env-item
+Insert the given environment and the first item.
+
+@item LaTeX-env-figure
+Insert the given figure-like environment with a caption and a label.
+
+@item LaTeX-env-array
+Insert the given array-like environment with position and column
+specifications.
+
+@item LaTeX-env-label
+Insert the given environment with a label.
+
+@item LaTeX-env-list
+Insert the given list-like environment, a specifier for the label and
+the first item.
+
+@item LaTeX-env-minipage
+Insert the given minipage-like environment with position and width
+specifications.
+
+@item LaTeX-env-tabular*
+Insert the given tabular*-like environment with width, position and
+column specifications.
+
+@item LaTeX-env-picture
+Insert the given environment with width and height specifications.
+
+@item LaTeX-env-bib
+Insert the given environment with a label for a bibitem.
+
+@item LaTeX-env-contents
+Insert the given environment with a filename as its argument.
+
+@item LaTeX-env-args
+Insert the given environment with arguments.  You can use this as a hook
+in case you want to specify multiple complex arguments just like in
+elements of @code{TeX-add-symbols}.  This is most useful if the
+specification of arguments to be prompted for with strings and strings
+wrapped in a vector as described above is too limited.
+
+Here is an example from @file{listings.el} which calls a function with
+one argument in order to prompt for a key=value list to be inserted as
+an optional argument of the @samp{lstlisting} environment:
+
+@lisp
+(LaTeX-add-environments
+ `("lstlisting" LaTeX-env-args
+   [TeX-arg-key-val ,LaTeX-listings-key-val-options]))
+@end lisp
+@end ftable
+
+@node Adding Other
+@subsection Adding Other Information
+@cindex Adding bibliographies
+@cindex Bibliographies, adding
+@cindex Defining bibliographies in style hooks
+@cindex Adding labels
+@cindex Labels, adding
+@cindex Defining labels in style hooks
+@cindex Adding other information
+@cindex Other information, adding
+@cindex Defining other information in style hooks
+
+You can also specify bibliographical databases and labels in the style
+file.  This is probably of little use, since this information will
+usually be automatically generated from the @TeX{} file anyway.
+
+@defun LaTeX-add-bibliographies @var{bibliography} @dots{}
+Add each @var{bibliography} to list of loaded bibliographies.
+@end defun
+
+@defun LaTeX-add-labels @var{label} @dots{}
+Add each @var{label} to the list of known labels.
+@end defun
+
+@node Hacking the Parser
+@subsection Automatic Extraction of New Things
+@cindex Parsing new macros
+@cindex @file{macro.tex}
+@cindex @file{macro.el}
+@cindex Changing the parser
+
+The automatic @TeX{} information extractor works by searching for
+regular expressions in the @TeX{} files, and storing the matched
+information.  You can add support for new constructs to the parser,
+something that is needed when you add new commands to define symbols.
+
+For example, in the file @file{macro.tex} I define the following macro.
+
+@example
+\newcommand@{\newmacro@}[5]@{%
+\def#1@{#3\index@{#4@@#5~cite@{#4@}@}\nocite@{#4@}@}%
+\def#2@{#5\index@{#4@@#5~cite@{#4@}@}\nocite@{#4@}@}%
+@}
+@end example
+
+@AUCTeX{} will automatically figure out that @samp{newmacro} is a macro
+that takes five arguments.  However, it is not smart enough to
+automatically see that each time we use the macro, two new macros are
+defined.  We can specify this information in a style hook file.
+
+@lisp
+;;; macro.el --- Special code for my own macro file.
+
+;;; Code:
+
+(defvar TeX-newmacro-regexp
+  '("\\\\newmacro@{\\\\\\([a-zA-Z]+\\)@}@{\\\\\\([a-zA-Z]+\\)@}"
+    (1 2) TeX-auto-multi)
+  "Matches \newmacro definitions.")
+
+(defvar TeX-auto-multi nil
+  "Temporary for parsing \\newmacro definitions.")
+
+(defun TeX-macro-cleanup ()
+  "Move symbols from `TeX-auto-multi' to `TeX-auto-symbol'."
+  (mapcar (lambda (list)
+           (mapcar (lambda (symbol)
+                     (setq TeX-auto-symbol
+                           (cons symbol TeX-auto-symbol)))
+                   list))
+         TeX-auto-multi))
+
+(defun TeX-macro-prepare ()
+  "Clear `Tex-auto-multi' before use."
+  (setq TeX-auto-multi nil))
+
+(add-hook 'TeX-auto-prepare-hook 'TeX-macro-prepare)
+(add-hook 'TeX-auto-cleanup-hook 'TeX-macro-cleanup)
+
+(TeX-add-style-hook
+ "macro"
+ (lambda ()
+   (TeX-auto-add-regexp TeX-newmacro-regexp)
+   (TeX-add-symbols '("newmacro"
+                     TeX-arg-macro
+                     (TeX-arg-macro "Capitalized macro: \\")
+                     t
+                     "BibTeX entry: "
+                     nil))))
+
+;;; macro.el ends here
+@end lisp
+
+When this file is first loaded, it adds a new entry to
+@code{TeX-newmacro-regexp}, and defines a function to be called before
+the parsing starts, and one to be called after the parsing is done.  It
+also declares a variable to contain the data collected during parsing.
+Finally, it adds a style hook which describes the @samp{newmacro} macro,
+as we have seen it before.
+
+So the general strategy is: Add a new entry to @code{TeX-newmacro-regexp}.
+Declare a variable to contain intermediate data during parsing.  Add hook
+to be called before and after parsing.  In this case, the hook before
+parsing just initializes the variable, and the hook after parsing
+collects the data from the variable, and adds them to the list of symbols
+found.
+
+@defvar TeX-auto-regexp-list
+List of regular expressions matching @TeX{} macro definitions.
+
+The list has the following format ((REGEXP MATCH TABLE) @dots{}), that
+is, each entry is a list with three elements.
+
+REGEXP.  Regular expression matching the macro we want to parse.
+
+MATCH.  A number or list of numbers, each representing one
+parenthesized subexpression matched by REGEXP.
+
+TABLE.  The symbol table to store the data.  This can be a function, in
+which case the function is called with the argument MATCH.  Use
+@code{TeX-match-buffer} to get match data.  If it is not a function, it
+is presumed to be the name of a variable containing a list of match
+data.  The matched data (a string if MATCH is a number, a list of
+strings if MATCH is a list of numbers) is put in front of the table.
+@end defvar
+
+@defvar TeX-auto-prepare-hook nil
+List of functions to be called before parsing a @TeX{} file.
+@end defvar
+
+@defvar TeX-auto-cleanup-hook nil
+List of functions to be called after parsing a @TeX{} file.
+@end defvar
+
+@node Appendices
+@appendix Copying, Changes, Development, FAQ
+
+@menu
+* Copying this Manual::         
+* Changes::                     
+* Development::                 
+* FAQ::                         
+@end menu
+
+@node Copying this Manual
+@appendixsec Copying this Manual
+
+@ifinfo
+The copyright notice for this manual is:
+
+@insertcopying
+@end ifinfo
+
+The full license text can be read here:
+
+@menu
+* GNU Free Documentation License:: License for copying this manual.
+@end menu
+
+@lowersections
+@include fdl.texi
+@raisesections
+
+@node Changes
+@appendixsec Changes and New Features
+
+@lowersections
+@include changes.texi
+@raisesections
+
+@subheading Older versions
+See the file @file{history.texi} for older changes.
+
+@node Development
+@appendixsec Future Development
+
+@lowersections
+@include todo.texi
+@raisesections
+
+@node FAQ
+@appendixsec Frequently Asked Questions
+
+@lowersections
+@include faq.texi
+@raisesections
+
+@node Indices
+@unnumbered Indices
+
+@menu
+* Key Index::                   
+* Function Index::              
+* Variable Index::              
+* Concept Index::               
+@end menu
+
+@node Key Index
+@unnumberedsec Key Index
+
+@printindex ky
+
+@node Function Index
+@unnumberedsec Function Index
+
+@printindex fn
+
+@node Variable Index
+@unnumberedsec Variable Index
+
+@printindex vr
+
+@node Concept Index
+@unnumberedsec Concept Index
+
+@printindex cp
+
+@bye
diff --git a/packages/auctex/doc/changes.texi b/packages/auctex/doc/changes.texi
new file mode 100644 (file)
index 0000000..0f42927
--- /dev/null
@@ -0,0 +1,800 @@
+@c This is part of the AUCTeX manual.
+@c Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+@c   2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+@c See file auctex.texi for copying conditions.
+@include macros.texi
+@ifset rawfile
+@chapheading Changes and New Features in @AUCTeX{}
+
+@end ifset
+
+@heading News in 11.86
+
+@itemize @bullet
+@item
+Parsing of @LaTeX{} output was improved.  It is now less likely that
+@AUCTeX{} opens a non-existent file upon calling @code{TeX-next-error};
+a problem for example encountered when using MiK@TeX{} 2.8.  In addition
+quoted file names as emitted by MiK@TeX{} are now supported.
+
+@item
+A new framework for the definition and selection of viewers was
+implemented.  If you have customizations regarding viewers you will have
+to redo them in this new framework or reenable the old one.
+@ifset rawfile
+See the section on viewers in the manual for details.
+@end ifset
+@ifclear rawfile
+@xref{Starting Viewers}, for details.
+@end ifclear
+
+@item
+Comprehensive editing support for PSTricks was added.
+
+@item
+Support for various @LaTeX{} packages was added, e.g. @samp{tabularx},
+@samp{CJK}, and @samp{hyperref}.
+
+@item
+An easy way to switch between @TeX{} engines (PDF@TeX{}, Lua@TeX{},
+Xe@TeX{}, Omega) was added.
+
+@item
+Support for Sync@TeX{} was added.  This involves the command line
+options for @LaTeX{} and the viewer.
+
+@item
+Folding can now be customized to use macro arguments as replacement
+text.
+
+@item
+@samp{preview.sty} now works with Xe@TeX{}.
+
+@item
+A lot of smaller and larger bugs have been squashed.
+@end itemize
+
+@heading News in 11.85
+
+@itemize @bullet
+
+@item
+Font locking has been improved significantly.  It is now less prone to
+color bleeding which could lead to high resource usage.  In addition it
+now includes information about @LaTeX{} macro syntax and can indicate
+syntactically incorrect macros in @LaTeX{} mode.
+
+@item
+The license was updated to GPLv3.
+
+@item
+Support for the nomencl, flashcards and comment @LaTeX{} packages as
+well as the Icelandic language option of babel were added.
+
+@item
+Support for folding of math macros was added.
+
+@item
+Lots of minor bugs in features and documentation fixed.
+@end itemize
+
+@heading News in 11.84
+
+@itemize @bullet
+
+@item
+There have been problems with the @samp{-without-texmf-dir} option to
+@samp{configure} when the value of @samp{-with-kpathsea-sep} was set or
+determined for an installation system with a default different from that
+of the runtime system.  @code{with-kpathsea-sep} has been removed; the
+setting is now usually determined at runtime.
+
+Due to this and other problems, preview-latex in the released XEmacs
+package failed under Windows or with anything except recent 21.5
+XEmacsen.
+
+@item
+@AUCTeX{} and @previewlatex{} have been changed in order to accommodate
+file names containing spaces.  @previewlatex{} now tolerates bad
+PostScript code polluting the stack (like some Omega fonts).
+
+@item
+@samp{preview.sty} had in some cases failed to emit PostScript header
+specials.
+
+@item
+Support for folding of comments was added.
+
+@item
+The @code{polish} language option of the babel LaTeX package as well as
+the polski LaTeX package are now supported.  Most notably this means
+that AUCTeX will help to insert quotation marks as defined by polish.sty
+(@code{"`..."'}) and polski.sty (@code{,,...''}).
+
+@item
+The @TeX{} tool bar is now available and enabled by default in plain
+@TeX{} mode.
+@ifclear rawfile
+@xref{Processing Facilities}.
+@end ifclear
+
+@item
+Bug fix in the display of math subscripts and superscripts.
+
+@item
+Bug fix @code{TeX-doc} for Emacs 21.
+
+@item
+There has been quite a number of other bug fixes to various features and
+documentation across the board.
+
+@end itemize
+
+@heading News in 11.83
+
+@itemize @bullet
+@item
+The new function @code{TeX-doc} provides easy access to documentation
+about commands and packages or information related to @TeX{} and friends
+in general.
+@ifset rawfile
+It is accessible with the key binding @kbd{C-c ?} or the
+@samp{Find Documentation...} entry in the mode menus.
+@end ifset
+@ifclear rawfile
+@xref{Documentation}.
+@end ifclear
+
+@item
+You can now get rid of generated intermediate and output files by means
+of the new @samp{Clean} and @samp{Clean All} entries in
+@code{TeX-command-list} accessible with @kbd{C-c C-c} or the Command
+menu.
+@ifclear rawfile
+@xref{Cleaning}.
+@end ifclear
+
+@item
+Support for forward search with PDF files was added.  That means you can
+jump to a place in the output file corresponding to the position in the
+source file.
+@ifset rawfile
+Currently this only works if you use the pdfsync @LaTeX{} package and
+xpdf as your PDF viewer.  The accuracy is in the range of +/-1 page.
+@end ifset
+@ifclear rawfile
+@xref{Viewing}.
+@end ifclear
+
+Adding support for this feature required the default value of the
+variable @code{TeX-output-view-style} to be changed.  Please make sure
+you either remove any customizations overriding the new default or
+incorporate the changes into your customizations if you want to use this
+feature.
+
+@item
+@TeX{} error messages of the @code{-file-line-error} kind are now
+understood in @AUCTeX{} and @previewlatex{} (parsers are still
+separate).
+
+@item
+Bug fix in XyM@TeX{} support.
+
+@item
+The @LaTeX{} tool bar is now enabled by default.
+@ifclear rawfile
+@xref{Processing Facilities}.
+@end ifclear
+
+@end itemize
+
+@heading News in 11.82
+
+@itemize @bullet
+@item
+Support for the MinionPro LaTeX package was added.
+
+@item
+Warnings and underfull/overfull boxes are now being indicated in the
+echo area after a @LaTeX{} run, if the respective debugging options are
+activated with @code{TeX-toggle-debug-warnings} (@kbd{C-c C-t C-w}) or
+@code{TeX-toggle-debug-bad-boxes} (@kbd{C-c C-t C-b}).  In this case
+@code{TeX-next-error} will find these warnings in addition to normal
+errors.
+
+The key binding @kbd{C-c C-w} for @code{TeX-toggle-debug-bad-boxes}
+(which was renamed from @code{TeX-toggle-debug-boxes}) now is
+deprecated.
+
+@item
+@AUCTeX{} now can automatically insert a pair of braces after typing
+@key{_} or @key{^} in math constructs if the new variable
+@code{TeX-electric-sub-and-superscript} is set to a non-nil value.
+
+@item
+Some language-specific support for French was added.  There now is
+completion support for the commands provided by the @samp{frenchb} (and
+@samp{francais}) options of the babel @LaTeX{} package and easier input
+of French quotation marks (@code{\\og ...\\fg}) which can now be
+inserted by typing @key{"}.
+
+@item
+Completion support for options of some LaTeX packages was added.
+
+@item
+@cindex @file{auctex.el}
+@cindex @file{tex-site.el}
+Already in version 11.81 the way to activate @AUCTeX{} changed
+substantially.  This should now be done with @code{(load "auctex.el" nil
+t t)} instead of the former @code{(require 'tex-site)}.  Related to this
+change @file{tex-mik.el} does not load @file{tex-site.el} anymore.  That
+means if you used only @code{(require 'tex-mik)} in order to activate
+@AUCTeX{}, you have to add @code{(load "auctex.el" nil t t)} before the
+latter statement.
+@ifset rawfile
+More detailed information can be found in the installation instructions
+(file INSTALL).
+@end ifset
+@ifclear rawfile
+@xref{Loading the package}.
+@end ifclear
+
+@item
+Handling of verbatim constructs was consolidated across AUCTeX.  This
+resulted in the @fontlatex{}-specific variables
+@code{font-latex-verb-like-commands}, @code{font-latex-verbatim-macros},
+and @code{font-latex-verbatim-environments} being removed and the more
+general variables @code{LaTeX-verbatim-macros-with-delims},
+@code{LaTeX-verbatim-macros-with-braces}, and
+@code{LaTeX-verbatim-environments} being added.
+
+@item
+The output of a Bib@TeX{} run is now checked for warnings and errors,
+which are reported in the echo area.
+
+@item
+The aliases for @code{font-latex-title-fontify} were removed.  Use
+@code{font-latex-fontify-sectioning} instead.
+
+@item
+The problem that Japanese macros where broken across lines was fixed.
+
+@item
+Various bug fixes.
+@end itemize
+
+@heading News in 11.81
+
+@itemize @bullet
+@item
+@code{LaTeX-mark-section} now marks subsections of a given section as
+well.  The former behavior is available via the prefix argument.
+
+@item
+@previewlatex{} which was previously available separately became a
+subsystem of @AUCTeX{}.  There is no documented provision for building
+or installing @previewlatex{} separately.  It is still possible to use
+and install @AUCTeX{} without @previewlatex{}, however.
+
+@item
+The installation procedures have been overhauled and now also install
+startup files as part of the process (those had to be copied manually
+previously).  You are advised to remove previous installations of
+@AUCTeX{} and @previewlatex{} before starting the installation
+procedure.  A standard installation from an unmodified tarball no longer
+requires Makeinfo or Perl.
+
+Also note that the way @AUCTeX{} is supposed to be activated changed.
+Instead of @code{(require 'tex-site)} you should now use @code{(load
+"auctex.el" nil t t)}.  While the former method may still work, the new
+method has the advantage that you can deactivate a preactivated
+@AUCTeX{} with the statement @code{(unload-feature 'tex-site)} before
+any of its modes have been used.  This may be important especially for
+site-wide installations.
+
+@item
+Support for the babel @LaTeX{} package was added.
+
+@item
+Folding a buffer now ensures that the whole buffer is fontified before
+the actual folding is carried out.  If this results in unbearably long
+execution times, you can fall back to the old behavior of relying on
+stealth font locking to do this job in the background by customizing the
+variable @code{TeX-fold-force-fontify}.
+
+@item
+Folded content now reveals part of its original text in a tooltip or the
+echo area when hovering with the mouse pointer over it.
+
+@item
+The language-specific insertion of quotation marks was generalized.  The
+variables @code{LaTeX-german-open-quote},
+@code{LaTeX-german-close-quote}, @code{LaTeX-german-quote-after-quote},
+@code{LaTeX-italian-open-quote}, @code{LaTeX-italian-close-quote}, and
+@code{LaTeX-italian-quote-after-quote} are now obsolete.  If you are not
+satisfied with the default settings, you should customize
+@code{TeX-quote-language-alist} instead.
+
+@item
+Similar to language-specific quote insertion, @AUCTeX{} now helps you
+with hyphens in different languages as well.
+@ifclear rawfile
+@xref{European}, for details.
+@end ifclear
+
+@item
+Fill problems in Japanese text introduced in @AUCTeX{} 11.55 were fixed.
+@AUCTeX{} tries not to break lines between 1-byte and 2-byte chars.
+These features will work in Chinese text, too.
+
+@item
+The scaling factor of the fontification of sectioning commands can now
+be customized using the variable @code{font-latex-fontify-sectioning}.
+This variable was previously called @code{font-latex-title-fontify}; In
+this release we provide an alias but this will disappear in one of the
+the next releases.  The faces for the sectioning commands are now called
+@code{font-latex-sectioning-@var{N}-face} (@var{N}=0@dots{}5) instead of
+@code{font-latex-title-@var{N}-face} (@var{N}=1@dots{}4).  Analogously
+the names of the variables holding the related keyword lists were
+changed from @code{font-latex-title-@var{N}-keywords} to
+@code{font-latex-sectioning-@var{N}-keywords}.
+@ifclear rawfile
+@xref{Font Locking}, for details.
+@end ifclear
+Make sure to adjust your customizations.
+
+@item
+Titles in beamer slides marked by the ``\frametitle'' command are know
+displayed with the new face @code{font-latex-slide-title-face}.  You can
+add macros to be highlighted with this face to
+@code{font-latex-match-slide-title-keywords}.
+
+@item
+Of course a lot of bugs have been fixed.
+@end itemize
+
+@heading News in 11.55
+
+@itemize @bullet
+@item
+A bug was fixed which lead to the insertion of trailing whitespace
+during filling.  In particular extra spaces were added to sentence
+endings at the end of lines.  You can make this whitespace visible by
+setting the variable @code{show-trailing-whitespace} to @code{t}.  If
+you want to delete all trailing whitespace in a buffer, type @kbd{M-x
+delete-trailing-whitespace RET}.
+
+@item
+A bug was fixed which lead to a @samp{*Compile-Log*} buffer popping up
+when the first @LaTeX{} file was loaded in an Emacs session.
+
+@item
+On some systems the presence of an outdated Emacspeak package lead to
+the error message @samp{File mode specification error: (error "Variable
+binding depth exceeds max-specpdl-size")}.  Precautions were added which
+prevent this error from happening.  But nevertheless, it is advised to
+upgrade or uninstall the outdated Emacspeak package.
+
+@item
+The value of @code{TeX-macro-global} is not determined during
+configuration anymore but at load time of @AUCTeX{}.  Consequently the
+associated configuration option @samp{--with-tex-input-dirs} was
+removed.
+
+@item
+Support for the @LaTeX{} Japanese classes @samp{jsarticle} and
+@samp{jsbook} was added.
+@end itemize
+
+@heading News in 11.54
+
+@itemize @bullet
+@item
+The parser (used e.g. for @code{TeX-auto-generate-global}) was extended
+to recognize keywords common in @LaTeX{} packages and classes, like
+``\DeclareRobustCommand'' or ``\RequirePackage''.  Additionally a bug
+was fixed which led to duplicate entries in @AUCTeX{} style files.
+
+@item
+Folding can now be done for paragraphs and regions besides single
+constructs and the whole buffer.  With the new @code{TeX-fold-dwim}
+command content can both be hidden and shown with a single key binding.
+In course of these changes new key bindings for unfolding commands where
+introduced.  The old bindings are still present but will be phased out
+in future releases.
+
+@item
+Info files of the manual now have a .info extension.
+
+@item
+There is an experimental tool bar support now.  It is not activated by
+default.  If you want to use it, add
+@lisp
+(add-hook 'LaTeX-mode-hook 'LaTeX-install-toolbar)
+@end lisp
+to your init file.
+
+@item
+The manual now contains a new chapter ``Quick Start''.  It explains the
+main features and how to use them, and should be enough for a new user
+to start using @AUCTeX{}.
+
+@item
+A new section ``Font Locking'' was added to the manual which explains
+syntax highlighting in @AUCTeX{} and its customization.  Together with
+the sections related to folding and outlining, the section is part of
+the new chapter ``Display''.
+
+@item
+Keywords for syntax highlighting of @LaTeX{} constructs to be typeset in
+bold, italic or typewriter fonts may now be customized.  Besides the
+built-in classes, new keyword classes may be added by customizing the
+variable @samp{font-latex-user-keyword-classes}.  The customization
+options can be found in the customization group
+@samp{font-latex-keywords}.
+
+@item
+Verbatim content is now displayed with the @samp{fixed-pitch} face. (GNU
+Emacs only)
+
+@item
+Syntax highlighting should not spill out of verbatim content
+anymore. (GNU Emacs only)
+
+@item
+Verbatim commands like @samp{\verb|...|} will not be broken anymore
+during filling.
+
+@item
+You can customize the completion for graphic files with 
+@code{LaTeX-includegraphics-read-file}.
+
+@item
+Support for the @LaTeX{} packages @samp{url}, @samp{listings},
+@samp{jurabib} and @samp{csquotes} was added with regard to command
+completion and syntax highlighting.
+
+@item
+Performance of fontification and filling was improved.
+
+@item
+Insertion of nodes in Texinfo mode now supports completion of existing
+node names.
+
+@item
+Setting the variable @code{LaTeX-float} to @code{nil} now means that you
+will not be prompted for the float position of figures and tables.  You
+can get the old behaviour of @code{nil} by setting the variable to
+@code{""}, i.e. an empty string.
+@ifclear rawfile
+See also @ref{Floats}.
+@end ifclear
+
+@item
+The XEmacs-specific bug concerning @code{overlays-at} was fixed.
+
+@item
+Lots of bug fixes.
+@end itemize
+
+@heading News in 11.53
+
+@itemize @bullet
+@item
+The @LaTeX{} math menu can include Unicode characters if your Emacs
+built supports it.  See the variable
+@ifset rawfile
+@code{LaTeX-math-menu-unicode}.
+@end ifset
+@ifclear rawfile
+@code{LaTeX-math-menu-unicode}, @ref{Mathematics}.
+@end ifclear
+
+@item
+Bug fixes for XEmacs.
+
+@c The following items weren't present at release time of 11.53:
+@item
+Completion for graphic files in the TeX search path has been added.
+
+@item
+@command{start} is used for the viewer for MiK@TeX{} and fp@TeX{}.
+
+@item
+The variable @code{TeX-fold-preserve-comments} can now be customized to
+deactivate folding in comments.
+@end itemize
+
+@heading News in 11.52
+@c Not present at release time of 11.52.
+
+@itemize @bullet
+@item
+Installation and menus under XEmacs work again (maybe for the first
+time).
+
+@item
+Fontification of subscripts and superscripts is now disabled when the
+fontification engine is not able to support it properly.
+
+@item
+Bug fixes in the build process.
+@end itemize
+
+@heading News in 11.51
+@c Not present at release time of 11.51.
+
+@itemize @bullet
+@item
+PDFTeX and Source Special support did not work with ConTeXt,
+this has been fixed.  Similar for Source Special support under Windows.
+
+@item
+Omega support has been added.
+
+@item
+Bug fixes in the build process.
+
+@item
+@code{TeX-fold} now supports folding of environments in Texinfo mode.
+@end itemize
+
+@heading News in 11.50
+
+@itemize @bullet
+@item
+The use of source specials when processing or viewing the document can
+now be controlled with the new @code{TeX-source-specials} minor mode
+which can be toggled via an entry in the Command menu or the key binding
+@kbd{C-c C-t C-s}.  If you have customized the variable
+@code{TeX-command-list}, you have to re-initialize it for this to work.
+This means to open a customization buffer for the variable by typing
+@code{M-x customize-variable RET TeX-command-list RET}, selecting
+``Erase Customization'' and do your customization again with the new
+default.
+
+@item
+The content of the command menu now depends on the mode (plain @TeX{},
+@LaTeX{}, @ConTeXt{} etc.).  Any former customization of the variable
+@code{TeX-command-list} has to be erased.  Otherwise the command menu
+and the customization will not work correctly.
+
+@item
+Support for hiding and auto-revealing macros, e.g. footnotes or
+citations, and environments in a buffer was
+@ifset rawfile
+added.
+@end ifset
+@ifclear rawfile
+added, @ref{Folding}.
+@end ifclear
+
+@item
+You can now control if indentation is done upon typing @key{RET} by
+customizing the variable
+@ifset rawfile
+@code{TeX-newline-function}.
+@end ifset
+@ifclear rawfile
+@code{TeX-newline-function}, @ref{Indenting}.
+@end ifclear
+
+@item
+Limited support for @code{doc.sty} and @code{ltxdoc.cls} (@samp{dtx}
+files) was added.  The new doc@TeX{} mode provides functionality for
+editing documentation parts.  This includes formatting (indenting and
+filling), adding and completion of macros and environments while staying
+in comments as well as syntax highlighting.  (Please note that the mode
+is not finished yet.  For example syntax highlighting does not work yet
+in XEmacs.)
+
+@item
+For macro completion in doc@TeX{} mode the @AUCTeX{} style files
+@file{doc.el}, @file{ltxdoc.el} and @file{ltx-base.el} were included.
+The latter provides general support for low-level @LaTeX{} macros and
+may be used with @LaTeX{} class and style files as well.  It is
+currently not loaded automatically for those files.
+
+@item
+Support for @ConTeXt{} with a separate @ConTeXt{} mode is now included.
+Macro definitions for completion are available in Dutch and English.
+
+@item
+The filling and indentation code was overhauled and is now able to
+format commented parts of the source syntactically correct.  Newly
+available functionality and customization options are explained in the
+manual.
+
+@item
+Filling and indentation in XEmacs with preview-latex and activated
+previews lead to the insertion of whitespace before multi-line previews.
+@AUCTeX{} now contains facilities to prevent this problem.
+
+@item
+If @code{TeX-master} is set to @code{t}, @AUCTeX{} will now query for a
+master file only when a new file is opened.  Existing files will be left
+alone.  The new function @code{TeX-master-file-ask} (bound to @kbd{C-c
+_} is provided for adding the variable manually.
+
+@item
+Sectioning commands are now shown in a larger font on display devices
+which support such fontification.  The variable
+@code{font-latex-title-fontify} can be customized to restore the old
+appearance, i.e. the usage of a different color instead of a change in
+size.
+
+@item
+Support for @code{alphanum.sty}, @code{beamer.cls}, @code{booktabs.sty},
+@code{captcont.sty}, @code{emp.sty}, @code{paralist.sty},
+@code{subfigure.sty} and @code{units.sty}/@code{nicefrac.sty} was added.
+Credits go to the authors mentioned in the respective @AUCTeX{} style
+files.
+
+@item
+Inserting graphics with @kbd{C-c RET \includegraphics RET} was improved.
+See the variable @code{LaTeX-includegraphics-options-alist}.
+@c FIXME: Document this in the main part of the manual
+
+@item
+If @code{LaTeX-default-position} is @code{nil}, don't prompt for
+position arguments in Tabular-like
+@ifset rawfile
+environments.
+@end ifset
+@ifclear rawfile
+environments, see @ref{Tabular-like}.
+@end ifclear
+
+@item
+Completion for available packages when using @kbd{C-c RET \usepackage
+RET} was improved on systems using the kpathsea library.
+
+@item
+The commenting functionality was fixed.  The separate functions for
+commenting and uncommenting were unified in one function for paragraphs
+and regions respectively which do both.
+
+@item
+Syntax highlighting can be customized to fontify quotes delimited by
+either >>German<< or <<French>> quotation marks by changing the variable
+@code{font-latex-quotes}.
+
+@item
+Certain @TeX{}/@LaTeX{} keywords for functions, references, variables
+and warnings will now be fontified specially.  You may add your own
+keywords by customizing the variables
+@code{font-latex-match-function-keywords},
+@code{font-latex-match-reference-keywords},
+@code{font-latex-match-variable-keywords} and
+@code{font-latex-match-warning-keywords}.
+
+@item
+If you include the style files @file{german} or @file{ngerman} in a
+document (directly or via the @samp{babel} package), you should now
+customize @code{LaTeX-german-open-quote},
+@code{LaTeX-german-close-quote} and
+@code{LaTeX-german-quote-after-quote} instead of @code{TeX-open-quote},
+@code{TeX-close-quote} and @code{TeX-quote-after-quote} if you want to
+influence the type of quote insertion.
+
+@item
+Upon viewing an output file, the right viewer and command line options
+for it are now determined automatically by looking at the extension of
+the output file and certain options used in the source file.  The
+behavior can be adapted or extended respectively by customizing the
+variable @code{TeX-output-view-style}.
+
+@item
+You can control whether @code{TeX-insert-macro} (@kbd{C-c RET}) ask for
+all optional arguments by customizing the variable
+@ifset rawfile
+@code{TeX-insert-macro-default-style}.
+@end ifset
+@ifclear rawfile
+@code{TeX-insert-macro-default-style}, @ref{Completion}.
+@end ifclear
+
+@item
+@code{TeX-run-discard} is now able to completely detach a process that
+it started.
+
+@item
+The build process was enhanced and is now based on @code{autoconf}
+making installing AUC@TeX{} a mostly automatic process.  See
+@ifset rawfile
+the files @file{INSTALL} and @file{INSTALL.windows}
+@end ifset
+@ifclear rawfile
+@ref{Installation} and @ref{Installation under MS Windows}
+@end ifclear
+for details.
+@end itemize
+
+@heading News in 11.14
+
+@itemize @bullet
+@item
+Many more LaTeX and LaTeX2e commands are supported.
+Done by Masayuki Ataka  <ataka@@milk.freemail.ne.jp>
+@end itemize
+
+@heading News in 11.12
+
+@itemize @bullet
+@item
+Support for the KOMA-Script classes.
+Contributed by Mark Trettin <Mark.Trettin@@gmx.de>.
+@end itemize
+
+@heading News in 11.11
+
+@itemize @bullet
+@item
+Support for @file{prosper.sty}, see @url{http://prosper.sourceforge.net/}.
+Contributed by Phillip Lord <p.lord@@russet.org.uk>.
+@end itemize
+
+@heading News in 11.10
+
+@itemize @bullet
+@item
+@code{comment-region} now inserts @t{%%} by default.
+Suggested by "Davide G. M. Salvetti" <salve@@debian.org>.
+@end itemize
+
+@heading News in 11.06
+
+@itemize @bullet
+@item
+You can now switch between using the @file{font-latex} (all emacsen),
+the @file{tex-font} (Emacs 21 only) or no special package for font
+locking.  Customize @code{TeX-install-font-lock} for this.
+@end itemize
+
+@heading News in 11.04
+
+@itemize @bullet
+@item
+Now use @t{-t landscape} by default when landscape option appears.
+Suggested by Erik Frisk <frisk@@isy.liu.se>.
+@end itemize
+
+@heading News in 11.03
+
+@itemize @bullet
+@item
+Use @file{tex-fptex.el} for fpTeX support.
+Contributed by Fabrice Popineau <Fabrice.Popineau@@supelec.fr>.
+@end itemize
+
+@heading News in 11.02
+
+@itemize @bullet
+@item
+New user option @code{LaTeX-top-caption-list} specifies environments
+where the caption should go at top.
+Contributed by ataka@@milk.freemail.ne.jp (Masayuki Ataka).
+
+@item
+Allow explicit dimensions in @file{graphicx.sty}.
+Contributed by ataka@@milk.freemail.ne.jp (Masayuki Ataka).
+
+@item
+Limited support for @file{verbatim.sty}.
+Contributed by ataka@@milk.freemail.ne.jp (Masayuki Ataka).
+
+@item
+Better support for asmmath items.
+Patch by ataka@@milk.freemail.ne.jp (Masayuki Ataka).
+
+@item
+More accurate error parsing.
+Added by David Kastrup <David.Kastrup@@t-online.de>.
+@end itemize
+
+@heading News in 11.01
+
+@itemize @bullet
+@item
+Bug fixes.
+@end itemize
diff --git a/packages/auctex/doc/copying.texi b/packages/auctex/doc/copying.texi
new file mode 100644 (file)
index 0000000..b273df1
--- /dev/null
@@ -0,0 +1,48 @@
+@include macros.texi
+@c -----------------------
+@cindex Copying
+@cindex Copyright
+@cindex GPL
+@cindex General Public License
+@cindex License
+@c @cindex Free
+@c @cindex Free software
+@c @cindex Distribution
+@c @cindex Right
+@cindex Warranty
+
+(This text is stolen from the Texinfo manual, Edition 4.0).
+
+The programs currently being distributed that relate to @previewlatex{}
+include lisp files for Emacs and style files for @LaTeX{}.  These
+programs are @dfn{free}; this means that everyone is free to use them
+and free to redistribute them on a free basis.  The @previewlatex{}
+related programs are not in the public domain; they are copyrighted and
+there are restrictions on their distribution, but these restrictions are
+designed to permit everything that a good cooperating citizen would want
+to do.  What is not allowed is to try to prevent others from further
+sharing any version of these programs that they might get from you.
+
+Specifically, we want to make sure that you have the right to give away
+copies of the programs that relate to @previewlatex{}, that you receive
+source code or else can get it if you want it, that you can change these
+programs or use pieces of them in new free programs, and that you know
+you can do these things.
+
+To make sure that everyone has such rights, we have to forbid you to
+deprive anyone else of these rights.  For example, if you distribute
+copies of the @previewlatex{} related programs, you must give the
+recipients all the rights that you have.  You must make sure that they,
+too, receive or can get the source code.  And you must tell them their
+rights.
+
+Also, for our own protection, we must make certain that everyone finds
+out that there is no warranty for the programs that relate to
+@previewlatex{}.  If these programs are modified by someone else and
+passed on, we want their recipients to know that what they have is not
+what we distributed, so that any problems introduced by others will not
+reflect on our reputation.
+
+The precise conditions of the licenses for the programs currently being
+distributed that relate to @previewlatex{} are found in the General Public
+Licenses that accompany them.
diff --git a/packages/auctex/doc/faq.texi b/packages/auctex/doc/faq.texi
new file mode 100644 (file)
index 0000000..6048432
--- /dev/null
@@ -0,0 +1,148 @@
+@ifset rawfile
+@include macros.texi
+@chapheading Frequently Asked Questions about @AUCTeX{}
+@end ifset
+
+@c We should switch to sectioning commands instead of items when this
+@c list grows.  Keep in mind to formulate short questions because
+@c section headings will not be broken in contrast to items.
+@enumerate
+@item
+Something is not working correctly.  What should I do?
+
+Well, you might have guessed it, the first place to look is in the
+available documentation packaged with @AUCTeX{}.  This could be the
+release notes (in the @file{RELEASE} file) or the news section of the
+manual in case you are experiencing problems after an upgrade, the
+@file{INSTALL} file in case you are having problems with the
+installation, the section about bugs in the manual in case you
+encountered a bug or the relevant sections in the manual for other
+related problems.
+
+If this did not help, you can send a bug report to the @AUCTeX{} bug
+reporting list by using the command @kbd{M-x TeX-submit-bug-report RET}.
+But before you do this, you can try to get more information about the
+problem at hand which might also help you locate the cause of the error
+yourself.
+
+First, you can try to generate a so-called backtrace which shows
+functions involved in a program error.  In order to do this, start Emacs
+with the command line @samp{emacs --debug-init} and/or put the line
+
+@lisp
+(setq debug-on-error t)
+@end lisp
+
+as the first line into your init file.  XEmacs users might want to add
+@code{(setq stack-trace-on-error t)} as well.  After Emacs has started,
+you can load a file which triggers the error and a new window should pop
+up showing the backtrace.  If you get such a backtrace, please include
+it in the bug report.
+
+Second, you can try to figure out if something in your personal or site
+configuration triggers the error by starting Emacs without such
+customizations.  You can do this by invoking Emacs with the command line
+@samp{emacs -q -no-site-file}.  Once Emacs is running, copy the line
+
+@lisp
+(load "auctex.el" nil t t)
+@end lisp
+
+into the @samp{*scratch*} buffer and type @kbd{M-x eval-buffer RET}.
+This makes sure that @AUCTeX{} will be used for the file types it
+supports.  After you have done so, you can load the file triggering the
+error.  If everything is working now, you know that you have to search
+either in the site configuration file or your personal init file for
+statements related to the problem.
+
+@item
+What versions of Emacs and XEmacs are supported?
+
+@AUCTeX{} was tested with @w{Emacs 21} and @w{XEmacs 21.4.15}.  Older
+versions may work but are unsupported.  Older versions of XEmacs might
+possibly made to work by updating the @file{xemacs-base} package through
+the XEmacs package system.  If you are looking for a recommendation, it
+would appear that the smoothest working platform on all operating
+systems at the current point of time would be @w{Emacs 22.1}.  At the
+time of this writing, however, it has not been released and is still
+under development.  The quality of the development version is quite
+solid, so we recommend giving it a try.  With a developer version, of
+course, you have to be prepared to update in case you managed to get
+your snapshot at a bad time.  The second best choice would be the latest
+released @w{Emacs 21.4}.  However, Unicode support is less good, there
+is no version for the popular GTK toolkit, and the native versions for
+Windows and MacOS don't offer toolbar and @previewlatex{} support.
+
+Our success with XEmacs has been less than convincing.  Under the
+Windows operating system, nominally the only option for a released,
+stable Emacs variant supporting toolbars and @previewlatex{} would be
+@w{XEmacs 21.4}.  However, code for core functionality like formatting
+and syntax highlighting tends to be different and often older than even
+@w{Emacs 21.4}, and Unicode support as delivered is problematic at best,
+missing on Windows.  Both @AUCTeX{} and XEmacs developers don't hear
+much from active users of the combination.  Partly for that reason,
+problems tend to go unnoticed for long amounts of time and are often
+found, if at all, after releases.  No experiences or recommendations can
+be given for beta or developer versions of XEmacs.
+
+@item
+What should I do when @code{./configure} does not find programs like latex?
+
+This is problem often encountered on Windows.  Make sure that the
+@env{PATH} environment variable includes the directories containing the
+relevant programs, as described in
+@ifset rawfile
+the file @file{INSTALL.windows}
+@end ifset
+@ifclear rawfile
+@ref{Installation under MS Windows,,,auctex,the @AUCTeX{} manual}.
+@end ifclear
+
+@item
+Why doesn't the completion, style file, or multi-file stuff work?
+
+It must be enabled first, insert this in your init file:
+
+@lisp
+(setq-default TeX-master nil)
+(setq TeX-parse-self t)
+(setq TeX-auto-save t)
+@end lisp
+
+Read also the chapters about parsing and multifile documents in the
+manual.
+
+@item
+Why doesn't @code{TeX-save-document} work?
+
+@code{TeX-check-path} has to contain "./" somewhere.
+
+@item
+Why is the information in @file{foo.tex} forgotten when I save
+@file{foo.bib}?
+
+For various reasons, @AUCTeX{} ignores the extension when it stores
+information about a file, so you should use unique base names for your
+files.  E.g. rename @file{foo.bib} to @file{foob.bib}.
+
+@item
+Why doesn't @AUCTeX{} signal when processing a document is done?
+
+If the message in the minibuffer stays "Type `C-c C-l' to display
+results of compilation.", you probably have a misconfiguration in your
+init file (@file{.emacs}, @file{init.el} or similar).  To track this
+down either search in the @samp{*Messages*} buffer for an error message
+or put @code{(setq debug-on-error t)} as the first line into your init
+file, restart Emacs and open a @LaTeX{} file.  Emacs will complain
+loudly by opening a debugging buffer as soon as an error occurs.  The
+information in the debugging buffer can help you find the cause of the
+error in your init file.
+
+@item
+What does AUC stand for?
+
+@AUCTeX{} came into being at Aalborg University in Denmark.  Back then
+the Danish name of the university was Aalborg Universitetscenter; AUC
+for short.
+
+@end enumerate
diff --git a/packages/auctex/doc/fdl.texi b/packages/auctex/doc/fdl.texi
new file mode 100644 (file)
index 0000000..ca18562
--- /dev/null
@@ -0,0 +1,506 @@
+@node GNU Free Documentation License
+@appendixsec GNU Free Documentation License
+
+@cindex FDL, GNU Free Documentation License
+@center Version 1.3, 3 November 2008
+
+@display
+Copyright @copyright{} 2000, 2001, 2002, 2007, 2008 Free Software
+Foundation, Inc.  @uref{http://fsf.org/}
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+@end display
+
+@enumerate 0
+@item
+PREAMBLE
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document @dfn{free} in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+
+This License is a kind of ``copyleft'', which means that derivative
+works of the document must themselves be free in the same sense.  It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does.  But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book.  We recommend this License
+principally for works whose purpose is instruction or reference.
+
+@item
+APPLICABILITY AND DEFINITIONS
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License.  Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein.  The ``Document'', below,
+refers to any such manual or work.  Any member of the public is a
+licensee, and is addressed as ``you''.  You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+
+A ``Modified Version'' of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A ``Secondary Section'' is a named appendix or a front-matter section
+of the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall
+subject (or to related matters) and contains nothing that could fall
+directly within that overall subject.  (Thus, if the Document is in
+part a textbook of mathematics, a Secondary Section may not explain
+any mathematics.)  The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+
+The ``Invariant Sections'' are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License.  If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant.  The Document may contain zero
+Invariant Sections.  If the Document does not identify any Invariant
+Sections then there are none.
+
+The ``Cover Texts'' are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License.  A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+
+A ``Transparent'' copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters.  A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text.  A copy that is not ``Transparent'' is called ``Opaque''.
+
+Examples of suitable formats for Transparent copies include plain
+@sc{ascii} without markup, Texinfo input format, La@TeX{} input
+format, @acronym{SGML} or @acronym{XML} using a publicly available
+@acronym{DTD}, and standard-conforming simple @acronym{HTML},
+PostScript or @acronym{PDF} designed for human modification.  Examples
+of transparent image formats include @acronym{PNG}, @acronym{XCF} and
+@acronym{JPG}.  Opaque formats include proprietary formats that can be
+read and edited only by proprietary word processors, @acronym{SGML} or
+@acronym{XML} for which the @acronym{DTD} and/or processing tools are
+not generally available, and the machine-generated @acronym{HTML},
+PostScript or @acronym{PDF} produced by some word processors for
+output purposes only.
+
+The ``Title Page'' means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page.  For works in
+formats which do not have any title page as such, ``Title Page'' means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+
+The ``publisher'' means any person or entity that distributes copies
+of the Document to the public.
+
+A section ``Entitled XYZ'' means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language.  (Here XYZ stands for a
+specific section name mentioned below, such as ``Acknowledgements'',
+``Dedications'', ``Endorsements'', or ``History''.)  To ``Preserve the Title''
+of such a section when you modify the Document means that it remains a
+section ``Entitled XYZ'' according to this definition.
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document.  These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+
+@item
+VERBATIM COPYING
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License.  You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute.  However, you may accept
+compensation in exchange for copies.  If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+
+@item
+COPYING IN QUANTITY
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover.  Both covers must also clearly and legibly identify
+you as the publisher of these copies.  The front cover must present
+the full title with all words of the title equally prominent and
+visible.  You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+
+@item
+MODIFICATIONS
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it.  In addition, you must do these things in the Modified Version:
+
+@enumerate A
+@item
+Use in the Title Page (and on the covers, if any) a title distinct
+from that of the Document, and from those of previous versions
+(which should, if there were any, be listed in the History section
+of the Document).  You may use the same title as a previous version
+if the original publisher of that version gives permission.
+
+@item
+List on the Title Page, as authors, one or more persons or entities
+responsible for authorship of the modifications in the Modified
+Version, together with at least five of the principal authors of the
+Document (all of its principal authors, if it has fewer than five),
+unless they release you from this requirement.
+
+@item
+State on the Title page the name of the publisher of the
+Modified Version, as the publisher.
+
+@item
+Preserve all the copyright notices of the Document.
+
+@item
+Add an appropriate copyright notice for your modifications
+adjacent to the other copyright notices.
+
+@item
+Include, immediately after the copyright notices, a license notice
+giving the public permission to use the Modified Version under the
+terms of this License, in the form shown in the Addendum below.
+
+@item
+Preserve in that license notice the full lists of Invariant Sections
+and required Cover Texts given in the Document's license notice.
+
+@item
+Include an unaltered copy of this License.
+
+@item
+Preserve the section Entitled ``History'', Preserve its Title, and add
+to it an item stating at least the title, year, new authors, and
+publisher of the Modified Version as given on the Title Page.  If
+there is no section Entitled ``History'' in the Document, create one
+stating the title, year, authors, and publisher of the Document as
+given on its Title Page, then add an item describing the Modified
+Version as stated in the previous sentence.
+
+@item
+Preserve the network location, if any, given in the Document for
+public access to a Transparent copy of the Document, and likewise
+the network locations given in the Document for previous versions
+it was based on.  These may be placed in the ``History'' section.
+You may omit a network location for a work that was published at
+least four years before the Document itself, or if the original
+publisher of the version it refers to gives permission.
+
+@item
+For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve
+the Title of the section, and preserve in the section all the
+substance and tone of each of the contributor acknowledgements and/or
+dedications given therein.
+
+@item
+Preserve all the Invariant Sections of the Document,
+unaltered in their text and in their titles.  Section numbers
+or the equivalent are not considered part of the section titles.
+
+@item
+Delete any section Entitled ``Endorsements''.  Such a section
+may not be included in the Modified Version.
+
+@item
+Do not retitle any existing section to be Entitled ``Endorsements'' or
+to conflict in title with any Invariant Section.
+
+@item
+Preserve any Warranty Disclaimers.
+@end enumerate
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant.  To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+
+You may add a section Entitled ``Endorsements'', provided it contains
+nothing but endorsements of your Modified Version by various
+parties---for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version.  Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity.  If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+
+@item
+COMBINING DOCUMENTS
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy.  If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections Entitled ``History''
+in the various original documents, forming one section Entitled
+``History''; likewise combine any sections Entitled ``Acknowledgements'',
+and any sections Entitled ``Dedications''.  You must delete all
+sections Entitled ``Endorsements.''
+
+@item
+COLLECTIONS OF DOCUMENTS
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+
+@item
+AGGREGATION WITH INDEPENDENT WORKS
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an ``aggregate'' if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+
+@item
+TRANSLATION
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections.  You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers.  In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+
+If a section in the Document is Entitled ``Acknowledgements'',
+``Dedications'', or ``History'', the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+
+@item
+TERMINATION
+
+You may not copy, modify, sublicense, or distribute the Document
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense, or distribute it is void, and
+will automatically terminate your rights under this License.
+
+However, if you cease all violation of this License, then your license
+from a particular copyright holder is reinstated (a) provisionally,
+unless and until the copyright holder explicitly and finally
+terminates your license, and (b) permanently, if the copyright holder
+fails to notify you of the violation by some reasonable means prior to
+60 days after the cessation.
+
+Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, receipt of a copy of some or all of the same material does
+not give you any rights to use it.
+
+@item
+FUTURE REVISIONS OF THIS LICENSE
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation License from time to time.  Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.  See
+@uref{http://www.gnu.org/copyleft/}.
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License ``or any later version'' applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation.  If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.  If the Document
+specifies that a proxy can decide which future versions of this
+License can be used, that proxy's public statement of acceptance of a
+version permanently authorizes you to choose that version for the
+Document.
+
+@item
+RELICENSING
+
+``Massive Multiauthor Collaboration Site'' (or ``MMC Site'') means any
+World Wide Web server that publishes copyrightable works and also
+provides prominent facilities for anybody to edit those works.  A
+public wiki that anybody can edit is an example of such a server.  A
+``Massive Multiauthor Collaboration'' (or ``MMC'') contained in the
+site means any set of copyrightable works thus published on the MMC
+site.
+
+``CC-BY-SA'' means the Creative Commons Attribution-Share Alike 3.0
+license published by Creative Commons Corporation, a not-for-profit
+corporation with a principal place of business in San Francisco,
+California, as well as future copyleft versions of that license
+published by that same organization.
+
+``Incorporate'' means to publish or republish a Document, in whole or
+in part, as part of another Document.
+
+An MMC is ``eligible for relicensing'' if it is licensed under this
+License, and if all works that were first published under this License
+somewhere other than this MMC, and subsequently incorporated in whole
+or in part into the MMC, (1) had no cover texts or invariant sections,
+and (2) were thus incorporated prior to November 1, 2008.
+
+The operator of an MMC Site may republish an MMC contained in the site
+under CC-BY-SA on the same site at any time before August 1, 2009,
+provided the MMC is eligible for relicensing.
+
+@end enumerate
+
+@page
+@heading ADDENDUM: How to use this License for your documents
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+
+@smallexample
+@group
+  Copyright (C)  @var{year}  @var{your name}.
+  Permission is granted to copy, distribute and/or modify this document
+  under the terms of the GNU Free Documentation License, Version 1.3
+  or any later version published by the Free Software Foundation;
+  with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+  Texts.  A copy of the license is included in the section entitled ``GNU
+  Free Documentation License''.
+@end group
+@end smallexample
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the ``with@dots{}Texts.'' line with this:
+
+@smallexample
+@group
+    with the Invariant Sections being @var{list their titles}, with
+    the Front-Cover Texts being @var{list}, and with the Back-Cover Texts
+    being @var{list}.
+@end group
+@end smallexample
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
+
+@c Local Variables:
+@c ispell-local-pdict: "ispell-dict"
+@c End:
+
diff --git a/packages/auctex/doc/history.texi b/packages/auctex/doc/history.texi
new file mode 100644 (file)
index 0000000..0595bb6
--- /dev/null
@@ -0,0 +1,1918 @@
+@include macros.texi
+@section News in 10.0
+
+@itemize @bullet
+
+@item
+Disabled @code{LaTeX-hide-environment}.
+Suggested by Christopher Allen <cpcallen@@ruah.dyndns.org>.
+
+@item
+Changed default to lazy evaluation of @code{TeX-view-style} and
+@code{LaTeX-command-style}.
+Suggested by Peter Neergaard <turtle@@cs.bu.edu>.
+
+@item
+Backindent when brace is at the start of a line.
+Patch by Masashi Shimbo <shimbo@@cis.ibaraki.ac.jp>.
+
+@item
+Added Emacs 21 font lock support.
+
+@item
+@kbd{,} and @kbd{.} no longer removes italic correction.
+
+@item
+@code{graphicx} and @code{graphics} style support.
+Donated by Ryuichi Arafune <arafune@@ushioda.riec.tohoku.ac.jp>.
+
+@item
+@code{LaTeX-math-abbrev-prefix} now accepts vector value.
+Reported by Jan Vroonhof <vroonhof@@math.ethz.ch>.
+
+@item
+Improved Texinfo support(more environments and html).
+Patch by Akim Demaille <akim@@epita.fr>.
+
+@item
+@code{danish} quotes support.
+Suggested by arne@@daimi.au.dk (Arne Joergensen).
+
+@item
+Some PDF support.
+
+@item
+New @file{tex-mik.el} file for MiK@TeX{} support.
+
+@item
+Some commands now have their own history.
+Suggested by Werner LEMBERG <sx0005@@sx2.HRZ.Uni-Dortmund.DE>.
+
+@item
+Use @code{\centering} instead of center environment in figures.
+Patch by Stefan Monnier <foo@@acm.com>.
+
+@item 
+New @code{dwim} setting for @code{TeX-master} attempts to guess
+a default master for new files.
+Patch by Stefan Monnier <foo@@acm.com>.
+
+@item 
+@code{ngerman} style support.
+Just a copy of the german style support.
+
+@item
+Removed support for Emacs 18 and 19.
+
+@item @code{mdwlist} support.
+Patch by Stephen Heilbronner <heilbron@@nm.informatik.uni-muenchen.de>.
+
+@item
+Fixed various bugs with the babel package.
+
+@item @code{amsart} and @code{amsbook} now loads @code{amsthm} by default.
+Patch by Rune Kleveland <runekl@@math.uio.no>.
+
+@item Fixed bug with file searching.
+Reported by Berwin Turlach <bturlach@@maths.adelaide.edu.au>.
+
+@item Finalized index support, added index-related style files.
+Patch by Carsten Dominik <dominik@@strw.leidenuniv.nl>.
+
+@item New style files for @file{varioref.sty} and @file{fancyref.sty}.
+Patch by Carsten Dominik <dominik@@strw.leidenuniv.nl>.
+
+@item @code{texmathp} recognizes additional macros like @code{\fbox}.
+Patch by Ulrik Vieth <vieth@@thphy.uni-duesseldorf.de>.
+
+@end itemize
+
+@section News in 9.9
+
+@itemize @bullet
+@item Bug fix in JLATEX recognition.  Patch by
+Tsutomu OKUMURA <oku@@nml.t.u-tokyo.ac.jp>.
+
+@item Bug fix in foils package sypport.
+Suggested by Bernt Guldbrandtsen <bernt@@jupiter.ansci.iastate.edu>.
+
+@item Made @code{make install-contrib} compile the contributed lisp
+files. 
+Suggested by Nils Ackermann <Nils.Ackermann@@math.uni-giessen.de>. 
+
+@item In @code{texinfo-mode}, @kbd{C-c C-f C-d} now deletes the current
+font, while @kbd{C-u C-c C-f @var{key}} changes it.  @samp{@@dfn} moved
+to @kbd{C-c C-f d}.  Suggested by Christoph Wedler
+<wedler@@fmi.uni-passau.de>.
+
+@item Fixed some custom types.  
+Patch by Markus Rost <markus.rost@@mathematik.uni-regensburg.de>.
+
+@item Support loading byte compiled files, even if
+@code{TeX-byte-compile} is nil.
+Patch by Christoph Wedler  <wedler@@fmi.uni-passau.de>.
+
+@item The command to replace a LaTeX2e font should work more reliably
+now.  Patch by Christoph Wedler  <wedler@@fmi.uni-passau.de>.
+
+@item Minor XEmacs packaging changes.
+Patch by Christoph Wedler  <wedler@@fmi.uni-passau.de>.
+
+@item @code{TeX-file-recurse} now accepts an integer value, max depth of
+recursion.  Patch by Alastair Burt  <burt@@dfki.bde>.
+
+@item Simple imenu support for @LaTeX{}.
+
+@item Workaround for 20.3 bugs. 
+
+@item The `Spell' command now works on all open buffers in the
+document.  Patch by Jason Stewart <jasons@@cs.unm.edu>.
+
+@item @kbd{C-c C-m} now puts content of region inside first empty brackets
+in the macro, if any.  Patch by Peter Thiemann <pjt@@cs.nott.ac.uk>.
+
+@item Update of @file{natbib.el} style file by Carsten Dominik
+<dominik@@strw.LeidenUniv.nl>.
+
+@item Much better detection of @TeX{} math mode.  Patch by Carsten Dominik
+<dominik@@strw.LeidenUniv.nl>.
+
+@item New @samp{%n} escape in @code{TeX-command-list} for entering the
+current line number.  Suggested by "Lee, Sang-Min"
+<smagus@@acorn.snu.ac.kr>. 
+
+@item Doc fixes in manual.  Patch by Gustavo Chaves
+<gustavo@@cpqd.com.br>.
+
+@item Better reftex support for sections.  Patch by Carsten Dominik
+<dominik@@strw.LeidenUniv.nl>. 
+
+@item Bug fixes in math card.  Reported by "Ron Smith"
+<rsmith@@eel.ufl.edu>. 
+
+@item Better multifile support.  Patch by Soren Dayton
+<csdayton@@cs.uchicago.edu>. 
+
+@item Don't expand abbreviations when @code{abbrev-mode} is nil.
+Suggested by Alastair Burt <alastair.burt@@dfki.de>.
+
+@item @samp{direntry} support in manual, by SL Baur
+<steve@@altair.xemacs.org>. 
+@end itemize
+
+@section News in 9.8
+
+@itemize @bullet
+@item Added @code{natbib.el} to support natbib.sty by Patrick W. Daly.
+Submitted by Berwin A. Turlach @samp{<berwin.turlach@@anu.edu.au>}.
+
+@item
+More @LaTeX{}2e support by Jan Vroonhof
+@samp{<vroonhof@@math.ethz.ch>}.@refill
+
+@item Make @code{TeX-master} a local variable in Bib@TeX{} mode and set
+it to true.  This seems to be necessary to enable auto-parsing of a .bib
+file.  Patch by Berwin A. Turlach @samp{<berwin.turlach@@anu.edu.au>}.
+
+@item Support for Harvard style updated by Berwin A. Turlach
+@samp{<berwin.turlach@@anu.edu.au>}.
+
+@item
+Support for `natbib' package.
+By Berwin Turlach @samp{<berwin.turlach@@anu.edu.au>}. 
+
+@item 
+Finer control of automatic parsing of @TeX{} files: new variables
+@code{TeX-auto-x-parse-length} and @code{TeX-auto-x-regexp-list}.
+By Christoph Wedler @samp{<wedler@@fmi.uni-passau.de>}.
+
+@item 
+Finer control of indentation: new variables @code{LaTeX-document-regexp},
+@code{LaTeX-verbatim-regexp}, @code{LaTeX-begin-regexp},
+@code{LaTeX-end-regexp} and @code{LaTeX-indent-comment-start-regexp}.
+By Christoph Wedler @samp{<wedler@@fmi.uni-passau.de>}.
+
+@item 
+When running @LaTeX{} on a region, do not complain about undefined
+citations.  See variable @code{TeX-region-extra}.
+By Christoph Wedler @samp{<wedler@@fmi.uni-passau.de>}.
+
+@item 
+Split menu for LaTeX environments into submenus if number of
+environments is larger than the value of the new variable
+@code{LaTeX-menu-max-items}.
+By Christoph Wedler @samp{<wedler@@fmi.uni-passau.de>}.
+
+@item
+More reftex support with new @code{TeX-arg-ref} function.
+By Soren Dayton @samp{<csdayton@@cs.uchicago.edu>}, with @file{amsmath}
+support by Carsten Dominik @samp{<dominik@@strw.LeidenUniv.nl>}.
+
+@item
+Minimal parser now recognize @code{usepackage}.
+By Carsten Dominik @samp{<dominik@@strw.LeidenUniv.nl>}.
+
+@item
+More amstex styles recognized.
+By Carsten Dominik @samp{<dominik@@strw.LeidenUniv.nl>}.
+
+@item
+Czech and Slovak support.
+By Milan Zamazal @samp{<pdm@@fi.muni.cz>}. 
+
+@end itemize
+
+
+@section News in 9.7
+
+@itemize @bullet
+@item
+Added support for customize.
+
+@item 
+Added minimal support for @code{sentence-end-double-space}.
+
+@end itemize
+
+@section News in 9.6
+
+@itemize @bullet
+@item
+NT installation instructions added.
+
+@item
+@file{func-doc.el} unbundled, as @file{word-help.el} will be added to
+the standard Emacs distribution.  See @url{http://www.ifi.uio.no/~jensthi/}.
+
+@item 
+@samp{$} is now of the syntax class `matched pair', suggested by Mats
+Bengtsson @samp{<matsb@@s3.kth.se>}.
+
+@item 
+Now use @kbd{,} to enter multiple arguments to a @samp{\cite} or
+@samp{\bibliography} command instead of @kbd{@key{ret}}.
+
+@item
+Installation procedure is changed, read the @file{INSTALLATION} file. 
+
+@item
+LaCheck is unbundled.  You can get @code{lacheck} from
+@file{<URL:ftp://sunsite.dk/pub/text/lacheck/>} or alternatively
+@code{chktex} from
+@file{<URL:ftp://ftp.dante.de/pub/tex/support/chktex/>}.  Search for
+`chktex' in @file{tex.el} to see how to switch between them.@refill
+
+@item 
+Insert @code{(require 'font-latex)} to get better font lock support. 
+
+@item
+Bug fixes.
+
+@item
+Better handling of subdirectories, suggested by Frederic Devernay
+@samp{<Frederic.Devernay@@sophia.inria.fr>} and many others.
+@end itemize
+
+@section News in 9.5
+
+@itemize @bullet
+@item Use the @file{func-doc.el} package to get context senstive help.
+This is not autoloaded, you must load it explicitly with:
+
+@lisp
+(require 'func-doc)
+@end lisp
+
+@item
+Bug fixes.
+
+@end itemize
+
+@section News in 9.4
+
+@itemize @bullet
+@item There is now a menu in @code{LaTeX-math-minor-mode}.
+
+@item
+Bug fixes.
+@end itemize
+
+@section News in 9.3
+
+@itemize @bullet
+@item
+Bug fixes.
+@end itemize
+
+@section News in 9.2
+
+@itemize @bullet
+@item 
+Bug fixes.
+
+@item
+New file @file{bib-cite.el} contributed by Peter S. Galbraith
+@samp{<rhogee@@bathybius.meteo.mcgill.ca>}.  This file is not installed
+or enabled by default and is not part of the basic AUC @TeX{}
+package. If you have problems, questions, or suggestions, please direct
+them to Peter.
+
+@item
+New file @file{hilit-LaTeX.el} contributed by Peter S. Galbraith
+@samp{<rhogee@@bathybius.meteo.mcgill.ca>}.  This file is not installed
+or enabled by default and is not part of the basic AUC @TeX{}
+package. If you have problems, questions, or suggestions, please direct
+them to Peter.
+
+@item
+AUC @TeX{} is now less likely to suggest running Bib@TeX{} when it is
+not needed.
+
+@item
+Press @kbd{M-x LaTeX-209-to-2e @key{ret}} to make a stab at converting a
+@LaTeX{} 2.09 header to @LaTeX{}2e.
+
+@item
+@kbd{C-c C-m input @key{ret}} should be faster now on second try.
+
+@item
+New variable @code{LaTeX-left-right-indent-level} controls the
+indentation added by @samp{\left}.
+
+@item
+@samp{\begin}, @samp{\end}, @samp{\left}, and @samp{\right} no longer
+need to be at the beginning of the line to take effect. 
+
+@item
+You can now delete and replace @LaTeX{}2e style fonts.
+
+@item
+Moved external commands to new menu.
+
+@item
+@kbd{C-c C-m cite @key{ret}} will prompt for multiple keys.
+
+@item
+Better handling of @samp{"} with @file{german.sty}.
+
+@item
+New variable @code{LaTeX-paragraph-commands} lists @LaTeX{} commands
+that shouldn't be formatted as part of a paragraph.
+
+@item
+Older news moved to @file{HISTORY}.  It is not @TeX{}info able, but you
+can get a plaintext version with @samp{make HISTORY}.
+
+@item
+See the new @file{ChangeLog} file for a more detailed list of changes.
+The history section will now only contain user level changes.  If you
+send me a patch, please also provide a ChangeLog entry.
+@end itemize
+
+@node Version 9.1
+@section News in 9.1
+
+Coordinater: Per Abrahamsen, 1994.
+
+Alpha testers (in order of appearance): 
+Bernt Guldbrandtsen @samp{<bernt@@weinberg.pop.bio.aau.dk>},
+Kevin Scott @samp{<scottkj@@prl.philips.co.uk>},
+Lawrence R. Dodd @samp{<dodd@@roebling.poly.edu>},
+Michelangelo Grigni @samp{<mic@@cs.ucsd.edu>},
+David Aspinall @samp{<da@@dcs.edinburgh.ac.uk>},
+Frederic Devernay @samp{<Frederic.Devernay@@sophia.inria.fr>},
+Robert Estes @samp{<estes@@ece.ucdavis.edu>},
+Peter Whaite @samp{<peta@@cim.mcgill.ca>},
+Karl Eichwalder @samp{<karl@@pertron.central.de>},
+John Interrante @samp{<interran@@uluru.Stanford.EDU>},
+James A. Robinson @samp{<jimr@@simons-rock.edu>},
+Tim Carlson @samp{<imsgtcar@@mathfs.math.montana.edu>},
+Michelangelo Grigni @samp{<mic@@cs.ucsd.edu>},
+Manoj Srivastava @samp{<srivasta@@pilgrim.umass.edu>},
+Richard Stanton @samp{<stanton@@haas.berkeley.edu>},
+Kobayashi Shinji @samp{<koba@@flab.fujitsu.co.jp>},
+and probably more.@refill
+
+@itemize @bullet
+@item
+@LaTeX{}2e is now default.  Set @code{LaTeX-version} to @samp{"2"} to
+disable this.
+
+@item
+Better handling of @samp{*TeX background*} buffer.  Suggested by John
+Interrante @samp{<interran@@uluru.Stanford.EDU>}. 
+
+@item
+Parser did not recognise the use of @samp{\def} to create @LaTeX{}
+environments.  Reported by Frederic Devernay
+@samp{<Frederic.Devernay@@sophia.inria.fr>}. 
+
+@item
+Minor cleanup in some error messages.
+
+@item
+Fixed bug in @code{TeX-comment-paragraph} when called with a negative
+argument.  Reported by Markus Kramer @samp{<kramer@@inf.fu-berlin.de>}. 
+
+@item
+Don't move point in master file when running a command on the region in
+an included file.  Thanks to Karl Wilhelm Langenberger
+@samp{<wlang@@rs6000.mri.akh-wien.ac.at>} for the patch.
+
+@item
+@code{LaTeX-math-mode} no longer works on Emacs 18 or older Lucid
+versions.  This change allowed me to unbundle @file{min-map.el}.
+
+@item
+Made @kbd{C-c C-e} more robust, especially when applied on an empty
+active region.  Reported by Andrew Senior @samp{<aws@@eng.cam.ac.uk>}.
+
+@item
+@kbd{C-c C-m section RET} and @kbd{M-@key{tab}} should work now in
+@TeX{}info mode.  @kbd{C-c C-b} and @kbd{C-c C-r} removed, since they
+did not work.  Reported by Karl Eichwalder
+@samp{<karl@@pertron.central.de>}.
+
+@item
+Made @kbd{M-q} skip block comments.  Sugested by Peter Whaite
+@samp{<peta@@cim.mcgill.ca>}. 
+
+@item
+Code cleanup:  Renamed @samp{-format-} functions to @samp{-fill-}. 
+
+@item
+Made @kbd{,} and @kbd{.} remove any preceding italic correction.
+
+@item
+Changes in math mode: @samp{setminus} moved to @key{\}, @samp{not} moved
+to @key{/}, and @samp{wedge}, @samp{vee}, and @samp{neg} installed on
+@key{&}, @kbd{|}, and @kbd{!} to make writing logic easier for C
+programmers.
+
+@item
+Renamed @file{auc-tex.el} to @file{auc-old.el} to make it less likely
+that new users load it by mistake.
+
+@item
+Changed name of @file{easymenu.el} to @file{auc-menu.el} to avoid
+conflict with RMS's version.  Updated it to handle the Lucid
+@code{:keys} keyword argument.  Defines a popup menu for both FSF and
+Lucid emacs, although it is only installed in Lucid Emacs.  Added David
+Aspinall's @samp{<da@@dcs.edinburgh.ac.uk>} patch to handle an empty
+menu bar under Lucid Emacs.  The interface is still a superset of
+@file{easymenu.el}.  This version should no longer prevent the sharing
+of byte compiled files between FSF and Lucid emacs.
+
+@item
+Marking a section or environment now highlight it in Lucid Emacs.  It
+already worked in GNU Emacs.  Thanks to Andreas Ernst
+@samp{ernst_a@@maths.uwa.edu.au}.
+
+@item
+Font support for @LaTeX{}2e.  Many people suggested this.
+Automatically activated for all documents defined with
+@samp{\documentclass}. 
+
+@item
+Outline support for @LaTeX{}2e fixed by Robert Estes
+@samp{<estes@@ece.ucdavis.edu>}. 
+
+@item
+@samp{bibliography} macro now works.  Thanks to Frederic Devernay
+@samp{<Frederic.Devernay@@sophia.inria.fr>}. 
+
+@item
+Fixes to @file{psfig} support by Thomas Graichen
+@samp{<graichen@@sirius.physik.fu-berlin.de>}. 
+
+@item
+Fixed position of @samp{\label} in environments.  Reported by Richard
+Stanton @samp{<stanton@@haas.berkeley.edu>}.
+
+@item
+Made the name of the AUC @TeX{} menu mode specific.
+
+@item
+More reliable guesses with @kbd{C-c C-r}.  Thanks to Lawrence R. Dodd
+@samp{<dodd@@roebling.poly.edu>}.
+
+@item
+Insert newline before inserting local variable section.  Thanks to
+Rajeev Gore' @samp{<rpg@@cs.man.ac.uk>}.
+
+@item
+Fixes to Japanese version.  Thanks to Kobayashi Shinji
+@samp{<koba@@flab.fujitsu.co.jp>}.
+
+@item
+Fixed bug in @samp{put} and @samp{multiput} macros.  Thanks to Kobayashi
+Shinji @samp{<koba@@flab.fujitsu.co.jp>} and Masayuki Kuwada
+<kuwada@@axion-gw.ee.uec.ac.jp>. 
+
+@item
+Display number of pages after end of @LaTeX{} compilation.  Thanks to
+Lawrence R. Dodd @samp{<dodd@@roebling.poly.edu>}.
+
+@item
+Only update section and environment menus when the lists have changed.
+
+@item
+New variables @code{LaTeX-header-end} and @code{LaTeX-trailer-start}.
+
+@item
+Some Emacs 18 compatibility changes.  Thanks to Fran E. Burstall
+@samp{<F.E.Burstall@@maths.bath.ac.uk>}.
+
+@item 
+Use nonrecursive function to determine the current environment.  This
+should solve problems with exceeding lisp max depth. Contributed by
+David Aspinall @samp{<da@@dcs.edinburgh.ac.uk>}.
+
+@item
+Fixed documentation for @kbd{` ~} in @file{math-ref.tex}.  Thanks to
+Morten Welinder @samp{<terra@@diku.dk>}.
+
+@item
+Made @code{LaTeX-math-mode} work better with FSF Emacs 19 in the case
+where you press something undefined, in particular function keys.
+Requested by several.
+
+@item
+Inserting an itemize environment around the active region now insert the
+first item inside the environment.  Thanks to Berwin A. Turlach
+@samp{<berwin@@core.ucl.ac.be>} for reporting this.
+
+@item
+Fixed bug in right button menu under Lucid.  Reported by Frederic
+Devernay @samp{<Frederic.Devernay@@sophia.inria.fr>}.
+@end itemize
+
+@node Version 9.0
+@section News in 9.0
+
+Coordinator: Per Abrahamsen, 1994.
+
+Alpha testers (in order of appearance): 
+Volker Dobler @samp{<dobler@@etu.wiwi.uni-karlsruhe.de>},
+Piet van Oostrum @samp{<piet@@cs.ruu.nl>}, 
+Frederic Devernay @samp{<Frederic.Devernay@@sophia.inria.fr>}, 
+Robert Estes @samp{<estes@@ece.ucdavis.edu>},
+Berwin Turlach @samp{<berwin@@core.ucl.ac.be>},
+Tim Carlson @samp{<imsgtcar@@mathfs.math.montana.edu>},
+Peter Thiemann @samp{<thiemann@@provence.informatik.uni-tuebingen.de>},
+Kevin Scott @samp{<scottkj@@prl.philips.co.uk>},
+Lawrence R. Dodd @samp{<dodd@@roebling.poly.edu>},
+Johan Van Biesen @samp{<vbiesen@@wins.uia.ac.be>},
+Marc Gemis @samp{<makke@@wins.uia.ac.be>},
+Michelangelo Grigni @samp{<mic@@cs.ucsd.edu>},
+Kevin Scott @samp{<scottkj@@prl.philips.co.uk>},
+Peter Paris @samp{<pparis@@bass.gmu.edu>},
+Peter Barth @samp{<barth@@mpi-sb.mpg.de>},
+Andy Piper @samp{<ajp@@eng.cam.ac.uk>},
+Richard Stanton @samp{<stanton@@haas.berkeley.edu>},
+Christoph Wedler @samp{<wedler@@fmi.uni-passau.de>},
+Graham Gough @samp{<graham@@cs.man.ac.uk>},
+and probably more.@refill
+
+@itemize @bullet
+@item
+Fixed problem with @file{filladapt} defeating @LaTeX{} mode's own
+indentation algorithm.  Thanks to Piet van Oostrum
+@samp{<piet@@cs.ruu.nl>}.
+
+@item
+Made environments and sections selectable from the menu bar.
+
+@item
+Support Emacs comment conventions.  Comments starting with a single
+@samp{%} are indented at @code{comment-column}.  Comments starting with
+@samp{%%%} are indented at column 0.  Comments starting with
+@samp{%%} are indented like ordinary text.  You can set the variables
+@code{LaTeX-right-comment-regexp} and @code{LaTeX-left-comment-regexp}
+to nil to disable this.  See also @code{LaTeX-ignore-comment-regexp}.
+Rewrote it from Christoph Wedler @samp{<wedler@@fmi.uni-passau.de>} from
+original code.
+
+@item
+@key{tab} and @key{lfd} will not indent code in @samp{verbatim}
+environment if you set @code{LaTeX-indent-environment-check} to non-nil.
+This was also first implemented by Christoph Wedler
+@samp{<wedler@@fmi.uni-passau.de>}.  
+
+@item
+You can now get get custom indentation for various environments.  See
+@code{LaTeX-indent-environment-list}.
+
+@item
+@kbd{C-c C-m left @key{ret}} new automatically inserts a matching
+@samp{\right}.  See variables @code{TeX-left-right-braces},
+@code{TeX-braces-default-association}, and
+@code{TeX-braces-user-association}.  This feature was suggested by Jesse
+@samp{<jes@@math.msu.edu>} and implemented by Berwin Turlach
+@samp{<berwin@@core.ucl.ac.be>}.
+
+@item
+Don't automatically display the compilation buffer unless
+@code{TeX-show-compilation} in non-nil.  Suggested by Stefan Schoef
+@samp{Stefan.Schoef@@arbi.informatik.uni-oldenburg.de}. 
+
+@item
+Bundled @file{ltx-help.el}.  Press @kbd{C-h C-l} to get the
+documentation for a LaTeX command.
+
+@item
+Fixed indentation of @samp{\left} and @samp{\right}.  Thanks to
+Christoph Wedler @samp{<wedler@@fmi.uni-passau.de>}.
+
+@item
+Installation procedure changed.  @file{tex-site.el} is now intended to
+survive AUC @TeX{} upgraded.  The distribution version only contains
+autoloads (eliminating the need for @file{tex-load.el} , the
+customization variables are moved to @file{tex.el}.  You should copy
+those variables you need to customize from @file{tex.el} to
+@file{tex-site.el}. 
+
+@item
+Made it possible to use absolute paths when including bibliographies or
+style files.
+
+@item
+Fixed problem with parsing errors after running @LaTeX{} on the region
+from the menu.  Thanks to Peter Barth @samp{<barth@@mpi-sb.mpg.de>} for
+finding this one.
+
+@item
+The file @file{doc/ref-card.texi} has been renamed to
+@file{doc/tex-ref.texi} to avoid confusion with the reference card for
+GNU Emacs.  Suggested by Michelangelo Grigni @samp{<mic@@cs.ucsd.edu>}.
+
+@item
+The @file{README}, @file{CHANGES} and @file{INSTALLATION} files are now
+generated from chapters of this manual, to ensure they stay in sync.
+
+@item
+@kbd{M-@key{tab}} will now complete some macro arguments in addition to
+macro names.  In particular, if you press @kbd{M-@key{tab}} after
+@samp{\cite@{} or @samp{\ref@{} you will get completion for bibitems and
+labels, respectively.
+
+@item
+Merged a number of files.  The major files are now @file{tex.el} for
+plain @TeX{} and common support, @file{tex-buf.el} for running external
+commands, and @file{latex.el} for @LaTeX{} support.
+
+@item
+Unbundled @file{outln-18.el}.  Users of Emacs 18 or Lucid Emacs 19.9 or
+earlier must get @file{outln-18.el} and install it as @file{outline.el}
+if they want the outline commands to work.
+
+@item
+No longer bind @kbd{C-c @key{tab}} to @code{TeX-complete-symbol}.  Use
+@kbd{M-@key{tab}} instead.
+
+@item
+Cleaned up the parser and parameterizedd it.  Now you can add now types
+of information to be maintained by the parser simply by calling
+@code{TeX-auto-add-type}.  You still need to install the regexps with
+@code{TeX-auto-add-regexp}. 
+
+@item
+Disable the automatic insertion of empty braces after macros with no
+arguments in @code{LaTeX-math-mode}.  Added a variable
+@code{TeX-insert-braces} to disable it everywhere. 
+
+@item
+Now complete with existing labels when asking for a label in a @LaTeX{}
+environment.  Suggested by Berwin Turlach
+@samp{<berwin@@core.ucl.ac.be>}.
+@item
+The variables @code{TeX-private-macro}, @code{TeX-private-auto}, and
+@code{TeX-private-style} are now initialized from the @samp{TEXINPUTS}
+and @samp{BIBINPUTS} environment variables.
+@item
+@kbd{C-c C-f} and @kbd{C-c C-e} will now put the template around the
+region if the region is active.
+
+@item
+Fixed @kbd{C-u C-c C-e} to handle environments ending with a star
+(@samp{*}).  Reported by Berwin Turlach
+@samp{<berwin@@core.ucl.ac.be>}.
+
+@item
+Don't use @code{with-output-to-temp-buffer} for compilation buffer.
+Fixed by Frederic Devernay @samp{<Frederic.Devernay@@sophia.inria.fr>}.
+
+@item
+New function @code{TeX-command-buffer} (@kbd{C-c C-b}) to run a command
+on the (visible part of) the current buffer.  Requested by several
+people. 
+
+@item
+Bundled the latest @file{reporter.el}, added
+@code{TeX-submit-bug-report} to menus.
+
+@item
+@code{TeX-insert-braces} now takes an argument like
+@code{insert-parentheses}.  Thanks to Lawrence R. Dodd
+@samp{<dodd@@roebling.poly.edu>}. 
+
+@item
+Fixed bug in @samp{\put} and @samp{\multiput} macros.  Thanks to Kevin
+Scott @samp{<scottkj@@prl.philips.co.uk>}.
+
+@item
+Deleted @code{ams-latex-mode}, @code{slitex-mode}, and
+@code{foiltex-mode}.  Instead, use @code{LaTeX-command-style} to
+determine the name of the external command to use.
+
+@item
+Deleted @code{latex2e-mode}.  Instead set the @code{LaTeX-version}
+variable.  This may be done automatically if you use
+@samp{\documentclass} in the future.
+
+@item
+Fixed Lucid Emacs menu for @TeX{}info mode.  Thanks to Frederic Devernay
+@samp{<Frederic.Devernay@@sophia.inria.fr>},
+
+@item
+Added support for @file{harvard.sty} by Berwin Turlach
+@samp{<berwin@@core.ucl.ac.be>}.
+
+@item
+Filling will not let display math equations @samp{\[ ... \]} be on a
+line by themselves.  Reported by Matthew Morley
+@samp{<Matthew.Morley@@gmd.de>}. 
+
+@item
+Made @code{words-include-escapes} default to nil.  
+
+@item
+Made @code{TeX-expand-list} expansions case sensitive.  Thanks to Havard
+Rue @samp{<Havard.Rue@@sima.sintef.no>}.
+
+@item
+Fixed error in calculating indentation for lines starting with a brace.
+Thanks to Piet van Oostrum @samp{<piet@@cs.ruu.nl>}.
+
+@item
+Fixed bug in the @samp{addcontentsline}, @samp{newtheorem}, and
+@samp{pagenumbering} macros reported by Berwin Turlach
+@samp{<berwin@@core.ucl.ac.be>}.
+
+@item
+Doc fixes by Lawrence R. Dodd @samp{<dodd@@roebling.poly.edu>}.
+
+@item
+Indentation no longer fooled by @samp{\\@{},  Thanks to Peter Thiemann
+@samp{<thiemann@@provence.informatik.uni-tuebingen.de>}.
+
+@item
+Bind @kbd{M-C-e} and @kbd{M-c-a} to @code{LaTeX-find-matching-end} and
+@code{LaTeX-find-matching-begin}.  Suggested by Lawrence R. Dodd
+@samp{<dodd@@roebling.poly.edu>}.
+
+@item
+Added variable @code{TeX-quote-after-quote} which causes
+@code{TeX-insert-quote} to insert literal @samp{"} except when after
+another @samp{"}, in which case it will expand to @code{TeX-open-quote}
+or @code{TeX-close-quote}.  This code was contributed by Piotr Filip
+Sawicki @samp{<pfs@@mimuw.edu.pl>}.
+
+@item
+Added support for Polish style files @file{plfonts.sty} and
+@file{plhb.sty}, contributed by Piotr Filip
+Sawicki @samp{<pfs@@mimuw.edu.pl>}.
+
+@item
+Added section with suggestions for how to handle European
+character sets.
+
+@item
+Created workaround for bug in the regexp handler in some Emacs 18
+versions and older versions of Lucid Emacs.  The workaround
+means you cannot use space in the documentstyle command in Emacs and
+Lucid Emacs earlier than version 19.9.
+
+@item
+@file{powerkey.el} is removed since the functionality is integrated in
+GNU Emacs 
+
+@item
+@kbd{C-u "} now inserts four literal @samp{"}, not just one.  To insert
+a single @samp{"} either press @key{"} twice or use @kbd{C-q "}.
+
+@item
+Allow non-string value for @code{outline-minor-map-prefix}.  Reported by
+David Smith @samp{<maa507@@comp.lancs.ac.uk>}.
+
+@item
+Make the use of @code{write-file-hooks} more safe, and use
+@code{local-write-file-hooks} when possible.  Suggested by David Smith
+@samp{<maa507@@comp.lancs.ac.uk>}.
+
+@item
+Don't indent @samp{\begin@{verbatim@}} and @samp{\end@{verbatim@}},
+since any space before @samp{\end@{verbatim@}} is significant.  Thanks to
+Peter Thiemann @samp{<thiemann@@informatik.uni-tuebingen.de>} for the
+patch.
+
+@item
+Show available fonts when you try to insert an non-existing font.
+Suggested by David Smith @samp{<maa507@@comp.lancs.ac.uk>}.
+
+@item
+The @code{member} function in @file{tex-18.el} does not depend on
+@code{TeX-member} now.  Thanks to Piet van Oostrum
+@samp{<piet@@cs.ruu.nl>}. 
+
+@item
+Do not overwrite any global binding of @kbd{M-@kbd{ret}}.  Suggested by
+Jens Petersen @samp{<J.Petersen@@qmw.ac.uk>}.
+
+@item
+Major modes for writing text are supposed to rebind @kbd{M-@kbd{tab}} to
+@code{ispell-complete-word}.  Reported by Jens Petersen
+@samp{<J.Petersen@@qmw.ac.uk>}.
+
+@item
+Fixed problems with @TeX{}info menus.  Thanks to David Smith
+@samp{<maa507@@comp.lancs.ac.uk>} for reporting this.
+
+@item
+Code cleanup.   Removed the @file{format} directory, as it did not make
+it easier to add new @TeX{} modes, quite the contrary.
+
+@item
+Fixed name conflict in @file{auc-tex.el}, reported by Rik Faith
+@samp{<faith@@cs.unc.edu>}. 
+
+@item
+Fixed some spelling errors.  Thanks to Lawrence R. Dodd
+@samp{<dodd@@roebling.poly.edu>}. 
+
+@item
+Fixed bug prohibiting non-standard file extensions.  Now recognize
+@file{.ltx} by default.  Suggested by Lawrence R. Dodd
+@samp{<dodd@@roebling.poly.edu>}. 
+
+@item
+Name of the AUC @TeX{} info files changes once again to be usable under
+DOS.  This time simply to @file{auctex}.
+
+@item
+Documented @code{TeX-outline-extra}.
+
+@item
+Could not select command on region from the menu before loading
+@file{tex-buf}.  Reported by Uwe Bonnes
+@samp{<bon@@lte.e-technik.uni-erlangen.de>}.
+
+@item
+Make the hilit19 interface more robust.  Thanks to William Dean Norris
+II @samp{<wdn@@dragonfly.cis.ufl.edu>}.
+
+@item
+More OS/2 Makefile fixes by Bodo Huckestein
+@samp{<bodo@@eu10.mpi-hd.mpg.de>}.
+
+@item
+Reimplemented comment support on top of @code{comment-region}, giving
+slightly different semantics.
+@end itemize
+
+
+@node Version 8.0
+@comment  node-name,  next,  previous,  up
+@section News in 8.0
+
+Coordinator: Per Abrahamsen, 1993.
+
+Alpha testers (in order of appearance): Marc Gemis
+@samp{<makke@@wins.uia.ac.be>}, Shinji Kobayashi
+@samp{<koba@@flab.fujitsu.co.jp>}, Philippe Defert
+@samp{<defert@@gnuisance.cern.ch>}, Richard Stanton
+@samp{<stanton@@haas.berkeley.edu>}, Norbert Kiesel
+@samp{<norbert@@i3.informatik.rwth-aachen.de>}, Roberto Cecchini
+@samp{<CECCHINI@@fi.infn.it>}, Hanno Wirth @samp{<wirth@@igd.fhg.de>},
+Tim Carlson @samp{<tim@@math.montana.edu>}, John Daschbach
+@samp{<dasch@@darkwing.uoregon.edu>}, Bob Fields
+@samp{<bob@@minster.york.ac.uk>}, Peter Whaite
+@samp{<peta@@cim.mcgill.ca>}, Volker Dobler
+@samp{<dobler@@etu.wiwi.uni-karlsruhe.de>}, Phil Austin
+@samp{<phil@@geog.ubc.ca>}, Martin Maechler
+@samp{<maechler@@stat.math.ethz.ch>}, Havard Rue
+@samp{<Havard.Rue@@sima.sintef.no>}, Tim Geisler
+@samp{<tmgeisle@@faui80.informatik.uni-erlangen.de>}, Tim Carlson
+@samp{<imsgtcar@@mathfs.math.montana.edu>}, Sridhar Anandakrishnan
+@samp{<sak@@essc.psu.edu>}, Peter Thiemann
+@samp{<thiemann@@provence.informatik.uni-tuebingen.de>}, Pedro Quaresma
+@samp{<pedro@@mat.uc.pt>}, Christian Lynbech
+@samp{<lynbech@@daimi.aau.dk>}, Kevin Scott
+@samp{<scottkj@@prl.philips.co.uk>}, Bodo Huckestein
+@samp{<bodo@@eu10.mpi-hd.mpg.de>}, Cengiz Alaettinoglu
+@samp{<ca@@cs.UMD.EDU>}, Jakob Schiotz
+@samp{<schiotz@@fysik.dth.dk>}, and probably more.@refill
+
+@itemize @bullet
+@item
+New variable @code{LaTeX-letter-sender-address} contains default address
+for use with the letter style.  Set it to the address of your
+organization in @file{tex-site.el}.  Thanks to Sridhar Anandakrishnan
+@samp{<sak@@essc.psu.edu>}. 
+
+@item
+Makefile now works under OS/2 with GNU Make.  Thanks to Bodo Huckestein
+@samp{bodo@@eu10.mpi-hd.mpg.de}.
+
+@item
+Made it possible to install global auto files without having Bib@TeX{}
+mode installed.  Thanks to Christian Lynbech
+@samp{<lynbech@@daimi.aau.dk>}.
+
+@item
+Minor documentation fixes.  Thanks to Martin Maechler
+@samp{<maechler@@stat.math.ethz.ch>}.
+
+@item
+Added support for @samp{eqref} for the @samp{amsart} style.  Thanks to
+Peter Whaite @samp{<peta@@cim.mcgill.ca>}.
+
+@item 
+Use @samp{-c} as the default shell command option under @samp{emx}.
+Eberhard Mattes @samp{<mattes@@azu.informatik.uni-stuttgart.de>} says
+it is better than @samp{/c}.
+
+@item
+Made powerkey in the menus work better under OS/2.  Thanks to Eberhard
+Mattes @samp{<mattes@@azu.informatik.uni-stuttgart.de>}.
+
+@item
+Made the reference cards print correctly on US letter format paper.
+Thanks to Magnus Nordborg @samp{<magnus@@fisher.Stanford.EDU>}.
+
+@item
+@code{LaTeX-dead-mode} removed.  Read the file `ISO-TEX' for alternative
+solutions.
+
+@item
+All minor modes unbundled.  You can find them from ftp at
+@samp{ftp.iesd.auc.dk} in the directory @file{/pub/emacs-lisp}.  Removed
+information about minor modes from this document.
+
+@item
+New hooks for changing ispell directory, see @file{tex-site.el} for
+details.  
+
+@item 
+@LaTeX{}2e mode now supported.  Insert 
+
+@lisp
+  (setq TeX-default-mode 'latex2e-mode)
+@end lisp
+
+in your @file{.emacs} file to get documentclass instead of documentstyle
+per default.  The parser recognizes documentclass, usepackage, and
+newcommand with a default argument.  There are also templates for all of
+them.
+
+@item
+Added Jakob Schiotz's @samp{<schiotz@@fysik.dth.dk>} help file for
+installing AUC @TeX{} on OEMACS.  It will probably also be of interest
+for DEMACS users.
+
+@item
+Minor changes to be more friendly for OEMACS, thanks to Jakob Schiotz
+@samp{<schiotz@@fysik.dth.dk>}. 
+
+@item
+The control key bindings in @code{LaTeX-math-mode} now works, thanks to
+Frederic Devernay @samp{<Frederic.Devernay@@sophia.inria.fr>}. 
+
+@item
+@LaTeX{} outlines no longer matches @samp{\partial} or other commands
+with a sectioning command as prefix.  Thanks to Jakob Schiotz
+@samp{<schiotz@@fysik.dth.dk>}.
+
+@item
+@code{LaTeX-fill-paragraph} now handles the case where the previous line
+both contain an @samp{\item} and an unmatched open brace.  Thanks to
+Piet van Oostrum @samp{<piet@@cs.ruu.nl>}.
+
+@item
+Use abbreviated file name for @TeX{} output buffers in Emacs 19.  Thanks
+to Jens Gustedt @samp{<gustedt@@math.tu-berlin.de>}.
+
+@item
+Added lowercase alias for @code{LaTeX-math-mode} for use with Emacs file
+mode commands.  Thanks to Olaf Burkart
+@samp{<burkart@@zeus.informatik.rwth-aachen.de>}. 
+
+@item
+Added code to reuse old region in @code{TeX-command-region} if mark is
+not active.  Thanks to Cengiz Alaettinoglu @samp{<ca@@cs.UMD.EDU>}.
+
+@item
+Now get keyboard accelerators on all menus rather than only AUC @TeX{}
+menus, thanks to the @file{powerkey.el} file by Lars Lindberg
+@samp{<lli@@sypro.cap.se>}.
+
+@item
+Added @code{TeX-electric-macro} for faster completion of @TeX{} macros.
+@xref{Completion}.
+
+@item
+Comparing printer names are now case incentive.  Thanks to Richard
+Stanton @samp{<stanton@@haas.berkeley.edu>}.
+
+@item
+Default shell fixed for OS/2.  Thanks to Richard Stanton
+@samp{<stanton@@haas.berkeley.edu>}.
+
+@item
+Added functions to hide (@code{LaTeX-hide-environment}) and show
+(@code{LaTeX-show-environment}) the current environment.
+
+@item
+@kbd{C-u C-c C-e} will now modify the current environment instead of
+inserting a new environment.  This is like the optional argument to the
+font commands.
+
+@item
+Added nabla to LaTeX Math Mode.  Suggested by Bill Reynolds
+@samp{<bill@@goshawk.lanl.gov>}. 
+
+@item
+Added commands for running @TeX{} and @LaTeX{} interactively.  Thanks to
+David Carlisle @samp{<carlisle@@computer-science.manchester.ac.uk>}.
+
+@item
+The external commands will now insert there output @emph{before} point
+in the output buffers.  This allows you to follow the progress by
+putting point at the end of the file.  Suggested by Jak Kirman
+@samp{<jak@@cs.brown.edu>}.
+
+@item
+When invoking an external command from a menu, the document will be
+automatically saved. 
+
+@item
+There are now a printer menu for emacs 19.
+
+@item
+Redesigned dependency checking.  Now only checks dependencies for files
+loaded in the current emacs session.  This is much faster, but will not
+catch files that are edited outside this emacs session, or files edited
+in killed buffers.  @strong{@code{TeX-check-path} must at least contain
+@file{.} for saving to work}.  If you have set @samp{TeX-check-path}
+in your @file{.emacs} file, remove it.  The default value is fast enough
+now.
+
+@item
+New variable @code{TeX-save-query} control if AUC @TeX{} will query you
+for each modified buffer when you save the document.  Set it to nil to
+get rid of these questions.  Setting this variable also affect the
+automatic saving of the document that happens each time you start an
+external command.
+
+@item
+New command @code{TeX-save-document} will save all files in the current
+document, i.e. the document associated with the current buffer.
+
+@item 
+Cleaned up all minor modes, also made them use @file{min-map.el} or
+@file{min-mode.el} instead of @file{min-bind.el}.
+
+@item
+Cleaned up release management.
+
+@item
+AUC TeX will not longer be confused when you rewrite a file under a new
+name. 
+
+@item
+Lots of code cleanup, involving reformatting the source and renaming all
+@samp{-hook} variables and functions to conform with the Emacs 19
+guidelines. 
+
+@item 
+Can now parse Japanese characters in labels and macros when you use
+Japanese @TeX{}.  Thanks to Shinji Kobayashi
+@samp{<koba@@flab.fujitsu.co.jp>}.
+
+@item 
+Made it safe to quit when AUC @TeX{} asks for the name of the master
+file.  It will simply assume the file itself is the master, and continue
+without inserting any file local variables.
+
+@item
+Support for @code{epsf} and @code{psfig} style files.  Thanks to Marc
+Gemis @samp{<makke@@wins.uia.ac.be>}.
+
+@item
+Support for @LaTeX{}info.  Thanks to Marc Gemis
+@samp{<makke@@wins.uia.ac.be>}.
+
+@item
+Only examine the first 10000 bytes to find out what @TeX{} mode to use.
+
+@item 
+Added @code{TeX-submit-bug-report} command to submit bug reports.  It
+uses the @file{reporter.el} distributed with SuperCite, so it may not be
+available in some Emacs 18 installations.
+
+@item
+Speeded up parsing significantly by using a simpler regexp.
+
+@item
+Added variable @code{TeX-auto-untabify}.  Set it to nil to prevent
+untabifying the buffer when it is saved.  Several people wanted this. 
+
+@item
+Changed defaults to @emph{not} do any automatic parsing, nor prompt for
+a master file.  @xref{Parsing Files}, @ref{Multifile}, for information
+about how ot correct this.  In short, insert the following in your
+@file{.emacs} file.
+
+@lisp
+(setq TeX-auto-save t)
+(setq TeX-parse-self t)
+(setq-default TeX-master nil)
+@end lisp
+
+@item
+Some grammatical fixes to the @file{PROBLEMS} file.  Thanks to Lawrence
+R. Dodd @samp{<dodd@@roebling.poly.edu>}.
+
+@item
+No longer install a separate @code{outline-minor-mode} by default, as
+the FSF Emacs 19.19 @code{outline-minor-mode} is adequate.  The included
+file @file{outln-18.el} emulates the FSF Emacs 19.19 mode under Emacs 18.
+
+The FSF Emacs 19.19 @code{outline-minor-mode} use the @kbd{C-c} prefix
+instead of @kbd{C-c C-o} by default, and does not bind as many keys as
+the @code{outline-minor-mode} distributed with earlier versions of AUC
+@TeX{} did.  You can get the keybindings back together with other
+goodies by inserting
+@example
+(require 'out-xtra)
+@end example
+in your @file{.emacs} file.  @file{out-xtra.el} will probably be
+unbundled from AUC @TeX{} in the future.
+
+@item
+Some fixes to AmS-@TeX{} mode by Ulf Juergens
+@samp{<ulf@@mathematik.uni-bielefeld.de>}.
+
+@item
+Make @samp{plain-TeX-mode-menu} work in Lucid Emacs.  Thanks to Anthony
+Rossini @samp{rossini@@hsph.harvard.edu} for reporting this.
+
+@item
+First cut on a @TeX{}info mode.
+
+@item
+More strict about parsing @samp{\bibitem}'s and Bib@TeX{} entries.
+
+@item
+Made it easier to write style files for environments that takes
+arguments and documented it.  Suggested by Martin
+Wunderli @samp{<wunderli@@inf.ethz.ch>}.
+
+@item
+Parse optional argument to @samp{\newenvironment}.  Suggested by Martin
+Wunderli @samp{<wunderli@@inf.ethz.ch>}.
+
+@item
+Fixed @samp{parbox} macro.  Thanks to Shinji Kobayashi
+@samp{<koba@@flab.fujitsu.co.jp>}.
+
+@item
+Made the parser work better in outline minor mode.  Thanks to Salvador
+Pinto Abreu @samp{<spa@@khosta.fct.unl.pt>}.
+
+@item
+Also save style information with @code{TeX-normal-mode} when buffer not
+modified.
+
+@item
+Use @code{$(MAKE)} instead of @samp{make} to invoke @code{make} from the
+@file{Makefile}.  Thanks to John Interrante
+@samp{<interran@@uluru.Stanford.EDU>}. 
+
+@item
+Make last value default for @code{TeX-insert-macro}.  Suggested by Matt
+Fairtlough @samp{<M.Fairtlough@@dcs.sheffield.ac.uk>}.
+
+@item
+Renamed info file to @samp{auc-info} in order to fill DOS file limits.
+Please remember to update your @file{dir} file to reflect this change.
+
+@item
+Delete auto file instead of saving an empty file.
+@end itemize
+
+@node Version 7.3
+@comment  node-name,  next,  previous,  up
+@section News in 7.3
+
+Coordinator: Per Abrahamsen, 1993.
+
+@itemize @bullet
+@item
+More robust installation, especially for Lucid Emacs (I hope).  Many
+people reported problems with this.
+
+@item
+Make `easymenu' work when byte-compiled.  Many people reported this
+bug.
+
+@item
+Minimally updated the @file{README} file from version 6.0 (sigh).
+Thanks to Boris Goldowsky @samp{<boris@@cs.rochester.edu>} for reporting
+this.
+
+@item
+Added @samp{@@finalout} to manual.  Reported by Henrik Drabol
+@samp{<hvd@@ens004.ens.min.dk>}.
+
+@item
+Fixed @kbd{M-q} to work after an @samp{\end@{@dots{}@}}.  It will not
+work at the end of the buffer, but there are usually the local variables
+so it should (hopefully) not matter.  Thanks to Shinji Kobayashi
+@samp{<koba@@flab.fujitsu.co.jp>} again.
+
+@item
+New variables @code{TeX-open-quote} and @code{TeX-close-quote} determine
+what is inserted by @code{TeX-insert-quote}.  The @file{german} style
+file now use those variables instead of changing the keymap.
+
+@item
+Changes to the default settings in @file{tex-site.el}, in particular a
+@samp{Queue} command is added to display the print queue.  Thanks to
+John Interrante @samp{<interran@@uluru.Stanford.EDU>} for code, and
+other members of the @samp{auc-tex@@iesd.auc.dk} mailing list for
+ideas.
+
+@item
+Make sure all outline mode commands are bound in
+@code{outline-minor-mode}. 
+
+@item
+Added autoload for @code{TeX-command}.  Thanks to Hanno Wirth
+@samp{<wirth@@igd.fhg.de>} for reporting this.
+
+@item
+Added support for AmS@TeX{} and AmSLa@TeX{}.  Currently they are
+identical to @TeX{} and @LaTeX{} except for another default command. 
+
+@item
+Added Vor@TeX{} style matching of dollar sign.  The style is guaranteed
+to be Vor@TeX{}, since I lifted the code directly from Vor@TeX{}.
+Thanks to Pehong Chen @samp{<phc@@renoir.berkeley.edu>} for writing the
+Vor@TeX{} code.  Thanks to Jak Kirman @samp{<jak@@cs.brown.edu>} for
+pointing out this nice Vor@TeX{} feature.
+
+@item
+Added information about AUC @TeX{} mail addresses to the manual.  Thanks
+to Dave Smith @samp{<maa507@@computing.lancaster.ac.uk>}.
+
+@item
+Added menu to for plain @TeX{}.  Suggested by Tim Carlson
+@samp{<imsgtcar@@math.montana.edu>}. 
+
+@item
+Made the menus depend on @code{TeX-command-list}.
+
+@item
+Made it possible to specify @code{TeX-auto-regexp-list} in the local
+variable section of each file.
+
+@item
+Added variable @code{TeX-auto-parse-length} to specify maximal length of
+text that will be parsed.
+
+@item
+Added automatic parsing of Bib@TeX{} files and @samp{bibitem} entries in
+order to get completion in @samp{cite}.  This was inspired by an add on
+made by Sridhar Anandakrishnan @samp{<sak@@essc.psu.edu>}.
+
+@item
+Added variable @code{TeX-byte-compile} to disable automatic byte
+compilation of style files when loaded.  This is needed when using
+different Emacs versions.
+
+@item
+Added variable @code{TeX-translate-location-hook} to translate file and
+line information before showing an error, as requested by Thorbjoern
+Ravn Andersen @samp{<ravn@@imada.ou.dk>}.
+
+@item
+Added variable @code{TeX-auto-save} to allow disabling the automatic
+saving of style information, either per file in the file local
+variables, or globally by using @code{setq-default}.  Use
+@code{TeX-normal-mode} to force style information to be saved.
+
+@item
+Try to create @file{auto} directory if it does not exists.
+
+@item
+Added chapter describing how to tune the @TeX{} parsing.
+
+@item
+Allow (but do not encourage) a string value for
+@code{LaTeX-default-options}. 
+
+@item
+Give @samp{"} word syntax when german.sty is loaded.  Suggested by Tim
+Geisler @samp{<tmgeisle@@immd8.informatik.uni-erlangen.de>}.
+
+@item
+Many corrections to the grammar in the manual.  Thanks to Manfred
+Weichel @samp{<Manfred.Weichel@@sto.mchp.sni.de>}.
+
+@item
+Bind @code{TeX-home-buffer} to @kbd{C-c ^} instead of @kbd{C-c C-h}
+which are reserved in Emacs 19.  Suggested by Chris Moore
+@samp{<Chris.Moore@@src.bae.co.uk>}.
+@end itemize
+
+@node Version 7.2
+@comment  node-name,  next,  previous,  up
+@section News in 7.2
+
+Coordinator: Per Abrahamsen, 1993.
+
+@itemize @bullet
+@item
+@code{LaTeX-dead-mode} works again.  Thanks to Patrick O'Callaghan
+@samp{<poc@@usb.ve>} for fixing it.
+
+@item
+Minor fixes to the documentation.  Thanks to Shinji Kobayashi
+@samp{<koba@@flab.fujitsu.co.jp>}.
+
+@item
+Add @samp{Compiling} to the mode line of all buffers, while there is a
+AUC @TeX{} compilation process running.  This is similar to the behavior
+of @code{compile} in Emacs 19.
+
+@item
+@code{TeX-normal-mode} will now save the buffer first to make sure it
+gets reparsed.
+
+@item
+Labels with underscores are now recognized.   Thanks to Wolfgang Franzki
+@samp{<W.Franzki@@kfa-juelich.de>} 
+
+@item
+Fix to `ghostview' printer specification.  Thanks to Masayuki Kuwada
+@samp{<kuwada@@soliton.ee.uec.ac.jp>}. 
+
+@item
+Recognize @samp{abstract}, @samp{center}, @samp{titlepage},
+@samp{verse}, and @samp{theindex} environments.  Thanks to Masayuki Kuwada
+@samp{<kuwada@@soliton.ee.uec.ac.jp>}. 
+
+@item
+Fix to @samp{newsavebox} macro.  Thanks to Shinji Kobayashi
+@samp{<koba@@flab.fujitsu.co.jp>} for reporting this.
+
+@item
+Menu support for GNU Emacs 19 and Lucid Emacs.  Thanks to Alastair Burt
+@samp{<burt@@dfki.uni-kl.de>} for the initial Lucid Emacs version.
+
+@item
+@kbd{C-c C-f C-d} now deletes the current font.  The current font is
+defined to be the innermost @TeX{} group starting with a @TeX{} macro
+that is terminated by a space.
+
+@item
+Giving @kbd{C-c C-f} a prefix argument will replace the current font,
+i.e. @kbd{C-u C-c C-f C-b} will change the current font to bold. 
+
+The old functionality (putting the font around the region) has been
+removed.  To make the region bold, type @kbd{C-w C-c C-f C-b C-y}
+instead.
+
+@item
+Chapter recognized as largest heading in the report style.  Thanks to
+Shinji Kobayashi @samp{<koba@@flab.fujitsu.co.jp>} for reporting
+this. 
+
+@item
+More support for Japanese style files.  Thanks to Shinji Kobayashi
+@samp{<koba@@flab.fujitsu.co.jp>}.
+
+@item
+No longer put @samp{Outline} in the mode line whenever
+@code{selective-display} is set.  Thanks to Lawrence R. Dodd
+@samp{<dodd@@roebling.poly.edu>} for reporting this.
+
+@item
+Support for inserting calligraphic letters in @code{TeX-math-mode} with
+@kbd{` c @key{letter}}.  Thanks to Olaf Burkart
+@samp{<burkart@@zeus.informatik.rwth-aachen.de>}.
+
+@item
+@code{set-docstring} in @file{tex-math.el} should work better now.
+Thanks to Alastair Burt @samp{<burt@@dfki.uni-kl.de>} and Olaf Burkart
+@samp{<burkart@@zeus.informatik.rwth-aachen.de>}.
+
+@item
+Support for dviout preview on PC-9801.  Thanks to Shinji Kobayashi
+@samp{<koba@@flab.fujitsu.co.jp>}.
+
+@item
+Inserting environment in empty buffer should work now.  Thanks to
+Alastair Burt @samp{<burt@@dfki.uni-kl.de>}.
+
+@item 
+Default float for figures changed from @samp{tbp} to @samp{htbp}.  
+
+@item
+@code{LaTeX-format-environment} may work now.  Thanks to Shinji
+Kobayashi @samp{<koba@@flab.fujitsu.co.jp>}.
+
+@item
+Better @code{LaTeX-close-environment}.  Thanks to Thorbjoern Hansen
+@samp{<thansen@@diku.dk>}.
+
+@item
+Some support for Ispell 4.0.
+
+@item
+Bib@TeX{} in Emacs 19 need @code{tex-insert-quote}, make it autoload
+from AUC @TeX{} instead of the standard @code{tex-mode}.
+
+@item
+@code{TeX-auto-generate} failed when repeated.  Thanks to Peter Whaite
+@samp{<peta@@Thunder.McRCIM.McGill.EDU>} for reporting this.
+@end itemize
+
+@node Version 7.1
+@comment  node-name,  next,  previous,  up
+@section News in 7.1
+
+Coordinator: Per Abrahamsen, 1993.
+
+@itemize @bullet
+@item
+Allow multiple @samp{%p} in print commands.
+
+Suggested by Cliff Krumvieda @samp{<cliff@@cs.cornell.edu>}.
+
+@item
+Improved backward compatibility in @file{auc-tex.el}.  Thanks to Ralf
+Handl @samp{<handl@@cs.uni-sb.de>}.
+
+@item
+New style hook for @file{german.sty}.
+
+Disable smart quotes.  Press @kbd{C-c C-n} to make it take effect.
+
+@item
+Allow files to have other extensions than ``tex''.
+
+But no longer allow files to have multiple dots.  Sigh.
+
+@item
+Will no longer parse the buffer if it can use the saved state.
+
+@item
+New variable @code{TeX-parse-self}.
+
+Set it to nil if you never want to parse the buffer when you load it.
+
+@item
+Only offer to save files that belongs to the document.
+
+When you format the document with @kbd{C-c C-c}, AUC @TeX{} will no
+longer offer to save your @file{RMAIL}, @file{.newsrc}, or other files
+that does not belong to the document.  Suggested by Jim Hetrick
+@samp{<hetrick@@phys.uva.nl>}. 
+
+@item
+Foil@TeX{} support.
+
+Thanks to Sven Mattisson @samp{<sven@@tde.lth.se>}
+
+@item
+Smarter about when you need to reformat.
+
+Thanks to Chris Callsen @samp{<chris@@iesd.auc.dk>}.
+
+@item
+Japanese @TeX{}
+
+Now supports Japanese @TeX{}.  Thanks to Shinji Kobayashi
+@samp{<koba@@keisu-s.t.u-tokyo.ac.jp>}.
+
+@item
+Works again under OS/2 and other case insensitive file systems.
+
+@item
+DEMACS support.
+
+Thanks to Shinji Kobayashi @samp{<koba@@keisu-s.t.u-tokyo.ac.jp>}.
+
+@item
+Better @code{LaTeX-close-environment}.
+
+Thanks to Piet van Oostrum @samp{<piet@@cs.ruu.nl>}.
+
+@item
+Ispell support.
+
+Thanks to Piet van Oostrum @samp{<piet@@cs.ruu.nl>}.
+
+@item 
+Support for Russian letters.
+
+Thanks to Justin R. Smith @samp{<jsmith@@king.mcs.drexel.edu>}.
+
+@item
+Sli@TeX{} fixes.
+
+Many people.
+
+@item
+Fixes for spelling errors.
+
+Many people.
+
+@end itemize
+
+@node Version 7.0
+@comment  node-name,  next,  previous,  up
+@section Version 7.0
+
+Coordinator: Per Abrahamsen, 1993.
+
+Alpha testers (in order of appearance): Piet van Oostrum
+@samp{<piet@@cs.ruu.nl>}, Sven Mattisson @samp{<sven@@tde.lth.se>}, Tim
+Geisler @samp{<tmgeisle@@immd8.informatik.uni-erlangen.de>}, Fran E.
+Burstall @samp{<F.E.Burstall@@maths.bath.ac.uk>}, Alastair Burt
+@samp{<burt@@dfki.uni-kl.de>}, Sridhar Anandakrishnan
+@samp{<sak@@essc.psu.edu>}, Kjell Gustafsson
+@samp{<kjell@@sccm.Stanford.EDU>}, Uffe Kjaerulff
+@samp{<uk@@iesd.auc.dk>}, Kurt Swanson @samp{Kurt.Swanson@@dna.lth.se},
+Mark Utting @samp{<marku@@cs.uq.oz.au>}, Per Norman Oma
+@samp{perno@@itk.unit.no}, Naji Mouawad
+@samp{<nmouawad@@math.uwaterloo.ca>}, Bo Nygaard Bai
+@samp{<bai@@iesd.auc.dk>}, and probably more.
+
+@itemize @bullet
+@item
+New keymap. 
+
+The keymap has been changed in order to make it more intuitive to new
+users, and because the old bindings did not work well with the new
+buffer manipulation commands in tex-buf.el.  To use the new bindings,
+load @file{tex-init.el} instead of @file{auc-tex.el}.
+
+The file @file{auc-tex.el} is still available and implements the old
+keybindings on top of the new code.
+
+Print out the reference card (@file{doc/tex-ref.tex}) to see the new
+bindings.  
+
+@item
+Completely redesigned the buffer handling. 
+
+No part of the interface or the customization variables remain the same,
+unless you use the compatibility functions in @file{auc-tex.el}.  In
+that case the interactive commands remain similar in spirit, but the
+customization interface is still changed. 
+
+The file @file{tex-buf.el} has been completely rewritten, and there are
+major cleanup in @file{tex-dbg.el}, however the basic functionality
+remains the same in this file.  The code for both @file{tex-buf.el} and
+@file{tex-dbg.el} should be much simpler now and easier to extent.
+
+@file{auc-tex.el} and @file{tex-site.el} was updated to support the new
+interface.  I actually believe the moral equivalent to @code{TeX-region}
+to work now @t{:-)}, at least I understand the code now.
+
+The two major functions are now @code{TeX-command-master} and
+@code{TeX-command-region}.  Each function will prompt you for the
+command to execute.  AUC @TeX{} will make an educated guess on what
+command you want to run, and make that the default.  The available
+commands are defined in the variable @code{TeX-command-list}.
+
+@code{TeX-command-master} will run the specified command on the buffers
+master file.  You can have one command running for each master file.
+@code{TeX-command-region} will run the specified command on the current
+region, getting the header on trailer from the master file.  
+
+You can have exactly one region command running, independent on how many
+master file commands that are running.  Commands that operate on the
+active process (like @code{TeX-next-error}) will chose the process
+associated with buffers master file, unless the last region process is
+more recent than all master file processes.
+
+AUC @TeX{} now insist on knowing the master file for a buffer.  If you
+do not specify it in the file variable section, and it is not obviously
+a master file itself, it will ask you.  It will also add the master file
+name to the file variables, unless you disable this feature by setting
+@code{TeX-add-local} to nil.  Furthermore, it will convert @samp{%%
+Master:} lines to file variables, unless you disable it by setting
+@code{TeX-convert-master} to nil.
+@vindex TeX-convert-master
+
+Functionality removed (for now, it might appear again latter) include
+all other functions to start a command (e.g. @code{LaTeX-BibTeX}), and
+alternative ways to specify headers and trailers.  The only place to get
+the header and trailer is from the master file (I can easily change
+that, if anyone have such needs).
+
+@item
+Style specific code isolated.
+
+You can now add style specific information to AUC TeX by writing a
+style file somewhere in TeX-style-path.
+
+The main code is now organized around this principle.
+
+@item
+Automatically generate style files.
+
+AUC @TeX{} can now automatically extract information from a @TeX{} file,
+and will do this when you save a buffer.
+
+@item
+Sli@TeX{} mode.
+
+Just like @LaTeX{} mode, except that the default command to format run
+on the buffer is @samp{slitex}.
+
+@item
+@code{LaTeX-section} completely general.
+
+Rewrote @file{ltx-sec.el}.
+
+@itemize @minus
+@item
+Sectioning level, toc, and title queries can be individually turned off.
+@item
+Label query can be turned on or off for selected sectioning levels.
+@item
+Label prefix can be different for different sectioning levels.
+@item 
+If the title (or toc) is empty, point will be positioned there.
+@item
+Users can add new hooks
+@end itemize
+
+@item
+@code{TeX-insert-macro} much smarter.
+
+It will now prompt for the symbol with completions, and for many symbols
+it will also prompt for each argument.  There are also completion on
+some of the arguments.
+
+@item
+Fixed center in figure environment. 
+
+Thanks to Thomas Koenig @samp{<ig25@@rz.uni-karlsruhe.de>}.
+
+@item
+Changed @code{\M-} to @code{\e} in all keybindings in order to better
+support 8-bit input on some GNU Emacs. Thanks to Peter Dalgaard
+@samp{<pd@@kubism.ku.dk>}.
+
+Please, implementors of 8-bit input extensions to GNU Emacs.
+@code{\M-x} does @emph{not} means @dfn{@kbd{x} with the 8-bit set}.  It
+means @dfn{pressing @kbd{x} while holding down the @key{meta} key}.
+Some systems (such as X11) are able to tell the different.  Thus, even
+if you implement 256 byte keymaps, @code{\M-x} should still expand
+@code{meta-prefix-char} followed by an @kbd{x} in the keymap.  This
+allows you to distinguish pressing @kbd{x} while holding down the
+@key{meta} key from entering a literal 8-bit character.
+
+@item
+Made the outline commands aware of the document style.
+
+That is, if the document style is @samp{article}, @samp{\section} will
+be one level below the @samp{\documentstyle}, while if the style is
+@samp{book}, @samp{\section} will be three levels below
+@samp{\documentstyle}.  This will make @code{show-children} work better
+at the top level.
+
+@item
+The makefiles are closer to GNU coding standard.
+
+They now understand `prefix' and some other macros.
+
+@item
+Added hooks to be run after list of environments or list of completion
+names are updated, and also added a hook to be called after each file
+has been loaded. Thanks to Piet van Oostrum @samp{<piet@@cs.ruu.nl>}.
+
+@item
+Added @samp{*} to lot of @code{(interactive)} declarations.
+
+@item
+The outline commands are now always accessible from @LaTeX{} mode.
+
+@item
+Generalized the keyboard remapping and double modes.
+
+These are found in the file @file{min-key.el}. 
+
+@item
+Smart Comments.
+
+Not really, but there are now two comment functions which use their
+arguments to determine what to do, instead of four functions ignoring
+their arguments.
+
+@item
+Add outline headers.
+
+It is now possible to add extra outline headers, by setting the variable
+@code{TeX-outline-extra}. 
+
+@item 
+Smart quotes even smarter.
+
+If you press @kbd{"} twice, it will insert an real double quote instead
+of two (or four) single quotes.  This is consistent with how remapping
+in @file{min-key.el} is done.
+
+@item
+Automatically untabify buffer when you save it.
+
+Hands up, everyone who have produced a `last revision' paper containing
+an unreadable list of data in the back, because @TeX{} does not
+understands tabs.
+
+@item
+Call show-all when you change major mode.
+
+Thanks to Inge Frick's @samp{<inge@@nada.kth.se>} @file{kill-fix.el}
+enhancement, outline minor mode can now guarantee that all text is shown
+when you leave the minor mode, even if you leave the minor mode by
+changing the major mode.
+
+@item
+Updated documentation for 7.0.
+
+Also added key, variable, function, and concept indexes, as well as this
+history section and a new chapter on multifile documents
+(@pxref{Multifile}).@refill
+
+@end itemize
+
+@node Version 6.1
+@comment node-name,  next,  previous,  up
+@section Version 6.1
+
+Coordinator: Per Abrahamsen, 1992.
+
+@itemize @bullet
+@item
+@code{TeX-region} might work now (heard that before?).
+
+Many people reported this one.  Especially thanks to Fran Burstall
+@samp{<F.E.Burstall@@maths.bath.ac.uk>} and Bill Schworm
+@samp{<bill@@schworm.econ.ubc.ca>}.@refill
+
+@item
+The specification format for the @TeX{} command is more general.  
+
+See the documentation for @code{LaTeX-command} and
+@code{plain-TeX-command}. 
+
+@item
+The specification format for the preview commands is more general.
+
+See their respective documentation.
+
+@item
+The specification format for the print command is more general.  
+
+See the documentation for @code{TeX-print-command}.
+
+@item
+@code{TeX-args} is marked as obsolete.
+
+@item
+The @samp{"Emergency stop ..."} error.
+
+Some users of old @TeX{} installations got might might be fixed now.
+Thanks to Philip Sterne @samp{<sterne@@dublin.llnl.gov>}.
+
+@item
+It is now possible to change the preview command.
+
+@dots{} without loading TeX-site first.  Thanks to Tim Bradshaw
+@samp{<tim.bradshaw@@edinburgh.ac.uk>}.
+
+@item
+New variable TeX-smart-quotes.
+
+Allow @file{german.sty} users (and others) to disable the mapping of
+double quote (@kbd{"} to @samp{``} or @samp{''}).  Thanks to Daniel
+Hernandez @samp{<danher@@informatik.tu-muenchen.de>}.
+
+@item
+Many minor corrections to the documentation.  
+
+Thanks to Mainhard E.  Mayer @samp{<hardy@@golem.ps.uci.edu>}.
+
+@item
+Make test for @code{HOSTTYPE} case insensitive.
+
+Thanks to Gisli Ottarsson @samp{<gisli@@liapunov.eecs.umisc.edu>}.
+
+@item
+@code{TeX-force-default-mode}
+
+Set to avoid AUC @TeX{}'s attempts to infer the mode of the file by
+itself.
+
+@end itemize
+
+@node Version 6.0
+@comment node-name,  next,  previous,  up
+@section Version 6.0
+
+Coordinator: Kresten Krab Thorup, 1992.
+
+Preliminary documentation is available in the directory @file{doc}.  It
+isn't very well written, but I believe it covers most interesting points.
+Comments, suggestions, or even rewrites of sections are VERY
+WELCOME@dots{}
+
+LaCheck has been incorporated in the package.  The source code for it is
+available in the directory @file{lacheck} along with the documentation
+for it.  Lacheck may also be used from the command line.  It is bound to
+@kbd{C-c $}.
+
+Some minor changes in:
+
+@table @code
+@item TeX-region
+Should work better with @samp{Master:} option.
+
+@item LaTeX-environment
+Numerous new hooks added by Masayuki Kuwada.
+
+@item TeX-command-on-region
+Removed. @kbd{C-c C-o} used for @code{outline-minor-mode} instead.
+
+@end table
+
+And some additional minor fixes...
+
+@node Ancient History
+@comment  node-name,  next,  previous,  up
+@section Ancient History
+
+The origin of AUC @TeX{} is @file{tex-mode.el} from Emacs 16.  Lars
+Peter Fischer @samp{<fischer@@iesd.auc.dk>} wrote the first functions to
+insert font macros and Danish characters back in 1986.  Per Abrahamsen
+@samp{<abraham@@iesd.auc.dk>} wrote the functions to insert environments
+and sections, to indent the text, and the outline minor mode in 1987.
+Kresten Krab Thorup @samp{<krab@@iesd.auc.dk>} wrote the buffer handling
+and debugging functions, the macro completion, and much more, including
+much improved indentation and text formatting functions.  He also made
+the first public release in 1991, and was the main author and
+coordinator of every release up to and including 6.0.
+
+Thanks should also go to all the people who have been a great help
+developing the AUC @TeX{} system.  Especially all the people on the
+@samp{auc-tex} mailing list, who have been very helpful commenting and
+pointing out weak points and errors.
+
+Some of the contributors are listed below.  Others are mentioned in the
+lisp files or in the History section.
+
+@table @samp
+@item <dduchier@@csi.UOttawa.CA>
+Denys Duchier
+@item <ferguson@@cs.rochester.edu>
+George Ferguson
+@item <simons@@ibiza.karlsruhe.gmd.de>
+Martin Simons
+@item <smith@@pell.anu.edu.au>
+Michael Smith
+@item <per@@iesd.auc.dk>
+Per Hagen
+@item <handl@@cs.uni-sb.de>
+Ralf Handl
+@item <sven@@tde.lth.se>
+Sven Mattisson
+@item <kuwada@@soliton.ee.uec.ac.jp>
+Masayuki Kuwada
+@item <tb06@@pl118f.cc.lehigh.edu>
+Terrence Brannon
+@item <roseman@@hustat.harvard.edu>   
+Leonard Roseman
+@end table
+
+Special thanks to Leslie Lamport for supplying the source for the LaTeX
+error messages in the @file{tex-dbg.el} file.
+
diff --git a/packages/auctex/doc/install.texi b/packages/auctex/doc/install.texi
new file mode 100644 (file)
index 0000000..f13798b
--- /dev/null
@@ -0,0 +1,576 @@
+@c This is part of the AUCTeX Manual.
+@c Copyright (C) 1994, 1996, 2003, 2004, 2005, 2006, 2007
+@c   Free Software Foundation, Inc.
+@c See the file auctex.texi for copying conditions.
+@ifset rawfile
+@include macros.texi
+@node Installation,,(dir),(dir)
+@top Installing @AUCTeX{}
+@end ifset
+
+@ifclear rawfile
+@node Installation
+@chapter Installing @AUCTeX{}
+@end ifclear
+
+Installing @AUCTeX{} should be simple: merely @command{./configure},
+@command{make}, and @code{make install} for a standard site-wide
+installation (most other installations can be done by specifying a
+@option{--prefix=@dots{}} option).
+
+On many systems, this will already activate the package, making its
+modes the default instead of the built-in modes of Emacs.  If this is
+not the case, consult @ref{Loading the package}.  Please read through
+this document fully before installing anything.  The installation
+procedure has changed as compared to earlier versions.  Users of @w{MS
+Windows} are asked to consult
+@ifset rawfile
+the file @file{INSTALL.windows}.
+@end ifset
+@ifclear rawfile
+@xref{Installation under MS Windows}.
+@end ifclear
+
+@ifclear rawfile
+@menu
+* Prerequisites::
+* Configure::
+* Build/install::
+* Loading the package::
+* Advice for package providers::
+* Advice for non-privileged users::
+* Installation under MS Windows::
+* Customizing::
+@end menu
+@end ifclear
+
+@ifset rawfile
+@menu
+* Prerequisites::
+* Configure::
+* Build/install::
+* Loading the package::
+* Advice for package providers::
+* Advice for non-privileged users::
+* Customizing::
+@end menu
+@end ifset
+
+@ifset rawfile
+@node Prerequisites
+@chapter Prerequisites
+@raisesections
+@end ifset
+
+@ifclear rawfile
+@node Prerequisites
+@section Prerequisites
+@end ifclear
+
+@itemize @bullet
+@item A recent version of Emacs, alternatively XEmacs
+
+@w{Emacs 20} is no longer supported, and neither is XEmacs with a
+version of @code{xemacs-base} older than 1.84 (released in sumo from
+02/02/2004).  Using @previewlatex{} requires a version of Emacs compiled
+with image support.  While the X11 version of @w{Emacs 21} will likely
+work, @w{Emacs 22} and later is the preferred platform.
+
+@table @b
+@item Windows
+Precompiled versions are available from
+@uref{ftp://ftp.gnu.org/gnu/emacs/windows/}.
+@item Mac OS X
+For an overview of precompiled versions of Emacs for Mac OS X see for
+example @uref{http://www.emacswiki.org/cgi-bin/wiki/EmacsForMacOS}.
+@item GNU/Linux
+Most GNU/Linux distributions nowadays provide a variant of Emacs 22 or
+later via their package repositories.
+@item Self-compiled
+Compiling Emacs yourself requires a C compiler and a number of tools and
+development libraries.  Details are beyond the scope of this manual.
+Instructions for checking out the source code can be found at
+@uref{https://savannah.gnu.org/bzr/?group=emacs}.
+@end table
+
+If you really need to use @w{Emacs 21} on platforms where this implies
+missing image support, you should disable the installation of
+@previewlatex{} (see below).
+
+While XEmacs (version 21.4.15, 21.4.17 or later) is supported, doing
+this in a satisfactory manner has proven to be difficult.  This is
+mostly due to technical shortcomings and differing API's which are hard
+to come by.  If @AUCTeX{} is your main application for XEmacs, you are
+likely to get better results and support by switching to Emacs.  Of
+course, you can improve support for your favorite editor by giving
+feedback in case you encounter bugs.
+
+@item A working @TeX{} installation
+
+Well, @AUCTeX{} would be pointless without that.  Processing
+documentation requires @TeX{}, @LaTeX{} and Texinfo during installation.
+@previewlatex{} requires Dvips for its operation in @acronym{DVI} mode.
+The default configuration of @AUCTeX{} is tailored for te@TeX{} or
+@TeX{}live-based distributions, but can be adapted easily.
+
+@item A recent Ghostscript
+
+This is needed for operation of @previewlatex{} in both @acronym{DVI}
+and @acronym{PDF} mode.  Most versions of Ghostscript nowadays in use
+should work fine (version 7.0 and newer).  If you encounter problems,
+check
+@ifset rawfile
+the @file{PROBLEMS} file.
+@end ifset
+@ifclear rawfile
+@ref{Problems with Ghostscript,,,preview-latex,the @previewlatex{} manual}.
+@end ifclear
+
+@item The @code{texinfo} package
+
+Strictly speaking, you can get away without it if you are building
+from the distribution tarball, have not modified any files and don't
+need a printed version of the manual: the pregenerated info file is
+included in the tarball.  At least @w{version 4.0} is required.
+
+@end itemize
+
+For some known issues with various software, see
+@ifset rawfile
+the @file{PROBLEMS} file.
+@end ifset
+@ifclear rawfile
+@ref{Known problems,,,preview-latex,the @previewlatex{} manual}.
+@end ifclear
+
+@node Configure
+@section Configure
+
+The first step is to configure the source code, telling it where
+various files will be.  To do so, run
+
+@example
+./configure @var{options}
+@end example
+
+(Note: if you have fetched @AUCTeX{} from @acronym{CVS} rather than
+a regular release, you will have to first follow the instructions in
+@file{README.CVS}).
+
+On many machines, you will not need to specify any options, but if
+@command{configure} cannot determine something on its own, you'll need to
+help it out with one of these options:
+
+@table @code
+@item --prefix=@file{/usr/local}
+All automatic placements for package components will be chosen from
+sensible existing hierarchies below this: directories like @file{man},
+@file{share} and @file{bin} are supposed to be directly below
+@var{prefix}.
+
+Only if no workable placement can be found there, in some cases an
+alternative search will be made in a prefix deduced from a suitable
+binary.
+
+@file{/usr/local} is the default @var{prefix}, intended to be suitable
+for a site-wide installation.  If you are packaging this as an
+operating system component for distribution, the setting @file{/usr}
+will probably be the right choice.  If you are planning to install the
+package as a single non-priviledged user, you will typically set
+@var{prefix} to your home directory.
+
+@item --with-emacs[=@var{/path/to/emacs}]
+If you are using a pretest which isn't in your @code{$PATH}, or
+@command{configure} is not finding the right Emacs executable, you can
+specify it with this option.
+
+@item --with-xemacs[=@var{/path/to/xemacs}]
+Configure for generation under XEmacs (Emacs is the default).  Again,
+the name of the right XEmacs executable can be specified, complete with
+path if necessary.
+
+@item --with-packagedir=@var{/dir}
+This XEmacs-only option configures the directory for XEmacs packages.  A
+typical user-local setting would be @file{~/.xemacs/xemacs-packages}.
+If this directory exists and is below @var{prefix}, it should be
+detected automatically.  This will install and activate the package.
+
+@item --without-packagedir
+This XEmacs-only option switches the detection of a package directory
+and corresponding installation off.  Consequently, the Emacs
+installation scheme will be used.  This might be appropriate if you are
+using a different package system/installer than the XEmacs one and want
+to avoid conflicts.
+
+The Emacs installation scheme has the following options:
+
+@item --with-lispdir=@var{/dir}
+This Emacs-only option specifies the location of the @file{site-lisp}
+directory within @samp{load-path} under which the files will get
+installed (the bulk will get installed in a subdirectory).
+@file{./configure} should figure this out by itself.
+
+@item --with-auctexstartfile=@file{auctex.el}
+@itemx --with-previewstartfile=@file{preview-latex.el}
+This is the name of the respective startup files.  If @var{lispdir}
+contains a subdirectory @file{site-start.d}, the start files are
+placed there, and @file{site-start.el} should
+load them automatically.  Please be aware that you must not move the
+start files after installation since other files are found
+@emph{relative} to them.
+
+@item --with-packagelispdir=@file{auctex}
+This is the directory where the bulk of the package gets located.  The
+startfile adds this into @var{load-path}.
+
+@item --with-auto-dir=@var{/dir}
+You can use this option to specify the directory containing
+automatically generated information.  It is not necessary for most
+@TeX{} installs, but may be used if you don't like the directory that
+configure is suggesting.
+
+@item --help
+This is not an option specific to @AUCTeX{}. A number of standard
+options to @command{configure} exist, and we do not have the room to
+describe them here; a short description of each is available, using
+@code{--help}.  If you use @samp{--help=recursive}, then also
+@previewlatex{}-specific options will get listed.
+
+@item --disable-preview
+This disables configuration and installation of @previewlatex{}.  This
+option is not actually recommended.  If your Emacs does not support
+images, you should really upgrade to a newer version.  Distributors
+should, if possible, refrain from distributing @AUCTeX{} and
+@previewlatex{} separately in order to avoid confusion and upgrade
+hassles if users install partial packages on their own.
+
+@item --with-texmf-dir=@var{/dir}@*--without-texmf-dir
+@cindex preview-install-styles
+This option is used for specifying a @acronym{TDS}-compliant directory
+hierarchy.  Using @code{--with-texmf-dir=@var{/dir}} you can specify
+where the @TeX{} @acronym{TDS} directory hierarchy resides, and the
+@TeX{} files will get installed in
+@file{@var{/dir}/tex/latex/preview/}.
+
+If you use the @code{--without-texmf-dir} option, the @TeX{}-related
+files will be kept in the Emacs Lisp tree, and at runtime the
+@env{TEXINPUTS} environment variable will be made to point there.  You
+can install those files into your own @TeX{} tree at some later time
+with @kbd{M-x preview-install-styles RET}.
+
+@item --with-tex-dir=@var{/dir}
+If you want to specify an exact directory for the preview @TeX{} files,
+use @code{--with-tex-dir=@var{/dir}}. In this case, the files will be
+placed in @file{@var{/dir}}, and you'll also need the following option:
+
+@item --with-doc-dir=@var{/dir}
+This option may be used to specify where the @TeX{} documentation goes.
+It is to be used when you are using @code{--with-tex-dir=@var{/dir}},
+but is normally not necessary otherwise.
+@end table
+
+@node Build/install
+@section Build/install
+
+@cindex Installation
+@cindex Make
+
+Once @command{configure} has been run, simply enter
+
+@example
+make
+@end example
+
+@noindent
+at the prompt to byte-compile the lisp files, extract the @TeX{} files
+and build the documentation files.  To install the files into the
+locations chosen earlier, type
+
+@example
+make install
+@end example
+
+You may need special privileges to install, e.g., if you are installing
+into system directories.
+
+@node Loading the package
+@section Loading the package
+@cindex @file{.emacs}
+
+You can detect the successful activation of @AUCTeX{} and
+@previewlatex{} in the menus after loading a @LaTeX{} file like
+@file{preview/circ.tex}: @AUCTeX{} then gives you a @samp{Command} menu,
+and @previewlatex{} gives you a @samp{Preview} menu.
+
+For XEmacs, if the installation occured into a valid package directory
+(which is the default), then this should work out of the box.
+
+@cindex @file{auctex.el}
+@cindex @file{tex-site.el}
+With Emacs (or if you explicitly disabled use of the package system),
+the startup files @file{auctex.el} and @file{preview-latex.el} may
+already be in a directory of the @file{site-start.d/} variety if your
+Emacs installation provides it.  In that case they should be
+automatically loaded on startup and nothing else needs to be done.  If
+not, they should at least have been placed somewhere in your
+@code{load-path}.  You can then load them by placing the lines
+
+@example
+(load "auctex.el" nil t t)
+(load "preview-latex.el" nil t t)
+@end example
+
+into your init file.
+
+If you explicitly used @code{--with-lispdir}, you may need to add the
+specified directory into Emacs' @code{load-path} variable by adding
+something like
+
+@example
+(add-to-list 'load-path "~/elisp")
+@end example
+
+before the above lines into your Emacs startup file.
+
+For site-wide activation in GNU Emacs, see
+@ifset rawfile
+below.
+@end ifset
+@ifclear rawfile
+@xref{Advice for package providers}.
+@end ifclear
+
+Once activated, the modes provided by @AUCTeX{} are used per default for
+all supported file types.  If you want to change the modes for which it
+is operative instead of the default, use
+@example
+@kbd{M-x customize-variable @key{RET} TeX-modes @key{RET}}
+@end example
+
+If you want to remove a preinstalled @AUCTeX{} completely before any of
+its modes have been used,
+@example
+(unload-feature 'tex-site)
+@end example
+should accomplish that.
+
+@node Advice for package providers
+@section Providing @AUCTeX{} as a package
+
+As a package provider, you should make sure that your users will be
+served best according to their intentions, and keep in mind that a
+system might be used by more than one user, with different
+preferences.
+
+There are people that prefer the built-in Emacs modes for editing
+@TeX{} files, in particular plain @TeX{} users.  There are various
+ways to tell @AUCTeX{} even after auto-activation that it should
+not get used, and they are described in
+@ifset rawfile
+the @file{README} file.
+@end ifset
+@ifclear rawfile
+@ref{Introduction,,Introduction to @AUCTeX{}}.
+@end ifclear
+
+So if you have users that don't want to use the preinstalled @AUCTeX{},
+they can easily get rid of it.  Activating @AUCTeX{} by default is
+therefore a good choice.
+
+If the installation procedure did not achieve this already by placing
+@file{auctex.el} and @file{preview-latex.el} into a possibly existing
+@file{site-start.d} directory, you can do this by placing
+
+@example
+(load "auctex.el" nil t t)
+(load "preview-latex.el" nil t t)
+@end example
+
+@noindent in the system-wide @file{site-start.el}.
+
+If your package is intended as an XEmacs package or to accompany a
+precompiled version of Emacs, you might not know which @TeX{} system
+will be available when @previewlatex{} gets used.  In this case you
+should build using the @code{--without-texmf-dir} option described
+previously.  This can also be convenient for systems that are intended
+to support more than a single TeX distribution.  Since more often than
+not @TeX{} packages for operating system distributions are either much
+more outdated or much less complete than separately provided systems
+like @w{@TeX{} Live}, this method may be generally preferable when
+providing packages.
+
+The following package structure would be adequate for a typical fully
+supported Unix-like installation:
+
+@table @samp
+@item preview-tetex
+Style files and documentation for @file{preview.sty}, placed into a
+@TeX{} tree where it is accessible from the te@TeX{} executables usually
+delivered with a system.  If there are other commonly used @TeX{} system
+packages, it might be appropriate to provide separate packages for
+those.
+@item auctex-emacs-tetex
+This package will require the installation of @samp{preview-tetex} and
+will record in @samp{TeX-macro-global} where to find the @TeX{} tree.
+It is also a good idea to run
+@example
+emacs -batch -f TeX-auto-generate-global
+@end example
+when either @AUCTeX{} or te@TeX{} get installed or upgraded.  If your
+users might want to work with a different @TeX{} distribution (nowadays
+pretty common), instead consider the following:
+@item auctex-emacs
+This package will be compiled with @samp{--without-texmf-dir} and will
+consequently contain the @samp{preview} style files in its private
+directory.  It will probably not be possible to initialize
+@samp{TeX-macro-global} to a sensible value, so running
+@samp{TeX-auto-generate-global} does not appear useful.  This package
+would neither conflict with nor provide @samp{preview-tetex}.
+@item auctex-xemacs-tetex
+@itemx auctex-xemacs
+Those are the obvious XEmacs equivalents.  For XEmacs, there is the
+additional problem that the XEmacs sumo package tree already possibly
+provides its own version of @AUCTeX{}, and the user might even have used
+the XEmacs package manager to updating this package, or even installing
+a private @AUCTeX{} version.  So you should make sure that such a
+package will not conflict with existing XEmacs packages and will be
+at an appropriate place in the load order (after site-wide and
+user-specific locations, but before a distribution-specific sumo package
+tree).  Using the @code{--without-packagedir} option might be one idea
+to avoid conflicts.  Another might be to refrain from providing an
+XEmacs package and just rely on the user or system administrator to
+instead use the XEmacs package system.
+@end table
+
+@node Advice for non-privileged users
+@section Installation for non-privileged users
+
+Often people without system administration privileges want to install
+software for their private use.  In that case you need to pass more
+options to the @command{configure} script.  For XEmacs users, this is
+fairly easy, because the XEmacs package system has been designed to make
+this sort of thing practical: but GNU Emacs users (and XEmacs users for
+whom the package system is for some reason misbehaving) may need to do a
+little more work.
+
+The main expedient is using the @option{--prefix} option to the
+@file{configure} script, and let it point to the personal home
+directory.  In that way, resulting binaries will be installed under the
+@file{bin} subdirectory of your home directory, manual pages under
+@file{man} and so on.  It is reasonably easy to maintain a bunch of
+personal software, since the prefix argument is supported by most
+@file{configure} scripts.
+
+You'll have to add something like
+@file{/home/myself/share/emacs/site-lisp} to your @code{load-path}
+variable, if it isn't there already.
+
+XEmacs users can achieve the same end by pointing @command{configure} at an
+appropriate package directory (normally
+@option{--with-packagedir=~/.xemacs/xemacs-packages} will serve).  The
+package directory stands a good chance at being detected automatically
+as long as it is in a subtree of the specified @var{prefix}.
+
+Now here is another thing to ponder: perhaps you want to make it easy
+for other users to share parts of your personal Emacs configuration.  In
+general, you can do this by writing @samp{~myself/} anywhere where you
+specify paths to something installed in your personal subdirectories,
+not merely @samp{~/}, since the latter, when used by other users, will
+point to non-existent files.
+
+For yourself, it will do to manipulate environment variables in your
+@file{.profile} resp.@: @file{.login} files.  But if people will be
+copying just Elisp files, their copies will not work.  While it would
+in general be preferable if the added components where available from
+a shell level, too (like when you call the standalone info reader, or
+try using @file{preview.sty} for functionality besides of Emacs
+previews), it will be a big help already if things work from inside
+of Emacs.
+
+Here is how to do the various parts:
+
+@subheading Making the Elisp available
+
+In GNU Emacs, it should be sufficient if people just do
+
+@lisp
+(load "~myself/share/emacs/site-lisp/auctex.el" nil t t)
+(load "~myself/share/emacs/site-lisp/preview-latex.el" nil t t)
+@end lisp
+
+where the path points to your personal installation.  The rest of the
+package should be found relative from there without further ado.
+
+In XEmacs, you should ask the other users to add symbolic links in the
+subdirectories @file{lisp}, @file{info} and @file{etc} of their
+@file{~/.xemacs/xemacs-packages/} directory.  (Alas, there is presently
+no easy programmatic way to do this, except to have a script do the
+symlinking for them.)
+
+@subheading Making the Info files available
+
+For making the info files accessible from within Elisp, something like
+the following might be convenient to add into your or other people's
+startup files:
+
+@lisp
+(eval-after-load 'info
+   '(add-to-list 'Info-directory-list "~myself/info"))
+@end lisp
+
+In XEmacs, as long as XEmacs can see the package, there should be no
+need to do anything at all; the info files should be immediately
+visible.  However, you might want to set @env{INFOPATH} anyway, for the
+sake of standalone readers outside of XEmacs. (The info files in XEmacs
+are normally in @file{~/.xemacs/xemacs-packages/info}.)
+
+@subheading Making the @LaTeX{} style available
+
+If you want others to be able to share your installation, you should
+configure it using @samp{--without-texmf-dir}, in which case things
+should work as well for them as for you.
+
+@ifclear rawfile
+@node Installation under MS Windows
+@section Installation under MS Windows
+@include wininstall.texi
+@end ifclear
+
+@node Customizing
+@section Customizing
+@cindex Site initialization
+@cindex Initialization
+@cindex @file{tex-site.el}
+@cindex Personal customization
+@cindex Site customization
+@cindex Customization
+@cindex Customization, personal
+@cindex Customization, site
+Most of the site-specific customization should already have happened
+during configuration of @AUCTeX{}.  Any further customization can be
+done with customization buffers directly in Emacs.  Just type @kbd{M-x
+customize-group RET AUCTeX RET} to open the customization group for
+@AUCTeX{} or use the menu entries provided in the mode menus.  Editing
+the file @file{tex-site.el} as suggested in former versions of @AUCTeX{}
+should not be done anymore because the installation routine will
+overwrite those changes.
+
+You might check some variables with a special significance.  They are
+accessible directly by typing @kbd{M-x customize-variable RET <variable>
+RET}.
+
+@defopt TeX-macro-global
+Directories containing the site's @TeX{} style files.
+@end defopt
+
+Normally, @AUCTeX{} will only allow you to complete macros and
+environments which are built-in, specified in @AUCTeX{} style files or
+defined by yourself.  If you issue the @kbd{M-x
+TeX-auto-generate-global} command after loading @AUCTeX{}, you will be
+able to complete on all macros available in the standard style files
+used by your document.  To do this, you must set this variable to a list
+of directories where the standard style files are located.  The
+directories will be searched recursively, so there is no reason to list
+subdirectories explicitly.  Automatic configuration will already have
+set the variable for you if it could use the program @samp{kpsewhich}.
+In this case you normally don't have to alter anything.
diff --git a/packages/auctex/doc/intro.texi b/packages/auctex/doc/intro.texi
new file mode 100644 (file)
index 0000000..0a23200
--- /dev/null
@@ -0,0 +1,106 @@
+@include macros.texi
+@ifset rawfile
+@paragraphindent none
+This is the README file for the AUCTeX distribution.
+
+@quotation
+Copyright (C) 2008 Free Software Foundation, Inc.
+
+Copying and distribution of this file, with or without modification, are
+permitted in any medium without royalty provided the copyright notice
+and this notice are preserved.
+@end quotation
+
+@chapheading Introduction to @AUCTeX{}
+@end ifset
+
+@ifclear rawfile
+@node Summary
+@chapter Overview of @AUCTeX{}
+@end ifclear
+
+@ifset rawfile
+This file gives a brief overview of what @AUCTeX{} is.  It is
+@strong{not} an attempt to document @AUCTeX{}.  Real documentation for
+@AUCTeX{} is available in the manual, which should be available as an
+info file after installation.
+@end ifset
+
+@AUCTeX{} is a comprehensive customizable integrated environment for
+writing input files for @TeX{}, @LaTeX{}, @ConTeXt{}, Texinfo, and
+doc@TeX{} using Emacs or XEmacs.
+
+It supports you in the insertion of macros, environments, and sectioning
+commands by providing completion alternatives and prompting for
+parameters.  It automatically indents your text as you type it and lets
+you format a whole file at once.  The outlining and folding facilities
+provide you with a focused and clean view of your text.
+
+@AUCTeX{} lets you process your source files by running @TeX{} and
+related tools (such as output filters, post processors for generating
+indices and bibliographies, and viewers) from inside Emacs.  @AUCTeX{}
+lets you browse through the errors @TeX{} reported, while it moves the
+cursor directly to the reported error, and displays some documentation
+for that particular error.  This will even work when the document is
+spread over several files.
+
+One component of @AUCTeX{} that @LaTeX{} users will find attractive is
+@previewlatex{}, a combination of folding and in-source previewing
+that provides true ``What You See Is What You Get'' experience in your
+sourcebuffer, while letting you retain full control.
+@ifset rawfile
+For more information, see further below.
+@end ifset
+
+More detailed information about the features and usage of @AUCTeX{} can
+be found in the
+@ifset rawfile
+@AUCTeX{} manual.  You can access it from within Emacs by typing
+@kbd{C-h i d m auctex @key{RET}}.  If you prefer the standalone info
+reader, issue the command @code{info auctex} in a terminal.
+@end ifset
+@ifclear rawfile
+remainder of this manual.
+@end ifclear
+
+@AUCTeX{} is written entirely in Emacs Lisp, and hence you can easily
+add new features for your own needs.  It is a GNU project and
+distributed under the `GNU General Public License Version 3'.
+
+The most recent version is always available at
+@url{http://ftp.gnu.org/pub/gnu/auctex/}.
+
+WWW users may want to check out the @AUCTeX{} page at
+@url{http://www.gnu.org/software/auctex/}.
+
+For comprehensive information about how to install @AUCTeX{}
+@ifset rawfile
+read the file @file{INSTALL} or @file{INSTALL.windows}, respectively.
+@end ifset
+@ifclear rawfile
+@xref{Installation}, or @ref{Installation under MS Windows},
+respectively.
+@end ifclear
+
+If you are considering upgrading @AUCTeX{}, the recent changes are
+described in
+@ifset rawfile
+the @file{CHANGES} file.
+@end ifset
+@ifclear rawfile
+@ref{Changes}.
+@end ifclear
+
+If you want to discuss @AUCTeX{} with other users or its developers,
+there are several mailing lists you can use.
+
+Send a mail with the subject ``subscribe'' to
+@email{auctex-request@@gnu.org} in order to join the general discussion
+list for @AUCTeX{}.  Articles should be sent to @email{auctex@@gnu.org}.
+In a similar way, you can subscribe to the @email{info-auctex@@gnu.org}
+list for just getting important announcements about @AUCTeX{}.  The list
+@email{bug-auctex@@gnu.org} is for bug reports which you should usually
+file with the @kbd{M-x TeX-submit-bug-report @key{RET}} command.  If you
+want to address the developers of @AUCTeX{} themselves with technical
+issues, they can be found on the discussion list
+@email{auctex-devel@@gnu.org}.
diff --git a/packages/auctex/doc/macros.texi b/packages/auctex/doc/macros.texi
new file mode 100644 (file)
index 0000000..36938ff
--- /dev/null
@@ -0,0 +1,82 @@
+@ifclear macros
+@set macros
+@ifnottex
+@macro AUCTeX {}
+AUC@TeX{}
+@end macro
+@macro ConTeXt {}
+Con@TeX{}t
+@end macro
+@macro LaTeX {}
+La@TeX{}
+@end macro
+@macro previewlatex {}
+preview-latex
+@end macro
+@macro fontlatex {}
+font-latex
+@end macro
+@ifset no-acronym
+@clear no-acronym
+@macro acronym {text}
+@sc{\text\}
+@end macro
+@end ifset
+@ifset no-env
+@clear no-env
+@macro env {text}
+@code{\text\}
+@end macro
+@end ifset
+@ifset no-option
+@clear no-option
+@macro option {text}
+@samp{\text\}
+@end macro
+@end ifset
+@ifset no-command
+@clear no-command
+@macro command {text}
+@samp{\text\}
+@end macro
+@end ifset
+@end ifnottex
+@macro sans {text}@c
+@iftex
+{@textsf \text\}@c
+@end iftex
+@ifnottex
+\text\@c
+@end ifnottex
+@end macro
+@tex
+\global\let\savedTeX\TeX
+\gdef\TeX#1{\savedTeX#1}
+\gdef\LaTeX{%
+    L\kern-.36em\raise.3ex\hbox{\sc{a}}\kern-.15em\TeX}
+\gdef\previewlatex#1{%
+    {\sf preview-latex}#1}
+\gdef\fontlatex#1{%
+    {\sf font-latex}#1}
+\gdef\AUCTeX{AUC\TeX}
+\gdef\ConTeXt#1{%
+    Con\TeX t#1}
+\toks0\expandafter{\indexnofonts
+  \def\TeX#1{TeX#1}%
+  \def\LaTeX#1{LaTeX#1}\def\previewlatex#1{preview-latex#1}}
+\xdef\indexnofonts{\the\toks0}
+\toks0\expandafter{\commondummies
+  \def\TeX#1{TeX#1}%
+  \def\LaTeX#1{LaTeX#1}\def\previewlatex#1{preview-latex#1}}
+\xdef\commondummies{\the\toks0}
+\ifx\acronym\undefined \gdef\acronym#1{{\smallcaps \lowercase{#1}}} \fi
+\ifx\env\undefined \global\let\env=\code \fi
+\ifx\option\undefined \global\let\option=\samp \fi
+\ifx\command\undefined \global\let\command=\samp \fi
+%Bug fix for texinfo.tex:
+\gdef\cslet#1#2{%
+\expandafter\let
+\csname#1\expandafter\endcsname
+\csname#2\endcsname}
+@end tex
+@end ifclear
diff --git a/packages/auctex/doc/preview-dtxdoc.texi b/packages/auctex/doc/preview-dtxdoc.texi
new file mode 100644 (file)
index 0000000..a6cd649
--- /dev/null
@@ -0,0 +1,488 @@
+The main purpose of this package is the extraction of certain
+environments (most notably displayed formulas) from @LaTeX{} sources
+as graphics.  This works with @acronym{DVI} files postprocessed by either
+Dvips and Ghostscript or dvipng, but it also works when you are
+using PDF@TeX{} for generating PDF files (usually also postprocessed
+by Ghostscript).
+
+Current uses of the package include the @previewlatex{} package for
+WYSIWYG functionality in the @AUCTeX{} editing environment,
+generation of previews in LyX, as part of the operation of the
+ps4pdf package, the tbook XML system and some other tools.
+
+Producing @acronym{EPS} files with Dvips and its derivatives using the
+@option{-E} option is not a good alternative: People make do by
+fiddling around with @code{\thispagestyle@{empty@}} and hoping for the best
+(namely, that the specified contents will indeed fit on single
+pages), and then trying to guess the baseline of the resulting code
+and stuff, but this is at best dissatisfactory.  The preview package
+provides an easy way to ensure that exactly one page per request
+gets shipped, with a well-defined baseline and no page decorations.
+While you still can use the preview package with the `classic'
+
+@example
+dvips -E -i
+@end example
+
+@noindent
+invocation, there are better ways available that don't rely on Dvips
+not getting confused by PostScript specials.
+
+For most applications, you'll want to make use of the @code{tightpage}
+option.  This will embed the page dimensions into the PostScript or
+PDF code, obliterating the need to use the @code{-E -i} options to Dvips.
+You can then produce all image files with a single run of
+Ghostscript from a single PDF or PostScript (as opposed to @acronym{EPS})
+file.
+
+Various options exist that will pass @TeX{} dimensions and other
+information about the respective shipped out material (including
+descender size) into the log file, where external applications might
+make use of it.
+
+The possibility for generating a whole set of graphics with a single
+run of Ghostscript (whether from @LaTeX{} or PDF@LaTeX{}) increases
+both speed and robustness of applications.  It is also feasible to
+use dvipng on a @acronym{DVI} file with the options
+
+@example
+-picky -noghostscript
+@end example
+
+@noindent
+to omit generating any image file that requires Ghostscript, then
+let a script generate all missing files using Dvips/Ghostscript.
+This will usually speed up the process significantly.
+
+@menu
+* Package options::
+* Provided commands::
+@end menu
+
+@node Package options, Provided commands, The LaTeX style file, The LaTeX style file
+@subsection Package options
+The package is included with the customary
+
+@example
+\usepackage[@var{options}]@{preview@}
+@end example
+
+@noindent
+You should usually load this package as the last one, since it
+redefines several things that other packages may also provide.
+
+The following options are available:
+
+@table @w
+@item @code{active}
+is the most essential option.  If this option is not
+specified, the @code{preview} package will be inactive and the document
+will be typeset as if the @code{preview} package were not loaded,
+except that all declarations and environments defined by the
+package are still legal but have no effect.  This allows defining
+previewing characteristics in your document, and only activating
+them by calling @LaTeX{} as
+
+@example
+latex '\PassOptionsToPackage@{active@}@{preview@} \input@{@var{filename}@}'
+@end example
+
+@item @code{noconfig}
+Usually the file @file{prdefault.cfg} gets loaded
+whenever the @code{preview} package gets activated.  @file{prdefault.cfg} is
+supposed to contain definitions that can cater for otherwise bad
+results, for example, if a certain document class would otherwise
+lead to trouble.  It also can be used to override any settings
+made in this package, since it is loaded at the very end of it.
+In addition, there may be configuration files specific for certain
+@code{preview} options like @code{auctex} which have more immediate needs.
+The @code{noconfig} option suppresses loading of those option files,
+too.
+@item @code{psfixbb}
+Dvips determines the bounding boxes from the
+material in the @acronym{DVI} file it understands.  Lots of PostScript
+specials are not part of that.  Since the @TeX{} boxes do not make
+it into the @acronym{DVI} file, but merely characters, rules and specials
+do, Dvips might include far too small areas.  The option @code{psfixbb}
+will include @file{/dev/null} as a graphic file in the ultimate upper
+left and lower right corner of the previewed box.  This will make
+Dvips generate an appropriate bounding box.
+@item @code{dvips}
+If this option is specified as a class option or to
+other packages, several packages pass things like page size
+information to Dvips, or cause crop marks or draft messages
+written on pages.  This seriously hampers the usability of
+previews.  If this option is specified, the changes will be undone
+if possible.
+@item @code{pdftex}
+If this option is set, PDF@TeX{} is assumed as the
+output driver.  This mainly affects the @code{tightpage} option.
+@item @code{xetex}
+If this option is set, Xe@TeX{} is assumed as the
+output driver.  This mainly affects the @code{tightpage} option.
+@item @code{displaymath}
+will make all displayed math environments
+subject to preview processing.  This will typically be the most
+desired option.
+@item @code{floats}
+will make all float objects subject to preview
+processing.  If you want to be more selective about what floats to
+pass through to a preview, you should instead use the
+@code{\PreviewSnarfEnvironment} command on the floats you want to
+have previewed.
+@item @code{textmath}
+will make all text math subject to previews.
+Since math mode is used throughly inside of @LaTeX{} even for other
+purposes, this works by redefining @code{\(}, @code{\)}
+and @code{$} and the @code{math} environment (apparently some people use
+that).  Only occurences of these text math delimiters in later
+loaded packages and in the main document will thus be affected.
+@item @code{graphics}
+will subject all @code{\includegraphics} commands
+to a preview.
+@item @code{sections}
+will subject all section headers to a preview.
+@item @code{delayed}
+will delay all activations and redefinitions the
+@code{preview} package makes until @code{\}@code{begin@{document@}}.  The purpose
+of this is to cater for documents which should be subjected to the
+@code{preview} package without having been prepared for it.  You can
+process such documents with
+
+@example
+latex '\RequirePackage[active,delayed,@var{options}]@{preview@}
+\input@{@var{filename}@}'
+@end example
+
+@noindent
+This relaxes the requirement to be loading the @code{preview} package
+as last package.
+@item @var{driver}
+loads a special driver file
+@file{pr@var{driver}.def}.  The remaining options are implemented
+through the use of driver files.
+@item @code{auctex}
+This driver will produce fake error messages at the
+start and end of every preview environment that enable the Emacs
+package @previewlatex{} in connection with @AUCTeX{} to pinpoint
+the exact source location where the previews have originated.
+Unfortunately, there is no other reliable means of passing the
+current @TeX{} input position @emph{in} a line to external
+programs.  In order to make the parsing more robust, this option
+also switches off quite a few diagnostics that could be
+misinterpreted.
+
+You should not specify this option manually, since it will only be
+needed by automated runs that want to parse the pseudo error
+messages.  Those runs will then use @code{\PassOptionsToPackage} in
+order to effect the desired behaviour.  In addition,
+@file{prauctex.cfg} will get loaded unless inhibited by the @code{noconfig}
+option.  This caters for the most frequently encountered
+problematic commands.
+@item @code{showlabels}
+During the editing process, some people like to
+see the label names in their equations, figures and the like.  Now
+if you are using Emacs for editing, and in particular
+@previewlatex{}, I'd strongly recommend that you check out the
+Ref@TeX{} package which pretty much obliterates the need for this
+kind of functionality.  If you still want it, standard @LaTeX{}
+provides it with the @code{showkeys} package, and there is also the
+less encompassing @code{showlabels} package.  Unfortunately, since
+those go to some pain not to change the page layout and spacing,
+they also don't change @code{preview}'s idea of the @TeX{} dimensions of
+the involved boxes.  So if you are using @code{preview} for determing
+bounding boxes, those packages are mostly useless.  The option
+@code{showlabels} offers a substitute for them.
+@item @code{tightpage}
+It is not uncommon to want to use the results of
+@code{preview} as graphic images for some other application.  One
+possibility is to generate a flurry of @acronym{EPS} files with
+
+@example
+dvips -E -i -Pwww -o @var{outputfile}.000 @var{inputfile}
+@end example
+
+@noindent
+However, in case those are to be processed further into graphic
+image files by Ghostscript, this process is inefficient since all
+of those files need to be processed one by one.  In addition, it
+is necessary to extract the bounding box comments from the @acronym{EPS}
+files and convert them into page dimension parameters for
+Ghostscript in order to avoid full-page graphics.  This is not
+even possible if you wanted to use Ghostscript in a@w{ }@emph{single}
+run for generating the files from a single PostScript file, since
+Dvips will in that case leave no bounding box information
+anywhere.
+
+The solution is to use the @code{tightpage} option.  That way a single
+command line like
+
+@example
+@option{gs -sDEVICE=png16m -dTextAlphaBits=4 -r300
+-dGraphicsAlphaBits=4 -dSAFER -q -dNOPAUSE
+-sOutputFile=@var{outputfile}%d.png @var{inputfile}.ps}
+@end example
+
+@noindent
+will be able to produce tight graphics from a single PostScript
+file generated with Dvips @emph{without} use of the options
+@code{-E -i}, in a single run.
+
+The @code{tightpage} option actually also works when using the @code{pdftex}
+option and generating PDF files with PDF@TeX{}.  The resulting PDF
+file has separate page dimensions for every page and can directly
+be converted with one run of Ghostscript into image files.
+
+If neither @code{dvips} or @code{pdftex} have been specified, the
+corresponding option will get autodetected and invoked.
+
+If you need this in a batch environment where you don't want to
+use @code{preview}'s automatic extraction facilities, no problem: just
+don't use any of the extraction options, and wrap everything to be
+previewed into @code{preview} environments.  This is how LyX does its
+math previews.
+
+If the pages under the @code{tightpage} option are just too tight, you
+can adjust by setting the length @code{\PreviewBorder} to a different
+value by using @code{\setlength}.  The default value is
+@file{0.50001bp}, which is half of a usual PostScript point, rounded
+up.  If you go below this value, the resulting page size may drop
+below @code{1bp}, and Ghostscript does not seem to like that.  If you
+need finer control, you can adjust the bounding box dimensions
+individually by changing the macro @code{\PreviewBbAdjust} with the
+help of @code{\renewcommand}.  Its default value is
+
+@example
+\newcommand \PreviewBbAdjust
+@{-\PreviewBorder -\PreviewBorder
+\PreviewBorder  \PreviewBorder@}
+@end example
+
+@noindent
+This adjusts the left, lower, right and upper borders by the given
+amount.  The macro must contain 4@w{ }@TeX{} dimensions after another,
+and you may not omit the units if you specify them explicitly
+instead of by register.  PostScript points have the unit@w{ }@code{bp}.
+@item @code{lyx}
+This option is for the sake of LyX developers.  It will
+output a few diagnostics relevant for the sake of LyX' preview
+functionality (at the time of writing, mostly implemented for math
+insets, in versions of LyX starting with 1.3.0).
+@item @code{counters}
+This writes out diagnostics at the start and the
+end of previews.  Only the counters changed since the last output
+get written, and if no counters changed, nothing gets written at
+all.  The list consists of counter name and value, both enclosed
+in @code{@{@}} braces, followed by a space.  The last such pair is
+followed by a colon (@code{:}) if it is at the start of the preview
+snippet, and by a period (@file{.}) if it is at the end.  The order of
+different diagnostics like this being issued depends on the order
+of the specification of the options when calling the package.
+
+Systems like @previewlatex{} use this for keeping counters accurate
+when single previews are regenerated.
+@item @code{footnotes}
+This makes footnotes render as previews, and only
+as their footnote symbol.  A convenient editing feature inside of
+Emacs.
+@end table
+
+The following options are just for debugging purposes of the package
+and similar to the corresponding @TeX{} commands they allude to:
+
+@table @w
+@item @code{tracingall}
+causes lots of diagnostic output to appear in
+the log file during the preview collecting phases of @TeX{}'s
+operation.  In contrast to the similarly named @TeX{} command, it
+will not switch to @code{\errorstopmode}, nor will it change the
+setting of @code{\tracingonline}.
+@item @code{showbox}
+This option will show the contents of the boxes
+shipped out to the @acronym{DVI} files.  It also sets @code{\showboxbreadth} and
+@code{\showboxdepth} to their maximum values at the end of loading this
+package, but you may reset them if you don't like that.
+@end table
+
+@node Provided commands, ,Package options, The LaTeX style file
+@subsection Provided commands
+
+@table @code
+@item \begin@{preview@}@dots{}\end@{preview@}
+The @code{preview} environment causes its contents
+to be set as a single preview image.  Insertions like figures and
+footnotes (except those included in minipages) will typically lead
+to error messages or be lost.  In case the @code{preview} package has not
+been activated, the contents of this environment will be typeset
+normally.
+
+@item \begin@{nopreview@}@dots{}\end@{nopreview@}
+The @code{nopreview} environment will cause its
+contents not to undergo any special treatment by the @code{preview}
+package.  When @code{preview} is active, the contents will be discarded
+like all main text that does not trigger the @code{preview} hooks.  When
+@code{preview} is not active, the contents will be typeset just like the
+main text.
+
+Note that both of these environments typeset things as usual when
+preview is not active.  If you need something typeset conditionally,
+use the @code{\ifPreview} conditional for it.
+
+@item \PreviewMacro
+If you want to make a macro like
+@findex \PreviewMacro
+@code{\includegraphics} (actually, this is what is done by the
+@code{graphics} option to @code{preview}) produce a preview image, you put a
+declaration like
+
+@example
+\PreviewMacro[*[[!]@{\includegraphics@}
+@end example
+
+@noindent
+or, more readable,
+
+@example
+\PreviewMacro[@{*[][]@{@}@}]@{\includegraphics@}
+@end example
+
+@noindent
+into your preamble.  The optional argument to @code{\PreviewMacro}
+specifies the arguments @code{\includegraphics} accepts, since this
+is necessary information for properly ending the preview box.  Note
+that if you are using the more readable form, you have to enclose
+the argument in a @code{[@{} and @code{@}]} pair.  The inner braces are
+necessary to stop any included @code{[]} pairs from prematurely ending
+the optional argument, and to make a single @code{@{@}}
+denoting an optional argument not get stripped away by @TeX{}'s
+argument parsing.
+
+The letters simply mean
+
+@table @w
+@item @code{*}
+indicates an optional @code{*} modifier, as in
+@code{\includegraphics*}.
+@item @code{[}
+^^A]
+indicates an optional argument in brackets.  This syntax
+is somewhat baroque, but brief.
+@item @code{[]}
+also indicates an optional argument in brackets.  Be
+sure to have encluded the entire optional argument specification
+in an additional pair of braces as described above.
+@item @code{!}
+indicates a mandatory argument.
+@item @code{@{@}}
+indicates the same.  Again, be sure to have
+that additional level of braces around the whole argument
+specification.
+@item @code{?}@var{delimiter}@{@var{true case}@}@{@var{false case}@}
+is a
+conditional.  The next character is checked against being equal to
+@var{delimiter}.  If it is, the specification @var{true case} is
+used for the further parsing, otherwise @var{false case} will be
+employed.  In neither case is something consumed from the input,
+so @{@var{true case}@} will still have to deal with the upcoming
+delimiter.
+@item @code{@@}@{@var{literal sequence}@}
+will insert the given sequence
+literally into the executed call of the command.
+@item @code{-}
+will just drop the next token.  It will probably be most
+often used in the true branch of a @code{?} specification.
+@item @code{#}@{@var{argument}@}@{@var{replacement}@}
+is a transformation
+rule that calls a macro with the given argument and replacement
+text on the rest of the argument list.  The replacement is used in
+the executed call of the command.  This can be used for parsing
+arbitrary constructs.  For example, the @code{[]} option could manually
+be implemented with the option string @code{?[@{#@{[#1]@}@{[@{#1@}]@}@}@{@}}.
+PStricks users might enjoy this sort of flexibility.
+@item @code{:}@{@var{argument}@}@{@var{replacement}@}
+is again a
+transformation rule.  As opposed to @code{#}, however, the result of
+the transformation is parsed again.  You'll rarely need this.
+@end table
+
+
+There is a second optional argument in brackets that can be used to
+declare any default action to be taken instead.  This is mostly for
+the sake of macros that influence numbering: you would want to keep
+their effects in that respect.  The default action should use @code{#1}
+for referring to the original (not the patched) command with the
+parsed options appended.  Not specifying a second optional argument
+here is equivalent to specifying@w{ }@code{[#1]}.
+
+@item \PreviewMacro*
+A similar invocation
+@code{\PreviewMacro*} simply throws the macro and all of its
+arguments declared in the manner above away.  This is mostly useful
+for having things like @code{\footnote} not do their magic on their
+arguments.  More often than not, you don't want to declare any
+arguments to scan to @code{\PreviewMacro*} since you would want the
+remaining arguments to be treated as usual text and typeset in that
+manner instead of being thrown away.  An exception might be, say,
+sort keys for @code{\cite}.
+
+A second optional argument in brackets can be used to declare any
+default action to be taken instead.  This is for the sake of macros
+that influence numbering: you would want to keep their effects in
+that respect.  The default action might use @code{#1} for referring to
+the original (not the patched) command with the parsed options
+appended.  Not specifying a second optional argument here is
+equivalent to specifying@w{ }@code{[]} since the command usually gets thrown
+away.
+
+As an example for using this argument, you might want to specify
+
+@example
+\PreviewMacro*\footnote[@{[]@}][#1@{@}]
+@end example
+
+@noindent
+This will replace a footnote by an empty footnote, but taking any
+optional parameter into account, since an optional paramter changes
+the numbering scheme.  That way the real argument for the footnote
+remains for processing by @previewlatex{}.
+
+@item \PreviewEnvironment
+The macro
+@findex \PreviewEnvironment
+@code{\PreviewEnvironment} works just as @code{\PreviewMacro} does,
+only for environments.  @item \PreviewEnvironment*
+And the
+same goes for @code{\PreviewEnvironment*} as compared to
+@code{\PreviewMacro*}.
+
+@item \PreviewSnarfEnvironment
+This macro does not typeset
+the original environment inside of a preview box, but instead
+typesets just the contents of the original environment inside of the
+preview box, leaving nothing for the original environment.  This has
+to be used for figures, for example, since they would
+
+@enumerate
+@item produce insertion material that cannot be extracted to the
+preview properly,
+@item complain with an error message about not being in outer par
+mode.
+@end enumerate
+
+
+@item \PreviewOpen
+@item \PreviewClose
+Those Macros form a matched preview pair.  This is for macros that
+behave similar as @code{\begin} and @code{\end} of an environment.  It
+is essential for the operation of @code{\PreviewOpen} that the macro
+treated with it will open an additional group even when the preview
+falls inside of another preview or inside of a @code{nopreview}
+environment.  Similarly, the macro treated with @code{PreviewClose}
+will close an environment even when inactive.
+
+@item \ifPreview
+In case you need to know whether
+@code{preview} is active, you can use the conditional @code{\ifPreview}
+together with @code{\else} and @code{\fi}.
+
+@end table
diff --git a/packages/auctex/doc/preview-faq.texi b/packages/auctex/doc/preview-faq.texi
new file mode 100644 (file)
index 0000000..7e23b4b
--- /dev/null
@@ -0,0 +1,340 @@
+@c This is part of the preview-latex manual.
+@c Copyright (C) 2002, 2003, 2004, 2005, 2006, 2009 Free Software
+@c   Foundation, Inc.
+@c See file preview-latex.texi for copying conditions.
+@ifset rawfile
+@include macros.texi
+
+@node Frequently Asked Questions, Introduction to FAQ, (dir), (dir)
+@top Frequently Asked Questions about @previewlatex{}
+
+@contents
+
+@end ifset
+
+@menu
+* Introduction to FAQ::         
+* Requirements::                
+* Installation Trouble::        
+* Customization::               
+* Troubleshooting::               
+* Other formats::               
+@end menu
+
+@comment we need at least one chapter, or the numbers disappear in the
+@comment plain version of the FAQ.
+
+@ifset rawfile
+@node Introduction to FAQ, Requirements, Frequently Asked Questions, Frequently Asked Questions
+@chapter Introduction
+@raisesections
+@end ifset
+@ifclear rawfile
+@node Introduction to FAQ, Requirements, Frequently Asked Questions, Frequently Asked Questions
+@section Introduction
+@end ifclear
+
+@subsection How can I contribute to the FAQ?
+
+Send an email with the subject:
+@example
+Preview FAQ
+@end example
+to @email{auctex-devel@@gnu.org}.
+
+@node Requirements, Installation Trouble, Introduction to FAQ, Frequently Asked Questions
+@section Requirements
+
+@subsection Which version of (X)Emacs is needed?
+See also the table at the end of the section.
+
+@previewlatex{} nominally requires @w{GNU Emacs} with a version of at
+least 21.1.  However, @w{Emacs 22} (currently under development) offers
+superior performance and wider platform support, and is even now the
+recommended platform to use.
+
+While recent versions of @w{XEmacs 21.4} are supported, doing this in a
+satisfactory manner has proven to be difficult due to technical
+shortcomings and differing API's which are hard to come by.  If
+@previewlatex{} is an important part of your editing workflow, you are
+likely to get better results and support by switching to Emacs.  Of
+course, you can improve support for your favorite editor by giving
+feedback in case you encounter bugs.
+
+@subsection Which versions of Ghostscript and @AUCTeX{} are needed?
+
+We recommend to use GNU or AFPL Ghostscript with a version of at least
+7.07.
+
+@previewlatex{} has been distributed as part of @AUCTeX{} since version
+11.80.  If your version of @AUCTeX{} is older than that, or if it does
+not contain a working copy of @previewlatex{}, complain to wherever you
+got it from.
+
+@subsection I have trouble with the display format...
+We recommend keeping the variable @code{preview-image-type} set to
+@code{dvipng} (if you have it installed) or @code{png}.  This is the
+default and can be set via the Preview/Customize menu.
+
+All other formats are known to have inconveniences, either in file size
+or quality.  There are some Emacs versions around not supporting
+@acronym{PNG}; the proper way to deal with that is to complain to your
+Emacs provider.  Short of that, checking out @acronym{PNM} or
+@acronym{JPEG} formats might be a good way to find out whether the lack
+of @acronym{PNG} format support might be the only problem with your
+Emacs.
+
+@subsection For which OS does preview work?
+
+It is known to work under the X Window System for Linux and for several
+flavors of Unix: we have reports for HP and Solaris.
+
+There are several development versions of Emacs around for native MacOS
+Carbon, and @previewlatex{} is working with them, too.
+
+With Windows, Cygwin and native ports of XEmacs should work.
+@previewlatex{} will not work with any native version 21 of Emacs under
+Windows: you need to get a hold of @w{Emacs 22} which is at the time of
+this writing not released but available as a developer snapshot.
+
+The entry "X11/Unix" currently means Linux, Solaris or HP/UX, as well as
+the X-specific version for Mac/OSX.
+
+@multitable {Win9x native} {Emacs version} {XEmacs version}
+@item OS @tab Emacs version @tab XEmacs version
+@item X11/Unix @tab 21.1 @tab 21.4.9
+@item Win9x cygwin @tab 21.3.50? @tab 21.4.8
+@item Win9x native @tab 22.1 @tab 21.4.8
+@item MacOSX native @tab 22.1 @tab --
+@end multitable
+
+@node Installation Trouble, Customization, Requirements, Frequently Asked Questions
+@section Installation Trouble
+
+@subsection I just get @samp{LaTeX found no preview images}.
+
+The reason for this is that @LaTeX{} found no preview images in the
+document in question.
+
+One reason might be that there are no previews to be seen.  If you have
+not used @previewlatex{} before, you might not know its manner of
+operation.  One sure-fire way to test if you just have a document where
+no previews are to be found is to use the provided example document
+@file{circ.tex} (you will have to copy it to some directory where you
+have write permissions).  If the symptom persists, you have a problem,
+and the problem is most likely a @LaTeX{} problem.  Here are possible
+reasons:
+
+@table @asis
+
+@item Filename database not updated
+Various @TeX{} distributions have their own ways of knowing where the
+files are without actually searching directories.  The normal
+@previewlatex{} installation should detect common tools for that purpose
+and use them.  If this goes wrong, or if the files get installed into a
+place where they are not looked for, the @LaTeX{} run will fail.
+
+@item An incomplete manual installation
+This should not happen if you followed installation instructions.
+Unfortunately, people know better all the time.  If only
+@file{preview.sty} gets installed without a set of supplementary files
+also in the @file{latex} subdirectory, @previewlatex{} runs will not
+generate any errors, but they will not produce any previews, either.
+
+@item An outdated @file{preview} installation
+The @file{preview.sty} package is useful for more than just
+@previewlatex{}.  For example, it is part of @TeX{}live.  So you have
+to make sure that @previewlatex{} does not get to work with outdated
+style and configuration files: some newer features will not work with
+older @TeX{} style files, and really old files will make
+@previewlatex{} fail completely.  There usual is a local @file{texmf}
+tree, or even a user-specific tree that are searched before the default
+tree.  Make sure that the first version of those files that gets found
+is the correct one.
+@end table
+
+@subsection I have problems with the XEmacs installation
+Please note that the XEmacs installation is different, since XEmacs has
+a package system that gets used here.  Please make sure that you read
+and follow the installation instructions for XEmacs.
+
+@node Customization, Troubleshooting, Installation Trouble, Frequently Asked Questions
+@section Customization
+
+@subsection Why don't I get balloon help like in the screen shots?
+
+Some users have reported problems with their XEmacs version, so balloon
+help is no longer switched on by default.  Use the Preview/Customize
+menu or @kbd{@key{M-x} customize-variable} in order to customize
+@code{preview-use-balloon-help} to `On'.  This only concerns XEmacs:
+tooltips under @w{GNU Emacs} are enabled by default and unproblematic.
+
+@subsection How to include additional environments like @code{enumerate}
+
+By default, @previewlatex{} is intended mainly for displaying
+mathematical formulas, so environments like @code{enumerate} or
+@code{tabular} (except where contained in a float) are not included.
+You can include them however manually by adding the lines:
+
+@example
+\usepackage[displaymath,textmath,sections,graphics,floats]@{preview@}
+\PreviewEnvironment@{enumerate@}
+@end example
+
+in your document header, that is before 
+
+@example
+\begin@{document@}
+@end example
+@noindent
+In general, @file{preview} should be loaded as the last thing before
+the start of document.
+
+Be aware that
+
+@example
+\PreviewEnvironment@{...@}
+@end example
+
+does not accept a comma separated
+list!  Also note that by putting more and more 
+
+@example
+\PreviewEnvironment@{...@}
+@end example
+
+in your document, it will look more and more like a @acronym{DVI} file
+preview when running @previewlatex{}.  Since each preview is treated as
+one large monolithic block by Emacs, one should really restrict
+previews to those elements where the improvement in visual
+representation more than makes up for the decreased editability.
+
+@subsection What if I don't want to change the document?
+The easiest way is to generate a configuration file in the current
+directory.  You can basically either create @file{prdefault.cfg} which
+is used for any use of the @samp{preview} package, or you can use
+@file{prauctex.cfg} which only applies to the use from with Emacs.  Let
+us assume you use the latter.  In that case you should write something like
+
+@example
+\InputIfFileExists@{preview/prauctex.cfg@}@{@}@{@}
+\PreviewEnvironment@{enumerate@}
+@end example
+
+in it.  The first line inputs the system-wide default configuration
+(the file name should match that, but not your own
+@file{prauctex.cfg}), then you add your own stuff.
+
+@subsection Suddenly I get gazillions of ridiculous pages?!?
+
+When @previewlatex{} works on extracting its stuff, it typesets each
+single preview on a page of its own.  This only happens when actual
+previews get generated.  Now if you want to configure @previewlatex{} in
+your document, you need to add your own @code{\usepackage} call to
+@samp{preview} so that it will be able to interpret its various
+definition commands.  It is an error to add the @code{active} option to
+this invocation: you don't want the package to be active unless
+@previewlatex{} itself enables the previewing operation (which it will).
+
+@subsection Does @previewlatex{} work with presentation classes?
+
+@previewlatex{} should work with most presentation classes.  However,
+since those classes often have macros or pseudo environments
+encompassing a complete slide, you will need to use the customization
+facilities of @file{preview.sty} to tell it how to resolve this, whether
+you want no previews, previews of whole slides or previews of inner
+material.
+
+@node Troubleshooting, Other formats, Customization, Frequently Asked Questions
+@section Troubleshooting
+
+@subsection Preview causes all sort of strange error messages
+
+When running @previewlatex{} and taking a look at either log file or
+terminal output, lots of messages like
+
+@example
+! Preview: Snippet 3 started.
+<-><->
+      
+l.52 \item Sie lassen sich als Funktion $
+                                         y = f(x)$ darstellen.
+! Preview: Snippet 3 ended.(491520+163840x2494310).
+<-><->
+      
+l.52 \item Sie lassen sich als Funktion $y = f(x)$
+                                                   darstellen.
+@end example
+
+appear (previous versions generated messages looking even more like
+errors).  Those are not real errors (as will be noted in the log
+file).  Or rather, while they @strong{are} really @TeX{} error
+messages, they are intentional.  This currently is the only reliable
+way to pass the information from the @LaTeX{} run of @previewlatex{} to
+its Emacs part about where the previews originated in the source text.
+Since they are actual errors, you will also get @AUCTeX{} to state
+@example
+Preview-LaTeX exited as expected with code 1 at Wed Sep  4 17:03:30
+@end example
+after the @LaTeX{} run in the run buffer.  This merely indicates that
+errors were present, and errors will always be present when
+@previewlatex{} is operating.  There might be also real errors, so in
+case of doubt, look for them explicitly in either run buffer or the
+resulting @file{.log} file.
+
+@subsection Why do my @acronym{DVI} and @acronym{PDF} output files vanish?
+
+In order to produce the preview images @previewlatex{} runs @LaTeX{} on
+the master or region file.  The resulting @acronym{DVI} or @acronym{PDF}
+file can happen to have the same name as the output file of a regular
+@LaTeX{} run.  So the regular output file gets overwritten and is
+subsequently deleted by @previewlatex{}.
+
+@subsection My output file suddenly only contains preview images?!
+
+As mentioned in the previews @acronym{FAQ} entry, @previewlatex{} might
+use the file name of the original output file for the creation of
+preview images.  If the original output file is being displayed with a
+viewer when this happens, you might see strange effects depending on the
+viewer, e.g. a message about the file being corrupted or the display of
+all the preview images instead of your typeset document.  (Also
+@xref{Customization}.)
+
+
+@node Other formats, , Troubleshooting, Frequently Asked Questions
+@section @previewlatex{} when not using @LaTeX{}
+
+@subsection Does @previewlatex{} work with  PDF@LaTeX{}?
+
+Yes, as long as you use @AUCTeX{}'s own PDF@LaTeX{} mode and have not
+messed with @samp{TeX-command-list}.
+
+@subsection Does @previewlatex{} work with @samp{elatex}?
+
+No problem here.  If you configure your @AUCTeX{} to use @samp{elatex},
+or simply have @samp{latex} point to @samp{elatex}, this will work fine.
+Modern @TeX{} distributions use e@TeX{} for @LaTeX{}, anyway.
+
+@subsection Does @previewlatex{} work with @ConTeXt{}?
+
+In short, no.  The @samp{preview} package is
+@LaTeX{}-dependent.  Adding support for other formats requires
+volunteers.
+
+@subsection Does @previewlatex{} work with plain TeX?
+
+Again, no.  Restructuring the @samp{preview} package for @samp{plain}
+operation would be required.  Volunteers welcome.
+
+In some cases you might get around by making a wrapper pseudo-Master
+file looking like the following:
+
+@example
+\documentclass@{article@}
+\usepackage@{plain@}
+\begin@{document@}
+\begin@{plain@}
+\input myplainfile
+\end@{plain@}
+\end@{document@}
+@end example
diff --git a/packages/auctex/doc/preview-latex.texi b/packages/auctex/doc/preview-latex.texi
new file mode 100644 (file)
index 0000000..35085be
--- /dev/null
@@ -0,0 +1,840 @@
+\input texinfo
+@comment %**start of header
+@setfilename preview-latex.info
+@include version.texi
+@settitle preview-latex @value{VERSION}
+@comment %**end of header
+@include macros.texi
+@copying
+This manual is for preview-latex, a @LaTeX{} preview mode for @AUCTeX{}
+(version @value{VERSION} from @value{UPDATED}).
+
+Copyright @copyright{} 2001, 2002, 2003,
+2004, 2005, 2006 Free Software Foundation, Inc.
+
+@quotation
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, no Front-Cover Texts and no Back-Cover Texts.  A
+copy of the license is included in the section entitled ``GNU Free
+Documentation License.''
+@end quotation
+@end copying
+
+@dircategory Emacs
+@direntry
+* preview-latex: (preview-latex).       Preview LaTeX fragments in Emacs
+@end direntry
+@dircategory TeX
+@direntry
+* preview-latex: (preview-latex).       Preview LaTeX fragments in Emacs
+@end direntry
+@c footnotestyle separate
+@c paragraphindent 2
+@syncodeindex vr cp
+@syncodeindex ky cp
+@syncodeindex fn cp
+
+@iftex
+@tolerance 10000 @emergencystretch 3em
+@end iftex
+
+@finalout
+@titlepage
+@title @previewlatex{}
+@subtitle A @LaTeX{} preview mode for @AUCTeX{} in Emacs.
+@subtitle Version @value{VERSION}, @value{UPDATED}
+@author Jan-@AA{}ke Larsson
+@author David Kastrup and others
+@page
+@vskip 0pt plus 1filll
+@insertcopying
+@end titlepage
+
+@c @summarycontents
+@contents
+
+@c Use @ifinfo _and_ @ifhtml here because Texinfo 3 cannot cope with
+@c @ifnottex around a top node.
+@ifinfo
+@node top, , (dir), (dir)
+@top @previewlatex{}
+
+This manual may be copied under the conditions spelled out in
+@ref{Copying this Manual}.
+
+@end ifinfo
+@ifhtml
+@node top, Copying, (dir), (dir)
+@top @previewlatex{}
+@insertcopying
+@end ifhtml
+
+@contents
+
+@iftex
+@unnumbered @previewlatex{}
+@end iftex
+@previewlatex{} is a package embedding preview fragments into Emacs
+source buffers under the @AUCTeX{} editing environment for @LaTeX{}.  It
+uses @file{preview.sty} for the extraction of certain environments (most
+notably displayed formulas).  Other applications of this style file are
+possible and exist.
+
+The name of the package is really @samp{preview-latex}, all in
+lowercase letters, with a hyphen.  If you typeset it, you can use a
+sans-serif font to visually offset it.
+
+@menu
+* Copying::                     Copying
+* Introduction::                Getting started.
+* Installation::                Make Install.
+* Keys and lisp::               Key bindings and user-level lisp functions.
+* Simple customization::        To make it fit in.
+* Known problems::              When things go wrong.
+* For advanced users::          Internals and more customizations.
+* ToDo::                        Future development.
+* Frequently Asked Questions::  All about @previewlatex{}
+* Copying this Manual::         GNU Free Documentation License
+* Index::                       A menu of many topics.             
+@end menu
+
+@node Copying, Introduction, top, top
+@unnumbered Copying
+@cindex Copying
+@cindex Copyright
+@cindex GPL
+@cindex General Public License
+@cindex License
+@cindex Free
+@cindex Free software
+@cindex Distribution
+@cindex Right
+@cindex Warranty
+
+For the conditions for copying parts of @previewlatex{}, see the General
+Public Licenses referres to in the copyright notices of the files, the
+General Public Licenses accompanying them and the explanatory section in
+@ref{Copying,,,auctex,the @AUCTeX{} manual}.
+
+This manual specifically is covered by the GNU Free Documentation
+License (@pxref{Copying this Manual}).
+
+@node Introduction, Installation, Copying, top
+@c Used as @file{README} as well: in separate file
+@chapter Introduction
+@include preview-readme.texi
+
+@node Installation, Keys and lisp, Introduction, top
+@chapter Installation
+Installation is now being covered in
+@ref{Installation,,,auctex,the @AUCTeX{} manual}.
+
+@node Keys and lisp, Simple customization, Installation, top
+@chapter Key bindings and user-level lisp functions 
+
+@cindex Menu entries
+@previewlatex{} adds key bindings starting with @kbd{C-c C-p} to the
+supported modes of @AUCTeX{} (@inforef{Key Index,,auctex}).  It will
+also add its own @samp{Preview} menu in the menu bar, as well as an icon
+in the toolbar.
+
+The following only describes the interactive use: view the documentation
+strings with @kbd{C-h f} if you need the Lisp information.
+
+@table @w
+@item @kbd{C-c C-p C-p}
+@itemx @code{preview-at-point}
+@itemx Preview/Generate previews (or toggle) at point
+If the cursor is positioned on or inside of a preview area, this
+toggles its visibility, regenerating the preview if necessary. If not,
+it will run the surroundings through preview. The surroundings include
+all areas up to the next valid preview, unless invalid previews occur
+before, in which case the area will include the last such preview in
+either direction.  And overriding any other
+action, if a region is active (@code{transient-mark-mode} or
+@code{zmacs-regions}), it is run through @code{preview-region}.
+@kindex @kbd{C-c C-p C-p}
+@findex preview-at-point
+
+@item @kbd{<mouse-2>}
+The middle mouse button has a similar action bound to it as
+@code{preview-at-point}, only that it knows which preview to apply it to
+according to the position of the click.  You can click either anywhere
+on a previewed image, or when the preview is opened and showing the
+source text, you can click on the icon preceding the source text.  In
+other areas, the usual mouse key action (typically: paste) is not
+affected.
+
+@item @kbd{<mouse-3>}
+The right mouse key pops up a context menu with several options:
+toggling the preview, regenerating it, removing it (leaving the
+unpreviewed text), copying the text inside of the preview, and copying
+it in a form suitable for copying as an image into a mail or news
+article.  This is a one-image variant of the following command:
+
+@item @kbd{C-c C-p C-w}
+@itemx @code{preview-copy-region-as-mml}
+@itemx Copy a region as MML
+@kindex @kbd{C-c C-p C-w}
+@findex preview-copy-region-as-mml
+This command is also available as a variant in the context menu on the
+right mouse button (where the region is the preview that has been
+clicked on).  It copies the current region into the kill buffer in a
+form suitable for copying as a text including images into a mail or news
+article using mml-mode (@pxref{Composing,,Composing,emacs-mime,Emacs
+MIME}).
+
+If you regenerate or otherwise kill the preview in its source buffer
+before the mail or news gets posted, this will fail.  Also you should
+generate images you want to send with @code{preview-transparent-border}
+@vindex preview-transparent-border
+set to @code{nil}, or the images will have an ugly border.
+@previewlatex{} detects this condition and asks whether to regenerate
+the region with borders switched off.  As this is an asynchronous
+operation running in the background, you'll need to call this command
+explicitly again to get the newly generated images into the kill ring.
+
+Preview your articles with @code{mml-preview} (on @kbd{M-m P}, or
+@kbd{C-c C-m P} in @w{Emacs 22})
+@kindex @kbd{M-m P}
+@kindex @kbd{C-c C-m P}
+to make sure they look fine.
+
+@item @kbd{C-c C-p C-e}
+@itemx @code{preview-environment}
+@itemx Preview/Generate previews for environment
+Run preview on @LaTeX{} environment.  The environments in
+@code{preview-inner-environments} are treated as inner levels so that
+for instance, the @code{split} environment in
+@code{\begin@{equation@}\begin@{split@}@dots{}\end@{split@}\end@{equation@}}
+is properly displayed.  If called with a numeric argument, the
+corresponding number of outward nested environments is treated as inner
+levels.
+@kindex @kbd{C-c C-p C-e}
+@findex preview-environment
+
+@item @kbd{C-c C-p C-s}
+@itemx @code{preview-section} 
+@itemx Preview/Generate previews for section
+Run preview on this @LaTeX{} section.
+@kindex @kbd{C-c C-p C-s}
+@findex preview-section
+
+@item @kbd{C-c C-p C-r}
+@itemx @code{preview-region}
+@itemx Preview/Generate previews for region
+Run preview on current region.
+@kindex @kbd{C-c C-p C-r}
+@findex preview-region
+
+@item @kbd{C-c C-p C-b}
+@itemx @code{preview-buffer} 
+@itemx Preview/Generate previews for buffer
+Run preview on the current buffer.
+@kindex @kbd{C-c C-p C-b}
+@findex preview-buffer
+
+@item @kbd{C-c C-p C-d}
+@itemx @code{preview-document} 
+@itemx Preview/Generate previews for document
+Run preview on the current document.
+@kindex @kbd{C-c C-p C-d}
+@findex preview-document
+
+@item @kbd{C-c C-p C-c C-p}
+@itemx @code{preview-clearout-at-point}
+@itemx Preview/Remove previews at point
+@kindex @kbd{C-c C-p C-c C-p}
+@findex preview-clearout-at-point
+Clear out (remove) the previews that are immediately adjacent to point.
+
+@item @kbd{C-c C-p C-c C-s}
+@itemx @code{preview-clearout-section}
+@itemx Preview/Remove previews from section
+@kindex @kbd{C-c C-p C-c C-s}
+@findex preview-clearout-document
+Clear out all previews in current section.
+
+@item @kbd{C-c C-p C-c C-r}
+@itemx @code{preview-clearout}
+@itemx Preview/Remove previews from region
+@kindex @kbd{C-c C-p C-c C-r}
+@findex preview-clearout
+Clear out all previews in the current region.
+
+@item @kbd{C-c C-p C-c C-b}
+@itemx @code{preview-clearout-buffer}
+@itemx Preview/Remove previews from buffer
+@kindex @kbd{C-c C-p C-c C-b}
+@findex preview-clearout-buffer
+Clear out all previews in current buffer. This makes the current buffer
+lose all previews.
+
+@item @kbd{C-c C-p C-c C-d}
+@itemx @code{preview-clearout-document}
+@itemx Preview/Remove previews from document
+@kindex @kbd{C-c C-p C-c C-d}
+@findex preview-clearout-document
+Clear out all previews in current document.  The document consists of
+all buffers that have the same master file as the current buffer.  This
+makes the current document lose all previews.
+
+@item @kbd{C-c C-p C-f}
+@itemx @code{preview-cache-preamble}
+@itemx Preview/Turn preamble cache on
+@kindex @kbd{C-c C-p C-f}
+@findex preview-cache-preamble
+Dump a pregenerated format file.  For the rest of the session, this file
+is used when running on the same master file.  Use this if you know your
+@LaTeX{} takes a long time to start up, the speedup will be most
+noticeable when generating single or few previews.  If you change your
+preamble, do this again.  @previewlatex{} will try to detect the
+necessity of that automatically when editing changes to the preamble are
+done from within Emacs, but it will not notice if the preamble
+effectively changes because some included file or style file is
+tampered with.
+
+@item @kbd{C-c C-p C-c C-f}
+@itemx @code{preview-cache-preamble-off}
+@itemx Preview/Turn preamble cache off
+@kindex @kbd{C-u C-c C-p C-f}
+@findex preview-cache-preamble-off
+Clear the pregenerated format file and stop using preambles for the
+current document. If the caching gives you problems, use this.
+
+@item @kbd{C-c C-p C-i}
+@itemx @code{preview-goto-info-page}
+@itemx Preview/Read Documentation
+@kindex @kbd{C-c C-p C-i}
+@findex preview-goto-info-page
+Read
+@ifinfo
+this
+@end ifinfo 
+@ifnotinfo
+the
+@end ifnotinfo
+info manual.
+
+@item @kbd{M-x preview-report-bug @key{RET}}
+@itemx @code{preview-report-bug}
+@itemx Preview/Report Bug
+@kindex @kbd{M-x preview-report-bug @key{RET}}
+@findex preview-report-bug
+@cindex Report a bug
+This is the preferred way of reporting bugs as it will fill in what
+version of @previewlatex{} you are using as well as versions of
+relevant other software, and also some of the more important
+settings. Please use this method of reporting, if at all possible and
+before reporting a bug, have a look at @ref{Known problems}.
+
+@item @kbd{C-c C-k}
+@itemx LaTeX/TeX Output/Kill Job
+@kindex @kbd{C-c C-k}
+@cindex Kill preview-generating process
+Kills the preview-generating process. This is really an @AUCTeX{}
+keybinding, but it is included here as a hint. If you are generating
+a preview and then make a change to the buffer, @previewlatex{} may be
+confused and place the previews wrong.
+@end table
+
+@node Simple customization, Known problems, Keys and lisp, top
+@chapter Simple customization
+
+Customization options can be found by typing @kbd{M-x customize-group
+@key{RET} preview @key{RET}}. Remember to set the option when you have
+changed it. The list of suggestions can be made very long (and is
+covered in detail in @ref{For advanced users}), but some are:
+
+@itemize @bullet
+@item Change the color of the preview background
+
+If you use a non-white background in Emacs, you might have color
+artifacts at the edges of your previews.  Playing around with the option
+@code{preview-transparent-color} in the @code{Preview Appearance} group
+might improve things.  With some settings, the cursor may cover the
+whole background of a preview, however.
+
+This option is specific to the display engine in use.  Its default is
+different in @w{Emacs 21} and @w{Emacs 22}, and it is not available in
+XEmacs.
+
+@item Showing @code{\label}s
+@cindex Showing @code{\label}s
+
+When using @previewlatex{}, the @code{\label}s are hidden by the
+previews.  It is possible to make them visible in the output
+by using the @LaTeX{} package @code{showkeys} alternatively
+@code{showlabels}.  However, the boxes of these labels will be outside
+the region @previewlatex{} considers as the preview image.  To enable a
+similar mechanism internal to @previewlatex{}, enable the
+@code{showlabels} option in the variable
+@code{preview-default-option-list} in the @code{Preview Latex} group.
+
+It must be noted, however, that a much better idea may be to use the
+Ref@TeX{} package for managing references.  @xref{RefTeX in a
+Nutshell,,RefTeX in a Nutshell,reftex,The Ref@TeX{} Manual}.
+
+@item Open previews automatically
+
+The current default is to open previews automatically when you enter
+them with cursor left/right motions.  Auto-opened previews will close
+again once the cursor leaves them again (this is also done when doing
+incremental search, or query-replace operations), unless you changed
+anything in it.  In that case, you will have to regenerate the preview
+(via e.g., @kbd{C-c C-p C-p}).  Other options for
+@code{preview-auto-reveal} are available via @code{customize}.
+
+@item Automatically cache preambles
+
+Currently @previewlatex{} asks you whether you want to cache the
+document preamble (everything before @code{\begin@{document@}}) before
+it generates previews for a buffer the first time.  Caching the preamble
+will significantly speed up regeneration of previews.  The larger your
+preamble is, the more this will be apparent.  Once a preamble is cached,
+@previewlatex{} will try to keep track of when it is changed, and dump
+a fresh format in that case.  If you experience problems with this, or
+if you want it to happen without asking you the first time, you can
+customize the variable @code{preview-auto-cache-preamble}.
+@vindex preview-auto-cache-preamble
+@cindex Caching a preamble
+
+@item Attempt to keep counters accurate when editing
+
+@vindex preview-preserve-counters
+@vindex preview-required-option-list
+Since @previewlatex{} frequently runs only small regions through
+@LaTeX{}, values like equation counters are not consistent from run to
+run.  If this bothers you, customize the variable
+@code{preview-preserve-counters} to @code{t} (this is consulted by
+@code{preview-required-option-list}).  @LaTeX{} will then output a load
+of counter information during compilation, and this information will be
+used on subsequent updates to keep counters set to useful values.  The
+additional information takes additional time to analyze, but this is
+relevant mostly only when you are regenerating all previews at once, and
+maybe you will be less tempted to do so when counters appear more or
+less correct.
+
+@item Preview your favourite @LaTeX{} constructs
+
+If you have a certain macro or environment that you want to preview,
+first check if it can be chosen by cutomizing
+@code{preview-default-options-list} in the @code{Preview Latex} group.
+
+If it is not available there, you can add it to
+@code{preview-default-preamble} also in the @code{Preview Latex} group,
+by adding a @code{\PreviewMacro} or @code{\PreviewEnvironment} entry
+(@pxref{Provided commands}) @emph{after} the @code{\RequirePackage}
+line.  For example, if you want to preview the @code{center}
+environment, press the @key{Show} button and the last @key{INS} button,
+then add
+
+@example
+\PreviewEnvironment@{center@}
+@end example
+@noindent
+in the space that just opened.  Note that since @code{center} is a
+generic formatting construct of @LaTeX{}, a general configuration like
+that is not quite prudent.  You better to do this on a per-document
+base so that it is easy to disable this behavior when you find this
+particular entry gives you trouble.
+
+One possibility is to save such settings in the corresponding file-local
+variable instead of your global configuration (@pxref{File
+Variables,,Local Variables in Files,emacs,GNU Emacs Manual}).  A perhaps
+more convenient place for such options would be in a configuration file
+in the same directory with your project (@pxref{Package options}).
+
+The usual file for @previewlatex{} preconfiguration is
+@file{prauctex.cfg}.  If you also want to keep the systemwide defaults,
+you should add a line
+
+@example
+\InputIfFileExists@{preview/prauctex.cfg@}@{@}@{@}
+@end example
+@noindent
+to your own version of @file{prauctex.cfg} (this is assuming that
+global files relating to the @code{preview} package are installed in a
+subdirectory @file{preview}, the default behavior).
+
+@item Don't preview inline math
+@cindex Inline math
+
+If you have performance problems because your document is full of inline
+math (@code{$@dots{}$}), or if your usage of @code{$} conflicts with
+@previewlatex{}'s, you can turn off inline math previews. In the
+@code{Preview Latex} group, remove @code{textmath} from
+@code{preview-default-option-list} by customizing this variable.
+@end itemize
+
+@node Known problems, For advanced users, Simple customization, top
+@chapter Known problems
+@c also used as PROBLEMS file
+@include preview-problems.texi
+
+@node For advanced users, ToDo, Known problems, top
+@chapter For advanced users
+
+This package consists of two parts: a @LaTeX{} style that splits the
+output into appropriate parts with one preview object on each page, and
+an Emacs-lisp part integrating the thing into Emacs (aided by
+@AUCTeX{}).
+
+@menu
+* The LaTeX style file::        
+* The Emacs interface::         
+* The preview images::             
+* Misplaced previews::          
+@end menu
+
+@node The LaTeX style file, The Emacs interface, For advanced users, For advanced users
+@section The @LaTeX{} style file
+@c Autogenerated from ../preview.dtx
+@include preview-dtxdoc.texi
+
+@node The Emacs interface, The preview images, The LaTeX style file, For advanced users
+@section The Emacs interface
+
+You can use @kbd{M-x customize-group @key{RET} preview-latex @key{RET}}
+in order to customize these variables, or use the menus for it.  We
+explain the various available options together with explaining how they
+work together in making @previewlatex{} work as intended.
+
+@vtable @code
+@item preview-LaTeX-command
+When you generate previews on a buffer or a region, the command in
+@code{preview-LaTeX-command} gets run (that variable should only be
+changed with Customize since its structure is somewhat peculiar, though
+expressive).  As usual with @AUCTeX{}, you can continue working while
+this is going on.  It is not a good idea to change the file until after
+@previewlatex{} has established where to place the previews which it can
+only do after the @LaTeX{} run completes.  This run produces a host of
+pseudo-error messages that get parsed by @previewlatex{} at the end of
+the @LaTeX{} run and give it the necessary information about where in
+the source file the @LaTeX{} code for the various previews is located
+exactly. The parsing takes a moment and will render Emacs busy.
+
+@item preview-LaTeX-command-replacements
+This variable specifies transformations to be used before calling the
+configured command.  One possibility is to have @samp{\pdfoutput=0 }
+appended to every command starting with @samp{pdf}.  This particular
+setting is available as the shortcut
+@samp{preview-LaTeX-disable-pdfoutput}.  Since @previewlatex{} can work
+with @acronym{PDF} files by now, there is little incentive for using
+this option, anymore (for projects not requiring @acronym{PDF} output,
+the added speed of @samp{dvipng} might make this somewhat attractive).
+
+@item preview-required-option-list
+@code{preview-LaTeX-command} uses @code{preview-required-option-list} in
+order to pass options such as @option{auctex}, @option{active} and
+@option{dvips} to the @file{preview} package.  This means that the user
+need (and should) not supply these in the document itself in case he
+wants to be able to still compile his document without it turning into
+an incoherent mass of little pictures.  These options even get passed
+in when the user loads @file{preview} explicitly in his document.
+
+The default includes an option @code{counters} that is controlled by the
+boolean variable
+
+@item preview-preserve-counters
+This option will cause the @file{preview} package to emit information
+that will assist in keeping things like equation counters and section
+numbers reasonably correct even when you are regenerating only single
+previews.
+
+@item preview-default-option-list
+@itemx preview-default-preamble
+If the document does not call in the package @code{preview} itself (via
+@code{\usepackage}) in the preamble, the preview package is loaded using
+default options from @code{preview-default-option-list} and additional
+commands specified in @code{preview-default-preamble}.
+
+@item preview-fast-conversion
+This is relevant only for @acronym{DVI} mode.  It defaults to `On' and
+results in the whole document being processed as one large PostScript
+file from which the single images are extracted with the help of parsing
+the PostScript for use of so-called @acronym{DSC} comments.  The
+bounding boxes are extracted with the help of @TeX{} instead of getting
+them from Dvips.  If you are experiencing bounding box problems, try
+setting this option to `Off'.
+
+@item preview-prefer-TeX-bb
+If this option is `On', it tells @previewlatex{} never to try to extract
+bounding boxes from the bounding box comments of @acronym{EPS} files,
+but rather rely on the boxes it gets from @TeX{}.  If you activated
+@code{preview-fast-conversion}, this is done, anyhow, since there are no
+@acronym{EPS} files from which to read this information.  The option
+defaults to `Off', simply because about the only conceivable reason to
+switch off @code{preview-fast-conversion} would be that you have some
+bounding box problem and want to get Dvips' angle on that matter.
+
+@item preview-scale-function
+@itemx preview-reference-face
+@itemx preview-document-pt-list
+@itemx preview-default-document-pt
+@code{preview-scale-function} determines by what factor
+images should be scaled when appearing on the screen.  If you specify a
+numerical value here, the physical size on the screen will be that of
+the original paper output scaled by the specified factor, at least if
+Emacs' information about screen size and resolution are correct.  The
+default is to let @code{preview-scale-from-face} determine the scale
+function.  This function determines the scale factor by making the
+size of the default font in the document match that of the on-screen
+fonts.
+
+The size of the screen fonts is deduced from the font
+@code{preview-reference-face} (usually the default face used for
+display), the size of the default font for the document is determined
+by calling @code{preview-document-pt}.
+@findex preview-document-pt
+This function consults the members of @code{preview-document-pt-list} in
+turn until it gets the desired information.  The default consults first
+@code{preview-parsed-font-size},
+@vindex preview-parsed-font-size
+then calls @code{preview-auctex-font-size}
+@findex preview-auctex-font-size
+which asks @AUCTeX{} about any size specification like @option{12pt} to
+the documentclass that it might have detected when parsing the document, and
+finally reverts to just assuming @code{preview-default-document-pt} as
+the size used in the document (defaulting to 10pt).
+
+If you find that the size of previews and the other Emacs display
+clashes, something goes wrong.  @code{preview-parsed-font-size} is
+determined at @code{\begin@{document@}} time; if the default font size
+changes after that, it will not get reported.  If you have an outdated
+version of @file{preview.sty} in your path, the size might not be
+reported at all.  If in this case @AUCTeX{} is unable to find a size
+specification, and if you are using a document class with a different
+default value (like KomaScript), the default fallback assumption will
+probably be wrong and @previewlatex{} will scale up things too large.
+So better specify those size options even when you know that @LaTeX{}
+does not need them: @previewlatex{} might benefit from them.  Another
+possibility for error is that you have not enabled @AUCTeX{}'s document
+parsing options.  The fallback method of asking @AUCTeX{} about the size
+might be disabled in future versions of @previewlatex{} since in
+general it is more reliable to get this information from the @LaTeX{}
+run itself.
+
+@item preview-fast-dvips-command
+@itemx preview-dvips-command
+The regular command for turning a @acronym{DVI} file into a single
+PostScript file is @code{preview-fast-dvips-command}, while
+@code{preview-dvips-command} is used for cranking out a @acronym{DVI}
+file where every preview is in a separate @acronym{EPS} file.  Which of
+the two commands gets used depends on the setting of
+@code{preview-fast-conversion}.  The printer specified here by default
+is @option{-Pwww} by default, which will usually get you scalable fonts
+where available. If you are experiencing problems, you might want to try
+playing around with Dvips options (@inforef{Command-line options,,dvips}).
+
+The conversion of the previews into PostScript or @acronym{EPS} files
+gets started after the @LaTeX{} run completes when Emacs recognizes the
+first image while parsing the error messages.  When Emacs has finished
+parsing the error messages, it activates all detected previews.  This
+entails throwing away any previous previews covering the same areas, and
+then replacing the text in its visual appearance by a placeholder
+looking like a roadworks sign.
+
+@item preview-nonready-icon-specs
+This is the roadworks sign displayed while previews are being prepared.
+You may want to customize the font sizes at which @previewlatex{}
+switches over between different icon sizes, and the ascent ratio which
+determines how high above the base line the icon gets placed.
+
+@item preview-error-icon-specs
+@itemx preview-icon-specs
+Those are icons placed before the source code of an opened preview and,
+respectively, the image specs to be used for PostScript errors, and a
+normal open preview in text representation.
+
+@item preview-inner-environments
+This is a list of environments that are regarded as inner levels of an
+outer environment when doing @code{preview-environment}. One example
+when this is needed is in
+@code{\begin@{equation@}\begin@{split@}@dots{}\end@{split@}\end@{equation@}}, and
+accordingly @code{split} is one entry in
+@code{preview-inner-environments}.
+
+@item preview-use-balloon-help
+If you turn this XEmacs-only option `on', then moving the mouse over
+previews and icons will show appropriate help texts.  This works by
+switching on @code{balloon-help-mode} in the buffer if it is not already
+enabled.  The default now is `off' since some users reported problems
+with their version of XEmacs.  @w{GNU Emacs} has its corresponding
+@code{tooltip-mode} enabled by default and in usable condition.
+
+@end vtable
+
+@node The preview images, Misplaced previews, The Emacs interface, For advanced users
+@section The preview images
+
+@vtable @code
+@item preview-image-type
+@itemx preview-image-creators
+@itemx preview-gs-image-type-alist
+What happens when @LaTeX{} is finished depends on the configuration of
+@code{preview-image-type}.  What to do for each of the various settings
+is specified in the variable @code{preview-image-creators}.  The options
+to pass into Ghostscript and what Emacs image type to use is specified
+in @code{preview-gs-image-type-alist}.
+
+@code{preview-image-type} defaults to @code{png}.  For this to work,
+your version of Ghostscript needs to support the @option{png16m} device.
+If you are experiencing problems here, you might want to reconfigure
+@code{gs-image-type-alist} or @code{preview-image-type}.  Reconfiguring
+@code{preview-image-creators} is only necessary for adding additional
+image types.
+
+Most devices make @previewlatex{} start up a single Ghostscript process
+for the entire preview run (as opposed to one per image) and feed it
+either sections of a @acronym{PDF} file (if PDF@LaTeX{} was used), or
+(after running Dvips) sections of a single PostScript file or separate
+@acronym{EPS} files in sequence for conversion into @acronym{PNG} format
+which can be displayed much faster by Emacs.  Actually, not in sequence
+but backwards since you are most likely editing at the end of the
+document.  And as an added convenience, any preview that happens to be
+on-screen is given higher priority so that @previewlatex{} will first
+cater for the images that are displayed. There are various options
+customizable concerning aspects of that operation, see the customization
+group @code{Preview Gs} for this.
+
+Another noteworthy setting of @code{preview-image-type} is
+@samp{dvipng}: in this case, the @samp{dvipng}@pindex{dvipng} program
+will get run on @acronym{DVI} output (see below for @acronym{PDF}).
+This is in general much faster than Dvips and Ghostscript.  In that
+case, the option
+
+@item preview-dvipng-command
+will get run for doing the conversion, and it is expected that
+
+@item preview-dvipng-image-type
+images get produced (@samp{dvipng} might be configured for other image
+types as well).  You will notice that @code{preview-gs-image-type-alist}
+contains an entry for @code{dvipng}: this actually has nothing to with
+@samp{dvipng} itself but specifies the image type and Ghostscript device
+option to use when @samp{dvipng} can't be used.  This will obviously be
+the case for @acronym{PDF} output by PDF@LaTeX{}, but it will also happen
+if the @acronym{DVI} file contains PostScript specials in which case the
+affected images will get run through Dvips and Ghostscript once
+@samp{dvipng} finishes.
+
+@item preview-gs-options
+Most interesting to the user perhaps is the setting of this variable.
+It contains the default antialiasing settings @option{-dTextAlphaBits=4}
+and @option{-dGraphicsAlphaBits=4}.  Decreasing those values to 2 @w{or
+1} might increase Ghostscript's performance if you find it lacking.
+@end vtable
+
+Running and feeding Ghostscript from @previewlatex{} happens
+asynchronously again: you can resume editing while the images arrive.
+While those pretty pictures filling in the blanks on screen tend to
+make one marvel instead of work, rendering the non-displayed images
+afterwards will not take away your attention and will eventually
+guarantee that jumping around in the document will encounter only
+prerendered images.
+
+@node Misplaced previews,  , The preview images, For advanced users
+@section Misplaced previews
+
+If you are reading this section, the first thing is to check that your
+problem is not caused by x-symbol in connection with an installation not
+supporting 8-bit characters (@pxref{x-symbol interoperation}).  If not,
+here's the beef:
+
+As explained previously, Emacs uses pseudo-error messages generated by
+the @samp{preview} package in order to pinpoint the exact source
+location where a preview originated.  This works in running text, but
+fails when preview material happens to lie in macro arguments, like the
+contents of @code{\emph}. Those macros first read in their entire
+argument, munge it through, perhaps transform it somehow, process it and
+perhaps then typeset something. When they finally typeset something,
+where is the location where the stuff originated? @TeX{}, having read in
+the entire argument before, does not know and actually there would be no
+sane way of defining it.
+
+For previews contained inside such a macro argument, the default
+behaviour of @previewlatex{} is to use a position immediately after the
+closing brace of the argument. All the previews get placed there, all at
+a zero-width position, which means that Emacs displays it in an order
+that @previewlatex{} cannot influence (currently in Emacs it is even
+possible that the order changes between runs). And since the placement
+of those previews is goofed up, you will not be able to regenerate them
+by clicking on them. The default behaviour is thus somewhat undesirable.
+
+The solution (like with other preview problems) is to tell the @LaTeX{}
+@samp{preview} package how to tackle this problem (@pxref{The LaTeX
+style file}).  Simply, you don't need @code{\emph} do anything at all
+during previews! You only want the text math previewed, so the solution
+is to use @code{\PreviewMacro*\emph} in the preamble of your document
+which will make @LaTeX{} ignore @code{\emph} completely as long as it is
+not part of a larger preview (in which case it gets typeset as
+usual). Its argument thus becomes ordinary text and gets treated like
+ordinary text.
+
+Note that it would be a bad idea to declare
+@code{\PreviewMacro*[@{@{@}@}]\emph} since then both @code{\emph} as
+well as its argument would be ignored instead of previewed. For
+user-level macros, this is almost never wanted, but there may be
+internal macros where you might want to ignore internal arguments.
+
+The same mechanism can be used for a number of other text-formatting
+commands like @code{\textrm}, @code{\textit} and the like. While they
+all use the same internal macro @code{\text@@command}, it will not do to
+redefine just that, since they call it only after having read their
+argument in, and then it already is too late. So you need to disable
+every of those commands by hand in your document preamble.
+
+Actually, we wrote all of the above just to scare you.  At least all of
+the above mentioned macros and a few more are already catered for by a
+configuration file @file{prauctex.cfg} that gets loaded by default
+unless the @samp{preview} package gets loaded with the @option{noconfig}
+option.  You can make your own copy of this file in a local directory
+and edit it in case of need.  You can also add loading of a file of your
+liking to @code{preview-default-preamble},
+@vindex preview-default-preamble
+or alternatively do the
+manual disabling of your favorite macro in
+@code{preview-default-preamble},
+@vindex preview-default-preamble
+which is customizable in the Preview Latex group.
+
+@node ToDo, Frequently Asked Questions, For advanced users, top
+@c Also used as TODO: in separate file
+@appendix ToDo
+@include preview-todo.texi
+
+@node Frequently Asked Questions, Copying this Manual, ToDo, top
+@c Also used as TODO: in separate file
+@appendix Frequently Asked Questions
+@include preview-faq.texi
+
+@node Copying this Manual, Index, Frequently Asked Questions, top
+@c Not to be changed often, I think: in separate file.
+@appendix Copying this Manual
+
+@ifinfo
+The copyright notice for this manual is:
+
+@insertcopying
+@end ifinfo
+
+The full license text can be read here:
+
+@menu
+* GNU Free Documentation License:: License for copying this manual.
+@end menu
+
+@include fdl.texi
+
+@c @node Credits, Index, Internals, top
+@c @appendix Credits 
+
+@node Index,  , Copying this Manual, top
+@unnumbered Index
+
+@printindex cp
+
+@bye
diff --git a/packages/auctex/doc/preview-problems.texi b/packages/auctex/doc/preview-problems.texi
new file mode 100644 (file)
index 0000000..a039351
--- /dev/null
@@ -0,0 +1,242 @@
+@include macros.texi
+@ifset rawfile
+@c documentencoding is used by makeinfo in our --no-headers output.
+@documentencoding ISO-8859-1
+@node Known problems,,(dir),(dir)
+@top Known problems
+
+@end ifset
+@c -----------------------
+@c @cindex @kbd{M-x preview-report-bug @key{RET}}
+@c @cindex @code{preview-report-bug}
+@c @cindex Report a bug
+A number of issues are known concerning the interoperation with various
+other software. Some of the known problems can be solved by moving to
+newer versions of the problematic software or by simple patches.
+
+@menu
+* Problems with Ghostscript::   
+* Font problems with Dvips::    
+* Emacs problems::              
+* Too small bounding boxes::    
+* x-symbol interoperation::     
+* Middle-clicks paste instead of toggling::  
+@end menu
+
+If you find something not mentioned here, please send a bug report using
+@kbd{M-x preview-report-bug @key{RET}}, which will fill in a lot of
+information interesting to us and send it to the
+@email{bug-auctex@@gnu.org} list.  Please use the bug reporting commands
+if at all possible.
+
+@ifset rawfile
+@node Problems with Ghostscript
+@chapter Problems with Ghostscript
+@raisesections
+@end ifset
+@ifclear rawfile
+@node Problems with Ghostscript
+@section Problems with Ghostscript
+@end ifclear
+
+Most of the problems encountered come from interaction with Ghostscript.
+It is a good idea to have a fairly recent version of Ghostscript
+installed.  One problem occurs if you have specified the wrong
+executable under Windows: the command line version of Ghostscript is
+called @file{GSWIN32C.EXE}, not @file{GSWIN32.EXE}.
+
+When Ghostscript fails, the necessary information and messages from
+Ghostscript go somewhere.  If Ghostscript fails before starting to
+process images, you'll find the information at the end of the process
+buffer you can see with @kbd{C-c C-l}.  If Ghostscript fails while
+processing a particular image, this image will be tagged with clickable
+buttons for the error description and for the corresponding source file.
+
+The default options configurable with
+
+@display
+@kbd{M-x customize-variable @key{RET} preview-gs-options @key{RET}}
+@end display
+@vindex preview-gs-options
+@noindent
+include the options @option{-dTextAlphaBits=4} and
+@option{-dGraphicsAlphaBits=4}.  These options have been reported to
+make Ghostscript 5.50 fail, but should work under Ghostscript 6.51 and
+later.  If you are experiencing problems, it might help to customize
+them away.  Of course, this also takes away the joy of antialiasing, so
+upgrading Ghostscript might not be the worst idea after all.
+
+The device names have changed over time, so when using an old
+Ghostscript, you may have problems with the devices demanded by the
+customizable variable @code{preview-image-creators}.
+@vindex preview-image-creators
+In that case, make sure they fit your version of Ghostscript, at least
+the entry corresponding to the current value of
+@code{preview-image-type}.
+@vindex preview-image-type
+While not being best in file size and image quality, setting
+@code{preview-image-creators} to @code{jpeg} should probably be one of
+the best bets for the purpose of checking basic operation, since that
+device name has not changed in quite some time.  But @acronym{JPEG} is
+not intended for text, but for photographic images.  On a more
+permanent time scale, the best choice is to use @acronym{PNG} and
+complain to your suppliers if either Emacs or Ghostscript fail to
+properly accommodate this format.
+
+@node Font problems with Dvips
+@section Font problems with Dvips
+Some fonts have been reported to produce wrong characters with
+@previewlatex{}.  @previewlatex{} calls Dvips by default with the option
+@option{-Pwww} in order to get scalable fonts for nice results.  If you
+are using antialiasing, however, the results might be sufficiently nice
+with bitmapped fonts, anyway.  You might try @option{-Ppdf} for another
+stab at scalable fonts, or other printer definitions.  Use
+
+@display
+@kbd{M-x customize-variable @key{RET} preview-fast-dvips-command @key{RET}}
+@end display
+@noindent
+and
+@display
+@kbd{M-x customize-variable @key{RET} preview-dvips-command @key{RET}}
+@end display
+@noindent
+in order to customize this.
+
+One particular problem is that several printer setup files (typically in
+a file called @file{/usr/share/texmf/dvips/config/config.pdf} if you are
+using the @option{-Ppdf} switch) contain the @option{G} option for
+`character shifting'.  This option will result in @samp{fi} being
+rendered as @samp{@pounds{}} (British Pounds sign) in several fonts,
+unless your version of Dvips has a long-standing bug in its
+implementation fixed (only very recent versions of Dvips have).
+
+@node Emacs problems
+@section Emacs problems
+
+@itemize @bullet
+@item GNU Emacs versions
+
+Don't use Emacsen older than 21.3 on X11-based systems.  On most other
+systems, you'll need at least @w{Emacs 22.1} or one of the developer
+versions leading up to it.  Details can be found in
+@ifset rawfile
+in the @file{INSTALL} file.
+@end ifset
+@ifclear rawfile
+@ref{Prerequisites,,,auctex,the @AUCTeX{} manual}.
+@end ifclear
+
+@item Emacsen on Windows operating systems
+
+For @w{Emacs 21}, no image support is available in Emacs under Windows.
+Without images, @previewlatex{} is useless.  The current @acronym{CVS}
+version of Emacs available from
+@uref{http://savannah.gnu.org/projects/emacs} now supports images
+including the @acronym{PNG} format, so @w{Emacs 22} should work out of
+the box once it is released.  Precompiled versions are available from
+@uref{http://crasseux.com/emacs} and @uref{http://nqmacs.sf.net}.
+
+For detailed installation instructions for Windows, see
+@ifset rawfile
+the file @file{INSTALL.windows}
+@end ifset
+@ifclear rawfile
+@ref{Installation under MS Windows,,,auctex,the @AUCTeX{} manual}.
+@end ifclear
+
+@item XEmacs
+
+There is are two larger problems known with older XEmacs releases.  One
+leads to seriously mispositioned baselines and previews hanging far
+above other text on the same line.  This should be fixed as of
+XEmacs-21.4.9.
+
+The other core bug causes a huge delay when XEmacs's idea of the state of
+processes (like ghostscript) is wrong, and can lead to nasty spurious
+error messages.  It should be fixed in version 21.4.8.
+
+Previews will only remain from one session to the next if you have
+version 1.81 or above of the @file{edit-utils} package, first released
+in the 2002-03-12 sumo tarball.
+@end itemize
+
+@node Too small bounding boxes
+@section Too small bounding boxes
+The bounding box of a preview is determined by the @LaTeX{} package
+using the pure @TeX{} bounding boxes.  If there is material extending
+outside of the @TeX{} box, that material will be missing from the
+preview image.  This happens for the label-showing boxes from
+the @code{showkeys} package.  This particular problem can be
+circumvented by using the @code{showlabels} option of the preview
+package.
+
+In general, you should try to fix the problem in the @TeX{} code, like
+avoiding drawing outside of the picture with PSTricks.
+
+One possible remedy is to set
+@code{preview-fast-conversion} to `Off' 
+@ifset rawfile
+(see the manual).
+@end ifset
+@ifclear rawfile
+(@pxref{The Emacs interface}).
+@end ifclear
+The conversion will take more time, but will then use the bounding boxes
+from @acronym{EPS} files generated by Dvips.
+
+Dvips generally does not miss things, but it does not understand
+PostScript constructs like @code{\resizebox} or @code{\rotate} commands,
+so will generate rather wrong boxes for those.  Dvips can be helped with
+the @code{psfixbb} package option to preview 
+@ifset rawfile
+(see the manual),
+@end ifset
+@ifclear rawfile
+(@pxref{The LaTeX style file}),
+@end ifclear
+which will tag the corners of the included @TeX{} box.  This will mostly
+be convenient for @emph{pure} PostScript stuff like that created by
+PSTricks, which Dvips would otherwise reserve no space for.
+
+@node x-symbol interoperation
+@section x-symbol interoperation
+
+Thanks to the work of Christoph Wedler, starting with version
+@samp{4.0h/beta} of x-symbol, the line parsing of @AUCTeX{} and
+@previewlatex{} is fully supported.  Earlier versions exhibit problems.
+However, versions before 4.2.2 will cause a drastic slowdown of
+@previewlatex{}'s parsing pass, so we don't recommend to use versions
+earlier than that.
+
+If you wonder what x-symbol is, it is a package that transforms various
+tokens and subscripts to a more readable form while editing and offers a
+few input methods handy especially for dealing with math. Take a look at
+@uref{http://x-symbol.sourceforge.net}.
+
+x-symbol versions up to 4.5.1-beta at least require an 8bit-clean @TeX{}
+implementation (meaning that its terminal output should not use
+@samp{^^}-started escape sequences) for cooperation with
+@previewlatex{}.  Later versions may get along without it, like
+@previewlatex{} does now.
+
+If you experience problems with @file{circ.tex} in connection with both
+x-symbol and Latin-1 characters, you may need to change your language
+environment or, as a last resort, customize the variable
+@code{LaTeX-command-style} by replacing the command @code{latex} with
+@code{latex -translate-file=cp8bit}.
+
+@node Middle-clicks paste instead of toggling
+@section Middle-clicks paste instead of toggling
+
+This is probably the fault of your favorite package.  @file{flyspell.el}
+and @file{mouse-drag.el} are known to be affected in versions before
+@w{Emacs 21.3}.  Upgrade to the most recent version.  What version of
+XEmacs might contain the fixes is unknown.
+
+@file{isearch.el} also shows this effect while searches are in progress,
+but the code is such a complicated mess that no patch is in sight.
+Better just end the search with @kbd{@key{RET}} before toggling and
+resume with @kbd{C-s C-s} or similar afterwards.  Since previews over
+the current match will auto-open, anyway, this should not be much of a
+problem in practice.
diff --git a/packages/auctex/doc/preview-readme.texi b/packages/auctex/doc/preview-readme.texi
new file mode 100644 (file)
index 0000000..4f67e04
--- /dev/null
@@ -0,0 +1,230 @@
+@include macros.texi
+@ifset rawfile
+@node Introduction, What use is it?, (dir), (dir)
+@top @previewlatex{} in a nutshell
+@paragraphindent none
+@end ifset
+@c -----------------------
+@cindex Readme
+Does your neck hurt from turning between previewer windows and the
+source too often? This @AUCTeX{} component will render your displayed
+@LaTeX{} equations right into the editing window where they belong.
+
+The purpose of @previewlatex{} is to embed @LaTeX{} environments such as
+display math or figures into the source buffers and switch conveniently
+between source and image representation.
+
+@menu
+* What use is it?::
+* Activating preview-latex::
+* Getting started::
+* Basic modes of operation::
+* More documentation::
+* Availability::
+* Contacts::
+@end menu
+
+@ifset rawfile
+@node What use is it?, Activating preview-latex, Introduction, Introduction
+@chapter What use is it?
+@raisesections
+@end ifset
+@ifclear rawfile
+@node What use is it?, Activating preview-latex, Introduction, Introduction
+@section What use is it?
+@end ifclear
+@cindex Philosophy of @previewlatex{}
+@acronym{WYSIWYG} (what you see is what you get) sometimes is considered
+all the rage, sometimes frowned upon.  Do we really want it?  Wrong
+question.  The right question is @emph{what} we want from it.  Except
+when finetuning the layout, we don't want to use printer fonts for
+on-screen text editing.  The low resolution and contrast of a computer
+screen render all but the coarsest printer fonts (those for low-quality
+newsprint) unappealing, and the margins and pagination of the print are
+not wanted on the screen, either.  On the other hand, more complex
+visual compositions like math formulas and tables can't easily be taken
+in when seen only in the source.  @previewlatex{} strikes a balance: it
+only uses graphic renditions of the output for certain, configurable
+constructs, does this only when told, and then right in the source code.
+Switching back and forth between the source and preview is easy and
+natural and can be done for each image independently.  Behind the scenes
+of @previewlatex{}, a sophisticated framework of other programs like
+@samp{dvipng}, Dvips and Ghostscript are employed together with a
+special @LaTeX{} style file for extracting the material of interest in
+the background and providing fast interactive response.
+
+@node  Activating preview-latex, Getting started, What use is it?, Introduction
+@section Activating @previewlatex{}
+@cindex Activation
+After installation, the package may need to be activated (and remember
+to activate @AUCTeX{} too).  In XEmacs, and in any prepackaged versions
+worth their salt, activation should be automatic upon installation.  If
+this seems not the case, complain to your installation provider.
+
+The usual activation (if it is not done automatically) would be
+
+@example
+(load "preview-latex.el" nil t t)
+@end example
+
+If you still don't get a ``Preview'' menu in @LaTeX{} mode in spite
+of @AUCTeX{} showing its ``Command'', your installation is broken.  One
+possible cause are duplicate Lisp files that might be detectable with
+@kbd{@key{M-x} list-load-path-shadows @key{RET}}.
+
+@node Getting started, Basic modes of operation, Activating preview-latex, Introduction
+@section Getting started
+
+Once activated, @previewlatex{} and its documentation will be accessible
+via its menus (note that @previewlatex{} requires @AUCTeX{} to be
+loaded).  When you have loaded a @LaTeX{} document (a
+sample document @file{circ.tex} is included in the distribution, but
+most documents including math and/or figures should do), you can use
+its menu or @kbd{C-c C-p C-d} (for @samp{Preview/Document}).
+Previews will now be generated for various objects in your document.
+You can use the time to take a short look at the other menu entries and
+key bindings in the @samp{Preview} menu.  You'll see the previewed
+objects change into a roadworks sign when @previewlatex{} has determined
+just what it is going to preview.  Note that you can freely navigate the
+buffer while this is going on.  When the process is finished you will
+see the objects typeset in your buffer.
+
+It is a bad idea, however, to edit the buffer before the roadworks signs
+appear, since that is the moment when the correlation between the
+original text and the buffer locations gets established.  If the buffer
+changes before that point of time, the previews will not be placed where
+they belong. If you do want to change some obvious error you just
+spotted, we recommend you stop the background process by pressing
+@kbd{C-c C-k}.
+
+To see/edit the @LaTeX{} code for a specific object, put the point (the
+cursor) on it and press @kbd{C-c C-p C-p} (for @samp{Preview/at point}).
+It will also do to click with the middle mouse button on the preview.
+Now you can edit the code, and generate a new preview by again pressing
+@kbd{C-c C-p C-p} (or by clicking with the middle mouse button on the
+icon before the edited text).
+
+If you are using the @code{desktop} package, previews will remain from
+one session to the next as long as you don't kill your buffer.  If you
+are using XEmacs, you will probably need to upgrade the package to
+the newest one; things are being fixed just as I am writing this.
+
+@node Basic modes of operation, More documentation, Getting started, Introduction
+@section Basic modes of operation
+
+@previewlatex{} has a number of methods for generating its graphics.
+Its default operation is equivalent to using the `@LaTeX{}' command from
+@AUCTeX{}.  If this happens to be a call of PDF@LaTeX{} generating
+@acronym{PDF} output (you need at least @w{@AUCTeX{} 11.51} for this),
+then Ghostscript will be called directly on the resulting @acronym{PDF}
+file.  If a @acronym{DVI} file gets produced, first Dvips and then
+Ghostscript get called by default.
+
+The image type to be generated by Ghostscript can be configured with
+
+@example
+@kbd{M-x} customize-variable @kbd{RET} preview-image-type @kbd{RET}
+@end example
+@vindex preview-image-type
+
+@noindent
+The default is @samp{png} (the most efficient image type).  A special
+setting is @samp{dvipng} in case you have the @samp{dvipng}
+@cindex Using dvipng
+@pindex dvipng
+program installed.  In this case, @samp{dvipng} will be used for
+converting @acronym{DVI} files and Ghostscript (with a @samp{PNG}
+device) for converting @acronym{PDF} files.  @samp{dvipng} is much
+faster than the combination of Dvips and Ghostscript.  You can get
+downloads, access to its @acronym{CVS} archive and further information
+from its @uref{http://savannah.nongnu.org/projects/dvipng, project
+site}.
+
+@node More documentation, Availability, Basic modes of operation, Introduction
+@section More documentation
+After the installation, documentation in the form of 
+@ifinfo
+@ifclear rawfile
+this
+@end ifclear
+@ifset rawfile
+an
+@end ifset
+@end ifinfo
+@ifnotinfo
+an
+@end ifnotinfo
+info manual will be available.  You can access it with the standalone
+info reader with
+
+@example
+info preview-latex
+@end example
+
+@noindent
+or by pressing @kbd{C-h i d m preview-latex @key{RET}} in Emacs.  Once
+@previewlatex{} is activated, you can instead use @kbd{C-c C-p
+@key{TAB}} (or the menu entry @samp{Preview/Read documentation}).
+
+Depending on your installation, 
+@ifnottex
+a printable 
+@end ifnottex
+@iftex
+this printed
+@end iftex
+manual may also be available in the form of @file{preview-latex.dvi} or
+@file{preview-latex.ps}.
+
+Detailed documentation for the @LaTeX{} style used for extracting the
+preview images is placed in @file{preview.dvi} in a suitable directory
+during installation; on typical teTeX-based systems,
+
+@example
+texdoc preview
+@end example
+
+@noindent
+will display it.
+
+@node  Availability, Contacts, More documentation, Introduction
+@section Availability
+@cindex Download
+@cindex @sc{cvs} access
+
+The @previewlatex{} project is now part of @AUCTeX{} and accessible as
+part of the @uref{http://savannah.gnu.org/projects/auctex,@AUCTeX{}
+project page}.  You can get its files from the
+@uref{ftp://ftp.gnu.org/pub/gnu/auctex,@AUCTeX{} download area}.  As of
+@w{@AUCTeX{} 11.81}, @previewlatex{} should already be integrated into
+@AUCTeX{}, so no separate download will be necessary.
+
+You will also find @file{.rpm} files there for Fedora and possibly
+SuSE. Anonymous @acronym{CVS} is available as well.
+
+@node  Contacts,  , Availability, Introduction
+@section Contacts
+@cindex Contacts
+@cindex Mailing list
+
+Bug reports should be sent by using @kbd{M-x preview-report-bug
+@key{RET}}, as this will fill in a lot of information interesting to
+us.  If the installation fails (but this should be a rare event), report
+bugs to @email{bug-auctex@@gnu.org}.
+
+There is a general discussion list for @AUCTeX{} which also
+covers @previewlatex{}, look at
+@uref{http://lists.gnu.org/mailman/listinfo/auctex}.  For more
+information on the mailing list, send a message with just the word
+``help'' as subject or body to @email{auctex-request@@gnu.org}.  For the
+developers, there is the @email{auctex-devel@@gnu.org} list; it would
+probably make sense to direct feature requests and questions about
+internal details there.  There is a low-volume read-only announcement
+list available to which you can subscribe by sending a mail with
+``subscribe'' in the subject to @email{info-auctex-request@@gnu.org}.
+
+Offers to support further development will be appreciated.  If you want
+to show your appreciation with a donation to the main developer, you can
+do so via PayPal to @email{dak@@gnu.org}, and of course you can arrange
+for service contracts or for added functionality.  Take a look at the
+@file{TODO} list for suggestions in that area.
diff --git a/packages/auctex/doc/preview-todo.texi b/packages/auctex/doc/preview-todo.texi
new file mode 100644 (file)
index 0000000..f39618f
--- /dev/null
@@ -0,0 +1,118 @@
+@ifset rawfile
+@include macros.texi
+@chapheading Future Development of @previewlatex{}
+@end ifset
+
+@itemize @bullet
+
+@item Support other formats than just @LaTeX{}
+
+plain @TeX{} users and Con@TeX{}t users should not have to feel left
+out.  While Con@TeX{}t is not supported yet by released versions of
+@AUCTeX{}, at least supporting plain would help people, and be a start
+for Con@TeX{}t as well.  There are plain-based formats like MusiX@TeX{}
+that could benefit a lot from @previewlatex{}.  The main part of the
+difficulties here is to adapt @file{preview.dtx} to produce stuff not
+requiring @LaTeX{}.
+
+@item Support nested snippets
+
+Currently you can't have both a footnote (which gets displayed as just
+its footnote number) and math inside of a footnote rendered as an image:
+such nesting might be achieved by rerunning @previewlatex{} on the
+footnote contents when one opens the footnote for editing.
+
+@item Support other text properties than just images
+
+Macros like @samp{\textit} can be rendered as images, but the resulting
+humungous blob is not suitable for editing, in particular since the
+line filling from LaTeX does not coincide with that of Emacs.  It would
+be much more useful if text properties just switched the relevant font
+to italics rather than replacing the whole text with an image.  It
+would also make editing quite easier.  Then there are things like
+footnotes that are currently just replaced by their footnote number.
+While editing is not a concern here (the number is not in the original
+text, anyway), it would save a lot of conversion time if no images were
+generated, but Emacs just displayed a properly fontified version of the
+footnote number.  Also, this might make @previewlatex{} useful even on
+text terminals.
+
+@item Find a way to facilitate Source Specials
+
+Probably in connection with adding appropriate support to
+@code{dvipng}, it would be nice if clicking on an image from a larger
+piece of source code would place the cursor at the respective source
+code location.
+
+@item Make @file{preview.dtx} look reasonable in @AUCTeX{}
+
+It is a bit embarrassing that @file{preview.dtx} is written in a manner
+that will not give either good syntax highlighting or good indentation
+when employing @AUCTeX{}.
+
+@item Web page work
+
+Currently, @previewlatex{}'s web page is not structured at all.  Better
+navigation would be desirable, as well as separate News and Errata eye
+catchers.
+
+@item Manual improvements
+
+@itemize @minus
+@item Pepper the manual with screen shots and graphics
+
+This will be of interest for the @acronym{HTML} and @TeX{} renditions
+of the texinfo manual.  Since Texinfo now supports images as well, this
+could well be nice to have.
+
+@item Fix duplicates
+
+Various stuff appears several times.
+
+@end itemize
+
+@item Implement rendering pipelines for Emacs
+
+The current @file{gs.el} interface is fundamentally flawed, not only
+because of a broken implementation.  A general batchable and
+daemonizable rendering infrastructure that can work on all kinds of
+preview images for embedding into buffers is warranted.  The current
+implementation has a rather adhoc flavor and is not easily extended.
+It will not work outside of AUCTeX, either.
+
+@item Integrate into Ref@TeX{}
+
+When referencing to equations and the like, the preview-images of the
+source rather than plain text should be displayed.  If the preview in
+question covers labels, those should appear in the bubble help and/or a
+context menu.  Apropos:
+
+@item Implement @LaTeX{} error indicators
+
+Previews on erroneous @LaTeX{} passages might gain a red border or similar.
+
+@item Pop up relevant online documentation for frequent errors
+
+A lot of errors are of the "badly configured" variety.  Perhaps the
+relevant info pages should be delivered in addition to the error
+message.
+
+@item Implement a table editing mode where every table cell gets output
+as a separate preview.  Alternatively, output the complete table
+metrics in a way that lets people click on individual cells for editing
+purposes.
+
+@item Benchmark and kill Emacs inefficiencies
+
+Both the @LaTeX{} run under Emacs control as well as actual image
+insertion in Emacs could be faster.  CVS Emacs has improved in that
+respect, but it still is slower than desirable.
+
+@item Improve image support under Emacs
+
+The general image and color handling in Emacs is inefficient and partly
+defective.  This is still the case in CVS.  One option would be to
+replace the whole color and image handling with @acronym{GDK} routines
+when this library is available, since it has been optimized for it.
+
+@end itemize
diff --git a/packages/auctex/doc/quickstart.texi b/packages/auctex/doc/quickstart.texi
new file mode 100644 (file)
index 0000000..ceec41c
--- /dev/null
@@ -0,0 +1,299 @@
+@include macros.texi
+
+@node Quick Start
+@chapter Quick Start
+
+@AUCTeX{} is a powerful program offering many features and configuration
+options.  If you are new to @AUCTeX{} this might be deterrent.
+Fortunately you do not have to learn everything at once.  This Quick
+Start Guide will give you the knowledge of the most important commands
+and enable you to prepare your first @LaTeX{} document with @AUCTeX{}
+after only a few minutes of reading.
+
+In this introduction, we assume that @AUCTeX{} is already installed on
+your system.  If this is not the case, you should read the file
+@file{INSTALL} in the base directory of the unpacked distribution
+tarball.  These installation instructions are available in this manual
+as well, @ref{Installation}.  We also assume that you are familiar with
+the way keystrokes are written in Emacs manuals.  If not, have a look at
+the Emacs Tutorial in the Help menu.
+
+If @AUCTeX{} is installed, you might still need to activate it, by
+inserting
+
+@lisp
+(load "auctex.el" nil t t)
+@end lisp
+
+in your user init file.@footnote{This usually is a file in your home
+directory called @file{.emacs} if you are utilizing GNU Emacs or
+@file{.xemacs/init.el} if you are using XEmacs.}  In order to get
+support for many of the @LaTeX{} packages you will use in your
+documents, you should enable document parsing as well, which can be
+achieved by putting
+
+@lisp
+(setq TeX-auto-save t)
+(setq TeX-parse-self t)
+@end lisp
+
+into your init file.  Finally, if you often use @code{\include} or
+@code{\input}, you should make @AUCTeX{} aware of the multi-file
+document structure.  You can do this by inserting
+
+@lisp
+(setq-default TeX-master nil)
+@end lisp
+
+into your init file.  Each time you open a new file, @AUCTeX{} will then
+ask you for a master file.
+
+@menu
+* Editing Facilities::          Functions for editing TeX files
+* Processing Facilities::       Creating and viewing output, debugging
+@end menu
+
+@iftex
+This Quick Start Guide covers two main topics: First we explain how
+@AUCTeX{} helps you in editing your input file for @TeX{}, @LaTeX{}, and
+some other formats.  Then we describe the functions that @AUCTeX{}
+provides for processing the input files with @LaTeX{}, Bib@TeX{}, etc.,
+and for viewing and debugging.
+@end iftex
+
+@node Editing Facilities
+@section Functions for editing TeX files
+
+@subsection Making your @TeX{} code more readable
+
+@AUCTeX{} can do syntax highlighting of your source code, that means
+commands will get special colors or fonts.  You can enable it locally by
+typing @kbd{M-x font-lock-mode RET}.  If you want to have font locking
+activated generally, enable @code{global-font-lock-mode}, e.g. with
+@kbd{M-x customize-variable RET global-font-lock-mode RET}.
+
+@AUCTeX{} will indent new lines to indicate their syntactical
+relationship to the surrounding text.  For example, the text of a
+@code{\footnote} or text inside of an environment will be indented
+relative to the text around it.  If the indenting has gotten wrong after
+adding or deleting some characters, use @key{TAB} to reindent the line,
+@kbd{M-q} for the whole paragraph, or @kbd{M-x LaTeX-fill-buffer RET}
+for the whole buffer.
+
+@subsection Entering sectioning commands
+@cindex Sectioning
+@cindex Sections
+@cindex Chapters
+@cindex @code{\chapter}
+@cindex @code{\section}
+@cindex @code{\subsection}
+@cindex @code{\label}
+
+Insertion of sectioning macros, that is @samp{\chapter},
+@samp{\section}, @samp{\subsection}, etc. and accompanying @samp{\label}
+commands may be eased by using @kbd{C-c C-s}.  You will be asked for the
+section level.  As nearly everywhere in @AUCTeX{}, you can use the
+@key{TAB} or @key{SPC} key to get a list of available level names, and
+to auto-complete what you started typing.  Next, you will be asked for
+the printed title of the section, and last you will be asked for a label
+to be associated with the section.
+
+@subsection Inserting environments
+
+Similarly, you can insert environments, that is
+@samp{\begin@{@}}--@samp{\end@{@}} pairs: Type @kbd{C-c C-e}, and select
+an environment type.  Again, you can use @key{TAB} or @key{SPC} to get a
+list, and to complete what you type.  Actually, the list will not only
+provide standard @LaTeX{} environments, but also take your
+@samp{\documentclass} and @samp{\usepackage} commands into account if
+you have parsing enabled by setting @code{TeX-parse-self} to @code{t}.
+If you use a couple of environments frequently, you can use the up and
+down arrow keys (or @kbd{M-p} and @kbd{M-n}) in the minibuffer to get
+back to the previously inserted commands.
+
+Some environments need additional arguments.  Often, @AUCTeX{} knows about
+this and asks you to enter a value. 
+
+@subsection Inserting macros
+
+@kbd{C-c C-m}, or simply @kbd{C-c RET} will give you a prompt that asks
+you for a @LaTeX{} macro.  You can use @key{TAB} for completion, or the
+up/down arrow keys (or @kbd{M-p} and @kbd{M-n}) to browse the command
+history.  In many cases, @AUCTeX{} knows which arguments a macro needs
+and will ask you for that.  It even can differentiate between mandatory
+and optional arguments---for details, see @ref{Completion}.
+
+An additional help for inserting macros is provided by the possibility
+to complete macros right in the buffer.  With point at the end of a
+partially written macro, you can complete it by typing @kbd{M-TAB}.
+
+@subsection Changing the font 
+
+@AUCTeX{} provides convenient keyboard shortcuts for inserting macros
+which specify the font to be used for typesetting certain parts of the
+text.  They start with @kbd{C-c C-f}, and the last @kbd{C-} combination
+tells @AUCTeX{} which font you want:
+
+@table @kbd
+@item C-c C-f C-b
+@kindex C-c C-f C-b
+@cindex @code{\textbf}
+Insert @b{bold face} @samp{\textbf@{@point{}@}} text.
+
+@item C-c C-f C-i
+@kindex C-c C-f C-i
+@cindex @code{\textit}
+Insert @i{italics} @samp{\textit@{@point{}@}} text.
+
+@item C-c C-f C-e
+@kindex C-c C-f C-e
+@cindex @code{\emph}
+Insert @i{emphasized} @samp{\emph@{@point{}@}} text.
+
+@item C-c C-f C-s
+@kindex C-c C-f C-s
+@cindex @code{\textsl}
+Insert @i{slanted} @samp{\textsl@{@point{}@}} text.
+
+@item C-c C-f C-r
+@kindex C-c C-f C-r
+@cindex @code{\textrm}
+Insert roman @r{\textrm@{@point{}@}} text.
+
+@item C-c C-f C-f
+@kindex C-c C-f C-f
+@cindex @code{\textsf}
+Insert  @sans{sans serif} @samp{\textsf@{@point{}@}} text.
+
+@item C-c C-f C-t
+@kindex C-c C-f C-t
+@cindex @code{\texttt}
+Insert @t{typewriter} @samp{\texttt@{@point{}@}} text.
+
+@item C-c C-f C-c
+@kindex C-c C-f C-c
+@cindex @code{\textsc}
+Insert @sc{small caps} @samp{\textsc@{@point{}@}} text.
+
+@item C-c C-f C-d
+@kindex C-c C-f C-c
+@cindex Deleting fonts
+Delete the innermost font specification containing point.
+
+@end table
+
+If you want to change font attributes of existing text, mark it as a
+region, and then invoke the commands.  If no region is selected, the
+command will be inserted with empty braces, and you can start typing the
+changed text.
+
+Most of those commands will also work in math mode, but then macros like
+@code{\mathbf} will be inserted.
+
+
+@subsection Other useful features
+
+@AUCTeX{} also tries to help you when inserting the right ``quote''
+signs for your language, dollar signs to typeset math, or pairs of
+braces.  It offers shortcuts for commenting out text (@kbd{C-c ;} for
+the current region or @kbd{C-c %} for the paragraph you are in).  The
+same keystrokes will remove the % signs, if the region or paragraph is
+commented out yet.  With @code{TeX-fold-mode}, you can hide certain
+parts (like footnotes, references etc.) that you do not edit currently.
+Support for Emacs' outline mode is provided as well.  And there's more,
+but this is beyond the scope of this Quick Start Guide.
+
+
+
+@node Processing Facilities
+@section Creating and viewing output, debugging
+
+@subsection One Command for @LaTeX{}, helpers, viewers, and printing
+
+If you have typed some text and want to run @LaTeX{} (or @TeX{}, or
+other programs---see below) on it, type @kbd{C-c C-c}.  If applicable,
+you will be asked whether you want to save changes, and which program
+you want to invoke.  In many cases, the choice that @AUCTeX{} suggests
+will be just what you want: first @command{latex}, then a viewer.  If a
+@command{latex} run produces or changes input files for
+@command{makeindex}, the next suggestion will be to run that program,
+and @AUCTeX{} knows that you need to run @command{latex} again
+afterwards---the same holds for Bib@TeX{}.
+
+When no processor invocation is necessary anymore, @AUCTeX{} will
+suggest to run a viewer, or you can chose to create a PostScript file
+using @command{dvips}, or to directly print it.
+
+At this place, a warning needs to be given: First, although @AUCTeX{} is
+really good in detecting the standard situations when an additional
+@command{latex} run is necessary, it cannot detect it always.  Second,
+the creation of PostScript files or direct printing currently only works
+when your output file is a @acronym{DVI} file, not a @acronym{PDF} file.
+
+Ah, you didn't know you can do both?  That brings us to the next topic.
+
+@subsection Choosing an output format
+
+From a @LaTeX{} file, you can produce @acronym{DVI} output, or a
+@acronym{PDF} file directly @i{via} @command{pdflatex}.  You can switch
+on source specials for easier navigation in the output file, or tell
+@command{latex} to stop after an error (usually @code{\noninteractive}
+is used, to allow you to detect all errors in a single run).
+
+These options are controlled by toggles, the keystrokes should be easy
+to memorize:
+
+@table @kbd
+@item @kbd{C-c C-t C-p}
+This command toggles between @acronym{DVI} and @acronym{PDF} output
+
+@item @kbd{C-c C-t C-i}
+toggles interactive mode
+
+@item @kbd{C-c C-t C-s}
+toggles source specials support
+
+@item @kbd{C-c C-t C-o}
+toggles usage of Omega/lambda.
+
+@end table
+
+@subsection Debugging @LaTeX{}
+
+When @AUCTeX{} runs a program, it creates an output buffer in which it
+displays the output of the command.  If there is a syntactical error in
+your file, @command{latex} will not complete successfully. @AUCTeX{}
+will tell you that, and you can get to the place where the first error
+occured by pressing @kbd{C-c `} (the last character is a backtick).  The
+view will be split in two windows, the output will be displayed in the
+lower buffer, and both buffers will be centered around the place where
+the error ocurred.  You can then try to fix it in the document buffer,
+and use the same keystrokes to get to the next error.  This procedure
+may be repeated until all errors have been dealt with.  By pressing
+@kbd{C-c C-w} (@code{TeX-toggle-debug-boxes}) you can toggle whether
+@AUCTeX{} should notify you of overfull and underfull boxes in addition
+to regular errors.
+
+If a command got stuck in a seemingly infinite loop, or you want to stop
+execution for other reasons, you can use @kbd{C-c C-k} (for ``kill'').
+Similar to @kbd{C-l}, which centers the buffer you are in around your
+current position, @kbd{C-c C-l} centers the output buffer so that the
+last lines added at the bottom become visible.
+
+@subsection Running @LaTeX{} on parts of your document
+
+If you want to check how some part of your text looks like, and do not
+want to wait until the whole document has been typeset, then mark it as
+a region and use @kbd{C-c C-r}.  It behaves just like @kbd{C-c C-c}, but
+it only uses the document preamble and the region you marked.
+
+If you are using @code{\include} or @code{\input} to structure your
+document, try @kbd{C-c C-b} while you are editing one of the included
+files.  It will run @command{latex} only on the current buffer, using the
+preamble from the master file.
+@c does this also work with input? why not?
+
+@c Local Variables: 
+@c mode: texinfo
+@c TeX-master: "auctex"
+@c End: 
diff --git a/packages/auctex/doc/todo.texi b/packages/auctex/doc/todo.texi
new file mode 100644 (file)
index 0000000..5ac6703
--- /dev/null
@@ -0,0 +1,345 @@
+@c This is part of the AUCTeX Manual.
+@c Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
+@c See the file auctex.texi for copying conditions.
+@ifset rawfile
+@include macros.texi
+@node Development,,(dir),(dir)
+@top Future Development of @AUCTeX{}
+@end ifset
+
+The following sections describe future development of @AUCTeX{}.
+Besides mid-term goals, bug reports and requests we cannot fix or honor
+right away are being gathered here.  If you have some time for Emacs
+Lisp hacking, you are encouraged to try to provide a solution to one of
+the following problems.  If you don't know Lisp, you may help us to
+improve the documentation.  It might be a good idea to discuss proposed
+changes on the mailing list of @AUCTeX{} first.
+
+@menu
+* Mid-term Goals::
+* Wishlist::
+* Bugs::
+@end menu
+
+@ifset rawfile
+@node Mid-term Goals
+@chapter Mid-term Goals
+@raisesections
+@end ifset
+
+@ifclear rawfile
+@node Mid-term Goals
+@section Mid-term Goals
+@end ifclear
+
+@itemize @bullet
+@item Integration of @previewlatex{} into @AUCTeX{}
+
+As of @AUCTeX{} 11.81 @previewlatex{} is a part of @AUCTeX{} in the
+sense that the installation routines were merged and @previewlatex{} is
+being packaged with @AUCTeX{}.
+
+Further integration will happen at the backend.  This involves folding
+of error parsing and task management of both packages which will ease
+development efforts and avoid redundant work.
+
+@item More flexible option and command handling
+
+The current state of command handling with @code{TeX-command-list} is
+not very flexible because there is no distinction between executables
+and command line options to be passed to them.
+
+Customization of @code{TeX-command-list} by the user will interfere with
+updates of @AUCTeX{}.
+
+@item Error help catalogs
+
+Currently, the help for errors is more or less hardwired into
+@file{tex.el}.  For supporting error help in other languages, it would
+be sensible to instead arrange error messages in language-specific
+files, make a common info file from all such catalogs in a given
+language and look the error texts up in an appropriate index.  The user
+would then specify a preference list of languages, and the errors would
+be looked up in the catalogs in sequence until they were identified.
+
+@item Combining @samp{docTeX} with RefTeX
+
+Macro cross references should also be usable for document navigation
+using RefTeX.
+
+
+@end itemize
+
+@node Wishlist
+@section Wishlist
+
+@itemize @bullet
+@item Documentation lookup for macros
+
+A parser could gather information about which macros are defined in
+which @LaTeX{} packages and store the information in a hashtable which
+can be used in a backend for @code{TeX-doc} in order to open the
+matching documentation for a given macro.  The information could also be
+used to insert an appropriate @samp{\usepackage} statement if the user
+tries to insert a macro for which the respective package has not been
+requested yet.
+
+@item Spell checking of macros
+
+A special ispell dictionary for macros could be nice to have.
+
+@item Quick error overviews
+
+An error overview window (extract from the log file with just the error
+lines, clickable like a ``grep'' buffer) and/or fringe indicators for
+errors in the main text would be nice.
+
+@item A math entry grid
+
+A separate frame with a table of math character graphics to click on in
+order to insert the respective sequence into the buffer (cf. the
+``grid'' of x-symbol).
+
+@item Crossreferencing support
+
+It would be nice if you could index process your favorite collection of
+@file{.dtx} files (such as the LaTeX source), just call a command on
+arbitrary control sequence, and get either the DVI viewer opened right
+at the definition of that macro (using Source Specials), or the source
+code of the @file{.dtx} file.
+
+@item Better plain TeX support
+
+For starters, @code{LaTeX-math-mode} is not very @LaTeX{}-specific in
+the first place, and similar holds for indentation and formatting.
+
+@item Poor man's Source Specials
+In particular in PDF mode (and where Source Specials cause problems),
+alternatives would be desirable.  One could implement inverse search by
+something like Heiko Oberdiek's @file{vpe.sty}, and forward search by
+using the @file{.aux} file info to correlate labels in the text
+(possibly in cooperation with Ref@TeX{}) with previewer pages.
+
+In @AUCTeX{} 11.83, support for forward search with PDF files was added.
+Currently this only works if you use the pdfsync @LaTeX{} package and
+xpdf as your PDF viewer.
+@ifclear rawfile
+@xref{Viewing}.
+@end ifclear
+
+
+@item
+Page count when compiling should (optionally) go to modeline of the
+window where the compilation command was invoked, instead of the output
+window.  Suggested by Karsten Tinnefeld
+<tinnefeld@@irb.informatik.uni-dortmund.de>.
+
+@item
+Command to insert a macrodefinition in the preamble, without moving
+point from the current location.  Suggested by
+"Jeffrey C. Ely" <ely@@nwu.edu>.
+
+@item
+A database of all commands defined in all stylefiles.  When a command or
+environment gets entered that is provided in one of the styles, insert
+the appropriate @code{\usepackage} in the preamble.
+
+@item
+A way to add and overwrite math mode entries in style files, and to
+decide where they should be.  Suggested by Remo Badii <Remo.Badii@@psi.ch>.
+
+@item
+Create template for (first) line of tabular environment.
+
+@item
+@c Already fixed?
+I think prompting for the master is the intended behaviour.  It
+corresponds to a `shared' value for TeX-master.
+
+There should probably be a `none' value which wouldn't query for the
+master, but instead disable all features that relies on TeX-master.
+
+This default value for TeX-master could then be controled with mapping
+based on the extension.
+
+@item
+Multiple argument completion for @samp{\bibliography}.  In general, I
+ought to make @kbd{,} special for these kind of completions.
+
+@item
+Suggest @samp{makeindex} when appropriate.
+
+@item
+Use index files (when available) to speed up @kbd{C-c C-m include
+@key{RET}}.
+
+@item
+Option not to calculate very slow completions like for
+@kbd{C-c C-m include @key{RET}}.
+
+@item
+Font menu should be created from @code{TeX-font-list}.
+
+@item
+Installation procedure written purely in emacs lisp.
+
+@item
+Included PostScript files should also be counted as part of the
+document.
+
+@item
+A nice hierarchical by-topic organization of all officially documented
+LaTeX macros, available from the menu bar.
+
+@item
+@code{TeX-command-default} should be set from the master file, if not
+set locally.  Suggested by Peter Whaite @samp{<peta@@cim.mcgill.ca>}.
+
+@item
+Make @AUCTeX{} work with @samp{crypt++}.  Suggested by Chris Moore
+@samp{<Chris.Moore@@src.bae.co.uk>}.
+
+@item
+Make @AUCTeX{} work with @samp{longlines}.  This would also apply to
+@previewlatex{}, though it might make sense to unify error processing
+before attempting this.
+
+@item
+The @samp{Spell} command should apply to all files in a document.  Maybe
+it could try to restrict to files that have been modified since last
+spell check?  Suggested by Ravinder Bhumbla @samp{<rbhumbla@@ucsd.edu>}.
+
+@item
+Make @key{.} check for abbreviations and sentences ending with capital
+letters.
+
+@item
+Use Emacs 19 minibuffer history to choose between previewers, and other
+stuff.  Suggested by John Interrante
+@samp{<interran@@uluru.Stanford.EDU>}.
+
+@item
+Make features.
+
+A new command @code{TeX-update} (@kbd{C-c C-u}) could be used to create
+an up-to-date dvi file by repeatedly running Bib@TeX{}, MakeIndex and
+(La)@TeX{}, until an error occurs or we are done.
+
+An alternative is to have an @samp{Update} command that ensures the
+@samp{dvi} file is up to date.  This could be called before printing and
+previewing.
+
+@item
+Documentation of variables that can be set in a style hook.
+
+We need a list of what can safely be done in an ordinary style hook.
+You can not set a variable that @AUCTeX{} depends on, unless @AUCTeX{}
+knows that it has to run the style hooks first.
+
+Here is the start of such a list.
+@table @code
+
+@item LaTeX-add-environments
+
+@item TeX-add-symbols
+
+@item LaTeX-add-labels
+
+@item LaTeX-add-bibliographies
+
+@item LaTeX-largest-level
+
+@end table
+
+@item
+Completion for counters and sboxes.
+
+@item
+Outline should be (better) supported in @TeX{} mode.
+
+At least, support headers, trailers, as well as TeX-outline-extra.
+
+@item
+@code{TeX-header-start} and @code{TeX-trailer-end}.
+
+We might want these, just for fun (and outlines)
+
+@item
+Plain @TeX{} and @LaTeX{} specific header and trailer expressions.
+
+We should have a way to globally specify the default value of the header
+and trailer regexps.
+
+@item
+Get closer to original @code{TeX-mode} keybindings.
+
+A third initialization file (@file{tex-mode.el}) containing an emulator
+of the standard @code{TeX-mode} would help convince some people to
+change to @AUCTeX{}.
+
+@item
+Make @code{TeX-next-error} parse ahead and store the results in a list,
+using markers to remember buffer positions in order to be more robust
+with regard to line numbers and changed files.  This is what
+@code{next-error} does. (Or did, until Emacs 19).
+
+@item
+Finish the Texinfo mode.  For one thing, many Texinfo mode commands do
+not accept braces around their arguments.
+
+@item
+Hook up the letter environment with @file{bbdb.el}.
+
+@end itemize
+
+@node Bugs
+@section Bugs
+
+@c FIXME: Are those bugs still present?
+
+@itemize @bullet
+@item The parsed files and style hooks for @file{example.dtx},
+@file{example.sty}, @file{example.drv} and @file{example.bib} all
+clash.  Bad.
+
+@item
+@kbd{C-c `} should always stay in the current window, also when it finds
+a new file.
+
+@item
+Do not overwrite emacs warnings about existing auto-save files when
+loading a new file.
+
+@item
+Maybe the regexp for matching a TeX symbol during parsing should be
+@samp{"\\\\\\([a-zA-Z]+\\|.\\)"} ---
+@samp{<thiemann@@informatik.uni-tuebingen.de>} Peter Thiemann.
+
+@item
+@AUCTeX{} should not parse verbatim environments.
+
+@item
+Make @samp{`} check for math context in @code{LaTeX-math-mode}. and
+simply self insert if not in a math context.
+
+@item
+Make @code{TeX-insert-dollar} more robust.  Currently it can be fooled
+by @samp{\mbox}'es and escaped double dollar for example.
+
+@item
+Correct indentation for tabular, tabbing, table, math, and array
+environments.
+
+@item
+No syntactic font locking of verbatim macros and environments. (XEmacs
+only)
+
+@item
+Font locking inside of verbatim macros and environments is not
+inhibited.  This may result in syntax highlighting of unbalanced dollar
+signs and the like spilling out of the verbatim content. (XEmacs only)
+
+@item
+Folding of @LaTeX{} constructs spanning more than one line may result in
+overfull lines. (XEmacs only)
+@end itemize
diff --git a/packages/auctex/doc/version.texi b/packages/auctex/doc/version.texi
new file mode 100644 (file)
index 0000000..70eb727
--- /dev/null
@@ -0,0 +1,2 @@
+@set VERSION 11.86
+@set UPDATED 2010-02-21
diff --git a/packages/auctex/doc/wininstall.texi b/packages/auctex/doc/wininstall.texi
new file mode 100644 (file)
index 0000000..3aa93b2
--- /dev/null
@@ -0,0 +1,391 @@
+@c This is part of the AUCTeX Manual.
+@c Copyright (C) 2003, 2004, 2005, 2006, 2007, 2009
+@c   Free Software Foundation, Inc.
+@c See the file auctex.texi for copying conditions.
+@ifset rawfile
+@include macros.texi
+@end ifset
+
+@subheading In a Nutshell
+
+The following are brief installation instructions for the impatient.  In
+case you don't understand some of this, run into trouble of some sort,
+or need more elaborate information, refer to the detailed instructions
+further below.
+
+@enumerate
+@item
+Install the prerequisites, i.e. Emacs or XEmacs, MSYS or Cygwin, a
+@TeX{} system, and Ghostscript.
+
+@item
+Open the MSYS shell or a Cygwin shell and change to the directory
+containing the unzipped file contents.
+
+@item
+Configure @AUCTeX{}:
+
+For Emacs: Many people like to install @AUCTeX{} into the pseudo file
+system hierarchy set up by the Emacs installation.  Assuming Emacs is
+installed in @file{C:/Program Files/Emacs} and the directory for local
+additions of your @TeX{} system, e.g. MiK@TeX{}, is
+@file{C:/localtexmf}, you can do this by typing the following statement
+at the shell prompt:
+
+@example
+./configure --prefix='C:/Program Files/Emacs' \
+  --infodir='C:/Program Files/Emacs/info' \
+  --with-texmf-dir='C:/localtexmf'
+@end example
+
+For XEmacs: You can install @AUCTeX{} as an XEmacs package.  Assuming
+XEmacs is installed in @file{C:/Program Files/XEmacs} and the directory
+for local additions of your @TeX{} system, e.g. MiK@TeX{}, is
+@file{C:/localtexmf}, you can do this by typing the following command at
+the shell prompt:
+
+@example
+./configure --with-xemacs='C:/Program Files/XEmacs/bin/xemacs' \
+  --with-texmf-dir='C:/localtexmf'
+@end example
+
+The commands above are examples for common usage.  More on configuration
+options can be found in the detailed installation instructions below.
+
+If the configuration script failed to find all required programs, make
+sure that these programs are in your system path and add directories
+containing the programs to the @env{PATH} environment variable if
+necessary.  Here is how to do that in W2000/XP:
+
+@enumerate
+@cindex Adding to @env{PATH} in Windows
+@cindex @env{PATH} in Windows
+@item
+On the desktop, right click ``My Computer'' and select properties.
+@item
+Click on ``Advanced'' in the ``System Properties'' window.
+@item
+Select ``Environment Variables''.
+@item
+Select ``path'' in ``System Variables'' and click ``edit''.  Move to the
+front in the line (this might require scrolling) and add the missing
+path including drive letter, ended with a semicolon.
+@end enumerate
+
+@item
+If there were no further error messages, type
+
+@example
+make
+@end example
+
+In case there were, please refer to the detailed description below.
+
+@item
+Finish the installation by typing
+
+@example
+make install
+@end example
+@end enumerate
+
+@subheading Detailed Installation Instructions
+
+Installation of @AUCTeX{} under Windows is in itself not more
+complicated than on other platforms.  However, meeting the prerequisites
+might require more work than on some other platforms, and feel less
+natural.
+
+If you are experiencing any problems, even if you think they are of your
+own making, be sure to report them to @email{auctex-devel@@gnu.org} so
+that we can explain things better in future.
+
+Windows is a problematic platform for installation scripts.  The main
+problem is that the installation procedure requires consistent file
+names in order to find its way in the directory hierarchy, and Windows
+path names are a mess.
+
+The installation procedure tries finding stuff in system search paths
+and in Emacs paths.  For that to succeed, you have to use the same
+syntax and spelling and case of paths everywhere: in your system search
+paths, in Emacs' @code{load-path} variable, as argument to the scripts.
+If your path names contain spaces or other `shell-unfriendly'
+characters, most notably backslashes for directory separators, place the
+whole path in @samp{"double quote marks"} whenever you specify it on a
+command line.
+
+Avoid `helpful' magic file names like @samp{/cygdrive/c} and
+@samp{C:\PROGRA~1\} like the plague.  It is quite unlikely that the
+scripts will be able to identify the actual file names involved.  Use
+the full paths, making use of normal Windows drive letters like
+@samp{ 'C:/Program Files/Emacs' } where required, and using the same
+combination of upper- and lowercase letters as in the actual files.
+File names containing shell-special characters like spaces or
+backslashes (if you prefer that syntax) need to get properly quoted to
+the shell: the above example used single quotes for that.
+
+Ok, now here are the steps to perform:
+
+@enumerate
+@item
+You need to unpack the @AUCTeX{} distribution (which you seemingly have
+done since you are reading this).  It must be unpacked in a separate
+installation directory outside of your Emacs file hierarchy: the
+installation will later copy all necessary files to their final
+destination, and you can ultimately remove the directory where you
+unpacked the files.
+
+Line endings are a problem under Windows.  The distribution contains
+only text files, and theoretically most of the involved tools should get
+along with that.  However, the files are processed by various utilities,
+and it is conceivable that not all of them will use the same line ending
+conventions.  If you encounter problems, it might help if you try
+unpacking (or checking out) the files in binary mode, if your tools
+allow that.
+
+If you don't have a suitable unpacking tool, skip to the next step: this
+should provide you with a working @samp{unzip} command.
+
+@item
+The installation of @AUCTeX{} will require the MSYS tool set from
+@uref{http://www.mingw.org/} or the Cygwin tool set from
+@uref{http://cygwin.com/}.  The latter is slower and larger (the download
+size of the base system is about 15 MB) but comes with a package manager
+that allows for updating the tool set and installing additional packages
+like, for example, the spell checker @w{aspell}.
+
+If Cygwin specific paths like @samp{/cygdrive/c} crop up in the course
+of the installation, using a non-Cygwin Emacs could conceivably cause
+trouble.  Using Cygwin either for everything or nothing might save
+headaches, @emph{if} things don't work out.
+
+@item
+Install a current version of XEmacs from @uref{http://www.xemacs.org/}
+or @w{Emacs} from @uref{ftp://ftp.gnu.org/gnu/emacs/windows/}.
+@w{Emacs} is the recommended choice because it is currently the primary
+platform for @AUCTeX{} development.
+
+@item
+You need a working @TeX{} installation.  One popular installation under
+Windows is @uref{http://www.miktex.org,MiK@TeX{}}.  Another much more
+extensive system is @uref{http://www.tug.org/texlive,@w{@TeX{} Live}}
+which is rather close to its Unix cousins.
+
+@item
+A working copy of @uref{http://www.cs.wisc.edu/~ghost/,Ghostscript} is
+required for @previewlatex{} operation.  Examining the output from
+@example
+gswin32c -h
+@end example
+on a Windows command line should tell you whether your Ghostscript
+supports the @code{png16m} device needed for @acronym{PNG} support.
+MiKTeX apparently comes with its own Ghostscript called @samp{mgs.exe}.
+
+@item
+@uref{http://www.perl.org,Perl} is needed for rebuilding the
+documentation if you are working with a copy from @acronym{CVS} or have
+touched documentation source files in the @previewlatex{} part.  If the
+line endings of the file @file{preview/latex/preview.dtx} don't
+correspond with what Perl calls @code{\n} when reading text files,
+you'll run into trouble.
+
+@item
+Now the fun stuff starts.  If you have not yet done so, unpack the
+@AUCTeX{} distribution into a separate directory after rereading the
+instructions for unpacking above.
+
+@item
+Ready for takeoff. Start some shell (typically @command{bash}) capable of
+running @command{configure}, change into the installation directory and
+call @command{./configure} with appropriate options.
+
+Typical options you'll want to specify will be
+@table @code
+@item --prefix=@var{drive:/path/to/emacs-hierarchy}
+which tells @file{configure} where to perform the installation. It may
+also make @file{configure} find Emacs or XEmacs automatically; if this
+doesn't happen, try one of @samp{--with-emacs} or @samp{--with-xemacs}
+as described below.  All automatic detection of files and directories
+restricts itself to directories below the @var{prefix} or in the same
+hierarchy as the program accessing the files.  Usually, directories like
+@file{man}, @file{share} and @file{bin} will be situated right under
+@var{prefix}.
+
+This option also affects the defaults for placing the Texinfo
+documentation files (see also @samp{--infodir} below) and automatically
+generated style hooks.
+
+If you have a central directory hierarchy (not untypical with Cygwin)
+for such stuff, you might want to specify its root here.  You stand a
+good chance that this will be the only option you need to supply, as
+long as your @TeX{}-related executables are in your system path, which
+they better be for @AUCTeX{}'s operation, anyway.
+
+@item --with-emacs
+if you are installing for a version of Emacs.  You can use
+@samp{--with-emacs=@var{drive:/path/to/emacs}} to specify the name of the
+installed Emacs executable, complete with its path if necessary (if
+Emacs is not within a directory specified in your @env{PATH} environment
+setting).
+
+@item --with-xemacs
+if you are installing for a version of XEmacs.  Again, you can use
+@samp{--with-xemacs=@var{drive:/path/to/xemacs}} to specify the name of the
+installed XEmacs executable complete with its path if necessary.  It may
+also be necessary to specify this option if a copy of Emacs is found in
+your @env{PATH} environment setting, but you still would like to install
+a copy of @AUCTeX{} for XEmacs.
+
+@item --with-packagedir=@var{drive:/dir}
+is an XEmacs-only option giving the location of the package directory.
+This will install and activate the package.  Emacs uses a different
+installation scheme:
+
+@item --with-lispdir=@var{drive:/path/to/site-lisp}
+This Emacs-only option tells a place in @code{load-path} below which the
+files are situated.  The startup files @file{auctex.el} and
+@file{preview-latex.el} will get installed here unless a subdirectory
+@file{site-start.d} exists which will then be used instead.  The other
+files from @AUCTeX{} will be installed in a subdirectory called
+@file{auctex}.
+
+If you think that you need a different setup, please refer to the full
+installation instructions in
+@ifset rawfile
+the @file{INSTALL} file.
+@end ifset
+@ifclear rawfile
+@ref{Configure}.
+@end ifclear
+
+@item --infodir=@var{drive:/path/to/info/directory}
+If you are installing into an Emacs directory, info files have to be put
+into the @file{info} folder below that directory.  The configuration
+script will usually try to install into the folder @file{share/info}, so
+you have to override this by specifying something like
+@samp{--infodir='C:/Program Files/info'} for the configure call.
+
+@item --with-auto-dir=@var{drive:/dir}
+Directory containing automatically generated information.  You should
+not normally need to set this, as @samp{--prefix} should take care of
+this.
+
+@item --disable-preview
+Use this option if your Emacs version is unable to support image
+display.  This will be the case if you are using a native variant of
+@w{Emacs 21}.
+
+@item --with-texmf-dir=@var{drive:/dir}
+This will specify the directory where your @TeX{} installation sits.  If
+your @TeX{} installation does not conform to the TDS (@TeX{} directory
+standard), you may need to specify more options to get everything in
+place.
+@end table
+
+For more information about any of the above and additional options, see
+@ifset rawfile
+the `Configure' section in the @file{INSTALL} file.
+@end ifset
+@ifclear rawfile
+@ref{Configure}.
+@end ifclear
+
+Calling
+@file{./configure --help=recursive}
+will tell about other options, but those are almost never required.
+
+Some executables might not be found in your path.  That is not a good
+idea, but you can get around by specifying environment variables to
+@file{configure}:
+@example
+GS="@var{drive:/path/to/gswin32c.exe}" ./configure @dots{}
+@end example
+should work for this purpose.  @file{gswin32c.exe} is the usual name for
+the required @emph{command line} executable under Windows; in contrast,
+@file{gswin32.exe} is likely to fail.
+
+As an alternative to specifying variables for the @file{configure} call
+you can add directories containing the required executables to the
+@env{PATH} variable of your Windows system.  This is especially a good
+idea if Emacs has trouble finding the respective programs later during
+normal operation.
+
+@item
+Run @command{make} in the installation directory.
+       
+@item
+Run @code{make install} in the installation directory.
+
+@item
+With XEmacs, @AUCTeX{} and @previewlatex{} should now be active by
+default.  With Emacs, activation depends on a working
+@file{site-start.d} directory or similar setup, since then the startup
+files @file{auctex.el} and @file{preview-latex.el} will have been placed
+there.  If this has not been done, you should be able to load the
+startup files manually with
+@example
+(load "auctex.el" nil t t)
+(load "preview-latex.el" nil t t)
+@end example
+in either a site-wide @file{site-start.el} or your personal startup file
+(usually accessible as @file{~/.emacs} from within Emacs and
+@file{~/.xemacs/init.el} from within XEmacs).
+
+@cindex @file{tex-mik.el}
+@cindex @file{tex-fptex.el}
+The default configuration of @AUCTeX{} is probably not the best fit for
+Windows systems.  You might want to add
+@example
+(require 'tex-mik)
+@end example
+or
+@example
+(require 'tex-fptex)
+@end example
+in order to get more appropriate values for MiK@TeX{} and fp@TeX{},
+respectively after loading @file{auctex.el} and @file{preview-latex.el}.
+
+You can always use
+
+@example
+@kbd{M-x customize-group RET AUCTeX RET}
+@end example
+
+in order to customize more stuff, or use the @samp{Customize} menu.
+
+@item
+Load @file{preview/circ.tex} into Emacs or XEmacs and see if you get the
+@samp{Command} menu. Try using it to @LaTeX{} the file.
+
+@item
+Check whether the @samp{Preview} menu is available in this file.  Use it
+to generate previews for the document.
+
+If this barfs and tells you that image type @samp{png} is not supported,
+you can either add @acronym{PNG} support to your Emacs installation or
+choose another image format to be used by @previewlatex{}.
+
+Adding support for an image format usually involves the installation of
+a library, e.g. from @uref{http://gnuwin32.sf.net/}.  If you got your
+Emacs from @uref{gnu.org} you might want to check its
+@uref{ftp://ftp.gnu.org/gnu/emacs/windows/README,README file} for
+details.
+
+A different image format can be chosen by setting the variable
+@code{preview-image-type}.  While it is recommended to keep the
+@samp{dvipng} or @samp{png} setting, you can temporarily select a
+different format like @samp{pnm} to check if the lack of @acronym{PNG}
+support is the only problem with your Emacs installation.
+
+Try adding the line
+
+@example
+(setq preview-image-type 'pnm)
+@end example
+
+to your init file for a quick test.  You should remove the line after
+the test again, because @acronym{PNM} files take away @strong{vast}
+amounts of disk space, and thus also of load/save time.
+@end enumerate
+
+Well, that about is all.  Have fun!
diff --git a/packages/auctex/font-latex.el b/packages/auctex/font-latex.el
new file mode 100644 (file)
index 0000000..2b146c7
--- /dev/null
@@ -0,0 +1,1958 @@
+;;; font-latex.el --- LaTeX fontification for Font Lock mode.
+
+;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
+;;   2004, 2005, 2006, 2007, 2008 Free Software Foundation.
+
+;; Authors:    Peter S. Galbraith <psg@debian.org>
+;;             Simon Marshall <Simon.Marshall@esrin.esa.it>
+;; Maintainer: auctex-devel@gnu.org
+;; Created:    06 July 1996
+;; Keywords:   tex, wp, faces
+
+;;; This file is not part of GNU Emacs.
+
+;; This package 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, or (at your option)
+;; any later version.
+
+;; This package 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; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+;;
+;; This package enhances font-lock fontification patterns for LaTeX.
+;; font-lock mode is a minor mode that causes your comments to be
+;; displayed in one face, strings in another, reserved words in
+;; another, and so on.
+;;
+;; ** Infinite loops !? **
+;; If you get an infinite loop, send a bug report!
+;; Then set the following in your ~/.emacs file to keep on working:
+;;   (setq font-latex-do-multi-line nil)
+
+;;; Code:
+
+(require 'font-lock)
+(require 'tex)
+
+(eval-when-compile
+  (require 'cl))
+
+(defgroup font-latex nil
+  "Font-latex text highlighting package."
+  :prefix "font-latex-"
+  :group 'faces
+  :group 'tex
+  :group 'AUCTeX)
+
+(defgroup font-latex-keywords nil
+  "Keywords for highlighting text in font-latex."
+  :prefix "font-latex-"
+  :group 'font-latex)
+
+(defgroup font-latex-highlighting-faces nil
+  "Faces for highlighting text in font-latex."
+  :prefix "font-latex-"
+  :group 'font-latex)
+
+(defvar font-latex-multiline-boundary 5000
+  "Size of region to search for the start or end of a multiline construct.")
+
+(defvar font-latex-quote-regexp-beg nil
+  "Regexp used to find quotes.")
+(make-variable-buffer-local 'font-latex-quote-regexp-beg)
+
+(defvar font-latex-quote-list '(("``" "''") ("<<" ">>" french) ("«" "»" french))
+  "List of quote specifiers for quotation fontification.
+
+Each element of the list is either a list consisting of two
+strings to be used as opening and closing quotation marks
+independently of the value of `font-latex-quotes' or a list with
+three elements where the first and second element are strings for
+opening and closing quotation marks and the third element being
+either the symbol 'german or 'french describing the order of
+quotes.
+
+If `font-latex-quotes' specifies a different state, order of the
+added quotes will be reversed for fontification.  For example if
+'(\"\\\"<\" \"\\\">\" french) is given but `font-latex-quotes'
+specifies 'german, quotes will be used like \">foo\"< for
+fontification.")
+
+(defvar font-latex-quotes-control nil
+  "Internal variable for keeping track if `font-latex-quotes' changed.")
+(make-variable-buffer-local 'font-latex-quotes-control)
+
+(defvar font-latex-quotes-internal nil
+  "Internal variable for tracking outcome of automatic detection.
+If automatic detection is not enabled, it is assigned the value
+of `font-latex-quotes'.")
+(make-variable-buffer-local 'font-latex-quotes-internal)
+
+(defvar font-latex-quotes-fallback 'french
+  "Fallback value for `font-latex-quotes' if automatic detection fails.")
+
+(defvar font-latex-quote-style-list-french
+  '("french" "frenchb" "frenchle" "frenchpro" "francais" "canadien"
+    "acadian" "italian")
+  "List of styles for which French-style quote matching should be activated.")
+
+(defvar font-latex-quote-style-list-german
+  '("austrian" "german" "germanb" "naustrian" "ngerman")
+  "List of styles for which German-style quote matching should be activated.")
+
+(defcustom font-latex-quotes 'auto
+  "Whether to fontify << French quotes >> or >>German quotes<<.
+Also selects \"<quote\"> versus \">quote\"<.
+
+If value `auto' is chosen, an attempt is being made in deriving
+the type of quotation mark matching from document settings like
+the language option supplied to the babel package.
+
+If nil, quoted content will not be fontified."
+  :type '(choice (const auto) (const french) (const german) (const nil))
+  :group 'font-latex)
+(put 'font-latex-quotes 'safe-local-variable
+     '(lambda (x) (memq x '(auto french german nil))))
+
+(defun font-latex-add-quotes (quotes)
+  "Add QUOTES to `font-latex-quote-list'.
+QUOTES has to be a list adhering to the format of an element of
+`font-latex-quote-list'."
+  (setq font-latex-quotes-control nil)
+  (make-local-variable 'font-latex-quote-list)
+  (add-to-list 'font-latex-quote-list quotes))
+
+(defun font-latex-quotes-set-internal ()
+  "Set `font-latex-quotes-internal' according to `font-latex-quotes'.
+If `font-latex-quotes' is set to `auto', try to derive the
+correct value from document properties."
+  (setq font-latex-quotes-internal
+       (if (eq font-latex-quotes 'auto)
+           (or (when (TeX-elt-of-list-member
+                      font-latex-quote-style-list-french TeX-active-styles)
+                 'french)
+               (when (TeX-elt-of-list-member
+                      font-latex-quote-style-list-german TeX-active-styles)
+                 'german)
+               font-latex-quotes-fallback)
+         font-latex-quotes)))
+;; Update the value of `font-latex-quotes-internal' when the list of
+;; styles changes.
+(add-hook 'TeX-update-style-hook 'font-latex-quotes-set-internal)
+
+;; The definitions of the title faces were originally taken from
+;; info.el (Copyright (C) 1985, 86, 92, 93, 94, 95, 96, 97, 98, 99,
+;; 2000, 2001 Free Software Foundation, Inc.) and adapted to the needs
+;; of font-latex.el.
+
+(defconst font-latex-sectioning-max 5
+  "Highest number for font-latex-sectioning-N-face")
+(defface font-latex-sectioning-5-face
+  (if (featurep 'xemacs)
+      '((((type tty pc) (class color) (background light))
+        (:foreground "blue4" :bold t))
+       (((type tty pc) (class color) (background dark))
+        (:foreground "yellow" :bold t))
+       (((class color) (background light))
+        (:bold t :foreground "blue4" :family "helvetica"))
+       (((class color) (background dark))
+        (:bold t :foreground "yellow" :family "helvetica"))
+       (t (:bold t :family "helvetica")))
+    '((((type tty pc) (class color) (background light))
+       (:foreground "blue4" :weight bold))
+      (((type tty pc) (class color) (background dark))
+       (:foreground "yellow" :weight bold))
+      (((class color) (background light))
+       (:weight bold :inherit variable-pitch :foreground "blue4"))
+      (((class color) (background dark))
+       (:weight bold :inherit variable-pitch :foreground "yellow"))
+      (t (:weight bold :inherit variable-pitch))))
+  "Face for sectioning commands at level 5."
+  :group 'font-latex-highlighting-faces)
+
+(defun font-latex-update-sectioning-faces (&optional max height-scale)
+  "Update sectioning commands faces."
+  (unless height-scale
+    (setq height-scale (if (numberp font-latex-fontify-sectioning)
+                          font-latex-fontify-sectioning
+                        1.1)))
+  (unless max
+    (setq max font-latex-sectioning-max))
+  (dotimes (num max)
+    (let* (;; reverse for XEmacs:
+          (num (- max (1+ num)))
+          (face-name (intern (format "font-latex-sectioning-%s-face" num))))
+      (unless (get face-name 'saved-face) ; Do not touch customized faces.
+       (if (featurep 'xemacs)
+           (let ((size
+                  ;; Multiply with .9 because `face-height' returns a value
+                  ;; slightly larger than the actual font size.
+                  ;; `make-face-size' takes numeric points according to Aidan
+                  ;; Kehoe in <16989.15536.613916.678965@parhasard.net> (not
+                  ;; documented).
+                  (round (* 0.9
+                            (face-height 'default)
+                            (expt height-scale (- max 1 num))))))
+             ;; (message "%s - %s" face-name size)
+             (make-face-size face-name size))
+         (set-face-attribute face-name nil :height  height-scale))))))
+
+(defcustom font-latex-fontify-sectioning 1.1
+  "Whether to fontify sectioning macros with varying height or a color face.
+
+If it is a number, use varying height faces.  The number is used
+for scaling starting from `font-latex-sectioning-5-face'.  Typically
+values from 1.05 to 1.3 give best results, depending on your font
+setup.  If it is the symbol `color', use `font-lock-type-face'.
+
+Caveats: Customizing the scaling factor applies to all sectioning
+faces unless those face have been saved by customize.  Setting
+this variable directly does not take effect unless you call
+`font-latex-update-sectioning-faces' or restart Emacs.
+
+Switching from `color' to a number or vice versa does not take
+effect unless you call \\[font-lock-fontify-buffer] or restart
+Emacs."
+  ;; Possibly add some words about XEmacs here. :-(
+  :type '(choice (number :tag "Scale factor")
+                 (const color))
+  :initialize 'custom-initialize-default
+  :set (lambda (symbol value)
+        (set-default symbol value)
+        (unless (eq value 'color)
+          (font-latex-update-sectioning-faces font-latex-sectioning-max value)))
+  :group 'font-latex)
+
+(defun font-latex-make-sectioning-faces (max &optional height-scale)
+  "Build the faces used to fontify sectioning commands."
+  (unless max (setq max font-latex-sectioning-max))
+  (unless height-scale
+    (setq height-scale (if (numberp font-latex-fontify-sectioning)
+                          font-latex-fontify-sectioning
+                        1.1)))
+  (dotimes (num max)
+    (let* (;; reverse for XEmacs:
+          (num (- max (1+ num)))
+          (face-name (intern (format "font-latex-sectioning-%s-face" num)))
+          (f-inherit (intern (format "font-latex-sectioning-%s-face" (1+ num))))
+          (size (when (featurep 'xemacs)
+                  (round (* 0.9 (face-height 'default)
+                            (expt height-scale (- max 1 num)))))))
+      (eval
+       `(defface ,face-name
+         (if (featurep 'xemacs)
+             '((t (:size ,(format "%spt" size))))
+           '((t (:height ,height-scale :inherit ,f-inherit))))
+         (format "Face for sectioning commands at level %s.
+
+Probably you don't want to customize this face directly.  Better
+change the base face `font-latex-sectioning-5-face' or customize the
+variable `font-latex-fontify-sectioning'." num)
+         :group 'font-latex-highlighting-faces))
+      (when (and (featurep 'xemacs)
+                ;; Do not touch customized  faces.
+                (not (get face-name 'saved-face)))
+       (set-face-parent face-name f-inherit)
+       ;; Explicitely set the size again to code around the bug that
+       ;; `set-face-parent' overwrites the original face size.
+       (make-face-size face-name size)))))
+
+(font-latex-make-sectioning-faces font-latex-sectioning-max)
+
+
+;;; Keywords
+
+(defvar font-latex-keywords-1 nil
+  "Subdued level highlighting for LaTeX modes.")
+
+(defvar font-latex-keywords-2 nil
+  "High level highlighting for LaTeX modes.")
+
+(defvar font-latex-built-in-keyword-classes
+  '(("warning"
+     ("nopagebreak" "pagebreak" "newpage" "clearpage" "cleardoublepage"
+      "enlargethispage" "nolinebreak" "linebreak" "newline" "-" "\\" "\\*"
+      "appendix" "displaybreak" "allowdisplaybreaks" "include")
+     'font-latex-warning-face 1 noarg)
+    ("variable"
+     (("setlength" "|{\\{") ("settowidth" "|{\\{") ("setcounter" "{|{\\")
+      ("addtolength" "|{\\{") ("addtocounter" "{|{\\"))
+     'font-lock-variable-name-face 2 command)
+    ("reference"
+     (("nocite" "{") ("cite" "[{") ("label" "{") ("pageref" "{")
+      ("vref" "{") ("eqref" "{") ("ref" "{") ("include" "{")
+      ("input" "{") ("bibliography" "{") ("index" "{") ("glossary" "{")
+      ("footnote" "[{") ("footnotemark" "[") ("footnotetext" "[{"))
+     'font-lock-constant-face 2 command)
+    ("function"
+     (("begin" "{") ("end" "{") ("pagenumbering" "{")
+      ("thispagestyle" "{") ("pagestyle" "{") ("nofiles" "")
+      ("includeonly" "{") ("bibliographystyle" "{") ("documentstyle" "[{")
+      ("documentclass" "[{") ("newenvironment" "*{[[{{")
+      ("newcommand" "*|{\\[[{") ("newlength" "|{\\")
+      ("newtheorem" "{[{[")
+      ("newcounter" "{[") ("renewenvironment" "*{[{{")
+      ("renewcommand" "*|{\\[[{") ("renewtheorem" "{[{[")
+      ("usepackage" "[{") ("fbox" "{") ("mbox" "{") ("sbox" "{")
+      ("vspace" "*{") ("hspace" "*{") ("thinspace" "") ("negthinspace" "")
+      ;; XXX: Should macros without arguments rather be listed in a
+      ;; separate category with 'noarg instead of 'command handling?
+      ("enspace" "") ("enskip" "") ("quad" "") ("qquad" "") ("nonumber" "")
+      ("centering" "") ("TeX" "") ("LaTeX" ""))
+     'font-lock-function-name-face 2 command)
+    ("sectioning-0"
+     (("part" "*[{"))
+     (if (eq font-latex-fontify-sectioning 'color)
+        'font-lock-type-face
+       'font-latex-sectioning-0-face)
+     2 command)
+    ("sectioning-1"
+     (("chapter" "*[{"))
+     (if (eq font-latex-fontify-sectioning 'color)
+        'font-lock-type-face
+       'font-latex-sectioning-1-face)
+     2 command)
+    ("sectioning-2"
+     (("section" "*[{"))
+     (if (eq font-latex-fontify-sectioning 'color)
+        'font-lock-type-face
+       'font-latex-sectioning-2-face)
+     2 command)
+    ("sectioning-3"
+     (("subsection" "*[{"))
+     (if (eq font-latex-fontify-sectioning 'color)
+        'font-lock-type-face
+       'font-latex-sectioning-3-face)
+     2 command)
+    ("sectioning-4"
+     (("subsubsection" "*[{"))
+     (if (eq font-latex-fontify-sectioning 'color)
+        'font-lock-type-face
+       'font-latex-sectioning-4-face)
+     2 command)
+    ("sectioning-5"
+     (("paragraph" "*[{") ("subparagraph" "*[{")
+      ("subsubparagraph" "*[{"))
+     (if (eq font-latex-fontify-sectioning 'color)
+        'font-lock-type-face
+       'font-latex-sectioning-5-face)
+     2 command)
+    ("slide-title" () 'font-latex-slide-title-face 2 command)
+    ("textual"
+     (("item" "[") ("title" "{") ("author" "{") ("date" "{")
+      ("thanks" "{") ("address" "{") ("caption" "[{")
+      ("textsuperscript" "{"))
+     'font-lock-type-face 2 command)
+    ("bold-command"
+     (("textbf" "{") ("textsc" "{") ("textup" "{") ("boldsymbol" "{")
+      ("pmb" "{"))
+     'font-latex-bold-face 1 command)
+    ("italic-command"
+     (("emph" "{") ("textit" "{") ("textsl" "{"))
+     'font-latex-italic-face 1 command)
+    ("math-command"
+     (("ensuremath" "|{\\"))
+     'font-latex-math-face 1 command)
+    ("type-command"
+     (("texttt" "{") ("textsf" "{") ("textrm" "{") ("textmd" "{"))
+     'font-lock-type-face 1 command)
+    ("bold-declaration"
+     ("bf" "bfseries" "sc" "scshape" "upshape")
+     'font-latex-bold-face 1 declaration)
+    ("italic-declaration"
+     ("em" "it" "itshape" "sl" "slshape")
+     'font-latex-italic-face 1 declaration)
+    ("type-declaration"
+     ("tt" "ttfamily" "sf" "sffamily" "rm" "rmfamily" "mdseries"
+      "tiny" "scriptsize" "footnotesize" "small" "normalsize"
+      "large" "Large" "LARGE" "huge" "Huge")
+     'font-lock-type-face 1 declaration))
+  "Built-in keywords and specifications for font locking.
+
+The first element of each item is the name of the keyword class.
+
+The second element is a list of keywords (macros without an
+escape character) to highlight or, if the fifth element is the
+symbol 'command, a list of lists where the first element of each
+item is a keyword and the second a string specifying the macro
+syntax.  It can contain \"*\" if the macro has a starred variant,
+\"[\" for an optional argument, \"{\" for a mandatory argument,
+and \"\\\" for a macro.  A \"|\" means the following two tokens
+should be regarded as alternatives.
+
+The third element is the symbol of a face to be used or a Lisp
+form returning a face symbol.
+
+The fourth element is the fontification level.
+
+The fifth element is the type of construct to be matched.  It can
+be one of 'noarg which will match simple macros without
+arguments (like \"\\foo\"), 'declaration which will match macros
+inside a TeX group (like \"{\\bfseries foo}\"), or 'command which
+will match macros of the form \"\\foo[bar]{baz}\".")
+
+(defcustom font-latex-deactivated-keyword-classes nil
+  "List of strings for built-in keyword classes to be deactivated.
+
+Valid entries are \"warning\", \"variable\", \"reference\",
+\"function\" , \"sectioning-0\", \"sectioning-1\", \"sectioning-2\",
+\"sectioning-3\", \"sectioning-4\", \"sectioning-5\", \"textual\",
+\"bold-command\", \"italic-command\", \"math-command\", \"type-command\",
+\"bold-declaration\", \"italic-declaration\", \"type-declaration\".
+
+You have to restart Emacs for a change of this variable to take effect."
+  :group 'font-latex-keywords
+  :type `(set ,@(mapcar
+                (lambda (spec)
+                  `(const :tag ,(concat
+                                 ;; Name of the keyword class
+                                 (let ((name (split-string (car spec) "-")))
+                                   (setcar name (capitalize (car name)))
+                                   (mapconcat 'identity name " "))
+                                 " keywords in `"
+                                 ;; Name of the face
+                                 (symbol-name (eval (nth 2 spec))) "'.\n"
+                                 ;; List of keywords
+                                 (with-temp-buffer
+                                   (insert "  Keywords: "
+                                           (mapconcat (lambda (x)
+                                                        (if (listp x)
+                                                            (car x)
+                                                          x))
+                                                      (nth 1 spec) ", "))
+                                   (fill-paragraph nil)
+                                   (buffer-substring-no-properties
+                                    (point-min) (point-max))))
+                          ,(car spec)))
+                font-latex-built-in-keyword-classes)))
+
+(defun font-latex-make-match-defun (prefix name face type)
+  "Return a function definition for keyword matching.
+The variable holding the keywords to match are determined by the
+strings PREFIX and NAME.  The type of matcher is determined by
+the symbol TYPE.
+
+This is a helper function for `font-latex-make-built-in-keywords'
+and `font-latex-make-user-keywords' and not intended for general
+use."
+  ;; Note: The functions are byte-compiled at the end of font-latex.el.
+  ;; FIXME: Is the cond-clause possible inside of the defun?
+
+  ;; In an earlier version of font-latex the type could be a list like
+  ;; (command 1).  This indicated a macro with one argument.  Provide
+  ;; a match function in this case but don't actually support it.
+  (cond ((or (eq type 'command) (listp type))
+        (eval `(defun ,(intern (concat prefix name)) (limit)
+                 ,(concat "Fontify `" prefix name "' up to LIMIT.
+
+Generated by `font-latex-make-match-defun'.")
+                 (when ,(intern (concat prefix name))
+                   (font-latex-match-command-with-arguments
+                    ,(intern (concat prefix name))
+                    (append
+                     (when (boundp ',(intern (concat prefix name
+                                                     "-keywords-local")))
+                       ,(intern (concat prefix name "-keywords-local")))
+                     ,(intern (concat prefix name "-keywords")))
+                    ;; `face' can be a face symbol, a form returning
+                    ;; a face symbol, or a list of face attributes.
+                    (if (and (listp ,face) (functionp (car ,face)))
+                        (eval ,face)
+                      ,face)
+                    limit)))))
+        ((eq type 'declaration)
+         (eval `(defun ,(intern (concat prefix name)) (limit)
+                  ,(concat "Fontify `" prefix name "' up to LIMIT.
+
+Generated by `font-latex-make-match-defun'.")
+                  (when ,(intern (concat prefix name))
+                    (font-latex-match-command-in-braces
+                     ,(intern (concat prefix name)) limit)))))
+        ((eq type 'noarg)
+         (eval `(defun ,(intern (concat prefix name)) (limit)
+                  ,(concat "Fontify `" prefix name "' up to LIMIT.
+
+Generated by `font-latex-make-match-defun'.")
+                  (when ,(intern (concat prefix name))
+                    (re-search-forward
+                     ,(intern (concat prefix name)) limit t)))))))
+
+(defun font-latex-keyword-matcher (prefix name face type)
+  "Return a matcher and highlighter as required by `font-lock-keywords'.
+PREFIX and NAME are strings which are concatenated to form the
+respective match function.  FACE is a face name or a list of text
+properties that will be applied to the respective part of the
+match returned by the match function.  TYPE is the type of
+construct to be highlighted.  Currently the symbols 'command,
+'sectioning, 'declaration and 'noarg are valid.
+
+This is a helper function for `font-latex-make-built-in-keywords'
+and `font-latex-make-user-keywords' and not intended for general
+use."
+  ;; In an earlier version of font-latex the type could be a list like
+  ;; (command 1).  This indicated a macro with one argument.  Provide
+  ;; a matcher in this case but don't actually support it.
+  (cond ((or (eq type 'command) (listp type))
+        `(,(intern (concat prefix name))
+          (0 (font-latex-matched-face 0) append t)
+          (1 (font-latex-matched-face 1) append t)
+          (2 (font-latex-matched-face 2) append t)
+          (3 (font-latex-matched-face 3) append t)
+          (4 (font-latex-matched-face 4) append t)
+          (5 (font-latex-matched-face 5) append t)
+          (6 (font-latex-matched-face 6) append t)
+          (7 (font-latex-matched-face 7) append t)))
+       ((eq type 'noarg)
+        `(,(intern (concat prefix name))
+          (0 ,face)))
+       ((eq type 'declaration)
+        `(,(intern (concat prefix name))
+          (0 'font-latex-warning-face t t)
+          (1 'font-lock-keyword-face append t)
+          (2 ,face append t)))))
+
+(defun font-latex-make-built-in-keywords ()
+  "Build defuns, defvars and defcustoms for built-in keyword fontification."
+  (dolist (item font-latex-built-in-keyword-classes)
+    (let ((prefix "font-latex-match-")
+         (name (nth 0 item))
+         (keywords (nth 1 item))
+         (face (nth 2 item))
+         (level (nth 3 item))
+         (type (nth 4 item)))
+
+      ;; defvar font-latex-match-*-keywords-local
+      (eval `(defvar ,(intern (concat prefix name "-keywords-local"))
+              ',keywords
+              ,(concat "Buffer-local keywords to add to `"
+                       prefix name "-keywords'.
+
+This must be a list where each element is a list consisting of a
+keyword string \(not a regular expression\) omitting the leading
+backslash and a format specifier as.  The options for the format
+specifier are described in the doc string of
+`font-latex-user-keyword-classes'.
+
+This is an internal variable which should not be set directly.
+Use `font-latex-add-keywords' instead.
+
+Generated by `font-latex-make-built-in-keywords'.")))
+      (eval `(make-variable-buffer-local
+             ',(intern (concat prefix name "-keywords-local"))))
+
+      ;; defun font-latex-match-*-make
+      ;; Note: The functions are byte-compiled at the end of font-latex.el.
+      (eval `(defun ,(intern (concat prefix name "-make")) ()
+              ,(concat "Make or remake the variable `" prefix name "'.
+
+Generated by `font-latex-make-built-in-keywords'.")
+              (let ((keywords
+                     (append
+                      (unless (member ,name
+                                      font-latex-deactivated-keyword-classes)
+                        ,(intern (concat prefix name "-keywords-local")))
+                      ,(intern (concat prefix name "-keywords"))))
+                    multi-char-macros single-char-macros)
+                (dolist (elt keywords)
+                  (let ((keyword (if (listp elt) (car elt) elt)))
+                    (if (string-match "^[A-Za-z]" keyword)
+                        (add-to-list 'multi-char-macros keyword)
+                      (add-to-list 'single-char-macros keyword))))
+                (when (or multi-char-macros single-char-macros)
+                  (setq ,(intern (concat prefix name))
+                        (concat
+                         "\\\\\\("
+                         (when multi-char-macros
+                           (concat
+                            "\\(?:" (regexp-opt multi-char-macros) "\\)\\>"))
+                         (when single-char-macros
+                           (concat
+                            (when multi-char-macros "\\|")
+                            "\\(?:" (regexp-opt single-char-macros) "\\)"))
+                         "\\)"))))))
+
+      ;; defcustom font-latex-match-*-keywords
+      (eval `(defcustom ,(intern (concat prefix name "-keywords")) nil
+              ,(concat "List of keywords "
+                       (when (eq type 'command) "and formats ")
+                       "for " name " face.\n"
+                       (if (eq type 'command)
+                           "\
+Each element has to be a list consisting of the name of a macro
+omitting the leading backslash and a format specifier as
+described in the doc string of `font-latex-user-keyword-classes'."
+                         "\
+Each element has to be the name of a macro as a string, omitting
+the leading backslash.")
+                       "\n\n\
+Setting this variable directly does not take effect; restart
+Emacs.
+
+Generated by `font-latex-make-built-in-keywords'.")
+              :type '(repeat (string :tag "Keyword"))
+              :type '(repeat ,(if (eq type 'command)
+                                  '(list (string :tag "Keyword")
+                                         (string :tag "Format"))
+                                '(string :tag "Keyword")))
+              :set (lambda (symbol value)
+                     (set-default symbol value)
+                     (funcall ',(intern (concat prefix name "-make"))))
+              :group 'font-latex-keywords))
+
+      ;; defvar font-latex-match-*
+      (eval `(defvar ,(intern (concat prefix name))
+              ,(intern (concat prefix name "-keywords"))))
+      (eval `(make-variable-buffer-local
+             ',(intern (concat prefix name))))
+
+      ;; defun font-latex-match-*
+      (font-latex-make-match-defun prefix name face type)
+
+      ;; Add matchers and highlighters to `font-latex-keywords-{1,2}'.
+      (let ((keywords-entry (font-latex-keyword-matcher
+                            prefix name face type)))
+       (add-to-list (intern (concat "font-latex-keywords-"
+                                    (number-to-string level)))
+                    keywords-entry t)
+       (when (= level 1)
+         (add-to-list (intern (concat "font-latex-keywords-2"))
+                      keywords-entry t))))))
+(font-latex-make-built-in-keywords)
+
+(defcustom font-latex-user-keyword-classes nil
+  "List of user-defined keyword classes for font locking.
+
+Every keyword class consists of four parts, a name, a list of
+keywords, a face and a specifier for the type of macro to be
+highlighted.
+
+When adding new entries, you have to use unique values for the
+class names, i.e. they must not clash with names of the built-in
+keyword classes or other names given by you.  Additionally the
+names must not contain spaces.
+
+The list of keywords defines which commands and declarations
+should be covered by the keyword class.  A keyword can either be
+a simple command name omitting the leading backslash or a list
+consisting of the command name and a string specifying the syntax
+of the command.  The latter is useful if you want to match LaTeX
+macros with arguments (see below).  You can specify the occurence
+and order of optional (\"[\") and mandatory (\"{\") arguments for
+each keyword.  For example for \"documentclass\" you'd use \"[{\"
+because the macro has one optional followed by one mandatory
+argument.  Optionally starred macros can be indicated with \"*\".
+In case an argument is an unbraced macro, use \"\\\".  You can
+also specify two alternative arguments by prefixing them with
+\"|\".  As an example, the specifier for \\newcommand is
+\"*|{\\=\\[[{\".
+
+The face argument can either be an existing face or a font
+specification.  (The latter option is not available in XEmacs.)
+
+There are three alternatives for the class type:
+
+A value of `command' indicates commands with arguments
+\(\"\\foo[bar]{baz}\").  The mandatory arguments in curly braces
+will get the face you specified.
+
+A value of `declaration' indicates declarations inside of TeX
+groups (\"{\\foo bar}\").  The content inside the braces,
+excluding the command, will get the face you specified.  In case
+the braces are missing, the face will be applied to the command
+itself.
+
+A value of `noarg' indicates commands without arguments
+\(\"\\foo\").  The command itself will get the face you
+specified.
+
+Setting this variable directly does not take effect;
+use \\[customize] or restart Emacs."
+  :group 'font-latex-keywords
+  :type `(repeat (list (string :tag "Name")
+                      (choice (repeat :tag "Keywords" (string :tag "Keyword"))
+                              (repeat
+                               :tag "Keywords with specs"
+                               (group (string :tag "Keyword")
+                                      (string :tag "Format specifier"))))
+                      ,(if (featurep 'xemacs)
+                           '(face :tag "Face name")
+                         '(choice (custom-face-edit :tag "Face attributes")
+                                  (face :tag "Face name")))
+                      (choice :tag "Type"
+                              ;; Maps to
+                              ;;`font-latex-match-command-with-arguments'
+                              (const :tag "Command with arguments"
+                                     command)
+                              ;; Maps to
+                              ;;`font-latex-match-command-in-braces'
+                              (const :tag "Declaration inside TeX group"
+                                     declaration)
+                              ;; Maps to `re-search-forward'
+                              (const :tag "Command without arguments"
+                                     noarg))))
+  :set (lambda (symbol value)
+        (dolist (item value)
+          (when (string-match " " (car item))
+            (error "No spaces allowed in name")))
+        (let (names names-uniq)
+          (dolist (item (append font-latex-built-in-keyword-classes value))
+            (setq names (append names (list (car item)))))
+          (setq names (TeX-sort-strings names))
+          (setq names-uniq (TeX-delete-duplicate-strings names))
+          (dotimes (i (safe-length names-uniq))
+            (unless (string= (nth i names) (nth i names-uniq))
+              (error "Name %S already exists" (nth i names)))))
+        (set-default symbol value)
+        (let ((prefix "font-latex-match-"))
+          (dolist (elt value)
+            (unless (boundp (intern (concat prefix (car elt))))
+              ;; defvar font-latex-match-*
+              (eval `(defvar ,(intern (concat prefix (car elt))) nil)))
+            (let ((keywords (nth 1 elt))
+                  single-char-macro-flag)
+              (setq keywords (if (listp (car keywords))
+                                 (mapcar 'car keywords)
+                               keywords))
+              (catch 'single-char
+                (dolist (keyword keywords)
+                  (unless (string-match "^[A-Za-z]" keyword)
+                    (setq single-char-macro-flag t)
+                    (throw 'single-char nil))))
+              (set (intern (concat prefix (car elt)))
+                   (when (> (safe-length keywords) 0)
+                   (concat "\\\\" (let ((max-specpdl-size 1000))
+                                    (regexp-opt keywords t))
+                           (unless single-char-macro-flag "\\>")))))))))
+
+(defun font-latex-make-user-keywords ()
+  "Build defuns and defvars for user keyword fontification."
+  (let ((keyword-specs font-latex-user-keyword-classes))
+    (dolist (item keyword-specs)
+      (let ((prefix "font-latex-match-")
+           (name (nth 0 item))
+           (keywords (nth 1 item))
+           (face (nth 2 item))
+           (type (nth 3 item)))
+
+       ;; defvar font-latex-match-*-keywords
+       (eval `(defvar ,(intern (concat prefix name "-keywords")) ',keywords
+                ,(concat "Font-latex keywords for " name " face.
+
+Generated by `font-latex-make-user-keywords'.")))
+
+       ;; defun font-latex-match-*
+       (eval `(font-latex-make-match-defun prefix name '',face type))
+
+       ;; Add the matcher to `font-latex-keywords-2'.
+       (add-to-list 'font-latex-keywords-2
+                    (font-latex-keyword-matcher prefix name face type) t))))
+
+  ;; Add the "fixed" matchers and highlighters.
+  (dolist (item
+          '(("\\(^\\|[^\\]\\)\\(&+\\)" 2 'font-latex-warning-face)
+            ("\\$\\$\\([^$]+\\)\\$\\$" 1 'font-latex-math-face)
+            (font-latex-match-quotation
+             (0 'font-latex-string-face append)
+             (1 'font-latex-warning-face))
+            ;; Hack to remove the verbatim face from the \ in
+            ;; \end{verbatim} and similar.  The same hack is used in
+            ;; tex-mode.el.
+            ("^[ \t]*\\(\\\\\\)end"
+             (1 (get-text-property (match-end 1) 'face) t))))
+    (add-to-list 'font-latex-keywords-1 item)
+    (add-to-list 'font-latex-keywords-2 item))
+  (dolist (item 
+          '((font-latex-match-math-env
+             (0 'font-latex-warning-face t t)
+             (1 'font-latex-math-face append t))
+            (font-latex-match-math-envII
+             (0 'font-latex-math-face append t))
+            (font-latex-match-simple-command
+             (0 'font-latex-sedate-face append))
+            (font-latex-match-script
+             (1 (font-latex-script (match-beginning 0)) append))))
+    (add-to-list 'font-latex-keywords-2 item t)))
+(font-latex-make-user-keywords)
+
+(defun font-latex-add-keywords (keywords class)
+  "Add KEYWORDS to CLASS.
+KEYWORDS is a list of keywords or keywords with syntax specs.
+CLASS corresponds to a keyword class and can be one of the
+symbols 'warning, 'variable, 'reference, 'function, sectioning-0,
+'sectioning-1, 'sectioning-2, 'sectioning-3, 'sectioning-4,
+'sectioning-5, 'slide-title, 'textual, 'bold-command,
+'italic-command, 'math-command, 'type-command, 'bold-declaration,
+'italic-declaration or 'type-declaration.
+
+The keywords will be added to the buffer-local list of keywords
+of the respective keyword class and necessary updates of the font
+locking machinery will be triggered."
+  (let* ((class (symbol-name class))
+        (list (intern (format "font-latex-match-%s-keywords-local" class))))
+    (dolist (elt keywords)
+      (add-to-list list elt))
+    (funcall (intern (format "font-latex-match-%s-make" class)))
+    (setq font-lock-set-defaults nil)
+    (font-lock-set-defaults)))
+
+(defvar font-latex-keywords font-latex-keywords-1
+  "Default expressions to highlight in TeX mode.")
+
+
+;;; Subscript and superscript
+
+(defcustom font-latex-fontify-script (not (featurep 'xemacs))
+  "If non-nil, fontify subscript and superscript strings.
+This feature does not work in XEmacs."
+  :type 'boolean
+  :group 'font-latex)
+(put 'font-latex-fontify-script 'safe-local-variable 'TeX-booleanp)
+
+(defcustom font-latex-script-display '((raise -0.3) . (raise 0.3))
+  "Display specification for subscript and superscript content.
+The car is used for subscript, the cdr is used for superscripts."
+  :group 'font-latex
+  :type '(cons (choice (sexp :tag "Subscript form")
+                      (const :tag "No lowering" nil))
+              (choice (sexp :tag "Superscript form")
+                      (const :tag "No raising" nil))))
+
+
+;;; Syntactic keywords
+
+(defvar font-latex-syntactic-keywords nil
+  "Syntactic keywords used by `font-latex'.")
+(make-variable-buffer-local 'font-latex-syntactic-keywords)
+
+(defvar font-latex-syntactic-keywords-extra nil
+  "List of syntactic keywords to add to `font-latex-syntactic-keywords'.
+The form should be the same as in `font-lock-syntactic-keywords'.")
+(make-variable-buffer-local 'font-latex-syntactic-keywords-extra)
+
+(defun font-latex-set-syntactic-keywords ()
+  "Set the variable `font-latex-syntactic-keywords'.
+This function can be used to refresh the variable in case other
+variables influencing its value, like `LaTeX-verbatim-environments',
+have changed."
+  ;; Checks for non-emptiness of lists added in order to cater for
+  ;; installations where `(regexp-opt-group nil)' would enter a loop.
+  (let ((verb-envs (and (fboundp 'LaTeX-verbatim-environments)
+                       (LaTeX-verbatim-environments)))
+       (verb-macros-with-delims
+        (and (fboundp 'LaTeX-verbatim-macros-with-delims)
+             (LaTeX-verbatim-macros-with-delims)))
+       (verb-macros-with-braces
+        (and (fboundp 'LaTeX-verbatim-macros-with-braces)
+             (LaTeX-verbatim-macros-with-braces))))
+    (setq verb-envs (and verb-envs (regexp-opt verb-envs))
+         verb-macros-with-delims (and verb-macros-with-delims
+                                      (regexp-opt verb-macros-with-delims))
+         verb-macros-with-braces (and verb-macros-with-braces
+                                      (regexp-opt verb-macros-with-braces))
+         font-latex-syntactic-keywords nil)
+    (unless (= (length verb-envs) 0)
+      (add-to-list 'font-latex-syntactic-keywords
+                  `(,(concat "^[ \t]*\\\\begin *{\\(?:" verb-envs
+                             "\\)}.*\\(\n\\)")
+                    (1 "|" t)))
+      (add-to-list 'font-latex-syntactic-keywords
+                  ;; Using the newline character for the syntax
+                  ;; property often resulted in fontification
+                  ;; problems when text was inserted at the end of
+                  ;; the verbatim environment.  That's why we now use
+                  ;; the starting backslash of \end.  There is a hack
+                  ;; in `font-latex-make-user-keywords' to remove the
+                  ;; spurious fontification of the backslash.
+                  `(,(concat "^[ \t]*\\(\\\\\\)end *{\\(?:" verb-envs "\\)}")
+                    (1 "|" t))))
+    (unless (= (length verb-macros-with-delims) 0)
+      (add-to-list 'font-latex-syntactic-keywords
+                  `(,(concat "\\\\\\(?:" verb-macros-with-delims "\\)"
+                             ;; An opening curly brace as delimiter
+                             ;; is valid, but allowing it might screw
+                             ;; up fontification of stuff like
+                             ;; "\url{...} foo \textbf{<--!...}".
+                             "\\([^a-z@*\n\f{]\\).*?"
+                             ;; Give an escape char at the end of the
+                             ;; verbatim construct punctuation syntax.
+                             ;; Prevents wrong fontification of stuff
+                             ;; like "\verb|foo\|".
+                             "\\(" (regexp-quote TeX-esc) "*\\)\\(\\1\\)")
+                    (1 "\"") (2 ".") (3 "\""))))
+    (unless (= (length verb-macros-with-braces) 0)
+      (add-to-list 'font-latex-syntactic-keywords
+                  `(,(concat "\\\\\\(?:" verb-macros-with-braces "\\)"
+                             "\\({\\).*?[^\\]\\(?:\\\\\\\\\\)*\\(}\\)")
+                    (1 "|") (2 "|")))))
+  (when font-latex-syntactic-keywords-extra
+    (nconc font-latex-syntactic-keywords font-latex-syntactic-keywords-extra))
+  ;; Cater for docTeX mode.
+  (setq font-latex-doctex-syntactic-keywords
+       (append font-latex-syntactic-keywords
+               ;; For docTeX comment-in-doc.
+               `(("\\(\\^\\)\\^A" (1 (font-latex-doctex-^^A)))))))
+
+
+;;; Syntactic fontification
+
+;; Copy and adaptation of `tex-font-lock-syntactic-face-function' in
+;; `tex-mode.el' of CVS Emacs (March 2004)
+(defun font-latex-syntactic-face-function (state)
+  (let ((char (nth 3 state)))
+    (cond
+     ((not char) 'font-lock-comment-face)
+     ((eq char ?$) 'font-latex-math-face)
+     (t
+      (when (char-valid-p char)
+       ;; This is a \verb?...? construct.  Let's find the end and mark it.
+       (save-excursion
+         (skip-chars-forward (string ?^ char)) ;; Use `end' ?
+         (when (eq (char-syntax (preceding-char)) ?/)
+           (put-text-property (1- (point)) (point) 'syntax-table '(1)))
+         (unless (eobp)
+           (put-text-property (point) (1+ (point)) 'syntax-table '(7)))))
+      'font-latex-verbatim-face))))
+
+
+;;; Faces
+
+(defface font-latex-bold-face
+  (let ((font (cond ((assq :inherit custom-face-attributes) '(:inherit bold))
+                   ((assq :weight custom-face-attributes) '(:weight bold))
+                   (t '(:bold t)))))
+    `((((class grayscale) (background light))
+       (:foreground "DimGray" ,@font))
+      (((class grayscale) (background dark))
+       (:foreground "LightGray" ,@font))
+      (((class color) (background light))
+       (:foreground "DarkOliveGreen" ,@font))
+      (((class color) (background dark))
+       (:foreground "OliveDrab" ,@font))
+      (t (,@font))))
+  "Face used to highlight text to be typeset in bold."
+  :group 'font-latex-highlighting-faces)
+
+(defface font-latex-italic-face
+  (let ((font (cond ((assq :inherit custom-face-attributes) '(:inherit italic))
+                   ((assq :slant custom-face-attributes) '(:slant italic))
+                   (t '(:italic t)))))
+    `((((class grayscale) (background light))
+       (:foreground "DimGray" ,@font))
+      (((class grayscale) (background dark))
+       (:foreground "LightGray" ,@font))
+      (((class color) (background light))
+       (:foreground "DarkOliveGreen" ,@font))
+      (((class color) (background dark))
+       (:foreground "OliveDrab" ,@font))
+      (t (,@font))))
+  "Face used to highlight text to be typeset in italic."
+  :group 'font-latex-highlighting-faces)
+
+(defface font-latex-math-face
+  (let ((font (cond ((assq :inherit custom-face-attributes)
+                    '(:inherit underline))
+                   (t '(:underline t)))))
+    `((((class grayscale) (background light))
+       (:foreground "DimGray" ,@font))
+      (((class grayscale) (background dark))
+       (:foreground "LightGray" ,@font))
+      (((class color) (background light))
+       (:foreground "SaddleBrown"))
+      (((class color) (background dark))
+       (:foreground "burlywood"))
+      (t (,@font))))
+  "Face used to highlight math."
+  :group 'font-latex-highlighting-faces)
+
+(defface font-latex-sedate-face
+  '((((class grayscale) (background light)) (:foreground "DimGray"))
+    (((class grayscale) (background dark))  (:foreground "LightGray"))
+    (((class color) (background light)) (:foreground "DimGray"))
+    (((class color) (background dark))  (:foreground "LightGray"))
+   ;;;(t (:underline t))
+    )
+  "Face used to highlight sedate stuff."
+  :group 'font-latex-highlighting-faces)
+
+(defface font-latex-string-face
+  (let ((font (cond ((assq :inherit custom-face-attributes) '(:inherit italic))
+                   ((assq :slant custom-face-attributes) '(:slant italic))
+                   (t '(:italic t)))))
+    `((((type tty) (class color))
+       (:foreground "green"))
+      (((class grayscale) (background light))
+       (:foreground "DimGray" ,@font))
+      (((class grayscale) (background dark))
+       (:foreground "LightGray" ,@font))
+      (((class color) (background light))
+       (:foreground "RosyBrown"))
+      (((class color) (background dark))
+       (:foreground "LightSalmon"))
+      (t (,@font))))
+  "Face used to highlight strings."
+  :group 'font-latex-highlighting-faces)
+
+(defface font-latex-warning-face
+  (let ((font (cond ((assq :inherit custom-face-attributes) '(:inherit bold))
+                   ((assq :weight custom-face-attributes) '(:weight bold))
+                   (t '(:bold t)))))
+    `((((class grayscale)(background light))
+       (:foreground "DimGray" ,@font))
+      (((class grayscale)(background dark))
+       (:foreground "LightGray" ,@font))
+      (((class color)(background light))
+       (:foreground "red" ,@font))
+      (((class color)(background dark))
+       (:foreground "red" ,@font))
+      (t (,@font))))
+  "Face for important keywords."
+  :group 'font-latex-highlighting-faces)
+
+(defface font-latex-verbatim-face
+  (let ((font (if (and (assq :inherit custom-face-attributes)
+                      (if (featurep 'xemacs)
+                          (find-face 'fixed-pitch)
+                        (facep 'fixed-pitch)))
+                 '(:inherit fixed-pitch)
+               '(:family "courier"))))
+    `((((class grayscale) (background light))
+        (:foreground "DimGray" ,@font))
+       (((class grayscale) (background dark))
+        (:foreground "LightGray" ,@font))
+       (((class color) (background light))
+        (:foreground "SaddleBrown" ,@font))
+       (((class color) (background dark))
+        (:foreground "burlywood" ,@font))
+       (t (,@font))))
+  "Face used to highlight TeX verbatim environments."
+  :group 'font-latex-highlighting-faces)
+
+(defface font-latex-superscript-face
+  '((t (:height 0.8)))
+  "Face used for superscripts."
+  :group 'font-latex-highlighting-faces)
+
+(defface font-latex-subscript-face
+  '((t (:height 0.8)))
+  "Face used for subscripts."
+  :group 'font-latex-highlighting-faces)
+
+(defface font-latex-slide-title-face
+  (let* ((scale 1.2)
+        (size (when (featurep 'xemacs)
+                (round (* 0.9 (face-height 'default) scale)))))
+    (if (featurep 'xemacs)
+       `((t (:bold t :family "helvetica" :size ,size)))
+      `((t (:inherit (variable-pitch font-lock-type-face)
+                    :weight bold :height ,scale)))))
+  "Face for slide titles."
+  :group 'font-latex-highlighting-faces)
+(when (featurep 'xemacs)
+  (set-face-parent 'font-latex-slide-title-face 'font-lock-type-face
+                  nil nil 'append))
+
+
+;;; Setup
+
+(defvar font-lock-comment-start-regexp nil
+  "Regexp to match the start of a comment.")
+
+(defvar font-latex-extend-region-functions nil
+  "List of functions extending the region for multiline constructs.
+
+Each function should accept two arguments, the begin and end of
+the region to be fontified, and return the new region start.  If
+no extension is necessary, the original region start should be
+returned.
+
+All specified functions will be called and the region extended
+backwards to the minimum over their return values.")
+
+(defvar font-latex-syntax-alist
+  ;; Use word syntax for @ because we use \> for matching macros and
+  ;; we don't want \foo@bar to be found if we search for \foo.
+  '((?\( . ".") (?\) . ".") (?$ . "\"") (?@ . "w"))
+  "List of specifiers for the syntax alist of `font-lock-defaults'.")
+
+(defun font-latex-add-to-syntax-alist (list)
+  "Activate syntactic font locking for the entries in LIST.
+The entries are added to `font-latex-syntax-alist' and eventually
+end up in `font-lock-defaults'.  Each entry in LIST should be a
+cons pair as expected by `font-lock-defaults'.  The function also
+triggers Font Lock to recognize the change."
+  (make-local-variable 'font-latex-syntax-alist)
+  (nconc font-latex-syntax-alist list)
+;; FIXME: Are there situations where we need to alter `font-lock-defaults'
+;; directly?
+;;   (dolist (entry list)
+;;     (setcar (cdddr font-lock-defaults)
+;;         (cons entry (cadddr font-lock-defaults))))
+  ;; Tell font-lock about the update.
+  (setq font-lock-set-defaults nil)
+  (font-lock-set-defaults))
+
+;;;###autoload
+(defun font-latex-setup ()
+  "Setup this buffer for LaTeX font-lock.  Usually called from a hook."
+  (font-latex-set-syntactic-keywords)
+  ;; Trickery to make $$ fontification be in `font-latex-math-face' while
+  ;; strings get whatever `font-lock-string-face' has been set to.
+  (when (fboundp 'built-in-face-specifiers)
+    ;; Cool patch from Christoph Wedler...
+    (let (instance)
+      (mapc (lambda (property)
+             (setq instance
+                   (face-property-instance 'font-latex-math-face property
+                                           nil 0 t))
+             (if (numberp instance)
+                 (setq instance
+                       (face-property-instance 'default property nil 0)))
+             (or (numberp instance)
+                 (set-face-property 'font-lock-string-face property
+                                    instance (current-buffer))))
+           (built-in-face-specifiers))))
+
+  ;; Activate multi-line fontification facilities if available.
+  (when (boundp 'font-lock-multiline)
+    (set (make-local-variable 'font-lock-multiline) t))
+
+  ;; Functions for extending the region.
+  (dolist (elt '(font-latex-extend-region-backwards-command-with-args
+                font-latex-extend-region-backwards-command-in-braces
+                font-latex-extend-region-backwards-quotation
+                font-latex-extend-region-backwards-math-env
+                font-latex-extend-region-backwards-math-envII))
+    (add-to-list 'font-latex-extend-region-functions elt))
+
+  ;; Tell Font Lock about the support.
+  (make-local-variable 'font-lock-defaults)
+  ;; The test for `major-mode' currently only works with docTeX mode
+  ;; because `TeX-install-font-lock' is called explicitely in
+  ;; `doctex-mode'.  In case other modes have to be distinguished as
+  ;; well, remove the call to `TeX-install-font-lock' from
+  ;; `VirTeX-common-initialization' and place it in the different
+  ;; `xxx-mode' calls instead, but _after_ `major-mode' is set.
+  (let ((defaults
+        `((font-latex-keywords font-latex-keywords-1 font-latex-keywords-2)
+          nil nil ,font-latex-syntax-alist nil))
+       (variables
+        '((font-lock-comment-start-regexp . "%")
+          (font-lock-mark-block-function . mark-paragraph)
+          (font-lock-fontify-region-function
+           . font-latex-fontify-region)
+          (font-lock-unfontify-region-function
+           . font-latex-unfontify-region))))
+    ;; Add the mode-dependent stuff to the basic variables defined above.
+    (if (eq major-mode 'doctex-mode)
+       (progn
+         (setcar defaults (append (car defaults)
+                                  '(font-latex-doctex-keywords)))
+         (setq variables
+               (append variables
+                       '((font-lock-syntactic-face-function
+                          . font-latex-doctex-syntactic-face-function)
+                         (font-lock-syntactic-keywords
+                          . font-latex-doctex-syntactic-keywords)))))
+      (setq variables
+           (append variables
+                   '((font-lock-syntactic-face-function
+                      . font-latex-syntactic-face-function)
+                     (font-lock-syntactic-keywords
+                      . font-latex-syntactic-keywords)))))
+    ;; Cater for the idiosyncrasies of Emacs and XEmacs.
+    (if (featurep 'xemacs)
+       (progn
+         ;; XEmacs does not set these variables via `font-lock-defaults'
+         ;; but requires them to be set explicitely.
+         (mapc (lambda (alist)
+                 (set (car alist) (cdr alist))) variables)
+         ;; Has to be set to t as otherwise syntax properties will not be
+         ;; be picked up during fontification.
+         (set (make-local-variable 'lookup-syntax-properties) t))
+      (setq defaults (append defaults variables)))
+    ;; Set the defaults.
+    (setq font-lock-defaults defaults)))
+
+(defun font-latex-jit-lock-force-redisplay (buf start end)
+  "Compatibility for Emacsen not offering `jit-lock-force-redisplay'."
+  (if (fboundp 'jit-lock-force-redisplay)
+      (jit-lock-force-redisplay buf start end)
+    ;; The following block is an expansion of `jit-lock-force-redisplay'
+    ;; and involved macros taken from CVS Emacs on 2007-04-28.
+    (with-current-buffer buf
+      (let ((modified (buffer-modified-p)))
+       (unwind-protect
+           (let ((buffer-undo-list t)
+                 (inhibit-read-only t)
+                 (inhibit-point-motion-hooks t)
+                 (inhibit-modification-hooks t)
+                 deactivate-mark
+                 buffer-file-name
+                 buffer-file-truename)
+             (put-text-property start end 'fontified t))
+         (unless modified
+           (restore-buffer-modified-p nil)))))))
+
+(defun font-latex-fontify-region (beg end &optional loudly)
+  "Fontify region from BEG to END.
+If optional argument is non-nil, print status messages."
+  (let ((extend-list (delq nil (mapcar (lambda (fun) (funcall fun beg end))
+                                      font-latex-extend-region-functions))))
+    (when extend-list
+      (let ((orig-beg beg))
+       (setq beg (apply 'min extend-list))
+       (when (featurep 'jit-lock)
+         ;; Stolen from `jit-lock-fontify-now' (2007-04-27) and
+         ;; adapted.  Without this stanza only the line in which a
+         ;; change happened will refontified.  The rest will only be
+         ;; refontified upon redisplay.
+         (run-with-timer 0 nil 'font-latex-jit-lock-force-redisplay
+                         (current-buffer) beg orig-beg))))
+    (font-lock-default-fontify-region beg end loudly)))
+
+;; Copy and adaption of `tex-font-lock-unfontify-region' from
+;; tex-mode.el in GNU Emacs on 2004-08-04.
+;; (XEmacs passes a third argument to the function.)
+(defun font-latex-unfontify-region (beg end &rest ignored)
+  "Unfontify region from BEG to END."
+  (font-lock-default-unfontify-region beg end)
+  ;; XEmacs does not provide `font-lock-extra-managed-props', so
+  ;; remove the `font-latex-multiline' property manually.  (The
+  ;; property is only added if `font-lock-multiline' is bound.)
+  (unless (boundp 'font-lock-multiline)
+    (remove-text-properties beg end '(font-latex-multiline)))
+  (while (< beg end)
+    (let ((next (next-single-property-change beg 'display nil end))
+         (prop (get-text-property beg 'display)))
+      (if (and (eq (car-safe prop) 'raise)
+              (member (car-safe (cdr prop))
+                      (list (nth 1 (car font-latex-script-display))
+                            (nth 1 (cdr font-latex-script-display))))
+              (null (cddr prop)))
+         (put-text-property beg next 'display nil))
+      (setq beg next))))
+
+(defadvice font-lock-after-change-function (before font-latex-after-change
+                                                  activate)
+  "Extend region for fontification of multiline constructs.
+This is only necessary if the editor does not provide multiline
+fontification facilities like `font-lock-multiline' itself."
+  (unless (boundp 'font-lock-multiline)
+    (let ((ad-beg (ad-get-arg 0))
+         (ad-end (ad-get-arg 1)))
+      (save-excursion
+       (goto-char ad-beg)
+       (beginning-of-line)
+       (when (get-text-property (point) 'font-latex-multiline)
+         (setq ad-beg (previous-single-property-change (point)
+                                                       'font-latex-multiline))
+         (when (numberp ad-beg)
+           (ad-set-arg 0 ad-beg)))
+       (goto-char ad-end)
+       (end-of-line)
+       (when (get-text-property (point) 'font-latex-multiline)
+         (setq ad-end (next-single-property-change (point)
+                                                   'font-latex-multiline))
+         (when (numberp ad-end)
+           (ad-set-arg 1 ad-end)))))))
+
+
+;;; Utility functions
+
+(defun font-latex-find-matching-close (openchar closechar)
+  "Skip over matching pairs of OPENCHAR and CLOSECHAR.
+OPENCHAR is the opening character and CLOSECHAR is the closing
+character.  Character pairs are usually { } or [ ].  Comments are
+ignored during the search."
+  (let ((parse-sexp-ignore-comments
+        (not (eq major-mode 'doctex-mode))) ; scan-sexps ignores comments
+        (init-point (point))
+       (mycount 1)
+       (esc-char (or (and (boundp 'TeX-esc) TeX-esc) "\\"))
+       ;; XXX: Do not look up syntax-table properties since they may
+       ;; be misleading, e.g. in the case of "{foo}^^A" where the
+       ;; closing brace gets a comment end syntax.
+       (parse-sexp-lookup-properties nil))
+    (or
+     (condition-case nil
+        (progn
+          (goto-char (with-syntax-table
+                         (TeX-search-syntax-table openchar closechar)
+                       (scan-sexps (point) 1)))
+          ;; No error code.  See if closechar is unquoted
+          (save-excursion
+            (backward-char 1)
+            (zerop (mod (skip-chars-backward (regexp-quote esc-char)) 2))))
+       (error nil))
+     (save-match-data
+       (goto-char (1+ init-point))
+       (while (and (> mycount 0)
+                  (re-search-forward
+                   (string ?\[
+                           ;; closechar might be ]
+                           ;; and therefor must be first in regexp
+                           closechar openchar
+                           ?\])
+                   nil t))
+        (cond
+         ((font-latex-commented-outp)
+          (forward-line 1))
+         ((save-excursion
+            (backward-char 1)
+            (zerop (mod (skip-chars-backward (regexp-quote esc-char))
+                        2)))
+          (setq mycount (+ mycount
+                           (if (= (preceding-char) openchar) 1 -1)))))))
+     (if (= mycount 0)
+        t
+       (goto-char init-point)
+       nil))))
+
+(defun font-latex-commented-outp ()
+  "Return t if comment character is found between bol and point."
+  (save-excursion
+    (let ((limit (point))
+         (esc-char (if (and (boundp 'TeX-esc) TeX-esc) TeX-esc "\\")))
+      (forward-line 0)
+      (if (and (eq (char-after) ?\%)
+              (not (font-latex-faces-present-p 'font-latex-verbatim-face)))
+         (not (eq major-mode 'doctex-mode))
+       (catch 'found
+         (while (progn (skip-chars-forward "^%" limit)
+                       (< (point) limit))
+           (when (and (save-excursion
+                        (zerop (mod (skip-chars-backward
+                                     (regexp-quote esc-char)) 2)))
+                      (not (font-latex-faces-present-p
+                            'font-latex-verbatim-face)))
+             (throw 'found t))
+           (forward-char)))))))
+
+(defun font-latex-faces-present-p (faces &optional pos)
+  "Return t if FACES are present at position POS.
+FACES may be a single face or a list of faces.
+If POS is omitted, the current position of point is used."
+  (let* ((faces (if (listp faces) faces (list faces)))
+        (pos (or pos (point)))
+        (prop (get-text-property pos 'face))
+        (prop-list (if (listp prop) prop (list prop))))
+    (catch 'member
+      (dolist (item prop-list)
+       (when (memq item faces)
+         (throw 'member t))))))
+
+(defun font-latex-forward-comment ()
+  "Like `forward-comment' but with special provisions for docTeX mode.
+In docTeX mode \"%\" at the start of a line will be treated as whitespace."
+  (if (eq major-mode 'doctex-mode)
+      ;; XXX: We should probably cater for ^^A as well.
+      (progn
+       (while (progn (if (bolp) (skip-chars-forward "%"))
+                     (> (skip-chars-forward " \t\n") 0)))
+       (when (eq (char-after) ?%)
+         (beginning-of-line 2)
+         t))
+    (forward-comment 1)))
+
+(defun font-latex-put-multiline-property-maybe (beg end)
+  "Add a multiline property if no equivalent is provided by the editor.
+The text property is used to find the start or end of a multiline
+construct when unfontifying a region.  Emacs adds such a text
+property automatically if `font-lock-multiline' is set to t and
+extends the region to be unfontified automatically as well.
+XEmacs does not do this at the time of this writing."
+  (unless (boundp 'font-lock-multiline)
+    (put-text-property beg end 'font-latex-multiline t)))
+
+
+;;; Match functions
+
+(defvar font-latex-matched-faces nil
+  "List of faces corresponding to matches in match data.")
+
+(defun font-latex-matched-face (pos)
+  "Return face at position POS in `font-latex-matched-faces'."
+  (nth pos font-latex-matched-faces))
+
+(defvar font-latex-command-with-args-default-spec nil ; "*[{"
+  "Default specifier for keywords without syntax description.
+Set this to nil if verification of command syntax is unwanted.")
+
+(defvar font-latex-command-with-args-opt-arg-delims
+  '((?[ . ?]) (?< . ?>) (?\( . ?\)))
+  "List character pairs used as delimiters for optional arguments.")
+
+(defvar font-latex-syntax-error-modes '(latex-mode)
+  "List of modes where syntax errors in macros should be indicated.")
+
+(defun font-latex-match-command-with-arguments (regexp keywords face limit)
+  "Search for regexp command KEYWORDS[opt]{arg} before LIMIT.
+Returns nil if none of KEYWORDS is found."
+  (setq font-latex-matched-faces nil)
+  (catch 'match
+    (while (re-search-forward regexp limit t)
+      (unless (font-latex-faces-present-p '(font-lock-comment-face
+                                           font-latex-verbatim-face)
+                                         (match-beginning 0))
+       (let* ((beg (match-beginning 0))
+              end                 ; Used for multiline text property.
+              match-data match-beg syntax-error alternative spec
+              error-indicator-pos
+              (spec-list (string-to-list
+                          (or (cadr (assoc (match-string 1) keywords))
+                              font-latex-command-with-args-default-spec)))
+              (parse-sexp-ignore-comments t)) ; scan-sexps ignores comments
+         (add-to-list 'match-data beg)
+         (goto-char (match-end 0))
+         ;; Check for starred macro if first spec is an asterisk.
+         (when (eq (car spec-list) ?*)
+           (setq spec-list (cdr spec-list))
+           (skip-chars-forward "*" (1+ (point))))
+         ;; Add current point to match data and use keyword face for
+         ;; region from start to point.
+         (add-to-list 'match-data (point) t)
+         (add-to-list 'font-latex-matched-faces 'font-lock-keyword-face)
+         (setq end (point))
+         (catch 'break
+           ;; Walk the list of specs.
+           (while spec-list
+             (setq spec (pop spec-list)
+                   error-indicator-pos beg)
+             (while (and (not (eobp)) (font-latex-forward-comment)))
+             ;; Alternative
+             (when (eq spec ?|)
+               (setq alternative t)
+               (setq spec (pop spec-list)))
+             (cond
+              ;; Macros: \foo
+              ((eq spec ?\\)
+               (if (eq (char-after) spec)
+                   (progn
+                     (nconc match-data
+                            (list (point)
+                                  (progn
+                                    (forward-char)
+                                    (if (zerop (skip-chars-forward "A-Za-z@"))
+                                        (forward-char) ; Single-char macro.
+                                      (skip-chars-forward "*"))
+                                    (point))))
+                     (nconc font-latex-matched-faces (list face))
+                     (setq end (max end (point)))
+                     (when alternative (pop spec-list)))
+                 (setq syntax-error t)
+                 (throw 'break nil)))
+              ;; Mandatory arguments: {...}
+              ((eq spec ?{)
+               (if (and (eq (char-after) spec)
+                        (setq match-beg (point))
+                        (font-latex-find-matching-close ?{ ?}))
+                   (progn
+                     (nconc match-data (list (1+ match-beg) (1- (point))))
+                     (nconc font-latex-matched-faces (list face))
+                     (setq end (max end (1- (point))))
+                     (when alternative (pop spec-list)))
+                 (unless alternative
+                   (setq syntax-error t)
+                   (when (and match-beg (= match-beg (point)))
+                     (setq error-indicator-pos match-beg))
+                   (throw 'break nil))))
+              ;; Optional arguments: [...] and others
+              ((eq (char-after) spec)
+               (setq match-beg (point))
+               (if (font-latex-find-matching-close
+                    spec (cdr (assq
+                               spec
+                               font-latex-command-with-args-opt-arg-delims)))
+                   (progn
+                     (nconc match-data (list (1+ match-beg) (1- (point))))
+                     (nconc font-latex-matched-faces
+                            (list 'font-lock-variable-name-face))
+                     (setq end (max end (1- (point)))))
+                 (setq syntax-error t
+                       error-indicator-pos match-beg)
+                 (throw 'break nil))))
+             (setq alternative nil)))
+         (when (and syntax-error (memq major-mode
+                                       font-latex-syntax-error-modes))
+           ;; Add the warning face at the front of the list because
+           ;; the matcher uses 'append and the face would otherwise
+           ;; be overridden by the keyword face.
+           (setq match-data (append (list error-indicator-pos
+                                          (1+ error-indicator-pos))
+                                    match-data))
+           (push 'font-latex-warning-face font-latex-matched-faces))
+         (font-latex-put-multiline-property-maybe beg end)
+         (store-match-data match-data)
+         (throw 'match t))))))
+
+(defun font-latex-extend-region-backwards-command-with-args (beg end)
+  "Return position to extend region backwards for commands with args.
+Return nil if region does not have to be extended for a multiline
+macro to fit in.  The region between the positions BEG and END
+marks boundaries for searching for macro ends."
+  (save-excursion
+    (goto-char end)
+    (catch 'extend
+      (while (TeX-search-backward-unescaped "}" beg t)
+       (let ((macro-start (TeX-find-macro-start
+                           (max (point-min)
+                                (- beg font-latex-multiline-boundary)))))
+         (when (and macro-start
+                    (< macro-start beg))
+           (throw 'extend macro-start))))
+      nil)))
+
+(defun font-latex-match-command-in-braces (keywords limit)
+  "Search for command like {\\bfseries fubar} before LIMIT.
+Sets `match-data' so that:
+ subexpression 0 is a warning indicator,
+ subexpression 1 is the keyword, and
+ subexpression 2 is the rest in the TeX group.
+Returns nil if no command is found."
+  (catch 'match
+    (while (re-search-forward keywords limit t)
+      (unless (font-latex-faces-present-p '(font-lock-comment-face
+                                           font-latex-verbatim-face)
+                                         (match-beginning 0))
+       (let ((kbeg (match-beginning 0)) (kend (match-end 1))
+             (beg  (match-end 0))
+             end cbeg cend
+             (parse-sexp-ignore-comments t)) ; scan-sexps ignores comments
+         (goto-char kbeg)
+         (if (not (eq (preceding-char) ?\{))
+             ;; Fontify only the keyword (no argument found).
+             (progn
+               (setq cbeg kbeg cend kend)
+               (goto-char (match-end 0))
+               (store-match-data (list (point) (point)
+                                       (point) (point)
+                                       cbeg cend))
+               (throw 'match t))
+           ;; There's an opening bracket
+           (save-restriction
+             ;; Restrict to LIMIT.
+             (narrow-to-region (point-min) limit)
+             (forward-char -1)         ; Move on the opening bracket
+             (if (font-latex-find-matching-close ?\{ ?\})
+                 (progn
+                   (font-latex-put-multiline-property-maybe beg (1- (point)))
+                   (store-match-data (list kbeg kbeg
+                                           kbeg kend
+                                           beg (1- (point)))))
+               (goto-char kend)
+               (store-match-data (list (1- kbeg) kbeg
+                                       kbeg kend
+                                       kend kend)))
+             (throw 'match t))))))))
+
+(defun font-latex-extend-region-backwards-command-in-braces (beg end)
+  "Return position to extend region backwards for commands in braces.
+Return nil if region does not have to be extended for a multiline
+group to fit in.  The region between the positions BEG and END
+marks boundaries for searching for group ends."
+  (save-excursion
+    (goto-char end)
+    (catch 'extend
+      (while (TeX-search-backward-unescaped "}" beg t)
+       (let ((group-start (TeX-find-opening-brace
+                           nil (max (point-min)
+                                    (- beg font-latex-multiline-boundary)))))
+         (when group-start
+           ;; XXX: Actually we'd have to check if any of the
+           ;; declaration-type macros can be found right after the
+           ;; brace.  If we don't do this (like now) large regions
+           ;; may be refontified for no good reason.  For checking
+           ;; the built-in `font-latex-match-*' variables for
+           ;; declaration-type macros as well as the respective
+           ;; user-defined variables could be concatenated.
+           (goto-char group-start)
+           (when (< group-start beg)
+             (throw 'extend group-start)))))
+      nil)))
+
+(defun font-latex-match-simple-command (limit)
+  "Search for command like \\foo before LIMIT."
+  (TeX-re-search-forward-unescaped "\\\\[@A-Za-z]+" limit t))
+
+(defun font-latex-match-math-env (limit)
+  "Match math pattern up to LIMIT.
+Used for patterns like:
+\\( F = ma \\)
+\\[ F = ma \\] but not \\\\ [len]"
+  (catch 'match
+    (while (re-search-forward "\\(\\\\(\\)\\|\\(\\\\\\[\\)" limit t)
+      (unless (save-excursion
+               (goto-char (match-beginning 0))
+               ;; \\[ does not start a math environment
+               (/= (mod (skip-chars-backward "\\\\") 2) 0))
+       (let ((beg (match-beginning 0))
+             (open-tag (if (match-beginning 1) "\\(" "\\["))
+             (close-tag (if (match-beginning 1) "\\)" "\\]")))
+         ;; Search for both opening and closing tags in order to be
+         ;; able to avoid erroneously matching stuff like "\(foo \(bar\)".
+         (if (and (re-search-forward (concat "[^\\]\\(?:\\\\\\\\\\)*\\("
+                                             (regexp-quote open-tag) "\\|"
+                                             (regexp-quote close-tag) "\\)")
+                                     limit 'move)
+                  (string= (match-string 1) close-tag))
+             ;; Found closing tag.
+             (progn
+               (font-latex-put-multiline-property-maybe beg (point))
+               (store-match-data (list beg beg beg (point))))
+           ;; Did not find closing tag.
+           (goto-char (+ beg 2))
+           (store-match-data (list beg (point) (point) (point))))
+         (throw 'match t))))))
+
+(defun font-latex-extend-region-backwards-math-env (beg end)
+  "Return position to extend region backwards for math environments.
+Return nil if region does not have to be extended for a multiline
+environment to fit in.  The region between the positions BEG and
+END marks boundaries for searching for environment ends."
+  (save-excursion
+    (goto-char end)
+    (catch 'extend
+      (while (re-search-backward "\\(\\\\)\\)\\|\\(\\\\]\\)" beg t)
+       (when (and (zerop (mod (skip-chars-backward "\\\\") 2))
+                  (re-search-backward
+                   (concat "[^\\]\\(?:\\\\\\\\\\)*\\("
+                           (regexp-quote (if (match-beginning 1) "\\(" "\\["))
+                           "\\)")
+                   (- beg font-latex-multiline-boundary) t)
+                  (goto-char (match-beginning 1))
+                  (< (point) beg))
+         (throw 'extend (point))))
+      nil)))
+
+(defcustom font-latex-math-environments
+  '("display" "displaymath" "equation" "eqnarray" "gather" "multline"
+    "align" "alignat" "xalignat")
+  "List of math environment names for font locking."
+  :type '(repeat string)
+  :group 'font-latex)
+
+(defun font-latex-match-math-envII (limit)
+  "Match math patterns up to LIMIT.
+Used for patterns like:
+\\begin{equation}
+ fontified stuff
+\\end{equation}
+The \\begin{equation} and \\end{equation} are not fontified here."
+  (when (re-search-forward (concat "\\\\begin[ \t]*{"
+                                  (regexp-opt font-latex-math-environments t)
+                                  "\\*?}")
+                          limit t)
+    (let ((beg (match-end 0)) end)
+      (if (re-search-forward (concat "\\\\end[ \t]*{"
+                                    (regexp-quote
+                                     (buffer-substring-no-properties
+                                      (match-beginning 1)
+                                      (match-end 0))))
+                            ;; XXX: Should this rather be done by
+                            ;; extending the region to be fontified?
+                            (+ limit font-latex-multiline-boundary) 'move)
+          (setq end (match-beginning 0))
+       (goto-char beg)
+        (setq end beg))
+      (font-latex-put-multiline-property-maybe beg end)
+      (store-match-data (list beg end))
+      t)))
+
+(defun font-latex-extend-region-backwards-math-envII (beg end)
+  "Return position to extend region backwards for math environments.
+Return nil if region does not have to be extended for a multiline
+environment to fit in.  The region between the positions BEG and
+END marks boundaries for searching for environment ends."
+  (save-excursion
+    (goto-char end)
+    (catch 'extend
+      (while (re-search-backward
+             (concat "\\\\end[ \t]*{"
+                     (regexp-opt font-latex-math-environments t)
+                     "\\*?}") beg t)
+       (when (and (re-search-backward (concat  "\\\\begin[ \t]*{"
+                                               (buffer-substring-no-properties
+                                                (match-beginning 1)
+                                                (match-end 0)))
+                                      (- beg font-latex-multiline-boundary) t)
+                  (< (point) beg))
+         (throw 'extend (point))))
+      nil)))
+
+(defun font-latex-update-quote-list ()
+  "Update quote list and regexp if value of `font-latex-quotes' changed."
+  (unless (eq font-latex-quotes-control font-latex-quotes)
+    (setq font-latex-quotes-control font-latex-quotes)
+    (font-latex-quotes-set-internal)
+    ;; Set order of each entry in `font-latex-quote-list' according to
+    ;; setting of `font-latex-quotes-internal'.
+    (let ((tail font-latex-quote-list)
+         elt)
+      (while tail
+       (setq elt (car tail))
+       (when (and (> (safe-length elt) 2)
+                  (not (eq (nth 2 elt) font-latex-quotes-internal)))
+         (setcar tail (list (nth 1 elt) (nth 0 elt)
+                            font-latex-quotes-internal)))
+       (setq tail (cdr tail))))
+    (setq font-latex-quote-regexp-beg
+         (regexp-opt (mapcar 'car font-latex-quote-list) t))))
+
+(defun font-latex-match-quotation (limit)
+  "Match quote patterns up to LIMIT.
+Used for patterns like:
+``this is a normal quote'' and these are multilingual quoted strings:
+\"< french \"> and \"`german\"' quotes.
+The quotes << french >> and 8-bit french are used if `font-latex-quotes' is
+set to french, and >>german<< (and 8-bit) are used if set to german."
+  (when font-latex-quotes
+    (font-latex-update-quote-list)
+    ;; Search for matches.
+    (catch 'match
+      (while (TeX-re-search-forward-unescaped
+             font-latex-quote-regexp-beg limit t)
+       (unless (font-latex-faces-present-p '(font-lock-comment-face
+                                             font-latex-verbatim-face
+                                             font-latex-math-face)
+                                           (match-beginning 0))
+         (let* ((beg (match-beginning 0))
+                (after-beg (match-end 0))
+                (opening-quote (match-string 0))
+                (closing-quote
+                 (nth 1 (assoc (if (fboundp 'string-make-multibyte)
+                                   (string-make-multibyte (match-string 0))
+                                 (match-string 0))
+                               font-latex-quote-list)))
+                (nest-count 0)
+                (point-of-surrender (+ beg font-latex-multiline-boundary)))
+           ;; Find closing quote taking nested quotes into account.
+           (while (progn
+                    (re-search-forward
+                     (concat opening-quote "\\|" closing-quote)
+                     point-of-surrender 'move)
+                    (when (and (< (point) point-of-surrender) (not (eobp)))
+                      (if (string= (match-string 0) opening-quote)
+                          (setq nest-count (1+ nest-count))
+                        (when (/= nest-count 0)
+                          (setq nest-count (1- nest-count)))))))
+           ;; If no closing quote was found, set the second match which
+           ;; will be marked with warning color, if one was found, set
+           ;; the first match which will be marked with string color.
+           (if (or (= (point) point-of-surrender) (eobp))
+               (progn
+                 (goto-char after-beg)
+                 (store-match-data (list after-beg after-beg beg after-beg)))
+             (font-latex-put-multiline-property-maybe beg (point))
+             (store-match-data (list beg (point) (point) (point))))
+           (throw 'match t)))))))
+
+(defun font-latex-extend-region-backwards-quotation (beg end)
+  "Return position to extend region backwards for quotations.
+Return nil if region does not have to be extended for a multiline
+quotation to fit in.  The region between the positions BEG and
+END marks boundaries for searching for quotation ends."
+  (if font-latex-quotes
+      (progn
+       (font-latex-update-quote-list)
+       (let ((regexp-end (regexp-opt (mapcar 'cadr font-latex-quote-list) t)))
+         (save-excursion
+           (goto-char end)
+           (catch 'extend
+             (while (re-search-backward regexp-end beg t)
+               (let ((closing-quote (match-string 0))
+                     (nest-count 0)
+                     (point-of-surrender (- beg font-latex-multiline-boundary))
+                     opening-quote)
+                 (catch 'found
+                   (dolist (elt font-latex-quote-list)
+                     (when (string= (cadr elt) closing-quote)
+                       (setq opening-quote (car elt))
+                       (throw 'found nil))))
+                 ;; Find opening quote taking nested quotes into account.
+                 (while (progn
+                          (re-search-backward (concat opening-quote "\\|"
+                                                      closing-quote)
+                                              point-of-surrender 'move)
+                          (when (and (> (point) point-of-surrender)
+                                     (not (bobp)))
+                            (if (string= (match-string 0) closing-quote)
+                                (setq nest-count (1+ nest-count))
+                              (when (/= nest-count 0)
+                                (setq nest-count (1- nest-count)))))))
+                 (when (< (point) beg)
+                   (throw 'extend (point)))))
+             nil))))
+    nil))
+
+(defun font-latex-match-script (limit)
+  "Match subscript and superscript patterns up to LIMIT."
+  (when (and font-latex-fontify-script
+            (re-search-forward "[_^] *\\([^\n\\{}]\\|\
+\\\\\\([a-zA-Z@]+\\|[^ \t\n]\\)\\|\\({\\)\\)" limit t))
+    (if (font-latex-faces-present-p '(font-latex-subscript-face
+                                     font-latex-superscript-face))
+       ;; Apply subscript and superscript highlighting only once in
+       ;; order to prevent the font size becoming too small.  We set
+       ;; an empty match to do that.
+       (let ((point (point)))
+         (store-match-data (list point point point point)))
+      (when (match-end 3)
+       (let ((beg (match-beginning 3))
+             (end (TeX-find-closing-brace
+                   ;; Don't match groups spanning more than one line
+                   ;; in order to avoid visually wrong indentation in
+                   ;; subsequent lines.
+                   nil (line-end-position))))
+         (store-match-data (if end
+                               (list (match-beginning 0) end beg end)
+                             (list beg beg beg beg))))))
+    t))
+
+;; Copy and adaption of `tex-font-lock-suscript' from tex-mode.el in
+;; GNU Emacs on 2004-07-07.
+(defun font-latex-script (pos)
+  "Return face and display spec for subscript and superscript content."
+  (when (and (font-latex-faces-present-p 'font-latex-math-face pos)
+            (not (font-latex-faces-present-p '(font-lock-constant-face
+                                               font-lock-builtin-face
+                                               font-lock-comment-face
+                                               font-latex-verbatim-face) pos))
+            ;; Check for backslash quoting
+            (not (let ((odd nil)
+                       (pos pos))
+                   (while (eq (char-before pos) ?\\)
+                     (setq pos (1- pos) odd (not odd)))
+                   odd)))
+    ;; Adding other text properties than `face' is supported by
+    ;; `font-lock-apply-highlight' in CVS Emacsen since 2001-10-28.
+    ;; With the introduction of this feature the variable
+    ;; `font-lock-extra-managed-props' was introduced and serves here
+    ;; for feature checking.  XEmacs (CVS and 21.4.15) currently
+    ;; (2004-08-18) does not support this feature.
+    (let ((extra-props-flag (boundp 'font-lock-extra-managed-props)))
+      (if (eq (char-after pos) ?_)
+         (if extra-props-flag
+             `(face font-latex-subscript-face display
+                    ,(car font-latex-script-display))
+           'font-latex-subscript-face)
+       (if extra-props-flag
+           `(face font-latex-superscript-face display
+                  ,(cdr font-latex-script-display))
+         'font-latex-superscript-face)))))
+
+
+;;; docTeX
+
+(defvar font-latex-doctex-preprocessor-face
+  'font-latex-doctex-preprocessor-face
+  "Face used to highlight preprocessor directives in docTeX mode.")
+
+(defface font-latex-doctex-preprocessor-face
+  '((t (:inherit (font-latex-doctex-documentation-face
+                 font-lock-builtin-face ; Emacs 21 does not provide
+                                        ; the preprocessor face.
+                 font-lock-preprocessor-face))))
+  "Face used to highlight preprocessor directives in docTeX mode."
+  :group 'font-latex-highlighting-faces)
+
+(defvar font-latex-doctex-documentation-face
+  'font-latex-doctex-documentation-face
+  "Face used to highlight the documentation in docTeX mode.")
+
+(defface font-latex-doctex-documentation-face
+  '((((class mono)) (:inverse-video t))
+    (((class grayscale) (background dark)) (:background "#333"))
+    (((class color) (background dark)) (:background "#333"))
+    (t (:background "#eeeeee")))
+  "Face used to highlight the documentation parts in docTeX mode."
+  :group 'font-latex-highlighting-faces)
+
+(defvar font-latex-doctex-keywords
+  (append font-latex-keywords-2
+         '(("^%<[^>]*>" (0 font-latex-doctex-preprocessor-face t)))))
+
+;; Set and updated in `font-latex-set-syntactic-keywords'.
+(defvar font-latex-doctex-syntactic-keywords nil)
+
+;; Copy and adaptation of `doctex-font-lock-^^A' in `tex-mode.el' of
+;; CVS Emacs (March 2004)
+(defun font-latex-doctex-^^A ()
+  (if (eq (char-after (line-beginning-position)) ?\%)
+      (progn
+       (put-text-property
+        (1- (match-beginning 1)) (match-beginning 1) 'syntax-table
+        (if (= (1+ (line-beginning-position)) (match-beginning 1))
+            ;; The `%' is a single-char comment, which Emacs
+            ;; syntax-table can't deal with.  We could turn it
+            ;; into a non-comment, or use `\n%' or `%^' as the comment.
+            ;; Instead, we include it in the ^^A comment.
+            ;; COMPATIBILITY for Emacs 20 and XEmacs
+            (eval-when-compile (if (fboundp 'string-to-syntax)
+                                   (string-to-syntax "< b")
+                                 '(2097163)))
+          ;; COMPATIBILITY for Emacs 20 and XEmacs
+          (eval-when-compile (if (fboundp 'string-to-syntax)
+                                 (string-to-syntax ">")
+                               '(12)))))
+       (let ((end (line-end-position)))
+         (if (< end (point-max))
+             (put-text-property end (1+ end) 'syntax-table
+                                   ;; COMPATIBILITY for Emacs 20 and XEmacs
+                                   (eval-when-compile
+                                     (if (fboundp 'string-to-syntax)
+                                         (string-to-syntax "> b")
+                                       '(2097164))))))
+       ;; COMPATIBILITY for Emacs 20 and XEmacs
+       (eval-when-compile (if (fboundp 'string-to-syntax)
+                              (string-to-syntax "< b")
+                            '(2097163))))))
+
+;; Copy and adaptation of `doctex-font-lock-syntactic-face-function'
+;; in `tex-mode.el' of CVS Emacs (March 2004)
+(defun font-latex-doctex-syntactic-face-function (state)
+  ;; Mark docTeX documentation, which is parsed as a style A comment
+  ;; starting in column 0.
+  (if (or (nth 3 state) (nth 7 state)
+         (not (memq (char-before (nth 8 state))
+                    '(?\n nil))))
+      ;; Anything else is just as for LaTeX.
+      (font-latex-syntactic-face-function state)
+    font-latex-doctex-documentation-face))
+
+
+;;; Installation in non-AUCTeX LaTeX mode
+
+(add-hook 'latex-mode-hook 'font-latex-setup)
+;; If font-latex is loaded using a latex-mode-hook, then the add-hook above
+;; won't be called this time around.  Check for this now:
+(if (eq major-mode 'latex-mode)
+    (font-latex-setup))
+
+
+;;; Byte-compilation of generated functions
+
+(when (byte-code-function-p
+       (symbol-function 'font-latex-make-built-in-keywords))
+  (dolist (elt font-latex-built-in-keyword-classes)
+    (let ((name (nth 0 elt)))
+      (byte-compile (intern (concat "font-latex-match-" name)))
+      (byte-compile (intern (concat "font-latex-match-" name "-make"))))))
+
+
+;; Provide ourselves:
+(provide 'font-latex)
+
+;; Local Variables:
+;; coding: iso-8859-1
+;; End:
+
+;;; font-latex.el ends here
diff --git a/packages/auctex/images/amstex.xpm b/packages/auctex/images/amstex.xpm
new file mode 100644 (file)
index 0000000..dbb3cc0
--- /dev/null
@@ -0,0 +1,207 @@
+/* XPM */
+static char * amstex_xpm[] = {
+"24 24 180 2",
+"      c None s backgroundToolBarColor",
+".     c #3E9543",
+"+     c #409644",
+"@     c #3D9D45",
+"#     c #3F9B42",
+"$     c #4C2A1F",
+"%     c #4E3124",
+"&     c #727E51",
+"*     c #598A4E",
+"=     c #5B6647",
+"-     c #88624F",
+";     c #89383B",
+">     c #8B343B",
+",     c #6D5852",
+"'     c #506D48",
+")     c #4C843E",
+"!     c #648752",
+"~     c #B8A789",
+"{     c #80624D",
+"]     c #7D6951",
+"^     c #FFFFC1",
+"/     c #94A676",
+"(     c #8F8668",
+"_     c #977567",
+":     c #A86660",
+"<     c #986C6A",
+"[     c #758660",
+"}     c #708C60",
+"|     c #6A6C4E",
+"1     c #C3C599",
+"2     c #988167",
+"3     c #5A3125",
+"4     c #561E1C",
+"5     c #958066",
+"6     c #BEA384",
+"7     c #68372B",
+"8     c #672124",
+"9     c #5B392F",
+"0     c #94917B",
+"a     c #AFAC91",
+"b     c #B8B39C",
+"c     c #BDBCA0",
+"d     c #B39073",
+"e     c #582522",
+"f     c #712E2B",
+"g     c #6F292C",
+"h     c #83826F",
+"i     c #908F88",
+"j     c #F8FFFD",
+"k     c #686C8D",
+"l     c #D7DBB8",
+"m     c #716D76",
+"n     c #7B7B92",
+"o     c #D5D5B3",
+"p     c #DBBD9A",
+"q     c #81463B",
+"r     c #691A19",
+"s     c #838270",
+"t     c #888791",
+"u     c #6462D0",
+"v     c #2C2B87",
+"w     c #DAD9C7",
+"x     c #868394",
+"y     c #716DDC",
+"z     c #2F2C94",
+"A     c #C7C6B7",
+"B     c #D2AF8D",
+"C     c #84473C",
+"D     c #6D1E1F",
+"E     c #6E262C",
+"F     c #BDBDAB",
+"G     c #878593",
+"H     c #909095",
+"I     c #C0BEAF",
+"J     c #A09EAD",
+"K     c #A6A5A9",
+"L     c #C19978",
+"M     c #7C3D33",
+"N     c #641C1F",
+"O     c #662633",
+"P     c #DBDCB8",
+"Q     c #B4B492",
+"R     c #E5D9AA",
+"S     c #9F755A",
+"T     c #50231F",
+"U     c #672424",
+"V     c #8E3B4B",
+"W     c #E4E3BC",
+"X     c #A5A28D",
+"Y     c #D2D1B5",
+"Z     c #E7E5C1",
+"`     c #E3DFC0",
+" .    c #E4CCA2",
+"..    c #894E3A",
+"+.    c #461715",
+"@.    c #632524",
+"#.    c #95404E",
+"$.    c #777776",
+"%.    c #C0B396",
+"&.    c #AAAB90",
+"*.    c #463F31",
+"=.    c #665E46",
+"-.    c #7C7968",
+";.    c #B3AF92",
+">.    c #D4BD97",
+",.    c #804B37",
+"'.    c #461F19",
+").    c #42201F",
+"!.    c #5A4F43",
+"~.    c #504334",
+"{.    c #979183",
+"].    c #DCD8B5",
+"^.    c #D0BC9D",
+"/.    c #C8A487",
+"(.    c #82493F",
+"_.    c #3F1310",
+":.    c #401613",
+"<.    c #664B46",
+"[.    c #DCD9BC",
+"}.    c #B8B59D",
+"|.    c #8C8977",
+"1.    c #E9E7C0",
+"2.    c #A2897B",
+"3.    c #AE8872",
+"4.    c #CFB89A",
+"5.    c #A6715F",
+"6.    c #4B1D19",
+"7.    c #68272E",
+"8.    c #6E2933",
+"9.    c #453E37",
+"0.    c #767361",
+"a.    c #7F8170",
+"b.    c #7B7B6C",
+"c.    c #8E897E",
+"d.    c #827F6E",
+"e.    c #83876F",
+"f.    c #847E70",
+"g.    c #9C7964",
+"h.    c #662F2A",
+"i.    c #5D2D2E",
+"j.    c #783C3F",
+"k.    c #87826E",
+"l.    c #B3B99A",
+"m.    c #D1D1AB",
+"n.    c #DFDDB9",
+"o.    c #C3B191",
+"p.    c #826453",
+"q.    c #6D2B2A",
+"r.    c #884144",
+"s.    c #772B2F",
+"t.    c #702F34",
+"u.    c #AEA28C",
+"v.    c #C1C3A2",
+"w.    c #AEA07E",
+"x.    c #C8C09F",
+"y.    c #C4C6A3",
+"z.    c #B6886B",
+"A.    c #774237",
+"B.    c #7E3E3D",
+"C.    c #854748",
+"D.    c #78373B",
+"E.    c #6A2932",
+"F.    c #5F343C",
+"G.    c #7C474A",
+"H.    c #815655",
+"I.    c #7F534F",
+"J.    c #8A5C54",
+"K.    c #74504B",
+"L.    c #8C615F",
+"M.    c #7E2C29",
+"N.    c #8C4240",
+"O.    c #7C322F",
+"P.    c #703634",
+"Q.    c #6D1B27",
+"R.    c #975F59",
+"S.    c #631D22",
+"T.    c #65101D",
+"U.    c #000000",
+"V.    c #868686",
+"W.    c #AFAEAE",
+"                  .         + @ #   $           ",
+"            % & * = - ; > , ' ) ! ~ {           ",
+"            ] ^ / ( _ : < [ } | 1 2 3 4         ",
+"              5 ^ ^ ^ ^ ^ ^ ^ ^ ^ 6 7 8         ",
+"              9 ^ 0 a ^ b 0 c ^ ^ d e f g       ",
+"              h i j k l m j n o ^ p q r         ",
+"              s t u v w x y z A ^ B C D E       ",
+"              ] F G H ^ I J K ^ ^ L M N O       ",
+"            ] ^ P Q ^ ^ ^ ^ ^ ^ R S T U V       ",
+"          ] ^ W X Y Z ` ^ ^ ^ ^  ...+.@.#.      ",
+"      $.$.%.%.&.*.=.-.;.%.%.%.^ >.,.'.).        ",
+"        %.%.^ ^ !.~.{.].^ ^ ^ ^./.(._.:.        ",
+"      $.$.<.[.^ }.|.1.^ 2.3.4.^ 5.6.7.8.        ",
+"          9.0.a.b.c.d.e.f.^ ^ g.h.i.j.          ",
+"          k.^ l.^ ^ m.n.^ o.p.q.r.s.t.          ",
+"            u.v.%.w.x.y.z.A.B.C.D.E.F.          ",
+"            G.H.I.J.K.L.M.N.O.P.                ",
+"              Q.R.    S.  T.                    ",
+"                                                ",
+"            U.U.                V.U.U.W.        ",
+"          U.  U.    U.U.V.U.V.  U.              ",
+"        U.    U.    U.  U.  U.  V.U.U.V.        ",
+"        U.U.U.U.    U.  U.  U.        U.        ",
+"      U.V.    U.    U.  U.  U.  U.U.U.V.        "};
diff --git a/packages/auctex/images/bibtex.xpm b/packages/auctex/images/bibtex.xpm
new file mode 100644 (file)
index 0000000..7400f09
--- /dev/null
@@ -0,0 +1,82 @@
+/* XPM */
+static char * bibtex14_xpm[] = {
+"24 24 55 1",
+"      c None s backgroundToolBarColor",
+".     c #353535",
+"+     c #877D55",
+"@     c #B9AD74",
+"#     c #606060",
+"$     c #878585",
+"%     c #A89C6A",
+"&     c #726A49",
+"*     c #070705",
+"=     c #9A9A9A",
+"-     c #59533A",
+";     c #938960",
+">     c #C9C7BF",
+",     c #7C7C7C",
+"'     c #3D3928",
+")     c #AFA379",
+"!     c #AFAEA8",
+"~     c #938A63",
+"{     c #3F3B2A",
+"]     c #8E865E",
+"^     c #B6AA72",
+"/     c #424242",
+"(     c #373737",
+"_     c #4E4C41",
+":     c #565344",
+"<     c #746D4E",
+"[     c #7E7652",
+"}     c #8E845A",
+"|     c #B0A46E",
+"1     c #775E5E",
+"2     c #F5F4F3",
+"3     c #D7D5D0",
+"4     c #BCB8AC",
+"5     c #A39F94",
+"6     c #817E71",
+"7     c #605D4F",
+"8     c #8A8058",
+"9     c #92885C",
+"0     c #826A6A",
+"a     c #CACACA",
+"b     c #FFFFFF",
+"c     c #E6E6E5",
+"d     c #D0D0D0",
+"e     c #CCCCCC",
+"f     c #C4C2B8",
+"g     c #B5B2A5",
+"h     c #918F84",
+"i     c #59564C",
+"j     c #F6F6F6",
+"k     c #F3F2F0",
+"l     c #AEAEAE",
+"m     c #727272",
+"n     c #909090",
+"o     c #DCDCDC",
+"p     c #A3A3A3",
+"                        ",
+"                        ",
+"         .............. ",
+"        .+@@@@@@@@@@@+# ",
+"       $.@@@@@@@@@@@+.  ",
+"       .%&*@@@@@@@@@.=  ",
+"      .+@--@@*@-;@@+.>  ",
+"     $.@-*@@@@;*@@@.=>, ",
+"     .%@*@*@*@'*@@+.>>..",
+"    .+@*;--&&&*)*@.=>!, ",
+"   $.@@@*-@*@*~~*@.>>,= ",
+"   .%@@@@@@@@@{{@.=>!.  ",
+"  .+@@@@@@@@@@@@+.>>,=  ",
+" $.]^@@@@@@@@@@@.=>!.   ",
+" /(_:<[}|@@@@@@+.>>,=   ",
+" /12234567:<[89.>>!.    ",
+" /0abbb2cdefghi>>>,=    ",
+"  $#$ajbbbbbkcc>>!.     ",
+"    l=mnajbbbbbo>,=     ",
+"       l=mnajbbc>.      ",
+"          l=mnac,=      ",
+"             l=m.       ",
+"               p        ",
+"                        "};
diff --git a/packages/auctex/images/dropdown.xpm b/packages/auctex/images/dropdown.xpm
new file mode 100644 (file)
index 0000000..adf0e61
--- /dev/null
@@ -0,0 +1,30 @@
+/* XPM */
+static char * dropdown_xpm[] = {
+"10 24 3 1",
+"      c None s backgroundToolBarColor",
+".     c #292C29",
+"+     c #B3B3B3",
+"          ",
+"          ",
+"          ",
+"          ",
+"          ",
+"          ",
+"          ",
+"          ",
+"          ",
+"          ",
+"  .    .  ",
+" ...  ... ",
+"  ......  ",
+"   ....   ",
+"    ..    ",
+"    ++    ",
+"          ",
+"          ",
+"          ",
+"          ",
+"          ",
+"          ",
+"          ",
+"          "};
diff --git a/packages/auctex/images/dvipdf.xpm b/packages/auctex/images/dvipdf.xpm
new file mode 100644 (file)
index 0000000..1b2a761
--- /dev/null
@@ -0,0 +1,65 @@
+/* XPM */
+static char * dvipdf4_xpm[] = {
+"24 24 38 1",
+"      c None s backgroundToolBarColor",
+".     c #4C4C4C",
+"+     c #000000",
+"@     c #7C7C7C",
+"#     c #577A4D",
+"$     c #4C6B43",
+"%     c #37452B",
+"&     c #76996C",
+"*     c #9BB594",
+"=     c #648C58",
+"-     c #DAE3D6",
+";     c #445636",
+">     c #67865E",
+",     c #A7BDA0",
+"'     c #8EAB86",
+")     c #526741",
+"!     c #425D3A",
+"~     c #4C603C",
+"{     c #566B43",
+"]     c #5A7046",
+"^     c #295E29",
+"/     c #5ABD5A",
+"(     c #D37F71",
+"_     c #CE918A",
+":     c #D4897A",
+"<     c #67102D",
+"[     c #488148",
+"}     c #C47474",
+"|     c #D69788",
+"1     c #4CA14C",
+"2     c #4D904D",
+"3     c #CB8984",
+"4     c #D79C8D",
+"5     c #C8807D",
+"6     c #4FA64F",
+"7     c #5A5A5A",
+"8     c #B50000",
+"9     c #AA7979",
+"     .+.      ++++      ",
+"   @+##$+@   +++%++     ",
+"   +&**&=+  +   +%+     ",
+"  .#*-*&=$.      +;+    ",
+"  +>,*'==$+      +)+    ",
+"  .#&&==#!.    ++))~++  ",
+"   +#==#$+      +{]{+   ",
+"   @+!$!+@       +)+    ",
+"     .+.          +     ",
+"                        ",
+"                  +     ",
+"^^^/ ^  ^ ^      +(+    ",
+"^  ^ ^  ^ ^     +_:<+   ",
+"^  ^ [  [ ^    +}_|<<+  ",
+"^  ^ 1221 ^   +}3_4<<<+ ",
+"^  ^  [[  ^  +}53_4<<<<+",
+"^^^/  66  ^  +}53_|<<<+ ",
+"              7+}5:<<+  ",
+"                7+(<+   ",
+"8889 8889 8889    ++    ",
+"8  8 8  8 8             ",
+"8889 8  8 889           ",
+"8    8  8 8             ",
+"8    8889 8             "};
diff --git a/packages/auctex/images/dvips.xpm b/packages/auctex/images/dvips.xpm
new file mode 100644 (file)
index 0000000..7d58e2d
--- /dev/null
@@ -0,0 +1,89 @@
+/* XPM */
+static char * dvips66_xpm[] = {
+"24 24 62 1",
+"      c None s backgroundToolBarColor",
+".     c #4C4C4C",
+"+     c #000000",
+"@     c #7C7C7C",
+"#     c #577A4D",
+"$     c #4C6B43",
+"%     c #37452B",
+"&     c #76996C",
+"*     c #9BB594",
+"=     c #648C58",
+"-     c #DAE3D6",
+";     c #445636",
+">     c #67865E",
+",     c #A7BDA0",
+"'     c #8EAB86",
+")     c #526741",
+"!     c #425D3A",
+"~     c #4C603C",
+"{     c #566B43",
+"]     c #5A7046",
+"^     c #869CB4",
+"/     c #00244C",
+"(     c #002248",
+"_     c #0050A9",
+":     c #006FEB",
+"<     c #0066D9",
+"[     c #00336D",
+"}     c #295E29",
+"|     c #5ABD5A",
+"1     c #001070",
+"2     c #004BA2",
+"3     c #0078FF",
+"4     c #0075FC",
+"5     c #004DB6",
+"6     c #00072F",
+"7     c #0047FF",
+"8     c #006DFF",
+"9     c #0042CA",
+"0     c #00169E",
+"a     c #000A45",
+"b     c #488148",
+"c     c #0024FF",
+"d     c #0027FF",
+"e     c #0056ED",
+"f     c #001FA7",
+"g     c #00179F",
+"h     c #4CA14C",
+"i     c #4D904D",
+"j     c #001DCE",
+"k     c #4FA64F",
+"l     c #000B4C",
+"m     c #0023F5",
+"n     c #001492",
+"o     c #000E65",
+"p     c #00010B",
+"q     c #001AB9",
+"r     c #0022F0",
+"s     c #001387",
+"t     c #000942",
+"u     c #0037C4",
+"v     c #6C84B7",
+"w     c #000C57",
+"      .+.      ++++     ",
+"    @+##$+@   +++%++    ",
+"    +&**&=+  +   +%+    ",
+"   .#*-*&=$.      +;+   ",
+"   +>,*'==$+      +)+   ",
+"   .#&&==#!.    ++))~++ ",
+"    +#==#$+      +{]{+  ",
+"    @+!$!+@       +)+   ",
+"      .+.          +    ",
+"                        ",
+"                  ^/    ",
+"                ^(_:<[  ",
+"}}}| }  }  }   12:333456",
+"}  } }  }  }   17833390a",
+"}  } b  b  }   1cd7efg0a",
+"}  } hiih  }   1cccj000a",
+"}  }  bb   }   1cccj000a",
+"}}}|  kk   }   lmccj0nop",
+"                lqrjst  ",
+"  uuuv vuuv       1w    ",
+"  u  u u                ",
+"  uuuv vuuv             ",
+"  u       u             ",
+"  u    vuuv             "};
diff --git a/packages/auctex/images/error.xpm b/packages/auctex/images/error.xpm
new file mode 100644 (file)
index 0000000..6dab4fa
--- /dev/null
@@ -0,0 +1,35 @@
+/* XPM */
+static char * error22_xpm[] = {
+"24 24 8 1",
+"      c None s backgroundToolBarColor",
+".     c #847000",
+"+     c #000000",
+"@     c #F0C900",
+"#     c #AB9100",
+"$     c #887821",
+"%     c #AA9629",
+"&     c #51470D",
+"                        ",
+"                        ",
+"          .++.          ",
+"         +@@@@+         ",
+"        #.@@@@.#        ",
+"        +@@@@@@+        ",
+"       #.@@@@@@.#       ",
+"       +@@@++@@@+       ",
+"      #.@@@++@@@.#      ",
+"      +@@@@++@@@@+      ",
+"     #.@@@@++@@@@.#     ",
+"     +@@@@@++@@@@@+     ",
+"    #.@@@@@++@@@@@.#    ",
+"    +@@@@@@$$@@@@@@+    ",
+"   #.@@@@@@%%@@@@@@.#   ",
+"   +@@@@@@@@@@@@@@@@+   ",
+"  .#@@@@@@@++@@@@@@@#.  ",
+"  &@@@@@@@@++@@@@@@@@&  ",
+"  &@@@@@@@@@@@@@@@@@@&  ",
+"   +@@@@@@@@@@@@@@@@+   ",
+"    .++++++++++++++.    ",
+"                        ",
+"                        ",
+"                        "};
diff --git a/packages/auctex/images/exec.xpm b/packages/auctex/images/exec.xpm
new file mode 100644 (file)
index 0000000..9ad3ade
--- /dev/null
@@ -0,0 +1,68 @@
+/* XPM */
+static char * exec6_xpm[] = {
+"24 24 41 1",
+"      c None s backgroundToolBarColor",
+".     c #9F9D96",
+"+     c #3A3A3A",
+"@     c #B3B3B1",
+"#     c #000000",
+"$     c #807D74",
+"%     c #3C3C3C",
+"&     c #76746B",
+"*     c #5D5C55",
+"=     c #6D6B63",
+"-     c #65635C",
+";     c #8C8B89",
+">     c #E4E3E1",
+",     c #E2E2E2",
+"'     c #484641",
+")     c #888781",
+"!     c #B0AFAD",
+"~     c #A8A7A1",
+"{     c #908E86",
+"]     c #97958E",
+"^     c #595854",
+"/     c #605E57",
+"(     c #898883",
+"_     c #464542",
+":     c #4A4947",
+"<     c #43423E",
+"[     c #E2E2E1",
+"}     c #B6B5AF",
+"|     c #494847",
+"1     c #434242",
+"2     c #464644",
+"3     c #E6E6E4",
+"4     c #484846",
+"5     c #DFDEDC",
+"6     c #B0AFA9",
+"7     c #D5D4D1",
+"8     c #93918B",
+"9     c #D6D5D2",
+"0     c #ABA9A3",
+"a     c #494943",
+"b     c #464540",
+"                        ",
+"    . ++ @              ",
+"   #@#..#.#             ",
+"  .@...$$$%.            ",
+"   #..&$*=#             ",
+"  +..&##@--+            ",
+"  +.$$#;@-%+            ",
+"   #$*@@$%#             ",
+"  @.$=--%%%.            ",
+"   #%#-%#%#             ",
+"    . ++ .   %%%        ",
+"          %% %>% %%     ",
+"         %,@%'.'%)%%    ",
+"         %!~...{]$'%    ",
+"          %..^/($&%     ",
+"        %%'./_:<.='%%   ",
+"        %[}.^|123$-/%   ",
+"        %%'.(<4;5-'%%   ",
+"          %6$}378-%%    ",
+"         %90.$$&&*'%    ",
+"         %%^%'&'%a%%    ",
+"          %% %b%*%%     ",
+"             %%%        ",
+"                        "};
diff --git a/packages/auctex/images/execbibtex.xpm b/packages/auctex/images/execbibtex.xpm
new file mode 100644 (file)
index 0000000..27bca49
--- /dev/null
@@ -0,0 +1,127 @@
+/* XPM */
+static char * execbibtex8_xpm[] = {
+"24 24 100 2",
+"      c None s backgroundToolBarColor",
+".     c #1F1D12",
+"+     c #222017",
+"@     c #211F15",
+"#     c #211F14",
+"$     c #0C0B07",
+"%     c #5E5737",
+"&     c #B7AB72",
+"*     c #BFB480",
+"=     c #BAAF77",
+"-     c #B9AD74",
+";     c #9A9061",
+">     c #545144",
+",     c #AFA98C",
+"'     c #776F4F",
+")     c #C0B684",
+"!     c #625C3D",
+"~     c #767675",
+"{     c #A79D6F",
+"]     c #BEB37E",
+"^     c #93895C",
+"/     c #59574E",
+"(     c #A3A3A2",
+"_     c #807A59",
+":     c #BCB17E",
+"<     c #B9AE75",
+"[     c #B8AC73",
+"}     c #7E7650",
+"|     c #5B5B5B",
+"1     c #ACACAA",
+"2     c #202120",
+"3     c #60593A",
+"4     c #BAAE76",
+"5     c #A39966",
+"6     c #363635",
+"7     c #B4B4B3",
+"8     c #82857F",
+"9     c #171816",
+"0     c #8A825C",
+"a     c #B9AD75",
+"b     c #6D6748",
+"c     c #6A6A6A",
+"d     c #A9AAA6",
+"e     c #363735",
+"f     c #95948C",
+"g     c #A39C82",
+"h     c #7A7356",
+"i     c #BBB079",
+"j     c #BBAF78",
+"k     c #20201C",
+"l     c #B3B3B2",
+"m     c #767774",
+"n     c #20211F",
+"o     c #1A1112",
+"p     c #5D413D",
+"q     c #555540",
+"r     c #7C7A58",
+"s     c #4D4830",
+"t     c #8B8A89",
+"u     c #ADADAB",
+"v     c #4F514E",
+"w     c #1E1616",
+"x     c #BA9797",
+"y     c #DCD6D3",
+"z     c #CDCDCA",
+"A     c #575651",
+"B     c #1B1A19",
+"C     c #ABABA9",
+"D     c #777775",
+"E     c #080808",
+"F     c #1B1212",
+"G     c #846666",
+"H     c #A5A09E",
+"I     c #D4D2C6",
+"J     c #E7E6DF",
+"K     c #F1F0EC",
+"L     c #A9AAA8",
+"M     c #4F514D",
+"N     c #585442",
+"O     c #6D6D66",
+"P     c #DEDBCA",
+"Q     c #EAE9E4",
+"R     c #BEC0B9",
+"S     c #878A84",
+"T     c #000000",
+"U     c #47453A",
+"V     c #50504D",
+"W     c #999474",
+"X     c #363731",
+"Y     c #020201",
+"Z     c #3A3A3A",
+"`     c #65635C",
+" .    c #9F9D96",
+"..    c #807D74",
+"+.    c #3C3C3C",
+"@.    c #76746B",
+"#.    c #5D5C55",
+"$.    c #6D6B63",
+"%.    c #B3B3B1",
+"&.    c #8C8B89",
+"                                                ",
+"            . + @ # # # # $                     ",
+"          % & * = - - - ; >                     ",
+"        , ' ) = - - - - ! ~                     ",
+"        % { ] - - - - ^ / (                     ",
+"      , _ : < - - - [ } | 1 2                   ",
+"      3 ] 4 - - - - 5 6 7 8 9                   ",
+"    % 0 ] a - - - - b c d e f                   ",
+"  g h i j - - - - - k l m n                     ",
+"  o p q r ; 5 - - s t u v f                     ",
+"  w x y z u ~ A q B C D E                       ",
+"  F G H I J K K K z L M f                       ",
+"    v M N O f P Q R S T                         ",
+"          ( D U V W X f                         ",
+"                ( v Y               Z Z         ",
+"                              T ` T  . .T ` T   ",
+"                              `  . . .......+.  ",
+"                              T  . .@...#.$.T   ",
+"                            Z  . .@.T T %.` ` Z ",
+"                            Z  .....T &.%.` +.Z ",
+"                              T ..#.%.%...+.T   ",
+"                              ` ..$.` ` +.+.+.  ",
+"                              T +.T ` +.T +.T   ",
+"                                    Z Z         "};
diff --git a/packages/auctex/images/execdvips.xpm b/packages/auctex/images/execdvips.xpm
new file mode 100644 (file)
index 0000000..5166e83
--- /dev/null
@@ -0,0 +1,52 @@
+/* XPM */
+static char * execdvips36_xpm[] = {
+"24 24 25 1",
+"      c None s backgroundToolBarColor",
+".     c #295E29",
+"+     c #5ABD5A",
+"@     c #488148",
+"#     c #818181",
+"$     c #4CA14C",
+"%     c #4D904D",
+"&     c #ADADAD",
+"*     c #4FA64F",
+"=     c #6E6E6E",
+"-     c #545454",
+";     c #999999",
+">     c #3A3A3A",
+",     c #000000",
+"'     c #65635C",
+")     c #9F9D96",
+"!     c #0037C4",
+"~     c #6C84B7",
+"{     c #807D74",
+"]     c #3C3C3C",
+"^     c #76746B",
+"/     c #5D5C55",
+"(     c #6D6B63",
+"_     c #B3B3B1",
+":     c #8C8B89",
+"                        ",
+"       ...+ .  .  .     ",
+"       .  . .  .  .     ",
+"       .  . .  .  .     ",
+"       .  . @  @  .     ",
+"    #  .  . $%%$  .     ",
+"   #&  .  .  @@   .     ",
+"  #&   ...+  **   .     ",
+"  =                     ",
+"  -                     ",
+"  #                     ",
+"   - ;                  ",
+"    ;-                  ",
+"   ;--                  ",
+"                  >>    ",
+"               ,',)),', ",
+"   !!!~ ~!!~   '))){{{] ",
+"   !  ! !  !   ,))^{/(, ",
+"   !  ! !     >))^,,_''>",
+"   !!!~ ~!!~  >){{,:_']>",
+"   !       !   ,{/__{], ",
+"   !    !  !   '{('']]] ",
+"   !    ~!!~   ,],'],], ",
+"                  >>    "};
diff --git a/packages/auctex/images/execerror.xpm b/packages/auctex/images/execerror.xpm
new file mode 100644 (file)
index 0000000..6a77ea3
--- /dev/null
@@ -0,0 +1,49 @@
+/* XPM */
+static char * execerror12_xpm[] = {
+"24 24 22 1",
+"      c None s backgroundToolBarColor",
+".     c #B09400",
+"+     c #605000",
+"@     c #9C8400",
+"#     c #FFD906",
+"$     c #FED90A",
+"%     c #957F0D",
+"&     c #DEBD0E",
+"*     c #6F5D00",
+"=     c #8F7900",
+"-     c #655500",
+";     c #3A3A3A",
+">     c #000000",
+",     c #65635C",
+"'     c #9F9D96",
+")     c #807D74",
+"!     c #3C3C3C",
+"~     c #76746B",
+"{     c #5D5C55",
+"]     c #6D6B63",
+"^     c #B3B3B1",
+"/     c #8C8B89",
+"                        ",
+"                        ",
+"      .++.              ",
+"      @##@.             ",
+"     +$###+             ",
+"    ..#++#..            ",
+"    +$#++#$+            ",
+"   ..##++##..           ",
+"   +$##%%##$+           ",
+"  ..###&&###..          ",
+"  +####**###$+          ",
+"  +##########+          ",
+"   =--------=           ",
+"                        ",
+"                  ;;    ",
+"               >,>''>,> ",
+"               ,''')))! ",
+"               >''~){]> ",
+"              ;''~>>^,,;",
+"              ;'))>/^,!;",
+"               >){^^)!> ",
+"               ,)],,!!! ",
+"               >!>,!>!> ",
+"                  ;;    "};
diff --git a/packages/auctex/images/execpdftex.xpm b/packages/auctex/images/execpdftex.xpm
new file mode 100644 (file)
index 0000000..c5ef5b5
--- /dev/null
@@ -0,0 +1,205 @@
+/* XPM */
+static char * execpdftex11_xpm[] = {
+"24 24 178 2",
+"      c None s backgroundToolBarColor",
+".     c #3E9543",
+"+     c #409644",
+"@     c #3D9D45",
+"#     c #3F9B42",
+"$     c #4C2A1F",
+"%     c #4E3124",
+"&     c #727E51",
+"*     c #598A4E",
+"=     c #5B6647",
+"-     c #88624F",
+";     c #89383B",
+">     c #8B343B",
+",     c #6D5852",
+"'     c #506D48",
+")     c #4C843E",
+"!     c #648752",
+"~     c #B8A789",
+"{     c #80624D",
+"]     c #7D6951",
+"^     c #FFFFC1",
+"/     c #94A676",
+"(     c #8F8668",
+"_     c #977567",
+":     c #A86660",
+"<     c #986C6A",
+"[     c #758660",
+"}     c #708C60",
+"|     c #6A6C4E",
+"1     c #C3C599",
+"2     c #988167",
+"3     c #5A3125",
+"4     c #958066",
+"5     c #BEA384",
+"6     c #68372B",
+"7     c #672124",
+"8     c #5B392F",
+"9     c #94917B",
+"0     c #AFAC91",
+"a     c #B8B39C",
+"b     c #BDBCA0",
+"c     c #B39073",
+"d     c #582522",
+"e     c #712E2B",
+"f     c #83826F",
+"g     c #908F88",
+"h     c #F8FFFD",
+"i     c #686C8D",
+"j     c #D7DBB8",
+"k     c #716D76",
+"l     c #7B7B92",
+"m     c #D5D5B3",
+"n     c #DBBD9A",
+"o     c #81463B",
+"p     c #691A19",
+"q     c #838270",
+"r     c #888791",
+"s     c #6462D0",
+"t     c #2C2B87",
+"u     c #DAD9C7",
+"v     c #868394",
+"w     c #716DDC",
+"x     c #2F2C94",
+"y     c #C7C6B7",
+"z     c #D2AF8D",
+"A     c #84473C",
+"B     c #6D1E1F",
+"C     c #975F59",
+"D     c #BDBDAB",
+"E     c #878593",
+"F     c #909095",
+"G     c #C0BEAF",
+"H     c #A09EAD",
+"I     c #A6A5A9",
+"J     c #C19978",
+"K     c #7C3D33",
+"L     c #641C1F",
+"M     c #DBDCB8",
+"N     c #B4B492",
+"O     c #E5D9AA",
+"P     c #9F755A",
+"Q     c #50231F",
+"R     c #672424",
+"S     c #E4E3BC",
+"T     c #A5A28D",
+"U     c #D2D1B5",
+"V     c #E7E5C1",
+"W     c #E3DFC0",
+"X     c #E4CCA2",
+"Y     c #894E3A",
+"Z     c #461715",
+"`     c #632524",
+" .    c #665E46",
+"..    c #C0B396",
+"+.    c #AAAB90",
+"@.    c #463F31",
+"#.    c #7C7968",
+"$.    c #B3AF92",
+"%.    c #D4BD97",
+"&.    c #804B37",
+"*.    c #461F19",
+"=.    c #42201F",
+"-.    c #5A4F43",
+";.    c #504334",
+">.    c #979183",
+",.    c #DCD8B5",
+"'.    c #D0BC9D",
+").    c #C8A487",
+"!.    c #82493F",
+"~.    c #3F1310",
+"{.    c #401613",
+"].    c #664B46",
+"^.    c #DCD9BC",
+"/.    c #B8B59D",
+"(.    c #8C8977",
+"_.    c #E9E7C0",
+":.    c #A2897B",
+"<.    c #AE8872",
+"[.    c #CFB89A",
+"}.    c #A6715F",
+"|.    c #4B1D19",
+"1.    c #68272E",
+"2.    c #767361",
+"3.    c #7F8170",
+"4.    c #7B7B6C",
+"5.    c #8E897E",
+"6.    c #827F6E",
+"7.    c #83876F",
+"8.    c #847E70",
+"9.    c #9C7964",
+"0.    c #662F2A",
+"a.    c #5D2D2E",
+"b.    c #783C3F",
+"c.    c #87826E",
+"d.    c #B3B99A",
+"e.    c #D1D1AB",
+"f.    c #DFDDB9",
+"g.    c #C3B191",
+"h.    c #826453",
+"i.    c #6D2B2A",
+"j.    c #884144",
+"k.    c #772B2F",
+"l.    c #3A3A3A",
+"m.    c #AEA28C",
+"n.    c #C1C3A2",
+"o.    c #AEA07E",
+"p.    c #C8C09F",
+"q.    c #C4C6A3",
+"r.    c #B6886B",
+"s.    c #774237",
+"t.    c #7E3E3D",
+"u.    c #854748",
+"v.    c #78373B",
+"w.    c #000000",
+"x.    c #65635C",
+"y.    c #9F9D96",
+"z.    c #7C474A",
+"A.    c #815655",
+"B.    c #7F534F",
+"C.    c #8A5C54",
+"D.    c #74504B",
+"E.    c #8C615F",
+"F.    c #7E2C29",
+"G.    c #8C4240",
+"H.    c #7C322F",
+"I.    c #703634",
+"J.    c #807D74",
+"K.    c #3C3C3C",
+"L.    c #6D1B27",
+"M.    c #631D22",
+"N.    c #65101D",
+"O.    c #76746B",
+"P.    c #5D5C55",
+"Q.    c #6D6B63",
+"R.    c #B3B3B1",
+"S.    c #B50000",
+"T.    c #AA7979",
+"U.    c #8C8B89",
+"          .         + @ #   $                   ",
+"    % & * = - ; > , ' ) ! ~ {                   ",
+"    ] ^ / ( _ : < [ } | 1 2 3                   ",
+"      4 ^ ^ ^ ^ ^ ^ ^ ^ ^ 5 6 7                 ",
+"      8 ^ 9 0 ^ a 9 b ^ ^ c d e                 ",
+"      f g h i j k h l m ^ n o p                 ",
+"      q r s t u v w x y ^ z A B C               ",
+"      ] D E F ^ G H I ^ ^ J K L                 ",
+"    ] ^ M N ^ ^ ^ ^ ^ ^ O P Q R C               ",
+"  ] ^ S T U V W ^ ^ ^ ^ X Y Z `                 ",
+" .....+.@. .#.$.......^ %.&.*.=.                ",
+"....^ ^ -.;.>.,.^ ^ ^ '.).!.~.{.                ",
+" .].^.^ /.(._.^ :.<.[.^ }.|.1.                  ",
+"  2.2.3.4.5.6.7.8.^ ^ 9.0.a.b.                  ",
+"  c.^ d.^ ^ e.f.^ g.h.i.j.k.        l.l.        ",
+"    m.n...o.p.q.r.s.t.u.v.    w.x.w.y.y.w.x.w.  ",
+"    z.A.B.C.D.E.F.G.H.I.      x.y.y.y.J.J.J.K.  ",
+"      L.C     M.  N.          w.y.y.O.J.P.Q.w.  ",
+"                            l.y.y.O.w.w.R.x.x.l.",
+"    S.S.T.  S.S.T.  S.S.T.  l.y.J.J.w.U.R.x.K.l.",
+"    S.  S.  S.  S.  S.        w.J.P.R.R.J.K.w.  ",
+"    S.S.T.  S.  S.  S.S.      x.J.Q.x.x.K.K.K.  ",
+"    S.      S.  S.  S.        w.K.w.x.K.w.K.w.  ",
+"    S.      S.S.T.  S.              l.l.        "};
diff --git a/packages/auctex/images/exectex.xpm b/packages/auctex/images/exectex.xpm
new file mode 100644 (file)
index 0000000..74f724a
--- /dev/null
@@ -0,0 +1,203 @@
+/* XPM */
+static char * exectex40_xpm[] = {
+"24 24 176 2",
+"      c None s backgroundToolBarColor",
+".     c #3E9543",
+"+     c #409644",
+"@     c #3D9D45",
+"#     c #3F9B42",
+"$     c #4C2A1F",
+"%     c #4E3124",
+"&     c #727E51",
+"*     c #598A4E",
+"=     c #5B6647",
+"-     c #88624F",
+";     c #89383B",
+">     c #8B343B",
+",     c #6D5852",
+"'     c #506D48",
+")     c #4C843E",
+"!     c #648752",
+"~     c #B8A789",
+"{     c #80624D",
+"]     c #7D6951",
+"^     c #FFFFC1",
+"/     c #94A676",
+"(     c #8F8668",
+"_     c #977567",
+":     c #A86660",
+"<     c #986C6A",
+"[     c #758660",
+"}     c #708C60",
+"|     c #6A6C4E",
+"1     c #C3C599",
+"2     c #988167",
+"3     c #5A3125",
+"4     c #958066",
+"5     c #BEA384",
+"6     c #68372B",
+"7     c #672124",
+"8     c #5B392F",
+"9     c #94917B",
+"0     c #AFAC91",
+"a     c #B8B39C",
+"b     c #BDBCA0",
+"c     c #B39073",
+"d     c #582522",
+"e     c #712E2B",
+"f     c #83826F",
+"g     c #908F88",
+"h     c #F8FFFD",
+"i     c #686C8D",
+"j     c #D7DBB8",
+"k     c #716D76",
+"l     c #7B7B92",
+"m     c #D5D5B3",
+"n     c #DBBD9A",
+"o     c #81463B",
+"p     c #691A19",
+"q     c #838270",
+"r     c #888791",
+"s     c #6462D0",
+"t     c #2C2B87",
+"u     c #DAD9C7",
+"v     c #868394",
+"w     c #716DDC",
+"x     c #2F2C94",
+"y     c #C7C6B7",
+"z     c #D2AF8D",
+"A     c #84473C",
+"B     c #6D1E1F",
+"C     c #975F59",
+"D     c #BDBDAB",
+"E     c #878593",
+"F     c #909095",
+"G     c #C0BEAF",
+"H     c #A09EAD",
+"I     c #A6A5A9",
+"J     c #C19978",
+"K     c #7C3D33",
+"L     c #641C1F",
+"M     c #DBDCB8",
+"N     c #B4B492",
+"O     c #E5D9AA",
+"P     c #9F755A",
+"Q     c #50231F",
+"R     c #672424",
+"S     c #E4E3BC",
+"T     c #A5A28D",
+"U     c #D2D1B5",
+"V     c #E7E5C1",
+"W     c #E3DFC0",
+"X     c #E4CCA2",
+"Y     c #894E3A",
+"Z     c #461715",
+"`     c #632524",
+" .    c #979183",
+"..    c #665E46",
+"+.    c #C0B396",
+"@.    c #AAAB90",
+"#.    c #463F31",
+"$.    c #7C7968",
+"%.    c #B3AF92",
+"&.    c #D4BD97",
+"*.    c #804B37",
+"=.    c #461F19",
+"-.    c #42201F",
+";.    c #5A4F43",
+">.    c #504334",
+",.    c #DCD8B5",
+"'.    c #D0BC9D",
+").    c #C8A487",
+"!.    c #82493F",
+"~.    c #3F1310",
+"{.    c #401613",
+"].    c #664B46",
+"^.    c #DCD9BC",
+"/.    c #B8B59D",
+"(.    c #8C8977",
+"_.    c #E9E7C0",
+":.    c #A2897B",
+"<.    c #AE8872",
+"[.    c #CFB89A",
+"}.    c #A6715F",
+"|.    c #4B1D19",
+"1.    c #68272E",
+"2.    c #767361",
+"3.    c #7F8170",
+"4.    c #7B7B6C",
+"5.    c #8E897E",
+"6.    c #827F6E",
+"7.    c #83876F",
+"8.    c #847E70",
+"9.    c #9C7964",
+"0.    c #662F2A",
+"a.    c #5D2D2E",
+"b.    c #783C3F",
+"c.    c #87826E",
+"d.    c #B3B99A",
+"e.    c #D1D1AB",
+"f.    c #DFDDB9",
+"g.    c #C3B191",
+"h.    c #826453",
+"i.    c #6D2B2A",
+"j.    c #884144",
+"k.    c #772B2F",
+"l.    c #3A3A3A",
+"m.    c #AEA28C",
+"n.    c #C1C3A2",
+"o.    c #AEA07E",
+"p.    c #C8C09F",
+"q.    c #C4C6A3",
+"r.    c #B6886B",
+"s.    c #774237",
+"t.    c #7E3E3D",
+"u.    c #854748",
+"v.    c #78373B",
+"w.    c #000000",
+"x.    c #65635C",
+"y.    c #9F9D96",
+"z.    c #7C474A",
+"A.    c #815655",
+"B.    c #7F534F",
+"C.    c #8A5C54",
+"D.    c #74504B",
+"E.    c #8C615F",
+"F.    c #7E2C29",
+"G.    c #8C4240",
+"H.    c #7C322F",
+"I.    c #703634",
+"J.    c #807D74",
+"K.    c #3C3C3C",
+"L.    c #6D1B27",
+"M.    c #631D22",
+"N.    c #65101D",
+"O.    c #76746B",
+"P.    c #5D5C55",
+"Q.    c #6D6B63",
+"R.    c #B3B3B1",
+"S.    c #8C8B89",
+"            .         + @ #   $                 ",
+"      % & * = - ; > , ' ) ! ~ {                 ",
+"      ] ^ / ( _ : < [ } | 1 2 3                 ",
+"        4 ^ ^ ^ ^ ^ ^ ^ ^ ^ 5 6 7               ",
+"        8 ^ 9 0 ^ a 9 b ^ ^ c d e               ",
+"        f g h i j k h l m ^ n o p               ",
+"        q r s t u v w x y ^ z A B C             ",
+"        ] D E F ^ G H I ^ ^ J K L               ",
+"      ] ^ M N ^ ^ ^ ^ ^ ^ O P Q R C             ",
+"    ] ^ S T U V W ^ ^ ^ ^ X Y Z `               ",
+" ...+.+.@.#...$.%.+.+.+.^ &.*.=.-.              ",
+"  +.+.^ ^ ;.>. .,.^ ^ ^ '.).!.~.{.              ",
+" ...].^.^ /.(._.^ :.<.[.^ }.|.1.                ",
+"    2.2.3.4.5.6.7.8.^ ^ 9.0.a.b.                ",
+"    c.^ d.^ ^ e.f.^ g.h.i.j.k.      l.l.        ",
+"      m.n.+.o.p.q.r.s.t.u.v.  w.x.w.y.y.w.x.w.  ",
+"      z.A.B.C.D.E.F.G.H.I.    x.y.y.y.J.J.J.K.  ",
+"        L.C     M.  N.        w.y.y.O.J.P.Q.w.  ",
+"                            l.y.y.O.w.w.R.x.x.l.",
+"                            l.y.J.J.w.S.R.x.K.l.",
+"                              w.J.P.R.R.J.K.w.  ",
+"                              x.J.Q.x.x.K.K.K.  ",
+"                              w.K.w.x.K.w.K.w.  ",
+"                                    l.l.        "};
diff --git a/packages/auctex/images/execviewdvi.xpm b/packages/auctex/images/execviewdvi.xpm
new file mode 100644 (file)
index 0000000..177c623
--- /dev/null
@@ -0,0 +1,46 @@
+/* XPM */
+static char * execviewdvi11_xpm[] = {
+"24 24 19 1",
+"      c None s backgroundToolBarColor",
+".     c #295E29",
+"+     c #5ABD5A",
+"@     c #488148",
+"#     c #4CA14C",
+"$     c #4D904D",
+"%     c #000000",
+"&     c #4FA64F",
+"*     c #FFFFFF",
+"=     c #3A3A3A",
+"-     c #65635C",
+";     c #9F9D96",
+">     c #807D74",
+",     c #3C3C3C",
+"'     c #76746B",
+")     c #5D5C55",
+"!     c #6D6B63",
+"~     c #B3B3B1",
+"{     c #8C8B89",
+"           ...+ .  .  . ",
+"           .  . .  .  . ",
+"           .  . .  .  . ",
+"           .  . @  @  . ",
+"           .  . #$$#  . ",
+"           .  .  @@   . ",
+"     %%    ...+  &&   . ",
+"    %  %                ",
+"   %   %                ",
+"  %   %      %%         ",
+" %%         %  %        ",
+"%* %       %   %        ",
+"%** %  %% %   %         ",
+"%** %%%* %%             ",
+" %  % %** %       ==    ",
+"  %%  %** %    %-%;;%-% ",
+"       %  %    -;;;>>>, ",
+"        %%     %;;'>)!% ",
+"              =;;'%%~--=",
+"              =;>>%{~-,=",
+"               %>)~~>,% ",
+"               ->!--,,, ",
+"               %,%-,%,% ",
+"                  ==    "};
diff --git a/packages/auctex/images/execviewpdf.xpm b/packages/auctex/images/execviewpdf.xpm
new file mode 100644 (file)
index 0000000..fded37a
--- /dev/null
@@ -0,0 +1,42 @@
+/* XPM */
+static char * execviewpdf4_xpm[] = {
+"24 24 15 1",
+"      c None s backgroundToolBarColor",
+".     c #B50000",
+"+     c #AA7979",
+"@     c #000000",
+"#     c #FFFFFF",
+"$     c #3A3A3A",
+"%     c #65635C",
+"&     c #9F9D96",
+"*     c #807D74",
+"=     c #3C3C3C",
+"-     c #76746B",
+";     c #5D5C55",
+">     c #6D6B63",
+",     c #B3B3B1",
+"'     c #8C8B89",
+"          ...+ ...+ ...+",
+"          .  . .  . .   ",
+"          .  . .  . .   ",
+"          ...+ .  . ..+ ",
+"          .    .  . .   ",
+"          .    .  . .   ",
+"     @@   .    ...+ .   ",
+"    @  @                ",
+"   @   @                ",
+"  @   @      @@         ",
+" @@         @  @        ",
+"@# @       @   @        ",
+"@## @  @@ @   @         ",
+"@## @@@# @@             ",
+" @  @ @## @       $$    ",
+"  @@  @## @    @%@&&@%@ ",
+"       @  @    %&&&***= ",
+"        @@     @&&-*;>@ ",
+"              $&&-@@,%%$",
+"              $&**@',%=$",
+"               @*;,,*=@ ",
+"               %*>%%=== ",
+"               @=@%=@=@ ",
+"                  $$    "};
diff --git a/packages/auctex/images/execviewps.xpm b/packages/auctex/images/execviewps.xpm
new file mode 100644 (file)
index 0000000..d62117f
--- /dev/null
@@ -0,0 +1,42 @@
+/* XPM */
+static char * execviewps12_xpm[] = {
+"24 24 15 1",
+"      c None s backgroundToolBarColor",
+".     c #0037C4",
+"+     c #6C84B7",
+"@     c #000000",
+"#     c #FFFFFF",
+"$     c #3A3A3A",
+"%     c #65635C",
+"&     c #9F9D96",
+"*     c #807D74",
+"=     c #3C3C3C",
+"-     c #76746B",
+";     c #5D5C55",
+">     c #6D6B63",
+",     c #B3B3B1",
+"'     c #8C8B89",
+"             ...+ +..+  ",
+"             .  . .  .  ",
+"             .  . .     ",
+"             ...+ +..+  ",
+"             .       .  ",
+"             .    .  .  ",
+"     @@      .    +..+  ",
+"    @  @                ",
+"   @   @                ",
+"  @   @      @@         ",
+" @@         @  @        ",
+"@# @       @   @        ",
+"@## @  @@ @   @         ",
+"@## @@@# @@             ",
+" @  @ @## @       $$    ",
+"  @@  @## @    @%@&&@%@ ",
+"       @  @    %&&&***= ",
+"        @@     @&&-*;>@ ",
+"              $&&-@@,%%$",
+"              $&**@',%=$",
+"               @*;,,*=@ ",
+"               %*>%%=== ",
+"               @=@%=@=@ ",
+"                  $$    "};
diff --git a/packages/auctex/images/gv.xpm b/packages/auctex/images/gv.xpm
new file mode 100644 (file)
index 0000000..92dfb23
--- /dev/null
@@ -0,0 +1,158 @@
+/* XPM */
+static char * gv7_xpm[] = {
+"24 24 131 2",
+"      c None s backgroundToolBarColor",
+".     c #9F9F9F",
+"+     c #2F2F2F",
+"@     c #373737",
+"#     c #323232",
+"$     c #303030",
+"%     c #525252",
+"&     c #ECECEC",
+"*     c #FFFFFF",
+"=     c #F4F4F4",
+"-     c #BE5858",
+";     c #FD6F6F",
+">     c #FF7070",
+",     c #FF9898",
+"'     c #FFE1E1",
+")     c #FE7070",
+"!     c #C96363",
+"~     c #FF6B6B",
+"{     c #DD6666",
+"]     c #FDCFCF",
+"^     c #FFD1D1",
+"/     c #FF8888",
+"(     c #FFCACA",
+"_     c #F37C7C",
+":     c #F56767",
+"<     c #DA6363",
+"[     c #ECE6E6",
+"}     c #F2F2F2",
+"|     c #B6B6B6",
+"1     c #D0CBCB",
+"2     c #FD8686",
+"3     c #FE7878",
+"4     c #FE8787",
+"5     c #DCD6D6",
+"6     c #E1E1E1",
+"7     c #F5EFEF",
+"8     c #895B5B",
+"9     c #848484",
+"0     c #000000",
+"a     c #2B2B2B",
+"b     c #DAACAC",
+"c     c #F3C5C5",
+"d     c #414141",
+"e     c #4C4C4C",
+"f     c #B18383",
+"g     c #5B5B5B",
+"h     c #F86969",
+"i     c #A5A5A5",
+"j     c #3E3E3E",
+"k     c #E4B6B6",
+"l     c #F6C8C8",
+"m     c #5D5D5D",
+"n     c #6C6C6C",
+"o     c #F56666",
+"p     c #1C1C1C",
+"q     c #AFAFAF",
+"r     c #F6F6F6",
+"s     c #FA9494",
+"t     c #F67F7F",
+"u     c #FFF9F9",
+"v     c #FCFCFC",
+"w     c #EDEDED",
+"x     c #F3EDED",
+"y     c #FF7878",
+"z     c #F6F0F0",
+"A     c #F8F8F8",
+"B     c #EB7474",
+"C     c #DA7373",
+"D     c #E2E2E2",
+"E     c #A4A4A4",
+"F     c #F0F0F0",
+"G     c #D5D5D5",
+"H     c #393939",
+"I     c #161616",
+"J     c #8C8C8C",
+"K     c #F7F7F7",
+"L     c #BEBEBE",
+"M     c #191919",
+"N     c #989898",
+"O     c #BCBCBC",
+"P     c #2A2A2A",
+"Q     c #1B1B1B",
+"R     c #313131",
+"S     c #AAAAAA",
+"T     c #C7C7C7",
+"U     c #101010",
+"V     c #D3D3D3",
+"W     c #595959",
+"X     c #E4E4E4",
+"Y     c #969696",
+"Z     c #FBFBFB",
+"`     c #D1D1D1",
+" .    c #717171",
+"..    c #0A0A0A",
+"+.    c #B7B7B7",
+"@.    c #EEEEEE",
+"#.    c #F9F9F9",
+"$.    c #DBDBDB",
+"%.    c #EBEBEB",
+"&.    c #D2D2D2",
+"*.    c #6E6E6E",
+"=.    c #7D7D7D",
+"-.    c #EAEAEA",
+";.    c #A2A2A2",
+">.    c #CCCCCC",
+",.    c #E8E8E8",
+"'.    c #4E4E4E",
+").    c #ABABAB",
+"!.    c #F5F5F5",
+"~.    c #6B6B6B",
+"{.    c #171717",
+"].    c #434343",
+"^.    c #CECECE",
+"/.    c #4D4D4D",
+"(.    c #ADADAD",
+"_.    c #D0D0D0",
+":.    c #9E9E9E",
+"<.    c #808080",
+"[.    c #FAFAFA",
+"}.    c #858585",
+"|.    c #A0A0A0",
+"1.    c #BDBDBD",
+"2.    c #838383",
+"3.    c #181818",
+"4.    c #8F8F8F",
+"5.    c #959595",
+"6.    c #D6D6D6",
+"7.    c #DDDDDD",
+"8.    c #C1C1C1",
+"9.    c #7B7B7B",
+"0.    c #8E8E8E",
+"                                                ",
+"                . + @ @ @ # .                   ",
+"              $ % & * * * = % %                 ",
+"            - ; > , ' * ' , > ) !               ",
+"          ~ { ] ^ / > ( > / ^ ^ _ :             ",
+"        ~ < [ } | 1 2 3 4 5 | 6 7 { ~           ",
+"        ~ 8 * 9 0 a b ~ c d 0 e * f ~           ",
+"    $ g h 8 * i 0 j k ~ l m 0 n * f o 0 g       ",
+"  p q r s t u v w x 4 y / z w A u B C D D @     ",
+"  p E F ' > / ^ ^ / > ( > / ^ ^ / ) ' * G H     ",
+"  I @ J K ' , > > , ' * ' , > > , ' * L E H     ",
+"      M N * * * * * * * * * * * * * O P Q       ",
+"        R S * * * * * * * * * * * T a           ",
+"        U S * * * * * * * * * * * V W           ",
+"        U S * * * * * * * * * * * X Y U         ",
+"        U S * * * * * * * * * * * Z `  ...      ",
+"        R +.* * Z @.#.* * * * * $.%.* &.*.Q     ",
+"      0 =.%.* * -.;.>.v v * * ,.'.).!.v >.~.{.  ",
+"      ].q * * * ^./.(.A A * * _.p :.%.* %.:.p   ",
+"    @ <.@.* [.r }.R |.1.1.L L 2.3.:.%.%.%.4.Q   ",
+"    H 5.6.7.8.).0 0 j % % % % M 0 9.9.9. .%     ",
+"    3. .0.0.m @                   % % % %       ",
+"      @ @ @ @                                   ",
+"                                                "};
diff --git a/packages/auctex/images/jumpdvi.xpm b/packages/auctex/images/jumpdvi.xpm
new file mode 100644 (file)
index 0000000..6cc568d
--- /dev/null
@@ -0,0 +1,74 @@
+/* XPM */
+static char * jumpdvi19_xpm[] = {
+"24 24 47 1",
+"      c None s backgroundToolBarColor",
+".     c #212121",
+"+     c #EAD4CB",
+"@     c #E3C5BA",
+"#     c #DBB4A4",
+"$     c #EEDED7",
+"%     c #FAF7F5",
+"&     c #F2E5E1",
+"*     c #D2AC99",
+"=     c #000000",
+"-     c #8D9E7C",
+";     c #CDD9C2",
+">     c #DEE6D7",
+",     c #DAE2D1",
+"'     c #9BAD89",
+")     c #B79382",
+"!     c #707D63",
+"~     c #B4C6A2",
+"{     c #ACC098",
+"]     c #636E57",
+"^     c #AB8A7A",
+"/     c #E4E9DD",
+"(     c #657158",
+"_     c #C49F8D",
+":     c #C3D1B5",
+"<     c #808F70",
+"[     c #4C5442",
+"}     c #58634E",
+"|     c #E6EBE0",
+"1     c #D4DDC9",
+"2     c #CAD7BE",
+"3     c #90A17F",
+"4     c #5F6A53",
+"5     c #535C49",
+"6     c #E9EDE4",
+"7     c #616D56",
+"8     c #A8BC95",
+"9     c #7C8B6E",
+"0     c #4C5443",
+"a     c #B6C2AA",
+"b     c #5E6953",
+"c     c #295E29",
+"d     c #5ABD5A",
+"e     c #488148",
+"f     c #4CA14C",
+"g     c #4D904D",
+"h     c #4FA64F",
+"                        ",
+"                        ",
+"                        ",
+"           ...          ",
+"         ..+@#..        ",
+"         .$%&@*.        ",
+"     =======+#**.       ",
+"     =-;>,'=###).       ",
+"      =!~{]=##*^.       ",
+"    ==/;{(]=#*_.        ",
+"  ==/;:{<[}=))..        ",
+" =|12{{34=5=..          ",
+"  =6{{{7= ==            ",
+"   =>890=               ",
+"    =a]=                ",
+"     =b=                ",
+"      =    cccd c  c  c ",
+"           c  c c  c  c ",
+"           c  c c  c  c ",
+"           c  c e  e  c ",
+"           c  c fggf  c ",
+"           c  c  ee   c ",
+"           cccd  hh   c ",
+"                        "};
diff --git a/packages/auctex/images/ltx-symb-turn-off.xpm b/packages/auctex/images/ltx-symb-turn-off.xpm
new file mode 100644 (file)
index 0000000..bcb6d4f
--- /dev/null
@@ -0,0 +1,47 @@
+/* XPM */
+static char * ltx_symb_turn_off_xpm[] = {
+"24 24 20 1",
+"      c None s backgroundToolBarColor",
+".     c #AEAEAE",
+"+     c #000000",
+"@     c #0A0A0A",
+"#     c #1F1F1F",
+"$     c #C9C9C9",
+"%     c #353535",
+"&     c #999999",
+"*     c #4D4D4D",
+"=     c #777777",
+"-     c #141414",
+";     c #878787",
+">     c #686868",
+",     c #5A5A5A",
+"'     c #FF5858",
+")     c #FFB9B9",
+"!     c #FF0000",
+"~     c #FF9595",
+"{     c #414141",
+"]     c #292929",
+"                        ",
+"                        ",
+"                        ",
+".+@########++@$         ",
+" %@&       .*@=         ",
+" $--$        ;%         ",
+"  .@%         >$        ",
+"   ,+=                  ",
+"    %@.                 ",
+"    $--$          '   ' ",
+"     &+*         )!' '!)",
+"      *@$          ~!~  ",
+"     $#;           ~!~  ",
+"     %,          )!' '!)",
+"    >%            '   ' ",
+"   ;#$        &$        ",
+"  .-.        ${         ",
+"  ];        .],         ",
+" *]>>>>>>>>]++.         ",
+"${{{{{{{{{{{{*          ",
+"                        ",
+"                        ",
+"                        ",
+"                        "};
diff --git a/packages/auctex/images/ltx-symb-turn-on.xpm b/packages/auctex/images/ltx-symb-turn-on.xpm
new file mode 100644 (file)
index 0000000..d4d1ea3
--- /dev/null
@@ -0,0 +1,46 @@
+/* XPM */
+static char * ltx_symb_turn_on_xpm[] = {
+"24 24 19 1",
+"      c None s backgroundToolBarColor",
+".     c #AEAEAE",
+"+     c #000000",
+"@     c #0A0A0A",
+"#     c #1F1F1F",
+"$     c #C9C9C9",
+"%     c #353535",
+"&     c #999999",
+"*     c #4D4D4D",
+"=     c #777777",
+"-     c #141414",
+";     c #878787",
+">     c #686868",
+",     c #5A5A5A",
+"'     c #79DECA",
+")     c #00AA88",
+"!     c #5DC8B3",
+"~     c #414141",
+"{     c #292929",
+"                        ",
+"                        ",
+"                        ",
+".+@########++@$         ",
+" %@&       .*@=         ",
+" $--$        ;%         ",
+"  .@%         >$        ",
+"   ,+=                 '",
+"    %@.               ) ",
+"    $--$             )) ",
+"     &+*        ')! ))  ",
+"      *@$        ))))   ",
+"     $#;         !))    ",
+"     %,          ')'    ",
+"    >%                  ",
+"   ;#$        &$        ",
+"  .-.        $~         ",
+"  {;        .{,         ",
+" *{>>>>>>>>{++.         ",
+"$~~~~~~~~~~~~*          ",
+"                        ",
+"                        ",
+"                        ",
+"                        "};
diff --git a/packages/auctex/images/pdftex.xpm b/packages/auctex/images/pdftex.xpm
new file mode 100644 (file)
index 0000000..ca94a24
--- /dev/null
@@ -0,0 +1,206 @@
+/* XPM */
+static char * pdftex22_xpm[] = {
+"24 24 179 2",
+"      c None s backgroundToolBarColor",
+".     c #3E9543",
+"+     c #409644",
+"@     c #3D9D45",
+"#     c #3F9B42",
+"$     c #4C2A1F",
+"%     c #4E3124",
+"&     c #727E51",
+"*     c #598A4E",
+"=     c #5B6647",
+"-     c #88624F",
+";     c #89383B",
+">     c #8B343B",
+",     c #6D5852",
+"'     c #506D48",
+")     c #4C843E",
+"!     c #648752",
+"~     c #B8A789",
+"{     c #80624D",
+"]     c #7D6951",
+"^     c #FFFFC1",
+"/     c #94A676",
+"(     c #8F8668",
+"_     c #977567",
+":     c #A86660",
+"<     c #986C6A",
+"[     c #758660",
+"}     c #708C60",
+"|     c #6A6C4E",
+"1     c #C3C599",
+"2     c #988167",
+"3     c #5A3125",
+"4     c #561E1C",
+"5     c #958066",
+"6     c #BEA384",
+"7     c #68372B",
+"8     c #672124",
+"9     c #5B392F",
+"0     c #94917B",
+"a     c #AFAC91",
+"b     c #B8B39C",
+"c     c #BDBCA0",
+"d     c #B39073",
+"e     c #582522",
+"f     c #712E2B",
+"g     c #6F292C",
+"h     c #83826F",
+"i     c #908F88",
+"j     c #F8FFFD",
+"k     c #686C8D",
+"l     c #D7DBB8",
+"m     c #716D76",
+"n     c #7B7B92",
+"o     c #D5D5B3",
+"p     c #DBBD9A",
+"q     c #81463B",
+"r     c #691A19",
+"s     c #838270",
+"t     c #888791",
+"u     c #6462D0",
+"v     c #2C2B87",
+"w     c #DAD9C7",
+"x     c #868394",
+"y     c #716DDC",
+"z     c #2F2C94",
+"A     c #C7C6B7",
+"B     c #D2AF8D",
+"C     c #84473C",
+"D     c #6D1E1F",
+"E     c #6E262C",
+"F     c #BDBDAB",
+"G     c #878593",
+"H     c #909095",
+"I     c #C0BEAF",
+"J     c #A09EAD",
+"K     c #A6A5A9",
+"L     c #C19978",
+"M     c #7C3D33",
+"N     c #641C1F",
+"O     c #662633",
+"P     c #DBDCB8",
+"Q     c #B4B492",
+"R     c #E5D9AA",
+"S     c #9F755A",
+"T     c #50231F",
+"U     c #672424",
+"V     c #8E3B4B",
+"W     c #E4E3BC",
+"X     c #A5A28D",
+"Y     c #D2D1B5",
+"Z     c #E7E5C1",
+"`     c #E3DFC0",
+" .    c #E4CCA2",
+"..    c #894E3A",
+"+.    c #461715",
+"@.    c #632524",
+"#.    c #95404E",
+"$.    c #777776",
+"%.    c #C0B396",
+"&.    c #AAAB90",
+"*.    c #463F31",
+"=.    c #665E46",
+"-.    c #7C7968",
+";.    c #B3AF92",
+">.    c #D4BD97",
+",.    c #804B37",
+"'.    c #461F19",
+").    c #42201F",
+"!.    c #5A4F43",
+"~.    c #504334",
+"{.    c #979183",
+"].    c #DCD8B5",
+"^.    c #D0BC9D",
+"/.    c #C8A487",
+"(.    c #82493F",
+"_.    c #3F1310",
+":.    c #401613",
+"<.    c #664B46",
+"[.    c #DCD9BC",
+"}.    c #B8B59D",
+"|.    c #8C8977",
+"1.    c #E9E7C0",
+"2.    c #A2897B",
+"3.    c #AE8872",
+"4.    c #CFB89A",
+"5.    c #A6715F",
+"6.    c #4B1D19",
+"7.    c #68272E",
+"8.    c #6E2933",
+"9.    c #453E37",
+"0.    c #767361",
+"a.    c #7F8170",
+"b.    c #7B7B6C",
+"c.    c #8E897E",
+"d.    c #827F6E",
+"e.    c #83876F",
+"f.    c #847E70",
+"g.    c #9C7964",
+"h.    c #662F2A",
+"i.    c #5D2D2E",
+"j.    c #783C3F",
+"k.    c #87826E",
+"l.    c #B3B99A",
+"m.    c #D1D1AB",
+"n.    c #DFDDB9",
+"o.    c #C3B191",
+"p.    c #826453",
+"q.    c #6D2B2A",
+"r.    c #884144",
+"s.    c #772B2F",
+"t.    c #702F34",
+"u.    c #AEA28C",
+"v.    c #C1C3A2",
+"w.    c #AEA07E",
+"x.    c #C8C09F",
+"y.    c #C4C6A3",
+"z.    c #B6886B",
+"A.    c #774237",
+"B.    c #7E3E3D",
+"C.    c #854748",
+"D.    c #78373B",
+"E.    c #6A2932",
+"F.    c #5F343C",
+"G.    c #7C474A",
+"H.    c #815655",
+"I.    c #7F534F",
+"J.    c #8A5C54",
+"K.    c #74504B",
+"L.    c #8C615F",
+"M.    c #7E2C29",
+"N.    c #8C4240",
+"O.    c #7C322F",
+"P.    c #703634",
+"Q.    c #6D1B27",
+"R.    c #975F59",
+"S.    c #631D22",
+"T.    c #65101D",
+"U.    c #B50000",
+"V.    c #AA7979",
+"                  .         + @ #   $           ",
+"            % & * = - ; > , ' ) ! ~ {           ",
+"            ] ^ / ( _ : < [ } | 1 2 3 4         ",
+"              5 ^ ^ ^ ^ ^ ^ ^ ^ ^ 6 7 8         ",
+"              9 ^ 0 a ^ b 0 c ^ ^ d e f g       ",
+"              h i j k l m j n o ^ p q r         ",
+"              s t u v w x y z A ^ B C D E       ",
+"              ] F G H ^ I J K ^ ^ L M N O       ",
+"            ] ^ P Q ^ ^ ^ ^ ^ ^ R S T U V       ",
+"          ] ^ W X Y Z ` ^ ^ ^ ^  ...+.@.#.      ",
+"      $.$.%.%.&.*.=.-.;.%.%.%.^ >.,.'.).        ",
+"        %.%.^ ^ !.~.{.].^ ^ ^ ^./.(._.:.        ",
+"      $.$.<.[.^ }.|.1.^ 2.3.4.^ 5.6.7.8.        ",
+"          9.0.a.b.c.d.e.f.^ ^ g.h.i.j.          ",
+"          k.^ l.^ ^ m.n.^ o.p.q.r.s.t.          ",
+"            u.v.%.w.x.y.z.A.B.C.D.E.F.          ",
+"            G.H.I.J.K.L.M.N.O.P.                ",
+"              Q.R.    S.  T.                    ",
+"                                                ",
+"          U.U.U.V.  U.U.U.V.  U.U.U.V.          ",
+"          U.    U.  U.    U.  U.                ",
+"          U.U.U.V.  U.    U.  U.U.V.            ",
+"          U.        U.    U.  U.                ",
+"          U.        U.U.U.V.  U.                "};
diff --git a/packages/auctex/images/prverr16.xpm b/packages/auctex/images/prverr16.xpm
new file mode 100644 (file)
index 0000000..88d71d3
--- /dev/null
@@ -0,0 +1,31 @@
+/* XPM */
+static char *noway16[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 9 1",
+"  c red",
+". c #FD0D0D",
+"X c #FA1C1C",
+"o c #F52D2D",
+"O c #FB5B5B",
+"+ c #FC6060",
+"@ c #FFBBBB",
+"# c #FEFEFE",
+"$ c None",
+/* pixels */
+"$$$$$ XXXX $$$$$",
+"$$$X.      .X$$$",
+"$$o          o$$",
+"$X.          .X$",
+"$.            .$",
+"                ",
+"O@@@@@@@@@@@@@@O",
+"+##############+",
+"+##############+",
+"O@@@@@@@@@@@@@@O",
+"                ",
+"$.            .$",
+"$X.          .X$",
+"$$o          o$$",
+"$$$X.      .X$$$",
+"$$$$$ XXXX $$$$$"
+};
diff --git a/packages/auctex/images/prverr20.xpm b/packages/auctex/images/prverr20.xpm
new file mode 100644 (file)
index 0000000..18e5eae
--- /dev/null
@@ -0,0 +1,35 @@
+/* XPM */
+static char *noway20[] = {
+/* columns rows colors chars-per-pixel */
+"20 20 9 1",
+"  c red",
+". c #FF0404",
+"X c #FD0F0F",
+"o c #F91919",
+"O c #F82828",
+"+ c #F33636",
+"@ c #ED4A4A",
+"# c #FEFEFE",
+"$ c None",
+/* pixels */
+"$$$$$$@+OXXO+@$$$$$$",
+"$$$$OO.      .OO$$$$",
+"$$$@.          .@$$$",
+"$$@.            .@$$",
+"$O.              .O$",
+"$o                o$",
+"@.                .@",
+"+                  +",
+"o##################o",
+"o##################o",
+"o##################o",
+"o##################o",
+"+                  +",
+"@.                .@",
+"$o                o$",
+"$O.              .O$",
+"$$@.            .@$$",
+"$$$@.          .@$$$",
+"$$$$OO.      .OO$$$$",
+"$$$$$$@+OXXO+@$$$$$$"
+};
diff --git a/packages/auctex/images/prverr24.xbm b/packages/auctex/images/prverr24.xbm
new file mode 100644 (file)
index 0000000..1a369c5
--- /dev/null
@@ -0,0 +1,9 @@
+#define wutz_width 24
+#define wutz_height 24
+static unsigned char wutz_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xc0, 0xff, 0x03, 0xf0, 0xff, 0x0f,
+   0xf8, 0xff, 0x1f, 0xf8, 0xff, 0x1f, 0xfc, 0xff, 0x3f, 0xfc, 0xff, 0x3f,
+   0xfe, 0xff, 0x7f, 0x02, 0x00, 0x40, 0x01, 0x00, 0x80, 0x01, 0x00, 0x80,
+   0x01, 0x00, 0x80, 0x01, 0x00, 0x80, 0x02, 0x00, 0x40, 0xfe, 0xff, 0x7f,
+   0xfc, 0xff, 0x3f, 0xfc, 0xff, 0x3f, 0xf8, 0xff, 0x1f, 0xf8, 0xff, 0x1f,
+   0xf0, 0xff, 0x0f, 0xc0, 0xff, 0x03, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00 };
diff --git a/packages/auctex/images/prverr24.xpm b/packages/auctex/images/prverr24.xpm
new file mode 100644 (file)
index 0000000..f855e95
--- /dev/null
@@ -0,0 +1,39 @@
+/* XPM */
+static char *noway24[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 9 1",
+"  c red",
+". c #FF0404",
+"X c #FD0C0C",
+"o c #F91919",
+"O c #F62929",
+"+ c #F34C4C",
+"@ c #FF9090",
+"# c #FEFEFE",
+"$ c None",
+/* pixels */
+"$$$$$$$$+OOXXOO+$$$$$$$$",
+"$$$$$$OX        XO$$$$$$",
+"$$$$+X            X+$$$$",
+"$$$+                +$$$",
+"$$+                  +$$",
+"$$X                  X$$",
+"$O                    O$",
+"$X                    X$",
+"+                      +",
+"O+@@@@@@@@@@@@@@@@@@@@+O",
+"o######################o",
+"X######################X",
+"X######################X",
+"o######################o",
+"O+@@@@@@@@@@@@@@@@@@@@+O",
+"+                      +",
+"$X                    X$",
+"$O                    O$",
+"$$X                  X$$",
+"$$+                  +$$",
+"$$$+                +$$$",
+"$$$$+X            X+$$$$",
+"$$$$$$OX        XO$$$$$$",
+"$$$$$$$$+OOXXOO+$$$$$$$$"
+};
diff --git a/packages/auctex/images/prvtex-cap-up.xpm b/packages/auctex/images/prvtex-cap-up.xpm
new file mode 100644 (file)
index 0000000..726d81b
--- /dev/null
@@ -0,0 +1,48 @@
+/* XPM */
+static char * preview_cap_up_xpm[] = {
+"33 33 12 1",
+"      c None",
+".     c #BFBFBF s backgroundToolBarColor",
+"+     c #000000 s foregroundToolBarColor",
+"!     c #000000",
+"@     c #FFFFFF",
+"#     c #7C7C7C",
+"$     c #A0A0A0",
+"%     c #E5E5E5",
+"&     c #BABABA",
+"*     c #1D1D1D",
+"=     c #424242",
+"-     c #676767",
+".................................",
+".....!!!!!!!!!!!!!!!!!!!!!!......",
+".....!@@@@@@@@@@@@@@@@@@@@!......",
+".....!@@@@@@@@@#$@@@@@@@@@!......",
+".....!@@@@@@@@%!&@@@@@@@@@!......",
+".....!@@@@@@@@#$@@@@@@@@@@!......",
+".....!@@@@@@@%*#%@%%@@@@&@!......",
+".....!#!!!!=$*#-!$#!&@@#*@!......",
+".....!@@&&@@#$@@%@@%=@%!$@!......",
+".....!@@&&@@&-=$@@@@$$-=@@!......",
+".....!@@&&@@$##&@@@@@=!&@@!......",
+".....!@@&#%@#$@@&&@@@*-@@@!......",
+".....!@@@*!@&!#-*@@@$!$@@@!......",
+".....!@@@%%@@%#$@@@@!#-@@@!......",
+".....!@%==@@@@@@@@@#*@-%@@!......",
+"......!=#=@@@@@@@@%!&@%=#@!......",
+"......%$$=@@@@@@@@$=@@@&=@!......",
+".....#.&$#=&@@@@@@@@@@@@@@!......",
+".....#...#-*$@@@@@@@@@@@@@!......",
+"......#..###===*%%@@@@@@@@!......",
+"......#...#...#.!!!!!!!!!!!......",
+".......#..#...#..#.#..#..#.......",
+".......#..#...#.##.#..#..#.......",
+"........#..##..#.#..###...#......",
+"........#.................#......",
+"..+++............................",
+"..+..+.+.+.+..+..+.+..+..+.+.+...",
+"..+..+.++.+.+.+..+...+.+.+.+.+...",
+"..+++..+..+++.+..+.+.+++.+.+.+...",
+"..+....+..+...+.+..+.+....+.+....",
+"..+....+...++..+...+..++..+.+....",
+".................................",
+"................................."};
diff --git a/packages/auctex/images/prvtex12.xbm b/packages/auctex/images/prvtex12.xbm
new file mode 100644 (file)
index 0000000..2737176
--- /dev/null
@@ -0,0 +1,6 @@
+/* Created with The GIMP */
+#define preview12_width 12
+#define preview12_height 12
+static unsigned char preview12_bits[] = {
+   0xff, 0x0f, 0x41, 0x08, 0x21, 0x08, 0x6f, 0x0d, 0x35, 0x0a, 0x75, 0x0a,
+   0x6b, 0x0b, 0x82, 0x0c, 0x7c, 0x08, 0xf0, 0x08, 0x00, 0x0f, 0x00, 0x00 };
diff --git a/packages/auctex/images/prvtex12.xpm b/packages/auctex/images/prvtex12.xpm
new file mode 100644 (file)
index 0000000..2a205a7
--- /dev/null
@@ -0,0 +1,32 @@
+/* XPM */
+static char * preview12_xpm[] = {
+"12 12 17 1",
+"      c None",
+".     c #020202",
+"+     c #1E1E1A",
+"@     c #626256",
+"#     c #7D7D70",
+"$     c #8A8A7A",
+"%     c #969686",
+"&     c #A6A692",
+"*     c #B2B29E",
+"=     c #46463E",
+"-     c #BEBEAA",
+";     c #1A1A16",
+">     c #CECEB2",
+",     c #363632",
+"'     c #6E6E62",
+")     c #0E0E0E",
+"!     c #52524A",
+"............",
+".>>>>$*>>>>.",
+".>>>>&>>>>>.",
+".'.,@+##&$%.",
+".>)>'#>>&!>.",
+".>=%#%%>@&>.",
+"..,@>*>-@&>=",
+" # #,>>#-%%.",
+" .  @,%>>>>.",
+"  .  !;#>>>.",
+"  .  .   ,;.",
+"   .  ..  .."};
diff --git a/packages/auctex/images/prvtex16.xbm b/packages/auctex/images/prvtex16.xbm
new file mode 100644 (file)
index 0000000..6fbe9c2
--- /dev/null
@@ -0,0 +1,7 @@
+/* Created with The GIMP */
+#define preview16_width 16
+#define preview16_height 16
+static unsigned char preview16_bits[] = {
+   0xff, 0xff, 0x01, 0x81, 0x81, 0x80, 0xbd, 0xad, 0x49, 0xa8, 0xc9, 0x91,
+   0x49, 0x90, 0x9e, 0x99, 0x1c, 0xac, 0x7d, 0x84, 0xf1, 0x80, 0xf2, 0x87,
+   0x22, 0xfa, 0x24, 0x52, 0x24, 0x5a, 0xc8, 0x94 };
diff --git a/packages/auctex/images/prvtex16.xpm b/packages/auctex/images/prvtex16.xpm
new file mode 100644 (file)
index 0000000..8414484
--- /dev/null
@@ -0,0 +1,36 @@
+/* XPM */
+static char * preview16_xpm[] = {
+"16 16 17 1",
+"      c None",
+".     c #020202",
+"+     c #1A1A16",
+"@     c #636357",
+"#     c #6E6E62",
+"$     c #828276",
+"%     c #8A8A7A",
+"&     c #969686",
+"*     c #A6A692",
+"=     c #B2B29E",
+"-     c #BABAA6",
+";     c #363632",
+">     c #BEBEAA",
+",     c #52524A",
+"'     c #CECEB2",
+")     c #46463E",
+"!     c #7A7A6E",
+"................",
+".''''''>@''''''.",
+".''''''%>''''''.",
+".'!..#*;,=#*'#=.",
+".''.''!*>''&=@'.",
+".''.''#@>''>)='.",
+".'',,'#!@>'&@''.",
+" .;@;''*>'')%''.",
+" -$$;'''''%!>@=.",
+". &$@;&'''*''>'.",
+".   @,+$'''''''.",
+" .  ...;;;+''''.",
+" .   .   . .....",
+"  .  .   .  . . ",
+"  .  .   . .. . ",
+"   .  ..  . .  ."};
diff --git a/packages/auctex/images/prvtex20.xpm b/packages/auctex/images/prvtex20.xpm
new file mode 100644 (file)
index 0000000..cd6df1d
--- /dev/null
@@ -0,0 +1,40 @@
+/* XPM */
+static char * preview20_xpm[] = {
+"20 20 17 1",
+"      c None",
+".     c #000200",
+"+     c #151614",
+"@     c #20211F",
+"#     c #31312A",
+"$     c #3D3C35",
+"%     c #474439",
+"&     c #504F48",
+"*     c #626054",
+"=     c #727063",
+"-     c #7E7E6F",
+";     c #888A7A",
+">     c #969987",
+",     c #A9A992",
+"'     c #B8B8A1",
+")     c #C6C5AA",
+"!     c #CFCDB1",
+" .@@@@@@@@@@@@@@@@. ",
+" %!!!!!!!''!!!!!!!% ",
+" %!!!!!!)&>!!!!!!!% ",
+" %!!!!!!>*'!!!!!!!% ",
+" %!!!!!)&*')')!!''% ",
+" @&@+#*&*=#;&*)'%-% ",
+" %!,>!,=;,)!)=,-$'% ",
+" %!,>!'=&-!!!'*#;!% ",
+" %!,-),=>','!!$&)!% ",
+" %!)$$'&&=%)!,+;!!% ",
+" %!','!);;!!)%**!!% ",
+" $;*$!!!!!!!;%'->)% ",
+"  *=$!!!!!!)*-!'*;% ",
+" @>;*='!!!!),)!!''% ",
+" .  *&&,!!!!!!!!!!% ",
+"    ..+##@>,,,,,,,$ ",
+"  .  .  . ......... ",
+"  .  .  . ...  . .  ",
+"   .  .  . . ...  . ",
+"   .              . "};
diff --git a/packages/auctex/images/prvtex24.xbm b/packages/auctex/images/prvtex24.xbm
new file mode 100644 (file)
index 0000000..91c07f3
--- /dev/null
@@ -0,0 +1,10 @@
+/* Created with The GIMP */
+#define preview_width 24
+#define preview_height 24
+static unsigned char preview_bits[] = {
+   0xfe, 0xff, 0x7f, 0x02, 0x00, 0x40, 0x02, 0x18, 0x40, 0x02, 0x0c, 0x40,
+   0x02, 0x04, 0x40, 0x02, 0x00, 0x50, 0xfe, 0xde, 0x59, 0x32, 0x03, 0x49,
+   0x32, 0x0f, 0x4f, 0x32, 0x07, 0x46, 0x32, 0x23, 0x46, 0x62, 0x1e, 0x47,
+   0x02, 0x0c, 0x47, 0x02, 0x80, 0x4d, 0x32, 0x80, 0x48, 0x2c, 0xc0, 0x58,
+   0x42, 0x00, 0x40, 0xc2, 0x01, 0x40, 0xe4, 0x0e, 0x40, 0x44, 0xf4, 0x7f,
+   0x48, 0xa4, 0x24, 0x48, 0xb4, 0x24, 0x90, 0x29, 0x47, 0x10, 0x00, 0x40 };
diff --git a/packages/auctex/images/prvtex24.xpm b/packages/auctex/images/prvtex24.xpm
new file mode 100644 (file)
index 0000000..316ae31
--- /dev/null
@@ -0,0 +1,37 @@
+/* XPM */
+static char * preview_xpm[] = {
+"24 24 10 1",
+"      c None",
+".     c #000000",
+"+     c #CECEB2",
+"@     c #656559",
+"#     c #818174",
+"$     c #B9B9A4",
+"%     c #969686",
+"&     c #181815",
+"*     c #363630",
+"=     c #53534B",
+" ...................... ",
+" .++++++++++++++++++++. ",
+" .+++++++++@#+++++++++. ",
+" .++++++++$.%+++++++++. ",
+" .++++++++@#++++++++++. ",
+" .+++++++$&@$+$$++++%+. ",
+" .@....*#&@=.#@.%++@&+. ",
+" .++%%++@#++$++$*+$.#+. ",
+" .++%%++%=*#++++##=*++. ",
+" .++%%++#@@%+++++*.%++. ",
+" .++%@$+@#++%%+++&=+++. ",
+" .+++&.+%.@=&+++#.#+++. ",
+" .+++$$++$@#++++.@=+++. ",
+" .+$**+++++++++@&+=$++. ",
+"  .*@*++++++++$.%+$*@+. ",
+"  $##*++++++++#*+++%*+. ",
+" . %#@*%++++++++++++++. ",
+" .   @=&#+++++++++++++. ",
+"  .  ...***&$$++++++++. ",
+"  .   .   . ........... ",
+"   .  .   .  . .  .  .  ",
+"   .  .   . .. .  .  .  ",
+"    .  ..  . .  ...   . ",
+"    .                 . "};
diff --git a/packages/auctex/images/prvwrk12.xpm b/packages/auctex/images/prvwrk12.xpm
new file mode 100644 (file)
index 0000000..7b4bec9
--- /dev/null
@@ -0,0 +1,32 @@
+/* XPM */
+static char * nwork12_xpm[] = {
+"12 12 17 1",
+"      c None",
+".     c #0F110E",
+"+     c #161815",
+"@     c #1F211E",
+"#     c #383937",
+"$     c #6A6C69",
+"%     c #818380",
+"&     c #E46767",
+"*     c #FF6467",
+"=     c #959794",
+"-     c #DC9897",
+";     c #ADAFAC",
+">     c #FF9797",
+",     c #C6C8C5",
+"'     c #FFCBCA",
+")     c #E4E6E3",
+"!     c #FBFDFA",
+"     >>     ",
+"    '**'    ",
+"    >>>>    ",
+"   '*''*'   ",
+"   >>!)>>   ",
+"  '*,==,*'  ",
+"  >>$@=!>>  ",
+" '*';#;!'*' ",
+" >>!$$=!,-> ",
+"'*'=)%!%.@&'",
+">>!=!=;..+$>",
+" ********** "};
diff --git a/packages/auctex/images/prvwrk14.xpm b/packages/auctex/images/prvwrk14.xpm
new file mode 100644 (file)
index 0000000..6be87c6
--- /dev/null
@@ -0,0 +1,34 @@
+/* XPM */
+static char * nwork14_xpm[] = {
+"14 14 17 1",
+"      c None",
+".     c #000100",
+"+     c #161816",
+"@     c #222421",
+"#     c #2A2C29",
+"$     c #363836",
+"%     c #525451",
+"&     c #686A67",
+"*     c #828481",
+"=     c #FF6467",
+"-     c #949693",
+";     c #A4A6A3",
+">     c #FF9797",
+",     c #B8BAB7",
+"'     c #D8D6D4",
+")     c #FFCBCA",
+"!     c #FAFDF9",
+"      >>      ",
+"     )==)     ",
+"     >>>>     ",
+"    )=))=)    ",
+"    >>!!>>    ",
+"   )=)!!)=)   ",
+"   >>''@!>>   ",
+"  )=&%#!!)=)  ",
+"  >>-@$!!!>>  ",
+" )=);%&!!!)=) ",
+" >>!&&;,!&,>> ",
+")=)*',,'@.+'=)",
+">>!-!';$+++%>>",
+" ============ "};
diff --git a/packages/auctex/images/prvwrk16.xpm b/packages/auctex/images/prvwrk16.xpm
new file mode 100644 (file)
index 0000000..fd74352
--- /dev/null
@@ -0,0 +1,36 @@
+/* XPM */
+static char * nwork16_xpm[] = {
+"16 16 17 1",
+"      c None",
+".     c #040703",
+"+     c #0E100D",
+"@     c #262825",
+"#     c #434542",
+"$     c #4C4E4B",
+"%     c #5B5D5A",
+"&     c #70726F",
+"*     c #868885",
+"=     c #D86467",
+"-     c #FF6467",
+";     c #A69F9F",
+">     c #FF9797",
+",     c #B6B8B5",
+"'     c #C7C9C6",
+")     c #D5D7D4",
+"!     c #FAFCF9",
+"       >>       ",
+"       --       ",
+"      >-->      ",
+"      ->>-      ",
+"     >-!!->     ",
+"     ->!!>-     ",
+"    >-!!&*->    ",
+"    -;#@;)>-    ",
+"   >-#&.;!!->   ",
+"   ->!+@,!!>-   ",
+"  >-!&@%;!!!->  ",
+"  ->)#,%,,&.;-  ",
+" >-!%'!#!$..+=> ",
+" ->!&!!&&..++#- ",
+">->>>>>>>>>>>>->",
+" >>>>>>>>>>>>>> "};
diff --git a/packages/auctex/images/prvwrk20.xpm b/packages/auctex/images/prvwrk20.xpm
new file mode 100644 (file)
index 0000000..d4b2045
--- /dev/null
@@ -0,0 +1,40 @@
+/* XPM */
+static char * nwork20_xpm[] = {
+"20 20 17 1",
+"      c None",
+".     c #000100",
+"+     c #262825",
+"@     c #2B2D2A",
+"#     c #444643",
+"$     c #575956",
+"%     c #726D6B",
+"&     c #D16668",
+"*     c #FF6467",
+"=     c #979794",
+"-     c #E4999A",
+";     c #B1B3B0",
+">     c #FF9797",
+",     c #C9CBC8",
+"'     c #D3D5D2",
+")     c #E5E7E3",
+"!     c #FDFFFB",
+"         **         ",
+"        >**>        ",
+"        ****        ",
+"       >****>       ",
+"       **>>**       ",
+"      >**!!**>      ",
+"      **>!!>**      ",
+"     >**!!)!**>     ",
+"     **>!'.)>**     ",
+"    >*%$$;,!!**>    ",
+"    *&=;.=!!!>**    ",
+"   >*&;@@=!!!!**>   ",
+"   **>,$=;!!!!>**   ",
+"  >**)#%;=!!!!!**>  ",
+"  **>=,;=';!,#;>**  ",
+" >**)%!)%!!=+..,**> ",
+" **>='!)%!;....@-** ",
+">**!;!!!='#####$=**>",
+"********************",
+"********************"};
diff --git a/packages/auctex/images/prvwrk24.xbm b/packages/auctex/images/prvwrk24.xbm
new file mode 100644 (file)
index 0000000..61aea62
--- /dev/null
@@ -0,0 +1,12 @@
+/* ©2002 David Kastrup, GPL */
+#define prevwork_width 24
+#define prevwork_height 24
+#define prevwork_x_hot 0
+#define prevwork_y_hot 20
+static unsigned char prevwork_bits[] = {
+   0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x7e, 0x00,
+   0x00, 0xe7, 0x00, 0x00, 0xe7, 0x00, 0x80, 0xc3, 0x01, 0x80, 0xc3, 0x01,
+   0xc0, 0x81, 0x03, 0xc0, 0x81, 0x03, 0xe0, 0x30, 0x07, 0xe0, 0x3f, 0x07,
+   0x70, 0x0d, 0x0e, 0x70, 0x0d, 0x0e, 0x38, 0x0e, 0x1c, 0x38, 0x0f, 0x1c,
+   0x1c, 0x1f, 0x38, 0x9c, 0xa5, 0x3b, 0x8e, 0xc4, 0x77, 0xce, 0xe4, 0x7f,
+   0x47, 0xec, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
diff --git a/packages/auctex/images/prvwrk24.xpm b/packages/auctex/images/prvwrk24.xpm
new file mode 100644 (file)
index 0000000..7d50b19
--- /dev/null
@@ -0,0 +1,44 @@
+/* XPM */
+static char * nwork24_xpm[] = {
+"24 24 17 1",
+"      c None",
+".     c #000100",
+"+     c #141513",
+"@     c #212320",
+"#     c #313230",
+"$     c #3B3D3A",
+"%     c #484947",
+"&     c #626461",
+"*     c #8C8E8B",
+"=     c #FF6467",
+"-     c #B6AFAC",
+";     c #FF9696",
+">     c #C4C6C3",
+",     c #D0D2CE",
+"'     c #FFCBCA",
+")     c #DDDFDC",
+"!     c #FBFDFA",
+"           ;;           ",
+"          ;==;          ",
+"          ====          ",
+"         ;====;         ",
+"         ==;;==         ",
+"        ;==''==;        ",
+"        ==;!!;==        ",
+"       ;=='!!'==;       ",
+"       ==;!!!!;==       ",
+"      ;=='!!>,'==;      ",
+"      ==;!!!.%!;==      ",
+"     ;=;$#$*,)!'==;     ",
+"     ==&,*..!!!!;==     ",
+"    ;==#,@.$!!!!'==;    ",
+"    ==;!&.&&!!!!!;==    ",
+"   ;==')*&*&!!!!!'==;   ",
+"   ==;!*#&>&!!!!!!;==   ",
+"  ;==')$)&->-!!)&*'==;  ",
+"  ==;!&-!,&!!-,%..*;==  ",
+" ;==',%!!)$!!>#....-==; ",
+" ==;!&>!!)@!>+.....+;== ",
+";=='!-!!!!*!&%%%%%&&*==;",
+"========================",
+" ====================== "};
diff --git a/packages/auctex/images/pspdf.xpm b/packages/auctex/images/pspdf.xpm
new file mode 100644 (file)
index 0000000..78d2887
--- /dev/null
@@ -0,0 +1,83 @@
+/* XPM */
+static char * pspdf5_xpm[] = {
+"24 24 56 1",
+"      c None s backgroundToolBarColor",
+".     c #869CB4",
+"+     c #00244C",
+"@     c #000000",
+"#     c #002248",
+"$     c #0050A9",
+"%     c #006FEB",
+"&     c #0066D9",
+"*     c #00336D",
+"=     c #37452B",
+"-     c #001070",
+";     c #004BA2",
+">     c #0078FF",
+",     c #0075FC",
+"'     c #004DB6",
+")     c #00072F",
+"!     c #0047FF",
+"~     c #006DFF",
+"{     c #0042CA",
+"]     c #00169E",
+"^     c #000A45",
+"/     c #445636",
+"(     c #0024FF",
+"_     c #0027FF",
+":     c #0056ED",
+"<     c #001FA7",
+"[     c #00179F",
+"}     c #526741",
+"|     c #001DCE",
+"1     c #4C603C",
+"2     c #566B43",
+"3     c #5A7046",
+"4     c #000B4C",
+"5     c #0023F5",
+"6     c #001492",
+"7     c #000E65",
+"8     c #00010B",
+"9     c #001AB9",
+"0     c #0022F0",
+"a     c #001387",
+"b     c #000942",
+"c     c #000C57",
+"d     c #D37F71",
+"e     c #0037C4",
+"f     c #6C84B7",
+"g     c #CE918A",
+"h     c #D4897A",
+"i     c #67102D",
+"j     c #C47474",
+"k     c #D69788",
+"l     c #CB8984",
+"m     c #D79C8D",
+"n     c #C8807D",
+"o     c #5A5A5A",
+"p     c #B50000",
+"q     c #AA7979",
+"     .+       @@@@      ",
+"   .#$%&*    @@@=@@     ",
+"  -;%>>>,') @   @=@     ",
+"  -!~>>>{]^      @/@    ",
+"  -(_!:<[]^      @}@    ",
+"  -(((|]]]^    @@}}1@@  ",
+"  -(((|]]]^     @232@   ",
+"  45((|]678      @}@    ",
+"   490|ab         @     ",
+"     -c                 ",
+"                  @     ",
+"                 @d@    ",
+" eeef feef      @ghi@   ",
+" e  e e        @jgkii@  ",
+" eeef feef    @jlgmiii@ ",
+" e       e   @jnlgmiiii@",
+" e    e  e   @jnlgkiii@ ",
+" e    feef    o@jnhii@  ",
+"                o@di@   ",
+"pppq pppq pppq    @@    ",
+"p  p p  p p             ",
+"pppq p  p ppq           ",
+"p    p  p p             ",
+"p    pppq p             "};
diff --git a/packages/auctex/images/sep.xpm b/packages/auctex/images/sep.xpm
new file mode 100644 (file)
index 0000000..151f5df
--- /dev/null
@@ -0,0 +1,29 @@
+/* XPM */
+static char * sep_xpm[] = {
+"1 24 2 1",
+"      c None s backgroundToolBarColor",
+".     c #776758",
+" ",
+" ",
+" ",
+".",
+".",
+".",
+".",
+".",
+".",
+".",
+".",
+".",
+".",
+".",
+".",
+".",
+".",
+".",
+".",
+".",
+".",
+" ",
+" ",
+" "};
diff --git a/packages/auctex/images/tex.xpm b/packages/auctex/images/tex.xpm
new file mode 100644 (file)
index 0000000..6c55bc5
--- /dev/null
@@ -0,0 +1,260 @@
+/* XPM */
+static char * tex6_xpm[] = {
+"24 24 233 2",
+"      c None s backgroundToolBarColor",
+".     c #3D9944",
+"+     c #3E9842",
+"@     c #3DA243",
+"#     c #3C9B47",
+"$     c #3EA442",
+"%     c #290400",
+"&     c #304116",
+"*     c #3E8D43",
+"=     c #3F7744",
+"-     c #977C5E",
+";     c #842835",
+">     c #9C3635",
+",     c #94506A",
+"'     c #54764E",
+")     c #3DBA41",
+"!     c #386C34",
+"~     c #CABC9A",
+"{     c #C1AE8E",
+"]     c #795642",
+"^     c #907F62",
+"/     c #FFFFC1",
+"(     c #94AC73",
+"_     c #664535",
+":     c #8A6A61",
+"<     c #6D302B",
+"[     c #943A3B",
+"}     c #772437",
+"|     c #52382D",
+"1     c #664940",
+"2     c #99A578",
+"3     c #6E4835",
+"4     c #6D5642",
+"5     c #9DBA88",
+"6     c #A3B181",
+"7     c #A3A982",
+"8     c #B9968B",
+"9     c #BF8A7F",
+"0     c #CAA8A0",
+"a     c #6F9966",
+"b     c #CEE6B0",
+"c     c #3E8946",
+"d     c #808C6A",
+"e     c #947F66",
+"f     c #916B50",
+"g     c #370708",
+"h     c #5D181B",
+"i     c #664437",
+"j     c #F2DBB4",
+"k     c #621E1C",
+"l     c #782C33",
+"m     c #411712",
+"n     c #82806E",
+"o     c #868266",
+"p     c #C1BFA2",
+"q     c #C7C2A8",
+"r     c #82806A",
+"s     c #84826C",
+"t     c #E8E8C7",
+"u     c #D1B08B",
+"v     c #4A1A16",
+"w     c #5C2628",
+"x     c #7F3630",
+"y     c #6B262B",
+"z     c #82826F",
+"A     c #BBBABD",
+"B     c #F8FFFD",
+"C     c #404448",
+"D     c #48424A",
+"E     c #FFFEFF",
+"F     c #BBC0BB",
+"G     c #9C6D56",
+"H     c #5D201D",
+"I     c #712723",
+"J     c #868471",
+"K     c #A29EF2",
+"L     c #3132E4",
+"M     c #181766",
+"N     c #807E80",
+"O     c #2F29CF",
+"P     c #A46D56",
+"Q     c #6C0E12",
+"R     c #6B2731",
+"S     c #7F7F6F",
+"T     c #8E8BE8",
+"U     c #141369",
+"V     c #504D7F",
+"W     c #848081",
+"X     c #2725AA",
+"Y     c #A46F58",
+"Z     c #833A33",
+"`     c #040400",
+" .    c #BFBE98",
+"..    c #7F7F6C",
+"+.    c #8D523D",
+"@.    c #580F16",
+"#.    c #66283A",
+"$.    c #312B23",
+"%.    c #DCDFBB",
+"&.    c #E4D7A8",
+"*.    c #B48566",
+"=.    c #4E3025",
+"-.    c #3F0810",
+";.    c #9C4256",
+">.    c #31302E",
+",.    c #E2E0C7",
+"'.    c #ACA896",
+").    c #CFD1B0",
+"!.    c #ECE6CB",
+"~.    c #F0D9AC",
+"{.    c #A26048",
+"].    c #50271C",
+"^.    c #3D030C",
+"/.    c #392F26",
+"(.    c #E4E2CB",
+"_.    c #ACAA92",
+":.    c #48453B",
+"<.    c #878364",
+"[.    c #83806D",
+"}.    c #B2B496",
+"|.    c #CFBD94",
+"1.    c #8C5037",
+"2.    c #4C2318",
+"3.    c #351114",
+"4.    c #522B2B",
+"5.    c #B07F6B",
+"6.    c #62433A",
+"7.    c #A0876A",
+"8.    c #BFBB96",
+"9.    c #B8C2A0",
+"0.    c #1E140C",
+"a.    c #35210C",
+"b.    c #2B2106",
+"c.    c #A09A96",
+"d.    c #CCBF9A",
+"e.    c #AA8368",
+"f.    c #B4846A",
+"g.    c #AE826A",
+"h.    c #D2B89A",
+"i.    c #EAD0AA",
+"j.    c #9E6852",
+"k.    c #542D25",
+"l.    c #441C16",
+"m.    c #312019",
+"n.    c #5F2D31",
+"o.    c #604835",
+"p.    c #A29A8F",
+"q.    c #3D3123",
+"r.    c #A09698",
+"s.    c #BFBBA2",
+"t.    c #C7BB9C",
+"u.    c #B38A71",
+"v.    c #A05250",
+"w.    c #1A0400",
+"x.    c #520308",
+"y.    c #350010",
+"z.    c #584C44",
+"A.    c #444637",
+"B.    c #7F625E",
+"C.    c #834A3F",
+"D.    c #AA7F6D",
+"E.    c #D2BC9E",
+"F.    c #E6E4BD",
+"G.    c #A66456",
+"H.    c #2B0702",
+"I.    c #602A2B",
+"J.    c #5A2229",
+"K.    c #3C3831",
+"L.    c #6F6B58",
+"M.    c #797B6D",
+"N.    c #484A3E",
+"O.    c #ACA7A2",
+"P.    c #4C463E",
+"Q.    c #807E71",
+"R.    c #686F5A",
+"S.    c #605F56",
+"T.    c #E0D9BC",
+"U.    c #FDFACB",
+"V.    c #C5BD9C",
+"W.    c #8B5E4E",
+"X.    c #561F1A",
+"Y.    c #582E2F",
+"Z.    c #6F3A3A",
+"`.    c #814247",
+" +    c #94947D",
+".+    c #858B75",
+"++    c #9C9E81",
+"@+    c #E0DBBB",
+"#+    c #CFC19C",
+"$+    c #483325",
+"%+    c #661718",
+"&+    c #995657",
+"*+    c #732428",
+"=+    c #7B2C2E",
+"-+    c #655347",
+";+    c #DACDA6",
+">+    c #F6E5B8",
+",+    c #73503A",
+"'+    c #643433",
+")+    c #894043",
+"!+    c #9C5156",
+"~+    c #681B23",
+"{+    c #873E43",
+"]+    c #5D2E34",
+"^+    c #623C46",
+"/+    c #775A50",
+"(+    c #858271",
+"_+    c #987B71",
+":+    c #524024",
+"<+    c #7D6C56",
+"[+    c #8A806F",
+"}+    c #7B826D",
+"|+    c #853626",
+"1+    c #894A3C",
+"2+    c #75292C",
+"3+    c #93594C",
+"4+    c #623739",
+"5+    c #8B5A56",
+"6+    c #4E0E1C",
+"7+    c #7E3F47",
+"8+    c #804047",
+"9+    c #6E3A3D",
+"0+    c #9F6662",
+"a+    c #A05A62",
+"b+    c #4C2626",
+"c+    c #A45862",
+"d+    c #731C21",
+"e+    c #964648",
+"f+    c #722020",
+"g+    c #620818",
+"h+    c #A0675E",
+"i+    c #561014",
+"j+    c #5A0414",
+"                                                ",
+"              . +         @ + # $   %           ",
+"        % & * =   - ; > , ' = ) ! ~ { ]         ",
+"        ^ / ( _ : < [ } | ' 1 _ 2 ~ % 3         ",
+"        4 / 5 6 7 8 9 0 a b c d / e f g h       ",
+"          i / / / / / / / / / / / j 3 k l       ",
+"          m / n o p / q r s t / / u v w x y     ",
+"          z z A B C / D E F n / / j G H I       ",
+"          J z K L M / N K O M / / j P h Q R     ",
+"          S z T U V / W T X V / / u Y h Z       ",
+"          ` t  ...t / t  . ./ / / u +.h @.#.    ",
+"        $.%./ ../ / / / / / / / &.*.=.-.Z ;.    ",
+"      >.,./ '.)./ / !./ / / / / ~.{.].^.Z ;.    ",
+"    /.(./ _.:.<.[...}./ / / / / |.1.2.3.4.      ",
+"5.5.6.7.8.9.0.a.b.c.d.e.5.f.g.h.i.j.k.l.m.n.    ",
+"    o./ / / p.q.r.s./ / / / / t.u.v.w.x.        ",
+"5.5.y.z./ / / A./ / / B.C.D.E.F.G.H.I.;.J.      ",
+"      K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.`.        ",
+"       +/ .+/ / / ++@+/ / #+$+%+&+*+=+          ",
+"      -+/ / / ;+/ / / >+,+'+)+!+~+{+]+^+        ",
+"        /+(+_+:+<+[+}+|+1+2+3+4+5+6+            ",
+"      7+7+8+9+0+a+b+c+d+e+  f+                  ",
+"          g+h+      i+  j+                      ",
+"                                                "};
diff --git a/packages/auctex/images/view.xpm b/packages/auctex/images/view.xpm
new file mode 100644 (file)
index 0000000..9a87ecf
--- /dev/null
@@ -0,0 +1,31 @@
+/* XPM */
+static char * view15_xpm[] = {
+"24 24 4 1",
+"      c None s backgroundToolBarColor",
+".     c #000000",
+"+     c #565656",
+"@     c #FFFFFF",
+"                        ",
+"                        ",
+"                        ",
+"                        ",
+"        ...             ",
+"       .+  .            ",
+"      .+   .            ",
+"     .+   .+            ",
+"    .+   .+         ... ",
+"   .+              .+ ..",
+"  ....            .+   .",
+" .@@ +.          .+   .+",
+" .@@@ +.        .+   .+ ",
+" .@@@  .  .... .+       ",
+" . @   ...@@ +..        ",
+" +.   +. .@@@ +.        ",
+"  +.++.  .@@@  .        ",
+"   +..   . @   .        ",
+"         +.   +.        ",
+"          +.++.         ",
+"           +..          ",
+"                        ",
+"                        ",
+"                        "};
diff --git a/packages/auctex/images/viewdvi.xpm b/packages/auctex/images/viewdvi.xpm
new file mode 100644 (file)
index 0000000..a527f55
--- /dev/null
@@ -0,0 +1,58 @@
+/* XPM */
+static char * viewdvi11_xpm[] = {
+"24 24 31 1",
+"      c None s backgroundToolBarColor",
+".     c #090909",
+"+     c #000000",
+"@     c #292929",
+"#     c #8E8E8E",
+"$     c #2D2D2D",
+"%     c #303030",
+"&     c #2B2B2B",
+"*     c #3C3C3C",
+"=     c #1F1F1F",
+"-     c #101010",
+";     c #1A1A1A",
+">     c #2E2E2E",
+",     c #FFFFFF",
+"'     c #C3C3C3",
+")     c #252525",
+"!     c #191919",
+"~     c #131313",
+"{     c #1D1D1D",
+"]     c #0D0D0D",
+"^     c #121212",
+"/     c #444444",
+"(     c #3B3B3B",
+"_     c #3D3D3D",
+":     c #080808",
+"<     c #295E29",
+"[     c #5ABD5A",
+"}     c #488148",
+"|     c #4CA14C",
+"1     c #4D904D",
+"2     c #4FA64F",
+"        .+              ",
+"       @# +             ",
+"      $#  @             ",
+"     %#  &#             ",
+"    @#            ++    ",
+"   *=-           ;# +   ",
+"  >,,')         !#  ~   ",
+"  >,,  +       !#  {#   ",
+"  ],,  ++ *=- =#        ",
+"  #^  /+ >,,')#         ",
+"   ($_:  >,,  +         ",
+"    ##   ],,  +         ",
+"         #^  /+         ",
+"          ($_:          ",
+"           ##           ",
+"                        ",
+"            <<<[ <  <  <",
+"            <  < <  <  <",
+"            <  < <  <  <",
+"            <  < }  }  <",
+"            <  < |11|  <",
+"            <  <  }}   <",
+"            <<<[  22   <",
+"                        "};
diff --git a/packages/auctex/images/viewpdf.xpm b/packages/auctex/images/viewpdf.xpm
new file mode 100644 (file)
index 0000000..4a31737
--- /dev/null
@@ -0,0 +1,54 @@
+/* XPM */
+static char * viewpdf5_xpm[] = {
+"24 24 27 1",
+"      c None s backgroundToolBarColor",
+".     c #090909",
+"+     c #000000",
+"@     c #292929",
+"#     c #8E8E8E",
+"$     c #2D2D2D",
+"%     c #303030",
+"&     c #2B2B2B",
+"*     c #3C3C3C",
+"=     c #1F1F1F",
+"-     c #101010",
+";     c #1A1A1A",
+">     c #2E2E2E",
+",     c #FFFFFF",
+"'     c #C3C3C3",
+")     c #252525",
+"!     c #191919",
+"~     c #131313",
+"{     c #1D1D1D",
+"]     c #0D0D0D",
+"^     c #121212",
+"/     c #444444",
+"(     c #3B3B3B",
+"_     c #3D3D3D",
+":     c #080808",
+"<     c #B50000",
+"[     c #AA7979",
+"        .+              ",
+"       @# +             ",
+"      $#  @             ",
+"     %#  &#             ",
+"    @#            ++    ",
+"   *=-           ;# +   ",
+"  >,,')         !#  ~   ",
+"  >,,  +       !#  {#   ",
+"  ],,  ++ *=- =#        ",
+"  #^  /+ >,,')#         ",
+"   ($_:  >,,  +         ",
+"    ##   ],,  +         ",
+"         #^  /+         ",
+"          ($_:          ",
+"           ##           ",
+"                        ",
+"          <<<[ <<<[ <<<[",
+"          <  < <  < <   ",
+"          <  < <  < <   ",
+"          <<<[ <  < <<[ ",
+"          <    <  < <   ",
+"          <    <  < <   ",
+"          <    <<<[ <   ",
+"                        "};
diff --git a/packages/auctex/images/viewps.xpm b/packages/auctex/images/viewps.xpm
new file mode 100644 (file)
index 0000000..c8b467a
--- /dev/null
@@ -0,0 +1,54 @@
+/* XPM */
+static char * viewps8_xpm[] = {
+"24 24 27 1",
+"      c None s backgroundToolBarColor",
+".     c #090909",
+"+     c #000000",
+"@     c #292929",
+"#     c #8E8E8E",
+"$     c #2D2D2D",
+"%     c #303030",
+"&     c #2B2B2B",
+"*     c #3C3C3C",
+"=     c #1F1F1F",
+"-     c #101010",
+";     c #1A1A1A",
+">     c #2E2E2E",
+",     c #FFFFFF",
+"'     c #C3C3C3",
+")     c #252525",
+"!     c #191919",
+"~     c #131313",
+"{     c #1D1D1D",
+"]     c #0D0D0D",
+"^     c #121212",
+"/     c #444444",
+"(     c #3B3B3B",
+"_     c #3D3D3D",
+":     c #080808",
+"<     c #0037C4",
+"[     c #6C84B7",
+"        .+              ",
+"       @# +             ",
+"      $#  @             ",
+"     %#  &#             ",
+"    @#            ++    ",
+"   *=-           ;# +   ",
+"  >,,')         !#  ~   ",
+"  >,,  +       !#  {#   ",
+"  ],,  ++ *=- =#        ",
+"  #^  /+ >,,')#         ",
+"   ($_:  >,,  +         ",
+"    ##   ],,  +         ",
+"         #^  /+         ",
+"          ($_:          ",
+"           ##           ",
+"                        ",
+"              <<<[ [<<[ ",
+"              <  < <  < ",
+"              <  < <    ",
+"              <<<[ [<<[ ",
+"              <       < ",
+"              <    <  < ",
+"              <    [<<[ ",
+"                        "};
diff --git a/packages/auctex/latex.el b/packages/auctex/latex.el
new file mode 100644 (file)
index 0000000..f9859a6
--- /dev/null
@@ -0,0 +1,5468 @@
+;;; latex.el --- Support for LaTeX documents.
+
+;; Copyright (C) 1991, 1993, 1994, 1995, 1996, 1997, 1999, 2000, 2003,
+;;   2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+
+;; Maintainer: auctex-devel@gnu.org
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file provides AUCTeX support for LaTeX.
+
+;;; Code:
+
+(require 'tex)
+(require 'tex-style)
+
+;;; Syntax
+
+(defvar LaTeX-optop "["
+  "The LaTeX optional argument opening character.")
+
+(defvar LaTeX-optcl "]"
+  "The LaTeX optional argument closeing character.")
+
+;;; Style
+
+(defcustom LaTeX-default-style "article"
+  "*Default when creating new documents."
+  :group 'LaTeX-environment
+  :type 'string)
+
+(defcustom LaTeX-default-options nil
+  "Default options to documentstyle.
+A list of strings."
+  :group 'LaTeX-environment
+  :type '(repeat (string :format "%v")))
+
+(make-variable-buffer-local 'LaTeX-default-options)
+
+(defcustom LaTeX-insert-into-comments t
+  "*Whether insertion commands stay in comments.
+This allows using the insertion commands even when
+the lines are outcommented, like in dtx files."
+  :group 'LaTeX-environment
+  :type 'boolean)
+
+(defun LaTeX-newline ()
+  "Start a new line potentially staying within comments.
+This depends on `LaTeX-insert-into-comments'."
+  (if LaTeX-insert-into-comments
+      (cond ((and (save-excursion (skip-chars-backward " \t") (bolp))
+                 (save-excursion
+                   (skip-chars-forward " \t")
+                   (looking-at (concat TeX-comment-start-regexp "+"))))
+            (beginning-of-line)
+            (insert (buffer-substring-no-properties
+                     (line-beginning-position) (match-end 0)))
+            (newline))
+           ((and (not (bolp))
+                 (save-excursion
+                   (skip-chars-forward " \t") (not (TeX-escaped-p)))
+                 (looking-at
+                  (concat "[ \t]*" TeX-comment-start-regexp "+[ \t]*")))
+            (delete-region (match-beginning 0) (match-end 0))
+            (indent-new-comment-line))
+           (t
+            (indent-new-comment-line)))
+    (newline)))
+
+
+;;; Syntax Table
+
+(defvar LaTeX-mode-syntax-table (copy-syntax-table TeX-mode-syntax-table)
+  "Syntax table used in LaTeX mode.")
+
+(progn ; set [] to match for LaTeX.
+  (modify-syntax-entry (string-to-char LaTeX-optop)
+                      (concat "(" LaTeX-optcl)
+                      LaTeX-mode-syntax-table)
+  (modify-syntax-entry (string-to-char LaTeX-optcl)
+                      (concat ")" LaTeX-optop)
+                      LaTeX-mode-syntax-table))
+
+;;; Sections
+
+(defun LaTeX-section (arg)
+  "Insert a template for a LaTeX section.
+Determine the type of section to be inserted, by the argument ARG.
+
+If ARG is nil or missing, use the current level.
+If ARG is a list (selected by \\[universal-argument]), go downward one level.
+If ARG is negative, go up that many levels.
+If ARG is positive or zero, use absolute level:
+
+  0 : part
+  1 : chapter
+  2 : section
+  3 : subsection
+  4 : subsubsection
+  5 : paragraph
+  6 : subparagraph
+
+The following variables can be set to customize:
+
+`LaTeX-section-hook'   Hooks to run when inserting a section.
+`LaTeX-section-label'  Prefix to all section labels."
+
+  (interactive "*P")
+  (let* ((val (prefix-numeric-value arg))
+        (level (cond ((null arg)
+                      (LaTeX-current-section))
+                     ((listp arg)
+                      (LaTeX-down-section))
+                     ((< val 0)
+                      (LaTeX-up-section (- val)))
+                     (t val)))
+        (name (LaTeX-section-name level))
+        (toc nil)
+        (title (if (TeX-active-mark)
+                   (buffer-substring (region-beginning)
+                                     (region-end))
+                 ""))
+        (done-mark (make-marker)))
+    (run-hooks 'LaTeX-section-hook)
+    (LaTeX-newline)
+    (if (marker-position done-mark)
+       (goto-char (marker-position done-mark)))
+    (set-marker done-mark nil)))
+
+(defun LaTeX-current-section ()
+  "Return the level of the section that contain point.
+See also `LaTeX-section' for description of levels."
+  (save-excursion
+    (max (LaTeX-largest-level)
+        (if (re-search-backward (LaTeX-outline-regexp) nil t)
+            (- (LaTeX-outline-level) (LaTeX-outline-offset))
+          (LaTeX-largest-level)))))
+
+(defun LaTeX-down-section ()
+  "Return the value of a section one level under the current.
+Tries to find what kind of section that have been used earlier in the
+text, if this fail, it will just return one less than the current
+section."
+  (save-excursion
+    (let ((current (LaTeX-current-section))
+         (next nil)
+         (regexp (LaTeX-outline-regexp)))
+      (if (not (re-search-backward regexp nil t))
+         (1+ current)
+       (while (not next)
+         (cond
+          ((eq (LaTeX-current-section) current)
+           (if (re-search-forward regexp nil t)
+               (if (<= (setq next (LaTeX-current-section)) current) ;Wow!
+                   (setq next (1+ current)))
+             (setq next (1+ current))))
+          ((not (re-search-backward regexp nil t))
+           (setq next (1+ current)))))
+       next))))
+
+(defun LaTeX-up-section (arg)
+  "Return the value of the section ARG levels above this one."
+  (save-excursion
+    (if (zerop arg)
+       (LaTeX-current-section)
+      (let ((current (LaTeX-current-section)))
+       (while (and (>= (LaTeX-current-section) current)
+                   (re-search-backward (LaTeX-outline-regexp)
+                                       nil t)))
+       (LaTeX-up-section (1- arg))))))
+
+(defvar LaTeX-section-list '(("part" 0)
+                            ("chapter" 1)
+                            ("section" 2)
+                            ("subsection" 3)
+                            ("subsubsection" 4)
+                            ("paragraph" 5)
+                            ("subparagraph" 6))
+  "List which elements is the names of the sections used by LaTeX.")
+
+(defun LaTeX-section-list-add-locally (sections &optional clean)
+  "Add SECTIONS to `LaTeX-section-list'.
+SECTIONS can be a single list containing the section macro name
+as a string and the the level as an integer or a list of such
+lists.
+
+If optional argument CLEAN is non-nil, remove any existing
+entries from `LaTeX-section-list' before adding the new ones.
+
+The function will make `LaTeX-section-list' buffer-local and
+invalidate the section submenu in order to let the menu filter
+regenerate it.  It is mainly a convenience function which can be
+used in style files."
+  (when (stringp (car sections))
+    (setq sections (list sections)))
+  (make-local-variable 'LaTeX-section-list)
+  (when clean (setq LaTeX-section-list nil))
+  (dolist (elt sections) (add-to-list 'LaTeX-section-list elt t))
+  (setq LaTeX-section-list
+       (sort (copy-sequence LaTeX-section-list)
+             (lambda (a b) (< (nth 1 a) (nth 1 b)))))
+  (setq LaTeX-section-menu nil))
+
+(defun LaTeX-section-name (level)
+  "Return the name of the section corresponding to LEVEL."
+  (let ((entry (TeX-member level LaTeX-section-list
+                          (lambda (a b) (equal a (nth 1 b))))))
+    (if entry
+       (nth 0 entry)
+      nil)))
+
+(defun LaTeX-section-level (name)
+  "Return the level of the section NAME."
+  (let ((entry (TeX-member name LaTeX-section-list
+                          (lambda (a b) (equal a (nth 0 b))))))
+
+    (if entry
+       (nth 1 entry)
+      nil)))
+
+(defcustom TeX-outline-extra nil
+  "List of extra TeX outline levels.
+
+Each element is a list with two entries.  The first entry is the
+regular expression matching a header, and the second is the level of
+the header.  See `LaTeX-section-list' for existing header levels."
+  :group 'LaTeX
+  :type '(repeat (group (regexp :tag "Match")
+                       (integer :tag "Level"))))
+
+(defun LaTeX-outline-regexp (&optional anywhere)
+  "Return regexp for LaTeX sections.
+
+If optional argument ANYWHERE is not nil, do not require that the
+header is at the start of a line."
+  (concat (if anywhere "" "^")
+         "[ \t]*"
+         (regexp-quote TeX-esc)
+         "\\(appendix\\|documentstyle\\|documentclass\\|"
+         (mapconcat 'car LaTeX-section-list "\\|")
+         "\\)\\b"
+         (if TeX-outline-extra
+             "\\|"
+           "")
+         (mapconcat 'car TeX-outline-extra "\\|")
+         "\\|" TeX-header-end
+         "\\|" TeX-trailer-start))
+
+(defvar LaTeX-largest-level nil
+  "Largest sectioning level with current document class.")
+
+(make-variable-buffer-local 'LaTeX-largest-level)
+
+(defun LaTeX-largest-level ()
+  "Return largest sectioning level with current document class.
+Run style hooks before it has not been done."
+  (TeX-update-style)
+  LaTeX-largest-level)
+
+(defun LaTeX-largest-level-set (section)
+  "Set `LaTeX-largest-level' to the level of SECTION.
+SECTION has to be a string contained in `LaTeX-section-list'.
+Additionally the function will invalidate the section submenu in
+order to let the menu filter regenerate it."
+  (setq LaTeX-largest-level (LaTeX-section-level section))
+  (setq LaTeX-section-menu nil))
+
+(defun LaTeX-outline-offset ()
+  "Offset to add to `LaTeX-section-list' levels to get outline level."
+  (- 2 (LaTeX-largest-level)))
+
+(defun TeX-look-at (list)
+  "Check if we are looking at the first element of a member of LIST.
+If so, return the second element, otherwise return nil."
+  (while (and list
+             (not (looking-at (nth 0 (car list)))))
+    (setq list (cdr list)))
+  (if list
+      (nth 1 (car list))
+    nil))
+
+(defun LaTeX-outline-level ()
+  "Find the level of current outline heading in an LaTeX document."
+  (cond ((looking-at LaTeX-header-end) 1)
+       ((looking-at LaTeX-trailer-start) 1)
+       ((TeX-look-at TeX-outline-extra)
+        (max 1 (+ (TeX-look-at TeX-outline-extra)
+                  (LaTeX-outline-offset))))
+       (t
+        (save-excursion
+         (skip-chars-forward " \t")
+         (forward-char 1)
+         (cond ((looking-at "appendix") 1)
+               ((looking-at "documentstyle") 1)
+               ((looking-at "documentclass") 1)
+               ((TeX-look-at LaTeX-section-list)
+                (max 1 (+ (TeX-look-at LaTeX-section-list)
+                          (LaTeX-outline-offset))))
+               (t
+                (error "Unrecognized header")))))))
+
+(defun LaTeX-outline-name ()
+  "Guess a name for the current header line."
+  (save-excursion
+    (if (re-search-forward "{\\([^\}]*\\)}" (+ (point) fill-column 10) t)
+       (match-string 1)
+      (buffer-substring (point) (min (point-max) (+ 20 (point)))))))
+
+(add-hook 'TeX-remove-style-hook
+         (lambda () (setq LaTeX-largest-level nil)))
+
+(defcustom LaTeX-section-hook
+  '(LaTeX-section-heading
+    LaTeX-section-title
+;; LaTeX-section-toc           ; Most people won't want this
+    LaTeX-section-section
+    LaTeX-section-label)
+  "List of hooks to run when a new section is inserted.
+
+The following variables are set before the hooks are run
+
+level - numeric section level, see the documentation of `LaTeX-section'.
+name - name of the sectioning command, derived from `level'.
+title - The title of the section, default to an empty string.
+toc - Entry for the table of contents list, default nil.
+done-mark - Position of point afterwards, default nil (meaning end).
+
+The following standard hook exist -
+
+LaTeX-section-heading: Query the user about the name of the
+sectioning command.  Modifies `level' and `name'.
+
+LaTeX-section-title: Query the user about the title of the
+section.  Modifies `title'.
+
+LaTeX-section-toc: Query the user for the toc entry.  Modifies
+`toc'.
+
+LaTeX-section-section: Insert LaTeX section command according to
+`name', `title', and `toc'.  If `toc' is nil, no toc entry is
+inserted.  If `toc' or `title' are empty strings, `done-mark' will be
+placed at the point they should be inserted.
+
+LaTeX-section-label: Insert a label after the section command.
+Controled by the variable `LaTeX-section-label'.
+
+To get a full featured `LaTeX-section' command, insert
+
+ (setq LaTeX-section-hook
+       '(LaTeX-section-heading
+        LaTeX-section-title
+        LaTeX-section-toc
+        LaTeX-section-section
+        LaTeX-section-label))
+
+in your .emacs file."
+  :group 'LaTeX-macro
+  :type 'hook
+  :options '(LaTeX-section-heading
+            LaTeX-section-title
+            LaTeX-section-toc
+            LaTeX-section-section
+            LaTeX-section-label))
+
+
+(defcustom LaTeX-section-label
+  '(("part" . "part:")
+    ("chapter" . "chap:")
+    ("section" . "sec:")
+    ("subsection" . "sec:")
+    ("subsubsection" . "sec:"))
+  "Default prefix when asking for a label.
+
+Some LaTeX packages \(such as `fancyref'\) look at the prefix to generate some
+text around cross-references automatically.  When using those packages, you
+should not change this variable.
+
+If it is a string, it it used unchanged for all kinds of sections.
+If it is nil, no label is inserted.
+If it is a list, the list is searched for a member whose car is equal
+to the name of the sectioning command being inserted.  The cdr is then
+used as the prefix.  If the name is not found, or if the cdr is nil,
+no label is inserted."
+  :group 'LaTeX-label
+  :type '(choice (const :tag "none" nil)
+                (string :format "%v" :tag "Common")
+                (repeat :menu-tag "Level specific"
+                        :format "\n%v%i"
+                        (cons :format "%v"
+                              (string :tag "Type")
+                              (choice :tag "Prefix"
+                                      (const :tag "none" nil)
+                                      (string  :format "%v"))))))
+
+;;; Section Hooks.
+
+(defun LaTeX-section-heading ()
+  "Hook to prompt for LaTeX section name.
+Insert this hook into `LaTeX-section-hook' to allow the user to change
+the name of the sectioning command inserted with `\\[LaTeX-section]'."
+  (let ((string (completing-read
+                (concat "Level: (default " name ") ")
+                LaTeX-section-list
+                nil nil nil)))
+    ; Update name
+    (if (not (zerop (length string)))
+       (setq name string))
+    ; Update level
+    (setq level (LaTeX-section-level name))))
+
+(defun LaTeX-section-title ()
+  "Hook to prompt for LaTeX section title.
+Insert this hook into `LaTeX-section-hook' to allow the user to change
+the title of the section inserted with `\\[LaTeX-section]."
+  (setq title (read-string "Title: " title))
+  (let ((region (and (TeX-active-mark)
+                    (cons (region-beginning) (region-end)))))
+    (when region (delete-region (car region) (cdr region)))))
+
+(defun LaTeX-section-toc ()
+  "Hook to prompt for the LaTeX section entry in the table of content .
+Insert this hook into `LaTeX-section-hook' to allow the user to insert
+a different entry for the section in the table of content."
+  (setq toc (read-string "Toc Entry: "))
+  (if (zerop (length toc))
+      (setq toc nil)))
+
+(defun LaTeX-section-section ()
+  "Hook to insert LaTeX section command into the file.
+Insert this hook into `LaTeX-section-hook' after those hooks that set
+the `name', `title', and `toc' variables, but before those hooks that
+assume that the section is already inserted."
+  ;; insert a new line if the current line and the previous line are
+  ;; not empty (except for whitespace), with one exception: do not
+  ;; insert a new line if the previous (or current, sigh) line starts
+  ;; an environment (i.e., starts with `[optional whitespace]\begin')
+  (unless (save-excursion
+           (re-search-backward
+            (concat "^\\s-*\n\\s-*\\=\\|^\\s-*" (regexp-quote TeX-esc)
+                    "begin")
+            (line-beginning-position 0) t))
+    (LaTeX-newline))
+  (insert TeX-esc name)
+  (cond ((null toc))
+       ((zerop (length toc))
+        (insert LaTeX-optop)
+        (set-marker done-mark (point))
+        (insert LaTeX-optcl))
+       (t
+        (insert LaTeX-optop toc LaTeX-optcl)))
+  (insert TeX-grop)
+  (if (zerop (length title))
+      (set-marker done-mark (point)))
+  (insert title TeX-grcl)
+  (LaTeX-newline)
+  ;; If RefTeX is available, tell it that we've just made a new section
+  (and (fboundp 'reftex-notice-new-section)
+       (reftex-notice-new-section)))
+
+(defun LaTeX-section-label ()
+  "Hook to insert a label after the sectioning command.
+Insert this hook into `LaTeX-section-hook' to prompt for a label to be
+inserted after the sectioning command.
+
+The behaviour of this hook is controlled by variable `LaTeX-section-label'."
+  (and (LaTeX-label name)
+       (LaTeX-newline)))
+
+;;; Environments
+
+(defgroup LaTeX-environment nil
+  "Environments in AUCTeX."
+  :group 'LaTeX-macro)
+
+(defcustom LaTeX-default-environment "itemize"
+  "*The default environment when creating new ones with `LaTeX-environment'."
+  :group 'LaTeX-environment
+  :type 'string)
+ (make-variable-buffer-local 'LaTeX-default-environment)
+
+(defvar LaTeX-environment-history nil)
+
+;; Variable used to cache the current environment, e.g. for repeated
+;; tasks in an environment, like indenting each line in a paragraph to
+;; be filled.  It must not have a non-nil value in general.  That
+;; means it is usually let-bound for such operations.
+(defvar LaTeX-current-environment nil)
+
+(defun LaTeX-environment (arg)
+  "Make LaTeX environment (\\begin{...}-\\end{...} pair).
+With optional ARG, modify current environment.
+
+It may be customized with the following variables:
+
+`LaTeX-default-environment'       Your favorite environment.
+`LaTeX-default-style'             Your favorite document class.
+`LaTeX-default-options'           Your favorite document class options.
+`LaTeX-float'                     Where you want figures and tables to float.
+`LaTeX-table-label'               Your prefix to labels in tables.
+`LaTeX-figure-label'              Your prefix to labels in figures.
+`LaTeX-default-format'            Format for array and tabular.
+`LaTeX-default-width'             Width for minipage and tabular*.
+`LaTeX-default-position'          Position for array and tabular."
+
+  (interactive "*P")
+  (let ((environment (completing-read (concat "Environment type: (default "
+                                              (if (TeX-near-bobp)
+                                                  "document"
+                                                LaTeX-default-environment)
+                                              ") ")
+                                     (LaTeX-environment-list)
+                                     nil nil nil
+                                     'LaTeX-environment-history)))
+    ;; Get default
+    (cond ((and (zerop (length environment))
+               (TeX-near-bobp))
+          (setq environment "document"))
+         ((zerop (length environment))
+          (setq environment LaTeX-default-environment))
+         (t
+          (setq LaTeX-default-environment environment)))
+
+    (let ((entry (assoc environment (LaTeX-environment-list))))
+      (if (null entry)
+         (LaTeX-add-environments (list environment)))
+
+      (if arg
+         (LaTeX-modify-environment environment)
+       (LaTeX-environment-menu environment)))))
+
+(defun LaTeX-environment-menu (environment)
+  "Insert ENVIRONMENT around point or region."
+  (let ((entry (assoc environment (LaTeX-environment-list))))
+    (cond ((not (and entry (nth 1 entry)))
+          (LaTeX-insert-environment environment))
+         ((numberp (nth 1 entry))
+          (let ((count (nth 1 entry))
+                (args ""))
+            (while (> count 0)
+              (setq args (concat args TeX-grop TeX-grcl))
+              (setq count (- count 1)))
+            (LaTeX-insert-environment environment args)))
+         ((or (stringp (nth 1 entry)) (vectorp (nth 1 entry)))
+          (let ((prompts (cdr entry))
+                (args ""))
+            (dolist (elt prompts)
+              (let* ((optional (vectorp elt))
+                     (elt (if optional (elt elt 0) elt))
+                     (arg (read-string (concat (when optional "(Optional) ")
+                                               elt ": "))))
+                (setq args (concat args
+                                   (cond ((and optional (> (length arg) 0))
+                                          (concat LaTeX-optop arg LaTeX-optcl))
+                                         ((not optional)
+                                          (concat TeX-grop arg TeX-grcl)))))))
+            (LaTeX-insert-environment environment args)))
+         (t
+          (apply (nth 1 entry) environment (nthcdr 2 entry))))))
+
+(defun LaTeX-close-environment (&optional reopen)
+  "Create an \\end{...} to match the current environment.
+With prefix-argument, reopen environment afterwards."
+  (interactive "*P")
+  (if (> (point)
+        (save-excursion
+          (beginning-of-line)
+          (when LaTeX-insert-into-comments
+            (if (looking-at comment-start-skip)
+                (goto-char (match-end 0))))
+          (skip-chars-forward " \t")
+          (point)))
+      (LaTeX-newline))
+  (let ((environment (LaTeX-current-environment 1)) marker)
+    (insert "\\end{" environment "}")
+    (indent-according-to-mode)
+    (if (or (not (looking-at "[ \t]*$"))
+           (and (TeX-in-commented-line)
+                (save-excursion (beginning-of-line 2)
+                                (not (TeX-in-commented-line)))))
+       (LaTeX-newline)
+      (let ((next-line-add-newlines t))
+       (next-line 1)
+       (beginning-of-line)))
+    (indent-according-to-mode)
+    (when reopen
+      (save-excursion
+       (setq marker (point-marker))
+       (set-marker-insertion-type marker t)
+       (LaTeX-environment-menu environment)
+       (delete-region (point)
+                      (if (save-excursion (goto-char marker)
+                                          (bolp))
+                          (1- marker)
+                        marker))
+       (move-marker marker nil)))))
+
+(defvar LaTeX-after-insert-env-hooks nil
+  "List of functions to be run at the end of `LaTeX-insert-environment'.
+Each function is called with three arguments: the name of the
+environment just inserted, the buffer position just before
+\\begin and the position just before \\end.")
+
+(defun LaTeX-insert-environment (environment &optional extra)
+  "Insert LaTeX ENVIRONMENT with optional argument EXTRA."
+  (let ((active-mark (and (TeX-active-mark) (not (eq (mark) (point)))))
+       prefix content-start env-start env-end)
+    (when (and active-mark (< (mark) (point))) (exchange-point-and-mark))
+    ;; Compute the prefix.
+    (when (and LaTeX-insert-into-comments (TeX-in-commented-line))
+      (save-excursion
+       (beginning-of-line)
+       (looking-at
+        (concat "^\\([ \t]*" TeX-comment-start-regexp "+\\)+[ \t]*"))
+       (setq prefix (match-string 0))))
+    ;; What to do with the line containing point.
+    (cond ((save-excursion (beginning-of-line)
+                          (looking-at (concat prefix "[ \t]*$")))
+          (delete-region (match-beginning 0) (match-end 0)))
+         ((TeX-looking-at-backward (concat "^" prefix "[ \t]*")
+                                   (line-beginning-position))
+          (beginning-of-line)
+          (newline)
+          (beginning-of-line 0))
+         ((bolp)
+          (delete-horizontal-space)
+          (newline)
+          (beginning-of-line 0))
+         (t
+          (delete-horizontal-space)
+          (newline 2)
+          (when prefix (insert prefix))
+          (beginning-of-line 0)))
+    ;; What to do with the line containing mark.
+    (when active-mark
+      (save-excursion
+       (goto-char (mark))
+       (cond ((save-excursion (beginning-of-line)
+                              (or (looking-at (concat prefix "[ \t]*$"))
+                                  (looking-at "[ \t]*$")))
+              (delete-region (match-beginning 0) (match-end 0)))
+             ((TeX-looking-at-backward (concat "^" prefix "[ \t]*")
+                                       (line-beginning-position))
+              (beginning-of-line)
+              (newline)
+              (beginning-of-line 0))
+             (t
+              (delete-horizontal-space)
+              (insert-before-markers "\n")
+              (newline)
+              (when prefix (insert prefix))))))
+    ;; Now insert the environment.
+    (when prefix (insert prefix))
+    (setq env-start (point))
+    (insert TeX-esc "begin" TeX-grop environment TeX-grcl)
+    (indent-according-to-mode)
+    (when extra (insert extra))
+    (setq content-start (line-beginning-position 2))
+    (unless active-mark
+      (newline)
+      (when prefix (insert prefix))
+      (newline))
+    (when active-mark (goto-char (mark)))
+    (when prefix (insert prefix))
+    (setq env-end (point))
+    (insert TeX-esc "end" TeX-grop environment TeX-grcl)
+    (end-of-line 0)
+    (if active-mark
+       (progn
+         (or (assoc environment LaTeX-indent-environment-list)
+             (LaTeX-fill-region content-start (line-beginning-position 2)))
+         (set-mark content-start))
+      (indent-according-to-mode))
+    (save-excursion (beginning-of-line 2) (indent-according-to-mode))
+    (TeX-math-input-method-off)
+    (run-hook-with-args 'LaTeX-after-insert-env-hooks
+                       environment env-start env-end)))
+
+(defun LaTeX-modify-environment (environment)
+  "Modify current ENVIRONMENT."
+  (save-excursion
+    (LaTeX-find-matching-end)
+    (re-search-backward (concat (regexp-quote TeX-esc)
+                               "end"
+                               (regexp-quote TeX-grop)
+                               " *\\([a-zA-Z*]*\\)"
+                               (regexp-quote TeX-grcl))
+                       (save-excursion (beginning-of-line 1) (point)))
+    (replace-match (concat TeX-esc "end" TeX-grop environment TeX-grcl) t t)
+    (beginning-of-line 1)
+    (LaTeX-find-matching-begin)
+    (re-search-forward (concat (regexp-quote TeX-esc)
+                              "begin"
+                              (regexp-quote TeX-grop)
+                              " *\\([a-zA-Z*]*\\)"
+                              (regexp-quote TeX-grcl))
+                      (save-excursion (end-of-line 1) (point)))
+    (replace-match (concat TeX-esc "begin" TeX-grop environment TeX-grcl) t t)))
+
+(defun LaTeX-current-environment (&optional arg)
+  "Return the name (a string) of the enclosing LaTeX environment.
+With optional ARG>=1, find that outer level.
+
+If function is called inside a comment and
+`LaTeX-syntactic-comments' is enabled, try to find the
+environment in commented regions with the same comment prefix.
+
+The functions `LaTeX-find-matching-begin' and `LaTeX-find-matching-end'
+work analogously."
+  (setq arg (if arg (if (< arg 1) 1 arg) 1))
+  (let* ((in-comment (TeX-in-commented-line))
+        (comment-prefix (and in-comment (TeX-comment-prefix))))
+    (save-excursion
+      (while (and (/= arg 0)
+                 (re-search-backward
+                  "\\\\\\(begin\\|end\\) *{ *\\([A-Za-z*]+\\) *}" nil t))
+       (when (or (and LaTeX-syntactic-comments
+                      (eq in-comment (TeX-in-commented-line))
+                      (or (not in-comment)
+                          ;; Consider only matching prefixes in the
+                          ;; commented case.
+                          (string= comment-prefix (TeX-comment-prefix))))
+                 (and (not LaTeX-syntactic-comments)
+                      (not (TeX-in-commented-line))))
+         (setq arg (if (string= (match-string 1) "end") (1+ arg) (1- arg)))))
+      (if (/= arg 0)
+         "document"
+       (match-string-no-properties 2)))))
+
+(defun docTeX-in-macrocode-p ()
+  "Determine if point is inside a macrocode environment."
+  (save-excursion
+    (re-search-backward
+     (concat "^%    " (regexp-quote TeX-esc)
+            "\\(begin\\|end\\)[ \t]*{macrocode\\*?}") nil 'move)
+    (not (or (bobp)
+            (= (char-after (match-beginning 1)) ?e)))))
+
+
+;;; Environment Hooks
+
+(defvar LaTeX-document-style-hook nil
+  "List of hooks to run when inserting a document environment.
+
+To insert a hook here, you must insert it in the appropiate style file.")
+
+(defun LaTeX-env-document (&optional ignore)
+  "Create new LaTeX document.
+The compatibility argument IGNORE is ignored."
+  (TeX-insert-macro "documentclass")
+  (LaTeX-newline)
+  (LaTeX-newline)
+  (LaTeX-newline)
+  (end-of-line 0)
+  (LaTeX-insert-environment "document")
+  (run-hooks 'LaTeX-document-style-hook)
+  (setq LaTeX-document-style-hook nil))
+
+(defcustom LaTeX-float ""
+  "Default float position for figures and tables.
+If nil, act like the empty string is given, but do not prompt.
+\(The standard LaTeX classes use [tbp] as float position if the
+optional argument is omitted.)"
+  :group 'LaTeX-environment
+  :type '(choice (const :tag "Do not prompt" nil)
+                (const :tag "Empty" "")
+                (string :format "%v")))
+(make-variable-buffer-local 'LaTeX-float)
+
+(defcustom LaTeX-top-caption-list nil
+  "*List of float environments with top caption."
+  :group 'LaTeX-environment
+  :type '(repeat (string :format "%v")))
+
+(defgroup LaTeX-label nil
+  "Adding labels for LaTeX commands in AUCTeX."
+  :group 'LaTeX)
+
+(defcustom LaTeX-label-function nil
+  "*A function inserting a label at point.
+Sole argument of the function is the environment.  The function has to return
+the label inserted, or nil if no label was inserted."
+  :group 'LaTeX-label
+  :type 'function)
+
+(defcustom LaTeX-figure-label "fig:"
+  "*Default prefix to figure labels."
+  :group 'LaTeX-label
+  :group 'LaTeX-environment
+  :type 'string)
+
+(defcustom LaTeX-table-label "tab:"
+  "*Default prefix to table labels."
+  :group 'LaTeX-label
+  :group 'LaTeX-environment
+  :type 'string)
+
+(defcustom LaTeX-default-format ""
+  "Default format for array and tabular environments."
+  :group 'LaTeX-environment
+  :type 'string)
+(make-variable-buffer-local 'LaTeX-default-format)
+
+(defcustom LaTeX-default-width "1.0\\linewidth"
+  "Default width for minipage and tabular* environments."
+  :group 'LaTeX-environment
+  :type 'string)
+(make-variable-buffer-local 'LaTeX-default-width)
+
+(defcustom LaTeX-default-position ""
+  "Default position for array and tabular environments.
+If nil, act like the empty string is given, but do not prompt."
+  :group 'LaTeX-environment
+  :type '(choice (const :tag "Do not prompt" nil)
+                (const :tag "Empty" "")
+                string))
+(make-variable-buffer-local 'LaTeX-default-position)
+
+(defcustom LaTeX-equation-label "eq:"
+  "*Default prefix to equation labels."
+  :group 'LaTeX-label
+  :type 'string)
+
+(defcustom LaTeX-eqnarray-label LaTeX-equation-label
+  "*Default prefix to eqnarray labels."
+  :group 'LaTeX-label
+  :type 'string)
+
+(defun LaTeX-env-item (environment)
+  "Insert ENVIRONMENT and the first item."
+  (LaTeX-insert-environment environment)
+  (if (TeX-active-mark)
+      (progn
+       (LaTeX-find-matching-begin)
+       (end-of-line 1))
+    (end-of-line 0))
+  (delete-char 1)
+  (when (looking-at (concat "^[ \t]+$\\|"
+                           "^[ \t]*" TeX-comment-start-regexp "+[ \t]*$"))
+    (delete-region (point) (line-end-position)))
+  (delete-horizontal-space)
+  ;; Deactivate the mark here in order to prevent `TeX-parse-macro'
+  ;; from swapping point and mark and the \item ending up right after
+  ;; \begin{...}.
+  (TeX-deactivate-mark)
+  (LaTeX-insert-item)
+  ;; The inserted \item may have outdented the first line to the
+  ;; right.  Fill it, if appropriate.
+  (when (and (not (looking-at "$"))
+            (not (assoc environment LaTeX-indent-environment-list))
+            (> (- (line-end-position) (line-beginning-position))
+               (current-fill-column)))
+    (LaTeX-fill-paragraph nil)))
+
+(defcustom LaTeX-label-alist
+  '(("figure" . LaTeX-figure-label)
+    ("table" . LaTeX-table-label)
+    ("figure*" . LaTeX-figure-label)
+    ("table*" . LaTeX-table-label)
+    ("equation" . LaTeX-equation-label)
+    ("eqnarray" . LaTeX-eqnarray-label))
+  "Lookup prefixes for labels.
+An alist where the CAR is the environment name, and the CDR
+either the prefix or a symbol referring to one."
+  :group 'LaTeX-label
+  :type '(repeat (cons (string :tag "Environment")
+                      (choice (string :tag "Label prefix")
+                              (symbol :tag "Label prefix symbol")))))
+
+(make-variable-buffer-local 'LaTeX-label-alist)
+
+(defun LaTeX-label (environment)
+  "Insert a label for ENVIRONMENT at point.
+If `LaTeX-label-function' is a valid function, LaTeX label will transfer the
+job to this function."
+  (let (label)
+    (if (and (boundp 'LaTeX-label-function)
+            LaTeX-label-function
+            (fboundp LaTeX-label-function))
+
+       (setq label (funcall LaTeX-label-function environment))
+      (let ((prefix
+            (or (cdr (assoc environment LaTeX-label-alist))
+                (if (assoc environment LaTeX-section-list)
+                    (if (stringp LaTeX-section-label)
+                        LaTeX-section-label
+                      (and (listp LaTeX-section-label)
+                           (cdr (assoc environment LaTeX-section-label))))
+                  ""))))
+       (when prefix
+         (when (symbolp prefix)
+           (setq prefix (symbol-value prefix)))
+         ;; Use completing-read as we do with `C-c C-m \label RET'
+         (setq label (completing-read
+                      (TeX-argument-prompt t nil "What label")
+                      (LaTeX-label-list) nil nil prefix))
+         ;; No label or empty string entered?
+         (if (or (string= prefix label)
+                 (string= "" label))
+             (setq label nil)
+           (insert TeX-esc "label" TeX-grop label TeX-grcl))))
+      (if label
+         (progn
+           (LaTeX-add-labels label)
+           label)
+       nil))))
+
+(defun LaTeX-env-figure (environment)
+  "Create ENVIRONMENT with \\caption and \\label commands."
+  (let ((float (and LaTeX-float                ; LaTeX-float can be nil, i.e.
+                                       ; do not prompt
+                   (read-string "(Optional) Float position: " LaTeX-float)))
+       (caption (read-string "Caption: "))
+       (center (y-or-n-p "Center? "))
+       (active-mark (and (TeX-active-mark)
+                         (not (eq (mark) (point)))))
+       start-marker end-marker)
+    (when active-mark
+      (if (< (mark) (point))
+         (exchange-point-and-mark))
+      (setq start-marker (point-marker))
+      (set-marker-insertion-type start-marker t)
+      (setq end-marker (copy-marker (mark))))
+    (setq LaTeX-float float)
+    (LaTeX-insert-environment environment
+                             (unless (zerop (length float))
+                               (concat LaTeX-optop float
+                                       LaTeX-optcl)))
+    (when active-mark (goto-char start-marker))
+    (when center
+      (insert TeX-esc "centering")
+      (indent-according-to-mode)
+      (LaTeX-newline))
+    (if (member environment LaTeX-top-caption-list)
+       ;; top caption -- do nothing if user skips caption
+       (unless (zerop (length caption))
+         (insert TeX-esc "caption" TeX-grop caption TeX-grcl)
+         (LaTeX-newline)
+         (indent-according-to-mode)
+         ;; ask for a label and insert a new line only if a label is
+         ;; actually inserted
+         (when (LaTeX-label environment)
+           (LaTeX-newline)
+           (indent-according-to-mode)))
+      ;; bottom caption (default) -- do nothing if user skips caption
+      (unless (zerop (length caption))
+       (when active-mark (goto-char end-marker))
+       (LaTeX-newline)
+       (indent-according-to-mode)
+       (insert TeX-esc "caption" TeX-grop caption TeX-grcl)
+       (LaTeX-newline)
+       (indent-according-to-mode)
+       ;; ask for a label -- if user skips label, remove the last new
+       ;; line again
+       (if (LaTeX-label environment)
+           (progn
+             (unless (looking-at "[ \t]*$")
+               (LaTeX-newline)
+               (end-of-line 0)))
+         (delete-blank-lines)
+         (end-of-line 0))
+       ;; if there is a caption or a label, move point upwards again
+       ;; so that it is placed above the caption or the label (or
+       ;; both) -- search the current line (even long captions are
+       ;; inserted on a single line, even if auto-fill is turned on,
+       ;; so it is enough to search the current line) for \label or
+       ;; \caption and go one line upwards if any of them is found
+       (while (re-search-backward
+               (concat "^\\s-*" (regexp-quote TeX-esc)
+                       "\\(label\\|caption\\)")
+               (line-beginning-position) t)
+         (end-of-line 0)
+         (indent-according-to-mode))))
+    (when (and (member environment '("table" "table*"))
+              ;; Suppose an existing tabular environment should just
+              ;; be wrapped into a table if there is an active region.
+              (not active-mark))
+      (LaTeX-env-array "tabular"))))
+
+(defun LaTeX-env-array (environment)
+  "Insert ENVIRONMENT with position and column specifications.
+Just like array and tabular."
+  (let ((pos (and LaTeX-default-position ; LaTeX-default-position can
+                                       ; be nil, i.e. do not prompt
+                 (read-string "(Optional) Position: " LaTeX-default-position)))
+       (fmt (read-string "Format: " LaTeX-default-format)))
+    (setq LaTeX-default-position pos)
+    (setq LaTeX-default-format fmt)
+    (LaTeX-insert-environment environment
+                             (concat
+                              (unless (zerop (length pos))
+                                (concat LaTeX-optop pos LaTeX-optcl))
+                              (concat TeX-grop fmt TeX-grcl)))))
+
+(defun LaTeX-env-label (environment)
+  "Insert ENVIRONMENT and prompt for label."
+  (LaTeX-insert-environment environment)
+  (when (LaTeX-label environment)
+    (LaTeX-newline)
+    (indent-according-to-mode)))
+
+(defun LaTeX-env-list (environment)
+  "Insert ENVIRONMENT and the first item."
+  (let ((label (read-string "Default Label: ")))
+    (LaTeX-insert-environment environment
+                             (format "{%s}{}" label))
+    (end-of-line 0)
+    (delete-char 1)
+    (delete-horizontal-space))
+  (LaTeX-insert-item))
+
+(defun LaTeX-env-minipage (environment)
+  "Create new LaTeX minipage or minipage-like ENVIRONMENT."
+  (let ((pos (and LaTeX-default-position ; LaTeX-default-position can
+                                       ; be nil, i.e. do not prompt
+                 (read-string "(Optional) Position: " LaTeX-default-position)))
+       (width (read-string "Width: " LaTeX-default-width)))
+    (setq LaTeX-default-position pos)
+    (setq LaTeX-default-width width)
+    (LaTeX-insert-environment environment
+                             (concat
+                              (unless (zerop (length pos))
+                                (concat LaTeX-optop pos LaTeX-optcl))
+                              (concat TeX-grop width TeX-grcl)))))
+
+(defun LaTeX-env-tabular* (environment)
+  "Insert ENVIRONMENT with width, position and column specifications."
+  (let ((width (read-string "Width: " LaTeX-default-width))
+       (pos (and LaTeX-default-position ; LaTeX-default-position can
+                                       ; be nil, i.e. do not prompt
+                 (read-string "(Optional) Position: " LaTeX-default-position)))
+       (fmt (read-string "Format: " LaTeX-default-format)))
+    (setq LaTeX-default-width width)
+    (setq LaTeX-default-position pos)
+    (setq LaTeX-default-format fmt)
+    (LaTeX-insert-environment environment
+                             (concat
+                              (concat TeX-grop width TeX-grcl) ;; not optional!
+                              (unless (zerop (length pos))
+                                (concat LaTeX-optop pos LaTeX-optcl))
+                              (concat TeX-grop fmt TeX-grcl)))))
+
+(defun LaTeX-env-picture (environment)
+  "Insert ENVIRONMENT with width, height specifications."
+  (let ((width (read-string "Width: "))
+       (height (read-string "Height: "))
+       (x-offset (read-string "X Offset: "))
+       (y-offset (read-string "Y Offset: ")))
+    (if (zerop (length x-offset))
+       (setq x-offset "0"))
+    (if (zerop (length y-offset))
+       (setq y-offset "0"))
+    (LaTeX-insert-environment environment
+                             (concat
+                              (format "(%s,%s)" width height)
+                              (if (not (and (string= x-offset "0")
+                                            (string= y-offset "0")))
+                                  (format "(%s,%s)" x-offset y-offset))))))
+
+(defun LaTeX-env-bib (environment)
+  "Insert ENVIRONMENT with label for bibitem."
+  (LaTeX-insert-environment environment
+                           (concat TeX-grop
+                                   (read-string "Label for BibItem: " "99")
+                                   TeX-grcl))
+  (end-of-line 0)
+  (delete-char 1)
+  (delete-horizontal-space)
+  (LaTeX-insert-item))
+
+(defun LaTeX-env-contents (environment)
+  "Insert ENVIRONMENT with filename for contents."
+  (save-excursion
+    (when (re-search-backward "^\\\\documentclass.*{" nil t)
+      (error "Put %s environment before \\documentclass" environment)))
+  (LaTeX-insert-environment environment
+                           (concat TeX-grop
+                                   (read-string "File: ")
+                                   TeX-grcl))
+  (delete-horizontal-space))
+
+(defun LaTeX-env-args (environment &rest args)
+  "Insert ENVIRONMENT and arguments defined by ARGS."
+  (LaTeX-insert-environment environment)
+  (let ((pos (point-marker)))
+    (end-of-line 0)
+    (TeX-parse-arguments args)
+    (goto-char pos)))
+
+;;; Item hooks
+
+(defvar LaTeX-item-list nil
+  "A list of environments where items have a special syntax.
+The cdr is the name of the function, used to insert this kind of items.")
+
+(defun LaTeX-insert-item ()
+  "Insert a new item in an environment.
+You may use `LaTeX-item-list' to change the routines used to insert the item."
+  (interactive "*")
+  (let ((environment (LaTeX-current-environment)))
+    (when (and (TeX-active-mark)
+              (> (point) (mark)))
+      (exchange-point-and-mark))
+    (unless (bolp) (LaTeX-newline))
+    (if (assoc environment LaTeX-item-list)
+       (funcall (cdr (assoc environment LaTeX-item-list)))
+      (TeX-insert-macro "item"))
+    (indent-according-to-mode)))
+
+(defun LaTeX-item-argument ()
+  "Insert a new item with an optional argument."
+  (let ((TeX-arg-item-label-p t))
+    (TeX-insert-macro "item")))
+
+(defun LaTeX-item-bib ()
+  "Insert a new bibitem."
+  (TeX-insert-macro "bibitem"))
+
+;;; Parser
+
+(defvar LaTeX-auto-minimal-regexp-list
+  '(("\\\\document\\(style\\|class\\)\
+\\(\\[\\(\\([^#\\%]\\|%[^\n\r]*[\n\r]\\)*\\)\\]\\)?\
+{\\([^#\\.\n\r]+?\\)}"
+     (3 5 1) LaTeX-auto-style)
+    ("\\\\use\\(package\\)\\(\\[\\([^\]\\]*\\)\\]\\)?\
+{\\(\\([^#}\\.%]\\|%[^\n\r]*[\n\r]\\)+?\\)}"
+     (3 4 1) LaTeX-auto-style))
+  "Minimal list of regular expressions matching LaTeX macro definitions.")
+
+(defvar LaTeX-auto-label-regexp-list
+  '(("\\\\label{\\([^\n\r%\\{}]+\\)}" 1 LaTeX-auto-label))
+  "List of regular expression matching LaTeX labels only.")
+
+(defvar LaTeX-auto-index-regexp-list
+   '(("\\\\\\(index\\|glossary\\){\\([^}{]*\\({[^}{]*\\({[^}{]*\\({[^}{]*}[^}{]*\\)*}[^}{]*\\)*}[^}{]*\\)*\\)}"
+       2 LaTeX-auto-index-entry))
+   "List of regular expression matching LaTeX index/glossary entries only.
+Regexp allows for up to 3 levels of parenthesis inside the index argument.
+This is necessary since index entries may contain commands and stuff.")
+
+(defvar LaTeX-auto-class-regexp-list
+  '(;; \RequirePackage[<options>]{<package>}[<date>]
+    ("\\\\Require\\(Package\\)\\(\\[\\([^#\\.%]*?\\)\\]\\)?\
+{\\([^#\\.\n\r]+?\\)}"
+     (3 4 1) LaTeX-auto-style)
+    ;; \RequirePackageWithOptions{<package>}[<date>],
+    ("\\\\Require\\(Package\\)WithOptions\\(\\){\\([^#\\.\n\r]+?\\)}"
+     (2 3 1) LaTeX-auto-style)
+    ;; \LoadClass[<options>]{<package>}[<date>]
+    ("\\\\Load\\(Class\\)\\(\\[\\([^#\\.%]*?\\)\\]\\)?{\\([^#\\.\n\r]+?\\)}"
+     (3 4 1) LaTeX-auto-style)
+    ;; \LoadClassWithOptions{<package>}[<date>]
+    ("\\\\Load\\(Class\\)WithOptions\\(\\){\\([^#\\.\n\r]+?\\)}"
+     (2 3 1) LaTeX-auto-style)
+    ;; \DeclareRobustCommand{<cmd>}[<num>][<default>]{<definition>},
+    ;; \DeclareRobustCommand*{<cmd>}[<num>][<default>]{<definition>}
+    ("\\\\DeclareRobustCommand\\*?{?\\\\\\([A-Za-z]+\\)}?\
+\\[\\([0-9]+\\)\\]\\[\\([^\n\r]*?\\)\\]"
+     (1 2 3) LaTeX-auto-optional)
+    ("\\\\DeclareRobustCommand\\*?{?\\\\\\([A-Za-z]+\\)}?\\[\\([0-9]+\\)\\]"
+     (1 2) LaTeX-auto-arguments)
+    ("\\\\DeclareRobustCommand\\*?{?\\\\\\([A-Za-z]+\\)}?"
+     1 TeX-auto-symbol)
+    ;; Patterns for commands described in "LaTeX2e font selection" (fntguide)
+    ("\\\\DeclareMath\\(?:Symbol\\|Delimiter\\|Accent\\|Radical\\)\
+{?\\\\\\([A-Za-z]+\\)}?"
+     1 TeX-auto-symbol)
+    ("\\\\\\(Declare\\|Provide\\)Text\
+\\(?:Command\\|Symbol\\|Accent\\|Composite\\){?\\\\\\([A-Za-z]+\\)}?"
+     1 TeX-auto-symbol)
+    ("\\\\Declare\\(?:Text\\|Old\\)FontCommand{?\\\\\\([A-Za-z]+\\)}?"
+     1 TeX-auto-symbol))
+  "List of regular expressions matching macros in LaTeX classes and packages.")
+
+(defvar LaTeX-auto-regexp-list
+  (append
+   (let ((token TeX-token-char))
+     `((,(concat "\\\\\\(?:new\\|provide\\)command\\*?{?\\\\\\(" token "+\\)}?\\[\\([0-9]+\\)\\]\\[\\([^\n\r]*\\)\\]")
+       (1 2 3) LaTeX-auto-optional)
+       (,(concat "\\\\\\(?:new\\|provide\\)command\\*?{?\\\\\\(" token "+\\)}?\\[\\([0-9]+\\)\\]")
+       (1 2) LaTeX-auto-arguments)
+       (,(concat "\\\\\\(?:new\\|provide\\)command\\*?{?\\\\\\(" token "+\\)}?") 1 TeX-auto-symbol)
+       (,(concat "\\\\newenvironment\\*?{?\\(" token "+\\)}?\\[\\([0-9]+\\)\\]\\[")
+       1 LaTeX-auto-environment)
+       (,(concat "\\\\newenvironment\\*?{?\\(" token "+\\)}?\\[\\([0-9]+\\)\\]")
+       (1 2) LaTeX-auto-env-args)
+       (,(concat "\\\\newenvironment\\*?{?\\(" token "+\\)}?") 1 LaTeX-auto-environment)
+       (,(concat "\\\\newtheorem{\\(" token "+\\)}") 1 LaTeX-auto-environment)
+       ("\\\\input{\\(\\.*[^#}%\\\\\\.\n\r]+\\)\\(\\.[^#}%\\\\\\.\n\r]+\\)?}"
+       1 TeX-auto-file)
+       ("\\\\include{\\(\\.*[^#}%\\\\\\.\n\r]+\\)\\(\\.[^#}%\\\\\\.\n\r]+\\)?}"
+       1 TeX-auto-file)
+       (, (concat "\\\\bibitem{\\(" token "[^, \n\r\t%\"#'()={}]*\\)}") 1 LaTeX-auto-bibitem)
+       (, (concat "\\\\bibitem\\[[^][\n\r]+\\]{\\(" token "[^, \n\r\t%\"#'()={}]*\\)}")
+         1 LaTeX-auto-bibitem)
+       ("\\\\bibliography{\\([^#}\\\\\n\r]+\\)}" 1 LaTeX-auto-bibliography)))
+   LaTeX-auto-class-regexp-list
+   LaTeX-auto-label-regexp-list
+   LaTeX-auto-index-regexp-list
+   LaTeX-auto-minimal-regexp-list)
+  "List of regular expression matching common LaTeX macro definitions.")
+
+(defun LaTeX-auto-prepare ()
+  "Prepare for LaTeX parsing."
+  (setq LaTeX-auto-arguments nil
+       LaTeX-auto-optional nil
+       LaTeX-auto-env-args nil
+       LaTeX-auto-style nil
+       LaTeX-auto-end-symbol nil))
+
+(add-hook 'TeX-auto-prepare-hook 'LaTeX-auto-prepare)
+
+(defun LaTeX-listify-package-options (options)
+  "Return a list from a comma-separated string of package OPTIONS.
+The input string may include LaTeX comments and newlines."
+  ;; FIXME: Parse key=value options like "pdftitle={A Perfect
+  ;; Day},colorlinks=false" correctly.  When this works, the check for
+  ;; "=" can be removed again.
+  (let (opts)
+    (dolist (elt (TeX-split-string "\\(,\\|%[^\n\r]*[\n\r]\\)+"
+                                  options))
+      (unless (string-match "=" elt)
+       ;; Strip whitespace.
+       (dolist (item (TeX-split-string "[ \t\r\n]+" elt))
+         (unless (string= item "")
+           (add-to-list 'opts item)))))
+    opts))
+
+(defun LaTeX-auto-cleanup ()
+  "Cleanup after LaTeX parsing."
+
+  ;; Cleanup BibTeX files
+  (setq LaTeX-auto-bibliography
+       (apply 'append (mapcar (lambda (arg)
+                                (TeX-split-string "," arg))
+                              LaTeX-auto-bibliography)))
+
+  ;; Cleanup document classes and packages
+  (unless (null LaTeX-auto-style)
+    (while LaTeX-auto-style
+      (let* ((entry (car LaTeX-auto-style))
+            (options (nth 0 entry))
+            (style (nth 1 entry))
+            (class (nth 2 entry)))
+
+       ;; Next document style.
+       (setq LaTeX-auto-style (cdr LaTeX-auto-style))
+
+       ;; Get the options.
+       (setq options (LaTeX-listify-package-options options))
+
+       ;; Add them, to the style list.
+       (dolist (elt options)
+         (add-to-list 'TeX-auto-file elt))
+
+       ;; Treat documentclass/documentstyle specially.
+       (if (or (string-equal "package" class)
+               (string-equal "Package" class))
+           (dolist (elt (TeX-split-string
+                          "\\([ \t\r\n]\\|%[^\n\r]*[\n\r]\\|,\\)+" style))
+             (add-to-list 'TeX-auto-file elt))
+         ;; And a special "art10" style file combining style and size.
+         (add-to-list 'TeX-auto-file style)
+         (add-to-list 'TeX-auto-file
+                      (concat
+                       (cond ((string-equal "article" style)
+                              "art")
+                             ((string-equal "book" style)
+                              "bk")
+                             ((string-equal "report" style)
+                              "rep")
+                             ((string-equal "jarticle" style)
+                              "jart")
+                             ((string-equal "jbook" style)
+                              "jbk")
+                             ((string-equal "jreport" style)
+                              "jrep")
+                             ((string-equal "j-article" style)
+                              "j-art")
+                             ((string-equal "j-book" style)
+                              "j-bk")
+                             ((string-equal "j-report" style )
+                              "j-rep")
+                             (t style))
+                       (cond ((member "11pt" options)
+                              "11")
+                             ((member "12pt" options)
+                              "12")
+                             (t
+                              "10")))))
+
+       ;; The third argument if "class" indicates LaTeX2e features.
+       (cond ((equal class "class")
+              (add-to-list 'TeX-auto-file "latex2e"))
+             ((equal class "style")
+              (add-to-list 'TeX-auto-file "latex2"))))))
+
+  ;; Cleanup optional arguments
+  (mapc (lambda (entry)
+         (add-to-list 'TeX-auto-symbol
+                      (list (nth 0 entry)
+                            (string-to-number (nth 1 entry)))))
+       LaTeX-auto-arguments)
+
+  ;; Cleanup default optional arguments
+  (mapc (lambda (entry)
+         (add-to-list 'TeX-auto-symbol
+                      (list (nth 0 entry)
+                            (vector "argument")
+                            (1- (string-to-number (nth 1 entry))))))
+       LaTeX-auto-optional)
+
+  ;; Cleanup environments arguments
+  (mapc (lambda (entry)
+         (add-to-list 'LaTeX-auto-environment
+                      (list (nth 0 entry)
+                            (string-to-number (nth 1 entry)))))
+       LaTeX-auto-env-args)
+
+  ;; Cleanup use of def to add environments
+  ;; NOTE: This uses an O(N^2) algorithm, while an O(N log N)
+  ;; algorithm is possible.
+  (mapc (lambda (symbol)
+         (if (not (TeX-member symbol TeX-auto-symbol 'equal))
+             ;; No matching symbol, insert in list
+             (add-to-list 'TeX-auto-symbol (concat "end" symbol))
+           ;; Matching symbol found, remove from list
+           (if (equal (car TeX-auto-symbol) symbol)
+               ;; Is it the first symbol?
+               (setq TeX-auto-symbol (cdr TeX-auto-symbol))
+             ;; Nope!  Travel the list
+             (let ((list TeX-auto-symbol))
+               (while (consp (cdr list))
+                 ;; Until we find it.
+                 (if (equal (car (cdr list)) symbol)
+                     ;; Then remove it.
+                     (setcdr list (cdr (cdr list))))
+                 (setq list (cdr list)))))
+           ;; and add the symbol as an environment.
+           (add-to-list 'LaTeX-auto-environment symbol)))
+       LaTeX-auto-end-symbol))
+
+(add-hook 'TeX-auto-cleanup-hook 'LaTeX-auto-cleanup)
+
+(TeX-auto-add-type "label" "LaTeX")
+(TeX-auto-add-type "bibitem" "LaTeX")
+(TeX-auto-add-type "environment" "LaTeX")
+(TeX-auto-add-type "bibliography" "LaTeX" "bibliographies")
+(TeX-auto-add-type "index-entry" "LaTeX" "index-entries")
+
+(fset 'LaTeX-add-bibliographies-auto
+      (symbol-function 'LaTeX-add-bibliographies))
+(defun LaTeX-add-bibliographies (&rest bibliographies)
+  "Add BIBLIOGRAPHIES to the list of known bibliographies and style files."
+  (apply 'LaTeX-add-bibliographies-auto bibliographies)
+  (apply 'TeX-run-style-hooks bibliographies))
+
+(fset 'LaTeX-add-environments-auto
+      (symbol-function 'LaTeX-add-environments))
+(defun LaTeX-add-environments (&rest environments)
+  "Add ENVIRONMENTS to the list of known environments.
+Additionally invalidate the environment submenus to let them be
+regenerated by the respective menu filter."
+  (apply 'LaTeX-add-environments-auto environments)
+  (setq LaTeX-environment-menu nil)
+  (setq LaTeX-environment-modify-menu nil))
+
+;;; BibTeX
+
+;;;###autoload
+(defun BibTeX-auto-store ()
+  "This function should be called from `bibtex-mode-hook'.
+It will setup BibTeX to store keys in an auto file."
+  ;; We want this to be early in the list, so we do not
+  ;; add it before we enter BibTeX mode the first time.
+  (if (boundp 'local-write-file-hooks)
+      (add-hook 'local-write-file-hooks 'TeX-safe-auto-write)
+    (add-hook 'write-file-hooks 'TeX-safe-auto-write))
+  (make-local-variable 'TeX-auto-update)
+  (setq TeX-auto-update 'BibTeX)
+  (make-local-variable 'TeX-auto-untabify)
+  (setq TeX-auto-untabify nil)
+  (make-local-variable 'TeX-auto-parse-length)
+  (setq TeX-auto-parse-length 999999)
+  (make-local-variable 'TeX-auto-regexp-list)
+  (setq TeX-auto-regexp-list BibTeX-auto-regexp-list)
+  (make-local-variable 'TeX-master)
+  (setq TeX-master t))
+
+(defvar BibTeX-auto-regexp-list
+  `(("@[Ss][Tt][Rr][Ii][Nn][Gg]" 1 ignore)
+    (,(concat "@[a-zA-Z]+[{(][ \t]*\\(" TeX-token-char "[^, \n\r\t%\"#'()={}]*\\)")
+     1 LaTeX-auto-bibitem))
+  "List of regexp-list expressions matching BibTeX items.")
+
+;;; Macro Argument Hooks
+
+(defun TeX-arg-conditional (optional expr then else)
+  "Implement if EXPR THEN ELSE.
+
+If OPTIONAL is non-nil, insert the resulting value as an optional
+argument, otherwise as a mandatory one.
+
+If EXPR evaluate to true, parse THEN as an argument list, else parse
+ELSE as an argument list."
+  (TeX-parse-arguments (if (eval expr) then else)))
+
+(defun TeX-arg-eval (optional &rest args)
+  "Evaluate ARGS and insert value in buffer.
+If OPTIONAL is non-nil, insert the resulting value as an optional
+argument, otherwise as a mandatory one."
+  (TeX-argument-insert (eval args) optional))
+
+(defun TeX-arg-label (optional &optional prompt definition)
+  "Prompt for a label completing with known labels.
+If OPTIONAL is non-nil, insert the resulting value as an optional
+argument, otherwise as a mandatory one.  Use PROMPT as the prompt
+string.  If DEFINITION is non-nil, add the chosen label to the
+list of defined labels."
+  (let ((label (completing-read (TeX-argument-prompt optional prompt "Key")
+                               (LaTeX-label-list))))
+    (if (and definition (not (string-equal "" label)))
+       (LaTeX-add-labels label))
+    (TeX-argument-insert label optional optional)))
+
+(defalias 'TeX-arg-ref 'TeX-arg-label)
+
+(defun TeX-arg-index-tag (optional &optional prompt &rest args)
+  "Prompt for an index tag.
+This is the name of an index, not the entry.
+
+If OPTIONAL is non-nil, insert the resulting value as an optional
+argument, otherwise as a mandatory one.  Use PROMPT as the prompt
+string.  ARGS is unused."
+  (let (tag)
+    (setq prompt (concat (if optional "(Optional) " "")
+                        (if prompt prompt "Index tag")
+                        ": (default none) "))
+    (setq tag (read-string prompt))
+    (TeX-argument-insert tag optional)))
+
+(defun TeX-arg-index (optional &optional prompt &rest args)
+  "Prompt for an index entry completing with known entries.
+If OPTIONAL is non-nil, insert the resulting value as an optional
+argument, otherwise as a mandatory one.  Use PROMPT as the prompt
+string.  ARGS is unused."
+  (let ((entry (completing-read (TeX-argument-prompt optional prompt "Key")
+                               (LaTeX-index-entry-list))))
+    (if (and (not (string-equal "" entry))
+            (not (member (list entry) (LaTeX-index-entry-list))))
+       (LaTeX-add-index-entries entry))
+    (TeX-argument-insert entry optional optional)))
+
+(defalias 'TeX-arg-define-index 'TeX-arg-index)
+
+(defun TeX-arg-macro (optional &optional prompt definition)
+  "Prompt for a TeX macro with completion.
+If OPTIONAL is non-nil, insert the resulting value as an optional
+argument, otherwise as a mandatory one.  Use PROMPT as the prompt
+string.  If DEFINITION is non-nil, add the chosen macro to the
+list of defined macros."
+  (let ((macro (completing-read (TeX-argument-prompt optional prompt
+                                                    (concat "Macro: "
+                                                            TeX-esc)
+                                                    t)
+                               (TeX-symbol-list))))
+    (if (and definition (not (string-equal "" macro)))
+       (TeX-add-symbols macro))
+    (TeX-argument-insert macro optional TeX-esc)))
+
+(defun TeX-arg-environment (optional &optional prompt definition)
+  "Prompt for a LaTeX environment with completion.
+If OPTIONAL is non-nil, insert the resulting value as an optional
+argument, otherwise as a mandatory one.  Use PROMPT as the prompt
+string.  If DEFINITION is non-nil, add the chosen environment to
+the list of defined environments."
+  (let ((environment (completing-read (TeX-argument-prompt optional prompt
+                                                          "Environment")
+                                     (TeX-symbol-list))))
+    (if (and definition (not (string-equal "" environment)))
+       (LaTeX-add-environments environment))
+
+    (TeX-argument-insert environment optional)))
+
+;; Why is DEFINITION unused?
+(defun TeX-arg-cite (optional &optional prompt definition)
+  "Prompt for a BibTeX citation with completion.
+If OPTIONAL is non-nil, insert the resulting value as an optional
+argument, otherwise as a mandatory one.  Use PROMPT as the prompt
+string.  DEFINITION is unused."
+  (setq prompt (concat (if optional "(Optional) " "")
+                      (if prompt prompt "Add key")
+                      ": (default none) "))
+  (let ((items (multi-prompt "," t prompt (LaTeX-bibitem-list))))
+    (apply 'LaTeX-add-bibitems items)
+    (TeX-argument-insert (mapconcat 'identity items ",") optional optional)))
+
+;; Why is DEFINITION unused?
+(defun TeX-arg-counter (optional &optional prompt definition)
+  "Prompt for a LaTeX counter.
+If OPTIONAL is non-nil, insert the resulting value as an optional
+argument, otherwise as a mandatory one.  Use PROMPT as the prompt
+string.  DEFINITION is unused."
+  ;; Completion not implemented yet.
+  (TeX-argument-insert
+   (read-string (TeX-argument-prompt optional prompt "Counter"))
+   optional))
+
+;; Why is DEFINITION unused?
+(defun TeX-arg-savebox (optional &optional prompt definition)
+  "Prompt for a LaTeX savebox.
+If OPTIONAL is non-nil, insert the resulting value as an optional
+argument, otherwise as a mandatory one.  Use PROMPT as the prompt
+string.  DEFINITION is unused."
+  ;; Completion not implemented yet.
+  (TeX-argument-insert
+   (read-string (TeX-argument-prompt optional prompt
+                                    (concat "Savebox: " TeX-esc)
+                                    t))
+   optional TeX-esc))
+
+(defun TeX-arg-file (optional &optional prompt)
+  "Prompt for a filename in the current directory.
+If OPTIONAL is non-nil, insert the resulting value as an optional
+argument, otherwise as a mandatory one.  Use PROMPT as the prompt
+string."
+  (TeX-argument-insert (read-file-name (TeX-argument-prompt optional
+                                                           prompt "File")
+                                      "" "" nil)
+                      optional))
+
+(defun TeX-arg-define-label (optional &optional prompt)
+  "Prompt for a label completing with known labels.
+If OPTIONAL is non-nil, insert the resulting value as an optional
+argument, otherwise as a mandatory one.  Use PROMPT as the prompt
+string."
+  (TeX-arg-label optional prompt t))
+
+(defun TeX-arg-define-macro (optional &optional prompt)
+  "Prompt for a TeX macro with completion.
+If OPTIONAL is non-nil, insert the resulting value as an optional
+argument, otherwise as a mandatory one.  Use PROMPT as the prompt
+string."
+  (TeX-arg-macro optional prompt t))
+
+(defun TeX-arg-define-environment (optional &optional prompt)
+  "Prompt for a LaTeX environment with completion.
+If OPTIONAL is non-nil, insert the resulting value as an optional
+argument, otherwise as a mandatory one.  Use PROMPT as the prompt
+string."
+  (TeX-arg-environment optional prompt t))
+
+(defun TeX-arg-define-cite (optional &optional prompt)
+  "Prompt for a BibTeX citation.
+If OPTIONAL is non-nil, insert the resulting value as an optional
+argument, otherwise as a mandatory one.  Use PROMPT as the prompt
+string."
+  (TeX-arg-cite optional prompt t))
+
+(defun TeX-arg-define-counter (optional &optional prompt)
+  "Prompt for a LaTeX counter.
+If OPTIONAL is non-nil, insert the resulting value as an optional
+argument, otherwise as a mandatory one.  Use PROMPT as the prompt
+string."
+  (TeX-arg-counter optional prompt t))
+
+(defun TeX-arg-define-savebox (optional &optional prompt)
+  "Prompt for a LaTeX savebox.
+If OPTIONAL is non-nil, insert the resulting value as an optional
+argument, otherwise as a mandatory one.  Use PROMPT as the prompt
+string."
+  (TeX-arg-savebox optional prompt t))
+
+(defcustom LaTeX-style-list '(("amsart")
+                             ("amsbook")
+                             ("article")
+                             ("beamer")
+                             ("book")
+                             ("dinbrief")
+                             ("foils")
+                             ("letter")
+                             ("minimal")
+                             ("prosper")
+                             ("report")
+                             ("scrartcl")
+                             ("scrbook")
+                             ("scrlttr2")
+                             ("scrreprt")
+                             ("slides"))
+  "List of document classes offered when inserting a document environment."
+  :group 'LaTeX-environment
+  :type '(repeat (group (string :format "%v"))))
+
+(defun TeX-arg-document (optional &optional ignore)
+  "Insert arguments to documentclass.
+OPTIONAL and IGNORE are ignored."
+  (let ((style (completing-read
+               (concat "Document class: (default " LaTeX-default-style ") ")
+               LaTeX-style-list))
+       (options (read-string "Options: "
+                             (if (stringp LaTeX-default-options)
+                                 LaTeX-default-options
+                               (mapconcat 'identity
+                                          LaTeX-default-options
+                                          ",")))))
+    (if (zerop (length style))
+       (setq style LaTeX-default-style))
+    (if (not (zerop (length options)))
+       (insert LaTeX-optop options LaTeX-optcl))
+    (insert TeX-grop style TeX-grcl))
+
+  ;; remove old information
+  (TeX-remove-style)
+
+  ;; defined in individual style hooks
+  (TeX-update-style))
+
+(defun LaTeX-arg-usepackage (optional)
+  "Insert arguments to usepackage.
+OPTIONAL is ignored."
+  (let ((TeX-file-extensions '("sty")))
+    (TeX-arg-input-file nil "Package")
+    (save-excursion
+      (search-backward-regexp "{\\(.*\\)}")
+      (let* ((package (match-string 1))
+            (var (intern (format "LaTeX-%s-package-options" package)))
+            (crm-separator ",")
+            (TeX-arg-opening-brace LaTeX-optop)
+            (TeX-arg-closing-brace LaTeX-optcl)
+            options)
+       (if (or (and (boundp var)
+                    (listp (symbol-value var)))
+               (fboundp var))
+           (if (functionp var)
+               (setq options (funcall var))
+             (when (symbol-value var)
+               (setq options
+                     (mapconcat 'identity
+                                (TeX-completing-read-multiple
+                                 "Options: " (mapcar 'list (symbol-value var)))
+                                ","))))
+         (setq options (read-string "Options: ")))
+       (when options
+         ;; XXX: The following statement will add the options
+         ;; supplied to the LaTeX package to the style list.  This is
+         ;; consistent with the way the parser works (see
+         ;; `LaTeX-auto-cleanup').  But in a revamped style system
+         ;; such options should be associated with their LaTeX
+         ;; package to avoid confusion.  For example a `german' entry
+         ;; in the style list can come from documentclass options and
+         ;; does not necessarily mean that the babel-related
+         ;; extensions should be activated.
+         (mapc 'TeX-run-style-hooks (LaTeX-listify-package-options options))
+         (TeX-argument-insert options t))))))
+
+(defvar TeX-global-input-files nil
+  "List of the non-local TeX input files.
+
+Initialized once at the first time you prompt for an input file.
+May be reset with `\\[universal-argument] \\[TeX-normal-mode]'.")
+
+(defun TeX-arg-input-file (optional &optional prompt local)
+  "Prompt for a tex or sty file.
+If OPTIONAL is non-nil, insert the resulting value as an optional
+argument, otherwise as a mandatory one.  PROMPT is the prompt,
+LOCAL is a flag.  If the flag is set, only complete with local
+files."
+  (unless (or TeX-global-input-files local)
+    (message "Searching for files...")
+    (setq TeX-global-input-files
+         (mapcar 'list (TeX-search-files (append TeX-macro-private
+                                                 TeX-macro-global)
+                                         TeX-file-extensions t t))))
+  (let ((file (if TeX-check-path
+                 (completing-read
+                  (TeX-argument-prompt optional prompt "File")
+                  (TeX-delete-dups-by-car
+                   (append (mapcar 'list
+                                   (TeX-search-files '("./")
+                                                     TeX-file-extensions
+                                                     t t))
+                           (unless local
+                             TeX-global-input-files))))
+               (read-file-name
+                (TeX-argument-prompt optional prompt "File")))))
+    (if (null file)
+       (setq file ""))
+    (if (not (string-equal "" file))
+       (TeX-run-style-hooks file))
+    (TeX-argument-insert file optional)))
+
+(defvar BibTeX-global-style-files nil
+  "Association list of BibTeX style files.
+
+Initialized once at the first time you prompt for an input file.
+May be reset with `\\[universal-argument] \\[TeX-normal-mode]'.")
+
+(defun TeX-arg-bibstyle (optional &optional prompt)
+  "Prompt for a BibTeX style file.
+If OPTIONAL is non-nil, insert the resulting value as an optional
+argument, otherwise as a mandatory one.  Use PROMPT as the prompt
+string."
+  (message "Searching for BibTeX styles...")
+  (or BibTeX-global-style-files
+      (setq BibTeX-global-style-files
+           (mapcar 'list
+                   (TeX-search-files (append TeX-macro-private
+                                             TeX-macro-global)
+                                     BibTeX-style-extensions t t))))
+
+  (TeX-argument-insert
+   (completing-read (TeX-argument-prompt optional prompt "BibTeX style")
+                   (append (mapcar 'list
+                                   (TeX-search-files '("./")
+                                                     BibTeX-style-extensions
+                                                     t t))
+                           BibTeX-global-style-files))
+   optional))
+
+(defvar BibTeX-global-files nil
+  "Association list of BibTeX files.
+
+Initialized once at the first time you prompt for an BibTeX file.
+May be reset with `\\[universal-argument] \\[TeX-normal-mode]'.")
+
+(defun TeX-arg-bibliography (optional &optional prompt)
+  "Prompt for a BibTeX database file.
+If OPTIONAL is non-nil, insert the resulting value as an optional
+argument, otherwise as a mandatory one.  Use PROMPT as the prompt
+string."
+  (message "Searching for BibTeX files...")
+  (or BibTeX-global-files
+      (setq BibTeX-global-files
+           (mapcar 'list (TeX-search-files nil BibTeX-file-extensions t t))))
+
+  (let ((styles (multi-prompt
+                "," t
+                (TeX-argument-prompt optional prompt "BibTeX files")
+                (append (mapcar 'list
+                                (TeX-search-files '("./")
+                                                  BibTeX-file-extensions
+                                                  t t))
+                        BibTeX-global-files))))
+    (apply 'LaTeX-add-bibliographies styles)
+    (TeX-argument-insert (mapconcat 'identity styles ",") optional)))
+
+(defun TeX-arg-corner (optional &optional prompt)
+  "Prompt for a LaTeX side or corner position with completion.
+If OPTIONAL is non-nil, insert the resulting value as an optional
+argument, otherwise as a mandatory one.  Use PROMPT as the prompt
+string."
+  (TeX-argument-insert
+   (completing-read (TeX-argument-prompt optional prompt "Position")
+                   '(("") ("l") ("r") ("t") ("b") ("tl") ("tr") ("bl") ("br"))
+                   nil t)
+   optional))
+
+(defun TeX-arg-lr (optional &optional prompt)
+  "Prompt for a LaTeX side with completion.
+If OPTIONAL is non-nil, insert the resulting value as an optional
+argument, otherwise as a mandatory one.  Use PROMPT as the prompt
+string."
+  (TeX-argument-insert
+   (completing-read (TeX-argument-prompt optional prompt "Position")
+                   '(("") ("l") ("r"))
+                   nil t)
+   optional))
+
+(defun TeX-arg-tb (optional &optional prompt)
+  "Prompt for a LaTeX side with completion.
+If OPTIONAL is non-nil, insert the resulting value as an optional
+argument, otherwise as a mandatory one.  Use PROMPT as the prompt
+string."
+  (TeX-argument-insert
+   (completing-read (TeX-argument-prompt optional prompt "Position")
+                   '(("") ("t") ("b"))
+                   nil t)
+   optional))
+
+(defun TeX-arg-pagestyle (optional &optional prompt)
+  "Prompt for a LaTeX pagestyle with completion.
+If OPTIONAL is non-nil, insert the resulting value as an optional
+argument, otherwise as a mandatory one.  Use PROMPT as the prompt
+string."
+  (TeX-argument-insert
+   (completing-read (TeX-argument-prompt optional prompt "Pagestyle")
+                   '(("plain") ("empty") ("headings") ("myheadings")))
+   optional))
+
+(defcustom LaTeX-default-verb-delimiter ?|
+  "Default delimiter for `\\verb' macros."
+  :group 'LaTeX-macro
+  :type 'character)
+
+(defun TeX-arg-verb (optional &optional ignore)
+  "Prompt for delimiter and text.
+If OPTIONAL is non-nil, insert the resulting value as an optional
+argument, otherwise as a mandatory one.  IGNORE is ignored."
+  (let ((del (read-quoted-char
+             (concat "Delimiter: (default "
+                     (char-to-string LaTeX-default-verb-delimiter) ") "))))
+    (when (<= del ?\ ) (setq del LaTeX-default-verb-delimiter))
+    (if (TeX-active-mark)
+       (progn
+         (insert del)
+         (goto-char (mark))
+         (insert del))
+      (insert del (read-from-minibuffer "Text: ") del))
+    (setq LaTeX-default-verb-delimiter del)))
+
+(defun TeX-arg-pair (optional first second)
+  "Insert a pair of number, prompted by FIRST and SECOND.
+
+The numbers are surounded by parenthesizes and separated with a
+comma.
+
+If OPTIONAL is non-nil, insert the resulting value as an optional
+argument, otherwise as a mandatory one."
+  (insert "(" (read-string (concat first  ": ")) ","
+             (read-string (concat second ": ")) ")"))
+
+(defun TeX-arg-size (optional)
+  "Insert width and height as a pair.
+If OPTIONAL is non-nil, insert the resulting value as an optional
+argument, otherwise as a mandatory one."
+  (TeX-arg-pair optional "Width" "Height"))
+
+(defun TeX-arg-coordinate (optional)
+  "Insert x and y coordinate as a pair.
+If OPTIONAL is non-nil, insert the resulting value as an optional
+argument, otherwise as a mandatory one."
+ (TeX-arg-pair optional "X position" "Y position"))
+
+(defconst TeX-braces-default-association
+  '(("[" . "]")
+    ("\\{" . "\\}")
+    ("(" . ")")
+    ("|" . "|")
+    ("\\|" . "\\|")
+    ("/" . "/")
+    ("\\backslash" . "\\backslash")
+    ("\\lfloor" . "\\rfloor")
+    ("\\lceil" . "\\rceil")
+    ("\\langle" . "\\rangle")))
+
+(defcustom TeX-braces-user-association nil
+  "A list of your personal association of brace symbols.
+These are used for \\left and \\right.
+
+The car of each entry is the brace used with \\left,
+the cdr is the brace used with \\right."
+  :group 'LaTeX-macro
+  :group 'LaTeX-math
+  :type '(repeat (cons :format "%v"
+                      (string :tag "Left")
+                      (string :tag "Right"))))
+
+(defvar TeX-braces-association
+  (append TeX-braces-user-association
+         TeX-braces-default-association)
+    "A list of association of brace symbols for \\left and \\right.
+The car of each entry is the brace used with \\left,
+the cdr is the brace used with \\right.")
+
+(defvar TeX-left-right-braces
+  '(("[") ("]") ("\\{") ("\\}") ("(") (")") ("|") ("\\|")
+    ("/") ("\\backslash") ("\\lfloor") ("\\rfloor")
+    ("\\lceil") ("\\rceil") ("\\langle") ("\\rangle")
+    ("\\uparrow") ("\\Uparrow") ("\\downarrow") ("\\Downarrow")
+    ("\\updownarrow") ("\\Updownarrow") ("."))
+  "List of symbols which can follow the \\left or \\right command.")
+
+(defun TeX-arg-insert-braces (optional &optional prompt)
+  "Prompt for a brace for \\left and insert the corresponding \\right.
+If OPTIONAL is non-nil, insert the resulting value as an optional
+argument, otherwise as a mandatory one.  Use PROMPT as the prompt
+string."
+  (save-excursion
+    (backward-word 1)
+    (backward-char)
+    (LaTeX-newline)
+    (indent-according-to-mode)
+    (beginning-of-line 0)
+    (if (looking-at "^[ \t]*$")
+       (progn (delete-horizontal-space)
+              (delete-char 1))))
+  (let ((left-brace (completing-read
+                    (TeX-argument-prompt optional prompt "Which brace")
+                    TeX-left-right-braces)))
+    (insert left-brace)
+    (LaTeX-newline)
+    (indent-according-to-mode)
+    (save-excursion
+      (let ((right-brace (cdr (assoc left-brace
+                                    TeX-braces-association))))
+       (LaTeX-newline)
+       (insert TeX-esc "right")
+       (if (and TeX-arg-right-insert-p
+                right-brace)
+           (insert right-brace)
+         (insert (completing-read
+                  (TeX-argument-prompt optional prompt "Which brace")
+                  TeX-left-right-braces)))
+       (indent-according-to-mode)))))
+
+(defun TeX-arg-key-val (optional key-val-alist)
+  "Prompt for keys and values in KEY-VAL-ALIST.
+Insert the given value as a TeX macro argument.  If OPTIONAL is
+non-nil, insert it as an optional argument.  KEY-VAL-ALIST is an
+alist.  The car of each element should be a string representing a
+key and the optional cdr should be a list with strings to be used
+as values for the key."
+  (let ((options (multi-prompt-key-value
+                 (TeX-argument-prompt optional "Options" nil)
+                 (if (symbolp key-val-alist)
+                     (eval key-val-alist)
+                   key-val-alist))))
+    (TeX-argument-insert options optional)))
+
+
+;;; Verbatim constructs
+
+(defcustom LaTeX-verbatim-macros-with-delims
+  '("verb" "verb*")
+  "Macros for inline verbatim with arguments in delimiters, like \\foo|...|.
+
+Programs should not use this variable directly but the function
+`LaTeX-verbatim-macros-with-delims' which returns a value
+including buffer-local keyword additions via
+`LaTeX-verbatim-macros-with-delims-local' as well."
+  :group 'LaTeX-macro
+  :type '(repeat (string)))
+
+(defvar LaTeX-verbatim-macros-with-delims-local nil
+  "Buffer-local variable for inline verbatim with args in delimiters.
+
+Style files should add constructs to this variable and not to
+`LaTeX-verbatim-macros-with-delims'.
+
+Programs should not use this variable directly but the function
+`LaTeX-verbatim-macros-with-delims' which returns a value
+including values of the variable
+`LaTeX-verbatim-macros-with-delims' as well.")
+(make-variable-buffer-local 'LaTeX-verbatim-macros-with-delims-local)
+
+(defcustom LaTeX-verbatim-macros-with-braces nil
+  "Macros for inline verbatim with arguments in braces, like \\foo{...}.
+
+Programs should not use this variable directly but the function
+`LaTeX-verbatim-macros-with-braces' which returns a value
+including buffer-local keyword additions via
+`LaTeX-verbatim-macros-with-braces-local' as well."
+  :group 'LaTeX-macro
+  :type '(repeat (string)))
+
+(defvar LaTeX-verbatim-macros-with-braces-local nil
+  "Buffer-local variable for inline verbatim with args in braces.
+
+Style files should add constructs to this variable and not to
+`LaTeX-verbatim-macros-with-braces'.
+
+Programs should not use this variable directly but the function
+`LaTeX-verbatim-macros-with-braces' which returns a value
+including values of the variable
+`LaTeX-verbatim-macros-with-braces' as well.")
+(make-variable-buffer-local 'LaTeX-verbatim-macros-with-braces-local)
+
+(defcustom LaTeX-verbatim-environments
+  '("verbatim" "verbatim*")
+  "Verbatim environments.
+
+Programs should not use this variable directly but the function
+`LaTeX-verbatim-environments' which returns a value including
+buffer-local keyword additions via
+`LaTeX-verbatim-environments-local' as well."
+  :group 'LaTeX-environment
+  :type '(repeat (string)))
+
+(defvar LaTeX-verbatim-environments-local nil
+  "Buffer-local variable for inline verbatim environments.
+
+Style files should add constructs to this variable and not to
+`LaTeX-verbatim-environments'.
+
+Programs should not use this variable directly but the function
+`LaTeX-verbatim-environments' which returns a value including
+values of the variable `LaTeX-verbatim-environments' as well.")
+(make-variable-buffer-local 'LaTeX-verbatim-environments-local)
+
+(defun LaTeX-verbatim-macros-with-delims ()
+  "Return list of verbatim macros with delimiters."
+  (append LaTeX-verbatim-macros-with-delims
+         LaTeX-verbatim-macros-with-delims-local))
+
+(defun LaTeX-verbatim-macros-with-braces ()
+  "Return list of verbatim macros with braces."
+  (append LaTeX-verbatim-macros-with-braces
+         LaTeX-verbatim-macros-with-braces-local))
+
+(defun LaTeX-verbatim-environments ()
+  "Return list of verbatim environments."
+  (append LaTeX-verbatim-environments
+         LaTeX-verbatim-environments-local))
+
+(defun LaTeX-verbatim-macro-boundaries ()
+  "Return boundaries of verbatim macro.
+Boundaries are returned as a cons cell where the car is the macro
+start and the cdr the macro end.
+
+Only macros which enclose their arguments with special
+non-parenthetical delimiters, like \\verb+foo+, are recognized."
+  (save-excursion
+    (let ((orig (point))
+         (verbatim-regexp (regexp-opt (LaTeX-verbatim-macros-with-delims) t)))
+      ;; Search backwards for the macro start, unless we are facing one
+      (unless (looking-at (concat (regexp-quote TeX-esc) verbatim-regexp))
+       (catch 'found
+         (while (progn
+                  (skip-chars-backward (concat "^\n" (regexp-quote TeX-esc))
+                                       (line-beginning-position))
+                  (when (looking-at verbatim-regexp) (throw 'found nil))
+                  (or (bobp) (forward-char -1))
+                  (/= (point) (line-beginning-position))))))
+      ;; Search forward for the macro end, unless we failed to find a start
+      (unless (bolp)
+       (let ((beg (1- (point))))
+         (goto-char (1+ (match-end 0)))
+         (skip-chars-forward (concat "^" (buffer-substring-no-properties
+                                          (1- (point)) (point))))
+         (when (<= orig (point))
+           (cons beg (1+ (point)))))))))
+
+(defun LaTeX-current-verbatim-macro ()
+  "Return name of verbatim macro containing point, nil if none is present."
+  (let ((macro-boundaries (LaTeX-verbatim-macro-boundaries)))
+    (when macro-boundaries
+      (save-excursion
+       (goto-char (car macro-boundaries))
+       (forward-char (length TeX-esc))
+       (buffer-substring-no-properties
+        (point) (progn (skip-chars-forward "@A-Za-z") (point)))))))
+
+(defun LaTeX-verbatim-p (&optional pos)
+  "Return non-nil if position POS is in a verbatim-like construct."
+  (when pos (goto-char pos))
+  (save-match-data
+    (or (when (fboundp 'font-latex-faces-present-p)
+         (font-latex-faces-present-p 'font-latex-verbatim-face))
+       (member (LaTeX-current-verbatim-macro)
+               (LaTeX-verbatim-macros-with-delims))
+       (member (TeX-current-macro) (LaTeX-verbatim-macros-with-braces))
+       (member (LaTeX-current-environment) (LaTeX-verbatim-environments)))))
+
+
+;;; Formatting
+
+(defcustom LaTeX-syntactic-comments t
+  "If non-nil comments will be handled according to LaTeX syntax.
+This variable influences, among others, the behavior of
+indentation and filling which will take LaTeX syntax into
+consideration just as is in the non-commented source code."
+  :type 'boolean
+  :group 'LaTeX)
+
+
+;;; Indentation
+
+;; We are distinguishing two different types of comments:
+;;
+;; 1) Comments starting in column one (line comments)
+;;
+;; 2) Comments starting after column one with only whitespace
+;;    preceding it.
+;;
+;; (There is actually a third type: Comments preceded not only by
+;; whitespace but by some code as well; so-called code comments.  But
+;; they are not relevant for the following explanations.)
+;;
+;; Additionally we are distinguishing two different types of
+;; indentation:
+;;
+;; a) Outer indentation: Indentation before the comment character(s).
+;;
+;; b) Inner indentation: Indentation after the comment character(s)
+;;    (taking into account possible comment padding).
+;;
+;; Comments can be filled syntax-aware or not.
+;;
+;; In `doctex-mode' line comments should always be indented
+;; syntax-aware and the comment character has to be anchored at the
+;; first column (unless the appear in a macrocode environment).  Other
+;; comments not in the documentation parts always start after the
+;; first column and can be indented syntax-aware or not.  If they are
+;; indented syntax-aware both the indentation before and after the
+;; comment character(s) have to be checked and adjusted.  Indentation
+;; should not move the comment character(s) to the first column.  With
+;; `LaTeX-syntactic-comments' disabled, line comments should still be
+;; indented syntax-aware.
+;;
+;; In `latex-mode' comments starting in different columns don't have
+;; to be handled differently.  They don't have to be anchored in
+;; column one.  That means that in any case indentation before and
+;; after the comment characters has to be checked and adjusted.
+
+(defgroup LaTeX-indentation nil
+  "Indentation of LaTeX code in AUCTeX"
+  :group 'LaTeX
+  :group 'TeX-indentation)
+
+(defcustom LaTeX-indent-level 2
+  "*Indentation of begin-end blocks in LaTeX."
+  :group 'LaTeX-indentation
+  :type 'integer)
+
+(defcustom LaTeX-item-indent (- LaTeX-indent-level)
+  "*Extra indentation for lines beginning with an item."
+  :group 'LaTeX-indentation
+  :type 'integer)
+
+(defcustom LaTeX-item-regexp "\\(bib\\)?item\\b"
+  "*Regular expression matching macros considered items."
+  :group 'LaTeX-indentation
+  :type 'regexp)
+
+(defcustom LaTeX-indent-environment-list
+  '(("verbatim" current-indentation)
+    ("verbatim*" current-indentation)
+    ;; The following should have there own, smart indentation function.
+    ;; Some other day.
+    ("array")
+    ("displaymath")
+    ("eqnarray")
+    ("eqnarray*")
+    ("equation")
+    ("equation*")
+    ("picture")
+    ("tabbing")
+    ("table")
+    ("table*")
+    ("tabular")
+    ("tabular*"))
+    "Alist of environments with special indentation.
+The second element in each entry is the function to calculate the
+indentation level in columns."
+    :group 'LaTeX-indentation
+    :type '(repeat (list (string :tag "Environment")
+                        (option function))))
+
+(defcustom LaTeX-indent-environment-check t
+  "*If non-nil, check for any special environments."
+  :group 'LaTeX-indentation
+  :type 'boolean)
+
+(defcustom LaTeX-document-regexp "document"
+  "Regexp matching environments in which the indentation starts at col 0."
+  :group 'LaTeX-indentation
+  :type 'regexp)
+
+(defcustom LaTeX-verbatim-regexp "verbatim\\*?"
+  "*Regexp matching environments with indentation at col 0 for begin/end."
+  :group 'LaTeX-indentation
+  :type 'regexp)
+
+(defcustom LaTeX-begin-regexp "begin\\b"
+  "*Regexp matching macros considered begins."
+  :group 'LaTeX-indentation
+  :type 'regexp)
+
+(defcustom LaTeX-end-regexp "end\\b"
+  "*Regexp matching macros considered ends."
+  :group 'LaTeX-indentation
+  :type 'regexp)
+
+(defcustom LaTeX-left-right-indent-level LaTeX-indent-level
+  "*The level of indentation produced by a \\left macro."
+  :group 'LaTeX-indentation
+  :type 'integer)
+
+(defcustom LaTeX-indent-comment-start-regexp "%"
+  "*Regexp matching comments ending the indent level count.
+This means, we just count the LaTeX tokens \\left, \\right, \\begin,
+and \\end up to the first occurence of text matching this regexp.
+Thus, the default \"%\" stops counting the tokens at a comment.  A
+value of \"%[^>]\" would allow you to alter the indentation with
+comments, e.g. with comment `%> \\begin'.
+Lines which start with `%' are not considered at all, regardless if this
+value."
+  :group 'LaTeX-indentation
+  :type 'regexp)
+
+(defvar docTeX-indent-inner-fixed
+  `((,(concat (regexp-quote TeX-esc)
+            "\\(begin\\|end\\)[ \t]*{macrocode\\*?}") 4 t)
+    (,(concat (regexp-quote TeX-esc)
+            "\\(begin\\|end\\)[ \t]*{\\(macro\\|environment\\)\\*?}") 0 nil))
+  "List of items which should have a fixed inner indentation.
+The items consist of three parts.  The first is a regular
+expression which should match the respective string.  The second
+is the amount of spaces to be used for indentation.  The third
+toggles if comment padding is relevant or not.  If t padding is
+part of the amount given, if nil the amount of spaces will be
+inserted after potential padding.")
+
+(defun LaTeX-indent-line ()
+  "Indent the line containing point, as LaTeX source.
+Add `LaTeX-indent-level' indentation in each \\begin{ - \\end{ block.
+Lines starting with an item is given an extra indentation of
+`LaTeX-item-indent'."
+  (interactive)
+  (let* ((case-fold-search nil)
+        ;; Compute a fill prefix.  Whitespace after the comment
+        ;; characters will be disregarded and replaced by
+        ;; `comment-padding'.
+        (fill-prefix
+         (and (TeX-in-commented-line)
+              (save-excursion
+                (beginning-of-line)
+                (looking-at
+                 (concat "\\([ \t]*" TeX-comment-start-regexp "+\\)+"))
+                (concat (match-string 0) (TeX-comment-padding-string)))))
+        (overlays (when (featurep 'xemacs)
+                    ;; Isn't that fun?  In Emacs an `(overlays-at
+                    ;; (line-beginning-position))' would do the
+                    ;; trick.  How boring.
+                    (extent-list
+                     nil (line-beginning-position) (line-beginning-position)
+                     'all-extents-closed-open 'overlay)))
+        ol-specs)
+    ;; XEmacs' `indent-to' function (at least in version 21.4.15) has
+    ;; a bug which leads to the insertion of whitespace in front of an
+    ;; invisible overlay.  So during indentation we temporarily remove
+    ;; the 'invisible property.
+    (dolist (ol overlays)
+      (when (extent-property ol 'invisible)
+       (add-to-list 'ol-specs (list ol (extent-property ol 'invisible)))
+       (set-extent-property ol 'invisible nil)))
+    (save-excursion
+      (cond ((and fill-prefix
+                 (TeX-in-line-comment)
+                 (eq major-mode 'doctex-mode))
+            ;; If point is in a line comment in `doctex-mode' we only
+            ;; consider the inner indentation.
+            (let ((inner-indent (LaTeX-indent-calculate 'inner)))
+              (when (/= (LaTeX-current-indentation 'inner) inner-indent)
+                (LaTeX-indent-inner-do inner-indent))))
+           ((and fill-prefix
+                 LaTeX-syntactic-comments)
+            ;; In any other case of a comment we have to consider
+            ;; outer and inner indentation if we do syntax-aware
+            ;; indentation.
+            (let ((inner-indent (LaTeX-indent-calculate 'inner))
+                  (outer-indent (LaTeX-indent-calculate 'outer)))
+              (when (/= (LaTeX-current-indentation 'inner) inner-indent)
+                  (LaTeX-indent-inner-do inner-indent))
+              (when (/= (LaTeX-current-indentation 'outer) outer-indent)
+                  (LaTeX-indent-outer-do outer-indent))))
+           (t
+            ;; The default is to adapt whitespace before any
+            ;; non-whitespace character, i.e. to do outer
+            ;; indentation.
+            (let ((outer-indent (LaTeX-indent-calculate 'outer)))
+              (when (/= (LaTeX-current-indentation 'outer) outer-indent)
+                  (LaTeX-indent-outer-do outer-indent))))))
+    ;; Make the overlays invisible again.
+    (dolist (ol-spec ol-specs)
+      (set-extent-property (car ol-spec) 'invisible (cadr ol-spec)))
+    (when (< (current-column) (save-excursion
+                               (LaTeX-back-to-indentation) (current-column)))
+      (LaTeX-back-to-indentation))))
+
+(defun LaTeX-indent-inner-do (inner-indent)
+  ;; Small helper function for `LaTeX-indent-line' to perform
+  ;; indentation after a comment character.  It requires that
+  ;; `LaTeX-indent-line' already set the appropriate variables and
+  ;; should not be used outside of `LaTeX-indent-line'.
+  (move-to-left-margin)
+  (TeX-re-search-forward-unescaped
+   (concat "\\(" TeX-comment-start-regexp "+[ \t]*\\)+") (line-end-position) t)
+  (delete-region (line-beginning-position) (point))
+  (insert fill-prefix)
+  (indent-to (+ inner-indent (length fill-prefix))))
+
+(defun LaTeX-indent-outer-do (outer-indent)
+  ;; Small helper function for `LaTeX-indent-line' to perform
+  ;; indentation of normal lines or before a comment character in a
+  ;; commented line.  It requires that `LaTeX-indent-line' already set
+  ;; the appropriate variables and should not be used outside of
+  ;; `LaTeX-indent-line'.
+  (back-to-indentation)
+  (delete-region (line-beginning-position) (point))
+  (indent-to outer-indent))
+
+(defun LaTeX-indent-calculate (&optional force-type)
+  "Return the indentation of a line of LaTeX source.
+FORCE-TYPE can be used to force the calculation of an inner or
+outer indentation in case of a commented line.  The symbols
+'inner and 'outer are recognized."
+  (save-excursion
+    (LaTeX-back-to-indentation force-type)
+    (let ((i 0)
+         (list-length (safe-length docTeX-indent-inner-fixed))
+         entry
+         found)
+      (cond ((save-excursion (beginning-of-line) (bobp)) 0)
+           ((and (eq major-mode 'doctex-mode)
+                 fill-prefix
+                 (TeX-in-line-comment)
+                 (progn
+                   (while (and (< i list-length)
+                               (not found))
+                     (setq entry (nth i docTeX-indent-inner-fixed))
+                     (when (looking-at (nth 0 entry))
+                       (setq found t))
+                     (setq i (1+ i)))
+                   found))
+            (if (nth 2 entry)
+                (- (nth 1 entry) (if (integerp comment-padding)
+                                     comment-padding
+                                   (length comment-padding)))
+              (nth 1 entry)))
+           ((looking-at (concat (regexp-quote TeX-esc)
+                                "\\(begin\\|end\\){\\("
+                                LaTeX-verbatim-regexp
+                                "\\)}"))
+            ;; \end{verbatim} must be flush left, otherwise an unwanted
+            ;; empty line appears in LaTeX's output.
+            0)
+           ((and LaTeX-indent-environment-check
+                 ;; Special environments.
+                 (let ((entry (assoc (or LaTeX-current-environment
+                                         (LaTeX-current-environment))
+                                     LaTeX-indent-environment-list)))
+                   (and entry
+                        (nth 1 entry)
+                        (funcall (nth 1 entry))))))
+           ((looking-at (concat (regexp-quote TeX-esc)
+                                "\\("
+                                LaTeX-end-regexp
+                                "\\)"))
+            ;; Backindent at \end.
+            (- (LaTeX-indent-calculate-last force-type) LaTeX-indent-level))
+           ((looking-at (concat (regexp-quote TeX-esc) "right\\b"))
+            ;; Backindent at \right.
+            (- (LaTeX-indent-calculate-last force-type)
+               LaTeX-left-right-indent-level))
+           ((looking-at (concat (regexp-quote TeX-esc)
+                                "\\("
+                                LaTeX-item-regexp
+                                "\\)"))
+            ;; Items.
+            (+ (LaTeX-indent-calculate-last force-type) LaTeX-item-indent))
+           ((looking-at "}")
+            ;; End brace in the start of the line.
+            (- (LaTeX-indent-calculate-last force-type)
+               TeX-brace-indent-level))
+           (t (LaTeX-indent-calculate-last force-type))))))
+
+(defun LaTeX-indent-level-count ()
+  "Count indentation change caused by all \\left, \\right, \\begin, and
+\\end commands in the current line."
+  (save-excursion
+    (save-restriction
+      (let ((count 0))
+       (narrow-to-region (point)
+                         (save-excursion
+                           (re-search-forward
+                            (concat "[^" TeX-esc "]"
+                                    "\\(" LaTeX-indent-comment-start-regexp
+                                    "\\)\\|\n\\|\\'"))
+                           (backward-char)
+                           (point)))
+       (while (search-forward TeX-esc nil t)
+         (cond
+          ((looking-at "left\\b")
+           (setq count (+ count LaTeX-left-right-indent-level)))
+          ((looking-at "right\\b")
+           (setq count (- count LaTeX-left-right-indent-level)))
+          ((looking-at LaTeX-begin-regexp)
+           (setq count (+ count LaTeX-indent-level)))
+          ((looking-at LaTeX-end-regexp)
+           (setq count (- count LaTeX-indent-level)))
+          ((looking-at (regexp-quote TeX-esc))
+           (forward-char 1))))
+       count))))
+
+(defun LaTeX-indent-calculate-last (&optional force-type)
+  "Return the correct indentation of a normal line of text.
+The point is supposed to be at the beginning of the current line.
+FORCE-TYPE can be used to force the calculation of an inner or
+outer indentation in case of a commented line.  The symbols
+'inner and 'outer are recognized."
+  (let (line-comment-current-flag
+       line-comment-last-flag
+       comment-current-flag
+       comment-last-flag)
+    (beginning-of-line)
+    (setq line-comment-current-flag (TeX-in-line-comment)
+         comment-current-flag (TeX-in-commented-line))
+    (if comment-current-flag
+       (skip-chars-backward "%\n\t ")
+      (skip-chars-backward "\n\t "))
+    (beginning-of-line)
+    ;; If we are called in a non-comment line, skip over comment
+    ;; lines.  The computation of indentation should in this case
+    ;; rather take the last non-comment line into account.
+    ;; Otherwise there might arise problems with e.g. multi-line
+    ;; code comments.  This behavior is not enabled in docTeX mode
+    ;; where large amounts of line comments may have to be skipped
+    ;; and indentation should not be influenced by unrelated code in
+    ;; other macrocode environments.
+    (while (and (not (eq major-mode 'doctex-mode))
+               (not comment-current-flag)
+               (TeX-in-commented-line)
+               (not (bobp)))
+      (skip-chars-backward "\n\t ")
+      (beginning-of-line))
+    (setq line-comment-last-flag (TeX-in-line-comment)
+         comment-last-flag (TeX-in-commented-line))
+    (LaTeX-back-to-indentation force-type)
+    ;; Separate line comments and other stuff (normal text/code and
+    ;; code comments).  Additionally we don't want to compute inner
+    ;; indentation when a commented and a non-commented line are
+    ;; compared.
+    (cond ((or (and (eq major-mode 'doctex-mode)
+                   (or (and line-comment-current-flag
+                            (not line-comment-last-flag))
+                       (and (not line-comment-current-flag)
+                            line-comment-last-flag)))
+              (and force-type
+                   (eq force-type 'inner)
+                   (or (and comment-current-flag
+                            (not comment-last-flag))
+                       (and (not comment-current-flag)
+                            comment-last-flag))))
+          0)
+         ((looking-at (concat (regexp-quote TeX-esc)
+                              "begin *{\\("
+                              LaTeX-document-regexp
+                              "\\)}"))
+          ;; I dislike having all of the document indented...
+          (+ (LaTeX-current-indentation force-type)
+             ;; Some people have opening braces at the end of the
+             ;; line, e.g. in case of `\begin{letter}{%'.
+             (TeX-brace-count-line)))
+         ((and (eq major-mode 'doctex-mode)
+               (looking-at (concat (regexp-quote TeX-esc)
+                                   "end[ \t]*{macrocode\\*?}"))
+               fill-prefix
+               (TeX-in-line-comment))
+          ;; Reset indentation to zero after a macrocode
+          ;; environment.
+          0)
+         ((looking-at (concat (regexp-quote TeX-esc)
+                              "begin *{\\("
+                              LaTeX-verbatim-regexp
+                              "\\)}"))
+          0)
+         ((looking-at (concat (regexp-quote TeX-esc)
+                              "end *{\\("
+                              LaTeX-verbatim-regexp
+                              "\\)}"))
+          ;; If I see an \end{verbatim} in the previous line I skip
+          ;; back to the preceding \begin{verbatim}.
+          (save-excursion
+            (if (re-search-backward (concat (regexp-quote TeX-esc)
+                                            "begin *{\\("
+                                            LaTeX-verbatim-regexp
+                                            "\\)}") 0 t)
+                (LaTeX-indent-calculate-last force-type)
+              0)))
+         (t (+ (LaTeX-current-indentation force-type)
+               (if (not (and force-type
+                             (eq force-type 'outer)
+                             (TeX-in-commented-line)))
+                   (+ (LaTeX-indent-level-count)
+                      (TeX-brace-count-line))
+                 0)
+               (cond ((looking-at (concat (regexp-quote TeX-esc)
+                                          "\\("
+                                          LaTeX-end-regexp
+                                          "\\)"))
+                      LaTeX-indent-level)
+                     ((looking-at
+                       (concat (regexp-quote TeX-esc) "right\\b"))
+                      LaTeX-left-right-indent-level)
+                     ((looking-at (concat (regexp-quote TeX-esc)
+                                          "\\("
+                                          LaTeX-item-regexp
+                                          "\\)"))
+                      (- LaTeX-item-indent))
+                     ((looking-at "}")
+                      TeX-brace-indent-level)
+                     (t 0)))))))
+
+(defun LaTeX-current-indentation (&optional force-type)
+  "Return the indentation of a line.
+FORCE-TYPE can be used to force the calculation of an inner or
+outer indentation in case of a commented line.  The symbols
+'inner and 'outer are recognized."
+  (if (and fill-prefix
+          (or (and force-type
+                   (eq force-type 'inner))
+              (and (not force-type)
+                   (or
+                    ;; If `LaTeX-syntactic-comments' is not enabled,
+                    ;; do conventional indentation
+                    LaTeX-syntactic-comments
+                    ;; Line comments in `doctex-mode' are always
+                    ;; indented syntax-aware so we need their inner
+                    ;; indentation.
+                    (and (TeX-in-line-comment)
+                         (eq major-mode 'doctex-mode))))))
+      ;; INNER indentation
+      (save-excursion
+       (beginning-of-line)
+       (looking-at (concat "\\(?:[ \t]*" TeX-comment-start-regexp "+\\)+"
+                           "\\([ \t]*\\)"))
+       (- (length (match-string 1)) (length (TeX-comment-padding-string))))
+    ;; OUTER indentation
+    (current-indentation)))
+
+(defun LaTeX-back-to-indentation (&optional force-type)
+  "Move point to the first non-whitespace character on this line.
+If it is commented and comments are formatted syntax-aware move
+point to the first non-whitespace character after the comment
+character(s).  The optional argument FORCE-TYPE can be used to
+force point being moved to the inner or outer indentation in case
+of a commented line.  The symbols 'inner and 'outer are
+recognized."
+  (if (or (and force-type
+              (eq force-type 'inner))
+         (and (not force-type)
+              (or (and (TeX-in-line-comment)
+                       (eq major-mode 'doctex-mode))
+                  (and (TeX-in-commented-line)
+                       LaTeX-syntactic-comments))))
+      (progn
+       (beginning-of-line)
+       ;; Should this be anchored at the start of the line?
+       (TeX-re-search-forward-unescaped
+        (concat "\\(?:" TeX-comment-start-regexp "+[ \t]*\\)+")
+        (line-end-position) t))
+    (back-to-indentation)))
+
+
+;;; Filling
+
+(defcustom LaTeX-fill-break-at-separators nil
+  "List of separators before or after which respectively a line
+break will be inserted if they do not fit into one line."
+  :group 'LaTeX
+  :type '(set :tag "Contents"
+             (const :tag "Opening Brace" \{)
+             (const :tag "Closing Brace" \})
+             (const :tag "Opening Bracket" \[)
+             (const :tag "Opening Inline Math Switches" \\\()
+             (const :tag "Closing Inline Math Switches" \\\))
+             (const :tag "Opening Display Math Switch" \\\[)
+             (const :tag "Closing Display Math Switch" \\\])))
+
+(defcustom LaTeX-fill-break-before-code-comments t
+  "If non-nil, a line with some code followed by a comment will
+be broken before the last non-comment word in case the comment
+does not fit into the line."
+  :group 'LaTeX
+  :type 'boolean)
+
+(defvar LaTeX-nospace-between-char-regexp
+  (if (featurep 'xemacs)
+    (if (and (boundp 'word-across-newline) word-across-newline)
+       word-across-newline
+      ;; NOTE: Ensure not to have a value of nil for such a rare case that
+      ;; somebody removes the mule test in `LaTeX-fill-delete-newlines' so that
+      ;; it could match only "\n" and this could lead to problem.  XEmacs does
+      ;; not have a category `\c|' and `\ct' means `Chinese Taiwan' in XEmacs.
+      "\\(\\cj\\|\\cc\\|\\ct\\)")
+    "\\c|")
+  "Regexp matching a character where no interword space is necessary.
+Words formed by such characters can be broken across newlines.")
+
+(defvar LaTeX-fill-newline-hook nil
+  "Hook run after `LaTeX-fill-newline' inserted and indented a new line.")
+
+(defun LaTeX-fill-region-as-paragraph (from to &optional justify-flag)
+  "Fill region as one paragraph.
+Break lines to fit `fill-column', but leave all lines ending with
+\\\\ \(plus its optional argument) alone.  Lines with code
+comments and lines ending with `\par' are included in filling but
+act as boundaries.  Prefix arg means justify too.  From program,
+pass args FROM, TO and JUSTIFY-FLAG."
+  (interactive "*r\nP")
+  (let ((end-marker (save-excursion (goto-char to) (point-marker))))
+    (if (or (assoc (LaTeX-current-environment) LaTeX-indent-environment-list)
+           ;; This could be generalized, if there are more cases where
+           ;; a special string at the start of a region to fill should
+           ;; inhibit filling.
+           (progn (save-excursion (goto-char from)
+                                  (looking-at (concat TeX-comment-start-regexp
+                                                      "+[ \t]*"
+                                                      "Local Variables:")))))
+       ;; Filling disabled, only do indentation.
+       (indent-region from to nil)
+      (save-restriction
+       (goto-char from)
+       (while (< (point) end-marker)
+         (if (re-search-forward
+              (concat "\\("
+                      ;; Code comments.
+                      "[^\r\n%\\]\\([ \t]\\|\\\\\\\\\\)*"
+                      TeX-comment-start-regexp
+                      "\\|"
+                      ;; Lines ending with `\par'.
+                      "\\(\\=\\|[^" TeX-esc "\n]\\)\\("
+                      (regexp-quote (concat TeX-esc TeX-esc))
+                      "\\)*"
+                      (regexp-quote TeX-esc) "par[ \t]*"
+                      "\\({[ \t]*}\\)?[ \t]*$"
+                      "\\)\\|\\("
+                      ;; Lines ending with `\\'.
+                      (regexp-quote TeX-esc)
+                      (regexp-quote TeX-esc)
+                      "\\(\\s-*\\*\\)?"
+                      "\\(\\s-*\\[[^]]*\\]\\)?"
+                      "\\s-*$\\)")
+              end-marker t)
+             (progn
+               (goto-char (line-end-position))
+               (delete-horizontal-space)
+               ;; I doubt very much if we want justify -
+               ;; this is a line with \\
+               ;; if you think otherwise - uncomment the next line
+               ;; (and justify-flag (justify-current-line))
+               (forward-char)
+               ;; keep our position in a buffer
+               (save-excursion
+                 ;; Code comments and lines ending with `\par' are
+                 ;; included in filling.  Lines ending with `\\' are
+                 ;; skipped.
+                 (if (match-string 1)
+                     (LaTeX-fill-region-as-para-do from (point) justify-flag)
+                   (LaTeX-fill-region-as-para-do
+                    from (line-beginning-position 0) justify-flag)
+                   ;; At least indent the line ending with `\\'.
+                   (indent-according-to-mode)))
+               (setq from (point)))
+           ;; ELSE part follows - loop termination relies on a fact
+           ;; that (LaTeX-fill-region-as-para-do) moves point past
+           ;; the filled region
+           (LaTeX-fill-region-as-para-do from end-marker justify-flag)))))))
+
+;; The content of `LaTeX-fill-region-as-para-do' was copied from the
+;; function `fill-region-as-paragraph' in `fill.el' (CVS Emacs,
+;; January 2004) and adapted to the needs of AUCTeX.
+
+(defun LaTeX-fill-region-as-para-do (from to &optional justify
+                                         nosqueeze squeeze-after)
+  "Fill the region defined by FROM and TO as one paragraph.
+It removes any paragraph breaks in the region and extra newlines at the end,
+indents and fills lines between the margins given by the
+`current-left-margin' and `current-fill-column' functions.
+\(In most cases, the variable `fill-column' controls the width.)
+It leaves point at the beginning of the line following the paragraph.
+
+Normally performs justification according to the `current-justification'
+function, but with a prefix arg, does full justification instead.
+
+From a program, optional third arg JUSTIFY can specify any type of
+justification.  Fourth arg NOSQUEEZE non-nil means not to make spaces
+between words canonical before filling.  Fifth arg SQUEEZE-AFTER, if non-nil,
+means don't canonicalize spaces before that position.
+
+Return the `fill-prefix' used for filling.
+
+If `sentence-end-double-space' is non-nil, then period followed by one
+space does not end a sentence, so don't break a line there."
+  (interactive (progn
+                (barf-if-buffer-read-only)
+                (list (region-beginning) (region-end)
+                      (if current-prefix-arg 'full))))
+  (unless (memq justify '(t nil none full center left right))
+    (setq justify 'full))
+
+  ;; Make sure "to" is the endpoint.
+  (goto-char (min from to))
+  (setq to   (max from to))
+  ;; Ignore blank lines at beginning of region.
+  (skip-chars-forward " \t\n")
+
+  (let ((from-plus-indent (point))
+       (oneleft nil))
+
+    (beginning-of-line)
+    (setq from (point))
+
+    ;; Delete all but one soft newline at end of region.
+    ;; And leave TO before that one.
+    (goto-char to)
+    (while (and (> (point) from) (eq ?\n (char-after (1- (point)))))
+      (if (and oneleft
+              (not (and use-hard-newlines
+                        (get-text-property (1- (point)) 'hard))))
+         (delete-backward-char 1)
+       (backward-char 1)
+       (setq oneleft t)))
+    (setq to (copy-marker (point) t))
+    (goto-char from-plus-indent))
+
+  (if (not (> to (point)))
+      nil ;; There is no paragraph, only whitespace: exit now.
+
+    (or justify (setq justify (current-justification)))
+
+    ;; Don't let Adaptive Fill mode alter the fill prefix permanently.
+    (let ((fill-prefix fill-prefix))
+      ;; Figure out how this paragraph is indented, if desired.
+      (when (and adaptive-fill-mode
+                (or (null fill-prefix) (string= fill-prefix "")))
+       (setq fill-prefix (fill-context-prefix from to))
+       ;; Ignore a white-space only fill-prefix
+       ;; if we indent-according-to-mode.
+       (when (and fill-prefix fill-indent-according-to-mode
+                  (string-match "\\`[ \t]*\\'" fill-prefix))
+         (setq fill-prefix nil)))
+
+      (goto-char from)
+      (beginning-of-line)
+
+      (if (not justify)          ; filling disabled: just check indentation
+         (progn
+           (goto-char from)
+           (while (< (point) to)
+             (if (and (not (eolp))
+                      (< (LaTeX-current-indentation) (current-left-margin)))
+                 (fill-indent-to-left-margin))
+             (forward-line 1)))
+
+       (when use-hard-newlines
+         (remove-text-properties from to '(hard nil)))
+       ;; Make sure first line is indented (at least) to left margin...
+       (indent-according-to-mode)
+       ;; COMPATIBILITY for Emacs <= 21.1
+       (if (fboundp 'fill-delete-prefix)
+           ;; Delete the fill-prefix from every line.
+           (fill-delete-prefix from to fill-prefix)
+         ;; Delete the comment prefix and any whitespace from every
+         ;; line of the region in concern except the first. (The
+         ;; implementation is heuristic to a certain degree.)
+         (save-excursion
+           (goto-char from)
+           (forward-line 1)
+           (when (< (point) to)
+             (while (re-search-forward (concat "^[ \t]+\\|^[ \t]*"
+                                               TeX-comment-start-regexp
+                                               "+[ \t]*") to t)
+               (delete-region (match-beginning 0) (match-end 0))))))
+
+       (setq from (point))
+
+       ;; FROM, and point, are now before the text to fill,
+       ;; but after any fill prefix on the first line.
+
+       (LaTeX-fill-delete-newlines from to justify nosqueeze squeeze-after)
+
+       ;; This is the actual FILLING LOOP.
+       (goto-char from)
+       (let* (linebeg
+              (code-comment-start (save-excursion
+                                    (LaTeX-back-to-indentation)
+                                    (TeX-search-forward-comment-start
+                                     (line-end-position))))
+              (end-marker (save-excursion
+                            (goto-char (or code-comment-start to))
+                            (point-marker)))
+              (LaTeX-current-environment (LaTeX-current-environment)))
+         ;; Fill until point is greater than the end point.  If there
+         ;; is a code comment, use the code comment's start as a
+         ;; limit.
+         (while (and (< (point) (marker-position end-marker))
+                     (or (not code-comment-start)
+                         (and code-comment-start
+                              (> (- (marker-position end-marker)
+                                    (line-beginning-position))
+                                 fill-column))))
+           (setq linebeg (point))
+           (move-to-column (current-fill-column))
+           (if (when (< (point) (marker-position end-marker))
+                 ;; Find the position where we'll break the line.
+                 (forward-char 1)      ; Use an immediately following
+                                       ; space, if any.
+                 (LaTeX-fill-move-to-break-point linebeg)
+
+                 ;; Check again to see if we got to the end of
+                 ;; the paragraph.
+                 (skip-chars-forward " \t")
+                 (< (point) (marker-position end-marker)))
+               ;; Found a place to cut.
+               (progn
+                 (LaTeX-fill-newline)
+                 (when justify
+                   ;; Justify the line just ended, if desired.
+                   (save-excursion
+                     (forward-line -1)
+                     (justify-current-line justify nil t))))
+
+             (goto-char end-marker)
+             ;; Justify this last line, if desired.
+             (if justify (justify-current-line justify t t))))
+
+         ;; Fill a code comment if necessary.  (Enable this code if
+         ;; you want the comment part in lines with code comments to
+         ;; be filled.  Originally it was disabled because the
+         ;; indentation code indented the lines following the line
+         ;; with the code comment to the column of the comment
+         ;; starters.  That means, it would have looked like this:
+         ;; | code code code % comment
+         ;; |                % comment
+         ;; |                code code code
+         ;; This now (2005-07-29) is not the case anymore.  But as
+         ;; filling code comments like this would split a single
+         ;; paragraph into two separate ones, we still leave it
+         ;; disabled.  I leave the code here in case it is useful for
+         ;; somebody.
+         ;; (when (and code-comment-start
+         ;;            (> (- (line-end-position) (line-beginning-position))
+         ;;                  fill-column))
+         ;;   (LaTeX-fill-code-comment justify))
+
+         ;; The following is an alternative strategy to minimize the
+         ;; occurence of overfull lines with code comments.  A line
+         ;; will be broken before the last non-comment word if the
+         ;; code comment does not fit into the line.
+         (when (and LaTeX-fill-break-before-code-comments
+                    code-comment-start
+                    (> (- (line-end-position) (line-beginning-position))
+                       fill-column))
+           (beginning-of-line)
+           (goto-char end-marker)
+           (while (not (looking-at TeX-comment-start-regexp)) (forward-char))
+           (skip-chars-backward " \t")
+           (skip-chars-backward "^ \t\n")
+           (unless (or (bolp)
+                       ;; Comment starters and whitespace.
+                       (TeX-looking-at-backward
+                        (concat "^\\([ \t]*" TeX-comment-start-regexp
+                                "+\\)+[ \t]*")
+                        (line-beginning-position)))
+             (LaTeX-fill-newline)))))
+      ;; Leave point after final newline.
+      (goto-char to)
+      (unless (eobp) (forward-char 1))
+      ;; Return the fill-prefix we used
+      fill-prefix)))
+
+;; Following lines are copied from `fill.el' (CVS Emacs, March 2005).
+;;   The `fill-space' property carries the string with which a newline should be
+;;   replaced when unbreaking a line (in fill-delete-newlines).  It is added to
+;;   newline characters by fill-newline when the default behavior of
+;;   fill-delete-newlines is not what we want.
+(unless (featurep 'xemacs)
+  ;; COMPATIBILITY for Emacs < 22.1
+  (add-to-list 'text-property-default-nonsticky '(fill-space . t)))
+
+(defun LaTeX-fill-delete-newlines (from to justify nosqueeze squeeze-after)
+  ;; COMPATIBILITY for Emacs < 22.1 and XEmacs
+  (if (fboundp 'fill-delete-newlines)
+      (fill-delete-newlines from to justify nosqueeze squeeze-after)
+    (if (featurep 'xemacs)
+       (when (featurep 'mule)
+         (goto-char from)
+         (let ((unwished-newline (concat LaTeX-nospace-between-char-regexp "\n"
+                                         LaTeX-nospace-between-char-regexp)))
+           (while (re-search-forward unwished-newline to t)
+             (skip-chars-backward "^\n")
+             (delete-char -1))))
+      ;; This else-sentence was copied from the function `fill-delete-newlines'
+      ;; in `fill.el' (CVS Emacs, 2005-02-17) and adapted accordingly.
+      (while (search-forward "\n" to t)
+       (if (get-text-property (match-beginning 0) 'fill-space)
+           (replace-match (get-text-property (match-beginning 0) 'fill-space))
+         (let ((prev (char-before (match-beginning 0)))
+               (next (following-char)))
+           (when (or (aref (char-category-set next) ?|)
+                     (aref (char-category-set prev) ?|))
+             (delete-char -1))))))
+
+    ;; Make sure sentences ending at end of line get an extra space.
+    (if (or (not (boundp 'sentence-end-double-space))
+           sentence-end-double-space)
+       (progn
+         (goto-char from)
+         (while (re-search-forward "[.?!][]})\"']*$" to t)
+           (insert ? ))))
+    ;; Then change all newlines to spaces.
+    (let ((point-max (progn
+                      (goto-char to)
+                      (skip-chars-backward "\n")
+                      (point))))
+      (subst-char-in-region from point-max ?\n ?\ ))
+    (goto-char from)
+    (skip-chars-forward " \t")
+    ;; Remove extra spaces between words.
+    (unless (and nosqueeze (not (eq justify 'full)))
+      (canonically-space-region (or squeeze-after (point)) to)
+      ;; Remove trailing whitespace.
+      (goto-char (line-end-position))
+      (delete-char (- (skip-chars-backward " \t"))))))
+
+(defun LaTeX-fill-move-to-break-point (linebeg)
+  "Move to the position where the line should be broken."
+  ;; COMPATIBILITY for Emacs < 22.1 and XEmacs
+  (if (fboundp 'fill-move-to-break-point)
+      (fill-move-to-break-point linebeg)
+    (if (featurep 'mule)
+       (if (TeX-looking-at-backward
+            (concat LaTeX-nospace-between-char-regexp ".?") 2)
+           ;; Cancel `forward-char' which is called just before
+           ;; `LaTeX-fill-move-to-break-point' if the char before point matches
+           ;; `LaTeX-nospace-between-char-regexp'.
+           (backward-char 1)
+         (when (re-search-backward
+                (concat " \\|\n\\|" LaTeX-nospace-between-char-regexp)
+                linebeg 'move)
+           (forward-char 1)))
+      (skip-chars-backward "^ \n"))
+    ;; Prevent infinite loops: If we cannot find a place to break
+    ;; while searching backward, search forward again.
+    (when (save-excursion
+           (skip-chars-backward " \t%")
+           (bolp))
+      (skip-chars-forward "^ \n" (point-max)))
+    ;; This code was copied from the function `fill-move-to-break-point'
+    ;; in `fill.el' (CVS Emacs, 2005-02-22) and adapted accordingly.
+    (when (and (< linebeg (point))
+              ;; If we are going to break the line after or
+              ;; before a non-ascii character, we may have to
+              ;; run a special function for the charset of the
+              ;; character to find the correct break point.
+              (boundp 'enable-multibyte-characters)
+              enable-multibyte-characters
+              (fboundp 'charset-after) ; Non-MULE XEmacsen don't have this.
+              (not (and (eq (charset-after (1- (point))) 'ascii)
+                        (eq (charset-after (point)) 'ascii))))
+      ;; Make sure we take SOMETHING after the fill prefix if any.
+      (if (fboundp 'fill-find-break-point)
+         (fill-find-break-point linebeg)
+       (when (fboundp 'kinsoku-process) ;XEmacs
+         (kinsoku-process)))))
+  ;; Prevent line break between 2-byte char and 1-byte char.
+  (when (and (featurep 'mule)
+            enable-multibyte-characters
+            (or (and (not (looking-at LaTeX-nospace-between-char-regexp))
+                     (TeX-looking-at-backward
+                      LaTeX-nospace-between-char-regexp 1))
+                (and (not (TeX-looking-at-backward
+                           LaTeX-nospace-between-char-regexp 1))
+                     (looking-at LaTeX-nospace-between-char-regexp)))
+            (re-search-backward
+             (concat LaTeX-nospace-between-char-regexp
+                     LaTeX-nospace-between-char-regexp
+                     LaTeX-nospace-between-char-regexp
+                     "\\|"
+                     ".\\ca\\s +\\ca") linebeg t))
+    (if (looking-at "..\\c>")
+       (forward-char 1)
+      (forward-char 2)))
+  ;; Cater for Japanese Macro
+  (when (and (boundp 'japanese-TeX-mode) japanese-TeX-mode
+            (aref (char-category-set (char-after)) ?j)
+            (TeX-looking-at-backward (concat (regexp-quote TeX-esc) TeX-token-char "*")
+                                     (1- (- (point) linebeg)))
+            (not (TeX-escaped-p (match-beginning 0))))
+      (goto-char (match-beginning 0)))
+  ;; Cater for \verb|...| (and similar) contructs which should not be
+  ;; broken. (FIXME: Make it work with shortvrb.sty (also loaded by
+  ;; doc.sty) where |...| is allowed.  Arbitrary delimiters may be
+  ;; chosen with \MakeShortVerb{<char>}.)  This could probably be
+  ;; handled with `fill-nobreak-predicate', but this is not available
+  ;; in XEmacs.
+  (let ((final-breakpoint (point))
+       (verb-macros (regexp-opt (append (LaTeX-verbatim-macros-with-delims)
+                                        (LaTeX-verbatim-macros-with-braces)))))
+    (save-excursion
+      ;; Look for the start of a verbatim macro in the current line.
+      (when (re-search-backward (concat (regexp-quote TeX-esc)
+                                       "\\(?:" verb-macros "\\)\\([^a-z@*]\\)")
+                               (line-beginning-position) t)
+       ;; Determine start and end of verbatim macro.
+       (let ((beg (point))
+             (end (if (not (string-match "[ [{]" (match-string 1)))
+                      (cdr (LaTeX-verbatim-macro-boundaries))
+                    (TeX-find-macro-end))))
+         ;; Determine if macro end is behind fill column.
+         (when (and end
+                    (> (- end (line-beginning-position))
+                       (current-fill-column))
+                    (> end final-breakpoint))
+           ;; Search backwards for place to break before the macro.
+           (goto-char beg)
+           (skip-chars-backward "^ \n")
+           ;; Determine if point ended up at the beginning of the line.
+           (when (save-excursion (skip-chars-backward " \t%") (bolp))
+             ;; Search forward for a place to break after the macro.
+             (goto-char end)
+             (skip-chars-forward "^ \n" (point-max)))
+           (setq final-breakpoint (point))))))
+    (goto-char final-breakpoint))
+  (when LaTeX-fill-break-at-separators
+    (let ((orig-breakpoint (point))
+         (final-breakpoint (point))
+         start-point
+         math-sep)
+      (save-excursion
+       (beginning-of-line)
+       (LaTeX-back-to-indentation)
+       (setq start-point (point))
+       ;; Find occurences of [, $, {, }, \(, \), \[, \] or $$.
+       (while (and (= final-breakpoint orig-breakpoint)
+                   (TeX-re-search-forward-unescaped
+                    (concat "[[{}]\\|\\$\\$?\\|"
+                            (regexp-quote TeX-esc) "[][()]")
+                    orig-breakpoint t))
+         (let ((match-string (match-string 0)))
+           (cond
+            ;; [ (opening bracket) (The closing bracket should
+            ;; already be handled implicitely by the code for the
+            ;; opening brace.)
+            ((save-excursion
+               (and (memq '\[ LaTeX-fill-break-at-separators)
+                    (string= match-string "[")
+                    (TeX-re-search-forward-unescaped (concat "\\][ \t]*{")
+                                                     (line-end-position) t)
+                    (> (- (or (TeX-find-closing-brace)
+                              (line-end-position))
+                          (line-beginning-position))
+                       fill-column)))
+             (save-excursion
+               (skip-chars-backward "^ \n")
+               (when (> (point) start-point)
+                 (setq final-breakpoint (point)))))
+            ;; { (opening brace)
+            ((save-excursion
+               (and (memq '\{ LaTeX-fill-break-at-separators)
+                    (string= match-string "{")
+                    (> (- (save-excursion
+                            ;; `TeX-find-closing-brace' is not enough
+                            ;; if there is no breakpoint in form of
+                            ;; whitespace after the brace.
+                            (goto-char (or (TeX-find-closing-brace)
+                                           (line-end-position)))
+                            (skip-chars-forward "^ \t\n")
+                            (point))
+                          (line-beginning-position))
+                       fill-column)))
+             (save-excursion
+               (skip-chars-backward "^ \n")
+               ;; The following is a primitive and error-prone method
+               ;; to cope with point probably being inside square
+               ;; brackets.  A better way would be to use functions
+               ;; to determine if point is inside an optional
+               ;; argument and to jump to the start and end brackets.
+               (when (save-excursion
+                       (TeX-re-search-forward-unescaped
+                        (concat "\\][ \t]*{") orig-breakpoint t))
+                 (TeX-search-backward-unescaped "["
+                                                (line-beginning-position) t)
+                 (skip-chars-backward "^ \n"))
+               (when (> (point) start-point)
+                 (setq final-breakpoint (point)))))
+            ;; } (closing brace)
+            ((save-excursion
+               (and (memq '\} LaTeX-fill-break-at-separators)
+                    (string= match-string "}")
+                    (save-excursion
+                      (backward-char 2)
+                      (not (TeX-find-opening-brace
+                            nil (line-beginning-position))))))
+             (save-excursion
+               (skip-chars-forward "^ \n")
+               (when (> (point) start-point)
+                 (setq final-breakpoint (point)))))
+            ;; $ or \( or \[ or $$ (opening math)
+            ((save-excursion
+               (and (or (and (memq '\\\( LaTeX-fill-break-at-separators)
+                             (or (and (string= match-string "$")
+                                      (texmathp))
+                                 (string= match-string "\\(")))
+                        (and (memq '\\\[ LaTeX-fill-break-at-separators)
+                             (or (string= match-string "\\[")
+                                 (and (string= match-string "$$")
+                                      (texmathp)))))
+                    (> (- (save-excursion
+                            (TeX-search-forward-unescaped
+                             (cond ((string= match-string "\\(")
+                                    (concat TeX-esc ")"))
+                                   ((string= match-string "$") "$")
+                                   ((string= match-string "$$") "$$")
+                                   (t (concat TeX-esc "]")))
+                             (point-max) t)
+                            (point))
+                          (line-beginning-position))
+                       fill-column)))
+             (save-excursion
+               (skip-chars-backward "^ \n")
+               (when (> (point) start-point)
+                 (setq final-breakpoint (point)))))
+            ;; $ or \) or \] or $$ (closing math)
+            ((save-excursion
+               (and (or (and (memq '\\\) LaTeX-fill-break-at-separators)
+                             (or (and (string= match-string "$")
+                                      (not (texmathp)))
+                                 (string= match-string "\\)")))
+                        (and (memq '\\\] LaTeX-fill-break-at-separators)
+                             (or (string= match-string "\\]")
+                                 (and (string= match-string "$$")
+                                      (not (texmathp))))))
+                    (if (member match-string '("$" "$$"))
+                        (save-excursion
+                          (skip-chars-backward "$")
+                          (not (TeX-search-backward-unescaped
+                                match-string (line-beginning-position) t)))
+                      (texmathp-match-switch (line-beginning-position)))))
+             (save-excursion
+               (skip-chars-forward "^ \n")
+               (when (> (point) start-point)
+                 (setq final-breakpoint (point)))))))))
+      (goto-char final-breakpoint))))
+
+;; The content of `LaTeX-fill-newline' was copied from the function
+;; `fill-newline' in `fill.el' (CVS Emacs, January 2004) and adapted
+;; to the needs of AUCTeX.
+(defun LaTeX-fill-newline ()
+  "Replace whitespace here with one newline and indent the line."
+  (skip-chars-backward " \t")
+  (newline 1)
+  ;; COMPATIBILITY for XEmacs
+  (unless (featurep 'xemacs)
+    ;; Give newline the properties of the space(s) it replaces
+    (set-text-properties (1- (point)) (point)
+                        (text-properties-at (point)))
+    (and (looking-at "\\( [ \t]*\\)\\(\\c|\\)?")
+        (or (aref (char-category-set (or (char-before (1- (point))) ?\000)) ?|)
+            (match-end 2))
+        ;; When refilling later on, this newline would normally not
+        ;; be replaced by a space, so we need to mark it specially to
+        ;; re-install the space when we unfill.
+        (put-text-property (1- (point)) (point) 'fill-space (match-string 1)))
+    ;; COMPATIBILITY for Emacs <= 21.3
+    (when (boundp 'fill-nobreak-invisible)
+      ;; If we don't want breaks in invisible text, don't insert
+      ;; an invisible newline.
+      (if fill-nobreak-invisible
+         (remove-text-properties (1- (point)) (point)
+                                 '(invisible t)))))
+  ;; Insert the fill prefix.
+  (and fill-prefix (not (equal fill-prefix ""))
+       ;; Markers that were after the whitespace are now at point: insert
+       ;; before them so they don't get stuck before the prefix.
+       (insert-before-markers-and-inherit fill-prefix))
+  (indent-according-to-mode)
+  (run-hooks 'LaTeX-fill-newline-hook))
+
+(defun LaTeX-fill-paragraph (&optional justify)
+  "Like `fill-paragraph', but handle LaTeX comments.
+If any of the current line is a comment, fill the comment or the
+paragraph of it that point is in.  Code comments, i.e. comments
+with uncommented code preceding them in the same line, will not
+be filled unless the cursor is placed on the line with the
+code comment.
+
+If LaTeX syntax is taken into consideration during filling
+depends on the value of `LaTeX-syntactic-comments'."
+  (interactive "P")
+  (if (save-excursion
+       (beginning-of-line)
+       (looking-at (concat TeX-comment-start-regexp "*[ \t]*$")))
+      ;; Don't do anything if we look at an empty line and let
+      ;; `fill-paragraph' think we successfully filled the paragraph.
+      t
+    (let (;; Non-nil if the current line contains a comment.
+         has-comment
+         ;; Non-nil if the current line contains code and a comment.
+         has-code-and-comment
+         code-comment-start
+         ;; If has-comment, the appropriate fill-prefix for the comment.
+         comment-fill-prefix)
+
+      ;; Figure out what kind of comment we are looking at.
+      (cond
+       ;; A line only with potential whitespace followed by a
+       ;; comment on it?
+       ((save-excursion
+         (beginning-of-line)
+         (looking-at (concat "^[ \t]*" TeX-comment-start-regexp
+                             "\\(" TeX-comment-start-regexp "\\|[ \t]\\)*")))
+       (setq has-comment t
+             comment-fill-prefix (TeX-match-buffer 0)))
+       ;; A line with some code, followed by a comment?
+       ((and (setq code-comment-start (save-excursion
+                                       (beginning-of-line)
+                                       (TeX-search-forward-comment-start
+                                        (line-end-position))))
+            (> (point) code-comment-start)
+            (not (TeX-in-commented-line))
+            (save-excursion
+              (goto-char code-comment-start)
+              ;; See if there is at least one non-whitespace character
+              ;; before the comment starts.
+              (re-search-backward "[^ \t\n]" (line-beginning-position) t)))
+       (setq has-comment t
+             has-code-and-comment t)))
+
+      (cond
+       ;; Code comments.
+       (has-code-and-comment
+       (save-excursion
+         (when (>= (- code-comment-start (line-beginning-position))
+                   fill-column)
+           ;; If start of code comment is beyond fill column, fill it as a
+           ;; regular paragraph before it is filled as a code comment.
+           (let ((end-marker (save-excursion (end-of-line) (point-marker))))
+             (LaTeX-fill-region-as-paragraph (line-beginning-position)
+                                             (line-beginning-position 2)
+                                             justify)
+             (goto-char end-marker)
+             (beginning-of-line)))
+         (LaTeX-fill-code-comment justify)))
+       ;; Syntax-aware filling:
+       ;; * `LaTeX-syntactic-comments' enabled: Everything.
+       ;; * `LaTeX-syntactic-comments' disabled: Uncommented code and
+       ;;   line comments in `doctex-mode'.
+       ((or (or LaTeX-syntactic-comments
+               (and (not LaTeX-syntactic-comments)
+                    (not has-comment)))
+           (and (eq major-mode 'doctex-mode)
+                (TeX-in-line-comment)))
+       (let ((fill-prefix comment-fill-prefix))
+         (save-excursion
+           (let* ((end (progn (LaTeX-forward-paragraph)
+                              (or (bolp) (newline 1))
+                              (and (eobp) (not (bolp)) (open-line 1))
+                              (point)))
+                  (start
+                   (progn
+                     (LaTeX-backward-paragraph)
+                     (while (and (looking-at
+                                  (concat "$\\|[ \t]+$\\|"
+                                          "[ \t]*" TeX-comment-start-regexp
+                                          "+[ \t]*$"))
+                                 (< (point) end))
+                       (forward-line))
+                     (point))))
+             (LaTeX-fill-region-as-paragraph start end justify)))))
+       ;; Non-syntax-aware filling.
+       (t
+       (save-excursion
+         (save-restriction
+           (beginning-of-line)
+           (narrow-to-region
+            ;; Find the first line we should include in the region to fill.
+            (save-excursion
+              (while (and (zerop (forward-line -1))
+                          (looking-at (concat "^[ \t]*"
+                                              TeX-comment-start-regexp))))
+              ;; We may have gone too far.  Go forward again.
+              (or (looking-at (concat ".*" TeX-comment-start-regexp))
+                  (forward-line 1))
+              (point))
+            ;; Find the beginning of the first line past the region to fill.
+            (save-excursion
+              (while (progn (forward-line 1)
+                            (looking-at (concat "^[ \t]*"
+                                                TeX-comment-start-regexp))))
+              (point)))
+           ;; The definitions of `paragraph-start' and
+           ;; `paragraph-separate' will still make
+           ;; `forward-paragraph' and `backward-paragraph' stop at
+           ;; the respective (La)TeX commands.  If these should be
+           ;; disregarded, the definitions would have to be changed
+           ;; accordingly.  (Lines with only `%' characters on them
+           ;; can be paragraph boundaries.)
+           (let* ((paragraph-start
+                   (concat paragraph-start "\\|"
+                           "\\(" TeX-comment-start-regexp "\\|[ \t]\\)*$"))
+                  (paragraph-separate
+                   (concat paragraph-separate "\\|"
+                           "\\(" TeX-comment-start-regexp "\\|[ \t]\\)*$"))
+                  (fill-prefix comment-fill-prefix)
+                  (end (progn (forward-paragraph)
+                              (or (bolp) (newline 1))
+                              (point)))
+                  (beg (progn (backward-paragraph)
+                              (point))))
+             (fill-region-as-paragraph
+              beg end
+              justify nil
+              (save-excursion
+                (goto-char beg)
+                (if (looking-at fill-prefix)
+                    nil
+                  (re-search-forward comment-start-skip nil t)
+                  (point)))))))))
+      t)))
+
+(defun LaTeX-fill-code-comment (&optional justify-flag)
+  "Fill a line including code followed by a comment."
+  (let ((beg (line-beginning-position))
+       fill-prefix code-comment-start)
+    (indent-according-to-mode)
+    (when (when (setq code-comment-start (save-excursion
+                                          (goto-char beg)
+                                          (TeX-search-forward-comment-start
+                                           (line-end-position))))
+           (goto-char code-comment-start)
+           (while (not (looking-at TeX-comment-start-regexp)) (forward-char))
+           ;; See if there is at least one non-whitespace character
+           ;; before the comment starts.
+           (save-excursion
+             (re-search-backward "[^ \t\n]" (line-beginning-position) t)))
+      (setq fill-prefix
+           (concat
+            (if indent-tabs-mode
+                (concat (make-string (/ (current-column) tab-width) ?\t)
+                        (make-string (% (current-column) tab-width) ?\ ))
+              (make-string (current-column) ?\ ))
+            (progn
+              (looking-at (concat TeX-comment-start-regexp "+[ \t]*"))
+              (TeX-match-buffer 0))))
+      (fill-region-as-paragraph beg (line-beginning-position 2)
+                               justify-flag  nil
+                               (save-excursion
+                                 (goto-char beg)
+                                 (if (looking-at fill-prefix)
+                                     nil
+                                   (re-search-forward comment-start-skip nil t)
+                                   (point)))))))
+
+(defun LaTeX-fill-region (from to &optional justify what)
+  "Fill and indent the text in region from FROM to TO as LaTeX text.
+Prefix arg (non-nil third arg JUSTIFY, if called from program)
+means justify as well.  Fourth arg WHAT is a word to be displayed when
+formatting."
+  (interactive "*r\nP")
+  (save-excursion
+    (let ((to (set-marker (make-marker) to))
+         (next-par (make-marker)))
+      (goto-char from)
+      (beginning-of-line)
+      (setq from (point))
+      (catch 'end-of-buffer
+       (while (and (< (point) to))
+         (message "Formatting%s ... %d%%"
+                  (or what "")
+                  (/ (* 100 (- (point) from)) (- to from)))
+         (save-excursion (LaTeX-fill-paragraph justify))
+         (if (marker-position next-par)
+             (goto-char (marker-position next-par))
+           (LaTeX-forward-paragraph))
+         (when (eobp) (throw 'end-of-buffer t))
+         (LaTeX-forward-paragraph)
+         (set-marker next-par (point))
+         (LaTeX-backward-paragraph)
+         (while (and (not (eobp))
+                     (looking-at
+                      (concat "^\\($\\|[ \t]+$\\|[ \t]*"
+                              TeX-comment-start-regexp "+[ \t]*$\\)")))
+           (forward-line 1))))
+      (set-marker to nil)))
+  (message "Finished"))
+
+(defun LaTeX-find-matching-end ()
+  "Move point to the \\end of the current environment.
+
+If function is called inside a comment and
+`LaTeX-syntactic-comments' is enabled, try to find the
+environment in commented regions with the same comment prefix."
+  (interactive)
+  (let* ((regexp (concat (regexp-quote TeX-esc) "\\(begin\\|end\\)\\b"))
+        (level 1)
+        (in-comment (TeX-in-commented-line))
+        (comment-prefix (and in-comment (TeX-comment-prefix))))
+    (save-excursion
+      (skip-chars-backward "a-zA-Z \t{")
+      (unless (bolp)
+       (backward-char 1)
+       (and (looking-at regexp)
+            (char-equal (char-after (1+ (match-beginning 0))) ?e)
+            (setq level 0))))
+    (while (and (> level 0) (re-search-forward regexp nil t))
+      (when (or (and LaTeX-syntactic-comments
+                    (eq in-comment (TeX-in-commented-line))
+                    ;; If we are in a commented line, check if the
+                    ;; prefix matches the one we started out with.
+                    (or (not in-comment)
+                        (string= comment-prefix (TeX-comment-prefix))))
+               (and (not LaTeX-syntactic-comments)
+                    (not (TeX-in-commented-line))))
+       (if (= (char-after (1+ (match-beginning 0))) ?b) ;;begin
+           (setq level (1+ level))
+         (setq level (1- level)))))
+    (if (= level 0)
+       (search-forward "}")
+      (error "Can't locate end of current environment"))))
+
+(defun LaTeX-find-matching-begin ()
+  "Move point to the \\begin of the current environment.
+
+If function is called inside a comment and
+`LaTeX-syntactic-comments' is enabled, try to find the
+environment in commented regions with the same comment prefix."
+  (interactive)
+  (let* ((regexp (concat (regexp-quote TeX-esc) "\\(begin\\|end\\)\\b"))
+        (level 1)
+        (in-comment (TeX-in-commented-line))
+        (comment-prefix (and in-comment (TeX-comment-prefix))))
+    (skip-chars-backward "a-zA-Z \t{")
+    (unless (bolp)
+      (backward-char 1)
+      (and (looking-at regexp)
+          (char-equal (char-after (1+ (match-beginning 0))) ?b)
+          (setq level 0)))
+    (while (and (> level 0) (re-search-backward regexp nil t))
+      (when (or (and LaTeX-syntactic-comments
+                    (eq in-comment (TeX-in-commented-line))
+                    ;; If we are in a commented line, check if the
+                    ;; prefix matches the one we started out with.
+                    (or (not in-comment)
+                        (string= comment-prefix (TeX-comment-prefix))))
+               (and (not LaTeX-syntactic-comments)
+                    (not (TeX-in-commented-line))))
+       (if (= (char-after (1+ (match-beginning 0))) ?e) ;;end
+           (setq level (1+ level))
+         (setq level (1- level)))))
+    (or (= level 0)
+       (error "Can't locate beginning of current environment"))))
+
+(defun LaTeX-mark-environment (&optional count)
+  "Set mark to end of current environment and point to the matching begin.
+If prefix argument COUNT is given, mark the respective number of
+enclosing environments.  The command will not work properly if
+there are unbalanced begin-end pairs in comments and verbatim
+environments."
+  (interactive "p")
+  (setq count (if count (abs count) 1))
+  (let ((cur (point)) beg end)
+    ;; Only change point and mark after beginning and end were found.
+    ;; Point should not end up in the middle of nowhere if the search fails.
+    (save-excursion
+      (dotimes (c count) (LaTeX-find-matching-end))
+      (setq end (line-beginning-position 2))
+      (goto-char cur)
+      (dotimes (c count) (LaTeX-find-matching-begin))
+      (setq beg (point)))
+    (set-mark end)
+    (goto-char beg)
+    (TeX-activate-region)))
+
+(defun LaTeX-fill-environment (justify)
+  "Fill and indent current environment as LaTeX text."
+  (interactive "*P")
+  (save-excursion
+    (LaTeX-mark-environment)
+    (re-search-forward "{\\([^}]+\\)}")
+    (LaTeX-fill-region (region-beginning) (region-end) justify
+                      (concat " environment " (TeX-match-buffer 1)))))
+
+(defun LaTeX-fill-section (justify)
+  "Fill and indent current logical section as LaTeX text."
+  (interactive "*P")
+  (save-excursion
+    (LaTeX-mark-section)
+    (re-search-forward "{\\([^}]+\\)}")
+    (LaTeX-fill-region (region-beginning) (region-end) justify
+                      (concat " section " (TeX-match-buffer 1)))))
+
+(defun LaTeX-mark-section (&optional no-subsections)
+  "Set mark at end of current logical section, and point at top.
+If optional argument NO-SUBSECTIONS is non-nil, mark only the
+region from the current section start to the next sectioning
+command.  Thereby subsections are not being marked.
+
+If the function `outline-mark-subtree' is not available,
+`LaTeX-mark-section' always behaves like this regardless of the
+value of NO-SUBSECTIONS."
+  (interactive "P")
+  (if (or no-subsections
+         (not (fboundp 'outline-mark-subtree)))
+      (progn
+       (re-search-forward (concat  "\\(" (LaTeX-outline-regexp)
+                                   "\\|\\'\\)"))
+       (beginning-of-line)
+       (push-mark (point) nil t)
+       (re-search-backward (concat "\\(" (LaTeX-outline-regexp)
+                                   "\\|\\`\\)")))
+    (outline-mark-subtree)
+    (when (and (boundp 'transient-mark-mode)
+              transient-mark-mode
+              (boundp 'mark-active)
+              (not mark-active))
+      (setq mark-active t)
+      (run-hooks 'activate-mark-hook)))
+  (TeX-activate-region))
+
+(defun LaTeX-fill-buffer (justify)
+  "Fill and indent current buffer as LaTeX text."
+  (interactive "*P")
+  (save-excursion
+    (LaTeX-fill-region
+     (point-min)
+     (point-max)
+     justify
+     (concat " buffer " (buffer-name)))))
+
+
+;;; Navigation
+
+(defvar LaTeX-paragraph-commands-internal
+  '("[" "]" ; display math
+    "appendix" "begin" "caption" "chapter" "end" "include" "includeonly"
+    "label" "maketitle" "noindent" "par" "paragraph" "part" "section"
+    "subsection" "subsubsection" "tableofcontents")
+  "Internal list of LaTeX macros that should have their own line.")
+
+(defun LaTeX-paragraph-commands-regexp-make ()
+  "Return a regular expression matching defined paragraph commands."
+  (concat (regexp-quote TeX-esc) "\\("
+         (regexp-opt (append LaTeX-paragraph-commands
+                             LaTeX-paragraph-commands-internal)) "\\)"))
+
+(defcustom LaTeX-paragraph-commands nil
+  "List of LaTeX macros that should have their own line.
+The list should contain macro names without the leading backslash."
+  :group 'LaTeX-macro
+  :type '(repeat (string))
+  :set (lambda (symbol value)
+         (set-default symbol value)
+        (setq LaTeX-paragraph-commands-regexp
+              (LaTeX-paragraph-commands-regexp-make))))
+
+(defvar LaTeX-paragraph-commands-regexp (LaTeX-paragraph-commands-regexp-make)
+    "Regular expression matching LaTeX macros that should have their own line.")
+
+(defun LaTeX-set-paragraph-start ()
+  "Set `paragraph-start'."
+  (setq paragraph-start
+       (concat
+        "[ \t]*%*[ \t]*\\("
+        LaTeX-paragraph-commands-regexp "\\|"
+        (regexp-quote TeX-esc) "\\(" LaTeX-item-regexp "\\)\\|"
+        "\\$\\$\\|" ; Plain TeX display math (Some people actually
+                    ; use this with LaTeX.  Yuck.)
+        "$\\)")))
+
+(defun LaTeX-paragraph-commands-add-locally (commands)
+  "Make COMMANDS be recognized as paragraph commands.
+COMMANDS can be a single string or a list of strings which will
+be added to `LaTeX-paragraph-commands-internal'.  Additionally
+`LaTeX-paragraph-commands-regexp' will be updated and both
+variables will be made buffer-local.  This is mainly a
+convenience function which can be used in style files."
+  (make-local-variable 'LaTeX-paragraph-commands-internal)
+  (make-local-variable 'LaTeX-paragraph-commands-regexp)
+  (unless (listp commands) (setq commands (list commands)))
+  (dolist (elt commands)
+    (add-to-list 'LaTeX-paragraph-commands-internal elt))
+  (setq LaTeX-paragraph-commands-regexp (LaTeX-paragraph-commands-regexp-make))
+  (LaTeX-set-paragraph-start))
+
+(defun LaTeX-forward-paragraph (&optional count)
+  "Move forward to end of paragraph.
+If COUNT is non-nil, do it COUNT times."
+  (or count (setq count 1))
+  (dotimes (i count)
+    (let* ((macro-start (TeX-find-macro-start))
+          (paragraph-command-start
+           (cond
+            ;; Point is inside of a paragraph command.
+            ((and macro-start
+                  (save-excursion
+                    (goto-char macro-start)
+                    (looking-at LaTeX-paragraph-commands-regexp)))
+             (match-beginning 0))
+            ;; Point is before a paragraph command in the same line.
+            ((looking-at
+              (concat "[ \t]*\\(?:" TeX-comment-start-regexp
+                      "\\(?:" TeX-comment-start-regexp "\\|[ \t]\\)*\\)?"
+                      "\\(" LaTeX-paragraph-commands-regexp "\\)"))
+             (match-beginning 1))))
+          macro-end)
+      ;; If a paragraph command is encountered there are two cases to be
+      ;; distinguished:
+      ;; 1) If the end of the paragraph command coincides (apart from
+      ;;    potential whitespace) with the end of the line, is only
+      ;;    followed by a comment or is directly followed by a macro,
+      ;;    it is assumed that it should be handled separately.
+      ;; 2) If the end of the paragraph command is followed by other
+      ;;    code, it is assumed that it should be included with the rest
+      ;;    of the paragraph.
+      (if (and paragraph-command-start
+              (save-excursion
+                (goto-char paragraph-command-start)
+                (setq macro-end (goto-char (TeX-find-macro-end)))
+                (looking-at (concat (regexp-quote TeX-esc) "[@A-Za-z]+\\|"
+                                    "[ \t]*\\($\\|"
+                                    TeX-comment-start-regexp "\\)"))))
+         (progn
+           (goto-char macro-end)
+           ;; If the paragraph command is followed directly by
+           ;; another macro, regard the latter as part of the
+           ;; paragraph command's paragraph.
+           (when (looking-at (concat (regexp-quote TeX-esc) "[@A-Za-z]+"))
+             (goto-char (TeX-find-macro-end)))
+           (forward-line))
+       (let (limit)
+         (goto-char (min (save-excursion
+                           (forward-paragraph)
+                           (setq limit (point)))
+                         (save-excursion
+                           (TeX-forward-comment-skip 1 limit)
+                           (point)))))))))
+
+(defun LaTeX-backward-paragraph (&optional count)
+  "Move backward to beginning of paragraph.
+If COUNT is non-nil, do it COUNT times."
+  (or count (setq count 1))
+  (dotimes (i count)
+    (let* ((macro-start (TeX-find-macro-start)))
+      (if (and macro-start
+              ;; Point really has to be inside of the macro, not before it.
+              (not (= macro-start (point)))
+              (save-excursion
+                (goto-char macro-start)
+                (looking-at LaTeX-paragraph-commands-regexp)))
+         ;; Point is inside of a paragraph command.
+         (progn
+           (goto-char macro-start)
+           (beginning-of-line))
+       (let (limit
+             (start (line-beginning-position)))
+         (goto-char
+          (max (save-excursion
+                 (backward-paragraph)
+                 (setq limit (point)))
+               ;; Search for possible transitions from commented to
+               ;; uncommented regions and vice versa.
+               (save-excursion
+                 (TeX-backward-comment-skip 1 limit)
+                 (point))
+               ;; Search for paragraph commands.
+               (save-excursion
+                 (let ((end-point 0) macro-bol)
+                   (when (setq macro-bol
+                               (re-search-backward
+                                (format "^[ \t]*%s*[ \t]*\\(%s\\)"
+                                        TeX-comment-start-regexp
+                                        LaTeX-paragraph-commands-regexp)
+                                limit t))
+                     (if (and (string= (match-string 1) "\\begin")
+                              (progn
+                                (goto-char (match-end 1))
+                                (skip-chars-forward "{ \t")
+                                (member (buffer-substring-no-properties
+                                         (point) (progn (skip-chars-forward
+                                                         "A-Za-z*") (point)))
+                                        LaTeX-verbatim-environments)))
+                         ;; If inside a verbatim environment, just
+                         ;; use the next line.  In such environments
+                         ;; `TeX-find-macro-end' could otherwise
+                         ;; think brackets or braces belong to the
+                         ;; \begin macro.
+                         (setq end-point (line-beginning-position 2))
+                       ;; Jump to the macro end otherwise.
+                       (goto-char (match-beginning 1))
+                       (goto-char (TeX-find-macro-end))
+                       ;; For an explanation of this distinction see
+                       ;; `LaTeX-forward-paragraph'.
+                       (if (looking-at (concat (regexp-quote TeX-esc)
+                                               "[@A-Za-z]+\\|[ \t]*\\($\\|"
+                                               TeX-comment-start-regexp "\\)"))
+                           (progn
+                             (when (string= (buffer-substring-no-properties
+                                             (point) (+ (point)
+                                                        (length TeX-esc)))
+                                            TeX-esc)
+                               (goto-char (TeX-find-macro-end)))
+                             (forward-line 1)
+                             (when (< (point) start)
+                               (setq end-point (point))))
+                         (setq end-point macro-bol))))
+                   end-point)))))))))
+
+(defun LaTeX-search-forward-comment-start (&optional limit)
+  "Search forward for a comment start from current position till LIMIT.
+If LIMIT is omitted, search till the end of the buffer.
+
+This function makes sure that any comment starters found inside
+of verbatim constructs are not considered."
+  (setq limit (or limit (point-max)))
+  (save-excursion
+    (let (start)
+      (catch 'found
+       (while (progn
+                (when (and (TeX-re-search-forward-unescaped
+                            TeX-comment-start-regexp limit 'move)
+                           (not (LaTeX-verbatim-p)))
+                  (setq start (match-beginning 0))
+                  (throw 'found t))
+                (< (point) limit))))
+      start)))
+
+
+;;; Math Minor Mode
+
+(defgroup LaTeX-math nil
+  "Mathematics in AUCTeX."
+  :group 'LaTeX-macro)
+
+(defcustom LaTeX-math-list nil
+  "Alist of your personal LaTeX math symbols.
+
+Each entry should be a list with up to four elements, KEY, VALUE,
+MENU and CHARACTER.
+
+KEY is the key (after `LaTeX-math-abbrev-prefix') to be redefined
+in math minor mode.  If KEY is nil, the symbol has no associated
+keystroke \(it is available in the menu, though\).
+
+VALUE can be a string with the name of the macro to be inserted,
+or a function to be called.  The macro must be given without the
+leading backslash.
+
+The third element MENU is the name of the submenu where the
+command should be added.  MENU can be either a string
+\(e.g. \"greek\"\), a list (e.g. \(\"AMS\" \"Delimiters\"\)\) or
+nil.  If MENU is nil, no menu item will be created.
+
+The fourth element CHARACTER is a Unicode character position for
+menu display.  When nil, no character is shown.
+
+See also `LaTeX-math-menu'."
+  :group 'LaTeX-math
+  :type '(repeat (group (choice :tag "Key"
+                               (const :tag "none" nil)
+                               (choice (character)
+                                       (string :tag "Key sequence")))
+                       (choice :tag "Value"
+                               (string :tag "Macro")
+                               (function))
+                       (choice :tag "Menu"
+                               (string :tag "Top level menu" )
+                               (repeat :tag "Submenu"
+                                       (string :tag "Menu")))
+                       (choice :tag "Unicode character"
+                               (const :tag "none" nil)
+                               (integer :tag "Number")))))
+
+(defconst LaTeX-math-default
+  '((?a "alpha" "Greek Lowercase" 945) ;; #X03B1
+    (?b "beta" "Greek Lowercase" 946) ;; #X03B2
+    (?g "gamma" "Greek Lowercase" 947) ;; #X03B3
+    (?d "delta" "Greek Lowercase" 948) ;; #X03B4
+    (?e "epsilon" "Greek Lowercase" 1013) ;; #X03F5
+    (?z "zeta" "Greek Lowercase" 950) ;; #X03B6
+    (?h "eta" "Greek Lowercase" 951) ;; #X03B7
+    (?j "theta" "Greek Lowercase" 952) ;; #X03B8
+    (nil "iota" "Greek Lowercase" 953) ;; #X03B9
+    (?k "kappa" "Greek Lowercase" 954) ;; #X03BA
+    (?l "lambda" "Greek Lowercase" 955) ;; #X03BB
+    (?m "mu" "Greek Lowercase" 956) ;; #X03BC
+    (?n "nu" "Greek Lowercase" 957) ;; #X03BD
+    (?x "xi" "Greek Lowercase" 958) ;; #X03BE
+    (?p "pi" "Greek Lowercase" 960) ;; #X03C0
+    (?r "rho" "Greek Lowercase" 961) ;; #X03C1
+    (?s "sigma" "Greek Lowercase" 963) ;; #X03C3
+    (?t "tau" "Greek Lowercase" 964) ;; #X03C4
+    (?u "upsilon" "Greek Lowercase" 965) ;; #X03C5
+    (?f "phi" "Greek Lowercase" 981) ;; #X03D5
+    (?q "chi" "Greek Lowercase" 967) ;; #X03C7
+    (?y "psi" "Greek Lowercase" 968) ;; #X03C8
+    (?w "omega" "Greek Lowercase" 969) ;; #X03C9
+    ("v e" "varepsilon" "Greek Lowercase" 949) ;; #X03B5
+    ("v j" "vartheta" "Greek Lowercase" 977) ;; #X03D1
+    ("v p" "varpi" "Greek Lowercase" 982) ;; #X03D6
+    ("v r" "varrho" "Greek Lowercase" 1009) ;; #X03F1
+    ("v s" "varsigma" "Greek Lowercase" 962) ;; #X03C2
+    ("v f" "varphi" "Greek Lowercase" 966) ;; #X03C6
+    (?G "Gamma" "Greek Uppercase" 915) ;; #X0393
+    (?D "Delta" "Greek Uppercase" 916) ;; #X0394
+    (?J "Theta" "Greek Uppercase" 920) ;; #X0398
+    (?L "Lambda" "Greek Uppercase" 923) ;; #X039B
+    (?X "Xi" "Greek Uppercase" 926) ;; #X039E
+    (?P "Pi" "Greek Uppercase" 928) ;; #X03A0
+    (?S "Sigma" "Greek Uppercase" 931) ;; #X03A3
+    (?U "Upsilon" "Greek Uppercase" 978) ;; #X03D2
+    (?F "Phi" "Greek Uppercase" 934) ;; #X03A6
+    (?Y "Psi" "Greek Uppercase" 936) ;; #X03A8
+    (?W "Omega" "Greek Uppercase" 937) ;; #X03A9
+    (?c LaTeX-math-cal "Cal-whatever")
+    (nil "pm" "Binary Op" 177) ;; #X00B1
+    (nil "mp" "Binary Op" 8723) ;; #X2213
+    (?* "times" "Binary Op" 215) ;; #X00D7
+    (nil "div" "Binary Op" 247) ;; #X00F7
+    (nil "ast" "Binary Op" 8727) ;; #X2217
+    (nil "star" "Binary Op" 8902) ;; #X22C6
+    (nil "circ" "Binary Op" 8728) ;; #X2218
+    (nil "bullet" "Binary Op" 8729) ;; #X2219
+    (?. "cdot" "Binary Op" 8901) ;; #X22C5
+    (?- "cap" "Binary Op" 8745) ;; #X2229
+    (?+ "cup" "Binary Op" 8746) ;; #X222A
+    (nil "uplus" "Binary Op" 8846) ;; #X228E
+    (nil "sqcap" "Binary Op" 8851) ;; #X2293
+    (?| "vee" "Binary Op" 8744) ;; #X2228
+    (?& "wedge" "Binary Op" 8743) ;; #X2227
+    (?\\ "setminus" "Binary Op" 8726) ;; #X2216
+    (nil "wr" "Binary Op" 8768) ;; #X2240
+    (nil "diamond" "Binary Op" 8900) ;; #X22C4
+    (nil "bigtriangleup" "Binary Op" 9651) ;; #X25B3
+    (nil "bigtriangledown" "Binary Op" 9661) ;; #X25BD
+    (nil "triangleleft" "Binary Op" 9665) ;; #X25C1
+    (nil "triangleright" "Binary Op" 9655) ;; #X25B7
+    (nil "lhd" "Binary Op")
+    (nil "rhd" "Binary Op")
+    (nil "unlhd" "Binary Op")
+    (nil "unrhd" "Binary Op")
+    (nil "oplus" "Binary Op" 8853) ;; #X2295
+    (nil "ominus" "Binary Op" 8854) ;; #X2296
+    (nil "otimes" "Binary Op" 8855) ;; #X2297
+    (nil "oslash" "Binary Op" 8709) ;; #X2205
+    (nil "odot" "Binary Op" 8857) ;; #X2299
+    (nil "bigcirc" "Binary Op" 9675) ;; #X25CB
+    (nil "dagger" "Binary Op" 8224) ;; #X2020
+    (nil "ddagger" "Binary Op" 8225) ;; #X2021
+    (nil "amalg" "Binary Op" 10815) ;; #X2A3F
+    (?< "leq" "Relational" 8804) ;; #X2264
+    (?> "geq" "Relational" 8805) ;; #X2265
+    (nil "qed" "Relational" 8718) ;; #X220E
+    (nil "equiv" "Relational" 8801) ;; #X2261
+    (nil "models" "Relational" 8871) ;; #X22A7
+    (nil "prec" "Relational" 8826) ;; #X227A
+    (nil "succ" "Relational" 8827) ;; #X227B
+    (nil "sim" "Relational" 8764) ;; #X223C
+    (nil "perp" "Relational" 10178) ;; #X27C2
+    (nil "preceq" "Relational" 10927) ;; #X2AAF
+    (nil "succeq" "Relational" 10928) ;; #X2AB0
+    (nil "simeq" "Relational" 8771) ;; #X2243
+    (nil "mid" "Relational" 8739) ;; #X2223
+    (nil "ll" "Relational" 8810) ;; #X226A
+    (nil "gg" "Relational" 8811) ;; #X226B
+    (nil "asymp" "Relational" 8781) ;; #X224D
+    (nil "parallel" "Relational" 8741) ;; #X2225
+    (?\{ "subset" "Relational" 8834) ;; #X2282
+    (?\} "supset" "Relational" 8835) ;; #X2283
+    (nil "approx" "Relational" 8776) ;; #X2248
+    (nil "bowtie" "Relational" 8904) ;; #X22C8
+    (?\[ "subseteq" "Relational" 8838) ;; #X2286
+    (?\] "supseteq" "Relational" 8839) ;; #X2287
+    (nil "cong" "Relational" 8773) ;; #X2245
+    (nil "Join" "Relational" 10781) ;; #X2A1D
+    (nil "sqsubset" "Relational" 8847) ;; #X228F
+    (nil "sqsupset" "Relational" 8848) ;; #X2290
+    (nil "neq" "Relational" 8800) ;; #X2260
+    (nil "smile" "Relational" 8995) ;; #X2323
+    (nil "sqsubseteq" "Relational" 8849) ;; #X2291
+    (nil "sqsupseteq" "Relational" 8850) ;; #X2292
+    (nil "doteq" "Relational" 8784) ;; #X2250
+    (nil "frown" "Relational" 8994) ;; #X2322
+    (?i "in" "Relational" 8712) ;; #X2208
+    (nil "ni" "Relational" 8715) ;; #X220B
+    (nil "propto" "Relational" 8733) ;; #X221D
+    (nil "vdash" "Relational" 8866) ;; #X22A2
+    (nil "dashv" "Relational" 8867) ;; #X22A3
+    (?\C-b "leftarrow" "Arrows" 8592) ;; #X2190
+    (nil "Leftarrow" "Arrows" 8656) ;; #X21D0
+    (?\C-f "rightarrow" "Arrows" 8594) ;; #X2192
+    (nil "Rightarrow" "Arrows" 8658) ;; #X21D2
+    (nil "leftrightarrow" "Arrows" 8596) ;; #X2194
+    (nil "Leftrightarrow" "Arrows" 8660) ;; #X21D4
+    (nil "mapsto" "Arrows" 8614) ;; #X21A6
+    (nil "hookleftarrow" "Arrows" 8617) ;; #X21A9
+    (nil "leftharpoonup" "Arrows" 8636) ;; #X21BC
+    (nil "leftharpoondown" "Arrows" 8637) ;; #X21BD
+    (nil "longleftarrow" "Arrows" 10229) ;; #X27F5
+    (nil "Longleftarrow" "Arrows" 10232) ;; #X27F8
+    (nil "longrightarrow" "Arrows" 10230) ;; #X27F6
+    (nil "Longrightarrow" "Arrows" 10233) ;; #X27F9
+    (nil "longleftrightarrow" "Arrows" 10231) ;; #X27F7
+    (nil "Longleftrightarrow" "Arrows" 10234) ;; #X27FA
+    (nil "longmapsto" "Arrows" 10236) ;; #X27FC
+    (nil "hookrightarrow" "Arrows" 8618) ;; #X21AA
+    (nil "rightharpoonup" "Arrows" 8640) ;; #X21C0
+    (nil "rightharpoondown" "Arrows" 8641) ;; #X21C1
+    (?\C-p "uparrow" "Arrows" 8593) ;; #X2191
+    (nil "Uparrow" "Arrows" 8657) ;; #X21D1
+    (?\C-n "downarrow" "Arrows" 8595) ;; #X2193
+    (nil "Downarrow" "Arrows" 8659) ;; #X21D3
+    (nil "updownarrow" "Arrows" 8597) ;; #X2195
+    (nil "Updownarrow" "Arrows" 8661) ;; #X21D5
+    (nil "nearrow" "Arrows" 8599) ;; #X2197
+    (nil "searrow" "Arrows" 8600) ;; #X2198
+    (nil "swarrow" "Arrows" 8601) ;; #X2199
+    (nil "nwarrow" "Arrows" 8598) ;; #X2196
+    (nil "ldots" "Punctuation" 8230) ;; #X2026
+    (nil "cdots" "Punctuation" 8943) ;; #X22EF
+    (nil "vdots" "Punctuation" 8942) ;; #X22EE
+    (nil "ddots" "Punctuation" 8945) ;; #X22F1
+    (?: "colon" "Punctuation" 58) ;; #X003A
+    (?N "nabla" "Misc Symbol" 8711) ;; #X2207
+    (nil "aleph" "Misc Symbol" 8501) ;; #X2135
+    (nil "prime" "Misc Symbol" 8242) ;; #X2032
+    (?A "forall" "Misc Symbol" 8704) ;; #X2200
+    (?I "infty" "Misc Symbol" 8734) ;; #X221E
+    (nil "hbar" "Misc Symbol" 8463) ;; #X210F
+    (?0 "emptyset" "Misc Symbol" 8709) ;; #X2205
+    (?E "exists" "Misc Symbol" 8707) ;; #X2203
+    (nil "surd" "Misc Symbol" 8730) ;; #X221A
+    (nil "Box" "Misc Symbol")
+    (nil "triangle" "Misc Symbol" 9651) ;; #X25B3
+    (nil "Diamond" "Misc Symbol")
+    (nil "imath" "Misc Symbol" 305) ;; #X0131
+    (nil "jmath" "Misc Symbol" 120485) ;; #X1D6A5
+    (nil "ell" "Misc Symbol" 8467) ;; #X2113
+    (nil "neg" "Misc Symbol" 172) ;; #X00AC
+    (?/ "not" "Misc Symbol" 824) ;; #X0338
+    (nil "top" "Misc Symbol" 8868) ;; #X22A4
+    (nil "flat" "Misc Symbol" 9837) ;; #X266D
+    (nil "natural" "Misc Symbol" 9838) ;; #X266E
+    (nil "sharp" "Misc Symbol" 9839) ;; #X266F
+    (nil "wp" "Misc Symbol" 8472) ;; #X2118
+    (nil "bot" "Misc Symbol" 8869) ;; #X22A5
+    (nil "clubsuit" "Misc Symbol" 9827) ;; #X2663
+    (nil "diamondsuit" "Misc Symbol" 9826) ;; #X2662
+    (nil "heartsuit" "Misc Symbol" 9825) ;; #X2661
+    (nil "spadesuit" "Misc Symbol" 9824) ;; #X2660
+    (nil "mho" "Misc Symbol" 8487) ;; #X2127
+    (nil "Re" "Misc Symbol" 8476) ;; #X211C
+    (nil "Im" "Misc Symbol" 8465) ;; #X2111
+    (nil "angle" "Misc Symbol" 8736) ;; #X2220
+    (nil "partial" "Misc Symbol" 8706) ;; #X2202
+    (nil "sum" "Var Symbol" 8721) ;; #X2211
+    (nil "prod" "Var Symbol" 8719) ;; #X220F
+    (nil "coprod" "Var Symbol" 8720) ;; #X2210
+    (nil "int" "Var Symbol" 8747) ;; #X222B
+    (nil "oint" "Var Symbol" 8750) ;; #X222E
+    (nil "bigcap" "Var Symbol" 8898) ;; #X22C2
+    (nil "bigcup" "Var Symbol" 8899) ;; #X22C3
+    (nil "bigsqcup" "Var Symbol" 10758) ;; #X2A06
+    (nil "bigvee" "Var Symbol" 8897) ;; #X22C1
+    (nil "bigwedge" "Var Symbol" 8896) ;; #X22C0
+    (nil "bigodot" "Var Symbol" 10752) ;; #X2A00
+    (nil "bigotimes" "Var Symbol" 10754) ;; #X2A02
+    (nil "bigoplus" "Var Symbol" 10753) ;; #X2A01
+    (nil "biguplus" "Var Symbol" 10756) ;; #X2A04
+    (nil "arccos" "Log-like")
+    (nil "arcsin" "Log-like")
+    (nil "arctan" "Log-like")
+    (nil "arg" "Log-like")
+    (?\C-c "cos" "Log-like")
+    (nil "cosh" "Log-like")
+    (nil "cot" "Log-like")
+    (nil "coth" "Log-like")
+    (nil "csc" "Log-like")
+    (nil "deg" "Log-like")
+    (?\C-d "det" "Log-like")
+    (nil "dim" "Log-like")
+    (?\C-e "exp" "Log-like")
+    (nil "gcd" "Log-like")
+    (nil "hom" "Log-like")
+    (?\C-_ "inf" "Log-like")
+    (nil "ker" "Log-like")
+    (nil "lg" "Log-like")
+    (?\C-l "lim" "Log-like")
+    (nil "liminf" "Log-like")
+    (nil "limsup" "Log-like")
+    (nil "ln" "Log-like")
+    (nil "log" "Log-like")
+    (nil "max" "Log-like")
+    (nil "min" "Log-like")
+    (nil "Pr" "Log-like")
+    (nil "sec" "Log-like")
+    (?\C-s "sin" "Log-like")
+    (nil "sinh" "Log-like")
+    (?\C-^ "sup" "Log-like")
+    (?\C-t "tan" "Log-like")
+    (nil "tanh" "Log-like")
+    (nil "{" "Delimiters")
+    (nil "}" "Delimiters")
+    (nil "lfloor" "Delimiters" 8970) ;; #X230A
+    (nil "rfloor" "Delimiters" 8971) ;; #X230B
+    (nil "lceil" "Delimiters" 8968) ;; #X2308
+    (nil "rceil" "Delimiters" 8969) ;; #X2309
+    (?\( "langle" "Delimiters" 10216) ;; #X27E8
+    (?\) "rangle" "Delimiters" 10217) ;; #X27E9
+    (nil "rmoustache" "Delimiters" 9137) ;; #X23B1
+    (nil "lmoustache" "Delimiters" 9136) ;; #X23B0
+    (nil "rgroup" "Delimiters")
+    (nil "lgroup" "Delimiters")
+    (nil "backslash" "Delimiters" 92) ;; #X005C
+    (nil "|" "Delimiters")
+    (nil "arrowvert" "Delimiters")
+    (nil "Arrowvert" "Delimiters")
+    (nil "bracevert" "Delimiters")
+    (nil "widetilde" "Constructs" 771) ;; #X0303
+    (nil "widehat" "Constructs" 770) ;; #X0302
+    (nil "overleftarrow" "Constructs" 8406) ;; #X20D6
+    (nil "overrightarrow" "Constructs")
+    (nil "overline" "Constructs")
+    (nil "underline" "Constructs")
+    (nil "overbrace" "Constructs" 65079) ;; #XFE37
+    (nil "underbrace" "Constructs" 65080) ;; #XFE38
+    (nil "sqrt" "Constructs" 8730) ;; #X221A
+    (nil "frac" "Constructs")
+    (?^ "hat" "Accents" 770) ;; #X0302
+    (nil "acute" "Accents" 769) ;; #X0301
+    (nil "bar" "Accents" 772) ;; #X0304
+    (nil "dot" "Accents" 775) ;; #X0307
+    (nil "breve" "Accents" 774) ;; #X0306
+    (nil "check" "Accents" 780) ;; #X030C
+    (nil "grave" "Accents" 768) ;; #X0300
+    (nil "vec" "Accents" 8407) ;; #X20D7
+    (nil "ddot" "Accents" 776) ;; #X0308
+    (?~ "tilde" "Accents" 771) ;; #X0303
+    (nil "digamma" ("AMS" "Hebrew") 989) ;; #X03DD
+    (nil "varkappa" ("AMS" "Hebrew") 1008) ;; #X03F0
+    (nil "beth" ("AMS" "Hebrew") 8502) ;; #X2136
+    (nil "daleth" ("AMS" "Hebrew") 8504) ;; #X2138
+    (nil "gimel" ("AMS" "Hebrew") 8503) ;; #X2137
+    ("v G" "varGamma" ("AMS" "Greek Uppercase"))
+    ("v D" "varDelta" ("AMS" "Greek Uppercase"))
+    ("v J" "varTheta" ("AMS" "Greek Uppercase"))
+    ("v L" "varLambda" ("AMS" "Greek Uppercase"))
+    ("v X" "varXi" ("AMS" "Greek Uppercase"))
+    ("v P" "varPi" ("AMS" "Greek Uppercase"))
+    ("v S" "varSigma" ("AMS" "Greek Uppercase"))
+    ("v U" "varUpsilon" ("AMS" "Greek Uppercase"))
+    ("v F" "varPhi" ("AMS" "Greek Uppercase"))
+    ("v Y" "varPsi" ("AMS" "Greek Uppercase"))
+    ("v W" "varOmega" ("AMS" "Greek Uppercase"))
+    (nil "dashrightarrow" ("AMS" "Arrows"))
+    (nil "dashleftarrow" ("AMS" "Arrows"))
+    (nil "leftleftarrows" ("AMS" "Arrows") 8647) ;; #X21C7
+    (nil "leftrightarrows" ("AMS" "Arrows") 8646) ;; #X21C6
+    (nil "Lleftarrow" ("AMS" "Arrows") 8666) ;; #X21DA
+    (nil "twoheadleftarrow" ("AMS" "Arrows") 8606) ;; #X219E
+    (nil "leftarrowtail" ("AMS" "Arrows") 8610) ;; #X21A2
+    (nil "looparrowleft" ("AMS" "Arrows") 8619) ;; #X21AB
+    (nil "leftrightharpoons" ("AMS" "Arrows") 8651) ;; #X21CB
+    (nil "curvearrowleft" ("AMS" "Arrows") 8630) ;; #X21B6
+    (nil "circlearrowleft" ("AMS" "Arrows"))
+    (nil "Lsh" ("AMS" "Arrows") 8624) ;; #X21B0
+    (nil "upuparrows" ("AMS" "Arrows") 8648) ;; #X21C8
+    (nil "upharpoonleft" ("AMS" "Arrows") 8639) ;; #X21BF
+    (nil "downharpoonleft" ("AMS" "Arrows") 8643) ;; #X21C3
+    (nil "multimap" ("AMS" "Arrows") 8888) ;; #X22B8
+    (nil "leftrightsquigarrow" ("AMS" "Arrows") 8621) ;; #X21AD
+    (nil "looparrowright" ("AMS" "Arrows") 8620) ;; #X21AC
+    (nil "rightleftharpoons" ("AMS" "Arrows") 8652) ;; #X21CC
+    (nil "curvearrowright" ("AMS" "Arrows") 8631) ;; #X21B7
+    (nil "circlearrowright" ("AMS" "Arrows"))
+    (nil "Rsh" ("AMS" "Arrows") 8625) ;; #X21B1
+    (nil "downdownarrows" ("AMS" "Arrows") 8650) ;; #X21CA
+    (nil "upharpoonright" ("AMS" "Arrows") 8638) ;; #X21BE
+    (nil "downharpoonright" ("AMS" "Arrows") 8642) ;; #X21C2
+    (nil "rightsquigarrow" ("AMS" "Arrows") 8605) ;; #X219D
+    (nil "nleftarrow" ("AMS" "Neg Arrows") 8602) ;; #X219A
+    (nil "nrightarrow" ("AMS" "Neg Arrows") 8603) ;; #X219B
+    (nil "nLeftarrow" ("AMS" "Neg Arrows") 8653) ;; #X21CD
+    (nil "nRightarrow" ("AMS" "Neg Arrows") 8655) ;; #X21CF
+    (nil "nleftrightarrow" ("AMS" "Neg Arrows") 8622) ;; #X21AE
+    (nil "nLeftrightarrow" ("AMS" "Neg Arrows") 8654) ;; #X21CE
+    (nil "leqq" ("AMS" "Relational I") 8806) ;; #X2266
+    (nil "leqslant" ("AMS" "Relational I") 10877) ;; #X2A7D
+    (nil "eqslantless" ("AMS" "Relational I") 10901) ;; #X2A95
+    (nil "lesssim" ("AMS" "Relational I") 8818) ;; #X2272
+    (nil "lessapprox" ("AMS" "Relational I") 10885) ;; #X2A85
+    (nil "approxeq" ("AMS" "Relational I") 8778) ;; #X224A
+    (nil "lessdot" ("AMS" "Relational I") 8918) ;; #X22D6
+    (nil "lll" ("AMS" "Relational I") 8920) ;; #X22D8
+    (nil "lessgtr" ("AMS" "Relational I") 8822) ;; #X2276
+    (nil "lesseqgtr" ("AMS" "Relational I") 8922) ;; #X22DA
+    (nil "lesseqqgtr" ("AMS" "Relational I") 10891) ;; #X2A8B
+    (nil "doteqdot" ("AMS" "Relational I"))
+    (nil "risingdotseq" ("AMS" "Relational I") 8787) ;; #X2253
+    (nil "fallingdotseq" ("AMS" "Relational I") 8786) ;; #X2252
+    (nil "backsim" ("AMS" "Relational I") 8765) ;; #X223D
+    (nil "backsimeq" ("AMS" "Relational I") 8909) ;; #X22CD
+    (nil "subseteqq" ("AMS" "Relational I") 10949) ;; #X2AC5
+    (nil "Subset" ("AMS" "Relational I") 8912) ;; #X22D0
+    (nil "sqsubset" ("AMS" "Relational I") 8847) ;; #X228F
+    (nil "preccurlyeq" ("AMS" "Relational I") 8828) ;; #X227C
+    (nil "curlyeqprec" ("AMS" "Relational I") 8926) ;; #X22DE
+    (nil "precsim" ("AMS" "Relational I") 8830) ;; #X227E
+    (nil "precapprox" ("AMS" "Relational I") 10935) ;; #X2AB7
+    (nil "vartriangleleft" ("AMS" "Relational I") 8882) ;; #X22B2
+    (nil "trianglelefteq" ("AMS" "Relational I") 8884) ;; #X22B4
+    (nil "vDash" ("AMS" "Relational I") 8872) ;; #X22A8
+    (nil "Vvdash" ("AMS" "Relational I") 8874) ;; #X22AA
+    (nil "smallsmile" ("AMS" "Relational I") 8995) ;; #X2323
+    (nil "smallfrown" ("AMS" "Relational I") 8994) ;; #X2322
+    (nil "bumpeq" ("AMS" "Relational I") 8783) ;; #X224F
+    (nil "Bumpeq" ("AMS" "Relational I") 8782) ;; #X224E
+    (nil "geqq" ("AMS" "Relational II") 8807) ;; #X2267
+    (nil "geqslant" ("AMS" "Relational II") 10878) ;; #X2A7E
+    (nil "eqslantgtr" ("AMS" "Relational II") 10902) ;; #X2A96
+    (nil "gtrsim" ("AMS" "Relational II") 8819) ;; #X2273
+    (nil "gtrapprox" ("AMS" "Relational II") 10886) ;; #X2A86
+    (nil "gtrdot" ("AMS" "Relational II") 8919) ;; #X22D7
+    (nil "ggg" ("AMS" "Relational II") 8921) ;; #X22D9
+    (nil "gtrless" ("AMS" "Relational II") 8823) ;; #X2277
+    (nil "gtreqless" ("AMS" "Relational II") 8923) ;; #X22DB
+    (nil "gtreqqless" ("AMS" "Relational II") 10892) ;; #X2A8C
+    (nil "eqcirc" ("AMS" "Relational II") 8790) ;; #X2256
+    (nil "circeq" ("AMS" "Relational II") 8791) ;; #X2257
+    (nil "triangleq" ("AMS" "Relational II") 8796) ;; #X225C
+    (nil "thicksim" ("AMS" "Relational II") 8764) ;; #X223C
+    (nil "thickapprox" ("AMS" "Relational II") 8776) ;; #X2248
+    (nil "supseteqq" ("AMS" "Relational II") 10950) ;; #X2AC6
+    (nil "Supset" ("AMS" "Relational II") 8913) ;; #X22D1
+    (nil "sqsupset" ("AMS" "Relational II") 8848) ;; #X2290
+    (nil "succcurlyeq" ("AMS" "Relational II") 8829) ;; #X227D
+    (nil "curlyeqsucc" ("AMS" "Relational II") 8927) ;; #X22DF
+    (nil "succsim" ("AMS" "Relational II") 8831) ;; #X227F
+    (nil "succapprox" ("AMS" "Relational II") 10936) ;; #X2AB8
+    (nil "vartriangleright" ("AMS" "Relational II") 8883) ;; #X22B3
+    (nil "trianglerighteq" ("AMS" "Relational II") 8885) ;; #X22B5
+    (nil "Vdash" ("AMS" "Relational II") 8873) ;; #X22A9
+    (nil "shortmid" ("AMS" "Relational II") 8739) ;; #X2223
+    (nil "shortparallel" ("AMS" "Relational II") 8741) ;; #X2225
+    (nil "between" ("AMS" "Relational II") 8812) ;; #X226C
+    (nil "pitchfork" ("AMS" "Relational II") 8916) ;; #X22D4
+    (nil "varpropto" ("AMS" "Relational II") 8733) ;; #X221D
+    (nil "blacktriangleleft" ("AMS" "Relational II") 9664) ;; #X25C0
+    (nil "therefore" ("AMS" "Relational II") 8756) ;; #X2234
+    (nil "backepsilon" ("AMS" "Relational II") 1014) ;; #X03F6
+    (nil "blacktriangleright" ("AMS" "Relational II") 9654) ;; #X25B6
+    (nil "because" ("AMS" "Relational II") 8757) ;; #X2235
+    (nil "nless" ("AMS" "Neg Rel I") 8814) ;; #X226E
+    (nil "nleq" ("AMS" "Neg Rel I") 8816) ;; #X2270
+    (nil "nleqslant" ("AMS" "Neg Rel I"))
+    (nil "nleqq" ("AMS" "Neg Rel I"))
+    (nil "lneq" ("AMS" "Neg Rel I") 10887) ;; #X2A87
+    (nil "lneqq" ("AMS" "Neg Rel I") 8808) ;; #X2268
+    (nil "lvertneqq" ("AMS" "Neg Rel I"))
+    (nil "lnsim" ("AMS" "Neg Rel I") 8934) ;; #X22E6
+    (nil "lnapprox" ("AMS" "Neg Rel I") 10889) ;; #X2A89
+    (nil "nprec" ("AMS" "Neg Rel I") 8832) ;; #X2280
+    (nil "npreceq" ("AMS" "Neg Rel I"))
+    (nil "precnsim" ("AMS" "Neg Rel I") 8936) ;; #X22E8
+    (nil "precnapprox" ("AMS" "Neg Rel I") 10937) ;; #X2AB9
+    (nil "nsim" ("AMS" "Neg Rel I") 8769) ;; #X2241
+    (nil "nshortmid" ("AMS" "Neg Rel I") 8740) ;; #X2224
+    (nil "nmid" ("AMS" "Neg Rel I") 8740) ;; #X2224
+    (nil "nvdash" ("AMS" "Neg Rel I") 8876) ;; #X22AC
+    (nil "nvDash" ("AMS" "Neg Rel I") 8877) ;; #X22AD
+    (nil "ntriangleleft" ("AMS" "Neg Rel I") 8938) ;; #X22EA
+    (nil "ntrianglelefteq" ("AMS" "Neg Rel I") 8940) ;; #X22EC
+    (nil "nsubseteq" ("AMS" "Neg Rel I") 8840) ;; #X2288
+    (nil "subsetneq" ("AMS" "Neg Rel I") 8842) ;; #X228A
+    (nil "varsubsetneq" ("AMS" "Neg Rel I"))
+    (nil "subsetneqq" ("AMS" "Neg Rel I") 10955) ;; #X2ACB
+    (nil "varsubsetneqq" ("AMS" "Neg Rel I"))
+    (nil "ngtr" ("AMS" "Neg Rel II") 8815) ;; #X226F
+    (nil "ngeq" ("AMS" "Neg Rel II") 8817) ;; #X2271
+    (nil "ngeqslant" ("AMS" "Neg Rel II"))
+    (nil "ngeqq" ("AMS" "Neg Rel II"))
+    (nil "gneq" ("AMS" "Neg Rel II") 10888) ;; #X2A88
+    (nil "gneqq" ("AMS" "Neg Rel II") 8809) ;; #X2269
+    (nil "gvertneqq" ("AMS" "Neg Rel II"))
+    (nil "gnsim" ("AMS" "Neg Rel II") 8935) ;; #X22E7
+    (nil "gnapprox" ("AMS" "Neg Rel II") 10890) ;; #X2A8A
+    (nil "nsucc" ("AMS" "Neg Rel II") 8833) ;; #X2281
+    (nil "nsucceq" ("AMS" "Neg Rel II"))
+    (nil "succnsim" ("AMS" "Neg Rel II") 8937) ;; #X22E9
+    (nil "succnapprox" ("AMS" "Neg Rel II") 10938) ;; #X2ABA
+    (nil "ncong" ("AMS" "Neg Rel II") 8775) ;; #X2247
+    (nil "nshortparallel" ("AMS" "Neg Rel II") 8742) ;; #X2226
+    (nil "nparallel" ("AMS" "Neg Rel II") 8742) ;; #X2226
+    (nil "nvDash" ("AMS" "Neg Rel II") 8877) ;; #X22AD
+    (nil "nVDash" ("AMS" "Neg Rel II") 8879) ;; #X22AF
+    (nil "ntriangleright" ("AMS" "Neg Rel II") 8939) ;; #X22EB
+    (nil "ntrianglerighteq" ("AMS" "Neg Rel II") 8941) ;; #X22ED
+    (nil "nsupseteq" ("AMS" "Neg Rel II") 8841) ;; #X2289
+    (nil "nsupseteqq" ("AMS" "Neg Rel II"))
+    (nil "supsetneq" ("AMS" "Neg Rel II") 8843) ;; #X228B
+    (nil "varsupsetneq" ("AMS" "Neg Rel II"))
+    (nil "supsetneqq" ("AMS" "Neg Rel II") 10956) ;; #X2ACC
+    (nil "varsupsetneqq" ("AMS" "Neg Rel II"))
+    (nil "dotplus" ("AMS" "Binary Op") 8724) ;; #X2214
+    (nil "smallsetminus" ("AMS" "Binary Op") 8726) ;; #X2216
+    (nil "Cap" ("AMS" "Binary Op") 8914) ;; #X22D2
+    (nil "Cup" ("AMS" "Binary Op") 8915) ;; #X22D3
+    (nil "barwedge" ("AMS" "Binary Op") 8892) ;; #X22BC
+    (nil "veebar" ("AMS" "Binary Op") 8891) ;; #X22BB
+    (nil "doublebarwedge" ("AMS" "Binary Op") 8966) ;; #X2306
+    (nil "boxminus" ("AMS" "Binary Op") 8863) ;; #X229F
+    (nil "boxtimes" ("AMS" "Binary Op") 8864) ;; #X22A0
+    (nil "boxdot" ("AMS" "Binary Op") 8865) ;; #X22A1
+    (nil "boxplus" ("AMS" "Binary Op") 8862) ;; #X229E
+    (nil "divideontimes" ("AMS" "Binary Op") 8903) ;; #X22C7
+    (nil "ltimes" ("AMS" "Binary Op") 8905) ;; #X22C9
+    (nil "rtimes" ("AMS" "Binary Op") 8906) ;; #X22CA
+    (nil "leftthreetimes" ("AMS" "Binary Op") 8907) ;; #X22CB
+    (nil "rightthreetimes" ("AMS" "Binary Op") 8908) ;; #X22CC
+    (nil "curlywedge" ("AMS" "Binary Op") 8911) ;; #X22CF
+    (nil "curlyvee" ("AMS" "Binary Op") 8910) ;; #X22CE
+    (nil "circleddash" ("AMS" "Binary Op") 8861) ;; #X229D
+    (nil "circledast" ("AMS" "Binary Op") 8859) ;; #X229B
+    (nil "circledcirc" ("AMS" "Binary Op") 8858) ;; #X229A
+    (nil "centerdot" ("AMS" "Binary Op"))
+    (nil "intercal" ("AMS" "Binary Op") 8890) ;; #X22BA
+    (nil "hbar" ("AMS" "Misc") 8463) ;; #X210F
+    (nil "hslash" ("AMS" "Misc") 8463) ;; #X210F
+    (nil "vartriangle" ("AMS" "Misc") 9653) ;; #X25B5
+    (nil "triangledown" ("AMS" "Misc") 9663) ;; #X25BF
+    (nil "square" ("AMS" "Misc") 9633) ;; #X25A1
+    (nil "lozenge" ("AMS" "Misc") 9674) ;; #X25CA
+    (nil "circledS" ("AMS" "Misc") 9416) ;; #X24C8
+    (nil "angle" ("AMS" "Misc") 8736) ;; #X2220
+    (nil "measuredangle" ("AMS" "Misc") 8737) ;; #X2221
+    (nil "nexists" ("AMS" "Misc") 8708) ;; #X2204
+    (nil "mho" ("AMS" "Misc") 8487) ;; #X2127
+    (nil "Finv" ("AMS" "Misc") 8498) ;; #X2132
+    (nil "Game" ("AMS" "Misc") 8513) ;; #X2141
+    (nil "Bbbk" ("AMS" "Misc") 120156) ;; #X1D55C
+    (nil "backprime" ("AMS" "Misc") 8245) ;; #X2035
+    (nil "varnothing" ("AMS" "Misc") 8709) ;; #X2205
+    (nil "blacktriangle" ("AMS" "Misc") 9652) ;; #X25B4
+    (nil "blacktriangledown" ("AMS" "Misc") 9662) ;; #X25BE
+    (nil "blacksquare" ("AMS" "Misc") 9632) ;; #X25A0
+    (nil "blacklozenge" ("AMS" "Misc") 10731) ;; #X29EB
+    (nil "bigstar" ("AMS" "Misc") 9733) ;; #X2605
+    (nil "sphericalangle" ("AMS" "Misc") 8738) ;; #X2222
+    (nil "complement" ("AMS" "Misc") 8705) ;; #X2201
+    (nil "eth" ("AMS" "Misc") 240) ;; #X00F0
+    (nil "diagup" ("AMS" "Misc") 9585) ;; #X2571
+    (nil "diagdown" ("AMS" "Misc") 9586) ;; #X2572
+    (nil "dddot" ("AMS" "Accents") 8411) ;; #X20DB
+    (nil "ddddot" ("AMS" "Accents") 8412) ;; #X20DC
+    (nil "bigl" ("AMS" "Delimiters"))
+    (nil "bigr" ("AMS" "Delimiters"))
+    (nil "Bigl" ("AMS" "Delimiters"))
+    (nil "Bigr" ("AMS" "Delimiters"))
+    (nil "biggl" ("AMS" "Delimiters"))
+    (nil "biggr" ("AMS" "Delimiters"))
+    (nil "Biggl" ("AMS" "Delimiters"))
+    (nil "Biggr" ("AMS" "Delimiters"))
+    (nil "lvert" ("AMS" "Delimiters"))
+    (nil "rvert" ("AMS" "Delimiters"))
+    (nil "lVert" ("AMS" "Delimiters"))
+    (nil "rVert" ("AMS" "Delimiters"))
+    (nil "ulcorner" ("AMS" "Delimiters") 8988) ;; #X231C
+    (nil "urcorner" ("AMS" "Delimiters") 8989) ;; #X231D
+    (nil "llcorner" ("AMS" "Delimiters") 8990) ;; #X231E
+    (nil "lrcorner" ("AMS" "Delimiters") 8991) ;; #X231F
+    (nil "nobreakdash" ("AMS" "Special"))
+    (nil "leftroot" ("AMS" "Special"))
+    (nil "uproot" ("AMS" "Special"))
+    (nil "accentedsymbol" ("AMS" "Special"))
+    (nil "xleftarrow" ("AMS" "Special"))
+    (nil "xrightarrow" ("AMS" "Special"))
+    (nil "overset" ("AMS" "Special"))
+    (nil "underset" ("AMS" "Special"))
+    (nil "dfrac" ("AMS" "Special"))
+    (nil "genfrac" ("AMS" "Special"))
+    (nil "tfrac" ("AMS" "Special"))
+    (nil "binom" ("AMS" "Special"))
+    (nil "dbinom" ("AMS" "Special"))
+    (nil "tbinom" ("AMS" "Special"))
+    (nil "smash" ("AMS" "Special"))
+    (nil "eucal" ("AMS" "Special"))
+    (nil "boldsymbol" ("AMS" "Special"))
+    (nil "text" ("AMS" "Special"))
+    (nil "intertext" ("AMS" "Special"))
+    (nil "substack" ("AMS" "Special"))
+    (nil "subarray" ("AMS" "Special"))
+    (nil "sideset" ("AMS" "Special")))
+  "Alist of LaTeX math symbols.
+
+Each entry should be a list with upto four elements, KEY, VALUE,
+MENU and CHARACTER, see `LaTeX-math-list' for details.")
+
+(defcustom LaTeX-math-abbrev-prefix "`"
+  "Prefix key for use in `LaTeX-math-mode'.
+This has to be a string representing a key sequence in a format
+understood by the `kbd' macro.  This corresponds to the syntax
+usually used in the Emacs and Elisp manuals.
+
+Setting this variable directly does not take effect;
+use \\[customize]."
+  :group 'LaTeX-math
+  :initialize 'custom-initialize-default
+  :set '(lambda (symbol value)
+         (define-key LaTeX-math-mode-map (LaTeX-math-abbrev-prefix) t)
+         (set-default symbol value)
+         (define-key LaTeX-math-mode-map
+           (LaTeX-math-abbrev-prefix) LaTeX-math-keymap))
+  :type '(string :tag "Key sequence"))
+
+(defun LaTeX-math-abbrev-prefix ()
+  "Make a key definition from the variable `LaTeX-math-abbrev-prefix'."
+  (if (stringp LaTeX-math-abbrev-prefix)
+      (read-kbd-macro LaTeX-math-abbrev-prefix)
+    LaTeX-math-abbrev-prefix))
+
+(defvar LaTeX-math-keymap
+  (let ((map (make-sparse-keymap)))
+    (define-key map (LaTeX-math-abbrev-prefix) 'self-insert-command)
+    map)
+  "Keymap used for `LaTeX-math-mode' commands.")
+
+(defvar LaTeX-math-menu
+  '("Math"
+    ("Greek Uppercase") ("Greek Lowercase") ("Binary Op") ("Relational")
+    ("Arrows") ("Punctuation") ("Misc Symbol") ("Var Symbol") ("Log-like")
+    ("Delimiters") ("Constructs") ("Accents") ("AMS"))
+  "Menu containing LaTeX math commands.
+The menu entries will be generated dynamically, but you can specify
+the sequence by initializing this variable.")
+
+(defcustom LaTeX-math-menu-unicode
+  (and (string-match "\\<GTK\\>" (emacs-version)) t)
+  "Whether the LaTeX menu should try using Unicode for effect."
+  :type 'boolean
+  :group 'LaTeX-math)
+
+(let ((math (reverse (append LaTeX-math-list LaTeX-math-default)))
+      (map LaTeX-math-keymap)
+      (unicode (and LaTeX-math-menu-unicode (fboundp 'decode-char))))
+  (while math
+    (let* ((entry (car math))
+          (key (nth 0 entry))
+          (prefix
+           (and unicode
+                (nth 3 entry)))
+          value menu name)
+      (setq math (cdr math))
+      (if (and prefix
+              (setq prefix (decode-char 'ucs (nth 3 entry))))
+         (setq prefix (concat (string prefix) " \\"))
+       (setq prefix "\\"))
+      (if (listp (cdr entry))
+         (setq value (nth 1 entry)
+               menu (nth 2 entry))
+       (setq value (cdr entry)
+             menu nil))
+      (if (stringp value)
+         (progn
+          (setq name (intern (concat "LaTeX-math-" value)))
+          (fset name (list 'lambda (list 'arg) (list 'interactive "*P")
+                           (list 'LaTeX-math-insert value 'arg))))
+       (setq name value))
+      (if key
+         (progn
+           (setq key (cond ((numberp key) (char-to-string key))
+                           ((stringp key) (read-kbd-macro key))
+                           (t (vector key))))
+           (define-key map key name)))
+      (if menu
+         (let ((parent LaTeX-math-menu))
+           (if (listp menu)
+               (progn
+                 (while (cdr menu)
+                   (let ((sub (assoc (car menu) LaTeX-math-menu)))
+                     (if sub
+                         (setq parent sub)
+                       (setcdr parent (cons (list (car menu)) (cdr parent))))
+                     (setq menu (cdr menu))))
+                 (setq menu (car menu))))
+           (let ((sub (assoc menu parent)))
+             (if sub
+                 (if (stringp value)
+                     (setcdr sub (cons (vector (concat prefix value)
+                                               name t)
+                                       (cdr sub)))
+                   (error "Cannot have multiple special math menu items"))
+               (setcdr parent
+                       (cons (if (stringp value)
+                                 (list menu (vector (concat prefix value)
+                                                    name t))
+                               (vector menu name t))
+                             (cdr parent))))))))))
+
+(define-minor-mode LaTeX-math-mode
+  "A minor mode with easy access to TeX math macros.
+
+Easy insertion of LaTeX math symbols.  If you give a prefix argument,
+the symbols will be surrounded by dollar signs.  The following
+commands are defined:
+
+\\{LaTeX-math-mode-map}"
+  nil nil (list (cons (LaTeX-math-abbrev-prefix) LaTeX-math-keymap))
+  (if LaTeX-math-mode
+      (easy-menu-add LaTeX-math-mode-menu LaTeX-math-mode-map)
+    (easy-menu-remove LaTeX-math-mode-menu))
+  (TeX-set-mode-name))
+(defalias 'latex-math-mode 'LaTeX-math-mode)
+
+(easy-menu-define LaTeX-math-mode-menu
+    LaTeX-math-mode-map
+    "Menu used in math minor mode."
+  LaTeX-math-menu)
+
+(defcustom LaTeX-math-insert-function 'TeX-insert-macro
+  "Function called with argument STRING to insert \\STRING."
+  :group 'LaTeX-math
+  :type 'function)
+
+(defun LaTeX-math-insert (string dollar)
+  "Insert \\STRING{}.  If DOLLAR is non-nil, put $'s around it."
+  (if dollar (insert "$"))
+  (funcall LaTeX-math-insert-function string)
+  (if dollar (insert "$")))
+
+(defun LaTeX-math-cal (char dollar)
+  "Insert a {\\cal CHAR}.  If DOLLAR is non-nil, put $'s around it."
+  (interactive "*c\nP")
+  (if dollar (insert "$"))
+  (if (member "latex2e" (TeX-style-list))
+      (insert "\\mathcal{" (char-to-string char) "}")
+    (insert "{\\cal " (char-to-string char) "}"))
+  (if dollar (insert "$")))
+
+
+;;; Folding
+
+(defcustom LaTeX-fold-macro-spec-list nil
+  "List of display strings and macros to fold in LaTeX mode."
+  :type '(repeat (group (choice (string :tag "Display String")
+                               (integer :tag "Number of argument" :value 1))
+                       (repeat :tag "Macros" (string))))
+  :group 'TeX-fold)
+
+(defcustom LaTeX-fold-env-spec-list nil
+  "List of display strings and environments to fold in LaTeX mode."
+  :type '(repeat (group (choice (string :tag "Display String")
+                               (integer :tag "Number of argument" :value 1))
+                       (repeat :tag "Environments" (string))))
+  :group 'TeX-fold)
+
+(defcustom LaTeX-fold-math-spec-list
+  (delete nil
+         (mapcar (lambda (elt)
+                   (let ((tex-token (nth 1 elt))
+                         (submenu   (nth 2 elt))
+                         (unicode   (nth 3 elt))
+                         uchar noargp)
+                     (when (and (fboundp 'decode-char) (integerp unicode))
+                       (setq uchar (decode-char 'ucs unicode)))
+                     (when (listp submenu) (setq submenu (nth 1 submenu)))
+                     (setq noargp
+                           (not (string-match
+                                 (concat "^" (regexp-opt '("Constructs"
+                                                           "Accents")))
+                                 submenu)))
+                     (when (and (stringp tex-token) (integerp uchar) noargp)
+                       `(,(char-to-string uchar) (,tex-token)))))
+                 `((nil "to" "" 8594)
+                   (nil "gets" "" 8592)
+                   ,@LaTeX-math-default)))
+  "List of display strings and math macros to fold in LaTeX mode."
+  :type '(repeat (group (choice (string :tag "Display String")
+                               (integer :tag "Number of argument" :value 1))
+                       (repeat :tag "Math Macros" (string))))
+  :group 'TeX-fold)
+
+
+;;; Keymap
+
+(defvar LaTeX-mode-map
+  (let ((map (make-sparse-keymap)))
+    (set-keymap-parent map TeX-mode-map)
+
+    ;; Standard
+    (define-key map "\n"      'reindent-then-newline-and-indent)
+
+    ;; From latex.el
+    ;; We now set `fill-paragraph-function' instead.
+    ;; (define-key map "\eq"     'LaTeX-fill-paragraph) ;*** Alias
+    ;; This key is now used by Emacs for face settings.
+    ;; (define-key map "\eg"     'LaTeX-fill-region) ;*** Alias
+    (define-key map "\e\C-e"  'LaTeX-find-matching-end)
+    (define-key map "\e\C-a"  'LaTeX-find-matching-begin)
+
+    (define-key map "\C-c\C-q\C-p" 'LaTeX-fill-paragraph)
+    (define-key map "\C-c\C-q\C-r" 'LaTeX-fill-region)
+    (define-key map "\C-c\C-q\C-s" 'LaTeX-fill-section)
+    (define-key map "\C-c\C-q\C-e" 'LaTeX-fill-environment)
+
+    (define-key map "\C-c."    'LaTeX-mark-environment) ;*** Dubious
+    (define-key map "\C-c*"    'LaTeX-mark-section) ;*** Dubious
+
+    (define-key map "\C-c\C-e" 'LaTeX-environment)
+    (define-key map "\C-c\n"   'LaTeX-insert-item)
+    (or (key-binding "\e\r")
+       (define-key map "\e\r"    'LaTeX-insert-item)) ;*** Alias
+    (define-key map "\C-c]" 'LaTeX-close-environment)
+    (define-key map "\C-c\C-s" 'LaTeX-section)
+
+    (define-key map "\C-c~"    'LaTeX-math-mode) ;*** Dubious
+
+    (define-key map "-" 'LaTeX-babel-insert-hyphen)
+    map)
+  "Keymap used in `LaTeX-mode'.")
+
+(defvar LaTeX-environment-menu-name "Insert Environment  (C-c C-e)")
+
+(defun LaTeX-environment-menu-entry (entry)
+  "Create an entry for the environment menu."
+  (vector (car entry) (list 'LaTeX-environment-menu (car entry)) t))
+
+(defvar LaTeX-environment-modify-menu-name "Change Environment  (C-u C-c C-e)")
+
+(defun LaTeX-environment-modify-menu-entry (entry)
+  "Create an entry for the change environment menu."
+  (vector (car entry) (list 'LaTeX-modify-environment (car entry)) t))
+
+(defun LaTeX-section-enable-symbol (LEVEL)
+  "Symbol used to enable section LEVEL in the menu bar."
+  (intern (concat "LaTeX-section-" (int-to-string (nth 1 entry)) "-enable")))
+
+(defun LaTeX-section-enable (entry)
+  "Enable or disable section ENTRY from `LaTeX-section-list'."
+  (let* ((level (nth 1 entry))
+        (symbol (LaTeX-section-enable-symbol level)))
+    (set symbol (or (= level 0) (>= level LaTeX-largest-level)))
+    (make-variable-buffer-local symbol)))
+
+(defun LaTeX-section-menu (level)
+  "Insert section from menu."
+  (let ((LaTeX-section-hook (delq 'LaTeX-section-heading
+                                 (copy-sequence LaTeX-section-hook))))
+    (LaTeX-section level)))
+
+(defun LaTeX-section-menu-entry (entry)
+  "Create an ENTRY for the section menu."
+  (let ((enable (LaTeX-section-enable-symbol (nth 1 entry))))
+    (vector (car entry) (list 'LaTeX-section-menu (nth 1 entry)) enable)))
+
+(defcustom LaTeX-menu-max-items 25
+  "*Maximum number of items in the menu for LaTeX environments.
+If number of entries in a menu is larger than this value, split menu
+into submenus of nearly equal length.  If nil, never split menu into
+submenus."
+  :group 'LaTeX-environment
+  :type '(choice (const :tag "no submenus" nil)
+                (integer)))
+
+(defcustom LaTeX-submenu-name-format "%-12.12s ... %.12s"
+  "*Format specification of the submenu name.
+Used by `LaTeX-split-long-menu' if the number of entries in a menu is
+larger than `LaTeX-menu-max-items'.
+This string should contain one %s for the name of the first entry and
+one %s for the name of the last entry in the submenu.
+If the value is a function, it should return the submenu name.  The
+function is called with two arguments, the names of the first and
+the last entry in the menu."
+  :group 'LaTeX-environment
+  :type '(choice (string :tag "Format string")
+                (function)))
+
+(defun LaTeX-split-long-menu (menu)
+  "Split MENU according to `LaTeX-menu-max-items'."
+  (let ((len (length menu)))
+    (if (or (null LaTeX-menu-max-items)
+           (null (featurep 'lisp-float-type))
+           (<= len LaTeX-menu-max-items))
+       menu
+      ;; Submenu is max 2 entries longer than menu, never shorter, number of
+      ;; entries in submenus differ by at most one (with longer submenus first)
+      (let* ((outer (floor (sqrt len)))
+            (inner (/ len outer))
+            (rest (% len outer))
+            (result nil))
+       (setq menu (reverse menu))
+       (while menu
+         (let ((in inner)
+               (sub nil)
+               (to (car menu)))
+           (while (> in 0)
+             (setq in   (1- in)
+                   sub  (cons (car menu) sub)
+                   menu (cdr menu)))
+           (setq result
+                 (cons (cons (if (stringp LaTeX-submenu-name-format)
+                                 (format LaTeX-submenu-name-format
+                                         (aref (car sub) 0) (aref to 0))
+                               (funcall LaTeX-submenu-name-format
+                                        (aref (car sub) 0) (aref to 0)))
+                             sub)
+                       result)
+                 rest  (1+ rest))
+           (if (= rest outer) (setq inner (1+ inner)))))
+       result))))
+
+(defvar LaTeX-section-menu nil)
+(make-variable-buffer-local 'LaTeX-section-menu)
+(defun LaTeX-section-menu-filter (ignored)
+  "Filter function for the section submenu in the mode menu.
+The argument IGNORED is not used in any way."
+  (TeX-update-style)
+  (or LaTeX-section-menu
+      (progn
+       (setq LaTeX-section-list-changed nil)
+       (mapc 'LaTeX-section-enable LaTeX-section-list)
+       (setq LaTeX-section-menu
+             (mapcar 'LaTeX-section-menu-entry LaTeX-section-list)))))
+
+(defvar LaTeX-environment-menu nil)
+(make-variable-buffer-local 'LaTeX-environment-menu)
+(defvar LaTeX-environment-modify-menu nil)
+(make-variable-buffer-local 'LaTeX-environment-modify-menu)
+(defun LaTeX-environment-menu-filter (menu)
+  "Filter function for the environment submenus in the mode menu.
+The argument MENU is the name of the submenu in concern and
+corresponds to the variables `LaTeX-environment-menu-name' and
+`LaTeX-environment-modify-menu-name'."
+  (TeX-update-style)
+  (cond
+   ((string= menu LaTeX-environment-menu-name)
+    (or LaTeX-environment-menu
+       (setq LaTeX-environment-menu
+             (LaTeX-split-long-menu
+              (mapcar 'LaTeX-environment-menu-entry
+                      (LaTeX-environment-list))))))
+   ((string= menu LaTeX-environment-modify-menu-name)
+    (or LaTeX-environment-modify-menu
+       (setq LaTeX-environment-modify-menu
+             (LaTeX-split-long-menu
+              (mapcar 'LaTeX-environment-modify-menu-entry
+                      (LaTeX-environment-list))))))))
+
+(easy-menu-define LaTeX-mode-command-menu
+    LaTeX-mode-map
+    "Command menu used in LaTeX mode."
+    (TeX-mode-specific-command-menu 'latex-mode))
+
+(easy-menu-define LaTeX-mode-menu
+  LaTeX-mode-map
+  "Menu used in LaTeX mode."
+  (TeX-menu-with-help
+   `("LaTeX"
+     ("Section  (C-c C-s)" :filter LaTeX-section-menu-filter)
+     ["Macro..." TeX-insert-macro
+      :help "Insert a macro and possibly arguments"]
+     ["Complete Macro" TeX-complete-symbol
+      :help "Complete the current macro or environment name"]
+     ,(list LaTeX-environment-menu-name
+           :filter (lambda (ignored) (LaTeX-environment-menu-filter
+                                      LaTeX-environment-menu-name)))
+     ,(list LaTeX-environment-modify-menu-name
+           :filter (lambda (ignored) (LaTeX-environment-menu-filter
+                                      LaTeX-environment-modify-menu-name)))
+     ["Close Environment" LaTeX-close-environment
+      :help "Insert the \\end part of the current environment"]
+     ["Item" LaTeX-insert-item
+      :help "Insert a new \\item into current environment"]
+     "-"
+     ("Insert Font"
+      ["Emphasize"  (TeX-font nil ?\C-e) :keys "C-c C-f C-e"]
+      ["Bold"       (TeX-font nil ?\C-b) :keys "C-c C-f C-b"]
+      ["Typewriter" (TeX-font nil ?\C-t) :keys "C-c C-f C-t"]
+      ["Small Caps" (TeX-font nil ?\C-c) :keys "C-c C-f C-c"]
+      ["Sans Serif" (TeX-font nil ?\C-f) :keys "C-c C-f C-f"]
+      ["Italic"     (TeX-font nil ?\C-i) :keys "C-c C-f C-i"]
+      ["Slanted"    (TeX-font nil ?\C-s) :keys "C-c C-f C-s"]
+      ["Roman"      (TeX-font nil ?\C-r) :keys "C-c C-f C-r"]
+      ["Calligraphic" (TeX-font nil ?\C-a) :keys "C-c C-f C-a"])
+     ("Replace Font"
+      ["Emphasize"  (TeX-font t ?\C-e) :keys "C-u C-c C-f C-e"]
+      ["Bold"       (TeX-font t ?\C-b) :keys "C-u C-c C-f C-b"]
+      ["Typewriter" (TeX-font t ?\C-t) :keys "C-u C-c C-f C-t"]
+      ["Small Caps" (TeX-font t ?\C-c) :keys "C-u C-c C-f C-c"]
+      ["Sans Serif" (TeX-font t ?\C-f) :keys "C-u C-c C-f C-f"]
+      ["Italic"     (TeX-font t ?\C-i) :keys "C-u C-c C-f C-i"]
+      ["Slanted"    (TeX-font t ?\C-s) :keys "C-u C-c C-f C-s"]
+      ["Roman"      (TeX-font t ?\C-r) :keys "C-u C-c C-f C-r"]
+      ["Calligraphic" (TeX-font t ?\C-a) :keys "C-u C-c C-f C-a"])
+     ["Delete Font" (TeX-font t ?\C-d) :keys "C-c C-f C-d"]
+     "-"
+     ["Comment or Uncomment Region"
+      TeX-comment-or-uncomment-region
+      :help "Make the selected region outcommented or active again"]
+     ["Comment or Uncomment Paragraph"
+      TeX-comment-or-uncomment-paragraph
+      :help "Make the current paragraph outcommented or active again"]
+     ("Formatting and Marking"
+      ["Format Environment" LaTeX-fill-environment
+       :help "Fill and indent the current environment"]
+      ["Format Paragraph" LaTeX-fill-paragraph
+       :help "Fill and ident the current paragraph"]
+      ["Format Region" LaTeX-fill-region
+       :help "Fill and indent the currently selected region"]
+      ["Format Section" LaTeX-fill-section
+       :help "Fill and indent the current section"]
+      "-"
+      ["Mark Environment" LaTeX-mark-environment
+       :help "Mark the current environment"]
+      ["Mark Section" LaTeX-mark-section
+       :help "Mark the current section"]
+      "-"
+      ["Beginning of Environment" LaTeX-find-matching-begin
+       :help "Move point to the beginning of the current environment"]
+      ["End of Environment" LaTeX-find-matching-end
+       :help "Move point to the end of the current environment"])
+     ,TeX-fold-menu
+     ["Math Mode" LaTeX-math-mode
+      :style toggle :selected LaTeX-math-mode
+      :help "Toggle math mode"]
+     "-"
+      [ "Convert 209 to 2e" LaTeX-209-to-2e
+        :visible (member "latex2" (TeX-style-list)) ]
+      . ,TeX-common-menu-entries)))
+
+(defcustom LaTeX-font-list
+  '((?\C-a ""              ""  "\\mathcal{"    "}")
+    (?\C-b "\\textbf{"     "}" "\\mathbf{"     "}")
+    (?\C-c "\\textsc{"     "}")
+    (?\C-e "\\emph{"       "}")
+    (?\C-f "\\textsf{"     "}" "\\mathsf{"     "}")
+    (?\C-i "\\textit{"     "}" "\\mathit{"     "}")
+    (?\C-m "\\textmd{"     "}")
+    (?\C-n "\\textnormal{" "}" "\\mathnormal{" "}")
+    (?\C-r "\\textrm{"     "}" "\\mathrm{"     "}")
+    (?\C-s "\\textsl{"     "}" "\\mathbb{"     "}")
+    (?\C-t "\\texttt{"     "}" "\\mathtt{"     "}")
+    (?\C-u "\\textup{"     "}")
+    (?\C-d "" "" t))
+  "Font commands used with LaTeX2e.  See `TeX-font-list'."
+  :group 'LaTeX-macro
+  :type '(repeat
+          (group
+           :value (?\C-a "" "")
+           (character :tag "Key")
+           (string :tag "Prefix")
+           (string :tag "Suffix")
+           (option (group
+                    :inline t
+                    (string :tag "Math Prefix")
+                    (string :tag "Math Suffix")))
+           (option (sexp :format "Replace\n" :value t)))))
+
+
+;;; Simple Commands
+
+(defcustom LaTeX-babel-hyphen "\"="
+  "String to be used when typing `-'.
+This usually is a hyphen alternative or hyphenation aid, like
+\"=, \"~ or \"-, provided by babel and the related language style
+files.
+
+Set it to an empty string or nil in order to disable this
+feature.  Alter `LaTeX-babel-hyphen-language-alist' in case you
+want to change the behavior for a specific language only."
+  :group 'LaTeX-macro
+  :type 'string)
+
+(defcustom LaTeX-babel-hyphen-after-hyphen t
+  "Control insertion of hyphen strings.
+If non-nil insert normal hyphen on first key press and swap it
+with the language-specific hyphen string specified in the
+variable `LaTeX-babel-hyphen' on second key press.  If nil do it
+the other way round."
+  :group 'LaTeX-macro
+  :type 'boolean)
+
+(defcustom LaTeX-babel-hyphen-language-alist nil
+  "Alist controlling hyphen insertion for specific languages.
+It may be used to override the defaults given by `LaTeX-babel-hyphen'
+and `LaTeX-babel-hyphen-after-hyphen' respectively.  The first item
+in each element is a string specifying the language as set by the
+language-specific style file.  The second item is the string to be
+used instead of `LaTeX-babel-hyphen'.  The third element is the
+value overriding `LaTeX-bybel-hyphen-after-hyphen'."
+  :group 'LaTeX-macro
+  :type '(alist :key-type (string :tag "Language")
+               :value-type (group (string :tag "Hyphen string")
+                                  (boolean :tag "Insert plain hyphen first"
+                                           :value t))))
+
+(defvar LaTeX-babel-hyphen-language nil
+  "String determining language-specific behavior of hyphen insertion.
+It serves as an indicator that the babel hyphenation string
+should be used and as a means to find a potential customization
+in `LaTeX-babel-hyphen-language-alist' related to the active
+language.  It is usually set by language-related style files.")
+(make-variable-buffer-local 'LaTeX-babel-hyphen-language)
+
+(defun LaTeX-babel-insert-hyphen (force)
+  "Insert a hyphen string.
+The string can be either a normal hyphen or the string specified
+in `LaTeX-babel-hyphen'.  Wether one or the other is chosen
+depends on the value of `LaTeX-babel-hyphen-after-hyphen' and
+the buffer context.
+If prefix argument FORCE is non-nil, always insert a regular hyphen."
+  (interactive "*P")
+  (if (or force
+         (zerop (length LaTeX-babel-hyphen))
+         (not LaTeX-babel-hyphen-language)
+         ;; FIXME: It would be nice to check for verbatim constructs in the
+         ;; non-font-locking case, but things like `LaTeX-current-environment'
+         ;; are rather expensive in large buffers.
+         (and (fboundp 'font-latex-faces-present-p)
+              (font-latex-faces-present-p '(font-latex-verbatim-face
+                                            font-latex-math-face
+                                            font-lock-comment-face)))
+         (texmathp)
+         (TeX-in-comment))
+      (call-interactively 'self-insert-command)
+    (let* ((lang (assoc LaTeX-babel-hyphen-language
+                       LaTeX-babel-hyphen-language-alist))
+          (hyphen (if lang (nth 1 lang) LaTeX-babel-hyphen))
+          (h-after-h (if lang (nth 2 lang) LaTeX-babel-hyphen-after-hyphen))
+          (hyphen-length (length hyphen)))
+      (cond
+       ;; "= --> -- / -
+       ((string= (buffer-substring (max (- (point) hyphen-length) (point-min))
+                                  (point))
+                hyphen)
+       (if h-after-h
+           (progn (delete-backward-char hyphen-length)
+                  (insert "--"))
+         (delete-backward-char hyphen-length)
+         (call-interactively 'self-insert-command)))
+       ;; -- --> [+]-
+       ((string= (buffer-substring (max (- (point) 2) (point-min))
+                                  (point))
+                "--")
+       (call-interactively 'self-insert-command))
+       ;; - --> "= / [+]-
+       ((eq (char-before) ?-)
+       (if h-after-h
+           (progn (delete-backward-char 1)
+                  (insert hyphen))
+         (call-interactively 'self-insert-command)))
+       (h-after-h
+       (call-interactively 'self-insert-command))
+       (t (insert hyphen))))))
+;; Cater for Delete Selection mode
+(put 'LaTeX-babel-insert-hyphen 'delete-selection t)
+
+(defcustom LaTeX-enable-toolbar t
+  "Enable LaTeX tool bar."
+  :group 'TeX-tool-bar
+  :type 'boolean)
+
+(defun LaTeX-maybe-install-toolbar ()
+  "Conditionally install tool bar buttons for LaTeX mode.
+Install tool bar if `LaTeX-enable-toolbar' is non-nil."
+  (when LaTeX-enable-toolbar
+    ;; Defined in `tex-bar.el':
+    (LaTeX-install-toolbar)))
+
+;;; Mode
+
+(defgroup LaTeX-macro nil
+  "Special support for LaTeX macros in AUCTeX."
+  :prefix "TeX-"
+  :group 'LaTeX
+  :group 'TeX-macro)
+
+(defcustom TeX-arg-cite-note-p nil
+  "*If non-nil, ask for optional note in citations."
+  :type 'boolean
+  :group 'LaTeX-macro)
+
+(defcustom TeX-arg-footnote-number-p nil
+  "*If non-nil, ask for optional number in footnotes."
+  :type 'boolean
+  :group 'LaTeX-macro)
+
+(defcustom TeX-arg-item-label-p nil
+  "*If non-nil, always ask for optional label in items.
+Otherwise, only ask in description environments."
+  :type 'boolean
+  :group 'LaTeX-macro)
+
+(defcustom TeX-arg-right-insert-p t
+  "*If non-nil, always insert automatically the corresponding \\right.
+This happens when \\left is inserted."
+  :type 'boolean
+  :group 'LaTeX-macro)
+
+(defcustom LaTeX-mode-hook nil
+  "A hook run in LaTeX mode buffers."
+  :type 'hook
+  :group 'LaTeX)
+
+;;;###autoload
+(add-to-list 'auto-mode-alist '("\\.drv\\'" . latex-mode))
+
+;;;###autoload
+(defun TeX-latex-mode ()
+  "Major mode in AUCTeX for editing LaTeX files.
+See info under AUCTeX for full documentation.
+
+Special commands:
+\\{LaTeX-mode-map}
+
+Entering LaTeX mode calls the value of `text-mode-hook',
+then the value of `TeX-mode-hook', and then the value
+of `LaTeX-mode-hook'."
+  (interactive)
+  (LaTeX-common-initialization)
+  (setq TeX-base-mode-name "LaTeX")
+  (setq major-mode 'latex-mode)
+  (setq TeX-command-default "LaTeX")
+  (setq TeX-sentinel-default-function 'TeX-LaTeX-sentinel)
+  (add-hook 'tool-bar-mode-on-hook 'LaTeX-maybe-install-toolbar nil t)
+  (when (if (featurep 'xemacs)
+           (featurep 'toolbar)
+         (and (boundp 'tool-bar-mode) tool-bar-mode))
+    (LaTeX-maybe-install-toolbar))
+  (TeX-run-mode-hooks 'text-mode-hook 'TeX-mode-hook 'LaTeX-mode-hook)
+  (TeX-set-mode-name)
+  ;; Defeat filladapt
+  (if (and (boundp 'filladapt-mode)
+          filladapt-mode)
+      (turn-off-filladapt-mode)))
+
+;;;###autoload
+(add-to-list 'auto-mode-alist '("\\.dtx\\'" . doctex-mode))
+
+;;;###autoload
+(define-derived-mode docTeX-mode TeX-latex-mode "docTeX"
+  "Major mode in AUCTeX for editing .dtx files derived from `LaTeX-mode'.
+Runs `LaTeX-mode', sets a few variables and
+runs the hooks in `docTeX-mode-hook'."
+  (setq major-mode 'doctex-mode)
+  (set (make-local-variable 'LaTeX-insert-into-comments) t)
+  (set (make-local-variable 'LaTeX-syntactic-comments) t)
+  (setq TeX-default-extension docTeX-default-extension)
+  ;; Make filling and indentation aware of DocStrip guards.
+  (setq paragraph-start (concat paragraph-start "\\|%<")
+       paragraph-separate (concat paragraph-separate "\\|%<")
+       TeX-comment-start-regexp "\\(?:%\\(?:<[^>]+>\\)?\\)")
+  (setq TeX-base-mode-name "docTeX")
+  (TeX-set-mode-name)
+  (funcall TeX-install-font-lock))
+
+;;This is actually a mess: to fit the scheme properly, our derived
+;;mode definition would have had to be made for TeX-doctex-mode in the
+;;first place, but then we could not have used define-derived-mode, or
+;;all mode-specific variables would have gotten non-AUCTeX names.
+;;This solution has the advantage that documentation strings are
+;;provided in the autoloads, and has the disadvantage that docTeX-mode
+;;is not aliased to doctex-mode (not even when the AUCTeX version is
+;;disabled) as would be normal for our scheme.
+
+;;;###autoload
+(defalias 'TeX-doctex-mode 'docTeX-mode)
+
+(defcustom docTeX-clean-intermediate-suffixes
+  TeX-clean-default-intermediate-suffixes
+  "List of regexps matching suffixes of files to be deleted.
+The regexps will be anchored at the end of the file name to be matched,
+i.e. you do _not_ have to cater for this yourself by adding \\\\' or $."
+  :type '(repeat regexp)
+  :group 'TeX-command)
+
+(defcustom docTeX-clean-output-suffixes TeX-clean-default-output-suffixes
+  "List of regexps matching suffixes of files to be deleted.
+The regexps will be anchored at the end of the file name to be matched,
+i.e. you do _not_ have to cater for this yourself by adding \\\\' or $."
+  :type '(repeat regexp)
+  :group 'TeX-command)
+
+(defvar LaTeX-header-end
+  (concat "^[^%\n]*" (regexp-quote TeX-esc) "begin *"
+         TeX-grop "document" TeX-grcl)
+  "Default end of header marker for LaTeX documents.")
+
+(defvar LaTeX-trailer-start
+  (concat "^[^%\n]*" (regexp-quote TeX-esc) "end *"
+         TeX-grop "document" TeX-grcl)
+  "Default start of trailer marker for LaTeX documents.")
+
+(defcustom LaTeX-clean-intermediate-suffixes
+  TeX-clean-default-intermediate-suffixes
+  "List of regexps matching suffixes of files to be deleted.
+The regexps will be anchored at the end of the file name to be matched,
+i.e. you do _not_ have to cater for this yourself by adding \\\\' or $."
+  :type '(repeat regexp)
+  :group 'TeX-command)
+
+(defcustom LaTeX-clean-output-suffixes TeX-clean-default-output-suffixes
+  "List of regexps matching suffixes of files to be deleted.
+The regexps will be anchored at the end of the file name to be matched,
+i.e. you do _not_ have to cater for this yourself by adding \\\\' or $."
+  :type '(repeat regexp)
+  :group 'TeX-command)
+
+(defun LaTeX-common-initialization ()
+  "Common initialization for LaTeX derived modes."
+  (VirTeX-common-initialization)
+  (set-syntax-table LaTeX-mode-syntax-table)
+  (make-local-variable 'indent-line-function)
+  (setq indent-line-function 'LaTeX-indent-line)
+
+  ;; Filling
+  (make-local-variable 'paragraph-ignore-fill-prefix)
+  (setq paragraph-ignore-fill-prefix t)
+  (make-local-variable 'fill-paragraph-function)
+  (setq fill-paragraph-function 'LaTeX-fill-paragraph)
+  (make-local-variable 'adaptive-fill-mode)
+  (setq adaptive-fill-mode nil)
+
+  (or LaTeX-largest-level
+      (setq LaTeX-largest-level (LaTeX-section-level "section")))
+
+  (setq TeX-header-end LaTeX-header-end
+       TeX-trailer-start LaTeX-trailer-start)
+
+  (require 'outline)
+  (make-local-variable 'outline-level)
+  (setq outline-level 'LaTeX-outline-level)
+  (make-local-variable 'outline-regexp)
+  (setq outline-regexp (LaTeX-outline-regexp t))
+  (when (boundp 'outline-heading-alist)
+    (setq outline-heading-alist
+         (mapcar (lambda (x)
+                   (cons (concat "\\" (nth 0 x)) (nth 1 x)))
+                 LaTeX-section-list)))
+
+  (make-local-variable 'TeX-auto-full-regexp-list)
+  (setq TeX-auto-full-regexp-list
+       (append LaTeX-auto-regexp-list plain-TeX-auto-regexp-list))
+
+  (LaTeX-set-paragraph-start)
+  (setq paragraph-separate
+       (concat
+        "[ \t]*%*[ \t]*\\("
+        "\\$\\$" ; Plain TeX display math
+        "\\|$\\)"))
+
+  (setq TeX-verbatim-p-function 'LaTeX-verbatim-p)
+  (setq TeX-search-forward-comment-start-function
+       'LaTeX-search-forward-comment-start)
+
+  (make-local-variable 'LaTeX-item-list)
+  (setq LaTeX-item-list '(("description" . LaTeX-item-argument)
+                         ("thebibliography" . LaTeX-item-bib)))
+
+  (setq TeX-complete-list
+       (append '(("\\\\cite\\[[^]\n\r\\%]*\\]{\\([^{}\n\r\\%,]*\\)"
+                  1 LaTeX-bibitem-list "}")
+                 ("\\\\cite{\\([^{}\n\r\\%,]*\\)" 1 LaTeX-bibitem-list "}")
+                 ("\\\\cite{\\([^{}\n\r\\%]*,\\)\\([^{}\n\r\\%,]*\\)"
+                  2 LaTeX-bibitem-list)
+                 ("\\\\nocite{\\([^{}\n\r\\%,]*\\)" 1 LaTeX-bibitem-list "}")
+                 ("\\\\nocite{\\([^{}\n\r\\%]*,\\)\\([^{}\n\r\\%,]*\\)"
+                  2 LaTeX-bibitem-list)
+                 ("\\\\ref{\\([^{}\n\r\\%,]*\\)" 1 LaTeX-label-list "}")
+                 ("\\\\eqref{\\([^{}\n\r\\%,]*\\)" 1 LaTeX-label-list "}")
+                 ("\\\\pageref{\\([^{}\n\r\\%,]*\\)" 1 LaTeX-label-list "}")
+                 ("\\\\\\(index\\|glossary\\){\\([^{}\n\r\\%]*\\)"
+                  2 LaTeX-index-entry-list "}")
+                 ("\\\\begin{\\([A-Za-z]*\\)" 1 LaTeX-environment-list "}")
+                 ("\\\\end{\\([A-Za-z]*\\)" 1 LaTeX-environment-list "}")
+                 ("\\\\renewcommand\\*?{\\\\\\([A-Za-z]*\\)"
+                  1 LaTeX-symbol-list "}")
+                 ("\\\\renewenvironment\\*?{\\([A-Za-z]*\\)"
+                  1 LaTeX-environment-list "}"))
+               TeX-complete-list))
+
+  (LaTeX-add-environments
+   '("document" LaTeX-env-document)
+   '("enumerate" LaTeX-env-item)
+   '("itemize" LaTeX-env-item)
+   '("list" LaTeX-env-list)
+   '("trivlist" LaTeX-env-item)
+   '("picture" LaTeX-env-picture)
+   '("tabular" LaTeX-env-array)
+   '("tabular*" LaTeX-env-tabular*)
+   '("array" LaTeX-env-array)
+   '("eqnarray" LaTeX-env-label)
+   '("equation" LaTeX-env-label)
+   '("minipage" LaTeX-env-minipage)
+
+   ;; The following have no special support, but are included in
+   ;; case the auto files are missing.
+
+   "sloppypar" "picture" "tabbing" "verbatim" "verbatim*"
+   "flushright" "flushleft" "displaymath" "math" "quote" "quotation"
+   "abstract" "center" "titlepage" "verse" "eqnarray*"
+
+   ;; The following are not defined in latex.el, but in a number of
+   ;; other style files.  I'm to lazy to copy them to all the
+   ;; corresponding .el files right now.
+
+   ;; This means that AUCTeX will complete e.g.
+   ;; ``thebibliography'' in a letter, but I guess we can live with
+   ;; that.
+
+   '("description" LaTeX-env-item)
+   '("figure" LaTeX-env-figure)
+   '("figure*" LaTeX-env-figure)
+   '("table" LaTeX-env-figure)
+   '("table*" LaTeX-env-figure)
+   '("thebibliography" LaTeX-env-bib)
+   '("theindex" LaTeX-env-item))
+
+  (TeX-add-symbols
+   '("addtocounter" TeX-arg-counter "Value")
+   '("alph" TeX-arg-counter)
+   '("arabic" TeX-arg-counter)
+   '("fnsymbol" TeX-arg-counter)
+   '("newcounter" TeX-arg-define-counter
+     [ TeX-arg-counter "Within counter" ])
+   '("roman" TeX-arg-counter)
+   '("setcounter" TeX-arg-counter "Value")
+   '("usecounter" TeX-arg-counter)
+   '("value" TeX-arg-counter)
+   '("stepcounter" TeX-arg-counter)
+   '("refstepcounter" TeX-arg-counter)
+   '("label" TeX-arg-define-label)
+   '("pageref" TeX-arg-ref)
+   '("ref" TeX-arg-ref)
+   '("newcommand" TeX-arg-define-macro [ "Number of arguments" ] t)
+   '("renewcommand" TeX-arg-macro [ "Number of arguments" ] t)
+   '("newenvironment" TeX-arg-define-environment
+     [ "Number of arguments"] t t)
+   '("renewenvironment" TeX-arg-environment
+     [ "Number of arguments"] t t)
+   '("providecommand" TeX-arg-define-macro [ "Number of arguments" ] t)
+   '("providecommand*" TeX-arg-define-macro [ "Number of arguments" ] t)
+   '("newcommand*" TeX-arg-define-macro [ "Number of arguments" ] t)
+   '("renewcommand*" TeX-arg-macro [ "Number of arguments" ] t)
+   '("newenvironment*" TeX-arg-define-environment
+     [ "Number of arguments"] t t)
+   '("renewenvironment*" TeX-arg-environment
+     [ "Number of arguments"] t t)
+   '("newtheorem" TeX-arg-define-environment
+     [ TeX-arg-environment "Numbered like" ]
+     t [ (TeX-arg-eval progn (if (eq (save-excursion
+                                      (backward-char 2)
+                                      (preceding-char)) ?\])
+                                ()
+                              (TeX-arg-counter t "Within counter"))
+                      "") ])
+   '("newfont" TeX-arg-define-macro t)
+   '("circle" "Diameter")
+   '("circle*" "Diameter")
+   '("dashbox" "Dash Length" TeX-arg-size
+     [ TeX-arg-corner ] t)
+   '("frame" t)
+   '("framebox" (TeX-arg-conditional
+                (string-equal (LaTeX-current-environment) "picture")
+                (TeX-arg-size [ TeX-arg-corner ] t)
+                ([ "Length" ] [ TeX-arg-lr ] t)))
+   '("line" (TeX-arg-pair "X slope" "Y slope") "Length")
+   '("linethickness" "Dimension")
+   '("makebox" (TeX-arg-conditional
+               (string-equal (LaTeX-current-environment) "picture")
+               (TeX-arg-size [ TeX-arg-corner ] t)
+               ([ "Length" ] [ TeX-arg-lr ] t)))
+   '("multiput"
+     TeX-arg-coordinate
+     (TeX-arg-pair "X delta" "Y delta")
+     "Number of copies"
+     t)
+   '("oval" TeX-arg-size [ TeX-arg-corner "Portion" ])
+   '("put" TeX-arg-coordinate t)
+   '("savebox" TeX-arg-savebox
+     (TeX-arg-conditional
+      (string-equal (LaTeX-current-environment) "picture")
+      (TeX-arg-size [ TeX-arg-corner ] t)
+      ([ "Length" ] [ TeX-arg-lr ] t)))
+   '("shortstack" [ TeX-arg-lr ] t)
+   '("vector" (TeX-arg-pair "X slope" "Y slope") "Length")
+   '("cline" "Span `i-j'")
+   '("multicolumn" "Columns" "Format" t)
+   '("item"
+     (TeX-arg-conditional (or TeX-arg-item-label-p
+                             (string-equal (LaTeX-current-environment)
+                                           "description"))
+                         ([ "Item label" ])
+                         ())
+     (TeX-arg-literal " "))
+   '("bibitem" [ "Bibitem label" ] TeX-arg-define-cite)
+   '("cite"
+     (TeX-arg-conditional TeX-arg-cite-note-p ([ "Note" ]) ())
+     TeX-arg-cite)
+   '("nocite" TeX-arg-cite)
+   '("bibliographystyle" TeX-arg-bibstyle)
+   '("bibliography" TeX-arg-bibliography)
+   '("footnote"
+     (TeX-arg-conditional TeX-arg-footnote-number-p ([ "Number" ]) nil)
+     t)
+   '("footnotetext"
+     (TeX-arg-conditional TeX-arg-footnote-number-p ([ "Number" ]) nil)
+     t)
+   '("footnotemark"
+     (TeX-arg-conditional TeX-arg-footnote-number-p ([ "Number" ]) nil))
+   '("newlength" TeX-arg-define-macro)
+   '("setlength" TeX-arg-macro "Length")
+   '("addtolength" TeX-arg-macro "Length")
+   '("settowidth" TeX-arg-macro t)
+   '("\\" [ "Space" ])
+   '("\\*" [ "Space" ])
+   '("hyphenation" t)
+   '("linebreak" [ "How much [0 - 4]" ])
+   '("nolinebreak" [ "How much [0 - 4]" ])
+   '("nopagebreak" [ "How much [0 - 4]" ])
+   '("pagebreak" [ "How much [0 - 4]" ])
+   '("stackrel" t nil)
+   '("frac" t nil)
+   '("lefteqn" t)
+   '("overbrace" t)
+   '("overline" t)
+   '("overleftarrow" t)
+   '("overrightarrow" t)
+   '("sqrt" [ "Root" ] t)
+   '("underbrace" t)
+   '("underline" t)
+   '("author" t)
+   '("date" t)
+   '("thanks" t)
+   '("title" t)
+   '("pagenumbering" (TeX-arg-eval
+                     completing-read "Numbering style: "
+                     '(("arabic") ("roman") ("Roman") ("alph") ("Alph"))))
+   '("pagestyle" TeX-arg-pagestyle)
+   '("markboth" t nil)
+   '("markright" t)
+   '("thispagestyle" TeX-arg-pagestyle)
+   '("addvspace" "Length")
+   '("fbox" t)
+   '("hspace*" "Length")
+   '("hspace" "Length")
+   '("mbox" t)
+   '("newsavebox" TeX-arg-define-savebox)
+   '("parbox" [ TeX-arg-tb ] [ "Height" ] [ TeX-arg-tb "Inner position" ]
+     "Width" t)
+   '("raisebox" "Raise" [ "Height above" ] [ "Depth below" ] t)
+   '("rule" [ "Raise" ] "Width" "Thickness")
+   '("sbox" TeX-arg-savebox t)
+   '("usebox" TeX-arg-savebox)
+   '("vspace*" "Length")
+   '("vspace" "Length")
+   '("documentstyle" TeX-arg-document)
+   '("include" (TeX-arg-input-file "File" t))
+   '("includeonly" t)
+   '("input" TeX-arg-input-file)
+   '("addcontentsline" TeX-arg-file
+     (TeX-arg-eval
+      completing-read "Numbering style: " LaTeX-section-list)
+     t)
+   '("addtocontents" TeX-arg-file t)
+   '("typeout" t)
+   '("typein" [ TeX-arg-define-macro ] t)
+   '("verb" TeX-arg-verb)
+   '("verb*" TeX-arg-verb)
+   '("extracolsep" t)
+   '("index" TeX-arg-index)
+   '("glossary" TeX-arg-index)
+   '("numberline" "Section number" "Heading")
+   '("caption" t)
+   '("marginpar" [ "Left margin text" ] "Text")
+   '("left" TeX-arg-insert-braces)
+
+   ;; These have no special support, but are included in case the
+   ;; auto files are missing.
+
+   "TeX" "LaTeX"
+   "samepage" "newline"
+   "smallskip" "medskip" "bigskip" "fill" "stretch"
+   "thinspace" "negthinspace" "enspace" "enskip" "quad" "qquad"
+   "nonumber" "centering" "raggedright"
+   "raggedleft" "kill" "pushtabs" "poptabs" "protect" "arraystretch"
+   "hline" "vline" "cline" "thinlines" "thicklines" "and" "makeindex"
+   "makeglossary" "reversemarginpar" "normalmarginpar"
+   "raggedbottom" "flushbottom" "sloppy" "fussy" "newpage"
+   "clearpage" "cleardoublepage" "twocolumn" "onecolumn"
+
+   "maketitle" "tableofcontents" "listoffigures" "listoftables"
+   "tiny" "scriptsize" "footnotesize" "small"
+   "normalsize" "large" "Large" "LARGE" "huge" "Huge"
+   "pounds" "copyright"
+   "hfil" "hfill" "vfil" "vfill" "hrulefill" "dotfill"
+   "indent" "noindent" "today"
+   "appendix"
+   "dots")
+
+  (when (string-equal LaTeX-version "2e")
+    (LaTeX-add-environments
+     '("filecontents" LaTeX-env-contents)
+     '("filecontents*" LaTeX-env-contents))
+
+    (TeX-add-symbols
+     '("enlargethispage" "Length")
+     '("enlargethispage*" "Length")
+     '("tabularnewline" [ "Length" ])
+     '("suppressfloats" [ TeX-arg-tb "Suppress floats position" ])
+     '("ensuremath" "Math commands")
+     '("textsuperscript" "Text")
+     '("textcircled" "Text")
+
+     "LaTeXe"
+     "listfiles" "frontmatter" "mainmatter" "backmatter"
+     "textcompwordmark" "textvisiblespace" "textemdash" "textendash"
+     "textexclamdown" "textquestiondown" "textquotedblleft"
+     "textquotedblright" "textquoteleft" "textquoteright"
+     "textbullet" "textperiodcentered"
+     "textbackslash" "textbar" "textless" "textgreater"
+     "textasciicircum" "textasciitilde"
+     "textregistered" "texttrademark"
+     "rmfamily" "sffamily" "ttfamily" "mdseries" "bfseries"
+     "itshape" "slshape" "upshape" "scshape"))
+
+  (TeX-run-style-hooks "LATEX")
+
+  (make-local-variable 'TeX-font-list)
+  (make-local-variable 'TeX-font-replace-function)
+  (if (string-equal LaTeX-version "2")
+      ()
+    (setq TeX-font-list LaTeX-font-list)
+    (setq TeX-font-replace-function 'TeX-font-replace-macro)
+    (TeX-add-symbols
+     '("newcommand" TeX-arg-define-macro
+       [ "Number of arguments" ] [ "Default value for first argument" ] t)
+     '("renewcommand" TeX-arg-macro
+       [ "Number of arguments" ] [ "Default value for first argument" ] t)
+     '("providecommand" TeX-arg-define-macro
+       [ "Number of arguments" ] [ "Default value for first argument" ] t)
+     '("providecommand*" TeX-arg-define-macro
+       [ "Number of arguments" ] [ "Default value for first argument" ] t)
+     '("newcommand*" TeX-arg-define-macro
+       [ "Number of arguments" ] [ "Default value for first argument" ] t)
+     '("renewcommand*" TeX-arg-macro
+       [ "Number of arguments" ] [ "Default value for first argument" ] t)
+     '("usepackage" LaTeX-arg-usepackage)
+     '("RequirePackage" LaTeX-arg-usepackage)
+     '("documentclass" TeX-arg-document)))
+
+  (TeX-add-style-hook "latex2e"
+   ;; Use new fonts for `\documentclass' documents.
+   (lambda ()
+     (setq TeX-font-list LaTeX-font-list)
+     (setq TeX-font-replace-function 'TeX-font-replace-macro)
+     (run-hooks 'LaTeX2e-hook)))
+
+  (TeX-add-style-hook "latex2"
+   ;; Use old fonts for `\documentstyle' documents.
+   (lambda ()
+     (setq TeX-font-list (default-value 'TeX-font-list))
+     (setq TeX-font-replace-function
+          (default-value 'TeX-font-replace-function))
+     (run-hooks 'LaTeX2-hook)))
+
+  ;; There must be something better-suited, but I don't understand the
+  ;; parsing properly.  -- dak
+  (TeX-add-style-hook "pdftex" 'TeX-PDF-mode-on)
+  (TeX-add-style-hook "pdftricks" 'TeX-PDF-mode-on)
+  (TeX-add-style-hook "pst-pdf" 'TeX-PDF-mode-on)
+  (TeX-add-style-hook "dvips" 'TeX-PDF-mode-off)
+;; This is now done in style/pstricks.el because it prevents other
+;; pstricks style files from being loaded.
+;;   (TeX-add-style-hook "pstricks" 'TeX-PDF-mode-off)
+  (TeX-add-style-hook "psfrag" 'TeX-PDF-mode-off)
+  (TeX-add-style-hook "dvipdf" 'TeX-PDF-mode-off)
+  (TeX-add-style-hook "dvipdfm" 'TeX-PDF-mode-off)
+;;  (TeX-add-style-hook "DVIoutput" 'TeX-PDF-mode-off)
+;;
+;;  Well, DVIoutput indicates that we want to run PDFTeX and expect to
+;;  get DVI output.  Ugh.
+  (TeX-add-style-hook "ifpdf" (lambda ()
+                               (TeX-PDF-mode-on)
+                               (TeX-PDF-mode-off)))
+;; ifpdf indicates that we cater for either.  So calling both
+;; functions will make sure that the default will get used unless the
+;; user overrode it.
+
+  (set (make-local-variable 'imenu-create-index-function)
+       'LaTeX-imenu-create-index-function)
+
+  (use-local-map LaTeX-mode-map)
+  ;; Calling `easy-menu-add' may result in the menu filters being
+  ;; executed which call `TeX-update-style'.  So this is placed very
+  ;; late in mode initialization to assure that all relevant variables
+  ;; are properly initialized before style files try to alter them.
+  (easy-menu-add LaTeX-mode-menu LaTeX-mode-map)
+  (easy-menu-add LaTeX-mode-command-menu LaTeX-mode-map))
+
+(defun LaTeX-imenu-create-index-function ()
+  "Imenu support function for LaTeX."
+  (TeX-update-style)
+  (let (entries level
+       (regexp (LaTeX-outline-regexp)))
+    (goto-char (point-max))
+    (while (re-search-backward regexp nil t)
+      (let* ((name (LaTeX-outline-name))
+            (level (make-string (1- (LaTeX-outline-level)) ?\ ))
+            (label (concat level level name))
+            (mark (make-marker)))
+       (set-marker mark (point))
+       (set-text-properties 0 (length label) nil label)
+       (setq entries (cons (cons label mark) entries))))
+    entries))
+
+(defvar LaTeX-builtin-opts
+  '("12pt" "11pt" "10pt" "twocolumn" "twoside" "draft")
+  "Built in options for LaTeX standard styles.")
+
+(defun LaTeX-209-to-2e ()
+  "Make a stab at changing 2.09 doc header to 2e style."
+  (interactive)
+  (TeX-home-buffer)
+  (let (optstr optlist 2eoptlist 2epackages docline docstyle)
+    (goto-char (point-min))
+    (if
+       (search-forward-regexp
+        "\\documentstyle\\[\\([^]]*\\)\\]{\\([^}]*\\)}"
+        (point-max) t)
+       (setq optstr (TeX-match-buffer 1)
+             docstyle (TeX-match-buffer 2)
+             optlist (TeX-split-string "," optstr))
+      (if (search-forward-regexp
+          "\\documentstyle{\\([^}]*\\)}"
+          (point-max) t)
+         (setq docstyle (TeX-match-buffer 1))
+       (error "No documentstyle defined")))
+    (beginning-of-line 1)
+    (setq docline (point))
+    (insert "%%%")
+    (while optlist
+      (if (member (car optlist) LaTeX-builtin-opts)
+         (setq 2eoptlist (cons (car optlist) 2eoptlist))
+       (setq 2epackages (cons (car optlist) 2epackages)))
+      (setq optlist (cdr optlist)))
+    ;;(message (format "%S %S" 2eoptlist 2epackages))
+    (goto-char docline)
+    (forward-line 1)
+    (insert "\\documentclass")
+    (if 2eoptlist
+       (insert "["
+               (mapconcat (lambda (x) x)
+                          (nreverse 2eoptlist) ",") "]"))
+    (insert "{" docstyle "}\n")
+    (if 2epackages
+       (insert "\\usepackage{"
+               (mapconcat (lambda (x) x)
+                          (nreverse 2epackages) "}\n\\usepackage{") "}\n"))
+    (if (equal docstyle "slides")
+      (progn
+       (goto-char (point-min))
+       (while (re-search-forward "\\\\blackandwhite{" nil t)
+      (replace-match "\\\\input{" nil nil)))))
+  (TeX-normal-mode nil))
+
+(provide 'latex)
+
+;;; latex.el ends here
diff --git a/packages/auctex/latex/prauctex.cfg b/packages/auctex/latex/prauctex.cfg
new file mode 100644 (file)
index 0000000..495ae40
--- /dev/null
@@ -0,0 +1,48 @@
+%%
+%% This is file `prauctex.cfg',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% preview.dtx  (with options: `auccfg')
+%% 
+%% IMPORTANT NOTICE:
+%% 
+%% For the copyright see the source file.
+%% 
+%% Any modified versions of this file must be renamed
+%% with new filenames distinct from prauctex.cfg.
+%% 
+%% For distribution of the original source see the terms
+%% for copying and modification in the file preview.dtx.
+%% 
+%% This generated file may be distributed as long as the
+%% original source files, as listed above, are part of the
+%% same distribution. (The sources need not necessarily be
+%% in the same archive or directory.)
+%%    The preview style for extracting previews from LaTeX documents.
+%%    Developed as part of AUCTeX <URL:http://www.gnu.org/software/auctex>.
+\PreviewMacro*[[][#1{}]\footnote
+\PreviewMacro*[?[{@{[]}}{}][#1]\item
+\PreviewMacro*\emph
+\PreviewMacro*\textrm
+\PreviewMacro*\textit
+\PreviewMacro*\textsc
+\PreviewMacro*\textsf
+\PreviewMacro*\textsl
+\PreviewMacro*\texttt
+\PreviewMacro*\textcolor
+\PreviewMacro*\mbox
+\PreviewMacro*[][#1{}]\author
+\PreviewMacro*[][#1{}]\title
+\PreviewMacro*\and
+\PreviewMacro*\thanks
+\PreviewMacro*[][#1{}]\caption
+\preview@delay{\@ifundefined{pr@\string\@startsection}{%
+  \PreviewMacro*[!!!!!!*][#1{}]\@startsection}{}}
+\preview@delay{\@ifundefined{pr@\string\chapter}{%
+  \PreviewMacro*[*][#1{}]\chapter}{}}
+\PreviewMacro*\index
+\endinput
+%%
+%% End of file `prauctex.cfg'.
diff --git a/packages/auctex/latex/prauctex.def b/packages/auctex/latex/prauctex.def
new file mode 100644 (file)
index 0000000..4f8f7fa
--- /dev/null
@@ -0,0 +1,61 @@
+%%
+%% This is file `prauctex.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% preview.dtx  (with options: `auctex')
+%% 
+%% IMPORTANT NOTICE:
+%% 
+%% For the copyright see the source file.
+%% 
+%% Any modified versions of this file must be renamed
+%% with new filenames distinct from prauctex.def.
+%% 
+%% For distribution of the original source see the terms
+%% for copying and modification in the file preview.dtx.
+%% 
+%% This generated file may be distributed as long as the
+%% original source files, as listed above, are part of the
+%% same distribution. (The sources need not necessarily be
+%% in the same archive or directory.)
+%%    The preview style for extracting previews from LaTeX documents.
+%%    Developed as part of AUCTeX <URL:http://www.gnu.org/software/auctex>.
+\ifPreview\else\expandafter\endinput\fi
+\nofiles
+\preview@delay{\nonstopmode}
+\begingroup
+\lccode`\~=`\-
+\lccode`\{=`\<
+\lccode`\}=`\>
+\lowercase{\endgroup
+  \def\pr@msgi{{~}}}
+\def\pr@msgii{Preview:
+   Snippet \number\pr@snippet\space}
+\begingroup
+\catcode`\-=13
+\catcode`\<=13
+\@firstofone{\endgroup
+\def\pr@msg#1{{%
+   \let<\pr@msgi
+   \def-{\pr@msgii#1}%
+   \errhelp{Not a real error.}%
+   \errmessage<}}}
+\g@addto@macro\pr@ship@start{\pr@msg{started}}
+\g@addto@macro\pr@ship@end{\pr@msg{ended.%
+  (\number\ht\pr@box+\number\dp\pr@box x\number\wd\pr@box)}}
+\hbadness=\maxdimen
+\newcount\hbadness
+\vbadness=\maxdimen
+\let\vbadness=\hbadness
+\hfuzz=\maxdimen
+\newdimen\hfuzz
+\vfuzz=\maxdimen
+\let\vfuzz=\hfuzz
+\showboxdepth=-1
+\showboxbreadth=-1
+\pr@loadcfg{prauctex}
+\endinput
+%%
+%% End of file `prauctex.def'.
diff --git a/packages/auctex/latex/prcounters.def b/packages/auctex/latex/prcounters.def
new file mode 100644 (file)
index 0000000..f7b5726
--- /dev/null
@@ -0,0 +1,38 @@
+%%
+%% This is file `prcounters.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% preview.dtx  (with options: `counters')
+%% 
+%% IMPORTANT NOTICE:
+%% 
+%% For the copyright see the source file.
+%% 
+%% Any modified versions of this file must be renamed
+%% with new filenames distinct from prcounters.def.
+%% 
+%% For distribution of the original source see the terms
+%% for copying and modification in the file preview.dtx.
+%% 
+%% This generated file may be distributed as long as the
+%% original source files, as listed above, are part of the
+%% same distribution. (The sources need not necessarily be
+%% in the same archive or directory.)
+%%    The preview style for extracting previews from LaTeX documents.
+%%    Developed as part of AUCTeX <URL:http://www.gnu.org/software/auctex>.
+\ifPreview\else\expandafter\endinput\fi
+\def\pr@eltprint#1{\expandafter\@gobble\ifnum\value{#1}=0%
+  \csname pr@c@#1\endcsname\else\relax
+  \space{#1}{\arabic{#1}}\fi}
+\def\pr@eltdef#1{\expandafter\xdef
+  \csname pr@c@#1\endcsname{\arabic{#1}}}
+\def\pr@ckpt#1{{\let\@elt\pr@eltprint\edef\next{\cl@@ckpt}%
+  \ifx\next\@empty\else\typeout{Preview: Counters\next#1}%
+  \let\@elt\pr@eltdef\cl@@ckpt\fi}}
+\pr@addto@front\pr@ship@start{\pr@ckpt:}
+\pr@addto@front\pr@ship@end{\pr@ckpt.}
+\endinput
+%%
+%% End of file `prcounters.def'.
diff --git a/packages/auctex/latex/preview.sty b/packages/auctex/latex/preview.sty
new file mode 100644 (file)
index 0000000..3040298
--- /dev/null
@@ -0,0 +1,391 @@
+%%
+%% This is file `preview.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% preview.dtx  (with options: `style')
+%% preview.dtx  (with options: `style,active')
+%% 
+%% IMPORTANT NOTICE:
+%% 
+%% For the copyright see the source file.
+%% 
+%% Any modified versions of this file must be renamed
+%% with new filenames distinct from preview.sty.
+%% 
+%% For distribution of the original source see the terms
+%% for copying and modification in the file preview.dtx preview.dtx.
+%% 
+%% This generated file may be distributed as long as the
+%% original source files, as listed above, are part of the
+%% same distribution. (The sources need not necessarily be
+%% in the same archive or directory.)
+%%    The preview style for extracting previews from LaTeX documents.
+%%    Developed as part of AUCTeX <URL:http://www.gnu.org/software/auctex>.
+\NeedsTeXFormat{LaTeX2e} \def\reserved@a #1#2$#3:
+#4${\xdef#1{\reserved@c #2#4 $}} \def\reserved@c #1 #2${#1}
+\begingroup \catcode`\_=12
+\reserved@a\pr@version $Name: release_11_86 $ \ifx\pr@version\@empty
+\reserved@a\pr@version CVS-$Revision: 1.126 $ \endgroup \else
+  \def\next release_{} \lccode`\_=`.
+  \edef\next{\lowercase{\endgroup
+    \def\noexpand\pr@version{\expandafter\next\pr@version}}} \next \fi
+\reserved@a\next $Date: 2010/02/14 16:19:00 $
+\edef\next{\noexpand\ProvidesPackage{preview}%
+  [\next\space \pr@version\space (AUCTeX/preview-latex)]}
+\next
+\let\ifPreview\iffalse
+\let\preview@delay=\@gobble
+\let\pr@advise=\@gobbletwo
+\long\def\pr@advise@ship#1#2#3{}
+\def\pr@loadcfg#1{\InputIfFileExists{#1.cfg}{}{}}
+\DeclareOption{noconfig}{\let\pr@loadcfg=\@gobble}
+\long\def\pr@addto@front#1#2{%
+  \toks@{#2}\toks@\expandafter{\the\expandafter\toks@#1}%
+  \xdef#1{\the\toks@}}
+\DeclareOption{active}{%
+  \let\ifPreview\iftrue
+  \def\pr@advise#1{%
+    \expandafter\pr@adviseii\csname pr@\string#1\endcsname#1}%
+  \long\def\pr@advise@ship#1#2#3{\pr@advise#1{\pr@protect@ship{#2}{#3}}}%
+  \let\preview@delay\@firstofone}
+\long\def\pr@adviseii#1#2#3{\preview@delay{%
+  \ifx#1\relax \let#1#2\fi
+  \toks@{#3#1}%
+  \ifx\@undefined\protected \else \protected\fi
+  \long\edef#2{\the\toks@}}}
+\DeclareOption{delayed}{%
+  \ifPreview \def\preview@delay{\AtBeginDocument}\fi
+}
+\newif\ifpr@fixbb
+\pr@fixbbfalse
+\DeclareOption{psfixbb}{\ifPreview%
+  \pr@fixbbtrue
+  \newbox\pr@markerbox
+  \setbox\pr@markerbox\hbox{\special{psfile=/dev/null}}\fi
+}
+\let\pr@graphicstype=\z@
+\DeclareOption{dvips}{%
+  \let\pr@graphicstype\@ne
+  \preview@delay{\AtBeginDvi{%
+      \special{!/preview@version(\pr@version)def}
+      \special{!userdict begin/preview-bop-level 0 def%
+      /bop-hook{/preview-bop-level dup load dup 0 le{/isls false def%
+          /vsize 792 def/hsize 612 def}if 1 add store}bind def%
+      /eop-hook{/preview-bop-level dup load dup 0 gt{1 sub}if
+        store}bind def end}}}}
+\DeclareOption{pdftex}{%
+  \let\pr@graphicstype\tw@}
+\DeclareOption{xetex}{%
+  \let\pr@graphicstype\thr@@}
+\begingroup
+\catcode`\*=11
+\@firstofone{\endgroup
+\DeclareOption{displaymath}{%
+  \preview@delay{\toks@{%
+      \pr@startbox{\noindent$$%
+        \aftergroup\pr@endbox\@gobbletwo}{$$}\@firstofone}%
+    \everydisplay\expandafter{\the\expandafter\toks@
+      \expandafter{\the\everydisplay}}}%
+  \pr@advise@ship\equation{\begingroup\aftergroup\pr@endbox
+    \def\dt@ptrue{\m@ne=\m@ne}\noindent}%
+    {\endgroup}%
+  \pr@advise@ship\equation*{\begingroup\aftergroup\pr@endbox
+    \def\dt@ptrue{\m@ne=\m@ne}\noindent}%
+    {\endgroup}%
+  \PreviewOpen[][\def\dt@ptrue{\m@ne=\m@ne}\noindent#1]\[%
+  \PreviewClose\]%
+  \PreviewEnvironment[][\noindent#1]{eqnarray}%
+  \PreviewEnvironment[][\noindent#1]{eqnarray*}%
+  \PreviewEnvironment{displaymath}%
+}}
+\begingroup
+\def\next#1#2{%
+  \endgroup
+  \DeclareOption{textmath}{%
+    \PreviewEnvironment{math}%
+    \preview@delay{\ifx#1\@undefined \let#1=$%$
+      \fi\catcode`\$=\active
+      \ifx\xyreuncatcodes\@undefined\else
+        \edef\next{\catcode`@=\the\catcode`@\relax}%
+        \makeatother\expandafter\xyreuncatcodes\next\fi}%
+    \pr@advise@ship\(\pr@endaftergroup{}% \)
+    \pr@advise@ship#1{\@firstoftwo{\let#1=#2%
+        \futurelet\reserved@a\pr@textmathcheck}}{}}%
+  \def\pr@textmathcheck{\expandafter\pr@endaftergroup
+    \ifx\reserved@a#1{#2#2}\expandafter\@gobbletwo\fi#2}}
+\lccode`\~=`\$
+\lowercase{\expandafter\next\expandafter~}%
+  \csname pr@\string$%$
+  \endcsname
+\DeclareOption{graphics}{%
+  \PreviewMacro[*[[!]{\includegraphics}%]]
+}
+\def\pr@floatfix#1#2{\ifx#1#2%
+  \ifx#1\@undefined\else
+  \PackageWarningNoLine{preview}{%
+Your document class has a bad definition^^J
+of \string#1, most likely^^J
+\string\let\string#1=\string#2^^J
+which has now been changed to^^J
+\string\def\string#1{\string#2}^^J
+because otherwise subsequent changes to \string#2^^J
+(like done by several packages changing float behaviour)^^J
+can't take effect on \string#1.^^J
+Please complain to your document class author}%
+  \def#1{#2}\fi\fi}
+\begingroup
+\def\next#1#2{\endgroup
+  \DeclareOption{floats}{%
+    \pr@floatfix\endfigure\end@float
+    \pr@floatfix\endtable\end@float
+    \pr@floatfix#1\end@dblfloat
+    \pr@floatfix#2\end@dblfloat
+    \PreviewSnarfEnvironment[![]{@float}%]
+    \PreviewSnarfEnvironment[![]{@dblfloat}%]
+  }}
+\expandafter\next\csname endfigure*\expandafter\endcsname
+  \csname endtable*\endcsname
+\DeclareOption{sections}{%
+  \PreviewMacro[!!!!!!*[[!]{\@startsection}%]]
+  \PreviewMacro[*[[!]{\chapter}%]]
+}
+\DeclareOption*
+   {\InputIfFileExists{pr\CurrentOption.def}{}{\OptionNotUsed}}
+\def\PreviewMacro{\@ifstar\pr@starmacro\pr@macro}
+\long\def\pr@domacro#1#2{%
+   \long\def\next##1{#2}%
+   \pr@callafter\next#1]\pr@endparse}
+\newcommand\pr@macro[1][]{%
+   \toks@{\pr@domacro{#1}}%
+   \long\edef\next[##1]##2{%
+    \noexpand\pr@advise@ship{##2}{\the\toks@{##1\noexpand\pr@endbox}}{}}%
+   \@ifnextchar[\next\pr@macroii}
+\def\pr@macroii{\next[##1]}
+\long\def\pr@endmacro#1{#1\pr@endbox}
+\long\def\pr@protect@domacro#1#2{\pr@protect{%
+    \long\def\next##1{#2}%
+    \pr@callafter\next#1]\pr@endparse}}
+\newcommand\pr@starmacro[1][]{\toks@{\pr@protect@domacro{#1}}%
+    \long\edef\next[##1]##2{%
+      \noexpand\pr@advise##2{\the\toks@{##1}}}%
+    \@ifnextchar[\next{\next[]}}
+\def\PreviewOpen{\@ifstar\pr@starmacro\pr@open}
+\newcommand\pr@open[1][]{%
+   \toks@{\pr@domacro{#1}}%
+   \long\edef\next[##1]##2{%
+     \noexpand\pr@advise##2{\begingroup
+     \noexpand\pr@protect@ship
+        {\the\toks@{\begingroup\aftergroup\noexpand\pr@endbox##1}}%
+        {\endgroup}}}%
+   \@ifnextchar[\next\pr@macroii}
+\def\PreviewClose{\@ifstar\pr@starmacro\pr@close}
+\newcommand\pr@close[1][]{%
+  \toks@{\pr@domacro{#1}}%
+  \long\edef\next[##1]##2{%
+   \noexpand\pr@advise{##2}{\the\toks@{##1\endgroup}}}%
+   \@ifnextchar[\next\pr@macroii}
+\def\PreviewEnvironment{\@ifstar\pr@starenv\pr@env}
+\newcommand\pr@starenv[1][]{\toks@{\pr@starmacro[{#1}]}%
+  \long\edef\next##1##2{%
+    \the\toks@[{##2}]##1}%
+  \begingroup\pr@starenvii}
+\newcommand\pr@starenvii[2][]{\endgroup
+  \expandafter\next\csname#2\endcsname{#1}%
+  \expandafter\pr@starmacro\csname end#2\endcsname}
+\newcommand\pr@env[1][]{%
+   \toks@{\pr@domacro{#1}}%
+   \long\edef\next[##1]##2{%
+   \noexpand\expandafter\noexpand\pr@advise@ship
+     \noexpand\csname##2\noexpand\endcsname{\the\toks@
+      {\begingroup\aftergroup\noexpand\pr@endbox##1}}{\endgroup}}%
+   \@ifnextchar[\next\pr@macroii %]
+ }
+\newcommand{\PreviewSnarfEnvironment}[2][]{%
+  \expandafter\pr@advise
+   \csname #2\endcsname{\pr@snarfafter{#1}}%
+ \expandafter\pr@advise
+   \csname end#2\endcsname{\pr@endsnarf}}
+\let\pr@ship@start\@empty
+\let\pr@ship@end\@empty
+\newenvironment{preview}{\ignorespaces}{\ifhmode\unskip\fi}
+\newenvironment{nopreview}{\ignorespaces}{\ifhmode\unskip\fi}
+\ProcessOptions\relax
+\ifPreview\else\expandafter\endinput\fi
+%%    The preview style for extracting previews from LaTeX documents.
+%%    Developed as part of AUCTeX <URL:http://www.gnu.org/software/auctex>.
+\newif\ifpr@outer
+\pr@outertrue
+\newcount\pr@snippet
+\global\pr@snippet=1
+\def\pr@protect{\ifx\protect\@typeset@protect
+  \ifpr@outer \expandafter\expandafter\expandafter
+     \@secondoftwo\fi\fi\@gobble}
+\def\pr@protect@ship{\pr@protect{\@firstoftwo\pr@startbox}%
+   \@gobbletwo}
+\def\pr@insert{\begingroup\afterassignment\pr@insertii\count@}
+\def\pr@insertii{\endgroup\setbox\pr@box\vbox}
+\def\pr@mark{{\afterassignment}\toks@}
+\def\pr@marks{{\aftergroup\pr@mark\afterassignment}\count@}
+\newbox\pr@box
+\long\def\pr@startbox#1#2{%
+  \ifpr@outer
+    \toks@{#2}%
+    \edef\pr@cleanup{\the\toks@}%
+    \setbox\pr@box\vbox\bgroup
+    \break
+    \pr@outerfalse\@arrayparboxrestore
+    \let\insert\pr@insert
+    \let\mark\pr@mark
+    \let\marks\pr@marks
+    \expandafter\expandafter\expandafter
+    \pr@ship@start
+    \expandafter\@firstofone
+  \else
+     \expandafter \@gobble
+  \fi{#1}}
+\def\pr@endbox{%
+   \let\reserved@a\relax
+   \ifvmode \edef\reserved@a{\the\everypar}%
+      \ifx\reserved@a\@empty\else
+            \dimen@\prevdepth
+            \noindent\par
+            \setbox\z@\lastbox\unskip\unpenalty
+            \prevdepth\dimen@
+            \setbox\z@\hbox\bgroup\penalty-\maxdimen\unhbox\z@
+              \ifnum\lastpenalty=-\maxdimen\egroup
+              \else\egroup\box\z@ \fi\fi\fi
+   \ifhmode \par\unskip\setbox\z@\lastbox
+     \nointerlineskip\hbox{\unhbox\z@\/}%
+   \else \unskip\unpenalty\unskip \fi
+   \egroup
+   \setbox\pr@box\vbox{%
+       \baselineskip\z@skip \lineskip\z@skip \lineskiplimit\z@
+       \@begindvi
+       \nointerlineskip
+       \splittopskip\z@skip\setbox\z@\vsplit\pr@box to\z@
+       \unvbox\z@
+       \nointerlineskip
+       %\color@setgroup
+       \box\pr@box
+       %\color@endgroup
+     }%
+   \pr@ship@end
+   {\let\protect\noexpand
+   \ifx\pr@offset@override\@undefined
+     \voffset=-\ht\pr@box
+     \hoffset=\z@
+   \fi
+   \c@page=\pr@snippet
+   \pr@shipout
+   \ifpr@fixbb\hbox{%
+     \dimen@\wd\pr@box
+     \@tempdima\ht\pr@box
+     \@tempdimb\dp\pr@box
+     \box\pr@box
+     \llap{\raise\@tempdima\copy\pr@markerbox\kern\dimen@}%
+     \lower\@tempdimb\copy\pr@markerbox}%
+   \else \box\pr@box \fi}%
+   \global\advance\pr@snippet\@ne
+   \pr@cleanup
+}
+\let\pr@shipout=\shipout
+\def\shipout{\deadcycles\z@\bgroup\setbox\z@\box\voidb@x
+  \afterassignment\pr@shipoutegroup\setbox\z@}
+\def\pr@shipoutegroup{\ifvoid\z@ \expandafter\aftergroup\fi \egroup}
+\def\pr@parseit#1{\csname pr@parse#1\endcsname}
+\let\pr@endparse=\@percentchar
+\def\next#1{%
+\def\pr@callafter{%
+  \afterassignment\pr@parseit
+  \let#1= }}
+\expandafter\next\csname pr@parse\pr@endparse\endcsname
+\long\expandafter\def\csname pr@parse*\endcsname#1\pr@endparse#2{%
+  \begingroup\toks@{#1\pr@endparse{#2}}%
+  \edef\next##1{\endgroup##1\the\toks@}%
+  \@ifstar{\next{\pr@parse@*}}{\next\pr@parseit}}
+\long\expandafter\def\csname pr@parse[\endcsname#1\pr@endparse#2{%
+  \begingroup\toks@{#1\pr@endparse{#2}}%
+  \edef\next##1{\endgroup##1\the\toks@}%
+  \@ifnextchar[{\next\pr@bracket}{\next\pr@parseit}}
+\long\def\pr@bracket#1\pr@endparse#2[#3]{%
+   \pr@parseit#1\pr@endparse{#2[{#3}]}}
+\expandafter\let\csname pr@parse]\endcsname=\pr@parseit
+\long\def\pr@parse#1\pr@endparse#2#3{%
+  \pr@parseit#1\pr@endparse{#2{#3}}}
+\expandafter\let\csname pr@parse!\endcsname=\pr@parse
+\long\expandafter\def\csname pr@parse?\endcsname#1#2\pr@endparse#3{%
+  \begingroup\toks@{#2\pr@endparse{#3}}%
+  \@ifnextchar#1{\pr@parsecond\@firstoftwo}%
+                {\pr@parsecond\@secondoftwo}}
+\def\pr@parsecond#1{\expandafter\endgroup
+  \expandafter\expandafter\expandafter\pr@parseit
+  \expandafter#1\the\toks@}
+ \long\def\pr@parse@#1#2\pr@endparse#3{%
+   \pr@parseit #2\pr@endparse{#3#1}}
+\long\expandafter\def\csname pr@parse-\endcsname
+  #1\pr@endparse#2{\begingroup
+  \toks@{\endgroup\pr@parseit #1\pr@endparse{#2}}%
+  {\aftergroup\the\aftergroup\toks@ \afterassignment}%
+  \let\next= }
+\long\expandafter\def\csname pr@parse:\endcsname
+  #1#2#3\pr@endparse#4{\begingroup
+    \toks@{\endgroup \pr@parseit#3\pr@endparse{#4}}%
+    \long\def\next#1{#2}%
+    \the\expandafter\toks@\next}
+\long\expandafter\def\csname pr@parse#\endcsname
+  #1#2#3\pr@endparse#4{\begingroup
+    \toks@{#4}%
+    \long\edef\next##1{\toks@{\the\toks@##1}}%
+    \toks@{\endgroup \pr@parseit#3\pr@endparse}%
+    \long\def\reserved@a#1{{#2}}%
+    \the\expandafter\next\reserved@a}
+\def\pr@endaftergroup#1{#1\aftergroup\pr@endbox}
+\let\pr@endsnarf\relax
+\long\def\pr@snarfafter#1{\ifpr@outer
+     \pr@ship@start
+     \let\pr@ship@start\relax
+     \let\pr@endsnarf\endgroup
+   \else
+     \let\pr@endsnarf\relax
+   \fi
+  \pr@protect{\pr@callafter\pr@startsnarf#1]\pr@endparse}}
+\def\pr@startsnarf#1{#1\begingroup
+   \pr@startbox{\begingroup\aftergroup\pr@endbox}{\endgroup}%
+   \ignorespaces}
+\renewenvironment{preview}{\begingroup
+   \pr@startbox{\begingroup\aftergroup\pr@endbox}%
+               {\endgroup}%
+   \ignorespaces}%
+   {\ifhmode\unskip\fi\endgroup}
+\renewenvironment{nopreview}{\pr@outerfalse\ignorespaces}%
+  {\ifhmode\unskip\fi}
+\newtoks\pr@output
+\pr@output\output
+\output{%
+  \pr@outerfalse
+  \let\@begindvi\@empty
+  \the\pr@output}
+\let\output\pr@output
+\def\pr@typeinfos{\typeout{Preview: Fontsize \f@size pt}%
+  \ifnum\mag=\@m\else\typeout{Preview: Magnification \number\mag}\fi
+  \ifx\pdfoutput\@undefined
+    \ifx\XeTeXversion\@undefined \else
+      % FIXME: The message should not be emitted if XeTeX does not produce
+      % PDF.  There does not seem to be a primitive for that, though.
+      \typeout{Preview: PDFoutput 1}%
+    \fi
+  \else
+    \ifx\pdfoutput\relax \else
+      \ifnum\pdfoutput>\z@
+        \typeout{Preview: PDFoutput 1}%
+      \fi
+    \fi
+  \fi
+}
+\AtBeginDocument{\pr@typeinfos}
+\pr@loadcfg{prdefault}
+\endinput
+%%
+%% End of file `preview.sty'.
diff --git a/packages/auctex/latex/prfootnotes.def b/packages/auctex/latex/prfootnotes.def
new file mode 100644 (file)
index 0000000..2d525a8
--- /dev/null
@@ -0,0 +1,28 @@
+%%
+%% This is file `prfootnotes.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% preview.dtx  (with options: `footnotes')
+%% 
+%% IMPORTANT NOTICE:
+%% 
+%% For the copyright see the source file.
+%% 
+%% Any modified versions of this file must be renamed
+%% with new filenames distinct from prfootnotes.def.
+%% 
+%% For distribution of the original source see the terms
+%% for copying and modification in the file preview.dtx.
+%% 
+%% This generated file may be distributed as long as the
+%% original source files, as listed above, are part of the
+%% same distribution. (The sources need not necessarily be
+%% in the same archive or directory.)
+%%    The preview style for extracting previews from LaTeX documents.
+%%    Developed as part of AUCTeX <URL:http://www.gnu.org/software/auctex>.
+\PreviewMacro[[!]\footnote %]
+\endinput
+%%
+%% End of file `prfootnotes.def'.
diff --git a/packages/auctex/latex/prlyx.def b/packages/auctex/latex/prlyx.def
new file mode 100644 (file)
index 0000000..fd1dab7
--- /dev/null
@@ -0,0 +1,32 @@
+%%
+%% This is file `prlyx.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% preview.dtx  (with options: `lyx')
+%% 
+%% IMPORTANT NOTICE:
+%% 
+%% For the copyright see the source file.
+%% 
+%% Any modified versions of this file must be renamed
+%% with new filenames distinct from prlyx.def.
+%% 
+%% For distribution of the original source see the terms
+%% for copying and modification in the file preview.dtx.
+%% 
+%% This generated file may be distributed as long as the
+%% original source files, as listed above, are part of the
+%% same distribution. (The sources need not necessarily be
+%% in the same archive or directory.)
+%%    The preview style for extracting previews from LaTeX documents.
+%%    Developed as part of AUCTeX <URL:http://www.gnu.org/software/auctex>.
+\ifPreview\else\expandafter\endinput\fi
+\pr@loadcfg{prlyx}
+\g@addto@macro\pr@ship@end{\typeout{Preview:
+  Snippet \number\pr@snippet\space
+  \number\ht\pr@box\space \number\dp\pr@box \space\number\wd\pr@box}}
+\endinput
+%%
+%% End of file `prlyx.def'.
diff --git a/packages/auctex/latex/prshowbox.def b/packages/auctex/latex/prshowbox.def
new file mode 100644 (file)
index 0000000..3280b29
--- /dev/null
@@ -0,0 +1,32 @@
+%%
+%% This is file `prshowbox.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% preview.dtx  (with options: `showbox')
+%% 
+%% IMPORTANT NOTICE:
+%% 
+%% For the copyright see the source file.
+%% 
+%% Any modified versions of this file must be renamed
+%% with new filenames distinct from prshowbox.def.
+%% 
+%% For distribution of the original source see the terms
+%% for copying and modification in the file preview.dtx.
+%% 
+%% This generated file may be distributed as long as the
+%% original source files, as listed above, are part of the
+%% same distribution. (The sources need not necessarily be
+%% in the same archive or directory.)
+%%    The preview style for extracting previews from LaTeX documents.
+%%    Developed as part of AUCTeX <URL:http://www.gnu.org/software/auctex>.
+\ifPreview\else\expandafter\endinput\fi
+\AtEndOfPackage{%
+  \showboxbreadth\maxdimen
+  \showboxdepth\maxdimen}
+\g@addto@macro\pr@ship@end{\showbox\pr@box}
+\endinput
+%%
+%% End of file `prshowbox.def'.
diff --git a/packages/auctex/latex/prshowlabels.def b/packages/auctex/latex/prshowlabels.def
new file mode 100644 (file)
index 0000000..d0d6108
--- /dev/null
@@ -0,0 +1,67 @@
+%%
+%% This is file `prshowlabels.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% preview.dtx  (with options: `showlabels')
+%% 
+%% IMPORTANT NOTICE:
+%% 
+%% For the copyright see the source file.
+%% 
+%% Any modified versions of this file must be renamed
+%% with new filenames distinct from prshowlabels.def.
+%% 
+%% For distribution of the original source see the terms
+%% for copying and modification in the file preview.dtx.
+%% 
+%% This generated file may be distributed as long as the
+%% original source files, as listed above, are part of the
+%% same distribution. (The sources need not necessarily be
+%% in the same archive or directory.)
+%%    The preview style for extracting previews from LaTeX documents.
+%%    Developed as part of AUCTeX <URL:http://www.gnu.org/software/auctex>.
+\ifPreview\else\expandafter\endinput\fi
+\newbox\pr@labelbox
+\def\pr@label#1{\pr@@label{#1}%
+   \ifpr@setbox\z@{#1}%
+     \global\setbox\pr@labelbox\vbox{\unvbox\pr@labelbox
+      \box\z@}\egroup\fi}
+\def\ifpr@setbox#1#2{%
+  \romannumeral%
+  \ifx\protect\@typeset@protect\ifpr@outer\else
+   \z@\bgroup
+   \protected@edef\next{#2}\@onelevel@sanitize\next
+   \ifx\next\@empty\egroup\romannumeral\else
+   \ifx\next\pr@lastlabel\egroup\romannumeral\else
+   \global\let\pr@lastlabel\next
+   \setbox#1\pr@boxlabel\pr@lastlabel
+   \expandafter\expandafter\romannumeral\fi\fi\fi\fi
+   \z@\iffalse\iftrue\fi}
+\def\pr@boxlabel#1{\hbox{\normalfont
+   \footnotesize\ttfamily\fboxsep0.4ex\relax\fbox{#1}}}
+\def\pr@maketag#1{\pr@@maketag{#1}%
+  \ifpr@setbox\z@{\df@label}%
+      \global\setbox\pr@labelbox\vbox{%
+         \hrule\@width\wd\z@\@height\z@
+         \unvbox\pr@labelbox}%
+        \wd\z@\z@\box\z@ \egroup\fi}
+\g@addto@macro\pr@ship@start{%
+  \global\setbox\pr@labelbox\box\voidb@x
+  \xdef\pr@lastlabel{}%
+  \global\let\pr@@label\label \let\label\pr@label
+  \global\let\pr@@maketag\maketag@@@
+  \let\maketag@@@\pr@maketag
+}
+\pr@addto@front\pr@ship@end{%
+   \ifx \label\pr@label \global\let\label\pr@@label \fi
+   \ifx \maketag@@@\pr@maketag
+        \global\let\maketag@@@\pr@@maketag \fi
+   \ifvoid\pr@labelbox
+   \else \setbox\pr@box\hbox{%
+         \box\pr@box\,\box\pr@labelbox}%
+   \fi}
+\endinput
+%%
+%% End of file `prshowlabels.def'.
diff --git a/packages/auctex/latex/prtightpage.def b/packages/auctex/latex/prtightpage.def
new file mode 100644 (file)
index 0000000..31516be
--- /dev/null
@@ -0,0 +1,146 @@
+%%
+%% This is file `prtightpage.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% preview.dtx  (with options: `tightpage')
+%% 
+%% IMPORTANT NOTICE:
+%% 
+%% For the copyright see the source file.
+%% 
+%% Any modified versions of this file must be renamed
+%% with new filenames distinct from prtightpage.def.
+%% 
+%% For distribution of the original source see the terms
+%% for copying and modification in the file preview.dtx.
+%% 
+%% This generated file may be distributed as long as the
+%% original source files, as listed above, are part of the
+%% same distribution. (The sources need not necessarily be
+%% in the same archive or directory.)
+%%    The preview style for extracting previews from LaTeX documents.
+%%    Developed as part of AUCTeX <URL:http://www.gnu.org/software/auctex>.
+\ifx\PreviewBorder\@undefined
+  \newdimen\PreviewBorder
+  \PreviewBorder=0.50001bp
+\fi
+\ifx\PreviewBbAdjust\@undefined
+  \def\PreviewBbAdjust{-\PreviewBorder -\PreviewBorder
+    \PreviewBorder \PreviewBorder}
+\fi
+\ifPreview\else\expandafter\endinput\fi
+\def\pr@nextbb{\edef\next{\next\space\number\dimen@}%
+  \expandafter\xdef\csname pr@bb@%
+    \romannumeral\count@\endcsname{\the\dimen@}%
+  \advance\count@\@ne\ifnum\count@<5
+  \afterassignment\pr@nextbb\dimen@=\fi}
+\ifnum\pr@graphicstype=\z@
+  \ifcase
+    \ifx\XeTeXversion\@undefined
+      \ifx\pdfoutput\@undefined \@ne\fi
+      \ifx\pdfoutput\relax \@ne\fi
+      \ifnum\pdfoutput>\z@ \tw@\fi \@ne
+    \else \thr@@\fi
+  \or \ExecuteOptions{dvips}\relax
+  \or \ExecuteOptions{pdftex}\relax
+  \or \ExecuteOptions{xetex}\relax\fi\fi
+\global\let\pr@bbadjust\@empty
+\pr@addto@front\pr@ship@end{\begingroup
+  \let\next\@gobble
+  \count@\@ne\afterassignment\pr@nextbb
+  \dimen@\PreviewBbAdjust
+  \ifx\pr@bbadjust\next
+  \else \global\let\pr@bbadjust\next
+  \typeout{Preview: Tightpage \pr@bbadjust}%
+  \fi\endgroup}
+\ifcase\pr@graphicstype
+\or
+  \g@addto@macro\pr@ship@end{\setbox\pr@box\hbox{%
+    \special{ps::\pr@bbadjust\space
+      \number\ifdim\ht\pr@box>\z@ \ht\pr@box
+             \else \z@
+             \fi \space
+      \number\ifdim\dp\pr@box>\z@ \dp\pr@box
+             \else \z@
+             \fi \space
+      \number\ifdim\wd\pr@box>\z@ \wd\pr@box
+             \else \z@
+             \fi}\box\pr@box}}
+\or
+  \g@addto@macro\pr@ship@end{{\dimen@\ht\pr@box
+    \ifdim\dimen@<\z@ \dimen@\z@\fi
+    \advance\dimen@\pr@bb@iv
+    \dimen@ii=\dimen@
+    \global\pdfvorigin\dimen@
+    \dimen@\dp\pr@box
+    \ifdim\dimen@<\z@ \dimen@\z@\fi
+    \advance\dimen@-\pr@bb@ii
+    \advance\dimen@\dimen@ii
+    \global\pdfpageheight\dimen@
+    \dimen@\wd\pr@box
+    \ifdim\dimen@<\z@ \dimen@=\z@\fi
+    \advance\dimen@-\pr@bb@i
+    \advance\dimen@\pr@bb@iii
+    \global\pdfpagewidth\dimen@
+    \global\pdfhorigin-\pr@bb@i}}
+\or
+  \g@addto@macro\pr@ship@end{\dimen@\ht\pr@box
+    \ifdim\dimen@<\z@ \dimen@\z@\fi
+    \advance\dimen@\pr@bb@iv
+    \dimen@ii=\dimen@
+    \voffset=-1in
+    \advance\voffset\dimen@
+    \advance\voffset-\ht\pr@box
+    \dimen@\dp\pr@box
+    \ifdim\dimen@<\z@ \dimen@\z@\fi
+    \advance\dimen@-\pr@bb@ii
+    \advance\dimen@\dimen@ii
+    \global\pdfpageheight\dimen@
+    \global\paperheight\dimen@
+    \dimen@\wd\pr@box
+    \ifdim\dimen@<\z@ \dimen@=\z@\fi
+    \advance\dimen@-\pr@bb@i
+    \advance\dimen@\pr@bb@iii
+    \global\pdfpagewidth\dimen@
+    \hoffset=-1in
+    \advance\hoffset-\pr@bb@i
+    \let\pr@offset@override\@empty}
+\fi
+\ifnum\pr@graphicstype=\@ne
+\preview@delay{\AtBeginDvi{%
+  \special{!/preview@tightpage true def (%
+     compatibility PostScript comment for dvipng<=1.5 }
+  \special{!userdict begin/bop-hook{%
+     7{currentfile token not{stop}if
+       65781.76 div DVImag mul}repeat
+       72 add 72 2 copy gt{exch}if 4 2 roll
+       neg 2 copy lt{exch}if dup 0 gt{pop 0 exch}%
+       {exch dup 0 lt{pop 0}if}ifelse 720 add exch 720 add
+       3 1 roll
+       4{5 -1 roll add 4 1 roll}repeat
+     <</PageSize[5 -1 roll 6 index sub 5 -1 roll 5 index sub]%
+       /PageOffset[7 -2 roll [1 1 dtransform exch]%
+       {0 ge{neg}if exch}forall]>>setpagedevice%
+       //bop-hook exec}bind def end}
+  \special{!userdict (some extra code to avoid
+     dvipng>=1.6 unknown special:
+       7{currentfile token not{stop}if 65781.76 div })) pop}
+  \special{!userdict begin/bop-hook{%
+  preview-bop-level 0 le{%
+     7{currentfile token not{stop}if
+       65781.76 div DVImag mul}repeat
+     72 add 72 2 copy gt{exch}if 4 2 roll
+     neg 2 copy lt{exch}if dup 0 gt{pop 0 exch}%
+     {exch dup 0 lt{pop 0}if}ifelse 720 add exch 720 add
+     3 1 roll
+    4{5 -1 roll add 4 1 roll}repeat
+     <</PageSize[5 -1 roll 6 index sub 5 -1 roll 5 index sub]%
+       /PageOffset[7 -2 roll [1 1 dtransform exch]%
+       {0 ge{neg}if exch}forall]>>setpagedevice}if%
+     //bop-hook exec}bind def end}}}
+\fi
+\endinput
+%%
+%% End of file `prtightpage.def'.
diff --git a/packages/auctex/latex/prtracingall.def b/packages/auctex/latex/prtracingall.def
new file mode 100644 (file)
index 0000000..7dfc7e3
--- /dev/null
@@ -0,0 +1,30 @@
+%%
+%% This is file `prtracingall.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% preview.dtx  (with options: `tracingall')
+%% 
+%% IMPORTANT NOTICE:
+%% 
+%% For the copyright see the source file.
+%% 
+%% Any modified versions of this file must be renamed
+%% with new filenames distinct from prtracingall.def.
+%% 
+%% For distribution of the original source see the terms
+%% for copying and modification in the file preview.dtx.
+%% 
+%% This generated file may be distributed as long as the
+%% original source files, as listed above, are part of the
+%% same distribution. (The sources need not necessarily be
+%% in the same archive or directory.)
+%%    The preview style for extracting previews from LaTeX documents.
+%%    Developed as part of AUCTeX <URL:http://www.gnu.org/software/auctex>.
+\ifPreview\else\expandafter\endinput\fi
+\pr@addto@front\pr@ship@start{\let\tracingonline\count@
+  \let\errorstopmode\@empty\tracingall}
+\endinput
+%%
+%% End of file `prtracingall.def'.
diff --git a/packages/auctex/multi-prompt.el b/packages/auctex/multi-prompt.el
new file mode 100644 (file)
index 0000000..159380f
--- /dev/null
@@ -0,0 +1,226 @@
+;;; multi-prompt.el --- Completing read of multiple strings
+
+;; Copyright (C) 1996, 1997, 2000, 2009 Free Software Foundation
+
+;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
+;; Maintainer: auctex-devel@gnu.org
+;; Created: 1996-08-31
+;; Keywords: extensions
+
+;; 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, 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, write to the Free Software
+;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+;;; Commentary:
+
+;; This package is written for use in emacs lisp programs, where the
+;; user is prompted for a string of the form:
+;;
+;;   FOO,BAR,BAZ
+;;
+;; where FOO, BAR, and BAZ are elements of some table.  The function
+;; `multi-prompt' is a replacement `completing-read' that will allow
+;; the user to enter a string like the above, yet get completion on
+;; all FOO, BAR, and BAZ.
+
+;;; Code:
+
+(defvar multi-prompt-found nil
+  "List of entries currently added during a `multi-prompt'.")
+
+;;;###autoload
+(defun multi-prompt (separator
+                    unique prompt table
+                    &optional mp-predicate require-match initial history)
+  "Completing prompt for a list of strings.  
+The first argument SEPARATOR should be the string (of length 1) to
+separate the elements in the list.  The second argument UNIQUE should
+be non-nil, if each element must be unique.  The remaining elements
+are the arguments to `completing-read'.  See that."
+  (let ((old-map (if require-match
+                    minibuffer-local-must-match-map
+                  minibuffer-local-completion-map))
+       (new-map (make-sparse-keymap)))
+    (if (fboundp 'set-keymap-parent)
+       ;; `set-keymap-parent' was introduced in Emacs 19.32.
+       (set-keymap-parent new-map old-map)
+      (setq new-map (copy-keymap old-map)))
+    (define-key new-map separator (if require-match
+                                     'multi-prompt-next-must-match
+                                   'multi-prompt-next))
+    (define-key new-map "\C-?" 'multi-prompt-delete)
+    (let* ((minibuffer-local-completion-map new-map)
+          (minibuffer-local-must-match-map new-map)
+          (multi-prompt-found nil)
+          (done nil)
+          (filter (cond (unique
+                         (lambda (x)
+                           (and (not (member (car x) multi-prompt-found))
+                                (or (null mp-predicate)
+                                    (funcall mp-predicate x)))))
+                        (mp-predicate)))
+          (answer (catch 'multi-prompt-exit
+                    (while t
+                      (let ((extra (catch 'multi-prompt-next
+                                     (throw 'multi-prompt-exit
+                                            (completing-read prompt 
+                                                             table
+                                                             filter
+                                                             require-match
+                                                             initial
+                                                             history)))))
+                        (cond ((eq extra 'back)
+                               (when multi-prompt-found
+                                 (setq prompt (substring 
+                                               prompt 0 
+                                               (- 0 (length separator)
+                                                  (length
+                                                   (car multi-prompt-found))))
+                                       initial (car multi-prompt-found))
+                                 (setq multi-prompt-found 
+                                       (cdr multi-prompt-found))))
+                              (t
+                               (setq prompt (concat prompt extra separator)
+                                     initial nil)
+                               (setq multi-prompt-found
+                                     (cons extra multi-prompt-found)))))))))
+      (if answer 
+         (nreverse (cons answer multi-prompt-found))
+       multi-prompt-found))))
+
+(defun multi-prompt-delete ()
+  (interactive)
+  (if (bobp)
+      (throw 'multi-prompt-next 'back)
+    (call-interactively 'backward-delete-char)))
+
+(defun multi-prompt-next ()
+  (interactive)
+  (throw 'multi-prompt-next
+         (cond
+          ((fboundp 'minibuffer-contents-no-properties)
+           ;; buffer-substring no longer works in emacs-21, it returns 
+           ;; the whole prompt line. Use this instead.
+           (minibuffer-contents-no-properties))
+          (t
+           (buffer-substring-no-properties (point-min) (point-max))))))
+         
+(defun multi-prompt-next-must-match ()
+  (interactive)
+  (when  (call-interactively 'minibuffer-complete)
+    (let ((content (buffer-substring-no-properties (point-min) (point-max))))
+      (when (or (not require-match)
+               (assoc content table))
+       (throw 'multi-prompt-next content)))))
+
+
+;;; Support for key=value completion
+
+;; The following code was ripped out of crm.el
+;; (completing-read-multiple) and extended to support comma-separated
+;; key=value lists.  The code is separate from the code above.
+
+;; WARNING: This obviously relies on internals of crm.el and
+;; minibuffer.el and will therefore have to be adapted if these
+;; change.
+
+;; TODO: How to support stuff like "caption={[one]two}" or
+;; "morekeywords={one,three,five}"?
+
+(defvar multi-prompt-key-value-sep "="
+  "Single-character string separating key=value pairs.")
+(defvar multi-prompt-completion-table nil
+  "Completion table used by `multi-prompt-key-value'.")
+
+(defun multi-prompt-key-value-collection-fn (string predicate flag)
+  "Function used by `multi-prompt-key-value' to compute completion values.
+The value of STRING is the string to be completed.
+
+The value of PREDICATE is a function to filter possible matches, or
+nil if none.
+
+The value of FLAG is used to specify the type of completion operation.
+A value of nil specifies `try-completion'.  A value of t specifies
+`all-completions'.  A value of lambda specifes a test for an exact match.
+
+For more information on STRING, PREDICATE, and FLAG, see the Elisp
+Reference sections on 'Programmed Completion' and 'Basic Completion
+Functions'."
+  (let ((beg 0) (last 0) matched)
+    (while (string-match multi-prompt-key-value-sep string beg)
+      (setq matched t
+           last beg
+           beg (match-end 0)))
+    (completion-table-with-context
+     (substring string 0 beg)
+     (if (not matched)
+        multi-prompt-completion-table
+       (cadr (assoc (substring string last (1- beg))
+                   multi-prompt-completion-table)))
+     (substring string beg)
+     predicate
+     flag)))
+
+(defun multi-prompt-expand-completion-table (table)
+  "Return an expanded version of completion table TABLE.
+This is achieved by eval'ing all variables in the value parts of
+the alist elements."
+  (mapcar (lambda (x)
+           (if (and (cadr x) (symbolp (cadr x)) (not (functionp (cadr x))))
+               (cons (car x) (list (eval (cadr x))))
+             x))
+         table))
+
+;; Silence the byte compiler.
+(defvar crm-local-must-match-map)
+(defvar crm-local-completion-map)
+
+;;;###autoload
+(defun multi-prompt-key-value
+  (prompt table &optional predicate require-match initial-input
+         hist def inherit-input-method)
+  "Read multiple strings, with completion and key=value support.
+PROMPT is a string to prompt with, usually ending with a colon
+and a space.  TABLE is an alist.  The car of each element should
+be a string representing a key and the optional cdr should be a
+list with strings to be used as values for the key.
+
+See the documentation for `completing-read' for details on the
+other arguments: PREDICATE, REQUIRE-MATCH, INITIAL-INPUT, HIST,
+DEF, and INHERIT-INPUT-METHOD.
+
+The return value is the string as entered in the minibuffer."
+  (require 'crm)
+  (let* ((minibuffer-completion-table #'multi-prompt-key-value-collection-fn)
+        (minibuffer-completion-predicate predicate)
+        (minibuffer-completion-confirm
+         (unless (eq require-match t) require-match))
+        (multi-prompt-completion-table
+         ;; Expand the table here because completion would otherwise
+         ;; interpret symbols in the table as functions.  However, it
+         ;; would be nicer if this could be done during the actual
+         ;; completion in order to avoid walking through the whole
+         ;; table.
+         (multi-prompt-expand-completion-table table))
+        (map (if require-match
+                 crm-local-must-match-map
+               crm-local-completion-map))
+        (input (read-from-minibuffer
+                prompt initial-input map
+                nil hist def inherit-input-method)))
+    (and def (string-equal input "") (setq input def))
+    input))
+
+(provide 'multi-prompt)
+
+;;; multi-prompt.el ends here
diff --git a/packages/auctex/preview-latex.info b/packages/auctex/preview-latex.info
new file mode 100644 (file)
index 0000000..db6780b
--- /dev/null
@@ -0,0 +1,2700 @@
+This is preview-latex.info, produced by makeinfo version 4.13 from
+preview-latex.texi.
+
+This manual is for preview-latex, a LaTeX preview mode for AUCTeX
+(version 11.86 from 2010-02-21).
+
+   Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 Free Software
+Foundation, Inc.
+
+     Permission is granted to copy, distribute and/or modify this
+     document under the terms of the GNU Free Documentation License,
+     Version 1.3 or any later version published by the Free Software
+     Foundation; with no Invariant Sections, no Front-Cover Texts and
+     no Back-Cover Texts.  A copy of the license is included in the
+     section entitled "GNU Free Documentation License."
+
+INFO-DIR-SECTION Emacs
+START-INFO-DIR-ENTRY
+* preview-latex: (preview-latex).       Preview LaTeX fragments in Emacs
+END-INFO-DIR-ENTRY
+INFO-DIR-SECTION TeX
+START-INFO-DIR-ENTRY
+* preview-latex: (preview-latex).       Preview LaTeX fragments in Emacs
+END-INFO-DIR-ENTRY
+
+\1f
+File: preview-latex.info,  Node: Top,  Prev: (dir),  Up: (dir)
+
+preview-latex
+*************
+
+This manual may be copied under the conditions spelled out in *note
+Copying this Manual::.
+
+   preview-latex is a package embedding preview fragments into Emacs
+source buffers under the AUCTeX editing environment for LaTeX.  It uses
+`preview.sty' for the extraction of certain environments (most notably
+displayed formulas).  Other applications of this style file are
+possible and exist.
+
+   The name of the package is really `preview-latex', all in lowercase
+letters, with a hyphen.  If you typeset it, you can use a sans-serif
+font to visually offset it.
+
+* Menu:
+
+* Copying::                     Copying
+* Introduction::                Getting started.
+* Installation::                Make Install.
+* Keys and lisp::               Key bindings and user-level lisp functions.
+* Simple customization::        To make it fit in.
+* Known problems::              When things go wrong.
+* For advanced users::          Internals and more customizations.
+* ToDo::                        Future development.
+* Frequently Asked Questions::  All about preview-latex
+* Copying this Manual::         GNU Free Documentation License
+* Index::                       A menu of many topics.
+
+\1f
+File: preview-latex.info,  Node: Copying,  Next: Introduction,  Prev: Top,  Up: Top
+
+Copying
+*******
+
+For the conditions for copying parts of preview-latex, see the General
+Public Licenses referres to in the copyright notices of the files, the
+General Public Licenses accompanying them and the explanatory section in
+*note Copying: (auctex)Copying.
+
+   This manual specifically is covered by the GNU Free Documentation
+License (*note Copying this Manual::).
+
+\1f
+File: preview-latex.info,  Node: Introduction,  Next: Installation,  Prev: Copying,  Up: Top
+
+1 Introduction
+**************
+
+Does your neck hurt from turning between previewer windows and the
+source too often? This AUCTeX component will render your displayed
+LaTeX equations right into the editing window where they belong.
+
+   The purpose of preview-latex is to embed LaTeX environments such as
+display math or figures into the source buffers and switch conveniently
+between source and image representation.
+
+* Menu:
+
+* What use is it?::
+* Activating preview-latex::
+* Getting started::
+* Basic modes of operation::
+* More documentation::
+* Availability::
+* Contacts::
+
+\1f
+File: preview-latex.info,  Node: What use is it?,  Next: Activating preview-latex,  Prev: Introduction,  Up: Introduction
+
+1.1 What use is it?
+===================
+
+   WYSIWYG (what you see is what you get) sometimes is considered all
+the rage, sometimes frowned upon.  Do we really want it?  Wrong
+question.  The right question is _what_ we want from it.  Except when
+finetuning the layout, we don't want to use printer fonts for on-screen
+text editing.  The low resolution and contrast of a computer screen
+render all but the coarsest printer fonts (those for low-quality
+newsprint) unappealing, and the margins and pagination of the print are
+not wanted on the screen, either.  On the other hand, more complex
+visual compositions like math formulas and tables can't easily be taken
+in when seen only in the source.  preview-latex strikes a balance: it
+only uses graphic renditions of the output for certain, configurable
+constructs, does this only when told, and then right in the source code.
+Switching back and forth between the source and preview is easy and
+natural and can be done for each image independently.  Behind the scenes
+of preview-latex, a sophisticated framework of other programs like
+`dvipng', Dvips and Ghostscript are employed together with a special
+LaTeX style file for extracting the material of interest in the
+background and providing fast interactive response.
+
+\1f
+File: preview-latex.info,  Node: Activating preview-latex,  Next: Getting started,  Prev: What use is it?,  Up: Introduction
+
+1.2 Activating preview-latex
+============================
+
+After installation, the package may need to be activated (and remember
+to activate AUCTeX too).  In XEmacs, and in any prepackaged versions
+worth their salt, activation should be automatic upon installation.  If
+this seems not the case, complain to your installation provider.
+
+   The usual activation (if it is not done automatically) would be
+
+     (load "preview-latex.el" nil t t)
+
+   If you still don't get a "Preview" menu in LaTeX mode in spite of
+AUCTeX showing its "Command", your installation is broken.  One
+possible cause are duplicate Lisp files that might be detectable with
+`<M-x> list-load-path-shadows <RET>'.
+
+\1f
+File: preview-latex.info,  Node: Getting started,  Next: Basic modes of operation,  Prev: Activating preview-latex,  Up: Introduction
+
+1.3 Getting started
+===================
+
+Once activated, preview-latex and its documentation will be accessible
+via its menus (note that preview-latex requires AUCTeX to be loaded).
+When you have loaded a LaTeX document (a sample document `circ.tex' is
+included in the distribution, but most documents including math and/or
+figures should do), you can use its menu or `C-c C-p C-d' (for
+`Preview/Document').  Previews will now be generated for various
+objects in your document.  You can use the time to take a short look at
+the other menu entries and key bindings in the `Preview' menu.  You'll
+see the previewed objects change into a roadworks sign when
+preview-latex has determined just what it is going to preview.  Note
+that you can freely navigate the buffer while this is going on.  When
+the process is finished you will see the objects typeset in your buffer.
+
+   It is a bad idea, however, to edit the buffer before the roadworks
+signs appear, since that is the moment when the correlation between the
+original text and the buffer locations gets established.  If the buffer
+changes before that point of time, the previews will not be placed where
+they belong. If you do want to change some obvious error you just
+spotted, we recommend you stop the background process by pressing `C-c
+C-k'.
+
+   To see/edit the LaTeX code for a specific object, put the point (the
+cursor) on it and press `C-c C-p C-p' (for `Preview/at point').  It
+will also do to click with the middle mouse button on the preview.  Now
+you can edit the code, and generate a new preview by again pressing
+`C-c C-p C-p' (or by clicking with the middle mouse button on the icon
+before the edited text).
+
+   If you are using the `desktop' package, previews will remain from
+one session to the next as long as you don't kill your buffer.  If you
+are using XEmacs, you will probably need to upgrade the package to the
+newest one; things are being fixed just as I am writing this.
+
+\1f
+File: preview-latex.info,  Node: Basic modes of operation,  Next: More documentation,  Prev: Getting started,  Up: Introduction
+
+1.4 Basic modes of operation
+============================
+
+preview-latex has a number of methods for generating its graphics.  Its
+default operation is equivalent to using the `LaTeX' command from
+AUCTeX.  If this happens to be a call of PDFLaTeX generating PDF output
+(you need at least AUCTeX 11.51 for this), then Ghostscript will be
+called directly on the resulting PDF file.  If a DVI file gets
+produced, first Dvips and then Ghostscript get called by default.
+
+   The image type to be generated by Ghostscript can be configured with
+
+     M-x customize-variable RET preview-image-type RET
+   
+The default is `png' (the most efficient image type).  A special
+setting is `dvipng' in case you have the `dvipng' program installed.
+In this case, `dvipng' will be used for converting DVI files and
+Ghostscript (with a `PNG' device) for converting PDF files.  `dvipng'
+is much faster than the combination of Dvips and Ghostscript.  You can
+get downloads, access to its CVS archive and further information from
+its project site (http://savannah.nongnu.org/projects/dvipng).
+
+\1f
+File: preview-latex.info,  Node: More documentation,  Next: Availability,  Prev: Basic modes of operation,  Up: Introduction
+
+1.5 More documentation
+======================
+
+After the installation, documentation in the form of this info manual
+will be available.  You can access it with the standalone info reader
+with
+
+     info preview-latex
+
+or by pressing `C-h i d m preview-latex <RET>' in Emacs.  Once
+preview-latex is activated, you can instead use `C-c C-p <TAB>' (or the
+menu entry `Preview/Read documentation').
+
+   Depending on your installation, a printable manual may also be
+available in the form of `preview-latex.dvi' or `preview-latex.ps'.
+
+   Detailed documentation for the LaTeX style used for extracting the
+preview images is placed in `preview.dvi' in a suitable directory
+during installation; on typical teTeX-based systems,
+
+     texdoc preview
+
+will display it.
+
+\1f
+File: preview-latex.info,  Node: Availability,  Next: Contacts,  Prev: More documentation,  Up: Introduction
+
+1.6 Availability
+================
+
+The preview-latex project is now part of AUCTeX and accessible as part
+of the AUCTeX project page (http://savannah.gnu.org/projects/auctex).
+You can get its files from the AUCTeX download area
+(ftp://ftp.gnu.org/pub/gnu/auctex).  As of AUCTeX 11.81, preview-latex
+should already be integrated into AUCTeX, so no separate download will
+be necessary.
+
+   You will also find `.rpm' files there for Fedora and possibly SuSE.
+Anonymous CVS is available as well.
+
+\1f
+File: preview-latex.info,  Node: Contacts,  Prev: Availability,  Up: Introduction
+
+1.7 Contacts
+============
+
+Bug reports should be sent by using `M-x preview-report-bug <RET>', as
+this will fill in a lot of information interesting to us.  If the
+installation fails (but this should be a rare event), report bugs to
+<bug-auctex@gnu.org>.
+
+   There is a general discussion list for AUCTeX which also covers
+preview-latex, look at `http://lists.gnu.org/mailman/listinfo/auctex'.
+For more information on the mailing list, send a message with just the
+word "help" as subject or body to <auctex-request@gnu.org>.  For the
+developers, there is the <auctex-devel@gnu.org> list; it would probably
+make sense to direct feature requests and questions about internal
+details there.  There is a low-volume read-only announcement list
+available to which you can subscribe by sending a mail with "subscribe"
+in the subject to <info-auctex-request@gnu.org>.
+
+   Offers to support further development will be appreciated.  If you
+want to show your appreciation with a donation to the main developer,
+you can do so via PayPal to <dak@gnu.org>, and of course you can arrange
+for service contracts or for added functionality.  Take a look at the
+`TODO' list for suggestions in that area.
+
+\1f
+File: preview-latex.info,  Node: Installation,  Next: Keys and lisp,  Prev: Introduction,  Up: Top
+
+2 Installation
+**************
+
+Installation is now being covered in *note Installation:
+(auctex)Installation.
+
+\1f
+File: preview-latex.info,  Node: Keys and lisp,  Next: Simple customization,  Prev: Installation,  Up: Top
+
+3 Key bindings and user-level lisp functions
+********************************************
+
+preview-latex adds key bindings starting with `C-c C-p' to the
+supported modes of AUCTeX (*note (auctex)Key Index::).  It will also
+add its own `Preview' menu in the menu bar, as well as an icon in the
+toolbar.
+
+   The following only describes the interactive use: view the
+documentation strings with `C-h f' if you need the Lisp information.
+
+`C-c C-p C-p'
+`preview-at-point'
+Preview/Generate previews (or toggle) at point
+     If the cursor is positioned on or inside of a preview area, this
+     toggles its visibility, regenerating the preview if necessary. If
+     not, it will run the surroundings through preview. The
+     surroundings include all areas up to the next valid preview,
+     unless invalid previews occur before, in which case the area will
+     include the last such preview in either direction.  And overriding
+     any other action, if a region is active (`transient-mark-mode' or
+     `zmacs-regions'), it is run through `preview-region'.  
+
+`<mouse-2>'
+     The middle mouse button has a similar action bound to it as
+     `preview-at-point', only that it knows which preview to apply it to
+     according to the position of the click.  You can click either
+     anywhere on a previewed image, or when the preview is opened and
+     showing the source text, you can click on the icon preceding the
+     source text.  In other areas, the usual mouse key action
+     (typically: paste) is not affected.
+
+`<mouse-3>'
+     The right mouse key pops up a context menu with several options:
+     toggling the preview, regenerating it, removing it (leaving the
+     unpreviewed text), copying the text inside of the preview, and
+     copying it in a form suitable for copying as an image into a mail
+     or news article.  This is a one-image variant of the following
+     command:
+
+`C-c C-p C-w'
+`preview-copy-region-as-mml'
+Copy a region as MML
+     This command is also available as a variant in the context menu on
+     the right mouse button (where the region is the preview that has
+     been clicked on).  It copies the current region into the kill
+     buffer in a form suitable for copying as a text including images
+     into a mail or news article using mml-mode (*note Composing:
+     (emacs-mime)Composing.).
+
+     If you regenerate or otherwise kill the preview in its source
+     buffer before the mail or news gets posted, this will fail.  Also
+     you should generate images you want to send with
+     `preview-transparent-border' set to `nil', or the images will have
+     an ugly border.  preview-latex detects this condition and asks
+     whether to regenerate the region with borders switched off.  As
+     this is an asynchronous operation running in the background,
+     you'll need to call this command explicitly again to get the newly
+     generated images into the kill ring.
+
+     Preview your articles with `mml-preview' (on `M-m P', or `C-c C-m
+     P' in Emacs 22) to make sure they look fine.
+
+`C-c C-p C-e'
+`preview-environment'
+Preview/Generate previews for environment
+     Run preview on LaTeX environment.  The environments in
+     `preview-inner-environments' are treated as inner levels so that
+     for instance, the `split' environment in
+     `\begin{equation}\begin{split}...\end{split}\end{equation}' is
+     properly displayed.  If called with a numeric argument, the
+     corresponding number of outward nested environments is treated as
+     inner levels.  
+
+`C-c C-p C-s'
+`preview-section'
+Preview/Generate previews for section
+     Run preview on this LaTeX section.  
+
+`C-c C-p C-r'
+`preview-region'
+Preview/Generate previews for region
+     Run preview on current region.  
+
+`C-c C-p C-b'
+`preview-buffer'
+Preview/Generate previews for buffer
+     Run preview on the current buffer.  
+
+`C-c C-p C-d'
+`preview-document'
+Preview/Generate previews for document
+     Run preview on the current document.  
+
+`C-c C-p C-c C-p'
+`preview-clearout-at-point'
+Preview/Remove previews at point
+     Clear out (remove) the previews that are immediately adjacent to
+     point.
+
+`C-c C-p C-c C-s'
+`preview-clearout-section'
+Preview/Remove previews from section
+     Clear out all previews in current section.
+
+`C-c C-p C-c C-r'
+`preview-clearout'
+Preview/Remove previews from region
+     Clear out all previews in the current region.
+
+`C-c C-p C-c C-b'
+`preview-clearout-buffer'
+Preview/Remove previews from buffer
+     Clear out all previews in current buffer. This makes the current
+     buffer lose all previews.
+
+`C-c C-p C-c C-d'
+`preview-clearout-document'
+Preview/Remove previews from document
+     Clear out all previews in current document.  The document consists
+     of all buffers that have the same master file as the current
+     buffer.  This makes the current document lose all previews.
+
+`C-c C-p C-f'
+`preview-cache-preamble'
+Preview/Turn preamble cache on
+     Dump a pregenerated format file.  For the rest of the session,
+     this file is used when running on the same master file.  Use this
+     if you know your LaTeX takes a long time to start up, the speedup
+     will be most noticeable when generating single or few previews.
+     If you change your preamble, do this again.  preview-latex will
+     try to detect the necessity of that automatically when editing
+     changes to the preamble are done from within Emacs, but it will
+     not notice if the preamble effectively changes because some
+     included file or style file is tampered with.
+
+`C-c C-p C-c C-f'
+`preview-cache-preamble-off'
+Preview/Turn preamble cache off
+     Clear the pregenerated format file and stop using preambles for the
+     current document. If the caching gives you problems, use this.
+
+`C-c C-p C-i'
+`preview-goto-info-page'
+Preview/Read Documentation
+     Read this info manual.
+
+`M-x preview-report-bug <RET>'
+`preview-report-bug'
+Preview/Report Bug
+     This is the preferred way of reporting bugs as it will fill in what
+     version of preview-latex you are using as well as versions of
+     relevant other software, and also some of the more important
+     settings. Please use this method of reporting, if at all possible
+     and before reporting a bug, have a look at *note Known problems::.
+
+`C-c C-k'
+LaTeX/TeX Output/Kill Job
+     Kills the preview-generating process. This is really an AUCTeX
+     keybinding, but it is included here as a hint. If you are
+     generating a preview and then make a change to the buffer,
+     preview-latex may be confused and place the previews wrong.
+
+\1f
+File: preview-latex.info,  Node: Simple customization,  Next: Known problems,  Prev: Keys and lisp,  Up: Top
+
+4 Simple customization
+**********************
+
+Customization options can be found by typing `M-x customize-group <RET>
+preview <RET>'. Remember to set the option when you have changed it.
+The list of suggestions can be made very long (and is covered in detail
+in *note For advanced users::), but some are:
+
+   * Change the color of the preview background
+
+     If you use a non-white background in Emacs, you might have color
+     artifacts at the edges of your previews.  Playing around with the
+     option `preview-transparent-color' in the `Preview Appearance'
+     group might improve things.  With some settings, the cursor may
+     cover the whole background of a preview, however.
+
+     This option is specific to the display engine in use.  Its default
+     is different in Emacs 21 and Emacs 22, and it is not available in
+     XEmacs.
+
+   * Showing `\label's 
+
+     When using preview-latex, the `\label's are hidden by the
+     previews.  It is possible to make them visible in the output by
+     using the LaTeX package `showkeys' alternatively `showlabels'.
+     However, the boxes of these labels will be outside the region
+     preview-latex considers as the preview image.  To enable a similar
+     mechanism internal to preview-latex, enable the `showlabels'
+     option in the variable `preview-default-option-list' in the
+     `Preview Latex' group.
+
+     It must be noted, however, that a much better idea may be to use
+     the RefTeX package for managing references.  *Note RefTeX in a
+     Nutshell: (reftex)RefTeX in a Nutshell.
+
+   * Open previews automatically
+
+     The current default is to open previews automatically when you
+     enter them with cursor left/right motions.  Auto-opened previews
+     will close again once the cursor leaves them again (this is also
+     done when doing incremental search, or query-replace operations),
+     unless you changed anything in it.  In that case, you will have to
+     regenerate the preview (via e.g., `C-c C-p C-p').  Other options
+     for `preview-auto-reveal' are available via `customize'.
+
+   * Automatically cache preambles
+
+     Currently preview-latex asks you whether you want to cache the
+     document preamble (everything before `\begin{document}') before it
+     generates previews for a buffer the first time.  Caching the
+     preamble will significantly speed up regeneration of previews.
+     The larger your preamble is, the more this will be apparent.  Once
+     a preamble is cached, preview-latex will try to keep track of when
+     it is changed, and dump a fresh format in that case.  If you
+     experience problems with this, or if you want it to happen without
+     asking you the first time, you can customize the variable
+     `preview-auto-cache-preamble'.  
+
+   * Attempt to keep counters accurate when editing
+
+     Since preview-latex frequently runs only small regions through
+     LaTeX, values like equation counters are not consistent from run to
+     run.  If this bothers you, customize the variable
+     `preview-preserve-counters' to `t' (this is consulted by
+     `preview-required-option-list').  LaTeX will then output a load of
+     counter information during compilation, and this information will
+     be used on subsequent updates to keep counters set to useful
+     values.  The additional information takes additional time to
+     analyze, but this is relevant mostly only when you are
+     regenerating all previews at once, and maybe you will be less
+     tempted to do so when counters appear more or less correct.
+
+   * Preview your favourite LaTeX constructs
+
+     If you have a certain macro or environment that you want to
+     preview, first check if it can be chosen by cutomizing
+     `preview-default-options-list' in the `Preview Latex' group.
+
+     If it is not available there, you can add it to
+     `preview-default-preamble' also in the `Preview Latex' group, by
+     adding a `\PreviewMacro' or `\PreviewEnvironment' entry (*note
+     Provided commands::) _after_ the `\RequirePackage' line.  For
+     example, if you want to preview the `center' environment, press
+     the <Show> button and the last <INS> button, then add
+
+          \PreviewEnvironment{center}
+     in the space that just opened.  Note that since `center' is a
+     generic formatting construct of LaTeX, a general configuration like
+     that is not quite prudent.  You better to do this on a per-document
+     base so that it is easy to disable this behavior when you find this
+     particular entry gives you trouble.
+
+     One possibility is to save such settings in the corresponding
+     file-local variable instead of your global configuration (*note
+     Local Variables in Files: (emacs)File Variables.).  A perhaps more
+     convenient place for such options would be in a configuration file
+     in the same directory with your project (*note Package options::).
+
+     The usual file for preview-latex preconfiguration is
+     `prauctex.cfg'.  If you also want to keep the systemwide defaults,
+     you should add a line
+
+          \InputIfFileExists{preview/prauctex.cfg}{}{}
+     to your own version of `prauctex.cfg' (this is assuming that
+     global files relating to the `preview' package are installed in a
+     subdirectory `preview', the default behavior).
+
+   * Don't preview inline math 
+
+     If you have performance problems because your document is full of
+     inline math (`$...$'), or if your usage of `$' conflicts with
+     preview-latex's, you can turn off inline math previews. In the
+     `Preview Latex' group, remove `textmath' from
+     `preview-default-option-list' by customizing this variable.
+
+\1f
+File: preview-latex.info,  Node: Known problems,  Next: For advanced users,  Prev: Simple customization,  Up: Top
+
+5 Known problems
+****************
+
+A number of issues are known concerning the interoperation with various
+other software. Some of the known problems can be solved by moving to
+newer versions of the problematic software or by simple patches.
+
+* Menu:
+
+* Problems with Ghostscript::
+* Font problems with Dvips::
+* Emacs problems::
+* Too small bounding boxes::
+* x-symbol interoperation::
+* Middle-clicks paste instead of toggling::
+
+   If you find something not mentioned here, please send a bug report
+using `M-x preview-report-bug <RET>', which will fill in a lot of
+information interesting to us and send it to the <bug-auctex@gnu.org>
+list.  Please use the bug reporting commands if at all possible.
+
+\1f
+File: preview-latex.info,  Node: Problems with Ghostscript,  Next: Font problems with Dvips,  Up: Known problems
+
+5.1 Problems with Ghostscript
+=============================
+
+   Most of the problems encountered come from interaction with
+Ghostscript.  It is a good idea to have a fairly recent version of
+Ghostscript installed.  One problem occurs if you have specified the
+wrong executable under Windows: the command line version of Ghostscript
+is called `GSWIN32C.EXE', not `GSWIN32.EXE'.
+
+   When Ghostscript fails, the necessary information and messages from
+Ghostscript go somewhere.  If Ghostscript fails before starting to
+process images, you'll find the information at the end of the process
+buffer you can see with `C-c C-l'.  If Ghostscript fails while
+processing a particular image, this image will be tagged with clickable
+buttons for the error description and for the corresponding source file.
+
+   The default options configurable with
+
+     `M-x customize-variable <RET> preview-gs-options <RET>'
+   include the options `-dTextAlphaBits=4' and `-dGraphicsAlphaBits=4'.
+These options have been reported to make Ghostscript 5.50 fail, but
+should work under Ghostscript 6.51 and later.  If you are experiencing
+problems, it might help to customize them away.  Of course, this also
+takes away the joy of antialiasing, so upgrading Ghostscript might not
+be the worst idea after all.
+
+   The device names have changed over time, so when using an old
+Ghostscript, you may have problems with the devices demanded by the
+customizable variable `preview-image-creators'.  In that case, make
+sure they fit your version of Ghostscript, at least the entry
+corresponding to the current value of `preview-image-type'.  While not
+being best in file size and image quality, setting
+`preview-image-creators' to `jpeg' should probably be one of the best
+bets for the purpose of checking basic operation, since that device
+name has not changed in quite some time.  But JPEG is not intended for
+text, but for photographic images.  On a more permanent time scale, the
+best choice is to use PNG and complain to your suppliers if either
+Emacs or Ghostscript fail to properly accommodate this format.
+
+\1f
+File: preview-latex.info,  Node: Font problems with Dvips,  Next: Emacs problems,  Prev: Problems with Ghostscript,  Up: Known problems
+
+5.2 Font problems with Dvips
+============================
+
+Some fonts have been reported to produce wrong characters with
+preview-latex.  preview-latex calls Dvips by default with the option
+`-Pwww' in order to get scalable fonts for nice results.  If you are
+using antialiasing, however, the results might be sufficiently nice
+with bitmapped fonts, anyway.  You might try `-Ppdf' for another stab
+at scalable fonts, or other printer definitions.  Use
+
+     `M-x customize-variable <RET> preview-fast-dvips-command <RET>'
+   and
+     `M-x customize-variable <RET> preview-dvips-command <RET>'
+   in order to customize this.
+
+   One particular problem is that several printer setup files
+(typically in a file called `/usr/share/texmf/dvips/config/config.pdf'
+if you are using the `-Ppdf' switch) contain the `G' option for
+`character shifting'.  This option will result in `fi' being rendered
+as `#' (British Pounds sign) in several fonts, unless your version of
+Dvips has a long-standing bug in its implementation fixed (only very
+recent versions of Dvips have).
+
+\1f
+File: preview-latex.info,  Node: Emacs problems,  Next: Too small bounding boxes,  Prev: Font problems with Dvips,  Up: Known problems
+
+5.3 Emacs problems
+==================
+
+   * GNU Emacs versions
+
+     Don't use Emacsen older than 21.3 on X11-based systems.  On most
+     other systems, you'll need at least Emacs 22.1 or one of the
+     developer versions leading up to it.  Details can be found in
+     *note Prerequisites: (auctex)Prerequisites.
+
+   * Emacsen on Windows operating systems
+
+     For Emacs 21, no image support is available in Emacs under Windows.
+     Without images, preview-latex is useless.  The current CVS version
+     of Emacs available from `http://savannah.gnu.org/projects/emacs'
+     now supports images including the PNG format, so Emacs 22 should
+     work out of the box once it is released.  Precompiled versions are
+     available from `http://crasseux.com/emacs' and
+     `http://nqmacs.sf.net'.
+
+     For detailed installation instructions for Windows, see *note
+     Installation under MS Windows: (auctex)Installation under MS
+     Windows.
+
+   * XEmacs
+
+     There is are two larger problems known with older XEmacs releases.
+     One leads to seriously mispositioned baselines and previews
+     hanging far above other text on the same line.  This should be
+     fixed as of XEmacs-21.4.9.
+
+     The other core bug causes a huge delay when XEmacs's idea of the
+     state of processes (like ghostscript) is wrong, and can lead to
+     nasty spurious error messages.  It should be fixed in version
+     21.4.8.
+
+     Previews will only remain from one session to the next if you have
+     version 1.81 or above of the `edit-utils' package, first released
+     in the 2002-03-12 sumo tarball.
+
+\1f
+File: preview-latex.info,  Node: Too small bounding boxes,  Next: x-symbol interoperation,  Prev: Emacs problems,  Up: Known problems
+
+5.4 Too small bounding boxes
+============================
+
+The bounding box of a preview is determined by the LaTeX package using
+the pure TeX bounding boxes.  If there is material extending outside of
+the TeX box, that material will be missing from the preview image.
+This happens for the label-showing boxes from the `showkeys' package.
+This particular problem can be circumvented by using the `showlabels'
+option of the preview package.
+
+   In general, you should try to fix the problem in the TeX code, like
+avoiding drawing outside of the picture with PSTricks.
+
+   One possible remedy is to set `preview-fast-conversion' to `Off'
+(*note The Emacs interface::).  The conversion will take more time, but
+will then use the bounding boxes from EPS files generated by Dvips.
+
+   Dvips generally does not miss things, but it does not understand
+PostScript constructs like `\resizebox' or `\rotate' commands, so will
+generate rather wrong boxes for those.  Dvips can be helped with the
+`psfixbb' package option to preview (*note The LaTeX style file::),
+which will tag the corners of the included TeX box.  This will mostly
+be convenient for _pure_ PostScript stuff like that created by
+PSTricks, which Dvips would otherwise reserve no space for.
+
+\1f
+File: preview-latex.info,  Node: x-symbol interoperation,  Next: Middle-clicks paste instead of toggling,  Prev: Too small bounding boxes,  Up: Known problems
+
+5.5 x-symbol interoperation
+===========================
+
+Thanks to the work of Christoph Wedler, starting with version
+`4.0h/beta' of x-symbol, the line parsing of AUCTeX and preview-latex
+is fully supported.  Earlier versions exhibit problems.  However,
+versions before 4.2.2 will cause a drastic slowdown of preview-latex's
+parsing pass, so we don't recommend to use versions earlier than that.
+
+   If you wonder what x-symbol is, it is a package that transforms
+various tokens and subscripts to a more readable form while editing and
+offers a few input methods handy especially for dealing with math. Take
+a look at `http://x-symbol.sourceforge.net'.
+
+   x-symbol versions up to 4.5.1-beta at least require an 8bit-clean TeX
+implementation (meaning that its terminal output should not use
+`^^'-started escape sequences) for cooperation with preview-latex.
+Later versions may get along without it, like preview-latex does now.
+
+   If you experience problems with `circ.tex' in connection with both
+x-symbol and Latin-1 characters, you may need to change your language
+environment or, as a last resort, customize the variable
+`LaTeX-command-style' by replacing the command `latex' with `latex
+-translate-file=cp8bit'.
+
+\1f
+File: preview-latex.info,  Node: Middle-clicks paste instead of toggling,  Prev: x-symbol interoperation,  Up: Known problems
+
+5.6 Middle-clicks paste instead of toggling
+===========================================
+
+This is probably the fault of your favorite package.  `flyspell.el' and
+`mouse-drag.el' are known to be affected in versions before Emacs 21.3.
+Upgrade to the most recent version.  What version of XEmacs might
+contain the fixes is unknown.
+
+   `isearch.el' also shows this effect while searches are in progress,
+but the code is such a complicated mess that no patch is in sight.
+Better just end the search with `<RET>' before toggling and resume with
+`C-s C-s' or similar afterwards.  Since previews over the current match
+will auto-open, anyway, this should not be much of a problem in
+practice.
+
+\1f
+File: preview-latex.info,  Node: For advanced users,  Next: ToDo,  Prev: Known problems,  Up: Top
+
+6 For advanced users
+********************
+
+This package consists of two parts: a LaTeX style that splits the
+output into appropriate parts with one preview object on each page, and
+an Emacs-lisp part integrating the thing into Emacs (aided by AUCTeX).
+
+* Menu:
+
+* The LaTeX style file::
+* The Emacs interface::
+* The preview images::
+* Misplaced previews::
+
+\1f
+File: preview-latex.info,  Node: The LaTeX style file,  Next: The Emacs interface,  Prev: For advanced users,  Up: For advanced users
+
+6.1 The LaTeX style file
+========================
+
+The main purpose of this package is the extraction of certain
+environments (most notably displayed formulas) from LaTeX sources as
+graphics.  This works with DVI files postprocessed by either Dvips and
+Ghostscript or dvipng, but it also works when you are using PDFTeX for
+generating PDF files (usually also postprocessed by Ghostscript).
+
+   Current uses of the package include the preview-latex package for
+WYSIWYG functionality in the AUCTeX editing environment, generation of
+previews in LyX, as part of the operation of the ps4pdf package, the
+tbook XML system and some other tools.
+
+   Producing EPS files with Dvips and its derivatives using the `-E'
+option is not a good alternative: People make do by fiddling around
+with `\thispagestyle{empty}' and hoping for the best (namely, that the
+specified contents will indeed fit on single pages), and then trying to
+guess the baseline of the resulting code and stuff, but this is at best
+dissatisfactory.  The preview package provides an easy way to ensure
+that exactly one page per request gets shipped, with a well-defined
+baseline and no page decorations.  While you still can use the preview
+package with the `classic'
+
+     dvips -E -i
+
+invocation, there are better ways available that don't rely on Dvips
+not getting confused by PostScript specials.
+
+   For most applications, you'll want to make use of the `tightpage'
+option.  This will embed the page dimensions into the PostScript or PDF
+code, obliterating the need to use the `-E -i' options to Dvips.  You
+can then produce all image files with a single run of Ghostscript from
+a single PDF or PostScript (as opposed to EPS) file.
+
+   Various options exist that will pass TeX dimensions and other
+information about the respective shipped out material (including
+descender size) into the log file, where external applications might
+make use of it.
+
+   The possibility for generating a whole set of graphics with a single
+run of Ghostscript (whether from LaTeX or PDFLaTeX) increases both
+speed and robustness of applications.  It is also feasible to use
+dvipng on a DVI file with the options
+
+     -picky -noghostscript
+
+to omit generating any image file that requires Ghostscript, then let a
+script generate all missing files using Dvips/Ghostscript.  This will
+usually speed up the process significantly.
+
+* Menu:
+
+* Package options::
+* Provided commands::
+
+\1f
+File: preview-latex.info,  Node: Package options,  Next: Provided commands,  Prev: The LaTeX style file,  Up: The LaTeX style file
+
+6.1.1 Package options
+---------------------
+
+The package is included with the customary
+
+     \usepackage[OPTIONS]{preview}
+
+You should usually load this package as the last one, since it
+redefines several things that other packages may also provide.
+
+   The following options are available:
+
+`active'
+     is the most essential option.  If this option is not specified,
+     the `preview' package will be inactive and the document will be
+     typeset as if the `preview' package were not loaded, except that
+     all declarations and environments defined by the package are still
+     legal but have no effect.  This allows defining previewing
+     characteristics in your document, and only activating them by
+     calling LaTeX as
+
+          latex '\PassOptionsToPackage{active}{preview} \input{FILENAME}'
+
+`noconfig'
+     Usually the file `prdefault.cfg' gets loaded whenever the
+     `preview' package gets activated.  `prdefault.cfg' is supposed to
+     contain definitions that can cater for otherwise bad results, for
+     example, if a certain document class would otherwise lead to
+     trouble.  It also can be used to override any settings made in
+     this package, since it is loaded at the very end of it.  In
+     addition, there may be configuration files specific for certain
+     `preview' options like `auctex' which have more immediate needs.
+     The `noconfig' option suppresses loading of those option files,
+     too.
+
+`psfixbb'
+     Dvips determines the bounding boxes from the material in the DVI
+     file it understands.  Lots of PostScript specials are not part of
+     that.  Since the TeX boxes do not make it into the DVI file, but
+     merely characters, rules and specials do, Dvips might include far
+     too small areas.  The option `psfixbb' will include `/dev/null' as
+     a graphic file in the ultimate upper left and lower right corner
+     of the previewed box.  This will make Dvips generate an
+     appropriate bounding box.
+
+`dvips'
+     If this option is specified as a class option or to other
+     packages, several packages pass things like page size information
+     to Dvips, or cause crop marks or draft messages written on pages.
+     This seriously hampers the usability of previews.  If this option
+     is specified, the changes will be undone if possible.
+
+`pdftex'
+     If this option is set, PDFTeX is assumed as the output driver.
+     This mainly affects the `tightpage' option.
+
+`xetex'
+     If this option is set, XeTeX is assumed as the output driver.
+     This mainly affects the `tightpage' option.
+
+`displaymath'
+     will make all displayed math environments subject to preview
+     processing.  This will typically be the most desired option.
+
+`floats'
+     will make all float objects subject to preview processing.  If you
+     want to be more selective about what floats to pass through to a
+     preview, you should instead use the `\PreviewSnarfEnvironment'
+     command on the floats you want to have previewed.
+
+`textmath'
+     will make all text math subject to previews.  Since math mode is
+     used throughly inside of LaTeX even for other purposes, this works
+     by redefining `\(', `\)' and `$' and the `math' environment
+     (apparently some people use that).  Only occurences of these text
+     math delimiters in later loaded packages and in the main document
+     will thus be affected.
+
+`graphics'
+     will subject all `\includegraphics' commands to a preview.
+
+`sections'
+     will subject all section headers to a preview.
+
+`delayed'
+     will delay all activations and redefinitions the `preview' package
+     makes until `\'`begin{document}'.  The purpose of this is to cater
+     for documents which should be subjected to the `preview' package
+     without having been prepared for it.  You can process such
+     documents with
+
+          latex '\RequirePackage[active,delayed,OPTIONS]{preview}
+          \input{FILENAME}'
+
+     This relaxes the requirement to be loading the `preview' package
+     as last package.
+
+DRIVER
+     loads a special driver file `prDRIVER.def'.  The remaining options
+     are implemented through the use of driver files.
+
+`auctex'
+     This driver will produce fake error messages at the start and end
+     of every preview environment that enable the Emacs package
+     preview-latex in connection with AUCTeX to pinpoint the exact
+     source location where the previews have originated.
+     Unfortunately, there is no other reliable means of passing the
+     current TeX input position _in_ a line to external programs.  In
+     order to make the parsing more robust, this option also switches
+     off quite a few diagnostics that could be misinterpreted.
+
+     You should not specify this option manually, since it will only be
+     needed by automated runs that want to parse the pseudo error
+     messages.  Those runs will then use `\PassOptionsToPackage' in
+     order to effect the desired behaviour.  In addition,
+     `prauctex.cfg' will get loaded unless inhibited by the `noconfig'
+     option.  This caters for the most frequently encountered
+     problematic commands.
+
+`showlabels'
+     During the editing process, some people like to see the label
+     names in their equations, figures and the like.  Now if you are
+     using Emacs for editing, and in particular preview-latex, I'd
+     strongly recommend that you check out the RefTeX package which
+     pretty much obliterates the need for this kind of functionality.
+     If you still want it, standard LaTeX provides it with the
+     `showkeys' package, and there is also the less encompassing
+     `showlabels' package.  Unfortunately, since those go to some pain
+     not to change the page layout and spacing, they also don't change
+     `preview''s idea of the TeX dimensions of the involved boxes.  So
+     if you are using `preview' for determing bounding boxes, those
+     packages are mostly useless.  The option `showlabels' offers a
+     substitute for them.
+
+`tightpage'
+     It is not uncommon to want to use the results of `preview' as
+     graphic images for some other application.  One possibility is to
+     generate a flurry of EPS files with
+
+          dvips -E -i -Pwww -o OUTPUTFILE.000 INPUTFILE
+
+     However, in case those are to be processed further into graphic
+     image files by Ghostscript, this process is inefficient since all
+     of those files need to be processed one by one.  In addition, it
+     is necessary to extract the bounding box comments from the EPS
+     files and convert them into page dimension parameters for
+     Ghostscript in order to avoid full-page graphics.  This is not
+     even possible if you wanted to use Ghostscript in a _single_ run
+     for generating the files from a single PostScript file, since
+     Dvips will in that case leave no bounding box information anywhere.
+
+     The solution is to use the `tightpage' option.  That way a single
+     command line like
+
+          `gs -sDEVICE=png16m -dTextAlphaBits=4 -r300
+          -dGraphicsAlphaBits=4 -dSAFER -q -dNOPAUSE
+          -sOutputFile=OUTPUTFILE%d.png INPUTFILE.ps'
+
+     will be able to produce tight graphics from a single PostScript
+     file generated with Dvips _without_ use of the options `-E -i', in
+     a single run.
+
+     The `tightpage' option actually also works when using the `pdftex'
+     option and generating PDF files with PDFTeX.  The resulting PDF
+     file has separate page dimensions for every page and can directly
+     be converted with one run of Ghostscript into image files.
+
+     If neither `dvips' or `pdftex' have been specified, the
+     corresponding option will get autodetected and invoked.
+
+     If you need this in a batch environment where you don't want to
+     use `preview''s automatic extraction facilities, no problem: just
+     don't use any of the extraction options, and wrap everything to be
+     previewed into `preview' environments.  This is how LyX does its
+     math previews.
+
+     If the pages under the `tightpage' option are just too tight, you
+     can adjust by setting the length `\PreviewBorder' to a different
+     value by using `\setlength'.  The default value is `0.50001bp',
+     which is half of a usual PostScript point, rounded up.  If you go
+     below this value, the resulting page size may drop below `1bp',
+     and Ghostscript does not seem to like that.  If you need finer
+     control, you can adjust the bounding box dimensions individually
+     by changing the macro `\PreviewBbAdjust' with the help of
+     `\renewcommand'.  Its default value is
+
+          \newcommand \PreviewBbAdjust
+          {-\PreviewBorder -\PreviewBorder
+          \PreviewBorder  \PreviewBorder}
+
+     This adjusts the left, lower, right and upper borders by the given
+     amount.  The macro must contain 4 TeX dimensions after another,
+     and you may not omit the units if you specify them explicitly
+     instead of by register.  PostScript points have the unit `bp'.
+
+`lyx'
+     This option is for the sake of LyX developers.  It will output a
+     few diagnostics relevant for the sake of LyX' preview
+     functionality (at the time of writing, mostly implemented for math
+     insets, in versions of LyX starting with 1.3.0).
+
+`counters'
+     This writes out diagnostics at the start and the end of previews.
+     Only the counters changed since the last output get written, and
+     if no counters changed, nothing gets written at all.  The list
+     consists of counter name and value, both enclosed in `{}' braces,
+     followed by a space.  The last such pair is followed by a colon
+     (`:') if it is at the start of the preview snippet, and by a
+     period (`.') if it is at the end.  The order of different
+     diagnostics like this being issued depends on the order of the
+     specification of the options when calling the package.
+
+     Systems like preview-latex use this for keeping counters accurate
+     when single previews are regenerated.
+
+`footnotes'
+     This makes footnotes render as previews, and only as their
+     footnote symbol.  A convenient editing feature inside of Emacs.
+
+   The following options are just for debugging purposes of the package
+and similar to the corresponding TeX commands they allude to:
+
+`tracingall'
+     causes lots of diagnostic output to appear in the log file during
+     the preview collecting phases of TeX's operation.  In contrast to
+     the similarly named TeX command, it will not switch to
+     `\errorstopmode', nor will it change the setting of
+     `\tracingonline'.
+
+`showbox'
+     This option will show the contents of the boxes shipped out to the
+     DVI files.  It also sets `\showboxbreadth' and `\showboxdepth' to
+     their maximum values at the end of loading this package, but you
+     may reset them if you don't like that.
+
+\1f
+File: preview-latex.info,  Node: Provided commands,  Prev: Package options,  Up: The LaTeX style file
+
+6.1.2 Provided commands
+-----------------------
+
+`\begin{preview}...\end{preview}'
+     The `preview' environment causes its contents to be set as a
+     single preview image.  Insertions like figures and footnotes
+     (except those included in minipages) will typically lead to error
+     messages or be lost.  In case the `preview' package has not been
+     activated, the contents of this environment will be typeset
+     normally.
+
+`\begin{nopreview}...\end{nopreview}'
+     The `nopreview' environment will cause its contents not to undergo
+     any special treatment by the `preview' package.  When `preview' is
+     active, the contents will be discarded like all main text that
+     does not trigger the `preview' hooks.  When `preview' is not
+     active, the contents will be typeset just like the main text.
+
+     Note that both of these environments typeset things as usual when
+     preview is not active.  If you need something typeset
+     conditionally, use the `\ifPreview' conditional for it.
+
+`\PreviewMacro'
+     If you want to make a macro like `\includegraphics' (actually,
+     this is what is done by the `graphics' option to `preview')
+     produce a preview image, you put a declaration like
+
+          \PreviewMacro[*[[!]{\includegraphics}
+
+     or, more readable,
+
+          \PreviewMacro[{*[][]{}}]{\includegraphics}
+
+     into your preamble.  The optional argument to `\PreviewMacro'
+     specifies the arguments `\includegraphics' accepts, since this is
+     necessary information for properly ending the preview box.  Note
+     that if you are using the more readable form, you have to enclose
+     the argument in a `[{' and `}]' pair.  The inner braces are
+     necessary to stop any included `[]' pairs from prematurely ending
+     the optional argument, and to make a single `{}' denoting an
+     optional argument not get stripped away by TeX's argument parsing.
+
+     The letters simply mean
+
+    `*'
+          indicates an optional `*' modifier, as in `\includegraphics*'.
+
+    `['
+          ^^A] indicates an optional argument in brackets.  This syntax
+          is somewhat baroque, but brief.
+
+    `[]'
+          also indicates an optional argument in brackets.  Be sure to
+          have encluded the entire optional argument specification in
+          an additional pair of braces as described above.
+
+    `!'
+          indicates a mandatory argument.
+
+    `{}'
+          indicates the same.  Again, be sure to have that additional
+          level of braces around the whole argument specification.
+
+    `?'DELIMITER{TRUE CASE}{FALSE CASE}
+          is a conditional.  The next character is checked against
+          being equal to DELIMITER.  If it is, the specification TRUE
+          CASE is used for the further parsing, otherwise FALSE CASE
+          will be employed.  In neither case is something consumed from
+          the input, so {TRUE CASE} will still have to deal with the
+          upcoming delimiter.
+
+    `@'{LITERAL SEQUENCE}
+          will insert the given sequence literally into the executed
+          call of the command.
+
+    `-'
+          will just drop the next token.  It will probably be most
+          often used in the true branch of a `?' specification.
+
+    `#'{ARGUMENT}{REPLACEMENT}
+          is a transformation rule that calls a macro with the given
+          argument and replacement text on the rest of the argument
+          list.  The replacement is used in the executed call of the
+          command.  This can be used for parsing arbitrary constructs.
+          For example, the `[]' option could manually be implemented
+          with the option string `?[{#{[#1]}{[{#1}]}}{}'.  PStricks
+          users might enjoy this sort of flexibility.
+
+    `:'{ARGUMENT}{REPLACEMENT}
+          is again a transformation rule.  As opposed to `#', however,
+          the result of the transformation is parsed again.  You'll
+          rarely need this.
+
+     There is a second optional argument in brackets that can be used to
+     declare any default action to be taken instead.  This is mostly for
+     the sake of macros that influence numbering: you would want to keep
+     their effects in that respect.  The default action should use `#1'
+     for referring to the original (not the patched) command with the
+     parsed options appended.  Not specifying a second optional argument
+     here is equivalent to specifying `[#1]'.
+
+`\PreviewMacro*'
+     A similar invocation `\PreviewMacro*' simply throws the macro and
+     all of its arguments declared in the manner above away.  This is
+     mostly useful for having things like `\footnote' not do their
+     magic on their arguments.  More often than not, you don't want to
+     declare any arguments to scan to `\PreviewMacro*' since you would
+     want the remaining arguments to be treated as usual text and
+     typeset in that manner instead of being thrown away.  An exception
+     might be, say, sort keys for `\cite'.
+
+     A second optional argument in brackets can be used to declare any
+     default action to be taken instead.  This is for the sake of macros
+     that influence numbering: you would want to keep their effects in
+     that respect.  The default action might use `#1' for referring to
+     the original (not the patched) command with the parsed options
+     appended.  Not specifying a second optional argument here is
+     equivalent to specifying `[]' since the command usually gets thrown
+     away.
+
+     As an example for using this argument, you might want to specify
+
+          \PreviewMacro*\footnote[{[]}][#1{}]
+
+     This will replace a footnote by an empty footnote, but taking any
+     optional parameter into account, since an optional paramter changes
+     the numbering scheme.  That way the real argument for the footnote
+     remains for processing by preview-latex.
+
+`\PreviewEnvironment'
+     The macro `\PreviewEnvironment' works just as `\PreviewMacro' does,
+     only for environments.
+
+`\PreviewEnvironment*'
+     And the same goes for `\PreviewEnvironment*' as compared to
+     `\PreviewMacro*'.
+
+`\PreviewSnarfEnvironment'
+     This macro does not typeset the original environment inside of a
+     preview box, but instead typesets just the contents of the
+     original environment inside of the preview box, leaving nothing
+     for the original environment.  This has to be used for figures,
+     for example, since they would
+
+       1. produce insertion material that cannot be extracted to the
+          preview properly,
+
+       2. complain with an error message about not being in outer par
+          mode.
+
+`\PreviewOpen'
+
+`\PreviewClose'
+     Those Macros form a matched preview pair.  This is for macros that
+     behave similar as `\begin' and `\end' of an environment.  It is
+     essential for the operation of `\PreviewOpen' that the macro
+     treated with it will open an additional group even when the preview
+     falls inside of another preview or inside of a `nopreview'
+     environment.  Similarly, the macro treated with `PreviewClose'
+     will close an environment even when inactive.
+
+`\ifPreview'
+     In case you need to know whether `preview' is active, you can use
+     the conditional `\ifPreview' together with `\else' and `\fi'.
+
+
+\1f
+File: preview-latex.info,  Node: The Emacs interface,  Next: The preview images,  Prev: The LaTeX style file,  Up: For advanced users
+
+6.2 The Emacs interface
+=======================
+
+You can use `M-x customize-group <RET> preview-latex <RET>' in order to
+customize these variables, or use the menus for it.  We explain the
+various available options together with explaining how they work
+together in making preview-latex work as intended.
+
+`preview-LaTeX-command'
+     When you generate previews on a buffer or a region, the command in
+     `preview-LaTeX-command' gets run (that variable should only be
+     changed with Customize since its structure is somewhat peculiar,
+     though expressive).  As usual with AUCTeX, you can continue
+     working while this is going on.  It is not a good idea to change
+     the file until after preview-latex has established where to place
+     the previews which it can only do after the LaTeX run completes.
+     This run produces a host of pseudo-error messages that get parsed
+     by preview-latex at the end of the LaTeX run and give it the
+     necessary information about where in the source file the LaTeX
+     code for the various previews is located exactly. The parsing
+     takes a moment and will render Emacs busy.
+
+`preview-LaTeX-command-replacements'
+     This variable specifies transformations to be used before calling
+     the configured command.  One possibility is to have `\pdfoutput=0 '
+     appended to every command starting with `pdf'.  This particular
+     setting is available as the shortcut
+     `preview-LaTeX-disable-pdfoutput'.  Since preview-latex can work
+     with PDF files by now, there is little incentive for using this
+     option, anymore (for projects not requiring PDF output, the added
+     speed of `dvipng' might make this somewhat attractive).
+
+`preview-required-option-list'
+     `preview-LaTeX-command' uses `preview-required-option-list' in
+     order to pass options such as `auctex', `active' and `dvips' to
+     the `preview' package.  This means that the user need (and should)
+     not supply these in the document itself in case he wants to be
+     able to still compile his document without it turning into an
+     incoherent mass of little pictures.  These options even get passed
+     in when the user loads `preview' explicitly in his document.
+
+     The default includes an option `counters' that is controlled by the
+     boolean variable
+
+`preview-preserve-counters'
+     This option will cause the `preview' package to emit information
+     that will assist in keeping things like equation counters and
+     section numbers reasonably correct even when you are regenerating
+     only single previews.
+
+`preview-default-option-list'
+`preview-default-preamble'
+     If the document does not call in the package `preview' itself (via
+     `\usepackage') in the preamble, the preview package is loaded using
+     default options from `preview-default-option-list' and additional
+     commands specified in `preview-default-preamble'.
+
+`preview-fast-conversion'
+     This is relevant only for DVI mode.  It defaults to `On' and
+     results in the whole document being processed as one large
+     PostScript file from which the single images are extracted with
+     the help of parsing the PostScript for use of so-called DSC
+     comments.  The bounding boxes are extracted with the help of TeX
+     instead of getting them from Dvips.  If you are experiencing
+     bounding box problems, try setting this option to `Off'.
+
+`preview-prefer-TeX-bb'
+     If this option is `On', it tells preview-latex never to try to
+     extract bounding boxes from the bounding box comments of EPS files,
+     but rather rely on the boxes it gets from TeX.  If you activated
+     `preview-fast-conversion', this is done, anyhow, since there are no
+     EPS files from which to read this information.  The option
+     defaults to `Off', simply because about the only conceivable
+     reason to switch off `preview-fast-conversion' would be that you
+     have some bounding box problem and want to get Dvips' angle on
+     that matter.
+
+`preview-scale-function'
+`preview-reference-face'
+`preview-document-pt-list'
+`preview-default-document-pt'
+     `preview-scale-function' determines by what factor images should
+     be scaled when appearing on the screen.  If you specify a
+     numerical value here, the physical size on the screen will be that
+     of the original paper output scaled by the specified factor, at
+     least if Emacs' information about screen size and resolution are
+     correct.  The default is to let `preview-scale-from-face'
+     determine the scale function.  This function determines the scale
+     factor by making the size of the default font in the document
+     match that of the on-screen fonts.
+
+     The size of the screen fonts is deduced from the font
+     `preview-reference-face' (usually the default face used for
+     display), the size of the default font for the document is
+     determined by calling `preview-document-pt'.  This function
+     consults the members of `preview-document-pt-list' in turn until
+     it gets the desired information.  The default consults first
+     `preview-parsed-font-size', then calls `preview-auctex-font-size' which
+     asks AUCTeX about any size specification like `12pt' to the
+     documentclass that it might have detected when parsing the
+     document, and finally reverts to just assuming
+     `preview-default-document-pt' as the size used in the document
+     (defaulting to 10pt).
+
+     If you find that the size of previews and the other Emacs display
+     clashes, something goes wrong.  `preview-parsed-font-size' is
+     determined at `\begin{document}' time; if the default font size
+     changes after that, it will not get reported.  If you have an
+     outdated version of `preview.sty' in your path, the size might not
+     be reported at all.  If in this case AUCTeX is unable to find a
+     size specification, and if you are using a document class with a
+     different default value (like KomaScript), the default fallback
+     assumption will probably be wrong and preview-latex will scale up
+     things too large.  So better specify those size options even when
+     you know that LaTeX does not need them: preview-latex might
+     benefit from them.  Another possibility for error is that you have
+     not enabled AUCTeX's document parsing options.  The fallback
+     method of asking AUCTeX about the size might be disabled in future
+     versions of preview-latex since in general it is more reliable to
+     get this information from the LaTeX run itself.
+
+`preview-fast-dvips-command'
+`preview-dvips-command'
+     The regular command for turning a DVI file into a single
+     PostScript file is `preview-fast-dvips-command', while
+     `preview-dvips-command' is used for cranking out a DVI file where
+     every preview is in a separate EPS file.  Which of the two
+     commands gets used depends on the setting of
+     `preview-fast-conversion'.  The printer specified here by default
+     is `-Pwww' by default, which will usually get you scalable fonts
+     where available. If you are experiencing problems, you might want
+     to try playing around with Dvips options (*note
+     (dvips)Command-line options::).
+
+     The conversion of the previews into PostScript or EPS files gets
+     started after the LaTeX run completes when Emacs recognizes the
+     first image while parsing the error messages.  When Emacs has
+     finished parsing the error messages, it activates all detected
+     previews.  This entails throwing away any previous previews
+     covering the same areas, and then replacing the text in its visual
+     appearance by a placeholder looking like a roadworks sign.
+
+`preview-nonready-icon-specs'
+     This is the roadworks sign displayed while previews are being
+     prepared.  You may want to customize the font sizes at which
+     preview-latex switches over between different icon sizes, and the
+     ascent ratio which determines how high above the base line the
+     icon gets placed.
+
+`preview-error-icon-specs'
+`preview-icon-specs'
+     Those are icons placed before the source code of an opened preview
+     and, respectively, the image specs to be used for PostScript
+     errors, and a normal open preview in text representation.
+
+`preview-inner-environments'
+     This is a list of environments that are regarded as inner levels
+     of an outer environment when doing `preview-environment'. One
+     example when this is needed is in
+     `\begin{equation}\begin{split}...\end{split}\end{equation}', and
+     accordingly `split' is one entry in `preview-inner-environments'.
+
+`preview-use-balloon-help'
+     If you turn this XEmacs-only option `on', then moving the mouse
+     over previews and icons will show appropriate help texts.  This
+     works by switching on `balloon-help-mode' in the buffer if it is
+     not already enabled.  The default now is `off' since some users
+     reported problems with their version of XEmacs.  GNU Emacs has its
+     corresponding `tooltip-mode' enabled by default and in usable
+     condition.
+
+
+\1f
+File: preview-latex.info,  Node: The preview images,  Next: Misplaced previews,  Prev: The Emacs interface,  Up: For advanced users
+
+6.3 The preview images
+======================
+
+`preview-image-type'
+`preview-image-creators'
+`preview-gs-image-type-alist'
+     What happens when LaTeX is finished depends on the configuration of
+     `preview-image-type'.  What to do for each of the various settings
+     is specified in the variable `preview-image-creators'.  The options
+     to pass into Ghostscript and what Emacs image type to use is
+     specified in `preview-gs-image-type-alist'.
+
+     `preview-image-type' defaults to `png'.  For this to work, your
+     version of Ghostscript needs to support the `png16m' device.  If
+     you are experiencing problems here, you might want to reconfigure
+     `gs-image-type-alist' or `preview-image-type'.  Reconfiguring
+     `preview-image-creators' is only necessary for adding additional
+     image types.
+
+     Most devices make preview-latex start up a single Ghostscript
+     process for the entire preview run (as opposed to one per image)
+     and feed it either sections of a PDF file (if PDFLaTeX was used),
+     or (after running Dvips) sections of a single PostScript file or
+     separate EPS files in sequence for conversion into PNG format
+     which can be displayed much faster by Emacs.  Actually, not in
+     sequence but backwards since you are most likely editing at the
+     end of the document.  And as an added convenience, any preview
+     that happens to be on-screen is given higher priority so that
+     preview-latex will first cater for the images that are displayed.
+     There are various options customizable concerning aspects of that
+     operation, see the customization group `Preview Gs' for this.
+
+     Another noteworthy setting of `preview-image-type' is `dvipng': in
+     this case, the `dvipng'will get run on DVI output (see below for
+     PDF).  This is in general much faster than Dvips and Ghostscript.
+     In that case, the option
+
+`preview-dvipng-command'
+     will get run for doing the conversion, and it is expected that
+
+`preview-dvipng-image-type'
+     images get produced (`dvipng' might be configured for other image
+     types as well).  You will notice that `preview-gs-image-type-alist'
+     contains an entry for `dvipng': this actually has nothing to with
+     `dvipng' itself but specifies the image type and Ghostscript device
+     option to use when `dvipng' can't be used.  This will obviously be
+     the case for PDF output by PDFLaTeX, but it will also happen if
+     the DVI file contains PostScript specials in which case the
+     affected images will get run through Dvips and Ghostscript once
+     `dvipng' finishes.
+
+`preview-gs-options'
+     Most interesting to the user perhaps is the setting of this
+     variable.  It contains the default antialiasing settings
+     `-dTextAlphaBits=4' and `-dGraphicsAlphaBits=4'.  Decreasing those
+     values to 2 or 1 might increase Ghostscript's performance if you
+     find it lacking.
+
+   Running and feeding Ghostscript from preview-latex happens
+asynchronously again: you can resume editing while the images arrive.
+While those pretty pictures filling in the blanks on screen tend to
+make one marvel instead of work, rendering the non-displayed images
+afterwards will not take away your attention and will eventually
+guarantee that jumping around in the document will encounter only
+prerendered images.
+
+\1f
+File: preview-latex.info,  Node: Misplaced previews,  Prev: The preview images,  Up: For advanced users
+
+6.4 Misplaced previews
+======================
+
+If you are reading this section, the first thing is to check that your
+problem is not caused by x-symbol in connection with an installation not
+supporting 8-bit characters (*note x-symbol interoperation::).  If not,
+here's the beef:
+
+   As explained previously, Emacs uses pseudo-error messages generated
+by the `preview' package in order to pinpoint the exact source location
+where a preview originated.  This works in running text, but fails when
+preview material happens to lie in macro arguments, like the contents
+of `\emph'. Those macros first read in their entire argument, munge it
+through, perhaps transform it somehow, process it and perhaps then
+typeset something. When they finally typeset something, where is the
+location where the stuff originated? TeX, having read in the entire
+argument before, does not know and actually there would be no sane way
+of defining it.
+
+   For previews contained inside such a macro argument, the default
+behaviour of preview-latex is to use a position immediately after the
+closing brace of the argument. All the previews get placed there, all at
+a zero-width position, which means that Emacs displays it in an order
+that preview-latex cannot influence (currently in Emacs it is even
+possible that the order changes between runs). And since the placement
+of those previews is goofed up, you will not be able to regenerate them
+by clicking on them. The default behaviour is thus somewhat undesirable.
+
+   The solution (like with other preview problems) is to tell the LaTeX
+`preview' package how to tackle this problem (*note The LaTeX style
+file::).  Simply, you don't need `\emph' do anything at all during
+previews! You only want the text math previewed, so the solution is to
+use `\PreviewMacro*\emph' in the preamble of your document which will
+make LaTeX ignore `\emph' completely as long as it is not part of a
+larger preview (in which case it gets typeset as usual). Its argument
+thus becomes ordinary text and gets treated like ordinary text.
+
+   Note that it would be a bad idea to declare
+`\PreviewMacro*[{{}}]\emph' since then both `\emph' as well as its
+argument would be ignored instead of previewed. For user-level macros,
+this is almost never wanted, but there may be internal macros where you
+might want to ignore internal arguments.
+
+   The same mechanism can be used for a number of other text-formatting
+commands like `\textrm', `\textit' and the like. While they all use the
+same internal macro `\text@command', it will not do to redefine just
+that, since they call it only after having read their argument in, and
+then it already is too late. So you need to disable every of those
+commands by hand in your document preamble.
+
+   Actually, we wrote all of the above just to scare you.  At least all
+of the above mentioned macros and a few more are already catered for by
+a configuration file `prauctex.cfg' that gets loaded by default unless
+the `preview' package gets loaded with the `noconfig' option.  You can
+make your own copy of this file in a local directory and edit it in
+case of need.  You can also add loading of a file of your liking to
+`preview-default-preamble', or alternatively do the manual disabling of
+your favorite macro in `preview-default-preamble', which is
+customizable in the Preview Latex group.
+
+\1f
+File: preview-latex.info,  Node: ToDo,  Next: Frequently Asked Questions,  Prev: For advanced users,  Up: Top
+
+Appendix A ToDo
+***************
+
+   * Support other formats than just LaTeX
+
+     plain TeX users and ConTeXt users should not have to feel left
+     out.  While ConTeXt is not supported yet by released versions of
+     AUCTeX, at least supporting plain would help people, and be a start
+     for ConTeXt as well.  There are plain-based formats like MusiXTeX
+     that could benefit a lot from preview-latex.  The main part of the
+     difficulties here is to adapt `preview.dtx' to produce stuff not
+     requiring LaTeX.
+
+   * Support nested snippets
+
+     Currently you can't have both a footnote (which gets displayed as
+     just its footnote number) and math inside of a footnote rendered
+     as an image: such nesting might be achieved by rerunning
+     preview-latex on the footnote contents when one opens the footnote
+     for editing.
+
+   * Support other text properties than just images
+
+     Macros like `\textit' can be rendered as images, but the resulting
+     humungous blob is not suitable for editing, in particular since the
+     line filling from LaTeX does not coincide with that of Emacs.  It
+     would be much more useful if text properties just switched the
+     relevant font to italics rather than replacing the whole text with
+     an image.  It would also make editing quite easier.  Then there
+     are things like footnotes that are currently just replaced by
+     their footnote number.  While editing is not a concern here (the
+     number is not in the original text, anyway), it would save a lot
+     of conversion time if no images were generated, but Emacs just
+     displayed a properly fontified version of the footnote number.
+     Also, this might make preview-latex useful even on text terminals.
+
+   * Find a way to facilitate Source Specials
+
+     Probably in connection with adding appropriate support to
+     `dvipng', it would be nice if clicking on an image from a larger
+     piece of source code would place the cursor at the respective
+     source code location.
+
+   * Make `preview.dtx' look reasonable in AUCTeX
+
+     It is a bit embarrassing that `preview.dtx' is written in a manner
+     that will not give either good syntax highlighting or good
+     indentation when employing AUCTeX.
+
+   * Web page work
+
+     Currently, preview-latex's web page is not structured at all.
+     Better navigation would be desirable, as well as separate News and
+     Errata eye catchers.
+
+   * Manual improvements
+
+        - Pepper the manual with screen shots and graphics
+
+          This will be of interest for the HTML and TeX renditions of
+          the texinfo manual.  Since Texinfo now supports images as
+          well, this could well be nice to have.
+
+        - Fix duplicates
+
+          Various stuff appears several times.
+
+
+   * Implement rendering pipelines for Emacs
+
+     The current `gs.el' interface is fundamentally flawed, not only
+     because of a broken implementation.  A general batchable and
+     daemonizable rendering infrastructure that can work on all kinds of
+     preview images for embedding into buffers is warranted.  The
+     current implementation has a rather adhoc flavor and is not easily
+     extended.  It will not work outside of AUCTeX, either.
+
+   * Integrate into RefTeX
+
+     When referencing to equations and the like, the preview-images of
+     the source rather than plain text should be displayed.  If the
+     preview in question covers labels, those should appear in the
+     bubble help and/or a context menu.  Apropos:
+
+   * Implement LaTeX error indicators
+
+     Previews on erroneous LaTeX passages might gain a red border or
+     similar.
+
+   * Pop up relevant online documentation for frequent errors
+
+     A lot of errors are of the "badly configured" variety.  Perhaps the
+     relevant info pages should be delivered in addition to the error
+     message.
+
+   * Implement a table editing mode where every table cell gets output
+     as a separate preview.  Alternatively, output the complete table
+     metrics in a way that lets people click on individual cells for
+     editing purposes.
+
+   * Benchmark and kill Emacs inefficiencies
+
+     Both the LaTeX run under Emacs control as well as actual image
+     insertion in Emacs could be faster.  CVS Emacs has improved in that
+     respect, but it still is slower than desirable.
+
+   * Improve image support under Emacs
+
+     The general image and color handling in Emacs is inefficient and
+     partly defective.  This is still the case in CVS.  One option
+     would be to replace the whole color and image handling with GDK
+     routines when this library is available, since it has been
+     optimized for it.
+
+
+\1f
+File: preview-latex.info,  Node: Frequently Asked Questions,  Next: Copying this Manual,  Prev: ToDo,  Up: Top
+
+Appendix B Frequently Asked Questions
+*************************************
+
+* Menu:
+
+* Introduction to FAQ::
+* Requirements::
+* Installation Trouble::
+* Customization::
+* Troubleshooting::
+* Other formats::
+
+\1f
+File: preview-latex.info,  Node: Introduction to FAQ,  Next: Requirements,  Prev: Frequently Asked Questions,  Up: Frequently Asked Questions
+
+B.1 Introduction
+================
+
+B.1.1 How can I contribute to the FAQ?
+--------------------------------------
+
+Send an email with the subject:
+     Preview FAQ
+   to <auctex-devel@gnu.org>.
+
+\1f
+File: preview-latex.info,  Node: Requirements,  Next: Installation Trouble,  Prev: Introduction to FAQ,  Up: Frequently Asked Questions
+
+B.2 Requirements
+================
+
+B.2.1 Which version of (X)Emacs is needed?
+------------------------------------------
+
+See also the table at the end of the section.
+
+   preview-latex nominally requires GNU Emacs with a version of at
+least 21.1.  However, Emacs 22 (currently under development) offers
+superior performance and wider platform support, and is even now the
+recommended platform to use.
+
+   While recent versions of XEmacs 21.4 are supported, doing this in a
+satisfactory manner has proven to be difficult due to technical
+shortcomings and differing API's which are hard to come by.  If
+preview-latex is an important part of your editing workflow, you are
+likely to get better results and support by switching to Emacs.  Of
+course, you can improve support for your favorite editor by giving
+feedback in case you encounter bugs.
+
+B.2.2 Which versions of Ghostscript and AUCTeX are needed?
+----------------------------------------------------------
+
+We recommend to use GNU or AFPL Ghostscript with a version of at least
+7.07.
+
+   preview-latex has been distributed as part of AUCTeX since version
+11.80.  If your version of AUCTeX is older than that, or if it does not
+contain a working copy of preview-latex, complain to wherever you got
+it from.
+
+B.2.3 I have trouble with the display format...
+-----------------------------------------------
+
+We recommend keeping the variable `preview-image-type' set to `dvipng'
+(if you have it installed) or `png'.  This is the default and can be
+set via the Preview/Customize menu.
+
+   All other formats are known to have inconveniences, either in file
+size or quality.  There are some Emacs versions around not supporting
+PNG; the proper way to deal with that is to complain to your Emacs
+provider.  Short of that, checking out PNM or JPEG formats might be a
+good way to find out whether the lack of PNG format support might be
+the only problem with your Emacs.
+
+B.2.4 For which OS does preview work?
+-------------------------------------
+
+It is known to work under the X Window System for Linux and for several
+flavors of Unix: we have reports for HP and Solaris.
+
+   There are several development versions of Emacs around for native
+MacOS Carbon, and preview-latex is working with them, too.
+
+   With Windows, Cygwin and native ports of XEmacs should work.
+preview-latex will not work with any native version 21 of Emacs under
+Windows: you need to get a hold of Emacs 22 which is at the time of
+this writing not released but available as a developer snapshot.
+
+   The entry "X11/Unix" currently means Linux, Solaris or HP/UX, as
+well as the X-specific version for Mac/OSX.
+
+OS             Emacs version   XEmacs version
+X11/Unix       21.1            21.4.9
+Win9x cygwin   21.3.50?        21.4.8
+Win9x native   22.1            21.4.8
+MacOSX native  22.1            -
+
+\1f
+File: preview-latex.info,  Node: Installation Trouble,  Next: Customization,  Prev: Requirements,  Up: Frequently Asked Questions
+
+B.3 Installation Trouble
+========================
+
+B.3.1 I just get `LaTeX found no preview images'.
+-------------------------------------------------
+
+The reason for this is that LaTeX found no preview images in the
+document in question.
+
+   One reason might be that there are no previews to be seen.  If you
+have not used preview-latex before, you might not know its manner of
+operation.  One sure-fire way to test if you just have a document where
+no previews are to be found is to use the provided example document
+`circ.tex' (you will have to copy it to some directory where you have
+write permissions).  If the symptom persists, you have a problem, and
+the problem is most likely a LaTeX problem.  Here are possible reasons:
+
+Filename database not updated
+     Various TeX distributions have their own ways of knowing where the
+     files are without actually searching directories.  The normal
+     preview-latex installation should detect common tools for that
+     purpose and use them.  If this goes wrong, or if the files get
+     installed into a place where they are not looked for, the LaTeX
+     run will fail.
+
+An incomplete manual installation
+     This should not happen if you followed installation instructions.
+     Unfortunately, people know better all the time.  If only
+     `preview.sty' gets installed without a set of supplementary files
+     also in the `latex' subdirectory, preview-latex runs will not
+     generate any errors, but they will not produce any previews,
+     either.
+
+An outdated `preview' installation
+     The `preview.sty' package is useful for more than just
+     preview-latex.  For example, it is part of TeXlive.  So you have
+     to make sure that preview-latex does not get to work with outdated
+     style and configuration files: some newer features will not work
+     with older TeX style files, and really old files will make
+     preview-latex fail completely.  There usual is a local `texmf'
+     tree, or even a user-specific tree that are searched before the
+     default tree.  Make sure that the first version of those files
+     that gets found is the correct one.
+
+B.3.2 I have problems with the XEmacs installation
+--------------------------------------------------
+
+Please note that the XEmacs installation is different, since XEmacs has
+a package system that gets used here.  Please make sure that you read
+and follow the installation instructions for XEmacs.
+
+\1f
+File: preview-latex.info,  Node: Customization,  Next: Troubleshooting,  Prev: Installation Trouble,  Up: Frequently Asked Questions
+
+B.4 Customization
+=================
+
+B.4.1 Why don't I get balloon help like in the screen shots?
+------------------------------------------------------------
+
+Some users have reported problems with their XEmacs version, so balloon
+help is no longer switched on by default.  Use the Preview/Customize
+menu or `<M-x> customize-variable' in order to customize
+`preview-use-balloon-help' to `On'.  This only concerns XEmacs:
+tooltips under GNU Emacs are enabled by default and unproblematic.
+
+B.4.2 How to include additional environments like `enumerate'
+-------------------------------------------------------------
+
+By default, preview-latex is intended mainly for displaying
+mathematical formulas, so environments like `enumerate' or `tabular'
+(except where contained in a float) are not included.  You can include
+them however manually by adding the lines:
+
+     \usepackage[displaymath,textmath,sections,graphics,floats]{preview}
+     \PreviewEnvironment{enumerate}
+
+   in your document header, that is before
+
+     \begin{document}
+   In general, `preview' should be loaded as the last thing before the
+start of document.
+
+   Be aware that
+
+     \PreviewEnvironment{...}
+
+   does not accept a comma separated list!  Also note that by putting
+more and more
+
+     \PreviewEnvironment{...}
+
+   in your document, it will look more and more like a DVI file preview
+when running preview-latex.  Since each preview is treated as one large
+monolithic block by Emacs, one should really restrict previews to those
+elements where the improvement in visual representation more than makes
+up for the decreased editability.
+
+B.4.3 What if I don't want to change the document?
+--------------------------------------------------
+
+The easiest way is to generate a configuration file in the current
+directory.  You can basically either create `prdefault.cfg' which is
+used for any use of the `preview' package, or you can use
+`prauctex.cfg' which only applies to the use from with Emacs.  Let us
+assume you use the latter.  In that case you should write something like
+
+     \InputIfFileExists{preview/prauctex.cfg}{}{}
+     \PreviewEnvironment{enumerate}
+
+   in it.  The first line inputs the system-wide default configuration
+(the file name should match that, but not your own `prauctex.cfg'),
+then you add your own stuff.
+
+B.4.4 Suddenly I get gazillions of ridiculous pages?!?
+------------------------------------------------------
+
+When preview-latex works on extracting its stuff, it typesets each
+single preview on a page of its own.  This only happens when actual
+previews get generated.  Now if you want to configure preview-latex in
+your document, you need to add your own `\usepackage' call to `preview'
+so that it will be able to interpret its various definition commands.
+It is an error to add the `active' option to this invocation: you don't
+want the package to be active unless preview-latex itself enables the
+previewing operation (which it will).
+
+B.4.5 Does preview-latex work with presentation classes?
+--------------------------------------------------------
+
+preview-latex should work with most presentation classes.  However,
+since those classes often have macros or pseudo environments
+encompassing a complete slide, you will need to use the customization
+facilities of `preview.sty' to tell it how to resolve this, whether you
+want no previews, previews of whole slides or previews of inner
+material.
+
+\1f
+File: preview-latex.info,  Node: Troubleshooting,  Next: Other formats,  Prev: Customization,  Up: Frequently Asked Questions
+
+B.5 Troubleshooting
+===================
+
+B.5.1 Preview causes all sort of strange error messages
+-------------------------------------------------------
+
+When running preview-latex and taking a look at either log file or
+terminal output, lots of messages like
+
+     ! Preview: Snippet 3 started.
+     <-><->
+
+     l.52 \item Sie lassen sich als Funktion $
+                                              y = f(x)$ darstellen.
+     ! Preview: Snippet 3 ended.(491520+163840x2494310).
+     <-><->
+
+     l.52 \item Sie lassen sich als Funktion $y = f(x)$
+                                                        darstellen.
+
+   appear (previous versions generated messages looking even more like
+errors).  Those are not real errors (as will be noted in the log file).
+Or rather, while they *are* really TeX error messages, they are
+intentional.  This currently is the only reliable way to pass the
+information from the LaTeX run of preview-latex to its Emacs part about
+where the previews originated in the source text.  Since they are
+actual errors, you will also get AUCTeX to state
+     Preview-LaTeX exited as expected with code 1 at Wed Sep  4 17:03:30
+   after the LaTeX run in the run buffer.  This merely indicates that
+errors were present, and errors will always be present when
+preview-latex is operating.  There might be also real errors, so in
+case of doubt, look for them explicitly in either run buffer or the
+resulting `.log' file.
+
+B.5.2 Why do my DVI and PDF output files vanish?
+------------------------------------------------
+
+In order to produce the preview images preview-latex runs LaTeX on the
+master or region file.  The resulting DVI or PDF file can happen to
+have the same name as the output file of a regular LaTeX run.  So the
+regular output file gets overwritten and is subsequently deleted by
+preview-latex.
+
+B.5.3 My output file suddenly only contains preview images?!
+------------------------------------------------------------
+
+As mentioned in the previews FAQ entry, preview-latex might use the
+file name of the original output file for the creation of preview
+images.  If the original output file is being displayed with a viewer
+when this happens, you might see strange effects depending on the
+viewer, e.g. a message about the file being corrupted or the display of
+all the preview images instead of your typeset document.  (Also *Note
+Customization::.)
+
+\1f
+File: preview-latex.info,  Node: Other formats,  Prev: Troubleshooting,  Up: Frequently Asked Questions
+
+B.6 preview-latex when not using LaTeX
+======================================
+
+B.6.1 Does preview-latex work with  PDFLaTeX?
+---------------------------------------------
+
+Yes, as long as you use AUCTeX's own PDFLaTeX mode and have not messed
+with `TeX-command-list'.
+
+B.6.2 Does preview-latex work with `elatex'?
+--------------------------------------------
+
+No problem here.  If you configure your AUCTeX to use `elatex', or
+simply have `latex' point to `elatex', this will work fine.  Modern TeX
+distributions use eTeX for LaTeX, anyway.
+
+B.6.3 Does preview-latex work with ConTeXt?
+-------------------------------------------
+
+In short, no.  The `preview' package is LaTeX-dependent.  Adding
+support for other formats requires volunteers.
+
+B.6.4 Does preview-latex work with plain TeX?
+---------------------------------------------
+
+Again, no.  Restructuring the `preview' package for `plain' operation
+would be required.  Volunteers welcome.
+
+   In some cases you might get around by making a wrapper pseudo-Master
+file looking like the following:
+
+     \documentclass{article}
+     \usepackage{plain}
+     \begin{document}
+     \begin{plain}
+     \input myplainfile
+     \end{plain}
+     \end{document}
+
+\1f
+File: preview-latex.info,  Node: Copying this Manual,  Next: Index,  Prev: Frequently Asked Questions,  Up: Top
+
+Appendix C Copying this Manual
+******************************
+
+The copyright notice for this manual is:
+
+   This manual is for preview-latex, a LaTeX preview mode for AUCTeX
+(version 11.86 from 2010-02-21).
+
+   Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 Free Software
+Foundation, Inc.
+
+     Permission is granted to copy, distribute and/or modify this
+     document under the terms of the GNU Free Documentation License,
+     Version 1.3 or any later version published by the Free Software
+     Foundation; with no Invariant Sections, no Front-Cover Texts and
+     no Back-Cover Texts.  A copy of the license is included in the
+     section entitled "GNU Free Documentation License."
+
+The full license text can be read here:
+
+* Menu:
+
+* GNU Free Documentation License:: License for copying this manual.
+
+\1f
+File: preview-latex.info,  Node: GNU Free Documentation License,  Up: Copying this Manual
+
+C.1 GNU Free Documentation License
+==================================
+
+                     Version 1.3, 3 November 2008
+
+     Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software
+     Foundation, Inc.  `http://fsf.org/'
+
+     Everyone is permitted to copy and distribute verbatim copies
+     of this license document, but changing it is not allowed.
+
+  0. PREAMBLE
+
+     The purpose of this License is to make a manual, textbook, or other
+     functional and useful document "free" in the sense of freedom: to
+     assure everyone the effective freedom to copy and redistribute it,
+     with or without modifying it, either commercially or
+     noncommercially.  Secondarily, this License preserves for the
+     author and publisher a way to get credit for their work, while not
+     being considered responsible for modifications made by others.
+
+     This License is a kind of "copyleft", which means that derivative
+     works of the document must themselves be free in the same sense.
+     It complements the GNU General Public License, which is a copyleft
+     license designed for free software.
+
+     We have designed this License in order to use it for manuals for
+     free software, because free software needs free documentation: a
+     free program should come with manuals providing the same freedoms
+     that the software does.  But this License is not limited to
+     software manuals; it can be used for any textual work, regardless
+     of subject matter or whether it is published as a printed book.
+     We recommend this License principally for works whose purpose is
+     instruction or reference.
+
+  1. APPLICABILITY AND DEFINITIONS
+
+     This License applies to any manual or other work, in any medium,
+     that contains a notice placed by the copyright holder saying it
+     can be distributed under the terms of this License.  Such a notice
+     grants a world-wide, royalty-free license, unlimited in duration,
+     to use that work under the conditions stated herein.  The
+     "Document", below, refers to any such manual or work.  Any member
+     of the public is a licensee, and is addressed as "you".  You
+     accept the license if you copy, modify or distribute the work in a
+     way requiring permission under copyright law.
+
+     A "Modified Version" of the Document means any work containing the
+     Document or a portion of it, either copied verbatim, or with
+     modifications and/or translated into another language.
+
+     A "Secondary Section" is a named appendix or a front-matter section
+     of the Document that deals exclusively with the relationship of the
+     publishers or authors of the Document to the Document's overall
+     subject (or to related matters) and contains nothing that could
+     fall directly within that overall subject.  (Thus, if the Document
+     is in part a textbook of mathematics, a Secondary Section may not
+     explain any mathematics.)  The relationship could be a matter of
+     historical connection with the subject or with related matters, or
+     of legal, commercial, philosophical, ethical or political position
+     regarding them.
+
+     The "Invariant Sections" are certain Secondary Sections whose
+     titles are designated, as being those of Invariant Sections, in
+     the notice that says that the Document is released under this
+     License.  If a section does not fit the above definition of
+     Secondary then it is not allowed to be designated as Invariant.
+     The Document may contain zero Invariant Sections.  If the Document
+     does not identify any Invariant Sections then there are none.
+
+     The "Cover Texts" are certain short passages of text that are
+     listed, as Front-Cover Texts or Back-Cover Texts, in the notice
+     that says that the Document is released under this License.  A
+     Front-Cover Text may be at most 5 words, and a Back-Cover Text may
+     be at most 25 words.
+
+     A "Transparent" copy of the Document means a machine-readable copy,
+     represented in a format whose specification is available to the
+     general public, that is suitable for revising the document
+     straightforwardly with generic text editors or (for images
+     composed of pixels) generic paint programs or (for drawings) some
+     widely available drawing editor, and that is suitable for input to
+     text formatters or for automatic translation to a variety of
+     formats suitable for input to text formatters.  A copy made in an
+     otherwise Transparent file format whose markup, or absence of
+     markup, has been arranged to thwart or discourage subsequent
+     modification by readers is not Transparent.  An image format is
+     not Transparent if used for any substantial amount of text.  A
+     copy that is not "Transparent" is called "Opaque".
+
+     Examples of suitable formats for Transparent copies include plain
+     ASCII without markup, Texinfo input format, LaTeX input format,
+     SGML or XML using a publicly available DTD, and
+     standard-conforming simple HTML, PostScript or PDF designed for
+     human modification.  Examples of transparent image formats include
+     PNG, XCF and JPG.  Opaque formats include proprietary formats that
+     can be read and edited only by proprietary word processors, SGML or
+     XML for which the DTD and/or processing tools are not generally
+     available, and the machine-generated HTML, PostScript or PDF
+     produced by some word processors for output purposes only.
+
+     The "Title Page" means, for a printed book, the title page itself,
+     plus such following pages as are needed to hold, legibly, the
+     material this License requires to appear in the title page.  For
+     works in formats which do not have any title page as such, "Title
+     Page" means the text near the most prominent appearance of the
+     work's title, preceding the beginning of the body of the text.
+
+     The "publisher" means any person or entity that distributes copies
+     of the Document to the public.
+
+     A section "Entitled XYZ" means a named subunit of the Document
+     whose title either is precisely XYZ or contains XYZ in parentheses
+     following text that translates XYZ in another language.  (Here XYZ
+     stands for a specific section name mentioned below, such as
+     "Acknowledgements", "Dedications", "Endorsements", or "History".)
+     To "Preserve the Title" of such a section when you modify the
+     Document means that it remains a section "Entitled XYZ" according
+     to this definition.
+
+     The Document may include Warranty Disclaimers next to the notice
+     which states that this License applies to the Document.  These
+     Warranty Disclaimers are considered to be included by reference in
+     this License, but only as regards disclaiming warranties: any other
+     implication that these Warranty Disclaimers may have is void and
+     has no effect on the meaning of this License.
+
+  2. VERBATIM COPYING
+
+     You may copy and distribute the Document in any medium, either
+     commercially or noncommercially, provided that this License, the
+     copyright notices, and the license notice saying this License
+     applies to the Document are reproduced in all copies, and that you
+     add no other conditions whatsoever to those of this License.  You
+     may not use technical measures to obstruct or control the reading
+     or further copying of the copies you make or distribute.  However,
+     you may accept compensation in exchange for copies.  If you
+     distribute a large enough number of copies you must also follow
+     the conditions in section 3.
+
+     You may also lend copies, under the same conditions stated above,
+     and you may publicly display copies.
+
+  3. COPYING IN QUANTITY
+
+     If you publish printed copies (or copies in media that commonly
+     have printed covers) of the Document, numbering more than 100, and
+     the Document's license notice requires Cover Texts, you must
+     enclose the copies in covers that carry, clearly and legibly, all
+     these Cover Texts: Front-Cover Texts on the front cover, and
+     Back-Cover Texts on the back cover.  Both covers must also clearly
+     and legibly identify you as the publisher of these copies.  The
+     front cover must present the full title with all words of the
+     title equally prominent and visible.  You may add other material
+     on the covers in addition.  Copying with changes limited to the
+     covers, as long as they preserve the title of the Document and
+     satisfy these conditions, can be treated as verbatim copying in
+     other respects.
+
+     If the required texts for either cover are too voluminous to fit
+     legibly, you should put the first ones listed (as many as fit
+     reasonably) on the actual cover, and continue the rest onto
+     adjacent pages.
+
+     If you publish or distribute Opaque copies of the Document
+     numbering more than 100, you must either include a
+     machine-readable Transparent copy along with each Opaque copy, or
+     state in or with each Opaque copy a computer-network location from
+     which the general network-using public has access to download
+     using public-standard network protocols a complete Transparent
+     copy of the Document, free of added material.  If you use the
+     latter option, you must take reasonably prudent steps, when you
+     begin distribution of Opaque copies in quantity, to ensure that
+     this Transparent copy will remain thus accessible at the stated
+     location until at least one year after the last time you
+     distribute an Opaque copy (directly or through your agents or
+     retailers) of that edition to the public.
+
+     It is requested, but not required, that you contact the authors of
+     the Document well before redistributing any large number of
+     copies, to give them a chance to provide you with an updated
+     version of the Document.
+
+  4. MODIFICATIONS
+
+     You may copy and distribute a Modified Version of the Document
+     under the conditions of sections 2 and 3 above, provided that you
+     release the Modified Version under precisely this License, with
+     the Modified Version filling the role of the Document, thus
+     licensing distribution and modification of the Modified Version to
+     whoever possesses a copy of it.  In addition, you must do these
+     things in the Modified Version:
+
+       A. Use in the Title Page (and on the covers, if any) a title
+          distinct from that of the Document, and from those of
+          previous versions (which should, if there were any, be listed
+          in the History section of the Document).  You may use the
+          same title as a previous version if the original publisher of
+          that version gives permission.
+
+       B. List on the Title Page, as authors, one or more persons or
+          entities responsible for authorship of the modifications in
+          the Modified Version, together with at least five of the
+          principal authors of the Document (all of its principal
+          authors, if it has fewer than five), unless they release you
+          from this requirement.
+
+       C. State on the Title page the name of the publisher of the
+          Modified Version, as the publisher.
+
+       D. Preserve all the copyright notices of the Document.
+
+       E. Add an appropriate copyright notice for your modifications
+          adjacent to the other copyright notices.
+
+       F. Include, immediately after the copyright notices, a license
+          notice giving the public permission to use the Modified
+          Version under the terms of this License, in the form shown in
+          the Addendum below.
+
+       G. Preserve in that license notice the full lists of Invariant
+          Sections and required Cover Texts given in the Document's
+          license notice.
+
+       H. Include an unaltered copy of this License.
+
+       I. Preserve the section Entitled "History", Preserve its Title,
+          and add to it an item stating at least the title, year, new
+          authors, and publisher of the Modified Version as given on
+          the Title Page.  If there is no section Entitled "History" in
+          the Document, create one stating the title, year, authors,
+          and publisher of the Document as given on its Title Page,
+          then add an item describing the Modified Version as stated in
+          the previous sentence.
+
+       J. Preserve the network location, if any, given in the Document
+          for public access to a Transparent copy of the Document, and
+          likewise the network locations given in the Document for
+          previous versions it was based on.  These may be placed in
+          the "History" section.  You may omit a network location for a
+          work that was published at least four years before the
+          Document itself, or if the original publisher of the version
+          it refers to gives permission.
+
+       K. For any section Entitled "Acknowledgements" or "Dedications",
+          Preserve the Title of the section, and preserve in the
+          section all the substance and tone of each of the contributor
+          acknowledgements and/or dedications given therein.
+
+       L. Preserve all the Invariant Sections of the Document,
+          unaltered in their text and in their titles.  Section numbers
+          or the equivalent are not considered part of the section
+          titles.
+
+       M. Delete any section Entitled "Endorsements".  Such a section
+          may not be included in the Modified Version.
+
+       N. Do not retitle any existing section to be Entitled
+          "Endorsements" or to conflict in title with any Invariant
+          Section.
+
+       O. Preserve any Warranty Disclaimers.
+
+     If the Modified Version includes new front-matter sections or
+     appendices that qualify as Secondary Sections and contain no
+     material copied from the Document, you may at your option
+     designate some or all of these sections as invariant.  To do this,
+     add their titles to the list of Invariant Sections in the Modified
+     Version's license notice.  These titles must be distinct from any
+     other section titles.
+
+     You may add a section Entitled "Endorsements", provided it contains
+     nothing but endorsements of your Modified Version by various
+     parties--for example, statements of peer review or that the text
+     has been approved by an organization as the authoritative
+     definition of a standard.
+
+     You may add a passage of up to five words as a Front-Cover Text,
+     and a passage of up to 25 words as a Back-Cover Text, to the end
+     of the list of Cover Texts in the Modified Version.  Only one
+     passage of Front-Cover Text and one of Back-Cover Text may be
+     added by (or through arrangements made by) any one entity.  If the
+     Document already includes a cover text for the same cover,
+     previously added by you or by arrangement made by the same entity
+     you are acting on behalf of, you may not add another; but you may
+     replace the old one, on explicit permission from the previous
+     publisher that added the old one.
+
+     The author(s) and publisher(s) of the Document do not by this
+     License give permission to use their names for publicity for or to
+     assert or imply endorsement of any Modified Version.
+
+  5. COMBINING DOCUMENTS
+
+     You may combine the Document with other documents released under
+     this License, under the terms defined in section 4 above for
+     modified versions, provided that you include in the combination
+     all of the Invariant Sections of all of the original documents,
+     unmodified, and list them all as Invariant Sections of your
+     combined work in its license notice, and that you preserve all
+     their Warranty Disclaimers.
+
+     The combined work need only contain one copy of this License, and
+     multiple identical Invariant Sections may be replaced with a single
+     copy.  If there are multiple Invariant Sections with the same name
+     but different contents, make the title of each such section unique
+     by adding at the end of it, in parentheses, the name of the
+     original author or publisher of that section if known, or else a
+     unique number.  Make the same adjustment to the section titles in
+     the list of Invariant Sections in the license notice of the
+     combined work.
+
+     In the combination, you must combine any sections Entitled
+     "History" in the various original documents, forming one section
+     Entitled "History"; likewise combine any sections Entitled
+     "Acknowledgements", and any sections Entitled "Dedications".  You
+     must delete all sections Entitled "Endorsements."
+
+  6. COLLECTIONS OF DOCUMENTS
+
+     You may make a collection consisting of the Document and other
+     documents released under this License, and replace the individual
+     copies of this License in the various documents with a single copy
+     that is included in the collection, provided that you follow the
+     rules of this License for verbatim copying of each of the
+     documents in all other respects.
+
+     You may extract a single document from such a collection, and
+     distribute it individually under this License, provided you insert
+     a copy of this License into the extracted document, and follow
+     this License in all other respects regarding verbatim copying of
+     that document.
+
+  7. AGGREGATION WITH INDEPENDENT WORKS
+
+     A compilation of the Document or its derivatives with other
+     separate and independent documents or works, in or on a volume of
+     a storage or distribution medium, is called an "aggregate" if the
+     copyright resulting from the compilation is not used to limit the
+     legal rights of the compilation's users beyond what the individual
+     works permit.  When the Document is included in an aggregate, this
+     License does not apply to the other works in the aggregate which
+     are not themselves derivative works of the Document.
+
+     If the Cover Text requirement of section 3 is applicable to these
+     copies of the Document, then if the Document is less than one half
+     of the entire aggregate, the Document's Cover Texts may be placed
+     on covers that bracket the Document within the aggregate, or the
+     electronic equivalent of covers if the Document is in electronic
+     form.  Otherwise they must appear on printed covers that bracket
+     the whole aggregate.
+
+  8. TRANSLATION
+
+     Translation is considered a kind of modification, so you may
+     distribute translations of the Document under the terms of section
+     4.  Replacing Invariant Sections with translations requires special
+     permission from their copyright holders, but you may include
+     translations of some or all Invariant Sections in addition to the
+     original versions of these Invariant Sections.  You may include a
+     translation of this License, and all the license notices in the
+     Document, and any Warranty Disclaimers, provided that you also
+     include the original English version of this License and the
+     original versions of those notices and disclaimers.  In case of a
+     disagreement between the translation and the original version of
+     this License or a notice or disclaimer, the original version will
+     prevail.
+
+     If a section in the Document is Entitled "Acknowledgements",
+     "Dedications", or "History", the requirement (section 4) to
+     Preserve its Title (section 1) will typically require changing the
+     actual title.
+
+  9. TERMINATION
+
+     You may not copy, modify, sublicense, or distribute the Document
+     except as expressly provided under this License.  Any attempt
+     otherwise to copy, modify, sublicense, or distribute it is void,
+     and will automatically terminate your rights under this License.
+
+     However, if you cease all violation of this License, then your
+     license from a particular copyright holder is reinstated (a)
+     provisionally, unless and until the copyright holder explicitly
+     and finally terminates your license, and (b) permanently, if the
+     copyright holder fails to notify you of the violation by some
+     reasonable means prior to 60 days after the cessation.
+
+     Moreover, your license from a particular copyright holder is
+     reinstated permanently if the copyright holder notifies you of the
+     violation by some reasonable means, this is the first time you have
+     received notice of violation of this License (for any work) from
+     that copyright holder, and you cure the violation prior to 30 days
+     after your receipt of the notice.
+
+     Termination of your rights under this section does not terminate
+     the licenses of parties who have received copies or rights from
+     you under this License.  If your rights have been terminated and
+     not permanently reinstated, receipt of a copy of some or all of
+     the same material does not give you any rights to use it.
+
+ 10. FUTURE REVISIONS OF THIS LICENSE
+
+     The Free Software Foundation may publish new, revised versions of
+     the GNU Free Documentation License from time to time.  Such new
+     versions will be similar in spirit to the present version, but may
+     differ in detail to address new problems or concerns.  See
+     `http://www.gnu.org/copyleft/'.
+
+     Each version of the License is given a distinguishing version
+     number.  If the Document specifies that a particular numbered
+     version of this License "or any later version" applies to it, you
+     have the option of following the terms and conditions either of
+     that specified version or of any later version that has been
+     published (not as a draft) by the Free Software Foundation.  If
+     the Document does not specify a version number of this License,
+     you may choose any version ever published (not as a draft) by the
+     Free Software Foundation.  If the Document specifies that a proxy
+     can decide which future versions of this License can be used, that
+     proxy's public statement of acceptance of a version permanently
+     authorizes you to choose that version for the Document.
+
+ 11. RELICENSING
+
+     "Massive Multiauthor Collaboration Site" (or "MMC Site") means any
+     World Wide Web server that publishes copyrightable works and also
+     provides prominent facilities for anybody to edit those works.  A
+     public wiki that anybody can edit is an example of such a server.
+     A "Massive Multiauthor Collaboration" (or "MMC") contained in the
+     site means any set of copyrightable works thus published on the MMC
+     site.
+
+     "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0
+     license published by Creative Commons Corporation, a not-for-profit
+     corporation with a principal place of business in San Francisco,
+     California, as well as future copyleft versions of that license
+     published by that same organization.
+
+     "Incorporate" means to publish or republish a Document, in whole or
+     in part, as part of another Document.
+
+     An MMC is "eligible for relicensing" if it is licensed under this
+     License, and if all works that were first published under this
+     License somewhere other than this MMC, and subsequently
+     incorporated in whole or in part into the MMC, (1) had no cover
+     texts or invariant sections, and (2) were thus incorporated prior
+     to November 1, 2008.
+
+     The operator of an MMC Site may republish an MMC contained in the
+     site under CC-BY-SA on the same site at any time before August 1,
+     2009, provided the MMC is eligible for relicensing.
+
+
+ADDENDUM: How to use this License for your documents
+====================================================
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and license
+notices just after the title page:
+
+       Copyright (C)  YEAR  YOUR NAME.
+       Permission is granted to copy, distribute and/or modify this document
+       under the terms of the GNU Free Documentation License, Version 1.3
+       or any later version published by the Free Software Foundation;
+       with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+       Texts.  A copy of the license is included in the section entitled ``GNU
+       Free Documentation License''.
+
+   If you have Invariant Sections, Front-Cover Texts and Back-Cover
+Texts, replace the "with...Texts." line with this:
+
+         with the Invariant Sections being LIST THEIR TITLES, with
+         the Front-Cover Texts being LIST, and with the Back-Cover Texts
+         being LIST.
+
+   If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+   If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License, to
+permit their use in free software.
+
+\1f
+File: preview-latex.info,  Node: Index,  Prev: Copying this Manual,  Up: Top
+
+Index
+*****
+
+\0\b[index\0\b]
+* Menu:
+
+* \PreviewEnvironment:                   Provided commands.   (line 133)
+* \PreviewMacro:                         Provided commands.   (line  26)
+* Activation:                            Activating preview-latex.
+                                                              (line   6)
+* C-c C-k:                               Keys and lisp.       (line 161)
+* C-c C-m P:                             Keys and lisp.       (line  64)
+* C-c C-p C-b:                           Keys and lisp.       (line  90)
+* C-c C-p C-c C-b:                       Keys and lisp.       (line 116)
+* C-c C-p C-c C-d:                       Keys and lisp.       (line 122)
+* C-c C-p C-c C-p:                       Keys and lisp.       (line 100)
+* C-c C-p C-c C-r:                       Keys and lisp.       (line 111)
+* C-c C-p C-c C-s:                       Keys and lisp.       (line 106)
+* C-c C-p C-d:                           Keys and lisp.       (line  95)
+* C-c C-p C-e:                           Keys and lisp.       (line  75)
+* C-c C-p C-f:                           Keys and lisp.       (line 129)
+* C-c C-p C-i:                           Keys and lisp.       (line 148)
+* C-c C-p C-p:                           Keys and lisp.       (line  24)
+* C-c C-p C-r:                           Keys and lisp.       (line  85)
+* C-c C-p C-s:                           Keys and lisp.       (line  80)
+* C-c C-p C-w:                           Keys and lisp.       (line  46)
+* C-u C-c C-p C-f:                       Keys and lisp.       (line 142)
+* Caching a preamble:                    Simple customization.
+                                                              (line  59)
+* Contacts:                              Contacts.            (line   6)
+* Copying:                               Copying.             (line   6)
+* Copyright:                             Copying.             (line   6)
+* CVS access:                            Availability.        (line   6)
+* Distribution:                          Copying.             (line   6)
+* Download:                              Availability.        (line   6)
+* FDL, GNU Free Documentation License:   GNU Free Documentation License.
+                                                              (line   6)
+* Free:                                  Copying.             (line   6)
+* Free software:                         Copying.             (line   6)
+* General Public License:                Copying.             (line   6)
+* GPL:                                   Copying.             (line   6)
+* Inline math:                           Simple customization.
+                                                              (line 110)
+* Kill preview-generating process:       Keys and lisp.       (line 161)
+* License:                               Copying.             (line   6)
+* M-m P:                                 Keys and lisp.       (line  64)
+* M-x preview-report-bug <RET>:          Keys and lisp.       (line 153)
+* Mailing list:                          Contacts.            (line   6)
+* Menu entries:                          Keys and lisp.       (line   6)
+* Philosophy of preview-latex:           What use is it?.     (line   6)
+* preview-at-point:                      Keys and lisp.       (line  24)
+* preview-auctex-font-size:              The Emacs interface. (line 100)
+* preview-auto-cache-preamble:           Simple customization.
+                                                              (line  59)
+* preview-buffer:                        Keys and lisp.       (line  90)
+* preview-cache-preamble:                Keys and lisp.       (line 129)
+* preview-cache-preamble-off:            Keys and lisp.       (line 142)
+* preview-clearout:                      Keys and lisp.       (line 111)
+* preview-clearout-at-point:             Keys and lisp.       (line 100)
+* preview-clearout-buffer:               Keys and lisp.       (line 116)
+* preview-clearout-document:             Keys and lisp.       (line 106)
+* preview-copy-region-as-mml:            Keys and lisp.       (line  46)
+* preview-default-document-pt:           The Emacs interface. (line  83)
+* preview-default-option-list:           The Emacs interface. (line  53)
+* preview-default-preamble <1>:          Misplaced previews.  (line  59)
+* preview-default-preamble:              The Emacs interface. (line  54)
+* preview-document:                      Keys and lisp.       (line  95)
+* preview-document-pt:                   The Emacs interface. (line  97)
+* preview-document-pt-list:              The Emacs interface. (line  82)
+* preview-dvipng-command:                The preview images.  (line  40)
+* preview-dvipng-image-type:             The preview images.  (line  43)
+* preview-dvips-command:                 The Emacs interface. (line 125)
+* preview-environment:                   Keys and lisp.       (line  75)
+* preview-error-icon-specs:              The Emacs interface. (line 152)
+* preview-fast-conversion:               The Emacs interface. (line  60)
+* preview-fast-dvips-command:            The Emacs interface. (line 124)
+* preview-goto-info-page:                Keys and lisp.       (line 148)
+* preview-gs-image-type-alist:           The preview images.  (line   8)
+* preview-gs-options <1>:                The preview images.  (line  54)
+* preview-gs-options:                    Problems with Ghostscript.
+                                                              (line  22)
+* preview-icon-specs:                    The Emacs interface. (line 153)
+* preview-image-creators <1>:            The preview images.  (line   7)
+* preview-image-creators:                Problems with Ghostscript.
+                                                              (line  31)
+* preview-image-type <1>:                The preview images.  (line   6)
+* preview-image-type <2>:                Problems with Ghostscript.
+                                                              (line  33)
+* preview-image-type:                    Basic modes of operation.
+                                                              (line  16)
+* preview-inner-environments:            The Emacs interface. (line 158)
+* preview-LaTeX-command:                 The Emacs interface. (line  11)
+* preview-LaTeX-command-replacements:    The Emacs interface. (line  25)
+* preview-nonready-icon-specs:           The Emacs interface. (line 145)
+* preview-parsed-font-size:              The Emacs interface. (line 100)
+* preview-prefer-TeX-bb:                 The Emacs interface. (line  69)
+* preview-preserve-counters <1>:         The Emacs interface. (line  47)
+* preview-preserve-counters:             Simple customization.
+                                                              (line  63)
+* preview-reference-face:                The Emacs interface. (line  81)
+* preview-region:                        Keys and lisp.       (line  85)
+* preview-report-bug:                    Keys and lisp.       (line 153)
+* preview-required-option-list <1>:      The Emacs interface. (line  35)
+* preview-required-option-list:          Simple customization.
+                                                              (line  63)
+* preview-scale-function:                The Emacs interface. (line  80)
+* preview-section:                       Keys and lisp.       (line  80)
+* preview-transparent-border:            Keys and lisp.       (line  56)
+* preview-use-balloon-help:              The Emacs interface. (line 165)
+* Readme:                                Introduction.        (line   6)
+* Report a bug:                          Keys and lisp.       (line 153)
+* Right:                                 Copying.             (line   6)
+* Showing \labels:                       Simple customization.
+                                                              (line  23)
+* Using dvipng:                          Basic modes of operation.
+                                                              (line  18)
+* Warranty:                              Copying.             (line   6)
+
+
+\1f
+Tag Table:
+Node: Top\7f942
+Node: Copying\7f2214
+Node: Introduction\7f2675
+Node: What use is it?\7f3348
+Node: Activating preview-latex\7f4740
+Node: Getting started\7f5555
+Node: Basic modes of operation\7f7642
+Node: More documentation\7f8846
+Node: Availability\7f9734
+Node: Contacts\7f10339
+Node: Installation\7f11611
+Node: Keys and lisp\7f11824
+Node: Simple customization\7f18492
+Node: Known problems\7f24253
+Node: Problems with Ghostscript\7f25074
+Node: Font problems with Dvips\7f27267
+Node: Emacs problems\7f28470
+Node: Too small bounding boxes\7f30207
+Node: x-symbol interoperation\7f31591
+Node: Middle-clicks paste instead of toggling\7f32973
+Node: For advanced users\7f33789
+Node: The LaTeX style file\7f34248
+Node: Package options\7f36809
+Node: Provided commands\7f47744
+Node: The Emacs interface\7f55099
+Node: The preview images\7f64279
+Node: Misplaced previews\7f67751
+Node: ToDo\7f71194
+Node: Frequently Asked Questions\7f75979
+Node: Introduction to FAQ\7f76302
+Node: Requirements\7f76641
+Node: Installation Trouble\7f79605
+Node: Customization\7f82167
+Node: Troubleshooting\7f85715
+Node: Other formats\7f88232
+Node: Copying this Manual\7f89549
+Node: GNU Free Documentation License\7f90474
+Node: Index\7f115615
+\1f
+End Tag Table
diff --git a/packages/auctex/preview.el b/packages/auctex/preview.el
new file mode 100644 (file)
index 0000000..a2a17d3
--- /dev/null
@@ -0,0 +1,3610 @@
+;;; preview.el --- embed preview LaTeX images in source buffer
+
+;; Copyright (C) 2001, 2002, 2003, 2004, 2005,
+;;               2006  Free Software Foundation, Inc.
+
+;; Author: David Kastrup
+;; Keywords: tex, wp, convenience
+
+;; This file 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, or (at your option)
+;; any later version.
+
+;; This file 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; see the file COPYING.  If not, write to
+;; the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; $Id: preview.el,v 1.284 2009/06/18 19:20:46 angeli Exp $
+;;
+;; This style is for the "seamless" embedding of generated images
+;; into LaTeX source code.  Please see the README and INSTALL files
+;; for further instruction.
+;;
+;; Please use the usual configure script for installation: more than
+;; just Elisp files are involved: a LaTeX style, icon files, startup
+;; code and so on.
+;;
+;; Quite a few things with regard to preview-latex's operation can be
+;; configured by using
+;; M-x customize-group RET preview RET
+;;
+;; Please report bugs with M-x preview-report-bug RET
+;;
+
+;;; Code:
+
+(require 'tex-site)
+(require 'tex)
+(require 'tex-buf)
+(require 'latex)
+
+(eval-when-compile
+  (condition-case nil
+      (require 'desktop)
+    (file-error (message "Missing desktop package:
+preview-latex buffers will not survive across sessions.")))
+  (condition-case nil
+      (require 'reporter)
+    (file-error (message "Missing reporter library, probably from the mail-lib package:
+preview-latex's bug reporting commands will probably not work.")))
+  (require 'info)
+  (defvar error))
+
+;; we need the compatibility macros which do _not_ get byte-compiled.
+(eval-when-compile
+  (if (featurep 'xemacs)
+      (load-library "prv-xemacs.el")))
+
+;; if the above load-library kicked in, this will not cause anything
+;; to get loaded.
+(require (if (featurep 'xemacs)
+            'prv-xemacs 'prv-emacs))
+
+(defgroup preview nil "Embed Preview images into LaTeX buffers."
+  :group 'AUCTeX
+  :prefix "preview-"
+  :link '(custom-manual "(preview-latex)Top")
+  :link '(info-link "(preview-latex)The Emacs interface")
+  :link '(url-link :tag "Homepage" "http://www.gnu.org/software/auctex/"))
+
+(defgroup preview-gs nil "Preview's Ghostscript renderer."
+  :group 'preview
+  :prefix "preview-")
+
+(defgroup preview-appearance nil "Preview image appearance."
+  :group 'preview
+  :prefix "preview-")
+
+(defconst preview-specs-type
+  '(repeat
+    (list :tag "Image spec"
+         ;; Use an extra :value keyword to avoid a bug in
+         ;; `widget-convert' of XEmacs 21.4 and Emacs 21.
+         ;; Analogously for the following `const' statements.
+         (const :format "" :value :type)
+         (choice :tag "Image type"
+                 (const xpm)
+                 (const xbm)
+                 (symbol :tag "Other"))
+         (set :inline t :tag "Minimum font size"
+              (list :inline t :tag ""
+                    (const :format "" :value :min)
+                    (integer :tag "pixels")))
+         (const :format "" :value :file) (string :tag "Filename")
+         (set :inline t :tag "Ascent ratio"
+              (list :inline t :tag ""
+                    (const :format "" :value :ascent)
+                    (integer :tag "percent of image"
+                             :value 50))))))
+
+(defun preview-specs-setter (symbol value)
+  "Set SYMBOL to VALUE and clear `preview-min-alist' property.
+This is used in icon specs, so that customizing will
+clear cached icons."
+  (put symbol 'preview-min-alist nil)
+  (set-default symbol value))
+
+(defcustom preview-nonready-icon-specs
+  '((:type xpm :min 26 :file "prvwrk24.xpm" :ascent 90)
+    (:type xpm :min 22 :file "prvwrk20.xpm" :ascent 90)
+    (:type xpm :min 17 :file "prvwrk16.xpm" :ascent 90)
+    (:type xpm :min 15 :file "prvwrk14.xpm" :ascent 90)
+    (:type xpm         :file "prvwrk12.xpm" :ascent 90)
+    (:type xbm         :file "prvwrk24.xbm" :ascent 90))
+  "The icon used for previews to be generated.
+The spec must begin with `:type'.  File names are relative to
+`load-path' and `data-directory', a spec `:min' requires a
+minimal pixel height for `preview-reference-face' before the spec
+will be considered.  Since evaluating the `:file' spec takes
+considerable time under XEmacs, it should come after the `:min'
+spec to avoid unnecessary evaluation time."
+  :group 'preview-appearance
+  :type preview-specs-type
+  :set #'preview-specs-setter)
+
+(defvar preview-nonready-icon)
+
+(defcustom preview-error-icon-specs
+  '((:type xpm :min 22 :file "prverr24.xpm" :ascent 90)
+    (:type xpm :min 18 :file "prverr20.xpm" :ascent 90)
+    (:type xpm         :file "prverr16.xpm" :ascent 90)
+    (:type xbm         :file "prverr24.xbm" :ascent 90))
+  "The icon used for PostScript errors.
+The spec must begin with `:type'.  File names are relative to
+`load-path' and `data-directory', a spec `:min' requires a
+minimal pixel height for `preview-reference-face' before the spec
+will be considered.  Since evaluating the `:file' spec takes
+considerable time under XEmacs, it should come after the `:min'
+spec to avoid unnecessary evaluation time."
+  :group 'preview-appearance
+  :type preview-specs-type
+  :set #'preview-specs-setter
+)
+
+(defvar preview-error-icon)
+
+(defcustom preview-icon-specs
+  '((:type xpm :min 24 :file "prvtex24.xpm" :ascent 75)
+    (:type xpm :min 20 :file "prvtex20.xpm" :ascent 75)
+    (:type xpm :min 16 :file "prvtex16.xpm" :ascent 75)
+    (:type xpm         :file "prvtex12.xpm" :ascent 75)
+    (:type xbm :min 24 :file "prvtex24.xbm" :ascent 75)
+    (:type xbm :min 16 :file "prvtex16.xbm" :ascent 75)
+    (:type xbm         :file "prvtex12.xbm" :ascent 75))
+  "The icon used for an open preview.
+The spec must begin with `:type'.  File names are relative to
+`load-path' and `data-directory', a spec `:min' requires a
+minimal pixel height for `preview-reference-face' before the spec
+will be considered.  Since evaluating the `:file' spec takes
+considerable time under XEmacs, it should come after the `:min'
+spec to avoid unnecessary evaluation time."
+  :group 'preview-appearance
+  :type preview-specs-type
+  :set #'preview-specs-setter)
+
+(defvar preview-icon)
+
+(defgroup preview-latex nil "LaTeX options for preview."
+  :group 'preview
+  :prefix "preview-")
+
+(defcustom preview-image-creators
+  '((dvipng
+     (open preview-gs-open preview-dvipng-process-setup)
+     (place preview-gs-place)
+     (close preview-dvipng-close))
+    (png (open preview-gs-open)
+        (place preview-gs-place)
+        (close preview-gs-close))
+    (jpeg (open preview-gs-open)
+         (place preview-gs-place)
+         (close preview-gs-close))
+    (pnm (open preview-gs-open)
+         (place preview-gs-place)
+         (close preview-gs-close))
+    (tiff (open preview-gs-open)
+         (place preview-gs-place)
+         (close preview-gs-close)))
+  "Define functions for generating images.
+These functions get called in the process of generating inline
+images of the specified type.  The open function is called
+at the start of a rendering pass, the place function for
+placing every image, the close function at the end of
+the pass.  Look at the documentation of the various
+functions used here for the default settings, and at
+the function `preview-call-hook' through which those are
+called.  Additional argument lists specified in here
+are passed to the functions before any additional
+arguments given to `preview-call-hook'.
+
+Not all of these image types may be supported by your copy
+of Ghostscript, or by your copy of Emacs."
+  :group 'preview-gs
+  :type '(alist :key-type (symbol :tag "Preview's image type")
+               :value-type
+               (alist :tag "Handler" :key-type (symbol :tag "Operation:")
+                      :value-type (list :tag "Handler"
+                                        (function :tag "Handler function")
+                                        (repeat :tag "Additional \
+function args" :inline t sexp))
+                      :options (open place close))))
+
+(defcustom preview-gs-image-type-alist
+  '((png png "-sDEVICE=png16m")
+    (dvipng png "-sDEVICE=png16m")
+    (jpeg jpeg "-sDEVICE=jpeg")
+    (pnm pbm "-sDEVICE=pnmraw")
+    (tiff tiff "-sDEVICE=tiff12nc"))
+  "*Alist of image types and corresponding Ghostscript options.
+The `dvipng' and `postscript' (don't use) entries really specify
+a fallback device when images can't be processed by the requested
+method, like when PDFTeX was used."
+  :group 'preview-gs
+  :type '(repeat (list :tag nil (symbol :tag "preview image-type")
+                      (symbol :tag "Emacs image-type")
+                      (repeat :inline t :tag "Ghostscript options" string))))
+
+(defcustom preview-image-type 'png
+  "*Image type to be used in images."
+  :group 'preview-gs
+  :type (append '(choice)
+               (mapcar (lambda (symbol) (list 'const (car symbol)))
+                       preview-image-creators)
+               '((symbol :tag "Other"))))
+
+(defun preview-call-hook (symbol &rest rest)
+  "Call a function from `preview-image-creators'.
+This looks up SYMBOL in the `preview-image-creators' entry
+for the image type `preview-image-type' and calls the
+hook function given there with the arguments specified there
+followed by REST.  If such a function is specified in there,
+that is."
+  (let ((hook (cdr (assq symbol
+                   (cdr (assq preview-image-type
+                              preview-image-creators))))))
+    (when hook
+      (apply (car hook) (append (cdr hook) rest)))))
+                  
+
+(defvar TeX-active-tempdir nil
+  "List of directory name, top directory name and reference count.")
+(make-variable-buffer-local 'TeX-active-tempdir)
+
+(defcustom preview-bb-filesize 1024
+  "Size of file area scanned for bounding box information."
+  :group 'preview-gs :type 'integer)
+
+(defcustom preview-preserve-indentation t
+  "*Whether to keep additional whitespace at the left of a line."
+  :group 'preview-appearance :type 'boolean)
+
+(defun preview-extract-bb (filename)
+  "Extract EPS bounding box vector from FILENAME."
+  (with-temp-buffer
+    (insert-file-contents-literally filename nil 0 preview-bb-filesize
+                                   t)
+    (goto-char (point-min))
+    (when (search-forward-regexp "%%BoundingBox:\
+ +\\([-+]?[0-9.]+\\)\
+ +\\([-+]?[0-9.]+\\)\
+ +\\([-+]?[0-9.]+\\)\
+ +\\([-+]?[0-9.]+\\)" nil t)
+      (vector
+       (if preview-preserve-indentation
+          (min 72 (string-to-number (match-string 1)))
+        (string-to-number (match-string 1)))
+       (string-to-number (match-string 2))
+       (string-to-number (match-string 3))
+       (string-to-number (match-string 4))
+       ))))
+
+(defcustom preview-prefer-TeX-bb nil
+  "*Prefer TeX bounding box to EPS one if available.
+If `preview-fast-conversion' is set, this option is not
+ consulted since the TeX bounding box has to be used anyway."
+  :group 'preview-gs
+  :type 'boolean)
+
+(defcustom preview-TeX-bb-border 0.5
+  "*Additional space in pt around Bounding Box from TeX."
+  :group 'preview-gs
+  :type 'number)
+
+(defvar preview-coding-system nil
+  "Coding system used for LaTeX process.")
+(make-variable-buffer-local 'preview-coding-system)
+(defvar preview-parsed-font-size nil
+  "Font size as parsed from the log of LaTeX run.")
+(make-variable-buffer-local 'preview-parsed-font-size)
+(defvar preview-parsed-magnification nil
+  "Magnification as parsed from the log of LaTeX run.")
+(make-variable-buffer-local 'preview-parsed-magnification)
+(defvar preview-parsed-pdfoutput nil
+  "PDFoutput as parsed from the log of LaTeX run.")
+(make-variable-buffer-local 'preview-parsed-pdfoutput)
+(defvar preview-parsed-counters nil
+  "Counters as parsed from the log of LaTeX run.")
+(make-variable-buffer-local 'preview-parsed-counters)
+(defvar preview-parsed-tightpage nil
+  "Tightpage as parsed from the log of LaTeX run.")
+(make-variable-buffer-local 'preview-parsed-tightpage)
+
+(defun preview-get-magnification ()
+  "Get magnification from `preview-parsed-magnification'."
+  (if preview-parsed-magnification
+      (/ preview-parsed-magnification 1000.0) 1.0))
+
+(defun preview-TeX-bb (list)
+  "Calculate bounding box from (ht dp wd).
+LIST consists of TeX dimensions in sp (1/65536 TeX point)."
+  (and
+   (consp list)
+   (let* ((dims (vconcat (mapcar
+                         #'(lambda (x)
+                             (/ x 65781.76)) list)))
+         (box
+          (vector
+           (+ 72 (min 0 (aref dims 2)))
+           (+ 720 (min (aref dims 0) (- (aref dims 1)) 0))
+           (+ 72 (max 0 (aref dims 2)))
+           (+ 720 (max (aref dims 0) (- (aref dims 1)) 0))))
+         (border (if preview-parsed-tightpage
+                     (vconcat (mapcar
+                               #'(lambda(x)
+                                   (/ x 65781.76)) preview-parsed-tightpage))
+                   (vector (- preview-TeX-bb-border)
+                           (- preview-TeX-bb-border)
+                           preview-TeX-bb-border
+                           preview-TeX-bb-border))))
+     (dotimes (i 4 box)
+       (aset box i (+ (aref box i) (aref border i)))))))
+
+(defcustom preview-gs-command (if (eq system-type 'windows-nt)
+                                 "GSWIN32C.EXE"
+                               "gs")
+  "*How to call gs for conversion from EPS.  See also `preview-gs-options'."
+  :group 'preview-gs
+  :type 'string)
+
+(defcustom preview-gs-options '("-q" "-dSAFER" "-dNOPAUSE"
+                               "-DNOPLATFONTS" "-dPrinted"
+                               "-dTextAlphaBits=4"
+                               "-dGraphicsAlphaBits=4")
+  "*Options with which to call gs for conversion from EPS.
+See also `preview-gs-command'."
+  :group 'preview-gs
+  :type '(repeat string))
+
+(defvar preview-gs-queue nil
+  "List of overlays to convert using gs.
+Buffer-local to the appropriate TeX process buffer.")
+(make-variable-buffer-local 'preview-gs-queue)
+
+(defvar preview-gs-outstanding nil
+  "Overlays currently processed.")
+(make-variable-buffer-local 'preview-gs-outstanding)
+
+(defcustom preview-gs-outstanding-limit 2
+  "*Number of requests allowed to be outstanding.
+This is the number of not-yet-completed requests we
+might at any time have piped into Ghostscript.  If
+this number is larger, the probability of Ghostscript
+working continuously is higher when Emacs is rather
+busy.  If this number is smaller, redisplay will
+follow changes in the displayed buffer area faster."
+  :group 'preview-gs
+  :type '(restricted-sexp
+         :match-alternatives
+         ((lambda (value) (and
+                           (integerp value)
+                           (> value 0)
+                           (< value 10))))
+         :tag "small number"))
+
+(defvar preview-gs-answer nil
+  "Accumulated answer of Ghostscript process.")
+(make-variable-buffer-local 'preview-gs-answer)
+
+(defvar preview-gs-image-type nil
+  "Image type for gs produced images.")
+(make-variable-buffer-local 'preview-gs-image-type)
+
+(defvar preview-gs-sequence nil
+  "Pair of sequence numbers for gs produced images.")
+(make-variable-buffer-local 'preview-gs-sequence)
+
+(defvar preview-scale nil
+  "Screen scale of images.
+Magnify by this factor to make images blend with other
+screen content.  Buffer-local to rendering buffer.")
+(make-variable-buffer-local 'preview-scale)
+
+(defvar preview-colors nil
+  "Color setup list.
+An array with elements 0, 1 and 2 for background,
+foreground and border colors, respectively.  Each element
+is a list of 3 real numbers between 0 and 1, or NIL
+of nothing special should be done for the color")
+(make-variable-buffer-local 'preview-colors)
+
+(defvar preview-gs-init-string nil
+  "Ghostscript setup string.")
+(make-variable-buffer-local 'preview-gs-init-string)
+
+(defvar preview-ps-file nil
+  "PostScript file name for fast conversion.")
+(make-variable-buffer-local 'preview-ps-file)
+
+(defvar preview-gs-dsc nil
+  "Parsed DSC information.")
+(make-variable-buffer-local 'preview-gs-dsc)
+
+(defvar preview-resolution nil
+  "Screen resolution where rendering started.
+Cons-cell of x and y resolution, given in
+dots per inch.  Buffer-local to rendering buffer.")
+(make-variable-buffer-local 'preview-resolution)
+
+(defun preview-gs-resolution (scale xres yres)
+  "Generate resolution argument for gs.
+Calculated from real-life factor SCALE and XRES and
+YRES, the screen resolution in dpi."
+  (format "-r%gx%g"
+         (/ (* scale xres) (preview-get-magnification))
+         (/ (* scale yres) (preview-get-magnification))))
+
+(defun preview-gs-behead-outstanding (err)
+  "Remove leading element of outstanding queue after error.
+Return element if non-nil.  ERR is the error string to
+show as response of Ghostscript."
+  (let ((ov (pop preview-gs-outstanding)))
+    (when ov
+      (preview-gs-flag-error ov err)
+      (overlay-put ov 'queued nil))
+    ov))
+    
+(defvar preview-gs-command-line nil)
+(make-variable-buffer-local 'preview-gs-command-line)
+(defvar preview-gs-file nil)
+(make-variable-buffer-local 'preview-gs-file)
+
+(defcustom preview-fast-conversion t
+  "*Set this for single-file PostScript conversion.
+This will have no effect when `preview-image-type' is
+set to `postscript'."
+  :group 'preview-latex
+  :type 'boolean)
+
+(defun preview-string-expand (arg &optional separator)
+  "Expand ARG as a string.
+It can already be a string.  Or it can be a list, then it is
+recursively evaluated using SEPARATOR as separator.  If a list
+element is in itself a CONS cell, the CAR of the list (after symbol
+dereferencing) can evaluate to either a string, in which case it is
+used as a separator for the rest of the list,
+or a boolean (t or nil) in which case the rest of the list is
+either evaluated and concatenated or ignored, respectively.
+ARG can be a symbol, and so can be the CDR
+of a cell used for string concatenation."
+  (cond
+   ((stringp arg) arg)
+   ((consp arg)
+    (mapconcat
+     #'identity
+     (delq nil
+          (mapcar
+           (lambda(x)
+             (if (consp x)
+                 (let ((sep (car x)))
+                   (while (and (symbolp sep)
+                               (not (memq sep '(t nil))))
+                     (setq sep (symbol-value sep)))
+                   (if (stringp sep)
+                       (preview-string-expand (cdr x) sep)
+                     (and sep
+                          (preview-string-expand (cdr x)))))
+               (preview-string-expand x)))
+           arg))
+     (or separator "")))
+   ((and (symbolp arg) (not (memq arg '(t nil))))
+    (preview-string-expand (symbol-value arg) separator))
+   (t (error "Bad string expansion"))))
+
+(defconst preview-expandable-string
+  ((lambda (f) (funcall f (funcall f 'sexp)))
+   (lambda (x)
+     `(choice
+       string
+       (repeat :tag "Concatenate"
+       (choice
+        string
+        (cons :tag "Separated list"
+              (choice (string :tag "Separator")
+                      (symbol :tag "Indirect separator or flag"))
+              ,x)
+        (symbol :tag "Indirect variable (no separator)")))
+       (symbol :tag "Indirect variable (with separator)"))))
+  "Type to be used for `preview-string-expand'.
+Just a hack until we get to learn how to do this properly.
+Recursive definitions are not popular with Emacs,
+so we define this type just two levels deep.  This
+kind of expandible string can either be just a string, or a
+cons cell with a separator string in the CAR, and either
+an explicit list of elements in the CDR, or a symbol to
+be consulted recursively.")
+
+(defcustom preview-dvipng-command
+  "dvipng -picky -noghostscript %d -o \"%m/prev%%03d.png\""
+  "*Command used for converting to separate PNG images.
+
+You might specify options for converting to other image types,
+but then you'll need to adapt `preview-dvipng-image-type'."
+  :group 'preview-latex
+  :type 'string)
+
+(defcustom preview-dvipng-image-type
+  'png
+  "*Image type that dvipng produces.
+
+You'll need to change `preview-dvipng-command' too,
+if you customize this."
+  :group 'preview-latex
+  :type '(choice (const png)
+                (const gif)
+                (symbol :tag "Other" :value png)))
+
+(defcustom preview-dvips-command
+  "dvips -Pwww -i -E %d -o %m/preview.000"
+  "*Command used for converting to separate EPS images."
+  :group 'preview-latex
+  :type 'string)
+
+(defcustom preview-fast-dvips-command
+  "dvips -Pwww %d -o %m/preview.ps"
+  "*Command used for converting to a single PS file."
+  :group 'preview-latex
+  :type 'string)
+
+(defcustom preview-pdf2dsc-command
+  "pdf2dsc %s.pdf %m/preview.dsc"
+  "*Command used for generating dsc from a PDF file."
+  :group 'preview-latex
+  :type 'string)
+
+(defun preview-gs-queue-empty ()
+  "Kill off everything remaining in `preview-gs-queue'."
+  (mapc #'preview-delete preview-gs-outstanding)
+  (dolist (ov preview-gs-queue)
+    (if (overlay-get ov 'queued)
+       (preview-delete ov)))
+  (setq preview-gs-outstanding nil)
+  (setq preview-gs-queue nil))
+
+(defvar preview-error-condition nil
+  "Last error raised and to be reported.")
+
+(defun preview-log-error (err context &optional process)
+  "Log an error message to run buffer.
+ERR is the caught error syndrome, CONTEXT is where it
+occured, PROCESS is the process for which the run-buffer
+is to be used."
+  (when (or (null process) (buffer-name (process-buffer process)))
+    (with-current-buffer (or (and process
+                                 (process-buffer process))
+                            (current-buffer))
+      (save-excursion
+       (goto-char (or (and process
+                           (process-buffer process)
+                           (marker-buffer (process-mark process))
+                           (process-mark process))
+                      (point-max)))
+       (insert-before-markers
+        (format "%s: %s\n"
+                context (error-message-string err)))
+       (display-buffer (current-buffer)))))
+  (setq preview-error-condition err))
+
+(defun preview-reraise-error (&optional process)
+  "Raise an error that has been logged.
+Makes sure that PROCESS is removed from the \"Compilation\"
+tag in the mode line."
+  (when preview-error-condition
+    (unwind-protect
+       (signal (car preview-error-condition) (cdr preview-error-condition))
+      (setq preview-error-condition nil
+           compilation-in-progress (delq process compilation-in-progress)))))
+
+(defun preview-gs-sentinel (process string)
+  "Sentinel function for rendering process.
+Gets the default PROCESS and STRING arguments
+and tries to restart Ghostscript if necessary."
+  (condition-case err
+      (let ((status (process-status process)))
+       (when (memq status '(exit signal))
+         (setq compilation-in-progress (delq process compilation-in-progress)))
+       (when (buffer-name (process-buffer process))
+         (with-current-buffer (process-buffer process)
+           (goto-char (point-max))
+           (insert-before-markers "\n" mode-name " " string)
+           (forward-char -1)
+           (insert " at "
+                   (substring (current-time-string) 0 -5))
+           (forward-char 1)
+           (TeX-command-mode-line process)
+           (when (memq status '(exit signal))
+             ;; process died.
+             ;;  Throw away culprit, go on.
+             (let* ((err (concat preview-gs-answer "\n"
+                                 (process-name process) " " string))
+                    (ov (preview-gs-behead-outstanding err)))
+               (when (and (null ov) preview-gs-queue)
+                 (save-excursion
+                   (goto-char (if (marker-buffer (process-mark process))
+                                  (process-mark process)
+                                (point-max)))
+                   (insert-before-markers err)))
+               (delete-process process)
+               (if (or (null ov)
+                       (eq status 'signal))
+                   ;; if process was killed explicitly by signal, or if nothing
+                   ;; was processed, we give up on the matter altogether.
+                   (progn
+                     (when preview-ps-file
+                       (condition-case nil
+                           (preview-delete-file preview-ps-file)
+                         (file-error nil)))
+                     (preview-gs-queue-empty))
+                 
+                 ;; restart only if we made progress since last call
+                 (let (filenames)
+                   (dolist (ov preview-gs-outstanding)
+                     (setq filenames (overlay-get ov 'filenames))
+                     (condition-case nil
+                         (preview-delete-file (nth 1 filenames))
+                       (file-error nil))
+                     (setcdr filenames nil)))
+                 (setq preview-gs-queue (nconc preview-gs-outstanding
+                                               preview-gs-queue))
+                 (setq preview-gs-outstanding nil)
+                 (preview-gs-restart)))))))
+    (error (preview-log-error err "Ghostscript" process)))
+  (preview-reraise-error process))
+
+(defun preview-gs-filter (process string)
+  "Filter function for processing Ghostscript output.
+Gets the usual PROCESS and STRING parameters, see
+`set-process-filter' for a description."
+  (with-current-buffer (process-buffer process)
+    (setq preview-gs-answer (concat preview-gs-answer string))
+    (while (string-match "GS\\(<[0-9]+\\)?>" preview-gs-answer)
+      (let* ((pos (match-end 0))
+            (answer (substring preview-gs-answer 0 pos)))
+       (setq preview-gs-answer (substring preview-gs-answer pos))
+       (condition-case err
+           (preview-gs-transact process answer)
+         (error (preview-log-error err "Ghostscript filter" process))))))
+  (preview-reraise-error))
+
+(defun preview-gs-restart ()
+  "Start a new Ghostscript conversion process."
+  (when preview-gs-queue
+    (if preview-gs-sequence
+       (setcar preview-gs-sequence (1+ (car preview-gs-sequence)))
+      (setq preview-gs-sequence (list 1)))
+    (setcdr preview-gs-sequence 1)
+    (let* ((process-connection-type nil)
+          (outfile (format "-dOutputFile=%s"
+                           (preview-ps-quote-filename
+                            (format "%s/pr%d-%%d.%s"
+                                    (car TeX-active-tempdir)
+                                    (car preview-gs-sequence)
+                                    preview-gs-image-type))))
+          (process
+           (apply #'start-process
+                  "Preview-Ghostscript"
+                  (current-buffer)
+                  preview-gs-command
+                  outfile
+                  preview-gs-command-line)))
+      (goto-char (point-max))
+      (insert-before-markers "Running `Preview-Ghostscript' with ``"
+                            (mapconcat #'shell-quote-argument
+                                       (append
+                                        (list preview-gs-command
+                                              outfile)
+                                        preview-gs-command-line)
+                                       " ") "''\n")
+      (setq preview-gs-answer "")
+      (process-kill-without-query process)
+      (set-process-sentinel process #'preview-gs-sentinel)
+      (set-process-filter process #'preview-gs-filter)
+      (process-send-string process preview-gs-init-string)
+      (setq mode-name "Preview-Ghostscript")
+      (push process compilation-in-progress)
+      (TeX-command-mode-line process)
+      (set-buffer-modified-p (buffer-modified-p))
+      process)))
+
+(defun preview-gs-open (&optional setup)
+  "Start a Ghostscript conversion pass.
+SETUP may contain a parser setup function."
+  (let ((image-info (assq preview-image-type preview-gs-image-type-alist)))
+    (setq preview-gs-image-type (nth 1 image-info))
+    (setq preview-gs-sequence nil)
+    (setq preview-gs-command-line (append
+                                  preview-gs-options
+                                  (nthcdr 2 image-info))
+         preview-gs-init-string
+         (format "{DELAYSAFER{.setsafe}if}stopped pop\
+/.preview-BP currentpagedevice/BeginPage get dup \
+null eq{pop{pop}bind}if def\
+<</BeginPage{currentpagedevice/PageSize get dup 0 get 1 ne exch 1 get 1 ne or\
+{.preview-BP %s}{pop}ifelse}bind/PageSize[1 1]>>setpagedevice\
+/preview-do{[count 3 roll save]3 1 roll dup length 0 eq\
+{pop}{setpagedevice}{ifelse .runandhide}\
+stopped{handleerror quit}if \
+aload pop restore}bind def "
+                 (preview-gs-color-string preview-colors)))
+    (preview-gs-queue-empty)
+    (preview-parse-messages (or setup #'preview-gs-dvips-process-setup))))
+
+(defun preview-gs-color-value (value)
+  "Return string to be used as color value for an RGB component.
+Conversion from Emacs color numbers (0 to 65535) in VALUE
+to Ghostscript floats."
+  (format "%g" (/ value 65535.0)))
+
+(defun preview-pdf-color-string (colors)
+  "Return a string that patches PDF foreground color to work properly."
+  ;; Actually, this is rather brutal.  It will only be invoked in
+  ;; cases, however, where previously it was not expected that
+  ;; anything readable turned up, anyway.
+  (let ((fg (aref colors 1)))
+    (if fg
+       (concat
+        "/GS_PDF_ProcSet GS_PDF_ProcSet dup maxlength dict copy dup begin\
+/graphicsbeginpage{//graphicsbeginpage exec "
+        (mapconcat #'preview-gs-color-value fg " ")
+        " 3 copy rg RG}bind store end readonly store "))))
+
+(defun preview-gs-color-string (colors)
+  "Return a string setting up colors"
+  (let ((bg (aref colors 0))
+       (fg (aref colors 1))
+       (mask (aref colors 2))
+       (border (aref colors 3)))
+    (concat
+     (and (or (and mask border) (and bg (not fg)))
+         "gsave ")
+     (and bg
+        (concat
+         (mapconcat #'preview-gs-color-value bg " ")
+         " setrgbcolor clippath fill "))
+     (and mask border
+        (format "%s setrgbcolor false setstrokeadjust %g \
+setlinewidth clippath strokepath \
+matrix setmatrix true \
+{2 index{newpath}if round exch round exch moveto pop false}\
+{round exch round exch lineto}{curveto}{closepath}\
+pathforall pop fill "
+                (mapconcat #'preview-gs-color-value mask " ")
+                (* 2 border)))
+         ;; I hate antialiasing.  Warp border to integral coordinates.
+     (and (or (and mask border) (and bg (not fg)))
+         "grestore ")
+     (and fg
+         (concat
+          (mapconcat #'preview-gs-color-value fg " ")
+          " setrgbcolor")))))
+
+(defun preview-dvipng-color-string (colors res)
+  "Return color setup tokens for dvipng.
+Makes a string of options suitable for passing to dvipng.
+Pure borderless black-on-white will return an empty string."
+  (let
+      ((bg (aref colors 0))
+       (fg (aref colors 1))
+       (mask (aref colors 2))
+       (border (aref colors 3)))
+    (concat
+     (and bg
+         (format "--bg 'rgb %s' "
+                 (mapconcat #'preview-gs-color-value bg " ")))
+     (and fg
+         (format "--fg 'rgb %s' "
+                 (mapconcat #'preview-gs-color-value fg " ")))
+     (and mask border
+         (format "--bd 'rgb %s' "
+                 (mapconcat #'preview-gs-color-value mask " ")))
+     (and border
+         (format "--bd %d" (max 1 (round (/ (* res border) 72.0))))))))
+
+(defun preview-gs-dvips-process-setup ()
+  "Set up Dvips process for conversions via gs."
+  (unless (preview-supports-image-type preview-gs-image-type)
+    (error "preview-image-type setting '%s unsupported by this Emacs"
+          preview-gs-image-type))
+  (setq preview-gs-command-line (append
+                                preview-gs-command-line
+                                (list (preview-gs-resolution
+                                       (preview-hook-enquiry preview-scale)
+                                       (car preview-resolution)
+                                       (cdr preview-resolution)))))
+  (if preview-parsed-pdfoutput
+      (preview-pdf2dsc-process-setup)
+    (let ((process (preview-start-dvips preview-fast-conversion)))
+      (setq TeX-sentinel-function #'preview-gs-dvips-sentinel)
+      (list process (current-buffer) TeX-active-tempdir preview-ps-file
+           preview-gs-image-type))))
+
+(defun preview-dvipng-process-setup ()
+  "Set up dvipng process for conversion."
+  (setq preview-gs-command-line (append
+                                preview-gs-command-line
+                                (list (preview-gs-resolution
+                                       (preview-hook-enquiry preview-scale)
+                                       (car preview-resolution)
+                                       (cdr preview-resolution)))))
+  (if preview-parsed-pdfoutput
+      (if (preview-supports-image-type preview-gs-image-type)
+         (preview-pdf2dsc-process-setup)
+       (error "preview-image-type setting '%s unsupported by this Emacs"
+              preview-gs-image-type))
+    (unless (preview-supports-image-type preview-dvipng-image-type)
+      (error "preview-dvipng-image-type setting '%s unsupported by this Emacs"
+            preview-dvipng-image-type))
+    (let ((process (preview-start-dvipng)))
+      (setq TeX-sentinel-function #'preview-dvipng-sentinel)
+      (list process (current-buffer) TeX-active-tempdir t
+         preview-dvipng-image-type))))
+
+
+(defun preview-pdf2dsc-process-setup ()
+  (let ((process (preview-start-pdf2dsc)))
+    (setq TeX-sentinel-function #'preview-pdf2dsc-sentinel)
+    (list process (current-buffer) TeX-active-tempdir preview-ps-file
+         preview-gs-image-type)))
+
+(defun preview-dvips-abort ()
+  "Abort a Dvips run."
+  (preview-gs-queue-empty)
+  (condition-case nil
+      (delete-file
+       (let ((gsfile preview-gs-file))
+        (with-current-buffer TeX-command-buffer
+          (funcall (car gsfile) "dvi"))))
+    (file-error nil))
+  (when preview-ps-file
+      (condition-case nil
+         (preview-delete-file preview-ps-file)
+       (file-error nil)))
+  (setq TeX-sentinel-function nil))
+
+(defalias 'preview-dvipng-abort 'preview-dvips-abort)
+;  "Abort a DviPNG run.")
+
+(defun preview-gs-dvips-sentinel (process command &optional gsstart)
+  "Sentinel function for indirect rendering DviPS process.
+The usual PROCESS and COMMAND arguments for
+`TeX-sentinel-function' apply.  Starts gs if GSSTART is set."
+  (condition-case err
+      (let ((status (process-status process))
+           (gsfile preview-gs-file))
+       (cond ((eq status 'exit)
+              (delete-process process)
+              (setq TeX-sentinel-function nil)
+              (condition-case nil
+                  (delete-file
+                   (with-current-buffer TeX-command-buffer
+                     (funcall (car gsfile) "dvi")))
+                (file-error nil))
+              (if preview-ps-file
+                  (preview-prepare-fast-conversion))
+              (when gsstart
+                (if preview-gs-queue
+                    (preview-gs-restart)
+                  (when preview-ps-file
+                    (condition-case nil
+                        (preview-delete-file preview-ps-file)
+                      (file-error nil))))))
+             ((eq status 'signal)
+              (delete-process process)
+              (preview-dvips-abort))))
+    (error (preview-log-error err "DviPS sentinel" process)))
+  (preview-reraise-error process))
+
+(defun preview-pdf2dsc-sentinel (process command &optional gsstart)
+  "Sentinel function for indirect rendering PDF process.
+The usual PROCESS and COMMAND arguments for
+`TeX-sentinel-function' apply.  Starts gs if GSSTART is set."
+  (condition-case err
+      (let ((status (process-status process)))
+       (cond ((eq status 'exit)
+              (delete-process process)
+              (setq TeX-sentinel-function nil)
+              (setq preview-gs-init-string
+                    (concat preview-gs-init-string
+                            (preview-pdf-color-string preview-colors)))
+              (preview-prepare-fast-conversion)
+              (when gsstart
+                (if preview-gs-queue
+                    (preview-gs-restart)
+                  (when preview-ps-file
+                    (condition-case nil
+                        (preview-delete-file preview-ps-file)
+                      (file-error nil))))))
+             ((eq status 'signal)
+              (delete-process process)
+              (preview-dvips-abort))))
+    (error (preview-log-error err "PDF2DSC sentinel" process)))
+  (preview-reraise-error process))
+
+(defun preview-gs-close (process closedata)
+  "Clean up after PROCESS and set up queue accumulated in CLOSEDATA."
+  (setq preview-gs-queue (nconc preview-gs-queue closedata))
+  (if process
+      (if preview-gs-queue
+         (if TeX-process-asynchronous
+             (if (and (eq (process-status process) 'exit)
+                      (null TeX-sentinel-function))
+                 ;; Process has already finished and run sentinel
+                 (progn
+                   (when preview-ps-file
+                     (condition-case nil
+                         (preview-delete-file preview-ps-file)
+                       (file-error nil)))
+                   (preview-gs-restart))
+               (setq TeX-sentinel-function
+                     `(lambda (process command)
+                        (,(if preview-parsed-pdfoutput
+                              'preview-pdf2dsc-sentinel
+                            'preview-gs-dvips-sentinel)
+                         process
+                         command
+                         t))))
+           (TeX-synchronous-sentinel "Preview-DviPS" (cdr preview-gs-file)
+                                     process))
+    ;; pathological case: no previews although we sure thought so.
+       (delete-process process)
+       (unless (eq (process-status process) 'signal)
+         (preview-dvips-abort)))))
+
+(defun preview-dvipng-sentinel (process command &optional placeall)
+  "Sentinel function for indirect rendering DviPNG process.
+The usual PROCESS and COMMAND arguments for
+`TeX-sentinel-function' apply.  Places all snippets if PLACEALL is set."
+  (condition-case err
+      (let ((status (process-status process)))
+       (cond ((eq status 'exit)
+              (delete-process process)
+              (setq TeX-sentinel-function nil)
+              (when placeall
+                (preview-dvipng-place-all)))
+             ((eq status 'signal)
+              (delete-process process)
+              (preview-dvipng-abort))))
+    (error (preview-log-error err "DviPNG sentinel" process)))
+  (preview-reraise-error process))
+
+(defun preview-dvipng-close (process closedata)
+  "Clean up after PROCESS and set up queue accumulated in CLOSEDATA."
+  (if preview-parsed-pdfoutput
+      (preview-gs-close process closedata)
+    (setq preview-gs-queue (nconc preview-gs-queue closedata))
+    (if process
+       (if preview-gs-queue
+           (if TeX-process-asynchronous
+               (if (and (eq (process-status process) 'exit)
+                        (null TeX-sentinel-function))
+                   ;; Process has already finished and run sentinel
+                   (preview-dvipng-place-all)
+                 (setq TeX-sentinel-function (lambda (process command)
+                                               (preview-dvipng-sentinel
+                                                process
+                                                command
+                                                t))))
+             (TeX-synchronous-sentinel "Preview-DviPNG" (cdr preview-gs-file)
+                                       process))
+         ;; pathological case: no previews although we sure thought so.
+         (delete-process process)
+         (unless (eq (process-status process) 'signal)
+           (preview-dvipng-abort))))))
+
+(defun preview-dsc-parse (file)
+  "Parse DSC comments of FILE.
+Returns a vector with offset/length pairs corresponding to
+the pages.  Page 0 corresponds to the initialization section."
+  (with-temp-buffer
+    (set-buffer-multibyte nil)
+    (insert-file-contents-literally file)
+    (let ((last-pt (point-min))
+         trailer
+         pagelist
+         lastbegin
+         pt
+         case-fold-search
+         (level 0))
+      (while (search-forward-regexp "\
+%%\\(?:\\(BeginDocument:\\)\\|\
+\\(EndDocument[\n\r]\\)\\|\
+\\(Page:\\)\\|\
+\\(Trailer[\n\r]\\)\\)" nil t)
+       (setq pt (match-beginning 0))
+       (cond ((null (memq (char-before pt) '(?\C-j ?\C-m nil))))
+             (trailer (error "Premature %%%%Trailer in `%s' at offsets %d/%d"
+                             file trailer pt))
+             ((match-beginning 1)
+              (if (zerop level)
+                  (setq lastbegin pt))
+              (setq level (1+ level)))
+             ((match-beginning 2)
+              (if (zerop level)
+                  (error "Unmatched %%%%EndDocument in `%s' at offset %d"
+                         file pt)
+                (setq level (1- level))))
+             ((> level 0))
+             ((match-beginning 3)
+              (push (list last-pt (- pt last-pt)) pagelist)
+              (setq last-pt pt))
+             ((match-beginning 4)
+              (setq trailer pt))))
+      (unless (zerop level)
+       (error "Unmatched %%%%BeginDocument in `%s' at offset %d"
+              file lastbegin))
+      (push (list last-pt
+                 (- (or trailer (point-max)) last-pt)) pagelist)
+      (vconcat (nreverse pagelist)))))
+
+(defun preview-gs-dsc-cvx (page dsc)
+  "Generate PostScript code accessing PAGE in the DSC object.
+The returned PostScript code will need the file on
+top of the stack, and will replace it with an executable
+object corresponding to the wanted page."
+  (let ((curpage (aref dsc page)))
+    (format "dup %d setfileposition %d()/SubFileDecode filter cvx"
+           (1- (car curpage)) (nth 1 curpage))))
+  
+(defun preview-ps-quote-filename (str &optional nonrel)
+  "Make a PostScript string from filename STR.
+The file name is first made relative unless
+NONREL is not NIL."
+  (unless nonrel (setq str (file-relative-name str)))
+  (let ((index 0))
+    (while (setq index (string-match "[\\()]" str index))
+      (setq str (replace-match "\\\\\\&" t nil str)
+           index (+ 2 index)))
+    (concat "(" str ")")))
+
+(defun preview-prepare-fast-conversion ()
+  "This fixes up all parameters for fast conversion."
+  (let ((file (if (consp (car preview-ps-file))
+                 (if (consp (caar preview-ps-file))
+                     (car (last (caar preview-ps-file)))
+                   (caar preview-ps-file))
+               (car preview-ps-file))))
+    (setq preview-gs-dsc (preview-dsc-parse file))
+    (setq preview-gs-init-string
+         (concat preview-gs-init-string
+                 (format "[%s(r)file]aload exch %s .runandhide aload pop "
+                         (preview-ps-quote-filename file)
+                         (preview-gs-dsc-cvx 0 preview-gs-dsc))))))
+
+(defun preview-gs-urgentize (ov buff)
+  "Make a displayed overlay render with higher priority.
+This function is used in fake conditional display properties
+for reordering the conversion order to prioritize on-screen
+images.  OV is the overlay in question, and BUFF is the
+Ghostscript process buffer where the buffer-local queue
+is located."
+  ;; It does not matter that ov gets queued twice in that process: the
+  ;; first version to get rendered will clear the 'queued property.
+  ;; It cannot get queued more than twice since we remove the
+  ;; conditional display property responsible for requeuing here.
+  ;; We don't requeue if the overlay has been killed (its buffer made
+  ;; nil).  Not necessary, but while we are checking...
+  ;; We must return t.
+  (preview-remove-urgentization ov)
+  (when (and (overlay-get ov 'queued)
+            (overlay-buffer ov))
+    (with-current-buffer buff
+      (push ov preview-gs-queue)))
+  t)
+
+
+(defun preview-gs-place (ov snippet box run-buffer tempdir ps-file imagetype)
+  "Generate an image placeholder rendered over by Ghostscript.
+This enters OV into all proper queues in order to make it render
+this image for real later, and returns the overlay after setting
+a placeholder image.  SNIPPET gives the number of the
+snippet in question for the file to be generated.
+BOX is a bounding box if we already know one via TeX.
+RUN-BUFFER is the buffer of the TeX process,
+TEMPDIR is the correct copy of `TeX-active-tempdir',
+PS-FILE is a copy of `preview-ps-file', IMAGETYPE is the image type
+for the file extension."
+  (overlay-put ov 'filenames
+              (unless (eq ps-file t)
+                (list
+                 (preview-make-filename
+                  (or ps-file
+                      (format "preview.%03d" snippet))
+                  tempdir))))
+  (overlay-put ov 'queued
+              (vector box nil snippet))
+  (overlay-put ov 'preview-image
+              (list (preview-icon-copy preview-nonready-icon)))
+  (preview-add-urgentization #'preview-gs-urgentize ov run-buffer)
+  (list ov))
+
+(defun preview-mouse-open-error (string)
+  "Display STRING in a new view buffer on click."
+  (let ((buff (get-buffer-create
+              "*Preview-Ghostscript-Error*")))
+    (with-current-buffer buff
+      (kill-all-local-variables)
+      (set (make-local-variable 'view-exit-action) #'kill-buffer)
+      (setq buffer-undo-list t)
+      (erase-buffer)
+      (insert string)
+      (goto-char (point-min)))
+    (view-buffer-other-window buff)))
+
+(defun preview-mouse-open-eps (file &optional position)
+  "Display eps FILE in a view buffer on click.
+Place point at POSITION, else beginning of file."
+  (let ((default-major-mode
+         (or
+          (assoc-default "x.ps" auto-mode-alist #'string-match)
+          default-major-mode))
+       (buff (get-file-buffer file)))
+    (save-excursion
+      (if buff
+         (pop-to-buffer buff)
+       (view-file-other-window file))
+      (goto-char (or position (point-min)))
+      (if (eq major-mode 'ps-mode)          ; Bundled with GNU Emacs
+         (message "%s" (substitute-command-keys "\
+Try \\[ps-run-start] \\[ps-run-buffer] and \
+\\<ps-run-mode-map>\\[ps-run-mouse-goto-error] on error offset." )))
+      (if (eq major-mode 'postscript-mode) ; Bundled with XEmacs, limited
+         (message "%s" (substitute-command-keys "\
+Try \\[ps-shell] and \\[ps-execute-buffer]."))))))
+
+(defun preview-gs-flag-error (ov err)
+  "Make an eps error flag in overlay OV for ERR string."
+  (let* ((filenames (overlay-get ov 'filenames))
+        (file (car (nth 0 filenames)))
+        (outfile (format "-dOutputFile=%s"
+                         (preview-ps-quote-filename
+                          (car (nth 1 filenames)))))
+        (ps-open
+         `(lambda() (interactive "@")
+            (preview-mouse-open-error
+             ,(concat
+               (mapconcat #'shell-quote-argument
+                           (append (list
+                                    preview-gs-command
+                                    outfile)
+                                   preview-gs-command-line)
+                           " ")
+                "\nGS>"
+                preview-gs-init-string
+                (aref (overlay-get ov 'queued) 1)
+                err))))
+        (str
+         (preview-make-clickable
+          nil
+          preview-error-icon
+          "%s views error message
+%s more options"
+          ps-open
+          `(lambda() (interactive)
+             (popup-menu
+              '("PostScript error"
+                ["View error" ,ps-open]
+                ["View source"
+                 (lambda () (interactive "@")
+                   ,(if preview-ps-file
+                        `(preview-mouse-open-eps
+                          ,(if (consp (car file))
+                               (nth 1 (car file))
+                             (car file))
+                          ,(nth 0 (aref preview-gs-dsc
+                                        (aref (overlay-get ov 'queued) 2))))
+                      `(preview-mouse-open-eps ,file)))]))))))
+    (overlay-put ov 'strings (cons str str))
+    (preview-toggle ov)))
+
+(defun preview-gs-transact (process answer)
+  "Work off Ghostscript transaction.
+This routine is the action routine called via the process filter.
+The Ghostscript process buffer of PROCESS will already be selected, and
+and the standard output of Ghostscript up to the next prompt will be
+given as ANSWER."
+  (let ((ov (pop preview-gs-outstanding))
+       (have-error (not
+                    (string-match "\\`GS\\(<[0-9]+\\)?>\\'" answer ))))
+    (when (and ov (overlay-buffer ov))
+      (let ((queued (overlay-get ov 'queued)))
+       (when queued
+         (let* ((bbox (aref queued 0))
+                (filenames (overlay-get ov 'filenames))
+                (oldfile (nth 0 filenames))
+                (newfile (nth 1 filenames)))
+           (if have-error
+               (preview-gs-flag-error ov answer)
+             (condition-case nil
+                 (preview-delete-file oldfile)
+               (file-error nil))
+             (overlay-put ov 'filenames (cdr filenames))
+             (preview-replace-active-icon
+              ov
+              (preview-create-icon (car newfile)
+                                   preview-gs-image-type
+                                   (preview-ascent-from-bb
+                                    bbox)
+                                   (aref preview-colors 2))))
+           (overlay-put ov 'queued nil)))))
+    (while (and (< (length preview-gs-outstanding)
+                  preview-gs-outstanding-limit)
+               (setq ov (pop preview-gs-queue)))
+      (let ((queued (overlay-get ov 'queued)))
+       (when (and queued
+                  (not (memq ov preview-gs-outstanding))
+                  (overlay-buffer ov))
+         (let* ((filenames (overlay-get ov 'filenames))
+                (oldfile (car (nth 0
+                                   (nconc filenames
+                                          (list
+                                           (preview-make-filename
+                                            (format "pr%d-%d.%s"
+                                                    (car preview-gs-sequence)
+                                                    (cdr preview-gs-sequence)
+                                                    preview-gs-image-type)
+                                            TeX-active-tempdir))))))
+                (bbox (aset queued 0
+                            (or (and preview-prefer-TeX-bb
+                                     (aref queued 0))
+                                (and (stringp oldfile)
+                                     (preview-extract-bb
+                                      oldfile))
+                                (aref queued 0)
+                                (error "No bounding box"))))
+                (snippet (aref queued 2))
+                (gs-line
+                 (format
+                  "%s<<%s>>preview-do\n"
+                  (if preview-ps-file
+                      (concat "dup "
+                              (preview-gs-dsc-cvx
+                               snippet
+                               preview-gs-dsc))
+                    (format "%s(r)file cvx"
+                            (preview-ps-quote-filename
+                             (if (listp oldfile)
+                                 (car (last oldfile))
+                               oldfile))))
+                  (if preview-parsed-tightpage
+                      ""
+                    (format "/PageSize[%g %g]/PageOffset[%g \
+%g[1 1 dtransform exch]{0 ge{neg}if exch}forall]"
+                            (- (aref bbox 2) (aref bbox 0))
+                            (- (aref bbox 3) (aref bbox 1))
+                            (aref bbox 0) (aref bbox 1))))))
+           (setcdr preview-gs-sequence (1+ (cdr preview-gs-sequence)))
+           (setq preview-gs-outstanding
+                 (nconc preview-gs-outstanding
+                        (list ov)))
+           (aset queued 1 gs-line)
+           ;; ignore errors because of dying processes: they will get
+           ;; caught by the sentinel, anyway.
+           (condition-case nil
+               (process-send-string
+                process
+                gs-line)
+             (error nil))))))
+    (unless preview-gs-outstanding
+      (condition-case nil
+         (process-send-eof process)
+       (error nil)))))
+
+(defun preview-hook-enquiry (hook)
+  "Gets a value from a configured hook.
+HOOK is a list or single item, for which the first resolving to
+non-nil counts.  Entries can be a callable function, or
+a symbol that is consulted, or a value.  Lists are evaluated
+recursively."
+  (cond ((functionp hook)
+        (funcall hook))
+       ((consp hook)
+        (let (res)
+          (while (and (not res) hook)
+            (setq res (preview-hook-enquiry (car hook))
+                  hook (cdr hook)))
+          res))
+       ((and (symbolp hook) (boundp hook))
+        (symbol-value hook))
+       (t hook)))
+                         
+(defcustom preview-scale-function #'preview-scale-from-face
+  "*Scale factor for included previews.
+This can be either a function to calculate the scale, or
+a fixed number."
+  :group 'preview-appearance
+  :type '(choice (function-item preview-scale-from-face)
+                (const 1.0)
+                (number :value 1.0)
+                (function :value preview-scale-from-face)))
+
+(defcustom preview-default-document-pt 10
+  "*Assumed document point size for `preview-scale-from-face'.
+If the point size (such as 11pt) of the document cannot be
+determined from the document options itself, assume this size.
+This is for matching screen font size and previews."
+  :group 'preview-appearance
+  :type
+          '(choice (const :tag "10pt" 10)
+                  (const :tag "11pt" 11)
+                  (const :tag "12pt" 12)
+                  (number :tag "Other" :value 11.0))
+)
+
+(defcustom preview-document-pt-list '(preview-parsed-font-size
+  preview-auctex-font-size
+  preview-default-document-pt)
+  "*How `preview-document-pt' figures out the document size."
+  :group 'preview-appearance
+  :type
+  '(repeat (choice
+           ;; This is a bug: type function seems to match variables, too.
+           (restricted-sexp :match-alternatives (functionp)
+                            :tag "Function" :value preview-auctex-font-size)
+           (variable :value preview-parsed-font-size)
+           (number :value 11))))
+
+(defun preview-auctex-font-size ()
+  "Calculate the default font size of document.
+If packages, classes or styles were called with an option
+like 10pt, size is taken from the first such option if you
+had let your document be parsed by AucTeX."
+  (catch 'return (dolist (option (TeX-style-list))
+                  (if (string-match "\\`\\([0-9]+\\)pt\\'" option)
+                      (throw 'return
+                             (string-to-number
+                              (match-string 1 option)))))))
+
+(defsubst preview-document-pt ()
+  "Calculate the default font size of document."
+  (preview-hook-enquiry preview-document-pt-list))
+
+(defun preview-scale-from-face ()
+  "Calculate preview scale from `preview-reference-face'.
+This calculates the scale of EPS images from a document assumed
+to have a default font size given by function `preview-document-pt'
+so that they match the reference face in height."
+  `(lambda nil
+     (/ ,(/ (preview-inherited-face-attribute 'preview-reference-face :height
+                                             'default) 10.0)
+       (preview-document-pt))))
+
+(defvar preview-min-spec)
+
+(defun preview-make-image (symbol)
+  "Make an image from a preview spec list.
+The first spec that is workable (given the current setting of
+`preview-min-spec') from the given symbol is used here.  The
+icon is cached in the property list of the symbol."
+  (let ((alist (get 'preview-min-alist symbol)))
+    (cdr (or
+         (assq preview-min-spec alist)
+         (car (put symbol 'preview-min-alist
+                   (cons
+                    (cons preview-min-spec
+                          (preview-filter-specs
+                           (symbol-value symbol)))
+                    alist)))))))
+
+(defun preview-filter-specs (spec-list)
+  "Find the first of the fitting specs and make an image."
+  (let (image)
+    (while (and spec-list
+               (not (setq image
+                          (catch 'preview-filter-specs
+                            (preview-filter-specs-1 (car spec-list))))))
+      (setq spec-list (cdr spec-list)))
+    image))
+
+(defun preview-filter-specs-1 (specs)
+  (and specs
+       (if (get 'preview-filter-specs (car specs))
+          (apply (get 'preview-filter-specs (car specs)) specs)
+        `(,(nth 0 specs) ,(nth 1 specs)
+          ,@(preview-filter-specs-1 (nthcdr 2 specs))))))
+
+(put 'preview-filter-specs :min
+     #'(lambda (keyword value &rest args)
+        (if (> value preview-min-spec)
+            (throw 'preview-filter-specs nil)
+          (preview-filter-specs-1 args))))
+
+(defvar preview-datadir (file-name-directory load-file-name)
+  "The directory relative to which package data may be found.
+This should be hardwired into the startup file containing the
+autoloads for preview-latex.")
+
+(put 'preview-filter-specs :file
+     #'(lambda (keyword value &rest args)
+        `(:file ,(expand-file-name value (expand-file-name "images"
+                                                           preview-datadir))
+                ,@(preview-filter-specs-1 args))))
+
+(defun preview-ascent-from-bb (bb)
+  "This calculates the image ascent from its bounding box.
+The bounding box BB needs to be a 4-component vector of
+numbers (can be float if available)."
+  ;; baseline is at 1in from the top of letter paper (11in), so it is
+  ;; at 10in from the bottom precisely, which is 720 in PostScript
+  ;; coordinates.  If our bounding box has its bottom not above this
+  ;; line, and its top above, we can calculate a useful ascent value.
+  ;; If not, something is amiss.  We just use 100 in that case.
+
+  (let ((bottom (aref bb 1))
+       (top (aref bb 3)))
+    (if (and (<= bottom 720)
+            (> top 720))
+       (round (* 100.0 (/ (- top 720.0) (- top bottom))))
+      100)))
+
+(defface preview-face '((((background dark))
+                        (:background "dark slate gray"))
+                       (t
+                        (:background "beige")))
+  "Face to use for the preview source."
+  :group 'preview-appearance)
+
+(defface preview-reference-face '((t nil))
+  "Face consulted for colors and scale of active previews.
+Fallback to :inherit and 'default implemented."
+  :group 'preview-appearance)
+
+(defcustom preview-auto-reveal '(eval (preview-arrived-via
+                                      (key-binding [left])
+                                      (key-binding [right])))
+  "*Cause previews to open automatically when entered.
+Possibilities are:
+T autoopens,
+NIL doesn't,
+a symbol will have its value consulted if it exists,
+defaulting to NIL if it doesn't.
+An integer will specify a maximum cursor movement distance.
+Larger movements won't open the preview.
+A CONS-cell means to call a function for determining the value.
+The CAR of the cell is the function to call which receives
+the CDR of the CONS-cell in the rest of the arguments, while
+point and current buffer point to the position in question.
+All of the options show reasonable defaults."
+  :group 'preview-appearance
+  :type '(choice (const :tag "Off" nil)
+                (const :tag "On" t)
+                (symbol :tag "Indirect variable" :value reveal-mode)
+                (integer :tag "Maximum distance" :value 1)
+                (cons :tag "Function call"
+                      :value (eval (preview-arrived-via
+                                    (key-binding [left])
+                                    (key-binding [right])))
+                      function (list :tag "Argument list"
+                                     (repeat :inline t sexp)))))
+  
+(defun preview-auto-reveal-p (mode distance)
+  "Decide whether to auto-reveal.
+Returns non-NIL if region should be auto-opened.
+See `preview-auto-reveal' for definitions of MODE, which gets
+set to `preview-auto-reveal'.  DISTANCE specifies the movement
+distance with which point has been reached in case it has been
+a movement starting in the current buffer."
+  (cond ((symbolp mode)
+        (and (boundp mode)
+              (symbol-value mode)))
+       ((integerp mode)
+        (and distance (/= 0 distance) (<= (abs distance) mode)))
+       ((consp mode)
+        (apply (car mode) (cdr mode)))
+       (t mode)))
+
+(defun preview-arrived-via (&rest list)
+  "Indicate auto-opening.
+Returns non-NIL if called by one of the commands in LIST."
+  (memq this-command list))
+
+(defcustom preview-equality-transforms '(identity
+                                        preview-canonical-spaces)
+"Transformation functions for region changes.
+These functions are tried in turn on the strings from the
+regions of a preview to decide whether a preview is to be considered
+changed.  If any transform leads to equal results, the preview is
+considered unchanged."
+  :group 'preview-appearance
+  :type '(repeat function))
+
+(defun preview-relaxed-string= (&rest args)
+"Check for functional equality of arguments.
+The arguments ARGS are checked for equality by using
+`preview-equality-transforms' on them until it is exhausted
+or one transform returns equality."
+  (let ((lst preview-equality-transforms))
+    (while (and lst (not (apply #'string= (mapcar (car lst) args))))
+      (setq lst (cdr lst)))
+    lst))
+
+(defun preview-canonical-spaces (arg)
+  "Convert ARG into canonical form.
+Removes comments and collapses white space, except for multiple newlines."
+  (let (pos)
+    (while (setq pos (string-match "\\s<.*[\n\r][ \t]*" arg pos))
+      (setq arg (replace-match "" t t arg 0)))
+    (while (setq pos (string-match "[ \t]*\\(\\([ \t]\\)\\|[\n\r][ \t]*\\)"
+                                  arg pos))
+      (setq arg (replace-match (if (match-beginning 2) " " "\n") t t arg 0)
+           pos (1+ pos)))
+    (while (setq pos (string-match "\n+" arg pos))
+      (if (string= "\n" (match-string 0 arg))
+         (setq arg (replace-match " " t t arg 0)
+               pos (1+ pos))
+       (setq pos (match-end 0)))))
+  arg)
+
+(defun preview-regenerate (ovr)
+  "Pass the modified region in OVR again through LaTeX."
+  (let ((begin (overlay-start ovr))
+       (end (overlay-end ovr)))
+    (with-current-buffer (overlay-buffer ovr)
+      (preview-delete ovr)
+      (preview-region begin end))))
+
+(defcustom preview-inner-environments '("Bmatrix" "Vmatrix" "aligned"
+                                       "array" "bmatrix" "cases"
+                                       "gathered" "matrix" "pmatrix"
+                                       "smallmatrix" "split"
+                                       "subarray" "vmatrix")
+  "Environments not to be previewed on their own."
+  :group 'preview-latex
+  :type '(repeat string))
+
+
+(defun preview-next-border (backwards)
+  "Search for the next interesting border for `preview-at-point'.
+Searches backwards if BACKWARDS is non-nil."
+  (let (history preview-state (pt (point)))
+    (catch 'exit
+      (while
+         (null
+          (memq
+           (setq preview-state
+                 (if backwards
+                     (if (> (setq pt
+                                  (previous-single-char-property-change
+                                   pt 'preview-state)) (point-min))
+                         (get-char-property (1- pt) 'preview-state)
+                       (throw 'exit (or history (point-min))))
+                   (if (< (setq pt
+                                (next-single-char-property-change
+                                 pt 'preview-state)) (point-max))
+                       (get-char-property pt 'preview-state)
+                     (throw 'exit (or history (point-max))))))
+           '(active inactive)))
+       (setq history (and (not preview-state) pt)))
+      (or history pt))))
+            
+(defun preview-at-point ()
+  "Do the appropriate preview thing at point.
+If point is positioned on or inside of an unmodified preview area,
+its visibility is toggled.
+
+If not, the surroundings are run through preview.  The
+surroundings don't extend into unmodified previews or past
+contiguous previews invalidated by modifications.
+
+Overriding any other action, if a region is
+active (`transient-mark-mode' or `zmacs-regions'), it is run
+through `preview-region'."
+  (interactive)
+  (if (TeX-active-mark)
+      (preview-region (region-beginning) (region-end))
+    (catch 'exit
+      (dolist (ovr (overlays-in (max (point-min) (1- (point)))
+                               (min (point-max) (1+ (point)))))
+       (let ((preview-state (overlay-get ovr 'preview-state)))
+         (when preview-state
+           (unless (eq preview-state 'disabled)
+             (preview-toggle ovr 'toggle (selected-window))
+             (throw 'exit t)))))
+      (preview-region (preview-next-border t)
+                     (preview-next-border nil)))))
+
+(defun preview-disabled-string (ov)
+  "Generate a before-string for disabled preview overlay OV."
+  (concat (preview-make-clickable
+          (overlay-get ov 'preview-map)
+          preview-icon
+          "\
+%s regenerates preview
+%s more options"
+          `(lambda() (interactive) (preview-regenerate ,ov)))
+;; icon on separate line only for stuff starting on its own line
+         (with-current-buffer (overlay-buffer ov)
+           (save-excursion
+             (save-restriction
+               (widen)
+               (goto-char (overlay-start ov))
+               (if (bolp) "\n" ""))))))
+
+(defun preview-disable (ovr)
+  "Change overlay behaviour of OVR after source edits."
+  (overlay-put ovr 'queued nil)
+  (preview-remove-urgentization ovr)
+  (overlay-put ovr 'preview-image nil)
+  (overlay-put ovr 'timestamp nil)
+  (setcdr (overlay-get ovr 'strings) (preview-disabled-string ovr))
+  (preview-toggle ovr)
+  (overlay-put ovr 'preview-state 'disabled)
+  (dolist (filename (overlay-get ovr 'filenames))
+    (condition-case nil
+       (preview-delete-file filename)
+      (file-error nil))
+    (overlay-put ovr 'filenames nil)))
+
+(defun preview-delete (ovr &rest ignored)
+  "Delete preview overlay OVR, taking any associated file along.
+IGNORED arguments are ignored, making this function usable as
+a hook in some cases"
+  (let ((filenames (overlay-get ovr 'filenames)))
+    (overlay-put ovr 'filenames nil)
+    (delete-overlay ovr)
+    (dolist (filename filenames)
+      (condition-case nil
+         (preview-delete-file filename)
+       (file-error nil)))))
+
+(defun preview-clearout (&optional start end timestamp)
+  "Clear out all previews in the current region.
+When called interactively, the current region is used.
+Non-interactively, the region between START and END is
+affected.  Those two values default to the borders of
+the entire buffer.  If TIMESTAMP is non-nil, previews
+with a `timestamp' property of it are kept."
+  (interactive "r")
+  (dolist (ov (overlays-in (or start (point-min))
+                          (or end (point-max))))
+    (and (overlay-get ov 'preview-state)
+        (not (and timestamp
+                  (equal timestamp (overlay-get ov 'timestamp))))
+        (preview-delete ov))))
+
+(defun preview-clearout-buffer (&optional buffer)
+  "Clearout BUFFER from previews, current buffer if nil."
+  (interactive)
+  (if buffer
+      (with-current-buffer buffer (preview-clearout))
+    (preview-clearout)))
+
+(defun preview-clearout-section ()
+  "Clearout previews from LaTeX section."
+  (interactive)
+  (save-excursion
+    (LaTeX-mark-section)
+    (preview-clearout (region-beginning) (region-end))))
+
+(defun preview-clearout-at-point ()
+  "Clearout any preview at point."
+  (interactive)
+  (preview-clearout (max (point-min) (1- (point)))
+                   (min (point-max) (1+ (point)))))
+
+(defun preview-walk-document (func)
+  "Cycle through all buffers belonging to current document.
+Each buffer having the same master file as the current file
+has FUNC called with its current buffer being set to it."
+  (let* ((buffers (buffer-list))
+        (master (expand-file-name (TeX-master-file t)))
+        (default-buffers (list (current-buffer)
+                               (find-buffer-visiting master))))
+    (while buffers
+      (with-current-buffer (pop buffers)
+       (when
+           (or (memq (current-buffer) default-buffers)
+               (and (memq major-mode '(plain-tex-mode latex-mode))
+                    (or (stringp TeX-master)
+                        (eq TeX-master t))
+                    (string= (expand-file-name (TeX-master-file t))
+                             master)))
+         (funcall func))))))
+
+(defun preview-clearout-document ()
+  "Clear out all previews in current document.
+The document consists of all buffers that have the same master file
+as the current buffer.  This makes the current document lose
+all previews."
+  (interactive)
+  (preview-walk-document #'preview-clearout-buffer))
+
+(defun preview-kill-buffer-cleanup (&optional buf)
+  "This is a cleanup function just for use in hooks.
+Cleans BUF or current buffer.  The difference to
+`preview-clearout-buffer' is that previews
+associated with the last buffer modification time are
+kept."
+  (with-current-buffer (or buf (current-buffer))
+    (save-restriction
+      (widen)
+      (preview-clearout (point-min) (point-max) (visited-file-modtime)))))
+
+(add-hook 'kill-buffer-hook #'preview-kill-buffer-cleanup)
+(add-hook 'before-revert-hook #'preview-kill-buffer-cleanup)
+
+(defvar preview-last-counter)
+
+(defun preview-extract-counters (ctr)
+  (setq preview-last-counter
+       (prog1 (copy-sequence ctr)
+         (dolist (elt preview-last-counter)
+           (setq ctr (delete elt ctr)))))
+  (apply #'concat ctr))
+
+(defun desktop-buffer-preview-misc-data (&rest ignored)
+  "Hook function that extracts previews for persistent sessions."
+  (unless (buffer-modified-p)
+    (setq preview-last-counter nil)
+    (save-restriction
+      (widen)
+      (let (save-info (timestamp (visited-file-modtime)))
+       (dolist (ov (sort (overlays-in (point-min) (point-max))
+                         (lambda (x y) (< (overlay-start x)
+                                          (overlay-start y)))))
+         (when (and (memq (overlay-get ov 'preview-state) '(active inactive))
+                    (null (overlay-get ov 'queued))
+                    (cdr (overlay-get ov 'preview-image)))
+           (push (preview-dissect ov timestamp) save-info)))
+       (and save-info
+            (cons 'preview (cons timestamp (nreverse save-info))))))))
+
+(eval-after-load "desktop"
+  '(add-hook
+    'desktop-buffer-misc-functions
+    #'desktop-buffer-preview-misc-data))
+
+(defvar preview-temp-dirs nil
+"List of top level temporary directories in use from preview.
+Any directory not in this list will be cleared out by preview
+on first use.")
+
+(defun preview-dissect (ov timestamp)
+  "Extract all persistent data from OV and TIMESTAMP it."
+  (let ((filenames (butlast (nth 0 (overlay-get ov 'filenames)))))
+    (overlay-put ov 'timestamp timestamp)
+    (list (overlay-start ov)
+         (overlay-end ov)
+         (cdr (overlay-get ov 'preview-image))
+         filenames
+         (let ((ctr (overlay-get ov 'preview-counters)))
+           (and ctr
+                (cons (preview-extract-counters (car ctr))
+                      (preview-extract-counters (cdr ctr))))))))
+
+(defun preview-buffer-restore-internal (buffer-misc)
+  "Restore previews from BUFFER-MISC if proper.
+Remove them if they have expired."
+  (let ((timestamp (visited-file-modtime)) tempdirlist files)
+    (setq preview-parsed-counters nil)
+    (when (eq 'preview (pop buffer-misc))
+      (preview-get-geometry)
+      (if (equal (pop buffer-misc) timestamp)
+         (dolist (ovdata buffer-misc)
+           (setq tempdirlist
+                 (apply #'preview-reinstate-preview tempdirlist
+                        timestamp ovdata)))
+       (dolist (ovdata buffer-misc)
+         (setq files (nth 3 ovdata))
+         (condition-case nil
+             (delete-file (nth 0 files))
+           (file-error nil))
+         (unless (member (nth 1 files) tempdirlist)
+           (push (nth 1 files) tempdirlist)))
+       (dolist (dir tempdirlist)
+         (condition-case nil
+             (delete-directory dir)
+           (file-error nil)))))))
+
+
+(defun preview-buffer-restore (buffer-misc)
+  "At end of desktop load, reinstate previews.
+This delay is so that minor modes changing buffer positions
+\(like `x-symbol-mode' does) will not wreak havoc.
+BUFFER-MISC is the appropriate data to be used."
+  (add-hook 'desktop-delay-hook `(lambda ()
+                                  (with-current-buffer ,(current-buffer)
+                                    (preview-buffer-restore-internal
+                                     ',buffer-misc)))))
+  
+(defun desktop-buffer-preview (desktop-buffer-file-name
+                              desktop-buffer-name
+                              desktop-buffer-misc)
+  "Hook function for restoring persistent previews into a buffer."
+  (when (and desktop-buffer-file-name
+            (file-readable-p desktop-buffer-file-name))
+    (let ((buf (find-file-noselect desktop-buffer-file-name)))
+      (if (eq (car desktop-buffer-misc) 'preview)
+         (with-current-buffer buf
+           (preview-buffer-restore desktop-buffer-misc)
+           buf)
+       buf))))
+
+(eval-after-load "desktop"
+  '(if (boundp 'desktop-buffer-mode-handlers)
+       (add-to-list 'desktop-buffer-mode-handlers
+                   '(latex-mode . desktop-buffer-preview))
+     (add-hook 'desktop-buffer-handlers '(lambda ()
+                                          (desktop-buffer-preview
+                                           desktop-buffer-file-name
+                                           desktop-buffer-name
+                                           desktop-buffer-misc)))))
+
+(defcustom preview-auto-cache-preamble 'ask
+  "*Whether to generate a preamble cache format automatically.
+Possible values are nil, t, and `ask'."
+  :group 'preview-latex
+  :type '(choice (const :tag "Cache" t)
+                (const :tag "Don't cache" nil)
+                (const :tag "Ask" ask)))
+
+(defvar preview-dumped-alist nil
+  "Alist of dumped masters.
+The elements are (NAME . ASSOC).  NAME is the master file name
+\(without extension), ASSOC is what to do with regard to this
+format.  Possible values: NIL means no format is available
+and none should be generated.  T means no format is available,
+it should be generated on demand.  If the value is a cons cell,
+the CAR of the cons cell is the command with which the format
+has been generated, and the CDR is some Emacs-flavor specific
+value used for maintaining a watch on possible changes of the
+preamble.")
+
+(defun preview-cleanout-tempfiles ()
+  "Clean out all directories and files with non-persistent data.
+This is called as a hook when exiting Emacs."
+  (mapc #'preview-kill-buffer-cleanup (buffer-list))
+  (mapc #'preview-format-kill preview-dumped-alist))
+
+(defun preview-inactive-string (ov)
+  "Generate before-string for an inactive preview overlay OV.
+This is for overlays where the source text has been clicked
+visible.  For efficiency reasons it is expected that the buffer
+is already selected and unnarrowed."
+  (concat
+   (preview-make-clickable (overlay-get ov 'preview-map)
+                          preview-icon
+                          "\
+%s redisplays preview
+%s more options")
+;; icon on separate line only for stuff starting on its own line
+   (with-current-buffer (overlay-buffer ov)
+     (save-excursion
+       (save-restriction
+        (widen)
+        (goto-char (overlay-start ov))
+        (if (bolp) "\n" ""))))))
+
+(defun preview-dvipng-place-all ()
+  "Place all images dvipng has created, if any.
+Deletes the dvi file when finished."
+  (let (filename queued oldfiles snippet)
+    (dolist (ov (prog1 preview-gs-queue (setq preview-gs-queue nil)))
+      (when (and (setq queued (overlay-get ov 'queued))
+                (setq snippet (aref (overlay-get ov 'queued) 2))
+                (setq filename (preview-make-filename
+                                (format "prev%03d.%s"
+                                        snippet preview-dvipng-image-type)
+                                TeX-active-tempdir)))
+       (if (file-exists-p (car filename))
+           (progn
+             (overlay-put ov 'filenames (list filename))
+             (preview-replace-active-icon
+              ov
+              (preview-create-icon (car filename)
+                                   preview-dvipng-image-type
+                                   (preview-ascent-from-bb
+                                    (aref queued 0))
+                                   (aref preview-colors 2)))
+             (overlay-put ov 'queued nil))
+         (push filename oldfiles)
+         (overlay-put ov 'filenames nil)
+         (push ov preview-gs-queue))))
+    (if (setq preview-gs-queue (nreverse preview-gs-queue))
+       (progn
+         (preview-start-dvips preview-fast-conversion)
+         (setq TeX-sentinel-function (lambda (process command)
+                                       (preview-gs-dvips-sentinel
+                                        process
+                                        command
+                                        t)))
+         (dolist (ov preview-gs-queue)
+           (setq snippet (aref (overlay-get ov 'queued) 2))
+           (overlay-put ov 'filenames
+                        (list
+                         (preview-make-filename
+                          (or preview-ps-file
+                              (format "preview.%03d" snippet))
+                          TeX-active-tempdir))))
+         (while (setq filename (pop oldfiles))
+           (condition-case nil
+               (preview-delete-file filename)
+             (file-error nil))))
+      (condition-case nil
+         (let ((gsfile preview-gs-file))
+           (delete-file
+            (with-current-buffer TeX-command-buffer
+              (funcall (car gsfile) "dvi"))))
+       (file-error nil)))))
+   
+(defun preview-active-string (ov)
+  "Generate before-string for active image overlay OV."
+  (preview-make-clickable
+   (overlay-get ov 'preview-map)
+   (car (overlay-get ov 'preview-image))
+   "%s opens text
+%s more options"))
+
+(defun preview-make-filename (file tempdir)
+  "Generate a preview filename from FILE and TEMPDIR.
+Filenames consist of a CONS-cell with absolute file name as CAR
+and TEMPDIR as CDR.  TEMPDIR is a copy of `TeX-active-tempdir'
+with the directory name, the reference count and its top directory
+name elements.  If FILE is already in that form, the file name itself
+gets converted into a CONS-cell with a name and a reference count."
+  (if (consp file)
+      (progn
+       (if (consp (car file))
+           (setcdr (car file) (1+ (cdr (car file))))
+         (setcar file (cons (car file) 1)))
+       file)
+    (setcar (nthcdr 2 tempdir) (1+ (nth 2 tempdir)))
+    (cons (expand-file-name file (nth 0 tempdir))
+         tempdir)))
+
+(defun preview-attach-filename (attached file)
+  "Attaches the absolute file name ATTACHED to FILE."
+  (if (listp (caar file))
+      (setcar (car file) (cons attached (caar file)))
+    (setcar (car file) (list attached (caar file))))
+  file)
+
+(defun preview-delete-file (file)
+  "Delete a preview FILE.
+See `preview-make-filename' for a description of the data
+structure.  If the containing directory becomes empty,
+it gets deleted as well."
+  (let ((filename
+        (if (consp (car file))
+            (and (zerop
+                  (setcdr (car file) (1- (cdr (car file)))))
+                 (car (car file)))
+          (car file))))
+    (if filename
+       (unwind-protect
+           (if (listp filename)
+               (dolist (elt filename) (delete-file elt))
+             (delete-file filename))
+         (let ((tempdir (cdr file)))
+           (when tempdir
+             (if (> (nth 2 tempdir) 1)
+                 (setcar (nthcdr 2 tempdir) (1- (nth 2 tempdir)))
+               (setcdr file nil)
+               (delete-directory (nth 0 tempdir)))))))))
+
+(defvar preview-buffer-has-counters nil)
+(make-variable-buffer-local 'preview-buffer-has-counters)
+
+(defun preview-place-preview (snippet start end
+                                     box counters tempdir place-opts)
+  "Generate and place an overlay preview image.
+This generates the filename for the preview
+snippet SNIPPET in the current buffer, and uses it for the
+region between START and END.  BOX is an optional preparsed
+TeX bounding BOX passed on to the `place' hook.
+COUNTERS is the info about saved counter structures.
+TEMPDIR is a copy of `TeX-active-tempdir'.
+PLACE-OPTS are additional arguments passed into
+`preview-parse-messages'.  Returns
+a list with additional info from the placement hook.
+Those lists get concatenated together and get passed
+to the close hook."
+  (preview-clearout start end tempdir)
+  (let ((ov (make-overlay start end nil nil nil)))
+    (when (fboundp 'TeX-overlay-prioritize)
+      (overlay-put ov 'priority (TeX-overlay-prioritize start end)))
+    (overlay-put ov 'preview-map
+                (preview-make-clickable
+                 nil nil nil
+                 `(lambda(event) (interactive "e")
+                    (preview-toggle ,ov 'toggle event))
+                 `(lambda(event) (interactive "e")
+                    (preview-context-menu ,ov event))))
+    (overlay-put ov 'timestamp tempdir)
+    (when (cdr counters)
+      (overlay-put ov 'preview-counters counters)
+      (setq preview-buffer-has-counters t))
+    (prog1 (apply #'preview-call-hook 'place ov snippet box
+                 place-opts)
+      (overlay-put ov 'strings
+                  (list (preview-active-string ov)))
+      (preview-toggle ov t))))
+
+;; The following is a brutal hack.  It relies on `begin' being let to
+;; the start of the interesting area when TeX-region-create is being
+;; called.
+
+(defun preview-counter-find (begin)
+  "Fetch the next preceding or next preview-counters property.
+Factored out because of compatibility macros XEmacs would
+not use in advice."
+  ;; The following two lines are bug workaround for Emacs < 22.1.
+  (if (markerp begin)
+      (setq begin (marker-position begin)))
+  (or (car (get-char-property begin 'preview-counters))
+      (cdr (get-char-property (max (point-min)
+                                  (1- begin))
+                             'preview-counters))
+      (cdr (get-char-property
+           (max (point-min)
+                (1- (previous-single-char-property-change
+                     begin
+                     'preview-counters)))
+           'preview-counters))
+      (car (get-char-property
+           (next-single-char-property-change begin 'preview-counters)
+           'preview-counters))))
+
+(defadvice TeX-region-create (around preview-counters)
+  "Write out counter information to region."
+  (let ((TeX-region-extra
+        (concat
+         (and (boundp 'begin)
+              preview-buffer-has-counters
+              (mapconcat
+               #'identity
+               (cons
+                ""
+                (preview-counter-find (symbol-value 'begin)))
+               "\\setcounter"))
+         TeX-region-extra)))
+    ad-do-it))
+
+(defun preview-reinstate-preview (tempdirlist timestamp start end
+  image filename &optional counters)
+  "Reinstate a single preview.
+This gets passed TEMPDIRLIST, a list consisting of the kind
+of entries used in `TeX-active-tempdir', and TIMESTAMP, the
+time stamp under which the file got read in.  It returns an augmented
+list.  START and END give the buffer location where the preview
+is to be situated, IMAGE the image to place there, and FILENAME
+the file to use: a triple consisting of filename, its temp directory
+and the corresponding topdir.  COUNTERS is saved counter information,
+if any."
+  (when
+      (or (null filename) (file-readable-p (car filename)))
+    (when filename
+      (unless (equal (nth 1 filename) (car TeX-active-tempdir))
+       (setq TeX-active-tempdir
+             (or (assoc (nth 1 filename) tempdirlist)
+                 (car (push (append (cdr filename) (list 0))
+                            tempdirlist))))
+       (setcar (cdr TeX-active-tempdir)
+               (car (or (member (nth 1 TeX-active-tempdir)
+                                preview-temp-dirs)
+                        (progn
+                          (add-hook 'kill-emacs-hook
+                                    #'preview-cleanout-tempfiles t)
+                          (push (nth 1 TeX-active-tempdir)
+                                preview-temp-dirs))))))
+      (setcar (nthcdr 2 TeX-active-tempdir)
+             (1+ (nth 2 TeX-active-tempdir)))
+      (setcdr filename TeX-active-tempdir)
+      (setq filename (list filename)))
+    (let ((ov (make-overlay start end nil nil nil)))
+      (when (fboundp 'TeX-overlay-prioritize)
+       (overlay-put ov 'priority (TeX-overlay-prioritize start end)))
+      (overlay-put ov 'preview-map
+                  (preview-make-clickable
+                   nil nil nil
+                   `(lambda(event) (interactive "e")
+                      (preview-toggle ,ov 'toggle event))
+                   `(lambda(event) (interactive "e")
+                      (preview-context-menu ,ov event))))
+      (when counters
+       (overlay-put
+        ov 'preview-counters
+        (cons
+           (mapcar #'cdr
+                   (if (string= (car counters) "")
+                       preview-parsed-counters
+                     (setq preview-parsed-counters
+                           (preview-parse-counters (car counters)))))
+           (mapcar #'cdr
+                   (if (string= (cdr counters) "")
+                       preview-parsed-counters
+                     (setq preview-parsed-counters
+                           (preview-parse-counters (cdr counters)))))))
+       (setq preview-buffer-has-counters t))
+      (overlay-put ov 'filenames filename)
+      (overlay-put ov 'preview-image (cons (preview-import-image image)
+                                          image))
+      (overlay-put ov 'strings
+                  (list (preview-active-string ov)))
+      (overlay-put ov 'timestamp timestamp)
+      (preview-toggle ov t)))
+  tempdirlist)
+
+(defun preview-back-command (&optional nocomplex)
+  "Move backward a TeX token.
+If NOCOMPLEX is set, only basic tokens and no argument sequences
+will be skipped over backwards."
+  (let ((oldpos (point)) oldpoint)
+    (condition-case nil
+       (or (search-backward-regexp "\\(\\$\\$?\
+\\|\\\\[^a-zA-Z@]\
+\\|\\\\[a-zA-Z@]+\
+\\|\\\\begin[ \t]*{[^}]+}\
+\\)\\=" (line-beginning-position) t)
+           nocomplex
+           (if (eq ?\) (char-syntax (char-before)))
+               (while
+                   (progn
+                     (setq oldpoint (point))
+                     (backward-sexp)
+                     (and (not (eq oldpoint (point)))
+                          (eq ?\( (char-syntax (char-after))))))
+             (backward-char)))
+      (error (goto-char oldpos)))))
+
+(defcustom preview-required-option-list '("active" "tightpage" "auctex"
+                                         (preview-preserve-counters
+                                          "counters"))
+  "Specifies required options passed to the preview package.
+These are passed regardless of whether there is an explicit
+\\usepackage of that package present."
+  :group 'preview-latex
+  :type preview-expandable-string)
+
+(defcustom preview-preserve-counters nil
+  "Try preserving counters for partial runs if set."
+  :group 'preview-latex
+  :type 'boolean)
+
+(defcustom preview-default-option-list '("displaymath" "floats"
+                                        "graphics" "textmath" "sections"
+                                        "footnotes")
+  "*Specifies default options to pass to preview package.
+These options are only used when the LaTeX document in question does
+not itself load the preview package, namely when you use preview
+on a document not configured for preview.  \"auctex\", \"active\",
+\"dvips\" and \"delayed\" need not be specified here."
+  :group 'preview-latex
+  :type '(list (set :inline t :tag "Options known to work"
+                   :format "%t:\n%v%h" :doc
+                   "The above options are all the useful ones
+at the time of the release of this package.
+You should not need \"Other options\" unless you
+upgraded to a fancier version of just the LaTeX style.
+Please also note that `psfixbb' fails to have an effect if
+`preview-fast-conversion' or `preview-prefer-TeX-bb'
+are selected."
+                   (const "displaymath")
+                   (const "floats")
+                   (const "graphics")
+                   (const "textmath")
+                   (const "sections")
+                   (const "footnotes")
+                   (const "showlabels")
+                   (const "psfixbb"))
+              (set :tag "Expert options" :inline t
+                   :format "%t:\n%v%h" :doc
+                   "Expert options should not be enabled permanently."
+                   (const "noconfig")
+                   (const "showbox")
+                   (const "tracingall"))
+              (repeat :inline t :tag "Other options" (string))))
+
+(defcustom preview-default-preamble
+  '("\\RequirePackage[" ("," . preview-default-option-list)
+                                     "]{preview}[2004/11/05]")
+  "*Specifies default preamble code to add to a LaTeX document.
+If the document does not itself load the preview package, that is,
+when you use preview on a document not configured for preview, this
+list of LaTeX commands is inserted just before \\begin{document}."
+  :group 'preview-latex
+  :type preview-expandable-string)
+
+(defcustom preview-LaTeX-command '("%`%l \"\\nonstopmode\\nofiles\
+\\PassOptionsToPackage{" ("," . preview-required-option-list) "}{preview}\
+\\AtBeginDocument{\\ifx\\ifPreview\\undefined"
+preview-default-preamble "\\fi}\"%' %t")
+  "*Command used for starting a preview.
+See description of `TeX-command-list' for details."
+  :group 'preview-latex
+  :type preview-expandable-string)
+
+(defun preview-goto-info-page ()
+  "Read documentation for preview-latex in the info system."
+  (interactive)
+  (info "(preview-latex)"))
+
+(eval-after-load 'info '(add-to-list 'Info-file-list-for-emacs
+                                    '("preview" . "preview-latex")))
+
+(defvar preview-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map "\C-p" #'preview-at-point)
+    (define-key map "\C-r" #'preview-region)
+    (define-key map "\C-b" #'preview-buffer)
+    (define-key map "\C-d" #'preview-document)
+    (define-key map "\C-f" #'preview-cache-preamble)
+    (define-key map "\C-c\C-f" #'preview-cache-preamble-off)
+    (define-key map "\C-i" #'preview-goto-info-page)
+    ;;  (define-key map "\C-q" #'preview-paragraph)
+    (define-key map "\C-e" #'preview-environment)
+    (define-key map "\C-s" #'preview-section)
+    (define-key map "\C-w" #'preview-copy-region-as-mml)
+    (define-key map "\C-c\C-p" #'preview-clearout-at-point)
+    (define-key map "\C-c\C-r" #'preview-clearout)
+    (define-key map "\C-c\C-s" #'preview-clearout-section)
+    (define-key map "\C-c\C-b" #'preview-clearout-buffer)
+    (define-key map "\C-c\C-d" #'preview-clearout-document)
+    map))
+
+(defun preview-copy-text (ov)
+  "Copy the text of OV into the kill buffer."
+  (save-excursion
+    (set-buffer (overlay-buffer ov))
+    (copy-region-as-kill (overlay-start ov) (overlay-end ov))))
+
+(defun preview-copy-mml (ov)
+  "Copy an MML representation of OV into the kill buffer.
+This can be used to send inline images in mail and news when
+using MML mode."
+  (when (catch 'badcolor
+         (let ((str (car (preview-format-mml ov))))
+           (if str
+               (if (eq last-command 'kill-region)
+                   (kill-append str nil)
+                 (kill-new str))
+             (error "No image file available")))
+         nil)
+    (let (preview-transparent-border)
+      (preview-regenerate ov))))
+
+(defun preview-copy-region-as-mml (start end)
+  (interactive "r")
+  (when (catch 'badcolor
+         (let (str lst dont-ask)
+           (dolist (ov (overlays-in start end))
+             (when (setq str (preview-format-mml ov dont-ask))
+               (setq dont-ask (cdr str))
+               (and
+                (>= (overlay-start ov) start)
+                (<= (overlay-end ov) end)
+                (push (list (- (overlay-start ov) start)
+                            (- (overlay-end ov) start)
+                            (car str)) lst))))
+           (setq str (buffer-substring start end))
+           (dolist (elt (nreverse (sort lst #'car-less-than-car)))
+             (setq str (concat (substring str 0 (nth 0 elt))
+                               (nth 2 elt)
+                               (substring str (nth 1 elt)))))
+           (if (eq last-command 'kill-region)
+               (kill-append str nil)
+             (kill-new str)))
+         nil)
+    (let (preview-transparent-border)
+      (preview-region start end))))
+
+(autoload 'mailcap-extension-to-mime "mailcap")
+
+(defun preview-format-mml (ov &optional dont-ask)
+  "Return an MML representation of OV as string.
+This can be used to send inline images in mail and news when
+using MML mode.  If there is nothing current available,
+NIL is returned.  If the image has a colored border and the
+user wants it removed when asked (unless DONT-ASK is set),
+'badcolor is thrown a t.  The MML is returned in the car of the
+result, DONT-ASK in the cdr."
+  (and (memq (overlay-get ov 'preview-state) '(active inactive))
+       (not (overlay-get ov 'queued))
+       (let* ((text (with-current-buffer (overlay-buffer ov)
+                    (buffer-substring (overlay-start ov)
+                                      (overlay-end ov))))
+             (image (cdr (overlay-get ov 'preview-image)))
+             file type)
+        (cond ((consp image)
+               (and (not dont-ask)
+                    (nth 3 image)
+                    (if (y-or-n-p "Replace colored borders? ")
+                        (throw 'badcolor t)
+                      (setq dont-ask t)))
+               (setq file (car (car (last (overlay-get ov 'filenames))))
+                     type (mailcap-extension-to-mime
+                           (file-name-extension file)))
+               (cons
+                (format "<#part %s
+description=\"%s\"
+filename=%s>
+<#/part>"
+                        (if type
+                            (format "type=\"%s\" disposition=inline" type)
+                          "disposition=attachment")
+                        (if (string-match "[\n\"]" text)
+                            "preview-latex image"
+                          text)
+                        (if (string-match "[ \n<>]" file)
+                            (concat "\"" file "\"")
+                          file))
+                dont-ask))
+              ((stringp image)
+               (cons image dont-ask))))))
+
+(defun preview-active-contents (ov)
+  "Check whether we have a valid image associated with OV."
+  (and (memq (overlay-get ov 'preview-state) '(active inactive)) t))
+
+(defun preview-context-menu (ov ev)
+  "Pop up a menu for OV at position EV."
+  (popup-menu
+   `("Preview"
+     ["Toggle" (preview-toggle ,ov 'toggle ',ev)
+      (preview-active-contents ,ov)]
+     ["Regenerate" (preview-regenerate ,ov)]
+     ["Remove" (preview-delete ,ov)]
+     ["Copy text" (preview-copy-text ,ov)]
+     ["Copy MIME" (preview-copy-mml ,ov)
+      (preview-active-contents ,ov)])
+   ev))
+
+(defvar preview-TeX-style-dir)
+
+(defun preview-TeX-style-cooked ()
+  "Return `preview-TeX-style-dir' in cooked form.
+This will be fine for prepending to a `TEXINPUT' style
+environment variable, including an initial `.' at the front."
+  (if (or (zerop (length preview-TeX-style-dir))
+         (member (substring preview-TeX-style-dir -1) '(";" ":")))
+      preview-TeX-style-dir
+    (let ((sep
+          (cond
+           ((stringp TeX-kpathsea-path-delimiter)
+            TeX-kpathsea-path-delimiter)
+           ((string-match
+             "\\`.[:]"
+             (if (file-name-absolute-p preview-TeX-style-dir)
+                 preview-TeX-style-dir
+               (expand-file-name preview-TeX-style-dir)))
+            ";")
+           (t ":"))))
+      (concat "." sep preview-TeX-style-dir sep))))
+
+(defun preview-set-texinputs (&optional remove)
+  "Add `preview-TeX-style-dir' into `TEXINPUTS' variables.
+With prefix argument REMOVE, remove it again."
+  (interactive "P")
+  (let ((case-fold-search nil)
+       (preview-TeX-style-dir (preview-TeX-style-cooked))
+       pattern)
+    (if remove
+       (progn
+         (setq pattern (concat "\\`\\(TEXINPUTS[^=]*\\)=\\(.*\\)"
+                               (regexp-quote preview-TeX-style-dir)))
+         (dolist (env (copy-sequence process-environment))
+           (if (string-match pattern env)
+               (setenv (match-string 1 env)
+                       (and (or (< (match-beginning 2) (match-end 2))
+                                (< (match-end 0) (length env)))
+                            (concat (match-string 2 env)
+                                    (substring env (match-end 0))))))))
+      (setq pattern (regexp-quote preview-TeX-style-dir))
+      (dolist (env (cons "TEXINPUTS=" (copy-sequence process-environment)))
+       (if (string-match "\\`\\(TEXINPUTS[^=]*\\)=" env)
+           (unless (string-match pattern env)
+             (setenv (match-string 1 env)
+                     (concat preview-TeX-style-dir
+                             (substring env (match-end 0))))))))))
+
+(defcustom preview-TeX-style-dir nil
+  "This variable contains the location of uninstalled TeX styles.
+If this is nil, the preview styles are considered to be part of
+the installed TeX system.
+
+Otherwise, it can either just specify an absolute directory, or
+it can be a complete TEXINPUTS specification.  If it is the
+latter, it has to be followed by the character with which
+kpathsea separates path components, either `:' on Unix-like
+systems, or `;' on Windows-like systems.  And it should be
+preceded with .: or .; accordingly in order to have . first in
+the search path.
+
+The `TEXINPUT' environment type variables will get this prepended
+at load time calling \\[preview-set-texinputs] to reflect this.
+You can permanently install the style files using
+\\[preview-install-styles].
+
+Don't set this variable other than with customize so that its
+changes get properly reflected in the environment."
+  :group 'preview-latex
+  :set (lambda (var value)
+        (and (boundp var)
+             (symbol-value var)
+             (preview-set-texinputs t))
+        (set var value)
+        (and (symbol-value var)
+             (preview-set-texinputs)))
+  :type '(choice (const :tag "Installed" nil)
+                (string :tag "Style directory or TEXINPUTS path")))
+
+;;;###autoload
+(defun preview-install-styles (dir &optional force-overwrite
+                                  force-save)
+  "Installs the TeX style files into a permanent location.
+This must be in the TeX search path.  If FORCE-OVERWRITE is greater
+than 1, files will get overwritten without query, if it is less
+than 1 or nil, the operation will fail.  The default of 1 for interactive
+use will query.
+
+Similarly FORCE-SAVE can be used for saving
+`preview-TeX-style-dir' to record the fact that the uninstalled
+files are no longer needed in the search path."
+  (interactive "DPermanent location for preview TeX styles
+pp")
+  (unless preview-TeX-style-dir
+    (error "Styles are already installed"))
+  (dolist (file (or
+                (condition-case nil
+                    (directory-files
+                     (progn
+                       (string-match
+                        "\\`\\(\\.[:;]\\)?\\(.*?\\)\\([:;]\\)?\\'"
+                        preview-TeX-style-dir)
+                       (match-string 2 preview-TeX-style-dir))
+                     t "\\.\\(sty\\|def\\|cfg\\)\\'")
+                  (error nil))
+                (error "Can't find files to install")))
+    (copy-file file dir (cond ((eq force-overwrite 1) 1)
+                             ((numberp force-overwrite)
+                              (> force-overwrite 1))
+                             (t force-overwrite))))
+  (if (cond ((eq force-save 1)
+            (y-or-n-p "Stop using non-installed styles permanently "))
+           ((numberp force-save)
+            (> force-save 1))
+           (t force-save))
+      (customize-save-variable 'preview-TeX-style-dir nil)
+    (customize-set-variable 'preview-TeX-style-dir nil)))
+
+;;;###autoload
+(defun LaTeX-preview-setup ()
+  "Hook function for embedding the preview package into AUCTeX.
+This is called by `LaTeX-mode-hook' and changes AUCTeX variables
+to add the preview functionality."
+  (remove-hook 'LaTeX-mode-hook #'LaTeX-preview-setup)
+  (add-hook 'LaTeX-mode-hook #'preview-mode-setup)
+  (define-key LaTeX-mode-map "\C-c\C-p" preview-map)
+  (easy-menu-define preview-menu LaTeX-mode-map
+    "This is the menu for preview-latex."
+    '("Preview"
+      "Generate previews"
+      ["(or toggle) at point" preview-at-point]
+      ["for environment" preview-environment]
+      ["for section" preview-section]
+      ["for region" preview-region (preview-mark-active)]
+      ["for buffer" preview-buffer]
+      ["for document" preview-document]
+      "---"
+      "Remove previews"
+      ["at point" preview-clearout-at-point]
+      ["from section" preview-clearout-section]
+      ["from region" preview-clearout (preview-mark-active)]
+      ["from buffer" preview-clearout-buffer]
+      ["from document" preview-clearout-document]
+      "---"
+      "Turn preamble cache"
+      ["on" preview-cache-preamble]
+      ["off" preview-cache-preamble-off]
+      "---"
+      ("Customize"
+       ["Browse options"
+       (customize-group 'preview)]
+       ["Extend this menu"
+       (easy-menu-add-item
+        nil '("Preview")
+        (customize-menu-create 'preview))])
+      ["Read documentation" preview-goto-info-page]
+      ["Report Bug" preview-report-bug]))
+  (if (eq major-mode 'latex-mode)
+      (preview-mode-setup))
+  (if (boundp 'desktop-buffer-misc)
+      (preview-buffer-restore desktop-buffer-misc)))
+
+(defun preview-clean-subdir (dir)
+  "Cleans out a temporary DIR with preview image files."
+  (condition-case err
+      (progn
+       (mapc #'delete-file
+             (directory-files dir t "\\`pr" t))
+       (delete-directory dir))
+    (error (message "Deletion of `%s' failed: %s" dir
+                   (error-message-string err)))))
+
+(defun preview-clean-topdir (topdir)
+  "Cleans out TOPDIR from temporary directories.
+This does not erase the directory itself since its permissions
+might be needed for colloborative work on common files."
+  (mapc #'preview-clean-subdir
+       (condition-case nil
+           (directory-files topdir t "\\`tmp" t)
+         (file-error nil))))
+
+(defun preview-create-subdirectory ()
+  "Create a temporary subdir for the current TeX process.
+If necessary, generates a fitting top
+directory or cleans out an existing one (if not yet
+visited in this session), then returns the name of
+the created subdirectory relative to the master directory,
+in shell-quoted form.  `TeX-active-tempdir' is
+set to the corresponding TEMPDIR descriptor as described
+in `preview-make-filename'.  The directory is registered
+in `preview-temp-dirs' in order not to be cleaned out
+later while in use."
+  (let ((topdir (expand-file-name (TeX-active-master "prv"))))
+    (if (file-directory-p topdir)
+       (unless (member topdir preview-temp-dirs)
+         ;;  Cleans out the top preview directory by
+         ;;  removing subdirs possibly left from a previous session.
+         (preview-clean-topdir topdir)
+         (push topdir preview-temp-dirs))
+      (make-directory topdir)
+      (add-to-list 'preview-temp-dirs topdir))
+    (add-hook 'kill-emacs-hook #'preview-cleanout-tempfiles t)
+    (setq TeX-active-tempdir
+         (list (make-temp-file (expand-file-name
+                          "tmp" (file-name-as-directory topdir)) t)
+               topdir
+               0))
+    (shell-quote-argument
+     (concat (file-name-as-directory (file-name-nondirectory topdir))
+            (file-name-nondirectory (nth 0 TeX-active-tempdir))))))
+
+;; Hook into TeX immediately if it's loaded, use LaTeX-mode-hook if not.
+(if (featurep 'latex)
+    (LaTeX-preview-setup)
+  (add-hook 'LaTeX-mode-hook #'LaTeX-preview-setup))
+
+;;;###autoload (add-hook 'LaTeX-mode-hook #'LaTeX-preview-setup)
+
+(defun preview-parse-counters (string)
+  "Extract counter information from STRING."
+  (let ((list preview-parsed-counters) (pos 0))
+    (while (eq pos (string-match " *\\({\\([^{}]+\\)}{[-0-9]+}\\)" string pos))
+      (setcdr (or (assoc (match-string 2 string) list)
+                 (car (push (list (match-string 2 string)) list)))
+             (match-string 1 string))
+      (setq pos (match-end 1)))
+    list))
+
+(defun preview-parse-tightpage (string)
+  "Build tightpage vector from STRING,"
+  (read (concat "[" string "]")))
+
+(defvar preview-parse-variables
+  '(("Fontsize" preview-parsed-font-size
+     "\\` *\\([0-9.]+\\)pt\\'" 1 string-to-number)
+    ("Magnification" preview-parsed-magnification
+     "\\` *\\([0-9]+\\)\\'" 1 string-to-number)
+    ("PDFoutput" preview-parsed-pdfoutput
+     "" 0 stringp)
+    ("Counters" preview-parsed-counters
+     ".*" 0 preview-parse-counters)
+    ("Tightpage" preview-parsed-tightpage
+     "\\` *\\(-?[0-9]+ *\\)\\{4\\}\\'" 0 preview-parse-tightpage)))
+
+(defun preview-error-quote (string run-coding-system)
+  "Turn STRING with potential ^^ sequences into a regexp.
+To preserve sanity, additional ^ prefixes are matched literally,
+so the character represented by ^^^ preceding extended characters
+will not get matched, usually."
+  (let (output case-fold-search)
+    (when (featurep 'mule)
+      (setq string (encode-coding-string string run-coding-system)))
+    (while (string-match "\\^\\{2,\\}\\(\\([@-_?]\\)\\|[8-9a-f][0-9a-f]\\)"
+                        string)
+      (setq output
+           (concat output
+                   (regexp-quote (substring string
+                                            0
+                                            (- (match-beginning 1) 2)))
+                   (if (match-beginning 2)
+                       (concat
+                        "\\(?:" (regexp-quote
+                                 (substring string
+                                            (- (match-beginning 1) 2)
+                                            (match-end 0)))
+                        "\\|"
+                        (char-to-string
+                         (logxor (aref string (match-beginning 2)) 64))
+                        "\\)")
+                     (char-to-string
+                      (string-to-number (match-string 1 string) 16))))
+           string (substring string (match-end 0))))
+    (setq output (concat output (regexp-quote string)))
+    (if (featurep 'mule)
+       (decode-coding-string output
+                             (or (and (boundp 'TeX-japanese-process-output-coding-system)
+                                      TeX-japanese-process-output-coding-system)
+                                 buffer-file-coding-system))
+      output)))
+
+(defun preview-parse-messages (open-closure)
+  "Turn all preview snippets into overlays.
+This parses the pseudo error messages from the preview
+document style for LaTeX.  OPEN-CLOSURE is called once
+it is certain that we have a valid output file, and it has
+to return in its CAR the PROCESS parameter for the CLOSE
+call, and in its CDR the final stuff for the placement hook."
+  (with-temp-message "locating previews..."
+    (let (TeX-error-file TeX-error-offset snippet box counters
+         file line
+         (lsnippet 0) lstart (lfile "") lline lbuffer lpoint
+         lcounters
+         string after-string error context-start
+         context offset
+         parsestate (case-fold-search nil)
+         (run-buffer (current-buffer))
+         (run-coding-system preview-coding-system)
+         (run-directory default-directory)
+         tempdir
+         close-data
+         open-data
+         fast-hook
+         slow-hook)
+      ;; clear parsing variables
+      (dolist (var preview-parse-variables)
+       (set (nth 1 var) nil))
+      (goto-char (point-min))
+      (unwind-protect
+         (progn
+           (while
+               (re-search-forward "\
+^\\(!\\|\\(.*?\\):[0-9]+:\\) \\|\
+\(\\(/*\
+\\(?:\\.+[^()\r\n{} /]*\\|[^()\r\n{} ./]+\
+\\(?: [^()\r\n{} ./]+\\)*\\(?:\\.[-0-9a-zA-Z_.]*\\)?\\)\
+\\(?:/+\\(?:\\.+[^()\r\n{} /]*\\|[^()\r\n{} ./]+\
+\\(?: [^()\r\n{} ./]+\\)*\\(?:\\.[-0-9a-zA-Z_.]*\\)?\\)?\\)*\\)\
+)*\\(?: \\|\r?$\\)\\|\
+\\()+\\)\\|\
+ !\\(?:offset(\\([---0-9]+\\))\\|\
+name(\\([^)]+\\))\\)\\|\
+^Preview: \\([a-zA-Z]+\\) \\([^\n\r]*\\)\r?$" nil t)
+;;; Ok, here is a line by line breakdown:
+;;; match-alternative 1:
+;;; error indicator for TeX error, either style.
+;;; match-alternative 2:
+;;; The same, but file-line-error-style, matching on file name.
+;;; match-alternative 3:
+;;; Too ugly to describe in detail.  In short, we try to catch file
+;;; names built from path components that don't contain spaces or
+;;; other special characters once the file extension has started.
+;;;
+;;; Position for searching immediately after the file name so as to
+;;; not miss closing parens or something.
+;;; (match-string 3) is the file name.
+;;; match-alternative 4:
+;;; )+\( \|$\)
+;;; a closing paren followed by the end of line or a space: a just
+;;; closed file.
+;;; match-alternative 5 (wrapped into one shy group with
+;;; match-alternative 6, so that the match on first char is slightly
+;;; faster):
+;;; !offset(\([---0-9]+\))
+;;; an AUCTeX offset message. (match-string 5) is the offset itself
+;;; !name(\([^)]+\))
+;;; an AUCTeX file name message.  (match-string 6) is the file name
+;;; TODO: Actually, the latter two should probably again match only
+;;; after a space or newline, since that it what \message produces.
+;;;disabled in prauctex.def:
+;;;\(?:Ov\|Und\)erfull \\.*[0-9]*--[0-9]*
+;;;\(?:.\{79\}
+;;;\)*.*$\)\|
+;;; This would have caught overfull box messages that consist of
+;;; several lines of context all with 79 characters in length except
+;;; of the last one.  prauctex.def kills all such messages.
+             (setq file (match-string-no-properties 2))
+             (cond
+              ((match-beginning 1)
+               (if (looking-at "\
+\\(?:Preview\\|Package Preview Error\\): Snippet \\([---0-9]+\\) \\(started\\|ended\\(\
+\\.? *(\\([---0-9]+\\)\\+\\([---0-9]+\\)x\\([---0-9]+\\))\\)?\\)\\.")
+                   (progn
+                     (when file
+                       (unless TeX-error-file
+                         (push nil TeX-error-file)
+                         (push nil TeX-error-offset))
+                       (unless (car TeX-error-offset)
+                         (rplaca TeX-error-file file)))
+                     (setq snippet (string-to-number (match-string 1))
+                           box (unless
+                                   (string= (match-string 2) "started")
+                                 (if (match-string 4)
+                                     (mapcar #'(lambda (x)
+                                                 (* (preview-get-magnification)
+                                                    (string-to-number x)))
+                                             (list
+                                              (match-string 4)
+                                              (match-string 5)
+                                              (match-string 6)))
+                                   t))
+                           counters (mapcar #'cdr preview-parsed-counters)
+                           error (progn
+                                   (setq lpoint (point))
+                                   (end-of-line)
+                                   (buffer-substring lpoint (point)))
+                           
+                           ;; And the context for the help window.
+                           context-start (point)
+                           
+                           ;; And the line number to position the cursor.
+;;; variant 1: profiling seems to indicate the regexp-heavy solution
+;;; to be favorable.  Removing incomplete characters from the error
+;;; context is an absolute nuisance.
+                           line (and (re-search-forward "\
+^l\\.\\([0-9]+\\) \\(\\.\\.\\.\\(?:\\^*\\(?:[89a-f][0-9a-f]\\|[]@-\\_?]\\)\\|\
+\[0-9a-f]?\\)\\)?\\([^\n\r]*?\\)\r?
+\\([^\n\r]*?\\)\\(\\(?:\\^+[89a-f]?\\)?\\.\\.\\.\\)?\r?$" nil t)
+                                     (string-to-number (match-string 1)))
+                           ;; And a string of the context to search for.
+                           string (and line (match-string 3))
+                           after-string (and line (buffer-substring
+                                                   (+ (match-beginning 4)
+                                                      (- (match-end 3)
+                                                         (match-beginning 0)))
+                                                   (match-end 4)))
+                           
+                           ;; And we have now found to the end of the context.
+                           context (buffer-substring context-start (point))
+                           ;; We may use these in another buffer.
+                           offset (or (car TeX-error-offset) 0)
+                           file (car TeX-error-file))
+                     (when (and (stringp file)
+                                (or (string= file "<none>")
+                                    (TeX-match-extension file)))
+                       ;; if we are the first time round, check for fast hooks:
+                       (when (null parsestate)
+                         (setq open-data
+                               (save-excursion (funcall open-closure))
+                               tempdir TeX-active-tempdir)
+                         (dolist
+                             (lst (if (listp TeX-translate-location-hook)
+                                      TeX-translate-location-hook
+                                    (list TeX-translate-location-hook)))
+                           (let ((fast
+                                  (and (symbolp lst)
+                                       (get lst 'TeX-translate-via-list))))
+                             (if fast
+                                 (setq fast-hook
+                                       (nconc fast-hook (list fast)))
+                               (setq slow-hook
+                                     (nconc slow-hook (list lst)))))))
+                       (condition-case err
+                           (save-excursion (run-hooks 'slow-hook))
+                         (error (preview-log-error err "Translation hook")))
+                       (push (vector file (+ line offset)
+                                     string after-string
+                                     snippet box counters) parsestate)))
+                 ;; else normal error message
+                 (forward-line)
+                 (re-search-forward "^l\\.[0-9]" nil t)
+                 (forward-line 2)))
+              ((match-beginning 3)
+               ;; New file -- Push on stack
+               (push (match-string-no-properties 3) TeX-error-file)
+               (push nil TeX-error-offset)
+               (goto-char (match-end 3)))
+              ((match-beginning 4)
+               ;; End of file -- Pop from stack
+               (when (> (length TeX-error-file) 1)
+                 (pop TeX-error-file)
+                 (pop TeX-error-offset))
+               (goto-char (1+ (match-beginning 0))))
+              ((match-beginning 5)
+               ;; Hook to change line numbers
+               (setq TeX-error-offset
+                     (list (string-to-number (match-string 5)))))
+              ((match-beginning 6)
+               ;; Hook to change file name
+               (setq TeX-error-file (list (match-string-no-properties 6))))
+              ((match-beginning 7)
+               (let ((var
+                      (assoc (match-string-no-properties 7)
+                             preview-parse-variables))
+                     (offset (- (match-beginning 0) (match-beginning 8)))
+                     (str (match-string-no-properties 8)))
+                 ;; paste together continuation lines:
+                 (while (= (- (length str) offset) 79)
+                   (search-forward-regexp "^\\([^\n\r]*\\)\r?$")
+                   (setq offset (- (length str))
+                         str (concat str (match-string-no-properties 1))))
+                 (when (and var
+                            (string-match (nth 2 var) str))
+                   (set (nth 1 var)
+                        (funcall (nth 4 var)
+                                 (match-string-no-properties
+                                  (nth 3 var)
+                                  str))))))))
+           (when (null parsestate)
+             (error "LaTeX found no preview images")))
+       (unwind-protect
+           (save-excursion
+             (setq parsestate (nreverse parsestate))
+             (condition-case err
+                 (dolist (fun fast-hook)
+                   (setq parsestate
+                         (save-excursion (funcall fun parsestate))))
+               (error (preview-log-error err "Fast translation hook")))
+             (setq snippet 0)
+             (dolist (state parsestate)
+               (setq lsnippet snippet
+                     file (aref state 0)
+                     line (aref state 1)
+                     string (aref state 2)
+                     after-string (aref state 3)
+                     snippet (aref state 4)
+                     box (aref state 5)
+                     counters (aref state 6))
+               (unless (string= lfile file)
+                 (set-buffer (if (string= file "<none>")
+                                 (with-current-buffer run-buffer
+                                   TeX-command-buffer)
+                               (find-file-noselect
+                                (expand-file-name file run-directory))))
+                 (setq lfile file))
+               (save-excursion
+                 (save-restriction
+                   (widen)
+                   ;; a fast hook might have positioned us already:
+                   (if (number-or-marker-p string)
+                       (progn
+                         (goto-char string)
+                         (setq lpoint
+                               (if (number-or-marker-p after-string)
+                                   after-string
+                                 (line-beginning-position))))
+                     (if (and (eq (current-buffer) lbuffer)
+                              (<= lline line))
+                         ;; while Emacs does the perfectly correct
+                         ;; thing even when when the line differences
+                         ;; get zero or negative, I don't trust this
+                         ;; to be universally the case across other
+                         ;; implementations.  Besides, if the line
+                         ;; number gets smaller again, we are probably
+                         ;; rereading the file, and restarting from
+                         ;; the beginning will probably be faster.
+                         (progn
+                           (goto-char lpoint)
+                           (if (/= lline line)
+                               (if (eq selective-display t)
+                                   (re-search-forward "[\n\C-m]" nil
+                                                      'end
+                                                      (- line lline))
+                                 (forward-line (- line lline)))))
+                       (goto-line line))
+                     (setq lpoint (point))
+                     (cond
+                      ((search-forward (concat string after-string)
+                                       (line-end-position) t)
+                       (backward-char (length after-string)))
+                      ;;ok, transform ^^ sequences
+                      ((search-forward-regexp
+                        (concat "\\("
+                                (setq string
+                                      (preview-error-quote
+                                       string
+                                       run-coding-system))
+                                "\\)"
+                                (setq after-string
+                                      (preview-error-quote
+                                       after-string
+                                       run-coding-system)))
+                        (line-end-position) t)
+                       (goto-char (match-end 1)))
+                      ((search-forward-regexp
+                        (concat "\\("
+                                (if (string-match
+                                     "^[^\0-\177]\\{1,6\\}" string)
+                                    (setq string
+                                          (substring string (match-end 0)))
+                                  string)
+                                "\\)"
+                                (if (string-match
+                                     "[^\0-\177]\\{1,6\\}$" after-string)
+                                    (setq after-string
+                                          (substring after-string
+                                                     0 (match-beginning 0)))))
+                        (line-end-position) t)
+                       (goto-char (match-end 1)))
+                      (t (search-forward-regexp
+                          string
+                          (line-end-position) t))))
+                   (setq lline line
+                         lbuffer (current-buffer))
+                   (if box
+                       (progn
+                         (if (and lstart (= snippet lsnippet))
+                             (setq close-data
+                                   (nconc
+                                    (preview-place-preview
+                                     snippet
+                                     (save-excursion
+                                       (preview-back-command
+                                        (= (prog1 (point)
+                                             (goto-char lstart))
+                                           lstart))
+                                       (point))
+                                     (point)
+                                     (preview-TeX-bb box)
+                                     (cons lcounters counters)
+                                     tempdir
+                                     (cdr open-data))
+                                    close-data))
+                           (with-current-buffer run-buffer
+                             (preview-log-error
+                              (list 'error
+                                    (format
+                                     "End of Preview snippet %d unexpected"
+                                     snippet)) "Parser")))
+                         (setq lstart nil))
+                     ;; else-part of if box
+                     (setq lstart (point) lcounters counters)
+                     ;; >= because snippets in between might have
+                     ;; been ignored because of TeX-default-extension
+                     (unless (>= snippet (1+ lsnippet))
+                       (with-current-buffer run-buffer
+                         (preview-log-error
+                          (list 'error
+                                (format
+                                 "Preview snippet %d out of sequence"
+                                 snippet)) "Parser"))))))))
+         (preview-call-hook 'close (car open-data) close-data))))))
+
+(defun preview-get-geometry ()
+  "Transfer display geometry parameters from current display.
+Returns list of scale, resolution and colors.  Calculation
+is done in current buffer."
+  (condition-case err
+      (let* ((geometry
+             (list (preview-hook-enquiry preview-scale-function)
+                   (cons (/ (* 25.4 (display-pixel-width))
+                            (display-mm-width))
+                         (/ (* 25.4 (display-pixel-height))
+                            (display-mm-height)))
+                   (preview-get-colors)))
+            (preview-min-spec
+             (* (cdr (nth 1 geometry))
+                (/
+                 (preview-inherited-face-attribute
+                  'preview-reference-face :height 'default)
+                 720.0))))
+       (setq preview-icon (preview-make-image 'preview-icon-specs)
+             preview-error-icon (preview-make-image
+                                 'preview-error-icon-specs)
+             preview-nonready-icon (preview-make-image
+                                    'preview-nonready-icon-specs))
+       geometry)
+    (error (error "Display geometry unavailable: %s"
+                 (error-message-string err)))))
+
+(defun preview-set-geometry (geometry)
+  "Set geometry variables from GEOMETRY.
+Buffer-local `preview-scale', `preview-resolution',
+and `preview-colors' are set as given."
+  (setq preview-scale (nth 0 geometry)
+       preview-resolution (nth 1 geometry)
+       preview-colors (nth 2 geometry)))
+
+(defun preview-start-dvipng ()
+  "Start a DviPNG process.."
+  (let* ((file preview-gs-file)
+        tempdir
+        (res (/ (* (car preview-resolution)
+                   (preview-hook-enquiry preview-scale))
+                (preview-get-magnification)))
+        (resolution  (format " -D%d " res))
+        (colors (preview-dvipng-color-string preview-colors res))
+        (command (with-current-buffer TeX-command-buffer
+                   (prog1
+                       (concat (TeX-command-expand preview-dvipng-command
+                                                   (car file))
+                               " " colors resolution)
+                     (setq tempdir TeX-active-tempdir))))
+        (name "Preview-DviPNG"))
+    (setq TeX-active-tempdir tempdir)
+    (goto-char (point-max))
+    (insert-before-markers "Running `" name "' with ``" command "''\n")
+    (setq mode-name name)
+    (setq TeX-sentinel-function
+         (lambda (process name) (message "%s: done." name)))
+    (if TeX-process-asynchronous
+       (let ((process (start-process name (current-buffer) TeX-shell
+                                     TeX-shell-command-option
+                                     command)))
+         (if TeX-after-start-process-function
+             (funcall TeX-after-start-process-function process))
+         (TeX-command-mode-line process)
+         (set-process-filter process 'TeX-command-filter)
+         (set-process-sentinel process 'TeX-command-sentinel)
+         (set-marker (process-mark process) (point-max))
+         (push process compilation-in-progress)
+         (sit-for 0)
+         process)
+      (setq mode-line-process ": run")
+      (set-buffer-modified-p (buffer-modified-p))
+      (sit-for 0)                              ; redisplay
+      (call-process TeX-shell nil (current-buffer) nil
+                   TeX-shell-command-option
+                   command))))
+
+(defun preview-start-dvips (&optional fast)
+  "Start a DviPS process.
+If FAST is set, do a fast conversion."
+  (let* ((file preview-gs-file)
+        tempdir
+        (command (with-current-buffer TeX-command-buffer
+                   (prog1
+                       (TeX-command-expand (if fast
+                                               preview-fast-dvips-command
+                                             preview-dvips-command)
+                                           (car file))
+                     (setq tempdir TeX-active-tempdir))))
+        (name "Preview-DviPS"))
+    (setq TeX-active-tempdir tempdir)
+    (setq preview-ps-file (and fast
+                              (preview-make-filename
+                               (preview-make-filename
+                                "preview.ps" tempdir) tempdir)))
+    (goto-char (point-max))
+    (insert-before-markers "Running `" name "' with ``" command "''\n")
+    (setq mode-name name)
+    (setq TeX-sentinel-function
+         (lambda (process name) (message "%s: done." name)))
+    (if TeX-process-asynchronous
+       (let ((process (start-process name (current-buffer) TeX-shell
+                                     TeX-shell-command-option
+                                     command)))
+         (if TeX-after-start-process-function
+             (funcall TeX-after-start-process-function process))
+         (TeX-command-mode-line process)
+         (set-process-filter process 'TeX-command-filter)
+         (set-process-sentinel process 'TeX-command-sentinel)
+         (set-marker (process-mark process) (point-max))
+         (push process compilation-in-progress)
+         (sit-for 0)
+         process)
+      (setq mode-line-process ": run")
+      (set-buffer-modified-p (buffer-modified-p))
+      (sit-for 0)                              ; redisplay
+      (call-process TeX-shell nil (current-buffer) nil
+                   TeX-shell-command-option
+                   command))))
+
+(defun preview-start-pdf2dsc ()
+  "Start a PDF2DSC process."
+  (let* ((file preview-gs-file)
+        tempdir
+        pdfsource
+        (command (with-current-buffer TeX-command-buffer
+                   (prog1
+                       (TeX-command-expand preview-pdf2dsc-command
+                                           (car file))
+                     (setq tempdir TeX-active-tempdir
+                           pdfsource (funcall `,(car file) "pdf")))))
+        (name "Preview-PDF2DSC"))
+    (setq TeX-active-tempdir tempdir)
+    (setq preview-ps-file (preview-attach-filename
+                          pdfsource
+                          (preview-make-filename
+                           (preview-make-filename
+                            "preview.dsc" tempdir) tempdir)))
+    (goto-char (point-max))
+    (insert-before-markers "Running `" name "' with ``" command "''\n")
+    (setq mode-name name)
+    (setq TeX-sentinel-function
+         (lambda (process name) (message "%s: done." name)))
+    (if TeX-process-asynchronous
+       (let ((process (start-process name (current-buffer) TeX-shell
+                                     TeX-shell-command-option
+                                     command)))
+         (if TeX-after-start-process-function
+             (funcall TeX-after-start-process-function process))
+         (TeX-command-mode-line process)
+         (set-process-filter process 'TeX-command-filter)
+         (set-process-sentinel process 'TeX-command-sentinel)
+         (set-marker (process-mark process) (point-max))
+         (push process compilation-in-progress)
+         (sit-for 0)
+         process)
+      (setq mode-line-process ": run")
+      (set-buffer-modified-p (buffer-modified-p))
+      (sit-for 0)                              ; redisplay
+      (call-process TeX-shell nil (current-buffer) nil
+                   TeX-shell-command-option
+                   command))))
+
+(defun preview-TeX-inline-sentinel (process name)
+  "Sentinel function for preview.
+See `TeX-sentinel-function' and `set-process-sentinel'
+for definition of PROCESS and NAME."
+  (if process (TeX-format-mode-line process))
+  (let ((status (process-status process)))
+    (if (memq status '(signal exit))
+       (delete-process process))
+    (when (eq status 'exit)
+      (save-excursion
+       (goto-char (point-max))
+       (forward-line -1)
+       (if (search-forward "abnormally with code 1" nil t)
+           (replace-match "as expected with code 1" t t)
+         (if (search-forward "finished" nil t)
+             (insert " with nothing to show"))))
+      (condition-case err
+         (preview-call-hook 'open)
+       (error (preview-log-error err "LaTeX" process)))
+      (preview-reraise-error process))))
+
+(defcustom preview-format-extensions '(".fmt" ".efmt")
+  "Possible extensions for format files.
+Those are just needed for cleanup."
+  :group 'preview-latex
+  :type '(repeat string))
+
+(defun preview-format-kill (format-cons)
+  "Kill a cached format.
+FORMAT-CONS is intended to be an element of `preview-dumped-alist'.
+Tries through `preview-format-extensions'."
+  (dolist (ext preview-format-extensions)
+    (condition-case nil
+       (delete-file (preview-dump-file-name (concat (car format-cons) ext)))
+      (file-error nil))))
+
+(defun preview-dump-file-name (file)
+  "Make a file name suitable for dumping from FILE."
+  (if file
+      (concat (file-name-directory file)
+             "prv_"
+             (progn
+               (setq file (file-name-nondirectory file))
+               (while (string-match " " file)
+                 (setq file (replace-match "_" t t file)))
+               file))
+    "prv_texput"))
+
+(defun preview-do-replacements (string replacements)
+  "Perform replacements in string.
+STRING is the input string, REPLACEMENTS is a list of replacements.
+A replacement is a cons-cell, where the car is the match string,
+and the cdr is a list of strings or symbols.  Symbols get dereferenced,
+and strings get evaluated as replacement strings."
+  (let (rep case-fold-search)
+    (while replacements
+      (setq rep (pop replacements))
+      (cond ((symbolp rep)
+            (setq string (preview-do-replacements
+                          string (symbol-value rep))))
+           ((string-match (car rep) string)
+            (setq string
+                  (mapconcat (lambda(x)
+                               (if (symbolp x)
+                                   (symbol-value x)
+                                 (replace-match x t nil string)))
+                             (cdr rep) ""))))))
+  string)
+
+(defconst preview-LaTeX-disable-pdfoutput
+  '(("\\`\\(pdf[^ ]*\\)\
+\\(\\( [-&]\\([^ \"]\\|\"[^\"]*\"\\)*\\|\
+ \"[-&][^\"]*\"\\)*\\)\\(.*\\)\\'"
+   . ("\\1\\2 \"\\\\pdfoutput=0 \" \\5")))
+  "This replacement places `\"\\pdfoutput=0 \"' after the options
+of any command starting with `pdf'.")
+
+(defcustom preview-LaTeX-command-replacements
+  nil
+  "Replacement for `preview-LaTeX-command'.
+This is passed through `preview-do-replacements'."
+  :group 'preview-latex
+  :type '(repeat
+         (choice
+          (symbol :tag "Named replacement" :value preview-LaTeX-disable-pdfoutput)
+          (cons (string :tag "Matched string")
+                (repeat :tag "Concatenated elements for replacement"
+                        (choice (symbol :tag "Variable with literal string")
+                                (string :tag "non-literal regexp replacement")))))))
+
+(defvar preview-format-name)
+
+(defcustom preview-dump-replacements
+  '(preview-LaTeX-command-replacements
+    ("\\`\\([^ ]+\\)\
+\\(\\( +-\\([^ \\\\\"]\\|\\\\\\.\\|\"[^\"]*\"\\)*\\)*\\)\\(.*\\)\\'"
+     . ("\\1 -ini -interaction=nonstopmode \"&\\1\" " preview-format-name ".ini \\5")))
+  "Generate a dump command from the usual preview command."
+  :group 'preview-latex
+  :type '(repeat
+         (choice (symbol :tag "Named replacement")
+                 (cons string (repeat (choice symbol string))))))
+
+(defcustom preview-undump-replacements
+  '(("\\`\\([^ ]+\\)\
+ .*? \"\\\\input\" \\(.*\\)\\'"
+     . ("\\1 -interaction=nonstopmode \"&" preview-format-name "\" \\2")))
+  "Use a dumped format for reading preamble."
+  :group 'preview-latex
+  :type '(repeat
+         (choice (symbol :tag "Named replacement")
+                 (cons string (repeat (choice symbol string))))))
+
+
+(defun preview-cache-preamble (&optional format-cons)
+  "Dump a pregenerated format file.
+For the rest of the session, this file is used when running
+on the same master file.
+
+Returns the process for dumping, nil if there is still a valid
+format available.
+
+If FORMAT-CONS is non-nil, a previous format may get reused."
+  (interactive)
+  (let* ((dump-file
+         (expand-file-name (preview-dump-file-name (TeX-master-file "ini"))))
+        (master (TeX-master-file))
+        (format-name (expand-file-name master))
+        (preview-format-name (shell-quote-argument
+                              (preview-dump-file-name (file-name-nondirectory
+                                                       master))))
+        (master-file (expand-file-name (TeX-master-file t)))
+        (command (preview-do-replacements
+                  (TeX-command-expand
+                   (preview-string-expand preview-LaTeX-command)
+                   'TeX-master-file)
+                  preview-dump-replacements))
+        (preview-auto-cache-preamble nil))
+    (unless (and (consp (cdr format-cons))
+                (string= command (cadr format-cons)))
+      (unless format-cons
+       (setq format-cons (assoc format-name preview-dumped-alist)))
+      (if format-cons
+         (preview-cache-preamble-off format-cons)
+       (setq format-cons (list format-name))
+       (push format-cons preview-dumped-alist))
+      ;; mylatex.ltx expects a file name to follow.  Bad. `.tex'
+      ;; in the tools bundle is an empty file.
+      (write-region "\\ifx\\pdfoutput\\undefined\\else\
+\\let\\PREVIEWdump\\dump\\def\\dump{%
+\\edef\\next{{\\catcode`\\ 9 \\pdfoutput=\\the\\pdfoutput\\relax\
+\\the\\everyjob}}\\everyjob\\next\\catcode`\\ 10 \\let\\dump\\PREVIEWdump\\dump}\\fi\\input mylatex.ltx \\relax\n" nil dump-file)
+      (TeX-save-document master)
+      (prog1
+         (preview-generate-preview
+          nil (file-name-nondirectory master)
+          command)
+       (add-hook 'kill-emacs-hook #'preview-cleanout-tempfiles t)
+       (setq TeX-sentinel-function
+             `(lambda (process string)
+                (condition-case err
+                    (progn
+                      (if (and (eq (process-status process) 'exit)
+                               (zerop (process-exit-status process)))
+                          (preview-watch-preamble
+                           ',master-file
+                           ',command
+                           ',format-cons)
+                        (preview-format-kill ',format-cons))
+                      (delete-file ',dump-file))
+                  (error (preview-log-error err "Dumping" process)))
+                (preview-reraise-error process)))))))
+
+(defun preview-cache-preamble-off (&optional old-format)
+  "Clear the pregenerated format file.
+The use of the format file is discontinued.
+OLD-FORMAT may already contain a format-cons as
+stored in `preview-dumped-alist'."
+  (interactive)
+  (unless old-format
+    (setq old-format
+         (let ((master-file (expand-file-name (TeX-master-file))))
+           (or (assoc master-file preview-dumped-alist)
+               (car (push (list master-file) preview-dumped-alist))))))
+  (preview-unwatch-preamble old-format)
+  (preview-format-kill old-format)
+  (setcdr old-format nil))
+
+(defun preview-region (begin end)
+  "Run preview on region between BEGIN and END."
+  (interactive "r")
+  (TeX-region-create (TeX-region-file TeX-default-extension)
+                    (buffer-substring begin end)
+                    (if buffer-file-name
+                        (file-name-nondirectory buffer-file-name)
+                      "<none>")
+                    (save-restriction
+                      (widen)
+                      (let ((inhibit-point-motion-hooks t)
+                            (inhibit-field-text-motion t))
+                        (+ (count-lines (point-min) begin)
+                           (save-excursion
+                             (goto-char begin)
+                             (if (bolp) 0 -1))))))
+  (preview-generate-preview t (TeX-region-file nil t)
+                           (preview-do-replacements
+                            (TeX-command-expand
+                             (preview-string-expand preview-LaTeX-command)
+                             'TeX-region-file)
+                            preview-LaTeX-command-replacements)))
+
+(defun preview-buffer ()
+  "Run preview on current buffer."
+  (interactive)
+  (preview-region (point-min) (point-max)))
+
+;; We have a big problem: When we are dumping preambles, diagnostics
+;; issued in later runs will not make it to the output when the
+;; predumped format skips the preamble.  So we have to place those
+;; after \begin{document}.  This we can only do if regions never
+;; include the preamble.  We could do this in our own functions, but
+;; that would not extend to the operation of C-c C-r g RET.  So we
+;; make this preamble skipping business part of TeX-region-create.
+;; This will fail if the region is to contain just part of the
+;; preamble -- a bad idea anyhow.
+
+(defadvice TeX-region-create (before preview-preamble preactivate activate)
+  "Skip preamble for the sake of predumped formats."
+  (when (string-match TeX-header-end (ad-get-arg 1))
+    (ad-set-arg 1
+               (prog1 (substring (ad-get-arg 1) (match-end 0))
+                 (ad-set-arg 3
+                             (with-temp-buffer
+                               (insert (substring (ad-get-arg 1)
+                                                  0 (match-end 0)))
+                               (+ (ad-get-arg 3)
+                                  (count-lines (point-min) (point-max))
+                                  (if (bolp) 0 -1))))))))
+
+(defun preview-document ()
+  "Run preview on master document."
+  (interactive)
+  (TeX-save-document (TeX-master-file))
+  (preview-generate-preview
+   nil (TeX-master-file nil t)
+   (preview-do-replacements
+    (TeX-command-expand
+     (preview-string-expand preview-LaTeX-command)
+     'TeX-master-file)
+    preview-LaTeX-command-replacements)))
+                      
+(defun preview-environment (count)
+  "Run preview on LaTeX environment.
+This avoids running environments through preview that are
+indicated in `preview-inner-environments'.  If you use a prefix
+argument COUNT, the corresponding level of outward nested
+environments is selected."
+  (interactive "p")
+  (save-excursion
+    (let (currenv)
+      (dotimes (i (1- count))
+       (setq currenv (LaTeX-current-environment))
+       (if (string= currenv "document")
+           (error "No enclosing outer environment found"))
+       (LaTeX-find-matching-begin))
+      (while (member (setq currenv (LaTeX-current-environment))
+                    preview-inner-environments)
+       (LaTeX-find-matching-begin))
+      (if (string= currenv "document")
+         (error "No enclosing outer environment found"))
+      (preview-region
+       (save-excursion (LaTeX-find-matching-begin) (point))
+       (save-excursion (LaTeX-find-matching-end) (point))))))
+
+(defun preview-section ()
+  "Run preview on LaTeX section." (interactive)
+  (save-excursion
+    (LaTeX-mark-section)
+    (preview-region (region-beginning) (region-end))))
+
+
+(defun preview-generate-preview (region-p file command)
+  "Generate a preview.
+REGION-P is the region flag, FILE the file (without default
+extension and directory), COMMAND is the command to use.
+
+It returns the started process."
+  (setq TeX-current-process-region-p region-p)
+  (let* ((geometry (preview-get-geometry))
+        (commandbuff (current-buffer))
+        (pr-file (cons
+                  (if TeX-current-process-region-p
+                      'TeX-region-file
+                    'TeX-master-file)
+                  file))
+        (master (TeX-master-file))
+        (master-file (expand-file-name master))
+        (dumped-cons (assoc master-file
+                            preview-dumped-alist))
+        process)
+    (unless dumped-cons
+      (push (setq dumped-cons (cons master-file
+                                   (if (eq preview-auto-cache-preamble 'ask)
+                                       (y-or-n-p "Cache preamble? ")
+                                     preview-auto-cache-preamble)))
+           preview-dumped-alist))
+    (when (cdr dumped-cons)
+      (let* (TeX-current-process-region-p)
+       (setq process (preview-cache-preamble dumped-cons))
+       (if process
+           (setq TeX-sentinel-function
+                 `(lambda (process string)
+                    (funcall ,TeX-sentinel-function process string)
+                    (TeX-inline-preview-internal
+                     ,command ,file
+                     ',pr-file ,commandbuff
+                     ',dumped-cons
+                     ',master
+                     ',geometry
+                     (buffer-string)))))))
+    (or process
+       (TeX-inline-preview-internal command file
+                                    pr-file commandbuff
+                                    dumped-cons master
+                                    geometry))))
+
+(defun TeX-inline-preview-internal (command file pr-file
+                                   commandbuff dumped-cons master
+                                   geometry
+                                   &optional str)
+  "Internal stuff for previewing.
+COMMAND and FILE should be explained in `TeX-command-list'.
+PR-FILE is the target file name in the form for `preview-gs-file'.
+COMMANDBUFF, DUMPED-CONS, MASTER, and GEOMETRY are
+internal parameters, STR may be a log to insert into the current log."
+  (set-buffer commandbuff)
+  (let*
+      ((preview-format-name (shell-quote-argument
+                            (preview-dump-file-name
+                             (file-name-nondirectory master))))
+       (process
+       (TeX-run-command
+        "Preview-LaTeX"
+        (if (consp (cdr dumped-cons))
+            (preview-do-replacements
+             command preview-undump-replacements)
+          command) file)))
+    (condition-case err
+       (progn
+         (when str
+           (save-excursion
+             (goto-char (point-min))
+             (insert str)
+             (when (= (process-mark process) (point-min))
+               (set-marker (process-mark process) (point)))))
+         (preview-set-geometry geometry)
+         (setq preview-gs-file pr-file)
+         (setq TeX-sentinel-function 'preview-TeX-inline-sentinel)
+         (when (featurep 'mule)
+           (setq preview-coding-system
+                 (or (and (boundp 'TeX-japanese-process-output-coding-system)
+                          TeX-japanese-process-output-coding-system)
+                     (with-current-buffer commandbuff
+                       buffer-file-coding-system)))
+           (when preview-coding-system
+             (setq preview-coding-system
+                   (preview-buffer-recode-system
+                    (coding-system-base preview-coding-system))))
+           (set-process-coding-system
+            process preview-coding-system))
+         (TeX-parse-reset)
+         (setq TeX-parse-function 'TeX-parse-TeX)
+         (if TeX-process-asynchronous
+             process
+           (TeX-synchronous-sentinel "Preview-LaTeX" file process)))
+      (error (preview-log-error err "Preview" process)
+            (delete-process process)
+            (preview-reraise-error process)))))
+
+(defconst preview-version (eval-when-compile
+  (let ((name "$Name: release_11_86 $")
+       (rev "$Revision: 1.284 $"))
+    (or (when (string-match "\\`[$]Name: *release_\\([^ ]+\\) *[$]\\'" name)
+         (setq name (match-string 1 name))
+         (while (string-match "_" name)
+           (setq name (replace-match "." t t name)))
+         name)
+       (if (string-match "\\`[$]Revision: *\\([^ ]+\\) *[$]\\'" rev)
+           (format "CVS-%s" (match-string 1 rev)))
+       "unknown")))
+  "Preview version.
+If not a regular release, CVS revision of `preview.el'.")
+
+(defconst preview-release-date
+  (eval-when-compile
+    (let ((date "$Date: 2009/06/18 19:20:46 $"))
+      (string-match
+       "\\`[$]Date: *\\([0-9]+\\)/\\([0-9]+\\)/\\([0-9]+\\)"
+       date)
+      (format "%s.%s%s" (match-string 1 date) (match-string 2 date)
+             (match-string 3 date))))
+  "Preview release date.
+In the form of yyyy.mmdd")
+
+(defun preview-dump-state (buffer)
+  (condition-case nil
+      (progn
+       (unless (local-variable-p 'TeX-command-buffer)
+         (setq buffer (with-current-buffer buffer (TeX-active-buffer))))
+       (when (bufferp buffer)
+         (insert "\nRun buffer contents:\n\n")
+         (if (< (buffer-size buffer) 5000)
+             (insert-buffer-substring buffer)
+           (insert-buffer-substring buffer 1 2500)
+           (insert "...\n\n[...]\n\n\t...")
+           (insert-buffer-substring buffer
+                                    (- (buffer-size buffer) 2500)
+                                    (buffer-size buffer)))
+         (insert "\n")))
+    (error nil)))
+
+;;;###autoload
+(defun preview-report-bug () "Report a bug in the preview-latex package."
+  (interactive)
+  (let ((reporter-prompt-for-summary-p "Bug report subject: "))
+    (reporter-submit-bug-report
+     "bug-auctex@gnu.org"
+     (if (string-match "^CVS-" preview-version)
+        (concat "preview-" (substring preview-version 4))
+       preview-version)
+     '(AUCTeX-version
+       LaTeX-command-style
+       image-types
+       preview-image-type
+       preview-image-creators
+       preview-dvipng-image-type
+       preview-dvipng-command
+       preview-pdf2dsc-command
+       preview-gs-command
+       preview-gs-options
+       preview-gs-image-type-alist
+       preview-fast-conversion
+       preview-prefer-TeX-bb
+       preview-dvips-command
+       preview-fast-dvips-command
+       preview-scale-function
+       preview-LaTeX-command
+       preview-required-option-list
+       preview-preserve-counters
+       preview-default-option-list
+       preview-default-preamble
+       preview-LaTeX-command-replacements
+       preview-dump-replacements
+       preview-undump-replacements
+       preview-auto-cache-preamble
+       preview-TeX-style-dir)
+     `(lambda () (preview-dump-state ,(current-buffer)))
+     (lambda ()
+       (insert (format "\nOutput from running `%s -h':\n"
+                      preview-gs-command))
+       (call-process preview-gs-command nil t nil "-h")
+       (insert "\n"))
+     "Remember to cover the basics.  Including a minimal LaTeX example
+file exhibiting the problem might help."
+     )))
+
+(eval-when-compile
+  (when (boundp 'preview-compatibility-macros)
+    (dolist (elt preview-compatibility-macros)
+      (if (consp elt)
+         (fset (car elt) (cdr elt))
+       (fmakunbound elt)))))
+
+(makunbound 'preview-compatibility-macros)
+
+(provide 'preview)
+;;; preview.el ends here
diff --git a/packages/auctex/prv-emacs.el b/packages/auctex/prv-emacs.el
new file mode 100644 (file)
index 0000000..9f40736
--- /dev/null
@@ -0,0 +1,600 @@
+;;; prv-emacs.el --- GNU Emacs specific code for preview.el
+
+;; Copyright (C) 2001, 02, 03, 04, 05  Free Software Foundation, Inc.
+
+;; Author: David Kastrup
+;; Keywords: convenience, tex, wp
+
+;; This file 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, or (at your option)
+;; any later version.
+
+;; This file 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; see the file COPYING.  If not, write to
+;; the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; 
+
+;;; Code:
+
+(require 'tex-site)
+(require 'tex)
+(require 'latex)
+
+(defvar preview-compatibility-macros nil
+  "List of macros only present when compiling/loading.")
+
+(defcustom preview-transparent-color '(highlight :background)
+  "Color to appear transparent in previews.
+Set this to something unusual when using `preview-transparent-border',
+to the default background in most other cases."
+  :type '(radio (const :tag "None" nil)
+                (const :tag "Autodetect" t)
+                (color :tag "By name" :value "white")
+                (list :tag "Take from face"
+                      :value (default :background)
+                      (face)
+                      (choice :tag "What to take"
+                       (const :tag "Background" :value :background)
+                       (const :tag "Foreground" :value :foreground))))
+  :group 'preview-appearance)
+
+;;; Note that the following default introduces a border only when
+;;; Emacs blinks politely when point is on an image (the tested
+;;; unrelated function was introduced at about the time image blinking
+;;; became tolerable).
+(defcustom preview-transparent-border (unless (fboundp 'posn-object-x-y) 1.5)
+  "Width of transparent border for previews in pt.
+Setting this to a numeric value will add a border of
+`preview-transparent-color' around images, and will turn
+the heuristic-mask setting of images to default to 't since
+then the borders are correctly detected even in case of
+palette operations.  If the transparent color is something
+not present otherwise in the image, the cursor display
+will affect just this border.  A width of 0 is interpreted
+by PostScript as meaning a single pixel, other widths are
+interpreted as PostScript points (1/72 of 1in)"
+  :group 'preview-appearance
+  :type '(choice (const :value nil :tag "No border")
+                (number :value 1.5 :tag "Border width in pt")))
+
+(defun preview-get-heuristic-mask ()
+  "Get heuristic-mask to use for previews.
+Consults `preview-transparent-color'."
+  (cond ((stringp preview-transparent-color)
+        (color-values preview-transparent-color))
+       ((or (not (consp preview-transparent-color))
+            (integerp (car preview-transparent-color)))
+        preview-transparent-color)
+       (t (color-values (preview-inherited-face-attribute
+                         (nth 0 preview-transparent-color)
+                         (nth 1 preview-transparent-color)
+                         'default)))))
+
+(defsubst preview-create-icon-1 (file type ascent border)
+  `(image
+    :file ,file
+    :type ,type
+    :ascent ,ascent
+    ,@(and border
+          '(:mask (heuristic t)))))
+
+(defun preview-create-icon (file type ascent border)
+  "Create an icon from FILE, image TYPE, ASCENT and BORDER."
+  (list
+   (preview-create-icon-1 file type ascent border)
+   file type ascent border))
+
+(put 'preview-filter-specs :type
+     #'(lambda (keyword value &rest args)
+        (if (image-type-available-p value)
+            `(image :type ,value
+                    ,@(preview-filter-specs-1 args))
+          (throw 'preview-filter-specs nil))))
+
+;; No defcustom here: does not seem to make sense.
+
+(defvar preview-tb-icon-specs
+  '((:type xpm :file "prvtex24.xpm")
+    (:type xbm :file "prvtex24.xbm")))
+
+(defvar preview-tb-icon nil)
+
+(defun preview-add-urgentization (fun ov &rest rest)
+  "Cause FUN (function call form) to be called when redisplayed.
+FUN must be a form with OV as first argument,
+REST as the remainder, returning T."
+  (let ((dispro (overlay-get ov 'display)))
+    (unless (eq (car dispro) 'when)
+      (overlay-put ov 'display `(when (,fun ,ov ,@rest)  . ,dispro)))))
+
+(defun preview-remove-urgentization (ov)
+  "Undo urgentization of OV by `preview-add-urgentization'.
+Returns the old arguments to `preview-add-urgentization'
+if there was any urgentization."
+  (let ((dispro (overlay-get ov 'display)))
+    (when (eq (car-safe dispro) 'when)
+      (prog1
+         (car (cdr dispro))
+       (overlay-put ov 'display (cdr (cdr dispro)))))))
+
+(defsubst preview-icon-copy (icon)
+  "Prepare a later call of `preview-replace-active-icon'."
+
+  ;; This is just a GNU Emacs specific efficiency hack because it
+  ;; is easy to do.  When porting, don't do anything complicated
+  ;; here, rather deliver just the unchanged icon and make
+  ;; `preview-replace-active-icon' do the necessary work of replacing
+  ;; the icon where it actually has been stored, probably
+  ;; in the car of the strings property of the overlay.  This string
+  ;; might probably serve as a begin-glyph as well, in which case
+  ;; modifying the string in the strings property would change that
+  ;; glyph automatically.
+
+  (cons 'image (cdr icon)))
+
+(defsubst preview-replace-active-icon (ov replacement)
+  "Replace the active Icon in OV by REPLACEMENT, another icon."
+  (let ((img (overlay-get ov 'preview-image)))
+    (setcdr (car img) (cdar replacement))
+    (setcdr img (cdr replacement))))
+
+(defvar preview-button-1 [mouse-2])
+(defvar preview-button-2 [mouse-3])
+
+(defmacro preview-make-clickable (&optional map glyph helpstring click1 click2)
+  "Generate a clickable string or keymap.
+If MAP is non-nil, it specifies a keymap to add to, otherwise
+a new one is created.  If GLYPH is given, the result is made
+to display it wrapped in a string.  In that case,
+HELPSTRING is a format string with one or two %s specifiers
+for preview's clicks, displayed as a help-echo.  CLICK1 and CLICK2
+are functions to call on preview's clicks."
+  `(let ((resmap ,(or map '(make-sparse-keymap))))
+     ,@(if click1
+           `((define-key resmap preview-button-1 ,click1)))
+     ,@(if click2
+           `((define-key resmap preview-button-2 ,click2)))
+     ,(if glyph
+         `(propertize
+           "x"
+           'display ,glyph
+           'mouse-face 'highlight
+           'help-echo
+           ,(if (stringp helpstring)
+                (format helpstring preview-button-1 preview-button-2)
+              `(format ,helpstring preview-button-1 preview-button-2))
+           'keymap resmap)
+       'resmap)))
+
+(defvar preview-overlay nil)
+
+(put 'preview-overlay
+     'modification-hooks
+     '(preview-handle-modification))
+
+(put 'preview-overlay
+     'insert-in-front-hooks
+     '(preview-handle-insert-in-front))
+
+(put 'preview-overlay
+     'insert-behind-hooks
+     '(preview-handle-insert-behind))
+
+;; We have to fake our way around atomicity.
+
+;; Here is the beef: for best intuitiveness, we want to have
+;; insertions be carried out as expected before iconized text
+;; passages, but we want to insert *into* the overlay when not
+;; iconized.  A preview that has become empty can not get content
+;; again: we remove it.  A disabled preview needs no insert-in-front
+;; handler.
+
+(defvar preview-change-list nil
+  "List of tentatively changed overlays.")
+
+(defcustom preview-dump-threshold
+  "^ *\\\\begin *{document}[ %]*$"
+  "*Regexp denoting end of preamble.
+This is the location up to which preamble changes are considered
+to require redumping of a format."
+  :group 'preview-latex
+  :type 'string)
+
+(defun preview-preamble-changed-function
+  (ov after-change beg end &optional length)
+  "Hook function for change hooks on preamble.
+See info node `(elisp) Overlay Properties' for
+definition of OV, AFTER-CHANGE, BEG, END and LENGTH."
+  (let ((format-cons (overlay-get ov 'format-cons)))
+    (preview-unwatch-preamble format-cons)
+    (preview-format-kill format-cons)
+    (setcdr format-cons t)))
+
+(defun preview-watch-preamble (file command format-cons)
+  "Set up a watch on master file FILE.
+FILE can be an associated buffer instead of a filename.
+COMMAND is the command that generated the format.
+FORMAT-CONS contains the format info for the main
+format dump handler."
+  (let ((buffer (if (bufferp file)
+                   file
+                 (find-buffer-visiting file))) ov)
+    (setcdr
+     format-cons
+     (cons command
+          (when buffer
+            (with-current-buffer buffer
+              (save-excursion
+                (save-restriction
+                  (widen)
+                  (goto-char (point-min))
+                  (unless (re-search-forward preview-dump-threshold nil t)
+                    (error "Can't find preamble of `%s'" file))
+                  (setq ov (make-overlay (point-min) (point)))
+                  (overlay-put ov 'format-cons format-cons)
+                  (overlay-put ov 'insert-in-front-hooks
+                               '(preview-preamble-changed-function))
+                  (overlay-put ov 'modification-hooks
+                               '(preview-preamble-changed-function))
+                  ov))))))))
+
+(defun preview-unwatch-preamble (format-cons)
+  "Stop watching a format on FORMAT-CONS.
+The watch has been set up by `preview-watch-preamble'."
+  (when (consp (cdr format-cons))
+    (when (cddr format-cons)
+      (delete-overlay (cddr format-cons)))
+    (setcdr (cdr format-cons) nil)))
+
+(defun preview-register-change (ov)
+  "Register not yet changed OV for verification.
+This stores the old contents of the overlay in the
+`preview-prechange' property and puts the overlay into
+`preview-change-list' where `preview-check-changes' will
+find it at some later point of time."
+  (unless (overlay-get ov 'preview-prechange)
+    (if (eq (overlay-get ov 'preview-state) 'disabled)
+       (overlay-put ov 'preview-prechange t)
+      (overlay-put ov 'preview-prechange
+                  (save-restriction
+                    (widen)
+                    (buffer-substring-no-properties
+                     (overlay-start ov) (overlay-end ov)))))
+    (push ov preview-change-list)))
+
+(defun preview-check-changes ()
+  "Check whether the contents under the overlay have changed.
+Disable it if that is the case.  Ignores text properties."
+  (dolist (ov preview-change-list)
+    (condition-case nil
+       (with-current-buffer (overlay-buffer ov)
+         (let ((text (save-restriction
+                       (widen)
+                       (buffer-substring-no-properties
+                        (overlay-start ov) (overlay-end ov)))))
+           (if (zerop (length text))
+               (preview-delete ov)
+             (unless
+                 (or (eq (overlay-get ov 'preview-state) 'disabled)
+                     (preview-relaxed-string=
+                      text (overlay-get ov 'preview-prechange)))
+               (overlay-put ov 'insert-in-front-hooks nil)
+               (overlay-put ov 'insert-behind-hooks nil)
+               (preview-disable ov)))))
+      (error nil))
+    (overlay-put ov 'preview-prechange nil))
+  (setq preview-change-list nil))
+
+(defun preview-handle-insert-in-front
+  (ov after-change beg end &optional length)
+  "Hook function for `insert-in-front-hooks' property.
+See info node `(elisp) Overlay Properties' for
+definition of OV, AFTER-CHANGE, BEG, END and LENGTH."
+  (if after-change
+      (unless undo-in-progress
+       (if (eq (overlay-get ov 'preview-state) 'active)
+           (move-overlay ov end (overlay-end ov))))
+    (preview-register-change ov)))
+
+(defun preview-handle-insert-behind
+  (ov after-change beg end &optional length)
+  "Hook function for `insert-behind-hooks' property.
+This is needed in case `insert-before-markers' is used at the
+end of the overlay.  See info node `(elisp) Overlay Properties'
+for definition of OV, AFTER-CHANGE, BEG, END and LENGTH."
+  (if after-change
+      (unless undo-in-progress
+       (if (eq (overlay-get ov 'preview-state) 'active)
+           (move-overlay ov (overlay-start ov) beg)))
+    (preview-register-change ov)))
+
+(defun preview-handle-modification
+  (ov after-change beg end &optional length)
+  "Hook function for `modification-hooks' property.
+See info node `(elisp) Overlay Properties' for
+definition of OV, AFTER-CHANGE, BEG, END and LENGTH."
+  (unless after-change
+    (preview-register-change ov)))
+
+(defun preview-toggle (ov &optional arg event)
+  "Toggle visibility of preview overlay OV.
+ARG can be one of the following: t displays the overlay,
+nil displays the underlying text, and 'toggle toggles.
+If EVENT is given, it indicates the window where the event
+occured, either by being a mouse event or by directly being
+the window in question.  This may be used for cursor restoration
+purposes."
+  (let ((old-urgent (preview-remove-urgentization ov))
+       (preview-state
+        (if (if (eq arg 'toggle)
+                (null (eq (overlay-get ov 'preview-state) 'active))
+              arg)
+            'active
+          'inactive))
+       (strings (overlay-get ov 'strings)))
+    (unless (eq (overlay-get ov 'preview-state) 'disabled)
+      (overlay-put ov 'preview-state preview-state)
+      (if (eq preview-state 'active)
+         (progn
+           (overlay-put ov 'category 'preview-overlay)
+           (if (eq (overlay-start ov) (overlay-end ov))
+               (overlay-put ov 'before-string (car strings))
+             (dolist (prop '(display keymap mouse-face help-echo))
+               (overlay-put ov prop
+                            (get-text-property 0 prop (car strings))))
+             (overlay-put ov 'before-string nil))
+           (overlay-put ov 'face nil))
+       (dolist (prop '(display keymap mouse-face help-echo))
+         (overlay-put ov prop nil))
+       (overlay-put ov 'face 'preview-face)
+       (unless (cdr strings)
+         (setcdr strings (preview-inactive-string ov)))
+       (overlay-put ov 'before-string (cdr strings)))
+      (if old-urgent
+         (apply 'preview-add-urgentization old-urgent))))
+  (if event
+      (preview-restore-position
+       ov
+       (if (windowp event)
+          event
+        (posn-window (event-start event))))))
+
+(defsubst preview-buffer-recode-system (base)
+  "This is supposed to translate unrepresentable base encodings
+into something that can be used safely for byte streams in the
+run buffer.  A noop for Emacs."
+  base)
+
+(defun preview-mode-setup ()
+  "Setup proper buffer hooks and behavior for previews."
+  (set (make-local-variable 'desktop-save-buffer)
+       #'desktop-buffer-preview-misc-data)
+  (add-hook 'pre-command-hook #'preview-mark-point nil t)
+  (add-hook 'post-command-hook #'preview-move-point nil t)
+  (easy-menu-add preview-menu LaTeX-mode-map)
+  (unless preview-tb-icon
+    (setq preview-tb-icon (preview-filter-specs preview-tb-icon-specs)))
+  (when preview-tb-icon
+    (define-key LaTeX-mode-map [tool-bar preview]
+      `(menu-item "Preview at point" preview-at-point
+                 :image ,preview-tb-icon
+                 :help "Preview on/off at point")))
+  (when buffer-file-name
+    (let* ((filename (expand-file-name buffer-file-name))
+          format-cons)
+      (when (string-match (concat "\\." TeX-default-extension "\\'")
+                         filename)
+       (setq filename (substring filename 0 (match-beginning 0))))
+      (setq format-cons (assoc filename preview-dumped-alist))
+      (when (consp (cdr format-cons))
+       (preview-unwatch-preamble format-cons)
+       (preview-watch-preamble (current-buffer)
+                               (cadr format-cons)
+                               format-cons)))))
+
+(defvar preview-marker (make-marker)
+  "Marker for fake intangibility.")
+
+(defvar preview-temporary-opened nil)
+
+(defvar preview-last-location nil
+  "Restored cursor position marker for reopened previews.")
+(make-variable-buffer-local 'preview-last-location)
+
+(defun preview-mark-point ()
+  "Mark position for fake intangibility."
+  (when (eq (get-char-property (point) 'preview-state) 'active)
+    (unless preview-last-location
+      (setq preview-last-location (make-marker)))
+    (set-marker preview-last-location (point))
+    (set-marker preview-marker (point))
+    (preview-move-point))
+  (set-marker preview-marker (point)))
+
+(defun preview-restore-position (ov window)
+  "Tweak position after opening/closing preview.
+The treated overlay OV has been triggered in WINDOW.  This function
+records the original buffer position for reopening, or restores it
+after reopening.  Note that by using the mouse, you can open/close
+overlays not in the active window."
+  (when (eq (overlay-buffer ov) (window-buffer window))
+    (with-current-buffer (overlay-buffer ov)
+      (if (eq (overlay-get ov 'preview-state) 'active)
+         (setq preview-last-location
+               (set-marker (or preview-last-location (make-marker))
+                           (window-point window)))
+       (when (and
+              (markerp preview-last-location)
+              (eq (overlay-buffer ov) (marker-buffer preview-last-location))
+              (< (overlay-start ov) preview-last-location)
+              (> (overlay-end ov) preview-last-location))
+         (set-window-point window preview-last-location))))))
+      
+(defun preview-move-point ()
+  "Move point out of fake-intangible areas."
+  (preview-check-changes)
+  (let* (newlist (pt (point)) (lst (overlays-at pt)) distance)
+    (setq preview-temporary-opened
+         (dolist (ov preview-temporary-opened newlist)
+           (and (overlay-buffer ov)
+                (eq (overlay-get ov 'preview-state) 'inactive)
+                (if (and (eq (overlay-buffer ov) (current-buffer))
+                         (or (<= pt (overlay-start ov))
+                             (>= pt (overlay-end ov))))
+                    (preview-toggle ov t)
+                  (push ov newlist)))))
+    (when lst
+      (if (or disable-point-adjustment
+             global-disable-point-adjustment
+             (preview-auto-reveal-p
+              preview-auto-reveal
+              (setq distance
+                    (and (eq (marker-buffer preview-marker)
+                             (current-buffer))
+                         (- pt (marker-position preview-marker))))))
+         (preview-open-overlays lst)
+       (while lst
+         (setq lst
+               (if (and
+                    (eq (overlay-get (car lst) 'preview-state) 'active)
+                    (> pt (overlay-start (car lst))))
+                   (overlays-at
+                    (setq pt (if (and distance (< distance 0))
+                                 (overlay-start (car lst))
+                               (overlay-end (car lst)))))
+                 (cdr lst))))
+       (goto-char pt)))))
+
+(defun preview-open-overlays (list &optional pos)
+  "Open all previews in LIST, optionally restricted to enclosing POS."
+  (dolist (ovr list)
+    (when (and (eq (overlay-get ovr 'preview-state) 'active)
+              (or (null pos)
+                  (and
+                   (> pos (overlay-start ovr))
+                   (< pos (overlay-end ovr)))))
+      (preview-toggle ovr)
+      (push ovr preview-temporary-opened))))
+
+(defadvice replace-highlight (before preview)
+  "Make `query-replace' open preview text about to be replaced."
+  (preview-open-overlays
+   (overlays-in (ad-get-arg 0) (ad-get-arg 1))))
+
+(defcustom preview-query-replace-reveal t
+  "*Make `query-replace' autoreveal previews."
+  :group 'preview-appearance
+  :type 'boolean
+  :require 'preview
+  :set (lambda (symbol value)
+        (set-default symbol value)
+        (if value
+            (ad-enable-advice 'replace-highlight 'before 'preview)
+          (ad-disable-advice 'replace-highlight 'before 'preview))
+        (ad-activate 'replace-highlight))
+  :initialize #'custom-initialize-reset)
+
+;; Check whether the four-argument form of `face-attribute' exists.
+;; If not, we will get a `wrong-number-of-arguments' error thrown.
+;; Use `defun' instead of `defsubst' here so that the decision may be
+;; reverted at load time if you are compiling with one Emacs and using
+;; another.
+(if (condition-case nil
+       (progn
+         (face-attribute 'default :height nil nil)
+         t)
+      (wrong-number-of-arguments nil))
+
+    (defun preview-inherited-face-attribute (face attribute &optional inherit)
+      "Fetch face attribute while adhering to inheritance.
+This searches FACE for an ATTRIBUTE, using INHERIT
+for resolving unspecified or relative specs.  See the fourth
+argument of function `face-attribute' for details."
+      (face-attribute face attribute nil inherit))
+
+  (defun preview-inherited-face-attribute (face attribute &optional inherit)
+    "Fetch face attribute while adhering to inheritance.
+This searches FACE for an ATTRIBUTE.  If it is 'unspecified,
+first inheritance is consulted (if INHERIT is non-NIL), then
+INHERIT is searched if it is a face or a list of faces.
+Relative specs are evaluated recursively until they get absolute or
+are not resolvable.  Relative specs are float values."
+    (let ((value (face-attribute face attribute)))
+      (when inherit
+       (setq inherit
+             (append
+              (let ((ancestors (face-attribute face :inherit)))
+                (cond ((facep ancestors) (list ancestors))
+                      ((consp ancestors) ancestors)))
+              (cond ((facep inherit) (list inherit))
+                    ((consp inherit) inherit)))))
+      (cond ((null inherit) value)
+           ((floatp value)
+            (let ((avalue
+                   (preview-inherited-face-attribute
+                    (car inherit) attribute (or (cdr inherit) t))))
+              (cond ((integerp avalue)
+                     (round (* avalue value)))
+                    ((floatp avalue)
+                     (* value avalue))
+                    (t value))))
+           ((eq value 'unspecified)
+            (preview-inherited-face-attribute
+             (car inherit) attribute (or (cdr inherit) t)))
+           (t value)))))
+
+(defun preview-get-colors ()
+  "Return colors from the current display.
+Fetches the current screen colors and makes a vector
+of colors as numbers in the range 0..65535.
+Pure borderless black-on-white will return triple NIL.
+The fourth value is the transparent border thickness."
+  (let
+      ((bg (color-values (preview-inherited-face-attribute
+                         'preview-reference-face :background 'default)))
+       (fg (color-values (preview-inherited-face-attribute
+                         'preview-reference-face :foreground 'default)))
+       (mask (preview-get-heuristic-mask)))
+    (if (equal '(65535 65535 65535) bg)
+       (setq bg nil))
+    (if (equal '(0 0 0) fg)
+       (setq fg nil))
+    (unless (and (numberp preview-transparent-border)
+                (consp mask) (integerp (car mask)))
+      (setq mask nil))
+    (vector bg fg mask preview-transparent-border)))
+
+(defmacro preview-mark-active ()
+  "Return t if the mark is active."
+  'mark-active)
+
+(defun preview-import-image (image)
+  "Convert the printable IMAGE rendition back to an image."
+  (cond ((stringp image)
+        (propertize image 'face 'preview-face))
+       ((eq (car image) 'image)
+        image)
+       (t
+        (preview-create-icon-1 (nth 0 image)
+                               (nth 1 image)
+                               (nth 2 image)
+                               (if (< (length image) 4)
+                                   (preview-get-heuristic-mask)
+                                 (nth 3 image))))))
+
+(defsubst preview-supports-image-type (imagetype)
+  "Check if IMAGETYPE is supported."
+  (image-type-available-p imagetype))
+
+(provide 'prv-emacs)
+;;; prv-emacs.el ends here
diff --git a/packages/auctex/style/.nosearch b/packages/auctex/style/.nosearch
new file mode 100644 (file)
index 0000000..aa31332
--- /dev/null
@@ -0,0 +1 @@
+;; AUCTeX style/ and auto/ directories should not appear in load path.
diff --git a/packages/auctex/style/CJK.el b/packages/auctex/style/CJK.el
new file mode 100644 (file)
index 0000000..fa285bd
--- /dev/null
@@ -0,0 +1,93 @@
+;;; CJK.el --- AUCTeX style for the CJK package.
+
+;; Copyright (C) 2009 Free Software Foundation, Inc.
+
+;; Author: Ralf Angeli <angeli@caeruleus.net>
+;; Maintainer: auctex-devel@gnu.org
+;; Created: 2009-01-04
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file adds support for the CJK package, version 4.8.0
+;; (22-May-2008).
+
+;;; Code:
+
+(defvar LaTeX-CJK-package-options
+  '("lowercase" "global" "local" "active" "encapsulated")
+  "Package options for the CJK package.")
+
+(defvar LaTeX-CJK-enc-list
+  '("Bg5" "Bg5+" "HK" "GB" "GBt" "GBK" "JIS" "JIS2" "SJIS" "KS" "UTF8" "CNS1"
+    "CNS2" "CNS3" "CNS4" "CNS5" "CNS6" "CNS7" "CEFX" "CEFY")
+  "List of encodings supported by the CJK package.")
+
+(defun LaTeX-env-CJK (env)
+  "Prompt for the arguments of ENV and insert it.
+The function can be used for CJK and CJK* environments."
+  (LaTeX-insert-environment
+   env
+   (concat
+    (let ((font-enc (read-string "(Optional) Font encoding: ")))
+      (unless (zerop (length font-enc)) (format "[%s]" font-enc)))
+    (format "{%s}" (completing-read "Encoding: "
+                                   (mapcar 'list LaTeX-CJK-enc-list)))
+    (format "{%s}" (read-string "Font family: ")))))
+
+(TeX-add-style-hook
+ "CJK"
+ (lambda ()
+   ;; New symbols
+   (TeX-add-symbols
+    '("CJKencfamily" ["Font encoding"] "Encoding" "Font family")
+    '("CJKchar" ["Encoding"] "First byte" "Second byte")
+    '("CJKcaption" 1)
+    '("CJKfamily" 1)
+    '("CJKfontenc" "Encoding" "Font encoding")
+    '("CJKenc" 1)
+    '("Unicode" "First byte" "Second byte")
+    '("CJKsymbols" 2)
+    '("CJKsymbol" 1)
+    "CJKbold"
+    "CJKnormal"
+    "CJKboldshift"
+    "CJKCJKchar"
+    "CJKhangulchar"
+    "CJKlatinchar"
+    "CJKhwkatakana"
+    "CJKnohwkatakana"
+    "CJKglue"
+    "CJKtolerance"
+    "CJKtilde"
+    "nbs"
+    "standardtilde"
+    "CJKspace"
+    "CJKnospace"
+    "CJKindent"
+    '("CJKaddEncHook" 2)
+    "CJKkern"
+    "CJKverbatim")
+   ;; New environments
+   (LaTeX-add-environments
+    '("CJK" LaTeX-env-CJK)
+    '("CJK*" LaTeX-env-CJK))))
+
+;;; CJK.el ends here
diff --git a/packages/auctex/style/CJKutf8.el b/packages/auctex/style/CJKutf8.el
new file mode 100644 (file)
index 0000000..ea3c2e3
--- /dev/null
@@ -0,0 +1,38 @@
+;;; CJKutf8.el --- AUCTeX style for the CJKutf8 package.
+
+;; Copyright (C) 2009 Free Software Foundation, Inc.
+
+;; Author: Ralf Angeli <angeli@caeruleus.net>
+;; Maintainer: auctex-devel@gnu.org
+;; Created: 2009-01-04
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file adds support for the CJKutf8 package.
+
+;;; Code:
+
+(TeX-add-style-hook
+ "CJKutf8"
+ (lambda ()
+   (TeX-run-style-hooks "CJK")))
+
+;;; CJKutf8.el ends here
diff --git a/packages/auctex/style/MinionPro.el b/packages/auctex/style/MinionPro.el
new file mode 100644 (file)
index 0000000..7151c36
--- /dev/null
@@ -0,0 +1,71 @@
+;;; MinionPro.el -- AUCTeX style for MinionPro.sty
+
+;; Copyright (C) 2005 Free Software Foundation, Inc.
+
+;; Author: Mark Trettin <Mark.Trettin@gmx.de>
+;; Maintainer: auctex-devel@gnu.org
+;; Created: 2005-11-26
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary: 
+
+;; This file adds support for `MinionPro.sty' (v2.0). 
+
+;;; Code
+
+(TeX-add-style-hook
+ "MinionPro"
+ (lambda ()
+   (TeX-add-symbols
+    ;; New symbols
+    '("figureversion"
+      (TeX-arg-eval completing-read "Figure style: "
+                   '(("text") ("osf")
+                     ("lining") ("lf")
+                     ("tabular") ("tab")
+                     ("proportional") ("prop"))))
+    '("smallfrac" "Numerator" "Denominator")
+    '("slantfrac" "Numerator" "Denominator")
+    ;; IMHO they should be added to the other \text.. and \..shape commands
+    '("textsw" 1)
+    '("textssc" 1)
+    "sscshape"
+    "swshape")
+   ;; Run style hook for amsmath which is loaded via MnSymbol
+   (TeX-run-style-hooks "amsmath")
+   ;; Fontification
+   (when (and (featurep 'font-latex)
+             (eq TeX-install-font-lock 'font-latex-setup))
+     (font-latex-add-keywords '(("smallfrac" "{{")
+                               ("slantfrac" "{{")
+                               ("textsw" "{")
+                               ("textssc" "{"))
+                             'textual)
+     (font-latex-add-keywords '(("figureversion" "{")) 'variable))))
+
+(defvar LaTeX-MinionPro-package-options
+  '("smallfamily" "medfamily" "fullfamily" "noopticals" "opticals"
+    "slides" "textosf" "mathosf" "osf" "textlf" "mathlf" "lf"
+    "mathtabular" "mnsy" "cmsy" "swash" "abx" "amsbb" "fourierbb"
+    "lucidabb" "mixedgreek" "italicgreek" "frenchmath" "minionint"
+    "footnotefigures")
+"Package options for the MinionPro package.")
+
+;;; MinionPro.el ends here
diff --git a/packages/auctex/style/alltt.el b/packages/auctex/style/alltt.el
new file mode 100644 (file)
index 0000000..a266a88
--- /dev/null
@@ -0,0 +1,55 @@
+;;; alltt.el --- AUCTeX style for `alltt.sty'
+
+;; Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+
+;; Author: Ralf Angeli <angeli@iwi.uni-sb.de>
+;; Maintainer: auctex-devel@gnu.org
+;; Created: 2004-04-30
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file adds support for `alltt.sty'.
+
+;;; Code:
+
+(TeX-add-style-hook
+ "alltt"
+ (lambda ()
+   (LaTeX-add-environments "alltt")
+   (make-local-variable 'LaTeX-indent-environment-list)
+   (add-to-list 'LaTeX-indent-environment-list
+               '("alltt" current-indentation))
+   (make-local-variable 'LaTeX-verbatim-regexp)
+   (setq LaTeX-verbatim-regexp (concat LaTeX-verbatim-regexp "\\|alltt"))
+   (add-to-list 'LaTeX-verbatim-environments-local "alltt")
+   ;; Fontification
+   (when (and (featurep 'font-latex)
+             (eq TeX-install-font-lock 'font-latex-setup))
+     ;; For syntactic fontification, e.g. verbatim constructs.
+     (font-latex-set-syntactic-keywords)
+     ;; Tell font-lock about the update.
+     (setq font-lock-set-defaults nil)
+     (font-lock-set-defaults))))
+
+(defvar LaTeX-alltt-package-options nil
+  "Package options for the alltt package.")
+
+;;; alltt.el ends here
diff --git a/packages/auctex/style/alphanum.el b/packages/auctex/style/alphanum.el
new file mode 100644 (file)
index 0000000..43ce10e
--- /dev/null
@@ -0,0 +1,99 @@
+;;; alphanum.el --- AUCTeX style for `alphanum.sty'
+
+;; Copyright (C) 2004 Free Software Foundation, Inc.
+
+;; Author: Frank Küster <frank@kuesterei.ch>
+;; Maintainer: auctex-devel@gnu.org
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This is file alphanum.el, which makes AUCTeX usable with jura.cls
+;; and its style file alphanum.sty.
+;;
+;; Contributed by Frank Küster <frank@kuesterei.ch>. The code for
+;; reftex has been written by Carsten Dominik, the maintainer of
+;; reftex, but all the errors are mine.
+
+;;; Code:
+
+
+(defun TeX-arg-none (arg)
+  (insert " "))
+
+(defun reftex-get-section-level-alphanum ()
+  (save-excursion                      ; preserve position
+    (save-match-data            ; preserve matching data (important!)
+      ;; Go back to the beginning of the sectioning command
+      (goto-char (match-beginning 0))
+      ;; Define an initial level number, depending on the current macro.
+      (let* ((macro (reftex-match-string 3))     ; "toc" or "sub"
+            (lev (cond ((string= macro "toc") 1) ; min level for "toc"
+                       ((string= macro "sub") 2) ; min level for "sub"
+                       (t 0)))
+            ;; Make a regular expression which will match sectioning commands
+            ;; and the levelup macro.
+            (re (concat "\\(^[^%]*\\\\levelup\\>\\)"
+                        "\\|"
+                        "\\(" reftex-section-regexp "\\)")))
+       ;; Now parse backwards for all sectioning and levelup macros,
+       ;; and keep track of the relative level changes.
+       (while (re-search-backward re nil t)
+         (cond
+          ((match-beginning 1)
+           ;; levelup matched, reduce level counter
+           (setq lev (1- lev)))
+          ((string= (reftex-match-string 4) "toc")
+           ;; a toc entry, nothing changes
+           )
+          ((string= (reftex-match-string 4) "sub")
+           ;; a sub entry, increase level counter
+           (setq lev (1+ lev)))))
+       ;; return the level
+       lev))))
+
+(TeX-add-style-hook
+ "alphanum"
+ (lambda ()
+   (LaTeX-largest-level-set "chapter")
+   (TeX-add-symbols '("levelup" TeX-arg-none))
+   (make-local-variable 'LaTeX-section-list)
+   (LaTeX-section-list-add-locally
+    '(("part" 0)
+      ;; the levels don't make sense with alphanum, I randomly chose 0...
+      ("toc" 0)
+      ("sub" 0)) t)
+   (setq LaTeX-section-label
+        '(("part" . "part:")
+          ("toc" . "sec:")
+          ("sub" . "sec:")))
+   ;;
+   ;; ****************** reftex part ******************
+   ;; this won't work in multifile documents, but at least there is
+   ;; something.
+
+   (if (fboundp 'reftex-add-section-levels)
+       (reftex-add-section-levels
+       '(("toc" .  reftex-get-section-level-alphanum)
+         ("sub" .  reftex-get-section-level-alphanum))))))
+
+;; Local Variables:
+;; coding: iso-8859-1
+;; End:
diff --git a/packages/auctex/style/amsart.el b/packages/auctex/style/amsart.el
new file mode 100644 (file)
index 0000000..51a2902
--- /dev/null
@@ -0,0 +1,10 @@
+;;; amsart.el --- Style hook for the AMS-LaTeX article document class.
+
+;;; Code:
+
+(TeX-add-style-hook "amsart"
+ (function
+  (lambda ()
+    (TeX-run-style-hooks "amsmath" "amsthm"))))
+
+;;; amsart.el ends here.
diff --git a/packages/auctex/style/amsbook.el b/packages/auctex/style/amsbook.el
new file mode 100644 (file)
index 0000000..ccbc84e
--- /dev/null
@@ -0,0 +1,10 @@
+;;; amsbook.el --- Style hook for the AMS-LaTeX book document class.
+
+;;; Code:
+
+(TeX-add-style-hook "amsbook"
+ (function
+  (lambda ()
+    (TeX-run-style-hooks "amsmath" "amsthm"))))
+
+;;; amsbook.el ends here.
diff --git a/packages/auctex/style/amsbsy.el b/packages/auctex/style/amsbsy.el
new file mode 100644 (file)
index 0000000..dd2605c
--- /dev/null
@@ -0,0 +1,18 @@
+;;; amsbsy.el --- Style hook for the AMS-LaTeX amsbsy package.
+;;;
+;;; AUTHOR: Carsten Dominik <dominik@strw.leidenuniv.nl>
+
+;;; Code:
+
+(TeX-add-style-hook "amsbsy"
+ (function
+  (lambda ()
+    (TeX-add-symbols
+     '("boldsymbol" "Symbol")
+     '("pmb"        "Symbol")
+     ))))
+
+(defvar LaTeX-amsbsy-package-options nil
+  "Package options for the amsbsy package.")
+
+;;; amsbsy.el ends here.
diff --git a/packages/auctex/style/amsmath.el b/packages/auctex/style/amsmath.el
new file mode 100644 (file)
index 0000000..8f16425
--- /dev/null
@@ -0,0 +1,181 @@
+;;; amsmath.el --- Style hook for the AMS-LaTeX amsmath package.
+
+;; Copyright (C) 2002, 2005  Free Software Foundation, Inc.
+;; FIXME: What about the copyright for <= 2001?
+
+;; Author: Carsten Dominik <dominik@strw.leidenuniv.nl>
+;; Maintainer: auctex-devel@gnu.org
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This will also load the amstext, amsbsy and amsopn style files.
+
+;;; Code:
+
+(TeX-add-style-hook "amsmath"
+ (function
+  (lambda ()
+
+    (LaTeX-add-environments
+     '("align"      LaTeX-env-label)
+     '("gather"     LaTeX-env-label)
+     '("flalign"    LaTeX-env-label)
+     '("multline"   LaTeX-env-label)
+     '("alignat"    LaTeX-amsmath-env-alignat)
+     '("alignat*"   LaTeX-amsmath-env-alignat)
+     '("xalignat"   LaTeX-amsmath-env-alignat)
+     '("xalignat*"  LaTeX-amsmath-env-alignat)
+     '("xxalignat"  LaTeX-amsmath-env-alignat)
+     '("aligned"    LaTeX-amsmath-env-aligned)
+     '("gathered"   LaTeX-amsmath-env-aligned)
+     "align*" "gather*" "flalign*" "multline*" "equation*"
+     "split"
+     "cases"
+     "matrix" "smallmatrix" "pmatrix" "bmatrix" "Bmatrix" "vmatrix" "Vmatrix"
+     "subequations"
+     '("subarray" "Alignment"))
+
+    (TeX-add-symbols
+     '("eqref" TeX-arg-ref)
+     '("numberwithin" TeX-arg-counter "Section level")
+     '("raisetag" "Dimension")
+     '("intertext" t)
+     '("hdotsfor" ["Stretch"] "Number of columns to cover")
+     '("xleftarrow" ["Below"] "Above")
+     '("xrightarrow" ["Below"] "Above")
+     '("overset" "Accent symbol" "Symbol")
+     '("underset" "Accent symbol" "Symbol")
+     '("dfrac" 2)
+     '("tfrac" 2)
+     '("binom" 2)
+     '("dbinom" 2)
+     '("tbinom" 2)
+     '("genfrac" "Left delimiter" "Right delimiter" "Thickness"
+       "Mathstyle" 2)
+     '("cfrac" ["position (l or r)"] t)
+     '("smash" ["where (t or b)"] t)
+     '("sideset" "Left" "Right")
+     '("tag" "(Tag)")
+     '("tag*" "Tag")
+     '("displaybreak" ["Weight (0..4)"])
+     '("allowdisplaybreaks" ["Weight (1..4)"])
+     '("substack" t)
+     '("leftroot" "Push root index left by")
+     '("uproot" "Push root index upward by")
+     '("boxed" t)
+     '("mspace" t)
+     '("mod" t)
+     '("pmod" t)
+     '("pod" t)
+     '("overleftrightarrow" t)
+     '("underleftarrow" t)
+     '("underrightarrow" t)
+     '("underleftrightarrow" t)
+     '("dddot" t)
+     '("ddddot" t)
+     "bmod" "notag"
+     "dots" "dotsb" "dotsc" "dotsi" "dotsm" "dotso" "nobreakdash" 
+     "lvert" "rvert" "lVert" "rVert" 
+     "iint" "iiint" "iiiint" "idotsint"
+     )
+    
+    (setq  LaTeX-item-list 
+          (append '(("split"    . LaTeX-item-equation)
+                    ("multline" . LaTeX-item-equation)
+                    ("multline*" . LaTeX-item-equation)
+                    ("gather"   . LaTeX-item-equations)
+                    ("gather*"  . LaTeX-item-equation)
+                    ("gathered" . LaTeX-item-equation)
+                    ("align"    . LaTeX-item-equations)
+                    ("align*"   . LaTeX-item-equation)
+                    ("aligned"  . LaTeX-item-equation)
+                    ("alignat"  . LaTeX-item-equations)
+                    ("alignat*" . LaTeX-item-equation)
+                    ("xalignat"  . LaTeX-item-equations)
+                    ("xalignat*" . LaTeX-item-equation)
+                    ("xxalignat" . LaTeX-item-equation)
+                    ("flalign"  . LaTeX-item-equations)
+                    ("flalign*" . LaTeX-item-equation)
+                    ("matrix" .  LaTeX-item-equation)
+                    ("pmatrix" .  LaTeX-item-equation)
+                    ("bmatrix" .  LaTeX-item-equation)
+                    ("Bmatrix" .  LaTeX-item-equation)
+                    ("vmatrix" .  LaTeX-item-equation)
+                    ("Vmatrix" .  LaTeX-item-equation)
+                    ("cases"    . LaTeX-item-equation))
+                  LaTeX-item-list))
+
+    ;; When `LaTeX-amsmath-label' is nil, use value of LaTeX-equation-label:
+    (unless LaTeX-amsmath-label
+      (setq LaTeX-amsmath-label LaTeX-equation-label))
+
+    (setq LaTeX-label-alist
+         (append '(("align"      . LaTeX-amsmath-label)
+                   ("alignat"    . LaTeX-amsmath-label)
+                   ("xalignat"   . LaTeX-amsmath-label)
+                   ("multline"    . LaTeX-amsmath-label)
+                   ("flalign"    . LaTeX-amsmath-label)
+                   ("gather"     . LaTeX-amsmath-label))
+                 LaTeX-label-alist))
+
+    ;; amsmath includes amstext, amsbsy, & amsopn.
+    ;; So we run their hooks, too.
+    (TeX-run-style-hooks "amstext" "amsbsy" "amsopn")
+
+    ;; If RefTeX is loaded, make it recognize the amsmath environments.
+    (when (fboundp 'reftex-add-to-label-alist)
+      (reftex-add-to-label-alist '(AMSTeX))))))
+
+(defun LaTeX-amsmath-env-alignat (env)
+  (let ((ncols (read-string "Number of columns: ")))
+    (LaTeX-insert-environment env (concat TeX-grop ncols TeX-grcl))
+    (and (not (string= "xxalignat" env))
+        (not (string= "*" (substring env -1)))
+        (LaTeX-label env)
+        (newline-and-indent))))
+
+(defun LaTeX-amsmath-env-aligned (env)
+  (let ((where (read-string "(optional) Vertical position (t or b): ")))
+    (if (string= where "")
+       (setq where "")
+      (setq where (concat "[" where "]")))
+    (LaTeX-insert-environment env where)))
+
+(defun LaTeX-item-equation ()
+  (end-of-line 0)
+  (just-one-space)
+  (insert "\\\\")
+  (forward-line 1)
+  (indent-according-to-mode))
+
+(defun LaTeX-item-equations ()
+  (LaTeX-item-equation)
+  (let ((environment (LaTeX-current-environment 1)))
+    (and (LaTeX-label environment)
+        (newline-and-indent))))
+
+(defvar LaTeX-amsmath-package-options '("intlimits" "nointlimits"
+                                       "sumlimits" "nosumlimits"
+                                       "namelimits" "nonamelimits"
+                                       "leqno" "reqno" "centertags"
+                                       "tbtags" "cmex10" "fleqn" "?")
+    "Package options for the amsmath package.")
+
+;;; amsmath.el ends here.
diff --git a/packages/auctex/style/amsopn.el b/packages/auctex/style/amsopn.el
new file mode 100644 (file)
index 0000000..1e875d8
--- /dev/null
@@ -0,0 +1,19 @@
+;;; amsopn.el --- Style hook for the AMS-LaTeX amsopn package.
+;;;
+;;; AUTHOR: Carsten Dominik <dominik@strw.leidenuniv.nl>
+
+;;; Code:
+
+(TeX-add-style-hook "amsopn"
+ (function
+  (lambda ()
+    (TeX-add-symbols
+     '("DeclareMathOperator"  "Operator (with \\)" "Text")
+     '("DeclareMathOperator*" "Operator (with \\)" "Text")
+     '("operatorname" t)
+     '("operatorname*" t)))))
+
+(defvar LaTeX-amsopn-package-options '("namelimits" "nonamelimits")
+  "Package options for the amsopn package.")
+
+;;; amsopn.el ends here.
diff --git a/packages/auctex/style/amstex.el b/packages/auctex/style/amstex.el
new file mode 100644 (file)
index 0000000..347d72f
--- /dev/null
@@ -0,0 +1,60 @@
+;;; amstex.el --- AMS-LaTeX support.
+
+;; Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+
+;; Maintainer: auctex-devel@gnu.org
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file is only needed when using AMS-LaTeX 1.1 and LaTeX 2.09.
+;; In later versions of LaTeX and AMS-LaTeX this file is never used,
+;; because there is no longer a class or package name amstex.
+;;
+;; As far as AUCTeX is concerned, the old amstex style is fairly
+;; similar to the new amsmath package. So we will just run that hook
+;; here.
+;;
+;; amsmath.el should not be loaded, if an AMS-TeX (in contrast to
+;; AMS-LaTeX) file is opened.  The commands defined in amsmath.el
+;; mostly have no meaning in this case and errors about unknown
+;; variables or functions may occur due to latex.el possibly not being
+;; loaded.
+
+;;; Code:
+
+(TeX-add-style-hook
+ "amstex"
+ (function
+  (lambda ()
+    (unless (memq major-mode '(plain-tex-mode ams-tex-mode))
+      (TeX-run-style-hooks "amsmath")))))
+
+(defvar LaTeX-amstex-package-options '("noamsfonts" "psamsfonts" 
+                                      "intlimits" "nointlimits"
+                                      "sumlimits" "nosumlimits"
+                                      "namelimits" "nonamelimits"
+                                      "leqno" "reqno" "centertags"
+                                      "tbtags" "fleqn" "righttag"
+                                      "ctagsplt" "intlim" "nosumlim"
+                                      "nonamelm")
+    "Package options for the amstex package.")
+
+;;; amstex.el ends here.
diff --git a/packages/auctex/style/amstext.el b/packages/auctex/style/amstext.el
new file mode 100644 (file)
index 0000000..a9aa855
--- /dev/null
@@ -0,0 +1,16 @@
+;;; amstext.el --- Style hook for the AMS-LaTeX amstext package.
+;;;
+;;; AUTHOR: Carsten Dominik <dominik@strw.leidenuniv.nl>
+
+;;; Code:
+
+(TeX-add-style-hook "amstext"
+ (function
+  (lambda ()
+    (TeX-add-symbols
+     '("text" t)))))
+
+(defvar LaTeX-amstext-package-option nil
+  "Package options for the amstext package.")
+
+;;; amstext.el ends here.
diff --git a/packages/auctex/style/amsthm.el b/packages/auctex/style/amsthm.el
new file mode 100644 (file)
index 0000000..9903040
--- /dev/null
@@ -0,0 +1,53 @@
+;;; amsthm.el --- Style hook for the AMS-LaTeX amsthm package.
+
+;; Copyright (C) 1997 Free Software Foundation, Inc.
+
+;; Author: Carsten Dominik <dominik@strw.leidenuniv.nl>
+;; Maintainer: auctex-devel@gnu.org
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Code:
+
+(TeX-add-style-hook "amsthm"
+ (function
+  (lambda ()
+    (LaTeX-add-environments
+     '("proof" (lambda (env &rest ignore)
+                (LaTeX-insert-environment 
+                 env
+                 (let ((heading (read-string "(optional) Heading: ")))
+                   (if (string= heading "")
+                       ""
+                     (format "[%s]" heading))))))
+     )
+    (TeX-add-symbols
+     '("newtheorem" "Environment name" ["Share numbering with"] "Heading"
+       ["Number subordinated in each"])
+     '("newtheorem*" "Environment name" "Heading")
+     '("theoremstyle" LaTeX-amsthm-complete-theoremstyle)
+     ))))
+
+(defun LaTeX-amsthm-complete-theoremstyle (&rest ignore)
+  (insert TeX-grop
+         (completing-read  "Style: " '(("plain" . nil)
+                                       ("definition" . nil)
+                                       ("remark" . nil)))
+         TeX-grcl))
+
+;;; amsthm.el ends here
diff --git a/packages/auctex/style/article.el b/packages/auctex/style/article.el
new file mode 100644 (file)
index 0000000..937fa47
--- /dev/null
@@ -0,0 +1,12 @@
+;;; article.el - Special code for article style.
+
+;; $Id: article.el,v 1.4 2005/03/17 10:02:06 angeli Exp $
+
+;;; Code:
+
+(TeX-add-style-hook
+ "article"
+ (lambda ()
+   (LaTeX-largest-level-set "section")))
+
+;;; article.el ends here
diff --git a/packages/auctex/style/austrian.el b/packages/auctex/style/austrian.el
new file mode 100644 (file)
index 0000000..13f28a8
--- /dev/null
@@ -0,0 +1,39 @@
+;;; austrian.el --- AUCTeX style for the `austrian' babel option.
+
+;; Copyright (C) 2009 Free Software Foundation, Inc.
+
+;; Author: Ralf Angeli <angeli@caeruleus.net>
+;; Maintainer: auctex-devel@gnu.org
+;; Created: 2009-12-28
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; Set up AUCTeX for editing Austrian text in connection with the
+;; `austrian' babel option.
+
+;;; Code:
+
+(TeX-add-style-hook
+ "austrian"
+ (lambda ()
+   (TeX-run-style-hooks "german")))
+
+;;; austrian.el ends here
diff --git a/packages/auctex/style/babel.el b/packages/auctex/style/babel.el
new file mode 100644 (file)
index 0000000..3242d0e
--- /dev/null
@@ -0,0 +1,108 @@
+;;; babel.el --- AUCTeX style for `babel.sty'
+
+;; Copyright (C) 2005 Free Software Foundation, Inc.
+
+;; Author: Ralf Angeli <angeli@iwi.uni-sb.de>
+;; Maintainer: auctex-devel@gnu.org
+;; Created: 2005-05-29
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file adds support for `babel.sty'.
+
+;;; Code:
+
+(defvar LaTeX-babel-language-list
+  '("acadian" "afrikaans" "american" "austrian""bahasa" "basque" "brazil"
+    "brazilian" "breton" "british" "bulgarian" "canadian" "canadien"
+    "catalan" "croatian" "czech" "danish" "dutch" "english" "esperanto"
+    "estonian" "finnish" "francais" "frenchb" "french" "galician"
+    "german" "germanb" "greek" "polutonikogreek" "hebrew" "hungarian"
+    "icelandic" "irish" "italian" "latin" "lowersorbian" "magyar"
+    "naustrian" "ngerman" "norsk" "samin" "nynorsk" "polish" "portuges"
+    "portuguese" "romanian" "russian" "scottish" "serbian" "slovak"
+    "slovene" "spanish" "swedish" "turkish" "ukrainian" "uppersorbian"
+    "welsh" "UKenglish" "USenglish")
+  "List of languages supported by the babel LaTeX package.")
+
+(if (fboundp 'defvaralias)
+    (defvaralias 'LaTeX-babel-package-options 'LaTeX-babel-language-list)
+  (defvar LaTeX-babel-package-options LaTeX-babel-language-list
+    "Package options for the babel package."))
+
+(defun LaTeX-babel-active-languages ()
+  "Return a list of languages used in the document."
+  (let (active-languages)
+    (dolist (elt LaTeX-babel-language-list)
+      (when (member elt TeX-active-styles)
+       (add-to-list 'active-languages (list elt))))
+    active-languages))
+
+(defun TeX-arg-babel-lang (optional &optional prompt)
+  "Prompt for a language with completion and insert it as an argument."
+  (TeX-argument-insert
+   (completing-read "Language: " (LaTeX-babel-active-languages)) nil))
+
+(defun LaTeX-env-babel-lang (env)
+  "Prompt for a language and insert it as an argument of ENV."
+  (LaTeX-insert-environment
+   env (format "{%s}" (completing-read "Language: "
+                                      (LaTeX-babel-active-languages)))))
+
+(TeX-add-style-hook
+ "babel"
+ (lambda ()
+   ;; New symbols
+   (TeX-add-symbols
+    '("selectlanguage" TeX-arg-babel-lang)
+    '("foreignlanguage" TeX-arg-babel-lang t)
+    "languagename"
+    '("iflanguage" TeX-arg-babel-lang t nil)
+    '("useshorthands" t)
+    '("defineshorthand" t nil)
+    '("aliasshorthand" t nil)
+    '("languageshorthands" TeX-arg-babel-lang)
+    '("shorthandon" t)
+    '("shorthandoff" t)
+    '("languageattribute" TeX-arg-babel-lang t))
+   ;; New environments
+   (LaTeX-add-environments
+    '("otherlanguage" LaTeX-env-babel-lang)
+    '("otherlanguage*" LaTeX-env-babel-lang)
+    '("hyphenrules" LaTeX-env-babel-lang))
+   ;; Fontification
+   (when (and (featurep 'font-latex)
+             (eq TeX-install-font-lock 'font-latex-setup))
+     (font-latex-add-keywords '(("selectlanguage" "{")
+                               ("foreignlanguage" "{{")
+                               ("iflanguage" "{{{")
+                               ("languagename" "")
+                               ("useshorthands" "{")
+                               ("languageshorthands" "{")
+                               ("shorthandon" "{")
+                               ("shorthandoff" "{"))
+                             'function)
+     (font-latex-add-keywords '(("defineshorthand" "{{")
+                               ("aliasshorthand" "{{")
+                               ("languageattribute" "{{"))
+                             'variable))))
+
+;;; babel.el ends here
diff --git a/packages/auctex/style/beamer.el b/packages/auctex/style/beamer.el
new file mode 100644 (file)
index 0000000..7b911cd
--- /dev/null
@@ -0,0 +1,334 @@
+;;; beamer.el --- AUCTeX style for the latex-beamer class
+
+;; Copyright (C) 2003, 2004, 2005,2008 Free Software Foundation
+
+;; Author: Thomas Baumann <thomas.baumann@ch.tum.de>
+;; Created: 2003-12-20
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file adds support for the latex-beamer class.
+
+;;; Code:
+
+(defun LaTeX-beamer-after-insert-env (env start end)
+  "Do beamer-specific stuff after the insertion of an environment."
+  ;; Add `fragile' as an optional argument to the frame environment if
+  ;; a verbatim environment is inserted.
+  (when (and (TeX-member env (LaTeX-verbatim-environments) 'string-equal)
+            (save-excursion
+              (goto-char start)
+              (string-equal (LaTeX-current-environment) "frame")))
+    (save-excursion
+      (when (re-search-backward "\\\\begin[ \t]*{frame}" nil t)
+       (let ((end-of-begin (match-end 0)))
+         (goto-char end-of-begin)
+         (while (forward-comment 1))
+         (if (eq (char-after) (string-to-char LaTeX-optop))
+             (progn
+               (forward-char)
+               (insert "fragile")
+               (unless (looking-at (concat "[ \t]*" LaTeX-optcl))
+                 (insert ",")))
+           (goto-char end-of-begin)
+           (insert "[fragile]")))))))
+
+(TeX-add-style-hook
+ "beamer"
+ (lambda ()
+   (add-hook 'LaTeX-after-insert-env-hooks 'LaTeX-beamer-after-insert-env nil t)
+
+   (unless LaTeX-beamer-section-labels-flag
+     (make-local-variable 'LaTeX-section-hook)
+     (setq LaTeX-section-hook
+          '(LaTeX-section-heading
+            LaTeX-section-title
+            LaTeX-section-section)))
+
+   (setq LaTeX-item-list
+        (append '(("itemize" . LaTeX-item-beamer)
+                  ("enumerate" . LaTeX-item-beamer))
+                LaTeX-item-list))
+
+   (LaTeX-paragraph-commands-add-locally "frametitle")
+
+   (TeX-add-symbols
+    '("alert" 1)
+    '("alt" TeX-arg-beamer-overlay-spec 2)
+    '("beamerbutton" 1)
+    '("beamergotobutton" 1)
+    '("beamerreturnbutton" 1)
+    '("beamerskipbutton" 1)
+    '("frame" TeX-arg-beamer-frametitle)
+    '("frametitle" 1)
+    '("hyperlink" TeX-arg-beamer-overlay-spec 2)
+    '("hyperlinkslideprev" TeX-arg-beamer-overlay-spec 1)
+    '("hyperlinkslidenext" TeX-arg-beamer-overlay-spec 1)
+    '("hyperlinkframestart" TeX-arg-beamer-overlay-spec 1)
+    '("hyperlinkframeend" TeX-arg-beamer-overlay-spec 1)
+    '("hyperlinkframestartnext" TeX-arg-beamer-overlay-spec 1)
+    '("hyperlinkframeendprev" TeX-arg-beamer-overlay-spec 1)
+    '("hyperlinkpresentationstart" TeX-arg-beamer-overlay-spec 1)
+    '("hyperlinkpresentationend" TeX-arg-beamer-overlay-spec 1)
+    '("hyperlinkappendixstart" TeX-arg-beamer-overlay-spec 1)
+    '("hyperlinkappendixend" TeX-arg-beamer-overlay-spec 1)
+    '("hyperlinkdocumentstart" TeX-arg-beamer-overlay-spec 1)
+    '("hyperlinkdocumentend" TeX-arg-beamer-overlay-spec 1)
+    '("hypertarget" TeX-arg-beamer-overlay-spec 2)
+    '("institute" 1)
+    '("invisible" TeX-arg-beamer-overlay-spec 1)
+    '("label" TeX-arg-beamer-overlay-spec 1)
+    '("logo" 1)
+    '("note" TeX-arg-beamer-note 1)
+    '("only" TeX-arg-beamer-overlay-spec 1)
+    '("onslide" TeX-arg-beamer-overlay-spec)
+    '("partpage")
+    '("pause")
+    '("structure" TeX-arg-beamer-overlay-spec 1)
+    '("temporal" TeX-arg-beamer-overlay-spec 3)
+    '("titlepage")
+    '("titlegraphic" 1)
+    '("uncover" TeX-arg-beamer-overlay-spec 1)
+    '("usetheme" LaTeX-arg-beamer-theme)
+    '("useinnertheme" LaTeX-arg-beamer-inner-theme)
+    '("useoutertheme" LaTeX-arg-beamer-outer-theme)
+    '("usecolortheme" LaTeX-arg-beamer-color-theme)
+    '("usefonttheme" LaTeX-arg-beamer-font-theme)
+    '("usetheme" LaTeX-arg-beamer-theme)
+    '("visible" TeX-arg-beamer-overlay-spec 1))
+
+   (LaTeX-add-environments
+    '("actionenv")
+    '("alertblock" 1)
+    '("beamerboxesrounded" 1)
+    '("block" 1)
+    '("column" "Width")
+    "columns"
+    "columnsonlytextwidth"
+    '("exampleblock" 1)
+    '("frame"  (lambda (env &rest ignore)
+                (let ((title (read-string "(Optional) Title: ")))
+                  (LaTeX-insert-environment env)
+                  (unless (zerop (length title))
+                    (save-excursion
+                      (LaTeX-find-matching-begin)
+                      (end-of-line)
+                      (LaTeX-newline)
+                      (insert (format "\\frametitle{%s}" title))
+                      ;; This works because \frametitle is a
+                      ;; paragraph command.
+                      (backward-char)
+                      (LaTeX-fill-paragraph))))))
+    '("onlyenv" (lambda (env &rest ignore)
+                 (LaTeX-insert-environment
+                  env
+                  (let ((overlay (read-string "(Optional) Overlay: ")))
+                    (unless (zerop (length overlay))
+                      (format "<%s>" overlay))))))
+    '("overlayarea" "Area width" "Area height")
+    '("overprint"  (lambda (env &rest ignore)
+                    (LaTeX-insert-environment
+                     env
+                     (let ((width (read-string "(Optional) Area width: ")))
+                       (unless (zerop (length width))
+                         (format "[%s]" width))))))
+    "semiverbatim")
+
+   (make-local-variable 'LaTeX-indent-environment-list)
+   (add-to-list 'LaTeX-indent-environment-list
+               '("semiverbatim" current-indentation))
+   (make-local-variable 'LaTeX-verbatim-regexp)
+   (setq LaTeX-verbatim-regexp (concat LaTeX-verbatim-regexp "\\|semiverbatim"))
+   (add-to-list 'LaTeX-verbatim-environments-local "semiverbatim")
+
+   ;; Fontification
+   (when (and (featurep 'font-latex)
+             (eq TeX-install-font-lock 'font-latex-setup))
+     (font-latex-add-keywords '(("frametitle" "<[{")) 'slide-title)
+     ;; For syntactic fontification, e.g. verbatim constructs.
+     (font-latex-set-syntactic-keywords)
+     ;; Tell font-lock about the update.
+     (setq font-lock-set-defaults nil)
+     (font-lock-set-defaults))))
+
+(defun TeX-arg-beamer-overlay-spec (optional &optional prompt)
+  "Prompt for overlay specification." 
+  (let ((overlay (read-string "(Optional) Overlay: ")))
+    (unless (zerop (length overlay))
+      (insert "<" overlay ">"))
+    (indent-according-to-mode)))
+
+(defun TeX-arg-beamer-frametitle (optional &optional prompt)
+  "Prompt for the frametitle."
+  (let ((title (read-string "Title: ")))
+    (if (not (zerop (length title)))
+        (insert TeX-grop TeX-esc "frametitle" TeX-grop 
+               title TeX-grcl TeX-grcl)
+      (insert TeX-grop TeX-grcl))))
+
+(defun LaTeX-item-beamer ()
+  "Insert a new item with an optional overlay argument. You 
+can turn off the prompt for the overlay argument by setting 
+`LaTeX-beamer-item-overlay-flag' to nil. Calling the function
+with a prefix argument prompts for the overlay specification
+unconditionally."
+  (if (listp current-prefix-arg)
+      (setq current-prefix-arg (car current-prefix-arg))
+    current-prefix-arg)
+  (TeX-insert-macro "item")
+  (delete-horizontal-space)
+  (if (or current-prefix-arg LaTeX-beamer-item-overlay-flag)
+      (TeX-arg-beamer-overlay-spec 0))
+  (insert " ")
+  (indent-according-to-mode))
+  
+(defun TeX-arg-beamer-note (optional &optional prompt)
+  "Prompt for overlay specification and optional argument."
+  (let ((overlay (read-string "(Optional) Overlay: "))
+        (options (read-string "(Optional) Options: ")))
+    (unless (zerop (length overlay))
+      (insert "<" overlay ">"))
+    (unless (zerop (length options))
+      (insert "[" options "]"))
+    (indent-according-to-mode)))
+
+(defun LaTeX-beamer-search-themes (&optional regexp extensions length)
+  "Search for beamer themes matching REGEXP with EXTENSIONS.
+The function removes the first LENGTH characters and the
+extension of the file and returns a list of strings.  LENGTH may
+also be a string.  Then the length of the string is used."
+  (let* ((match (or regexp "^beamertheme[A-Z]"))
+        (exts  (or extensions '("tex" "sty")))
+        (chars (cond ((integerp length)
+                      length)
+                     ((stringp length)
+                      (string-width length))
+                     ;; Try some DWIM magic...
+                     ((and (not length)
+                           (string-match "beamer[A-Za-z0-9]*theme" match))
+                      (- (match-end 0) (match-beginning 0)))
+                     (t (error "Invalid length: `%s'" length)))))
+    ;; (message "match=`%s' chars=`%s'" match chars)
+    (TeX-delete-duplicate-strings
+     (delete nil
+            (mapcar
+             (lambda (file)
+               (let ((case-fold-search nil))
+                 (and (numberp (string-match match file))
+                      (substring file chars))))
+             (TeX-search-files nil exts t t))))))
+
+(defun LaTeX-arg-beamer-theme (&rest ignore)
+  "Prompt for beamer theme with completion."
+  (TeX-argument-insert
+   (completing-read
+    (TeX-argument-prompt nil nil "Theme")
+    (mapcar 'list
+           (cond ((eq LaTeX-beamer-themes 'local)
+                  (set (make-local-variable 'LaTeX-beamer-themes)
+                       (LaTeX-beamer-search-themes)))
+                 ((functionp LaTeX-beamer-themes)
+                  (funcall LaTeX-beamer-themes))
+                 ((listp LaTeX-beamer-themes)
+                  LaTeX-beamer-themes)
+                 (t (error
+                     "`LaTeX-beamer-themes' should be a list: `%s'"
+                     LaTeX-beamer-themes))))
+    nil nil nil)
+   t))
+
+(defun LaTeX-arg-beamer-inner-theme (&rest ignore)
+  "Prompt for beamer inner theme with completion."
+  (TeX-argument-insert
+   (completing-read
+    (TeX-argument-prompt nil nil "Theme")
+    (mapcar 'list
+           (cond ((eq LaTeX-beamer-inner-themes 'local)
+                  (set (make-local-variable 'LaTeX-beamer-inner-themes)
+                       (LaTeX-beamer-search-themes "^beamerinnertheme")))
+                 ((functionp LaTeX-beamer-inner-themes)
+                  (funcall LaTeX-beamer-inner-themes))
+                 ((listp LaTeX-beamer-inner-themes)
+                  LaTeX-beamer-inner-themes)
+                 (t (error
+                     "`LaTeX-beamer-inner-themes' should be a list: `%s'"
+                     LaTeX-beamer-inner-themes))))
+    nil nil nil)
+   t))
+
+(defun LaTeX-arg-beamer-outer-theme (&rest ignore)
+  "Prompt for beamer outer theme with completion."
+  (TeX-argument-insert
+   (completing-read
+    (TeX-argument-prompt nil nil "Theme")
+    (mapcar 'list
+           (cond ((eq LaTeX-beamer-outer-themes 'local)
+                  (set (make-local-variable 'LaTeX-beamer-outer-themes)
+                       (LaTeX-beamer-search-themes "^beameroutertheme")))
+                 ((functionp LaTeX-beamer-outer-themes)
+                  (funcall LaTeX-beamer-outer-themes))
+                 ((listp LaTeX-beamer-outer-themes)
+                  LaTeX-beamer-outer-themes)
+                 (t (error
+                     "`LaTeX-beamer-outer-themes' should be a list: `%s'"
+                     LaTeX-beamer-outer-themes))))
+    nil nil nil)
+   t))
+
+(defun LaTeX-arg-beamer-color-theme (&rest ignore)
+  "Prompt for beamer color theme with completion."
+  (TeX-argument-insert
+   (completing-read
+    (TeX-argument-prompt nil nil "Theme")
+    (mapcar 'list
+           (cond ((eq LaTeX-beamer-color-themes 'local)
+                  (set (make-local-variable 'LaTeX-beamer-color-themes)
+                       (LaTeX-beamer-search-themes "^beamercolortheme")))
+                 ((functionp LaTeX-beamer-color-themes)
+                  (funcall LaTeX-beamer-color-themes))
+                 ((listp LaTeX-beamer-color-themes)
+                  LaTeX-beamer-color-themes)
+                 (t (error
+                     "`LaTeX-beamer-color-themes' should be a list: `%s'"
+                     LaTeX-beamer-color-themes))))
+    nil nil nil)
+   t))
+
+(defun LaTeX-arg-beamer-font-theme (&rest ignore)
+  "Prompt for beamer font theme with completion."
+  (TeX-argument-insert
+   (completing-read
+    (TeX-argument-prompt nil nil "Theme")
+    (mapcar 'list
+           (cond ((eq LaTeX-beamer-font-themes 'local)
+                  (set (make-local-variable 'LaTeX-beamer-font-themes)
+                       (LaTeX-beamer-search-themes "^beamerfonttheme")))
+                 ((functionp LaTeX-beamer-font-themes)
+                  (funcall LaTeX-beamer-font-themes))
+                 ((listp LaTeX-beamer-font-themes)
+                  LaTeX-beamer-font-themes)
+                 (t (error
+                     "`LaTeX-beamer-font-themes' should be a list: `%s'"
+                     LaTeX-beamer-font-themes))))
+    nil nil nil)
+   t))
+
+;;; beamer.el ends here
diff --git a/packages/auctex/style/book.el b/packages/auctex/style/book.el
new file mode 100644 (file)
index 0000000..7b028e5
--- /dev/null
@@ -0,0 +1,12 @@
+;;; book.el - Special code for book style.
+
+;; $Id: book.el,v 1.5 2005/03/17 10:02:06 angeli Exp $
+
+;;; Code:
+
+(TeX-add-style-hook
+ "book"
+ (lambda () 
+   (LaTeX-largest-level-set "chapter")))
+
+;;; book.el ends here
diff --git a/packages/auctex/style/booktabs.el b/packages/auctex/style/booktabs.el
new file mode 100644 (file)
index 0000000..e126872
--- /dev/null
@@ -0,0 +1,74 @@
+;;; booktabs.el -- AUCTeX style for booktabs.sty
+
+;; Copyright (C) 2003, 2004 Free Software Foundation, Inc.
+
+;; Author:   Ralf Angeli <angeli@iwi.uni-sb.de>
+;; Maintainer: auctex-devel@gnu.org
+;; Created:  2003-10-21
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file adds support for `booktabs.sty'.
+
+;;; Code:
+
+(defun LaTeX-booktabs-arg-paren (optional prompt)
+  "Prompt for a value and use parentheses when it is inserted.
+If OPTIONAL is non-nil the parameter is labeled as optional.
+PROMPT is the value of the prompt to be shown."
+  (let ((< "\(")
+       (> "\)"))
+    (TeX-parse-argument optional prompt)))
+
+(TeX-add-style-hook
+ "booktabs"
+ (lambda ()
+
+   ;; New symbols
+   (TeX-add-symbols
+    '("toprule" [ "Thickness" ])
+    '("midrule" [ "Thickness" ])
+    '("bottomrule" [ "Thickness" ])
+    ;; FIXME: The qestion for the trim parameter will only be asked if
+    ;; a value for the thickness parameter was given.  Is this a
+    ;; feature of `TeX-parse-arguments'?
+    '("cmidrule" [ "Thickness" ] [ LaTeX-booktabs-arg-paren "Trim" ]
+      "Column(s)")
+    '("addlinespace" [ "Height" ])
+    '("morecmidrules")
+    '("specialrule" "Thickness" "Space above" "Space below"))
+
+   ;; Fontification
+   (when (and (featurep 'font-latex)
+             (eq TeX-install-font-lock 'font-latex-setup))
+     (font-latex-add-keywords '(("toprule" "[")
+                               ("midrule" "[")
+                               ("bottomrule" "[")
+                               ("cmidrule" "[({")
+                               ("addlinespace" "[")
+                               ("morecmidrules" "")
+                               ("specialrule" "{{{"))
+                             'function))))
+
+(defvar LaTeX-booktabs-package-options nil
+  "Package options for the booktabs package.")                 
+
+;;; booktabs.el ends here
diff --git a/packages/auctex/style/bulgarian.el b/packages/auctex/style/bulgarian.el
new file mode 100644 (file)
index 0000000..3eb0144
--- /dev/null
@@ -0,0 +1,52 @@
+;;; bulgarian.el --- AUCTeX style for the `bulgarian' babel option.
+
+;; Copyright (C) 2008 Free Software Foundation, Inc.
+
+;; Author: Ralf Angeli <angeli@caeruleus.net>
+;; Maintainer: auctex-devel@gnu.org
+;; Created: 2008-06-28
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; Set up AUCTeX for editing Bulgarian text in connection with the
+;; `bulgarian' babel option.
+
+;;; Code:
+
+(defvar LaTeX-bulgarian-mode-syntax-table
+  (copy-syntax-table LaTeX-mode-syntax-table)
+  "Syntax table used in LaTeX mode when using `bulgarian.sty'.")
+
+(modify-syntax-entry ?\" "w" LaTeX-bulgarian-mode-syntax-table)
+
+(TeX-add-style-hook
+ "bulgarian"
+ (lambda ()
+   (set-syntax-table LaTeX-bulgarian-mode-syntax-table)
+   (setq TeX-quote-language `("bulgarian" "\"`" "\"'" ,TeX-quote-after-quote))
+   (setq LaTeX-babel-hyphen-language "bulgarian")
+   ;; Fontification of quotation marks.
+   (when (fboundp 'font-latex-add-quotes)
+     (font-latex-add-quotes '("\"`" "\"'"))
+     (font-latex-add-quotes '("\"<" "\">" french)))
+   (run-hooks 'TeX-language-bg-hook)))
+
+;;; bulgarian.el ends here
diff --git a/packages/auctex/style/captcont.el b/packages/auctex/style/captcont.el
new file mode 100644 (file)
index 0000000..ffa48bf
--- /dev/null
@@ -0,0 +1,46 @@
+;; captcont.el --- AUCTeX style file for captcont.sty
+
+;; Copyright (C) 2003, 2005 Free Software Foundation, Inc.
+
+;; Author: Reiner Steib <Reiner.Steib@gmx.de>
+;; Maintainer: auctex-devel@gnu.org
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; AUCTeX style file for captcont.sty
+
+;;; Code:
+
+(TeX-add-style-hook
+ "captcont"
+ (lambda ()
+   (TeX-add-symbols
+    '("captcont"  [ "list entry" ] "Caption")
+    '("captcont*" [ "list entry" ] "Caption"))
+   ;; Fontification
+   (when (featurep 'font-latex)
+     (font-latex-add-keywords '(("captcont" "*[{")) 'textual))))
+
+(defvar LaTeX-captcont-package-options '("figbotcap" "figtopcap" "tabbotcap"
+                                        "tabtopcap")
+  "Package options for the captcont package.")
+
+;;; captcont.el ends here
diff --git a/packages/auctex/style/comment.el b/packages/auctex/style/comment.el
new file mode 100644 (file)
index 0000000..c842d20
--- /dev/null
@@ -0,0 +1,69 @@
+;;; comment.el --- AUCTeX style for `comment.sty'
+
+;; Copyright (C) 2007 Free Software Foundation, Inc.
+
+;; Author: Ralf Angeli <angeli@caeruleus.net>
+;; Maintainer: auctex-devel@gnu.org
+;; Created: 2007-03-18
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+;; 02111-1307, USA.
+
+;;; Commentary:
+
+;; This file adds support for `comment.sty'.
+
+;;; Code:
+
+(TeX-add-style-hook
+ "comment"
+ (lambda ()
+   ;; New symbols
+   (TeX-add-symbols
+    '("includecomment" "Name")
+    '("excludecomment" "Name")
+    '("specialcomment" "Name" "Before commands" "After commands")
+    '("processcomment" "Name" "Each-line commands"
+      "Before commands" "After commands"))
+   ;; New environments
+   (mapc 'LaTeX-add-environments LaTeX-comment-env-list)
+   ;; Fontification
+   (when (and (featurep 'font-latex)
+             (eq TeX-install-font-lock 'font-latex-setup))
+     ;; For syntactic fontification.
+     (add-to-list 'font-latex-syntactic-keywords-extra
+                 ;; \begin is supposed to start at the beginning of a line.
+                 `(,(format "^\\\\begin *{\\(?:%s\\)}.*\\(\n\\)"
+                            (regexp-opt LaTeX-comment-env-list))
+                   (1 "<" t)))
+     (add-to-list 'font-latex-syntactic-keywords-extra
+                 ;; \end is supposed to start at the beginning of a line.
+                 `(,(format "^\\(\\\\\\)end *{\\(?:%s\\)}"
+                            (regexp-opt LaTeX-comment-env-list))
+                   (1 ">" t)))
+     (font-latex-set-syntactic-keywords)
+     (font-latex-add-keywords '(("includecomment" "{")
+                               ("excludecomment" "{")
+                               ("specialcomment" "{{{")
+                               ("processcomment" "{{{{"))
+                             'variable)
+     ;; Tell font-lock about the update.
+     (setq font-lock-set-defaults nil)
+     (font-lock-set-defaults))))
+
+;;; comment.el ends here
diff --git a/packages/auctex/style/csquotes.el b/packages/auctex/style/csquotes.el
new file mode 100644 (file)
index 0000000..50aa1f9
--- /dev/null
@@ -0,0 +1,245 @@
+;;; csquotes.el --- AUCTeX style for `csquotes.sty'
+
+;; Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
+
+;; Author: Ralf Angeli <angeli@caeruleus.net>
+;; Maintainer: auctex-devel@gnu.org
+;; Created: 2004-11-29
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file adds support for `csquotes.sty', version 3.7.
+
+
+;;; Code:
+
+;; FIXME: It would be nice to be able to dump this function in favor
+;; of a generalized handling of additional arguments for environments
+;; specified via `LaTeX-add-environments'.  `TeX-parse-arguments' and
+;; friends would be the functions to be used for that, but those
+;; functions currently insert text directly into the buffer.  There
+;; would either have to be a way of preventing this and letting them
+;; return a string, or the insertion could happen in a temporary buffer
+;; and the buffer content be returned.
+(defun LaTeX-csquotes-insert-environment (env &rest args)
+  "Insert environment ENV considering optional arguments ARGS.
+
+This is basically a variant of `LaTeX-environment-menu'
+specialized for csquotes.el.  ARGS can be made up of strings and
+vectors containing single strings.  Plain strings will be used as
+prompts for mandatory arguments and strings in vectors as prompts
+for optional arguments of the environment to be inserted.
+
+That means, in contrast to `LaTeX-environment-menu' it supports
+the insertion of optional arguments."
+  (let (env-extra prompt optional user-input)
+    (dolist (elt args)
+      (if (vectorp elt)
+         (setq prompt (aref elt 0)
+               optional t)
+       (setq prompt elt
+             optional nil))
+      (setq user-input (read-string (TeX-argument-prompt optional prompt nil)))
+      (unless (and optional (zerop (length user-input)))
+       (setq env-extra (concat env-extra
+                               (if optional LaTeX-optop TeX-grop)
+                               user-input
+                               (if optional LaTeX-optcl TeX-grcl)))))
+    (LaTeX-insert-environment env env-extra)))
+
+(TeX-add-style-hook
+ "csquotes"
+ (lambda ()
+   (let ((quote-style-variant-list '(("quotes") ("guillemets") ("american")
+                                    ("british") ("oldstyle") ("imprimerie")
+                                    ("swiss")))
+        (quote-style-name-list '(("danish") ("dutch") ("english") ("finnish")
+                                 ("french") ("german") ("italian")
+                                 ("norwegian") ("swedish"))))
+     ;; New symbols
+     (TeX-add-symbols
+      '("enquote" 1)
+      '("enquote*" 1)
+      '("foreignquote" 2)
+      '("foreignquote*" 2)
+      '("hyphenquote" 2)
+      '("hyphenquote*" 2)
+      '("textquote" ["Citation"] ["Punctuation"] t)
+      '("textquote*" ["Citation"] ["Punctuation"] t)
+      '("foreigntextquote" "Language" ["Citation"] ["Punctuation"] t)
+      '("foreigntextquote*" "Language" ["Citation"] ["Punctuation"] t)
+      '("hyphentextquote" "Language" ["Citation"] ["Punctuation"] t)
+      '("hyphentextquote*" "Language" ["Citation"] ["Punctuation"] t)
+      '("blockquote" ["Citation"] ["Punctuation"] t)
+      '("foreignblockquote" "Language" ["Citation"] ["Punctuation"] t)
+      '("hyphenblockquote" "Language" ["Citation"] ["Punctuation"] t)
+      `("setquotestyle"
+       [ (TeX-arg-eval completing-read "Quote style variant: "
+                       ',quote-style-variant-list) ]
+       (TeX-arg-eval completing-read "Quote style name or alias: "
+                     ',quote-style-name-list))
+      "setquotestyle*"
+      '("MakeInnerQuote" "Character")
+      '("MakeOuterQuote" "Character")
+      '("MakeAutoQuote" "Opening quotation mark" "Closing quotation mark")
+      '("MakeAutoQuote*" "Opening quotation mark" "Closing quotation mark")
+      '("MakeForeignQuote" "Babel's language name"
+       "Opening quotation mark" "Closing quotation mark")
+      '("MakeForeignQuote*" "Babel's language name"
+       "Opening quotation mark" "Closing quotation mark")
+      '("MakeHyphenQuote" "Babel's language name"
+       "Opening quotation mark" "Closing quotation mark")
+      '("MakeHyphenQuote" "Babel's language name"
+       "Opening quotation mark" "Closing quotation mark")
+      '("MakeBlockQuote" "Opening quotation mark" "Delimiter for citation"
+       "Closing quotation mark")
+      '("MakeForeignBlockQuote" "Language" "Opening quotation mark"
+       "Delimiter for citation" "Closing quotation mark")
+      '("MakeHyphenBlockQuote" "Language" "Opening quotation mark"
+       "Delimiter for citation" "Closing quotation mark")
+      "EnableQuotes"
+      "DisableQuotes"
+      "VerbatimQuotes"
+      "DeleteQuotes"
+      '("textcquote" ["Pre-note"] ["Post-note"] "Key" ["Punctuation"] t)
+      '("textcquote*" ["Pre-note"] ["Post-note"] "Key" ["Punctuation"] t)
+      '("foreigntextcquote" "Language" ["Pre-note"] ["Post-note"] "Key"
+       ["Punctuation"] t)
+      '("foreigntextcquote*" "Language" ["Pre-note"] ["Post-note"] "Key"
+       ["Punctuation"] t)
+      '("hyphentextcquote" "Language" ["Pre-note"] ["Post-note"] "Key"
+       ["Punctuation"] t)
+      '("hyphentextcquote*" "Language" ["Pre-note"] ["Post-note"] "Key"
+       ["Punctuation"] t)
+      '("blockcquote" ["Pre-note"] ["Post-note"] "Key" ["Punctuation"] t)
+      '("foreignblockcquote" "Language" ["Pre-note"] ["Post-note"] "Key"
+       ["Punctuation"] t)
+      '("hyphenblockcquote" "Language" ["Pre-note"] ["Post-note"] "Key"
+       ["Punctuation"] t)
+      `("DeclareQuoteStyle"
+       [ (TeX-arg-eval completing-read "Quote style variant: "
+                       ',quote-style-variant-list) ]
+       (TeX-arg-eval completing-read "Quote style name: "
+                     ',quote-style-name-list)
+       ["Outer quote initialization"] ["Inner quote initialization"]
+       "Opening outer quotation mark" ["Middle outer quotation mark"]
+       "Closing outer quotation mark" ["Kerning between adjoining marks"]
+       "Opening inner quotation mark" ["Middle inner quotation mark"]
+       "Closing inner quotation mark")
+      `("DeclareQuoteAlias"
+       [ (TeX-arg-eval completing-read "Quote style variant: "
+                       ',quote-style-variant-list) ]
+       (TeX-arg-eval completing-read "Quote style name: "
+                     ',quote-style-name-list)
+       "Alias name")
+    '("DeclareQuoteOption" 1)
+    '("ExecuteQuoteOptions" 1)
+    '("DeclarePlainStyle" "Opening outer quotation mark"
+      "Closing outer quotation mark" "Opening inner quotation mark"
+      "Closing inner quotation mark")
+    '("SetBlockThreshold" "Number of lines")
+    '("SetBlockEnvironment" "Environment")
+    '("SetCiteCommand" "Command")
+    "mkcitation"
+    "mkccitation"
+    "mkpreblockpunct"
+    "mkmidblockpunct"
+    "mkfinblockpunct"
+    "mkpretextpunct"
+    "mkmidtextpunct"
+    "mkfintextpunct"
+    "mkpredisppunct"
+    "mkmiddisppunct"
+    "mkfindisppunct"
+    '("ifblockquote" 2)
+    '("ifquotepunct" 2)
+    '("ifquoteterm" 2)
+    '("ifquoteperiod" 2)
+    '("ifquotecomma" 2)
+    '("ifquotesemicolon" 2)
+    '("ifquotecolon" 2)
+    '("ifquoteexclam" 2)
+    '("ifquotequestion" 2)
+    '("ifstringblank" 2)
+    '("BlockquoteDisable" 1))
+   ;; New environments
+   (LaTeX-add-environments
+    "quoteblock"
+    "quotetext"
+    '("displayquote" LaTeX-csquotes-insert-environment ["Citation"]
+      ["Punctuation"])
+    '("foreigndisplayquote" LaTeX-csquotes-insert-environment "Language"
+      ["Citation"] ["Punctuation"])
+    '("hyphendisplayquote" LaTeX-csquotes-insert-environment "Language"
+      ["Citation"] ["Punctuation"])
+    '("displaycquote" LaTeX-csquotes-insert-environment
+      ["Pre-note"] ["Post-note"] "Key" ["Punctuation"])
+    '("foreigndisplaycquote" LaTeX-csquotes-insert-environment
+      "Language" ["Pre-note"] ["Post-note"] "Key" ["Punctuation"])
+    '("hyphendisplaycquote" LaTeX-csquotes-insert-environment
+      "Language" ["Pre-note"] ["Post-note"] "Key" ["Punctuation"]))
+   ;; Quotation marks
+   (when (and (> (length LaTeX-csquotes-open-quote) 0)
+             (> (length LaTeX-csquotes-close-quote) 0))
+     (setq TeX-quote-language
+          `(override ,LaTeX-csquotes-open-quote ,LaTeX-csquotes-close-quote
+                     ,LaTeX-csquotes-quote-after-quote)))
+   ;; Fontification
+   (when (and (featurep 'font-latex)
+             (eq TeX-install-font-lock 'font-latex-setup))
+     (font-latex-add-keywords '(("DisableQuotes" "")
+                               ("RestoreQuotes" ""))
+                             'function)
+     (font-latex-add-keywords '(("enquote" "*{")
+                               ("foreignquote" "*{{")
+                               ("hyphenquote" "*{{")
+                               ("textcquote" "*[[{[{")
+                               ("foreigntextcquote" "*{[[{[{")
+                               ("hyphentextcquote" "*{[[{[{")
+                               ("textquote" "*[[{")
+                               ("foreigntextquote" "*{[[{")
+                               ("hyphentextquote" "*{[[{")
+                               ("blockquote" "[[{")
+                               ("foreignblockquote" "{[[{")
+                               ("hyphenblockquote" "{[[{")
+                               ("blockcquote" "[[{[{")
+                               ("foreignblockcquote" "{[[{[{")
+                               ("hyphenblockcquote" "{[[{[{"))
+                             'textual)
+     (font-latex-add-keywords '(("setquotestyle" "[{")
+                               ("MakeOuterQuote" "{")
+                               ("MakeInnerQuote" "{")
+                               ("MakeAutoQuote" "*{{")
+                               ("MakeForeignQuote" "*{{{")
+                               ("MakeHyphenQuote" "*{{{")
+                               ("MakeBlockQuote" "{{{")
+                               ("MakeForeignBlockQuote" "{{{{")
+                               ("MakeHyphenBlockQuote" "{{{{")
+                               ("DeclareQuoteStyle" "[{[[{[{[{[{")
+                               ("DeclareQuoteAlias" "[{{")
+                               ("DeclareQuoteOption" "{")
+                               ("DeclarePlainStyle" "{{{{")
+                               ("SetBlockThreshold" "{")
+                               ("SetBlockEnvironment" "{")
+                               ("SetCiteCommand" "{"))
+                             'variable)))))
+
+;;; csquotes.el ends here
diff --git a/packages/auctex/style/czech.el b/packages/auctex/style/czech.el
new file mode 100644 (file)
index 0000000..4d8eb0b
--- /dev/null
@@ -0,0 +1,7 @@
+;;; czech.el --- Setup AUCTeX for editing Czech text.
+
+(TeX-add-style-hook
+ "czech"
+ (lambda ()
+   (setq TeX-quote-language `("czech" "\\uv{" "}" ,TeX-quote-after-quote))
+   (run-hooks 'TeX-language-cz-hook)))
diff --git a/packages/auctex/style/danish.el b/packages/auctex/style/danish.el
new file mode 100644 (file)
index 0000000..77a0164
--- /dev/null
@@ -0,0 +1,16 @@
+;;; danish.el --- Setup AUCTeX for editing Danish text.
+
+;;; Code:
+
+(TeX-add-style-hook
+ "danish"
+ (lambda ()
+   (setq TeX-quote-language `("danish" "\"`" "\"'" ,TeX-quote-after-quote))
+   (setq LaTeX-babel-hyphen-language "danish")
+   ;; Fontification of quotation marks.
+   (when (fboundp 'font-latex-add-quotes)
+     (font-latex-add-quotes '("\"`" "\"'"))
+     (font-latex-add-quotes '("\"<" "\">" french)))
+   (run-hooks 'TeX-language-dk-hook)))
+
+;;; danish.el ends here
diff --git a/packages/auctex/style/dk-bib.el b/packages/auctex/style/dk-bib.el
new file mode 100644 (file)
index 0000000..2ae7530
--- /dev/null
@@ -0,0 +1,62 @@
+;;; dk-bib.el --- AUCTeX style for `dk-bib.sty'
+
+;; Copyright (C) 2005 Free Software Foundation, Inc.
+
+;; Author: Arne Jørgensen <arne@arnested.dk>
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+;; MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; Prompt for package option for dk-bib.sty.
+
+;;; Code:
+
+(defun LaTeX-dk-bib-package-options nil
+  "Prompt for package options for the dk-bib package."
+  (let ((options
+        (mapconcat 'identity
+                   (TeX-completing-read-multiple
+                    "Options: "
+                    '(("isbn") ("issn") ("url") ("annote")
+                      ("printing") ("apalike") ("fixcitedash=false")
+                      ("ordinals2word") ("ordinaldepth=")))
+                   ","))
+       (depth -1))
+    (when (string-match "\\(ordinaldepth=\\)\\([^0-9]\\|$\\)" options)
+      (while (or (< depth 0)
+                (> depth 20))
+       (setq depth (if (fboundp 'read-number)
+                       (read-number "Ordinal depth: ")
+                     (string-to-number (read-string "Ordinal depth: "))))
+       (when (or (< depth 0)
+                 (> depth 20))
+         (message "Ordinal depth must be between 0 and 20")
+         (sit-for 1)))
+      (setq options (concat
+                    (substring options 0 (match-end 1))
+                    (number-to-string depth)
+                    (substring options (match-end 1)))))
+    options))
+
+;; Local Variables:
+;; coding: iso-8859-1
+;; End:
+
+;;; dk-bib.el ends here
diff --git a/packages/auctex/style/dk.el b/packages/auctex/style/dk.el
new file mode 100644 (file)
index 0000000..b46feaf
--- /dev/null
@@ -0,0 +1,11 @@
+;;; dk.el - Setup AUC TeX for editing Danish text.
+
+;; $Id: dk.el,v 1.2 1993/12/15 21:42:40 amanda Exp $
+
+;;; Code:
+
+(TeX-add-style-hook "dk"
+ (function (lambda ()
+   (run-hooks 'TeX-language-dk-hook))))
+
+;;; dk.el ends here
diff --git a/packages/auctex/style/doc.el b/packages/auctex/style/doc.el
new file mode 100644 (file)
index 0000000..3c70220
--- /dev/null
@@ -0,0 +1,158 @@
+;;; doc.el --- AUCTeX style for `doc.sty'
+
+;; Copyright (C) 2004, 2008 Free Software Foundation, Inc.
+
+;; Author: Frank Küster <frank@kuesterei.ch>
+;; Maintainer: auctex-devel@gnu.org
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file adds support for `doc.sty'.
+
+;;; Code:
+
+(defun LaTeX-env-no-comment (environment)
+  "Insert ENVIRONMENT and make sure there is no commented empty line inside."
+  (LaTeX-insert-environment environment)
+  (unless (TeX-active-mark)
+    (when (save-excursion
+           (beginning-of-line)
+           (looking-at (concat "[ \t]+$\\|[ \t]*"
+                               TeX-comment-start-regexp "+[ \t]*$")))
+      (delete-region (line-beginning-position) (line-end-position))
+      (indent-according-to-mode))))
+
+(defun LaTeX-doc-after-insert-macrocode (env start end)
+  "Make sure the macrocode environment is properly formatted after insertion."
+  (when (TeX-member env '("macrocode" "macrocode*") 'string-equal)
+    (save-excursion
+      (goto-char end)
+      (skip-chars-backward " \t")
+      (when (bolp)
+       (insert "%")
+       (indent-according-to-mode))
+      (goto-char start)
+      (skip-chars-backward " \t")
+      (when (bolp)
+       (insert "%")
+       (indent-according-to-mode)))))
+
+(TeX-add-style-hook
+ "doc"
+ (function
+  (lambda ()
+    (add-to-list (make-local-variable 'LaTeX-indent-environment-list)
+                '("macrocode" current-indentation))
+    (add-to-list 'LaTeX-indent-environment-list
+                '("macrocode*" current-indentation))
+    (add-hook 'LaTeX-after-insert-env-hooks 'LaTeX-doc-after-insert-macrocode
+             nil t)
+    (LaTeX-add-environments
+     "theglossary"
+     '("macrocode" LaTeX-env-no-comment)
+     '("macrocode*" LaTeX-env-no-comment)
+     '("macro" "Macro"))
+    (TeX-add-symbols
+     "EnableCrossrefs"
+     "DisableCrossrefs"
+     "DoNotIndex"
+     "DontCheckModules"
+     "CheckModules"
+     "Module"
+     '("DescribeMacro" "Macro")
+     '("DescribeEnv" "Environment")
+     "verbatim"
+     "verb"
+     "parg"
+     "oarg"
+     "marg"
+     "meta"
+     "cmd"
+     "makelabel"
+     "MacroFont"
+     "MacroFont"
+     "AltMacroFont"
+     "AltMacroFont"
+     "PrintMacroName"
+     "PrintDescribeMacro"
+     "PrintDescribeEnv"
+     "PrintEnvName"
+     "MakePrivateLetters"
+     "actualchar"
+     "quotechar"
+     "levelchar"
+     "encapchar"
+     "verbatimchar"
+     "SpecialIndex"
+     "SpecialMainIndex"
+     "SpecialMainEnvIndex"
+     "SpecialUsageIndex"
+     "SpecialEnvIndex"
+     "SortIndex"
+     "LeftBraceIndex"
+     "RightBraceIndex"
+     "PercentIndex"
+     "OldMakeindex"
+     "PercentIndex"
+     "IndexPrologue"
+     "IndexParms"
+     "subitem"
+     "subsubitem"
+     "indexspace"
+     "efill"
+     "pfill"
+     "PrintIndex"
+     '("changes" "version" "date (YYYY/MM/DD)")
+     "generalname"
+     "RecordChanges"
+     "GlossaryPrologue"
+     "GlossaryParms"
+     "PrintChanges"
+     "AlsoImplementation"
+     "StopEventually"
+     "OnlyDescription"
+     "Finale"
+     "IndexInput"
+     "maketitle"
+     "MakeShortVerb"
+     "DeleteShortVerb"
+     "MakeShortverb"
+     "DeleteShortverb"
+     "CheckSum"
+     "CharacterTable"
+     "CharTableChanges"
+     "CodelineNumbered"
+     "CodelineIndex"
+     "PageIndex"
+     "theCodelineNo"
+     "theCodelineNo"
+     "DocstyleParms"
+     "MakePercentIgnore"
+     "MakePercentComment"
+     "DocInput"
+     "DocInclude"
+     "GetFileInfo"
+     "filename"
+     "fileinfo"))))
+
+;; Local Variables:
+;; coding: iso-8859-1
+;; End:
diff --git a/packages/auctex/style/dutch.el b/packages/auctex/style/dutch.el
new file mode 100644 (file)
index 0000000..c5f1cb5
--- /dev/null
@@ -0,0 +1,11 @@
+;;; dutch.el - Setup AUC TeX for editing Dutch text.
+
+;; $Id: dutch.el,v 1.2 1993/12/15 21:42:42 amanda Exp $
+
+;;; Code:
+
+(TeX-add-style-hook "dutch"
+ (function (lambda ()
+   (run-hooks 'TeX-language-nl-hook))))
+
+;;; dutch.el ends here
diff --git a/packages/auctex/style/emp.el b/packages/auctex/style/emp.el
new file mode 100644 (file)
index 0000000..4e5f867
--- /dev/null
@@ -0,0 +1,84 @@
+;;; emp.el --- AUCTeX support for emp.sty
+
+;; Copyright (C) 2004, 2005  Free Software Foundation, Inc.
+
+;; Author: Yvon Henel aka TeXnicien de surface <Yvon.Henel@wanadoo.fr>
+;; Maintainer: auctex-devel@gnu.org
+;; Keywords: tex
+
+;; This file 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, or (at your option)
+;; any later version.
+
+;; This file 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; see the file COPYING.  If not, write to
+;; the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;; version 1.0 2004-03-04
+
+;;; Code:
+
+
+(TeX-add-style-hook "emp"
+ (function
+  (lambda ()
+     (TeX-add-symbols "empuse" "empTeX"  "empaddtoTeX"
+                     "emprelude" "empaddtoprelude" "unitlength"
+                    )
+    (LaTeX-add-environments
+     '("empfile" LaTeX-env-empfile)
+     '("emp" LaTeX-env-emp-gen)
+     '("empdef" LaTeX-env-emp-gen)
+     '("empgraph" LaTeX-env-emp-gen)
+     '("empcmds")
+     ))))
+
+(defun LaTeX-env-emp-gen (environment-name)
+   "Ask for file, width and length. Insert environment-name environment
+Used for emp, empdef, and empgraph environments."
+   (let ((emp-fig-name (read-string "figure name: " ""))
+        (emp-fig-width (read-string "figure width: " "1" ))
+        (emp-fig-height (read-string "figure height: " "1" ))
+        ;;; emp.sty demands a width and a height for each of the
+        ;;; emp, empdef, and empgraph environments
+        ;;; we give them 1 by default
+        ;;; not necessarily the best thing to do?
+        )
+     (if (not (zerop (length emp-fig-name)))
+        (progn 
+          (setq LaTeX-emp-fig-name (concat LaTeX-optop emp-fig-name LaTeX-optcl))
+          (LaTeX-insert-environment environment-name LaTeX-emp-fig-name))
+        (LaTeX-insert-environment environment-name))
+     (forward-line -1)
+     (end-of-line)
+     (insert "(" emp-fig-width "," emp-fig-height ")")
+     (forward-line 1)
+     (indent-according-to-mode)
+     ))
+
+(defun LaTeX-env-empfile (optional)
+   "Ask for file. Insert empfile environment"
+   (let ((empfile (read-string "empfile: " "")))
+     (if (not (zerop (length empfile)))
+        (progn 
+          (setq LaTeX-emp-file-name (concat LaTeX-optop empfile LaTeX-optcl))
+          (setq mpost-emp-file-name (concat empfile ".mp"))
+          (LaTeX-insert-environment "empfile" LaTeX-emp-file-name))
+       (progn
+        (setq mpost-emp-file-name "\\jobname")
+        (LaTeX-insert-environment "empfile")))
+     (if LaTeX-write18-enabled-p
+        (progn
+          (forward-line 1)
+          (end-of-line)
+          (newline-and-indent)
+          (insert "\\immediate\\write18{mpost -tex=latex " mpost-emp-file-name TeX-grcl)
+          (forward-line -2)))))
+;;; emp.el ends here
diff --git a/packages/auctex/style/fancyref.el b/packages/auctex/style/fancyref.el
new file mode 100644 (file)
index 0000000..53b64fe
--- /dev/null
@@ -0,0 +1,122 @@
+;;; fancyref.el --- AUCTeX style file with support for fancyref.sty
+
+;; Copyright (C) 1999 Free Software Foundation, Inc.
+
+;; Author: Carsten Dominik <dominik@strw.leidenuniv.nl>
+;; Maintainer: auctex-devel@gnu.org
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Code:
+
+(TeX-add-style-hook "fancyref"
+   (lambda ()
+     
+     (TeX-add-symbols
+
+      ;; The macros with label arguments
+      '("fref" [ TeX-arg-fancyref-format ] TeX-arg-label)
+      '("Fref" [ TeX-arg-fancyref-format ] TeX-arg-label)
+
+      ;; The macros which define new prefixes and formats
+      '("fancyrefchangeprefix" TeX-arg-macro "Prefix")
+      '("Frefformat" TeX-arg-fancyref-format TeX-arg-macro "Output")
+      '("frefformat" TeX-arg-fancyref-format TeX-arg-macro "Output")
+
+      ;; The delimiter
+      "fancyrefargdelim"
+
+      ;; All those names and abbreviations.
+      ;; Part
+      "fancyrefpartlabelprefix" 
+      "Frefpartname" "frefpartname"   
+      ;; Chapter
+      "fancyrefchalabelprefix"
+      "Frefchaname" "frefchaname"   
+      ;; Section
+      "fancyrefseclabelprefix"
+      "Frefsecname" "frefsecname"
+      ;; Equation
+      "fancyrefeqlabelprefix"
+      "Frefeqname" "frefeqname"   
+      ;; Figure
+      "fancyreffiglabelprefix"
+      "Freffigname" "freffigname" "Freffigshortname"
+      ;; Footnote
+      "fancyreffnlabelprefix"
+      "Freffnname" "freffnname"   
+      ;; Item
+      "fancyrefitemlabelprefix"
+      "Frefitemname" "frefitemname" 
+      ;; Table
+      "fancyreftablabelprefix"
+      "Freftabname" "freftabname" "Freftabshortname"
+      ;; Page
+      "Frefpgname" "frefpgname" "Frefpgshortname"
+      ;; On
+      "Frefonname" "frefonname" 
+      ;; See
+      "Frefseename" "frefseename"
+
+      ;; The spacing macros
+      "fancyrefloosespacing" "fancyreftightspacing" "fancyrefdefaultspacing"
+
+      ;; And the hook
+      "fancyrefhook")
+
+     ;; Insatall completion for labels and formats
+     (setq TeX-complete-list
+          (append
+           '(("\\\\[fF]ref\\(\\[[^]]*\\]\\)?{\\([^{}\n\r\\%,]*\\)" 
+              2 LaTeX-label-list "}")
+             ("\\\\[fF]ref\\[\\([^{}\n\r\\%,]*\\)" 
+              1 LaTeX-fancyref-formats "]")
+             ("\\\\[fF]refformat{\\([^{}\n\r\\%,]*\\)"
+              1 LaTeX-fancyref-formats "}"))
+           TeX-complete-list))
+     ;; Fontification
+     (when (and (featurep 'font-latex)
+               (eq TeX-install-font-lock 'font-latex-setup))
+       (font-latex-add-keywords '(("fref" "[{") ("Fref" "[{")) 'reference))))
+
+;; The following list keeps a list of available format names
+;; Note that this list is only updated when a format is used, not
+;; during buffer parsing.  We could install a regexp to look for
+;; formats, but this would not work in multifile documents since the
+;; formats are not written out to the auto files.
+;; For now, we just leave it at that.
+(defvar LaTeX-fancyref-formats '(("plain") ("vario") ("margin") ("main"))
+  "List of formats for fancyref.")
+
+(defun LaTeX-fancyref-formats () LaTeX-fancyref-formats)
+
+(defun TeX-arg-fancyref-format (optional &optional prompt definition)
+  "Prompt for a fancyref format name.
+If the user gives an unknown name, add it to the list."
+  (let ((format (completing-read (TeX-argument-prompt optional prompt "Format")
+                                LaTeX-fancyref-formats)))
+    (if (not (string-equal "" format))
+       (add-to-list 'LaTeX-fancyref-formats (list format)))
+    (TeX-argument-insert format optional)))
+
+(defvar LaTeX-fancyref-package-options '("english" "german" "loose"
+                                        "margin" "paren" "plain" "tight"
+                                        "vario")
+  "Package options for the fancyref package.")
+
+;;; fancyref.el ends here
diff --git a/packages/auctex/style/flashcards.el b/packages/auctex/style/flashcards.el
new file mode 100644 (file)
index 0000000..27e96d1
--- /dev/null
@@ -0,0 +1,60 @@
+;;; flashcards.el --- AUCTeX style for the flashcards class.
+
+;; Copyright (C) 2007 Free Software Foundation, Inc.
+
+;; Author: Ralf Angeli <angeli@caeruleus.net>
+;; Maintainer: auctex-devel@gnu.org
+;; Created: 2007-04-23
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file adds support for the flashcards class.
+
+;;; Code:
+
+(TeX-add-style-hook
+ "flashcards"
+ (lambda ()
+   (TeX-add-symbols
+    '("cardfrontstyle" ["Format"] "Style")
+    '("cardfrontfoot" "Footer text")
+    '("cardbackstyle" ["Format"] "Style")
+    '("cardfrontheadstyle" ["Format"] "Style")
+    '("cardfrontfootstyle" ["Format"] "Style")
+    "cardmargin"
+    "cardpaper"
+    "cardpapermode"
+    "cardrows"
+    "cardcolumns"
+    "cardheight"
+    "cardwidth")
+   (LaTeX-add-environments '("flashcard" ["Header"] "Front side"))
+   ;; Fontification
+   (when (and (fboundp 'font-latex-add-keywords)
+             (eq TeX-install-font-lock 'font-latex-setup))
+     (font-latex-add-keywords '(("cardfrontstyle" "[{")
+                               ("cardfrontfoot" "{")
+                               ("cardbackstyle" "[{")
+                               ("cardfrontheadstyle" "[{")
+                               ("cardfrontfootstyle" "[{"))
+                             'variable))))
+
+;;; flashcards.el ends here
diff --git a/packages/auctex/style/foils.el b/packages/auctex/style/foils.el
new file mode 100644 (file)
index 0000000..24d2b64
--- /dev/null
@@ -0,0 +1,46 @@
+;;; foils.el - Special code for FoilTeX.
+
+;; $Id: foils.el,v 1.5 2008/07/28 20:40:18 angeli Exp $
+
+;;; Code:
+
+(require 'timezone)
+
+(TeX-add-style-hook "foils"
+ (function
+  (lambda ()
+    (add-hook 'LaTeX-document-style-hook 'LaTeX-style-foils)
+    (setq LaTeX-default-style "foils")
+    (setq LaTeX-default-options '("landscape"))
+    (TeX-add-symbols
+     '("foilhead" [ "Rubric-body separation" ] "Foil rubric")))))
+
+(defun LaTeX-style-foils nil
+  "Prompt for and insert foiltex options."
+  (let* ((date (timezone-parse-date (current-time-string)))
+        (year   (string-to-number (aref date 0)))
+        (month  (string-to-number (aref date 1)))
+        (day    (string-to-number (aref date 2)))
+        (title (read-string "Title: ")))
+    (save-excursion
+      (goto-char (point-max))
+      (re-search-backward ".begin.document.")
+      (insert TeX-esc "title"
+             TeX-grop title TeX-grcl "\n")
+      (insert TeX-esc "author"
+             TeX-grop (user-full-name) TeX-grcl "\n")
+      (insert TeX-esc "date" TeX-grop
+             (format "%d-%02d-%02d" year month day)
+             TeX-grcl "\n")
+      (insert "" TeX-esc "MyLogo" TeX-grop TeX-grcl "\n")
+      (insert "%" TeX-esc "Restriction" TeX-grop TeX-grcl "\n")
+      (insert "%" TeX-esc "rightfooter" TeX-grop TeX-grcl "\n")
+      (insert "%" TeX-esc "leftheader" TeX-grop TeX-grcl "\n")
+      (insert "%" TeX-esc "rightheader" TeX-grop TeX-grcl "\n\n")
+      (re-search-forward ".begin.document.")
+      (end-of-line)
+      (newline-and-indent)
+      (insert "" TeX-esc "maketitle\n\n"))
+    (forward-line -1)))
+
+;;; foils.el ends here
diff --git a/packages/auctex/style/francais.el b/packages/auctex/style/francais.el
new file mode 100644 (file)
index 0000000..323d545
--- /dev/null
@@ -0,0 +1,41 @@
+;;; francais.el --- AUCTeX style for the `francais' babel option.
+
+;; Copyright (C) 2005 Free Software Foundation, Inc.
+
+;; Author: Ralf Angeli <angeli@iwi.uni-sb.de>
+;; Maintainer: auctex-devel@gnu.org
+;; Created: 2005-10-28
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; Set up AUCTeX for editing French text.  In particular for commands
+;; provided by the `francais' option of the `babel' LaTeX package.  As
+;; this is equivalent to the `frenchb' option, this file only loads
+;; `frenchb.el'.
+
+;;; Code:
+
+(TeX-add-style-hook
+ "francais"
+ (lambda ()
+   (TeX-run-style-hooks "frenchb")))
+
+;;; francais.el ends here
diff --git a/packages/auctex/style/frenchb.el b/packages/auctex/style/frenchb.el
new file mode 100644 (file)
index 0000000..fcef8a1
--- /dev/null
@@ -0,0 +1,77 @@
+;;; frenchb.el --- AUCTeX style for the `frenchb' babel option.
+
+;; Copyright (C) 2005 Free Software Foundation, Inc.
+
+;; Author: Ralf Angeli <angeli@iwi.uni-sb.de>
+;; Maintainer: auctex-devel@gnu.org
+;; Created: 2005-10-28
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; Set up AUCTeX for editing French text.  In particular for commands
+;; provided by the `frenchb' option of the `babel' LaTeX package.  The
+;; `frenchb' option is equivalent to the `francais' option and since
+;; babel version 3.7j with the `french' option.  `french', however, is
+;; ambiguous because another package by that name made by Bernard
+;; Gaulle could be loaded.  In order to avoid this, either `frenchb'
+;; (or `francais') or `frenchle' (or `frenchPRO') should be used.  See
+;; the documentation of `frenchb' at
+;; <URL:http://daniel.flipo.free.fr/frenchb/frenchb-doc.pdf>.
+
+;;; Code:
+
+(TeX-add-style-hook
+ "frenchb"
+ (lambda ()
+   (TeX-add-symbols
+    "og"
+    "fg"
+    "up"
+    "ier"
+    "iere"
+    "iers"
+    "ieres"
+    "ieme"
+    "iemes"
+    '("bsc" t)
+     "primo"
+     "secundo"
+     "tertio"
+     "quarto"
+     "No"
+     "no"
+     "degre"
+     "degres"
+     "DecimalMathComma"
+     "StandardMathComma"
+     '("nombre" "Nombre")
+     "ThinSpaceInFrenchNumbers"
+     "FrenchLayout"
+     "StandardLayout")
+   (setq TeX-quote-language
+        `("french" "\\og "
+          (lambda ()
+            (concat "\\fg"
+                    (unless (member "xspace" TeX-active-styles) "{}")))
+          ,TeX-quote-after-quote))
+   (run-hooks 'TeX-language-fr-hook)))
+
+;;; frenchb.el ends here
diff --git a/packages/auctex/style/german.el b/packages/auctex/style/german.el
new file mode 100644 (file)
index 0000000..3676176
--- /dev/null
@@ -0,0 +1,46 @@
+;;; german.el --- Setup AUCTeX for editing German text.
+
+;;; Commentary:
+;;
+;; Cater for some specialities of `(n)german.sty', e.g. special quote
+;; and hyphen strings or that `"' makes the following letter an
+;; umlaut.
+
+;;; Code:
+
+(defvar LaTeX-german-mode-syntax-table
+  (copy-syntax-table LaTeX-mode-syntax-table)
+  "Syntax table used in LaTeX mode when using `german.sty'.")
+
+(modify-syntax-entry ?\"  "w"  LaTeX-german-mode-syntax-table)
+
+(TeX-add-style-hook
+ "german"
+ (lambda ()
+   (set-syntax-table LaTeX-german-mode-syntax-table)
+   ;; XXX: Handle former customizations of the now defunct
+   ;; German-specific variables.  References to the respective
+   ;; variables are to be deleted in future versions. (now = 2005-04-01)
+   (unless (eq (car TeX-quote-language) 'override)
+     (let ((open-quote (if (and (boundp 'LaTeX-german-open-quote)
+                               LaTeX-german-open-quote)
+                          LaTeX-german-open-quote
+                        "\"`"))
+          (close-quote (if (and (boundp 'LaTeX-german-close-quote)
+                                LaTeX-german-close-quote)
+                           LaTeX-german-close-quote
+                         "\"'"))
+          (q-after-q (if (and (boundp 'LaTeX-german-quote-after-quote)
+                              LaTeX-german-quote-after-quote)
+                         LaTeX-german-quote-after-quote
+                       t)))
+       (setq TeX-quote-language
+            `("german" ,open-quote ,close-quote ,q-after-q))))
+   (setq LaTeX-babel-hyphen-language "german")
+   ;; Fontification of quotation marks.
+   (when (fboundp 'font-latex-add-quotes)
+     (font-latex-add-quotes '("\"`" "\"'"))
+     (font-latex-add-quotes '("\">" "\"<" german)))
+   (run-hooks 'TeX-language-de-hook)))
+
+;;; german.el ends here
diff --git a/packages/auctex/style/graphics.el b/packages/auctex/style/graphics.el
new file mode 100644 (file)
index 0000000..bffabc9
--- /dev/null
@@ -0,0 +1,10 @@
+;;; graphics.el --- Handle graphical commands in LaTeX 2e.
+
+;;; Code:
+
+(TeX-add-style-hook "graphics"
+ (function
+  (lambda ()
+    (TeX-run-style-hooks "graphicx"))))
+
+;;; graphics.el ends here.
diff --git a/packages/auctex/style/graphicx.el b/packages/auctex/style/graphicx.el
new file mode 100644 (file)
index 0000000..a35d151
--- /dev/null
@@ -0,0 +1,302 @@
+;;; graphicx.el --- AUCTeX style file for graphicx.sty
+
+;; Copyright (C) 2000, 2004, 2005 by Free Software Foundation, Inc.
+
+;; Author: Ryuichi Arafune <arafune@debian.org>
+;; Created: 1999/3/20
+;; Keywords: tex
+
+;; This file 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, or (at your option)
+;; any later version.
+
+;; This file 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; see the file COPYING.  If not, write to
+;; the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;;  This package supports the includegraphcics macro in graphicx style.
+
+;; Acknowledgements
+;;  Dr. Thomas Baumann <thomas.baumann@ch.tum.de>
+;;  David Kastrup <David.Kastrup@t-online.de>
+;;  Masayuki Akata <ataka@milk.freemail.ne.jp>
+
+;;; Code:
+
+(TeX-add-style-hook
+ "graphicx"
+ (lambda ()
+   (TeX-add-symbols
+    '("reflectbox" "Argument")
+    '("resizebox" "Width" "Height" "Argument")
+    '("resizebox*" "Width" "Total height" "Argument")
+    '("rotatebox" [ "Options" ] "Angle" "Argument")
+    '("scalebox" "Horizontal scale" [ "Vertical scale" ] "Argument")
+    '("includegraphics" LaTeX-arg-includegraphics))
+   ;; Fontification
+   (when (and (featurep 'font-latex)
+             (eq TeX-install-font-lock 'font-latex-setup))
+     (font-latex-add-keywords '(("reflectbox" "{")
+                               ("resizebox" "*{{{")
+                               ("rotatebox" "[{{")
+                               ("scalebox" "{[{"))
+                             'textual)
+     (font-latex-add-keywords '(("includegraphics" "*[[{")) 'reference))))
+
+(defun LaTeX-includegraphics-extensions (&optional list)
+  "Return appropriate extensions for input files to \\includegraphics."
+  ;; FIXME: This function may check for latex/pdflatex later.
+  (concat "\\."
+         (mapconcat 'identity
+                    (or list LaTeX-includegraphics-extensions)
+                    "$\\|\\.")
+         "$"))
+
+(defun LaTeX-includegraphics-read-file-TeX ()
+  "Read image file for \\includegraphics.
+Offers all graphic files found in the TeX search path.  See
+`LaTeX-includegraphics-read-file' for more."
+  ;; Drop latex/pdflatex differences for now.  Might be (re-)included later.
+  (completing-read
+   "Image file: "
+   (TeX-delete-dups-by-car
+    (mapcar 'list
+           (TeX-search-files nil LaTeX-includegraphics-extensions t t)))
+   nil nil nil))
+
+(defun LaTeX-includegraphics-read-file-relative ()
+  "Read image file for \\includegraphics.
+
+Lists all graphic files in the master directory and its
+subdirectories and inserts the relative file name.  This option
+doesn't works with Emacs 21.3 or XEmacs.  See
+`LaTeX-includegraphics-read-file' for more."
+  (file-relative-name
+   (read-file-name
+    "Image file: " nil nil nil nil
+    ;; FIXME: Emacs 21.3 and XEmacs 21.4.15 dont have PREDICATE as the sixth
+    ;; argument (Emacs 21.3: five args; XEmacs 21.4.15: sixth is HISTORY).
+    (lambda (fname)
+      (or (file-directory-p fname)
+         (string-match (LaTeX-includegraphics-extensions) fname))))
+   (TeX-master-directory)))
+
+(defun LaTeX-arg-includegraphics (prefix)
+  "Ask for mandantory and optional arguments for the \\includegraphics command.
+
+The extent of the optional arguments is determined by the prefix argument and
+`LaTeX-includegraphics-options-alist'."
+  (let* ((maybe-left-brace "[")
+        (maybe-comma "")
+        show-hint
+        (image-file (funcall LaTeX-includegraphics-read-file))
+        (incl-opts
+         (cond
+          ((numberp
+            (if (listp current-prefix-arg)
+                (setq current-prefix-arg (car current-prefix-arg))
+              current-prefix-arg))
+           (cdr
+            (assq current-prefix-arg LaTeX-includegraphics-options-alist)))
+          ;; If no prefix is given, use `0' and tell the user about the
+          ;; prefix.
+          ((eq current-prefix-arg nil)
+           (setq show-hint t)
+           (cdr (assq 0 LaTeX-includegraphics-options-alist)))
+          (t
+           (cdr (assq 0 LaTeX-includegraphics-options-alist)))))
+        ;; Order the optional aruments like in the tables in epslatex.ps,
+        ;; page 14.  But collect y-or-n options at the end, so that the use
+        ;; can skip some options by typing `RET RET ... RET n n n ... n'
+        ;;
+        ;; Options from Table 1 (epslatex.ps, page 14):
+        (totalheight
+         (TeX-arg-maybe
+          'totalheight incl-opts
+          '(read-string
+            (concat "Total Height (" TeX-default-unit-for-image "): "))))
+        (height
+         (TeX-arg-maybe
+          'height incl-opts
+          ;; Either totalheight or height make sense:
+          '(when (zerop (length totalheight))
+             (read-string
+              (concat "Figure height (" TeX-default-unit-for-image "): ")))))
+        (width
+         (TeX-arg-maybe
+          'width incl-opts
+          '(read-string
+            (concat "Figure width (" TeX-default-unit-for-image "): "))))
+        (scale
+         (TeX-arg-maybe
+          'angle incl-opts
+          ;; If size is already specified, don't ask for scale:
+          '(when (zerop (+ (length totalheight)
+                           (length height)
+                           (length width)))
+             (read-string "Scale: "))))
+        (angle
+         (TeX-arg-maybe
+          'angle incl-opts
+          '(read-string "Rotation angle: ")))
+        (origin
+         (TeX-arg-maybe
+          'origin incl-opts
+          '(read-string
+            (concat
+             "Origin (any combination of `lcr' (horizontal) "
+             "and `tcbB' (vertical)): "))))
+        (page ;; Not in any table; Only for PDF.
+         (TeX-arg-maybe
+          'page incl-opts
+          '(read-string "Page: ")))
+        (bb
+         (TeX-arg-maybe
+          'bb incl-opts
+          '(y-or-n-p "Set Bounding Box? ")))
+        ;; Table 2:
+        (viewport
+         (TeX-arg-maybe
+          'viewport incl-opts
+          '(y-or-n-p "Set viewport? ")))
+        (trim
+         (TeX-arg-maybe
+          'trim incl-opts
+          '(and (not viewport)
+                (y-or-n-p "Set trim? "))))
+        ;; Table 3:
+        (clip
+         (TeX-arg-maybe
+          'clip incl-opts
+          ;; If viewport, we also use clip.
+          '(or viewport
+               (y-or-n-p "Clipping figure? "))))
+        (keepaspectratio
+         (TeX-arg-maybe
+          'keepaspectratio incl-opts
+          ;; If we have width and [total]height...
+          '(or (and (not (zerop (length width)))
+                    (or (not (zerop (length totalheight)))
+                        (not (zerop (length height)))))
+               (y-or-n-p "Keep Aspectratio? "))))
+        ;; Used for bb, trim, viewport, ...:
+        llx lly urx ury)
+    ;; Now insert stuff...
+    (when (not (zerop (length totalheight)))
+      (insert
+       maybe-left-brace maybe-comma "totalheight="
+       (car (TeX-string-divide-number-unit totalheight))
+       (if (zerop
+           (length
+            (car (cdr (TeX-string-divide-number-unit totalheight)))))
+          TeX-default-unit-for-image
+        (car (cdr (TeX-string-divide-number-unit totalheight)))))
+      (setq maybe-comma ",")
+      (setq maybe-left-brace ""))
+    (when (not (zerop (length height)))
+      (insert maybe-left-brace maybe-comma
+             "height=" (car (TeX-string-divide-number-unit height))
+             (if (zerop
+                  (length
+                   (car (cdr (TeX-string-divide-number-unit height)))))
+                 TeX-default-unit-for-image
+               (car (cdr (TeX-string-divide-number-unit height)))))
+      (setq maybe-comma ",")
+      (setq maybe-left-brace ""))
+    (when (not (zerop (length width)))
+      (insert maybe-left-brace maybe-comma
+             "width=" (car (TeX-string-divide-number-unit width))
+             (if (zerop
+                  (length
+                   (car (cdr (TeX-string-divide-number-unit width)))))
+                 TeX-default-unit-for-image
+               (car (cdr (TeX-string-divide-number-unit width)))))
+      (setq maybe-comma ",")
+      (setq maybe-left-brace ""))
+    (when (not (zerop (length scale)))
+      (insert maybe-left-brace maybe-comma "scale=" scale)
+      (setq maybe-comma ",")
+      (setq maybe-left-brace ""))
+    (when (not (zerop (length angle)))
+      (insert maybe-left-brace maybe-comma "angle=" angle)
+      (setq maybe-comma ",")
+      (setq maybe-left-brace ""))
+    (when (not (zerop (length origin)))
+      (insert maybe-left-brace maybe-comma "origin=" origin)
+      (setq maybe-comma ",")
+      (setq maybe-left-brace ""))
+    (when bb
+      (setq llx (read-string "Bounding Box lower left x: "))
+      (setq lly (read-string "Bounding Box lower left y: "))
+      (setq urx (read-string "Bounding Box upper right x: "))
+      (setq ury (read-string "Bounding Box upper right y: "))
+      (insert maybe-left-brace maybe-comma
+             "bb=" llx " " lly " " urx " " ury)
+      (setq maybe-comma ",")
+      (setq maybe-left-brace ""))
+    ;;
+    (when viewport
+      (setq llx (read-string "Viewport lower left x: "))
+      (setq lly (read-string "Viewport lower left y: "))
+      (setq urx (read-string "Viewport upper right x: "))
+      (setq ury (read-string "Viewport upper right y: "))
+      (insert maybe-left-brace maybe-comma
+             "viewport=" llx " " lly " " urx " " ury)
+      (setq maybe-comma ",")
+      (setq maybe-left-brace ""))
+    (when trim
+      (setq llx (read-string "Trim lower left x: "))
+      (setq lly (read-string "Trim lower left y: "))
+      (setq urx (read-string "Trim Upper right x: "))
+      (setq ury (read-string "Trim Upper right y: "))
+      (insert maybe-left-brace maybe-comma
+             "trim=" llx " " lly " " urx " " ury)
+      (setq maybe-comma ",")
+      (setq maybe-left-brace ""))
+    ;;
+    (when clip
+      (insert maybe-left-brace maybe-comma "clip")
+      (setq maybe-comma ",")
+      (setq maybe-left-brace ""))
+    (when keepaspectratio
+      (insert maybe-left-brace maybe-comma "keepaspectratio")
+      (setq maybe-comma ",")
+      (setq maybe-left-brace ""))
+    ;;
+    (when (not (zerop (length page)))
+      (insert maybe-left-brace maybe-comma "page=" page)
+      (setq maybe-comma ",")
+      (setq maybe-left-brace ""))
+    ;;
+    (if (zerop (length maybe-left-brace))
+       (insert "]"))
+    (TeX-insert-braces 0)
+    (insert
+     (if LaTeX-includegraphics-strip-extension-flag
+        ;; We don't have `replace-regexp-in-string' in all (X)Emacs versions:
+        (with-temp-buffer
+          (insert image-file)
+          (goto-char (point-max))
+          (when (search-backward-regexp (LaTeX-includegraphics-extensions)
+                                        nil t 1)
+            (replace-match ""))
+          (buffer-string))
+       image-file))
+    (when show-hint
+      (message
+       (concat
+       "Adding `C-u C-u' before the command asks for more optional arguments."
+       "\nSee `LaTeX-includegraphics-options-alist' for details."))
+      (sit-for 3))
+    t))
+
+;;; graphicx.el ends here
diff --git a/packages/auctex/style/harvard.el b/packages/auctex/style/harvard.el
new file mode 100644 (file)
index 0000000..ce591e2
--- /dev/null
@@ -0,0 +1,127 @@
+;;; harvard.el --- Support for Harvard Citation style package for AUCTeX.
+
+;; Copyright (C) 1994,1997,2005,2012  Free Software Foundation, Inc.
+
+;; Harvard citation style is from Peter Williams
+;; available on the CTAN servers
+
+;; Author: Berwin Turlach <berwin.turlach@anu.edu.au>
+;; Version: $Id: harvard.el,v 1.10 2008/02/03 14:53:30 angeli Exp $
+
+;; 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, 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, write to the Free Software Foundation,
+;; Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+;;; Code:
+
+(TeX-add-style-hook "harvard"
+ (function
+  (lambda ()
+
+    (LaTeX-add-environments
+     '("thebibliography" LaTeX-env-harvardbib ignore))
+
+    (TeX-add-symbols
+     "harvardand"
+     '("citeasnoun"
+       (TeX-arg-conditional TeX-arg-cite-note-p ([ "Note" ]) nil)
+       TeX-arg-cite)
+     '("possessivecite"
+       (TeX-arg-conditional TeX-arg-cite-note-p ([ "Note" ]) nil)
+       TeX-arg-cite)
+     '("citeaffixed"
+       (TeX-arg-conditional TeX-arg-cite-note-p ([ "Note" ]) nil)
+       TeX-arg-cite "Affix")
+     '("citeyear"
+       (TeX-arg-conditional TeX-arg-cite-note-p ([ "Note" ]) nil)
+       TeX-arg-cite)
+     '("citename"
+       (TeX-arg-conditional TeX-arg-cite-note-p ([ "Note" ]) nil)
+       TeX-arg-cite)
+     '("citationstyle"
+       (TeX-arg-eval completing-read "Citation style: " '(("agsm") ("dcu"))))
+     '("citationmode"
+       (TeX-arg-eval completing-read "Citation mode: "
+                     '(("full") ("abbr") ("default"))))
+     '("harvardparenthesis"
+       (TeX-arg-eval completing-read "Harvardparenthesis: "
+                     '(("round") ("curly") ("angle") ("square"))))
+     '("bibliographystyle"
+       (TeX-arg-eval
+       completing-read "Bibliography style: "
+        '(("agsm") ("apsr") ("dcu") ("jmr") ("jphysicsB") ("kluwer") ("nederlands") ("econometrica")))
+       ignore)
+     '("harvarditem" [ "Short citation" ]
+       "Complete citation" "Year" TeX-arg-define-cite))
+
+    (setq TeX-complete-list
+         (append '(("\\\\citeasnoun\\[[^]\n\r\\%]*\\]{\\([^{}\n\r\\%,]*\\)"
+                     1 LaTeX-bibitem-list "}")
+                    ("\\\\citeasnoun{\\([^{}\n\r\\%,]*\\)" 1
+                     LaTeX-bibitem-list "}")
+                    ("\\\\possessivecite\\[[^]\n\r\\%]*\\]{\\([^{}\n\r\\%,]*\\)" 
+                     1 LaTeX-bibitem-list "}")
+                    ("\\\\possessivecite{\\([^{}\n\r\\%,]*\\)" 1
+                     LaTeX-bibitem-list "}")
+                    ("\\\\citename\\[[^]\n\r\\%]*\\]{\\([^{}\n\r\\%,]*\\)"
+                     1 LaTeX-bibitem-list "}")
+                    ("\\\\citename{\\([^{}\n\r\\%,]*\\)" 1
+                     LaTeX-bibitem-list "}")
+                    ("\\\\citeaffixed\\[[^]\n\r\\%]*\\]{\\([^{}\n\r\\%,]*\\)"
+                     1 LaTeX-bibitem-list "}")
+                    ("\\\\citeaffixed{\\([^{}\n\r\\%,]*\\)" 1
+                     LaTeX-bibitem-list "}") 
+                    ("\\\\citeaffixed{\\([^{}\n\r\\%]*,\\)\\([^{}\n\r\\%,]*\\)"
+                     2 LaTeX-bibitem-list)
+                    ("\\\\citeyear\\[[^]\n\r\\%]*\\]{\\([^{}\n\r\\%,]*\\)"
+                     1 LaTeX-bibitem-list "}")
+                    ("\\\\citeyear{\\([^{}\n\r\\%,]*\\)" 1
+                     LaTeX-bibitem-list "}") 
+                    ("\\\\citeyear{\\([^{}\n\r\\%]*,\\)\\([^{}\n\r\\%,]*\\)"
+                     2 LaTeX-bibitem-list))
+                 TeX-complete-list))
+
+    (setq LaTeX-auto-regexp-list
+          (append '(("\\\\harvarditem{\\([a-zA-Z][^%#'()={}]*\\)}{\\([0-9][^, %\"#'()={}]*\\)}{\\([a-zA-Z][^, %\"#'()={}]*\\)}" 3 LaTeX-auto-bibitem)
+                    ("\\\\harvarditem\\[[^][\n\r]+\\]{\\([a-zA-Z][^%#'()={}]*\\)}{\\([0-9][^, %\"#'()={}]*\\)}{\\([a-zA-Z][^, %\"#'()={}]*\\)}" 3 LaTeX-auto-bibitem)
+                    )
+                  LaTeX-auto-regexp-list))
+    
+    (setq LaTeX-item-list
+         (cons '("thebibliography" . LaTeX-item-harvardbib)
+               LaTeX-item-list))
+
+    ;; Tell RefTeX
+    (when (fboundp 'reftex-set-cite-format)
+      (reftex-set-cite-format 'harvard)))))
+
+(defun LaTeX-env-harvardbib (environment &optional ignore)
+  "Insert ENVIRONMENT with label for harvarditem."
+  (LaTeX-insert-environment environment
+                           (concat TeX-grop "xx" TeX-grcl))
+  (end-of-line 0)
+  (delete-char 1)
+  (delete-horizontal-space)
+  (LaTeX-insert-item))
+
+;; Analog to LaTeX-item-bib from latex.el
+(defun LaTeX-item-harvardbib ()
+  "Insert a new harvarditem."
+  (TeX-insert-macro "harvarditem"))
+
+(defvar LaTeX-harvard-package-options '("full" "abbr" "default"
+                                       "agsmcite" "dcucite" "round"
+                                       "curly" "angle" "square" "none")
+  "Package options for the harvard package.")
+
+;; harvard.el ends here
diff --git a/packages/auctex/style/hyperref.el b/packages/auctex/style/hyperref.el
new file mode 100644 (file)
index 0000000..1f703f7
--- /dev/null
@@ -0,0 +1,124 @@
+;;; hyperref.el --- AUCTeX style for the hyperref class.
+
+;; Copyright (C) 2008 Free Software Foundation, Inc.
+
+;; Author: Ralf Angeli <angeli@caeruleus.net>
+;; Maintainer: auctex-devel@gnu.org
+;; Created: 2008-06-21
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file adds support for the hyperref package.
+
+;;; Code:
+
+(defvar LaTeX-hyperref-package-options
+  '("a4paper" "a5paper" "anchorcolor" "b5paper" "backref" "baseurl"
+    "bookmarks" "bookmarksnumbered" "bookmarksopen"
+    "bookmarksopenlevel \maxdimen" "bookmarkstype" "breaklinks"
+    "CJKbookmarks" "citebordercolor" "citecolor" "colorlinks" "debug"
+    "draft" "dvipdf" "dvipdfm" "dvipdfmx" "dvips" "dvipsone"
+    "dviwindo" "encap" "executivepaper" "extension" "filebordercolor"
+    "filecolor" "final" "frenchlinks" "hyperfigures" "hyperfootnotes"
+    "hyperindex" "hypertex" "hypertexnames" "implicit" "latex2html"
+    "legalpaper" "letterpaper" "linkbordercolor" "linkcolor"
+    "linktocpage" "menubordercolor" "menucolor" "nativepdf"
+    "naturalnames" "nesting" "pageanchor" "pagebackref"
+    "pagebordercolor" "pagecolor" "pdfauthor" "pdfborder"
+    "pdfcenterwindow" "pdfcreator" "pdfdirection" "pdfdisplaydoctitle"
+    "pdfduplex" "pdffitwindow" "pdfhighlight" "pdfkeywords" "pdflang"
+    "pdfmark" "pdfmenubar" "pdfnewwindow" "pdfnonfullscreenpagemode"
+    "pdfnumcopies" "pdfpagelayout" "pdfpagemode" "pdfpagelabels"
+    "pdfpagescrop" "pdfpagetransition" "pdfpicktrackbypdfsize"
+    "pdfprintarea" "pdfprintclip" "pdfprintpagerange"
+    "pdfprintscaling" "pdfproducer" "pdfstartpage" "pdfstartview"
+    "pdfsubject" "pdftex" "pdftitle" "pdftoolbar" "pdfview"
+    "pdfviewarea" "pdfviewclip" "pdfwindowui" "plainpages" "ps2pdf"
+    "raiselinks" "runbordercolor" "setpagesize" "tex4ht" "textures"
+    "unicode" "urlbordercolor" "urlcolor" "verbose" "vtex" "xetex")
+  "Package options for the hyperref package.")
+
+(TeX-add-style-hook
+ "hyperref"
+ (lambda ()
+   ;; hyperref.sty loads url.sty
+   (TeX-run-style-hooks "url")
+   (TeX-add-symbols
+    '("href" "URL" "Text")
+    '("nolinkurl" t)
+    '("hyperbaseurl" t)
+    '("hyperimage" "Image URL" "Text")
+    '("hyperdef" "Category" "Name" "Text")
+    '("hyperref" "URL" "Category" "Name" "Text")
+    '("hyperlink" "Name" "Text")
+    '("hypertarget" "Name" "Text")
+    '("phantomsection" 0)
+    '("autoref" TeX-arg-ref)
+    '("ref*" TeX-arg-ref)
+    '("pageref*" TeX-arg-ref)
+    '("pdfstringdef" "Macro name" "TeX string")
+    '("texorpdfstring" "TeX string" "PDF string")
+    '("hypercalcbp" t)
+    '("Acrobatmenu" "Menu option" "Text")
+    '("TextField" ["Parameters"] "Label")
+    '("CheckBox" ["Parameters"] "Label")
+    '("ChoiceMenu" ["Parameters"] "Label" "Choices")
+    '("PushButton" ["Parameters"] "Label")
+    '("Submit" ["Parameters"] "Label")
+    '("Reset" ["Parameters"] "Label")
+    '("LayoutTextField" "Label" "Field")
+    '("LayoutChoiceField" "Label" "Field")
+    '("LayoutCheckField" "Label" "Field")
+    '("MakeRadioField" "Width" "Height")
+    '("MakeCheckField" "Width" "Height")
+    '("MakeTextField" "Width" "Height")
+    '("MakeChoiceField" "Width" "Height")
+    '("MakeButtonField" "Text"))
+
+   (add-to-list 'LaTeX-verbatim-macros-with-braces-local "nolinkurl")
+   (add-to-list 'LaTeX-verbatim-macros-with-braces-local "hyperbaseurl")
+   (add-to-list 'LaTeX-verbatim-macros-with-braces-local "hyperimage")
+   (add-to-list 'LaTeX-verbatim-macros-with-braces-local "hyperref")
+
+   ;; Fontification
+   (when (and (fboundp 'font-latex-add-keywords)
+             (fboundp 'font-latex-set-syntactic-keywords)
+             (eq TeX-install-font-lock 'font-latex-setup))
+     (font-latex-add-keywords '(("href" "{{")
+                               ("nolinkurl" "{")
+                               ("hyperbaseurl" "{")
+                               ("hyperimage" "{{")
+                               ("hyperdef" "{{{")
+                               ("hyperref" "{{{{")
+                               ("hyperlink" "{{")
+                               ("hypertarget" "{{")
+                               ("autoref" "{")
+                               ("ref" "*{")
+                               ("pageref" "*{"))
+                             'reference)
+     ;; For syntactic fontification, e.g. verbatim constructs.
+     (font-latex-set-syntactic-keywords))
+
+   ;; RefTeX
+   (when (fboundp 'reftex-ref-style-activate)
+     (reftex-ref-style-activate "Hyperref"))))
+
+;;; hyperref.el ends here
diff --git a/packages/auctex/style/icelandic.el b/packages/auctex/style/icelandic.el
new file mode 100644 (file)
index 0000000..6f4a9a1
--- /dev/null
@@ -0,0 +1,52 @@
+;;; icelandic.el --- AUCTeX style for the `icelandic' babel option.
+
+;; Copyright (C) 2007 Free Software Foundation, Inc.
+
+;; Author: Ralf Angeli <angeli@caeruleus.net>
+;; Maintainer: auctex-devel@gnu.org
+;; Created: 2007-03-11
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; Set up AUCTeX for editing Icelandic text in connection with the
+;; `icelandic' babel option.
+
+;;; Code:
+
+(defvar LaTeX-icelandic-mode-syntax-table
+  (copy-syntax-table LaTeX-mode-syntax-table)
+  "Syntax table used in LaTeX mode when using `icelandic.sty'.")
+
+(modify-syntax-entry ?\" "w" LaTeX-icelandic-mode-syntax-table)
+
+(TeX-add-style-hook
+ "icelandic"
+ (lambda ()
+   (set-syntax-table LaTeX-icelandic-mode-syntax-table)
+   (setq TeX-quote-language '("icelandic" "\"`" "\"'" t))
+   (setq LaTeX-babel-hyphen-language "icelandic")
+   ;; Fontification of quotation marks.
+   (when (fboundp 'font-latex-add-quotes)
+     (font-latex-add-quotes '("\"`" "\"'"))
+     (font-latex-add-quotes '("\"<" "\">" french)))
+   (run-hooks 'TeX-language-is-hook)))
+
+;;; icelandic.el ends here
diff --git a/packages/auctex/style/index.el b/packages/auctex/style/index.el
new file mode 100644 (file)
index 0000000..f14630b
--- /dev/null
@@ -0,0 +1,83 @@
+;;; index.el --- AUCTeX support for indices with index.sty.
+
+;; Copyright (C) 1999 Free Software Foundation, Inc.
+
+;; Author: Carsten Dominik <dominik@strw.leidenuniv.nl>
+;; Maintainer: auctex-devel@gnu.org
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Code:
+
+(TeX-add-style-hook "index"
+  (lambda ()
+
+    (TeX-add-symbols
+
+     ;; New indices
+     '("newindex" [ "Counter" ] "Tag"
+       "Extension of raw index" "Extension of processed index" "Index title")
+     '("renewindex" [ "Counter" ] "Tag" 
+       "Extension of raw index" "Extension of processed index" "Index title")
+     "makeindex"
+     '("disableindex" "Tag[,tag...]")
+
+     ;; Printing the index
+     '("printindex" [ "Indextag" ] [ "Prologue" ])
+     "indexspace"
+
+     ;; Index entries
+     '("index" [ TeX-arg-index-tag ] TeX-arg-index)
+     '("index*" [ TeX-arg-index-tag ] TeX-arg-index)
+
+     ;; Showidx-like stuff
+     "proofmodetrue" "proofmodefalse" '("indexproofstyle" "Style")
+
+     ;; Shortcuts (THESE ARE DEPRECATED AND SHOULD NOT BE USED
+     "shortindexingon" "shortindexinoff")
+
+    ;; Parsing index macros
+    (setq LaTeX-auto-regexp-list
+         (append
+
+          ;; The first regexp is faster, but less accurate
+          ;;'(("\\\\index\\*?\\[[^{}]*\\]{\\([^}]*\\)"
+          ;;   1 LaTeX-auto-index-entry))
+
+          ;; The second regexp is very good, but slower.
+          '(("\\\\index\\*?\\[[^{}]*\\]{\\([^}{]*\\({[^}{]*\\({[^}{]*\\({[^}{]*}[^}{]*\\)*}[^}{]*\\)*}[^}{]*\\)*\\)}"
+             1 LaTeX-auto-index-entry))
+
+          LaTeX-auto-regexp-list))
+
+    ;; Completion for the index entries in \index and |see commands
+    (setq TeX-complete-list
+         (append
+          '(("\\\\index\\*?\\(\\[[^][{}]*\\]\\)?{\\([^{}\n\r]*\\)" 
+             2 LaTeX-index-entry-list)
+            ("|see{\\([^}]*\\)" 1 LaTeX-index-entry-list))
+          TeX-complete-list))
+
+    ;; RefTeX support
+    (and (fboundp 'reftex-add-index-macros)
+        (reftex-add-index-macros '(index)))))
+
+(defvar LaTeX-index-package-options nil
+  "Package options for the index package.")
+
+;;; index.el ends here
diff --git a/packages/auctex/style/inputenc.el b/packages/auctex/style/inputenc.el
new file mode 100644 (file)
index 0000000..8b7be5c
--- /dev/null
@@ -0,0 +1,86 @@
+;;; inputenc.el --- AUCTeX style for `inputenc.sty'
+
+;; Copyright (C) 2005 Free Software Foundation, Inc.
+
+;; Author: Arne Jørgensen <arne@arnested.dk>
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+;; MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file adds support for `inputenc.sty'.
+
+;;; Code:
+
+(defun LaTeX-inputenc-package-options nil
+  "Prompt for package options for the inputenc package."
+  ;; separate the condition in three to silence the byte compiler
+  (if (boundp 'latex-inputenc-coding-alist)
+      (when (fboundp 'latexenc-coding-system-to-inputenc)
+       (when (fboundp 'latexenc-inputenc-to-coding-system)
+         (let ((default (latexenc-coding-system-to-inputenc
+                         (or coding-system-for-write
+                             buffer-file-coding-system)))
+               (selected 'undecided))
+           (setq selected (completing-read
+                           (if default
+                               (format "Input encoding (default %s): " default)
+                             "Input encoding: ")
+                           (mapcar 'car latex-inputenc-coding-alist)
+                           nil
+                           nil
+                           nil
+                           nil
+                           default))
+
+           ;; if necessary offer to set the coding system for saving
+           ;; this buffer based on the selected input encoding
+           (when (and (null
+                       (coding-system-equal
+                        (coding-system-base
+                         (or coding-system-for-write
+                             buffer-file-coding-system))
+                        (coding-system-base
+                         (latexenc-inputenc-to-coding-system selected))))
+                      (y-or-n-p "Set coding system for saving this buffer? ")
+                      (set-buffer-file-coding-system
+                       (coding-system-base
+                        (latexenc-inputenc-to-coding-system selected)))
+                      (message nil)))
+
+           ;; return selected input encoding
+           selected)))
+    (read-string "Input encoding: ")))
+
+(defun LaTeX-arg-inputenc-inputenc (optional)
+  "Prompt for input encoding."
+  (TeX-argument-insert (LaTeX-inputenc-package-options) nil))
+
+(TeX-add-style-hook
+ "inputenc"
+ (lambda ()
+   ;; New symbols
+   (TeX-add-symbols
+    '("inputencoding" LaTeX-arg-inputenc-inputenc))))
+
+;; Local Variables:
+;; coding: iso-8859-1
+;; End:
+
+;;; inputenc.el ends here
diff --git a/packages/auctex/style/italian.el b/packages/auctex/style/italian.el
new file mode 100644 (file)
index 0000000..4578f6f
--- /dev/null
@@ -0,0 +1,59 @@
+;;; italian.el --- Setup AUCTeX for editing Italian text.
+
+;; Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+
+;; Author: Davide G. M. Salvetti <salve@debian.org>
+;; Maintainer: Davide G. M. Salvetti <salve@debian.org>
+;; Created: 2004-05-12
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+;;
+;; I believe that the Italian correct quoting is achieved with `\"<' and
+;; `\">'.  However, I will be glad to see a normative reference. -- DGMS
+
+;;; Code:
+
+(defvar TeX-language-it-hook nil
+  "Hook run for Italian texts.")
+
+(TeX-add-style-hook
+ "italian"
+ (lambda ()
+   ;; XXX: Handle former customizations of the now defunct
+   ;; Italian-specific variables.  References to the respective
+   ;; variables are to be deleted in future versions. (now = 2005-04-01)
+   (unless (eq (car TeX-quote-language) 'override)
+     (let ((open-quote (if (and (boundp 'LaTeX-italian-open-quote)
+                               LaTeX-italian-open-quote)
+                          LaTeX-italian-open-quote
+                        "\"<"))
+          (close-quote (if (and (boundp 'LaTeX-italian-close-quote)
+                                LaTeX-italian-close-quote)
+                           LaTeX-italian-close-quote
+                         "\">")))
+       (setq TeX-quote-language
+            `("italian" ,open-quote ,close-quote TeX-quote-after-quote))))
+   ;; Fontification of quotation marks.
+   (when (fboundp 'font-latex-add-quotes)
+     (font-latex-add-quotes '("\"<" "\">" french)))
+   (run-hooks 'TeX-language-it-hook)))
+
+;;; italian.el ends here
diff --git a/packages/auctex/style/j-article.el b/packages/auctex/style/j-article.el
new file mode 100644 (file)
index 0000000..1336458
--- /dev/null
@@ -0,0 +1,12 @@
+;;; j-article.el - Special code for j-article style.
+
+;; $Id: j-article.el,v 1.4 2005/03/17 10:02:06 angeli Exp $
+
+;;; Code:
+
+(TeX-add-style-hook
+ "j-article"
+ (lambda ()
+   (LaTeX-largest-level-set "section")))
+
+;;; j-article.el ends here
diff --git a/packages/auctex/style/j-book.el b/packages/auctex/style/j-book.el
new file mode 100644 (file)
index 0000000..fd7394a
--- /dev/null
@@ -0,0 +1,12 @@
+;;; j-book.el - Special code for j-book style.
+
+;; $Id: j-book.el,v 1.3 2005/03/17 10:02:06 angeli Exp $
+
+;;; Code:
+
+(TeX-add-style-hook
+ "j-book"
+ (lambda ()
+   (LaTeX-largest-level-set "chapter")))
+
+;;; j-book.el ends here
diff --git a/packages/auctex/style/j-report.el b/packages/auctex/style/j-report.el
new file mode 100644 (file)
index 0000000..ba6a266
--- /dev/null
@@ -0,0 +1,12 @@
+;;; j-report.el - Special code for j-report style.
+
+;; $Id: j-report.el,v 1.3 2005/03/17 10:02:06 angeli Exp $
+
+;;; Code:
+
+(TeX-add-style-hook
+ "j-report"
+ (lambda ()
+   (LaTeX-largest-level-set "chapter")))
+
+;;; j-report.el ends here
diff --git a/packages/auctex/style/jarticle.el b/packages/auctex/style/jarticle.el
new file mode 100644 (file)
index 0000000..b16bc69
--- /dev/null
@@ -0,0 +1,12 @@
+;;; jarticle.el - Special code for jarticle style.
+
+;; $Id: jarticle.el,v 1.4 2005/03/17 10:02:06 angeli Exp $
+
+;;; Code:
+
+(TeX-add-style-hook
+ "jarticle"
+ (lambda ()
+   (LaTeX-largest-level-set "section")))
+
+;;; jarticle.el ends here
diff --git a/packages/auctex/style/jbook.el b/packages/auctex/style/jbook.el
new file mode 100644 (file)
index 0000000..2215477
--- /dev/null
@@ -0,0 +1,12 @@
+;;; jbook.el - Special code for jbook style.
+
+;; $Id: jbook.el,v 1.3 2005/03/17 10:02:06 angeli Exp $
+
+;;; Code:
+
+(TeX-add-style-hook
+ "jbook"
+ (lambda ()
+   (LaTeX-largest-level-set "chapter")))
+
+;;; jbook.el ends here
diff --git a/packages/auctex/style/jreport.el b/packages/auctex/style/jreport.el
new file mode 100644 (file)
index 0000000..7e245aa
--- /dev/null
@@ -0,0 +1,13 @@
+;;; jreport.el - Special code for jreport style.
+
+;; $Id: jreport.el,v 1.3 2005/03/17 10:02:06 angeli Exp $
+
+;;; Code:
+
+(TeX-add-style-hook
+ "jreport"
+ (lambda ()
+   (LaTeX-largest-level-set "chapter")))
+
+
+;;; jreport.el ends here
diff --git a/packages/auctex/style/jsarticle.el b/packages/auctex/style/jsarticle.el
new file mode 100644 (file)
index 0000000..cf051f9
--- /dev/null
@@ -0,0 +1,12 @@
+;;; jsarticle.el - Special code for jsarticle style.
+
+;; $Id: jsarticle.el,v 1.2 2005/03/17 10:02:06 angeli Exp $
+
+;;; Code:
+
+(TeX-add-style-hook
+ "jsarticle"
+ (lambda ()
+   (LaTeX-largest-level-set "section")))
+
+;;; jsarticle.el ends here
diff --git a/packages/auctex/style/jsbook.el b/packages/auctex/style/jsbook.el
new file mode 100644 (file)
index 0000000..b9ddff0
--- /dev/null
@@ -0,0 +1,12 @@
+;;; jsbook.el - Special code for jsbook style.
+
+;; $Id: jsbook.el,v 1.2 2005/03/17 10:02:06 angeli Exp $
+
+;;; Code:
+
+(TeX-add-style-hook
+ "jsbook"
+ (lambda () 
+   (LaTeX-largest-level-set "chapter")))
+
+;;; jsbook.el ends here
diff --git a/packages/auctex/style/jura.el b/packages/auctex/style/jura.el
new file mode 100644 (file)
index 0000000..2f149c4
--- /dev/null
@@ -0,0 +1,39 @@
+;;; jura.el --- AUCTeX style for `jura.cls'
+
+;; Copyright (C) 2004 Free Software Foundation, Inc.
+
+;; Author: Frank Küster <frank@kuesterei.ch>
+;; Maintainer: auctex-devel@gnu.org
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file adds support for `jura.cls'.
+
+;;; Code:
+
+(TeX-add-style-hook
+ "jura"
+ (lambda ()
+   (TeX-run-style-hooks "alphanum")))
+
+;; Local Variables:
+;; coding: iso-8859-1
+;; End:
diff --git a/packages/auctex/style/jurabib.el b/packages/auctex/style/jurabib.el
new file mode 100644 (file)
index 0000000..c48e383
--- /dev/null
@@ -0,0 +1,634 @@
+;;; jurabib.el --- AUCTeX style for the `jurabib' package
+
+;; Copyright (C) 2004, 2007 Free Software Foundation, Inc.
+
+;; Author: Ralf Angeli <angeli@iwi.uni-sb.de>
+;; Maintainer: auctex-devel@gnu.org
+;; Created: 2004-10-05
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file adds support for the `jurabib' package.
+
+;; Currently only the citation-related commands are supported.  Feel
+;; free to complete the support and send the result to the AUCTeX
+;; mailing list.  But be aware that the code can only be included if
+;; you assign the copyright to the FSF.
+
+;;; Code:
+
+(TeX-add-style-hook
+ "jurabib"
+ (lambda ()
+   ;; Taken from natbib.el and adapted.
+   (let ((citecmds
+         '(("cite" . 2) ("cite*" . 2)
+           ("citetitle" . 2) ("fullcite" . 2)
+           ("citet" . 1) ("citealt" . 1)
+           ("citep" . 2) ("citealp" . 2)
+           ("citeauthor" . 2) ("citeyear" . 2)
+           ("footcite" . 2) ("footcite*" . 2)
+           ("footcitetitle" . 2) ("footfullcite" . 2)
+           ("footcitet" . 1) ("footcitealt" . 1)
+           ("footcitep" . 2) ("footcitealp" . 2)
+           ("footciteauthor" . 2) ("footciteyear" . 2))))
+     ;; Add these symbols
+     (apply 
+      'TeX-add-symbols
+      (mapcar
+       (lambda (cmd)
+        (cond 
+         ((= (cdr cmd) 0)
+          ;; No optional arguments
+          (list (car cmd) 'TeX-arg-cite))
+         ((= (cdr cmd) 1)
+          ;; Just one optional argument, the post note
+          (list
+           (car cmd)
+           '(TeX-arg-conditional TeX-arg-cite-note-p (["Post-note"]) nil)
+           'TeX-arg-cite))
+         ((= (cdr cmd) 2)
+          ;; Pre and post notes
+          (list
+           (car cmd)
+           '(TeX-arg-conditional TeX-arg-cite-note-p (natbib-note-args) nil)
+           'TeX-arg-cite))))
+       citecmds))
+     ;; Special cases
+     (TeX-add-symbols
+      ;; FIXME: Completing read for field.
+      '("citefield" ; \citefield[]{}{}
+       (TeX-arg-conditional TeX-arg-cite-note-p (["Post-note"]) nil)
+       "Field" TeX-arg-cite)
+      '("footcitefield" ; \footcitefield[]{}{}
+       (TeX-arg-conditional TeX-arg-cite-note-p (["Post-note"]) nil)
+       "Field" TeX-arg-cite))
+
+     ;; Make an entry in TeX-complete-list
+     (add-to-list
+      'TeX-complete-list
+      (list
+       (concat "\\\\\\(" 
+              (mapconcat (lambda (x) (regexp-quote (car x)))
+                         (append citecmds
+                                 '(("citefield") ("footcitefield"))) "\\|")
+              "\\)\\(\\[[^]\n\r\\%]*\\]\\)*{\\([^{}\n\r\\%,]*,\\)*"
+              "\\([^{}\n\r\\%,]*\\)")
+       4 'LaTeX-bibitem-list "}"))
+
+     ;; Add further symbols
+     (TeX-add-symbols
+      '("citefullfirstfortype" 1)
+      '("citenotitlefortype" 1)
+      '("citeswithoutentry" 1)
+      '("citetitlefortype" 1)
+      '("citeworkwithtitle" 1)
+      '("nextcitefull" 1)
+      '("nextcitenotitle" 1)
+      '("nextcitereset" 1)
+      '("nextciteshort" 1)
+      '("jurabibsetup" 1))
+
+     ;; Fontification
+     (when (and (featurep 'font-latex)
+               (eq TeX-install-font-lock 'font-latex-setup))
+       (font-latex-add-keywords '(("cite" "*[[{")
+                                 ("citetitle" "[[{")
+                                 ("fullcite" "[[{")
+                                 ("citet" "[{")
+                                 ("citealt" "[{")
+                                 ("citep" "[[{")
+                                 ("citealp" "[[{")
+                                 ("citeauthor" "[[{")
+                                 ("citeyear" "[[{")
+                                 ("footcite" "[[{")
+                                 ("footcite*" "[[{")
+                                 ("footcitetitle" "[[{")
+                                 ("footfullcite" "[[{")
+                                 ("footcitet" "[{")
+                                 ("footcitealt" "[{")
+                                 ("footcitep" "[[{")
+                                 ("footcitealp" "[[{")
+                                 ("footciteauthor" "[[{")
+                                 ("footciteyear" "[[{")
+                                 ("citefield" "[{{")
+                                 ("footcitefield" "[{{"))
+                               'reference)
+       (font-latex-add-keywords '(("citeswithoutentry" "{")
+                                 ("nextcitefull" "{")
+                                 ("nextcitenotitle" "{")
+                                 ("nextcitereset" "{")
+                                 ("nextciteshort" "{"))
+                               'function)
+       (font-latex-add-keywords '(("citenotitlefortype" "{")
+                                 ("citetitlefortype" "{")
+                                 ("jurabibsetup" "{"))
+                               'variable))
+
+     ;; Tell RefTeX (Thanks, Carsten)
+     (when (and (fboundp 'reftex-set-cite-format)
+               ;; Is it `reftex-cite-format' customized?
+               (not (get 'reftex-cite-format 'saved-value)))
+       ;; Check if RefTeX supports jurabib.
+       (if (assoc 'jurabib reftex-cite-format-builtin)
+          ;; Yes, use the provided default.
+          (reftex-set-cite-format 'jurabib)
+        ;; No, set it by hand.
+        (reftex-set-cite-format
+         '((?\C-m . "\\cite{%l}")
+           (?c    . "\\cite[?][]{%l}")
+           (?t    . "\\citet{%l}")
+           (?p    . "\\citep{%l}")
+           (?e    . "\\citep[e.g.][?]{%l}")
+           (?s    . "\\citep[see][?]{%l}")
+           (?u    . "\\fullcite{%l}")
+           (?i    . "\\citetitle{%l}")
+           (?a    . "\\citeauthor{%l}")
+           (?e    . "\\citefield{?}{%l}")
+           (?y    . "\\citeyear{%l}")
+           (?f    . "\\footcite{%l}")
+           (?F    . "\\footcite[?][]{%l}")
+           (?l    . "\\footfullcite{%l}"))))))
+
+   ;; FIXME: The following list is the edited output of
+   ;; `TeX-auto-generate' which probably includes internal macros of
+   ;; jurabib.  Unfortunately the macros which should be accessible to
+   ;; the user are not fully documented at the time of this writing.
+   ;; But instead of including only the limited part which is
+   ;; documented we rather give the user a bit too much.  The list
+   ;; should be reduced when there is proper documentation, though.
+   (TeX-add-symbols
+    '("Wrapquotes" 1)
+    '("apyformat" 1)
+    '("artnumberformat" 1)
+    '("artvolnumformat" 2)
+    '("artvolumeformat" 1)
+    '("artyearformat" 1)
+    '("bibAnnote" 1)
+    '("bibAnnoteFile" 1)
+    '("bibAnnotePath" 1)
+    '("bibEIMfont" 1)
+    '("bibIMfont" 1)
+    '("bibYear" 1)
+    '("bibedformat" 1)
+    '("bibedinformat" 1)
+    '("bibenf" 5)
+    '("biblenf" 5)
+    '("bibnf" 5)
+    '("bibnumberformat" 1)
+    '("bibrenf" 5)
+    '("bibrlenf" 5)
+    '("bibrnf" 5)
+    '("biburlfont" 1)
+    '("edfont" 1)
+    '("formatarticlepages" ["argument"] 2)
+    '("fsted" 1)
+    '("fullnameoxfordcrossref" 1)
+    '("incolledformat" 5)
+    '("jbArchPages" 1)
+    '("jbPages" 1)
+    '("jbannoteformat" 1)
+    '("jbapifont" 1)
+    '("jbarchnameformat" 1)
+    '("jbarchsig" 2)
+    '("jbartPages" 1)
+    '("jbartcrossrefchecked" ["argument"] 1)
+    '("jbauthorindexfont" 1)
+    '("jbbibargs" 5)
+    '("jbbibyearformat" 1)
+    '("jbcitationoyearformat" 1)
+    '("jbcitationyearformat" 1)
+    '("jbcrossrefchecked" ["argument"] 1)
+    '("jbedafti" 1)
+    '("jbedbyincollcrossreflong" 1)
+    '("jbedbyincollcrossrefshort" 1)
+    '("jbedbyincollcrossrefshortnoapy" 1)
+    '("jbedbyincollcrossrefshortwithapy" 1)
+    '("jbedition" 1)
+    '("jbeditorindexfont" 1)
+    '("jbendnote" 1)
+    '("jbflanguage" 1)
+    '("jbincollcrossref" 2)
+    '("jbisbn" 1)
+    '("jbissn" 1)
+    '("jbnote" 2)
+    '("jborganizationindexfont" 1)
+    '("jbpagesformat" 1)
+    '("jbprformat" 1)
+    '("jbrealcitation" 2)
+    '("jbshortarchformat" 1)
+    '("jbshortsubarchformat" 1)
+    '("jbsy" 1)
+    '("jbtiafed" 1)
+    '("lookatfortype" 1)
+    '("nobibliography" 1)
+    '("nocitebuthowcited" 1)
+    '("numberandseries" 2)
+    '("pageadd" 1)
+    '("pernumberformat" 1)
+    '("pervolnumformat" 2)
+    '("pervolumeformat" 1)
+    '("peryearformat" 1)
+    '("revnumberformat" 1)
+    '("revvolnumformat" 2)
+    '("revvolumeformat" 1)
+    '("revyearformat" 1)
+    '("snded" 1)
+    '("textitswitch" 1)
+    '("translator" 3)
+    '("volumeformat" 1)
+    "Bibbfsasep"
+    "Bibbfsesep"
+    "Bibbstasep"
+    "Bibbstesep"
+    "Bibbtasep"
+    "Bibbtesep"
+    "Bibchaptername"
+    "Bibetal"
+    "Edbyname"
+    "IbidemMidName"
+    "IbidemName"
+    "NAT"
+    "OpCit"
+    "Reprint"
+    "SSS"
+    "Transfrom"
+    "Volumename"
+    "addtoalllanguages"
+    "afterfoundersep"
+    "aftervolsep"
+    "ajtsep"
+    "alsothesisname"
+    "aprname"
+    "augname"
+    "bibBTsep"
+    "bibJTsep"
+    "bibPageName"
+    "bibPagesName"
+    "bibaesep"
+    "bibaldelim"
+    "bibaltformatalign"
+    "bibandname"
+    "bibanfont"
+    "bibansep"
+    "bibapifont"
+    "bibapyldelim"
+    "bibapyrdelim"
+    "bibarchpagename"
+    "bibarchpagesname"
+    "bibardelim"
+    "bibartperiodhowcited"
+    "bibatsep"
+    "bibauthormultiple"
+    "bibbdsep"
+    "bibbfsasep"
+    "bibbfsesep"
+    "bibbstasep"
+    "bibbstesep"
+    "bibbtasep"
+    "bibbtesep"
+    "bibbtfont"
+    "bibbtsep"
+    "bibbudcsep"
+    "bibces"
+    "bibchapterlongname"
+    "bibchaptername"
+    "bibcite"
+    "bibcolumnsep"
+    "bibcommenthowcited"
+    "bibcontinuedname"
+    "bibcrossrefcite"
+    "bibcrossrefciteagain"
+    "bibeandname"
+    "bibedformat"
+    "bibefnfont"
+    "bibeimfont"
+    "bibelnfont"
+    "bibenf"
+    "bibfnfmt"
+    "bibfnfont"
+    "bibhowcited"
+    "bibibidfont"
+    "bibidemPfname"
+    "bibidemPmname"
+    "bibidemPnname"
+    "bibidemSfname"
+    "bibidemSmname"
+    "bibidemSnname"
+    "bibidempfname"
+    "bibidempmname"
+    "bibidempnname"
+    "bibidemsfname"
+    "bibidemsmname"
+    "bibidemsnname"
+    "bibimfont"
+    "bibincollcrossrefcite"
+    "bibincollcrossrefciteagain"
+    "bibjtfont"
+    "bibjtsep"
+    "bibleftcolumn"
+    "bibleftcolumnadjust"
+    "bibleftcolumnstretch"
+    "biblenf"
+    "biblnfmt"
+    "biblnfont"
+    "bibnf"
+    "bibnotcited"
+    "bibpagename"
+    "bibpagesname"
+    "bibpagesnamesep"
+    "bibpldelim"
+    "bibprdelim"
+    "bibrevtfont"
+    "bibrightcolumn"
+    "bibrightcolumnadjust"
+    "bibrightcolumnstretch"
+    "bibsall"
+    "bibsdanish"
+    "bibsdutch"
+    "bibsenglish"
+    "bibsfinnish"
+    "bibsfrench"
+    "bibsgerman"
+    "bibsitalian"
+    "bibsnfont"
+    "bibsnorsk"
+    "bibsportuguese"
+    "bibsspanish"
+    "bibtabularitemsep"
+    "bibtfont"
+    "bibtotalpagesname"
+    "biburlprefix"
+    "biburlsuffix"
+    "bibvolumecomment"
+    "bibvtfont"
+    "bothaesep"
+    "bpubaddr"
+    "byname"
+    "citetitleonly"
+    "citeyearpar"
+    "commaename"
+    "commaname"
+    "dateldelim"
+    "daterdelim"
+    "decname"
+    "diffpageibidemmidname"
+    "diffpageibidemname"
+    "edbyname"
+    "edbysep"
+    "editionname"
+    "editorname"
+    "editorsname"
+    "enoteformat"
+    "etalname"
+    "etalnamenodot"
+    "febname"
+    "fifthedname"
+    "firstedname"
+    "footcitetitleonly"
+    "formatpages"
+    "foundername"
+    "fourthedname"
+    "fromdutch"
+    "fromenglish"
+    "fromfinnish"
+    "fromfrench"
+    "fromgerman"
+    "fromitalian"
+    "fromnorsk"
+    "fromportuguese"
+    "fromspanish"
+    "herename"
+    "howcitedprefix"
+    "howcitedsuffix"
+    "ibidem"
+    "ibidemmidname"
+    "ibidemname"
+    "idemPfedbyname"
+    "idemPfname"
+    "idemPmedbyname"
+    "idemPmname"
+    "idemPnedbyname"
+    "idemPnname"
+    "idemSfedbyname"
+    "idemSfname"
+    "idemSmedbyname"
+    "idemSmname"
+    "idemSnedbyname"
+    "idemSnname"
+    "idemmidname"
+    "idemname"
+    "idempfedbyname"
+    "idempfname"
+    "idempmedbyname"
+    "idempmname"
+    "idempnedbyname"
+    "idempnname"
+    "idemsfedbyname"
+    "idemsfname"
+    "idemsmedbyname"
+    "idemsmname"
+    "idemsnedbyname"
+    "idemsnname"
+    "incollinname"
+    "inname"
+    "inseriesname"
+    "janname"
+    "jbCheckedFirst"
+    "jbFirst"
+    "jbFirstAbbrv"
+    "jbJunior"
+    "jbLast"
+    "jbNotRevedNoVonJr"
+    "jbNotRevedNoVonNoJr"
+    "jbNotRevedOnlyLast"
+    "jbNotRevedVonJr"
+    "jbNotRevedVonNoJr"
+    "jbPAGES"
+    "jbPageName"
+    "jbPages"
+    "jbPagesName"
+    "jbRevedFirstNoVonJr"
+    "jbRevedFirstNoVonNoJr"
+    "jbRevedFirstOnlyLast"
+    "jbRevedFirstVonJr"
+    "jbRevedFirstVonNoJr"
+    "jbRevedNotFirstNoVonJr"
+    "jbRevedNotFirstNoVonNoJr"
+    "jbRevedNotFirstOnlyLast"
+    "jbRevedNotFirstVonJr"
+    "jbRevedNotFirstVonNoJr"
+    "jbVon"
+    "jbactualauthorfnfont"
+    "jbactualauthorfont"
+    "jbaddtomakehowcited"
+    "jbaensep"
+    "jbafterstartpagesep"
+    "jbannotatorfont"
+    "jbapifont"
+    "jbarchnamesep"
+    "jbarchpagename"
+    "jbarchpagesname"
+    "jbartPages"
+    "jbatsep"
+    "jbauthorfnfont"
+    "jbauthorfont"
+    "jbauthorfontifannotator"
+    "jbauthorinfo"
+    "jbbeforestartpagesep"
+    "jbbfsasep"
+    "jbbfsesep"
+    "jbbookedaftertitle"
+    "jbbstasep"
+    "jbbstesep"
+    "jbbtasep"
+    "jbbtesep"
+    "jbbtfont"
+    "jbbtitlefont"
+    "jbcitationyearformat"
+    "jbcrossrefchecked"
+    "jbdisablecitationcrossref"
+    "jbdoitem"
+    "jbdonotindexauthors"
+    "jbdonotindexeditors"
+    "jbdonotindexorganizations"
+    "jbdotafterbibentry"
+    "jbdotafterendnote"
+    "jbdy"
+    "jbedbyincollcrossrefcite"
+    "jbedbyincollcrossrefciteagain"
+    "jbedition"
+    "jbedseplikecite"
+    "jbeimfont"
+    "jbfirstcitepageranges"
+    "jbfootnoteformat"
+    "jbfootnotenumalign"
+    "jbfulltitlefont"
+    "jbhowcitedcomparepart"
+    "jbhowcitednormalpart"
+    "jbhowsepannotatorfirst"
+    "jbhowsepannotatorlast"
+    "jbhowsepbeforetitle"
+    "jbhowsepbeforetitleae"
+    "jbhowsepbeforetitleibidemname"
+    "jbignorevarioref"
+    "jbimfont"
+    "jbindexbib"
+    "jbindexonlyfirstauthors"
+    "jbindexonlyfirsteditors"
+    "jbindexonlyfirstorganizations"
+    "jbindextype"
+    "jblookforgender"
+    "jbmakeinbib"
+    "jbmakeinbiblist"
+    "jbmakeindexactual"
+    "jbnotsamearch"
+    "jbonlyforbib"
+    "jbonlyforcitations"
+    "jbonlyforfirstcitefullbegin"
+    "jbonlyforfirstcitefullend"
+    "jborgauthorfont"
+    "jboyearincitation"
+    "jbpagename"
+    "jbpagenamenodot"
+    "jbpages"
+    "jbpagesep"
+    "jbpagesname"
+    "jbpagesnamesep"
+    "jbsamearch"
+    "jbsamesubarch"
+    "jbsamesubarchindent"
+    "jbshorttitlefont"
+    "jbshowbibextralabel"
+    "jbssedbd"
+    "jbsubarchsep"
+    "jbsuperscripteditionafterauthor"
+    "jbtitlefont"
+    "jbts"
+    "jburldef"
+    "jbuseidemhrule"
+    "jbyear"
+    "jbyearaftertitle"
+    "julname"
+    "junname"
+    "jurthesisname"
+    "marname"
+    "mastersthesisname"
+    "mayname"
+    "nofirstnameforcitation"
+    "noibidem"
+    "noidem"
+    "nopage"
+    "novname"
+    "numbername"
+    "octname"
+    "ofseriesname"
+    "opcit"
+    "organizationname"
+    "origPAGES"
+    "origartPages"
+    "origbibces"
+    "origcrossref"
+    "origpages"
+    "osep"
+    "phdthesisname"
+    "reprint"
+    "reprintname"
+    "reviewbyname"
+    "reviewname"
+    "reviewofname"
+    "samepageibidemmidname"
+    "samepageibidemname"
+    "secondedname"
+    "sepname"
+    "sndecmd"
+    "snded"
+    "sndeditorname"
+    "sndeditorsname"
+    "technicalreportname"
+    "testnosig"
+    "textandname"
+    "texteandname"
+    "theHlvla"
+    "theHlvlb"
+    "theHlvlc"
+    "theHlvld"
+    "theHlvle"
+    "theHlvlf"
+    "theHlvlg"
+    "theHlvlh"
+    "theHlvli"
+    "theHlvlj"
+    "theHlvlk"
+    "theHlvll"
+    "thedname"
+    "thirdedname"
+    "trans"
+    "transby"
+    "transfrom"
+    "updatename"
+    "updatesep"
+    "urldatecomment"
+    "volname"
+    "volumename"
+    "volumeofname")))
+
+;;; jurabib.el ends here
diff --git a/packages/auctex/style/letter.el b/packages/auctex/style/letter.el
new file mode 100644 (file)
index 0000000..76ab4d8
--- /dev/null
@@ -0,0 +1,122 @@
+;;; letter.el - Special code for letter style.
+
+;; $Id: letter.el,v 1.4 2008/05/25 06:50:33 angeli Exp $
+
+;;; Code:
+
+;; You may want to define this in tex-site.el to contain your
+;; organizations address.  
+(defvar LaTeX-letter-sender-address ""
+  "Initial value when prompting for a sender address in the letter style.")
+
+(TeX-add-style-hook "letter"
+ (function
+  (lambda ()
+    (LaTeX-add-environments
+     '("letter" LaTeX-env-recipient))
+    (TeX-add-symbols
+     '("name" "Sender: ") 
+     '("address" "Sender address: ")
+     '("signature" "Signature: ")
+     '("opening" "Opening: ")
+     '("closing" "Closing: ")))))
+
+(defun LaTeX-env-recipient (environment)
+  "Insert ENVIRONMENT and prompt for recipient and address."
+  (let ((sender (read-string "Sender: " (user-full-name)))
+       (sender-address (read-string "Sender address: "
+                                   LaTeX-letter-sender-address))
+       (recipient (read-string "Recipient: "))
+       (address (read-string "Recipient address: "))
+       (signature (read-string "Signature: "))
+       (opening (read-string "Opening: "))
+       (closing (read-string "Closing: "))
+       (date (read-string "Date: " (LaTeX-today))))
+
+    (insert TeX-esc "name" TeX-grop sender TeX-grcl)
+    (newline-and-indent)
+    (if (not (zerop (length sender-address)))
+       (progn
+         (setq LaTeX-letter-sender-address sender-address)
+         (insert TeX-esc "address" TeX-grop sender-address TeX-grcl)
+         (newline-and-indent)))
+    (if (not (zerop (length signature)))
+       (progn
+         (insert TeX-esc "signature" TeX-grop signature TeX-grcl)
+         (newline-and-indent)))
+    (if (not (zerop (length date)))
+       (progn
+         (insert TeX-esc "def" TeX-esc "today" TeX-grop date TeX-grcl)
+         (newline-and-indent)))
+    (newline-and-indent)
+
+    (let ((indentation (current-column)))
+      (LaTeX-insert-environment
+       environment
+       (concat TeX-grop recipient
+              (if (not (zerop (length address)))
+                  (concat
+                   (if (not (zerop (length recipient)))
+                       (concat " " TeX-esc TeX-esc " "))
+                   address))
+              TeX-grcl))
+      (save-excursion                  ; Fix indentation of address
+       (if (search-backward TeX-grcl nil 'move)
+           (let ((addr-end (point-marker)))
+             (if (search-backward TeX-grop nil 'move)
+                 (let ((addr-column (current-column)))
+                   (while (search-forward
+                           (concat TeX-esc TeX-esc)
+                           (marker-position addr-end) 'move)
+                     (progn
+                       (newline)
+                       (indent-to addr-column))))))))
+      (insert "\n")
+      (indent-to indentation))
+    (insert TeX-esc "opening"
+           TeX-grop
+           (if (zerop (length opening))
+               (concat TeX-esc " ")
+             opening)
+           TeX-grcl "\n")
+
+    (indent-relative-maybe)
+    (save-excursion
+      (insert "\n" TeX-esc "closing"
+             TeX-grop
+             (if (zerop (length closing))
+                 (concat TeX-esc " ")
+               closing)
+             TeX-grcl "\n")
+      (indent-relative-maybe))))
+
+(defun LaTeX-today nil
+  "Return a string representing todays date according to flavor."
+  (interactive)
+  (let ((ctime-string (current-time-string))
+       (month-alist '(("Jan". "01")
+                      ("Feb" . "02")
+                      ("Mar" . "03")
+                      ("Apr" . "04")
+                      ("May" . "05")
+                      ("Jun" . "06")
+                      ("Jul" . "07")
+                      ("Aug" . "08")
+                      ("Sep" . "09")
+                      ("Oct" . "10")
+                      ("Nov" . "11")
+                      ("Dec" . "12"))))
+    (string-match
+     "^\\S-+\\s-+\\(\\S-+\\)\\s-+\\(\\S-+\\)\\s-+\\S-+\\s-+\\(\\S-+\\)"
+     ctime-string)
+    (let ((year (substring ctime-string (match-beginning 3) (match-end 3)))
+         (month (substring ctime-string (match-beginning 1) (match-end 1)))
+         (day (substring ctime-string (match-beginning 2) (match-end 2))))
+      (if (assoc month month-alist)
+         (progn
+           (setq month (cdr (assoc month month-alist)))
+           (if (> 2 (length day))
+               (setq day (concat "0" day)))))
+      (format "%s-%s-%s" year month day))))
+
+;;; letter.el ends here
diff --git a/packages/auctex/style/listings.el b/packages/auctex/style/listings.el
new file mode 100644 (file)
index 0000000..cfb11e9
--- /dev/null
@@ -0,0 +1,243 @@
+;;; listings.el --- AUCTeX style for `listings.sty'
+
+;; Copyright (C) 2004, 2005, 2009 Free Software Foundation, Inc.
+
+;; Author: Ralf Angeli <angeli@iwi.uni-sb.de>
+;; Maintainer: auctex-devel@gnu.org
+;; Created: 2004-10-17
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file adds support for `listings.sty'.
+;;
+;; FIXME: Please make me more sophisticated!
+
+;;; Code:
+
+;; The following are options taken from chapter 4 of the listings
+;; manual (2006/05/08 Version 1.3c).  Experimental options described
+;; in chapter 5 are not included.
+(defvar LaTeX-listings-key-val-options
+  '(;; Space and placement
+    ("float" ("t" "b" "p" "h")) ; Support [*] as an optional prefix and that
+                               ; tbph are not exclusive.
+    ("floatplacement" ("t" "b" "p" "h"))
+    ("aboveskip")
+    ("belowskip")
+    ("lineskip")
+    ("boxpos" ("b" "c" "t"))
+    ;; The printed range
+    ("print" ("true" "false"))
+    ("firstline")
+    ("lastline")
+    ("linerange")
+    ("showlines" ("true" "false"))
+    ("emptylines")
+    ("gobble")
+    ;; Languages and styles
+    ("style")
+    ("language")
+    ("alsolanguage")
+    ("defaultdialect")
+    ("printpod" ("true" "false"))
+    ("usekeywordsintag" ("true" "false"))
+    ("tagstyle")
+    ("markfirstintag")
+    ("makemacrouse" ("true" "false"))
+    ;; Figure out the appearance
+    ("basicstyle")
+    ("identifierstyle")
+    ("commentstyle")
+    ("stringstyle")
+    ("keywordstyle")
+    ("classoffset")
+    ("texcsstyle")
+    ("directivestyle")
+    ("emph")
+    ("moreemph")
+    ("deleteemph")
+    ("emphstyle")
+    ("delim")
+    ("moredelim")
+    ("deletedelim")
+    ;; Getting all characters right
+    ("extendedchars" ("true" "false"))
+    ("inputencoding") ; Could make use of `latex-inputenc-coding-alist'.
+    ("upquote" ("true" "false"))
+    ("tabsize")
+    ("showtabs" ("true" "false"))
+    ("tab")
+    ("showspaces" ("true" "false"))
+    ("showstringspaces" ("true" "false"))
+    ("formfeed")
+    ;; Line numbers
+    ("numbers" ("none" "left" "right"))
+    ("stepnumber")
+    ("numberfirstline" ("true" "false"))
+    ("numberstyle")
+    ("numbersep")
+    ("numberblanklines" ("true" "false"))
+    ("firstnumber" ("auto" "last")) ; Can also take a number.
+    ("name")
+    ;; Captions
+    ("title")
+    ("caption") ; Insert braces?
+    ("label")
+    ("nolol" ("true" "false"))
+    ("captionpos" ("t" "b")) ; Can be a subset of tb.
+    ("abovecaptionskip")
+    ("belowcaptionskip")
+    ;; Margins and line shape
+    ("linewidth")
+    ("xleftmargin")
+    ("xrightmargin")
+    ("resetmargins" ("true" "false"))
+    ("breaklines" ("true" "false"))
+    ("breakatwhitespace" ("true" "false"))
+    ("prebreak")
+    ("postbreak")
+    ("breakindent")
+    ("breakautoindent" ("true" "false"))
+    ;; Frames
+    ("frame" ("none" "leftline" "topline" "bottomline" "lines" "single"
+             "shadowbox"
+             ;; Alternative to the above values.  A subset of trblTRBL can be
+             ;; given.
+             "t" "r" "b" "l" "T" "R" "B" "L"))
+    ("frameround" ("t" "f")) ; The input actually has to be four times {t,f}.
+    ("framesep")
+    ("rulesep")
+    ("framerule")
+    ("framexleftmargin")
+    ("framexrightmargin")
+    ("framextopmargin")
+    ("framebottommargin")
+    ("backgroundcolor")
+    ("rulecolor")
+    ("fillcolor")
+    ("fulesepcolor")
+    ("frameshape")
+    ;; Indexing
+    ("index")
+    ("moreindex")
+    ("deleteindex")
+    ("indexstyle")
+    ;; Column alignment
+    ("columns" ("fixed" "flexible" "fullflexible")) ; Also supports an optional
+                                                   ; argument with {c,l,r}.
+    ("flexiblecolumns" ("true" "false"))
+    ("keepspaces" ("true" "false"))
+    ("basewidth")
+    ("fontadjust" ("true" "false"))
+    ;; Escaping to LaTeX
+    ("texcl" ("true" "false"))
+    ("mathescape" ("true" "false"))
+    ("escapechar")
+    ("escapeinside")
+    ("escapebegin")
+    ("escapeend")
+    ;; Interface to fancyvrb
+    ("fancyvrb" ("true" "false"))
+    ("fvcmdparams")
+    ("morefvcmdparams")
+    ;; Language definitions
+    ("keywordsprefix")
+    ("keywords")
+    ("morekeywords")
+    ("deletekeywords")
+    ("texcs")
+    ("moretexcs")
+    ("deletetexcs")
+    ("directives")
+    ("moredirectives")
+    ("deletedirectives")
+    ("sensitive" ("true" "false"))
+    ("alsoletter")
+    ("alsodigit")
+    ("alsoother")
+    ("otherkeywords")
+    ("tag")
+    ("string")
+    ("morestring")
+    ("deletestring")
+    ("comment")
+    ("morecomment")
+    ("deletecomment")
+    ("keywordcomment")
+    ("morekeywordcomment")
+    ("deletekeywordcomment")
+    ("keywordcommentsemicolon")
+    ("podcomment" ("true" "false")))
+  "Key=value options for listings macros and environments.")
+
+(TeX-add-style-hook
+ "listings"
+ (lambda ()
+   ;; New symbols
+   (TeX-add-symbols
+    '("lstalias" ["Alias dialect"] "Alias" ["Dialect"] "Language")
+    '("lstdefinestyle" "Style name"
+      (TeX-arg-key-val LaTeX-listings-key-val-options))
+    '("lstinline" TeX-arg-verb)
+    '("lstinputlisting" [TeX-arg-key-val LaTeX-listings-key-val-options]
+      TeX-arg-file)
+    "lstlistoflistings"
+    '("lstnewenvironment" "Name" ["Number or arguments"] ["Default argument"]
+      "Starting code" "Ending code")
+    '("lstset" (TeX-arg-key-val LaTeX-listings-key-val-options)))
+   ;; New environments
+   (LaTeX-add-environments
+    '("lstlisting" LaTeX-env-args
+      [TeX-arg-key-val LaTeX-listings-key-val-options]))
+   ;; Filling
+   (make-local-variable 'LaTeX-indent-environment-list)
+   (add-to-list 'LaTeX-indent-environment-list
+               '("lstlisting" current-indentation))
+   (make-local-variable 'LaTeX-verbatim-regexp)
+   (setq LaTeX-verbatim-regexp (concat LaTeX-verbatim-regexp "\\|lstlisting"))
+   (add-to-list 'LaTeX-verbatim-environments-local "lstlisting")
+   (add-to-list 'LaTeX-verbatim-macros-with-delims-local "lstinline")
+   (add-to-list 'LaTeX-verbatim-macros-with-braces-local "lstinline")
+   ;; Fontification
+   (when (and (fboundp 'font-latex-add-keywords)
+             (fboundp 'font-latex-set-syntactic-keywords)
+             (eq TeX-install-font-lock 'font-latex-setup))
+     (font-latex-add-keywords '(("lstnewenvironment" "{[[{{")) 'function)
+     (font-latex-add-keywords '(("lstinputlisting" "[{")) 'reference)
+     (font-latex-add-keywords '(("lstinline" "[{") ; The second argument should
+                                                  ; actually be verbatim.
+                               ("lstlistoflistings" ""))
+                             'textual)
+     (font-latex-add-keywords '(("lstalias" "{{")
+                               ("lstdefinestyle" "{{")
+                               ("lstset" "{"))
+                             'variable)
+     ;; For syntactic fontification, e.g. verbatim constructs.
+     (font-latex-set-syntactic-keywords)
+     ;; Tell font-lock about the update.
+     (setq font-lock-set-defaults nil)
+     (font-lock-set-defaults))))
+
+(defvar LaTeX-listings-package-options '("draft" "final" "savemem" 
+                                        "noaspects")
+  "Package options for the listings package.")
+
+;;; listings.el ends here
diff --git a/packages/auctex/style/ltx-base.el b/packages/auctex/style/ltx-base.el
new file mode 100644 (file)
index 0000000..27034a2
--- /dev/null
@@ -0,0 +1,86 @@
+;;; ltx-base.el --- AUCTeX style for basic LaTeX commands.
+
+;; Copyright (C) 2004 Free Software Foundation, Inc.
+
+;; Author: Frank Küster <frank@kuesterei.ch>
+;; Maintainer: auctex-devel@gnu.org
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file adds general support for basic LaTeX commands used for
+;; writing LaTeX class files (.cls), style files (.sty) and package
+;; files (.dtx).
+
+;;; Code:
+
+(TeX-add-style-hook
+ "ltx-base"
+ (function
+  (lambda ()
+    (TeX-add-symbols
+     '("DeclareRobustCommand" TeX-arg-define-macro [ "Number of arguments" ] t)
+     '("CheckCommand" TeX-arg-define-macro [ "Number of arguments" ] t)
+     '("@addtoreset" TeX-arg-counter "Within counter" "counter")
+     '("addvspace" "space")
+     '("addpenalty" "penalty")
+     '("ProvidesClass" "name" [ "release information" ])
+     '("ProvidesPackage" "name" [ "release information" ])
+     '("ProvidesFile" "filename" [ "release information" ])
+     '("NeedsTeXFormat" "format" [ "release" ])
+     '("DeclareOption" "option" t)
+     ;; would be great if DeclareOption RET * RET would give
+     ;; \DeclareOption*!
+     "DeclareOption*"
+     '("CurrentOption" 0)
+     '("PassOptionsToPackage" "option list" "package")
+     '("ExecuteOptions" "option list")
+     "ProcessOptions"
+     "ProcessOptions*"
+     '("OptionNotUsed" 0)
+      ;; candidate for opt/mand toggling
+     '("RequirePackage" [ "option list" ] "package" [ "release" ])
+     '("LoadClass" [ "option list" ] "class" [ "release" ])
+     "AtEndOfPackage"
+     "AtEndOfClass"
+     "AtBeginDocument"
+     "AtEndDocument"
+     '("IfFileExists" "filename" 2)
+     '("InputIfFileExists" "filename" 2)
+     '("PackageWarning" "name" t)
+     '("PackageWarningNoLine" "name" t)
+     '("PackageInfo" "name" t)
+     '("PackageError" "name" "short text" t)
+     '("ClassWarning" "name" t)
+     '("ClassWarningNoLine" "name" t)
+     '("ClassInfo" "name" t)
+     '("ClassError" "name" "short text" t)
+     '("MessageBreak" 0)
+     '("@ifpackageloaded" "package" 2)
+     '("@ifpackagelater" "package" "date" 2)
+     '("@ifpackagewith" "package" "options" 2)
+     '("message" "Log Message")
+     '("@ifundefined" "Macro Name" 2)
+     '("@ifnextchar" (TeX-arg-literal " ") (TeX-arg-free "character") 2 )
+     "expandafter"))))
+
+;; Local Variables:
+;; coding: iso-8859-1
+;; End:
diff --git a/packages/auctex/style/ltxdoc.el b/packages/auctex/style/ltxdoc.el
new file mode 100644 (file)
index 0000000..113e0df
--- /dev/null
@@ -0,0 +1,40 @@
+;;; ltxdoc.el --- AUCTeX style for `ltxdoc.cls'
+
+;; Copyright (C) 2004 Free Software Foundation, Inc.
+
+;; Author: Frank Küster <frank@kuesterei.ch>
+;; Maintainer: auctex-devel@gnu.org
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file adds support for `ltxdoc.cls'.
+
+;;; Code:
+
+(TeX-add-style-hook
+ "ltxdoc"
+ (lambda ()
+   (TeX-run-style-hooks "doc")
+   (TeX-run-style-hooks "ltx-base")))
+
+;; Local Variables:
+;; coding: iso-8859-1
+;; End:
diff --git a/packages/auctex/style/makeidx.el b/packages/auctex/style/makeidx.el
new file mode 100644 (file)
index 0000000..3425e49
--- /dev/null
@@ -0,0 +1,48 @@
+;;; makeidx.el --- AUCTeX support for makeidx.sty
+
+;; Copyright (C) 1999 Free Software Foundation, Inc.
+
+;; Author: Carsten Dominik <dominik@strw.leidenuniv.nl>
+;; Maintainer: auctex-devel@gnu.org
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Code:
+
+(TeX-add-style-hook "makeidx"
+  (lambda ()
+    (TeX-add-symbols 
+     "printindex" "indexspace")
+
+    ;; Parsing the default index macro is defined in latex.el
+    ;; The same is true form completion in the index macro
+
+    ;; Completion for the |see macro
+    (setq TeX-complete-list
+         (append
+          '(("|see{\\([^{}\n\r]*\\)" 1 LaTeX-index-entry-list))
+          TeX-complete-list))
+
+    ;; RefTeX support
+    (and (fboundp 'reftex-add-index-macros)
+        (reftex-add-index-macros '(default)))))
+
+(defvar LaTeX-makeidx-package-options nil
+  "Package options for the makeidx package.")
+
+;;; makeidx.el ends here
diff --git a/packages/auctex/style/mdwlist.el b/packages/auctex/style/mdwlist.el
new file mode 100644 (file)
index 0000000..2e2634d
--- /dev/null
@@ -0,0 +1,63 @@
+;;; mdwlist.el --- AUCTeX style for `mdwlist.sty'
+
+;; Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+
+;; Maintainer: auctex-devel@gnu.org
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file adds support for `mdwlist.sty'.
+
+;;; Code:
+
+(TeX-add-style-hook
+ "mdwlist"
+ (lambda ()
+   (TeX-add-symbols
+    '("makecompactlist" "New environment" "Existing environment")
+    '("suspend" "Environment") ; this could be done nicer by automatically
+    '("resume" "Environment")) ; determining the environment
+   (LaTeX-add-environments
+    '("enumerate*" LaTeX-env-item)
+    '("itemize*" LaTeX-env-item)
+    '("description*" LaTeX-env-item))
+   ;; Indentation and filling
+   (make-local-variable 'LaTeX-begin-regexp)
+   (setq LaTeX-begin-regexp (concat LaTeX-begin-regexp "\\|resume\\b"))
+   (make-local-variable 'LaTeX-end-regexp)
+   (setq LaTeX-end-regexp (concat LaTeX-end-regexp "\\|suspend\\b"))
+   (make-local-variable 'paragraph-start)
+   (setq paragraph-start (concat paragraph-start
+                                "\\|[ \t]*" TeX-comment-start-regexp "*[ \t]*"
+                                (regexp-quote TeX-esc)
+                                "\\(resume\\b\\|suspend\\b\\)"))
+   ;; Fontification
+   (when (and (featurep 'font-latex)
+             (eq TeX-install-font-lock 'font-latex-setup))
+     (font-latex-add-keywords '(("makecompactlist" "{{")
+                               ("suspend" "[{")
+                               ("resume" "[{["))
+                             'function))))
+
+(defvar LaTeX-mdwlist-package-options nil
+  "Package options for the mdwlist package.")
+
+;;; mdwlist.el ends here
diff --git a/packages/auctex/style/multido.el b/packages/auctex/style/multido.el
new file mode 100644 (file)
index 0000000..786185e
--- /dev/null
@@ -0,0 +1,52 @@
+;;; multido.el --- AUCTeX style for `multido.sty'
+
+;; Copyright (C) 2007 Free Software Foundation, Inc.
+
+;; Author: Holger Sparr <holger.sparr@gmx.net>
+;; Created: 21 Jun 2007
+;; Based on: Jean-Philippe Georget's multido.el
+;; Keywords: latex, pstricks, auctex, emacs
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file adds support for `multido.sty'.
+
+;;; TODO:
+;;
+;; -- better argument support for multido
+;; -- parsing for fpAdd resp. fpSub
+
+;;; Code:
+
+(TeX-add-style-hook
+ "multido"
+ (function
+  (lambda ()
+    (TeX-add-symbols
+     '("multido" "\var=<start value>+-<inc>" "Repititions" t)
+     '("Multido" "\var=<start value>+-<inc>" "Repititions" t)
+     '("mmultido" "\var=<start value>+-<inc>" "Repititions" t)
+     '("MMultido" "\var=<start value>+-<inc>" "Repititions" t)
+     "multidostop"
+     "multidocount"
+     '("fpAdd" "Summand 1" "Summand 2" "Register")
+     '("fpSub" "Minuend" "Subtrahend" "Register")))))
+
+;;; multido.el ends here
diff --git a/packages/auctex/style/multind.el b/packages/auctex/style/multind.el
new file mode 100644 (file)
index 0000000..45c710b
--- /dev/null
@@ -0,0 +1,61 @@
+;;; multind.el --- AUCTeX support for multiple indices with multind.sty.
+
+;; Copyright (C) 1999 Free Software Foundation, Inc.
+
+;; Author: Carsten Dominik <dominik@strw.leidenuniv.nl>
+;; Maintainer: auctex-devel@gnu.org
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Code:
+
+(TeX-add-style-hook "multind"
+  (lambda ()
+
+    ;; Commands
+    (TeX-add-symbols
+     '("makeindex" "Indextag")
+     '("index" TeX-arg-index-tag TeX-arg-index)
+     '("printindex" TeX-arg-index-tag "Title")
+     "printindex" "indexspace")
+
+    ;; Parsing index macros
+    (setq LaTeX-auto-regexp-list
+         (append
+          ;; The first regexp is faster, but less accurate
+          ;; '(("\\\\index\\*?{[^{}]*}{\\([^}]*\\)" 1 LaTeX-auto-index-entry))
+          ;; The second regexp is very good, but slower
+          '(("\\\\index\\*?{[^{}]*}{\\([^}{]*\\({[^}{]*\\({[^}{]*\\({[^}{]*}[^}{]*\\)*}[^}{]*\\)*}[^}{]*\\)*\\)}"
+             1 LaTeX-auto-index-entry))
+          LaTeX-auto-regexp-list))
+
+    ;; Completion for index entries in the |see and \index commands
+    (setq TeX-complete-list 
+         (append
+          '(("\\\\index{[^{}]*}{\\([^{}\n\r]*\\)" 1 LaTeX-index-entry-list)
+            ("|see{\\([^}]*\\)" 1 LaTeX-index-entry-list))
+          TeX-complete-list))
+
+    ;; RefTeX support
+    (and (fboundp 'reftex-add-index-macros)
+        (reftex-add-index-macros '(multind)))))
+
+(defvar LaTeX-multind-package-options nil
+  "Package options for the multind package.")
+
+;;; multind.el ends here
diff --git a/packages/auctex/style/natbib.el b/packages/auctex/style/natbib.el
new file mode 100644 (file)
index 0000000..3124306
--- /dev/null
@@ -0,0 +1,110 @@
+;;; natbib.el --- Style hook for the NatBib package
+;;;
+;;; AUTHOR: Carsten Dominik <dominik@strw.leidenuniv.nl>
+;;;         building on older code from Berwin Turlach
+
+;;; Code:
+
+(TeX-add-style-hook "natbib"
+ (function
+  (lambda ()
+    ;; The number in the cdr of the following list indicates how many
+    ;; optional note arguments we consider useful.  Prompting for those
+    ;; arguments will still depend upon `TeX-arg-cite-note-p'.
+    (let  ((citecmds 
+           '(("cite" . 0)
+             ("citet" . 1) ("citet*" . 1) ("citealt" . 1) ("citealt*" . 1)
+             ("citep" . 2) ("citep*" . 2) ("citealp" . 2) ("citealp*" . 2)
+             ("citeauthor" . 0) ("citeauthor*" . 0) ("citefullauthor" . 0)
+             ("citeyear" . 0) ("citeyearpar" . 0)
+             ("shortcites" . 0))))
+
+      ;; Add these symbols
+      (apply 
+       'TeX-add-symbols
+       (mapcar
+       (lambda (cmd)
+         (cond 
+          ((= (cdr cmd) 0)
+           ;; No optional arguments
+           (list (car cmd) 'TeX-arg-cite))
+          ((= (cdr cmd) 1)
+           ;; Just one optional argument, the post note
+           (list
+            (car cmd)
+            '(TeX-arg-conditional TeX-arg-cite-note-p (["Post-note"]) nil)
+            'TeX-arg-cite))
+          ((= (cdr cmd) 2)
+           ;; Pre and post notes
+           (list
+            (car cmd)
+            '(TeX-arg-conditional TeX-arg-cite-note-p (natbib-note-args) nil)
+            'TeX-arg-cite))))
+      citecmds))
+
+      ;; Add the other symbols
+      (TeX-add-symbols
+       '("citetext" "Text")
+       '("bibpunct" ["Post note separator"] 
+                "Opening bracket"
+                "Closing bracket"
+                "Punctuation between multiple citations"
+                "style [n]umeric [s]uperscript [a]uthor-year"
+                "Punctuation between author and year"
+                "Punctuation between years for common authors")
+       '("citestyle" "Style")
+       '("citeindextrue")
+       '("citeindexfalse")
+       '("citeindextype"))
+
+      ;; Make an entry in TeX-complete-list
+      (add-to-list
+       'TeX-complete-list
+       (list
+       (concat "\\\\\\(" 
+               (mapconcat (lambda (x) (regexp-quote (car x)))
+                          citecmds "\\|")
+               "\\)\\(\\[[^]\n\r\\%]*\\]\\)*{\\([^{}\n\r\\%,]*,\\)*\\([^{}\n\r\\%,]*\\)")
+       4 'LaTeX-bibitem-list "}")))
+
+    ;; Fontification
+    (when (and (fboundp 'font-latex-add-keywords)
+              (eq TeX-install-font-lock 'font-latex-setup))
+      (font-latex-add-keywords '(("cite" "*[[{")
+                                ("citet" "*[[{")
+                                ("citealt" "*[[{")
+                                ("citep" "*[[{")
+                                ("citealp" "*[[{")
+                                ("citeauthor" "*[[{")
+                                ("citefullauthor" "[[{")
+                                ("citeyear" "[[{")
+                                ("citeyearpar" "[[{")
+                                ("shortcites" "{"))
+                              'reference))
+
+    ;; Tell RefTeX
+    (if (fboundp 'reftex-set-cite-format)
+       (reftex-set-cite-format 'natbib)))))
+
+(defun natbib-note-args (optional &optional prompt definition)
+  "Prompt for two note arguments a natbib citation command."
+  (if TeX-arg-cite-note-p
+      (let* ((pre (read-string 
+                  (TeX-argument-prompt optional optional "Pre-note")))
+            (post (read-string
+                   (TeX-argument-prompt optional optional "Post-note"))))
+       (if (not (string= pre "")) (insert "[" pre "]"))
+       (if (not (string= post ""))
+           (insert "[" post "]")
+         ;; Make sure that we have an empty post note if pre is not empty
+         (if (string= pre "") (insert "[]"))))))
+
+(defvar LaTeX-natbib-package-options '("numbers" "super" "authoryear"
+                                      "round" "square" "angle" "curly"
+                                      "comma" "colon" "nobibstyle" 
+                                      "bibstyle" "openbib" "sectionbib"
+                                      "sort" "sort&compress"
+                                      "longnamesfirst" "nonamebreak")
+  "Package options for the natbib package.")
+
+;; natbib.el ends here
diff --git a/packages/auctex/style/naustrian.el b/packages/auctex/style/naustrian.el
new file mode 100644 (file)
index 0000000..0eb1294
--- /dev/null
@@ -0,0 +1,39 @@
+;;; naustrian.el --- AUCTeX style for the `naustrian' babel option.
+
+;; Copyright (C) 2009 Free Software Foundation, Inc.
+
+;; Author: Ralf Angeli <angeli@caeruleus.net>
+;; Maintainer: auctex-devel@gnu.org
+;; Created: 2009-12-28
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; Set up AUCTeX for editing Austrian text in connection with the
+;; `naustrian' babel option.
+
+;;; Code:
+
+(TeX-add-style-hook
+ "naustrian"
+ (lambda ()
+   (TeX-run-style-hooks "ngerman")))
+
+;;; naustrian.el ends here
diff --git a/packages/auctex/style/ngerman.el b/packages/auctex/style/ngerman.el
new file mode 100644 (file)
index 0000000..d6b972a
--- /dev/null
@@ -0,0 +1,46 @@
+;;; ngerman.el --- Setup AUCTeX for editing German text.
+
+;;; Commentary:
+;;
+;; Cater for some specialities of `(n)german.sty', e.g. special quote
+;; and hyphen strings or that `"' makes the following letter an
+;; umlaut.
+
+;;; Code:
+
+(defvar LaTeX-german-mode-syntax-table
+  (copy-syntax-table LaTeX-mode-syntax-table)
+  "Syntax table used in LaTeX mode when using `german.sty'.")
+
+(modify-syntax-entry ?\"  "w"  LaTeX-german-mode-syntax-table)
+
+(TeX-add-style-hook
+ "ngerman"
+ (lambda ()
+   (set-syntax-table LaTeX-german-mode-syntax-table)
+   ;; XXX: Handle former customizations of the now defunct
+   ;; German-specific variables.  References to the respective
+   ;; variables are to be deleted in future versions. (now = 2005-04-01)
+   (unless (eq (car TeX-quote-language) 'override)
+     (let ((open-quote (if (and (boundp 'LaTeX-german-open-quote)
+                               LaTeX-german-open-quote)
+                          LaTeX-german-open-quote
+                        "\"`"))
+          (close-quote (if (and (boundp 'LaTeX-german-close-quote)
+                                LaTeX-german-close-quote)
+                           LaTeX-german-close-quote
+                         "\"'"))
+          (q-after-q (if (and (boundp 'LaTeX-german-quote-after-quote)
+                              LaTeX-german-quote-after-quote)
+                         LaTeX-german-quote-after-quote
+                       t)))
+       (setq TeX-quote-language
+            `("ngerman" ,open-quote ,close-quote ,q-after-q))))
+   (setq LaTeX-babel-hyphen-language "ngerman")
+   ;; Fontification of quotation marks.
+   (when (fboundp 'font-latex-add-quotes)
+     (font-latex-add-quotes '("\"`" "\"'"))
+     (font-latex-add-quotes '("\">" "\"<" german)))
+   (run-hooks 'TeX-language-de-hook)))
+
+;;; ngerman.el ends here
diff --git a/packages/auctex/style/nicefrac.el b/packages/auctex/style/nicefrac.el
new file mode 100644 (file)
index 0000000..77aee51
--- /dev/null
@@ -0,0 +1,45 @@
+;;; nicefrac.el --- AUCTeX style for the LaTeX package `nicefrac.sty' (v0.9b)
+
+;; Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+
+;; Author: Christian Schlauer <cschl@arcor.de>
+;; Maintainer: auctex-devel@gnu.org
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file adds support for `nicefrac.sty'.
+
+;;; Code:
+
+(TeX-add-style-hook
+ "nicefrac"
+ (lambda ()
+   (TeX-add-symbols
+    '("nicefrac" [ "Font changing command" ] "Numerator" "Denominator"))
+   ;; Fontification
+   (when (and (featurep 'font-latex)
+             (eq TeX-install-font-lock 'font-latex-setup))
+     (font-latex-add-keywords '(("nicefrac" "[{{")) 'textual))))
+
+(defvar LaTeX-nicefrac-package-options '("nice" "ugly")
+  "Package options for the nicefrac package.")
+
+;;; nicefrac.el ends here
diff --git a/packages/auctex/style/nomencl.el b/packages/auctex/style/nomencl.el
new file mode 100644 (file)
index 0000000..3b04d7b
--- /dev/null
@@ -0,0 +1,70 @@
+;;; nomencl.el --- AUCTeX style for the nomencl class.
+
+;; Copyright (C) 2007 Free Software Foundation, Inc.
+
+;; Author: Ralf Angeli <angeli@caeruleus.net>
+;; Maintainer: auctex-devel@gnu.org
+;; Created: 2007-10-09
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file adds support for the nomencl package.
+
+;;; Code:
+
+(defvar LaTeX-nomencl-package-options
+  '("refeq" "norefeq" "refpage" "norefpage" "prefix" "noprefix" "cfg" "nocfg"
+    "intoc" "notintoq" "compatible" "noncompatible" "croatian" "danish"
+    "english" "french" "german" "italian" "polish" "portuguese" "russian"
+    "spanish" "ukrainian")
+  "Package options for the nomencl package.")
+
+(TeX-add-style-hook
+ "nomencl"
+ (lambda ()
+   (TeX-add-symbols
+    '("makenomenclature" 0)
+    '("printnomenclature" ["Label width"])
+    '("nomenclature" ["Prefix"] "Symbol" "Description")
+    "nomrefeq"
+    "nomrefpage"
+    "nomrefeqpage"
+    "nomnorefeq"
+    "nomnorefpage"
+    "nomnorefeqpage"
+    '("nomlabelwidth" 0)
+    '("nomname" 0)
+    '("nomgroup" 0)
+    '("nompreamble" 0)
+    '("nompostamble" 0)
+    '("nomitemsep" 0)
+    '("nomprefix" 0)
+    '("nomlabel" 0)
+    '("nomentryend" 0)
+    '("eqdeclaration" 0)
+    '("pagedeclaration" 0))
+   ;; Fontification
+   (when (and (featurep 'font-latex)
+             (eq TeX-install-font-lock 'font-latex-setup))
+     (font-latex-add-keywords '(("nomenclature" "[{{"))
+                             'reference))))
+
+;;; nomencl.el ends here
diff --git a/packages/auctex/style/paralist.el b/packages/auctex/style/paralist.el
new file mode 100644 (file)
index 0000000..a004d3c
--- /dev/null
@@ -0,0 +1,104 @@
+;;; paralist.el -- AUCTeX style for paralist.sty
+
+;; Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc.
+
+;; Author:   Ralf Angeli <angeli@iwi.uni-sb.de>
+;; Maintainer: auctex-devel@gnu.org
+;; Created:  2003-10-22
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file adds support for `paralist.sty'.
+
+;;; Code:
+
+;; Insert an itemize-ish environment and ask for an optional label
+(defun LaTeX-paralist-env-item-opt-label (environment)
+  "Insert ENVIRONMENT, an optional label and the first item."
+  (LaTeX-insert-environment
+   environment
+   (let ((label (read-string "(Optional) Label: ")))
+     (concat (unless (zerop (length label))
+               (format "[%s]" label)))))
+  (LaTeX-find-matching-begin)
+  (end-of-line 1)
+  (delete-char 1)
+  (delete-horizontal-space)
+  (LaTeX-insert-item))
+
+(TeX-add-style-hook
+ "paralist"
+ (lambda ()
+
+   ;; Add compactdesc to the list of environments which have an optional
+   ;; argument for each item.
+   (add-to-list 'LaTeX-item-list '("compactdesc" . LaTeX-item-argument))
+
+   ;; New symbols
+   (TeX-add-symbols
+    '("pointedenum")
+    '("pointlessenum")
+    '("paradescriptionlabel")
+    '("setdefaultitem" "First level" "Second level" "Third level"
+      "Fourth level")
+    '("setdefaultenum" "First level" "Second level" "Third level"
+      "Fourth level")
+    '("setdefaultleftmargin" "First level" "Second level" "Third level"
+      "Fourth level" "Fifth level" "Sixth level"))
+
+   ;; New environments
+   (LaTeX-add-environments
+    '("asparaenum" LaTeX-paralist-env-item-opt-label)
+    '("inparaenum" LaTeX-paralist-env-item-opt-label)
+    '("compactenum" LaTeX-paralist-env-item-opt-label)
+    '("asparaitem" LaTeX-paralist-env-item-opt-label)
+    '("inparaitem" LaTeX-paralist-env-item-opt-label)
+    '("compactitem" LaTeX-paralist-env-item-opt-label)
+    '("compactdesc" LaTeX-env-item)
+    ;; FIXME: Should not be available if package is loaded with option
+    ;; `olditem':
+    '("itemize" LaTeX-paralist-env-item-opt-label)
+    ;; FIXME: Should not be available if package is loaded with option
+    ;; `oldenum':
+    '("enumerate" LaTeX-paralist-env-item-opt-label)
+    ;; FIXME: Only defined if package is loaded with option
+    ;; `defblank':
+    '("asparablank" LaTeX-env-item)
+    '("inparablank" LaTeX-env-item))
+
+   ;; Fontification
+   (when (and (featurep 'font-latex)
+             (eq TeX-install-font-lock 'font-latex-setup))
+     (font-latex-add-keywords '(("setdefaultitem" "{{{{")
+                               ("setdefaultenum" "{{{{")
+                               ("setdefaultleftmargin" "{{{{{{"))
+                             'variable))))
+
+(defvar LaTeX-paralist-package-options '("newitem" "olditem" "newenum"
+                                        "oldenum" "alwaysadjust"
+                                        "neveradjust" "neverdecrease"
+                                        "increaseonly" "defblank"
+                                        "pointedenum" "pointlessenum"
+                                        "cfg" "nocfg" "flushright"
+                                        "flushleft")
+  "Package options for the paralist package.")
+
+;;; paralist.el ends here
diff --git a/packages/auctex/style/pdfsync.el b/packages/auctex/style/pdfsync.el
new file mode 100644 (file)
index 0000000..a366fd7
--- /dev/null
@@ -0,0 +1,91 @@
+;;; pdfsync.el --- AUCTeX style for `pdfsync.sty'
+
+;; Copyright (C) 2005, 2008 Free Software Foundation, Inc.
+
+;; Author: Ralf Angeli <angeli@iwi.uni-sb.de>
+;; Maintainer: auctex-devel@gnu.org
+;; Created: 2005-12-28
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file adds support for `pdfsync.sty'.
+
+;;; Code:
+
+(defun LaTeX-pdfsync-output-page ()
+  "Return page number in output file corresponding to buffer position."
+  (let* ((line (TeX-line-number-at-pos))
+        (master (TeX-active-master))
+        (file (file-name-sans-extension
+               (file-relative-name (buffer-file-name)
+                                   (file-name-directory master))))
+        (pdfsync-file (concat master ".pdfsync"))
+        (buf-live-p (get-file-buffer pdfsync-file))
+        (sync-record "0")
+        (sync-line "-1")
+        (sync-page "1")
+        last-match)
+    (when (file-exists-p pdfsync-file)
+      (with-current-buffer (find-file-noselect pdfsync-file)
+       (save-restriction
+         (goto-char (point-min))
+         ;; Narrow region to file in question.
+         (when (not (string= file master))
+           (re-search-forward (concat "^(" file "\\(.tex\\)?$") nil t)
+           (let ((beg (match-beginning 0)))
+             (goto-char beg)
+             (narrow-to-region (line-beginning-position 2)
+                               (progn (forward-sexp) (point))))
+           (goto-char (point-min)))
+         ;; Look for the record number.
+         (catch 'break
+           (while (re-search-forward "^(\\|^l \\([0-9]+\\) \\([0-9]+\\)" nil t)
+             (cond ((string= (match-string 0) "(")
+                    (goto-char (match-beginning 0))
+                    (forward-sexp))
+                   ((> (string-to-number (match-string 2)) line)
+                    (throw 'break nil))
+                   (t
+                    (setq sync-record (match-string 1)
+                          sync-line (match-string 2)
+                          last-match (match-beginning 0))))))
+         ;; Look for the page number.
+         (goto-char (or last-match (point-min)))
+         ;; There might not be any p or s lines for the current file,
+         ;; so make it possible to search further.
+         (widen)
+         (catch 'break
+           (while (re-search-forward "^p \\([0-9]+\\)" nil t)
+             (when (>= (string-to-number (match-string 1))
+                       (string-to-number sync-record))
+               (re-search-backward "^s \\([0-9]+\\)" nil t)
+               (setq sync-page (match-string 1))
+               (throw 'break nil)))))
+       ;; Kill the buffer if it was loaded by us.
+       (unless buf-live-p (kill-buffer (current-buffer)))))
+    sync-page))
+
+(TeX-add-style-hook
+ "pdfsync"
+ (lambda ()
+   (setq TeX-source-correlate-output-page-function 'LaTeX-pdfsync-output-page)))
+
+;;; pdfsync.el ends here
diff --git a/packages/auctex/style/plfonts.el b/packages/auctex/style/plfonts.el
new file mode 100644 (file)
index 0000000..d165ac2
--- /dev/null
@@ -0,0 +1,31 @@
+;;; plfonts.el - Setup AUC TeX for editing Polish text with plfonts.sty
+
+;; $Id: plfonts.el,v 1.1 1994/01/30 21:17:25 amanda Exp $
+
+;;; Commentary:
+;;
+;; `plfonts.sty' use `"' to make next character Polish.
+;; `plfonts.sty' <C> L. Holenderski, IIUW, lhol@mimuw.edu.pl
+
+;;; Code:
+
+(defvar LaTeX-plfonts-mode-syntax-table
+  (copy-syntax-table LaTeX-mode-syntax-table)
+  "Syntax table used in LaTeX mode when using `plfonts.sty'.")
+
+(modify-syntax-entry ?\"  "w"  LaTeX-plfonts-mode-syntax-table)
+
+(TeX-add-style-hook "plfonts"
+ (function (lambda ()
+   (set-syntax-table LaTeX-plfonts-mode-syntax-table)
+   (make-local-variable 'TeX-open-quote)
+   (make-local-variable 'TeX-close-quote)
+   (make-local-variable 'TeX-quote-after-quote)
+   (make-local-variable 'TeX-command-default)
+   (setq TeX-open-quote "\"<")
+   (setq TeX-close-quote "\">")
+   (setq TeX-quote-after-quote t)
+   (setq TeX-command-default "plLaTeX")
+   (run-hooks 'TeX-language-pl-hook))))
+
+;;; plfonts.el ends here
diff --git a/packages/auctex/style/plhb.el b/packages/auctex/style/plhb.el
new file mode 100644 (file)
index 0000000..f933cc1
--- /dev/null
@@ -0,0 +1,31 @@
+;;; plhb.el - Setup AUC TeX for editing Polish text with plhb.sty
+
+;; $Id: plhb.el,v 1.1 1994/01/30 21:17:27 amanda Exp $
+
+;;; Commentary:
+;;
+;; `plhb.sty' use `"' to make next character Polish.
+;; `plhb.sty' <C> J. S. Bie\'n, IIUW, jsbien@mimuw.edu.pl
+
+;;; Code:
+
+(defvar LaTeX-plhb-mode-syntax-table
+  (copy-syntax-table LaTeX-mode-syntax-table)
+  "Syntax table used in LaTeX mode when using `plhb.sty'.")
+
+(modify-syntax-entry ?\"  "w"  LaTeX-plhb-mode-syntax-table)
+
+(TeX-add-style-hook "plhb"
+ (function (lambda ()
+   (set-syntax-table LaTeX-plhb-mode-syntax-table)
+   (make-local-variable 'TeX-open-quote)
+   (make-local-variable 'TeX-close-quote)
+   (make-local-variable 'TeX-command-default)
+   (make-local-variable 'TeX-quote-after-quote)
+   (setq TeX-open-quote "\"<")
+   (setq TeX-close-quote "\">")
+   (setq TeX-quote-after-quote t)
+   (setq TeX-command-default "plLaTeX")
+   (run-hooks 'TeX-language-pl-hook))))
+
+;;; plhb.el ends here
diff --git a/packages/auctex/style/polish.el b/packages/auctex/style/polish.el
new file mode 100644 (file)
index 0000000..312274a
--- /dev/null
@@ -0,0 +1,51 @@
+;;; polish.el --- AUCTeX style for the `polish' babel option.
+
+;; Copyright (C) 2007 Free Software Foundation, Inc.
+
+;; Author: Ralf Angeli <angeli@caeruleus.net>
+;; Maintainer: auctex-devel@gnu.org
+;; Created: 2007-01-08
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; Set up AUCTeX for editing Polish text in connection with the
+;; `polish' babel option.
+
+;;; Code:
+
+(defvar LaTeX-polish-mode-syntax-table
+  (copy-syntax-table LaTeX-mode-syntax-table)
+  "Syntax table used in LaTeX mode when using `polish.sty'.")
+
+(modify-syntax-entry ?\" "w" LaTeX-polish-mode-syntax-table)
+
+(TeX-add-style-hook
+ "polish"
+ (lambda ()
+   (set-syntax-table LaTeX-polish-mode-syntax-table)
+   (setq TeX-quote-language '("polish" "\"`" "\"'" t))
+   ;; Fontification of quotation marks.
+   (when (fboundp 'font-latex-add-quotes)
+     (font-latex-add-quotes '("\"`" "\"'"))
+     (font-latex-add-quotes '("\"<" "\">" french)))
+   (run-hooks 'TeX-language-pl-hook)))
+
+;;; polish.el ends here
diff --git a/packages/auctex/style/polski.el b/packages/auctex/style/polski.el
new file mode 100644 (file)
index 0000000..1f5d62e
--- /dev/null
@@ -0,0 +1,54 @@
+;;; polski.el --- AUCTeX style for `polski.sty'.
+
+;; Copyright (C) 2007 Free Software Foundation, Inc.
+
+;; Author: Ralf Angeli <angeli@caeruleus.net>
+;; Maintainer: auctex-devel@gnu.org
+;; Created: 2007-01-11
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; Set up AUCTeX for editing Polish text in connection with
+;; `polski.sty'.
+
+;;; Code:
+
+(defvar LaTeX-polski-package-options
+  '("plmath" "nomathsymbols" "MeX" "T1" "QX" "OT1" "OT4" "prefixinginverb"
+    "noprefixinginverb" "roku" "r." "noroku")
+  "Package options for polski.sty.")
+
+(TeX-add-style-hook
+ "polski"
+ (lambda ()
+   (TeX-add-symbols
+    ;; Dashes
+    "dywiz"
+    "pauza"
+    "ppauza")
+   ;; Quotation marks
+   (setq TeX-quote-language '("polski" ",," "''" t))
+   ;; Fontification of quotation marks.
+   (when (fboundp 'font-latex-add-quotes)
+     (font-latex-add-quotes '(",," "''")))
+   (run-hooks 'TeX-language-pl-hook)))
+
+;;; polski.el ends here
diff --git a/packages/auctex/style/pst-grad.el b/packages/auctex/style/pst-grad.el
new file mode 100644 (file)
index 0000000..b177561
--- /dev/null
@@ -0,0 +1,65 @@
+;;; pst-grad.el --- AUCTeX style for `pst-grad.sty'
+
+;; Copyright (C) 2007 Free Software Foundation, Inc.
+
+;; Author: Holger Sparr <holger.sparr@gmx.net>
+;; Created: 21 Jun 2007
+;; Keywords: latex, pstricks, auctex, emacs
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file adds support for `pst-grad.sty'.
+
+;;; TODO:
+;;
+;; -- 
+
+;;; Code:
+
+;;; Parameters
+(defvar LaTeX-pstgrad-parameters-name-list
+  '("gradangle" "gradbegin" "gradend" "gradlines" "gradmidpoint"
+    "gradientHSB" "GradientCircle" "GradientPos" "GradientScale")
+  "A list of parameter names in pst-grad.")
+
+;;; Aliases
+(defvaralias 'LaTeX-pst-gradbegin-list 'LaTeX-pst-color-list)
+(defvaralias 'LaTeX-pst-gradend-list 'LaTeX-pst-color-list)
+
+;;; Hook
+(TeX-add-style-hook
+ "pst-grad"
+ (function
+  (lambda ()
+    (TeX-run-style-hooks
+     "pstricks")
+    (unless (member "gradient" LaTeX-pst-fillstyle-list)
+      (setq LaTeX-pst-fillstyle-list (append LaTeX-pst-fillstyle-list
+                                             '("gradient")))
+      (setq LaTeX-pst-parameters-completion-regexp
+            (concat
+             (substring LaTeX-pst-parameters-completion-regexp 0 -2)
+             "\\|gradbegin\\|gradend\\)")))
+    (make-local-variable 'LaTeX-pst-parameters-name-list)
+    (setq LaTeX-pst-parameters-name-list
+          (append LaTeX-pstgrad-parameters-name-list
+                  LaTeX-pst-parameters-name-list)))))
+
+;;; pst-grad.el ends here
diff --git a/packages/auctex/style/pst-node.el b/packages/auctex/style/pst-node.el
new file mode 100644 (file)
index 0000000..d5ff274
--- /dev/null
@@ -0,0 +1,191 @@
+;;; pst-node.el --- AUCTeX style for `pst-node.sty'
+
+;; Copyright (C) 2007 Free Software Foundation, Inc.
+
+;; Author: Holger Sparr <holger.sparr@gmx.net>
+;; Created: 21 Jun 2007
+;; Based on: Jean-Philippe Georget's pst-plot.el
+;; Keywords: latex, pstricks, auctex, emacs
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file adds support for `pst-node.sty'.
+
+;;; TODO:
+;;
+;; -- self parsing of possible node names
+;; -- adding more macro support
+
+;;; Code:
+
+(defalias 'LaTeX-pst-node 'LaTeX-pst-point)
+
+(defvar LaTeX-pstnode-parameters-completion-regexp
+  "\\(npos\\|nrot\\)"
+  "Regexp for `string-match'ing a parameter.")
+
+(defvar LaTeX-pstnode-parameters-boolean-regexp "show\\([a-zA-Z]+\\)"
+  "Regexp for `string-match'ing a parameter.")
+
+(defvar LaTeX-pstnode-npos-list '(".25" ".5" ".75" "1" "1.5" "2")
+  "A list of values for npos in nput.")
+
+(defvar LaTeX-pstnode-nrot-list '(":U" ":D" ":R" ":L")
+  "A list of values for nrot in nput.")
+
+(defvar LaTeX-pstnode-psmatrix-list
+  '("mnode" "emnode" "name" "nodealign" "mocl" "rowsep" "colsep"
+    "mnodesize")
+  "A list of values for trimode in pstribox.")
+
+;;; Parameters
+(defvar LaTeX-pstnode-parameters-history nil
+  "History of values for parameters in pst-node.")
+
+(defvar LaTeX-pstnode-parameters-value-history nil
+  "History of parameter values in pst-node.")
+
+(defvar LaTeX-pstnode-parameters-name-list
+  '("angle" "angleA" "angleB" "arcangle" "arcangleA" "arcangleB" "arm"
+    "armA" "armB" "boxsize" "colsep" "framesize" "href" "loopsize"
+    "ncurv" "ncurvA" "ncurvB" "nodesepA" "nodesepB" "npos" "nrot"
+    "offset" "offsetA" "offsetB" "radius" "vref" "Xnodesep" "XnodesepA"
+    "XnodesepB" "Ynodesep" "YnodesepA" "YnodesepB")
+  "A list of parameters' name in pst-node.")
+
+(defvar LaTeX-pstnode-parameters-name-history nil
+  "History of parameter names in pst-node.")
+
+;;; Derived Functions from pstricks.el defuns
+(defun LaTeX-pstnode-parameter-value (param)
+  "See documentation of `LaTeX-package-parameter-value'."
+  (LaTeX-package-parameter-value param "pstnode"))
+
+(defun LaTeX-pstnode-parameters-pref-and-chosen (param &optional noskip)
+  "See documentation of `LaTeX-package-parameters-pref-and-chosen'."
+  (LaTeX-package-parameters-pref-and-chosen param "pstnode" noskip))
+
+(defun LaTeX-pstnode-parameters (optional &optional preparam param)
+  "See documentation of `LaTeX-package-parameters-pref-and-chosen'."
+  (LaTeX-package-parameters optional "pstnode" preparam param))
+
+;;; Macros
+(defun LaTeX-pstnode-macro-nput (optional &optional arg)
+  "Return \\nput arguments after querying."
+  (insert "[rot=" (LaTeX-pst-angle) "]{" (LaTeX-pst-angle) "}{"
+          (LaTeX-pst-node) "}"))
+
+(defun LaTeX-pstnode-macro-cnodeput (optional &optional arg)
+  "Return \\cnodeput arguments after querying."
+  (let ((rotation (if current-prefix-arg (LaTeX-pst-angle) nil))
+        (pnt (if current-prefix-arg (LaTeX-pst-point) nil)))
+    (insert (if rotation (format "{%s}" rotation) "")
+            (if pnt (format "(%s)" pnt) "") "{" (LaTeX-pst-node) "}")))
+
+(defun LaTeX-pstnode-macro-nc (optional &optional arg)
+  "Return \\nc* arguments after querying."
+  (let ((arrows (LaTeX-pst-arrows)))
+    (insert (if arrows (format "{%s}" arrows) "") "{" (LaTeX-pst-node)
+            "}{" (LaTeX-pst-node) "}")))
+
+(defun LaTeX-pstnode-macro-pc (optional &optional arg)
+  "Return \\pc* arguments after querying."
+  (let ((arrows (LaTeX-pst-arrows)))
+    (insert (if arrows (format "{%s}" arrows) "") "(" (LaTeX-pst-point)
+            ")(" (LaTeX-pst-point) ")")))
+
+(defun LaTeX-pstnode-macro-tnabcput (optional &optional arg)
+  "Return \\t?put or \\n?put arguments after querying."
+  (TeX-argument-insert (LaTeX-pstnode-parameters-pref-and-chosen
+                        '("nrot" "npos")) optional))
+
+;;; Environments
+(defun LaTeX-pstnode-env-psmatrix (env)
+  "Return psmatrix environment with arguments."
+  (let ((opt (completing-read-multiple "Options: "
+                                       LaTeX-pstnode-psmatrix-list)))
+    (LaTeX-insert-environment env opt)))
+
+(TeX-add-style-hook
+ "pst-node"
+ (function
+  (lambda ()
+    (LaTeX-add-environments
+     '("psmatrix" LaTeX-pstnode-env-psmatrix))
+    (TeX-add-symbols
+     '("MakeShortNab" 2) '("MakeShortTablr" 4) '("PSTnodesLoaded" 0)
+     '("nput" LaTeX-pstnode-macro-nput TeX-arg-macro)
+     '("cnodeput" [LaTeX-pst-parameters] LaTeX-pstnode-macro-cnodeput t)
+     '("Cnode" [LaTeX-pstnode-parameters] LaTeX-pst-point-in-parens t)
+     '("cnode" [LaTeX-pstnode-parameters] "Radius" t)
+     '("fnode" [LaTeX-pstnode-parameters] LaTeX-pst-point-in-parens t)
+     '("fnode*" [LaTeX-pstnode-parameters] LaTeX-pst-point-in-parens t)
+     '("dotnode" [LaTeX-pstnode-parameters] LaTeX-pst-point-in-parens t)
+     '("pnode" LaTeX-pst-point-in-parens t)
+     '("Rnode" [LaTeX-pstnode-parameters ("href" "vref")]
+       (TeX-arg-eval LaTeX-pst-point) t)
+     '("rnode" [LaTeX-pstnode-parameters ("ref")]
+       (TeX-arg-eval LaTeX-pst-point) t)
+     '("circlenode" [LaTeX-pst-parameters]
+       (TeX-arg-eval LaTeX-pst-point) t)
+     '("dianode" [LaTeX-pst-parameters] "Node Name" t)
+     '("ovalnode" [LaTeX-pst-parameters] "Node Name" t)
+     '("trinode" [LaTeX-pst-parameters] "Node Name" t)
+     '("dotnode" [LaTeX-pst-parameters] LaTeX-pst-point-in-parens
+       "Node Name")
+     '("naput" [LaTeX-pstnode-macro-tnabcput] t)
+     '("nbput" [LaTeX-pstnode-macro-tnabcput] t)
+     '("ncput" [LaTeX-pstnode-macro-tnabcput] t)
+     '("taput" [LaTeX-pstnode-macro-tnabcput] t)
+     '("tbput" [LaTeX-pstnode-macro-tnabcput] t)
+     '("thput" [LaTeX-pstnode-macro-tnabcput] t)
+     '("tlput" [LaTeX-pstnode-macro-tnabcput] t)
+     '("trput" [LaTeX-pstnode-macro-tnabcput] t)
+     '("tvput" [LaTeX-pstnode-macro-tnabcput] t)
+     '("ncline" [LaTeX-pst-parameters] LaTeX-pstnode-macro-nc)
+     '("ncarc" [LaTeX-pst-parameters] LaTeX-pstnode-macro-nc)
+     '("ncdiag" [LaTeX-pst-parameters] LaTeX-pstnode-macro-nc)
+     '("ncdiagg" [LaTeX-pst-parameters] LaTeX-pstnode-macro-nc)
+     '("ncbar" [LaTeX-pst-parameters] LaTeX-pstnode-macro-nc)
+     '("ncangle" [LaTeX-pst-parameters] LaTeX-pstnode-macro-nc)
+     '("ncangles" [LaTeX-pst-parameters] LaTeX-pstnode-macro-nc)
+     '("ncloop" [LaTeX-pst-parameters] LaTeX-pstnode-macro-nc)
+     '("nccurve" [LaTeX-pst-parameters] LaTeX-pstnode-macro-nc)
+     '("nccircle" [LaTeX-pst-parameters] LaTeX-pstnode-macro-nc)
+     '("ncbox" [LaTeX-pst-parameters] LaTeX-pstnode-macro-nc)
+     '("ncarcbox" [LaTeX-pst-parameters] LaTeX-pstnode-macro-nc)
+     '("pcline" [LaTeX-pst-parameters] LaTeX-pstnode-macro-pc)
+     '("pccurve" [LaTeX-pst-parameters] LaTeX-pstnode-macro-pc)
+     '("pcarc" [LaTeX-pst-parameters] LaTeX-pstnode-macro-pc)
+     '("pcbar" [LaTeX-pst-parameters] LaTeX-pstnode-macro-pc)
+     '("pcdiag" [LaTeX-pst-parameters] LaTeX-pstnode-macro-pc)
+     '("pcdiagg" [LaTeX-pst-parameters] LaTeX-pstnode-macro-pc)
+     '("pcangle" [LaTeX-pst-parameters] LaTeX-pstnode-macro-pc)
+     '("pcangles" [LaTeX-pst-parameters] LaTeX-pstnode-macro-pc)
+     '("pcloop" [LaTeX-pst-parameters] LaTeX-pstnode-macro-pc)
+     '("pcbox" [LaTeX-pst-parameters] LaTeX-pstnode-macro-pc)
+     '("pcarcbox" [LaTeX-pst-parameters] LaTeX-pstnode-macro-pc)
+     '("psspan" (TeX-arg-eval LaTeX-pst-input-int))
+     '("psrowhook" t)
+     '("pscolhook" t))
+    (TeX-run-style-hooks
+     "pstricks"))))
+
+;;; pst-node.el ends here
diff --git a/packages/auctex/style/pst-plot.el b/packages/auctex/style/pst-plot.el
new file mode 100644 (file)
index 0000000..beae60a
--- /dev/null
@@ -0,0 +1,137 @@
+;;; pst-plot.el --- AUCTeX style for `pst-plot.sty'
+
+;; Copyright (C) 2007 Free Software Foundation, Inc.
+
+;; Author: Holger Sparr <holger.sparr@gmx.net>
+;; Created: 21 Jun 2007
+;; Based on: Jean-Philippe Georget's pst-plot.el
+;; Keywords: latex, pstricks, auctex, emacs
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file adds support for `pst-plot.sty'.
+
+;;; TODO:
+;;
+;; -- improve symbol support (especially the pstScalePoints macros)
+;; -- check for multido.el necessity
+
+;;; Code:
+
+;; Self Parsing -- see (info "(auctex)Hacking the Parser")
+(defvar LaTeX-auto-pstplot-regexp-list
+  '(("\\\\\\(save\\|read\\)data{?\\(\\\\[a-zA-Z]+\\)}?"
+     2 LaTeX-auto-pstplot))
+  "List of regular expressions to extract arguments of \\*data
+  macros.")
+
+(defvar LaTeX-auto-pstplot nil
+  "Temporary for parsing \\*data definitions.")
+
+(defun LaTeX-pstplot-cleanup ()
+  "Move symbols from `LaTeX-auto-pstplot to `TeX-auto-symbol'."
+  (mapcar (lambda (symbol)
+            ;; (setq TeX-symbol-list (cons (list symbol 0) TeX-symbol-list))
+            ;; (setq TeX-auto-symbol (cons (list symbol 0) TeX-auto-symbol)))
+            (add-to-list 'LaTeX-pstplot-datasets symbol))
+            LaTeX-auto-pstplot))
+
+(defun LaTeX-pstplot-prepare ()
+  "Clear `LaTeX-auto-pstplot' before use."
+  (setq LaTeX-auto-pstplot nil))
+
+(add-hook 'TeX-auto-prepare-hook 'LaTeX-pstplot-prepare)
+(add-hook 'TeX-auto-cleanup-hook 'LaTeX-pstplot-cleanup)
+
+;;; Parameters
+(defvar LaTeX-pstplot-datasets nil
+  "List of parsed data sets defined with \\savedata or \\readdata.")
+
+(defvar LaTeX-pstplot-parameters-name-list
+  '("axesstyle" "labels" "plotpoints" "plotstyle" "showorigin" "ticks"
+    "ticksize" "tickstyle")
+  "A list of parameters' name in pst-plot.")
+
+(defvar LaTeX-pst-ticks-list '(t "none" "all" "x" "y")
+  "A list of values for ticks in pst-plot.")
+
+(defvaralias 'LaTeX-pst-labels-list 'LaTeX-pst-ticks-list)
+
+(defvar LaTeX-pst-plotstyle-list
+  '(t "dots" "line" "polygon" "curve" "ecurve" "ccurve")
+  "A list of values for tickstyles in pst-plot.")
+
+(defvar LaTeX-pst-tickstyle-list '(t "full" "top" "bottom")
+  "A list of values for tickstyles in pst-plot.")
+
+(defvar LaTeX-pst-axesstyle-list '(t "axes" "frame" "none")
+  "A list of values for axesstyles in pst-plot.")
+
+;;; Macros
+(defun LaTeX-pst-macro-psaxes (optional &optional arg)
+  "Return \\psaxes arguments after querying."
+(let* ((cpref (if current-prefix-arg (car current-prefix-arg) 0))
+       (arrows (LaTeX-pst-arrows))
+       (pnt1 (if (> cpref 4) (LaTeX-pst-point) nil))
+       (pnt2 (if (> cpref 0) (LaTeX-pst-point) nil))
+       (pnt3 (LaTeX-pst-point)))
+  ;; insert \psaxes arguments
+  (insert (if arrows (format "{%s}" arrows) "")
+          (if pnt1 (format "(%s)" pnt1) "")
+          (if pnt2 (format "(%s)" pnt2) "") "(" pnt3 ")")))
+
+;;; Derived defuns
+(defun LaTeX-pstplot-datasets-read ()
+  (TeX-arg-compl-list "Datasets" LaTeX-pstplot-datasets))
+
+;;; Hook
+(TeX-add-style-hook
+ "pst-plot"
+ (function
+  (lambda ()
+    (mapcar 'TeX-auto-add-regexp LaTeX-auto-pstplot-regexp-list)
+    (TeX-add-symbols
+     '("readdata" "Macro Name" TeX-arg-file)
+     '("savedata" "Macro Name" ["Values"])
+     '("dataplot" ["Options"]
+       (TeX-arg-eval LaTeX-pstplot-datasets-read))
+     '("fileplot" ["Options"] TeX-arg-file)
+     '("listplot" ["Options"] "Values")
+     '("pstScalePoints" "X-Mod" "Y-Mod")
+     '("psplot" [LaTeX-pst-parameter] "xmin" "xmax" t)
+     '("parametricplot" [LaTeX-pst-parameter] "xmin" "xmax" t)
+     '("psaxes" [LaTeX-pst-parameters] LaTeX-pst-macro-psaxes)
+     "pshlabel"
+     "psvlabel")
+    (TeX-run-style-hooks
+     "pstricks"
+     "multido")
+    (unless (string-match "plotstyle"
+                          LaTeX-pst-parameters-completion-regexp)
+      (setq LaTeX-pst-parameters-completion-regexp
+            (concat
+             (substring LaTeX-pst-parameters-completion-regexp 0 -2)
+             "\\|plotstyle\\|ticks\\|tickstyle\\|axesstyle\\|labels\\)")))
+    (make-local-variable 'LaTeX-pst-parameters-name-list)
+    (setq LaTeX-pst-parameters-name-list
+          (append LaTeX-pstplot-parameters-name-list
+                  LaTeX-pst-parameters-name-list)))))
+
+;;; pst-plot.el ends here
diff --git a/packages/auctex/style/pst-slpe.el b/packages/auctex/style/pst-slpe.el
new file mode 100644 (file)
index 0000000..2c82454
--- /dev/null
@@ -0,0 +1,67 @@
+;;; pst-slpe.el --- AUCTeX style for `pst-slpe.sty'
+
+;; Copyright (C) 2007 Free Software Foundation, Inc.
+
+;; Author: Holger Sparr <holger.sparr@gmx.net>
+;; Created: 21 Jun 2007
+;; Keywords: latex, pstricks, auctex, emacs
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file adds support for `pst-slpe.sty'.
+
+;;; TODO:
+;;
+;; -- 
+
+;;; Code:
+
+;;; Parameters
+(defvar LaTeX-pstslpe-parameters-name-list
+  '("slopeangle" "slopecenter" "slopecolors" "slopebegin" "slopeend"
+    "sloperadius" "slopesteps")
+  "A list of parameter names in pst-slpe.")
+
+;;; Aliases
+(defvaralias 'LaTeX-pst-slopebegin-list 'LaTeX-pst-color-list)
+(defvaralias 'LaTeX-pst-slopeend-list 'LaTeX-pst-color-list)
+
+;;; Define hook
+(TeX-add-style-hook
+ "pst-slpe"
+ (function
+  (lambda ()
+    (TeX-run-style-hooks
+     "pstricks")
+    (unless (member "slope" LaTeX-pst-fillstyle-list)
+      (setq LaTeX-pst-fillstyle-list
+            (append LaTeX-pst-fillstyle-list
+                    '("slope" "slopes" "ccslope" "ccslopes" "radslope"
+                    "radslopes")))
+      (setq LaTeX-pst-parameters-completion-regexp
+            (concat
+             (substring LaTeX-pst-parameters-completion-regexp 0 -2)
+             "\\|slopebegin\\|slopeend\\)")))
+    (make-local-variable 'LaTeX-pst-parameters-name-list)
+    (setq LaTeX-pst-parameters-name-list
+          (append LaTeX-pstslpe-parameters-name-list
+                  LaTeX-pst-parameters-name-list)))))
+
+;;; pst-slpe.el ends here
diff --git a/packages/auctex/style/pstricks.el b/packages/auctex/style/pstricks.el
new file mode 100644 (file)
index 0000000..6e4df32
--- /dev/null
@@ -0,0 +1,866 @@
+;;; pstricks.el --- AUCTeX style for the `pstricks' package.
+
+;; Copyright (C) 2007, 2009 Free Software Foundation, Inc.
+
+;; Author: Holger Sparr <holger.sparr@gmx.net>
+;; Maintainer: auctex-devel@gnu.org
+;; Created: 2007-06-14
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+;;
+;; AUCTeX style file for PSTricks
+;;
+;; Support for basic PSTricks macros and their arguments. Separate
+;; history variables for point, angle, ... arguments.
+;;
+;; Parameter input completion together with input completion for certain
+;; parameters (e.g. linestyle, linecolor and the like).
+;;
+;; There is a PSTricks-specific support for adding new parameters to
+;; existing parameter lists or changing existing ones in optional
+;; macro arguments.  You might want to make those available through
+;; key bindings by using something like
+;; (define-key LaTeX-mode-map (kbd "C-c p a")
+;;   'LaTeX-pst-parameter-add)
+;; (define-key LaTeX-mode-map (kbd "C-c p c")
+;;   'LaTeX-pst-parameter-change-value)
+;; in a personal style file for PSTricks.
+
+;;; History:
+;;
+;; 14/06/2007 rewrite of pstricks.el based on Jean-Philippe Georget's
+;;            pstricks.el version found on <URI:
+;;            http://www.emacswiki.org/cgi-bin/wiki/pstricks.el>
+
+;;; TODO:
+;;
+;; -- Use alist or hash-table for parameter input
+;; -- Add more regularly used PSTricks macros
+;; -- Prevent errors in AUCTeX modes other than LaTeX mode.
+;; -- Check if the functionality for adding and changing parameters
+;;    can be generalized.
+
+;;; Code:
+
+;;; General Functions
+
+(defun TeX-arg-compl-list (list &optional prompt hist)
+  "Input a value after PROMPT with completion from LIST and HISTORY."
+  (let ((first (car list)))
+    (if (and first (listp first))
+        (let ((func (nth 0 first))
+              (prompt (concat (or (nth 1 first) prompt) ": "))
+              (compl (nth 2 first))
+              (hist (or (nth 3 first) hist))
+              (crm-separator (nth 4 first))
+              res)
+          (setq list (cdr list))
+          (cond ((eq func 'completing-read-multiple)
+                 (setq res (funcall func prompt list nil compl nil hist))
+                 (mapconcat 'identity res crm-separator))
+                ((eq func 'completing-read)
+                 (setq res
+                       (funcall func prompt list nil compl nil hist)))))
+      (completing-read (concat prompt ": ") list nil nil nil hist))))
+
+;; XXX: Show default value in prompt.  Perhaps extend
+;; `TeX-argument-prompt' to do that.
+(defun LaTeX-pst-what (what prompt default &optional arg)
+  "Ask for WHAT with PROMPT with DEFAULT.
+The corresponding lists LaTeX-pst-<what>-\\(list\\|history\\)
+have to exist.
+
+\(Used to define functions named LaTeX-pst-<what>.\))"
+  (let ((list (intern (concat "LaTeX-pst-" what "-list")))
+        (hist (intern (concat "LaTeX-pst-" what "-history"))))
+    (if (not arg)
+        (setq arg (TeX-arg-compl-list (symbol-value list) prompt hist)))
+    (if (string= arg "")
+        default
+      (add-to-list list arg)
+      arg)))
+
+(defun LaTeX-pst-input-int (prompt arg)
+  "Return number as string asked for with PROMPT if no number
+passed with ARG."
+  (unless (numberp arg)
+    (setq arg (read-number (concat prompt ": ") 2)))
+  (number-to-string arg))
+
+(defun LaTeX-pst-enclose-obj (symbol op cl)
+  "Enclose string returned by the `funcall' SYMBOL in OP and CL
+character."
+  (let ((str (funcall symbol)))
+    (if str (insert (char-to-string op) str (char-to-string cl)))))
+
+(defun LaTeX-package-parameter-value (param pname)
+  "Ask for possible value of parameter PARAM given as string
+available through package name PNAME and return \"param=value\"."
+  (add-to-list (intern (concat "LaTeX-" pname "-parameters-name-list"))
+               param)
+  ;; select predefined set
+  (let* ((cregexp
+          (symbol-value
+           (intern (concat "LaTeX-" pname
+                           "-parameters-completion-regexp"))))
+         (bregexp
+          (symbol-value (intern (concat "LaTeX-" pname
+                                        "-parameters-boolean-regexp"))))
+         (parlist (cond
+                   ((string-match cregexp param)
+                    (intern (concat "LaTeX-" pname "-"
+                                    (match-string 0 param) "-list")))
+                   ((string-match bregexp param)
+                    'LaTeX-pst-boolean-list)))
+         val compl)
+    ;; ask for value
+    (setq val (TeX-arg-compl-list
+               (symbol-value parlist)
+               (concat "(Press TAB for completions) " param)
+               (intern (concat "LaTeX-" pname
+                               "-parameters-value-history"))))
+    ;; FIXME: This looks broken.  `compl' is never set and unless ""
+    ;; is added to parlist (at least in the Boolean case), the prompt
+    ;; shown by `TeX-arg-compl-list' will be incorrect.
+    (if (and (not compl) parlist) (add-to-list parlist val))
+    (if (string= val "") "" (concat param "=" val))))
+
+(defun LaTeX-package-parameters-pref-and-chosen (param pname noskip)
+  "Set values for elements of PARAM from package PNAME and
+further explicitly typed in parameters and return a comma
+separated list as string."
+  (let ((allpars "")
+        (fask (intern (concat "LaTeX-" pname "-parameter-value")))
+        tpara parval)
+    (when param
+      (while param
+        (setq tpara (pop param))
+        (setq parval (funcall fask tpara))
+        (setq allpars
+              (concat allpars
+                      (if (or (string= "" allpars) (string= "" parval))
+                          "" ",") parval))))
+    ;; ask for parameter names as long as none is given
+    (when noskip
+      (while
+          (not
+           (string=
+            ""
+            (setq tpara
+                  (completing-read
+                   "Parameter name (RET to stop): "
+                   (symbol-value (intern
+                                  (concat "LaTeX-" pname
+                                          "-parameters-name-list")))
+                   nil nil nil (intern
+                                (concat "LaTeX-" pname
+                                        "-parameters-name-history"))))))
+        (setq parval (funcall fask tpara))
+        ;; concat param=value with other ones
+        (setq allpars
+              (concat allpars
+                      (if (or (string= "" allpars) (string= "" parval))
+                          ""
+                        ",")
+                      parval))))
+    (add-to-list
+     (intern (concat "LaTeX-" pname "-parameters-history")) allpars)
+    allpars))
+
+(defun LaTeX-package-parameters (optional pname preparam param)
+  "Ask for parameters and manage several parameter lists for
+package PNAME"
+  (let ((fask (intern
+               (concat "LaTeX-" pname "-parameters-pref-and-chosen")))
+        (hlist (intern (concat "LaTeX-" pname "-parameters-history")))
+        (nlist
+         (symbol-value
+          (intern (concat "LaTeX-" pname "-parameters-name-list")))))
+    ;;
+    (when (and preparam (listp preparam))
+      (setq preparam (funcall fask preparam)))
+    ;;
+    (setq param
+          (completing-read-multiple
+           (concat
+            "Params (use <Up,Down> for history or RET for choices): ")
+           nlist nil nil nil hlist))
+    ;;
+    (if (and  (string= "" (car param)) (= (length param) 1))
+        (setq param (funcall fask nil t))
+      (setq param (car (symbol-value hlist))))
+    (TeX-argument-insert
+     (if (or (string= "" preparam) (eq preparam nil))
+         param
+       (concat preparam (if (string= "" param) "" (concat "," param))))
+     optional)))
+
+;;; Points
+(defvar LaTeX-pst-point-list (list "0,0")
+  "A list of values for point in pstricks.")
+
+(defvar LaTeX-pst-point-history LaTeX-pst-point-list
+  "History of values for point in pstricks.")
+
+(defun LaTeX-pst-point ()
+  "Ask for a point and manage point list."
+  (LaTeX-pst-what "point"
+                  (concat "Point (default " (car LaTeX-pst-point-history) ")")
+                  (car LaTeX-pst-point-history)))
+
+(defun LaTeX-pst-point-in-parens (optional)
+  "Enclose point in parentheses."
+  (LaTeX-pst-enclose-obj 'LaTeX-pst-point ?( ?)))
+
+;;; Angles
+(defvar LaTeX-pst-angle-list (list "0")
+  "A list of values for angle in pstricks.")
+
+(defvar LaTeX-pst-angle-history nil
+  "History of values for angle in pstricks.")
+
+(defun LaTeX-pst-angle ()
+  "Ask for a angle and manage angle list"
+  (LaTeX-pst-what "angle"
+                  (concat "Angle (default " (car LaTeX-pst-angle-list) ")")
+                  (car LaTeX-pst-angle-list)))
+
+;;; Extension in one Direction
+(defvar LaTeX-pst-extdir-list (list "1")
+  "A list of values for extdir in pstricks.")
+
+(defvar LaTeX-pst-extdir-history nil
+  "History of values for extdir in pstricks.")
+
+(defun LaTeX-pst-extdir (descr)
+  "Ask for a extdir and manage extdir list"
+  (LaTeX-pst-what "extdir"
+                  (concat descr " (default " (car LaTeX-pst-extdir-list) ")")
+                  (car LaTeX-pst-extdir-list)))
+
+;;; Relative Points
+(defvar LaTeX-pst-delpoint-list nil
+  "A list of values for delpoint in pstricks.")
+
+(defvar LaTeX-pst-delpoint-history nil
+  "History of values for delpoint in pstricks.")
+
+;;; Arrows
+(defvar LaTeX-pst-arrows-list
+  '("->" "<-" "<->" ">-<" ">-" "-<" "<<->>" "<<-" "->>" "|-|" "|-" "-|"
+  "|*-|*" "[-]" "[-" "-]" "(-)" "(-" "-)" "*-*" "*-" "-*" "0-0" "0-"
+  "-0" "c-c" "c-" "-c" "C-C" "C-" "-C" "cc-cc" "cc-" "-cc" "|<->|" "|<-"
+  "->|" "|<*->|*" "|<*-" "->|*" "-")
+  "A list of values for arrows in pstricks.")
+
+(defvar LaTeX-pst-arrows-history nil
+  "History of values for arrows in pstricks.")
+
+;; XXX: Better ask for arrow start and end separately?
+;; `LaTeX-pst-arrows-list' is not exhaustive.
+(defun LaTeX-pst-arrows ()
+  "Ask for a arrow type and manage arrow type list"
+  (or (LaTeX-pst-what "arrows" "Arrow type" nil) ""))
+
+;;; Dots
+(defvar LaTeX-pst-dotstyle-list
+  '((completing-read "Dot style" nil LaTeX-pst-dotstyle-history)
+    "*" "o" "+" "|" "triangle" "triangle*" "square" "square*" "pentagon"
+    "pentagon*")
+  "A list of values for dotstyle in pstricks.")
+
+(defvar LaTeX-pst-dotstyle-history nil
+  "History of values for dotstyle in pstricks.")
+
+;;; Reference Point
+(defvar LaTeX-pst-refpoint-list
+  '((completing-read "Reference point" t LaTeX-pst-refpoint-history)
+    "l" "r" "t" "tl" "lt" "tr" "rt" "b" "bl" "br" "lb" "rb" "B" "Bl"
+    "Br" "lB" "rB")
+  "A list of values for refpoint in pstricks.")
+
+(defvar LaTeX-pst-refpoint-history nil
+  "History of values for refpoint in pstricks.")
+
+(defun LaTeX-pst-refpoint ()
+  "Ask for a refpoint and manage refpoint list"
+  (LaTeX-pst-what "refpoint" "Reference point" nil))
+
+;;; Color
+
+;; FIXME: Still used?
+(defvar LaTeX-pst-color-history nil
+  "History of values for color in pstricks.")
+
+;;; Others without History in Completion
+
+(defvar LaTeX-pst-style-list
+  '((completing-read "Defined Style" t))
+  "A list of values for user defined styles in pstricks.")
+
+;;; Parameters
+
+(defvar LaTeX-pst-parameters-history nil
+  "History of values for parameters in pstricks.")
+
+(defvar LaTeX-pst-parameters-value-history nil
+  "History of parameter values in pstricks.")
+
+(defvar LaTeX-pst-basic-parameters-name-list
+  '("arcsep" "arcsepA" "arcsepB" "arrowinset" "arrowlength" "arrows"
+    "arrowscale" "arrowsize" "border" "bordercolor" "boxsep"
+    "bracketlength" "cornersize" "curvature" "dash" "dimen" "dotangle"
+    "dotscale" "dotsep" "dotsize" "dotstyle" "doublecolor" "doubleline"
+    "doublesep" "doubleset" "fillcolor" "fillstyle" "framearc"
+    "framesep" "gangle" "gridcolor" "griddots" "gridlabelcolor"
+    "gridlabels" "gridwidth" "hatchangle" "hatchcolor" "hatchsep"
+    "hatchsepinc" "hatchwidth" "hatchwidthinc" "header" "labelsep"
+    "liftpen" "linearc" "linecolor" "linestyle" "linetype" "linewidth"
+    "rbracketlength" "ref" "runit" "shadow" "shadowangle" "shadowcolor"
+    "shadowsize" "showgrid" "showpoints" "style" "subgridcolor"
+    "subgriddiv" "subgriddots" "subgridwidth" "swapaxes" "tbarsize"
+    "trimode" "unit" "xunit" "yunit")
+  "A list of parameter names in pstricks.")
+
+
+(defvar LaTeX-pst-boolean-list '("true" "false")
+  "List of binary values for key=value completion.")
+
+;; XXX: Colors can actually be given as [-]<color>[!<num>].
+(defvar LaTeX-pst-color-list
+  '("black" "darkgray" "gray" "lightgray" "white"
+    "red" "green" "blue" "cyan" "magenta" "yellow")
+  "List of colors predefined in PSTricks.")
+
+(defvar LaTeX-pst-fillstyle-list
+  '("none" "solid" "vlines" "vlines*" "hlines" "hlines*" "crosshatch"
+    "crosshatch*" "boxfill")
+  "List of fill styles defined in PSTricks.")
+
+;; From PSTricks: PostScript macros for Generic TeX, User's Guide,
+;; Timothy Van Zandt, 25 July 2003, Version 97.
+;; FIXME: Provide separate variables tailored to the different macros.
+(defvar LaTeX-pst-basic-parameters-list
+  '(;; Dimensions, coordinates and angles
+    ("unit")
+    ("xunit")
+    ("yunit")
+    ("runit")
+    ;; Basic graphics parameters
+    ("linewidth")
+    ("linecolor" LaTeX-pst-color-list)
+    ("fillstyle" LaTeX-pst-fillstyle-list)
+    ("fillcolor" LaTeX-pst-color-list)
+    ("arrows" LaTeX-pst-arrows-list)
+    ("showpoints" LaTeX-pst-boolean-list)
+    ;; Lines and polygons
+    ("linearc")
+    ("framearc")
+    ("cornersize" ("relative" "absolute"))
+    ("gangle")
+    ;; Arcs, circles and ellipses
+    ("arcsepA")
+    ("arcsepB")
+    ("arcsep")
+    ;; Curves
+    ("curvature")
+    ;; Dots
+    ("dotstyle" ("*" "o" "Bo" "x" "+" "B+" "asterisk" "Basterisk" "oplus"
+                "otimes" "|" "B|" "square" "Bsquare" "square*" "diamond"
+                "Bdiamond" "diamond*" "triangle" "Btriangle" "triangle*"
+                "pentagon" "Bpentagon" "pentagon*"))
+    ("dotsize")
+    ("dotscale")
+    ("dotangle")
+    ;; Grids
+    ("gridwidth")
+    ("gridcolor" LaTeX-pst-color-list)
+    ("griddots")
+    ("gridlabels")
+    ("gridlabelcolor" LaTeX-pst-color-list)
+    ("subgriddiv")
+    ("subgridwidth")
+    ("subgridcolor" LaTeX-pst-color-list)
+    ("subgriddots")
+    ;; Plots
+    ("plotstyle" ("dots" "line" "polygon" "curve" "ecurve" "ccurve"))
+    ("plotpoints")
+    ;; Coordinate systems
+    ("origin")
+    ("swapaxes" LaTeX-pst-boolean-list)
+    ;; Line styles
+    ("linestyle" ("none" "solid" "dashed" "dotted"))
+    ("dash")
+    ("dotsep")
+    ("border")
+    ("bordercolor" LaTeX-pst-color-list)
+    ("doubleline" LaTeX-pst-boolean-list)
+    ("doublesep")
+    ("doublecolor" LaTeX-pst-color-list)
+    ("shadow" LaTeX-pst-boolean-list)
+    ("shadowsize")
+    ("shadowangle")
+    ("shadowcolor" LaTeX-pst-color-list)
+    ("dimen" ("outer" "inner" "middle"))
+    ;; Fill styles
+    ("hatchwidth")
+    ("hatchsep")
+    ("hatchcolor" LaTeX-pst-color-list)
+    ("hatchangle")
+    ("addfillstyle" LaTeX-pst-fillstyle-list)
+    ;; Arrowheads and such
+    ("arrowsize")
+    ("arrowlength")
+    ("arrowwinset")
+    ("tbarsize")
+    ("bracketlength")
+    ("rbracketlength")
+    ("arrowscale")
+    ;; Parameters
+    ("linetype")
+    ;; Graphics objects
+    ("liftpen")
+    ;; Placing and rotating whatever
+    ("labelsep")
+    ;; Axes
+    ("labels" ("all" "x" "y" "none"))
+    ("showorigin" LaTeX-pst-boolean-list)
+    ("ticks" ("all" "x" "y" "none"))
+    ("tickstyle" ("full" "top" "bottom"))
+    ("ticksize")
+    ("axesstyle" ("axes" "frame" "none"))
+    ;; Framed boxes
+    ("framesep")
+    ("boxsep")
+    ("trimode" ("*" "U" "D" "R" "L"))
+    ;; Nodes
+    ("href")
+    ("vref")
+    ("radius")
+    ;; Node connections
+    ("nodesep")
+    ("arcangle")
+    ("angle")
+    ("arm")
+    ("loopsize")
+    ("ncurv")
+    ("boxsize")
+    ("offset")
+    ;; Node connections labels: I
+    ("ref")
+    ("nrot")
+    ("npos")
+    ("shortput" ("none" "nab" "tablr" "tab"))
+    ;; Node connection labels: II
+    ("tpos")
+    ;; Attaching labels to nodes
+    ("rot")
+    ;; Mathematical diagrams and graphs
+    ("mnode" ("R" "r" "C" "f" "p" "circle" "oval" "dia" "tri" "dot" "none"))
+    ("emnode" ("R" "r" "C" "f" "p" "circle" "oval" "dia" "tri" "dot" "none"))
+    ("name")
+    ("nodealign" LaTeX-pst-boolean-list)
+    ("mcol" ("l" "r" "c"))
+    ("rowsep")
+    ("colsep")
+    ("mnodesize")
+    ;; ...
+    )
+  "List of keys and values for PSTricks macro arguments.")
+
+(defvar LaTeX-pst-parameters-name-list
+  LaTeX-pst-basic-parameters-name-list
+  "A list of all parameters with completion.")
+
+(defvar LaTeX-pst-parameters-name-history nil
+  "History of parameter names in pstricks.")
+
+(defvar LaTeX-pst-parameters-completion-regexp
+  "\\(arrows\\|linestyle\\|fillstyle\\|color\\|trimode\\|dotstyle\\|\\<style\\)"
+  "Regexp for `string-match'ing a parameter.")
+
+(defvar LaTeX-pst-parameters-boolean-regexp
+  "\\(doubleline\\|shadow\\>\\|show[a-zA-Z]+\\)"
+  "Regexp for `string-match'ing a parameter.")
+
+(defun LaTeX-pst-parameter-value (param)
+  "See documentation of `LaTeX-package-parameter-value'."
+  (LaTeX-package-parameter-value param "pst"))
+
+(defun LaTeX-pst-parameters-pref-and-chosen (param &optional noskip)
+  "See documentation of `LaTeX-package-parameters-pref-and-chosen'."
+  (LaTeX-package-parameters-pref-and-chosen param "pst" noskip))
+
+;; FIXME: This is likely only a transitional function used until all
+;; macros got their calls to `TeX-arg-key-val' with tailored parameter
+;; lists.
+(defun LaTeX-pst-parameters (optional)
+  "Prompt for general parameters of a PSTricks argument."
+  (TeX-arg-key-val optional LaTeX-pst-basic-parameters-list))
+
+;;; Macros
+(defun LaTeX-pst-macro-psarc (optional &optional arg)
+  "Return \\psarc arguments after querying."
+  (let ((arrows (LaTeX-pst-arrows))
+        (pnt (if current-prefix-arg nil (LaTeX-pst-point))))
+    (insert (if arrows (format "{%s}" arrows) "")
+            (if pnt (format "(%s)" pnt) "")
+            "{" (LaTeX-pst-extdir "Radius") "}{" (LaTeX-pst-angle) "}{"
+            (LaTeX-pst-angle) "}")))
+
+(defun LaTeX-pst-macro-pscircle (optional &optional arg)
+  "Return \\pscircle arguments after querying."
+  (insert "(" (LaTeX-pst-point) "){" (LaTeX-pst-extdir "Radius") "}"))
+
+(defun LaTeX-pst-macro-rput (optional &optional arg)
+  "Return \\rput arguments after querying."
+  (let ((refpoint (LaTeX-pst-refpoint))
+        (rotation (if current-prefix-arg (LaTeX-pst-angle) nil)))
+    (insert (if refpoint (concat "[" refpoint "]") "")
+            (if rotation
+                (concat "{" rotation "}")
+              "") "(" (LaTeX-pst-point) ")")))
+
+(defun LaTeX-pst-macro-uput (optional &optional arg)
+  "Return \\uput arguments after querying."
+  (let ((dist (LaTeX-pst-extdir "Distance"))
+        (refpoint (LaTeX-pst-refpoint)))
+    (insert (if dist (concat "{" dist "}") "")
+            (if refpoint
+                (concat "[" (LaTeX-pst-refpoint) "]")
+              "[]")
+            "{" (LaTeX-pst-angle) "}(" (LaTeX-pst-point) ")")))
+
+(defun LaTeX-pst-macro-multirputps (optional &optional arg)
+  "Return \\multirput or \\multips arguments after querying."
+  (let ((refpoint (LaTeX-pst-refpoint))
+        (rotation (if current-prefix-arg (LaTeX-pst-angle) nil))
+        (pnt (LaTeX-pst-point))
+        (dpnt (LaTeX-pst-what "delpoint" "Increment (default 1,1)" "1,1"))
+        (repi (LaTeX-pst-input-int "Repetitions" nil)))
+    (insert (if refpoint (format "[%s]" refpoint) "")
+            (if rotation (format "{%s}" rotation) "")
+            "(" pnt ")(" dpnt "){" repi "}")))
+
+(defun LaTeX-pst-macro-psline (optional &optional arg)
+  "Return \\psline or \\ps[ce]?curve[*] arguments after querying."
+  (let ((arrows (LaTeX-pst-arrows))
+        (pnt1 (LaTeX-pst-point))
+        (pnt2 (LaTeX-pst-point)))
+    (insert (if arrows (format "{%s}" arrows) "") "(" pnt1 ")" )
+    (while (and (not (string= pnt2 "")) (not (string= pnt1 pnt2)))
+      (insert "(" pnt2 ")")
+      (setq pnt1 pnt2)
+      (setq pnt2 (LaTeX-pst-point)))))
+
+(defun LaTeX-pst-macro-psdots (optional single)
+  "Return \\psdot[s]? arguments after querying."
+  (let* ((pnt1 (LaTeX-pst-point))
+         (pnt2 (if single pnt1 (LaTeX-pst-point))))
+    (insert "(" pnt1 ")")
+    (while (and (not (string= pnt2 "")) (not (string= pnt1 pnt2)))
+      (setq pnt1 pnt2)
+      (insert "(" pnt1 ")")
+      (setq pnt2 (LaTeX-pst-point)))))
+
+(defun LaTeX-pst-macro-parabola (optional &optional arg)
+  "Return \\parabola arguments after querying."
+  (let ((arrows (LaTeX-pst-arrows)))
+    (insert (if arrows (format "{%s}" arrows) "")
+            "(" (LaTeX-pst-point) ")(" (LaTeX-pst-point) ")")))
+
+(defun LaTeX-pst-macro-pnt-twolen (optional prompt1 prompt2)
+  "Return point and 2 paired lengths in separate parens as arguments."
+  ;; insert \psellipse[*]?, \psdiamond or \pstriangle  arguments
+  (let ((pnt (if current-prefix-arg nil (LaTeX-pst-point))))
+    (insert (if pnt (format "(%s)" pnt) "")
+            "(" (LaTeX-pst-extdir prompt1) ","
+            (LaTeX-pst-extdir prompt2) ")")))
+
+(defun LaTeX-pst-macro-psbezier (optional &optional arg)
+  "Return \\psbezier arguments after querying."
+  (let ((arrows (LaTeX-pst-arrows))
+        (pnt1 (LaTeX-pst-point))
+        (pnt2 (LaTeX-pst-point))
+        (pnt3 (LaTeX-pst-point)))
+    (insert (if arrows (format "{%s}" arrows) "")
+            "(" pnt1 ")(" pnt2 ")")
+    (while (not (string= pnt2 pnt3))
+      (insert "(" pnt3 ")")
+      (setq pnt2 pnt3)
+      (setq pnt3 (LaTeX-pst-point)))))
+
+(defun LaTeX-pst-macro-pspolygon (optional &optional arg)
+  "Return \\pspolygon arguments after querying."
+  (let ((pnt1 (LaTeX-pst-point))
+        (pnt2 (LaTeX-pst-point))
+        (pnt3 (LaTeX-pst-point)))
+    (insert "(" pnt1 ")(" pnt2 ")")
+    (while (not (string= pnt2 pnt3))
+      (insert "(" pnt3 ")")
+      (setq pnt2 pnt3)
+      (setq pnt3 (LaTeX-pst-point)))))
+
+(defun LaTeX-pst-macro-psframe (optional &optional arg)
+  "Return \\psframe arguments after querying."
+  (let ((pnt1 (if current-prefix-arg nil (LaTeX-pst-point)))
+        (pnt2 (LaTeX-pst-point)))
+    (insert (if pnt1 (format "(%s)" pnt1) "") "(" pnt2 ")")))
+
+(defun LaTeX-pst-macro-psgrid (optional &optional arg)
+  "Return \\psgrid arguments after querying."
+  (let* ((cpref (if current-prefix-arg (car current-prefix-arg) 0))
+         (pnt1 (if (> cpref 4) (LaTeX-pst-point) nil))
+         (pnt2 (if (> cpref 0) (LaTeX-pst-point) nil))
+         (pnt3 (if (> cpref 0) (LaTeX-pst-point) nil)))
+    (insert (if pnt1 (format "(%s)" pnt1) "")
+            (if pnt2 (format "(%s)(%s)" pnt2 pnt3) ""))))
+
+(defun LaTeX-pst-macro-newpsobject (&optional arg)
+  "Return \\newpsobject arguments after querying."
+  (insert "{" (read-string "New PSObject Name: ") "}"
+         ;; FIXME: It would be better to use something more confined
+         ;; than `TeX-symbol-list'.
+          "{" (completing-read "Parent Object: " (TeX-symbol-list))
+          "}"))
+
+;;; Environments
+(defun LaTeX-pst-env-pspicture (env)
+  "Create new pspicure environment."
+  (let ((opt (multi-prompt-key-value
+             (TeX-argument-prompt t "Options" nil)
+             '(("showgrid") ("shift"))))
+       (p0 (LaTeX-pst-what "point" "Lower left (default 0,0)" "0,0"))
+        (p1 (LaTeX-pst-what "point" "Upper right (default 1,1)" "1,1"))
+        corn)
+    (setq corn (concat (unless (string= "" opt) (format "[%s]" opt))
+                       (if (string= "0,0" p0) "" (format "(%s)" p0))
+                       "(" p1 ")"))
+    (LaTeX-insert-environment env corn)))
+
+;;; Self Parsing --  see (info "(auctex)Hacking the Parser")
+(defvar LaTeX-auto-pstricks-regexp-list
+  '(("\\\\newps\\(object\\){\\([a-zA-Z]+\\)}{\\([a-zA-Z]+\\)}" (1 2 3)
+     LaTeX-auto-pstricks)
+    ("\\\\newps\\(fontdot\\){\\([a-zA-Z]+\\)}" (1 2)
+     LaTeX-auto-pstricks)
+    ("\\\\newps\\(style\\){\\([a-zA-Z]+\\)}" (1 2)
+     LaTeX-auto-pstricks)
+    ("\\\\define\\(color\\){\\([a-zA-Z]+\\)}{\\(rgb\\|cmyk\\)}" (1 2 3)
+     LaTeX-auto-pstricks)
+    ("\\\\new\\(rgb\\|hsb\\|cmyk\\)\\(color\\){\\([a-zA-Z]+\\)}" (2 3 1)
+     LaTeX-auto-pstricks))
+  "List of regular expressions to extract arguments of \\newps* macros.")
+
+(defvar LaTeX-auto-pstricks nil
+  "Temporary for parsing \\newps* definitions.")
+
+(defun LaTeX-pst-cleanup ()
+  "Move symbols from `LaTeX-auto-pstricks' to `TeX-auto-symbol'."
+  (mapcar
+   (lambda (list)
+     (let ((type (car list)))
+       (cond ((string= type "object")
+              (setq TeX-auto-symbol
+                    (cons (list (nth 1 list)
+                                (caddr (assoc (nth 2 list)
+                                              (TeX-symbol-list))))
+                          TeX-auto-symbol)))
+             ((string= type "fontdot")
+              (add-to-list 'LaTeX-pst-dotstyle-list (nth 1 list) t))
+             ((string= type "style")
+              (add-to-list 'LaTeX-pst-style-list (nth 1 list) t))
+             ((string= type "color")
+              (add-to-list 'LaTeX-pst-color-list (nth 1 list) t)
+             ;; FIXME: Why is an entry with "-" in front added?
+              (add-to-list 'LaTeX-pst-color-list
+                           (concat "-" (nth 1 list)) t)))))
+   LaTeX-auto-pstricks))
+
+(defun LaTeX-pst-prepare ()
+  "Clear `LaTeX-auto-pstricks' before use."
+  (setq LaTeX-auto-pstricks nil))
+
+;; FIXME: This does not seem to work unless one does a manual reparse.
+;; Check e.g. with "\definecolor" and "fillcolor=".
+(add-hook 'TeX-auto-prepare-hook 'LaTeX-pst-prepare)
+(add-hook 'TeX-auto-cleanup-hook 'LaTeX-pst-cleanup)
+
+;;; Additional Functionality
+(defun LaTeX-pst-parameters-add (&optional arg)
+  "With ARG as prefix-argument insert new parameter\(s\) behind
+nearest backward LaTeX macro in brackets. Without ARG add
+parameter\(s\) to the already existing ones at the end of the
+comma separated list. Point has to be within the sexp to modify."
+  (interactive "P")
+  (let ((newpara  (LaTeX-pst-parameters-pref-and-chosen nil t))
+        (regexp "\\(") beg end check)
+    (if arg
+        (progn
+          (re-search-backward "\\\\\\([a-zA-Z]\\)")
+          (forward-word 1)
+          (insert-pair nil ?[ ?]))
+      (up-list 1)
+      (backward-char 1)
+      (save-excursion
+        (setq end (point))
+        (up-list -1)
+        (while (re-search-forward "\\([a-zA-Z]+\\)=" end 'limit)
+          (setq regexp (concat regexp
+                               (match-string-no-properties 1) "\\|")))
+        (setq regexp (concat (substring regexp 0 -1) ")"))
+        (setq check (string-match regexp newpara))))
+    (when newpara
+      (insert (if arg "" ",") newpara)
+      (when check
+        (message
+         "At least one Parameters appears twice. PLEASE CHECK!")))))
+;; FIXME: Only define a key for this once it is a general-purpose
+;; facility, i.e. not just for pstricks but all types of macros.
+;; (define-key LaTeX-mode-map "\C-c\C-x\C-a" 'LaTeX-pst-parameters-add)
+
+(defvar LaTeX-pst-value-regexp
+  "\\([-!.a-zA-Z0-9]*\\s\\?[-!.a-zA-Z0-9]+\\)"
+  "Expression matching a parameter value.")
+
+(defun LaTeX-pst-parameter-remove-value ()
+  "Remove value of current parameter and return parameter name."
+  (re-search-backward
+   (concat "\\(\\s(\\|,\\)[a-zA-Z]+\\([a-zA-Z]\\|=\\|="
+           LaTeX-pst-value-regexp "\\)"))
+  (re-search-forward "\\([a-zA-Z]+\\)=")
+  (let ((para (match-string-no-properties 1)))
+    (re-search-forward LaTeX-pst-value-regexp)
+    (delete-region (match-beginning 1) (match-end 1))
+    para))
+
+(defun LaTeX-pst-parameter-change-value ()
+  "Replace parameter value with a new one."
+  (interactive)
+  (let* ((para (LaTeX-pst-parameter-remove-value))
+         (symb
+          (when (and
+                 (string-match
+                  LaTeX-pst-parameters-completion-regexp para)
+                 (boundp
+                  (intern
+                   (concat "LaTeX-pst-" (match-string 0 para) "-list"))))
+            (intern (concat "LaTeX-pst-" (match-string 0 para)
+                            "-list")))))
+    (insert (TeX-arg-compl-list (symbol-value symb) "New Value"
+                                'LaTeX-pst-parameters-value-history))))
+;; FIXME: Only define a key for this once it is a general-purpose
+;; facility, i.e. not just for pstricks but all types of macros.  (See
+;; also `LaTeX-pst-parameters-add'.  Note that a parameter change
+;; should better be made available through a `C-u' prefix of the
+;; binding for the function doing the parameter addition.)
+;; (define-key LaTeX-mode-map "\C-c\C-x\C-v" 'LaTeX-pst-parameter-change-value)
+
+(TeX-add-style-hook
+ "pstricks"
+ (lambda ()
+   (unless (member "pst-pdf" TeX-active-styles)
+     (TeX-PDF-mode-off))
+   (mapc 'TeX-auto-add-regexp LaTeX-auto-pstricks-regexp-list)
+   (LaTeX-add-environments
+    '("pspicture" LaTeX-pst-env-pspicture)
+    "overlaybox" "psclip")
+   (TeX-add-symbols
+    '("AltClipMode" 0) '("DontKillGlue" 0) '("KillGlue" 0)
+    '("NormalCoor" 0) '("SpecialCoor" 0) '("PSTricksLoaded" 0)
+    '("PSTricksOff" 0) '("altcolormode" 0) '("pslinecolor" 0)
+    '("pslinestyle" 0) '("pslinetype" 0) '("pslinewidth" 0)
+    '("pslabelsep" 0) '("radian" 0) '("psunit" 0) '("psrunit" 0)
+    '("psxunit" 0) '("psyunit" 0)
+    '("arrows" (TeX-arg-eval LaTeX-pst-arrows))
+    '("clipbox" ["Border"] t)
+    '("closedshadow" [LaTeX-pst-parameters])
+    '("openshadow" [LaTeX-pst-parameters])
+    "closepath" "code" "coor" "curveto" "degrees" "dim" "endpsclip"
+    "file" "fill" "grestore" "gsave" "lineto" "movepath" "moveto"
+    "mrestore" "msave" "newpath" "rcoor" "rcurveto" "rlineto" "rotate"
+    "scale" "stroke" "swapaxes" "translate"
+    '("newcmykcolor" "Name" "Quadruple")
+    '("newrgbcolor" "Name" "Triple") '("newhsbcolor" "Name" "Triple")
+    '("newgray" "Name" "Value")
+    '("newpsobject" LaTeX-pst-macro-newpsobject LaTeX-pst-parameters)
+    '("newpsstyle" "New PSStyle Name" LaTeX-pst-parameters)
+    '("newpsfontdot" "New PSDot Name" ["Factors"]
+      "Fontname" "Character Number (Hex)")
+    '("parabola" [LaTeX-pst-parameters] LaTeX-pst-macro-parabola)
+    '("parabola*" [LaTeX-pst-parameters] LaTeX-pst-macro-parabola)
+    '("psarc" [LaTeX-pst-parameters] LaTeX-pst-macro-psarc)
+    '("psarc*" [LaTeX-pst-parameters] LaTeX-pst-macro-psarc)
+    '("psarcn" [LaTeX-pst-parameters] LaTeX-pst-macro-psarc)
+    '("pswedge" [LaTeX-pst-parameters] LaTeX-pst-macro-psarc)
+    '("psbezier" [LaTeX-pst-parameters] LaTeX-pst-macro-psbezier)
+    '("psbezier*" [LaTeX-pst-parameters] LaTeX-pst-macro-psbezier)
+    '("pscbezier" [LaTeX-pst-parameters] LaTeX-pst-macro-pspolygon)
+    '("pscircle" [LaTeX-pst-parameters] LaTeX-pst-macro-pscircle)
+    '("psccurve" [LaTeX-pst-parameters] LaTeX-pst-macro-psline)
+    '("psccurve*" [LaTeX-pst-parameters] LaTeX-pst-macro-psline)
+    '("pscurve" [LaTeX-pst-parameters] LaTeX-pst-macro-psline)
+    '("pscurve*" [LaTeX-pst-parameters] LaTeX-pst-macro-psline)
+    '("pscustom" [LaTeX-pst-parameters])
+    '("psdiamond" [LaTeX-pst-parameters]
+      (LaTeX-pst-macro-pnt-twolen "Width" "Height"))
+    '("pstriangle" [LaTeX-pst-parameters]
+      (LaTeX-pst-macro-pnt-twolen "Width" "Height"))
+    '("psdot" [LaTeX-pst-parameters] (LaTeX-pst-macro-psdots t))
+    '("psdots" [LaTeX-pst-parameters] (LaTeX-pst-macro-psdots nil))
+    '("psecurve" [LaTeX-pst-parameters] LaTeX-pst-macro-psline)
+    '("psecurve*" [LaTeX-pst-parameters] LaTeX-pst-macro-psline)
+    '("psellipse" [LaTeX-pst-parameters]
+      (LaTeX-pst-macro-pnt-twolen "Radius x" "Radius y"))
+    '("psellipse*" [LaTeX-pst-parameters]
+      (LaTeX-pst-macro-pnt-twolen "Radius x" "Radius y"))
+    '("psframe" [LaTeX-pst-parameters] LaTeX-pst-macro-psframe)
+    '("psframe*" [LaTeX-pst-parameters] LaTeX-pst-macro-psframe)
+    '("psframebox" [LaTeX-pst-parameters] t)
+    '("pscirclebox" [LaTeX-pst-parameters] t)
+    '("psdblframebox" [LaTeX-pst-parameters] t)
+    '("psdiabox" [LaTeX-pst-parameters] t)
+    '("psovalbox" [LaTeX-pst-parameters] t)
+    '("psshadowbox" [LaTeX-pst-parameters] t)
+    '("pstribox" [LaTeX-pst-parameters] t)
+    '("psscalebox" "Scaling Factor(s)" t)
+    '("psscaleboxto" LaTeX-pst-point-in-parens t)
+    '("psgrid" [LaTeX-pst-parameters] LaTeX-pst-macro-psgrid 0)
+    '("psline" [LaTeX-pst-parameters] LaTeX-pst-macro-psline)
+    '("psoverlay" t)
+    '("pspolygon" [LaTeX-pst-parameters] LaTeX-pst-macro-pspolygon)
+    '("pspolygon*" [LaTeX-pst-parameters] LaTeX-pst-macro-pspolygon)
+    '("psset" LaTeX-pst-parameters)
+    '("pssetlength" TeX-arg-macro "Length")
+    '("psaddtolength" TeX-arg-macro "Length")
+    '("degrees" ["Full Circle"])
+    '("qdisk" LaTeX-pst-point-in-parens "Radius")
+    '("qline" LaTeX-pst-point-in-parens LaTeX-pst-point-in-parens)
+    "pslongbox" "psrotatedown" "psrotateleft" "psrotateright"
+    '("rput" LaTeX-pst-macro-rput t)
+    '("rput*" LaTeX-pst-macro-rput t)
+    '("cput" [LaTeX-pst-parameters]
+      (TeX-arg-eval LaTeX-pst-angle) LaTeX-pst-point-in-parens t)
+    '("uput" LaTeX-pst-macro-uput t)
+    '("multirput" (LaTeX-pst-macro-multirputps t) t)
+    '("multips" (LaTeX-pst-macro-multirputps nil) t))))
+
+;;; pstricks.el ends here
diff --git a/packages/auctex/style/report.el b/packages/auctex/style/report.el
new file mode 100644 (file)
index 0000000..32329a8
--- /dev/null
@@ -0,0 +1,12 @@
+;;; report.el - Special code for report style.
+
+;; $Id: report.el,v 1.3 2005/03/17 10:02:06 angeli Exp $
+
+;;; Code:
+
+(TeX-add-style-hook
+ "report"
+ (lambda () 
+   (LaTeX-largest-level-set "chapter")))
+
+;;; report.el ends here
diff --git a/packages/auctex/style/ruby.el b/packages/auctex/style/ruby.el
new file mode 100644 (file)
index 0000000..0a96e57
--- /dev/null
@@ -0,0 +1,49 @@
+;;; ruby.el --- AUCTeX style for the ruby package.
+
+;; Copyright (C) 2009 Free Software Foundation, Inc.
+
+;; Author: Ralf Angeli <angeli@caeruleus.net>
+;; Maintainer: auctex-devel@gnu.org
+;; Created: 2009-01-04
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file adds support for the ruby package.
+
+;;; Code:
+
+(defvar LaTeX-ruby-package-options
+  '("overlap" "nooverlap" "CJK" "latin")
+  "Package options for the ruby package.")
+
+(TeX-add-style-hook
+ "ruby"
+ (lambda ()
+   (TeX-add-symbols
+    '("rubyoverlap" 0)
+    '("rubynooverlap" 0)
+    '("rubyCJK" 0)
+    '("rubylatin" 0)
+    '("rubysize" 0)
+    '("rubysep" 0)
+    '("ruby" t nil))))
+
+;;; ruby.el ends here
diff --git a/packages/auctex/style/scrartcl.el b/packages/auctex/style/scrartcl.el
new file mode 100644 (file)
index 0000000..0c09d91
--- /dev/null
@@ -0,0 +1,26 @@
+;;; -*- emacs-lisp -*-
+;;; scrartcl.el -- AUCTeX style for scrartcl.cls
+
+;; Copyright (C) 2002, 2005 Free Software Foundation
+;; License: GPL, see the file COPYING in the base directory of AUCTeX
+
+;; Author: Mark Trettin <Mark.Trettin@gmx.de>
+;; Created: 2002-09-26
+;; Version: $Id: scrartcl.el,v 1.4 2005/03/17 10:02:06 angeli Exp $
+;; Keywords: tex
+
+;;; Commentary:
+
+;; This file adds support for `scrartcl.cls'. This file needs
+;; `scrbase.el'.
+
+;; This file is part of  AUCTeX.
+
+;;; Code:
+(TeX-add-style-hook "scrartcl"
+   (lambda ()
+     (LaTeX-largest-level-set "section")
+     ;; load basic definitons
+     (TeX-run-style-hooks "scrbase")))
+
+;;; scrartcl.el ends here
diff --git a/packages/auctex/style/scrbase.el b/packages/auctex/style/scrbase.el
new file mode 100644 (file)
index 0000000..5a8b41f
--- /dev/null
@@ -0,0 +1,222 @@
+;;; scrbase.el --- AUCTeX style for the KOMA-Script bundle.
+
+;; Copyright (C) 2002, 2004, 2005, 2007 Free Software Foundation, Inc.
+
+;; Author: Mark Trettin <Mark.Trettin@gmx.de>
+;; Created: 2002-09-26
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file adds support for the KOMA-Script bundle.  This file
+;; contains the base definitions that work with all KOMA-Script
+;; classes (scrarctl.cls, scrreprt.cls, scrbook.cls and scrlttr2.cls).
+;; You need this file since it's loaded from the class-styles.
+
+;;; Code:
+(TeX-add-style-hook "scrbase"
+  (lambda ()
+    (TeX-add-symbols
+     "appendixmore"
+     "autodot"
+     '("addtokomafont" TeX-arg-KOMA-fontelements t)
+     '("areaset" [ "BCOR" ] "Width" "Height")
+     '("captionabove" [ "Lof entry" ] "Caption")
+     '("captionbelow" [ "Lof entry" ] "Caption")
+     '("cleardoubleemptypage")
+     '("cleardoubleplainpage")
+     '("cleardoublestandardpage")
+     '("dedication" t)
+     '("deffootnote" [ "Mark width" ] "Indent" "Parindent" "Definition")
+     '("deffootnotemark" "Definition")
+     '("extratitle" t)
+     '("ifpdfoutput" t nil)
+     '("ifthispageodd" t nil)
+     '("lowertitleback" t)
+     '("maketitle" [ "Pagenumber" ])
+     '("marginline" t)
+     '("publishers" "Publishers")
+     '("sectionmark" "Running head")
+     '("setbibpreamble" "Preamble")
+     '("setcaphanging")
+     '("setcapindent" "Indent")
+     '("setcapindent*" "X-Indent")
+     '("setcapmargin" [ "Margin left" ] "Margin")
+     '("setcapmargin*" [ "Margin inside" ] "Margin")
+     '("setcapwidth" [ TeX-arg-KOMA-capjust ] "Width")
+     '("setindexpreamble" "Preamble")
+     '("setkomafont" TeX-arg-KOMA-fontelements t)
+     '("subject" "Subject")
+     '("subsectionmark" "Running head")
+     '("textsubscript" "Text")
+     '("thanks" "Footnote")
+     '("thefootnotemark")
+     '("titlehead" t)
+     '("uppertitleback" t)
+     '("usekomafont" TeX-arg-KOMA-fontelements))
+    (LaTeX-add-environments
+     '("labeling" (lambda (env &rest ignore)
+                   (LaTeX-insert-environment
+                    env
+                    (let ((delim (read-string "(Optional) Delimiter: "))
+                          (width (read-string "Longest item: ")))
+                      (concat
+                       (if (not (zerop (length delim)))
+                           (format "[%s]" delim))
+                       (format "{%s}" width))))
+                   (LaTeX-find-matching-begin)
+                   (end-of-line 1)
+                   (LaTeX-insert-item)))
+     '("addmargin" (lambda (env &rest ignore)
+                    (LaTeX-insert-environment
+                     env
+                     (let ((leftin (read-string "(Optional) Left Indentation: "))
+                           (indent (read-string "Indentation: ")))
+                       (concat
+                        (if (not (zerop (length leftin)))
+                            (format "[%s]" leftin))
+                        (format "{%s}" indent))))))
+     '("addmargin*" (lambda (env &rest ignore)
+                     (LaTeX-insert-environment
+                      env
+                      (let ((innin (read-string "(Optional) Inner Indentation: "))
+                            (indent (read-string "Indentation: ")))
+                        (concat
+                         (if (not (zerop (length innin)))
+                             (format "[%s]" innin))
+                         (format "{%s}" indent))))))
+     '("captionbeside" (lambda (env &rest ignore)
+                        (LaTeX-insert-environment
+                         env
+                         (let ((lofent (read-string "(Optional) Lof Entry: "))
+                               (title (read-string "Caption: "))
+                               (place (read-string "(Optional) Placement (l,r,o,i): "))
+                               (width (read-string "(Optional) Width: "))
+                               (offset (read-string "(Optional) Offset: ")))
+                           (concat
+                            (if (not (zerop (length lofent)))
+                                (format "[%s]" lofent))
+                            (format "{%s}" title)
+                            (if (not (zerop (length place)))
+                                (format "[%s]" place))
+                            (if (not (zerop (length width)))
+                                (format "[%s]" width))
+                            (and
+                             (not (zerop (length place)))
+                             (not (zerop (length offset)))
+                             (format "[%s]%s" offset
+                                     (if (y-or-n-p "Starred? ")
+                                         "*" "")))))))))
+    (LaTeX-section-list-add-locally '(("addpart" 0)
+                                     ("addsec" 2)
+                                     ("minisec" 7)))
+    ;; This doesn't work. Maybe it's RefTeX's label insertion?
+    (make-local-variable 'LaTeX-section-label)
+    (setq LaTeX-section-label (append
+                              LaTeX-section-label
+                              '(("addpart" . nil)
+                                ("addsec" . nil)
+                                ("minisec" . nil))))
+    ;; Fontification
+    (when (and (featurep 'font-latex)
+              (eq TeX-install-font-lock 'font-latex-setup))
+      ;; Textual keywords
+      (font-latex-add-keywords '(("captionabove" "[{")
+                                ("captionbelow" "[{")
+                                ("dedication" "{")
+                                ("extratitle" "{")
+                                ("lowertitleback" "{")
+                                ("maketitle" "[")
+                                ("marginline" "{")
+                                ("publishers" "{")
+                                ("subject" "{")
+                                ("sectionmark" "{")
+                                ("setbibpreamble" "{")
+                                ("setindexpreamble" "{")
+                                ("subsectionmark" "{")
+                                ("textsubscript" "{")
+                                ("titlehead" "{")
+                                ("uppertitleback" "{"))
+                              'textual)
+      ;; Function keywords
+      (font-latex-add-keywords '(("deffootnote" "[{{{")
+                                ("deffootnotemark" "{")
+                                ("ifpdfoutput" "{{")
+                                ("ifthispageodd" "{{"))
+                              'function)
+      ;; Variable keywords
+      (font-latex-add-keywords '(("addtokomafont" "{{")
+                                ("areaset" "[{{")
+                                ("setcaphanging" "")
+                                ("setcapindent" "{")
+                                ("setcapmargin" "*[{")
+                                ("setcapwidth" "[{")
+                                ("setkomafont" "{{")
+                                ("typearea" "[{")
+                                ("usekomafont" "{"))
+                              'variable)
+      ;; Warning keywords
+      (font-latex-add-keywords '("cleardoublestandardpage"
+                                "cleardoubleplainpage"
+                                "cleardoubleemptypage")
+                              'warning)
+      ;; Sectioning keywords
+      (font-latex-add-keywords '(("addpart" "[{")) 'sectioning-1)
+      (font-latex-add-keywords '(("addsec" "[{")) 'sectioning-2)
+      (font-latex-add-keywords '(("minisec" "[{")) 'sectioning-4))))
+
+(defun TeX-arg-KOMA-setpreamble (optional &optional prompt)
+  "Prompt for KOMA-Script's \\set*preamble position with completion."
+  (TeX-argument-insert
+   (completing-read
+    (TeX-argument-prompt optional prompt "Position")
+    '(("") ("l") ("r") ("c") ("o") ("u")
+      ("lo") ("lu") ("ro") ("ru") ("co") ("cu"))
+    nil t)
+   optional))
+
+(defun TeX-arg-KOMA-capjust (optional &optional prompt)
+  "Prompt for KOMA-Script's \\setcapwidth justification with completion."
+  (TeX-argument-insert
+   (completing-read
+    (TeX-argument-prompt optional prompt "Justification")
+    '(("") ("l") ("r") ("c") ("i") ("o"))
+    nil t)
+   optional))
+
+(defun TeX-arg-KOMA-fontelements (optional &optional prompt)
+  "Prompt for KOMA-Script's fontelements with completion."
+  (TeX-argument-insert
+   (completing-read
+    (TeX-argument-prompt optional prompt "Element")
+    '(("")
+      ("caption") ("captionlabel")
+      ("descriptionlabel") ("dictum") ("dictumauthor") ("dictumtext")
+      ("footnote") ("footnotelabel") ("footnotereference")
+      ("pagefoot") ("pagehead") ("pagenumber") ("pagination")
+      ("sectioning") ("part") ("partnumber") ("chapter") ("section")
+      ("subsection") ("subsubsection") ("paragraph") ("subparagraph")
+      ("title") ("disposition") ("minisec"))
+    nil t)
+   optional))
+(add-to-list 'LaTeX-item-list '("labeling" . LaTeX-item-argument))
+
+;;; scrbase.el ends here
diff --git a/packages/auctex/style/scrbook.el b/packages/auctex/style/scrbook.el
new file mode 100644 (file)
index 0000000..6cada7d
--- /dev/null
@@ -0,0 +1,62 @@
+;;; scrbook.el --- AUCTeX style for scrbook.cls
+
+;; Copyright (C) 2002, 2005 Free Software Foundation
+
+;; Author: Mark Trettin <Mark.Trettin@gmx.de>
+;; Created: 2002-09-26
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary: 
+
+;; This file adds support for `scrbook.cls'. This file needs
+;; `scrbase.el'.
+
+;;; Code:
+
+(TeX-add-style-hook "scrbook"
+  (lambda ()
+    (LaTeX-largest-level-set "chapter")
+    ;; load basic definitons
+    (TeX-run-style-hooks "scrbase")
+    (TeX-add-symbols
+     "chapapp"
+     "raggeddictum"
+     '("chapappifchapterprefix" "Additional text")
+     '("setpartpreamble" [ TeX-arg-KOMA-setpreamble ] [ "Width" ] t)
+     '("setchapterpreamble" [ TeX-arg-KOMA-setpreamble ] [ "Width" ] t)
+     '("dictum" [ "Author" ] t))
+    (LaTeX-section-list-add-locally '("addchap" 1))
+    (make-local-variable 'LaTeX-section-label)
+    (setq LaTeX-section-label (append
+                              LaTeX-section-label
+                              '(("addchap" . nil))))
+    ;; Definitions for font-latex
+    (when (and (featurep 'font-latex)
+              (eq TeX-install-font-lock 'font-latex-setup))
+      ;; Textual keywords
+      (font-latex-add-keywords '(("addchap" "[{")
+                                ("setpartpreamble" "[[{")
+                                ("setchapterpreamble" "[[{")
+                                ("dictum" "[{"))
+                              'textual)
+      ;; Sectioning keywords
+      (font-latex-add-keywords '(("addchap" "[{")) 'sectioning-1))))
+
+;;; scrbook.el ends here
diff --git a/packages/auctex/style/scrlttr2.el b/packages/auctex/style/scrlttr2.el
new file mode 100644 (file)
index 0000000..136b1c5
--- /dev/null
@@ -0,0 +1,239 @@
+;;; scrlttr2.el --- AUCTeX style for scrlttr2.cls.
+
+;; Copyright (C) 2002, 2007 Free Software Foundation
+
+;; Author: Mark Trettin <Mark.Trettin@gmx.de>
+;; Created: 2002-10-26
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary: 
+
+;; This file adds support for `scrlttr2.cls'.
+
+;; Since I just recently switched from `g-brief.cls' to the
+;; KOMA-Script letter class *and* I don't really write many
+;; snailmails, there are probably some superflous macros included and
+;; important ones left out. Comments appreciated.
+
+;; I left out any length and positioning macros since those should be
+;; set in a personal `*.lco'-File. IMHO.
+
+;;; Code
+
+(TeX-add-style-hook "scrlttr2"
+  (lambda ()
+    (TeX-add-symbols
+     '("AtBeginLetter" t)
+     '("KOMAoptions" t)
+     '("LetterOptionNeedsPapersize" "Name of lco file" "Paper size")
+     '("LoadLetterOption" "Name of lco file")
+     '("addrchar" "Initial letter")
+     '("addrentry" "Lastname" "Firstname" "Address" "Telephone" "F1"
+       "F2" "F3" "F4" "Key")
+     '("addtokomafont" TeX-arg-KOMA-scrlttr-fontelements t)
+     '("addtolengthplength" [ "Factor" ] "Name of length"
+       "Name of pseudo length")
+     '("addtoreffields" TeX-arg-KOMA-scrlttr-vars)
+     '("adrchar" "Initial letter")
+     '("adrentry" "Lastname" "Firstname" "Address" "Telephone" "F1"
+       "F2" "Comment" "Key")
+     '("bankname" t)
+     '("captionsUKenglish" nil)
+     '("captionsUSenglish" nil)
+     '("captionsamerican" nil)
+     '("captionsaustrian" nil)
+     '("captionsbritish" nil)
+     '("captionscroatian" nil)
+     '("captionsdutch" nil)
+     '("captionsenglish" nil)
+     '("captionsfrench" nil)
+     '("captionsgerman" nil)
+     '("captionsitalian" nil)
+     '("captionsngerman" nil)
+     '("captionsspanish" nil)
+     '("cc" t)
+     '("ccname" t)
+     '("cleardoubleemptypage")
+     '("cleardoubleplainpage")
+     '("cleardoublestandardpage")
+     '("closing" "Closing Phrase")
+     '("customername" t)
+     '("dateUKenglish" nil)
+     '("dateUSenglish" nil)
+     '("dateamerican" nil)
+     '("dateaustrian" nil)
+     '("datebritish" nil)
+     '("datecroatian" nil)
+     '("datedutch" nil)
+     '("dateenglish" nil)
+     '("datefrench" nil)
+     '("dategerman" nil)
+     '("dateitalian" nil)
+     '("datename" t)
+     '("datengerman" nil)
+     '("datespanish" nil)
+     '("emailname" t)
+     '("encl" t)
+     '("enclname" t)
+     '("faxname" t)
+     '("firstfoot" t)
+     '("firsthead" t)
+     '("headfromname" t)
+     '("headtoname" t)
+     '("ifkomavarempty" TeX-arg-KOMA-scrlttr-vars 2)
+     '("ifkomavarempty*" TeX-arg-KOMA-scrlttr-vars 2)
+     '("invoicename" t)
+     '("myrefname" t)
+     '("newcaptionname" "Language" "Term" "Definition")
+     '("newkomavar" [ "Description" ] "Name")
+     '("newkomavar*" [ "Description" ] "Name")
+     '("nextfoot" t)
+     '("nexthead" t)
+     '("opening" "Opening")
+     '("pagename" t)
+     '("phonename" t)
+     '("providecaptionname" "Language" "Term" "Definition")
+     '("ps")
+     '("raggedsignature" nil)
+     '("renewcaptionname" "Language" "Term" "Definition")
+     '("setkomafont" TeX-arg-KOMA-scrlttr-fontelements t)
+     '("setkomavar" TeX-arg-KOMA-scrlttr-vars [ "Description" ] t)
+     '("setkomavar*" TeX-arg-KOMA-scrlttr-vars "Description")
+     '("setlengthtoplength" [ "Factor" ] "Name of length"
+       "Name of pseudo length")
+     '("subjectname" t)
+     '("usekomafont" TeX-arg-KOMA-scrlttr-fontelements)
+     '("usekomavar" [ "Command" ] TeX-arg-KOMA-scrlttr-vars)
+     '("usekomavar*" [ "Command" ] TeX-arg-KOMA-scrlttr-vars)
+     '("useplength" "Name")
+     '("wwwname" t)
+     '("yourmailname" t)
+     '("yourrefname" t))
+    (LaTeX-add-environments
+     '("letter" (lambda (env &rest ignore)
+                 (LaTeX-insert-environment
+                  env
+                  (let ((options (read-string "Optional options: "))
+                        (recip (read-string "Recipient: ")))
+                    (concat
+                     (if (not (zerop (length options)))
+                         (format "[%s]" options))
+                     (format "{%s}" recip)))))))
+    ;; Definitions for font-latex
+   (when (and (featurep 'font-latex)
+             (eq TeX-install-font-lock 'font-latex-setup))
+     ;; Textual keywords
+     (font-latex-add-keywords '(("addrentry" "{{{{{{{{{")
+                               ("adrentry" "{{{{{{{{")
+                               ("bankname" "{")
+                               ("cc" "{")
+                               ("ccname" "{")
+                               ("closing" "{")
+                               ("customername" "{")
+                               ("datename" "{")
+                               ("emailname" "{")
+                               ("encl" "{")
+                               ("enclname" "{")
+                               ("faxname" "{")
+                               ("firstfoot" "{")
+                               ("firsthead" "{")
+                               ("headfromname" "{")
+                               ("headtoname" "{")
+                               ("invoicename" "{")
+                               ("myrefname" "{")
+                               ("nextfoot" "{")
+                               ("nexthead" "{")
+                               ("opening" "{")
+                               ("pagename" "{")
+                               ("phonename" "{")
+                               ("ps" "")
+                               ("subjectname" "{")
+                               ("wwwname" "{")
+                               ("yourmailname" "{")
+                               ("yourrefname" "{"))
+                             'textual)
+     ;; Function keywords
+     (font-latex-add-keywords '(("AtBeginLetter" "{")
+                               ("LetterOptionNeedsPapersize" "{{")
+                               ("LoadLetterOption" "{")
+                               ("addrchar" "{")
+                               ("adrchar" "{")
+                               ("ifkomavarempty" "*{{{"))
+                             'function)
+     ;; Variable keywords
+     (font-latex-add-keywords '(("KOMAoptions" "{")
+                               ("addtokomafont" "{{")
+                               ("addtolengthplength" "[{{")
+                               ("addtoreffields" "{")
+                               ("newcaptionname" "{{{")
+                               ("newkomavar" "*[{")
+                               ("providecaptionname" "{{{")
+                               ("renewcaptionname" "{{{")
+                               ("setkomafont" "{{")
+                               ("setkomavar" "*{[{")
+                               ("setlengthtoplength" "[{{")
+                               ("usekomafont" "{")
+                               ("usekomavar" "*[{")
+                               ("useplength" "{"))
+                             'variable)
+     ;; Warning keywords
+     (font-latex-add-keywords '("cleardoublestandardpage"
+                               "cleardoubleplainpage"
+                               "cleardoubleemptypage")
+                             'warning))))
+
+(defun TeX-arg-KOMA-scrlttr-vars (optional &optional prompt)
+  "Prompt for KOMA-Script's scrlttr2 predefined variables with completion."
+  (TeX-argument-insert
+   (completing-read
+    (TeX-argument-prompt optional prompt "Variable")
+    '(("")
+      ("backaddress") ("backaddressseparator")
+      ("ccseparator") ("customer")
+      ("date")
+      ("emailseparator") ("enclseparator")
+      ("faxseparator") ("frombank") ("fromaddress") ("fromemail")
+      ("fromfax") ("fromlogo") ("fromname") ("fromphone") ("fromurl")
+      ("invoice")
+      ("location")
+      ("myref")
+      ("place") ("placeseparator") ("phoneseparator")
+      ("signature") ("specialmail") ("subject") ("subjectseparator")
+      ("title") ("toname") ("toaddress")
+      ("yourmail") ("yourref"))
+    nil nil)
+   optional))
+
+(defun TeX-arg-KOMA-scrlttr-fontelements (optional &optional prompt)
+  "Prompt for KOMA-Script's scrlttr2 fontelements with completion."
+  (TeX-argument-insert
+   (completing-read
+    (TeX-argument-prompt optional prompt "Element")
+    '(("")
+      ("backaddress")
+      ("descriptionlabel")
+      ("fromaddress") ("fromname")
+      ("pagefoot") ("pagehead") ("pagenumber")
+      ("subject")
+      ("title"))
+    nil t)
+   optional))
+
+;;; scrlttr2.el ends here
diff --git a/packages/auctex/style/scrpage2.el b/packages/auctex/style/scrpage2.el
new file mode 100644 (file)
index 0000000..ed3d500
--- /dev/null
@@ -0,0 +1,129 @@
+;;; scrpage2.el --- AUCTeX style for scrpage2.sty.
+
+;; Author:   Ralf Angeli <angeli@iwi.uni-sb.de>
+;; Created:  2003-11-01
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file adds support for `scrpage2.sty'.
+
+;;; Code:
+
+(TeX-add-style-hook
+ "scrpage2"
+ (lambda ()
+
+   ;; New symbols
+   (TeX-add-symbols
+    '("lehead" [ "scrplain-left-even" ] "scrheadings-left-even")
+    '("cehead" [ "scrplain-center-even" ] "scrheadings-center-even")
+    '("rehead" [ "scrplain-right-even" ] "scrheadings-right-even")
+    '("lefoot" [ "scrplain-left-even" ] "scrheadings-left-even")
+    '("cefoot" [ "scrplain-center-even" ] "scrheadings-center-even")
+    '("refoot" [ "scrplain-right-even" ] "scrheadings-right-even")
+    '("lohead" [ "scrplain-left-odd" ] "scrheadings-left-odd")
+    '("cohead" [ "scrplain-center-odd" ] "scrheadings-center-odd")
+    '("rohead" [ "scrplain-right-odd" ] "scrheadings-right-odd")
+    '("lofoot" [ "scrplain-left-odd" ] "scrheadings-left-odd")
+    '("cofoot" [ "scrplain-center-odd" ] "scrheadings-center-odd")
+    '("rofoot" [ "scrplain-right-odd" ] "scrheadings-right-odd")
+    '("ihead" [ "scrplain-inside" ] "scrheadings-inside")
+    '("chead" [ "scrplain-center" ] "scrheadings-center")
+    '("ohead" [ "scrplain-outside" ] "scrheadings-outside")
+    '("ifoot" [ "scrplain-inside" ] "scrheadings-inside")
+    '("cfoot" [ "scrplain-center" ] "scrheadings-center")
+    '("ofoot" [ "scrplain-outside" ] "scrheadings-outside")
+    '("clearscrheadfoot")
+    '("clearscrheadings")
+    '("clearscrplain")
+    '("automark" [ "Right page" ] "Left page")
+    '("headmark")
+    '("manualmark")
+    '("pagemark")
+    '("leftmark")
+    '("rightmark")
+    '("setfootwidth" [ "Offset" ] "Width")
+    '("setheadwidth" [ "Offset" ] "Width")
+    '("setfootbotline" [ "Length" ] "Thickness")
+    '("setfootsepline" [ "Length" ] "Thickness")
+    '("setheadtopline" [ "Length" ] "Thickness")
+    '("setheadsepline" [ "Length" ] "Thickness")
+    '("deftripstyle" "Name" [ "Thickness of outer line" ]
+      [ "Thickness of inner line" ] "Inner box of page head"
+      "Center box of page head" "Outer box of page head"
+      "Inner box of page foot" "Center box of page foot"
+      "Outer box of page foot")
+    '("defpagestyle" "Name" "Head definition" "Foot definition")
+    '("newpagestyle" "Name" "Head definition" "Foot definition")
+    '("renewpagestyle" "Name" "Head definition" "Foot definition")
+    '("providepagestyle" "Name" "Head definition" "Foot definition"))
+
+    ;; Fontification
+   (when (and (featurep 'font-latex)
+             (eq TeX-install-font-lock 'font-latex-setup))
+     (font-latex-add-keywords '(("lehead" "[{")
+                               ("cehead" "[{")
+                               ("rehead" "[{")
+                               ("lefoot" "[{")
+                               ("cefoot" "[{")
+                               ("refoot" "[{")
+                               ("lohead" "[{")
+                               ("cohead" "[{")
+                               ("rohead" "[{")
+                               ("lofoot" "[{")
+                               ("cofoot" "[{")
+                               ("rofoot" "[{")
+                               ("ihead" "[{")
+                               ("chead" "[{")
+                               ("ohead" "[{")
+                               ("ifoot" "[{")
+                               ("cfoot" "[{")
+                               ("ofoot" "[{")
+                               ("automark" "[{")
+                               ("setfootwidth" "[{")
+                               ("setheadwidth" "[{")
+                               ("setfootbotline" "[{")
+                               ("setfootsepline" "[{")
+                               ("setheadtopline" "[{")
+                               ("setheadsepline" "[{"))
+                             'variable)
+     (font-latex-add-keywords '(("deftripstyle" "{[[{{{{{{")
+                               ("defpagestyle" "{{{")
+                               ("newpagestyle" "{{{")
+                               ("renewpagestyle" "{{{")
+                               ("providepagestyle" "{{{"))
+                             'function))))
+
+(defvar LaTeX-scrpage2-package-options '("headinclude" "headexclude"
+                                        "footinclude" "footexclude"
+                                        "mpinclude" "mpexclude"
+                                        "headtopline" "headsepline"
+                                        "footsepline" "footbotline"
+                                        "plainheadtopline" "plainheadsepline"
+                                        "plainfootsepline" "plainfootbotline"
+                                        "ilines" "clines" "olines"
+                                        "automark" "manualmark"
+                                        "autooneside" "markuppercase"
+                                        "markusedcase" "nouppercase"
+                                        "komastyle" "standardstyle")
+  "Package options for the scrpage2 package.")
+
+;;; scrpage2.el ends here
diff --git a/packages/auctex/style/scrreprt.el b/packages/auctex/style/scrreprt.el
new file mode 100644 (file)
index 0000000..2ffe3ad
--- /dev/null
@@ -0,0 +1,63 @@
+;;; scrreprt.el --- AUCTeX style for scrreprt.cls.
+
+;; Copyright (C) 2002, 2005 Free Software Foundation
+
+;; Author: Mark Trettin <Mark.Trettin@gmx.de>
+;; Created: 2002-09-26
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file adds support for `scrreprt.cls'. This file needs
+;; `scrbase.el'.
+
+;;; Code:
+
+(TeX-add-style-hook
+ "scrreprt"
+ (lambda ()
+   (LaTeX-largest-level-set "chapter")
+   ;; load basic definitons
+   (TeX-run-style-hooks "scrbase")
+   (TeX-add-symbols
+    "chapapp"
+    "raggeddictum"
+    '("chapappifchapterprefix" "Additional text")
+    '("setpartpreamble" [ TeX-arg-KOMA-setpreamble ] [ "Width" ] t)
+    '("setchapterpreamble" [ TeX-arg-KOMA-setpreamble ] [ "Width" ] t)
+    '("dictum" [ "Author" ] t))
+   (LaTeX-section-list-add-locally '("addchap" 1))
+   (make-local-variable 'LaTeX-section-label)
+   (setq LaTeX-section-label (append
+                             LaTeX-section-label
+                             '(("addchap" . nil))))
+   ;; Definitions for font-latex
+   (when (and (featurep 'font-latex)
+             (eq TeX-install-font-lock 'font-latex-setup))
+     ;; Textual keywords
+     (font-latex-add-keywords '(("addchap" "[{")
+                               ("setpartpreamble" "[[{")
+                               ("setchapterpreamble" "[[{")
+                               ("dictum" "[{"))
+                             'textual)
+     ;; Sectioning keywords
+     (font-latex-add-keywords '(("addchap" "[{")) 'sectioning-1))))
+
+;;; scrreprt.el ends here
diff --git a/packages/auctex/style/shortvrb.el b/packages/auctex/style/shortvrb.el
new file mode 100644 (file)
index 0000000..2ef191a
--- /dev/null
@@ -0,0 +1,56 @@
+;;; shortvrb.el --- AUCTeX style for `shortvrb.sty'
+
+;; Copyright (C) 2009 Free Software Foundation, Inc.
+
+;; Author: Ralf Angeli <angeli@caeruleus.net>
+;; Maintainer: auctex-devel@gnu.org
+;; Created: 2009-12-23
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file adds support for `shortvrb.sty'.
+
+;; XXX: We might want provide users with the possibility to activate
+;; something like this for any file (incl. Plain TeX).  That would
+;; bring us one step closer to the goal of displaying texbook.tex
+;; without font locking going haywire.
+
+;; FIXME: The code does not work for preview.dtx because in that file
+;; the style list is empty.  In its master file, preview.drv, it
+;; works, however.  However, even if the style file is loaded by hand,
+;; it fails to fontify verbatim text in the documentation parts of the
+;; file.
+
+;;; Code:
+
+(TeX-add-style-hook
+ "shortvrb"
+ (lambda ()
+   ;; Fontification
+   (when (and LaTeX-shortvrb-chars
+             (fboundp 'font-latex-set-syntactic-keywords)
+             (eq TeX-install-font-lock 'font-latex-setup))
+     (let (syntax-alist)
+       (dolist (char LaTeX-shortvrb-chars)
+        (add-to-list 'syntax-alist (cons char "|")))
+       (font-latex-add-to-syntax-alist syntax-alist)))))
+
+;;; shortvrb.el ends here
diff --git a/packages/auctex/style/slides.el b/packages/auctex/style/slides.el
new file mode 100644 (file)
index 0000000..9e16024
--- /dev/null
@@ -0,0 +1,41 @@
+;;; slides.el --- AUCTeX style for the `slides' document class
+
+;; Copyright (C) 2004 Free Software Foundation, Inc.
+
+;; Author: Ralf Angeli <angeli@iwi.uni-sb.de>
+;; Maintainer: auctex-devel@gnu.org
+;; Created: 2004-04-21
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file adds support for the `slides' document class.  Currently
+;; the support is very limited.  You are welcome to improve it.
+
+;;; Code:
+
+(TeX-add-style-hook
+ "slides"
+ (lambda ()
+   (LaTeX-add-environments "slide"
+                          "overlay"
+                          "note")))
+
+;;; slides.el ends here
diff --git a/packages/auctex/style/slovak.el b/packages/auctex/style/slovak.el
new file mode 100644 (file)
index 0000000..57083a4
--- /dev/null
@@ -0,0 +1,10 @@
+;;; slovak.el --- Setup AUCTeX for editing Slovak text.
+
+(TeX-add-style-hook
+ "slovak"
+ (lambda ()
+   (setq TeX-quote-language `("slovak" "\\uv{" "}" ,TeX-quote-after-quote))
+   (when (fboundp 'font-latex-add-quotes)
+     (font-latex-add-quotes '("\"`" "\"'"))
+     (font-latex-add-quotes '("\"<" "\">" french)))
+   (run-hooks 'TeX-language-sk-hook)))
diff --git a/packages/auctex/style/subfigure.el b/packages/auctex/style/subfigure.el
new file mode 100644 (file)
index 0000000..945f540
--- /dev/null
@@ -0,0 +1,73 @@
+;;; subfigure.el --- AUCTeX style file for subfigure.sty
+
+;; Copyright (C) 2003, 2005 Free Software Foundation, Inc.
+
+;; Author: Reiner Steib  <Reiner.Steib@gmx.de>
+;; Maintainer: auctex-devel@gnu.org
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; AUCTeX style file for subfigure.sty
+
+;;; Code:
+
+(TeX-add-style-hook
+ "subfigure"
+ (lambda ()
+   (TeX-add-symbols
+    '("subfigure"  [ "list entry" ] [ "sub caption" ] "figure")
+    '("subtable"   [ "list entry" ] [ "sub caption" ] "figure")
+    '("Subref" TeX-arg-label)
+    '("subref" TeX-arg-label))
+   ;; TODO: add \subfig* lengths
+
+   ;; Install completion for labels:
+   (setq TeX-complete-list
+        (append
+         '(("\\\\subref{\\([^{}\n\r\\%,]*\\)" 1 LaTeX-label-list "}")
+           ("\\\\Subref{\\([^{}\n\r\\%,]*\\)" 1 LaTeX-label-list "}"))
+         TeX-complete-list))
+   ;; Fontification
+   (when (and (featurep 'font-latex)
+             (eq TeX-install-font-lock 'font-latex-setup))
+     (font-latex-add-keywords '(("subfigure" "[[{")
+                               ("subtable" "[[{"))
+                             'textual)
+     (font-latex-add-keywords '(("Subref" "{")
+                               ("subref" "{"))
+                             'reference))))
+
+(defvar LaTeX-subfigure-package-options '("normal" "hang" "center"
+                                         "centerlast" "nooneline"
+                                         "raggedright" "isu" "anne"
+                                         "scriptsize" "footnotesize"
+                                         "small" "normalsize" "large"
+                                         "Large" "rm" "sf" "tt" "md"
+                                         "bf" "up" "it" "sl" "sc" "RM"
+                                         "SF" "TT" "MD" "BF" "IT" "SL"
+                                         "SC" "UP" "figbotcap"
+                                         "figtopcap" "tabbotcap"
+                                         "tabtopcap" "FIGBOTCAP"
+                                         "FIGTOPCAP" "TABBOTCAP"
+                                         "TABTOPCAP" "loose" "tight")
+  "Package options for the subfigure package.")
+
+;;; subfigure.el ends here
diff --git a/packages/auctex/style/swedish.el b/packages/auctex/style/swedish.el
new file mode 100644 (file)
index 0000000..0101632
--- /dev/null
@@ -0,0 +1,13 @@
+;;; swedish.el --- Setup AUCTeX for editing Swedish text.
+
+;;; Commentary:
+;;
+;; Apparently the Swedes use ''this style'' quotations.
+
+(TeX-add-style-hook
+ "swedish"
+ (lambda ()
+   (setq TeX-quote-language
+        `("swedish" "''" ,TeX-close-quote ,TeX-quote-after-quote))
+   (setq LaTeX-babel-hyphen-language "swedish")
+   (run-hooks 'TeX-language-sv-hook)))
diff --git a/packages/auctex/style/tabularx.el b/packages/auctex/style/tabularx.el
new file mode 100644 (file)
index 0000000..0fc8234
--- /dev/null
@@ -0,0 +1,52 @@
+;;; tabularx.el --- AUCTeX style for the tabularx package.
+
+;; Copyright (C) 2009 Free Software Foundation, Inc.
+
+;; Author: Ralf Angeli <angeli@caeruleus.net>
+;; Maintainer: auctex-devel@gnu.org
+;; Created: 2009-02-22
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file adds support for the tabularx package.
+
+;;; Code:
+
+(defvar LaTeX-tabularx-package-options
+  '("infoshow" "debugshow")
+  "Package options for the tabularx package.")
+
+(TeX-add-style-hook
+ "tabularx"
+ (lambda ()
+   ;; New symbols
+   (TeX-add-symbols
+    "tracingtabularx"
+    '("tabularxcolumn" 0))
+   ;; New environments
+   (LaTeX-add-environments
+    ;; XXX: The tabularx environment takes the same arguments as the
+    ;; tabular* environment.  However, the supported tokens in the
+    ;; format can differ, so at some point in time we might want to
+    ;; separate tabular* and tabularx.
+    '("tabularx" LaTeX-env-tabular*))))
+
+;;; tabularx.el ends here
diff --git a/packages/auctex/style/units.el b/packages/auctex/style/units.el
new file mode 100644 (file)
index 0000000..88ba73d
--- /dev/null
@@ -0,0 +1,49 @@
+;;; units.el --- AUCTeX style for the LaTeX package `units.sty' (v0.9b)
+
+;; Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+
+;; Author: Christian Schlauer <cschl@arcor.de>
+;; Maintainer: auctex-devel@gnu.org
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file adds support for `units.sty'.
+
+;;; Code:
+
+(TeX-add-style-hook
+ "units"
+ (lambda ()
+   (TeX-add-symbols
+    '("unit" [ "Value" ] "Unit")
+    '("unitfrac" [ "Value" ] "Unit in numerator" "Unit in denominator"))
+   ;; units.sty requires the package nicefrac.sty, thus we enable the
+   ;; macros of nicefrac.sty, too
+   (TeX-run-style-hooks "nicefrac")
+   ;; Fontification
+   (when (and (featurep 'font-latex)
+             (eq TeX-install-font-lock 'font-latex-setup))
+     (font-latex-add-keywords '(("unit" "[{") ("unitfrac" "[{{")) 'textual))))
+
+(defvar LaTeX-units-package-options '("tight" "loose")
+  "Package options for the units package.")
+
+;;; units.el ends here
diff --git a/packages/auctex/style/url.el b/packages/auctex/style/url.el
new file mode 100644 (file)
index 0000000..0084be4
--- /dev/null
@@ -0,0 +1,95 @@
+;;; url.el --- AUCTeX style for `url.sty'
+
+;; Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+
+;; Author: Ralf Angeli <angeli@iwi.uni-sb.de>
+;; Maintainer: auctex-devel@gnu.org
+;; Created: 2004-10-13
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file adds support for `url.sty'.
+
+;;; Code:
+
+(TeX-add-style-hook
+ "url"
+ (lambda ()
+   ;; New symbols
+   (TeX-add-symbols
+    "Url"
+    "UrlBigBreakPenalty"
+    "UrlBigBreaks"
+    "UrlBreakPenalty"
+    "UrlBreaks"
+    "UrlFont"
+    "UrlLeft"
+    "UrlNoBreaks"
+    "UrlOrds"
+    "UrlRight"
+    "UrlSpecials"
+    "path"
+    "url"
+    "urldef"
+    '("urlstyle" TeX-arg-urlstyle))
+
+   (add-to-list 'LaTeX-verbatim-macros-with-delims-local "path")
+   (add-to-list 'LaTeX-verbatim-macros-with-delims-local "url")
+   (add-to-list 'LaTeX-verbatim-macros-with-braces-local "path")
+   (add-to-list 'LaTeX-verbatim-macros-with-braces-local "url")
+
+   ;; Fontification
+   (when (and (featurep 'font-latex)
+             (eq TeX-install-font-lock 'font-latex-setup))
+     (font-latex-add-keywords '(("path" "{") ("url" "{")) 'reference)
+     (font-latex-add-keywords '(("Url" "")
+                               ("UrlBigBreakPenalty" "")
+                               ("UrlBigBreaks" "")
+                               ("UrlBreakPenalty" "")
+                               ("UrlBreaks" "")
+                               ("UrlFont" "")
+                               ("UrlLeft" "")
+                               ("UrlNoBreaks" "")
+                               ("UrlOrds" "")
+                               ("UrlRight" "")
+                               ("UrlSpecials" "")
+                               ("urldef" "")
+                               ("urlstyle" "{"))
+                             'variable)
+     ;; For syntactic fontification, e.g. verbatim constructs.
+     (font-latex-set-syntactic-keywords)
+     ;; Tell font-lock about the update.
+     (setq font-lock-set-defaults nil)
+     (font-lock-set-defaults))))
+
+(defun TeX-arg-urlstyle (optional &optional prompt)
+  "Prompt for style used in \\urlstyle with completion."
+  (TeX-argument-insert
+   (completing-read (TeX-argument-prompt optional prompt "Style")
+                   (mapcar 'list '("rm" "same" "sf" "tt"))
+                   nil t)
+   optional))
+
+(defvar LaTeX-url-package-options '("hyphens" "obeyspaces" "spaces" "LY1"
+                                   "T1" "allowmove")
+  "Package options for the url package.")
+
+;;; url.el ends here
diff --git a/packages/auctex/style/varioref.el b/packages/auctex/style/varioref.el
new file mode 100644 (file)
index 0000000..77c791b
--- /dev/null
@@ -0,0 +1,63 @@
+;;; varioref.el --- AUCTeX style file with support for varioref.sty
+
+;; Copyright (C) 1999 Free Software Foundation, Inc.
+
+;; Author: Carsten Dominik <dominik@strw.leidenuniv.nl>
+;; Maintainer: auctex-devel@gnu.org
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Code:
+
+(TeX-add-style-hook "varioref"
+   (lambda ()
+     
+     (TeX-add-symbols
+
+      ;; The macros with label arguments
+      '("vref" TeX-arg-label)
+      '("vpageref" [ "Same page text" ] [ "different page text" ] TeX-arg-label)
+      '("fullref" TeX-arg-label)
+
+      ;; And the other macros used for customization
+      "reftextbefore" "reftextfacebefore"
+      "reftextafter"  "reftextfaceafter"
+      "reftextfaraway" "vreftextvario" "vrefwarning")
+
+     ;; Install completion for labels
+     (setq TeX-complete-list
+          (append
+           '(("\\\\vref{\\([^{}\n\r\\%,]*\\)" 1 LaTeX-label-list "}")
+             ("\\\\vpageref\\(\\[[^]]*\\]\\)*{\\([^{}\n\r\\%,]*\\)" 
+              2 LaTeX-label-list "}"))
+           TeX-complete-list))))
+
+(defvar LaTeX-varioref-package-options '("draft" "final" "afrikaans" 
+                                      "american" "austrian" "naustrian"
+                                      "brazil" "breton" "catalan" "croatian"
+                                      "czech" "danish" "dutch" "english"
+                                      "esperanto" "finnish" "french"
+                                      "galician" "german" "ngerman" "greek"
+                                      "italian" "magyar" "norsk" "nynorsk"
+                                      "polish" "portuges" "romanian"
+                                      "russian" "slovak" "slovene"
+                                      "spanish" "swedish" "turkish"
+                                      "francais" "germanb")
+  "Package options for the varioref package.")
+
+;;; varioref.el ends here
diff --git a/packages/auctex/style/verbatim.el b/packages/auctex/style/verbatim.el
new file mode 100644 (file)
index 0000000..2c95def
--- /dev/null
@@ -0,0 +1,43 @@
+;;; verbatim.el --- Style hook for the verbatim package.
+
+;; Copyright (C) 2001 Free Software Foundation, Inc.
+
+;; Author: Masayuki Ataka <masayuki.ataka@gmail.com>
+;; Maintainer: auctex-devel@gnu.org
+;; Created: 2001/05/01
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;;  M-x TeX-auto-generate verbatim.sty makes garbages.
+
+;;; Code
+
+(TeX-add-style-hook "verbatim"
+ (function
+  (lambda ()
+    (LaTeX-add-environments
+     "comment")
+    (TeX-add-symbols
+     '("verbatiminput" TeX-arg-file)))))
+
+(defvar LaTeX-verbatim-package-options nil
+  "Package options for the verbatim package.")
+
+;;; verbatim.el ends here.
diff --git a/packages/auctex/style/virtex.el b/packages/auctex/style/virtex.el
new file mode 100644 (file)
index 0000000..af44a99
--- /dev/null
@@ -0,0 +1,83 @@
+;;; virtex.el - Common code for all TeX formats.
+
+;; $Id: virtex.el,v 1.1 1994/01/23 08:14:44 amanda Exp $
+
+;;; Code:
+
+(TeX-add-style-hook "virtex"
+ (function
+  (lambda ()
+    (TeX-add-symbols "/" "above" "abovedisplayshortskip"
+                    "abovedisplayskip" "abovewithdelims" "accent"
+                    "adjdemerits" "advance" "afterassignment"
+                    "aftergroup" "atop" "atopwithdelims" "badness"
+                    "baselineskip" "batchmode" "begingroup"
+                    "belowdisplayshortskip" "belowdisplayskip"
+                    "binoppenalty" "botmark" "box" "boxmaxdepth"
+                    "brokenpenalty" "catcode" "char" "chardef"
+                    "cleaders" "closein" "closeout" "clubpenalty"
+                    "copy" "count" "countdef" "cr" "crcr" "csname"
+                    "day" "deadcycles" "def" "defaulthyphenchar"
+                    "defaultskewchar" "delcode" "delimiter"
+                    "delimiterfactor" "delimitershortfall" "dimen"
+                    "dimendef" "discretionary" "displayindent"
+                    "displaylimits" "displaystyle"
+                    "displaywidowpenalty" "displaywidth" "divide"
+                    "doublehyphendemerits" "dp" "dump" "edef" "else"
+                    "emergencystretch" "end" "endcsname" "endgroup"
+                    "endinput" "endlinechar" "eqno" "errhelp"
+                    "errmessage" "errorcontextlines" "errorstopmode"
+                    "escapechar" "everycr" "everydisplay"
+                    "everyhbox" "everyjob" "everymath" "everypar"
+                    "everyvbox" "exhyphenpenalty" "expandafter"
+                    "fam" "fi" "finalhyphendemerits" "firstmark"
+                    "floatingpenalty" "font" "fontdimen" "fontname"
+                    "futurelet" "gdef" "global" "globaldefs"
+                    "halign" "hangafter" "hangindent" "hbadness"
+                    "hbox" "hfil" "hfill" "hfilneg" "hfuzz"
+                    "hoffset" "holdinginserts" "hrule" "hsize"
+                    "hskip" "hss" "ht" "hyphenpenation" "hyphenchar"
+                    "hyphenpenalty" "if" "ifcase" "ifcat" "ifdim"
+                    "ifeof" "iffalse" "ifhbox" "ifinner" "ifhmode"
+                    "ifmmode" "ifnum" "ifodd" "iftrue" "ifvbox"
+                    "ifvoid" "ifx" "ignorespaces" "immediate"
+                    "indent" "input" "inputlineno" "insert"
+                    "insertpenalties" "interlinepenalty" "jobname"
+                    "kern" "language" "lastbox" "lastkern"
+                    "lastpenalty" "lastskip" "lccode" "leaders"
+                    "left" "lefthyphenmin" "leftskip" "leqno" "let"
+                    "limits" "linepenalty" "lineskip"
+                    "lineskiplimit" "long" "looseness" "lower"
+                    "lowercase" "mag" "markaccent" "mathbin"
+                    "mathchar" "mathchardef" "mathchoise"
+                    "mathclose" "mathcode" "mathinner" "mathhop"
+                    "mathopen" "mathord" "mathpunct" "mathrel"
+                    "mathsurround" "maxdeadcycles" "maxdepth"
+                    "meaning" "medmuskip" "message" "mkern" "month"
+                    "moveleft" "moveright" "mskip" "multiply"
+                    "muskip" "muskipdef" "newlinechar" "noalign"
+                    "noboundary" "noexpand" "noindent" "nolimits"
+                    "nonscript" "nonstopmode" "nulldelimiterspace"
+                    "nullfont" "number" "omit" "openin" "openout"
+                    "or" "outer" "output" "outputpenalty"
+                    "overfullrule" "parfillskip" "parindent"
+                    "parskip" "pausing" "postdisplaypenalty"
+                    "predisplaypenalty" "predisplaysize"
+                    "pretolerance" "relpenalty" "rightskip"
+                    "scriptspace" "showboxbreadth" "showboxdepth"
+                    "smallskipamount" "spaceskip" "splitmaxdepth"
+                    "splittopskip" "tabskip" "thickmuskip"
+                    "thinmuskip" "time" "tolerance" "topskip"
+                    "tracingcommands" "tracinglostchars"
+                    "tracingmacros" "tracingonline" "tracingoutput"
+                    "tracingpages" "tracingparagraphs"
+                    "tracingrestores" "tracingstats" "uccode"
+                    "uchyph" "underline" "unhbox" "unhcopy" "unkern"
+                    "unpenalty" "unskip" "unvbox" "unvcopy"
+                    "uppercase" "vadjust" "valign" "vbadness" "vbox"
+                    "vcenter" "vfil" "vfill" "vfilneg" "vfuzz"
+                    "voffset" "vrule" "vsize" "vskip" "vss" "vtop"
+                    "wd" "widowpenalty" "write" "xdef" "xleaders"
+                    "xspaceskip" "year"))))
+
+;;; virtex.el ends here
diff --git a/packages/auctex/tex-bar.el b/packages/auctex/tex-bar.el
new file mode 100644 (file)
index 0000000..cf7bc1d
--- /dev/null
@@ -0,0 +1,513 @@
+;;; tex-bar.el --- toolbar icons on AUCTeX in GNU emacs and XEmacs
+
+;; Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+
+;; 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, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+;; MA 02110-1301 USA
+
+;; Author: Miguel V. S. Frasson <frasson@math.leidenuniv.nl>
+;; Keywords: tool-bar, tex, latex
+
+;;; Commentary:
+;;
+
+;; This package also needs `toolbar-x.el', and `latex.el' for the
+;; symbol-toolbar.
+
+;;; Use of this preliminary version:
+
+;; -  Add `LaTeX-install-toolbar' to `LaTeX-mode-hook'.
+
+;; Special requirements for the use of experimental symbol-toolbar:
+
+;; -  Customize `TeX-bar-LaTeX-buttons', adding the label
+;;    `LaTeX-symbols-experimental' at the end.
+
+;; -  You should have a folder called "symb-pics" with the pics of the
+;;    symbols (xpm format is a good one), and the *parent* of this
+;;    folder should be in `load-path'.
+
+;; Did you read carefully this item?  I will say again: the folder
+;; "symb-pics" should *not* be in `load-path', but its *parent*.
+
+;; -  each image file is named after the command that it represents in
+;;    the following rules: the base name is the name of the command
+;;    without the escape character "\", like \delta -> "delta.xpm";
+;;    however, since in some OS filenames are case insensitive, all
+;;    occurences of capital letter should be replaced by the letter
+;;    plus a dash: \Rightarrow -> "R-ightarrow.xpm" --- actually, for
+;;    the correct name, apply `TeX-bar-img-filename' to "Rightarrow"
+;;     (TeX-bar-img-filename "Rightarrow")
+;;            -->  "R-ightarrow"
+;;    The function `TeX-bar-img-filename' also treats special commands
+;;    like `\{', `\|', etc.
+
+;; You can get the symbol images on (temporary solution)
+;;    http://www.math.leidenuniv.nl/~frasson/symb-pics.tar.gz
+
+;;; Code:
+
+(require 'custom)
+
+(require 'toolbar-x)
+
+;; for error handling
+(require 'tex-buf)
+
+;; For the symbol toolbar
+(require 'latex)
+
+;;; Standard buttons
+
+;; help strings
+(defun TeX-bar-help-from-command-list (item)
+  "Return the help string of ITEM in `TeX-command-list'.
+If there is no help, the empty string is returned."
+  (let ((help (nth 1 (memq :help (assoc item TeX-command-list)))))
+    (if help help "")))
+
+(defgroup TeX-tool-bar nil
+  "Tool bar support in AUCTeX."
+  :group 'AUCTeX)
+
+(defcustom TeX-bar-TeX-buttons
+  '(new-file open-file dired kill-buffer save-buffer cut copy paste undo
+            [separator nil] tex next-error view bibtex)
+  "List of buttons available in `tex-mode'.
+It should be a list in the same format of the BUTTONS parameter
+in function `toolbarx-install-toolbar', often a symbol that
+labels a button or Emacs/XEmacs choice of buttons.
+
+Type `\\[TeX-bar-TeX-buttons]' for a list of available buttons.
+
+Buttons are defined in alists (labels associated to properties
+that define a button).  For a list of variables that hold such
+alists, see variable `TeX-bar-TeX-all-button-alists'."
+  :type '(list (set :inline t
+                   (const new-file)
+                   (const open-file)
+                   (const dired)
+                   (const kill-buffer)
+                   (const save-buffer)
+                   (const write-file)
+                   (const undo)
+                   (const cut)
+                   (const copy)
+                   (const paste)
+                   (const search-forward)
+                   (const print-buffer)
+                   (const [separator nil])
+                   (const tex)
+                   (const next-error)
+                   (const view)
+                   (const file)
+                   (const bibtex)
+                   (const clean))
+                   ;; (const latex-symbols-experimental)
+              (repeat (choice (symbol :tag "Label")
+                              (vector :args ((symbol :tag "Label in Emacs ")
+                                             (symbol :tag "Label in XEmacs"))
+                                      :tag "Emacs/XEmacs choice")
+                              (sexp :tag "General element"))))
+  :group 'TeX-tool-bar)
+
+(defun TeX-bar-TeX-buttons ()
+  "Display in a buffer a list of buttons for `tex-bar.el'."
+  (interactive)
+  (let ((assqs-button-alists)
+       (labels))
+    (dolist (m-alist TeX-bar-TeX-all-button-alists)
+      (setq labels nil)
+      (dolist (as (eval m-alist))
+       (setq labels (cons (car as) labels)))
+      (setq assqs-button-alists (cons (cons m-alist (nreverse labels))
+                                      assqs-button-alists)))
+    (setq assqs-button-alists (nreverse assqs-button-alists))
+    ;; displaying results
+    (save-excursion
+      (set-buffer (get-buffer-create "*TeX tool bar buttons*"))
+      (erase-buffer)
+      (insert "Available buttons for TeX mode
+================================")
+      (dolist (i assqs-button-alists)
+       (insert (format "\n\n`%s' provides the following buttons:\n  " (car i)))
+       (dolist (j (cdr i))
+         (insert (format " %s" j)))
+       (fill-region (point-at-bol) (point-at-eol))))
+    (display-buffer "*TeX tool bar buttons*" t)))
+
+(defgroup TeX-tool-bar-button-definitions nil
+  "Collections of button definitions."
+  :group 'TeX-tool-bar)
+
+(defcustom TeX-bar-TeX-all-button-alists
+  '(TeX-bar-TeX-button-alist
+    toolbarx-default-toolbar-meaning-alist)
+  "List of variables that hold buttons properties.
+Each element should be a symbol bound to list in the format of
+the argument BUTTON-ALIST in function `toolbarx-install-toolbar'."
+  :type '(repeat variable)
+  :group 'TeX-tool-bar-button-definitions)
+
+(defcustom TeX-bar-TeX-button-alist
+  '((tex :image (lambda nil (if TeX-PDF-mode "pdftex" "tex"))
+        :command (progn
+                   (TeX-save-document (TeX-master-file))
+                   (TeX-command "TeX" 'TeX-master-file -1))
+        :help (lambda (&rest ignored)
+                (TeX-bar-help-from-command-list "TeX")))
+    (pdftex :image "pdftex"
+           :command (progn
+                      (TeX-save-document (TeX-master-file))
+                      (TeX-command "PDFTeX" 'TeX-master-file -1))
+           :help (lambda (&rest ignored)
+                   (TeX-bar-help-from-command-list "PDFTeX")))
+    (next-error :image "error"
+               :command TeX-next-error
+               :enable (plist-get TeX-error-report-switches
+                                  (intern (TeX-master-file)))
+               :visible (plist-get TeX-error-report-switches
+                                   (intern (TeX-master-file))))
+    (view :image (lambda nil (if TeX-PDF-mode "viewpdf" "viewdvi"))
+         :command (TeX-command "View" 'TeX-master-file -1)
+         :help (lambda (&rest ignored)
+                 (TeX-bar-help-from-command-list "View")))
+    (file :image "dvips"
+         :command (TeX-command "File" 'TeX-master-file -1)
+         :visible (not TeX-PDF-mode)
+         :help (lambda (&rest ignored)
+                 (TeX-bar-help-from-command-list "File")))
+    (bibtex :image "bibtex"
+           :command (TeX-command "BibTeX" 'TeX-master-file -1)
+           :help (lambda (&rest ignored)
+                   (TeX-bar-help-from-command-list "BibTeX")))
+    (clean  :image "delete"
+           :command (TeX-command "Clean" 'TeX-master-file -1)
+           :help (lambda (&rest ignored)
+                   (TeX-bar-help-from-command-list "Clean"))))
+  ;; latex-symbols-experimental?
+  "Alist for button definitions in TeX bar.
+Value should le a list where each element is of format (KEY .
+PROPS), where KEY is a symbol that labels the button and PROPS is
+a list of properties of the button.  For a description of the
+format of PROPS, please see documentation of function
+`toolbarx-install-toolbar'.  This custom variable is in the same
+format of the argument MEANING-ALIST in the mentioned function."
+  :type '(alist :key-type symbol :value-type sexp)
+  :group 'TeX-tool-bar-button-definitions)
+
+;;; Installation of the tool bar
+;;;###autoload
+(defun TeX-install-toolbar ()
+  "Install toolbar buttons for TeX mode."
+  (interactive)
+  (require 'toolbar-x)
+  (add-to-list 'toolbarx-image-path
+              (expand-file-name "images" TeX-data-directory))
+  (add-hook 'TeX-PDF-mode-hook 'toolbarx-refresh nil t)
+  (toolbarx-install-toolbar TeX-bar-TeX-buttons
+                           (let ((append-list))
+                             (dolist (elt TeX-bar-TeX-all-button-alists)
+                               (setq append-list (append append-list
+                                                         (eval elt))))
+                             append-list)))
+
+(defcustom TeX-bar-LaTeX-buttons
+  '(new-file open-file dired kill-buffer save-buffer cut copy paste undo
+             [separator nil] latex next-error view bibtex)
+  "List of buttons available in `latex-mode'.
+It should be a list in the same format of the BUTTONS parameter
+in function `toolbarx-install-toolbar', often a symbol that
+labels a button or Emacs/XEmacs choice of buttons.
+
+Type `\\[TeX-bar-LaTeX-buttons]' for a list of available buttons.
+
+Buttons are defined in alists (labels associated to properties
+that define a button).  For a list of variables that hold such
+alists, see variable `TeX-bar-LaTeX-all-button-alists'."
+  :type '(list (set :inline t
+                   (const new-file)
+                   (const open-file)
+                   (const dired)
+                   (const kill-buffer)
+                   (const save-buffer)
+                   (const write-file)
+                   (const undo)
+                   (const cut)
+                   (const copy)
+                   (const paste)
+                   (const search-forward)
+                   (const print-buffer)
+                   (const [separator nil])
+                   (const latex)
+                   (const next-error)
+                   (const view)
+                   (const file)
+                   (const bibtex)
+                   (const clean)
+                   (const latex-symbols-experimental))
+              (repeat (choice (symbol :tag "Label")
+                              (vector :args ((symbol :tag "Label in Emacs ")
+                                             (symbol :tag "Label in XEmacs"))
+                                      :tag "Emacs/XEmacs choice")
+                              (sexp :tag "General element"))))
+  :group 'TeX-tool-bar)
+
+(defun TeX-bar-LaTeX-buttons ()
+  "Display in a buffer a list of buttons for `tex-bar.el'."
+  (interactive)
+  (let ((assqs-button-alists)
+       (labels))
+    (dolist (m-alist TeX-bar-LaTeX-all-button-alists)
+      (setq labels nil)
+      (dolist (as (eval m-alist))
+       (setq labels (cons (car as) labels)))
+      (setq assqs-button-alists (cons (cons m-alist (nreverse labels))
+                                      assqs-button-alists)))
+    (setq assqs-button-alists (nreverse assqs-button-alists))
+    ;; displaying results
+    (save-excursion
+      (set-buffer (get-buffer-create "*TeX tool bar buttons*"))
+      (erase-buffer)
+      (insert "Available buttons for LaTeX mode
+================================")
+      (dolist (i assqs-button-alists)
+       (insert (format "\n\n`%s' provides the following buttons:\n  " (car i)))
+       (dolist (j (cdr i))
+         (insert (format " %s" j)))
+       (fill-region (point-at-bol) (point-at-eol))))
+    (display-buffer "*TeX tool bar buttons*" t)))
+
+(defgroup TeX-tool-bar-button-definitions nil
+  "Collections of button definitions."
+  :group 'TeX-tool-bar)
+
+(defcustom TeX-bar-LaTeX-all-button-alists
+  '(TeX-bar-LaTeX-button-alist
+    toolbarx-default-toolbar-meaning-alist)
+  "List of variables that hold buttons properties.
+Each element should be a symbol bound to list in the format of
+the argument BUTTON-ALIST in function `toolbarx-install-toolbar'."
+  :type '(repeat variable)
+  :group 'TeX-tool-bar-button-definitions)
+
+(defcustom TeX-bar-LaTeX-button-alist
+  '((latex :image (lambda nil (if TeX-PDF-mode "pdftex" "tex"))
+          :command (progn
+                     (TeX-save-document (TeX-master-file))
+                     (TeX-command "LaTeX" 'TeX-master-file -1))
+          :help (lambda (&rest ignored)
+                  (TeX-bar-help-from-command-list "LaTeX")))
+    (pdflatex :image "pdftex"
+             :command (progn
+                        (TeX-save-document (TeX-master-file))
+                        (TeX-command "PDFLaTeX" 'TeX-master-file -1))
+             :help (lambda (&rest ignored)
+                     (TeX-bar-help-from-command-list "PDFLaTeX")))
+    (next-error :image "error"
+               :command TeX-next-error
+               :enable (plist-get TeX-error-report-switches
+                                  (intern (TeX-master-file)))
+               :visible (plist-get TeX-error-report-switches
+                                   (intern (TeX-master-file))))
+    (view :image (lambda nil (if TeX-PDF-mode "viewpdf" "viewdvi"))
+         :command (TeX-command "View" 'TeX-master-file -1)
+         :help (lambda (&rest ignored)
+                 (TeX-bar-help-from-command-list "View")))
+    (file :image "dvips"
+         :command (TeX-command "File" 'TeX-master-file -1)
+         :visible (not TeX-PDF-mode)
+         :help (lambda (&rest ignored)
+                 (TeX-bar-help-from-command-list "File")))
+    (bibtex :image "bibtex"
+           :command (TeX-command "BibTeX" 'TeX-master-file -1)
+           :help (lambda (&rest ignored)
+                   (TeX-bar-help-from-command-list "BibTeX")))
+    (clean  :image "delete"
+           :command (TeX-command "Clean" 'TeX-master-file -1)
+           :help (lambda (&rest ignored)
+                   (TeX-bar-help-from-command-list "Clean")))
+    (latex-symbols-experimental . (:alias :eval-group
+                                         LaTeX-symbols-toolbar-switch-contents
+                                         LaTeX-symbols-toolbar-contents)))
+  "Alist for button definitions in TeX bar.
+Value should le a list where each element is of format (KEY .
+PROPS), where KEY is a symbol that labels the button and PROPS is
+a list of properties of the button.  For a description of the
+format of PROPS, please see documentation of function
+`toolbarx-install-toolbar'.  This custom variable is in the same
+format of the argument MEANING-ALIST in the mentioned function."
+  :type '(alist :key-type symbol :value-type sexp)
+  :group 'TeX-tool-bar-button-definitions)
+
+;;; Installation of the tool bar
+;;;###autoload
+(defun LaTeX-install-toolbar ()
+  "Install toolbar buttons for LaTeX mode."
+  (interactive)
+  (require 'toolbar-x)
+  (add-to-list 'toolbarx-image-path
+              (expand-file-name "images" TeX-data-directory))
+  (add-hook 'TeX-PDF-mode-hook 'toolbarx-refresh nil t)
+  (toolbarx-install-toolbar TeX-bar-LaTeX-buttons
+                           (let ((append-list))
+                             (dolist (elt TeX-bar-LaTeX-all-button-alists)
+                               (setq append-list (append append-list
+                                                         (eval elt))))
+                             append-list)))
+
+;;; Experimental Symbol Toolbar
+
+;;; symbol toolbar
+(defun TeX-bar-img-filename (tex-command)
+  "Return the filename (no extension) for the image button of TEX-COMMAND."
+  (let ((str-list (append tex-command nil))
+       (str-result))
+    (dolist (i str-list)
+      (cond
+       ;; capital letter -> letter + "-"
+       ((and (>= i ?A) (<= i ?Z))
+       (setq str-result (cons ?- (cons i str-result))))
+       ;; lowercase letter -> letter
+       ((and (>= i ?a) (<= i ?z))
+        (setq str-result (cons i str-result)))
+       ;; open curly brackets `{' -> "ocb--"
+       ((eq i ?{)
+       (setq str-result (cons ?o str-result))
+       (setq str-result (cons ?c str-result))
+       (setq str-result (cons ?b str-result))
+       (setq str-result (cons ?- str-result))
+       (setq str-result (cons ?- str-result)))
+       ;; close curly brackets `}' -> "ccb--"
+       ((eq i ?})
+       (setq str-result (cons ?c str-result))
+       (setq str-result (cons ?c str-result))
+       (setq str-result (cons ?b str-result))
+       (setq str-result (cons ?- str-result))
+       (setq str-result (cons ?- str-result)))
+       ;; vertical bar `|' -> "v--"
+       ((eq i ?|)
+       (setq str-result (cons ?v str-result))
+       (setq str-result (cons ?- str-result))
+       (setq str-result (cons ?- str-result)))
+       ;; slash `/' -> "s--"
+       ((eq i ?/)
+       (setq str-result (cons ?s str-result))
+       (setq str-result (cons ?- str-result))
+       (setq str-result (cons ?- str-result)))))
+    (concat (nreverse str-result))))
+
+(let* ((menu-strings-buttons-alist
+       ;; make a alist os strings with the symbol classes and store it in
+       ;; `menu-strings-alist'
+       (let* ((menu-strings-alist-temp))
+         (dolist (item-external (cdr LaTeX-math-menu)
+                                (nreverse menu-strings-alist-temp))
+           (when (listp item-external)
+             ;; if first element is vector, I am supposing that all are
+             ;; vectors as well
+             (if (vectorp (cadr item-external))
+                 (let* ((menu-str (car item-external))
+                        (menu-buttons))
+                   (dolist (button (cdr item-external))
+                     (setq menu-buttons
+                           (cons (list (intern (TeX-bar-img-filename
+                                                (aref button 0)))
+                                       :image
+                                       (concat "symb-pics/"
+                                               (TeX-bar-img-filename
+                                                (aref button 0)))
+                                       :help (aref button 0)
+                                       :command (aref button 1))
+                                 menu-buttons)))
+                   (setq menu-buttons (nreverse menu-buttons))
+                   (setq menu-strings-alist-temp
+                         (cons (cons menu-str (list menu-buttons))
+                               menu-strings-alist-temp)))
+               ;; if another list (therefore, up to second level menu)
+               (let ((parent-str (concat (car item-external) " ")))
+                 (dolist (item-internal (cdr item-external))
+                   (unless (equal (car item-internal) "Special")
+                     (let* ((menu-str (concat parent-str
+                                              (car item-internal)))
+                            (menu-buttons))
+                       (dolist (button (cdr item-internal))
+                         (setq menu-buttons
+                               (cons (list (intern (aref button 0))
+                                           :image
+                                           (concat "symb-pics/"
+                                                   (TeX-bar-img-filename
+                                                    (aref button 0)))
+                                           :help (aref button 0)
+                                           :command (aref button 1))
+                                     menu-buttons)))
+                       (setq menu-buttons (nreverse menu-buttons))
+                       (setq menu-strings-alist-temp
+                             (cons (cons menu-str (list menu-buttons))
+                                   menu-strings-alist-temp)))))))))))
+       (list-strings (let* ((list-str-temp))
+                      (dolist (i menu-strings-buttons-alist
+                                 (nreverse list-str-temp))
+                        (setq list-str-temp (cons (car i)
+                                                  list-str-temp))))))
+  (defvar LaTeX-symbols-toolbar-visible-flag nil
+    "Non-nil means that the LaTeX symbols on toolbar are visible.
+Internal variable.")
+  (defconst LaTeX-symbols-toolbar-switch-contents
+    `(;; the on-off switch button
+      (latex-symbols-switch
+       :image (lambda nil (if LaTeX-symbols-toolbar-visible-flag
+                             "ltx-symb-turn-off"
+                           "ltx-symb-turn-on"))
+       :command (progn
+                 (setq LaTeX-symbols-toolbar-visible-flag
+                       (not LaTeX-symbols-toolbar-visible-flag))
+                 (toolbarx-refresh))
+       ;; help message depends on if symb-toolbar is on or off, and in
+       ;; the name of the current class of symbols
+       :help (lambda (&rest ignore)
+              (concat "Turn "
+                      (if LaTeX-symbols-toolbar-visible-flag "off " "on ")
+                      "the toolbar of LaTeX symbols (current class: "
+                      (nth (1- LaTeX-symbols-active-menuitem)
+                           (quote ,list-strings))
+                      ")")))
+      ;; the dropdown button, that also switch on the symbols
+      ,(append '(:dropdown-group)
+              list-strings
+              '(:variable
+                LaTeX-symbols-active-menuitem
+                :save offer
+                :dropdown-prepend-command
+                (setq LaTeX-symbols-toolbar-visible-flag t)
+                :dropdown-help "Select a class of symbols to be displayed"))))
+  (defconst LaTeX-symbols-toolbar-contents
+    (let* ((ltx-symb)
+          (count 0))
+      (dolist (i menu-strings-buttons-alist
+                (append (nreverse ltx-symb)
+                        '(:insert
+                          LaTeX-symbols-toolbar-visible-flag
+                          :toolbar (bottom . top))))
+       (setq count (1+ count))
+       (setq ltx-symb
+             (cons (append (cdr i)
+                           `(:insert (eq LaTeX-symbols-active-menuitem
+                                         ,count)))
+                   ltx-symb))))))
+
+(provide 'tex-bar)
+
+;;; tex-bar.el ends here
diff --git a/packages/auctex/tex-buf.el b/packages/auctex/tex-buf.el
new file mode 100644 (file)
index 0000000..c1b7665
--- /dev/null
@@ -0,0 +1,2143 @@
+;;; tex-buf.el --- External commands for AUCTeX.
+
+;; Copyright (C) 1991, 1993, 1996, 2001, 2003, 2004, 2005, 2006, 2007,
+;;   2008, 2009 Free Software Foundation, Inc.
+
+;; Maintainer: auctex-devel@gnu.org
+;; Keywords: tex, wp
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file provides support for external commands.
+
+;;; Code:
+
+(require 'tex)
+
+;;; Customization:
+
+(defcustom TeX-process-asynchronous (not (eq system-type 'ms-dos))
+  "*Use asynchronous processes."
+  :group 'TeX-command
+  :type 'boolean)
+
+(defcustom TeX-shell
+  (if (memq system-type '(ms-dos emx windows-nt))
+      shell-file-name
+    "/bin/sh")
+  "Name of shell used to parse TeX commands."
+  :group 'TeX-command
+  :type 'file)
+
+(defcustom TeX-shell-command-option
+  (cond ((memq system-type '(ms-dos emx windows-nt) )
+        (cond ((boundp 'shell-command-option)
+               shell-command-option)
+              ((boundp 'shell-command-switch)
+               shell-command-switch)
+              (t
+               "/c")))
+       (t                              ;Unix & EMX (Emacs 19 port to OS/2)
+        "-c"))
+  "Shell argument indicating that next argument is the command."
+  :group 'TeX-command
+  :type 'string)
+
+;;; Interactive Commands
+;;
+;; The general idea is, that there is one process and process buffer
+;; associated with each master file, and one process and process buffer
+;; for running TeX on a region.   Thus, if you have N master files, you
+;; can run N + 1 processes simultaneously.
+;;
+;; Some user commands operates on ``the'' process.  The following
+;; algorithm determine what ``the'' process is.
+;;
+;; IF   last process started was on a region
+;; THEN ``the'' process is the region process
+;; ELSE ``the'' process is the master file (of the current buffer) process
+
+(defun TeX-save-document (name)
+  "Save all files belonging to the current document.
+Return non-nil if document need to be re-TeX'ed."
+  (interactive (list (TeX-master-file)))
+  (if (string-equal name "")
+      (setq name (TeX-master-file)))
+
+  (TeX-check-files (concat name "." (TeX-output-extension))
+                  (cons name (TeX-style-list))
+                  TeX-file-extensions))
+
+(defun TeX-command-master (&optional override-confirm)
+  "Run command on the current document.
+
+If a prefix argument OVERRIDE-CONFIRM is given, confirmation will
+depend on it being positive instead of the entry in `TeX-command-list'."
+  (interactive "P")
+  (TeX-command (TeX-command-query (TeX-master-file)) 'TeX-master-file
+              override-confirm))
+
+(defvar TeX-command-region-begin nil)
+(defvar TeX-command-region-end nil)
+;; Used for marking the last region.
+
+(make-variable-buffer-local 'TeX-command-region-begin)
+(make-variable-buffer-local 'TeX-command-region-end)
+
+(defun TeX-current-offset (&optional pos)
+  "Calculate line offset of POS, or of point if POS is nil."
+  (save-restriction
+    (widen)
+    (save-excursion
+      (let ((inhibit-point-motion-hooks t)
+           (inhibit-field-text-motion t))
+       (if pos (goto-char pos))
+       (+ (count-lines (point-min) (point))
+          (if (bolp) 0 -1))))))
+
+(defun TeX-pin-region (begin end)
+  "Pin the TeX region specified by BEGIN and END.
+If BEGIN is nil, the region is unpinned.
+
+In interactive use, a positive prefix arg will pin the region,
+a non-positive one will unpin it.  Without a prefix arg, if
+a region is actively marked, it will get pinned.  If not, a
+pinned region will get unpinned and vice versa."
+  (interactive
+   (if
+       (if current-prefix-arg
+          (> (prefix-numeric-value current-prefix-arg) 0)
+        (or (TeX-active-mark)
+            (null TeX-command-region-begin)))
+       (list (region-beginning) (region-end))
+     '(nil nil)))
+  (if begin
+      (progn
+       (unless (markerp TeX-command-region-begin)
+         (setq TeX-command-region-begin (make-marker))
+         (setq TeX-command-region-end (make-marker)))
+       (set-marker TeX-command-region-begin begin)
+       (set-marker TeX-command-region-end end)
+       (message "TeX region pinned."))
+    (when (markerp TeX-command-region-begin)
+      (set-marker TeX-command-region-begin nil)
+      (set-marker TeX-command-region-end nil))
+    (setq TeX-command-region-begin nil)
+    (setq TeX-command-region-end nil)
+    (message "TeX region unpinned.")))
+
+(defun TeX-command-region (&optional override-confirm)
+  "Run TeX on the current region.
+
+Query the user for a command to run on the temporary file specified by
+the variable `TeX-region'.  If there is an explicitly active region,
+it is stored for later commands.  If not, a previously stored region
+\(can be also be set with `TeX-pin-region') overrides the current region,
+if present.
+
+If a prefix argument OVERRIDE-CONFIRM is given, prompting will
+ignore the prompting flag from `TeX-command-list' and instead
+will prompt iff the prefix is positive.
+
+If the master file for the document has a header, it is written to the
+temporary file before the region itself.  The document's header is all
+text before `TeX-header-end'.
+
+If the master file for the document has a trailer, it is written to
+the temporary file before the region itself.  The document's trailer is
+all text after `TeX-trailer-start'."
+  (interactive "P")
+  ;; Note that TeX-command-region-begin is not a marker when called
+  ;; from TeX-command-buffer.
+  (and (or (null TeX-command-region-begin)
+          (markerp TeX-command-region-begin))
+       (TeX-active-mark)
+       (TeX-pin-region (region-beginning) (region-end)))
+  (let ((begin (or TeX-command-region-begin (region-beginning)))
+       (end (or TeX-command-region-end (region-end))))
+    (TeX-region-create (TeX-region-file TeX-default-extension)
+                      (buffer-substring begin end)
+                      (file-name-nondirectory (buffer-file-name))
+                      (TeX-current-offset begin)))
+  (TeX-command (TeX-command-query (TeX-region-file nil t)) 'TeX-region-file
+              override-confirm))
+
+(defun TeX-command-buffer (&optional override-confirm)
+  "Run TeX on the current buffer.
+
+Query the user for a command to run on the temporary file specified by
+the variable `TeX-region'.  The region file will be recreated from the
+visible part of the buffer.
+
+If a prefix argument OVERRIDE-CONFIRM is given, confirmation will
+depend on it being positive instead of the entry in `TeX-command-list'."
+  (interactive "P")
+  (let ((TeX-command-region-begin (point-min))
+       (TeX-command-region-end (point-max)))
+    (TeX-command-region override-confirm)))
+
+(unless (featurep 'xemacs)
+  ;; This variable is not defined in XEmacs because XEmacs' version of
+  ;; `pop-to-buffer' doesn't support the optional NORECORD argument.  In
+  ;; XEmacs, the third arg is ON-FRAME (Emacs: NORECORD).
+  (defcustom TeX-record-buffer nil
+    "Whether to record buffer names of generated TeX buffers.
+When non-nil, these buffers are put at the front of the list of
+recently selected ones."
+    :group 'TeX-command
+    :type 'boolean))
+
+(defun TeX-pop-to-buffer (buffer &optional other-window norecord)
+  "Compatibility wrapper for `pop-to-buffer'.
+
+Select buffer BUFFER in some window, preferably a different one.
+BUFFER may be a buffer, a string (a buffer name), or nil.
+If BUFFER is a string which is not the name of an existing buffer,
+then this function creates a buffer with that name.
+If BUFFER is nil, then it chooses some other buffer.
+If `pop-up-windows' is non-nil, windows can be split to do this.
+If optional second arg OTHER-WINDOW is non-nil, insist on finding another
+window even if BUFFER is already visible in the selected window,
+and ignore `same-window-regexps' and `same-window-buffer-names'.
+This function returns the buffer it switched to.
+This uses the function `display-buffer' as a subroutine; see the documentation
+of `display-buffer' for additional customization information.
+
+Optional third arg NORECORD non-nil means do not put this buffer
+at the front of the list of recently selected ones.
+
+NORECORD is ignored in XEmacs."
+  ;; Make sure not to use third arg in XEmacs.  In XEmacs, the third arg is
+  ;; ON-FRAME (Emacs: NORECORD), so we set it to nil.
+  (pop-to-buffer buffer other-window (and norecord
+                                         (boundp 'TeX-record-buffer)
+                                         TeX-record-buffer)))
+
+(defun TeX-recenter-output-buffer (line)
+  "Redisplay buffer of TeX job output so that most recent output can be seen.
+The last line of the buffer is displayed on line LINE of the window, or
+at bottom if LINE is nil."
+  (interactive "P")
+  (let ((buffer (TeX-active-buffer)))
+    (if buffer
+       (let ((old-buffer (current-buffer)))
+         (TeX-pop-to-buffer buffer t t)
+         (bury-buffer buffer)
+         (goto-char (point-max))
+         (recenter (if line
+                       (prefix-numeric-value line)
+                     (/ (window-height) 2)))
+         (TeX-pop-to-buffer old-buffer nil t))
+      (message "No process for this document."))))
+
+(defun TeX-kill-job ()
+  "Kill the currently running TeX job."
+  (interactive)
+  (let ((process (TeX-active-process)))
+    (if process
+       (kill-process process)
+      ;; Should test for TeX background process here.
+      (error "No TeX process to kill"))))
+
+(defun TeX-home-buffer ()
+  "Go to the buffer where you last issued a TeX command.
+If there is no such buffer, or you already are in that buffer, find
+the master file."
+  (interactive)
+  (if (or (null TeX-command-buffer)
+         (null (buffer-name TeX-command-buffer))
+         (eq TeX-command-buffer (current-buffer)))
+      (find-file (TeX-master-file TeX-default-extension))
+    (switch-to-buffer TeX-command-buffer)))
+
+(defun TeX-next-error (reparse)
+  "Find the next error in the TeX output buffer.
+With \\[universal-argument] prefix, start from the beginning of the errors."
+  (interactive "P")
+  (if (null (TeX-active-buffer))
+      (next-error reparse)
+    (funcall (TeX-process-get-variable (with-current-buffer TeX-command-buffer
+                                        (TeX-active-master))
+                                      'TeX-parse-function)
+            reparse)))
+
+(defun TeX-previous-error (arg)
+  "Find the previous error in the TeX output buffer."
+  (interactive "P")
+  (if (null (TeX-active-buffer))
+      (previous-error arg)
+    (error "Jumping to previous error not supported")))
+
+;;; Command Query
+
+(defun TeX-command (name file &optional override-confirm)
+  "Run command NAME on the file returned by calling FILE.
+
+FILE is the symbol of a function returning a file name.  The
+function has one optional argument, the extension to use on the
+file.
+
+Use the information in `TeX-command-list' to determine how to run
+the command.
+
+If OVERRIDE-CONFIRM is a prefix argument, confirmation will be
+asked if it is positive, and suppressed if it is not."
+  (cond ((eq file 'TeX-region-file)
+        (setq TeX-current-process-region-p t))
+       ((eq file 'TeX-master-file)
+        (setq TeX-current-process-region-p nil)))
+  (let ((command (TeX-command-expand (nth 1 (assoc name TeX-command-list))
+                                    file))
+       (hook (nth 2 (assoc name TeX-command-list)))
+       (confirm (if override-confirm
+                    (> (prefix-numeric-value override-confirm) 0)
+                  (nth 3 (assoc name TeX-command-list)))))
+
+    ;; Verify the expanded command
+    (if confirm
+       (setq command
+             (read-from-minibuffer (concat name " command: ") command
+                                   nil nil)))
+
+    ;; Now start the process
+    (setq file (funcall file))
+    (TeX-process-set-variable file 'TeX-command-next TeX-command-Show)
+    (funcall hook name command file)))
+
+(defun TeX-command-expand (command file &optional list)
+  "Expand COMMAND for FILE as described in LIST.
+LIST default to `TeX-expand-list'.  As a special exception,
+`%%' can be used to produce a single `%' sign in the output
+without further expansion."
+  (let (pat
+       pos
+       entry TeX-command-text TeX-command-pos
+       (file `(lambda (&rest args)
+                (shell-quote-argument
+                 (concat (and (stringp TeX-command-pos) TeX-command-pos)
+                         (apply ',file args)
+                         (and (stringp TeX-command-pos) TeX-command-pos)))))
+       case-fold-search string expansion arguments)
+    (setq list (cons
+               (list "%%" (lambda nil
+                            (setq pos (1+ pos))
+                            "%"))
+               (or list TeX-expand-list))
+         pat (regexp-opt (mapcar #'car list)))
+    (while (setq pos (string-match pat command pos))
+      (setq string (match-string 0 command)
+           entry (assoc string list)
+           expansion (car (cdr entry)) ;Second element
+           arguments (cdr (cdr entry)) ;Remaining elements
+           string (save-match-data
+                    ;; Note regarding the special casing of `file':
+                    ;; `file' is prevented from being evaluated as a
+                    ;; function because inside of AUCTeX it only has
+                    ;; a meaning as a variable.  This makes sure that
+                    ;; a function definition made by an external
+                    ;; package (e.g. icicles) is not picked up.
+                    (cond ((and (not (eq expansion 'file))
+                                (TeX-function-p expansion))
+                           (apply expansion arguments))
+                          ((boundp expansion)
+                           (apply (eval expansion) arguments))
+                          (t
+                           (error "Nonexpansion %s" expansion)))))
+      (if (stringp string)
+         (setq command
+               (replace-match string t t command)))))
+  command)
+
+(defun TeX-check-files (derived originals extensions)
+  "Check that DERIVED is newer than any of the ORIGINALS.
+Try each original with each member of EXTENSIONS, in all directories
+in `TeX-check-path'."
+  (let ((found nil)
+       (regexp (concat "\\`\\("
+                       (mapconcat (lambda (dir)
+                                    (regexp-quote
+                                     (expand-file-name
+                                      (file-name-as-directory dir))))
+                                  TeX-check-path "\\|")
+                       "\\).*\\("
+                       (mapconcat 'regexp-quote originals "\\|")
+                       "\\)\\.\\("
+                       (mapconcat 'regexp-quote extensions "\\|")
+                       "\\)\\'"))
+       (buffers (buffer-list)))
+    (while buffers
+      (let* ((buffer (car buffers))
+            (name (buffer-file-name buffer)))
+       (setq buffers (cdr buffers))
+       (if (and name (string-match regexp name))
+           (progn
+             (and (buffer-modified-p buffer)
+                  (or (not TeX-save-query)
+                      (y-or-n-p (concat "Save file "
+                                        (buffer-file-name buffer)
+                                        "? ")))
+                  (save-excursion (set-buffer buffer) (save-buffer)))
+             (if (file-newer-than-file-p name derived)
+                 (setq found t))))))
+    found))
+
+(defcustom TeX-save-query t
+  "*If non-nil, ask user for permission to save files before starting TeX."
+  :group 'TeX-command
+  :type 'boolean)
+
+(defvar TeX-command-history nil)
+
+(defun TeX-command-query (name)
+  "Query the user for what TeX command to use."
+  (let* ((default (cond ((if (string-equal name TeX-region)
+                            (TeX-check-files (concat name "." (TeX-output-extension))
+                                             (list name)
+                                             TeX-file-extensions)
+                          (TeX-save-document (TeX-master-file)))
+                        TeX-command-default)
+                       ((and (memq major-mode '(doctex-mode latex-mode))
+                             (TeX-check-files (concat name ".bbl")
+                                              (mapcar 'car
+                                                      (LaTeX-bibliography-list))
+                                              BibTeX-file-extensions))
+                        ;; We should check for bst files here as well.
+                        TeX-command-BibTeX)
+                       ((TeX-process-get-variable name
+                                                  'TeX-command-next
+                                                  TeX-command-Show))
+                       (TeX-command-Show)))
+        (completion-ignore-case t)
+        (answer (or TeX-command-force
+                    (completing-read
+                     (concat "Command: (default " default ") ")
+                     (TeX-mode-specific-command-list major-mode) nil t
+                     nil 'TeX-command-history))))
+    ;; If the answer "latex" it will not be expanded to "LaTeX"
+    (setq answer (car-safe (TeX-assoc answer TeX-command-list)))
+    (if (and answer
+            (not (string-equal answer "")))
+       answer
+      default)))
+
+(defvar TeX-command-next nil
+  "The default command next time `TeX-command' is invoked.")
+
+ (make-variable-buffer-local 'TeX-command-next)
+
+(defun TeX-printer-query (&optional queue)
+  "Query the user for a printer name.
+QUEUE is non-nil when we are checking for the printer queue."
+  (let (command element printer)
+    (if queue
+       (unless (setq element 2 command TeX-queue-command)
+         (error "Need to customize `TeX-queue-command'"))
+      (unless (setq element 1 command TeX-print-command)
+         (error "Need to customize `TeX-print-command'")))
+    (while (progn
+            (setq printer (if TeX-printer-list
+                              (let ((completion-ignore-case t))
+                                (completing-read
+                                 (concat "Printer: "
+                                         (and TeX-printer-default
+                                              (concat "(default "
+                                                      TeX-printer-default ") ")))
+                                 TeX-printer-list))
+                            ""))
+            (setq printer (or (car-safe (TeX-assoc printer TeX-printer-list))
+                              printer))
+            (not (if (or (null printer) (string-equal "" printer))
+                     (setq printer TeX-printer-default)
+                   (setq TeX-printer-default printer)))))
+
+    (let ((expansion (let ((entry (assoc printer TeX-printer-list)))
+                      (or (nth element entry)
+                          command))))
+      (if (string-match "%p" printer)
+         (error "Don't use %s in printer names" "%p"))
+      (while (string-match "%p" expansion)
+       (setq expansion (replace-match printer t t expansion 0)))
+      expansion)))
+
+(defun TeX-style-check (styles)
+  "Check STYLES compared to the current style options."
+  (let ((files (TeX-style-list)))
+    (while (and styles
+               (not (TeX-member (car (car styles)) files 'string-match)))
+      (setq styles (cdr styles))))
+  (if styles
+      (nth 1 (car styles))
+    ""))
+
+(defun TeX-output-extension ()
+  "Get the extension of the current TeX output file."
+  (if (listp TeX-output-extension)
+      (car TeX-output-extension)
+    (or (TeX-process-get-variable (TeX-active-master)
+                               'TeX-output-extension
+                               TeX-output-extension)
+       TeX-output-extension)))
+
+(defun TeX-view-mouse (event)
+  "Start `TeX-view' at mouse position."
+  (interactive "e")
+  (save-excursion
+    (set-buffer (window-buffer (posn-window (event-start event))))
+    (goto-char (posn-point (event-start event)))
+    (TeX-view)))
+
+(defun TeX-view ()
+  "Start a viewer without confirmation.
+The viewer is started either on region or master file,
+depending on the last command issued."
+  (interactive)
+  (let ((output-file (TeX-active-master (TeX-output-extension))))
+    (if (file-exists-p output-file)
+       (TeX-command "View" 'TeX-active-master 0)
+      (message "Output file %S does not exist." output-file))))
+
+(defun TeX-output-style-check (styles)
+  "Check STYLES compared to the current view output file extension and
+the current style options."
+  (let ((ext  (TeX-output-extension))
+       (files (TeX-style-list)))
+    (while (and
+           styles
+           (or
+            (not (string-match (car (car styles)) ext))
+            (let ((style (nth 1 (car styles))))
+              (cond
+               ((listp style)
+                (while
+                    (and style
+                         (TeX-member (car style) files 'string-match))
+                  (setq style (cdr style)))
+                style)
+               ((not (TeX-member style files 'string-match)))))))
+      (setq styles (cdr styles)))
+    (if styles
+       (nth 2 (car styles))
+      "%v")))
+
+;;; Command Hooks
+
+(defvar TeX-after-start-process-function nil
+  "Hooks to run after starting an asynchronous process.
+Used by Japanese TeX to set the coding system.")
+
+(defcustom TeX-show-compilation nil
+  "*If non-nil, show output of TeX compilation in other window."
+  :group 'TeX-command
+  :type 'boolean)
+
+(defun TeX-run-command (name command file)
+  "Create a process for NAME using COMMAND to process FILE.
+Return the new process."
+  (let ((default TeX-command-default)
+       (buffer (TeX-process-buffer-name file))
+       (dir (TeX-master-directory))
+       (command-buff (current-buffer)))
+    (TeX-process-check file)           ; Check that no process is running
+    (setq-default TeX-command-buffer command-buff)
+    (get-buffer-create buffer)
+    (set-buffer buffer)
+    (buffer-disable-undo)
+    (erase-buffer)
+    (set (make-local-variable 'line-number-display-limit) 0)
+    (setq TeX-output-extension nil)
+    (set (make-local-variable 'TeX-command-buffer) command-buff)
+    (if dir (cd dir))
+    (insert "Running `" name "' on `" file "' with ``" command "''\n")
+    (setq mode-name name)
+    (if TeX-show-compilation
+       (display-buffer buffer)
+      (message "Type `%s' to display results of compilation."
+              (substitute-command-keys
+               "\\<TeX-mode-map>\\[TeX-recenter-output-buffer]")))
+    (setq TeX-parse-function 'TeX-parse-command)
+    (setq TeX-command-default default)
+    (setq TeX-sentinel-function
+         (lambda (process name)
+           (message (concat name ": done."))))
+    (if TeX-process-asynchronous
+       (let ((process (start-process name buffer TeX-shell
+                                     TeX-shell-command-option command)))
+         (if TeX-after-start-process-function
+             (funcall TeX-after-start-process-function process))
+         (TeX-command-mode-line process)
+         (set-process-filter process 'TeX-command-filter)
+         (set-process-sentinel process 'TeX-command-sentinel)
+         (set-marker (process-mark process) (point-max))
+         (setq compilation-in-progress (cons process compilation-in-progress))
+         process)
+      (setq mode-line-process ": run")
+      (set-buffer-modified-p (buffer-modified-p))
+      (sit-for 0)                              ; redisplay
+      (call-process TeX-shell nil buffer nil
+                   TeX-shell-command-option command))))
+
+(defun TeX-run-set-command (name command)
+  "Remember TeX command to use to NAME and set corresponding output extension."
+  (setq TeX-command-default name
+       TeX-output-extension (if TeX-PDF-mode "pdf" "dvi"))
+  (let ((case-fold-search t)
+       (lst TeX-command-output-list))
+    (while lst
+      (if (string-match (car (car lst)) command)
+         (setq TeX-output-extension (car (cdr (car lst)))
+               lst nil)
+       (setq lst (cdr lst))))))
+
+(defun TeX-run-format (name command file)
+  "Create a process for NAME using COMMAND to format FILE with TeX."
+  (TeX-run-set-command name command)
+  (let ((buffer (TeX-process-buffer-name file))
+       (process (TeX-run-command name command file)))
+    ;; Hook to TeX debuger.
+    (save-excursion
+      (set-buffer buffer)
+      (TeX-parse-reset)
+      (setq TeX-parse-function 'TeX-parse-TeX)
+      (setq TeX-sentinel-function 'TeX-TeX-sentinel)
+      (if TeX-process-asynchronous
+         (progn
+           ;; Updating the mode line.
+           (setq TeX-current-page "[0]")
+           (TeX-format-mode-line process)
+           (set-process-filter process 'TeX-format-filter)))
+      process)))
+
+(defvar TeX-error-report-switches nil
+  "Reports presence of errors after `TeX-run-TeX'.
+To test whether the current buffer has an compile error from last
+run of `TeX-run-TeX', use
+  (plist-get TeX-error-report-switches (intern (TeX-master-file)))")
+
+(defun TeX-run-TeX (name command file)
+  "Create a process for NAME using COMMAND to format FILE with TeX."
+
+  ;; Save information in TeX-error-report-switches
+  ;; Initialize error to nil (no error) for current master.
+  ;; Presence of error is reported inside `TeX-TeX-sentinel-check'
+  (let ((current-master (TeX-master-file)))
+    ;; the current master file is saved because error routines are
+    ;; parsed in other buffers;
+    (setq TeX-error-report-switches
+         (plist-put TeX-error-report-switches
+                    'TeX-current-master current-master))
+    ;; reset error to nil (no error)
+    (setq TeX-error-report-switches
+         (plist-put TeX-error-report-switches
+                    (intern current-master) nil)))
+
+  ;; can we assume that TeX-sentinel-function will not be changed
+  ;; during (TeX-run-format ..)? --pg
+  ;; rather use let* ? --pg
+
+  (if TeX-interactive-mode
+      (TeX-run-interactive name command file)
+    (let ((sentinel-function TeX-sentinel-default-function))
+      (let ((process (TeX-run-format name command file)))
+       (setq TeX-sentinel-function sentinel-function)
+       (if TeX-process-asynchronous
+           process
+         (TeX-synchronous-sentinel name file process))))))
+
+;; backward compatibilty
+
+(defalias 'TeX-run-LaTeX 'TeX-run-TeX)
+
+
+(defun TeX-run-BibTeX (name command file)
+  "Create a process for NAME using COMMAND to format FILE with BibTeX."
+  (let ((process (TeX-run-command name command file)))
+    (setq TeX-sentinel-function 'TeX-BibTeX-sentinel)
+    (if TeX-process-asynchronous
+       process
+      (TeX-synchronous-sentinel name file process))))
+
+(defun TeX-run-compile (name command file)
+  "Ignore first and third argument, start compile with second argument."
+  (compile command))
+
+(defun TeX-run-shell (name command file)
+  "Ignore first and third argument, start shell-command with second argument."
+  (let ((default-directory (TeX-master-directory)))
+    (shell-command command)
+    (if (eq system-type 'ms-dos)
+       (redraw-display))))
+
+(defun TeX-run-discard (name command file)
+  "Start COMMAND as process, discarding its output.
+NAME and FILE are ignored."
+  (let ((default-directory (TeX-master-directory)))
+    (call-process TeX-shell
+                 nil 0 nil
+                 TeX-shell-command-option
+                 command)))
+
+(defun TeX-run-discard-foreground (name command file)
+  "Call process with second argument in the foreground, discarding its output.
+With support for MS-DOS, especially when dviout is used with PC-9801 series."
+  (if (and (boundp 'dos-machine-type) (eq dos-machine-type 'pc98)) ;if PC-9801
+      (send-string-to-terminal "\e[2J")) ; clear screen
+  (call-process TeX-shell (if (eq system-type 'ms-dos) "con") nil nil
+               TeX-shell-command-option command)
+  (if (eq system-type 'ms-dos)
+      (redraw-display)))
+(defalias 'TeX-run-dviout 'TeX-run-discard-foreground)
+
+(defun TeX-run-background (name command file)
+  "Start process with second argument, show output when and if it arrives."
+  (let ((dir (TeX-master-directory)))
+    (set-buffer (get-buffer-create "*TeX background*"))
+    (if dir (cd dir))
+    (erase-buffer)
+    (let ((process (start-process (concat name " background")
+                                 nil TeX-shell
+                                 TeX-shell-command-option command)))
+      (if TeX-after-start-process-function
+         (funcall TeX-after-start-process-function process))
+      (set-process-filter process 'TeX-background-filter)
+      (process-kill-without-query process))))
+
+(defun TeX-run-silent (name command file)
+  "Start process with second argument."
+  (let ((dir (TeX-master-directory)))
+    (set-buffer (get-buffer-create "*TeX silent*"))
+    (if dir (cd dir))
+    (erase-buffer)
+    (let ((process (start-process (concat name " silent")
+                                 nil TeX-shell
+                                 TeX-shell-command-option command)))
+      (if TeX-after-start-process-function
+         (funcall TeX-after-start-process-function process))
+      (process-kill-without-query process))))
+
+(defun TeX-run-interactive (name command file)
+  "Run TeX interactively.
+Run command in a buffer (in comint-shell-mode) so that it accepts user
+interaction. If you return to the file buffer after the TeX run,
+Error parsing on \\[next-error] should work with a bit of luck."
+  (TeX-run-set-command name command)
+  (require 'comint)
+  (let ((default TeX-command-default)
+       (buffer (TeX-process-buffer-name file))
+       (process nil)
+       (dir (TeX-master-directory))
+       (command-buff (current-buffer))
+       (sentinel-function TeX-sentinel-default-function)) ; inherit from major mode
+    (TeX-process-check file)           ; Check that no process is running
+    (setq-default TeX-command-buffer command-buff)
+    (with-output-to-temp-buffer buffer)
+    (set-buffer buffer)
+    (set (make-local-variable 'TeX-command-buffer) command-buff)
+    (setq buffer-read-only nil)
+    (if dir (cd dir))
+    (insert "Running `" name "' on `" file "' with ``" command "''\n")
+    (comint-exec buffer name TeX-shell nil
+                (list TeX-shell-command-option command))
+    (comint-mode)
+    (add-hook 'comint-output-filter-functions 'TeX-interactive-goto-prompt)
+    (setq mode-name name)
+    (setq TeX-command-default default)
+    (setq process (get-buffer-process buffer))
+    (if TeX-after-start-process-function
+       (funcall TeX-after-start-process-function process))
+    (TeX-command-mode-line process)
+    (set-process-sentinel process 'TeX-command-sentinel)
+    (set-marker (process-mark process) (point-max))
+    (setq compilation-in-progress (cons process compilation-in-progress))
+    (TeX-parse-reset)
+    (setq TeX-parse-function 'TeX-parse-TeX)
+    ;; use the sentinel-function that the major mode sets, not the LaTeX one
+    (setq TeX-sentinel-function sentinel-function)))
+
+(defun TeX-run-function (name command file)
+  "Execute Lisp function or function call given as the string COMMAND.
+Parameters NAME and FILE are ignored."
+  (let ((fun (car (read-from-string command))))
+    (if (functionp fun) (funcall fun) (eval fun))))
+
+(defun TeX-run-discard-or-function (name command file)
+  "Start COMMAND as process or execute it as a Lisp function.
+If run as a process, the output is discarded.  COMMAND is
+expected to be a string.  NAME and FILE are ignored."
+  (if (functionp (car (read-from-string command)))
+      (TeX-run-function name command file)
+    (TeX-run-discard name command file)))
+
+(defun TeX-run-ispell-on-document (command ignored name)
+  "Run ispell on all open files belonging to the current document.
+This function is *obsolete* and only here for compatibility
+reasons.  Use `TeX-run-function' instead."
+  (interactive)
+  (TeX-ispell-document ""))
+
+
+;;; Command Sentinels
+
+(defun TeX-synchronous-sentinel (name file result)
+  "Process TeX command output buffer after the process dies."
+  (let* ((buffer (TeX-process-buffer file)))
+    (save-excursion
+      (set-buffer buffer)
+
+      ;; Append post-mortem information to the buffer
+      (goto-char (point-max))
+      (insert "\n" mode-name (if (and result (zerop result))
+                                " finished" " exited") " at "
+             (substring (current-time-string) 0 -5))
+      (setq mode-line-process ": exit")
+
+      ;; Do command specific actions.
+      (setq TeX-command-next TeX-command-Show)
+      (goto-char (point-min))
+      (apply TeX-sentinel-function nil name nil)
+
+      ;; Force mode line redisplay soon
+      (set-buffer-modified-p (buffer-modified-p)))))
+
+(defun TeX-command-sentinel (process msg)
+  "Process TeX command output buffer after the process dies."
+  ;; Set `TeX-transient-master' here because `preview-parse-messages'
+  ;; may open files and thereby trigger master file questions which we
+  ;; don't want and need because we already know the master.  Use
+  ;; `TeX-master-file' instead of `TeX-active-master' to determine the
+  ;; master because the region file should never be the master.
+  (let* ((TeX-transient-master (TeX-master-file))
+        (buffer (process-buffer process))
+        (name (process-name process)))
+    (cond ((null (buffer-name buffer)) ; buffer killed
+          (set-process-buffer process nil)
+          (set-process-sentinel process nil))
+         ((memq (process-status process) '(signal exit))
+          (save-excursion
+            (set-buffer buffer)
+
+            ;; Append post-mortem information to the buffer
+            (goto-char (point-max))
+            (insert-before-markers "\n" mode-name " " msg)
+            (forward-char -1)
+            (insert " at "
+                    (substring (current-time-string) 0 -5))
+            (forward-char 1)
+
+            ;; Do command specific actions.
+            (TeX-command-mode-line process)
+            (setq TeX-command-next TeX-command-Show)
+            (goto-char (point-min))
+            (apply TeX-sentinel-function process name nil)
+
+
+            ;; If buffer and mode line will show that the process
+            ;; is dead, we can delete it now.  Otherwise it
+            ;; will stay around until M-x list-processes.
+            (delete-process process)
+
+            ;; Force mode line redisplay soon
+            (set-buffer-modified-p (buffer-modified-p))))))
+  (setq compilation-in-progress (delq process compilation-in-progress)))
+
+
+(defvar TeX-sentinel-function (lambda (process name))
+  "Hook to cleanup TeX command buffer after temination of PROCESS.
+NAME is the name of the process.")
+
+  (make-variable-buffer-local 'TeX-sentinel-function)
+
+
+(defvar TeX-sentinel-default-function (lambda (process name))
+  "Default for `TeX-sentinel-function'.  To be set in major mode.
+Hook to cleanup TeX command buffer after temination of PROCESS.
+NAME is the name of the process.")
+
+  (make-variable-buffer-local 'TeX-sentinel-default-function)
+
+(defun TeX-TeX-sentinel (process name)
+  "Cleanup TeX output buffer after running TeX."
+  (if (TeX-TeX-sentinel-check process name)
+      ()
+    (message (concat name ": formatted " (TeX-current-pages)))
+    (setq TeX-command-next TeX-command-Show)))
+
+(defun TeX-current-pages ()
+  "Return string indicating the number of pages formatted."
+  (cond ((null TeX-current-page)
+        "some pages")
+       ((string-match "[^0-9]1[^0-9]" TeX-current-page)
+        (concat TeX-current-page " page"))
+       (t
+        (concat TeX-current-page " pages"))))
+
+(defun TeX-TeX-sentinel-check (process name)
+  "Cleanup TeX output buffer after running TeX.
+Return nil ifs no errors were found."
+  (save-excursion
+    (goto-char (point-max))
+    (if (re-search-backward "^Output written on \\(.*?\\) (\\([0-9]+\\) page"
+                           nil t)
+       (let ((output-file (TeX-match-buffer 1)))
+         (setq TeX-current-page (concat "{" (TeX-match-buffer 2) "}"))
+         ;; Shave off quotation marks if present.
+         (when (string-match "\\`\"\\(.*\\)\"\\'" output-file)
+           (setq output-file (match-string 1 output-file)))
+         (setq TeX-output-extension
+               (if (string-match "\\.\\([^.]*\\)$" output-file)
+                   (match-string 1 output-file)
+                 "dvi")))))
+  (if process (TeX-format-mode-line process))
+  (if (re-search-forward "^\\(!\\|.*:[0-9]+:\\) " nil t)
+      (progn
+       (message "%s errors in `%s'. Use %s to display." name (buffer-name)
+                (substitute-command-keys
+                 "\\<TeX-mode-map>\\[TeX-next-error]"))
+       (setq TeX-command-next TeX-command-default)
+       ;; error reported to TeX-error-report-switches
+       (setq TeX-error-report-switches
+         (plist-put TeX-error-report-switches
+                    (intern (plist-get TeX-error-report-switches
+                                       'TeX-current-master))
+                    t))
+       t)
+    (setq TeX-command-next TeX-command-Show)
+    nil))
+
+(defun TeX-LaTeX-sentinel-has-warnings ()
+  "Return non-nil, if the output buffer contains warnings.
+Warnings can be indicated by LaTeX or packages."
+  (save-excursion
+    (goto-char (point-min))
+    (re-search-forward
+     "^\\(LaTeX [A-Za-z]*\\|Package [A-Za-z]+ \\)Warning:" nil t)))
+
+(defun TeX-LaTeX-sentinel-has-bad-boxes ()
+  "Return non-nil, if LaTeX output indicates overfull or underfull boxes."
+  (save-excursion
+    (goto-char (point-min))
+    (re-search-forward "^\\(Ov\\|Und\\)erfull \\\\" nil t)))
+
+;; should go into latex.el? --pg
+(defun TeX-LaTeX-sentinel (process name)
+  "Cleanup TeX output buffer after running LaTeX."
+  (cond ((TeX-TeX-sentinel-check process name))
+       ((and (save-excursion
+               (re-search-forward
+                "^\\(?:LaTeX\\|Package natbib\\) Warning: Citation" nil t))
+             (with-current-buffer TeX-command-buffer
+               (and (LaTeX-bibliography-list)
+                    (TeX-check-files (TeX-master-file "bbl")
+                                     (TeX-style-list)
+                                     (append TeX-file-extensions
+                                             BibTeX-file-extensions)))))
+        (message "%s%s" "You should run BibTeX to get citations right, "
+                 (TeX-current-pages))
+        (setq TeX-command-next (with-current-buffer TeX-command-buffer
+                                 TeX-command-BibTeX)))
+       ((re-search-forward "^\\(?:LaTeX Warning: Label(s)\\|\
+Package natbib Warning: Citation(s)\\)" nil t)
+        (message "%s%s" "You should run LaTeX again to get references right, "
+                 (TeX-current-pages))
+        (setq TeX-command-next TeX-command-default))
+       ((re-search-forward "^LaTeX Warning: Reference" nil t)
+        (message "%s%s%s" name ": there were unresolved references, "
+                 (TeX-current-pages))
+        (setq TeX-command-next TeX-command-Show))
+       ((re-search-forward "^\\(?:LaTeX Warning: Citation\\|\
+Package natbib Warning:.*undefined citations\\)" nil t)
+        (message "%s%s%s" name ": there were unresolved citations, "
+                 (TeX-current-pages))
+        (setq TeX-command-next TeX-command-Show))
+       ((re-search-forward "Package longtable Warning: Table widths have \
+changed\\. Rerun LaTeX\\." nil t)
+        (message
+         "%s" "You should run LaTeX again to get table formatting right")
+        (setq TeX-command-next TeX-command-default))
+       ((re-search-forward
+         "^\\(\\*\\* \\)?J?I?p?\\(La\\|Sli\\)TeX\\(2e\\)? \
+\\(Version\\|ver\\.\\|<[0-9/]*>\\)" nil t)
+        (let* ((warnings (and TeX-debug-warnings
+                              (TeX-LaTeX-sentinel-has-warnings)))
+               (bad-boxes (and TeX-debug-bad-boxes
+                               (TeX-LaTeX-sentinel-has-bad-boxes)))
+               (add-info (when (or warnings bad-boxes)
+                           (concat " (with "
+                                   (when warnings "warnings")
+                                   (when (and warnings bad-boxes) " and ")
+                                   (when bad-boxes "bad boxes")
+                                   ")"))))
+          (message "%s" (concat name ": successfully formatted "
+                                (TeX-current-pages) add-info)))
+        (setq TeX-command-next TeX-command-Show))
+       (t
+        (message "%s%s%s" name ": problems after " (TeX-current-pages))
+        (setq TeX-command-next TeX-command-default))))
+
+;; should go into latex.el? --pg
+(defun TeX-BibTeX-sentinel (process name)
+  "Cleanup TeX output buffer after running BibTeX."
+  (goto-char (point-max))
+  (cond
+   ;; Check whether BibTeX reports any warnings or errors.
+   ((re-search-backward (concat
+                        "^(There \\(?:was\\|were\\) \\([0-9]+\\) "
+                        "\\(warnings?\\|error messages?\\))") nil t)
+    ;; Tell the user their number so that she sees whether the
+    ;; situation is getting better or worse.
+    (message (concat "BibTeX finished with %s %s. "
+                    "Type `%s' to display output.")
+            (match-string 1) (match-string 2)
+            (substitute-command-keys
+             "\\<TeX-mode-map>\\[TeX-recenter-output-buffer]")))
+   (t
+    (message (concat "BibTeX finished successfully. "
+                    "Run LaTeX again to get citations right."))))
+  (setq TeX-command-next TeX-command-default))
+
+;;; Process Control
+
+
+;; This variable is chared with `compile.el'.
+(defvar compilation-in-progress nil
+  "List of compilation processes now running.")
+
+(or (assq 'compilation-in-progress minor-mode-alist)
+    (setq minor-mode-alist (cons '(compilation-in-progress " Compiling")
+                                minor-mode-alist)))
+
+(defun TeX-process-get-variable (name symbol &optional default)
+  "Return the value in the process buffer for NAME of SYMBOL.
+
+Return DEFAULT if the process buffer does not exist or SYMBOL is not
+defined."
+  (let ((buffer (TeX-process-buffer name)))
+    (if (and buffer
+            (local-variable-p symbol buffer))
+       (save-excursion
+         (set-buffer buffer)
+         (symbol-value symbol))
+      default)))
+
+(defun TeX-process-set-variable (name symbol value)
+  "Set the variable SYMBOL in the process buffer to VALUE.
+Return nil iff no process buffer exist."
+  (let ((buffer (TeX-process-buffer name)))
+    (if buffer
+       (save-excursion
+         (set-buffer buffer)
+         (set symbol value)
+         t)
+      nil)))
+
+(defun TeX-process-check (name)
+  "Check if a process for the TeX document NAME already exist.
+If so, give the user the choice of aborting the process or the current
+command."
+  (let (process)
+    (while (and (setq process (TeX-process name))
+               (eq (process-status process) 'run))
+      (cond
+       ((yes-or-no-p (concat "Process `"
+                            (process-name process)
+                            "' for document `"
+                            name
+                            "' running, kill it? "))
+       (delete-process process))
+       ((eq (process-status process) 'run)
+          (error "Cannot have two processes for the same document"))))))
+
+(defun TeX-process-buffer-name (name)
+  "Return name of AUCTeX buffer associated with the document NAME."
+  (concat "*" (abbreviate-file-name (expand-file-name name)) " output*"))
+
+(defun TeX-process-buffer (name)
+  "Return the AUCTeX buffer associated with the document NAME."
+  (get-buffer (TeX-process-buffer-name name)))
+
+(defun TeX-process (name)
+  "Return AUCTeX process associated with the document NAME."
+  (and TeX-process-asynchronous
+       (get-buffer-process (TeX-process-buffer name))))
+
+;;; Process Filters
+
+(defun TeX-command-mode-line (process)
+  "Format the mode line for a buffer containing output from PROCESS."
+    (setq mode-line-process (concat ": "
+                                   (symbol-name (process-status process))))
+    (set-buffer-modified-p (buffer-modified-p)))
+
+(defun TeX-command-filter (process string)
+  "Filter to process normal output."
+  (with-current-buffer (process-buffer process)
+    (save-excursion
+      (goto-char (process-mark process))
+      (insert-before-markers string)
+      (set-marker (process-mark process) (point)))))
+
+(defvar TeX-current-page nil
+  "The page number currently being formatted, enclosed in brackets.")
+
+ (make-variable-buffer-local 'TeX-current-page)
+
+(defun TeX-format-mode-line (process)
+  "Format the mode line for a buffer containing TeX output from PROCESS."
+    (setq mode-line-process (concat " " TeX-current-page ": "
+                                   (symbol-name (process-status process))))
+    (set-buffer-modified-p (buffer-modified-p)))
+
+(defun TeX-format-filter (process string)
+  "Filter to process TeX output."
+  (with-current-buffer (process-buffer process)
+    (let (str pos end (pt (marker-position (process-mark process))))
+      (save-excursion
+       (goto-char pt)
+       (insert-before-markers string)
+       (set-marker (process-mark process) (point))
+       ;; Remove line breaks at column 79
+       (while (> (point) pt)
+         (end-of-line 0)
+         (when (and (= (current-column) 79)
+                    ;; Heuristic: Don't delete the linebreak if the
+                    ;; next line is empty or starts with an opening
+                    ;; parenthesis or if point is located after a period.
+                    (not (memq (char-after (1+ (point))) '(?\n ?\()))
+                    (not (eq (char-before) ?.)))
+           (delete-char 1)))
+       (goto-char (marker-position (process-mark process)))
+       ;; Determine current page
+       (while (and pt
+                   (skip-chars-backward "^]" pt)
+                   (> (point) pt))
+         (setq end (point))
+         (backward-char)
+         (skip-chars-backward "-0-9\n." (max (point-min) (- pt 128)))
+         (when (and (eq ?\[ (char-before))
+                    (not (eq ?\] (char-after)))
+                    (progn
+                      (setq str (buffer-substring (1- (point)) end)
+                            pos nil)
+                      (while (setq pos (string-match "\n" str pos))
+                        (setq str (replace-match "" t t str)))
+                      (string-match
+                       "\\`\\[-?[0-9]+\\(\\.-?[0-9]+\\)\\{0,9\\}\\]\\'"
+                       str)))
+           (setq TeX-current-page str
+                 pt nil)
+           (TeX-format-mode-line process)))))))
+
+(defvar TeX-parse-function nil
+  "Function to call to parse content of TeX output buffer.")
+ (make-variable-buffer-local 'TeX-parse-function)
+
+(defun TeX-background-filter (process string)
+  "Filter to process background output."
+  (let ((old-window (selected-window))
+       (pop-up-windows t))
+    (TeX-pop-to-buffer "*TeX background*" nil t)
+    (goto-char (point-max))
+    (insert string)
+    (select-window old-window)))
+
+;; Copy and adaption of `comint-postoutput-scroll-to-bottom' from CVS
+;; Emacs of 2005-04-24.
+(defun TeX-interactive-goto-prompt (string)
+  "Move point to prompt of an interactive TeX run."
+  (let* ((selected (selected-window))
+        (current (current-buffer))
+        (process (get-buffer-process current)))
+    (unwind-protect
+       (when process
+         (walk-windows
+          (lambda (window)
+            (when (eq (window-buffer window) current)
+              (select-window window)
+              (when (and (< (point) (process-mark process))
+                         (string-match "^\\? $" string))
+                (goto-char (process-mark process)))
+              (select-window selected)))
+          nil t))
+      (set-buffer current))))
+
+
+;;; Active Process
+
+(defvar TeX-current-process-region-p nil
+  "This variable is set to t iff the last TeX command is on a region.")
+
+(defun TeX-active-process ()
+  "Return the active process for the current buffer."
+  (TeX-process (TeX-active-master)))
+
+(defun TeX-active-buffer ()
+  "Return the buffer of the active process for this buffer."
+  (and TeX-command-buffer
+       (TeX-process-buffer (with-current-buffer TeX-command-buffer
+                            (TeX-active-master)))))
+
+(defun TeX-active-master (&optional extension nondirectory)
+  "The master file currently being compiled.
+
+If optional argument EXTENSION is non-nil, add that file extension to
+the name.  Special value t means use `TeX-default-extension'.
+
+If optional second argument NONDIRECTORY is non-nil, do not include
+the directory."
+  (if TeX-current-process-region-p
+      (TeX-region-file extension nondirectory)
+    (TeX-master-file extension nondirectory)))
+
+(defvar TeX-command-buffer nil
+  "The buffer from where the last TeX command was issued.")
+
+;;; Region File
+
+(defcustom TeX-region-extra ""
+  "*String to insert in the region file between the header and the text."
+  :group 'TeX-command
+  :type 'string)
+
+;; This was "{\\makeatletter\\gdef\\AucTeX@cite#1[#2]#3{[#3#1#2]}\
+;;           \\gdef\\cite{\\@ifnextchar[{\\AucTeX@cite{, }}\
+;;           {\\AucTeX@cite{}[]}}}\n"
+;; However, that string is inappropriate for plain TeX and ConTeXt.
+;; This needs reconsideration.
+
+
+(defvar TeX-region-hook nil
+  "List of hooks to run before the region file is saved.
+The hooks are run in the region buffer, you may use the variable
+`master-buffer' to access the buffer of the master file and
+`orig-buffer' to access the buffer where \\[TeX-command-region] or
+\\[TeX-command-buffer] is invoked from.")
+
+(defun TeX-quote-filename (file)
+  "Convert file name into a form acceptable to TeX."
+  (let (pos)
+    (while (setq pos (string-match "\\\\" file pos))
+      (setq file (replace-match "/" t t file 0)
+           pos (1+ pos)))
+    (while (setq pos (string-match "[~#]" file pos))
+      (setq file (replace-match "\\\\string\\&" t nil file 0)
+           pos (+ pos 8))))
+  file)
+
+(defun TeX-region-create (file region original offset)
+  "Create a new file named FILE with the string REGION.
+The region is taken from ORIGINAL starting at line OFFSET.
+
+The current buffer and master file is searched, in order to ensure
+that the TeX header and trailer information is also included.
+
+The OFFSET is used to provide the debugger with information about the
+original file."
+  (let* (;; We shift buffer a lot, so we must keep track of the buffer
+        ;; local variables.
+        (header-end TeX-header-end)
+        (trailer-start TeX-trailer-start)
+
+        ;; We seach for header and trailer in the master file.
+        (orig-buffer (current-buffer))
+        (master-name (TeX-master-file TeX-default-extension))
+        (master-buffer (find-file-noselect master-name))
+
+        ;; Attempt to disable font lock.
+        (font-lock-defaults-alist nil)
+        (font-lock-defaults nil)
+        (font-lock-maximum-size 0)
+        (font-lock-mode-hook nil)
+        (font-lock-auto-fontify nil)
+        (font-lock-mode-enable-list nil)
+        ;; And insert them into the FILE buffer.
+        (file-buffer (let ((TeX-transient-master t))
+                       (find-file-noselect file)))
+        ;; But remember original content.
+        original-content
+
+        ;; We search for the header from the master file, if it is
+        ;; not present in the region.
+        (header (if (string-match header-end region)
+                    ""
+                  (save-excursion
+                    (save-restriction
+                      (set-buffer master-buffer)
+                      (save-excursion
+                        (save-restriction
+                          (widen)
+                          (goto-char (point-min))
+                          ;; NOTE: We use the local value of
+                          ;; TeX-header-end from the master file.
+                          (if (not (re-search-forward TeX-header-end nil t))
+                              ""
+                            (re-search-forward "[\r\n]" nil t)
+                            (buffer-substring (point-min) (point)))))))))
+
+        ;; We search for the trailer from the master file, if it is
+        ;; not present in the region.
+        (trailer-offset 0)
+        (trailer (if (string-match trailer-start region)
+                     ""
+                   (save-excursion
+                     (save-restriction
+                       (set-buffer master-buffer)
+                       (save-excursion
+                         (save-restriction
+                           (widen)
+                           (goto-char (point-max))
+                           ;; NOTE: We use the local value of
+                           ;; TeX-trailer-start from the master file.
+                           (if (not (re-search-backward TeX-trailer-start nil t))
+                               ""
+                             ;;(beginning-of-line 1)
+                             (re-search-backward "[\r\n]" nil t)
+                             (setq trailer-offset (TeX-current-offset))
+                             (buffer-substring (point) (point-max))))))))))
+    ;; file name should be relative to master
+    (setq original (TeX-quote-filename (file-relative-name
+                                       original (TeX-master-directory)))
+         master-name (TeX-quote-filename master-name))
+    (save-excursion
+      (set-buffer file-buffer)
+      (setq buffer-undo-list t)
+      (setq original-content (buffer-string))
+      (erase-buffer)
+      (when (boundp 'buffer-file-coding-system)
+       (setq buffer-file-coding-system
+             (with-current-buffer master-buffer buffer-file-coding-system)))
+      (insert "\\message{ !name(" master-name ")}"
+             header
+             TeX-region-extra
+             "\n\\message{ !name(" original ") !offset(")
+      (insert (int-to-string (- offset
+                               (1+ (TeX-current-offset))))
+             ") }\n"
+             region
+             "\n\\message{ !name("  master-name ") !offset(")
+      (insert (int-to-string (- trailer-offset
+                               (1+ (TeX-current-offset))))
+             ") }\n"
+             trailer)
+      (run-hooks 'TeX-region-hook)
+      (if (string-equal (buffer-string) original-content)
+         (set-buffer-modified-p nil)
+       (save-buffer 0)))))
+
+(defun TeX-region-file (&optional extension nondirectory)
+  "Return TeX-region file name with EXTENSION.
+If optional second argument NONDIRECTORY is non-nil, do not include
+the directory."
+  (concat (if nondirectory "" (TeX-master-directory))
+         (cond ((eq extension t)
+                (concat TeX-region "." TeX-default-extension))
+               (extension
+                (concat TeX-region "." extension))
+               (t
+                TeX-region))))
+
+(defcustom TeX-region "_region_"
+  "*Base name of temporary file for `TeX-command-region' and `TeX-command-buffer'."
+  :group 'TeX-command
+  :type 'string)
+
+;;; Parsing
+
+;;; - Global Parser Variables
+
+(defvar TeX-error-point nil
+  "How far we have parsed until now.")
+
+ (make-variable-buffer-local 'TeX-error-point)
+
+(defvar TeX-error-file nil
+  "Stack of files in which errors have occured.")
+
+ (make-variable-buffer-local 'TeX-error-file)
+
+(defvar TeX-error-offset nil
+  "Add this to any line numbers from TeX.  Stack like `TeX-error-file'.")
+
+ (make-variable-buffer-local 'TeX-error-offset)
+
+(defun TeX-parse-reset ()
+  "Reset all variables used for parsing TeX output."
+  (setq TeX-error-point (point-min))
+  (setq TeX-error-offset nil)
+  (setq TeX-error-file nil))
+
+;;; - Parsers Hooks
+
+(defun TeX-parse-command (reparse)
+  "We can't parse anything but TeX."
+  (error "I cannot parse %s output, sorry"
+        (if (TeX-active-process)
+            (process-name (TeX-active-process))
+          "this")))
+
+(defun TeX-parse-TeX (reparse)
+  "Find the next error produced by running TeX.
+With \\[universal-argument] prefix, start from the beginning of the errors.
+
+If the file occurs in an included file, the file is loaded (if not
+already in an Emacs buffer) and the cursor is placed at the error."
+  (let ((old-buffer (current-buffer))
+       (default-major-mode major-mode))
+    (with-current-buffer (TeX-active-buffer)
+      (if reparse
+         (TeX-parse-reset))
+      (goto-char TeX-error-point)
+      (TeX-parse-error old-buffer))))
+
+;;; - Parsing (La)TeX
+
+(defvar TeX-translate-location-hook nil
+  "List of functions to be called before showing an error or warning.
+
+You might want to examine and modify the free variables `file',
+`offset', `line', `string', `error', and `context' from this hook.")
+
+(defun TeX-parse-error (old)
+  "Goto next error.  Pop to OLD buffer if no more errors are found."
+  (let ((regexp
+        (concat
+         ;; TeX error
+         "^\\(!\\|\\(.*?\\):[0-9]+:\\) \\|"
+         ;; New file
+         "(\\(\"[^\"]*?\"\\|/*\
+\\(?:\\.+[^()\r\n{} \\/]*\\|[^()\r\n{} .\\/]+\
+\\(?: [^()\r\n{} .\\/]+\\)*\\(?:\\.[-0-9a-zA-Z_.]*\\)?\\)\
+\\(?:[\\/]+\\(?:\\.+[^()\r\n{} \\/]*\\|[^()\r\n{} .\\/]+\
+\\(?: [^()\r\n{} .\\/]+\\)*\\(?:\\.[-0-9a-zA-Z_.]*\\)?\\)?\\)*\\)\
+)*\\(?: \\|\r?$\\)\\|"
+         ;; End of file
+         "\\()\\))*\\|"
+         ;; Hook to change line numbers
+         " !\\(?:offset(\\([---0-9]+\\))\\|"
+         ;; Hook to change file name
+         "name(\\([^)]+\\))\\)\\|"
+         ;; LaTeX bad box
+         "^\\(\\(?:Overfull\\|Underfull\\|Tight\\|Loose\\)\
+ \\\\.*?[0-9]+--[0-9]+\\)\\|"
+         ;; LaTeX warning
+         "^\\(LaTeX [A-Za-z]*\\|Package [A-Za-z]+ \\)Warning:.*")))
+    (while
+       (cond
+        ((null
+          (re-search-forward regexp nil t))
+         ;; No more errors.
+         (message "No more errors.")
+         (beep)
+         (TeX-pop-to-buffer old)
+         nil)
+        ;; TeX error
+        ((match-beginning 1)
+         (when (match-beginning 2)
+           (unless TeX-error-file
+             (push nil TeX-error-file)
+             (push nil TeX-error-offset))
+           (unless (car TeX-error-offset)
+             (rplaca TeX-error-file (TeX-match-buffer 2))))
+         (if (looking-at "Preview ")
+             t
+           (TeX-error)
+           nil))
+        ;; LaTeX bad box
+        ((match-beginning 7)
+         (if TeX-debug-bad-boxes
+             (progn
+               (TeX-warning (TeX-match-buffer 7))
+               nil)
+           (re-search-forward "\r?\n\
+\\(?:.\\{79\\}\r?\n\
+\\)*.*\r?$")
+           t))
+        ;; LaTeX warning
+        ((match-beginning 8)
+         (if TeX-debug-warnings
+             (progn
+               (TeX-warning (TeX-match-buffer 8))
+               nil)
+           t))
+
+        ;; New file -- Push on stack
+        ((match-beginning 3)
+         (let ((file (TeX-match-buffer 3))
+               (end (match-end 3)))
+           ;; Strip quotation marks and remove newlines if necessary
+           (when (or (eq (string-to-char file) ?\")
+                     (string-match "\n" file))
+             (setq file
+                   (mapconcat 'identity (split-string file "[\"\n]+") "")))
+           (push file TeX-error-file)
+           (push nil TeX-error-offset)
+           (goto-char end))
+         t)
+        
+        ;; End of file -- Pop from stack
+        ((match-beginning 4)
+         (when (> (length TeX-error-file) 1)
+           (pop TeX-error-file)
+           (pop TeX-error-offset))
+         (goto-char (match-end 4))
+         t)
+        
+        ;; Hook to change line numbers
+        ((match-beginning 5)
+         (setq TeX-error-offset
+               (list (string-to-number (TeX-match-buffer 5))))
+         t)
+        
+        ;; Hook to change file name
+        ((match-beginning 6)
+         (setq TeX-error-file
+               (list (TeX-match-buffer 6)))
+         t)))))
+
+(defun TeX-error ()
+  "Display an error."
+
+  (let* (;; We need the error message to show the user.
+        (error (progn
+                 (re-search-forward "\\(.*\\)")
+                 (TeX-match-buffer 1)))
+
+        ;; And the context for the help window.
+        (context-start (point))
+        context-available
+
+        ;; And the line number to position the cursor.
+        (line (cond
+               ;; regular style
+               ((re-search-forward "l\\.\\([0-9]+\\)" nil t)
+                (setq context-available t)
+                (string-to-number (TeX-match-buffer 1)))
+               ;; file:line:error style
+               ((save-excursion
+                  (re-search-backward ":\\([0-9]+\\): "
+                                      (line-beginning-position) t))
+                (string-to-number (TeX-match-buffer 1)))
+               ;; nothing found
+               (t 1)))
+
+        ;; And a string of the context to search for.
+        (string (progn
+                  (beginning-of-line)
+                  (re-search-forward " \\(\\([^ \t]*$\\)\\|\\($\\)\\)")
+                  (TeX-match-buffer 1)))
+
+        ;; And we have now found to the end of the context.
+        (context (if context-available
+                     (buffer-substring context-start (progn (forward-line 1)
+                                                            (end-of-line)
+                                                            (point)))
+                   ;; There is no real context available, so we
+                   ;; simply show the line with the error message.
+                   (buffer-substring (1- (line-beginning-position))
+                                     context-start)))
+        ;; We may use these in another buffer.
+        (offset (or (car TeX-error-offset) 0))
+        (file (car TeX-error-file)))
+
+    ;; Remember where we was.
+    (setq TeX-error-point (point))
+
+    ;; Find the error.
+    (if (null file)
+       (error "Error occured after last TeX file closed"))
+    (let ((runbuf (current-buffer))
+         (master (with-current-buffer
+                     TeX-command-buffer
+                   (expand-file-name (TeX-master-file))))
+         (command-buffer TeX-command-buffer)
+         error-file-buffer)
+      (run-hooks 'TeX-translate-location-hook)
+      (setq error-file-buffer (find-file file))
+      ;; Set the value of `TeX-command-buffer' in the next file with an
+      ;; error to be displayed to the value it has in the current buffer.
+      (with-current-buffer error-file-buffer
+       (set (make-local-variable 'TeX-command-buffer) command-buffer))
+      (goto-line (+ offset line))
+      (if (not (string= string " "))
+         (search-forward string nil t))
+      
+      ;; Explain the error.
+      (cond ((eq TeX-display-help 'expert)
+            (TeX-pop-to-buffer runbuf nil t)
+            (goto-char TeX-error-point)
+            (TeX-pop-to-buffer error-file-buffer nil t))
+           (TeX-display-help
+            (TeX-help-error error context runbuf))
+           (t
+            (message (concat "! " error)))))))
+
+(defun TeX-warning (string)
+  "Display a warning for STRING."
+
+  (let* ((error (concat "** " string))
+
+        ;; bad-box is nil if this is a "LaTeX Warning"
+        (bad-box (string-match "\\\\[vh]box.*[0-9]*--[0-9]*" string))
+        ;; line-string: match 1 is beginning line, match 2 is end line
+        (line-string (if bad-box " \\([0-9]*\\)--\\([0-9]*\\)"
+                       "on input line \\([0-9]*\\)\\."))
+        ;; word-string: match 1 is the word
+        (word-string (if bad-box "[][\\W() ---]\\(\\w+\\)[][\\W() ---]*$"
+                       "`\\(\\w+\\)'"))
+
+        ;; Get error-line (warning)
+        (line (when (re-search-backward line-string nil t)
+                (string-to-number (TeX-match-buffer 1))))
+        (line-end (if bad-box (string-to-number (TeX-match-buffer 2))
+                    line))
+
+        ;; Find the context
+        (context-start (progn (if bad-box (end-of-line)
+                                (beginning-of-line))
+                              (point)))
+
+        (context (progn
+                   (forward-line 1)
+                   (end-of-line)
+                   (while (equal (current-column) 79)
+                     (forward-line 1)
+                     (end-of-line))
+                   (buffer-substring context-start (point))))
+
+        ;; This is where we want to be.
+        (error-point (point))
+
+        ;; Now find the error word.
+        (string (when (re-search-backward word-string context-start t)
+                  (TeX-match-buffer 1)))
+
+        ;; We might use these in another file.
+        (offset (or (car TeX-error-offset) 0))
+        (file (car TeX-error-file)))
+
+    ;; This is where we start next time.
+    (goto-char error-point)
+    (setq TeX-error-point (point))
+
+    ;; Go back to TeX-buffer
+    (let ((runbuf (current-buffer))
+         (master (with-current-buffer
+                     TeX-command-buffer
+                   (expand-file-name (TeX-master-file))))
+         (command-buffer TeX-command-buffer)
+         error-file-buffer)
+      (run-hooks 'TeX-translate-location-hook)
+      (setq error-file-buffer (find-file file))
+      ;; Set the value of `TeX-command-buffer' in the next file with an
+      ;; error to be displayed to the value it has in the current buffer.
+      (with-current-buffer error-file-buffer
+       (set (make-local-variable 'TeX-command-buffer) command-buffer))
+      ;; Find line and string
+      (when line
+       (goto-line (+ offset line))
+       (beginning-of-line 0)
+       (let ((start (point)))
+         (goto-line (+ offset line-end))
+         (end-of-line)
+         (when string
+           (search-backward string start t)
+           (search-forward string nil t))))
+      ;; Display help
+      (cond ((eq TeX-display-help 'expert)
+            (TeX-pop-to-buffer runbuf nil t)
+            (goto-char TeX-error-point)
+            (TeX-pop-to-buffer error-file-buffer nil t))
+           (TeX-display-help
+            (TeX-help-error error (if bad-box context (concat "\n" context))
+                            runbuf))
+           (t
+            (message (concat "! " error)))))))
+
+;;; - Help
+
+(defun TeX-help-error (error output runbuffer)
+  "Print ERROR in context OUTPUT from RUNBUFFER in another window."
+
+  (let ((old-buffer (current-buffer))
+       (log-file (with-current-buffer runbuffer
+                   (with-current-buffer TeX-command-buffer
+                     (expand-file-name (TeX-active-master "log")))))
+       (TeX-error-pointer 0))
+
+    ;; Find help text entry.
+    (while (not (string-match (car (nth TeX-error-pointer
+                                       TeX-error-description-list))
+                             error))
+      (setq TeX-error-pointer (+ TeX-error-pointer 1)))
+
+    (TeX-pop-to-buffer (get-buffer-create "*TeX Help*") nil t)
+    (erase-buffer)
+    (insert "ERROR: " error
+           "\n\n--- TeX said ---"
+           output
+           "\n--- HELP ---\n"
+           (let ((help (cdr (nth TeX-error-pointer
+                                 TeX-error-description-list))))
+             (save-excursion
+               (if (and (string= help "No help available")
+                        (let* ((log-buffer (find-buffer-visiting log-file)))
+                          (if log-buffer
+                              (progn
+                                (set-buffer log-buffer)
+                                (revert-buffer t t))
+                            (setq log-buffer
+                                  (find-file-noselect log-file))
+                            (set-buffer log-buffer))
+                          (auto-save-mode nil)
+                          (setq buffer-read-only t)
+                          (goto-line (point-min))
+                          (search-forward error nil t 1))
+                        (re-search-forward "^l\\." nil t)
+                        (re-search-forward "^ [^\n]+$" nil t))
+                   (let ((start (1+ (point))))
+                     (forward-char 1)
+                     (re-search-forward "^$")
+                     (concat "From the .log file...\n\n"
+                             (buffer-substring start (point))))
+                 help))))
+    (goto-char (point-min))
+    (TeX-pop-to-buffer old-buffer nil t)))
+
+;;; Error Messages
+
+(defcustom TeX-error-description-list
+  '(("\\(?:Package Preview Error\\|Preview\\):.*" .
+"The `auctex' option to `preview' should not be applied manually.
+If you see this error message outside of a preview run, either
+you did something too clever, or AUCTeX something too stupid.")
+
+    ("Bad \\\\line or \\\\vector argument.*" .
+"The first argument of a \\line or \\vector command, which specifies the
+slope, is illegal\.")
+
+    ("Bad math environment delimiter.*" .
+"TeX has found either a math-mode-starting command such as \\[ or \\(
+when it is already in math mode, or else a math-mode-ending command
+such as \\) or \\] while in LR or paragraph mode.  The problem is caused
+by either unmatched math mode delimiters or unbalanced braces\.")
+
+    ("Bad use of \\\\\\\\.*" .
+"A \\\\ command appears between paragraphs, where it makes no sense. This
+error message occurs when the \\\\ is used in a centering or flushing
+environment or else in the scope of a centering or flushing
+declaration.")
+
+    ("\\\\begin{[^ ]*} ended by \\\\end{[^ ]*}." .
+"LaTeX has found an \\end command that doesn't match the corresponding
+\\begin command. You probably misspelled the environment name in the
+\\end command, have an extra \\begin, or else forgot an \\end.")
+
+    ("Can be used only in preamble." .
+"LaTeX has encountered, after the \\begin{document}, one of the
+following commands that should appear only in the preamble:
+\\documentclass, \\nofiles, \\includeonly, \\makeindex, or
+\\makeglossary.  The error is also caused by an extra \\begin{document}
+command.")
+
+    ("Command name [^ ]* already used.*" .
+"You are using \\newcommand, \\newenvironment, \\newlength, \\newsavebox,
+or \\newtheorem to define a command or environment name that is
+already defined, or \\newcounter to define a counter that already
+exists. (Defining an environment named gnu automatically defines the
+command \\gnu.) You'll have to choose a new name or, in the case of
+\\newcommand or \\newenvironment, switch to the \\renew ...  command.")
+
+    ("Counter too large." .
+"1. Some object that is numbered with letters, probably an item in a
+enumerated list, has received a number greater than 26. Either you're
+making a very long list or you've been resetting counter values.
+
+2. Footnotes are being ``numbered'' with letters or footnote symbols
+and LaTeX has run out of letters or symbols. This is probably caused
+by too many \\thanks commands.")
+
+    ("Environment [^ ]* undefined." .
+"LaTeX has encountered a \\begin command for a nonexistent environment.
+You probably misspelled the environment name. ")
+
+    ("Float(s) lost." .
+"You put a figure or table environment or a \\marginpar command inside a
+parbox---either one made with a minipage environment or \\parbox
+command, or one constructed by LaTeX in making a footnote, figure,
+etc. This is an outputting error, and the offending environment or
+command may be quite a way back from the point where LaTeX discovered
+the problem. One or more figures, tables, and/or marginal notes have
+been lost, but not necessarily the one that caused the error.")
+
+    ("Illegal character in array arg." .
+"There is an illegal character in the argument of an array or tabular
+environment, or in the second argument of a \\multicolumn command.")
+
+    ("Missing \\\\begin{document}." .
+"LaTeX produced printed output before encountering a \\begin{document}
+command. Either you forgot the \\begin{document} command or there is
+something wrong in the preamble. The problem may be a stray character
+or an error in a declaration---for example, omitting the braces around
+an argument or forgetting the \\ in a command name.")
+
+    ("Missing p-arg in array arg.*" .
+"There is a p that is not followed by an expression in braces in the
+argument of an array or tabular environment, or in the second argument
+of a \\multicolumn command.")
+
+    ("Missing @-exp in array arg." .
+"There is an @ character not followed by an @-expression in the
+argument of an array or tabular environment, or in the second argument
+of a \\multicolumn command.")
+
+    ("No such counter." .
+"You have specified a nonexistent counter in a \\setcounter or
+\\addtocounter command. This is probably caused by a simple typing
+error.  However, if the error occurred while a file with the extension
+aux is being read, then you probably used a \\newcounter command
+outside the preamble.")
+
+    ("Not in outer par mode." .
+"You had a figure or table environment or a \\marginpar command in math
+mode or inside a parbox.")
+
+    ("\\\\pushtabs and \\\\poptabs don't match." .
+"LaTeX found a \\poptabs with no matching \\pushtabs, or has come to the
+\\end{tabbing} command with one or more unmatched \\pushtabs commands.")
+
+    ("Something's wrong--perhaps a missing \\\\item." .
+"The most probable cause is an omitted \\item command in a list-making
+environment. It is also caused by forgetting the argument of a
+thebibliography environment.")
+
+    ("Tab overflow." .
+"A \\= command has exceeded the maximum number of tab stops that LaTeX
+permits.")
+
+    ("There's no line here to end." .
+"A \\newline or \\\\ command appears between paragraphs, where it makes no
+sense. If you're trying to ``leave a blank line'', use a \\vspace
+command.")
+
+    ("This may be a LaTeX bug." .
+"LaTeX has become thoroughly confused. This is probably due to a
+previously detected error, but it is possible that you have found an
+error in LaTeX itself. If this is the first error message produced by
+the input file and you can't find anything wrong, save the file and
+contact the person listed in your Local Guide.")
+
+    ("Too deeply nested." .
+"There are too many list-making environments nested within one another.
+How many levels of nesting are permitted may depend upon what computer
+you are using, but at least four levels are provided, which should be
+enough.")
+
+    ("Too many unprocessed floats." .
+"While this error can result from having too many \\marginpar commands
+on a page, a more likely cause is forcing LaTeX to save more figures
+and tables than it has room for.  When typesetting its continuous
+scroll, LaTeX saves figures and tables separately and inserts them as
+it cuts off pages. This error occurs when LaTeX finds too many figure
+and/or table environments before it is time to cut off a page, a
+problem that is solved by moving some of the environments farther
+towards the end of the input file. The error can also be caused by a
+``logjam''---a figure or table that cannot be printed causing others
+to pile up behind it, since LaTeX will not print figures or tables out
+of order. The jam can be started by a figure or table that either is
+too large to fit on a page or won't fit where its optional placement
+argument says it must go. This is likely to happen if the argument
+does not contain a p option.")
+
+    ("Undefined tab position." .
+"A \\>, \\+, \\-, or \\< command is trying to go to a nonexistent tab
+position---one not defined by a \\= command.")
+
+    ("\\\\< in mid line." .
+"A \\< command appears in the middle of a line in a tabbing environment.
+This command should come only at the beginning of a line.")
+
+    ("Double subscript." .
+"There are two subscripts in a row in a mathematical
+formula---something like x_{2}_{3}, which makes no sense.")
+
+    ("Double superscript." .
+"There are two superscripts in a row in a mathematical
+formula---something like x^{2}^{3}, which makes no sense.")
+
+    ("Extra alignment tab has been changed to \\\\cr." .
+"There are too many separate items (column entries) in a single row of
+an array or tabular environment. In other words, there were too many &
+'s before the end of the row. You probably forgot the \\\\ at the end of
+the preceding row.")
+
+    ("Extra \\}, or forgotten \\$." .
+"The braces or math mode delimiters don't match properly. You probably
+forgot a {, \\[, \\(, or $.")
+
+    ("Font [^ ]* not loaded: Not enough room left." .
+"The document uses more fonts than TeX has room for. If different parts
+of the document use different fonts, then you can get around the
+problem by processing it in parts.")
+
+    ("I can't find file `.*'." .
+"TeX can't find a file that it needs. If the name of the missing file
+has the extension tex, then it is looking for an input file that you
+specified---either your main file or another file inserted with an
+\\input or \\include command. If the missing file has the extension sty
+, then you have specified a nonexistent document style or style
+option.")
+
+    ("Illegal parameter number in definition of .*" .
+"This is probably caused by a \\newcommand, \\renewcommand,
+\\newenvironment, or \\renewenvironment command in which a # is used
+incorrectly.  A # character, except as part of the command name \\#,
+can be used only to indicate an argument parameter, as in #2, which
+denotes the second argument. This error is also caused by nesting one
+of the above four commands inside another, or by putting a parameter
+like #2 in the last argument of a \\newenvironment or \\renewenvironment
+command.")
+
+    ("Illegal unit of measure ([^ ]* inserted)." .
+"If you just got a
+
+      ! Missing number, treated as zero.
+
+error, then this is part of the same problem.  If not, it means that
+LaTeX was expecting a length as an argument and found a number
+instead.  The most common cause of this error is writing 0 instead of
+something like 0in for a length of zero, in which case typing return
+should result in correct output. However, the error can also be caused
+by omitting a command argument.")
+
+    ("Misplaced alignment tab character \\&." .
+"The special character &, which should be used only to separate items
+in an array or tabular environment, appeared in ordinary text. You
+probably meant to type \\&.")
+
+    ("Missing control sequence inserted." .
+"This is probably caused by a \\newcommand, \\renewcommand, \\newlength,
+or \\newsavebox command whose first argument is not a command name.")
+
+    ("Missing number, treated as zero." .
+"This is usually caused by a LaTeX command expecting but not finding
+either a number or a length as an argument. You may have omitted an
+argument, or a square bracket in the text may have been mistaken for
+the beginning of an optional argument. This error is also caused by
+putting \\protect in front of either a length command or a command such
+as \\value that produces a number.")
+
+    ("Missing [{}] inserted." .
+"TeX has become confused. The position indicated by the error locator
+is probably beyond the point where the incorrect input is.")
+
+    ("Missing \\$ inserted." .
+"TeX probably found a command that can be used only in math mode when
+it wasn't in math mode.  Remember that unless stated otherwise, all
+all the commands of Section 3.3 in LaTeX Book (Lamport) can be used
+only in math mode. TeX is not in math mode when it begins processing
+the argument of a box-making command, even if that command is inside a
+math environment. This error also occurs if TeX encounters a blank
+line when it is in math mode.")
+
+    ("Not a letter." .
+"Something appears in the argument of a \\hyphenation command that
+doesn't belong there.")
+
+    ("Paragraph ended before [^ ]* was complete." .
+"A blank line occurred in a command argument that shouldn't contain
+one. You probably forgot the right brace at the end of an argument.")
+
+    ("\\\\[^ ]*font [^ ]* is undefined .*" .
+"These errors occur when an uncommon font is used in math mode---for
+example, if you use a \\sc command in a formula inside a footnote,
+calling for a footnote-sized small caps font.  This problem is solved
+by using a \\load command.")
+
+    ("Font .* not found." .
+"You requested a family/series/shape/size combination that is totally
+unknown.  There are two cases in which this error can occur:
+  1) You used the \\size macro to select a size that is not available.
+  2) If you did not do that, go to your local `wizard' and
+     complain fiercely that the font selection tables are corrupted!")
+
+    ("TeX capacity exceeded, sorry .*" .
+"TeX has just run out of space and aborted its execution. Before you
+panic, remember that the least likely cause of this error is TeX not
+having the capacity to process your document.  It was probably an
+error in your input file that caused TeX to run out of room. The
+following discussion explains how to decide whether you've really
+exceeded TeX's capacity and, if so, what to do. If the problem is an
+error in the input, you may have to use the divide and conquer method
+described previously to locate it. LaTeX seldom runs out of space on a
+short input file, so if running it on the last few pages before the
+error indicator's position still produces the error, then there's
+almost certainly something wrong in the input file.
+
+The end of the error indicator tells what kind of space TeX ran out
+of. The more common ones are listed below, with an explanation of
+their probable causes.
+
+buffer size
+===========
+Can be caused by too long a piece of text as the argument
+of a sectioning, \\caption, \\addcontentsline, or \\addtocontents
+command. This error will probably occur when the \\end{document} is
+being processed, but it could happen when a \\tableofcontents,
+\\listoffigures, or \\listoftables command is executed. To solve this
+problem, use a shorter optional argument. Even if you're producing a
+table of contents or a list of figures or tables, such a long entry
+won't help the reader.
+
+exception dictionary
+====================
+You have used \\hyphenation commands to give TeX
+more hyphenation information than it has room for. Remove some of the
+less frequently used words from the \\hyphenation commands and insert
+\\- commands instead.
+
+hash size
+=========
+Your input file defines too many command names and/or uses
+too many cross-ref- erencing labels.
+
+input stack size
+================
+This is probably caused by an error in a command
+definition. For example, the following command makes a circular
+definition, defining \\gnu in terms of itself:
+
+         \\newcommand{\\gnu}{a \\gnu} % This is wrong!
+
+When TeX encounters this \\gnu command, it will keep chasing its tail
+trying to figure out what \\gnu should produce, and eventually run out
+of ``input stack''.
+
+main memory size
+================
+This is one kind of space that TeX can run out of when processing a
+short file. There are three ways you can run TeX out of main memory
+space: (1) defining a lot of very long, complicated commands, (2)
+making an index or glossary and having too many \\index or \\glossary
+commands on a single page, and (3) creating so complicated a page of
+output that TeX can't hold all the information needed to generate it.
+The solution to the first two problems is obvious: define fewer
+commands or use fewer \\index and \\glossary commands. The third problem
+is nastier. It can be caused by large tabbing, tabular, array, and
+picture environments. TeX's space may also be filled up with figures
+and tables waiting for a place to go.  To find out if you've really
+exceeded TeX's capacity in this way, put a \\clearpage command in your
+input file right before the place where TeX ran out of room and try
+running it again. If it doesn't run out of room with the \\clearpage
+command there, then you did exceed TeX's capacity.  If it still runs
+out of room, then there's probably an error in your file.  If TeX is
+really out of room, you must give it some help. Remember that TeX
+processes a complete paragraph before deciding whether to cut the
+page. Inserting a \\newpage command in the middle of the paragraph,
+where TeX should break the page, may save the day by letting TeX write
+the current page before processing the rest of the paragraph. (A
+\\pagebreak command won't help.) If the problem is caused by
+accumulated figures and tables, you can try to prevent them from
+accumulating---either by moving them further towards the end of the
+document or by trying to get them to come out sooner.  If you are
+still writing the document, simply add a \\clearpage command and forget
+about the problem until you're ready to produce the final version.
+Changes to the input file are likely to make the problem go away.
+
+pool size
+=========
+You probably used too many cross-ref-erencing \\labels and/or defined
+too many new command names. More precisely, the labels and command
+names that you define have too many characters, so this problem can be
+solved by using shorter names. However, the error can also be caused
+by omitting the right brace that ends the argument of either a counter
+command such as \\setcounter, or a \\newenvironment or \\newtheorem
+command.
+
+save size
+=========
+This occurs when commands, environments, and the scopes of
+declarations are nested too deeply---for example, by having the
+argument of a \\multiput command contain a picture environment that in
+turn has a \\footnotesize declaration whose scope contains a \\multiput
+command containing a ....")
+
+    ("Text line contains an invalid character." .
+"The input contains some strange character that it shouldn't. A mistake
+when creating the file probably caused your text editor to insert this
+character. Exactly what could have happened depends upon what text
+editor you used. If examining the input file doesn't reveal the
+offending character, consult the Local Guide for suggestions.")
+
+    ("Undefined control sequence."   .
+"TeX encountered an unknown command name. You probably misspelled the
+name. If this message occurs when a LaTeX command is being processed,
+the command is probably in the wrong place---for example, the error
+can be produced by an \\item command that's not inside a list-making
+environment. The error can also be caused by a missing \\documentclass
+command.")
+
+    ("Use of [^ ]* doesn't match its definition." .
+"It's probably one of the picture-drawing commands, and you have used
+the wrong syntax for specifying an argument. If it's \\@array that
+doesn't match its definition, then there is something wrong in an
+@-expression in the argument of an array or tabular
+environment---perhaps a fragile command that is not \\protect'ed.")
+
+    ("You can't use `macro parameter character \\#' in [^ ]* mode." .
+"The special character # has appeared in ordinary text. You probably
+meant to type \\#.")
+
+    ("Overfull \\\\hbox .*" .
+"Because it couldn't find a good place for a line break, TeX put more
+on this line than it should.")
+
+    ("Overfull \\\\vbox .*" .
+"Because it couldn't find a good place for a page break, TeX put more
+on the page than it should. ")
+
+    ("Underfull \\\\hbox .*" .
+"Check your output for extra vertical space.  If you find some, it was
+probably caused by a problem with a \\\\ or \\newline command---for
+example, two \\\\ commands in succession. This warning can also be
+caused by using the sloppypar environment or \\sloppy declaration, or
+by inserting a \\linebreak command.")
+
+    ("Underfull \\\\vbox .*" .
+"TeX could not find a good place to break the page, so it produced a
+page without enough text on it. ")
+
+;; New list items should be placed here
+;;
+;; ("err-regexp" . "context")
+;;
+;; the err-regexp item should match anything
+
+    (".*" . "No help available"))      ; end definition
+"A list of the form (\"err-regexp\" . \"context\") used by function
+`TeX-help-error' to display help-text on an error message or warning.
+err-regexp should be a regular expression matching the error message
+given from TeX/LaTeX, and context should be some lines describing that
+error."
+  :group 'TeX-output
+  :type '(repeat (cons :tag "Entry"
+                      (regexp :tag "Match")
+                      (string :format "Description:\n%v"))))
+
+(provide 'tex-buf)
+
+;;; tex-buf.el ends here
diff --git a/packages/auctex/tex-fold.el b/packages/auctex/tex-fold.el
new file mode 100644 (file)
index 0000000..0b8de3a
--- /dev/null
@@ -0,0 +1,980 @@
+;;; tex-fold.el --- Fold TeX macros.
+
+;; Copyright (C) 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+
+;; Author: Ralf Angeli <angeli@caeruleus.net>
+;; Maintainer: auctex-devel@gnu.org
+;; Created: 2004-07-04
+;; Keywords: tex, wp
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file provides support for hiding and unhiding TeX, LaTeX,
+;; ContTeXt, Texinfo and similar macros and environments inside of
+;; AUCTeX.
+;;
+;; Caveats:
+;;
+;; The display string of content which should display part of itself
+;; is made by copying the text from the buffer together with its text
+;; properties.  If fontification has not happened when this is done
+;; (e.g. because of lazy or just-in-time font locking) the intended
+;; fontification will not show up.  Maybe this could be improved by
+;; using some sort of "lazy folding" or refreshing the window upon
+;; scrolling.  As a workaround fontification of the whole buffer
+;; currently is forced before folding it.
+
+;;; Code:
+
+(when (featurep 'xemacs)
+  (require 'overlay))
+(require 'tex)
+(autoload 'LaTeX-forward-paragraph "latex")
+(autoload 'LaTeX-backward-paragraph "latex")
+(autoload 'LaTeX-find-matching-begin "latex")
+(autoload 'LaTeX-find-matching-end "latex")
+(autoload 'ConTeXt-find-matching-start "context")
+(autoload 'ConTeXt-find-matching-stop "context")
+(autoload 'Texinfo-find-env-start "tex-info")
+(autoload 'Texinfo-find-env-end "tex-info")
+
+(defgroup TeX-fold nil
+  "Fold TeX macros."
+  :group 'AUCTeX)
+
+(defcustom TeX-fold-type-list '(env macro math)
+  "List of item types to consider when folding.
+Valid items are the symbols 'env for environments, 'macro for
+macros, 'math for math macros and 'comment for comments."
+  :type '(set (const :tag "Environments" env)
+             (const :tag "Macros" macro)
+             (const :tag "Math Macros" math)
+             (const :tag "Comments" comment))
+  :group 'TeX-fold)
+
+(defcustom TeX-fold-macro-spec-list
+  `(("[f]" ("footnote" "marginpar"))
+    ("[c]" ("cite"))
+    ("[l]" ("label"))
+    ("[r]" ("ref" "pageref" "eqref"))
+    ("[i]" ("index" "glossary"))
+    ("[1]:||*" ("item"))
+    ("..." ("dots"))
+    ("(C)" ("copyright"))
+    ("(R)" ("textregistered"))
+    ("TM"  ("texttrademark"))
+    (1 ("part" "chapter" "section" "subsection" "subsubsection"
+       "paragraph" "subparagraph"
+       "part*" "chapter*" "section*" "subsection*" "subsubsection*"
+       "paragraph*" "subparagraph*"
+       "emph" "textit" "textsl" "textmd" "textrm" "textsf" "texttt"
+       "textbf" "textsc" "textup")))
+  "List of replacement specifiers and macros to fold.
+
+The first element of each item can be a string, an integer or a
+function symbol.  The second element is a list of macros two fold
+without the leading backslash.
+
+If the first element is a string, it will be used as a display
+replacement for the whole macro.  Numbers in braces, brackets,
+parens or angle brackets will be replaced by the respective macro
+argument.  For example \"{1}\" will be replaced by the first
+mandatory argument of the macro.  One can also define
+alternatives within the specifier which are used if an argument
+is not found.  Alternatives are separated by \"||\".  They are
+most useful with optional arguments.  As an example, the default
+specifier for \\item is \"[1]:||*\" which means that if there is
+an optional argument, its value is shown followed by a colon.  If
+there is no optional argument, only an asterisk is used as the
+display string.
+
+If the first element is an integer, the macro will be replaced by
+the respective macro argument.
+
+If the first element is a function symbol, the function will be
+called with all mandatory arguments of the macro and the result
+of the function call will be used as a replacement for the macro.
+
+Setting this variable does not take effect immediately.  Use
+Customize or reset the mode."
+  :type '(repeat (group (choice (string :tag "Display String")
+                               (integer :tag "Number of argument" :value 1)
+                               (function :tag "Function to execute"))
+                       (repeat :tag "Macros" (string))))
+  :group 'TeX-fold)
+
+(defvar TeX-fold-macro-spec-list-internal nil
+  "Internal list of display strings and macros to fold.
+Is updated when the TeX Fold mode is being activated and then
+contains all constructs to fold for the given buffer or mode
+respectively, i.e. contents of both `TeX-fold-macro-spec-list'
+and <mode-prefix>-fold-macro-spec-list.")
+(make-variable-buffer-local 'TeX-fold-macro-spec-list-internal)
+
+(defcustom TeX-fold-env-spec-list
+  '(("[comment]" ("comment")))
+  "List of display strings and environments to fold."
+  :type '(repeat (group (choice (string :tag "Display String")
+                               (integer :tag "Number of argument" :value 1))
+                       (repeat :tag "Environments" (string))))
+  :group 'TeX-fold)
+
+(defvar TeX-fold-env-spec-list-internal nil
+  "Internal list of display strings and environments to fold.
+Is updated when the TeX Fold mode is being activated and then
+contains all constructs to fold for the given buffer or mode
+respectively, i.e. contents of both `TeX-fold-env-spec-list'
+and <mode-prefix>-fold-env-spec-list.")
+(make-variable-buffer-local 'TeX-fold-env-spec-list-internal)
+
+(defcustom TeX-fold-math-spec-list nil
+  "List of display strings and math macros to fold."
+  :type '(repeat (group (choice (string :tag "Display String")
+                               (integer :tag "Number of argument" :value 1))
+                       (repeat :tag "Math Macros" (string))))
+  :group 'TeX-fold)
+
+(defvar TeX-fold-math-spec-list-internal nil
+  "Internal list of display strings and math macros to fold.
+Is updated when the TeX Fold mode is being activated and then
+contains all constructs to fold for the given buffer or mode
+respectively, i.e. contents of both `TeX-fold-math-spec-list'
+and <mode-prefix>-fold-math-spec-list.")
+(make-variable-buffer-local 'TeX-fold-math-spec-list-internal)
+
+(defcustom TeX-fold-unspec-macro-display-string "[m]"
+  "Display string for unspecified macros.
+This string will be displayed if a single macro is being hidden
+which is not specified in `TeX-fold-macro-spec-list'."
+  :type '(string)
+  :group 'TeX-fold)
+
+(defcustom TeX-fold-unspec-env-display-string "[env]"
+  "Display string for unspecified environments.
+This string will be displayed if a single environment is being
+hidden which is not specified in `TeX-fold-env-spec-list'."
+  :type '(string)
+  :group 'TeX-fold)
+
+(defcustom TeX-fold-unspec-use-name t
+  "If non-nil use the name of an unspecified item as display string.
+Set it to nil if you want to use the values of the variables
+`TeX-fold-unspec-macro-display-string' or
+`TeX-fold-unspec-env-display-string' respectively as a display
+string for any unspecified macro or environment."
+  :type 'boolean
+  :group 'TeX-fold)
+
+(defcustom TeX-fold-preserve-comments nil
+  "If non-nil do not fold in comments."
+  :type 'boolean
+  :group 'TeX-fold)
+
+(defcustom TeX-fold-unfold-around-mark t
+  "Unfold text around the mark, if active."
+  :type 'boolean
+  :group 'TeX-fold)
+
+(defcustom TeX-fold-help-echo-max-length 70
+  "Maximum length of help echo message for folded overlays.
+Set it to zero in order to disable help echos."
+  :type 'integer
+  :group 'TeX-fold)
+
+(defcustom TeX-fold-force-fontify t
+  "Force the buffer to be fully fontified by folding it."
+  :group 'TeX-fold
+  :type 'boolean)
+
+(defcustom TeX-fold-auto nil
+  "If non-nil, fold macros automatically after `TeX-insert-macro'."
+  :group 'TeX-fold
+  :type 'boolean)
+
+(defface TeX-fold-folded-face
+  '((((class color) (background light))
+     (:foreground "SlateBlue"))
+    (((class color) (background dark))
+     (:foreground "SlateBlue1"))
+    (((class grayscale) (background light))
+     (:foreground "DimGray"))
+    (((class grayscale) (background dark))
+     (:foreground "LightGray"))
+    (t (:slant italic)))
+  "Face for the display string of folded content."
+  :group 'TeX-fold)
+
+(defvar TeX-fold-folded-face 'TeX-fold-folded-face
+  "Face for the display string of folded content.")
+
+(defface TeX-fold-unfolded-face
+  '((((class color) (background light))
+     (:background "#f2f0fd"))
+    (((class color) (background dark))
+     (:background "#38405d"))
+    (((class grayscale) (background light))
+     (:background "LightGray"))
+    (((class grayscale) (background dark))
+     (:background "DimGray"))
+    (t (:inverse-video t)))
+  "Face for folded content when it is temporarily opened."
+  :group 'TeX-fold)
+
+(defvar TeX-fold-unfolded-face 'TeX-fold-unfolded-face
+  "Face for folded content when it is temporarily opened.")
+
+(defvar TeX-fold-ellipsis "..."
+  "String used as display string for overlays instead of a zero-length string.")
+
+(defvar TeX-fold-open-spots nil)
+(make-variable-buffer-local 'TeX-fold-open-spots)
+
+(defcustom TeX-fold-command-prefix "\C-c\C-o"
+  "Prefix key to use for commands in TeX Fold mode.
+The value of this variable is checked as part of loading TeX Fold mode.
+After that, changing the prefix key requires manipulating keymaps."
+  :type 'string
+  :group 'TeX-fold)
+
+(defvar TeX-fold-keymap
+  (let ((map (make-sparse-keymap)))
+    (define-key map "\C-o" 'TeX-fold-dwim)
+    (define-key map "\C-b" 'TeX-fold-buffer)
+    (define-key map "\C-r" 'TeX-fold-region)
+    (define-key map "\C-p" 'TeX-fold-paragraph)
+    (define-key map "\C-m" 'TeX-fold-macro)
+    (define-key map "\C-e" 'TeX-fold-env)
+    (define-key map "\C-c" 'TeX-fold-comment)
+    (define-key map "b"    'TeX-fold-clearout-buffer)
+    (define-key map "r"    'TeX-fold-clearout-region)
+    (define-key map "p"    'TeX-fold-clearout-paragraph)
+    (define-key map "i"    'TeX-fold-clearout-item)
+    map))
+
+
+;;; Folding
+
+(defun TeX-fold-dwim ()
+  "Hide or show items according to the current context.
+If there is folded content, unfold it.  If there is a marked
+region, fold all configured content in this region.  If there is
+no folded content but a macro or environment, fold it."
+  (interactive)
+  (cond ((TeX-fold-clearout-item))
+       ((TeX-active-mark) (TeX-fold-region (mark) (point)))
+       ((TeX-fold-item 'macro))
+       ((TeX-fold-item 'math))
+       ((TeX-fold-item 'env))
+       ((TeX-fold-comment))))
+
+(defun TeX-fold-buffer ()
+  "Hide all configured macros and environments in the current buffer.
+The relevant macros are specified in the variable `TeX-fold-macro-spec-list'
+and `TeX-fold-math-spec-list', and environments in `TeX-fold-env-spec-list'."
+  (interactive)
+  (TeX-fold-clearout-region (point-min) (point-max))
+  (when (and TeX-fold-force-fontify
+            (boundp 'jit-lock-mode)
+            jit-lock-mode
+            (fboundp 'jit-lock-fontify-now))
+    ;; We force fontification here only because it should rarely be
+    ;; needed for the other folding commands.
+    (jit-lock-fontify-now))
+  (TeX-fold-region (point-min) (point-max)))
+
+(defun TeX-fold-paragraph ()
+  "Hide all configured macros and environments in the current paragraph.
+The relevant macros are specified in the variable `TeX-fold-macro-spec-list'
+and `TeX-fold-math-spec-list', and environments in `TeX-fold-env-spec-list'."
+  (interactive)
+  (save-excursion
+    (let ((end (progn (LaTeX-forward-paragraph) (point)))
+         (start (progn (LaTeX-backward-paragraph) (point))))
+      (TeX-fold-clearout-region start end)
+      (TeX-fold-region start end))))
+
+(defun TeX-fold-region (start end)
+  "Fold all items in region from START to END."
+  (interactive "r")
+  (when (and (memq 'env TeX-fold-type-list)
+            (not (eq major-mode 'plain-tex-mode)))
+    (TeX-fold-region-macro-or-env start end 'env))
+  (when (memq 'macro TeX-fold-type-list)
+    (TeX-fold-region-macro-or-env start end 'macro))
+  (when (memq 'math TeX-fold-type-list)
+    (TeX-fold-region-macro-or-env start end 'math))
+  (when (memq 'comment TeX-fold-type-list)
+    (TeX-fold-region-comment start end)))
+
+(defun TeX-fold-region-macro-or-env (start end type)
+  "Fold all items of type TYPE in region from START to END.
+TYPE can be one of the symbols 'env for environments, 'macro
+for macros and 'math for math macros."
+  (save-excursion
+    (let (fold-list item-list regexp)
+      (dolist (item (cond ((eq type 'env) TeX-fold-env-spec-list-internal)
+                         ((eq type 'math) TeX-fold-math-spec-list-internal)
+                         (t TeX-fold-macro-spec-list-internal)))
+       (dolist (i (cadr item))
+         (add-to-list 'fold-list (list i (car item)))
+         (add-to-list 'item-list i)))
+      (when item-list
+       (setq regexp (cond ((and (eq type 'env)
+                                (eq major-mode 'context-mode))
+                           (concat (regexp-quote TeX-esc)
+                                   "start" (regexp-opt item-list t)))
+                          ((and (eq type 'env)
+                                (eq major-mode 'texinfo-mode))
+                           (concat (regexp-quote TeX-esc)
+                                   (regexp-opt item-list t)))
+                          ((eq type 'env)
+                           (concat (regexp-quote TeX-esc)
+                                   "begin[ \t]*{"
+                                   (regexp-opt item-list t) "}"))
+                          (t
+                           (concat (regexp-quote TeX-esc)
+                                   (regexp-opt item-list t)))))
+       (save-restriction
+         (narrow-to-region start end)
+         ;; Start from the bottom so that it is easier to prioritize
+         ;; nested macros.
+         (goto-char (point-max))
+         (let ((case-fold-search nil)
+               item-name)
+           (while (re-search-backward regexp nil t)
+             (setq item-name (match-string 1))
+             (unless (or (and TeX-fold-preserve-comments
+                              (TeX-in-commented-line))
+                         ;; Make sure no partially matched macros are
+                         ;; folded.  For macros consisting of letters
+                         ;; this means there should be none of the
+                         ;; characters [A-Za-z@*] after the matched
+                         ;; string.  Single-char non-letter macros like
+                         ;; \, don't have this requirement.
+                         (and (memq type '(macro math))
+                              (save-match-data
+                                (string-match "[A-Za-z]" item-name))
+                              (save-match-data
+                                (string-match "[A-Za-z@*]"
+                                              (string (char-after
+                                                       (match-end 0)))))))
+               (let* ((item-start (match-beginning 0))
+                      (display-string-spec (cadr (assoc item-name
+                                                        fold-list)))
+                      (item-end (TeX-fold-item-end item-start type))
+                      (ov (TeX-fold-make-overlay item-start item-end type
+                                                 display-string-spec)))
+                 (TeX-fold-hide-item ov))))))))))
+
+(defun TeX-fold-region-comment (start end)
+  "Fold all comments in region from START to END."
+  (save-excursion
+    (goto-char start)
+    (let (beg)
+      (while (setq beg (TeX-search-forward-comment-start end))
+       (goto-char beg)
+       ;; Determine the start of the region to be folded just behind
+       ;; the comment starter.
+       (looking-at TeX-comment-start-regexp)
+       (setq beg (match-end 0))
+       ;; Search for the end of the comment.
+       (while (TeX-comment-forward))
+       (end-of-line 0)
+       ;; Hide the whole region.
+       (TeX-fold-hide-item (TeX-fold-make-overlay beg (point) 'comment
+                                                  TeX-fold-ellipsis))))))
+
+(defun TeX-fold-macro ()
+  "Hide the macro on which point currently is located."
+  (interactive)
+  (unless (TeX-fold-item 'macro)
+    (message "No macro found")))
+
+(defun TeX-fold-math ()
+  "Hide the math macro on which point currently is located."
+  (interactive)
+  (unless (TeX-fold-item 'math)
+    (message "No macro found")))
+
+(defun TeX-fold-env ()
+  "Hide the environment on which point currently is located."
+  (interactive)
+  (unless (TeX-fold-item 'env)
+    (message "No environment found")))
+
+(defun TeX-fold-comment ()
+  "Hide the comment on which point currently is located."
+  (interactive)
+  (unless (TeX-fold-comment-do)
+    (message "No comment found")))
+
+(defun TeX-fold-item (type)
+  "Hide the item on which point currently is located.
+TYPE specifies the type of item and can be one of the symbols
+'env for environments, 'macro for macros or 'math for math
+macros.
+Return non-nil if an item was found and folded, nil otherwise."
+  (if (and (eq type 'env)
+          (eq major-mode 'plain-tex-mode))
+      (message
+       "Folding of environments is not supported in current mode")
+    (let ((item-start (cond ((and (eq type 'env)
+                                 (eq major-mode 'context-mode))
+                            (save-excursion
+                              (ConTeXt-find-matching-start) (point)))
+                           ((and (eq type 'env)
+                                 (eq major-mode 'texinfo-mode))
+                            (save-excursion
+                              (Texinfo-find-env-start) (point)))
+                           ((eq type 'env)
+                            (condition-case nil
+                                (save-excursion
+                                  (LaTeX-find-matching-begin) (point))
+                              (error nil)))
+                           (t
+                            (TeX-find-macro-start)))))
+      (when item-start
+       (let* ((item-name (save-excursion
+                           (goto-char item-start)
+                           (looking-at
+                            (cond ((and (eq type 'env)
+                                        (eq major-mode 'context-mode))
+                                   (concat (regexp-quote TeX-esc)
+                                           "start\\([A-Za-z]+\\)"))
+                                  ((and (eq type 'env)
+                                        (eq major-mode 'texinfo-mode))
+                                   (concat (regexp-quote TeX-esc)
+                                           "\\([A-Za-z]+\\)"))
+                                  ((eq type 'env)
+                                   (concat (regexp-quote TeX-esc)
+                                           "begin[ \t]*{"
+                                           "\\([A-Za-z]+\\)}"))
+                                  (t
+                                   (concat (regexp-quote TeX-esc)
+                                           "\\([A-Za-z@*]+\\)"))))
+                           (if (fboundp 'match-string-no-properties)
+                               (match-string-no-properties 1)
+                             (match-string 1))))
+              (fold-list (cond ((eq type 'env) TeX-fold-env-spec-list-internal)
+                               ((eq type 'math)
+                                TeX-fold-math-spec-list-internal)
+                               (t TeX-fold-macro-spec-list-internal)))
+              fold-item
+              (display-string-spec
+               (or (catch 'found
+                     (while fold-list
+                       (setq fold-item (car fold-list))
+                       (setq fold-list (cdr fold-list))
+                       (when (member item-name (cadr fold-item))
+                         (throw 'found (car fold-item)))))
+                   ;; Item is not specified.
+                   (if TeX-fold-unspec-use-name
+                       (concat "[" item-name "]")
+                     (if (eq type 'env)
+                         TeX-fold-unspec-env-display-string
+                       TeX-fold-unspec-macro-display-string))))
+              (item-end (TeX-fold-item-end item-start type))
+              (ov (TeX-fold-make-overlay item-start item-end type
+                                         display-string-spec)))
+         (TeX-fold-hide-item ov))))))
+
+(defun TeX-fold-comment-do ()
+  "Hide the comment on which point currently is located.
+This is the function doing the work for `TeX-fold-comment'.  It
+is an internal function communicating with return values rather
+than with messages for the user.
+Return non-nil if a comment was found and folded, nil otherwise."
+  (if (and (not (TeX-in-comment)) (not (TeX-in-line-comment)))
+      nil
+    (let (beg)
+      (save-excursion
+       (while (progn
+                (beginning-of-line 0)
+                (and (TeX-in-line-comment)
+                     (not (bobp)))))
+       (goto-char (TeX-search-forward-comment-start (line-end-position 2)))
+       (looking-at TeX-comment-start-regexp)
+       (setq beg (match-end 0))
+       (while (TeX-comment-forward))
+       (end-of-line 0)
+       (when (> (point) beg)
+         (TeX-fold-hide-item (TeX-fold-make-overlay beg (point) 'comment
+                                                    TeX-fold-ellipsis)))))))
+
+
+;;; Utilities
+
+(defun TeX-fold-make-overlay (ov-start ov-end type display-string-spec)
+  "Make a TeX-fold overlay extending from OV-START to OV-END.
+TYPE is a symbol which is used to describe the content to hide
+and may be 'macro for macros, 'math for math macro and 'env for
+environments.
+DISPLAY-STRING-SPEC is the original specification of the display
+string in the variables `TeX-fold-macro-spec-list' or
+`TeX-fold-env-spec-list' and may be a string or an integer."
+  ;; Calculate priority before the overlay is instantiated.  We don't
+  ;; want `TeX-overlay-prioritize' to pick up a non-prioritized one.
+  (let ((priority (TeX-overlay-prioritize ov-start ov-end))
+       (ov (make-overlay ov-start ov-end (current-buffer) t nil)))
+    (overlay-put ov 'category 'TeX-fold)
+    (overlay-put ov 'priority priority)
+    (overlay-put ov 'evaporate t)
+    (overlay-put ov 'TeX-fold-type type)
+    (overlay-put ov 'TeX-fold-display-string-spec display-string-spec)
+    ov))
+
+(defun TeX-fold-item-end (start type)
+  "Return the end of an item of type TYPE starting at START.
+TYPE can be either 'env for environments, 'macro for macros or
+'math for math macros."
+  (save-excursion
+    (cond ((and (eq type 'env)
+               (eq major-mode 'context-mode))
+          (goto-char start)
+          (ConTeXt-find-matching-stop)
+          (point))
+         ((and (eq type 'env)
+               (eq major-mode 'texinfo-mode))
+          (goto-char (1+ start))
+          (Texinfo-find-env-end)
+          (point))
+         ((eq type 'env)
+          (goto-char (1+ start))
+          (LaTeX-find-matching-end)
+          (point))
+         (t
+          (goto-char start)
+          (TeX-find-macro-end)))))
+
+(defun TeX-fold-overfull-p (ov-start ov-end display-string)
+  "Return t if an overfull line will result after adding an overlay.
+The overlay extends from OV-START to OV-END and will display the
+string DISPLAY-STRING."
+  (and (not (featurep 'xemacs)) ; Linebreaks in glyphs don't
+                               ; work in XEmacs anyway.
+       (save-excursion
+        (goto-char ov-end)
+        (search-backward "\n" ov-start t))
+       (not (string-match "\n" display-string))
+       (> (+ (- ov-start
+               (save-excursion
+                 (goto-char ov-start)
+                 (line-beginning-position)))
+            (length display-string)
+            (- (save-excursion
+                 (goto-char ov-end)
+                 (line-end-position))
+               ov-end))
+         (current-fill-column))))
+
+(defun TeX-fold-macro-nth-arg (n macro-start &optional macro-end delims)
+  "Return a property list of the argument number N of a macro.
+The start of the macro to examine is given by MACRO-START, its
+end optionally by MACRO-END.  With DELIMS the type of delimiters
+can be specified as a cons cell containing the opening char as
+the car and the closing char as the cdr.  The chars have to have
+opening and closing syntax as defined in
+`TeX-search-syntax-table'.
+
+The first item in the returned list is the string specified in
+the argument, the second item may be a face if the argument
+string was fontified.  In Emacs the string holds text properties
+as well, so the second item is always nil.  In XEmacs the string
+does not enclose any faces, so these are given in the second item
+of the resulting list."
+  (save-excursion
+    (let* ((macro-end (or macro-end
+                         (save-excursion (goto-char macro-start)
+                                         (TeX-find-macro-end))))
+          (open-char (if delims (car delims) ?{))
+          (open-string (char-to-string open-char))
+          (close-char (if delims (cdr delims) ?}))
+          (close-string (char-to-string close-char))
+          content-start content-end)
+      (goto-char macro-start)
+      (if (condition-case nil
+             (progn
+               (while (> n 0)
+                 (skip-chars-forward (concat "^" open-string) macro-end)
+                 (when (= (point) macro-end)
+                   (error nil))
+                 (setq content-start (progn
+                                       (skip-chars-forward
+                                        (concat open-string " \t"))
+                                       (point)))
+                 (goto-char
+                  (if delims
+                      (with-syntax-table
+                          (TeX-search-syntax-table open-char close-char)
+                        (scan-lists (point) 1 1))
+                    (TeX-find-closing-brace)))
+                 (setq content-end (save-excursion
+                                     (backward-char)
+                                     (skip-chars-backward " \t")
+                                     (point)))
+                 (setq n (1- n)))
+               t)
+           (error nil))
+         (list (TeX-fold-buffer-substring content-start content-end)
+               (when (and (featurep 'xemacs)
+                          (extent-at content-start))
+                 ;; A glyph in XEmacs does not seem to be able to hold more
+                 ;; than one face, so we just use the first one we get.
+                 (car (extent-property (extent-at content-start) 'face))))
+       nil))))
+
+(defun TeX-fold-buffer-substring (start end)
+  "Return the contents of buffer from START to END as a string.
+Like `buffer-substring' but copy overlay display strings as well."
+  ;; Swap values of `start' and `end' if necessary.
+  (when (> start end) (let ((tmp start)) (setq start end end tmp)))
+  (let ((overlays (overlays-in start end))
+       result)
+    ;; Get rid of overlays not under our control or not completely
+    ;; inside the specified region.
+    (dolist (ov overlays)
+      (when (or (not (eq (overlay-get ov 'category) 'TeX-fold))
+               (< (overlay-start ov) start)
+               (> (overlay-end ov) end))
+       (setq overlays (remove ov overlays))))
+    (if (null overlays)
+       (buffer-substring start end)
+      ;; Sort list according to ascending starts.
+      (setq overlays (sort (copy-sequence overlays)
+                          (lambda (a b)
+                            (< (overlay-start a) (overlay-start b)))))
+      ;; Get the string from the start of the region up to the first overlay.
+      (setq result (buffer-substring start (overlay-start (car overlays))))
+      (let (ov)
+       (while overlays
+         (setq ov (car overlays)
+               overlays (cdr overlays))
+         ;; Add the display string of the overlay.
+         (setq result (concat result (overlay-get ov 'display)))
+         ;; Remove overlays contained in the current one.
+         (dolist (elt overlays)
+           (when (< (overlay-start elt) (overlay-end ov))
+             (setq overlays (remove elt overlays))))
+         ;; Add the string from the end of the current overlay up to
+         ;; the next overlay or the end of the specified region.
+         (setq result (concat result (buffer-substring (overlay-end ov)
+                                                       (if overlays
+                                                           (overlay-start
+                                                            (car overlays))
+                                                         end))))))
+      result)))
+
+(defun TeX-fold-make-help-echo (start end)
+  "Return a string to be used as the help echo of folded overlays.
+The text between START and END will be used for this but cropped
+to the length defined by `TeX-fold-help-echo-max-length'.  Line
+breaks will be replaced by spaces."
+  (let* ((spill (+ start TeX-fold-help-echo-max-length))
+        (lines (split-string (buffer-substring start (min end spill)) "\n"))
+        (result (pop lines)))
+    (dolist (line lines)
+      ;; Strip leading whitespace
+      (when (string-match "^[ \t]+" line)
+       (setq line (replace-match "" nil nil line)))
+      ;; Strip trailing whitespace
+      (when (string-match "[ \t]+$" line)
+       (setq line (replace-match "" nil nil line)))
+      (setq result (concat result " " line)))
+    (when (> end spill) (setq result (concat result "...")))
+    result))
+
+(defun TeX-fold-update-at-point ()
+  "Update all TeX-fold overlays at point displaying computed content."
+  (let (overlays)
+    ;; Get all overlays at point under our control.
+    (dolist (ov (overlays-at (point)))
+      (when (and (eq (overlay-get ov 'category) 'TeX-fold)
+                (numberp (overlay-get ov 'TeX-fold-display-string-spec)))
+       (add-to-list 'overlays ov)))
+    (when overlays
+      ;; Sort list according to descending starts.
+      (setq overlays (sort (copy-sequence overlays)
+                          (lambda (a b)
+                            (> (overlay-start a) (overlay-start b)))))
+      (dolist (ov overlays)
+       (TeX-fold-hide-item ov)))))
+
+
+;;; Removal
+
+(defun TeX-fold-clearout-buffer ()
+  "Permanently show all macros in the buffer."
+  (interactive)
+  (TeX-fold-clearout-region (point-min) (point-max)))
+
+(defun TeX-fold-clearout-paragraph ()
+  "Permanently show all macros in the paragraph point is located in."
+  (interactive)
+  (save-excursion
+    (let ((end (progn (LaTeX-forward-paragraph) (point)))
+         (start (progn (LaTeX-backward-paragraph) (point))))
+      (TeX-fold-clearout-region start end))))
+
+(defun TeX-fold-clearout-region (start end)
+  "Permanently show all macros in region starting at START and ending at END."
+  (interactive "r")
+  (let ((overlays (overlays-in start end)))
+    (TeX-fold-remove-overlays overlays)))
+
+(defun TeX-fold-clearout-item ()
+  "Permanently show the macro on which point currently is located."
+  (interactive)
+  (let ((overlays (overlays-at (point))))
+    (TeX-fold-remove-overlays overlays)))
+
+(defun TeX-fold-remove-overlays (overlays)
+  "Remove all overlays set by TeX-fold in OVERLAYS.
+Return non-nil if a removal happened, nil otherwise."
+  (let (found)
+    (while overlays
+      (when (eq (overlay-get (car overlays) 'category) 'TeX-fold)
+       (delete-overlay (car overlays))
+       (setq found t))
+      (setq overlays (cdr overlays)))
+    found))
+
+
+;;; Toggling
+
+(defun TeX-fold-expand-spec (spec ov-start ov-end)
+  "Expand instances of {<num>}, [<num>], <<num>>, and (<num>).
+Replace them with the respective macro argument."
+  (let ((spec-list (split-string spec "||"))
+       (delims '((?{ . ?}) (?[ . ?]) (?< . ?>) (?\( . ?\))))
+       match-end success)
+    (catch 'success
+      ;; Iterate over alternatives.
+      (dolist (elt spec-list)
+       (setq spec elt)
+       ;; Find and expand every placeholder.
+       (while (and (string-match "\\([[{<]\\)\\([1-9]\\)\\([]}>]\\)" elt
+                                 match-end)
+                   ;; Does the closing delim fit to the opening one?
+                   (string-equal
+                    (match-string 3 elt)
+                    (char-to-string
+                     (cdr (assq (string-to-char (match-string 1 elt))
+                                delims)))))
+         (setq match-end (match-beginning 0))
+         (let ((arg (car (save-match-data
+                           ;; Get the argument.
+                           (TeX-fold-macro-nth-arg
+                            (string-to-number (match-string 2 elt))
+                            ov-start ov-end
+                            (assoc (string-to-char (match-string 1 elt))
+                                   delims))))))
+           (when arg (setq success t))
+           ;; Replace the placeholder in the string.
+           (setq elt (replace-match (or arg TeX-fold-ellipsis) nil t elt)
+                 spec elt)))
+       (when success (throw 'success nil))))
+    spec))
+
+(defun TeX-fold-hide-item (ov)
+  "Hide a single macro or environment.
+That means, put respective properties onto overlay OV."
+  (let* ((ov-start (overlay-start ov))
+        (ov-end (overlay-end ov))
+        (spec (overlay-get ov 'TeX-fold-display-string-spec))
+        (computed (cond
+                   ((stringp spec)
+                    (TeX-fold-expand-spec spec ov-start ov-end))
+                   ((functionp spec)
+                    (let (arg arg-list
+                          (n 1))
+                      (while (setq arg (TeX-fold-macro-nth-arg
+                                        n ov-start ov-end))
+                        (add-to-list 'arg-list (car arg) t)
+                        (setq n (1+ n)))
+                      (or (condition-case nil
+                              (apply spec arg-list)
+                            (error nil))
+                          "[Error: No content or function found]")))
+                   (t (or (TeX-fold-macro-nth-arg spec ov-start ov-end)
+                          "[Error: No content found]"))))
+        (display-string (if (listp computed) (car computed) computed))
+        (face (when (listp computed) (cadr computed))))
+    ;; Cater for zero-length display strings.
+    (when (string= display-string "") (setq display-string TeX-fold-ellipsis))
+    ;; Add a linebreak to the display string and adjust the overlay end
+    ;; in case of an overfull line.
+    (when (TeX-fold-overfull-p ov-start ov-end display-string)
+      (setq display-string (concat display-string "\n"))
+      (move-overlay ov ov-start (save-excursion
+                                 (goto-char ov-end)
+                                 (skip-chars-forward " \t")
+                                 (point))))
+    (overlay-put ov 'mouse-face 'highlight)
+    (overlay-put ov 'display display-string)
+    (if (featurep 'xemacs)
+       (let ((glyph (make-glyph (if (listp display-string)
+                                    (car display-string)
+                                  display-string))))
+         (overlay-put ov 'invisible t)
+         (when font-lock-mode
+           (if face
+               (set-glyph-property glyph 'face face)
+             (set-glyph-property glyph 'face TeX-fold-folded-face)))
+         (set-extent-property ov 'end-glyph glyph))
+      (when font-lock-mode
+       (overlay-put ov 'face TeX-fold-folded-face))
+      (unless (zerop TeX-fold-help-echo-max-length)
+       (overlay-put ov 'help-echo (TeX-fold-make-help-echo
+                                   (overlay-start ov) (overlay-end ov)))))))
+
+(defun TeX-fold-show-item (ov)
+  "Show a single LaTeX macro or environment.
+Remove the respective properties from the overlay OV."
+  (overlay-put ov 'mouse-face nil)
+  (if (featurep 'xemacs)
+      (progn
+       (set-extent-property ov 'end-glyph nil)
+       (overlay-put ov 'invisible nil))
+    (overlay-put ov 'display nil)
+    (overlay-put ov 'help-echo nil)
+    (when font-lock-mode
+      (overlay-put ov 'face TeX-fold-unfolded-face))))
+
+;; Copy and adaption of `reveal-post-command' from reveal.el in GNU
+;; Emacs on 2004-07-04.
+(defun TeX-fold-post-command ()
+  ;; `with-local-quit' is not supported in XEmacs.
+  (condition-case nil
+      (let ((inhibit-quit nil))
+       (condition-case err
+           (let* ((spots (TeX-fold-partition-list
+                          (lambda (x)
+                            ;; We refresh any spot in the current
+                            ;; window as well as any spots associated
+                            ;; with a dead window or a window which
+                            ;; does not show this buffer any more.
+                            (or (eq (car x) (selected-window))
+                                (not (window-live-p (car x)))
+                                (not (eq (window-buffer (car x))
+                                         (current-buffer)))))
+                          TeX-fold-open-spots))
+                  (old-ols (mapcar 'cdr (car spots))))
+             (setq TeX-fold-open-spots (cdr spots))
+             (when (or (and (boundp 'disable-point-adjustment)
+                            disable-point-adjustment)
+                       (and (boundp 'global-disable-point-adjustment)
+                            global-disable-point-adjustment)
+                       ;; See preview.el on how to make this configurable.
+                       (memq this-command (list (key-binding [left])
+                                                (key-binding [right])
+                                                'mouse-set-point)))
+               ;; Open new overlays.
+               (dolist (ol (nconc (when (and TeX-fold-unfold-around-mark
+                                             (boundp 'mark-active)
+                                             mark-active)
+                                    (overlays-at (mark)))
+                                  (overlays-at (point))))
+                 (when (eq (overlay-get ol 'category) 'TeX-fold)
+                   (push (cons (selected-window) ol) TeX-fold-open-spots)
+                   (setq old-ols (delq ol old-ols))
+                   (TeX-fold-show-item ol))))
+             ;; Close old overlays.
+             (dolist (ol old-ols)
+               (when (and (eq (current-buffer) (overlay-buffer ol))
+                          (not (rassq ol TeX-fold-open-spots))
+                          (or (not (featurep 'xemacs))
+                              (and (featurep 'xemacs)
+                                   (not (extent-detached-p ol)))))
+                 (if (and (>= (point) (overlay-start ol))
+                          (<= (point) (overlay-end ol)))
+                     ;; Still near the overlay: keep it open.
+                     (push (cons (selected-window) ol) TeX-fold-open-spots)
+                   ;; Really close it.
+                   (TeX-fold-hide-item ol)))))
+         (error (message "TeX-fold: %s" err))))
+    (quit (setq quit-flag t))))
+
+
+;;; Misc
+
+;; Copy and adaption of `cvs-partition' from pcvs-util.el in GNU Emacs
+;; on 2004-07-05 to make tex-fold.el mainly self-contained.
+(defun TeX-fold-partition-list (p l)
+  "Partition a list L into two lists based on predicate P.
+The function returns a `cons' cell where the `car' contains
+elements of L for which P is true while the `cdr' contains
+the other elements.  The ordering among elements is maintained."
+  (let (car cdr)
+    (dolist (x l)
+      (if (funcall p x) (push x car) (push x cdr)))
+    (cons (nreverse car) (nreverse cdr))))
+
+
+;;; The mode
+
+;; This autoload cookie had to be changed because of XEmacs.  This is
+;; very dissatisfactory, because we now don't have the full doc string
+;; available to tell people what to expect when using this mode before
+;; loading it.
+
+;;;###autoload (autoload 'TeX-fold-mode "tex-fold" "Minor mode for hiding and revealing macros and environments." t)
+(define-minor-mode TeX-fold-mode
+  "Minor mode for hiding and revealing macros and environments.
+
+Called interactively, with no prefix argument, toggle the mode.
+With universal prefix ARG (or if ARG is nil) turn mode on.
+With zero or negative ARG turn mode off."
+  nil nil (list (cons TeX-fold-command-prefix TeX-fold-keymap))
+  (if TeX-fold-mode
+      (progn
+       (set (make-local-variable 'search-invisible) t)
+       (add-hook 'post-command-hook 'TeX-fold-post-command nil t)
+       (add-hook 'LaTeX-fill-newline-hook 'TeX-fold-update-at-point nil t)
+       (add-hook 'TeX-after-insert-macro-hook
+                 (lambda ()
+                   (when (and TeX-fold-mode TeX-fold-auto)
+                     (save-excursion
+                       (backward-char)
+                       (or (TeX-fold-item 'macro)
+                           (TeX-fold-item 'math)
+                           (TeX-fold-item 'env))))))
+       ;; Update the `TeX-fold-*-spec-list-internal' variables.
+       (dolist (elt '("macro" "env" "math"))
+         (set (intern (format "TeX-fold-%s-spec-list-internal" elt))
+              ;; Append the value of `TeX-fold-*-spec-list' to the
+              ;; mode-specific `<mode-prefix>-fold-*-spec-list' variable.
+              (append (symbol-value (intern (format "TeX-fold-%s-spec-list"
+                                                    elt)))
+                      (let ((symbol (intern (format "%s-fold-%s-spec-list"
+                                                    (TeX-mode-prefix) elt))))
+                        (when (boundp symbol)
+                          (symbol-value symbol)))))))
+    (kill-local-variable 'search-invisible)
+    (remove-hook 'post-command-hook 'TeX-fold-post-command t)
+    (remove-hook 'LaTeX-fill-newline-hook 'TeX-fold-update-at-point t)
+    (TeX-fold-clearout-buffer))
+  (TeX-set-mode-name))
+
+;;;###autoload
+(defalias 'tex-fold-mode 'TeX-fold-mode)
+
+(provide 'tex-fold)
+
+;;; tex-fold.el ends here
diff --git a/packages/auctex/tex-font.el b/packages/auctex/tex-font.el
new file mode 100644 (file)
index 0000000..8c0bf61
--- /dev/null
@@ -0,0 +1,173 @@
+;;; tex-font.el --- Font-Lock support stolen from Emacs 21.
+;;
+;; Copyright (C) 1985, 86, 89, 92, 94, 95, 96, 97, 98, 1999
+;;       Free Software Foundation, Inc.
+
+;; Maintainer: auctex-devel@gnu.org
+;; Keywords: tex, faces
+
+;; This file is part of AUC TeX.
+
+;; AUC TeX 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, or (at your option)
+;; any later version.
+
+;; AUC TeX 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 AUC TeX; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Comments:
+
+;; Please keep this file in sync with GNU Emacs 21.
+
+;;; Code:
+
+(defconst tex-font-lock-keywords-1
+  (eval-when-compile
+    (let* (;; Names of commands whose arg should be fontified as heading, etc.
+          (headings (regexp-opt
+                     '("title"  "begin" "end" "chapter" "part"
+                       "section" "subsection" "subsubsection"
+                       "paragraph" "subparagraph" "subsubparagraph"
+                       "newcommand" "renewcommand" "newenvironment"
+                       "newtheorem")
+                     t))
+          (variables (regexp-opt
+                      '("newcounter" "newcounter*" "setcounter" "addtocounter"
+                        "setlength" "addtolength" "settowidth")
+                      t))
+          (includes (regexp-opt
+                     '("input" "include" "includeonly" "bibliography"
+                       "epsfig" "psfig" "epsf" "nofiles" "usepackage"
+                       "documentstyle" "documentclass" "verbatiminput"
+                       "includegraphics" "includegraphics*")
+                     t))
+          ;; Miscellany.
+          (slash "\\\\")
+          (opt " *\\(\\[[^]]*\\] *\\)*")
+          ;; This would allow highlighting \newcommand\CMD but requires
+          ;; adapting subgroup numbers below.
+          ;; (arg "\\(?:{\\(\\(?:[^{}\\]+\\|\\\\.\\|{[^}]*}\\)+\\)\\|\\\\[a-z*]+\\)"))
+          (arg "{\\(\\(?:[^{}\\]+\\|\\\\.\\|{[^}]*}\\)+\\)"))
+      (list
+       ;; Heading args.
+       (list (concat slash headings "\\*?" opt arg)
+            ;; If ARG ends up matching too much (if the {} don't match, f.ex)
+            ;; jit-lock will do funny things: when updating the buffer
+            ;; the re-highlighting is only done locally so it will just
+            ;; match the local line, but defer-contextually will
+            ;; match more lines at a time, so ARG will end up matching
+            ;; a lot more, which might suddenly include a comment
+            ;; so you get things highlighted bold when you type them
+            ;; but they get turned back to normal a little while later
+            ;; because "there's already a face there".
+            ;; Using `keep' works around this un-intuitive behavior as well
+            ;; as improves the behavior in the very rare case where you do
+            ;; have a comment in ARG.
+            3 'font-lock-function-name-face 'keep)
+       (list (concat slash "\\(re\\)?newcommand\\** *\\(\\\\[A-Za-z@]+\\)")
+            2 'font-lock-function-name-face 'keep)
+       ;; Variable args.
+       (list (concat slash variables " *" arg) 2 'font-lock-variable-name-face)
+       ;; Include args.
+       (list (concat slash includes opt arg) 3 'font-lock-builtin-face)
+       ;; Definitions.  I think.
+       '("^[ \t]*\\\\def *\\\\\\(\\(\\w\\|@\\)+\\)"
+        1 font-lock-function-name-face))))
+  "Subdued expressions to highlight in TeX modes.")
+
+(defconst tex-font-lock-keywords-2
+  (append tex-font-lock-keywords-1
+   (eval-when-compile
+     (let* (;;
+           ;; Names of commands whose arg should be fontified with fonts.
+           (bold (regexp-opt '("textbf" "textsc" "textup"
+                               "boldsymbol" "pmb") t))
+           (italic (regexp-opt '("textit" "textsl" "emph") t))
+           (type (regexp-opt '("texttt" "textmd" "textrm" "textsf") t))
+           ;;
+           ;; Names of commands whose arg should be fontified as a citation.
+           (citations (regexp-opt
+                       '("label" "ref" "pageref" "vref" "eqref"
+                         "cite" "nocite" "index" "glossary" "bibitem"
+                         ;; These are text, rather than citations.
+                         ;; "caption" "footnote" "footnotemark" "footnotetext"
+                         )
+                       t))
+           ;;
+           ;; Names of commands that should be fontified.
+           (specials (regexp-opt
+                      '("\\" "\\*" ;; "-"
+                        "linebreak" "nolinebreak" "pagebreak" "nopagebreak"
+                        "newline" "newpage" "clearpage" "cleardoublepage"
+                        "displaybreak" "allowdisplaybreaks" "enlargethispage")
+                      t))
+           (general "\\([a-zA-Z@]+\\**\\|[^ \t\n]\\)")
+           ;;
+           ;; Miscellany.
+           (slash "\\\\")
+           (opt " *\\(\\[[^]]*\\] *\\)*")
+           (arg "{\\(\\(?:[^{}\\]+\\|\\\\.\\|{[^}]*}\\)+\\)"))
+       (list
+       ;;
+       ;; Citation args.
+       (list (concat slash citations opt arg) 3 'font-lock-constant-face)
+       ;;
+       ;; Text between `` quotes ''.
+       (cons (concat (regexp-opt `("``" "\"<" "\"`" "<<" "«") t)
+                     "[^'\">»]+"       ;a bit pessimistic
+                     (regexp-opt `("''" "\">" "\"'" ">>" "»") t))
+             'font-lock-string-face)
+       ;;
+       ;; Command names, special and general.
+       (cons (concat slash specials) 'font-lock-warning-face)
+       (concat slash general)
+       ;;
+       ;; Font environments.  It seems a bit dubious to use `bold' etc. faces
+       ;; since we might not be able to display those fonts.
+       (list (concat slash bold " *" arg) 2 '(quote bold) 'append)
+       (list (concat slash italic " *" arg) 2 '(quote italic) 'append)
+       ;; (list (concat slash type arg) 2 '(quote bold-italic) 'append)
+       ;;
+       ;; Old-style bf/em/it/sl.  Stop at `\\' and un-escaped `&', for tables.
+       (list (concat "\\\\\\(\\(bf\\)\\|em\\|it\\|sl\\)\\>"
+                     "\\(\\([^}&\\]\\|\\\\[^\\]\\)+\\)")
+             3 '(if (match-beginning 2) 'bold 'italic) 'append)))))
+   "Gaudy expressions to highlight in TeX modes.")
+
+(defvar tex-font-lock-keywords tex-font-lock-keywords-1
+  "Default expressions to highlight in TeX modes.")
+
+
+(defface tex-math-face
+  '((t :inherit font-lock-string-face))
+  "Face used to highlight TeX math expressions.")
+(defvar tex-math-face 'tex-math-face)
+
+;; Use string syntax but math face for $...$.
+(defun tex-font-lock-syntactic-face-function (state)
+  (if (nth 3 state) tex-math-face font-lock-comment-face))
+
+;;;###autoload
+(defun tex-font-setup ()
+  "Setup font lock support for TeX."
+  (set (make-local-variable 'font-lock-defaults)
+     '((tex-font-lock-keywords
+       tex-font-lock-keywords-1 tex-font-lock-keywords-2)
+       nil nil ((?$ . "\"")) nil
+       ;; Who ever uses that anyway ???
+       (font-lock-mark-block-function . mark-paragraph)
+       (font-lock-syntactic-face-function
+       . tex-font-lock-syntactic-face-function)))
+    )
+
+(provide 'tex-font)
+
+;;; tex-font.el ends here
\ No newline at end of file
diff --git a/packages/auctex/tex-fptex.el b/packages/auctex/tex-fptex.el
new file mode 100644 (file)
index 0000000..b00ed6d
--- /dev/null
@@ -0,0 +1,91 @@
+;;; tex-fptex.el --- fpTeX support for AUCTeX.
+
+;; Copyright (C) 2000, 2004, 2012 Free Software Foundation, Inc.
+
+;; Author: Fabrice Popineau <Fabrice.Popineau@supelec.fr>
+;; Maintainer: auctex-devel@gnu.org
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+;;
+;; This file contains variables customized for fpTeX.
+
+;;; Code:
+
+(defmacro parent-directory (f)
+  "Return safe parent directory of the directory given as argument."
+  `(directory-file-name
+    (file-name-directory
+     (directory-file-name ,f))))
+
+(unless (get 'TeX-lisp-directory 'saved-value)
+  (setq-default TeX-lisp-directory
+               (concat (parent-directory (invocation-directory))
+                       "/site-lisp/auctex")))
+
+  ;; Remove the Queue entry from the default, and make a non-Unix
+  ;; specific print entry, assuming that dvips will print by default.
+(unless (get 'TeX-queue-command 'saved-value)
+  (setq TeX-queue-command nil))
+
+(unless (get 'TeX-printer-list 'saved-value)
+  (setq TeX-printer-list nil))
+
+(unless (get 'TeX-print-command 'saved-value)
+  (setq TeX-print-command
+       "dvips %d"))
+
+(unless (get 'TeX-view-style 'saved-value)
+  (setq TeX-view-style '(("^a5\\(?:comb\\|paper\\)?$" "windvi %d -qpaper a5")
+                        ("^landscape$" "windvi %d -qpaper a4r -s 4")
+                        ("^epsf$" "start \"\" %f")
+                        ("." "windvi %d"))))
+
+(unless (get 'TeX-output-view-style 'saved-value)
+  (setq TeX-output-view-style
+       '(("^dvi$" "^pstricks$\\|^pst-\\|^psfrag$" "dvips %d -o && start \"\" %f")
+         ("^dvi$" ("^a5\\(?:comb\\|paper\\)$" "^landscape$")
+          "windvi %d %dS -qpaper a5r -s 0")
+         ("^dvi$" "^a5\\(?:comb\\|paper\\)$" "windvi %d %dS -qpaper a5")
+         ("^dvi$" "^b5paper$" "windvi %d %dS -qpaper b5")
+         ("^dvi$" ("^landscape$" "^pstricks$\\|^psfrag$")
+          "dvips -t landscape %d -o && start \"\" %f")
+         ("^dvi$" "^letterpaper$" "windvi %d %dS -qpaper us")
+         ("^dvi$" "^legalpaper$" "windvi %d %dS -qpaper legal")
+         ("^dvi$" "^executivepaper$" "windvi %d %dS -qpaper 7.25x10.5in")
+         ("^dvi$" "^landscape$" "windvi %d %dS -qpaper a4r")
+         ("^dvi$" "." "windvi %d %dS")
+         ("^pdf$" "." "start \"\" %o")
+         ("^html?$" "." "start \"\" %o"))))
+
+;; WinDVI does not support source specials?
+(unless (get 'TeX-source-specials-view-position-flags 'saved-value)
+  (setq TeX-source-specials-view-position-flags ""))
+
+(unless (get 'TeX-source-specials-view-editor-flags 'saved-value)
+  (setq TeX-source-specials-view-editor-flags ""))
+
+(unless (get 'TeX-kpathsea-path-delimiter 'saved-value)
+  (setq TeX-kpathsea-path-delimiter ";"))
+
+(provide 'tex-fptex)
+(require 'tex-site)
+
+;;; tex-fptex.el ends here
diff --git a/packages/auctex/tex-info.el b/packages/auctex/tex-info.el
new file mode 100644 (file)
index 0000000..6f7b849
--- /dev/null
@@ -0,0 +1,566 @@
+;;; tex-info.el --- Support for editing Texinfo source.
+
+;; Copyright (C) 1993, 1994, 1997, 2000, 2001,
+;;               2004, 2005, 2006 Free Software Foundation, Inc.
+
+;; Maintainer: auctex-devel@gnu.org
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Code:
+
+(require 'tex)
+
+(require 'texinfo)
+;; Make sure the Texinfo mode of AUCTeX is still used after loading
+;; texinfo.el.  (This is only an issue on Emacs 21.)
+(when (and (boundp 'TeX-modes)
+          (memq 'texinfo-mode TeX-modes))
+  (defalias 'texinfo-mode 'TeX-texinfo-mode))
+
+;;; Environments:
+
+(defvar Texinfo-environment-list
+  '(("cartouche") ("command") ("copying") ("defcv") ("deffn") ("defivar")
+    ("defmac") ("defmethod") ("defop") ("defopt") ("defspec")
+    ("deftp") ("deftypefn") ("deftypefun") ("deftypevar") ("deftypevr")
+    ("defun") ("defvar") ("defvr") ("description") ("detailmenu")
+    ("direntry") ("display") ("documentdescription") ("enumerate")
+    ("example") ("flushleft") ("flushright") ("format") ("ftable")
+    ("group") ("ifclear") ("ifdocbook") ("ifhtml") ("ifinfo")
+    ("ifnotdocbook") ("ifnothtml") ("ifnotinfo") ("ifnotplaintext")
+    ("ifnottex") ("ifnotxml") ("ifplaintext") ("ifset") ("iftex")
+    ("ifxml") ("ignore") ("itemize") ("lisp") ("macro") ("menu")
+    ("multitable") ("quotation") ("smalldisplay") ("smallexample")
+    ("smallformat") ("smalllisp") ("table") ("tex") ("titlepage")
+    ("verbatim") ("vtable")) 
+  "Alist of Texinfo environments.")
+
+(defconst texinfo-environment-regexp
+  ;; Overwrite version from `texinfo.el'.
+  (concat "^@\\("
+         (mapconcat 'car Texinfo-environment-list "\\|")
+         "\\|end\\)\\>")
+  "Regexp for environment-like Texinfo list commands.
+Subexpression 1 is what goes into the corresponding `@end' statement.")
+
+(defun Texinfo-environment (env &optional arg)
+  "Make Texinfo environment ENV.
+With optional ARG, modify current environment."
+  ;; XXX: This could be enhanced to act like `LaTeX-environment',
+  ;; i.e. suggest a default environment and have its own history.
+  (interactive (list (completing-read "Environment: "
+                                     Texinfo-environment-list)
+                    current-prefix-arg))
+  (if arg
+      (Texinfo-modify-environment env)
+    (Texinfo-insert-environment env)))
+
+(defun Texinfo-insert-environment (env)
+  "Insert Texinfo environment ENV."
+  (if (and (TeX-active-mark)
+          (not (eq (mark) (point))))
+      (progn
+       (when (< (mark) (point))
+         (exchange-point-and-mark))
+       (unless (TeX-looking-at-backward "^[ \t]*")
+         (newline))
+       (insert "@" env)
+       (newline)
+       (goto-char (mark))
+       (unless (TeX-looking-at-backward "^[ \t]*")
+         (newline))
+       (insert "@end " env)
+       (save-excursion (newline))
+       (end-of-line 0))
+    (insert "@" env "\n\n@end " env "\n")
+    (if (null (cdr-safe (assoc "defcv" Texinfo-environment-list)))
+       (forward-line -2))))
+
+(defun Texinfo-modify-environment (env)
+  "Change current environment to environment ENV."
+  (save-excursion
+    (Texinfo-find-env-end)
+    (re-search-backward (concat (regexp-quote TeX-esc) "end \\([a-zA-Z]*\\)")
+                       (line-beginning-position))
+    (replace-match env t t nil 1)
+    (beginning-of-line)
+    (Texinfo-find-env-start)
+    (re-search-forward (concat (regexp-quote TeX-esc) "\\([a-zA-Z]*\\)")
+                      (line-end-position))
+    (replace-match env t t nil 1)))
+
+(defun Texinfo-find-env-end ()
+  "Move point to the end of the current environment."
+  (interactive)
+  (let* ((envs (mapcar 'car Texinfo-environment-list))
+        (regexp (concat "^[ \t]*" (regexp-quote TeX-esc) "\\(end \\)*"
+                        (regexp-opt envs t) "\\b"))
+        (level 1)
+        case-fold-search)
+    (save-restriction
+      (save-excursion
+       (save-excursion
+         (beginning-of-line)
+         (when (and (looking-at regexp)
+                    (match-string 1))
+           (setq level 0)))
+       (while (and (> level 0) (re-search-forward regexp nil t))
+         (if (match-string 1)
+             (setq level (1- level))
+           (setq level (1+ level)))))
+      (if (= level 0)
+         (goto-char (match-end 0))
+       (error "Can't locate end of current environment")))))
+      
+(defun Texinfo-find-env-start ()
+  "Move point to the start of the current environment."
+  (interactive)
+  (let* ((envs (mapcar 'car Texinfo-environment-list))
+        (regexp (concat "^[ \t]*" (regexp-quote TeX-esc) "\\(end \\)*"
+                        (regexp-opt envs t) "\\b"))
+        (level 1)
+        case-fold-search)
+    (save-restriction
+      (save-excursion
+       (save-excursion
+         (beginning-of-line)
+         (when (and (looking-at regexp)
+                    (not (match-string 1)))
+           (setq level 0)))
+       (while (and (> level 0) (re-search-backward regexp nil t))
+         (if (match-string 1)
+             (setq level (1+ level))
+           (setq level (1- level)))))
+      (if (= level 0)
+         (goto-char (match-beginning 0))
+       (error "Can't locate start of current environment")))))
+
+(defun Texinfo-insert-node ()
+  "Insert a Texinfo node in the current buffer.
+That means, insert the string `@node' and prompt for current,
+next, previous and upper node.  If there is an active region, use
+this for the current node and inhibit the prompt for it.  Insert
+a comment on the following line indicating the order of arguments
+for @node."
+  (interactive)
+  (let ((active-mark (and (TeX-active-mark) (not (eq (mark) (point)))))
+       nodes node-name next-node previous-node up-node)
+    ;; Build list of nodes in current buffer.
+    ;; (What about using `imenu--index-alist'?)
+    ;; FIXME: Support multi-file documents.
+    (save-excursion
+      (goto-char (point-min))
+      (while (re-search-forward "^@node\\b" nil t)
+       (skip-chars-forward " \t")
+       (add-to-list 'nodes
+                    (list (buffer-substring-no-properties
+                           (point) (progn (skip-chars-forward "^,")
+                                          (point)))))))
+    (unless active-mark
+      (setq node-name (read-string "Node name: ")))
+    ;; FIXME: What if key binding for `minibuffer-complete' was changed?
+    ;; `substitute-command-keys' doesn't return the correct value.
+    (setq next-node (completing-read "Next node (TAB completes): " nodes))
+    (setq previous-node
+         (completing-read "Previous node (TAB completes): " nodes))
+    (setq up-node (completing-read "Upper node (TAB completes): " nodes))
+    (when (and active-mark
+              (< (mark) (point)))
+      (exchange-point-and-mark))
+    (insert "@node ")
+    (if active-mark
+       (goto-char (mark))
+      (insert node-name))
+    (insert ", " next-node ", " previous-node ", " up-node
+           "\n@comment  node-name,  next,  previous,  up\n")
+    ;; Position point at first empty field.
+    (unless (and (or (> (length node-name) 0) active-mark)
+                (> (length next-node) 0)
+                (> (length previous-node) 0)
+                (> (length  up-node) 0))
+      (forward-line -2)
+      (forward-char 6)
+      (catch 'break
+       (if (or (> (length node-name) 0) active-mark)
+           (progn (skip-chars-forward "^,") (forward-char 2))
+         (throw 'break nil))
+       (dolist (node (list next-node previous-node up-node))
+         (if (> (length node) 0)
+             (progn (skip-chars-forward "^,") (forward-char 2))
+           (throw 'break nil)))))))
+
+
+;;; Keymap:
+
+(defvar Texinfo-mode-map
+  (let ((map (make-sparse-keymap)))
+    (set-keymap-parent map TeX-mode-map)
+
+    ;; From texinfo.el
+    ;; bindings for updating nodes and menus
+    (define-key map "\C-c\C-um"      'texinfo-master-menu)
+    (define-key map "\C-c\C-u\C-m"   'texinfo-make-menu)
+    (define-key map "\C-c\C-u\C-n"   'texinfo-update-node)
+    (define-key map "\C-c\C-u\C-e"   'texinfo-every-node-update)
+    (define-key map "\C-c\C-u\C-a"   'texinfo-all-menus-update)
+
+    ;; Simulating LaTeX-mode
+    (define-key map "\C-c\C-e" 'Texinfo-environment)
+    (define-key map "\C-c\n"   'texinfo-insert-@item)
+    (or (key-binding "\e\r")
+       (define-key map "\e\r" 'texinfo-insert-@item)) ;*** Alias
+    (define-key map "\C-c\C-s" 'Texinfo-insert-node)
+    (define-key map "\C-c]" 'texinfo-insert-@end)
+    map)
+  "Keymap for Texinfo mode.")
+
+(easy-menu-define Texinfo-command-menu
+  Texinfo-mode-map
+  "Menu used in Texinfo mode for external commands."
+  (TeX-mode-specific-command-menu 'texinfo-mode))
+
+(easy-menu-define Texinfo-mode-menu
+  Texinfo-mode-map
+  "Menu used in Texinfo mode."
+  (TeX-menu-with-help
+   `("Texinfo"
+     ["Node ..." texinfo-insert-@node
+      :help "Insert a node"]
+     ["Macro ..." TeX-insert-macro
+      :help "Insert a macro and possibly arguments"]
+     ["Complete Macro" TeX-complete-symbol
+      :help "Complete the current macro"]
+     ["Environment ..." Texinfo-insert-environment
+      :help "Insert an environment"]
+     ["Item" texinfo-insert-@item
+      :help "Insert an @item"]
+     "-"
+     ("Insert Font"
+      ["Emphasize"  (TeX-font nil ?\C-e) :keys "C-c C-f C-e"]
+      ["Bold"       (TeX-font nil ?\C-b) :keys "C-c C-f C-b"]
+      ["Typewriter" (TeX-font nil ?\C-t) :keys "C-c C-f C-t"]
+      ["Small Caps" (TeX-font nil ?\C-c) :keys "C-c C-f C-c"]
+      ["Italic"     (TeX-font nil ?\C-i) :keys "C-c C-f C-i"]
+      ["Sample"    (TeX-font nil ?\C-s) :keys "C-c C-f C-s"]
+      ["Roman"      (TeX-font nil ?\C-r) :keys "C-c C-f C-r"])
+     ("Replace Font"
+      ["Emphasize"  (TeX-font t ?\C-e) :keys "C-u C-c C-f C-e"]
+      ["Bold"       (TeX-font t ?\C-b) :keys "C-u C-c C-f C-b"]
+      ["Typewriter" (TeX-font t ?\C-t) :keys "C-u C-c C-f C-t"]
+      ["Small Caps" (TeX-font t ?\C-c) :keys "C-u C-c C-f C-c"]
+      ["Italic"     (TeX-font t ?\C-i) :keys "C-u C-c C-f C-i"]
+      ["Sample"    (TeX-font t ?\C-s) :keys "C-u C-c C-f C-s"]
+      ["Roman"      (TeX-font t ?\C-r) :keys "C-u C-c C-f C-r"])
+     ["Delete Font" (TeX-font t ?\C-d) :keys "C-c C-f C-d"]
+     "-"
+     ["Create Master Menu" texinfo-master-menu
+      :help "Make a master menu for the whole Texinfo file"]
+     ["Create Menu" texinfo-make-menu
+      :help "Make or update the menu for the current section"]
+     ["Update Node" texinfo-update-node
+      :help "Update the current node"]
+     ["Update Every Node" texinfo-every-node-update
+      :help "Update every node in the current file"]
+     ["Update All Menus" texinfo-all-menus-update
+      :help "Update every menu in the current file"]
+     "-"
+     ("Commenting"
+      ["Comment or Uncomment Region"
+       TeX-comment-or-uncomment-region
+       :help "Comment or uncomment the currently selected region"]
+      ["Comment or Uncomment Paragraph"
+       TeX-comment-or-uncomment-paragraph
+       :help "Comment or uncomment the current paragraph"])
+     ,TeX-fold-menu
+     "-"
+     . ,TeX-common-menu-entries)))
+
+(defvar Texinfo-font-list
+  '((?\C-b "@b{" "}")
+    (?\C-c "@sc{" "}")
+    (?\C-e "@emph{" "}")
+    (?\C-i "@i{" "}")
+    (?\C-r "@r{" "}")
+    (?\C-s "@samp{" "}")
+    (?\C-t "@t{" "}")
+    (?s    "@strong{" "}")
+    (?\C-f "@file{" "}")
+    (?d "@dfn{" "}")
+    (?\C-v "@var{" "}")
+    (?k    "@key{" "}")
+    (?\C-k "@kbd{" "}")
+    (?c    "@code{" "}")
+    (?C    "@cite{" "}")
+    (?\C-d "" "" t))
+  "Font commands used in Texinfo mode.  See `TeX-font-list'.")
+  
+;;; Mode:
+
+;;;###autoload
+(defalias 'Texinfo-mode 'texinfo-mode)
+
+;;;###autoload
+(defun TeX-texinfo-mode ()
+  "Major mode in AUCTeX for editing Texinfo files.
+
+Special commands:
+\\{Texinfo-mode-map}
+
+Entering Texinfo mode calls the value of `text-mode-hook'  and then the
+value of `Texinfo-mode-hook'."
+  (interactive)
+  (kill-all-local-variables)
+  (setq TeX-mode-p t)
+  ;; Mostly stolen from texinfo.el
+  (setq TeX-base-mode-name "Texinfo")
+  (setq major-mode 'texinfo-mode)
+  (use-local-map Texinfo-mode-map)
+  (set-syntax-table texinfo-mode-syntax-table)
+  (make-local-variable 'page-delimiter)
+  (setq page-delimiter 
+       (concat 
+        "^@node [ \t]*[Tt]op\\|^@\\(" 
+        texinfo-chapter-level-regexp 
+        "\\)"))
+  (make-local-variable 'require-final-newline)
+  (setq require-final-newline t)
+  (make-local-variable 'indent-tabs-mode)
+  (setq indent-tabs-mode nil)
+  (make-local-variable 'paragraph-separate)
+  (setq paragraph-separate
+       (concat "\b\\|^@[a-zA-Z]*[ \n]\\|" paragraph-separate))
+  (make-local-variable 'paragraph-start)
+  (setq paragraph-start
+       (concat "\b\\|^@[a-zA-Z]*[ \n]\\|" paragraph-start))
+  (make-local-variable 'fill-column)
+  (setq fill-column 72)
+  (make-local-variable 'comment-start)
+  (setq comment-start "@c ")
+  (make-local-variable 'comment-start-skip)
+  (setq comment-start-skip "@c +\\|@comment +")
+  (set (make-local-variable 'comment-use-syntax) nil)
+  (make-local-variable 'words-include-escapes)
+  (setq words-include-escapes t)
+  (if (not (boundp 'texinfo-imenu-generic-expression))
+      ;; This was introduced in 19.30.
+      ()
+    (make-local-variable 'imenu-generic-expression)
+    (setq imenu-generic-expression texinfo-imenu-generic-expression))
+  (make-local-variable 'font-lock-defaults)
+  (setq font-lock-defaults
+       ;; COMPATIBILITY for Emacs 20
+       (if (boundp 'texinfo-font-lock-syntactic-keywords)
+           '(texinfo-font-lock-keywords
+             nil nil nil backward-paragraph
+             (font-lock-syntactic-keywords
+              . texinfo-font-lock-syntactic-keywords))
+         '(texinfo-font-lock-keywords t)))
+  (if (not (boundp 'texinfo-section-list))
+      ;; This was included in 19.31.
+      ()
+    (make-local-variable 'outline-regexp)
+    (setq outline-regexp 
+         (concat "@\\("
+                 (mapconcat 'car texinfo-section-list "\\>\\|")
+                 "\\>\\)"))
+    (make-local-variable 'outline-level)
+    (setq outline-level 'texinfo-outline-level))
+  
+  ;; Mostly AUCTeX stuff
+  (easy-menu-add Texinfo-mode-menu Texinfo-mode-map)
+  (easy-menu-add Texinfo-command-menu Texinfo-mode-map)
+  (make-local-variable 'TeX-command-current)
+  (setq TeX-command-current 'TeX-command-master)
+
+  (setq TeX-default-extension "texi")
+  (make-local-variable 'TeX-esc)
+  (setq TeX-esc "@")
+
+  (make-local-variable 'TeX-auto-regexp-list)
+  (setq TeX-auto-regexp-list 'TeX-auto-empty-regexp-list)
+  (make-local-variable 'TeX-auto-update)
+  (setq TeX-auto-update t)
+
+  (setq TeX-command-default "TeX")
+  (setq TeX-header-end "%*end")
+  (setq TeX-trailer-start (regexp-quote (concat TeX-esc "bye")))
+  
+  (make-local-variable 'TeX-complete-list)
+  (setq TeX-complete-list
+       (list (list "@\\([a-zA-Z]*\\)" 1 'TeX-symbol-list nil)
+             (list "" TeX-complete-word)))
+
+  (make-local-variable 'TeX-font-list)
+  (setq TeX-font-list Texinfo-font-list)
+  (make-local-variable 'TeX-font-replace-function)
+  (setq TeX-font-replace-function 'TeX-font-replace-macro)
+  
+  (add-hook 'find-file-hooks (lambda ()
+                              (unless (file-exists-p (buffer-file-name))
+                                (TeX-master-file nil nil t))) nil t)
+
+  (TeX-add-symbols
+   '("appendix" (TeX-arg-literal " ") (TeX-arg-free "Title"))
+   '("appendixsec" (TeX-arg-literal " ") (TeX-arg-free "Title"))
+   '("appendixsection" (TeX-arg-literal " ") (TeX-arg-free "Title"))
+   '("appendixsubsec" (TeX-arg-literal " ") (TeX-arg-free "Title"))
+   '("appendixsubsubsec" (TeX-arg-literal " ") (TeX-arg-free "Title"))
+   '("asis")
+   '("author" (TeX-arg-literal " ") (TeX-arg-free "Author"))
+   '("b" "Text")
+   '("bullet")
+   '("bye")
+   '("c" (TeX-arg-literal " ") (TeX-arg-free "Comment"))
+   '("center" (TeX-arg-literal " ") (TeX-arg-free "Line of text"))
+   '("chapheading" (TeX-arg-literal " ") (TeX-arg-free "Title"))
+   '("chapter" (TeX-arg-literal " ") (TeX-arg-free "Title"))
+   '("cindex" (TeX-arg-literal " ") (TeX-arg-free "Entry"))
+   '("cite" "Reference")
+   '("clear" (TeX-arg-literal " ") (TeX-arg-free "Flag"))
+   '("code" "Sample code")
+   '("command" "Command")
+   '("comment" (TeX-arg-literal " ") (TeX-arg-free "Comment"))
+   '("contents")
+   '("copyright" nil)
+   '("defcodeindex" (TeX-arg-literal " ") (TeX-arg-free "Index name"))
+   '("defindex" (TeX-arg-literal " ") (TeX-arg-free "Index name"))
+   '("dfn" "Term")
+   '("dmn" "Dimension")
+   '("dots" nil)
+   '("emph" "Text")
+   '("email" "Email address")
+   '("equiv" nil)
+   '("error")
+   '("evenfooting" Texinfo-lrc-argument-hook)
+   '("evenheading" Texinfo-lrc-argument-hook)
+   '("everyfooting" Texinfo-lrc-argument-hook)
+   '("everyheading" Texinfo-lrc-argument-hook)
+   '("exdent" (TeX-arg-literal " ") (TeX-arg-free "Line of text"))
+   '("expansion" nil)
+   '("file" "Filename")
+   '("finalout")
+   '("findex" (TeX-arg-literal " ") (TeX-arg-free "Entry"))
+   '("footnote" "Text of footnote")
+   '("footnotestyle" (TeX-arg-literal " ") (TeX-arg-free "Style"))
+   '("group")
+   '("heading" (TeX-arg-literal " ") (TeX-arg-free "Title"))
+   ;; XXX: Would be nice with completion.
+   '("headings" (TeX-arg-literal " ") (TeX-arg-free "On off single double"))
+   '("i" "Text")
+   '("ignore")
+   '("include" (TeX-arg-literal " ") (TeX-arg-free "Filename"))
+   '("inforef" "Node name" "Info file name")
+   '("item")
+   '("itemx")
+   '("kbd" "Keyboard characters")
+   '("key" "Key name")
+   '("kindex" (TeX-arg-literal " ") (TeX-arg-free "Entry"))
+   '("lowersections" 0)
+   '("majorheading" (TeX-arg-literal " ") (TeX-arg-free "Title"))
+   '("menu")
+   '("minus")
+   '("need" "N")
+   '("node" (TeX-arg-literal " ") (TeX-arg-free "Name")
+     (TeX-arg-literal ", ") (TeX-arg-free "Next")
+     (TeX-arg-literal ", ") (TeX-arg-free "Previous")
+     (TeX-arg-literal ", ") (TeX-arg-free "Up"))
+   '("noindent")
+   '("oddfooting" Texinfo-lrc-argument-hook)
+   '("oddheading" Texinfo-lrc-argument-hook)
+   '("page")
+   '("paragraphindent" (TeX-arg-literal " ") (TeX-arg-free "Indent"))
+   '("pindex" "Entry")
+   '("point" nil)
+   '("print")
+   '("printindex" (TeX-arg-literal " ") (TeX-arg-free "Index name"))
+   '("pxref" "Node name")
+   '("r" "Text")
+   '("raisesections" 0)
+   '("ref" "Node name")
+   '("refill")
+   '("result")
+   '("samp" "Text")
+   '("sc" "Text")
+   '("section" (TeX-arg-literal " ") (TeX-arg-free "Title"))
+   '("set" (TeX-arg-literal " ") (TeX-arg-free "Flag"))
+   ;; XXX: Would be nice with completion.
+   '("setchapternewpage" (TeX-arg-literal " ") (TeX-arg-free "On off odd"))
+   '("setfilename" (TeX-arg-literal " ") (TeX-arg-free "Info file name"))
+   '("settitle" (TeX-arg-literal " ") (TeX-arg-free "Title"))
+   '("shortcontents")
+   '("smallbook")
+   '("sp" "N")
+   '("strong" "Text")
+   '("subheading" (TeX-arg-literal " ") (TeX-arg-free "Title"))
+   '("subsection" (TeX-arg-literal " ") (TeX-arg-free "Title"))
+   '("subsubheading" (TeX-arg-literal " ") (TeX-arg-free "Title"))
+   '("subsubsection" (TeX-arg-literal " ") (TeX-arg-free "Title"))
+   '("subtitle" (TeX-arg-literal " ") (TeX-arg-free "Title"))
+   '("summarycontents")
+   '("syncodeindex" (TeX-arg-literal " ") (TeX-arg-free "From index")
+     (TeX-arg-literal " ") (TeX-arg-free "Into index"))
+   '("synindex" (TeX-arg-literal " ") (TeX-arg-free "From index")
+     (TeX-arg-literal " ") (TeX-arg-free "Into index"))
+   '("t" "Text")
+   '("TeX" nil)
+   '("thischapter")
+   '("thischaptername")
+   '("thisfile")
+   '("thispage")
+   '("tindex" (TeX-arg-literal " ") (TeX-arg-free "Entry"))
+   '("title" (TeX-arg-literal " ") (TeX-arg-free "Title"))
+   '("titlefont" "Text")
+   '("titlepage")
+   '("today" nil)
+   '("top" (TeX-arg-literal " ") (TeX-arg-free "Title"))
+   '("unnumbered" (TeX-arg-literal " ") (TeX-arg-free "Title"))
+   '("unnumberedsec" (TeX-arg-literal " ") (TeX-arg-free "Title"))
+   '("unnumberedsubsec" (TeX-arg-literal " ") (TeX-arg-free "Title"))
+   '("unnumberedsubsubsec" (TeX-arg-literal " ") (TeX-arg-free "Title"))
+   '("value" "Flag")
+   '("var" "Metasyntactic variable")
+   '("vindex" (TeX-arg-literal " ") (TeX-arg-free "Entry"))
+   '("vskip" (TeX-arg-literal " ") (TeX-arg-free "Amount"))
+   '("w" "Text")
+   '("xref" "Node name"))
+  
+  (TeX-run-mode-hooks 'text-mode-hook 'Texinfo-mode-hook)
+  (TeX-set-mode-name))
+
+(defcustom Texinfo-clean-intermediate-suffixes nil
+  "List of regexps matching suffixes of files to be deleted.
+The regexps will be anchored at the end of the file name to be matched,
+i.e. you do _not_ have to cater for this yourself by adding \\\\' or $."
+  :type '(repeat regexp)
+  :group 'TeX-command)
+
+(defcustom Texinfo-clean-output-suffixes
+  ;; See `man texi2html' for the HTML stuff.
+  '("\\.info\\(-[0-9]+\\)?" "\\.dvi" "\\.pdf" "\\.ps" "\\.html"
+    "_toc\\.html" "_fot\\.html" "_abt\\.html" "_[0-9]+\\.html" "_l2h_img.+")
+  "List of regexps matching suffixes of files to be deleted.
+The regexps will be anchored at the end of the file name to be matched,
+i.e. you do _not_ have to cater for this yourself by adding \\\\' or $."
+  :type '(repeat regexp)
+  :group 'TeX-command)
+  
+(provide 'tex-info)
+  
+;;; tex-info.el ends here
diff --git a/packages/auctex/tex-jp.el b/packages/auctex/tex-jp.el
new file mode 100644 (file)
index 0000000..4e3f90c
--- /dev/null
@@ -0,0 +1,624 @@
+;;; tex-jp.el --- Support for Japanese TeX.  -*- coding: iso-2022-jp-unix; -*-
+
+;; Copyright (C) 1999, 2001-2007, 2012  Free Software Foundation, Inc.
+
+;; Author:     KOBAYASHI Shinji <koba@flab.fujitsu.co.jp>,
+;;             Hidenobu Nabetani <nabe@debian.or.jp>
+;; Maintainer: Masayuki Ataka <masayuki.ataka@gmail.com>
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file was written by KOBAYASHI Shinji <koba@flab.fujitsu.co.jp>
+;; based on many patches developed by Japanese NetNews community.
+;; Japanese message translation by MATUI Takao <mat@nuis.ac.jp>.
+
+;;; Code:
+
+(require 'latex)
+
+;;; Customization
+
+(defgroup AUCTeX-jp nil
+  "Japanese support in AUCTeX."
+  :group 'AUCTeX)
+
+(defcustom japanese-TeX-command-list
+  ;; Changed to double quotes for Windows afflicted people.  I don't
+  ;; use the %(latex) and %(tex) shorthands here because I have not
+  ;; clue whether Omega-related versions exist.  --dak
+  '(("jTeX" "%(PDF)jtex %`%S%(PDFout)%(mode)%' %t"
+     TeX-run-TeX nil (plain-tex-mode) :help "Run NTT jTeX")
+    ("jLaTeX" "%(PDF)jlatex %`%S%(PDFout)%(mode)%' %t"
+     TeX-run-TeX nil (latex-mode) :help "Run NTT jLaTeX")
+    ("pTeX" "%(PDF)ptex %`%S%(PDFout)%(mode)%' %t"
+     TeX-run-TeX nil (plain-tex-mode) :help "Run ASCII pTeX")
+    ("pLaTeX" "%(PDF)platex %`%S%(PDFout)%(mode)%' %t"
+     TeX-run-TeX nil (latex-mode) :help "Run ASCII pLaTeX")
+    ("Mendex" "mendex %s" TeX-run-command nil t :help "Create index file with mendex")
+    ("jBibTeX" "jbibtex %s" TeX-run-BibTeX nil t :help "Run jBibTeX"))
+  "Additional list of commands, especially for Japanese.
+For detail, see `TeX-command-list', which this list is appended to."
+  :group 'AUCTeX-jp
+  :type '(repeat (group :value ("" "" TeX-run-command nil t)
+                       (string :tag "Name")
+                       (string :tag "Command")
+                       (choice :tag "How"
+                               :value TeX-run-command
+                               (function-item TeX-run-command)
+                               (function-item TeX-run-format)
+                               (function-item TeX-run-TeX)
+                               (function-item TeX-run-interactive)
+                               (function-item TeX-run-BibTeX)
+                               (function-item TeX-run-compile)
+                               (function-item TeX-run-shell)
+                               (function-item TeX-run-discard)
+                               (function-item TeX-run-background)
+                               (function-item TeX-run-silent)
+                               (function-item TeX-run-discard-foreground)
+                               (function-item TeX-run-function)
+                               (function :tag "Other"))
+                       (boolean :tag "Prompt")
+                       (choice :tag "Modes"
+                               (const :tag "All" t)
+                               (set (const :tag "Plain TeX" plain-tex-mode)
+                                    (const :tag "LaTeX" latex-mode)
+                                    (const :tag "DocTeX" doctex-mode)
+                                    (const :tag "ConTeXt" context-mode)
+                                    (const :tag "Texinfo" texinfo-mode)
+                                    (const :tag "AmSTeX" ams-tex-mode)))
+                       (repeat :tag "Menu elements" :inline t sexp))))
+
+(setq TeX-command-list
+      (append japanese-TeX-command-list
+             '(("-" "" ignore nil t)) ;; separator for command menu
+             TeX-command-list))
+
+(mapc (lambda (dir) (add-to-list 'TeX-macro-global dir t))
+      (or (TeX-tree-expand
+          '("$SYSTEXMF" "$TEXMFLOCAL" "$TEXMFMAIN" "$TEXMFDIST")
+          "platex" '("/ptex/" "/jbibtex/bst/"))
+         '("/usr/share/texmf/ptex/" "/usr/share/texmf/jbibtex/bst/")))
+
+(mapc (lambda (dir) (add-to-list 'TeX-macro-global dir t))
+      (or (TeX-tree-expand
+          '("$SYSTEXMF" "$TEXMFLOCAL" "$TEXMFMAIN" "$TEXMFDIST")
+          "jlatex" '("/jtex/" "/jbibtex/bst/"))
+         '("/usr/share/texmf/jtex/" "/usr/share/texmf/jbibtex/bst/")))
+
+;; Menus
+
+(setq LaTeX-command-style
+      (append '(("^j-\\(article\\|report\\|book\\)$"
+                "%(PDF)jlatex %S%(PDFout)")
+               ("^[jt]s?\\(article\\|report\\|book\\)$"
+                "%(PDF)platex %S%(PDFout)"))
+             LaTeX-command-style))
+
+(defcustom japanese-TeX-error-messages t
+  "*If non-nil, explain TeX error messages in Japanese."
+  :group 'AUCTeX-jp
+  :type 'boolean)
+
+(when (featurep 'mule)
+
+;; FIX-ME (2007-02-09) The default coding system in recent Unix (like Fedora and
+;; Ubuntu) is utf-8.  But Japanese TeX system is not support utf-8 yet
+;; (platex-utf is under development, may be alpha phase).  So,
+;; process-coding-system for Japanese TeX is not defined from
+;; default-coding-system.  When platex-utf is out, we should look this setting,
+;; again.
+
+(defcustom TeX-japanese-process-input-coding-system
+  (cond ((memq system-type '(windows-nt ms-dos cygwin)) 'shift_jis-dos)
+       ((memq system-type '(mac darwin)) 'shift_jis-mac)
+       (t 'euc-jp-unix))
+  "TeX-process' coding system with standard input."
+  :group 'AUCTeX-jp
+  :type 'coding-system)
+
+(defcustom TeX-japanese-process-output-coding-system
+  (cond ((memq system-type '(windows-nt ms-dos cygwin)) 'shift_jis-dos)
+       ((memq system-type '(mac darwin)) 'shift_jis-mac)
+       (t 'euc-jp-unix))
+  "TeX-process' coding system with standard output."
+  :group 'AUCTeX-jp
+  :type 'coding-system)
+
+)
+
+(defcustom japanese-TeX-command-default "pTeX"
+  "*The default command for `TeX-command' in the japanese-TeX mode."
+  :group 'AUCTeX-jp
+  :type 'string)
+  (make-variable-buffer-local 'japanese-TeX-command-default)
+
+(defcustom japanese-LaTeX-command-default "LaTeX"
+  "*The default command for `TeX-command' in the japanese-LaTeX mode."
+  :group 'AUCTeX-jp
+  :type 'string)
+  (make-variable-buffer-local 'japanese-LaTeX-command-default)
+
+(defcustom japanese-LaTeX-default-style "jarticle"
+  "*Default when creating new Japanese documents."
+  :group 'AUCTeX-jp
+  :type 'string)
+
+(defcustom japanese-LaTeX-style-list
+  '(("j-article")
+    ("j-report")
+    ("j-book")
+    ("jslides")
+    ("jarticle")
+    ("jreport")
+    ("jbook")
+    ("tarticle")
+    ("treport")
+    ("tbook")
+    ("jsarticle")
+    ("jsbook"))
+  "*List of Japanese document styles."
+  :group 'AUCTeX-jp
+  :type '(repeat (group (string :format "%v"))))
+
+(setq LaTeX-style-list
+      (append japanese-LaTeX-style-list LaTeX-style-list))
+
+;;; Coding system
+
+(when (featurep 'mule)
+
+(defun japanese-TeX-set-process-coding-system (process)
+  "Set proper coding system for japanese TeX PROCESS."
+  (if (with-current-buffer TeX-command-buffer japanese-TeX-mode)
+      (set-process-coding-system process
+                                TeX-japanese-process-output-coding-system
+                                TeX-japanese-process-input-coding-system)))
+(setq TeX-after-start-process-function
+      'japanese-TeX-set-process-coding-system)
+)
+
+;;; Japanese TeX modes
+
+(defvar japanese-TeX-mode nil
+  "Non-nil means the current buffer handles Japanese TeX/LaTeX.")
+(make-variable-buffer-local 'japanese-TeX-mode)
+(put 'japanese-TeX-mode 'permanent-local t)
+
+;;;###autoload
+(defun japanese-plain-tex-mode ()
+  "Major mode in AUCTeX for editing Japanese plain TeX files.
+Set `japanese-TeX-mode' to t, and enter `TeX-plain-tex-mode'."
+  (interactive)
+  (setq japanese-TeX-mode t)
+  (TeX-plain-tex-mode))
+
+(defun japanese-plain-tex-mode-initialization ()
+  "Japanese plain-TeX specific initializations."
+  (when japanese-TeX-mode
+    (setq TeX-command-default japanese-TeX-command-default)))
+
+(add-hook 'plain-TeX-mode-hook 'japanese-plain-tex-mode-initialization)
+
+;;;###autoload
+(defun japanese-latex-mode ()
+  "Major mode in AUCTeX for editing Japanese LaTeX files.
+Set `japanese-TeX-mode' to t, and enter `TeX-latex-mode'."
+  (interactive)
+  (setq japanese-TeX-mode t)
+  (TeX-latex-mode))
+
+(defun japanese-latex-mode-initialization ()
+  "Japanese LaTeX specific initializations."
+  (when japanese-TeX-mode
+    (setq TeX-command-default japanese-LaTeX-command-default)
+    (setq LaTeX-default-style japanese-LaTeX-default-style)
+    (setq TeX-command-BibTeX "jBibTeX")))
+
+(add-hook 'LaTeX-mode-hook 'japanese-latex-mode-initialization)
+
+
+;;; Support for various self-insert-command
+
+(fset 'japanese-TeX-self-insert-command
+      (cond ((fboundp 'can-n-egg-self-insert-command)
+            'can-n-egg-self-insert-command)
+           ((fboundp 'egg-self-insert-command)
+            'egg-self-insert-command)
+           ((fboundp 'canna-self-insert-command)
+            'canna-self-insert-command)
+           (t
+            'self-insert-command)))
+
+(defun TeX-insert-punctuation ()
+  "Insert point or comma, cleaning up preceding space."
+  (interactive)
+  (expand-abbrev)
+  (if (TeX-looking-at-backward "\\\\/\\(}+\\)" 50)
+      (replace-match "\\1" t))
+  (call-interactively 'japanese-TeX-self-insert-command))
+
+;;; Error Messages
+
+(if japanese-TeX-error-messages
+(setq TeX-error-description-list
+  '(("Bad \\\\line or \\\\vector argument.*" .
+"\e$B@~$N79$-$r;XDj$9$k!$\e(B\\line\e$B$^$?$O\e(B\\vector\e$B$N:G=i$N0z?t$,IT@5$G$9!%\e(B")
+
+    ("Bad math environment delimiter.*" .
+"\e$B?t<0%b!<%ICf$G?t<0%b!<%I3+;O%3%^%s%I\e(B\\[\e$B$^$?$O\e(B\\(\e$B!$$^$?$O!$?t<0%b!<%I30$G\e(B
+\e$B?t<0%b!<%I=*N;%3%^%s%I\e(B\\]\e$B$^$?$O\e(B\\)\e$B$r\e(BTeX\e$B$,8+$D$1$^$7$?!%$3$NLdBj$O!$?t<0%b!<\e(B
+\e$B%I$N%G%j%_%?$,%^%C%A$7$F$$$J$+$C$?$j!$3g8L$N%P%i%s%9$,$H$l$F$$$J$+$C$?$j$9\e(B
+\e$B$k$?$a$K@8$8$^$9!%\e(B")
+
+    ("Bad use of \\\\\\\\.*" .
+"\\\\\e$B%3%^%s%I$,%Q%i%0%i%UCf$K$"$j$^$7$?!%$3$N;H$$$+$?$OL50UL#$G$9!%\e(B
+\e$B$3$N%(%i!<%a%C%;!<%8$O\e(B\\\\\e$B$,\e(Bcentering\e$B4D6-$d\e(Bflushing\e$B4D6-$G;H$o$l$?\e(B
+\e$B;~!$$"$k$$$O\e(Bcentering/flushing\e$B@k8@$,M-8z$J$H$3$m$G;H$o$l$?;~$K@8$8$^$9!%\e(B")
+
+    ("\\\\begin{[^ ]*} ended by \\\\end{[^ ]*}." .
+"\e$BBP1~$9$k\e(B\\begin\e$BL?Na$N$J$$\e(B\\end\e$BL?Na$r\e(BLaTeX\e$B$,8+$D$1$^$7$?!%\e(B\\end\e$BL?Na$N4D\e(B
+\e$B6-L>$r4V0c$($?$+!$M>J,$J\e(B\\begin\e$BL?Na$,$"$k$+!$\e(B\\end\e$BL?Na$r$o$9$l$?$+$N$$$:\e(B
+\e$B$l$+$G$7$g$&!%\e(B")
+
+    ("Can be used only in preamble." .
+"\e$B%W%j%"%s%V%k$G$7$+;H$($J$$\e(B\\documentclass\e$B!&\e(B\\nofiles\e$B!&\e(B\\includeonly
+\\makeindex\e$B!&\e(B\\makeglossary\e$B$N$&$A$N$$$:$l$+$,\e(B\\begin{document}\e$B$h$j$b\e(B
+\e$B8e$G;H$o$l$F$$$k$N$r\e(BLaTeX\e$B$,8!=P$7$^$7$?!%$3$N%(%i!<$O\e(B\\begin{document}
+\e$B$,M>J,$K$"$C$?;~$K$b@8$8$^$9!%\e(B")
+
+    ("Command name [^ ]* already used.*" .
+"\e$B$9$G$KDj5A$5$l$F$$$kL?NaL>$^$?$O4D6-L>$KBP$7$F\e(B\\newcommand\e$B!&\e(B
+\\newenvironment\e$B!&\e(B\\newlength\e$B!&\e(B\\newsavebox\e$B!&\e(B\\newtheorem\e$B$N$&$A$N$$$:\e(B
+\e$B$l$+$r<B9T$7$h$&$H$7$F$$$^$9\e(B(\e$B$"$k4D6-$rDj5A$9$k$HF1$8L>A0$NL?Na$,<+F0\e(B
+\e$BE*$KDj5A$5$l$k$N$G!$4{$KB8:_$9$k4D6-$HF1L>$NL?Na$ODj5A$G$-$^$;$s\e(B)\e$B!%?7\e(B
+\e$B$7$$L>A0$r9M$($k$+!$\e(B\\newcommand\e$B$+\e(B\\newenvironment\e$B$N>l9g$J$iBP1~$9$k\e(B
+\\renew...\e$BL?Na$r;H$o$J$1$l$P$J$j$^$;$s!%\e(B")
+
+    ("Counter too large." .
+"1. \e$BJ8;z$G=g=xIU$1$5$l$?$b$N!$$?$V$sHV9fIU$1$5$l$?%j%9%H4D6-$N%i%Y%k$,!$\e(B
+26\e$B$h$j$bBg$-$$HV9f$r<u$1<h$j$^$7$?!%Hs>o$KD9$$%j%9%H$r;H$C$F$$$k$+!$\e(B
+\e$B%+%&%s%?$r:F@_Dj$7$F$7$^$C$?$+$N$$$:$l$+$G$7$g$&!%\e(B
+
+2. \e$B5SCm$,J8;z$^$?$O5SCm5-9f$G=g=x$E$1$5$l$F$$$^$9$,!$J8;z$^$?$O5-9f$r\e(B
+\e$B;H$$@Z$C$F$7$^$$$^$7$?!%$*$=$i$/\e(B\\thanks\e$BL?Na$N;H$$$9$.$G$9!%\e(B")
+
+
+    ("Environment [^ ]* undefined." .
+"\e$BDj5A$5$l$F$$$J$$4D6-$KBP$9$k\e(B\\begin\e$BL?Na$r\e(BLaTeX\e$B$,8+$D$1$^$7$?!%$*$=$i$/\e(B
+\e$B4D6-L>$r4V0c$($?$N$G$7$g$&!%\e(B")
+
+    ("Float(s) lost." .
+"parbox\e$B$N$J$+$K\e(Bfigure\e$B4D6-!&\e(Btable\e$B4D6-$^$?$O\e(B\\marginpar\e$BL?Na$,$"$j$^$7$?\e(B
+\(\e$B$J$*!$\e(Bparbox\e$B$O\e(Bminipage\e$B4D6-$+\e(B\\parbox\e$BL?Na$K$h$C$F:n$i$l$k$+!$5SCm$d?^\e(B
+\e$B$J$I$KBP$7$F\e(BLaTeX\e$B$,@8@.$9$k$b$N$G$9\e(B\)\e$B!%$3$l$O=PNO;~$N%(%i!<$J$N$G!$860x\e(B
+\e$B$H$J$C$F$$$k4D6-$"$k$$$OL?Na$O!$\e(BLaTeX\e$B$,LdBj$rH/8+$7$?>l=j$h$j$b$@$$$V\e(B
+\e$B$sA0$K$"$k2DG=@-$,$"$j$^$9!%=PNO$5$l$F$$$J$$?^!&I=!&K5Cm$J$I$,$$$/$D$+\e(B
+\e$B$"$k$+$b$7$l$^$;$s$,!$$=$l$i$,860x$G$"$k$H$O8B$j$^$;$s!%\e(B")
+
+    ("Illegal character in array arg." .
+"array\e$B4D6-$^$?$O\e(Btabular\e$B4D6-$N0z?t!$$^$?$O\e(B\\multicolumn\e$BL?Na$NBh\e(B2\e$B0z?t\e(B
+\e$B$NCf$KIT@5$JJ8;z$,$"$j$^$7$?!%\e(B")
+
+    ("Missing \\\\begin{document}." .
+"\\begin{document}\e$BL?Na$h$jA0$K\e(BLaTeX\e$B$,=PNO$r9T$J$C$F$7$^$$$^$7$?!%\e(B
+\\begin{document}\e$BL?Na$rK:$l$?$+!$%W%j%"%s%V%k$K2?$+4V0c$$$,$"$k$N$G$7$g$&!%\e(B
+\e$BBG$A4V0c$$$K$h$kJ8;z$d!$@k8@$N8m$j$K$h$k2DG=@-$b$"$j$^$9!%Nc$($P!$0z?t$r\e(B
+\e$B0O$`3g8L$rH4$+$7$?$H$+!$L?NaL>$N\e(B\\\e$B$rK:$l$?>l9g$J$I$G$9!%\e(B")
+
+    ("Missing p-arg in array arg.*" .
+"array\e$B4D6-!&\e(Btabular\e$B4D6-$N0z?t!$$"$k$$$O\e(B\\multicolumn\e$BL?Na$NBh\e(B2\e$B0z?t$NCf$K!$\e(B
+\e$B3g8L$K0O$^$l$?I=8=$N$D$$$F$$$J$$\e(Bp\e$B$,$"$j$^$7$?!%\e(B")
+
+    ("Missing @-exp in array arg." .
+"array\e$B4D6-!&\e(Btabular\e$B4D6-$N0z?t!$$"$k$$$O\e(B\\multicolumn\e$BL?Na$NBh\e(B2\e$B0z?t$NCf$K!$\e(B
+@\e$BI=8=$N$D$$$F$$$J$$\e(B@\e$B$,$"$j$^$7$?!%\e(B")
+
+    ("No such counter." .
+"\\setcounter\e$BL?Na$^$?$O\e(B\\addtocounter\e$BL?Na$G!$B8:_$7$J$$%+%&%s%?$,;XDj$5$l\e(B
+\e$B$^$7$?!%$*$=$i$/$?$@$N%?%$%W%_%9$G$7$g$&!%$?$@$7!$%(%i!<$,\e(Baux\e$B%U%!%$%k$NCf\e(B
+\e$B$G@8$8$?>l9g$O!$\e(B\\newcounter\e$BL?Na$r%W%j%"%s%V%k$N30$G;H$C$?$N$@$H;W$o$l$^$9!%\e(B")
+
+    ("Not in outer par mode." .
+"figure\e$B4D6-!&\e(Btable\e$B4D6-$"$k$$$O\e(B\\marginpar\e$BL?Na$,?t<0%b!<%I$^$?$O\e(Bparbox\e$B$NCf\e(B
+\e$B$G;H$o$l$^$7$?!%\e(B")
+
+    ("\\\\pushtabs and \\\\poptabs don't match." .
+"\\pushtabs\e$B$HBP1~$7$J$$\e(B\\poptabs\e$B$,$_$D$+$C$?$+!$$^$?$O!$BP1~$9$k\e(B\\poptabs
+\e$B$r$b$?$J$$\e(B\\pushtabs\e$B$,$"$k$N$K\e(B\\end{tabbing}\e$B$,8=$l$F$7$^$$$^$7$?!%\e(B")
+
+    ("Something's wrong--perhaps a missing \\\\item." .
+"\e$B%j%9%H4D6-$NCf$K\e(B\\item\e$BL?Na$,$J$$$N$,:G$b$"$j$=$&$J%1!<%9$G$9!%\e(B
+thebibliography\e$B4D6-$G0z?t$rK:$l$?>l9g$K$b@8$8$^$9!%\e(B")
+
+    ("Tab overflow." .
+"\\=\e$B$,!$\e(BLaTeX\e$B$G5v$5$l$k%?%V%9%H%C%W$N:GBg?t$rD6$($F$$$^$9!%\e(B")
+
+    ("There's no line here to end." .
+"\\newline\e$BL?Na$^$?$O\e(B\\\\\e$BL?Na$,%Q%i%0%i%U4V$K$"$j$^$9!%$3$N;H$$$+$?$O\e(B
+\e$BL50UL#$G$9!%$b$76u9T$r$"$1$?$$$N$G$7$?$i!$\e(B\\vspace\e$B$r;H$C$F$/$@$5$$!%\e(B")
+
+    ("This may be a LaTeX bug." .
+"\e$B$^$C$?$/$o$1$,$o$+$i$J$/$J$C$F$7$^$$$^$7$?!%$?$V$s$3$l0JA0$K8!=P$5$l$?\e(B
+\e$B%(%i!<$N$;$$$@$H;W$o$l$^$9!%$7$+$7!$\e(BLaTeX\e$B<+BN$N%P%0$G$"$k2DG=@-$b$"$j$^$9!%\e(B
+\e$B$b$7$3$N%(%i!<$,F~NO%U%!%$%k$KBP$9$k:G=i$N%(%i!<$G$"$j!$2?$b4V0c$$$,8+$D\e(B
+\e$B$+$i$J$$>l9g$O!$$=$N%U%!%$%k$rJ]B8$7$F!$%m!<%+%k%,%$%I$K=q$+$l$F$$$k@UG$\e(B
+\e$B<T$KO"Mm$7$F$/$@$5$$!%\e(B")
+
+    ("Too deeply nested." .
+"\e$B%j%9%H4D6-$NF~$l;R$,?<$9$.$^$9!%2?CJ3,$NF~$l;R$,5v$5$l$k$+$O;H$C$F$$$k\e(B
+\e$B%3%s%T%e!<%?$K0MB8$7$^$9$,!$>/$J$/$H$b\e(B4\e$BCJ3,$^$G$O5v$5$l$F$$$^$9\e(B(\e$BIaDL$O\e(B
+\e$B$=$l$G==J,$G$7$g$&\e(B)\e$B!%\e(B")
+
+    ("Too many unprocessed floats." .
+"\e$B$3$N%(%i!<$O\e(B1\e$B%Z!<%8Cf$N\e(B\\marginpar\e$BL?Na$,B?$9$.$k$?$a$K@8$8$k>l9g$b$"\e(B
+\e$B$j$^$9$,!$$b$C$H$"$j$=$&$J$N$O!$8B3&$rD6$($F?^$dI=$rJ]B8$7$h$&$H$7$?>l\e(B
+\e$B9g$G$9!%D9$$J8=q$rAHHG$7$F$$$/$H$-!$\e(BLaTeX\e$B$O?^$dI=$r8D!9$KJ]B8$7!$%Z!<\e(B
+\e$B%8$NJ,3d$r9T$J$&;~$K$=$l$i$rA^F~$7$^$9!%$3$N%(%i!<$O!$%Z!<%8$X$NJ,3d$,\e(B
+\e$B9T$J$o$l$kA0$K!$$"$^$j$K$bB?$/$N\e(Bfigure\e$B4D6-$d\e(Btable\e$B4D6-$,8+$D$+$C$?>l9g\e(B
+\e$B$K@8$8$^$9!%$3$NLdBj$O4D6-$N$&$A$N$$$/$D$+$rJ8=q$N=*$o$j$NJ}$K0\F0$9$l\e(B
+\e$B$P2r7h$G$-$^$9!%$^$?!$$3$N%(%i!<$O\e(B``logjam''\e$B$K$h$C$F@8$8$k$3$H$b$"$j$^\e(B
+\e$B$9!%\e(B``logjam''\e$B$H$O!$\e(BLaTeX\e$B$,=P8==g=xDL$j$K$7$+?^I=$r=PNO$G$-$J$$$;$$$G!$\e(B
+\e$B$D$^$C$F$$$k8e$m$N?^I=$N$?$a$KA0$N?^I=$r=PNO$G$-$J$/$J$k$3$H$r$$$$$^$9!%\e(B
+\e$B$3$N%8%c%`$N860x$O!$Bg$-$9$.$F\e(B1\e$B%Z!<%8$J$$$7$O;XDj$5$l$?NN0h$K<}$^$i$J\e(B
+\e$B$$$h$&$J?^$dI=$G$"$k2DG=@-$,$"$j$^$9!%$3$l$O!$0z?t$K\e(Bp\e$B%*%W%7%g%s$,;XDj\e(B
+\e$B$5$l$F$$$J$$$H5/$-$d$9$/$J$j$^$9!%\e(B")
+
+    ("Undefined tab position." .
+"\\>\e$B!&\e(B\\+\e$B!&\e(B\\-\e$B$^$?$O\e(B\\<\e$BL?Na$G!$B8:_$7$J$$%?%V0LCV!$$9$J$o$A\e(B\\=\e$BL?Na$GDj\e(B
+\e$B5A$5$l$F$$$J$$%?%V0LCV$r;XDj$7$h$&$H$7$F$$$^$9!%\e(B")
+
+    ("\\\\< in mid line." .
+"\\<\e$BL?Na$,\e(Btabbing\e$B4D6-$N9T$NESCf$K8=$l$^$7$?!%$3$NL?Na$O9T$N@hF,$K$J$1$l$P\e(B
+\e$B$J$j$^$;$s!%\e(B")
+
+    ("Double subscript." .
+"\e$B?t<0Cf$N\e(B1\e$B$D$NNs$K\e(B2\e$B$D$N2<IU$-J8;z$,$D$$$F$$$^$9!%Nc$($P\e(Bx_{2}_{3}\e$B$N$h$&$K!%\e(B
+\e$B$3$N$h$&$JI=8=$OL50UL#$G$9!%\e(B")
+
+    ("Double superscript." .
+"\e$B?t<0Cf$N\e(B1\e$B$D$NNs$K\e(B2\e$B$D$N>eIU$-J8;z$,$D$$$F$$$^$9!%Nc$($P\e(Bx^{2}^{3}\e$B$N$h$&$K!%\e(B
+\e$B$3$N$h$&$JI=8=$OL50UL#$G$9!%\e(B")
+
+    ("Extra alignment tab has been changed to \\\\cr." .
+"array\e$B4D6-$^$?$O\e(Btabular\e$B4D6-$N\e(B1\e$BNsCf$K$"$k9`L\$,B?$9$.$^$9!%8@$$49$($k$H!$\e(B
+\e$BNs$N=*$o$j$^$G$K$"$k\e(B&\e$B$N?t$,B?$9$.$^$9!%$*$=$i$/A0$NNs$N:G8e$K\e(B\\\\\e$B$r$D$1\e(B
+\e$B$k$N$rK:$l$?$N$G$7$g$&!%\e(B")
+
+    ("Extra \\}, or forgotten \\$." .
+"\e$B3g8L$^$?$O?t<0%b!<%I$N%G%j%_%?$,@5$7$/BP1~$7$F$$$^$;$s!%$*$=$i$/\e(B{\e$B!&\e(B\\[\e$B!&\e(B
+\\(\e$B$"$k$$$O\e(B$\e$B$N$&$A$N$$$:$l$+$r=q$-K:$l$?$N$G$7$g$&!%\e(B")
+
+    ("Font [^ ]* not loaded: Not enough room left." .
+"\e$B$3$NJ8=q$O8B3&$h$j$bB?$/$N%U%)%s%H$r;H$C$F$$$^$9!%$b$7J8=q$NItJ,$4$H$K\e(B
+\e$BJL!9$N%U%)%s%H$,;H$o$l$F$$$k$N$J$i!$J,3d$7$F=hM}$9$l$PLdBj$O2r7h$5$l$^$9!%\e(B")
+
+    ("I can't find file `.*'." .
+"\e$BI,MW$J%U%!%$%k$,8+$D$+$j$^$;$s$G$7$?!%$b$78+$D$+$i$J$$%U%!%$%k$N3HD%;R\e(B
+\e$B$,\e(Btex\e$B$N>l9g!$$"$J$?$,;XDj$7$?%U%!%$%k!$$9$J$o$A%a%$%s%U%!%$%k$^$?$O\e(B
+\\input\e$BL?Na!&\e(B\\include\e$BL?Na$GA^F~$5$l$k%U%!%$%k$,8+$D$+$i$J$$$N$G$9!%\e(B
+\e$B3HD%;R$,\e(Bsty\e$B$G$"$l$P!$B8:_$7$J$$J8=q%9%?%$%k$^$?$O%9%?%$%k%*%W%7%g%s$r\e(B
+\e$B;XDj$7$h$&$H$7$F$$$^$9!%\e(B")
+
+    ("Illegal parameter number in definition of .*" .
+"\e$B$3$l$O$*$=$i$/!$\e(B\\newcommand\e$B!&\e(B\\renewcommand\e$B!&\e(B\\newenvironment\e$B$^$?$O\e(B
+\\renewenvironment\e$BL?Na$N$J$+$G\e(B#\e$B$,@5$7$/;H$o$l$J$+$C$?$?$a$K@8$8$?%(%i!<\e(B
+\e$B$G$9!%\e(B\\#\e$BL?Na$H$7$F;H$o$l$k>l9g$r=|$1$P!$\e(B#\e$B$H$$$&J8;z$O!$Nc$($P\e(B2\e$BHVL\$N\e(B
+\e$B0z?t$r;XDj$9$k\e(B#2\e$B$N$h$&$K!$0z?t%Q%i%a!<%?$H$7$F$7$+;H$($^$;$s!%$^$?!$\e(B
+\e$B$3$N%(%i!<$O!$>e$K$"$2$?\e(B4\e$B$D$N%3%^%s%I$,$*8_$$$KF~$l;R$K$J$C$F$$$k>l9g\e(B
+\e$B$d!$\e(B\\newenvironment\e$BL?Na!&\e(B\\renewenvironment\e$BL?Na$G\e(B#2\e$B$N$h$&$J%Q%i%a!<%?\e(B
+\e$B$,:G8e$N0z?t$NCf$G;H$o$l$F$$$k>l9g$K$b@8$8$^$9!%\e(B")
+
+    ("Illegal unit of measure ([^ ]* inserted)." .
+"\e$B$b$7\e(B
+      ! Missing number, treated as zero.
+\e$B$H$$$&%(%i!<$,5/$-$?D>8e$G$"$l$P!$$3$N%(%i!<$N860x$b$=$l$HF1$8$G$9!%\e(B
+\e$B$=$&$G$J$$>l9g$O!$\e(BLaTeX\e$B$,0z?t$H$7$F\e(Blength\e$B$r4|BT$7$F$$$k$N$K\e(Bnumber\e$B$,\e(B
+\e$B8=$l$?$3$H$r0UL#$7$F$$$^$9!%$3$N%(%i!<$N:G$b$"$j$,$A$J860x$OD9$5\e(B0\e$B$r\e(B
+\e$BI=$o$9\e(B0in\e$B$N$h$&$JI=8=$NBe$o$j$K\e(B0\e$B$H$+$$$F$7$^$&$3$H$K$"$j$^$9!%$?$@$7!$\e(B
+\e$BL?Na$N0z?t$r=q$-K:$l$?>l9g$K$b$3$N%(%i!<$,@8$8$k$3$H$,$"$j$^$9!%\e(B")
+
+    ("Misplaced alignment tab character \\&." .
+"array\e$B$^$?$O\e(Btabular\e$B4D6-$G$N9`L\6h@Z$j$K$N$_;H$o$l$k$Y$-J8;z\e(B&\e$B$,IaDL$NJ8\e(B
+\e$B$NCf$K$"$j$^$7$?!%$?$V$s\e(B\\&\e$B$HF~NO$7$?$+$C$?$N$G$7$g$&!%\e(B")
+
+    ("Missing control sequence inserted." .
+"\e$B$3$N%(%i!<$O!$$*$=$i$/L?NaL>$G$J$$$b$N$r\e(B\\newcommand\e$B!&\e(B\\renewcommand\e$B!&\e(B
+\\newlength\e$B$^$?$O\e(B\\newsavebox\e$B$NBh\e(B1\e$B0z?t$H$7$F;H$C$?$?$a$K@8$8$?$N$G$7$g$&!%\e(B")
+
+    ("Missing number, treated as zero." .
+"\e$B$3$N%(%i!<$O$?$$$F$$!$0z?t$H$7$F\e(Bnumber\e$B$^$?$O\e(Blength\e$B$rI,MW$H$7$F$$$kL?Na$K\e(B
+\e$BBP$7$F0z?t$,M?$($i$l$J$+$C$?$?$a$K@8$8$^$9!%0z?t$r=q$-K:$l$?$N$+!$%F%-%9%H\e(B
+\e$B$NCf$NBg3g8L\e(B([])\e$B$,%*%W%7%g%s0z?t$N;XDj$H4V0c$($i$l$F$7$^$C$?$+$N$I$A$i$+$G\e(B
+\e$B$7$g$&!%$^$?!$?t$r@8@.$9$k\e(B\\value\e$B$N$h$&$JL?Na$d\e(Blength\e$BL?Na$NA0$K\e(B\\protect\e$B$r\e(B
+\e$BCV$$$?>l9g$K$b$3$N%(%i!<$O@8$8$^$9!%\e(B")
+
+    ("Missing [{}] inserted." .
+"TeX\e$B$O4{$K$o$1$,$o$+$i$J$/$J$C$F$$$^$9!%%(%i!<%a%C%;!<%8$K$h$C$F<($5$l$F\e(B
+\e$B$$$k>l=j$O$?$V$sF~NO$K4V0c$$$,$"$C$?$H$3$m$h$j$b8e$m$K$J$C$F$7$^$C$F$$$k\e(B
+\e$B$G$7$g$&!%\e(B")
+
+    ("Missing \\$ inserted." .
+"\e$B$*$=$i$/!$?t<0%b!<%ICf$G$7$+;H$($J$$L?Na$r\e(BTeX\e$B$,?t<0%b!<%I30$G8!=P$7$?\e(B
+\e$B$N$@$H;W$o$l$^$9!%FC$K5-=R$5$l$F$$$J$$8B$j!$\e(BLaTeX Book(Lamport\e$BCx\e(B,\e$BLu=q\e(B
+\e$B$O%"%9%-!<=PHG\e(B)\e$B$N\e(B3.3\e$B@a$K$"$kE:;z!&J,?t!&?t3X5-9f$J$I$N%3%^%s%I$O$9$Y$F\e(B
+\e$B?t<0%b!<%I$G$7$+;H$($J$$$N$@$H$$$&$3$H$KCm0U$7$F$/$@$5$$!%$?$H$(L?Na$,\e(B
+\e$B?t<04D6-$NCf$K$"$C$?$H$7$F$b!$\e(Bbox\e$B$r@8@.$9$kL?Na$N0z?t$r=hM}$7$O$8$a$?\e(B
+\e$B;~E@$G$O!$\e(BTeX\e$B$O$^$@?t<0%b!<%I$KF~$C$F$$$J$$$N$G$9!%$^$?!$$3$N%(%i!<$O!$\e(B
+\e$B?t<0%b!<%ICf$G\e(BTeX\e$B$,6u9T$r8!=P$7$?>l9g$K$b@8$8$^$9!%\e(B")
+
+    ("Not a letter." .
+"\\hyphenation\e$BL?Na$N0z?t$NCf$K$J$K$+@5$7$/$J$$$b$N$,$"$j$^$9!%\e(B")
+
+    ("Paragraph ended before [^ ]* was complete." .
+"\e$BL?Na$N0z?t$NCf$KIT@5$J6u9T$,F~$C$F$7$^$C$F$$$^$9!%$*$=$i$/0z?t$N=*$o$j\e(B
+\e$B$KJD$83g8L$r$D$1$k$N$rK:$l$?$N$G$7$g$&!%\e(B")
+
+    ("\\\\[^ ]*font [^ ]* is undefined .*" .
+"\e$B$3$N%(%i!<$O$"$^$j0lHLE*$G$J$$%U%)%s%H$,?t<0%b!<%I$G;H$o$l$?;~$K@8$8\e(B
+\e$B$^$9!%Nc$($P!$5SCm$NCf$N?t<0$G\e(B\\sc\e$BL?Na$,;H$o$l$k$H!$\e(Bfootnotesize\e$B$N\e(B
+small caps\e$B%U%)%s%H$,8F$S$@$5$l$k$3$H$K$J$j$^$9!%$3$NLdBj$O\e(B\\load\e$BL?Na$r\e(B
+\e$B;H$($P2r7h$G$-$^$9!%\e(B")
+
+    ("Font .* not found." .
+"\e$BL$CN$N\e(Bfamily/series/shape/size\e$B$NAH$_9g$o$;$N%U%)%s%H$,;XDj$5$l$^$7$?!%\e(B
+\e$B$3$N%(%i!<$,5/$-$k%1!<%9$O\e(B2\e$B$D9M$($i$l$^$9!%\e(B
+   1) \\size\e$B%^%/%m$G;H$($J$$%5%$%:$rA*Br$7$h$&$H$7$?!%\e(B
+   2) \e$B$=$&$G$J$1$l$P!$4IM}<T$N$H$3$m$K9T$C$F!$%U%)%s%HA*Br%F!<%V%k$,\e(B
+      \e$BIe$C$F$$$k$HJ86g$r$D$1$F$d$j$^$7$g$&\e(B!")
+
+    ("TeX capacity exceeded, sorry .*" .
+"TeX\e$B$,%a%b%j$r;H$$$-$C$F$7$^$$!$<B9T$rCfCG$7$^$7$?!%$7$+$7!$92$F$J$$$G\e(B
+\e$B$/$@$5$$!%$3$N%(%i!<$,@8$8$?860x$O!$$?$V$s!$\e(BTeX\e$B$K$"$J$?$NJ8=q$r=hM}$G\e(B
+\e$B$-$k$@$1$NG=NO$,$J$$$+$i$G$O$"$j$^$;$s!%\e(BTeX\e$B$K%a%b%j$r;H$$$-$i$;$?860x\e(B
+\e$B$O!$$*$=$i$/F~NO$7$?%U%!%$%k$NA0$NJ}$G@8$8$?%(%i!<$G$9!%$"$J$?$,K\Ev$K\e(B
+TeX\e$B$NMFNL$rD6$($?$3$H$r$7$h$&$H$7$?$N$+$I$&$+!$$=$7$F$=$N>l9g$I$&$9$l\e(B
+\e$B$P$$$$$N$+$rH=CG$9$kJ}K!$r0J2<$K@bL@$7$^$9!%$b$7LdBj$,F~NO%U%!%$%kCf$N\e(B
+\e$B%(%i!<$K$"$k>l9g$O!$8D!9$N%(%i!<$r2r7h$7$F$$$/J}K!$r$H$k$N$,$h$$$G$7$g\e(B
+\e$B$&!%\e(BLaTeX\e$B$,C;$$%U%!%$%k$G%a%b%j$r;H$$$-$k$3$H$O$a$C$?$K$"$j$^$;$s$+$i!$\e(B
+\e$B%(%i!<$N5/$-$?0LCV$h$jA0$K=hM}$7$?%Z!<%8$,?t%Z!<%8$7$+$J$1$l$P!$$^$:4V\e(B
+\e$B0c$$$J$/F~NO%U%!%$%k$KLdBj$,$"$k$O$:$G$9!%\e(B
+
+\e$B%(%i!<%a%C%;!<%8$N:G8e$K!$\e(BTeX\e$B$,;H$$$-$C$F$7$^$C$?%a%b%j$N<oN`$,<($5$l\e(B
+\e$B$F$$$^$9!%$=$l$i$N$&$A0lHLE*$J$b$N$K$D$$$F!$9M$($i$l$k860x$r0J2<$K5s$2\e(B
+\e$B$^$9!%\e(B
+
+buffer size
+===========
+\e$B>O@a!&\e(B\\caption\e$B!&\e(B\\addcontentsline\e$B$"$k$$$O\e(B\\addtocontents\e$BL?Na$N0z?t$H\e(B
+\e$B$7$FM?$($?%F%-%9%H$,D9$9$.$k>l9g$K@8$8$k$3$H$,$"$j$^$9!%$3$N%(%i!<$O\e(B
+\e$B$?$$$F$$\e(B\\end{document}\e$B$r=hM}$7$F$$$k;~$K@8$8$^$9$,!$\e(B\\tableofcontents\e$B!&\e(B
+\\listoffigures\e$B$"$k$$$O\e(B\\listoftables\e$BL?Na$r<B9T$7$F$$$k>l9g$K$b5/$-$k\e(B
+\e$B$3$H$,$"$j$^$9!%$3$NLdBj$r2r7h$9$k$K$O!$$b$C$HC;$$%F%-%9%H$r%*%W%7%g%s\e(B
+\e$B0z?t$H$7$FM?$($F$/$@$5$$!%L\<!$d?^I=0lMw$r:n@.$7$F$b!$8+=P$7$,D9$9$.$k\e(B
+\e$B$HFI$_$K$/$/$J$k$O$:$G$9!%\e(B
+
+exception dictionary
+====================
+TeX\e$B$,;}$C$F$$$kNN0h0J>e$K%O%$%U%M!<%7%g%s>pJs$rM?$($h$&$H$7$F$$$^$9!%\e(B
+\e$B$"$^$j;H$o$J$$C18l$N\e(B\\hyphenation\e$BL?Na$r<h$j=|$$$F!$Be$o$j$K\e(B\\-\e$BL?Na$r;H$C\e(B
+\e$B$F$/$@$5$$!%\e(B
+
+hash size
+=========
+\e$BL?NaL>$NDj5A$^$?$OAj8_;2>H%i%Y%k$NDj5A$,B?$9$.$^$9!%\e(B
+
+input stack size
+================
+\e$B$3$N%(%i!<$O$*$=$i$/L?NaDj5ACf$N8m$j$K$h$k$b$N$G$9!%Nc$($P!$<!$NL?Na$O\e(B
+\e$B:F5"E*Dj5A$H$J$C$F$*$j!$<+J,<+?H$r;H$C$F\e(B\\gnu\e$B$rDj5A$7$F$$$^$9!%\e(B
+
+         \\newcommand{\\gnu}{a \\gnu} % \e$B$3$l$O$@$a\e(B
+
+\e$B$3$N\e(B\\gnu\e$BL?Na$r8+$D$1$k$H\e(BTeX\e$B$O\e(B\\gnu\e$B$,2?$r$&$_$@$9$N$+$r7hDj$7$h$&$H$7\e(B
+\e$B$F$=$NKvHx$r$$$D$^$G$bDI$$$D$E$1!$$d$,$F\e(B``input stack''\e$B$r;H$$$-$C$F$7\e(B
+\e$B$^$$$^$9!%\e(B
+
+main memory size
+================
+\e$B$3$l$O!$\e(BTeX\e$B$,C;$$%U%!%$%k$r=hM}$7$F$$$k;~$K;H$$$-$k2DG=@-$N$"$k%a%b%j\e(B
+\e$B$N$R$H$D$G$9!%\e(Bmain memory\e$B$r;H$$$-$k$N$O<!$N\e(B3\e$B$D$N>l9g$N$$$:$l$+$G$9!%\e(B
+\(1\)\e$BHs>o$KD9$/J#;($JL?Na$r?tB?$/Dj5A$7$?!%\e(B(2)index\e$B$^$?$O\e(Bglossary\e$B$r:n$C\e(B
+\e$B$F$$$k$H$-!$\e(B1\e$B%Z!<%8Cf$K$"$^$j$K$bB?$/$N\e(B\\index\e$B$^$?$O\e(B\\glossary\e$BL?Na$,$"\e(B
+\e$B$k!%\e(B(3)\e$B@8@.$N$?$a$N>pJs$r\e(BTeX\e$B$,J];}$7$-$l$J$$$h$&$J!$$"$^$j$K$bJ#;($J%Z!<\e(B
+\e$B%8$r@8@.$7$h$&$H$7$?!%:G=i$N\e(B2\e$B$D$NLdBj$N2r7hJ}K!$OL@$i$+$G$9!%L?NaDj5A\e(B
+\e$B$N?t$"$k$$$O\e(B\\index\e$B!&\e(B\\glossary\e$BL?Na$N?t$r8:$i$9$3$H$G$9!%\e(B3\e$BHVL\$NLdBj$O\e(B
+\e$B$A$g$C$HLq2p$G$9!%$3$l$O!$Bg$-$J\e(Btabbing\e$B!&\e(Btabular\e$B!&\e(Barray\e$B!&\e(Bpicture\e$B4D6-$N\e(B
+\e$B$;$$$G@8$8$k$3$H$,$"$j$^$9!%=PNO0LCV$,7hDj$5$l$k$N$rBT$C$F$$$k?^$dI=$G\e(B
+TeX\e$B$N%a%b%j$,$$$C$Q$$$K$J$C$F$$$k$N$+$b$7$l$^$;$s!%K\Ev$K\e(BTeX\e$B$NMFNL$rD6\e(B
+\e$B$($F$7$^$C$?$N$+$I$&$+D4$Y$k$?$a$K$O!$%(%i!<$N5/$3$C$?>l=j$ND>A0$K\e(B
+\\clearpage\e$BL?Na$rF~$l$F$b$&0lEY%3%s%Q%$%k$r<B9T$7$F$_$F$/$@$5$$!%$b$7\e(B
+\e$B$=$l$G$b%a%b%j$,B-$j$J$/$J$k$h$&$J$i!$$J$s$i$+$N<jCJ$r9V$8$kI,MW$,$"$j\e(B
+\e$B$^$9!%\e(BTeX\e$B$,%Z!<%8$r@ZCG$9$k$+$I$&$+7hDj$9$k$?$a$K$OCJMnA4BN$r=hM}$7$J\e(B
+\e$B$1$l$P$J$i$J$$$H$$$&$3$H$r;W$$$@$7$F$/$@$5$$!%CJMn$NESCf$K\e(B\\newpage\e$BL?\e(B
+\e$BNa$rF~$l$l$P!$CJMn$N;D$j$r=hM}$9$kA0$K:#$N%Z!<%8$r\e(BTeX\e$B$K=PNO$5$;$k$3$H\e(B
+\e$B$GM>M5$,$G$-$k$+$b$7$l$^$;$s\e(B(\\pagebreak\e$BL?Na$G$O$@$a$G$9\e(B)\e$B!%$b$7?^$dI=\e(B
+\e$B$,N/$^$C$F$$$k$3$H$,LdBj$J$N$J$i$P!$?^I=$r$b$C$H8e$m$NJ}$K0\F0$9$k$H$+!$\e(B
+\e$B$"$k$$$O$b$C$HA0$N;~E@$G=PNO$5$l$k$h$&$K$9$l$P2sHr$G$-$^$9!%$b$7$^$@J8\e(B
+\e$B=q$r:n@.$7$F$$$kESCf$J$i!$$H$j$"$($:\e(B\\clearpage\e$BL?Na$rF~$l$F$*$$$F!$:G\e(B
+\e$B=*HG$r:n$k;~$^$G$3$NLdBj$OC*>e$2$7$F$*$-$^$7$g$&!%F~NO%U%!%$%k$,JQ$o$k\e(B
+\e$B$HLdBj$,2r>C$5$l$k>l9g$b$"$k$N$G$9!%\e(B
+
+pool size
+=========
+\e$BAj8_;2>H$N\e(B\\label\e$B$,B?$9$.$k$+!$L?Na$NDj5A$,B?$9$.$k$+$N$I$A$i$+$G$9!%\e(B
+\e$B@53N$K$$$($P!$Dj5A$7$?%i%Y%kL>$*$h$SL?NaL>$K;H$C$?J8;z?t$,B?$9$.$k$H$$\e(B
+\e$B$&$3$H$G$9!%$G$9$+$i!$$b$C$HC;$$L>A0$r;H$($P$3$NLdBj$O2r7h$7$^$9!%$?$@\e(B
+\e$B$7!$$3$N%(%i!<$O!$\e(B\\setcounter\e$B$J$I$N%+%&%s%?L?Na$d\e(B\\newenvironment\e$B!&\e(B
+\\newtheorem\e$BL?Na$N0z?t$N=*$o$j$r<($91&3g8L$rK:$l$?>l9g$K$b@8$8$^$9!%\e(B
+
+save size
+=========
+\e$B$3$N%(%i!<$O!$@k8@$NM-8zHO0O$dL?Na!&4D6-$,$"$^$j$K$b?<$/F~$l;R$K$J$C$F\e(B
+\e$B$$$k>l9g$K@8$8$^$9!%$?$H$($P!$\e(B\\multiput\e$BL?Na$N0z?t$K\e(Bpicture\e$B4D6-$,$"$j!$\e(B
+\e$B$=$N$J$+$K\e(B\\footnotesize\e$B@k8@$,$"$j!$$=$N@k8@$NM-8zHO0O$K\e(B\\multiput\e$BL?Na\e(B
+\e$B$,$"$C$F!$$=$N0z?t$K\e(B... \e$B$H$$$&$h$&$J>l9g$G$9!%\e(B")
+
+    ("Text line contains an invalid character." .
+"\e$BF~NOCf$KIT@5$JJ8;z$,4^$^$l$F$$$^$9!%%U%!%$%k:n@.$N8m$j$K$h$C$F%F%-%9%H\e(B
+\e$B%(%G%#%?$,$3$NJ8;z$rA^F~$7$F$7$^$C$?$N$G$7$g$&!%<B:]$K2?$,5/$-$?$N$+$O\e(B
+\e$B%(%G%#%?$K$h$j$^$9!%F~NO%U%!%$%k$rD4$Y$F$_$F!$;XE&$5$l$?J8;z$,8+$D$+$i\e(B
+\e$B$J$$>l9g$K$O%m!<%+%k%,%$%I$r8+$F$/$@$5$$!%\e(B")
+
+    ("Undefined control sequence."   .
+"TeX\e$B$,L$Dj5A$NL?NaL>$rH/8+$7$^$7$?!%$*$=$i$/F~NO$N8m$j$G$7$g$&!%$b$7$3\e(B
+\e$B$N%(%i!<$,\e(BLaTeX\e$BL?Na$N=hM}Cf$K@8$8$?>l9g$O!$$=$NL?Na$O4V0c$C$?0LCV$KCV$+\e(B
+\e$B$l$F$$$^$9!%Nc$($P!$%j%9%H4D6-$NCf$G$J$$$N$K\e(B\\item\e$BL?Na$,;H$o$l$?>l9g$J$I\e(B
+\e$B$G$9!%$^$?!$\e(B\\documentclass\e$BL?Na$,$J$$>l9g$K$b$3$N%(%i!<$,@8$8$^$9!%\e(B")
+
+    ("Use of [^ ]* doesn't match its definition." .
+"\e$B$*$=$i$/IA2h$N$?$a$NL?Na$@$H;W$o$l$^$9$,!$0z?t$N;H$$$+$?$,4V0c$C$F$$\e(B
+\e$B$^$9!%4V0c$C$F$$$k$N$,\e(B\\@array\e$BL?Na$N>l9g$O!$\e(Barray\e$B4D6-$+\e(Btabular\e$B4D6-$G$N\e(B
+@\e$BI=8=$N0z?t$K$J$K$+8m$j$,$"$k$N$G$7$g$&!%\e(Bfragile\e$B$JL?Na$,\e(B\\protect\e$B$5$l$F\e(B
+\e$B$$$J$$$N$+$b$7$l$^$;$s!%\e(B")
+
+    ("You can't use `macro parameter character \\#' in [^ ]* mode." .
+"\e$BFC<lJ8;z\e(B#\e$B$,IaDL$N%F%-%9%H$NCf$K8=$l$^$7$?!%$*$=$i$/\e(B\\#\e$B$H=q$-$?$+$C$?\e(B
+\e$B$N$G$7$g$&!%\e(B")
+
+    ("Overfull \\\\hbox .*" .
+"\e$B9TJ,3d$N$?$a$NE,@Z$J>l=j$,8+$D$+$i$J$+$C$?$N$G!$\e(B1\e$B9T$K<}$^$k$Y$-J,NL0J>e\e(B
+\e$B$N=PNO$,9T$J$o$l$F$7$^$$$^$7$?!%\e(B")
+
+    ("Overfull \\\\vbox .*" .
+"\e$B%Z!<%8J,3d$N$?$a$NE,@Z$J>l=j$,8+$D$+$i$J$+$C$?$N$G!$\e(B1\e$B%Z!<%8$K<}$^$k$Y$-\e(B
+\e$BJ,NL0J>e$N=PNO$,9T$J$o$l$F$7$^$$$^$7$?!%\e(B")
+
+    ("Underfull \\\\hbox .*" .
+"\e$BM>J,$J?bD>%9%Z!<%9$,$J$$$+$I$&$+=PNO$r3N$+$a$F$/$@$5$$!%$b$7$"$l$P!$$=\e(B
+\e$B$l$O\e(B\\\\\e$BL?Na$^$?$O\e(B\\newline\e$BL?Na$K4X78$9$kLdBj$N$?$a$K@8$8$?$b$N$G$9!%Nc\e(B
+\e$B$($P\e(B2\e$B$D$N\e(B\\\\\e$BL?Na$,B3$$$F$$$k>l9g$J$I$G$9!%$3$N7Y9p$O\e(Bsloppypar\e$B4D6-$d\e(B
+\\sloppy\e$B@k8@$N;HMQ!$$"$k$$$O\e(B\\linebreak\e$BL?Na$NA^F~$J$I$K$h$k>l9g$b$"$j$^$9!%\e(B")
+
+    ("Underfull \\\\vbox .*" .
+"\e$B%Z!<%8$rJ,3d$9$k$?$a$NE,@Z$J>l=j$,8+$D$1$i$l$:!$==J,$J%F%-%9%H$N$J$$\e(B
+\e$B%Z!<%8$,$G$-$F$7$^$$$^$7$?!%\e(B")
+
+;; New list items should be placed here
+;;
+;; ("err-regexp" . "context")
+;;
+;; the err-regexp item should match anything
+
+    (".*" . "\e$B$4$a$s$J$5$$!%3:Ev$9$k%X%k%W%a%C%;!<%8$,$"$j$^$;$s!%\e(B"))))
+
+(provide 'tex-jp)
+
+;;; tex-jp.el ends here
diff --git a/packages/auctex/tex-mik.el b/packages/auctex/tex-mik.el
new file mode 100644 (file)
index 0000000..4197df5
--- /dev/null
@@ -0,0 +1,71 @@
+;;; tex-mik.el --- MiKTeX support for AUCTeX.
+
+;; Copyright (C) 1999, 2000, 2001, 2004 Free Software Foundation, Inc.
+
+;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
+;; Maintainer: auctex-devel@gnu.org
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+;;
+;; This file contains variables customized for MiKTeX.
+
+;;; Code:
+
+  ;; Remove the Queue entry from the default, and make a non-Unix
+  ;; specific print entry, assuming that we'll print via gsview32.
+(unless (get 'TeX-queue-command 'saved-value)
+  (setq TeX-queue-command nil))
+
+(unless (get 'TeX-printer-list 'saved-value)
+  (setq TeX-printer-list nil))
+
+(unless (get 'TeX-print-command 'saved-value)
+  (setq TeX-print-command
+       "start \"\" %f"))
+
+(unless (get 'TeX-view-style 'saved-value)
+  (setq TeX-view-style '(("^epsf$" "start \"\" %f")
+                        ("." "yap -1 %dS %d"))))
+
+(unless (get 'TeX-output-view-style 'saved-value)
+  (setq TeX-output-view-style
+       '(("^dvi$" "^pstricks$\\|^pst-\\|^psfrag$" "dvips %d -o && start \"\" %f")
+         ("^dvi$" "." "yap -1 %dS %d")
+         ("^pdf$" "." "start \"\" %o")
+         ("^html?$" "." "start \"\" %o"))))
+
+(unless (get 'TeX-source-specials-view-position-flags 'saved-value)
+  (setq TeX-source-specials-view-position-flags "-s %n%b"))
+
+;; Yap does not support a command line option for inverse searching.
+;; The editor command has to be configured inside Yap in
+;; "View/Options/Inverse Search" instead.
+(unless (get 'TeX-source-specials-view-editor-flags 'saved-value)
+  (setq TeX-source-specials-view-editor-flags ""))
+
+;; kpsewhich in MiKTeX (aka findtexmf) does not emit any useful
+;; information if fed with kpathsea-related variables anyway.
+(unless (get 'TeX-kpathsea-path-delimiter 'saved-value)
+  (setq TeX-kpathsea-path-delimiter nil))
+
+(provide 'tex-mik)
+
+;;; tex-mik.el ends here
diff --git a/packages/auctex/tex-site.el b/packages/auctex/tex-site.el
new file mode 100644 (file)
index 0000000..0a31f4d
--- /dev/null
@@ -0,0 +1,164 @@
+;;; tex-site.el - Site specific variables.  Don't edit.
+
+;; Copyright (C) 2005 Free Software Foundation, Inc.
+;;
+;; completely rewritten.
+
+;; Author: David Kastrup <dak@gnu.org>
+;; Maintainer: auctex-devel@gnu.org
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file contains startup code, autoloads and variables adapted to
+;; the local site configuration.  It is generated and placed by the
+;; installation procedure and should not be edited by hand, nor moved
+;; to a different place, as some settings may be established relative
+;; to the file.
+
+;; All user customization should be done with
+;; M-x customize-variable RET
+
+;;; Code:
+
+(if (< emacs-major-version 21)
+  (error "AUCTeX requires Emacs 21 or later"))
+
+;; Define here in order for `M-x customize-group <RET> AUCTeX <RET>'
+;; to work if the main AUCTeX files are not loaded yet.
+(defgroup AUCTeX nil
+  "A (La)TeX environment."
+  :tag "AUCTeX"
+  :link '(custom-manual "(auctex)Top")
+  :link '(url-link :tag "Home Page" "http://www.gnu.org/software/auctex/")
+  :prefix "TeX-"
+  :group 'tex
+  :load "tex" :load "latex" :load "tex-style")
+
+(defvar TeX-lisp-directory (file-name-directory load-file-name)
+  "The directory where most of the AUCTeX lisp files are located.
+For the location of lisp files associated with
+styles, see the variables TeX-style-* (hand-generated lisp) and
+TeX-auto-* (automatically generated lisp).")
+
+(add-to-list 'load-path TeX-lisp-directory)
+
+(defvar TeX-data-directory (file-name-directory load-file-name)
+  "The directory where the AUCTeX non-Lisp data is located.")
+
+(defcustom TeX-auto-global "/usr/local/var/auctex"
+  "Directory containing automatically generated information.
+Must end with a directory separator.
+
+For storing automatic extracted information about the TeX macros
+shared by all users of a site."
+  :group 'TeX-file
+  :type 'directory)
+
+(defconst TeX-mode-alist
+  '((tex-mode . tex-mode)
+    (plain-tex-mode . tex-mode)
+    (texinfo-mode . texinfo)
+    (latex-mode . tex-mode)
+    (doctex-mode . tex-mode))
+  "Alist of built-in TeX modes and their load files.")
+
+(defalias 'TeX-load-hack 'ignore)
+
+(add-hook 'tex-site-unload-hook
+         (lambda ()
+           (let ((list after-load-alist))
+             (while list
+               ;; Adapted copy of the definition of `assq-delete-all'
+               ;; from Emacs 21 as substitute for
+               ;; `(assq-delete-all'TeX-modes-set (car list))' which
+               ;; fails on non-list elements in Emacs 21.
+               (let* ((alist (car list))
+                      (tail alist)
+                      (key 'TeX-modes-set))
+                 (while tail
+                   (if (and (consp (car tail))
+                            (eq (car (car tail)) key))
+                       (setq alist (delq (car tail) alist)))
+                   (setq tail (cdr tail))))
+               (setq list (cdr list))))
+           (setq load-path (delq TeX-lisp-directory load-path))))
+
+(defun TeX-modes-set (var value &optional update)
+  "Set VAR (which should be `TeX-modes') to VALUE.
+
+This places either the standard or the AUCTeX versions of
+functions into the respective function cell of the mode.
+If UPDATE is set, a previously saved value for
+the non-AUCTeX function gets overwritten with the current
+definition."
+  (custom-set-default var value)
+  (let ((list TeX-mode-alist) elt)
+    (while list
+      (setq elt (car (pop list)))
+      (when (or update (null (get elt 'tex-saved)))
+       (when (fboundp elt)
+         (put elt 'tex-saved (symbol-function elt))))
+      (defalias elt
+       (if (memq elt value)
+           (intern (concat "TeX-" (symbol-name elt)))
+         (get elt 'tex-saved))))))
+
+(defcustom TeX-modes
+  (mapcar 'car TeX-mode-alist)
+  "List of modes provided by AUCTeX.
+
+This variable can't be set normally; use customize for that, or
+set it with `TeX-modes-set'."
+  :type (cons 'set
+             (mapcar (lambda(x) (list 'const (car x))) TeX-mode-alist))
+  :set 'TeX-modes-set
+  :group 'AUCTeX
+  :initialize (lambda (var value)
+               (custom-initialize-reset var value)
+               (let ((list TeX-mode-alist))
+                 (while list
+                   (eval-after-load (cdar list)
+                     `(TeX-modes-set ',var ,var t))
+                   (setq list (cdr list))))))
+
+(defconst AUCTeX-version "11.86"
+    "AUCTeX version.
+If not a regular release, the date of the last change.")
+
+(defconst AUCTeX-date "2010-02-21"
+  "AUCTeX release date using the ISO 8601 format, yyyy-mm-dd.")
+
+;; Store bibitems when saving a BibTeX buffer
+(add-hook 'bibtex-mode-hook 'BibTeX-auto-store)
+
+\f
+;;; Code specific to ELPA packaging:
+
+;; From preview-latex.el:
+
+(defvar preview-TeX-style-dir
+  (expand-file-name "latex" (file-name-directory load-file-name)))
+
+;;; Ensure that loading the autoloads file also loads this file.
+;;;###autoload (require 'tex-site)
+
+(provide 'tex-site)
+;;; tex-site.el ends here
diff --git a/packages/auctex/tex-style.el b/packages/auctex/tex-style.el
new file mode 100644 (file)
index 0000000..781aa11
--- /dev/null
@@ -0,0 +1,367 @@
+;;; tex-style.el --- Customizable variables for AUCTeX style files
+
+;; Copyright (C) 2005  Free Software Foundation, Inc.
+
+;; Author: Reiner Steib <Reiner.Steib@gmx.de>
+;; Keywords: tex, wp, convenience
+
+;; This file 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, or (at your option)
+;; any later version.
+
+;; This file 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; see the file COPYING.  If not, write to
+;; the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file provides customizable variables for AUCTeX style files.
+
+;;; Code:
+
+(defgroup LaTeX-style nil
+  "Support for special LaTeX style files in AUCTeX."
+  :group 'LaTeX-macro)
+
+;; Note: We don't have any defcustom in plain TeX style files yet.  Else we
+;; should also create a TeX-style group.
+
+;; style/amsmath.el
+
+(defcustom LaTeX-amsmath-label nil
+  "Default prefix to amsmath equation labels.
+
+Amsmath equations include \"align\", \"alignat\", \"xalignat\",
+\"multline\", \"flalign\" and \"gather\".  If it is nil,
+`LaTeX-equation-label' is used."
+  :group 'LaTeX-label
+  :type '(choice (const :tag "Use `LaTeX-equation-label'" nil)
+                (string)))
+
+;; style/beamer.el
+
+(defcustom LaTeX-beamer-section-labels-flag nil
+  "If non-nil section labels are added"
+  :type 'boolean
+  :group 'LaTeX-style)
+
+(defcustom LaTeX-beamer-item-overlay-flag t
+  "If non-nil do prompt for an overlay in itemize-like environments."
+  :type 'boolean
+  :group 'LaTeX-style)
+
+(defcustom LaTeX-beamer-themes 'local
+  "Presentation themes for the LaTeX beamer package.
+It can be a list of themes or a function.  If it is the symbol
+`local', search only once per buffer."
+  :group 'LaTeX-style
+  :type
+  '(choice
+    (const :tag "TeX search" LaTeX-beamer-search-themes)
+    (const :tag "Search once per buffer" local)
+    (function :tag "Other function")
+    (list
+     :value
+     ;; Work around (bug in customize?), see
+     ;; <news:v9is48jrj1.fsf@marauder.physik.uni-ulm.de>
+     ("Antibes" "Bergen" "Berkeley" "Berlin" "Boadilla" "Copenhagen"
+      "Darmstadt" "Dresden" "Frankfurt" "Goettingen" "Hannover"
+      "Ilmenau" "JuanLesPins" "Luebeck" "Madrid" "Malmoe" "Marburg"
+      "Montpellier" "PaloAlto" "Pittsburgh" "Rochester" "Singapore"
+      "Szeged" "Warsaw")
+     (set :inline t
+         (const "Antibes")
+         (const "Bergen")
+         (const "Berkeley")
+         (const "Berlin")
+         (const "Boadilla")
+         (const "Copenhagen")
+         (const "Darmstadt")
+         (const "Dresden")
+         (const "Frankfurt")
+         (const "Goettingen")
+         (const "Hannover")
+         (const "Ilmenau")
+         (const "JuanLesPins")
+         (const "Luebeck")
+         (const "Madrid")
+         (const "Malmoe")
+         (const "Marburg")
+         (const "Montpellier")
+         (const "PaloAlto")
+         (const "Pittsburgh")
+         (const "Rochester")
+         (const "Singapore")
+         (const "Szeged")
+         (const "Warsaw"))
+     (repeat :inline t
+            :tag "Other"
+            (string)))))
+
+(defcustom LaTeX-beamer-inner-themes 'local
+  "Presentation inner themes for the LaTeX beamer package.
+It can be a list of themes or a function.  If it is the symbol
+`local', search only once per buffer."
+  :group 'LaTeX-style
+  :type '(choice
+    (const :tag "TeX search" LaTeX-beamer-search-inner-themes)
+    (const :tag "Search once per buffer" local)
+    (function :tag "Other function")
+    (list
+     :value ("circles" "default" "inmargin" "rectangles" "rounded")
+     (set :inline t
+         (const "circles")
+         (const "default")
+         (const "inmargin")
+         (const "rectangles")
+         (const "rounded"))
+     (repeat :inline t
+            :tag "Other"
+            (string)))))
+
+(defcustom LaTeX-beamer-outer-themes 'local
+  "Presentation outer themes for the LaTeX beamer package.
+It can be a list of themes or a function.  If it is the symbol
+`local', search only once per buffer."
+  :group 'LaTeX-style
+  :type
+  '(choice
+    (const :tag "TeX search" LaTeX-beamer-search-outer-themes)
+    (const :tag "Search once per buffer" local)
+    (function :tag "Other function")
+    (list
+     :value
+     ("default" "infolines" "miniframes" "shadow" "sidebar" "smoothbars"
+      "smoothtree" "split" "tree")
+     (set :inline t
+         (const "default")
+         (const "infolines")
+         (const "miniframes")
+         (const "shadow")
+         (const "sidebar")
+         (const "smoothbars")
+         (const "smoothtree")
+         (const "split")
+         (const "tree"))
+     (repeat :inline t
+            :tag "Other"
+            (string)))))
+
+(defcustom LaTeX-beamer-color-themes 'local
+  "Presentation color themes for the LaTeX beamer package.
+It can be a list of themes or a function.  If it is the symbol
+`local', search only once per buffer."
+  :group 'LaTeX-style
+  :type
+  '(choice
+    (const :tag "TeX search" LaTeX-beamer-search-color-themes)
+    (const :tag "Search once per buffer" local)
+    (function :tag "Other function")
+    (list
+     :value
+     ("albatross" "beetle" "crane" "default" "dolphin" "dove" "fly" "lily"
+      "orchid" "rose" "seagull" "seahorse" "sidebartab" "structure" "whale")
+     (set :inline t
+         (const "albatross")
+         (const "beetle")
+         (const "crane")
+         (const "default")
+         (const "dolphin")
+         (const "dove")
+         (const "fly")
+         (const "lily")
+         (const "orchid")
+         (const "rose")
+         (const "seagull")
+         (const "seahorse")
+         (const "sidebartab")
+         (const "structure")
+         (const "whale"))
+     (repeat :inline t
+            :tag "Other"
+            (string)))))
+
+(defcustom LaTeX-beamer-font-themes 'local
+  "Presentation font themes for the LaTeX beamer package.
+It can be a list of themes or a function.  If it is the symbol
+`local', search only once per buffer."
+  :group 'LaTeX-style
+  :type
+  '(choice
+    (const :tag "TeX search" LaTeX-beamer-search-font-themes)
+    (const :tag "Search once per buffer" local)
+    (function :tag "Other function")
+    (list
+     :value
+     ("default" "professionalfonts" "serif" "structurebold"
+      "structureitalicserif" "structuresmallcapsserif")
+     (set :inline t
+         (const "default")
+         (const "professionalfonts")
+         (const "serif")
+         (const "structurebold")
+         (const "structureitalicserif")
+         (const "structuresmallcapsserif"))
+     (repeat :inline t
+            :tag "Other"
+            (string)))))
+
+;; style/comment.el
+
+(defcustom LaTeX-comment-env-list '("comment")
+  "List of environment names defined with comment.sty.
+Setting this variable does not take effect unless you
+reinitialize affected buffers."
+  :type '(repeat string)
+  :group 'LaTeX-style)
+
+;; style/csquotes.el
+
+(defcustom LaTeX-csquotes-quote-after-quote nil
+  "Initial value of `TeX-quote-after-quote' for `csquotes.el'"
+  :type 'boolean
+  :group 'LaTeX-style)
+
+(defcustom LaTeX-csquotes-open-quote ""
+  "Opening quotation mark to be used with the csquotes package.
+The specified string will be used for `TeX-open-quote' (and override
+any language-specific setting) only if both `LaTeX-csquotes-open-quote'
+and `LaTeX-csquotes-close-quote' are non-empty strings."
+  :type 'string
+  :group 'LaTeX-style)
+
+(defcustom LaTeX-csquotes-close-quote ""
+  "Closing quotation mark to be used with the csquotes package.
+The specified string will be used for `TeX-close-quote' (and override
+any language-specific setting) only if both `LaTeX-csquotes-open-quote'
+and `LaTeX-csquotes-close-quote' are non-empty strings."
+  :type 'string
+  :group 'LaTeX-style)
+
+;; style/emp.el
+
+(defcustom LaTeX-write18-enabled-p t
+  "*If non-nil, insert automatically the \\write18 calling metapost.
+When disabled, you have to use mpost on the mp files automatically 
+produced by emp.sty and then re-LaTeX the document."
+  :type 'boolean
+  :group 'LaTeX-style)
+
+;; style/graphicx.el
+
+(defcustom LaTeX-includegraphics-extensions
+  '("eps" "jpe?g" "pdf" "png")
+  "Extensions for images files used by \\includegraphics."
+  :group 'LaTeX-style
+  :type '(list (set :inline t
+                   (const "eps")
+                   (const "jpe?g")
+                   (const "pdf")
+                   (const "png"))
+              (repeat :inline t
+                      :tag "Other"
+                      (string))))
+
+(defcustom LaTeX-includegraphics-options-alist
+  '((0 width)
+    ;; (1 width height clip)
+    ;; (2 width height keepaspectratio clip)
+    (4) ;; --> (4 nil)
+    (5 trim)
+    (16
+     ;; Table 1 in epslatex.ps: ``includegraphics Options''
+     height totalheight width scale angle origin bb
+     ;; Table 2 in epslatex.ps: ``cropping Options''
+     viewport trim
+     ;; Table 3 in epslatex.ps: ``Boolean Options''
+     ;; [not implemented:] noclip draft final
+     clip keepaspectratio
+     ;; Only for PDF:
+     page))
+  "Controls for which optional arguments of \\includegraphics you get prompted.
+
+An alist, consisting of \(NUMBER . LIST\) pairs.  Valid elements of LIST are
+`width', `height', `keepaspectratio', `clip', `angle', `totalheight', `trim'
+and `bb' \(Bounding Box\).
+
+The list corresponding to 0 is used if no prefix is given.  Note that 4 \(one
+\\[universal-argument]\) and 16 \(two \\[universal-argument]'s\) are easy to
+type and should be used for frequently needed combinations."
+  :group 'LaTeX-style
+  :type '(repeat (cons (integer :tag "Argument")
+                      (list (set :inline t
+                                 (const height)
+                                 (const totalheight)
+                                 (const width)
+                                 (const scale)
+                                 (const angle)
+                                 (const origin)
+                                 (const :tag "Bounding Box" bb)
+                                 ;;
+                                 (const viewport)
+                                 (const trim)
+                                 ;;
+                                 (const clip)
+                                 (const keepaspectratio))))))
+
+(defcustom LaTeX-includegraphics-strip-extension-flag t
+  "Non-nil means to strip known extensions from image file name."
+  :group 'LaTeX-style
+  :type 'boolean)
+
+(defcustom LaTeX-includegraphics-read-file
+  'LaTeX-includegraphics-read-file-TeX
+  "Function for reading \\includegraphics files.
+
+`LaTeX-includegraphics-read-file-TeX' lists all graphic files
+found in the TeX search path.
+
+`LaTeX-includegraphics-read-file-relative' lists all graphic files
+in the master directory and its subdirectories and inserts the
+relative file name.  This option does not work with Emacs 21 or
+XEmacs.
+
+The custom option `simple' works as
+`LaTeX-includegraphics-read-file-relative' but it lists all kind of
+files.
+
+Inserting the subdirectory in the filename (as
+`LaTeX-includegraphics-read-file-relative') is discouraged by
+`epslatex.ps'."
+;; ,----[ epslatex.ps; Section 12; (page 26) ]
+;; | Instead of embedding the subdirectory in the filename, there are two
+;; | other options
+;; |   1. The best method is to modify the TeX search path [...]
+;; |   2. Another method is to specify sub/ in a \graphicspath command
+;; |      [...].  However this is much less efficient than modifying the
+;; |      TeX search path
+;; `----
+;; See "Inefficiency" and "Unportability" in the same section for more
+;; information.
+  :group 'LaTeX-style
+  :type '(choice (const :tag "TeX" LaTeX-includegraphics-read-file-TeX)
+                (const :tag "relative"
+                       LaTeX-includegraphics-read-file-relative)
+                (const :tag "simple" (lambda ()
+                                       (file-relative-name
+                                        (read-file-name "Image file: ")
+                                        (TeX-master-directory))))
+                (function :tag "other")))
+
+;; style/shortvrb.el
+
+(defcustom LaTeX-shortvrb-chars '(?|)
+  "List of characters toggling verbatim mode."
+  :group 'LaTeX-style
+  :type '(repeat character))
+
+(provide 'tex-style)
+
+;;; tex-style.el ends here
diff --git a/packages/auctex/tex.el b/packages/auctex/tex.el
new file mode 100644 (file)
index 0000000..0ff821c
--- /dev/null
@@ -0,0 +1,5605 @@
+;;; tex.el --- Support for TeX documents.
+
+;; Copyright (C) 1985-1987, 1991, 1993, 1994, 1996, 1997, 1999-2013
+;;   Free Software Foundation, Inc.
+
+;; Maintainer: auctex-devel@gnu.org
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file provides AUCTeX support for plain TeX as well as basic
+;; functions used by other AUCTeX modes (e.g. for LaTeX, Texinfo and
+;; ConTeXt).
+
+;;; Code:
+
+(when (< emacs-major-version 21)
+  (error "AUCTeX requires Emacs 21 or later"))
+
+(require 'custom)
+(require 'tex-site)
+(eval-when-compile
+  (require 'cl))
+
+(defun TeX--call-3/2 (f arg1 arg2 arg3)
+  (condition-case nil
+      (funcall f arg1 arg2 arg3)
+    (wrong-number-of-arguments (funcall f arg1 arg2))))
+
+(defgroup TeX-file nil
+  "Files used by AUCTeX."
+  :group 'AUCTeX)
+
+(defgroup TeX-command nil
+  "Calling external commands from AUCTeX."
+  :group 'AUCTeX)
+
+(defgroup LaTeX nil
+  "LaTeX support in AUCTeX."
+  :tag "LaTeX"
+  :group 'AUCTeX
+  :prefix "LaTeX-")
+
+(defgroup TeX-misc nil
+  "Various AUCTeX settings."
+  :group 'AUCTeX)
+
+;;; Site Customization
+;;
+;; The following variables are likely to need to be changed for your
+;; site.  You should do this with customize.  Here is the beef: If you
+;; want to print, TeX-print-command must be non-nil (if it is nil,
+;; you'll get a complaint when using the print menu).  If you want to
+;; view the queue, TeX-queue-command needs to be non-nil (if it is
+;; nil, it won't get mentioned in the menu).  If TeX-printer-list is
+;; nil, nothing else gets asked: the menu entries lead directly to the
+;; respective commands.  If those commands contain %p, the value of
+;; TeX-printer-default gets inserted there, no questions asked.  Now
+;; if TeX-printer-list is non-nil, you'll always get asked which
+;; printer you want to use.  You can enter a configured printer from
+;; TeX-printer-list, or an unknown one.  The respective menus will
+;; show all configured printers.  Since you can enter unknown
+;; printers, the printer name _must_ be set with %p in
+;; TeX-print-command.
+
+;; How to print.
+
+(defcustom TeX-print-command "%(o?)dvips -P%p %r %s"
+  "*Command used to print a file.
+
+First `%p' is expanded to the printer name, then ordinary expansion is
+performed as specified in `TeX-expand-list'.  If it is nil,
+then customization is requested."
+  :group 'TeX-command
+  :type '(choice (string :tag "Print command")
+                (const :tag "No print command customized" nil)))
+
+(defcustom TeX-command "tex"
+  "Command to run plain TeX."
+  :group 'TeX-command
+  :type 'string)
+
+(defcustom TeX-Omega-command "omega"
+  "Command to run plain TeX on Omega."
+  :group 'TeX-command
+  :type 'string)
+
+(defcustom LaTeX-command "latex"
+  "Command to run LaTeX."
+  :group 'TeX-command
+  :type 'string)
+
+(defcustom LaTeX-Omega-command "lambda"
+  "Command to run LaTeX on Omega."
+  :group 'TeX-command
+  :type 'string)
+
+(defcustom ConTeXt-engine nil
+  "Engine to use for --engine in the texexec command.
+If nil, none is specified."
+  :group 'TeX-command
+  :type '(choice (const :tag "Unspecified" nil)
+                string))
+
+(defcustom ConTeXt-Omega-engine TeX-Omega-command
+  "Engine to use for --engine in the texexec command in Omega mode.
+If nil, none is specified."
+  :group 'TeX-command
+  :type '(choice (const :tag "Unspecified" nil)
+                string))
+;; At least in TeXLive 2009 ConTeXt does not support an omega option anymore.
+(TeX--call-3/2 #'make-obsolete-variable 'ConTeXt-Omega-engine
+               'TeX-engine-alist "before 11.86")
+
+(defcustom TeX-queue-command "lpq -P%p"
+  "*Command used to show the status of a printer queue.
+
+First `%p' is expanded to the printer name, then ordinary expansion is
+performed as specified in `TeX-expand-list'.  If this is nil,
+the printer has no corresponding command."
+  :group 'TeX-command
+  :type '(choice (string :tag "Queue check command")
+                (const :tag "No such command" nil)))
+
+(defcustom TeX-mode-hook nil
+  "A hook run in TeX mode buffers."
+  :type 'hook
+  :group 'TeX-misc)
+
+(defcustom AmS-TeX-mode-hook nil
+  "A hook run in AmS-TeX mode buffers."
+  :type 'hook
+  :group 'TeX-misc)
+
+;; This is the major configuration variable.  Most sites will only
+;; need to change the second string in each entry, which is the name
+;; of a command to send to the shell.  If you use other formatters
+;; like AMSLaTeX or AMSTeX, you can add those to the list.  See
+;; TeX-expand-list for a description of the % escapes
+
+(defcustom TeX-command-list
+  `(("TeX" "%(PDF)%(tex) %`%S%(PDFout)%(mode)%' %t"
+     TeX-run-TeX nil
+     (plain-tex-mode ams-tex-mode texinfo-mode) :help "Run plain TeX")
+    ("LaTeX" "%`%l%(mode)%' %t"
+     TeX-run-TeX nil
+     (latex-mode doctex-mode) :help "Run LaTeX")
+       ;; Not part of standard TeX.
+    ("Makeinfo" "makeinfo %t" TeX-run-compile nil
+     (texinfo-mode) :help "Run Makeinfo with Info output")
+    ("Makeinfo HTML" "makeinfo --html %t" TeX-run-compile nil
+     (texinfo-mode) :help "Run Makeinfo with HTML output")
+    ("AmSTeX" "%(PDF)amstex %`%S%(PDFout)%(mode)%' %t"
+     TeX-run-TeX nil (ams-tex-mode) :help "Run AMSTeX")
+    ;; support for ConTeXt  --pg
+    ;; first version of ConTeXt to support nonstopmode: 2003.2.10
+    ("ConTeXt" "texexec --once --texutil %(execopts)%t"
+     TeX-run-TeX nil (context-mode) :help "Run ConTeXt once")
+    ("ConTeXt Full" "texexec %(execopts)%t"
+     TeX-run-TeX nil
+     (context-mode) :help "Run ConTeXt until completion")
+    ("BibTeX" "bibtex %s" TeX-run-BibTeX nil t :help "Run BibTeX")
+    ,(if (or window-system (getenv "DISPLAY"))
+       '("View" "%V" TeX-run-discard-or-function t t :help "Run Viewer")
+       '("View" "dvi2tty -q -w 132 %s" TeX-run-command t t
+        :help "Run Text viewer"))
+    ("Print" "%p" TeX-run-command t t :help "Print the file")
+    ("Queue" "%q" TeX-run-background nil t :help "View the printer queue"
+     :visible TeX-queue-command)
+    ("File" "%(o?)dvips %d -o %f " TeX-run-command t t
+     :help "Generate PostScript file")
+    ("Index" "makeindex %s" TeX-run-command nil t :help "Create index file")
+    ("Check" "lacheck %s" TeX-run-compile nil (latex-mode)
+     :help "Check LaTeX file for correctness")
+    ("Spell" "(TeX-ispell-document \"\")" TeX-run-function nil t
+     :help "Spell-check the document")
+    ("Clean" "TeX-clean" TeX-run-function nil t
+     :help "Delete generated intermediate files")
+    ("Clean All" "(TeX-clean t)" TeX-run-function nil t
+     :help "Delete generated intermediate and output files")
+    ("Other" "" TeX-run-command t t :help "Run an arbitrary command"))
+  "List of commands to execute on the current document.
+
+Each element is a list, whose first element is the name of the command
+as it will be presented to the user.
+
+The second element is the string handed to the shell after being
+expanded.  The expansion is done using the information found in
+`TeX-expand-list'.
+
+The third element is the function which actually start the process.
+Several such hooks has been defined:
+
+TeX-run-command: Start up the process and show the output in a
+separate buffer.  Check that there is not two commands running for the
+same file.  Return the process object.
+
+TeX-run-format: As `TeX-run-command', but assume the output is created
+by a TeX macro package.  Return the process object.
+
+TeX-run-TeX: For TeX output.
+
+TeX-run-interactive: Run TeX or LaTeX interactively.
+
+TeX-run-BibTeX: For BibTeX output.
+
+TeX-run-compile: Use `compile' to run the process.
+
+TeX-run-shell: Use `shell-command' to run the process.
+
+TeX-run-discard: Start the process in the background, discarding its
+output.
+
+TeX-run-background: Start the process in the background, show output
+in other window.
+
+TeX-run-silent: Start the process in the background.
+
+TeX-run-discard-foreground: Start the process in the foreground,
+discarding its output.
+
+TeX-run-function: Execute the Lisp function or function call
+specified by the string in the second element.  Consequently,
+this hook does not start a process.
+
+TeX-run-discard-or-function: If the command is a Lisp function,
+execute it as such, otherwise start the command as a process,
+discarding its output.
+
+To create your own hook, define a function taking three arguments: The
+name of the command, the command string, and the name of the file to
+process.  It might be useful to use `TeX-run-command' in order to
+create an asynchronous process.
+
+If the fourth element is non-nil, the user will get a chance to
+modify the expanded string.
+
+The fifth element indicates in which mode(s) the command should be
+present in the Command menu.  Use t if it should be active in any
+mode.  If it should only be present in some modes, specify a list with
+the respective mode names.
+
+Any additional elements get just transferred to the respective menu entries."
+  :group 'TeX-command
+  :type '(repeat (group :value ("" "" TeX-run-command nil t)
+                       (string :tag "Name")
+                       (string :tag "Command")
+                       (choice :tag "How"
+                               :value TeX-run-command
+                               (function-item TeX-run-command)
+                               (function-item TeX-run-format)
+                               (function-item TeX-run-TeX)
+                               (function-item TeX-run-interactive)
+                               (function-item TeX-run-BibTeX)
+                               (function-item TeX-run-compile)
+                               (function-item TeX-run-shell)
+                               (function-item TeX-run-discard)
+                               (function-item TeX-run-background)
+                               (function-item TeX-run-silent)
+                               (function-item TeX-run-discard-foreground)
+                               (function-item TeX-run-function)
+                               (function-item TeX-run-discard-or-function)
+                               (function :tag "Other"))
+                       (boolean :tag "Prompt")
+                       (choice :tag "Modes"
+                               (const :tag "All" t)
+                               (set (const :tag "Plain TeX" plain-tex-mode)
+                                    (const :tag "LaTeX" latex-mode)
+                                    (const :tag "DocTeX" doctex-mode)
+                                    (const :tag "ConTeXt" context-mode)
+                                    (const :tag "Texinfo" texinfo-mode)
+                                    (const :tag "AmSTeX" ams-tex-mode)))
+                       (repeat :tag "Menu elements" :inline t sexp))))
+
+(defcustom TeX-command-output-list
+  '(
+; Add the following line if you want to use htlatex (tex4ht)
+;    ("\\`htlatex" ("html"))
+    )
+  "List of regexps and file extensions.
+
+Each element is a list, whose first element is a regular expression to
+match against the name of the command that will be used to process the TeX
+file.
+
+The second element is either a string or a list with a string as element.
+If it is a string this is the default file extension that will be expected
+for output files that are produced by commands that match the first
+element.  The real file extension will be obtained from the logging output
+if possible, defaulting to the given string.
+If it is a list, the element of the list will be the fixed extension used
+without looking at the logging output.
+
+If this list does not yield an extension, the default is either \"dvi\"
+or \"pdf\", depending on the setting of `TeX-PDF-mode'.
+Extensions must be given without the \".\"."
+
+  :group 'TeX-command
+  :type '(repeat (group (regexp :tag "Command Regexp")
+                       (choice (string :tag "Default Extension")
+                               (group (string :tag "Fixed Extension"))))))
+
+;; You may want to change the default LaTeX version for your site.
+(defcustom LaTeX-version "2e"
+  "Default LaTeX version.  Currently recognized is \"2\" and \"2e\"."
+  :group 'LaTeX
+  :type '(radio (const :format "%v\n%h"
+                      :doc "\
+The executable `latex' is LaTeX version 2."
+                      "2")
+               (const :format "%v\n%h"
+                      :doc "\
+The executable `latex' is LaTeX version 2e."
+                      "2e")
+               (string :tag "Other")))
+
+
+;; Use different compilation commands depending on style.
+;; Only works if parsing is enabled.
+
+(defcustom LaTeX-command-style
+  ;; They have all been combined in LaTeX 2e.
+  '(("" "%(PDF)%(latex) %S%(PDFout)"))
+"List of style options and LaTeX commands.
+
+If the first element (a regular expression) matches the name of one of
+the style files, any occurrence of the string `%l' in a command in
+`TeX-command-list' will be replaced with the second element.  The first
+match is used, if no match is found the `%l' is replaced with the empty
+string."
+  :group 'TeX-command
+  :type '(repeat (group :value ("" "")
+                       regexp (string :tag "Style"))))
+
+;; Enter the names of the printers available at your site, or nil if
+;; you only have one printer.
+
+(defcustom TeX-printer-list
+  '(("Default" "%(o?)dvips -f %s | lpr" "lpq"))
+  "List of available printers.
+
+The first element of each entry is the printer name.
+
+The second element is the command used to print to this
+printer.  It defaults to the value of `TeX-print-command' when nil.
+
+The third element is the command used to examine the print queue for
+this printer.  It defaults to the value of `TeX-queue-command' similarly.
+
+Any occurrence of `%p' in the second or third element is expanded to
+the printer name given in the first element, then ordinary expansion
+is performed as specified in `TeX-expand-list'.
+
+If this list is empty, only `TeX-print-command' and `TeX-queue-command'
+get consulted."
+  :group 'TeX-command
+  :type '(repeat (group (string :tag "Name")
+                       (option (group :inline t
+                                      :extra-offset -4
+                                      (choice :tag "Print"
+                                              (const :tag "default")
+                                              (string :format "%v"))
+                                      (option (choice :tag "Queue"
+                                                      (const :tag "default")
+                                                      (string
+                                                       :format "%v"))))))))
+
+;; The name of the most used printer.
+
+(defcustom TeX-printer-default (or (getenv "PRINTER")
+                                  (and TeX-printer-list
+                                       (car (car TeX-printer-list)))
+                                  "lp")
+  "*Default printer to use with `TeX-command'."
+  :group 'TeX-command
+  :type 'string)
+
+(defcustom TeX-print-style '(("^landscape$" "-t landscape"))
+  "List of style options and print options.
+
+If the first element (a regular expression) matches the name of one of
+the style files, any occurrence of the string `%r' in a command in
+`TeX-command-list' will be replaced with the second element.  The first
+match is used, if no match is found the `%r' is replaced with the empty
+string."
+  :group 'TeX-command
+  :type '(repeat (group regexp (string :tag "Command"))))
+
+;; This is the list of expansion for the commands in
+;; TeX-command-list.  Not likely to be changed, but you may e.g. want
+;; to handle .ps files.
+
+(defcustom TeX-expand-list
+  '(("%p" TeX-printer-query)   ;%p must be the first entry
+    ("%q" (lambda ()
+           (TeX-printer-query t)))
+    ("%V" (lambda ()
+           (TeX-source-correlate-start-server-maybe)
+           (TeX-view-command-raw)))
+    ("%vv" (lambda ()
+           (TeX-source-correlate-start-server-maybe)
+           (TeX-output-style-check TeX-output-view-style)))
+    ("%v" (lambda ()
+           (TeX-source-correlate-start-server-maybe)
+           (TeX-style-check TeX-view-style)))
+    ("%r" (lambda ()
+           (TeX-style-check TeX-print-style)))
+    ("%l" (lambda ()
+           (TeX-style-check LaTeX-command-style)))
+    ("%(PDF)" (lambda ()
+               (if (and (eq TeX-engine 'default)
+                        (or TeX-PDF-mode
+                            TeX-DVI-via-PDFTeX))
+                   "pdf"
+                 "")))
+    ("%(PDFout)" (lambda ()
+                  (cond ((and (eq TeX-engine 'xetex)
+                              (not TeX-PDF-mode))
+                         " -no-pdf")
+                        ((and (eq TeX-engine 'luatex)
+                              (not TeX-PDF-mode))
+                         " --output-format=dvi")
+                        ((and (eq TeX-engine 'default)
+                              (not TeX-PDF-mode)
+                              TeX-DVI-via-PDFTeX)
+                         " \"\\pdfoutput=0 \"")
+                        (t ""))))
+    ("%(mode)" (lambda ()
+                (if TeX-interactive-mode
+                    ""
+                  " -interaction=nonstopmode")))
+    ("%(o?)" (lambda () (if (eq TeX-engine 'omega) "o" "")))
+    ("%(tex)" (lambda () (eval (nth 2 (assq TeX-engine (TeX-engine-alist))))))
+    ("%(latex)" (lambda () (eval (nth 3 (assq TeX-engine (TeX-engine-alist))))))
+    ("%(execopts)" ConTeXt-expand-options)
+    ("%S" TeX-source-correlate-expand-options)
+    ("%dS" TeX-source-specials-view-expand-options)
+    ("%cS" TeX-source-specials-view-expand-client)
+    ("%(outpage)" (lambda ()
+                   (if TeX-source-correlate-output-page-function
+                       (funcall TeX-source-correlate-output-page-function)
+                     "1")))
+    ;; `file' means to call `TeX-master-file' or `TeX-region-file'
+    ("%s" file nil t)
+    ("%t" file t t)
+    ("%`" (lambda nil
+           (setq TeX-command-pos t TeX-command-text "")))
+    (" \"\\" (lambda nil
+              (if (eq TeX-command-pos t)
+                  (setq TeX-command-pos pos
+                        pos (+ 3 pos))
+                (setq pos (1+ pos)))))
+    ("\"" (lambda nil (if (numberp TeX-command-pos)
+                         (setq TeX-command-text
+                               (concat
+                                TeX-command-text
+                                (substring command
+                                           TeX-command-pos
+                                           (1+ pos)))
+                               command
+                               (concat
+                                (substring command
+                                           0
+                                           TeX-command-pos)
+                                (substring command
+                                           (1+ pos)))
+                               pos TeX-command-pos
+                               TeX-command-pos t)
+                       (setq pos (1+ pos)))))
+    ("%'" (lambda nil
+           (prog1
+               (if (stringp TeX-command-text)
+                   (progn
+                     (setq pos (+ (length TeX-command-text) 9)
+                           TeX-command-pos
+                           (and (string-match " "
+                                             (funcall file t t))
+                                "\""))
+                     (concat TeX-command-text " \"\\input\""))
+                 (setq TeX-command-pos nil)
+                 "")
+             (setq TeX-command-text nil))))
+    ("%n" TeX-current-line)
+    ("%d" file "dvi" t)
+    ("%f" file "ps" t)
+    ("%o" (lambda nil (funcall file (TeX-output-extension) t)))
+    ;; for source specials the file name generated for the xdvi
+    ;; command needs to be relative to the master file, just in
+    ;; case the file is in a different subdirectory
+    ("%b" TeX-current-file-name-master-relative)
+    ;; the following is for preview-latex.
+    ("%m" preview-create-subdirectory))
+  "List of expansion strings for TeX command names.
+
+Each entry is a list with two or more elements.  The first element is
+the string to be expanded.  The second element is the name of a
+function returning the expanded string when called with the remaining
+elements as arguments.  The special value `file' will be expanded to
+the name of the file being processed, with an optional extension."
+  :group 'TeX-command
+  :type '(repeat (group (string :tag "Key")
+                       (sexp :tag "Expander")
+                       (repeat :inline t
+                               :tag "Arguments"
+                               (sexp :format "%v")))))
+
+
+;; The following dependencies are not done with autoload cookies since
+;; they are only useful when tex.el is loaded, anyway.  tex-buf.el
+;; should remain unloaded as long as one is only editing files, so
+;; requiring it here would be wrong.
+
+(autoload 'TeX-region-create "tex-buf" nil nil)
+(autoload 'TeX-save-document "tex-buf" nil t)
+(autoload 'TeX-home-buffer "tex-buf" nil t)
+(autoload 'TeX-pin-region "tex-buf" nil t)
+(autoload 'TeX-command-region "tex-buf" nil t)
+(autoload 'TeX-command-buffer "tex-buf" nil t)
+(autoload 'TeX-command-master "tex-buf" nil t)
+(autoload 'TeX-command "tex-buf" nil nil)
+(autoload 'TeX-kill-job "tex-buf" nil t)
+(autoload 'TeX-recenter-output-buffer "tex-buf" nil t)
+(autoload 'TeX-next-error "tex-buf" nil t)
+(autoload 'TeX-region-file "tex-buf" nil nil)
+(autoload 'TeX-current-offset "tex-buf" nil nil)
+(autoload 'TeX-process-set-variable "tex-buf" nil nil)
+(autoload 'TeX-view "tex-buf" nil t)
+
+;;; Portability.
+
+(require 'easymenu)
+
+(eval-and-compile
+  (if (featurep 'xemacs)
+      (defun TeX-maybe-remove-help (menu)
+      "Removes :help entries from menus, since XEmacs does not like them.
+Also does other stuff."
+      (cond ((consp menu)
+            (cond ((eq (car menu) :help)
+                   (TeX-maybe-remove-help (cddr menu)))
+                  ((eq (car menu) :visible)
+                   (cons :included
+                         (cons (cadr menu)
+                               (TeX-maybe-remove-help (cddr menu)))))
+                  (t (cons (TeX-maybe-remove-help (car menu))
+                           (TeX-maybe-remove-help (cdr menu))))))
+           ((vectorp menu)
+            (vconcat (TeX-maybe-remove-help (append menu nil))))
+           (t menu)))
+    (defun TeX-maybe-remove-help (menu)
+      "Compatibility function that would remove :help entries if on XEmacs,
+but does nothing in Emacs."
+      menu))
+  (defmacro TeX-menu-with-help (menu)
+    "Compatibility macro that removes :help entries if on XEmacs.
+Also does other stuff."
+    (TeX-maybe-remove-help menu)))
+
+
+;;; Documentation for Info-goto-emacs-command-node and similar
+
+(eval-after-load 'info '(dolist (elt '("TeX" "LaTeX" "ConTeXt" "Texinfo"
+                                      "docTeX"))
+                         (add-to-list 'Info-file-list-for-emacs
+                                      (cons elt "AUCTeX"))))
+
+(defadvice hack-one-local-variable (after TeX-hack-one-local-variable-after
+                                         activate)
+  "Call minor mode function if minor mode variable is found."
+  (let ((var (ad-get-arg 0))
+       (val (ad-get-arg 1)))
+    ;; Instead of checking for each mode explicitely `minor-mode-list'
+    ;; could be used.  But this may make the byte compiler pop up.
+    (when (memq var '(TeX-PDF-mode
+                     TeX-source-correlate-mode TeX-interactive-mode
+                     TeX-fold-mode LaTeX-math-mode))
+      (if (symbol-value val) (funcall var 1) (funcall var 0)))))
+
+(defvar TeX-overlay-priority-step 16
+  "Numerical difference of priorities between nested overlays.
+The step should be big enough to allow setting a priority for new
+overlays between two existing ones.")
+
+
+;;; Special support for XEmacs
+
+(when (featurep 'xemacs)
+
+  (defun TeX-read-string
+    (prompt &optional initial-input history default-value)
+    (condition-case nil
+       (read-string prompt initial-input history default-value t)
+      (wrong-number-of-arguments
+       (read-string prompt initial-input history default-value))))
+
+  (defun TeX-mark-active ()
+    ;; In Lucid (mark) returns nil when not active.
+    (if zmacs-regions
+       (mark)
+      (mark t)))
+
+  (defun TeX-active-mark ()
+    (and zmacs-regions (mark)))
+
+  (fset 'TeX-activate-region (symbol-function 'zmacs-activate-region))
+
+  ;; I am aware that this counteracts coding conventions but I am sick
+  ;; of it.
+  (unless (fboundp 'line-beginning-position)
+    (defalias 'line-beginning-position 'point-at-bol))
+  (unless (fboundp 'line-end-position)
+    (defalias 'line-end-position 'point-at-eol))
+
+  (defun TeX-overlay-prioritize (start end)
+    "Calculate a priority for an overlay extending from START to END.
+The calculated priority is lower than the minimum of priorities
+of surrounding overlays and higher than the maximum of enclosed
+overlays."
+    (let (inner-priority outer-priority
+                        (prios (cons nil nil)))
+      (map-extents
+       #'(lambda (ov prios)
+          (and
+           (or (eq (extent-property ov 'category) 'TeX-fold)
+               (extent-property ov 'preview-state))
+           (setcar prios
+                   (max (or (car prios) 0)
+                        (extent-property ov 'priority))))
+          nil)
+       nil start end prios 'start-and-end-in-region 'priority)
+      (map-extents
+       #'(lambda (ov prios)
+          (and
+           (or (eq (extent-property ov 'category) 'TeX-fold)
+               (extent-property ov 'preview-state))
+           (setcdr prios
+                   (min (or (cdr prios) most-positive-fixnum)
+                        (extent-property ov 'priority))))
+          nil)
+       nil start end prios
+       '(start-and-end-in-region negate-in-region) 'priority)
+      (setq inner-priority (car prios) outer-priority (cdr prios))
+      (cond ((and inner-priority (not outer-priority))
+            (+ inner-priority TeX-overlay-priority-step))
+           ((and (not inner-priority) outer-priority)
+            (/ outer-priority 2))
+           ((and inner-priority outer-priority)
+            (+ (/ (- outer-priority inner-priority) 2) inner-priority))
+           (t TeX-overlay-priority-step)))) )
+
+
+(if (fboundp 'completing-read-multiple)
+    (defalias 'TeX-completing-read-multiple 'completing-read-multiple)
+  (defun TeX-completing-read-multiple
+    (prompt table &optional predicate require-match initial-input
+           hist def inherit-input-method)
+    "Poor mans implementation of Emacs' `completing-read-multiple' for XEmacs.
+The XEmacs package edit-utils-2.32 includes `crm.el'."
+    (multi-prompt "," nil prompt table predicate require-match initial-input
+                 hist)))
+
+(if (fboundp 'line-number-at-pos)
+    (defalias 'TeX-line-number-at-pos 'line-number-at-pos)
+  ;; `line-number-at-pos' from `simple.el' in Emacs CVS (2006-06-07)
+  (defun TeX-line-number-at-pos (&optional pos)
+    "Return (narrowed) buffer line number at position POS.
+If POS is nil, use current buffer location."
+    (let ((opoint (or pos (point))) start)
+      (save-excursion
+       (goto-char (point-min))
+       (setq start (point))
+       (goto-char opoint)
+       (forward-line 0)
+       (1+ (count-lines start (point)))))))
+
+;;; Special support for GNU Emacs
+
+(unless (featurep 'xemacs)
+
+  (defun TeX-read-string (prompt &optional initial-input history default-value)
+    (read-string prompt initial-input history default-value t))
+  
+  (defun TeX-mark-active ()
+    ;; In FSF 19 mark-active indicates if mark is active.
+    mark-active)
+
+  (defun TeX-active-mark ()
+    (and transient-mark-mode mark-active))
+
+  (defun TeX-activate-region ()
+    nil)
+
+  (defun TeX-overlay-prioritize (start end)
+    "Calculate a priority for an overlay extending from START to END.
+The calculated priority is lower than the minimum of priorities
+of surrounding overlays and higher than the maximum of enclosed
+overlays."
+    (let (outer-priority inner-priority ov-priority)
+      (dolist (ov (overlays-in start end))
+       (when (or (eq (overlay-get ov 'category) 'TeX-fold)
+                 (overlay-get ov 'preview-state))
+         (setq ov-priority (overlay-get ov 'priority))
+         (if (>= (overlay-start ov) start)
+             (setq inner-priority (max ov-priority (or inner-priority
+                                                       ov-priority)))
+           (setq outer-priority (min ov-priority (or outer-priority
+                                                     ov-priority))))))
+      (cond ((and inner-priority (not outer-priority))
+            (+ inner-priority TeX-overlay-priority-step))
+           ((and (not inner-priority) outer-priority)
+            (/ outer-priority 2))
+           ((and inner-priority outer-priority)
+            (+ (/ (- outer-priority inner-priority) 2) inner-priority))
+           (t TeX-overlay-priority-step)))) )
+
+(defun TeX-delete-dups-by-car (alist &optional keep-list)
+  "Return a list of all elements in ALIST, but each car only once.
+Elements of KEEP-LIST are not removed even if duplicate."
+  ;; Copy of `reftex-uniquify-by-car' (written by David Kastrup).
+  (setq keep-list (sort (copy-sequence keep-list) #'string<))
+  (setq alist (sort (copy-sequence alist)
+                   (lambda (a b)
+                     (string< (car a) (car b)))))
+  (let ((new alist) elt)
+    (while new
+      (setq elt (caar new))
+      (while (and keep-list (string< (car keep-list) elt))
+       (setq keep-list (cdr keep-list)))
+      (unless (and keep-list (string= elt (car keep-list)))
+       (while (string= elt (car (cadr new)))
+         (setcdr new (cddr new))))
+      (setq new (cdr new))))
+  alist)
+
+(defun TeX-delete-duplicate-strings (list)
+  "Return a list of all strings in LIST, but each only once."
+  (setq list (TeX-sort-strings list))
+  (let ((new list) elt)
+    (while new
+      (setq elt (car new))
+      (while (string= elt (cadr new))
+       (setcdr new (cddr new)))
+      (setq new (cdr new))))
+  list)
+
+(defun TeX-sort-strings (list)
+  "Return sorted list of all strings in LIST."
+  (sort (copy-sequence list) #'string<))
+
+;;; Buffer
+
+(defgroup TeX-output nil
+  "Parsing TeX output."
+  :prefix "TeX-"
+  :group 'AUCTeX)
+
+(defcustom TeX-display-help t
+  "Control type of help display when stepping through errors with \\[TeX-next-error].
+If t display help buffer.  If nil display message about error in
+echo area.  If `expert' display output buffer with raw processor output."
+  :group 'TeX-output
+  :type '(choice (const :tag "Help buffer" t)
+                (const :tag "Echo area" nil)
+                (const :tag "Output buffer" expert)))
+
+(defcustom TeX-debug-bad-boxes nil
+  "Non-nil means also find overfull/underfull box warnings with \\[TeX-next-error]."
+  :group 'TeX-output
+  :type 'boolean)
+
+(defcustom TeX-debug-warnings nil
+  "Non-nil means also find LaTeX or package warnings with \\[TeX-next-error]."
+  :group 'TeX-output
+  :type 'boolean)
+
+(defun TeX-toggle-debug-bad-boxes ()
+  "Toggle if the debugger should display \"bad boxes\" too."
+  (interactive)
+  (setq TeX-debug-bad-boxes (not TeX-debug-bad-boxes))
+  (message (concat "TeX-debug-bad-boxes: "
+                  (if TeX-debug-bad-boxes "on" "off"))))
+
+(defun TeX-toggle-debug-warnings ()
+  "Toggle if the debugger should display warnings too."
+  (interactive)
+  (setq TeX-debug-warnings (not TeX-debug-warnings))
+  (message (concat "TeX-debug-warnings: "
+                  (if TeX-debug-warnings "on" "off"))))
+
+;;; Mode names.
+
+(defvar TeX-base-mode-name nil
+  "Base name of mode.")
+(make-variable-buffer-local 'TeX-base-mode-name)
+
+(defun TeX-set-mode-name (&optional changed local reset)
+  "Build and set the mode name.
+The base mode name will be concatenated with indicators for
+helper modes where appropriate.
+
+If CHANGED is non-nil, it indicates which global mode
+may have changed so that all corresponding buffers
+without a local value might get their name updated.
+A value of t will thus update all buffer names.
+
+If LOCAL is non-nil and CHANGED is buffer-local, only
+a local change has been performed and only the local
+name is to be updated.
+
+If RESET is non-nil, `TeX-command-next' is reset to
+`TeX-command-default' in updated buffers."
+  (if (and changed
+          (not (and local (local-variable-p changed (current-buffer)))))
+      (dolist (buffer (buffer-list))
+       (and (local-variable-p 'TeX-mode-p buffer)
+            (not (local-variable-p changed buffer))
+            (with-current-buffer buffer (TeX-set-mode-name nil nil reset))))
+    (if TeX-mode-p
+       (let ((trailing-flags
+              (concat
+               (and (boundp 'TeX-fold-mode) TeX-fold-mode "F")
+               (and (boundp 'LaTeX-math-mode) LaTeX-math-mode "M")
+               (and TeX-PDF-mode "P")
+               (and TeX-interactive-mode "I")
+               (and TeX-source-correlate-mode "S"))))
+         (setq mode-name (concat TeX-base-mode-name
+                                 (when (> (length trailing-flags) 0)
+                                   (concat "/" trailing-flags))))
+         (when reset
+           (TeX-process-set-variable (TeX-master-file)
+                                     'TeX-command-next TeX-command-default)
+           (TeX-process-set-variable (TeX-region-file)
+                                     'TeX-command-next TeX-command-default))
+         (set-buffer-modified-p (buffer-modified-p))))))
+
+(defun TeX-mode-prefix ()
+  "Return the prefix of the current mode as string."
+  (cdr (assoc major-mode '((plain-tex-mode . "plain-TeX")
+                          (latex-mode . "LaTeX")
+                          (doctex-mode . "docTeX")
+                          (texinfo-mode . "Texinfo")
+                          (context-mode . "ConTeXt")))))
+
+;;; Viewing
+
+(defgroup TeX-view nil
+  "Calling viewers from AUCTeX."
+  :group 'TeX-command)
+
+(defcustom TeX-view-style
+  `((,(concat
+      "^" (regexp-opt '("a4paper" "a4dutch" "a4wide" "sem-a4")) "$")
+     "%(o?)xdvi %dS -paper a4 %d")
+    (,(concat "^" (regexp-opt '("a5paper" "a5comb")) "$")
+     "%(o?)xdvi %dS -paper a5 %d")
+    ("^b5paper$" "%(o?)xdvi %dS -paper b5 %d")
+    ("^letterpaper$" "%(o?)xdvi %dS -paper us %d")
+    ("^legalpaper$" "%(o?)xdvi %dS -paper legal %d")
+    ("^executivepaper$" "%(o?)xdvi %dS -paper 7.25x10.5in %d")
+    ("^landscape$" "%(o?)xdvi %dS -paper a4r -s 0 %d")
+    ;; The latest xdvi can show embedded postscript.  If you don't
+    ;; have that, uncomment next line.
+    ;; ("^epsf$" "ghostview %f")
+    ("." "%(o?)xdvi %dS %d"))
+  "List of style options and view options.
+
+If the first element (a regular expression) matches the name of
+one of the style files, any occurrence of the string `%v' in a
+command in `TeX-command-list' will be replaced with the second
+element.  The first match is used, if no match is found the `%v'
+is replaced with the empty string.
+
+As a default, the \"View\" command in `TeX-command-list' is set
+to `%V'.  This means that `TeX-output-view-style' will be
+consulted before `TeX-view-style'.  Only if no match is found in
+`TeX-output-view-style' the settings in `TeX-view-style' will be
+considered.  If you want to bypass `TeX-output-view-style', which
+is not recommended because it is more powerful than
+`TeX-view-style', use `%v' in the \"View\" command."
+  :group 'TeX-view
+  :type '(repeat (group regexp (string :tag "Command"))))
+
+(defcustom TeX-output-view-style
+  `(("^dvi$" ("^landscape$" "^pstricks$\\|^pst-\\|^psfrag$")
+     "%(o?)dvips -t landscape %d -o && gv %f")
+    ("^dvi$" "^pstricks$\\|^pst-\\|^psfrag$" "%(o?)dvips %d -o && gv %f")
+    ("^dvi$" (,(concat
+               "^" (regexp-opt '("a4paper" "a4dutch" "a4wide" "sem-a4")) "$")
+             "^landscape$")
+     "%(o?)xdvi %dS -paper a4r -s 0 %d")
+    ("^dvi$" ,(concat
+              "^" (regexp-opt '("a4paper" "a4dutch" "a4wide" "sem-a4")) "$")
+     "%(o?)xdvi %dS -paper a4 %d")
+    ("^dvi$" (,(concat "^" (regexp-opt '("a5paper" "a5comb")) "$")
+             "^landscape$")
+     "%(o?)xdvi %dS -paper a5r -s 0 %d")
+    ("^dvi$" ,(concat "^" (regexp-opt '("a5paper" "a5comb")) "$")
+     "%(o?)xdvi %dS -paper a5 %d")
+    ("^dvi$" "^b5paper$" "%(o?)xdvi %dS -paper b5 %d")
+    ("^dvi$" "^letterpaper$" "%(o?)xdvi %dS -paper us %d")
+    ("^dvi$" "^legalpaper$" "%(o?)xdvi %dS -paper legal %d")
+    ("^dvi$" "^executivepaper$" "%(o?)xdvi %dS -paper 7.25x10.5in %d")
+    ("^dvi$" "." "%(o?)xdvi %dS %d")
+    ("^pdf$" "." "xpdf -remote %s -raise %o %(outpage)")
+    ("^html?$" "." "netscape %o"))
+  "List of output file extensions and view options.
+
+If the first element (a regular expression) matches the output
+file extension, and the second element (a regular expression)
+matches the name of one of the style options, any occurrence of
+the string `%V' in a command in `TeX-command-list' will be
+replaced with the third element.  The first match is used; if no
+match is found the `%V' is replaced with `%v'.  The outcome of `%v'
+is determined by the settings in `TeX-view-style' which therefore
+serves as a fallback for `TeX-output-view-style'.  The second
+element may also be a list of regular expressions, in which case
+all the regular expressions must match for the element to apply."
+  :group 'TeX-view
+  :type '(repeat (group
+                 (regexp :tag "Extension")
+                 (choice regexp (repeat :tag "List" regexp))
+                 (string :tag "Command"))))
+
+;;; Viewing (new implementation)
+
+(defvar TeX-view-predicate-list-builtin
+  '((output-dvi
+     (string-match "dvi" (TeX-output-extension)))
+    (output-pdf
+     (string-match "pdf" (TeX-output-extension)))
+    (output-html
+     (string-match "html" (TeX-output-extension)))
+    (style-pstricks
+     (TeX-match-style "^pstricks$\\|^pst-\\|^psfrag$"))
+    (engine-omega
+     (eq TeX-engine 'omega))
+    (engine-xetex
+     (eq TeX-engine 'xetex))
+    (mode-io-correlate
+     TeX-source-correlate-mode)
+    (paper-landscape
+     (TeX-match-style "\\`landscape\\'"))
+    (paper-portrait
+     (not (TeX-match-style "\\`landscape\\'")))
+    (paper-a4
+     (TeX-match-style "\\`a4paper\\|a4dutch\\|a4wide\\|sem-a4\\'"))
+    (paper-a5
+     (TeX-match-style "\\`a5paper\\|a5comb\\'"))
+    (paper-b5
+     (TeX-match-style "\\`b5paper\\'"))
+    (paper-letter
+     (TeX-match-style "\\`letterpaper\\'"))
+    (paper-legal
+     (TeX-match-style "\\`legalpaper\\'"))
+    (paper-executive
+     (TeX-match-style "\\`executivepaper\\'")))
+  "Alist of built-in predicates for viewer selection and invocation.
+See the doc string of `TeX-view-predicate-list' for a short
+description of each predicate.")
+
+(defcustom TeX-view-predicate-list nil
+  "Alist of predicates for viewer selection and invocation.
+The key of each list item is a symbol and the value a Lisp form
+to be evaluated.  The form should return nil if the predicate is
+not fulfilled.
+
+Built-in predicates provided in `TeX-view-predicate-list-builtin'
+can be overwritten by defining predicates with the same symbol.
+
+The following built-in predicates are available:
+  `output-dvi': The output is a DVI file.
+  `output-pdf': The output is a PDF file.
+  `output-html': The output is an HTML file.
+  `style-pstricks': The document loads a PSTricks package.
+  `engine-omega': The Omega engine is used for typesetting.
+  `engine-xetex': The XeTeX engine is used for typesetting.
+  `mode-io-correlate': TeX Source Correlate mode is active.
+  `paper-landscape': The document is typeset in landscape orientation.
+  `paper-portrait': The document is not typeset in landscape orientation.
+  `paper-a4': The paper format is A4.
+  `paper-a5': The paper format is A5.
+  `paper-b5': The paper format is B5.
+  `paper-letter': The paper format is letter.
+  `paper-legal': The paper format is legal.
+  `paper-executive': The paper format is executive."
+  :group 'TeX-view
+  :type '(alist :key-type symbol :value-type (group sexp)))
+
+(defvar TeX-view-program-list-builtin
+  (cond
+   ((eq system-type 'windows-nt)
+    '(("Yap" ("yap -1" (mode-io-correlate " -s %n%b") " %o"))
+      ("dvips and start" "dvips %d -o && start \"\" %f")
+      ("start" "start \"\" %o")))
+;; XXX: We need the advice of a Mac OS X user to configure this
+;; correctly and test it.
+;;    ((eq system-type 'darwin)
+;;     '(("Preview.app" "open -a Preview.app %o")
+;;       ("Skim" "open -a Skim.app %o")
+;;       ("displayline" "displayline %n %o %b")
+;;       ("open" "open %o")))
+   (t
+    '(("xdvi" ("%(o?)xdvi"
+              (mode-io-correlate " -sourceposition \"%n %b\" -editor \"%cS\"")
+              ((paper-a4 paper-portrait) " -paper a4")
+              ((paper-a4 paper-landscape) " -paper a4r")
+              ((paper-a5 paper-portrait) " -paper a5")
+              ((paper-a5 paper-landscape) " -paper a5r")
+              (paper-b5 " -paper b5")
+              (paper-letter " -paper us")
+              (paper-legal " -paper legal")
+              (paper-executive " -paper 7.25x10.5in")
+              " %d"))
+      ("dvips and gv" "%(o?)dvips %d -o && gv %f")
+      ("gv" "gv %o")
+      ("xpdf" ("xpdf -remote %s -raise %o" (mode-io-correlate " %(outpage)")))
+      ("Evince" ("evince" (mode-io-correlate " -p %(outpage)") " %o"))
+      ("xdg-open" "xdg-open %o"))))
+  "Alist of built-in viewer specifications.
+This variable should not be changed by the user who can use
+`TeX-view-program-list' to add new viewers or overwrite the
+definition of built-in ones.  The latter variable also contains a
+description of the data format.")
+
+(defcustom TeX-view-program-list nil
+  "Alist of viewer specifications.
+This variable can be used to specify how a viewer is to be
+invoked and thereby add new viewers on top of the built-in list
+of viewers defined in `TeX-view-program-list-builtin' or override
+entries in the latter.
+
+The car of each item is a string with a user-readable name.  The
+second element can be a command line to be run as a process or a
+Lisp function to be executed.  The command line can either be
+specified as a single string or a list of strings and two-part
+lists.  The first element of the two-part lists is a symbol or a
+list of symbols referring to one or more of the predicates in
+`TeX-view-predicate-list' or `TeX-view-predicate-list-builtin'.
+The second part of the two-part lists is a command line part.
+The command line for the viewer is constructed by concatenating
+the command line parts.  Parts with a predicate are only
+considered if the predicate was evaluated with a positive result.
+Note that the command line can contain placeholders as defined in
+`TeX-expand-list' which are expanded before the viewer is called.
+
+The use of a function as the second element only works if the
+View command in `TeX-command-list' makes use of the hook
+`TeX-run-discard-or-function'.
+
+Note: Predicates defined in the current Emacs session will only
+show up in the customization interface for this variable after
+restarting Emacs."
+  :group 'TeX-view
+  :type
+  `(alist
+    :key-type (string :tag "Name")
+    :value-type
+    (choice
+     (group :tag "Command" (string :tag "Command"))
+     (group :tag "Command parts"
+           (repeat
+            :tag "Command parts"
+            (choice
+             (string :tag "Command part")
+             (list :tag "Predicate and command part"
+                   ,(let (list)
+                      ;; Build the list of available predicates.
+                      (mapc (lambda (spec)
+                              (add-to-list 'list `(const ,(car spec))))
+                            (append TeX-view-predicate-list
+                                    TeX-view-predicate-list-builtin))
+                      ;; Sort the list alphabetically.
+                      (setq list (sort list
+                                       (lambda (a b)
+                                         (string<
+                                          (downcase (symbol-name (cadr a)))
+                                          (downcase (symbol-name (cadr b)))))))
+                      `(choice
+                        (choice :tag "Predicate" ,@list)
+                        (repeat :tag "List of predicates"
+                                (choice :tag "Predicate" ,@list))))
+                   (string :tag "Command part")))))
+     (group :tag "Function" function))))
+
+;; XXX: Regarding a possibility to (manually) run an update command,
+;; one could support this through `TeX-view' by letting it temporarily
+;; set a variable which is checked with a predicate in the viewer
+;; selection.  If the check is positive, the update command is run
+;; instead of the normal viewer command.  Direct support through the
+;; View command would require a predicate which knows when an update
+;; has to be done.
+(defcustom TeX-view-program-selection
+  (cond
+   ((eq system-type 'windows-nt)
+    '(((output-dvi style-pstricks) "dvips and start")
+      (output-dvi "Yap")
+      (output-pdf "start")
+      (output-html "start")))
+;; XXX: We need the advice of a Mac OS X user to configure this
+;; correctly and test it.
+;;    ((eq system-type 'darwin)
+;;     '((output-dvi "open")
+;;       (output-pdf "open")
+;;       (output-html "open")))
+   (t
+    '(((output-dvi style-pstricks) "dvips and gv")
+      (output-dvi "xdvi")
+      (output-pdf "Evince")
+      (output-html "xdg-open"))))
+  "Alist of predicates and viewers.
+Each entry consists of a list with two elements.  The first
+element is a symbol or list of symbols referring to predicates as
+defined in `TeX-view-predicate-list' or
+`TeX-view-predicate-list-builtin'.  The second element is a
+string referring to the name of a viewer as defined in
+`TeX-view-program-list' or `TeX-view-program-list-builtin'.
+
+When a viewer is called for, the entries are evaluated in turn
+and the viewer related to the first entry all predicates of which
+are evaluated positively is chosen."
+  :group 'TeX-view
+  :type `(alist :key-type
+               ;; Offer list of defined predicates.
+               ,(let (list)
+                  (mapc (lambda (spec)
+                          (add-to-list 'list `(const ,(car spec))))
+                        (append TeX-view-predicate-list
+                                TeX-view-predicate-list-builtin))
+                  (setq list (sort list
+                                   (lambda (a b)
+                                     (string<
+                                      (downcase (symbol-name (cadr a)))
+                                      (downcase (symbol-name (cadr b)))))))
+                  `(choice (choice :tag "Single predicate" ,@list)
+                           (repeat :tag "Multiple predicates"
+                                   (choice ,@list))))
+               :value-type
+               ;; Offer list of defined viewers.
+               (group (choice :tag "Viewer"
+                              ,@(let (list)
+                                  (mapc (lambda (spec)
+                                          (add-to-list 'list
+                                                       `(const ,(car spec))))
+                                    (append TeX-view-program-list
+                                            TeX-view-program-list-builtin))
+                                  (sort list
+                                        (lambda (a b)
+                                          (string< (downcase (cadr a))
+                                                   (downcase (cadr b))))))))))
+
+(defun TeX-match-style (regexp)
+  "Check if a style matching REGEXP is active."
+  (TeX-member regexp (TeX-style-list) 'string-match))
+
+(defun TeX-view-match-predicate (predicate)
+  "Check if PREDICATE is true.
+PREDICATE can be a symbol or a list of symbols defined in
+`TeX-view-predicate-list-builtin' or `TeX-view-predicate-list'.
+In case of a single symbol, return t if the predicate is true,
+nil otherwise.  In case of a list of symbols, return t if all
+predicates are true, nil otherwise."
+  (let ((pred-symbols (if (listp predicate) predicate (list predicate)))
+       (pred-defs (append TeX-view-predicate-list
+                          TeX-view-predicate-list-builtin))
+       (result t)
+       elt)
+    (while (and (setq elt (pop pred-symbols)) result)
+      (unless (eval (cadr (assq elt pred-defs)))
+       (setq result nil)))
+    result))
+
+(defun TeX-view-command-raw ()
+  "Choose a viewer and return its unexpanded command string."
+  (let ((selection TeX-view-program-selection)
+       entry viewer spec command)
+    ;; Find the appropriate viewer.
+    (while (and (setq entry (pop selection)) (not viewer))
+      (when (TeX-view-match-predicate (car entry))
+       (setq viewer (cadr entry))))
+    (unless viewer
+      (error "No matching viewer found"))
+    ;; Get the command line or function spec.
+    (setq spec (cadr (assoc viewer (append TeX-view-program-list
+                                          TeX-view-program-list-builtin))))
+    (cond ((functionp spec)
+          ;; Converting the function call to a string is ugly, but
+          ;; the backend currently only supports strings.
+          (prin1-to-string spec))
+         ((stringp spec)
+          spec)
+         (t
+          ;; Build the unexpanded command line.  Pieces with predicates are
+          ;; only added if the predicate is evaluated positively.
+          (dolist (elt spec)
+            (cond ((stringp elt)
+                   (setq command (concat command elt)))
+                  ((listp elt)
+                   (when (TeX-view-match-predicate (car elt))
+                     (setq command (concat command (cadr elt)))))))
+          command))))
+
+;;; Engine
+
+(defvar TeX-engine-alist-builtin
+  '((default "Default" TeX-command LaTeX-command ConTeXt-engine)
+    (xetex "XeTeX" "xetex" "xelatex" "xetex")
+    (luatex "LuaTeX" "luatex" "lualatex" "luatex")
+    (omega "Omega" TeX-Omega-command LaTeX-Omega-command ConTeXt-Omega-engine))
+  "Alist of built-in TeX engines and associated commands.
+For a description of the format see `TeX-engine-alist'.")
+
+(defcustom TeX-engine-alist nil
+  "Alist of TeX engines and associated commands.
+Each entry is a list with a maximum of five elements.  The first
+element is a symbol used to identify the engine.  The second is a
+string describing the engine.  The third is the command to be
+used for plain TeX.  The fourth is the command to be used for
+LaTeX.  The fifth is the command to be used for the --engine
+parameter of ConTeXt's texexec program.  Each command can either
+be a variable or a string.  An empty string or nil means there is
+no command available.
+
+You can override a built-in engine defined in the variable
+`TeX-engine-alist-builtin' by adding an entry beginning with the
+same symbol as the built-in entry to `TeX-engine-alist'."
+  :group 'TeX-command
+  :type '(repeat (group symbol
+                       (string :tag "Name")
+                       (choice :tag "Plain TeX command" string variable)
+                       (choice :tag "LaTeX command" string variable)
+                       (choice :tag "ConTeXt command" string variable))))
+
+(defun TeX-engine-alist ()
+  "Return an alist of TeX engines.
+The function appends the built-in engine specs from
+`TeX-engine-alist-builtin' and the user-defined engines from
+`TeX-engine-alist' and deletes any entries from the built-in part
+where an entry with the same car exists in the user-defined part."
+  (TeX-delete-dups-by-car (append TeX-engine-alist TeX-engine-alist-builtin)))
+
+(defcustom TeX-engine 'default
+  (concat "Type of TeX engine to use.
+It should be one of the following symbols:\n\n"
+         (mapconcat (lambda (x) (format "* `%s'" (car x)))
+                    (TeX-engine-alist) "\n"))
+  :group 'TeX-command
+  :type `(choice ,@(mapcar (lambda (x)
+                            `(const :tag ,(nth 1 x) ,(car x)))
+                          (TeX-engine-alist))))
+(make-variable-buffer-local 'TeX-engine)
+(put 'TeX-engine 'safe-local-variable
+     (lambda (arg) (memq arg (mapcar 'car TeX-engine-alist-builtin))))
+
+(defun TeX-engine-set (type)
+  (concat "Set TeX engine to TYPE.
+TYPE can be one of the following symbols:\n"
+         (mapconcat (lambda (x) (format "* `%s'" (car x)))
+                    (TeX-engine-alist) "\n"))
+  (interactive (list (completing-read "Engine: "
+                                     (mapcar (lambda (x)
+                                               (symbol-name (car x)))
+                                             (TeX-engine-alist))
+                                     nil t)))
+  (when (stringp type)
+    (setq type (intern type)))
+  (setq TeX-engine type)
+  ;; Automatically enable or disable TeX PDF mode as a convenience
+  (cond ((eq type 'xetex) (TeX-PDF-mode 1))
+       ((eq type 'omega) (TeX-PDF-mode 0))))
+
+(define-minor-mode TeX-Omega-mode
+  "Minor mode for using the Omega engine."
+  nil nil nil
+  :group 'TeX-command
+  (TeX-engine-set (if TeX-Omega-mode 'omega 'default)))
+(defalias 'tex-omega-mode 'TeX-Omega-mode)
+(TeX--call-3/2 #'make-obsolete 'TeX-Omega-mode 'TeX-engine-set "before 11.86")
+(TeX--call-3/2 #'make-obsolete-variable 'TeX-Omega-mode
+               'TeX-engine "before 11.86")
+
+;;; Forward and inverse search
+
+(defcustom TeX-source-correlate-method 'auto
+  "Method to use for enabling forward and inverse search.
+This can be `source-specials' if source specials should be used,
+`synctex' if SyncTeX should be used, or`auto' if AUCTeX should
+decide.
+
+Setting this variable does not take effect if TeX Source
+Correlate mode has already been active.  Restart Emacs in this
+case."
+  :type '(choice (const auto) (const synctex) (const source-specials))
+  :group 'TeX-view)
+
+(defvar TeX-source-correlate-method-active nil
+  "Method actually used for forward and inverse search.")
+
+(defvar TeX-source-correlate-output-page-function nil
+  "Symbol of function returning an output page relating to buffer position.
+The function should take no arguments and return the page numer
+as a string.")
+(make-variable-buffer-local 'TeX-source-correlate-output-page-function)
+
+(defcustom TeX-source-correlate-start-server 'ask
+  "Control if server should be started for inverse search."
+  :type '(choice (const :tag "Always" t)
+                (const :tag "Never" nil)
+                (const :tag "Ask" ask))
+  :group 'TeX-view)
+(when (fboundp 'defvaralias)
+  (defvaralias 'TeX-source-specials-view-start-server
+    'TeX-source-correlate-start-server))
+
+(defvar TeX-source-correlate-start-server-asked nil
+  "Keep track if question about server start search was asked.")
+
+(defvar TeX-source-correlate-start-server-flag nil
+  "If non-nil, `TeX-source-correlate-start-server-maybe' will start a server.
+Code related to features requiring a server, e.g. for inverse
+search, can set the variable.")
+
+(defun TeX-source-correlate-gnuserv-p ()
+  "Guess whether to use gnuserv when a server is requested."
+  (cond ((and (boundp 'gnuserv-process)
+             (processp gnuserv-process)))
+       ((and (boundp 'server-process)
+             (processp server-process))
+        nil)
+       ((featurep 'xemacs))))
+
+(defun TeX-source-correlate-server-enabled-p ()
+  "Return non-nil if Emacs server or gnuserv is enabled."
+  (let* ((gnuserv-p (TeX-source-correlate-gnuserv-p))
+        (process (if gnuserv-p 'gnuserv-process 'server-process)))
+    (and (boundp process) (processp (symbol-value process)))))
+
+(defun TeX-source-correlate-start-server-maybe ()
+  "Start Emacs server or gnuserv if a feature using it is enabled.
+This is the case if `TeX-source-correlate-start-server-flag' is non-nil."
+  (when (and TeX-source-correlate-start-server-flag
+            (not (TeX-source-correlate-server-enabled-p)))
+    (let* ((gnuserv-p (TeX-source-correlate-gnuserv-p))
+          (start (if gnuserv-p 'gnuserv-start 'server-start)))
+      (cond
+       ;; Server should be started unconditionally
+       ((eq TeX-source-correlate-start-server t)
+       (funcall start))
+       ;; Ask user if server is to be started
+       ((and (eq TeX-source-correlate-start-server 'ask)
+            (not TeX-source-correlate-start-server-asked)
+            (prog1
+                (y-or-n-p (format "Start %s for inverse search in viewer? "
+                                  (if gnuserv-p
+                                      "gnuserv"
+                                    "Emacs server")))
+              (setq TeX-source-correlate-start-server-asked t)))
+       (funcall start))))))
+
+(defun TeX-source-correlate-determine-method ()
+  "Determine which method is available for forward and inverse search."
+  (let ((help (condition-case nil
+                 (with-output-to-string
+                   (call-process LaTeX-command
+                                 nil (list standard-output nil) nil "--help"))
+               (error ""))))
+    (if (string-match "^[ ]*-synctex" help)
+       'synctex
+      'source-specials)))
+
+(defun TeX-source-correlate-expand-options ()
+  "Return TeX engine command line option for forward search facilities.
+The return value depends on the value of `TeX-source-correlate-mode'.
+If this is nil, an empty string will be returned."
+  (if TeX-source-correlate-mode
+      (if (eq TeX-source-correlate-method-active 'source-specials)
+         (concat TeX-source-specials-tex-flags
+                 (if TeX-source-specials-places
+                     ;; -src-specials=WHERE: insert source specials
+                     ;; in certain places of the DVI file. WHERE is a
+                     ;; comma-separated value list: cr display hbox
+                     ;; math par parend vbox
+                     (concat "=" (mapconcat 'identity
+                                            TeX-source-specials-places ","))))
+       TeX-synctex-tex-flags)
+    ""))
+
+(defvar TeX-source-correlate-map
+  (let ((map (make-sparse-keymap)))
+    ;; (if (featurep 'xemacs)
+    ;;    (define-key map [(control button1)] #'TeX-view-mouse)
+    ;;   (define-key map [C-down-mouse-1] #'TeX-view-mouse))
+    map)
+  "Keymap for `TeX-source-correlate-mode'.
+You could use this for unusual mouse bindings.")
+
+(define-minor-mode TeX-source-correlate-mode
+  "Minor mode for forward and inverse search.
+
+If enabled, the viewer can be advised to show the output page
+corresponding to the point in the source and vice versa.
+
+The method to be used can be controlled with the variable
+`TeX-source-correlate-method'.  Currently source specials or
+SyncTeX are recognized."
+  :group 'TeX-view
+  ;; Since this is a global minor mode and we don't want to require
+  ;; tex.el when the mode variable is set, the mode function is called
+  ;; explicitely (if necessary) in `VirTeX-common-initialization'.  We
+  ;; do it there because otherwise `kill-all-local-variables' would
+  ;; reset `TeX-source-correlate-output-page-function' which is
+  ;; buffer-local.
+  :global t
+  (set-keymap-parent TeX-mode-map (and TeX-source-correlate-mode
+                                      TeX-source-correlate-map))
+  (TeX-set-mode-name 'TeX-source-correlate-mode t t)
+  (setq TeX-source-correlate-start-server-flag TeX-source-correlate-mode)
+  (unless TeX-source-correlate-method-active
+    (setq TeX-source-correlate-method-active
+         (if (eq TeX-source-correlate-method 'auto)
+             (TeX-source-correlate-determine-method)
+           TeX-source-correlate-method)))
+  (when (eq TeX-source-correlate-method-active 'synctex)
+    (setq TeX-source-correlate-output-page-function
+         (when TeX-source-correlate-mode
+           'TeX-synctex-output-page))))
+(defalias 'TeX-source-specials-mode 'TeX-source-correlate-mode)
+(TeX--call-3/2 #'make-obsolete 'TeX-source-specials-mode
+               'TeX-source-correlate-mode "before 11.86")
+(defalias 'tex-source-correlate-mode 'TeX-source-correlate-mode)
+(put 'TeX-source-correlate-mode 'safe-local-variable 'TeX-booleanp)
+;; We do not want the custom variable to require tex.el.  This is only
+;; necessary if AUCTeX was compiled with Emacs 21.
+(put 'TeX-source-correlate-mode 'custom-requests nil)
+(setq minor-mode-map-alist
+      (delq (assq 'TeX-source-correlate-mode minor-mode-map-alist)
+           minor-mode-map-alist))
+
+
+;;; Source Specials
+
+(defcustom TeX-source-specials-tex-flags "-src-specials"
+  "Extra flags to pass to TeX commands to generate source specials."
+  :group 'TeX-view
+  :type 'string)
+
+(defcustom TeX-source-specials-places nil
+  "List of places where to insert source specials into the DVI file.
+If nil, use (La)TeX's defaults."
+  :group 'TeX-view
+  :type '(list (set :inline t
+                   ;; :tag "Options known to work"
+                   ;; cr display hbox math par parend vbox
+                   (const "cr")
+                   (const "display")
+                   (const "hbox")
+                   (const "math")
+                   (const "par")
+                   (const "parend")
+                   (const "vbox"))
+              (repeat :inline t
+                      :tag "Other options"
+                      (string))))
+
+(defcustom TeX-source-specials-view-position-flags
+  "-sourceposition \"%n %b\""
+  "Flags to pass to the DVI viewer commands for the position in the source."
+  :group 'TeX-view
+  :type 'string)
+
+(defcustom TeX-source-specials-view-editor-flags
+  "-editor \"%cS\""
+  "Flags to pass to DVI viewer commands for inverse search."
+  :group 'TeX-view
+  :type 'string)
+
+(defcustom TeX-source-specials-view-gnuclient-flags
+  "-q +%%l %%f"
+  "Flags to pass to gnuclient for inverse search."
+  :group 'TeX-view
+  :type 'string)
+
+(defcustom TeX-source-specials-view-emacsclient-flags
+  "--no-wait +%%l %%f"
+  "Flags to emacsclient for inverse search."
+  :group 'TeX-view
+  :type 'string)
+
+;; FIXME: Make client binaries configurable.
+(defun TeX-source-specials-view-expand-client ()
+  "Return gnuclient or emacslient executable with options.
+Return the full path to the executable if possible."
+  (let* ((gnuserv-p (TeX-source-correlate-gnuserv-p))
+        (client-base (if gnuserv-p
+                         "gnuclient"
+                       "emacsclient"))
+        (client-full (and invocation-directory
+                          (expand-file-name client-base
+                                            invocation-directory)))
+        (options (if gnuserv-p
+                     TeX-source-specials-view-gnuclient-flags
+                   TeX-source-specials-view-emacsclient-flags)))
+    (if (and client-full (file-executable-p client-full))
+       (concat client-full " " options)
+      (concat client-base " " options))))
+
+(defun TeX-source-specials-view-expand-options (&optional viewer)
+  "Return source specials command line option for viewer command.
+The return value depends on the values of
+`TeX-source-correlate-mode' and
+`TeX-source-correlate-method-active'.  If those are nil or not
+`source-specials' respectively, an empty string will be
+returned."
+  (if (and TeX-source-correlate-mode
+          (eq TeX-source-correlate-method-active 'source-specials))
+      (concat TeX-source-specials-view-position-flags
+             (when (TeX-source-correlate-server-enabled-p)
+               (concat " " TeX-source-specials-view-editor-flags)))
+    ""))
+
+;;; SyncTeX
+
+(defvar TeX-synctex-tex-flags "--synctex=1"
+  "Extra flags to pass to TeX commands to enable SyncTeX.")
+
+(defun TeX-synctex-output-page ()
+  "Return the page corresponding to the current source position.
+This method assumes that the document was compiled with SyncTeX
+enabled and the `synctex' binary is available."
+  (let ((synctex-output
+        (with-output-to-string
+          (call-process "synctex" nil (list standard-output nil) nil "view"
+                        "-i" (format "%s:%s:%s" (line-number-at-pos)
+                                     (current-column)
+                                     ;; The file name relative to the
+                                     ;; directory of the master file.
+                                     (file-relative-name
+                                      (buffer-file-name)
+                                      (file-name-directory
+                                       (TeX-active-master))))
+                        "-o" (TeX-active-master (TeX-output-extension))))))
+    (when (string-match "Page:\\([0-9]+\\)" synctex-output)
+      (match-string 1 synctex-output))))
+
+;;; Miscellaneous minor modes
+
+(defvar TeX-mode-p nil
+  "This indicates a TeX mode being active.")
+(make-variable-buffer-local 'TeX-mode-p)
+
+(defun TeX-mode-set (var value)
+  (set-default var value)
+  (TeX-set-mode-name var nil t))
+
+(defcustom TeX-PDF-mode nil nil
+  :group 'TeX-command
+  :set 'TeX-mode-set
+  :type 'boolean)
+(put 'TeX-PDF-mode 'safe-local-variable 'TeX-booleanp)
+
+(define-minor-mode TeX-PDF-mode
+  "Minor mode for using PDFTeX.
+
+If enabled, PDFTeX will be used as an executable by default.
+You can customize an initial value, and you can use the
+function `TeX-global-PDF-mode' for toggling this value."
+  :group 'TeX-command
+  (when (eq TeX-engine 'omega)
+    (setq TeX-PDF-mode nil))
+  (setq TeX-PDF-mode-parsed nil)
+  (TeX-set-mode-name nil nil t)
+  (setq TeX-output-extension
+       (if TeX-PDF-mode "pdf" "dvi")))
+(add-to-list 'minor-mode-alist '(TeX-PDF-mode ""))
+
+(defun TeX-global-PDF-mode (&optional arg)
+  "Toggle default for `TeX-PDF-mode'."
+  (interactive "P")
+  (prog1
+      (setq-default TeX-PDF-mode
+                   (if arg (> (prefix-numeric-value arg) 0)
+                     (not (default-value 'TeX-PDF-mode))))
+    (TeX-set-mode-name 'TeX-PDF-mode nil t)))
+
+(defalias 'tex-pdf-mode 'TeX-PDF-mode)
+
+(defvar TeX-PDF-mode-parsed nil
+  "Set if `TeX-PDF-mode' has come about by parsing.")
+
+(make-variable-buffer-local 'TeX-PDF-mode-parsed)
+
+(defun TeX-PDF-mode-parsed (arg)
+  "Change `TeX-PDF-mode' to ARG based on parsing.
+If this conflicts with previous parsed settings,
+just use the default.  If an explicit setting is
+already established, don't do anything."
+
+;; Basically we have the following situations:
+;; TeX-PDF-mode-parsed (local-variable-p 'TeX-PDF-mode):
+;; nil nil : virgin state
+;; nil t   : stably set state (possibly because of conflicting parse info)
+;; t   t   : non-conflicting parsed info
+
+  (if TeX-PDF-mode-parsed
+      (unless (eq TeX-PDF-mode arg)
+       (TeX-PDF-mode (if (default-value 'TeX-PDF-mode) 1 0)))
+    (unless (local-variable-p 'TeX-PDF-mode (current-buffer))
+      (TeX-PDF-mode (if arg 1 0))
+      (setq TeX-PDF-mode-parsed t))))
+  
+(defun TeX-PDF-mode-on ()
+  "Use only from parsing routines."
+  (TeX-PDF-mode-parsed t))
+
+(defun TeX-PDF-mode-off ()
+  "Use only from parsing routines."
+  (TeX-PDF-mode-parsed nil))
+
+(defcustom TeX-DVI-via-PDFTeX nil
+  "Whether to use PDFTeX also for producing DVI files."
+  :group 'TeX-command
+  :type 'boolean)
+
+(define-minor-mode TeX-interactive-mode
+  "Minor mode for interactive runs of TeX."
+  nil nil nil
+  :group 'TeX-command
+  (TeX-set-mode-name 'TeX-interactive-mode t t))
+(defalias 'tex-interactive-mode 'TeX-interactive-mode)
+(add-to-list 'minor-mode-alist '(TeX-interactive-mode ""))
+
+;;; Commands
+
+(defgroup TeX-command-name nil
+  "Names for external commands in AUCTeX."
+  :group 'TeX-command)
+
+(defcustom TeX-command-BibTeX "BibTeX"
+  "*The name of the BibTeX entry in `TeX-command-list'."
+  :group 'TeX-command-name
+  :type 'string)
+  (make-variable-buffer-local 'TeX-command-BibTeX)
+
+(defcustom TeX-command-Show "View"
+  "*The default command to show (view or print) a TeX file.
+Must be the car of an entry in `TeX-command-list'."
+  :group 'TeX-command-name
+  :type 'string)
+  (make-variable-buffer-local 'TeX-command-Show)
+
+(defcustom TeX-command-Print "Print"
+  "The name of the Print entry in `TeX-command-Print'."
+  :group 'TeX-command-name
+  :type 'string)
+
+(defcustom TeX-command-Queue "Queue"
+  "The name of the Queue entry in `TeX-command-Queue'."
+  :group 'TeX-command-name
+  :type 'string)
+
+(defvar TeX-trailer-start nil
+  "Regular expression delimiting start of trailer in a TeX file.")
+
+ (make-variable-buffer-local 'TeX-trailer-start)
+
+(defvar TeX-header-end nil
+  "Regular expression delimiting end of header in a TeX file.")
+
+ (make-variable-buffer-local 'TeX-header-end)
+
+(defvar TeX-command-default nil
+  "The default command for `TeX-command' in the current major mode.")
+
+ (make-variable-buffer-local 'TeX-command-default)
+
+(put 'TeX-command-default 'safe-local-variable 'stringp)
+
+(defvar TeX-clean-default-intermediate-suffixes
+  '("\\.aux" "\\.bbl" "\\.blg" "\\.brf" "\\.fot"
+    "\\.glo" "\\.gls" "\\.idx" "\\.ilg" "\\.ind"
+    "\\.lof" "\\.log" "\\.lot" "\\.nav" "\\.out"
+    "\\.snm" "\\.toc" "\\.url" "\\.synctex\\.gz")
+  "List of regexps matching suffixes of files to be cleaned.
+Used as a default in TeX, LaTeX and docTeX mode.")
+
+(defvar TeX-clean-default-output-suffixes
+  '("\\.dvi" "\\.pdf" "\\.ps" "\\.xdv")
+  "List of regexps matching suffixes of files to be cleaned.
+Used as a default in TeX, LaTeX and docTeX mode.")
+
+(defcustom TeX-clean-confirm t
+  "If non-nil, ask before deleting files."
+  :type 'boolean
+  :group 'TeX-command)
+
+(autoload 'dired-mark-pop-up "dired")
+
+(defun TeX-clean (&optional arg)
+  "Delete generated files associated with current master and region files.
+If prefix ARG is non-nil, not only remove intermediate but also
+output files."
+  (interactive "P")
+  (let* ((mode-prefix (TeX-mode-prefix))
+        (suffixes (append (symbol-value
+                           (intern (concat mode-prefix
+                                           "-clean-intermediate-suffixes")))
+                          (when arg
+                            (symbol-value
+                             (intern (concat mode-prefix
+                                             "-clean-output-suffixes"))))))
+        (master (TeX-active-master))
+        (master-dir (file-name-directory master))
+        (regexp (concat "\\("
+                        (file-name-nondirectory master) "\\|"
+                        (TeX-region-file nil t)
+                        "\\)"
+                        "\\("
+                        (mapconcat 'identity suffixes "\\|")
+                        "\\)\\'"
+                        "\\|" (TeX-region-file t t)))
+        (files (when regexp
+                 (directory-files (or master-dir ".") nil regexp))))
+    (if files
+       (when (or (not TeX-clean-confirm)
+                 (condition-case nil
+                     (dired-mark-pop-up " *Deletions*" 'delete
+                                        (if (> (length files) 1) 
+                                            files
+                                          (cons t files))
+                                        'y-or-n-p "Delete files? ")
+                   (wrong-type-argument ; e.g. with Emacs 21
+                    (y-or-n-p (format "Delete %S? " (car files))))))
+         (dolist (file files)
+           (delete-file (concat master-dir file))))
+      (message "No files to be deleted"))))
+
+
+;;; Master File
+
+(defcustom TeX-master t
+  "*The master file associated with the current buffer.
+If the file being edited is actually included from another file, you
+can tell AUCTeX the name of the master file by setting this variable.
+If there are multiple levels of nesting, specify the top level file.
+
+If this variable is nil, AUCTeX will query you for the name.
+
+If the variable is t, AUCTeX will assume the file is a master file
+itself.
+
+If the variable is 'shared, AUCTeX will query for the name, but not
+change the file.
+
+If the variable is 'dwim, AUCTeX will try to avoid querying by
+attempting to `do what I mean'; and then change the file.
+
+It is suggested that you use the File Variables (see the info node in
+the Emacs manual) to set this variable permanently for each file."
+  :group 'TeX-command
+  :group 'TeX-parse
+  :type '(choice (const :tag "Query" nil)
+                (const :tag "This file" t)
+                (const :tag "Shared" shared)
+                (const :tag "Dwim" dwim)
+                (string :format "%v")))
+(make-variable-buffer-local 'TeX-master)
+(put 'TeX-master 'safe-local-variable
+     '(lambda (x)
+       (or (stringp x)
+           (member x (quote (t nil shared dwim))))))
+
+(defcustom TeX-one-master "\\.\\(texi?\\|dtx\\)$"
+  "*Regular expression matching ordinary TeX files.
+
+You should set this variable to match the name of all files, where
+automatically adding a file variable with the name of the master file
+is a good idea.  When AUCTeX adds the name of the master file as a
+file variable, it does not need to ask next time you edit the file.
+
+If you dislike AUCTeX automatically modifying your files, you can set
+this variable to \"<none>\"."
+  :group 'TeX-command
+  :type 'regexp)
+
+(defvar TeX-convert-master t
+  "*If not nil, automatically convert ``Master:'' lines to file variables.
+This will be done when AUCTeX first try to use the master file.")
+
+;; Can be let-bound temporarily in order to inhibit the master file question
+;; by using its value instead in case `TeX-master' is nil or 'shared.
+(defvar TeX-transient-master nil)
+
+(defun TeX-dwim-master ()
+  "Find a likely `TeX-master'."
+  (let ((dir default-directory))
+    (dolist (buf (buffer-list))
+      (when (with-current-buffer buf
+             (and (equal dir default-directory)
+                  (stringp TeX-master)))
+       (return (with-current-buffer buf TeX-master))))))
+
+(defun TeX-master-file-ask ()
+  "Ask for master file, set `TeX-master' and add local variables."
+  (interactive)
+  (if (TeX-local-master-p)
+      (error "Master file already set")
+    (let* ((default (TeX-dwim-master))
+          (name (or (and (eq 'dwim TeX-master) default)
+                    (condition-case nil
+                        (read-file-name (format "Master file: (default %s) "
+                                                (or default "this file"))
+                                        nil default)
+                      (quit "<quit>")))))
+      (cond ((string= name "<quit>")
+            (setq TeX-master t))
+           ((string= name default)
+            (setq TeX-master default)
+            (TeX-add-local-master))
+           ((or
+             ;; Default `read-file-name' proposes and buffer visits a file.
+             (string= (expand-file-name name) (buffer-file-name))
+             ;; Default of `read-file-name' and buffer does not visit a file.
+             (string= name default-directory)
+             ;; User typed <RET> in an empty minibuffer.
+             (string= name ""))
+            (setq TeX-master t)
+            (TeX-add-local-master))
+           (t
+            (setq TeX-master (TeX-strip-extension (file-relative-name name)
+                                                  (list TeX-default-extension)
+                                                  'path))
+            (TeX-add-local-master))))))
+
+(defun TeX-master-file (&optional extension nondirectory ask)
+  "Set and return the name of the master file for the current document.
+
+If optional argument EXTENSION is non-nil, add that file extension to
+the name.  Special value t means use `TeX-default-extension'.
+
+If optional second argument NONDIRECTORY is non-nil, do not include
+the directory.
+
+If optional third argument ASK is non-nil, ask the user for the
+name of master file if it cannot be determined otherwise.
+
+Currently it will check for the presence of a ``Master:'' line in
+the beginning of the file, but that feature will be phased out."
+  (interactive)
+  (if (eq extension t)
+      (setq extension TeX-default-extension))
+  (let ((my-name (if (buffer-file-name)
+                    (TeX-strip-extension nil (list TeX-default-extension) t)
+                  "<none>")))
+    (save-excursion
+      (save-restriction
+       (widen)
+       (goto-char (point-min))
+       (cond
+        ((and TeX-transient-master
+              (or (not TeX-master) (eq TeX-master 'shared)))
+         (setq TeX-master TeX-transient-master))
+        ;; Special value 't means it is own master (a free file).
+        ((equal TeX-master my-name)
+         (setq TeX-master t))
+
+        ;; For files shared between many documents.
+        ((and (eq 'shared TeX-master) ask)
+         (setq TeX-master
+               (let* ((default (TeX-dwim-master))
+                      (name (read-file-name
+                             (format "Master file: (default %s) "
+                                     (or default "this file"))
+                             nil default)))
+                 (cond ((string= name default)
+                        default)
+                       ((or
+                         ;; Default `read-file-name' proposes and
+                         ;; buffer visits a file.
+                         (string= (expand-file-name name)
+                                  (buffer-file-name))
+                         ;; Default of `read-file-name' and
+                         ;; buffer does not visit a file.
+                         (string= name default-directory)
+                         ;; User typed <RET> in an empty minibuffer.
+                         (string= name ""))
+                        t)
+                       (t
+                        (TeX-strip-extension
+                         name (list TeX-default-extension) 'path))))))
+
+        ;; We might already know the name.
+        ((or (eq TeX-master t) (stringp TeX-master)) TeX-master)
+
+        ;; Support the ``Master:'' line (under protest!)
+        ((re-search-forward
+          "^%% *[Mm]aster:?[ \t]*\\([^ \t\n]+\\)" 500 t)
+         (setq TeX-master
+               (TeX-strip-extension (TeX-match-buffer 1)
+                                    (list TeX-default-extension)))
+         (if TeX-convert-master
+             (progn
+               (beginning-of-line)
+               (kill-line 1)
+               (TeX-add-local-master))))
+
+        ;; Ask the user (but add it as a local variable).
+        (ask (TeX-master-file-ask)))))
+
+    (let ((name (if (stringp TeX-master)
+                   TeX-master
+                 my-name)))
+
+      (if (TeX-match-extension name)
+         ;; If it already has an extension...
+         (if (equal extension TeX-default-extension)
+             ;; Use instead of the default extension
+             (setq extension nil)
+           ;; Otherwise drop it.
+           (setq name (TeX-strip-extension name))))
+
+      ;; Remove directory if needed.
+      (if nondirectory
+         (setq name (file-name-nondirectory name)))
+
+      (if extension
+         (concat name "." extension)
+       name))))
+
+(defun TeX-master-directory ()
+  "Directory of master file."
+  (file-name-as-directory
+   (abbreviate-file-name
+    (substitute-in-file-name
+     (expand-file-name
+      (let ((dir (file-name-directory (TeX-master-file))))
+       (if dir (directory-file-name dir) "."))
+      (and buffer-file-name
+          (file-name-directory buffer-file-name)))))))
+
+(defun TeX-add-local-master ()
+  "Add local variable for `TeX-master'."
+  (when (and (buffer-file-name)
+            (string-match TeX-one-master
+                          (file-name-nondirectory (buffer-file-name)))
+            (not buffer-read-only))
+    (goto-char (point-max))
+    (if (re-search-backward (concat "^\\([^\n]+\\)Local " "Variables:")
+                           (- (point-max) 3000) t)
+       (let ((prefix (TeX-match-buffer 1)))
+         (re-search-forward (regexp-quote (concat prefix
+                                                  "End:")))
+         (beginning-of-line 1)
+         (insert prefix "TeX-master: " (prin1-to-string TeX-master) "\n"))
+      (let ((comment-prefix (cond ((eq major-mode 'texinfo-mode) "@c ")
+                                 ((eq major-mode 'doctex-mode) "% ")
+                                 (t "%%% ")))
+           (mode (concat (and (boundp 'japanese-TeX-mode) japanese-TeX-mode
+                              "japanese-")
+                         (substring (symbol-name major-mode) 0 -5))))
+       (newline)
+       (when (eq major-mode 'doctex-mode)
+         (insert comment-prefix TeX-esc "endinput\n"))
+       (insert
+        comment-prefix "Local " "Variables: \n"
+        comment-prefix "mode: " mode "\n"
+        comment-prefix "TeX-master: " (prin1-to-string TeX-master) "\n"
+        comment-prefix "End: \n")))))
+
+(defun TeX-local-master-p ()
+  "Return non-nil if there is a `TeX-master' entry in local variables spec.
+Return nil otherwise."
+  (save-excursion
+    ;; XXX: Checking -*- line necessary as well?
+    (goto-char (point-max))
+    (search-backward "\n\^L" (max (- (point-max) 3000) (point-min)) 'move)
+    (re-search-forward "^%+ *TeX-master:" nil t)))
+
+;;; Style Paths
+
+(defcustom TeX-style-global (expand-file-name "style" TeX-data-directory)
+  "*Directory containing hand generated TeX information.
+
+These correspond to TeX macros shared by all users of a site."
+  :group 'TeX-file
+  :type 'directory)
+
+(defcustom TeX-auto-local "auto"
+  "*Directory containing automatically generated TeX information.
+
+This correspond to TeX macros found in the current directory, and must
+be relative to that."
+  :group 'TeX-file
+  :type 'string)
+
+(defcustom TeX-style-local "style"
+  "*Directory containing hand generated TeX information.
+
+These correspond to TeX macros found in the current directory, and must
+be relative to that."
+  :group 'TeX-file
+  :type 'string)
+
+(defun TeX-split-string (regexp string)
+  "Return a list of strings.
+Given REGEXP the STRING is split into sections which in string was
+seperated by REGEXP.
+
+Examples:
+
+      (TeX-split-string \"\:\" \"abc:def:ghi\")
+         -> (\"abc\" \"def\" \"ghi\")
+
+      (TeX-split-string \" +\" \"dvips  -Plw -p3 -c4 testfile.dvi\")
+
+         -> (\"dvips\" \"-Plw\" \"-p3\" \"-c4\" \"testfile.dvi\")
+
+If REGEXP is nil, or \"\", an error will occur."
+
+  (let ((start 0) result match)
+    (while (setq match (string-match regexp string start))
+      (push (substring string start match) result)
+      (setq start (match-end 0)))
+    (push (substring string start) result)
+    (nreverse result)))
+
+(defun TeX-parse-path (env)
+  "Return a list if private TeX directories found in environment variable ENV."
+  (let* ((value (getenv env))
+        (entries (and value
+                      (TeX-split-string
+                       (if (string-match ";" value) ";" ":")
+                       value)))
+        entry
+        answers)
+    (while entries
+      (setq entry (car entries))
+      (setq entries (cdr entries))
+      (setq entry (file-name-as-directory
+                  (if (string-match "/?/?\\'" entry)
+                      (substring entry 0 (match-beginning 0))
+                    entry)))
+      (or (not (file-name-absolute-p entry))
+         (member entry (append '("/" "\\") TeX-macro-global))
+         (setq answers (cons entry answers))))
+    answers))
+
+(defun TeX-macro-global ()
+  "Return directories containing the site's TeX macro and style files."
+  (or (TeX-tree-expand '("$SYSTEXMF" "$TEXMFLOCAL" "$TEXMFMAIN" "$TEXMFDIST")
+                      "latex" '("/tex/" "/bibtex/bst/"))
+      '("/usr/share/texmf/tex/" "/usr/share/texmf/bibtex/bst/")))
+
+(defun TeX-macro-private ()
+  "Return directories containing the user's TeX macro and style files."
+  (TeX-tree-expand '("$TEXMFHOME") "latex" '("/tex/" "/bibtex/bst/")))
+
+(defun TeX-tree-expand (trees program subdirs)
+  "Return directories corresponding to the TeX trees TREES.
+This is done calling `kpsewhich' where PROGRAM is passed as the
+parameter for --progname.  SUBDIRS are subdirectories which are
+appended to the directories of the TeX trees."
+  (let (path-list path exit-status input-dir-list)
+    (condition-case nil
+       (catch 'success
+         (dotimes (i (safe-length trees))
+           (setq path (with-output-to-string
+                        (setq exit-status
+                              (call-process
+                               "kpsewhich"  nil
+                               (list standard-output nil) nil
+                               "--progname" program
+                               "--expand-braces" (nth i trees)))))
+           (if (zerop exit-status)
+               (progn (add-to-list 'path-list path)
+                      (when (zerop i) (throw 'success nil)))
+             (setq path (with-output-to-string
+                          (setq exit-status
+                                (call-process
+                                 "kpsewhich"  nil
+                                 (list standard-output nil) nil
+                                 "--progname" program
+                                 "--expand-path" (nth i trees)))))
+             (when (zerop exit-status) (add-to-list 'path-list path)))))
+      (error nil))
+    (dolist (elt path-list)
+      (let ((separators (if (string-match "^[A-Za-z]:" elt)
+                           "[\n\r;]"
+                         "[\n\r:]")))
+       (dolist (item (condition-case nil
+                         (split-string elt separators t)
+                       ;; COMPATIBILITY for XEmacs <= 21.4.15
+                       (error (delete "" (split-string elt separators)))))
+         (when (string-match "^!+" item)
+           (setq item (substring item (match-end 0) (length item))))
+         (when (string-match "/+$" item)
+           (setq item (substring item 0 (match-beginning 0))))
+         (dolist (subdir subdirs)
+           (when (file-exists-p (file-name-as-directory (concat item subdir)))
+             (add-to-list 'input-dir-list (concat item subdir)))))))
+    input-dir-list))
+
+(defcustom TeX-macro-global (TeX-macro-global)
+  "Directories containing the site's TeX macro and style files."
+  :group 'TeX-file
+  :type '(repeat (directory :format "%v")))
+
+(defcustom TeX-macro-private (or (append (TeX-parse-path "TEXINPUTS")
+                                        (TeX-parse-path "BIBINPUTS"))
+                                (TeX-macro-private))
+  "Directories where you store your personal TeX macros."
+  :group 'TeX-file
+  :type '(repeat (file :format "%v")))
+
+(defcustom TeX-auto-private
+  (list (expand-file-name TeX-auto-local
+                         (or (and (boundp 'user-emacs-directory)
+                                  (concat user-emacs-directory "auctex/"))
+                             "~/.emacs.d/auctex/")))
+  "List of directories containing automatically generated AUCTeX style files.
+
+These correspond to the personal TeX macros."
+  :group 'TeX-file
+  :type '(repeat (file :format "%v")))
+
+(if (stringp TeX-auto-private)         ;Backward compatibility
+    (setq TeX-auto-private (list TeX-auto-private)))
+
+(defcustom TeX-style-private
+  (list (expand-file-name TeX-style-local
+                         (or (and (boundp 'user-emacs-directory)
+                                  (concat user-emacs-directory "auctex/"))
+                             "~/.emacs.d/auctex/")))
+  "List of directories containing hand-generated AUCTeX style files.
+
+These correspond to the personal TeX macros."
+  :group 'TeX-file
+  :type '(repeat (file :format "%v")))
+
+(if (stringp TeX-style-private)                ;Backward compatibility
+    (setq TeX-style-private (list TeX-style-private)))
+
+(defcustom TeX-style-path
+  (let ((path))
+    ;; Put directories in an order where the more local files can
+    ;; override the more global ones.
+    (mapcar (lambda (file) (when file (add-to-list 'path file t)))
+           (append (list TeX-auto-global TeX-style-global)
+                   TeX-auto-private TeX-style-private
+                   (list TeX-auto-local TeX-style-local)))
+    path)
+  "List of directories to search for AUCTeX style files.
+Per default the list is built from the values of the variables
+`TeX-auto-global', `TeX-style-global', `TeX-auto-private',
+`TeX-style-private', `TeX-auto-local', and `TeX-style-local'."
+  :group 'TeX-file
+  :type '(repeat (file :format "%v")))
+
+(defcustom TeX-check-path
+  (append (list ".") TeX-macro-private TeX-macro-global)
+  "Directory path to search for dependencies.
+
+If nil, just check the current file.
+Used when checking if any files have changed."
+  :group 'TeX-file
+  :type '(repeat (file :format "%v")))
+
+;;; Style Files
+
+(defvar TeX-style-hook-list nil
+  "List of TeX style hooks currently loaded.
+
+Each entry is a list where the first element is the name of the style,
+and the remaining elements are hooks to be run when that style is
+active.")
+
+(defcustom TeX-byte-compile nil
+  "*Not nil means try to byte compile auto files before loading."
+  :group 'TeX-parse
+  :type 'boolean)
+
+(defun TeX-load-style (style)
+  "Search for and load each definition for STYLE in `TeX-style-path'."
+  (cond ((assoc style TeX-style-hook-list)) ; We already found it
+       ((string-match "\\`\\(.+[/\\]\\)\\([^/\\]*\\)\\'" style) ;Complex path
+        (let* ((dir (substring style (match-beginning 1) (match-end 1)))
+               (style (substring style (match-beginning 2) (match-end 2)))
+               (master-dir (if (stringp TeX-master)
+                               (file-name-directory
+                                (file-relative-name TeX-master))
+                             "./"))
+               (TeX-style-path (append (list (expand-file-name
+                                              TeX-auto-local dir)
+                                             (expand-file-name
+                                              TeX-auto-local master-dir)
+                                             (expand-file-name
+                                              TeX-style-local dir)
+                                             (expand-file-name
+                                              TeX-style-local master-dir))
+                                       TeX-style-path)))
+          (TeX-load-style style)))
+       (t                              ;Relative path
+        ;; Insert empty list to mark the fact that we have searched.
+        (setq TeX-style-hook-list (cons (list style) TeX-style-hook-list))
+        ;; Now check each element of the path
+        (dolist (name TeX-style-path)
+          (TeX-load-style-file (expand-file-name style name))))))
+
+(defun TeX-load-style-file (file)
+  "Load FILE checking for a Lisp extensions."
+  (let ((el (concat file ".el"))
+       (elc (concat file ".elc")))
+    (cond ((file-newer-than-file-p el elc)
+          (if (file-readable-p el)
+              (if (and TeX-byte-compile
+                       (file-writable-p elc)
+                       (save-excursion
+                         ;; `byte-compile-file' switches buffer in Emacs 20.3.
+                         (byte-compile-file el))
+                       (file-readable-p elc))
+                  (load-file elc)
+                (load-file el))))
+         ((file-readable-p elc)
+          (load-file elc))
+         ((file-readable-p el)
+          (load-file el)))))
+
+(defun TeX-add-style-hook (style hook)
+  "Give STYLE yet another HOOK to run."
+  (let ((entry (assoc style TeX-style-hook-list)))
+    (cond ((null entry)
+          ;; New style, add entry.
+          (setq TeX-style-hook-list (cons (list style hook)
+                                          TeX-style-hook-list)))
+         ((member hook entry)
+          ;; Old style, hook already there, do nothing.
+          nil)
+         (t
+          ;; Old style, new hook.
+          (setcdr entry (cons hook (cdr entry)))))))
+
+(defun TeX-unload-style (style)
+  "Forget that we once loaded STYLE."
+  (cond ((null (assoc style TeX-style-hook-list)))
+       ((equal (car (car TeX-style-hook-list)) style)
+        (setq TeX-style-hook-list (cdr TeX-style-hook-list)))
+       (t
+        (let ((entry TeX-style-hook-list))
+          (while (not (equal (car (car (cdr entry))) style))
+            (setq entry (cdr entry)))
+          (setcdr entry (cdr (cdr entry)))))))
+
+(defcustom TeX-virgin-style (if (and TeX-auto-global
+                                    (file-directory-p TeX-auto-global))
+                               "virtex"
+                             "NoVirtexSymbols")
+  "Style all documents use."
+  :group 'TeX-parse
+  :type 'string)
+
+(defvar TeX-active-styles nil
+  "List of styles currently active in the document.")
+ (make-variable-buffer-local 'TeX-active-styles)
+
+(defun TeX-run-style-hooks (&rest styles)
+  "Run the TeX style hooks STYLES."
+  (mapcar (lambda (style)
+           ;; Avoid recursion.
+           (unless (TeX-member style TeX-active-styles 'string-equal)
+             (setq TeX-active-styles
+                   (cons style TeX-active-styles))
+             (TeX-load-style style)
+             (let ((default-directory default-directory))
+               ;; Complex path.
+               (when (string-match "\\`\\(.+[/\\]\\)\\([^/\\]*\\)\\'" style)
+                 ;; Set `default-directory' to directory of master
+                 ;; file since style files not stored in the fixed
+                 ;; style directories are usually located there.
+                 (setq default-directory (save-match-data
+                                           (TeX-master-directory))
+                       style (substring style
+                                        (match-beginning 2) (match-end 2))))
+               (mapcar 'funcall
+                       (cdr-safe (assoc style TeX-style-hook-list))))))
+         styles))
+
+(defcustom TeX-parse-self nil
+  "Parse file after loading it if no style hook is found for it."
+  :group 'TeX-parse
+  :type 'boolean)
+
+(defvar TeX-style-hook-applied-p nil
+  "Nil, unless the style specific hooks have been applied.")
+ (make-variable-buffer-local 'TeX-style-hook-applied-p)
+
+(defvar TeX-update-style-hook nil
+  "Hook run as soon as style specific hooks were applied.")
+
+(defun TeX-update-style (&optional force)
+  "Run style specific hooks for the current document.
+
+Only do this if it has not been done before, or if optional argument
+FORCE is not nil."
+  (unless (or (and (boundp 'TeX-auto-update)
+                  (eq TeX-auto-update 'BibTeX)) ; Not a real TeX buffer
+             (and (not force)
+                  TeX-style-hook-applied-p))
+    (setq TeX-style-hook-applied-p t)
+    (message "Applying style hooks...")
+    (TeX-run-style-hooks (TeX-strip-extension nil nil t))
+    ;; Run parent style hooks if it has a single parent that isn't itself.
+    (if (or (not (memq TeX-master '(nil t)))
+           (and (buffer-file-name)
+                (string-match TeX-one-master
+                              (file-name-nondirectory (buffer-file-name)))))
+       (TeX-run-style-hooks (TeX-master-file)))
+    (if (and TeX-parse-self
+            (null (cdr-safe (assoc (TeX-strip-extension nil nil t)
+                                   TeX-style-hook-list))))
+       (TeX-auto-apply))
+    (run-hooks 'TeX-update-style-hook)
+    (message "Applying style hooks... done")))
+
+(defvar TeX-remove-style-hook nil
+  "List of hooks to call when we remove the style specific information.")
+ (make-variable-buffer-local 'TeX-remove-style-hook)
+
+(defun TeX-remove-style ()
+  "Remove all style specific information."
+  (setq TeX-style-hook-applied-p nil)
+  (run-hooks 'TeX-remove-style-hook)
+  (setq TeX-active-styles (list TeX-virgin-style)))
+
+(defun TeX-style-list ()
+  "Return a list of all styles (subfiles) used by the current document."
+  (TeX-update-style)
+  TeX-active-styles)
+
+;;; Special Characters
+
+(defvar TeX-esc "\\" "The TeX escape character.")
+ (make-variable-buffer-local 'TeX-esc)
+
+(defvar TeX-grop "{" "The TeX group opening character.")
+ (make-variable-buffer-local 'TeX-grop)
+
+(defvar TeX-grcl "}" "The TeX group closing character.")
+ (make-variable-buffer-local 'TeX-grcl)
+
+(defcustom plain-TeX-enable-toolbar t
+  "Enable TeX tool bar in plain TeX mode."
+  :group 'TeX-tool-bar
+  :type 'boolean)
+
+(defun plain-TeX-maybe-install-toolbar ()
+  "Conditionally install tool bar buttons for plain TeX mode.
+Install tool bar if `plain-TeX-enable-toolbar' is non-nil."
+  (when plain-TeX-enable-toolbar
+    ;; Defined in `tex-bar.el':
+    (TeX-install-toolbar)))
+
+;;; Symbols
+
+;; Must be before keymaps.
+
+(defgroup TeX-macro nil
+  "Support for TeX macros in AUCTeX."
+  :prefix "TeX-"
+  :group 'AUCTeX)
+
+(defcustom TeX-complete-word 'ispell-complete-word
+  "*Function to call for completing non-macros in `tex-mode'."
+  :group 'TeX-macro)
+
+(defvar TeX-complete-list nil
+  "List of ways to complete the preceding text.
+
+Each entry is a list with the following elements:
+
+0. Regexp matching the preceding text.
+1. A number indicating the subgroup in the regexp containing the text.
+2. A function returning an alist of possible completions.
+3. Text to append after a succesful completion.
+
+Or alternatively:
+
+0. Regexp matching the preceding text.
+1. Function to do the actual completion.")
+
+(defun TeX-complete-symbol ()
+  "Perform completion on TeX/LaTeX symbol preceding point."
+  (interactive "*")
+  (let ((list TeX-complete-list)
+       entry)
+    (while list
+      (setq entry (car list)
+           list (cdr list))
+      (if (TeX-looking-at-backward (car entry) 250)
+         (setq list nil)))
+    (if (numberp (nth 1 entry))
+       (let* ((sub (nth 1 entry))
+              (close (nth 3 entry))
+              (begin (match-beginning sub))
+              (end (match-end sub))
+              (pattern (TeX-match-buffer 0))
+              (symbol (buffer-substring begin end))
+              (list (funcall (nth 2 entry)))
+              (completion (try-completion symbol list)))
+         (cond ((eq completion t)
+                (and close
+                     (not (looking-at (regexp-quote close)))
+                     (insert close)))
+               ((null completion)
+                (error "Can't find completion for \"%s\"" pattern))
+               ((not (string-equal symbol completion))
+                (delete-region begin end)
+                (insert completion)
+                (and close
+                     (eq (try-completion completion list) t)
+                     (not (looking-at (regexp-quote close)))
+                     (insert close)))
+               (t
+                (message "Making completion list...")
+                (let ((list (all-completions symbol list nil)))
+                  (with-output-to-temp-buffer "*Completions*"
+                    (display-completion-list list)))
+                (message "Making completion list...done"))))
+      (funcall (nth 1 entry)))))
+
+(defcustom TeX-default-macro "ref"
+  "*The default macro when creating new ones with `TeX-insert-macro'."
+  :group 'TeX-macro
+  :type 'string)
+
+(make-variable-buffer-local 'TeX-default-macro)
+
+(defcustom TeX-insert-braces t
+  "*If non-nil, append a empty pair of braces after inserting a macro."
+  :group 'TeX-macro
+  :type 'boolean)
+
+(defcustom TeX-insert-macro-default-style 'show-optional-args
+  "Specifies whether `TeX-insert-macro' will ask for all optional arguments.
+
+If set to the symbol `show-optional-args', `TeX-insert-macro' asks for
+optional arguments of TeX marcos.  If set to `mandatory-args-only',
+`TeX-insert-macro' asks only for mandatory argument.
+
+When `TeX-insert-macro' is called with \\[universal-argument], it's the other
+way round.
+
+Note that for some macros, there are special mechanisms, see e.g.
+`LaTeX-includegraphics-options-alist'."
+  :group 'TeX-macro
+  :type '(choice (const mandatory-args-only)
+                (const show-optional-args)))
+
+(defvar TeX-arg-opening-brace nil
+  "String used as an opening brace for argument insertion.
+The variable will be temporarily let-bound with the necessary value.")
+
+(defvar TeX-arg-closing-brace nil
+  "String used as a closing brace for argument insertion.
+The variable will be temporarily let-bound with the necessary value.")
+
+(defvar TeX-after-insert-macro-hook nil
+  "A hook run after `TeX-insert-macro'.")
+
+(defvar TeX-macro-history nil)
+
+(defun TeX-insert-macro (symbol)
+  "Insert TeX macro SYMBOL with completion.
+
+AUCTeX knows of some macros and may query for extra arguments, depending on
+the value of `TeX-insert-macro-default-style' and whether `TeX-insert-macro'
+is called with \\[universal-argument]."
+  ;; When called with a prefix (C-u), only ask for mandatory arguments,
+  ;; i.e. all optional arguments are skipped.  See `TeX-parse-arguments' for
+  ;; details.  Note that this behavior may be changed in favor of a more
+  ;; flexible solution in the future, therefore we don't document it at the
+  ;; moment.
+  (interactive (list (completing-read (concat "Macro (default "
+                                             TeX-default-macro
+                                             "): "
+                                             TeX-esc)
+                                     (TeX-symbol-list) nil nil nil
+                                     'TeX-macro-history)))
+  (cond ((string-equal symbol "")
+        (setq symbol TeX-default-macro))
+       ((interactive-p)
+        (setq TeX-default-macro symbol)))
+  (TeX-parse-macro symbol (cdr-safe (assoc symbol (TeX-symbol-list))))
+  (run-hooks 'TeX-after-insert-macro-hook))
+
+(defvar TeX-electric-macro-map
+  (let ((map (make-sparse-keymap)))
+    (set-keymap-parent map minibuffer-local-completion-map)
+    (define-key map " " 'minibuffer-complete-and-exit)
+    map))
+
+(defun TeX-electric-macro ()
+  "Insert TeX macro with completion.
+
+AUCTeX knows of some macros, and may query for extra arguments.
+Space will complete and exit."
+  (interactive)
+  (cond ((eq (preceding-char) ?\\)
+        (call-interactively 'self-insert-command))
+       ((eq (preceding-char) ?.)
+        (let ((TeX-default-macro " ")
+              (minibuffer-local-completion-map TeX-electric-macro-map))
+          (call-interactively 'TeX-insert-macro)))
+       (t
+        (let ((minibuffer-local-completion-map TeX-electric-macro-map))
+          (call-interactively 'TeX-insert-macro)))))
+
+(defun TeX-parse-macro (symbol args)
+  "How to parse TeX macros which takes one or more arguments.
+
+First argument SYMBOL is the name of the macro.
+
+If called with no additional arguments, insert macro with point
+inside braces.  Otherwise, each argument of this function should
+match an argument to the TeX macro.  What is done depend on the
+type of ARGS:
+
+  string: Use the string as a prompt to prompt for the argument.
+
+  number: Insert that many braces, leave point inside the first.
+
+  nil: Insert empty braces.
+
+  t: Insert empty braces, leave point between the braces.
+
+  other symbols: Call the symbol as a function.  You can define
+  your own hook, or use one of the predefined argument hooks.  If
+  you add new hooks, you can assume that point is placed directly
+  after the previous argument, or after the macro name if this is
+  the first argument.  Please leave point located after the
+  argument you are inserting.  If you want point to be located
+  somewhere else after all hooks have been processed, set the value
+  of `exit-mark'.  It will point nowhere, until the argument hook
+  set it.  By convention, these hooks all start with `TeX-arg-'.
+
+  list: If the car is a string, insert it as a prompt and the next
+  element as initial input.  Otherwise, call the car of the list
+  with the remaining elements as arguments.
+
+  vector: Optional argument.  If it has more than one element,
+  parse it as a list, otherwise parse the only element as above.
+  Use square brackets instead of curly braces, and is not inserted
+  on empty user input."
+
+  (if (and (TeX-active-mark)
+          (> (point) (mark)))
+      (exchange-point-and-mark))
+  (insert TeX-esc symbol)
+  (let ((exit-mark (make-marker))
+       (position (point)))
+    (TeX-parse-arguments args)
+    (cond ((marker-position exit-mark)
+          (goto-char (marker-position exit-mark))
+          (set-marker exit-mark nil))
+         ((and TeX-insert-braces
+               ;; Do not add braces for macros defined as `("foo" 0)'
+               (not (and (= (safe-length args) 1)
+                         (numberp (car args))
+                         (= (car args) 0)))
+               (equal position (point))
+               (string-match "[a-zA-Z]+" symbol)
+               (not (texmathp)))
+          (insert TeX-grop)
+          (if (TeX-active-mark)
+              (progn
+                (exchange-point-and-mark)
+                (insert TeX-grcl))
+            (insert TeX-grcl)
+            (backward-char))))))
+
+(defun TeX-arg-string (optional &optional prompt initial-input)
+  "Prompt for a string.
+
+If OPTIONAL is not nil then the PROMPT will start with ``(Optional) ''.
+INITIAL-INPUT is a string to insert before reading input."
+  (TeX-argument-insert
+   (if (and (not optional) (TeX-active-mark))
+       (let ((TeX-argument (buffer-substring (point) (mark))))
+        (delete-region (point) (mark))
+        TeX-argument)
+     (read-string (TeX-argument-prompt optional prompt "Text") initial-input))
+   optional))
+
+(defun TeX-parse-arguments (args)
+  "Parse TeX macro arguments ARGS.
+
+See `TeX-parse-macro' for details."
+  (let ((last-optional-rejected nil)
+       skip-opt)
+    ;; Maybe get rid of all optional arguments.  See `TeX-insert-macro' for
+    ;; more comments.  See `TeX-insert-macro-default-style'.
+    (when (or (and (eq TeX-insert-macro-default-style 'show-optional-args)
+                  (equal current-prefix-arg '(4)))
+             (and (eq TeX-insert-macro-default-style 'mandatory-args-only)
+                  (null (equal current-prefix-arg '(4)))))
+      (while (vectorp (car args))
+       (setq args (cdr args))))
+
+    (while args
+      (if (vectorp (car args))
+         (unless last-optional-rejected
+           (let ((TeX-arg-opening-brace LaTeX-optop)
+                 (TeX-arg-closing-brace LaTeX-optcl))
+             (TeX-parse-argument t (if (equal (length (car args)) 1)
+                                       (aref (car args) 0)
+                                     (append (car args) nil)))))
+       (let ((TeX-arg-opening-brace TeX-grop)
+             (TeX-arg-closing-brace TeX-grcl))
+         (setq last-optional-rejected nil)
+         (TeX-parse-argument nil (car args))))
+      (setq args (cdr args)))))
+
+(defun TeX-parse-argument (optional arg)
+  "Depending on OPTIONAL, insert TeX macro argument ARG.
+If OPTIONAL is set, only insert if there is anything to insert, and
+then use square brackets instead of curly braces.
+
+See `TeX-parse-macro' for details."
+  (let (insert-flag)
+    (cond ((stringp arg)
+          (TeX-arg-string optional arg)
+          (setq insert-flag t))
+         ((numberp arg)
+          (unless (< arg 1)
+            (TeX-parse-argument optional t)
+            (while (> arg 1)
+              (TeX-parse-argument optional nil)
+              (setq arg (- arg 1)))))
+         ((null arg)
+          (insert TeX-arg-opening-brace)
+          (when (and (not optional) (TeX-active-mark))
+            (exchange-point-and-mark))
+          (insert TeX-arg-closing-brace)
+          (setq insert-flag t))
+         ((eq arg t)
+          (insert TeX-arg-opening-brace)
+          (if (and (not optional) (TeX-active-mark))
+              (progn
+                (exchange-point-and-mark))
+            (set-marker exit-mark (point)))
+          (insert TeX-arg-closing-brace)
+          (setq insert-flag t))
+         ((symbolp arg)
+          (funcall arg optional))
+         ((listp arg)
+          (let ((head (car arg))
+                (tail (cdr arg)))
+            (cond ((stringp head)
+                   (apply 'TeX-arg-string optional arg))
+                  ((symbolp head)
+                   (apply head optional tail))
+                  (t (error "Unknown list argument type %s"
+                            (prin1-to-string head))))))
+         (t (error "Unknown argument type %s" (prin1-to-string arg))))
+    (when (and insert-flag (not optional) (TeX-active-mark))
+      (TeX-deactivate-mark))))
+
+(defun TeX-argument-insert (name optional &optional prefix)
+  "Insert NAME surrounded by curly braces.
+
+If OPTIONAL, only insert it if not empty, and then use square brackets.
+If PREFIX is given, insert it before NAME."
+  (if (and optional (string-equal name ""))
+      (setq last-optional-rejected t)
+    (insert TeX-arg-opening-brace)
+    (if prefix
+       (insert prefix))
+    (if (and (string-equal name "")
+            (null (marker-position exit-mark)))
+       (set-marker exit-mark (point))
+      (insert name))
+    (insert TeX-arg-closing-brace)))
+
+(defun TeX-argument-prompt (optional prompt default &optional complete)
+  "Return a argument prompt.
+
+If OPTIONAL is not nil then the prompt will start with ``(Optional) ''.
+
+PROMPT will be used if not nil, otherwise use DEFAULT.
+
+Unless optional argument COMPLETE is non-nil, ``: '' will be appended."
+  (concat (if optional "(Optional) " "")
+         (if prompt prompt default)
+         (if complete "" ": ")))
+
+(defun TeX-string-divide-number-unit (string)
+  "Divide number and unit in STRING.
+Return the number as car and unit as cdr."
+  (if (string-match "[0-9]*\\.?[0-9]+" string)
+      (list (substring string 0 (string-match "[^.0-9]" string))
+           (substring string (if (string-match "[^.0-9]" string)
+                                 (string-match "[^.0-9]" string)
+                               (length string))))
+    (list "" string)))
+
+(defcustom TeX-default-unit-for-image "cm"
+  "Default unit when prompting for an image size."
+  :group 'TeX-macro
+  :type '(choice (const "cm")
+                (const "in")
+                (const "\\linewidth")
+                (string :tag "Other")))
+
+(defun TeX-arg-maybe (symbol list form)
+  "Evaluates FORM, if SYMBOL is an element of LIST."
+  (when (memq symbol list)
+    (eval form)))
+
+(defun TeX-arg-free (optional &rest args)
+  "Parse its arguments but use no braces when they are inserted."
+  (let ((TeX-arg-opening-brace "")
+       (TeX-arg-closing-brace ""))
+    (if (equal (length args) 1)
+       (TeX-parse-argument optional (car args))
+      (TeX-parse-argument optional args))))
+
+(defun TeX-arg-literal (optional &rest args)
+  "Insert its arguments ARGS into the buffer.
+Used for specifying extra syntax for a macro."
+  ;; FIXME: What is the purpose of OPTIONAL here?  -- rs
+  (apply 'insert args))
+
+
+;;; Font Locking
+
+(defcustom TeX-install-font-lock 'font-latex-setup
+  "Function to call to install font lock support.
+Choose `ignore' if you don't want AUCTeX to install support for font locking."
+  :group 'TeX-misc
+  :type '(radio (function-item font-latex-setup)
+               (function-item tex-font-setup)
+               (function-item ignore)
+               (function :tag "Other")))
+
+;;; The Mode
+
+(defvar TeX-format-list
+  '(("JLATEX" japanese-latex-mode
+     "\\\\\\(documentstyle\\|documentclass\\)[^%\n]*{\\(j[s-]?\\|t\\)\
+\\(article\\|report\\|book\\|slides\\)")
+    ("JTEX" japanese-plain-tex-mode
+     "-- string likely in Japanese TeX --")
+    ("AMSTEX" ams-tex-mode
+     "\\\\document\\b")
+    ("CONTEXT" context-mode
+     "\\\\\\(start\\(text\\|tekst\\|proje[ck]t\\|proiect\\|\
+produ[ck]t\\|produs\\|environment\\|omgeving\\|umgebung\\|prostredi\\|mediu\\|\
+component\\|onderdeel\\|komponent[ea]\\|componenta\\)\
+\\|inizia\\(testo\\|progetto\\|prodotto\\|ambiente\\|componente\\)\
+\\)\\|%.*?interface=")
+    ("LATEX" latex-mode
+     "\\\\\\(begin\\|\\(?:sub\\)\\{0,2\\}section\\|chapter\\|documentstyle\\|\
+documentclass\\)\\b")
+    ("TEX" plain-tex-mode "."))
+  "*List of format packages to consider when choosing a TeX mode.
+
+A list with an entry for each format package available at the site.
+
+Each entry is a list with three elements.
+
+1. The name of the format package.
+2. The name of the major mode.
+3. A regexp typically matched in the beginning of the file.
+
+When entering `tex-mode', each regexp is tried in turn in order to find
+the major mode to be used.")
+
+(defcustom TeX-default-mode 'latex-mode
+  "*Mode to enter for a new file when it can't be determined otherwise."
+  :group 'TeX-misc
+  :type '(radio (function-item latex-mode)
+               (function-item plain-tex-mode)
+               (function :tag "Other")))
+
+(defcustom TeX-force-default-mode nil
+  "*If set to nil, try to infer the mode of the file from its content."
+  :group 'TeX-misc
+  :type 'boolean)
+
+;;;###autoload
+(defun TeX-tex-mode ()
+  "Major mode in AUCTeX for editing TeX or LaTeX files.
+Tries to guess whether this file is for plain TeX or LaTeX.
+
+The algorithm is as follows:
+
+   1) if the file is empty or `TeX-force-default-mode' is not set to nil,
+      `TeX-default-mode' is chosen
+   2) If \\documentstyle or \\begin{, \\section{, \\part{ or \\chapter{ is
+      found, `latex-mode' is selected.
+   3) Otherwise, use `plain-tex-mode'"
+  (interactive)
+
+  (funcall (if (or (equal (buffer-size) 0)
+                  TeX-force-default-mode)
+              TeX-default-mode
+            (save-excursion
+              (goto-char (point-min))
+              (let ((comment-start-skip ;Used by TeX-in-comment
+                     (concat
+                      "\\(\\(^\\|[^\\\n]\\)\\("
+                      (regexp-quote TeX-esc)
+                      (regexp-quote TeX-esc)
+                      "\\)*\\)\\(%+ *\\)"))
+                    (entry TeX-format-list)
+                    answer)
+                (while (and entry (not answer))
+                  (if (re-search-forward (nth 2 (car entry))
+                                         10000 t)
+                      (if (not (TeX-in-comment))
+                          (setq answer (nth 1 (car entry))))
+                    (setq entry (cdr entry))))
+                (if answer
+                    answer
+                  TeX-default-mode))))))
+
+(defun VirTeX-common-initialization ()
+  "Perform basic initialization."
+  (kill-all-local-variables)
+  (setq TeX-mode-p t)
+  (setq TeX-output-extension (if TeX-PDF-mode "pdf" "dvi"))
+  (setq local-abbrev-table text-mode-abbrev-table)
+  (setq indent-tabs-mode nil)
+
+  ;; Ispell support
+  (make-local-variable 'ispell-parser)
+  (setq ispell-parser 'tex)
+  (make-local-variable 'ispell-tex-p)
+  (setq ispell-tex-p t)
+  
+  ;; Redefine some standard variables
+  (make-local-variable 'paragraph-start)
+  (make-local-variable 'paragraph-separate)
+  (make-local-variable 'comment-start)
+  (setq comment-start "%")
+  (make-local-variable 'comment-start-skip)
+  (setq comment-start-skip
+       (concat
+        "\\(\\(^\\|[^\\\n]\\)\\("
+        (regexp-quote TeX-esc)
+        (regexp-quote TeX-esc)
+        "\\)*\\)\\(%+[ \t]*\\)"))
+  (set (make-local-variable 'comment-end-skip) "[ \t]*\\(\\s>\\|\n\\)")
+  (set (make-local-variable 'comment-use-syntax) t)
+  ;; `comment-padding' is defined here as an integer for compatibility
+  ;; reasons because older Emacsen could not cope with a string.
+  (make-local-variable 'comment-padding)
+  (setq comment-padding 1)
+  ;; Removed as commenting in (La)TeX is done with one `%' not two
+  ;; (make-local-variable 'comment-add)
+  ;; (setq comment-add 1) ;default to `%%' in comment-region
+  (make-local-variable 'comment-indent-function)
+  (setq comment-indent-function 'TeX-comment-indent)
+  (make-local-variable 'comment-multi-line)
+  (setq comment-multi-line nil)
+  (make-local-variable 'compile-command)
+  (unless (boundp 'compile-command)
+    (setq compile-command "make"))
+  (make-local-variable 'words-include-escapes)
+  (setq words-include-escapes nil)
+
+  ;; Make TAB stand out
+  ;;  (make-local-variable 'buffer-display-table)
+  ;;  (setq buffer-display-table (if standard-display-table
+  ;;                            (copy-sequence standard-display-table)
+  ;;                          (make-display-table)))
+  ;;  (aset buffer-display-table ?\t (apply 'vector (append "<TAB>" nil)))
+
+  ;; Symbol completion.
+  (make-local-variable 'TeX-complete-list)
+  (setq TeX-complete-list
+       (list (list "\\\\\\([a-zA-Z]*\\)"
+                   1 'TeX-symbol-list (if TeX-insert-braces "{}"))
+             (list "" TeX-complete-word)))
+
+  (funcall TeX-install-font-lock)
+
+  ;; We want this to be early in the list, so we do not add it before
+  ;; we enter TeX mode  the first time.
+  (if (boundp 'local-write-file-hooks)
+      (add-hook 'local-write-file-hooks 'TeX-safe-auto-write)
+    (add-hook 'write-file-hooks 'TeX-safe-auto-write))
+  (make-local-variable 'TeX-auto-update)
+  (setq TeX-auto-update t)
+
+  ;; Minor modes
+  (when TeX-source-correlate-mode
+    (TeX-source-correlate-mode 1))
+
+  ;; Let `TeX-master-file' be called after a new file was opened and
+  ;; call `TeX-update-style' on any file opened.  (The addition to the
+  ;; hook has to be made here because its local value will be deleted
+  ;; by `kill-all-local-variables' if it is added e.g. in `tex-mode'.)
+  ;;
+  ;; `TeX-update-style' has to be called before
+  ;; `global-font-lock-mode', which may also be specified in
+  ;; `find-file-hooks', gets called.  Otherwise style-based
+  ;; fontification will break (in XEmacs).  That means, `add-hook'
+  ;; cannot be called with a non-nil value of the APPEND argument.
+  ;;
+  ;; `(TeX-master-file nil nil t)' has to be called *before*
+  ;; `TeX-update-style' as the latter will call `TeX-master-file'
+  ;; without the `ask' bit set.
+  (when (and (featurep 'xemacs) (not (emacs-version>= 21 5)))
+    (make-local-hook 'find-file-hooks))
+  (add-hook 'find-file-hooks
+           (lambda ()
+             ;; Check if we are looking at a new or shared file.
+             (when (or (not (file-exists-p (buffer-file-name)))
+                       (eq TeX-master 'shared))
+               (TeX-master-file nil nil t))
+             (TeX-update-style t)) nil t))
+
+;;; Plain TeX mode
+
+(defcustom plain-TeX-clean-intermediate-suffixes
+  TeX-clean-default-intermediate-suffixes
+  "List of regexps matching suffixes of intermediate files to be deleted.
+The regexps will be anchored at the end of the file name to be matched,
+i.e. you do _not_ have to cater for this yourself by adding \\\\' or $."
+  :type '(repeat regexp)
+  :group 'TeX-command)
+
+(defcustom plain-TeX-clean-output-suffixes TeX-clean-default-output-suffixes
+  "List of regexps matching suffixes of output files to be deleted.
+The regexps will be anchored at the end of the file name to be matched,
+i.e. you do _not_ have to cater for this yourself by adding \\\\' or $."
+  :type '(repeat regexp)
+  :group 'TeX-command)
+
+(defcustom plain-TeX-mode-hook nil
+  "A hook run in plain TeX mode buffers."
+  :type 'hook
+  :group 'TeX-misc)
+
+;;;###autoload
+(defun TeX-plain-tex-mode ()
+  "Major mode in AUCTeX for editing plain TeX files.
+See info under AUCTeX for documentation.
+
+Special commands:
+\\{plain-TeX-mode-map}
+
+Entering `plain-tex-mode' calls the value of `text-mode-hook',
+then the value of `TeX-mode-hook', and then the value
+of plain-TeX-mode-hook."
+  (interactive)
+  (plain-TeX-common-initialization)
+  (setq major-mode 'plain-tex-mode)
+  (use-local-map plain-TeX-mode-map)
+  (easy-menu-add plain-TeX-mode-menu plain-TeX-mode-map)
+  (easy-menu-add plain-TeX-mode-command-menu plain-TeX-mode-map)
+  (setq TeX-base-mode-name "TeX")
+  (setq TeX-command-default "TeX")
+  (setq TeX-sentinel-default-function 'TeX-TeX-sentinel)
+  (add-hook 'tool-bar-mode-on-hook 'plain-TeX-maybe-install-toolbar nil t)
+  (when (if (featurep 'xemacs)
+           (featurep 'toolbar)
+         (and (boundp 'tool-bar-mode) tool-bar-mode))
+    (plain-TeX-maybe-install-toolbar))
+  (TeX-run-mode-hooks 'text-mode-hook 'TeX-mode-hook 'plain-TeX-mode-hook)
+  (TeX-set-mode-name))
+
+(defun plain-TeX-common-initialization ()
+  "Common initialization for plain TeX like modes."
+  (VirTeX-common-initialization)
+  (set-syntax-table TeX-mode-syntax-table)
+  (setq paragraph-start
+       (concat
+        "\\(^[ \t]*$"
+        "\\|" (regexp-quote TeX-esc) "par\\|"
+        "^[ \t]*"
+        (regexp-quote TeX-esc)
+        "\\("
+        "begin\\|end\\|part\\|chapter\\|"
+        "section\\|subsection\\|subsubsection\\|"
+        "paragraph\\|include\\|includeonly\\|"
+        "tableofcontents\\|appendix\\|label\\|caption\\|"
+        "\\[\\|\\]"                    ; display math delimitors
+        "\\)"
+        "\\|"
+        "^[ \t]*\\$\\$"                ; display math delimitor
+        "\\)" ))
+  (setq paragraph-separate
+       (concat
+        "[ \t]*"
+        "\\("
+        (regexp-quote TeX-esc) "par\\|"
+        "%\\|"
+        "$\\|"
+        "\\$\\$\\|"
+        (regexp-quote TeX-esc)
+        "\\("
+        "begin\\|end\\|label\\|caption\\|part\\|chapter\\|"
+        "section\\|subsection\\|subsubsection\\|"
+        "paragraph\\|include\\|includeonly\\|"
+        "tableofcontents\\|appendix\\|" (regexp-quote TeX-esc)
+        "\\)"
+        "\\)"))
+  (setq TeX-header-end (regexp-quote "%**end of header"))
+  (setq TeX-trailer-start (regexp-quote (concat TeX-esc "bye")))
+  (TeX-run-style-hooks "TEX"))
+
+;;; Hilighting
+
+(if (boundp 'hilit-patterns-alist)
+    (let ((latex-patterns (cdr-safe (assq 'latex-mode hilit-patterns-alist)))
+         (plain-tex-patterns (cdr-safe (assq 'plain-tex-mode
+                                             hilit-patterns-alist))))
+      (if (and latex-patterns plain-tex-patterns)
+         (setq hilit-patterns-alist
+               (append (list (cons 'ams-tex-mode plain-tex-patterns))
+                       hilit-patterns-alist)))))
+
+;;; Parsing
+
+(defgroup TeX-parse nil
+  "Parsing TeX files from AUCTeX."
+  :group 'AUCTeX)
+
+(defvar TeX-auto-parser '((styles TeX-auto-file TeX-run-style-hooks)))
+;; Alist of parsed information.
+;; Each entry is a list with the following elements:
+;;
+;; 0. Name of information type.
+;; 1. Name of temporary variable used when parsing.
+;; 2. Name of function to add information to add to #3.
+;; 3. Name of variable holding buffer local information.
+;; 4. Name of variable indicating that #3 has changed.
+
+
+(defconst TeX-auto-parser-temporary 1)
+(defconst TeX-auto-parser-add 2)
+(defconst TeX-auto-parser-local 3)
+(defconst TeX-auto-parser-change 4)
+
+(defun TeX-auto-add-type (name prefix &optional plural)
+  "Add information about NAME to the parser using PREFIX.
+
+Optional third argument PLURAL is the plural form of TYPE.
+By default just add an `s'.
+
+This function create a set of variables and functions to maintain a
+separate type of information in the parser."
+  (let* ((names (or plural (concat name "s")))
+        (tmp (intern (concat prefix "-auto-" name)))
+        (add (intern (concat prefix "-add-" names)))
+        (local (intern (concat prefix "-" name "-list")))
+        (change (intern (concat prefix "-" name "-changed"))))
+    (setq TeX-auto-parser
+         (cons (list name tmp add local change) TeX-auto-parser))
+    (set local nil)
+    (make-variable-buffer-local local)
+    (set change nil)
+    (make-variable-buffer-local change)
+    (fset add `(lambda (&rest entries)
+                ,(concat "Add information about " (upcase name)
+                         " to the current buffer.
+Generated by `TeX-auto-add-type'.")
+                (TeX-auto-add-information ,name entries)))
+    (fset local `(lambda nil
+                  ,(concat "List of " names
+                           " active in the current buffer.
+Generated by `TeX-auto-add-type'.")
+                  (TeX-auto-list-information ,name)))
+    (add-hook 'TeX-remove-style-hook
+             `(lambda nil (setq ,(symbol-name local) nil)))))
+
+(defun TeX-auto-add-information (name entries)
+  "For NAME in `TeX-auto-parser' add ENTRIES."
+  (let* ((entry (assoc name TeX-auto-parser))
+        (change (nth TeX-auto-parser-change entry))
+        (change-value (symbol-value change))
+        (local (nth TeX-auto-parser-local entry))
+        (local-value (symbol-value local)))
+    (if change-value
+       (set local (cons entries local-value))
+      (set change t)
+      (set local (list entries local-value)))))
+
+(defun TeX-auto-list-information (name)
+  "Return information in `TeX-auto-parser' about NAME."
+  (TeX-update-style)
+  (let* ((entry (assoc name TeX-auto-parser))
+        (change (nth TeX-auto-parser-change entry))
+        (change-value (symbol-value change))
+        (local (nth TeX-auto-parser-local entry)))
+    (if (not change-value)
+       ()
+      (set change nil)
+      ;; Sort it
+      (message "Sorting %s..." name)
+      (set local
+          (sort (mapcar 'TeX-listify (apply 'append (symbol-value local)))
+                'TeX-car-string-lessp))
+      ;; Make it unique
+      (message "Removing duplicates...")
+      (let ((entry (symbol-value local)))
+       (while (and entry (cdr entry))
+         (let ((this (car entry))
+               (next (car (cdr entry))))
+           (if (not (string-equal (car this) (car next)))
+               (setq entry (cdr entry))
+             ;; We have two equal symbols.  Use the one with
+             ;; most arguments.
+             (if (> (length next) (length this))
+                 (setcdr this (cdr next)))
+             (setcdr entry (cdr (cdr entry)))))))
+      (message "Removing duplicates... done"))
+    (symbol-value local)))
+
+(TeX-auto-add-type "symbol" "TeX")
+
+(defvar TeX-auto-apply-hook nil
+  "Hook run when a buffer is parsed and the information is applied.")
+
+(defun TeX-auto-apply ()
+  "Parse and apply TeX information in the current buffer."
+  (TeX-auto-parse)
+  (run-hooks 'TeX-auto-apply-hook)
+  (mapcar 'TeX-auto-apply-entry TeX-auto-parser))
+
+(defun TeX-auto-apply-entry (entry)
+  "Apply the information in ENTRY in `TeX-auto-parser'."
+  (let ((value (symbol-value (nth TeX-auto-parser-temporary entry)))
+       (add (nth TeX-auto-parser-add entry)))
+    (if value (apply add value))))
+
+(defun TeX-safe-auto-write ()
+  "Call `TeX-auto-write' safely."
+  (condition-case name
+      (and (boundp 'TeX-auto-update)
+          TeX-auto-update
+          (TeX-auto-write))
+    (error nil))
+  ;; Continue with the other write file hooks.
+  nil)
+
+(defcustom TeX-auto-save nil
+  "*Automatically save style information when saving the buffer."
+  :group 'TeX-parse
+  :type 'boolean)
+
+(defcustom TeX-auto-untabify nil
+  "*Automatically untabify when saving the buffer."
+  :group 'TeX-parse
+  :type 'boolean)
+
+(defun TeX-auto-write ()
+  "Save all relevant TeX information from the current buffer."
+  (if TeX-auto-untabify
+      (untabify (point-min) (point-max)))
+  (if (and TeX-auto-save TeX-auto-local)
+      (let* ((file (expand-file-name
+                   (concat
+                    (file-name-as-directory TeX-auto-local)
+                    (TeX-strip-extension nil TeX-all-extensions t)
+                    ".el")
+                   (TeX-master-directory)))
+            (dir (file-name-directory file)))
+       ;; Create auto directory if possible.
+       (if (not (file-exists-p dir))
+           (condition-case name
+               (make-directory dir)
+             (error nil)))
+       (if (file-writable-p file)
+           (save-excursion
+             (TeX-update-style)
+             (TeX-auto-store file))
+         (message "Can't write style information.")))))
+
+(defcustom TeX-macro-default (car-safe TeX-macro-private)
+  "*Default directory to search for TeX macros."
+  :group 'TeX-file
+  :type 'directory)
+
+(defcustom TeX-auto-default (car-safe TeX-auto-private)
+  "*Default directory to place automatically generated TeX information."
+  :group 'TeX-file
+  :type 'directory)
+
+;;;###autoload
+(defun TeX-auto-generate (tex auto)
+  "Generate style file for TEX and store it in AUTO.
+If TEX is a directory, generate style files for all files in the directory."
+  (interactive (list (setq TeX-macro-default
+                          (expand-file-name (read-file-name
+                                             "TeX file or directory: "
+                                             TeX-macro-default
+                                             TeX-macro-default 'confirm)))
+                    (setq TeX-auto-default
+                          (expand-file-name (read-file-name
+                                             "AUTO lisp directory: "
+                                             TeX-auto-default
+                                             TeX-auto-default 'confirm)))))
+  (cond ((not (file-readable-p tex)))
+       ((string-match TeX-ignore-file tex))
+       ((file-directory-p tex)
+        (let ((files (directory-files (expand-file-name tex)))
+              (default-directory (file-name-as-directory
+                                  (expand-file-name tex)))
+              (TeX-file-recurse (cond ((symbolp TeX-file-recurse)
+                                       TeX-file-recurse)
+                                      ((zerop TeX-file-recurse)
+                                       nil)
+                                      ((1- TeX-file-recurse)))))
+          (mapcar (lambda (file)
+                    (if (or TeX-file-recurse
+                            (not (file-directory-p file)))
+                        (TeX-auto-generate file auto)))
+                  files)))
+       ((not (file-newer-than-file-p
+              tex
+              (concat (file-name-as-directory auto)
+                      (TeX-strip-extension tex TeX-all-extensions t)
+                      ".el"))))
+       ((TeX-match-extension tex (append TeX-file-extensions
+                                         BibTeX-file-extensions))
+        (save-excursion
+          (set-buffer (let (enable-local-eval)
+                        (find-file-noselect tex)))
+          (message "Parsing %s..." tex)
+          (TeX-auto-store (concat (file-name-as-directory auto)
+                                  (TeX-strip-extension tex
+                                                       TeX-all-extensions
+                                                       t)
+                                  ".el"))
+          (kill-buffer (current-buffer))
+          (message "Parsing %s... done" tex)))))
+
+;;;###autoload
+(defun TeX-auto-generate-global ()
+  "Create global auto directory for global TeX macro definitions."
+  (interactive)
+  (unless (file-directory-p TeX-auto-global)
+    (make-directory TeX-auto-global))
+  (let ((TeX-file-extensions '("cls" "sty"))
+       (BibTeX-file-extensions nil))
+    (mapc (lambda (macro) (TeX-auto-generate macro TeX-auto-global))
+         TeX-macro-global))
+  (byte-recompile-directory TeX-auto-global 0))
+
+(defun TeX-auto-store (file)
+  "Extract information for AUCTeX from current buffer and store it in FILE."
+  (TeX-auto-parse)
+
+  (if (member nil (mapcar 'TeX-auto-entry-clear-p TeX-auto-parser))
+      (let ((style (TeX-strip-extension nil TeX-all-extensions t)))
+       (TeX-unload-style style)
+       (save-excursion
+         (set-buffer (generate-new-buffer file))
+         (erase-buffer)
+         (insert "(TeX-add-style-hook \"" style "\"\n"
+                 " (lambda ()")
+         (mapc (lambda (el) (TeX-auto-insert el style))
+               TeX-auto-parser)
+         (insert "))\n\n")
+         (write-region (point-min) (point-max) file nil 'silent)
+         (kill-buffer (current-buffer))))
+    (if (file-exists-p (concat file "c"))
+       (delete-file (concat file "c")))
+    (if (file-exists-p file)
+       (delete-file file))))
+
+(defun TeX-auto-entry-clear-p (entry)
+  "Check if the temporary for `TeX-auto-parser' entry ENTRY is clear."
+  ;; FIXME: This doc-string isn't clear to me.  -- rs
+  (null (symbol-value (nth TeX-auto-parser-temporary entry))))
+
+(defun TeX-auto-insert (entry &optional skip)
+  "Insert code to initialize ENTRY from `TeX-auto-parser'.
+
+If SKIP is not-nil, don't insert code for SKIP."
+  (let ((name (symbol-name (nth TeX-auto-parser-add entry)))
+       (list (symbol-value (nth TeX-auto-parser-temporary entry))))
+    (unless (null list)
+      (insert "\n    (" name)
+      (dolist (el list)
+       (cond ((and (stringp el) (not (string= el skip)))
+              (insert "\n     ")
+              (insert (prin1-to-string el)))
+             ((not (stringp el))
+              (insert "\n     ")
+              (insert "'" (prin1-to-string el)))))
+      (insert ")"))))
+
+(defvar TeX-auto-ignore
+  '("csname" "filedate" "fileversion" "docdate" "next" "labelitemi"
+    "labelitemii" "labelitemiii" "labelitemiv" "labelitemv"
+    "labelenumi" "labelenumii" "labelenumiii" "labelenumiv"
+    "labelenumv" "theenumi" "theenumii" "theenumiii" "theenumiv"
+    "theenumv" "document" "par" "do" "expandafter")
+  "List of symbols to ignore when scanning a TeX style file.")
+
+(defun TeX-auto-add-regexp (regexp)
+  "Add REGEXP to `TeX-auto-regexp-list' if not already a member."
+  (if (symbolp TeX-auto-regexp-list)
+      (setq TeX-auto-regexp-list (symbol-value TeX-auto-regexp-list)))
+  (or (memq regexp TeX-auto-regexp-list)
+      (setq TeX-auto-regexp-list (cons regexp TeX-auto-regexp-list))))
+
+(defvar TeX-auto-empty-regexp-list
+  '(("<IMPOSSIBLE>\\(\\'\\`\\)" 1 ignore))
+  "List of regular expressions guaranteed to match nothing.")
+
+(defvar TeX-token-char
+  (if (featurep 'mule)
+      "\\(?:[a-zA-Z]\\|\\cj\\)"
+    "[a-zA-Z]")
+  "Regexp matching a character in a TeX macro.
+
+Please use a shy group if you use a grouping construct, because
+the functions/variables which use `TeX-token-char' expect not to
+alter the numbering of any ordinary, non-shy groups.")
+
+(defvar plain-TeX-auto-regexp-list
+  (let ((token TeX-token-char))
+    `((,(concat "\\\\def\\\\\\(" token "+\\)[^a-zA-Z@]") 1 TeX-auto-symbol-check)
+      (,(concat "\\\\let\\\\\\(" token "+\\)[^a-zA-Z@]") 1 TeX-auto-symbol-check)
+      (,(concat "\\\\font\\\\\\(" token "+\\)[^a-zA-Z@]") 1 TeX-auto-symbol)
+      (,(concat "\\\\chardef\\\\\\(" token "+\\)[^a-zA-Z@]") 1 TeX-auto-symbol)
+      (,(concat "\\\\new\\(?:count\\|dimen\\|muskip\\|skip\\)\\\\\\(" token "+\\)[^a-zA-Z@]")
+       1 TeX-auto-symbol)
+      (,(concat "\\\\newfont{?\\\\\\(" token "+\\)}?") 1 TeX-auto-symbol)
+      (,(concat "\\\\typein\\[\\\\\\(" token "+\\)\\]") 1 TeX-auto-symbol)
+      ("\\\\input +\\(\\.*[^#%\\\\\\.\n\r]+\\)\\(\\.[^#%\\\\\\.\n\r]+\\)?"
+       1 TeX-auto-file)
+      (,(concat "\\\\mathchardef\\\\\\(" token "+\\)[^a-zA-Z@]") 1 TeX-auto-symbol)))
+  "List of regular expression matching common LaTeX macro definitions.")
+
+(defvar TeX-auto-full-regexp-list plain-TeX-auto-regexp-list
+  "Full list of regular expression matching TeX macro definitions.")
+
+(defvar TeX-auto-prepare-hook nil
+  "List of hooks to be called before parsing a TeX file.")
+
+(defvar TeX-auto-cleanup-hook nil
+  "List of hooks to be called after parsing a TeX file.")
+
+(defcustom TeX-auto-parse-length 999999
+  "Maximal length of TeX file (in characters) that will be parsed."
+  :group 'TeX-parse
+  :type 'integer)
+  (make-variable-buffer-local 'TeX-auto-parse-length)
+
+(defcustom TeX-auto-x-parse-length 0
+  "Maximum length of TeX file that will be parsed additionally.
+Use `TeX-auto-x-regexp-list' for parsing the region between
+`TeX-auto-parse-length' and this value."
+  :group 'TeX-parse
+  :type 'integer)
+  (make-variable-buffer-local 'TeX-auto-x-parse-length)
+
+(defcustom TeX-auto-x-regexp-list 'LaTeX-auto-label-regexp-list
+  "List of regular expressions used for additional parsing.
+See `TeX-auto-x-parse-length'."
+  :type '(radio (variable-item TeX-auto-empty-regexp-list)
+               (variable-item TeX-auto-full-regexp-list)
+               (variable-item plain-TeX-auto-regexp-list)
+               (variable-item LaTeX-auto-minimal-regexp-list)
+               (variable-item LaTeX-auto-label-regexp-list)
+               (variable-item LaTeX-auto-regexp-list)
+               (symbol :tag "Other")
+               (repeat :tag "Specify"
+                       (group (regexp :tag "Match")
+                              (sexp :tag "Groups")
+                              symbol)))
+  :group 'TeX-parse)
+  (make-variable-buffer-local 'TeX-auto-x-regexp-list)
+
+(defun TeX-regexp-group-count (regexp)
+  "Return number of groups in a REGEXP.  This is not foolproof:
+you should not use something like `[\\(]' for a character range."
+  (let (start (n 0))
+    (while (string-match "\\(\\`\\|[^\\]\\)\\(\\\\\\\\\\)*\\\\([^?]"
+                        regexp start)
+      (setq start (- (match-end 0) 2)
+           n (1+ n)))
+    n))
+
+(defun TeX-auto-parse-region (regexp-list beg end)
+  "Parse TeX information according to REGEXP-LIST between BEG and END."
+  (if (symbolp regexp-list)
+      (setq regexp-list (and (boundp regexp-list) (symbol-value regexp-list))))
+   (if regexp-list
+       ;; Extract the information.
+       (let* (groups
+             (count 1)
+             (regexp (concat "\\("
+                             (mapconcat
+                              (lambda(x)
+                                (push (cons count x) groups)
+                                (setq count
+                                      (+ 1 count
+                                         (TeX-regexp-group-count (car x))))
+                                (car x))
+                              regexp-list "\\)\\|\\(")
+                             "\\)"))
+             syms
+             lst)
+        (setq count 0)
+        (goto-char (if end (min end (point-max)) (point-max)))
+        (while (re-search-backward regexp beg t)
+          (let* ((entry (cdr (TeX-member nil groups
+                                         (lambda (a b)
+                                           (match-beginning (car b))))))
+                 (symbol (nth 2 entry))
+                 (match (nth 1 entry)))
+            (unless (TeX-in-comment)
+              (looking-at (nth 0 entry))
+              (if (fboundp symbol)
+                  (funcall symbol match)
+                (puthash (if (listp match)
+                             (mapcar #'TeX-match-buffer match)
+                           (TeX-match-buffer match))
+                         (setq count (1- count))
+                         (cdr (or (assq symbol syms)
+                                  (car (push
+                                        (cons symbol
+                                              (make-hash-table :test 'equal))
+                                        syms)))))))))
+        (setq count 0)
+        (dolist (symbol syms)
+          (setq lst (symbol-value (car symbol)))
+          (while lst
+            (puthash (pop lst)
+                     (setq count (1+ count))
+                     (cdr symbol)))
+          (maphash (lambda (key value)
+                     (push (cons value key) lst))
+                   (cdr symbol))
+          (clrhash (cdr symbol))
+          (set (car symbol) (mapcar #'cdr (sort lst #'car-less-than-car)))))))
+
+
+(defun TeX-auto-parse ()
+  "Parse TeX information in current buffer.
+
+Call the functions in `TeX-auto-prepare-hook' before parsing, and the
+functions in `TeX-auto-cleanup-hook' after parsing."
+
+  (let ((case-fold-search nil))
+
+    (mapc 'TeX-auto-clear-entry TeX-auto-parser)
+    (run-hooks 'TeX-auto-prepare-hook)
+
+    (save-excursion
+      (and (> TeX-auto-x-parse-length TeX-auto-parse-length)
+          (> (point-max) TeX-auto-parse-length)
+          (TeX-auto-parse-region TeX-auto-x-regexp-list
+                                 TeX-auto-parse-length
+                                 TeX-auto-x-parse-length))
+      (TeX-auto-parse-region TeX-auto-regexp-list
+                            nil TeX-auto-parse-length))
+
+    ;; Cleanup ignored symbols.
+
+    ;; NOTE: This is O(N M) where it could be O(N log N + M log M) if we
+    ;; sorted the lists first.
+    (while (member (car TeX-auto-symbol) TeX-auto-ignore)
+      (setq TeX-auto-symbol (cdr TeX-auto-symbol)))
+    (let ((list TeX-auto-symbol))
+      (while (and list (cdr list))
+       (if (member (car (cdr list)) TeX-auto-ignore)
+           (setcdr list (cdr (cdr list)))
+         (setq list (cdr list)))))
+
+    (run-hooks 'TeX-auto-cleanup-hook)))
+
+(defun TeX-auto-clear-entry (entry)
+  "Set the temporary variable in ENTRY to nil."
+  (set (nth TeX-auto-parser-temporary entry) nil))
+
+(defvar LaTeX-auto-end-symbol nil)
+
+(defun TeX-auto-symbol-check (match)
+  "Add MATCH to TeX-auto-symbols.
+Check for potential LaTeX environments."
+  (let ((symbol (if (listp match)
+                   (mapcar 'TeX-match-buffer match)
+                 (TeX-match-buffer match))))
+    (if (and (stringp symbol)
+            (string-match "^end\\(.+\\)$" symbol))
+       (add-to-list 'LaTeX-auto-end-symbol
+                    (substring symbol (match-beginning 1) (match-end 1)))
+      (if (listp symbol)
+         (dolist (elt symbol)
+           (add-to-list 'TeX-auto-symbol elt))
+       (add-to-list 'TeX-auto-symbol symbol)))))
+
+;;; Utilities
+;;
+;; Some of these functions has little to do with TeX, but nonetheless we
+;; should use the "TeX-" prefix to avoid name clashes.
+
+(defcustom TeX-auto-regexp-list 'TeX-auto-full-regexp-list
+  "*List of regular expressions used for parsing the current file."
+  :type '(radio (variable-item TeX-auto-empty-regexp-list)
+               (variable-item TeX-auto-full-regexp-list)
+               (variable-item plain-TeX-auto-regexp-list)
+               (variable-item LaTeX-auto-minimal-regexp-list)
+               (variable-item LaTeX-auto-label-regexp-list)
+               (variable-item LaTeX-auto-regexp-list)
+               (symbol :tag "Other")
+               (repeat :tag "Specify"
+                       (group (regexp :tag "Match")
+                              (sexp :tag "Groups")
+                              symbol)))
+  :group 'TeX-parse)
+  (make-variable-buffer-local 'TeX-auto-regexp-list)
+
+(defgroup TeX-file-extension nil
+  "File extensions recognized by AUCTeX."
+  :group 'TeX-file)
+
+(defcustom TeX-file-extensions '("tex" "sty" "cls" "ltx" "texi" "texinfo" "dtx")
+  "*File extensions used by manually generated TeX files."
+  :group 'TeX-file-extension
+  :type '(repeat (string :format "%v")))
+
+(defcustom TeX-all-extensions '("[^.\n]+")
+  "All possible file extensions."
+  :group 'TeX-file-extension
+  :type '(repeat (regexp :format "%v")))
+
+(defcustom TeX-default-extension "tex"
+  "*Default extension for TeX files."
+  :group 'TeX-file-extension
+  :type 'string)
+
+  (make-variable-buffer-local 'TeX-default-extension)
+
+(defcustom docTeX-default-extension "dtx"
+  "*Default extension for docTeX files."
+  :group 'TeX-file-extension
+  :type 'string)
+
+(defvar TeX-output-extension nil
+  "Extension of TeX output file.
+This is either a string or a list with
+a string as element.  Its value is obtained from `TeX-command-output-list'.
+Access to the value should be through the function `TeX-output-extension'.")
+
+  (make-variable-buffer-local 'TeX-output-extension)
+
+(defcustom BibTeX-file-extensions '("bib")
+  "Valid file extensions for BibTeX files."
+  :group 'TeX-file-extension
+  :type '(repeat (string :format "%v")))
+
+(defcustom BibTeX-style-extensions '("bst")
+  "Valid file extensions for BibTeX styles."
+  :group 'TeX-file-extension
+  :type '(repeat (string :format "%v")))
+
+(defcustom TeX-ignore-file "\\(^\\|[/\\]\\)\\(\\.\\|\\.\\.\\|RCS\\|SCCS\\|CVS\\|babel\\..*\\)$"
+  "Regular expression matching file names to ignore.
+
+These files or directories will not be considered when searching for
+TeX files in a directory."
+  :group 'TeX-parse
+  :type 'regexp)
+
+(defcustom TeX-file-recurse t
+  "*Whether to search TeX directories recursively.
+nil means do not recurse, a positive integer means go that far deep in the
+directory hierarchy, t means recurse indefinitely."
+  :group 'TeX-parse
+  :type '(choice (const :tag "On" t)
+                (const :tag "Off" nil)
+                (integer :tag "Depth" :value 1)))
+
+(defun TeX-match-extension (file &optional extensions)
+  "Return non-nil if FILE has one of EXTENSIONS.
+
+If EXTENSIONS is not specified or nil, the value of
+`TeX-file-extensions' is used instead."
+
+  (if (null extensions)
+      (setq extensions TeX-file-extensions))
+
+  (let ((regexp (concat "\\.\\("
+                       (mapconcat 'identity extensions "\\|")
+                       "\\)$"))
+       (case-fold-search t))
+    (string-match regexp file)))
+
+(defun TeX-strip-extension (&optional string extensions nodir nostrip)
+  "Return STRING without any trailing extension in EXTENSIONS.
+If NODIR is t, also remove directory part of STRING.
+If NODIR is `path', remove directory part of STRING if it is equal to
+the current directory, `TeX-macro-private' or `TeX-macro-global'.
+If NOSTRIP is set, do not remove extension after all.
+STRING defaults to the name of the current buffer.
+EXTENSIONS defaults to `TeX-file-extensions'."
+
+  (if (null string)
+      (setq string (or (buffer-file-name) "<none>")))
+
+  (if (null extensions)
+      (setq extensions TeX-file-extensions))
+
+  (let* ((strip (if (and (not nostrip)
+                        (TeX-match-extension string extensions))
+                   (substring string 0 (match-beginning 0))
+                 string))
+        (dir (expand-file-name (or (file-name-directory strip) "./"))))
+    (if (or (eq nodir t)
+           (string-equal dir (expand-file-name "./"))
+           (member dir TeX-macro-global)
+           (member dir TeX-macro-private))
+       (file-name-nondirectory strip)
+      strip)))
+
+(defcustom TeX-kpathsea-path-delimiter t
+  "Path delimiter for kpathsea output.
+t means autodetect, nil means kpathsea is disabled."
+  :group 'TeX-file
+  :type '(choice (const ":")
+                (const ";")
+                (const :tag "Autodetect" t)
+                (const :tag "Off" nil)))
+
+(defcustom TeX-kpathsea-format-alist
+  '(("tex" "${TEXINPUTS.latex}" TeX-file-extensions)
+    ("sty" "${TEXINPUTS.latex}" '("sty"))
+    ("dvi" "${TEXDOCS}" '("dvi" "pdf" "ps" "txt" "html"
+                         "dvi.gz" "pdf.gz" "ps.gz" "txt.gz" "html.gz"
+                         "dvi.bz2" "pdf.bz2" "ps.bz2" "txt.bz2" "html.bz2"))
+    ("eps" "${TEXINPUTS}" LaTeX-includegraphics-extensions)
+    ("pdf" "${TEXINPUTS}" LaTeX-includegraphics-extensions)
+    ("png" "${TEXINPUTS}" LaTeX-includegraphics-extensions)
+    ("jpg" "${TEXINPUTS}" LaTeX-includegraphics-extensions)
+    ("jpeg" "${TEXINPUTS}" LaTeX-includegraphics-extensions)
+    ("bib" "$BIBINPUTS" BibTeX-file-extensions)
+    ("bst" "$BSTINPUTS" BibTeX-style-extensions))
+  "Formats to search for expansion using kpathsea.
+The key of the alist represents the name of the format.  The
+first element of the cdr of the alist is string to expand by the
+respective kpathsea program and the second element is a list of
+file extensions to match."
+  :group 'TeX-file
+  :type '(alist :key-type string :value-type (group string sexp)))
+
+;; FIXME: Despite the first parameter named `extensions',
+;; `TeX-search-files-kpathsea' basically treats this as a format
+;; specifier.  Only the first element in the respective list will be
+;; used to determine the search paths and file extensions with the
+;; help of `TeX-kpathsea-format-alist'.  Out of these differences
+;; arises a need to unify the behavior of `TeX-search-files' and
+;; `TeX-search-files-kpathsea' and their treatment of parameters.
+;; Additionally `TeX-search-files-kpathsea' should be made more
+;; general to work with other platforms and TeX systems as well.
+(defun TeX-search-files-kpathsea (extensions nodir strip)
+  "The kpathsea-enabled version of `TeX-search-files'.
+Except for DIRECTORIES (a kpathsea string), the arguments for
+EXTENSIONS, NODIR and STRIP are explained there."
+  (and TeX-kpathsea-path-delimiter
+       (catch 'no-kpathsea
+        (let* ((format-spec (assoc (car extensions)
+                                   TeX-kpathsea-format-alist))
+               (dirs (with-output-to-string
+                       (unless (zerop
+                                (call-process
+                                 "kpsewhich" nil (list standard-output nil)
+                                 nil
+                                 (concat
+                                  "-expand-path="
+                                  (nth 1 format-spec))))
+                        (if (eq TeX-kpathsea-path-delimiter t)
+                            (throw 'no-kpathsea
+                                   (setq TeX-kpathsea-path-delimiter nil))
+                          (error "kpsewhich error")))))
+              result)
+          (when (eq TeX-kpathsea-path-delimiter t)
+            (setq TeX-kpathsea-path-delimiter
+                  (cond ((string-match ";" dirs)
+                         ";")
+                        ((string-match ":" dirs)
+                         ":"))))
+          (unless TeX-kpathsea-path-delimiter
+            (throw 'no-kpathsea nil))
+          (setq dirs (split-string dirs (concat "[\n\r"
+                                                TeX-kpathsea-path-delimiter
+                                                "]+")))
+          (setq extensions (concat "\\."
+                                   (regexp-opt (eval (nth 2 format-spec)) t)
+                                   "\\'"))
+          (setq result
+                (apply #'append
+                       (mapcar
+                        (lambda(x) (directory-files x
+                                                    (not nodir)
+                                                    extensions))
+                        dirs)))
+          (if strip
+              (mapcar (lambda(x)
+                        (if (string-match extensions x)
+                            (substring x 0 (match-beginning 0))
+                          x))
+                      result)
+            result)))))
+
+(defun TeX-search-files (&optional directories extensions nodir strip)
+  "Return a list of all reachable files in DIRECTORIES ending with EXTENSIONS.
+If optional argument NODIR is set, remove directory part.
+If optional argument STRIP is set, remove file extension.
+If optional argument DIRECTORIES is set, search in those directories.
+Otherwise, search in all TeX macro directories.
+If optional argument EXTENSIONS is not set, use `TeX-file-extensions'"
+  (if (null extensions)
+      (setq extensions TeX-file-extensions))
+  (or (TeX-search-files-kpathsea extensions nodir strip)
+      (progn
+       (if (null directories)
+           (setq directories
+                 (cons "./" (append TeX-macro-private TeX-macro-global))))
+       (let (match
+             (TeX-file-recurse (cond ((symbolp TeX-file-recurse)
+                                      TeX-file-recurse)
+                                     ((zerop TeX-file-recurse)
+                                      nil)
+                                     ((1- TeX-file-recurse)))))
+         (while directories
+           (let* ((directory (car directories))
+                  (content (and directory
+                                (file-readable-p directory)
+                                (file-directory-p directory)
+                                (directory-files directory))))
+             (setq directories (cdr directories))
+             (while content
+               (let ((file (concat directory (car content))))
+                 (setq content (cdr content))
+                 (cond ((string-match TeX-ignore-file file))
+                       ((not (file-readable-p file)))
+                       ((file-directory-p file)
+                        (if TeX-file-recurse
+                            (setq match
+                                  (append match
+                                          (TeX-search-files
+                                           (list (file-name-as-directory file))
+                                           extensions
+                                           nodir strip)))))
+                       ((TeX-match-extension file extensions)
+                        (setq match (cons (TeX-strip-extension file
+                                                               extensions
+                                                               nodir
+                                                               (not strip))
+                                          match))))))))
+         match))))
+
+(defun TeX-car-string-lessp (s1 s2)
+  "Compare the cars of S1 and S2 in lexicographic order.
+Return t if first is less than second in lexicographic order."
+  (string-lessp (car s1) (car s2)))
+
+(defun TeX-listify (elt)
+  "Return a newly created list with element ELT.
+If ELT already is a list, return ELT."
+  (if (listp elt) elt (list elt)))
+
+(defun TeX-member (elt list how)
+  "Return the member ELT in LIST.  Comparison done with HOW.
+Return nil if ELT is not a member of LIST."
+  (while (and list (not (funcall how elt (car list))))
+    (setq list (cdr list)))
+  (car-safe list))
+
+(defun TeX-elt-of-list-member (elts list)
+  "Return non-nil if an element of ELTS is a member of LIST."
+  (catch 'found
+    (dolist (elt elts)
+      (when (member elt list)
+       (throw 'found t)))))
+
+(defun TeX-assoc (key list)
+  "Return non-nil if KEY is `equal' to the car of an element of LIST.
+Like assoc, except case insensitive."
+  (let ((case-fold-search t))
+    (TeX-member key list
+               (lambda (a b)
+                 (string-match (concat "^" (regexp-quote a) "$")
+                               (car b))))))
+
+(defun TeX-match-buffer (n)
+  "Return the substring corresponding to the N'th match.
+See `match-data' for details."
+  (if (match-beginning n)
+      (buffer-substring-no-properties (match-beginning n) (match-end n))
+    ""))
+
+(defun TeX-function-p (arg)
+  "Return non-nil if ARG is callable as a function."
+  (or (and (fboundp 'byte-code-function-p)
+          (byte-code-function-p arg))
+      (and (listp arg)
+          (eq (car arg) 'lambda))
+      (and (symbolp arg)
+          (fboundp arg))))
+
+(defun TeX-booleanp (arg)
+  "Return non-nil if ARG is t or nil."
+  (memq arg '(t nil)))
+
+(defun TeX-looking-at-backward (regexp &optional limit)
+  "Return non-nil if the text before point matches REGEXP.
+Optional second argument LIMIT gives a max number of characters
+to look backward for."
+  (let ((pos (point)))
+    (save-excursion
+      (and (re-search-backward regexp
+                              (if limit (max (point-min) (- (point) limit)))
+                              t)
+          (eq (match-end 0) pos)))))
+
+(defun TeX-current-line ()
+  "The current line number."
+  (format "%d" (1+ (TeX-current-offset))))
+
+(defun TeX-current-file-name-master-relative ()
+  "Return current filename, relative to master directory."
+  (file-relative-name
+   (buffer-file-name)
+   (TeX-master-directory)))
+
+(defun TeX-near-bobp ()
+  "Return t iff there's nothing but whitespace between (bob) and (point)."
+  (save-excursion
+    (skip-chars-backward " \t\n")
+    (bobp)))
+
+(defun TeX-deactivate-mark ()
+  "Deactivate the mark.
+This is a compatibility function which works both in Emacs and
+XEmacs.  In XEmacs the region is deactivated instead of the
+mark which is sort of equivalent."
+  (if (featurep 'xemacs)
+      (zmacs-deactivate-region)
+    (deactivate-mark)))
+
+(defalias 'TeX-run-mode-hooks
+  (if (fboundp 'run-mode-hooks) 'run-mode-hooks 'run-hooks))
+
+
+;;; Syntax Table
+
+(defvar TeX-mode-syntax-table (make-syntax-table)
+  "Syntax table used while in TeX mode.")
+
+ (make-variable-buffer-local 'TeX-mode-syntax-table)
+
+(progn ; Define TeX-mode-syntax-table.
+  (modify-syntax-entry (string-to-char TeX-esc)
+                          "\\" TeX-mode-syntax-table)
+  (modify-syntax-entry ?\f ">"  TeX-mode-syntax-table)
+  (modify-syntax-entry ?\n ">"  TeX-mode-syntax-table)
+  (modify-syntax-entry (string-to-char TeX-grop)
+                          (concat "(" TeX-grcl)
+                               TeX-mode-syntax-table)
+  (modify-syntax-entry (string-to-char TeX-grcl)
+                          (concat ")" TeX-grop)
+                               TeX-mode-syntax-table)
+  (modify-syntax-entry ?%  "<"  TeX-mode-syntax-table)
+  (modify-syntax-entry ?\" "."  TeX-mode-syntax-table)
+  (modify-syntax-entry ?&  "."  TeX-mode-syntax-table)
+  (modify-syntax-entry ?_  "."  TeX-mode-syntax-table)
+  (modify-syntax-entry ?@  "_"  TeX-mode-syntax-table)
+  (modify-syntax-entry ?~  "."  TeX-mode-syntax-table)
+  (modify-syntax-entry ?$  "$"  TeX-mode-syntax-table)
+  (modify-syntax-entry ?'  "w"  TeX-mode-syntax-table)
+  (modify-syntax-entry ?«  "."  TeX-mode-syntax-table)
+  (modify-syntax-entry ?»  "."  TeX-mode-syntax-table))
+
+;;; Menu Support
+
+(defvar TeX-command-current 'TeX-command-master
+  "Specify whether to run command on master, buffer or region.")
+;; Function used to run external command.
+
+(defun TeX-command-select-master ()
+  "Determine that the next command will be on the master file."
+  (interactive)
+  (message "Next command will be on the master file.")
+  (setq TeX-command-current 'TeX-command-master))
+
+(defun TeX-command-select-buffer ()
+  "Determine that the next command will be on the buffer."
+  (interactive)
+  (message "Next command will be on the buffer")
+  (setq TeX-command-current 'TeX-command-buffer))
+
+(defun TeX-command-select-region ()
+  "Determine that the next command will be on the region."
+  (interactive)
+  (message "Next command will be on the region")
+  (setq TeX-command-current 'TeX-command-region))
+
+(defvar TeX-command-force nil)
+;; If non-nil, TeX-command-query will return the value of this
+;; variable instead of quering the user.
+
+(defun TeX-command-menu (name)
+  "Execute `TeX-command-list' NAME from a menu."
+  (let ((TeX-command-force name))
+    (funcall TeX-command-current)))
+
+(defun TeX-command-menu-print (printer command name)
+  "Print on PRINTER using method COMMAND to run NAME."
+  (let ((TeX-printer-default (unless (string= printer "Other") printer))
+       (TeX-printer-list (and (string= printer "Other") TeX-printer-list))
+       (TeX-print-command command)
+       (TeX-queue-command command))
+    (TeX-command-menu name)))
+
+(defun TeX-command-menu-printer-entry (entry lookup command name)
+  "Return `TeX-printer-list' ENTRY as a menu item."
+  (vector (nth 0 entry)
+         (list 'TeX-command-menu-print
+               (nth 0 entry)
+               (or (nth lookup entry) command)
+               name)))
+
+(defun TeX-command-menu-entry (entry)
+  "Return `TeX-command-list' ENTRY as a menu item."
+  (let ((name (car entry)))
+    (cond ((and (string-equal name TeX-command-Print)
+               TeX-printer-list)
+          (cons TeX-command-Print
+                (mapcar (lambda (entry)
+                          (TeX-command-menu-printer-entry
+                           entry 1 TeX-print-command name))
+                        (append TeX-printer-list '(("Other"))))))
+         ((and (string-equal name TeX-command-Queue)
+               TeX-printer-list)
+          (cons TeX-command-Queue
+                (mapcar (lambda (entry)
+                          (TeX-command-menu-printer-entry
+                           entry 2 TeX-queue-command name))
+                        (append TeX-printer-list '(("Other"))))))
+         (t
+          (vconcat `(,name (TeX-command-menu ,name))
+                   (nthcdr 5 entry))))))
+
+(defconst TeX-command-menu-name "Command"
+  "Name to be displayed for the command menu in all modes defined by AUCTeX.")
+
+;;; Keymap
+
+(defcustom TeX-electric-escape nil
+  "If non-nil, ``\\'' will be bound to `TeX-electric-macro'."
+  :group 'TeX-macro
+  :type 'boolean)
+
+(defcustom TeX-electric-sub-and-superscript nil
+  "If non-nil, insert braces after typing `^' and `_' in math mode."
+  :group 'TeX-macro
+  :type 'boolean)
+
+(defcustom TeX-newline-function 'newline
+  "Function to be called upon pressing `RET'."
+  :group 'TeX-indentation
+  :type '(choice (const newline)
+                (const newline-and-indent)
+                (const reindent-then-newline-and-indent)
+                (sexp :tag "Other")))
+
+(defun TeX-insert-backslash (arg)
+  "Either insert typed key ARG times or call `TeX-electric-macro'.
+`TeX-electric-macro' will be called if `TeX-electric-escape' is non-nil."
+  (interactive "*p")
+  (if TeX-electric-escape
+      (TeX-electric-macro)
+    (self-insert-command arg)))
+
+(defun TeX-insert-sub-or-superscript (arg)
+  "Insert typed key ARG times and possibly a pair of braces.
+Brace insertion is only done if point is in a math construct and
+`TeX-electric-sub-and-superscript' has a non-nil value."
+  (interactive "*p")
+  (self-insert-command arg)
+  (when (and TeX-electric-sub-and-superscript (texmathp))
+    (insert (concat TeX-grop TeX-grcl))
+    (backward-char)))
+
+(defun TeX-newline ()
+  "Call the function specified by the variable `TeX-newline-function'."
+  (interactive) (funcall TeX-newline-function))
+
+(defvar TeX-mode-map
+  (let ((map (make-sparse-keymap)))
+    ;; Standard
+    ;; (define-key map "\177"     'backward-delete-char-untabify)
+    (define-key map "\C-c}"    'up-list)
+    (define-key map "\C-c#"    'TeX-normal-mode)
+    (define-key map "\C-c\C-n" 'TeX-normal-mode)
+    (define-key map "\C-c?"    'TeX-doc)
+    (define-key map "\C-c\C-i" 'TeX-goto-info-page)
+    (define-key map "\r"       'TeX-newline)
+    
+    ;; From tex.el
+    (define-key map "\""       'TeX-insert-quote)
+    (define-key map "$"        'TeX-insert-dollar)
+    ;; Removed because LaTeX 2e have a better solution to italic correction.
+    ;; (define-key map "."        'TeX-insert-punctuation)
+    ;; (define-key map ","        'TeX-insert-punctuation)
+    (define-key map "\C-c{"    'TeX-insert-braces)
+    (define-key map "\C-c\C-f" 'TeX-font)
+    (define-key map "\C-c\C-m" 'TeX-insert-macro)
+    (define-key map "\\"       'TeX-insert-backslash)
+    (define-key map "^"        'TeX-insert-sub-or-superscript)
+    (define-key map "_"        'TeX-insert-sub-or-superscript)
+    (define-key map "\e\t"     'TeX-complete-symbol) ;*** Emacs 19 way
+    
+    (define-key map "\C-c'"    'TeX-comment-or-uncomment-paragraph) ;*** Old way
+    (define-key map "\C-c:"    'TeX-comment-or-uncomment-region) ;*** Old way
+    (define-key map "\C-c\""   'TeX-uncomment) ;*** Old way
+    
+    (define-key map "\C-c;"    'TeX-comment-or-uncomment-region)
+    (define-key map "\C-c%"    'TeX-comment-or-uncomment-paragraph)
+    
+    (define-key map "\C-c\C-t\C-p"   'TeX-PDF-mode)
+    (define-key map "\C-c\C-t\C-i"   'TeX-interactive-mode)
+    (define-key map "\C-c\C-t\C-s"   'TeX-source-correlate-mode)
+    (define-key map "\C-c\C-t\C-r"   'TeX-pin-region)
+    (define-key map "\C-c\C-w"       'TeX-toggle-debug-bad-boxes); to be removed
+    (define-key map "\C-c\C-t\C-b"   'TeX-toggle-debug-bad-boxes)
+    (define-key map "\C-c\C-t\C-w"   'TeX-toggle-debug-warnings)
+    (define-key map "\C-c\C-v" 'TeX-view)
+    ;; From tex-buf.el
+    (define-key map "\C-c\C-d" 'TeX-save-document)
+    (define-key map "\C-c\C-r" 'TeX-command-region)
+    (define-key map "\C-c\C-b" 'TeX-command-buffer)
+    (define-key map "\C-c\C-c" 'TeX-command-master)
+    (define-key map "\C-c\C-k" 'TeX-kill-job)
+    (define-key map "\C-c\C-l" 'TeX-recenter-output-buffer)
+    (define-key map "\C-c^" 'TeX-home-buffer)
+    (define-key map "\C-c`"    'TeX-next-error)
+    ;; Remap bindings of `next-error'
+    (if (featurep 'xemacs)
+       (substitute-key-definition 'next-error 'TeX-next-error map global-map)
+      (define-key map [remap next-error] 'TeX-next-error))
+    ;; Remap bindings of `previous-error'
+    (if (featurep 'xemacs)
+       (substitute-key-definition 'previous-error 'TeX-previous-error
+                                  map global-map)
+      (define-key map [remap previous-error] 'TeX-previous-error))
+    ;; From tex-fold.el
+    (define-key map "\C-c\C-o\C-f" 'TeX-fold-mode)
+
+    ;; Multifile
+    (define-key map "\C-c_" 'TeX-master-file-ask)  ;*** temporary
+    map)
+  "Keymap for common TeX and LaTeX commands.")
+
+(defvar plain-TeX-mode-map
+  (let ((map (make-sparse-keymap)))
+    (set-keymap-parent map TeX-mode-map)
+    map)
+  "Keymap used in plain TeX mode.")
+
+(defun TeX-mode-specific-command-menu (mode)
+  "Return a Command menu specific to the major MODE."
+  ;; COMPATIBILITY for Emacs < 21
+  (if (and (not (featurep 'xemacs))
+          (= emacs-major-version 20))
+      (cons TeX-command-menu-name
+           (TeX-mode-specific-command-menu-entries mode))
+    (list TeX-command-menu-name
+         :filter `(lambda (&rest ignored)
+                    (TeX-mode-specific-command-menu-entries ',mode))
+         "Bug.")))
+
+(defun TeX-mode-specific-command-menu-entries (mode)
+  "Return the entries for a Command menu specific to the major MODE."
+  (append
+   (TeX-menu-with-help
+    `("Command on"
+      [ "Master File" TeX-command-select-master
+       :keys "C-c C-c" :style radio
+       :selected (eq TeX-command-current 'TeX-command-master)
+       :help "Commands in this menu work on the Master File"]
+      [ "Buffer" TeX-command-select-buffer
+       :keys "C-c C-b" :style radio
+       :selected (eq TeX-command-current 'TeX-command-buffer)
+       :help "Commands in this menu work on the current buffer"]
+      [ "Region" TeX-command-select-region
+       :keys "C-c C-r" :style radio
+       :selected (eq TeX-command-current 'TeX-command-region)
+       :help "Commands in this menu work on the region"]
+      [ "Fix the Region" TeX-pin-region
+       :active (or (if prefix-arg
+                       (<= (prefix-numeric-value prefix-arg) 0)
+                     (and (boundp 'TeX-command-region-begin)
+                          (markerp TeX-command-region-begin)))
+                   (TeX-mark-active))
+       ;;:visible (eq TeX-command-current 'TeX-command-region)
+       :style toggle
+       :selected (and (boundp 'TeX-command-region-begin)
+                      (markerp TeX-command-region-begin))
+       :help "Fix the region for \"Command on Region\""]
+      "-"
+      ["Recenter Output Buffer" TeX-recenter-output-buffer
+       :help "Show the output of current TeX process"]
+      ["Kill Job" TeX-kill-job
+       :help "Kill the current TeX process"]
+      ["Next Error" TeX-next-error
+       :help "Jump to the next error of the last TeX run"]
+      ["Quick View" TeX-view
+       :help "Start a viewer without prompting"]
+      "-"
+      ("TeXing Options"
+       ,@(mapcar (lambda (x)
+                  (let ((symbol (car x)) (name (nth 1 x)))
+                    `[ ,(format "Use %s engine" name) (TeX-engine-set ',symbol)
+                       :style radio :selected (eq TeX-engine ',symbol)
+                       :help ,(format "Use %s engine for compiling" name) ]))
+                (TeX-engine-alist))
+       "-"
+       [ "Generate PDF" TeX-PDF-mode
+        :style toggle :selected TeX-PDF-mode
+        :active (not (eq TeX-engine 'omega))
+        :help "Use PDFTeX to generate PDF instead of DVI"]
+       [ "Run Interactively" TeX-interactive-mode
+        :style toggle :selected TeX-interactive-mode :keys "C-c C-t C-i"
+        :help "Stop on errors in a TeX run"]
+       [ "Correlate I/O" TeX-source-correlate-mode
+        :style toggle :selected TeX-source-correlate-mode
+        :help "Enable forward and inverse search in the previewer"]
+       ["Debug Bad Boxes" TeX-toggle-debug-bad-boxes
+       :style toggle :selected TeX-debug-bad-boxes :keys "C-c C-t C-b"
+       :help "Make \"Next Error\" show overfull and underfull boxes"]
+       ["Debug Warnings" TeX-toggle-debug-warnings
+       :style toggle :selected TeX-debug-warnings
+       :help "Make \"Next Error\" show warnings"])))
+   (let ((file 'TeX-command-on-current));; is this actually needed?
+     (TeX-maybe-remove-help
+      (delq nil
+           (mapcar 'TeX-command-menu-entry
+                   (TeX-mode-specific-command-list mode)))))))
+
+(defun TeX-mode-specific-command-list (mode)
+  "Return the list of commands available in the given MODE."
+  (let ((full-list TeX-command-list)
+       out-list
+       entry)
+    (while (setq entry (pop full-list))
+      ;; `(nth 4 entry)' may be either an atom in case of which the
+      ;; entry should be present in any mode or a list of major modes.
+      (if (or (atom (nth 4 entry))
+             (memq mode (nth 4 entry)))
+         (push entry out-list)))
+    (nreverse out-list)))
+
+(defvar TeX-fold-menu
+  (TeX-menu-with-help
+   '("Show/Hide"
+     ["Fold Mode" TeX-fold-mode
+      :style toggle
+      :selected (and (boundp 'TeX-fold-mode) TeX-fold-mode)
+      :help "Toggle folding mode"]
+     "-"
+     ["Hide All in Current Buffer" TeX-fold-buffer
+      :active (and (boundp 'TeX-fold-mode) TeX-fold-mode)
+      :help "Hide all configured TeX constructs in the current buffer"]
+     ["Hide All in Current Region" TeX-fold-region
+      :active (and (boundp 'TeX-fold-mode) TeX-fold-mode)
+      :help "Hide all configured TeX constructs in the marked region"]
+     ["Hide All in Current Paragraph" TeX-fold-paragraph
+      :active (and (boundp 'TeX-fold-mode) TeX-fold-mode)
+      :help "Hide all configured TeX constructs in the paragraph containing point"]
+     ["Hide Current Macro" TeX-fold-macro
+      :active (and (boundp 'TeX-fold-mode) TeX-fold-mode)
+      :help "Hide the macro containing point"]
+     ["Hide Current Environment" TeX-fold-env
+      :visible (not (eq major-mode 'plain-tex-mode))
+      :active (and (boundp 'TeX-fold-mode) TeX-fold-mode)
+      :help "Hide the environment containing point"]
+     ["Hide Current Comment" TeX-fold-comment
+      :active (and (boundp 'TeX-fold-mode) TeX-fold-mode)
+      :help "Hide the comment containing point"]
+     "-"
+     ["Show All in Current Buffer" TeX-fold-clearout-buffer
+      :active (and (boundp 'TeX-fold-mode) TeX-fold-mode)
+      :help "Permanently show all folded content again"]
+     ["Show All in Current Region" TeX-fold-clearout-region
+      :active (and (boundp 'TeX-fold-mode) TeX-fold-mode)
+      :help "Permanently show all folded content in marked region"]
+     ["Show All in Current Paragraph" TeX-fold-clearout-paragraph
+      :active (and (boundp 'TeX-fold-mode) TeX-fold-mode)
+      :help "Permanently show all folded content in paragraph containing point"]
+     ["Show Current Item" TeX-fold-clearout-item
+      :active (and (boundp 'TeX-fold-mode) TeX-fold-mode)
+      :help "Permanently show the item containing point"]
+     "-"
+     ["Hide or Show Current Item" TeX-fold-dwim
+      :active (and (boundp 'TeX-fold-mode) TeX-fold-mode)
+      :help "Hide or show the item containing point"]))
+   "Menu definition for commands from tex-fold.el.")
+
+
+;;; Menus for plain TeX mode
+(easy-menu-define plain-TeX-mode-command-menu
+    plain-TeX-mode-map
+    "Command menu used in TeX mode."
+    (TeX-mode-specific-command-menu 'plain-tex-mode))
+
+(defvar TeX-customization-menu nil)
+
+(defvar TeX-common-menu-entries
+  (TeX-menu-with-help
+   `(("Multifile/Parsing"
+      ["Switch to Master File" TeX-home-buffer
+       :help "Switch to buffer of Master File, or buffer of last TeX command"]
+      ["Save Document" TeX-save-document
+       :help "Save all buffers associated with the current Master File"]
+      ["Set Master File" TeX-master-file-ask
+       :active (not (TeX-local-master-p))
+       :help "Set the main file to run TeX commands on"]
+      ["Reset Buffer" TeX-normal-mode
+       :help "Save and reparse the current buffer for style information"]
+      ["Reset AUCTeX" (TeX-normal-mode t) :keys "C-u C-c C-n"
+       :help "Reset buffer and reload AUCTeX style files"])
+     ["Find Documentation..." TeX-doc
+      :help "Get help on commands, packages, or TeX-related topics in general"]
+     ["Read the AUCTeX Manual" TeX-goto-info-page
+      :help "Everything worth reading"]
+     ("Customize AUCTeX"
+      ["Browse Options"
+       (customize-group 'AUCTeX)
+       :help "Open the customization buffer for AUCTeX"]
+      ["Extend this Menu"
+       (progn
+        (easy-menu-add-item
+         nil
+         ;; Ugly hack because docTeX mode uses the LaTeX menu.
+         (list (if (eq major-mode 'doctex-mode) "LaTeX" TeX-base-mode-name))
+         (or TeX-customization-menu
+             (setq TeX-customization-menu
+                   (customize-menu-create 'AUCTeX "Customize AUCTeX")))))
+       :help "Make this menu a full-blown customization menu"])
+     ["Report AUCTeX Bug" TeX-submit-bug-report
+      :help ,(format "Problems with AUCTeX %s? Mail us!"
+                    AUCTeX-version)])))
+
+(defvar plain-TeX-menu-entries
+  (TeX-menu-with-help
+   `(["Macro..." TeX-insert-macro
+      :help "Insert a macro and possibly arguments"]
+     ["Complete" TeX-complete-symbol
+      :help "Complete the current macro"]
+     "-"
+     ("Insert Font"
+      ["Emphasize"  (TeX-font nil ?\C-e) :keys "C-c C-f C-e"]
+      ["Bold"       (TeX-font nil ?\C-b) :keys "C-c C-f C-b"]
+      ["Typewriter" (TeX-font nil ?\C-t) :keys "C-c C-f C-t"]
+      ["Small Caps" (TeX-font nil ?\C-c) :keys "C-c C-f C-c"]
+      ["Sans Serif" (TeX-font nil ?\C-f) :keys "C-c C-f C-f"]
+      ["Italic"     (TeX-font nil ?\C-i) :keys "C-c C-f C-i"]
+      ["Slanted"    (TeX-font nil ?\C-s) :keys "C-c C-f C-s"]
+      ["Roman"      (TeX-font nil ?\C-r) :keys "C-c C-f C-r"]
+      ["Calligraphic" (TeX-font nil ?\C-a) :keys "C-c C-f C-a"])
+     ("Replace Font"
+      ["Emphasize"  (TeX-font t ?\C-e) :keys "C-u C-c C-f C-e"]
+      ["Bold"       (TeX-font t ?\C-b) :keys "C-u C-c C-f C-b"]
+      ["Typewriter" (TeX-font t ?\C-t) :keys "C-u C-c C-f C-t"]
+      ["Small Caps" (TeX-font t ?\C-c) :keys "C-u C-c C-f C-c"]
+      ["Sans Serif" (TeX-font t ?\C-f) :keys "C-u C-c C-f C-f"]
+      ["Italic"     (TeX-font t ?\C-i) :keys "C-u C-c C-f C-i"]
+      ["Slanted"    (TeX-font t ?\C-s) :keys "C-u C-c C-f C-s"]
+      ["Roman"      (TeX-font t ?\C-r) :keys "C-u C-c C-f C-r"]
+      ["Calligraphic" (TeX-font t ?\C-a) :keys "C-u C-c C-f C-a"])
+     ["Delete Font" (TeX-font t ?\C-d) :keys "C-c C-f C-d"]
+     "-"
+     ["Comment or Uncomment Region" TeX-comment-or-uncomment-region
+      :help "Comment or uncomment the currently selected region"]
+     ["Comment or Uncomment Paragraph" TeX-comment-or-uncomment-paragraph
+      :help "Comment or uncomment the paragraph containing point"]
+     ,TeX-fold-menu
+     "-" . ,TeX-common-menu-entries)))
+
+(easy-menu-define plain-TeX-mode-menu
+    plain-TeX-mode-map
+    "Menu used in plain TeX mode."
+    (cons "TeX" plain-TeX-menu-entries))
+
+;;; AmSTeX
+
+(defvar AmSTeX-mode-map
+  (let ((map (make-sparse-keymap)))
+    (set-keymap-parent map TeX-mode-map)
+    map)
+  "Keymap used in `AmSTeX-mode'.")
+
+;; Menu for AmSTeX mode
+(easy-menu-define AmSTeX-mode-command-menu
+    AmSTeX-mode-map
+    "Command menu used in AmsTeX mode."
+    (TeX-mode-specific-command-menu 'ams-tex-mode))
+
+(easy-menu-define AmSTeX-mode-menu
+  AmSTeX-mode-map
+  "Menu used in AMS-TeX mode."
+  (cons "AmS-TeX" plain-TeX-menu-entries))
+
+;;;###autoload
+(defun ams-tex-mode ()
+  "Major mode in AUCTeX for editing AmS-TeX files.
+See info under AUCTeX for documentation.
+
+Special commands:
+\\{AmSTeX-mode-map}
+
+Entering AmS-tex-mode calls the value of `text-mode-hook',
+then the value of `TeX-mode-hook', and then the value
+of `AmS-TeX-mode-hook'."
+  (interactive)
+  (plain-TeX-common-initialization)
+  (setq major-mode 'ams-tex-mode)
+  (use-local-map AmSTeX-mode-map)
+
+  ;; Menu
+  (easy-menu-add AmSTeX-mode-menu AmSTeX-mode-map)
+  (easy-menu-add AmSTeX-mode-command-menu AmSTeX-mode-map)
+
+  (setq TeX-base-mode-name "AmS-TeX")
+  (setq TeX-command-default "AmSTeX")
+  (TeX-run-mode-hooks 'text-mode-hook 'TeX-mode-hook 'AmS-TeX-mode-hook)
+  (TeX-set-mode-name))
+
+
+;;; Verbatim constructs
+
+(defvar TeX-verbatim-p-function nil
+  "Mode-specific function to be called by `TeX-verbatim-p'.")
+(make-variable-buffer-local 'TeX-verbatim-p-function)
+
+;; XXX: We only have an implementation for LaTeX mode at the moment (Oct 2009).
+(defun TeX-verbatim-p (&optional pos)
+  "Return non-nil if position POS is in a verbatim-like construct.
+A mode-specific implementation is required.  If it is not
+available, the function always returns nil."
+  (when TeX-verbatim-p-function
+    (funcall TeX-verbatim-p-function)))
+
+
+;;; Comments
+
+(defvar TeX-comment-start-regexp "%"
+  "Regular expression matching a comment starter.
+Unlike the variable `comment-start-skip' it should not match any
+whitespace after the comment starter or any character before it.")
+(make-variable-buffer-local 'TeX-comment-start-regexp)
+
+(defun TeX-comment-region (beg end &optional arg)
+  "Comment each line in the region from BEG to END.
+Numeric prefix arg ARG means use ARG comment characters.
+If ARG is negative, delete that many comment characters instead."
+  (interactive "*r\nP")
+  ;; `comment-padding' will not be recognized in XEmacs' (21.4)
+  ;; `comment-region', so we temporarily modify `comment-start' to get
+  ;; proper spacing.  Unfortunately we have to check for the XEmacs
+  ;; version and cannot test if `comment-padding' is bound as this
+  ;; gets initialized in `VirTeX-common-initialization'.
+  (let ((comment-start (if (and (featurep 'xemacs)
+                               (= emacs-major-version 21)
+                               (<= emacs-minor-version 4))
+                          (concat comment-start (TeX-comment-padding-string))
+                        comment-start)))
+    (comment-region beg end arg)))
+
+(eval-and-compile
+  ;; COMPATIBILITY for Emacs <= 21.3
+  (if (fboundp 'comment-or-uncomment-region)
+      (defalias 'TeX-comment-or-uncomment-region 'comment-or-uncomment-region)
+    ;; The following function was copied from `newcomment.el' on
+    ;; 2004-01-30 and adapted accordingly
+    (defun TeX-comment-or-uncomment-region (beg end &optional arg)
+      "Comment or uncomment a the region from BEG to END.
+Call `TeX-comment-region', unless the region only consists of
+comments, in which case call `TeX-uncomment-region'.  If a prefix
+arg ARG is given, it is passed on to the respective function."
+      (interactive "*r\nP")
+      (funcall (if (save-excursion ;; check for already commented region
+                    (goto-char beg)
+                    (TeX-comment-forward (point-max))
+                    (<= end (point)))
+                  'TeX-uncomment-region 'TeX-comment-region)
+              beg end arg)))
+
+  ;; COMPATIBILITY for Emacs <= 20.  (Introduced in 21.1?)
+  (if (fboundp 'uncomment-region)
+      (defalias 'TeX-uncomment-region 'uncomment-region)
+    (defun TeX-uncomment-region (beg end &optional arg)
+      "Remove comment characters from the beginning of each line
+in the region from BEG to END.  Numeric prefix arg ARG means use
+ARG comment characters.  If ARG is negative, delete that many
+comment characters instead."
+      (interactive "*r\nP")
+      (or arg
+         ;; Determine the number of comment characters at the
+         ;; beginning of the first commented line.
+         (setq arg
+               (save-excursion
+                 (goto-char beg)
+                 (re-search-forward
+                  (concat "^" TeX-comment-start-regexp "+") end t)
+                 (length (match-string 0)))))
+      (comment-region beg end (- arg)))))
+
+(defun TeX-uncomment ()
+  "Delete comment characters from the beginning of each line in a comment."
+  (interactive)
+  (save-excursion
+    ;; Find first comment line
+    (beginning-of-line)
+    (while (and (looking-at (concat "^[ \t]*" TeX-comment-start-regexp))
+               (not (bobp)))
+      (forward-line -1))
+    (let ((beg (point)))
+      (forward-line 1)
+      ;; Find last comment line
+      (while (and (looking-at (concat "^[ \t]*" TeX-comment-start-regexp))
+                 (not (eobp)))
+       (forward-line 1))
+      ;; Uncomment region
+      (TeX-uncomment-region beg (point)))))
+
+(defun TeX-comment-or-uncomment-paragraph ()
+  "Comment or uncomment current paragraph."
+  (interactive)
+  (if (TeX-in-commented-line)
+      (TeX-uncomment)
+    (save-excursion
+      (beginning-of-line)
+      ;; Don't do anything if we are in an empty line.  If this line
+      ;; is followed by a lot of commented lines, this shall prevent
+      ;; that mark-paragraph skips over these lines and marks a
+      ;; paragraph outside the visible window which might get
+      ;; commented without the user noticing.
+      (unless (looking-at "^[ \t]*$")
+       (mark-paragraph)
+       (TeX-comment-region (point) (mark))))))
+
+(defun TeX-in-comment ()
+  "Return non-nil if point is in a comment."
+  (if (or (bolp)
+         (null comment-start-skip)
+         (eq (preceding-char) ?\r))
+      nil
+    (save-excursion
+      (save-match-data
+       (let ((pos (point)))
+         (beginning-of-line)
+         (and (or (looking-at comment-start-skip)
+                  (re-search-forward comment-start-skip pos t))
+              (not (TeX-verbatim-p))))))))
+
+(defun TeX-in-commented-line ()
+  "Return non-nil if point is in a line consisting only of a comment.
+The comment can be preceded by whitespace.  This means that
+`TeX-in-commented-line' is more general than `TeX-in-line-comment'
+which will not match commented lines with leading whitespace.  But
+`TeX-in-commented-line' will match commented lines without leading
+whitespace as well."
+  (save-excursion
+    (forward-line 0)
+    (skip-chars-forward " \t")
+    (string= (buffer-substring-no-properties
+             (point) (min (point-max) (+ (point) (length comment-start))))
+            comment-start)))
+
+(defun TeX-in-line-comment ()
+  "Return non-nil if point is in a line comment.
+A line comment is a comment starting in column one, i.e. there is
+no whitespace before the comment sign."
+  (save-excursion
+    (forward-line 0)
+    (string= (buffer-substring-no-properties
+             (point) (min (point-max) (+ (point) (length comment-start))))
+            comment-start)))
+
+(defun TeX-comment-prefix ()
+  "Return the comment prefix of the current line.
+If there are no comment starters after potential whitespace at
+the beginning of the line, return nil."
+  (save-excursion
+    (beginning-of-line)
+    (save-match-data
+      (when (looking-at (concat "\\([ \t]*" TeX-comment-start-regexp "+\\)+"))
+       (match-string 0)))))
+
+(defun TeX-forward-comment-skip (&optional count limit)
+  "Move forward to the next comment skip.
+This may be a switch between commented and not commented adjacent
+lines or between lines with different comment prefixes.  With
+argument COUNT do it COUNT times.  If argument LIMIT is given, do
+not move point further than this value."
+  (unless count (setq count 1))
+  ;; A value of 0 is nonsense.
+  (when (= count 0) (setq count 1))
+  (unless limit (setq limit (point-max)))
+  (dotimes (i (abs count))
+    (if (< count 0)
+       (forward-line -1)
+      (beginning-of-line))
+    (let ((prefix (when (looking-at (concat "\\([ \t]*"
+                                           TeX-comment-start-regexp "+\\)+"))
+                   (buffer-substring (+ (line-beginning-position)
+                                        (current-indentation))
+                                     (match-end 0)))))
+      (while (save-excursion
+              (and (if (> count 0)
+                       (<= (point) limit)
+                     (>= (point) limit))
+                   (zerop (if (> count 0)
+                              (forward-line 1)
+                            (forward-line -1)))
+                   (if prefix
+                       (if (looking-at (concat "\\([ \t]*"
+                                               TeX-comment-start-regexp
+                                               "+\\)+"))
+                           ;; If the preceding line is a commented line
+                           ;; as well, check if the prefixes are
+                           ;; identical.
+                           (string= prefix
+                                    (buffer-substring
+                                     (+ (line-beginning-position)
+                                        (current-indentation))
+                                     (match-end 0)))
+                         nil)
+                     (not (looking-at (concat "[ \t]*"
+                                              TeX-comment-start-regexp))))))
+       (if (> count 0)
+           (forward-line 1)
+         (forward-line -1)))
+      (if (> count 0)
+         (forward-line 1)))))
+
+(defun TeX-backward-comment-skip (&optional count limit)
+  "Move backward to the next comment skip.
+This may be a switch between commented and not commented adjacent
+lines or between lines with different comment prefixes.  With
+argument COUNT do it COUNT times.  If argument LIMIT is given, do
+not move point to a position less than this value."
+  (unless count (setq count 1))
+  (when (= count 0) (setq count 1))
+  (unless limit (setq limit (point-min)))
+  (TeX-forward-comment-skip (- count) limit))
+
+;; Taken from `comment-forward' in Emacs' CVS on 2006-12-26.  Used as
+;; a compatibility function for XEmacs 21.4.
+(defun TeX-comment-forward (&optional n)
+  "Skip forward over N comments.
+Just like `forward-comment' but only for positive N
+and can use regexps instead of syntax."
+  (when (fboundp 'comment-normalize-vars)
+    (comment-normalize-vars))
+  (if (fboundp 'comment-forward)
+      (comment-forward n)
+    (setq n (or n 1))
+    (if (< n 0) (error "No comment-backward")
+      (if comment-use-syntax (forward-comment n)
+       (while (> n 0)
+         (setq n
+               (if (or (forward-comment 1)
+                       (and (looking-at comment-start-skip)
+                            (goto-char (match-end 0))
+                            (re-search-forward comment-end-skip nil 'move)))
+                   (1- n) -1)))
+       (= n 0)))))
+
+(defun TeX-comment-padding-string ()
+  "Return  comment padding as a string.
+The variable `comment-padding' can hold an integer or a string.
+This function will return the appropriate string representation
+regardless of its data type."
+  (if (integerp comment-padding)
+      (make-string comment-padding ? )
+    comment-padding))
+
+
+;;; Indentation
+
+(defgroup TeX-indentation nil
+  "Indentation of TeX buffers in AUCTeX."
+  :group 'AUCTeX)
+
+(defcustom TeX-brace-indent-level 2
+  "*The level of indentation produced by an open brace."
+  :group 'TeX-indentation
+  :type 'integer)
+
+(defun TeX-comment-indent ()
+  "Determine the indentation of a comment."
+  (if (looking-at "%%%")
+      (current-column)
+    (skip-chars-backward " \t")
+    (max (if (bolp) 0 (1+ (current-column)))
+        comment-column)))
+
+(defun TeX-brace-count-line ()
+  "Count number of open/closed braces."
+  (save-excursion
+    (let ((count 0) (limit (line-end-position)) char)
+      (while (progn
+              (skip-chars-forward "^{}\\\\" limit)
+              (when (and (< (point) limit) (not (TeX-in-comment)))
+                (setq char (char-after))
+                (forward-char)
+                (cond ((eq char ?\{)
+                       (setq count (+ count TeX-brace-indent-level)))
+                      ((eq char ?\})
+                       (setq count (- count TeX-brace-indent-level)))
+                      ((eq char ?\\)
+                       (when (< (point) limit)
+                         (forward-char)
+                         t))))))
+      count)))
+
+;;; Navigation
+
+(defvar TeX-search-syntax-table
+  (let ((table (make-syntax-table (make-char-table (if (featurep 'xemacs)
+                                                      'syntax
+                                                    'syntax-table)))))
+    ;; Preset mode-independent syntax entries.  (Mode-dependent
+    ;; entries are set in the function `TeX-search-syntax-table'.)
+    ;; ?\", ?\( and ?\) explicitely get whitespace syntax because
+    ;; Emacs 21.3 and XEmacs don't generate a completely empty syntax
+    ;; table.
+    (dolist (elt '((?\f . ">") (?\n . ">") (?\" . " ") (?\( . " ") (?\) . " ")))
+      (modify-syntax-entry (car elt) (cdr elt) table))
+    table)
+  "Syntax table used for searching purposes.
+It should be accessed through the function `TeX-search-syntax-table'.")
+
+(defun TeX-search-syntax-table (&rest args)
+  "Return a syntax table for searching purposes.
+ARGS may be a list of characters.  For each of them the
+respective predefined syntax is set.  Currently the parenthetical
+characters ?{, ?}, ?[, ?], ?\(, ?\), ?<, and ?> are supported.
+The syntax of each of these characters not specified will be
+reset to \" \"."
+  (let ((char-syntax-alist '((?\{ . "(}") (?\} . "){")
+                            (?\[ . "(]") (?\] . ")[")
+                            (?\( . "()") (?\) . ")(")
+                            (?\< . "(>") (?\> . ")<"))))
+    ;; Clean entries possibly set before.
+    (modify-syntax-entry ?\\ " " TeX-search-syntax-table)
+    (modify-syntax-entry ?@ " " TeX-search-syntax-table)
+    (modify-syntax-entry ?\% " " TeX-search-syntax-table)
+    ;; Preset mode-dependent syntax entries.  (Mode-independent entries
+    ;; are set when the variable `TeX-search-syntax-table' is created.)
+    (modify-syntax-entry (string-to-char TeX-esc) "\\" TeX-search-syntax-table)
+    (unless (eq major-mode 'texinfo-mode)
+      (modify-syntax-entry ?\% "<" TeX-search-syntax-table))
+    ;; Clean up the entries which can be specified as arguments.
+    (dolist (elt char-syntax-alist)
+      (modify-syntax-entry (car elt) " " TeX-search-syntax-table))
+    ;; Now set what we got.
+    (dolist (elt args)
+      (unless (assoc elt char-syntax-alist) (error "Char not supported"))
+      (modify-syntax-entry elt (cdr (assoc elt char-syntax-alist))
+                          TeX-search-syntax-table))
+    ;; Return the syntax table.
+    TeX-search-syntax-table))
+
+(defun TeX-find-balanced-brace (&optional count depth limit)
+  "Return the position of a balanced brace in a TeX group.
+The function scans forward COUNT parenthetical groupings.
+Default is 1.  If COUNT is negative, it searches backwards.  With
+optional DEPTH>=1, find that outer level.  If LIMIT is non-nil,
+do not search further than this position in the buffer."
+  (let ((count (if count
+                  (if (= count 0) (error "COUNT has to be <> 0") count)
+                1))
+       (depth (if depth
+                  (if (< depth 1) (error "DEPTH has to be > 0") depth)
+                1)))
+    (save-restriction
+      (when limit
+       (if (> count 0)
+           (narrow-to-region (point-min) limit)
+         (narrow-to-region limit (point-max))))
+      (with-syntax-table (TeX-search-syntax-table ?\{ ?\})
+       (condition-case nil
+           (scan-lists (point) count depth)
+         (error nil))))))
+
+(defun TeX-find-closing-brace (&optional depth limit)
+  "Return the position of the closing brace in a TeX group.
+The function assumes that point is inside the group, i.e. after
+an opening brace.  With optional DEPTH>=1, find that outer level.
+If LIMIT is non-nil, do not search further down than this
+position in the buffer."
+  (TeX-find-balanced-brace 1 depth limit))
+
+(defun TeX-find-opening-brace (&optional depth limit)
+  "Return the position of the opening brace in a TeX group.
+The function assumes that point is inside the group, i.e. before
+a closing brace.  With optional DEPTH>=1, find that outer level.
+If LIMIT is non-nil, do not search further up than this position
+in the buffer."
+  (TeX-find-balanced-brace -1 depth limit))
+
+(defun TeX-find-macro-boundaries (&optional lower-bound)
+  "Return a list containing the start and end of a macro.
+If LOWER-BOUND is given, do not search backward further than this
+point in buffer.  Arguments enclosed in brackets or braces are
+considered part of the macro."
+  (save-restriction
+    (when lower-bound
+      (narrow-to-region lower-bound (point-max)))
+    (let ((orig-point (point))
+         start-point)
+      ;; Point is located directly at the start of a macro. (-!-\foo{bar})
+      (when (and (eq (char-after) (aref TeX-esc 0))
+                (not (TeX-escaped-p)))
+       (setq start-point (point)))
+      ;; Point is located on a macro. (\fo-!-o{bar})
+      (unless start-point
+       (save-excursion
+         (skip-chars-backward "A-Za-z@*")
+         (when (and (eq (char-before) (aref TeX-esc 0))
+                    (not (TeX-escaped-p (1- (point)))))
+           (setq start-point (1- (point))))))
+      ;; Point is located in the argument of a macro. (\foo{ba-!-r})
+      (unless start-point
+       (save-excursion
+         (catch 'abort
+           (let ((parse-sexp-ignore-comments t))
+             (when (condition-case nil (progn (up-list) t) (error nil))
+               (while (progn
+                        (condition-case nil (backward-sexp)
+                          (error (throw 'abort nil)))
+                        (forward-comment -1)
+                        (and (memq (char-before) '(?\] ?\}))
+                             (not (TeX-escaped-p (1- (point)))))))
+               (skip-chars-backward "A-Za-z@*")
+               (when (and (eq (char-before) (aref TeX-esc 0))
+                          (not (TeX-escaped-p (1- (point)))))
+                 (setq start-point (1- (point)))))))))
+      ;; Search forward for the end of the macro.
+      (when start-point
+       (save-excursion
+         (goto-char (TeX-find-macro-end-helper start-point))
+         (if (< orig-point (point))
+             (cons start-point (point))
+           nil))))))
+
+(defun TeX-find-macro-end-helper (start)
+  "Find the end of a macro given its START.
+START is the position just before the starting token of the macro.
+If the macro is followed by square brackets or curly braces,
+those will be considered part of it."
+  (save-excursion
+    (save-match-data
+      (catch 'found
+       (goto-char (1+ start))
+       (if (zerop (skip-chars-forward "A-Za-z@"))
+           (forward-char)
+         (skip-chars-forward "*"))
+       (while (not (eobp))
+         (cond
+          ;; Skip over pairs of square brackets
+          ((or (looking-at "[ \t]*\n?\\(\\[\\)") ; Be conservative: Consider
+                                       ; only consecutive lines.
+               (and (looking-at (concat "[ \t]*" TeX-comment-start-regexp))
+                    (save-excursion
+                      (forward-line 1)
+                      (looking-at "[ \t]*\\(\\[\\)"))))
+           (goto-char (match-beginning 1))
+           (condition-case nil
+               (forward-sexp)
+             (scan-error (throw 'found (point)))))
+          ;; Skip over pairs of curly braces
+          ((or (looking-at "[ \t]*\n?{") ; Be conservative: Consider
+                                       ; only consecutive lines.
+               (and (looking-at (concat "[ \t]*" TeX-comment-start-regexp))
+                    (save-excursion
+                      (forward-line 1)
+                      (looking-at "[ \t]*{"))))
+           (goto-char (match-end 0))
+           (goto-char (or (TeX-find-closing-brace)
+                          ;; If we cannot find a regular end, use the
+                          ;; next whitespace.
+                          (save-excursion (skip-chars-forward "^ \t\n")
+                                          (point))))
+           (when (eobp) (throw 'found (point))))
+          (t
+           (throw 'found (point)))))))))
+
+(defun TeX-find-macro-start (&optional limit)
+  "Return the start of a macro.
+If LIMIT is given, do not search backward further than this point
+in buffer.  Arguments enclosed in brackets or braces are
+considered part of the macro."
+  (car (TeX-find-macro-boundaries limit)))
+
+(defun TeX-find-macro-end ()
+  "Return the end of a macro.
+Arguments enclosed in brackets or braces are considered part of
+the macro."
+  (cdr (TeX-find-macro-boundaries)))
+
+(defun TeX-search-forward-unescaped (string &optional bound noerror)
+  "Search forward from point for unescaped STRING.
+The optional argument BOUND limits the search to the respective
+buffer position.
+If NOERROR is non-nil, return nil if the search failed instead of
+throwing an error.
+A pattern is escaped, if it is preceded by an odd number of escape
+characters."
+  (TeX-search-unescaped string 'forward nil bound noerror))
+
+(defun TeX-search-backward-unescaped (string &optional bound noerror)
+  "Search backward from point for unescaped STRING.
+The optional argument BOUND limits the search to the respective
+buffer position.
+If NOERROR is non-nil, return nil if the search failed instead of
+throwing an error.
+A pattern is escaped, if it is preceded by an odd number of escape
+characters."
+  (TeX-search-unescaped string 'backward nil bound noerror))
+
+(defun TeX-re-search-forward-unescaped (regexp &optional bound noerror)
+  "Search forward from point for unescaped regular expression REGEXP.
+The optional argument BOUND limits the search to the respective
+buffer position.
+If NOERROR is non-nil, return nil if the search failed instead of
+throwing an error.
+A pattern is escaped, if it is preceded by an odd number of escape
+characters."
+  (TeX-search-unescaped regexp 'forward t bound noerror))
+
+(defun TeX-search-unescaped (pattern
+                            &optional direction regexp-flag bound noerror)
+  "Search for unescaped PATTERN in a certain DIRECTION.
+DIRECTION can be indicated by the symbols 'forward and 'backward.
+If DIRECTION is omitted, a forward search is carried out.
+If REGEXP-FLAG is non-nil, PATTERN may be a regular expression,
+otherwise a string.
+The optional argument BOUND limits the search to the respective
+buffer position.
+If NOERROR is non-nil, return nil if the search failed instead of
+throwing an error.
+A pattern is escaped, if it is preceded by an odd number of escape
+characters."
+  (let ((search-fun (if (eq direction 'backward)
+                       (if regexp-flag 're-search-backward 'search-backward)
+                     (if regexp-flag 're-search-forward 'search-forward))))
+    (catch 'found
+      (while (funcall search-fun pattern bound noerror)
+       (when (not (TeX-escaped-p (match-beginning 0)))
+         (throw 'found (point)))))))
+
+(defun TeX-escaped-p (&optional pos)
+  "Return t if the character at position POS is escaped.
+If POS is omitted, examine the character at point.
+A character is escaped if it is preceded by an odd number of
+escape characters, such as \"\\\" in LaTeX."
+  (save-excursion
+    (when pos (goto-char pos))
+    (not (zerop (mod (skip-chars-backward (regexp-quote TeX-esc)) 2)))))
+
+(defun TeX-current-macro ()
+  "Return the name of the macro containing point, nil if there is none."
+  (let ((macro-start (TeX-find-macro-start)))
+    (when macro-start
+      (save-excursion
+       (goto-char macro-start)
+       (forward-char (length TeX-esc))
+       (buffer-substring-no-properties
+        (point) (progn (skip-chars-forward "@A-Za-z") (point)))))))
+
+(defvar TeX-search-forward-comment-start-function nil
+  "Function to find the start of a comment.
+The function should accept an optional argument for specifying
+the limit of the search.  It should return the position just
+before the comment if one is found and nil otherwise.  Point
+should not be moved.")
+(make-variable-buffer-local 'TeX-search-forward-comment-start-function)
+
+(defun TeX-search-forward-comment-start (&optional limit)
+  "Search forward for a comment start from current position till LIMIT.
+If LIMIT is omitted, search till the end of the buffer.
+
+The search relies on `TeX-comment-start-regexp' being set
+correctly for the current mode.
+
+Set `TeX-search-forward-comment-start-defun' in order to override
+the default implementation."
+  (if TeX-search-forward-comment-start-function
+      (funcall TeX-search-forward-comment-start-function limit)
+    (setq limit (or limit (point-max)))
+    (when (TeX-re-search-forward-unescaped TeX-comment-start-regexp limit t)
+      (match-beginning 0))))
+
+;;; Fonts
+
+(defcustom TeX-font-list '((?\C-b "{\\bf " "}")
+                          (?\C-c "{\\sc " "}")
+                          (?\C-e "{\\em " "\\/}")
+                          (?\C-i "{\\it " "\\/}")
+                          (?\C-r "{\\rm " "}")
+                          (?\C-s "{\\sl " "\\/}")
+                          (?\C-t "{\\tt " "}")
+                          (?\C-d "" "" t))
+  "List of fonts used by `TeX-font'.
+
+Each entry is a list.
+The first element is the key to activate the font.
+The second element is the string to insert before point, and the third
+element is the string to insert after point.
+If the fourth and fifth element are strings, they specify the prefix and
+suffix to be used in math mode.
+An optional fourth (or sixth) element means always replace if t."
+  :group 'TeX-macro
+  :type '(repeat
+          (group
+           :value (?\C-a "" "")
+           (character :tag "Key")
+           (string :tag "Prefix")
+           (string :tag "Suffix")
+           (option (group
+                    :inline t
+                    (string :tag "Math Prefix")
+                    (string :tag "Math Suffix")))
+           (option (sexp :format "Replace\n" :value t)))))
+
+(defvar TeX-font-replace-function 'TeX-font-replace
+  "Determines the function which is called when a font should be replaced.")
+
+(defun TeX-describe-font-entry (entry)
+  "A textual description of an ENTRY in `TeX-font-list'."
+  (concat (format "%16s  " (key-description (char-to-string (nth 0 entry))))
+         (if (or (eq t (nth 3 entry)) (eq t (nth 5 entry)))
+             "-- delete font"
+           (format "%14s %-3s %14s %-3s"
+                   (nth 1 entry) (nth 2 entry)
+                   (if (stringp (nth 3 entry)) (nth 3 entry) "")
+                   (if (stringp (nth 4 entry)) (nth 4 entry) "")))))
+
+(defun TeX-font (replace what)
+  "Insert template for font change command.
+If REPLACE is not nil, replace current font.  WHAT determines the font
+to use, as specified by `TeX-font-list'."
+  (interactive "*P\nc")
+  (TeX-update-style)
+  (let* ((entry (assoc what TeX-font-list))
+        (in-math (texmathp))
+        (before (nth 1 entry))
+        (after (nth 2 entry)))
+    (setq replace (or replace (eq t (nth 3 entry)) (eq t (nth 5 entry))))
+    (if (and in-math (stringp (nth 3 entry)))
+       (setq before (nth 3 entry)
+             after (nth 4 entry)))
+    (cond ((null entry)
+          (let ((help (concat
+                       "Font list:   "
+                       "KEY        TEXTFONT           MATHFONT\n\n"
+                       (mapconcat 'TeX-describe-font-entry
+                                  TeX-font-list "\n"))))
+            (with-output-to-temp-buffer "*Help*"
+              (set-buffer "*Help*")
+              (insert help))))
+         (replace
+          (funcall TeX-font-replace-function before after))
+         ((TeX-active-mark)
+          (save-excursion
+            (cond ((> (mark) (point))
+                   (insert before)
+                   (goto-char (mark))
+                   (insert after))
+                  (t
+                   (insert after)
+                   (goto-char (mark))
+                   (insert before)))))
+         (t
+          (insert before)
+          (save-excursion
+            (insert after))))))
+
+(defun TeX-font-replace (start end)
+  "Replace font specification around point with START and END.
+For modes with font specifications like `{\\font text}'.
+See also `TeX-font-replace-macro' and `TeX-font-replace-function'."
+  (save-excursion
+    (while (not (looking-at "{\\\\[a-zA-Z]+ "))
+      (up-list -1))
+    (forward-sexp)
+    (save-excursion
+      (replace-match start t t))
+    (if (save-excursion
+         (backward-char 3)
+         (if (looking-at (regexp-quote "\\/}"))
+             (progn
+               (delete-char 3)
+               nil)
+           t))
+       (delete-backward-char 1))
+    (insert end)))
+
+(defun TeX-font-replace-macro (start end)
+  "Replace font specification around point with START and END.
+For modes with font specifications like `\\font{text}'.
+See also `TeX-font-replace' and `TeX-font-replace-function'."
+  (let ((font-list TeX-font-list)
+       cmds strings regexp)
+    (while font-list
+      (setq strings (cdr (car font-list))
+           font-list (cdr font-list))
+      (and (stringp (car strings)) (null (string= (car strings) ""))
+          (setq cmds (cons (car strings) cmds)))
+      (setq strings (cdr (cdr strings)))
+      (and (stringp (car strings)) (null (string= (car strings) ""))
+          (setq cmds (cons (car strings) cmds))))
+    (setq regexp (mapconcat 'regexp-quote cmds "\\|"))
+    (save-excursion
+      (catch 'done
+       (while t
+         (if (/= ?\\ (following-char))
+             (skip-chars-backward "a-zA-Z "))
+         (skip-chars-backward (regexp-quote TeX-esc))
+         (if (looking-at regexp)
+             (throw 'done t)
+           (up-list -1))))
+      ;; Use stripped syntax table in order to get stuff like "\emph{(}" right.
+      (with-syntax-table (TeX-search-syntax-table ?\{ ?\})
+       (forward-sexp 2))
+      (save-excursion
+       (replace-match start t t))
+      (delete-backward-char 1)
+      (insert end))))
+
+;;; Dollars
+;;
+;; Rewritten from scratch with use of `texmathp' by
+;; Carsten Dominik <dominik@strw.leidenuniv.nl>
+
+(defvar TeX-symbol-marker nil)
+
+(defvar TeX-symbol-marker-pos 0)
+
+;; The following constants are no longer used, but kept in case some
+;; foreign code uses any of them.
+(defvar TeX-dollar-sign ?$
+  "*Character used to enter and leave math mode in TeX.")
+(defconst TeX-dollar-string (char-to-string TeX-dollar-sign))
+(defconst TeX-dollar-regexp
+  (concat "^" (regexp-quote TeX-dollar-string) "\\|[^" TeX-esc "]"
+         (regexp-quote TeX-dollar-string)))
+
+(defcustom TeX-math-toggle-off-input-method t
+  "*If non-nil, auto toggle off CJK input methods when entering math mode."
+  :group 'TeX-macro
+  :type 'boolean)
+
+(defcustom TeX-math-close-double-dollar nil
+  "If non-nil close double dollar math by typing a single `$'."
+  :group 'TeX-macro
+  :type 'boolean)
+
+(defun TeX-insert-dollar (&optional arg)
+  "Insert dollar sign.
+
+If current math mode was not entered with a dollar, refuse to
+insert one.  Show matching dollar sign if this dollar sign ends
+the TeX math mode and `blink-matching-paren' is non-nil.  Ensure
+double dollar signs match up correctly by inserting extra dollar
+signs when needed.
+
+With raw \\[universal-argument] prefix, insert exactly one dollar
+sign.  With optional ARG, insert that many dollar signs."
+  (interactive "P")
+  (cond
+   ((and arg (listp arg))
+    ;; C-u always inserts one
+    (insert "$"))
+   (arg
+    ;; Numerical arg inserts that many
+    (insert (make-string (prefix-numeric-value arg) ?\$)))
+   ((TeX-escaped-p)
+    ;; This is escaped with `\', so just insert one.
+    (insert "$"))
+   ((texmathp)
+    ;; We are inside math mode
+    (if (and (stringp (car texmathp-why))
+            (string-equal (substring (car texmathp-why) 0 1) "\$"))
+       ;; Math mode was turned on with $ or $$ - so finish it accordingly.
+       (progn
+         (if TeX-math-close-double-dollar
+             (insert (car texmathp-why))
+           (insert "$"))
+         (when (and blink-matching-paren
+                    (or (string= (car texmathp-why) "$")
+                        (zerop (mod (save-excursion
+                                      (skip-chars-backward "$")) 2))))
+           (save-excursion
+             (goto-char (cdr texmathp-why))
+             (if (pos-visible-in-window-p)
+                 (sit-for 1)
+               (message "Matches %s"
+                        (buffer-substring
+                         (point) (progn (end-of-line) (point))))))))
+      ;; Math mode was not entered with dollar - we cannot finish it with one.
+      (message "Math mode started with `%s' cannot be closed with dollar"
+              (car texmathp-why))
+      (insert "$")))
+   (t
+    ;; Just somewhere in the text.
+    (insert "$")))
+  (TeX-math-input-method-off))
+
+(defvar TeX-math-input-method-off-regexp
+  "^\\(chinese\\|japanese\\|korean\\bulgarian\\russian\\)"
+  "Regexp matching input methods to be deactivated when entering math mode.")
+
+(defun TeX-math-input-method-off ()
+  "Toggle off input method when entering math mode."
+  (and TeX-math-toggle-off-input-method
+       (texmathp)
+       (boundp 'current-input-method) current-input-method
+       (string-match TeX-math-input-method-off-regexp current-input-method)
+       (inactivate-input-method)))
+
+;;; Simple Commands
+
+(defun TeX-normal-mode (arg)
+  "Remove all information about this buffer, and apply the style hooks again.
+Save buffer first including style information.
+With optional argument ARG, also reload the style hooks."
+  ;; FIXME: Shouldn't it be (&optional arg)?  -- rs
+  (interactive "*P")
+  (if arg
+      (setq TeX-style-hook-list nil
+           BibTeX-global-style-files nil
+           BibTeX-global-files nil
+           TeX-global-input-files nil))
+  (let ((TeX-auto-save t))
+    (if (buffer-modified-p)
+       (save-buffer)
+      (TeX-auto-write)))
+  (normal-mode)
+  ;; See also addition to `find-file-hooks' in `VirTeX-common-initialization'.
+  (when (eq TeX-master 'shared) (TeX-master-file nil nil t))
+  (TeX-update-style t))
+
+(defgroup TeX-quote nil
+  "Quoting in AUCTeX."
+  :group 'AUCTeX)
+
+(defcustom TeX-open-quote "``"
+  "String inserted by typing \\[TeX-insert-quote] to open a quotation."
+  :group 'TeX-quote
+  :type 'string)
+
+(defcustom TeX-close-quote "''"
+  "String inserted by typing \\[TeX-insert-quote] to close a quotation."
+  :group 'TeX-quote
+  :type 'string)
+
+(defcustom TeX-quote-after-quote nil
+  "Behaviour of \\[TeX-insert-quote].
+Nil means standard behaviour; when non-nil, opening and closing
+quotes are inserted only after \"."
+  :group 'TeX-quote
+  :type 'boolean)
+
+(defcustom TeX-quote-language-alist nil
+  "Alist for overriding the default language-specific quote insertion.
+First element in each item is the name of the language as set by
+the language style file as a string.  Second element is the
+opening quotation mark.  Third elemxent is the closing quotation
+mark.  Opening and closing quotation marks can be specified
+directly as strings or as functions returning a string.  Fourth
+element is a boolean specifying insertion behavior, overriding
+`TeX-quote-after-quote'.  See Info node `(auctex)European' for
+valid languages."
+  :group 'TeX-quote
+  :link '(custom-manual "(auctex)European")
+  :type '(repeat (group (choice
+                        (const "czech")
+                        (const "danish")
+                        (const "dutch")
+                        (const "german")
+                        (const "ngerman")
+                        (const "french") ;; not frenchb or francais
+                        (const "italian")
+                        (const "polish")
+                        (const "slovak")
+                        (const "swedish")
+                        (string :tag "Other Language"))
+                       (choice :tag "Opening quotation mark" string function)
+                       (choice :tag "Closing quotation mark" string function)
+                       (boolean :tag "Insert plain quote first" :value t))))
+
+(defvar TeX-quote-language nil
+  "If non-nil determines behavior of quote insertion.
+It is usually set by language-related style files.  Its value has
+the same structure as the elements of `TeX-quote-language-alist'.
+The symbol 'override can be used as its car in order to override
+the settings of style files.  Style files should therefore check
+if this symbol is present and not alter `TeX-quote-language' if
+it is.")
+(make-variable-buffer-local 'TeX-quote-language)
+
+(defun TeX-insert-quote (force)
+  "Insert the appropriate quotation marks for TeX.
+Inserts the value of `TeX-open-quote' (normally ``) or `TeX-close-quote'
+\(normally '') depending on the context.  If `TeX-quote-after-quote'
+is non-nil, this insertion works only after \".
+With prefix argument FORCE, always inserts \" characters."
+  (interactive "*P")
+  (if (or force
+         ;; Do not insert TeX quotes in verbatim, math or comment constructs.
+         (and (fboundp 'font-latex-faces-present-p)
+              (font-latex-faces-present-p '(font-latex-verbatim-face
+                                            font-latex-math-face
+                                            font-lock-comment-face))
+              (font-latex-faces-present-p '(font-latex-verbatim-face
+                                            font-latex-math-face
+                                            font-lock-comment-face)
+                                          (1- (point))))
+         (texmathp)
+         (and (TeX-in-comment) (not (eq major-mode 'doctex-mode))))
+      (self-insert-command (prefix-numeric-value force))
+    (TeX-update-style)
+    (let* ((lang-override (if (eq (car TeX-quote-language) 'override)
+                             TeX-quote-language
+                           (assoc (car TeX-quote-language)
+                                  TeX-quote-language-alist)))
+          (lang (or lang-override TeX-quote-language))
+          (open-quote (if lang (nth 1 lang) TeX-open-quote))
+          (close-quote (if lang (nth 2 lang) TeX-close-quote))
+          (q-after-q (if lang (nth 3 lang) TeX-quote-after-quote)))
+      (when (functionp open-quote)
+       (setq open-quote (funcall open-quote)))
+      (when (functionp close-quote)
+       (setq close-quote (funcall close-quote)))
+      (if q-after-q
+         (insert (cond ((bobp)
+                        ?\")
+                       ((save-excursion
+                          (TeX-looking-at-backward
+                           (concat (regexp-quote open-quote) "\\|"
+                                   (regexp-quote close-quote))
+                           (max (length open-quote) (length close-quote))))
+                        (delete-backward-char (length (match-string 0)))
+                        "\"\"")
+                       ((< (save-excursion (skip-chars-backward "\"")) -1)
+                        ?\")
+                       ((not (= (preceding-char) ?\"))
+                        ?\")
+                       ((save-excursion
+                          (forward-char -1)
+                          (bobp))
+                        (delete-backward-char 1)
+                        open-quote)
+                       ((save-excursion
+                          (forward-char -2) ;;; at -1 there is double quote
+                          (looking-at "[ \t\n]\\|\\s("))
+                        (delete-backward-char 1)
+                        open-quote)
+                       (t
+                        (delete-backward-char 1)
+                        close-quote)))
+       (insert (cond ((bobp)
+                      open-quote)
+                     ((= (preceding-char) (string-to-char TeX-esc))
+                      ?\")
+                     ((= (preceding-char) ?\")
+                      ?\")
+                     ((save-excursion
+                        (forward-char (- (length open-quote)))
+                        (looking-at (regexp-quote open-quote)))
+                      (delete-backward-char (length open-quote))
+                      ?\")
+                     ((save-excursion
+                        (forward-char (- (length close-quote)))
+                        (looking-at (regexp-quote close-quote)))
+                      (delete-backward-char (length close-quote))
+                      ?\")
+                     ((save-excursion
+                        (forward-char -1)
+                        (looking-at "[ \t\n]\\|\\s("))
+                      open-quote)
+                     (t
+                      close-quote)))))))
+
+(defun TeX-insert-punctuation ()
+  "Insert point or comma, cleaning up preceding space."
+  (interactive)
+  (expand-abbrev)
+  (if (TeX-looking-at-backward "\\\\/\\(}+\\)" 50)
+      (replace-match "\\1" t))
+  (call-interactively 'self-insert-command))
+
+(defun TeX-insert-braces (arg)
+  "Make a pair of braces around next ARG sexps and leave point inside.
+No argument is equivalent to zero: just insert braces and leave point
+between.
+
+If there is an active region, ARG will be ignored, braces will be
+inserted around the region, and point will be left after the
+closing brace."
+  (interactive "P")
+  (if (TeX-active-mark)
+      (progn
+       (if (< (point) (mark))
+           (exchange-point-and-mark))
+       (insert TeX-grcl)
+       (save-excursion
+         (goto-char (mark))
+         (insert TeX-grop)))
+    (insert TeX-grop)
+    (save-excursion
+      (if arg (forward-sexp (prefix-numeric-value arg)))
+      (insert TeX-grcl))))
+
+;;;###autoload
+(defun TeX-submit-bug-report ()
+  "Submit a bug report on AUCTeX via mail.
+
+Don't hesitate to report any problems or inaccurate documentation.
+
+If you don't have setup sending mail from (X)Emacs, please copy the
+output buffer into your mail program, as it gives us important
+information about your AUCTeX version and AUCTeX configuration."
+  (interactive)
+  (require 'reporter)
+  (let ((reporter-prompt-for-summary-p "Bug report subject: "))
+    (reporter-submit-bug-report
+     "bug-auctex@gnu.org"
+     AUCTeX-version
+     (list 'AUCTeX-date
+          'window-system
+          'LaTeX-version
+          'TeX-style-path
+          'TeX-auto-save
+          'TeX-parse-self
+          'TeX-master
+          'TeX-command-list)
+     nil nil
+     "Remember to cover the basics, that is, what you expected to happen and
+what in fact did happen.
+
+Be sure to consult the FAQ section in the manual before submitting
+a bug report.  In addition check if the bug is reproducable with an
+up-to-date version of AUCTeX.  So please upgrade to the version
+available from http://www.gnu.org/software/auctex/ if your
+installation is older than the one available from the web site.
+
+If the bug is triggered by a specific \(La\)TeX file, you should try
+to produce a minimal sample file showing the problem and include it
+in your report.
+
+Your bug report will be posted to the AUCTeX bug reporting list.
+------------------------------------------------------------------------")))
+
+
+;;; Documentation
+
+(defun TeX-goto-info-page ()
+  "Read documentation for AUCTeX in the info system."
+  (interactive)
+  (info "auctex"))
+
+(autoload 'info-lookup->completions "info-look")
+
+(defvar TeX-doc-backend-alist
+  '((texdoc (plain-tex-mode latex-mode doctex-mode ams-tex-mode context-mode)
+           (lambda ()
+             (when (executable-find "texdoc")
+               (TeX-search-files
+                ;; Explicitely supply doc directory for
+                ;; non-kpathsea-based TeX systems.
+                (unless (stringp TeX-kpathsea-path-delimiter)
+                  (or (TeX-tree-expand
+                       '("$SYSTEXMF" "$TEXMFLOCAL" "$TEXMFMAIN" "$TEXMFDIST")
+                       "latex" '("/doc/"))
+                      `(,@TeX-macro-global ,@TeX-macro-private)))
+                '("dvi" "pdf" "ps" "txt" "html") t t)))
+           (lambda (doc)
+             ;; texdoc in MiKTeX requires --view in order to start
+             ;; the viewer instead of an intermediate web page.
+             (call-process "texdoc" nil 0 nil "--view" doc)))
+    (latex-info (latex-mode)
+               (lambda ()
+                 (when (condition-case nil
+                           (save-window-excursion
+                             (let ((buf (generate-new-buffer-name "*info*")))
+                               (info "latex" buf)
+                               (kill-buffer buf))
+                             t)
+                         (error nil))
+                   (mapcar (lambda (x)
+                             (let ((x (car x)))
+                               (if (string-match "\\`\\\\" x)
+                                   (substring x 1) x)))
+                           (info-lookup->completions 'symbol 'latex-mode))))
+               (lambda (doc)
+                 (info-lookup-symbol (concat "\\" doc) 'latex-mode)))
+    (texinfo-info (texinfo-mode)
+                 (lambda ()
+                   (when (condition-case nil
+                             (save-window-excursion
+                               (let ((buf (generate-new-buffer-name "*info*")))
+                                 (info "texinfo" buf)
+                                 (kill-buffer buf))
+                               t)
+                           (error nil))
+                     (mapcar (lambda (x)
+                               (let ((x (car x)))
+                                 (if (string-match "\\`@" x)
+                                     (substring x 1) x)))
+                             (info-lookup->completions 'symbol
+                                                       'texinfo-mode))))
+                 (lambda (doc)
+                   (info-lookup-symbol (concat "@" doc) 'texinfo-mode))))
+  "Alist of backends used for looking up documentation.
+Each item consists of four elements.
+
+The first is a symbol describing the backend's name.
+
+The second is a list of modes the backend should be activated in.
+
+The third is a function returning a list of documents available
+to the backend.  It should return nil if the backend is not
+available, e.g. if a required executable is not present on the
+system in question.
+
+The fourth is a function for displaying the documentation.  The
+function should accept a single argument, the chosen package,
+command, or document name.")
+
+(defun TeX-doc (&optional name)
+  "Display documentation for string NAME.
+NAME may be a package, a command, or a document."
+  (interactive)
+  (let (docs)
+    ;; Build the lists of available documentation used for completion.
+    (dolist (elt TeX-doc-backend-alist)
+      (when (memq major-mode (nth 1 elt))
+       (let ((completions (funcall (nth 2 elt))))
+         (unless (null completions)
+           (add-to-list 'docs (cons completions (nth 0 elt)))))))
+    (if (null docs)
+       (progn
+         (if (executable-find "texdoc")
+             ;; Fallback if we did not find anything via the backend list.
+             (let ((doc (read-from-minibuffer "Input for `texdoc': ")))
+               (when doc (call-process "texdoc" nil 0 nil "--view" doc)))
+           ;; Give up.
+           (message "No documentation found")))
+      ;; Ask the user about the package, command, or document.
+      (when (and (interactive-p)
+                (or (not name) (string= name "")))
+       (let ((symbol (thing-at-point 'symbol))
+             contained completions doc)
+         ;; Is the symbol at point contained in the lists of available
+         ;; documentation?
+         (setq contained (catch 'found
+                           (dolist (elt docs)
+                             (when (member symbol (car elt))
+                               (throw 'found t)))))
+         ;; Setup completion list in a format suitable for `completing-read'.
+         (dolist (elt docs)
+           (setq completions (nconc (mapcar 'list (car elt)) completions)))
+         ;; Query user.
+         (setq doc (completing-read
+                    (if contained
+                        (format "Package, command, or document (default %s): "
+                                symbol)
+                      "Package, command, or document: ")
+                    completions))
+         (setq name (if (string= doc "") symbol doc))))
+      (if (not name)
+         (message "No documentation specified")
+       ;; XXX: Provide way to choose in case a symbol can be found in
+       ;; more than one backend.
+       (let* ((backend (catch 'found
+                         (dolist (elt docs)
+                           (when (member name (car elt))
+                             (throw 'found (cdr elt)))))))
+         (if backend
+             (funcall (nth 3 (assoc backend TeX-doc-backend-alist)) name)
+           (message "Documentation not found")))))))
+
+
+;;; Ispell Support
+
+;; FIXME: Document those functions and variables.  -- rs
+
+;; The FSF ispell.el use this.
+(defun ispell-tex-buffer-p ()
+  (and (boundp 'ispell-tex-p) ispell-tex-p))
+
+;; The FSF ispell.el might one day use this.
+(setq ispell-enable-tex-parser t)
+
+(defun TeX-run-ispell (command string file)
+  "Run ispell on current TeX buffer."
+  (cond ((and (string-equal file (TeX-region-file))
+             (fboundp 'ispell-region))
+        (call-interactively 'ispell-region))
+       ((string-equal file (TeX-region-file))
+        (call-interactively 'spell-region))
+       ((fboundp 'ispell-buffer)
+        (ispell-buffer))
+       ((fboundp 'ispell)
+        (ispell))
+       (t
+        (spell-buffer))))
+
+(defun TeX-ispell-document (name)
+  "Run ispell on all open files belonging to the current document."
+  (interactive (list (TeX-master-file)))
+  (if (string-equal name "")
+      (setq name (TeX-master-file)))
+
+  (let ((found nil)
+       (regexp (concat "\\`\\("
+                       (mapconcat (lambda (dir)
+                                    (regexp-quote
+                                     (expand-file-name 
+                                      (file-name-as-directory dir))))
+                                  (append (when (file-name-directory name)
+                                            (list (file-name-directory name)))
+                                          TeX-check-path)
+                                  "\\|")
+                       "\\).*\\("
+                       (mapconcat 'regexp-quote
+                                  (cons (file-name-nondirectory name)
+                                        (TeX-style-list)) "\\|")
+                       "\\)\\.\\("
+                       (mapconcat 'regexp-quote TeX-file-extensions "\\|")
+                       "\\)\\'"))
+       (buffers (buffer-list)))
+    (while buffers
+      (let* ((buffer (car buffers))
+            (name (buffer-file-name buffer)))
+       (setq buffers (cdr buffers))
+       (if (and name (string-match regexp name))
+           (progn
+             (save-excursion (switch-to-buffer buffer) (ispell-buffer))
+             (setq found t)))))))
+
+;; Some versions of ispell 3 use this.
+(defvar ispell-tex-major-modes nil)
+(setq ispell-tex-major-modes
+      (append '(plain-tex-mode ams-tex-mode latex-mode doctex-mode)
+             ispell-tex-major-modes))
+
+
+;;; Special provisions for other modes and libraries
+
+;; desktop-locals-to-save is broken by design.  Don't have
+;; buffer-local values of it.
+(eval-after-load "desktop"
+  '(progn
+     (dolist (elt '(TeX-master))
+       (unless (member elt (default-value 'desktop-locals-to-save))
+        (setq-default desktop-locals-to-save
+                      (cons elt (default-value 'desktop-locals-to-save)))))
+     (add-hook 'desktop-after-read-hook '(lambda ()
+                                          (TeX-set-mode-name t)))))
+
+;; delsel.el, `delete-selection-mode'
+(put 'TeX-newline 'delete-selection t)
+(put 'TeX-insert-dollar 'delete-selection t)
+(put 'TeX-insert-quote 'delete-selection t)
+(put 'TeX-insert-backslash 'delete-selection t)
+
+(provide 'tex)
+
+;; Local Variables:
+;; coding: iso-8859-1
+;; End:
+
+;;; tex.el ends here
diff --git a/packages/auctex/texmathp.el b/packages/auctex/texmathp.el
new file mode 100644 (file)
index 0000000..b7bb7f4
--- /dev/null
@@ -0,0 +1,411 @@
+;;; texmathp.el -- Code to check if point is inside LaTeX math environment
+
+;; Copyright (C) 1998, 2004 Free Software Foundation, Inc.
+
+;; Author: Carsten Dominik <dominik@strw.LeidenUniv.nl>
+;; Maintainer: auctex-devel@gnu.org
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+;;
+;;  This code provides a function to determine if point in a buffer is
+;;  inside a (La)TeX math environment.  This is not trivial since many
+;;  different ways are used to switch between the two.  Examples:
+;;
+;;    \begin{equation}  ... \end{equation}
+;;    $ ... $
+;;    $$ ... $$
+;;    \[ ... \]
+;;    \ensuremath{...}
+;;    \mbox{...}
+;;
+;;  To install, put this file on your load-path and compile it.
+;;
+;;  To use this in a Lisp program, do
+;;
+;;     (require 'texmathp)
+;;
+;;  You can then write code like this:
+;;
+;;     (if (texmathp) ...)
+;;
+;;  The call to `texmathp' leaves some extra information in the
+;;  variable `texmathp-why'.  It's value is a cons cell (MATCH . POSITION),
+;;  specifying which command at what position is responsible for math
+;;  mode being on or off.
+;;
+;;  To configure which macros and environments influence LaTeX math mode,
+;;  customize the variable `texmathp-tex-commands'.  By default
+;;  it recognizes the LaTeX core as well as AMS-LaTeX (see the variable
+;;  `texmathp-tex-commands-default', also as an example).
+;;
+;;  To try out the code interactively, use `M-x texmathp RET'.
+;;
+;;  Of course, in order to work this function has to assume that the
+;;  LaTeX above point is syntactically correct.  In particular:
+;;
+;;  o The different math delimiters are paired correctly.  Thus if
+;;    you do things like "\begin{equation} $"  or "\[ ... \)"
+;;    the result of (texmathp) is undefined.  It is in fact possible
+;;    in LaTeX to pair \[ with $$ and \( with $, but this will confuse
+;;    texmathp (and human readers as well).
+;;
+;;  o However, texmathp will correctly work with nested delimiters.
+;;    Something like the following will be parsed correctly at any point:
+;;
+;;       \begin{equation}
+;;          x = y \mbox{abc \ensuremath{\alpha} cba $2^3$}
+;;       \end{equation}
+;;
+;;  o texmathp is somewhat forgiving if you have an empty line inside
+;;    the current math environment, which is not legal in TeX but may
+;;    easily happen during editing.  Depending upon the variable
+;;    `texmathp-search-n-paragraphs' several paragraphs are checked
+;;    backwards, by default 2.  Paragraph here means something limited
+;;    by an empty line.
+;;--------------------------------------------------------------------------
+;;
+;;  BUGS:
+;;
+;;  If any of the the special macros like \mbox or \ensuremath has optional
+;;  arguments, math mode inside these optional arguments is *not* influenced
+;;  by the macro.
+;;--------------------------------------------------------------------------
+\f
+;;; Code:
+
+(defgroup texmathp nil
+  "Testing TeX and LaTeX documents for math mode."
+  :tag "Test For TeX and LaTeX Math Mode"
+  :prefix "texmathp-"
+  :group 'tex)
+
+;; Some internal variables which are computed from `texmathp-tex-commands'
+;; and `texmathp-tex-commands-default'.
+(defvar texmathp-environments nil)
+(defvar texmathp-macros nil)
+(defvar texmathp-onoff-regexp nil)
+(defvar texmathp-toggle-regexp nil)
+(defvar texmathp-tex-commands1 nil)
+(defvar texmathp-memory nil)
+
+(defvar texmathp-tex-commands)         ; silence the compiler
+
+(defvar texmathp-tex-commands-default
+  '(;; Plain TeX
+    ("$$"            sw-toggle)   ("$"             sw-toggle)
+    ("\\hbox"        arg-off)
+    ("\\vbox"        arg-off)
+    ("\\vtop"        arg-off)
+    ("\\vcenter"     arg-off)
+
+    ;; Standard LaTeX
+    ("equation"      env-on)      ("equation*"     env-on)
+    ("eqnarray"      env-on)      ("eqnarray*"     env-on)
+    ("math"          env-on)
+    ("displaymath"   env-on)
+    ("minipage"      env-off)
+    ("\\fbox"        arg-off)
+    ("\\mbox"        arg-off)
+    ("\\framebox"    arg-off)
+    ("\\label"       arg-off)
+    ("\\textrm"      arg-off)
+    ("\\("           sw-on)       ("\\)"           sw-off)
+    ("\\["           sw-on)       ("\\]"           sw-off)
+    ("\\ensuremath"  arg-on)
+
+    ;; AMS-LaTeX
+    ("align"         env-on)      ("align*"        env-on)
+    ("gather"        env-on)      ("gather*"       env-on)
+    ("multline"      env-on)      ("multline*"     env-on)
+    ("flalign"       env-on)      ("flalign*"      env-on)
+    ("alignat"       env-on)      ("alignat*"      env-on)
+    ("xalignat"      env-on)      ("xalignat*"     env-on)
+    ("xxalignat"     env-on)      ("\\boxed"       arg-on)
+    ("\\text"        arg-off)     ("\\intertext"   arg-off))
+  "The default entries for `texmathp-tex-commands', which see.")
+
+(defun texmathp-compile ()
+  "Compile the value of `texmathp-tex-commands' into the internal lists.
+Call this when you have changed the value of that variable without using
+customize (customize calls it when setting the variable)."
+  (interactive)
+  ;; Extract lists and regexp.
+  (setq texmathp-macros nil texmathp-environments nil)
+  (setq texmathp-memory
+       (cons texmathp-tex-commands texmathp-tex-commands-default))
+  (setq texmathp-tex-commands1 (append texmathp-tex-commands
+                                      texmathp-tex-commands-default))
+  (let ((list (reverse texmathp-tex-commands1))
+       var entry type switches togglers)
+    (while (setq entry (car list))
+      (setq type (nth 1 entry)
+           list (cdr list)
+           var (cond ((memq type '(env-on env-off)) 'texmathp-environments)
+                     ((memq type '(arg-on arg-off)) 'texmathp-macros)
+                     ((memq type '(sw-on sw-off))   'switches)
+                     ((memq type '(sw-toggle))      'togglers)))
+      (set var (cons (car entry) (symbol-value var))))
+    (setq texmathp-onoff-regexp
+         (concat "[^\\\\]\\("
+                 (mapconcat 'regexp-quote switches "\\|")
+                 "\\)")
+         texmathp-toggle-regexp
+         (concat "\\([^\\\\\\$]\\|\\`\\)\\("
+                 (mapconcat 'regexp-quote togglers "\\|")
+                 "\\)"))))
+
+(defcustom texmathp-tex-commands nil
+  "List of environments and macros influencing (La)TeX math mode.
+This user-defined list is used in addition to LaTeX and AMSLaTeX defaults.
+The structure of each entry is (NAME TYPE)
+
+- The first item in each entry is the name of an environment or macro.
+  If it's a macro, include the backslash.
+
+- The second item is a symbol indicating how the command works:
+    `env-on'     Environment: turns math mode for its body  on
+    `env-off'    Environment: turns math mode for its body  off
+    `arg-on'     Command: turns math mode for its arguments on
+    `arg-off'    Command: turns math mode for its arguments off
+    `sw-on'      Switch: turns math-mode of following text  on
+    `sw-off'     Switch: turns math-mode of following text  off
+    `sw-toggle'  Switch: toggles math mode of following text"
+  :group 'texmathp
+  :set '(lambda (symbol value) (set-default symbol value) (texmathp-compile))
+  :type
+  '(repeat
+    (list :value ("" env-on)
+     (string  :tag "Name")
+     (choice  :tag "Type"
+      (const :tag "Environment: turns math mode for its body on" env-on)
+      (const :tag "Environment: turns math mode for its body off" env-off)
+      (const :tag "Command: turns math mode for its argument on" arg-on)
+      (const :tag "Command: turns math-mode for its argument off" arg-off)
+      (const :tag "Switch: turns math-mode of following text on" sw-on)
+      (const :tag "Switch: turns math-mode of following text off" sw-off)
+      (const :tag "Switch: toggles math mode of following text" sw-toggle)))))
+
+(defcustom texmathp-search-n-paragraphs 2
+  "*Number of paragraphs to check before point.
+Normally, you cannot have an empty line in a math environment in (La)TeX.
+The fastest method to test for math mode is then limiting the search
+backward to the nearest empty line.
+However, during editing it happens that such lines exist temporarily.
+Therefore we look a little further.  This variable determines how many
+empty lines we go back to fix the search limit."
+  :group 'texmathp
+  :type 'number)
+
+(defcustom texmathp-allow-detached-args nil
+  "*Non-nil means, allow arguments of macros to be detached by whitespace.
+When this is t, `aaa' will be interpreted as an argument of \bb in the
+following construct:  \bbb [xxx] {aaa}
+This is legal in TeX.  The disadvantage is that any number of braces expressions
+will be considered arguments of the macro independent of its definition."
+  :group 'texmathp
+  :type 'boolean)
+
+(defvar texmathp-why nil
+  "After a call to `texmathp' this variable shows why math-mode is on or off.
+The value is a cons cell (MATCH . POSITION).
+MATCH is a string like a car of an entry in `texmathp-tex-commands', e.q.
+\"equation\" or \"\\ensuremath\" or \"\\[\" or \"$\".
+POSITION is the buffer position of the match.  If there was no match,
+it points to the limit used for searches, usually two paragraphs up.")
+
+;; We need our own syntax table to play with the syntax of () [] and {}
+;; For speed reasons we define it statically instead of copying it each time.
+(defvar texmathp-syntax-table
+  (let ((table (make-syntax-table)))
+    (mapc (lambda (x) (modify-syntax-entry (car x) (cdr x) table))
+         '((?\\ . "\\") (?\f .">")  (?\n . ">")  (?% . "<")
+           (?\[ . ".")  (?\] . ".") (?\{ . "(}") (?\} . "){")
+           (?\( . ".")  (?\) . ".") (?\" . ".")  (?& . ".")   (?_ . ".")
+           (?@ . "_")   (?~ . " ")  (?$ . "$")   (?' . "w")))
+    table)
+  "Syntax table used while texmathp is parsing.")
+
+;;;###autoload
+(defun texmathp ()
+  "Determine if point is inside (La)TeX math mode.
+Returns t or nil.  Additional info is placed into `texmathp-why'.
+The functions assumes that you have (almost) syntactically correct (La)TeX in
+the buffer.
+See the variable `texmathp-tex-commands' about which commands are checked."
+  (interactive)
+  (let* ((pos (point)) math-on sw-match
+        (bound (save-excursion
+                 (if (re-search-backward "[\n\t][ \t]*[\n\r]"
+                                         nil 1 texmathp-search-n-paragraphs)
+                     (match-beginning 0)
+                   (point-min))))
+        (mac-match (texmathp-match-macro bound))
+        (env-match (texmathp-match-environment
+                    (if (and mac-match (> (cdr mac-match) bound))
+                        (cdr mac-match)
+                      bound)))
+        (match (cons nil bound)))
+
+    ;; Select the nearer match
+    (and env-match (setq match env-match))
+    (and mac-match (> (cdr mac-match) (cdr match)) (setq match mac-match))
+    (setq math-on (memq (nth 1 (assoc (car match) texmathp-tex-commands1))
+                       '(env-on arg-on)))
+
+    ;; Check for switches
+    (and (not math-on)
+        (setq sw-match (texmathp-match-switch bound))
+        (> (cdr sw-match) (cdr match))
+        (eq (nth 1 (assoc (car sw-match) texmathp-tex-commands1)) 'sw-on)
+        (setq match sw-match math-on t))
+
+    ;; Check for togglers
+    (if (not math-on)
+       (save-excursion
+         (goto-char (cdr match))
+         (while (re-search-forward texmathp-toggle-regexp pos t)
+           (if (setq math-on (not math-on))
+               (setq sw-match (cons (match-string 2) (match-beginning 2)))
+             (setq sw-match nil)))
+         (and math-on sw-match (setq match sw-match))))
+
+    ;; Store info, show as message when interactive, and return
+    (setq texmathp-why match)
+    (and (interactive-p)
+        (message "math-mode is %s: %s begins at buffer position %d"
+                 (if math-on "on" "off")
+                 (or (car match) "new paragraph")
+                 (cdr match)))
+    (and math-on t)))
+
+(defun texmathp-match-environment (bound)
+  "Find out if point is inside any of the math environments.
+Limit searched to BOUND.  The return value is like (\"equation\" . (point))."
+  (catch 'exit
+    (save-excursion
+      (and (null texmathp-environments) (throw 'exit nil))
+      ;; Check if the line we are starting with is a commented one.
+      (let ((orig-comment-flag
+            ;; Could be replaced by `TeX-in-commented-line'.
+            (progn
+              (save-excursion
+                (beginning-of-line)
+                (skip-chars-forward " \t")
+                (string= (buffer-substring-no-properties
+                          (point) (min (point-max)
+                                       (+ (point) (length comment-start))))
+                         comment-start))))
+           end-list env)
+       (while (re-search-backward "\\\\\\(begin\\|end\\)[ \t]*{\\([^}]+\\)}"
+                                  bound t)
+         ;; Check if the match found is inside of a comment.
+         (let ((current-comment-flag
+                ;; Could be replaced by `TeX-in-comment'.
+                (when (save-match-data
+                        (re-search-backward comment-start-skip
+                                            (line-beginning-position) t))
+                  ;; We need a t for comparison with `orig-comment-flag',
+                  ;; not a number.
+                  t)))
+           ;; Only consider matching alternatives with respect to
+           ;; "in-commentness", i.e. if we started with a comment
+           ;; only consider matches which are in comments as well and
+           ;; vice versa.
+           (when (eq orig-comment-flag current-comment-flag)
+             (setq env (buffer-substring-no-properties
+                        (match-beginning 2) (match-end 2)))
+             (cond ((string= (match-string 1) "end")
+                    (setq end-list (cons env end-list)))
+                   ((equal env (car end-list))
+                    (setq end-list (cdr end-list)))
+                   ((member env texmathp-environments)
+                    (throw 'exit (cons env (point))))))))
+       nil))))
+
+(defun texmathp-match-macro (bound)
+  "Find out if point is within the arguments of any of the Math macros.
+Limit searches to BOUND.  The return value is like (\"\\macro\" . (point))."
+  (catch 'exit
+    (and (null texmathp-macros) (throw 'exit nil))
+    (let (pos cmd (syntax-table (syntax-table)))
+      (unwind-protect
+         (save-restriction
+           (save-excursion
+             (set-syntax-table texmathp-syntax-table)
+             (narrow-to-region (max 1 bound) (point))
+             ;; Move back out of the current parenthesis
+             (while (condition-case nil (progn (up-list -1) t) (error nil))
+               ;; Move back over any touching sexps (in fact also non-touching)
+               (while
+                   (and
+                    (cond
+                     ((memq (preceding-char) '(?\] ?\})))
+                     ((and
+                       texmathp-allow-detached-args
+                       (re-search-backward
+                       "[]}][ \t]*[\n\r]?\\([ \t]*%[^\n\r]*[\n\r]\\)*[ \t]*\\="
+                       bound t))
+                      (goto-char (1+ (match-beginning 0))) t))
+                    (if (eq (preceding-char) ?\})
+                        ;; Jump back over {}
+                        (condition-case nil
+                            (progn (backward-sexp) t)
+                          (error nil))
+                      ;; Jump back over []. Modify syntax temporarily for this.
+                      (unwind-protect
+                          (progn
+                            (modify-syntax-entry ?\{ ".")
+                            (modify-syntax-entry ?\} ".")
+                            (modify-syntax-entry ?\[ "(]")
+                            (modify-syntax-entry ?\] ")[")
+                            (condition-case nil
+                                (progn (backward-sexp) t)
+                              (error nil)))
+                        (modify-syntax-entry ?\{ "(}")
+                        (modify-syntax-entry ?\} "){")
+                        (modify-syntax-entry ?\[ ".")
+                        (modify-syntax-entry ?\] ".")
+                        nil))))
+               (setq pos (point))
+               (and (memq (following-char) '(?\[ ?\{))
+                    (re-search-backward "\\\\[*a-zA-Z]+\\=" nil t)
+                    (setq cmd (buffer-substring-no-properties
+                               (match-beginning 0) (match-end 0)))
+                    (member cmd texmathp-macros)
+                    (throw 'exit (cons cmd (point))))
+               (goto-char pos))
+             (throw 'exit nil)))
+       (set-syntax-table syntax-table)))))
+
+;;;###autoload
+(defun texmathp-match-switch (bound)
+  "Search backward for any of the math switches.
+Limit searched to BOUND."
+  ;; The return value is like ("\\(" . (point)).
+  (save-excursion
+    (if (re-search-backward texmathp-onoff-regexp bound t)
+       (cons (buffer-substring-no-properties (match-beginning 1) (match-end 1))
+             (match-beginning 1))
+      nil)))
+
+(provide 'texmathp)
+
+;;; texmathp.el ends here
diff --git a/packages/auctex/toolbar-x.el b/packages/auctex/toolbar-x.el
new file mode 100644 (file)
index 0000000..ef4edc8
--- /dev/null
@@ -0,0 +1,2154 @@
+;;; toolbar-x.el --- fancy toolbar handling in Emacs and XEmacs
+
+;; Copyright (C) 2004, 2005, 2008 Free Software Foundation, Inc.
+
+;; 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, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+;; MA 02110-1301 USA
+
+;;; Author: Miguel Vinicius Santini Frasson
+
+;;; Commentary:
+;; This program implements a common interface to display toolbar
+;; buttons in both Emacs and XEmacs.  A toolbar should be basicly
+;; defined by a image and a command to run when the button is pressed,
+;; and additional properties could be added.  This is the idea of this
+;; program.  See the documentation of function
+;; `toolbarx-install-toolbar' for a description of how to specify
+;; toolbars.
+
+;;; Features:
+
+;; * Button properties are given in the toolbar definition (BUTTON
+;; paramenter in `toolbarx-install-toolbar') and/or in an alist with
+;; associates the symbol with properties (MEANING-ALIST paramenter in
+;; `toolbarx-install-toolbar').
+
+;; * Supported properties:
+;; - All editors: `:insert', `:image', `:command', `:help', `:enable',
+;;               `:append-command' and `:prepend-command';
+;; - Emacs only: `:visible' and `:button';
+;; - XEmacs only: `:toolbar'.
+;; For the precise value-type for each property, see documentation of
+;; the function `toolbarx-install-toolbar'.
+;; (ps: properties that are particular to an editor are just ignored
+;; the other editor flavour.)
+
+;; * Button properties may depend on the editor flavour, if the value
+;; is a vector; the first element will be used for Emacs and the 2nd
+;; for XEmacs. Example: `:image ["new" toolbar-file-icon]'
+
+;; * Properties can have value specified by function (with no
+;; argument) or variables that evaluate to an object of the correct
+;; type for a particular property.  The evaluation is done when the
+;; roolbar is refresh (a call of `toolbarx-refresh'.)
+;; (ps: this is valid only for properties that *not* have \`form\' as
+;; value type.)
+
+;; * On `refresh time' (a call `toolbarx-refresh', necessary when the
+;; toolbar should change), the `:insert' property (if present) is
+;; evaluated to decide if button will be displayed.
+
+;; Properties can be distributed to several buttons, using \`groups\'.
+;; Example: (for (bar baz :toolbar (bottom . top) :insert foo-form)
+;; means that `foo', `bar' and `baz' have `:insert foo-form' and `bar' and
+;; `baz' have the property `:toolbar (bottom . top)'.  (ps: this type
+;; of value for the `:toolbar' property (XEmacs only) means that the
+;; buttons will be in the bottom toolbar unless the default toolbar is
+;; in the bottom, and in this case, this buttons go to the top
+;; toolbar).
+
+;; * (Part of) the toolbar definition can be stored in a variable,
+;; evaluated in `installation time'.  See `:eval-group' on the
+;; documentation of the function `toolbarx-install-toolbar'.
+
+;; * It is possible to define sets of buttons that appear according to
+;; an option selected in a dropdown menu.  See `:dropdown-group' on
+;; the documentation of the function `toolbarx-install-toolbar'.
+
+;;; Rough description of the implementation
+;; There are 3 \`engines\' implemented:
+
+;; == the 1st one (parsing) parses the toolbar definition
+;; independently of editor flavour and store the parsed buttons with
+;; their properties, in the same order that they appear in the
+;; definitions, in a variable `toolbarx-internal-button-switches';
+
+;; == the 2nd one (refresh for Emacs) inserts buttons in the Emacs
+;; toolbar in the same order that they appear in the definitions;
+;; buttons with a `:insert' property value that evaluates to nil are
+;; ignored; if a (real) button does not have at least (valid) image
+;; and command properties, they are silently ignored;
+
+;; == the 3rd engine (refresh for XEmacs) is similar to the 2nd, but
+;; inserts buttons in XEmacs.
+
+;;; History:
+
+;; This program was motivated by the intention of implementation of a
+;; good toolbar for AUCTeX, that would work in both Emacs and XEmacs.
+;; Since toolbars are very different in behaviour and implementation
+;; (for instance, in Emacs one can display as many toolbar buttons as
+;; wanted, because it becomes mult-line, and in XEmacs, there is one
+;; line, but toolbars and all sides of a frame.)
+
+\f
+;;; Code:
+
+;; Note that this just gives a useful default.  Icons are expected to
+;; be in subdirectory "images" or "toolbar" relative to the load-path.
+;; Packages loading toolbarx are advised to explicitly add their own
+;; searchpath with add-to-list here even when they fulfill that
+;; criterion: another package might have loaded toolbar-x previously
+;; when load-path was not yet correctly set.  The default setting
+;; really caters only for toolbar-x' stock icons.
+
+(defvar toolbarx-image-path
+  (nconc
+   (delq nil (mapcar #'(lambda(x)
+                        (and x
+                             (member
+                              (file-name-nondirectory
+                               (directory-file-name x))
+                              '("toolbar" "images"))
+                             ;;(file-directory-p x)
+                             x))
+                    load-path))
+   (list data-directory))
+  "List of directories where toolbarx finds its images.")
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; First engine: Parsing buttons
+
+;; it obtains button information, process it and stores result in
+;; `toolbarx-internal-button-switches', which is a list with 1st
+;; element the symbol `:switches', the 2nd element as a list of
+;; processed buttons, and the 3rd element is used for Emacs to store
+;; the keys used in ``constant'' buttons.
+
+;; The 2nd element of `toolbarx-internal-button-switches' is a list
+;; where each element is either:
+;;  * a button-list, that is, a list with elements to define a button.
+;;  * a list where 1st elem is `:insert' and 2nd is a form, and the
+;; following elements are in the same format of the 2nd element of
+;; `toolbarx-internal-button-switches'.
+
+(defun toolbarx-make-string-from-symbol (symbol)
+  "Return a string from the name of a SYMBOL.
+Upcase initials and replace dashes by spaces."
+  (let* ((str (upcase-initials (symbol-name symbol)))
+        (str2))
+    (dolist (i (append str nil))
+      (if (eq i 45)                    ; if dash, push space
+         (push 32 str2)
+       (push i str2)))                 ; else push identical
+    (concat (nreverse str2))))
+
+(defun toolbarx-make-symbol-from-string (string)
+  "Return a (intern) symbol from STRING.
+Downcase string and replace spaces by dashes."
+  (let* ((str1 (append (downcase string) nil))
+        (str2))
+    (dolist (i str1)
+      (if (eq i 32)                    ; if dash, push space
+         (push 45 str2)
+       (push i str2)))
+    (intern (concat (nreverse str2)))))
+
+(defun toolbarx-good-option-list-p (option-list valid-options)
+  "Non-nil means the OPTION-LIST is of form (OPT FORM ... OPT FORM).
+Each OPT is member of VALID-OPTIONS and OPT are pairwise
+different.  OPTION-LIST equal to nil is a good option list."
+  (let ((elt-in-valid t)
+       (temp-opt-list option-list)
+       (list-diff)
+       (n (/ (length option-list) 2)))
+    (dotimes (i n)
+      (when (> i 0)
+       (setq temp-opt-list (cddr temp-opt-list)))
+      (add-to-list 'list-diff
+                  (car temp-opt-list))
+      (setq elt-in-valid (and elt-in-valid
+                             (memq (car temp-opt-list)
+                                   valid-options))))
+    (and elt-in-valid                  ; options are on VALID-OPTOPNS
+        ;; OPTION-LIST has all option different from each other
+        (eq (length list-diff) n)
+        ;; OPTION-LIST has even number of elements
+        (eq (% (length option-list) 2) 0))))
+
+(defun toolbarx-separate-options (group-list valid-options &optional check)
+  "Return a cons cell with non-options and options of GROUP-LIST.
+The options-part is the largest tail of the list GROUP-LIST that
+has an element of VALID-OPTIONS (the comparation is made with
+`memq'.)  The non-options-part is the beginning of GROUP-LIST
+less its tail. Return a cons cell which `car' is the
+non-options-part and the `cdr' is the options-part.
+
+If CHECK is non-nil, the tail is the largest that yield non-nil
+when applied to `toolbarx-good-option-list-p'."
+  (let ((maximal)
+       (temp))
+    (dolist (i valid-options)
+      (setq temp (memq i group-list))
+      (when (and (> (length temp) (length maximal))
+                (if check
+                    (toolbarx-good-option-list-p temp valid-options)
+                  t))
+       (setq maximal (memq i group-list))))
+    (cons (butlast group-list (length maximal)) maximal)))
+
+
+(defun toolbarx-merge-props (inner-props outer-props override add)
+  "Merge property lists INNER-PROPS and OUTER-PROPS.
+INNER-PROPS and OUTER-PROPS are two lists in the format
+ (PROP VAL PROP VAL ... PROP VAL).
+Returns a list with properties and values merged.
+
+OVERRIDE and ADD are supposed to be lists of symbols.  The value
+of a property in OVERRIDE is the one on OUTER-PROPS or
+INNER-PROPS, but if the property is in both, the value in
+INNER-PROPS is used.  The value of a property in ADD will be a
+list with first element the symbol `:add-value-list' and the rest
+are the properties, inner properties first."
+  (let* ((merged)
+        (inner-prop)
+        (outer-prop))
+    (dolist (prop override)
+      (if (memq prop inner-props)
+         (setq merged (append merged
+                              (list prop (cadr (memq prop inner-props)))))
+       (when (memq prop outer-props)
+         (setq merged (append merged
+                              (list prop (cadr (memq prop outer-props))))))))
+    (dolist (prop add merged)
+      (setq inner-prop (memq prop inner-props))
+      (when inner-prop
+       (if (and (listp (cadr inner-prop))
+                (eq (car (cadr inner-prop)) :add-value-list))
+           (setq inner-prop (cdr (cadr inner-prop)))
+         (setq inner-prop (list (cadr inner-prop)))))
+      (setq outer-prop (memq prop outer-props))
+      (when outer-prop
+       (if (and (listp (cadr outer-prop))
+                (eq (car (cadr outer-prop)) :add-value-list))
+           (setq outer-prop (cdr (cadr outer-prop)))
+         (setq outer-prop (list (cadr outer-prop)))))
+      (when (append inner-prop outer-prop)
+       (setq merged (append merged
+                            (list prop (cons :add-value-list
+                                             (append inner-prop
+                                                     outer-prop)))))))))
+
+(defun toolbarx-make-command (comm prep app)
+  "Return a command made from COMM, PREP and APP.
+COMM is a command or a form.  PREP and APP are forms.  If PREP or
+APP are non-nil, they are added to the resulting command at the
+beginning and end, respectively.  If both are nil and COMM is a
+command, COMM is returned."
+  (let ((comm-is-command (commandp comm)))
+    (if (and (not prep)
+            (not app)
+            comm-is-command)
+       comm
+      (append '(lambda nil (interactive))
+             (when prep (list prep))
+             (when comm
+               (if comm-is-command
+                   `((call-interactively (function ,comm)))
+                 (list comm)))
+             (when app (list app))))))
+
+;; in Emacs, menus are made of keymaps (vectors are possible, but editors
+;; handle `menu titles' differently) meanwhile in XEmacs, menus are lists of
+;; vectors
+
+(defun toolbarx-emacs-mount-popup-menu
+  (strings var type &optional title save)
+  "Return an interactive `lambda'-expression that shows a popup menu.
+This function is the action of `toolbarx-mount-popup-menu' if
+inside Emacs. See documentation of that function for more."
+  ;; making the menu keymap by adding each menu-item definition
+  ;; see (info "(elisp)Menu keymaps")
+  (let* ((keymap (make-sparse-keymap title))
+        (count 1)
+        (used-symbols '(nil))
+        (key)
+        (real-type (if (eq type 'toggle) 'toggle 'radio))
+        (real-save (when save (if (eq save 'offer) 'offer 'always))))
+    ;; warn if type is not `radio' ot `toggle'; use `radio' if incorrect.
+    (unless (eq type real-type)
+      (display-warning 'toolbarx
+                      (format (concat "TYPE should be symbols `radio' or "
+                                      "`toggle', but %s found; using `radio'")
+                              type)))
+    ;; warn if save is not `nil', `offer' or `always'; use nil when incorrect
+    (unless (eq save real-save)
+      (setq real-save nil)
+      (display-warning 'toolbarx
+                      (format (concat "SAVE should be symbols `nil', "
+                                      "`offer' or `always', but %s found; "
+                                      "using `nil'")
+                              save)))
+    (dolist (i strings)
+      ;; finding a new symbol
+      (let* ((aux-count 0)
+           (i-symb (toolbarx-make-symbol-from-string i)))
+       (setq key i-symb)
+       (while (memq key used-symbols)
+         (setq aux-count (1+ aux-count))
+         (setq key (intern (format "%s-%d" i-symb aux-count))))
+       (setq used-symbols (cons key used-symbols)))
+      (define-key-after keymap (vector key)
+       `(menu-item ,i
+                   ,(append
+                     `(lambda nil (interactive)
+                        ,(if (eq real-type 'radio)
+                             `(setq ,var ,count)
+                           `(if (memq ,count ,var)
+                               (setq ,var (delete ,count ,var))
+                              (setq ,var (sort (cons ,count ,var) '<))))
+                        (toolbarx-refresh))
+                     (when (eq real-save 'always)
+                       `((customize-save-variable
+                          (quote ,var) ,var)))
+                     `(,var))
+                   :button ,(if (eq real-type 'radio)
+                                `(:radio eq ,var ,count)
+                              `(:toggle memq ,count ,var))))
+      (setq count (1+ count)))
+    (when (eq real-save 'offer)
+      (define-key-after keymap [sep] '(menu-item "--shadow-etched-in-dash"))
+      (let* ((aux-count 0)
+            (i-symb 'custom-save))
+       (setq key i-symb)
+       (while (memq key used-symbols)
+         (setq aux-count (1+ aux-count))
+         (setq key (intern (format "%s-%d" i-symb aux-count))))
+       (setq used-symbols (cons key used-symbols)))
+      (define-key-after keymap (vector key)
+       `(menu-item "Save state of this menu"
+                  (lambda nil (interactive)
+                    (customize-save-variable (quote ,var) ,var)))))
+    ;; returns a `lambda'-expression
+    `(lambda nil (interactive) (popup-menu (quote ,keymap)))))
+
+(defun toolbarx-xemacs-mount-popup-menu
+  (strings var type &optional title save)
+  "Return an interactive `lambda'-expression that shows a popup menu.
+This function is the action of `toolbarx-mount-popup-menu' if
+inside XEmacs. See documentation of that function for more."
+  (let* ((menu (if (and title (stringp title))
+                  (list title)
+                (setq title nil)
+                (list "Dropdown menu")))
+        (count 0)
+        (menu-item)
+        (menu-callback)
+        (real-type (if (eq type 'toggle) 'toggle 'radio))
+        (real-save (when save (if (eq save 'offer) 'offer 'always))))
+    ;; warn if type is not `radio' ot `toggle'; use `radio' if incorrect.
+    (unless (eq type real-type)
+      (warn (concat "TYPE should be symbols `radio' or `toggle', "
+                   "but %s found; using `radio'") type))
+    ;; warn if save is not `nil', `offer' or `always'; use nil when incorrect
+    (unless (eq save real-save)
+      (setq real-save nil)
+      (display-warning 'toolbarx
+                      (format (concat "SAVE should be symbols `nil', "
+                                      "`offer' or `always', but %s found; "
+                                      "using `nil'")
+                              save)))
+    ;; making the menu list of vectors
+    (dolist (str strings)
+      (setq count (1+ count))
+      (setq menu-callback (list 'progn
+                               (if (eq real-type 'radio)
+                                   `(setq ,var ,count)
+                                 `(if (memq ,count ,var)
+                                      (setq ,var (delete ,count ,var))
+                                    (setq ,var (sort (cons ,count ,var) '<))))
+                               '(toolbarx-refresh)))
+      (when (eq real-save 'always)
+       (setq menu-callback (append menu-callback
+                                   (list (list 'customize-save-variable
+                                               (list 'quote var) var)))))
+      (setq menu-item (vector str menu-callback
+                             :style real-type
+                             :selected (if (eq real-type 'radio)
+                                            `(eq ,var ,count)
+                                          `(memq ,count ,var))))
+      (setq menu (append menu (list menu-item))))
+    (when (eq real-save 'offer)
+      (setq menu (append menu (list "--:shadowEtchedInDash")))
+      (setq menu (append menu (list
+                              (vector
+                               "Save state of this menu"
+                               `(customize-save-variable (quote ,var)
+                                                         ,var))))))
+    ;; returnung the lambda-expression
+    `(lambda nil (interactive)
+       (let ((popup-menu-titles ,(if title t nil)))
+        (popup-menu (quote ,menu))))))
+
+(defun toolbarx-mount-popup-menu (strings var type &optional title save)
+  "Return a command that show a popup menu.
+The return is a `lambda'-expression with a interactive declaration.
+
+STRINGS is a list of strings which will be the itens of the menu.
+
+VAR is a symbol that is set when an item is clicked.  TYPE should
+be one of the symbols `radio' or `toggle': `radio' means that the
+nth item is selected if VAR is `n' and this item sets VAR to `n';
+`toggle' means that VAR should be a list of integers and the nth
+item is selected if `n' belongs to VAR.         The item inserts or
+deletes `n' from VAR.
+
+TITLE is a string (the title of the popup menu) or nil for no
+title.
+
+SAVE is one of the symbols nil, `offer' or `always'.  If value
+is nil, do not try to save anything.  If it is `offer', a menu
+item is added offering the user the possibiity to save state of
+that dropdown menu for future sesseions (using `custom').  If it
+is `always', state is saved every time that a item is clicked."
+  (if (featurep 'xemacs)
+      (toolbarx-xemacs-mount-popup-menu strings var type title save)
+    (toolbarx-emacs-mount-popup-menu strings var type title save)))
+
+(defun toolbarx-option-value (opt)
+  "Return option value according to Emacs flavour.
+If OPT is a vector, return first element if in Emacs or
+second if in XEmacs.  Otherwise, return OPT.
+If OPT is vector and length is smaller than the necessary (like
+if in XEmacs and vector has length 1), then nil is returned."
+  (if (vectorp opt)
+      (if (featurep 'xemacs)
+         (when (> (length opt) 1)
+           (aref opt 1))
+       (when (> (length opt) 0)
+         (aref opt 0)))
+    opt))
+
+(defun toolbarx-eval-function-or-symbol (object type-test-func)
+  "Return a cons cell (GOOD-OBJ . VAL).
+GOOD-OBJ non-nil means that VAL is a valid value, according to
+the car of the result of TYPE-TEST-FUNCTION, that should return a
+cons cell in the same format as the return of this function.
+
+If OBJECT applied to TYPE-TEST-FUNC return (GOOD-OBJ . VAL), and
+GOOD-OBJ is non-nil, return that.  Else, check if OBJECT is a
+function.  If so, evaluate and test again with TYPE-TEST-FUNC. If
+not a function or if GOOD-OBJ is again nil, test if OBJECT is a
+bound symbol, evaluate that and return the result of
+TYPE-TEST-FUNC."
+  (let* ((ret (funcall type-test-func object)))
+    (unless (car ret)
+      (if (functionp object)
+         (progn
+           (setq ret (funcall type-test-func (funcall object)))
+           (unless (car ret)
+             (when (and (symbolp object) (boundp object))
+               (setq ret (funcall type-test-func (symbol-value object))))))
+       ;; ok, obj is not function; try symbol
+       (when (and (symbolp object) (boundp object))
+         (setq ret (funcall type-test-func (symbol-value object))))))
+    ret))
+
+(defun toolbarx-test-image-type (obj)
+  "Return a cons cell (GOOD-OBJ . VAL).
+GOOD-OBJ is non-nil if OBJ yields a valid image object VAL (see
+documentation of function `toolbarx-process-symbol')."
+  (let ((toolbarx-test-image-type-simple
+        (lambda (img)
+          (let* ((val (toolbarx-option-value img))
+                 (all-obj-ok t)
+                 (good-obj
+                  (if (featurep 'xemacs)
+                      ;; if XEmacs
+                      (or (stringp val) ; a string
+                          (glyphp val)  ; or a glyph
+                          (and (symbolp val) ; or a symbol bound to a
+                               (boundp val)  ; glyph-list
+                               (check-toolbar-button-syntax
+                                (vector val
+                                        (lambda nil (interactive))
+                                        nil nil) t))
+                          (and (listp val) ; or a glyph-or-string list
+                               (> (length val) 0)
+                               (< (length val) 7)
+                               (dolist (i val all-obj-ok)
+                                 (setq all-obj-ok
+                                       (and all-obj-ok
+                                            (or (not i)
+                                                (stringp i)
+                                                (glyphp i)))))))
+                    ;; if Emacs
+                    (or (stringp val)    ; string
+                        (and (consp val) ; or image descriptor
+                             (eq (car val) 'image))
+                        (and (symbolp val) ; or a symbol bound to a
+                             (boundp val)  ; image descriptor
+                                           ; (defined with `defimage')
+                             (consp (eval val))
+                             (eq (car (eval val)) 'image))
+                        (and (listp val) ; or list with 4 strings or
+                                         ; image descriptors
+                             (= (length val) 4)
+                             (dolist (i val all-obj-ok)
+                               (setq all-obj-ok
+                                     (and all-obj-ok
+                                          (or (stringp i)
+                                              (and (consp i)
+                                                   (eq (car i)
+                                                       'image)))))))))))
+            (cons good-obj val)))))
+    (toolbarx-eval-function-or-symbol obj toolbarx-test-image-type-simple)))
+
+(defun toolbarx-test-button-type (obj)
+  "Return a cons cell (GOOD-OBJ . VAL).
+GOOD-OBJ is non-nil if OBJ yields a valid button object VAL (see
+documentation of function `toolbarx-process-symbol')."
+  (let ((toolbarx-test-button-type-simple
+        (lambda (but)
+          (let* ((val (toolbarx-option-value but))
+                 (good-obj (if (featurep 'xemacs)
+                               ;; if XEmacs
+                               t
+                             ;; if Emacs
+                             (and (consp val)
+                                  (memq (car val) '(:toggle :radio))))))
+            (cons good-obj val)))))
+    (toolbarx-eval-function-or-symbol obj toolbarx-test-button-type-simple)))
+
+(defun toolbarx-test-any-type (obj)
+  "Return a cons cell (t . VAL).
+If OBJ is vector, return VAL according to editor.  Else, return
+OBJ, because it is a form anyway."
+  (cons t (toolbarx-option-value obj)))
+
+(defun toolbarx-test-string-or-nil (obj)
+  "Return a cons cell (GOOD-OBJ . VAL).
+GOOD-OBJ is non-nil if OBJ yields a valid help object VAL (see
+documentation of function `toolbarx-process-symbol')."
+  (let ((toolbarx-test-string-or-nil-simple
+        (lambda (obj)
+          (let* ((val (toolbarx-option-value obj))
+                 (good-obj (or (stringp val)
+                               (not val))))
+            (cons good-obj val)))))
+    (toolbarx-eval-function-or-symbol obj toolbarx-test-string-or-nil-simple)))
+
+(defun toolbarx-test-toolbar-type (obj)
+  "Return a cons cell (GOOD-OBJ . VAL).
+GOOD-OBJ is non-nil if OBJ yields a valid toolbar property object
+VAL (see documentation of function `toolbarx-process-symbol')."
+  (let ((toolbarx-test-toolbar-type-simple
+        (lambda (obj)
+          (let* ((val (toolbarx-option-value obj))
+                 (all-but-def-opts '(top bottom left right))
+                 (all-opts '(default top bottom left right))
+                 (good-obj
+                  (if (featurep 'xemacs)
+                      ;; if XEmacs
+                      (if (symbolp val)
+                          (memq val all-opts)
+                        (and (consp val)
+                             (memq (car val) all-but-def-opts)
+                             (memq (cdr val) all-but-def-opts)))
+                    ;; if Emacs
+                    t)))
+            (cons good-obj val)))))
+    (toolbarx-eval-function-or-symbol obj toolbarx-test-toolbar-type-simple)))
+
+(defun toolbarx-test-dropdown-type (obj)
+  "Return a cons cell (GOOD-OBJ . VAL).
+GOOD-OBJ is non-nil if OBJ yields a valid `:type' property object
+VAL of a dropdown group (see documentation of function
+`toolbarx-process-dropdown-group'."
+  (let ((toolbarx-test-dropdown-type-simple
+        (lambda (obj)
+          (let* ((val (toolbarx-option-value obj))
+                 (good-obj (memq val '(radio toggle))))
+            (cons good-obj val)))))
+    (toolbarx-eval-function-or-symbol obj toolbarx-test-dropdown-type-simple)))
+
+(defun toolbarx-test-symbol (obj)
+  "Return a cons cell (GOOD-OBJ . VAL).
+GOOD-OBJ is non-nil if OBJ yields a valid `:variable' property
+object VAL of a dropdown group (see documentation of function
+`toolbarx-process-dropdown-group'."
+  (let ((toolbarx-test-symbol-simple
+        (lambda (obj)
+          (let* ((val (toolbarx-option-value obj))
+                 (good-obj (symbolp val)))
+            (cons good-obj val)))))
+    (toolbarx-eval-function-or-symbol obj toolbarx-test-symbol-simple)))
+
+(defun toolbarx-test-dropdown-default (obj)
+  "Return a cons cell (GOOD-OBJ . VAL).
+GOOD-OBJ is non-nil if OBJ yields a valid `:default' property
+object VAL of a dropdown group (see documentation of function
+`toolbarx-process-dropdown-group'."
+  (let ((toolbarx-test-dropdown-default-simple
+        (lambda (obj)
+          (let* ((val (toolbarx-option-value obj))
+                 (good-obj (or (integerp val)
+                               (and (listp val)
+                                    (let ((ok t))
+                                      (dolist (i val ok)
+                                        (setq ok (and ok (integerp i)))))))))
+            (cons good-obj val)))))
+    (toolbarx-eval-function-or-symbol obj
+                                     toolbarx-test-dropdown-default-simple)))
+
+(defun toolbarx-test-dropdown-save (obj)
+  "Return a cons cell (GOOD-OBJ . VAL).
+GOOD-OBJ is non-nil if OBJ yields a valid `:save' property
+object VAL of a dropdown group (see documentation of function
+`toolbarx-process-dropdown-group'."
+  (let ((toolbarx-test-dropdown-save-simple
+        (lambda (obj)
+          (let* ((val (toolbarx-option-value obj))
+                 (good-obj (memq val '(nil offer always))))
+            (cons good-obj val)))))
+    (toolbarx-eval-function-or-symbol obj toolbarx-test-dropdown-save-simple)))
+
+(defconst toolbarx-button-props
+  (let* ((props-types-alist
+         '((:image           toolbarx-test-image-type)
+           (:command         toolbarx-test-any-type)
+           (:enable          toolbarx-test-any-type)
+           (:visible         toolbarx-test-any-type)
+           (:help            toolbarx-test-string-or-nil)
+           (:insert          toolbarx-test-any-type       . and)
+           (:toolbar         toolbarx-test-toolbar-type)
+           (:button          toolbarx-test-button-type)
+           (:append-command  toolbarx-test-any-type       . progn)
+           (:prepend-command toolbarx-test-any-type       . progn)))
+        (possible-props (nreverse (let* ((props ()))
+                                    (dolist (p props-types-alist props)
+                                      (setq props (cons (car p) props))))))
+        (props-override (nreverse (let* ((props ()))
+                                    (dolist (p props-types-alist props)
+                                      (unless (cddr p)
+                                        (setq props (cons (car p) props)))))))
+        (props-add (nreverse (let* ((props ()))
+                               (dolist (p props-types-alist props)
+                                 (when (cddr p)
+                                   (setq props (cons (car p) props))))))))
+    (list props-types-alist possible-props props-override props-add))
+  "List yielding all encarnations of properties of a button.
+First element: alist, where each element is of form
+ (PROP . (TYPE-TEST-FUNCTION . ADD-OR-NIL))
+Second is a list with all properties.
+Third, a list with properties that override when merging.
+Fourth, a list of lists, each in the format (PROP ADD).")
+
+(defconst toolbarx-dropdown-props
+  ;; for naming dropdown properties see `Convention' in the doc string
+  (let* ((props-types-alist
+         '((:type                     toolbarx-test-dropdown-type)
+           (:variable                 toolbarx-test-symbol)
+           (:default                  toolbarx-test-dropdown-default)
+           (:save                     toolbarx-test-dropdown-save)
+           (:title                    toolbarx-test-string-or-nil)
+           (:dropdown-image           toolbarx-test-image-type)
+           (:dropdown-enable          toolbarx-test-any-type)
+           (:dropdown-visible         toolbarx-test-any-type)
+           (:dropdown-insert          toolbarx-test-any-type       . and)
+           (:dropdown-help            toolbarx-test-string-or-nil)
+           (:dropdown-toolbar         toolbarx-test-toolbar-type)
+           (:dropdown-append-command  toolbarx-test-any-type       . progn)
+           (:dropdown-prepend-command toolbarx-test-any-type       . progn)))
+        (possible-props (nreverse (let* ((props ()))
+                                    (dolist (p props-types-alist props)
+                                      (setq props (cons (car p) props))))))
+        (props-override (nreverse (let* ((props ()))
+                                    (dolist (p props-types-alist props)
+                                      (unless (cddr p)
+                                        (setq props (cons (car p) props)))))))
+        (props-add (nreverse (let* ((props ()))
+                               (dolist (p props-types-alist props)
+                                 (when (cddr p)
+                                   (setq props (cons (car p) props))))))))
+    (list props-types-alist possible-props props-override props-add))
+  "List yielding all encarnations of properties of a dropdown group.
+First element: alist, where each element is of form
+ (PROP . (TYPE-TEST-FUNCTION . ADD-OR-NIL))
+Second is a list with all properties.
+Third, a list with properties that override when merging.
+Fourth, a list of lists, each in the format (PROP ADD).
+
+Convention: properties for the dropdown button should be formed
+with the strings \":dropdown-\" with the button property name
+without `:'. This is used on the implementation.")
+
+(defun toolbarx-process-group-without-insert (group-without-props
+                                             merged-props-without-insert
+                                             meaning-alist switches)
+  "Return an updated version of SWITCHES.
+GROUP-WITHOUT-PROPS and MERGED-PROPS-WITHOUT-INSERT are
+preprocessed variables in `toolbarx-process-group'."
+  (let ((current-switches switches))
+    (dolist (i group-without-props current-switches)
+      (setq i (toolbarx-option-value i))
+      (if (symbolp i)
+         (setq current-switches
+               (toolbarx-process-symbol i meaning-alist
+                                        merged-props-without-insert
+                                        current-switches))
+       (when (listp i)
+         (setq current-switches
+               (toolbarx-process-group i meaning-alist
+                                       merged-props-without-insert
+                                       current-switches)))))))
+
+(defun toolbarx-process-group (group meaning-alist props switches)
+  "Return an updated version of SWITCHES.
+Append to already processed buttons (stored in SWITCHES) a
+processed version of GROUP.  Groups are useful to distribute
+properties.  External properties are given in PROPS, and merged
+with the internal properties that are in the end of GROUP.  If
+properties (after merge) contain a `:insert' property, return a
+list where the first and second elements are `:insert' and its
+value, and after that a list in the same format as SWITCHES."
+  (cond
+   ;; if DROPDOWN group
+   ((eq (car group) :dropdown-group)
+    (toolbarx-process-dropdown-group group meaning-alist props switches))
+   ;; if EVAL group
+   ((eq (car group) :eval-group)
+    (let ((current-switches switches))
+      (dolist (elt (cdr group) current-switches)
+       (let ((eval-elt (eval elt)))
+         (setq current-switches
+               (toolbarx-process-group (if (listp eval-elt)
+                                           eval-elt
+                                         (list eval-elt))
+                                       meaning-alist props
+                                       current-switches))))))
+   ;; if normal group
+   (t
+    (let* ((splited-props
+           (toolbarx-separate-options
+            group (append (nth 1 toolbarx-button-props)
+                          (nth 1 toolbarx-dropdown-props))))
+          (intern-props (cdr splited-props))
+          (group-without-props (car splited-props))
+          (merged-props
+           (toolbarx-merge-props intern-props props
+                                 (append (nth 2 toolbarx-button-props)
+                                         (nth 2 toolbarx-dropdown-props))
+                                 (append (nth 3 toolbarx-button-props)
+                                         (nth 3 toolbarx-dropdown-props)))))
+      ;; check whether merged props have an `:insert'
+      (if (memq :insert merged-props)
+         ;; if yes, prepend switches with a (:insert cond elements)
+         (let* ((memq-ins (memq :insert merged-props))
+                (ins-val (if (and (listp (cadr memq-ins))
+                                  (eq :add-value-list
+                                      (car (cadr memq-ins))))
+                             ;; if property is add-value property
+                             (let* ((p (assq
+                                        :insert
+                                        (nth 0 toolbarx-button-props)))
+                                    (add-list (list (cddr p)))
+                                    (prop-good-val))
+                               (dolist (val (cdr (cadr memq-ins)))
+                                 (setq prop-good-val (funcall (cadr p) val))
+                                 (when (car prop-good-val)
+                                   (setq add-list (cons (cdr prop-good-val)
+                                                        add-list))))
+                               ;; return: (nreverse add-list)
+                               (setq add-list (nreverse add-list))
+                               (if (eq 2 (length add-list))
+                                   (cadr add-list) ; just 1 value, no
+                                 add-list))        ; add-function
+                           ;; if property is not add-value
+                           (cadr memq-ins)))
+                (merged-props-without-insert
+                 (append (butlast merged-props (length memq-ins))
+                         (cddr memq-ins)))
+                (group-switches
+                 (toolbarx-process-group-without-insert
+                  group-without-props merged-props-without-insert
+                  meaning-alist nil)))
+           ;; return
+           (nreverse (cons (append (list :insert ins-val)
+                                   group-switches)
+                           (nreverse switches))))
+       ;; if not, just append what is processed to switches
+       (toolbarx-process-group-without-insert group-without-props
+                                              merged-props meaning-alist
+                                              switches))))))
+
+(defun toolbarx-process-symbol (symbol meaning-alist props switches)
+  "Process a button given by SYMBOL in MEANING-ALIST.
+The processed button is appended in SWITCHES, which is returned.
+Look for a association of SYMBOL in MEANING-ALIST for collecting
+properties.  Such association is a list that represents either a
+normal button (a description of the button) or an alias
+group (the symbol is an alias for a group of buttons). PROPS is
+a externel list of properties that are merged and then applied to
+the button.  Scope is given by GLOBAL-FLAG."
+  ;; there are 3 situations: symbol is :new-line, there is an alias group
+  ;; or a normal button
+  (let ((button-assq (cdr (assq symbol meaning-alist))))
+    (cond
+     ((eq (car button-assq) :alias)
+      ;; button association is ALIAS GROUP is passed to
+      ;; `toolbarx-process-group' as is but without the car.
+      ;; return: (toolbarx-process-group... returns updates switch
+      (toolbarx-process-group (cdr button-assq) meaning-alist props switches))
+     (t
+      ;; NORMAL BUTTON (association is a list of properties)
+      ;;
+      ;; properties need to be processed, that is, merge internal
+      ;; and external (given by PROPS) properties
+      (let* (;; button properties defined in `toolbarx-button-props'
+            (props-override    (nth 2 toolbarx-button-props))
+            (props-add         (nth 3 toolbarx-button-props))
+            ;; split considering also dropdown-group properties
+            (button-assq-split
+             (toolbarx-separate-options
+              button-assq
+              (append (nth 1 toolbarx-button-props)
+                      (nth 1 toolbarx-dropdown-props))))
+            (button-split-no-props (car button-assq-split))
+            (button-split-props (cdr button-assq-split))
+            ;; if there is no :image or :command in the props,
+            ;; try to get them from no-props part
+            (button-image-no-prop
+             (unless (memq :image button-split-props)
+               (when (> (length button-split-no-props) 0)
+                 (list :image (nth 0 button-split-no-props)))))
+            (button-command-no-prop
+             (unless (memq :command button-split-props)
+               (when (> (length button-split-no-props) 1)
+                 (list :command (nth 1 button-split-no-props)))))
+            (button-props (append button-split-props
+                                  button-image-no-prop
+                                  button-command-no-prop))
+            ;; merge props
+            (merged-props (toolbarx-merge-props button-props props
+                                                props-override
+                                                props-add)))
+       ;; return:
+       (nreverse (cons (cons symbol merged-props) (nreverse switches))))))))
+
+(defun toolbarx-process-dropdown-group (dropdown meaning-alist props switches)
+  "Process buttons that appear according to dropdown menu.
+Process a dropdown group DROPDOWN with meaning alist
+MEANING-ALIST, external property list PROP and GLOBAL-FLAG
+specifying scope. For a complete description, see documentation
+of `toolbarx-install-toolbar'. The processed buttons are stored
+in the end of SWITCHES, which is returned."
+  (let* ((dropdown-group (if (eq (car dropdown) :dropdown-group)
+                            (cdr dropdown)
+                          dropdown))
+        (dropdown-list-splited
+         (toolbarx-separate-options dropdown-group
+                                    (append
+                                     (nth 1 toolbarx-button-props)
+                                     (nth 1 toolbarx-dropdown-props))))
+        (dropdown-list  (car dropdown-list-splited))
+        (dropdown-props (cdr dropdown-list-splited))
+        (merged-props
+         (toolbarx-merge-props dropdown-props props
+                               (append (nth 2 toolbarx-button-props)
+                                       (nth 2 toolbarx-dropdown-props))
+                               (append (nth 3 toolbarx-button-props)
+                                       (nth 3 toolbarx-dropdown-props))))
+        (merged-props-button-only
+         (let* ((props-button-only)
+                (prop))
+           (dolist (p (nth 1 toolbarx-button-props) props-button-only)
+             (setq prop (memq p merged-props))
+             (when prop
+               (setq props-button-only
+                     (append (list p (cadr prop))
+                             props-button-only))))))
+        (merged-props-dropdown-only
+         (let* ((props-dropdown-only)
+                (prop))
+           (dolist (p (nth 1 toolbarx-dropdown-props) props-dropdown-only)
+             (setq prop (memq p merged-props))
+             (when prop
+               (setq props-dropdown-only
+                     (append (list p (cadr prop))
+                             props-dropdown-only))))))
+        ;; get value for each property and check type ONLY for props that do
+        ;; not concern the dropdown button, like `:type', `:save', etc. The
+        ;; props that concern the button are going to be handled in refresh
+        ;; time.
+        (filtered-dropdown-group-props-only
+         (let* ((filtered-props-temp)
+                (prop-good-val)
+                (prop))
+           (save-match-data
+             (dolist (p (nth 0 toolbarx-dropdown-props) filtered-props-temp)
+               (unless (string-match "^:dropdown-.*$"
+                                     (symbol-name (car p)))
+                 ;;    property           -> (car p)
+                 ;;    test type function -> (cadr p)
+                 (setq prop (memq (car p) merged-props-dropdown-only))
+                 ;; if so, check if value is of correct type
+                 (when prop
+                   (setq prop-good-val (funcall (cadr p) (cadr prop)))
+                   (if (car prop-good-val)
+                       (setq filtered-props-temp
+                             (append filtered-props-temp
+                                     (list (car p) (cdr prop-good-val))))
+                     (display-warning
+                      'toolbarx
+                      (format (concat "Wrong type for value in "
+                                      "property `%s' in dropdown group")
+                              (car p))))))))))
+        ;; properties for the dropdown button from dropdown merged properties
+        (dropdown-button-props
+         (let* ((props))
+           (save-match-data
+             (dolist (pr (nth 1 toolbarx-dropdown-props))
+               (when (and (memq pr merged-props-dropdown-only)
+                          (string-match "^:dropdown-\\(.*\\)$"
+                                        (symbol-name pr)))
+                 (let* ((new-pr (intern (concat ":"
+                                                (substring (symbol-name pr)
+                                                           (match-beginning 1)
+                                                           (match-end 1)))))
+                        (val (cadr (memq pr merged-props-dropdown-only))))
+                   (setq props (append (list new-pr val) props))))))
+           (unless (memq :image props)
+             (setq props (append (list :image "dropdown") props)))
+           props))
+        (dropdown-button-without-command
+         (cons 'dropdown dropdown-button-props))
+        ;; `:type' defaults to `radio'
+        (type (if (memq :type filtered-dropdown-group-props-only)
+                  (cadr (memq :type filtered-dropdown-group-props-only))
+                'radio))
+        ;; `:default' defaults to 1 or nil depending on `type'
+        ;; if type is toggle and default is not a list, but a
+        ;; integer, set as the list with integer
+        (default
+          (let* ((memq-default (memq :default
+                                     filtered-dropdown-group-props-only))
+                 (def-temp (cadr memq-default))
+                 (default-temp (if memq-default
+                                   def-temp
+                                 (if (eq type 'radio) 1 (list 1)))))
+            default-temp))
+        ;; `:save' defaults to nil and require `:variable'
+        (save (let* ((save-temp
+                      (when (memq :save filtered-dropdown-group-props-only)
+                        (cadr (memq :save
+                                    filtered-dropdown-group-props-only)))))
+                (if (and save-temp
+                         (not (memq :variable
+                                    filtered-dropdown-group-props-only)))
+                    (progn
+                      (display-warning
+                       'toolbarx
+                       (concat "`:save' property with non-nil value should "
+                               "be used only with the `:variable' property; "
+                               "using value nil for `:save'."))
+                      nil)
+                  save-temp)))
+        ;; `:title' defaults to nil
+        (title (when (memq :title filtered-dropdown-group-props-only)
+                 (cadr (memq :title filtered-dropdown-group-props-only))))
+        ;; the menu variable is buildt from the `:variable' option or
+        ;; make a symbol not used
+        (variable (if (memq :variable filtered-dropdown-group-props-only)
+                      (cadr (memq :variable
+                                  filtered-dropdown-group-props-only))
+                    (let* ((count 0)
+                           (symb (intern (format
+                                          "toolbarx-internal-menu-var-%d"
+                                          count))))
+                      (while (boundp symb)
+                        (setq count (1+ count))
+                        (setq symb
+                              (intern (format "toolbarx-internal-menu-var-%d"
+                                              count))))
+                      symb)))
+        ;; auxiliary variables
+        (list-strings)
+        (list-buttons))
+    ;; setting `variable'
+    (if save
+       (custom-declare-variable
+        variable default
+        "Used as variable of dropdown menu defined with `toolbarx'.")
+      (when (not (boundp variable))
+       (set variable default)))
+    ;; now check `variable' content
+    (set variable
+        (let ((val (eval variable)))
+          (if (eq type 'toggle)
+              (if (listp val)
+                  val
+                (if (integerp val)
+                    (list val)
+                  (list 1)))
+            ;; then, type is radio
+            (if (integerp val)
+                val
+              (if (and val
+                       (listp val)
+                       (integerp (car val)))
+                  (car val)
+                1)))))
+    ;; === buiding `list-strings' and `list-buttons' ===
+    ;; if only symbols, build `list-strings' and `list-buttons' from symbols
+    (if (let ((only-symbols-flag t))
+         (dolist (i dropdown-list only-symbols-flag)
+           (setq only-symbols-flag (and only-symbols-flag (symbolp i)))))
+       (let ((count 0))
+         (dolist (i dropdown-list)
+           ;; list-strings and list-buttons are buildt reversed
+           (setq list-strings (cons (toolbarx-make-string-from-symbol i)
+                                    list-strings))
+           (setq count (1+ count))
+           (setq list-buttons (cons (list i
+                                          :insert
+                                          (if (eq type 'radio)
+                                              (list 'eq count variable)
+                                            (list 'memq count variable)))
+                                    list-buttons))))
+      ;; if not, the it must start with string
+      (unless (stringp (car dropdown-list))
+       (error "%s %s %s"
+              "If not all itens on dropdown are symbols, then a string"
+              "must come before each set of buttons; no string found"
+              "in first position."))
+      (let ((count 0)
+           (elem)
+           (temp-list-buttons))
+       (while dropdown-list
+         (setq elem (car dropdown-list))
+         (setq dropdown-list (cdr dropdown-list))
+         (if (stringp elem)
+             ;; if string, output `temp-list-buttons' and prepair it again
+             (progn
+               ;; list-strings and list-buttons are buildt reversed
+               (setq list-strings (cons elem list-strings))
+               (when temp-list-buttons
+                 (setq list-buttons (cons (append (nreverse temp-list-buttons)
+                                                  (list :insert
+                                                        (if (eq type 'radio)
+                                                            (list 'eq count
+                                                                  variable)
+                                                          (list 'memq count
+                                                                variable))))
+                                          list-buttons)))
+               (setq temp-list-buttons nil)
+               (setq count (1+ count)))
+           ;; else, if not string, just insert it to `temp-list-buttons'
+           ;; which is also buildt reversed
+           (setq temp-list-buttons (cons elem temp-list-buttons))))
+       ;; output last temp list, left behind
+       (when temp-list-buttons
+         (setq list-buttons (cons (append (nreverse
+                                           temp-list-buttons)
+                                          (list
+                                           :insert (if (eq type 'radio)
+                                                       (list 'eq count
+                                                             variable)
+                                                     (list 'memq count
+                                                           variable))))
+                                  list-buttons)))))
+    ;; lists were made reversed (elements inserted at the beginning)
+    (setq list-strings (nreverse list-strings))
+    (setq list-buttons (nreverse list-buttons))
+    ;; now, pass `list-buttons' as a group to `toolbarx-process-group'
+    (let ((current-switches switches))
+      (setq current-switches
+           (toolbarx-process-group list-buttons meaning-alist
+                                   merged-props ; pass non-processed props
+                                   current-switches))
+      (setq current-switches
+           ;; outputing dropdown button
+           (toolbarx-process-group (append dropdown-button-without-command
+                                           (list :command
+                                                 (toolbarx-mount-popup-menu
+                                                  list-strings variable type
+                                                  title save)))
+                                   meaning-alist merged-props-button-only
+                                   switches))
+      current-switches)))
+
+
+
+;; Still functions `toolbarx-install-toolbar' and `toolbarx-refresh'to
+;; complete the parsing engine.         Since they interface with other engines,
+;; they must come in the end.
+
+;;; How a image is made, giving a string as (part of) file name.
+
+;; look at function `image-type-available-p' for Emacs !!!!
+
+(defun toolbarx-find-image (image)
+  "Return image descriptor or glyph for IMAGE.
+In Emacs, return an image descriptor for IMAGE.  In XEmacs,
+return a glyph.
+
+IMAGE is string.  Usually IMAGE neither contains a directory nor
+an extension.  If the extension is omitted, `xpm', `xbm' and
+`pbm' are tried.  If the directory is omitted,
+`toolbarx-image-path' is searched."
+  ;; `find-image' in Emacs 21 looks in `load-path' and `data-directory'.  In
+  ;; Emacs 22, we have `image-load-path' which includes `load-path' and
+  ;; `data-directory'.
+  ;;
+  ;; If there's some API in XEmacs to find the images, we should use it
+  ;; instead of locate-library.
+  ;;
+  ;; Emacs 22 has locate-file, but the other Emacsen don't.  The
+  ;; following should hopefully get us to all images ultimately.
+
+  (let ((file))
+    (dolist (i '("" ".xpm" ".xbm" ".pbm"))
+      (unless file
+       (setq file (locate-library (concat image i) t toolbarx-image-path))))
+    (if (featurep 'xemacs)
+       (and file (make-glyph file))
+      (if file
+         (create-image file)
+       (find-image `((:type xpm :file ,(concat image ".xpm"))
+                     (:type xbm :file ,(concat image ".xbm"))
+                     (:type pbm :file ,(concat image ".pbm"))))))))
+
+;; next variable interfaces between parsing and display engines
+(defvar toolbarx-internal-button-switches nil
+  "Store the list of processed buttons, used by `toolbarx-refresh'.
+This variable can store different values for the different buffers.")
+
+\f
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Second engine: display parsed buttons in Emacs
+
+(defun toolbarx-emacs-add-button (button used-keys keymap)
+  "Insert a button where BUTTON is its description.
+USED-KEYS should be a list of symbols, where the first element is
+`:used-symbols'.  This list should store the symbols of the
+buttons already inserted.  This list is changed by side effect.
+KEYMAP is the keymap where the menu-item corresponding to the
+tool-bal button is going to be inserted.  Insertion is made in
+the end of KEYMAP.
+
+BUTTON should be a list of form (SYMBOL . PROP-LIST).  SYMBOL is
+a symbol that \"names\" this button.  PROP-LIST is a list in the
+format (PROP VAL ... PROP VAL).         The supported properties are
+`:image', `:command', `:append-command', `:prepend-command',
+`:help', `:enable', `:visible', `:button', `:insert' and
+`:toolbar'. For a description of properties, see documentation of
+function `toolbar-install-toolbar'."
+  (let* ((symbol (nth 0 button))
+        (used-keys-list (when used-keys
+                          (cdr used-keys)))
+        (filtered-props
+         (let* ((filtered-props-temp)
+                (prop-good-val)
+                (prop))
+           (dolist (p (nth 0 toolbarx-button-props) filtered-props-temp)
+             ;;    property           -> (car p)
+             ;;    test type function -> (cadr p)
+             ;;    add-function       -> (cddr p)
+             (setq prop (memq (car p) button))
+             ;; if so, check if value is of correct type
+             (when prop
+               ;; if property is of add-type, them the value is a list
+               ;; (:add-value-list VAL VAL). Each VAL should be checked.
+               (if (and (cddr p) (eq :add-value-list (car (cadr prop))))
+                   (let* ((add-list (list (cddr p))))
+                     (dolist (val (cdr (cadr prop)))
+                       (setq prop-good-val (funcall (cadr p) val))
+                       (when (car prop-good-val)
+                         (setq add-list (cons (cdr prop-good-val) add-list))))
+                     (setq add-list (nreverse add-list))
+                     (when (eq 2 (length add-list)) ; just 1 value, no
+                                                    ; add-function
+                       (setq add-list (cadr add-list)))
+                     (setq filtered-props-temp (append
+                                                (list (car p) add-list)
+                                                filtered-props-temp)))
+                 ;; if override-property
+                 (setq prop-good-val (funcall (cadr p) (cadr prop)))
+                 (when (car prop-good-val)
+                   (setq filtered-props-temp (append
+                                              (list (car p)
+                                                    (cdr prop-good-val))
+                                              filtered-props-temp))))))))
+        (insert (or (not (memq :insert filtered-props))
+                    ;; (memq :insert filtered-props)
+                    (eval (nth 1 (memq :insert filtered-props))))))
+    (when insert
+      (cond
+       (t
+       ;; symbol is not :new-line, therefore a normal button
+       (let* ((image (cadr (memq :image filtered-props)))
+              (image-descriptor
+               (when (memq :image filtered-props)
+                 (cond
+                  ((stringp image)     ; string
+                   (toolbarx-find-image image))
+                  ((and (consp image)  ; or image descriptor
+                        (eq (car image) 'image))
+                   image)
+                  ((and (symbolp image) ; or a symbol bound to a
+                        (boundp image)  ; image descriptor (defined
+                                      ; with `defimage')g
+                        (consp (eval image))
+                        (eq (car (eval image)) 'image))
+                   (eval image))
+                  (t                   ; otherwise, must be a list
+                                       ; with 4 strings or image
+                                       ; descriptors
+                   (apply 'vector (mapcar (lambda (img)
+                                             (if (stringp img)
+                                                 (toolbarx-find-image img)
+                                               img))
+                                          image))))))
+              (command
+               (let* ((com (nth 1 (memq :command filtered-props)))
+                      (app (nth 1 (memq :append-command filtered-props)))
+                      (prep (nth 1 (memq :prepend-command filtered-props))))
+                 (when (or com app prep)
+                   (toolbarx-make-command com prep app))))
+              (help (cons (memq :help filtered-props)
+                          (cadr (memq :help filtered-props))))
+              (enable (cons (memq :enable filtered-props)
+                            (cadr (memq :enable filtered-props))))
+              (visible (cons (memq :visible filtered-props)
+                             (cadr (memq :visible filtered-props))))
+              (button (cons (memq :button filtered-props)
+                            (cadr (memq :button filtered-props))))
+              (menuitem (append
+                         (list 'menu-item
+                               (toolbarx-make-string-from-symbol symbol)
+                               command
+                               :image image-descriptor)
+                         (when (car help)
+                           (list :help (cdr help)))
+                         (when (car enable)
+                           (list :enable (cdr enable)))
+                         (when (car visible)
+                           (list :visible (cdr visible)))
+                         (when (car button)
+                           (list :button (cdr button)))))
+              (key-not-used
+               (let* ((count 0)
+                      (symb symbol))
+                 (while (memq symb used-keys-list)
+                   (setq count (1+ count))
+                   (setq symb (intern (format "%s-%d" symbol count))))
+                 symb)))
+         (when (and image-descriptor command)
+           (setq used-keys-list (cons key-not-used used-keys-list))
+           (define-key-after keymap
+             (vector key-not-used) menuitem))))))
+    (when used-keys (setcdr used-keys used-keys-list))))
+
+
+(defun toolbarx-emacs-refresh-process-button-or-insert-list (switches
+                                                            used-keys
+                                                            keymap)
+  "Process SWITCHES, inserting buttons in `tool-bar-map'.
+If a button is actually a `:insert' clause group (if `car' is
+`:insert') and evaluation of `cdr' yields non-nil, process `cddr'
+recursively as SWITCHES.  USED-KEYS is a list which `car' is
+`:used-symbols' and which `cdr' is a list of symbols that have already
+been used as keys in the keymap `tool-bar-map'."
+  (dolist (button switches)
+    (if (eq (car button) :insert)
+       (when (eval (cadr button))
+         (toolbarx-emacs-refresh-process-button-or-insert-list (cddr button)
+                                                               used-keys
+                                                               keymap))
+      (toolbarx-emacs-add-button button used-keys keymap))))
+
+
+
+(defun toolbarx-emacs-refresh (&optional global-flag)
+  "Refresh and redraw the toolbar in Emacs.
+If GLOBAL-FLAG is non-nil, the default value of toolbar switches
+is used and the default value of `toolbarx-map' is changed."
+  (let* ((switches (if global-flag
+                      (if (default-boundp 'toolbarx-internal-button-switches)
+                          (default-value 'toolbarx-internal-button-switches)
+                        toolbarx-internal-button-switches)
+                    toolbarx-internal-button-switches))
+        (used-keys (list :used-symbols nil))
+        (tool-bar-map-temp (make-sparse-keymap)))
+    (toolbarx-emacs-refresh-process-button-or-insert-list switches used-keys
+                                                         tool-bar-map-temp)
+    (if global-flag
+       (setq-default tool-bar-map tool-bar-map-temp)
+      (setq tool-bar-map tool-bar-map-temp))))
+
+\f
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Third engine: display parsed buttons in XEmacs
+
+(defun toolbarx-xemacs-image-properties (image)
+  "Return a list of properties of IMAGE.
+IMAGE should be a string or a list of one to six strings or
+glyphs or nil, or a symbol bound to a list of one to six
+glyphs (them must be a valid image list, like one created with
+the function `toolbar-make-button-list').  Return a
+list (GLYPH-LIST HEIGHT WIDTH) where HEIGHT (resp. WIDTH) is the
+maximum of the heights (resp. widths) of all glyphs (or strings
+converted to glyphs) in GLYPH-LIST.  If IMAGE is not a list, it
+is treated as a list with IMAGE as only element.  Strings are
+converted to glyphs with the function `toolbarx-find-image'.  If,
+after possible string-to-glyph convertions, the list of glyphs
+has nil as first element, GLYPH-LIST becomes nil."
+  (let* ((glyph-list
+         (if (symbolp image)           ; if symbol, them must be a
+                                       ; valid image list, like
+                                       ; created by function
+                                       ; `toolbar-make-button-list'
+             (eval image)
+           (let ((img-list (if (listp image)
+                               image
+                             (list image)))
+                 (glyph-list-temp))
+             ;; glyph-list-temp
+             (setq glyph-list-temp
+                   (dolist (glyph img-list (nreverse glyph-list-temp))
+                     (if (stringp glyph)
+                         (setq glyph-list-temp
+                               (cons (toolbarx-find-image glyph)
+                                     glyph-list-temp))
+                       (setq glyph-list-temp (cons glyph glyph-list-temp)))))
+             (unless (car glyph-list-temp)
+               (setq glyph-list-temp nil))
+             glyph-list-temp)))
+        (usable-buttons
+         ;; computing inheritage
+         (let* ((usable-temp))
+           (if toolbar-captioned-p     ; problematic point :-(
+               (progn
+                 ;; CAP-UP:  cap-up -> up
+                 (setq usable-temp (cons (cond
+                                          ((nth 3 glyph-list))
+                                          ((nth 0 glyph-list)))
+                                         usable-temp))
+                 ;; CAP-DOWN:  cap-down -> cap-up -> down -> up
+                 (setq usable-temp (cons (cond
+                                          ((nth 4 glyph-list))
+                                          ((nth 3 glyph-list))
+                                          ((nth 1 glyph-list))
+                                          ((nth 0 glyph-list)))
+                                         usable-temp))
+                 ;; CAP-DISABLED:  cap-disabled -> cap-up -> disabled -> up
+                 (setq usable-temp (cons (cond
+                                          ((nth 5 glyph-list))
+                                          ((nth 3 glyph-list))
+                                          ((nth 2 glyph-list))
+                                          ((nth 0 glyph-list)))
+                                         usable-temp)))
+             ;; UP:  up
+             (setq usable-temp (cons (nth 0 glyph-list) usable-temp))
+             ;; DOWN:  down -> up
+             (setq usable-temp (cons (cond
+                                      ((nth 1 glyph-list))
+                                      ((nth 0 glyph-list)))
+                                     usable-temp))
+             ;; DISABLED:  disabled -> up
+             (setq usable-temp (cons (cond
+                                      ((nth 2 glyph-list))
+                                      ((nth 0 glyph-list)))
+                                     usable-temp)))
+           usable-temp))
+        (height (apply 'max 0 (mapcar (lambda (glyph)
+                                        (if glyph
+                                            (glyph-height glyph)
+                                          0))
+                                      usable-buttons)))
+        (width (apply 'max 0 (mapcar (lambda (glyph)
+                                       (if glyph
+                                           (glyph-width glyph)
+                                         0))
+                                     usable-buttons))))
+    (list (if (symbolp image) image glyph-list) height width)))
+
+
+
+(defun toolbarx-xemacs-button-properties (button)
+  "Return a list of properties of BUTTON.
+The result is either nil (if not to be inserted) or a list in the format
+ (TOOLBAR HEIGHT WIDTH BUTTON-DESCRIPTION)
+where
+
+TOOLBAR is one of the symbols `default', `top', `right', `bottom'
+  or `left'.
+
+HEIGHT and WIDTH are the maximal dimentions of all the glyphs
+  involved.
+
+BUTTON-DESCRIPTION is button definition in XEmacs; see the
+  documentation of variable `default-toolbar'."
+  (let* ((filtered-props
+         (let* ((filtered-props-temp)
+                (prop-good-val)
+                (prop))
+           (dolist (p (nth 0 toolbarx-button-props) filtered-props-temp)
+             ;;    property           -> (car p)
+             ;;    test type function -> (cadr p)
+             ;;    add-function       -> (cddr p)
+             (setq prop (memq (car p) button))
+             ;; if so, check if value is of correct type
+             (when prop
+               ;; if property is of add-type, them the value is a list
+               ;; (:add-value-list VAL VAL). Each VAL should be checked.
+               (if (and (cddr p) (eq :add-value-list (car (cadr prop))))
+                   (let* ((add-list (list (cddr p))))
+                     (dolist (val (cdr (cadr prop)))
+                       (setq prop-good-val (funcall (cadr p) val))
+                       (when (car prop-good-val)
+                         (setq add-list (cons (cdr prop-good-val) add-list))))
+                     (setq add-list (nreverse add-list))
+                     (when (eq 2 (length add-list)) ; just 1 value, no
+                                                    ; add-function
+                       (setq add-list (cadr add-list)))
+                     (setq filtered-props-temp (append
+                                                (list (car p) add-list)
+                                                filtered-props-temp)))
+                 ;; if override-property
+                 (setq prop-good-val (funcall (cadr p) (cadr prop)))
+                 (when (car prop-good-val)
+                   (setq filtered-props-temp (append
+                                              (list (car p)
+                                                    (cdr prop-good-val))
+                                              filtered-props-temp))))))))
+        (insert (or (not (memq :insert filtered-props))
+                    ;; (memq :insert filtered-props) holds
+                    (eval (nth 1 (memq :insert filtered-props))))))
+    (when insert
+      (let* ((image-props (toolbarx-xemacs-image-properties
+                          (cadr (memq :image filtered-props))))
+            (glyph-list (car image-props))
+            (image-height (nth 1 image-props))
+            (image-width (nth 2 image-props))
+            (command
+             (let* ((com (nth 1 (memq :command filtered-props)))
+                    (app (nth 1 (memq :append-command filtered-props)))
+                    (prep (nth 1 (memq :prepend-command filtered-props))))
+               (when (or com app prep)
+                 (toolbarx-make-command com prep app))))
+            ;; enable defaults to `t'
+            (enable (if (memq :enable filtered-props)
+                        (cadr (memq :enable filtered-props))
+                      t))
+           ;; help defaults to nil
+            (help (when (memq :help filtered-props)
+                    (cadr (memq :help filtered-props))))
+            ;; toolbar defaults to `default'
+            (toolbar-prop (cons (memq :toolbar filtered-props)
+                                (cadr (memq :toolbar filtered-props))))
+            (toolbar (if (car toolbar-prop)
+                         (if (symbolp (cdr toolbar-prop))
+                             (cdr toolbar-prop)
+                           ;; (cdr toolbar-prop) is cons cell
+                           (if (eq (cadr toolbar-prop)
+                                         (default-toolbar-position))
+                                     (cddr toolbar-prop)
+                                  (cadr toolbar-prop)))
+                       'default)))
+       (when glyph-list
+         (list toolbar image-height image-width
+               (vector glyph-list command enable help)))))))
+
+(defun toolbarx-xemacs-refresh-process-button-or-insert-list (switches
+                                                             toolbar-props)
+  "Process SWITCHES, returning an updated version of TOOLBAR-PROPS.
+TOOLBAR-PROPS should be a list with 12 elements, each one representing
+properties (in this order) `locale', `default', `top', `right',
+`bottom', `left', `default-height', `default-width', `top-height',
+`right-width', `bottom-height' and `left-width'.  The return is a list
+with the same properties updated.
+
+NB: Buttons (vectors) are inserted in front of the lists
+represented by `default', `top', `right', `bottom' and `left', so
+the lists are built reversed."
+  (let ((locale                 (nth 0  toolbar-props))
+       (default         (nth 1  toolbar-props))
+       (top             (nth 2  toolbar-props))
+       (right           (nth 3  toolbar-props))
+       (bottom          (nth 4  toolbar-props))
+       (left            (nth 5  toolbar-props))
+       (default-height  (nth 6  toolbar-props))
+       (default-width   (nth 7  toolbar-props))
+       (top-height      (nth 8  toolbar-props))
+       (right-width     (nth 9  toolbar-props))
+       (bottom-height   (nth 10 toolbar-props))
+       (left-width      (nth 11 toolbar-props))
+       (toolbar-props-temp))
+    (dolist (button switches)
+      (if (eq (car button) :insert)
+         (when (eval (cadr button))
+           ;; if insert group, process `cddr'
+           (progn
+             (setq toolbar-props-temp
+                   (toolbarx-xemacs-refresh-process-button-or-insert-list
+                    (cddr button)
+                    (list locale default top right bottom left
+                          default-height default-width top-height
+                          right-width bottom-height left-width)))
+             (setq default        (nth 1  toolbar-props-temp))
+             (setq top            (nth 2  toolbar-props-temp))
+             (setq right          (nth 3  toolbar-props-temp))
+             (setq bottom         (nth 4  toolbar-props-temp))
+             (setq left           (nth 5  toolbar-props-temp))
+             (setq default-height (nth 6  toolbar-props-temp))
+             (setq default-width  (nth 7  toolbar-props-temp))
+             (setq top-height     (nth 8  toolbar-props-temp))
+             (setq right-width    (nth 9  toolbar-props-temp))
+             (setq bottom-height  (nth 10 toolbar-props-temp))
+             (setq left-width     (nth 11 toolbar-props-temp))))
+       ;; else, if normal button
+       (let* ((button-props (toolbarx-xemacs-button-properties button))
+              (toolbar (nth 0 button-props))
+              (height (nth 1 button-props))
+              (width (nth 2 button-props))
+              (button-description (nth 3 button-props)))
+         (when button-props
+           (cond
+            ;; default
+            ((eq toolbar 'default)
+             (setq default (cons button-description default))
+             (setq default-height (max default-height height))
+             (setq default-width (max default-width width)))
+            ;; top
+            ((eq toolbar 'top)
+             (setq top (cons button-description top))
+             (setq top-height (max top-height height)))
+            ;; right
+            ((eq toolbar 'right)
+             (setq right (cons button-description right))
+             (setq right-width (max right-width width)))
+            ;; bottom
+            ((eq toolbar 'bottom)
+             (setq bottom (cons button-description bottom))
+             (setq bottom-height (max bottom-height height)))
+            ;; left
+            ((eq toolbar 'left)
+             (setq left (cons button-description left))
+             (setq left-width (max left-width width))))))))
+    ;; return a list similar to toolbar-props
+    (list locale default top right bottom left default-height
+         default-width top-height right-width bottom-height left-width)))
+
+
+(defun toolbarx-xemacs-refresh (&optional global-flag)
+  "Refresh the toolbar in XEmacs."
+  (let* ((switches (if global-flag
+                      (if (default-boundp 'toolbarx-internal-button-switches)
+                          (default-value 'toolbarx-internal-button-switches)
+                        toolbarx-internal-button-switches)
+                    toolbarx-internal-button-switches))
+        (locale  (if global-flag 'global (current-buffer)))
+        (toolbar-init (list locale     ; locale
+                            nil        ; default
+                            nil        ; top
+                            nil        ; right
+                            nil        ; bottom
+                            nil        ; left
+                            0          ; default-height
+                            0          ; default-width
+                            0          ; top-height
+                            0          ; right-width
+                            0          ; bottom-height
+                            0))        ; left-width
+        (toolbar-props
+         (toolbarx-xemacs-refresh-process-button-or-insert-list switches
+                                                                toolbar-init))
+        ;; NB: Buttons (vectors) are inserted in front of the lists
+        ;; represented by `default', `top', `right', `bottom' and
+        ;; `left', so the lists are built reversed.
+        (default         (nreverse (nth 1  toolbar-props)))
+        (top             (nreverse (nth 2  toolbar-props)))
+        (right           (nreverse (nth 3  toolbar-props)))
+        (bottom          (nreverse (nth 4  toolbar-props)))
+        (left            (nreverse (nth 5  toolbar-props)))
+        (default-height  (nth 6  toolbar-props))
+        (default-width   (nth 7  toolbar-props))
+        (top-height      (nth 8  toolbar-props))
+        (right-width     (nth 9  toolbar-props))
+        (bottom-height   (nth 10 toolbar-props))
+        (left-width      (nth 11 toolbar-props))
+        (button-raised-border 2)
+        (default-border (specifier-instance default-toolbar-border-width))
+        (top-border (specifier-instance top-toolbar-border-width))
+        (right-border (specifier-instance right-toolbar-border-width))
+        (bottom-border (specifier-instance bottom-toolbar-border-width))
+        (left-border (specifier-instance left-toolbar-border-width)))
+    ;; adding borders
+    (when default
+      (setq default-height (+ (* 2 button-raised-border)
+                             (* 2 default-border)
+                             default-height))
+      (setq default-width (+ (* 2 button-raised-border)
+                            (* 2 default-border)
+                            default-width)))
+    (when top
+      (setq top-height (+ (* 2 button-raised-border)
+                         (* 2 top-border)
+                         top-height)))
+    (when right
+      (setq right-width (+ (* 2 button-raised-border)
+                          (* 2 right-border)
+                          right-width)))
+    (when bottom
+      (setq bottom-height (+ (* 2 button-raised-border)
+                            (* 2 bottom-border)
+                            bottom-height)))
+    (when left
+      (setq left-width (+ (* 2 button-raised-border)
+                         (* 2 left-border)
+                         left-width)))
+    ;; deal with specifiers
+    ;; - remove all specifiers for toolbars witout buttons
+    (if default
+       (progn
+         ;; Only activate the tool bar if it is already visible.
+         (when toolbar-visible-p
+           (set-specifier default-toolbar-visible-p (not (not default)) locale)
+           (if (memq (default-toolbar-position) '(top bottom))
+               (set-specifier default-toolbar-height default-height locale)
+             (set-specifier default-toolbar-width default-width locale)))
+         (set-specifier default-toolbar default locale))
+      (remove-specifier default-toolbar locale)
+      (remove-specifier default-toolbar-visible-p locale)
+      (remove-specifier default-toolbar-height locale)
+      (remove-specifier default-toolbar-width locale))
+    (if top
+       (progn
+         (set-specifier top-toolbar-visible-p (not (not top)) locale)
+         (set-specifier top-toolbar-height top-height locale)
+         (set-specifier top-toolbar top locale))
+      (remove-specifier top-toolbar locale)
+      (remove-specifier top-toolbar-visible-p locale)
+      (remove-specifier top-toolbar-height locale))
+    (if right
+       (progn
+         (set-specifier right-toolbar-visible-p (not (not right))
+                        locale)
+         (set-specifier right-toolbar-width right-width locale)
+         (set-specifier right-toolbar right locale))
+      (remove-specifier right-toolbar locale)
+      (remove-specifier right-toolbar-visible-p locale)
+      (remove-specifier right-toolbar-width locale))
+    (if bottom
+       (progn
+         (set-specifier bottom-toolbar-visible-p (not (not bottom)) locale)
+         (set-specifier bottom-toolbar-height bottom-height locale)
+         (set-specifier bottom-toolbar bottom locale))
+      (remove-specifier bottom-toolbar locale)
+      (remove-specifier bottom-toolbar-visible-p locale)
+      (remove-specifier bottom-toolbar-height locale))
+    (if left
+       (progn
+         (set-specifier left-toolbar-visible-p (not (not left)) locale)
+         (set-specifier left-toolbar-width left-width locale)
+         (set-specifier left-toolbar left locale))
+      (remove-specifier left-toolbar locale)
+      (remove-specifier left-toolbar-visible-p locale)
+      (remove-specifier left-toolbar-width locale))))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; finishing parsing engine
+
+(defun toolbarx-refresh (&optional global-flag)
+  "Redraw the toolbar, peviously installed with `toolbarx'.
+Force global refresh if GLOBAL-FLAG is non-nil."
+  (interactive "P")
+  (if (featurep 'xemacs)
+      (toolbarx-xemacs-refresh global-flag)
+    (toolbarx-emacs-refresh global-flag)))
+
+;;;###autoload (autoload 'toolbarx-install-toolbar "toolbar-x")
+
+(defun toolbarx-install-toolbar (buttons &optional meaning-alist global-flag)
+  "Install toolbar buttons given in BUTTONS.
+Button properties are optionally given in MEANING-ALIST.  If
+GLOBAL-FLAG is non-nil, toolbar is installed globally (on every
+buffer that does not have a toolbar set locally).  BUTTONS is a
+list of format
+  (ELEM ... ELEM . PROPS),
+where each ELEM is either
+
+ - a list in the same format od BUTTONS, which is going to be
+   refered as a *group*; groups are used to distribute properties
+   recursively to its elements; there are groups with special
+   format for special purpose: *dropdown groups* and also *eval
+   groups*.
+
+ - a symbol, which could be associated in MEANING-ALIST with a
+   list of button properties (symbol + properties = a *button*)
+   or associated to a special kind of group (an *alias group*).
+
+ - a vector, which elements are on the previous formats (but not
+   another vector); this is useful to specify different
+   ingredients to the toolbar depending if editor is Emacs or
+   XEmacs; the first element will be used in Emacs; the second
+   element is going to be used in XEmacs.
+
+Meaning alist
+=============
+
+MEANING-ALIST is a list where each element is in one of the
+formats (SYMB . BUTTON-PROPS-LIST) or (SYMB .  ALIAS-GROUP).
+BUTTON-PROPS-LIST is a list in one of the formats
+  (IMAGE COMMAND PROP VAL PROP VAL ... PROP VAL)  or
+  (PROP VAL PROP VAL ... PROP VAL).
+The IMAGE is going to be used as the `:image' property of the
+button (see button properties bellow), and COMMAND shall be used
+as the `:command' property of the button.  Each PROP is one of
+the button properties, and VAL is its respective value.
+ALIAS-GROUP is a list which first element is the symbol `:alias'
+and the cdr shall be processed as a group.
+
+However, a symbol is not required to have an association in
+MEANING-ALIST, which is only a way to specify properties to a
+button.         One can use groups to specify properties.  Nil is a good
+MEANING-ALIST.
+
+Buttons
+=======
+
+A toolbar button in `toolbarx' is the set with a symbol and
+properties used to display the button, like a image and a command
+to call when the button is pressed (which are the minimal
+elements that a button should have.)  The supported properties
+for buttons and their `basic types' (see note on how values of
+properties are obtained!) are:
+
+ :image -- in Emacs, either a string or image descriptor (see
+   info for a definition), or a variable bound to a image
+   descriptor (like those defined with `defimage') or a list of 4
+   strings or image descriptors; in XEmacs, either a string or a
+   glyph, or a symbol bount to a glyph, or a list of at least 1
+   and at most 6 strings or glyphs or nil (not the first element
+   though); defines the image file displayed by the button.  If
+   it is a string, the image file found with that name (always
+   using the function `toolbarx-find-image' to make the
+   \`internal\' image descriptor) is used as button image.  For
+   the other formats, the button image is handled in the same way
+   as it is treated by the editors; see info nodes bellow for a
+   description of the capabilities of each editor
+      Emacs: info file \"elisp\", node \"Tool Bar\" (see `:image'
+             property);
+             PS: a *vector* of four strings is used in the Emacs
+             Lisp documentation as the `more ellaborated' image
+             property format, but here we reserve vectors to
+             provide editor-dependent values; this motivates our
+             choice for a list instead of vector (however,
+             internally the list becomes a vector when displaying
+             the button).
+     XEmacs: info file \"lispref\", node \"Toolbar Descriptor
+             Format\" (see GLYPH-LIST) or the documentation of
+             the variable `default-toolbar'; check the inheritage
+             in case of a ommited glyph or nil instead of glyph.
+
+ :command -- a form; if the form happens to be a command, it will
+   be called with `call-interactively'.
+
+ :append-command -- a form added to the end of the value of
+   `:command'.
+
+ :prepend-command -- a form added at the beginning of the value
+   of `:command'.
+
+ :help -- either a string or nil; defined the help string of the
+   button;
+
+ :enable -- a form, evaluated constantly by both editors to
+   determine if a button is active (enabled) or not.
+
+ :visible -- in Emacs, a form that is evaluated constantly to
+   determine if a button is visible; in XEmacs, this property is
+   ignored.
+
+ :button -- in Emacs, a cons cell (TYPE .  SELECTED) where the
+   TYPE should be `:toggle' or `:radio' and the cdr should be a
+   form.  SELECTED is evaluated to determine when the button is
+   selected.  This property is ignored in XEmacs.
+
+ :insert -- a form that is evaluated every time that the toolbar
+   is refresh (a call of `toolbarx-refresh') to determine if the
+   button is inserted or just ignored (until next refresh).
+
+ :toolbar -- in XEmacs, either one of the symbols `default',
+   `top', `bottom', `left', `right', or a cons cell
+   (POS . POS-AVOID-DEFAULT) where POS and POS-AVOID-DEFAULT
+   should be one of the symbols `top', `bottom', `left', `right';
+   if a symbol, the button will be inserted in one of these
+   toolbars; if a cons cell, button will be inserted in toolbar
+   POS unless the position of the default toolbar is POS (then,
+   the default toolbar would override the position-specific
+   toolbar), and in this case, button will be inserted in toolbar
+   POS-AVOID-DEFAULT; in Emacs, this property is meaningless, and
+   therefore ignored.  Hint of use of this property: in a
+   program, use or everything with `default' and the cons format
+   to avoid the default toolbar, or use only the position
+   specific buttons (symbols that are not `default'), because of
+   the `overriding' system in XEmacs, when a position-specific
+   toolbar overrides the default toolbar; for instance, if you
+   put a button in the default toolbar and another in the top
+   toolbar (and the default toolbar is in the top), then *only*
+   the ones in the top toolbar will be visible!
+
+How to specify a button
+=======================
+
+One can specify a button by its symbol or by a group to specify
+properties.  For example,
+  BUTTON =
+    ( foo
+      (bar :image [\"bar-Emacs\" \"bar-XEmacs\"]
+           :command bar-function :help \"Bar help string\")
+      :insert foo-bar )
+  MEANING-ALIST = ( (foo :image \"foo\" :command foo-function) )
+specifiy two buttons `foo' and `bar', each one with its necessary
+:image and :command properties, and both use the :insert property
+specified ate the end of BUTTONS (because groups distribute
+properties to all its elements).  `foo' and `bar' will be
+inserted only if `foo-bar' evaluation yields non-nil.  `bar' used
+a different :image property depending if editor is Emacs or
+XEmacs.
+
+Note on how values of properties are obtained
+=============================================
+
+For each property PROP, its value should be either:
+   i) a vector of 2 elements; then each element should be of the
+      basic type of PROP.
+  ii) an element on the basic type of PROP.
+ iii) a function (that does not need arguments); it is evaluated
+      and the return should be ot type i) or ii) above
+  iv) a symbol bound to a element of type i) or ii).
+
+The type is cheched in the order i), ii) iii) and iv). This
+evaluations are done every time that the oolbar is refresh.
+
+Ps.: in order to specify a vector as value of a property (like
+the :image in Emacs), it is necessary to provide the vector as
+element of another vector.
+
+Special groups
+==============
+
+Eval groups
+-----------
+
+If the first element of a group is the symbol `:eval-group', each
+element is evaluated (with `eval'), put inside a list and
+processed like a group.         Eval groups are useful to store
+definition of buttons in a variable.
+
+Dropdown groups
+---------------
+
+The idea is to specify a set of buttons that appear when a
+determined menu item of a dropdown menu is active.  The dropdown
+menu appears when a button (by default with a triangle pointing
+down) is clicked.  This button is called `dropdown button'.  The
+dropdown button appears on the left of the currently visible
+buttons of the dropdown group.
+
+A dropdown group is a list which first element is the symbol
+`:dropdown-group' and in one of the following formats
+  (:dropdown-group SYMBOL-1 ... SYMBOL-n  PROP-1 VAL-1 ... PROP-k VAL-k)
+or
+  (:dropdown-group
+     STRING-1 ITEM-11 ... ITEM-1n
+     STRING-2 ITEM-21 ... ITEM-2m
+          . . .
+     STRING-n ITEM-n1 ... ITEM-np
+       PROP-1 VAL-1 ... PROP-j VAL-j)
+where
+ SYMBOL-* is a symbol that defines a button in MEANING-ALIST;
+ STRING-* is a string that will appear in the dropdown menu;
+ ITEM-* is any format that define buttons or groups.
+
+\(a dropdown group of first format is internally converted to the
+second by making strings from the symbols and each symbol is the
+item)
+
+The same rules for obtaining property values, described above,
+apply here.  Properties are also distributed by groups.         The
+supported properties and their basic type are:
+
+ :type -- one of the symbols `radio' (default) or `toggle'; if
+   type is radio, only one of the itens may be active, and if
+   type is toggle, any item number of itens can be active.
+
+ :variable -- a symbol; it is the variable that govern the
+   dropdown button; every time the value should be an integer
+   starting from 1 (if type is radio) or a list of integers (if
+   type is toggle).  The Nth set of buttons is :insert'ed.
+
+ :default -- determines the default value when the menu is
+   installed; it is ignored if a value was saved with custom; it
+   defaults to 1 if type is radio or nil if type is toggle.  If
+   value is a integer and type is `toggle', value used is a list
+   with that integer.
+
+ :save -- one of the symbols nil (default), `offer' or
+   `always'; determined if it is possible for the user to save
+   the which menu itens are active, for a next session.         If value
+   is `offer', a item (offering to save) is added to the
+   popup menu. If the value is `always', every time that a item
+   is selected, the variable is saved. If value is nil, variable
+   shall not be saved. If value is non-nil then `:variable' is
+   mandatory.
+
+ :title -- a string or nil; if a string, the popup menu will show
+   is as menu title; if nil, no title is shown.
+
+ :dropdown-help -- a string or nil; the help string of the
+   dropdown button.
+
+ :dropdown-image -- in Emacs, either a string or a vector of 4
+   strings; in XEmacs, either a string or a glyph or a list of at
+   least 1 and at most 6 strings or glyphs; defines the image
+   file displayed by the dropdown button; by default, it is the
+   string \"dropdown\".
+
+ :dropdown-append-command,
+ :dropdownprepend-command -- a form; append or prepend forms to
+   the command that shows the dropdown menu, allowing extra code
+   to run before or after the menu appears (remember that every
+   menu item clicked refresh the toolbar.)
+
+ :dropdown-enable -- a form; evaluated constantly by both editors
+   to determine if the dropdown button is active (enabled) or
+   not.
+
+ :dropdown-visible -- a form; in Emacs, it is evaluated
+   constantly to determine if the dropdown button is visible; in
+   XEmacs, this property is ignored.
+
+ :dropdown-toolbar -- in XEmacs, one of the symbols `default',
+   `opposite', `top', `bottom', `left' or `right'; ignored in
+   Emacs; in XEmacs, the toolbar where the dropdown button will
+   appear.
+
+Also, if the symbol `dropdown' is associted in MEANING-ALIST
+with some properties, these properties override (or add) with
+higher precedence.
+
+Special buttons
+===============
+
+If the symbol of a button is `:new-line', it is inserted
+a (faked) return, and the next button will be displayed a next
+line of buttons.  The only property supported for this button is
+`:insert'.  This feature is available only in Emacs.  In XEmacs,
+this button is ignored."
+  (let ((switches (toolbarx-process-group buttons meaning-alist nil nil)))
+    (if global-flag
+       (setq-default toolbarx-internal-button-switches
+                     switches)
+      (set (make-local-variable 'toolbarx-internal-button-switches)
+          switches)
+      (unless (featurep 'xemacs)
+       (make-local-variable 'tool-bar-map))))
+  (toolbarx-refresh global-flag))
+
+
+(defconst toolbarx-default-toolbar-meaning-alist
+  `((separator :image "sep" :command t :enable nil :help "")
+
+    (,(if (and (not (featurep 'xemacs)) (>= emacs-major-version 22))
+         'new-file
+       'open-file)
+     :image ["new" toolbar-file-icon]
+     :command [find-file toolbar-open]
+     :enable [(not (window-minibuffer-p
+                   (frame-selected-window menu-updating-frame)))
+             t]
+     :help ["Specify a new file's name, to edit the file" "Visit new file"])
+
+    ,(when (and (not (featurep 'xemacs)) (>= emacs-major-version 22))
+       '(open-file :image ["open" toolbar-file-icon]
+                  :command [menu-find-file-existing toolbar-open]
+                  :enable [(not (window-minibuffer-p
+                                 (frame-selected-window menu-updating-frame)))
+                           t]
+                  :help ["Read a file into an Emacs buffer" "Open a file"]))
+
+    (dired :image [,(if (>= emacs-major-version 22)
+                       "diropen"
+                     "open")
+                  toolbar-folder-icon]
+          :command [dired toolbar-dired]
+          :help ["Read a directory, operate on its files" "Edit a directory"])
+
+    (save-buffer :image ["save" toolbar-disk-icon]
+                :command [save-buffer toolbar-save]
+                :enable [(and
+                          (buffer-modified-p)
+                          (buffer-file-name)
+                          (not (window-minibuffer-p
+                                (frame-selected-window menu-updating-frame))))
+                         t]
+                :help ["Save current buffer to its file"  "Save buffer"]
+                :visible (or buffer-file-name
+                             (not (eq 'special
+                                      (get major-mode 'mode-class)))))
+
+    ;; Emacs only
+    (write-file :image "saveas"
+               :command write-file
+               :enable (not
+                        (window-minibuffer-p
+                         (frame-selected-window menu-updating-frame)))
+               :insert [t nil]
+               :help "Write current buffer to another file"
+               :visible (or buffer-file-name
+                            (not (eq 'special (get major-mode 'mode-class)))))
+
+    (undo :image ["undo" toolbar-undo-icon]
+         :command [undo toolbar-undo]
+         :enable [(and (not buffer-read-only)
+                       (not (eq t buffer-undo-list))
+                       (if (eq last-command 'undo)
+                           pending-undo-list
+                         (consp buffer-undo-list)))
+                  t]
+         :help ["Undo last operation" "Undo edit"]
+         :visible (not (eq 'special (get major-mode 'mode-class))))
+
+    (cut :image ["cut" toolbar-cut-icon]
+        :help ["Delete text in region and copy it to the clipboard"
+               "Kill region"]
+        :command [clipboard-kill-region toolbar-cut]
+        :visible (not (eq 'special (get major-mode 'mode-class))))
+
+    (copy :image ["copy" toolbar-copy-icon]
+         :help ["Copy text in region to the clipboard" "Copy region"]
+         :command [clipboard-kill-ring-save toolbar-copy])
+
+    (paste :image ["paste" toolbar-paste-icon]
+          :help ["Paste text from clipboard" "Paste from clipboard"]
+          :command [clipboard-yank toolbar-paste]
+          :visible (not (eq 'special (get major-mode 'mode-class))))
+
+    ;; Emacs only
+    (search-forward :command nonincremental-search-forward
+                   :help "Search forward for a string"
+                   :image "search"
+                   :insert [t nil])
+
+    (search-replace
+     :image ["search-replace" toolbar-replace-icon]
+     :command [query-replace toolbar-replace]
+     :help ["Replace string interactively, ask about each occurrence"
+           "Search & Replace"])
+
+    (print-buffer :image ["print" toolbar-printer-icon]
+                 :command [print-buffer toolbar-print]
+                 :help ["Print current buffer with page headings"
+                        "Print buffer"])
+
+    ;; Emacs only
+    (customize :image "preferences"
+              :command customize
+              :help "Edit preferences (customize)"
+              :insert [t nil])
+
+    ;; Emacs only
+    (help :image "help"
+         :command (lambda () (interactive) (popup-menu menu-bar-help-menu))
+         :help "Pop up the Help menu"
+         :insert [t nil])
+
+    ;; Emacs only
+    (kill-buffer :command kill-this-buffer
+                :enable (kill-this-buffer-enabled-p)
+                :help "Discard current buffer"
+                :image "close"
+                :insert [t nil])
+
+    ;; Emacs only
+    (exit-emacs :image "exit"
+               :command save-buffers-kill-emacs
+               :help "Offer to save unsaved buffers, then exit Emacs"
+               :insert [t nil])
+
+    (spell-buffer :image ["spell" toolbar-spell-icon]
+                 :command [ispell-buffer toolbar-ispell]
+                 :help ["Check spelling of selected buffer" "Check spelling"])
+
+    (info :image ["info" toolbar-info-icon]
+         :command [info toolbar-info]
+         :help ["Enter Info, the documentation browser" "Info documentation"])
+
+    ;; XEmacs only
+    (mail :image toolbar-mail-icon
+         :command toolbar-mail
+         :help "Read mail"
+         :insert [nil t])
+
+    ;; XEmacs only
+    (compile :image toolbar-compile-icon
+            :command toolbar-compile
+            :help "Start a compilation"
+            :insert [nil t])
+
+    ;; XEmacs only
+    (debug :image toolbar-debug-icon
+          :command toolbar-debug
+          :help "Start a debugger"
+          :insert [nil t])
+
+    ;; XEmacs only
+    (news :image toolbar-news-icon
+         :command toolbar-news
+         :help "Read news"
+         :insert [nil t]))
+  "A meaning alist with definition of the default buttons.
+The following buttons are available:
+
+* Both Emacs and XEmacs: `open-file', `dired', `save-buffer',
+  `undo', `cut', `copy', `paste', `search-replace', `print-buffer',
+  `spell-buffer', `info'.
+
+* Emacs only: `new-file' (Emacs 22+) `write-file', `search-forward',
+  `customize', `help', `kill-buffer', `exit-emacs'.
+
+* XEmacs only: `mail', `compile', `debug', `news'.
+
+To reproduce the default toolbar in both editors with use as BUTTON
+in `toolbarx-install-toolbar':
+
+\(toolbarx-install-toolbar
+ '([(open-file dired kill-buffer save-buffer write-file undo cut
+               copy paste search-forward print-buffer customize help)
+    (open-file dired save-buffer print-buffer cut copy paste undo
+               spell-buffer search-replace mail info compile debug news)])
+ toolbarx-default-toolbar-meaning-alist)
+
+Ps.: there are more buttons available than suggested in the
+expression above.")
+
+(provide 'toolbar-x)
+
+;;; toolbar-x.el ends here
diff --git a/packages/cl-lib/cl-lib.el b/packages/cl-lib/cl-lib.el
new file mode 100644 (file)
index 0000000..0720afe
--- /dev/null
@@ -0,0 +1,322 @@
+;;; cl-lib.el --- Properly prefixed CL functions and macros  -*- coding: utf-8 -*-
+
+;; Copyright (C) 2012, 2013  Free Software Foundation, Inc.
+
+;; Author: Stefan Monnier <monnier@iro.umontreal.ca>
+;; vcomment: Emacs-24.3's version is 1.0 so this has to stay below.
+;; Version: 0.3
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This is a forward compatibility package, which provides (a subset of) the
+;; features of the cl-lib package introduced in Emacs-24.3, for use on
+;; previous emacsen.
+
+;; Make sure this is installed *late* in your `load-path`, i.e. after Emacs's
+;; built-in .../lisp/emacs-lisp directory, so that if/when you upgrade to
+;; Emacs-24.3, the built-in version of the file will take precedence, otherwise
+;; you could get into trouble (although we try to hack our way around the
+;; problem in case it happens).
+
+;; This code is largely copied from Emacs-24.3's cl.el, with the alias bindings
+;; simply reversed.
+
+;;; Code:
+
+(when (functionp 'macroexp--compiler-macro)
+  ;; `macroexp--compiler-macro' was introduced as part of the big CL
+  ;; reorganization which moved/reimplemented some of CL into core (mostly the
+  ;; setf and compiler-macro support), so its presence indicates we're running
+  ;; in an Emacs that comes with the new cl-lib.el, where this file should
+  ;; never be loaded!
+  (message "Real cl-lib shadowed by compatibility cl-lib? (%s)" load-file-name)
+  (when load-file-name
+    ;; (message "Let's try to patch things up")
+    (let ((loaddir (file-name-directory load-file-name))
+          load-path-dir)
+      ;; Find the problematic directory from load-path.
+      (dolist (dir load-path)
+        (if (equal loaddir (expand-file-name (file-name-as-directory dir)))
+            (setq load-path-dir dir)))
+      (when load-path-dir
+        ;; (message "Let's move the offending dir to the end")
+        (setq load-path (append (remove load-path-dir load-path)
+                                (list load-path-dir)))
+        ;; Here we could manually load cl-lib and then return immediately.
+        ;; But Emacs currently doesn't provide any way for a file to "return
+        ;; immediately", so instead we make sure the rest of the file does not
+        ;; throw away any pre-existing definition.
+        ))))
+
+(require 'cl)
+
+;; Some of Emacs-24.3's cl.el definition are not just aliases, because either
+;; the feature was dropped from cl-lib.el or because the cl-lib version is
+;; not fully compatible.
+;; Let's just not include them here, since it is very important that if code
+;; works with this cl-lib.el it should also work with Emacs-24.3's cl-lib.el,
+;; whereas the reverse is much less important.
+
+(dolist (var '(
+               ;; loop-result-var
+               ;; loop-result
+               ;; loop-initially
+               ;; loop-finally
+               ;; loop-bindings
+               ;; loop-args
+               ;; bind-inits
+               ;; bind-block
+               ;; lambda-list-keywords
+               float-negative-epsilon
+               float-epsilon
+               least-negative-normalized-float
+               least-positive-normalized-float
+               least-negative-float
+               least-positive-float
+               most-negative-float
+               most-positive-float
+               ;; custom-print-functions
+               ))
+  (let ((new (intern (format "cl-%s" var))))
+    (unless (boundp new) (defvaralias new var))))
+
+(dolist (fun '(
+               (get* . cl-get)
+               (random* . cl-random)
+               (rem* . cl-rem)
+               (mod* . cl-mod)
+               (round* . cl-round)
+               (truncate* . cl-truncate)
+               (ceiling* . cl-ceiling)
+               (floor* . cl-floor)
+               (rassoc* . cl-rassoc)
+               (assoc* . cl-assoc)
+               (member* . cl-member)
+               (delete* . cl-delete)
+               (remove* . cl-remove)
+               (defsubst* . cl-defsubst)
+               (sort* . cl-sort)
+               (function* . cl-function)
+               (defmacro* . cl-defmacro)
+               (defun* . cl-defun)
+               (mapcar* . cl-mapcar)
+
+               remprop
+               getf
+               tailp
+               list-length
+               nreconc
+               revappend
+               concatenate
+               subseq
+               random-state-p
+               make-random-state
+               signum
+               isqrt
+               lcm
+               gcd
+               notevery
+               notany
+               every
+               some
+               mapcon
+               mapcan
+               mapl
+               maplist
+               map
+               equalp
+               coerce
+               tree-equal
+               nsublis
+               sublis
+               nsubst-if-not
+               nsubst-if
+               nsubst
+               subst-if-not
+               subst-if
+               subsetp
+               nset-exclusive-or
+               set-exclusive-or
+               nset-difference
+               set-difference
+               nintersection
+               intersection
+               nunion
+               union
+               rassoc-if-not
+               rassoc-if
+               assoc-if-not
+               assoc-if
+               member-if-not
+               member-if
+               merge
+               stable-sort
+               search
+               mismatch
+               count-if-not
+               count-if
+               count
+               position-if-not
+               position-if
+               position
+               find-if-not
+               find-if
+               find
+               nsubstitute-if-not
+               nsubstitute-if
+               nsubstitute
+               substitute-if-not
+               substitute-if
+               substitute
+               delete-duplicates
+               remove-duplicates
+               delete-if-not
+               delete-if
+               remove-if-not
+               remove-if
+               replace
+               fill
+               reduce
+               compiler-macroexpand
+               define-compiler-macro
+               assert
+               check-type
+               typep
+               deftype
+               defstruct
+               callf2
+               callf
+               letf*
+               letf
+               rotatef
+               shiftf
+               remf
+               psetf
+               (define-setf-method . define-setf-expander)
+               declare
+               the
+               locally
+               multiple-value-setq
+               multiple-value-bind
+               symbol-macrolet
+               macrolet
+               progv
+               psetq
+               do-all-symbols
+               do-symbols
+               dotimes
+               dolist
+               do*
+               do
+               loop
+               return-from
+               return
+               block
+               etypecase
+               typecase
+               ecase
+               case
+               load-time-value
+               eval-when
+               destructuring-bind
+               gentemp
+               gensym
+               pairlis
+               acons
+               subst
+               adjoin
+               copy-list
+               ldiff
+               list*
+               cddddr
+               cdddar
+               cddadr
+               cddaar
+               cdaddr
+               cdadar
+               cdaadr
+               cdaaar
+               cadddr
+               caddar
+               cadadr
+               cadaar
+               caaddr
+               caadar
+               caaadr
+               caaaar
+               cdddr
+               cddar
+               cdadr
+               cdaar
+               caddr
+               cadar
+               caadr
+               caaar
+               tenth
+               ninth
+               eighth
+               seventh
+               sixth
+               fifth
+               fourth
+               third
+               endp
+               rest
+               second
+               first
+               svref
+               copy-seq
+               evenp
+               oddp
+               minusp
+               plusp
+               floatp-safe
+               declaim
+               proclaim
+               nth-value
+               multiple-value-call
+               multiple-value-apply
+               multiple-value-list
+               values-list
+               values
+               pushnew
+               decf
+               incf
+
+               dolist
+               dotimes
+               ))
+  (let ((new (if (consp fun) (prog1 (cdr fun) (setq fun (car fun)))
+               (intern (format "cl-%s" fun)))))
+    (unless (fboundp new) (defalias new fun))))
+
+;; `cl-labels' is not 100% compatible with `labels' when using dynamic scoping
+;; (mostly because it does not turn lambdas that refer to those functions into
+;; closures).  OTOH it is compatible when using lexical scoping.
+
+(unless (fboundp 'cl-labels)
+  (defmacro cl-labels (&rest args)
+    (unless (and (boundp 'lexical-binding) lexical-binding)
+      ;; We used to signal an error rather than a message, but in many uses of
+      ;; cl-labels, the value of lexical-binding doesn't actually matter.
+      ;; More importantly, the value of `lexical-binding' here is unreliable
+      ;; (it does not necessarily reflect faithfully whether the output of this
+      ;; macro will be interpreted as lexically bound code or not).
+      (message "This `cl-labels' requires `lexical-binding' to be non-nil"))
+    `(labels ,@args)))
+
+(provide 'cl-lib)
+;;; cl-lib.el ends here
diff --git a/packages/coffee-mode/README.md b/packages/coffee-mode/README.md
new file mode 100644 (file)
index 0000000..51a7322
--- /dev/null
@@ -0,0 +1,284 @@
+CoffeeScript Major Mode
+=======================
+
+An Emacs major mode for [CoffeeScript][cs], unfancy JavaScript.
+
+Provides syntax highlighting, indentation support, imenu support,
+a menu bar, and a few cute commands.
+
+![Screenshot](http://img.skitch.com/20100308-fcr622c95ibey4m474d5m1m1qt.png)
+
+## Installation
+
+In your shell:
+
+    $ cd ~/.emacs.d/vendor
+    $ git clone git://github.com/defunkt/coffee-mode.git
+
+In your emacs config:
+
+    (add-to-list 'load-path "~/.emacs.d/vendor/coffee-mode")
+    (require 'coffee-mode)
+
+If `coffee-mode` is not enabled automatically for any files ending in
+".coffee" or named "Cakefile", add this to your emacs config as well:
+
+    (add-to-list 'auto-mode-alist '("\\.coffee$" . coffee-mode))
+    (add-to-list 'auto-mode-alist '("Cakefile" . coffee-mode))
+
+[coffee-mode used to offer automatic deletion of trailing whitespace.
+This is now left to whitespace-mode. See its documentation for full
+details, but as a hint, configure:
+
+    (setq whitespace-action '(auto-cleanup)) ;; automatically clean up bad whitespace
+    (setq whitespace-style '(trailing space-before-tab indentation empty space-after-tab)) ;; only show bad whitespace
+
+Then turn on whitespace-mode, or global-whitespace-mode.]
+
+## Indentation
+
+### TAB Theory
+
+It goes like this: when you press `TAB`, we indent the line unless
+doing so would make the current line more than two indentation levels
+deepers than the previous line. If that's the case, remove all
+indentation.
+
+Consider this code, with point at the position indicated by the
+caret:
+
+    line1()
+      line2()
+      line3()
+         ^
+
+Pressing `TAB` will produce the following code:
+
+    line1()
+      line2()
+        line3()
+           ^
+
+Pressing `TAB` again will produce this code:
+
+    line1()
+      line2()
+    line3()
+       ^
+
+And so on. I think this is a pretty good way of getting decent
+indentation with a whitespace-sensitive language.
+
+### Newline and Indent
+
+We all love hitting `RET` and having the next line indented
+properly. Given this code and cursor position:
+
+    line1()
+      line2()
+      line3()
+            ^
+
+Pressing `RET` would insert a newline and place our cursor at the
+following position:
+
+    line1()
+      line2()
+      line3()
+
+      ^
+
+In other words, the level of indentation is maintained. This
+applies to comments as well. Combined with the `TAB` you should be
+able to get things where you want them pretty easily.
+
+### Indenters
+
+`class`, `for`, `if`, and possibly other keywords cause the next line
+to be indented a level deeper automatically.
+
+For example, given this code and cursor position::
+
+    class Animal
+                ^
+
+Pressing enter would produce the following:
+
+    class Animal
+
+      ^
+
+That is, indented a column deeper.
+
+This also applies to lines ending in `->`, `=>`, `{`, `[`, and
+possibly more characters.
+
+So this code and cursor position:
+
+    $('#demo').click ->
+                       ^
+
+On enter would produce this:
+
+    $('#demo').click ->
+
+      ^
+
+Pretty slick.
+
+## imenu
+
+If you're using imenu, `coffee-mode` should work just fine. This
+means users of [textmate.el][tm] will find that `⇧⌘T`
+(`textmate-go-to-symbol`) mostly works as expected.
+
+If you're not using imenu check out [this page][im] or textmate.el for
+a really awesome way to jump quickly to a function's definition in a
+file.
+
+## Commands
+
+If you have `easymenu` you can get to any of these commands from the
+menu bar:
+
+![coffee-mode menu bar](http://img.skitch.com/20100308-tt5yn51h2jww2pmjqaawed6eq8.png)
+
+### coffee-compile-file
+
+Compiles the current file as a JavaScript file. Doesn't open it or
+anything special for you.
+
+Operating on "basic.coffee" and running this command will save a
+"basic.js" in the same directory. Subsequent runs will overwrite the
+file.
+
+If there are compilation errors and we the compiler have returned a
+line number to us for the first error, the point is moved to that
+line, so you can investigate.  If this annoys you, you can set
+`coffee-compile-jump-to-error` to `nil`.
+
+### coffee-compile-buffer
+
+Compiles the current buffer to JavaScript using the command specified
+by the `coffee-command` variable and opens the contents in a new
+buffer using the mode configured for ".js" files.
+
+Bind it:
+
+    (define-key coffee-mode-map [(meta r)] 'coffee-compile-buffer)
+
+### coffee-compile-region
+
+Compiles the selected region to JavaScript using the same
+configuration variables as `coffee-compile-buffer`.
+
+Bind it:
+
+    (define-key coffee-mode-map [(meta R)] 'coffee-compile-region)
+
+### Compile-on-save
+
+Hitting the key sequence `C-c C-o C-s` turns on (toggles) the
+compile-on-save minor mode in `coffee-mode`.  To enable it by default:
+
+    (add-hook 'coffee-mode-hook '(lambda () (coffee-cos-mode t)))
+
+### coffee-repl
+
+Starts a repl in a new buffer using `coffee-command`.
+
+## Hooks
+
+### coffee-mode-hook
+
+Naturally. Example:
+
+    (defun coffee-custom ()
+      "coffee-mode-hook"
+
+      ;; CoffeeScript uses two spaces.
+      (make-local-variable 'tab-width)
+      (set 'tab-width 2)
+
+      ;; If you don't want your compiled files to be wrapped
+      (setq coffee-args-compile '("-c" "--bare"))
+
+      ;; Emacs key binding
+      (define-key coffee-mode-map [(meta r)] 'coffee-compile-buffer)
+
+      ;; Riding edge.
+      (setq coffee-command "~/dev/coffee")
+
+      ;; Compile '.coffee' files on every save
+      (and (file-exists-p (buffer-file-name))
+           (file-exists-p (coffee-compiled-file-name))
+           (coffee-cos-mode t)))
+
+    (add-hook 'coffee-mode-hook 'coffee-custom)
+
+## Configuration
+
+You can customize any of the following options using `M-x
+customize-group` with "coffee" as the group.
+
+You can also customize then with `coffee-mode-hook`, as demonstrated
+above.
+
+### coffee-tab-width
+
+The tab width to use when indenting.
+
+Default: `tab-width`
+
+### coffee-command
+
+The CoffeeScript command used for evaluating code. Must be in your
+path.
+
+Default: `"coffee"`
+
+### coffee-args-repl
+
+The command line arguments to pass to `coffee-command' to start a
+REPL.
+
+Default: `'("-i")`
+
+### coffee-args-compile
+
+The command line arguments to pass to `coffee-command' when compiling a file.
+
+Default: `'("-c")`
+
+### coffee-compiled-buffer-name
+
+The name of the scratch buffer used when compiling CoffeeScript.
+
+Default: `"*coffee-compiled*"`
+
+### coffee-compile-jump-to-error
+
+Whether to jump to the first error if compilation fails.  Please note
+that the coffee compiler doesn't always give a line number for the
+issue and in that case it is not possible to jump to the error, of
+course.
+
+Default: `t`
+
+## Thanks
+
+* Jeremy Ashkenas for CoffeeScript
+* <http://xahlee.org/emacs/elisp_syntax_coloring.html> for instructions.
+* Jason Blevins for the guidance his markdown-mode.el gave.
+* Steve Yegge for js2
+
+## Bugs
+
+Prototype accessor assignments like `String::length: -> 10` don't look
+great.
+
+Please file bugs at <http://github.com/defunkt/coffee-mode/issues>
+
+[cs]: http://jashkenas.github.com/coffee-script/
+[tm]: http://github.com/defunkt/textmate.el
+[im]: http://chopmo.blogspot.com/2008/09/quickly-jumping-to-symbols.html
diff --git a/packages/coffee-mode/coffee-mode-pkg.el b/packages/coffee-mode/coffee-mode-pkg.el
new file mode 100644 (file)
index 0000000..e92ded1
--- /dev/null
@@ -0,0 +1 @@
+(define-package "coffee-mode" "0.4.1" "Major mode for CoffeeScript files")
diff --git a/packages/coffee-mode/coffee-mode.el b/packages/coffee-mode/coffee-mode.el
new file mode 100644 (file)
index 0000000..427c047
--- /dev/null
@@ -0,0 +1,643 @@
+;;; coffee-mode.el --- Major mode for CoffeeScript files
+
+;; Copyright (C) 2010-2012 Free Software Foundation, Inc.
+
+;; Version: 0.4.1
+;; Keywords: CoffeeScript major mode
+;; Author: Chris Wanstrath <chris@ozmm.org>
+;; URL: http://github.com/defunkt/coffee-mode
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary
+
+;; CoffeeScript mode is an Emacs major mode for [CoffeeScript][cs],
+;; unfancy JavaScript.  It provides syntax highlighting, indentation
+;; support, imenu support, a menu bar, and a few cute commands.
+
+;; Installing this package enables CoffeeScript mode for file named
+;; *.coffee and Cakefile.
+
+;; Commands:
+
+;; M-x coffee-compile-file compiles the current file as a JavaScript
+;; file.  Operating on "basic.coffee" and running this command will
+;; save a "basic.js" in the same directory.  Subsequent runs will
+;; overwrite the file.
+;;
+;; If there are compilation errors and we the compiler have returned a
+;; line number to us for the first error, the point is moved to that
+;; line, so you can investigate.  If this annoys you, you can set
+;; `coffee-compile-jump-to-error` to `nil`.
+;;
+;; M-x coffee-compile-buffer compiles the current buffer to JavaScript
+;; using the command specified by the `coffee-command` variable, and
+;; opens the contents in a new buffer using the mode configured for
+;; ".js" files.
+;;
+;; M-x coffee-compile-region compiles the selected region to
+;; JavaScript using the same configuration variables as
+;; `coffee-compile-buffer`.
+;;
+;; `C-c C-o C-s' (coffee-cos-mode) toggles a minor mode implementing
+;; "compile-on-save" behavior.
+;;
+;; M-x coffee-repl starts a repl via `coffee-command` in a new buffer.
+
+;; Options:
+;;
+;; `coffee-tab-width' - Tab width to use when indenting.
+;; `coffee-command'   - CoffeeScript command for evaluating code.
+;;                      Must be in your path.
+;; `coffee-args-repl' - Command line arguments for `coffee-command'
+;;                      when starting a REPL.
+;; `coffee-args-compile'          - Arguments for `coffee-command'
+;;                                  when compiling a file.
+;; `coffee-compiled-buffer-name'  - Name of the scratch buffer used
+;;                                  when compiling CoffeeScript.
+;; `coffee-compile-jump-to-error' - Whether to jump to the first error
+;;                                  if compilation fails.
+
+;; Please file bugs at <http://github.com/defunkt/coffee-mode/issues>
+
+;; Thanks:
+
+;; Major thanks to http://xahlee.org/emacs/elisp_syntax_coloring.html
+;; the instructions.
+
+;; Also thanks to Jason Blevins's markdown-mode.el and Steve Yegge's
+;; js2-mode for guidance.
+
+;; TODO:
+;; - Execute {buffer,region,line} and show output in new buffer
+;; - Make prototype accessor assignments like `String::length: -> 10` pretty.
+;; - mirror-mode - close brackets and parens automatically
+
+;;; Code:
+
+(require 'comint)
+(require 'easymenu)
+(require 'font-lock)
+
+(eval-when-compile
+  (require 'cl))
+
+;;
+;; Customizable Variables
+;;
+
+(defconst coffee-mode-version "0.4.1"
+  "The version of `coffee-mode'.")
+
+(defgroup coffee nil
+  "A CoffeeScript major mode."
+  :group 'languages)
+
+(defcustom coffee-tab-width tab-width
+  "The tab width to use when indenting."
+  :type 'integer
+  :group 'coffee)
+
+(defcustom coffee-command "coffee"
+  "The CoffeeScript command used for evaluating code."
+  :type 'string
+  :group 'coffee)
+
+(defcustom js2coffee-command "js2coffee"
+  "The js2coffee command used for evaluating code."
+  :type 'string
+  :group 'coffee)
+
+(defcustom coffee-args-repl '("-i")
+  "The arguments to pass to `coffee-command' to start a REPL."
+  :type 'list
+  :group 'coffee)
+
+(defcustom coffee-args-compile '("-c")
+  "The arguments to pass to `coffee-command' to compile a file."
+  :type 'list
+  :group 'coffee)
+
+(defcustom coffee-compiled-buffer-name "*coffee-compiled*"
+  "The name of the scratch buffer used for compiled CoffeeScript."
+  :type 'string
+  :group 'coffee)
+
+(defcustom coffee-compile-jump-to-error t
+  "Whether to jump to the first error if compilation fails.
+Please note that the coffee compiler doesn't always give a line
+number for the issue and in that case it is not possible to jump
+to the error."
+  :type 'boolean
+  :group 'coffee)
+
+(defcustom coffee-watch-buffer-name "*coffee-watch*"
+  "The name of the scratch buffer used when using the --watch flag
+with CoffeeScript."
+  :type 'string
+  :group 'coffee)
+
+(defcustom coffee-mode-hook nil
+  "Hook called by `coffee-mode'."
+  :type 'hook
+  :group 'coffee)
+
+(defvar coffee-mode-map (make-keymap)
+  "Keymap for CoffeeScript major mode.")
+
+;;
+;; Commands
+;;
+
+(defun coffee-repl ()
+  "Launch a CoffeeScript REPL using `coffee-command' as an inferior mode."
+  (interactive)
+
+  (unless (comint-check-proc "*CoffeeREPL*")
+    (set-buffer
+     (apply 'make-comint "CoffeeREPL"
+            coffee-command nil coffee-args-repl)))
+
+  (pop-to-buffer "*CoffeeREPL*"))
+
+(defun coffee-compiled-file-name (&optional filename)
+  "Returns the name of the JavaScript file compiled from a CoffeeScript file.
+If FILENAME is omitted, the current buffer's file name is used."
+  (concat (file-name-sans-extension (or filename (buffer-file-name))) ".js"))
+
+(defun coffee-compile-file ()
+  "Compiles and saves the current file to disk."
+  (interactive)
+  (let ((compiler-output (shell-command-to-string (coffee-command-compile (buffer-file-name)))))
+    (if (string= compiler-output "")
+        (message "Compiled and saved %s" (coffee-compiled-file-name))
+      (let* ((msg (car (split-string compiler-output "[\n\r]+")))
+             (line (and (string-match "on line \\([0-9]+\\)" msg)
+                        (string-to-number (match-string 1 msg)))))
+        (message msg)
+        (when (and coffee-compile-jump-to-error line (> line 0))
+          (goto-char (point-min))
+          (forward-line (1- line)))))))
+
+(defun coffee-compile-buffer ()
+  "Compiles the current buffer and displays the JavaScript in a buffer
+called `coffee-compiled-buffer-name'."
+  (interactive)
+  (save-excursion
+    (coffee-compile-region (point-min) (point-max))))
+
+(defun coffee-compile-region (start end)
+  "Compiles a region and displays the JavaScript in a buffer called
+`coffee-compiled-buffer-name'."
+  (interactive "r")
+
+  (let ((buffer (get-buffer coffee-compiled-buffer-name)))
+    (when buffer
+      (kill-buffer buffer)))
+
+  (apply (apply-partially 'call-process-region start end coffee-command nil
+                          (get-buffer-create coffee-compiled-buffer-name)
+                          nil)
+         (append coffee-args-compile (list "-s" "-p")))
+  (switch-to-buffer (get-buffer coffee-compiled-buffer-name))
+  (let ((buffer-file-name "tmp.js")) (set-auto-mode))
+  (goto-char (point-min)))
+
+(defun coffee-js2coffee-replace-region (start end)
+  "Convert JavaScript in the region into CoffeeScript."
+  (interactive "r")
+
+  (let ((buffer (get-buffer coffee-compiled-buffer-name)))
+    (when buffer
+      (kill-buffer buffer)))
+
+  (call-process-region start end
+                       js2coffee-command nil
+                       (current-buffer))
+  (delete-region start end))
+
+(defun coffee-version ()
+  "Show the `coffee-mode' version in the echo area."
+  (interactive)
+  (message (concat "coffee-mode version " coffee-mode-version)))
+
+(defun coffee-watch (dir-or-file)
+  "Run `coffee-run-cmd' with the --watch flag on a directory or file."
+  (interactive "fDirectory or File: ")
+  (let ((coffee-compiled-buffer-name coffee-watch-buffer-name)
+        (args (mapconcat 'identity (append coffee-args-compile (list "--watch" (expand-file-name dir-or-file))) " ")))
+    (coffee-run-cmd args)))
+
+;;
+;; Menubar
+;;
+
+(easy-menu-define coffee-mode-menu coffee-mode-map
+  "Menu for CoffeeScript mode"
+  '("CoffeeScript"
+    ["Compile File" coffee-compile-file]
+    ["Compile Buffer" coffee-compile-buffer]
+    ["Compile Region" coffee-compile-region]
+    ["REPL" coffee-repl]
+    "---"
+    ["Version" coffee-show-version]
+    ))
+
+;;
+;; Define Language Syntax
+;;
+
+;; String literals
+(defvar coffee-string-regexp "\"\\([^\\]\\|\\\\.\\)*?\"\\|'\\([^\\]\\|\\\\.\\)*?'")
+
+;; Instance variables (implicit this)
+(defvar coffee-this-regexp "@\\(\\w\\|_\\)*\\|this")
+
+;; Prototype::access
+(defvar coffee-prototype-regexp "\\(\\(\\w\\|\\.\\|_\\| \\|$\\)+?\\)::\\(\\(\\w\\|\\.\\|_\\| \\|$\\)+?\\):")
+
+;; Assignment
+(defvar coffee-assign-regexp "\\(\\(\\w\\|\\.\\|_\\|$\\)+?\s*\\):")
+
+;; Lambda
+(defvar coffee-lambda-regexp "\\((.+)\\)?\\s *\\(->\\|=>\\)")
+
+;; Namespaces
+(defvar coffee-namespace-regexp "\\b\\(class\\s +\\(\\S +\\)\\)\\b")
+
+;; Booleans
+(defvar coffee-boolean-regexp "\\b\\(true\\|false\\|yes\\|no\\|on\\|off\\|null\\|undefined\\)\\b")
+
+;; Regular Expressions
+(defvar coffee-regexp-regexp "\\/\\(\\\\.\\|\\[\\(\\\\.\\|.\\)+?\\]\\|[^/]\\)+?\\/")
+
+;; JavaScript Keywords
+(defvar coffee-js-keywords
+      '("if" "else" "new" "return" "try" "catch"
+        "finally" "throw" "break" "continue" "for" "in" "while"
+        "delete" "instanceof" "typeof" "switch" "super" "extends"
+        "class" "until" "loop"))
+
+;; Reserved keywords either by JS or CS.
+(defvar coffee-js-reserved
+      '("case" "default" "do" "function" "var" "void" "with"
+        "const" "let" "debugger" "enum" "export" "import" "native"
+        "__extends" "__hasProp"))
+
+;; CoffeeScript keywords.
+(defvar coffee-cs-keywords
+      '("then" "unless" "and" "or" "is"
+        "isnt" "not" "of" "by" "where" "when"))
+
+;; Regular expression combining the above three lists.
+(defvar coffee-keywords-regexp (regexp-opt
+                                (append
+                                 coffee-js-reserved
+                                 coffee-js-keywords
+                                 coffee-cs-keywords) 'words))
+
+
+;; Create the list for font-lock. Each class of keyword is given a
+;; particular face.
+(defvar coffee-font-lock-keywords
+  ;; *Note*: order below matters. `coffee-keywords-regexp' goes last
+  ;; because otherwise the keyword "state" in the function
+  ;; "state_entry" would be highlighted.
+  `((,coffee-string-regexp . font-lock-string-face)
+    (,coffee-this-regexp . font-lock-variable-name-face)
+    (,coffee-prototype-regexp . font-lock-variable-name-face)
+    (,coffee-assign-regexp . font-lock-type-face)
+    (,coffee-regexp-regexp . font-lock-constant-face)
+    (,coffee-boolean-regexp . font-lock-constant-face)
+    (,coffee-keywords-regexp . font-lock-keyword-face)))
+
+;;
+;; Helper Functions
+;;
+
+(defun coffee-comment-dwim (arg)
+  "Comment or uncomment current line or region in a smart way.
+For details, see `comment-dwim'."
+  (interactive "*P")
+  (require 'newcomment)
+  (let ((deactivate-mark nil) (comment-start "#") (comment-end ""))
+    (comment-dwim arg)))
+
+(defun coffee-command-compile (file-name)
+  "Run `coffee-command' to compile FILE."
+  (let ((full-file-name (expand-file-name file-name)))
+    (mapconcat 'identity (append (list coffee-command) coffee-args-compile (list full-file-name)) " ")))
+
+(defun coffee-run-cmd (args)
+  "Run `coffee-command' with the given arguments, and display the
+output in a compilation buffer."
+  (interactive "sArguments: ")
+  (let ((compilation-buffer-name-function (lambda (this-mode)
+                                            (generate-new-buffer-name coffee-compiled-buffer-name))))
+    (compile (concat coffee-command " " args))))
+
+;;
+;; imenu support
+;;
+
+;; This is a pretty naive but workable way of doing it. First we look
+;; for any lines that starting with `coffee-assign-regexp' that include
+;; `coffee-lambda-regexp' then add those tokens to the list.
+;;
+;; Should cover cases like these:
+;;
+;; minus: (x, y) -> x - y
+;; String::length: -> 10
+;; block: ->
+;;   print('potion')
+;;
+;; Next we look for any line that starts with `class' or
+;; `coffee-assign-regexp' followed by `{` and drop into a
+;; namespace. This means we search one indentation level deeper for
+;; more assignments and add them to the alist prefixed with the
+;; namespace name.
+;;
+;; Should cover cases like these:
+;;
+;; class Person
+;;   print: ->
+;;     print 'My name is ' + this.name + '.'
+;;
+;; class Policeman extends Person
+;;   constructor: (rank) ->
+;;     @rank: rank
+;;   print: ->
+;;     print 'My name is ' + this.name + " and I'm a " + this.rank + '.'
+;;
+;; TODO:
+;; app = {
+;;   window:  {width: 200, height: 200}
+;;   para:    -> 'Welcome.'
+;;   button:  -> 'OK'
+;; }
+
+(defun coffee-imenu-create-index ()
+  "Create an imenu index of all methods in the buffer."
+  (interactive)
+
+  ;; This function is called within a `save-excursion' so we're safe.
+  (goto-char (point-min))
+
+  (let ((index-alist '()) assign pos indent ns-name ns-indent)
+    ;; Go through every assignment that includes -> or => on the same
+    ;; line or starts with `class'.
+    (while (re-search-forward
+            (concat "^\\(\\s *\\)"
+                    "\\("
+                      coffee-assign-regexp
+                      ".+?"
+                      coffee-lambda-regexp
+                    "\\|"
+                      coffee-namespace-regexp
+                    "\\)")
+            (point-max)
+            t)
+
+      ;; If this is the start of a new namespace, save the namespace's
+      ;; indentation level and name.
+      (when (match-string 8)
+        ;; Set the name.
+        (setq ns-name (match-string 8))
+
+        ;; If this is a class declaration, add :: to the namespace.
+        (setq ns-name (concat ns-name "::"))
+
+        ;; Save the indentation level.
+        (setq ns-indent (length (match-string 1))))
+
+      ;; If this is an assignment, save the token being
+      ;; assigned. `Please.print:` will be `Please.print`, `block:`
+      ;; will be `block`, etc.
+      (when (setq assign (match-string 3))
+          ;; The position of the match in the buffer.
+          (setq pos (match-beginning 3))
+
+          ;; The indent level of this match
+          (setq indent (length (match-string 1)))
+
+          ;; If we're within the context of a namespace, add that to the
+          ;; front of the assign, e.g.
+          ;; constructor: => Policeman::constructor
+          (when (and ns-name (> indent ns-indent))
+            (setq assign (concat ns-name assign)))
+
+          ;; Clear the namespace if we're no longer indented deeper
+          ;; than it.
+          (when (and ns-name (<= indent ns-indent))
+            (setq ns-name nil)
+            (setq ns-indent nil))
+
+          ;; Add this to the alist. Done.
+          (push (cons assign pos) index-alist)))
+
+    ;; Return the alist.
+    index-alist))
+
+;;
+;; Indentation
+;;
+
+;;; The theory is explained in the README.
+
+(defun coffee-indent-line ()
+  "Indent current line as CoffeeScript."
+  (interactive)
+
+  (if (= (point) (point-at-bol))
+      (insert-tab)
+    (save-excursion
+      (let ((prev-indent (coffee-previous-indent))
+            (cur-indent (current-indentation)))
+        ;; Shift one column to the left
+        (beginning-of-line)
+        (insert-tab)
+
+        (when (= (point-at-bol) (point))
+          (forward-char coffee-tab-width))
+
+        ;; We're too far, remove all indentation.
+        (when (> (- (current-indentation) prev-indent) coffee-tab-width)
+          (backward-to-indentation 0)
+          (delete-region (point-at-bol) (point)))))))
+
+(defun coffee-previous-indent ()
+  "Return the indentation level of the previous non-blank line."
+  (save-excursion
+    (forward-line -1)
+    (if (bobp)
+        0
+      (progn
+        (while (and (looking-at "^[ \t]*$") (not (bobp))) (forward-line -1))
+        (current-indentation)))))
+
+(defun coffee-newline-and-indent ()
+  "Insert a newline and indent it to the same level as the previous line."
+  (interactive)
+
+  ;; Remember the current line indentation level,
+  ;; insert a newline, and indent the newline to the same
+  ;; level as the previous line.
+  (let ((prev-indent (current-indentation)) (indent-next nil))
+    (delete-horizontal-space t)
+    (newline)
+    (insert-tab (/ prev-indent coffee-tab-width))
+
+    ;; We need to insert an additional tab because the last line was special.
+    (when (coffee-line-wants-indent)
+      (insert-tab)))
+
+  ;; Last line was a comment so this one should probably be,
+  ;; too. Makes it easy to write multi-line comments (like the one I'm
+  ;; writing right now).
+  (when (coffee-previous-line-is-comment)
+    (insert "# ")))
+
+;; Indenters help determine whether the current line should be
+;; indented further based on the content of the previous line. If a
+;; line starts with `class', for instance, you're probably going to
+;; want to indent the next line.
+
+(defvar coffee-indenters-bol '("class" "for" "if" "try")
+  "Keywords or syntax whose presence at the start of a line means the
+next line should probably be indented.")
+
+(defun coffee-indenters-bol-regexp ()
+  "Builds a regexp out of `coffee-indenters-bol' words."
+  (regexp-opt coffee-indenters-bol 'words))
+
+(defvar coffee-indenters-eol '(?> ?{ ?\[)
+  "Single characters at the end of a line that mean the next line
+should probably be indented.")
+
+(defun coffee-line-wants-indent ()
+  "Return t if the current line should be indented relative to the
+previous line."
+  (interactive)
+
+  (save-excursion
+    (let ((indenter-at-bol) (indenter-at-eol))
+      ;; Go back a line and to the first character.
+      (forward-line -1)
+      (backward-to-indentation 0)
+
+      ;; If the next few characters match one of our magic indenter
+      ;; keywords, we want to indent the line we were on originally.
+      (when (looking-at (coffee-indenters-bol-regexp))
+        (setq indenter-at-bol t))
+
+      ;; If that didn't match, go to the back of the line and check to
+      ;; see if the last character matches one of our indenter
+      ;; characters.
+      (when (not indenter-at-bol)
+        (end-of-line)
+
+        ;; Optimized for speed - checks only the last character.
+        (let ((indenters coffee-indenters-eol))
+          (while indenters
+            (if (/= (char-before) (car indenters))
+                (setq indenters (cdr indenters))
+              (setq indenter-at-eol t)
+              (setq indenters nil)))))
+
+      ;; If we found an indenter, return `t'.
+      (or indenter-at-bol indenter-at-eol))))
+
+(defun coffee-previous-line-is-comment ()
+  "Return t if the previous line is a CoffeeScript comment."
+  (save-excursion
+    (forward-line -1)
+    (coffee-line-is-comment)))
+
+(defun coffee-line-is-comment ()
+  "Return t if the current line is a CoffeeScript comment."
+  (save-excursion
+    (backward-to-indentation 0)
+    (= (char-after) (string-to-char "#"))))
+
+;;
+;; Define Major Mode
+;;
+
+;;;###autoload
+(define-derived-mode coffee-mode fundamental-mode
+  "Coffee"
+  "Major mode for editing CoffeeScript."
+
+  ;; key bindings
+  (define-key coffee-mode-map (kbd "A-r") 'coffee-compile-buffer)
+  (define-key coffee-mode-map (kbd "A-R") 'coffee-compile-region)
+  (define-key coffee-mode-map (kbd "A-M-r") 'coffee-repl)
+  (define-key coffee-mode-map [remap comment-dwim] 'coffee-comment-dwim)
+  (define-key coffee-mode-map "\C-m" 'coffee-newline-and-indent)
+  (define-key coffee-mode-map "\C-c\C-o\C-s" 'coffee-cos-mode)
+
+  ;; code for syntax highlighting
+  (setq font-lock-defaults '((coffee-font-lock-keywords)))
+
+  ;; perl style comment: "# ..."
+  (modify-syntax-entry ?# "< b" coffee-mode-syntax-table)
+  (modify-syntax-entry ?\n "> b" coffee-mode-syntax-table)
+  (make-local-variable 'comment-start)
+  (setq comment-start "#")
+
+  ;; single quote strings
+  (modify-syntax-entry ?' "\"" coffee-mode-syntax-table)
+
+  ;; indentation
+  (make-local-variable 'indent-line-function)
+  (setq indent-line-function 'coffee-indent-line)
+  (set (make-local-variable 'tab-width) coffee-tab-width)
+
+  ;; imenu
+  (make-local-variable 'imenu-create-index-function)
+  (setq imenu-create-index-function 'coffee-imenu-create-index)
+
+  ;; no tabs
+  (setq indent-tabs-mode nil))
+
+;;
+;; Compile-on-Save minor mode
+;;
+
+(defvar coffee-cos-mode-line " CoS")
+(make-variable-buffer-local 'coffee-cos-mode-line)
+
+(define-minor-mode coffee-cos-mode
+  "Toggle compile-on-save for coffee-mode."
+  :group 'coffee-cos :lighter coffee-cos-mode-line
+  (cond
+   (coffee-cos-mode
+    (add-hook 'after-save-hook 'coffee-compile-file nil t))
+   (t
+    (remove-hook 'after-save-hook 'coffee-compile-file t))))
+
+(provide 'coffee-mode)
+
+;;
+;; On Load
+;;
+
+;; Run coffee-mode for files ending in .coffee.
+;;;###autoload
+(add-to-list 'auto-mode-alist '("\\.coffee$" . coffee-mode))
+;;;###autoload
+(add-to-list 'auto-mode-alist '("Cakefile" . coffee-mode))
+;;; coffee-mode.el ends here
diff --git a/packages/coffee-mode/examples/basic.coffee b/packages/coffee-mode/examples/basic.coffee
new file mode 100644 (file)
index 0000000..d275632
--- /dev/null
@@ -0,0 +1,118 @@
+# These examples are taken from
+# http://jashkenas.github.com/coffee-script/
+
+song = ["do", "re", "mi", "fa", "so"]
+
+ages = {
+  max: 10
+  ida: 9
+  tim: 11
+}
+
+matrix = [
+  1, 0, 1
+  0, 0, 1
+  1, 1, 0
+]
+
+eldest = if 24 > 21 then "Liz" else "Ike"
+
+six = (one = 1) + (two = 2) + (three = 3)
+
+My.mood = greatly_improved if true
+
+# Unfancy JavaScript
+if happy and knows_it
+  cha_cha_cha()
+  false
+
+Account = (customer, cart) ->
+  @customer: customer
+  @cart: cart
+
+  $('.shopping_cart').bind 'click', (event) =>
+    @customer.purchase @cart
+
+class Animal
+  move: (meters) ->
+    alert @name + " moved " + meters + "m."
+
+  randomify: ->
+    @name.replace(/^[\w_-]*$/g, "-")
+
+class Snake extends Animal
+  constructor: (name) ->
+    @name: name
+
+  move: ->
+    alert "Slithering..."
+    super 5
+
+class Horse extends Animal
+  constructor: (name) ->
+    @name: name
+
+  move: ->
+    alert "Galloping..."
+    super 45
+
+sam = new Snake "Sammy the Python"
+tom = new Horse "Tommy the Palomino"
+
+sam.move()
+tom.move()
+if car.speed < speed_limit then accelerate()
+
+print "My name is " + @name
+
+gold = silver = the_field = "unknown"
+
+award_medals = (first, second, rest...) ->
+  gold:       first
+  silver:     second
+  the_field:  rest
+
+contenders = [
+  "Michael Phelps"
+  "Liu Xiang"
+]
+
+award_medals contenders...
+
+alert "Gold: " + gold
+alert "Silver: " + silver
+alert "The Field: " + the_field
+
+# Eat lunch.
+# what up
+# love it.
+lunch = eat food for food in ['toast', 'cheese', 'wine']
+
+$('#demo').click ->
+  asd
+# sup
+  # asd
+  # asdasd
+blah = true
+
+okay
+
+
+# Naive collision detection.
+for roid in asteroids
+  for roid2 in asteroids when roid isnt roid2
+    roid.explode() if roid.overlaps roid2
+
+years_old = max: 10, ida: 9, tim: 11
+
+ages = for child, age of years_old
+  child + " is " + age
+
+grade = (student) ->
+  if student.excellent_work
+    "A+"
+  else if student.okay_stuff
+    if student.tried_hard then "B" else "B-"
+  else
+    "C"
+
diff --git a/packages/coffee-mode/examples/edge.coffee b/packages/coffee-mode/examples/edge.coffee
new file mode 100644 (file)
index 0000000..7682a58
--- /dev/null
@@ -0,0 +1,16 @@
+# Edge cases
+
+if string.match /\// or string.match /\x1b/ or string.match /a\/b/
+  console.log "matched"
+
+string = "Something with a \"double quote"
+console.log string
+
+string = 'Something with a \'single quote'
+console.log string
+
+# TODO
+heredoc = """
+  Heredoc with a " double quote
+"""
+console.log heredoc
diff --git a/packages/coffee-mode/examples/imenu.coffee b/packages/coffee-mode/examples/imenu.coffee
new file mode 100644 (file)
index 0000000..fdf0025
--- /dev/null
@@ -0,0 +1,33 @@
+# Testing imenu
+regexp = /asdas/
+two = 4 / 2
+
+minus = (x, y) -> x - y
+
+String::length = -> 10
+
+class Person
+  print: ->
+    print 'My name is ' + this.name + '.'
+
+app =
+  window:  {width: 200, height: 200}
+  para:    'Welcome.'
+  button:  'OK'
+
+block = ->
+  print('potion')
+
+Please = {}
+Please.print = (word) ->
+  print(word)
+
+HomePage::get = (url) ->
+  session: url.query.session if url.query?
+
+class Policeman extends Person
+  constructor: (rank) ->
+    @rank: rank
+
+  print: ->
+    print 'My name is ' + this.name + " and I'm a " + this.rank + '.'
diff --git a/packages/company/.dir-locals.el b/packages/company/.dir-locals.el
new file mode 100644 (file)
index 0000000..79d9a12
--- /dev/null
@@ -0,0 +1,4 @@
+((nil . ((indent-tabs-mode . nil)
+         (fill-column . 80)
+         (sentence-end-double-space . t)
+         (emacs-lisp-docstring-fill-column . 75))))
diff --git a/packages/company/.gitignore b/packages/company/.gitignore
new file mode 100644 (file)
index 0000000..2ecd291
--- /dev/null
@@ -0,0 +1,2 @@
+*.elc
+ert.el
diff --git a/packages/company/.travis.yml b/packages/company/.travis.yml
new file mode 100644 (file)
index 0000000..cdf55d1
--- /dev/null
@@ -0,0 +1,32 @@
+# https://github.com/rolandwalker/emacs-travis
+
+language: emacs-lisp
+
+env:
+  matrix:
+    - EMACS=emacs23
+    - EMACS=emacs24
+    - EMACS=emacs-snapshot
+
+install:
+  - if [ "$EMACS" = "emacs23" ]; then
+        sudo apt-get update -qq &&
+        sudo apt-get install -qq emacs23-gtk emacs23-el;
+    fi
+  - if [ "$EMACS" = "emacs24" ]; then
+        sudo add-apt-repository -y ppa:cassou/emacs &&
+        sudo apt-get update -qq &&
+        sudo apt-get install -qq emacs24 emacs24-el;
+    fi
+  - if [ "$EMACS" = "emacs-snapshot" ]; then
+        sudo add-apt-repository -y ppa:cassou/emacs &&
+        sudo apt-get update -qq &&
+        sudo apt-get install -qq emacs-snapshot &&
+        sudo apt-get install -qq emacs-snapshot-el emacs-snapshot-gtk;
+    fi
+
+before_script:
+  make downloads
+
+script:
+  make test-batch EMACS=${EMACS}
diff --git a/packages/company/Makefile b/packages/company/Makefile
new file mode 100644 (file)
index 0000000..f11b04e
--- /dev/null
@@ -0,0 +1,37 @@
+EMACS=emacs
+CURL=curl --silent
+ERT_URL=http://git.savannah.gnu.org/cgit/emacs.git/plain/lisp/emacs-lisp/ert.el?h=emacs-24
+
+.PHONY: ert test test-batch
+
+package: *.el
+       @ver=`grep -o "Version: .*" company.el | cut -c 10-`; \
+       tar cjvf company-$$ver.tar.bz2 --mode 644 `git ls-files '*.el' | xargs`
+
+elpa: *.el
+       @version=`grep -o "Version: .*" company.el | cut -c 10-`; \
+       dir=company-$$version; \
+       mkdir -p "$$dir"; \
+       cp `git ls-files '*.el' | xargs` company-$$version; \
+       echo "(define-package \"company\" \"$$version\" \
+       \"Modular in-buffer completion framework\")" \
+       > "$$dir"/company-pkg.el; \
+       tar cvf company-$$version.tar --mode 644 "$$dir"
+
+clean:
+       @rm -rf company-*/ company-*.tar company-*.tar.bz2 *.elc ert.el
+
+test:
+       ${EMACS} -Q -nw -L . -l company-tests.el \
+       --eval "(let (pop-up-windows) (ert t))"
+
+test-batch:
+       ${EMACS} -Q --batch -L . -l company-tests.el \
+       --eval "(ert-run-tests-batch-and-exit '(not (tag interactive)))"
+
+downloads:
+       ${EMACS} -Q --batch -l ert || \
+       ${CURL} ${ERT_URL} > ert.el
+
+compile:
+       ${EMACS} -Q --batch -L . -f batch-byte-compile company.el company-*.el
diff --git a/packages/company/NEWS.md b/packages/company/NEWS.md
new file mode 100644 (file)
index 0000000..64860ba
--- /dev/null
@@ -0,0 +1,179 @@
+# History of user-visible changes
+
+## 2013-05-26 (0.6.10)
+
+* Plays nicer with `org-indent-mode`.
+* Works in horizontally scrolled windows.
+
+## 2013-05-10 (0.6.9)
+
+* `company-capf` respects `:exit-function` completion property.
+* `company-backends`: `prefix` command can return `t` in the cdr.
+* `company-clang-begin-after-member-access`: New option.
+* Mouse click outside the tooltip aborts completion.
+* `company-clang` uses standard input to pass the contents of current buffer to
+  Clang 2.9+, otherwise saves the buffer and passes the path to the file.
+* `company-clang-auto-save` option has been removed.
+* Better interaction with `outline-minor-mode`.
+* `company-dabbrev-code` supports all `prog-mode` derivatives.
+
+## 2013-04-16 (0.6.8)
+
+* `company-auto-complete` is disabled by default.
+* `company-auto-complete-chars` default value includes fewer syntax classes.
+* In expanded function calls, arguments skipped by the user default to "argN".
+* `company-eclim` and `company-clang` do not strip argument types from fields.
+* `company-clang` expands function calls for all three modes now.
+* `company-clang` supports `c++-mode` by default.
+
+## 2013-04-05 (0.6.7)
+
+* Two `company-elisp` tweaks.
+
+## 2013-04-01 (0.6.6)
+
+* `company-elisp` doesn't offer completions when typing the name and the
+  arguments of a new function or macro definition, allowing to fall back to
+  other back-ends like `company-dabbrev-code`.
+
+## 2013-03-30 (0.6.5)
+
+* Fixed keybindings when running in a terminal.
+* `company-elisp-show-locals-first`: new customizable variable.
+* `company-elisp` shows more accurate and comprehensive candidates list.
+
+## 2013-03-26 (0.6.4)
+
+* `company-eclim` shows valid completions after an opening paren.
+* Expanded template does not get removed until the point leaves it.  After your
+  input the last argument in a method call expanded by `company-eclim`, you can
+  press `<tab>` once more, to jump after the closing paren.  No other bundled
+  back-ends are affected.
+
+## 2013-03-25 (0.6.3)
+
+* New tooltip face colors used on themes with light background.
+* Pseudo-tooltip stays up-to-date when text is inserted after the point.
+* Fixed `company-require-match` mechanics.
+
+## 2013-03-24 (0.6.2)
+
+* `global-company-mode` is now autoloaded.
+
+## 2013-03-23 (0.6.1)
+
+* Documented `init` and `post-completion` back-end commands.
+* `company-eclim` and `company-clang` only expand the template on explicit user
+  action (such as `company-complete-{selection,number,mouse}`).
+* `company-template` has some breaking changes.  When point is at one of the
+  fields, it's displayed at the beginning, not right after it; `<tab>` jumps to
+  the next field, `forward-word` and `subword-forward` remappings are removed;
+  when you jump to the next field, if the current one hasn't been edited, the
+  overlay gets removed but the text remains.
+* `company-eclim` shows method overloads and expands templates for calls.
+* `company-clang-objc-templatify` does not insert spaces after colons anymore.
+* `company-clang` is now only initialized in supported buffers.
+  So, no error messages if you don't have Clang until you open a C file.
+* `company-clang` recognizes Clang included in recent Xcode.
+* New commands `company-select-previous-or-abort` and
+  `company-select-next-or-abort`, bound to `<up>` and `<down>`.
+
+## 2013-03-19 (0.6)
+
+* Across-the-board bugfixing.
+* `company-pysmell` is not used by default anymore.
+* Loading of `nxml`, `semantic`, `pymacs` and `ropemacs` is now deferred.
+* Candidates from grouped back-ends are merged more conservatively: only
+  back-ends that return the same prefix at point are used.
+* `company-clang` now shows meta information, too.
+* Some performance improvements.
+* Fixed two old tooltip annoyances.
+* Instead of `overrriding-terminal-local-map`, we're now using
+  `emulation-mode-map-alists` (experimental).  This largely means that when the
+  completion keymap is active, other minor modes' keymaps are still used, so,
+  for example, it's not as easy to accidentally circumvent `paredit-mode`
+  when it's enabled.
+* `company-elisp` has seen some improvements.
+* Added `company-capf`: completion adapter using
+  `completion-at-point-functions`.  (Stefan Monnier)
+* Clang completions now include macros and are case-sensitive.
+* Switching between tag files now works correctly with `company-etags`.
+
+## 2010-02-24 (0.5)
+
+* `company-ropemacs` now provides location and docs.  (Fernando H. Silva)
+* Added `company-with-candidate-inserted` macro.
+* Added `company-clang` back-end.
+* Added new mechanism for non-consecutive insertion.
+  (So far only used by clang for ObjC.)
+* The semantic back-end now shows meta information for local symbols.
+* Added compatibility for CEDET in Emacs 23.2 and from CVS.  (Oleg Andreev)
+
+## 2009-05-07 (0.4.3)
+
+* Added `company-other-backend`.
+* Idle completion no longer interrupts multi-key command input.
+* Added `company-ropemacs` and `company-pysmell` back-ends.
+
+## 2009-04-25 (0.4.2)
+
+* In C modes . and -> now count towards `company-minimum-prefix-length`.
+* Reverted default front-end back to `company-preview-if-just-one-frontend`.
+* The pseudo tooltip will no longer be clipped at the right window edge.
+* Added `company-tooltip-minimum`.
+* Windows compatibility fixes.
+
+## 2009-04-19 (0.4.1)
+
+* Added `global-company-mode`.
+* Performance enhancements.
+* Added `company-eclim` back-end.
+* Added safer workaround for Emacs `posn-col-row` bug.
+
+## 2009-04-18 (0.4)
+
+* Automatic completion is now aborted if the prefix gets too short.
+* Added option `company-dabbrev-time-limit`.
+* `company-backends` now supports merging back-ends.
+* Added back-end `company-dabbrev-code` for generic code.
+* Fixed `company-begin-with`.
+
+## 2009-04-15 (0.3.1)
+
+* Added 'stop prefix to prevent dabbrev from completing inside of symbols.
+* Fixed issues with tabbar-mode and line-spacing.
+* Performance enhancements.
+
+## 2009-04-12 (0.3)
+
+* Added `company-begin-commands` option.
+* Added abbrev, tempo and Xcode back-ends.
+* Back-ends are now interactive.  You can start them with M-x backend-name.
+* Added `company-begin-with` for starting company from elisp-code.
+* Added hooks.
+* Added `company-require-match` and `company-auto-complete` options.
+
+## 2009-04-05 (0.2.1)
+
+* Improved Emacs Lisp back-end behavior for local variables.
+* Added `company-elisp-detect-function-context` option.
+* The mouse can now be used for selection.
+
+## 2009-03-22 (0.2)
+
+* Added `company-show-location`.
+* Added etags back-end.
+* Added work-around for end-of-buffer bug.
+* Added `company-filter-candidates`.
+* More local Lisp variables are now included in the candidates.
+
+## 2009-03-21 (0.1.5)
+
+* Fixed elisp documentation buffer always showing the same doc.
+* Added `company-echo-strip-common-frontend`.
+* Added `company-show-numbers` option and M-0 ... M-9 default bindings.
+* Don't hide the echo message if it isn't shown.
+
+## 2009-03-20 (0.1)
+
+* Initial release.
diff --git a/packages/company/README.md b/packages/company/README.md
new file mode 100644 (file)
index 0000000..4f79bbc
--- /dev/null
@@ -0,0 +1,4 @@
+See the [homepage](http://company-mode.github.com/).
+[![githalytics.com alpha](https://cruel-carlota.pagodabox.com/336ef4be2595a7859d52e2c17b7da2b2 "githalytics.com")](http://githalytics.com/company-mode/company-mode)
+
+[![Build Status](https://travis-ci.org/company-mode/company-mode.png?branch=master)](https://travis-ci.org/company-mode/company-mode)
diff --git a/packages/company/company-abbrev.el b/packages/company/company-abbrev.el
new file mode 100644 (file)
index 0000000..0c4e327
--- /dev/null
@@ -0,0 +1,51 @@
+;;; company-abbrev.el --- company-mode completion back-end for abbrev
+
+;; Copyright (C) 2009-2011  Free Software Foundation, Inc.
+
+;; Author: Nikolaj Schumacher
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+
+;;; Commentary:
+;;
+
+;;; Code:
+
+(require 'company)
+(eval-when-compile (require 'cl))
+(require 'abbrev)
+
+(defun company-abbrev-insert (match)
+  "Replace MATCH with the expanded abbrev."
+  (expand-abbrev))
+
+;;;###autoload
+(defun company-abbrev (command &optional arg &rest ignored)
+  "`company-mode' completion back-end for abbrev."
+  (interactive (list 'interactive))
+  (case command
+    (interactive (company-begin-backend 'company-abbrev
+                                        'company-abbrev-insert))
+    (prefix (company-grab-symbol))
+    (candidates (nconc
+                 (delete "" (all-completions arg global-abbrev-table))
+                 (delete "" (all-completions arg local-abbrev-table))))
+    (meta (abbrev-expansion arg))
+    (require-match t)))
+
+(provide 'company-abbrev)
+;;; company-abbrev.el ends here
diff --git a/packages/company/company-capf.el b/packages/company/company-capf.el
new file mode 100644 (file)
index 0000000..60e4494
--- /dev/null
@@ -0,0 +1,80 @@
+;;; company-capf.el --- company-mode completion-at-point-functions back-end -*- lexical-binding: t -*-
+
+;; Copyright (C) 2013  Free Software Foundation, Inc.
+
+;; Author: Stefan Monnier <monnier@iro.umontreal.ca>
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+
+;;; Commentary:
+;;
+
+;;; Code:
+
+(defun company--capf-data ()
+  (let ((data (run-hook-wrapped 'completion-at-point-functions
+                                ;; Ignore misbehaving functions.
+                                #'completion--capf-wrapper 'optimist)))
+    (when (consp data) data)))
+
+(defun company-capf (command &optional arg &rest _args)
+  "`company-mode' back-end using `completion-at-point-functions'.
+Requires Emacs 24.1 or newer."
+  (interactive (list 'interactive))
+  (case command
+    (interactive (company-begin-backend 'company-capf))
+    (prefix
+     (let ((res (company--capf-data)))
+       (when res
+         (if (> (nth 2 res) (point))
+             'stop
+           (buffer-substring-no-properties (nth 1 res) (point))))))
+    (candidates
+     (let ((res (company--capf-data)))
+       (when res
+         (let* ((table (nth 3 res))
+                (pred (plist-get (nthcdr 4 res) :predicate))
+                (meta (completion-metadata
+                       (buffer-substring (nth 1 res) (nth 2 res))
+                       table pred))
+                (sortfun (cdr (assq 'display-sort-function meta)))
+                (candidates (all-completions arg table pred)))
+           (if sortfun (funcall sortfun candidates) candidates)))))
+    (sorted
+     (let ((res (company--capf-data)))
+       (when res
+         (let ((meta (completion-metadata
+                      (buffer-substring (nth 1 res) (nth 2 res))
+                      (nth 3 res) (plist-get (nthcdr 4 res) :predicate))))
+           (cdr (assq 'display-sort-function meta))))))
+    (duplicates nil)     ;Don't bother.
+    (no-cache t)         ;FIXME: Improve!
+    (meta nil)           ;FIXME: Return one-line docstring for `arg'.
+    (doc-buffer nil)     ;FIXME: Return help buffer for `arg'.
+    (location nil)       ;FIXME: Return (BUF . POS) or (FILE . LINENB) of `arg'.
+    (require-match nil)  ;Front-ends should also have a say in this.
+    (init nil)       ;Don't bother: plenty of other ways to initialize the code.
+    (post-completion
+     (let* ((res (company--capf-data))
+            (exit-function (plist-get (nthcdr 4 res) :exit-function)))
+       (if exit-function
+           (funcall exit-function arg 'finished))))
+    ))
+
+(provide 'company-capf)
+
+;;; company-capf.el ends here
diff --git a/packages/company/company-clang.el b/packages/company/company-clang.el
new file mode 100644 (file)
index 0000000..52bb6e6
--- /dev/null
@@ -0,0 +1,297 @@
+;;; company-clang.el --- company-mode completion back-end for Clang
+
+;; Copyright (C) 2009, 2011, 2013  Free Software Foundation, Inc.
+
+;; Author: Nikolaj Schumacher
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+
+;;; Commentary:
+;;
+
+;;; Code:
+
+(require 'company)
+(require 'company-template)
+(eval-when-compile (require 'cl))
+
+(defgroup company-clang nil
+  "Completion back-end for Clang."
+  :group 'company)
+
+(defcustom company-clang-executable
+  (executable-find "clang")
+  "Location of clang executable."
+  :type 'file)
+
+(defcustom company-clang-begin-after-member-access t
+  "When non-nil, automatic completion will start whenever the current
+symbol is preceded by \".\", \"->\" or \"::\", ignoring
+`company-minimum-prefix-length'.
+
+If `company-begin-commands' is a list, it should include `c-electric-lt-gt'
+and `c-electric-colon', for automatic completion right after \">\" and
+\":\".")
+
+(defcustom company-clang-arguments nil
+  "Additional arguments to pass to clang when completing.
+Prefix files (-include ...) can be selected with `company-clang-set-prefix'
+or automatically through a custom `company-clang-prefix-guesser'."
+  :type '(repeat (string :tag "Argument" nil)))
+
+(defcustom company-clang-prefix-guesser 'company-clang-guess-prefix
+  "A function to determine the prefix file for the current buffer."
+  :type '(function :tag "Guesser function" nil))
+
+(defvar company-clang-modes '(c-mode c++-mode objc-mode)
+  "Major modes which clang may complete.")
+
+;; prefix ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defvar company-clang--prefix nil)
+
+(defsubst company-clang--guess-pch-file (file)
+  (let ((dir (directory-file-name (file-name-directory file))))
+    (when (equal (file-name-nondirectory dir) "Classes")
+      (setq dir (file-name-directory dir)))
+    (car (directory-files dir t "\\([^.]h\\|[^h]\\).pch\\'" t))))
+
+(defsubst company-clang--file-substring (file beg end)
+  (with-temp-buffer
+    (insert-file-contents-literally file nil beg end)
+    (buffer-string)))
+
+(defun company-clang-guess-prefix ()
+  "Try to guess the prefix file for the current buffer."
+  ;; Prefixes seem to be called .pch.  Pre-compiled headers do, too.
+  ;; So we look at the magic number to rule them out.
+  (let* ((file (company-clang--guess-pch-file buffer-file-name))
+         (magic-number (and file (company-clang--file-substring file 0 4))))
+    (unless (member magic-number '("CPCH" "gpch"))
+      file)))
+
+(defun company-clang-set-prefix (&optional prefix)
+  "Use PREFIX as a prefix (-include ...) file for clang completion."
+  (interactive (let ((def (funcall company-clang-prefix-guesser)))
+     (unless (stringp def)
+       (setq def default-directory))
+     (list (read-file-name "Prefix file: "
+                           (when def (file-name-directory def))
+                           def t (when def (file-name-nondirectory def))))))
+  ;; TODO: pre-compile?
+  (setq company-clang--prefix (and (stringp prefix)
+                                   (file-regular-p prefix)
+                                   prefix)))
+
+;; Clean-up on exit.
+(add-hook 'kill-emacs-hook 'company-clang-set-prefix)
+
+;; parsing ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;; TODO: Handle Pattern (syntactic hints would be neat).
+;; Do we ever see OVERLOAD (or OVERRIDE)?
+(defconst company-clang--completion-pattern
+  "^COMPLETION: \\_<\\(%s[a-zA-Z0-9_:]*\\)\\(?: : \\(.*\\)$\\)?$")
+
+(defconst company-clang--error-buffer-name "*clang error*")
+
+(defvar company-clang--meta-cache nil)
+
+(defun company-clang--lang-option ()
+     (if (eq major-mode 'objc-mode)
+         (if (string= "m" (file-name-extension buffer-file-name))
+             "objective-c" "objective-c++")
+       (substring (symbol-name major-mode) 0 -5)))
+
+(defun company-clang--parse-output (prefix objc)
+  (goto-char (point-min))
+  (let ((pattern (format company-clang--completion-pattern
+                         (regexp-quote prefix)))
+        (case-fold-search nil)
+        lines match)
+    (setq company-clang--meta-cache (make-hash-table :test 'equal))
+    (while (re-search-forward pattern nil t)
+      (setq match (match-string-no-properties 1))
+      (unless (equal match "Pattern")
+        (let ((meta (match-string-no-properties 2)))
+          (when (and meta (not (string= match meta)))
+            (setq meta (company-clang--strip-formatting meta))
+            (when (and (not objc) (string-match "\\((.*)\\)" meta))
+              (setq match (concat match (match-string 1 meta))))
+            (puthash match meta company-clang--meta-cache)))
+        (push match lines)))
+    lines))
+
+(defun company-clang--strip-formatting (text)
+  (replace-regexp-in-string
+   "#]" " "
+   (replace-regexp-in-string "[<{[]#\\|#[>}]" "" text t)
+   t))
+
+(defun company-clang--handle-error (res args)
+  (goto-char (point-min))
+  (let* ((buf (get-buffer-create company-clang--error-buffer-name))
+         (cmd (concat company-clang-executable (mapconcat 'identity args " ")))
+         (pattern (format company-clang--completion-pattern ""))
+         (err (if (re-search-forward pattern nil t)
+                  (buffer-substring-no-properties (point-min)
+                                                  (1- (match-beginning 0)))
+                ;; Warn the user more aggressively if no match was found.
+                (message "clang failed with error %d:\n%s" res cmd)
+                (buffer-string))))
+
+    (with-current-buffer buf
+      (let ((inhibit-read-only t))
+        (erase-buffer)
+        (insert (current-time-string)
+                (format "\nclang failed with error %d:\n" res)
+                cmd "\n\n")
+        (insert err)
+        (setq buffer-read-only t)
+        (goto-char (point-min))))))
+
+(defun company-clang--call-process (prefix &rest args)
+  (let ((objc (derived-mode-p 'objc-mode))
+        (buf (get-buffer-create "*clang-output*"))
+        res)
+    (with-current-buffer buf (erase-buffer))
+    (setq res (if (company-clang--auto-save-p)
+                  (apply 'call-process company-clang-executable nil buf nil args)
+                (apply 'call-process-region (point-min) (point-max)
+                       company-clang-executable nil buf nil args)))
+    (with-current-buffer buf
+      (unless (eq 0 res)
+        (company-clang--handle-error res args))
+      ;; Still try to get any useful input.
+      (company-clang--parse-output prefix objc))))
+
+(defsubst company-clang--build-location (pos)
+  (save-excursion
+    (goto-char pos)
+    (format "%s:%d:%d"
+            (if (company-clang--auto-save-p) buffer-file-name "-")
+            (line-number-at-pos)
+            (1+ (current-column)))))
+
+(defsubst company-clang--build-complete-args (pos)
+  (append '("-cc1" "-fsyntax-only" "-code-completion-macros")
+          (unless (company-clang--auto-save-p)
+            (list "-x" (company-clang--lang-option)))
+          company-clang-arguments
+          (when (stringp company-clang--prefix)
+            (list "-include" (expand-file-name company-clang--prefix)))
+          '("-code-completion-at")
+          (list (company-clang--build-location pos))
+          (list (if (company-clang--auto-save-p) buffer-file-name "-"))))
+
+(defun company-clang--candidates (prefix)
+  (and (company-clang--auto-save-p)
+       (buffer-modified-p)
+       (basic-save-buffer))
+  (when (null company-clang--prefix)
+    (company-clang-set-prefix (or (funcall company-clang-prefix-guesser)
+                                  'none)))
+  (apply 'company-clang--call-process
+         prefix
+         (company-clang--build-complete-args (- (point) (length prefix)))))
+
+(defun company-clang--prefix ()
+  (let ((symbol (company-grab-symbol)))
+    (if symbol
+        (if (and company-clang-begin-after-member-access
+                 (save-excursion
+                   (forward-char (- (length symbol)))
+                   (looking-back "\\.\\|->\\|::" (- (point) 2))))
+            (cons symbol t)
+          symbol)
+      'stop)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defconst company-clang-required-version 1.1)
+
+(defvar company-clang--version nil)
+
+(defun company-clang--auto-save-p ()
+  (< company-clang--version 2.9))
+
+(defsubst company-clang-version ()
+  "Return the version of `company-clang-executable'."
+  (with-temp-buffer
+    (call-process company-clang-executable nil t nil "--version")
+    (goto-char (point-min))
+    (if (re-search-forward "clang\\(?: version \\|-\\)\\([0-9.]+\\)" nil t)
+        (let ((ver (string-to-number (match-string-no-properties 1))))
+          (if (> ver 100)
+              (/ ver 100)
+            ver))
+      0)))
+
+(defun company-clang-objc-templatify (selector)
+  (let* ((end (point-marker))
+         (beg (- (point) (length selector)))
+         (templ (company-template-declare-template beg end))
+         (cnt 0))
+    (save-excursion
+      (goto-char beg)
+      (catch 'stop
+        (while (search-forward ":" end t)
+          (company-template-add-field templ (point) (format "arg%d" cnt))
+          (if (< (point) end)
+              (insert " ")
+            (throw 'stop t))
+          (incf cnt))))
+    (company-template-move-to-first templ)))
+
+(defun company-clang (command &optional arg &rest ignored)
+  "`company-mode' completion back-end for Clang.
+Clang is a parser for C and ObjC.  Clang version 1.1 or newer is required.
+
+Additional command line arguments can be specified in
+`company-clang-arguments'.  Prefix files (-include ...) can be selected
+with `company-clang-set-prefix' or automatically through a custom
+`company-clang-prefix-guesser'.
+
+With Clang versions before 2.9, we have to save the buffer before
+performing completion.  With Clang 2.9 and later, buffer contents are
+passed via standard input."
+  (interactive (list 'interactive))
+  (case command
+    (interactive (company-begin-backend 'company-clang))
+    (init (when (memq major-mode company-clang-modes)
+            (unless company-clang-executable
+              (error "Company found no clang executable"))
+            (setq company-clang--version (company-clang-version))
+            (when (< company-clang--version company-clang-required-version)
+              (error "Company requires clang version 1.1"))))
+    (prefix (and (memq major-mode company-clang-modes)
+                 buffer-file-name
+                 company-clang-executable
+                 (not (company-in-string-or-comment))
+                 (company-clang--prefix)))
+    (candidates (company-clang--candidates arg))
+    (meta (gethash arg company-clang--meta-cache))
+    (crop (and (string-match ":\\|(" arg)
+               (substring arg 0 (match-beginning 0))))
+    (post-completion (cond
+                      ((not (derived-mode-p 'objc-mode))
+                       (company-template-c-like-templatify arg))
+                      ((string-match ":" arg)
+                       (company-clang-objc-templatify arg))))))
+
+(provide 'company-clang)
+;;; company-clang.el ends here
diff --git a/packages/company/company-css.el b/packages/company/company-css.el
new file mode 100644 (file)
index 0000000..11e195a
--- /dev/null
@@ -0,0 +1,305 @@
+;;; company-css.el --- company-mode completion back-end for css-mode
+
+;; Copyright (C) 2009, 2011  Free Software Foundation, Inc.
+
+;; Author: Nikolaj Schumacher
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;; Code:
+
+(require 'company)
+(eval-when-compile (require 'cl))
+
+(defconst company-css-property-alist
+  ;; see http://www.w3.org/TR/CSS21/propidx.html
+  '(("azimuth" angle "left-side" "far-left" "left" "center-left" "center"
+     "center-right" "right" "far-right" "right-side" "behind" "leftwards"
+     "rightwards")
+    ("background" background-color background-image background-repeat
+     background-attachment background-position)
+    ("background-attachment" "scroll" "fixed")
+    ("background-color" color "transparent")
+    ("background-image" uri "none")
+    ("background-position" percentage length "left" "center" "right" percentage
+     length "top" "center" "bottom" "left" "center" "right" "top" "center"
+     "bottom")
+    ("background-repeat" "repeat" "repeat-x" "repeat-y" "no-repeat")
+    ("border" border-width border-style border-color)
+    ("border-bottom" border)
+    ("border-bottom-color" border-color)
+    ("border-bottom-style" border-style)
+    ("border-bottom-width" border-width)
+    ("border-collapse" "collapse" "separate")
+    ("border-color" color "transparent")
+    ("border-left" border)
+    ("border-left-color" border-color)
+    ("border-left-style" border-style)
+    ("border-left-width" border-width)
+    ("border-right" border)
+    ("border-right-color" border-color)
+    ("border-right-style" border-style)
+    ("border-right-width" border-width)
+    ("border-spacing" length length)
+    ("border-style" border-style)
+    ("border-top" border)
+    ("border-top-color" border-color)
+    ("border-top-style" border-style)
+    ("border-top-width" border-width)
+    ("border-width" border-width)
+    ("bottom" length percentage "auto")
+    ("caption-side" "top" "bottom")
+    ("clear" "none" "left" "right" "both")
+    ("clip" shape "auto")
+    ("color" color)
+    ("content" "normal" "none" string uri counter "attr()" "open-quote"
+     "close-quote" "no-open-quote" "no-close-quote")
+    ("counter-increment" identifier integer "none")
+    ("counter-reset" identifier integer "none")
+    ("cue" cue-before cue-after)
+    ("cue-after" uri "none")
+    ("cue-before" uri "none")
+    ("cursor" uri "*" "auto" "crosshair" "default" "pointer" "move" "e-resize"
+     "ne-resize" "nw-resize" "n-resize" "se-resize" "sw-resize" "s-resize"
+     "w-resize" "text" "wait" "help" "progress")
+    ("direction" "ltr" "rtl")
+    ("display" "inline" "block" "list-item" "run-in" "inline-block" "table"
+     "inline-table" "table-row-group" "table-header-group" "table-footer-group"
+     "table-row" "table-column-group" "table-column" "table-cell"
+     "table-caption" "none")
+    ("elevation" angle "below" "level" "above" "higher" "lower")
+    ("empty-cells" "show" "hide")
+    ("float" "left" "right" "none")
+    ("font" font-style font-variant font-weight font-size "/" line-height
+     font-family "caption" "icon" "menu" "message-box" "small-caption"
+     "status-bar")
+    ("font-family" family-name generic-family)
+    ("font-size" absolute-size relative-size length percentage)
+    ("font-style" "normal" "italic" "oblique")
+    ("font-variant" "normal" "small-caps")
+    ("font-weight" "normal" "bold" "bolder" "lighter" "100" "200" "300" "400"
+     "500" "600" "700" "800" "900")
+    ("height" length percentage "auto")
+    ("left" length percentage "auto")
+    ("letter-spacing" "normal" length)
+    ("line-height" "normal" number length percentage)
+    ("list-style" list-style-type list-style-position list-style-image)
+    ("list-style-image" uri "none")
+    ("list-style-position" "inside" "outside")
+    ("list-style-type" "disc" "circle" "square" "decimal" "decimal-leading-zero"
+     "lower-roman" "upper-roman" "lower-greek" "lower-latin" "upper-latin"
+     "armenian" "georgian" "lower-alpha" "upper-alpha" "none")
+    ("margin" margin-width)
+    ("margin-bottom" margin-width)
+    ("margin-left" margin-width)
+    ("margin-right" margin-width)
+    ("margin-top" margin-width)
+    ("max-height" length percentage "none")
+    ("max-width" length percentage "none")
+    ("min-height" length percentage)
+    ("min-width" length percentage)
+    ("orphans" integer)
+    ("outline" outline-color outline-style outline-width)
+    ("outline-color" color "invert")
+    ("outline-style" border-style)
+    ("outline-width" border-width)
+    ("overflow" "visible" "hidden" "scroll" "auto")
+    ("padding" padding-width)
+    ("padding-bottom" padding-width)
+    ("padding-left" padding-width)
+    ("padding-right" padding-width)
+    ("padding-top" padding-width)
+    ("page-break-after" "auto" "always" "avoid" "left" "right")
+    ("page-break-before" "auto" "always" "avoid" "left" "right")
+    ("page-break-inside" "avoid" "auto")
+    ("pause" time percentage)
+    ("pause-after" time percentage)
+    ("pause-before" time percentage)
+    ("pitch" frequency "x-low" "low" "medium" "high" "x-high")
+    ("pitch-range" number)
+    ("play-during" uri "mix" "repeat" "auto" "none")
+    ("position" "static" "relative" "absolute" "fixed")
+    ("quotes" string string "none")
+    ("richness" number)
+    ("right" length percentage "auto")
+    ("speak" "normal" "none" "spell-out")
+    ("speak-header" "once" "always")
+    ("speak-numeral" "digits" "continuous")
+    ("speak-punctuation" "code" "none")
+    ("speech-rate" number "x-slow" "slow" "medium" "fast" "x-fast" "faster"
+     "slower")
+    ("stress" number)
+    ("table-layout" "auto" "fixed")
+    ("text-align" "left" "right" "center" "justify")
+    ("text-decoration" "none" "underline" "overline" "line-through" "blink")
+    ("text-indent" length percentage)
+    ("text-transform" "capitalize" "uppercase" "lowercase" "none")
+    ("top" length percentage "auto")
+    ("unicode-bidi" "normal" "embed" "bidi-override")
+    ("vertical-align" "baseline" "sub" "super" "top" "text-top" "middle"
+     "bottom" "text-bottom" percentage length)
+    ("visibility" "visible" "hidden" "collapse")
+    ("voice-family" specific-voice generic-voice "*" specific-voice
+     generic-voice)
+    ("volume" number percentage "silent" "x-soft" "soft" "medium" "loud"
+     "x-loud")
+    ("white-space" "normal" "pre" "nowrap" "pre-wrap" "pre-line")
+    ("widows" integer)
+    ("width" length percentage "auto")
+    ("word-spacing" "normal" length)
+    ("z-index" "auto" integer))
+  "A list of CSS properties and their possible values.")
+
+(defconst company-css-value-classes
+  '((absolute-size "xx-small" "x-small" "small" "medium" "large" "x-large"
+                   "xx-large")
+    (border-style "none" "hidden" "dotted" "dashed" "solid" "double" "groove"
+                  "ridge" "inset" "outset")
+    (color "aqua" "black" "blue" "fuchsia" "gray" "green" "lime" "maroon" "navy"
+           "olive" "orange" "purple" "red" "silver" "teal" "white" "yellow")
+    (counter "counter(,)")
+    (family-name "Courier" "Helvetica" "Times")
+    (generic-family "serif" "sans-serif" "cursive" "fantasy" "monospace")
+    (generic-voice "male" "female" "child")
+    (margin-width "auto") ;; length percentage
+    (relative-size "larger" "smaller")
+    (shape "rect(,,,)")
+    (uri "url()"))
+  "A list of CSS property value classes and their contents.")
+;; missing, because not completable
+;; <angle><frequency><identifier><integer><length><number><padding-width>
+;; <percentage><specific-voice><string><time><uri>
+
+(defconst company-css-html-tags
+  '("a" "abbr" "acronym" "address" "applet" "area" "b" "base" "basefont" "bdo"
+    "big" "blockquote" "body" "br" "button" "caption" "center" "cite" "code"
+    "col" "colgroup" "dd" "del" "dfn" "dir" "div" "dl" "dt" "em" "fieldset"
+    "font" "form" "frame" "frameset" "h1" "h2" "h3" "h4" "h5" "h6" "head" "hr"
+    "html" "i" "iframe" "img" "input" "ins" "isindex" "kbd" "label" "legend"
+    "li" "link" "map" "menu" "meta" "noframes" "noscript" "object" "ol"
+    "optgroup" "option" "p" "param" "pre" "q" "s" "samp" "script" "select"
+    "small" "span" "strike" "strong" "style" "sub" "sup" "table" "tbody" "td"
+    "textarea" "tfoot" "th" "thead" "title" "tr" "tt" "u" "ul" "var")
+  "A list of HTML tags for use in CSS completion.")
+
+(defconst company-css-pseudo-classes
+  '("active" "after" "before" "first" "first-child" "first-letter" "first-line"
+    "focus" "hover" "lang" "left" "link" "right" "visited")
+  "Identifiers for CSS pseudo-elements and pseudo-classes.")
+
+(defconst company-css-property-cache (make-hash-table :size 115 :test 'equal))
+
+(defun company-css-property-values (attribute)
+  "Access the `company-css-property-alist' cached and flattened."
+  (or (gethash attribute company-css-property-cache)
+      (let (results)
+        (dolist (value (cdr (assoc attribute company-css-property-alist)))
+          (if (symbolp value)
+              (dolist (child (or (cdr (assoc value company-css-value-classes))
+                                 (company-css-property-values
+                                  (symbol-name value))))
+                (add-to-list 'results child))
+            (add-to-list 'results value)))
+        (setq results (sort results 'string<))
+        (puthash attribute results company-css-property-cache)
+        results)))
+
+;;; bracket detection
+
+(defconst company-css-braces-syntax-table
+  (let ((table (make-syntax-table)))
+    (setf (aref table ?{) '(4 . 125))
+    (setf (aref table ?}) '(5 . 123))
+    table)
+  "A syntax table giving { and } paren syntax.")
+
+(defun company-css-inside-braces-p ()
+  "Return non-nil, if point is within matched { and }."
+  (ignore-errors
+    (with-syntax-table company-css-braces-syntax-table
+      (let ((parse-sexp-ignore-comments t))
+        (scan-lists (point) -1 1)))))
+
+;;; tags
+(defconst company-css-tag-regexp
+  (concat "\\(?:\\`\\|}\\)[[:space:]]*"
+          ;; multiple
+          "\\(?:"
+          ;; previous tags:
+          "\\(?:#\\|\\_<[[:alpha:]]\\)[[:alnum:]-#]*\\(?:\\[[^]]*\\]\\)?"
+          ;; space or selectors
+          "\\(?:[[:space:]]+\\|[[:space:]]*[+,>][[:space:]]*\\)"
+          "\\)*"
+          "\\(\\(?:#\\|\\_<[[:alpha:]]\\)\\(?:[[:alnum:]-#]*\\_>\\)?\\_>\\|\\)"
+          "\\=")
+  "A regular expression matching CSS tags.")
+
+;;; pseudo id
+(defconst company-css-pseudo-regexp
+  (concat "\\(?:\\`\\|}\\)[[:space:]]*"
+          ;; multiple
+          "\\(?:"
+          ;; previous tags:
+          "\\(?:#\\|\\_<[[:alpha:]]\\)[[:alnum:]-#]*\\(?:\\[[^]]*\\]\\)?"
+          ;; space or delimiters
+          "\\(?:[[:space:]]+\\|[[:space:]]*[+,>][[:space:]]*\\)"
+          "\\)*"
+          "\\(?:\\(?:\\#\\|\\_<[[:alpha:]]\\)[[:alnum:]-#]*\\):"
+          "\\([[:alpha:]-]+\\_>\\|\\)\\_>\\=")
+  "A regular expression matching CSS pseudo classes.")
+
+;;; properties
+
+(defun company-css-grab-property ()
+  "Return the CSS property before point, if any.
+Returns \"\" if no property found, but feasible at this position."
+  (when (company-css-inside-braces-p)
+    (company-grab-symbol)))
+
+;;; values
+(defconst company-css-property-value-regexp
+  "\\_<\\([[:alpha:]-]+\\):\\(?:[^};]*[[:space:]]+\\)?\\([^};]*\\_>\\|\\)\\="
+  "A regular expression matching CSS tags.")
+
+;;;###autoload
+(defun company-css (command &optional arg &rest ignored)
+  "`company-mode' completion back-end for `css-mode'."
+  (interactive (list 'interactive))
+  (case command
+    (interactive (company-begin-backend 'company-css))
+    (prefix (and (derived-mode-p 'css-mode)
+                 (or (company-grab company-css-tag-regexp 1)
+                     (company-grab company-css-pseudo-regexp 1)
+                     (company-grab company-css-property-value-regexp 2)
+                     (company-css-grab-property))))
+    (candidates
+     (cond
+      ((company-grab company-css-tag-regexp 1)
+       (all-completions arg company-css-html-tags))
+      ((company-grab company-css-pseudo-regexp 1)
+       (all-completions arg company-css-pseudo-classes))
+      ((company-grab company-css-property-value-regexp 2)
+       (all-completions arg
+                        (company-css-property-values
+                         (company-grab company-css-property-value-regexp 1))))
+      ((company-css-grab-property)
+       (all-completions arg company-css-property-alist))))
+    (sorted t)))
+
+(provide 'company-css)
+;;; company-css.el ends here
diff --git a/packages/company/company-dabbrev-code.el b/packages/company/company-dabbrev-code.el
new file mode 100644 (file)
index 0000000..e4c548e
--- /dev/null
@@ -0,0 +1,89 @@
+;;; company-dabbrev-code.el --- dabbrev-like company-mode back-end for code
+
+;; Copyright (C) 2009, 2011  Free Software Foundation, Inc.
+
+;; Author: Nikolaj Schumacher
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+
+;;; Commentary:
+;;
+
+;;; Code:
+
+(require 'company)
+(require 'company-dabbrev)
+(eval-when-compile (require 'cl))
+
+(defgroup company-dabbrev-code nil
+  "dabbrev-like completion back-end for code."
+  :group 'company)
+
+(defcustom company-dabbrev-code-modes
+  '(asm-mode batch-file-mode c++-mode c-mode cperl-mode csharp-mode css-mode
+    emacs-lisp-mode erlang-mode f90-mode fortran-mode haskell-mode java-mode
+    javascript-mode jde-mode js2-mode lisp-mode lua-mode objc-mode perl-mode
+    php-mode prog-mode python-mode ruby-mode scheme-mode shell-script-mode)
+  "Modes that use `company-dabbrev-code'.
+In all these modes `company-dabbrev-code' will complete only symbols, not text
+in comments or strings.  In other modes `company-dabbrev-code' will pass control
+to other back-ends \(e.g. `company-dabbrev'\).
+Value t means complete in all modes."
+  :type '(choice (repeat (symbol :tag "Major mode"))
+                 (const tag "All modes" t)))
+
+(defcustom company-dabbrev-code-other-buffers t
+  "Determines whether `company-dabbrev-code' should search other buffers.
+If `all', search all other buffers.  If t, search buffers with the same
+major mode.
+See also `company-dabbrev-code-time-limit'."
+  :type '(choice (const :tag "Off" nil)
+                 (const :tag "Same major mode" t)
+                 (const :tag "All" all)))
+
+(defcustom company-dabbrev-code-time-limit .5
+  "Determines how long `company-dabbrev-code' should look for matches."
+  :type '(choice (const :tag "Off" nil)
+                 (number :tag "Seconds")))
+
+(defsubst company-dabbrev-code--make-regexp (prefix)
+  (concat "\\_<" (if (equal prefix "")
+                     "\\([a-zA-Z]\\|\\s_\\)"
+                   (regexp-quote prefix))
+          "\\(\\sw\\|\\s_\\)*\\_>"))
+
+;;;###autoload
+(defun company-dabbrev-code (command &optional arg &rest ignored)
+  "dabbrev-like `company-mode' back-end for code.
+The back-end looks for all symbols in the current buffer that aren't in
+comments or strings."
+  (interactive (list 'interactive))
+  (case command
+    (interactive (company-begin-backend 'company-dabbrev-code))
+    (prefix (and (or (eq t company-dabbrev-code-modes)
+                     (apply 'derived-mode-p company-dabbrev-code-modes))
+                 (not (company-in-string-or-comment))
+                 (or (company-grab-symbol) 'stop)))
+    (candidates (let ((case-fold-search nil))
+                  (company-dabbrev--search
+                   (company-dabbrev-code--make-regexp arg)
+                   company-dabbrev-code-time-limit
+                   company-dabbrev-code-other-buffers t)))
+    (duplicates t)))
+
+(provide 'company-dabbrev-code)
+;;; company-dabbrev-code.el ends here
diff --git a/packages/company/company-dabbrev.el b/packages/company/company-dabbrev.el
new file mode 100644 (file)
index 0000000..1be9792
--- /dev/null
@@ -0,0 +1,127 @@
+;;; company-dabbrev.el --- dabbrev-like company-mode completion back-end
+
+;; Copyright (C) 2009, 2011  Free Software Foundation, Inc.
+
+;; Author: Nikolaj Schumacher
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+
+;;; Commentary:
+;;
+
+;;; Code:
+
+(require 'company)
+(eval-when-compile (require 'cl))
+
+(defgroup company-dabbrev nil
+  "dabbrev-like completion back-end."
+  :group 'company)
+
+(defcustom company-dabbrev-other-buffers 'all
+  "Determines whether `company-dabbrev' should search other buffers.
+If `all', search all other buffers.  If t, search buffers with the same
+major mode.
+See also `company-dabbrev-time-limit'."
+  :type '(choice (const :tag "Off" nil)
+                 (const :tag "Same major mode" t)
+                 (const :tag "All" all)))
+
+(defcustom company-dabbrev-time-limit .5
+  "Determines how many seconds `company-dabbrev' should look for matches."
+  :type '(choice (const :tag "Off" nil)
+                 (number :tag "Seconds")))
+
+(defcustom company-dabbrev-char-regexp "\\sw"
+  "A regular expression matching the characters `company-dabbrev' looks for."
+  :type 'regexp)
+
+(defmacro company-dabrev--time-limit-while (test start limit &rest body)
+  (declare (indent 3) (debug t))
+  `(let ((company-time-limit-while-counter 0))
+     (catch 'done
+       (while ,test
+         ,@body
+         (and ,limit
+              (eq (incf company-time-limit-while-counter) 25)
+              (setq company-time-limit-while-counter 0)
+              (> (float-time (time-since ,start)) ,limit)
+              (throw 'done 'company-time-out))))))
+
+(defsubst company-dabbrev--make-regexp (prefix)
+  (concat "\\<" (if (equal prefix "")
+              company-dabbrev-char-regexp
+            (regexp-quote prefix))
+          "\\(" company-dabbrev-char-regexp "\\)*\\>"))
+
+(defun company-dabbrev--search-buffer (regexp pos symbols start limit
+                                       ignore-comments)
+  (save-excursion
+    (let (match)
+      (goto-char (if pos (1- pos) (point-min)))
+      ;; search before pos
+      (company-dabrev--time-limit-while (re-search-backward regexp nil t)
+          start limit
+        (setq match (match-string-no-properties 0))
+        (if (and ignore-comments (company-in-string-or-comment))
+            (re-search-backward "\\s<\\|\\s!\\|\\s\"\\|\\s|" nil t)
+          (push match symbols)))
+      (goto-char (or pos (point-min)))
+      ;; search after pos
+      (company-dabrev--time-limit-while (re-search-forward regexp nil t)
+          start limit
+        (setq match (match-string-no-properties 0))
+        (if (and ignore-comments (company-in-string-or-comment))
+            (re-search-forward "\\s>\\|\\s!\\|\\s\"" nil t)
+          (push match symbols)))
+      symbols)))
+
+(defun company-dabbrev--search (regexp &optional limit other-buffers
+                                ignore-comments)
+  (let* ((start (current-time))
+         (symbols (company-dabbrev--search-buffer regexp (point) nil start limit
+                                                  ignore-comments)))
+    (when other-buffers
+      (dolist (buffer (delq (current-buffer) (buffer-list)))
+        (and (or (eq other-buffers 'all)
+                 (eq (buffer-local-value 'major-mode buffer) major-mode))
+             (with-current-buffer buffer
+               (setq symbols
+                     (company-dabbrev--search-buffer regexp nil symbols start
+                                                     limit ignore-comments))))
+        (and limit
+             (> (float-time (time-since start)) limit)
+             (return))))
+    symbols))
+
+;;;###autoload
+(defun company-dabbrev (command &optional arg &rest ignored)
+  "dabbrev-like `company-mode' completion back-end."
+  (interactive (list 'interactive))
+  (case command
+    (interactive (company-begin-backend 'company-dabbrev))
+    (prefix (company-grab-word))
+    (candidates
+     (mapcar 'downcase
+             (company-dabbrev--search (company-dabbrev--make-regexp arg)
+                                      company-dabbrev-time-limit
+                                      company-dabbrev-other-buffers)))
+    (ignore-case t)
+    (duplicates t)))
+
+(provide 'company-dabbrev)
+;;; company-dabbrev.el ends here
diff --git a/packages/company/company-eclim.el b/packages/company/company-eclim.el
new file mode 100644 (file)
index 0000000..ea0b73e
--- /dev/null
@@ -0,0 +1,174 @@
+;;; company-eclim.el --- company-mode completion back-end for Eclim
+
+;; Copyright (C) 2009, 2011, 2013  Free Software Foundation, Inc.
+
+;; Author: Nikolaj Schumacher
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;
+;; Using `emacs-eclim' together with (or instead of) this back-end is
+;; recommended, as it allows you to use other Eclim features.
+;;
+;; The alternative back-end provided by `emacs-eclim' uses `yasnippet'
+;; instead of `company-template' to expand function calls, and it supports
+;; some languages other than Java.
+
+;;; Code:
+
+(require 'company)
+(require 'company-template)
+(eval-when-compile (require 'cl))
+
+(defgroup company-eclim nil
+  "Completion back-end for Eclim."
+  :group 'company)
+
+(defun company-eclim-executable-find ()
+  (let (file)
+    (dolist (eclipse-root '("/Applications/eclipse" "/usr/lib/eclipse"
+                            "/usr/local/lib/eclipse"))
+      (and (file-exists-p (setq file (expand-file-name "plugins" eclipse-root)))
+           (setq file (car (last (directory-files file t "^org.eclim_"))))
+           (file-exists-p (setq file (expand-file-name "bin/eclim" file)))
+           (return file)))))
+
+(defcustom company-eclim-executable
+  (or (executable-find "eclim") (company-eclim-executable-find))
+  "Location of eclim executable."
+  :type 'file)
+
+(defcustom company-eclim-auto-save t
+  "Determines whether to save the buffer when retrieving completions.
+eclim can only complete correctly when the buffer has been saved."
+  :type '(choice (const :tag "Off" nil)
+                 (const :tag "On" t)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defvar company-eclim--project-dir 'unknown)
+(make-variable-buffer-local 'company-eclim--project-dir)
+
+(defvar company-eclim--project-name nil)
+(make-variable-buffer-local 'company-eclim--project-name)
+
+(defvar company-eclim--doc nil)
+(make-variable-buffer-local 'company-eclim--doc)
+
+(declare-function json-read "json")
+
+(defun company-eclim--call-process (&rest args)
+  (let ((coding-system-for-read 'utf-8)
+        res)
+    (require 'json)
+    (with-temp-buffer
+      (if (= 0 (setq res (apply 'call-process company-eclim-executable nil t nil
+                                "-command" args)))
+          (let ((json-array-type 'list))
+            (goto-char (point-min))
+            (unless (eobp)
+              (json-read)))
+        (message "Company-eclim command failed with error %d:\n%s" res
+                 (buffer-substring (point-min) (point-max)))
+        nil))))
+
+(defun company-eclim--project-list ()
+  (company-eclim--call-process "project_list"))
+
+(defun company-eclim--project-dir ()
+  (if (eq company-eclim--project-dir 'unknown)
+      (setq company-eclim--project-dir
+            (directory-file-name
+             (expand-file-name
+              (company-locate-dominating-file buffer-file-name ".project"))))
+    company-eclim--project-dir))
+
+(defun company-eclim--project-name ()
+  (or company-eclim--project-name
+      (let ((dir (company-eclim--project-dir)))
+        (when dir
+          (setq company-eclim--project-name
+                (loop for project in (company-eclim--project-list)
+                      when (equal (cdr (assoc 'path project)) dir)
+                      return (cdr (assoc 'name project))))))))
+
+(defun company-eclim--candidates (prefix)
+  (interactive "d")
+  (let ((project-file (file-relative-name buffer-file-name
+                                          (company-eclim--project-dir)))
+        (project-name (company-eclim--project-name)))
+    (when company-eclim-auto-save
+      (when (buffer-modified-p)
+        (basic-save-buffer))
+      ;; FIXME: Sometimes this isn't finished when we complete.
+      (company-eclim--call-process "java_src_update"
+                                   "-p" (company-eclim--project-name)
+                                   "-f" project-file))
+    (setq company-eclim--doc
+          (make-hash-table :test 'equal))
+    (dolist (item (cdr (assoc 'completions
+                              (company-eclim--call-process
+                               "java_complete" "-p" (company-eclim--project-name)
+                               "-f" project-file
+                               "-o" (number-to-string
+                                     (company-eclim--search-point prefix))
+                               "-e" "utf-8"
+                               "-l" "standard"))))
+      (let* ((meta (cdr (assoc 'info item)))
+             (completion meta))
+        (when (string-match " [:-]" completion)
+          (setq completion (substring completion 0 (match-beginning 0))))
+        (puthash completion meta company-eclim--doc))))
+  (let ((completion-ignore-case nil))
+    (all-completions prefix company-eclim--doc)))
+
+(defun company-eclim--search-point (prefix)
+  (if (or (plusp (length prefix)) (eq (char-before) ?.))
+      (1- (point))
+    (point)))
+
+(defun company-eclim--meta (candidate)
+  (gethash candidate company-eclim--doc))
+
+(defun company-eclim (command &optional arg &rest ignored)
+  "`company-mode' completion back-end for Eclim.
+Eclim provides access to Eclipse Java IDE features for other editors.
+
+Eclim version 1.7.13 or newer (?) is required.
+
+Completions only work correctly when the buffer has been saved.
+`company-eclim-auto-save' determines whether to do this automatically."
+  (interactive (list 'interactive))
+  (case command
+    (interactive (company-begin-backend 'company-eclim))
+    (prefix (and (derived-mode-p 'java-mode 'jde-mode)
+                 buffer-file-name
+                 company-eclim-executable
+                 (company-eclim--project-name)
+                 (not (company-in-string-or-comment))
+                 (or (company-grab-symbol) 'stop)))
+    (candidates (company-eclim--candidates arg))
+    (meta (company-eclim--meta arg))
+    ;; because "" doesn't return everything
+    (no-cache (equal arg ""))
+    (crop (when (string-match "(" arg)
+            (substring arg 0 (match-beginning 0))))
+    (post-completion (when (string-match "([^)]" arg)
+                       (company-template-c-like-templatify arg)))))
+
+(provide 'company-eclim)
+;;; company-eclim.el ends here
diff --git a/packages/company/company-elisp.el b/packages/company/company-elisp.el
new file mode 100644 (file)
index 0000000..5bfc27e
--- /dev/null
@@ -0,0 +1,225 @@
+;;; company-elisp.el --- company-mode completion back-end for Emacs Lisp -*- lexical-binding: t -*-
+
+;; Copyright (C) 2009, 2011-2013  Free Software Foundation, Inc.
+
+;; Author: Nikolaj Schumacher
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+
+;;; Commentary:
+;;
+
+;;; Code:
+
+(require 'company)
+(eval-when-compile (require 'cl))
+(require 'help-mode)
+(require 'find-func)
+
+(defgroup company-elisp nil
+  "Completion back-end for Emacs Lisp."
+  :group 'company)
+
+(defcustom company-elisp-detect-function-context t
+  "If enabled, offer Lisp functions only in appropriate contexts.
+Functions are offered for completion only after ' and \(."
+  :type '(choice (const :tag "Off" nil)
+                 (const :tag "On" t)))
+
+(defcustom company-elisp-show-locals-first t
+  "If enabled, locally bound variables and functions are displayed
+first in the candidates list."
+  :type '(choice (const :tag "Off" nil)
+                 (const :tag "On" t)))
+
+(defun company-elisp--prefix ()
+  (let ((prefix (company-grab-symbol)))
+    (if prefix
+        (when (if (company-in-string-or-comment)
+                  (= (char-before (- (point) (length prefix))) ?`)
+                (company-elisp--should-complete))
+          prefix)
+      'stop)))
+
+(defun company-elisp--predicate (symbol)
+  (or (boundp symbol)
+      (fboundp symbol)
+      (facep symbol)
+      (featurep symbol)))
+
+(defun company-elisp--fns-regexp (&rest names)
+  (concat "\\_<\\(?:cl-\\)?" (regexp-opt names) "\\*?\\_>"))
+
+(defvar company-elisp-parse-limit 30)
+(defvar company-elisp-parse-depth 100)
+
+(defvar company-elisp-defun-names '("defun" "defmacro" "defsubst"))
+
+(defvar company-elisp-var-binding-regexp
+  (apply #'company-elisp--fns-regexp "let" "lambda" "lexical-let"
+         company-elisp-defun-names)
+  "Regular expression matching head of a multiple variable bindings form.")
+
+(defvar company-elisp-var-binding-regexp-1
+  (company-elisp--fns-regexp "dolist" "dotimes")
+  "Regular expression matching head of a form with one variable binding.")
+
+(defvar company-elisp-fun-binding-regexp
+  (company-elisp--fns-regexp "flet" "labels")
+  "Regular expression matching head of a function bindings form.")
+
+(defvar company-elisp-defuns-regexp
+  (concat "([ \t\n]*"
+          (apply #'company-elisp--fns-regexp company-elisp-defun-names)))
+
+(defun company-elisp--should-complete ()
+  (let ((start (point))
+        (depth (car (syntax-ppss))))
+    (not
+     (when (> depth 0)
+       (save-excursion
+         (up-list (- depth))
+         (when (looking-at company-elisp-defuns-regexp)
+           (forward-char)
+           (forward-sexp 1)
+           (unless (= (point) start)
+             (condition-case nil
+                 (let ((args-end (scan-sexps (point) 2)))
+                   (or (null args-end)
+                       (> args-end start)))
+               (scan-error
+                t)))))))))
+
+(defun company-elisp--locals (prefix functions-p)
+  (let ((regexp (concat "[ \t\n]*\\(\\_<" (regexp-quote prefix)
+                        "\\(?:\\sw\\|\\s_\\)*\\_>\\)"))
+        (pos (point))
+        res)
+    (condition-case nil
+        (save-excursion
+          (dotimes (_ company-elisp-parse-depth)
+            (up-list -1)
+            (save-excursion
+              (when (eq (char-after) ?\()
+                (forward-char 1)
+                (when (ignore-errors
+                        (save-excursion (forward-list)
+                                        (<= (point) pos)))
+                  (skip-chars-forward " \t\n")
+                  (cond
+                   ((looking-at (if functions-p
+                                    company-elisp-fun-binding-regexp
+                                  company-elisp-var-binding-regexp))
+                    (down-list 1)
+                    (condition-case nil
+                        (dotimes (_ company-elisp-parse-limit)
+                          (save-excursion
+                            (when (looking-at "[ \t\n]*(")
+                              (down-list 1))
+                            (when (looking-at regexp)
+                              (pushnew (match-string-no-properties 1) res)))
+                          (forward-sexp))
+                      (scan-error nil)))
+                   ((unless functions-p
+                      (looking-at company-elisp-var-binding-regexp-1))
+                    (down-list 1)
+                    (when (looking-at regexp)
+                      (pushnew (match-string-no-properties 1) res)))))))))
+      (scan-error nil))
+    res))
+
+(defun company-elisp-candidates (prefix)
+  (let* ((predicate (company-elisp--candidates-predicate prefix))
+         (locals (company-elisp--locals prefix (eq predicate 'fboundp)))
+         (globals (company-elisp--globals prefix predicate))
+         (locals (loop for local in locals
+                       when (not (member local globals))
+                       collect local)))
+    (if company-elisp-show-locals-first
+        (append (sort locals 'string<)
+                (sort globals 'string<))
+      (append locals globals))))
+
+(defun company-elisp--globals (prefix predicate)
+  (all-completions prefix obarray predicate))
+
+(defun company-elisp--candidates-predicate (prefix)
+  (let* ((completion-ignore-case nil)
+         (beg (- (point) (length prefix)))
+         (before (char-before beg)))
+    (if (and company-elisp-detect-function-context
+             (not (memq before '(?' ?`))))
+        (if (and (eq before ?\()
+                 (not
+                  (save-excursion
+                    (ignore-errors
+                      (goto-char (1- beg))
+                      (or (company-elisp--before-binding-varlist-p)
+                          (progn
+                            (up-list -1)
+                            (company-elisp--before-binding-varlist-p)))))))
+            'fboundp
+          'boundp)
+      'company-elisp--predicate)))
+
+(defun company-elisp--before-binding-varlist-p ()
+  (save-excursion
+    (and (prog1 (search-backward "(")
+           (forward-char 1))
+         (looking-at company-elisp-var-binding-regexp))))
+
+(defun company-elisp--doc (symbol)
+  (let* ((symbol (intern symbol))
+         (doc (if (fboundp symbol)
+                  (documentation symbol t)
+                (documentation-property symbol 'variable-documentation t))))
+    (and (stringp doc)
+         (string-match ".*$" doc)
+         (match-string 0 doc))))
+
+;;;###autoload
+(defun company-elisp (command &optional arg &rest ignored)
+  "`company-mode' completion back-end for Emacs Lisp."
+  (interactive (list 'interactive))
+  (case command
+    (interactive (company-begin-backend 'company-elisp))
+    (prefix (and (eq (derived-mode-p 'emacs-lisp-mode) 'emacs-lisp-mode)
+                 (company-elisp--prefix)))
+    (candidates (company-elisp-candidates arg))
+    (sorted company-elisp-show-locals-first)
+    (meta (company-elisp--doc arg))
+    (doc-buffer (let ((symbol (intern arg)))
+                  (save-window-excursion
+                    (ignore-errors
+                      (cond
+                       ((fboundp symbol) (describe-function symbol))
+                       ((boundp symbol) (describe-variable symbol))
+                       ((featurep symbol) (describe-package symbol))
+                       ((facep symbol) (describe-face symbol))
+                       (t (signal 'user-error nil)))
+                      (help-buffer)))))
+    (location (let ((sym (intern arg)))
+                (cond
+                 ((fboundp sym) (find-definition-noselect sym nil))
+                 ((boundp sym) (find-definition-noselect sym 'defvar))
+                 ((featurep sym) (cons (find-file-noselect (find-library-name
+                                                            (symbol-name sym)))
+                                       0))
+                 ((facep sym) (find-definition-noselect sym 'defface)))))))
+
+(provide 'company-elisp)
+;;; company-elisp.el ends here
diff --git a/packages/company/company-etags.el b/packages/company/company-etags.el
new file mode 100644 (file)
index 0000000..956e294
--- /dev/null
@@ -0,0 +1,88 @@
+;;; company-etags.el --- company-mode completion back-end for etags
+
+;; Copyright (C) 2009-2011  Free Software Foundation, Inc.
+
+;; Author: Nikolaj Schumacher
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+
+;;; Commentary:
+;;
+
+;;; Code:
+
+(require 'company)
+(require 'etags)
+
+(defgroup company-etags nil
+  "Completion back-end for etags."
+  :group 'company)
+
+(defcustom company-etags-use-main-table-list t
+  "Always search `tags-table-list' if set.
+If this is disabled, `company-etags' will try to find the one table for each
+buffer automatically."
+  :type '(choice (const :tag "off" nil)
+                 (const :tag "on" t)))
+
+(defvar company-etags-modes '(c-mode objc-mode c++-mode java-mode jde-mode
+                              pascal-mode perl-mode python-mode))
+
+(defvar company-etags-buffer-table 'unknown)
+(make-variable-buffer-local 'company-etags-buffer-table)
+
+(defun company-etags-find-table ()
+  (let ((file (company-locate-dominating-file (or buffer-file-name
+                                                  default-directory)
+                                              "TAGS")))
+    (when file
+      (list (expand-file-name file)))))
+
+(defun company-etags-buffer-table ()
+  (or (and company-etags-use-main-table-list tags-table-list)
+      (if (eq company-etags-buffer-table 'unknown)
+          (setq company-etags-buffer-table (company-etags-find-table))
+        company-etags-buffer-table)))
+
+(defun company-etags--candidates (prefix)
+  (let ((tags-table-list (company-etags-buffer-table))
+        (completion-ignore-case nil))
+    (and (or tags-file-name tags-table-list)
+         (fboundp 'tags-completion-table)
+         (save-excursion
+           (visit-tags-table-buffer)
+           (all-completions prefix (tags-completion-table))))))
+
+;;;###autoload
+(defun company-etags (command &optional arg &rest ignored)
+  "`company-mode' completion back-end for etags."
+  (interactive (list 'interactive))
+  (case command
+    (interactive (company-begin-backend 'company-etags))
+    (prefix (and (memq major-mode company-etags-modes)
+                 (not (company-in-string-or-comment))
+                 (company-etags-buffer-table)
+                 (or (company-grab-symbol) 'stop)))
+    (candidates (company-etags--candidates arg))
+    (location (let ((tags-table-list (company-etags-buffer-table)))
+                (when (fboundp 'find-tag-noselect)
+                  (save-excursion
+                    (let ((buffer (find-tag-noselect arg)))
+                      (cons buffer (with-current-buffer buffer (point))))))))))
+
+(provide 'company-etags)
+;;; company-etags.el ends here
diff --git a/packages/company/company-files.el b/packages/company/company-files.el
new file mode 100644 (file)
index 0000000..3b7a7d0
--- /dev/null
@@ -0,0 +1,90 @@
+;;; company-files.el --- company-mode completion back-end for file names
+
+;; Copyright (C) 2009-2011, 2013  Free Software Foundation, Inc.
+
+;; Author: Nikolaj Schumacher
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+
+;;; Commentary:
+;;
+
+;;; Code:
+
+(require 'company)
+(eval-when-compile (require 'cl))
+
+(defun company-files-directory-files (dir prefix)
+  (ignore-errors
+    (if (equal prefix "")
+        (directory-files dir nil "\\`[^.]\\|\\`.[^.]")
+      (file-name-all-completions prefix dir))))
+
+(defvar company-files-regexps
+  (let ((begin (if (eq system-type 'windows-nt)
+                   "[a-z][A-Z]\\"
+                 "~?/")))
+    (list (concat "\"\\(" begin "[^\"\n]*\\)")
+          (concat "\'\\(" begin "[^\'\n]*\\)")
+          (concat "\\(?:[ \t]\\|^\\)\\(" begin "[^ \t\n]*\\)"))))
+
+(defun company-files-grab-existing-name ()
+  ;; Grab file names with spaces, only when they include quotes.
+  (let (file dir)
+    (and (dolist (regexp company-files-regexps)
+           (when (setq file (company-grab-line regexp 1))
+             (return file)))
+         (setq dir (file-name-directory file))
+         (not (string-match "//" dir))
+         (file-exists-p dir)
+         (file-name-all-completions (file-name-nondirectory file) dir)
+         file)))
+
+(defvar company-files-completion-cache nil)
+
+(defun company-files-complete (prefix)
+  (let* ((dir (file-name-directory prefix))
+         (file (file-name-nondirectory prefix))
+         candidates)
+    (unless (equal dir (car company-files-completion-cache))
+      (dolist (file (company-files-directory-files dir file))
+        (setq file (concat dir file))
+        (push file candidates)
+        (when (file-directory-p file)
+          ;; Add one level of children.
+          (dolist (child (company-files-directory-files file ""))
+            (push (concat file
+                          (unless (eq (aref file (1- (length file))) ?/) "/")
+                          child) candidates))))
+      (setq company-files-completion-cache (cons dir (nreverse candidates))))
+    (cdr company-files-completion-cache)))
+
+;;;###autoload
+(defun company-files (command &optional arg &rest ignored)
+  "`company-mode' completion back-end existing file names."
+  (interactive (list 'interactive))
+  (case command
+    (interactive (company-begin-backend 'company-files))
+    (prefix (company-files-grab-existing-name))
+    (candidates (company-files-complete arg))
+    (location (cons (dired-noselect
+                     (file-name-directory (directory-file-name arg))) 1))
+    (sorted t)
+    (no-cache t)))
+
+(provide 'company-files)
+;;; company-files.el ends here
diff --git a/packages/company/company-gtags.el b/packages/company/company-gtags.el
new file mode 100644 (file)
index 0000000..6b4e399
--- /dev/null
@@ -0,0 +1,90 @@
+;;; company-gtags.el --- company-mode completion back-end for GNU Global
+
+;; Copyright (C) 2009-2011  Free Software Foundation, Inc.
+
+;; Author: Nikolaj Schumacher
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+
+;;; Commentary:
+;;
+
+;;; Code:
+
+(require 'company)
+(eval-when-compile (require 'cl))
+
+(defgroup company-gtags nil
+  "Completion back-end for GNU Global."
+  :group 'company)
+
+(defcustom company-gtags-executable
+  (executable-find "global")
+  "Location of GNU global executable."
+  :type 'string)
+
+(define-obsolete-variable-alias
+  'company-gtags-gnu-global-program-name
+  'company-gtags-executable "earlier")
+
+(defvar company-gtags--tags-available-p 'unknown)
+(make-variable-buffer-local 'company-gtags--tags-available-p)
+
+(defvar company-gtags-modes '(c-mode c++-mode jde-mode java-mode php-mode))
+
+(defun company-gtags--tags-available-p ()
+  (if (eq company-gtags--tags-available-p 'unknown)
+      (setq company-gtags--tags-available-p
+            (company-locate-dominating-file buffer-file-name "GTAGS"))
+    company-gtags--tags-available-p))
+
+(defun company-gtags-fetch-tags (prefix)
+  (with-temp-buffer
+    (let (tags)
+      (when (= 0 (call-process company-gtags-executable nil
+                               (list (current-buffer) nil) nil "-c" prefix))
+        (goto-char (point-min))
+        (split-string (buffer-string) "\n" t)))))
+
+(defun company-gtags-location (tag)
+  (with-temp-buffer
+    (when (= 0 (call-process company-gtags-executable nil
+                             (list (current-buffer) nil) nil "-x" tag))
+        (goto-char (point-min))
+        (when (looking-at (concat (regexp-quote tag)
+                                  "[ \t]+\\([[:digit:]]+\\)"
+                                  "[ \t]+\\([^ \t]+\\)"))
+          (cons (expand-file-name (match-string 2))
+                (string-to-number (match-string 1)))))))
+
+;;;###autoload
+(defun company-gtags (command &optional arg &rest ignored)
+  "`company-mode' completion back-end for GNU Global."
+  (interactive (list 'interactive))
+  (case command
+    (interactive (company-begin-backend 'company-gtags))
+    (prefix (and company-gtags-executable
+                 (memq major-mode company-gtags-modes)
+                 (not (company-in-string-or-comment))
+                 (company-gtags--tags-available-p)
+                 (or (company-grab-symbol) 'stop)))
+    (candidates (company-gtags-fetch-tags arg))
+    (sorted t)
+    (location (company-gtags-location arg))))
+
+(provide 'company-gtags)
+;;; company-gtags.el ends here
diff --git a/packages/company/company-ispell.el b/packages/company/company-ispell.el
new file mode 100644 (file)
index 0000000..9647f85
--- /dev/null
@@ -0,0 +1,69 @@
+;;; company-ispell.el --- company-mode completion back-end using Ispell
+
+;; Copyright (C) 2009-2011  Free Software Foundation, Inc.
+
+;; Author: Nikolaj Schumacher
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+
+;;; Commentary:
+;;
+
+;;; Code:
+
+(require 'company)
+(require 'ispell)
+(eval-when-compile (require 'cl))
+
+(defgroup company-ispell nil
+  "Completion back-end using Ispell."
+  :group 'company)
+
+(defcustom company-ispell-dictionary nil
+  "Dictionary to use for `company-ispell'.
+If nil, use `ispell-complete-word-dict'."
+  :type '(choice (const :tag "default (nil)" nil)
+                 (file :tag "dictionary" t)))
+
+(defvar company-ispell-available 'unknown)
+
+(defun company-ispell-available ()
+  (when (eq company-ispell-available 'unknown)
+    (condition-case err
+        (progn
+          (lookup-words "WHATEVER")
+          (setq company-ispell-available t))
+      (error
+       (message "Company: ispell-look-command not found")
+       (setq company-ispell-available nil))))
+  company-ispell-available)
+
+;;;###autoload
+(defun company-ispell (command &optional arg &rest ignored)
+  "`company-mode' completion back-end using Ispell."
+  (interactive (list 'interactive))
+  (case command
+    (interactive (company-begin-backend 'company-ispell))
+    (prefix (when (company-ispell-available)
+              (company-grab-word)))
+    (candidates (lookup-words arg (or company-ispell-dictionary
+                                      ispell-complete-word-dict)))
+    (sorted t)
+    (ignore-case t)))
+
+(provide 'company-ispell)
+;;; company-ispell.el ends here
diff --git a/packages/company/company-keywords.el b/packages/company/company-keywords.el
new file mode 100644 (file)
index 0000000..750540c
--- /dev/null
@@ -0,0 +1,235 @@
+;;; company-keywords.el --- A company back-end for programming language keywords
+
+;; Copyright (C) 2009-2011  Free Software Foundation, Inc.
+
+;; Author: Nikolaj Schumacher
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+
+;;; Commentary:
+;;
+
+;;; Code:
+
+(require 'company)
+(eval-when-compile (require 'cl))
+
+(defun company-keywords-upper-lower (&rest lst)
+  ;; Upcase order is different for _.
+  (nconc (sort (mapcar 'upcase lst) 'string<) lst))
+
+(defvar company-keywords-alist
+  ;; Please contribute corrections or additions.
+  `((c++-mode
+     "asm" "auto" "bool" "break" "case" "catch" "char" "class" "const"
+     "const_cast" "continue" "default" "delete" "do" "double" "dynamic_cast"
+     "else" "enum" "explicit" "export" "extern" "false" "float" "for" "friend"
+     "goto" "if" "inline" "int" "long" "mutable" "namespace" "new"
+     "operator" "private" "protected" "public" "register" "reinterpret_cast"
+     "return" "short" "signed" "sizeof" "static" "static_cast" "struct" "switch"
+     "template" "this" "throw" "true" "try" "typedef" "typeid" "typename"
+     "union" "unsigned" "using" "virtual" "void" "volatile" "wchar_t" "while")
+    (c-mode
+     "auto" "break" "case" "char" "const" "continue" "default" "do"
+     "double" "else" "enum" "extern" "float" "for" "goto" "if" "int" "long"
+     "register" "return" "short" "signed" "sizeof" "static" "struct"
+     "switch" "typedef" "union" "unsigned" "void" "volatile" "while")
+    (csharp-mode
+     "abstract" "add" "alias" "as" "base" "bool" "break" "byte" "case"
+     "catch" "char" "checked" "class" "const" "continue" "decimal" "default"
+     "delegate" "do" "double" "else" "enum" "event" "explicit" "extern"
+     "false" "finally" "fixed" "float" "for" "foreach" "get" "global" "goto"
+     "if" "implicit" "in" "int" "interface" "internal" "is" "lock" "long"
+     "namespace" "new" "null" "object" "operator" "out" "override" "params"
+     "partial" "private" "protected" "public" "readonly" "ref" "remove"
+     "return" "sbyte" "sealed" "set" "short" "sizeof" "stackalloc" "static"
+     "string" "struct" "switch" "this" "throw" "true" "try" "typeof" "uint"
+     "ulong" "unchecked" "unsafe" "ushort" "using" "value" "var" "virtual"
+     "void" "volatile" "where" "while" "yield")
+    (d-mode
+     ;; from http://www.digitalmars.com/d/2.0/lex.html
+     "abstract" "alias" "align" "asm"
+     "assert" "auto" "body" "bool" "break" "byte" "case" "cast" "catch"
+     "cdouble" "cent" "cfloat" "char" "class" "const" "continue" "creal"
+     "dchar" "debug" "default" "delegate" "delete" "deprecated" "do"
+     "double" "else" "enum" "export" "extern" "false" "final" "finally"
+     "float" "for" "foreach" "foreach_reverse" "function" "goto" "idouble"
+     "if" "ifloat" "import" "in" "inout" "int" "interface" "invariant"
+     "ireal" "is" "lazy" "long" "macro" "mixin" "module" "new" "nothrow"
+     "null" "out" "override" "package" "pragma" "private" "protected"
+     "public" "pure" "real" "ref" "return" "scope" "short" "static" "struct"
+     "super" "switch" "synchronized" "template" "this" "throw" "true" "try"
+     "typedef" "typeid" "typeof" "ubyte" "ucent" "uint" "ulong" "union"
+     "unittest" "ushort" "version" "void" "volatile" "wchar" "while" "with")
+    (f90-mode .
+     ;; from f90.el
+     ;; ".AND." ".GE." ".GT." ".LT." ".LE." ".NE." ".OR." ".TRUE." ".FALSE."
+     ,(company-keywords-upper-lower
+      "abs" "abstract" "achar" "acos" "adjustl" "adjustr" "aimag" "aint"
+      "align" "all" "all_prefix" "all_scatter" "all_suffix" "allocatable"
+      "allocate" "allocated" "and" "anint" "any" "any_prefix" "any_scatter"
+      "any_suffix" "asin" "assign" "assignment" "associate" "associated"
+      "asynchronous" "atan" "atan2" "backspace" "bind" "bit_size" "block"
+      "btest" "c_alert" "c_associated" "c_backspace" "c_bool"
+      "c_carriage_return" "c_char" "c_double" "c_double_complex" "c_f_pointer"
+      "c_f_procpointer" "c_float" "c_float_complex" "c_form_feed" "c_funloc"
+      "c_funptr" "c_horizontal_tab" "c_int" "c_int16_t" "c_int32_t" "c_int64_t"
+      "c_int8_t" "c_int_fast16_t" "c_int_fast32_t" "c_int_fast64_t"
+      "c_int_fast8_t" "c_int_least16_t" "c_int_least32_t" "c_int_least64_t"
+      "c_int_least8_t" "c_intmax_t" "c_intptr_t" "c_loc" "c_long"
+      "c_long_double" "c_long_double_complex" "c_long_long" "c_new_line"
+      "c_null_char" "c_null_funptr" "c_null_ptr" "c_ptr" "c_short"
+      "c_signed_char" "c_size_t" "c_vertical_tab" "call" "case" "ceiling"
+      "char" "character" "character_storage_size" "class" "close" "cmplx"
+      "command_argument_count" "common" "complex" "conjg" "contains" "continue"
+      "copy_prefix" "copy_scatter" "copy_suffix" "cos" "cosh" "count"
+      "count_prefix" "count_scatter" "count_suffix" "cpu_time" "cshift"
+      "cycle" "cyclic" "data" "date_and_time" "dble" "deallocate" "deferred"
+      "digits" "dim" "dimension" "distribute" "do" "dot_product" "double"
+      "dprod" "dynamic" "elemental" "else" "elseif" "elsewhere" "end" "enddo"
+      "endfile" "endif" "entry" "enum" "enumerator" "eoshift" "epsilon" "eq"
+      "equivalence" "eqv" "error_unit" "exit" "exp" "exponent" "extends"
+      "extends_type_of" "external" "extrinsic" "false" "file_storage_size"
+      "final" "floor" "flush" "forall" "format" "fraction" "function" "ge"
+      "generic" "get_command" "get_command_argument" "get_environment_variable"
+      "goto" "grade_down" "grade_up" "gt" "hpf_alignment" "hpf_distribution"
+      "hpf_template" "huge" "iachar" "iall" "iall_prefix" "iall_scatter"
+      "iall_suffix" "iand" "iany" "iany_prefix" "iany_scatter" "iany_suffix"
+      "ibclr" "ibits" "ibset" "ichar" "ieee_arithmetic" "ieee_exceptions"
+      "ieee_features" "ieee_get_underflow_mode" "ieee_set_underflow_mode"
+      "ieee_support_underflow_control" "ieor" "if" "ilen" "implicit"
+      "import" "include" "independent" "index" "inherit" "input_unit"
+      "inquire" "int" "integer" "intent" "interface" "intrinsic" "ior"
+      "iostat_end" "iostat_eor" "iparity" "iparity_prefix" "iparity_scatter"
+      "iparity_suffix" "ishft" "ishftc" "iso_c_binding" "iso_fortran_env"
+      "kind" "lbound" "le" "leadz" "len" "len_trim" "lge" "lgt" "lle" "llt"
+      "log" "log10" "logical" "lt" "matmul" "max" "maxexponent" "maxloc"
+      "maxval" "maxval_prefix" "maxval_scatter" "maxval_suffix" "merge"
+      "min" "minexponent" "minloc" "minval" "minval_prefix" "minval_scatter"
+      "minval_suffix" "mod" "module" "modulo" "move_alloc" "mvbits" "namelist"
+      "ne" "nearest" "neqv" "new" "new_line" "nint" "non_intrinsic"
+      "non_overridable" "none" "nopass" "not" "null" "nullify"
+      "number_of_processors" "numeric_storage_size" "only" "onto" "open"
+      "operator" "optional" "or" "output_unit" "pack" "parameter" "parity"
+      "parity_prefix" "parity_scatter" "parity_suffix" "pass" "pause"
+      "pointer" "popcnt" "poppar" "precision" "present" "print" "private"
+      "procedure" "processors" "processors_shape" "product" "product_prefix"
+      "product_scatter" "product_suffix" "program" "protected" "public"
+      "pure" "radix" "random_number" "random_seed" "range" "read" "real"
+      "realign" "recursive" "redistribute" "repeat" "reshape" "result"
+      "return" "rewind" "rrspacing" "same_type_as" "save" "scale" "scan"
+      "select" "selected_char_kind" "selected_int_kind" "selected_real_kind"
+      "sequence" "set_exponent" "shape" "sign" "sin" "sinh" "size" "spacing"
+      "spread" "sqrt" "stop" "subroutine" "sum" "sum_prefix" "sum_scatter"
+      "sum_suffix" "system_clock" "tan" "tanh" "target" "template" "then"
+      "tiny" "transfer" "transpose" "trim" "true" "type" "ubound" "unpack"
+      "use" "value" "verify" "volatile" "wait" "where" "while" "with" "write"))
+    (java-mode
+     "abstract" "assert" "boolean" "break" "byte" "case" "catch" "char" "class"
+     "continue" "default" "do" "double" "else" "enum" "extends" "final"
+     "finally" "float" "for" "if" "implements" "import" "instanceof" "int"
+     "interface" "long" "native" "new" "package" "private" "protected" "public"
+     "return" "short" "static" "strictfp" "super" "switch" "synchronized"
+     "this" "throw" "throws" "transient" "try" "void" "volatile" "while")
+    (javascript-mode
+     "break" "catch" "const" "continue" "delete" "do" "else" "export" "for"
+     "function" "if" "import" "in" "instanceOf" "label" "let" "new" "return"
+     "switch" "this" "throw" "try" "typeof" "var" "void" "while" "with" "yield")
+    (objc-mode
+     "@catch" "@class" "@encode" "@end" "@finally" "@implementation"
+     "@interface" "@private" "@protected" "@protocol" "@public"
+     "@selector" "@synchronized" "@throw" "@try" "alloc" "autorelease"
+     "bycopy" "byref" "in" "inout" "oneway" "out" "release" "retain")
+    (perl-mode
+     ;; from cperl.el
+     "AUTOLOAD" "BEGIN" "CHECK" "CORE" "DESTROY" "END" "INIT" "__END__"
+     "__FILE__" "__LINE__" "abs" "accept" "alarm" "and" "atan2" "bind"
+     "binmode" "bless" "caller" "chdir" "chmod" "chomp" "chop" "chown" "chr"
+     "chroot" "close" "closedir" "cmp" "connect" "continue" "cos"
+     "crypt" "dbmclose" "dbmopen" "defined" "delete" "die" "do" "dump" "each"
+     "else" "elsif" "endgrent" "endhostent" "endnetent" "endprotoent"
+     "endpwent" "endservent" "eof" "eq" "eval" "exec" "exists" "exit" "exp"
+     "fcntl" "fileno" "flock" "for" "foreach" "fork" "format" "formline"
+     "ge" "getc" "getgrent" "getgrgid" "getgrnam" "gethostbyaddr"
+     "gethostbyname" "gethostent" "getlogin" "getnetbyaddr" "getnetbyname"
+     "getnetent" "getpeername" "getpgrp" "getppid" "getpriority"
+     "getprotobyname" "getprotobynumber" "getprotoent" "getpwent" "getpwnam"
+     "getpwuid" "getservbyname" "getservbyport" "getservent" "getsockname"
+     "getsockopt" "glob" "gmtime" "goto" "grep" "gt" "hex" "if" "index" "int"
+     "ioctl" "join" "keys" "kill" "last" "lc" "lcfirst" "le" "length"
+     "link" "listen" "local" "localtime" "lock" "log" "lstat" "lt" "map"
+     "mkdir" "msgctl" "msgget" "msgrcv" "msgsnd" "my" "ne" "next" "no"
+     "not" "oct" "open" "opendir" "or" "ord" "our" "pack" "package" "pipe"
+     "pop" "pos" "print" "printf" "push" "q" "qq" "quotemeta" "qw" "qx"
+     "rand" "read" "readdir" "readline" "readlink" "readpipe" "recv" "redo"
+     "ref" "rename" "require" "reset" "return" "reverse" "rewinddir" "rindex"
+     "rmdir" "scalar" "seek" "seekdir" "select" "semctl" "semget" "semop"
+     "send" "setgrent" "sethostent" "setnetent" "setpgrp" "setpriority"
+     "setprotoent" "setpwent" "setservent" "setsockopt" "shift" "shmctl"
+     "shmget" "shmread" "shmwrite" "shutdown" "sin" "sleep" "socket"
+     "socketpair" "sort" "splice" "split" "sprintf" "sqrt" "srand" "stat"
+     "study" "sub" "substr" "symlink" "syscall" "sysopen" "sysread" "system"
+     "syswrite" "tell" "telldir" "tie" "time" "times" "tr" "truncate" "uc"
+     "ucfirst" "umask" "undef" "unless" "unlink" "unpack" "unshift" "untie"
+     "until" "use" "utime" "values" "vec" "wait" "waitpid"
+     "wantarray" "warn" "while" "write" "x" "xor" "y")
+    (php-mode
+     "__CLASS__" "__DIR__" "__FILE__" "__FUNCTION__" "__LINE__" "__METHOD__"
+     "__NAMESPACE__" "_once" "abstract" "and" "array" "as" "break" "case"
+     "catch" "cfunction" "class" "clone" "const" "continue" "declare"
+     "default" "die" "do" "echo" "else" "elseif" "empty" "enddeclare"
+     "endfor" "endforeach" "endif" "endswitch" "endwhile" "eval" "exception"
+     "exit" "extends" "final" "for" "foreach" "function" "global"
+     "goto" "if" "implements" "include" "instanceof" "interface"
+     "isset" "list" "namespace" "new" "old_function" "or" "php_user_filter"
+     "print" "private" "protected" "public" "require" "require_once" "return"
+     "static" "switch" "this" "throw" "try" "unset" "use" "var" "while" "xor")
+    (python-mode
+     "and" "assert" "break" "class" "continue" "def" "del" "elif" "else"
+     "except" "exec" "finally" "for" "from" "global" "if" "import" "in" "is"
+     "lambda" "not" "or" "pass" "print" "raise" "return" "try" "while" "yield")
+    (ruby-mode
+     "BEGIN" "END" "alias" "and"  "begin" "break" "case" "class" "def" "defined"
+     "do" "else" "elsif"  "end" "ensure" "false" "for" "if" "in" "module"
+     "next" "nil" "not" "or" "redo" "rescue" "retry" "return" "self" "super"
+     "then" "true" "undef" "unless" "until" "when" "while" "yield")
+    ;; aliases
+    (js2-mode . javascript-mode)
+    (espresso-mode . javascript-mode)
+    (cperl-mode . perl-mode)
+    (jde-mode . java-mode))
+  "Alist mapping major-modes to sorted keywords for `company-keywords'.")
+
+;;;###autoload
+(defun company-keywords (command &optional arg &rest ignored)
+  "`company-mode' back-end for programming language keywords."
+  (interactive (list 'interactive))
+  (case command
+    (interactive (company-begin-backend 'company-keywords))
+    (prefix (and (assq major-mode company-keywords-alist)
+                 (not (company-in-string-or-comment))
+                 (or (company-grab-symbol) 'stop)))
+    (candidates
+     (let ((completion-ignore-case nil)
+           (symbols (cdr (assq major-mode company-keywords-alist))))
+       (all-completions arg (if (consp symbols)
+                                symbols
+                              (cdr (assq symbols company-keywords-alist))))))
+    (sorted t)))
+
+(provide 'company-keywords)
+;;; company-keywords.el ends here
diff --git a/packages/company/company-nxml.el b/packages/company/company-nxml.el
new file mode 100644 (file)
index 0000000..62e6e31
--- /dev/null
@@ -0,0 +1,142 @@
+;;; company-nxml.el --- company-mode completion back-end for nxml-mode
+
+;; Copyright (C) 2009-2011, 2013  Free Software Foundation, Inc.
+
+;; Author: Nikolaj Schumacher
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+
+;;; Commentary:
+;;
+
+;;; Code:
+
+(require 'company)
+(eval-when-compile (require 'cl))
+
+(defvar rng-open-elements)
+(defvar rng-validate-mode)
+(defvar rng-in-attribute-regex)
+(defvar rng-in-attribute-value-regex)
+(declare-function rng-set-state-after "rng-nxml")
+(declare-function rng-match-possible-start-tag-names "rng-match")
+(declare-function rng-adjust-state-for-attribute "rng-nxml")
+(declare-function rng-match-possible-attribute-names "rng-match")
+(declare-function rng-adjust-state-for-attribute-value "rng-nxml")
+(declare-function rng-match-possible-value-strings "rng-match")
+
+(defconst company-nxml-token-regexp
+  "\\(?:[_[:alpha:]][-._[:alnum:]]*\\_>\\)")
+
+(defvar company-nxml-in-attribute-value-regexp
+  (replace-regexp-in-string "w" company-nxml-token-regexp
+   "<w\\(?::w\\)?\
+\\(?:[ \t\r\n]+w\\(?::w\\)?[ \t\r\n]*=\
+\[ \t\r\n]*\\(?:\"[^\"]*\"\\|'[^']*'\\)\\)*\
+\[ \t\r\n]+\\(w\\(:w\\)?\\)[ \t\r\n]*=[ \t\r\n]*\
+\\(\"\\([^\"]*\\>\\)\\|'\\([^']*\\>\\)\\)\\="
+   t t))
+
+(defvar company-nxml-in-tag-name-regexp
+  (replace-regexp-in-string "w" company-nxml-token-regexp
+                            "<\\(/?w\\(?::w?\\)?\\)?\\=" t t))
+
+(defun company-nxml-all-completions (prefix alist)
+  (let ((candidates (mapcar 'cdr alist))
+        (case-fold-search nil)
+        filtered)
+    (when (cdar rng-open-elements)
+      (push (concat "/" (cdar rng-open-elements)) candidates))
+    (setq candidates (sort (all-completions prefix candidates) 'string<))
+    (while candidates
+      (unless (equal (car candidates) (car filtered))
+        (push (car candidates) filtered))
+      (pop candidates))
+    (nreverse filtered)))
+
+(defmacro company-nxml-prepared (&rest body)
+  (declare (indent 0) (debug t))
+  `(let ((lt-pos (save-excursion (search-backward "<" nil t)))
+         xmltok-dtd)
+     (when (and lt-pos (= (rng-set-state-after lt-pos) lt-pos))
+       ,@body)))
+
+(defun company-nxml-tag (command &optional arg &rest ignored)
+  (case command
+    (prefix (and (derived-mode-p 'nxml-mode)
+                 rng-validate-mode
+                 (company-grab company-nxml-in-tag-name-regexp 1)))
+    (candidates (company-nxml-prepared
+                 (company-nxml-all-completions
+                  arg (rng-match-possible-start-tag-names))))
+    (sorted t)))
+
+(defun company-nxml-attribute (command &optional arg &rest ignored)
+  (case command
+    (prefix (and (derived-mode-p 'nxml-mode)
+                 rng-validate-mode
+                 (memq (char-after) '(?\  ?\t ?\n)) ;; outside word
+                 (company-grab rng-in-attribute-regex 1)))
+    (candidates (company-nxml-prepared
+                 (and (rng-adjust-state-for-attribute
+                       lt-pos (- (point) (length arg)))
+                      (company-nxml-all-completions
+                       arg (rng-match-possible-attribute-names)))))
+    (sorted t)))
+
+(defun company-nxml-attribute-value (command &optional arg &rest ignored)
+  (case command
+    (prefix (and (derived-mode-p 'nxml-mode)
+                 rng-validate-mode
+                 (and (memq (char-after) '(?' ?\" ?\  ?\t ?\n)) ;; outside word
+                      (looking-back company-nxml-in-attribute-value-regexp)
+                      (or (match-string-no-properties 4)
+                          (match-string-no-properties 5)
+                          ""))))
+    (candidates (company-nxml-prepared
+                 (let (attr-start attr-end colon)
+                   (and (looking-back rng-in-attribute-value-regex lt-pos)
+                        (setq colon (match-beginning 2)
+                              attr-start (match-beginning 1)
+                              attr-end (match-end 1))
+                        (rng-adjust-state-for-attribute lt-pos attr-start)
+                        (rng-adjust-state-for-attribute-value
+                         attr-start colon attr-end)
+                        (all-completions
+                         arg (rng-match-possible-value-strings))))))))
+
+;;;###autoload
+(defun company-nxml (command &optional arg &rest ignored)
+  "`company-mode' completion back-end for `nxml-mode'."
+  (interactive (list 'interactive))
+  (case command
+    (interactive (company-begin-backend 'company-nxml))
+    (prefix (or (company-nxml-tag 'prefix)
+                (company-nxml-attribute 'prefix)
+                (company-nxml-attribute-value 'prefix)))
+    (candidates (cond
+                 ((company-nxml-tag 'prefix)
+                  (company-nxml-tag 'candidates arg))
+                 ((company-nxml-attribute 'prefix)
+                  (company-nxml-attribute 'candidates arg))
+                 ((company-nxml-attribute-value 'prefix)
+                  (sort (company-nxml-attribute-value 'candidates arg)
+                        'string<))))
+    (sorted t)))
+
+(provide 'company-nxml)
+;;; company-nxml.el ends here
diff --git a/packages/company/company-oddmuse.el b/packages/company/company-oddmuse.el
new file mode 100644 (file)
index 0000000..b76c87e
--- /dev/null
@@ -0,0 +1,57 @@
+;;; company-oddmuse.el --- company-mode completion back-end for oddmuse-mode
+
+;; Copyright (C) 2009-2011  Free Software Foundation, Inc.
+
+;; Author: Nikolaj Schumacher
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+
+;;; Commentary:
+;;
+
+;;; Code:
+
+(require 'company)
+(eval-when 'compile (require 'yaooddmuse nil t))
+(eval-when 'compile (require 'oddmuse nil t))
+(eval-when-compile (require 'cl))
+
+(defvar company-oddmuse-link-regexp
+  "\\(\\<[A-Z][[:alnum:]]*\\>\\)\\|\\[\\[\\([[:alnum:]]+\\>\\|\\)")
+
+(defun company-oddmuse-get-page-table ()
+  (case major-mode
+    (yaoddmuse-mode (with-no-warnings
+                      (yaoddmuse-get-pagename-table yaoddmuse-wikiname)))
+    (oddmuse-mode (with-no-warnings
+                    (oddmuse-make-completion-table oddmuse-wiki)))))
+
+;;;###autoload
+(defun company-oddmuse (command &optional arg &rest ignored)
+  "`company-mode' completion back-end for `oddmuse-mode'."
+  (interactive (list 'interactive))
+  (case command
+    (interactive (company-begin-backend 'company-oddmuse))
+    (prefix (let ((case-fold-search nil))
+              (and (memq major-mode '(oddmuse-mode yaoddmuse-mode))
+                   (looking-back company-oddmuse-link-regexp (point-at-bol))
+                   (or (match-string 1)
+                       (match-string 2)))))
+    (candidates (all-completions arg (company-oddmuse-get-page-table)))))
+
+(provide 'company-oddmuse)
+;;; company-oddmuse.el ends here
diff --git a/packages/company/company-pysmell.el b/packages/company/company-pysmell.el
new file mode 100644 (file)
index 0000000..5c44f06
--- /dev/null
@@ -0,0 +1,69 @@
+;;; company-pysmell.el --- company-mode completion back-end for pysmell.el
+
+;; Copyright (C) 2009-2011, 2013  Free Software Foundation, Inc.
+
+;; Author: Nikolaj Schumacher
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+
+;;; Commentary:
+;;
+;; The main problem with using this backend is installing Pysmell.
+;; I couldn't manage to do that. --Dmitry
+
+;;; Code:
+
+(eval-when-compile (require 'cl))
+(if t (require 'pysmell))               ;Don't load during compilation.
+
+(defvar company-pysmell--available-p 'unknown)
+(make-variable-buffer-local 'company-pysmell--available-p)
+
+(defun company-pysmell--available-p ()
+  (if (eq company-pysmell--available-p 'unknown)
+      (setq company-pysmell--available-p
+            (company-locate-dominating-file buffer-file-name "PYSMELLTAGS"))
+    company-pysmell--available-p))
+
+(defun company-pysmell--grab-symbol ()
+  (let ((symbol (company-grab-symbol)))
+    (when symbol
+      (cons symbol
+            (save-excursion
+              (let ((pos (point)))
+                (goto-char (- (point) (length symbol)))
+                (while (eq (char-before) ?.)
+                  (goto-char (1- (point)))
+                  (skip-syntax-backward "w_"))
+                (- pos (point))))))))
+
+;;;###autoload
+(defun company-pysmell (command &optional arg &rest ignored)
+  "`company-mode' completion back-end for pysmell.
+This requires pysmell.el and pymacs.el."
+  (interactive (list 'interactive))
+  (case command
+    (interactive (company-begin-backend 'company-pysmell))
+    (prefix (and (derived-mode-p 'python-mode)
+                 buffer-file-name
+                 (not (company-in-string-or-comment))
+                 (company-pysmell--available-p)
+                 (company-pysmell--grab-symbol)))
+    (candidates (delete "" (pysmell-get-all-completions)))))
+
+(provide 'company-pysmell)
+;;; company-pysmell.el ends here
diff --git a/packages/company/company-ropemacs.el b/packages/company/company-ropemacs.el
new file mode 100644 (file)
index 0000000..0ba26e6
--- /dev/null
@@ -0,0 +1,76 @@
+;;; company-ropemacs.el --- company-mode completion back-end for ropemacs
+
+;; Copyright (C) 2009-2011, 2013  Free Software Foundation, Inc.
+
+;; Author: Nikolaj Schumacher
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+
+;;; Commentary:
+;;
+
+;;; Code:
+
+(eval-when-compile (require 'cl))
+
+(defun company-ropemacs--grab-symbol ()
+  (let ((symbol (company-grab-symbol)))
+    (when symbol
+      (cons symbol
+            (save-excursion
+              (let ((pos (point)))
+                (goto-char (- (point) (length symbol)))
+                (while (eq (char-before) ?.)
+                  (goto-char (1- (point)))
+                  (skip-syntax-backward "w_"))
+                (- pos (point))))))))
+
+(defun company-ropemacs-doc-buffer (candidate)
+  "Return buffer with docstring of CANDIDATE if it is available."
+  (let ((doc (company-with-candidate-inserted candidate (rope-get-doc))))
+    (when doc
+      (company-doc-buffer doc))))
+
+(defun company-ropemacs-location (candidate)
+  "Return location of CANDIDATE in cons form (FILE . LINE) if it is available."
+  (let ((location (company-with-candidate-inserted candidate
+                    (rope-definition-location))))
+    (when location
+      (cons (elt location 0) (elt location 1)))))
+
+(defun company-ropemacs (command &optional arg &rest ignored)
+  "`company-mode' completion back-end for ropemacs.
+
+Depends on third-party code: Pymacs (both Python and Emacs packages),
+rope, ropemacs and ropemode."
+  (interactive (list 'interactive))
+  (case command
+    (init (when (and (derived-mode-p 'python-mode)
+                     (not (fboundp 'rope-completions)))
+            (require 'pymacs)
+            (pymacs-load "ropemacs" "rope-")))
+    (interactive (company-begin-backend 'company-ropemacs))
+    (prefix (and (derived-mode-p 'python-mode)
+                 (not (company-in-string-or-comment))
+                 (company-ropemacs--grab-symbol)))
+    (candidates (mapcar (lambda (element) (concat arg element))
+                        (rope-completions)))
+    (doc-buffer (company-ropemacs-doc-buffer arg))
+    (location (company-ropemacs-location arg))))
+
+(provide 'company-ropemacs)
+;;; company-ropemacs.el ends here
diff --git a/packages/company/company-semantic.el b/packages/company/company-semantic.el
new file mode 100644 (file)
index 0000000..796cc9e
--- /dev/null
@@ -0,0 +1,141 @@
+;;; company-semantic.el --- company-mode completion back-end using Semantic
+
+;; Copyright (C) 2009-2011, 2013  Free Software Foundation, Inc.
+
+;; Author: Nikolaj Schumacher
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+
+;;; Commentary:
+;;
+
+;;; Code:
+
+(require 'company)
+(eval-when-compile (require 'cl))
+
+(defvar semantic-idle-summary-function)
+(declare-function semantic-documentation-for-tag "semantic/doc" )
+(declare-function semantic-analyze-current-context "semantic/analyze")
+(declare-function semantic-analyze-possible-completions "semantic/complete")
+(declare-function semantic-analyze-find-tags-by-prefix "semantic/analyze/fcn")
+(declare-function semantic-tag-class "semantic/tag")
+(declare-function semantic-tag-name "semantic/tag")
+(declare-function semantic-tag-start "semantic/tag")
+(declare-function semantic-tag-buffer "semantic/tag")
+(declare-function semantic-active-p "semantic")
+
+(defgroup company-semantic nil
+  "Completion back-end using Semantic."
+  :group 'company)
+
+(defcustom company-semantic-metadata-function 'company-semantic-summary-and-doc
+  "The function turning a semantic tag into doc information."
+  :type 'function)
+
+(defvar company-semantic-modes '(c-mode c++-mode jde-mode java-mode))
+
+(defvar company-semantic--current-tags nil
+  "Tags for the current context.")
+
+(defun company-semantic-doc-or-summary (tag)
+  (or (semantic-documentation-for-tag tag)
+      (and (require 'semantic-idle nil t)
+           (require 'semantic/idle nil t)
+           (funcall semantic-idle-summary-function tag nil t))))
+
+(defun company-semantic-summary-and-doc (tag)
+  (let ((doc (semantic-documentation-for-tag tag))
+        (summary (funcall semantic-idle-summary-function tag nil t)))
+    (and (stringp doc)
+         (string-match "\n*\\(.*\\)$" doc)
+         (setq doc (match-string 1 doc)))
+    (concat (funcall semantic-idle-summary-function tag nil t)
+            (when doc
+                  (if (< (+ (length doc) (length summary) 4) (window-width))
+                      " -- "
+                    "\n"))
+            doc)))
+
+(defun company-semantic-doc-buffer (tag)
+  (let ((doc (semantic-documentation-for-tag tag)))
+    (when doc
+      (company-doc-buffer
+       (concat (funcall semantic-idle-summary-function tag nil t)
+               "\n"
+               doc)))))
+
+(defsubst company-semantic-completions (prefix)
+  (ignore-errors
+    (let ((completion-ignore-case nil)
+          (context (semantic-analyze-current-context)))
+      (setq company-semantic--current-tags
+            (semantic-analyze-possible-completions context))
+      (all-completions prefix company-semantic--current-tags))))
+
+(defun company-semantic-completions-raw (prefix)
+  (setq company-semantic--current-tags nil)
+  (dolist (tag (semantic-analyze-find-tags-by-prefix prefix))
+    (unless (eq (semantic-tag-class tag) 'include)
+      (push tag company-semantic--current-tags)))
+  (delete "" (mapcar 'semantic-tag-name company-semantic--current-tags)))
+
+(defun company-semantic--pre-prefix-length (prefix-length)
+  "Sum up the length of all chained symbols before POS.
+Symbols are chained by \".\" or \"->\"."
+  (save-excursion
+    (let ((pos (point)))
+      (goto-char (- (point) prefix-length))
+      (while (looking-back "->\\|\\.")
+        (goto-char (match-beginning 0))
+        (skip-syntax-backward "w_"))
+      (- pos (point)))))
+
+(defun company-semantic--grab ()
+  "Grab the semantic prefix, but return everything before -> or . as length."
+  (let ((symbol (company-grab-symbol)))
+    (when symbol
+      (cons symbol (company-semantic--pre-prefix-length (length symbol))))))
+
+;;;###autoload
+(defun company-semantic (command &optional arg &rest ignored)
+  "`company-mode' completion back-end using CEDET Semantic."
+  (interactive (list 'interactive))
+  (case command
+    (interactive (company-begin-backend 'company-semantic))
+    (prefix (and (featurep 'semantic)
+                 (semantic-active-p)
+                 (memq major-mode company-semantic-modes)
+                 (not (company-in-string-or-comment))
+                 (or (company-semantic--grab) 'stop)))
+    (candidates (if (and (equal arg "")
+                         (not (looking-back "->\\|\\.")))
+                    (company-semantic-completions-raw arg)
+                  (company-semantic-completions arg)))
+    (meta (funcall company-semantic-metadata-function
+                   (assoc arg company-semantic--current-tags)))
+    (doc-buffer (company-semantic-doc-buffer
+                 (assoc arg company-semantic--current-tags)))
+    ;; Because "" is an empty context and doesn't return local variables.
+    (no-cache (equal arg ""))
+    (location (let ((tag (assoc arg company-semantic--current-tags)))
+                (when (buffer-live-p (semantic-tag-buffer tag))
+                  (cons (semantic-tag-buffer tag)
+                        (semantic-tag-start tag)))))))
+
+(provide 'company-semantic)
+;;; company-semantic.el ends here
diff --git a/packages/company/company-template.el b/packages/company/company-template.el
new file mode 100644 (file)
index 0000000..6ffd648
--- /dev/null
@@ -0,0 +1,168 @@
+;;; company-template.el
+
+;; Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+
+;; Author: Nikolaj Schumacher
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Code:
+
+(eval-when-compile (require 'cl))
+
+(defface company-template-field
+  '((((background dark)) (:background "yellow" :foreground "black"))
+    (((background light)) (:background "orange" :foreground "black")))
+  "Face used for editable text in template fields."
+  :group 'company)
+
+(defvar company-template-nav-map
+  (let ((keymap (make-sparse-keymap)))
+    (define-key keymap [tab] 'company-template-forward-field)
+    keymap))
+
+;; interactive ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defun company-template-templates-at (pos)
+  (let (os)
+    (dolist (o (overlays-at pos))
+      ;; FIXME: Always return the whole list of templates?
+      ;; We remove templates not at point after every command.
+      (when (memq o company-template--buffer-templates)
+        (push o os)))
+    os))
+
+(defun company-template-move-to-first (templ)
+  (interactive)
+  (goto-char (overlay-start templ))
+  (company-template-forward-field))
+
+(defun company-template-forward-field ()
+  (interactive)
+  (let* ((start (point))
+         (templates (company-template-templates-at (point)))
+         (minimum (apply 'max (mapcar 'overlay-end templates)))
+         (fields (loop for templ in templates
+                       append (overlay-get templ 'company-template-fields))))
+    (dolist (pos (mapcar 'overlay-start fields))
+      (and pos
+           (> pos (point))
+           (< pos minimum)
+           (setq minimum pos)))
+    (push-mark)
+    (goto-char minimum)
+    (company-template-remove-field (company-template-field-at start))))
+
+(defun company-template-field-at (&optional point)
+  (loop for ovl in (overlays-at (or point (point)))
+        when (overlay-get ovl 'company-template-parent)
+        return ovl))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defvar company-template--buffer-templates nil)
+(make-variable-buffer-local 'company-template--buffer-templates)
+
+(defun company-template-declare-template (beg end)
+  (let ((ov (make-overlay beg end)))
+    ;; (overlay-put ov 'face 'highlight)
+    (overlay-put ov 'keymap company-template-nav-map)
+    (overlay-put ov 'priority 101)
+    (overlay-put ov 'evaporate t)
+    (push ov company-template--buffer-templates)
+    (add-hook 'post-command-hook 'company-template-post-command nil t)
+    ov))
+
+(defun company-template-remove-template (templ)
+  (mapc 'company-template-remove-field
+        (overlay-get templ 'company-template-fields))
+  (setq company-template--buffer-templates
+        (delq templ company-template--buffer-templates))
+  (delete-overlay templ))
+
+(defun company-template-add-field (templ pos text &optional display)
+  "Add new field to template TEMPL at POS, inserting TEXT.
+When DISPLAY is non-nil, set the respective property on the overlay.
+Leave point at the end of the field."
+  (assert templ)
+  (goto-char pos)
+  (insert text)
+  (when (> (point) (overlay-end templ))
+    (move-overlay templ (overlay-start templ) (point)))
+  (let ((ov (make-overlay pos (+ pos (length text))))
+        (siblings (overlay-get templ 'company-template-fields)))
+    ;; (overlay-put ov 'evaporate t)
+    (overlay-put ov 'intangible t)
+    (overlay-put ov 'face 'company-template-field)
+    (when display
+      (overlay-put ov 'display display))
+    (overlay-put ov 'company-template-parent templ)
+    (overlay-put ov 'insert-in-front-hooks '(company-template-insert-hook))
+    (push ov siblings)
+    (overlay-put templ 'company-template-fields siblings)))
+
+(defun company-template-remove-field (ovl &optional clear)
+  (when (overlayp ovl)
+    (when (overlay-buffer ovl)
+      (when clear
+        (delete-region (overlay-start ovl) (overlay-end ovl)))
+      (delete-overlay ovl))
+    (let* ((templ (overlay-get ovl 'company-template-parent))
+           (siblings (overlay-get templ 'company-template-fields)))
+      (setq siblings (delq ovl siblings))
+      (overlay-put templ 'company-template-fields siblings))))
+
+(defun company-template-clean-up (&optional pos)
+  "Clean up all templates that don't contain POS."
+  (let ((local-ovs (overlays-at (or pos (point)))))
+    (dolist (templ company-template--buffer-templates)
+      (unless (memq templ local-ovs)
+        (company-template-remove-template templ)))))
+
+;; hooks ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defun company-template-insert-hook (ovl after-p &rest ignore)
+  "Called when a snippet input prompt is modified."
+  (unless after-p
+    (company-template-remove-field ovl t)))
+
+(defun company-template-post-command ()
+  (company-template-clean-up)
+  (unless company-template--buffer-templates
+    (remove-hook 'post-command-hook 'company-template-post-command t)))
+
+;; common ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defun company-template-c-like-templatify (call)
+  (let* ((end (point-marker))
+         (beg (- (point) (length call)))
+         (cnt 0))
+    (goto-char beg)
+    (when (search-forward "(" end 'move)
+      (if (eq (char-after) ?\))
+          (forward-char 1)
+        (let ((templ (company-template-declare-template beg end)))
+          (while (re-search-forward (concat " *\\([^,)]*\\)[,)]") end t)
+            (let ((sig (match-string 1)))
+              (delete-region (match-beginning 1) (match-end 1))
+              (save-excursion
+                (company-template-add-field templ (match-beginning 1)
+                                            (format "arg%d" cnt) sig))
+              (incf cnt)))
+          (company-template-move-to-first templ))))))
+
+(provide 'company-template)
+;;; company-template.el ends here
diff --git a/packages/company/company-tempo.el b/packages/company/company-tempo.el
new file mode 100644 (file)
index 0000000..feea698
--- /dev/null
@@ -0,0 +1,63 @@
+;;; company-tempo.el --- company-mode completion back-end for tempo
+
+;; Copyright (C) 2009-2011  Free Software Foundation, Inc.
+
+;; Author: Nikolaj Schumacher
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+
+;;; Commentary:
+;;
+
+;;; Code:
+
+(require 'company)
+(eval-when-compile (require 'cl))
+(require 'tempo)
+
+(defsubst company-tempo-lookup (match)
+  (cdr (assoc match (tempo-build-collection))))
+
+(defun company-tempo-insert (match)
+  "Replace MATCH with the expanded tempo template."
+  (search-backward match)
+  (goto-char (match-beginning 0))
+  (replace-match "")
+  (call-interactively (company-tempo-lookup match)))
+
+(defsubst company-tempo-meta (match)
+  (let ((templ (company-tempo-lookup match))
+        doc)
+    (and templ
+         (setq doc (documentation templ t))
+         (car (split-string doc "\n" t)))))
+
+;;;###autoload
+(defun company-tempo (command &optional arg &rest ignored)
+  "`company-mode' completion back-end for tempo."
+  (interactive (list 'interactive))
+  (case command
+    (interactive (company-begin-backend 'company-tempo
+                                        'company-tempo-insert))
+    (prefix (or (car (tempo-find-match-string tempo-match-finder)) ""))
+    (candidates (all-completions arg (tempo-build-collection)))
+    (meta (company-tempo-meta arg))
+    (require-match t)
+    (sorted t)))
+
+(provide 'company-tempo)
+;;; company-tempo.el ends here
diff --git a/packages/company/company-tests.el b/packages/company/company-tests.el
new file mode 100644 (file)
index 0000000..9f837cb
--- /dev/null
@@ -0,0 +1,460 @@
+;;; company-tests.el --- company-mode tests
+
+;; Copyright (C) 2011, 2013  Free Software Foundation, Inc.
+
+;; Author: Nikolaj Schumacher
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+
+;;; Commentary:
+;;
+
+;;; Code:
+
+(eval-when-compile (require 'cl))
+(require 'ert)
+(require 'company)
+(require 'company-keywords)
+(require 'company-elisp)
+(require 'company-clang)
+
+;;; Core
+
+(ert-deftest company-sorted-keywords ()
+  "Test that keywords in `company-keywords-alist' are in alphabetical order."
+  (dolist (pair company-keywords-alist)
+    (when (consp (cdr pair))
+      (let ((prev (cadr pair)))
+        (dolist (next (cddr pair))
+          (should (not (equal prev next)))
+          (should (string< prev next))
+          (setq prev next))))))
+
+(ert-deftest company-good-prefix ()
+  (let ((company-minimum-prefix-length 5)
+        company--explicit-action)
+    (should (eq t (company--good-prefix-p "!@#$%")))
+    (should (eq nil (company--good-prefix-p "abcd")))
+    (should (eq nil (company--good-prefix-p 'stop)))
+    (should (eq t (company--good-prefix-p '("foo" . 5))))
+    (should (eq nil (company--good-prefix-p '("foo" . 4))))))
+
+(ert-deftest company-multi-backend-with-lambdas ()
+  (let ((company-backend
+         (list (lambda (command &optional arg &rest ignore)
+                 (case command
+                   (prefix "z")
+                   (candidates '("a" "b"))))
+               (lambda (command &optional arg &rest ignore)
+                 (case command
+                   (prefix "z")
+                   (candidates '("c" "d")))))))
+    (should (equal (company-call-backend 'candidates "z") '("a" "b" "c" "d")))))
+
+(ert-deftest company-begin-backend-failure-doesnt-break-company-backends ()
+  (with-temp-buffer
+    (insert "a")
+    (company-mode)
+    (should-error
+     (company-begin-backend (lambda (command &rest ignore))))
+    (let (company-frontends
+          (company-backends
+           (list (lambda (command &optional arg)
+                   (case command
+                     (prefix "a")
+                     (candidates '("a" "ab" "ac")))))))
+      (let (this-command)
+        (company-call 'complete))
+      (should (eq 3 company-candidates-length)))))
+
+(ert-deftest company-require-match-explicit ()
+  (with-temp-buffer
+    (insert "ab")
+    (company-mode)
+    (let (company-frontends
+          (company-require-match 'company-explicit-action-p)
+          (company-backends
+           (list (lambda (command &optional arg)
+                   (case command
+                     (prefix (buffer-substring (point-min) (point)))
+                     (candidates '("abc" "abd")))))))
+      (let (this-command)
+        (company-complete))
+      (let ((last-command-event ?e))
+        (company-call 'self-insert-command 1))
+      (should (eq 2 company-candidates-length))
+      (should (eq 3 (point))))))
+
+(ert-deftest company-dont-require-match-when-idle ()
+  (with-temp-buffer
+    (insert "ab")
+    (company-mode)
+    (let (company-frontends
+          (company-require-match 'company-explicit-action-p)
+          (company-backends
+           (list (lambda (command &optional arg)
+                   (case command
+                     (prefix (buffer-substring (point-min) (point)))
+                     (candidates '("abc" "abd")))))))
+      (company-idle-begin (current-buffer) (selected-window)
+                          (buffer-chars-modified-tick) (point))
+      (let ((last-command-event ?e))
+        (company-call 'self-insert-command 1))
+      (should (eq nil company-candidates-length))
+      (should (eq 4 (point))))))
+
+(ert-deftest company-auto-complete-explicit ()
+  (with-temp-buffer
+    (insert "ab")
+    (company-mode)
+    (let (company-frontends
+          (company-auto-complete 'company-explicit-action-p)
+          (company-auto-complete-chars '(? ))
+          (company-backends
+           (list (lambda (command &optional arg)
+                   (case command
+                     (prefix (buffer-substring (point-min) (point)))
+                     (candidates '("abcd" "abef")))))))
+      (let (this-command)
+        (company-complete))
+      (let ((last-command-event ? ))
+        (company-call 'self-insert-command 1))
+      (should (string= "abcd " (buffer-string))))))
+
+(ert-deftest company-no-auto-complete-when-idle ()
+  (with-temp-buffer
+    (insert "ab")
+    (company-mode)
+    (let (company-frontends
+          (company-auto-complete 'company-explicit-action-p)
+          (company-auto-complete-chars '(? ))
+          (company-backends
+           (list (lambda (command &optional arg)
+                   (case command
+                     (prefix (buffer-substring (point-min) (point)))
+                     (candidates '("abcd" "abef")))))))
+      (company-idle-begin (current-buffer) (selected-window)
+                          (buffer-chars-modified-tick) (point))
+      (let ((last-command-event ? ))
+        (company-call 'self-insert-command 1))
+      (should (string= "ab " (buffer-string))))))
+
+(ert-deftest company-clears-explicit-action-when-no-matches ()
+  (with-temp-buffer
+    (company-mode)
+    (let (company-frontends
+          company-backends)
+      (company-call 'manual-begin) ;; fails
+      (should (null company-candidates))
+      (should (null (company-explicit-action-p))))))
+
+(ert-deftest company-pseudo-tooltip-does-not-get-displaced ()
+  :tags '(interactive)
+  (with-temp-buffer
+    (save-window-excursion
+      (set-window-buffer nil (current-buffer))
+      (save-excursion (insert " ff"))
+      (company-mode)
+      (let ((company-frontends '(company-pseudo-tooltip-frontend))
+            (company-begin-commands '(self-insert-command))
+            (company-backends
+             (list (lambda (c &optional arg)
+                     (case c (prefix "") (candidates '("a" "b" "c")))))))
+        (let (this-command)
+          (company-call 'complete))
+        (company-call 'open-line 1)
+        (should (eq 2 (overlay-start company-pseudo-tooltip-overlay)))))))
+
+(ert-deftest company-pseudo-tooltip-overlay-show ()
+  :tags '(interactive)
+  (with-temp-buffer
+    (save-window-excursion
+    (set-window-buffer nil (current-buffer))
+    (insert "aaaa\n bb\nccccc\nddd")
+    (search-backward "bb")
+    (let ((col (company--column))
+          (company-candidates-length 2)
+          (company-candidates '("123" "45")))
+      (company-pseudo-tooltip-show (company--row) col 0)
+      (let ((ov company-pseudo-tooltip-overlay))
+        (should (eq (overlay-get ov 'company-width) 3))
+        ;; FIXME: Make it 2?
+        (should (eq (overlay-get ov 'company-height) company-tooltip-limit))
+        (should (eq (overlay-get ov 'company-column) col))
+        (should (string= (overlay-get ov 'company-before)
+                         " 123\nc45 c\nddd\n")))))))
+
+(ert-deftest company-column-with-composition ()
+  (with-temp-buffer
+    (insert "lambda ()")
+    (compose-region 1 (1+ (length "lambda")) "\\")
+    (should (= (company--column) 4))))
+
+(ert-deftest company-column-with-line-prefix ()
+  (with-temp-buffer
+    (insert "foo")
+    (put-text-property (point-min) (point) 'line-prefix "  ")
+    (should (= (company--column) 5))))
+
+(ert-deftest company-modify-line-with-line-prefix ()
+  (let ((str (propertize "foobar" 'line-prefix "-*-")))
+    (should (equal-including-properties
+             (company-modify-line str "zz" 4)
+             "-*-fzzbar"))
+    (should (equal-including-properties
+             (company-modify-line str "zzxx" 1)
+             "-zzxxobar"))
+    (should (equal-including-properties
+             (company-modify-line str "xx" 0)
+             "xx-foobar"))
+    (should (equal-including-properties
+             (company-modify-line str "zz" 10)
+             "-*-foobar zz"))))
+
+;;; Template
+
+(ert-deftest company-template-removed-after-the-last-jump ()
+  (with-temp-buffer
+    (insert "{ }")
+    (goto-char 2)
+    (let ((tpl (company-template-declare-template (point) (1- (point-max)))))
+      (save-excursion
+        (dotimes (i 2)
+          (insert " ")
+          (company-template-add-field tpl (point) "foo")))
+      (company-call 'template-forward-field)
+      (should (= 3 (point)))
+      (company-call 'template-forward-field)
+      (should (= 7 (point)))
+      (company-call 'template-forward-field)
+      (should (= 11 (point)))
+      (should (zerop (length (overlay-get tpl 'company-template-fields))))
+      (should (null (overlay-buffer tpl))))))
+
+(ert-deftest company-template-removed-after-input-and-jump ()
+  (with-temp-buffer
+    (insert "{ }")
+    (goto-char 2)
+    (let ((tpl (company-template-declare-template (point) (1- (point-max)))))
+      (save-excursion
+        (insert " ")
+        (company-template-add-field tpl (point) "bar"))
+      (company-call 'template-move-to-first tpl)
+      (should (= 3 (point)))
+      (dolist (c (string-to-list "tee"))
+        (let ((last-command-event c))
+          (company-call 'self-insert-command 1)))
+      (should (string= "{ tee }" (buffer-string)))
+      (should (overlay-buffer tpl))
+      (company-call 'template-forward-field)
+      (should (= 7 (point)))
+      (should (null (overlay-buffer tpl))))))
+
+(defun company-call (name &rest args)
+  (let* ((maybe (intern (format "company-%s" name)))
+         (command (if (fboundp maybe) maybe name)))
+    (apply command args)
+    (let ((this-command command))
+      (run-hooks 'post-command-hook))))
+
+(ert-deftest company-template-c-like-templatify ()
+  (with-temp-buffer
+    (let ((text "foo(int a, short b)"))
+      (insert text)
+      (company-template-c-like-templatify text)
+      (should (equal "foo(arg0, arg1)" (buffer-string)))
+      (should (looking-at "arg0"))
+      (should (equal "int a"
+                     (overlay-get (company-template-field-at) 'display))))))
+
+;;; Elisp
+
+(defmacro company-elisp-with-buffer (contents &rest body)
+  (declare (indent 0))
+  `(with-temp-buffer
+     (insert ,contents)
+     (setq major-mode 'emacs-lisp-mode)
+     (re-search-backward "|")
+     (replace-match "")
+     (let ((company-elisp-detect-function-context t))
+       ,@body)))
+
+(ert-deftest company-elisp-candidates-predicate ()
+  (company-elisp-with-buffer
+    "(foo ba|)"
+    (should (eq (company-elisp--candidates-predicate "ba")
+                'boundp))
+    (should (eq (let (company-elisp-detect-function-context)
+                  (company-elisp--candidates-predicate "ba"))
+                'company-elisp--predicate)))
+  (company-elisp-with-buffer
+    "(foo| )"
+    (should (eq (company-elisp--candidates-predicate "foo")
+                'fboundp))
+    (should (eq (let (company-elisp-detect-function-context)
+                  (company-elisp--candidates-predicate "foo"))
+                'company-elisp--predicate)))
+  (company-elisp-with-buffer
+    "(foo 'b|)"
+    (should (eq (company-elisp--candidates-predicate "b")
+                'company-elisp--predicate))))
+
+(ert-deftest company-elisp-candidates-predicate-in-docstring ()
+  (company-elisp-with-buffer
+   "(def foo () \"Doo be doo `ide|"
+   (should (eq 'company-elisp--predicate
+               (company-elisp--candidates-predicate "ide")))))
+
+;; This one's also an integration test.
+(ert-deftest company-elisp-candidates-recognizes-binding-form ()
+  (let ((company-elisp-detect-function-context t)
+        (obarray [when what whelp])
+        (what 1)
+        (whelp 2)
+        (wisp 3))
+    (company-elisp-with-buffer
+      "(let ((foo 7) (wh| )))"
+      (should (equal '("what" "whelp")
+                     (company-elisp-candidates "wh"))))
+    (company-elisp-with-buffer
+      "(cond ((null nil) (wh| )))"
+      (should (equal '("when")
+                     (company-elisp-candidates "wh"))))))
+
+(ert-deftest company-elisp-candidates-predicate-binding-without-value ()
+  (loop for (text prefix predicate) in '(("(let (foo|" "foo" boundp)
+                                         ("(let (foo (bar|" "bar" boundp)
+                                         ("(let (foo) (bar|" "bar" fboundp))
+        do
+        (eval `(company-elisp-with-buffer
+                 ,text
+                 (should (eq ',predicate
+                             (company-elisp--candidates-predicate ,prefix)))))))
+
+(ert-deftest company-elisp-finds-vars ()
+  (let ((obarray [boo bar baz backquote])
+        (boo t)
+        (bar t)
+        (baz t))
+    (should (equal '("bar" "baz")
+                   (company-elisp--globals "ba" 'boundp)))))
+
+(ert-deftest company-elisp-finds-functions ()
+  (let ((obarray [when what whelp])
+        (what t)
+        (whelp t))
+    (should (equal '("when")
+                   (company-elisp--globals "wh" 'fboundp)))))
+
+(ert-deftest company-elisp-finds-things ()
+  (let ((obarray [when what whelp])
+        (what t)
+        (whelp t))
+    (should (equal '("what" "whelp" "when")
+                   (sort (company-elisp--globals "wh" 'company-elisp--predicate)
+                         'string<)))))
+
+(ert-deftest company-elisp-locals-vars ()
+  (company-elisp-with-buffer
+    "(let ((foo 5) (bar 6))
+       (cl-labels ((borg ()))
+         (lambda (boo baz)
+           b|)))"
+    (should (equal '("bar" "baz" "boo")
+                   (company-elisp--locals "b" nil)))))
+
+(ert-deftest company-elisp-locals-single-var ()
+  (company-elisp-with-buffer
+    "(dotimes (itk 100)
+       (dolist (item items)
+         it|))"
+    (should (equal '("itk" "item")
+                   (company-elisp--locals "it" nil)))))
+
+(ert-deftest company-elisp-locals-funs ()
+  (company-elisp-with-buffer
+    "(cl-labels ((foo ())
+                 (fee ()))
+       (let ((fun 4))
+         (f| )))"
+    (should (equal '("fee" "foo")
+                   (sort (company-elisp--locals "f" t) 'string<)))))
+
+(ert-deftest company-elisp-locals-skips-current-varlist ()
+  (company-elisp-with-buffer
+    "(let ((foo 1)
+           (f| )))"
+    (should (null (company-elisp--locals "f" nil)))))
+
+(ert-deftest company-elisp-show-locals-first ()
+  (company-elisp-with-buffer
+    "(let ((floo 1)
+           (flop 2)
+           (flee 3))
+       fl|)"
+    (let ((obarray [float-pi]))
+      (let (company-elisp-show-locals-first)
+        (should (eq nil (company-elisp 'sorted))))
+      (let ((company-elisp-show-locals-first t))
+        (should (eq t (company-elisp 'sorted)))
+        (should (equal '("flee" "floo" "flop" "float-pi")
+                       (company-elisp-candidates "fl")))))))
+
+(ert-deftest company-elisp-candidates-no-duplicates ()
+  (company-elisp-with-buffer
+    "(let ((float-pi 4))
+       f|)"
+    (let ((obarray [float-pi])
+          (company-elisp-show-locals-first t))
+      (should (equal '("float-pi") (company-elisp-candidates "f"))))))
+
+(ert-deftest company-elisp-shouldnt-complete-defun-name ()
+  (company-elisp-with-buffer
+    "(defun foob|)"
+    (should (null (company-elisp 'prefix)))))
+
+(ert-deftest company-elisp-should-complete-def-call ()
+  (company-elisp-with-buffer
+    "(defu|"
+    (should (equal "defu" (company-elisp 'prefix)))))
+
+(ert-deftest company-elisp-should-complete-in-defvar ()
+  ;; It will also complete the var name, at least for now.
+  (company-elisp-with-buffer
+    "(defvar abc de|"
+    (should (equal "de" (company-elisp 'prefix)))))
+
+(ert-deftest company-elisp-shouldnt-complete-in-defun-arglist ()
+  (company-elisp-with-buffer
+    "(defsubst foobar (ba|"
+    (should (null (company-elisp 'prefix)))))
+
+(ert-deftest company-elisp-prefix-in-defun-body ()
+  (company-elisp-with-buffer
+    "(defun foob ()|)"
+    (should (equal "" (company-elisp 'prefix)))))
+
+;;; Clang
+
+(ert-deftest company-clang-objc-templatify ()
+  (with-temp-buffer
+    (let ((text "createBookWithTitle:andAuthor:"))
+      (insert text)
+      (company-clang-objc-templatify text)
+      (should (equal "createBookWithTitle:arg0 andAuthor:arg1" (buffer-string)))
+      (should (looking-at "arg0"))
+      (should (null (overlay-get (company-template-field-at) 'display))))))
diff --git a/packages/company/company-xcode.el b/packages/company/company-xcode.el
new file mode 100644 (file)
index 0000000..ac8d133
--- /dev/null
@@ -0,0 +1,124 @@
+;;; company-xcode.el --- company-mode completion back-end for Xcode projects
+
+;; Copyright (C) 2009-2011  Free Software Foundation, Inc.
+
+;; Author: Nikolaj Schumacher
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+
+;;; Commentary:
+;;
+
+;;; Code:
+
+(require 'company)
+(eval-when-compile (require 'cl))
+
+(defgroup company-xcode nil
+  "Completion back-end for Xcode projects."
+  :group 'company)
+
+(defcustom company-xcode-xcodeindex-executable (executable-find "xcodeindex")
+  "Location of xcodeindex executable."
+  :type 'file)
+
+(defvar company-xcode-tags nil)
+
+(defun company-xcode-reset ()
+  "Reset the cached tags."
+  (interactive)
+  (setq company-xcode-tags nil))
+
+(defcustom company-xcode-types
+  '("Class" "Constant" "Enum" "Macro" "Modeled Class" "Structure"
+    "Type" "Union" "Function")
+  "The types of symbols offered by `company-xcode'.
+No context-enabled completion is available.  Types like methods will be
+offered regardless of whether the class supports them.  The defaults should be
+valid in most contexts."
+  :set (lambda (variable value)
+         (set variable value)
+         (company-xcode-reset))
+  :type '(set (const "Category") (const "Class") (const "Class Method")
+              (const "Class Variable") (const "Constant") (const "Enum")
+              (const "Field") (const "Instance Method")
+              (const "Instance Variable") (const "Macro")
+              (const "Modeled Class") (const "Modeled Method")
+              (const "Modeled Property") (const "Property") (const "Protocol")
+              (const "Structure") (const "Type") (const "Union")
+              (const "Variable") (const "Function")))
+
+(defvar company-xcode-project 'unknown)
+(make-variable-buffer-local 'company-xcode-project)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defun company-xcode-fetch (project-bundle)
+  (setq project-bundle (directory-file-name project-bundle))
+  (message "Retrieving dump from %s..." project-bundle)
+  (with-temp-buffer
+    (let ((default-directory (file-name-directory project-bundle)))
+      (call-process company-xcode-xcodeindex-executable nil (current-buffer)
+                    nil "dump" "-project"
+                    (file-name-nondirectory project-bundle) "-quiet")
+      (goto-char (point-min))
+      (let ((regexp (concat "^\\([^\t\n]*\\)\t[^\t\n]*\t"
+                            (regexp-opt company-xcode-types)
+                            "\t[^\t\n]*\t[^\t\n]*"))
+            candidates)
+        (while (re-search-forward regexp nil t)
+          (add-to-list 'candidates (match-string 1)))
+        (message "Retrieving dump from %s...done" project-bundle)
+        candidates))))
+
+(defun company-xcode-find-project ()
+  (let ((dir (if buffer-file-name
+                 (file-name-directory buffer-file-name)
+               (expand-file-name default-directory)))
+        (prev-dir nil)
+        file)
+    (while (not (or file (equal dir prev-dir)))
+      (setq file (car (directory-files dir t ".xcodeproj\\'" t))
+            prev-dir dir
+            dir (file-name-directory (directory-file-name dir))))
+    file))
+
+(defun company-xcode-tags ()
+  (when (eq company-xcode-project 'unknown)
+    (setq company-xcode-project (company-xcode-find-project)))
+  (when company-xcode-project
+    (cdr (or (assoc company-xcode-project company-xcode-tags)
+             (car (push (cons company-xcode-project
+                              (company-xcode-fetch company-xcode-project))
+                        company-xcode-tags))))))
+;;;###autoload
+(defun company-xcode (command &optional arg &rest ignored)
+  "`company-mode' completion back-end for Xcode projects."
+  (interactive (list 'interactive))
+  (case command
+    (interactive (company-begin-backend 'company-xcode))
+    (prefix (and company-xcode-xcodeindex-executable
+                 (company-xcode-tags)
+                 (not (company-in-string-or-comment))
+                 (or (company-grab-symbol) 'stop)))
+    (candidates (let ((completion-ignore-case nil))
+                  (company-xcode-tags)
+                  (all-completions arg (company-xcode-tags))))))
+
+
+(provide 'company-xcode)
+;;; company-xcode.el ends here
diff --git a/packages/company/company.el b/packages/company/company.el
new file mode 100644 (file)
index 0000000..39a3a17
--- /dev/null
@@ -0,0 +1,2052 @@
+;;; company.el --- Modular in-buffer completion framework  -*- lexical-binding: t -*-
+
+;; Copyright (C) 2009-2013  Free Software Foundation, Inc.
+
+;; Author: Nikolaj Schumacher
+;; Maintainer: Dmitry Gutov <dgutov@yandex.ru>
+;; Version: 0.6.10
+;; Keywords: abbrev, convenience, matching
+;; URL: http://company-mode.github.io/
+;; Compatibility: GNU Emacs 22.x, GNU Emacs 23.x, GNU Emacs 24.x
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;
+;; Company is a modular completion mechanism.  Modules for retrieving completion
+;; candidates are called back-ends, modules for displaying them are front-ends.
+;;
+;; Company comes with many back-ends, e.g. `company-elisp'.  These are
+;; distributed in separate files and can be used individually.
+;;
+;; Place company.el and the back-ends you want to use in a directory and add the
+;; following to your .emacs:
+;; (add-to-list 'load-path "/path/to/company")
+;; (autoload 'company-mode "company" nil t)
+;;
+;; Enable company-mode with M-x company-mode.  For further information look at
+;; the documentation for `company-mode' (C-h f company-mode RET)
+;;
+;; If you want to start a specific back-end, call it interactively or use
+;; `company-begin-backend'.  For example:
+;; M-x company-abbrev will prompt for and insert an abbrev.
+;;
+;; To write your own back-end, look at the documentation for `company-backends'.
+;; Here is a simple example completing "foo":
+;;
+;; (defun company-my-backend (command &optional arg &rest ignored)
+;;   (case command
+;;     (prefix (when (looking-back "foo\\>")
+;;               (match-string 0)))
+;;     (candidates (list "foobar" "foobaz" "foobarbaz"))
+;;     (meta (format "This value is named %s" arg))))
+;;
+;; Sometimes it is a good idea to mix several back-ends together, for example to
+;; enrich gtags with dabbrev-code results (to emulate local variables).
+;; To do this, add a list with both back-ends as an element in company-backends.
+;;
+;; Known Issues:
+;; When point is at the very end of the buffer, the pseudo-tooltip appears very
+;; wrong, unless company is allowed to temporarily insert a fake newline.
+;; This behavior is enabled by `company-end-of-buffer-workaround'.
+;;
+;;; Change Log:
+;;
+;; See NEWS.md in the repository.
+
+;;; Code:
+
+(eval-when-compile (require 'cl))
+
+;; FIXME: Use `user-error'.
+(add-to-list 'debug-ignored-errors "^.* frontend cannot be used twice$")
+(add-to-list 'debug-ignored-errors "^Echo area cannot be used twice$")
+(add-to-list 'debug-ignored-errors "^No \\(document\\|loc\\)ation available$")
+(add-to-list 'debug-ignored-errors "^Company not ")
+(add-to-list 'debug-ignored-errors "^No candidate number ")
+(add-to-list 'debug-ignored-errors "^Cannot complete at point$")
+(add-to-list 'debug-ignored-errors "^No other back-end$")
+
+(defgroup company nil
+  "Extensible inline text completion mechanism"
+  :group 'abbrev
+  :group 'convenience
+  :group 'matching)
+
+(defface company-tooltip
+  '((default :foreground "black")
+    (((class color) (min-colors 88) (background light))
+     (:background "cornsilk"))
+    (((class color) (min-colors 88) (background dark))
+     (:background "yellow")))
+  "Face used for the tooltip.")
+
+(defface company-tooltip-selection
+  '((default :inherit company-tooltip)
+    (((class color) (min-colors 88) (background light))
+     (:background "light blue"))
+    (((class color) (min-colors 88) (background dark))
+     (:background "orange1"))
+    (t (:background "green")))
+  "Face used for the selection in the tooltip.")
+
+(defface company-tooltip-mouse
+  '((default :inherit highlight))
+  "Face used for the tooltip item under the mouse.")
+
+(defface company-tooltip-common
+  '((default :inherit company-tooltip)
+    (((background light))
+     :foreground "darkred")
+    (((background dark))
+     :foreground "red"))
+  "Face used for the common completion in the tooltip.")
+
+(defface company-tooltip-common-selection
+  '((default :inherit company-tooltip-selection)
+    (((background light))
+     :foreground "darkred")
+    (((background dark))
+     :foreground "red"))
+  "Face used for the selected common completion in the tooltip.")
+
+(defface company-preview
+  '((t :background "blue4"
+       :foreground "wheat"))
+  "Face used for the completion preview.")
+
+(defface company-preview-common
+  '((t :inherit company-preview
+       :foreground "red"))
+  "Face used for the common part of the completion preview.")
+
+(defface company-preview-search
+  '((t :inherit company-preview
+       :background "blue1"))
+  "Face used for the search string in the completion preview.")
+
+(defface company-echo nil
+  "Face used for completions in the echo area.")
+
+(defface company-echo-common
+  '((((background dark)) (:foreground "firebrick1"))
+    (((background light)) (:background "firebrick4")))
+  "Face used for the common part of completions in the echo area.")
+
+(defun company-frontends-set (variable value)
+  ;; uniquify
+  (let ((remainder value))
+    (setcdr remainder (delq (car remainder) (cdr remainder))))
+  (and (memq 'company-pseudo-tooltip-unless-just-one-frontend value)
+       (memq 'company-pseudo-tooltip-frontend value)
+       (error "Pseudo tooltip frontend cannot be used twice"))
+  (and (memq 'company-preview-if-just-one-frontend value)
+       (memq 'company-preview-frontend value)
+       (error "Preview frontend cannot be used twice"))
+  (and (memq 'company-echo value)
+       (memq 'company-echo-metadata-frontend value)
+       (error "Echo area cannot be used twice"))
+  ;; preview must come last
+  (dolist (f '(company-preview-if-just-one-frontend company-preview-frontend))
+    (when (memq f value)
+      (setq value (append (delq f value) (list f)))))
+  (set variable value))
+
+(defcustom company-frontends '(company-pseudo-tooltip-unless-just-one-frontend
+                               company-preview-if-just-one-frontend
+                               company-echo-metadata-frontend)
+  "The list of active front-ends (visualizations).
+Each front-end is a function that takes one argument.  It is called with
+one of the following arguments:
+
+`show': When the visualization should start.
+
+`hide': When the visualization should end.
+
+`update': When the data has been updated.
+
+`pre-command': Before every command that is executed while the
+visualization is active.
+
+`post-command': After every command that is executed while the
+visualization is active.
+
+The visualized data is stored in `company-prefix', `company-candidates',
+`company-common', `company-selection', `company-point' and
+`company-search-string'."
+  :set 'company-frontends-set
+  :type '(repeat (choice (const :tag "echo" company-echo-frontend)
+                         (const :tag "echo, strip common"
+                                company-echo-strip-common-frontend)
+                         (const :tag "show echo meta-data in echo"
+                                company-echo-metadata-frontend)
+                         (const :tag "pseudo tooltip"
+                                company-pseudo-tooltip-frontend)
+                         (const :tag "pseudo tooltip, multiple only"
+                                company-pseudo-tooltip-unless-just-one-frontend)
+                         (const :tag "preview" company-preview-frontend)
+                         (const :tag "preview, unique only"
+                                company-preview-if-just-one-frontend)
+                         (function :tag "custom function" nil))))
+
+(defcustom company-tooltip-limit 10
+  "The maximum number of candidates in the tooltip"
+  :type 'integer)
+
+(defcustom company-tooltip-minimum 6
+  "The minimum height of the tooltip.
+If this many lines are not available, prefer to display the tooltip above."
+  :type 'integer)
+
+(defvar company-safe-backends
+  '((company-abbrev . "Abbrev")
+    (company-capf . "completion-at-point-functions")
+    (company-clang . "Clang")
+    (company-css . "CSS")
+    (company-dabbrev . "dabbrev for plain text")
+    (company-dabbrev-code . "dabbrev for code")
+    (company-eclim . "Eclim (an Eclipse interface)")
+    (company-elisp . "Emacs Lisp")
+    (company-etags . "etags")
+    (company-files . "Files")
+    (company-gtags . "GNU Global")
+    (company-ispell . "Ispell")
+    (company-keywords . "Programming language keywords")
+    (company-nxml . "nxml")
+    (company-oddmuse . "Oddmuse")
+    (company-pysmell . "PySmell")
+    (company-ropemacs . "ropemacs")
+    (company-semantic . "Semantic")
+    (company-tempo . "Tempo templates")
+    (company-xcode . "Xcode")))
+(put 'company-safe-backends 'risky-local-variable t)
+
+(defun company-safe-backends-p (backends)
+  (and (consp backends)
+       (not (dolist (backend backends)
+              (unless (if (consp backend)
+                          (company-safe-backends-p backend)
+                        (assq backend company-safe-backends))
+                (return t))))))
+
+(defcustom company-backends '(company-elisp company-nxml company-css
+                              company-semantic company-clang company-eclim
+                              company-xcode company-ropemacs
+                              (company-gtags company-etags company-dabbrev-code
+                               company-keywords)
+                              company-oddmuse company-files company-dabbrev)
+  "The list of active back-ends (completion engines).
+Each list elements can itself be a list of back-ends.  In that case their
+completions are merged.  Otherwise only the first matching back-end returns
+results.
+
+`company-begin-backend' can be used to start a specific back-end,
+`company-other-backend' will skip to the next matching back-end in the list.
+
+Each back-end is a function that takes a variable number of arguments.
+The first argument is the command requested from the back-end.  It is one
+of the following:
+
+`prefix': The back-end should return the text to be completed.  It must be
+text immediately before point.  Returning nil passes control to the next
+back-end.  The function should return `stop' if it should complete but
+cannot \(e.g. if it is in the middle of a string\).  Instead of a string,
+the back-end may return a cons where car is the prefix and cdr is used in
+`company-minimum-prefix-length' test. It's either number or t, in which
+case the test automatically succeeds.
+
+`candidates': The second argument is the prefix to be completed.  The
+return value should be a list of candidates that start with the prefix.
+
+Optional commands:
+
+`sorted': Return t here to indicate that the candidates are sorted and will
+not need to be sorted again.
+
+`duplicates': If non-nil, company will take care of removing duplicates
+from the list.
+
+`no-cache': Usually company doesn't ask for candidates again as completion
+progresses, unless the back-end returns t for this command.  The second
+argument is the latest prefix.
+
+`meta': The second argument is a completion candidate.  Return a (short)
+documentation string for it.
+
+`doc-buffer': The second argument is a completion candidate.  Return a
+buffer with documentation for it.  Preferably use `company-doc-buffer',
+
+`location': The second argument is a completion candidate.  Return the cons
+of buffer and buffer location, or of file and line number where the
+completion candidate was defined.
+
+`require-match': If this returns t, the user is not allowed to enter
+anything not offered as a candidate.  Use with care!  The default value nil
+gives the user that choice with `company-require-match'.  Return value
+`never' overrides that option the other way around.
+
+`init': Called once for each buffer. The back-end can check for external
+programs and files and load any required libraries.  Raising an error here
+will show up in message log once, and the back-end will not be used for
+completion.
+
+`post-completion': Called after a completion candidate has been inserted
+into the buffer.  The second argument is the candidate.  Can be used to
+modify it, e.g. to expand a snippet.
+
+The back-end should return nil for all commands it does not support or
+does not know about.  It should also be callable interactively and use
+`company-begin-backend' to start itself in that case."
+  :type `(repeat
+          (choice
+           :tag "Back-end"
+           ,@(mapcar (lambda (b) `(const :tag ,(cdr b) ,(car b)))
+                     company-safe-backends)
+           (symbol :tag "User defined")
+           (repeat :tag "Merged Back-ends"
+                   (choice :tag "Back-end"
+                           ,@(mapcar (lambda (b)
+                                       `(const :tag ,(cdr b) ,(car b)))
+                                     company-safe-backends)
+                           (symbol :tag "User defined"))))))
+
+(put 'company-backends 'safe-local-variable 'company-safe-backends-p)
+
+(defcustom company-completion-started-hook nil
+  "Hook run when company starts completing.
+The hook is called with one argument that is non-nil if the completion was
+started manually."
+  :type 'hook)
+
+(defcustom company-completion-cancelled-hook nil
+  "Hook run when company cancels completing.
+The hook is called with one argument that is non-nil if the completion was
+aborted manually."
+  :type 'hook)
+
+(defcustom company-completion-finished-hook nil
+  "Hook run when company successfully completes.
+The hook is called with the selected candidate as an argument.
+
+If you indend to use it to post-process candidates from a specific
+back-end, consider using the `post-completion' command instead."
+  :type 'hook)
+
+(defcustom company-minimum-prefix-length 3
+  "The minimum prefix length for automatic completion."
+  :type '(integer :tag "prefix length"))
+
+(defcustom company-require-match 'company-explicit-action-p
+  "If enabled, disallow non-matching input.
+This can be a function do determine if a match is required.
+
+This can be overridden by the back-end, if it returns t or `never' to
+`require-match'.  `company-auto-complete' also takes precedence over this."
+  :type '(choice (const :tag "Off" nil)
+                 (function :tag "Predicate function")
+                 (const :tag "On, if user interaction took place"
+                        'company-explicit-action-p)
+                 (const :tag "On" t)))
+
+(defcustom company-auto-complete nil
+  "Determines when to auto-complete.
+If this is enabled, all characters from `company-auto-complete-chars'
+complete the selected completion.  This can also be a function."
+  :type '(choice (const :tag "Off" nil)
+                 (function :tag "Predicate function")
+                 (const :tag "On, if user interaction took place"
+                        'company-explicit-action-p)
+                 (const :tag "On" t)))
+
+(defcustom company-auto-complete-chars '(?\  ?\) ?.)
+  "Determines which characters trigger an automatic completion.
+See `company-auto-complete'.  If this is a string, each string character
+causes completion.  If it is a list of syntax description characters (see
+`modify-syntax-entry'), all characters with that syntax auto-complete.
+
+This can also be a function, which is called with the new input and should
+return non-nil if company should auto-complete.
+
+A character that is part of a valid candidate never triggers auto-completion."
+  :type '(choice (string :tag "Characters")
+                 (set :tag "Syntax"
+                      (const :tag "Whitespace" ?\ )
+                      (const :tag "Symbol" ?_)
+                      (const :tag "Opening parentheses" ?\()
+                      (const :tag "Closing parentheses" ?\))
+                      (const :tag "Word constituent" ?w)
+                      (const :tag "Punctuation." ?.)
+                      (const :tag "String quote." ?\")
+                      (const :tag "Paired delimiter." ?$)
+                      (const :tag "Expression quote or prefix operator." ?\')
+                      (const :tag "Comment starter." ?<)
+                      (const :tag "Comment ender." ?>)
+                      (const :tag "Character-quote." ?/)
+                      (const :tag "Generic string fence." ?|)
+                      (const :tag "Generic comment fence." ?!))
+                 (function :tag "Predicate function")))
+
+(defcustom company-idle-delay .7
+  "The idle delay in seconds until automatic completions starts.
+A value of nil means never complete automatically, t means complete
+immediately when a prefix of `company-minimum-prefix-length' is reached."
+  :type '(choice (const :tag "never (nil)" nil)
+                 (const :tag "immediate (t)" t)
+                 (number :tag "seconds")))
+
+(defcustom company-begin-commands t
+  "A list of commands following which company will start completing.
+If this is t, it will complete after any command.  See `company-idle-delay'.
+
+Alternatively any command with a non-nil `company-begin' property is treated
+as if it was on this list."
+  :type '(choice (const :tag "Any command" t)
+                 (const :tag "Self insert command" '(self-insert-command))
+                 (repeat :tag "Commands" function)))
+
+(defcustom company-show-numbers nil
+  "If enabled, show quick-access numbers for the first ten candidates."
+  :type '(choice (const :tag "off" nil)
+                 (const :tag "on" t)))
+
+(defvar company-end-of-buffer-workaround t
+  "Work around a visualization bug when completing at the end of the buffer.
+The work-around consists of adding a newline.")
+
+;;; mode ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defvar company-mode-map (make-sparse-keymap)
+  "Keymap used by `company-mode'.")
+
+(defvar company-active-map
+  (let ((keymap (make-sparse-keymap)))
+    (define-key keymap "\e\e\e" 'company-abort)
+    (define-key keymap "\C-g" 'company-abort)
+    (define-key keymap (kbd "M-n") 'company-select-next)
+    (define-key keymap (kbd "M-p") 'company-select-previous)
+    (define-key keymap (kbd "<down>") 'company-select-next-or-abort)
+    (define-key keymap (kbd "<up>") 'company-select-previous-or-abort)
+    (define-key keymap [down-mouse-1] 'ignore)
+    (define-key keymap [down-mouse-3] 'ignore)
+    (define-key keymap [mouse-1] 'company-complete-mouse)
+    (define-key keymap [mouse-3] 'company-select-mouse)
+    (define-key keymap [up-mouse-1] 'ignore)
+    (define-key keymap [up-mouse-3] 'ignore)
+    (define-key keymap [return] 'company-complete-selection)
+    (define-key keymap (kbd "RET") 'company-complete-selection)
+    (define-key keymap [tab] 'company-complete-common)
+    (define-key keymap (kbd "TAB") 'company-complete-common)
+    (define-key keymap (kbd "<f1>") 'company-show-doc-buffer)
+    (define-key keymap "\C-w" 'company-show-location)
+    (define-key keymap "\C-s" 'company-search-candidates)
+    (define-key keymap "\C-\M-s" 'company-filter-candidates)
+    (dotimes (i 10)
+      (define-key keymap (vector (+ (aref (kbd "M-0") 0) i))
+        `(lambda () (interactive) (company-complete-number ,i))))
+
+    keymap)
+  "Keymap that is enabled during an active completion.")
+
+(defvar company--disabled-backends nil)
+
+(defun company-init-backend (backend)
+  (and (symbolp backend)
+       (not (fboundp backend))
+       (ignore-errors (require backend nil t)))
+
+  (if (or (symbolp backend)
+          (functionp backend))
+      (condition-case err
+          (progn
+            (funcall backend 'init)
+            (put backend 'company-init t))
+        (error
+         (put backend 'company-init 'failed)
+         (unless (memq backend company--disabled-backends)
+           (message "Company back-end '%s' could not be initialized:\n%s"
+                    backend (error-message-string err)))
+         (pushnew backend company--disabled-backends)
+         nil))
+    (mapc 'company-init-backend backend)))
+
+(defvar company-default-lighter " company")
+
+(defvar company-lighter company-default-lighter)
+(make-variable-buffer-local 'company-lighter)
+
+;;;###autoload
+(define-minor-mode company-mode
+  "\"complete anything\"; is an in-buffer completion framework.
+Completion starts automatically, depending on the values
+`company-idle-delay' and `company-minimum-prefix-length'.
+
+Completion can be controlled with the commands:
+`company-complete-common', `company-complete-selection', `company-complete',
+`company-select-next', `company-select-previous'.  If these commands are
+called before `company-idle-delay', completion will also start.
+
+Completions can be searched with `company-search-candidates' or
+`company-filter-candidates'.  These can be used while completion is
+inactive, as well.
+
+The completion data is retrieved using `company-backends' and displayed
+using `company-frontends'.  If you want to start a specific back-end, call
+it interactively or use `company-begin-backend'.
+
+regular keymap (`company-mode-map'):
+
+\\{company-mode-map}
+keymap during active completions (`company-active-map'):
+
+\\{company-active-map}"
+  nil company-lighter company-mode-map
+  (if company-mode
+      (progn
+        (add-hook 'pre-command-hook 'company-pre-command nil t)
+        (add-hook 'post-command-hook 'company-post-command nil t)
+        (mapc 'company-init-backend company-backends))
+    (remove-hook 'pre-command-hook 'company-pre-command t)
+    (remove-hook 'post-command-hook 'company-post-command t)
+    (company-cancel)
+    (kill-local-variable 'company-point)))
+
+;;;###autoload
+(define-globalized-minor-mode global-company-mode company-mode company-mode-on)
+
+(defun company-mode-on ()
+  (unless (or noninteractive (eq (aref (buffer-name) 0) ?\s))
+    (company-mode 1)))
+
+(defsubst company-assert-enabled ()
+  (unless company-mode
+    (company-uninstall-map)
+    (error "Company not enabled")))
+
+;;; keymaps ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defvar company-my-keymap nil)
+(make-variable-buffer-local 'company-my-keymap)
+
+(defvar company-emulation-alist '((t . nil)))
+
+(defsubst company-enable-overriding-keymap (keymap)
+  (company-uninstall-map)
+  (setq company-my-keymap keymap))
+
+(defun company-ensure-emulation-alist ()
+  (unless (eq 'company-emulation-alist (car emulation-mode-map-alists))
+    (setq emulation-mode-map-alists
+          (cons 'company-emulation-alist
+                (delq 'company-emulation-alist emulation-mode-map-alists)))))
+
+(defun company-install-map ()
+  (unless (or (cdar company-emulation-alist)
+              (null company-my-keymap))
+    (setf (cdar company-emulation-alist) company-my-keymap)))
+
+(defun company-uninstall-map ()
+  (setf (cdar company-emulation-alist) nil))
+
+;; Hack:
+;; Emacs calculates the active keymaps before reading the event.  That means we
+;; cannot change the keymap from a timer.  So we send a bogus command.
+(defun company-ignore ()
+  (interactive)
+  (setq this-command last-command))
+
+(global-set-key '[31415926] 'company-ignore)
+
+(defun company-input-noop ()
+  (push 31415926 unread-command-events))
+
+(defun company--column (&optional pos)
+  (save-excursion
+    (when pos (goto-char pos))
+    (let ((pt (point)))
+      (save-restriction
+        (+ (save-excursion
+             (vertical-motion 0)
+             (narrow-to-region (point) pt)
+             (let ((prefix (get-text-property (point) 'line-prefix)))
+               (if prefix (length prefix) 0)))
+           (current-column))))))
+
+(defun company--row (&optional pos)
+  (save-excursion
+    (when pos (goto-char pos))
+    (count-screen-lines (window-start)
+                        (progn (vertical-motion 0) (point)))))
+
+;;; backends ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defvar company-backend nil)
+(make-variable-buffer-local 'company-backend)
+
+(defun company-grab (regexp &optional expression limit)
+  (when (looking-back regexp limit)
+    (or (match-string-no-properties (or expression 0)) "")))
+
+(defun company-grab-line (regexp &optional expression)
+  (company-grab regexp expression (point-at-bol)))
+
+(defun company-grab-symbol ()
+  (if (looking-at "\\_>")
+      (buffer-substring (point) (save-excursion (skip-syntax-backward "w_")
+                                                (point)))
+    (unless (and (char-after) (memq (char-syntax (char-after)) '(?w ?_)))
+      "")))
+
+(defun company-grab-word ()
+  (if (looking-at "\\>")
+      (buffer-substring (point) (save-excursion (skip-syntax-backward "w")
+                                                (point)))
+    (unless (and (char-after) (eq (char-syntax (char-after)) ?w))
+      "")))
+
+(defun company-in-string-or-comment ()
+  (let ((ppss (syntax-ppss)))
+    (or (car (setq ppss (nthcdr 3 ppss)))
+        (car (setq ppss (cdr ppss)))
+        (nth 3 ppss))))
+
+(if (fboundp 'locate-dominating-file)
+    (defalias 'company-locate-dominating-file 'locate-dominating-file)
+  (defun company-locate-dominating-file (file name)
+    (catch 'root
+      (let ((dir (file-name-directory file))
+            (prev-dir nil))
+        (while (not (equal dir prev-dir))
+          (when (file-exists-p (expand-file-name name dir))
+            (throw 'root dir))
+          (setq prev-dir dir
+                dir (file-name-directory (directory-file-name dir))))))))
+
+(defun company-call-backend (&rest args)
+  (if (functionp company-backend)
+      (apply company-backend args)
+    (apply 'company--multi-backend-adapter company-backend args)))
+
+(defun company--multi-backend-adapter (backends command &rest args)
+  (let ((backends (loop for b in backends
+                        when (not (and (symbolp b)
+                                       (eq 'failed (get b 'company-init))))
+                        collect b)))
+    (case command
+      (candidates
+       (loop for backend in backends
+             when (equal (funcall backend 'prefix)
+                         (car args))
+             append (apply backend 'candidates args)))
+      (sorted nil)
+      (duplicates t)
+      (otherwise
+       (let (value)
+         (dolist (backend backends)
+           (when (setq value (apply backend command args))
+             (return value))))))))
+
+;;; completion mechanism ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defvar company-prefix nil)
+(make-variable-buffer-local 'company-prefix)
+
+(defvar company-candidates nil)
+(make-variable-buffer-local 'company-candidates)
+
+(defvar company-candidates-length nil)
+(make-variable-buffer-local 'company-candidates-length)
+
+(defvar company-candidates-cache nil)
+(make-variable-buffer-local 'company-candidates-cache)
+
+(defvar company-candidates-predicate nil)
+(make-variable-buffer-local 'company-candidates-predicate)
+
+(defvar company-common nil)
+(make-variable-buffer-local 'company-common)
+
+(defvar company-selection 0)
+(make-variable-buffer-local 'company-selection)
+
+(defvar company-selection-changed nil)
+(make-variable-buffer-local 'company-selection-changed)
+
+(defvar company--explicit-action nil
+  "Non-nil, if explicit completion took place.")
+(make-variable-buffer-local 'company--explicit-action)
+
+(defvar company--auto-completion nil
+  "Non-nil when current candidate is being completed automatically.
+Controlled by `company-auto-complete'.")
+
+(defvar company--point-max nil)
+(make-variable-buffer-local 'company--point-max)
+
+(defvar company-point nil)
+(make-variable-buffer-local 'company-point)
+
+(defvar company-timer nil)
+
+(defvar company-added-newline nil)
+(make-variable-buffer-local 'company-added-newline)
+
+(defsubst company-strip-prefix (str)
+  (substring str (length company-prefix)))
+
+(defmacro company-with-candidate-inserted (candidate &rest body)
+  "Evaluate BODY with CANDIDATE temporarily inserted.
+This is a tool for back-ends that need candidates inserted before they
+can retrieve meta-data for them."
+  (declare (indent 1))
+  `(let ((inhibit-modification-hooks t)
+         (inhibit-point-motion-hooks t)
+         (modified-p (buffer-modified-p)))
+     (insert (company-strip-prefix ,candidate))
+     (unwind-protect
+         (progn ,@body)
+       (delete-region company-point (point)))))
+
+(defun company-explicit-action-p ()
+  "Return whether explicit completion action was taken by the user."
+  (or company--explicit-action
+      company-selection-changed))
+
+(defun company-reformat (candidate)
+  ;; company-ispell needs this, because the results are always lower-case
+  ;; It's mory efficient to fix it only when they are displayed.
+  (concat company-prefix (substring candidate (length company-prefix))))
+
+(defun company--should-complete ()
+  (and (not (or buffer-read-only overriding-terminal-local-map
+                overriding-local-map
+                (minibufferp)))
+       ;; Check if in the middle of entering a key combination.
+       (or (equal (this-command-keys-vector) [])
+           (not (keymapp (key-binding (this-command-keys-vector)))))
+       (eq company-idle-delay t)
+       (or (eq t company-begin-commands)
+           (memq this-command company-begin-commands)
+           (and (symbolp this-command) (get this-command 'company-begin)))
+       (not (and transient-mark-mode mark-active))))
+
+(defun company-call-frontends (command)
+  (dolist (frontend company-frontends)
+    (condition-case err
+        (funcall frontend command)
+      (error (error "Company: Front-end %s error \"%s\" on command %s"
+                    frontend (error-message-string err) command)))))
+
+(defun company-set-selection (selection &optional force-update)
+  (setq selection (max 0 (min (1- company-candidates-length) selection)))
+  (when (or force-update (not (equal selection company-selection)))
+    (setq company-selection selection
+          company-selection-changed t)
+    (company-call-frontends 'update)))
+
+(defun company-apply-predicate (candidates predicate)
+  (let (new)
+    (dolist (c candidates)
+      (when (funcall predicate c)
+        (push c new)))
+    (nreverse new)))
+
+(defun company-update-candidates (candidates)
+  (setq company-candidates-length (length candidates))
+  (if (> company-selection 0)
+      ;; Try to restore the selection
+      (let ((selected (nth company-selection company-candidates)))
+        (setq company-selection 0
+              company-candidates candidates)
+        (when selected
+          (while (and candidates (string< (pop candidates) selected))
+            (incf company-selection))
+          (unless candidates
+            ;; Make sure selection isn't out of bounds.
+            (setq company-selection (min (1- company-candidates-length)
+                                         company-selection)))))
+    (setq company-selection 0
+          company-candidates candidates))
+  ;; Save in cache:
+  (push (cons company-prefix company-candidates) company-candidates-cache)
+  ;; Calculate common.
+  (let ((completion-ignore-case (company-call-backend 'ignore-case)))
+    (setq company-common (company--safe-candidate
+                          (try-completion company-prefix company-candidates))))
+  (when (eq company-common t)
+    (setq company-candidates nil)))
+
+(defun company--safe-candidate (str)
+  (or (company-call-backend 'crop str)
+      str))
+
+(defun company-calculate-candidates (prefix)
+  (let ((candidates (cdr (assoc prefix company-candidates-cache)))
+        (ignore-case (company-call-backend 'ignore-case)))
+    (or candidates
+        (when company-candidates-cache
+          (let ((len (length prefix))
+                (completion-ignore-case ignore-case)
+                prev)
+            (dotimes (i (1+ len))
+              (when (setq prev (cdr (assoc (substring prefix 0 (- len i))
+                                           company-candidates-cache)))
+                (setq candidates (all-completions prefix prev))
+                (return t)))))
+        ;; no cache match, call back-end
+        (progn
+          (setq candidates (company-call-backend 'candidates prefix))
+          (when company-candidates-predicate
+            (setq candidates
+                  (company-apply-predicate candidates
+                                           company-candidates-predicate)))
+          (unless (company-call-backend 'sorted)
+            (setq candidates (sort candidates 'string<)))
+          (when (company-call-backend 'duplicates)
+            ;; strip duplicates
+            (let ((c2 candidates))
+              (while c2
+                (setcdr c2 (progn (while (equal (pop c2) (car c2)))
+                                  c2)))))))
+    (when candidates
+      (if (or (cdr candidates)
+              (not (eq t (compare-strings (car candidates) nil nil
+                                          prefix nil nil ignore-case))))
+          candidates
+        ;; Already completed and unique; don't start.
+        t))))
+
+(defun company-idle-begin (buf win tick pos)
+  (and company-mode
+       (eq buf (current-buffer))
+       (eq win (selected-window))
+       (eq tick (buffer-chars-modified-tick))
+       (eq pos (point))
+       (not company-candidates)
+       (not (equal (point) company-point))
+       (let ((company-idle-delay t)
+             (company-begin-commands t))
+         (company-begin)
+         (when company-candidates
+           (company-input-noop)
+           (company-post-command)))))
+
+(defun company-auto-begin ()
+  (company-assert-enabled)
+  (and company-mode
+       (not company-candidates)
+       (let ((company-idle-delay t)
+             (company-minimum-prefix-length 0)
+             (company-begin-commands t))
+         (company-begin)))
+  ;; Return non-nil if active.
+  company-candidates)
+
+(defun company-manual-begin ()
+  (interactive)
+  (setq company--explicit-action t)
+  (unwind-protect
+      (company-auto-begin)
+    (unless company-candidates
+      (setq company--explicit-action nil))))
+
+(defun company-other-backend (&optional backward)
+  (interactive (list current-prefix-arg))
+  (company-assert-enabled)
+  (if company-backend
+      (let* ((after (cdr (member company-backend company-backends)))
+             (before (cdr (member company-backend (reverse company-backends))))
+             (next (if backward
+                       (append before (reverse after))
+                     (append after (reverse before)))))
+        (company-cancel)
+        (dolist (backend next)
+          (when (ignore-errors (company-begin-backend backend))
+            (return t))))
+    (company-manual-begin))
+  (unless company-candidates
+    (error "No other back-end")))
+
+(defun company-require-match-p ()
+  (let ((backend-value (company-call-backend 'require-match)))
+    (or (eq backend-value t)
+        (and (not (eq backend-value 'never))
+             (if (functionp company-require-match)
+                 (funcall company-require-match)
+               (eq company-require-match t))))))
+
+(defun company-auto-complete-p (input)
+  "Return non-nil, if input starts with punctuation or parentheses."
+  (and (if (functionp company-auto-complete)
+           (funcall company-auto-complete)
+         company-auto-complete)
+       (if (functionp company-auto-complete-chars)
+           (funcall company-auto-complete-chars input)
+         (if (consp company-auto-complete-chars)
+             (memq (char-syntax (string-to-char input))
+                   company-auto-complete-chars)
+           (string-match (substring input 0 1) company-auto-complete-chars)))))
+
+(defun company--incremental-p ()
+  (and (> (point) company-point)
+       (> (point-max) company--point-max)
+       (not (eq this-command 'backward-delete-char-untabify))
+       (equal (buffer-substring (- company-point (length company-prefix))
+                                company-point)
+              company-prefix)))
+
+(defsubst company--string-incremental-p (old-prefix new-prefix)
+  (and (> (length new-prefix) (length old-prefix))
+       (equal old-prefix (substring new-prefix 0 (length old-prefix)))))
+
+(defun company--continue-failed (new-prefix)
+  (when (company--incremental-p)
+    (let ((input (buffer-substring-no-properties (point) company-point)))
+      (cond
+       ((company-auto-complete-p input)
+        ;; auto-complete
+        (save-excursion
+          (goto-char company-point)
+          (let ((company--auto-completion t))
+            (company-complete-selection))
+          nil))
+       ((and (company--string-incremental-p company-prefix new-prefix)
+             (company-require-match-p))
+        ;; wrong incremental input, but required match
+        (delete-char (- (length input)))
+        (ding)
+        (message "Matching input is required")
+        company-candidates)
+       ((equal company-prefix (car company-candidates))
+        ;; last input was actually success
+        (company-cancel company-prefix)
+        nil)))))
+
+(defun company--good-prefix-p (prefix)
+  (and (or (company-explicit-action-p)
+           (unless (eq prefix 'stop)
+             (or (eq (cdr-safe prefix) t)
+                 (>= (or (cdr-safe prefix) (length prefix))
+                     company-minimum-prefix-length))))
+       (stringp (or (car-safe prefix) prefix))))
+
+(defun company--continue ()
+  (when (company-call-backend 'no-cache company-prefix)
+    ;; Don't complete existing candidates, fetch new ones.
+    (setq company-candidates-cache nil))
+  (let* ((new-prefix (company-call-backend 'prefix))
+         (c (when (and (company--good-prefix-p new-prefix)
+                       (setq new-prefix (or (car-safe new-prefix) new-prefix))
+                       (= (- (point) (length new-prefix))
+                          (- company-point (length company-prefix))))
+              (setq new-prefix (or (car-safe new-prefix) new-prefix))
+              (company-calculate-candidates new-prefix))))
+    (or (cond
+         ((eq c t)
+          ;; t means complete/unique.
+          (company-cancel new-prefix)
+          nil)
+         ((consp c)
+          ;; incremental match
+          (setq company-prefix new-prefix)
+          (company-update-candidates c)
+          c)
+         (t (company--continue-failed new-prefix)))
+        (company-cancel))))
+
+(defun company--begin-new ()
+  (let (prefix c)
+    (dolist (backend (if company-backend
+                         ;; prefer manual override
+                         (list company-backend)
+                       company-backends))
+      (setq prefix
+            (if (or (symbolp backend)
+                    (functionp backend))
+                (when (or (not (symbolp backend))
+                          (eq t (get backend 'company-init))
+                          (unless (get backend 'company-init)
+                            (company-init-backend backend)))
+                  (funcall backend 'prefix))
+              (company--multi-backend-adapter backend 'prefix)))
+      (when prefix
+        (when (company--good-prefix-p prefix)
+          (setq prefix (or (car-safe prefix) prefix)
+                company-backend backend
+                c (company-calculate-candidates prefix))
+          ;; t means complete/unique.  We don't start, so no hooks.
+          (if (not (consp c))
+              (when company--explicit-action
+                (message "No completion found"))
+            (setq company-prefix prefix)
+            (when (symbolp backend)
+              (setq company-lighter (concat " " (symbol-name backend))))
+            (company-update-candidates c)
+            (run-hook-with-args 'company-completion-started-hook
+                                (company-explicit-action-p))
+            (company-call-frontends 'show)))
+        (return c)))))
+
+(defun company-begin ()
+  (or (and company-candidates (company--continue))
+      (and (company--should-complete) (company--begin-new)))
+  (when company-candidates
+    (when (and company-end-of-buffer-workaround (eobp))
+      (save-excursion (insert "\n"))
+      (setq company-added-newline (buffer-chars-modified-tick)))
+    (setq company-point (point)
+          company--point-max (point-max))
+    (company-ensure-emulation-alist)
+    (company-enable-overriding-keymap company-active-map)
+    (company-call-frontends 'update)))
+
+(defun company-cancel (&optional result)
+  (and company-added-newline
+       (> (point-max) (point-min))
+       (let ((tick (buffer-chars-modified-tick)))
+         (delete-region (1- (point-max)) (point-max))
+         (equal tick company-added-newline))
+       ;; Only set unmodified when tick remained the same since insert.
+       (set-buffer-modified-p nil))
+  (when company-prefix
+    (if (stringp result)
+        (progn
+          (company-call-backend 'pre-completion result)
+          (run-hook-with-args 'company-completion-finished-hook result)
+          (company-call-backend 'post-completion result))
+      (run-hook-with-args 'company-completion-cancelled-hook result)))
+  (setq company-added-newline nil
+        company-backend nil
+        company-prefix nil
+        company-candidates nil
+        company-candidates-length nil
+        company-candidates-cache nil
+        company-candidates-predicate nil
+        company-common nil
+        company-selection 0
+        company-selection-changed nil
+        company--explicit-action nil
+        company-lighter company-default-lighter
+        company--point-max nil
+        company-point nil)
+  (when company-timer
+    (cancel-timer company-timer))
+  (company-search-mode 0)
+  (company-call-frontends 'hide)
+  (company-enable-overriding-keymap nil))
+
+(defun company-abort ()
+  (interactive)
+  (company-cancel t)
+  ;; Don't start again, unless started manually.
+  (setq company-point (point)))
+
+(defun company-finish (result)
+  (insert (company-strip-prefix result))
+  (company-cancel result)
+  ;; Don't start again, unless started manually.
+  (setq company-point (point)))
+
+(defsubst company-keep (command)
+  (and (symbolp command) (get command 'company-keep)))
+
+(defun company-pre-command ()
+  (unless (company-keep this-command)
+    (condition-case err
+        (when company-candidates
+          (company-call-frontends 'pre-command))
+      (error (message "Company: An error occurred in pre-command")
+             (message "%s" (error-message-string err))
+             (company-cancel))))
+  (when company-timer
+    (cancel-timer company-timer)
+    (setq company-timer nil))
+  (company-uninstall-map))
+
+(defun company-post-command ()
+  (unless (company-keep this-command)
+    (condition-case err
+        (progn
+          (unless (equal (point) company-point)
+            (company-begin))
+          (if company-candidates
+              (company-call-frontends 'post-command)
+            (and (numberp company-idle-delay)
+                 (or (eq t company-begin-commands)
+                     (memq this-command company-begin-commands))
+                 (setq company-timer
+                       (run-with-timer company-idle-delay nil
+                                       'company-idle-begin
+                                       (current-buffer) (selected-window)
+                                       (buffer-chars-modified-tick) (point))))))
+      (error (message "Company: An error occurred in post-command")
+             (message "%s" (error-message-string err))
+             (company-cancel))))
+  (company-install-map))
+
+;;; search ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defvar company-search-string nil)
+(make-variable-buffer-local 'company-search-string)
+
+(defvar company-search-lighter " Search: \"\"")
+(make-variable-buffer-local 'company-search-lighter)
+
+(defvar company-search-old-map nil)
+(make-variable-buffer-local 'company-search-old-map)
+
+(defvar company-search-old-selection 0)
+(make-variable-buffer-local 'company-search-old-selection)
+
+(defun company-search (text lines)
+  (let ((quoted (regexp-quote text))
+        (i 0))
+    (dolist (line lines)
+      (when (string-match quoted line (length company-prefix))
+        (return i))
+      (incf i))))
+
+(defun company-search-printing-char ()
+  (interactive)
+  (company-search-assert-enabled)
+  (setq company-search-string
+        (concat (or company-search-string "") (string last-command-event))
+        company-search-lighter (concat " Search: \"" company-search-string
+                                        "\""))
+  (let ((pos (company-search company-search-string
+                              (nthcdr company-selection company-candidates))))
+    (if (null pos)
+        (ding)
+      (company-set-selection (+ company-selection pos) t))))
+
+(defun company-search-repeat-forward ()
+  "Repeat the incremental search in completion candidates forward."
+  (interactive)
+  (company-search-assert-enabled)
+  (let ((pos (company-search company-search-string
+                              (cdr (nthcdr company-selection
+                                           company-candidates)))))
+    (if (null pos)
+        (ding)
+      (company-set-selection (+ company-selection pos 1) t))))
+
+(defun company-search-repeat-backward ()
+  "Repeat the incremental search in completion candidates backwards."
+  (interactive)
+  (company-search-assert-enabled)
+  (let ((pos (company-search company-search-string
+                              (nthcdr (- company-candidates-length
+                                         company-selection)
+                                      (reverse company-candidates)))))
+    (if (null pos)
+        (ding)
+      (company-set-selection (- company-selection pos 1) t))))
+
+(defun company-create-match-predicate ()
+  (setq company-candidates-predicate
+        `(lambda (candidate)
+           ,(if company-candidates-predicate
+                `(and (string-match ,company-search-string candidate)
+                      (funcall ,company-candidates-predicate
+                               candidate))
+              `(string-match ,company-search-string candidate))))
+  (company-update-candidates
+   (company-apply-predicate company-candidates company-candidates-predicate))
+  ;; Invalidate cache.
+  (setq company-candidates-cache (cons company-prefix company-candidates)))
+
+(defun company-filter-printing-char ()
+  (interactive)
+  (company-search-assert-enabled)
+  (company-search-printing-char)
+  (company-create-match-predicate)
+  (company-call-frontends 'update))
+
+(defun company-search-kill-others ()
+  "Limit the completion candidates to the ones matching the search string."
+  (interactive)
+  (company-search-assert-enabled)
+  (company-create-match-predicate)
+  (company-search-mode 0)
+  (company-call-frontends 'update))
+
+(defun company-search-abort ()
+  "Abort searching the completion candidates."
+  (interactive)
+  (company-search-assert-enabled)
+  (company-set-selection company-search-old-selection t)
+  (company-search-mode 0))
+
+(defun company-search-other-char ()
+  (interactive)
+  (company-search-assert-enabled)
+  (company-search-mode 0)
+  (company--unread-last-input))
+
+(defvar company-search-map
+  (let ((i 0)
+        (keymap (make-keymap)))
+    (if (fboundp 'max-char)
+        (set-char-table-range (nth 1 keymap) (cons #x100 (max-char))
+                              'company-search-printing-char)
+      (with-no-warnings
+        ;; obsolete in Emacs 23
+        (let ((l (generic-character-list))
+              (table (nth 1 keymap)))
+          (while l
+            (set-char-table-default table (car l) 'company-search-printing-char)
+            (setq l (cdr l))))))
+    (define-key keymap [t] 'company-search-other-char)
+    (while (< i ?\s)
+      (define-key keymap (make-string 1 i) 'company-search-other-char)
+      (incf i))
+    (while (< i 256)
+      (define-key keymap (vector i) 'company-search-printing-char)
+      (incf i))
+    (let ((meta-map (make-sparse-keymap)))
+      (define-key keymap (char-to-string meta-prefix-char) meta-map)
+      (define-key keymap [escape] meta-map))
+    (define-key keymap (vector meta-prefix-char t) 'company-search-other-char)
+    (define-key keymap "\e\e\e" 'company-search-other-char)
+    (define-key keymap  [escape escape escape] 'company-search-other-char)
+
+    (define-key keymap "\C-g" 'company-search-abort)
+    (define-key keymap "\C-s" 'company-search-repeat-forward)
+    (define-key keymap "\C-r" 'company-search-repeat-backward)
+    (define-key keymap "\C-o" 'company-search-kill-others)
+    keymap)
+  "Keymap used for incrementally searching the completion candidates.")
+
+(define-minor-mode company-search-mode
+  "Search mode for completion candidates.
+Don't start this directly, use `company-search-candidates' or
+`company-filter-candidates'."
+  nil company-search-lighter nil
+  (if company-search-mode
+      (if (company-manual-begin)
+          (progn
+            (setq company-search-old-selection company-selection)
+            (company-call-frontends 'update))
+        (setq company-search-mode nil))
+    (kill-local-variable 'company-search-string)
+    (kill-local-variable 'company-search-lighter)
+    (kill-local-variable 'company-search-old-selection)
+    (company-enable-overriding-keymap company-active-map)))
+
+(defun company-search-assert-enabled ()
+  (company-assert-enabled)
+  (unless company-search-mode
+    (company-uninstall-map)
+    (error "Company not in search mode")))
+
+(defun company-search-candidates ()
+  "Start searching the completion candidates incrementally.
+
+\\<company-search-map>Search can be controlled with the commands:
+- `company-search-repeat-forward' (\\[company-search-repeat-forward])
+- `company-search-repeat-backward' (\\[company-search-repeat-backward])
+- `company-search-abort' (\\[company-search-abort])
+
+Regular characters are appended to the search string.
+
+The command `company-search-kill-others' (\\[company-search-kill-others])
+uses the search string to limit the completion candidates."
+  (interactive)
+  (company-search-mode 1)
+  (company-enable-overriding-keymap company-search-map))
+
+(defvar company-filter-map
+  (let ((keymap (make-keymap)))
+    (define-key keymap [remap company-search-printing-char]
+      'company-filter-printing-char)
+    (set-keymap-parent keymap company-search-map)
+    keymap)
+  "Keymap used for incrementally searching the completion candidates.")
+
+(defun company-filter-candidates ()
+  "Start filtering the completion candidates incrementally.
+This works the same way as `company-search-candidates' immediately
+followed by `company-search-kill-others' after each input."
+  (interactive)
+  (company-search-mode 1)
+  (company-enable-overriding-keymap company-filter-map))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defun company-select-next ()
+  "Select the next candidate in the list."
+  (interactive)
+  (when (company-manual-begin)
+    (company-set-selection (1+ company-selection))))
+
+(defun company-select-previous ()
+  "Select the previous candidate in the list."
+  (interactive)
+  (when (company-manual-begin)
+    (company-set-selection (1- company-selection))))
+
+(defun company-select-next-or-abort ()
+  "Select the next candidate if more than one, else abort
+and invoke the normal binding."
+  (interactive)
+  (if (> company-candidates-length 1)
+      (company-select-next)
+    (company-abort)
+    (company--unread-last-input)))
+
+(defun company-select-previous-or-abort ()
+  "Select the previous candidate if more than one, else abort
+and invoke the normal binding."
+  (interactive)
+  (if (> company-candidates-length 1)
+      (company-select-previous)
+    (company-abort)
+    (company--unread-last-input)))
+
+(defvar company-pseudo-tooltip-overlay)
+
+(defvar company-tooltip-offset)
+
+(defun company--inside-tooltip-p (event-col-row row height)
+  (let* ((ovl company-pseudo-tooltip-overlay)
+         (column (overlay-get ovl 'company-column))
+         (width (overlay-get ovl 'company-width))
+         (evt-col (car event-col-row))
+         (evt-row (cdr event-col-row)))
+    (and (>= evt-col column)
+         (< evt-col (+ column width))
+         (if (> height 0)
+             (and (> evt-row row)
+                  (<= evt-row (+ row height) ))
+           (and (< evt-row row)
+                (>= evt-row (+ row height)))))))
+
+(defun company--event-col-row (event)
+  (let* ((col-row (posn-actual-col-row (event-start event)))
+         (col (car col-row))
+         (row (cdr col-row)))
+    (incf col (window-hscroll))
+    (and header-line-format
+         (version< "24" emacs-version)
+         (decf row))
+    (cons col row)))
+
+(defun company-select-mouse (event)
+  "Select the candidate picked by the mouse."
+  (interactive "e")
+  (let ((event-col-row (company--event-col-row event))
+        (ovl-row (company--row))
+        (ovl-height (and company-pseudo-tooltip-overlay
+                         (min (overlay-get company-pseudo-tooltip-overlay
+                                           'company-height)
+                              company-candidates-length))))
+    (if (and ovl-height
+             (company--inside-tooltip-p event-col-row ovl-row ovl-height))
+        (progn
+          (company-set-selection (+ (cdr event-col-row)
+                                    (if (zerop company-tooltip-offset)
+                                        -1
+                                      (- company-tooltip-offset 2))
+                                    (- ovl-row)
+                                    (if (< ovl-height 0)
+                                        (- 1 ovl-height)
+                                      0)))
+          t)
+      (company-abort)
+      (company--unread-last-input)
+      nil)))
+
+(defun company-complete-mouse (event)
+  "Complete the candidate picked by the mouse."
+  (interactive "e")
+  (when (company-select-mouse event)
+    (company-complete-selection)))
+
+(defun company-complete-selection ()
+  "Complete the selected candidate."
+  (interactive)
+  (when (company-manual-begin)
+    (let ((result (nth company-selection company-candidates)))
+      (when company--auto-completion
+        (setq result (company--safe-candidate result)))
+      (company-finish result))))
+
+(defun company-complete-common ()
+  "Complete the common part of all candidates."
+  (interactive)
+  (when (company-manual-begin)
+    (if (and (not (cdr company-candidates))
+             (equal company-common (car company-candidates)))
+        (company-complete-selection)
+      (insert (company-strip-prefix company-common)))))
+
+(defun company-complete ()
+  "Complete the common part of all candidates or the current selection.
+The first time this is called, the common part is completed, the second
+time, or when the selection has been changed, the selected candidate is
+completed."
+  (interactive)
+  (when (company-manual-begin)
+    (if (or company-selection-changed
+            (eq last-command 'company-complete-common))
+        (call-interactively 'company-complete-selection)
+      (call-interactively 'company-complete-common)
+      (setq this-command 'company-complete-common))))
+
+(defun company-complete-number (n)
+  "Complete the Nth candidate.
+To show the number next to the candidates in some back-ends, enable
+`company-show-numbers'."
+  (when (company-manual-begin)
+    (and (< n 1) (> n company-candidates-length)
+         (error "No candidate number %d" n))
+    (decf n)
+    (company-finish (nth n company-candidates))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defconst company-space-strings-limit 100)
+
+(defconst company-space-strings
+  (let (lst)
+    (dotimes (i company-space-strings-limit)
+      (push (make-string (- company-space-strings-limit 1 i) ?\  ) lst))
+    (apply 'vector lst)))
+
+(defun company-space-string (len)
+  (if (< len company-space-strings-limit)
+      (aref company-space-strings len)
+    (make-string len ?\ )))
+
+(defun company-safe-substring (str from &optional to)
+  (if (> from (string-width str))
+      ""
+    (with-temp-buffer
+      (insert str)
+      (move-to-column from)
+      (let ((beg (point)))
+        (if to
+            (progn
+              (move-to-column to)
+              (concat (buffer-substring beg (point))
+                      (let ((padding (- to (current-column))))
+                        (when (> padding 0)
+                          (company-space-string padding)))))
+          (buffer-substring beg (point-max)))))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defvar company-last-metadata nil)
+(make-variable-buffer-local 'company-last-metadata)
+
+(defun company-fetch-metadata ()
+  (let ((selected (nth company-selection company-candidates)))
+    (unless (equal selected (car company-last-metadata))
+      (setq company-last-metadata
+            (cons selected (company-call-backend 'meta selected))))
+    (cdr company-last-metadata)))
+
+(defun company-doc-buffer (&optional string)
+  (with-current-buffer (get-buffer-create "*company-documentation*")
+    (erase-buffer)
+    (when string
+      (save-excursion
+        (insert string)))
+    (current-buffer)))
+
+(defvar company--electric-commands
+  '(scroll-other-window scroll-other-window-down)
+  "List of Commands that won't break out of electric commands.")
+
+(defmacro company--electric-do (&rest body)
+  (declare (indent 0) (debug t))
+  `(when (company-manual-begin)
+     (save-window-excursion
+       (let ((height (window-height))
+             (row (company--row))
+             cmd)
+         ,@body
+         (and (< (window-height) height)
+              (< (- (window-height) row 2) company-tooltip-limit)
+              (recenter (- (window-height) row 2)))
+         (while (memq (setq cmd (key-binding (vector (list (read-event)))))
+                      company--electric-commands)
+           (call-interactively cmd))
+         (company--unread-last-input)))))
+
+(defun company--unread-last-input ()
+  (when last-input-event
+    (clear-this-command-keys t)
+    (setq unread-command-events (list last-input-event))))
+
+(defun company-show-doc-buffer ()
+  "Temporarily show the documentation buffer for the selection."
+  (interactive)
+  (company--electric-do
+    (let* ((selected (nth company-selection company-candidates))
+           (doc-buffer (or (company-call-backend 'doc-buffer selected)
+                           (error "No documentation available"))))
+      (with-current-buffer doc-buffer
+        (goto-char (point-min)))
+      (display-buffer doc-buffer t))))
+(put 'company-show-doc-buffer 'company-keep t)
+
+(defun company-show-location ()
+  "Temporarily display a buffer showing the selected candidate in context."
+  (interactive)
+  (company--electric-do
+    (let* ((selected (nth company-selection company-candidates))
+           (location (company-call-backend 'location selected))
+           (pos (or (cdr location) (error "No location available")))
+           (buffer (or (and (bufferp (car location)) (car location))
+                       (find-file-noselect (car location) t))))
+      (with-selected-window (display-buffer buffer t)
+        (save-restriction
+          (widen)
+          (if (bufferp (car location))
+              (goto-char pos)
+            (goto-char (point-min))
+            (forward-line (1- pos))))
+        (set-window-start nil (point))))))
+(put 'company-show-location 'company-keep t)
+
+;;; package functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defvar company-callback nil)
+(make-variable-buffer-local 'company-callback)
+
+(defvar company-begin-with-marker nil)
+(make-variable-buffer-local 'company-begin-with-marker)
+
+(defun company-remove-callback (&optional ignored)
+  (remove-hook 'company-completion-finished-hook company-callback t)
+  (remove-hook 'company-completion-cancelled-hook 'company-remove-callback t)
+  (remove-hook 'company-completion-finished-hook 'company-remove-callback t)
+  (when company-begin-with-marker
+    (set-marker company-begin-with-marker nil)))
+
+(defun company-begin-backend (backend &optional callback)
+  "Start a completion at point using BACKEND."
+  (interactive (let ((val (completing-read "Company back-end: "
+                                           obarray
+                                           'functionp nil "company-")))
+                 (when val
+                   (list (intern val)))))
+  (when (setq company-callback callback)
+    (add-hook 'company-completion-finished-hook company-callback nil t))
+  (add-hook 'company-completion-cancelled-hook 'company-remove-callback nil t)
+  (add-hook 'company-completion-finished-hook 'company-remove-callback nil t)
+  (setq company-backend backend)
+  ;; Return non-nil if active.
+  (or (company-manual-begin)
+      (progn
+        (setq company-backend nil)
+        (error "Cannot complete at point"))))
+
+(defun company-begin-with (candidates
+                           &optional prefix-length require-match callback)
+  "Start a completion at point.
+CANDIDATES is the list of candidates to use and PREFIX-LENGTH is the length
+of the prefix that already is in the buffer before point.
+It defaults to 0.
+
+CALLBACK is a function called with the selected result if the user
+successfully completes the input.
+
+Example: \(company-begin-with '\(\"foo\" \"foobar\" \"foobarbaz\"\)\)"
+  ;; FIXME: When Emacs 23 is no longer a concern, replace
+  ;; `company-begin-with-marker' with a lexical variable; use a lexical closure.
+  (setq company-begin-with-marker (copy-marker (point) t))
+  (company-begin-backend
+   `(lambda (command &optional arg &rest ignored)
+      (cond
+       ((eq command 'prefix)
+        (when (equal (point) (marker-position company-begin-with-marker))
+          (buffer-substring ,(- (point) (or prefix-length 0)) (point))))
+       ((eq command 'candidates)
+        (all-completions arg ',candidates))
+       ((eq command 'require-match)
+        ,require-match)))
+   callback))
+
+;;; pseudo-tooltip ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defvar company-pseudo-tooltip-overlay nil)
+(make-variable-buffer-local 'company-pseudo-tooltip-overlay)
+
+(defvar company-tooltip-offset 0)
+(make-variable-buffer-local 'company-tooltip-offset)
+
+(defun company-pseudo-tooltip-update-offset (selection num-lines limit)
+
+  (decf limit 2)
+  (setq company-tooltip-offset
+        (max (min selection company-tooltip-offset)
+             (- selection -1 limit)))
+
+  (when (<= company-tooltip-offset 1)
+    (incf limit)
+    (setq company-tooltip-offset 0))
+
+  (when (>= company-tooltip-offset (- num-lines limit 1))
+    (incf limit)
+    (when (= selection (1- num-lines))
+      (decf company-tooltip-offset)
+      (when (<= company-tooltip-offset 1)
+        (setq company-tooltip-offset 0)
+        (incf limit))))
+
+  limit)
+
+;;; propertize
+
+(defsubst company-round-tab (arg)
+  (* (/ (+ arg tab-width) tab-width) tab-width))
+
+(defun company-untabify (str)
+  (let* ((pieces (split-string str "\t"))
+         (copy pieces))
+    (while (cdr copy)
+      (setcar copy (company-safe-substring
+                    (car copy) 0 (company-round-tab (string-width (car copy)))))
+      (pop copy))
+    (apply 'concat pieces)))
+
+(defun company-fill-propertize (line width selected)
+  (setq line (company-safe-substring line 0 width))
+  (add-text-properties 0 width '(face company-tooltip
+                                 mouse-face company-tooltip-mouse)
+                       line)
+  (add-text-properties 0 (length company-common)
+                       '(face company-tooltip-common
+                         mouse-face company-tooltip-mouse)
+                       line)
+  (when selected
+    (if (and company-search-string
+             (string-match (regexp-quote company-search-string) line
+                           (length company-prefix)))
+        (progn
+          (add-text-properties (match-beginning 0) (match-end 0)
+                               '(face company-tooltip-selection)
+                               line)
+          (when (< (match-beginning 0) (length company-common))
+            (add-text-properties (match-beginning 0) (length company-common)
+                                 '(face company-tooltip-common-selection)
+                                 line)))
+      (add-text-properties 0 width '(face company-tooltip-selection
+                                          mouse-face company-tooltip-selection)
+                           line)
+      (add-text-properties 0 (length company-common)
+                           '(face company-tooltip-common-selection
+                             mouse-face company-tooltip-selection)
+                           line)))
+  line)
+
+;;; replace
+
+(defun company-buffer-lines (beg end)
+  (goto-char beg)
+  (let (lines)
+    (while (and (= 1 (vertical-motion 1))
+                (<= (point) end))
+      (let ((bound (min end (1- (point)))))
+        ;; A visual line can contain several physical lines (e.g. with outline's
+        ;; folding overlay).  Take only the first one.
+        (push (buffer-substring beg
+                                (save-excursion
+                                  (goto-char beg)
+                                  (re-search-forward "$" bound 'move)
+                                  (point)))
+              lines))
+      (setq beg (point)))
+    (unless (eq beg end)
+      (push (buffer-substring beg end) lines))
+    (nreverse lines)))
+
+(defun company-modify-line (old new offset)
+  (let ((prefix (get-text-property 0 'line-prefix old)))
+    (when prefix ; Keep the original value unmodified, for no special reason.
+      (setq old (concat prefix old))
+      (remove-text-properties 0 (length old) '(line-prefix) old)))
+  (concat (company-safe-substring old 0 offset)
+          new
+          (company-safe-substring old (+ offset (length new)))))
+
+(defsubst company--length-limit (lst limit)
+  (if (nthcdr limit lst)
+      limit
+    (length lst)))
+
+(defun company--replacement-string (lines old column nl &optional align-top)
+
+  (let ((width (length (car lines)))
+        (remaining-cols (- (+ (window-width) (window-hscroll))
+                           column)))
+    (when (> width remaining-cols)
+      (decf column (- width remaining-cols))))
+
+  (let (new)
+    (when align-top
+      ;; untouched lines first
+      (dotimes (_ (- (length old) (length lines)))
+        (push (pop old) new)))
+    ;; length into old lines.
+    (while old
+      (push (company-modify-line (pop old) (pop lines) column) new))
+    ;; Append whole new lines.
+    (while lines
+      (push (concat (company-space-string column) (pop lines)) new))
+
+    (let ((str (concat (when nl "\n")
+                       (mapconcat 'identity (nreverse new) "\n")
+                       "\n")))
+      (font-lock-append-text-property 0 (length str) 'face 'default str)
+      str)))
+
+(defun company--create-lines (selection limit)
+
+  (let ((len company-candidates-length)
+        (numbered 99999)
+        lines
+        width
+        lines-copy
+        previous
+        remainder
+        new)
+
+    ;; Scroll to offset.
+    (setq limit (company-pseudo-tooltip-update-offset selection len limit))
+
+    (when (> company-tooltip-offset 0)
+      (setq previous (format "...(%d)" company-tooltip-offset)))
+
+    (setq remainder (- len limit company-tooltip-offset)
+          remainder (when (> remainder 0)
+                      (setq remainder (format "...(%d)" remainder))))
+
+    (decf selection company-tooltip-offset)
+    (setq width (max (length previous) (length remainder))
+          lines (nthcdr company-tooltip-offset company-candidates)
+          len (min limit len)
+          lines-copy lines)
+
+    (dotimes (_ len)
+      (setq width (max (length (pop lines-copy)) width)))
+    (setq width (min width (window-width)))
+
+    (setq lines-copy lines)
+
+    ;; number can make tooltip too long
+    (when company-show-numbers
+      (setq numbered company-tooltip-offset))
+
+    (when previous
+      (push (propertize (company-safe-substring previous 0 width)
+                        'face 'company-tooltip)
+            new))
+
+    (dotimes (i len)
+      (push (company-fill-propertize
+             (if (>= numbered 10)
+                 (company-reformat (pop lines))
+               (incf numbered)
+               (format "%s %d"
+                       (company-safe-substring (company-reformat (pop lines))
+                                               0 (- width 2))
+                       (mod numbered 10)))
+             width (equal i selection))
+            new))
+
+    (when remainder
+      (push (propertize (company-safe-substring remainder 0 width)
+                        'face 'company-tooltip)
+            new))
+
+    (setq lines (nreverse new))))
+
+;; show
+
+(defsubst company--window-inner-height ()
+  (let ((edges (window-inside-edges)))
+    (- (nth 3 edges) (nth 1 edges))))
+
+(defun company--pseudo-tooltip-height ()
+  "Calculate the appropriate tooltip height.
+Returns a negative number if the tooltip should be displayed above point."
+  (let* ((lines (company--row))
+         (below (- (company--window-inner-height) 1 lines)))
+    (if (and (< below (min company-tooltip-minimum company-candidates-length))
+             (> lines below))
+        (- (max 3 (min company-tooltip-limit lines)))
+      (max 3 (min company-tooltip-limit below)))))
+
+(defun company-pseudo-tooltip-show (row column selection)
+  (company-pseudo-tooltip-hide)
+  (save-excursion
+
+    (let* ((height (company--pseudo-tooltip-height))
+           above)
+
+      (when (< height 0)
+        (setq row (+ row height -1)
+              above t))
+
+      (let* ((nl (< (move-to-window-line row) row))
+             (beg (point))
+             (end (save-excursion
+                    (move-to-window-line (+ row (abs height)))
+                    (point)))
+             (ov (make-overlay beg end))
+             (args (list (mapcar 'company-untabify
+                                 (company-buffer-lines beg end))
+                         column nl above)))
+
+        (setq company-pseudo-tooltip-overlay ov)
+        (overlay-put ov 'company-replacement-args args)
+
+        (let ((lines (company--create-lines selection (abs height))))
+          (overlay-put ov 'company-before
+                       (apply 'company--replacement-string lines args))
+          (overlay-put ov 'company-width (string-width (car lines))))
+
+        (overlay-put ov 'company-column column)
+        (overlay-put ov 'company-height height)))))
+
+(defun company-pseudo-tooltip-show-at-point (pos)
+  (let ((row (company--row pos))
+        (col (company--column pos)))
+    (company-pseudo-tooltip-show (1+ row) col company-selection)))
+
+(defun company-pseudo-tooltip-edit (selection)
+  (let ((height (overlay-get company-pseudo-tooltip-overlay 'company-height)))
+    (overlay-put company-pseudo-tooltip-overlay 'company-before
+                 (apply 'company--replacement-string
+                        (company--create-lines selection (abs height))
+                        (overlay-get company-pseudo-tooltip-overlay
+                                     'company-replacement-args)))))
+
+(defun company-pseudo-tooltip-hide ()
+  (when company-pseudo-tooltip-overlay
+    (delete-overlay company-pseudo-tooltip-overlay)
+    (setq company-pseudo-tooltip-overlay nil)))
+
+(defun company-pseudo-tooltip-hide-temporarily ()
+  (when (overlayp company-pseudo-tooltip-overlay)
+    (overlay-put company-pseudo-tooltip-overlay 'invisible nil)
+    (overlay-put company-pseudo-tooltip-overlay 'before-string nil)))
+
+(defun company-pseudo-tooltip-unhide ()
+  (when company-pseudo-tooltip-overlay
+    (overlay-put company-pseudo-tooltip-overlay 'invisible t)
+    ;; Beat outline's folding overlays, at least.
+    (overlay-put company-pseudo-tooltip-overlay 'priority 1)
+    ;; No (extra) prefix for the first line.
+    (overlay-put company-pseudo-tooltip-overlay 'line-prefix "")
+    (overlay-put company-pseudo-tooltip-overlay 'before-string
+                 (overlay-get company-pseudo-tooltip-overlay 'company-before))
+    (overlay-put company-pseudo-tooltip-overlay 'window (selected-window))))
+
+(defun company-pseudo-tooltip-guard ()
+  (buffer-substring-no-properties
+   (point) (overlay-start company-pseudo-tooltip-overlay)))
+
+(defun company-pseudo-tooltip-frontend (command)
+  "`company-mode' front-end similar to a tooltip but based on overlays."
+  (case command
+    (pre-command (company-pseudo-tooltip-hide-temporarily))
+    (post-command
+     (let ((old-height (if (overlayp company-pseudo-tooltip-overlay)
+                           (overlay-get company-pseudo-tooltip-overlay
+                                        'company-height)
+                         0))
+           (new-height (company--pseudo-tooltip-height)))
+       (unless (and (>= (* old-height new-height) 0)
+                    (>= (abs old-height) (abs new-height))
+                    (equal (company-pseudo-tooltip-guard)
+                           (overlay-get company-pseudo-tooltip-overlay
+                                        'company-guard)))
+         ;; Redraw needed.
+         (company-pseudo-tooltip-show-at-point (- (point)
+                                                  (length company-prefix)))
+         (overlay-put company-pseudo-tooltip-overlay
+                      'company-guard (company-pseudo-tooltip-guard))))
+     (company-pseudo-tooltip-unhide))
+    (hide (company-pseudo-tooltip-hide)
+          (setq company-tooltip-offset 0))
+    (update (when (overlayp company-pseudo-tooltip-overlay)
+              (company-pseudo-tooltip-edit company-selection)))))
+
+(defun company-pseudo-tooltip-unless-just-one-frontend (command)
+  "`company-pseudo-tooltip-frontend', but not shown for single candidates."
+  (unless (and (eq command 'post-command)
+               (not (cdr company-candidates)))
+    (company-pseudo-tooltip-frontend command)))
+
+;;; overlay ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defvar company-preview-overlay nil)
+(make-variable-buffer-local 'company-preview-overlay)
+
+(defun company-preview-show-at-point (pos)
+  (company-preview-hide)
+
+  (setq company-preview-overlay (make-overlay pos pos))
+
+  (let ((completion(nth company-selection company-candidates)))
+    (setq completion (propertize completion 'face 'company-preview))
+    (add-text-properties 0 (length company-common)
+                         '(face company-preview-common) completion)
+
+    ;; Add search string
+    (and company-search-string
+         (string-match (regexp-quote company-search-string) completion)
+         (add-text-properties (match-beginning 0)
+                              (match-end 0)
+                              '(face company-preview-search)
+                              completion))
+
+    (setq completion (company-strip-prefix completion))
+
+    (and (equal pos (point))
+         (not (equal completion ""))
+         (add-text-properties 0 1 '(cursor t) completion))
+
+    (overlay-put company-preview-overlay 'after-string completion)
+    (overlay-put company-preview-overlay 'window (selected-window))))
+
+(defun company-preview-hide ()
+  (when company-preview-overlay
+    (delete-overlay company-preview-overlay)
+    (setq company-preview-overlay nil)))
+
+(defun company-preview-frontend (command)
+  "`company-mode' front-end showing the selection as if it had been inserted."
+  (case command
+    (pre-command (company-preview-hide))
+    (post-command (company-preview-show-at-point (point)))
+    (hide (company-preview-hide))))
+
+(defun company-preview-if-just-one-frontend (command)
+  "`company-preview-frontend', but only shown for single candidates."
+  (unless (and (eq command 'post-command)
+               (cdr company-candidates))
+    (company-preview-frontend command)))
+
+;;; echo ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defvar company-echo-last-msg nil)
+(make-variable-buffer-local 'company-echo-last-msg)
+
+(defvar company-echo-timer nil)
+
+(defvar company-echo-delay .01)
+
+(defun company-echo-show (&optional getter)
+  (when getter
+    (setq company-echo-last-msg (funcall getter)))
+  (let ((message-log-max nil))
+    (if company-echo-last-msg
+        (message "%s" company-echo-last-msg)
+      (message ""))))
+
+(defun company-echo-show-soon (&optional getter)
+  (when company-echo-timer
+    (cancel-timer company-echo-timer))
+  (setq company-echo-timer (run-with-timer 0 nil 'company-echo-show getter)))
+
+(defsubst company-echo-show-when-idle (&optional getter)
+  (when (sit-for company-echo-delay)
+    (company-echo-show getter)))
+
+(defun company-echo-format ()
+
+  (let ((limit (window-width (minibuffer-window)))
+        (len -1)
+        ;; Roll to selection.
+        (candidates (nthcdr company-selection company-candidates))
+        (i (if company-show-numbers company-selection 99999))
+        comp msg)
+
+    (while candidates
+      (setq comp (company-reformat (pop candidates))
+            len (+ len 1 (length comp)))
+      (if (< i 10)
+          ;; Add number.
+          (progn
+            (setq comp (propertize (format "%d: %s" i comp)
+                                   'face 'company-echo))
+            (incf len 3)
+            (incf i)
+            (add-text-properties 3 (+ 3 (length company-common))
+                                 '(face company-echo-common) comp))
+        (setq comp (propertize comp 'face 'company-echo))
+        (add-text-properties 0 (length company-common)
+                             '(face company-echo-common) comp))
+      (if (>= len limit)
+          (setq candidates nil)
+        (push comp msg)))
+
+    (mapconcat 'identity (nreverse msg) " ")))
+
+(defun company-echo-strip-common-format ()
+
+  (let ((limit (window-width (minibuffer-window)))
+        (len (+ (length company-prefix) 2))
+        ;; Roll to selection.
+        (candidates (nthcdr company-selection company-candidates))
+        (i (if company-show-numbers company-selection 99999))
+        msg comp)
+
+    (while candidates
+      (setq comp (company-strip-prefix (pop candidates))
+            len (+ len 2 (length comp)))
+      (when (< i 10)
+        ;; Add number.
+        (setq comp (format "%s (%d)" comp i))
+        (incf len 4)
+        (incf i))
+      (if (>= len limit)
+          (setq candidates nil)
+        (push (propertize comp 'face 'company-echo) msg)))
+
+    (concat (propertize company-prefix 'face 'company-echo-common) "{"
+            (mapconcat 'identity (nreverse msg) ", ")
+            "}")))
+
+(defun company-echo-hide ()
+  (unless (equal company-echo-last-msg "")
+    (setq company-echo-last-msg "")
+    (company-echo-show)))
+
+(defun company-echo-frontend (command)
+  "`company-mode' front-end showing the candidates in the echo area."
+  (case command
+    (post-command (company-echo-show-soon 'company-echo-format))
+    (hide (company-echo-hide))))
+
+(defun company-echo-strip-common-frontend (command)
+  "`company-mode' front-end showing the candidates in the echo area."
+  (case command
+    (post-command (company-echo-show-soon 'company-echo-strip-common-format))
+    (hide (company-echo-hide))))
+
+(defun company-echo-metadata-frontend (command)
+  "`company-mode' front-end showing the documentation in the echo area."
+  (case command
+    (post-command (company-echo-show-when-idle 'company-fetch-metadata))
+    (hide (company-echo-hide))))
+
+(provide 'company)
+;;; company.el ends here
diff --git a/packages/csv-mode/csv-mode.el b/packages/csv-mode/csv-mode.el
new file mode 100644 (file)
index 0000000..dbc6182
--- /dev/null
@@ -0,0 +1,1286 @@
+;;; csv-mode.el --- Major mode for editing comma/char separated values  -*- lexical-binding: t -*-
+
+;; Copyright (C) 2003, 2004, 2012, 2013  Free Software Foundation, Inc
+
+;; Author: Francis J. Wright <F.J.Wright at qmul.ac.uk>
+;; Time-stamp: <23 August 2004>
+;; URL: http://centaur.maths.qmul.ac.uk/Emacs/
+;; Version: 1.2
+;; Keywords: convenience
+
+;; This package 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, or (at your option)
+;; any later version.
+
+;; This package 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This package implements CSV mode, a major mode for editing records
+;; in a generalized CSV (character-separated values) format.  It binds
+;; finds with prefix ".csv" to `csv-mode' in `auto-mode-alist'.
+
+;; In CSV mode, the following commands are available:
+
+;; - C-c C-s (`csv-sort-fields') and C-c C-n (`csv-sort-numeric-fields')
+;;   respectively sort lexicographically and numerically on a
+;;   specified field or column.
+
+;; - C-c C-r (`csv-reverse-region') reverses the order.  (These
+;;   commands are based closely on, and use, code in `sort.el'.)
+
+;; - C-c C-k (`csv-kill-fields') and C-c C-y (`csv-yank-fields') kill
+;;   and yank fields or columns, although they do not use the normal
+;;   kill ring.  C-c C-k can kill more than one field at once, but
+;;   multiple killed fields can be yanked only as a fixed group
+;;   equivalent to a single field.
+
+;; - C-c C-a (`csv-align-fields') aligns fields into columns
+
+;; - C-c C-u (`csv-unalign-fields') undoes such alignment; separators
+;;   can be hidden within aligned records.
+
+;; - C-c C-t (`csv-transpose') interchanges rows and columns.  For
+;;   details, see the documentation for the individual commands.
+
+;; CSV mode can recognize fields separated by any of several single
+;; characters, specified by the value of the customizable user option
+;; `csv-separators'.  CSV data fields can be delimited by quote
+;; characters (and must if they contain separator characters).  This
+;; implementation supports quoted fields, where the quote characters
+;; allowed are specified by the value of the customizable user option
+;; `csv-field-quotes'.  By default, the only separator is a comma and
+;; the only field quote is a double quote.  These user options can be
+;; changed ONLY by customizing them, e.g. via M-x customize-variable.
+
+;; CSV mode commands ignore blank lines and comment lines beginning
+;; with the value of the buffer local variable `csv-comment-start',
+;; which by default is #.  The user interface is similar to that of
+;; the standard commands `sort-fields' and `sort-numeric-fields', but
+;; see the major mode documentation below.
+
+;; The global minor mode `csv-field-index-mode' provides display of
+;; the current field index in the mode line, cf. `line-number-mode'
+;; and `column-number-mode'.  It is on by default.
+
+;;; Installation:
+
+;; Put this file somewhere that Emacs can find it (i.e. in one of the
+;; directories in your `load-path' such as `site-lisp'), optionally
+;; byte-compile it (recommended), and put this in your .emacs file:
+;;
+;; (add-to-list 'auto-mode-alist '("\\.[Cc][Ss][Vv]\\'" . csv-mode))
+;; (autoload 'csv-mode "csv-mode"
+;;   "Major mode for editing comma-separated value files." t)
+
+;;; History:
+
+;; Begun on 15 November 2003 to provide lexicographic sorting of
+;; simple CSV data by field and released as csv.el.  Facilities to
+;; kill multiple fields and customize separator added on 9 April 2004.
+;; Converted to a major mode and renamed csv-mode.el on 10 April 2004,
+;; partly at the suggestion of Stefan Monnier <monnier at
+;; IRO.UMontreal.CA> to avoid conflict with csv.el by Ulf Jasper.
+;; Field alignment, comment support and CSV mode customization group
+;; added on 1 May 2004.  Support for index ranges added on 6 June
+;; 2004.  Multiple field separators added on 12 June 2004.
+;; Transposition added on 22 June 2004.  Separator invisibility added
+;; on 23 June 2004.
+
+;;; See also:
+
+;; the standard GNU Emacs 21 packages align.el, which will align
+;; columns within a region, and delim-col.el, which helps to prettify
+;; columns in a text region or rectangle;
+
+;; csv.el by Ulf Jasper <ulf.jasper at web.de>, which provides
+;; functions for reading/parsing comma-separated value files and is
+;; available at http://de.geocities.com/ulf_jasper/emacs.html (and in
+;; the gnu.emacs.sources archives).
+
+;;; To do (maybe):
+
+;; Make separators and quotes buffer-local and locally settable.
+;; Support (La)TeX tables: set separator and comment; support record
+;; end string.
+;; Convert comma-separated to space- or tab-separated.
+
+;;; Code:
+
+(defgroup CSV nil
+  "Major mode for editing files of comma-separated value type."
+  :group 'convenience)
+
+(defvar csv-separator-chars nil
+  "Field separators as a list of character.
+Set by customizing `csv-separators' -- do not set directly!")
+
+(defvar csv-separator-regexp nil
+  "Regexp to match a field separator.
+Set by customizing `csv-separators' -- do not set directly!")
+
+(defvar csv--skip-regexp nil
+  "Regexp used by `skip-chars-forward' etc. to skip fields.
+Set by customizing `csv-separators' -- do not set directly!")
+
+(defvar csv-font-lock-keywords nil
+  "Font lock keywords to highlight the field separators in CSV mode.
+Set by customizing `csv-separators' -- do not set directly!")
+
+(defcustom csv-separators '("," "\t")
+  "Field separators: a list of *single-character* strings.
+For example: (\",\"), the default, or (\",\" \";\" \":\").
+Neighbouring fields may be separated by any one of these characters.
+The first is used when inserting a field separator into the buffer.
+All must be different from the field quote characters, `csv-field-quotes'."
+  ;; Suggested by Eckhard Neber <neber@mwt.e-technik.uni-ulm.de>
+  :type '(repeat string)
+  ;; FIXME: Character would be better, but in Emacs 21.3 does not display
+  ;; correctly in a customization buffer.
+  :set (lambda (variable value)
+        (mapc (lambda (x)
+                (if (/= (length x) 1)
+                    (error "Non-single-char string %S" x))
+                 (if (and (boundp 'csv-field-quotes)
+                          (member x csv-field-quotes))
+                     (error "%S is already a quote" x)))
+              value)
+        (custom-set-default variable value)
+        (setq csv-separator-chars (mapcar 'string-to-char value)
+              csv--skip-regexp (apply 'concat "^\n" csv-separators)
+              csv-separator-regexp (apply 'concat `("[" ,@value "]"))
+              csv-font-lock-keywords
+              ;; NB: csv-separator-face variable evaluates to itself.
+              `((,csv-separator-regexp (0 'csv-separator-face))))))
+
+(defcustom csv-field-quotes '("\"")
+  "Field quotes: a list of *single-character* strings.
+For example: (\"\\\"\"), the default, or (\"\\\"\" \"'\" \"`\").
+A field can be delimited by a pair of any of these characters.
+All must be different from the field separators, `csv-separators'."
+  :type '(repeat string)
+  ;; Character would be better, but in Emacs 21 does not display
+  ;; correctly in a customization buffer.
+  :set (lambda (variable value)
+        (mapc (lambda (x)
+                (if (/= (length x) 1)
+                    (error "Non-single-char string %S" x))
+                (if (member x csv-separators)
+                    (error "%S is already a separator" x)))
+              value)
+        (when (boundp 'csv-mode-syntax-table)
+          ;; FIRST remove old quote syntax:
+          (with-syntax-table text-mode-syntax-table
+            (mapc (lambda (x)
+                    (modify-syntax-entry
+                     (string-to-char x)
+                     (string (char-syntax (string-to-char x)))
+                     ;; symbol-value to avoid compiler warning:
+                     (symbol-value 'csv-mode-syntax-table)))
+                  csv-field-quotes))
+          ;; THEN set new quote syntax:
+          (csv-set-quote-syntax value))
+        ;; BEFORE setting new value of `csv-field-quotes':
+        (custom-set-default variable value)))
+
+(defun csv-set-quote-syntax (field-quotes)
+  "Set syntax for field quote characters FIELD-QUOTES to be \"string\".
+FIELD-QUOTES should be a list of single-character strings."
+  (mapc (lambda (x)
+         (modify-syntax-entry
+          (string-to-char x) "\""
+          ;; symbol-value to avoid compiler warning:
+          (symbol-value 'csv-mode-syntax-table)))
+       field-quotes))
+
+(defvar csv-comment-start nil
+  "String that starts a comment line, or nil if no comment syntax.
+Such comment lines are ignored by CSV mode commands.
+This variable is buffer local\; its default value is that of
+`csv-comment-start-default'.  It is set by the function
+`csv-set-comment-start' -- do not set it directly!")
+
+(make-variable-buffer-local 'csv-comment-start)
+
+(defcustom csv-comment-start-default "#"
+  "String that starts a comment line, or nil if no comment syntax.
+Such comment lines are ignored by CSV mode commands.
+Default value of buffer-local variable `csv-comment-start'.
+Changing this variable does not affect any existing CSV mode buffer."
+  :type '(choice (const :tag "None" nil) string)
+  :set (lambda (variable value)
+        (custom-set-default variable value)
+        (set-default 'csv-comment-start value)))
+
+(defcustom csv-align-style 'left
+  "Aligned field style: one of 'left, 'centre, 'right or 'auto.
+Alignment style used by `csv-align-fields'.
+Auto-alignment means left align text and right align numbers."
+  :type '(choice (const left) (const centre)
+                (const right) (const auto)))
+
+(defcustom csv-align-padding 1
+  "Aligned field spacing: must be a positive integer.
+Number of spaces used by `csv-align-fields' after separators."
+  :type 'integer)
+
+(defcustom csv-header-lines 0
+  "Header lines to skip when setting region automatically."
+  :type 'integer)
+
+(defcustom csv-invisibility-default t
+  "If non-nil, make separators in aligned records invisible."
+  :type 'boolean)
+
+(defface csv-separator-face
+  '((t :inherit escape-glyph))
+  "CSV mode face used to highlight separators.")
+\f
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;  Mode definition, key bindings and menu
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defconst csv-mode-line-help-echo
+  ;; See bindings.el for details of `mode-line-format' construction.
+  (get-text-property 0 'help-echo (car (default-value 'mode-line-format)))
+  "Primary default mode line help echo text.")
+
+(defconst csv-mode-line-format
+  ;; See bindings.el for details of `mode-line-format' construction.
+  (let* ((ml (copy-sequence (default-value 'mode-line-format)))
+         (x (or (memq 'mode-line-position ml) (last 3 ml))))
+    (when x
+      (setcdr x (cons
+                 `(csv-field-index-string
+                   ("" csv-field-index-string
+                    ;; ,(propertize "--" 'help-echo csv-mode-line-help-echo)
+                    ))
+                 (cdr x))))
+    ml)
+  "Mode line format string for CSV mode.")
+
+(defvar csv-mode-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map [(control ?c) (control ?v)] 'csv-toggle-invisibility)
+    (define-key map [(control ?c) (control ?t)] 'csv-transpose)
+    (define-key map [(control ?c) (control ?c)] 'csv-set-comment-start)
+    (define-key map [(control ?c) (control ?u)] 'csv-unalign-fields)
+    (define-key map [(control ?c) (control ?a)] 'csv-align-fields)
+    (define-key map [(control ?c) (control ?z)] 'csv-yank-as-new-table)
+    (define-key map [(control ?c) (control ?y)] 'csv-yank-fields)
+    (define-key map [(control ?c) (control ?k)] 'csv-kill-fields)
+    (define-key map [(control ?c) (control ?d)] 'csv-toggle-descending)
+    (define-key map [(control ?c) (control ?r)] 'csv-reverse-region)
+    (define-key map [(control ?c) (control ?n)] 'csv-sort-numeric-fields)
+    (define-key map [(control ?c) (control ?s)] 'csv-sort-fields)
+    map))
+
+;;;###autoload
+(define-derived-mode csv-mode text-mode "CSV"
+  "Major mode for editing files of comma-separated value type.
+
+CSV mode is derived from `text-mode', and runs `text-mode-hook' before
+running `csv-mode-hook'.  It turns `auto-fill-mode' off by default.
+CSV mode can be customized by user options in the CSV customization
+group.  The separators are specified by the value of `csv-separators'.
+
+CSV mode commands ignore blank lines and comment lines beginning with
+the value of `csv-comment-start', which delimit \"paragraphs\".
+\"Sexp\" is re-interpreted to mean \"field\", so that `forward-sexp'
+\(\\[forward-sexp]), `kill-sexp' (\\[kill-sexp]), etc. all apply to fields.
+Standard comment commands apply, such as `comment-dwim' (\\[comment-dwim]).
+
+If `font-lock-mode' is enabled then separators, quoted values and
+comment lines are highlighted using respectively `csv-separator-face',
+`font-lock-string-face' and `font-lock-comment-face'.
+
+The user interface (UI) for CSV mode commands is similar to that of
+the standard commands `sort-fields' and `sort-numeric-fields', except
+that if there is no prefix argument then the UI prompts for the field
+index or indices.  In `transient-mark-mode' only: if the region is not
+set then the UI attempts to set it to include all consecutive CSV
+records around point, and prompts for confirmation; if there is no
+prefix argument then the UI prompts for it, offering as a default the
+index of the field containing point if the region was not set
+explicitly.  The region set automatically is delimited by blank lines
+and comment lines, and the number of header lines at the beginning of
+the region given by the value of `csv-header-lines' are skipped.
+
+Sort order is controlled by `csv-descending'.
+
+CSV mode provides the following specific keyboard key bindings:
+
+\\{csv-mode-map}"
+  (turn-off-auto-fill)
+  ;; Set syntax for field quotes:
+  (csv-set-quote-syntax csv-field-quotes)
+  ;; Make sexp functions apply to fields:
+  (set (make-local-variable 'forward-sexp-function) 'csv-forward-field)
+  (csv-set-comment-start csv-comment-start)
+  (setq
+   ;; Font locking -- separator plus syntactic:
+   font-lock-defaults '(csv-font-lock-keywords)
+   buffer-invisibility-spec csv-invisibility-default
+   ;; Mode line to support `csv-field-index-mode':
+   mode-line-format csv-mode-line-format)
+  (set (make-local-variable 'truncate-lines) t)
+  ;; Enable or disable `csv-field-index-mode' (could probably do this
+  ;; a bit more efficiently):
+  (csv-field-index-mode (symbol-value 'csv-field-index-mode)))
+
+(defun csv-set-comment-start (string)
+  "Set comment start for this CSV mode buffer to STRING.
+It must be either a string or nil."
+  (interactive
+   (list (edit-and-eval-command
+         "Comment start (string or nil): " csv-comment-start)))
+  ;; Paragraph means a group of contiguous records:
+  (setq csv-comment-start string)
+  (set (make-local-variable 'paragraph-separate) "[:space:]*$") ; White space.
+  (set (make-local-variable 'paragraph-start) "\n");Must include \n explicitly!
+  (if string
+      (progn
+       (setq paragraph-separate (concat paragraph-separate "\\|" string)
+             paragraph-start (concat paragraph-start "\\|" string))
+        (set (make-local-variable 'comment-start) string)
+       (modify-syntax-entry
+        (string-to-char string) "<" csv-mode-syntax-table)
+       (modify-syntax-entry ?\n ">" csv-mode-syntax-table))
+    (with-syntax-table text-mode-syntax-table
+      (modify-syntax-entry (string-to-char string)
+                          (string (char-syntax (string-to-char string)))
+                          csv-mode-syntax-table)
+      (modify-syntax-entry ?\n
+                          (string (char-syntax ?\n))
+                          csv-mode-syntax-table))))
+
+;;;###autoload
+(add-to-list 'auto-mode-alist '("\\.[Cc][Ss][Vv]\\'" . csv-mode))
+
+(defvar csv-descending nil
+  "If non-nil, CSV mode sort functions sort in order of descending sort key.
+Usually they sort in order of ascending sort key.")
+
+(defun csv-toggle-descending ()
+  "Toggle `csv-descending'."
+  (interactive)
+  (setq csv-descending (not csv-descending))
+  (message "Sort order is %sscending" (if csv-descending "de" "a")))
+
+(defun csv-toggle-invisibility ()
+  "Toggle `buffer-invisibility-spec'."
+  (interactive)
+  (setq buffer-invisibility-spec (not buffer-invisibility-spec))
+  (message "Separators in aligned records will be %svisible \
+\(after re-aligning if soft\)"
+          (if buffer-invisibility-spec "in" ""))
+  (redraw-frame (selected-frame)))
+
+(easy-menu-define
+  csv-menu
+  csv-mode-map
+  "CSV major mode menu keymap"
+  '("CSV"
+    ["Sort By Field Lexicographically" csv-sort-fields :active t
+     :help "Sort lines in region lexicographically by the specified field"]
+    ["Sort By Field Numerically" csv-sort-numeric-fields :active t
+     :help "Sort lines in region numerically by the specified field"]
+    ["Reverse Order of Lines" csv-reverse-region :active t
+     :help "Reverse the order of the lines in the region"]
+    ["Use Descending Sort Order" csv-toggle-descending :active t
+     :style toggle :selected csv-descending
+     :help "If selected, use descending order when sorting"]
+    "--"
+    ["Kill Fields (Columns)" csv-kill-fields :active t
+     :help "Kill specified fields of each line in the region"]
+    ["Yank Fields (Columns)" csv-yank-fields :active t
+     :help "Yank killed fields as specified field of each line in region"]
+    ["Yank As New Table" csv-yank-as-new-table :active t
+     :help "Yank killed fields as a new table at point"]
+    ["Align Fields into Columns" csv-align-fields :active t
+     :help "Align the start of every field of each line in the region"]
+    ["Unalign Columns into Fields" csv-unalign-fields :active t
+     :help "Undo soft alignment and optionally remove redundant white space"]
+    ["Transpose Rows and Columns" csv-transpose :active t
+     :help "Rewrite rows (which may have different lengths) as columns"]
+    "--"
+    ["Forward Field" forward-sexp :active t
+     :help "Move forward across one field\; with ARG, do it that many times"]
+    ["Backward Field" backward-sexp :active t
+     :help "Move backward across one field\; with ARG, do it that many times"]
+    ["Kill Field Forward" kill-sexp :active t
+     :help "Kill field following cursor\; with ARG, do it that many times"]
+    ["Kill Field Backward" backward-kill-sexp :active t
+     :help "Kill field preceding cursor\; with ARG, do it that many times"]
+    "--"
+    ("Alignment Style"
+     ["Left" (setq csv-align-style 'left) :active t
+      :style radio :selected (eq csv-align-style 'left)
+      :help "If selected, `csv-align-fields' left aligns fields"]
+     ["Centre" (setq csv-align-style 'centre) :active t
+      :style radio :selected (eq csv-align-style 'centre)
+      :help "If selected, `csv-align-fields' centres fields"]
+     ["Right" (setq csv-align-style 'right) :active t
+      :style radio :selected (eq csv-align-style 'right)
+      :help "If selected, `csv-align-fields' right aligns fields"]
+     ["Auto" (setq csv-align-style 'auto) :active t
+      :style radio :selected (eq csv-align-style 'auto)
+      :help "\
+If selected, `csv-align-fields' left aligns text and right aligns numbers"]
+     )
+    ["Show Current Field Index" csv-field-index-mode :active t
+     :style toggle :selected csv-field-index-mode
+     :help "If selected, display current field index in mode line"]
+    ["Make Separators Invisible" csv-toggle-invisibility :active t
+     :style toggle :selected buffer-invisibility-spec
+     :help "If selected, separators in aligned records are invisible"]
+    ["Set Buffer's Comment Start" csv-set-comment-start :active t
+     :help "Set comment start string for this buffer"]
+    ["Customize CSV Mode" (customize-group 'CSV) :active t
+     :help "Open a customization buffer to change CSV mode options"]
+    ))
+
+(require 'sort)
+
+(defsubst csv-not-looking-at-record ()
+  "Return t if looking at blank or comment line, nil otherwise.
+Assumes point is at beginning of line."
+  (looking-at paragraph-separate))
+
+(defun csv-interactive-args (&optional type)
+  "Get arg or field(s) and region interactively, offering sensible defaults.
+Signal an error if the buffer is read-only.
+If TYPE is noarg then return a list `(beg end)'.
+Otherwise, return a list `(arg beg end)', where arg is:
+  the raw prefix argument by default\;
+  a single field index if TYPE is single\;
+  a list of field indices or index ranges if TYPE is multiple.
+Field defaults to the current prefix arg\; if not set, prompt user.
+
+A field index list consists of positive or negative integers or ranges,
+separated by any non-integer characters.  A range has the form m-n,
+where m and n are positive or negative integers, m < n, and n defaults
+to the last field index if omitted.
+
+In transient mark mode, if the mark is not active then automatically
+select and highlight CSV records around point, and query user.
+The default field when read interactively is the current field."
+  ;; Must be run interactively to activate mark!
+  (let* ((arg current-prefix-arg) (default-field 1)
+        (region
+         (if (not (use-region-p))
+             ;; Set region automatically:
+             (save-excursion
+                (if arg
+                    (beginning-of-line)
+                  (let ((lbp (line-beginning-position)))
+                    (while (re-search-backward csv-separator-regexp lbp 1)
+                      ;; Move as far as possible, i.e. to beginning of line.
+                      (setq default-field (1+ default-field)))))
+                (if (csv-not-looking-at-record)
+                    (error "Point must be within CSV records"))
+               (let ((startline (point)))
+                 ;; Set mark at beginning of region:
+                 (while (not (or (bobp) (csv-not-looking-at-record)))
+                   (forward-line -1))
+                 (if (csv-not-looking-at-record) (forward-line 1))
+                 ;; Skip header lines:
+                 (forward-line csv-header-lines)
+                 (set-mark (point))    ; OK since in save-excursion
+                 ;; Move point to end of region:
+                 (goto-char startline)
+                 (beginning-of-line)
+                 (while (not (or (eobp) (csv-not-looking-at-record)))
+                   (forward-line 1))
+                 ;; Show mark briefly if necessary:
+                 (unless (and (pos-visible-in-window-p)
+                              (pos-visible-in-window-p (mark)))
+                   (exchange-point-and-mark)
+                   (sit-for 1)
+                   (exchange-point-and-mark))
+                 (or (y-or-n-p "Region OK? ")
+                     (error "Action aborted by user"))
+                 (message nil)         ; clear y-or-n-p message
+                 (list (region-beginning) (region-end))))
+           ;; Use region set by user:
+           (list (region-beginning) (region-end)))))
+    (setq default-field (number-to-string default-field))
+    (cond
+     ((eq type 'multiple)
+      (if arg
+         ;; Ensure that field is a list:
+         (or (consp arg)
+             (setq arg (list (prefix-numeric-value arg))))
+       ;; Read field interactively, ignoring non-integers:
+       (setq arg
+             (mapcar
+              (lambda (x)
+                (if (string-match "-" x 1) ; not first character
+                    ;; Return a range as a pair - the cdr may be nil:
+                    (let ((m (substring x 0 (match-beginning 0)))
+                          (n (substring x (match-end 0))))
+                      (cons (car (read-from-string m))
+                            (and (not (string= n ""))
+                                 (car (read-from-string n)))))
+                  ;; Return a number as a number:
+                  (car (read-from-string x))))
+              (split-string
+               (read-string
+                "Fields (sequence of integers or ranges): " default-field)
+               "[^-+0-9]+")))))
+     ((eq type 'single)
+      (if arg
+         (setq arg (prefix-numeric-value arg))
+       (while (not (integerp arg))
+         (setq arg (eval-minibuffer "Field (integer): " default-field))))))
+    (if (eq type 'noarg) region (cons arg region))))
+\f
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;  Sorting by field
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defun csv-nextrecfun ()
+  "Called by `csv-sort-fields-1' with point at end of previous record.
+It moves point to the start of the next record.
+It should move point to the end of the buffer if there are no more records."
+  (forward-line)
+  (while (and (not (eobp)) (csv-not-looking-at-record))
+    (forward-line)))
+
+(defun csv-sort-fields-1 (field beg end startkeyfun endkeyfun)
+  "Modified version of `sort-fields-1' that skips blank or comment lines.
+
+FIELD is a single field index, and BEG and END specify the region to
+sort.
+
+STARTKEYFUN moves from the start of the record to the start of the key.
+It may return either a non-nil value to be used as the key, or
+else the key is the substring between the values of point after
+STARTKEYFUN and ENDKEYFUN are called.  If STARTKEYFUN is nil, the key
+starts at the beginning of the record.
+
+ENDKEYFUN moves from the start of the sort key to the end of the sort key.
+ENDKEYFUN may be nil if STARTKEYFUN returns a value or if it would be the
+same as ENDRECFUN."
+  (let ((tbl (syntax-table)))
+    (if (zerop field) (setq field 1))
+    (unwind-protect
+       (save-excursion
+         (save-restriction
+           (narrow-to-region beg end)
+           (goto-char (point-min))
+           (set-syntax-table sort-fields-syntax-table)
+           (sort-subr csv-descending
+                      'csv-nextrecfun 'end-of-line
+                      startkeyfun endkeyfun)))
+      (set-syntax-table tbl))))
+
+(defun csv-sort-fields (field beg end)
+  "Sort lines in region lexicographically by the ARGth field of each line.
+If not set, the region defaults to the CSV records around point.
+Fields are separated by `csv-separators' and null fields are allowed anywhere.
+Field indices increase from 1 on the left or decrease from -1 on the right.
+A prefix argument specifies a single field, otherwise prompt for field index.
+Ignore blank and comment lines.  The variable `sort-fold-case'
+determines whether alphabetic case affects the sort order.
+When called non-interactively, FIELD is a single field index\;
+BEG and END specify the region to sort."
+  ;; (interactive "*P\nr")
+  (interactive (csv-interactive-args 'single))
+  (barf-if-buffer-read-only)
+  (csv-sort-fields-1 field beg end
+                    (lambda () (csv-sort-skip-fields field) nil)
+                    (lambda () (skip-chars-forward csv--skip-regexp))))
+
+(defun csv-sort-numeric-fields (field beg end)
+  "Sort lines in region numerically by the ARGth field of each line.
+If not set, the region defaults to the CSV records around point.
+Fields are separated by `csv-separators'.
+Null fields are allowed anywhere and sort as zeros.
+Field indices increase from 1 on the left or decrease from -1 on the right.
+A prefix argument specifies a single field, otherwise prompt for field index.
+Specified non-null field must contain a number in each line of the region,
+which may begin with \"0x\" or \"0\" for hexadecimal and octal values.
+Otherwise, the number is interpreted according to sort-numeric-base.
+Ignore blank and comment lines.
+When called non-interactively, FIELD is a single field index\;
+BEG and END specify the region to sort."
+  ;; (interactive "*P\nr")
+  (interactive (csv-interactive-args 'single))
+  (barf-if-buffer-read-only)
+  (csv-sort-fields-1 field beg end
+                (lambda ()
+                  (csv-sort-skip-fields field)
+                  (let* ((case-fold-search t)
+                         (base
+                          (if (looking-at "\\(0x\\)[0-9a-f]\\|\\(0\\)[0-7]")
+                              (cond ((match-beginning 1)
+                                     (goto-char (match-end 1))
+                                     16)
+                                    ((match-beginning 2)
+                                     (goto-char (match-end 2))
+                                     8)
+                                    (t nil)))))
+                    (string-to-number (buffer-substring (point)
+                                                        (save-excursion
+                                                          (forward-sexp 1)
+                                                          (point)))
+                                      (or base sort-numeric-base))))
+                nil))
+
+(defun csv-reverse-region (beg end)
+  "Reverse the order of the lines in the region.
+This is just a CSV-mode style interface to `reverse-region', which is
+the function that should be used non-interactively.  It takes two
+point or marker arguments, BEG and END, delimiting the region."
+  ;; (interactive "*P\nr")
+  (interactive (csv-interactive-args 'noarg))
+  (barf-if-buffer-read-only)
+  (reverse-region beg end))
+\f
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;  Moving by field
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defsubst csv-end-of-field ()
+  "Skip forward over one field."
+  (skip-chars-forward " ")
+  (if (eq (char-syntax (following-char)) ?\")
+      (goto-char (scan-sexps (point) 1)))
+  (skip-chars-forward csv--skip-regexp))
+
+(defsubst csv-beginning-of-field ()
+  "Skip backward over one field."
+  (skip-syntax-backward " ")
+  (if (eq (char-syntax (preceding-char)) ?\")
+      (goto-char (scan-sexps (point) -1)))
+  (skip-chars-backward csv--skip-regexp))
+
+(defun csv-forward-field (arg)
+  "Move forward across one field, cf. `forward-sexp'.
+With ARG, do it that many times.  Negative arg -N means
+move backward across N fields."
+  (interactive "p")
+  (if (< arg 0)
+      (csv-backward-field (- arg))
+    (while (>= (setq arg (1- arg)) 0)
+      (if (or (bolp)
+             (when (and (not (eobp)) (eolp)) (forward-char) t))
+         (while (and (not (eobp)) (csv-not-looking-at-record))
+           (forward-line 1)))
+      (if (memq (following-char) csv-separator-chars) (forward-char))
+      (csv-end-of-field))))
+
+(defun csv-backward-field (arg)
+  "Move backward across one field, cf. `backward-sexp'.
+With ARG, do it that many times.  Negative arg -N means
+move forward across N fields."
+  (interactive "p")
+  (if (< arg 0)
+      (csv-forward-field (- arg))
+    (while (>= (setq arg (1- arg)) 0)
+      (when (or (eolp)
+               (when (and (not (bobp)) (bolp)) (backward-char) t))
+       (while (progn
+                (beginning-of-line)
+                (csv-not-looking-at-record))
+         (backward-char))
+       (end-of-line))
+      (if (memq (preceding-char) csv-separator-chars) (backward-char))
+      (csv-beginning-of-field))))
+
+(defun csv-sort-skip-fields (n &optional yank)
+  "Position point at the beginning of field N on the current line.
+Fields are separated by `csv-separators'\; null terminal field allowed.
+Assumes point is initially at the beginning of the line.
+YANK non-nil allows N to be greater than the number of fields, in
+which case extend the record as necessary."
+  (if (> n 0)
+      ;; Skip across N - 1 fields.
+      (let ((i (1- n)))
+       (while (> i 0)
+         (csv-end-of-field)
+         (if (eolp)
+             (if yank
+                 (if (> i 1) (insert (car csv-separators)))
+               (error "Line has too few fields: %s"
+                      (buffer-substring
+                       (save-excursion (beginning-of-line) (point))
+                       (save-excursion (end-of-line) (point)))))
+           (forward-char))             ; skip separator
+         (setq i (1- i))))
+    (end-of-line)
+    ;; Skip back across -N - 1 fields.
+    (let ((i (1- (- n))))
+      (while (> i 0)
+       (csv-beginning-of-field)
+       (if (bolp)
+           (error "Line has too few fields: %s"
+                  (buffer-substring
+                   (save-excursion (beginning-of-line) (point))
+                   (save-excursion (end-of-line) (point)))))
+       (backward-char)                 ; skip separator
+       (setq i (1- i)))
+      ;; Position at the front of the field
+      ;; even if moving backwards.
+      (csv-beginning-of-field))))
+\f
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;  Field index mode
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;; Based partly on paren.el
+
+(defcustom csv-field-index-delay 0.125
+  "Time in seconds to delay before updating field index display."
+  :type '(number :tag "seconds"))
+
+(defvar csv-field-index-idle-timer nil)
+
+(defvar csv-field-index-string nil)
+(make-variable-buffer-local 'csv-field-index-string)
+
+(defvar csv-field-index-old nil)
+(make-variable-buffer-local 'csv-field-index-old)
+
+(define-minor-mode csv-field-index-mode
+  "Toggle CSV-Field-Index mode.
+With prefix ARG, turn CSV-Field-Index mode on if and only if ARG is positive.
+Returns the new status of CSV-Field-Index mode (non-nil means on).
+When CSV-Field-Index mode is enabled, the current field index appears in
+the mode line after `csv-field-index-delay' seconds of Emacs idle time."
+  :global t
+  :init-value t                       ; for documentation, since default is t
+  ;; This macro generates a function that first sets the mode
+  ;; variable, then runs the following code, runs the mode hooks,
+  ;; displays a message if interactive, updates the mode line and
+  ;; finally returns the variable value.
+
+  ;; First, always disable the mechanism (to avoid having two timers):
+  (when csv-field-index-idle-timer
+    (cancel-timer csv-field-index-idle-timer)
+    (setq csv-field-index-idle-timer nil))
+  ;; Now, if the mode is on and any buffer is in CSV mode then
+  ;; re-initialize and enable the mechanism by setting up a new timer:
+  (if csv-field-index-mode
+      (if (memq t (mapcar (lambda (buffer)
+                           (with-current-buffer buffer
+                             (when (derived-mode-p 'csv-mode)
+                               (setq csv-field-index-string nil
+                                     csv-field-index-old nil)
+                               t)))
+                         (buffer-list)))
+         (setq csv-field-index-idle-timer
+               (run-with-idle-timer csv-field-index-delay t
+                                    'csv-field-index)))
+    ;; but if the mode is off then remove the display from the mode
+    ;; lines of all CSV buffers:
+    (mapc (lambda (buffer)
+           (with-current-buffer buffer
+             (when (derived-mode-p 'csv-mode)
+               (setq csv-field-index-string nil
+                     csv-field-index-old nil)
+               (force-mode-line-update))))
+           (buffer-list))))
+
+(defun csv-field-index ()
+  "Construct `csv-field-index-string' to display in mode line.
+Called by `csv-field-index-idle-timer'."
+  (if (derived-mode-p 'csv-mode)
+      (save-excursion
+       (let ((lbp (line-beginning-position)) (field 1))
+         (while (re-search-backward csv-separator-regexp lbp 1)
+           ;; Move as far as possible, i.e. to beginning of line.
+           (setq field (1+ field)))
+         (if (csv-not-looking-at-record) (setq field nil))
+         (when (not (eq field csv-field-index-old))
+           (setq csv-field-index-old field
+                 csv-field-index-string
+                 (and field (propertize (format "F%d" field)
+                                        'help-echo csv-mode-line-help-echo)))
+           (force-mode-line-update))))))
+\f
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;  Killing and yanking fields
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defvar csv-killed-fields nil
+  "A list of the fields or sub-records last killed by `csv-kill-fields'.")
+
+(defun csv-kill-fields (fields beg end)
+  "Kill specified fields of each line in the region.
+If not set, the region defaults to the CSV records around point.
+Fields are separated by `csv-separators' and null fields are allowed anywhere.
+Field indices increase from 1 on the left or decrease from -1 on the right.
+The fields are stored for use by `csv-yank-fields'.  Fields can be
+specified in any order but are saved in increasing index order.
+Ignore blank and comment lines.
+
+When called interactively, a prefix argument specifies a single field,
+otherwise prompt for a field list, which may include ranges in the form
+m-n, where m < n and n defaults to the last field index if omitted.
+
+When called non-interactively, FIELDS is a single field index or a
+list of field indices, with ranges specified as (m.n) or (m), and BEG
+and END specify the region to process."
+  ;; (interactive "*P\nr")
+  (interactive (csv-interactive-args 'multiple))
+  (barf-if-buffer-read-only)
+  ;; Kill the field(s):
+  (setq csv-killed-fields nil)
+  (save-excursion
+    (save-restriction
+      (narrow-to-region beg end)
+      (goto-char (point-min))
+      (if (or (cdr fields) (consp (car fields)))
+         (csv-kill-many-columns fields)
+       (csv-kill-one-column (car fields)))))
+  (setq csv-killed-fields (nreverse csv-killed-fields)))
+
+(defun csv-kill-one-field (field)
+  "Kill field with index FIELD in current line.
+Return killed text.  Assumes point is at beginning of line."
+  ;; Move to start of field to kill:
+  (csv-sort-skip-fields field)
+  ;; Kill to end of field (cf. `kill-region'):
+  (prog1 (delete-and-extract-region
+          (point)
+          (progn (csv-end-of-field) (point)))
+    (if (eolp)
+        (unless (bolp) (delete-char -1)) ; Delete trailing separator at eol
+      (delete-char 1))))                 ; or following separator otherwise.
+
+(defun csv-kill-one-column (field)
+  "Kill field with index FIELD in all lines in (narrowed) buffer.
+Save killed fields in `csv-killed-fields'.
+Assumes point is at `point-min'.  Called by `csv-kill-fields'.
+Ignore blank and comment lines."
+  (while (not (eobp))
+    (or (csv-not-looking-at-record)
+       (push (csv-kill-one-field field) csv-killed-fields))
+    (forward-line)))
+
+(defun csv-kill-many-columns (fields)
+  "Kill several fields in all lines in (narrowed) buffer.
+FIELDS is an unordered list of field indices.
+Save killed fields in increasing index order in `csv-killed-fields'.
+Assumes point is at `point-min'.  Called by `csv-kill-fields'.
+Ignore blank and comment lines."
+  (if (eolp) (error "First record is empty"))
+  ;; Convert non-positive to positive field numbers:
+  (let ((last 1) (f fields))
+    (csv-end-of-field)
+    (while (not (eolp))
+      (forward-char)                   ; skip separator
+      (csv-end-of-field)
+      (setq last (1+ last)))        ; last = # fields in first record
+    (while f
+      (cond ((consp (car f))
+            ;; Expand a field range: (m.n) -> m m+1 ... n-1 n.
+            ;; If n is nil then it defaults to the number of fields.
+            (let* ((range (car f)) (cdrf (cdr f))
+                   (m (car range)) (n (cdr range)))
+              (if (< m 0) (setq m (+ m last 1)))
+              (if n
+                  (if (< n 0) (setq n (+ n last 1)))
+                (setq n last))
+              (setq range (list n))
+              (while (> n m) (push (setq n (1- n)) range))
+              (setcar f (car range))
+              (setcdr f (cdr range))
+              (setcdr (setq f (last range)) cdrf)))
+           ((zerop (car f)) (setcar f 1))
+           ((< (car f) 0) (setcar f (+ f last 1))))
+      (setq f (cdr f))))
+  (goto-char (point-min))
+  ;; Kill from right to avoid miscounting:
+  (setq fields (sort fields '>))
+  (while (not (eobp))
+    (or (csv-not-looking-at-record)
+       (let ((fields fields) killed-fields field)
+         (while fields
+           (setq field (car fields)
+                 fields (cdr fields))
+           (beginning-of-line)
+           (push (csv-kill-one-field field) killed-fields))
+         (push (mapconcat 'identity killed-fields (car csv-separators))
+               csv-killed-fields)))
+    (forward-line)))
+
+(defun csv-yank-fields (field beg end)
+  "Yank fields as the ARGth field of each line in the region.
+ARG may be arbitrarily large and records are extended as necessary.
+If not set, the region defaults to the CSV records around point\;
+if point is not in a CSV record then offer to yank as a new table.
+The fields yanked are those last killed by `csv-kill-fields'.
+Fields are separated by `csv-separators' and null fields are allowed anywhere.
+Field indices increase from 1 on the left or decrease from -1 on the right.
+A prefix argument specifies a single field, otherwise prompt for field index.
+Ignore blank and comment lines.  When called non-interactively, FIELD
+is a single field index\; BEG and END specify the region to process."
+  ;; (interactive "*P\nr")
+  (interactive (condition-case err
+                  (csv-interactive-args 'single)
+                (error (list nil nil err))))
+  (barf-if-buffer-read-only)
+  (if (null beg)
+      (if (y-or-n-p (concat (error-message-string end)
+                           ".  Yank as a new table? "))
+         (csv-yank-as-new-table)
+       (error (error-message-string end)))
+    (if (<= field 0) (setq field (1+ field)))
+    (save-excursion
+      (save-restriction
+       (narrow-to-region beg end)
+       (goto-char (point-min))
+       (let ((fields csv-killed-fields))
+         (while (not (eobp))
+           (unless (csv-not-looking-at-record)
+             ;; Yank at start of specified field if possible,
+             ;; otherwise yank at end of record:
+             (if (zerop field)
+                 (end-of-line)
+               (csv-sort-skip-fields field 'yank))
+             (and (eolp) (insert (car csv-separators)))
+             (when fields
+               (insert (car fields))
+               (setq fields (cdr fields)))
+             (or (eolp) (insert (car csv-separators))))
+           (forward-line)))))))
+
+(defun csv-yank-as-new-table ()
+  "Yank fields as a new table starting at point.
+The fields yanked are those last killed by `csv-kill-fields'."
+  (interactive "*")
+  (let ((fields csv-killed-fields))
+    (while fields
+      (insert (car fields) ?\n)
+      (setq fields (cdr fields)))))
+\f
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;  Aligning fields
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defun csv--column-widths ()
+  (let ((widths '()))
+    ;; Construct list of column widths:
+    (while (not (eobp))                   ; for each record...
+      (or (csv-not-looking-at-record)
+          (let ((w widths)
+                (beg (point))            ; Beginning of current field.
+                x)
+            (while (not (eolp))
+              (csv-end-of-field)
+              (setq x (- (point) beg))    ; Field width.
+              (if w
+                  (if (> x (car w)) (setcar w x))
+                (setq w (list x)
+                      widths (nconc widths w)))
+              (or (eolp) (forward-char))  ; Skip separator.
+              (setq w (cdr w)
+                    beg (point)))))
+      (forward-line))
+    widths))
+
+(defun csv-align-fields (hard beg end)
+  "Align all the fields in the region to form columns.
+The alignment style is specified by `csv-align-style'.  The number of
+spaces specified by `csv-align-fields' appears after each separator.
+Use soft alignment done by displaying virtual white space after the
+separators unless invoked with an argument, in which case insert real
+space characters into the buffer after the separators.
+Unalign first (see `csv-unalign-fields').  Ignore blank and comment lines.
+
+In hard-aligned records, separators become invisible whenever
+`buffer-invisibility-spec' is non-nil.  In soft-aligned records, make
+separators invisible if and only if `buffer-invisibility-spec' is
+non-nil when the records are aligned\; this can be changed only by
+re-aligning.  \(Unaligning always makes separators visible.)
+
+When called non-interactively, use hard alignment if HARD is non-nil\;
+BEG and END specify the region to align.
+If there is no selected region, default to the whole buffer."
+  (interactive (cons current-prefix-arg
+                     (if (use-region-p)
+                         (list (region-beginning) (region-end))
+                       (list (point-min) (point-max)))))
+  (setq end (copy-marker end))
+  (csv-unalign-fields hard beg end) ; If hard then barfs if buffer read only.
+  (save-excursion
+    (save-restriction
+      (narrow-to-region beg end)
+      (set-marker end nil)
+      (goto-char (point-min))
+      (let ((widths (csv--column-widths)))
+
+       ;; Align fields:
+       (goto-char (point-min))
+       (while (not (eobp))             ; for each record...
+         (unless (csv-not-looking-at-record)
+            (let ((w widths)
+                  (column 0))    ;Desired position of left-side of this column.
+              (while (and w (not (eolp)))
+                (let* ((beg (point))
+                       (align-padding (if (bolp) 0 csv-align-padding))
+                       (left-padding 0) (right-padding 0)
+                       (field-width
+                        ;; FIXME: Don't assume length=string-width!
+                        (progn (csv-end-of-field) (- (point) beg)))
+                       (column-width (pop w))
+                       (x (- column-width field-width))) ; Required padding.
+                  (set-marker end (point)) ; End of current field.
+                  ;; beg = beginning of current field
+                  ;; end = (point) = end of current field
+
+                  ;; Compute required padding:
+                  (cond
+                   ((eq csv-align-style 'left)
+                    ;; Left align -- pad on the right:
+                    (setq left-padding align-padding
+                          right-padding x))
+                   ((eq csv-align-style 'right)
+                    ;; Right align -- pad on the left:
+                    (setq left-padding (+ align-padding x)))
+                   ((eq csv-align-style 'auto)
+                    ;; Auto align -- left align text, right align numbers:
+                    (if (string-match "\\`[-+.[:digit:]]+\\'"
+                                      (buffer-substring beg (point)))
+                        ;; Right align -- pad on the left:
+                        (setq left-padding (+ align-padding x))
+                      ;; Left align -- pad on the right:
+                      (setq left-padding align-padding
+                            right-padding x)))
+                   ((eq csv-align-style 'centre)
+                    ;; Centre -- pad on both left and right:
+                    (let ((y (/ x 2)))  ; truncated integer quotient
+                      (setq left-padding (+ align-padding y)
+                            right-padding (- x y)))))
+
+                  (cond
+                   (hard ;; Hard alignment...
+                    (when (> left-padding 0) ; Pad on the left.
+                      ;; Insert spaces before field:
+                      (if (= beg end)   ; null field
+                          (insert (make-string left-padding ?\ ))
+                        (goto-char beg) ; beginning of current field
+                        (insert (make-string left-padding ?\ ))
+                        (goto-char end))) ; end of current field
+                    (unless (eolp)
+                      (if (> right-padding 0) ; pad on the right
+                          ;; Insert spaces after field:
+                          (insert (make-string right-padding ?\ )))
+                      ;; Make separator (potentially) invisible;
+                      ;; in Emacs 21.3, neighbouring overlays
+                      ;; conflict, so use the following only
+                      ;; with hard alignment:
+                      (let ((ol (make-overlay (point) (1+ (point)) nil t)))
+                        (overlay-put ol 'invisible t)
+                        (overlay-put ol 'evaporate t))
+                      (forward-char)))  ; skip separator
+
+                   ;; Soft alignment...
+                   (buffer-invisibility-spec ; csv-invisibility-default
+
+                    ;; Hide separators...
+                    ;; Merge right-padding from previous field
+                    ;; with left-padding from this field:
+                    (if (zerop column)
+                        (when (> left-padding 0)
+                          ;; Display spaces before first field
+                          ;; by overlaying first character:
+                          (overlay-put
+                           (make-overlay beg (1+ beg))
+                           'before-string
+                           (make-string left-padding ?\ )))
+                      ;; Display separator as spaces:
+                      (with-silent-modifications
+                        (put-text-property
+                         (1- beg) beg
+                         'display `(space :align-to
+                                          ,(+ left-padding column)))))
+                    (unless (eolp) (forward-char)) ; Skip separator.
+                    (setq column (+ column column-width align-padding)))
+
+                   (t ;; Do not hide separators...
+                    (let ((overlay (make-overlay beg (point) nil nil t)))
+                      (when (> left-padding 0) ; Pad on the left.
+                        ;; Display spaces before field:
+                        (overlay-put overlay 'before-string
+                                     (make-string left-padding ?\ )))
+                      (unless (eolp)
+                        (if (> right-padding 0) ; Pad on the right.
+                            ;; Display spaces after field:
+                            (overlay-put
+                             overlay
+                             'after-string (make-string right-padding ?\ )))
+                        (forward-char)))) ; Skip separator.
+
+                   )))))
+         (forward-line)))))
+  (set-marker end nil))
+
+(defun csv-unalign-fields (hard beg end)
+  "Undo soft alignment and optionally remove redundant white space.
+Undo soft alignment introduced by `csv-align-fields'.  If invoked with
+an argument then also remove all spaces and tabs around separators.
+Also make all invisible separators visible again.
+Ignore blank and comment lines.  When called non-interactively, remove
+spaces and tabs if HARD non-nil\; BEG and END specify region to unalign.
+If there is no selected region, default to the whole buffer."
+  (interactive (cons current-prefix-arg
+                     (if (use-region-p)
+                         (list (region-beginning) (region-end))
+                       (list (point-min) (point-max)))))
+  ;; Remove any soft alignment:
+  (mapc 'delete-overlay        (overlays-in beg end))
+  (with-silent-modifications
+    (remove-list-of-text-properties beg end '(display)))
+  (when hard
+    (barf-if-buffer-read-only)
+    ;; Remove any white-space padding around separators:
+    (save-excursion
+      (save-restriction
+       (narrow-to-region beg end)
+       (goto-char (point-min))
+       (while (not (eobp))
+         (or (csv-not-looking-at-record)
+             (while (not (eolp))
+               ;; Delete horizontal white space forward:
+               ;; (delete-horizontal-space)
+               ;; This relies on left-to-right argument evaluation;
+               ;; see info node (elisp) Function Forms.
+               (delete-region (point)
+                              (+ (point) (skip-chars-forward " \t")))
+               (csv-end-of-field)
+               ;; Delete horizontal white space backward:
+               ;; (delete-horizontal-space t)
+               (delete-region (point)
+                              (+ (point) (skip-chars-backward " \t")))
+               (or (eolp) (forward-char))))
+         (forward-line))))))
+\f
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;  Transposing rows and columns
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defun csv-transpose (beg end)
+  "Rewrite rows (which may have different lengths) as columns.
+Null fields are introduced as necessary within records but are
+stripped from the ends of records.  Preserve soft alignment.
+This function is its own inverse.  Ignore blank and comment lines.
+When called non-interactively, BEG and END specify region to process."
+  ;; (interactive "*P\nr")
+  (interactive (csv-interactive-args 'noarg))
+  (barf-if-buffer-read-only)
+  (save-excursion
+    (save-restriction
+      (narrow-to-region beg end)
+      (goto-char (point-min))
+      ;; Delete rows and collect them as a reversed list of lists of
+      ;; fields, skipping comment and blank lines:
+      (let ((sep (car csv-separators))
+           (align (overlays-in beg end))
+           rows columns)
+       ;; Remove soft alignment if necessary:
+       (when align
+         (mapc 'delete-overlay align)
+         (setq align t))
+       (while (not (eobp))
+         (if (csv-not-looking-at-record)
+             ;; Skip blank and comment lines:
+             (forward-line)
+           (let ((lep (line-end-position)))
+             (push
+              (csv-split-string
+               (buffer-substring-no-properties (point) lep)
+               csv-separator-regexp nil t)
+              rows)
+             (delete-region (point) lep)
+             (or (eobp) (delete-char 1)))))
+       ;; Rows must have monotonic decreasing lengths to be
+       ;; transposable, so ensure this by padding with null fields.
+       ;; rows is currently a reversed list of field lists, which
+       ;; must therefore have monotonic increasing lengths.
+       (let ((oldlen (length (car rows))) newlen
+             (r (cdr rows)))
+         (while r
+           (setq newlen (length (car r)))
+           (if (< newlen oldlen)
+               (nconc (car r) (make-list (- oldlen newlen) nil))
+             (setq oldlen newlen))
+           (setq r (cdr r))))
+       ;; Collect columns as a reversed list of lists of fields:
+       (while rows
+         (let (column (r rows) row)
+           (while r
+             (setq row (car r))
+             ;; Provided it would not be a trailing null field, push
+             ;; field onto column:
+             (if (or column (string< "" (car row)))
+                 (push (car row) column))
+             ;; Pop field off row:
+             (setcar r (cdr row))
+             ;; If row is now empty then remove it:
+             (or (car r) (setq rows (cdr rows)))
+             (setq r (cdr r)))
+           (push column columns)))
+       ;; Insert columns into buffer as rows:
+       (setq columns (nreverse columns))
+       (while columns
+         (insert (mapconcat 'identity (car columns) sep) ?\n)
+         (setq columns (cdr columns)))
+       ;; Re-do soft alignment if necessary:
+       (if align (csv-align-fields nil (point-min) (point-max)))))))
+
+;; The following generalised version of `split-string' is taken from
+;; the development version of WoMan and should probably replace the
+;; standard version in subr.el.  However, CSV mode (currently) needs
+;; only the `allowbeg' option.
+
+(defun csv-split-string
+  (string &optional separators subexp allowbeg allowend)
+  "Splits STRING into substrings where there are matches for SEPARATORS.
+Each match for SEPARATORS is a splitting point.
+The substrings between the splitting points are made into a list
+which is returned.
+If SEPARATORS is absent, it defaults to \"[ \\f\\t\\n\\r\\v]+\".
+SUBEXP specifies a subexpression of SEPARATORS to be the splitting
+point\; it defaults to 0.
+
+If there is a match for SEPARATORS at the beginning of STRING, we do
+not include a null substring for that, unless ALLOWBEG is non-nil.
+Likewise, if there is a match at the end of STRING, we do not include
+a null substring for that, unless ALLOWEND is non-nil.
+
+Modifies the match data; use `save-match-data' if necessary."
+  (or subexp (setq subexp 0))
+  (let ((rexp (or separators "[ \f\t\n\r\v]+"))
+       (start 0)
+       notfirst
+       (list nil))
+    (while (and (string-match rexp string
+                             (if (and notfirst
+                                      (= start (match-beginning subexp))
+                                      (< start (length string)))
+                                 (1+ start) start))
+               (< (match-beginning subexp) (length string)))
+      (setq notfirst t)
+      (or (and (not allowbeg) (eq (match-beginning subexp) 0))
+         (and (eq (match-beginning subexp) (match-end subexp))
+              (eq (match-beginning subexp) start))
+         (push (substring string start (match-beginning subexp)) list))
+      (setq start (match-end subexp)))
+    (or (and (not allowend) (eq start (length string)))
+       (push (substring string start) list))
+    (nreverse list)))
+
+(provide 'csv-mode)
+
+;;; csv-mode.el ends here
diff --git a/packages/debbugs/Debbugs.wsdl b/packages/debbugs/Debbugs.wsdl
new file mode 100644 (file)
index 0000000..ad5e954
--- /dev/null
@@ -0,0 +1,340 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- Copyright (C) 2011-2013  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 <http://www.gnu.org/licenses/>. -->
+
+<!-- This file describes the bindings of the debbugs SOAP interface
+(see <http://wiki.debian.org/DebbugsSoapInterface>).  The operation
+"get_versions" is not contained (yet). -->
+
+<wsdl:definitions
+    name="Debbugs/SOAP"
+    targetNamespace="urn:Debbugs/SOAP"
+    xmlns:tns="urn:Debbugs/SOAP"
+    xmlns:types="urn:Debbugs/SOAP/TYPES"
+    xmlns:apachens="http://xml.apache.org/xml-soap"
+    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
+    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
+    xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
+    xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
+    soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
+
+  <wsdl:types>
+    <schema targetNamespace="urn:Debbugs/SOAP/TYPES"
+           xmlns="http://www.w3.org/2001/XMLSchema">
+      <import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
+
+      <complexType name="ArrayOfBugNumber">
+        <complexContent>
+          <restriction base="soapenc:Array">
+            <attribute ref="soapenc:arrayType" wsdl:arrayType="xsd:int[]"/>
+          </restriction>
+        </complexContent>
+       </complexType>
+
+      <complexType name="ArrayOfAnyType">
+        <complexContent>
+          <restriction base="soapenc:Array">
+            <attribute ref="soapenc:arrayType" wsdl:arrayType="xsd:anyType[]"/>
+          </restriction>
+        </complexContent>
+       </complexType>
+
+      <complexType name="ArrayOfArrayOfAnyType">
+        <complexContent>
+          <restriction base="soapenc:Array">
+            <attribute ref="soapenc:arrayType"
+                      wsdl:arrayType="types:ArrayOfAnyType[]"/>
+          </restriction>
+        </complexContent>
+       </complexType>
+
+      <complexType name="ArrayOfArrayOfArrayOfAnyType">
+        <complexContent>
+          <restriction base="soapenc:Array">
+            <attribute ref="soapenc:arrayType"
+                      wsdl:arrayType="types:ArrayOfArrayOfAnyType[]"/>
+          </restriction>
+        </complexContent>
+       </complexType>
+    </schema>
+
+    <schema targetNamespace="http://xml.apache.org/xml-soap"
+           xmlns="http://www.w3.org/2001/XMLSchema">
+      <import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
+
+      <complexType name="mapItem">
+        <sequence>
+          <element name="key" nillable="true" type="xsd:int"/>
+          <element name="value" nillable="true" type="xsd:anyType"/>
+        </sequence>
+      </complexType>
+
+      <complexType name="Map">
+        <sequence>
+          <element maxOccurs="unbounded" minOccurs="0"
+                  name="item" type="apachens:mapItem"/>
+        </sequence>
+      </complexType>
+    </schema>
+  </wsdl:types>
+
+  <wsdl:message name="get_statusRequest">
+    <wsdl:part name="bugs" type="types:ArrayOfBugNumber"/>
+  </wsdl:message>
+  <wsdl:message name="get_statusResponse">
+    <wsdl:part name="s-gensym3" type="apachens:Map"/>
+  </wsdl:message>
+
+  <wsdl:message name="get_bug_logRequest">
+    <wsdl:part name="bugnumber" type="xsd:int"/>
+  </wsdl:message>
+  <wsdl:message name="get_bug_logResponse">
+    <wsdl:part name="soapenc:Array" type="types:ArrayOfAnyType"/>
+  </wsdl:message>
+
+  <wsdl:message name="get_bugsRequest">
+    <wsdl:part name="query" type="types:ArrayOfAnyType"/>
+  </wsdl:message>
+  <wsdl:message name="get_bugsResponse">
+    <wsdl:part name="soapenc:Array" type="types:ArrayOfBugNumber"/>
+  </wsdl:message>
+
+  <wsdl:message name="get_usertagRequest">
+    <wsdl:part name="user" type="xsd:string"/>
+    <!-- We do not support tags -->
+  </wsdl:message>
+  <wsdl:message name="get_usertagResponse">
+    <wsdl:part name="s-gensym3" type="xsd:anyType"/>
+  </wsdl:message>
+
+  <wsdl:message name="newest_bugsRequest">
+    <wsdl:part name="amount" type="xsd:int"/>
+  </wsdl:message>
+  <wsdl:message name="newest_bugsResponse">
+    <wsdl:part name="soapenc:Array" type="types:ArrayOfBugNumber"/>
+  </wsdl:message>
+
+  <wsdl:message name="search_estRequest">
+    <wsdl:part name="query" type="types:ArrayOfArrayOfAnyType"/>
+  </wsdl:message>
+  <wsdl:message name="search_estResponse">
+    <wsdl:part name="soapenc:Array" type="types:ArrayOfArrayOfArrayOfAnyType"/>
+  </wsdl:message>
+
+  <wsdl:portType name="Debbugs/SOAP">
+    <wsdl:operation name="get_status" parameterOrder="bugs">
+      <wsdl:input message="tns:get_statusRequest">
+        <soap:body
+           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
+           namespace="urn:Debbugs/SOAP"
+           use="encoded"/>
+      </wsdl:input>
+      <wsdl:output message="tns:get_statusResponse">
+        <soap:body
+           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
+           namespace="urn:Debbugs/SOAP"
+           use="encoded"/>
+      </wsdl:output>
+    </wsdl:operation>
+
+    <wsdl:operation name="get_bug_log" parameterOrder="bugnumber">
+      <wsdl:input message="tns:get_bug_logRequest">
+        <soap:body
+           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
+           namespace="urn:Debbugs/SOAP"
+           use="encoded"/>
+      </wsdl:input>
+      <wsdl:output message="tns:get_bug_logResponse">
+        <soap:body
+           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
+           namespace="urn:Debbugs/SOAP"
+           use="encoded"/>
+      </wsdl:output>
+    </wsdl:operation>
+
+    <wsdl:operation name="get_bugs" parameterOrder="query">
+      <wsdl:input message="tns:get_bugsRequest">
+        <soap:body
+           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
+           namespace="urn:Debbugs/SOAP"
+           use="encoded"/>
+      </wsdl:input>
+      <wsdl:output message="tns:get_bugsResponse">
+        <soap:body
+           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
+           namespace="urn:Debbugs/SOAP"
+           use="encoded"/>
+      </wsdl:output>
+    </wsdl:operation>
+
+    <wsdl:operation name="get_usertag" parameterOrder="user">
+      <wsdl:input message="tns:get_usertagRequest">
+        <soap:body
+           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
+           namespace="urn:Debbugs/SOAP"
+           use="encoded"/>
+      </wsdl:input>
+      <wsdl:output message="tns:get_usertagResponse">
+        <soap:body
+           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
+           namespace="urn:Debbugs/SOAP"
+           use="encoded"/>
+      </wsdl:output>
+    </wsdl:operation>
+
+    <wsdl:operation name="newest_bugs" parameterOrder="amount">
+      <wsdl:input message="tns:newest_bugsRequest">
+        <soap:body
+           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
+           namespace="urn:Debbugs/SOAP"
+           use="encoded"/>
+      </wsdl:input>
+      <wsdl:output message="tns:newest_bugsResponse">
+        <soap:body
+           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
+           namespace="urn:Debbugs/SOAP"
+           use="encoded"/>
+      </wsdl:output>
+    </wsdl:operation>
+
+    <wsdl:operation name="search_est" parameterOrder="query">
+      <wsdl:input message="tns:search_estRequest">
+        <soap:body
+           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
+           namespace="urn:Debbugs/SOAP"
+           use="encoded"/>
+      </wsdl:input>
+      <wsdl:output message="tns:search_estResponse">
+        <soap:body
+           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
+           namespace="urn:Debbugs/SOAP"
+           use="encoded"/>
+      </wsdl:output>
+    </wsdl:operation>
+  </wsdl:portType>
+
+  <wsdl:binding name="Debbugs/SOAP/BINDING" type="tns:Debbugs/SOAP">
+    <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
+    <wsdl:operation name="get_status">
+      <wsdlsoap:operation soapAction="Debbugs/SOAP"/>
+      <wsdl:input name="get_statusRequest">
+        <wsdlsoap:body
+           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
+           namespace="urn:Debbugs/SOAP"
+           use="encoded"/>
+      </wsdl:input>
+      <wsdl:output name="get_statusResponse">
+        <wsdlsoap:body
+           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
+           namespace="urn:Debbugs/SOAP"
+           use="encoded"/>
+      </wsdl:output>
+    </wsdl:operation>
+
+    <wsdl:operation name="get_bug_log">
+      <wsdlsoap:operation soapAction="Debbugs/SOAP"/>
+      <wsdl:input name="get_bug_logRequest">
+        <wsdlsoap:body
+           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
+           namespace="urn:Debbugs/SOAP"
+           use="encoded"/>
+      </wsdl:input>
+      <wsdl:output name="get_bug_logResponse">
+        <wsdlsoap:body
+           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
+           namespace="urn:Debbugs/SOAP"
+           use="encoded"/>
+      </wsdl:output>
+    </wsdl:operation>
+
+    <wsdl:operation name="get_bugs">
+      <wsdlsoap:operation soapAction="Debbugs/SOAP"/>
+      <wsdl:input name="get_bugsRequest">
+        <wsdlsoap:body
+           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
+           namespace="urn:Debbugs/SOAP"
+           use="encoded"/>
+      </wsdl:input>
+      <wsdl:output name="get_bugsResponse">
+        <wsdlsoap:body
+           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
+           namespace="urn:Debbugs/SOAP"
+           use="encoded"/>
+      </wsdl:output>
+    </wsdl:operation>
+
+    <wsdl:operation name="get_usertag">
+      <wsdlsoap:operation soapAction="Debbugs/SOAP"/>
+      <wsdl:input name="get_tagRequest">
+        <wsdlsoap:body
+           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
+           namespace="urn:Debbugs/SOAP"
+           use="encoded"/>
+      </wsdl:input>
+      <wsdl:output name="get_tagResponse">
+        <wsdlsoap:body
+           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
+           namespace="urn:Debbugs/SOAP"
+           use="encoded"/>
+      </wsdl:output>
+    </wsdl:operation>
+
+    <wsdl:operation name="newest_bugs">
+      <wsdlsoap:operation soapAction="Debbugs/SOAP"/>
+      <wsdl:input name="newest_bugsRequest">
+        <wsdlsoap:body
+           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
+           namespace="urn:Debbugs/SOAP"
+           use="encoded"/>
+      </wsdl:input>
+      <wsdl:output name="newest_bugsResponse">
+        <wsdlsoap:body
+           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
+           namespace="urn:Debbugs/SOAP"
+           use="encoded"/>
+      </wsdl:output>
+    </wsdl:operation>
+
+    <wsdl:operation name="search_est">
+      <wsdlsoap:operation soapAction="Debbugs/SOAP"/>
+      <wsdl:input name="search_estRequest">
+        <wsdlsoap:body
+           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
+           namespace="urn:Debbugs/SOAP"
+           use="encoded"/>
+      </wsdl:input>
+      <wsdl:output name="search_estResponse">
+        <wsdlsoap:body
+           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
+           namespace="urn:Debbugs/SOAP"
+           use="encoded"/>
+      </wsdl:output>
+    </wsdl:operation>
+  </wsdl:binding>
+
+  <wsdl:service name="Debbugs/SOAP/SERVICE">
+    <wsdl:port binding="tns:Debbugs/SOAP/BINDING" name="gnu.org">
+      <wsdlsoap:address location="http://debbugs.gnu.org/cgi/soap.cgi"/>
+    </wsdl:port>
+    <wsdl:port binding="tns:Debbugs/SOAP/BINDING" name="debian.org">
+      <wsdlsoap:address location="http://bugs.debian.org/cgi-bin/soap.cgi"/>
+    </wsdl:port>
+  </wsdl:service>
+</wsdl:definitions>
diff --git a/packages/debbugs/README b/packages/debbugs/README
new file mode 100644 (file)
index 0000000..004d790
--- /dev/null
@@ -0,0 +1,14 @@
+This package lets you access the GNU Bug Tracker from within Emacs.
+
+It defines the command `M-x debbugs-gnu' for listing bugs, and the
+command `M-x debbugs-gnu-search' for bug searching.  The command
+`debbugs-gnu-usertags' shows existing user tags on bugs.
+
+This package works by implementing basic functions to access a Debbugs
+SOAP server (see <http://wiki.debian.org/DebbugsSoapInterface>).  It
+implements the SOAP functions "get_bugs", "newest_bugs", "get_status",
+"get_usertag", "get_bug_log" and "search_est".  The SOAP function
+"get_versions" is not implemented (yet).
+
+You can connect to other debbugs servers by customizing the variable
+`debbugs-port'.
diff --git a/packages/debbugs/debbugs-gnu.el b/packages/debbugs/debbugs-gnu.el
new file mode 100644 (file)
index 0000000..fb80337
--- /dev/null
@@ -0,0 +1,1255 @@
+;;; debbugs-gnu.el --- interface for the GNU bug tracker
+
+;; Copyright (C) 2011-2013 Free Software Foundation, Inc.
+
+;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
+;; Keywords: comm, hypermedia, maint
+;; Package: debbugs
+;; Version: 0.4
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This package provides an interface to bug reports which are located
+;; on the GNU bug tracker debbugs.gnu.org.  Its main purpose is to
+;; show and manipulate bug reports from Emacs, but it could be used
+;; also for other GNU projects which use the same bug tracker.
+
+;; If you have `debbugs-gnu.el' in your load-path, you could enable
+;; the bug tracker commands by the following lines in your ~/.emacs
+;;
+;;   (autoload 'debbugs-gnu "debbugs-gnu" "" 'interactive)
+;;   (autoload 'debbugs-gnu-search "debbugs-gnu" "" 'interactive)
+;;   (autoload 'debbugs-gnu-usertags "debbugs-gnu" "" 'interactive)
+;;   (autoload 'debbugs-gnu-bugs "debbugs-gnu" "" 'interactive)
+
+;; The bug tracker is called interactively by
+;;
+;;   M-x debbugs-gnu
+
+;; It asks for the severities, for which bugs shall be shown. This can
+;; be either just one severity, or a list of severities, separated by
+;; comma.  Valid severities are "serious", "important", "normal",
+;; "minor" or "wishlist".  Severities "critical" and "grave" are not
+;; used, although configured on the GNU bug tracker.  If no severity
+;; is given, all bugs are selected.
+
+;; There is also the pseudo severity "tagged".  When it is used, the
+;; function will ask for user tags (a comma separated list), and shows
+;; just the bugs which are tagged with them.  In general, user tags
+;; shall be strings denoting to subprojects of the package, like
+;; "cedet" or "tramp" of the package "emacs.  If no user tag is given,
+;; locally tagged bugs are shown.
+
+;; If a prefix is given to the command, more search parameters are
+;; asked for, like packages (also a comma separated list, "emacs" is
+;; the default), whether archived bugs shall be shown, and whether
+;; closed bugs shall be shown.
+
+;; Another command is
+;;
+;;   M-x debbugs-gnu-search
+
+;; It behaves like `debbugs-gnu', but asks at the beginning for a
+;; search phrase to be used for full text search.  Additionally, it
+;; asks for key-value pairs to filter bugs.  Keys are as described in
+;; `debbugs-get-status', the corresponding value must be a regular
+;; expression to match for.  The other parameters are as described in
+;; `debbugs-gnu'.  Usually, there is just one value except for the
+;; attribute "date", which needs two arguments specifying a period in
+;; which the bug has been submitted or modified.
+
+;; The bug reports are downloaded from the bug tracker.  In order to
+;; not generate too much load of the server, up to 500 bugs will be
+;; downloaded at once.  If there are more hits, you will be asked to
+;; change this limit, but please don't increase this number too much.
+
+;; These default values could be changed also by customer options
+;; `debbugs-gnu-default-severities', `debbugs-gnu-default-packages',
+;; `debbugs-gnu-default-hits-per-page' and `debbugs-gnu-default-suppress-bugs'.
+
+;; The commands create one or more pages of bug lists.  Every bug is
+;; shown in one line, including the bug number, the status (combining
+;; merged bug numbers, keywords and severities), the name of the
+;; submitter, and the title of the bug.  On every bug line you could
+;; apply the following actions by the following keystrokes:
+
+;;   RET: Show corresponding messages in Gnus
+;;   "C": Send a control message
+;;   "t": Mark the bug locally as tagged
+;;   "d": Show bug attributes
+
+;; Furthermore, you could apply the global actions
+
+;;   "g": Rescan bugs
+;;   "q": Quit the buffer
+;;   "s": Toggle bug sorting for age or for state
+;;   "x": Toggle suppressing of bugs
+;;   "/": Display only bugs matching a string
+;;   "w": Display all the currently selected bug reports
+
+;; When you visit the related bug messages in Gnus, you could also
+;; send control messages by keystroke "C".
+
+;; In the header line of every bug list page, you can toggle sorting
+;; per column by selecting a column with the mouse.  The sorting
+;; happens as expected for the respective column; sorting in the Title
+;; column is depending on whether you are the owner of a bug.
+
+;; Another approach for listing bugs is calling the command
+;;
+;;   M-x debbugs-gnu-usertags
+
+;; This command shows you all existing user tags for the packages
+;; defined in `debbugs-gnu-default-packages'.  A prefix for the
+;; command allows you to use other packe names, or an arbitrary string
+;; for a user who has tagged bugs.  The command returns the list of
+;; existing user tags for the given user(s) or package name(s),
+;; respectively.  Applying RET on a user tag, all bugs tagged with
+;; this user tag are shown.
+
+;; Unfortunately, it is not possible with the SOAP interface to show
+;; all users who have tagged bugs.  This list can be retrieved via
+;; <http://debbugs.gnu.org/cgi/pkgindex.cgi?indexon=users>.
+
+;; Finally, if you simply want to list some bugs with known bug
+;; numbers, call the command
+;;
+;;   M-x debbugs-gnu-bugs
+
+;; The bug numbers to be shown shall be entered as comma separated list.
+
+;;; Code:
+
+(require 'debbugs)
+(require 'widget)
+(require 'wid-edit)
+(require 'tabulated-list)
+(eval-when-compile (require 'cl))
+
+(autoload 'gnus-read-ephemeral-emacs-bug-group "gnus-group")
+(autoload 'mail-header-subject "nnheader")
+(autoload 'gnus-summary-article-header "gnus-sum")
+(autoload 'message-make-from "message")
+
+(defgroup debbugs-gnu ()
+  "UI for the debbugs.gnu.org bug tracker."
+  :group 'debbugs
+  :version "24.1")
+
+(defcustom debbugs-gnu-default-severities '("serious" "important" "normal")
+  "*The list severities bugs are searched for.
+\"tagged\" is not a severity but marks locally tagged bugs."
+  ;; <http://debbugs.gnu.org/Developer.html#severities>
+  :group 'debbugs-gnu
+  :type '(set (const "serious")
+             (const "important")
+             (const "normal")
+             (const "minor")
+             (const "wishlist")
+             (const "tagged"))
+  :version "24.1")
+
+(defconst debbugs-gnu-all-severities
+  (mapcar 'cadr (cdr (get 'debbugs-gnu-default-severities 'custom-type)))
+  "*List of all possible severities.")
+
+(defcustom debbugs-gnu-default-packages '("emacs")
+  "*The list of packages to be searched for."
+  ;; <http://debbugs.gnu.org/Packages.html>
+  ;; <http://debbugs.gnu.org/cgi/pkgindex.cgi>
+  :group 'debbugs-gnu
+  :type '(set (const "automake")
+             (const "cc-mode")
+             (const "coreutils")
+             (const "debbugs.gnu.org")
+             (const "emacs")
+             (const "emacs-xwidgets")
+             (const "fm")
+             (const "gnus")
+             (const "guile")
+             (const "libtool")
+             (const "ns")
+             (const "org-mode")
+             (const "w32")
+             (const "woodchuck"))
+  :version "24.3")
+
+(defconst debbugs-gnu-all-packages
+  (mapcar 'cadr (cdr (get 'debbugs-gnu-default-packages 'custom-type)))
+  "*List of all possible package names.")
+
+(defcustom debbugs-gnu-default-hits-per-page 500
+  "*The number of bugs shown per page."
+  :group 'debbugs-gnu
+  :type 'integer
+  :version "24.1")
+
+(defcustom debbugs-gnu-default-suppress-bugs
+  '((pending . "done"))
+  "*A list of specs for bugs to be suppressed.
+An element of this list is a cons cell \(KEY . REGEXP\), with key
+being returned by `debbugs-get-status', and VAL a regular
+expression matching the corresponding value, a string.  Showing
+suppressed bugs is toggled by `debbugs-gnu-toggle-suppress'."
+  :group 'debbugs-gnu
+  :type '(alist :key-type symbol :value-type regexp)
+  :version "24.1")
+
+(defface debbugs-gnu-new '((t (:foreground "red")))
+  "Face for new reports that nobody has answered.")
+
+(defface debbugs-gnu-handled '((t (:foreground "ForestGreen")))
+  "Face for reports that have been modified recently.")
+
+(defface debbugs-gnu-pending '((t (:foreground "MidnightBlue")))
+  "Face for reports that are pending.")
+
+(defface debbugs-gnu-stale '((t (:foreground "orange")))
+  "Face for reports that have not been touched for a week.")
+
+(defface debbugs-gnu-done '((t (:foreground "DarkGrey")))
+  "Face for closed bug reports.")
+
+(defface debbugs-gnu-tagged '((t (:foreground "red")))
+  "Face for reports that have been tagged locally.")
+
+(defvar debbugs-gnu-widgets nil)
+
+(defvar debbugs-gnu-widget-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map "\r" 'widget-button-press)
+    (define-key map [mouse-2] 'widget-button-press)
+    map))
+
+(defvar debbugs-gnu-local-tags nil
+  "List of bug numbers tagged locally, and kept persistent.")
+
+(defvar debbugs-gnu-persistency-file
+  (expand-file-name (locate-user-emacs-file "debbugs"))
+  "File name of a persistency store for debbugs variables")
+
+(defun debbugs-gnu-dump-persistency-file ()
+  "Function to store debbugs variables persistently."
+  (with-temp-file debbugs-gnu-persistency-file
+    (insert
+     ";; -*- emacs-lisp -*-\n"
+     ";; Debbugs tags connection history.  Don't change this file.\n\n"
+     (format "(setq debbugs-gnu-local-tags '%S)"
+            (sort (copy-sequence debbugs-gnu-local-tags) '<)))))
+
+(defvar debbugs-gnu-current-query nil
+  "The query object of the current search.
+It will be applied server-side, when calling `debbugs-get-bugs'.
+It has the same format as `debbugs-gnu-default-suppress-bugs'.")
+
+(defvar debbugs-gnu-current-filter nil
+  "The filter object for the current search.
+It will be applied client-side, when parsing the results of
+`debbugs-get-status'.  It has a similar format as
+`debbugs-gnu-default-suppress-bugs'.  In case of keys representing
+a date, value is the cons cell \(BEFORE . AFTER\).")
+
+(defun debbugs-gnu-calendar-read (prompt acceptable &optional initial-contents)
+  "Return a string read from the minibuffer.
+Derived from `calendar-read'."
+  (let ((value (read-string prompt initial-contents)))
+    (while (not (funcall acceptable value))
+      (setq value (read-string prompt initial-contents)))
+    value))
+
+(defconst debbugs-gnu-phrase-prompt
+  (propertize
+   "Enter search phrase: "
+   'help-echo "\
+The search phrase contains words to be searched for, combined by
+operators like AND, ANDNOT and OR.  If there is no operator
+between the words, AND is used by default.  The phrase can also
+be empty, in this case only the following attributes are used for
+search."))
+
+;;;###autoload
+(defun debbugs-gnu-search ()
+  "Search for Emacs bugs interactively.
+Search arguments are requested interactively.  The \"search
+phrase\" is used for full text search in the bugs database.
+Further key-value pairs are requested until an empty key is
+returned.  If a key cannot be queried by a SOAP request, it is
+marked as \"client-side filter\"."
+  (interactive)
+
+  (unwind-protect
+      (let ((date-format "\\([[:digit:]]\\{4\\}\\)-\\([[:digit:]]\\{1,2\\}\\)-\\([[:digit:]]\\{1,2\\}\\)")
+           key val1 val2 phrase severities packages archivedp)
+
+       ;; Check for the phrase.
+       (setq phrase (read-string debbugs-gnu-phrase-prompt))
+       (if (zerop (length phrase))
+           (setq phrase nil)
+         (add-to-list 'debbugs-gnu-current-query (cons 'phrase phrase)))
+
+       ;; The other queries.
+       (catch :finished
+         (while t
+           (setq key (completing-read
+                      "Enter attribute: "
+                      (if phrase
+                          '("severity" "package" "tags" "submitter" "date"
+                            "subject" "status")
+                        '("severity" "package" "archive" "src" "tag"
+                          "owner" "submitter" "maint" "correspondent"
+                          "date" "log_modified" "last_modified"
+                          "found_date" "fixed_date" "unarchived"
+                          "subject" "done" "forwarded" "msgid" "summary"))
+                      nil t))
+           (cond
+            ;; Server-side queries.
+            ((equal key "severity")
+             (setq
+              severities
+              (completing-read-multiple
+               "Enter severities: " debbugs-gnu-all-severities nil t
+               (mapconcat 'identity debbugs-gnu-default-severities ","))))
+
+            ((equal key "package")
+             (setq
+              packages
+              (completing-read-multiple
+               "Enter packages: " debbugs-gnu-all-packages nil t
+               (mapconcat 'identity debbugs-gnu-default-packages ","))))
+
+            ((equal key "archive")
+             ;; We simplify, by assuming just archived bugs are requested.
+             (setq archivedp t))
+
+            ((member key '("src" "tag" "tags"))
+             (setq val1 (read-string (format "Enter %s: " key)))
+             (when (not (zerop (length val1)))
+               (add-to-list
+                'debbugs-gnu-current-query (cons (intern key) val1))))
+
+            ((member key '("owner" "submitter" "maint" "correspondent"))
+             (setq val1 (read-string "Enter email address: "))
+             (when (not (zerop (length val1)))
+               (add-to-list
+                'debbugs-gnu-current-query (cons (intern key) val1))))
+
+            ((equal key "status")
+             (setq
+              val1
+              (completing-read "Enter status: " '("done" "forwarded" "open")))
+             (when (not (zerop (length val1)))
+           (add-to-list
+            'debbugs-gnu-current-query (cons (intern key) val1))))
+
+            ;; Client-side filters.
+            ((member key '("date" "log_modified" "last_modified"
+                           "found_date" "fixed_date" "unarchived"))
+             (setq val1
+                   (debbugs-gnu-calendar-read
+                    (format "Enter %s before YYYY-MM-DD%s: "
+                            key (if phrase "" " (client-side filter)"))
+                    (lambda (x)
+                      (string-match (concat "^\\(" date-format "\\|\\)$") x))))
+             (if (string-match date-format val1)
+                 (setq val1 (floor
+                             (float-time
+                              (encode-time
+                               0 0 0
+                               (string-to-number (match-string 3 val1))
+                               (string-to-number (match-string 2 val1))
+                               (string-to-number (match-string 1 val1))))))
+               (setq val1 nil))
+             (setq val2
+                   (debbugs-gnu-calendar-read
+                    (format "Enter %s after YYYY-MM-DD%s: "
+                            key (if phrase "" " (client-side filter)"))
+                    (lambda (x)
+                      (string-match (concat "^\\(" date-format "\\|\\)$") x))))
+             (if (string-match date-format val2)
+                 (setq val2 (floor
+                             (float-time
+                              (encode-time
+                               0 0 0
+                               (string-to-number (match-string 3 val2))
+                               (string-to-number (match-string 2 val2))
+                               (string-to-number (match-string 1 val2))))))
+               (setq val2 nil))
+             (when (or val1 val2)
+               (add-to-list
+                (if phrase
+                    'debbugs-gnu-current-query 'debbugs-gnu-current-filter)
+                (cons (intern key) (cons val1 val2)))))
+
+            ((not (zerop (length key)))
+             (setq val1
+                   (funcall
+                    (if phrase 'read-string 'read-regexp)
+                    (format "Enter %s%s"
+                            key (if phrase ": " " (client-side filter)"))))
+             (when (not (zerop (length val1)))
+               (add-to-list
+                (if phrase
+                    'debbugs-gnu-current-query 'debbugs-gnu-current-filter)
+                (cons (intern key) val1))))
+
+            ;; The End.
+            (t (throw :finished nil)))))
+
+       ;; Do the search.
+       (debbugs-gnu severities packages archivedp))
+
+    ;; Reset query and filter.
+    (setq debbugs-gnu-current-query nil
+         debbugs-gnu-current-filter nil)))
+
+;;;###autoload
+(defun debbugs-gnu (severities &optional packages archivedp suppress tags)
+  "List all outstanding Emacs bugs."
+  (interactive
+   (let (severities archivedp)
+     (list
+      (setq severities
+           (completing-read-multiple
+            "Severities: " debbugs-gnu-all-severities nil t
+            (mapconcat 'identity debbugs-gnu-default-severities ",")))
+      ;; The next parameters are asked only when there is a prefix.
+      (if current-prefix-arg
+         (completing-read-multiple
+          "Packages: " debbugs-gnu-all-packages nil t
+          (mapconcat 'identity debbugs-gnu-default-packages ","))
+       debbugs-gnu-default-packages)
+      (when current-prefix-arg
+       (setq archivedp (y-or-n-p "Show archived bugs?")))
+      (when (and current-prefix-arg (not archivedp))
+       (y-or-n-p "Suppress unwanted bugs?"))
+      ;; This one must be asked for severity "tagged".
+      (when (member "tagged" severities)
+       (split-string (read-string "User tag(s): ") "," t)))))
+
+  ;; Initialize variables.
+  (when (and (file-exists-p debbugs-gnu-persistency-file)
+            (not debbugs-gnu-local-tags))
+    (with-temp-buffer
+      (insert-file-contents debbugs-gnu-persistency-file)
+      (eval (read (current-buffer)))))
+  (setq debbugs-gnu-widgets nil)
+
+  ;; Add queries.
+  (dolist (severity (if (consp severities) severities (list severities)))
+    (when (not (zerop (length severity)))
+      (add-to-list 'debbugs-gnu-current-query (cons 'severity severity))))
+  (dolist (package (if (consp packages) packages (list packages)))
+    (when (not (zerop (length package)))
+      (add-to-list 'debbugs-gnu-current-query (cons 'package package))))
+  (when archivedp
+    (add-to-list 'debbugs-gnu-current-query '(archive . "1")))
+  (dolist (tag (if (consp tags) tags (list tags)))
+    (when (not (zerop (length tag)))
+      (add-to-list 'debbugs-gnu-current-query (cons 'tag tag))))
+
+  (unwind-protect
+      (let ((hits debbugs-gnu-default-hits-per-page)
+           (ids (debbugs-gnu-get-bugs debbugs-gnu-current-query)))
+
+       (if (> (length ids) hits)
+           (let ((cursor-in-echo-area nil))
+             (setq hits
+                   (string-to-number
+                    (read-string
+                     (format
+                      "How many reports (available %d, default %d): "
+                      (length ids) hits)
+                     nil
+                     nil
+                     (number-to-string hits))))))
+
+       (if (> (length ids) hits)
+           (let ((i 0)
+                 curr-ids)
+             (while ids
+               (setq i (1+ i)
+                     curr-ids (butlast ids (- (length ids) hits)))
+               (add-to-list
+                'debbugs-gnu-widgets
+                (widget-convert
+                 'push-button
+                 :follow-link 'mouse-face
+                 :notify (lambda (widget &rest ignore)
+                           (debbugs-gnu-show-reports widget))
+                 :keymap debbugs-gnu-widget-map
+                 :suppress suppress
+                 :buffer-name (format "*Emacs Bugs*<%d>" i)
+                 :bug-ids curr-ids
+                 :query debbugs-gnu-current-query
+                 :filter debbugs-gnu-current-filter
+                 :help-echo (format "%d-%d" (car ids) (car (last curr-ids)))
+                 :format " %[%v%]"
+                 (number-to-string i))
+                'append)
+               (setq ids (last ids (- (length ids) hits))))
+             (debbugs-gnu-show-reports (car debbugs-gnu-widgets)))
+
+         (debbugs-gnu-show-reports
+          (widget-convert
+           'const
+           :suppress suppress
+           :buffer-name "*Emacs Bugs*"
+           :bug-ids ids
+           :query debbugs-gnu-current-query
+           :filter debbugs-gnu-current-filter))))
+
+    ;; Reset query and filter.
+    (setq debbugs-gnu-current-query nil
+         debbugs-gnu-current-filter nil)))
+
+(defun debbugs-gnu-get-bugs (query)
+  "Retrieve bugs numbers from debbugs.gnu.org according search criteria."
+  (let* ((debbugs-port "gnu.org")
+        (bugs (assoc 'bugs query))
+        (tags (assoc 'tag query))
+        (local-tags (and (member '(severity . "tagged") query) (not tags)))
+        (phrase (assoc 'phrase query))
+        args)
+    ;; Compile query arguments.
+    (unless (or query tags)
+      (dolist (elt debbugs-gnu-default-packages)
+       (setq args (append args (list :package elt)))))
+    (dolist (elt query)
+      (unless (equal elt '(severity . "tagged"))
+       (setq args
+             (append
+              args
+              (if phrase
+                  (cond
+                   ((eq (car elt) 'phrase)
+                    (list (list :phrase (cdr elt) :max 500)))
+                   ((eq (car elt) 'date)
+                    (list (list :date (cddr elt) (cadr elt)
+                                :operator "NUMBT")))
+                   (t
+                    (list (list (intern (concat ":" (symbol-name (car elt))))
+                                (cdr elt) :operator "ISTRINC"))))
+                (list (intern (concat ":" (symbol-name (car elt))))
+                      (cdr elt)))))))
+
+    (sort
+     (cond
+      ;; If the query is just a list of bug numbers, we return them.
+      (bugs (cdr bugs))
+      ;; If the query contains the pseudo-severity "tagged", we return
+      ;; just the local tagged bugs.
+      (local-tags (copy-sequence debbugs-gnu-local-tags))
+      ;; A full text query.
+      (phrase
+       (mapcar
+       (lambda (x) (cdr (assoc "id" x)))
+       (apply 'debbugs-search-est args)))
+      ;; User tags.
+      (tags
+       (setq args (mapcar (lambda (x) (if (eq x :package) :user x)) args))
+       (apply 'debbugs-get-usertag args))
+      ;; Otherwise, we retrieve the bugs from the server.
+      (t (apply 'debbugs-get-bugs args)))
+     ;; Sort function.
+     '<)))
+
+(defvar debbugs-gnu-current-widget nil)
+(defvar debbugs-gnu-current-limit nil)
+
+(defun debbugs-gnu-show-reports (widget)
+  "Show bug reports as given in WIDGET property :bug-ids."
+  ;; The tabulated mode sets several local variables.  We must get rid
+  ;; of them.
+  (when (get-buffer (widget-get widget :buffer-name))
+    (kill-buffer (widget-get widget :buffer-name)))
+  (pop-to-buffer (get-buffer-create (widget-get widget :buffer-name)))
+  (debbugs-gnu-mode)
+  (let ((inhibit-read-only t)
+       (debbugs-port "gnu.org"))
+    (erase-buffer)
+    (set (make-local-variable 'debbugs-gnu-current-widget) widget)
+
+    (dolist (status (apply 'debbugs-get-status (widget-get widget :bug-ids)))
+      (let* ((id (cdr (assq 'id status)))
+            (words
+             (mapconcat
+              'identity
+              (cons (cdr (assq 'severity status))
+                    (cdr (assq 'keywords status)))
+              ","))
+            (address (mail-header-parse-address
+                      (decode-coding-string (cdr (assq 'originator status))
+                                            'utf-8)))
+            (owner (if (cdr (assq 'owner status))
+                       (car (mail-header-parse-address
+                             (decode-coding-string (cdr (assq 'owner status))
+                                                   'utf-8)))))
+            (subject (decode-coding-string (cdr (assq 'subject status))
+                                           'utf-8))
+            merged)
+       (unless (equal (cdr (assq 'pending status)) "pending")
+         (setq words
+               (concat words "," (cdr (assq 'pending status)))))
+       (let ((packages (delete "emacs" (cdr (assq 'package status)))))
+         (when packages
+           (setq words (concat words "," (mapconcat 'identity packages ",")))))
+       (when (setq merged (cdr (assq 'mergedwith status)))
+         (setq words (format "%s,%s"
+                             (if (numberp merged)
+                                 merged
+                               (mapconcat 'number-to-string merged ","))
+                             words)))
+       (when (or (not merged)
+                 (not (let ((found nil))
+                        (dolist (id (if (listp merged)
+                                        merged
+                                      (list merged)))
+                          (dolist (entry tabulated-list-entries)
+                            (when (equal id (cdr (assq 'id (car entry))))
+                              (setq found t))))
+                        found)))
+         (add-to-list
+          'tabulated-list-entries
+          (list
+           status
+           (vector
+            (propertize
+             (format "%5d" id)
+             'face
+             ;; Mark tagged bugs.
+             (if (memq id debbugs-gnu-local-tags)
+                 'debbugs-gnu-tagged
+               'default))
+            (propertize
+             ;; Mark status and age.
+             words
+             'face
+             (cond
+              ((equal (cdr (assq 'pending status)) "done")
+               'debbugs-gnu-done)
+              ((member "pending" (cdr (assq 'keywords status)))
+               'debbugs-gnu-pending)
+              ((= (cdr (assq 'date status))
+                  (cdr (assq 'log_modified status)))
+               'debbugs-gnu-new)
+              ((< (- (float-time)
+                     (cdr (assq 'log_modified status)))
+                  (* 60 60 24 7 2))
+               'debbugs-gnu-handled)
+              (t
+               'debbugs-gnu-stale)))
+            (propertize
+             ;; Prefer the name over the address.
+             (or (cdr address)
+                 (car address))
+             'face
+             ;; Mark own submitted bugs.
+             (if (and (stringp (car address))
+                      (string-equal (car address) user-mail-address))
+                 'debbugs-gnu-tagged
+               'default))
+            (propertize
+             subject
+             'face
+             ;; Mark owned bugs.
+             (if (and (stringp owner)
+                      (string-equal owner user-mail-address))
+                 'debbugs-gnu-tagged
+               'default))))
+          'append))))
+    (tabulated-list-init-header)
+    (tabulated-list-print)
+
+    (set-buffer-modified-p nil)
+    (goto-char (point-min))))
+
+(defun debbugs-gnu-print-entry (list-id cols)
+  "Insert a debbugs entry at point.
+Used instead of `tabulated-list-print-entry'."
+  ;; This shall be in `debbugs-gnu-show-reports'.  But
+  ;; `tabulated-list-print' erases the buffer, therefore we do it
+  ;; here.  (bug#9047)
+  (when (and debbugs-gnu-widgets (= (point) (point-min)))
+    (widget-insert "Page:")
+    (mapc
+     (lambda (obj)
+       (if (eq obj debbugs-gnu-current-widget)
+          (widget-put obj :button-face 'widget-button-pressed)
+        (widget-put obj :button-face 'widget-button-face))
+       (widget-apply obj :create))
+     debbugs-gnu-widgets)
+    (widget-insert "\n\n")
+    (save-excursion
+      (widget-insert "\nPage:")
+      (mapc (lambda (obj) (widget-apply obj :create)) debbugs-gnu-widgets)
+      (widget-setup)))
+
+  (let ((beg (point))
+       (pos 0)
+       (case-fold-search t)
+       (id               (aref cols 0))
+       (id-length        (nth 1 (aref tabulated-list-format 0)))
+       (state            (aref cols 1))
+       (state-length     (nth 1 (aref tabulated-list-format 1)))
+       (submitter        (aref cols 2))
+       (submitter-length (nth 1 (aref tabulated-list-format 2)))
+       (title            (aref cols 3))
+       (title-length     (nth 1 (aref tabulated-list-format 3))))
+    (when (and
+          ;; We may have a narrowing in effect.
+          (or (not debbugs-gnu-current-limit)
+              (memq (cdr (assq 'id list-id)) debbugs-gnu-current-limit))
+          ;; Filter suppressed bugs.
+          (or (not (widget-get debbugs-gnu-current-widget :suppress))
+              (not (catch :suppress
+                     (dolist (check debbugs-gnu-default-suppress-bugs)
+                       (when
+                           (string-match
+                            (cdr check)
+                            (or (cdr (assq (car check) list-id)) ""))
+                         (throw :suppress t))))))
+          ;; Filter search list.
+          (not (catch :suppress
+                 (dolist (check
+                          (widget-get debbugs-gnu-current-widget :filter))
+                   (let ((val (cdr (assq (car check) list-id))))
+                     (if (stringp (cdr check))
+                         ;; Regular expression.
+                         (when (not (string-match (cdr check) (or val "")))
+                           (throw :suppress t))
+                       ;; Time value.
+                       (when (or (and (numberp (cadr check))
+                                      (< (cadr check) val))
+                                 (and (numberp (cddr check))
+                                      (> (cddr check) val)))
+                         (throw :suppress t))))))))
+
+      ;; Insert id.
+      (indent-to (- id-length (length id)))
+      (insert id)
+      ;; Insert state.
+      (indent-to (setq pos (+ pos id-length 1)) 1)
+      (insert (if (> (length state) state-length)
+                 (propertize (substring state 0 state-length)
+                             'help-echo state)
+               state))
+      ;; Insert submitter.
+      (indent-to (setq pos (+ pos state-length 1)) 1)
+      (insert "[" (if (> (length submitter) (- submitter-length 2))
+                     (propertize (substring submitter 0 (- submitter-length 2))
+                                 'help-echo submitter)
+                   submitter))
+      (indent-to (+ pos (1- submitter-length)))
+      (insert "]")
+      ;; Insert title.
+      (indent-to (setq pos (+ pos submitter-length 1)) 1)
+      (insert (propertize title 'help-echo title))
+      ;; Add properties.
+      (add-text-properties
+       beg (point) `(tabulated-list-id ,list-id mouse-face ,widget-mouse-face))
+      (insert ?\n))))
+
+(defvar debbugs-gnu-mode-map
+  (let ((map (make-sparse-keymap)))
+    (set-keymap-parent map tabulated-list-mode-map)
+    (define-key map "\r" 'debbugs-gnu-select-report)
+    (define-key map [mouse-1] 'debbugs-gnu-select-report)
+    (define-key map [mouse-2] 'debbugs-gnu-select-report)
+    (define-key map "s" 'debbugs-gnu-toggle-sort)
+    (define-key map "t" 'debbugs-gnu-toggle-tag)
+    (define-key map "d" 'debbugs-gnu-display-status)
+    (define-key map "g" 'debbugs-gnu-rescan)
+    (define-key map "x" 'debbugs-gnu-toggle-suppress)
+    (define-key map "/" 'debbugs-gnu-narrow-to-status)
+    (define-key map "w" 'debbugs-gnu-widen)
+    (define-key map "C" 'debbugs-gnu-send-control-message)
+    map))
+
+(defun debbugs-gnu-rescan ()
+  "Rescan the current set of bug reports."
+  (interactive)
+
+  ;; The last page will be provided with new bug ids.
+  ;; TODO: Do it also for the other pages.
+  (when (and debbugs-gnu-widgets
+            (eq debbugs-gnu-current-widget (car (last debbugs-gnu-widgets))))
+    (let ((first-id (car (widget-get debbugs-gnu-current-widget :bug-ids)))
+         (last-id  (car
+                    (last (widget-get debbugs-gnu-current-widget :bug-ids))))
+         (ids (debbugs-gnu-get-bugs
+               (widget-get debbugs-gnu-current-widget :query))))
+
+      (while (and (<= first-id last-id) (not (memq first-id ids)))
+       (setq first-id (1+ first-id)))
+
+      (when (<= first-id last-id)
+       (widget-put debbugs-gnu-current-widget :bug-ids (memq first-id ids)))))
+
+  ;; Refresh the buffer.  `save-excursion' does not work, so we
+  ;; remember the position.
+  (let ((pos (point)))
+    (debbugs-gnu-show-reports debbugs-gnu-current-widget)
+    (goto-char pos)))
+
+(defvar debbugs-gnu-sort-state 'number)
+
+(define-derived-mode debbugs-gnu-mode tabulated-list-mode "Debbugs"
+  "Major mode for listing bug reports.
+
+All normal editing commands are switched off.
+\\<debbugs-gnu-mode-map>
+
+The following commands are available:
+
+\\{debbugs-gnu-mode-map}"
+  (set (make-local-variable 'debbugs-gnu-sort-state) 'number)
+  (set (make-local-variable 'debbugs-gnu-current-limit) nil)
+  (setq tabulated-list-format [("Id"         5 debbugs-gnu-sort-id)
+                              ("State"     20 debbugs-gnu-sort-state)
+                              ("Submitter" 25 t)
+                              ("Title"     10 debbugs-gnu-sort-title)])
+  (setq tabulated-list-sort-key (cons "Id" nil))
+  (setq tabulated-list-printer 'debbugs-gnu-print-entry)
+  (buffer-disable-undo)
+  (setq truncate-lines t)
+  (setq buffer-read-only t))
+
+(defun debbugs-gnu-sort-id (s1 s2)
+  (< (cdr (assq 'id (car s1)))
+     (cdr (assq 'id (car s2)))))
+
+(defconst debbugs-gnu-state-preference
+  '((debbugs-gnu-new . 1)
+    (debbugs-gnu-stale . 2)
+    (debbugs-gnu-handled . 3)
+    (debbugs-gnu-done . 4)
+    (debbugs-gnu-pending . 5)))
+
+(defun debbugs-gnu-get-state-preference (face-string)
+  (or (cdr (assq (get-text-property 0 'face face-string)
+                debbugs-gnu-state-preference))
+      10))
+
+(defconst debbugs-gnu-severity-preference
+  '(("serious" . 1)
+    ("important" . 2)
+    ("normal" . 3)
+    ("minor" . 4)
+    ("wishlist" . 5)))
+
+(defun debbugs-gnu-get-severity-preference (state)
+  (or (cdr (assoc (cdr (assq 'severity state))
+                 debbugs-gnu-severity-preference))
+      10))
+
+(defun debbugs-gnu-sort-state (s1 s2)
+  (let ((id1 (cdr (assq 'id (car s1))))
+       (age1 (debbugs-gnu-get-state-preference (aref (nth 1 s1) 1)))
+       (id2 (cdr (assq 'id (car s2))))
+       (age2 (debbugs-gnu-get-state-preference (aref (nth 1 s2) 1))))
+    (cond
+     ;; Tagged bugs go to the end.
+     ((and (not (memq id1 debbugs-gnu-local-tags))
+          (memq id2 debbugs-gnu-local-tags))
+      t)
+     ((and (memq id1 debbugs-gnu-local-tags)
+          (not (memq id2 debbugs-gnu-local-tags)))
+      nil)
+     ;; Then, we check the age of the bugs.
+     ((< age1 age2)
+      t)
+     ((> age1 age2)
+      nil)
+     ;; If they have the same age, we check for severity.
+     ((< (debbugs-gnu-get-severity-preference (car s1))
+        (debbugs-gnu-get-severity-preference (car s2)))
+      t)
+     (t nil))))
+
+(defun debbugs-gnu-sort-title (s1 s2)
+  (let ((owner (if (cdr (assq 'owner (car s1)))
+                  (car (mail-header-parse-address
+                        (decode-coding-string (cdr (assq 'owner (car s1)))
+                                              'utf-8))))))
+    (and (stringp owner)
+        (string-equal owner user-mail-address))))
+
+(defun debbugs-gnu-toggle-sort ()
+  "Toggle sorting by age and by state."
+  (interactive)
+  (if (eq debbugs-gnu-sort-state 'number)
+      (progn
+       (setq debbugs-gnu-sort-state 'state)
+       (setq tabulated-list-sort-key (cons "Id" nil)))
+    (setq debbugs-gnu-sort-state 'number)
+    (setq tabulated-list-sort-key (cons "State" nil)))
+  (tabulated-list-init-header)
+  (tabulated-list-print))
+
+(defun debbugs-gnu-widen ()
+  "Display all the currently selected bug reports."
+  (interactive)
+  (let ((id (debbugs-gnu-current-id t))
+       (inhibit-read-only t))
+    (setq debbugs-gnu-current-limit nil)
+    (tabulated-list-init-header)
+    (tabulated-list-print)
+    (when id
+      (debbugs-gnu-goto id))))
+
+(defun debbugs-gnu-narrow-to-status (string &optional status-only)
+  "Only display the bugs matching STRING.
+If STATUS-ONLY (the prefix), ignore matches in the From and
+Subject fields."
+  (interactive "sNarrow to: \np")
+  (let ((id (debbugs-gnu-current-id t))
+       (inhibit-read-only t)
+       status)
+    (setq debbugs-gnu-current-limit nil)
+    (goto-char (point-min))
+    (while (not (eobp))
+      (setq status (debbugs-gnu-current-status))
+      (if (and (not (member string (assq 'keywords status)))
+              (not (member string (assq 'severity status)))
+              (or status-only
+                  (not (string-match string (cdr (assq 'originator status)))))
+              (or status-only
+                  (not (string-match string (cdr (assq 'subject status))))))
+         (delete-region (point) (progn (forward-line 1) (point)))
+       (push (cdr (assq 'id status)) debbugs-gnu-current-limit)
+       (forward-line 1)))
+    (when id
+      (debbugs-gnu-goto id))))
+
+(defun debbugs-gnu-goto (id)
+  "Go to the line displaying bug ID."
+  (goto-char (point-min))
+  (while (and (not (eobp))
+             (not (equal (debbugs-gnu-current-id t) id)))
+    (forward-line 1)))
+
+(defun debbugs-gnu-toggle-tag ()
+  "Toggle tag of the report in the current line."
+  (interactive)
+  (save-excursion
+    (beginning-of-line)
+    (let ((inhibit-read-only t)
+         (id (debbugs-gnu-current-id)))
+      (if (memq id debbugs-gnu-local-tags)
+         (progn
+           (setq debbugs-gnu-local-tags (delq id debbugs-gnu-local-tags))
+           (put-text-property (point) (+ (point) 5) 'face 'default))
+       (add-to-list 'debbugs-gnu-local-tags id)
+       (put-text-property
+        (+ (point) (- 5 (length (number-to-string id)))) (+ (point) 5)
+        'face 'debbugs-gnu-tagged))))
+  (debbugs-gnu-dump-persistency-file))
+
+(defun debbugs-gnu-toggle-suppress ()
+  "Suppress bugs marked in `debbugs-gnu-suppress-bugs'."
+  (interactive)
+  (widget-put debbugs-gnu-current-widget :suppress
+             (not (widget-get debbugs-gnu-current-widget :suppress)))
+  (tabulated-list-init-header)
+  (tabulated-list-print))
+
+(defvar debbugs-gnu-bug-number nil)
+(defvar debbugs-gnu-subject nil)
+
+(defun debbugs-gnu-current-id (&optional noerror)
+  (or (cdr (assq 'id (debbugs-gnu-current-status)))
+      (and (not noerror)
+          (error "No bug on the current line"))))
+
+(defun debbugs-gnu-current-status ()
+  (get-text-property (line-beginning-position) 'tabulated-list-id))
+
+(defun debbugs-gnu-current-query ()
+  (widget-get debbugs-gnu-current-widget :query))
+
+(defun debbugs-gnu-display-status (query status)
+  "Display the query and status of the report on the current line."
+  (interactive (list (debbugs-gnu-current-query)
+                    (debbugs-gnu-current-status)))
+  (pop-to-buffer "*Bug Status*")
+  (let ((inhibit-read-only t))
+    (erase-buffer)
+    (when query (pp query (current-buffer)))
+    (when status (pp status (current-buffer)))
+    (goto-char (point-min)))
+  (set-buffer-modified-p nil)
+  (special-mode))
+
+(defun debbugs-gnu-select-report ()
+  "Select the report on the current line."
+  (interactive)
+  ;; We open the report messages.
+  (let* ((status (debbugs-gnu-current-status))
+        (id (cdr (assq 'id status)))
+        (merged (cdr (assq 'mergedwith status))))
+    (gnus-read-ephemeral-emacs-bug-group
+     (cons id (if (listp merged)
+                 merged
+               (list merged)))
+     (cons (current-buffer)
+          (current-window-configuration)))
+    (with-current-buffer (window-buffer (selected-window))
+      (set (make-local-variable 'debbugs-gnu-bug-number) id)
+      (set (make-local-variable 'debbugs-gnu-subject)
+          (format "Re: bug#%d: %s" id (cdr (assq 'subject status))))
+      (debbugs-gnu-summary-mode 1))))
+
+(defvar debbugs-gnu-summary-mode-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map "C" 'debbugs-gnu-send-control-message)
+    map))
+
+(defvar gnus-posting-styles)
+
+(define-minor-mode debbugs-gnu-summary-mode
+  "Minor mode for providing a debbugs interface in Gnus summary buffers.
+
+\\{debbugs-gnu-summary-mode-map}"
+  :lighter " Debbugs" :keymap debbugs-gnu-summary-mode-map
+  (set (make-local-variable 'gnus-posting-styles)
+       `((".*"
+         (eval
+          (when (buffer-live-p gnus-article-copy)
+            (with-current-buffer gnus-article-copy
+              (set (make-local-variable 'message-prune-recipient-rules)
+                   '((".*@debbugs.*" "emacs-pretest-bug")
+                     (".*@debbugs.*" "bug-gnu-emacs")
+                     ("[0-9]+@debbugs.*" "submit@debbugs.gnu.org")
+                     ("[0-9]+@debbugs.*" "quiet@debbugs.gnu.org")))
+              (set (make-local-variable 'message-alter-recipients-function)
+                   (lambda (address)
+                     (if (string-match "\\([0-9]+\\)@donarmstrong"
+                                       (car address))
+                         (let ((new (format "%s@debbugs.gnu.org"
+                                            (match-string 1 (car address)))))
+                           (cons new new))
+                       address)))
+              ;; `gnus-posting-styles' is eval'ed after
+              ;; `message-simplify-subject'.  So we cannot use m-s-s.
+              (setq subject ,debbugs-gnu-subject))))))))
+
+(defun debbugs-gnu-guess-current-id ()
+  "Guess the ID based on \"#23\"."
+  (save-excursion
+    (beginning-of-line)
+    (and
+     (or (re-search-forward "#\\([0-9]+\\)" (line-end-position) t)
+        (progn
+          (goto-char (point-min))
+          (re-search-forward "#\\([0-9]+\\)" nil t)))
+     (string-to-number (match-string 1)))))
+
+(defun debbugs-gnu-send-control-message (message &optional reverse)
+  "Send a control message for the current bug report.
+You can set the severity or add a tag, or close the report.  If
+you use the special \"done\" MESSAGE, the report will be marked as
+fixed, and then closed.
+
+If given a prefix, and given a tag to set, the tag will be
+removed instead."
+  (interactive
+   (list (completing-read
+         "Control message: "
+         '("serious" "important" "normal" "minor" "wishlist"
+           "done" "donenotabug" "donewontfix" "doneunreproducible"
+           "unarchive" "reopen" "close"
+           "merge" "forcemerge"
+           "owner" "noowner"
+           "invalid"
+           "reassign"
+           "patch" "wontfix" "moreinfo" "unreproducible" "fixed" "notabug"
+           "pending" "help" "security" "confirmed"
+           "usertag")
+         nil t)
+        current-prefix-arg))
+  (let* ((id (or debbugs-gnu-bug-number        ; Set on group entry.
+                (debbugs-gnu-guess-current-id)
+                (debbugs-gnu-current-id)))
+        (version
+         (when (member message '("close" "done"))
+           (read-string
+            "Version: "
+            (cond
+             ;; Emacs development versions.
+             ((string-match
+               "^\\([0-9]+\\)\\.\\([0-9]+\\)\\.\\([0-9]+\\)\\." emacs-version)
+              (format "%s.%d"
+                      (match-string 1 emacs-version)
+                      (1+ (string-to-number (match-string 2 emacs-version)))))
+             ;; Emacs release versions.
+             ((string-match
+               "^\\([0-9]+\\)\\.\\([0-9]+\\)\\.\\([0-9]+\\)$" emacs-version)
+              (format "%s.%s"
+                      (match-string 1 emacs-version)
+                      (match-string 2 emacs-version)))
+             (t emacs-version))))))
+    (with-temp-buffer
+      (insert "To: control@debbugs.gnu.org\n"
+             "From: " (message-make-from) "\n"
+             (format "Subject: control message for bug #%d\n" id)
+             "\n"
+             (cond
+              ((member message '("unarchive" "reopen" "noowner"))
+               (format "%s %d\n" message id))
+              ((member message '("merge" "forcemerge"))
+               (format "%s %d %s\n" message id
+                       (read-string "Merge with bug #: ")))
+              ((equal message "owner")
+               (format "owner %d !\n" id))
+              ((equal message "reassign")
+               (format "reassign %d %s\n" id (read-string "Package(s): ")))
+              ((equal message "close")
+               (format "close %d %s\n" id version))
+              ((equal message "done")
+               (format "tags %d fixed\nclose %d %s\n" id id version))
+              ((member message '("donenotabug" "donewontfix"
+                                 "doneunreproducible"))
+               (format "tags %d %s\nclose %d\n" id (substring message 4) id))
+              ((member message '("serious" "important" "normal"
+                                 "minor" "wishlist"))
+               (format "severity %d %s\n" id message))
+              ((equal message "invalid")
+               (format "tags %d notabug\ntags %d wontfix\nclose %d\n"
+                       id id id))
+              ((equal message "usertag")
+               (format "user %s\nusertag %d %s\n"
+                       (completing-read
+                        "Package name or email address: "
+                        (append
+                         debbugs-gnu-all-packages (list user-mail-address))
+                        nil nil (car debbugs-gnu-default-packages))
+                       id (read-string "User tag: ")))
+              (t
+               (format "tags %d%s %s\n"
+                       id (if reverse " -" "")
+                       message))))
+      (funcall send-mail-function))))
+
+(defvar debbugs-gnu-usertags-mode-map
+  (let ((map (make-sparse-keymap)))
+    (set-keymap-parent map tabulated-list-mode-map)
+    (define-key map "\r" 'debbugs-gnu-select-usertag)
+    (define-key map [mouse-1] 'debbugs-gnu-select-usertag)
+    (define-key map [mouse-2] 'debbugs-gnu-select-usertag)
+    map))
+
+(define-derived-mode debbugs-gnu-usertags-mode tabulated-list-mode "Usertags"
+  "Major mode for listing user tags.
+
+All normal editing commands are switched off.
+\\<debbugs-gnu-usertags-mode-map>
+
+The following commands are available:
+
+\\{debbugs-gnu-usertags-mode-map}"
+  (buffer-disable-undo)
+  (setq truncate-lines t)
+  (setq buffer-read-only t))
+
+;;;###autoload
+(defun debbugs-gnu-usertags (&rest users)
+  "List all user tags for USERS, which is \(\"emacs\"\) by default."
+  (interactive
+   (if current-prefix-arg
+       (completing-read-multiple
+       "Package name(s) or email address: "
+       (append debbugs-gnu-all-packages (list user-mail-address)) nil nil
+       (mapconcat 'identity debbugs-gnu-default-packages ","))
+     debbugs-gnu-default-packages))
+
+  (unwind-protect
+      (let ((inhibit-read-only t)
+           (debbugs-port "gnu.org")
+           (buffer-name "*Emacs User Tags*")
+           (user-tab-length
+            (1+ (apply 'max (length "User") (mapcar 'length users)))))
+
+       ;; Initialize variables.
+       (when (and (file-exists-p debbugs-gnu-persistency-file)
+                  (not debbugs-gnu-local-tags))
+         (with-temp-buffer
+           (insert-file-contents debbugs-gnu-persistency-file)
+           (eval (read (current-buffer)))))
+
+       ;; Create buffer.
+       (when (get-buffer buffer-name)
+         (kill-buffer buffer-name))
+       (pop-to-buffer (get-buffer-create buffer-name))
+       (debbugs-gnu-usertags-mode)
+       (setq tabulated-list-format `[("User" ,user-tab-length t)
+                                     ("Tag"  10 t)])
+       (setq tabulated-list-sort-key (cons "User" nil))
+       ;(setq tabulated-list-printer 'debbugs-gnu-print-entry)
+       (erase-buffer)
+
+       ;; Retrieve user tags.
+       (dolist (user users)
+         (dolist (tag (sort (debbugs-get-usertag :user user) 'string<))
+           (add-to-list
+            'tabulated-list-entries
+            ;; `tabulated-list-id' is the parameter list for `debbugs-gnu'.
+            `((("tagged") (,user) nil nil (,tag))
+              ,(vector (propertize user 'mouse-face widget-mouse-face)
+                       (propertize tag 'mouse-face widget-mouse-face)))
+            'append)))
+
+       ;; Add local tags.
+       (when debbugs-gnu-local-tags
+         (add-to-list
+            'tabulated-list-entries
+            `((("tagged"))
+              ,(vector "" (propertize "(local tags)"
+                                      'mouse-face widget-mouse-face)))))
+
+       ;; Show them.
+       (tabulated-list-init-header)
+       (tabulated-list-print)
+
+       (set-buffer-modified-p nil)
+       (goto-char (point-min)))))
+
+(defun debbugs-gnu-select-usertag ()
+  "Select the user tag on the current line."
+  (interactive)
+  ;; We open the bug reports.
+  (let ((args (get-text-property (line-beginning-position) 'tabulated-list-id)))
+    (when args (apply 'debbugs-gnu args))))
+
+;;;###autoload
+(defun debbugs-gnu-bugs (&rest bugs)
+  "List all BUGS, a list of bug numbers."
+  (interactive
+   (mapcar 'string-to-number
+          (completing-read-multiple "Bug numbers: " nil 'natnump)))
+  (dolist (elt bugs)
+    (unless (natnump elt) (signal 'wrong-type-argument (list 'natnump elt))))
+  (add-to-list 'debbugs-gnu-current-query (cons 'bugs bugs))
+  (debbugs-gnu nil))
+
+(provide 'debbugs-gnu)
+
+;;; TODO:
+
+;; * Reorganize pages after client-side filtering.
+
+;;; debbugs-gnu.el ends here
diff --git a/packages/debbugs/debbugs-pkg.el b/packages/debbugs/debbugs-pkg.el
new file mode 100644 (file)
index 0000000..817ec06
--- /dev/null
@@ -0,0 +1 @@
+(define-package "debbugs" "0.4" "SOAP library to access debbugs servers")
diff --git a/packages/debbugs/debbugs.el b/packages/debbugs/debbugs.el
new file mode 100644 (file)
index 0000000..9271f69
--- /dev/null
@@ -0,0 +1,747 @@
+;;; debbugs.el --- SOAP library to access debbugs servers
+
+;; Copyright (C) 2011-2013 Free Software Foundation, Inc.
+
+;; Author: Michael Albinus <michael.albinus@gmx.de>
+;; Keywords: comm, hypermedia
+;; Package: debbugs
+;; Version: 0.4
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This package provides basic functions to access a Debbugs SOAP
+;; server (see <http://wiki.debian.org/DebbugsSoapInterface>).
+
+;; The function "get_versions" is not implemented (yet).  "search_est"
+;; is an extension on <http://debbugs.gnu.org>.
+
+;;; Code:
+
+;(setq soap-debug t message-log-max t)
+(require 'soap-client)
+(eval-when-compile (require 'cl))
+
+(defgroup debbugs nil
+  "Debbugs library"
+  :group 'hypermedia)
+
+(defcustom debbugs-servers
+  '(("gnu.org"
+     :wsdl "http://debbugs.gnu.org/cgi/soap.cgi?WSDL"
+     :bugreport-url "http://debbugs.gnu.org/cgi/bugreport.cgi")
+    ("debian.org"
+     :wsdl "http://bugs.debian.org/cgi-bin/soap.cgi?WSDL"
+     :bugreport-url "http://bugs.debian.org/cgi-bin/bugreport.cgi"))
+  "*List of Debbugs server specifiers.
+Each entry is a list that contains a string identifying the port
+name and the server parameters in keyword-value form. Allowed
+keywords are:
+
+`:wsdl' -- Location of WSDL. The value is a string with URL that
+should return the WSDL specification of Debbugs/SOAP service.
+
+`:bugreport-url' -- URL of the server script that returns mboxes
+with bug logs.
+
+The list initially contains two predefined and configured Debbugs
+servers: \"gnu.org\" and \"debian.org\"."
+  :group 'debbugs
+  :link '(custom-manual "(debbugs)Debbugs server specifiers")
+  :type '(choice
+         (const nil)
+         (repeat
+          (cons :tag "Server"
+                (string :tag "Port name")
+                (checklist :tag "Options" :greedy t
+                           (group :inline t
+                                  (const :format "" :value :wsdl)
+                                  (string :tag "WSDL"))
+                           (group :inline t
+                                  (const :format "" :value :bugreport-url)
+                                  (string :tag "Bugreport URL")))))))
+
+(defcustom debbugs-port "gnu.org"
+  "The port instance to be applied from `debbugs-wsdl'.
+This corresponds to the Debbugs server to be accessed, either
+\"gnu.org\", or \"debian.org\", or user defined port name."
+  ;; Maybe we should create an own group?
+  :group 'debbugs
+  :type '(choice :tag "Debbugs server" (const "gnu.org") (const "debian.org")
+                (string :tag "user defined port name")))
+
+;; It would be nice if we could retrieve it from the debbugs server.
+;; Not supported yet.
+(defconst debbugs-wsdl
+  (soap-load-wsdl
+   (expand-file-name
+    "Debbugs.wsdl"
+    (if load-in-progress
+       (file-name-directory load-file-name)
+      default-directory)))
+  "The WSDL object to be used describing the SOAP interface.")
+
+(defun debbugs-get-bugs (&rest query)
+  "Return a list of bug numbers which match QUERY.
+
+QUERY is a sequence of keyword-value pairs where the values are
+strings, i.e. :KEYWORD \"VALUE\" [:KEYWORD \"VALUE\"]*
+
+The keyword-value pair is a subquery.  The keywords are allowed to
+have multiple occurrence within the query at any place.  The
+subqueries with the same keyword form the logical subquery, which
+returns the union of bugs of every subquery it contains.
+
+The result of the QUERY is an intersection of results of all
+subqueries.
+
+Valid keywords are:
+
+  :package -- The value is the name of the package a bug belongs
+  to, like \"emacs\", \"coreutils\", \"gnus\", or \"tramp\".
+
+  :src -- This is used to retrieve bugs that belong to source
+  with given name.
+
+  :severity -- This is the severity of the bug.  The exact set of
+  allowed values depends on the Debbugs port.  Examples are
+  \"normal\", \"minor\", \"wishlist\" etc.
+
+  :tag -- An arbitrary string the bug is annotated with.
+  Usually, this is used to mark the status of the bug, like
+  \"fixed\", \"moreinfo\", \"notabug\", \"patch\",
+  \"unreproducible\" or \"wontfix\".  The exact set of tags
+  depends on the Debbugs port.
+
+  :owner -- This is used to identify bugs by the owner's email
+  address.  The special email address \"me\" is used as pattern,
+  replaced with `user-mail-address'.
+
+  :submitter -- With this keyword it is possible to filter bugs
+  by the submitter's email address.  The special email address
+  \"me\" is used as pattern, replaced with `user-mail-address'.
+
+  :maint -- This is used to find bugs of the packages which are
+  maintained by the person with the given email address.  The
+  special email address \"me\" is used as pattern, replaced with
+  `user-mail-address'.
+
+  :correspondent -- This allows to find bug reports where the
+  person with the given email address has participated.  The
+  special email address \"me\" is used as pattern, replaced with
+  `user-mail-address'.
+
+  :affects -- With this keyword it is possible to find bugs which
+  affect the package with the given name.  The bugs are chosen by
+  the value of field `affects' in bug's status.  The returned bugs
+  do not necessary belong to this package.
+
+  :status -- Status of bug.  Valid values are \"done\",
+  \"forwarded\" and \"open\".
+
+  :archive -- A keyword to filter for bugs which are already
+  archived, or not.  Valid values are \"0\" (not archived),
+  \"1\" (archived) or \"both\".  If this keyword is not given in
+  the query, `:archive \"0\"' is assumed by default.
+
+Example.  Get all opened and forwarded release critical bugs for
+the packages which are maintained by \"me\" and which have a
+patch:
+
+  \(debbugs-get-bugs :maint \"me\" :tag \"patch\"
+                     :severity \"critical\"
+                     :status \"open\"
+                     :severity \"grave\"
+                     :status \"forwarded\"
+                     :severity \"serious\")"
+
+  (let (vec kw key val)
+    ;; Check query.
+    (while (and (consp query) (<= 2 (length query)))
+      (setq kw (pop query)
+           val (pop query))
+      (unless (and (keywordp kw) (stringp val))
+       (error "Wrong query: %s %s" kw val))
+      (setq key (substring (symbol-name kw) 1))
+      (case kw
+       ((:package :severity :tag :src :affects)
+        ;; Value shall be one word.
+        (if (string-match "\\`\\S-+\\'" val)
+            (setq vec (vconcat vec (list key val)))
+          (error "Wrong %s: %s" key val)))
+       ((:owner :submitter :maint :correspondent)
+        ;; Value is an email address.
+        (if (string-match "\\`\\S-+\\'" val)
+            (progn
+              (when (string-equal "me" val)
+                (setq val user-mail-address))
+              (when (string-match "<\\(.+\\)>" val)
+                (setq val (match-string 1 val)))
+              (setq vec (vconcat vec (list key val))))
+          (error "Wrong %s: %s" key val)))
+       (:status
+        ;; Possible values: "done", "forwarded" and "open"
+        (if (string-match "\\`\\(done\\|forwarded\\|open\\)\\'" val)
+            (setq vec (vconcat vec (list key val)))
+          (error "Wrong %s: %s" key val)))
+       (:archive
+        ;; Value is `0' or `1' or `both'.
+        (if (string-match "\\`\\(0\\|1\\|both\\)\\'" val)
+            (setq vec (vconcat vec (list key val)))
+          (error "Wrong %s: %s" key val)))
+       (t (error "Unknown key: %s" kw))))
+
+    (unless (null query)
+      (error "Unknown key: %s" (car query)))
+    (sort (car (soap-invoke debbugs-wsdl debbugs-port "get_bugs" vec)) '<)))
+
+(defun debbugs-newest-bugs (amount)
+  "Return the list of bug numbers, according to AMOUNT (a number) latest bugs."
+  (sort (car (soap-invoke debbugs-wsdl debbugs-port "newest_bugs" amount)) '<))
+
+(defun debbugs-get-status (&rest bug-numbers)
+  "Return a list of status entries for the bugs identified by BUG-NUMBERS.
+
+Every returned entry is an association list with the following attributes:
+
+  `bug_num': The bug number.
+
+  `package': A list of package names the bug belongs to.
+
+  `severity': The severity of the bug report. This can be
+  \"important\", \"grave\", \"normal\", \"minor\" or \"wishlist\".
+
+  `tags': The status of the bug report, a list of strings.  This
+  can be \"fixed\", \"notabug\", \"wontfix\", \"unreproducible\",
+  \"moreinfo\" or \"patch\".
+
+  `pending': The string \"pending\", \"forwarded\" or \"done\".
+
+  `subject': Subject/Title of the bugreport.
+
+  `originator': Submitter of the bugreport.
+
+  `mergedwith': A list of bug numbers this bug was merged with.
+
+  `source': Source package name of the bug report.
+
+  `date': Date of bug creation.
+
+  `log_modified', `last_modified': Date of last update.
+
+  `found_date', `fixed_date': Date of bug report / bug fix
+  \(empty for now).
+
+  `done': The email address of the worker who has closed the bug (if done).
+
+  `archived': `t' if the bug is archived, `nil' otherwise.
+
+  `unarchived': The date the bug has been unarchived, if ever.
+
+  `found_versions', `fixed_versions': List of version strings.
+
+  `forwarded': A URL or an email address.
+
+  `blocks': A list of bug numbers this bug blocks.
+
+  `blockedby': A list of bug numbers this bug is blocked by.
+
+  `msgid': The message id of the initial bug report.
+
+  `owner': Who is responsible for fixing.
+
+  `location': Always the string \"db-h\" or \"archive\".
+
+  `affects': A list of package names.
+
+  `summary': Arbitrary text.
+
+Example:
+
+  \(debbugs-get-status 10)
+
+  => ;; Attributes with empty values are not shown
+     \(\(\(bug_num . 10)
+       \(source . \"unknown\")
+       \(date . 1203606305.0)
+       \(msgid . \"<87zltuz7eh.fsf@freemail.hu>\")
+       \(severity . \"wishlist\")
+       \(owner . \"Magnus Henoch <mange@freemail.hu>\")
+       \(log_modified . 1261079402.0)
+       \(location . \"db-h\")
+       \(subject . \"url-gw should support HTTP CONNECT proxies\")
+       \(originator . \"Magnus Henoch <mange@freemail.hu>\")
+       \(last_modified . 1271200046.0)
+       \(pending . \"pending\")
+       \(package \"emacs\")))"
+  (when bug-numbers
+    (let ((object
+          (car
+           (soap-invoke
+            debbugs-wsdl debbugs-port "get_status"
+            (apply 'vector bug-numbers)))))
+      (mapcar
+       (lambda (x)
+        (let (y)
+          ;; "archived" is the number 1 or 0.
+          (setq y (assoc 'archived (cdr (assoc 'value x))))
+          (setcdr y (= (cdr y) 1))
+          ;; "found_versions" and "fixed_versions" are lists,
+          ;; containing strings or numbers.
+          (dolist (attribute '(found_versions fixed_versions))
+            (setq y (assoc attribute (cdr (assoc 'value x))))
+            (setcdr y (mapcar
+                       (lambda (z) (if (numberp z) (number-to-string z) z))
+                       (cdr y))))
+          ;; "mergedwith" is a string, containing blank separated bug numbers.
+          (setq y (assoc 'mergedwith (cdr (assoc 'value x))))
+          (when (stringp (cdr y))
+            (setcdr y (mapcar 'string-to-number (split-string (cdr y) " " t))))
+          ;; "package" is a string, containing comma separated
+          ;; package names.  "keywords" and "tags" are strings,
+          ;; containing blank separated package names.
+          (dolist (attribute '(package keywords tags))
+            (setq y (assoc attribute (cdr (assoc 'value x))))
+            (when (stringp (cdr y))
+              (setcdr y (split-string (cdr y) ",\\| " t))))
+          (cdr (assoc 'value x))))
+       object))))
+
+(defun debbugs-get-usertag (&rest query)
+  "Return a list of bug numbers which match QUERY.
+
+QUERY is a sequence of keyword-value pairs where the values are
+strings, i.e. :KEYWORD \"VALUE\" [:KEYWORD \"VALUE\"]*
+
+Valid keywords are:
+
+  :user -- The value is the name of the package a bug belongs to,
+  like \"emacs\", \"coreutils\", \"gnus\", or \"tramp\".  It can
+  also be an email address of a user who has applied a user tag.
+  The special email address \"me\" is used as pattern, replaced
+  with `user-mail-address'.  There must be at least one such
+  entry; it is recommended to have exactly one.
+
+  :tag -- A string applied as user tag.  Often, it is a
+  subproduct identification, like \"cedet\" or \"tramp\" for the
+  package \"emacs\".
+
+If there is no :tag entry, no bug numbers will be returned but a list of
+existing user tags for :user.
+
+Example:
+
+  \(debbugs-get-usertag :user \"emacs\")
+
+  => (\"www\" \"solaris\" \"ls-lisp\" \"cygwin\")
+
+  \(debbugs-get-usertag :user \"emacs\" :tag \"www\" :tag \"cygwin\")
+
+  => (807 1223 5637)"
+
+  (let (user tags kw key val object result)
+    ;; Check query.
+    (while (and (consp query) (<= 2 (length query)))
+      (setq kw (pop query)
+           val (pop query))
+      (unless (and (keywordp kw) (stringp val))
+       (error "Wrong query: %s %s" kw val))
+      (setq key (substring (symbol-name kw) 1))
+      (case kw
+       ((:user)
+        ;; Value shall be one word.  Extract email address, if existing.
+        (if (string-match "\\`\\S-+\\'" val)
+            (progn
+              (when (string-equal "me" val)
+                (setq val user-mail-address))
+              (when (string-match "<\\(.+\\)>" val)
+                (setq val (match-string 1 val)))
+              (add-to-list 'user val))
+          (error "Wrong %s: %s" key val)))
+       ((:tag)
+        ;; Value shall be one word.
+        (if (string-match "\\`\\S-+\\'" val)
+            (add-to-list 'tags val)
+          (error "Wrong %s: %s" key val)))
+       (t (error "Unknown key: %s" kw))))
+
+    (unless (null query)
+      (error "Unknown key: %s" (car query)))
+    (unless (= (length user) 1)
+      (error "There must be exactly one :user entry"))
+
+    (setq
+     object
+     (car (soap-invoke debbugs-wsdl debbugs-port "get_usertag" (car user))))
+
+    (if (null tags)
+       ;; Return the list of existing tags.
+       (mapcar (lambda (x) (symbol-name (car x))) object)
+
+      ;; Return bug numbers.
+      (dolist (elt object result)
+       (when (member (symbol-name (car elt)) tags)
+         (setq result (append (cdr elt) result)))))))
+
+(defun debbugs-get-bug-log (bug-number)
+  "Return a list of messages related to BUG-NUMBER.
+
+Every message is an association list with the following attributes:
+
+  `msg_num': The number of the message inside the bug log.  The
+  numbers are ascending, newer messages have a higher number.
+
+  `header': The message header lines, as arrived at the bug tracker.
+
+  `body': The message body.
+
+  `attachments' A list of possible attachments, or `nil'.  Not
+  implemented yet server side."
+  (car (soap-invoke debbugs-wsdl debbugs-port "get_bug_log" bug-number)))
+
+(defun debbugs-search-est (&rest query)
+  "Return the result of a full text search according to QUERY.
+
+QUERY is a sequence of lists of keyword-value pairs where the
+values are strings or numbers, i.e. :KEYWORD \"VALUE\" [:KEYWORD
+VALUE]*
+
+Every sublist of the QUERY forms a hyperestraier condition.  A
+detailed description of hyperestraier conditions can be found at
+URL `http://fallabs.com/hyperestraier/uguide-en.html#searchcond'.
+
+The following conditions are possible:
+
+\[:phrase SEARCH-PHRASE :skip NUMBER :max NUMBER\]
+
+  The string SEARCH-PHRASE forms the search on the database.  It
+  contains words to be searched for, combined by operators like
+  AND, ANDNOT and OR.  If there is no operator between the words,
+  AND is used by default.  The phrase keyword and value can also
+  be omitted, this is useful in combination with other conditions.
+
+  :skip and :max are optional.  They specify, how many hits are
+  skipped, and how many maximal hits are returned.  This can be
+  used for paged results.  Per default, :skip is 0 and :max is 10.
+
+  There must be exactly one such condition.
+
+\[ATTRIBUTE VALUE+ :operation OPERATION :order ORDER\]
+
+  ATTRIBUTE is one of the following keywords:
+
+  :status --  Status of bug.  Valid values are \"done\",
+  \"forwarded\" and \"open\".
+
+  :subject, :@title -- The subject of a message or the title of
+  the bug, a string.
+
+  :date, :@cdate -- The submission or modification dates of a
+  message, a number.
+
+  :submitter, :@author -- The email address of the submitter of a
+  bug or the author of a message belonging to this bug, a string.
+  The special email address \"me\" is used as pattern, replaced
+  with `user-mail-address'.
+
+  :package -- The value is the name of the package a bug belongs
+  to, like \"emacs\", \"coreutils\", \"gnus\", or \"tramp\".
+
+  :tags -- An arbitrary string the bug is annotated with.
+
+  :severity -- This is the severity of the bug.  The exact set of
+  allowed values depends on the Debbugs port.  Examples are
+  \"normal\", \"minor\", \"wishlist\" etc.
+
+  :operator defines the comparison operator to be applied to
+  ATTRIBUTE.  For string attributes this could be \"STREQ\" \(is
+  equal to the string), \"STRNE\" \(is not equal to the string),
+  \"STRINC\" \(includes the string), \"STRBW\" \(begins with the
+  string), \"STREW\" \(ends with the string), \"STRAND\"
+  \(includes all tokens in the string), \"STROR\" \(includes at
+  least one token in the string), \"STROREQ\" \(is equal to at
+  least one token in the string) or \"STRRX\" \(matches regular
+  expressions of the string).  For operators with tokens, several
+  values for ATTRIBUTE shall be used.
+
+  Numbers can be compared by the operators \"NUMEQ\" \(is equal
+  to the number), \"NUMNE\" \(is not equal to the number),
+  \"NUMGT\" \(is greater than the number), \"NUMGE\" \(is greater
+  than or equal to the number), \"NUMLT\" \(is less than the
+  number), \"NUMLE\" \(is less than or equal to the number) or
+  \"NUMBT\" \(is between the two numbers).  In the last case,
+  there must be two values for ATTRIBUTE.
+
+  If an operator is leaded by \"!\", the meaning is inverted.  If
+  a string operator is leaded by \"I\", the case of the value is
+  ignored.
+
+  The optional :order can be specified only in one condition.  It
+  means, that ATTRIBUTE is used for sorting the results.  The
+  following order operators exist: \"STRA\" \(ascending by
+  string), \"STRD\" \(descending by string), \"NUMA\" \(ascending
+  by number) or \"NUMD\" \(descending by number).
+
+  A special case is an :order, where there is no corresponding
+  attribute value and no operator.  In this case, ATTRIBUTE is
+  not used for the search.
+
+The result of the QUERY is a list of association lists with the
+same attributes as in the conditions.  Additional attributes are
+
+  `id': The bug number.
+
+  `msg_num': The number of the message inside the bug log.
+
+  `snippet': The surrounding text found by the search.  For the
+  syntax of the snippet, consult the hyperestraier user guide.
+
+Examples:
+
+  \(debbugs-search-est
+    '\(:phrase \"armstrong AND debbugs\" :skip 10 :max 2)
+    '\(:severity \"normal\" :operator \"STRINC\")
+    '\(:date :order \"NUMA\"))
+
+  => \(\(\(msg_num . 21)
+       \(date . 1229208302)
+       \(@author . \"Glenn Morris <rgm@gnu.org>\")
+       \(@title . \"Re: bug#1567: Mailing an archived bug\")
+       \(id . 1567)
+       \(severity . \"normal\")
+       \(@cdate . \"Wed, 17 Dec 2008 14:34:50 -0500\")
+       \(snippet . \"...\")
+       \(subject . \"Mailing an archived bug\")
+       \(package . \"debbugs.gnu.org\"))
+      ...)
+
+  ;; Show all messages from me between 2011-08-01 and 2011-08-31.
+  \(debbugs-search-est
+    '\(:max 20)
+    '\(:@author \"me\" :operator \"ISTRINC\")
+    `\(:date
+      ,\(floor \(float-time \(encode-time 0 0 0  1 8 2011)))
+      ,\(floor \(float-time \(encode-time 0 0 0 31 8 2011)))
+      :operator \"NUMBT\"))"
+
+  (let (args result)
+    ;; Compile search arguments.
+    (dolist (elt query)
+      (let (vec kw key val
+           phrase-cond attr-cond)
+
+       ;; Phrase is mandatory, even if empty.
+       (when (and (or  (member :skip elt) (member :max elt))
+                  (not (member :phrase elt)))
+         (setq vec (vector "phrase" "")))
+
+       ;; Parse condition.
+       (while (consp elt)
+         (setq kw (pop elt))
+         (unless (keywordp kw)
+           (error "Wrong keyword: %s" kw))
+         (setq key (substring (symbol-name kw) 1))
+         (case kw
+           ;; Phrase condition.
+           (:phrase
+            ;; It shouldn't happen in an attribute condition.
+            (if attr-cond
+                (error "Wrong keyword: %s" kw))
+            (setq phrase-cond t val (pop elt))
+            ;; Value is a string.
+            (if (stringp val)
+                (setq vec (vconcat vec (list key val)))
+              (error "Wrong %s: %s" key val)))
+
+           ((:skip :max)
+            ;; It shouldn't happen in an attribute condition.
+            (if attr-cond
+                (error "Wrong keyword: %s" kw))
+            (setq phrase-cond t val (pop elt))
+            ;; Value is a number.
+            (if (numberp val)
+                (setq vec (vconcat vec (list key (number-to-string val))))
+              (error "Wrong %s: %s" key val)))
+
+           ;; Attribute condition.
+           ((:submitter :@author)
+            ;; It shouldn't happen in a phrase condition.
+            (if phrase-cond
+                (error "Wrong keyword: %s" kw))
+            (if (not (stringp (car elt)))
+                (setq vec (vconcat vec (list key "")))
+              ;; Value is an email address.
+              (while (and (stringp (car elt))
+                          (string-match "\\`\\S-+\\'" (car elt)))
+                (when (string-equal "me" (car elt))
+                  (setcar elt user-mail-address))
+                (when (string-match "<\\(.+\\)>" (car elt))
+                  (setcar elt (match-string 1 (car elt))))
+                (add-to-list 'val (pop elt) 'append))
+              (setq vec
+                    (vconcat vec (list key (mapconcat 'identity val " "))))))
+
+           (:status
+            ;; It shouldn't happen in a phrase condition.
+            (if phrase-cond
+                (error "Wrong keyword: %s" kw))
+            (setq attr-cond t)
+            (if (not (stringp (car elt)))
+                (setq vec (vconcat vec (list key "")))
+              ;; Possible values: "done", "forwarded" and "open"
+              (while  (and (stringp (car elt))
+                           (string-match
+                            "\\`\\(done\\|forwarded\\|open\\)\\'" (car elt)))
+                (add-to-list 'val (pop elt) 'append))
+              (setq vec
+                    (vconcat vec (list key (mapconcat 'identity val " "))))))
+
+           ((:subject :package :tags :severity :@title)
+            ;; It shouldn't happen in a phrase condition.
+            (if phrase-cond
+                (error "Wrong keyword: %s" kw))
+            (setq attr-cond t)
+            (if (not (stringp (car elt)))
+                (setq vec (vconcat vec (list key "")))
+              ;; Just a string.
+              (while (stringp (car elt))
+                (add-to-list 'val (pop elt) 'append))
+              (setq vec
+                    (vconcat vec (list key (mapconcat 'identity val " "))))))
+
+           ((:date :@cdate)
+            ;; It shouldn't happen in a phrase condition.
+            (if phrase-cond
+                (error "Wrong keyword: %s" kw))
+            (setq attr-cond t)
+            (if (not (numberp (car elt)))
+                (setq vec (vconcat vec (list key "")))
+              ;; Just a number.
+              (while (numberp (car elt))
+                (add-to-list 'val (pop elt) 'append))
+              (setq vec
+                    (vconcat
+                     vec (list key (mapconcat 'number-to-string val " "))))))
+
+           ((:operator :order)
+            ;; It shouldn't happen in a phrase condition.
+            (if phrase-cond
+                (error "Wrong keyword: %s" kw))
+            (setq attr-cond t val (pop elt))
+            ;; Value is a number.
+            (if (stringp val)
+                (setq vec (vconcat vec (list key val)))
+              (error "Wrong %s: %s" key val)))
+
+           (t (error "Unknown key: %s" kw))))
+
+       (setq args (vconcat args (list vec)))))
+
+    (setq result
+         (car (soap-invoke debbugs-wsdl debbugs-port "search_est" args)))
+    ;; The result contains lists (key value).  We transform it into
+    ;; cons cells (key . value).
+    (dolist (elt1 result result)
+      (dolist (elt2 elt1)
+       (setcdr elt2 (cadr elt2))))))
+
+(defun debbugs-get-attribute (bug-or-message attribute)
+  "Return the value of key ATTRIBUTE.
+
+BUG-OR-MESSAGE must be list element returned by either
+`debbugs-get-status' or `debbugs-get-bug-log'.
+
+Example: Return the originator of last submitted bug.
+
+\(debbugs-get-attribute
+  \(car \(apply 'debbugs-get-status \(debbugs-newest-bugs 1))) 'originator)"
+  (cdr (assoc attribute bug-or-message)))
+
+(defun debbugs-get-message-numbers (messages)
+  "Return the message numbers of MESSAGES.
+MESSAGES must be the result of a `debbugs-get-bug-log' call."
+  (mapcar (lambda (x) (debbugs-get-attribute x 'msg_num)) messages))
+
+(defun debbugs-get-message (messages message-number)
+  "Return the message MESSAGE-NUMBER of MESSAGES.
+MESSAGES must be the result of a `debbugs-get-bug-log' call.
+
+The returned message is a list of strings.  The first element are
+the header lines of the message, the second element is the body
+of the message.  Further elements of the list, if any, are
+attachments of the message.
+
+If there is no message with MESSAGE-NUMBER, the function returns `nil'.
+
+Example: Return the first message of last submitted bug.
+
+\(let \(\(messages \(apply 'debbugs-get-bug-log \(debbugs-newest-bugs 1))))
+  \(debbugs-get-message messages
+                      \(car \(debbugs-get-message-numbers messages))))"
+  (while (and messages
+             (/= (debbugs-get-attribute (car messages) 'msg_num)
+                 message-number))
+    (setq messages (cdr messages)))
+  (when messages
+    (append (list (debbugs-get-attribute (car messages) 'header)
+                 (debbugs-get-attribute (car messages) 'body))
+           (debbugs-get-attribute (car messages) 'attachments))))
+
+(defun debbugs-get-mbox (bug-number mbox-type &optional filename)
+  "Download mbox with messages of bug BUG-NUMBER from Debbugs server.
+BUG-NUMBER is a number of bug.  It must be of integer type.
+
+MBOX-TYPE specifies a type of mbox and can be one of the
+following symbols:
+
+   `mboxfolder': Download mbox folder.
+
+   `mboxmaint': Download maintainer's mbox.
+
+   `mboxstat', `mboxstatus': Download status mbox.  The use of
+   either symbol depends on actual Debbugs server configuration.
+   For gnu.org, use the former; for debian.org - the latter.
+
+FILENAME, if non-`nil', is the name of file to store mbox.  If
+FILENAME is `nil', the downloaded mbox is inserted into the
+current buffer."
+  (let (url (mt "") bn)
+    (unless (setq url (plist-get
+                      (cdr (assoc debbugs-port debbugs-servers))
+                      :bugreport-url))
+      (error "URL of bugreport script for port %s is not specified"
+            debbugs-port))
+    (setq bn (format "bug=%s;" (number-to-string bug-number)))
+    (unless (eq mbox-type 'mboxfolder)
+      (if (memq mbox-type '(mboxmaint mboxstat mboxstatus))
+         (setq mt (concat (symbol-name mbox-type) "=yes;"))
+       (error "Unknown mbox type: %s" mbox-type)))
+    (setq url (concat url (format "?%s%smbox=yes" bn mt)))
+    (if filename
+       (url-copy-file url filename t)
+      (url-insert-file-contents url))))
+
+(provide 'debbugs)
+
+;;; TODO:
+
+;; * SOAP interface extensions (wishlist).
+;;   - Server-side sorting.
+;;   - Regexp and/or wildcards search.
+;;   - Returning message attachments.
+
+;;; debbugs.el ends here
diff --git a/packages/debbugs/debbugs.texi b/packages/debbugs/debbugs.texi
new file mode 100644 (file)
index 0000000..ecebf72
--- /dev/null
@@ -0,0 +1,562 @@
+\input texinfo
+@setfilename debbugs.info
+@settitle Debbugs programmer's manual
+
+@dircategory Emacs
+@direntry
+* Debbugs: (debbugs).  A library for communication with Debbugs.
+@end direntry
+
+@copying
+Copyright @copyright{} 2011-2013 Free Software Foundation, Inc.
+
+@quotation
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with the Front-Cover, or Back-Cover Texts.  A copy of
+the license is included in the section entitled ``GNU Free Documentation
+License'' in the Emacs manual.
+
+This document is part of a collection distributed under the GNU Free
+Documentation License.  If you want to distribute this document
+separately from the collection, you can do so by adding a copy of the
+license to the document, as described in section 6 of the license.
+
+All Emacs Lisp code contained in this document may be used, distributed,
+and modified without restriction.
+@end quotation
+@end copying
+
+@titlepage
+@title Debbugs Programmer's Manual
+@author by Evgeny M. Zubok
+@page
+@insertcopying
+@end titlepage
+
+@contents
+
+@node Top
+@top Debbugs Programmer's Manual
+
+Debbugs is a bugtracking system (BTS) that was initially written for
+the Debian project but actually used also by the GNU project.  The
+main distinctive feature of Debbugs is that it's mostly email-based.
+All actions on bug reports: opening, closing, changing the status,
+commenting, forwarding are performed via email by sending specially
+composed letters to the particular mail addresses.  However, searching
+the bug reports, querying bug report status and viewing comments have
+been web-based for a long time.  To overcome this inconvenience the
+Debbugs/SOAP service was introduced.
+
+The Debbugs/SOAP service provides the means for developers to write
+client applications that can send the queries with certain search
+criteria to the Debbugs server and retrieve a set of bug reports that
+match them.  The developer may also ask the Debbugs server for
+additional information about every bug report (e.g. subject, date,
+originator, tags and etc.) and get all comments and attachments.
+
+@code{debbugs}, described in this document, is the Emacs library that
+exposes to developers the available functions provided by the Debbugs
+server.  @code{debbugs} uses Emacs' SOAP client library for
+communication with the Debbugs server.  In tandem with Emacs' email
+facilities, @code{debbugs} provides a solution for building
+applications that interact with the Debbugs BTS directly from Emacs
+without addressing Debbugs' web interface.
+
+@menu
+* Installation::                Getting and installing @code{debbugs}.
+* Configuration::               Configuring @code{debbugs}.
+* Requesting bug numbers::      How to request bug report numbers.
+* Requesting bugs statuses::    How to request the status of bug reports.
+* Requesting messages::         How to get messages from bug reports.
+* Requesting user tags::        How to request tags set by users.
+@end menu
+
+@node Installation
+@chapter Installation
+
+@subheading Installation on Emacs 24 or later
+
+Install @code{debbugs} from the @ref{Packaging, ELPA repository, , elisp}.
+
+@subheading Installation on Emacs 22 and Emacs 23
+
+If you want to install @code{debbugs} on Emacs 22/23, you will need to
+install the @code{soap-client} library first.  It can be downloaded from
+the @uref{http://code.google.com/p/emacs-soap-client/, Emacs SOAP client
+project page}.
+
+Compile the library and add it into your @code{load-path}:
+
+@example
+(add-to-list 'load-path "/path/to/emacs-soap-client/")
+@end example
+
+@code{debbugs} library can be downloaded from the
+@uref{http://elpa.gnu.org/packages/, ELPA repository}.  Compile it and
+set the @code{load-path}:
+
+@example
+(add-to-list 'load-path "/path/to/debbugs/")
+@end example
+
+@subheading Installation on Emacs 21
+
+We have not tried yet to install @code{debbugs} on Emacs 21.  We would
+definitely say that the installation will require even more additional
+libraries than needed for installation on Emacs 22/23.
+
+@node Configuration
+@chapter Configuration
+
+@code{debbugs} is already configured to work with two main ports of
+Debbugs BTS: @uref{http://bugs.debian.org} and
+@uref{http://debbugs.gnu.org}.  So if you intend to use one of these
+ports, you don't need to configure @code{debbugs}.  If you want to
+interact with a Debbugs port other than those listed, you have to
+configure @code{debbugs} by adding a new server specifier to the
+@code{debbugs-servers} variable.  The actual port can be selected by
+the @code{debbugs-port} variable.
+
+@defvar debbugs-servers
+List of Debbugs server specifiers.  Each entry is a list that contains a
+string identifying the port name and the server parameters in
+keyword-value form.  The list initially contains two predefined and
+configured Debbugs servers: @code{"gnu.org"} and @code{"debian.org"}.
+
+Valid keywords are:
+
+@table @code
+@item :wsdl
+Location of WSDL.  The value is a string with the URL that should
+return the WSDL specification of the Debbugs/SOAP service.  This
+keyword is intended for future use, it is ignored currently.
+
+@item :bugreport-url
+The URL of the server script (@code{bugreport.cgi} in the default
+Debbugs installation) that provides the access to mboxes with messages
+from bug reports.
+@end table
+
+Example.  Add a new Debbugs port with name "foobars.net":
+
+@example
+(add-to-list
+ 'debbugs-servers
+ '("foobars.net"
+   :wsdl "http://bugs.foobars.net/cgi/soap.cgi?WSDL"
+   :bugreport-url "http://bugs.foobars.net/cgi/bugreport.cgi"))
+@end example
+@end defvar
+
+@defvar debbugs-port
+This variable holds the name of the currently used port.  The value of
+the variable corresponds to the Debbugs server to be accessed, either
+@code{"gnu.org"} or @code{"debian.org"}, or a user defined port name.
+@end defvar
+
+@node Requesting bug numbers
+@chapter Requesting bug numbers
+
+In Debbugs BTS, the bug number is the unique identifier of a bug
+report.  The functions described in this section return from the
+Debbugs server the list of bug numbers that match a user's query.
+
+@defun debbugs-get-bugs &rest query
+This function returns a list of bug numbers that match the
+@var{query}. @var{query} is a sequence of keyword-value pairs where the
+values are strings, i.e. :KEYWORD ``VALUE'' [:KEYWORD ``VALUE'']*
+
+The keyword-value pair is a subquery.  The keywords are allowed to
+have multiple occurrence within the query at any place.  The
+subqueries with the same keyword form the logical subquery, which
+returns the union of bugs of every subquery it contains.
+
+The result of the @var{query} is an intersection of results of all
+subqueries.
+
+Valid keywords are:
+
+@table @code
+@item :package
+The value is the name of the package a bug belongs to, like @code{"emacs"},
+@code{"coreutils"}, @code{"gnus"}, or @code{"tramp"}.
+
+@item :src
+This is used to retrieve bugs that belong to source with given name.
+
+@item :severity
+This is the severity of the bug.  The exact set of available severities
+depends on the policy of a particular Debbugs port:
+
+Debian port:
+@code{"critical"}, @code{"grave"}, @code{"serious"},
+@code{"important"}, @code{"normal"}, @code{"minor"}, @code{"wishlist"},
+and @code{"fixed"}.
+
+GNU port:
+@code{"serious"}, @code{"important"}, @code{"normal"}, @code{"minor"},
+@code{"wishlist"}.
+
+@item :tag
+An arbitrary string the bug is annotated with.  Usually, this is used
+to mark the status of the bug.  The list of possible tags depends on
+the Debbugs port.
+
+Debian port: @code{"patch"}, @code{"wontfix"}, @code{"moreinfo"},
+@code{"unreproducible"}, @code{"fixed"}, @code{"potato"},
+@code{"woody"}, @code{"sid"}, @code{"help"}, @code{"security"},
+@code{"upstream"}, @code{"pending"}, @code{"sarge"},
+@code{"sarge-ignore"}, @code{"experimental"}, @code{"d-i"},
+@code{"confirmed"}, @code{"ipv6"}, @code{"lfs"},
+@code{"fixed-in-experimental"}, @code{"fixed-upstream"}, @code{"l10n"},
+@code{"etch"}, @code{"etch-ignore"}, @code{"lenny"},
+@code{"lenny-ignore"}, @code{"squeeze"}, @code{"squeeze-ignore"},
+@code{"wheezy"}, @code{"wheezy-ignore"}. The actual list of tags can be
+found on @uref{http://www.debian.org/Bugs/Developer#tags}.
+
+GNU port: @code{"fixed"}, @code{"notabug"}, @code{"wontfix"},
+@code{"unreproducible"}, @code{"moreinfo"}, @code{"patch"},
+@code{"pending"}, @code{"help"}, @code{"security"}, @code{"confirmed"}.
+See @url{http://debbugs.gnu.org/Developer.html#tags} for the actual list
+of tags.
+
+@item :owner
+This is used to identify bugs by the owner's email address.  The
+special email address @code{"me"} is used as pattern, replaced with
+the variable @code{user-mail-address} (@pxref{(elisp)User
+Identification}).
+
+@item :submitter
+With this keyword it is possible to filter bugs by the submitter's
+email address.  The special email address @code{"me"} is used as
+pattern, replaced with the variable @code{user-mail-address}.
+
+@item :maint
+This is used to find bugs of the packages which are maintained by the
+person with the given email address.  The special email address
+@code{"me"} is used as pattern, replaced with @code{user-mail-address}.
+
+@item :correspondent
+This allows to find bug reports where the person with the given email
+address has participated.  The special email address @code{"me"} is used
+as pattern, replaced with @code{user-mail-address}.
+
+@item :affects
+With this keyword it is possible to find bugs which affect the package
+with the given name.  The bugs are chosen by the value of field
+@code{affects} in bug's status.  The returned bugs do not necessary
+belong to this package.
+
+@item :status
+Status of bug.  Valid values are @code{"done"}, @code{"forwarded"} and
+@code{"open"}.
+
+@item :archive
+A keyword to filter for bugs which are already archived, or not.  Valid
+values are @code{"0"} (not archived), @code{"1"} (archived) or
+@code{"both"}.  If this keyword is not given in the query,
+@code{:archive "0"} is assumed by default.
+@end table
+
+Example.  Get all opened and forwarded release critical bugs for the
+packages which are maintained by @code{"me"} and which have a patch:
+
+@example
+(let ((debbugs-port "debian.org"))
+  (debbugs-get-bugs :maint "me" :tag "patch"
+                    :severity "critical"
+                    :status "open"
+                    :severity "grave"
+                    :status "forwarded"
+                    :severity "serious"))
+@end example
+@end defun
+
+@defun debbugs-newest-bugs amount
+This function returns a list of bug numbers, according to @var{amount}
+(a number) of latest bugs.
+
+Example.  Get the latest six bug report numbers from Debian BTS:
+
+@example
+(let ((debbugs-port "debian.org"))
+  (debbugs-newest-bugs 6))
+@result{} (633152 633153 633154 633155 633156 633157)
+@end example
+@end defun
+
+@node Requesting bugs statuses
+@chapter Requesting bugs statuses
+
+Bug status is a collection of fields that holds the information about
+the state and importance of the bug report, about originator, owner and
+various aspects of relationship with other bug reports.
+
+@defun debbugs-get-status &rest bug-numbers
+Return a list of status entries for the bug reports identified by
+@var{bug-numbers}.  Every returned entry is an association list with the
+following attributes:
+
+@table @code
+@item id
+@itemx bug_num
+The bug number.
+
+@item package
+A list of package names the bug belongs to.
+
+@item severity
+The severity of the bug report.  Possible values are the same as for
+@code{:severity} in @code{debbugs-get-bugs} (@pxref{Requesting bug
+numbers}).
+
+@item tags
+The status of the bug report, a list of strings.  Possible values are the
+same as for @code{:tags} in @code{debbugs-get-bugs} (@pxref{Requesting
+bug numbers}).
+
+@item pending
+The string @code{"pending"}, @code{"forwarded"} or @code{"done"}.
+
+@item subject
+Subject/Title of the bugreport.
+
+@item originator
+The E-mail address of the bug report submitter.
+
+@item mergedwith
+A list of bug numbers this bug was merged with.
+
+@item source
+Source package name of the bug report.
+
+@item date
+Date of bug creation.  Encoded as UNIX time.
+
+@item log_modified
+@itemx last_modified
+Date of last update.  Encoded as UNIX time.
+
+@item found_date
+@itemx fixed_date
+Date of bug report / bug fix (empty for now).  Encoded as UNIX time.
+
+@item done
+The E-mail address of the worker who has closed the bug (if done).
+
+@item archived
+@code{t} if the bug is archived, @code{nil} otherwise.
+
+@item unarchived
+The date the bug has been unarchived, if ever.  Encoded as UNIX time.
+
+@item found_versions
+@itemx fixed_versions
+List of version strings.
+
+@item forwarded
+A URL or an E-mail address.
+
+@item blocks
+A list of bug numbers this bug blocks.
+
+@item blockedby
+A list of bug numbers this bug is blocked by.
+
+@item msgid
+The message id of the initial bug report.
+
+@item owner
+Who is responsible for fixing.
+
+@item location
+Always the string @code{"db-h"} or @code{"archive"}.
+
+@item affects
+A list of package names.
+
+@item summary
+Arbitrary text.
+@end table
+
+Example.  Get the status of bug number #10 from GNU BTS:
+
+@example
+(let ((debbugs-port "gnu.org"))
+  (debbugs-get-status 10))
+@result{}
+(((source . "unknown") (found_versions) (done) (blocks)
+  (date . 1203606305.0) (fixed) (fixed_versions) (mergedwith)
+  (found) (unarchived) (blockedby) (keywords) (summary)
+  (msgid . "<87zltuz7eh.fsf@@freemail.hu>") (id . 10)
+  (forwarded) (severity . "wishlist")
+  (owner . "Magnus Henoch <*****@@freemail.hu>")
+  (log_modified . 1310061242.0) (location . "db-h")
+  (subject . "url-gw should support HTTP CONNECT proxies")
+  (originator . "Magnus Henoch <*****@@freemail.hu>")
+  (last_modified . 1310061242.0) (pending . "pending") (affects)
+  (archived) (tags) (fixed_date) (package "emacs") (found_date)
+  (bug_num . 10)))
+@end example
+@end defun
+
+@defun debbugs-get-attribute bug-or-message attribute
+General accessor that returns the value of key @var{attribute}.
+@var{bug-or-message} must be a list element returned by either
+@code{debbugs-get-status} or @code{debbugs-get-bug-log}
+(@pxref{Requesting messages}).
+
+Example.  Return the originator of the last submitted bug report:
+
+@example
+(let ((debbags-port "gnu.org"))
+  (debbugs-get-attribute
+   (car (apply 'debbugs-get-status (debbugs-newest-bugs 1)))
+   'originator))
+@result{} "Jack Daniels <jack@@daniels.com>"
+@end example
+@end defun
+
+@node Requesting messages
+@chapter Requesting messages
+
+@defun debbugs-get-bug-log bug-number
+Returns a list of messages related to @var{bug-number}.  Every message is
+an association list with the following attributes:
+
+@table @code
+@item msg_num
+The number of the message inside the bug log.  The numbers are ascending,
+newer messages have a higher number.
+@item header
+The header lines from the E-mail messages, as arrived at the bug
+tracker.
+@item body
+The message body.
+@item attachments
+A list of possible attachments, or @code{nil}.  Not implemented yet server
+side.
+@end table
+@end defun
+
+@defun debbugs-get-message-numbers messages
+Returns the message numbers of @var{messages}.  @var{messages} must be
+the result of a @code{debbugs-get-bug-log} call.
+
+Example.  Get message numbers from bug report #456789 log from Debian
+BTS:
+
+@example
+(let ((debbugs-port "debian.org"))
+   (debbugs-get-message-numbers (debbugs-get-bug-log 456789)))
+@result{} (5 10 12)
+@end example
+@end defun
+
+@defun debbugs-get-message messages message-number
+Returns the message @var{message-number} of
+@var{messages}.  @var{messages} must be the result of a
+@code{debbugs-get-bug-log} call.  The returned message is a list of
+strings.  The first element are the header lines of the message, the
+second element is the body of the message.  Further elements of the list,
+if any, are attachments of the message.  If there is no message with
+@var{message-number}, the function returns @code{nil}.
+
+Example: Return the first message of the last submitted bug report to
+GNU BTS:
+
+@example
+(let* ((debbugs-port "gnu.org")
+       (messages (apply 'debbugs-get-bug-log
+                       (debbugs-newest-bugs 1))))
+  (debbugs-get-message
+   messages
+   (car (debbugs-get-message-numbers messages))))
+@end example
+@end defun
+
+@defun debbugs-get-mbox bug-number mbox-type &optional filename
+Download mbox with all messages from bug report
+@var{bug-number}.  @var{mbox-type} specifies a type of mbox and can be
+one of the following symbols:
+
+@table @code
+@item mboxfolder
+Download mbox folder, i.e. mbox with messages as they arrived at the
+Debbugs server.
+
+@item mboxmaint
+Download maintainer's mbox, i.e. mbox with messages as they are resent
+from the Debbugs server.
+
+@item mboxstat
+@itemx mboxstatus
+Download status mbox.  The use of either symbol depends on the actual
+Debbugs server configuration.  For @code{"gnu.org"}, use the former;
+for @code{"debian.org} - the latter.
+@end table
+
+@var{filename}, if non-@code{nil}, is the name of the file to store
+mbox.  If @var{filename} is @code{nil}, the downloaded mbox is
+inserted into the current buffer.
+
+Note, that mbox downloading will work only if the
+@code{:bugreport-url} field of the @code{debbugs-servers} variable is
+specified (@pxref{Configuration}).
+@end defun
+
+@node Requesting user tags
+@chapter Requesting user tags
+
+A user tag is a string, a user has assigned to one or several bugs.
+The user is identified by an email address.  The port @code{"gnu.org"}
+uses also package names as user identification.
+
+@defun debbugs-get-usertag &rest query
+Return a list of bug numbers which match @var{query}.
+
+@var{query} is a sequence of keyword-value pairs where the values are
+strings, i.e. :KEYWORD ``VALUE'' [:KEYWORD ``VALUE'']*
+
+Valid keywords are:
+
+@table @code
+@item :user
+The value is the name of the package a bug belongs to, like
+@code{"emacs"}, @code{"coreutils"}, or @code{"tramp"}.  It can also be
+an email address of a user who has applied a user tag.  The special
+email address @code{"me"} is used as pattern, replaced with
+@code{user-mail-address}.  There must be at least one such entry; it
+is recommended to have exactly one.
+
+@item :tag
+A string applied as user tag.  Often, it is a subproduct
+identification, like @code{"cedet"} or @code{"tramp"} for the package
+@code{"emacs"}.
+@end table
+
+If there is no @code{:tag} entry, no bug numbers will be returned but
+a list of existing user tags for @code{:user}.
+
+Example.  Get all user tags for the package @code{"emacs"}:
+
+@example
+(let ((debbugs-port "gnu.org"))
+  (debbugs-get-usertag :user "emacs"))
+@result{} ("www" "solaris" "ls-lisp" "cygwin")
+@end example
+
+Get all bugs tagged by package @code{"emacs"} with @code{"www"} or
+@code{"cygwin"})):
+
+@example
+(let ((debbugs-port "gnu.org"))
+  (debbugs-get-usertag :user "emacs" :tag "www" :tag "cygwin"))
+@result{} (807 1223 5637)
+@end example
+@end defun
+
+@bye
diff --git a/packages/dict-tree/dict-tree.el b/packages/dict-tree/dict-tree.el
new file mode 100644 (file)
index 0000000..2ba3bdb
--- /dev/null
@@ -0,0 +1,3446 @@
+;;; dict-tree.el --- Dictionary data structure
+
+;; Copyright (C) 2004-2012  Free Software Foundation, Inc
+
+;; Author: Toby Cubitt <toby-predictive@dr-qubit.org>
+;; Version: 0.12.8
+;; Keywords: extensions, matching, data structures
+;;           trie, tree, dictionary, completion, regexp
+;; Package-Requires: ((trie "0.2.5") (tNFA "0.1.1") (heap "0.3"))
+;; URL: http://www.dr-qubit.org/emacs.php
+
+;; This file is part of 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 <http://www.gnu.org/licenses/>.
+
+
+;;; Commentary:
+;;
+;; A dictionary is used to store strings, along with arbitrary data associated
+;; with each string. As well as basic data insertion, manipulation and
+;; retrieval, a dictionary can perform prefix searches on those strings,
+;; retrieving all strings with a given prefix in either alphabetical or any
+;; other order (see the `dictree-complete' and `dictree-complete-ordered'
+;; functions), and is able to cache results in order to speed up those
+;; searches. The package also provides persistent storage of the data
+;; structures to files.
+;;
+;; You create a dictionary using `dictree-create', add entries to it using
+;; `dictree-insert', lookup entries using `dictree-lookup', find completions
+;; of sequences using `dictree-complete', find completions and sort them in
+;; any order you speficy using `dictree-complete-ordered', map over it using
+;; `dictree-map' and `dictree-mapcar', save it to a file using `dictree-save'
+;; or `dictree-write', and load from file it using `dictree-load'. Various
+;; other useful functions are also provided.
+;;
+;; This package uses the trie package trie.el. the tagged NFA package tNFA.el,
+;; and the heap package heap.el.
+
+
+;;; Code:
+
+(eval-when-compile (require 'cl))
+(require 'trie)
+(require 'tNFA)
+(require 'bytecomp)
+
+
+
+;;; ================================================================
+;;;            Replacements for CL and Elisp functions
+
+;; copied from cl-extra.el
+(defun dictree--subseq (seq start &optional end)
+  "Return the subsequence of SEQ from START to END.
+If END is omitted, it defaults to the length of the sequence.
+If START or END is negative, it counts from the end."
+  (if (stringp seq) (substring seq start end)
+    (let (len)
+      (and end (< end 0) (setq end (+ end (setq len (length seq)))))
+      (when (< start 0)
+       (setq start (+ start (or len (setq len (length seq))))))
+      (cond ((listp seq)
+            (if (> start 0) (setq seq (nthcdr start seq)))
+            (if end
+                (let ((res nil))
+                  (while (>= (setq end (1- end)) start)
+                    (push (pop seq) res))
+                  (nreverse res))
+              (copy-sequence seq)))
+           (t
+            (or end (setq end (or len (length seq))))
+            (let ((res (make-vector (max (- end start) 0) nil))
+                  (i 0))
+              (while (< start end)
+                (aset res i (aref seq start))
+                (setq i (1+ i) start (1+ start)))
+              res))))))
+
+
+
+;; `goto-line' without messing around with mark and messages
+;; Note: This is a bug in simple.el. There's clearly a place for
+;;       non-interactive calls to goto-line from Lisp code, and there's
+;;       no warning against doing this in the documentation. Yet
+;;       goto-line *always* calls push-mark, which usually *shouldn't*
+;;       be invoked by Lisp programs, as its docstring warns.
+(defmacro dictree--goto-line (line)
+  "Goto line LINE, counting from line 1 at beginning of buffer."
+  `(progn
+     (goto-char 1)
+     (if (eq selective-display t)
+        (re-search-forward "[\n\C-m]" nil 'end (1- ,line))
+       (forward-line (1- ,line)))))
+
+
+
+;;; ====================================================================
+;;;  Internal functions and variables for use in the dictionary package
+
+(defvar dictree-loaded-list nil
+  "Stores list of loaded dictionaries.")
+
+
+;; ----------------------------------------------------------------
+;;                   Dictionary data cell structures
+
+;; Note: It would be more elegant to use a defstruct for the data cells,
+;;       but the problem is that the resulting setf in
+;;       `dictree--wrap-insfun' won't get expanded into the cell-data
+;;       accessor function at compile-time because it's burried inside a
+;;       backquote construct. Not only is it inelegant to have to expand
+;;       macros at run-time whenever `dictree--wrap-insfun' is called,
+;;       but it also requires the 'cl-macs package to be loaded at
+;;       run-time rather than just at compile-time. We could use
+;;       `lexical-let' instead, but it doesn't seem worth it here.
+
+;; wrap data in a cons cell
+(defalias 'dictree--cell-create 'cons)  ; INTERNAL USE ONLY
+
+;; get data component from data cons cell
+(defalias 'dictree--cell-data 'car)  ; INTERNAL USE ONLY
+
+;; get property list component from data cons cell
+(defalias 'dictree--cell-plist 'cdr)  ; INTERNAL USE ONLY
+
+;; set data component of data cons cell
+(defalias 'dictree--cell-set-data 'setcar)  ; INTERNAL USE ONLY
+
+;; set property list component of data cons cell
+(defalias 'dictree--cell-set-plist 'setcdr)  ; INTERNAL USE ONLY
+
+;; define setf methods so we can use setf abstraction wherever possible
+(defsetf dictree--cell-data dictree--cell-set-data)
+(defsetf dictree--cell-plist dictree--cell-set-plist)
+
+
+;; ----------------------------------------------------------------
+;;                 Dictionary cache entry structures
+
+;; Note: We *could* us a defstruct for the cache entries, but for
+;;       something this simple it doesn't seem worth it, especially
+;;       given that we're using the defalias approach anyway for the
+;;       data cells (above).
+
+;; Construct and return a completion cache entry
+(defalias 'dictree--cache-create 'cons)  ; INTERNAL USE ONLY
+
+;; Return the completions list for cache entry CACHE
+(defalias 'dictree--cache-results 'car)  ; INTERNAL USE ONLY
+
+;; Return the max number of completions returned for cache entry CACHE
+(defalias 'dictree--cache-maxnum 'cdr)  ; INTERNAL USE ONLY
+
+;; Set the completions list for cache entry CACHE
+(defalias 'dictree--cache-set-completions 'setcar)  ; INTERNAL USE ONLY
+
+;; Set the completions list for cache entry CACHE
+(defalias 'dictree--cache-set-maxnum 'setcdr)  ; INTERNAL USE ONLY
+
+
+;; ----------------------------------------------------------------
+;;                     Wrapping functions
+
+(defun dictree--wrap-insfun (insfun)  ; INTERNAL USE ONLY
+  ;; return wrapped insfun to deal with data wrapping
+  `(lambda (new old)
+     (dictree--cell-set-data old (,insfun (dictree--cell-data new)
+                                         (dictree--cell-data old)))
+     old))
+
+(defun dictree--wrap-rankfun (rankfun)  ; INTERNAL USE ONLY
+  ;; return wrapped rankfun to deal with data wrapping
+  `(lambda (a b)
+     (,rankfun (cons (car a) (dictree--cell-data (cdr a)))
+              (cons (car b) (dictree--cell-data (cdr b))))))
+
+(defun dictree--wrap-combfun (combfun)  ; INTERNAL USE ONLY
+  ;; return wrapped combfun to deal with data wrapping
+  `(lambda (cell1 cell2)
+     (cons (,combfun (dictree--cell-data cell1)
+                    (dictree--cell-data cell2))
+          (append (dictree--cell-plist cell1)
+                  (dictree--cell-plist cell2)))))
+
+(defun dictree--wrap-filter (filter)  ; INTERNAL USE ONLY
+  ;; return wrapped filter function to deal with data wrapping
+  `(lambda (key data) (,filter key (dictree--cell-data data))))
+
+(defun dictree--wrap-resultfun (resultfun)  ; INTERNAL USE ONLY
+  ;; return wrapped result function to deal with data wrapping
+  `(lambda (res) (,resultfun (car res) (dictree--cell-data (cdr res)))))
+
+
+
+;; ----------------------------------------------------------------
+;;                 The dictionary data structures
+
+(defstruct
+  (dictree-
+   :named
+   (:constructor nil)
+   (:constructor dictree--create
+                (&optional
+                 filename
+                 (name (and filename
+                            (file-name-sans-extension
+                             (file-name-nondirectory filename))))
+                 autosave
+                 unlisted
+                 (comparison-function '<)
+                 (insert-function (lambda (a b) a))
+                 (rank-function (lambda (a b) (> (cdr a) (cdr b))))
+                 (cache-policy 'time)
+                 (cache-update-policy 'synchronize)
+                 lookup-cache-threshold
+                 complete-cache-threshold
+                 complete-ranked-cache-threshold
+                 regexp-cache-threshold
+                 regexp-ranked-cache-threshold
+                 key-savefun key-loadfun
+                 data-savefun data-loadfun
+                 plist-savefun plist-loadfun
+                 trie-type
+                 &aux
+                 (modified nil)
+                 (trie (trie-create comparison-function))
+                 (insfun (dictree--wrap-insfun insert-function))
+                 (rankfun (dictree--wrap-rankfun rank-function))
+                 (lookup-cache
+                  (if lookup-cache-threshold
+                      (make-hash-table :test 'equal)
+                    nil))
+                 (complete-cache
+                  (if complete-cache-threshold
+                      (make-hash-table :test 'equal)
+                    nil))
+                 (complete-ranked-cache
+                  (if complete-ranked-cache-threshold
+                      (make-hash-table :test 'equal)
+                    nil))
+                 (regexp-cache
+                  (if regexp-cache-threshold
+                      (make-hash-table :test 'equal)
+                    nil))
+                 (regexp-ranked-cache
+                  (if regexp-ranked-cache-threshold
+                      (make-hash-table :test 'equal)
+                    nil))
+                 (metadict-list nil)
+                 ))
+   (:constructor dictree--create-custom
+                (&optional
+                 filename
+                 (name (and filename
+                            (file-name-sans-extension
+                             (file-name-nondirectory filename))))
+                 autosave
+                 unlisted
+                 (comparison-function '<)
+                 (insert-function (lambda (a b) a))
+                 (rank-function (lambda (a b) (> (cdr a) (cdr b))))
+                 (cache-policy 'time)
+                 (cache-update-policy 'synchronize)
+                 lookup-cache-threshold
+                 complete-cache-threshold
+                 complete-ranked-cache-threshold
+                 regexp-cache-threshold
+                 regexp-ranked-cache-threshold
+                 key-savefun key-loadfun
+                 data-savefun data-loadfun
+                 plist-savefun plist-loadfun
+                 &key
+                 createfun insertfun deletefun
+                 lookupfun mapfun emptyfun
+                 stack-createfun stack-popfun stack-emptyfun
+                 transform-for-print transform-from-read
+                 &aux
+                 (modified nil)
+                 (trie (trie-create-custom
+                        comparison-function
+                        :createfun createfun
+                        :insertfun insertfun
+                        :deletefun deletefun
+                        :lookupfun lookupfun
+                        :mapfun mapfun
+                        :emptyfun emptyfun
+                        :stack-createfun stack-createfun
+                        :stack-popfun stack-popfun
+                        :stack-emptyfun stack-emptyfun
+                        :transform-for-print transform-for-print
+                        :transform-from-read transform-from-read))
+                 (insfun (dictree--wrap-insfun insert-function))
+                 (rankfun (dictree--wrap-rankfun rank-function))
+                 (lookup-cache
+                  (if lookup-cache-threshold
+                      (make-hash-table :test 'equal)
+                    nil))
+                 (complete-cache
+                  (if complete-cache-threshold
+                      (make-hash-table :test 'equal)
+                    nil))
+                 (complete-ranked-cache
+                  (if complete-ranked-cache-threshold
+                      (make-hash-table :test 'equal)
+                    nil))
+                 (regexp-cache
+                  (if regexp-cache-threshold
+                      (make-hash-table :test 'equal)
+                    nil))
+                 (regexp-ranked-cache
+                  (if regexp-ranked-cache-threshold
+                      (make-hash-table :test 'equal)
+                    nil))
+                 (metadict-list nil)
+                 ))
+   (:copier dictree--copy))
+  name filename autosave modified
+  comparison-function insert-function insfun rank-function rankfun
+  cache-policy cache-update-policy
+  lookup-cache lookup-cache-threshold
+  complete-cache complete-cache-threshold
+  complete-ranked-cache complete-ranked-cache-threshold
+  regexp-cache regexp-cache-threshold
+  regexp-ranked-cache regexp-ranked-cache-threshold
+  key-savefun key-loadfun
+  data-savefun data-loadfun
+  plist-savefun plist-loadfun
+  trie meta-dict-list)
+
+
+(defstruct
+  (dictree--meta-dict
+   :named
+   (:constructor nil)
+   (:constructor dictree--meta-dict-create
+                (dictionary-list
+                 &optional
+                 filename
+                 (name (file-name-sans-extension
+                        (file-name-nondirectory filename)))
+                 autosave
+                 unlisted
+                 (combine-function '+)
+                 (cache-policy 'time)
+                 (cache-update-policy 'synchronize)
+                 lookup-cache-threshold
+                 complete-cache-threshold
+                 complete-ranked-cache-threshold
+                 regexp-cache-threshold
+                 regexp-ranked-cache-threshold
+                 &aux
+                 (dictlist
+                  (mapcar
+                   (lambda (dic)
+                     (cond
+                      ((dictree-p dic) dic)
+                      ((symbolp dic) (eval dic))
+                      (t (error "Invalid object in DICTIONARY-LIST"))))
+                   dictionary-list))
+                 (combfun (dictree--wrap-combfun combine-function))
+                 (lookup-cache
+                  (if lookup-cache-threshold
+                      (make-hash-table :test 'equal)
+                    nil))
+                 (complete-cache
+                  (if complete-cache-threshold
+                      (make-hash-table :test 'equal)
+                    nil))
+                 (complete-ranked-cache
+                  (if complete-ranked-cache-threshold
+                      (make-hash-table :test 'equal)
+                    nil))
+                 (regexp-cache
+                  (if regexp-cache-threshold
+                      (make-hash-table :test 'equal)
+                    nil))
+                 (regexp-ranked-cache
+                  (if regexp-ranked-cache-threshold
+                      (make-hash-table :test 'equal)
+                    nil))
+                 ))
+   (:copier dictree--meta-dict-copy))
+  name filename autosave modified
+  combine-function combfun
+  cache-policy cache-update-policy
+  lookup-cache lookup-cache-threshold
+  complete-cache complete-cache-threshold
+  complete-ranked-cache complete-ranked-cache-threshold
+  regexp-cache regexp-cache-threshold
+  regexp-ranked-cache regexp-ranked-cache-threshold
+  dictlist meta-dict-list)
+
+
+
+;; ----------------------------------------------------------------
+;;           Miscelaneous internal functions and macros
+
+(defun dictree--trielist (dict)
+  ;; Return a list of all the tries on which DICT is based. If DICT is a
+  ;; meta-dict, this recursively descends the hierarchy, gathering all
+  ;; the tries from the base dictionaries.
+  (let (accumulate)
+    (dictree--do-trielist dict)
+    accumulate))
+
+(defun dictree--do-trielist (dict)
+  (declare (special accumulate))
+  (if (dictree-meta-dict-p dict)
+      (mapc 'dictree--do-trielist (dictree--meta-dict-dictlist dict))
+    (setq accumulate (cons (dictree--trie dict) accumulate))))
+
+
+(defun dictree--merge (list1 list2 cmpfun &optional combfun maxnum)
+  ;; Destructively merge together sorted lists LIST1 and LIST2, sorting
+  ;; elements according to CMPFUN. For non-null MAXNUM, only the first
+  ;; MAXNUM are kept. For non-null COMBFUN, duplicate elements will be
+  ;; merged by passing the two elements as arguments to COMBFUN, and
+  ;; using the return value as the merged element.
+  (or (listp list1) (setq list1 (append list1 nil)))
+  (or (listp list2) (setq list2 (append list2 nil)))
+  (let (res (i 0))
+
+    ;; build up result list backwards
+    (while (and list1 list2 (or (null maxnum) (< (incf i) maxnum)))
+      ;; move smaller element to result list
+      (if (funcall cmpfun (car list1) (car list2))
+         (push (pop list1) res)
+       (if (funcall cmpfun (car list2) (car list1))
+           (push (pop list2) res)
+         ;; if elements are equal, merge them for non-null COMBFUN
+         (if combfun
+             (push (funcall combfun (pop list1) (pop list2))
+                   res)
+           ;; otherwise, add both to result list, in order
+           (push (pop list1) res)
+           (push (pop list2) res)))))
+
+    ;; return result if we already have MAXNUM entries
+    (if (and maxnum (= i maxnum))
+       (nreverse res)
+      ;; otherwise, return result plus enough leftover entries to make
+      ;; up MAXNUM (only one of list1 or list2 will be non-nil)
+      (let (tmp)
+       (or (null maxnum)
+           (and (setq tmp (nthcdr (- maxnum i 1) list1))
+                (setcdr tmp nil))
+           (and (setq tmp (nthcdr (- maxnum i 1) list2))
+                (setcdr tmp nil)))
+       (nconc (nreverse res) list1 list2)))
+    ))
+
+
+;; (defun dictree--merge-sort (list sortfun &optional combfun)
+;;   ;; Destructively sort LIST according to SORTFUN, combining
+;;   ;; identical elements using COMBFUN if supplied.
+;;   (dictree--do-merge-sort list (/ (length list) 2) sortfun combfun))
+
+
+;; (defun dictree--do-merge-sort (list1 len sortfun combfun)
+;;   ;; Merge sort LIST according to SORTFUN, combining identical
+;;   ;; elements using COMBFUN.
+;;   (let* ((p (nthcdr (1- len) list1))
+;;      (list2 (cdr p)))
+;;     (setcdr p nil)
+;;     (dictree--merge
+;;      (dictree--do-merge-sort list1 (/ len 2) sortfun combfun)
+;;      (dictree--do-merge-sort list2 (/ len 2) sortfun combfun)
+;;      sortfun combfun)))
+
+
+
+
+;;; ================================================================
+;;;    The (mostly) public functions which operate on dictionaries
+
+;;;###autoload
+(defun make-dictree
+  (&optional
+   name filename autosave unlisted
+   comparison-function insert-function rank-function
+   cache-policy cache-update-policy
+   lookup-cache-threshold
+   complete-cache-threshold
+   complete-ranked-cache-threshold
+   regexp-cache-threshold
+   regexp-ranked-cache-threshold
+   key-savefun key-loadfun
+   data-savefun data-loadfun
+   plist-savefun plist-loadfun
+   trie-type)
+  "Create an empty dictionary and return it.
+
+If NAME is supplied, the dictionary is stored in the variable
+NAME. Defaults to FILENAME stripped of directory and
+extension. (Regardless of the value of NAME, the dictionary will
+be stored in the default variable name when it is reloaded from
+file.)
+
+FILENAME supplies a directory and file name to use when saving
+the dictionary. If the AUTOSAVE flag is non-nil, then the
+dictionary will automatically be saved to this file when it is
+unloaded or when exiting Emacs.
+
+If UNLISTED is non-nil, the dictionary will not be added to the
+list of loaded dictionaries. Note that this disables autosaving.
+
+COMPARE-FUNCTION sets the function used to compare elements of
+the keys. It should take two arguments, A and B, both of the type
+contained by the sequences used as keys \(e.g. if the keys will
+be strings, the function will be passed two characters\). It
+should return t if the first is \"less than\" the
+second. Defaults to `<'.
+
+INSERT-FUNCTION sets the function used to insert data into the
+dictionary. It should take two arguments: the new data, and the
+data already in the dictionary, and should return the data to
+insert. Defaults to replacing any existing data with the new
+data.
+
+RANK-FUNCTION sets the function used to rank the results of
+`dictree-complete'. It should take two arguments, each a cons
+whose car is a dictree key (a sequence) and whose cdr is the data
+associated with that key. It should return non-nil if the first
+argument is \"better\" than the second, nil otherwise. It
+defaults to \"lexical\" comparison of the keys, ignoring the data
+\(which is not very useful, since an unranked `dictree-complete'
+query already does this much more efficiently\).
+
+CACHE-POLICY should be a symbol ('time, 'length, or 'both), which
+determines which query operations are cached. The 'time setting
+caches queries that take longer (in seconds) than the
+corresponding CACHE-THRESHOLD value. The 'length setting caches
+lookups of key sequences that are longer than
+LOOKUP-CACHE-THRESHOLD value (since those are likely to be the
+slower ones), and caches completions of prefixes that are shorter
+than the corresponding CACHE-THRESHOLD (since those are likely to
+be the slower ones in that case). The setting 'both requires both
+conditions to be satisfied simultaneously. In this case,
+CACHE-THRESHOLD must be a plist with properties :time and :length
+specifying the corresponding cache thresholds.
+
+CACHE-UPDATE-POLICY should be a symbol ('synchronize or 'delete),
+which determines how the caches are updated when data is inserted
+or deleted. The former updates tainted cache entries, which makes
+queries faster but insertion and deletion slower, whereas the
+latter deletes any tainted cache entries, which makes queries
+slower but insertion and deletion faster.
+
+The CACHE-THRESHOLD settings set the threshold for caching the
+corresponding dictionary query (lookup, completion, ranked
+completion). The meaning of these values depends on the setting
+of CACHE-POLICY (see above).
+
+All CACHE-THRESHOLD's default to nil. The values nil and t are
+special. If a CACHE-THRESHOLD is set to nil, no caching is done
+for that type of query. If it is t, everything is cached for that
+type of query \(similar behaviour can be obtained by setting the
+CACHE-THRESHOLD to 0, but it is better to use t\).
+
+KEY-SAVEFUN, DATA-SAVEFUN and PLIST-SAVEFUN are functions used to
+convert keys, data and property lists into lisp objects that have
+a valid read syntax, for writing to file. DATA-SAVEFUN and
+PLIST-SAVEFUN are used when saving the dictionary (see
+`dictree-save' and `dictree-write'), and all three functions are
+used when dumping the contents of the dictionary \(see
+`dictree-dump-to-buffer' and `dictree-dump-to-file'\).
+KEY-SAVEFUN, DATA-SAVEFUN and PLIST-SAVEFUN should each accept
+one argument: a key, data or property list from DICT,
+respectively. They should return a lisp object which has a valid
+read syntax. When defining these functions, be careful not to
+accidentally modify the lisp object in the dictionary; usually,
+you will need to make a copy before converting it.
+
+KEY-LOADFUN, DATA-LOADFUN and PLIST-LOADFUN are used to convert
+keys, data and property lists back again when loading a
+dictionary (only DATA-LOADFUN and PLIST-LOADFUN, see
+`dictree-save' and `dictree-write') or populating it from a
+file (all three, see `dictree-populate-from-file'). They should
+accept one argument: a lisp object of the type produced by the
+corresponding SAVEFUN, and return a lisp object to use in the
+loaded dictionary.
+
+TRIE-TYPE sets the type of trie to use as the underlying data
+structure. See `trie-create' for details."
+
+  ;; sadly, passing null values over-rides the defaults in the defstruct
+  ;; dictree--create, so we have to explicitly set the defaults again
+  ;; here
+  (or name (setq name (and filename (file-name-sans-extension
+                                    (file-name-nondirectory filename)))))
+  (or comparison-function (setq comparison-function '<))
+  (or insert-function (setq insert-function (lambda (a b) a)))
+  (or rank-function (setq rank-function (lambda (a b) (> (cdr a) (cdr b)))))
+  (or cache-policy (setq cache-policy 'time))
+  (or cache-update-policy (setq cache-update-policy 'synchronize))
+
+  (let ((dict
+        (dictree--create
+         filename (when name (symbol-name name)) autosave unlisted
+         comparison-function insert-function rank-function
+         cache-policy cache-update-policy
+         lookup-cache-threshold
+         complete-cache-threshold
+         complete-ranked-cache-threshold
+         regexp-cache-threshold
+         regexp-ranked-cache-threshold
+         key-savefun key-loadfun
+         data-savefun data-loadfun
+         plist-savefun plist-loadfun
+         trie-type)))
+    ;; store dictionary in variable NAME
+    (when name (set name dict))
+    ;; add it to loaded dictionary list, unless it's unlisted
+    (unless (or (null name) unlisted)
+      (push dict dictree-loaded-list))
+    dict))
+
+
+;;;###autoload
+(defalias 'dictree-create 'make-dictree)
+
+
+;;;###autoload
+(defun* make-dictree-custom
+    (&optional
+     name filename autosave unlisted
+     &key
+     comparison-function insert-function rank-function
+     cache-policy cache-update-policy
+     lookup-cache-threshold
+     complete-cache-threshold
+     complete-ranked-cache-threshold
+     regexp-cache-threshold
+     regexp-ranked-cache-threshold
+     key-savefun key-loadfun
+     data-savefun data-loadfun
+     plist-savefun plist-loadfun
+     createfun insertfun deletefun lookupfun mapfun emptyfun
+     stack-createfun stack-popfun stack-emptyfun
+     transform-for-print transform-from-read)
+  "Create an empty dictionary and return it.
+
+The NAME through PLIST-LOADFUN arguments are as for
+`dictree-create' (which see).
+
+The remaining arguments control the type of trie to use as the
+underlying data structure. See `trie-create' for details."
+
+  ;; sadly, passing null values over-rides the defaults in the defstruct
+  ;; dictree--create, so we have to explicitly set the defaults again
+  ;; here
+  (or name (setq name (and filename (file-name-sans-extension
+                                    (file-name-nondirectory filename)))))
+  (or comparison-function (setq comparison-function '<))
+  (or insert-function (setq insert-function (lambda (a b) a)))
+  (or rank-function (setq rank-function (lambda (a b) (< (cdr a) (cdr b)))))
+  (or cache-policy (setq cache-policy 'time))
+  (or cache-update-policy (setq cache-update-policy 'synchronize))
+
+  (let ((dict
+        (dictree--create-custom
+         filename (when name (symbol-name name)) autosave unlisted
+         comparison-function insert-function rank-function
+         cache-policy cache-update-policy
+         lookup-cache-threshold
+         complete-cache-threshold
+         complete-ranked-cache-threshold
+         regexp-cache-threshold
+         regexp-ranked-cache-threshold
+         key-savefun key-loadfun
+         data-savefun data-loadfun
+         plist-savefun plist-loadfun
+         :createfun createfun
+         :insertfun insertfun
+         :deletefun deletefun
+         :lookupfun lookupfun
+         :mapfun mapfun
+         :emptyfun emptyfun
+         :stack-createfun stack-createfun
+         :stack-popfun stack-popfun
+         :stack-emptyfun stack-emptyfun
+         :transform-for-print transform-for-print
+         :transform-from-read transform-from-read)))
+    ;; store dictionary in variable NAME
+    (when name (set name dict))
+    ;; add it to loaded dictionary list, unless it's unlisted
+    (unless (or (null name) unlisted)
+      (push dict dictree-loaded-list))
+    dict))
+
+
+;;;###autoload
+(defalias 'dictree-create-custom 'make-dictree-custom)
+
+
+;;;###autoload
+(defun make-dictree-meta-dict
+  (dictionary-list
+   &optional
+   name filename autosave unlisted
+   combine-function
+   cache-policy cache-update-policy
+   lookup-cache-threshold
+   complete-cache-threshold
+   complete-ranked-cache-threshold
+   regexp-cache-threshold
+   regexp-ranked-cache-threshold)
+  "Create a meta-dictionary based on the list of dictionaries
+in DICTIONARY-LIST.
+
+COMBINE-FUNCTION is used to combine data from different
+dictionaries. It is passed two pieces of data, each an
+association of the same key, but in different dictionaries. It
+should return a combined datum.
+
+The other arguments are as for `dictree-create'. Note that
+caching is only possible if NAME is supplied, otherwise the
+cache-threshold arguments are ignored."
+
+  ;; sadly, passing null values over-rides the defaults in the defstruct
+  ;; `dictree--create', so we have to explicitly set the defaults again
+  ;; here
+  (or name (setq name (and filename
+                          (file-name-sans-extension
+                           (file-name-nondirectory filename)))))
+  (or combine-function (setq combine-function '+))
+  (or cache-policy (setq cache-policy 'time))
+  (or cache-update-policy (setq cache-update-policy 'synchronize))
+
+  (let ((dict
+        (dictree--meta-dict-create
+         dictionary-list filename (when name (symbol-name name))
+         autosave unlisted
+         combine-function
+         cache-policy cache-update-policy
+         (when name lookup-cache-threshold)
+         (when name complete-cache-threshold)
+         (when name complete-ranked-cache-threshold)
+         (when name regexp-cache-threshold)
+         (when name regexp-ranked-cache-threshold))
+        ))
+    ;; store dictionary in variable NAME
+    (when name (set name dict))
+    ;; add it to loaded dictionary list, unless it's unlisted
+    (unless (or (null name) unlisted)
+      (push dict dictree-loaded-list))
+    ;; update meta-dict-list cells of constituent dictionaries
+    (unless (or (null name)
+               (not (or lookup-cache-threshold
+                        complete-cache-threshold
+                        complete-ranked-cache-threshold
+                        regexp-cache-threshold
+                        regexp-ranked-cache-threshold)))
+      (mapc
+       (lambda (dic)
+        (if (symbolp dic) (setq dic (eval dic)))
+        (setf (dictree--meta-dict-list dic)
+              (cons dict (dictree--meta-dict-list dic))))
+       dictionary-list))
+    dict))
+
+(defalias 'dictree-create-meta-dict 'make-dictree-meta-dict)
+
+
+;;;###autoload
+(defun dictree-p (obj)
+  "Return t if OBJ is a dictionary tree, nil otherwise."
+  (or (dictree--p obj) (dictree--meta-dict-p obj)))
+
+
+(defalias 'dictree-meta-dict-p 'dictree--meta-dict-p
+  "Return t if argument is a meta-dictionary, nil otherwise.")
+
+(defun dictree-empty-p (dict)
+  "Return t if the dictionary DICT is empty, nil otherwise."
+  (if (dictree--meta-dict-p dict)
+      (catch 'nonempty
+       (mapc (lambda (dic)
+               (if (not (dictree-empty-p dic)) (throw 'nonempty t)))
+             (dictree--meta-dict-dictlist dict)))
+    (trie-empty (dictree--trie dict))))
+
+(defsubst dictree-autosave (dict)
+  "Return dictionary's autosave flag."
+  (if (dictree--meta-dict-p dict)
+      (dictree--meta-dict-autosave dict)
+    (dictree--autosave dict)))
+
+(defsetf dictree-autosave (dict) (val)
+  ;; setf method for dictionary autosave flag
+  `(if (dictree--meta-dict-p ,dict)
+       (setf (dictree--meta-dict-autosave ,dict) ,val)
+     (setf (dictree--autosave ,dict) ,val)))
+
+(defsubst dictree-modified (dict)
+  "Return dictionary's modified flag."
+  (if (dictree--meta-dict-p dict)
+      (dictree--meta-dict-modified dict)
+    (dictree--modified dict)))
+
+(defsetf dictree-modified (dict) (val)
+  ;; setf method for dictionary modified flag
+  `(if (dictree--meta-dict-p ,dict)
+       (setf (dictree--meta-dict-modified ,dict) ,val)
+     (setf (dictree--modified ,dict) ,val)))
+
+(defsubst dictree-name (dict)
+  "Return dictionary DICT's name."
+  (if (dictree--meta-dict-p dict)
+      (dictree--meta-dict-name dict)
+    (dictree--name dict)))
+
+(defsetf dictree-name (dict) (name)
+  ;; setf method for dictionary name
+  `(if (dictree--meta-dict-p ,dict)
+       (setf (dictree--meta-dict-name ,dict) ,name)
+    (setf (dictree--name ,dict) ,name)))
+
+(defsubst dictree-filename (dict)
+  "Return dictionary DICT's associated file name."
+  (if (dictree--meta-dict-p dict)
+      (dictree--meta-dict-filename dict)
+    (dictree--filename dict)))
+
+(defsetf dictree-filename (dict) (filename)
+  ;; setf method for dictionary filename
+  `(if (dictree--meta-dict-p ,dict)
+       (setf (dictree--meta-dict-filename ,dict) ,filename)
+     (setf (dictree--filename ,dict) ,filename)))
+
+(defun dictree-comparison-function (dict)
+  "Return dictionary DICT's comparison function."
+  (if (dictree--meta-dict-p dict)
+      (dictree-comparison-function
+       (car (dictree--meta-dict-dictlist dict)))
+    (dictree--comparison-function dict)))
+
+(defalias 'dictree-insert-function 'dictree--insert-function
+  "Return the insertion function for dictionary DICT.")
+
+(defun dictree-rank-function (dict)
+  "Return the rank function for dictionary DICT"
+  (if (dictree--meta-dict-p dict)
+      (dictree-rank-function (car (dictree--meta-dict-dictlist dict)))
+    (dictree--rank-function dict)))
+
+(defun dictree-rankfun (dict)
+  ;; Return the rank function for dictionary DICT
+  (if (dictree--meta-dict-p dict)
+      (dictree-rankfun (car (dictree--meta-dict-dictlist dict)))
+    (dictree--rankfun dict)))
+
+(defalias 'dictree-meta-dict-combine-function
+  'dictree--meta-dict-combine-function
+  "Return the combine function for meta-dictionary DICT.")
+
+(defalias 'dictree-meta-dict-dictlist
+  'dictree--meta-dict-dictlist
+  "Return the list of constituent dictionaries
+for meta-dictionary DICT.")
+
+(defsubst dictree-cache-policy (dict)
+  "Return the cache policy for dictionary DICT."
+  (if (dictree--meta-dict-p dict)
+      (dictree--meta-dict-cache-policy dict)
+    (dictree--cache-policy dict)))
+
+(defsubst dictree-cache-update-policy (dict)
+  "Return the cache update policy for dictionary DICT."
+  (if (dictree--meta-dict-p dict)
+      (dictree--meta-dict-cache-update-policy dict)
+    (dictree--cache-update-policy dict)))
+
+(defsubst dictree-lookup-cache-threshold (dict)
+  "Return the lookup cache threshold for dictionary DICT."
+  (if (dictree--meta-dict-p dict)
+      (dictree--meta-dict-lookup-cache-threshold dict)
+    (dictree--lookup-cache-threshold dict)))
+
+(defsetf dictree-lookup-cache-threshold (dict) (param)
+  ;; setf method for lookup cache threshold
+  `(if (dictree--meta-dict-p ,dict)
+       (setf (dictree--meta-dict-lookup-cache-threshold ,dict)
+            ,param)
+     (setf (dictree--lookup-cache-threshold ,dict)
+          ,param)))
+
+(defsubst dictree-lookup-cache (dict)
+  ;; Return the lookup cache for dictionary DICT.
+  (if (dictree--meta-dict-p dict)
+      (dictree--meta-dict-lookup-cache dict)
+    (dictree--lookup-cache dict)))
+
+(defsubst dictree-complete-cache-threshold (dict)
+  "Return the completion cache threshold for dictionary DICT."
+  (if (dictree--meta-dict-p dict)
+      (dictree--meta-dict-complete-cache-threshold dict)
+    (dictree--complete-cache-threshold dict)))
+
+(defsetf dictree-complete-cache-threshold (dict) (param)
+  ;; setf method for completion cache threshold
+  `(if (dictree--meta-dict-p ,dict)
+       (setf (dictree--meta-dict-complete-cache-threshold ,dict)
+            ,param)
+     (setf (dictree--complete-cache-threshold ,dict)
+          ,param)))
+
+(defun dictree-complete-cache (dict)
+  ;; Return the completion cache for dictionary DICT.
+  (if (dictree--meta-dict-p dict)
+      (dictree--meta-dict-complete-cache dict)
+    (dictree--complete-cache dict)))
+
+(defsubst dictree-complete-ranked-cache-threshold (dict)
+  "Return the ranked completion cache threshold for dictionary DICT."
+  (if (dictree--meta-dict-p dict)
+      (dictree--meta-dict-complete-ranked-cache-threshold dict)
+    (dictree--complete-ranked-cache-threshold dict)))
+
+(defsetf dictree-complete-ranked-cache-threshold (dict) (param)
+  ;; setf method for ranked completion cache threshold
+  `(if (dictree--meta-dict-p ,dict)
+       (setf (dictree--meta-dict-complete-ranked-cache-threshold ,dict)
+            ,param)
+     (setf (dictree--complete-ranked-cache-threshold ,dict)
+          ,param)))
+
+(defun dictree-complete-ranked-cache (dict)
+  ;; Return the ranked completion cache for dictionary DICT.
+  (if (dictree--meta-dict-p dict)
+      (dictree--meta-dict-complete-ranked-cache dict)
+    (dictree--complete-ranked-cache dict)))
+
+(defsubst dictree-regexp-cache-threshold (dict)
+  "Return the regexp cache threshold for dictionary DICT."
+  (if (dictree--meta-dict-p dict)
+      (dictree--meta-dict-regexp-cache-threshold dict)
+    (dictree--regexp-cache-threshold dict)))
+
+(defsetf dictree-regexp-cache-threshold (dict) (param)
+  ;; setf method for regexp cache threshold
+  `(if (dictree--meta-dict-p ,dict)
+       (setf (dictree--meta-dict-regexp-cache-threshold ,dict)
+            ,param)
+     (setf (dictree--regexp-cache-threshold ,dict)
+          ,param)))
+
+(defun dictree-regexp-cache (dict)
+  ;; Return the regexp cache for dictionary DICT.
+  (if (dictree--meta-dict-p dict)
+      (dictree--meta-dict-regexp-cache dict)
+    (dictree--regexp-cache dict)))
+
+(defsubst dictree-regexp-ranked-cache-threshold (dict)
+  "Return the ranked regexp cache threshold for dictionary DICT."
+  (if (dictree--meta-dict-p dict)
+      (dictree--meta-dict-regexp-ranked-cache-threshold dict)
+    (dictree--regexp-ranked-cache-threshold dict)))
+
+(defsetf dictree-regexp-ranked-cache-threshold (dict) (param)
+  ;; setf method for ranked regexp cache threshold
+  `(if (dictree--meta-dict-p ,dict)
+       (setf (dictree--meta-dict-regexp-ranked-cache-threshold ,dict)
+            ,param)
+     (setf (dictree--regexp-ranked-cache-threshold ,dict)
+          ,param)))
+
+(defun dictree-regexp-ranked-cache (dict)
+  ;; Return the ranked regexp cache for dictionary DICT.
+  (if (dictree--meta-dict-p dict)
+      (dictree--meta-dict-regexp-ranked-cache dict)
+    (dictree--regexp-ranked-cache dict)))
+
+
+
+;; ----------------------------------------------------------------
+;;                  Inserting and deleting data
+
+(defun dictree-insert (dict key &optional data insert-function)
+  "Insert KEY and DATA into dictionary DICT.
+If KEY does not already exist, this creates it. How the data is
+inserted depends on the dictionary's insertion function \(see
+`dictree-create'\).
+
+The optional INSERT-FUNCTION over-rides the dictionary's own
+insertion function. If KEY already exists in DICT,
+INSERT-FUNCTION is called with two arguments: the data DATA, and
+the data associated with KEY in the dictionary. Its return value
+becomes the new association for KEY."
+
+  ;; if dictionary is a meta-dictionary, insert key into all the
+  ;; dictionaries it's based on
+  (if (dictree--meta-dict-p dict)
+      (mapc (lambda (dic)
+             (dictree-insert dic key data insert-function))
+           (dictree--meta-dict-dictlist dict))
+
+    ;; otherwise...
+    (let (newdata)
+      ;; set the dictionary's modified flag
+      (setf (dictree-modified dict) t)
+      ;; insert key in dictionary's ternary search tree
+      (setq newdata
+           (trie-insert
+            (dictree--trie dict) key (dictree--cell-create data nil)
+            (or (and insert-function
+                     (dictree--wrap-insfun insert-function))
+                (dictree--insfun dict))))
+      ;; update dictionary's caches
+      (dictree--update-cache dict key newdata)
+      ;; update cache's of any meta-dictionaries based on dict
+      (mapc (lambda (dic) (dictree--update-cache dic key newdata))
+           (dictree--meta-dict-list dict))
+
+      ;; return the new data
+      (dictree--cell-data newdata))))
+
+
+
+(defun dictree-delete (dict key &optional test)
+  "Delete KEY from DICT.
+Returns non-nil if KEY was deleted, nil if KEY was not in DICT.
+
+If TEST is supplied, it should be a function that accepts three
+arguments: the key being deleted, its associated data, and its
+associated property list. The key will then only be deleted if
+TEST returns non-nil."
+
+  (let ((dictree--delete-test test)
+       deleted del)
+    (cond
+     ;; if DICT is a meta-dictionary, delete KEY from all dictionaries
+     ;; it's based on
+     ((dictree--meta-dict-p dict)
+      (dolist (dic (dictree--meta-dict-dictlist dict))
+       (when (setq del (dictree-delete dic key))
+         (setq deleted (cons del deleted))))
+      (setf (dictree-modified dict) (and deleted t))
+      (setq deleted (nreverse deleted)))
+
+     ;; otherwise...
+     (t
+      (setq deleted
+           (trie-delete (dictree--trie dict) key
+                        (when dictree--delete-test
+                          (lambda (k cell)
+                            (funcall dictree--delete-test
+                                     k (dictree--cell-data cell)
+                                     (dictree--cell-plist cell))))))
+      ;; if key was deleted, have to update the caches
+      (when deleted
+       (dictree--update-cache dict key nil t)
+       (setf (dictree-modified dict) t)
+       ;; update cache's of any meta-dictionaries based on DICT
+       (mapc (lambda (dic)
+               (dictree--update-cache dic key nil t))
+             (dictree--meta-dict-list dict)))))
+
+    ;; return deleted key/data pair
+    (when deleted
+      (cons (car deleted) (dictree--cell-data (cdr deleted))))))
+
+
+
+;; ----------------------------------------------------------------
+;;                     Cache updating
+
+(defun dictree--prefix-p (prefix str)
+  "Return t if PREFIX is a prefix of STR, nil otherwise.
+
+PREFIX and STR can be any sequence type (string, vector, or
+list), but they must both be the same type. PREFIX can also be a
+list of sequences, in which case it returns t if any element of
+PREFIX is a prefix of STR."
+  ;; wrap prefix in a list if necessary
+  ;; FIXME: the test for a list of prefixes, below, will fail if the
+  ;;        PREFIX sequence is a list, and the elements of PREFIX are
+  ;;        themselves lists (there might be no easy way to fully fix
+  ;;        this...)
+  (when (or (atom prefix)
+           (and (listp prefix) (not (sequencep (car prefix)))))
+    (setq prefix (list prefix)))
+  (let (len)
+    (catch 'is-prefix
+      (dolist (pfx prefix)
+       (setq len (length pfx))
+       (when (and (<= len (length str))
+                  (equal pfx (dictree--subseq str 0 len)))
+         (throw 'is-prefix t))))))
+
+
+(defun dictree--above-cache-threshold-p
+  (time length policy threshold &optional cache-long-keys)
+  ;; Return t if query taking TIME seconds for a key of length LENGTH
+  ;; should be cached according to the cache POLICY and
+  ;; THRESHOLD. Otherwise, return nil. Optional argument CACHE-LONG-KEYS
+  ;; means that keys of length longer than THRESHOLD are to be
+  ;; cached. Default is keys of length shorter than THRESHOLD.
+  (and threshold
+       (or (eq threshold t)
+          (and (eq policy 'time) (>= time threshold))
+          ;; note: we cache lookups of *longer* keys, because those are
+          ;;       likely to be slower ones
+          (and (eq policy 'length)
+               (if cache-long-keys
+                   (>= length threshold) (<= length threshold)))
+          (and (eq policy 'both)
+               (or (>= time (plist-get threshold :time))
+                   (if cache-long-keys
+                       (>= length (plist-get threshold :length))
+                     (<= length (plist-get threshold :length))))))))
+
+
+(defun dictree--update-cache (dict key newdata &optional deleted)
+  ;; Synchronise dictionary DICT's caches, given that the data
+  ;; associated with KEY has been changed to NEWDATA, or KEY has been
+  ;; deleted if DELETED is non-nil (NEWDATA is ignored in that case)."
+  (let (arg reverse cache cache-entry completions cmpl maxnum)
+
+    ;; synchronise the lookup cache if dict is a meta-dictionary, since
+    ;; it's not done automatically
+    (when (and (dictree--meta-dict-p dict)
+              (dictree--meta-dict-lookup-cache-threshold dict))
+      (setq cache (dictree--lookup-cache dict))
+      (cond
+       ;; if updating dirty cache entries...
+       ((eq (dictree-cache-update-policy dict) 'synchronize)
+       (when (gethash key cache)
+         (if deleted (remhash key cache) (puthash key newdata cache))))
+       ;; if deleting dirty cache entries...
+       (t (remhash key cache))))
+
+    ;; synchronize the completion cache, if it exists
+    (when (dictree-complete-cache-threshold dict)
+      (setq cache (dictree-complete-cache dict))
+      ;; check every cache entry to see if it matches
+      (maphash
+       (lambda (cache-key cache-entry)
+        (setq arg (car cache-key))
+        (when (dictree--prefix-p arg key)
+          (setq reverse (cdr cache-key))
+           (cond
+            ;; if updating dirty cache entries...
+            ((eq (dictree-cache-update-policy dict) 'synchronize)
+             (dictree--synchronize-completion-cache
+              dict cache-entry arg reverse key newdata deleted))
+            ;; if deleting dirty cache entries...
+            (t (remhash (cons arg reverse) cache)))))
+       cache))
+
+    ;; synchronize the ranked completion cache, if it exists
+    (when (dictree-complete-ranked-cache-threshold dict)
+      (setq cache (dictree-complete-ranked-cache dict))
+      ;; check every cache entry to see if it matches
+      (maphash
+       (lambda (cache-key cache-entry)
+        (setq arg (car cache-key))
+        (when (dictree--prefix-p arg key)
+          (setq reverse (cdr cache-key))
+           (cond
+            ;; if updating dirty cache entries...
+            ((eq (dictree-cache-update-policy dict) 'synchronize)
+             (dictree--synchronize-ranked-completion-cache
+              dict cache-entry arg reverse key newdata deleted))
+            ;; if deleting dirty cache entries...
+            (t (remhash (cons arg reverse) cache)))))
+       cache))
+
+    ;; synchronize the regexp cache, if it exists
+    (when (dictree-regexp-cache-threshold dict)
+      (setq cache (dictree--regexp-cache dict))
+      ;; check every cache entry to see if it matches
+      (maphash
+       (lambda (cache-key cache-entry)
+        (setq arg (car cache-key))
+        (when (tNFA-regexp-match
+               arg key :test (dictree--comparison-function dict))
+          (setq reverse (cdr cache-key))
+          (cond
+           ;; if updating dirty cache entries...
+           ((eq (dictree-cache-update-policy dict) 'synchronize)
+            (dictree--synchronize-regexp-cache
+             dict cache-entry arg reverse key newdata deleted))
+           ;; if deleting dirty cache entries...
+           (t (remhash (cons arg reverse) cache)))))
+       cache))
+
+    ;; synchronize the ranked regexp cache, if it exists
+    (when (dictree-regexp-ranked-cache-threshold dict)
+      (setq cache (dictree-regexp-ranked-cache dict))
+      ;; have to check every cache entry to see if it matches
+      (maphash
+       (lambda (cache-key cache-entry)
+        (setq arg (car cache-key))
+        (when (tNFA-regexp-match
+               arg key :test (dictree--comparison-function dict))
+          (setq reverse (cdr cache-key))
+          (cond
+           ;; if updating dirty cache entries...
+           ((eq (dictree-cache-update-policy dict) 'synchronize)
+            (dictree--synchronize-ranked-regexp-cache
+             dict cache-entry arg reverse key newdata deleted))
+           ;; if deleting dirty cache entries...
+           (t (remhash (cons arg reverse) cache)))))
+       cache))
+    ))
+
+
+
+(defun dictree--synchronize-completion-cache
+  (dict cache-entry arg reverse key newdata deleted)
+  ;; Synchronize DICT's completion CACHE-ENTRY for ARG and REVERSE, for
+  ;; a KEY whose data was either updated to NEWDATA or DELETED.
+  (let* ((completions (dictree--cache-results cache-entry))
+        (maxnum (dictree--cache-maxnum cache-entry))
+        (cmpl (assoc key completions)))
+    ;; if key was...
+    (cond
+     ;; deleted and in cached result: remove cache entry and re-run the
+     ;; same completion to update the cache
+     ((and deleted cmpl)
+      (remhash (cons arg reverse) (dictree-complete-cache dict))
+      (dictree-complete dict arg nil maxnum reverse))
+     ;; modified and not in cached result: merge it into the completion
+     ;; list, retaining only the first maxnum
+     ((and (not deleted) (not cmpl))
+      (dictree--cache-set-completions
+       cache-entry
+       (dictree--merge
+       (list (cons key newdata)) completions
+       `(lambda (a b)
+          (,(trie-construct-sortfun
+             (dictree-comparison-function dict))
+           (car a) (car b)))
+       (when (dictree--meta-dict-p dict)
+         (dictree--meta-dict-combfun dict))
+       maxnum)))
+     ;; modified and in the cached result: update the associated data if
+     ;; dict is a meta-dictionary (this is done automatically for a
+     ;; normal dict)
+     ((and (not deleted) cmpl (dictree--meta-dict-p dict))
+      (setcdr cmpl newdata))
+     ;; deleted and not in cached result: requires no action
+     )))
+
+
+
+(defun dictree--synchronize-ranked-completion-cache
+  (dict cache-entry arg reverse key newdata deleted)
+  ;; Synchronize DICT's ranked completion CACHE-ENTRY for ARG and
+  ;; REVERSE, for a KEY whose data was either updated to NEWDATA or
+  ;; DELETED.
+  (let* ((completions (dictree--cache-results cache-entry))
+        (maxnum (dictree--cache-maxnum cache-entry))
+        (cmpl (assoc key completions))
+        (cache (dictree--complete-ranked-cache dict)))
+    ;; if key was...
+    (cond
+     ;; deleted and in cached result: remove cache entry and re-run the
+     ;; same query to update the cache
+     ((and deleted cmpl)
+      (remhash (cons arg reverse) cache)
+      (dictree-complete dict arg 'ranked maxnum reverse))
+     ;; modified and not in cached result: merge it into the completion
+     ;; list, retaining only the first maxnum
+     ((and (not deleted) (not cmpl))
+      (dictree--cache-set-completions
+       cache-entry
+       (dictree--merge
+       (list (cons key newdata)) completions
+       (dictree-rankfun dict)
+       (when (dictree--meta-dict-p dict)
+         (dictree--meta-dict-combfun dict))
+       maxnum)))
+     ;; modified and in the cached result: update the associated data if
+     ;; dict is a meta-dictionary (this is done automatically for a
+     ;; normal dict), re-sort, and if key is now at end of list re-run
+     ;; the same query to update the cache
+     ((and (not deleted) cmpl)
+      (when (dictree--meta-dict-p dict) (setcdr cmpl newdata))
+      (dictree--cache-set-completions
+       cache-entry (sort completions (dictree-rankfun dict)))
+      (when (equal key (car (last completions)))
+       (remhash (cons arg reverse) cache)
+       (dictree-complete dict arg 'ranked maxnum reverse)))
+     ;; deleted and not in cached result: requires no action
+     )))
+
+
+(defun dictree--synchronize-regexp-cache
+  (dict cache-entry arg reverse key newdata deleted)
+  ;; Synchronize DICT's completion CACHE-ENTRY for ARG and REVERSE, for
+  ;; a KEY whose data was either updated to NEWDATA or DELETED.
+  (let* ((completions (dictree--cache-results cache-entry))
+        (maxnum (dictree--cache-maxnum cache-entry))
+        group-data
+        (cmpl (catch 'found
+                (dolist (c completions)
+                  (if (and (listp (car c))
+                           (or (stringp (caar c))
+                               (vectorp (caar c))
+                               (listp (caar c))))
+                      (when (equal key (caar c)) (throw 'found c))
+                    (when (equal key (car c)) (throw 'found c)))))))
+    ;; if key was...
+    (cond
+     ;; deleted and in cached result: remove cache entry and re-run the
+     ;; same completion to update the cache
+     ((and deleted cmpl)
+      (remhash (cons arg reverse) (dictree-complete-cache dict))
+      (dictree-regexp-search dict arg nil maxnum reverse))
+     ;; modified and not in cached result: merge it into the completion
+     ;; list, retaining only the first maxnum
+     ((and (not deleted) (not cmpl))
+      (save-match-data
+       (set-match-data nil)
+       (tNFA-regexp-match arg key
+                          :test (dictree--comparison-function dict))
+       (when (setq group-data (nthcdr 2 (match-data)))
+         (setq key (cons key group-data))))
+      (dictree--cache-set-completions
+       cache-entry
+       (dictree--merge
+       (list (cons key newdata)) completions
+       `(lambda (a b)
+          (,(trie-construct-sortfun (dictree-comparison-function dict))
+           ,(if group-data '(caar a) '(car a))
+           ,(if group-data '(caar b) '(car b))))
+       (when (dictree--meta-dict-p dict)
+         (dictree--meta-dict-combfun dict))
+       maxnum)))
+     ;; modified and in the cached result: update the associated data if
+     ;; dict is a meta-dictionary (this is done automatically for a
+     ;; normal dict)
+     ((and (not deleted) cmpl (dictree--meta-dict-p dict))
+      (setcdr cmpl newdata))
+     ;; deleted and not in cached result: requires no action
+     )))
+
+
+
+(defun dictree--synchronize-ranked-regexp-cache
+  (dict cache-entry arg reverse key newdata deleted)
+  ;; Synchronize DICT's ranked regexp CACHE-ENTRY for ARG and REVERSE,
+  ;; for a KEY whose data was either updated to NEWDATA or DELETED.
+  (let ((completions (dictree--cache-results cache-entry))
+       (maxnum (dictree--cache-maxnum cache-entry))
+       (cache (dictree--regexp-ranked-cache dict))
+       cmpl group-data)
+    (setq group-data (and (listp (caar completions))
+                         (or (stringp (caar (car completions)))
+                             (vectorp (caar (car completions)))
+                             (listp (caar (car completions))))))
+    (setq cmpl
+         (catch 'found
+           (dolist (c completions)
+             (if group-data
+                 (when (equal key (caar c)) (throw 'found c))
+               (when (equal key (car c)) (throw 'found c))))))
+    ;; if key was...
+    (cond
+     ;; deleted and in cached result: remove cache entry and re-run the
+     ;; same query to update the cache
+     ((and deleted cmpl)
+      (remhash (cons arg reverse) cache)
+      (dictree-regexp-search dict arg 'ranked maxnum reverse))
+     ;; modified and not in cached result: merge it into the completion
+     ;; list, retaining only the first maxnum
+     ((and (not deleted) (not cmpl))
+      (save-match-data
+       (set-match-data nil)
+       (tNFA-regexp-match arg key
+                          :test (dictree--comparison-function dict))
+       (when (setq group-data (nthcdr 2 (match-data)))
+         (setq key (cons key group-data))))
+      (dictree--cache-set-completions
+       cache-entry
+       (dictree--merge
+       (list (cons key newdata)) completions
+       (dictree-rankfun dict)
+       (when (dictree--meta-dict-p dict)
+         (dictree--meta-dict-combfun dict))
+       maxnum)))
+     ;; modified and in the cached result: update the associated data if
+     ;; dict is a meta-dictionary (this is done automatically for a
+     ;; normal dict), re-sort, and if key is now at end of list re-run
+     ;; the same query to update the cache
+     ((and (not deleted) cmpl)
+      (when (dictree--meta-dict-p dict) (setcdr cmpl newdata))
+      (dictree--cache-set-completions
+       cache-entry
+       (sort completions
+            (if group-data
+                `(lambda (a b)
+                   (,(dictree-rankfun dict)
+                    (cons (caar a) (cdr a))
+                    (cons (caar b) (cdr b))))
+              (dictree-rankfun dict))))
+      (when (equal key (car (last completions)))
+       (remhash (cons arg reverse) cache)
+       (dictree-complete dict arg 'ranked maxnum reverse)))
+     ;; deleted and not in cached result: requires no action
+     )))
+
+
+(defun dictree-clear-caches (dict)
+  "Clear all DICT's query caches."
+  (interactive (list (read-dict "Dictionary: ")))
+  (when (and (called-interactively-p 'any) (symbolp dict))
+    (setq dict (eval dict)))
+  (dolist (cachefun '(dictree-lookup-cache
+                     dictree-complete-cache
+                     dictree-complete-ranked-cache
+                     dictree-regexp-cache
+                     dictree-regexp-ranked-cache))
+    (when (funcall cachefun dict)
+      (clrhash (funcall cachefun dict))))
+  (when (called-interactively-p 'interactive)
+    (message "Cleared caches for dictionary %s" (dictree-name dict))))
+
+
+
+
+;; ----------------------------------------------------------------
+;;                        Retrieving data
+
+(defun dictree-member (dict key &optional nilflag)
+  "Return the data associated with KEY in dictionary DICT,
+or nil if KEY is not in the dictionary.
+
+Optional argument NILFLAG specifies a value to return instead of
+nil if KEY does not exist in TREE. This allows a non-existent KEY
+to be distinguished from an element with a null association. (See
+also `dictree-member-p' for testing existence alone.)"
+  (let* ((data (dictree--lookup dict key nilflag)))
+    (if (eq data nilflag)
+       nilflag
+      (dictree--cell-data data))))
+
+(defalias 'dictree-lookup 'dictree-member)
+
+(defun dictree-member-p (dict key)
+  "Return t if KEY exists in DICT, nil otherwise."
+  (let ((flag '(nil)))
+    (not (eq flag (dictree-member dict key flag)))))
+
+
+(defun dictree--lookup (dict key nilflag)
+  ;; Return association of KEY in DICT, or NILFLAG if KEY does not
+  ;; exist. Does not do any data/meta-data unwrapping
+
+  (let* ((flag '(nil))
+        (data flag)
+        time)
+    ;; if KEY is in the cache, then we're done
+    (unless (and (dictree-lookup-cache dict)
+                (setq data (gethash key (dictree--lookup-cache dict))))
+
+      ;; otherwise, we have to look in the dictionary itself...
+      (cond
+       ;; if DICT is a meta-dict, look in its constituent dictionaries
+       ((dictree--meta-dict-p dict)
+       (let (newdata (newflag '(nil)))
+         ;; time the lookup for caching
+         (setq time (float-time))
+         ;; look in each constituent dictionary in turn
+         (dolist (dic (dictree--meta-dict-dictlist dict))
+           (setq newdata (dictree--lookup dic key newflag))
+           ;; skip dictionary if it doesn't contain KEY
+           (unless (eq newdata newflag)
+             ;; if we haven't found KEY before, we have now!
+             (if (eq data flag) (setq data newdata)
+               ;; otherwise, combine the previous data with the new
+               ;; data
+               (setq data (funcall (dictree--meta-dict-combfun dict)
+                                   data newdata)))))
+         (setq time (- (float-time) time))))
+
+       ;; otherwise, DICT is a normal dictionary, so look in it's trie
+       (t
+       ;; time the lookup for caching
+       (setq time (float-time))
+       (setq data (trie-member (dictree--trie dict) key flag))
+       (setq time (- (float-time) time))))
+
+      ;; if lookup found something, and we're above the lookup
+      ;; cache-threshold, cache the result
+      (when (and (not (eq data flag))
+                (dictree--above-cache-threshold-p
+                 time (length key) (dictree-cache-policy dict)
+                 (dictree-lookup-cache-threshold dict) 'long-keys))
+       (setf (dictree-modified dict) t)
+       (puthash key data (dictree-lookup-cache dict))))
+
+    ;; return the desired data
+    (if (eq data flag) nilflag data)))
+
+
+
+;; ----------------------------------------------------------------
+;;                 Getting and setting meta-data
+
+(defun dictree-put-property (dict key property value)
+  "Set PROPERTY for KEY in dictionary DICT.
+PROPERTY should be a symbol. Returns VALUE if successful, nil if
+KEY was not found in DICT.
+
+Note that if DICT is a meta-dictionary, then this will set KEY's
+PROPERTY to VALUE in *all* its constituent dictionaries.
+
+Unlike the data associated with a key (cf. `dictree-insert'),
+properties are not included in the results of queries on the
+dictionary \(`dictree-lookup', `dictree-complete',
+`dictree-complete-ordered'\), nor do they affect the outcome of
+any of the queries. They merely serves to tag a key with some
+additional information, and can only be retrieved using
+`dictree-get-property'."
+
+  ;; sort out arguments
+  (and (symbolp dict) (setq dict (eval dict)))
+  (cond
+   ;; set PROPERTY for KEY in all constituent dicts of a meta-dict
+   ((dictree--meta-dict-p dict)
+    (warn "Setting %s property for key %s in all constituent\
+ dictionaries of meta-dicttionary %s" property key (dictree-name dict))
+    (setf (dictree-modified dict) t)
+    (let (dictree--put-property-ret)
+      (mapc (lambda (dic k p v)
+             (setq dictree--put-property-ret
+                   (or dictree--put-property-ret
+                       (dictree-put-property dic k p v))))
+           (dictree--meta-dict-dictlist dict))
+      ;; return VALUE if KEY was found in at least one constituent dict
+      dictree--put-property-ret))
+   (t  ;; set PROPERTY for KEY in normal dict
+    (let ((cell (trie-member (dictree--trie dict) key)))
+      (when cell
+       (setf (dictree-modified dict) t)
+       (setf (dictree--cell-plist cell)
+             (plist-put (dictree--cell-plist cell) property value))
+       value)))  ; return VALUE
+   ))
+
+
+
+(defun dictree-delete-property (dict key property)
+  "Delete PROPERTY from KEY in dictionary DICT.
+Returns the new property list for KEY, with PROPERTY deleted.
+
+Setting PROPERTY to nil using `dictree-put-property' is not quite
+the same thing as deleting it, since null property values can
+still be detected by supplying the optional argument to
+`dictree-get-propery' (which see).
+
+Note that if DICT is a meta-dictionary, then this will delete
+KEY's PROPERTY in *all* its constituent dictionaries."
+  ;; sort out arguments
+  (and (symbolp dict) (setq dict (eval dict)))
+  (cond
+   ;; delete PROPERTY from KEY in all constituent dicts of a meta-dict
+   ((dictree--meta-dict-p dict)
+    (warn "Deleting %s property from key %s in all constituent\
+ dictionaries of meta-dicttionary %s" property key (dictree-name dict))
+    (setf (dictree-modified dict) t)
+    (mapcar (lambda (dic k p) (dictree-delete-property dic k p))
+           (dictree--meta-dict-dictlist dict)))
+   (t  ;; delete PROPERTY from KEY in normal dict
+    (let* ((cell (trie-member (dictree--trie dict) key))
+          plist tail tail)
+      (when (and cell
+                (setq tail
+                      (plist-member
+                       (setq plist (dictree--cell-plist cell))
+                       property)))
+       (setf (dictree-modified dict) t)
+       ;; delete property and value from plist
+       (setcdr tail (cddr tail))
+       (setq plist (delq property plist))
+       (setf (dictree--cell-plist cell) plist))))
+   ))
+
+
+
+(defun dictree-get-property (dict key property &optional nilflag)
+  "Get the value of PROPERTY for KEY in dictionary DICT,
+or return nil if KEY is not in the dictionary.
+
+Optional argument NILFLAG specifies a value to return instead of
+nil if KEY does not exist in TREE. This allows a non-existent KEY
+to be distinguished from a key for which PROPERTY is not
+set. (See also `dictree-member-p' for testing existence alone.)"
+  (let ((cell (dictree--lookup dict key nilflag)))
+    (unless (eq cell nilflag)
+      (plist-get (dictree--cell-plist cell) property))))
+
+
+
+
+;; ----------------------------------------------------------------
+;;                        Mapping functions
+
+(defun dictree-mapc (function dict &optional type reverse)
+  "Apply FUNCTION to all entries in dictionary DICT,
+for side-effects only.
+
+FUNCTION will be passed two arguments: a key of type
+TYPE ('string, 'vector, or 'list, defaulting to 'vector) from the
+dictionary, and the data associated with that key. The dictionary
+entries will be traversed in \"lexical\" order, i.e. the order
+defined by the dictionary's comparison function (cf.
+`dictree-create').
+
+If TYPE is 'string, it must be possible to apply the function
+`string' to the elements of sequences stored in DICT.
+
+FUNCTION is applied in ascending order, or descending order if
+REVERSE is non-nil.
+
+Note: to avoid nasty dynamic scoping bugs, FUNCTION must *not*
+bind any variables with names commencing \"--\"."
+
+  ;; "rename" FUNCTION to something hopefully unique to lessen the
+  ;; likelihood of dynamic scoping bugs caused by a supplied function
+  ;; binding a variable with the same name as one of the arguments
+  (let ((--dictree-mapc--function function))
+    (dictree--mapc
+     (lambda (key data plist)
+       (funcall --dictree-mapc--function key data))
+     dict type reverse)))
+
+
+
+(defun dictree--mapc (function dict &optional type reverse)
+  ;; Like `dictree-mapc', but FUNCTION is passed three arguments: the
+  ;; key, the data, and the property list, instead of just key and data.
+
+  ;; try to avoid dynamic binding bugs
+  (let ((--dictree--mapc--function function))
+    (if (dictree--meta-dict-p dict)
+       ;; for a meta-dict, use a dictree-stack
+       (let ((stack (dictree-stack dict))
+             entry)
+         (while (setq entry (dictree--stack-pop stack))
+           (funcall --dictree--mapc--function
+                    (car entry)
+                    (dictree--cell-data (cdr entry))
+                    (dictree--cell-plist (cdr entry)))))
+      ;; for a normal dictionary, map the function over its trie
+      (trie-mapc
+       (lambda (key cell)
+        (funcall --dictree--mapc--function
+                 key
+                 (dictree--cell-data cell)
+                 (dictree--cell-plist cell)))
+       (dictree--trie dict)
+       type reverse)
+      )))
+
+
+
+(defun dictree-mapf (function combinator dict &optional type reverse)
+  "Apply FUNCTION to all entries in dictionary DICT,
+and combine the results using COMBINATOR.
+
+FUNCTION should take two arguments: a key sequence from the
+dictionary and its associated data.
+
+Optional argument TYPE (one of the symbols vector, lisp or
+string; defaults to vector) sets the type of sequence passed to
+FUNCTION. If TYPE is 'string, it must be possible to apply the
+function `string' to the individual elements of key sequences
+stored in DICT.
+
+The FUNCTION will be applied and the results combined in
+asscending \"lexical\" order (i.e. the order defined by the
+dictionary's comparison function; cf. `dictree-create'), or
+descending order if REVERSE is non-nil.
+
+Note: to avoid nasty dynamic scoping bugs, FUNCTION and
+COMBINATOR must *not* bind any variables with names
+commencing \"--\"."
+
+  ;; try to avoid dynamic scoping bugs
+  (let ((--dictree-mapf--function function)
+       (--dictree-mapf--combinator combinator))
+
+    ;; for a normal dictionary, map the function over its trie
+    (if (not (dictree--meta-dict-p dict))
+       (trie-mapf
+        `(lambda (key data)
+           (,--dictree-mapf--function key (dictree--cell-data data)))
+        --dictree-mapf--combinator (dictree--trie dict) type reverse)
+
+      ;; for a meta-dict, use a dictree-stack
+      (let ((--dictree-mapf--stack (dictree-stack dict))
+           --dictree-mapf--entry
+           --dictree-mapf--accumulate)
+       (while (setq --dictree-mapf--entry
+                    (dictree-stack-pop --dictree-mapf--stack))
+         (setq --dictree-mapf--accumulate
+               (funcall --dictree-mapf--combinator
+                        (funcall --dictree-mapf--function
+                                 (car --dictree-mapf--entry)
+                                 (cdr --dictree-mapf--entry))
+                        --dictree-mapf--accumulate)))
+       --dictree-mapf--accumulate))))
+
+
+
+(defun dictree-mapcar (function dict &optional type reverse)
+  "Apply FUNCTION to all entries in dictionary DICT,
+and make a list of the results.
+
+FUNCTION should take two arguments: a key sequence from the
+dictionary and its associated data.
+
+Optional argument TYPE (one of the symbols vector, lisp or
+string; defaults to vector) sets the type of sequence passed to
+FUNCTION. If TYPE is 'string, it must be possible to apply the
+function `string' to the individual elements of key sequences
+stored in DICT.
+
+The FUNCTION will be applied and the results combined in
+asscending \"lexical\" order \(i.e. the order defined by the
+dictionary's comparison function; cf. `dictree-create'\), or
+descending order if REVERSE is non-nil.
+
+Note that if you don't care about the order in which FUNCTION is
+applied, just that the resulting list is in the correct order,
+then
+
+  (trie-mapf function 'cons trie type (not reverse))
+
+is more efficient.
+
+Note: to avoid nasty dynamic scoping bugs, FUNCTION must *not*
+bind any variables with names commencing \"--\"."
+  (nreverse (dictree-mapf function 'cons dict type)))
+
+
+
+(defun dictree-size (dict)
+  "Return the number of entries in dictionary DICT.
+Interactively, DICT is read from the mini-buffer."
+  (interactive (list (read-dict "Dictionary: ")))
+  (when (and (called-interactively-p 'any) (symbolp dict))
+    (setq dict (eval dict)))
+  (let ((count 0))
+    (dictree-mapc (lambda (&rest dummy) (incf count)) dict)
+    (when (called-interactively-p 'interactive)
+      (message "Dictionary %s contains %d entries"
+              (dictree--name dict) count))
+    count))
+
+
+
+;; ----------------------------------------------------------------
+;;                        Using dictrees as stacks
+
+;; A dictree--meta-stack is the meta-dict version of a dictree-stack
+;; (the ordinary version is just a single trie-stack). It consists of a
+;; heap of trie-stacks for its constituent tries, where the heap order
+;; is the usual lexical order over the keys at the top of the
+;; trie-stacks.
+
+(defstruct
+  (dictree--meta-stack
+   (:constructor nil)
+   (:constructor dictree--meta-stack-create
+                (dict &optional (type 'vector) reverse
+                 &aux
+                 (combfun (dictree--meta-dict-combfun dict))
+                 (sortfun (trie-construct-sortfun
+                           (dictree-comparison-function dict)))
+                 (heap (heap-create
+                        (dictree--construct-meta-stack-heapfun sortfun)
+                        (length (dictree--trielist dict))))
+                 (pushed '())
+                 (dummy (mapc
+                         (lambda (dic)
+                           (heap-add
+                            heap (trie-stack dic type reverse)))
+                         (dictree--trielist dict)))))
+   (:constructor dictree--complete-meta-stack-create
+                (dict prefix &optional reverse
+                 &aux
+                 (combfun (dictree--meta-dict-combfun dict))
+                 (sortfun (trie-construct-sortfun
+                           (dictree-comparison-function dict)))
+                 (heap (heap-create
+                        (dictree--construct-meta-stack-heapfun
+                         sortfun reverse)
+                        (length (dictree--trielist dict))))
+                 (pushed '())
+                 (dummy (mapc
+                         (lambda (trie)
+                           (let ((stack (trie-complete-stack
+                                         trie prefix reverse)))
+                             (unless (trie-stack-empty-p stack)
+                               (heap-add heap stack))))
+                         (dictree--trielist dict)))))
+      (:constructor dictree--regexp-meta-stack-create
+                (dict regexp &optional reverse
+                 &aux
+                 (combfun (dictree--meta-dict-combfun dict))
+                 (sortfun (trie-construct-sortfun
+                           (dictree-comparison-function dict)))
+                 (heap (heap-create
+                        (dictree--construct-meta-stack-heapfun
+                         sortfun reverse)
+                        (length (dictree--trielist dict))))
+                 (pushed '())
+                 (dummy (mapc
+                         (lambda (trie)
+                           (let ((stack (trie-regexp-stack
+                                         trie regexp reverse)))
+                             (unless (trie-stack-empty-p stack)
+                               (heap-add heap stack))))
+                         (dictree--trielist dict)))))
+   (:copier nil))
+  combfun sortfun heap pushed)
+
+
+
+(defun dictree--construct-meta-stack-heapfun (sortfun &optional reverse)
+  ;; Wrap SORTFUN, which sorts keys, so it can act on
+  ;; dictree--meta-stack elements.
+  (if reverse
+      `(lambda (b a) (,sortfun (car (dictree-stack-first a))
+                              (car (dictree-stack-first b))))
+    `(lambda (a b) (,sortfun (car (dictree-stack-first a))
+                            (car (dictree-stack-first b))))))
+
+
+(defun dictree-stack (dict &optional type reverse)
+  "Create an object that allows DICT to be accessed as a stack.
+
+The stack is sorted in \"lexical\" order, i.e. the order defined
+by the DICT's comparison function, or in reverse order if REVERSE
+is non-nil. Calling `dictree-stack-pop' pops the top element (a
+key and its associated data) from the stack.
+
+Optional argument TYPE (one of the symbols vector, lisp or
+string) sets the type of sequence used for the keys.
+
+Note that any modification to DICT *immediately* invalidates all
+dictree-stacks created before the modification (in particular,
+calling `dictree-stack-pop' will give unpredictable results).
+
+Operations on dictree-stacks are significantly more efficient
+than constructing a real stack from the dictionary and using
+standard stack functions. As such, they can be useful in
+implementing efficient algorithms on dictionaries. However, in
+cases where mapping functions `dictree-mapc', `dictree-mapcar' or
+`dictree-mapf' would be sufficient, it is better to use one of
+those instead."
+  (if (dictree--meta-dict-p dict)
+      (dictree--meta-stack-create dict type reverse)
+    (trie-stack (dictree--trie dict) type reverse)))
+
+
+(defun dictree-complete-stack (dict prefix &optional reverse)
+  "Return an object that allows completions of PREFIX to be accessed
+as if they were a stack.
+
+The stack is sorted in \"lexical\" order, i.e. the order defined
+by DICT's comparison function, or in reverse order if REVERSE is
+non-nil. Calling `dictree-stack-pop' pops the top element (a key
+and its associated data) from the stack.
+
+PREFIX must be a sequence (vector, list or string) that forms the
+initial part of a TRIE key. (If PREFIX is a string, it must be
+possible to apply `string' to individual elements of TRIE keys.)
+The completions returned in the alist will be sequences of the
+same type as KEY. If PREFIX is a list of sequences, completions
+of all sequences in the list are included in the stack. All
+sequences in the list must be of the same type.
+
+Note that any modification to DICT *immediately* invalidates all
+trie-stacks created before the modification (in particular,
+calling `dictree-stack-pop' will give unpredictable results).
+
+Operations on dictree-stacks are significantly more efficient
+than constructing a real stack from completions of PREFIX in DICT
+and using standard stack functions. As such, they can be useful
+in implementing efficient algorithms on tries. However, in cases
+where `dictree-complete' or `dictree-complete-ordered' is
+sufficient, it is better to use one of those instead."
+  (if (dictree--meta-dict-p dict)
+      (dictree--complete-meta-stack-create dict prefix reverse)
+    (trie-complete-stack (dictree--trie dict) prefix reverse)))
+
+
+(defun dictree-regexp-stack (dict regexp &optional reverse)
+  "Return an object that allows REGEXP matches to be accessed
+as if they were a stack.
+
+The stack is sorted in \"lexical\" order, i.e. the order defined
+by DICT's comparison function, or in reverse order if REVERSE is
+non-nil. Calling `dictree-stack-pop' pops the top element (a key
+and its associated data) from the stack.
+
+REGEXP is a regular expression, but it need not necessarily be a
+string. It must be a sequence (vector, list of string) whose
+elements are either elements of the same type as elements of the
+trie keys (which behave as literals in the regexp), or any of the
+usual regexp special characters and backslash constructs. If
+REGEXP is a string, it must be possible to apply `string' to
+individual elements of the keys stored in the trie. The matches
+returned in the alist will be sequences of the same type as KEY.
+
+Back-references and non-greedy postfix operators are *not*
+supported, and the matches are always anchored, so `$' and `^'
+lose their special meanings.
+
+If the regexp contains any non-shy grouping constructs, subgroup
+match data is included in the results. In this case, the car of
+each match is no longer just a key. Instead, it is a list whose
+first element is the matching key, and whose remaining elements
+are cons cells whose cars and cdrs give the start and end indices
+of the elements that matched the corresponding groups, in order.
+
+Note that any modification to DICT *immediately* invalidates all
+trie-stacks created before the modification (in particular,
+calling `dictree-stack-pop' will give unpredictable results).
+
+Operations on dictree-stacks are significantly more efficient
+than constructing a real stack from completions of PREFIX in DICT
+and using standard stack functions. As such, they can be useful
+in implementing efficient algorithms on tries. However, in cases
+where `dictree-complete' or `dictree-complete-ordered' is
+sufficient, it is better to use one of those instead."
+  (if (dictree--meta-dict-p dict)
+      (dictree--regexp-meta-stack-create dict regexp reverse)
+    (trie-regexp-stack (dictree--trie dict) regexp reverse)))
+
+
+(defun dictree-stack-pop (dictree-stack)
+  "Pop the first element from the DICTREE-STACK.
+Returns nil if the stack is empty."
+  (cond
+   ;; if elements have been pushed onto a dict stack, pop those first
+   ;; FIXME: shouldn't be using internal trie functions!
+   ((and (trie-stack-p dictree-stack)
+        (trie--stack-pushed dictree-stack))
+    (trie-stack-pop dictree-stack))
+   ;; if elements have been pushed onto a meta-dict stack, pop those
+   ;; first
+   ((and (dictree--meta-stack-p dictree-stack)
+        (dictree--meta-stack-pushed dictree-stack))
+    (pop (dictree--meta-stack-pushed dictree-stack)))
+   ;; otherwise, pop first element from dictree-stack
+   (t (let ((popped (dictree--stack-pop dictree-stack)))
+       (when popped
+         (cons (car popped) (dictree--cell-data (cdr popped))))))
+   ))
+
+
+(defun dictree-stack-push (element dictree-stack)
+  "Push ELEMENT onto DICTREE-STACK."
+  (if (trie-stack-p dictree-stack)
+      ;; normal dict
+      (trie-stack-push element dictree-stack)
+    ;; meta-dict
+    (push element (dictree--meta-stack-pushed dictree-stack))))
+
+
+(defun dictree-stack-first (dictree-stack)
+  "Return the first element from DICTREE-STACK, without removing it.
+Returns nil if the stack is empty."
+  ;; if elements have been pushed onto the stack, return first of those
+  (if (and (dictree--meta-stack-p dictree-stack)
+          (dictree--meta-stack-pushed dictree-stack))
+      (car (dictree--meta-stack-pushed dictree-stack))
+    ;; otherwise, return first element from dictree-stack
+    (let ((first (dictree--stack-first dictree-stack)))
+      (cons (car first) (dictree--cell-data (cdr first))))))
+
+
+(defun dictree-stack-empty-p (dictree-stack)
+  "Return t if DICTREE-STACK is empty, nil otherwise."
+  (if (trie-stack-p dictree-stack)
+      ;; normal dict
+      (trie-stack-empty-p dictree-stack)
+    ;; meta-dict
+    (and (heap-empty (dictree--meta-stack-heap dictree-stack))
+        (null (dictree--meta-stack-pushed dictree-stack)))))
+
+
+(defun dictree--stack-first (dictree-stack)
+  "Return the first element from DICTREE-STACK, without removing it.
+Returns nil if the stack is empty."
+  (if (trie-stack-p dictree-stack)
+      ;; normal dict
+      (trie-stack-first dictree-stack)
+    ;; meta-dict
+    (if (dictree--meta-stack-pushed dictree-stack)
+       ;; pushed element
+       (car (dictree--meta-stack-pushed dictree-stack))
+      ;; dictree-stack element
+      (dictree--stack-first
+       (heap-root (dictree--meta-stack-heap dictree-stack))))))
+
+
+(defun dictree--stack-pop (dictree-stack)
+  ;; Pop the raw first element from DICTREE-STACK. Returns nil if the
+  ;; stack is empty.
+
+  ;; dictree-stack for normal dictionaries is a trie-stack
+  (if (trie-stack-p dictree-stack)
+      (trie-stack-pop dictree-stack)
+
+    ;; meta-dictionary dictree-stack...more work!
+    ;; if elements have been pushed onto meta-dict stack, pop those
+    ;; first
+    (if (dictree--meta-stack-pushed dictree-stack)
+       (pop (dictree--meta-stack-pushed dictree-stack))
+      ;; otherwise...
+      (let ((heap (dictree--meta-stack-heap dictree-stack))
+           (sortfun (dictree--meta-stack-sortfun dictree-stack))
+           stack curr next cell)
+       (unless (heap-empty heap)
+         ;; remove the first dictree-stack from the heap, pop it's
+         ;; first element, and add it back to the heap (note that it
+         ;; will almost certainly not end up at the root again)
+         (setq stack (heap-delete-root heap))
+         (setq curr (dictree--stack-pop stack))
+         (unless (dictree-stack-empty-p stack) (heap-add heap stack))
+         ;; peek at the first element of the stack now at the root of
+         ;; the heap
+         (unless (heap-empty heap)
+           (setq next (dictree--stack-first (heap-root heap)))
+           ;; repeat this as long as we keep finding elements with the
+           ;; same key, combining them together as we go
+           (when (dictree--meta-stack-combfun dictree-stack)
+             (while (and (null (funcall sortfun
+                                        (car curr) (car next)))
+                         (null (funcall sortfun
+                                        (car next) (car curr))))
+               (setq stack (heap-delete-root heap))
+               (setq next (dictree--stack-pop stack))
+               (setq curr
+                     (cons
+                      (car curr)
+                      (dictree--cell-create
+                       (funcall
+                        (dictree--meta-stack-combfun dictree-stack)
+                        (dictree--cell-data (cdr curr))
+                        (dictree--cell-data (cdr next)))
+                       (append (dictree--cell-plist (cdr curr))
+                               (dictree--cell-plist (cdr next))))))
+               (heap-add heap stack)
+               (setq next (dictree--stack-first (heap-root heap))))))
+         ;; return the combined dictionary element
+         curr)))))
+
+
+
+
+;; ----------------------------------------------------------------
+;;             Functions for building advanced queries
+
+(defun dictree--query
+  (dict arg cachefun cacheparamfun triefun stackfun
+   &optional rank-function maxnum reverse no-cache filter resultfun)
+  ;; Return results of querying DICT with argument ARG using TRIEFUN or
+  ;; STACKFUN. If result of calling CACHEPARAMFUN on DICT is non-nil,
+  ;; look first for cached result in cache returned by calling CACHEFUN
+  ;; on DICT, and cache result if query fulfils caching conditions. If
+  ;; RANK-FUNCTION is non-nil, return results ordered accordingly. If
+  ;; MAXNUM is an integer, only the first MAXNUM results will be
+  ;; returned. If REVERSE is non-nil, results are in reverse order. A
+  ;; non-nil NO-CACHE prevents caching of results, irrespective of
+  ;; DICT's cache settings. If supplied, only results that pass FILTER
+  ;; are included. A non-nil RESULTFUN is applied to results before
+  ;; adding them to final results list. Otherwise, an alist of key-data
+  ;; associations is returned.
+
+  ;; wrap DICT in a list if necessary
+  (when (dictree-p dict) (setq dict (list dict)))
+
+  (let (cache cacheparam completions cmpl cache-entry)
+    ;; map over all dictionaries in list
+    (dolist (dic dict)
+      (setq cache (funcall cachefun dic)
+           cacheparam (funcall cacheparamfun dic))
+      (cond
+       ;; If FILTER or custom RANK-FUNCTION was specified, look in trie
+       ;; since we don't cache custom searches. We pass a slightly
+       ;; redefined filter to `trie-complete' to deal with data
+       ;; wrapping.
+       ((or filter
+           (and rank-function
+                (not (eq rank-function (dictree-rank-function dic)))))
+       (setq cmpl
+             (dictree--do-query dic arg triefun stackfun
+                                (dictree--wrap-rankfun rank-function)
+                                maxnum reverse
+                                (when filter
+                                  (dictree--wrap-filter filter)))))
+
+
+       ;; if there's a cached result with enough completions, use it
+       ((and (setq cache-entry
+                  (if cacheparam
+                      (gethash (cons arg reverse) cache)
+                    nil))
+            (or (null (dictree--cache-maxnum cache-entry))
+                (and maxnum
+                     (<= maxnum (dictree--cache-maxnum cache-entry)))))
+       (setq cmpl (dictree--cache-results cache-entry))
+       ;; drop any excess completions
+       (when (and maxnum
+                  (or (null (dictree--cache-maxnum cache-entry))
+                      (> (dictree--cache-maxnum cache-entry) maxnum)))
+         (setcdr (nthcdr (1- maxnum) completions) nil)))
+
+
+       ;; if there was nothing useful in the cache, do query and time it
+       (t
+       (let (time)
+         (setq time (float-time))
+         (setq cmpl
+               (dictree--do-query
+                dic arg triefun stackfun
+                (when rank-function
+                  (dictree--wrap-rankfun rank-function))
+                maxnum reverse nil))
+         (setq time (- (float-time) time))
+         ;; if we're above the dictionary's completion cache threshold,
+         ;; cache the result
+         (when (and (not no-cache)
+                    (dictree--above-cache-threshold-p
+                     time (length arg) (dictree-cache-policy dic)
+                     cacheparam))
+           (setf (dictree-modified dic) t)
+           (puthash (cons arg reverse)
+                    (dictree--cache-create cmpl maxnum)
+                    cache)))))
+
+      ;; merge new completion into completions list
+      (setq completions
+           (dictree--merge
+            completions cmpl
+            (if rank-function
+                (dictree--wrap-rankfun rank-function)
+              `(lambda (a b)
+                 (,(trie-construct-sortfun
+                    (dictree-comparison-function (car dict)))
+                  (car a) (car b))))
+            nil maxnum)))
+
+    ;; return completions list, applying RESULTFUN is specified,
+    ;; otherwise just stripping meta-data
+    (mapcar
+     (if resultfun
+        (dictree--wrap-resultfun resultfun)
+       (lambda (el) (cons (car el) (dictree--cell-data (cdr el)))))
+     completions)))
+
+
+
+(defun dictree--do-query
+  (dict arg triefun stackfun &optional rank-function maxnum reverse filter)
+  ;; Return first MAXNUM results of querying DICT with ARG using TRIEFUN
+  ;; or STACKFUN that satisfy FILTER, ordered according to RANK-FUNCTION
+  ;; (defaulting to "lexical" order).
+
+  ;; for a meta-dict, use a dictree-stack
+  (if (dictree--meta-dict-p dict)
+      (let ((stack (funcall stackfun dict arg reverse))
+           (heap (when rank-function
+                   (heap-create   ; heap order is inverse of rank order
+                       (if reverse
+                           rank-function
+                         (lambda (a b)
+                           (not (funcall rank-function a b))))
+                       (1+ maxnum))))
+           (i 0) cmpl completions)
+       ;; pop MAXNUM completions from the stack
+       (while (and (or (null maxnum) (< i maxnum))
+                   (setq cmpl (dictree--stack-pop stack)))
+         ;; check completion passes FILTER
+         (when (or (null filter) (funcall filter cmpl))
+           (if rank-function
+               (heap-add heap cmpl)   ; for ranked query, add to heap
+             (push cmpl completions)) ; for lexical query, add to list
+           (incf i)))
+       (if (null rank-function)
+           ;; for lexical query, reverse and return completion list (we
+           ;; built it backwards)
+           (nreverse completions)
+         ;; for ranked query, pass rest of completions through heap
+         (while (setq cmpl (dictree--stack-pop stack))
+           (heap-add heap cmpl)
+           (heap-delete-root heap))
+         ;; extract completions from heap
+         (while (setq cmpl (heap-delete-root heap))
+           (push cmpl completions))
+         completions))  ; return completion list
+
+    ;; for a normal dict, call corresponding trie function on dict's
+    ;; trie. Note: could use a dictree-stack here too - would it be more
+    ;; efficient?
+    (funcall triefun
+            (dictree--trie dict) arg rank-function
+            maxnum reverse filter)))
+
+
+
+;; ----------------------------------------------------------------
+;;                        Completing
+
+(defun dictree-complete
+  (dict prefix
+   &optional rank-function maxnum reverse no-cache filter resultfun)
+  "Return an alist containing all completions of PREFIX in DICT
+along with their associated data, sorted according to
+RANK-FUNCTION (defaulting to \"lexical\" order, i.e. the order
+defined by the dictionary's comparison function,
+cf. `dictree-create'). Return nil if no completions are found.
+
+PREFIX can also be a list of sequences, in which case completions of
+all elements in the list are returned, merged together in a
+single sorted alist.
+
+DICT can also be a list of dictionaries, in which case
+completions are sought in all dictionaries in the list. (Note
+that if the same key appears in multiple dictionaries, the alist
+may contain the same key multiple times, each copy associated
+with the data from a different dictionary. If you want to combine
+identical keys, use a meta-dictionary; see
+`dictree-create-meta-dict'.)
+
+If optional argument RANK-FUNCTION is any non-nil value that is
+not a function, the completions are sorted according to the
+dictionary's rank-function (see `dictree-create'). Any non-nil
+value that *is* a function over-rides this. In that case,
+RANK-FUNCTION should accept two arguments, both cons cells. The
+car of each contains a sequence from the trie (of the same type
+as PREFIX), the cdr contains its associated data. The
+RANK-FUNCTION should return non-nil if first argument is ranked
+strictly higher than the second, nil otherwise.
+
+The optional integer argument MAXNUM limits the results to the
+first MAXNUM completions. The default is to return all matches.
+
+If the optional argument NO-CACHE is non-nil, it prevents caching
+of the result. Ignored for dictionaries that do not have
+completion caching enabled.
+
+The FILTER argument sets a filter function for the
+completions. For each potential completion, it is passed two
+arguments: the completion, and its associated data. If the filter
+function returns nil, the completion is not included in the
+results, and doesn't count towards MAXNUM.
+
+RESULTFUN defines a function used to process results before
+adding them to the final result list. If specified, it should
+accept two arguments: a key and its associated data. It's return
+value is what gets added to the final result list, instead of the
+default key-data cons cell."
+  ;; run completion query
+  (dictree--query
+   dict prefix
+   (if rank-function
+       'dictree-complete-ranked-cache
+     'dictree-complete-cache)
+   (if rank-function
+       'dictree-complete-ranked-cache-threshold
+     'dictree-complete-cache-threshold)
+   'trie-complete 'dictree-complete-stack
+   (when rank-function
+     (if (functionp rank-function)
+        rank-function
+       (dictree-rank-function (if (listp dict) (car dict) dict))))
+   maxnum reverse no-cache filter resultfun))
+
+
+
+(defun dictree-collection-function (dict string predicate all)
+  "Function for use in `try-completion', `all-completions',
+and `completing-read'. To complete from dictionary DICT, use the
+following as the COLLECTION argument of any of those functions:
+
+  (lambda (string predicate all)
+    (dictree-collection-function dict string predicate all))
+
+Note that PREDICATE will be called with two arguments: the
+completion, and its associated data."
+  (let ((completions
+        (dictree-complete dict string nil nil nil nil
+                          predicate (lambda (key data) key))))
+    (if all completions (try-completion "" completions))))
+
+
+
+;; ----------------------------------------------------------------
+;;                      Regexp search
+
+(defun dictree-regexp-search
+  (dict regexp
+   &optional rank-function maxnum reverse no-cache filter resultfun)
+  "Return an alist containing all matches for REGEXP in TRIE
+along with their associated data, in the order defined by
+RANKFUN, defauling to \"lexical\" order (i.e. the order defined
+by the trie's comparison function).  If REVERSE is non-nil, the
+completions are sorted in the reverse order. Returns nil if no
+completions are found.
+
+DICT can also be a list of dictionaries, in which case matches
+are sought in all dictionaries in the list. (Note that if the
+same key appears in multiple dictionaries, the alist may contain
+the same key multiple times, each copy associated with the data
+from a different dictionary. If you want to combine identical
+keys, use a meta-dictionary; see `dictree-create-meta-dict'.)
+
+REGEXP is a regular expression, but it need not necessarily be a
+string. It must be a sequence (vector, list of string) whose
+elements are either elements of the same type as elements of the
+trie keys (which behave as literals in the regexp), or any of the
+usual regexp special characters and backslash constructs. If
+REGEXP is a string, it must be possible to apply `string' to
+individual elements of the keys stored in the trie. The matches
+returned in the alist will be sequences of the same type as KEY.
+
+Only a subset of the full Emacs regular expression syntax is
+supported. There is no support for regexp constructs that are
+only meaningful for strings (character ranges and character
+classes inside character alternatives, and syntax-related
+backslash constructs). Back-references and non-greedy postfix
+operators are not supported, so `?' after a postfix operator
+loses its special meaning. Also, matches are always anchored, so
+`$' and `^' lose their special meanings (use `.*' at the
+beginning and end of the regexp to get an unanchored match).
+
+If the regexp contains any non-shy grouping constructs, subgroup
+match data is included in the results. In this case, the car of
+each match is no longer just a key. Instead, it is a list whose
+first element is the matching key, and whose remaining elements
+are cons cells whose cars and cdrs give the start and end indices
+of the elements that matched the corresponding groups, in order.
+
+If optional argument RANK-FUNCTION is any non-nil value that is
+not a function, the matches are sorted according to the
+dictionary's rank-function (see `dictree-create'). Any non-nil
+value that *is* a function over-rides this. In that case,
+RANK-FUNCTION should accept two arguments, both cons cells. The
+car of each contains a sequence from the dictionary (of the same
+type as PREFIX), the cdr contains its associated data. The
+RANK-FUNCTION should return non-nil if first argument is ranked
+strictly higher than the second, nil otherwise.
+
+The optional integer argument MAXNUM limits the results to the
+first MAXNUM matches. The default is to return all matches.
+
+If the optional argument NO-CACHE is non-nil, it prevents caching
+of the result. Ignored for dictionaries that do not have wildcard
+caching enabled.
+
+The FILTER argument sets a filter function for the matches. If
+supplied, it is called for each possible match with two
+arguments: the matching key, and its associated data. If the
+filter function returns nil, the match is not included in the
+results, and does not count towards MAXNUM.
+
+RESULTFUN defines a function used to process results before
+adding them to the final result list. If specified, it should
+accept two arguments: a key and its associated data. It's return
+value is what gets added to the final result list, instead of the
+default key-data cons cell."
+  ;; run regexp query
+  (dictree--query
+   dict regexp
+   (if rank-function
+       'dictree-regexp-ranked-cache
+     'dictree-regexp-cache)
+   (if rank-function
+       'dictree-regexp-ranked-cache-threshold
+     'dictree-regexp-cache-threshold)
+   'trie-regexp-search 'dictree-regexp-stack
+   (when rank-function
+     (if (functionp rank-function)
+        rank-function
+       (dictree-rank-function (if (listp dict) (car dict) dict))))
+   maxnum reverse no-cache filter resultfun))
+
+
+
+
+;; ----------------------------------------------------------------
+;;                    Persistent storage
+
+(defun dictree-save (dict &optional compilation)
+  "Save dictionary DICT to it's associated file.
+Use `dictree-write' to save to a different file.
+
+Optional argument COMPILATION determines whether to save the
+dictionary in compiled or uncompiled form. The default is to save
+both forms. See `dictree-write'.
+
+Interactively, DICT is read from the mini-buffer."
+  (interactive (list (read-dict "Dictionary: ")))
+  (when (and (called-interactively-p 'any) (symbolp dict))
+    (setq dict (eval dict)))
+
+  (let ((filename (dictree-filename dict)))
+    ;; if dictionary has no associated file, prompt for one
+    (unless (and filename (> (length filename) 0))
+      (setq filename
+           (read-file-name
+            (format "Save dictionary %s to file\
+ (leave blank to NOT save): "
+                    (dictree-name dict))
+            nil "")))
+
+    ;; if filename is blank, don't save
+    (if (string= filename "")
+       (message "Dictionary %s NOT saved" (dictree-name dict))
+      ;; otherwise write dictionary to file
+      (setf (dictree-filename dict) filename)
+      (dictree-write dict filename t compilation))))
+
+
+
+(defun dictree-write (dict &optional filename overwrite compilation)
+  "Write dictionary DICT to file FILENAME.
+Defaults to dictionary's current filename if FILENAME is not
+specified (like `dictree-save').
+
+If optional argument OVERWRITE is non-nil, no confirmation will
+be asked for before overwriting an existing file.
+
+The default is to create both compiled and uncompiled versions of
+the dictionary, with extensions .elc and .el respectively (if
+FILENAME has either of these extensions, they are stripped off
+before proceeding). The compiled version is always used in
+preference to the uncomplied version, as it loads
+faster. However, only the uncompiled version is portable between
+different Emacs versions.
+
+If optional argument COMPILATION is the symbol 'compiled, only
+the compiled version will be created, whereas if it is the symbol
+'uncompiled, only the uncompiled version will be created.
+
+Interactively, DICT and FILENAME are read from the mini-buffer,
+and OVERWRITE is the prefix argument."
+  (interactive (list (read-dict "Dictionary: ")
+                    (read-file-name "Write dictionary to file: "
+                                    nil "")
+                    current-prefix-arg))
+  (when (and (called-interactively-p 'any) (symbolp dict))
+    (setq dict (eval dict)))
+  ;; default to DICT's current file, if any
+  (when (or (null filename)
+           (and (called-interactively-p 'any) (string= filename "")))
+    (setq filename (dictree-filename dict)))
+  (if (null filename)
+      (progn
+       (message "Dictionary %s NOT written" (dictree-name dict))
+       nil)  ; indicate dictionary wasn't written
+
+    (let (dictname buff tmpfile)
+      ;; remove any .el(c) extension from filename
+      (cond
+       ((and (> (length filename) 3)
+            (string= (substring filename -3) ".el"))
+       (setq filename (substring filename 0 -3)))
+       ((and (> (length filename) 4)
+            (string= (substring filename -4) ".elc"))
+       (setq filename (substring filename 0 -4))))
+      ;; create saved dictionary name from filename
+      (setq dictname (file-name-nondirectory filename))
+
+      (save-excursion
+       ;; create a temporary file
+       (setq buff
+             (find-file-noselect
+              (setq tmpfile (make-temp-file dictname))))
+       (set-buffer buff)
+       ;; call the appropriate write function to write the dictionary code
+       (if (dictree--meta-dict-p dict)
+           (dictree--write-meta-dict-code dict dictname filename)
+         (dictree--write-dict-code dict dictname filename))
+       (save-buffer)
+       (kill-buffer buff))
+
+      ;; prompt to overwrite if necessary
+      (when (or overwrite
+               (and
+                (or (eq compilation 'compiled)
+                    (not (file-exists-p (concat filename ".el"))))
+                (or (eq compilation 'uncompiled)
+                    (not (file-exists-p (concat filename ".elc")))))
+               (y-or-n-p
+                (format "File %s already exists. Overwrite? "
+                        (concat filename ".el(c)"))))
+       (condition-case nil
+           (progn
+             ;; move the uncompiled version to its final destination
+             (unless (eq compilation 'compiled)
+               (copy-file tmpfile (concat filename ".el") t))
+             ;; byte-compile and move the compiled version to its final
+             ;; destination
+             (unless (eq compilation 'uncompiled)
+               (if (save-window-excursion
+                     (let ((byte-compile-disable-print-circle t)
+                           err)
+                       (setq err (byte-compile-file tmpfile))
+                       err))
+                   (rename-file (concat tmpfile ".elc")
+                                (concat filename ".elc") t)
+                 (error ""))))
+         (error "Error writing dictionary. Dictionary %s NOT saved"
+                dictname))
+
+       ;; if writing to a different name, unload dictionary under old
+       ;; name and reload it under new one
+       (setf (dictree-modified dict) nil)
+       (setf (dictree-filename dict) filename)
+       (unless (string= dictname (dictree-name dict))
+         (dictree-unload dict)
+         (dictree-load filename)))
+
+      (delete-file tmpfile)
+      (message "Dictionary %s saved to %s" dictname filename)
+      t)  ; return t to indicate dictionary was successfully saved
+    ))
+
+
+
+(defun dictree-save-modified (&optional dict ask compilation force
+                                       no-fail-query)
+  "Save all modified dictionaries that have their autosave flag set.
+Returns t if all dictionaries were successfully saved. Otherwise,
+inform the user about the dictionaries which failed to save
+properly, ask them whether they wish to continue anyway, and
+return t or nil accordingly.
+
+If optional argument DICT is a list of dictionaries or a single
+dictionary, only save those.
+
+If optional argument ASK is non-nil, ask for confirmation before
+saving.
+
+Optional argument COMPILATION determines whether to save the
+dictionaries in compiled or uncompiled form. The default is to
+save both forms. See `dictree-write'.
+
+If optional argument FORCE is non-nil, save modified dictionaries
+irrespective of their autosave flag.
+
+If optional argument NO-FAIL-QUERY is non-nil, the user will not
+be queried if a dictionary fails to save properly, and the return
+value is always nil.
+
+Interactively, FORCE is the prefix argument, and the user will not be
+asked whether they wish to continue after a failed save."
+  (interactive "P")
+
+  ;; sort out arguments
+  (when (and (called-interactively-p 'any) dict) (setq dict nil force t))
+  (when (dictree-p dict) (setq dict (list dict)))
+
+  ;; For each dictionary in list / each loaded dictionary, check if
+  ;; dictionary has been modified. If so, save it if autosave is set or
+  ;; FORCE is non-nil.
+  (let (save-failures)
+    (dolist (dic (if (null dict)
+                    dictree-loaded-list
+                  dict))
+      (when (and (dictree-modified dic)
+                (or force (dictree-autosave dic))
+                (or (not ask)
+                    (y-or-n-p (format "Save modified dictionary %s? "
+                                      (dictree-filename dic)))))
+       (condition-case nil
+           (progn
+             (dictree-save dic compilation)
+             (setf (dictree-modified dic) nil))
+         (error (push dic save-failures)))))
+
+    ;; prompt if dictionary saving failed
+    (if save-failures
+       (if (or (called-interactively-p 'any) no-fail-query)
+           (progn
+             (message
+              (concat
+               "Error: failed to save the following modified "
+               "dictionaries: "
+               (mapconcat 'dictree--name save-failures ", ")))
+             nil)
+         (yes-or-no-p
+          (concat "Error: failed to save the following modified "
+                  "dictionaries: "
+                  (mapconcat 'dictree--name save-failures ", ")
+                  "; continue anyway? ")))
+      t)))
+
+
+;; Add the dictree-save-modified function to the kill-emacs-hook to save
+;; modified dictionaries when exiting emacs
+(add-hook 'kill-emacs-query-functions 'dictree-save-modified)
+
+
+
+;;;###autoload
+(defun dictree-load (file)
+  "Load a dictionary object from file FILE.
+Returns the dictionary if successful, nil otherwise.
+
+Interactively, FILE is read from the mini-buffer."
+  (interactive (list (read-dict "Load dictionary: " nil nil t t)))
+
+  ;; sort out dictionary name and file name
+  (if (or (symbolp file) (dictree-p file))
+      (message "Dictionary %s already loaded" (dictree-name file))
+
+    ;; load the dictionary
+    (if (not (load file t))
+       ;; if loading failed, throw error interactively, return nil
+       ;; non-interactively
+       (if (called-interactively-p 'any)
+           (error "Cannot open dictionary file: %s" file)
+         nil)
+
+      (let (dictname dict)
+       (setq dictname
+             (file-name-nondirectory (file-name-sans-extension file))
+             dict (eval (intern-soft dictname)))
+       (if (not (dictree-p dict))
+           ;; if loading failed, throw error interactively, return nil
+           ;; non-interactively
+           (if (called-interactively-p 'any)
+               (error "Error loading dictionary file: %s" file)
+             nil)
+
+         ;; ensure the dictionary name and file name associated with
+         ;; the dictionary match the file it was loaded from
+         (when (and (string= (file-name-nondirectory file) file)
+                    (setq file
+                          (locate-file file load-path load-suffixes)))
+           (setf (dictree-filename dict) file))
+         (setf (dictree-name dict) dictname)
+
+         ;; make sure the dictionary is in dictree-loaded-list
+         ;; (normally the lisp code in the dictionary itself should do
+         ;; this, but just to make sure...)
+         (unless (memq dict dictree-loaded-list)
+           (push dict dictree-loaded-list))
+         (message (format "Loaded dictionary %s" dictname))
+
+         ;; return dictionary
+         dict)))))
+
+
+
+(defun dictree-unload (dict &optional dont-save)
+  "Unload dictionary DICT.
+If optional argument DONT-SAVE is non-nil, the dictionary will
+NOT be saved even if its autosave flag is set.
+
+Interactively, DICT is read from the mini-buffer, and DONT-SAVE
+is the prefix argument."
+  (interactive (list (read-dict "Dictionary: ")
+                    current-prefix-arg))
+  (when (and (called-interactively-p 'any) (symbolp dict))
+    (setq dict (eval dict)))
+
+  ;; if dictionary has been modified, autosave is set and not overidden,
+  ;; save it first
+  (when (and (dictree-modified dict)
+            (null dont-save)
+            (or (eq (dictree-autosave dict) t)
+                (and (eq (dictree-autosave dict) 'ask)
+                     (y-or-n-p
+                      (format
+                       "Dictionary %s modified.\
+ Save before unloading? "
+                       (dictree-name dict))))))
+    (dictree-save dict))
+
+  ;; if unloading a meta-dict, remove reference to it from constituent
+  ;; dictionaries' meta-dict-list cell
+  (when (dictree--meta-dict-p dict)
+    (mapc
+     (lambda (dic)
+       (setf (dictree--meta-dict-list dic)
+            (delq dict (dictree--meta-dict-list dic))))
+     (dictree--meta-dict-dictlist dict)))
+
+  ;; remove dictionary from list of loaded dictionaries and unload it
+  (setq dictree-loaded-list (delq dict dictree-loaded-list))
+  (unintern (dictree-name dict))
+  (message "Dictionary %s unloaded" (dictree-name dict)))
+
+
+
+(defun dictree--write-dict-code (dict dictname filename)
+  ;; Write code for normal dictionary DICT to current buffer, giving it
+  ;; the name DICTNAME and file FILENAME.
+  (let (hashcode tmpdict tmptrie lookup-alist
+       complete-alist complete-ranked-alist
+       regexp-alist regexp-ranked-alist)
+
+    ;; --- convert trie data ---
+    ;; if dictionary doesn't use any custom save functions, write
+    ;; dictionary's trie directly as is
+    (setq tmptrie (dictree--trie dict))
+    ;; otherwise, create a temporary trie and populate it with the
+    ;; converted contents of the dictionary's trie
+    (when (or (dictree--data-savefun dict)
+             (dictree--plist-savefun dict))
+      (setq tmptrie
+           (trie-create-custom
+            (trie-comparison-function tmptrie)
+            :createfun (trie--createfun tmptrie)
+            :insertfun (trie--insertfun tmptrie)
+            :deletefun (trie--deletefun tmptrie)
+            :lookupfun (trie--lookupfun tmptrie)
+            :mapfun (trie--mapfun tmptrie)
+            :emptyfun (trie--emptyfun tmptrie)
+            :stack-createfun (trie--stack-createfun tmptrie)
+            :stack-popfun (trie--stack-popfun tmptrie)
+            :stack-emptyfun (trie--stack-emptyfun tmptrie)))
+      (trie-mapc
+       (lambda (key cell)
+        (trie-insert tmptrie key
+                     (dictree--cell-create
+                      (funcall (or (dictree--data-savefun dict)
+                                   'identity)
+                               (dictree--cell-data cell))
+                      (funcall (or (dictree--plist-savefun dict)
+                                   'identity)
+                               (dictree--cell-plist cell)))))
+       (dictree--trie dict))
+
+      ;; generate code to convert contents of trie back to original form
+      (setq hashcode
+           (concat
+            hashcode
+            " (trie-map\n"
+            "  (lambda (key cell)\n"
+            "     (dictree--cell-create\n"
+            (if (dictree--data-loadfun dict)
+                (concat
+                 "(funcall (dictree--data-loadfun " dictname ")\n"
+                 "         (dictree--cell-data cell))\n")
+              "   (dictree--cell-data cell)\n")
+            (if (dictree--plist-loadfun dict)
+                (concat
+                 "(funcall (dictree--plist-loadfun " dictname ")\n"
+                 "         (dictree--cell-plist cell))))\n")
+              "   (dictree--cell-plist cell)))\n")
+            " (dictree--trie " dictname "))\n")))
+
+
+    ;; --- convert caches for writing to file ---
+    ;; hash tables have no read syntax in older Emacsen, so we convert
+    ;; them to alists for writing
+    (unless (featurep 'hashtable-print-readable)
+      ;; convert lookup cache hash table to alist, if it exists
+      (when (dictree--lookup-cache-threshold dict)
+       (maphash
+        (lambda (key val)
+          (push
+           (cons key
+                 (cons (mapcar 'car (dictree--cache-results val))
+                       (dictree--cache-maxnum val)))
+           lookup-alist))
+        (dictree--lookup-cache dict))
+       ;; generate code to reconstruct the lookup hash table
+       (setq hashcode
+             (concat
+              hashcode
+              "(let ((lookup-cache (make-hash-table :test 'equal))\n"
+              "      (trie (dictree--trie " dictname ")))\n"
+              "  (mapc\n"
+              "   (lambda (entry)\n"
+              "     (puthash\n"
+              "      (car entry)\n"
+              "      (dictree--cache-create\n"
+              "       (mapcar\n"
+              "        (lambda (key)\n"
+              "          (cons key (trie-member trie key)))\n"
+              "        (dictree--cache-results (cdr entry)))\n"
+              "       (dictree--cache-maxnum (cdr entry)))\n"
+              "      lookup-cache))\n"
+              "   (dictree--lookup-cache " dictname "))\n"
+              "  (setf (dictree--lookup-cache " dictname ")\n"
+              "        lookup-cache))\n")))
+
+      ;; convert query caches, if they exist
+      (dolist (cache-details
+              '((dictree--complete-cache-threshold
+                 complete-alist dictree--complete-cache)
+                (dictree--complete-ranked-cache-threshold
+                 complete-ranked-alist dictree--complete-ranked-cache)
+                (dictree--regexp-cache-threshold
+                 regexp-alist dictree--regexp-cache)
+                (dictree--regexp-ranked-cache-threshold
+                 regexp-ranked-alist dictree--regexp-ranked-cache)))
+       (when (funcall (nth 0 cache-details) dict)
+         ;; convert hash table to alist
+         (set (nth 1 cache-details)
+              (let (alist)
+                (maphash
+                 (lambda (key val)
+                   (push
+                    (cons key
+                          (cons
+                           (mapcar 'car (dictree--cache-results val))
+                           (dictree--cache-maxnum val)))
+                    alist))
+                 (funcall (nth 2 cache-details) dict))
+                alist))
+         ;; generate code to reconstruct hash table from alist
+         (setq
+          hashcode
+          (concat
+           hashcode
+           "(let ((cache (make-hash-table :test 'equal))\n"
+           "      (trie (dictree--trie " dictname ")))\n"
+           "  (mapc\n"
+           "   (lambda (entry)\n"
+           "     (puthash\n"
+           "      (car entry)\n"
+           "      (dictree--cache-create\n"
+           "       (mapcar\n"
+           "        (lambda (key)\n"
+           "          (cons key\n"
+           "                (trie-member\n"
+           "                 trie (if (stringp key) key (car key)))))\n"
+           "        (dictree--cache-results (cdr entry)))\n"
+           "       (dictree--cache-maxnum (cdr entry)))\n"
+           "      cache))\n"
+           "   (" (symbol-name (nth 2 cache-details)) " " dictname "))\n"
+           "  (setf (" (symbol-name (nth 2 cache-details)) " "
+                     dictname ")\n"
+           "        cache))\n")))))
+
+
+    ;; --- write to file ---
+    ;; generate the structure to save
+    (setq tmpdict (dictree--copy dict))
+    (setf (dictree--trie tmpdict) tmptrie
+         (dictree--name tmpdict) dictname
+         (dictree--filename tmpdict) filename
+         (dictree--modified tmpdict) nil
+         (dictree--meta-dict-list tmpdict) nil)
+    (unless (featurep 'hashtable-print-readable)
+      (setf (dictree--lookup-cache tmpdict) lookup-alist
+           (dictree--complete-cache tmpdict) complete-alist
+           (dictree--complete-ranked-cache tmpdict) complete-ranked-alist
+           (dictree--regexp-cache tmpdict) regexp-alist
+           (dictree--regexp-ranked-cache tmpdict) regexp-ranked-alist))
+
+    ;; write lisp code that generates the dictionary object
+    (let ((print-circle t) (print-level nil) (print-length nil))
+      (insert "(eval-when-compile (require 'cl))\n")
+      (insert "(require 'dict-tree)\n")
+      (insert "(defvar " dictname " nil \"Dictionary " dictname ".\")\n")
+      (unwind-protect
+         (progn
+           ;; transform trie to print form
+           (trie-transform-for-print (dictree--trie tmpdict))
+           (insert "(setq " dictname
+                   " '" (prin1-to-string tmpdict) ")\n"))
+       ;; if dictionary doesn't use any custom save functions, tmpdict's trie
+       ;; is identical to original dict, so transform it back to usable form
+       ;; on write error
+       (unless (or (dictree--data-savefun dict)
+                   (dictree--plist-savefun dict))
+         (trie-transform-from-read (dictree--trie tmpdict))))
+      (insert "(trie-transform-from-read (dictree--trie "
+             dictname "))\n")
+      (when hashcode (insert hashcode))
+      (insert "(unless (memq " dictname " dictree-loaded-list)\n"
+             "  (push " dictname " dictree-loaded-list))\n"))))
+
+
+
+(defun dictree--write-meta-dict-code (dict dictname filename)
+  ;; Write code for meta-dictionary DICT to current buffer, giving it
+  ;; the name DICTNAME and file FILENAME.
+  (let (hashcode tmpdict lookup-alist
+       complete-alist complete-ranked-alist
+       regexp-alist regexp-ranked-alist)
+
+    ;; --- convert caches for writing to file ---
+    ;; hash tables have no read syntax in older Emacsen, so we convert
+    ;; them to alists for writing
+    (unless (featurep 'hashtable-print-readable)
+      ;; convert lookup cache hash table to an alist, if it exists
+      (when (dictree--meta-dict-lookup-cache-threshold dict)
+       (maphash (lambda (key val)
+                  (push (cons key (mapcar 'car val)) lookup-alist))
+                (dictree--meta-dict-lookup-cache dict))
+       ;; generate code to reconstruct the lookup hash table
+       (setq hashcode
+             (concat
+              hashcode
+              "(let ((cache (make-hash-table :test 'equal)))\n"
+              "  (mapc (lambda (entry)\n"
+              "    (puthash (car entry) (cdr entry) cache))\n"
+              "    (dictree--meta-dict-lookup-cache " dictname "))\n"
+              "  (setf (dictree--meta-dict-lookup-cache " dictname ")\n"
+              "        cache))\n")))
+
+      ;; convert query caches, if they exist
+      (dolist (cache-details
+              '((dictree--meta-dict-complete-cache-threshold
+                 complete-alist
+                 dictree--meta-dict-complete-cache)
+                (dictree--meta-dict-complete-ranked-cache-threshold
+                 complete-ranked-alist
+                 dictree--meta-dict-complete-ranked-cache)
+                (dictree--meta-dict-regexp-cache-threshold
+                 regexp-alist
+                 dictree--meta-dict-regexp-cache)
+                (dictree--meta-dict-regexp-ranked-cache-threshold
+                 regexp-ranked-alist
+                 dictree--meta-dict-regexp-ranked-cache)))
+       (when (funcall (nth 0 cache-details) dict)
+         ;; convert hash table to alist
+         (set (nth 1 cache-details)
+              (let (alist)
+                (maphash
+                 (lambda (key val) (push (cons key val) alist))
+                 (funcall (nth 2 cache-details) dict))
+                alist))
+         ;; generate code to reconstruct hash table from alist
+         (setq
+          hashcode
+          (concat
+           hashcode
+           "(let ((cache (make-hash-table :test 'equal)))\n"
+           "  (mapc (lambda (entry)\n"
+           "    (puthash (car entry) (cdr entry) cache))\n"
+           "    (" (symbol-name (nth 2 cache-details)) " "
+                   dictname "))\n"
+           "  (setf (" (symbol-name (nth 2 cache-details)) " "
+                       dictname ")\n"
+           "        cache))\n")))))
+
+
+    ;; --- write to file ---
+    ;; generate the structure to save
+    (setq tmpdict (dictree--meta-dict-copy dict))
+    (setf (dictree--meta-dict-name tmpdict) dictname
+         (dictree--meta-dict-filename tmpdict) filename
+         (dictree--meta-dict-modified tmpdict) nil
+         (dictree--meta-dict-meta-dict-list tmpdict) nil
+         (dictree--meta-dict-dictlist tmpdict)
+           (mapcar (lambda (dic) (intern (dictree-name dic)))
+                   (dictree--meta-dict-dictlist dict)))
+    (unless (featurep 'hashtable-print-readable)
+      (setf (dictree--meta-dict-lookup-cache tmpdict) lookup-alist
+           (dictree--meta-dict-complete-cache tmpdict) complete-alist
+           (dictree--meta-dict-complete-ranked-cache tmpdict)
+             complete-ranked-alist
+           (dictree--meta-dict-regexp-cache tmpdict) regexp-alist
+           (dictree--meta-dict-regexp-ranked-cache tmpdict)
+             regexp-ranked-alist))
+
+    ;; write lisp code that generates the dictionary object
+    (let ((print-circle t) (print-level nil) (print-length nil))
+      (insert "(eval-when-compile (require 'cl))\n"
+             "(require 'dict-tree)\n")
+      (mapc
+       (lambda (dic)
+        (insert "(unless (dictree-load \"" (dictree-filename dic) "\")\n"
+                "        (error \"Failed to load dictionary \\\""
+                (dictree-name dic) "\\\" required by meta-dict \\\""
+                dictname "\\\"\"))\n"))
+       (dictree--meta-dict-dictlist dict))
+      (insert "(defvar " dictname " nil \"Dictionary " dictname ".\")\n"
+             "(setq " dictname " " (prin1-to-string tmpdict) ")\n"
+             "(setf (dictree--meta-dict-dictlist " dictname ")\n"
+             "      (mapcar 'eval (dictree--meta-dict-dictlist "
+                                   dictname ")))\n")
+      (when hashcode (insert hashcode))
+      (insert "(unless (memq " dictname " dictree-loaded-list)"
+             " (push " dictname " dictree-loaded-list))\n"))))
+
+
+
+;; ----------------------------------------------------------------
+;;                Dumping and restoring contents
+
+(defun dictree-populate-from-file
+  (dict file
+   &optional insert-function key-loadfun data-loadfun plist-loadfun
+   balance)
+  "Populate dictionary DICT from the key list in file FILE.
+
+Each line of FILE should contain a key, either a string
+\(delimited by \"\), a vector, or a list. (Use the escape
+sequence \\\" to include a \" in a string.) If a line does not
+contain a key, it is silently ignored.
+
+Each line can optionally include data and a property list (in
+that order) to be associated with the key. If present, these
+should separated from each other and the key by whitespace.
+
+INSERT-FUNCTION, KEY-LOAD-FUNCTION, DATA-LOAD-FUNCTION and
+PLIST-LOAD-FUNCTION override the corresponding default functions
+for DICT (see `dictree-create').
+
+Interactively, DICT and FILE are read from the mini-buffer.
+
+
+Technicalities:
+
+The key, data and property list are read as lisp expressions
+using `read'. The keys will be read from FILE in order, unless
+BALANCE is non-nil, in which case they are read from the median
+element outwards (which can help ensure efficient data structures
+are created when using a trie that is not self-balancing, see
+`dictree-create')."
+  (interactive (list (read-dict "Dictionary: ")
+                    (read-file-name "File to populate from: "
+                                    nil "" t)))
+  (when (and (called-interactively-p 'any) (symbolp dict))
+    (setq dict (eval dict)))
+
+  (if (and (called-interactively-p 'any) (string= file ""))
+      (message "No file specified; dictionary %s NOT populated"
+              (dictree-name dict))
+
+    (unless (dictree--meta-dict-p dict)
+      (unless key-loadfun
+       (setq key-loadfun (dictree--key-loadfun dict)))
+      (unless data-loadfun
+       (setq data-loadfun (dictree--data-loadfun dict)))
+      (unless plist-loadfun
+       (setq plist-loadfun (dictree--plist-loadfun dict))))
+
+    (save-excursion
+      (let ((buff (find-file-noselect file)))
+       (set-buffer buff)
+
+       ;; insert the keys starting from the median to ensure a
+       ;; reasonably well-balanced tree
+       (let* ((lines (count-lines (point-min) (point-max)))
+              (midpt (+ (/ lines 2) (mod lines 2)))
+              entry)
+         (message "Inserting keys in %s...(1 of %d)"
+                  (dictree-name dict) lines)
+         ;; insert the median key and set the dictionary's modified
+         ;; flag
+         (if balance
+             (dictree--goto-line midpt)
+           (goto-char (point-min)))
+         (when (setq entry
+                     (condition-case nil
+                         (dictree--read-line
+                          dict key-loadfun data-loadfun
+                          plist-loadfun)
+                       (error (error "Error reading line %d of %s"
+                                     midpt file))))
+           (dictree-insert dict (car entry) (nth 1 entry)
+                           insert-function)
+           (setf (dictree--cell-plist
+                  (dictree--lookup dict (car entry) nil))
+                 (nth 2 entry)))
+         ;; insert keys successively further away from the median in
+         ;; both directions
+         (dotimes (i (1- (if balance midpt lines)))
+           (if balance
+               (dictree--goto-line (+ midpt i 1))
+             (forward-line 1))
+           (when (setq entry
+                       (condition-case nil
+                           (dictree--read-line
+                            dict key-loadfun data-loadfun
+                            plist-loadfun)
+                         (error (error "Error reading line %d of %s"
+                                       (+ midpt i 1) file))))
+             (dictree-insert dict (car entry) (nth 1 entry)
+                             insert-function)
+             (setf (dictree--cell-plist
+                    (dictree--lookup dict (car entry) nil))
+                   (nth 2 entry)))
+           (when (= 49 (mod i 50))
+             (message "Inserting keys in %s...(%d of %d)"
+                      (dictree-name dict)
+                      (if balance (+ (* 2 i) 2) i)
+                      lines))
+           (when balance
+             (dictree--goto-line (- midpt i 1))
+             (when (setq entry
+                         (condition-case nil
+                             (dictree--read-line
+                              dict key-loadfun data-loadfun
+                              plist-loadfun)
+                           (error (error "Error reading line %d of %s"
+                                         (- midpt i 1) file))))
+               (dictree-insert dict (car entry)
+                               (nth 1 entry) insert-function)
+               (setf
+                (dictree--cell-plist
+                 (dictree--lookup dict (car entry) nil))
+                (nth 2 entry)))))
+
+         ;; if inserting from mid-point out, and file contains an even
+         ;; number of keys, we still have to add the last one
+         (when (and balance (= 0 (mod lines 2)))
+           (dictree--goto-line lines)
+           (when (setq entry
+                       (condition-case nil
+                           (dictree--read-line
+                            dict key-loadfun data-loadfun
+                            plist-loadfun)
+                         (error (error "Error reading line %d of %s"
+                                       lines file))))
+             (dictree-insert dict (car entry) (nth 1 entry)
+                             insert-function)
+             (setf (dictree--cell-plist
+                    (dictree--lookup dict (car entry) nil))
+                   (nth 2 entry))))
+
+         (message "Inserting keys in %s...done" (dictree-name dict)))
+       (kill-buffer buff)))))
+
+
+
+(defun dictree--read-line
+  (dict &optional key-loadfun data-loadfun plist-loadfun)
+  ;; Return a list containing the key, data (if any, otherwise nil) and
+  ;; property list (ditto) at the current line of the current buffer,
+  ;; for dictionary DICT.
+  (save-excursion
+    (let (key data plist)
+      ;; read key
+      (beginning-of-line)
+      (when (setq key (read (current-buffer)))
+       (when key-loadfun (setq key (funcall key-loadfun key)))
+       ;; if there's anything after the key, use it as data
+       (unless (eq (line-end-position) (point))
+         (setq data (read (current-buffer))))
+       (when data-loadfun (setq data (funcall data-loadfun data)))
+       ;; if there's anything after the data, use is as the property
+       ;; list
+       (unless (eq (line-end-position) (point))
+         (setq plist (read (current-buffer))))
+       (when plist-loadfun (funcall plist-loadfun plist))
+       ;; return the key and data
+       (list key data plist)))))
+
+
+
+(defun dictree-dump-to-buffer (dict &optional buffer type)
+  "Dump keys and their associated data
+from dictionary DICT to BUFFER, in the same format as that used
+by `dictree-populate-from-file'. If BUFFER exists, data will be
+appended to the end of it. Otherwise, a new buffer will be
+created. If BUFFER is omitted, the current buffer is used.
+
+TYPE determines the type of sequence to use to represent the
+keys, and should be one of 'string, 'vector or 'list. The default
+is 'vector.
+
+Note that if the data does not have a read syntax, the dumped
+data can not be used to recreate the dictionary using
+`dictree-populate-from-file'.
+
+Interactively, DICT and BUFFER are read from the mini-buffer,
+TYPE is always 'string."
+  (interactive (list (read-dict "Dictionary: ")
+                    (read-buffer
+                     "Buffer to dump to (defaults to current): "
+                     (buffer-name (current-buffer)))
+                    'string))
+  (when (and (called-interactively-p 'any) (symbolp dict))
+    (setq dict (eval dict)))
+
+  ;; select the buffer, creating it if necessary
+  (if buffer
+      (setq buffer (get-buffer-create buffer))
+    (setq buffer (current-buffer)))
+  (set-buffer buffer)
+
+  ;; move point to end of buffer and make sure it's at start of new line
+  (goto-char (point-max))
+  (unless (= (point) (line-beginning-position))
+    (insert "\n"))
+
+  ;; dump keys
+  (message "Dumping keys from %s to %s..."
+          (dictree-name dict) (buffer-name buffer))
+  (let ((count 0) (dictsize (dictree-size dict)))
+    (message "Dumping keys from %s to %s...(key 1 of %d)"
+            (dictree-name dict) (buffer-name buffer) dictsize)
+
+    ;; map dump function over dictionary
+    (dictree--mapc
+     (lambda (key data plist)
+       (when (= 99 (mod count 100))
+        (message "Dumping keys from %s to %s...(key %d of %d)"
+                 (dictree-name dict) (buffer-name buffer)
+                 (1+ count) dictsize))
+       (insert (prin1-to-string
+               (funcall (or (dictree--key-savefun dict) 'identity)
+                        key)))
+       (when (setq data
+                  (funcall (or (dictree--data-savefun dict) 'identity)
+                           data))
+        (insert " " (prin1-to-string data)))
+       (when (setq plist
+                  (funcall (or (dictree--plist-savefun dict) 'identity)
+                           plist))
+        (unless data (insert " nil"))
+        (insert " " (prin1-to-string plist)))
+       (insert "\n")
+       (setq count (1+ count)))
+     dict type)  ; dictree-mapc target
+
+    (message "Dumping keys from %s to %s...done"
+            (dictree-name dict) (buffer-name buffer)))
+  (switch-to-buffer buffer))
+
+
+
+(defun dictree-dump-to-file (dict filename &optional type overwrite)
+  "Dump keys and their associated data
+from dictionary DICT to a text file FILENAME, in the same format
+as that used by `dictree-populate-from-file'. Prompts to overwrite
+FILENAME if it already exists, unless OVERWRITE is non-nil.
+
+TYPE determines the type of sequence to use to represent the
+keys, and should be one of 'string, 'vector or 'list. The default
+is 'vector.
+
+Note that if the data does not have a read syntax and no , the dumped
+data can not be used to recreate the dictionary using
+`dictree-populate-from-file'.
+
+Interactively, DICT and FILE are read from the mini-buffer,
+OVERWRITE is the prefix argument, and TYPE is always 'string."
+  (interactive (list (read-dict "Dictionary: ")
+                    (read-file-name "File to dump to: " nil "")))
+  (when (and (called-interactively-p 'any) (symbolp dict))
+    (setq dict (eval dict)))
+
+  (if (and (called-interactively-p 'any) (string= filename ""))
+      (message "Dictionary %s NOT dumped" (dictree-name dict))
+
+    ;; check if file exists, and prompt to overwrite it if necessary
+    (if (and (file-exists-p filename)
+            (not overwrite)
+            (not (y-or-n-p
+                  (format "File %s already exists. Overwrite? "
+                          filename))))
+       (message "Key dump cancelled")
+
+      (let (buff)
+       ;; create temporary buffer, dump keys to it, and save to
+       ;; FILENAME
+       (setq buff (generate-new-buffer filename))
+       (save-window-excursion
+         (dictree-dump-to-buffer dict buff type)
+         (write-file filename))
+       (kill-buffer buff)))))
+
+
+
+
+;; ----------------------------------------------------------------
+;;                     Minibuffer completion
+
+(defvar dictree-history nil
+  "History list for commands that read a dictionary name.")
+
+(defvar dictree-loaded-history nil
+  "History list for commands that read a loaded dictionary name.")
+
+
+;;;###autoload
+(defun read-dict
+  (prompt &optional default dictlist allow-unloaded allow-unmatched)
+  "Read the name of a dictionary with completion, and return it.
+
+Prompt with PROMPT. By default, return DEFAULT. If DICTLIST is
+supplied, only complete on dictionaries in that list.
+
+If ALLOW-UNLOADED is non-nil, also complete on the names of
+unloaded dictionaries (actually, on any Elisp file in the current
+`load-path' restricted to subdirectories of your home directory
+whose file name starts with \"dict-\"). If an unloaded dictionary
+is read, the name of the Elisp file will be returned, without
+extension, suitable for passing to `load-library'."
+
+  (let (dictname paths)
+    ;; when allowing unloaded dictionaries...
+    (when allow-unloaded
+      ;; get paths in load-path that are subdirectories of home
+      ;; directory
+      (dolist (d load-path)
+       (when (eq (aref d 0) ?~) (push d paths)))
+      ;; gather names of all Elisp libraries in this restricted
+      ;; load-path
+      (dolist (f (all-completions
+                 "" (apply-partially 'locate-file-completion-table
+                                     paths (get-load-suffixes))))
+       (when (and (null (file-name-directory f))
+                  (and (> (length f) 5)
+                       (string= (substring f 0 5) "dict-"))
+                  (null (file-name-extension f))
+                  (not (member (file-name-sans-extension f) dictname)))
+         (push (file-name-sans-extension f) dictname))))
+    ;; gather names of loaded dictionaries
+    (mapc (lambda (dict)
+           (unless (or (null (dictree-name dict))
+                       (member (dictree-name dict) dictname))
+             (push (list (dictree-name dict)) dictname)))
+         (or dictlist dictree-loaded-list))
+    ;; do completing-read
+    (setq dictname (completing-read
+                   prompt
+                   (if allow-unmatched
+                       (completion-table-in-turn
+                        dictname 'read-file-name-internal)
+                     dictname)
+                   nil (not allow-unmatched) nil
+                   (if allow-unloaded
+                       'dictree-history
+                     'dictree-loaded-history)
+                   (and (dictree-p default) (dictree-name default))))
+    ;; return dictionary
+    (cond
+     ;; if user typed a file name, return that
+     ((and allow-unmatched (file-regular-p dictname)) dictname)
+     ;; if user selected a loaded dictionary, return dict itself
+     ((condition-case nil
+         (dictree-p (eval (intern-soft dictname)))
+       (void-variable nil))
+      (intern-soft dictname))
+     ;; if user selected an unloaded dictionary, return dict name
+     ((and allow-unloaded (stringp dictname)) dictname)
+     ;; if DEFAULT was specified, return that
+     (default default)
+     ;; should never get here!
+     (t (error "Unknown error reading dictionary")))
+    ))
+
+
+
+;; ----------------------------------------------------------------
+;;            Pretty-print dictionaries during edebug
+
+;; We advise the `edebug-prin1' and `edebug-prin1-to-string' functions
+;; (actually, aliases) so that they print "#<dict-tree NAME>" instead of
+;; the full print form for dictionaries.
+;;
+;; This is because, if left to its own devices, edebug hangs for ages
+;; whilst printing large dictionaries, and you either have to wait for a
+;; *very* long time for it to finish, or kill Emacs entirely. (Even C-g
+;; C-g fails!)
+;;
+;; We do this also for lists of dictionaries, since those occur quite
+;; often, but not for other sequence types or deeper nested structures,
+;; to keep the implementation as simple as possible.
+;;
+;; Since the print form of a dictionary is practically incomprehensible
+;; anyway, we don't lose much by doing this. If you *really* want to
+;; print dictionaries in full whilst edebugging, despite this warning,
+;; disable the advice.
+;;
+;; FIXME: Should use `cedet-edebug-prin1-extensions' instead of advice
+;;        when `cedet-edebug' is loaded, though I believe this still
+;;        works in that case.
+
+
+(eval-when-compile
+  (require 'edebug)
+  (require 'advice))
+
+
+(defun dictree--edebug-pretty-print (object)
+  (cond
+   ((dictree-p object)
+    (concat "#<dict-tree \"" (dictree-name object) "\">"))
+   ((null object) "nil")
+   ((let ((dlist object) (test t))
+      (while (or (dictree-p (car-safe dlist))
+                (and dlist (setq test nil)))
+       (setq dlist (cdr dlist)))
+      test)
+    (concat "(" (mapconcat (lambda (d)
+                            (concat "#<dict-tree \""
+                                    (dictree-name d) "\">"))
+                          object " ") ")"))
+;; ((vectorp object)
+;;  (let ((pretty "[") (len (length object)))
+;;    (dotimes (i (1- len))
+;;     (setq pretty
+;;           (concat pretty
+;;                   (if (trie-p (aref object i))
+;;                       "#<trie>" (prin1-to-string (aref object i))) " ")))
+;;    (concat pretty
+;;           (if (trie-p (aref object (1- len)))
+;;               "#<trie>" (prin1-to-string (aref object (1- len))))
+;;           "]")))
+   ))
+
+
+(when (fboundp 'ad-define-subr-args)
+  (ad-define-subr-args 'edebug-prin1 '(object &optional printcharfun)))
+
+(defadvice edebug-prin1
+  (around dictree activate compile preactivate)
+  (let ((pretty (dictree--edebug-pretty-print object)))
+    (if pretty
+       (progn
+         (prin1 pretty printcharfun)
+         (setq ad-return-value pretty))
+    ad-do-it)))
+
+
+(when (fboundp 'ad-define-subr-args)
+  (ad-define-subr-args 'edebug-prin1-to-string '(object &optional noescape)))
+
+(defadvice edebug-prin1-to-string
+  (around dictree activate compile preactivate)
+  (let ((pretty (dictree--edebug-pretty-print object)))
+    (if pretty
+       (setq ad-return-value pretty)
+      ad-do-it)))
+
+
+
+(provide 'dict-tree)
+
+;;; dict-tree.el ends here
diff --git a/packages/djvu/djvu.el b/packages/djvu/djvu.el
new file mode 100644 (file)
index 0000000..a5816ef
--- /dev/null
@@ -0,0 +1,1629 @@
+;;; djvu.el --- Edit and view Djvu files via djvused
+
+;; Copyright (C) 2011  Free Software Foundation, Inc.
+
+;; Author: Roland Winkler <winkler@gnu.org>
+;; Keywords: files, wp
+;; Version: 0.5
+
+;; This file 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.
+
+;; djvu.el 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 djvu.el.  If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This package is a front end for the command-line program djvused
+;; from DjVuLibre, see http://djvu.sourceforge.net/.  It assumes you
+;; have the programs djvused, djview, and ddjvu installed.
+;;
+;; A normal work flow is as follows:
+;;
+;; To visit a djvu file type M-x fjvu-find-file.  This command is the
+;; only entry point to this package.  You may want to bind this
+;; command to a key you like.  I use
+;;
+;;   (global-set-key "\C-cd" 'djvu-find-file)
+;;
+;; If you use this command to visit file foo.djvu, it puts you into
+;; the (read-only) buffer foo@djvu.  Normally, this buffer is all you
+;; need.
+;;
+;; The menu bar of this buffer lists most of the commands with their
+;; repsective key bindings.  For example, you can:
+;;
+;; - Use `g' to go to the page you want. (Yes, this package operates on
+;;   one page at a time. I guess that anything else would be too slow
+;;   for large documents.)
+;;
+;; - Use `v' to (re)start djview using the position in foo.djvu
+;;   matching where point is in foo@djvu.  (I find djview fast enough
+;;   for this, even for larger documents.)
+;;
+;; - To highlight a region in foo.djvu mark the corresponding region
+;;   in foo@djvu (as usual, `transient-mark-mode' comes handy for
+;;   this).  Then type `h' and add a comment in the minibuffer if you
+;;   like.  Type C-x C-s to save this editing.  Then type `v' to
+;;   (re)start djview to show what you have done.
+;;
+;; - Type i to enable `djvu-image-mode', a minor mode displaying the
+;;   current page as an image.  Then
+;;     drag-mouse-1 defines a region where to put a comment,
+;;     C-drag-mouse-1 defines a region where to put a pushpin comment,
+;;     S-drag-mouse-1 defines a region to highlight
+;;
+;; - The editing of the text, annotation and outline (bookmark) layers
+;;   really happens in the buffers foo@djvu-t.el, foo@djvu-a.el, and
+;;   foo@djvu-o.el.  (The djvused syntax used in these buffers is so
+;;   close to elisp that it was natural to give these buffers a
+;;   djvu-edit-mode that is derived from emacs-lisp-mode.)
+;;
+;;   You can check what is happening by switching to these buffers.
+;;   The respective switching commands put point in these buffers such
+;;   that it matches where you were in foo@djvu.
+;;
+;;   In these buffers, the menu bar lists a few low-level commands
+;;   available for editing these buffers directly.  If you know the
+;;   djvused syntax, sometimes it can also be helpful to do such
+;;   editing "by hand".
+;;
+;; But wait: the syntax in the annotations buffer foo@djvu-a.el is a
+;; slightly modified djvused syntax.  djvused can only highlight
+;; rectangles.  So the highlighting of larger regions of text must use
+;; multiple rectangles (i.e., multiple djvused "mapareas").  To make
+;; editing easier, these are combined in the buffer foo@djvu-a.el.
+;; (Before saving these things, they are converted using the proper
+;; djvused syntax.)
+;;
+;; When you visit a djvu file, djvu-mode recognizes mapareas belonging
+;; together by checking that "everything else in these mapareas except
+;; for the rects" is the same.  So if you entered a (unique) comment,
+;; this allows djvu-mode to combine all the mapareas when you visit
+;; such a file the second time.  Without a comment, this fails!
+;;
+;; A second difference between what is displayed in the djvu buffers
+;; and the input/output of djvused refers to nonascii characters.  I
+;; am using djvused from DjVuLibre-3.5.22 which handles utf-8 by
+;; backslash sequences.  So djvu mode converts these backslash
+;; sequences into the corresponding utf-8 characters.  (More recent
+;; versions of djvused can do this conversion, too.)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Djvu internals:
+;; (see /usr/share/doc/libdjvulibre-dev/djvu3spec.djvu)
+;;
+;; Supported area attributes             rect  oval  poly  line  text
+;; (none)/(xor)/(border c)                X     X     X     X     X
+;; (shadow_* t)                           X
+;; (border_avis)                          X     X     X
+;; (hilite color) / (opacity o)           X
+;; (arrow) / (width w) / (lineclr c)                        X
+;; (backclr c) / (textclr c) / (pushpin)                          X
+;;
+;; c = #RRGGBB   t = thickness (1..32)
+;; o = opacity = 0..100
+
+;;; Code:
+
+(defvar djvu-color-highlight "yellow"
+  "Default color for highlighting.")
+
+(defvar djvu-color-himark "red"
+  "Default color for highmarking.")
+
+(defvar djvu-color-url "blue"
+  "Default color for URLs.")
+
+(defvar djvu-color-background "white"
+  "Default background.")
+
+(defvar djvu-color-alist
+  ;; If the keys are strings, they are directly compatible with what
+  ;; we get back from something like `completing-read'.
+  '(("red"    . "#FF0070")
+    ("green"  . "#00FF00")
+    ("blue"   . "#6666FF")
+    ("yellow" . "#EEFF00")
+    ("white"  . "#FFFFFF"))
+  "Alist of colors for highlighting.")
+
+(defvar djvu-opacity 50
+  "Default opacity for Highlighting.")
+
+(defvar djvu-coords-justify 0.02
+  "Upper threshold for justifying rect coordinates.")
+
+(defvar djvu-fill-column 50
+  "Fill column for Djvu annotations.")
+
+(defvar djvu-all-buffer "*djvu*"
+  "Buffer for `all' operations.")
+
+(defvar djvu-buffer-name-extensions
+  '("@djvu" "@djvu-t.el" "@djvu-a.el" "@djvu-o.el")
+  "Extensions for Djvu buffer names.
+This is a list with four elements (READ TEXT ANNOT OUTLINE).")
+
+(defvar djvu-resolve-url nil
+  "Flag for resolving internal URLs.
+If 'long replace short page numbers by long FileIDs.
+If 'short replace long FileIDs by short page numbers.
+If nil do nothing.")
+
+(defvar djvu-image-size 1024
+  "Size of internally displayed image.")
+
+;; Internal variables
+
+(defvar djvu-test nil
+  "If non-nil do not process / delete djvused scripts.")
+;; (setq djvu-test t) (setq djvu-test nil)
+
+(defvar djvu-doc nil
+  "Internal look-up table (a vector) for each Djvu document.
+For the different buffers of one Djvu document the buffer-local
+value of this variable is the same vector holding all the
+relevant information about this document. This way, we obtain a
+\"document-local\" variable, where changes are seen in all buffers
+refering to this Djvu document.")
+(make-variable-buffer-local 'djvu-doc)
+
+;;; Helper functions
+
+;; "read" refers to the text-only display of djvu files inside emacs
+;; "view" refers to external graphical viewers (default djview)
+
+(eval-and-compile
+  (let ((count 0))
+    (dolist (elt '(file basename text-buf read-buf annot-buf outline-buf
+                        page pagemax page-id pagesize pos view-proc image))
+      (eval (list 'defsubst (intern (concat "djvu-doc-" (symbol-name elt)))
+                  '(&optional doc) `(aref (or doc djvu-doc) ,count)))
+      (eval (list 'defsubst (intern (concat "djvu-doc-set-" (symbol-name elt)))
+                  '(val &optional doc) `(aset (or doc djvu-doc) ,count val)))
+      (setq count (1+ count)))
+    (eval `(defconst djvu-doc-length ,count))))
+
+(defun djvu-switch-text ()
+  "Switch to Djvu Text buffer."
+  (interactive)
+  (let ((pos (djvu-read-pos)))
+    (switch-to-buffer (djvu-doc-text-buf))
+    (djvu-locate-pos 'word pos)))
+
+(defun djvu-switch-annot ()
+  "Switch to Djvu Annotations buffer."
+  (interactive)
+  (let ((pos (djvu-read-pos)))
+    (switch-to-buffer (djvu-doc-annot-buf))
+    (djvu-locate-pos 'rect pos)))
+
+(defun djvu-switch-outline ()
+  "Switch to Djvu Outline buffer."
+  (interactive)
+  ;; Try to locate the current page in the outline buffer.
+  ;; If this page is not defined, try to locate the nearest preceding page.
+  (let ((page (djvu-doc-page)) pnt)
+    (with-current-buffer (djvu-doc-outline-buf)
+      (goto-char (point-min))
+      (if (looking-at "(bookmarks")
+          (while (and (< 0 page)
+                      (not (setq pnt (re-search-forward
+                                      (format "\"#%d\"" page) nil t))))
+            (setq page (1- page)))))
+    (switch-to-buffer (djvu-doc-outline-buf))
+    (if pnt (goto-char pnt))))
+
+(defun djvu-switch-read ()
+  "Switch to Djvu Read buffer."
+  (interactive)
+  (switch-to-buffer (djvu-doc-read-buf)))
+
+(defun djvu-goto-page (page)
+  "Goto PAGE of Djvu document."
+  (interactive
+   (let ((str (read-string (format "Page (f, 1-%d, l): " (djvu-doc-pagemax)))))
+     (list (cond ((string-match "\\`f" str) 1)
+                 ((string-match "\\`l" str) (djvu-doc-pagemax))
+                 ((string-match "\\`[[:digit:]]+\\'" str)
+                  (string-to-number str))
+                 (t (error "Page `%s' invalid" str))))))
+  (if (or (not (integerp page))
+          (<= page 0) (< (djvu-doc-pagemax) page))
+      (error "Page `%s' out of range" page))
+  (djvu-init-page djvu-doc page))
+
+(defun djvu-next-page (n)
+  (interactive "p")
+  (djvu-goto-page (+ (djvu-doc-page) n)))
+
+(defun djvu-prev-page (n)
+  (interactive "p")
+  (djvu-goto-page (- (djvu-doc-page) n)))
+
+(defun djvu-set-color-highlight (color)
+  "Set color for highlighting based on `djvu-color-alist'."
+  (interactive (list (completing-read "Color: " djvu-color-alist nil t)))
+  (setq djvu-color-highlight color))
+
+(defun djvu-kill-view (&optional doc)
+  (when (djvu-doc-view-proc doc)
+    (unless (memq (process-status (djvu-doc-view-proc doc))
+                  '(exit signal))
+      (kill-process (djvu-doc-view-proc doc)))
+    (djvu-doc-set-view-proc nil doc)))
+
+(defun djvu-kill-doc (&optional doc)
+  (interactive)
+  (djvu-save doc t)
+  (djvu-kill-view doc)
+  (mapc 'kill-buffer (list (djvu-doc-text-buf doc) (djvu-doc-read-buf doc)
+                           (djvu-doc-annot-buf doc) (djvu-doc-outline-buf doc))))
+
+(defsubst djvu-delete-file (script)
+  (unless djvu-test (delete-file script)))
+
+(defun djvu-save (&optional doc query)
+  "Save Djvu DOC."
+  (interactive)
+  (let ((pos (djvu-read-pos))
+        (text-modified  (buffer-modified-p (djvu-doc-text-buf doc)))
+        (annot-modified (buffer-modified-p (djvu-doc-annot-buf doc)))
+        (outline-modified (buffer-modified-p (djvu-doc-outline-buf doc)))
+        script)
+    (when (and (or text-modified annot-modified outline-modified)
+               (or (not query)
+                   (yes-or-no-p (format "Save %s? " (djvu-doc-basename doc)))))
+      (unwind-protect
+          (progn
+            (setq script (make-temp-file "djvu-el-"))
+            (if text-modified (djvu-process-text script doc))
+            (if annot-modified (djvu-process-annot script doc))
+            (if outline-modified (djvu-process-outline script doc))
+            (djvu-djvused doc nil "-f" script "-s")
+            (dolist (buf (list (djvu-doc-text-buf doc) (djvu-doc-annot-buf doc)
+                               (djvu-doc-outline-buf doc) (djvu-doc-read-buf doc)))
+              (with-current-buffer buf (set-buffer-modified-p nil)))
+            (if text-modified (djvu-locate-read-pos pos)))
+        (djvu-delete-file script)))))
+
+(defun djvu-modified ()
+  "Mark Djvu Read buffer as modified if necessary.
+Used in `post-command-hook' of the Djvu Outline, Text and Read buffers."
+  (with-current-buffer (djvu-doc-read-buf)
+    (set-buffer-modified-p (or (buffer-modified-p (djvu-doc-outline-buf))
+                               (buffer-modified-p (djvu-doc-text-buf))
+                               (buffer-modified-p (djvu-doc-annot-buf))))))
+
+(defun djvu-process (&optional doc view)
+  "Process Djvu DOC."
+  (interactive (list djvu-doc t))
+  (djvu-save doc)
+  (if view (djvu-view doc)))
+
+(defun djvu-djvused (doc buffer &rest args)
+  ;; BUFFER is nil if we update the Djvu file.
+  (unless (or buffer (file-writable-p (djvu-doc-file doc)))
+    (error "File `%s' not writable"
+           (abbreviate-file-name (djvu-doc-file doc))))
+  (unless (and (not buffer) djvu-test)
+    (let ((status (apply 'call-process "djvused" nil buffer nil
+                         (djvu-doc-file doc) args)))
+      (unless (zerop status)
+        (error "Djvused error %s (args: %s)" status args)))))
+
+(defun djvu-hide-hash (&optional recover)
+  (let* ((old (concat " " (if recover "@!@" "#") "\\([[:xdigit:]]\\)"))
+         (new (concat " " (if recover "#" "@!@") "\\1")))
+    (goto-char (point-min))
+    (while (re-search-forward old nil t) (replace-match new))))
+
+(defun djvu-interactive-region ()
+  "Return active region for use in interactive calls."
+  (let (beg end)
+    (if (use-region-p)
+        (setq beg (region-beginning)
+              end (region-end))
+      (setq beg (point) end (1+ (point))))
+    (cons (if (get-text-property beg 'word)
+              (djvu-property-beg beg 'word)
+            (next-single-property-change beg 'word nil end))
+          (if (get-text-property (1- end) 'word)
+              (djvu-property-end end 'word)
+            (previous-single-property-change end 'word nil beg)))))
+
+(defun djvu-interactive-color (color)
+  "Return color specification for use in interactive calls."
+  (let ((colnum (or (and (consp current-prefix-arg)
+                         (1- (/ (car current-prefix-arg) 4)))
+                    (and (integerp current-prefix-arg)
+                         current-prefix-arg))))
+    (if (and colnum (>= colnum (length djvu-color-alist)))
+        (error "Color undefined"))
+    (if colnum (car (nth colnum djvu-color-alist)) color)))
+
+(defun djvu-interactive-url (&optional color interrupt)
+  "Return URL specification for use in interactive calls."
+  (unless color (setq color djvu-color-url))
+  (let ((fmt (format "(%s) Page URL: " (or color djvu-color-url)))
+        (page "") num ignore)
+    (while (and (not ignore)
+                (or (not (integerp (setq num (string-to-number page))))
+                    (< num 1) (< (djvu-doc-pagemax) num)))
+      (setq page (read-string fmt))
+      (if (and interrupt (string= "" page)) (setq ignore t)))
+    (unless ignore (concat "#" page))))
+
+(defsubst djvu-color-string-to-hex (color i)
+  "Convert rgb COLOR string (part I) to hex number."
+  (string-to-number (substring-no-properties
+                     (cdr (assoc color djvu-color-alist))
+                     (1+ (* i 2)) (+ 3 (* i 2))) 16))
+
+(defun djvu-color-background (color background opacity)
+  "For rgb COLOR and BACKGROUND apply OPACITY.
+Return the new rgb color string."
+  (let* ((str "#")
+         ;; Why opacity squared??
+         (a (/ (float (* opacity opacity)) 10000))
+         (b (- 1 a)))
+    (dotimes (i 3 str)
+      (setq str (concat str (format "%X"
+            (round (+ (* a (djvu-color-string-to-hex color i))
+                      (* b (djvu-color-string-to-hex background i))))))))))
+
+;;; Djvu modes
+
+(defvar djvu-read-mode-map
+  (let ((km (make-sparse-keymap)))
+    (define-key km "i"           'djvu-image-mode)
+    (define-key km "v"           'djvu-view)
+    (define-key km "\C-c\C-v"    'djvu-view)
+    (define-key km "n"           'djvu-next-page)
+    (define-key km "p"           'djvu-prev-page)
+    (define-key km "g"           'djvu-goto-page)
+    (define-key km "k"           'djvu-kill-doc)
+    (define-key km "\C-c\C-c"    'djvu-process)
+    (define-key km "\C-x\C-s"    'djvu-save)
+
+    (define-key km "h"           'djvu-highlight)
+    (define-key km "u"           'djvu-url)
+    (define-key km "a"           'djvu-switch-annot)
+    (define-key km "A"           'djvu-display-annot-all)
+
+    (define-key km "c"           'djvu-comment)
+    (define-key km "C"           'djvu-comment-pushpin)
+    (define-key km "b"           'djvu-bookmark)
+    (define-key km "m"           'djvu-himark)
+    (define-key km "o"           'djvu-switch-outline)
+
+    (define-key km "s"           'djvu-split-word)
+    (define-key km "w"           'djvu-merge-words)
+    (define-key km "l"           'djvu-merge-lines)
+
+    (define-key km "t"           'djvu-switch-text)
+    (define-key km "T"           'djvu-display-text-all)
+    km)
+  "Keymap for Djvu Read Mode.
+This is a child of `special-mode-map'.")
+
+(easy-menu-define
+  djvu-read-menu djvu-read-mode-map "Djvu Menu"
+  '("Djvu"
+    ["View File" djvu-view t]
+    ["Image File" djvu-image-mode t]
+    ["Go to Page" djvu-goto-page t]
+    ["Process Doc" djvu-process t]
+    ["Save Doc" djvu-save t]
+    "---"
+    ["Split Word" djvu-split-word t]
+    ["Merge Words" djvu-merge-words t]
+    ["Merge Lines" djvu-merge-lines t]
+    ["Switch to Text" djvu-switch-text t]
+    "---"
+    ["Highlight Region" djvu-highlight t]
+    ["URL over Region" djvu-url t]
+    ["Himark Region" djvu-himark t]
+    ["Add Comment" djvu-comment t]
+    ["Add Comment w/pushpin" djvu-comment-pushpin t]
+    ["Switch to Annotations" djvu-switch-annot t]
+    "---"
+    ["Show all Text" djvu-display-text-all t]
+    ["Show all Annotations" djvu-display-annot-all t]
+    ["Resolve all URLs" djvu-resolve-all-urls t]
+    ["Process all Annotations" djvu-process-all t]
+    ["Remove Annot / Outline" djvu-make-clean t]
+    "---"
+    ["Add Bookmark" djvu-bookmark t]
+    ["Switch to Outline" djvu-switch-outline t]
+    "---"
+    ["Quit Djvu" quit-window t]
+    ["Kill Djvu buffers" djvu-kill-doc t]))
+
+(define-derived-mode djvu-read-mode special-mode "Djview"
+  "Mode for reading Djvu files."
+  (setq mode-line-buffer-identification
+        (list 24 (buffer-name) "  "
+              '(:eval (format "p%d" (djvu-doc-page))))))
+
+(defvar djvu-edit-mode-map
+  (let ((km (make-sparse-keymap)))
+    (define-key km "\C-c\C-r"    'djvu-switch-read)
+    (define-key km "\C-c\C-g"    'djvu-goto-page)
+    (define-key km "\C-c\C-s"    'djvu-split-word-internal)
+    (define-key km "\C-c\C-m"    'djvu-merge-words-internal)
+    (define-key km "\C-c\M-m"    'djvu-merge-lines-internal)
+    (define-key km "\C-c\C-c"    'djvu-process)
+    (define-key km "\C-x\C-s"    'djvu-save)
+    (define-key km "\C-c\C-v"    'djvu-view)
+    (define-key km "\C-c\C-k"    'djvu-kill-doc)
+    km)
+  "Keymap for Djvu Annot Mode.
+This is a child of `text-mode-map'.")
+
+(easy-menu-define
+  djvu-annot-menu djvu-edit-mode-map "Djvu Menu"
+  '("Djvu"
+    ["Go to Page" djvu-goto-page t]
+    ["Switch to Read" djvu-switch-read t]
+    ["Process Doc" djvu-process t]
+    ["Save Doc" djvu-save t]
+    "---"
+    ["Switch to Text" djvu-switch-text t]
+    ["Split Word" djvu-split-word-internal t]
+    ["Merge Words" djvu-merge-words-internal t]
+    ["Merge Lines" djvu-merge-lines-internal t]
+    "---"
+    ["Switch to Annot" djvu-switch-annot t]
+    "---"
+    ["Quit Djvu" quit-window t]
+    ["Kill Djvu buffers" djvu-kill-doc t]))
+
+(define-derived-mode djvu-edit-mode emacs-lisp-mode "Djvu Edit"
+  "Mode for editing (parts of) Djvu files."
+  (setq mode-line-buffer-identification
+        (list 24 (buffer-name) "  "
+              '(:eval (format "p%d" (djvu-doc-page))))))
+
+;;; General Setup
+
+;;;###autoload
+(defun djvu-find-file (file &optional page view)
+  "Read and edit Djvu FILE on PAGE.
+If VIEW is non-nil start external viewer."
+  (interactive
+   (list (read-file-name "Find Djvu file: " nil nil nil nil
+                         (lambda (f)
+                           (or (equal "djvu" (file-name-extension f))
+                               (file-directory-p f))))
+         (prefix-numeric-value current-prefix-arg)))
+  (unless page (setq page 1))
+  (setq file (expand-file-name file))
+  (unless (file-regular-p file)
+    (error "Cannot open Djvu file `%s'." file))
+  ;; Initialize `djvu-doc' for FILE.
+  (let* ((basename (file-name-sans-extension
+                    (file-name-nondirectory file)))
+         (read-buf  (concat basename (nth 0 djvu-buffer-name-extensions)))
+         (text-buf  (concat basename (nth 1 djvu-buffer-name-extensions)))
+         (annot-buf (concat basename (nth 2 djvu-buffer-name-extensions)))
+         (outline-buf (concat basename (nth 3 djvu-buffer-name-extensions)))
+         (buffers (list text-buf read-buf annot-buf outline-buf))
+         doc)
+    ;; Do nothing if we are already visiting FILE such that all required
+    ;; buffers are properly defined.  If some buffers were killed
+    ;; do not attempt to recycle the remaining buffers.
+    (if (eval (cons 'and (mapcar 'get-buffer buffers)))
+        (with-current-buffer read-buf
+          (setq doc djvu-doc))
+      (setq doc (make-vector djvu-doc-length nil))
+      (dolist (buf buffers)
+        (if (get-buffer buf)  (kill-buffer buf)))
+      (djvu-doc-set-file file doc)
+      (djvu-doc-set-basename basename doc)
+      (djvu-doc-set-text-buf (get-buffer-create text-buf) doc)
+      (djvu-doc-set-read-buf (get-buffer-create read-buf) doc)
+      (djvu-doc-set-annot-buf (get-buffer-create annot-buf) doc)
+      (djvu-doc-set-outline-buf (get-buffer-create outline-buf) doc)
+      ;; Initialize all buffers.
+      (dolist (buf (list (djvu-doc-text-buf doc) (djvu-doc-annot-buf doc)
+                         (djvu-doc-outline-buf doc)))
+        (with-current-buffer buf
+          (djvu-edit-mode)
+          (setq djvu-doc doc)
+          (cd (file-name-directory (djvu-doc-file)))
+          (add-hook 'post-command-hook 'djvu-modified nil t)))
+      (with-current-buffer (djvu-doc-read-buf doc)
+        (djvu-read-mode)
+        (setq djvu-doc doc)
+        (cd (file-name-directory (djvu-doc-file)))
+        (add-hook 'post-command-hook 'djvu-modified nil t))
+      (djvu-init-page doc page))
+    (if view (djvu-view doc))
+    (switch-to-buffer read-buf)))
+
+(defun djvu-init-page (&optional doc page)
+  "For Djvu DOC initialize PAGE."
+  (if (djvu-doc-pagemax doc) (djvu-save doc t))
+  (djvu-doc-set-pos nil doc)
+  (if page (djvu-doc-set-page page doc))
+  (let* ((doc (or doc djvu-doc))
+         (new (not (djvu-doc-pagemax doc)))
+         object alist)
+    (with-temp-buffer
+      (djvu-djvused doc t "-e"
+                    (format "%sselect %d; size; print-txt; print-ant;"
+                            (if new "n; ls; print-outline; " "")
+                            (djvu-doc-page doc)))
+      (goto-char (point-min))
+      (when new
+        ;; page max
+        (djvu-doc-set-pagemax (read (current-buffer)) doc)
+        ;; page id
+        (let (page-id)
+          (while (progn
+                   (skip-chars-forward " \t\n")
+                   (looking-at "\\(?:\\([0-9]+\\)[ \t]+\\)?\\([PIAT]\\)[ \t]+\\([0-9]+\\)[ \t]+\\([^ \t\n]+\\)$"))
+            (if (match-string 1)
+                ;; page-id is an alist with elements (PAGE-NUM . FILE-ID)
+                (push (cons (match-string 1) (match-string 4)) page-id))
+            (goto-char (match-end 0)))
+          (unless (eq (djvu-doc-pagemax doc) (length page-id))
+            (error "Page id list broken"))
+          (djvu-doc-set-page-id (nreverse page-id) doc))
+        ;; bookmarks
+        (skip-chars-forward " \t\n")
+        (when (looking-at "(bookmarks")
+          (setq object (read (current-buffer)))
+          (djvu-decode-outline (cdr object))
+          (with-current-buffer (djvu-doc-outline-buf doc)
+            (insert "(bookmarks")
+            (let (print-escape-newlines)
+              (djvu-insert-outline (cdr object) " "))
+            (insert ")\n")
+            (goto-char (point-min))
+            (set-buffer-modified-p nil)
+            (setq buffer-undo-list nil))))
+
+      ;; page size
+      (skip-chars-forward " \t\n")
+      (if (looking-at "width=\\([[:digit:]]+\\)[ \t]+height=\\([[:digit:]]+\\)$")
+          (djvu-doc-set-pagesize (cons (string-to-number (match-string 1))
+                                       (string-to-number (match-string 2))) doc)
+        (error "No pagesize"))
+
+      ;; raw text
+      (goto-char (match-end 0))
+      (skip-chars-forward " \t\n")
+      (setq object (if (looking-at "(\\(page\\|column\\|region\\|para\\|line\\|word\\|char\\)")
+                       (read (current-buffer))))
+      (djvu-decode-text object)
+      (with-current-buffer (djvu-doc-text-buf doc)
+        (erase-buffer)
+        (djvu-insert-text object "")
+        (insert "\n")
+        (goto-char (point-min))
+        (set-buffer-modified-p nil)
+        (setq buffer-undo-list nil))
+
+      ;; Set up read buffer
+      (djvu-init-read doc object)
+
+      ;; Set up annotations buffer:
+      (save-excursion
+        (save-restriction
+          (narrow-to-region (point) (point-max))
+          (djvu-hide-hash)))
+      (setq object nil)
+      (while (progn (skip-chars-forward " \t\n") (not (eobp)))
+        (if (looking-at "(\\(background\\|zoom\\|mode\\|align\\|maparea\\|metadata\\)\\>")
+            (push (read (current-buffer)) object)
+          (error "Unknown annotation `%s'" (buffer-substring-no-properties
+                                           (point) (line-end-position)))))
+      ;; To simplify the editing of annotations, identify mapareas (rect)
+      ;; sharing the same text string.
+      (dolist (elt object)
+        (if (not (eq 'maparea (car elt)))
+            (push elt alist)
+          (setcar (cdr elt) (decode-coding-string (nth 1 elt) 'utf-8))
+          (setcar (nthcdr 2 elt) (decode-coding-string (nth 2 elt) 'utf-8))
+          (cond ((eq 'rect (car (nth 3 elt))) ; rect
+                 (let ((rect (djvu-rect (nth 3 elt)))
+                       e)
+                   (setcdr (nthcdr 2 elt) (nthcdr 4 elt)) ; remove rect destructively
+                   ;; The new elements of alist are cons cells, where the car is the
+                   ;; maparea without rect, and the cdr is the list of rect areas.
+                   ;; Even if we have just an empty string, we still want to massage
+                   ;; the rect box.
+                   (if (or (string= "" (nth 2 elt))
+                           (not (setq e (assoc elt alist))))
+                       (push (cons elt (list rect)) alist)
+                     (setcdr e (cons rect (cdr e))))))
+                ((eq 'text (car (nth 3 elt))) ; text
+                 (setcar (nthcdr 3 elt) (djvu-rect (nth 3 elt)))
+                 (push elt alist))
+                (t (push elt alist)))))
+      ;; Pretty print annotations.
+      (with-current-buffer (djvu-doc-annot-buf doc)
+        (let ((standard-output (current-buffer))
+              print-escape-newlines)
+          (erase-buffer)
+          (dolist (elt alist)
+            (cond ((consp (car elt)) ;; maparea with list of rects
+                   (let ((c (car elt)))
+                     (insert (format "(maparea %S\n %S\n ("
+                                     (djvu-resolve-url (nth 1 c) doc) (nth 2 c))
+                             (mapconcat 'prin1-to-string (cdr elt) "\n  ") ")\n " ; rect
+                             (mapconcat 'prin1-to-string (nthcdr 3 c) " ") ; rest
+                             ")")))
+                  ((not (eq 'maparea (car elt)))
+                   (prin1 elt))
+                  ((eq 'text (car (nth 3 elt))) ; text
+                   (insert (format "(maparea %S\n %S\n " (nth 1 elt) (nth 2 elt))
+                           (mapconcat 'prin1-to-string (nthcdr 3 elt) " ") ; rest
+                           ")"))
+                  (t (error "Djvu maparea %s undefined" (car (nth 3 elt)))))
+            (insert "\n\n")))
+        (djvu-hide-hash t)
+        (goto-char (point-max))
+        (set-buffer-modified-p nil)
+        (setq buffer-undo-list nil)))))
+
+(defun djvu-resolve-url (url &optional doc)
+  "Resolve internal URLs.  See variable `djvu-resolve-url'."
+  (cond ((eq 'long djvu-resolve-url)
+         ;; Replace page number by file id
+         (cond ((string-match "\\`#[0-9]+\\'" url)
+                (let ((page-id (assoc (substring-no-properties url 1)
+                                      (djvu-doc-page-id doc))))
+                  (if page-id
+                      (concat "#" (cdr page-id))
+                    (error "Page id broken: %s" url))))
+               ((string-match "\\`#" url)
+                (if (rassoc (substring-no-properties url 1)
+                            (djvu-doc-page-id doc))
+                    url
+                  (error "Page id broken: %s" url)))
+               (t url))) ; some other URL
+        ((eq 'short djvu-resolve-url)
+         ;; Replace file id by page number
+         (cond ((string-match "\\`#[0-9]+\\'" url)
+                url)
+               ((string-match "\\`#" url)
+                (let ((page-id (rassoc (substring-no-properties url 1)
+                                       (djvu-doc-page-id doc))))
+                  (if page-id
+                      (concat "#" (car page-id))
+                    (error "Page id broken: %s" url))))
+               (t url))) ; some other URL
+        (t url))) ; do nothing
+
+(defun djvu-resolve-all-urls (dir)
+  "Resolve all internal URLs in a Djvu file."
+  (interactive
+   (list (intern (completing-read "Direction: " '((long) (short)) nil t))))
+  (if (djvu-modified) (error "Djvu file should be saved"))
+  (let ((page-id (djvu-doc-page-id djvu-doc))
+        (djvu-all-buffer (generate-new-buffer " *djvu*"))
+        (djvu-resolve-url dir))
+    (djvu-display-annot-all)
+    (with-current-buffer djvu-all-buffer
+      (goto-char (point-min))
+      (cond ((eq dir 'long)
+             (while (re-search-forward "^(maparea[ \t]+\"#\\([0-9]+\\)\"" nil t)
+               (replace-match (cdr (assoc (match-string 1) page-id))
+                              nil nil nil 1)))
+            ((eq dir 'short)
+             (while (re-search-forward "^(maparea[ \t]+\"#\\([^\"]+\\)\"" nil t)
+               (replace-match (car (rassoc (match-string 1) page-id))
+                              nil nil nil 1)))))
+    (djvu-process-all)
+    (kill-buffer djvu-all-buffer)
+    (with-current-buffer (djvu-doc-outline-buf)
+      (set-buffer-modified-p t))
+    (djvu-save)))
+
+(defun djvu-rect (rect &optional back)
+  "Convert (rect xmin ymin width height) to (rect xmin ymin xmax ymax).
+If BACK is non-nil do inverse transformation."
+  (let* ((f (if back '- '+))
+         (lst (list (nth 0 rect) (nth 1 rect) (nth 2 rect)
+                    (funcall f (nth 3 rect) (nth 1 rect))
+                    (funcall f (nth 4 rect) (nth 2 rect)))))
+    ;; Only for back transforms we might get an error...
+    (if (or (> 0 (nth 3 lst)) (> 0 (nth 4 lst)))
+        (error "Annotation rect dimensions %s, %s" (nth 3 lst) (nth 4 lst)))
+    lst))
+
+(defun djvu-view (&optional doc)
+  "Start Djview for DOC."
+  (interactive (list djvu-doc))
+  (if (not (window-system))
+      (message "No window system available")
+    (djvu-kill-view doc)
+    (let* ((djvu-doc doc)
+           (pos (or (djvu-doc-pos) (djvu-read-pos)))
+           (px (/ (float (car pos))
+                  (float (car (djvu-doc-pagesize)))))
+           (py (- 1 (/ (float (cdr pos))
+                       (float (cdr (djvu-doc-pagesize))))))
+           process-connection-type)  ; Use a pipe.
+      (if (or (< px 0) (< 1 px) (< py 0) (< 1 py))
+          (error "px=%s, py=%s out of range" px py))
+      (djvu-doc-set-pos nil)
+      (djvu-doc-set-view-proc
+       (start-process "djview" nil "djview"
+                      (format "-page=%d" (djvu-doc-page))
+                      (format "-showposition=%06f,%06f" px py)
+                      (djvu-doc-file))))))
+
+;;; Djvu Text mode
+
+(defun djvu-split-word (pos)
+  "Split word at position POS.
+This command operates on the read buffer."
+  (interactive "d")
+  (let ((beg (djvu-property-beg pos 'word))
+        (rpos (djvu-read-pos pos)))
+    (with-current-buffer (djvu-doc-text-buf)
+      (djvu-split-word-internal (djvu-locate-pos 'word rpos)
+                                (- pos beg))))
+  ;; Things get rather confusing without updating the read buffer.
+  ;; So we better save everything.
+  (djvu-save))
+
+(defun djvu-split-word-internal (wpos split)
+  "Split word at position WPOS at character position SPLIT.
+This command operates on the text buffer."
+  (interactive
+   (let* ((pnt (point))
+          (pps (parse-partial-sexp (line-beginning-position) pnt)))
+     (unless (nth 3 pps) (error "Not inside string"))
+     (list pnt (1- (- pnt (nth 8 pps))))))
+  (goto-char wpos)
+  (beginning-of-line)
+  (skip-chars-forward " \t")
+  (setq wpos (point))
+  (let ((indent (buffer-substring-no-properties
+                 (line-beginning-position) wpos))
+        word)
+    (condition-case nil
+        (progn
+          (setq word (read (current-buffer)))
+          (unless (eq 'word (car word)) (error "invalid")))
+      (error (error "Syntax error in raw text")))
+    (if (or (< split 1) (<= (length (nth 5 word)) split))
+        (error "nothing to split"))
+    (delete-region wpos (point))
+    ;; To split the bounding box horizontally, we take the fraction
+    ;; of the number of characters in each fragment.  This scheme
+    ;; is only approximate, but it is better than nothing.
+    (let ((frac (round (* (/ (float split) (length (nth 5 word)))
+                          (- (nth 3 word) (nth 1 word))))))
+      (djvu-insert-text (list 'word (nth 1 word) (nth 2 word)
+                              (+ (nth 1 word) frac) (nth 4 word)
+                              (substring (nth 5 word) 0 split)) "")
+      (insert "\n" indent)
+      (djvu-insert-text (list 'word (+ (nth 1 word) frac 1) (nth 2 word)
+                              (nth 3 word) (nth 4 word)
+                              (substring (nth 5 word) split)) ""))))
+
+(defun djvu-merge-words (beg end)
+  "Merge words between positions BEG and END.
+This command operates on the read buffer."
+  (interactive "r")
+  (let ((bpos (djvu-read-pos beg))
+        (epos (djvu-read-pos (1- end))))
+    (with-current-buffer (djvu-doc-text-buf)
+      (djvu-merge-words-internal (djvu-locate-pos 'word bpos)
+                                 (djvu-locate-pos 'word epos))))
+  ;; Things get rather confusing without updating the read buffer.
+  ;; So we better save everything.
+  (djvu-save))
+
+(defun djvu-merge-words-internal (beg end)
+  "Merge words between positions BEG and END.
+This command operates on the text buffer."
+  (interactive "r")
+  (let (words)
+    (goto-char end)
+    (if (bolp) (setq end (1- end)))
+    (goto-char beg)
+    (beginning-of-line)
+    (skip-chars-forward " \t")
+    (setq beg (point))
+    (condition-case nil
+        (while (< (point) end)
+          (push (read (current-buffer)) words)
+          (unless (eq 'word (caar words)) (error "invalid")))
+      (error (error "Syntax error in raw text")))
+    (delete-region beg (point))
+    (let ((object (apply 'list 'word 0 0 0 0 (nreverse words))))
+      (djvu-process-text-bbox object 0 (make-vector 3 nil))
+      (setcdr (nthcdr 4 object) (list (mapconcat (lambda (w) (nth 5 w))
+                                                 (nthcdr 5 object) "")))
+      (djvu-insert-text object "")))
+  (undo-boundary))
+
+(defun djvu-merge-lines (beg end)
+  "Merge lines between positions BEG and END.
+This command operates on the read buffer."
+  (interactive "r")
+  (let ((bpos (djvu-read-pos beg))
+        (epos (djvu-read-pos (1- end))))
+    (with-current-buffer (djvu-doc-text-buf)
+      (djvu-merge-lines-internal (djvu-locate-pos 'word bpos)
+                                 (djvu-locate-pos 'word epos))))
+  ;; Things get rather confusing without updating the read buffer.
+  ;; So we better save everything.
+  (djvu-save))
+
+(defun djvu-merge-lines-internal (beg end)
+  "Merge lines between positions BEG and END.
+This command operates on the text buffer."
+  (interactive "r")
+  ;; Calculate proper value of END
+  (goto-char end)
+  (beginning-of-line)
+  (unless (looking-at "[ \t]*(line ")
+    (re-search-backward "^[ \t]*(line ")
+    (forward-sexp)
+    (setq end (point)))
+  ;; Calculate proper value of BEG
+  (goto-char beg)
+  (beginning-of-line)
+  (unless (looking-at "[ \t]*(line ")
+    (re-search-backward "^[ \t]*(line "))
+  (skip-chars-forward " \t")
+  (setq beg (point))
+  (unless (< beg end) (error "Nothing to merge"))
+  ;; Parsing fails if the words belong to different paragraphs,
+  ;; regions or columns. We would have to determine the lowest common
+  ;; object level of these words. Then we could possibly merge
+  ;; everything (!) within this level
+  (if (re-search-forward "^[ \t]*\\(?:para\\|region\\|column\\)" end t)
+      (error "Cannot merge paragraphs, regions or columns"))
+  (let (words)
+    ;; Collect all words
+    (condition-case nil
+        (while (<= (point) end)
+          (cond ((looking-at "[ \t]*(word ")
+                 (push (read (current-buffer)) words))
+                ((not (looking-at "[ \t]*(line "))
+                 (error "invalid")))
+          (forward-line))
+      (error (error "Syntax error in raw text")))
+    ;; Remove old words
+    (goto-char beg)
+    (while (let ((start (point)))
+             (forward-sexp)
+             (or (<= (point) end)
+                 (progn (goto-char start) nil))))
+    (delete-region beg (point))
+    ;; Re-insert words
+    (let ((indent (buffer-substring-no-properties
+                   (line-beginning-position) (point)))
+          (object (apply 'list 'line 0 0 0 0 (nreverse words))))
+      (djvu-process-text-bbox object 0 (make-vector 3 nil))
+      (delete-region (line-beginning-position) (point))
+      (djvu-insert-text object indent)))
+  (undo-boundary))
+
+(defun djvu-decode-text (object &optional encode)
+  (if (stringp (nth 5 object))
+      (setcar (nthcdr 5 object)
+              (if encode
+                  (encode-coding-string (nth 5 object) 'utf-8)
+                (decode-coding-string (nth 5 object) 'utf-8)))
+    (dolist (elt (nthcdr 5 object))
+      (djvu-decode-text elt encode))))
+
+(defun djvu-insert-text (object indent)
+  ;; This function is called recursively.
+  (insert indent "("
+          (mapconcat 'prin1-to-string
+                     (list (nth 0 object) (nth 1 object) (nth 2 object)
+                           (nth 3 object) (nth 4 object)) " "))
+  (let ((tail (nthcdr 5 object))
+        (indent (concat indent " ")))
+    (if (stringp (car tail))
+        ;; use `prin1-to-string' as we use this function both for
+        ;; utf-8 and encoded stuff.
+        (insert " " (prin1-to-string (car tail)) ")")
+      (dolist (elt tail)
+        (insert "\n")
+        (djvu-insert-text elt indent))
+      (insert ")"))))
+
+(defun djvu-process-text (script &optional doc)
+  (let ((doc (or doc djvu-doc))
+        object)
+    (with-current-buffer (djvu-doc-text-buf doc)
+      (save-excursion
+        (goto-char (point-min))
+        (condition-case nil
+            (setq object (read (current-buffer)))
+          (error (error "Syntax error in raw text")))
+        (skip-chars-forward " \t\n")
+        ;; We should have swallowed all raw text.
+        (unless (eobp)
+          (error "Syntax error in raw text (end of buffer)"))))
+    (djvu-process-text-bbox object 0 (make-vector 7 nil))
+    ;; Update read buffer
+    (djvu-init-read doc object)
+    ;; FIXME: Should we also update the text buffer?
+    ;; A transparent solution would update only the part of the buffer
+    ;; that we actually changed so that `undo' works as expected.
+    (djvu-decode-text object t)
+    (with-temp-buffer
+      (insert (format "select %d\nremove-txt\nset-txt\n" (djvu-doc-page doc)))
+      (djvu-insert-text object "")
+      (insert "\n.\n")
+      (write-region nil nil script t 0))))
+
+(defun djvu-process-text-bbox (object depth coords)
+  "Evaluate bounding box for text OBJECT recursively."
+  (if (stringp (nth 5 object))
+      (aset coords depth (vector (nth 1 object) (nth 2 object)
+                                 (nth 3 object) (nth 4 object)))
+    (let ((depth1 (1+ depth))
+          coord)
+      (aset coords depth nil)
+      (dolist (elt (nthcdr 5 object))
+        (djvu-process-text-bbox elt depth1 coords)
+        (if (setq coord (aref coords depth))
+            (let ((coord1 (aref coords depth1)))
+              (aset coord 0 (min (aref coord 0) (aref coord1 0)))
+              (aset coord 1 (min (aref coord 1) (aref coord1 1)))
+              (aset coord 2 (max (aref coord 2) (aref coord1 2)))
+              (aset coord 3 (max (aref coord 3) (aref coord1 3))))
+          (aset coords depth (copy-sequence (aref coords depth1)))))
+      (if (setq coord (aref coords depth))
+          (setcdr object (apply 'list (aref coord 0) (aref coord 1)
+                                (aref coord 2) (aref coord 3)
+                                (nthcdr 5 object)))
+        (error "No coords??")))))
+
+(defun djvu-display-text-all ()
+  "Display text for all pages."
+  (interactive)
+  (let ((doc djvu-doc)
+        (buf (get-buffer-create djvu-all-buffer)))
+    ;; Put this in a separate buffer!
+    (with-current-buffer buf
+      (let (buffer-read-only)
+        (emacs-lisp-mode)
+        (erase-buffer)
+        (djvu-djvused doc t "-e" "output-txt")
+        (goto-char (point-min)))
+      (set-buffer-modified-p nil)
+      (setq buffer-read-only t))
+    (switch-to-buffer buf)))
+
+(defun djvu-process-all ()
+  "Process all pages.  Use at your own risk.  You get what you want."
+  (interactive)
+  (let ((buf (get-buffer djvu-all-buffer))
+        script)
+    (unless buf (error "No buffer `%s'" buf))
+    (unless djvu-doc (error "No Djvu doc"))
+    (unwind-protect
+        (progn
+          (setq script (make-temp-file "djvu-el-"))
+          (with-temp-file script (insert-buffer-substring buf))
+          (djvu-djvused djvu-doc nil "-f" script "-s"))
+      (djvu-delete-file script))))
+
+;;; Djvu Read mode
+
+(defun djvu-init-read (doc object)
+  (with-current-buffer (djvu-doc-read-buf doc)
+    (let (buffer-read-only)
+      (erase-buffer)
+      (djvu-insert-read object))
+    (set-buffer-modified-p nil)
+    (setq buffer-read-only t)
+    (goto-char (point-min))
+    (djvu-image)))
+
+(defun djvu-insert-read (object)
+  "Display text OBJECT."
+  ;; This function is called recursively.
+  (let ((opoint (point))
+        (tail (nthcdr 5 object)))
+    (if (stringp (car tail))
+        (insert (decode-coding-string (car tail) 'utf-8))
+      (let* ((obj (caar tail))
+             (sep (cond ((eq 'line obj) "\n")
+                        ((eq 'word obj) "\s")
+                        ((eq 'char obj) nil)
+                        (t "\n\n")))
+             elt)
+        (while (setq elt (pop tail))
+          (djvu-insert-read elt)
+          (if (and sep tail (not (looking-back sep)))
+              (insert sep)))))
+    (put-text-property opoint (point) (car object)
+                       (vector (nth 1 object) (nth 2 object)
+                               (nth 3 object) (nth 4 object)))))
+
+(defun djvu-read-pos (&optional point)
+  "Return Djvu position (x . y) of POINT in Djvu Read buffer."
+  (with-current-buffer (djvu-doc-read-buf)
+    ;; An empty djvu page gives us something like (page 0 0 0 0 "")
+    (if (= (point-min) (point-max))
+        ;; Take the center of an empty page
+        (cons (/ (car (djvu-doc-pagesize)) 2)
+              (/ (cdr (djvu-doc-pagesize)) 2))
+      (unless point (setq point (point)))
+      (djvu-mean-pos ; Return mean coordinates
+       (or (get-text-property point 'word)
+           (get-text-property (1- point) 'word)
+           (get-text-property
+            ;; Search backward because more often point is at the end
+            ;; of region we operated on
+            (1- (previous-single-property-change point 'word)) 'word))))))
+
+(defun djvu-mean-pos (reg)
+  "For region REG return mean coordinates (x . y)."
+  ;; This works both for REG being vectors and lists.
+  (cons (/ (+ (elt reg 0) (elt reg 2)) 2)
+        (/ (+ (elt reg 1) (elt reg 3)) 2)))
+
+(defun djvu-locate-pos (object pos)
+  "Locate OBJECT at position POS in the text or annotation buffer.
+If found, return corresponding position. Otherwise, return nil."
+  (goto-char (point-min))
+  (when pos
+    (let ((re (concat "\\<" (symbol-name object) "\\> +"
+                      (mapconcat 'identity
+                                 (make-list 4 "\\([[:digit:]]+\\)") " +")
+                      "\\( +\"\\)?"))
+          done)
+      (while (and (not done)
+                  (re-search-forward re nil t))
+        (let ((x1 (string-to-number (match-string 1)))
+              (x2 (string-to-number (match-string 3)))
+              (y1 (string-to-number (match-string 2)))
+              (y2 (string-to-number (match-string 4))))
+          (setq done (and (<= x1 (car pos))
+                          (<= (car pos) x2)
+                          (<= y1 (cdr pos))
+                          (<= (cdr pos) y2)))))
+      (if done (point)
+        (goto-char (point-min)) nil))))
+
+(defsubst djvu-dist (width height)
+  (+ (* width width) (* height height)))
+
+(defun djvu-locate-read-pos (pos)
+  "Locate POS in Djvu Read buffer. Return corresponding position."
+  (with-current-buffer (djvu-doc-read-buf)
+    (if (not pos)
+        (goto-char (point-min))
+      (let ((hpos (car pos)) (vpos (cdr pos))
+            (good-dist (djvu-dist (car (djvu-doc-pagesize))
+                                  (cdr (djvu-doc-pagesize))))
+            (pnt (point-min)) (good-pnt (point-min))
+            word dist)
+        (while (progn
+                 (when (setq word (get-text-property pnt 'word))
+                   (setq dist (djvu-dist (- (/ (+ (aref word 0) (aref word 2)) 2) hpos)
+                                         (- (/ (+ (aref word 1) (aref word 3)) 2) vpos)))
+                   (if (< dist good-dist)
+                       (setq good-pnt pnt good-dist dist)))
+                 (setq pnt (next-single-property-change pnt 'word))))
+        (goto-char good-pnt)))))
+
+;;; Djvu Annotation mode
+
+(defun djvu-comment-interactive (&optional border backclr textclr pushpin)
+  "Interactive spec for `djvu-comment' and friends."
+  (let ((pos (djvu-read-pos))
+        (pagesize (djvu-doc-pagesize))
+        (color (djvu-interactive-color djvu-color-highlight)))
+    (list "" (read-string (format "(%s) Text: " color))
+          (list (car pos) (cdr pos)
+                (+ (car pos) (/ (car pagesize) 2))
+                (+ (cdr pos) (/ (cdr pagesize) 30)))
+          border
+          (or backclr
+              (djvu-color-background color djvu-color-background
+                                     djvu-opacity))
+          textclr pushpin)))
+
+(defsubst djvu-insert-color (key color)
+  (if color
+      (format " (%s %s)" key
+              (cond ((string-match "\\`#" color) color)
+                    ((cdr (assoc color djvu-color-alist)))
+                    (t (error "Color `%s' undefined" color))))
+    ""))
+
+(defun djvu-comment (url text rect &optional border backclr textclr pushpin)
+  "Using URL and TEXT, highlight RECT.
+This defines a rect area for djvused."
+  (interactive (djvu-comment-interactive))
+  (with-current-buffer (djvu-doc-annot-buf)
+    (goto-char (point-max))
+    (let (print-escape-newlines)
+      (insert (format "(maparea %S\n %S\n " url (djvu-fill text))
+              (apply 'format "(text %d %d %d %d)" rect)
+              (if border (format " (%s)" border) "")
+              (djvu-insert-color "backclr" backclr)
+              (djvu-insert-color "textclr" textclr)
+              (if pushpin " (pushpin)" "")
+              ")\n\n"))
+    (undo-boundary)))
+
+(defun djvu-comment-pushpin (url text rect
+                                 &optional border backclr textclr pushpin)
+  (interactive (djvu-comment-interactive nil nil nil t))
+  (djvu-comment url text rect border backclr textclr pushpin))
+
+(defun djvu-himark (beg end url text &optional color opacity border)
+  "Himark region between BEG and END.
+This highlights the region between BEG and END and creates a bookmark entry."
+  (interactive
+   (let ((region (djvu-interactive-region)))
+     (list (car region) (cdr region) "" ""
+           djvu-color-himark djvu-opacity 'none)))
+  (djvu-highlight beg end url text color opacity border)
+  (djvu-bookmark (buffer-substring-no-properties beg end) (djvu-doc-page)))
+
+(defun djvu-url (beg end url text &optional color opacity border)
+  (interactive
+   (let* ((region (djvu-interactive-region))
+          (color (djvu-interactive-color djvu-color-url))
+          (url (djvu-interactive-url color)))
+     (list (car region) (cdr region) url "" color djvu-opacity 'xor)))
+  (djvu-highlight beg end url text color opacity border))
+
+(defun djvu-highlight (beg end url text &optional color opacity border)
+  "Highlight region between BEG and END, add annotation TEXT."
+  (interactive
+   (let ((region (djvu-interactive-region))
+         (color (djvu-interactive-color djvu-color-highlight)))
+     (list (car region) (cdr region) ""
+           (read-string (format "(%s) Annotation: " color))
+           color djvu-opacity 'none)))
+
+  (unless (get-text-property beg 'word)
+    (error "Start position `%s' not a word" beg))
+  (unless (get-text-property (1- end) 'word)
+    (error "End position `%s' not a word" end))
+  (let ((words (djvu-region-count beg end 'word))
+        (lines (djvu-region-count beg end 'line))
+        (paras (djvu-region-count beg end 'para))
+        (regions (djvu-region-count beg end 'region))
+        (columns (djvu-region-count beg end 'column))
+        coords)
+    (unless (and (>= 1 paras) (>= 1 regions) (>= 1 columns))
+      (error "Region spans multiple paragraphs"))
+
+    (if (eq 1 lines)
+        (setq coords (list (djvu-scan-coords beg end 'word)))
+
+      (if (eq 2 lines)
+          (let ((c1 (djvu-scan-coords beg (djvu-property-end (1+ beg) 'line) 'word))
+                (c2 (djvu-scan-coords (djvu-property-beg (1- end) 'line) end 'word)))
+            ;; If BEG is beginning of first line, both lines share same left margin.
+            (if (and (= beg (djvu-property-beg beg 'line))
+                     (djvu-coords-justify t c1 c2))
+                (djvu-justify-coords 'min 0 c1 c2))
+            ;; If END is end of second line, both lines share same right margin.
+            (if (and (= end (djvu-property-end end 'line))
+                     (djvu-coords-justify nil c2 c1))
+                (djvu-justify-coords 'max 2 c1 c2))
+            (if (<= (aref c1 0) (aref c2 2))
+                ;; Lower bound of upper box and upper bound of lower box coincide.
+                (let ((tmp (/ (+ (aref c1 1) (aref c2 3)) 2)))
+                  (aset c1 1 tmp) (aset c2 3 tmp)))
+            (setq coords (list c1 c2)))
+        ;; 3 lines
+        (let* ((l1e (djvu-property-end (1+ beg) 'line))
+               (l2b (djvu-property-beg (1- end) 'line))
+               (c1  (djvu-scan-coords beg l1e 'word))
+               (ci  (djvu-scan-coords (1+ l1e) (1- l2b) 'line))
+               (c2  (djvu-scan-coords l2b end 'word)))
+          ;; If BEG is beginning of first line, all lines share same left margin.
+          (cond ((and (= beg (djvu-property-beg beg 'line))
+                      (djvu-coords-justify t c1 ci c2))
+                 (djvu-justify-coords 'min 0 c1 ci c2))
+                ((djvu-coords-justify t ci c2)
+                 (djvu-justify-coords 'min 0 ci c2)))
+          ;; If END is end of last line, all lines share same right margin.
+          (cond ((and (= end (djvu-property-end end 'line))
+                      (djvu-coords-justify nil c2 ci c1))
+                 (djvu-justify-coords 'max 2 c1 ci c2))
+                ((djvu-coords-justify nil c1 ci)
+                 (djvu-justify-coords 'max 2 c1 ci)))
+          (let ((tmp1 (/ (+ (aref c1 1) (aref ci 3)) 2))
+                (tmp2 (/ (+ (aref ci 1) (aref c2 3)) 2)))
+            ;; Lower bound of upper boxes and upper bound of lower boxes coincide.
+            (aset c1 1 tmp1) (aset ci 3 tmp1)
+            (aset ci 1 tmp2) (aset c2 3 tmp2))
+          (setq coords (list c1 ci c2)))))
+
+    (djvu-highlight-region url text coords color opacity border)))
+
+(defun djvu-highlight-region (url text coords &optional color opacity border)
+  "Using URL and TEXT, highlight COORDS.
+This defines a hilite area for djvused."
+    ;; Record position where annotation was made.
+  (let ((posl (mapcar 'djvu-mean-pos coords))
+        (n (length coords)))
+    (djvu-doc-set-pos (cons (/ (apply '+ (mapcar 'car posl)) n)
+                            (/ (apply '+ (mapcar 'cdr posl)) n))))
+  ;; Insert in Annotations buffer.
+  (with-current-buffer (djvu-doc-annot-buf)
+    (goto-char (point-max))
+    (let (print-escape-newlines)
+      (insert (format "(maparea %S\n %S\n (" url (djvu-fill text))
+              (mapconcat
+               (lambda (rect) (apply 'format "(rect %d %d %d %d)" (append rect nil)))
+               coords "\n  ") ")\n"
+               (djvu-insert-color "hilite" color)
+               (if opacity (format " (opacity %s)" opacity) "")
+               (if border (format " (%s)" border) "")
+               ")\n\n"))
+    (undo-boundary)))
+
+(defun djvu-fill (text)
+  "Fill string TEXT using `djvu-fill-column'."
+  (if djvu-fill-column
+      (with-temp-buffer
+        (insert text)
+        (let ((fill-column djvu-fill-column))
+          (fill-region (point-min) (point-max)))
+        (buffer-substring-no-properties
+         (point-min) (point-max)))
+    text))
+
+(defun djvu-property-beg (pnt prop)
+  ;; Assume that PNT has PROP.  Otherwise we would not know whether
+  ;; to search for it before or after PNT.
+  (let ((p1 (get-text-property pnt prop)))
+    (unless p1 (error "Position %s does not have property %s" pnt prop))
+    (if (> pnt (point-min))
+        (let ((p0 (get-text-property (1- pnt) prop)))
+          (if (eq p0 p1)
+              (setq pnt (previous-single-property-change
+                         pnt prop nil (point-min))))))
+    pnt))
+
+(defun djvu-property-end (pnt prop)
+  ;; Assume that (1- PNT) has PROP.  Otherwise we would not know whether
+  ;; to search for it before or after PNT.
+  (let ((p1 (get-text-property (1- pnt) prop)))
+    (unless p1 (error "Position %s does not have property %s" pnt prop))
+    (if (< pnt (point-max))
+        (let ((p0 (get-text-property pnt prop)))
+          (if (eq p0 p1)
+              (setq pnt (next-single-property-change
+                         (1- pnt) prop nil (point-max))))))
+    pnt))
+
+(defun djvu-coords-justify (left &rest ci)
+  "Return non-nil if rect coordinates CI shall be justified horizontally.
+If LEFT is nil analyze left boundaries of CI, otherwise the right boundaries."
+  (let ((xl (apply 'min (mapcar (lambda (c) (aref c 0)) ci)))
+        (xr (apply 'max (mapcar (lambda (c) (aref c 2)) ci))))
+    (> djvu-coords-justify
+       (/ (apply 'max (mapcar (lambda (cj)
+                                (abs (float (if left (- (aref cj 0) xl)
+                                              (- xr (aref cj 2))))))
+                              ci))
+          (float (- xr xl))))))
+
+(defun djvu-justify-coords (fun n &rest ci)
+ "Pass Nth elements of arrays CI to function FUN.
+Set these elements to return value of FUN.
+If FUN is `min' or `max' these elements are set to the respective minimum
+or maximum among the Nth elements of all arrays CI."
+  (let ((tmp (apply fun (mapcar (lambda (c) (aref c n)) ci))))
+    (dolist (c ci)
+      (aset c n tmp))))
+
+(defun djvu-scan-coords (beg end prop)
+  "Between BEG and END calculate total bounding box for PROP."
+  ;; Assume that BEG has PROP.
+  (let ((coords (copy-sequence (get-text-property beg prop)))
+        (pnt beg) val)
+    (while (and (/= pnt end)
+                (setq pnt (next-single-property-change pnt prop nil end)))
+      (when (setq val (get-text-property pnt prop))
+        (aset coords 0 (min (aref coords 0) (aref val 0)))
+        (aset coords 1 (min (aref coords 1) (aref val 1)))
+        (aset coords 2 (max (aref coords 2) (aref val 2)))
+        (aset coords 3 (max (aref coords 3) (aref val 3)))))
+    coords))
+
+(defun djvu-region-count (beg end prop)
+  "Count regions between BEG and END with distinct non-nil values of PROP."
+  (let ((count 0)
+        (pnt beg))
+    (while (and (/= pnt end)
+                (setq pnt (next-single-property-change pnt prop nil end)))
+      (if (get-text-property (1- pnt) prop)
+          (setq count (1+ count))))
+    count))
+
+(defun djvu-process-annot (script &optional doc)
+  (let ((doc djvu-doc) object)
+    (with-temp-buffer
+      (insert-buffer-substring (djvu-doc-annot-buf doc))
+      (djvu-hide-hash)
+      (goto-char (point-min))
+      (while (progn (skip-chars-forward " \t\n") (not (eobp)))
+        (if (looking-at "(\\(background\\|zoom\\|mode\\|align\\|maparea\\|metadata\\)\\>")
+            (condition-case nil
+                (push (read (current-buffer)) object)
+              (error (error "Syntax error in annotations")))
+          (error "Unknown annotation `%s'" (buffer-substring-no-properties
+                                            (point) (line-end-position))))))
+    (setq object (nreverse object))
+    (dolist (elt object)
+      (when (eq 'maparea (car elt))
+        ;; URL
+        (setcar (cdr elt) (encode-coding-string (djvu-resolve-url (nth 1 elt)) 'utf-8))
+        ;; Comment
+        (setcar (nthcdr 2 elt) (encode-coding-string (nth 2 elt) 'utf-8))))
+
+    (with-temp-buffer
+      (let ((standard-output (current-buffer))
+            (print-escape-newlines t)
+            str)
+        (insert (format "select %d\nremove-ant\nset-ant\n"
+                        (djvu-doc-page doc)))
+        (dolist (elt object)
+          (cond ((not (eq 'maparea (car elt)))
+                 (prin1 elt)
+                 (insert "\n"))
+                ((consp (car (nth 3 elt))) ; rect
+                 (dolist (e (nth 3 elt))
+                   (insert (prin1-to-string
+                            (apply 'list (car elt) (nth 1 elt) (nth 2 elt)
+                                   (djvu-rect e t) (nthcdr 4 elt))) "\n")))
+                ((eq 'text (car (nth 3 elt))) ; text
+                 (insert (prin1-to-string
+                          (apply 'list (car elt) (nth 1 elt) (nth 2 elt)
+                                 (djvu-rect (nth 3 elt) t)
+                                 (nthcdr 4 elt))) "\n"))
+                (t (error "Djvu maparea %s undefined" (car (nth 3 elt))))))
+        (insert ".\n")
+        (djvu-hide-hash t))
+      (write-region nil nil script t 0))))
+
+(defun djvu-display-annot-all (&optional display)
+  "Print annotations for all pages."
+  (interactive (list t))
+  (let ((doc djvu-doc)
+        (buf (get-buffer-create djvu-all-buffer)))
+    ;; Put this in a separate buffer!
+    (with-current-buffer buf
+      (let (buffer-read-only)
+        (emacs-lisp-mode)
+        (erase-buffer)
+        (djvu-djvused doc t "-e" "output-ant")
+        (goto-char (point-min))
+        (while (re-search-forward "^(maparea" nil t)
+          (forward-sexp) ; jump over URL
+          ;; replace newlines within text
+          (let ((limit (save-excursion (forward-sexp) (point))))
+            (while (search-forward "\\n" limit t)
+              (replace-match "\n"))))
+        (goto-char (point-min)))
+      (set-buffer-modified-p nil)
+      (setq buffer-undo-list nil))
+    (if display (switch-to-buffer buf))))
+
+;;; Djvu Outline mode
+
+(defun djvu-bookmark (text page)
+  "Create bookmark"
+  (interactive
+   (let ((region (djvu-interactive-region)))
+     (list (read-string "Bookmark: " (buffer-substring-no-properties
+                                      (car region) (cdr region)))
+           (djvu-doc-page))))
+  ;; Remove newlines that are ignored anyway
+  (setq text (replace-regexp-in-string "\n" " " text))
+  (let (object)
+    (with-current-buffer (djvu-doc-outline-buf)
+      (goto-char (point-min))
+      (if (equal (point) (point-max))
+          (setq object (list 'bookmarks))
+        (condition-case nil
+            (setq object (read (current-buffer)))
+          (error (error "Syntax error in outline"))))
+      (unless (eq 'bookmarks (car object))
+        (error "No bookmarks"))
+      ;; No decoding/encoding necessary if we add another bookmark.
+      (setcdr object (sort (append (cdr object)
+                                   (list (list text (format "#%d" page))))
+                           (lambda (x y)
+                             (< (string-to-number (substring (nth 1 x) 1))
+                                (string-to-number (substring (nth 1 y) 1))))))
+      (erase-buffer)
+      (insert "(bookmarks")
+      (let (print-escape-newlines)
+        (djvu-insert-outline (cdr object) " "))
+      (insert ")\n")
+      (goto-char (point-min))
+      (undo-boundary))))
+
+(defun djvu-decode-outline (object &optional encode)
+  "Decode Djvu Outline OBJECT. Encode if ENCODE is non-nil."
+  (dolist (elt object)
+    ;; Title
+    (setcar elt
+            (if encode
+                (encode-coding-string (car elt) 'utf-8)
+              (decode-coding-string (car elt) 'utf-8)))
+    ;; URL
+    (setcar (cdr elt)
+            (djvu-resolve-url
+             (if encode
+                 (encode-coding-string (cadr elt) 'utf-8)
+               (decode-coding-string (cadr elt) 'utf-8))))
+    ;; Continue with subtree.
+    (djvu-decode-outline (nthcdr 2 elt) encode)))
+
+(defun djvu-insert-outline (object indent)
+  "Insert Outline OBJECT."
+  ;; This function is called recursively.
+  (let ((indent1 (concat indent " ")))
+    (dolist (elt object)
+      (insert (format "\n%s(%S\n%s %S" indent (car elt) indent (nth 1 elt)))
+      (djvu-insert-outline (nthcdr 2 elt) indent1)
+      (insert ")"))))
+
+(defun djvu-process-outline (script &optional doc)
+  (let (object)
+    (with-current-buffer (djvu-doc-outline-buf doc)
+      (save-excursion
+        (goto-char (point-min))
+        (unless (= (point-min) (point-max))
+          (condition-case nil
+              (setq object (read (current-buffer)))
+            (error (error "Syntax error in outline"))))
+        (skip-chars-forward " \t\n")
+        ;; We should have swallowed all bookmarks.
+        (unless (eobp)
+          (error "Syntax error in outline (end of buffer)"))))
+    (unless (eq 'bookmarks (car object))
+      (error "No bookmarks"))
+    (djvu-decode-outline (cdr object) t)
+    (with-temp-buffer
+      (insert "set-outline\n")
+      (when object
+        (insert "(bookmarks")
+        (let ((print-escape-newlines t))
+          (djvu-insert-outline (cdr object) " "))
+        (insert ")\n"))
+      (insert ".\n")
+      (write-region nil nil script t 0))))
+
+;;; Image minor mode
+
+(define-minor-mode djvu-image-mode
+  "Toggle image display of current page."
+  :lighter "Image"
+  :keymap '(([drag-mouse-1]   . djvu-mouse-comment)
+            ([C-drag-mouse-1] . djvu-mouse-comment-pushpin)
+            ([S-drag-mouse-1] . djvu-mouse-highlight)
+            ;; (Global) bindings of down-mouse events would take precedence over
+            ;; drag-mouse events. So we bind the down-mouse events to `ignore'.
+            ([down-mouse-1]   . ignore)
+            ([C-down-mouse-1] . ignore)
+            ([S-down-mouse-1] . ignore)
+            ("+" . djvu-image-zoom-in)
+            ("-" . djvu-image-zoom-out))
+  (djvu-image))
+
+(defun djvu-image-zoom-in ()
+  (interactive)
+  (djvu-image (round (* (nth 1 (djvu-doc-image)) 1.2))))
+
+(defun djvu-image-zoom-out ()
+  (interactive)
+  (djvu-image (round (/ (nth 1 (djvu-doc-image)) 1.2))))
+
+(defun djvu-image (&optional isize)
+  "If `djvu-image-mode' is enabled, display image of current Djvu page.
+Otherwise remove the image."
+  (if (not djvu-image-mode)
+      (let (buffer-read-only)
+        (remove-text-properties (point-min) (point-max) '(display nil)))
+    ;; Update image if necessary.
+    (if (or (not (eq (djvu-doc-page) (car (djvu-doc-image))))
+            (and isize
+                 (not (eq isize (nth 1 (djvu-doc-image))))))
+        (let ((file (make-temp-file "djvu-"))
+              (isize (or isize
+                         (nth 1 (djvu-doc-image))
+                         djvu-image-size)))
+          (unwind-protect
+              ;; ddjvu does not send tiff files to stdout
+              (let ((doc djvu-doc)
+                    (status (call-process "ddjvu" nil t nil
+                                          (format "-size=%dx%d" isize isize)
+                                          "-format=tiff"
+                                          (format "-page=%d" (djvu-doc-page))
+                                          (djvu-doc-file)
+                                          file)))
+                (unless (zerop status)
+                  (error "Ddjvu error %s" status))
+                (with-temp-buffer
+                  (set-buffer-multibyte nil)
+                  (insert-file-contents-literally file)
+                  (djvu-doc-set-image
+                   (list (djvu-doc-page doc)
+                         isize
+                         (create-image (buffer-substring-no-properties
+                                        (point-min) (point-max))
+                                       'tiff t)) doc)))
+            (djvu-delete-file file))))
+    ;; Display image.
+    (let (buffer-read-only)
+      (put-text-property (point-min) (point-max)
+                         'display (nth 2 (djvu-doc-image))))))
+
+(defun djvu-event-to-rect (event)
+  "Convert mouse EVENT to Djvu rect coordinates."
+  (let* ((start (posn-object-x-y (event-start event)))
+         (end (posn-object-x-y (event-end event)))
+         (x1 (car start)) (y1 (cdr start)) (x2 (car end)) (y2 (cdr end))
+         (size (posn-object-width-height (event-start event)))
+         (width  (/ (float (car (djvu-doc-pagesize))) (car size)))
+         (height (/ (float (cdr (djvu-doc-pagesize))) (cdr size))))
+    (list (round (* (min x1 x2) width))
+          (round (* (- (cdr size) (max y1 y2)) height))
+          (round (* (max x1 x2) width))
+          (round (* (- (cdr size) (min y1 y2)) height)))))
+
+(defun djvu-mouse-highlight (event)
+  (interactive "e")
+  ;; Mouse events ignore prefix args?
+  (let ((color (djvu-interactive-color djvu-color-highlight)))
+    (djvu-highlight-region "" (read-string (format "(%s) H-Text: " color))
+                           (list (djvu-event-to-rect event))
+                           color djvu-opacity)))
+
+(defun djvu-mouse-comment (event &optional pushpin)
+  (interactive "e")
+  ;; Mouse events ignore prefix args?
+  (let ((color (djvu-interactive-color djvu-color-highlight)))
+    (djvu-comment "" (read-string (format "(%s) C-Text: " color))
+                  (djvu-event-to-rect event) nil
+                  (djvu-color-background color djvu-color-background
+                                         djvu-opacity)
+                  nil pushpin)))
+
+(defun djvu-mouse-comment-pushpin (event)
+  (interactive "e")
+  (djvu-mouse-comment event t))
+
+;;; clean up
+
+(defun djvu-make-clean ()
+  "Remove Outline and Annotations."
+  (interactive)
+  (when (yes-or-no-p "Remove Outline and Annotations ")
+    (djvu-djvused djvu-doc nil "-e"
+                  "select; remove-ant; set-outline;\n." "-s")
+    (djvu-init-page)))
+
+\f
+(provide 'djvu)
+;;; djvu.el ends here
diff --git a/packages/docbook/docbook.el b/packages/docbook/docbook.el
new file mode 100644 (file)
index 0000000..faaac01
--- /dev/null
@@ -0,0 +1,1218 @@
+;;; docbook.el --- Info-like viewer for DocBook  -*- lexical-binding: t -*-
+
+;; Copyright (C) 2013  Free Software Foundation, Inc.
+
+;; Author: Chong Yidong <cyd@gnu.org>
+;; Keywords: docs, help
+;; Version: 0.1
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; An Info-like viewer for DocBook manuals.
+;;
+;; Entry point: M-x docbook-find-file
+
+;;; TODO:
+
+;; table
+;; informaltable
+;; graphics
+;;
+;; funcsynopsis
+;; classsynopsis
+;; citerefentry
+;;
+;; see, primaryie, secondaryie
+
+;;; Code:
+
+(require 'xml)
+
+(defgroup docbook nil
+  "The Emacs DocBook reader."
+  :group 'help
+  :group 'docs)
+
+(defface docbook-xref
+  '((t :inherit button))
+  "Face for DocBook cross references."
+  :group 'docbook)
+
+(defface docbook-warning
+  '((t :inherit font-lock-warning-face))
+  "Face for warning text in DocBook documents."
+  :group 'docbook)
+
+(defface docbook-emphasis
+  '((t :slant italic))
+  "Face for emphasized text in DocBook documents."
+  :group 'docbook)
+
+(defface docbook-literal
+  '((t :inherit (font-lock-constant-face fixed-pitch)))
+  "Face for DocBook text marked as being literal."
+  :group 'docbook)
+
+(defface docbook-computer
+  '((t :inherit (font-lock-type-face fixed-pitch)))
+  "Face for DocBook text marked as computer output."
+  :group 'docbook)
+
+(defface docbook-computer-term
+  '((t :inherit (font-lock-keyword-face fixed-pitch)))
+  "Face for DocBook text marked as computer terminology."
+  :group 'docbook)
+
+(defface docbook-replaceable
+  '((t :inherit (font-lock-string-face bold)))
+  "Face for DocBook text marked as replaceable."
+  :group 'docbook)
+
+(defface docbook-citation
+  '((t :slant italic))
+  "Face for DocBook text marked as non-xref citations."
+  :group 'docbook)
+
+(defface docbook-label
+  '((t :weight bold :underline t))
+  "Face for DocBook text marked as labels for Q&A entries,"
+  :group 'docbook)
+
+(defface docbook-small '((t :height 0.8))
+  "Face for DocBook text marked as small."
+  :group 'docbook)
+
+(defface docbook-chapter-title
+  '((((type tty pc) (class color) (background light))
+     :foreground "green" :weight bold :underline t)
+    (((type tty pc) (class color) (background dark))
+     :foreground "yellow" :weight bold :underline t)
+    (t :height 1.5 :inherit docbook-section-title))
+  "Face for DocBook chapter titles."
+  :group 'docbook)
+
+(defface docbook-section-title
+  '((((type tty pc) (class color))
+     :foreground "lightblue" :weight bold :underline t)
+    (t :height 1.2 :inherit docbook-subsection-title))
+  "Face for DocBook section titles."
+  :group 'docbook)
+
+(defface docbook-subsection-title
+  '((t :weight bold :height 1.1 :inherit variable-pitch))
+  "Face for DocBook subsection titles."
+  :group 'docbook)
+
+(defface docbook-misc-title '((t :weight bold :underline t))
+  "Face for miscellaneous DocBook titles."
+  :group 'docbook)
+
+(defvar docbook-title-markup-alist
+  '((book    . docbook-chapter-title)
+    (chapter . docbook-chapter-title)
+    (sect1   . docbook-section-title)
+    (sect2   . docbook-subsection-title)
+    (sect3   . docbook-subsection-title)
+    (sect4   . docbook-subsection-title)
+    (sect5   . docbook-subsection-title)
+    (section . docbook-section-title)
+    (simplesect . docbook-section-title))
+  "Alist mapping DocBook section types to title faces")
+
+(defvar docbook-text-markup-alist
+  '((emphasis . docbook-emphasis)
+    (foreignphrase . docbook-emphasis)
+    (firstterm . docbook-emphasis)
+    (bridgehead . docbook-section-title)
+    (refname . docbook-section-title)
+    (refpurpose . docbook-emphasis)
+    (citetitle . docbook-citation)
+    (subscript . docbook-small)
+    (superscript . docbook-small)
+    (replaceable . docbook-replaceable)
+    ;; Computer output
+    (accel . docbook-computer)
+    (computeroutput . docbook-computer)
+    (guibutton . docbook-computer)
+    (guiicon . docbook-computer)
+    (guilabel . docbook-computer)
+    (guimenu . docbook-computer)
+    (guimenuitem . docbook-computer)
+    (guisubmenu . docbook-computer)
+    (keycap . docbook-computer)
+    (keycode . docbook-computer)
+    (keycombo . docbook-computer)
+    (keysym . docbook-computer)
+    (markup . docbook-computer)
+    (menuchoice . docbook-computer)
+    (mousebutton . docbook-computer)
+    (msgset . docbook-computer)
+    (prompt . docbook-computer)
+    (shortcut . docbook-computer)
+    (tag . docbook-computer)
+    (userinput . docbook-computer)
+    ;; Computer terminology
+    (application . docbook-computer-term)
+    (classname . docbook-computer-term)
+    (command . docbook-computer-term)
+    (constant . docbook-computer-term)
+    (database . docbook-computer-term)
+    (envar . docbook-computer-term)
+    (errorcode . docbook-computer-term)
+    (errorname . docbook-computer-term)
+    (errortype . docbook-computer-term)
+    (filename . docbook-computer-term)
+    (function . docbook-computer-term)
+    (hardware . docbook-computer-term)
+    (option . docbook-computer-term)
+    (optional . docbook-computer-term)
+    (parameter . docbook-computer-term)
+    (property . docbook-computer-term)
+    (returnvalue . docbook-computer-term)
+    (symbol . docbook-computer-term)
+    (systemitem . docbook-computer-term)
+    (token . docbook-computer-term)
+    (type . docbook-computer-term)
+    (varname . docbook-computer-term)
+    ;; docbook-literal
+    (literal . docbook-literal)
+    ;; Admonitions
+    (caution . docbook-warning)
+    (important . docbook-emphasis)
+    (tip . docbook-emphasis)
+    (warning . docbook-warning))
+  "Alist mapping DocBook element types to markup faces.")
+
+(defvar docbook-page-types
+  '(acknowledgements appendix article bibliography book chapter colophon
+    dedication glossary part preface sect1 sect2 sect3 sect4 sect5
+    section set setindex toc)
+  "List of DocBook sectioning element types.
+DocBook mode shows one section at a time, as a single page.")
+
+(defvar docbook-block-types
+  '(para simpara formalpara equation informalequation
+    informalexample figure informalfigure
+    blockquote epigraph msgset sidebar
+    bridgehead caution important note tip warning
+    cmdsynopsis)
+  "List of DocBook block types which require no additional processing.")
+
+(defvar docbook-list-types
+  '(calloutlist bibliolist glosslist itemizedlist orderedlist
+    segmentedlist simplelist variablelist qandaset
+    task procedure substeps)
+  "List of DocBook block-level list types")
+
+(defvar docbook-literal-block-types
+  '(address literallayout programlisting screen screenco
+    screenshot synopsis)
+  "List of DocBook block element types which preserve whitespace.")
+
+(defvar docbook-suppressed-types
+  '(comment info bookinfo chapterinfo sectioninfo articleinfo label
+    refmeta refclass)
+  "List of DocBook element types which are not printed.")
+
+(defvar docbook-index-separator-column 30
+  "Column number of xrefs printed by `docbook--print-index'.")
+
+(defvar docbook-entity-alist
+  ;; makeinfo emits these entities, even though the DocBook spec does
+  ;; not appear to define them.
+  '(("lsquo" . "`")
+    ("rsquo" . "'")
+    ("ldquo" . "\"")
+    ("rdquo" . "\"")
+    ("copy" . "(C)")
+    ("tex" . "TeX")
+    ("latex" . "LaTeX")
+    ("hellip" . "...")
+    ("period" . ".")
+    ("minus" . "-")
+    ("colon" . ":")
+    ("mdash" . "--")
+    ("ndash" . "-"))
+  "Alist mapping XML entities to their replacement text.
+These elements are added to `xml-entity-alist' while parsing
+DocBook documents.")
+
+;;; Buffer setup
+
+(defvar docbook--parse-tree nil
+  "Parse tree of the current DocBook document.")
+
+(defvar docbook--id-table nil
+  "Hash table mapping DocBook IDs (symbols) to node contents.
+Each key should be a Lisp symbol.  Each XML node with an XML ID
+is keyed by an interned Lisp symbol with a matching symbol name.
+Sectioning (page) nodes which lack their own XML IDs are keyed
+using uninterned Lisp symbols created when parsing the XML tree.
+
+Each hash table value has one of these two forms:
+
+ (NODE TITLE-NODE PARENT-ID PREV NEXT SUBSECTIONS)
+ (NODE TITLE-NODE PARENT-ID)
+
+The first represents a node corresponding to a DocBook section,
+which is displayed as a separate page in the DocBook reader.
+The second represents a node which does not correspond to a
+DocBook section, e.g. a position within a section for a
+cross-reference to jump to.
+
+NODE is the Lisp list tree corresponding to the XML node.
+TITLE-NODE is the node corresponding to the node's title (a
+string), or nil.
+PARENT-ID is the ID of the node's parent page, or nil.
+PREV and NEXT are the IDs of the previous and next page.
+SUBSECTIONS is a list of IDs of child pages.")
+
+(defvar docbook-id-markers-alist nil
+  "Alist mapping DocBook node IDs to markers.
+Each key should be a Lisp symbol, but it is not required to be
+one of the keys in `docbook--id-table'.  This alist is used to
+record the positions of xref'ed elements on the current page.")
+
+(defvar docbook-top-page nil
+  "ID of the topmost (root) page in the current DocBook document.
+The value should be one of the keys in `docbook--id-table'.")
+
+(defvar docbook-current-page nil
+  "ID of the current DocBook page.
+The value should be one of the keys in `docbook--id-table'.")
+
+(defvar docbook--last-page-registered)
+(defvar docbook--last-page-id-registered)
+(defvar docbook--footnotes)
+(defvar docbook--indent-level 0)
+(defvar docbook--list-context nil)
+
+(defvar docbook--index-alist nil
+  "Alist mapping index types to index data.
+Each list element has the form (TYPE . ALIST), where TYPE is a
+symbol specifying the index type (nil for the default index) and
+ALIST is an alist (TERM . ID-LIST).")
+
+(defvar docbook-history nil
+  "List of DocBook node IDs which were previously viewed.")
+
+(defvar docbook-history-forward nil
+  "List of DocBook node IDs visited with `docbook-history-back'.")
+
+;; Used in place of the interned version of the string "nil".
+(defconst docbook--nil (make-symbol "nil"))
+
+(defun docbook-setup (parse-tree)
+  "Set up a DocBook buffer using the XML parse tree PARSE-TREE.
+PARSE-TREE should be a list of the sort returned by
+`xml-parse-file' or `xml-parse-buffer'."
+  (docbook-mode)
+  (setq docbook--parse-tree parse-tree
+       docbook--id-table (make-hash-table :test 'eq)
+       docbook--index-alist nil
+       docbook-history nil
+       docbook-history-forward nil)
+  (let ((docbook--last-page-registered nil)
+       (docbook--last-page-id-registered nil))
+    (docbook-register-node parse-tree nil nil))
+  ;; Sort indices
+  (dolist (index docbook--index-alist)
+    (setcdr index (sort (cdr index) (lambda (a b)
+                                     (string< (car a) (car b)))))
+    (dolist (entry (cdr index))
+      (setcdr entry (nreverse (cdr entry))))))
+
+;;; Utility functions
+
+(defsubst docbook--node-record (&optional node-id)
+  "Return the record keyed by NODE-ID in `docbook--id-table'.
+If NODE-ID is nil, it defaults to ID of the current page."
+  (gethash (or node-id docbook-current-page) docbook--id-table))
+
+(defsubst docbook-add-fragment-link (id)
+  "If ID is non-nil, add a marker for it to `docbook-id-markers-alist'."
+  (if id (push (cons id (point-marker)) docbook-id-markers-alist)))
+
+(defun docbook--attr (attribute node)
+  "Return the value of attribute ATTRIBUTE in xml node NODE.
+The value is automatically converted to a Lisp symbol.  If the
+node lacks the specified attribute, return nil."
+  (let ((str (cdr (assq attribute (xml-node-attributes node)))))
+    (and (stringp str)
+        (not (equal str ""))
+        (if (equal str "nil") docbook--nil (intern str)))))
+
+(defun docbook--display-string (base-string fallback)
+  "Return a string which displays as BASE-STRING on graphical terminals.
+Use a display property so that on non-graphical terminals, the
+string displays as the FALLBACK string."
+  (propertize base-string
+             'display `(when (not (display-graphic-p)) . ,fallback)))
+
+(defun docbook--node-text (node)
+  "Return the contents of the DocBook node NODE, as a string."
+  (let ((str (mapconcat
+             (lambda (x)
+               (cond ((stringp x)
+                      (if (string-match "\\`\\s-+\\'" x) "" x))
+                     ((consp x)
+                      (docbook--node-text x))))
+             (xml-node-children node)
+             "")))
+    (if (string-match "\\`\\s-+" str)
+       (setq str (substring str (match-end 0))))
+    (if (string-match "\\s-+\\'" str)
+       (setq str (substring str 0 (match-beginning 0))))
+    str))
+
+(defun docbook--print-block-delimiter ()
+  "Insert newlines for the start or end of a DocBook block element."
+  (cond
+   ((bobp))
+   ((looking-back "\n\n"))
+   ((eq (char-before) ?\n) (insert ?\n))
+   (t (insert "\n\n"))))
+
+(defun docbook--print-string (str &optional literal face)
+  "Insert STR (a string) at point, unless it is useless whitespace.
+If LITERAL is non-nil, preserve whitespace.  If FACE is non-nil,
+apply it as the face for the inserted text."
+  (cond ((or literal (not (string-match "\\`\\s-+\\'" str)))
+        (insert (propertize str 'font-lock-face face)))
+       ((not (or (bolp) (memq (char-before) '(?\s ?\t))))
+        (insert " "))))
+
+(defun docbook--merge-face (base-face face)
+  "Return a face or list of faces, by merging BASE-FACE and FACE."
+  (cond
+   ((null base-face) face)
+   ((null face)      base-face)
+   ((eq face base-face) base-face)
+   (t
+    (append (if (consp face) face (list face))
+           (if (consp base-face) base-face (list base-face))))))
+
+(defun docbook--node-face (base-face type &optional parent)
+  "Return a face suitable for displaying DocBook node type TYPE.
+BASE-FACE is the face specified by the node's parent elements.
+If PARENT is non-nil, treat TYPE as the type of the parent node,
+and assume that we are looking up the face of a title node."
+  (let ((face (if parent
+                 (or (cdr (assq type docbook-title-markup-alist))
+                     'docbook-misc-title)
+               (cdr (assq type docbook-text-markup-alist)))))
+    (docbook--merge-face base-face face)))
+
+;;; Parsing the DocBook XML tree
+
+(defun docbook-register-node (node parent-page-id parent-node-id)
+  "Register NODE.
+NODE should be a cons cell---a subnode of the tree returned by
+`xml-parse-file'.  PARENT is the registered node ID of the parent
+page (a symbol).  PARENT-NODE-ID is the registered node ID of the
+node's immediate parent (which may or may not correspond to a
+page node), or nil if the parent has no ID.
+
+If NODE is a page node, return its registered node ID (a symbol).
+Otherwise, return nil."
+  (let ((type (xml-node-name node)))
+    (cond
+     ((eq type 'comment))
+     ((eq type 'indexterm)
+      (docbook--register-indexterm node parent-page-id))
+     ((memq type docbook-page-types)
+      (docbook--register-page-node node parent-page-id))
+     (t
+      (docbook--register-nonpage-node node parent-page-id
+                                     parent-node-id)))))
+
+(defun docbook--register-indexterm (node parent-id)
+  (let ((id (docbook--attr 'id node)))
+    (if id (puthash id `(,node nil ,parent-id) docbook--id-table))
+    ;; HACK: Modify the XML tree to add an indexterm id (a symbol).
+    (setq id (make-symbol "indexterm"))
+    (setcar (cdr node) (cons (cons 'docbook-indexterm-id id)
+                            (xml-node-attributes node)))
+    (puthash id `(,node nil ,parent-id) docbook--id-table)
+    (let* ((type (docbook--attr 'type node))
+          (index (assq type docbook--index-alist)))
+      ;; If there is no index of the indicated type yet, add it.
+      (unless index
+       (setq docbook--index-alist
+             (cons (setq index (cons type nil))
+                   docbook--index-alist)))
+      (dolist (subnode (xml-node-children node))
+       (cond
+        ((not (consp subnode)))
+        ((memq (xml-node-name subnode) '(primary secondary tertiary))
+         (let* ((term (docbook--node-text subnode))
+                (entry (assoc term (cdr index))))
+           (if entry
+               (setcdr entry (cons id (cdr entry)))
+             (setcdr index (cons (list term id) (cdr index))))))))
+      nil)))
+
+(defun docbook--register-page-node (node parent-id)
+  (let ((id (docbook--attr 'id node)))
+    ;; If there is no ID, generate an uninterned symbol as the ID.
+    (unless id
+      (setq id (make-symbol "Unnamed section")))
+    (unless parent-id
+      (setq docbook-top-page id))
+    ;; Make the node record and update the NEXT record of the last node
+    ;; processed.  This must be done before descending into the tree.
+    (if docbook--last-page-registered
+       (setcar (nthcdr 4 docbook--last-page-registered) id))
+    (let ((record (list node nil parent-id
+                       docbook--last-page-id-registered nil nil)))
+      (setq docbook--last-page-registered record
+           docbook--last-page-id-registered id)
+      ;; Add the entry for this page node into the hash table.
+      (if id (puthash id record docbook--id-table))
+      ;; Descend into the children, registering them.
+      (let ((subnodes
+            (mapcar (lambda (subnode)
+                      (when (consp subnode)
+                        (docbook-register-node subnode id id)))
+                    (xml-node-children node))))
+       ;; If this is a section node, update its record with the IDs of
+       ;; the subsections, then return the ID of this node.
+       (setcar (nthcdr 5 record) (delq nil subnodes))))
+    id))
+
+(defun docbook--register-nonpage-node (node parent-page-id parent-node-id)
+  (let ((id (docbook--attr 'id node)))
+    ;; If this is a title node, register it in the parent node.
+    (when (and (eq (xml-node-name node) 'title) parent-node-id)
+      (let ((parent-record (docbook--node-record parent-node-id)))
+       (if parent-record (setcar (cdr parent-record) node))))
+    ;; Construct the node record.
+    (if id (puthash id `(,node nil ,parent-page-id) docbook--id-table))
+    ;; Descend into the children, registering them.
+    (dolist (subnode (xml-node-children node))
+      (when (consp subnode)
+       (docbook-register-node subnode parent-page-id id)))
+    nil))
+
+;;; Rendering DocBook
+
+(defun docbook-print-page (node-id &optional error-msg norecord)
+  "Print the DocBook section corresponding to NODE-ID.
+If NODE-ID is not a registered DocBook section node, signal an
+error.  The optional argument ERROR-MSG, if non-nil, specifies a
+default error message.
+
+If optional argument NORECORD is non-nil, do not record this node
+in `docbook-history'."
+  (let ((node-record (when (and node-id (symbolp node-id))
+                      (docbook--node-record node-id))))
+    (unless node-record
+      (funcall (if (fboundp 'user-error) 'user-error 'error)
+              (or error-msg "Node not found")))
+    (unless norecord
+      (push node-id docbook-history)
+      (setq docbook-history-forward nil))
+    (if (= (length node-record) 3)
+       ;; If the id points to a page fragment, visit the parent page
+       ;; and jump to the relevant marker within that page.
+       (progn
+         (docbook-print-page (nth 2 node-record) nil t)
+         (docbook--visit-xref-marker node-id))
+      ;; If the id points to a page, visit it.
+      (let* ((inhibit-read-only t)
+            (node (car node-record))
+            (subsections (nth 5 node-record))
+            (docbook--footnotes nil))
+       (erase-buffer)
+       ;; Add a fragment marker to the top of this page.
+       (setq docbook-id-markers-alist nil
+             docbook-current-page node-id)
+       (docbook-add-fragment-link node-id)
+       ;; Each section contains any number of blocks followed by any
+       ;; number of subsections.  Loop over subnodes, printing
+       ;; block-level nodes.
+       (dolist (subnode (xml-node-children node))
+         (cond ((null subnode))
+               ((stringp subnode)
+                (docbook--print-string subnode))
+               ((not (memq (xml-node-name subnode) docbook-page-types))
+                (docbook--print-node subnode (xml-node-name node)))))
+       ;; If there are footnotes, print them.
+       (docbook--print-footnotes)
+       ;; If there are subsections, print a submenu.
+       (when subsections
+         (docbook--print-block-delimiter)
+         (docbook--print-string "Menu" nil 'docbook-misc-title)
+         (insert "\n")
+         (let ((bullet (docbook--display-string "• " "* "))
+               opoint)
+           (dolist (id subsections)
+             (setq opoint (point))
+             (insert bullet)
+             (docbook-insert-xref id)
+             (insert ?\n)
+             (put-text-property opoint (point) 'docbook-menu-xref id))))
+       (goto-char (point-min))))))
+
+(defun docbook--print-node (node parent-type &optional literal face)
+  "Insert the contents of NODE at point.
+NODE should be a cons cell---a subnode of the tree returned by
+`xml-parse-file'.  PARENT-TYPE should be the node type of the
+parent node (a symbol), or nil if this is the topmost node.
+
+Optional arg LITERAL, if non-nil, means to preserve whitespace
+and newlines when printing this node.
+
+Optional arg FACE, if non-nil, should be a face or list of faces
+to use, by default, for printing this node.  The node may apply
+additional markup on top to of the specified FACE."
+  (let ((type (xml-node-name node)))
+    (cond
+     ((memq type docbook-suppressed-types)
+      (docbook-add-fragment-link (docbook--attr 'id node)))
+     ((eq type 'title)
+      (docbook--print-block node literal
+                           (docbook--node-face face parent-type t)))
+     ((progn
+       ;; For the sake of all the remaining node types, set FACE to
+       ;; the markup face for this node's type.
+       (setq face (docbook--node-face face type))
+       (memq type docbook-block-types))
+      (docbook--print-block node literal face))
+     ((progn
+       ;; For the sake of all remaining node types, apply the
+       ;; fragment ID if any.
+       (docbook-add-fragment-link (docbook--attr 'id node))
+       (eq type 'xref))
+      (docbook--print-xref node literal face))
+     ;; Index handling
+     ((eq type 'indexterm)
+      (docbook-add-fragment-link
+       (cdr (assq 'docbook-indexterm-id (xml-node-attributes node)))))
+     ((eq type 'index)
+      (docbook--print-index (docbook--attr 'type node)))
+     ;; Refentry and friends
+     ((eq type 'refnamediv)
+      (docbook--print-refnamediv node literal face))
+     ((eq type 'refsynopsisdiv)
+      (docbook--print-refsynopsisdiv node literal face))
+     ;; List handling
+     ((memq type docbook-list-types)
+      (docbook--print-list node literal face))
+     ((memq type '(listitem question answer step))
+      (docbook--print-listitem node literal face))
+     ((memq type '(term glossterm))
+      (docbook--print-term node literal face))
+     ;; Cross References
+     ((memq type '(link ulink))
+      (docbook--print-link node literal face))
+     ((eq type 'email)
+      (docbook--print-email node literal face))
+     ;; Misc markup
+     ((eq type 'quote)
+      (docbook--print-string (docbook--display-string "“" "`")
+                            literal face)
+      (docbook--print-children node literal face)
+      (docbook--print-string (docbook--display-string "”" "'")
+                            literal face))
+     ((eq type 'footnote)
+      (docbook--print-footnote-tag node))
+     ((eq type 'subscript)
+      (docbook--print-with-display-prop node literal face '(raise -0.2)))
+     ((eq type 'superscript)
+      (docbook--print-with-display-prop node literal face '(raise 0.2)))
+     ((eq type 'arg)
+      (docbook--print-arg node literal face))
+     ((eq type 'anchor))
+     (t
+      (docbook--print-children node literal face)))))
+
+(defun docbook--print-block (node literal face)
+  (docbook--print-block-delimiter)
+  (let* ((type (xml-node-name node))
+        (beg (point)))
+    ;; If the block has an ID tag, apply it.
+    (docbook-add-fragment-link (docbook--attr 'id node))
+    ;; Print the contents of the block.
+    (docbook--print-children node literal
+                          (docbook--node-face face type))
+    (unless literal
+      ;; Flush the beginning of the block to column zero, and fill.
+      (let ((stop (point)))
+       (save-excursion
+         (goto-char beg)
+         (skip-chars-forward "[:space:]" stop)
+         (delete-region beg (point))
+         (setq beg (point))))
+      (let ((left-margin docbook--indent-level))
+       (fill-region-as-paragraph beg (point))))
+    (docbook--print-block-delimiter)))
+
+(defun docbook--print-list (node literal face)
+  (docbook--print-block-delimiter)
+  (let ((type (xml-node-name node))
+       (docbook--indent-level docbook--indent-level)
+       (docbook--list-context docbook--list-context))
+    (cond
+     ((memq type '(procedure substeps))
+      ;; We use a version list to denote (sub)steps.
+      (let* ((version (if (eq (car-safe docbook--list-context) 'procedure)
+                         (append (cdr docbook--list-context) '(1))
+                       '(1)))
+            (str (mapconcat 'int-to-string version ".")))
+       (setq docbook--indent-level (+ (length str) 3 docbook--indent-level)
+             docbook--list-context (cons 'procedure version))))
+     ((eq type 'orderedlist)
+      (setq docbook--indent-level (+ 4 docbook--indent-level)
+           docbook--list-context 1))
+     ((memq type '(glosslist variablelist))
+      (setq docbook--indent-level (+ 4 docbook--indent-level)
+           docbook--list-context 'variablelist))
+     ((eq type 'qandaset)
+      (let ((label (docbook--attr 'defaultlabel node)))
+       (setq docbook--indent-level (+ 4 docbook--indent-level)
+             docbook--list-context (cons 'qandaset label))))
+     (t
+      (setq docbook--indent-level (+ 2 docbook--indent-level)
+           docbook--list-context 'itemizedlist)))
+    (docbook--print-children node literal face))
+  (docbook--print-block-delimiter))
+
+(defun docbook--print-term (node literal face)
+  (when (eq docbook--list-context 'variablelist)
+    (unless (eq (char-before) ?\n)
+      (insert "\n"))
+    (let ((opoint (point)))
+      (docbook--print-children node literal face)
+      (save-excursion
+       (let ((stop (point)))
+         (goto-char opoint)
+         (skip-chars-forward "[:space:]" stop)
+         (delete-region opoint (point))
+         (indent-line-to (- docbook--indent-level 4))
+         (docbook--print-string (docbook--display-string "• " "* ")
+                                literal face))))))
+
+(defun docbook--print-listitem (node literal face)
+  (let ((opoint (point)))
+    (docbook--print-children node literal face)
+    (when (not (memq docbook--list-context '(nil variablelist)))
+      (cond
+       ;; A step in a procedure
+       ((eq (car-safe docbook--list-context) 'procedure)
+       (let* ((version (cdr docbook--list-context))
+              (str (concat (mapconcat 'int-to-string version ".") ". "))
+              (subversion (nthcdr (1- (length version)) version)))
+         (docbook--print-listitem-1 opoint str (length str)
+                                    literal face)
+         (setcar subversion (1+ (car subversion)))))
+       ;; Question or answer
+       ((eq (car-safe docbook--list-context) 'qandaset)
+       (let ((subnodes (xml-node-children node))
+             label)
+         ;; Look for a label for the question or answer.
+         (while (and (null label) subnodes)
+           (when (and (consp (car subnodes))
+                      (eq (xml-node-name (car subnodes)) 'label))
+             (setq label (docbook--node-text (car subnodes))))
+           (setq subnodes (cdr subnodes)))
+         ;; If there is none, consult the default label.
+         (and (not (stringp label))
+              (eq (cdr docbook--list-context) 'qanda)
+              (setq label (if (eq (xml-node-name node) 'question)
+                              "Q:"
+                            "A:")))
+         (if (null label)
+             ;; Use a bullet, like an itemizedlist.
+             (docbook--print-listitem-1
+              opoint (docbook--display-string "• " "* ") 2 literal face)
+           (docbook--print-listitem-1
+            opoint label 0 literal
+            (docbook--merge-face face 'docbook-label) " " face))))
+       ;; orderedlist
+       ((integerp docbook--list-context)
+       (docbook--print-listitem-1
+        opoint (format "%2d. " docbook--list-context) 4 literal face)
+       (setq docbook--list-context (1+ docbook--list-context)))
+       ;; itemizedlist
+       (t
+       (docbook--print-listitem-1
+        opoint (docbook--display-string "• " "* ") 2 literal face))))))
+
+(defun docbook--print-listitem-1 (opoint bullet bullet-len literal face
+                                 &optional after-string after-string-face)
+  (save-excursion
+    (let ((stop (point)))
+      (goto-char opoint)
+      (skip-chars-forward "[:space:]" stop)
+      (indent-line-to (- docbook--indent-level bullet-len))
+      (docbook--print-string bullet literal face)
+      (if after-string
+         (docbook--print-string after-string literal
+                                after-string-face)))))
+
+(defun docbook--print-footnote-tag (node)
+  (when (boundp 'docbook--footnotes)
+    (let ((n (1+ (length docbook--footnotes)))
+         (tag-id (make-symbol "footnote-id"))
+         (footnote-id (make-symbol "footnote")))
+      (docbook-add-fragment-link tag-id)
+      (docbook-insert-xref footnote-id (format "(%d)" n))
+      (push (list tag-id footnote-id node) docbook--footnotes))))
+
+(defun docbook--print-footnotes ()
+  (when (bound-and-true-p docbook--footnotes)
+    (docbook--print-block-delimiter)
+    (docbook--print-string "--- Footnotes ---")
+    (let ((n 1) opoint)
+      (dolist (footnote (nreverse docbook--footnotes))
+       (docbook--print-block-delimiter)
+       (setq opoint (point))
+       (docbook--print-children (nth 2 footnote))
+       (save-excursion
+         (goto-char opoint)
+         (if (eq (char-after) ?\n) (forward-char))
+         (docbook-add-fragment-link (nth 1 footnote))
+         (docbook-insert-xref (car footnote) (format "(%d)" n))
+         (insert " "))
+       (setq n (1+ n))))))
+
+(defun docbook--print-with-display-prop (node literal face prop)
+  (let ((opoint (point)))
+    (docbook--print-children node literal face)
+    (put-text-property opoint (point) 'display prop)))
+
+(defun docbook--print-children (node &optional literal face)
+  "Print the child nodes of the DocBook node NODE.
+LITERAL and FACE mean the same as in `docbook--print-node'."
+  (dolist (subnode (xml-node-children node))
+    (cond
+     ((null subnode))
+     ((stringp subnode)
+      (docbook--print-string subnode literal face))
+     (t
+      (docbook--print-node subnode (xml-node-name node)
+                          literal face)))))
+
+(defun docbook--print-refnamediv (node literal face)
+  (docbook--print-block-delimiter)
+  (let (names purpose)
+    (dolist (subnode (xml-node-children node))
+      (cond ((not (consp subnode)))
+           ((eq (xml-node-name subnode) 'refname)
+            (push subnode names))
+           ((eq (xml-node-name subnode) 'refpurpose)
+            (setq purpose subnode))))
+    (setq names (nreverse names))
+    (indent-to docbook--indent-level)
+    (while names
+      (docbook--print-node (car names) 'refnamediv literal face)
+      (setq names (cdr names))
+      (if names (docbook--print-string ", " literal face)))
+    (when purpose
+      (or (eq (char-before) ?\n) (insert ?\n))
+      (indent-to docbook--indent-level)
+      (docbook--print-node purpose literal face)))
+  (docbook--print-block-delimiter))
+
+(defun docbook--print-refsynopsisdiv (node literal face)
+  (docbook--print-block-delimiter)
+  (indent-to docbook--indent-level)
+  (docbook--print-string "Synopsis" nil 'docbook-misc-title)
+  (docbook--print-block-delimiter)
+  (docbook--print-children node literal face))
+
+(defun docbook--print-arg (node literal face)
+  (let ((choice (docbook--attr 'choice node))
+       (repeat (docbook--attr 'rep node)))
+    (if (eq choice 'opt)
+       (docbook--print-string "[ " literal face))
+    (docbook--print-children node literal face)
+    (if (eq choice 'opt)
+       (docbook--print-string " ]" literal face))
+    (if (eq repeat 'repeat)
+       (docbook--print-string "..." literal face))))
+
+;;; Cross-reference handling
+
+(defun docbook--print-xref (node literal face)
+  "Insert the contents of an xref node NODE."
+  (let ((target (docbook--attr 'linkend node)))
+    (when target
+      (let ((endterm (docbook--attr 'endterm node)))
+       ;; If an endterm attribute is present, print its contents.
+       ;; FIXME: protect against a recursion bomb.
+       (if (and endterm
+                (setq endterm (car (docbook--node-record endterm))))
+           (docbook--print-link endterm literal face target)
+         (docbook-insert-xref target))))))
+
+(defun docbook--print-link (node literal face &optional linkend)
+  "Insert the contents of a link node NODE."
+  (let ((target (or linkend (docbook--attr 'linkend node)))
+       (opoint (point))
+       (action 'docbook-xref-button-action))
+    (unless target
+      ;; If there is no linkend attribute, look for an external URL.
+      (let ((attributes (xml-node-attributes node)))
+       (setq target
+             (or (cdr (assq 'xlink:href attributes))
+                 (cdr (assq 'href attributes))
+                 ;; Used by obsolete `url' elements.
+                 (cdr (assq 'url attributes))))
+       (setq action 'docbook-link-button-action)))
+    (docbook--print-children node literal face)
+    (make-text-button opoint (point)
+                     'action action
+                     'docbook-target target)))
+
+(defun docbook--print-email (node literal face)
+  "Insert the contents of a link node NODE."
+  (let ((opoint (point)))
+    (docbook--print-children node literal face)
+    (make-text-button opoint (point)
+                     'action 'docbook-email-button-action)))
+
+(defun docbook-insert-xref (node-id &optional label)
+  "Insert a cross reference to NODE-ID at point.
+NODE-ID should be a node ID, as either a symbol or a string.
+LABEL, if non-nil, specifies the text label."
+  (unless label
+    (setq label (docbook-node-label node-id)))
+  (insert-text-button label
+                     'action 'docbook-xref-button-action
+                     'docbook-target node-id))
+
+(defun docbook-node-label (node-id)
+  "Return an appropriate label for the node with ID NODE-ID."
+  (let* ((record (docbook--node-record node-id))
+        (attributes (xml-node-attributes (car record)))
+        ;; Use the target node's xreflabel attribute.
+        (label (cdr (assq 'xreflabel attributes))))
+    (when (memq label '(nil ""))
+      ;; Otherwise, use the target node's title.
+      (setq label (and (nth 1 record)
+                      (docbook--node-text (nth 1 record))))
+      (when (memq label '(nil ""))
+       ;; Otherwise, default to the node ID's name.
+       (setq label (symbol-name node-id))))
+    label))
+
+(defun docbook--visit-xref-marker (node-id &optional noerror)
+  "Visit the position of NODE-ID on the current DocBook page.
+Return non-nil if we found the element and jumped to it.
+Otherwise, signal an error if NOERROR is nil, and return nil if
+NOERROR is non-nil."
+  (let ((marker (cdr (assq node-id docbook-id-markers-alist))))
+    (cond
+     ((markerp marker)
+      (goto-char marker))
+     ((null noerror)
+      (error "Node not found")))))
+
+(defun docbook-visit-xref (node-id)
+  (or (docbook--visit-xref-marker node-id t)
+      (docbook-print-page node-id)))
+
+(defun docbook-xref-button-action (button)
+  "Visit the DocBook node indicated by BUTTON."
+  (docbook-visit-xref (button-get button 'docbook-target)))
+
+(defun docbook-link-button-action (button)
+  "Call `browse-url' to visit the link indicated by BUTTON."
+  (let ((target (button-get button 'docbook-target)))
+    (if (string-match "\\`mailto:" target)
+       (compose-mail (substring-no-properties target (match-end 0)))
+      (browse-url (button-get button 'docbook-target)))))
+
+(defun docbook-email-button-action (button)
+  "Send mail to the address indicated by BUTTON."
+  (compose-mail (buffer-substring-no-properties
+                (button-start button) (button-end button))))
+
+;; Printing the index and history list
+
+(defun docbook--print-index (type)
+  "Insert the DocBook index of type TYPE at point."
+  (let ((index (assq type docbook--index-alist))
+       (bullet (docbook--display-string "• " "* "))
+       opoint)
+    (unless (eq (char-before) ?\n) (insert ?\n))
+    (dolist (entry (cdr index))
+      (setq opoint (point))
+      (insert bullet)
+      (insert (car entry))
+      (let* ((ids (cdr entry))
+            (id (car ids)))
+       (indent-to docbook-index-separator-column 2)
+       (docbook-insert-xref
+        id (docbook-node-label (nth 2 (docbook--node-record id))))
+       (insert ?\n)
+       (put-text-property opoint (point) 'docbook-menu-xref id)
+       (if (> (length ids) 1)
+           (dolist (id (cdr ids))
+             (setq opoint (point))
+             (indent-to docbook-index-separator-column 2)
+             (docbook-insert-xref
+              id (docbook-node-label
+                  (nth 2 (docbook--node-record id))))
+             (insert ?\n)
+             (put-text-property opoint (point) 'docbook-menu-xref id)))))
+    (insert ?\n)))
+
+(defun docbook--print-history ()
+  "Insert the DocBook navigation history menu at point."
+  (let ((bullet (docbook--display-string "◦ " "* ")))
+    (dolist (id (reverse (cdr docbook-history)))
+      (unless (eq (char-before) ?\n) (insert ?\n))
+      (insert bullet)
+      (docbook-insert-xref id))
+    ;; Indicate the current page with a more prominent bullet.
+    (unless (eq (char-before) ?\n) (insert ?\n))
+    (insert (docbook--display-string "• " "* "))
+    (docbook-insert-xref (car docbook-history))
+    (dolist (id docbook-history-forward)
+      (unless (eq (char-before) ?\n) (insert ?\n))
+      (insert bullet)
+      (docbook-insert-xref id))
+    (insert ?\n)))
+
+;;; Major mode
+
+(defvar docbook-mode-map
+  (let ((map (make-keymap)))
+    (set-keymap-parent map (make-composed-keymap button-buffer-map
+                                                 special-mode-map))
+    (define-key map "." 'beginning-of-buffer)
+    (define-key map " " 'docbook-scroll-up)
+    (define-key map "\177" 'docbook-scroll-down)
+    (define-key map "\C-m" 'docbook-follow-nearest-node)
+
+    (dotimes (n 9)
+      (define-key map (number-to-string (1+ n)) 'docbook-nth-menu-item))
+
+    (define-key map "b" 'beginning-of-buffer)
+    (define-key map "e" 'end-of-buffer)
+    (define-key map "\M-n" 'clone-buffer)
+
+    (define-key map "i" 'docbook-index)
+    (define-key map "I" 'docbook-index)
+    (define-key map "l" 'docbook-history-back)
+    (define-key map "r" 'docbook-history-forward)
+    (define-key map "L" 'docbook-history)
+
+    (define-key map "]" 'docbook-forward-page)
+    (define-key map "[" 'docbook-backward-page)
+    (define-key map "n" 'docbook-forward-page)
+    (define-key map "p" 'docbook-backward-page)
+
+    ;; (define-key map "f" 'docbook-follow-reference)
+    ;; (define-key map "g" 'docbook-goto-node)
+    ;; (define-key map "m" 'docbook-menu)
+
+    ;; (define-key map "s" 'docbook-search)
+    ;; (define-key map "S" 'docbook-search-case-sensitively)
+    ;; (define-key map "T" 'docbook-toc)
+    ;; (define-key map "," 'docbook-index-next)
+
+    (define-key map "t" 'docbook-top-page)
+    (define-key map "u" 'docbook-up)
+    (define-key map "^" 'docbook-up)
+    (define-key map [follow-link] 'mouse-face)
+    map)
+  "Keymap containing DocBook commands.")
+
+(define-derived-mode docbook-mode special-mode "DocBook"
+  "Major mode for viewing DocBook documents.
+Type \\[docbook-find-file] to visit DocBook files for viewing.
+Most of the commands in DocBook mode are similar to Info mode.
+
+DocBook documents are divided into \"section nodes\" (which
+includes chapters, sections, subsections, etc.).  DocBook mode
+displays one section node at a time, as a single page.
+Navigation commands and hyperlinks can be used to view other
+pages.
+
+Moving within a page:
+\\[docbook-scroll-up]  Normally, scroll forward a full screen.
+       If you have scrolled to the end of this page,
+       view the next page.
+\\[docbook-scroll-down]        Normally, scroll backward a full screen.
+       If you have scrolled to the beginning of this page,
+       view the preceding page.
+\\[beginning-of-buffer]        Jump to beginning of this page.
+
+Selecting other nodes:
+\\[docbook-follow-nearest-node]        Follow a node reference near point.
+\\[docbook-backward-page]      View the preceding page.
+\\[docbook-forward-page]       View the next page.
+\\[docbook-up] View the parent of the current page.
+\\[docbook-top-page]   View the topmost section of this document.
+\\[docbook-history-back]       View the last page you were at.
+\\[docbook-history-forward]    Move forward in history to the page you were at before using \\[docbook-history-back].
+\\[docbook-history]    View a menu of visited pages."
+  (make-local-variable 'docbook--parse-tree)
+  (make-local-variable 'docbook--id-table)
+  (make-local-variable 'docbook-current-page)
+  (make-local-variable 'docbook-top-page)
+  (make-local-variable 'docbook-id-markers-alist)
+  (make-local-variable 'docbook--index-alist)
+  (make-local-variable 'docbook-history)
+  (make-local-variable 'docbook-history-foward)
+  (setq-local adaptive-fill-mode nil)
+  (setq indent-tabs-mode nil)
+  (setq fill-prefix nil)
+  (setq use-hard-newlines t))
+
+;;; Navigation commands
+
+(defun docbook-up ()
+  "View the parent of the current DocBook page."
+  (interactive)
+  (docbook-print-page (nth 2 (docbook--node-record)) "No parent page"))
+
+(defun docbook-top-page ()
+  "View the topmost page in the current DocBook document."
+  (interactive)
+  (docbook-print-page docbook-top-page))
+
+(defun docbook-backward-page ()
+  "View the previous DocBook page."
+  (interactive)
+  (docbook-print-page (nth 3 (docbook--node-record)) "No previous page"))
+
+(defun docbook-forward-page ()
+  "View the next DocBook page."
+  (interactive)
+  (docbook-print-page (nth 4 (docbook--node-record)) "No following page"))
+
+(defun docbook-scroll-up ()
+  "Scroll forward, or view the next DocBook page."
+  (interactive)
+  (condition-case nil
+      (scroll-up nil)
+    (end-of-buffer (docbook-forward-page))))
+
+(defun docbook-scroll-down ()
+  "Scroll backward, or view the preceding DocBook page."
+  (interactive)
+  (condition-case nil
+      (scroll-down nil)
+    (beginning-of-buffer (docbook-backward-page))))
+
+(defun docbook-nth-menu-item ()
+  "View the Nth menu item, based on the key typed."
+  (interactive)
+  (let ((n (- (aref (this-command-keys)
+                   (1- (length (this-command-keys)))) ?0))
+       (node-record (docbook--node-record)))
+    (unless node-record
+      (funcall (if (fboundp 'user-error) 'user-error 'error)
+              "No menu in this node"))
+    (let ((id (nth (1- n) (nth 5 node-record))))
+      (unless id
+       (funcall (if (fboundp 'user-error) 'user-error 'error)
+                "Too few items in menu"))
+      (docbook-visit-xref id))))
+
+(defun docbook-follow-nearest-node ()
+  "Follow a node reference near point.
+If point is on a reference, follow that reference.  Otherwise,
+if point is in a menu item description, follow that menu item."
+  (interactive)
+  (let ((id (get-text-property (point) 'docbook-menu-xref)))
+    (if id
+       (docbook-visit-xref id)
+      (funcall (if (fboundp 'user-error) 'user-error 'error)
+              "Point neither in reference nor in menu item description"))))
+
+;; History commands
+
+(defun docbook-history-back (n)
+  "Go back in history to the previous DocBook page viewed."
+  (interactive "p")
+  (dotimes (_i n)
+    (unless (cdr docbook-history)
+      (funcall (if (fboundp 'user-error) 'user-error 'error)
+              "This is the first node you looked at"))
+    (push (pop docbook-history) docbook-history-forward)
+    (docbook-print-page (car docbook-history) nil t)))
+
+(defun docbook-history-forward (n)
+  "Go forward in history to the next DocBook page viewed."
+  (interactive "p")
+  (dotimes (_i n)
+    (if (null docbook-history-forward)
+       (funcall (if (fboundp 'user-error) 'user-error 'error)
+                "This is the last node you looked at"))
+    (let ((id (pop docbook-history-forward)))
+      (push id docbook-history)
+      (docbook-print-page id nil t))))
+
+(defun docbook-history ()
+  "Display a list of recently-visited DocBook pages."
+  (interactive)
+  (let ((inhibit-read-only t))
+    (erase-buffer)
+    (docbook--print-string "Recently visited pages"
+                          nil 'docbook-chapter-title)
+    (insert ?\n ?\n)
+    (docbook--print-history)))
+
+;; Misc commands
+
+(defun docbook-index (type)
+  "Display a list of index topics fo the current DocBook document.
+The argument TYPE is the index type; DocBook documents can define
+several indices for different topics.  If called interactively,
+prompt for TYPE."
+  (interactive (list (if (<= (length docbook--index-alist) 1)
+                        (caar docbook--index-alist)
+                      (completing-read
+                       (format "View index type%s: "
+                               (if (assq nil docbook--index-alist)
+                                   " (empty input for default index)"
+                                 ""))
+                       (cons "" (mapcar (lambda (x) (symbol-name (car x)))
+                                        docbook--index-alist))
+                       nil t))))
+  (unless (assq type docbook--index-alist)
+    (funcall (if (fboundp 'user-error) 'user-error 'error)
+            "Index is empty"))
+  (let ((inhibit-read-only t))
+    (erase-buffer)
+    (docbook--print-string (if type
+                              (format "Index: %s" (symbol-name type))
+                            "Index")
+                          nil 'docbook-chapter-title)
+    (insert ?\n ?\n)
+    (docbook--print-index type)))
+
+;;;###autoload
+(defun docbook-find-file (filename)
+  "Visit FILENAME as a DocBook document."
+  (interactive "fView DocBook file: ")
+  (docbook-setup
+   (car (let ((xml-entity-alist (append docbook-entity-alist
+                                       xml-entity-alist)))
+         (xml-parse-file filename))))
+  (docbook-print-page docbook-top-page))
+
+(provide 'docbook)
+
+;;; docbook.el ends here
diff --git a/packages/ediprolog/ediprolog.el b/packages/ediprolog/ediprolog.el
new file mode 100644 (file)
index 0000000..ef218a4
--- /dev/null
@@ -0,0 +1,613 @@
+;;; ediprolog.el --- Emacs Does Interactive Prolog
+
+;; Copyright (C) 2006, 2007, 2008, 2009  Free Software Foundation, Inc.
+
+;; Author: Markus Triska <markus.triska@gmx.at>
+;; Keywords: languages, processes
+;; Version: 1.0
+
+;; This file 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, or (at your option)
+;; any later version.
+
+;; This file 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; These definitions let you interact with SWI-Prolog in all buffers.
+;; You can consult Prolog programs and evaluate embedded queries.
+
+;; Installation
+;; ============
+;;
+;; Copy ediprolog.el to your load-path and add to your .emacs:
+;;
+;;     (require 'ediprolog)
+;;     (global-set-key [f10] 'ediprolog-dwim)
+;;
+;; Restart Emacs and customize ediprolog with
+;;
+;;     M-x customize-group RET ediprolog RET
+;;
+
+;; Usage
+;; =====
+;;
+;; The central function is `ediprolog-dwim' (Do What I Mean), which is
+;; bound to F10 by the snippet above. Depending on the content at
+;; point, `ediprolog-dwim' does the "appropriate" thing: If point is
+;; on a query, F10 sends the query to a Prolog process, and you
+;; interact with the process in the current buffer as on a terminal.
+;; Queries start with "?-" or ":-", possibly preceded by "%" and
+;; whitespace. An example of a query is (without leading ";;"):
+;;
+;;   %?- member(X, [a,b,c]).
+;;
+;; If you press F10 when point is on that query, you get:
+;;
+;;   %?- member(X, [a,b,c]).
+;;   %@ X = a ;
+;;   %@ X = b ;
+;;   %@ X = c ;
+;;   %@ false.
+;;
+;; When waiting for output of the Prolog process, you can press C-g to
+;; unblock Emacs and continue with other work. To resume interaction
+;; with the Prolog process, use M-x ediprolog-toplevel RET.
+
+;; If you press F10 when point is NOT on a query, the buffer content
+;; is consulted in the Prolog process, and point is moved to the first
+;; error (if any).
+
+;; For convenience, the most recent interactions with the Prolog
+;; process are logged in the buffer "*ediprolog-history*".
+
+;; Use M-x ediprolog-localize RET to make any Prolog process started
+;; in the current buffer buffer-local. This way, you can run distinct
+;; processes simultaneously. Revert with M-x ediprolog-unlocalize RET.
+
+;; `ediprolog-dwim' with prefix arguments has special meanings:
+;;
+;;   C-0 F10       kill Prolog process
+;;   C-1 F10       always consult buffer (even when point is on a query)
+;;   C-2 F10       always consult buffer, using a new process
+;;   C-7 F10       equivalent to `ediprolog-toplevel'
+;;   C-u F10       first consult buffer, then evaluate query (if any)
+;;   C-u C-u F10   like C-u F10, with a new process
+
+;; Tested with SWI-Prolog 5.6.55 + Emacs 21.2, 22.3 and 23.0.92.2.
+
+;;; Code:
+
+(defconst ediprolog-version "0.9yb")
+
+(defgroup ediprolog nil
+  "Transparent interaction with SWI-Prolog."
+  :group 'languages
+  :group 'processes)
+
+(defcustom ediprolog-program
+  (or (executable-find "swipl") (executable-find "pl") "swipl")
+  "Program name of the Prolog executable."
+  :group 'ediprolog
+  :type 'string)
+
+(defcustom ediprolog-program-switches nil
+  "List of switches passed to the Prolog process. Example:
+'(\"-G128M\" \"-O\")"
+  :group 'ediprolog
+  :type '(repeat string))
+
+(defcustom ediprolog-prefix "%@ "
+  "String to prepend when inserting output from the Prolog
+process into the buffer."
+  :group 'ediprolog
+  :type 'string)
+
+(defcustom ediprolog-max-history 80000
+  "Maximal size of history buffers storing recent interactions, or
+nil to never truncate the history."
+  :group 'ediprolog
+  :type 'sexp)
+
+(defvar ediprolog-process               nil "A Prolog process.")
+
+(defvar ediprolog-temp-buffer           nil
+  "Buffer that temporarily saves process output ")
+
+(defvar ediprolog-seen-prompt           nil
+  "Whether a prompt was (recently) emitted by the Prolog process.")
+
+(defvar ediprolog-read-term             nil
+  "Whether the Prolog process waits for the user to enter a term.")
+
+(defvar ediprolog-indent-prefix         ""
+  "Any whitespace occurring before the most recently executed query.")
+
+(defvar ediprolog-temp-file             nil
+  "File name of a temporary file used for consulting the buffer.")
+
+(defvar ediprolog-prompt "?ediprolog- "
+  "Prompt used in the Prolog session. It must differ from the
+default Prolog prompt.")
+
+(defvar ediprolog-consult-buffer "*ediprolog-consult*"
+  "Buffer used to display consult output.")
+
+(defvar ediprolog-consult-window        nil
+  "Window used to show consult output.")
+
+(defvar ediprolog-history-buffer        nil
+  "Buffer that stores recent interactions.")
+
+(defvar ediprolog-interrupted           nil
+  "True iff waiting for the previous query was interrupted with C-g.")
+
+(defmacro ediprolog-wait-for-prompt-after (&rest forms)
+  "Evaluate FORMS and wait for prompt."
+  `(progn
+     (setq ediprolog-seen-prompt nil)
+     (ediprolog-ensure-buffer "temp")
+     (with-current-buffer ediprolog-temp-buffer
+       (let (buffer-read-only)
+         (erase-buffer)))
+     ;; execute forms with default-directory etc. from invocation buffer
+     ,@forms
+     (unless (process-filter ediprolog-process)
+       (set-process-filter ediprolog-process 'ediprolog-wait-for-prompt-filter))
+     (while (not ediprolog-seen-prompt)
+       ;; Wait for output/sentinel and update consult window, if any.
+       ;; As `accept-process-output' does not run the sentinel in
+       ;; Emacs <= 23.1, we use `sit-for' to do both. However,
+       ;; `sit-for' returns immediately if keyboard input is
+       ;; available, so we must discard input.
+       (discard-input)
+       (sit-for 0.1))))
+
+(defmacro ediprolog-remember-interruption (form)
+  "Set `ediprolog-interrupted' if evaluation of FORM was interrupted."
+  `(condition-case nil
+       ,form
+     (quit (setq ediprolog-interrupted t))))
+
+;; Only the sentinel can reliably detect if no more output follows -
+;; even if process-status is 'exit, further output can still follow.
+(defun ediprolog-sentinel (proc str)
+  (when (buffer-live-p (process-buffer proc))
+    (with-current-buffer (process-buffer proc)
+      (let ((status (with-temp-buffer
+                      (insert str)
+                      (while (search-backward "\n" nil t)
+                        (replace-match ""))
+                      (buffer-string))))
+        (ediprolog-log
+         (format "%s: %s.\n"
+                 (substring (current-time-string) 4 -5) status) "green" t))
+      (when (string-match "^\\(?:finished\n\\|exited abnormally\\|killed\n\\)"
+                          str)
+        (setq ediprolog-seen-prompt t)))))
+
+(defun ediprolog-ensure-buffer (name)
+  (let ((str (format "*ediprolog-%s*" name))
+        (var (intern (format "ediprolog-%s-buffer" name))))
+    (unless (buffer-live-p (symbol-value var))
+      (set var (generate-new-buffer str))
+      (with-current-buffer (symbol-value var)
+        (buffer-disable-undo)
+        (setq buffer-read-only t)))))
+
+(defun ediprolog-log (str &optional col nl)
+  (ediprolog-ensure-buffer "history")
+  (with-current-buffer ediprolog-history-buffer
+    (let (buffer-read-only)
+      (goto-char (point-max))
+      (let ((s (format "%s%s" (if (and nl (not (bolp))) "\n" "") str)))
+        (insert (if col (propertize s 'face `(:background ,col)) s)))
+      (let ((size (- (point-max) (point-min))))
+        (when (and ediprolog-max-history
+                   (> size ediprolog-max-history))
+          ;; delete older half of the (possibly narrowed) history
+          (delete-region (point-min) (+ (point-min) (/ size 2))))))))
+
+(defun ediprolog-run-prolog ()
+  "Start a Prolog process."
+  (let ((args (cons ediprolog-program ediprolog-program-switches)))
+    (ediprolog-log (format "%s: starting: %S\n"
+                           (substring (current-time-string) 4 -5) args)
+                   "green" t)
+    (condition-case nil
+        (ediprolog-wait-for-prompt-after
+         (setq ediprolog-process
+               (apply #'start-process "ediprolog" (current-buffer) args))
+         (set-process-sentinel ediprolog-process 'ediprolog-sentinel)
+         (ediprolog-send-string
+          (format "'$set_prompt'('%s').\n" ediprolog-prompt)))
+      ((error quit)
+       (ediprolog-log "No prompt found." "red" t)
+       (error "No prompt from: %s" ediprolog-program)))))
+
+(defun ediprolog-kill-prolog ()
+  "Kill the Prolog process and run the process sentinel."
+  (when (ediprolog-running)
+    (delete-process ediprolog-process)))
+
+(defun ediprolog-show-consult-output (str)
+  (with-current-buffer (get-buffer-create ediprolog-consult-buffer)
+    (setq buffer-read-only t)
+    (let (buffer-read-only)
+      (erase-buffer)
+      (insert str)
+      (goto-char (point-min))
+      ;; remove normal consult status lines, which start with "%" 
+      (while (re-search-forward "^[\t ]*%.*\n" nil t)
+        (delete-region (match-beginning 0) (match-end 0))))
+    (setq str (buffer-string)))
+  ;; show consult output in a separate window unless it is a prefix of
+  ;; success (i.e., consulted without errors), or still an incomplete
+  ;; line that starts with a comment character
+  (unless (or (string-match "^[\t ]*\\(?:%.*\\)?\\'" str)
+              (let ((success "true."))
+                (and (<= (length str) (length success))
+                     (string= str (substring success 0 (length str))))))
+    (setq ediprolog-consult-window (display-buffer ediprolog-consult-buffer))
+    (set-window-dedicated-p ediprolog-consult-window t)
+    (fit-window-to-buffer ediprolog-consult-window (/ (frame-height) 2))))
+
+(defun ediprolog-consult-filter (proc str)
+  "Filter used when consulting a file, showing consult output."
+  (with-current-buffer (ediprolog-temp-buffer proc)
+    (goto-char (point-max))
+    (let (buffer-read-only)
+      (insert str))
+    (with-current-buffer (process-buffer proc)
+      (ediprolog-log str))
+    (when (re-search-backward
+           (format "^%s" (regexp-quote ediprolog-prompt)) nil t)
+      (with-current-buffer (process-buffer proc)
+        (setq ediprolog-seen-prompt t)))
+    (skip-chars-backward "\n")
+    (ediprolog-show-consult-output (buffer-substring (point-min) (point)))))
+
+(defun ediprolog-wait-for-prompt-filter (proc str)
+  "Filter that only waits until prompt appears."
+  (with-current-buffer (ediprolog-temp-buffer proc)
+    (goto-char (point-max))
+    (let (buffer-read-only)
+      (insert str))
+    (with-current-buffer (process-buffer proc)
+      (ediprolog-log str))
+    (when (re-search-backward
+           (format "^%s" (regexp-quote ediprolog-prompt)) nil t)
+      (with-current-buffer (process-buffer proc)
+        (setq ediprolog-seen-prompt t)))))
+
+\f
+;;;###autoload
+(defun ediprolog-dwim (&optional arg)
+  "Load current buffer into Prolog or post query (Do What I Mean).
+If invoked on a line starting with `:-' or `?-', possibly
+preceded by `%' and whitespace, call `ediprolog-interact' with
+the query as argument. Otherwise, call `ediprolog-consult'.
+
+With prefix argument 0, kill the Prolog process. With prefix 1,
+equivalent to `ediprolog-consult'. With prefix 2, equivalent to
+`ediprolog-consult' with a new Prolog process. With prefix 7,
+equivalent to `ediprolog-toplevel'. With just C-u, first call
+`ediprolog-consult' and then, if point is on a query, call
+`ediprolog-interact' with it as argument. Analogously, C-u C-u
+for `ediprolog-consult' with a new process. With other prefix
+arguments, equivalent to `ediprolog-remove-interactions'."
+  (interactive "P")
+  (cond ((eq arg 0)
+         (unless (ediprolog-running)
+           (error "No Prolog process running"))
+         (ediprolog-kill-prolog)
+         (message "Prolog process killed."))
+        ((eq arg 1) (ediprolog-consult))
+        ((eq arg 2) (ediprolog-consult t))
+        ((eq arg 7)
+         (unless (ediprolog-more-solutions)
+           (error "No query in progress"))
+         (ediprolog-toplevel))
+        ((equal arg '(4)) (ediprolog-consult) (ediprolog-query))
+        ((equal arg '(16)) (ediprolog-consult t) (ediprolog-query))
+        ((null arg) (unless (ediprolog-query) (ediprolog-consult)))
+        (t (ediprolog-remove-interactions))))
+
+(defun ediprolog-process-ready ()
+  "Error if the previous query is still in progress."
+  (when (and ediprolog-interrupted
+             (ediprolog-running)
+             (ediprolog-more-solutions))
+    (error "Previous query still in progress, see `ediprolog-toplevel'"))
+  (setq ediprolog-interrupted nil))
+
+(defun ediprolog-query ()
+  "If point is on a query, send it to the process and start interaction."
+  (ediprolog-process-ready)
+  (when (and (not (and transient-mark-mode mark-active))
+             (save-excursion
+               (beginning-of-line)
+               (looking-at "\\([\t ]*\\)%*[\t ]*[:?]-")))
+    ;; whitespace preceding the query is the indentation level
+    (setq ediprolog-indent-prefix (match-string 1))
+    (let* ((from (goto-char (match-end 0)))
+           (to (if (re-search-forward "\\.[\t ]*\\(?:%.*\\)?$" nil t)
+                   ;; omit trailing whitespace
+                   (+ (point) (skip-chars-backward "\t "))
+                 (error "Missing `.' at the end of this query")))
+           (query (buffer-substring-no-properties from to)))
+      (end-of-line)
+      (insert "\n" ediprolog-indent-prefix ediprolog-prefix)
+      (ediprolog-interact
+       (format "%s\n" (mapconcat #'identity
+                                 ;; `%' can precede each query line
+                                 (split-string query "\n[ \t%]*") " "))))
+    t))
+
+;;;###autoload
+(defun ediprolog-interact (query)
+  "Send QUERY to Prolog process and interact as on a terminal.
+
+You can use \\[keyboard-quit] to unblock Emacs in the case of
+longer-running queries. When the query completes and the toplevel
+asks for input, use \\[ediprolog-toplevel] to resume interaction
+with the Prolog process."
+  (unless (ediprolog-running)
+    (ediprolog-run-prolog))
+  (set-marker (process-mark ediprolog-process) (point))
+  (set-process-buffer ediprolog-process (current-buffer))
+  (set-process-filter ediprolog-process 'ediprolog-interact-filter)
+  (ediprolog-ensure-buffer "temp")
+  (with-current-buffer ediprolog-temp-buffer
+    (let (buffer-read-only)
+      (erase-buffer)))
+  (setq ediprolog-seen-prompt nil
+        ediprolog-read-term nil)
+  (ediprolog-send-string query)
+  (ediprolog-toplevel))
+
+(defun ediprolog-send-string (str)
+  "Send string to Prolog process and log it."
+  (ediprolog-log str "cyan")
+  (process-send-string ediprolog-process str))
+
+(defun ediprolog-toplevel ()
+  "Start or resume Prolog toplevel interaction in the buffer.
+
+You can use this function if you have previously quit (with
+\\[keyboard-quit]) waiting for a longer-running query and now
+want to resume interaction with the toplevel."
+  (interactive)
+  (when ediprolog-process
+    (select-window (display-buffer (process-buffer ediprolog-process))))
+  (ediprolog-remember-interruption
+   (while (ediprolog-more-solutions)
+     (let (str
+           char)
+       ;; poll for user input; meanwhile, process output can arrive
+       (while (and (ediprolog-more-solutions) (null str))
+         (goto-char (process-mark ediprolog-process))
+         (if ediprolog-read-term
+             (progn
+               (setq str (concat (read-string "Input: ") "\n"))
+               (ediprolog-insert-at-marker
+                str ediprolog-indent-prefix ediprolog-prefix)
+               (setq ediprolog-read-term nil))
+           (condition-case nil
+               (when (setq char (if (>= emacs-major-version 22)
+                                    (read-char nil nil 0.1)
+                                  (with-timeout (0.1 nil)
+                                    (read-char))))
+                 ;; char-to-string might still yield an error (C-0 etc.)
+                 (setq str (char-to-string char)))
+             (error
+              (message "Non-character key")
+              ;; non-character keys must not remain in the input
+              ;; buffer, lest `read-char' return immediately
+              (discard-input)))))
+       (when (ediprolog-more-solutions)
+         (if (eq char ?\C-c)            ; char can be nil too
+             ;; sending C-c directly yields strange SWI buffering
+             (interrupt-process ediprolog-process)
+           (ediprolog-send-string str)))))))
+
+;;;###autoload
+(defun ediprolog-remove-interactions ()
+  "Remove all lines starting with `ediprolog-prefix' from buffer.
+
+In transient mark mode, the function operates on the region if it
+is active."
+  (interactive)
+  (save-excursion
+    (save-restriction
+      (when (and transient-mark-mode mark-active)
+        (narrow-to-region (region-beginning) (region-end)))
+      (goto-char (point-min))
+      (flush-lines (concat "^[\t ]*" (regexp-quote ediprolog-prefix)))))
+  (message "Interactions removed."))
+
+\f
+;;;###autoload
+(defun ediprolog-consult (&optional new-process)
+  "Buffer is loaded into a Prolog process. If NEW-PROCESS is
+non-nil, start a new process. Otherwise use the existing process,
+if any. In case of errors, point is moved to the position of the
+first error, and the mark is left at the previous position.
+
+In transient mark mode, the function operates on the region if it
+is active."
+  (interactive)
+  (when (string= (buffer-name) ediprolog-consult-buffer)
+    (error "Cannot consult the consult buffer"))
+  (when (window-live-p ediprolog-consult-window)
+    (condition-case nil
+        ;; deleting the window can still raise an error, if the window
+        ;; was the only window in the frame and the consult buffer was
+        ;; killed (and it thus displays a different buffer now)
+        (delete-window ediprolog-consult-window)
+      (error nil)))
+  (when (buffer-live-p ediprolog-consult-buffer)
+    (bury-buffer ediprolog-consult-buffer))
+  (when new-process
+    (ediprolog-kill-prolog))
+  (unless (ediprolog-running)
+    (ediprolog-run-prolog))
+  (ediprolog-process-ready)
+  (set-process-buffer ediprolog-process (current-buffer))
+  (unless ediprolog-temp-file
+    (setq ediprolog-temp-file (make-temp-file "ediprolog")))
+  (let ((start (if (and transient-mark-mode mark-active)
+                   (region-beginning) (point-min)))
+        (end (if (and transient-mark-mode mark-active)
+                 (region-end) (point-max))))
+    (write-region start end ediprolog-temp-file nil 'silent))
+  (set-process-filter ediprolog-process 'ediprolog-consult-filter)
+  (ediprolog-remember-interruption
+   (ediprolog-wait-for-prompt-after
+    (ediprolog-send-string (format "['%s'].\n" ediprolog-temp-file))))
+  (message "%s consulted." (if (and transient-mark-mode mark-active)
+                               "Region" "Buffer"))
+  ;; go to line of the first error, if any
+  (let ((line (with-current-buffer ediprolog-temp-buffer
+                (when (save-excursion
+                        (goto-char (point-min))
+                        (re-search-forward "^ERROR.*?:\\([0-9]+\\)" nil t))
+                  (string-to-number (match-string 1))))))
+    (when line
+      (if (and transient-mark-mode mark-active)
+          (when (fboundp 'line-number-at-pos)
+            (goto-line (+ (line-number-at-pos (region-beginning)) line -1)))
+        (goto-line line)))))
+
+(defun ediprolog-running ()
+  "True iff `ediprolog-process' is a running process."
+  (and (processp ediprolog-process)
+       (eq (process-status ediprolog-process) 'run)))
+
+(defun ediprolog-more-solutions ()
+  "True iff there could be more solutions from the process."
+  (not ediprolog-seen-prompt))
+
+(defun ediprolog-interact-filter (proc string)
+  "Insert output from the process and update the state."
+  (when (and (buffer-live-p (ediprolog-temp-buffer proc))
+             (buffer-live-p (process-buffer proc)))
+    (let (str)
+      (with-current-buffer (ediprolog-temp-buffer proc)
+        (goto-char (point-max))
+        (let (buffer-read-only)
+          (insert string))
+        (with-current-buffer (process-buffer proc)
+          (ediprolog-log string))
+        ;; read a term from the user?
+        (when (re-search-backward "^|: $" nil t)
+          (with-current-buffer (process-buffer proc)
+            (setq ediprolog-read-term t))
+          (setq str (buffer-string))
+          (let (buffer-read-only)
+            (erase-buffer)))
+        ;; check for prompt
+        (goto-char (point-max))
+        (when (re-search-backward
+               (format "^%s" (regexp-quote ediprolog-prompt)) nil t)
+          (with-current-buffer (process-buffer proc)
+            (setq ediprolog-seen-prompt t))
+          ;; ignore further output due to accidental user input (C-j,
+          ;; C-m, etc.) while the query was running
+          (set-process-filter proc 'ediprolog-ignore-filter)
+          (skip-chars-backward "\n")
+          (setq str (buffer-substring (point-min) (point))))
+        (unless str
+          (goto-char (point-max))
+          ;; delay final line if it can still be completed to prompt
+          (let ((l (buffer-substring (line-beginning-position) (point))))
+            (when (and (<= (length l) (length ediprolog-prompt))
+                       (string= l (substring ediprolog-prompt 0 (length l))))
+              (goto-char (line-beginning-position))))
+          ;; delay emitting newlines until we are sure no prompt
+          ;; follows; one or two newlines can precede a prompt
+          (let ((d (abs (skip-chars-backward "\n"))))
+            (when (> d 2)
+              (forward-char (- d 2))))
+          (setq str (buffer-substring (point-min) (point)))
+          (let (buffer-read-only)
+            (delete-region (point-min) (point))))
+        (when str
+          (with-temp-buffer
+            ;; precede each line with ediprolog prefices
+            (insert str)
+            (goto-char (point-min))
+            (while (search-forward "\n" nil t)
+              (replace-match
+               (format "\n%s%s" (with-current-buffer (process-buffer proc)
+                                  ediprolog-indent-prefix) ediprolog-prefix)))
+            (setq str (buffer-string)))
+          (with-current-buffer (process-buffer proc)
+            (let ((near (<= (abs (- (point) (process-mark proc))) 1)))
+              (ediprolog-insert-at-marker str)
+              (when near
+                ;; catch up with output if point was reasonably close
+                (goto-char (process-mark proc))))))))))
+
+
+(defun ediprolog-insert-at-marker (&rest args)
+  "Insert strings ARGS at marker and update the marker."
+  (save-excursion
+    (goto-char (process-mark ediprolog-process))
+    (end-of-line)
+    (apply #'insert args)
+    (set-marker (process-mark ediprolog-process) (point))))
+
+(defun ediprolog-ignore-filter (proc str)
+  "Log and then ignore all process output."
+  (with-current-buffer (process-buffer proc)
+    (ediprolog-log str "gray")))
+
+(defun ediprolog-temp-buffer (proc)
+  (with-current-buffer (process-buffer proc)
+    ;; temp buffer can be buffer local
+    ediprolog-temp-buffer))
+
+(defun ediprolog-map-variables (func)
+  "Call FUNC with all ediprolog variables that can become buffer-local."
+  (mapc func '(ediprolog-process
+               ediprolog-program
+               ediprolog-program-switches
+               ediprolog-temp-buffer
+               ediprolog-history-buffer
+               ediprolog-seen-prompt
+               ediprolog-interrupted
+               ediprolog-read-term
+               ediprolog-indent-prefix
+               ediprolog-temp-file)))
+
+;;;###autoload
+(defun ediprolog-localize ()
+  "After `ediprolog-localize', any Prolog process started from
+this buffer becomes buffer-local."
+  (interactive)
+  (unless (local-variable-p 'ediprolog-process)
+    (ediprolog-map-variables #'make-local-variable)
+    (setq ediprolog-temp-file nil
+          ediprolog-process nil
+          ediprolog-history-buffer nil
+          ediprolog-temp-buffer nil)))
+
+(defun ediprolog-unlocalize ()
+  "Revert the effect of `ediprolog-localize'."
+  (interactive)
+  (when (local-variable-p 'ediprolog-process)
+    (ediprolog-kill-prolog)
+    (ediprolog-map-variables #'kill-local-variable)))
+
+(provide 'ediprolog)
+
+;;; ediprolog.el ends here
diff --git a/packages/eldoc-eval/README.md b/packages/eldoc-eval/README.md
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/packages/eldoc-eval/eldoc-eval.el b/packages/eldoc-eval/eldoc-eval.el
new file mode 100644 (file)
index 0000000..c4d8580
--- /dev/null
@@ -0,0 +1,212 @@
+;;; eldoc-eval.el --- Enable eldoc support when minibuffer is in use.
+
+;; Copyright (C) 2011, 2012, 2013 Free Software Foundation, Inc.
+
+;; Author: Thierry Volpiatto <thierry.volpiatto@gmail.com>
+;; Version: 0.1
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;
+;; This package enables eldoc support when minibuffer is in use.
+;;
+;; Eldoc info is shown by default in mode-line,
+;; but you can have eldoc info somewhere else by setting
+;; `eldoc-in-minibuffer-show-fn' to another function (e.g `tooltip-show').
+;;
+;; By default with this package `M-:' will use `pp-eval-expression'
+;; instead of `eval-expression'; you can change that by setting
+;; `eval-preferred-function'.
+;;
+;; It also provides a convenient macro to enable eldoc support
+;; in your own functions using minibuffer or in your defadvices,
+;; that is `with-eldoc-in-minibuffer'.
+;;
+;; Users of own minibuffer frame will have to set
+;; `eldoc-in-minibuffer-own-frame-p' to non-nil.
+;;
+;; You can turn off eldoc support in minibuffer any time
+;; by setting `eldoc-in-minibuffer' to nil.
+
+;;; Code:
+(require 'eldoc)
+
+;; FIXME: This has no autoloads and (require 'eldoc-eval) will change Emacs's
+;; behavior, against usual conventions.  The fix is to define
+;; eldoc-in-minibuffer as a (global) minor mode, then autoload it.  So the
+;; default value will be nil, and the user can enable it with
+;; (eldoc-in-minibuffer 1) or by customizing eldoc-in-minibuffer, rather than
+;; by adding (require 'eldoc-eval) in her .emacs.
+
+;;; Minibuffer support.
+;;  Enable displaying eldoc info in something else
+;;  Than minibuffer when this one is in use.
+;;
+(defcustom eldoc-in-minibuffer t
+  "Turn on eldoc in minibuffer."
+  :group 'eldoc
+  :type 'bolean)
+
+(defcustom eldoc-in-minibuffer-show-fn 'eldoc-show-in-mode-line
+  "A function to display eldoc info.
+Should take one arg: the string to display"
+  :group 'eldoc
+  :type 'function)
+
+(defcustom eldoc-show-in-mode-line-delay 12
+  "The time we show eldoc when Emacs is idle."
+  :group 'eldoc
+  :type 'number)
+
+(defcustom eval-preferred-function 'pp-eval-expression
+  "Preferred function to use with `M-:'."
+  :group 'lisp
+  :type 'function)
+
+(defcustom  eldoc-in-minibuffer-own-frame-p nil
+  "Whether minibuffer has its own frame or not."
+  :group 'lisp
+  :type 'boolean)
+
+;;; Compatibility with Emacs-24.4
+;; New implementation of eldoc in minibuffer that come
+;; with Emacs-24.4 show the eldoc info of current-buffer while
+;; minibuffer is in use, disable this and inline old Emacs behavior.
+
+(when (boundp 'eldoc-message-function)
+  (setq eldoc-message-function 'message)
+
+  (defadvice eldoc-display-message-no-interference-p
+      (around eldoc-eval activate)
+    (if (not eldoc-in-minibuffer)
+        ad-do-it
+      (and eldoc-mode
+           (not executing-kbd-macro)
+           (not (and (boundp 'edebug-active) edebug-active))
+           ;; Having this mode operate in an active minibuffer/echo area causes
+           ;; interference with what's going on there.
+           (not cursor-in-echo-area)
+           (not (eq (selected-window) (minibuffer-window)))))))
+
+;; Internal.
+(defvar eldoc-active-minibuffers-list nil
+  "List of active minibuffers with eldoc enabled.")
+(defvar eldoc-mode-line-rolling-flag nil)
+
+(defun eldoc-store-minibuffer ()
+  "Store minibuffer buffer name in `eldoc-active-minibuffers-list'.
+This function is called by each minibuffer started with eldoc support.
+See `with-eldoc-in-minibuffer'."
+  (with-selected-window (minibuffer-window)
+    (push (current-buffer) eldoc-active-minibuffers-list)))
+
+(defmacro with-eldoc-in-minibuffer (&rest body)
+  "Enable eldoc support for minibuffer input that runs in BODY."
+  (declare (indent 0) (debug t))
+  `(let ((timer (and eldoc-in-minibuffer
+                     (run-with-idle-timer
+                      eldoc-idle-delay
+                      'repeat 'eldoc-mode-in-minibuffer))))
+     (unwind-protect
+         (minibuffer-with-setup-hook
+             ;; When minibuffer is activated in body,
+             ;; store it.
+             'eldoc-store-minibuffer
+           ,@body)
+       (and timer (cancel-timer timer))
+       ;; Each time a minibuffer exits or aborts
+       ;; its buffer is removed from stack,
+       ;; assuming we can only exit the active minibuffer
+       ;; on top of stack.
+       (setq eldoc-active-minibuffers-list
+             (cdr eldoc-active-minibuffers-list)))))
+
+(defun eldoc-current-buffer ()
+  "Return the current buffer prior to activating the minibuffer."
+  (with-selected-frame (last-nonminibuffer-frame)
+    (window-buffer
+     (cond (eldoc-in-minibuffer-own-frame-p
+            (selected-window))
+           ((fboundp 'window-in-direction)
+            (window-in-direction
+             'above (minibuffer-window)))
+           (t (minibuffer-selected-window))))))
+
+(defun eldoc-show-in-mode-line (str)
+  "Display string STR in the mode-line next to minibuffer."
+  (let (mode-line-in-non-selected-windows)
+    (with-current-buffer (eldoc-current-buffer)
+      (make-local-variable 'mode-line-format)
+      (let ((mode-line-format (concat " " str)))
+        (eldoc-maybe-roll-message-in-mode-line mode-line-format))
+      (force-mode-line-update))))
+
+(defun eldoc-maybe-roll-message-in-mode-line (str)
+  (let* ((max (window-width (get-buffer-window (eldoc-current-buffer))))
+         (len (length str))
+         (tmp-str str))
+    (if (and (> len max) eldoc-mode-line-rolling-flag)
+        (while (sit-for 0.3)
+           (setq tmp-str (substring tmp-str 2)
+                 mode-line-format (concat tmp-str " [<]" str))
+           (force-mode-line-update nil)
+           (when (< (length tmp-str) 2) (setq tmp-str str)))
+        (force-mode-line-update nil)
+        (sit-for eldoc-show-in-mode-line-delay))))
+
+(defun eldoc-mode-line-toggle-rolling ()
+  (interactive)
+  (setq eldoc-mode-line-rolling-flag (not eldoc-mode-line-rolling-flag)))
+(define-key minibuffer-local-map (kbd "<C-M-right>") 'eldoc-mode-line-toggle-rolling)
+
+(defun eldoc-mode-in-minibuffer ()
+  "Show eldoc for current minibuffer input."
+  (let ((buf (window-buffer (active-minibuffer-window))))
+    ;; If this minibuffer have been started with
+    ;;`with-eldoc-in-minibuffer' give it eldoc support
+    ;; and update mode-line, otherwise do nothing.
+    (condition-case err
+        (when (member buf eldoc-active-minibuffers-list)
+          (with-current-buffer buf
+            (let* ((sym (save-excursion
+                          (unless (looking-back ")\\|\"")
+                            (forward-char -1))
+                          (eldoc-current-symbol)))
+                   (info-fn (eldoc-fnsym-in-current-sexp))
+                   (doc     (or (eldoc-get-var-docstring sym)
+                                (eldoc-get-fnsym-args-string
+                                 (car info-fn) (cadr info-fn)))))
+              (when doc (funcall eldoc-in-minibuffer-show-fn doc)))))
+      (scan-error nil)
+      (beginning-of-buffer nil)
+      (error (message "Eldoc in minibuffer error: %S" err)))))
+
+(defun eval-expression-with-eldoc ()
+  "Eval expression with eldoc support in mode-line."
+  (interactive)
+  (with-eldoc-in-minibuffer
+    (call-interactively eval-preferred-function)))
+
+;; Bind it to `M-:'.
+
+;; FIXME: Turn eldoc-in-minibuffer into a global minor mode, and place this
+;; binding in its keymap.
+(global-set-key [remap eval-expression] 'eval-expression-with-eldoc)
+
+
+(provide 'eldoc-eval)
+;;; eldoc-eval.el ends here
diff --git a/packages/elpa.rss b/packages/elpa.rss
new file mode 100644 (file)
index 0000000..7c54fd7
--- /dev/null
@@ -0,0 +1,50 @@
+<rss version="2.0">
+  <channel>
+    <title>ELPA News</title>
+    <link>http://elpa.gnu.org/packages/</link>
+    <language>en</language>
+    <description>News for the Emacs Lisp Package Archive</description>
+<item>
+<title>markchars version 0.2.0</title>
+<link>http://elpa.gnu.org/packages/news.html</link>
+<description>Mark suspicious characters, e.g. mixed scripts in a word.</description>
+<pubDate>Mon, 25 April 2011 20:10:00 -0500</pubDate>
+</item>
+<item>
+<title>epoch-view version 0.0.1</title>
+<link>http://elpa.gnu.org/packages/news.html</link>
+<description>View Unix epoch timestamps as dates</description>
+<pubDate>Mon, 25 April 2011 20:10:00 -0500</pubDate>
+</item>
+<item>
+<title>load-dir version 0.0.2</title>
+<link>http://elpa.gnu.org/packages/news.html</link>
+<description>Modularize your .emacs: autoload Lisp snippets</description>
+<pubDate>Sat, 26 March 2011 06:10:00 -0500</pubDate>
+</item>
+<item>
+<title>auctex.tar version 11.86</title>
+<link>http://elpa.gnu.org/packages/news.html</link>
+<description>integrated environment for *TeX*</description>
+<pubDate>Wed, 20 October 2010 16:32:11 -0400</pubDate>
+</item>
+<item>
+<title>muse.tar version 3.20</title>
+<link>http://elpa.gnu.org/packages/news.html</link>
+<description>Authoring and publishing tool</description>
+<pubDate>Thu, 26 August 2010 14:14:46 -0400</pubDate>
+</item>
+<item>
+<title>company.tar version 0.5</title>
+<link>http://elpa.gnu.org/packages/news.html</link>
+<description>Flexible inline text and code completion</description>
+<pubDate>Wed, 25 August 2010 21:30:45 -0400</pubDate>
+</item>
+<item>
+<title>company.tar version 0.5</title>
+<link>http://elpa.gnu.org/packages/news.html</link>
+<description>Flexible inline text and code completion</description>
+<pubDate>Sat, 31 July 2010 20:57:40 -0400</pubDate>
+</item>
+  </channel>
+</rss>
diff --git a/packages/enwc/COPYING b/packages/enwc/COPYING
new file mode 100644 (file)
index 0000000..94a9ed0
--- /dev/null
@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    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 <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/packages/enwc/doc/connman.txt b/packages/enwc/doc/connman.txt
new file mode 100644 (file)
index 0000000..dafbe38
--- /dev/null
@@ -0,0 +1,7 @@
+net.connman.Manager.GetTechnologies():
+
+(("/net/connman/technology/ethernet" (("Name" ("Wired")) ("Type" ("ethernet")) ("Powered" (t)) ("Connected" (nil)) ("Tethering" (nil)))) ("/net/connman/technology/wifi" (("Name" ("WiFi")) ("Type" ("wifi")) ("Powered" (t)) ("Connected" (nil)) ("Tethering" (nil)))))
+
+net.connman.Manager.GetServices():
+
+(("/net/connman/service/wifi_0026b6e6518e_7270695f3830322e3178_managed_wep" (("Type" ("wifi")) ("Security" (("wep"))) ("State" ("idle")) ("Strength" (79)) ("Favorite" (nil)) ("Immutable" (nil)) ("AutoConnect" (nil)) ("Name" ("rpi_802.1x")) ("Ethernet" ((("Method" ("auto")) ("Interface" ("wlan0")) ("Address" ("00:26:B6:E6:51:8E")) ("MTU" (1500))))) ("IPv4" (nil)) ("IPv4.Configuration" ((("Method" ("dhcp"))))) ("IPv6" (nil)) ("IPv6.Configuration" ((("Method" ("auto")) ("Privacy" ("disabled"))))) ("Nameservers" (nil)) ("Nameservers.Configuration" (nil)) ("Timeservers" (nil)) ("Timeservers.Configuration" (nil)) ("Domains" (nil)) ("Domains.Configuration" (nil)) ("Proxy" (nil)) ("Proxy.Configuration" (nil)) ("Provider" (nil)))) ("/net/connman/service/wifi_0026b6e6518e_hidden_managed_none" (("Type" ("wifi")) ("Security" (("none"))) ("State" ("idle")) ("Strength" (79)) ("Favorite" (nil)) ("Immutable" (nil)) ("AutoConnect" (nil)) ("Ethernet" ((("Method" ("auto")) ("Interface" ("wlan0")) ("Address" ("00:26:B6:E6:51:8E")) ("MTU" (1500))))) ("IPv4" (nil)) ("IPv4.Configuration" ((("Method" ("dhcp"))))) ("IPv6" (nil)) ("IPv6.Configuration" ((("Method" ("auto")) ("Privacy" ("disabled"))))) ("Nameservers" (nil)) ("Nameservers.Configuration" (nil)) ("Timeservers" (nil)) ("Timeservers.Configuration" (nil)) ("Domains" (nil)) ("Domains.Configuration" (nil)) ("Proxy" (nil)) ("Proxy.Configuration" (nil)) ("Provider" (nil)))) ("/net/connman/service/wifi_0026b6e6518e_7270695f77706132_managed_ieee8021x" (("Type" ("wifi")) ("Security" (("ieee8021x"))) ("State" ("idle")) ("Strength" (74)) ("Favorite" (nil)) ("Immutable" (nil)) ("AutoConnect" (nil)) ("Name" ("rpi_wpa2")) ("Ethernet" ((("Method" ("auto")) ("Interface" ("wlan0")) ("Address" ("00:26:B6:E6:51:8E")) ("MTU" (1500))))) ("IPv4" (nil)) ("IPv4.Configuration" ((("Method" ("dhcp"))))) ("IPv6" (nil)) ("IPv6.Configuration" ((("Method" ("auto")) ("Privacy" ("disabled"))))) ("Nameservers" (nil)) ("Nameservers.Configuration" (nil)) ("Timeservers" (nil)) ("Timeservers.Configuration" (nil)) ("Domains" (nil)) ("Domains.Configuration" (nil)) ("Proxy" (nil)) ("Proxy.Configuration" (nil)) ("Provider" (nil)))))
diff --git a/packages/enwc/doc/enwc.texi b/packages/enwc/doc/enwc.texi
new file mode 100644 (file)
index 0000000..cc1a40f
--- /dev/null
@@ -0,0 +1,78 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename enwc.info
+@settitle ENWC Manual
+@c %**end of header
+
+@include version.texi
+@include fdl.texi
+
+@dircategory Emacs
+@direntry
+* ENWC: (enwc).         The Emacs Network Client.
+@end direntry
+
+@copying
+This manual is for ENWC, the Emacs Network Client.
+
+Copyright (C) 2012 Ian Dunn
+
+@quotation
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
+Texts.  A copy of the license is included in the section entitled
+``GNU Free Documentation License''.
+@end quotation
+@end copying
+
+@titlepage
+@title  ENWC
+@subtitle Edition @value{EDITION}, for @code{enwc} version @value{VERSION}
+@subtitle @value{UPDATED}
+@author by Ian Dunn
+
+@page
+@vskip 0pt plus 1filll
+@insertcopying{}
+@end titlepage
+
+@contents
+
+@ifnottex
+@node Top
+@top ENWC
+
+@insertcopying
+
+This manual is for ENWC, the Emacs Network Client.
+
+This is edition @value{EDITION}, for @code{enwc} version @value{VERSION}
+@end ifnottex
+
+@menu
+* Introduction::        Overview of ENWC.
+* Setup::               Getting ready to use ENWC.
+* Configuration::       All of the configuration options.
+* Commands::            The commands that ENWC uses.
+@end menu
+
+@node Introduction
+@chapter Introduction
+
+ENWC is the Emacs Network Client.  It uses several backends to allow the user to control network connections through GNU Emacs, while still allowing control to remain with the actual network manager.  ENWC makes uses of the D-Bus interfaces provided by these network managers.
+
+@node Setup
+@chapter Setup
+
+First, the path to ENWC must be added to the @var{load-path} variable.  Then, in the @file{.emacs} file, the following must be added:
+
+@lisp
+(require 'enwc-setup)
+(enwc-setup)
+@end lisp
+
+Now, simply press @kbd{M+x}, and type @kbd{ENWC}, and press @kbd{RET}.  ENWC will begin scanning for networks on the wireless interface, and display them in its buffer.
+
+@bye
diff --git a/packages/enwc/doc/fdl.texi b/packages/enwc/doc/fdl.texi
new file mode 100644 (file)
index 0000000..cb71f05
--- /dev/null
@@ -0,0 +1,505 @@
+@c The GNU Free Documentation License.
+@center Version 1.3, 3 November 2008
+
+@c This file is intended to be included within another document,
+@c hence no sectioning command or @node.
+
+@display
+Copyright @copyright{} 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
+@uref{http://fsf.org/}
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+@end display
+
+@enumerate 0
+@item
+PREAMBLE
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document @dfn{free} in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+
+This License is a kind of ``copyleft'', which means that derivative
+works of the document must themselves be free in the same sense.  It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does.  But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book.  We recommend this License
+principally for works whose purpose is instruction or reference.
+
+@item
+APPLICABILITY AND DEFINITIONS
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License.  Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein.  The ``Document'', below,
+refers to any such manual or work.  Any member of the public is a
+licensee, and is addressed as ``you''.  You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+
+A ``Modified Version'' of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A ``Secondary Section'' is a named appendix or a front-matter section
+of the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall
+subject (or to related matters) and contains nothing that could fall
+directly within that overall subject.  (Thus, if the Document is in
+part a textbook of mathematics, a Secondary Section may not explain
+any mathematics.)  The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+
+The ``Invariant Sections'' are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License.  If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant.  The Document may contain zero
+Invariant Sections.  If the Document does not identify any Invariant
+Sections then there are none.
+
+The ``Cover Texts'' are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License.  A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+
+A ``Transparent'' copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters.  A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text.  A copy that is not ``Transparent'' is called ``Opaque''.
+
+Examples of suitable formats for Transparent copies include plain
+ASCII without markup, Texinfo input format, La@TeX{} input
+format, SGML or XML using a publicly available
+DTD, and standard-conforming simple HTML,
+PostScript or PDF designed for human modification.  Examples
+of transparent image formats include PNG, XCF and
+JPG.  Opaque formats include proprietary formats that can be
+read and edited only by proprietary word processors, SGML or
+XML for which the DTD and/or processing tools are
+not generally available, and the machine-generated HTML,
+PostScript or PDF produced by some word processors for
+output purposes only.
+
+The ``Title Page'' means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page.  For works in
+formats which do not have any title page as such, ``Title Page'' means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+
+The ``publisher'' means any person or entity that distributes copies
+of the Document to the public.
+
+A section ``Entitled XYZ'' means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language.  (Here XYZ stands for a
+specific section name mentioned below, such as ``Acknowledgements'',
+``Dedications'', ``Endorsements'', or ``History''.)  To ``Preserve the Title''
+of such a section when you modify the Document means that it remains a
+section ``Entitled XYZ'' according to this definition.
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document.  These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+
+@item
+VERBATIM COPYING
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License.  You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute.  However, you may accept
+compensation in exchange for copies.  If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+
+@item
+COPYING IN QUANTITY
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover.  Both covers must also clearly and legibly identify
+you as the publisher of these copies.  The front cover must present
+the full title with all words of the title equally prominent and
+visible.  You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+
+@item
+MODIFICATIONS
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it.  In addition, you must do these things in the Modified Version:
+
+@enumerate A
+@item
+Use in the Title Page (and on the covers, if any) a title distinct
+from that of the Document, and from those of previous versions
+(which should, if there were any, be listed in the History section
+of the Document).  You may use the same title as a previous version
+if the original publisher of that version gives permission.
+
+@item
+List on the Title Page, as authors, one or more persons or entities
+responsible for authorship of the modifications in the Modified
+Version, together with at least five of the principal authors of the
+Document (all of its principal authors, if it has fewer than five),
+unless they release you from this requirement.
+
+@item
+State on the Title page the name of the publisher of the
+Modified Version, as the publisher.
+
+@item
+Preserve all the copyright notices of the Document.
+
+@item
+Add an appropriate copyright notice for your modifications
+adjacent to the other copyright notices.
+
+@item
+Include, immediately after the copyright notices, a license notice
+giving the public permission to use the Modified Version under the
+terms of this License, in the form shown in the Addendum below.
+
+@item
+Preserve in that license notice the full lists of Invariant Sections
+and required Cover Texts given in the Document's license notice.
+
+@item
+Include an unaltered copy of this License.
+
+@item
+Preserve the section Entitled ``History'', Preserve its Title, and add
+to it an item stating at least the title, year, new authors, and
+publisher of the Modified Version as given on the Title Page.  If
+there is no section Entitled ``History'' in the Document, create one
+stating the title, year, authors, and publisher of the Document as
+given on its Title Page, then add an item describing the Modified
+Version as stated in the previous sentence.
+
+@item
+Preserve the network location, if any, given in the Document for
+public access to a Transparent copy of the Document, and likewise
+the network locations given in the Document for previous versions
+it was based on.  These may be placed in the ``History'' section.
+You may omit a network location for a work that was published at
+least four years before the Document itself, or if the original
+publisher of the version it refers to gives permission.
+
+@item
+For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve
+the Title of the section, and preserve in the section all the
+substance and tone of each of the contributor acknowledgements and/or
+dedications given therein.
+
+@item
+Preserve all the Invariant Sections of the Document,
+unaltered in their text and in their titles.  Section numbers
+or the equivalent are not considered part of the section titles.
+
+@item
+Delete any section Entitled ``Endorsements''.  Such a section
+may not be included in the Modified Version.
+
+@item
+Do not retitle any existing section to be Entitled ``Endorsements'' or
+to conflict in title with any Invariant Section.
+
+@item
+Preserve any Warranty Disclaimers.
+@end enumerate
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant.  To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+
+You may add a section Entitled ``Endorsements'', provided it contains
+nothing but endorsements of your Modified Version by various
+parties---for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version.  Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity.  If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+
+@item
+COMBINING DOCUMENTS
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy.  If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections Entitled ``History''
+in the various original documents, forming one section Entitled
+``History''; likewise combine any sections Entitled ``Acknowledgements'',
+and any sections Entitled ``Dedications''.  You must delete all
+sections Entitled ``Endorsements.''
+
+@item
+COLLECTIONS OF DOCUMENTS
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+
+@item
+AGGREGATION WITH INDEPENDENT WORKS
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an ``aggregate'' if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+
+@item
+TRANSLATION
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections.  You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers.  In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+
+If a section in the Document is Entitled ``Acknowledgements'',
+``Dedications'', or ``History'', the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+
+@item
+TERMINATION
+
+You may not copy, modify, sublicense, or distribute the Document
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense, or distribute it is void, and
+will automatically terminate your rights under this License.
+
+However, if you cease all violation of this License, then your license
+from a particular copyright holder is reinstated (a) provisionally,
+unless and until the copyright holder explicitly and finally
+terminates your license, and (b) permanently, if the copyright holder
+fails to notify you of the violation by some reasonable means prior to
+60 days after the cessation.
+
+Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, receipt of a copy of some or all of the same material does
+not give you any rights to use it.
+
+@item
+FUTURE REVISIONS OF THIS LICENSE
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation License from time to time.  Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.  See
+@uref{http://www.gnu.org/copyleft/}.
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License ``or any later version'' applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation.  If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.  If the Document
+specifies that a proxy can decide which future versions of this
+License can be used, that proxy's public statement of acceptance of a
+version permanently authorizes you to choose that version for the
+Document.
+
+@item
+RELICENSING
+
+``Massive Multiauthor Collaboration Site'' (or ``MMC Site'') means any
+World Wide Web server that publishes copyrightable works and also
+provides prominent facilities for anybody to edit those works.  A
+public wiki that anybody can edit is an example of such a server.  A
+``Massive Multiauthor Collaboration'' (or ``MMC'') contained in the
+site means any set of copyrightable works thus published on the MMC
+site.
+
+``CC-BY-SA'' means the Creative Commons Attribution-Share Alike 3.0
+license published by Creative Commons Corporation, a not-for-profit
+corporation with a principal place of business in San Francisco,
+California, as well as future copyleft versions of that license
+published by that same organization.
+
+``Incorporate'' means to publish or republish a Document, in whole or
+in part, as part of another Document.
+
+An MMC is ``eligible for relicensing'' if it is licensed under this
+License, and if all works that were first published under this License
+somewhere other than this MMC, and subsequently incorporated in whole
+or in part into the MMC, (1) had no cover texts or invariant sections,
+and (2) were thus incorporated prior to November 1, 2008.
+
+The operator of an MMC Site may republish an MMC contained in the site
+under CC-BY-SA on the same site at any time before August 1, 2009,
+provided the MMC is eligible for relicensing.
+
+@end enumerate
+
+@page
+@heading ADDENDUM: How to use this License for your documents
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+
+@smallexample
+@group
+  Copyright (C)  @var{year}  @var{your name}.
+  Permission is granted to copy, distribute and/or modify this document
+  under the terms of the GNU Free Documentation License, Version 1.3
+  or any later version published by the Free Software Foundation;
+  with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+  Texts.  A copy of the license is included in the section entitled ``GNU
+  Free Documentation License''.
+@end group
+@end smallexample
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the ``with@dots{}Texts.''@: line with this:
+
+@smallexample
+@group
+    with the Invariant Sections being @var{list their titles}, with
+    the Front-Cover Texts being @var{list}, and with the Back-Cover Texts
+    being @var{list}.
+@end group
+@end smallexample
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
+
+@c Local Variables:
+@c ispell-local-pdict: "ispell-dict"
+@c End:
diff --git a/packages/enwc/doc/nm-dbus.txt b/packages/enwc/doc/nm-dbus.txt
new file mode 100644 (file)
index 0000000..89aa5a9
--- /dev/null
@@ -0,0 +1,356 @@
+NetworkManager:
+
+"<!DOCTYPE node PUBLIC \"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN\"
+\"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd\">
+<node>
+  <interface name=\"org.freedesktop.DBus.Introspectable\">
+    <method name=\"Introspect\">
+      <arg name=\"data\" direction=\"out\" type=\"s\"/>
+    </method>
+  </interface>
+  <interface name=\"org.freedesktop.DBus.Properties\">
+    <method name=\"Get\">
+      <arg name=\"interface\" direction=\"in\" type=\"s\"/>
+      <arg name=\"propname\" direction=\"in\" type=\"s\"/>
+      <arg name=\"value\" direction=\"out\" type=\"v\"/>
+    </method>
+    <method name=\"Set\">
+      <arg name=\"interface\" direction=\"in\" type=\"s\"/>
+      <arg name=\"propname\" direction=\"in\" type=\"s\"/>
+      <arg name=\"value\" direction=\"in\" type=\"v\"/>
+    </method>
+    <method name=\"GetAll\">
+      <arg name=\"interface\" direction=\"in\" type=\"s\"/>
+      <arg name=\"props\" direction=\"out\" type=\"a{sv}\"/>
+    </method>
+  </interface>
+  <interface name=\"org.freedesktop.NetworkManager\">
+    <method name=\"state\">
+      <arg name=\"state\" type=\"u\" direction=\"out\"/>
+    </method>
+    <method name=\"SetLogging\">
+      <arg name=\"level\" type=\"s\" direction=\"in\"/>
+      <arg name=\"domains\" type=\"s\" direction=\"in\"/>
+    </method>
+    <method name=\"GetPermissions\">
+      <arg name=\"permissions\" type=\"a{ss}\" direction=\"out\"/>
+    </method>
+    <method name=\"Enable\">
+      <arg name=\"enable\" type=\"b\" direction=\"in\"/>
+    </method>
+    <method name=\"Sleep\">
+      <arg name=\"sleep\" type=\"b\" direction=\"in\"/>
+    </method>
+    <method name=\"DeactivateConnection\">
+      <arg name=\"active_connection\" type=\"o\" direction=\"in\"/>
+    </method>
+    <method name=\"AddAndActivateConnection\">
+      <arg name=\"connection\" type=\"a{sa{sv}}\" direction=\"in\"/>
+      <arg name=\"device\" type=\"o\" direction=\"in\"/>
+      <arg name=\"specific_object\" type=\"o\" direction=\"in\"/>
+      <arg name=\"path\" type=\"o\" direction=\"out\"/>
+      <arg name=\"active_connection\" type=\"o\" direction=\"out\"/>
+    </method>
+    <method name=\"ActivateConnection\">
+      <arg name=\"connection\" type=\"o\" direction=\"in\"/>
+      <arg name=\"device\" type=\"o\" direction=\"in\"/>
+      <arg name=\"specific_object\" type=\"o\" direction=\"in\"/>
+      <arg name=\"active_connection\" type=\"o\" direction=\"out\"/>
+    </method>
+    <method name=\"GetDeviceByIpIface\">
+      <arg name=\"iface\" type=\"s\" direction=\"in\"/>
+      <arg name=\"device\" type=\"o\" direction=\"out\"/>
+    </method>
+    <method name=\"GetDevices\">
+      <arg name=\"devices\" type=\"ao\" direction=\"out\"/>
+    </method>
+    <signal name=\"DeviceRemoved\">
+      <arg type=\"o\"/>
+    </signal>
+    <signal name=\"DeviceAdded\">
+      <arg type=\"o\"/>
+    </signal>
+    <signal name=\"PropertiesChanged\">
+      <arg type=\"a{sv}\"/>
+    </signal>
+    <signal name=\"StateChanged\">
+      <arg type=\"u\"/>
+    </signal>
+    <signal name=\"CheckPermissions\">
+    </signal>
+    <property name=\"State\" type=\"u\" access=\"read\"/>
+    <property name=\"Version\" type=\"s\" access=\"read\"/>
+    <property name=\"ActiveConnections\" type=\"ao\" access=\"read\"/>
+    <property name=\"WimaxHardwareEnabled\" type=\"b\" access=\"read\"/>
+    <property name=\"WimaxEnabled\" type=\"b\" access=\"readwrite\"/>
+    <property name=\"WwanHardwareEnabled\" type=\"b\" access=\"read\"/>
+    <property name=\"WwanEnabled\" type=\"b\" access=\"readwrite\"/>
+    <property name=\"WirelessHardwareEnabled\" type=\"b\" access=\"read\"/>
+    <property name=\"WirelessEnabled\" type=\"b\" access=\"readwrite\"/>
+    <property name=\"NetworkingEnabled\" type=\"b\" access=\"read\"/>
+  </interface>
+  <node name=\"AccessPoint\"/>
+  <node name=\"AgentManager\"/>
+  <node name=\"Devices\"/>
+  <node name=\"Settings\"/>
+</node>
+"
+
+AccessPoint/*:
+
+"<!DOCTYPE node PUBLIC \"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN\"
+\"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd\">
+<node>
+  <interface name=\"org.freedesktop.DBus.Introspectable\">
+    <method name=\"Introspect\">
+      <arg name=\"data\" direction=\"out\" type=\"s\"/>
+    </method>
+  </interface>
+  <interface name=\"org.freedesktop.DBus.Properties\">
+    <method name=\"Get\">
+      <arg name=\"interface\" direction=\"in\" type=\"s\"/>
+      <arg name=\"propname\" direction=\"in\" type=\"s\"/>
+      <arg name=\"value\" direction=\"out\" type=\"v\"/>
+    </method>
+    <method name=\"Set\">
+      <arg name=\"interface\" direction=\"in\" type=\"s\"/>
+      <arg name=\"propname\" direction=\"in\" type=\"s\"/>
+      <arg name=\"value\" direction=\"in\" type=\"v\"/>
+    </method>
+    <method name=\"GetAll\">
+      <arg name=\"interface\" direction=\"in\" type=\"s\"/>
+      <arg name=\"props\" direction=\"out\" type=\"a{sv}\"/>
+    </method>
+  </interface>
+  <interface name=\"org.freedesktop.NetworkManager.AccessPoint\">
+    <signal name=\"PropertiesChanged\">
+      <arg type=\"a{sv}\"/>
+    </signal>
+    <property name=\"Strength\" type=\"y\" access=\"read\"/>
+    <property name=\"MaxBitrate\" type=\"u\" access=\"read\"/>
+    <property name=\"Mode\" type=\"u\" access=\"read\"/>
+    <property name=\"HwAddress\" type=\"s\" access=\"read\"/>
+    <property name=\"Frequency\" type=\"u\" access=\"read\"/>
+    <property name=\"Ssid\" type=\"ay\" access=\"read\"/>
+    <property name=\"RsnFlags\" type=\"u\" access=\"read\"/>
+    <property name=\"WpaFlags\" type=\"u\" access=\"read\"/>
+    <property name=\"Flags\" type=\"u\" access=\"read\"/>
+  </interface>
+</node>
+"
+
+Devices/*:
+
+"<!DOCTYPE node PUBLIC \"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN\"
+\"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd\">
+<node>
+  <interface name=\"org.freedesktop.DBus.Introspectable\">
+    <method name=\"Introspect\">
+      <arg name=\"data\" direction=\"out\" type=\"s\"/>
+    </method>
+  </interface>
+  <interface name=\"org.freedesktop.DBus.Properties\">
+    <method name=\"Get\">
+      <arg name=\"interface\" direction=\"in\" type=\"s\"/>
+      <arg name=\"propname\" direction=\"in\" type=\"s\"/>
+      <arg name=\"value\" direction=\"out\" type=\"v\"/>
+    </method>
+    <method name=\"Set\">
+      <arg name=\"interface\" direction=\"in\" type=\"s\"/>
+      <arg name=\"propname\" direction=\"in\" type=\"s\"/>
+      <arg name=\"value\" direction=\"in\" type=\"v\"/>
+    </method>
+    <method name=\"GetAll\">
+      <arg name=\"interface\" direction=\"in\" type=\"s\"/>
+      <arg name=\"props\" direction=\"out\" type=\"a{sv}\"/>
+    </method>
+  </interface>
+  <interface name=\"org.freedesktop.NetworkManager.Device\">
+    <method name=\"Disconnect\">
+    </method>
+    <signal name=\"StateChanged\">
+      <arg type=\"u\"/>
+      <arg type=\"u\"/>
+      <arg type=\"u\"/>
+    </signal>
+    <property name=\"DeviceType\" type=\"u\" access=\"read\"/>
+    <property name=\"FirmwareMissing\" type=\"b\" access=\"read\"/>
+    <property name=\"Autoconnect\" type=\"b\" access=\"readwrite\"/>
+    <property name=\"Managed\" type=\"b\" access=\"read\"/>
+    <property name=\"Dhcp6Config\" type=\"o\" access=\"read\"/>
+    <property name=\"Ip6Config\" type=\"o\" access=\"read\"/>
+    <property name=\"Dhcp4Config\" type=\"o\" access=\"read\"/>
+    <property name=\"Ip4Config\" type=\"o\" access=\"read\"/>
+    <property name=\"ActiveConnection\" type=\"o\" access=\"read\"/>
+    <property name=\"StateReason\" type=\"(uu)\" access=\"read\"/>
+    <property name=\"State\" type=\"u\" access=\"read\"/>
+    <property name=\"Ip4Address\" type=\"u\" access=\"read\"/>
+    <property name=\"Capabilities\" type=\"u\" access=\"read\"/>
+    <property name=\"FirmwareVersion\" type=\"s\" access=\"read\"/>
+    <property name=\"DriverVersion\" type=\"s\" access=\"read\"/>
+    <property name=\"Driver\" type=\"s\" access=\"read\"/>
+    <property name=\"IpInterface\" type=\"s\" access=\"read\"/>
+    <property name=\"Interface\" type=\"s\" access=\"read\"/>
+    <property name=\"Udi\" type=\"s\" access=\"read\"/>
+  </interface>
+  <interface name=\"org.freedesktop.NetworkManager.Device.Wireless\">
+    <method name=\"RequestScan\">
+      <arg name=\"options\" type=\"a{sv}\" direction=\"in\"/>
+    </method>
+    <method name=\"GetAccessPoints\">
+      <arg name=\"access_points\" type=\"ao\" direction=\"out\"/>
+    </method>
+    <signal name=\"AccessPointRemoved\">
+      <arg type=\"o\"/>
+    </signal>
+    <signal name=\"AccessPointAdded\">
+      <arg type=\"o\"/>
+    </signal>
+    <signal name=\"PropertiesChanged\">
+      <arg type=\"a{sv}\"/>
+    </signal>
+    <property name=\"WirelessCapabilities\" type=\"u\" access=\"read\"/>
+    <property name=\"ActiveAccessPoint\" type=\"o\" access=\"read\"/>
+    <property name=\"Bitrate\" type=\"u\" access=\"read\"/>
+    <property name=\"Mode\" type=\"u\" access=\"read\"/>
+    <property name=\"PermHwAddress\" type=\"s\" access=\"read\"/>
+    <property name=\"HwAddress\" type=\"s\" access=\"read\"/>
+  </interface>
+</node>
+"
+
+AgentManager:
+
+"<!DOCTYPE node PUBLIC \"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN\"
+\"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd\">
+<node>
+  <interface name=\"org.freedesktop.DBus.Introspectable\">
+    <method name=\"Introspect\">
+      <arg name=\"data\" direction=\"out\" type=\"s\"/>
+    </method>
+  </interface>
+  <interface name=\"org.freedesktop.DBus.Properties\">
+    <method name=\"Get\">
+      <arg name=\"interface\" direction=\"in\" type=\"s\"/>
+      <arg name=\"propname\" direction=\"in\" type=\"s\"/>
+      <arg name=\"value\" direction=\"out\" type=\"v\"/>
+    </method>
+    <method name=\"Set\">
+      <arg name=\"interface\" direction=\"in\" type=\"s\"/>
+      <arg name=\"propname\" direction=\"in\" type=\"s\"/>
+      <arg name=\"value\" direction=\"in\" type=\"v\"/>
+    </method>
+    <method name=\"GetAll\">
+      <arg name=\"interface\" direction=\"in\" type=\"s\"/>
+      <arg name=\"props\" direction=\"out\" type=\"a{sv}\"/>
+    </method>
+  </interface>
+  <interface name=\"org.freedesktop.NetworkManager.AgentManager\">
+    <method name=\"Unregister\">
+    </method>
+    <method name=\"Register\">
+      <arg name=\"identifier\" type=\"s\" direction=\"in\"/>
+    </method>
+  </interface>
+</node>
+"
+
+Settings:
+
+"<!DOCTYPE node PUBLIC \"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN\"
+\"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd\">
+<node>
+  <interface name=\"org.freedesktop.DBus.Introspectable\">
+    <method name=\"Introspect\">
+      <arg name=\"data\" direction=\"out\" type=\"s\"/>
+    </method>
+  </interface>
+  <interface name=\"org.freedesktop.DBus.Properties\">
+    <method name=\"Get\">
+      <arg name=\"interface\" direction=\"in\" type=\"s\"/>
+      <arg name=\"propname\" direction=\"in\" type=\"s\"/>
+      <arg name=\"value\" direction=\"out\" type=\"v\"/>
+    </method>
+    <method name=\"Set\">
+      <arg name=\"interface\" direction=\"in\" type=\"s\"/>
+      <arg name=\"propname\" direction=\"in\" type=\"s\"/>
+      <arg name=\"value\" direction=\"in\" type=\"v\"/>
+    </method>
+    <method name=\"GetAll\">
+      <arg name=\"interface\" direction=\"in\" type=\"s\"/>
+      <arg name=\"props\" direction=\"out\" type=\"a{sv}\"/>
+    </method>
+  </interface>
+  <interface name=\"org.freedesktop.NetworkManager.Settings\">
+    <method name=\"SaveHostname\">
+      <arg name=\"hostname\" type=\"s\" direction=\"in\"/>
+    </method>
+    <method name=\"AddConnection\">
+      <arg name=\"connection\" type=\"a{sa{sv}}\" direction=\"in\"/>
+      <arg name=\"path\" type=\"o\" direction=\"out\"/>
+    </method>
+    <method name=\"GetConnectionByUuid\">
+      <arg name=\"uuid\" type=\"s\" direction=\"in\"/>
+      <arg name=\"connection\" type=\"o\" direction=\"out\"/>
+    </method>
+    <method name=\"ListConnections\">
+      <arg name=\"connections\" type=\"ao\" direction=\"out\"/>
+    </method>
+    <signal name=\"NewConnection\">
+      <arg type=\"o\"/>
+    </signal>
+    <signal name=\"PropertiesChanged\">
+      <arg type=\"a{sv}\"/>
+    </signal>
+    <property name=\"CanModify\" type=\"b\" access=\"read\"/>
+    <property name=\"Hostname\" type=\"s\" access=\"read\"/>
+  </interface>
+  <node name=\"0\"/>
+</node>
+"
+Settings/0:
+
+"<!DOCTYPE node PUBLIC \"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN\"
+\"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd\">
+<node>
+  <interface name=\"org.freedesktop.DBus.Introspectable\">
+    <method name=\"Introspect\">
+      <arg name=\"data\" direction=\"out\" type=\"s\"/>
+    </method>
+  </interface>
+  <interface name=\"org.freedesktop.DBus.Properties\">
+    <method name=\"Get\">
+      <arg name=\"interface\" direction=\"in\" type=\"s\"/>
+      <arg name=\"propname\" direction=\"in\" type=\"s\"/>
+      <arg name=\"value\" direction=\"out\" type=\"v\"/>
+    </method>
+    <method name=\"Set\">
+      <arg name=\"interface\" direction=\"in\" type=\"s\"/>
+      <arg name=\"propname\" direction=\"in\" type=\"s\"/>
+      <arg name=\"value\" direction=\"in\" type=\"v\"/>
+    </method>
+    <method name=\"GetAll\">
+      <arg name=\"interface\" direction=\"in\" type=\"s\"/>
+      <arg name=\"props\" direction=\"out\" type=\"a{sv}\"/>
+    </method>
+  </interface>
+  <interface name=\"org.freedesktop.NetworkManager.Settings.Connection\">
+    <method name=\"GetSecrets\">
+      <arg name=\"setting_name\" type=\"s\" direction=\"in\"/>
+      <arg name=\"secrets\" type=\"a{sa{sv}}\" direction=\"out\"/>
+    </method>
+    <method name=\"GetSettings\">
+      <arg name=\"settings\" type=\"a{sa{sv}}\" direction=\"out\"/>
+    </method>
+    <method name=\"Delete\">
+    </method>
+    <method name=\"Update\">
+      <arg name=\"properties\" type=\"a{sa{sv}}\" direction=\"in\"/>
+    </method>
+    <signal name=\"Removed\">
+    </signal>
+    <signal name=\"Updated\">
+    </signal>
+  </interface>
+</node>
+"
diff --git a/packages/enwc/doc/settings.txt b/packages/enwc/doc/settings.txt
new file mode 100644 (file)
index 0000000..02a55da
--- /dev/null
@@ -0,0 +1,11 @@
+IPv4 settings:
+  Address - text input
+  Prefix - text input
+  Gateway - text input
+
+DNS Settings:
+  3 DNS Servers - text input
+
+Encryption Type
+  - Check box to use encryption
+  - Drop-down list of encryption types available.
diff --git a/packages/enwc/doc/version.texi b/packages/enwc/doc/version.texi
new file mode 100644 (file)
index 0000000..f910a9b
--- /dev/null
@@ -0,0 +1,4 @@
+@set UPDATED 15 December 2012
+@set UPDATED-MONTH December 2012
+@set EDITION 1.0
+@set VERSION 1.0
diff --git a/packages/enwc/enwc-cm.el b/packages/enwc/enwc-cm.el
new file mode 100644 (file)
index 0000000..91f002a
--- /dev/null
@@ -0,0 +1,153 @@
+;; enwc-cm.el
+
+;; Copyright (C) 2012,2013 Free Software Foundation, Inc.
+
+;; Author: Ian Dunn
+;; Keywords: enwc, network, wicd, manager, nm
+
+;; This file is part of ENWC
+
+;; ENWC 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, or (at your option)
+;; any later version.
+
+;; ENWC 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 ENWC; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;; connect
+;; disconnect
+;; scan
+;; get-prop
+;; save-profile
+;; get-networks
+;; check-connecting
+;; get-current-nw-id
+
+
+(require 'enwc)
+
+(defgroup enwc-cm nil
+  "*ConnMan variables for ENWC"
+  :prefix "ewnc-cm-"
+  :group 'enwc)
+
+(defcustom enwc-cm-dbus-service "net.connman"
+  "ConnMan D-Bus service."
+  :group 'enwc-cm
+  :type 'string)
+
+
+;; DEMAND TO SEE LIFE'S MANAGER!!
+
+(defcustom enwc-cm-dbus-manager-interface "net.connman.Manager"
+  "ConnMan D-Bus Manager interface."
+  :group 'enwc-cm
+  :type 'string)
+
+(defcustom enwc-cm-dbus-service-interface "net.connman.Service"
+  "ConnMan D-Bus Service interface."
+  :group 'enwc-cm
+  :type 'string)
+
+(defvar enwc-cm-details-list
+  '("Name" "bssid" "Strength" "Security" "mode" "channel"))
+
+(defun enwc-cm-get-services ()
+  (dbus-call-method :system
+                   enwc-cm-dbus-service
+                   "/"
+                   enwc-cm-dbus-manager-interface
+                   "GetServices"))
+
+(defun enwc-cm-get-networks ()
+  (let ((services (enwc-cm-get-services)))
+    (mapcar 'car services)))
+
+(defun enwc-cm-get-network (id)
+  (nth id (enwc-cm-get-services)))
+
+;; scan
+(defun enwc-cm-scan (wired)
+  (dbus-call-method :system
+                   enwc-cm-dbus-service
+                   "/net/connman/technology/(ethernet|wifi)"
+                   "net.connman.Technology"
+                   "Scan"))
+
+;; connect
+(defun enwc-cm-connect (wired id)
+  (dbus-call-method :system
+                   enwc-cm-dbus-service
+                   "/net/connman/service/serviceID"
+                   enwc-cm-dbus-service-interface
+                   "Connect"))
+
+
+(defun enwc-cm-disconnect (wired)
+  (dbus-call-method :system
+                   enwc-cm-dbus-service
+                   "/net/connman/service/CONNECTED-SERVICE"
+                   enwc-cm-dbus-service-interface
+                   "Disconnect"))
+
+(defun enwc-cm-get-nw-prop (id prop)
+  (let ((network (enwc-cm-get-network id)))
+    (car (cadr (assoc prop (cadr network))))))
+
+(defun enwc-cm-get-wireless-network-property (id prop)
+  (enwc-cm-get-nw-prop id prop))
+
+(defun enwc-cm-get-encryption-type (id)
+  (enwc-cm-get-nw-prop id "Security"))
+
+(defun enwc-cm-get-ip-addr (wired id)
+  (let ((ipv4-config (enwc-cm-get-nw-prop id "IPv4.Configuration")))
+    (car (cadr (assoc "Address" ipv4-config)))))
+
+(defun enwc-cm-get-netmask (wired id)
+  (let ((ipv4-config (enwc-cm-get-nw-prop id "IPv4.Configuration")))
+    (car (cadr (assoc "Netmask" ipv4-config)))))
+
+(defun enwc-cm-get-gateway (wired id)
+  (let ((ipv4-config (enwc-cm-get-nw-prop id "IPv4.Configuration")))
+    (car (cadr (assoc "Gateway" ipv4-config)))))
+
+(defun enwc-cm-get-dns (wired id)
+  (enwc-cm-get-nw-prop id "Nameservers.Configuration"))
+
+(defun enwc-cm-set-nw-prop (wired id prop val)
+  (dbus-call-method :system
+                   enwc-cm-dbus-service
+                   (car (enwc-cm-get-network id))
+                   enwc-cm-dbus-service-interface
+                   "SetProperty"
+                   prop
+                   val))
+
+(defun enwc-cm-save-nw-settings (wired id settings)
+  (let* ((ipv4 (enwc-cm-get-nw-prop id "IPv4.Configuration"))
+        (method (car (cadr (assoc "Method" ipv4))))
+        (ip-addr (cdr (assoc "addr" settings)))
+        (netmask (cdr (assoc "netmask" settings)))
+        (gateway (cdr (assoc "gateway" settings)))
+        new-ipv4-config new-dns-config)
+    (setq new-ipv4-config
+         (list (list (cons "Method" (cons (cons method nil) nil))
+                     (cons "Address" (cons (cons ip-addr nil) nil))
+                     (cons "Netmask" (cons (cons netmask nil) nil))
+                     (cons "Gateway" (cons (cons gateway nil) nil)))))
+    (setq new-dns-config
+         (list (list (cdr (assoc "dns1" settings))
+                     (cdr (assoc "dns2" settings)))))
+    (enwc-cm-set-nw-prop wired id "IPv4.Configuration"
+                        new-ipv4-config)
+    (enwc-cm-set-nw-prop wired id "Nameservers.Configuration"
+                        new-dns-config)))
diff --git a/packages/enwc/enwc-nm.el b/packages/enwc/enwc-nm.el
new file mode 100644 (file)
index 0000000..9ba8c5e
--- /dev/null
@@ -0,0 +1,911 @@
+;;; enwc-nm.el - The NetworkManager backend to ENWC
+
+;; Copyright (C) 2012,2013 Free Software Foundation, Inc.
+
+;; Author: Ian Dunn
+;; Keywords: enwc, network, wicd, manager, nm
+
+;; This file is part of ENWC
+
+;; ENWC 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, or (at your option)
+;; any later version.
+
+;; ENWC 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 ENWC; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+
+;;; Commentary:
+;;
+;;   This requires NetworkManager >= 0.9.6
+;;
+
+(require 'enwc)
+
+(defgroup enwc-nm nil
+  "*NetworkManager variables for ENWC"
+  :prefix "enwc-nm-"
+  :group 'enwc)
+
+(defcustom enwc-nm-dbus-service "org.freedesktop.NetworkManager"
+  "NetworkManager D-Bus service."
+  :group 'enwc-nm
+  :type 'string)
+
+(defcustom enwc-nm-dbus-path "/org/freedesktop/NetworkManager"
+  "The default D-Bus path for NetworkManager."
+  :group 'enwc-nm
+  :type 'string)
+
+(defcustom enwc-nm-dbus-settings-path "/org/freedesktop/NetworkManager/Settings"
+  "The settings D-Bus path for NetworkManager."
+  :group 'enwc-nm
+  :type 'string)
+
+(defcustom enwc-nm-dbus-interface "org.freedesktop.NetworkManager"
+  "The default D-Bus interface for NetworkManager."
+  :group 'enwc-nm
+  :type 'string)
+
+(defcustom enwc-nm-dbus-wireless-interface "org.freedesktop.NetworkManager.Device.Wireless"
+  "The wireless D-Bus interface for NetworkManager."
+  :group 'enwc-nm
+  :type 'string)
+
+(defcustom enwc-nm-dbus-wired-interface "org.freedesktop.NetworkManager.Device.Wired"
+  "The wired D-Bus interface for NetworkManager."
+  :group 'enwc-nm
+  :type 'string)
+
+(defcustom enwc-nm-dbus-device-interface "org.freedesktop.NetworkManager.Device"
+  "The device D-Bus interface for NetworkManager."
+  :group 'enwc-nm
+  :type 'string)
+
+(defcustom enwc-nm-dbus-accesspoint-interface "org.freedesktop.NetworkManager.AccessPoint"
+  "The access point D-Bus interface for NetworkManager."
+  :group 'enwc-nm
+  :type 'string)
+
+(defcustom enwc-nm-dbus-settings-interface "org.freedesktop.NetworkManager.Settings"
+  "The settings D-Bus interface for NetworkManager."
+  :group 'enwc-nm
+  :type 'string)
+
+(defcustom enwc-nm-dbus-connections-interface "org.freedesktop.NetworkManager.Settings.Connection"
+  "The connections D-Bus interface for NetworkManager."
+  :group 'enwc-nm
+  :type 'string)
+
+(defcustom enwc-nm-dbus-active-interface "org.freedesktop.NetworkManager.Connection.Active"
+  "The active connection D-Bus interface for NetworkManager."
+  :group 'enwc-nm
+  :type 'string)
+
+(defvar enwc-nm-details-list
+  '("Ssid" "HwAddress" "Strength" "Flags" "Mode" "Frequency")
+  "The list of the desired details to be obtained from each network.")
+
+(defvar enwc-nm-sec-types
+  '(("eap-leap" . (("Name" . "eap-leap")
+                  ("reqs" . ((("identity" . "Username")
+                              ("password" . "Password"))))))
+    ("eap-peap" . (("Name" . "eap-peap")
+                  ("reqs" . ((("anonymous-identity" . "Anonymous Identity")
+                              ("ca-cert" . "CA Certificate")
+                              ("phase2-auth" . "Inner Authentication")
+                              ("phase1-peapver" . "PEAP Version")
+                              ("identity" . "Username")
+                              ("password" . "Password"))))))
+    ("eap-tls" . (("Name" . "eap-tls")
+                 ("reqs" . ((("identity" . "Identity")
+                             ("client-cert" . "User Certificate")
+                             ("ca-cert" . "CA Certificate")
+                             ("private-key" . "Private Key")
+                             ("private-key-password" . "Private Key Password"))))))
+    ("eap-ttls" . (("Name" . "eap-ttls")
+                  ("reqs" . ((("anonymous-identity" . "Anonymous Identity")
+                              ("ca-cert" . "CA Certificate")
+                              ("phase2-auth" . "Inner Authentication")
+                              ("identity" . "Username")
+                              ("password" . "Password"))))))
+    ("wpa-psk" . (("Name" . "wpa2")
+                 ("reqs" . ((("psk" . "PSK"))))))
+    ("wep" . (("Name" . "wep")
+             ("reqs" . ((("wep-key0" . "WEP Key")
+                         ("wep-key-type" . "WEP Key Type"))))))
+    ("leap" . (("Name" . "leap")
+              ("reqs" . ((("leap-username" . "Username")
+                         ("leap-password" . "Password"))))))
+    )
+  "The security types for NetworkManager.
+This is still in the process of being worked on."
+  )
+
+(defvar enwc-nm-wired-dev nil
+  "The wired device object path.")
+
+(defvar enwc-nm-wireless-dev nil
+  "The wireless device object path.")
+
+(defvar enwc-nm-active-ap nil
+  "The active access point object path.")
+
+(defvar enwc-nm-connecting-p nil
+  "Whether or not NetworkManager is connecting.")
+
+(defvar enwc-nm-wired-p nil
+  "Whether or not NetworkManager is wired.")
+
+(defvar enwc-nm-edit-info nil
+  "The information for the network connection being edited.")
+
+(defun enwc-nm-get-settings (conn)
+  "Gets the connection settings.
+CONN is an object path to the connection."
+  (dbus-call-method :system
+                   enwc-nm-dbus-service
+                   conn
+                   enwc-nm-dbus-connections-interface
+                   "GetSettings"
+                   :timeout 25000))
+  
+
+(defun enwc-nm-list-connections ()
+  "List the connections."
+  (dbus-call-method :system
+                   enwc-nm-dbus-service
+                   enwc-nm-dbus-settings-path
+                   enwc-nm-dbus-settings-interface
+                   "ListConnections"
+                   :timeout 25000))
+
+;; Default
+(defun enwc-nm-get-device-by-name (name)
+  (dbus-call-method :system
+                   enwc-nm-dbus-service
+                   enwc-nm-dbus-path
+                   enwc-nm-dbus-interface
+                   "GetDeviceByIpIface"
+                   :timeout 25000
+                   :string name))
+
+;; Settings, Connections
+(defun enwc-nm-get-uuid-by-ssid (ssid)
+  "Gets the uuid of the network with ssid SSID."
+  (let ((conns (enwc-nm-list-connections))
+       cur-conn cur-ssid uuid)
+    (while (and conns (not uuid))
+      (setq cur-conn (pop conns))
+      (let ((settings (enwc-nm-get-settings cur-conn)))
+       (if (not (assoc "802-11-wireless" settings))
+           nil
+         (setq cur-ssid
+               (dbus-byte-array-to-string (car (cadr (assoc "ssid"
+                                                            (cadr (assoc "802-11-wireless"
+                                                                         settings)))))))
+         (if (string= cur-ssid ssid)
+             (setq uuid
+                   (car (cadr (assoc "uuid"
+                                     (cadr (assoc "connection"
+                                                  settings))))))))))
+    uuid))
+
+(defun enwc-nm-get-uuid-by-id (id)
+  "Gets a network connection's uuid by the network's id.
+ID is a string that NetworkManager uses to identify this network."
+  (let ((conns (enwc-nm-list-connections))
+       cur-conn cur-id uuid)
+    (while (and conns (not uuid))
+      (setq cur-conn (pop conns))
+      (let ((settings (enwc-nm-get-settings cur-conn))
+           conn-set)
+       (if (not (assoc "connection" settings))
+           nil
+         (setq conn-set (assoc "connection" settings))
+         (setq cur-id (car (cadr (assoc "id" (cadr conn-set)))))
+         (if (string= cur-id id)
+             (setq uuid (car (cadr (assoc "uuid" (cadr conn-set)))))))))))
+
+(defun enwc-nm-get-conn-by-uuid (uuid)
+  (dbus-call-method :system
+                   enwc-nm-dbus-service
+                   enwc-nm-dbus-settings-path
+                   enwc-nm-dbus-settings-interface
+                   "GetConnectionByUuid"
+                   :timeout 25000
+                   uuid))
+
+;; Settings
+(defun enwc-nm-get-conn-by-ssid (ssid)
+  "Gets the connection path for the access point with ssid SSID."
+  (let ((uuid (enwc-nm-get-uuid-by-ssid ssid)))
+    (if uuid
+       (enwc-nm-get-conn-by-uuid uuid)
+      nil)))
+
+(defun enwc-nm-get-conn-by-id (id)
+  "Gets a connection object with the id ID.
+ID is the identifier used by Network Manager."
+  (let ((uuid (enwc-nm-get-uuid-by-id id)))
+    (enwc-nm-get-conn-by-uuid uuid)))
+
+;; Wireless
+(defun enwc-nm-scan ()
+  "The NetworkManager scan function."
+  (dbus-call-method :system
+                   enwc-nm-dbus-service
+                   enwc-nm-wireless-dev
+                   enwc-nm-dbus-wireless-interface
+                   "RequestScan"
+                   :timeout 25000
+                   '(:array :signature "{sv}")))
+
+;; Wireless
+(defun enwc-nm-get-networks ()
+  "The NetworkManager get networks function.
+This returns a list of D-Bus paths to the access points."
+  (dbus-call-method :system
+                   enwc-nm-dbus-service
+                   enwc-nm-wireless-dev
+                   enwc-nm-dbus-wireless-interface
+
+                   "GetAccessPoints"))
+
+;; Accesspoint
+(defun enwc-nm-get-wireless-network-property (id prop)
+  "The NetworkManager get wireless network property function.
+This runs like normal, using element ID of `enwc-access-points'
+ to determine the access point path, then obtains the property
+PROP from that access point.  It also sets the channel from the
+ frequency if necessary."
+  (let ((ap (nth id enwc-access-points))
+       (mod-prop prop)
+       ret)
+    (if (string= mod-prop "essid")
+       (setq mod-prop "Ssid"))
+    (setq ret (dbus-get-property :system
+                                enwc-nm-dbus-service
+                                ap
+                                enwc-nm-dbus-accesspoint-interface
+                                mod-prop))
+    (if (not ret)
+       (progn
+         (if (not enwc-nm-edit-info)
+             (setq ret ""))
+         (progn
+           (setq ret (assoc mod-prop
+                            (cadr (assoc "802-1x"
+                                         enwc-nm-edit-info))))
+           (if (not ret)
+               (setq ret (assoc mod-prop
+                                (cadr (assoc "802-11-wireless-security"
+                                             enwc-nm-edit-info)))))
+           (setq ret (car (cadr ret))))))
+    (if (string= mod-prop "Frequency")
+       (setq ret (number-to-string (1+ (/ (- ret 2412) 5)))))
+    (if (string= mod-prop "Ssid")
+       (setq ret (dbus-byte-array-to-string ret)))
+    (if (string= mod-prop "Mode")
+       (setq ret (cond ((= ret 0) "Unknown")
+                       ((= ret 1) "Ad-Hoc")
+                       ((= ret 2) "Infrastructure"))))
+    ret))
+
+(defun enwc-nm-get-wireless-nw-props (id)
+  (let ((ap (nth id enwc-access-points))
+       tmp-val
+       ret)
+    (setq ret (dbus-get-all-properties :system
+                                      enwc-nm-dbus-service
+                                      ap
+                                      enwc-nm-dbus-accesspoint-interface))
+    (setq tmp-val (cdr (assoc "Mode" ret)))
+    (setcdr (assoc "Frequency" ret)
+           (number-to-string (1+ (/ (- (cdr (assoc "Frequency" ret))
+                                       2412) 5))))
+    (setcdr (assoc "Ssid" ret)
+           (dbus-byte-array-to-string (cdr (assoc "Ssid" ret))))
+    (setcdr (assoc "Mode" ret)
+           (cond ((= tmp-val 0) "Unkown")
+                 ((= tmp-val 1) "Ad-Hoc")
+                 ((= tmp-val 2) "Infrastructure")))
+    ret))
+
+(defun enwc-nm-get-conn-by-nid (nid)
+  "Gets a connection object with the network id NID."
+  (let* ((ssid (enwc-nm-get-wireless-network-property nid
+                                                     "Ssid"))
+        (uuid (enwc-nm-get-uuid-by-ssid ssid)))
+    (if uuid
+       (enwc-nm-get-conn-by-uuid uuid)
+      nil)))
+
+(defun enwc-nm-get-encryption-type (id)
+  "The NetworkManager get encryption type function.
+This gets the WPA flags and RSN flags from access point in ID.
+If both are 0, then it returns WEP, otherwise WPA."
+  (let ((wpa-flags (enwc-nm-get-wireless-network-property id "WpaFlags"))
+       (rsn-flags (enwc-nm-get-wireless-network-property id "RsnFlags")))
+    (if (and (= wpa-flags 0) (= rsn-flags 0))
+       "WEP"
+      "WPA")))
+
+;; Default
+(defun enwc-nm-connect (id)
+  "The NetworkManager connect function.
+This gets the connection path from ID, and connects to it."
+  (let ((ssid (enwc-nm-get-wireless-network-property id "Ssid")))
+    (dbus-call-method :system
+                     enwc-nm-dbus-service
+                     enwc-nm-dbus-path
+                     enwc-nm-dbus-interface
+                     "ActivateConnection"
+                     :timeout 25000
+                     :object-path (enwc-nm-get-conn-by-ssid ssid)
+                     :object-path enwc-nm-wireless-dev
+                     :object-path (nth id enwc-access-points))))
+
+
+(defun enwc-nm-string-idx (obj list)
+  (let ((tmp-list list)
+       (cur-pos -1)
+       cur-obj)
+    (while (and (not cur-obj) tmp-list)
+      (setq cur-obj (pop tmp-list))
+      (setq cur-pos (1+ cur-pos))
+      (if (not (string= obj cur-obj))
+         (setq cur-obj nil)))
+    cur-pos))
+
+(defun enwc-nm-wireless-prop-changed (props)
+  (if (assoc "ActiveAccessPoint" props)
+      (setq enwc-nm-active-ap (car (cadr (assoc "ActiveAccessPoint"
+                                               props))))))
+
+;; Wireless
+(defun enwc-nm-get-current-nw-id (wired)
+  "The NetworkManager get current network id function.
+This simply checks for the active access point."
+  (if (or wired (string= enwc-nm-active-ap "/"))
+      -1
+    (enwc-nm-string-idx enwc-nm-active-ap enwc-access-points)))
+
+(defun enwc-nm-prop-changed (state)
+  (setq enwc-nm-connecting-p (eq state 40)))
+
+;; Default
+(defun enwc-nm-check-connecting ()
+  "The NetworkManager check connecting function."
+  enwc-nm-connecting-p)
+
+;; Device
+(defun enwc-nm-disconnect-wireless ()
+  (dbus-call-method :system
+                   enwc-nm-dbus-service
+                   enwc-nm-wireless-dev
+                   enwc-nm-dbus-device-interface
+                   "Disconnect"))
+
+;; Settings, Connections
+(defun enwc-nm-get-wired-profiles ()
+  (let ((profs-list (enwc-nm-list-connections)))
+    (mapcar (lambda (x)
+             (let ((props (enwc-nm-get-settings x)))
+               (if (string= (caar props) "connection")
+                   (car (cadr (car (cadr (car props))))))))
+           profs-list)))
+
+(defun enwc-nm-wired-connect (id)
+  (let ((nid (nth id enwc-access-points)))
+    (dbus-call-method :system
+                     enwc-nm-dbus-service
+                     enwc-nm-dbus-path
+                     enwc-nm-dbus-interface
+                     :timeout 25000
+                     :object-path (enwc-nm-get-conn-by-id nid)
+                     :object-path enwc-nm-wired-dev
+                     :objec-path "/")))
+
+;; Device
+(defun enwc-nm-wired-disconnect ()
+  (dbus-call-method :system
+                   enwc-nm-dbus-service
+                   enwc-nm-wired-dev
+                   enwc-nm-dbus-device-interface
+                   "Disconnect"))
+
+(defun enwc-nm-dev-prop-changed (new-state old-state reason)
+  (setq enwc-nm-wired-p (eq new-state 100)))
+
+;; Default
+(defun enwc-nm-is-wired ()
+  enwc-nm-wired-p)
+
+;; Each entry in sec-types should be:
+;; ("IDENT" (("Name" . "NAME") ("reqs" . (("key1" . "Entry1") ("key2" . "Entry2") ... ))))
+;; Where:
+;;  "IDENT" => String that identifies this to the backend.
+;;  "NAME" => String that ENWC displays
+;;  "reqs" => Constant string, but the association list holds entries
+;;              required by the security type, i.e. user, passphrase, etc.
+;;  "keyXX" => String that the backend uses for this security entry.
+;;  "EntryXX" => String that ENWC displays for this security entry.
+
+(defun enwc-nm-get-sec-types (wired)
+  "Get security types."
+  (if wired
+      nil
+    enwc-nm-sec-types)
+  )
+
+(defun enwc-nm-gen-uuid ()
+  (random t)
+  (let ((hex-nums
+        (mapcar (lambda (x)
+                  (random 65535))
+                (number-sequence 0 7)))
+       fin-str)
+    (setq fin-str (format "%04x%04x-%04x-%04x-%04x-%04x%04x%04x"
+                         (nth 0 hex-nums)
+                         (nth 1 hex-nums)
+                         (nth 2 hex-nums)
+                         (nth 3 hex-nums)
+                         (nth 4 hex-nums)
+                         (nth 5 hex-nums)
+                         (nth 6 hex-nums)
+                         (nth 7 hex-nums)))))
+
+(defun enwc-nm-convert-addr (addr)
+  (if addr
+      (let* ((hex-addr (format "%08x" addr))
+            (ret-addr (format "%i.%i.%i.%i"
+                              (string-to-number (substring hex-addr
+                                                           6 8)
+                                                16)
+                              (string-to-number (substring hex-addr
+                                                           4 6)
+                                                16)
+                              (string-to-number (substring hex-addr
+                                                           2 4)
+                                                16)
+                              (string-to-number (substring hex-addr
+                                                           0 2)
+                                                16))))
+       ret-addr)
+    ""))
+
+(defun enwc-nm-addr-back (addr)
+  (let ((bytes (split-string addr "."))
+        ret-val)
+    (setq ret-val (logior (lsh (string-to-number (nth 3 bytes))
+                              0)
+                         (lsh (string-to-number (nth 2 bytes))
+                              1)
+                         (lsh (string-to-number (nth 1 bytes))
+                              2)
+                         (lsh (string-to-number (nth 0 bytes))
+                              3)))))
+
+;; These next two come from libnm-util/nm-utils.c in NM's source.
+
+(defun enwc-nm-netmask-to-prefix (netmask)
+  "Converts a netmask to a prefix.
+NETMASK is an ip address in network byte order."
+  (if netmask
+      (let* ((mask netmask)
+            (cur-pos 3)
+            (cur-mark (logand (lsh mask (* -8 cur-pos)) 255))
+            (pf 0))
+       (while (and (eq cur-mark 255) (>= cur-pos 0))
+         (setq pf (+ pf 8))
+         (setq cur-pos (1- cur-pos))
+         (setq cur-mark (logand (lsh mask (* -8 cur-pos)) 255))
+         )
+
+       (if (>= cur-pos 0)
+           (let ((v (logand (lsh mask (* -8 cur-pos)) 255)))
+             (while (not (eq v 0))
+               (setq pf (1+ pf))
+               (setq v (lsh v 1)))))
+       pf)
+    0))
+
+(defun enwc-nm-prefix-to-netmask (prefix)
+  "Converts a prefix to a netmask.
+PREFIX is an integer <= 32."
+  (let ((pf prefix)
+       (netmask 0)
+       (msk #x80000000))
+  (while (> pf 0)
+    (setq netmask (logior netmask msk))
+    (setq msk (lsh msk -1))
+    (setq pf (1- pf)))
+  netmask))
+
+(defun enwc-nm-get-nw-info (wired id)
+  (let ((conn (enwc-nm-get-conn-by-nid id)))
+    (if conn
+       (setq enwc-nm-edit-info
+             (enwc-nm-get-settings conn))))
+
+  (let (ip-addr netmask gateway dns-list nw-info)
+    (if enwc-nm-edit-info
+       (progn
+         (setq ip-addr (nth 0 (caar (cadr (assoc "addresses"
+                                                 (cadr (assoc "ipv4"
+                                                              enwc-nm-edit-info))))))
+               netmask (nth 3 (caar (cadr (assoc "addresses"
+                                                 (cadr (assoc "ipv4"
+                                                              enwc-nm-edit-info))))))
+               gateway (nth 2 (caar (cadr (assoc "address"
+                                                 (cadr (assoc "ipv4"
+                                                              enwc-nm-edit-info))))))
+               dns-list (car (cadr (assoc "dns" (cadr (assoc "ipv4"
+                                                             enwc-nm-edit-info))))))
+         (setq ip-addr (enwc-nm-convert-addr ip-addr)
+               netmask (enwc-nm-convert-addr netmask)
+               gateway (enwc-nm-convert-addr gateway)
+               dns-list (mapcar 'enwc-nm-convert-addr
+                                dns-list))
+         (setq nw-info (list (cons (cons "addr"
+                                         ip-addr) nil)
+                             (cons (cons "netmask"
+                                         netmask) nil)
+                             (cons (cons "gateway"
+                                         gateway) nil)
+                             (cons (cons "dns1"
+                                         (nth 0
+                                              dns-list))
+                                   nil)
+                             (cons (cons "dns2"
+                                         (nth 1
+                                              dns-list))
+                                   nil)
+                             (cons (cons "enctype"
+                                         "None") nil)
+                             )))
+      nil)))
+
+(defun enwc-nm-get-ip-addr (wired id)
+  "Gets the IP Address of a connection profile."
+  (let ((props (enwc-nm-get-settings (enwc-nm-get-conn-by-nid id)))
+       ipaddr ret-addr)
+    (if (not props)
+       (setq ret-addr "")
+      (setq ipaddr (nth 0 (caar (cadr (assoc "addresses"
+                                            (cadr (assoc "ipv4"
+                                                         props)))))))
+      (setq ret-addr (enwc-nm-convert-addr ipaddr)))))
+
+(defun enwc-nm-get-netmask (wired id)
+  "Gets the Netmask of a connection profile."
+  (let ((props (enwc-nm-get-settings (enwc-nm-get-conn-by-nid id)))
+       ipaddr hex-addr ret-addr)
+    (if (not props)
+       (setq ret-addr "")
+      (setq ipaddr (nth 3 (caar (cadr (assoc "addresses"
+                                            (cadr (assoc "ipv4"
+                                                         props)))))))
+      (setq hex-addr (enwc-nm-prefix-to-netmask ipaddr))
+      (setq ret-addr (format "%i.%i.%i.%i"
+                            (logand hex-addr 255)
+                            (logand (lsh hex-addr -8) 255)
+                            (logand (lsh hex-addr -16) 255)
+                            (logand (lsh hex-addr -24) 255))))))
+    
+
+(defun enwc-nm-get-gateway (wired id)
+  "Gets the Gateway of a connection profile."
+  (let ((props (enwc-nm-get-settings (enwc-nm-get-conn-by-nid id)))
+       ipaddr ret-addr)
+    (if (not props)
+       (setq ret-addr "")
+      (setq ipaddr (nth 2 (caar (cadr (assoc "addresses"
+                                            (cadr (assoc "ipv4"
+                                                         props)))))))
+      (setq ret-addr (enwc-nm-convert-addr ipaddr)))))
+
+(defun enwc-nm-get-dns (wired id)
+  "Gets the DNS settings of a connection profile."
+  (let ((props (enwc-nm-get-settings (enwc-nm-get-conn-by-nid id)))
+       dns-list)
+    (setq dns-list (car (cadr (assoc "dns" (cadr (assoc "ipv4"
+                                                       props))))))
+    (mapcar 'enwc-nm-convert-addr
+           dns-list)))
+
+(defun enwc-nm-process-enctype (settings nw-settings)
+  "Process the encryption type.
+Sets up the encryption type passed in through SETTINGS."
+  (let* ((ret-list nw-settings)
+        (req-list (nthcdr 6 settings))
+        (enctype (cdr (assoc "enctype" settings)))
+        key-mgmt
+        new-list name-list
+        ;;(name-list (cdr (assoc "reqs" (cdr (assoc enctype enwc-nm-sec-types)))))
+        key-name)
+
+    ;; There is a possibility that any of these don't exist in
+    ;; nw-settings.
+
+    (setq new-list `("802-11-wireless-security" (("pairwise" (("wep40" "wep104")))
+                                                ("group" (("wep40" "wep104")))
+                                                ("auth-alg" (nil))
+                                                ("key-mgmt" (nil)))))
+
+    (if (not (assoc "802-11-wireless-security" ret-list))
+       (setq ret-list (append ret-list (list new-list))))
+
+    (if (or (string= enctype "eap-leap")
+           (string= enctype "eap-peap")
+           (string= enctype "eap-tls")
+           (string= enctype "eap-ttls"))
+       (progn
+         (setq key-name "802-1x")
+         (setq key-mgmt "ieee8021x")
+         (setq req-list (push (cons "eap" (substring enctype 4)) req-list))
+         (print req-list)
+         ;;(setcdr (assoc "eap" (cadr (assoc "802-1x" ret-list))) (list (list (list (substring enctype 4)))))
+         )
+      (setq key-name "802-11-wireless-security")
+      (setq key-mgmt
+           (cond ((string= enctype "wep") "none")
+                 ((string= enctype "wpa-psk") "wpa-psk")
+                 ((string= enctype "leap") "iee8021x"))))
+    (setcdr (assoc "key-mgmt" (cadr (assoc "802-11-wireless-security" ret-list)))
+           (list (list key-mgmt)))
+
+    (if (string= enctype "leap")
+       (setcdr (assoc "auth-alg" (cadr (assoc "802-11-wireless-security" ret-list)))
+               (list (list "leap"))))
+
+    (setq name-list (cons key-name
+                         (list (mapcar (lambda (x)
+                                         (cons (car x)
+                                               (cons (cons (cdr x) nil)
+                                                     nil)))
+                                       req-list))))
+
+    (if (not (assoc key-name ret-list))
+       (setq ret-list (append ret-list (list name-list)))
+      (setcdr (assoc key-name ret-list) (list name-list)))
+
+
+    (if (or (string= enctype "eap-leap")
+           (string= enctype "eap-peap")
+           (string= enctype "eap-tls")
+           (string= enctype "eap-ttls"))
+       (setcdr (assoc "eap" (cadr (assoc "802-1x" ret-list)))
+               (cons (cons (cons (substring enctype 4) nil) nil) nil)))
+
+    ret-list))
+
+(defun enwc-nm-finalize-settings (settings)
+  "Sets up all of the D-BUS types of a settings list.
+SETTINGS is the list of settings list to setup.
+This will place all of the necessary markers in the list,
+such as :array, :dict-entry, etc."
+  (cons :array
+       (let (first-one)
+         (mapc (lambda (x)
+                 (setq first-one (cons :dict-entry first-one))
+                 (setq first-one
+                       (cons (cons :string
+                                   (cons (car x)
+                                         (cons (cons :array
+                                                     (let (this-one)
+                                                       (mapc (lambda (y)
+                                                               (setq this-one
+                                                                     (cons :dict-entry this-one))
+                                                               (setq this-one
+                                                                     (cons (list :string (car y)
+                                                                                 :variant
+                                                                                 (if (string= (car y) "ssid")
+                                                                                     (cons (dbus-string-to-byte-array
+                                                                                            (dbus-byte-array-to-string (car (cadr y))))
+                                                                                           nil)
+                                                                                   (cadr y)))
+                                                                           this-one)))
+                                                             (cadr x))
+                                                       (nreverse this-one))) nil)))
+                             first-one)))
+               settings)
+         (nreverse first-one))))
+
+(defun enwc-nm-create-settings (wired ssid)
+  (let ((uuid (enwc-nm-gen-uuid))
+       (id (concat ssid " settings"))
+       type
+       ret-list
+       conn-list
+       ipv4-list ipv6-list
+       mod-list
+       new-ssid
+       80211-list)
+
+    (if (not wired)
+       (setq new-ssid (dbus-string-to-byte-array ssid))
+       (progn
+         (setq 80211-list `("802-11-wireless" (("security" (nil))
+                                               ("ssid" (,new-ssid))
+                                               ("mode" ("infrastructure")))))
+
+         (setq ret-list (append ret-list (list 80211-list))
+               type "802-11-wireless"))
+      (setq type "802-3-ethernet"))
+    (setq conn-list `("connection" (("id" (,id))
+                                   ("uuid" (,uuid))
+                                   ("autoconnect" (nil))
+                                   ("type" (,type)))))
+
+    (setq ipv4-list '("ipv4" (("addresses" (nil))
+                             ("dns" (nil))
+                             ("method" ("auto"))
+                             ("routes" (nil)))))
+
+    (setq ipv6-list '("ipv4" (("addresses" (nil))
+                             ("dns" (nil))
+                             ("method" ("auto"))
+                             ("routes" (nil)))))
+
+    (setq ret-list (append ret-list (list conn-list)))
+    (setq ret-list (append ret-list (list ipv4-list)))
+    (setq ret-list (append ret-list (list ipv6-list)))
+    ))
+
+(defun enwc-nm-setup-settings (wired id settings)
+  "Sets up NetworkManager settings.
+Gets the current network properties of network ID
+and uses the information in the association list SETTINGS
+to put it in the form that NetworkManager will recognize."
+  (print settings)
+  (let (ssid uuid conn props)
+
+    (if (not enwc-nm-edit-info)
+       (progn
+         (setq ssid
+               (enwc-nm-get-wireless-network-property (nth id
+                                                           enwc-access-points)
+                                                      "Ssid"))
+         (setq props (enwc-nm-create-settings wired ssid)))
+      (setq props enwc-nm-edit-info))
+
+    (print enwc-nm-edit-info)
+         ;; (setq uuid (enwc-nm-get-uuid-by-ssid ssid))
+         ;; (if uuid
+         ;;     (setq conn (enwc-nm-get-conn-by-uuid uuid)))))
+
+    ;; (setq props
+    ;;           (if conn
+    ;;               (enwc-nm-get-settings (enwc-nm-get-conn-by-nid id))
+    ;;             (enwc-nm-create-settings wired ssid)))
+
+    (setcdr (assoc "type" (cadr (assoc "connection" props)))
+           (list (list (cond (wired "802-3-ethernet")
+                             ((not wired) "802-11-wireless")))))
+
+    (if (= (length (cdr (assoc "addr" settings))) 0)
+       (setcdr (assoc "addresses" (cadr (assoc "ipv4" props)))
+               (cons (cons nil nil) nil))
+
+      (setcdr (assoc "addresses" (cadr (assoc "ipv4" props)))
+             (list (list (list (list (enwc-nm-addr-back
+                                      (cdr (assoc "addr" settings)))
+                                     (enwc-nm-netmask-to-prefix (enwc-nm-addr-back
+                                                                 (cdr (assoc "netmask"
+                                                                             settings))))
+                                     (enwc-nm-addr-back
+                                      (cdr (assoc "gateway" settings)))))))))
+
+    (if (= (length (cdr (assoc "dns1" settings))) 0)
+       (setcdr (assoc "dns" (cadr (assoc "ipv4" props)))
+               (cons (cons nil nil) nil))
+      (setcdr (assoc "dns" (cadr (assoc "ipv4" props)))
+             (list (list (list (enwc-nm-addr-back
+                                (cdr (assoc "dns1" settings)))
+                               (enwc-nm-addr-back
+                                (cdr (assoc "dns2" settings))))))))
+
+    (setq props (enwc-nm-process-enctype settings props))
+    (print props)
+
+    (enwc-nm-finalize-settings props)))
+
+(defun enwc-nm-save-nw-settings (wired id settings)
+  "Saves network settings.
+ID is the network id of the profile to save,
+WIRED denotes whether or not this is a wired profile,
+and SETTINGS is the list of settings."
+  (let ((mod-sets (enwc-nm-setup-settings wired id settings)))
+    (print mod-sets)
+    (print id)
+    (dbus-call-method :system
+                     enwc-nm-dbus-service
+                     ;;(nth id enwc-access-points)
+                     (enwc-nm-get-conn-by-nid id)
+                     enwc-nm-dbus-connections-interface
+                     (if (not enwc-nm-edit-info)
+                         "AddConnection"
+                       "Update")
+                     :timeout 25000
+                     :array mod-sets)
+    ))
+
+(defun enwc-nm-setup ()
+  (setq enwc-nm-wired-dev (enwc-nm-get-device-by-name enwc-wired-device)
+       enwc-nm-wireless-dev (enwc-nm-get-device-by-name enwc-wireless-device))
+
+  (dbus-register-signal :system
+                       enwc-nm-dbus-service
+                       enwc-nm-wireless-dev
+                       enwc-nm-dbus-wireless-interface
+                       "AccessPointAdded"
+                       'enwc-process-scan)
+
+  (dbus-register-signal :system
+                       enwc-nm-dbus-service
+                       enwc-nm-wireless-dev
+                       enwc-nm-dbus-wireless-interface
+                       "AccessPointRemoved"
+                       'enwc-process-scan)
+
+  (setq enwc-nm-active-ap
+       (let ((cur-net (dbus-get-property :system
+                                         enwc-nm-dbus-service
+                                         enwc-nm-wireless-dev
+                                         enwc-nm-dbus-wireless-interface
+                                         "ActiveAccessPoint")))
+         (if (string= cur-net "/")
+             "/"
+           cur-net)))
+
+  (dbus-register-signal :system
+                       enwc-nm-dbus-service
+                       enwc-nm-wireless-dev
+                       enwc-nm-dbus-wireless-interface
+                       "PropertiesChanged"
+                       'enwc-nm-wireless-prop-changed)
+
+  (setq enwc-nm-connecting-p
+       (let ((state (dbus-get-property :system
+                                       enwc-nm-dbus-service
+                                       enwc-nm-dbus-path
+                                       enwc-nm-dbus-interface
+                                       "State")))
+         (eq state 40)))
+
+  (dbus-register-signal :system
+                       enwc-nm-dbus-service
+                       enwc-nm-wired-dev
+                       enwc-nm-dbus-device-interface
+                       "StateChanged"
+                       'enwc-nm-dev-prop-changed)
+
+  (setq enwc-nm-wired-p
+       (let ((state (dbus-get-property :system
+                                       enwc-nm-dbus-service
+                                       enwc-nm-wired-dev
+                                       enwc-nm-dbus-device-interface
+                                       "State")))
+         (eq state 100)))
+  (dbus-register-signal :system
+                       enwc-nm-dbus-service
+                       enwc-nm-dbus-path
+                       enwc-nm-dbus-interface
+                       "StateChanged"
+                       'enwc-nm-prop-changed)
+  )
+
+
+(provide 'enwc-nm)
+
+;;; End of File.
diff --git a/packages/enwc/enwc-pkg.el b/packages/enwc/enwc-pkg.el
new file mode 100644 (file)
index 0000000..6bd4b8f
--- /dev/null
@@ -0,0 +1 @@
+(define-package "enwc" "1.0" "The Emacs Network Client")
diff --git a/packages/enwc/enwc-setup.el b/packages/enwc/enwc-setup.el
new file mode 100644 (file)
index 0000000..e88dc03
--- /dev/null
@@ -0,0 +1,119 @@
+;; enwc-setup.el - Setup routines for ENWC
+
+;; Copyright (C) 2012,2013 Free Software Foundation, Inc.
+
+;; Author: Ian Dunn
+;; Keywords: enwc, network, wicd, manager, nm
+
+;; This file is part of ENWC
+
+;; ENWC 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, or (at your option)
+;; any later version.
+
+;; ENWC 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 ENWC; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+
+(require 'enwc)
+(require 'enwc-wicd)
+(require 'enwc-nm)
+
+(defun enwc-setup-backend (cur-back)
+  "Sets up ENWC to use the correct function for the backend CUR-BACK."
+  (let ((sym-name (symbol-name cur-back)))
+    (setq enwc-scan-func (intern (concat "enwc-"
+                                        sym-name
+                                        "-scan"))
+         enwc-get-nw-func (intern (concat "enwc-"
+                                          sym-name
+                                          "-get-networks"))
+         enwc-get-wireless-nw-prop-func (intern (concat "enwc-"
+                                                        sym-name
+                                                        "-get-wireless-network-property"))
+         enwc-get-wireless-nw-props-func (intern (concat "enwc-"
+                                                         sym-name
+                                                         "-get-wireless-nw-props"))
+         enwc-details-list (symbol-value (intern (concat "enwc-"
+                                                         sym-name
+                                                         "-details-list")))
+         enwc-get-encryption-type-func (intern (concat "enwc-"
+                                                       sym-name
+                                                       "-get-encryption-type"))
+         enwc-wireless-connect-func (intern (concat "enwc-"
+                                                    sym-name
+                                                    "-connect"))
+         enwc-get-current-nw-id-func (intern (concat "enwc-"
+                                                     sym-name
+                                                     "-get-current-nw-id"))
+         enwc-check-connecting-func (intern (concat "enwc-"
+                                                    sym-name
+                                                    "-check-connecting"))
+         enwc-get-wired-profiles-func (intern (concat "enwc-"
+                                                      sym-name
+                                                      "-get-wired-profiles"))
+         enwc-is-wired-func (intern (concat "enwc-"
+                                            sym-name
+                                            "-is-wired"))
+         enwc-wired-connect-func (intern (concat "enwc-"
+                                                 sym-name
+                                                 "-wired-connect"))
+         enwc-wired-disconnect-func (intern (concat "enwc-"
+                                                    sym-name
+                                                    "-wired-disconnect"))
+         enwc-get-sec-types-func (intern (concat "enwc-"
+                                                 sym-name
+                                                 "-get-sec-types"))
+         enwc-get-ip-addr-func (intern (concat "enwc-"
+                                               sym-name
+                                               "-get-ip-addr"))
+         enwc-get-netmask-func (intern (concat "enwc-"
+                                               sym-name
+                                               "-get-netmask"))
+         enwc-get-gateway-func (intern (concat "enwc-"
+                                               sym-name
+                                               "-get-gateway"))
+         enwc-get-dns-func (intern (concat "enwc-"
+                                           sym-name
+                                           "-get-dns"))
+         enwc-get-nw-info-func (intern (concat "enwc-"
+                                               sym-name
+                                               "-get-nw-info"))
+         enwc-save-nw-settings-func (intern (concat "enwc-"
+                                                    sym-name
+                                                    "-save-nw-settings"))
+         )
+    (funcall (intern (concat "enwc-" sym-name "-setup")))))
+
+(defun enwc-setup ()
+  "Sets up ENWC.
+This setups ENWC and confirms that one of the backends can be found
+on D-Bus."
+  (setq global-mode-string (append global-mode-string
+                                  '(enwc-display-string)))
+  (run-at-time t 1 'enwc-update-mode-line)
+
+  (let ((cur-back nil)
+       (back-list enwc-backends))
+    (while (and back-list (not cur-back))
+      (setq cur-back (pop back-list))
+      (if (not (dbus-ping :system
+                         (symbol-value (intern (concat "enwc-"
+                                                       (symbol-name cur-back)
+                                                       "-dbus-service")))))
+         (setq cur-back nil)))
+    (if cur-back
+       (enwc-setup-backend cur-back)
+      (error "No usable backend found."))))
+
+(provide 'enwc-setup)
+
+;;; End of File.
diff --git a/packages/enwc/enwc-wicd.el b/packages/enwc/enwc-wicd.el
new file mode 100644 (file)
index 0000000..c8eeb61
--- /dev/null
@@ -0,0 +1,355 @@
+;;; enwc-wicd.el --- The Wicd backend to ENWC
+
+;; Copyright (C) 2012,2013 Free Software Foundation, Inc.
+
+;; Author: Ian Dunn
+;; Keywords: enwc, network, wicd, manager, nm
+
+;; This file is part of ENWC
+
+;; ENWC 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, or (at your option)
+;; any later version.
+
+;; ENWC 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 ENWC; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+
+;;; Commentary:
+;; TODO
+
+(require 'enwc)
+
+(defgroup enwc-wicd nil
+  "*Wicd variables for ENWC."
+  :prefix "enwc-wicd-"
+  :group 'enwc)
+
+(defcustom enwc-wicd-dbus-service "org.wicd.daemon"
+  "The wicd D-Bus service identifier."
+  :group 'enwc-wicd
+  :type 'string)
+
+(defcustom enwc-wicd-dbus-wireless-path "/org/wicd/daemon/wireless"
+  "The wicd wireless D-Bus path."
+  :group 'enwc-wicd
+  :type 'string)
+
+(defcustom enwc-wicd-dbus-wireless-interface "org.wicd.daemon.wireless"
+  "The wicd wireless D-Bus interface."
+  :group 'enwc-wicd
+  :type 'string)
+
+(defcustom enwc-wicd-dbus-wired-path "/org/wicd/daemon/wired"
+  "The wicd wired D-Bus path."
+  :group 'enwc-wicd
+  :type 'string)
+
+(defcustom enwc-wicd-dbus-wired-interface "org.wicd.daemon.wired"
+  "The wicd wired D-Bus interface."
+  :group 'enwc-wicd
+  :type 'string)
+
+(defvar enwc-wicd-details-list
+  '("essid" "bssid" "quality" "encryption" "mode" "channel")
+  "The list of the desired details to be obtained from each network.")
+
+(defvar enwc-wicd-current-ap "")
+
+(defvar enwc-wicd-current-nw-id -1)
+
+(defun enwc-wicd-dbus-wireless-call-method (method &rest args)
+  "Calls D-Bus method METHOD with arguments ARGS within
+the wicd wireless interface."
+  (apply 'dbus-call-method :system
+        enwc-wicd-dbus-service
+        enwc-wicd-dbus-wireless-path
+        enwc-wicd-dbus-wireless-interface
+        method
+        :timeout 25000
+        args))
+
+(defun enwc-wicd-dbus-wired-call-method (method &rest args)
+  "Calls D-Bus method METHOD with arguments ARGS within
+the wicd wired interface."
+  (apply 'dbus-call-method :system
+        enwc-wicd-dbus-service
+        enwc-wicd-dbus-wired-path
+        enwc-wicd-dbus-wired-interface
+        method
+        :timeout 25000
+        args))
+
+(defun enwc-wicd-scan ()
+  "Wicd scan function."
+  (enwc-wicd-dbus-wireless-call-method "Scan"))
+
+(defun enwc-wicd-get-networks ()
+  "Wicd get networks function.  Just returns a number sequence."
+  (number-sequence 0 (1- (enwc-wicd-dbus-wireless-call-method "GetNumberOfNetworks"))))
+
+(defvar enwc-wicd-prop-values nil)
+(defvar enwc-wicd-prop-num 0)
+
+(defun enwc-wicd-nw-prop-handler (&rest args)
+  (setq enwc-wicd-prop-values (cons args enwc-wicd-prop-values))
+  (setq enwc-wicd-prop-num (1+ enwc-wicd-prop-num)))
+
+(defun enwc-wicd-get-wireless-network-property (id prop)
+  "Wicd get wireless network property function.
+This calls the D-Bus method on Wicd to get the property PROP
+from wireless network with id ID."
+  (dbus-call-method-asynchronously :system
+                                  enwc-wicd-dbus-service
+                                  enwc-wicd-dbus-wireless-path
+                                  enwc-wicd-dbus-wireless-interface
+                                  "GetWirelessProperty"
+                                  'enwc-wicd-nw-prop-handler
+                                  :int32 id
+                                  :string prop)
+
+  ;;(enwc-wicd-dbus-wireless-call-method "GetWirelessProperty" id prop)
+  )
+
+(defun enwc-wicd-build-prop-list (prop-list det-list)
+  (let (ret
+       (act-det-list (reverse det-list)))
+    (while prop-list
+      (let ((cur-prop (pop prop-list))
+           (cur-det (pop act-det-list)))
+       (setq ret (append ret (cons (cons cur-det (car cur-prop)) nil)))
+       ))
+    ret))
+
+(defun enwc-wicd-get-wireless-nw-props (id)
+  (setq enwc-wicd-prop-values nil)
+  (setq enwc-wicd-prop-num 0)
+  (mapc (lambda (x)
+           (enwc-wicd-get-wireless-network-property id x))
+         enwc-wicd-details-list)
+  ;; Wait for less than a second.
+  (while (< enwc-wicd-prop-num 6)
+    (read-event nil nil 0.001))
+  (enwc-wicd-build-prop-list enwc-wicd-prop-values enwc-wicd-details-list))
+
+(defun enwc-wicd-get-encryption-type (id)
+  "Wicd get encryption type function.
+This calls the D-Bus method on Wicd to get the encryption_method
+property from wireless network with id ID."
+  (enwc-wicd-dbus-wireless-call-method "GetWirelessProperty"
+                                      id "encryption_method"))
+
+(defun enwc-wicd-connect (id)
+  "Wicd connect function.
+This calls the D-Bus method on Wicd to connect to wireless
+network with id ID."
+  (enwc-wicd-dbus-wireless-call-method "ConnectWireless" id))
+
+(defun enwc-wicd-get-current-nw-id (wired)
+  "Wicd get current network id function.
+This calls the D-Bus method on Wicd to get the current
+wireless network id."
+  ;;(enwc-wicd-dbus-wireless-call-method "GetCurrentNetworkID"))
+  (if wired
+      -1
+    enwc-wicd-current-nw-id))
+
+(defun enwc-wicd-check-connecting ()
+  "The Wicd check connecting function."
+  (enwc-wicd-dbus-wireless-call-method "CheckIfWirelessConnecting"))
+
+(defun enwc-wicd-disconnect ()
+  "Wicd disconnect function."
+  (enwc-wicd-dbus-wireless-call-method "DisconnectWireless"))
+
+(defun enwc-wicd-get-wired-profiles ()
+  "Gets the list of wired network profiles."
+  (enwc-wicd-dbus-wired-call-method "GetWiredProfileList"))
+
+(defun enwc-wicd-wired-connect (id)
+  "Connects to the wired network with profile id ID."
+  (let* ((profs (enwc-get-wired-profiles))
+        (prf (nth id profs)))
+    (enwc-wicd-dbus-wired-call-method "ReadWiredNetworkProfile" prf)
+    (enwc-wicd-dbus-wired-call-method "ConnectWired")))
+
+(defun enwc-wicd-wired-disconnect ()
+  "Disconnects from the wired connection."
+  (enwc-wicd-dbus-wired-call-method "DisconnectWired"))
+
+(defun enwc-wicd-is-wired ()
+  "Checks to see if wired is connected."
+  (not (not (enwc-wicd-dbus-wired-call-method "GetWiredIP"))))
+
+(defun enwc-wicd-get-wired-nw-prop (id det)
+  "Gets property DET from the wired network with id ID."
+  (enwc-wicd-dbus-wired-call-method "GetWiredProperty" id det))
+
+;; Each entry in sec-types should be:
+;; ("IDENT" (("Name" . "NAME") ("reqs" . (("key1" . "Entry1") ("key2" . "Entry2") ... ))))
+;; Where:
+;;  "IDENT" => String that identifies this to the backend.
+;;  "NAME" => String that ENWC displays
+;;  "reqs" => Constant string, but the association list holds entries
+;;              required by the security type, i.e. user, passphrase, etc.
+;;  "keyXX" => String that the backend uses for this security entry.
+;;  "EntryXX" => String that ENWC displays for this security entry.
+
+(defun enwc-wicd-get-sec-types (wired)
+  "Gets the list of security types.
+WIRED indicates whether this is a wired connection.
+The returned list will be in the format:
+ (name . ((\"Name\" . \"DISPLAY-NAME\")
+          (\"reqs\" . ((\"Display\" . \"id\") ...))))"
+  (let (sec-types
+       ret-list)
+    (with-temp-buffer
+      (insert-file-contents (concat "/etc/wicd/encryption/templates/active"
+                                   (if wired
+                                       "_wired")))
+      (setq sec-types (split-string (buffer-string) "\n")))
+    (setq ret-list
+         (mapcar (lambda (x)
+                   (if (not (eq (length x) 0))
+                       (let (name reqs)
+                         (with-temp-buffer
+                           (insert-file-contents (concat "/etc/wicd/encryption/templates/"
+                                                         x))
+                           (re-search-forward "name[ \t]*=[ \t]*\\([^\n]*\\)[\n]")
+                           (setq name (match-string 1))
+                           (re-search-forward "require[ \t]*\\([^\n]*\\)[\n]")
+                           (let ((str-reqs (split-string (match-string 1) " ")))
+                             (while str-reqs
+                               (setq reqs
+                                     (append reqs
+                                             (cons (cons (pop str-reqs)
+                                                         (pop str-reqs))
+                                                   nil)))))
+                           (cons x (cons (cons "Name" name) (cons (cons "reqs" (cons reqs nil)) nil)))
+                           ))))
+                 sec-types))))
+
+(defun enwc-wicd-get-profile-ent (wired id ent)
+  "Gets profile entry ENT from the network with id ID.
+WIRED is set to indicate whether this is a wired network.
+This function is a wrapper around the *-get-(wired|wireless)-nw-prop
+functions, allowing for a single function that checks for wired."
+  (if wired
+      (enwc-wicd-get-wired-nw-prop id ent)
+    (enwc-wicd-dbus-wireless-call-method "GetWirelessProperty" id ent)))
+
+(defun enwc-wicd-get-nw-info (wired id)
+  (let ((dns-list (enwc-wicd-get-dns wired id)))
+    (list (cons (cons "addr" (enwc-wicd-get-ip-addr wired id)) nil)
+         (cons (cons "netmask" (enwc-wicd-get-netmask wired id)) nil)
+         (cons (cons "gateway" (enwc-wicd-get-gateway wired id)) nil)
+         (cons (cons "dns1" (nth 0 dns-list)) nil)
+         (cons (cons "dns2" (nth 1 dns-list)) nil))))
+
+(defun enwc-wicd-get-ip-addr (wired id)
+  "Gets the IP Address from the network with id ID.
+Wired is set to indicate whether this is a wired network."
+  (or (enwc-wicd-get-profile-ent wired id "ip") ""))
+
+(defun enwc-wicd-get-netmask (wired id)
+  "Gets the Netmask from the network with id ID.
+WIRED is set to indicate whether this is a wired network."
+  (or (enwc-wicd-get-profile-ent wired id "netmask") ""))
+
+(defun enwc-wicd-get-gateway (wired id)
+    "Gets the Gateway from the network with id ID.
+WIRED is set to indicate whether this is a wired network."
+  (or (enwc-wicd-get-profile-ent wired id "gateway") ""))
+
+(defun enwc-wicd-get-dns (wired id)
+    "Gets the list of DNS servers from the network with id ID.
+WIRED is set to indicate whether this is a wired network."
+  (list (or (enwc-wicd-get-profile-ent wired id "dns1") "")
+       (or (enwc-wicd-get-profile-ent wired id "dns2") "")
+       (or (enwc-wicd-get-profile-ent wired id "dns3") "")))
+
+(defun enwc-wicd-set-nw-prop (wired id prop val)
+  "Sets the network property PROP of the network with id ID
+to VAL.
+WIRED indicates whether this is a wired network."
+  (if wired
+      (enwc-wicd-dbus-wired-call-method "SetWiredProperty"
+                                       id prop val)
+    (enwc-wicd-dbus-wireless-call-method "SetWirelessProperty"
+                                        id prop val)))
+
+(defun enwc-wicd-save-nw-profile (wired id)
+  "Save the network profile with for the network with id ID.
+WIRED indicates whether this is a wired network."
+  (if wired
+      (enwc-wicd-dbus-wired-call-method "SaveWiredNetworkProfile" id)
+    (enwc-wicd-dbus-wireless-call-method "SaveWirelessNetworkProfile" id)))
+
+(defun enwc-wicd-save-nw-settings (wired id settings)
+  "Saves the settings indicated by the association list SETTINGS for
+the network with id ID."
+  (let ((enctype (cdr (assoc "enctype" settings))))
+
+    (enwc-wicd-set-nw-prop wired id "ip"
+                          (cdr (assoc "addr" settings)))
+    (enwc-wicd-set-nw-prop wired id "netmask"
+                          (cdr (assoc "netmask" settings)))
+    (enwc-wicd-set-nw-prop wired id "gateway"
+                          (cdr (assoc "gateway" settings)))
+
+    (enwc-wicd-set-nw-prop wired id "dns1"
+                          (cdr (assoc "dns1" settings)))
+    (enwc-wicd-set-nw-prop wired id "dns2"
+                          (cdr (assoc "dns2" settings)))
+
+    (enwc-wicd-set-nw-prop wired id "enctype" enctype)
+    (if (not (string= enctype "None"))
+       (dolist (x (cadr (assoc "reqs"
+                               (cdr (assoc enctype
+                                           (enwc-wicd-get-sec-types wired))))))
+         (enwc-wicd-set-nw-prop wired id (car x)
+                                (cdr (assoc (car x) settings)))))
+    (enwc-wicd-save-nw-profile wired id))
+  )
+
+(defun enwc-wicd-wireless-prop-changed (state info)
+  (if state
+      (if (eq state 0)
+         (setq enwc-wicd-current-ap ""
+               enwc-wicd-current-nw-id -1)
+       (setq enwc-wicd-current-ap (car (cadr info))
+             enwc-wicd-current-nw-id (or (and info
+                                              (nthcdr 3 info)
+                                              (caar (nthcdr 3 info))
+                                              (string-to-number (caar (nthcdr 3 info))))
+                                         -1)))
+  ))
+
+(defun enwc-wicd-setup ()
+  ;; Thanks to Michael Albinus for pointing out this signal.
+  (dbus-register-signal :system
+                       enwc-wicd-dbus-service
+                       enwc-wicd-dbus-wireless-path
+                       enwc-wicd-dbus-wireless-interface
+                       "SendEndScanSignal"
+                       'enwc-process-scan)
+
+  (dbus-register-signal :system
+                       enwc-wicd-dbus-service
+                       "/org/wicd/daemon"
+                       enwc-wicd-dbus-service
+                       "StatusChanged"
+                       'enwc-wicd-wireless-prop-changed)
+  )
+
+(provide 'enwc-wicd)
+
+;;; End of File
diff --git a/packages/enwc/enwc.el b/packages/enwc/enwc.el
new file mode 100644 (file)
index 0000000..69517ca
--- /dev/null
@@ -0,0 +1,1003 @@
+;;; enwc.el --- The Emacs Network Client
+
+;; Copyright (C) 2012,2013 Free Software Foundation, Inc.
+
+;; Author: Ian Dunn
+;; Keywords: enwc, network, wicd, manager, nm
+
+;; This file is part of ENWC
+
+;; ENWC 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, or (at your option)
+;; any later version.
+
+;; ENWC 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 ENWC; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;; connect
+;; disconnect
+;; scan
+;; get-prop
+;; save-profile
+;; get-networks
+;; check-connecting
+;; get-current-nw-id
+
+;;; Commentary:
+;; In order to use this, add
+;;
+;; (require 'enwc-setup)
+;; (enwc-setup)
+;; 
+;; to your .emacs file.
+
+(require 'dbus)
+(require 'wid-edit)
+(require 'tabulated-list)
+
+;;; Code:
+
+(eval-when-compile
+  (require 'cl))
+
+(defgroup enwc nil
+  "*The Emacs Network Client"
+  :prefix "ewnc-"
+  :group 'applications)
+
+(defcustom enwc-wireless-device "wlan0"
+  "The wireless device to use for ENWC."
+  :group 'enwc
+  :type 'string)
+
+(defcustom enwc-wired-device "eth0"
+  "The wired device to use for ENWC."
+  :group 'enwc
+  :type 'string)
+
+(defcustom enwc-backends '(wicd nm)
+  "The list of backends to be used by ENWC.
+These will be checked in the order designated here,
+and the first active backend found will be used."
+  :group 'enwc
+  :type 'list)
+
+;;; The function variables for the abstract layer.
+
+(defvar enwc-scan-func nil
+  "The function variable for the scan function.
+This variable is set during setup.")
+
+(defvar enwc-get-nw-func nil
+  "A function variable to be used in `enwc-get-nw'.
+This is redefined during setup to be the function to get the network
+ list.")
+
+(defvar enwc-get-wireless-nw-prop-func nil
+  "A function variable to be used in `enwc-get-wireless-nw-prop'.
+This is redefined during setup to be the function to get
+a wireless network property.")
+
+(defvar enwc-get-wireless-nw-props-func nil)
+
+(defvar enwc-get-encryption-type-func nil
+  "A function variable to be used in `enwc-get-encryption-type'.
+This is redefined during setup to be the function to get the encryption
+type for the selected backend.")
+
+(defvar enwc-wireless-connect-func nil
+  "The function variable for the wireless connect function.
+This is redefined during setup to be the function to connect
+for the selected backend.")
+
+(defvar enwc-get-current-nw-id-func nil
+  "The function variable to be used in `enwc-get-current-nw-id'.
+This is redefined during setup to be the function to get
+the current network id.")
+
+(defvar enwc-check-connecting-func nil
+  "The function variable to be used in `enwc-check-connecting'.
+This is redefined during setup to be the function to
+check whether or not ENWC is connecting.")
+
+(defvar enwc-wireless-disconnect-func nil
+  "The function variable for the wireless disconnect function.
+This is redefined during setup to be the function to
+disconnect from the wireless network.")
+
+(defvar enwc-get-wired-profiles-func nil
+  "The function variable to be used in `enwc-get-wired-profiles'.
+This is redefined during setup to be the function to
+get the list of wired network profiles.")
+
+(defvar enwc-wired-connect-func nil
+  "The function variable for the wired connect function.
+This is redefined during setup to be the function
+to connect to a wired network.")
+
+(defvar enwc-wired-disconnect-func nil
+  "The function variable for the wired disconnect function.
+This is redefined during setup to be the function
+to disconnect from a wired network.")
+
+(defvar enwc-is-wired-func nil
+  "The function variable to be used in `enwc-is-wired'.
+This is redefined during setup to be the function to
+check whether or not a wired connection is active.")
+
+(defvar enwc-get-wired-nw-prop-func nil
+  "The function variable to be used in `enwc-get-wired-nw-prop'.
+This is redefined during setup to be the function to get
+a network property from a wired network.")
+
+(defvar enwc-get-sec-types-func nil
+  "The function variable to be used in `enwc-get-sec-types'.
+This is redefined during setup to be the function to get
+the security types for a given network.")
+
+(defvar enwc-get-ip-addr-func nil
+  "The function variable to be used in `enwc-get-ip-addr'.
+This is redefined during setup to be the function to get
+the IP Address of a given network.")
+
+(defvar enwc-get-netmask-func nil
+  "The function variable to be used in `enwc-get-netmask'.
+This is redefined during setup to be the function to get
+the Netmask of a given network.")
+
+(defvar enwc-get-gateway-func nil
+  "The function variable to be used in `enwc-get-gateway'.
+This is redefined during setup to be the function to get
+the Gateway of a given network.")
+
+(defvar enwc-get-dns-func nil
+  "The function variable to be used in `enwc-get-dns'.
+This is redefined during setup to be the function to get
+the DNS Server Addresses for a given network.")
+
+(defvar enwc-get-nw-info-func nil)
+
+(defvar enwc-save-nw-settings-func nil
+  "The function variable to be used in `enwc-save-nw-settings'.
+This is redefined during setup to be the function to save
+the network settings of a given network.")
+
+(defvar enwc-details-list nil
+  "The network details list.
+
+This is redefined during setup to be the details list
+for the selected backend.
+
+This usually includes signal strength, essid, encryption type,
+bssid, mode, and channel.")
+
+(defvar enwc-display-string " [0%] "
+  "The mode line display string.
+This is altered every second to display the current network strength
+in `enwc-update-mode-line'.")
+
+;; (setq tabulated-list-format (vector `("ID" ,enwc-id-width sort) ...))
+;; (setq tabulated-list-entries `((,id [id str essid encrypt ...]) ...))
+;; (tabulated-list-init-header)
+;; (tabulated-list-print)
+
+(defvar enwc-wireless-headers '("ID" "STR" "ESSID"
+                               "ENCRYPT" "BSSID" "MODE" "CHNL")
+  "The list of headers to be displayed in the ENWC buffer.
+These correspond to the details in `enwc-details-list'.")
+
+(defvar enwc-id-width 3
+  "The width of the id column.")
+(defvar enwc-str-width 5
+  "The width of the strength column.")
+(defvar enwc-essid-width 5
+  "The initial width of the essid column.
+This is reset in wicd-scan-internal.")
+(defvar enwc-encrypt-width 10
+  "The width of the encryption column.")
+(defvar enwc-bssid-width 18
+  "The width of the bssid column.")
+(defvar enwc-mode-width 16
+  "The width of the mode column.")
+(defvar enwc-chnl-width 3
+  "The width of the channel column.")
+
+(defvar enwc-last-scan nil
+  "The most recent scan results.")
+
+(defvar enwc-access-points nil
+  "The most recent access point list.")
+
+(defvar enwc-using-wired nil
+  "Whether or not wired mode is active.
+
+This is `non-NIL' if ENWC is using wired connections.
+Note that this is NOT the same as `enwc-is-wired'.  This checks
+whether or not ENWC is in wired mode.")
+
+(defvar enwc-scan-done nil
+  "Whether or not a scan is finished.")
+
+(defvar enwc-edit-id nil
+  "This is the network id of the network being edited.")
+
+(defvar enwc-scan-requested nil)
+
+(defvar enwc-scan-interactive nil)
+
+(make-local-variable 'enwc-edit-id)
+;; The Fonts
+
+(defface enwc-header-face
+  '((((class color) (background light))
+     (:foreground "Blue"))
+    (((class color) (background dark))
+     (:foreground "Blue"))
+    (t (:background "Blue")))
+  "The face for the headers."
+  :group 'enwc)
+
+(defface enwc-connected-face
+  '((((class color) (background dark))
+     (:foreground "Green"))
+    (((class color) (background light))
+     (:foreground "Green"))
+    (t (:background "Green")))
+  "The face for the connected network."
+  :group 'enwc)
+
+
+;; Small helper function.
+
+(defun enwc-detail-to-ident (detail)
+  "Converts detail DETAIL to a constant identifier."
+  (case (intern detail)
+    ((essid Ssid) "essid")
+    ((bssid HwAddress) "bssid")
+    ((quality Strength) "quality")
+    ((encryption Flags) "encryption")
+    ((mode Mode) "mode")
+    ((channel Frequency) "channel")))
+
+;;;;;;;;;;;;;;;;;;;;
+;; ENWC functions
+;;;;;;;;;;;;;;;;;;;;
+
+(defun enwc-do-scan ()
+  "Runs a backend scan."
+  (funcall enwc-scan-func))
+
+(defun enwc-get-nw ()
+  "Gets the identifiers for the access points
+from a previous scan."
+  (funcall enwc-get-nw-func))
+
+(defun enwc-get-current-nw-id ()
+  "Gets the id of the current network id,
+or `nil' if there isn't one."
+  (funcall enwc-get-current-nw-id-func enwc-using-wired))
+
+(defun enwc-check-connecting-p ()
+  "Checks to see if there is a connection
+in progress.  Returns `non-NIL' if there is one,
+`NIL' otherwise."
+  (funcall enwc-check-connecting-func))
+
+(defun enwc-get-wireless-nw-prop (id prop)
+  "Gets property PROP from wireless network with id
+ID and returns it."
+  (funcall enwc-get-wireless-nw-prop-func id prop))
+
+(defun enwc-get-wireless-nw-props (id)
+  (funcall enwc-get-wireless-nw-props-func id))
+
+(defun enwc-get-encryption-type (id)
+  "Gets the encryption type used by the wireless
+network with id ID."
+  (funcall enwc-get-encryption-type-func id))
+
+(defun enwc-get-wired-profiles ()
+  "Gets the list of wired profiles."
+  (funcall enwc-get-wired-profiles-func))
+
+(defun enwc-wireless-connect (id)
+  "Begins a connection to wireless network with
+id ID."
+  (funcall enwc-wireless-connect-func id))
+
+(defun enwc-wireless-disconnect ()
+  "Disconnects the wireless."
+  (funcall enwc-wireless-disconnect-func))
+
+(defun enwc-wired-connect (id)
+  "Connects to the wired profile with id ID."
+  (funcall enwc-wired-connect-func id))
+
+(defun enwc-wired-disconnect ()
+  "Disconnects from the current network."
+  (funcall enwc-wired-disconnect-func))
+
+(defun enwc-is-wired-p ()
+  "Checks whether or not ENWC is connected to
+a wired network.
+Note that this is NOT the same as `enwc-using-wired'.
+This checks for an active wired connection."
+  (funcall enwc-is-wired-func))
+
+(defun enwc-get-sec-types (wired)
+  "Gets the security types for network.
+WIRED is set to indicate whether or not this is
+a wired network."
+  (funcall enwc-get-sec-types-func wired))
+
+(defun enwc-get-network-ent (wired id ent)
+  "Gets network entry ENT from the network with network id ID.
+WIRED is set to indicate whether or not this is
+a wired network."
+  (if wired
+      nil
+    (enwc-get-wireless-nw-prop id ent)))
+
+(defun enwc-get-wired-nw-prop (id prop)
+  "Gets network property PROP from
+ the wired network with network id ID."
+  (funcall enwc-get-wired-nw-prop-func id prop))
+
+(defun enwc-get-ip-addr (wired id)
+  "Gets the IP Address from the network with network id ID.
+WIRED is set to indicate whether or not this is
+a wired network."
+  (funcall enwc-get-ip-addr-func wired id))
+
+(defun enwc-get-netmask (wired id)
+  "Gets the Netmask from the network with network id ID.
+WIRED is set to indicate whether or not this is
+a wired network."
+  (funcall enwc-get-netmask-func wired id))
+
+(defun enwc-get-gateway (wired id)
+  "Gets the Gateway from the network with network id ID.
+WIRED is set to indicate whether or not this is
+a wired network."
+  (funcall enwc-get-gateway-func wired id))
+
+(defun enwc-get-dns (wired id)
+  "Gets the DNS Servers from the network with network id ID.
+WIRED is set to indicate whether or not this is
+a wired network."
+  (funcall enwc-get-dns-func wired id))
+
+(defun enwc-get-nw-info (wired id)
+  (funcall enwc-get-nw-info-func wired id))
+
+(defun enwc-save-nw-settings (wired id settings)
+  "Saves network settings SETTINGS to the network profile with
+network id ID.
+SETTINGS is an association list with entries for the IP Address,
+Netmask, Gateway, DNS Servers, and Security.
+WIRED is set to indicate whether or not this is
+a wired network."
+  (funcall enwc-save-nw-settings-func wired id settings))
+
+;;;;;;;;;;;;;;;;;;;;;
+;; Actual Functions
+;;;;;;;;;;;;;;;;;;;;;
+
+(defun enwc-is-valid-nw-id (id)
+  "Confirms that ID is a valid network id."
+  (<= 0 id))
+
+(defun enwc-get-nw-prop (wired id prop)
+  "Small function to get network property PROP from the network
+with network id ID.
+WIRED indicates whether or not this is a wired connection."
+  (if wired
+      (enwc-get-wired-nw-prop id prop)
+    (enwc-get-wireless-nw-prop id prop)))
+
+(defun enwc-update-mode-line ()
+  "Updates the mode line with the current network strength.
+If no network is connected, then prints 0%.
+If wired is active, then prints 100%.
+If ENWC is in the process of connecting, then prints *%.
+This is initiated during setup, and runs once every second."
+ (let ((cur-id (enwc-get-current-nw-id))
+       (conn (enwc-check-connecting-p))
+       str)
+    (setq str
+         (if (enwc-is-wired-p)
+             100
+           (if (and
+                (enwc-is-valid-nw-id cur-id)
+                enwc-last-scan)
+               (cdr (assoc "quality" (nth cur-id enwc-last-scan)))
+             0)))
+    (setq enwc-display-string (concat " ["
+                                     (if conn
+                                         "*"
+                                       (number-to-string str))
+                                     "%] "))))
+
+;;;;;;;;;;;;;;;;;;
+;; Scan internal
+;;;;;;;;;;;;;;;;;;
+
+(defun enwc-scan-internal-wireless ()
+  "The initial scan routine.
+This initiates a scan using D-Bus, then exits,
+waiting for the callback."
+  (message "Scanning...")
+  (setq enwc-scan-requested t)
+  (setq enwc-scan-done nil)
+  (enwc-do-scan))
+
+(defun enwc-process-scan (&rest args)
+  "The scanning callback.
+After a scan has been performed, this processes and displays
+the scan results."
+  (if (or enwc-using-wired (not enwc-scan-requested))
+      nil
+    (setq enwc-scan-requested nil)
+    (let ((cur-id 0))
+      (message "Scanning... Done")
+      (setq enwc-access-points (enwc-get-nw)
+           enwc-essid-width 5)
+      (setq enwc-last-scan
+           (mapcar (lambda (x)
+                     (let ((ret-itm (cons (cons "id" cur-id) nil))
+                           (prop-list (enwc-get-wireless-nw-props x)))
+                       (setq cur-id (1+ cur-id))
+                       (dolist (det enwc-details-list)
+                         (let ((cur-item (cdr (assoc det prop-list)))
+                               (ident (enwc-detail-to-ident det))
+                               pos-len)
+                           (if (string= ident "essid")
+                               (progn
+                                 (setq pos-len (length cur-item))
+                                 (setq enwc-essid-width
+                                       (max enwc-essid-width
+                                            pos-len))))
+                           (if (string= ident "encryption")
+                               (setq cur-item
+                                     (if cur-item
+                                         (enwc-get-encryption-type x)
+                                       "Unsecured")))
+                           (setq ret-itm (append ret-itm
+                                                 (cons (cons ident
+                                                             cur-item)
+                                                       nil)))))
+                       ret-itm))
+                   (number-sequence 0 (1- (length enwc-access-points))))))
+    (setq enwc-essid-width (1+ enwc-essid-width))
+    (setq enwc-scan-done t)
+    (if enwc-scan-interactive
+       (progn
+         (enwc-display-wireless-networks enwc-last-scan)
+         ;;(goto-char 0)
+         ;;(forward-line)
+         ))))
+
+(defun enwc-scan-internal-wired ()
+  "The scanning routine for a wired connection.
+This gets the list of wired network profiles."
+  (message "Updating Profiles...")
+  (let ((profs (enwc-get-wired-profiles))
+       cur-prof fin-profs)
+    (while profs
+      (setq cur-prof (pop profs))
+      (if cur-prof
+         (setq fin-profs (cons cur-prof
+                               fin-profs))))
+    (message "Updating Profiles... Done")
+    (setq enwc-access-points fin-profs)
+    (setq enwc-last-scan fin-profs)
+    fin-profs))
+
+(defun enwc-scan-internal ()
+  "The entry point for the internal scan routines.
+This checks whether or not wired is being used,
+ and runs the appropriate function."
+  (if enwc-using-wired
+      (enwc-scan-internal-wired)
+    (enwc-scan-internal-wireless)))
+
+;;;;;;;;;;;;;;;;;;;;;
+;; Display Networks
+;;;;;;;;;;;;;;;;;;;;;
+
+(defun enwc-display-wired-networks (networks)
+  "Displays the wired networks specified in the list NETWORKS.
+NETWORKS must be in the form returned from
+`enwc-scan-internal-wired'."
+  (if (not (listp networks))
+      (error "NETWORKS must be a list of networks."))
+  (let ((inhibit-read-only t))
+    (erase-buffer)
+    (insert (propertize "Profile" 'face 'enwc-header-face))
+    (insert "\n")
+    (dolist (pr networks)
+      (insert pr)
+      (insert "\n"))))
+
+(defun enwc-insert-ent (ent width)
+  "Small function to insert a network property entry.
+ENT is the entry, and WIDTH is the column width."
+  (insert ent)
+  (insert-char 32 (- width (length ent))))
+
+(defun enwc-display-wireless-networks (networks)
+  "Displays the networks in the list NETWORKS in the current buffer.
+NETWORKS must be in the format returned by
+`enwc-scan-internal-wireless'."
+  (if (not (eq major-mode 'enwc-mode))
+          (enwc-setup-buffer))
+  (if (not (listp networks))
+      (error "NETWORKS must be a list of association lists."))
+  (let (;;(inhibit-read-only t)
+       (cur-id (enwc-get-current-nw-id))
+       entries)
+    ;;(erase-buffer)
+    (let ((header enwc-wireless-headers)
+         (pos 0))
+
+      (setq tabulated-list-format
+           (vector '("ID" 2)
+                   '("STR" 4)
+                   `("ESSID" ,enwc-essid-width)
+                   '("ENCRYPT" 9)
+                   '("BSSID" 17)
+                   '("MODE" 15)
+                   '("CHNL" 2)))
+
+      ;; (dolist (hd header)
+      ;;       (insert (propertize hd 'face 'enwc-header-face))
+      ;;       (setq pos (length hd))
+      ;;       (insert-char 32 (- (symbol-value (intern (concat "enwc-"
+      ;;                                                        (downcase hd)
+      ;;                                                        "-width")))
+      ;;                          pos)))
+      )
+    ;;(insert "\n")
+
+    ;;TODO: Setup faces.
+    (dolist (nw networks)
+      (let ((id (cdr (assoc "id" nw)))
+           entry)
+       (setq entry (list nil
+                         (vector
+                          (number-to-string (cdr (assoc "id" nw)))
+                          (concat (number-to-string (cdr (assoc "quality" nw)))
+                                  "%")
+                          (cdr (assoc "essid" nw))
+                          (cdr (assoc "encryption" nw))
+                          (cdr (assoc "bssid" nw))
+                          (cdr (assoc "mode" nw))
+                          (cdr (assoc "channel" nw)))))
+       (setq entries (cons entry entries))))
+
+    (setq tabulated-list-entries (nreverse entries))
+    (tabulated-list-init-header)
+
+    ;; (dolist (nw networks)
+    ;;   (let* ((id (propertize (number-to-string (cdr (assoc "id" nw)))
+    ;;                              'width enwc-id-width))
+    ;;              (str (propertize (concat (number-to-string (cdr (assoc "quality"
+    ;;                                                                     nw)))
+    ;;                                       "%")
+    ;;                               'width enwc-str-width))
+    ;;              (essid (propertize (cdr (assoc "essid" nw))
+    ;;                                 'width enwc-essid-width))
+    ;;              (encrypt (propertize (cdr (assoc "encryption" nw))
+    ;;                                   'width enwc-encrypt-width))
+    ;;              (bssid (propertize (cdr (assoc "bssid" nw))
+    ;;                                 'width enwc-bssid-width))
+    ;;              (mode (propertize (cdr (assoc "mode" nw))
+    ;;                                'width enwc-mode-width))
+    ;;              (chnl (propertize (cdr (assoc "channel" nw))
+    ;;                                'width enwc-chnl-width))
+    ;;              props)
+
+    ;;         (setq props (list id str essid encrypt bssid mode chnl))
+
+    ;;         (dolist (ent props)
+    ;;           (if (eq (string-to-number id) cur-id)
+    ;;               (setq ent (propertize ent 'face 'enwc-connected-face)))
+    ;;           (enwc-insert-ent ent (get-text-property 0 'width ent)))
+    ;;         (insert "\n")))
+    (tabulated-list-print)
+    ))
+
+(defun enwc-display-networks (networks)
+  "Displays the network in NETWORKS.  This is an entry to the display
+functions, and checks whether or not ENWC is using wired."
+  (if (not (eq major-mode 'enwc-mode))
+      (enwc-setup-buffer))
+  (if (not (listp networks))
+      (error "NETWORKS must be a list."))
+  (if enwc-using-wired
+      (enwc-display-wired-networks networks)
+    (enwc-display-wireless-networks networks)))
+
+(defun enwc-scan ()
+  "The frontend of the scanning routine.  Sets up and moves to
+the ENWC buffer if necessary, and scans and displays the networks."
+  (interactive)
+  (setq enwc-scan-interactive t)
+  (if (not (eq major-mode 'enwc-mode))
+      (switch-to-buffer "*ENWC*"))
+  (if enwc-using-wired
+      (progn
+       (enwc-scan-internal)
+       ;;(enwc-display-networks enwc-last-scan)
+       (goto-char 0)
+       (forward-line))
+    (enwc-scan-internal)))
+  
+(defun enwc-find-network (essid &optional networks)
+  "Checks through NETWORKS for the network with essid ESSID,
+and returns the network identifier.  Uses `enwc-last-scan' if
+NETWORKS is nil.  If the network is not found, then it returns nil.
+
+   When called interactively, this only prints out what it finds.
+Otherwise, it actually returns it."
+  (interactive "sNetwork ESSID: ")
+  (if (not (or networks enwc-last-scan))
+      (progn
+       (setq enwc-scan-interactive nil)
+       (enwc-scan-internal)))
+  (let ((nets (or networks enwc-last-scan))
+       need-break cur-net)
+    (if (not nets)
+       (setq nets enwc-last-scan))
+    (while (and nets (not need-break))
+      (let (cur-essid)
+       (setq cur-net (pop nets))
+       (setq cur-essid (cdr (assoc "essid" cur-net)))
+       (if (string= cur-essid essid)
+           (setq need-break t))))
+    (if need-break
+       (if (called-interactively-p 'any)
+           (message (number-to-string (cdr (assoc "id" cur-net))))
+         (cdr (assoc "id" cur-net)))
+      (if (called-interactively-p 'any)
+         (message "Network not found.")
+       nil))))
+
+;;;;;;;;;;;;;;;;;;;;
+;; Connect Network
+;;;;;;;;;;;;;;;;;;;;
+
+(defun enwc-connect-network (id)
+  "Connect to network with id ID.
+This is an entry point for the internal connection functions,
+and checks whether or not ENWC is using wired."
+  (let (cur-net)
+    (if enwc-using-wired
+       (progn
+         (enwc-wired-connect id)
+         (setq cur-net (nth id (enwc-get-wired-profiles))))
+      (enwc-wireless-connect id)
+      (if enwc-last-scan
+         (setq cur-net (cdr (assoc "essid" (nth id enwc-last-scan)))))
+    cur-net)))
+
+(defun enwc-connect-to-network (net-id)
+  "Connects the the network with network id NET-ID.
+Confirms that NET-ID is a valid network id.
+This calls `enwc-connect-network' as a subroutine."
+  (interactive "nNetwork ID: ")
+  (if (not (numberp net-id))
+      (error "NET-ID must be a number"))
+  (let ((num-ids (length enwc-last-scan))
+       cur-net)
+    (if (or (< net-id 0) (>= net-id num-ids))
+       (error "Invalid network id."))
+    (setq cur-net (enwc-connect-network net-id))
+    (message (concat "Connecting to " cur-net))))
+
+(defun enwc-connect-to-network-essid (essid)
+  "Connects to the network with essid ESSID."
+  (interactive "sNetwork ESSID: ")
+  (let ((net-id (enwc-find-network essid)))
+    (if net-id
+       (enwc-connect-to-network net-id)
+      (message "Network not found."))))
+
+(defun enwc-connect-to-network-at-point ()
+  "Connects to the network at the current line number.
+Moves to the enwc buffer if necessary."
+  (interactive)
+  (if (not (eq major-mode 'enwc-mode))
+      (enwc-setup-buffer))
+  (let ((id (- (line-number-at-pos) 1)))
+    (enwc-connect-to-network id)))
+
+(defun enwc-disconnect ()
+  "Disconnects from the network, if any."
+  (interactive)
+  (if (not (eq major-mode 'enwc-mode))
+      (enwc-setup-buffer))
+  (if enwc-using-wired
+      (enwc-wired-disconnect)
+    (enwc-wireless-disconnect)))
+
+(defun enwc-toggle-wired ()
+  "Toggle the display and mode between wireless and wired.
+This function also sets the variable `enwc-using-wired'."
+  (interactive)
+  (if (not (eq major-mode 'enwc-mode))
+      (enwc-setup-buffer))
+  (let ((inhibit-read-only t))
+    (erase-buffer)
+    (setq enwc-using-wired (not enwc-using-wired))
+    (enwc-scan)))
+
+(defun enwc ()
+  "The main front-end to ENWC.
+This sets up the buffer and scans for networks.
+In order to use this, one must have already run
+`enwc-setup'.
+
+\\{enwc-mode-map}"
+  (interactive)
+  (enwc-setup-buffer)
+  (enwc-scan))
+
+;; Settings for access point AP
+;;
+;; IPv4 Settings:
+;;   Address =
+;;   Netmask =
+;;   Gateway =
+;;
+;;   DNS 1   =
+;;   DNS 2   =
+;;
+;; Security:
+;;   Type    =
+;;
+
+(defun enwc-edit-view-entry ()
+  "View the text of the entry at point.
+This is mostly useful to view the text of the hidden entries."
+  (interactive)
+  (if (not (get-buffer "*ENWC Edit*"))
+      (error "Not editing a network entry."))
+  (if (not (eq (current-buffer) (get-buffer "*ENWC Edit*")))
+      (switch-to-buffer "*ENWC Edit*"))
+  (if (not (widget-at))
+      (error "No widget at point"))
+  (message (widget-field-value-get (widget-at))))
+
+(defun enwc-display-sec-reqs (widget &rest stuff)
+  "Display the security requirements.
+This is a callback to the security selection widget.
+WIDGET is always the menu drop-down of security types."
+  (let (reqs
+       (inhibit-read-only t)
+       type-wid-list)
+    ;; First, erase any of the old ones.
+    (goto-char (1+ (widget-get widget :to)))
+    (widget-forward 1)
+    (while (>= (point) (widget-get widget :to))
+      (widget-delete (widget-at))
+      (widget-forward 1))
+    (goto-char (point-max))
+    ;; Then check to see if widget-value is None
+    (if (string= (widget-value widget) "None")
+       nil
+      (setq type-wid-list
+           (cadr (assoc "reqs"
+                        (cdr (assoc (widget-value widget)
+                                    (enwc-get-sec-types enwc-using-wired))))))
+      (setq reqs
+           (mapcar (lambda (x)
+                     (if (not (eq (length (cdr x)) 0))
+                         (widget-create 'editable-field
+                                        :format (concat "  "
+                                                        (cdr x)
+                                                        ": %v")
+                                        :secret ?*
+                                        :keymap 'enwc-edit-field-map
+                                        :value (or (enwc-get-nw-prop enwc-using-wired
+                                                                     enwc-edit-id
+                                                                     (car x))
+                                                   ""))))
+                   type-wid-list))
+      (widget-setup)
+      reqs)))
+
+(defun enwc-setup-edit-buffer ()
+  "Setup the edit buffer.  This removes the old one if neccessary,
+and redisplays the settings from the network profile
+ with id `enwc-edit-id', which is set in `enwc-edit-entry-at-point'."
+  (if (get-buffer "*ENWC Edit*")
+      (kill-buffer "*ENWC Edit*"))
+  (with-current-buffer (get-buffer-create "*ENWC Edit*")
+    (let ((sec-types (enwc-get-sec-types enwc-using-wired))
+         (nw-info (enwc-get-nw-info enwc-using-wired enwc-edit-id))
+         ip-addr netmask gateway dns-1 dns-2
+         addr-wid net-wid gate-wid
+         dns-1-wid dns-2-wid dns-list
+         type-wid type-wid-list)
+
+      (widget-insert (concat "Settings for access point "
+                            (cdr (assoc "essid"
+                                        (nth enwc-edit-id
+                                             enwc-last-scan)))
+                            "\n"))
+      (widget-insert "\n")
+      ;; ip
+      (widget-insert "IPv4 Settings:\n")
+      (setq addr-wid (widget-create 'editable-field
+                                   :format "  Address: %v"
+                                   :value (or (assoc "addr" nw-info) "")))
+      ;; netmask
+      (setq net-wid (widget-create 'editable-field
+                                  :format "  Netmask: %v"
+                                  :value (or (assoc "netmask" nw-info) "")))
+
+      ;; gateway
+      (setq gate-wid (widget-create 'editable-field
+                                   :format "  Gateway: %v"
+                                   :value (or (assoc "gateway" nw-info) "")))
+      ;; dns1
+      (widget-insert "\n")
+      ;;(setq dns-list (enwc-get-dns enwc-using-wired enwc-edit-id))
+      (setq dns-1-wid (widget-create 'editable-field
+                                    :format "    DNS 1: %v"
+                                    :value (or (assoc "dns1" nw-info) "")))
+
+      ;; dns2
+      (setq dns-2-wid (widget-create 'editable-field
+                                    :format "    DNS 2: %v"
+                                    :value (or (assoc "dns2" nw-info) "")))
+
+      (widget-insert "\n")
+      (widget-insert "Security:\n")
+      (setq type-wid (apply 'widget-create
+                           'menu-choice
+                                   :tag "Type "
+                           :value (or (assoc "enctype" nw-info) "None")
+                           :notify 'enwc-display-sec-reqs
+                                   '(item :tag "No Encryption"
+                                  :value "None")
+                           (mapcar (lambda (x)
+                                     `(item :format "%t\n"
+                                            :value ,(car x)
+                                            :tag ,(cdr (assoc "Name" (cdr x)))))
+                                           sec-types)))
+      (enwc-display-sec-reqs type-wid)
+      (use-local-map enwc-edit-map)
+      (widget-setup)))
+
+  (switch-to-buffer "*ENWC Edit*"))
+
+(defun enwc-edit-save ()
+  "Save the network settings."
+  ;; Basically, just iterate through the widgets,
+  ;; retrieving values from each.
+  (interactive)
+  (if (not (get-buffer "*ENWC Edit*"))
+      (error "Not editing a network entry."))
+  (if (not (eq (current-buffer) (get-buffer "*ENWC Edit*")))
+      (switch-to-buffer "*ENWC Edit*"))
+  (goto-char 0)
+  (let (settings start-pos type-wid-list)
+
+    (widget-forward 1)
+    (setq settings
+         (append settings
+                 (cons (cons "addr"
+                             (widget-field-value-get (widget-at)))
+                       nil)))
+    (widget-forward 1)
+    (setq settings
+         (append settings
+                 (cons (cons "netmask"
+                             (widget-field-value-get (widget-at)))
+                       nil)))
+    (widget-forward 1)
+    (setq settings
+         (append settings
+                 (cons (cons "gateway"
+                             (widget-field-value-get (widget-at)))
+                       nil)))
+    (widget-forward 1)
+    (setq settings
+         (append settings
+                 (cons (cons "dns1"
+                             (widget-field-value-get (widget-at)))
+                       nil)))
+    (widget-forward 1)
+    (setq settings
+         (append settings
+                 (cons (cons "dns2"
+                             (widget-field-value-get (widget-at)))
+                       nil)))
+    (widget-forward 1)
+    (setq settings
+         (append settings
+                 (cons (cons "enctype"
+                             (widget-value (widget-at)))
+                       nil)))
+    (setq start-pos (widget-get (widget-at) :to))
+    (if (not (string= (widget-value (widget-at)) "None"))
+       (setq type-wid-list
+             (cadr (assoc "reqs"
+                          (cdr (assoc (widget-value (widget-at))
+                                      (enwc-get-sec-types enwc-using-wired)))))))
+    (dolist (x type-wid-list)
+      (widget-forward 1)
+      (if (not (string= (widget-field-value-get (widget-at)) ""))
+         (setq settings
+               (append settings
+                       (cons (cons (car x)
+                                   (widget-field-value-get (widget-at)))
+                             nil)))))
+    (print settings)
+
+    (enwc-save-nw-settings enwc-using-wired enwc-edit-id settings)))
+
+(defun enwc-edit-entry-at-point ()
+  "Edit the current network entry."
+  (interactive)
+  (setq enwc-edit-id (- (line-number-at-pos) 1))
+  (select-window (split-window))
+  (enwc-setup-edit-buffer))
+
+(defvar enwc-mode-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map (kbd "R") 'enwc-scan)
+    (define-key map (kbd "C") 'enwc-connect-to-network-essid)
+    (define-key map (kbd "D") 'enwc-disconnect)
+    (define-key map (kbd "W") 'enwc-toggle-wired)
+    (define-key map (kbd "E") 'enwc-edit-entry-at-point)
+    (define-key map (kbd "RET") 'enwc-connect-to-network-at-point)
+    map)
+  "The keymap for network display in ENWC.")
+
+(defvar enwc-edit-map
+  (let ((map (copy-keymap widget-keymap)))
+    (define-key map (kbd "C-x C-s") 'enwc-edit-save)
+    map)
+  "The keymap for editing network profiles with ENWC.")
+
+(defvar enwc-edit-field-map
+  (let ((map (copy-keymap widget-field-keymap)))
+    (define-key map (kbd "C-x C-a") 'enwc-edit-view-entry)
+    map)
+  "The keymap for editable fields within the ENWC edit buffer.")
+
+(define-derived-mode enwc-mode tabulated-list-mode "enwc"
+  "Mode for working with network connections.
+\\{enwc-mode-map}"
+  ;;(setq buffer-read-only t)
+  (add-hook 'tabulated-list-revert-hook 'enwc-scan nil t)
+  )
+
+(defun enwc-setup-buffer ()
+  "Sets up the ENWC buffer.
+This first checks to see that it exists,
+and if it doesn't, then create it."
+  (if (not (get-buffer "*ENWC*"))
+      (with-current-buffer (get-buffer-create "*ENWC*")
+       ;;(use-local-map enwc-mode-map)
+       ;;(setq major-mode 'enwc-mode
+       ;;      mode-name "enwc")
+       (enwc-mode)
+       ;;(setq buffer-read-only t)
+       ))
+  (switch-to-buffer "*ENWC*"))
+
+(provide 'enwc)
+
+;;; enwc.el ends here
diff --git a/packages/epoch-view/epoch-view.el b/packages/epoch-view/epoch-view.el
new file mode 100644 (file)
index 0000000..8093637
--- /dev/null
@@ -0,0 +1,99 @@
+;;; epoch-view.el --- Minor mode to visualize epoch timestamps
+
+;; Copyright (C) 2010, 2012  Free Software Foundation, Inc.
+
+;; Author: Ted Zlatanov <tzz@lifelogs.com>
+;; Keywords: data, timestamp, epoch, unix
+;; Version: 0.0.1
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Use like any other minor mode.  You'll see tooltips with dates
+;; instead of Unix epoch times.  This mode turns on font-lock and
+;; leaves it on forever.  You may or may not like that.
+
+;;; TODO:
+
+;; Instead of letting font-lock-mode manage the `display' property,
+;; manage it ourselves so when multiple modes specify `display' it
+;; won't get wiped out when this mode doesn't need it anymore.
+
+;;; Code:
+
+\f
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;; User Variables:
+
+(defcustom epoch-view-time-format "%F %T"
+  "Format for time view.  Same as `format-time-string'."
+  :type '(choice :tag "Time format"
+                 (string :tag "Choose your own `format-time-string' format")
+                 (const :tag "YYYY-MM-DD HH:MM:SS" "%F %T"))
+  :group 'epoch-view)
+
+(defvar epoch-view-font-lock-keywords
+  '(("\\<[0-9]\\{8,11\\}\\>"
+     (0 (epoch-view-render))))
+  "Font-lock keywords of epoch timestamps.")
+
+(defun epoch-view-render ()
+  "Render a epoch match."
+  (let ((text (match-string-no-properties 0)))
+    `(face font-lock-warning-face
+           display ,(epoch-view--render text))))
+
+(defun epoch-view--render-time (text)
+  "Render the time portion of an epoch match from TEXT."
+  (format-time-string
+   epoch-view-time-format
+   (seconds-to-time (car (read-from-string (concat text ".0"))))))
+
+(defun epoch-view--render (text)
+  "Render a epoch match from a number in TEXT, ending with TEXT."
+  (format "[%s] %s" (epoch-view--render-time text) text))
+
+(defun epoch-view-turn-on ()
+  "Turn on epoch-view-mode."
+  (let ((props (make-local-variable 'font-lock-extra-managed-props)))
+    (add-to-list props 'display))
+
+  (font-lock-add-keywords nil epoch-view-font-lock-keywords))
+
+(defun epoch-view-turn-off ()
+  "Turn off epoch-view-mode."
+  (font-lock-remove-keywords
+   nil
+   `(,@epoch-view-font-lock-keywords)))
+
+;;;###autoload
+(define-minor-mode
+  epoch-view-mode
+  "Visualize epoch (Unix) timestamps."
+  :lighter " EpochVw"
+  (progn
+    (if epoch-view-mode
+        (epoch-view-turn-on)
+      (epoch-view-turn-off))
+    ;; Turn on font lock
+    (font-lock-mode 1)))
+
+(provide 'epoch-view)
+
+(run-hooks 'epoch-view-load-hook)
+
+;;; epoch-view.el ends here
diff --git a/packages/ggtags/ggtags.el b/packages/ggtags/ggtags.el
new file mode 100644 (file)
index 0000000..b545b8f
--- /dev/null
@@ -0,0 +1,687 @@
+;;; ggtags.el --- GNU Global source code tagging system -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2013  Free Software Foundation, Inc.
+
+;; Author: Leo Liu <sdl.web@gmail.com>
+;; Version: 0.6.6
+;; Keywords: tools, convenience
+;; Created: 2013-01-29
+;; URL: https://github.com/leoliu/ggtags
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; A package to integrate GNU Global source code tagging system
+;; (http://www.gnu.org/software/global) with Emacs.
+;;
+;; Usage:
+;;
+;; Type `M-x ggtags-mode' to enable the minor mode, or as usual enable
+;; it in your desired major mode hooks. When the mode is on the symbol
+;; at point is underlined if it is a valid (definition) tag.
+;;
+;; `M-.' finds definition or references according to the context at
+;; point, i.e. if point is at a definition tag find references and
+;; vice versa. `C-u M-.' is verbose and will ask you the name - with
+;; completion - and the type of tag to search.
+;;
+;; If multiple matches are found, navigation mode is entered. In this
+;; mode, `M-n' and `M-p' moves to next and previous match, `M-}' and
+;; `M-{' to next and previous file respectively. `M-o' toggles between
+;; full and abbreviated displays of file names in the auxiliary popup
+;; window. When you locate the right match, press RET to finish which
+;; hides the auxiliary window and exits navigation mode. You can
+;; resume the search using `M-,'. To abort the search press `M-*'.
+;;
+;; Normally after a few searches a dozen buffers are created visiting
+;; files tracked by GNU Global. `C-c M-k' helps clean them up.
+
+;;; Code:
+
+(eval-when-compile (require 'cl))
+(require 'compile)
+
+(if (not (fboundp 'comment-string-strip))
+    (autoload 'comment-string-strip "newcomment"))
+
+(eval-when-compile
+  (unless (fboundp 'setq-local)
+    (defmacro setq-local (var val)
+      (list 'set (list 'make-local-variable (list 'quote var)) val)))
+
+  (unless (fboundp 'defvar-local)
+    (defmacro defvar-local (var val &optional docstring)
+      (declare (debug defvar) (doc-string 3))
+      (list 'progn (list 'defvar var val docstring)
+            (list 'make-variable-buffer-local (list 'quote var))))))
+
+(eval-and-compile
+  (unless (fboundp 'user-error)
+    (defalias 'user-error 'error)))
+
+(defgroup ggtags nil
+  "GNU Global source code tagging system."
+  :group 'tools)
+
+(defface ggtags-highlight '((t (:underline t)))
+  "Face used to highlight a valid tag at point.")
+
+(defcustom ggtags-auto-jump-to-first-match t
+  "Non-nil to automatically jump to the first match."
+  :type 'boolean
+  :group 'ggtags)
+
+(defcustom ggtags-global-window-height 8 ; ggtags-global-mode
+  "Number of lines for the 'global' popup window.
+If nil, use Emacs default."
+  :type '(choice (const :tag "Default" nil) integer)
+  :group 'ggtags)
+
+(defcustom ggtags-global-abbreviate-filename 35
+  "Non-nil to display file names abbreviated such as '/u/b/env'."
+  :type '(choice (const :tag "No" nil)
+                 (const :tag "Always" t)
+                 integer)
+  :group 'ggtags)
+
+(defcustom ggtags-split-window-function split-window-preferred-function
+  "A function to control how ggtags pops up the auxiliary window."
+  :type 'function
+  :group 'ggtags)
+
+(defcustom ggtags-global-output-format 'grep
+  "The output format for the 'global' command."
+  :type '(choice (const path)
+                 (const ctags)
+                 (const ctags-x)
+                 (const grep)
+                 (const cscope))
+  :group 'ggtags)
+
+(defcustom ggtags-completing-read-function completing-read-function
+  "Ggtags specific `completing-read-function' (which see)."
+  :type 'function
+  :group 'ggtags)
+
+(defvar ggtags-cache nil)               ; (ROOT TABLE DIRTY TIMESTAMP)
+
+(defvar ggtags-current-tag-name nil)
+
+;; Used by ggtags-global-mode
+(defvar ggtags-global-error "match"
+  "Stem of message to print when no matches are found.")
+
+;; http://thread.gmane.org/gmane.comp.gnu.global.bugs/1518
+(defvar ggtags-global-has-path-style    ; introduced in global 6.2.8
+  (with-demoted-errors                  ; in case `global' not found
+    (and (string-match-p "^--path-style "
+                         (shell-command-to-string "global --help"))
+         t))
+  "Non-nil if `global' supports --path-style switch.")
+
+(defmacro ggtags-ensure-global-buffer (&rest body)
+  (declare (indent 0))
+  `(progn
+     (or (and (buffer-live-p compilation-last-buffer)
+              (with-current-buffer compilation-last-buffer
+                (derived-mode-p 'ggtags-global-mode)))
+         (error "No global buffer found"))
+     (with-current-buffer compilation-last-buffer ,@body)))
+
+(defun ggtags-get-timestamp (root)
+  "Get the timestamp (float) of file GTAGS in ROOT directory.
+Return -1 if it does not exist."
+  (let ((file (expand-file-name "GTAGS" root)))
+    (if (file-exists-p file)
+        (float-time (nth 5 (file-attributes file)))
+      -1)))
+
+(defun ggtags-get-libpath ()
+  (split-string (or (getenv "GTAGSLIBPATH") "")
+                (regexp-quote path-separator) t))
+
+(defun ggtags-cache-get (key)
+  (assoc key ggtags-cache))
+
+(defun ggtags-cache-set (key val &optional dirty)
+  (let ((c (ggtags-cache-get key)))
+    (if c
+        (setcdr c (list val dirty (float-time)))
+      (push (list key val dirty (float-time)) ggtags-cache))))
+
+(defun ggtags-cache-mark-dirty (key flag)
+  "Return non-nil if operation is successful."
+  (let ((cache (ggtags-cache-get key)))
+    (when cache
+      (setcar (cddr cache) flag))))
+
+(defun ggtags-cache-dirty-p (key)
+  "Value is non-nil if 'global -u' is needed."
+  (third (ggtags-cache-get key)))
+
+(defun ggtags-cache-stale-p (key)
+  "Value is non-nil if tags in cache needs to be rebuilt."
+  (> (ggtags-get-timestamp key)
+     (or (fourth (ggtags-cache-get key)) 0)))
+
+(defvar-local ggtags-root-directory 'unset
+  "Internal; use function `ggtags-root-directory' instead.")
+
+;;;###autoload
+(defun ggtags-root-directory ()
+  (if (string-or-null-p ggtags-root-directory)
+      ggtags-root-directory
+    (setq ggtags-root-directory
+          (with-temp-buffer
+            (when (zerop (call-process "global" nil (list t nil) nil "-pr"))
+              (file-name-as-directory
+               (comment-string-strip (buffer-string) t t)))))))
+
+(defun ggtags-check-root-directory ()
+  (or (ggtags-root-directory) (error "File GTAGS not found")))
+
+(defun ggtags-ensure-root-directory ()
+  (or (ggtags-root-directory)
+      (when (or (yes-or-no-p "File GTAGS not found; run gtags? ")
+                (error "Aborted"))
+        (let ((root (read-directory-name "Directory: " nil nil t)))
+          (and (= (length root) 0) (error "No directory chosen"))
+          (when (with-temp-buffer
+                  (let ((default-directory
+                          (file-name-as-directory root)))
+                    (or (zerop (call-process "gtags" nil t))
+                        (error "%s" (comment-string-strip
+                                     (buffer-string) t t)))))
+            (kill-local-variable 'ggtags-root-directory)
+            (message "File GTAGS generated in `%s'"
+                     (ggtags-root-directory)))))))
+
+(defun ggtags-tag-names-1 (root &optional prefix)
+  (when root
+    (if (ggtags-cache-stale-p root)
+        (let* ((default-directory (file-name-as-directory root))
+               (tags (with-demoted-errors
+                       (process-lines "global" "-c" (or prefix "")))))
+          (and tags (ggtags-cache-set root tags))
+          tags)
+      (cadr (ggtags-cache-get root)))))
+
+;;;###autoload
+(defun ggtags-tag-names (&optional prefix)
+  "Get a list of tag names starting with PREFIX."
+  (let ((root (ggtags-root-directory)))
+    (when (and root (ggtags-cache-dirty-p root))
+      (if (zerop (call-process "global" nil nil nil "-u"))
+          (ggtags-cache-mark-dirty root nil)
+        (message "ggtags: error running 'global -u'")))
+    (apply 'append (mapcar (lambda (r)
+                             (ggtags-tag-names-1 r prefix))
+                           (cons root (ggtags-get-libpath))))))
+
+(defun ggtags-read-tag (quick)
+  (ggtags-ensure-root-directory)
+  (let ((default (thing-at-point 'symbol))
+        (completing-read-function ggtags-completing-read-function))
+    (setq ggtags-current-tag-name
+          (if quick (or default (user-error "No tag at point"))
+            (completing-read
+             (format (if default "Tag (default %s): " "Tag: ") default)
+             (ggtags-tag-names) nil t nil nil default)))))
+
+(defun ggtags-global-options ()
+  (concat "-v --result="
+          (symbol-name ggtags-global-output-format)
+          (and ggtags-global-has-path-style " --path-style=shorter")))
+
+;;;###autoload
+(defun ggtags-find-tag (name &optional verbose)
+  "Find definitions or references to tag NAME by context.
+If point is at a definition tag, find references, and vice versa.
+When called with prefix, ask the name and kind of tag."
+  (interactive (list (ggtags-read-tag (not current-prefix-arg))
+                     current-prefix-arg))
+  (ggtags-check-root-directory)
+  (let ((split-window-preferred-function ggtags-split-window-function)
+        (default-directory (ggtags-root-directory))
+        (help-char ??)
+        (help-form "\
+d: definitions          (-d)
+r: references           (-r)
+s: symbols              (-s)
+?: show this help\n"))
+    (compilation-start
+     (if (or verbose (not buffer-file-name))
+         (format "global %s -%s \"%s\""
+                 (ggtags-global-options)
+                 (char-to-string
+                  (read-char-choice "Tag type? (d/r/s/?) " '(?d ?r ?s)))
+                 name)
+       (format "global %s --from-here=%d:%s \"%s\""
+               (ggtags-global-options)
+               (line-number-at-pos)
+               (shell-quote-argument
+                (expand-file-name (file-truename buffer-file-name)))
+               name))
+     'ggtags-global-mode))
+  (eval-and-compile (require 'etags))
+  (ring-insert find-tag-marker-ring (point-marker))
+  (ggtags-navigation-mode +1))
+
+(defun ggtags-find-tag-resume ()
+  (interactive)
+  (ggtags-ensure-global-buffer
+    (ggtags-navigation-mode +1)
+    (let ((split-window-preferred-function ggtags-split-window-function))
+      (compile-goto-error))))
+
+;; NOTE: Coloured output in grep requested: http://goo.gl/Y9IcX
+(defun ggtags-list-tags (regexp file-or-directory)
+  "List all tags matching REGEXP in FILE-OR-DIRECTORY."
+  (interactive (list (read-string "POSIX regexp: ")
+                     (read-file-name "Directory: "
+                                     (if current-prefix-arg
+                                         (ggtags-root-directory)
+                                       default-directory)
+                                     buffer-file-name t)))
+  (let ((split-window-preferred-function ggtags-split-window-function)
+        (default-directory (if (file-directory-p file-or-directory)
+                               (file-name-as-directory file-or-directory)
+                             (file-name-directory file-or-directory))))
+    (ggtags-check-root-directory)
+    (eval-and-compile (require 'etags))
+    (ggtags-navigation-mode +1)
+    (ring-insert find-tag-marker-ring (point-marker))
+    (with-current-buffer
+        (compilation-start (format "global %s -e %s %s"
+                                   (ggtags-global-options)
+                                   regexp
+                                   (if (file-directory-p file-or-directory)
+                                       "-l ."
+                                     (concat "-f " (shell-quote-argument
+                                                    (file-name-nondirectory
+                                                     file-or-directory)))))
+                           'ggtags-global-mode)
+      (setq-local compilation-auto-jump-to-first-error nil)
+      (remove-hook 'compilation-finish-functions 'ggtags-handle-single-match t))))
+
+(defun ggtags-query-replace (from to &optional delimited directory)
+  "Query replace FROM with TO on all files in DIRECTORY."
+  (interactive
+   (append (query-replace-read-args "Query replace (regexp)" t t)
+           (list (read-directory-name "In directory: " nil nil t))))
+  (let ((default-directory (file-name-as-directory directory)))
+    (ggtags-check-root-directory)
+    (dolist (file (process-lines "global" "-P" "-l" "."))
+      (let ((file (expand-file-name file directory)))
+        (when (file-exists-p file)
+          (let* ((message-log-max nil)
+                 (visited (get-file-buffer file))
+                 (buffer (or visited
+                             (with-demoted-errors
+                               (find-file-noselect file)))))
+            (when buffer
+              (set-buffer buffer)
+              (if (save-excursion
+                    (goto-char (point))
+                    (re-search-forward from nil t))
+                  (progn
+                    (switch-to-buffer (current-buffer))
+                    (perform-replace from to t t delimited
+                                     nil multi-query-replace-map))
+                (message "Nothing to do for `%s'" file)
+                (or visited (kill-buffer))))))))))
+
+(defun ggtags-delete-tag-files ()
+  "Delete the tag files generated by gtags."
+  (interactive)
+  (when (ggtags-root-directory)
+    (let ((files (directory-files (ggtags-root-directory) t
+                                  (regexp-opt '("GPATH" "GRTAGS" "GTAGS" "ID"))))
+          (buffer "*GTags File List*"))
+      (or files (user-error "No tag files found"))
+      (with-output-to-temp-buffer buffer
+        (dolist (file files)
+          (princ file)
+          (princ "\n")))
+      (let ((win (get-buffer-window buffer)))
+        (unwind-protect
+            (progn
+              (fit-window-to-buffer win)
+              (when (yes-or-no-p "Remove GNU Global tag files? ")
+                (mapc 'delete-file files)))
+          (when (window-live-p win)
+            (quit-window t win)))))))
+
+(defvar-local ggtags-global-exit-status nil)
+
+(defun ggtags-global-exit-message-function (_process-status exit-status msg)
+  (setq ggtags-global-exit-status exit-status)
+  (let ((count (save-excursion
+                 (goto-char (point-max))
+                 (if (re-search-backward "^\\([0-9]+\\) \\w+ located" nil t)
+                     (string-to-number (match-string 1))
+                   0))))
+    (cons (if (> exit-status 0)
+              msg
+            (format "found %d %s" count (if (= count 1) "match" "matches")))
+          exit-status)))
+
+;;; NOTE: Must not match the 'Global started at Mon Jun 3 10:24:13'
+;;; line or `compilation-auto-jump' will jump there and fail. See
+;;; comments before the 'gnu' entry in
+;;; `compilation-error-regexp-alist-alist'.
+(defvar ggtags-global-error-regexp-alist-alist
+  (append
+   '((path "^\\(?:[^/\n]*/\\)?[^ )\t\n]+$" 0)
+     ;; ACTIVE_ESCAPE  src/dialog.cc   172
+     (ctags "^\\([^ \t\n]+\\)[ \t]+\\(.*?\\)[ \t]+\\([0-9]+\\)$"
+            2 3 nil nil 2 (1 font-lock-function-name-face))
+     ;; ACTIVE_ESCAPE     172 src/dialog.cc    #undef ACTIVE_ESCAPE
+     (ctags-x "^\\([^ \t\n]+\\)[ \t]+\\([0-9]+\\)[ \t]+\\(\\(?:[^/\n]*/\\)?[^ \t\n]+\\)"
+              3 2 nil nil 3 (1 font-lock-function-name-face))
+     ;; src/dialog.cc:172:#undef ACTIVE_ESCAPE
+     (grep "^\\(.+?\\):\\([0-9]+\\):\\(?:[^0-9\n]\\|[0-9][^0-9\n]\\|[0-9][0-9].\\)"
+           1 2 nil nil 1)
+     ;; src/dialog.cc ACTIVE_ESCAPE 172 #undef ACTIVE_ESCAPE
+     (cscope "^\\(.+?\\)[ \t]+\\([^ \t\n]+\\)[ \t]+\\([0-9]+\\).*\\(?:[^0-9\n]\\|[^0-9\n][0-9]\\|[^:\n][0-9][0-9]\\)$"
+             1 3 nil nil 1 (2 font-lock-function-name-face)))
+   compilation-error-regexp-alist-alist))
+
+(defun ggtags-abbreviate-file (start end)
+  (let ((inhibit-read-only t)
+        (amount (if (numberp ggtags-global-abbreviate-filename)
+                    (- (- end start) ggtags-global-abbreviate-filename)
+                  999))
+        (advance-word (lambda ()
+                        "Return the length of the text made invisible."
+                        (let ((wend (min end (progn (forward-word 1) (point))))
+                              (wbeg (max start (progn (backward-word 1) (point)))))
+                          (goto-char wend)
+                          (if (<= (- wend wbeg) 1)
+                              0
+                            (put-text-property (1+ wbeg) wend 'invisible t)
+                            (1- (- wend wbeg)))))))
+    (goto-char start)
+    (while (and (> amount 0) (> end (point)))
+      (decf amount (funcall advance-word)))))
+
+(defun ggtags-abbreviate-files (start end)
+  (goto-char start)
+  (let* ((error-re (cdr (assq ggtags-global-output-format
+                              ggtags-global-error-regexp-alist-alist)))
+         (sub (cadr error-re)))
+    (when (and ggtags-global-abbreviate-filename error-re)
+      (while (re-search-forward (car error-re) end t)
+        (when (and (or (not (numberp ggtags-global-abbreviate-filename))
+                       (> (length (match-string sub))
+                          ggtags-global-abbreviate-filename))
+                   ;; Ignore bogus file lines such as:
+                   ;;     Global found 2 matches at Thu Jan 31 13:45:19
+                   (get-text-property (match-beginning sub) 'compilation-message))
+          (ggtags-abbreviate-file (match-beginning sub) (match-end sub)))))))
+
+(defun ggtags-handle-single-match (buf _how)
+  (when (and ggtags-auto-jump-to-first-match
+             ;; If exit abnormally keep the window for inspection.
+             (zerop ggtags-global-exit-status)
+             (save-excursion
+               (goto-char (point-min))
+               (not (ignore-errors
+                      (goto-char (compilation-next-single-property-change
+                                  (point) 'compilation-message))
+                      (end-of-line)
+                      (compilation-next-single-property-change
+                       (point) 'compilation-message)))))
+    (ggtags-navigation-mode -1)
+    ;; 0.5s delay for `ggtags-auto-jump-to-first-match'
+    (sit-for 0)                    ; See: http://debbugs.gnu.org/13829
+    (ggtags-navigation-mode-cleanup buf 0.5)))
+
+(defvar ggtags-global-mode-font-lock-keywords
+  '(("^Global \\(exited abnormally\\|interrupt\\|killed\\|terminated\\)\\(?:.*with code \\([0-9]+\\)\\)?.*"
+     (1 'compilation-error)
+     (2 'compilation-error nil t))
+    ("^Global found \\([0-9]+\\)" (1 compilation-info-face))))
+
+(define-compilation-mode ggtags-global-mode "Global"
+  "A mode for showing outputs from gnu global."
+  (setq-local compilation-error-regexp-alist
+              (list ggtags-global-output-format))
+  (setq-local compilation-auto-jump-to-first-error
+              ggtags-auto-jump-to-first-match)
+  (setq-local compilation-scroll-output 'first-error)
+  (setq-local compilation-disable-input t)
+  (setq-local compilation-always-kill t)
+  (setq-local compilation-error-face 'compilation-info)
+  (setq-local compilation-exit-message-function
+              'ggtags-global-exit-message-function)
+  (setq-local truncate-lines t)
+  (jit-lock-register #'ggtags-abbreviate-files)
+  (add-hook 'compilation-finish-functions 'ggtags-handle-single-match nil t)
+  (define-key ggtags-global-mode-map "o" 'visible-mode))
+
+(defvar ggtags-navigation-mode-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map "\M-n" 'next-error)
+    (define-key map "\M-p" 'previous-error)
+    (define-key map "\M-}" 'ggtags-navigation-next-file)
+    (define-key map "\M-{" 'ggtags-navigation-previous-file)
+    (define-key map "\M-o" 'ggtags-navigation-visible-mode)
+    (define-key map "\r" 'ggtags-navigation-mode-done)
+    ;; Intercept M-. and M-* keys
+    (define-key map [remap pop-tag-mark] 'ggtags-navigation-mode-abort)
+    (define-key map [remap ggtags-find-tag] 'undefined)
+    map))
+
+(defun ggtags-move-to-tag (&optional name)
+  "Move to NAME tag in current line."
+  (let ((orig (point))
+        (tag (or name ggtags-current-tag-name)))
+    (beginning-of-line)
+    (if (and tag (re-search-forward
+                  (concat "\\_<" (regexp-quote tag) "\\_>")
+                  (line-end-position)
+                  t))
+        (goto-char (match-beginning 0))
+      (goto-char orig))))
+
+(defun ggtags-navigation-mode-cleanup (&optional buf time)
+  (let ((buf (or buf compilation-last-buffer)))
+    (and (buffer-live-p buf)
+         (with-current-buffer buf
+           (when (get-buffer-process (current-buffer))
+             (kill-compilation))
+           (when (and (derived-mode-p 'ggtags-global-mode)
+                      (get-buffer-window))
+             (quit-window nil (get-buffer-window)))
+           (and time (run-with-idle-timer time nil 'kill-buffer buf))))))
+
+(defun ggtags-navigation-mode-done ()
+  (interactive)
+  (ggtags-navigation-mode -1)
+  (ggtags-navigation-mode-cleanup))
+
+(defun ggtags-navigation-mode-abort ()
+  (interactive)
+  (pop-tag-mark)
+  (ggtags-navigation-mode -1)
+  (ggtags-navigation-mode-cleanup nil 0))
+
+(defun ggtags-navigation-next-file (n)
+  (interactive "p")
+  (ggtags-ensure-global-buffer
+    (compilation-next-file n)
+    (compile-goto-error)))
+
+(defun ggtags-navigation-previous-file (n)
+  (interactive "p")
+  (ggtags-navigation-next-file (- n)))
+
+(defun ggtags-navigation-visible-mode (&optional arg)
+  (interactive (list (or current-prefix-arg 'toggle)))
+  (ggtags-ensure-global-buffer
+    (visible-mode arg)))
+
+(define-minor-mode ggtags-navigation-mode nil
+  :lighter (" GG[" (:propertize "n" face error) "]")
+  :global t
+  (if ggtags-navigation-mode
+      (progn
+        (add-hook 'next-error-hook 'ggtags-move-to-tag)
+        (add-hook 'minibuffer-setup-hook 'ggtags-minibuffer-setup-function))
+    (remove-hook 'next-error-hook 'ggtags-move-to-tag)
+    (remove-hook 'minibuffer-setup-hook 'ggtags-minibuffer-setup-function)))
+
+(defun ggtags-minibuffer-setup-function ()
+  ;; Disable ggtags-navigation-mode in minibuffer.
+  (setq-local ggtags-navigation-mode nil))
+
+(defun ggtags-kill-file-buffers (&optional interactive)
+  "Kill all buffers visiting files in the root directory."
+  (interactive "p")
+  (ggtags-check-root-directory)
+  (let ((root (ggtags-root-directory))
+        (count 0)
+        (some (lambda (pred list)
+                (loop for x in list when (funcall pred x) return it))))
+    (dolist (buf (buffer-list))
+      (let ((file (and (buffer-live-p buf)
+                       (not (eq buf (current-buffer)))
+                       (buffer-file-name buf))))
+        (when (and file (funcall some (apply-partially #'file-in-directory-p
+                                                       (file-truename file))
+                                 (cons root (ggtags-get-libpath))))
+          (and (kill-buffer buf)
+               (incf count)))))
+    (and interactive
+         (message "%d %s killed" count (if (= count 1) "buffer" "buffers")))))
+
+(defun ggtags-after-save-function ()
+  (let ((root (with-demoted-errors (ggtags-root-directory))))
+    (and root (ggtags-cache-mark-dirty root t))))
+
+(defvar ggtags-tag-overlay nil)
+(defvar ggtags-highlight-tag-timer nil)
+
+(defvar ggtags-mode-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map "\M-." 'ggtags-find-tag)
+    (define-key map "\M-," 'ggtags-find-tag-resume)
+    (define-key map "\C-c\M-k" 'ggtags-kill-file-buffers)
+    map))
+
+;;;###autoload
+(define-minor-mode ggtags-mode nil
+  :lighter (:eval (if ggtags-navigation-mode "" " GG"))
+  (if ggtags-mode
+      (progn
+        (add-hook 'after-save-hook 'ggtags-after-save-function nil t)
+        (or (executable-find "global")
+            (message "Failed to find GNU Global")))
+    (remove-hook 'after-save-hook 'ggtags-after-save-function t)
+    (and (overlayp ggtags-tag-overlay)
+         (delete-overlay ggtags-tag-overlay))
+    (setq ggtags-tag-overlay nil)))
+
+(defun ggtags-highlight-tag-at-point ()
+  (when ggtags-mode
+    (unless (overlayp ggtags-tag-overlay)
+      (setq ggtags-tag-overlay (make-overlay (point) (point)))
+      (overlay-put ggtags-tag-overlay 'ggtags t))
+    (let* ((bounds (bounds-of-thing-at-point 'symbol))
+           (valid-tag (when bounds
+                        (member (buffer-substring (car bounds) (cdr bounds))
+                                (ggtags-tag-names))))
+           (o ggtags-tag-overlay)
+           (done-p (lambda ()
+                     (and (memq o (overlays-at (car bounds)))
+                          (= (overlay-start o) (car bounds))
+                          (= (overlay-end o) (cdr bounds))
+                          (or (and valid-tag (overlay-get o 'face))
+                              (and (not valid-tag) (not (overlay-get o 'face))))))))
+      (cond
+       ((not bounds)
+        (overlay-put ggtags-tag-overlay 'face nil)
+        (move-overlay ggtags-tag-overlay (point) (point) (current-buffer)))
+       ((not (funcall done-p))
+        (move-overlay o (car bounds) (cdr bounds) (current-buffer))
+        (overlay-put o 'face (and valid-tag 'ggtags-highlight)))))))
+
+;;; imenu
+
+(defun ggtags-goto-imenu-index (name line &rest _args)
+  (save-restriction
+    (widen)
+    (goto-char (point-min))
+    (forward-line (1- line))
+    (ggtags-move-to-tag name)))
+
+;;;###autoload
+(defun ggtags-build-imenu-index ()
+  "A function suitable for `imenu-create-index-function'."
+  (when buffer-file-name
+    (let ((file (file-truename buffer-file-name)))
+      (with-temp-buffer
+        (when (with-demoted-errors
+                (zerop (call-process "global" nil t nil "-f" file)))
+          (goto-char (point-min))
+          (loop while (re-search-forward
+                       "^\\([^ \t]+\\)[ \t]+\\([0-9]+\\)" nil t)
+                collect (list (match-string 1)
+                              (string-to-number (match-string 2))
+                              'ggtags-goto-imenu-index)))))))
+
+;;; hippie-expand
+
+;;;###autoload
+(defun try-complete-ggtags-tag (old)
+  "A function suitable for `hippie-expand-try-functions-list'."
+  (with-no-warnings                     ; to avoid loading hippie-exp
+    (unless old
+      (he-init-string (if (looking-back "\\_<.*" (line-beginning-position))
+                          (match-beginning 0)
+                        (point))
+                      (point))
+      (setq he-expand-list
+            (and (not (equal he-search-string ""))
+                 (with-demoted-errors (ggtags-root-directory))
+                 (sort (all-completions he-search-string
+                                        (ggtags-tag-names))
+                       'string-lessp))))
+    (if (null he-expand-list)
+        (progn
+          (if old (he-reset-string))
+          nil)
+      (he-substitute-string (car he-expand-list))
+      (setq he-expand-list (cdr he-expand-list))
+      t)))
+
+;;; Finish up
+
+(when ggtags-highlight-tag-timer
+  (cancel-timer ggtags-highlight-tag-timer))
+
+(setq ggtags-highlight-tag-timer
+      (run-with-idle-timer 0.2 t 'ggtags-highlight-tag-at-point))
+
+;; Higher priority for `ggtags-navigation-mode' to avoid being
+;; hijacked by modes such as `view-mode'.
+(defvar ggtags-mode-map-alist
+  `((ggtags-navigation-mode . ,ggtags-navigation-mode-map)))
+
+(add-to-list 'emulation-mode-map-alists 'ggtags-mode-map-alist)
+
+(provide 'ggtags)
+;;; ggtags.el ends here
diff --git a/packages/heap/heap.el b/packages/heap/heap.el
new file mode 100644 (file)
index 0000000..4904a2e
--- /dev/null
@@ -0,0 +1,344 @@
+;;; heap.el --- Heap (a.k.a. priority queue) data structure
+
+;; Copyright (C) 2004-2006, 2008, 2012  Free Software Foundation, Inc
+
+;; Author: Toby Cubitt <toby-predictive@dr-qubit.org>
+;; Version: 0.3
+;; Keywords: extensions, data structures, heap, priority queue
+;; URL: http://www.dr-qubit.org/emacs.php
+;; Repository: http://www.dr-qubit.org/git/predictive.git
+
+;; This file is part of 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 <http://www.gnu.org/licenses/>.
+
+
+;;; Commentary:
+;;
+;; A heap is a form of efficient self-sorting tree. In particular, the root
+;; node is guaranteed to be the highest-ranked entry in the tree. (The
+;; comparison function used for ranking the data can, of course, be freely
+;; defined). Therefore repeatedly removing the root node will return the data
+;; in order of increasing rank. They are often used as priority queues, for
+;; scheduling tasks in order of importance.
+;;
+;; This package implements ternary heaps, since they are about 12% more
+;; efficient than binary heaps for heaps containing more than about 10
+;; elements, and for very small heaps the difference is negligible. The
+;; asymptotic complexity of ternary heap operations is the same as for a
+;; binary heap: 'add', 'delete-root' and 'modify' operations are all O(log n)
+;; on a heap containing n elements.
+;;
+;; Note that this package implements a heap as an implicit data structure on a
+;; vector. Therefore, the maximum size of the heap has to be specified in
+;; advance. Although the heap will grow dynamically if it becomes full, this
+;; requires copying the entire heap, so insertion has worst-case complexity
+;; O(n) instead of O(log n), though the amortized complexity is still
+;; O(n). (For applications where the maximum size of the heap is not known in
+;; advance, an implementation based on binary trees might be more suitable,
+;; but is not currently implemented in this package.)
+;;
+;; You create a heap using `make-heap', add elements to it using `heap-add',
+;; delete and return the root of the heap using `heap-delete-root', and modify
+;; an element of the heap using `heap-modify'. A number of other heap
+;; convenience functions are also provided, all with the prefix
+;; `heap-'. Functions with prefix `heap--' are for internal use only, and
+;; should never be used outside this package.
+
+
+;;; Change Log:
+;;
+;; Version 0.3
+;; * converted heap data structures into defstructs
+;; * increased default resize-factor to 2
+;; * added `heap-build' function for efficiently building a heap out of a
+;;   vector
+;; * added `heap-merge' function for merging heaps (not very efficient for
+;;   binary -- or ternary -- heaps, only O(n))
+;;
+;; Version 0.2.2
+;; * fixed bug in `heap-copy'
+;;
+;; Version 0.2.1
+;; * modified Commentary
+;;
+;; Version 0.2
+;; * fixed efficiency issue: vectors are no longer copied all the time (thanks
+;;   to Stefan Monnier for pointing this out)
+;;
+;; Version 0.1.5
+;; * renamed `vswap' to `heap--vswap'
+;; * removed cl dependency
+;;
+;; Version 0.1.4
+;; * fixed internal function and macro names
+;;
+;; Version 0.1.3
+;; * added more commentary
+;;
+;; Version 0.1.2
+;; * moved defmacros before their first use so byte-compilation works
+;;
+;; Version 0.1.1
+;; * added cl dependency
+;;
+;; version 0.1
+;; * initial release
+
+
+
+;;; Code:
+
+(eval-when-compile (require 'cl))
+
+
+;;; ================================================================
+;;;        Internal functions for use in the heap package
+
+(defstruct (heap-
+           :named
+           (:constructor nil)
+           (:constructor heap--create
+                         (cmpfun &optional (size 10) (resize 2)
+                          &aux
+                          (vect (make-vector size nil))
+                          (count 0)))
+           (:copier nil))
+  vect cmpfun count size resize)
+
+
+(defun heap--child (heap i)    ; INTERNAL USE ONLY
+  ;; Compare the 3 children of element I, and return element reference
+  ;; of the smallest/largest (depending on whethen it's a min- or
+  ;; max-heap).
+  (let* ((vect (heap--vect heap))
+        (cmpfun (heap--cmpfun heap))
+        (count (heap--count heap))
+        (j nil) (k (* 3 i)))
+    ;; Lots of if's in case I has less than three children.
+    (if (>= (1+ k) count) nil
+      (if (>= (+ 2 k) count) (1+ k)
+       (setq j (if (funcall cmpfun (aref vect (1+ k))
+                            (aref vect (+ 2 k)))
+                   (1+ k) (+ 2 k)))
+       (if (>= (+ 3 k) count) j
+         (if (funcall cmpfun (aref vect j) (aref vect (+ 3 k)))
+             j (+ 3 k)))))))
+
+
+(defmacro heap--vswap (vect i j)   ; INTERNAL USE ONLY
+  ;; Swap elements I and J of vector VECT.
+  `(let ((tmp (aref ,vect ,i)))
+     (aset ,vect ,i (aref ,vect ,j))
+     (aset ,vect ,j tmp) ,vect))
+
+
+(defun heap--sift-up (heap n)   ; INTERNAL USE ONLY
+  ;; Sift-up starting from element N of vector belonging to HEAP.
+  (let* ((i n) (j nil) (vect (heap--vect heap)) (v (aref vect n)))
+    ;; Keep moving element up until it reaches top or is smaller/bigger
+    ;; than its parent.
+    (while (and (> i 0)
+               (funcall (heap--cmpfun heap) v
+                        (aref vect (setq j (/ (1- i) 3)))))
+      (heap--vswap vect i j)
+      (setq i j))))
+
+
+(defun heap--sift-down (heap n)   ; INTERNAL USE ONLY
+  ;; Sift-down from element N of the heap vector belonging HEAP.
+  (let* ((vect (heap--vect heap))
+       (cmpfun (heap--cmpfun heap))
+       (i n) (j (heap--child heap i))
+       (v (aref vect n)))
+    ;; Keep moving the element down until it reaches the bottom of the
+    ;; tree or reaches a position where it is bigger/smaller than all
+    ;; its children.
+    (while (and j (funcall cmpfun (aref vect j) v))
+      (heap--vswap vect i j)
+      (setq i j)
+      (setq j (heap--child heap i)))))
+
+
+
+;;; ================================================================
+;;;          The public functions which operate on heaps.
+
+;;;###autoload
+(defun make-heap
+  (compare-function &optional initial-size resize-factor)
+  "Create an empty heap with comparison function COMPARE-FUNCTION.
+
+COMPARE-FUNCTION takes two arguments, A and B, and returns
+non-nil or nil. To implement a max-heap, it should return non-nil
+if A is greater than B. To implemenet a min-heap, it should
+return non-nil if A is less than B.
+
+Optional argument INITIAL-SIZE sets the initial size of the heap,
+defaulting to 10. Optional argument RESIZE-FACTOR sets the factor
+by which the heap's size is increased if it runs out of space,
+defaulting to 2."
+  ;; sadly, passing null values over-rides the defaults in the defstruct
+  ;; `heap--create', so we have to explicitly set the defaults again
+  ;; here
+  (or initial-size (setq initial-size 10))
+  (or resize-factor (setq resize-factor 2))
+  (heap--create compare-function initial-size resize-factor))
+
+
+;;;###autoload
+(defalias 'heap-create 'make-heap)
+
+
+(defun heap-copy (heap)
+ "Return a copy of heap HEAP."
+ (let ((newheap (heap--create (heap--cmpfun heap) (heap--size heap)
+                             (heap--resize heap))))
+   (setf (heap--vect newheap) (vconcat (heap--vect heap) [])
+        (heap--count newheap) (heap--count heap))
+   newheap))
+
+
+(defun heap-empty (heap)
+  "Return t if the heap is empty, nil otherwise."
+  (= 0 (heap--count heap)))
+
+
+(defun heap-size (heap)
+  "Return the number of entries in the heap."
+  (heap--count heap))
+
+
+(defun heap-compare-function (heap)
+  "Return the comparison function for the heap HEAP."
+  (heap--cmpfun heap))
+
+
+(defun heap-add (heap data)
+  "Add DATA to the heap, and return DATA."
+  ;; Add data to bottom of heap and sift-up from bottom.
+  (let ((count (heap--count heap))
+       (size (heap--size heap))
+       (vect (heap--vect heap)))
+    ;; if there's no space left, grow the heap
+    (if (< count size)
+       (aset vect count data)
+      (setf (heap--vect heap)
+           (vconcat (heap--vect heap) (vector data)
+                    (make-vector
+                     (1- (ceiling (* size (1- (heap--resize heap)))))
+                     nil))
+           (heap--size heap)
+           (ceiling (* size (heap--resize heap)))))
+    (setq count (setf (heap--count heap) (1+ (heap--count heap))))
+    (heap--sift-up heap (1- count)))
+  ;; return inserted data
+  data)
+
+
+(defun heap-root (heap)
+  "Return the root of the heap, without removing it"
+  (if (= (heap--count heap) 0) nil (aref (heap--vect heap) 0)))
+
+
+(defun heap-delete-root (heap)
+  "Return the root of the heap and delete it from the heap."
+  (let ((vect (heap--vect heap))
+       root count)
+    ;; deal with empty heaps and heaps with just one element
+    (if (= 0 (heap--count heap)) nil
+      (setq root (aref vect 0)
+           count (decf (heap--count heap)))
+      (if (= 0 count)
+         (setf (heap--vect heap) (make-vector 10 nil))
+       ;; delete root, swap last element to top, and sift-down from top
+       (aset vect 0 (aref vect count))
+       (aset vect count nil)
+       (heap--sift-down heap 0))
+      root)))
+
+
+(defun heap-modify (heap match-function data)
+  "Replace the first heap entry identified by MATCH-FUNCTION
+with DATA, if a match exists. Return t if there was a match, nil
+otherwise.
+
+The function MATCH-FUNCTION should take one argument of the type
+stored in the heap, and return non-nil if it should be modified,
+nil otherwise.
+
+Note that only the match highest up the heap is modified."
+  (let ((vect (heap--vect heap))
+       (count (heap--count heap))
+       (i 0))
+    ;; search vector for the first match
+    (while (and (< i count)
+               (not (funcall match-function (aref vect i))))
+      (setq i (1+ i)))
+    ;; if a match was found, modify it
+    (if (< i count)
+       (let ((olddata (aref vect i)))
+         (aset vect i data)
+         ;; if the new data is greater than old data, sift-up,
+         ;; otherwise sift-down
+         (if (funcall (heap--cmpfun heap) data olddata)
+             (heap--sift-up heap i)
+           (heap--sift-down heap i))
+         t)  ; return t if the match was successfully modified
+      nil)))  ; return nil if no match was found
+
+
+(defun heap-build (compare-function vec &optional resize-factor)
+  "Build a heap from vector VEC with COMPARE-FUNCTION
+as the comparison function.
+
+Note that VEC is modified, and becomes part of the heap data
+structure. If you don't want this, copy the vector first and pass
+the copy in VEC.
+
+COMPARE-FUNCTION takes two arguments, A and B, and returns
+non-nil or nil. To implement a max-heap, it should return non-nil
+if A is greater than B. To implemenet a min-heap, it should
+return non-nil if A is less than B.
+
+RESIZE-FACTOR sets the factor by which the heap's size is
+increased if it runs out of space, defaulting to 2."
+  (or resize-factor (setq resize-factor 2))
+  (let ((heap (heap--create compare-function (length vec) resize-factor))
+       (i (ceiling (1- (expt 3
+            (ceiling (1- (log (1+ (* 2 (length vec))) 3))))) 2)))
+    (setf (heap--vect heap) vec
+         (heap--count heap) (length vec))
+    (while (>= (decf i) 0) (heap--sift-down heap i))
+    heap))
+
+
+(defun heap-merge (heap &rest heaps)
+  "Merge HEAP with remaining HEAPS.
+
+The merged heap takes the comparison function and resize-fector
+of the first HEAP argument.
+
+\(Note that in this heap implementation, the merge operation is
+not very efficient, taking O(n) time for combined heap size n\)."
+  (setq heaps (mapcar 'heap--vect heaps))
+  (heap-build (heap--cmpfun heap)
+             (apply 'vconcat (heap--vect heap) heaps)
+             (heap--resize heap)))
+
+
+
+(provide 'heap)
+
+;;; heap.el ends here
diff --git a/packages/ioccur/ioccur.el b/packages/ioccur/ioccur.el
new file mode 100644 (file)
index 0000000..642c9e7
--- /dev/null
@@ -0,0 +1,1099 @@
+;;; ioccur.el --- Incremental occur
+
+;; Copyright (C) 2010-2012  Free Software Foundation, Inc.
+
+;; Author: Thierry Volpiatto <thierry dot volpiatto at gmail dot com>
+;; X-URL: https://github.com/thierryvolpiatto/ioccur
+;; Version: 2.4
+;; Compatibility: GNU Emacs >=22.3
+
+;; 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, 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 <http://www.gnu.org/licenses/>.
+
+;;; Install:
+;;
+;; Add this file to your `load-path', BYTE-COMPILE it and
+;; add (require 'ioccur) in your .emacs.
+;;
+;; Start with (C-u) M-x ioccur
+;;            or
+;;            (C-u) M-x ioccur-find-buffer-matching
+;;
+;; Do C-h f ioccur or ioccur-find-buffer-matching for more info.
+
+;;; Commentary:
+;;
+;; This package provides the command M-x ioccur, which is similar to
+;; M-x occur, except that it is incremental.
+;;
+;; You can jump and quit to an occurrence, or jump and save the search
+;; buffer (ioccur-buffer) for further use.  You can toggle literal and
+;; regexp searching while running.  It is auto documented both in
+;; mode-line and tooltip.  It has its own history, `ioccur-history',
+;; which is a real ring.
+;;
+;; To save `ioccur-history' via the Desktop package, add this to your
+;; init file (see (info "(emacs) Saving Emacs Sessions") for details):
+;;
+;; (add-to-list 'desktop-globals-to-save 'ioccur-history)
+
+;;; Code:
+(require 'derived)
+(eval-when-compile (require 'cl))
+(require 'outline)
+(eval-when-compile (require 'wdired))
+
+(defvar ioccur-mode-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map (kbd "q")        'ioccur-quit)
+    (define-key map (kbd "RET")      'ioccur-jump-and-quit)
+    (define-key map (kbd "<left>")   'ioccur-jump-and-quit)
+    (define-key map (kbd "<right>")  'ioccur-jump-without-quit)
+    (define-key map (kbd "C-z")      'ioccur-jump-without-quit)
+    (define-key map (kbd "<C-down>") 'ioccur-scroll-down)
+    (define-key map (kbd "<C-up>")   'ioccur-scroll-up)
+    (define-key map (kbd "C-v")      'ioccur-scroll-other-window-up)
+    (define-key map (kbd "M-v")      'ioccur-scroll-other-window-down)
+    (define-key map (kbd "<down>")   'ioccur-next-line)
+    (define-key map (kbd "<up>")     'ioccur-precedent-line)
+    (define-key map (kbd "C-n")      'ioccur-next-line)
+    (define-key map (kbd "C-p")      'ioccur-precedent-line)
+    (define-key map (kbd "R")        'ioccur-restart)
+    (define-key map (kbd "C-|")      'ioccur-split-window)
+    (define-key map (kbd "M-<")      'ioccur-beginning-of-buffer)
+    (define-key map (kbd "M->")      'ioccur-end-of-buffer)
+    map)
+  "Keymap used for ioccur commands.")
+
+
+(defgroup ioccur nil
+  "Mode that provide incremental searching in buffer."
+  :prefix "ioccur-"
+  :group 'text)
+
+;;; User variables.
+(defcustom ioccur-search-delay 0.5
+  "During incremental searching, display is updated all these seconds."
+  :group 'ioccur
+  :type  'integer)
+
+(defcustom ioccur-search-prompt "Pattern: "
+  "Prompt used for `ioccur-occur'."
+  :group 'ioccur
+  :type  'string)
+
+(defcustom ioccur-mode-line-string
+  (if (window-system)
+      " RET:Exit,C-g:Quit,C-j/left:Jump&quit,C-z/right:Jump,\
+C-k/x:Kill(as sexp),M-p/n:Hist,C/M-v:Scroll,C-down/up:Follow,C-w:Yank tap"
+
+      " RET:Exit,C-g:Quit,C-j:Jump&quit,C-z:Jump,C-k/x:Kill(as sexp),\
+S-/Tab:Hist,C-v/t:Scroll,C-d/u:Follow,C-w:Yank tap")
+
+  "Minimal documentation of `ioccur' commands displayed in mode-line.
+Set it to nil to remove doc in mode-line."
+  :group 'ioccur
+  :type  'string)
+
+(defcustom ioccur-length-line 80
+  "Length of the line displayed in ioccur buffer.
+When set to nil lines displayed in `ioccur-buffer' will not be modified.
+See `ioccur-truncate-line'."
+  :group 'ioccur
+  :type 'integer)
+
+(defcustom ioccur-max-length-history 100
+  "Maximum number of element stored in `ioccur-history'."
+  :group 'ioccur
+  :type 'integer)
+
+(defcustom ioccur-buffer-completion-use-ido nil
+  "Use ido to choose buffers in `ioccur-find-buffer-matching'."
+  :group 'ioccur
+  :type 'symbol)
+
+(defcustom ioccur-default-search-function 're-search-forward
+  "Default search function.
+Use here one of `re-search-forward' or `search-forward'."
+  :group 'ioccur
+  :type 'symbol)
+
+(defcustom ioccur-highlight-match-p t
+  "Highlight matchs in `ioccur-buffer' when non--nil."
+  :group 'ioccur
+  :type 'boolean)
+
+(defcustom ioccur-fontify-buffer-p nil
+  "Fontify `ioccur-current-buffer' when non--nil.
+This allow to have syntactic coloration in `ioccur-buffer' but
+it slow down the start of ioccur at first time on large buffers."
+  :group 'ioccur
+  :type 'boolean)
+
+(defcustom ioccur-case-fold-search 'smart
+  "Add 'smart' option to `case-fold-search'.
+When smart is enabled, Ignore case in the search strings
+if pattern contains no uppercase characters.
+Otherwise, with a nil or t value, the behavior is same as
+`case-fold-search'.
+Default value is smart, other possible values are nil and t."
+  :group 'ioccur
+  :type 'symbol)
+
+(defvar ioccur-read-char-or-event-skip-read-key nil
+  "Force not using `read-key' to read input in minibuffer even if bounded.
+Set it to non--nil if menu disapear or if keys are echoing in minibuffer.
+Deprecated, should be used only in old Emacs versions.")
+
+;;; Faces.
+(defface ioccur-overlay-face
+    '((t (:background "Green4" :underline t)))
+  "Face for highlight line in ioccur buffer."
+  :group 'ioccur-faces)
+
+(defface ioccur-match-overlay-face
+    '((t (:background "Indianred4" :underline t)))
+  "Face for highlight line in matched buffer."
+  :group 'ioccur-faces)
+
+(defface ioccur-title-face
+    '((t (:background "Dodgerblue4")))
+  "Face for highlight incremental buffer title."
+  :group 'ioccur-faces)
+
+(defface ioccur-regexp-face
+    '((t (:background "DeepSkyBlue" :underline t)))
+  "Face for highlight found regexp in `ioccur-buffer'."
+  :group 'ioccur-faces)
+
+(defface ioccur-match-face
+    '((t (:background "DeepSkyBlue")))
+  "Face for highlight matches in `ioccur-buffer'."
+  :group 'ioccur-faces)
+
+(defface ioccur-num-line-face
+    '((t (:foreground "OrangeRed")))
+  "Face for highlight number line in ioccur buffer."
+  :group 'ioccur-faces)
+
+(defface ioccur-invalid-regexp
+    '((t (:foreground "Goldenrod")))
+  "Face for highlight wrong regexp message in ioccur buffer."
+  :group 'ioccur-faces)
+
+(defface ioccur-cursor
+    '((t (:foreground "green")))
+  "Face for cursor color in minibuffer."
+  :group 'ioccur-faces)
+
+;;; Internal variables.
+;; String entered in prompt.
+(defvar ioccur-pattern "")
+;; The ioccur timer.
+(defvar ioccur-search-timer nil)
+;; Signal C-g hit.
+(defvar ioccur-quit-flag nil)
+;; The buffer we search in.
+(defvar ioccur-current-buffer nil)
+;; The overlay in `ioccur-buffer'.
+(defvar ioccur-occur-overlay nil)
+(make-variable-buffer-local 'ioccur-occur-overlay)
+;; Signal we quit and kill `ioccur-buffer'.
+(defvar ioccur-exit-and-quit-p nil)
+;; A list to store history.
+(defvar ioccur-history nil)
+;; The overlay in `ioccur-current-buffer'.
+(defvar ioccur-match-overlay nil)
+;; Number of occurences found.
+(defvar ioccur-count-occurences 0)
+;;The buffer where we send results.
+(defvar ioccur-buffer nil)
+(make-variable-buffer-local 'ioccur-buffer)
+;; True when jumping to a founded occurence.
+(defvar ioccur-success nil)
+;; Search function actually in use.
+(defvar ioccur-search-function ioccur-default-search-function)
+;; Message to send when ioccur exit
+(defvar ioccur-message nil)
+;; Store last window-configuration
+(defvar ioccur-last-window-configuration nil)
+
+
+(define-derived-mode ioccur-mode
+    text-mode "ioccur"
+    "Major mode to search occurences of regexp in current buffer.
+
+Special commands:
+\\{ioccur-mode-map}"
+    (if ioccur-mode-line-string
+        (setq mode-line-format
+              '(" " mode-line-buffer-identification " "
+                (line-number-mode "%l") " "
+                ioccur-mode-line-string "-%-"))
+        (kill-local-variable 'mode-line-format)))
+
+(defsubst* ioccur-position (item seq &key (test 'eq))
+  "A simple replacement of CL `position'."
+  (loop for i in seq for index from 0
+     when (funcall test i item) return index))
+
+;; Compatibility
+(unless (fboundp 'window-system)
+  (defun window-system (&optional arg)
+    window-system))
+
+;;; Iterators.
+(defmacro ioccur-iter-list (list-obj)
+  "Return an iterator from list LIST-OBJ."
+  `(lexical-let ((lis ,list-obj))
+     (lambda ()
+       (let ((elm (car lis)))
+         (setq lis (cdr lis))
+         elm))))
+
+(defun ioccur-iter-next (iterator)
+  "Return next elm of ITERATOR."
+  (funcall iterator))
+
+(defun ioccur-iter-circular (seq)
+  "Infinite iteration on SEQ."
+  (lexical-let ((it  (ioccur-iter-list seq))
+                (lis seq))
+    (lambda ()
+      (let ((elm (ioccur-iter-next it)))
+        (or elm
+            (progn (setq it (ioccur-iter-list lis))
+                   (ioccur-iter-next it)))))))
+
+(defun ioccur-butlast (seq pos)
+  "Return SEQ from index 0 to POS."
+  (butlast seq (- (length seq) pos)))
+
+(defun* ioccur-sub-prec-circular (seq elm &key (test 'eq))
+  "Infinite reverse iteration of SEQ starting at ELM."
+  (lexical-let* ((rev-seq  (reverse seq))
+                 (pos      (ioccur-position elm rev-seq :test test))
+                 (sub      (append (nthcdr (1+ pos) rev-seq)
+                                   (ioccur-butlast rev-seq pos)))
+                 (iterator (ioccur-iter-list sub)))
+     (lambda ()
+       (let ((elm (ioccur-iter-next iterator)))
+         (or elm
+             (progn (setq iterator (ioccur-iter-list sub))
+                    (ioccur-iter-next iterator)))))))
+
+(defun* ioccur-sub-next-circular (seq elm &key (test 'eq))
+  "Infinite iteration of SEQ starting at ELM."
+  (lexical-let* ((pos      (ioccur-position elm seq :test test))
+                 (sub      (append (nthcdr (1+ pos) seq)
+                                   (ioccur-butlast seq pos)))
+                 (iterator (ioccur-iter-list sub)))
+     (lambda ()
+       (let ((elm (ioccur-iter-next iterator)))
+         (or elm (progn
+                   (setq iterator (ioccur-iter-list sub))
+                   (ioccur-iter-next iterator)))))))
+
+(defun ioccur-print-results (regexp)
+  "Print in `ioccur-buffer' lines matching REGEXP in `ioccur-current-buffer'."
+  (setq ioccur-count-occurences 0)
+  (with-current-buffer ioccur-current-buffer
+    (let ((case-fold-search (case ioccur-case-fold-search
+                              (smart (let ((case-fold-search nil))
+                                       (if (string-match "[A-Z]" regexp) nil t)))
+                              (t ioccur-case-fold-search))))
+      (save-excursion
+        (goto-char (point-min))
+        (loop
+              while (not (eobp))
+              ;; We need to read also C-g from here
+              ;; Because when loop is started `ioccur-read-search-input'
+              ;; will read key only when loop is finished
+              ;; and we have no chance to exit loop.
+              when quit-flag do (setq ioccur-quit-flag t) and return nil
+              for count from 0
+              when (funcall ioccur-search-function regexp (point-at-eol) t)
+              do (ioccur-print-line
+                  (buffer-substring (point-at-bol) (point-at-eol))
+                  count (match-string 0) regexp)
+              do (forward-line 1))))))
+
+(defun ioccur-print-match (str &optional all)
+  "Highlight in string STR all occurences matching `ioccur-pattern'.
+If ALL is non--nil highlight the whole string STR."
+  (condition-case nil
+      (with-temp-buffer
+        (insert str)
+        (goto-char (point-min))
+        (if all
+            (add-text-properties
+             (point) (point-at-eol)
+             '(face ioccur-match-face))  
+            (while (and (funcall ioccur-search-function ioccur-pattern nil t)
+                        ;; Don't try to highlight line with a length <= 0.
+                        (> (- (match-end 0) (match-beginning 0)) 0))
+              (add-text-properties
+               (match-beginning 0) (match-end 0)
+               '(face ioccur-match-face))))
+        (buffer-string))
+    (error nil)))
+
+(defun ioccur-print-line (line nline match regexp)
+  "Prepare and insert a matched LINE at line number NLINE in `ioccur-buffer'."
+  (with-current-buffer ioccur-buffer
+    (let* ((lineno             (int-to-string (1+ nline)))
+           (whole-line-matched (string= match line))
+           (hightline          (if ioccur-highlight-match-p
+                                   (ioccur-print-match
+                                    line
+                                    whole-line-matched)
+                                   line))
+           (trunc-line          (ioccur-truncate-line hightline)))
+      (incf ioccur-count-occurences)
+      (insert " " (propertize lineno 'face 'ioccur-num-line-face
+                              'help-echo line)
+              ":" trunc-line "\n"))))
+
+(defun* ioccur-truncate-line (line &optional (columns ioccur-length-line))
+  "Remove indentation in LINE and truncate modified LINE of num COLUMNS.
+COLUMNS default value is `ioccur-length-line'.
+If COLUMNS is nil return original indented LINE.
+If COLUMNS is 0 only remove indentation in LINE.
+So just set `ioccur-length-line' to nil if you don't want lines truncated."
+  (let ((old-line line))
+    (when (string-match "^[[:blank:]]*" line)
+      ;; Remove tab and spaces at beginning of LINE.
+      (setq line (replace-match "" nil nil line)))
+    (if (and columns (> columns 0) (> (length line) columns))
+        (substring line 0 columns)
+        (if columns line old-line))))
+
+(defun ioccur-buffer-contain (buffer regexp)
+  "Return BUFFER if it contain an occurence of REGEXP."
+  (with-current-buffer buffer
+    (save-excursion
+      (goto-char (point-min))
+      (when (re-search-forward regexp nil t) buffer))))
+
+(defun ioccur-list-buffers-matching (buffer-match regexp buffer-list)
+  "Collect all buffers in BUFFER-LIST whose names match BUFFER-MATCH and \
+contain lines matching REGEXP."
+  (loop
+     with ini-buf-list = (loop for buf in buffer-list
+                            unless (rassq buf dired-buffers)
+                            collect buf)
+     for buf in ini-buf-list
+     for bname = (buffer-name buf)
+     when (and (string-match buffer-match bname)
+               (ioccur-buffer-contain buf regexp))
+     collect bname))
+
+(defun ioccur-list-buffers-containing (regexp buffer-list)
+  "Collect all buffers in BUFFER-LIST containing lines matching REGEXP."
+  (loop with buf-list = (loop for i in buffer-list
+                           when (buffer-file-name (get-buffer i))
+                           collect i)
+     for buf in buf-list
+     when (ioccur-buffer-contain buf regexp)
+     collect (buffer-name buf)))
+
+(defun* ioccur-find-buffer-matching1 (regexp
+                                      &optional
+                                      match-buf-name
+                                      (buffer-list (buffer-list)))
+  "Find all buffers containing a text matching REGEXP \
+and connect `ioccur' to the selected one.
+
+If MATCH-BUF-NAME is non--nil search is performed only in buffers
+with name matching specified expression (prompt).
+
+Hitting C-g in a `ioccur' session will return to completion list.
+Hitting C-g in the completion list will jump back to initial buffer.
+
+The buffer completion list is provided by one of:
+`ido-completing-read', `completing-read'
+depending on which `ioccur-buffer-completion-use-ido' you have choosen."
+  ;; Remove doublons maybe added by minibuffer in `ioccur-history'.
+  (setq ioccur-history
+        (loop with hist for i in ioccur-history
+           when (not (member i hist)) collect i into hist
+           finally return hist))
+
+  (let ((prompt   (format "Search (%s) in Buffer: " regexp))
+        (win-conf (current-window-configuration))
+        (buf-list (if match-buf-name
+                      (ioccur-list-buffers-matching
+                       (read-string "In Buffer names matching: ")
+                       regexp buffer-list)
+                      (ioccur-list-buffers-containing regexp buffer-list))))
+
+    (labels
+        ((find-buffer ()
+           (let ((buf (if (and ido-mode
+                               (eq ioccur-buffer-completion-use-ido 'ido))
+                          (ido-completing-read prompt buf-list nil t)
+                          (completing-read prompt buf-list nil t))))
+             (unwind-protect
+                  (progn
+                    (switch-to-buffer buf)
+                    (ioccur regexp)
+                    ;; Exit if we jump to this `ioccur-current-buffer',
+                    ;; otherwise, if C-g is hitten,
+                    ;; go back to buffer completion list.
+                    (unless ioccur-success
+                      (find-buffer)))
+               ;; C-g hit in buffer completion restore window config.
+               (unless ioccur-success
+                 (set-window-configuration win-conf))))))
+
+      (find-buffer))))
+
+;;;###autoload
+(defun ioccur-find-buffer-matching (regexp)
+  "Find all buffers containing a text matching REGEXP.
+See `ioccur-find-buffer-matching1'."
+  (interactive (list (let ((savehist-save-minibuffer-history nil))
+                       (read-from-minibuffer "Search for Pattern: "
+                                             nil nil nil '(ioccur-history . 0)
+                                             (thing-at-point 'symbol)))))
+  (ioccur-find-buffer-matching1 regexp current-prefix-arg))
+
+;;; Ioccur dired
+;;;###autoload
+(defun ioccur-dired (regexp)
+  (interactive (list (let ((savehist-save-minibuffer-history nil))
+                       (read-from-minibuffer "Search for Pattern: "
+                                             nil nil nil '(ioccur-history . 0)
+                                             (thing-at-point 'symbol)))))
+  (let ((buf-list (loop for f in (dired-get-marked-files)
+                     do (find-file-noselect f)
+                     unless (file-directory-p f)
+                     collect (get-buffer (file-name-nondirectory f)))))
+    (ioccur-find-buffer-matching1 regexp nil buf-list)))
+
+;;;###autoload
+(defun ioccur-restart ()
+  "Restart `ioccur' from `ioccur-buffer'.
+`ioccur-buffer' is erased and a new search is started."
+  (interactive)
+  (when (eq major-mode 'ioccur-mode)
+    (pop-to-buffer ioccur-current-buffer)
+    (kill-buffer ioccur-buffer)
+    (set-window-configuration ioccur-last-window-configuration)
+    (ioccur)))
+
+;;;###autoload
+(defun ioccur-quit ()
+  "Quit `ioccur-buffer'."
+  (interactive)
+  (let ((pos (with-current-buffer ioccur-current-buffer (point))))
+    (when ioccur-match-overlay
+      (delete-overlay ioccur-match-overlay))
+    (quit-window)
+    (set-window-configuration ioccur-last-window-configuration)
+    (pop-to-buffer ioccur-current-buffer)
+    (goto-char pos)))
+
+(defun ioccur-goto-line (lineno)
+  "Goto LINENO without modifying outline visibility if needed."
+  (flet ((gotoline (numline)
+           (goto-char (point-min)) (forward-line (1- numline))))
+    (if (or (eq major-mode 'org-mode)
+            outline-minor-mode)
+        (progn
+          (gotoline lineno)
+          (org-reveal))
+        (gotoline lineno))))
+
+(defun ioccur-forward-line (n)
+  "Forward N lines but empty one's."
+  (let (pos)
+    (save-excursion
+      (forward-line n) (forward-line 0)
+      (when (looking-at "^\\s-[0-9]+:")
+        (forward-line 0) (setq pos (point))))
+  (when pos (goto-char pos) (ioccur-color-current-line))))
+
+;;;###autoload
+(defun ioccur-next-line ()
+  "Goto next line if it is not an empty line."
+  (interactive)
+  (ioccur-forward-line 1))
+
+;;;###autoload
+(defun ioccur-precedent-line ()
+  "Goto precedent line if it is not an empty line."
+  (interactive)
+  (ioccur-forward-line -1))
+
+;;;###autoload
+(defun ioccur-beginning-of-buffer ()
+  "Goto beginning of `ioccur-buffer'."
+  (interactive)
+  (when (looking-at "^\\s-[0-9]+:")
+    (goto-char (point-min))
+    (re-search-forward "^\\s-[0-9]+:" nil t)
+    (forward-line 0)
+    (ioccur-color-current-line)))
+
+;;;###autoload
+(defun ioccur-end-of-buffer ()
+  "Go to end of `ioccur-buffer'."
+  (interactive)
+  (when (looking-at "^\\s-[0-9]+:")
+    (goto-char (point-max))
+    (forward-line -1)
+    (ioccur-color-current-line)))
+
+(defun ioccur-jump (&optional win-conf)
+  "Jump to line in other buffer and put an overlay on it.
+Move point to first occurence of `ioccur-pattern'."
+  (let* ((line           (buffer-substring (point-at-bol) (point-at-eol)))
+         (pos            (string-to-number line))
+         (back-search-fn (if (eq ioccur-search-function 're-search-forward)
+                             're-search-backward 'search-backward)))
+    (unless (string= line "")
+      (if win-conf
+          (set-window-configuration win-conf)
+          (pop-to-buffer ioccur-current-buffer))
+      (ioccur-goto-line pos)
+      (recenter)
+      ;; Go to beginning of first occurence in this line
+      ;; of what match `ioccur-pattern'.
+      (when (funcall ioccur-search-function
+                     ioccur-pattern (point-at-eol) t)
+        (goto-char (match-beginning 0)))
+      (ioccur-color-matched-line))))
+
+;;;###autoload
+(defun ioccur-jump-and-quit ()
+  "Jump to line in other buffer and quit search buffer."
+  (interactive)
+  (when (ioccur-jump ioccur-last-window-configuration)
+    (sit-for 0.3)
+    (when ioccur-match-overlay
+      (delete-overlay ioccur-match-overlay))))
+
+;;;###autoload
+(defun ioccur-jump-without-quit (&optional mark)
+  "Jump to line in `ioccur-current-buffer' without quitting."
+  (interactive)
+  (when (ioccur-jump ioccur-last-window-configuration)
+    (and mark (set-marker (mark-marker) (point))
+         (push-mark (point) 'nomsg))
+    (switch-to-buffer-other-window ioccur-buffer t)))
+
+;;;###autoload
+(defun ioccur-scroll-other-window-down ()
+  "Scroll other window down."
+  (interactive)
+  (let ((other-window-scroll-buffer ioccur-current-buffer))
+    (scroll-other-window 1)))
+
+;;;###autoload
+(defun ioccur-scroll-other-window-up ()
+  "Scroll other window up."
+  (interactive)
+  (let ((other-window-scroll-buffer ioccur-current-buffer))
+    (scroll-other-window -1)))
+
+(defun ioccur-scroll (n)
+  "Scroll `ioccur-buffer' and `ioccur-current-buffer' simultaneously."
+  (ioccur-forward-line n)
+  (ioccur-color-current-line)
+  (and (ioccur-jump ioccur-last-window-configuration)
+       (switch-to-buffer-other-window ioccur-buffer t)))
+
+;;;###autoload
+(defun ioccur-scroll-down ()
+  "Scroll down `ioccur-buffer' and `ioccur-current-buffer' simultaneously."
+  (interactive)
+  (ioccur-scroll 1))
+
+;;;###autoload
+(defun ioccur-scroll-up ()
+  "Scroll up `ioccur-buffer' and `ioccur-current-buffer' simultaneously."
+  (interactive)
+  (ioccur-scroll -1))
+
+;;;###autoload
+(defun ioccur-split-window ()
+  "Toggle split window, vertically or horizontally."
+  (interactive)
+  (with-current-buffer ioccur-current-buffer
+    (let ((old-size (window-height)))
+      (delete-window)
+      (set-window-buffer
+       (select-window (if (= (window-height) old-size)
+                          (split-window-vertically)
+                          (split-window-horizontally)))
+       (get-buffer ioccur-buffer)))))
+
+(defun ioccur-read-char-or-event (prompt)
+  "Replace `read-key' when not available using PROMPT."
+  (if (and (fboundp 'read-key)
+           (not ioccur-read-char-or-event-skip-read-key))
+      (read-key prompt)
+      (let* ((chr (condition-case nil (read-char prompt) (error nil)))
+             (evt (unless chr (read-event prompt))))
+        (or chr evt))))
+
+(defun ioccur-read-search-input (initial-input start-point)
+  "Read each keyboard input and add it to `ioccur-pattern'.
+INITIAL-INPUT is a string given as default input, generally thing at point.
+START-POINT is the point where we start searching in buffer."
+  (let* ((prompt         (propertize ioccur-search-prompt
+                                     'face 'minibuffer-prompt))
+         (inhibit-quit   (or (eq system-type 'windows-nt)
+                             (not (fboundp 'read-key))
+                             ioccur-read-char-or-event-skip-read-key))
+         (tmp-list       ())
+         (it-prec        nil)
+         (it-next        nil)
+         (cur-hist-elm   (car ioccur-history))
+         (start-hist     nil) ; Flag to notify if cycling history started.
+         yank-point
+         (index 0))
+    (unless (string= initial-input "")
+      (loop for char across initial-input do (push char tmp-list)))
+    (setq ioccur-pattern initial-input)
+    ;; Cycle history function.
+    ;;
+    (flet ((cycle-hist (arg)
+             ;; ARG can be positive or negative depending we call M-p or M-n.
+             (if ioccur-history
+                 (progn
+                   ;; Cycle history will start at second call,
+                   ;; at first call just use the car of hist ring.
+                   ;; We build a new iterator based on a sublist
+                   ;; starting at the current element of history.
+                   ;; This is a circular iterator. (no end)
+                   (if start-hist ; At first call, start-hist is nil.
+                       (progn
+                         (if (< arg 0)
+                             ;; M-p (move from left to right in hist ring).
+                             (unless it-prec ; Don't rebuild iterator if exists.
+                               (setq it-prec (ioccur-sub-next-circular
+                                              ioccur-history
+                                              cur-hist-elm :test 'equal))
+                               (setq it-next nil)) ; Kill forward iterator.
+                             ;; M-n (move from right to left in hist ring).
+                             (unless it-next ; Don't rebuild iterator if exists.
+                               (setq it-next (ioccur-sub-prec-circular
+                                              ioccur-history
+                                              cur-hist-elm :test 'equal))
+                               (setq it-prec nil))) ; kill backward iterator.
+                         (let ((it (or it-prec it-next)))
+                           (setq cur-hist-elm (ioccur-iter-next it))
+                           (setq tmp-list nil)
+                           (loop for char across cur-hist-elm
+                                 do (push char tmp-list))
+                           (setq ioccur-pattern cur-hist-elm)))
+                       ;; First call use car of history ring.
+                       (setq tmp-list nil)
+                       (loop for char across cur-hist-elm
+                             do (push char tmp-list))
+                       (setq ioccur-pattern cur-hist-elm)
+                       (setq start-hist t)))
+                 (message "No history available.") (sit-for 2) t))
+           ;; Insert INITIAL-INPUT.
+           ;;
+           (insert-initial-input ()
+             (unless (string= initial-input "")
+               (loop for char across initial-input
+                     do (push char (nthcdr index tmp-list)))))
+           ;; Maybe start timer.
+           ;;
+           (start-timer ()
+             (unless ioccur-search-timer
+               (ioccur-start-timer)))
+           ;; Maybe stop timer.
+           ;;
+           (stop-timer ()
+             (when ioccur-search-timer
+               (ioccur-cancel-search)))
+           ;; Kill pattern
+           ;;
+           (kill (str)
+             (with-current-buffer ioccur-current-buffer
+               (goto-char start-point)
+               (setq yank-point start-point))
+             (kill-new (substring str (- (length tmp-list) index)))
+             (setq tmp-list (nthcdr index tmp-list)))
+           ;; Add cursor in minibuffer
+           ;;
+           (set-cursor (str pos)
+             (setq pos (min index (1- (length tmp-list))))
+             (when (not (string= str ""))
+               (let* ((real-index (- (1- (length tmp-list)) pos))
+                      (cur-str (substring str real-index (1+ real-index))))
+                 (concat (substring str 0 real-index)
+                         (propertize cur-str 'display
+                                     (if (= index (length tmp-list))
+                                         (concat
+                                          (propertize "|" 'face 'ioccur-cursor)
+                                          cur-str)
+                                         (concat
+                                          cur-str
+                                          (propertize "|" 'face 'ioccur-cursor))))
+                         (substring str (1+ real-index)))))))
+      
+      ;; Start incremental loop.
+      (while (let ((char (ioccur-read-char-or-event
+                          (concat prompt (set-cursor ioccur-pattern index)))))
+               (message nil)
+               (case char
+                 ((not (?\M-p ?\M-n ?\t C-tab)) ; Reset history
+                  (setq start-hist nil)
+                  (setq cur-hist-elm (car ioccur-history)) t)
+                 ((down ?\C-n)                  ; Next line.
+                  (stop-timer) (ioccur-next-line)
+                  (ioccur-color-current-line) t)
+                 ((up ?\C-p)                    ; Precedent line.
+                  (stop-timer) (ioccur-precedent-line)
+                  (ioccur-color-current-line) t)
+                 (?\M-<                         ; Beginning of buffer.
+                  (when (ioccur-beginning-of-buffer)
+                    (stop-timer)) t)
+                 (?\M->                         ; End of buffer.
+                  (when (ioccur-end-of-buffer)
+                    (stop-timer)) t)
+                 ((?\C-d C-down)                ; Scroll both windows down.
+                  (stop-timer) (ioccur-scroll-down) t)
+                 ((?\C-u C-up)                  ; Scroll both windows up.
+                  (stop-timer) (ioccur-scroll-up) t)
+                 (?\r                           ; RET break and exit code.
+                  nil)
+                 (?\d                           ; Delete backward with DEL.
+                  (start-timer)
+                  (with-current-buffer ioccur-current-buffer
+                    (goto-char start-point)
+                    (setq yank-point start-point))
+                  (with-no-warnings (pop (nthcdr index tmp-list)))
+                  t)
+                 (?\C-g                         ; Quit and restore buffers.
+                  (setq ioccur-quit-flag t) nil)
+                 ((right ?\C-z)                 ; Persistent action.
+                  (ioccur-jump-without-quit) t)
+                 ((?\C- )                       ; Persistent action save mark.
+                  (ioccur-jump-without-quit t) t)                 
+                 ((left ?\C-j)                  ; Jump and kill search buffer.
+                  (setq ioccur-exit-and-quit-p t) nil)
+                 ((next ?\C-v)                  ; Scroll down.
+                  (ioccur-scroll-other-window-down) t)
+                 ((?\C-t ?\M-v prior)           ; Scroll up.
+                  (ioccur-scroll-other-window-up) t)
+                 (?\C-s                         ; Toggle split window.
+                  (ioccur-split-window) t)
+                 ((?\C-: ?\C-l)                 ; Toggle regexp/litteral search.
+                  (start-timer)
+                  (if (eq ioccur-search-function 're-search-forward)
+                      (setq ioccur-search-function 'search-forward)
+                      (setq ioccur-search-function 're-search-forward)) t)
+                 (?\C-k                         ; Kill input.
+                  (start-timer)
+                  (kill ioccur-pattern) (setq index 0) t)
+                 ((?\M-k ?\C-x)                 ; Kill input as sexp.
+                  (start-timer)
+                  (let ((sexp (prin1-to-string ioccur-pattern)))
+                    (kill sexp)
+                    (setq ioccur-quit-flag t)
+                    (setq ioccur-message (format "Killed: %s" sexp)))
+                  nil)
+                 (?\C-y                         ; Yank from `kill-ring'.
+                  (setq initial-input (car kill-ring))
+                  (insert-initial-input) t)
+                 (?\C-w                         ; Yank stuff at point.
+                  (start-timer)
+                  (with-current-buffer ioccur-current-buffer
+                    ;; Start to initial point if C-w have never been hit.
+                    (unless yank-point (setq yank-point start-point))
+                    ;; After a search `ioccur-print-results' have put point
+                    ;; to point-max, so reset position.
+                    (when yank-point (goto-char yank-point))
+                    (let ((pmax (point-at-eol))
+                          (eoword (save-excursion (forward-word 1) (point))))
+                      ;; Don't yank further than eol.
+                      (unless (> eoword pmax)
+                        (goto-char eoword)
+                        (setq initial-input (buffer-substring-no-properties
+                                             yank-point (point)))
+                        (setq yank-point (point)) ; End of last forward-word
+                        (insert-initial-input)))) t)
+                 ((?\t ?\M-p)                   ; Precedent history elm.
+                  (start-timer)
+                  (setq index 0)
+                  (cycle-hist -1))
+                 ((backtab ?\M-n)               ; Next history elm.
+                  (start-timer)
+                  (setq index 0)
+                  (cycle-hist 1))
+                 (?\C-q                         ; quoted-insert.
+                  (stop-timer)
+                  (let ((char (with-temp-buffer
+                                (call-interactively 'quoted-insert)
+                                (buffer-string))))
+                    (push (string-to-char char) tmp-list))
+                  (start-timer)
+                  t)
+                 ;; Movements in minibuffer
+                 (?\C-b                         ; backward-char.
+                  (setq index (min (1+ index) (length tmp-list))) t)
+                 (?\C-f                         ; forward-char.
+                  (setq index (max (1- index) 0)) t)
+                 (?\C-a                         ; move bol.
+                  (setq index (length tmp-list)) t)
+                 (?\C-e                         ; move eol.
+                  (setq index 0) t)
+                 (t                             ; Store character.
+                  (start-timer)
+                  (if (characterp char)
+                      (push char (nthcdr index tmp-list))
+                      (setq unread-command-events
+                            (nconc (mapcar 'identity
+                                           (this-single-command-raw-keys))
+                                   unread-command-events))
+                      nil))))
+        (setq ioccur-pattern (apply 'string (reverse tmp-list)))))))
+
+(defun ioccur-print-buffer (regexp)
+  "Pretty Print results matching REGEXP in `ioccur-buffer'."
+  (unless (window-system) (setq tooltip-use-echo-area t) (tooltip-mode 1))
+  (let* ((cur-method (if (eq ioccur-search-function 're-search-forward)
+                         "Regexp" "Literal"))
+         (title      (propertize
+                      (format
+                       "* Ioccur %s searching %s"
+                       cur-method
+                       (if (window-system)
+                           "* (`C-:' to Toggle Method, Mouse over for help.)"
+                           "* (`C-l' to Toggle Method.)"))
+                      'face 'ioccur-title-face
+                      'help-echo
+                      "                  Ioccur map:\n
+C-n or <down>      Next line.\n
+C-p or <up>        Precedent line.\n
+C-v and M-v/C-t    Scroll up and down.\n
+C-z or <right>     Jump without quitting loop.\n
+C-TAB              Jump without quitting and save to mark-ring.\n
+C-j or <left>      Jump and kill `ioccur-buffer'.\n
+RET                Exit keeping `ioccur-buffer'.\n
+DEL                Remove last character entered.\n
+C-k                Kill current input.\n
+C-a/e/b/f          Movements in minibuffer.\n
+M-k/C-x            Kill current input as sexp.\n
+C-w                Yank stuff at point.\n
+C-g                Quit and restore buffer.\n
+C-s                Toggle split window.\n
+C-:/l              Toggle regexp/litteral search.\n
+C-down or C-u      Follow in other buffer.\n
+C-up/d or C-d      Follow in other buffer.\n
+M-<, M->           Beginning and end of buffer.\n
+M-p/n or tab/S-tab History."))
+           wrong-regexp)
+    (if (string= regexp "")
+        (progn (erase-buffer) (insert title "\n\n"))
+        (erase-buffer)
+        (condition-case err
+            (ioccur-print-results regexp)
+          (error (setq wrong-regexp t)))
+        (goto-char (point-min))
+        (if wrong-regexp
+            (insert
+             title "\n\n"
+             (propertize "Invalid Regexp: "
+                         'face 'ioccur-invalid-regexp)
+             (format "No match for `%s'" regexp) "\n\n")
+            (insert title "\n\n"
+                    (propertize (format "Found %s occurences matching "
+                                        ioccur-count-occurences)
+                                'face 'underline)
+                    (propertize regexp 'face 'ioccur-regexp-face)
+                    (propertize
+                     (format " in %s" ioccur-current-buffer)
+                     'face 'underline) "\n\n")
+            (ioccur-color-current-line)))))
+
+(defun ioccur-start-timer ()
+  "Start ioccur incremental timer."
+  (setq ioccur-search-timer
+        (run-with-idle-timer
+         ioccur-search-delay 'repeat
+         #'(lambda ()
+             (ioccur-print-buffer
+              ioccur-pattern)))))
+
+(defun ioccur-send-message ()
+  "Send message defined in `ioccur-message'."
+  (message ioccur-message))
+
+;;;###autoload
+(defun ioccur (&optional initial-input)
+  "Incremental search of lines in current buffer matching input.
+With a prefix arg search symbol at point (INITIAL-INPUT).
+
+While you are incremental searching, commands provided are:
+
+C-n or <down>  next line.
+C-p or <up>    precedent line.
+C-v and M-v    scroll up and down.
+C-z or <right> jump without quitting loop.
+C-j or <left>  jump and kill `ioccur-buffer'.
+RET            exit keeping `ioccur-buffer'.
+DEL            remove last character entered.
+C-k            Kill current input from cursor to eol.
+C-a/e/b/f      Movements in minibuffer.
+M-k            Kill current input as sexp.
+C-w            Yank stuff at point.
+C-g            quit and restore buffer.
+C-s            Toggle split window.
+C-:            Toggle regexp/litteral search.
+C-down         Follow in other buffer.
+C-up           Follow in other buffer.
+M-p/n          Precedent and next `ioccur-history' element.
+M-<, M->       Beginning and end of buffer.
+
+Unlike minibuffer history, cycling in ioccur history have no end:
+
+M-p ,-->A B C D E F G H I---,
+    |                       |
+    `---I H G F E D C B A<--'
+
+M-n ,-->I H G F E D C B A---,
+    |                       |
+    `---A B C D E F G H I<--'
+
+
+Special NOTE for terms:
+=======================
+  tab/S-tab are bound to history.
+  C-d/u are for following in other buffer.
+  Use C-t to Scroll up.
+When you quit incremental search with RET, see `ioccur-mode'
+for commands provided in the `ioccur-buffer'."
+  (interactive "P")
+  (let (pop-up-frames)
+    (setq ioccur-exit-and-quit-p nil)
+    (setq ioccur-success nil)
+    (setq ioccur-current-buffer (buffer-name (current-buffer)))
+    (when ioccur-fontify-buffer-p
+      (message "Fontifying buffer...Please wait it could be long.")
+      (jit-lock-fontify-now) (message nil))
+    (setq ioccur-buffer (concat "*ioccur-" ioccur-current-buffer "*"))
+    (setq ioccur-last-window-configuration (current-window-configuration))
+    (if (and (not initial-input)
+             (get-buffer ioccur-buffer)
+             (not (get-buffer-window ioccur-buffer)))
+        ;; An hidden `ioccur-buffer' exists jump to it and reuse it.
+        (switch-to-buffer-other-window ioccur-buffer t)
+        ;; `ioccur-buffer' doesn't exists or is visible, start searching
+        ;; Creating a new `ioccur-buffer' or reusing the visible one after
+        ;; erasing it.
+        (let* ((init-str (if initial-input
+                             (if (stringp initial-input)
+                                 initial-input (thing-at-point 'symbol))
+                             ""))
+               (len      (length init-str))
+               (curpos   (point))
+               (inhibit-read-only t)
+               (cur-mode (with-current-buffer ioccur-current-buffer
+                           (prog1
+                               major-mode
+                             ;; If current `major-mode' is wdired
+                             ;; Turn it off.
+                             (when (eq major-mode 'wdired-mode)
+                               (wdired-change-to-dired-mode)))))
+               str-no-prop)
+          (set-text-properties 0 len nil init-str)
+          (setq str-no-prop init-str)
+          (pop-to-buffer (get-buffer-create ioccur-buffer))
+          (ioccur-mode)
+          (unwind-protect
+               ;; Start incremental search.
+               (progn
+                 (ioccur-start-timer)
+                 (ioccur-read-search-input str-no-prop curpos))
+            ;; At this point incremental search loop is exited.
+            (progn
+              (ioccur-cancel-search)
+              (kill-local-variable 'mode-line-format)
+              (when (equal (buffer-substring (point-at-bol) (point-at-eol)) "")
+                (setq ioccur-quit-flag t))
+              (cond (ioccur-quit-flag ; C-g hit or empty `ioccur-buffer'.
+                     (kill-buffer ioccur-buffer)
+                     (pop-to-buffer ioccur-current-buffer)
+                     (when ioccur-match-overlay
+                       (delete-overlay ioccur-match-overlay))
+                     (set-window-configuration ioccur-last-window-configuration)
+                     (goto-char curpos)
+                     (ioccur-send-message)
+                     ;; If `ioccur-message' is non--nil, thats mean we exit
+                     ;; with a specific action other than `C-g',
+                     ;; e.g kill-as-sexp, so we save history.
+                     (when ioccur-message (ioccur-save-history)))
+                    (ioccur-exit-and-quit-p ; Jump and kill `ioccur-buffer'.
+                     (ioccur-jump-and-quit)
+                     (kill-buffer ioccur-buffer)
+                     (ioccur-send-message) (ioccur-save-history))
+                    (t                 ; Jump keeping `ioccur-buffer'.
+                     (ioccur-jump)
+                     (pop-to-buffer ioccur-buffer)
+                     (setq buffer-read-only t)
+                     (ioccur-save-history)))
+              ;; Maybe reenable `wdired-mode'.
+              (when (eq cur-mode 'wdired-mode) (wdired-change-to-wdired-mode))
+              (setq ioccur-count-occurences 0)
+              (setq ioccur-quit-flag nil)
+              (setq ioccur-message nil)
+              (setq ioccur-search-function ioccur-default-search-function)))))))
+
+(defun ioccur-save-history ()
+  "Save last ioccur element found in `ioccur-history'."
+  (unless (string= ioccur-pattern "")
+    (setq ioccur-history
+          (cons ioccur-pattern (delete ioccur-pattern ioccur-history)))
+    (when (> (length ioccur-history) ioccur-max-length-history)
+      (setq ioccur-history (delete (car (last ioccur-history))
+                                         ioccur-history)))
+    (setq ioccur-success t)))
+
+(defun ioccur-cancel-search ()
+  "Cancel timer used for ioccur searching."
+  (when ioccur-search-timer
+    (cancel-timer ioccur-search-timer)
+    (setq ioccur-search-timer nil)))
+
+(defun ioccur-color-current-line ()
+  "Highlight and underline current line in `ioccur-buffer'."
+  (if ioccur-occur-overlay
+      (move-overlay ioccur-occur-overlay
+                    (point-at-bol) (1+ (point-at-eol)) ioccur-buffer)
+      (setq ioccur-occur-overlay
+            (make-overlay (point-at-bol) (1+ (point-at-eol)) ioccur-buffer)))
+  (overlay-put ioccur-occur-overlay 'face 'ioccur-overlay-face))
+
+(defun ioccur-color-matched-line ()
+  "Highlight and underline current position \
+of matched line in `ioccur-current-buffer'."
+  (if ioccur-match-overlay
+      (move-overlay ioccur-match-overlay
+                    (point-at-bol) (1+ (point-at-eol)))
+      (setq ioccur-match-overlay
+            (make-overlay (point-at-bol) (1+ (point-at-eol)))))
+  (overlay-put ioccur-match-overlay 'face 'ioccur-match-overlay-face))
+
+            
+(provide 'ioccur)
+
+;;; ioccur.el ends here
diff --git a/packages/jgraph-mode/jgraph-mode.el b/packages/jgraph-mode/jgraph-mode.el
new file mode 100644 (file)
index 0000000..8f211aa
--- /dev/null
@@ -0,0 +1,228 @@
+;;; jgraph-mode.el --- Major mode for Jgraph files
+
+;; Copyright (C) 2006, 2011-2012  Free Software Foundation, Inc
+
+;; Author: Stefan Monnier <monnier@iro.umontreal.ca>
+;; Version: 1.0
+;; Keywords: tex, wp
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Simple editing mode for the Jgraph graph plotting tool.
+;; You can find more info at http://web.eecs.utk.edu/~plank/plank/jgraph/jgraph.html
+
+;;; Code:
+
+(defgroup jgraph-mode ()
+  "Major mode for Jgraph files."
+  :group 'tools)
+
+(defvar jgraph-mode-map
+  (let ((map (make-sparse-keymap)))
+    map)
+  "Keymap for `jgraph-mode'.")
+
+;; (easy-menu-define jgraph-mode-menu jgraph-mode-map
+;;   "Menu for `jgraph-mode'."
+;;   '("Jgraph"
+;;     ["Do some stuff" jgraph-do-bar :active mark-active]
+;;     "..."
+;;     ["Do some other" jgraph-do-foo]
+;;     ("Sub-jgraph"
+;;      ["Haha" jgraph-crash])
+;;     ...))
+
+(defvar jgraph-mode-syntax-table
+  (let ((st (make-syntax-table)))
+    ;; tokens are made of any non-whitespace chars.
+    (map-char-table (lambda (c v) (if (not (memq (car v) '(0 2 3)))
+                                 (modify-syntax-entry c "_" st)))
+                    st)
+    (modify-syntax-entry ?\( "_ 1n" st)
+    (modify-syntax-entry ?\) "_ 4n" st)
+    (modify-syntax-entry ?\* "_ 23" st)
+    st)
+  "Syntax table for `jgraph-mode'.")
+
+(defun jgraph-extract-commands ()
+  (let ((sections nil)
+        (tok-cmds nil))
+    (goto-char (point-min))
+    (while (and (re-search-forward "^\\.RE" nil t)
+                (re-search-forward "^\\.B \\(.*\\)" nil t))
+      (let ((section (downcase (match-string 1)))
+            (commands nil)
+            (end (save-excursion
+                   (and (re-search-forward "^\\.RE" nil t)
+                        (match-beginning 0)))))
+        (setq section (replace-regexp-in-string "simple" "" section))
+        (setq section (replace-regexp-in-string "advanced" "" section))
+        (setq section (replace-regexp-in-string "editing" "" section))
+        (setq section (replace-regexp-in-string "commands" "" section))
+        (setq section (replace-regexp-in-string "\\\\" "" section))
+        (setq section (replace-regexp-in-string "\\` *" "" section))
+        (setq section (replace-regexp-in-string " *\\'" "" section))
+        (setq section (replace-regexp-in-string " " "-" section))
+        (setq section (intern section))
+        (while (re-search-forward "^\\.TP\n\\(?:\\.B \\|\\\\fB\\)\\([^ :\t\n\\]+\\)\\([ {\\fI]*token\\)?" end 'move)
+          (let ((cmd (match-string-no-properties 1)))
+            (if (match-end 2) (add-to-list 'tok-cmds cmd))
+            (add-to-list 'commands cmd)))
+        (setq commands (nreverse commands))
+        (let ((sec (assoc section sections)))
+          (if sec (nconc sec commands)
+            (push (cons section commands) sections)))))
+    (nreverse (cons (cons 'token tok-cmds) sections))))
+
+(defconst jgraph-commands
+  ;; Obtained by running (jgraph-extract-commands) in the jgraph.1 nroff doc.
+  '((top-level-description "newgraph" "graph" "copygraph" "newpage" "X" "Y"
+                           "bbox" "preamble" "epilogue")
+    (graph "xaxis" "yaxis" "newcurve" "curve" "newline" "copycurve" "title"
+           "legend" "newstring" "string" "copystring" "border" "noborder"
+           "clip" "noclip" "inherit_axes" "x_translate" "y_translate" "X" "Y")
+    (axis "linear" "log" "min" "max" "size" "log_base" "hash" "shash" "mhash"
+          "precision" "hash_format" "label" "draw_at" "nodraw" "draw"
+          "grid_lines" "no_grid_lines" "mgrid_lines" "no_mgrid_lines" "gray"
+          "color" "grid_gray" "grid_color" "mgrid_gray" "mgrid_color" "hash_at"
+          "mhash_at" "hash_label" "hash_labels" "hash_scale"
+          "draw_hash_marks_at" "draw_hash_labels_at" "auto_hash_marks"
+          "no_auto_hash_marks" "auto_hash_labels" "no_auto_hash_labels"
+          "draw_axis" "no_draw_axis" "draw_axis_label" "no_draw_axis_label"
+          "draw_hash_marks" "no_draw_hash_marks" "draw_hash_labels"
+          "no_draw_hash_labels")
+    (curve "pts" "x_epts" "y_epts" "marktype" "marksize" "mrotate" "gray"
+           "color" "fill" "cfill" "pattern" "poly" "nopoly" "pfill" "pcfill"
+           "ppattern" "gmarks" "postscript" "eps" "larrows" "rarrows"
+           "nolarrows" "norarrows" "larrow" "rarrow" "nolarrow" "norarrow"
+           "asize" "afill" "apattern" "linetype" "glines" "linethickness"
+           "bezier" "nobezier" "clip" "noclip" "label")
+    (label "x" "y" "font" "fontsize" "linesep" "hjl" "hjc" "hjr" "vjt" "vjc"
+           "vjb" "rotate" "lgray" "lcolor")
+    (legend "on" "off" "linelength" "linebreak" "midspace" "defaults" "left"
+            "top" "bottom" "x" "y" "custom")
+    (hash-label "at")
+    ;; Commands that can be followed by a token.
+    (token "apattern" "eps" "postscript" "ppattern" "pattern" "hash_format"
+           "epilogue" "preamble")))
+
+(defconst jgraph-file-include-commands
+  '("include" "preamble" "epilogue" "postscript" "eps"))
+
+(defvar jgraph-font-lock-keywords
+  `((,(concat "\\_<" (regexp-opt jgraph-file-include-commands)
+              "[ \t]+\\(\\sw+\\)")
+     (1 font-lock-constant-face))
+    (,(concat "^" (regexp-opt
+                   (cdr (assoc 'top-level-description jgraph-commands)))
+              "\\_>")
+     . font-lock-function-name-face)
+    (,(concat "\\_<"
+              (regexp-opt (cons "include"
+                                (apply 'append (mapcar 'cdr jgraph-commands))))
+              "\\_>") . font-lock-keyword-face)
+    )
+  "Keyword highlighting specification for `jgraph-mode'.")
+
+;; (defvar jgraph-imenu-generic-expression
+;;   '(("Vars" "^defvar[ \t]+\\(\\(\\sw\\|\\s_\\)+\\)" 1)
+;;     (nil "^function[ \t]+\\(\\(\\sw\\|\\s_\\)+\\)" 1)
+;;     ...)
+;;   "Regex patterns for the index menu of `jgraph-mode'.")
+
+;; (defvar jgraph-outline-regexp "(\\|;;;+"
+;;   "Regexp for `outline-minor-mode' in `jgraph-mode'.")
+
+;; Abbreviations and Skeletons
+
+;; (define-skeleton jgraph-insert-if
+;;   "Jgraph mode skeleton for if..then expressions."
+;;   nil
+;;   "if " _ \n "then " _ \n "else " _ \n "fi" \n)
+
+;; (define-skeleton jgraph-insert-begend
+;;   "Jgraph mode skeleton for begin<x>...end<x> expressions."
+;;   "Block name: "
+;;   "begin<" str ">" \n _ \n "end<" str ">" \n)
+
+;; (define-abbrev-table 'jgraph-mode-abbrev-table
+;;   '(("if" "" jgraph-insert-if nil t)
+;;     ("cwcc" "call-with-current-continuation" nil nil t)
+;;     ("begin" "" jgraph-insert-begend nil t)
+;;     ))
+
+;;;###autoload
+(add-to-list 'auto-mode-alist '("\\.jgr\\'" . jgraph-mode))
+
+;;;###autoload
+(define-derived-mode jgraph-mode prog-mode "Jgraph"
+  "A major mode for editing Jgraph files."
+  (set (make-local-variable 'comment-start) "(* ")
+  (set (make-local-variable 'comment-start-skip) "\\_<(\\*\\_>[ \t]*")
+  (set (make-local-variable 'comment-end) " *)")
+  (set (make-local-variable 'comment-start-skip) "[ \t]*\\_<\\*)\\_>")
+  (set (make-local-variable 'font-lock-defaults)
+       '(jgraph-font-lock-keywords))
+  (set (make-local-variable 'syntax-propertize-function)
+       (syntax-propertize-rules
+        ;; FIXME: naive(broken) multiline pattern.
+        ("\\s-\\(:\\)\\s-\\(?:.*\\\\\n\\)*.*\\(\n\\)" (1 "|") (2 "|"))))
+  (set (make-local-variable 'indent-line-function) 'jgraph-indent-line)
+  ;; (set (make-local-variable 'imenu-generic-expression)
+  ;;      jgraph-imenu-generic-expression)
+  ;; (set (make-local-variable 'outline-regexp) jgraph-outline-regexp)
+  )
+
+;;; Indentation
+
+(defcustom jgraph-indent-offset 4
+  "Basic indentation step size in `jgraph-mode'."
+  :group 'jgraph-mode
+  :type 'integer)
+
+(defun jgraph-indent-line ()
+  "Indent current line of Jgraph code."
+  (interactive)
+  (let* ((savep (point))
+        (indent (or (with-demoted-errors
+                       (save-excursion
+                         (forward-line 0)
+                         (skip-chars-forward " \t")
+                         (if (>= (point) savep) (setq savep nil))
+                         (jgraph-indent-calculate)))
+                     'noindent)))
+    (if (not (numberp indent))
+        indent
+      (setq indent (max indent 0))
+      (if savep
+          (save-excursion (indent-line-to indent))
+        (indent-line-to indent)))))
+
+(defun jgraph-indent-calculate ()
+  "Return the column to which the current line should be indented."
+  (save-excursion
+    (skip-chars-forward " \t")
+    (or (when (looking-at (concat (regexp-opt
+                                   (cdr (assoc 'top-level-description
+                                               jgraph-commands)))
+                                  "\\_>"))
+          0)
+        'noindent)))
+
+(provide 'jgraph-mode)
+;;; jgraph-mode.el ends here
diff --git a/packages/js2-mode/js2-imenu-extras.el b/packages/js2-mode/js2-imenu-extras.el
new file mode 100644 (file)
index 0000000..e8e15a5
--- /dev/null
@@ -0,0 +1,222 @@
+;;; js2-imenu-extras.el --- Imenu support for additional constructs\r
+\r
+;; Copyright (C) 2012-2013  Free Software Foundation, Inc.\r
+\r
+;; Author:    Dmitry Gutov <dgutov@yandex.ru>\r
+;; Keywords:  languages, javascript, imenu\r
+\r
+;; This file is part of GNU Emacs.\r
+\r
+;; GNU Emacs is free software: you can redistribute it and/or modify\r
+;; it under the terms of the GNU General Public License as published by\r
+;; the Free Software Foundation, either version 3 of the License, or\r
+;; (at your option) any later version.\r
+\r
+;; GNU Emacs is distributed in the hope that it will be useful,\r
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+;; GNU General Public License for more details.\r
+\r
+;; You should have received a copy of the GNU General Public License\r
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.\r
+\r
+;;; Commentary:\r
+\r
+;; This package adds Imenu support for additional framework constructs and\r
+;; structural patterns to `js2-mode'.\r
+\r
+;; Usage:\r
+\r
+;; (add-hook 'js2-mode-hook 'js2-imenu-extras-mode)\r
+\r
+;; To customize how it works:\r
+;;   M-x customize-group RET js2-imenu RET\r
+\r
+(eval-when-compile\r
+  (require 'cl))\r
+\r
+(require 'js2-mode)\r
+\r
+(defconst js2-imenu-extension-styles\r
+  `((:framework jquery\r
+     :call-re   "\\_<\\(?:jQuery\\|\\$\\|_\\)\\.extend\\s-*("\r
+     :recorder  js2-imenu-record-jquery-extend)\r
+\r
+    (:framework jquery-ui\r
+     :call-re   "^\\s-*\\(?:jQuery\\|\\$\\)\\.widget\\s-*("\r
+     :recorder  js2-imenu-record-string-declare)\r
+\r
+    (:framework dojo\r
+     :call-re   "^\\s-*dojo.declare\\s-*("\r
+     :recorder  js2-imenu-record-string-declare)\r
+\r
+    (:framework backbone\r
+     :call-re   ,(concat "\\_<" js2-mode-identifier-re "\\.extend\\s-*(")\r
+     :recorder  js2-imenu-record-backbone-extend))\r
+  "List of JavaScript class definition or extension styles.\r
+\r
+:framework is a valid value in `js2-imenu-enabled-frameworks'.\r
+\r
+:call-re is a regular expression that has no capturing groups.\r
+\r
+:recorder is a function name that will be called when the regular\r
+expression matches some text in the buffer.  When it's called, point will be\r
+at the end of the match.  The function must keep the point position.")\r
+\r
+(defconst js2-imenu-available-frameworks\r
+  (mapcar (lambda (style) (plist-get style :framework)) js2-imenu-extension-styles)\r
+  "List of available JavaScript framework symbols.")\r
+\r
+(defcustom js2-imenu-enabled-frameworks js2-imenu-available-frameworks\r
+  "Frameworks to be recognized by `js2-mode'."\r
+  :type (cons 'set (mapcar (lambda (x) (list 'const x))\r
+                           js2-imenu-available-frameworks))\r
+  :group 'js2-imenu)\r
+\r
+(defcustom js2-imenu-show-other-functions t\r
+  "Non-nil to show functions not recognized by other mechanisms,\r
+in a shared namespace."\r
+  :type 'boolean\r
+  :group 'js2-imenu)\r
+\r
+(defcustom js2-imenu-other-functions-ns "?"\r
+  "Namespace name to use for other functions."\r
+  :type 'string\r
+  :group 'js2-imenu)\r
+\r
+(defcustom js2-imenu-show-module-pattern t\r
+  "Non-nil to recognize the module pattern:\r
+\r
+var foobs = (function(a) {\r
+  return {fib: function() {}, fub: function() {}};\r
+})(b);\r
+\r
+We record the returned hash as belonging to the named module, and\r
+prefix any functions defined inside the IIFE with the module name."\r
+  :type 'boolean\r
+  :group 'js2-imenu)\r
+\r
+;;;###autoload\r
+(defun js2-imenu-extras-setup ()\r
+  (when js2-imenu-enabled-frameworks\r
+    (add-hook 'js2-post-parse-callbacks 'js2-imenu-record-declarations t t))\r
+  (when (or js2-imenu-show-other-functions js2-imenu-show-module-pattern)\r
+    (add-hook 'js2-post-parse-callbacks 'js2-imenu-walk-ast t t)))\r
+\r
+(defun js2-imenu-extras-remove ()\r
+  (remove-hook 'js2-post-parse-callbacks 'js2-imenu-record-declarations t)\r
+  (remove-hook 'js2-post-parse-callbacks 'js2-imenu-walk-ast t))\r
+\r
+(defun js2-imenu-record-declarations ()\r
+  (let* ((styles (loop for style in js2-imenu-extension-styles\r
+                       when (memq (plist-get style :framework)\r
+                                  js2-imenu-enabled-frameworks)\r
+                       collect style))\r
+         (re (mapconcat (lambda (style)\r
+                          (concat "\\(" (plist-get style :call-re) "\\)"))\r
+                        styles "\\|")))\r
+    (goto-char (point-min))\r
+    (while (js2-re-search-forward re nil t)\r
+      (loop for i from 0 to (1- (length styles))\r
+            when (match-beginning (1+ i))\r
+            return (funcall (plist-get (nth i styles) :recorder))))))\r
+\r
+(defun js2-imenu-record-jquery-extend ()\r
+  (let ((pred (lambda (subject)\r
+                (and\r
+                 (js2-prop-get-node-p subject)\r
+                 (string= (js2-name-node-name (js2-prop-get-node-right subject))\r
+                          "prototype")))))\r
+    (js2-imenu-record-extend-first-arg (1- (point)) pred\r
+                                       'js2-compute-nested-prop-get)))\r
+\r
+(defun js2-imenu-record-string-declare ()\r
+  (js2-imenu-record-extend-first-arg\r
+   (1- (point)) 'js2-string-node-p\r
+   (lambda (node) (split-string (js2-string-node-value node) "\\." t))))\r
+\r
+(defun js2-imenu-record-extend-first-arg (point pred qname-fn)\r
+  (let* ((node (js2-node-at-point point))\r
+         (args (js2-call-node-args node))\r
+         (subject (first args)))\r
+    (when (funcall pred subject)\r
+      (loop for arg in (cdr args)\r
+            when (js2-object-node-p arg)\r
+            do (js2-record-object-literal\r
+                arg (funcall qname-fn subject) (js2-node-abs-pos arg))))))\r
+\r
+(defun js2-imenu-record-backbone-extend ()\r
+  (let* ((node (js2-node-at-point (1- (point))))\r
+         (args (js2-call-node-args node))\r
+         (methods (first args))\r
+         (parent (js2-node-parent node)))\r
+    (when (js2-object-node-p methods)\r
+      (let ((subject (cond ((js2-var-init-node-p parent)\r
+                            (js2-var-init-node-target parent))\r
+                           ((js2-assign-node-p parent)\r
+                            (js2-assign-node-left parent)))))\r
+        (when subject\r
+          (js2-record-object-literal methods\r
+                                     (js2-compute-nested-prop-get subject)\r
+                                     (js2-node-abs-pos methods)))))))\r
+\r
+(defun js2-imenu-walk-ast ()\r
+  (js2-visit-ast\r
+   js2-mode-ast\r
+   (lambda (node end-p)\r
+     (unless end-p\r
+       (cond\r
+        ((and js2-imenu-show-other-functions\r
+              (js2-object-prop-node-p node))\r
+         (js2-imenu-record-orphan-function node))\r
+        ((and js2-imenu-show-module-pattern\r
+              (js2-assign-node-p node))\r
+         (js2-imenu-record-module-pattern node)))\r
+       t))))\r
+\r
+(defun js2-imenu-record-orphan-function (node)\r
+  "Record orphan function when it's the value of NODE.\r
+NODE must be `js2-object-prop-node'."\r
+  (when (js2-function-node-p (js2-object-prop-node-right node))\r
+    (let ((fn-node (js2-object-prop-node-right node)))\r
+      (unless (and js2-imenu-function-map\r
+                   (gethash fn-node js2-imenu-function-map))\r
+        (let ((key-node (js2-object-prop-node-left node)))\r
+          (js2-record-imenu-entry fn-node\r
+                                  (list js2-imenu-other-functions-ns\r
+                                        (js2-prop-node-name key-node))\r
+                                  (js2-node-abs-pos key-node)))))))\r
+\r
+(defun js2-imenu-record-module-pattern (node)\r
+  "Recognize and record module pattern use instance.\r
+NODE must be `js2-assign-node'."\r
+  (let ((init (js2-assign-node-right node)))\r
+    (when (js2-call-node-p init)\r
+      (let ((target (js2-assign-node-left node))\r
+            (callt (js2-call-node-target init)))\r
+        ;; Just basic call form: (function() {...})();\r
+        ;; TODO: Handle variations without duplicating `js2-wrapper-function-p'?\r
+        (when (and (js2-paren-node-p callt)\r
+                   (js2-function-node-p (js2-paren-node-expr callt)))\r
+          (let* ((fn (js2-paren-node-expr callt))\r
+                 (blk (js2-function-node-body fn))\r
+                 (ret (car (last (js2-block-node-kids blk)))))\r
+            (when (and (js2-return-node-p ret)\r
+                       (js2-object-node-p (js2-return-node-retval ret)))\r
+              ;; TODO: Map function names when revealing module pattern is used.\r
+              (let ((retval (js2-return-node-retval ret))\r
+                    (target-qname (js2-compute-nested-prop-get target)))\r
+                (js2-record-object-literal retval target-qname\r
+                                           (js2-node-abs-pos retval))\r
+                (js2-record-imenu-entry fn target-qname\r
+                                        (js2-node-abs-pos target))))))))))\r
+\r
+;;;###autoload\r
+(define-minor-mode js2-imenu-extras-mode\r
+  "Toggle Imenu support for frameworks and structural patterns."\r
+  :lighter ""\r
+  (if js2-imenu-extras-mode\r
+      (js2-imenu-extras-setup)\r
+    (js2-imenu-extras-remove)))\r
+\r
+(provide 'js2-imenu-extras)\r
diff --git a/packages/js2-mode/js2-mode.el b/packages/js2-mode/js2-mode.el
new file mode 100644 (file)
index 0000000..982b794
--- /dev/null
@@ -0,0 +1,11310 @@
+;;; js2-mode.el --- Improved JavaScript editing mode
+
+;; Copyright (C) 2009, 2011-2013  Free Software Foundation, Inc.
+
+;; Author: Steve Yegge <steve.yegge@gmail.com>
+;;         mooz <stillpedant@gmail.com>
+;;         Dmitry Gutov <dgutov@yandex.ru>
+;; URL:  https://github.com/mooz/js2-mode/
+;;       http://code.google.com/p/js2-mode/
+;; Version: 20130619
+;; Keywords: languages, javascript
+;; Package-Requires: ((emacs "24.1"))
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This JavaScript editing mode supports:
+
+;;  - strict recognition of the Ecma-262 language standard
+;;  - support for most Rhino and SpiderMonkey extensions from 1.5 and up
+;;  - parsing support for ECMAScript for XML (E4X, ECMA-357)
+;;  - accurate syntax highlighting using a recursive-descent parser
+;;  - on-the-fly reporting of syntax errors and strict-mode warnings
+;;  - undeclared-variable warnings using a configurable externs framework
+;;  - "bouncing" line indentation to choose among alternate indentation points
+;;  - smart line-wrapping within comments and strings
+;;  - code folding:
+;;    - show some or all function bodies as {...}
+;;    - show some or all block comments as /*...*/
+;;  - context-sensitive menu bar and popup menus
+;;  - code browsing using the `imenu' package
+;;  - many customization options
+
+;; Installation:
+;;
+;; To install it as your major mode for JavaScript editing:
+
+;;   (add-to-list 'auto-mode-alist '("\\.js\\'" . js2-mode))
+
+;; Alternatively, to install it as a minor mode just for JavaScript linting,
+;; you must add it to the appropriate major-mode hook.  Normally this would be:
+
+;;   (add-hook 'js-mode-hook 'js2-minor-mode)
+
+;; You may also want to hook it in for shell scripts running via node.js:
+
+;;   (add-to-list 'interpreter-mode-alist '("node" . js2-mode))
+
+;; To customize how it works:
+;;   M-x customize-group RET js2-mode RET
+
+;; Notes:
+
+;; This mode includes a port of Mozilla Rhino's scanner, parser and
+;; symbol table.  Ideally it should stay in sync with Rhino, keeping
+;; `js2-mode' current as the EcmaScript language standard evolves.
+
+;; Unlike cc-engine based language modes, js2-mode's line-indentation is not
+;; customizable.  It is a surprising amount of work to support customizable
+;; indentation.  The current compromise is that the tab key lets you cycle among
+;; various likely indentation points, similar to the behavior of python-mode.
+
+;; This mode does not yet work with "multi-mode" modes such as `mmm-mode'
+;; and `mumamo', although it could be made to do so with some effort.
+;; This means that `js2-mode' is currently only useful for editing JavaScript
+;; files, and not for editing JavaScript within <script> tags or templates.
+
+;; The project page on GitHub is used for development and issue tracking.
+;; The original homepage at Google Code is mentioned here for posterity, it has
+;; outdated information and is mostly unmaintained.
+
+;;; Code:
+
+(eval-when-compile
+  (require 'cl))
+
+(require 'imenu)
+(require 'cc-cmds)  ; for `c-fill-paragraph'
+
+(eval-and-compile
+  (require 'cc-mode)     ; (only) for `c-populate-syntax-table'
+  (require 'cc-engine))  ; for `c-paragraph-start' et. al.
+
+(defvar electric-layout-rules)
+
+;;; Externs (variables presumed to be defined by the host system)
+
+(defvar js2-ecma-262-externs
+  (mapcar 'symbol-name
+          '(Array Boolean Date Error EvalError Function Infinity JSON
+          Math NaN Number Object RangeError ReferenceError RegExp
+          String SyntaxError TypeError URIError arguments
+          decodeURI decodeURIComponent encodeURI
+          encodeURIComponent escape eval isFinite isNaN
+          parseFloat parseInt undefined unescape))
+"Ecma-262 externs.  Included in `js2-externs' by default.")
+
+(defvar js2-browser-externs
+  (mapcar 'symbol-name
+          '(;; DOM level 1
+            Attr CDATASection CharacterData Comment DOMException
+            DOMImplementation Document DocumentFragment
+            DocumentType Element Entity EntityReference
+            ExceptionCode NamedNodeMap Node NodeList Notation
+            ProcessingInstruction Text
+
+            ;; DOM level 2
+            HTMLAnchorElement HTMLAppletElement HTMLAreaElement
+            HTMLBRElement HTMLBaseElement HTMLBaseFontElement
+            HTMLBodyElement HTMLButtonElement HTMLCollection
+            HTMLDListElement HTMLDirectoryElement HTMLDivElement
+            HTMLDocument HTMLElement HTMLFieldSetElement
+            HTMLFontElement HTMLFormElement HTMLFrameElement
+            HTMLFrameSetElement HTMLHRElement HTMLHeadElement
+            HTMLHeadingElement HTMLHtmlElement HTMLIFrameElement
+            HTMLImageElement HTMLInputElement HTMLIsIndexElement
+            HTMLLIElement HTMLLabelElement HTMLLegendElement
+            HTMLLinkElement HTMLMapElement HTMLMenuElement
+            HTMLMetaElement HTMLModElement HTMLOListElement
+            HTMLObjectElement HTMLOptGroupElement
+            HTMLOptionElement HTMLOptionsCollection
+            HTMLParagraphElement HTMLParamElement HTMLPreElement
+            HTMLQuoteElement HTMLScriptElement HTMLSelectElement
+            HTMLStyleElement HTMLTableCaptionElement
+            HTMLTableCellElement HTMLTableColElement
+            HTMLTableElement HTMLTableRowElement
+            HTMLTableSectionElement HTMLTextAreaElement
+            HTMLTitleElement HTMLUListElement
+
+            ;; DOM level 3
+            DOMConfiguration DOMError DOMException
+            DOMImplementationList DOMImplementationSource
+            DOMLocator DOMStringList NameList TypeInfo
+            UserDataHandler
+
+            ;; Window
+            window alert confirm document java navigator prompt screen
+            self top
+
+            ;; W3C CSS
+            CSSCharsetRule CSSFontFace CSSFontFaceRule
+            CSSImportRule CSSMediaRule CSSPageRule
+            CSSPrimitiveValue CSSProperties CSSRule CSSRuleList
+            CSSStyleDeclaration CSSStyleRule CSSStyleSheet
+            CSSValue CSSValueList Counter DOMImplementationCSS
+            DocumentCSS DocumentStyle ElementCSSInlineStyle
+            LinkStyle MediaList RGBColor Rect StyleSheet
+            StyleSheetList ViewCSS
+
+            ;; W3C Event
+            EventListener EventTarget Event DocumentEvent UIEvent
+            MouseEvent MutationEvent KeyboardEvent
+
+            ;; W3C Range
+            DocumentRange Range RangeException
+
+            ;; W3C XML
+            XPathResult XMLHttpRequest
+
+            ;; console object.  Provided by at least Chrome and Firefox.
+            console))
+  "Browser externs.
+You can cause these to be included or excluded with the custom
+variable `js2-include-browser-externs'.")
+
+(defvar js2-rhino-externs
+  (mapcar 'symbol-name
+          '(Packages importClass importPackage com org java
+            ;; Global object (shell) externs.
+            defineClass deserialize doctest gc help load
+            loadClass print quit readFile readUrl runCommand seal
+            serialize spawn sync toint32 version))
+  "Mozilla Rhino externs.
+Set `js2-include-rhino-externs' to t to include them.")
+
+(defvar js2-node-externs
+  (mapcar 'symbol-name
+          '(__dirname __filename Buffer clearInterval clearTimeout require
+            console exports global module process setInterval setTimeout))
+  "Node.js externs.
+Set `js2-include-node-externs' to t to include them.")
+
+(defvar js2-typed-array-externs
+  (mapcar 'symbol-name
+          '(ArrayBuffer Uint8ClampedArray DataView
+            Int8Array Uint8Array Int16Array Uint16Array Int32Array Uint32Array
+            Float32Array Float64Array))
+  "Khronos typed array externs. Available in most modern browsers and
+in node.js >= 0.6. If `js2-include-node-externs' or `js2-include-browser-externs'
+are enabled, these will also be included.")
+
+;;; Variables
+
+(defun js2-mark-safe-local (name pred)
+  "Make the variable NAME buffer-local and mark it as safe file-local
+variable with predicate PRED."
+  (make-variable-buffer-local name)
+  (put name 'safe-local-variable pred))
+
+(defcustom js2-highlight-level 2
+  "Amount of syntax highlighting to perform.
+0 or a negative value means none.
+1 adds basic syntax highlighting.
+2 adds highlighting of some Ecma built-in properties.
+3 adds highlighting of many Ecma built-in functions."
+  :group 'js2-mode
+  :type '(choice (const :tag "None" 0)
+                 (const :tag "Basic" 1)
+                 (const :tag "Include Properties" 2)
+                 (const :tag "Include Functions" 3)))
+
+(defvar js2-mode-dev-mode-p nil
+  "Non-nil if running in development mode.  Normally nil.")
+
+(defgroup js2-mode nil
+  "An improved JavaScript mode."
+  :group 'languages)
+
+(defcustom js2-basic-offset (if (and (boundp 'c-basic-offset)
+                                     (numberp c-basic-offset))
+                                c-basic-offset
+                              4)
+  "Number of spaces to indent nested statements.
+Similar to `c-basic-offset'."
+  :group 'js2-mode
+  :type 'integer)
+(js2-mark-safe-local 'js2-basic-offset 'integerp)
+
+(defcustom js2-bounce-indent-p nil
+  "Non-nil to have indent-line function choose among alternatives.
+If nil, the indent-line function will indent to a predetermined column
+based on heuristic guessing.  If non-nil, then if the current line is
+already indented to that predetermined column, indenting will choose
+another likely column and indent to that spot.  Repeated invocation of
+the indent-line function will cycle among the computed alternatives.
+See the function `js2-bounce-indent' for details.  When it is non-nil,
+js2-mode also binds `js2-bounce-indent-backwards' to Shift-Tab."
+  :type 'boolean
+  :group 'js2-mode)
+
+(defcustom js2-pretty-multiline-declarations t
+  "Non-nil to line up multiline declarations vertically:
+
+  var a = 10,
+      b = 20,
+      c = 30;
+
+If the value is not `all', and the first assigned value in
+declaration is a function/array/object literal spanning several
+lines, it won't be indented additionally:
+
+  var o = {                   var bar = 2,
+    foo: 3          vs.           o = {
+  },                                foo: 3
+      bar = 2;                    };"
+  :group 'js2-mode
+  :type 'symbol)
+(js2-mark-safe-local 'js2-pretty-multiline-declarations 'symbolp)
+
+(defcustom js2-idle-timer-delay 0.2
+  "Delay in secs before re-parsing after user makes changes.
+Multiplied by `js2-dynamic-idle-timer-adjust', which see."
+  :type 'number
+  :group 'js2-mode)
+(make-variable-buffer-local 'js2-idle-timer-delay)
+
+(defcustom js2-dynamic-idle-timer-adjust 0
+  "Positive to adjust `js2-idle-timer-delay' based on file size.
+The idea is that for short files, parsing is faster so we can be
+more responsive to user edits without interfering with editing.
+The buffer length in characters (typically bytes) is divided by
+this value and used to multiply `js2-idle-timer-delay' for the
+buffer.  For example, a 21k file and 10k adjust yields 21k/10k
+== 2, so js2-idle-timer-delay is multiplied by 2.
+If `js2-dynamic-idle-timer-adjust' is 0 or negative,
+`js2-idle-timer-delay' is not dependent on the file size."
+  :type 'number
+  :group 'js2-mode)
+
+(defcustom js2-concat-multiline-strings t
+  "Non-nil to automatically turn a newline in mid-string into a
+string concatenation.  When `eol', the '+' will be inserted at the
+end of the line, otherwise, at the beginning of the next line."
+  :type '(choice (const t) (const eol) (const nil))
+  :group 'js2-mode)
+
+(defcustom js2-mode-show-parse-errors t
+  "True to highlight parse errors."
+  :type 'boolean
+  :group 'js2-mode)
+
+(defcustom js2-mode-show-strict-warnings t
+  "Non-nil to emit Ecma strict-mode warnings.
+Some of the warnings can be individually disabled by other flags,
+even if this flag is non-nil."
+  :type 'boolean
+  :group 'js2-mode)
+
+(defcustom js2-strict-trailing-comma-warning t
+  "Non-nil to warn about trailing commas in array literals.
+Ecma-262-5.1 allows them, but older versions of IE raise an error."
+  :type 'boolean
+  :group 'js2-mode)
+
+(defcustom js2-strict-missing-semi-warning t
+  "Non-nil to warn about semicolon auto-insertion after statement.
+Technically this is legal per Ecma-262, but some style guides disallow
+depending on it."
+  :type 'boolean
+  :group 'js2-mode)
+
+(defcustom js2-missing-semi-one-line-override nil
+  "Non-nil to permit missing semicolons in one-line functions.
+In one-liner functions such as `function identity(x) {return x}'
+people often omit the semicolon for a cleaner look.  If you are
+such a person, you can suppress the missing-semicolon warning
+by setting this variable to t."
+  :type 'boolean
+  :group 'js2-mode)
+
+(defcustom js2-strict-inconsistent-return-warning t
+  "Non-nil to warn about mixing returns with value-returns.
+It's perfectly legal to have a `return' and a `return foo' in the
+same function, but it's often an indicator of a bug, and it also
+interferes with type inference (in systems that support it.)"
+  :type 'boolean
+  :group 'js2-mode)
+
+(defcustom js2-strict-cond-assign-warning t
+  "Non-nil to warn about expressions like if (a = b).
+This often should have been '==' instead of '='.  If the warning
+is enabled, you can suppress it on a per-expression basis by
+parenthesizing the expression, e.g. if ((a = b)) ..."
+  :type 'boolean
+  :group 'js2-mode)
+
+(defcustom js2-strict-var-redeclaration-warning t
+  "Non-nil to warn about redeclaring variables in a script or function."
+  :type 'boolean
+  :group 'js2-mode)
+
+(defcustom js2-strict-var-hides-function-arg-warning t
+  "Non-nil to warn about a var decl hiding a function argument."
+  :type 'boolean
+  :group 'js2-mode)
+
+(defcustom js2-skip-preprocessor-directives nil
+  "Non-nil to treat lines beginning with # as comments.
+Useful for viewing Mozilla JavaScript source code."
+  :type 'boolean
+  :group 'js2-mode)
+
+(defcustom js2-language-version 200
+  "Configures what JavaScript language version to recognize.
+Currently versions 150, 160, 170, 180 and 200 are supported,
+corresponding to JavaScript 1.5, 1.6, 1.7, 1.8 and 2.0 (Harmony),
+respectively.  In a nutshell, 1.6 adds E4X support, 1.7 adds let,
+yield, and Array comprehensions, and 1.8 adds function closures."
+  :type 'integer
+  :group 'js2-mode)
+
+(defcustom js2-allow-keywords-as-property-names t
+  "If non-nil, you can use JavaScript keywords as object property names.
+Examples:
+
+  var foo = {int: 5, while: 6, continue: 7};
+  foo.return = 8;
+
+Ecma-262 5.1 allows this syntax, but some engines still don't."
+  :type 'boolean
+  :group 'js2-mode)
+
+(defcustom js2-instanceof-has-side-effects nil
+  "If non-nil, treats the instanceof operator as having side effects.
+This is useful for xulrunner apps."
+  :type 'boolean
+  :group 'js2-mode)
+
+(defcustom js2-move-point-on-right-click t
+  "Non-nil to move insertion point when you right-click.
+This makes right-click context menu behavior a bit more intuitive,
+since menu operations generally apply to the point.  The exception
+is if there is a region selection, in which case the point does -not-
+move, so cut/copy/paste can work properly.
+
+Note that IntelliJ moves the point, and Eclipse leaves it alone,
+so this behavior is customizable."
+  :group 'js2-mode
+  :type 'boolean)
+
+(defcustom js2-allow-rhino-new-expr-initializer t
+  "Non-nil to support a Rhino's experimental syntactic construct.
+
+Rhino supports the ability to follow a `new' expression with an object
+literal, which is used to set additional properties on the new object
+after calling its constructor.  Syntax:
+
+  new <expr> [ ( arglist ) ] [initializer]
+
+Hence, this expression:
+
+  new Object {a: 1, b: 2}
+
+results in an Object with properties a=1 and b=2.  This syntax is
+apparently not configurable in Rhino - it's currently always enabled,
+as of Rhino version 1.7R2."
+  :type 'boolean
+  :group 'js2-mode)
+
+(defcustom js2-allow-member-expr-as-function-name nil
+  "Non-nil to support experimental Rhino syntax for function names.
+
+Rhino supports an experimental syntax configured via the Rhino Context
+setting `allowMemberExprAsFunctionName'.  The experimental syntax is:
+
+  function <member-expr> ( [ arg-list ] ) { <body> }
+
+Where member-expr is a non-parenthesized 'member expression', which
+is anything at the grammar level of a new-expression or lower, meaning
+any expression that does not involve infix or unary operators.
+
+When <member-expr> is not a simple identifier, then it is syntactic
+sugar for assigning the anonymous function to the <member-expr>.  Hence,
+this code:
+
+  function a.b().c[2] (x, y) { ... }
+
+is rewritten as:
+
+  a.b().c[2] = function(x, y) {...}
+
+which doesn't seem particularly useful, but Rhino permits it."
+  :type 'boolean
+  :group 'js2-mode)
+
+;; scanner variables
+
+(defmacro js2-deflocal (name value &optional comment)
+  "Define a buffer-local variable NAME with VALUE and COMMENT."
+  `(progn
+     (defvar ,name ,value ,comment)
+     (make-variable-buffer-local ',name)))
+
+;; We record the start and end position of each token.
+(js2-deflocal js2-token-beg 1)
+(js2-deflocal js2-token-end -1)
+
+(defvar js2-EOF_CHAR -1
+  "Represents end of stream.  Distinct from js2-EOF token type.")
+
+;; I originally used symbols to represent tokens, but Rhino uses
+;; ints and then sets various flag bits in them, so ints it is.
+;; The upshot is that we need a `js2-' prefix in front of each name.
+(defvar js2-ERROR -1)
+(defvar js2-EOF 0)
+(defvar js2-EOL 1)
+(defvar js2-ENTERWITH 2)       ; begin interpreter bytecodes
+(defvar js2-LEAVEWITH 3)
+(defvar js2-RETURN 4)
+(defvar js2-GOTO 5)
+(defvar js2-IFEQ 6)
+(defvar js2-IFNE 7)
+(defvar js2-SETNAME 8)
+(defvar js2-BITOR 9)
+(defvar js2-BITXOR 10)
+(defvar js2-BITAND 11)
+(defvar js2-EQ 12)
+(defvar js2-NE 13)
+(defvar js2-LT 14)
+(defvar js2-LE 15)
+(defvar js2-GT 16)
+(defvar js2-GE 17)
+(defvar js2-LSH 18)
+(defvar js2-RSH 19)
+(defvar js2-URSH 20)
+(defvar js2-ADD 21)            ; infix plus
+(defvar js2-SUB 22)            ; infix minus
+(defvar js2-MUL 23)
+(defvar js2-DIV 24)
+(defvar js2-MOD 25)
+(defvar js2-NOT 26)
+(defvar js2-BITNOT 27)
+(defvar js2-POS 28)            ; unary plus
+(defvar js2-NEG 29)            ; unary minus
+(defvar js2-NEW 30)
+(defvar js2-DELPROP 31)
+(defvar js2-TYPEOF 32)
+(defvar js2-GETPROP 33)
+(defvar js2-GETPROPNOWARN 34)
+(defvar js2-SETPROP 35)
+(defvar js2-GETELEM 36)
+(defvar js2-SETELEM 37)
+(defvar js2-CALL 38)
+(defvar js2-NAME 39)           ; an identifier
+(defvar js2-NUMBER 40)
+(defvar js2-STRING 41)
+(defvar js2-NULL 42)
+(defvar js2-THIS 43)
+(defvar js2-FALSE 44)
+(defvar js2-TRUE 45)
+(defvar js2-SHEQ 46)           ; shallow equality (===)
+(defvar js2-SHNE 47)           ; shallow inequality (!==)
+(defvar js2-REGEXP 48)
+(defvar js2-BINDNAME 49)
+(defvar js2-THROW 50)
+(defvar js2-RETHROW 51)        ; rethrow caught exception: catch (e if ) uses it
+(defvar js2-IN 52)
+(defvar js2-INSTANCEOF 53)
+(defvar js2-LOCAL_LOAD 54)
+(defvar js2-GETVAR 55)
+(defvar js2-SETVAR 56)
+(defvar js2-CATCH_SCOPE 57)
+(defvar js2-ENUM_INIT_KEYS 58)
+(defvar js2-ENUM_INIT_VALUES 59)
+(defvar js2-ENUM_INIT_ARRAY 60)
+(defvar js2-ENUM_NEXT 61)
+(defvar js2-ENUM_ID 62)
+(defvar js2-THISFN 63)
+(defvar js2-RETURN_RESULT 64)  ; to return previously stored return result
+(defvar js2-ARRAYLIT 65)       ; array literal
+(defvar js2-OBJECTLIT 66)      ; object literal
+(defvar js2-GET_REF 67)        ; *reference
+(defvar js2-SET_REF 68)        ; *reference = something
+(defvar js2-DEL_REF 69)        ; delete reference
+(defvar js2-REF_CALL 70)       ; f(args) = something or f(args)++
+(defvar js2-REF_SPECIAL 71)    ; reference for special properties like __proto
+(defvar js2-YIELD 72)          ; JS 1.7 yield pseudo keyword
+
+;; XML support
+(defvar js2-DEFAULTNAMESPACE 73)
+(defvar js2-ESCXMLATTR 74)
+(defvar js2-ESCXMLTEXT 75)
+(defvar js2-REF_MEMBER 76)     ; Reference for x.@y, x..y etc.
+(defvar js2-REF_NS_MEMBER 77)  ; Reference for x.ns::y, x..ns::y etc.
+(defvar js2-REF_NAME 78)       ; Reference for @y, @[y] etc.
+(defvar js2-REF_NS_NAME 79)    ; Reference for ns::y, @ns::y@[y] etc.
+
+(defvar js2-first-bytecode js2-ENTERWITH)
+(defvar js2-last-bytecode js2-REF_NS_NAME)
+
+(defvar js2-TRY 80)
+(defvar js2-SEMI 81)           ; semicolon
+(defvar js2-LB 82)             ; left and right brackets
+(defvar js2-RB 83)
+(defvar js2-LC 84)             ; left and right curly-braces
+(defvar js2-RC 85)
+(defvar js2-LP 86)             ; left and right parens
+(defvar js2-RP 87)
+(defvar js2-COMMA 88)          ; comma operator
+
+(defvar js2-ASSIGN 89)         ; simple assignment (=)
+(defvar js2-ASSIGN_BITOR 90)   ; |=
+(defvar js2-ASSIGN_BITXOR 91)  ; ^=
+(defvar js2-ASSIGN_BITAND 92)  ; &=
+(defvar js2-ASSIGN_LSH 93)     ; <<=
+(defvar js2-ASSIGN_RSH 94)     ; >>=
+(defvar js2-ASSIGN_URSH 95)    ; >>>=
+(defvar js2-ASSIGN_ADD 96)     ; +=
+(defvar js2-ASSIGN_SUB 97)     ; -=
+(defvar js2-ASSIGN_MUL 98)     ; *=
+(defvar js2-ASSIGN_DIV 99)     ; /=
+(defvar js2-ASSIGN_MOD 100)    ; %=
+
+(defvar js2-first-assign js2-ASSIGN)
+(defvar js2-last-assign js2-ASSIGN_MOD)
+
+(defvar js2-HOOK 101)          ; conditional (?:)
+(defvar js2-COLON 102)
+(defvar js2-OR 103)            ; logical or (||)
+(defvar js2-AND 104)           ; logical and (&&)
+(defvar js2-INC 105)           ; increment/decrement (++ --)
+(defvar js2-DEC 106)
+(defvar js2-DOT 107)           ; member operator (.)
+(defvar js2-FUNCTION 108)      ; function keyword
+(defvar js2-EXPORT 109)        ; export keyword
+(defvar js2-IMPORT 110)        ; import keyword
+(defvar js2-IF 111)            ; if keyword
+(defvar js2-ELSE 112)          ; else keyword
+(defvar js2-SWITCH 113)        ; switch keyword
+(defvar js2-CASE 114)          ; case keyword
+(defvar js2-DEFAULT 115)       ; default keyword
+(defvar js2-WHILE 116)         ; while keyword
+(defvar js2-DO 117)            ; do keyword
+(defvar js2-FOR 118)           ; for keyword
+(defvar js2-BREAK 119)         ; break keyword
+(defvar js2-CONTINUE 120)      ; continue keyword
+(defvar js2-VAR 121)           ; var keyword
+(defvar js2-WITH 122)          ; with keyword
+(defvar js2-CATCH 123)         ; catch keyword
+(defvar js2-FINALLY 124)       ; finally keyword
+(defvar js2-VOID 125)          ; void keyword
+(defvar js2-RESERVED 126)      ; reserved keywords
+
+(defvar js2-EMPTY 127)
+
+;; Types used for the parse tree - never returned by scanner.
+
+(defvar js2-BLOCK 128)         ; statement block
+(defvar js2-LABEL 129)         ; label
+(defvar js2-TARGET 130)
+(defvar js2-LOOP 131)
+(defvar js2-EXPR_VOID 132)     ; expression statement in functions
+(defvar js2-EXPR_RESULT 133)   ; expression statement in scripts
+(defvar js2-JSR 134)
+(defvar js2-SCRIPT 135)        ; top-level node for entire script
+(defvar js2-TYPEOFNAME 136)    ; for typeof(simple-name)
+(defvar js2-USE_STACK 137)
+(defvar js2-SETPROP_OP 138)    ; x.y op= something
+(defvar js2-SETELEM_OP 139)    ; x[y] op= something
+(defvar js2-LOCAL_BLOCK 140)
+(defvar js2-SET_REF_OP 141)    ; *reference op= something
+
+;; For XML support:
+(defvar js2-DOTDOT 142)        ; member operator (..)
+(defvar js2-COLONCOLON 143)    ; namespace::name
+(defvar js2-XML 144)           ; XML type
+(defvar js2-DOTQUERY 145)      ; .() -- e.g., x.emps.emp.(name == "terry")
+(defvar js2-XMLATTR 146)       ; @
+(defvar js2-XMLEND 147)
+
+;; Optimizer-only tokens
+(defvar js2-TO_OBJECT 148)
+(defvar js2-TO_DOUBLE 149)
+
+(defvar js2-GET 150)           ; JS 1.5 get pseudo keyword
+(defvar js2-SET 151)           ; JS 1.5 set pseudo keyword
+(defvar js2-LET 152)           ; JS 1.7 let pseudo keyword
+(defvar js2-CONST 153)
+(defvar js2-SETCONST 154)
+(defvar js2-SETCONSTVAR 155)
+(defvar js2-ARRAYCOMP 156)
+(defvar js2-LETEXPR 157)
+(defvar js2-WITHEXPR 158)
+(defvar js2-DEBUGGER 159)
+
+(defvar js2-COMMENT 160)
+(defvar js2-ENUM 161)  ; for "enum" reserved word
+(defvar js2-TRIPLEDOT 162) ; for rest parameter
+
+(defconst js2-num-tokens (1+ js2-TRIPLEDOT))
+
+(defconst js2-debug-print-trees nil)
+
+;; Rhino accepts any string or stream as input.  Emacs character
+;; processing works best in buffers, so we'll assume the input is a
+;; buffer.  JavaScript strings can be copied into temp buffers before
+;; scanning them.
+
+;; Buffer-local variables yield much cleaner code than using `defstruct'.
+;; They're the Emacs equivalent of instance variables, more or less.
+
+(js2-deflocal js2-ts-dirty-line nil
+  "Token stream buffer-local variable.
+Indicates stuff other than whitespace since start of line.")
+
+(js2-deflocal js2-ts-regexp-flags nil
+  "Token stream buffer-local variable.")
+
+(js2-deflocal js2-ts-string ""
+  "Token stream buffer-local variable.
+Last string scanned.")
+
+(js2-deflocal js2-ts-number nil
+  "Token stream buffer-local variable.
+Last literal number scanned.")
+
+(js2-deflocal js2-ts-hit-eof nil
+  "Token stream buffer-local variable.")
+
+(js2-deflocal js2-ts-line-start 0
+  "Token stream buffer-local variable.")
+
+(js2-deflocal js2-ts-lineno 1
+  "Token stream buffer-local variable.")
+
+(js2-deflocal js2-ts-line-end-char -1
+  "Token stream buffer-local variable.")
+
+(js2-deflocal js2-ts-cursor 1  ; emacs buffers are 1-indexed
+  "Token stream buffer-local variable.
+Current scan position.")
+
+(js2-deflocal js2-ts-is-xml-attribute nil
+  "Token stream buffer-local variable.")
+
+(js2-deflocal js2-ts-xml-is-tag-content nil
+  "Token stream buffer-local variable.")
+
+(js2-deflocal js2-ts-xml-open-tags-count 0
+  "Token stream buffer-local variable.")
+
+(js2-deflocal js2-ts-string-buffer nil
+  "Token stream buffer-local variable.
+List of chars built up while scanning various tokens.")
+
+(js2-deflocal js2-ts-comment-type nil
+  "Token stream buffer-local variable.")
+
+;;; Parser variables
+
+(js2-deflocal js2-parsed-errors nil
+  "List of errors produced during scanning/parsing.")
+
+(js2-deflocal js2-parsed-warnings nil
+  "List of warnings produced during scanning/parsing.")
+
+(js2-deflocal js2-recover-from-parse-errors t
+  "Non-nil to continue parsing after a syntax error.
+
+In recovery mode, the AST will be built in full, and any error
+nodes will be flagged with appropriate error information.  If
+this flag is nil, a syntax error will result in an error being
+signaled.
+
+The variable is automatically buffer-local, because different
+modes that use the parser will need different settings.")
+
+(js2-deflocal js2-parse-hook nil
+  "List of callbacks for receiving parsing progress.")
+
+(defvar js2-parse-finished-hook nil
+  "List of callbacks to notify when parsing finishes.
+Not called if parsing was interrupted.")
+
+(js2-deflocal js2-is-eval-code nil
+  "True if we're evaluating code in a string.
+If non-nil, the tokenizer will record the token text, and the AST nodes
+will record their source text.  Off by default for IDE modes, since the
+text is available in the buffer.")
+
+(defvar js2-parse-ide-mode t
+  "Non-nil if the parser is being used for `js2-mode'.
+If non-nil, the parser will set text properties for fontification
+and the syntax table.  The value should be nil when using the
+parser as a frontend to an interpreter or byte compiler.")
+
+;;; Parser instance variables (buffer-local vars for js2-parse)
+
+(defconst js2-clear-ti-mask #xFFFF
+  "Mask to clear token information bits.")
+
+(defconst js2-ti-after-eol (lsh 1 16)
+  "Flag:  first token of the source line.")
+
+(defconst js2-ti-check-label (lsh 1 17)
+  "Flag:  indicates to check for label.")
+
+;; Inline Rhino's CompilerEnvirons vars as buffer-locals.
+
+(js2-deflocal js2-compiler-generate-debug-info t)
+(js2-deflocal js2-compiler-use-dynamic-scope nil)
+(js2-deflocal js2-compiler-reserved-keywords-as-identifier nil)
+(js2-deflocal js2-compiler-xml-available t)
+(js2-deflocal js2-compiler-optimization-level 0)
+(js2-deflocal js2-compiler-generating-source t)
+(js2-deflocal js2-compiler-strict-mode nil)
+(js2-deflocal js2-compiler-report-warning-as-error nil)
+(js2-deflocal js2-compiler-generate-observer-count nil)
+(js2-deflocal js2-compiler-activation-names nil)
+
+;; SKIP:  sourceURI
+
+;; There's a compileFunction method in Context.java - may need it.
+(js2-deflocal js2-called-by-compile-function nil
+  "True if `js2-parse' was called by `js2-compile-function'.
+Will only be used when we finish implementing the interpreter.")
+
+;; SKIP:  ts  (we just call `js2-init-scanner' and use its vars)
+
+(js2-deflocal js2-current-flagged-token js2-EOF)
+(js2-deflocal js2-current-token js2-EOF)
+
+;; SKIP:  node factory - we're going to just call functions directly,
+;; and eventually go to a unified AST format.
+
+(js2-deflocal js2-nesting-of-function 0)
+
+(js2-deflocal js2-recorded-identifiers nil
+  "Tracks identifiers found during parsing.")
+
+(js2-deflocal js2-is-in-destructuring nil
+  "True while parsing destructuring expression.")
+
+(defcustom js2-global-externs nil
+  "A list of any extern names you'd like to consider always declared.
+This list is global and is used by all `js2-mode' files.
+You can create buffer-local externs list using `js2-additional-externs'.
+
+There is also a buffer-local variable `js2-default-externs',
+which is initialized by default to include the Ecma-262 externs
+and the standard browser externs.  The three lists are all
+checked during highlighting."
+  :type 'list
+  :group 'js2-mode)
+
+(js2-deflocal js2-default-externs nil
+  "Default external declarations.
+
+These are currently only used for highlighting undeclared variables,
+which only worries about top-level (unqualified) references.
+As js2-mode's processing improves, we will flesh out this list.
+
+The initial value is set to `js2-ecma-262-externs', unless some
+of the `js2-include-?-externs' variables are set to t, in which
+case the browser, Rhino and/or Node.js externs are also included.
+
+See `js2-additional-externs' for more information.")
+
+(defcustom js2-include-browser-externs t
+  "Non-nil to include browser externs in the master externs list.
+If you work on JavaScript files that are not intended for browsers,
+such as Mozilla Rhino server-side JavaScript, set this to nil.
+See `js2-additional-externs' for more information about externs."
+  :type 'boolean
+  :group 'js2-mode)
+
+(defcustom js2-include-rhino-externs nil
+  "Non-nil to include Mozilla Rhino externs in the master externs list.
+See `js2-additional-externs' for more information about externs."
+  :type 'boolean
+  :group 'js2-mode)
+
+(defcustom js2-include-node-externs nil
+  "Non-nil to include Node.js externs in the master externs list.
+See `js2-additional-externs' for more information about externs."
+  :type 'boolean
+  :group 'js2-mode)
+
+(js2-deflocal js2-additional-externs nil
+  "A buffer-local list of additional external declarations.
+It is used to decide whether variables are considered undeclared
+for purposes of highlighting.
+
+Each entry is a Lisp string.  The string should be the fully qualified
+name of an external entity.  All externs should be added to this list,
+so that as js2-mode's processing improves it can take advantage of them.
+
+You may want to declare your externs in three ways.
+First, you can add externs that are valid for all your JavaScript files.
+You should probably do this by adding them to `js2-global-externs', which
+is a global list used for all js2-mode files.
+
+Next, you can add a function to `js2-init-hook' that adds additional
+externs appropriate for the specific file, perhaps based on its path.
+These should go in `js2-additional-externs', which is buffer-local.
+
+Third, you can use JSLint's global declaration, as long as
+`js2-include-jslint-globals' is non-nil, which see.
+
+Finally, you can add a function to `js2-post-parse-callbacks',
+which is called after parsing completes, and `js2-mode-ast' is bound to
+the root of the parse tree.  At this stage you can set up an AST
+node visitor using `js2-visit-ast' and examine the parse tree
+for specific import patterns that may imply the existence of
+other externs, possibly tied to your build system.  These should also
+be added to `js2-additional-externs'.
+
+Your post-parse callback may of course also use the simpler and
+faster (but perhaps less robust) approach of simply scanning the
+buffer text for your imports, using regular expressions.")
+
+;; SKIP:  decompiler
+;; SKIP:  encoded-source
+
+;;; The following variables are per-function and should be saved/restored
+;;; during function parsing...
+
+(js2-deflocal js2-current-script-or-fn nil)
+(js2-deflocal js2-current-scope nil)
+(js2-deflocal js2-nesting-of-with 0)
+(js2-deflocal js2-label-set nil
+  "An alist mapping label names to nodes.")
+
+(js2-deflocal js2-loop-set nil)
+(js2-deflocal js2-loop-and-switch-set nil)
+(js2-deflocal js2-has-return-value nil)
+(js2-deflocal js2-end-flags 0)
+
+;;; ...end of per function variables
+
+;; Without 2-token lookahead, labels are a problem.
+;; These vars store the token info of the last matched name,
+;; iff it wasn't the last matched token.  Only valid in some contexts.
+(defvar js2-prev-name-token-start nil)
+(defvar js2-prev-name-token-string nil)
+
+(defsubst js2-save-name-token-data (pos name)
+  (setq js2-prev-name-token-start pos
+        js2-prev-name-token-string name))
+
+;; These flags enumerate the possible ways a statement/function can
+;; terminate. These flags are used by endCheck() and by the Parser to
+;; detect inconsistent return usage.
+;;
+;; END_UNREACHED is reserved for code paths that are assumed to always be
+;; able to execute (example: throw, continue)
+;;
+;; END_DROPS_OFF indicates if the statement can transfer control to the
+;; next one. Statement such as return dont. A compound statement may have
+;; some branch that drops off control to the next statement.
+;;
+;; END_RETURNS indicates that the statement can return (without arguments)
+;; END_RETURNS_VALUE indicates that the statement can return a value.
+;;
+;; A compound statement such as
+;; if (condition) {
+;;   return value;
+;; }
+;; Will be detected as (END_DROPS_OFF | END_RETURN_VALUE) by endCheck()
+
+(defconst js2-end-unreached     #x0)
+(defconst js2-end-drops-off     #x1)
+(defconst js2-end-returns       #x2)
+(defconst js2-end-returns-value #x4)
+(defconst js2-end-yields        #x8)
+
+;; Rhino awkwardly passes a statementLabel parameter to the
+;; statementHelper() function, the main statement parser, which
+;; is then used by quite a few of the sub-parsers.  We just make
+;; it a buffer-local variable and make sure it's cleaned up properly.
+(js2-deflocal js2-labeled-stmt nil)  ; type `js2-labeled-stmt-node'
+
+;; Similarly, Rhino passes an inForInit boolean through about half
+;; the expression parsers.  We use a dynamically-scoped variable,
+;; which makes it easier to funcall the parsers individually without
+;; worrying about whether they take the parameter or not.
+(js2-deflocal js2-in-for-init nil)
+(js2-deflocal js2-temp-name-counter 0)
+(js2-deflocal js2-parse-stmt-count 0)
+
+(defsubst js2-get-next-temp-name ()
+  (format "$%d" (incf js2-temp-name-counter)))
+
+(defvar js2-parse-interruptable-p t
+  "Set this to nil to force parse to continue until finished.
+This will mostly be useful for interpreters.")
+
+(defvar js2-statements-per-pause 50
+  "Pause after this many statements to check for user input.
+If user input is pending, stop the parse and discard the tree.
+This makes for a smoother user experience for large files.
+You may have to wait a second or two before the highlighting
+and error-reporting appear, but you can always type ahead if
+you wish.  This appears to be more or less how Eclipse, IntelliJ
+and other editors work.")
+
+(js2-deflocal js2-record-comments t
+  "Instructs the scanner to record comments in `js2-scanned-comments'.")
+
+(js2-deflocal js2-scanned-comments nil
+  "List of all comments from the current parse.")
+
+(defcustom js2-mode-indent-inhibit-undo nil
+  "Non-nil to disable collection of Undo information when indenting lines.
+Some users have requested this behavior.  It's nil by default because
+other Emacs modes don't work this way."
+  :type 'boolean
+  :group 'js2-mode)
+
+(defcustom js2-mode-indent-ignore-first-tab nil
+  "If non-nil, ignore first TAB keypress if we look indented properly.
+It's fairly common for users to navigate to an already-indented line
+and press TAB for reassurance that it's been indented.  For this class
+of users, we want the first TAB press on a line to be ignored if the
+line is already indented to one of the precomputed alternatives.
+
+This behavior is only partly implemented.  If you TAB-indent a line,
+navigate to another line, and then navigate back, it fails to clear
+the last-indented variable, so it thinks you've already hit TAB once,
+and performs the indent.  A full solution would involve getting on the
+point-motion hooks for the entire buffer.  If we come across another
+use cases that requires watching point motion, I'll consider doing it.
+
+If you set this variable to nil, then the TAB key will always change
+the indentation of the current line, if more than one alternative
+indentation spot exists."
+  :type 'boolean
+  :group 'js2-mode)
+
+(defvar js2-indent-hook nil
+  "A hook for user-defined indentation rules.
+
+Functions on this hook should expect two arguments:    (LIST INDEX)
+The LIST argument is the list of computed indentation points for
+the current line.  INDEX is the list index of the indentation point
+that `js2-bounce-indent' plans to use.  If INDEX is nil, then the
+indent function is not going to change the current line indentation.
+
+If a hook function on this list returns a non-nil value, then
+`js2-bounce-indent' assumes the hook function has performed its own
+indentation, and will do nothing.  If all hook functions on the list
+return nil, then `js2-bounce-indent' will use its computed indentation
+and reindent the line.
+
+When hook functions on this hook list are called, the variable
+`js2-mode-ast' may or may not be set, depending on whether the
+parse tree is available.  If the variable is nil, you can pass a
+callback to `js2-mode-wait-for-parse', and your callback will be
+called after the new parse tree is built.  This can take some time
+in large files.")
+
+(defface js2-warning
+  `((((class color) (background light))
+     (:underline  "orange"))
+    (((class color) (background dark))
+     (:underline "orange"))
+    (t (:underline t)))
+  "Face for JavaScript warnings."
+  :group 'js2-mode)
+
+(defface js2-error
+  `((((class color) (background light))
+     (:foreground "red"))
+    (((class color) (background dark))
+     (:foreground "red"))
+    (t (:foreground "red")))
+  "Face for JavaScript errors."
+  :group 'js2-mode)
+
+(defface js2-jsdoc-tag
+  '((t :foreground "SlateGray"))
+  "Face used to highlight @whatever tags in jsdoc comments."
+  :group 'js2-mode)
+
+(defface js2-jsdoc-type
+  '((t :foreground "SteelBlue"))
+  "Face used to highlight {FooBar} types in jsdoc comments."
+  :group 'js2-mode)
+
+(defface js2-jsdoc-value
+  '((t :foreground "PeachPuff3"))
+  "Face used to highlight tag values in jsdoc comments."
+  :group 'js2-mode)
+
+(defface js2-function-param
+  '((t :foreground "SeaGreen"))
+  "Face used to highlight function parameters in javascript."
+  :group 'js2-mode)
+
+(defface js2-instance-member
+  '((t :foreground "DarkOrchid"))
+  "Face used to highlight instance variables in javascript.
+Not currently used."
+  :group 'js2-mode)
+
+(defface js2-private-member
+  '((t :foreground "PeachPuff3"))
+  "Face used to highlight calls to private methods in javascript.
+Not currently used."
+  :group 'js2-mode)
+
+(defface js2-private-function-call
+  '((t :foreground "goldenrod"))
+  "Face used to highlight calls to private functions in javascript.
+Not currently used."
+  :group 'js2-mode)
+
+(defface js2-jsdoc-html-tag-name
+  '((((class color) (min-colors 88) (background light))
+     (:foreground "rosybrown"))
+    (((class color) (min-colors 8) (background dark))
+     (:foreground "yellow"))
+    (((class color) (min-colors 8) (background light))
+     (:foreground "magenta")))
+    "Face used to highlight jsdoc html tag names"
+  :group 'js2-mode)
+
+(defface js2-jsdoc-html-tag-delimiter
+  '((((class color) (min-colors 88) (background light))
+     (:foreground "dark khaki"))
+    (((class color) (min-colors 8) (background dark))
+     (:foreground "green"))
+    (((class color) (min-colors 8) (background light))
+     (:foreground "green")))
+  "Face used to highlight brackets in jsdoc html tags."
+  :group 'js2-mode)
+
+(defface js2-external-variable
+  '((t :foreground "orange"))
+  "Face used to highlight undeclared variable identifiers.")
+
+(defcustom js2-init-hook nil
+  "List of functions to be called after `js2-mode' or
+`js2-minor-mode' has initialized all variables, before parsing
+the buffer for the first time."
+  :type 'hook
+  :group 'js2-mode
+  :version "20130608")
+
+(defcustom js2-post-parse-callbacks nil
+  "List of callback functions invoked after parsing finishes.
+Currently, the main use for this function is to add synthetic
+declarations to `js2-recorded-identifiers', which see."
+  :type 'hook
+  :group 'js2-mode)
+
+(defcustom js2-highlight-external-variables t
+  "Non-nil to highlight undeclared variable identifiers.
+An undeclared variable is any variable not declared with var or let
+in the current scope or any lexically enclosing scope.  If you use
+such a variable, then you are either expecting it to originate from
+another file, or you've got a potential bug."
+  :type 'boolean
+  :group 'js2-mode)
+
+(defcustom js2-include-jslint-globals t
+  "Non-nil to include the identifiers from JSLint global
+declaration (see http://www.jslint.com/lint.html#global) in the
+buffer-local externs list.  See `js2-additional-externs' for more
+information."
+  :type 'boolean
+  :group 'js2-mode)
+
+(defvar js2-mode-map
+  (let ((map (make-sparse-keymap))
+        keys)
+    (define-key map [mouse-1] #'js2-mode-show-node)
+    (define-key map (kbd "M-j") #'js2-line-break)
+    (define-key map (kbd "C-c C-e") #'js2-mode-hide-element)
+    (define-key map (kbd "C-c C-s") #'js2-mode-show-element)
+    (define-key map (kbd "C-c C-a") #'js2-mode-show-all)
+    (define-key map (kbd "C-c C-f") #'js2-mode-toggle-hide-functions)
+    (define-key map (kbd "C-c C-t") #'js2-mode-toggle-hide-comments)
+    (define-key map (kbd "C-c C-o") #'js2-mode-toggle-element)
+    (define-key map (kbd "C-c C-w") #'js2-mode-toggle-warnings-and-errors)
+    (define-key map [down-mouse-3] #'js2-down-mouse-3)
+    (when js2-bounce-indent-p
+      (define-key map (kbd "<backtab>") #'js2-indent-bounce-backwards))
+
+    (define-key map [menu-bar javascript]
+      (cons "JavaScript" (make-sparse-keymap "JavaScript")))
+
+    (define-key map [menu-bar javascript customize-js2-mode]
+      '(menu-item "Customize js2-mode" js2-mode-customize
+                  :help "Customize the behavior of this mode"))
+
+    (define-key map [menu-bar javascript js2-force-refresh]
+      '(menu-item "Force buffer refresh" js2-mode-reset
+                  :help "Re-parse the buffer from scratch"))
+
+    (define-key map [menu-bar javascript separator-2]
+      '("--"))
+
+    (define-key map [menu-bar javascript next-error]
+      '(menu-item "Next warning or error" next-error
+                  :enabled (and js2-mode-ast
+                                (or (js2-ast-root-errors js2-mode-ast)
+                                    (js2-ast-root-warnings js2-mode-ast)))
+                  :help "Move to next warning or error"))
+
+    (define-key map [menu-bar javascript display-errors]
+      '(menu-item "Show errors and warnings" js2-mode-display-warnings-and-errors
+                  :visible (not js2-mode-show-parse-errors)
+                  :help "Turn on display of warnings and errors"))
+
+    (define-key map [menu-bar javascript hide-errors]
+      '(menu-item "Hide errors and warnings" js2-mode-hide-warnings-and-errors
+                  :visible js2-mode-show-parse-errors
+                  :help "Turn off display of warnings and errors"))
+
+    (define-key map [menu-bar javascript separator-1]
+      '("--"))
+
+    (define-key map [menu-bar javascript js2-toggle-function]
+      '(menu-item "Show/collapse element" js2-mode-toggle-element
+                  :help "Hide or show function body or comment"))
+
+    (define-key map [menu-bar javascript show-comments]
+      '(menu-item "Show block comments" js2-mode-toggle-hide-comments
+                  :visible js2-mode-comments-hidden
+                  :help "Expand all hidden block comments"))
+
+    (define-key map [menu-bar javascript hide-comments]
+      '(menu-item "Hide block comments" js2-mode-toggle-hide-comments
+                  :visible (not js2-mode-comments-hidden)
+                  :help "Show block comments as /*...*/"))
+
+    (define-key map [menu-bar javascript show-all-functions]
+      '(menu-item "Show function bodies" js2-mode-toggle-hide-functions
+                  :visible js2-mode-functions-hidden
+                  :help "Expand all hidden function bodies"))
+
+    (define-key map [menu-bar javascript hide-all-functions]
+      '(menu-item "Hide function bodies" js2-mode-toggle-hide-functions
+                  :visible (not js2-mode-functions-hidden)
+                  :help "Show {...} for all top-level function bodies"))
+
+    map)
+  "Keymap used in `js2-mode' buffers.")
+
+(defconst js2-mode-identifier-re "[a-zA-Z_$][a-zA-Z0-9_$]*")
+
+(defvar js2-mode-//-comment-re "^\\(\\s-*\\)//.+"
+  "Matches a //-comment line.  Must be first non-whitespace on line.
+First match-group is the leading whitespace.")
+
+(defvar js2-mode-hook nil)
+
+(js2-deflocal js2-mode-ast nil "Private variable.")
+(js2-deflocal js2-mode-parse-timer nil "Private variable.")
+(js2-deflocal js2-mode-buffer-dirty-p nil "Private variable.")
+(js2-deflocal js2-mode-parsing nil "Private variable.")
+(js2-deflocal js2-mode-node-overlay nil)
+
+(defvar js2-mode-show-overlay js2-mode-dev-mode-p
+  "Debug:  Non-nil to highlight AST nodes on mouse-down.")
+
+(js2-deflocal js2-mode-fontifications nil "Private variable")
+(js2-deflocal js2-mode-deferred-properties nil "Private variable")
+(js2-deflocal js2-imenu-recorder nil "Private variable")
+(js2-deflocal js2-imenu-function-map nil "Private variable")
+
+(defvar js2-paragraph-start
+  "\\(@[a-zA-Z]+\\>\\|$\\)")
+
+;; Note that we also set a 'c-in-sws text property in html comments,
+;; so that `c-forward-sws' and `c-backward-sws' work properly.
+(defvar js2-syntactic-ws-start
+  "\\s \\|/[*/]\\|[\n\r]\\|\\\\[\n\r]\\|\\s!\\|<!--\\|^\\s-*-->")
+
+(defvar js2-syntactic-ws-end
+  "\\s \\|[\n\r/]\\|\\s!")
+
+(defvar js2-syntactic-eol
+  (concat "\\s *\\(/\\*[^*\n\r]*"
+          "\\(\\*+[^*\n\r/][^*\n\r]*\\)*"
+          "\\*+/\\s *\\)*"
+          "\\(//\\|/\\*[^*\n\r]*"
+          "\\(\\*+[^*\n\r/][^*\n\r]*\\)*$"
+          "\\|\\\\$\\|$\\)")
+  "Copied from `java-mode'.  Needed for some cc-engine functions.")
+
+(defvar js2-comment-prefix-regexp
+  "//+\\|\\**")
+
+(defvar js2-comment-start-skip
+  "\\(//+\\|/\\*+\\)\\s *")
+
+(defvar js2-mode-verbose-parse-p js2-mode-dev-mode-p
+  "Non-nil to emit status messages during parsing.")
+
+(defvar js2-mode-functions-hidden nil "Private variable.")
+(defvar js2-mode-comments-hidden nil "Private variable.")
+
+(defvar js2-mode-syntax-table
+  (let ((table (make-syntax-table)))
+    (c-populate-syntax-table table)
+    table)
+  "Syntax table used in `js2-mode' buffers.")
+
+(defvar js2-mode-abbrev-table nil
+  "Abbrev table in use in `js2-mode' buffers.")
+(define-abbrev-table 'js2-mode-abbrev-table ())
+
+(defvar js2-mode-pending-parse-callbacks nil
+  "List of functions waiting to be notified that parse is finished.")
+
+(defvar js2-mode-last-indented-line -1)
+
+;;; Localizable error and warning messages
+
+;; Messages are copied from Rhino's Messages.properties.
+;; Many of the Java-specific messages have been elided.
+;; Add any js2-specific ones at the end, so we can keep
+;; this file synced with changes to Rhino's.
+
+(defvar js2-message-table
+  (make-hash-table :test 'equal :size 250)
+  "Contains localized messages for `js2-mode'.")
+
+;; TODO(stevey):  construct this table at compile-time.
+(defmacro js2-msg (key &rest strings)
+  `(puthash ,key (concat ,@strings)
+            js2-message-table))
+
+(defun js2-get-msg (msg-key)
+  "Look up a localized message.
+MSG-KEY is a list of (MSG ARGS).  If the message takes parameters,
+the correct number of ARGS must be provided."
+  (let* ((key (if (listp msg-key) (car msg-key) msg-key))
+         (args (if (listp msg-key) (cdr msg-key)))
+         (msg (gethash key js2-message-table)))
+    (if msg
+        (apply #'format msg args)
+      key)))  ; default to showing the key
+
+(js2-msg "msg.dup.parms"
+         "Duplicate parameter name '%s'.")
+
+(js2-msg "msg.too.big.jump"
+         "Program too complex: jump offset too big.")
+
+(js2-msg "msg.too.big.index"
+         "Program too complex: internal index exceeds 64K limit.")
+
+(js2-msg "msg.while.compiling.fn"
+         "Encountered code generation error while compiling function '%s': %s")
+
+(js2-msg "msg.while.compiling.script"
+         "Encountered code generation error while compiling script: %s")
+
+;; Context
+(js2-msg "msg.ctor.not.found"
+         "Constructor for '%s' not found.")
+
+(js2-msg "msg.not.ctor"
+         "'%s' is not a constructor.")
+
+;; FunctionObject
+(js2-msg "msg.varargs.ctor"
+         "Method or constructor '%s' must be static "
+         "with the signature (Context cx, Object[] args, "
+         "Function ctorObj, boolean inNewExpr) "
+         "to define a variable arguments constructor.")
+
+(js2-msg "msg.varargs.fun"
+         "Method '%s' must be static with the signature "
+         "(Context cx, Scriptable thisObj, Object[] args, Function funObj) "
+         "to define a variable arguments function.")
+
+(js2-msg "msg.incompat.call"
+         "Method '%s' called on incompatible object.")
+
+(js2-msg "msg.bad.parms"
+         "Unsupported parameter type '%s' in method '%s'.")
+
+(js2-msg "msg.bad.method.return"
+         "Unsupported return type '%s' in method '%s'.")
+
+(js2-msg "msg.bad.ctor.return"
+         "Construction of objects of type '%s' is not supported.")
+
+(js2-msg "msg.no.overload"
+         "Method '%s' occurs multiple times in class '%s'.")
+
+(js2-msg "msg.method.not.found"
+         "Method '%s' not found in '%s'.")
+
+;; IRFactory
+
+(js2-msg "msg.bad.for.in.lhs"
+         "Invalid left-hand side of for..in loop.")
+
+(js2-msg "msg.mult.index"
+         "Only one variable allowed in for..in loop.")
+
+(js2-msg "msg.bad.for.in.destruct"
+         "Left hand side of for..in loop must be an array of "
+         "length 2 to accept key/value pair.")
+
+(js2-msg "msg.cant.convert"
+         "Can't convert to type '%s'.")
+
+(js2-msg "msg.bad.assign.left"
+         "Invalid assignment left-hand side.")
+
+(js2-msg "msg.bad.decr"
+         "Invalid decerement operand.")
+
+(js2-msg "msg.bad.incr"
+         "Invalid increment operand.")
+
+(js2-msg "msg.bad.yield"
+         "yield must be in a function.")
+
+(js2-msg "msg.yield.parenthesized"
+         "yield expression must be parenthesized.")
+
+;; NativeGlobal
+(js2-msg "msg.cant.call.indirect"
+          "Function '%s' must be called directly, and not by way of a "
+          "function of another name.")
+
+(js2-msg "msg.eval.nonstring"
+          "Calling eval() with anything other than a primitive "
+          "string value will simply return the value. "
+          "Is this what you intended?")
+
+(js2-msg "msg.eval.nonstring.strict"
+         "Calling eval() with anything other than a primitive "
+         "string value is not allowed in strict mode.")
+
+(js2-msg "msg.bad.destruct.op"
+         "Invalid destructuring assignment operator")
+
+;; NativeCall
+(js2-msg "msg.only.from.new"
+         "'%s' may only be invoked from a `new' expression.")
+
+(js2-msg "msg.deprec.ctor"
+         "The '%s' constructor is deprecated.")
+
+;; NativeFunction
+(js2-msg "msg.no.function.ref.found"
+         "no source found to decompile function reference %s")
+
+(js2-msg "msg.arg.isnt.array"
+         "second argument to Function.prototype.apply must be an array")
+
+;; NativeGlobal
+(js2-msg "msg.bad.esc.mask"
+         "invalid string escape mask")
+
+;; NativeRegExp
+(js2-msg "msg.bad.quant"
+  "Invalid quantifier %s")
+
+(js2-msg "msg.overlarge.backref"
+  "Overly large back reference %s")
+
+(js2-msg "msg.overlarge.min"
+  "Overly large minimum %s")
+
+(js2-msg "msg.overlarge.max"
+  "Overly large maximum %s")
+
+(js2-msg "msg.zero.quant"
+  "Zero quantifier %s")
+
+(js2-msg "msg.max.lt.min"
+  "Maximum %s less than minimum")
+
+(js2-msg "msg.unterm.quant"
+  "Unterminated quantifier %s")
+
+(js2-msg "msg.unterm.paren"
+  "Unterminated parenthetical %s")
+
+(js2-msg "msg.unterm.class"
+  "Unterminated character class %s")
+
+(js2-msg "msg.bad.range"
+  "Invalid range in character class.")
+
+(js2-msg "msg.trail.backslash"
+  "Trailing \\ in regular expression.")
+
+(js2-msg "msg.re.unmatched.right.paren"
+  "unmatched ) in regular expression.")
+
+(js2-msg "msg.no.regexp"
+  "Regular expressions are not available.")
+
+(js2-msg "msg.bad.backref"
+  "back-reference exceeds number of capturing parentheses.")
+
+(js2-msg "msg.bad.regexp.compile"
+         "Only one argument may be specified if the first "
+         "argument to RegExp.prototype.compile is a RegExp object.")
+
+;; Parser
+(js2-msg "msg.got.syntax.errors"
+         "Compilation produced %s syntax errors.")
+
+(js2-msg "msg.var.redecl"
+         "TypeError: redeclaration of var %s.")
+
+(js2-msg "msg.const.redecl"
+         "TypeError: redeclaration of const %s.")
+
+(js2-msg "msg.let.redecl"
+         "TypeError: redeclaration of variable %s.")
+
+(js2-msg "msg.parm.redecl"
+         "TypeError: redeclaration of formal parameter %s.")
+
+(js2-msg "msg.fn.redecl"
+         "TypeError: redeclaration of function %s.")
+
+(js2-msg "msg.let.decl.not.in.block"
+         "SyntaxError: let declaration not directly within block")
+
+;; NodeTransformer
+(js2-msg "msg.dup.label"
+         "duplicated label")
+
+(js2-msg "msg.undef.label"
+         "undefined label")
+
+(js2-msg "msg.bad.break"
+         "unlabelled break must be inside loop or switch")
+
+(js2-msg "msg.continue.outside"
+         "continue must be inside loop")
+
+(js2-msg "msg.continue.nonloop"
+         "continue can only use labels of iteration statements")
+
+(js2-msg "msg.bad.throw.eol"
+         "Line terminator is not allowed between the throw "
+         "keyword and throw expression.")
+
+(js2-msg "msg.no.paren.parms"
+         "missing ( before function parameters.")
+
+(js2-msg "msg.no.parm"
+         "missing formal parameter")
+
+(js2-msg "msg.no.paren.after.parms"
+         "missing ) after formal parameters")
+
+(js2-msg "msg.no.default.after.default.param" ; added by js2-mode
+         "parameter without default follows parameter with default")
+
+(js2-msg "msg.param.after.rest" ; added by js2-mode
+         "parameter after rest parameter")
+
+(js2-msg "msg.no.brace.body"
+         "missing '{' before function body")
+
+(js2-msg "msg.no.brace.after.body"
+         "missing } after function body")
+
+(js2-msg "msg.no.paren.cond"
+         "missing ( before condition")
+
+(js2-msg "msg.no.paren.after.cond"
+         "missing ) after condition")
+
+(js2-msg "msg.no.semi.stmt"
+         "missing ; before statement")
+
+(js2-msg "msg.missing.semi"
+         "missing ; after statement")
+
+(js2-msg "msg.no.name.after.dot"
+         "missing name after . operator")
+
+(js2-msg "msg.no.name.after.coloncolon"
+         "missing name after :: operator")
+
+(js2-msg "msg.no.name.after.dotdot"
+         "missing name after .. operator")
+
+(js2-msg "msg.no.name.after.xmlAttr"
+         "missing name after .@")
+
+(js2-msg "msg.no.bracket.index"
+         "missing ] in index expression")
+
+(js2-msg "msg.no.paren.switch"
+         "missing ( before switch expression")
+
+(js2-msg "msg.no.paren.after.switch"
+         "missing ) after switch expression")
+
+(js2-msg "msg.no.brace.switch"
+         "missing '{' before switch body")
+
+(js2-msg "msg.bad.switch"
+         "invalid switch statement")
+
+(js2-msg "msg.no.colon.case"
+         "missing : after case expression")
+
+(js2-msg "msg.double.switch.default"
+         "double default label in the switch statement")
+
+(js2-msg "msg.no.while.do"
+         "missing while after do-loop body")
+
+(js2-msg "msg.no.paren.for"
+         "missing ( after for")
+
+(js2-msg "msg.no.semi.for"
+         "missing ; after for-loop initializer")
+
+(js2-msg "msg.no.semi.for.cond"
+         "missing ; after for-loop condition")
+
+(js2-msg "msg.in.after.for.name"
+         "missing in or of after for")
+
+(js2-msg "msg.no.paren.for.ctrl"
+         "missing ) after for-loop control")
+
+(js2-msg "msg.no.paren.with"
+         "missing ( before with-statement object")
+
+(js2-msg "msg.no.paren.after.with"
+         "missing ) after with-statement object")
+
+(js2-msg "msg.no.paren.after.let"
+         "missing ( after let")
+
+(js2-msg "msg.no.paren.let"
+         "missing ) after variable list")
+
+(js2-msg "msg.no.curly.let"
+         "missing } after let statement")
+
+(js2-msg "msg.bad.return"
+         "invalid return")
+
+(js2-msg "msg.no.brace.block"
+         "missing } in compound statement")
+
+(js2-msg "msg.bad.label"
+         "invalid label")
+
+(js2-msg "msg.bad.var"
+         "missing variable name")
+
+(js2-msg "msg.bad.var.init"
+         "invalid variable initialization")
+
+(js2-msg "msg.no.colon.cond"
+         "missing : in conditional expression")
+
+(js2-msg "msg.no.paren.arg"
+         "missing ) after argument list")
+
+(js2-msg "msg.no.bracket.arg"
+         "missing ] after element list")
+
+(js2-msg "msg.bad.prop"
+         "invalid property id")
+
+(js2-msg "msg.no.colon.prop"
+         "missing : after property id")
+
+(js2-msg "msg.no.brace.prop"
+         "missing } after property list")
+
+(js2-msg "msg.no.paren"
+         "missing ) in parenthetical")
+
+(js2-msg "msg.reserved.id"
+         "identifier is a reserved word")
+
+(js2-msg "msg.no.paren.catch"
+         "missing ( before catch-block condition")
+
+(js2-msg "msg.bad.catchcond"
+         "invalid catch block condition")
+
+(js2-msg "msg.catch.unreachable"
+         "any catch clauses following an unqualified catch are unreachable")
+
+(js2-msg "msg.no.brace.try"
+         "missing '{' before try block")
+
+(js2-msg "msg.no.brace.catchblock"
+         "missing '{' before catch-block body")
+
+(js2-msg "msg.try.no.catchfinally"
+         "'try' without 'catch' or 'finally'")
+
+(js2-msg "msg.no.return.value"
+         "function %s does not always return a value")
+
+(js2-msg "msg.anon.no.return.value"
+         "anonymous function does not always return a value")
+
+(js2-msg "msg.return.inconsistent"
+         "return statement is inconsistent with previous usage")
+
+(js2-msg "msg.generator.returns"
+         "TypeError: generator function '%s' returns a value")
+
+(js2-msg "msg.anon.generator.returns"
+         "TypeError: anonymous generator function returns a value")
+
+(js2-msg "msg.syntax"
+         "syntax error")
+
+(js2-msg "msg.unexpected.eof"
+         "Unexpected end of file")
+
+(js2-msg "msg.XML.bad.form"
+         "illegally formed XML syntax")
+
+(js2-msg "msg.XML.not.available"
+         "XML runtime not available")
+
+(js2-msg "msg.too.deep.parser.recursion"
+         "Too deep recursion while parsing")
+
+(js2-msg "msg.no.side.effects"
+         "Code has no side effects")
+
+(js2-msg "msg.extra.trailing.comma"
+         "Trailing comma is not supported in some browsers")
+
+(js2-msg "msg.array.trailing.comma"
+         "Trailing comma yields different behavior across browsers")
+
+(js2-msg "msg.equal.as.assign"
+         (concat "Test for equality (==) mistyped as assignment (=)?"
+                 " (parenthesize to suppress warning)"))
+
+(js2-msg "msg.var.hides.arg"
+         "Variable %s hides argument")
+
+(js2-msg "msg.destruct.assign.no.init"
+         "Missing = in destructuring declaration")
+
+;; ScriptRuntime
+(js2-msg "msg.no.properties"
+         "%s has no properties.")
+
+(js2-msg "msg.invalid.iterator"
+         "Invalid iterator value")
+
+(js2-msg "msg.iterator.primitive"
+         "__iterator__ returned a primitive value")
+
+(js2-msg "msg.assn.create.strict"
+         "Assignment to undeclared variable %s")
+
+(js2-msg "msg.undeclared.variable"  ; added by js2-mode
+         "Undeclared variable or function '%s'")
+
+(js2-msg "msg.ref.undefined.prop"
+         "Reference to undefined property '%s'")
+
+(js2-msg "msg.prop.not.found"
+         "Property %s not found.")
+
+(js2-msg "msg.invalid.type"
+         "Invalid JavaScript value of type %s")
+
+(js2-msg "msg.primitive.expected"
+         "Primitive type expected (had %s instead)")
+
+(js2-msg "msg.namespace.expected"
+         "Namespace object expected to left of :: (found %s instead)")
+
+(js2-msg "msg.null.to.object"
+         "Cannot convert null to an object.")
+
+(js2-msg "msg.undef.to.object"
+         "Cannot convert undefined to an object.")
+
+(js2-msg "msg.cyclic.value"
+         "Cyclic %s value not allowed.")
+
+(js2-msg "msg.is.not.defined"
+         "'%s' is not defined.")
+
+(js2-msg "msg.undef.prop.read"
+         "Cannot read property '%s' from %s")
+
+(js2-msg "msg.undef.prop.write"
+         "Cannot set property '%s' of %s to '%s'")
+
+(js2-msg "msg.undef.prop.delete"
+         "Cannot delete property '%s' of %s")
+
+(js2-msg "msg.undef.method.call"
+         "Cannot call method '%s' of %s")
+
+(js2-msg "msg.undef.with"
+         "Cannot apply 'with' to %s")
+
+(js2-msg "msg.isnt.function"
+         "%s is not a function, it is %s.")
+
+(js2-msg "msg.isnt.function.in"
+         "Cannot call property %s in object %s. "
+         "It is not a function, it is '%s'.")
+
+(js2-msg "msg.function.not.found"
+         "Cannot find function %s.")
+
+(js2-msg "msg.function.not.found.in"
+         "Cannot find function %s in object %s.")
+
+(js2-msg "msg.isnt.xml.object"
+         "%s is not an xml object.")
+
+(js2-msg "msg.no.ref.to.get"
+         "%s is not a reference to read reference value.")
+
+(js2-msg "msg.no.ref.to.set"
+         "%s is not a reference to set reference value to %s.")
+
+(js2-msg "msg.no.ref.from.function"
+         "Function %s can not be used as the left-hand "
+         "side of assignment or as an operand of ++ or -- operator.")
+
+(js2-msg "msg.bad.default.value"
+         "Object's getDefaultValue() method returned an object.")
+
+(js2-msg "msg.instanceof.not.object"
+         "Can't use instanceof on a non-object.")
+
+(js2-msg "msg.instanceof.bad.prototype"
+         "'prototype' property of %s is not an object.")
+
+(js2-msg "msg.bad.radix"
+         "illegal radix %s.")
+
+;; ScriptableObject
+(js2-msg "msg.default.value"
+         "Cannot find default value for object.")
+
+(js2-msg "msg.zero.arg.ctor"
+         "Cannot load class '%s' which has no zero-parameter constructor.")
+
+(js2-msg "msg.ctor.multiple.parms"
+         "Can't define constructor or class %s since more than "
+         "one constructor has multiple parameters.")
+
+(js2-msg "msg.extend.scriptable"
+         "%s must extend ScriptableObject in order to define property %s.")
+
+(js2-msg "msg.bad.getter.parms"
+         "In order to define a property, getter %s must have zero "
+         "parameters or a single ScriptableObject parameter.")
+
+(js2-msg "msg.obj.getter.parms"
+         "Expected static or delegated getter %s to take "
+         "a ScriptableObject parameter.")
+
+(js2-msg "msg.getter.static"
+         "Getter and setter must both be static or neither be static.")
+
+(js2-msg "msg.setter.return"
+         "Setter must have void return type: %s")
+
+(js2-msg "msg.setter2.parms"
+         "Two-parameter setter must take a ScriptableObject as "
+         "its first parameter.")
+
+(js2-msg "msg.setter1.parms"
+         "Expected single parameter setter for %s")
+
+(js2-msg "msg.setter2.expected"
+         "Expected static or delegated setter %s to take two parameters.")
+
+(js2-msg "msg.setter.parms"
+         "Expected either one or two parameters for setter.")
+
+(js2-msg "msg.setter.bad.type"
+         "Unsupported parameter type '%s' in setter '%s'.")
+
+(js2-msg "msg.add.sealed"
+         "Cannot add a property to a sealed object: %s.")
+
+(js2-msg "msg.remove.sealed"
+         "Cannot remove a property from a sealed object: %s.")
+
+(js2-msg "msg.modify.sealed"
+         "Cannot modify a property of a sealed object: %s.")
+
+(js2-msg "msg.modify.readonly"
+         "Cannot modify readonly property: %s.")
+
+;; TokenStream
+(js2-msg "msg.missing.exponent"
+         "missing exponent")
+
+(js2-msg "msg.caught.nfe"
+         "number format error")
+
+(js2-msg "msg.unterminated.string.lit"
+         "unterminated string literal")
+
+(js2-msg "msg.unterminated.comment"
+         "unterminated comment")
+
+(js2-msg "msg.unterminated.re.lit"
+         "unterminated regular expression literal")
+
+(js2-msg "msg.invalid.re.flag"
+         "invalid flag after regular expression")
+
+(js2-msg "msg.no.re.input.for"
+         "no input for %s")
+
+(js2-msg "msg.illegal.character"
+         "illegal character")
+
+(js2-msg "msg.invalid.escape"
+         "invalid Unicode escape sequence")
+
+(js2-msg "msg.bad.namespace"
+         "not a valid default namespace statement. "
+         "Syntax is: default xml namespace = EXPRESSION;")
+
+;; TokensStream warnings
+(js2-msg "msg.bad.octal.literal"
+         "illegal octal literal digit %s; "
+         "interpreting it as a decimal digit")
+
+(js2-msg "msg.reserved.keyword"
+         "illegal usage of future reserved keyword %s; "
+         "interpreting it as ordinary identifier")
+
+(js2-msg "msg.script.is.not.constructor"
+         "Script objects are not constructors.")
+
+;; Arrays
+(js2-msg "msg.arraylength.bad"
+         "Inappropriate array length.")
+
+;; Arrays
+(js2-msg "msg.arraylength.too.big"
+         "Array length %s exceeds supported capacity limit.")
+
+;; URI
+(js2-msg "msg.bad.uri"
+         "Malformed URI sequence.")
+
+;; Number
+(js2-msg "msg.bad.precision"
+         "Precision %s out of range.")
+
+;; NativeGenerator
+(js2-msg "msg.send.newborn"
+         "Attempt to send value to newborn generator")
+
+(js2-msg "msg.already.exec.gen"
+         "Already executing generator")
+
+(js2-msg "msg.StopIteration.invalid"
+         "StopIteration may not be changed to an arbitrary object.")
+
+;; Interpreter
+(js2-msg "msg.yield.closing"
+         "Yield from closing generator")
+
+;;; Utilities
+
+(defun js2-delete-if (predicate list)
+  "Remove all items satisfying PREDICATE in LIST."
+  (loop for item in list
+        if (not (funcall predicate item))
+        collect item))
+
+(defun js2-position (element list)
+  "Find 0-indexed position of ELEMENT in LIST comparing with `eq'.
+Returns nil if element is not found in the list."
+  (let ((count 0)
+        found)
+    (while (and list (not found))
+      (if (eq element (car list))
+          (setq found t)
+        (setq count (1+ count)
+              list (cdr list))))
+    (if found count)))
+
+(defun js2-find-if (predicate list)
+  "Find first item satisfying PREDICATE in LIST."
+  (let (result)
+    (while (and list (not result))
+      (if (funcall predicate (car list))
+          (setq result (car list)))
+      (setq list (cdr list)))
+    result))
+
+(defmacro js2-time (form)
+  "Evaluate FORM, discard result, and return elapsed time in sec."
+  (declare (debug t))
+  (let ((beg (make-symbol "--js2-time-beg--"))
+        (delta (make-symbol "--js2-time-end--")))
+    `(let ((,beg (current-time))
+           ,delta)
+       ,form
+       (/ (truncate (* (- (float-time (current-time))
+                          (float-time ,beg))
+                       10000))
+          10000.0))))
+
+(defsubst js2-same-line (pos)
+  "Return t if POS is on the same line as current point."
+  (and (>= pos (point-at-bol))
+       (<= pos (point-at-eol))))
+
+(defun js2-code-bug ()
+  "Signal an error when we encounter an unexpected code path."
+  (error "failed assertion"))
+
+(defsubst js2-record-text-property (beg end prop value)
+  "Record a text property to set when parsing finishes."
+  (push (list beg end prop value) js2-mode-deferred-properties))
+
+;; I'd like to associate errors with nodes, but for now the
+;; easiest thing to do is get the context info from the last token.
+(defun js2-record-parse-error (msg &optional arg pos len)
+  (push (list (list msg arg)
+              (or pos js2-token-beg)
+              (or len (- js2-token-end js2-token-beg)))
+        js2-parsed-errors))
+
+(defun js2-report-error (msg &optional msg-arg pos len)
+  "Signal a syntax error or record a parse error."
+  (if js2-recover-from-parse-errors
+      (js2-record-parse-error msg msg-arg pos len)
+  (signal 'js2-syntax-error
+          (list msg
+                js2-ts-lineno
+                (save-excursion
+                  (goto-char js2-ts-cursor)
+                  (current-column))
+                js2-ts-hit-eof))))
+
+(defun js2-report-warning (msg &optional msg-arg pos len face)
+  (if js2-compiler-report-warning-as-error
+      (js2-report-error msg msg-arg pos len)
+    (push (list (list msg msg-arg)
+                (or pos js2-token-beg)
+                (or len (- js2-token-end js2-token-beg))
+                face)
+          js2-parsed-warnings)))
+
+(defun js2-add-strict-warning (msg-id &optional msg-arg beg end)
+  (if js2-compiler-strict-mode
+      (js2-report-warning msg-id msg-arg beg
+                          (and beg end (- end beg)))))
+
+(put 'js2-syntax-error 'error-conditions
+     '(error syntax-error js2-syntax-error))
+(put 'js2-syntax-error 'error-message "Syntax error")
+
+(put 'js2-parse-error 'error-conditions
+     '(error parse-error js2-parse-error))
+(put 'js2-parse-error 'error-message "Parse error")
+
+(defmacro js2-clear-flag (flags flag)
+  `(setq ,flags (logand ,flags (lognot ,flag))))
+
+(defmacro js2-set-flag (flags flag)
+  "Logical-or FLAG into FLAGS."
+  `(setq ,flags (logior ,flags ,flag)))
+
+(defsubst js2-flag-set-p (flags flag)
+  (/= 0 (logand flags flag)))
+
+(defsubst js2-flag-not-set-p (flags flag)
+  (zerop (logand flags flag)))
+
+(defmacro js2-with-underscore-as-word-syntax (&rest body)
+  "Evaluate BODY with the _ character set to be word-syntax."
+  (declare (indent 0) (debug t))
+  (let ((old-syntax (make-symbol "old-syntax")))
+  `(let ((,old-syntax (string (char-syntax ?_))))
+     (unwind-protect
+         (progn
+           (modify-syntax-entry ?_ "w" js2-mode-syntax-table)
+           ,@body)
+       (modify-syntax-entry ?_ ,old-syntax js2-mode-syntax-table)))))
+
+(defsubst js2-char-uppercase-p (c)
+  "Return t if C is an uppercase character.
+Handles unicode and latin chars properly."
+  (/= c (downcase c)))
+
+(defsubst js2-char-lowercase-p (c)
+  "Return t if C is an uppercase character.
+Handles unicode and latin chars properly."
+  (/= c (upcase c)))
+
+;;; AST struct and function definitions
+
+;; flags for ast node property 'member-type (used for e4x operators)
+(defvar js2-property-flag    #x1 "Property access: element is valid name.")
+(defvar js2-attribute-flag   #x2 "x.@y or x..@y.")
+(defvar js2-descendants-flag #x4 "x..y or x..@i.")
+
+(defsubst js2-relpos (pos anchor)
+  "Convert POS to be relative to ANCHOR.
+If POS is nil, returns nil."
+  (and pos (- pos anchor)))
+
+(defun js2-make-pad (indent)
+  (if (zerop indent)
+      ""
+    (make-string (* indent js2-basic-offset) ? )))
+
+(defun js2-visit-ast (node callback)
+  "Visit every node in ast NODE with visitor CALLBACK.
+
+CALLBACK is a function that takes two arguments:  (NODE END-P).  It is
+called twice:  once to visit the node, and again after all the node's
+children have been processed.  The END-P argument is nil on the first
+call and non-nil on the second call.  The return value of the callback
+affects the traversal:  if non-nil, the children of NODE are processed.
+If the callback returns nil, or if the node has no children, then the
+callback is called immediately with a non-nil END-P argument.
+
+The node traversal is approximately lexical-order, although there
+are currently no guarantees around this."
+  (when node
+    (let ((vfunc (get (aref node 0) 'js2-visitor)))
+      ;; visit the node
+      (when  (funcall callback node nil)
+        ;; visit the kids
+        (cond
+         ((eq vfunc 'js2-visit-none)
+          nil)                            ; don't even bother calling it
+         ;; Each AST node type has to define a `js2-visitor' function
+         ;; that takes a node and a callback, and calls `js2-visit-ast'
+         ;; on each child of the node.
+         (vfunc
+          (funcall vfunc node callback))
+         (t
+          (error "%s does not define a visitor-traversal function"
+                 (aref node 0)))))
+      ;; call the end-visit
+      (funcall callback node t))))
+
+(defstruct (js2-node
+            (:constructor nil))  ; abstract
+  "Base AST node type."
+  (type -1)  ; token type
+  (pos -1)   ; start position of this AST node in parsed input
+  (len 1)    ; num characters spanned by the node
+  props      ; optional node property list (an alist)
+  parent)    ; link to parent node; null for root
+
+(defsubst js2-node-get-prop (node prop &optional default)
+  (or (cadr (assoc prop (js2-node-props node))) default))
+
+(defsubst js2-node-set-prop (node prop value)
+  (setf (js2-node-props node)
+        (cons (list prop value) (js2-node-props node))))
+
+(defun js2-fixup-starts (n nodes)
+  "Adjust the start positions of NODES to be relative to N.
+Any node in the list may be nil, for convenience."
+  (dolist (node nodes)
+    (when node
+      (setf (js2-node-pos node) (- (js2-node-pos node)
+                                   (js2-node-pos n))))))
+
+(defun js2-node-add-children (parent &rest nodes)
+  "Set parent node of NODES to PARENT, and return PARENT.
+Does nothing if we're not recording parent links.
+If any given node in NODES is nil, doesn't record that link."
+  (js2-fixup-starts parent nodes)
+  (dolist (node nodes)
+    (and node
+         (setf (js2-node-parent node) parent))))
+
+;; Non-recursive since it's called a frightening number of times.
+(defun js2-node-abs-pos (n)
+  (let ((pos (js2-node-pos n)))
+    (while (setq n (js2-node-parent n))
+      (setq pos (+ pos (js2-node-pos n))))
+    pos))
+
+(defsubst js2-node-abs-end (n)
+  "Return absolute buffer position of end of N."
+  (+ (js2-node-abs-pos n) (js2-node-len n)))
+
+;; It's important to make sure block nodes have a Lisp list for the
+;; child nodes, to limit printing recursion depth in an AST that
+;; otherwise consists of defstruct vectors.  Emacs will crash printing
+;; a sufficiently large vector tree.
+
+(defstruct (js2-block-node
+            (:include js2-node)
+            (:constructor nil)
+            (:constructor make-js2-block-node (&key (type js2-BLOCK)
+                                                    (pos js2-token-beg)
+                                                    len
+                                                    props
+                                                    kids)))
+  "A block of statements."
+  kids)  ; a Lisp list of the child statement nodes
+
+(put 'cl-struct-js2-block-node 'js2-visitor 'js2-visit-block)
+(put 'cl-struct-js2-block-node 'js2-printer 'js2-print-block)
+
+(defun js2-visit-block (ast callback)
+  "Visit the `js2-block-node' children of AST."
+  (dolist (kid (js2-block-node-kids ast))
+    (js2-visit-ast kid callback)))
+
+(defun js2-print-block (n i)
+  (let ((pad (js2-make-pad i)))
+    (insert pad "{\n")
+    (dolist (kid (js2-block-node-kids n))
+      (js2-print-ast kid (1+ i)))
+    (insert pad "}")))
+
+(defstruct (js2-scope
+            (:include js2-block-node)
+            (:constructor nil)
+            (:constructor make-js2-scope (&key (type js2-BLOCK)
+                                               (pos js2-token-beg)
+                                               len
+                                               kids)))
+  ;; The symbol-table is a LinkedHashMap<String,Symbol> in Rhino.
+  ;; I don't have one of those handy, so I'll use an alist for now.
+  ;; It's as fast as an emacs hashtable for up to about 50 elements,
+  ;; and is much lighter-weight to construct (both CPU and mem).
+  ;; The keys are interned strings (symbols) for faster lookup.
+  ;; Should switch to hybrid alist/hashtable eventually.
+  symbol-table  ; an alist of (symbol . js2-symbol)
+  parent-scope  ; a `js2-scope'
+  top)          ; top-level `js2-scope' (script/function)
+
+(put 'cl-struct-js2-scope 'js2-visitor 'js2-visit-block)
+(put 'cl-struct-js2-scope 'js2-printer 'js2-print-none)
+
+(defun js2-node-get-enclosing-scope (node)
+  "Return the innermost `js2-scope' node surrounding NODE.
+Returns nil if there is no enclosing scope node."
+  (let ((parent (js2-node-parent node)))
+    (while (not (js2-scope-p parent))
+      (setq parent (js2-node-parent parent)))
+    parent))
+
+(defun js2-get-defining-scope (scope name)
+  "Search up scope chain from SCOPE looking for NAME, a string or symbol.
+Returns `js2-scope' in which NAME is defined, or nil if not found."
+  (let ((sym (if (symbolp name)
+                 name
+               (intern name)))
+        table
+        result
+        (continue t))
+    (while (and scope continue)
+      (if (and (setq table (js2-scope-symbol-table scope))
+               (assq sym table))
+          (setq continue nil
+                result scope)
+        (setq scope (js2-scope-parent-scope scope))))
+    result))
+
+(defun js2-scope-get-symbol (scope name)
+  "Return symbol table entry for NAME in SCOPE.
+NAME can be a string or symbol.   Returns a `js2-symbol' or nil if not found."
+  (and (js2-scope-symbol-table scope)
+       (cdr (assq (if (symbolp name)
+                      name
+                    (intern name))
+                  (js2-scope-symbol-table scope)))))
+
+(defun js2-scope-put-symbol (scope name symbol)
+  "Enter SYMBOL into symbol-table for SCOPE under NAME.
+NAME can be a Lisp symbol or string.  SYMBOL is a `js2-symbol'."
+  (let* ((table (js2-scope-symbol-table scope))
+         (sym (if (symbolp name) name (intern name)))
+         (entry (assq sym table)))
+    (if entry
+        (setcdr entry symbol)
+      (push (cons sym symbol)
+            (js2-scope-symbol-table scope)))))
+
+(defstruct (js2-symbol
+            (:constructor nil)
+            (:constructor make-js2-symbol (decl-type name &optional ast-node)))
+  "A symbol table entry."
+  ;; One of js2-FUNCTION, js2-LP (for parameters), js2-VAR,
+  ;; js2-LET, or js2-CONST
+  decl-type
+  name  ; string
+  ast-node) ; a `js2-node'
+
+(defstruct (js2-error-node
+            (:include js2-node)
+            (:constructor nil) ; silence emacs21 byte-compiler
+            (:constructor make-js2-error-node (&key (type js2-ERROR)
+                                                    (pos js2-token-beg)
+                                                    len)))
+  "AST node representing a parse error.")
+
+(put 'cl-struct-js2-error-node 'js2-visitor 'js2-visit-none)
+(put 'cl-struct-js2-error-node 'js2-printer 'js2-print-none)
+
+(defstruct (js2-script-node
+            (:include js2-scope)
+            (:constructor nil)
+            (:constructor make-js2-script-node (&key (type js2-SCRIPT)
+                                                     (pos js2-token-beg)
+                                                     len
+                                                     var-decls
+                                                     fun-decls)))
+  functions   ; Lisp list of nested functions
+  regexps     ; Lisp list of (string . flags)
+  symbols     ; alist (every symbol gets unique index)
+  (param-count 0)
+  var-names   ; vector of string names
+  consts      ; bool-vector matching var-decls
+  (temp-number 0))  ; for generating temp variables
+
+(put 'cl-struct-js2-script-node 'js2-visitor 'js2-visit-block)
+(put 'cl-struct-js2-script-node 'js2-printer 'js2-print-script)
+
+(defun js2-print-script (node indent)
+  (dolist (kid (js2-block-node-kids node))
+    (js2-print-ast kid indent)))
+
+(defstruct (js2-ast-root
+            (:include js2-script-node)
+            (:constructor nil)
+            (:constructor make-js2-ast-root (&key (type js2-SCRIPT)
+                                                  (pos js2-token-beg)
+                                                  len
+                                                  buffer)))
+  "The root node of a js2 AST."
+  buffer         ; the source buffer from which the code was parsed
+  comments       ; a Lisp list of comments, ordered by start position
+  errors         ; a Lisp list of errors found during parsing
+  warnings       ; a Lisp list of warnings found during parsing
+  node-count)    ; number of nodes in the tree, including the root
+
+(put 'cl-struct-js2-ast-root 'js2-visitor 'js2-visit-ast-root)
+(put 'cl-struct-js2-ast-root 'js2-printer 'js2-print-script)
+
+(defun js2-visit-ast-root (ast callback)
+  (dolist (kid (js2-ast-root-kids ast))
+    (js2-visit-ast kid callback))
+  (dolist (comment (js2-ast-root-comments ast))
+    (js2-visit-ast comment callback)))
+
+(defstruct (js2-comment-node
+            (:include js2-node)
+            (:constructor nil)
+            (:constructor make-js2-comment-node (&key (type js2-COMMENT)
+                                                      (pos js2-token-beg)
+                                                      len
+                                                      (format js2-ts-comment-type))))
+  format)  ; 'line, 'block, 'jsdoc or 'html
+
+(put 'cl-struct-js2-comment-node 'js2-visitor 'js2-visit-none)
+(put 'cl-struct-js2-comment-node 'js2-printer 'js2-print-comment)
+
+(defun js2-print-comment (n i)
+  ;; We really ought to link end-of-line comments to their nodes.
+  ;; Or maybe we could add a new comment type, 'endline.
+  (insert (js2-make-pad i)
+          (js2-node-string n)))
+
+(defstruct (js2-expr-stmt-node
+            (:include js2-node)
+            (:constructor nil)
+            (:constructor make-js2-expr-stmt-node (&key (type js2-EXPR_VOID)
+                                                        (pos js2-ts-cursor)
+                                                        len
+                                                        expr)))
+  "An expression statement."
+  expr)
+
+(defsubst js2-expr-stmt-node-set-has-result (node)
+  "Change NODE type to `js2-EXPR_RESULT'.  Used for code generation."
+  (setf (js2-node-type node) js2-EXPR_RESULT))
+
+(put 'cl-struct-js2-expr-stmt-node 'js2-visitor 'js2-visit-expr-stmt-node)
+(put 'cl-struct-js2-expr-stmt-node 'js2-printer 'js2-print-expr-stmt-node)
+
+(defun js2-visit-expr-stmt-node (n v)
+  (js2-visit-ast (js2-expr-stmt-node-expr n) v))
+
+(defun js2-print-expr-stmt-node (n indent)
+  (js2-print-ast (js2-expr-stmt-node-expr n) indent)
+  (insert ";\n"))
+
+(defstruct (js2-loop-node
+            (:include js2-scope)
+            (:constructor nil))
+  "Abstract supertype of loop nodes."
+  body      ; a `js2-block-node'
+  lp        ; position of left-paren, nil if omitted
+  rp)       ; position of right-paren, nil if omitted
+
+(defstruct (js2-do-node
+            (:include js2-loop-node)
+            (:constructor nil)
+            (:constructor make-js2-do-node (&key (type js2-DO)
+                                                 (pos js2-token-beg)
+                                                 len
+                                                 body
+                                                 condition
+                                                 while-pos
+                                                 lp
+                                                 rp)))
+  "AST node for do-loop."
+  condition  ; while (expression)
+  while-pos) ; buffer position of 'while' keyword
+
+(put 'cl-struct-js2-do-node 'js2-visitor 'js2-visit-do-node)
+(put 'cl-struct-js2-do-node 'js2-printer 'js2-print-do-node)
+
+(defun js2-visit-do-node (n v)
+  (js2-visit-ast (js2-do-node-body n) v)
+  (js2-visit-ast (js2-do-node-condition n) v))
+
+(defun js2-print-do-node (n i)
+  (let ((pad (js2-make-pad i)))
+    (insert pad "do {\n")
+    (dolist (kid (js2-block-node-kids (js2-do-node-body n)))
+      (js2-print-ast kid (1+ i)))
+    (insert pad "} while (")
+    (js2-print-ast (js2-do-node-condition n) 0)
+    (insert ");\n")))
+
+(defstruct (js2-while-node
+            (:include js2-loop-node)
+            (:constructor nil)
+            (:constructor make-js2-while-node (&key (type js2-WHILE)
+                                                    (pos js2-token-beg)
+                                                    len body
+                                                    condition lp
+                                                    rp)))
+  "AST node for while-loop."
+  condition)    ; while-condition
+
+(put 'cl-struct-js2-while-node 'js2-visitor 'js2-visit-while-node)
+(put 'cl-struct-js2-while-node 'js2-printer 'js2-print-while-node)
+
+(defun js2-visit-while-node (n v)
+  (js2-visit-ast (js2-while-node-condition n) v)
+  (js2-visit-ast (js2-while-node-body n) v))
+
+(defun js2-print-while-node (n i)
+  (let ((pad (js2-make-pad i)))
+    (insert pad "while (")
+    (js2-print-ast (js2-while-node-condition n) 0)
+    (insert ") {\n")
+    (js2-print-body (js2-while-node-body n) (1+ i))
+    (insert pad "}\n")))
+
+(defstruct (js2-for-node
+            (:include js2-loop-node)
+            (:constructor nil)
+            (:constructor make-js2-for-node (&key (type js2-FOR)
+                                                  (pos js2-ts-cursor)
+                                                  len body init
+                                                  condition
+                                                  update lp rp)))
+  "AST node for a C-style for-loop."
+  init       ; initialization expression
+  condition  ; loop condition
+  update)    ; update clause
+
+(put 'cl-struct-js2-for-node 'js2-visitor 'js2-visit-for-node)
+(put 'cl-struct-js2-for-node 'js2-printer 'js2-print-for-node)
+
+(defun js2-visit-for-node (n v)
+  (js2-visit-ast (js2-for-node-init n) v)
+  (js2-visit-ast (js2-for-node-condition n) v)
+  (js2-visit-ast (js2-for-node-update n) v)
+  (js2-visit-ast (js2-for-node-body n) v))
+
+(defun js2-print-for-node (n i)
+  (let ((pad (js2-make-pad i)))
+    (insert pad "for (")
+    (js2-print-ast (js2-for-node-init n) 0)
+    (insert "; ")
+    (js2-print-ast (js2-for-node-condition n) 0)
+    (insert "; ")
+    (js2-print-ast (js2-for-node-update n) 0)
+    (insert ") {\n")
+    (js2-print-body (js2-for-node-body n) (1+ i))
+    (insert pad "}\n")))
+
+(defstruct (js2-for-in-node
+            (:include js2-loop-node)
+            (:constructor nil)
+            (:constructor make-js2-for-in-node (&key (type js2-FOR)
+                                                     (pos js2-ts-cursor)
+                                                     len body
+                                                     iterator
+                                                     object
+                                                     in-pos
+                                                     each-pos
+                                                     foreach-p forof-p
+                                                     lp rp)))
+  "AST node for a for..in loop."
+  iterator  ; [var] foo in ...
+  object    ; object over which we're iterating
+  in-pos    ; buffer position of 'in' keyword
+  each-pos  ; buffer position of 'each' keyword, if foreach-p
+  foreach-p ; t if it's a for-each loop
+  forof-p)  ; t if it's a for-of loop
+
+(put 'cl-struct-js2-for-in-node 'js2-visitor 'js2-visit-for-in-node)
+(put 'cl-struct-js2-for-in-node 'js2-printer 'js2-print-for-in-node)
+
+(defun js2-visit-for-in-node (n v)
+  (js2-visit-ast (js2-for-in-node-iterator n) v)
+  (js2-visit-ast (js2-for-in-node-object n) v)
+  (js2-visit-ast (js2-for-in-node-body n) v))
+
+(defun js2-print-for-in-node (n i)
+  (let ((pad (js2-make-pad i))
+        (foreach (js2-for-in-node-foreach-p n))
+        (forof (js2-for-in-node-forof-p n)))
+    (insert pad "for ")
+    (if foreach
+        (insert "each "))
+    (insert "(")
+    (js2-print-ast (js2-for-in-node-iterator n) 0)
+    (if forof
+        (insert " of ")
+      (insert " in "))
+    (js2-print-ast (js2-for-in-node-object n) 0)
+    (insert ") {\n")
+    (js2-print-body (js2-for-in-node-body n) (1+ i))
+    (insert pad "}\n")))
+
+(defstruct (js2-return-node
+            (:include js2-node)
+            (:constructor nil)
+            (:constructor make-js2-return-node (&key (type js2-RETURN)
+                                                     (pos js2-ts-cursor)
+                                                     len
+                                                     retval)))
+  "AST node for a return statement."
+  retval)  ; expression to return, or 'undefined
+
+(put 'cl-struct-js2-return-node 'js2-visitor 'js2-visit-return-node)
+(put 'cl-struct-js2-return-node 'js2-printer 'js2-print-return-node)
+
+(defun js2-visit-return-node (n v)
+  (js2-visit-ast (js2-return-node-retval n) v))
+
+(defun js2-print-return-node (n i)
+  (insert (js2-make-pad i) "return")
+  (when (js2-return-node-retval n)
+    (insert " ")
+    (js2-print-ast (js2-return-node-retval n) 0))
+  (insert ";\n"))
+
+(defstruct (js2-if-node
+            (:include js2-node)
+            (:constructor nil)
+            (:constructor make-js2-if-node (&key (type js2-IF)
+                                                 (pos js2-ts-cursor)
+                                                 len condition
+                                                 then-part
+                                                 else-pos
+                                                 else-part lp
+                                                 rp)))
+  "AST node for an if-statement."
+  condition   ; expression
+  then-part   ; statement or block
+  else-pos    ; optional buffer position of 'else' keyword
+  else-part   ; optional statement or block
+  lp          ; position of left-paren, nil if omitted
+  rp)         ; position of right-paren, nil if omitted
+
+(put 'cl-struct-js2-if-node 'js2-visitor 'js2-visit-if-node)
+(put 'cl-struct-js2-if-node 'js2-printer 'js2-print-if-node)
+
+(defun js2-visit-if-node (n v)
+  (js2-visit-ast (js2-if-node-condition n) v)
+  (js2-visit-ast (js2-if-node-then-part n) v)
+  (js2-visit-ast (js2-if-node-else-part n) v))
+
+(defun js2-print-if-node (n i)
+  (let ((pad (js2-make-pad i))
+        (then-part (js2-if-node-then-part n))
+        (else-part (js2-if-node-else-part n)))
+    (insert pad "if (")
+    (js2-print-ast (js2-if-node-condition n) 0)
+    (insert ") {\n")
+    (js2-print-body then-part (1+ i))
+    (insert pad "}")
+    (cond
+     ((not else-part)
+      (insert "\n"))
+     ((js2-if-node-p else-part)
+      (insert " else ")
+      (js2-print-body else-part i))
+     (t
+      (insert " else {\n")
+      (js2-print-body else-part (1+ i))
+      (insert pad "}\n")))))
+
+(defstruct (js2-try-node
+            (:include js2-node)
+            (:constructor nil)
+            (:constructor make-js2-try-node (&key (type js2-TRY)
+                                                  (pos js2-ts-cursor)
+                                                  len
+                                                  try-block
+                                                  catch-clauses
+                                                  finally-block)))
+  "AST node for a try-statement."
+  try-block
+  catch-clauses  ; a Lisp list of `js2-catch-node'
+  finally-block) ; a `js2-finally-node'
+
+(put 'cl-struct-js2-try-node 'js2-visitor 'js2-visit-try-node)
+(put 'cl-struct-js2-try-node 'js2-printer 'js2-print-try-node)
+
+(defun js2-visit-try-node (n v)
+  (js2-visit-ast (js2-try-node-try-block n) v)
+  (dolist (clause (js2-try-node-catch-clauses n))
+    (js2-visit-ast clause v))
+  (js2-visit-ast (js2-try-node-finally-block n) v))
+
+(defun js2-print-try-node (n i)
+  (let ((pad (js2-make-pad i))
+        (catches (js2-try-node-catch-clauses n))
+        (finally (js2-try-node-finally-block n)))
+    (insert pad "try {\n")
+    (js2-print-body (js2-try-node-try-block n) (1+ i))
+    (insert pad "}")
+    (when catches
+      (dolist (catch catches)
+        (js2-print-ast catch i)))
+    (if finally
+        (js2-print-ast finally i)
+      (insert "\n"))))
+
+(defstruct (js2-catch-node
+            (:include js2-node)
+            (:constructor nil)
+            (:constructor make-js2-catch-node (&key (type js2-CATCH)
+                                                    (pos js2-ts-cursor)
+                                                    len
+                                                    param
+                                                    guard-kwd
+                                                    guard-expr
+                                                    block lp
+                                                    rp)))
+  "AST node for a catch clause."
+  param       ; destructuring form or simple name node
+  guard-kwd   ; relative buffer position of "if" in "catch (x if ...)"
+  guard-expr  ; catch condition, a `js2-node'
+  block       ; statements, a `js2-block-node'
+  lp          ; buffer position of left-paren, nil if omitted
+  rp)         ; buffer position of right-paren, nil if omitted
+
+(put 'cl-struct-js2-catch-node 'js2-visitor 'js2-visit-catch-node)
+(put 'cl-struct-js2-catch-node 'js2-printer 'js2-print-catch-node)
+
+(defun js2-visit-catch-node (n v)
+  (js2-visit-ast (js2-catch-node-param n) v)
+  (when (js2-catch-node-guard-kwd n)
+    (js2-visit-ast (js2-catch-node-guard-expr n) v))
+  (js2-visit-ast (js2-catch-node-block n) v))
+
+(defun js2-print-catch-node (n i)
+  (let ((pad (js2-make-pad i))
+        (guard-kwd (js2-catch-node-guard-kwd n))
+        (guard-expr (js2-catch-node-guard-expr n)))
+    (insert " catch (")
+    (js2-print-ast (js2-catch-node-param n) 0)
+    (when guard-kwd
+      (insert " if ")
+      (js2-print-ast guard-expr 0))
+    (insert ") {\n")
+    (js2-print-body (js2-catch-node-block n) (1+ i))
+    (insert pad "}")))
+
+(defstruct (js2-finally-node
+            (:include js2-node)
+            (:constructor nil)
+            (:constructor make-js2-finally-node (&key (type js2-FINALLY)
+                                                      (pos js2-ts-cursor)
+                                                      len body)))
+  "AST node for a finally clause."
+  body)  ; a `js2-node', often but not always a block node
+
+(put 'cl-struct-js2-finally-node 'js2-visitor 'js2-visit-finally-node)
+(put 'cl-struct-js2-finally-node 'js2-printer 'js2-print-finally-node)
+
+(defun js2-visit-finally-node (n v)
+  (js2-visit-ast (js2-finally-node-body n) v))
+
+(defun js2-print-finally-node (n i)
+  (let ((pad (js2-make-pad i)))
+    (insert " finally {\n")
+    (js2-print-body (js2-finally-node-body n) (1+ i))
+    (insert pad "}\n")))
+
+(defstruct (js2-switch-node
+            (:include js2-node)
+            (:constructor nil)
+            (:constructor make-js2-switch-node (&key (type js2-SWITCH)
+                                                     (pos js2-ts-cursor)
+                                                     len
+                                                     discriminant
+                                                     cases lp
+                                                     rp)))
+  "AST node for a switch statement."
+  discriminant  ; a `js2-node' (switch expression)
+  cases  ; a Lisp list of `js2-case-node'
+  lp     ; position of open-paren for discriminant, nil if omitted
+  rp)    ; position of close-paren for discriminant, nil if omitted
+
+(put 'cl-struct-js2-switch-node 'js2-visitor 'js2-visit-switch-node)
+(put 'cl-struct-js2-switch-node 'js2-printer 'js2-print-switch-node)
+
+(defun js2-visit-switch-node (n v)
+  (js2-visit-ast (js2-switch-node-discriminant n) v)
+  (dolist (c (js2-switch-node-cases n))
+    (js2-visit-ast c v)))
+
+(defun js2-print-switch-node (n i)
+  (let ((pad (js2-make-pad i))
+        (cases (js2-switch-node-cases n)))
+    (insert pad "switch (")
+    (js2-print-ast (js2-switch-node-discriminant n) 0)
+    (insert ") {\n")
+    (dolist (case cases)
+      (js2-print-ast case i))
+    (insert pad "}\n")))
+
+(defstruct (js2-case-node
+            (:include js2-block-node)
+            (:constructor nil)
+            (:constructor make-js2-case-node (&key (type js2-CASE)
+                                                   (pos js2-ts-cursor)
+                                                   len kids expr)))
+  "AST node for a case clause of a switch statement."
+  expr)   ; the case expression (nil for default)
+
+(put 'cl-struct-js2-case-node 'js2-visitor 'js2-visit-case-node)
+(put 'cl-struct-js2-case-node 'js2-printer 'js2-print-case-node)
+
+(defun js2-visit-case-node (n v)
+  (js2-visit-ast (js2-case-node-expr n) v)
+  (js2-visit-block n v))
+
+(defun js2-print-case-node (n i)
+  (let ((pad (js2-make-pad i))
+        (expr (js2-case-node-expr n)))
+    (insert pad)
+    (if (null expr)
+        (insert "default:\n")
+      (insert "case ")
+      (js2-print-ast expr 0)
+      (insert ":\n"))
+    (dolist (kid (js2-case-node-kids n))
+      (js2-print-ast kid (1+ i)))))
+
+(defstruct (js2-throw-node
+            (:include js2-node)
+            (:constructor nil)
+            (:constructor make-js2-throw-node (&key (type js2-THROW)
+                                                    (pos js2-ts-cursor)
+                                                    len expr)))
+  "AST node for a throw statement."
+  expr)   ; the expression to throw
+
+(put 'cl-struct-js2-throw-node 'js2-visitor 'js2-visit-throw-node)
+(put 'cl-struct-js2-throw-node 'js2-printer 'js2-print-throw-node)
+
+(defun js2-visit-throw-node (n v)
+  (js2-visit-ast (js2-throw-node-expr n) v))
+
+(defun js2-print-throw-node (n i)
+  (insert (js2-make-pad i) "throw ")
+  (js2-print-ast (js2-throw-node-expr n) 0)
+  (insert ";\n"))
+
+(defstruct (js2-with-node
+            (:include js2-node)
+            (:constructor nil)
+            (:constructor make-js2-with-node (&key (type js2-WITH)
+                                                   (pos js2-ts-cursor)
+                                                   len object
+                                                   body lp rp)))
+  "AST node for a with-statement."
+  object
+  body
+  lp    ; buffer position of left-paren around object, nil if omitted
+  rp)   ; buffer position of right-paren around object, nil if omitted
+
+(put 'cl-struct-js2-with-node 'js2-visitor 'js2-visit-with-node)
+(put 'cl-struct-js2-with-node 'js2-printer 'js2-print-with-node)
+
+(defun js2-visit-with-node (n v)
+  (js2-visit-ast (js2-with-node-object n) v)
+  (js2-visit-ast (js2-with-node-body n) v))
+
+(defun js2-print-with-node (n i)
+  (let ((pad (js2-make-pad i)))
+    (insert pad "with (")
+    (js2-print-ast (js2-with-node-object n) 0)
+    (insert ") {\n")
+    (js2-print-body (js2-with-node-body n) (1+ i))
+    (insert pad "}\n")))
+
+(defstruct (js2-label-node
+            (:include js2-node)
+            (:constructor nil)
+            (:constructor make-js2-label-node (&key (type js2-LABEL)
+                                                    (pos js2-ts-cursor)
+                                                    len name)))
+  "AST node for a statement label or case label."
+  name   ; a string
+  loop)  ; for validating and code-generating continue-to-label
+
+(put 'cl-struct-js2-label-node 'js2-visitor 'js2-visit-none)
+(put 'cl-struct-js2-label-node 'js2-printer 'js2-print-label)
+
+(defun js2-print-label (n i)
+  (insert (js2-make-pad i)
+          (js2-label-node-name n)
+          ":\n"))
+
+(defstruct (js2-labeled-stmt-node
+            (:include js2-node)
+            (:constructor nil)
+            ;; type needs to be in `js2-side-effecting-tokens' to avoid spurious
+            ;; no-side-effects warnings, hence js2-EXPR_RESULT.
+            (:constructor make-js2-labeled-stmt-node (&key (type js2-EXPR_RESULT)
+                                                           (pos js2-ts-cursor)
+                                                           len labels stmt)))
+  "AST node for a statement with one or more labels.
+Multiple labels for a statement are collapsed into the labels field."
+  labels  ; Lisp list of `js2-label-node'
+  stmt)   ; the statement these labels are for
+
+(put 'cl-struct-js2-labeled-stmt-node 'js2-visitor 'js2-visit-labeled-stmt)
+(put 'cl-struct-js2-labeled-stmt-node 'js2-printer 'js2-print-labeled-stmt)
+
+(defun js2-get-label-by-name (lbl-stmt name)
+  "Return a `js2-label-node' by NAME from LBL-STMT's labels list.
+Returns nil if no such label is in the list."
+  (let ((label-list (js2-labeled-stmt-node-labels lbl-stmt))
+        result)
+    (while (and label-list (not result))
+      (if (string= (js2-label-node-name (car label-list)) name)
+          (setq result (car label-list))
+        (setq label-list (cdr label-list))))
+    result))
+
+(defun js2-visit-labeled-stmt (n v)
+  (dolist (label (js2-labeled-stmt-node-labels n))
+    (js2-visit-ast label v))
+  (js2-visit-ast (js2-labeled-stmt-node-stmt n) v))
+
+(defun js2-print-labeled-stmt (n i)
+  (dolist (label (js2-labeled-stmt-node-labels n))
+    (js2-print-ast label i))
+  (js2-print-ast (js2-labeled-stmt-node-stmt n) (1+ i)))
+
+(defun js2-labeled-stmt-node-contains (node label)
+  "Return t if NODE contains LABEL in its label set.
+NODE is a `js2-labels-node'.  LABEL is an identifier."
+  (loop for nl in (js2-labeled-stmt-node-labels node)
+        if (string= label (js2-label-node-name nl))
+          return t
+        finally return nil))
+
+(defsubst js2-labeled-stmt-node-add-label (node label)
+  "Add a `js2-label-node' to the label set for this statement."
+  (setf (js2-labeled-stmt-node-labels node)
+        (nconc (js2-labeled-stmt-node-labels node) (list label))))
+
+(defstruct (js2-jump-node
+            (:include js2-node)
+            (:constructor nil))
+  "Abstract supertype of break and continue nodes."
+  label   ; `js2-name-node' for location of label identifier, if present
+  target) ; target js2-labels-node or loop/switch statement
+
+(defun js2-visit-jump-node (n v)
+  ;; We don't visit the target, since it's a back-link.
+  (js2-visit-ast (js2-jump-node-label n) v))
+
+(defstruct (js2-break-node
+            (:include js2-jump-node)
+            (:constructor nil)
+            (:constructor make-js2-break-node (&key (type js2-BREAK)
+                                                    (pos js2-ts-cursor)
+                                                    len label target)))
+  "AST node for a break statement.
+The label field is a `js2-name-node', possibly nil, for the named label
+if provided.  E.g. in 'break foo', it represents 'foo'.  The target field
+is the target of the break - a label node or enclosing loop/switch statement.")
+
+(put 'cl-struct-js2-break-node 'js2-visitor 'js2-visit-jump-node)
+(put 'cl-struct-js2-break-node 'js2-printer 'js2-print-break-node)
+
+(defun js2-print-break-node (n i)
+  (insert (js2-make-pad i) "break")
+  (when (js2-break-node-label n)
+    (insert " ")
+    (js2-print-ast (js2-break-node-label n) 0))
+  (insert ";\n"))
+
+(defstruct (js2-continue-node
+            (:include js2-jump-node)
+            (:constructor nil)
+            (:constructor make-js2-continue-node (&key (type js2-CONTINUE)
+                                                       (pos js2-ts-cursor)
+                                                       len label target)))
+  "AST node for a continue statement.
+The label field is the user-supplied enclosing label name, a `js2-name-node'.
+It is nil if continue specifies no label.  The target field is the jump target:
+a `js2-label-node' or the innermost enclosing loop.")
+
+(put 'cl-struct-js2-continue-node 'js2-visitor 'js2-visit-jump-node)
+(put 'cl-struct-js2-continue-node 'js2-printer 'js2-print-continue-node)
+
+(defun js2-print-continue-node (n i)
+  (insert (js2-make-pad i) "continue")
+  (when (js2-continue-node-label n)
+    (insert " ")
+    (js2-print-ast (js2-continue-node-label n) 0))
+  (insert ";\n"))
+
+(defstruct (js2-function-node
+            (:include js2-script-node)
+            (:constructor nil)
+            (:constructor make-js2-function-node (&key (type js2-FUNCTION)
+                                                       (pos js2-ts-cursor)
+                                                       len
+                                                       (ftype 'FUNCTION)
+                                                       (form 'FUNCTION_STATEMENT)
+                                                       (name "")
+                                                       params rest-p
+                                                       body
+                                                       lp rp)))
+  "AST node for a function declaration.
+The `params' field is a Lisp list of nodes.  Each node is either a simple
+`js2-name-node', or if it's a destructuring-assignment parameter, a
+`js2-array-node' or `js2-object-node'."
+  ftype            ; FUNCTION, GETTER or SETTER
+  form             ; FUNCTION_{STATEMENT|EXPRESSION|EXPRESSION_STATEMENT}
+  name             ; function name (a `js2-name-node', or nil if anonymous)
+  params           ; a Lisp list of destructuring forms or simple name nodes
+  rest-p           ; if t, the last parameter is rest parameter
+  body             ; a `js2-block-node' or expression node (1.8 only)
+  lp               ; position of arg-list open-paren, or nil if omitted
+  rp               ; position of arg-list close-paren, or nil if omitted
+  ignore-dynamic   ; ignore value of the dynamic-scope flag (interpreter only)
+  needs-activation ; t if we need an activation object for this frame
+  is-generator     ; t if this function contains a yield
+  member-expr)     ; nonstandard Ecma extension from Rhino
+
+(put 'cl-struct-js2-function-node 'js2-visitor 'js2-visit-function-node)
+(put 'cl-struct-js2-function-node 'js2-printer 'js2-print-function-node)
+
+(defun js2-visit-function-node (n v)
+  (js2-visit-ast (js2-function-node-name n) v)
+  (dolist (p (js2-function-node-params n))
+    (js2-visit-ast p v))
+  (js2-visit-ast (js2-function-node-body n) v))
+
+(defun js2-print-function-node (n i)
+  (let ((pad (js2-make-pad i))
+        (getter (js2-node-get-prop n 'GETTER_SETTER))
+        (name (js2-function-node-name n))
+        (params (js2-function-node-params n))
+        (rest-p (js2-function-node-rest-p n))
+        (body (js2-function-node-body n))
+        (expr (eq (js2-function-node-form n) 'FUNCTION_EXPRESSION)))
+    (unless getter
+      (insert pad "function"))
+    (when name
+        (insert " ")
+        (js2-print-ast name 0))
+    (insert "(")
+    (loop with len = (length params)
+          for param in params
+          for count from 1
+          do
+          (when (and rest-p (= count len))
+            (insert "..."))
+          (js2-print-ast param 0)
+          (when (< count len)
+            (insert ", ")))
+    (insert ") {")
+    (unless expr
+      (insert "\n"))
+    ;; TODO:  fix this to be smarter about indenting, etc.
+    (js2-print-body body (1+ i))
+    (insert pad "}")
+    (unless expr
+      (insert "\n"))))
+
+(defun js2-function-name (node)
+  "Return function name for NODE, a `js2-function-node', or nil if anonymous."
+  (and (js2-function-node-name node)
+       (js2-name-node-name (js2-function-node-name node))))
+
+;; Having this be an expression node makes it more flexible.
+;; There are IDE contexts, such as indentation in a for-loop initializer,
+;; that work better if you assume it's an expression.  Whenever we have
+;; a standalone var/const declaration, we just wrap with an expr stmt.
+;; Eclipse apparently screwed this up and now has two versions, expr and stmt.
+(defstruct (js2-var-decl-node
+            (:include js2-node)
+            (:constructor nil)
+            (:constructor make-js2-var-decl-node (&key (type js2-VAR)
+                                                       (pos js2-token-beg)
+                                                       len kids
+                                                       decl-type)))
+  "AST node for a variable declaration list (VAR, CONST or LET).
+The node bounds differ depending on the declaration type.  For VAR or
+CONST declarations, the bounds include the var/const keyword.  For LET
+declarations, the node begins at the position of the first child."
+  kids        ; a Lisp list of `js2-var-init-node' structs.
+  decl-type)  ; js2-VAR, js2-CONST or js2-LET
+
+(put 'cl-struct-js2-var-decl-node 'js2-visitor 'js2-visit-var-decl)
+(put 'cl-struct-js2-var-decl-node 'js2-printer 'js2-print-var-decl)
+
+(defun js2-visit-var-decl (n v)
+  (dolist (kid (js2-var-decl-node-kids n))
+    (js2-visit-ast kid v)))
+
+(defun js2-print-var-decl (n i)
+  (let ((pad (js2-make-pad i))
+        (tt (js2-var-decl-node-decl-type n)))
+    (insert pad)
+    (insert (cond
+             ((= tt js2-VAR) "var ")
+             ((= tt js2-LET) "let ")
+             ((= tt js2-CONST) "const ")
+             (t
+              (error "malformed var-decl node"))))
+    (loop with kids = (js2-var-decl-node-kids n)
+          with len = (length kids)
+          for kid in kids
+          for count from 1
+          do
+          (js2-print-ast kid 0)
+          (if (< count len)
+              (insert ", ")))))
+
+(defstruct (js2-var-init-node
+            (:include js2-node)
+            (:constructor nil)
+            (:constructor make-js2-var-init-node (&key (type js2-VAR)
+                                                       (pos js2-ts-cursor)
+                                                       len target
+                                                       initializer)))
+  "AST node for a variable declaration.
+The type field will be js2-CONST for a const decl."
+  target        ; `js2-name-node', `js2-object-node', or `js2-array-node'
+  initializer)  ; initializer expression, a `js2-node'
+
+(put 'cl-struct-js2-var-init-node 'js2-visitor 'js2-visit-var-init-node)
+(put 'cl-struct-js2-var-init-node 'js2-printer 'js2-print-var-init-node)
+
+(defun js2-visit-var-init-node (n v)
+  (js2-visit-ast (js2-var-init-node-target n) v)
+  (js2-visit-ast (js2-var-init-node-initializer n) v))
+
+(defun js2-print-var-init-node (n i)
+  (let ((pad (js2-make-pad i))
+        (name (js2-var-init-node-target n))
+        (init (js2-var-init-node-initializer n)))
+    (insert pad)
+    (js2-print-ast name 0)
+    (when init
+      (insert " = ")
+      (js2-print-ast init 0))))
+
+(defstruct (js2-cond-node
+            (:include js2-node)
+            (:constructor nil)
+            (:constructor make-js2-cond-node (&key (type js2-HOOK)
+                                                   (pos js2-ts-cursor)
+                                                   len
+                                                   test-expr
+                                                   true-expr
+                                                   false-expr
+                                                   q-pos c-pos)))
+  "AST node for the ternary operator"
+  test-expr
+  true-expr
+  false-expr
+  q-pos   ; buffer position of ?
+  c-pos)  ; buffer position of :
+
+(put 'cl-struct-js2-cond-node 'js2-visitor 'js2-visit-cond-node)
+(put 'cl-struct-js2-cond-node 'js2-printer 'js2-print-cond-node)
+
+(defun js2-visit-cond-node (n v)
+  (js2-visit-ast (js2-cond-node-test-expr n) v)
+  (js2-visit-ast (js2-cond-node-true-expr n) v)
+  (js2-visit-ast (js2-cond-node-false-expr n) v))
+
+(defun js2-print-cond-node (n i)
+  (let ((pad (js2-make-pad i)))
+    (insert pad)
+    (js2-print-ast (js2-cond-node-test-expr n) 0)
+    (insert " ? ")
+    (js2-print-ast (js2-cond-node-true-expr n) 0)
+    (insert " : ")
+    (js2-print-ast (js2-cond-node-false-expr n) 0)))
+
+(defstruct (js2-infix-node
+            (:include js2-node)
+            (:constructor nil)
+            (:constructor make-js2-infix-node (&key type
+                                                    (pos js2-ts-cursor)
+                                                    len op-pos
+                                                    left right)))
+  "Represents infix expressions.
+Includes assignment ops like `|=', and the comma operator.
+The type field inherited from `js2-node' holds the operator."
+  op-pos    ; buffer position where operator begins
+  left      ; any `js2-node'
+  right)    ; any `js2-node'
+
+(put 'cl-struct-js2-infix-node 'js2-visitor 'js2-visit-infix-node)
+(put 'cl-struct-js2-infix-node 'js2-printer 'js2-print-infix-node)
+
+(defun js2-visit-infix-node (n v)
+  (js2-visit-ast (js2-infix-node-left n) v)
+  (js2-visit-ast (js2-infix-node-right n) v))
+
+(defconst js2-operator-tokens
+  (let ((table (make-hash-table :test 'eq))
+        (tokens
+         (list (cons js2-IN "in")
+               (cons js2-TYPEOF "typeof")
+               (cons js2-INSTANCEOF "instanceof")
+               (cons js2-DELPROP "delete")
+               (cons js2-COMMA ",")
+               (cons js2-COLON ":")
+               (cons js2-OR "||")
+               (cons js2-AND "&&")
+               (cons js2-INC "++")
+               (cons js2-DEC "--")
+               (cons js2-BITOR "|")
+               (cons js2-BITXOR "^")
+               (cons js2-BITAND "&")
+               (cons js2-EQ "==")
+               (cons js2-NE "!=")
+               (cons js2-LT "<")
+               (cons js2-LE "<=")
+               (cons js2-GT ">")
+               (cons js2-GE ">=")
+               (cons js2-LSH "<<")
+               (cons js2-RSH ">>")
+               (cons js2-URSH ">>>")
+               (cons js2-ADD "+")       ; infix plus
+               (cons js2-SUB "-")       ; infix minus
+               (cons js2-MUL "*")
+               (cons js2-DIV "/")
+               (cons js2-MOD "%")
+               (cons js2-NOT "!")
+               (cons js2-BITNOT "~")
+               (cons js2-POS "+")       ; unary plus
+               (cons js2-NEG "-")       ; unary minus
+               (cons js2-SHEQ "===")    ; shallow equality
+               (cons js2-SHNE "!==")    ; shallow inequality
+               (cons js2-ASSIGN "=")
+               (cons js2-ASSIGN_BITOR "|=")
+               (cons js2-ASSIGN_BITXOR "^=")
+               (cons js2-ASSIGN_BITAND "&=")
+               (cons js2-ASSIGN_LSH "<<=")
+               (cons js2-ASSIGN_RSH ">>=")
+               (cons js2-ASSIGN_URSH ">>>=")
+               (cons js2-ASSIGN_ADD "+=")
+               (cons js2-ASSIGN_SUB "-=")
+               (cons js2-ASSIGN_MUL "*=")
+               (cons js2-ASSIGN_DIV "/=")
+               (cons js2-ASSIGN_MOD "%="))))
+    (loop for (k . v) in tokens do
+          (puthash k v table))
+    table))
+
+(defun js2-print-infix-node (n i)
+  (let* ((tt (js2-node-type n))
+         (op (gethash tt js2-operator-tokens)))
+    (unless op
+      (error "unrecognized infix operator %s" (js2-node-type n)))
+    (insert (js2-make-pad i))
+    (js2-print-ast (js2-infix-node-left n) 0)
+    (unless (= tt js2-COMMA)
+      (insert " "))
+    (insert op)
+    (insert " ")
+    (js2-print-ast (js2-infix-node-right n) 0)))
+
+(defstruct (js2-assign-node
+            (:include js2-infix-node)
+            (:constructor nil)
+            (:constructor make-js2-assign-node (&key type
+                                                     (pos js2-ts-cursor)
+                                                     len op-pos
+                                                     left right)))
+  "Represents any assignment.
+The type field holds the actual assignment operator.")
+
+(put 'cl-struct-js2-assign-node 'js2-visitor 'js2-visit-infix-node)
+(put 'cl-struct-js2-assign-node 'js2-printer 'js2-print-infix-node)
+
+(defstruct (js2-unary-node
+            (:include js2-node)
+            (:constructor nil)
+            (:constructor make-js2-unary-node (&key type ; required
+                                                    (pos js2-ts-cursor)
+                                                    len operand)))
+  "AST node type for unary operator nodes.
+The type field can be NOT, BITNOT, POS, NEG, INC, DEC,
+TYPEOF, or DELPROP.  For INC or DEC, a 'postfix node
+property is added if the operator follows the operand."
+  operand)  ; a `js2-node' expression
+
+(put 'cl-struct-js2-unary-node 'js2-visitor 'js2-visit-unary-node)
+(put 'cl-struct-js2-unary-node 'js2-printer 'js2-print-unary-node)
+
+(defun js2-visit-unary-node (n v)
+  (js2-visit-ast (js2-unary-node-operand n) v))
+
+(defun js2-print-unary-node (n i)
+  (let* ((tt (js2-node-type n))
+         (op (gethash tt js2-operator-tokens))
+         (postfix (js2-node-get-prop n 'postfix)))
+    (unless op
+      (error "unrecognized unary operator %s" tt))
+    (insert (js2-make-pad i))
+    (unless postfix
+      (insert op))
+    (if (or (= tt js2-TYPEOF)
+            (= tt js2-DELPROP))
+        (insert " "))
+    (js2-print-ast (js2-unary-node-operand n) 0)
+    (when postfix
+      (insert op))))
+
+(defstruct (js2-let-node
+            (:include js2-scope)
+            (:constructor nil)
+            (:constructor make-js2-let-node (&key (type js2-LETEXPR)
+                                                  (pos js2-token-beg)
+                                                  len vars body
+                                                  lp rp)))
+  "AST node for a let expression or a let statement.
+Note that a let declaration such as let x=6, y=7 is a `js2-var-decl-node'."
+  vars   ; a `js2-var-decl-node'
+  body   ; a `js2-node' representing the expression or body block
+  lp
+  rp)
+
+(put 'cl-struct-js2-let-node 'js2-visitor 'js2-visit-let-node)
+(put 'cl-struct-js2-let-node 'js2-printer 'js2-print-let-node)
+
+(defun js2-visit-let-node (n v)
+  (js2-visit-ast (js2-let-node-vars n) v)
+  (js2-visit-ast (js2-let-node-body n) v))
+
+(defun js2-print-let-node (n i)
+  (insert (js2-make-pad i) "let (")
+  (js2-print-ast (js2-let-node-vars n) 0)
+  (insert ") ")
+  (js2-print-ast (js2-let-node-body n) i))
+
+(defstruct (js2-keyword-node
+            (:include js2-node)
+            (:constructor nil)
+            (:constructor make-js2-keyword-node (&key type
+                                                      (pos js2-token-beg)
+                                                      (len (- js2-ts-cursor pos)))))
+  "AST node representing a literal keyword such as `null'.
+Used for `null', `this', `true', `false' and `debugger'.
+The node type is set to js2-NULL, js2-THIS, etc.")
+
+(put 'cl-struct-js2-keyword-node 'js2-visitor 'js2-visit-none)
+(put 'cl-struct-js2-keyword-node 'js2-printer 'js2-print-keyword-node)
+
+(defun js2-print-keyword-node (n i)
+  (insert (js2-make-pad i)
+          (let ((tt (js2-node-type n)))
+            (cond
+             ((= tt js2-THIS) "this")
+             ((= tt js2-NULL) "null")
+             ((= tt js2-TRUE) "true")
+             ((= tt js2-FALSE) "false")
+             ((= tt js2-DEBUGGER) "debugger")
+             (t (error "Invalid keyword literal type: %d" tt))))))
+
+(defsubst js2-this-node-p (node)
+  "Return t if NODE is a `js2-literal-node' of type js2-THIS."
+  (eq (js2-node-type node) js2-THIS))
+
+(defstruct (js2-new-node
+            (:include js2-node)
+            (:constructor nil)
+            (:constructor make-js2-new-node (&key (type js2-NEW)
+                                                  (pos js2-token-beg)
+                                                  len target
+                                                  args initializer
+                                                  lp rp)))
+  "AST node for new-expression such as new Foo()."
+  target  ; an identifier or reference
+  args    ; a Lisp list of argument nodes
+  lp      ; position of left-paren, nil if omitted
+  rp      ; position of right-paren, nil if omitted
+  initializer) ; experimental Rhino syntax:  optional `js2-object-node'
+
+(put 'cl-struct-js2-new-node 'js2-visitor 'js2-visit-new-node)
+(put 'cl-struct-js2-new-node 'js2-printer 'js2-print-new-node)
+
+(defun js2-visit-new-node (n v)
+  (js2-visit-ast (js2-new-node-target n) v)
+  (dolist (arg (js2-new-node-args n))
+    (js2-visit-ast arg v))
+  (js2-visit-ast (js2-new-node-initializer n) v))
+
+(defun js2-print-new-node (n i)
+  (insert (js2-make-pad i) "new ")
+  (js2-print-ast (js2-new-node-target n))
+  (insert "(")
+  (js2-print-list (js2-new-node-args n))
+  (insert ")")
+  (when (js2-new-node-initializer n)
+    (insert " ")
+    (js2-print-ast (js2-new-node-initializer n))))
+
+(defstruct (js2-name-node
+            (:include js2-node)
+            (:constructor nil)
+            (:constructor make-js2-name-node (&key (type js2-NAME)
+                                                   (pos js2-token-beg)
+                                                   (len (- js2-ts-cursor
+                                                           js2-token-beg))
+                                                   (name js2-ts-string))))
+  "AST node for a JavaScript identifier"
+  name   ; a string
+  scope) ; a `js2-scope' (optional, used for codegen)
+
+(put 'cl-struct-js2-name-node 'js2-visitor 'js2-visit-none)
+(put 'cl-struct-js2-name-node 'js2-printer 'js2-print-name-node)
+
+(defun js2-print-name-node (n i)
+  (insert (js2-make-pad i)
+          (js2-name-node-name n)))
+
+(defsubst js2-name-node-length (node)
+  "Return identifier length of NODE, a `js2-name-node'.
+Returns 0 if NODE is nil or its identifier field is nil."
+  (if node
+      (length (js2-name-node-name node))
+    0))
+
+(defstruct (js2-number-node
+            (:include js2-node)
+            (:constructor nil)
+            (:constructor make-js2-number-node (&key (type js2-NUMBER)
+                                                     (pos js2-token-beg)
+                                                     (len (- js2-ts-cursor
+                                                             js2-token-beg))
+                                                     (value js2-ts-string)
+                                                     (num-value js2-ts-number))))
+  "AST node for a number literal."
+  value      ; the original string, e.g. "6.02e23"
+  num-value) ; the parsed number value
+
+(put 'cl-struct-js2-number-node 'js2-visitor 'js2-visit-none)
+(put 'cl-struct-js2-number-node 'js2-printer 'js2-print-number-node)
+
+(defun js2-print-number-node (n i)
+  (insert (js2-make-pad i)
+          (number-to-string (js2-number-node-num-value n))))
+
+(defstruct (js2-regexp-node
+            (:include js2-node)
+            (:constructor nil)
+            (:constructor make-js2-regexp-node (&key (type js2-REGEXP)
+                                                     (pos js2-token-beg)
+                                                     (len (- js2-ts-cursor
+                                                             js2-token-beg))
+                                                     value flags)))
+  "AST node for a regular expression literal."
+  value  ; the regexp string, without // delimiters
+  flags) ; a string of flags, e.g. `mi'.
+
+(put 'cl-struct-js2-regexp-node 'js2-visitor 'js2-visit-none)
+(put 'cl-struct-js2-regexp-node 'js2-printer 'js2-print-regexp)
+
+(defun js2-print-regexp (n i)
+  (insert (js2-make-pad i)
+          "/"
+          (js2-regexp-node-value n)
+          "/")
+  (if (js2-regexp-node-flags n)
+      (insert (js2-regexp-node-flags n))))
+
+(defstruct (js2-string-node
+            (:include js2-node)
+            (:constructor nil)
+            (:constructor make-js2-string-node (&key (type js2-STRING)
+                                                     (pos js2-token-beg)
+                                                     (len (- js2-ts-cursor
+                                                             js2-token-beg))
+                                                     (value js2-ts-string))))
+  "String literal.
+Escape characters are not evaluated; e.g. \n is 2 chars in value field.
+You can tell the quote type by looking at the first character."
+  value) ; the characters of the string, including the quotes
+
+(put 'cl-struct-js2-string-node 'js2-visitor 'js2-visit-none)
+(put 'cl-struct-js2-string-node 'js2-printer 'js2-print-string-node)
+
+(defun js2-print-string-node (n i)
+  (insert (js2-make-pad i)
+          (js2-node-string n)))
+
+(defstruct (js2-array-node
+            (:include js2-node)
+            (:constructor nil)
+            (:constructor make-js2-array-node (&key (type js2-ARRAYLIT)
+                                                    (pos js2-ts-cursor)
+                                                    len elems)))
+  "AST node for an array literal."
+  elems)  ; list of expressions.  [foo,,bar] yields a nil middle element.
+
+(put 'cl-struct-js2-array-node 'js2-visitor 'js2-visit-array-node)
+(put 'cl-struct-js2-array-node 'js2-printer 'js2-print-array-node)
+
+(defun js2-visit-array-node (n v)
+  (dolist (e (js2-array-node-elems n))
+    (js2-visit-ast e v)))  ; Can be nil; e.g. [a, ,b].
+
+(defun js2-print-array-node (n i)
+  (insert (js2-make-pad i) "[")
+  (js2-print-list (js2-array-node-elems n))
+  (insert "]"))
+
+(defstruct (js2-object-node
+            (:include js2-node)
+            (:constructor nil)
+            (:constructor make-js2-object-node (&key (type js2-OBJECTLIT)
+                                                     (pos js2-ts-cursor)
+                                                     len
+                                                     elems)))
+  "AST node for an object literal expression.
+`elems' is a list of either `js2-object-prop-node' or `js2-name-node'.
+The latter represents abbreviation in destructuring expressions."
+  elems)
+
+(put 'cl-struct-js2-object-node 'js2-visitor 'js2-visit-object-node)
+(put 'cl-struct-js2-object-node 'js2-printer 'js2-print-object-node)
+
+(defun js2-visit-object-node (n v)
+  (dolist (e (js2-object-node-elems n))
+    (js2-visit-ast e v)))
+
+(defun js2-print-object-node (n i)
+  (insert (js2-make-pad i) "{")
+  (js2-print-list (js2-object-node-elems n))
+  (insert "}"))
+
+(defstruct (js2-object-prop-node
+            (:include js2-infix-node)
+            (:constructor nil)
+            (:constructor make-js2-object-prop-node (&key (type js2-COLON)
+                                                          (pos js2-ts-cursor)
+                                                          len left
+                                                          right op-pos)))
+  "AST node for an object literal prop:value entry.
+The `left' field is the property:  a name node, string node or number node.
+The `right' field is a `js2-node' representing the initializer value.")
+
+(put 'cl-struct-js2-object-prop-node 'js2-visitor 'js2-visit-infix-node)
+(put 'cl-struct-js2-object-prop-node 'js2-printer 'js2-print-object-prop-node)
+
+(defun js2-print-object-prop-node (n i)
+  (insert (js2-make-pad i))
+  (js2-print-ast (js2-object-prop-node-left n) 0)
+  (insert ": ")
+  (js2-print-ast (js2-object-prop-node-right n) 0))
+
+(defstruct (js2-getter-setter-node
+            (:include js2-infix-node)
+            (:constructor nil)
+            (:constructor make-js2-getter-setter-node (&key type ; GET or SET
+                                                            (pos js2-ts-cursor)
+                                                            len left right)))
+  "AST node for a getter/setter property in an object literal.
+The `left' field is the `js2-name-node' naming the getter/setter prop.
+The `right' field is always an anonymous `js2-function-node' with a node
+property `GETTER_SETTER' set to js2-GET or js2-SET. ")
+
+(put 'cl-struct-js2-getter-setter-node 'js2-visitor 'js2-visit-infix-node)
+(put 'cl-struct-js2-getter-setter-node 'js2-printer 'js2-print-getter-setter)
+
+(defun js2-print-getter-setter (n i)
+  (let ((pad (js2-make-pad i))
+        (left (js2-getter-setter-node-left n))
+        (right (js2-getter-setter-node-right n)))
+    (insert pad)
+    (insert (if (= (js2-node-type n) js2-GET) "get " "set "))
+    (js2-print-ast left 0)
+    (js2-print-ast right 0)))
+
+(defstruct (js2-prop-get-node
+            (:include js2-infix-node)
+            (:constructor nil)
+            (:constructor make-js2-prop-get-node (&key (type js2-GETPROP)
+                                                       (pos js2-ts-cursor)
+                                                       len left right)))
+  "AST node for a dotted property reference, e.g. foo.bar or foo().bar")
+
+(put 'cl-struct-js2-prop-get-node 'js2-visitor 'js2-visit-prop-get-node)
+(put 'cl-struct-js2-prop-get-node 'js2-printer 'js2-print-prop-get-node)
+
+(defun js2-visit-prop-get-node (n v)
+  (js2-visit-ast (js2-prop-get-node-left n) v)
+  (js2-visit-ast (js2-prop-get-node-right n) v))
+
+(defun js2-print-prop-get-node (n i)
+  (insert (js2-make-pad i))
+  (js2-print-ast (js2-prop-get-node-left n) 0)
+  (insert ".")
+  (js2-print-ast (js2-prop-get-node-right n) 0))
+
+(defstruct (js2-elem-get-node
+            (:include js2-node)
+            (:constructor nil)
+            (:constructor make-js2-elem-get-node (&key (type js2-GETELEM)
+                                                       (pos js2-ts-cursor)
+                                                       len target element
+                                                       lb rb)))
+  "AST node for an array index expression such as foo[bar]."
+  target  ; a `js2-node' - the expression preceding the "."
+  element ; a `js2-node' - the expression in brackets
+  lb      ; position of left-bracket, nil if omitted
+  rb)     ; position of right-bracket, nil if omitted
+
+(put 'cl-struct-js2-elem-get-node 'js2-visitor 'js2-visit-elem-get-node)
+(put 'cl-struct-js2-elem-get-node 'js2-printer 'js2-print-elem-get-node)
+
+(defun js2-visit-elem-get-node (n v)
+  (js2-visit-ast (js2-elem-get-node-target n) v)
+  (js2-visit-ast (js2-elem-get-node-element n) v))
+
+(defun js2-print-elem-get-node (n i)
+  (insert (js2-make-pad i))
+  (js2-print-ast (js2-elem-get-node-target n) 0)
+  (insert "[")
+  (js2-print-ast (js2-elem-get-node-element n) 0)
+  (insert "]"))
+
+(defstruct (js2-call-node
+            (:include js2-node)
+            (:constructor nil)
+            (:constructor make-js2-call-node (&key (type js2-CALL)
+                                                   (pos js2-ts-cursor)
+                                                   len target args
+                                                   lp rp)))
+  "AST node for a JavaScript function call."
+  target  ; a `js2-node' evaluating to the function to call
+  args  ; a Lisp list of `js2-node' arguments
+  lp    ; position of open-paren, or nil if missing
+  rp)   ; position of close-paren, or nil if missing
+
+(put 'cl-struct-js2-call-node 'js2-visitor 'js2-visit-call-node)
+(put 'cl-struct-js2-call-node 'js2-printer 'js2-print-call-node)
+
+(defun js2-visit-call-node (n v)
+  (js2-visit-ast (js2-call-node-target n) v)
+  (dolist (arg (js2-call-node-args n))
+    (js2-visit-ast arg v)))
+
+(defun js2-print-call-node (n i)
+  (insert (js2-make-pad i))
+  (js2-print-ast (js2-call-node-target n) 0)
+  (insert "(")
+  (js2-print-list (js2-call-node-args n))
+  (insert ")"))
+
+(defstruct (js2-yield-node
+            (:include js2-node)
+            (:constructor nil)
+            (:constructor make-js2-yield-node (&key (type js2-YIELD)
+                                                    (pos js2-ts-cursor)
+                                                    len value)))
+  "AST node for yield statement or expression."
+  value) ; optional:  value to be yielded
+
+(put 'cl-struct-js2-yield-node 'js2-visitor 'js2-visit-yield-node)
+(put 'cl-struct-js2-yield-node 'js2-printer 'js2-print-yield-node)
+
+(defun js2-visit-yield-node (n v)
+  (js2-visit-ast (js2-yield-node-value n) v))
+
+(defun js2-print-yield-node (n i)
+  (insert (js2-make-pad i))
+  (insert "yield")
+  (when (js2-yield-node-value n)
+    (insert " ")
+    (js2-print-ast (js2-yield-node-value n) 0)))
+
+(defstruct (js2-paren-node
+            (:include js2-node)
+            (:constructor nil)
+            (:constructor make-js2-paren-node (&key (type js2-LP)
+                                                    (pos js2-ts-cursor)
+                                                    len expr)))
+  "AST node for a parenthesized expression.
+In particular, used when the parens are syntactically optional,
+as opposed to required parens such as those enclosing an if-conditional."
+  expr)   ; `js2-node'
+
+(put 'cl-struct-js2-paren-node 'js2-visitor 'js2-visit-paren-node)
+(put 'cl-struct-js2-paren-node 'js2-printer 'js2-print-paren-node)
+
+(defun js2-visit-paren-node (n v)
+  (js2-visit-ast (js2-paren-node-expr n) v))
+
+(defun js2-print-paren-node (n i)
+  (insert (js2-make-pad i))
+  (insert "(")
+  (js2-print-ast (js2-paren-node-expr n) 0)
+  (insert ")"))
+
+(defstruct (js2-array-comp-node
+            (:include js2-scope)
+            (:constructor nil)
+            (:constructor make-js2-array-comp-node (&key (type js2-ARRAYCOMP)
+                                                         (pos js2-ts-cursor)
+                                                         len result
+                                                         loops filter
+                                                         if-pos lp rp)))
+  "AST node for an Array comprehension such as [[x,y] for (x in foo) for (y in bar)]."
+  result  ; result expression (just after left-bracket)
+  loops   ; a Lisp list of `js2-array-comp-loop-node'
+  filter  ; guard/filter expression
+  if-pos  ; buffer pos of 'if' keyword, if present, else nil
+  lp      ; buffer position of if-guard left-paren, or nil if not present
+  rp)     ; buffer position of if-guard right-paren, or nil if not present
+
+(put 'cl-struct-js2-array-comp-node 'js2-visitor 'js2-visit-array-comp-node)
+(put 'cl-struct-js2-array-comp-node 'js2-printer 'js2-print-array-comp-node)
+
+(defun js2-visit-array-comp-node (n v)
+  (js2-visit-ast (js2-array-comp-node-result n) v)
+  (dolist (l (js2-array-comp-node-loops n))
+    (js2-visit-ast l v))
+  (js2-visit-ast (js2-array-comp-node-filter n) v))
+
+(defun js2-print-array-comp-node (n i)
+  (let ((pad (js2-make-pad i))
+        (result (js2-array-comp-node-result n))
+        (loops (js2-array-comp-node-loops n))
+        (filter (js2-array-comp-node-filter n)))
+    (insert pad "[")
+    (js2-print-ast result 0)
+    (dolist (l loops)
+      (insert " ")
+      (js2-print-ast l 0))
+    (when filter
+      (insert " if (")
+      (js2-print-ast filter 0)
+      (insert ")"))
+    (insert "]")))
+
+(defstruct (js2-array-comp-loop-node
+            (:include js2-for-in-node)
+            (:constructor nil)
+            (:constructor make-js2-array-comp-loop-node (&key (type js2-FOR)
+                                                              (pos js2-ts-cursor)
+                                                              len iterator
+                                                              object in-pos
+                                                              foreach-p
+                                                              each-pos
+                                                              forof-p
+                                                              lp rp)))
+  "AST subtree for each 'for (foo in bar)' loop in an array comprehension.")
+
+(put 'cl-struct-js2-array-comp-loop-node 'js2-visitor 'js2-visit-array-comp-loop)
+(put 'cl-struct-js2-array-comp-loop-node 'js2-printer 'js2-print-array-comp-loop)
+
+(defun js2-visit-array-comp-loop (n v)
+  (js2-visit-ast (js2-array-comp-loop-node-iterator n) v)
+  (js2-visit-ast (js2-array-comp-loop-node-object n) v))
+
+(defun js2-print-array-comp-loop (n i)
+  (insert "for ")
+  (when (js2-array-comp-loop-node-foreach-p n) (insert "each "))
+  (insert "(")
+  (js2-print-ast (js2-array-comp-loop-node-iterator n) 0)
+  (if (js2-array-comp-loop-node-forof-p n)
+      (insert " of ")
+    (insert " in "))
+  (js2-print-ast (js2-array-comp-loop-node-object n) 0)
+  (insert ")"))
+
+(defstruct (js2-empty-expr-node
+            (:include js2-node)
+            (:constructor nil)
+            (:constructor make-js2-empty-expr-node (&key (type js2-EMPTY)
+                                                         (pos js2-token-beg)
+                                                         len)))
+  "AST node for an empty expression.")
+
+(put 'cl-struct-js2-empty-expr-node 'js2-visitor 'js2-visit-none)
+(put 'cl-struct-js2-empty-expr-node 'js2-printer 'js2-print-none)
+
+(defstruct (js2-xml-node
+            (:include js2-block-node)
+            (:constructor nil)
+            (:constructor make-js2-xml-node (&key (type js2-XML)
+                                                  (pos js2-token-beg)
+                                                  len kids)))
+  "AST node for initial parse of E4X literals.
+The kids field is a list of XML fragments, each a `js2-string-node' or
+a `js2-xml-js-expr-node'.  Equivalent to Rhino's XmlLiteral node.")
+
+(put 'cl-struct-js2-xml-node 'js2-visitor 'js2-visit-block)
+(put 'cl-struct-js2-xml-node 'js2-printer 'js2-print-xml-node)
+
+(defun js2-print-xml-node (n i)
+  (dolist (kid (js2-xml-node-kids n))
+    (js2-print-ast kid i)))
+
+(defstruct (js2-xml-js-expr-node
+            (:include js2-xml-node)
+            (:constructor nil)
+            (:constructor make-js2-xml-js-expr-node (&key (type js2-XML)
+                                                          (pos js2-ts-cursor)
+                                                          len expr)))
+  "AST node for an embedded JavaScript {expression} in an E4X literal.
+The start and end fields correspond to the curly-braces."
+  expr)  ; a `js2-expr-node' of some sort
+
+(put 'cl-struct-js2-xml-js-expr-node 'js2-visitor 'js2-visit-xml-js-expr)
+(put 'cl-struct-js2-xml-js-expr-node 'js2-printer 'js2-print-xml-js-expr)
+
+(defun js2-visit-xml-js-expr (n v)
+  (js2-visit-ast (js2-xml-js-expr-node-expr n) v))
+
+(defun js2-print-xml-js-expr (n i)
+  (insert (js2-make-pad i))
+  (insert "{")
+  (js2-print-ast (js2-xml-js-expr-node-expr n) 0)
+  (insert "}"))
+
+(defstruct (js2-xml-dot-query-node
+            (:include js2-infix-node)
+            (:constructor nil)
+            (:constructor make-js2-xml-dot-query-node (&key (type js2-DOTQUERY)
+                                                            (pos js2-ts-cursor)
+                                                            op-pos len left
+                                                            right rp)))
+  "AST node for an E4X foo.(bar) filter expression.
+Note that the left-paren is automatically the character immediately
+following the dot (.) in the operator.  No whitespace is permitted
+between the dot and the lp by the scanner."
+  rp)
+
+(put 'cl-struct-js2-xml-dot-query-node 'js2-visitor 'js2-visit-infix-node)
+(put 'cl-struct-js2-xml-dot-query-node 'js2-printer 'js2-print-xml-dot-query)
+
+(defun js2-print-xml-dot-query (n i)
+  (insert (js2-make-pad i))
+  (js2-print-ast (js2-xml-dot-query-node-left n) 0)
+  (insert ".(")
+  (js2-print-ast (js2-xml-dot-query-node-right n) 0)
+  (insert ")"))
+
+(defstruct (js2-xml-ref-node
+            (:include js2-node)
+            (:constructor nil))  ; abstract
+  "Base type for E4X XML attribute-access or property-get expressions.
+Such expressions can take a variety of forms.  The general syntax has
+three parts:
+
+  - (optional) an @ (specifying an attribute access)
+  - (optional) a namespace (a `js2-name-node') and double-colon
+  - (required) either a `js2-name-node' or a bracketed [expression]
+
+The property-name expressions (examples:  ns::name, @name) are
+represented as `js2-xml-prop-ref' nodes.  The bracketed-expression
+versions (examples:  ns::[name], @[name]) become `js2-xml-elem-ref' nodes.
+
+This node type (or more specifically, its subclasses) will sometimes
+be the right-hand child of a `js2-prop-get-node' or a
+`js2-infix-node' of type `js2-DOTDOT', the .. xml-descendants operator.
+The `js2-xml-ref-node' may also be a standalone primary expression with
+no explicit target, which is valid in certain expression contexts such as
+
+  company..employee.(@id < 100)
+
+in this case, the @id is a `js2-xml-ref' that is part of an infix '<'
+expression whose parent is a `js2-xml-dot-query-node'."
+  namespace
+  at-pos
+  colon-pos)
+
+(defsubst js2-xml-ref-node-attr-access-p (node)
+  "Return non-nil if this expression began with an @-token."
+  (and (numberp (js2-xml-ref-node-at-pos node))
+       (plusp (js2-xml-ref-node-at-pos node))))
+
+(defstruct (js2-xml-prop-ref-node
+            (:include js2-xml-ref-node)
+            (:constructor nil)
+            (:constructor make-js2-xml-prop-ref-node (&key (type js2-REF_NAME)
+                                                           (pos js2-token-beg)
+                                                           len propname
+                                                           namespace at-pos
+                                                           colon-pos)))
+  "AST node for an E4X XML [expr] property-ref expression.
+The JavaScript syntax is an optional @, an optional ns::, and a name.
+
+  [ '@' ] [ name '::' ] name
+
+Examples include name, ns::name, ns::*, *::name, *::*, @attr, @ns::attr,
+@ns::*, @*::attr, @*::*, and @*.
+
+The node starts at the @ token, if present.  Otherwise it starts at the
+namespace name.  The node bounds extend through the closing right-bracket,
+or if it is missing due to a syntax error, through the end of the index
+expression."
+  propname)
+
+(put 'cl-struct-js2-xml-prop-ref-node 'js2-visitor 'js2-visit-xml-prop-ref-node)
+(put 'cl-struct-js2-xml-prop-ref-node 'js2-printer 'js2-print-xml-prop-ref-node)
+
+(defun js2-visit-xml-prop-ref-node (n v)
+  (js2-visit-ast (js2-xml-prop-ref-node-namespace n) v)
+  (js2-visit-ast (js2-xml-prop-ref-node-propname n) v))
+
+(defun js2-print-xml-prop-ref-node (n i)
+  (insert (js2-make-pad i))
+  (if (js2-xml-ref-node-attr-access-p n)
+      (insert "@"))
+  (when (js2-xml-prop-ref-node-namespace n)
+    (js2-print-ast (js2-xml-prop-ref-node-namespace n) 0)
+    (insert "::"))
+  (if (js2-xml-prop-ref-node-propname n)
+      (js2-print-ast (js2-xml-prop-ref-node-propname n) 0)))
+
+(defstruct (js2-xml-elem-ref-node
+            (:include js2-xml-ref-node)
+            (:constructor nil)
+            (:constructor make-js2-xml-elem-ref-node (&key (type js2-REF_MEMBER)
+                                                           (pos js2-token-beg)
+                                                           len expr lb rb
+                                                           namespace at-pos
+                                                           colon-pos)))
+  "AST node for an E4X XML [expr] member-ref expression.
+Syntax:
+
+ [ '@' ] [ name '::' ] '[' expr ']'
+
+Examples include ns::[expr], @ns::[expr], @[expr], *::[expr] and @*::[expr].
+
+Note that the form [expr] (i.e. no namespace or attribute-qualifier)
+is not a legal E4X XML element-ref expression, since it's already used
+for standard JavaScript element-get array indexing.  Hence, a
+`js2-xml-elem-ref-node' always has either the attribute-qualifier, a
+non-nil namespace node, or both.
+
+The node starts at the @ token, if present.  Otherwise it starts
+at the namespace name.  The node bounds extend through the closing
+right-bracket, or if it is missing due to a syntax error, through the
+end of the index expression."
+  expr  ; the bracketed index expression
+  lb
+  rb)
+
+(put 'cl-struct-js2-xml-elem-ref-node 'js2-visitor 'js2-visit-xml-elem-ref-node)
+(put 'cl-struct-js2-xml-elem-ref-node 'js2-printer 'js2-print-xml-elem-ref-node)
+
+(defun js2-visit-xml-elem-ref-node (n v)
+  (js2-visit-ast (js2-xml-elem-ref-node-namespace n) v)
+  (js2-visit-ast (js2-xml-elem-ref-node-expr n) v))
+
+(defun js2-print-xml-elem-ref-node (n i)
+  (insert (js2-make-pad i))
+  (if (js2-xml-ref-node-attr-access-p n)
+      (insert "@"))
+  (when (js2-xml-elem-ref-node-namespace n)
+    (js2-print-ast (js2-xml-elem-ref-node-namespace n) 0)
+    (insert "::"))
+  (insert "[")
+  (if (js2-xml-elem-ref-node-expr n)
+      (js2-print-ast (js2-xml-elem-ref-node-expr n) 0))
+  (insert "]"))
+
+;;; Placeholder nodes for when we try parsing the XML literals structurally.
+
+(defstruct (js2-xml-start-tag-node
+            (:include js2-xml-node)
+            (:constructor nil)
+            (:constructor make-js2-xml-start-tag-node (&key (type js2-XML)
+                                                            (pos js2-ts-cursor)
+                                                            len name attrs kids
+                                                            empty-p)))
+  "AST node for an XML start-tag.  Not currently used.
+The `kids' field is a Lisp list of child content nodes."
+  name      ; a `js2-xml-name-node'
+  attrs     ; a Lisp list of `js2-xml-attr-node'
+  empty-p)  ; t if this is an empty element such as <foo bar="baz"/>
+
+(put 'cl-struct-js2-xml-start-tag-node 'js2-visitor 'js2-visit-xml-start-tag)
+(put 'cl-struct-js2-xml-start-tag-node 'js2-printer 'js2-print-xml-start-tag)
+
+(defun js2-visit-xml-start-tag (n v)
+  (js2-visit-ast (js2-xml-start-tag-node-name n) v)
+  (dolist (attr (js2-xml-start-tag-node-attrs n))
+    (js2-visit-ast attr v))
+  (js2-visit-block n v))
+
+(defun js2-print-xml-start-tag (n i)
+  (insert (js2-make-pad i) "<")
+  (js2-print-ast (js2-xml-start-tag-node-name n) 0)
+  (when (js2-xml-start-tag-node-attrs n)
+    (insert " ")
+    (js2-print-list (js2-xml-start-tag-node-attrs n) " "))
+  (insert ">"))
+
+;; I -think- I'm going to make the parent node the corresponding start-tag,
+;; and add the end-tag to the kids list of the parent as well.
+(defstruct (js2-xml-end-tag-node
+            (:include js2-xml-node)
+            (:constructor nil)
+            (:constructor make-js2-xml-end-tag-node (&key (type js2-XML)
+                                                          (pos js2-ts-cursor)
+                                                          len name)))
+  "AST node for an XML end-tag.  Not currently used."
+  name)  ; a `js2-xml-name-node'
+
+(put 'cl-struct-js2-xml-end-tag-node 'js2-visitor 'js2-visit-xml-end-tag)
+(put 'cl-struct-js2-xml-end-tag-node 'js2-printer 'js2-print-xml-end-tag)
+
+(defun js2-visit-xml-end-tag (n v)
+  (js2-visit-ast (js2-xml-end-tag-node-name n) v))
+
+(defun js2-print-xml-end-tag (n i)
+  (insert (js2-make-pad i))
+  (insert "</")
+  (js2-print-ast (js2-xml-end-tag-node-name n) 0)
+  (insert ">"))
+
+(defstruct (js2-xml-name-node
+            (:include js2-xml-node)
+            (:constructor nil)
+            (:constructor make-js2-xml-name-node (&key (type js2-XML)
+                                                       (pos js2-ts-cursor)
+                                                       len namespace kids)))
+  "AST node for an E4X XML name.  Not currently used.
+Any XML name can be qualified with a namespace, hence the namespace field.
+Further, any E4X name can be comprised of arbitrary JavaScript {} expressions.
+The kids field is a list of `js2-name-node' and `js2-xml-js-expr-node'.
+For a simple name, the kids list has exactly one node, a `js2-name-node'."
+  namespace)  ; a `js2-string-node'
+
+(put 'cl-struct-js2-xml-name-node 'js2-visitor 'js2-visit-xml-name-node)
+(put 'cl-struct-js2-xml-name-node 'js2-printer 'js2-print-xml-name-node)
+
+(defun js2-visit-xml-name-node (n v)
+  (js2-visit-ast (js2-xml-name-node-namespace n) v))
+
+(defun js2-print-xml-name-node (n i)
+  (insert (js2-make-pad i))
+  (when (js2-xml-name-node-namespace n)
+    (js2-print-ast (js2-xml-name-node-namespace n) 0)
+    (insert "::"))
+  (dolist (kid (js2-xml-name-node-kids n))
+    (js2-print-ast kid 0)))
+
+(defstruct (js2-xml-pi-node
+            (:include js2-xml-node)
+            (:constructor nil)
+            (:constructor make-js2-xml-pi-node (&key (type js2-XML)
+                                                     (pos js2-ts-cursor)
+                                                     len name attrs)))
+  "AST node for an E4X XML processing instruction.  Not currently used."
+  name   ; a `js2-xml-name-node'
+  attrs) ; a list of `js2-xml-attr-node'
+
+(put 'cl-struct-js2-xml-pi-node 'js2-visitor 'js2-visit-xml-pi-node)
+(put 'cl-struct-js2-xml-pi-node 'js2-printer 'js2-print-xml-pi-node)
+
+(defun js2-visit-xml-pi-node (n v)
+  (js2-visit-ast (js2-xml-pi-node-name n) v)
+  (dolist (attr (js2-xml-pi-node-attrs n))
+    (js2-visit-ast attr v)))
+
+(defun js2-print-xml-pi-node (n i)
+  (insert (js2-make-pad i) "<?")
+  (js2-print-ast (js2-xml-pi-node-name n))
+  (when (js2-xml-pi-node-attrs n)
+    (insert " ")
+    (js2-print-list (js2-xml-pi-node-attrs n)))
+  (insert "?>"))
+
+(defstruct (js2-xml-cdata-node
+            (:include js2-xml-node)
+            (:constructor nil)
+            (:constructor make-js2-xml-cdata-node (&key (type js2-XML)
+                                                        (pos js2-ts-cursor)
+                                                        len content)))
+  "AST node for a CDATA escape section.  Not currently used."
+  content)  ; a `js2-string-node' with node-property 'quote-type 'cdata
+
+(put 'cl-struct-js2-xml-cdata-node 'js2-visitor 'js2-visit-xml-cdata-node)
+(put 'cl-struct-js2-xml-cdata-node 'js2-printer 'js2-print-xml-cdata-node)
+
+(defun js2-visit-xml-cdata-node (n v)
+  (js2-visit-ast (js2-xml-cdata-node-content n) v))
+
+(defun js2-print-xml-cdata-node (n i)
+  (insert (js2-make-pad i))
+  (js2-print-ast (js2-xml-cdata-node-content n)))
+
+(defstruct (js2-xml-attr-node
+            (:include js2-xml-node)
+            (:constructor nil)
+            (:constructor make-js2-attr-node (&key (type js2-XML)
+                                                   (pos js2-ts-cursor)
+                                                   len name value
+                                                   eq-pos quote-type)))
+  "AST node representing a foo='bar' XML attribute value.  Not yet used."
+  name   ; a `js2-xml-name-node'
+  value  ; a `js2-xml-name-node'
+  eq-pos ; buffer position of "=" sign
+  quote-type) ; 'single or 'double
+
+(put 'cl-struct-js2-xml-attr-node 'js2-visitor 'js2-visit-xml-attr-node)
+(put 'cl-struct-js2-xml-attr-node 'js2-printer 'js2-print-xml-attr-node)
+
+(defun js2-visit-xml-attr-node (n v)
+  (js2-visit-ast (js2-xml-attr-node-name n) v)
+  (js2-visit-ast (js2-xml-attr-node-value n) v))
+
+(defun js2-print-xml-attr-node (n i)
+  (let ((quote (if (eq (js2-xml-attr-node-quote-type n) 'single)
+                   "'"
+                 "\"")))
+    (insert (js2-make-pad i))
+    (js2-print-ast (js2-xml-attr-node-name n) 0)
+    (insert "=" quote)
+    (js2-print-ast (js2-xml-attr-node-value n) 0)
+    (insert quote)))
+
+(defstruct (js2-xml-text-node
+            (:include js2-xml-node)
+            (:constructor nil)
+            (:constructor make-js2-text-node (&key (type js2-XML)
+                                                   (pos js2-ts-cursor)
+                                                   len content)))
+  "AST node for an E4X XML text node.  Not currently used."
+  content)  ; a Lisp list of `js2-string-node' and `js2-xml-js-expr-node'
+
+(put 'cl-struct-js2-xml-text-node 'js2-visitor 'js2-visit-xml-text-node)
+(put 'cl-struct-js2-xml-text-node 'js2-printer 'js2-print-xml-text-node)
+
+(defun js2-visit-xml-text-node (n v)
+  (js2-visit-ast (js2-xml-text-node-content n) v))
+
+(defun js2-print-xml-text-node (n i)
+  (insert (js2-make-pad i))
+  (dolist (kid (js2-xml-text-node-content n))
+    (js2-print-ast kid)))
+
+(defstruct (js2-xml-comment-node
+            (:include js2-xml-node)
+            (:constructor nil)
+            (:constructor make-js2-xml-comment-node (&key (type js2-XML)
+                                                          (pos js2-ts-cursor)
+                                                          len)))
+  "AST node for E4X XML comment.  Not currently used.")
+
+(put 'cl-struct-js2-xml-comment-node 'js2-visitor 'js2-visit-none)
+(put 'cl-struct-js2-xml-comment-node 'js2-printer 'js2-print-xml-comment)
+
+(defun js2-print-xml-comment (n i)
+  (insert (js2-make-pad i)
+          (js2-node-string n)))
+
+;;; Node utilities
+
+(defsubst js2-node-line (n)
+  "Fetch the source line number at the start of node N.
+This is O(n) in the length of the source buffer; use prudently."
+  (1+ (count-lines (point-min) (js2-node-abs-pos n))))
+
+(defsubst js2-block-node-kid (n i)
+  "Return child I of node N, or nil if there aren't that many."
+  (nth i (js2-block-node-kids n)))
+
+(defsubst js2-block-node-first (n)
+  "Return first child of block node N, or nil if there is none."
+  (first (js2-block-node-kids n)))
+
+(defun js2-node-root (n)
+  "Return the root of the AST containing N.
+If N has no parent pointer, returns N."
+  (let ((parent (js2-node-parent n)))
+    (if parent
+        (js2-node-root parent)
+      n)))
+
+(defsubst js2-node-short-name (n)
+  "Return the short name of node N as a string, e.g. `js2-if-node'."
+  (substring (symbol-name (aref n 0))
+             (length "cl-struct-")))
+
+(defun js2-node-child-list (node)
+  "Return the child list for NODE, a Lisp list of nodes.
+Works for block nodes, array nodes, obj literals, funarg lists,
+var decls and try nodes (for catch clauses).  Note that you should call
+`js2-block-node-kids' on the function body for the body statements.
+Returns nil for zero-length child lists or unsupported nodes."
+  (cond
+   ((js2-function-node-p node)
+    (js2-function-node-params node))
+   ((js2-block-node-p node)
+    (js2-block-node-kids node))
+   ((js2-try-node-p node)
+    (js2-try-node-catch-clauses node))
+   ((js2-array-node-p node)
+    (js2-array-node-elems node))
+   ((js2-object-node-p node)
+    (js2-object-node-elems node))
+   ((js2-call-node-p node)
+    (js2-call-node-args node))
+   ((js2-new-node-p node)
+    (js2-new-node-args node))
+   ((js2-var-decl-node-p node)
+    (js2-var-decl-node-kids node))
+   (t
+    nil)))
+
+(defun js2-node-set-child-list (node kids)
+  "Set the child list for NODE to KIDS."
+   (cond
+    ((js2-function-node-p node)
+     (setf (js2-function-node-params node) kids))
+    ((js2-block-node-p node)
+     (setf (js2-block-node-kids node) kids))
+    ((js2-try-node-p node)
+     (setf (js2-try-node-catch-clauses node) kids))
+    ((js2-array-node-p node)
+     (setf (js2-array-node-elems node) kids))
+    ((js2-object-node-p node)
+     (setf (js2-object-node-elems node) kids))
+    ((js2-call-node-p node)
+     (setf (js2-call-node-args node) kids))
+    ((js2-new-node-p node)
+     (setf (js2-new-node-args node) kids))
+    ((js2-var-decl-node-p node)
+     (setf (js2-var-decl-node-kids node) kids))
+    (t
+     (error "Unsupported node type: %s" (js2-node-short-name node))))
+   kids)
+
+;; All because Common Lisp doesn't support multiple inheritance for defstructs.
+(defconst js2-paren-expr-nodes
+  '(cl-struct-js2-array-comp-loop-node
+    cl-struct-js2-array-comp-node
+    cl-struct-js2-call-node
+    cl-struct-js2-catch-node
+    cl-struct-js2-do-node
+    cl-struct-js2-elem-get-node
+    cl-struct-js2-for-in-node
+    cl-struct-js2-for-node
+    cl-struct-js2-function-node
+    cl-struct-js2-if-node
+    cl-struct-js2-let-node
+    cl-struct-js2-new-node
+    cl-struct-js2-paren-node
+    cl-struct-js2-switch-node
+    cl-struct-js2-while-node
+    cl-struct-js2-with-node
+    cl-struct-js2-xml-dot-query-node)
+  "Node types that can have a parenthesized child expression.
+In particular, nodes that respond to `js2-node-lp' and `js2-node-rp'.")
+
+(defsubst js2-paren-expr-node-p (node)
+  "Return t for nodes that typically have a parenthesized child expression.
+Useful for computing the indentation anchors for arg-lists and conditions.
+Note that it may return a false positive, for instance when NODE is
+a `js2-new-node' and there are no arguments or parentheses."
+  (memq (aref node 0) js2-paren-expr-nodes))
+
+;; Fake polymorphism... yech.
+(defun js2-node-lp (node)
+  "Return relative left-paren position for NODE, if applicable.
+For `js2-elem-get-node' structs, returns left-bracket position.
+Note that the position may be nil in the case of a parse error."
+  (cond
+   ((js2-elem-get-node-p node)
+    (js2-elem-get-node-lb node))
+   ((js2-loop-node-p node)
+    (js2-loop-node-lp node))
+   ((js2-function-node-p node)
+    (js2-function-node-lp node))
+   ((js2-if-node-p node)
+    (js2-if-node-lp node))
+   ((js2-new-node-p node)
+    (js2-new-node-lp node))
+   ((js2-call-node-p node)
+    (js2-call-node-lp node))
+   ((js2-paren-node-p node)
+    0)
+   ((js2-switch-node-p node)
+    (js2-switch-node-lp node))
+   ((js2-catch-node-p node)
+    (js2-catch-node-lp node))
+   ((js2-let-node-p node)
+    (js2-let-node-lp node))
+   ((js2-array-comp-node-p node)
+    (js2-array-comp-node-lp node))
+   ((js2-with-node-p node)
+    (js2-with-node-lp node))
+   ((js2-xml-dot-query-node-p node)
+    (1+ (js2-infix-node-op-pos node)))
+   (t
+    (error "Unsupported node type: %s" (js2-node-short-name node)))))
+
+;; Fake polymorphism... blech.
+(defun js2-node-rp (node)
+  "Return relative right-paren position for NODE, if applicable.
+For `js2-elem-get-node' structs, returns right-bracket position.
+Note that the position may be nil in the case of a parse error."
+  (cond
+   ((js2-elem-get-node-p node)
+    (js2-elem-get-node-rb node))
+   ((js2-loop-node-p node)
+    (js2-loop-node-rp node))
+   ((js2-function-node-p node)
+    (js2-function-node-rp node))
+   ((js2-if-node-p node)
+    (js2-if-node-rp node))
+   ((js2-new-node-p node)
+    (js2-new-node-rp node))
+   ((js2-call-node-p node)
+    (js2-call-node-rp node))
+   ((js2-paren-node-p node)
+    (1- (js2-node-len node)))
+   ((js2-switch-node-p node)
+    (js2-switch-node-rp node))
+   ((js2-catch-node-p node)
+    (js2-catch-node-rp node))
+   ((js2-let-node-p node)
+    (js2-let-node-rp node))
+   ((js2-array-comp-node-p node)
+    (js2-array-comp-node-rp node))
+   ((js2-with-node-p node)
+    (js2-with-node-rp node))
+   ((js2-xml-dot-query-node-p node)
+    (1+ (js2-xml-dot-query-node-rp node)))
+   (t
+    (error "Unsupported node type: %s" (js2-node-short-name node)))))
+
+(defsubst js2-node-first-child (node)
+  "Return the first element of `js2-node-child-list' for NODE."
+  (car (js2-node-child-list node)))
+
+(defsubst js2-node-last-child (node)
+  "Return the last element of `js2-node-last-child' for NODE."
+  (car (last (js2-node-child-list node))))
+
+(defun js2-node-prev-sibling (node)
+  "Return the previous statement in parent.
+Works for parents supported by `js2-node-child-list'.
+Returns nil if NODE is not in the parent, or PARENT is
+not a supported node, or if NODE is the first child."
+  (let* ((p (js2-node-parent node))
+         (kids (js2-node-child-list p))
+         (sib (car kids)))
+    (while (and kids
+                (not (eq node (cadr kids))))
+      (setq kids (cdr kids)
+            sib (car kids)))
+    sib))
+
+(defun js2-node-next-sibling (node)
+  "Return the next statement in parent block.
+Returns nil if NODE is not in the block, or PARENT is not
+a block node, or if NODE is the last statement."
+  (let* ((p (js2-node-parent node))
+         (kids (js2-node-child-list p)))
+    (while (and kids
+                (not (eq node (car kids))))
+      (setq kids (cdr kids)))
+    (cadr kids)))
+
+(defun js2-node-find-child-before (pos parent &optional after)
+  "Find the last child that starts before POS in parent.
+If AFTER is non-nil, returns first child starting after POS.
+POS is an absolute buffer position.  PARENT is any node
+supported by `js2-node-child-list'.
+Returns nil if no applicable child is found."
+  (let ((kids (if (js2-function-node-p parent)
+                  (js2-block-node-kids (js2-function-node-body parent))
+                (js2-node-child-list parent)))
+        (beg (if (js2-function-node-p parent)
+                 (js2-node-abs-pos (js2-function-node-body parent))
+               (js2-node-abs-pos parent)))
+        kid result fn
+        (continue t))
+    (setq fn (if after '>= '<))
+    (while (and kids continue)
+      (setq kid (car kids))
+      (if (funcall fn (+ beg (js2-node-pos kid)) pos)
+          (setq result kid
+                continue (if after nil t))
+        (setq continue (if after t nil)))
+      (setq kids (cdr kids)))
+    result))
+
+(defun js2-node-find-child-after (pos parent)
+  "Find first child that starts after POS in parent.
+POS is an absolute buffer position.  PARENT is any node
+supported by `js2-node-child-list'.
+Returns nil if no applicable child is found."
+  (js2-node-find-child-before pos parent 'after))
+
+(defun js2-node-replace-child (pos parent new-node)
+  "Replace node at index POS in PARENT with NEW-NODE.
+Only works for parents supported by `js2-node-child-list'."
+  (let ((kids (js2-node-child-list parent))
+        (i 0))
+    (while (< i pos)
+      (setq kids (cdr kids)
+            i (1+ i)))
+    (setcar kids new-node)
+    (js2-node-add-children parent new-node)))
+
+(defun js2-node-buffer (n)
+  "Return the buffer associated with AST N.
+Returns nil if the buffer is not set as a property on the root
+node, or if parent links were not recorded during parsing."
+  (let ((root (js2-node-root n)))
+    (and root
+         (js2-ast-root-p root)
+         (js2-ast-root-buffer root))))
+
+(defun js2-block-node-push (n kid)
+  "Push js2-node KID onto the end of js2-block-node N's child list.
+KID is always added to the -end- of the kids list.
+Function also calls `js2-node-add-children' to add the parent link."
+  (let ((kids (js2-node-child-list n)))
+    (if kids
+        (setcdr kids (nconc (cdr kids) (list kid)))
+      (js2-node-set-child-list n (list kid)))
+    (js2-node-add-children n kid)))
+
+(defun js2-node-string (node)
+  (with-current-buffer (or (js2-node-buffer node)
+                           (error "No buffer available for node %s" node))
+    (let ((pos (js2-node-abs-pos node)))
+      (buffer-substring-no-properties pos (+ pos (js2-node-len node))))))
+
+;; Container for storing the node we're looking for in a traversal.
+(js2-deflocal js2-discovered-node nil)
+
+;; Keep track of absolute node position during traversals.
+(js2-deflocal js2-visitor-offset nil)
+
+(js2-deflocal js2-node-search-point nil)
+
+(when js2-mode-dev-mode-p
+  (defun js2-find-node-at-point ()
+    (interactive)
+    (let ((node (js2-node-at-point)))
+      (message "%s" (or node "No node found at point"))))
+  (defun js2-node-name-at-point ()
+    (interactive)
+    (let ((node (js2-node-at-point)))
+      (message "%s" (if node
+                        (js2-node-short-name node)
+                      "No node found at point.")))))
+
+(defun js2-node-at-point (&optional pos skip-comments)
+  "Return AST node at POS, a buffer position, defaulting to current point.
+The `js2-mode-ast' variable must be set to the current parse tree.
+Signals an error if the AST (`js2-mode-ast') is nil.
+Always returns a node - if it can't find one, it returns the root.
+If SKIP-COMMENTS is non-nil, comment nodes are ignored."
+  (let ((ast js2-mode-ast)
+        result)
+    (unless ast
+      (error "No JavaScript AST available"))
+    ;; Look through comments first, since they may be inside nodes that
+    ;; would otherwise report a match.
+    (setq pos (or pos (point))
+          result (if (> pos (js2-node-abs-end ast))
+                     ast
+                   (if (not skip-comments)
+                       (js2-comment-at-point pos))))
+    (unless result
+      (setq js2-discovered-node nil
+            js2-visitor-offset 0
+            js2-node-search-point pos)
+      (unwind-protect
+          (catch 'js2-visit-done
+            (js2-visit-ast ast #'js2-node-at-point-visitor))
+        (setq js2-visitor-offset nil
+              js2-node-search-point nil))
+      (setq result js2-discovered-node))
+    ;; may have found a comment beyond end of last child node,
+    ;; since visiting the ast-root looks at the comment-list last.
+    (if (and skip-comments
+             (js2-comment-node-p result))
+        (setq result nil))
+    (or result js2-mode-ast)))
+
+(defun js2-node-at-point-visitor (node end-p)
+  (let ((rel-pos (js2-node-pos node))
+        abs-pos
+        abs-end
+        (point js2-node-search-point))
+    (cond
+     (end-p
+      ;; this evaluates to a non-nil return value, even if it's zero
+      (decf js2-visitor-offset rel-pos))
+     ;; we already looked for comments before visiting, and don't want them now
+     ((js2-comment-node-p node)
+      nil)
+     (t
+      (setq abs-pos (incf js2-visitor-offset rel-pos)
+            ;; we only want to use the node if the point is before
+            ;; the last character position in the node, so we decrement
+            ;; the absolute end by 1.
+            abs-end (+ abs-pos (js2-node-len node) -1))
+      (cond
+       ;; If this node starts after search-point, stop the search.
+       ((> abs-pos point)
+        (throw 'js2-visit-done nil))
+       ;; If this node ends before the search-point, don't check kids.
+       ((> point abs-end)
+        nil)
+       (t
+        ;; Otherwise point is within this node, possibly in a child.
+        (setq js2-discovered-node node)
+        t))))))  ; keep processing kids to look for more specific match
+
+(defsubst js2-block-comment-p (node)
+  "Return non-nil if NODE is a comment node of format `jsdoc' or `block'."
+  (and (js2-comment-node-p node)
+       (memq (js2-comment-node-format node) '(jsdoc block))))
+
+;; TODO:  put the comments in a vector and binary-search them instead
+(defun js2-comment-at-point (&optional pos)
+  "Look through scanned comment nodes for one containing POS.
+POS is a buffer position that defaults to current point.
+Function returns nil if POS was not in any comment node."
+  (let ((ast js2-mode-ast)
+        (x (or pos (point)))
+        beg end)
+    (unless ast
+      (error "No JavaScript AST available"))
+    (catch 'done
+      ;; Comments are stored in lexical order.
+      (dolist (comment (js2-ast-root-comments ast) nil)
+        (setq beg (js2-node-abs-pos comment)
+              end (+ beg (js2-node-len comment)))
+        (if (and (>= x beg)
+                 (<= x end))
+            (throw 'done comment))))))
+
+(defun js2-mode-find-parent-fn (node)
+  "Find function enclosing NODE.
+Returns nil if NODE is not inside a function."
+  (setq node (js2-node-parent node))
+  (while (and node (not (js2-function-node-p node)))
+    (setq node (js2-node-parent node)))
+  (and (js2-function-node-p node) node))
+
+(defun js2-mode-find-enclosing-fn (node)
+  "Find function or root enclosing NODE."
+  (if (js2-ast-root-p node)
+      node
+    (setq node (js2-node-parent node))
+    (while (not (or (js2-ast-root-p node)
+                    (js2-function-node-p node)))
+      (setq node (js2-node-parent node)))
+    node))
+
+(defun js2-mode-find-enclosing-node (beg end)
+  "Find script or function fully enclosing BEG and END."
+  (let ((node (js2-node-at-point beg))
+        pos
+        (continue t))
+    (while continue
+      (if (or (js2-ast-root-p node)
+              (and (js2-function-node-p node)
+                   (<= (setq pos (js2-node-abs-pos node)) beg)
+                   (>= (+ pos (js2-node-len node)) end)))
+          (setq continue nil)
+        (setq node (js2-node-parent node))))
+    node))
+
+(defun js2-node-parent-script-or-fn (node)
+  "Find script or function immediately enclosing NODE.
+If NODE is the ast-root, returns nil."
+  (if (js2-ast-root-p node)
+      nil
+    (setq node (js2-node-parent node))
+    (while (and node (not (or (js2-function-node-p node)
+                              (js2-script-node-p node))))
+      (setq node (js2-node-parent node)))
+    node))
+
+(defun js2-node-is-descendant (node ancestor)
+  "Return t if NODE is a descendant of ANCESTOR."
+  (while (and node
+              (not (eq node ancestor)))
+    (setq node (js2-node-parent node)))
+  node)
+
+;;; visitor infrastructure
+
+(defun js2-visit-none (node callback)
+  "Visitor for AST node that have no node children."
+  nil)
+
+(defun js2-print-none (node indent)
+  "Visitor for AST node with no printed representation.")
+
+(defun js2-print-body (node indent)
+  "Print a statement, or a block without braces."
+  (if (js2-block-node-p node)
+      (dolist (kid (js2-block-node-kids node))
+        (js2-print-ast kid indent))
+    (js2-print-ast node indent)))
+
+(defun js2-print-list (args &optional delimiter)
+  (loop with len = (length args)
+        for arg in args
+        for count from 1
+        do
+        (when arg (js2-print-ast arg 0))
+        (if (< count len)
+            (insert (or delimiter ", ")))))
+
+(defun js2-print-tree (ast)
+  "Prints an AST to the current buffer.
+Makes `js2-ast-parent-nodes' available to the printer functions."
+  (let ((max-lisp-eval-depth (max max-lisp-eval-depth 1500)))
+    (js2-print-ast ast)))
+
+(defun js2-print-ast (node &optional indent)
+  "Helper function for printing AST nodes.
+Requires `js2-ast-parent-nodes' to be non-nil.
+You should use `js2-print-tree' instead of this function."
+  (let ((printer (get (aref node 0) 'js2-printer))
+        (i (or indent 0))
+        (pos (js2-node-abs-pos node)))
+    ;; TODO:  wedge comments in here somewhere
+    (if printer
+        (funcall printer node i))))
+
+(defconst js2-side-effecting-tokens
+  (let ((tokens (make-bool-vector js2-num-tokens nil)))
+    (dolist (tt (list js2-ASSIGN
+                      js2-ASSIGN_ADD
+                      js2-ASSIGN_BITAND
+                      js2-ASSIGN_BITOR
+                      js2-ASSIGN_BITXOR
+                      js2-ASSIGN_DIV
+                      js2-ASSIGN_LSH
+                      js2-ASSIGN_MOD
+                      js2-ASSIGN_MUL
+                      js2-ASSIGN_RSH
+                      js2-ASSIGN_SUB
+                      js2-ASSIGN_URSH
+                      js2-BLOCK
+                      js2-BREAK
+                      js2-CALL
+                      js2-CATCH
+                      js2-CATCH_SCOPE
+                      js2-CONST
+                      js2-CONTINUE
+                      js2-DEBUGGER
+                      js2-DEC
+                      js2-DELPROP
+                      js2-DEL_REF
+                      js2-DO
+                      js2-ELSE
+                      js2-EMPTY
+                      js2-ENTERWITH
+                      js2-EXPORT
+                      js2-EXPR_RESULT
+                      js2-FINALLY
+                      js2-FOR
+                      js2-FUNCTION
+                      js2-GOTO
+                      js2-IF
+                      js2-IFEQ
+                      js2-IFNE
+                      js2-IMPORT
+                      js2-INC
+                      js2-JSR
+                      js2-LABEL
+                      js2-LEAVEWITH
+                      js2-LET
+                      js2-LETEXPR
+                      js2-LOCAL_BLOCK
+                      js2-LOOP
+                      js2-NEW
+                      js2-REF_CALL
+                      js2-RETHROW
+                      js2-RETURN
+                      js2-RETURN_RESULT
+                      js2-SEMI
+                      js2-SETELEM
+                      js2-SETELEM_OP
+                      js2-SETNAME
+                      js2-SETPROP
+                      js2-SETPROP_OP
+                      js2-SETVAR
+                      js2-SET_REF
+                      js2-SET_REF_OP
+                      js2-SWITCH
+                      js2-TARGET
+                      js2-THROW
+                      js2-TRY
+                      js2-VAR
+                      js2-WHILE
+                      js2-WITH
+                      js2-WITHEXPR
+                      js2-YIELD))
+      (aset tokens tt t))
+    (if js2-instanceof-has-side-effects
+        (aset tokens js2-INSTANCEOF t))
+    tokens))
+
+(defun js2-node-has-side-effects (node)
+  "Return t if NODE has side effects."
+  (when node  ; makes it easier to handle malformed expressions
+    (let ((tt (js2-node-type node)))
+      (cond
+       ;; This doubtless needs some work, since EXPR_VOID is used
+       ;; in several ways in Rhino and I may not have caught them all.
+       ;; I'll wait for people to notice incorrect warnings.
+       ((and (= tt js2-EXPR_VOID)
+             (js2-expr-stmt-node-p node)) ; but not if EXPR_RESULT
+        (let ((expr (js2-expr-stmt-node-expr node)))
+          (or (js2-node-has-side-effects expr)
+              (when (js2-string-node-p expr)
+                (member (js2-string-node-value expr) '("use strict" "use asm"))))))
+       ((= tt js2-COMMA)
+        (js2-node-has-side-effects (js2-infix-node-right node)))
+       ((or (= tt js2-AND)
+            (= tt js2-OR))
+        (or (js2-node-has-side-effects (js2-infix-node-right node))
+            (js2-node-has-side-effects (js2-infix-node-left node))))
+       ((= tt js2-HOOK)
+        (and (js2-node-has-side-effects (js2-cond-node-true-expr node))
+             (js2-node-has-side-effects (js2-cond-node-false-expr node))))
+       ((js2-paren-node-p node)
+        (js2-node-has-side-effects (js2-paren-node-expr node)))
+       ((= tt js2-ERROR) ; avoid cascaded error messages
+        nil)
+       (t
+        (aref js2-side-effecting-tokens tt))))))
+
+(defconst js2-stmt-node-types
+  (list js2-BLOCK
+        js2-BREAK
+        js2-CONTINUE
+        js2-DEFAULT  ; e4x "default xml namespace" statement
+        js2-DO
+        js2-EXPR_RESULT
+        js2-EXPR_VOID
+        js2-FOR
+        js2-IF
+        js2-RETURN
+        js2-SWITCH
+        js2-THROW
+        js2-TRY
+        js2-WHILE
+        js2-WITH)
+  "Node types that only appear in statement contexts.
+The list does not include nodes that always appear as the child
+of another specific statement type, such as switch-cases,
+catch and finally blocks, and else-clauses.  The list also excludes
+nodes like yield, let and var, which may appear in either expression
+or statement context, and in the latter context always have a
+`js2-expr-stmt-node' parent.  Finally, the list does not include
+functions or scripts, which are treated separately from statements
+by the JavaScript parser and runtime.")
+
+(defun js2-stmt-node-p (node)
+  "Heuristic for figuring out if NODE is a statement.
+Some node types can appear in either an expression context or a
+statement context, e.g. let-nodes, yield-nodes, and var-decl nodes.
+For these node types in a statement context, the parent will be a
+`js2-expr-stmt-node'.
+Functions aren't included in the check."
+  (memq (js2-node-type node) js2-stmt-node-types))
+
+(defun js2-mode-find-first-stmt (node)
+  "Search upward starting from NODE looking for a statement.
+For purposes of this function, a `js2-function-node' counts."
+  (while (not (or (js2-stmt-node-p node)
+                  (js2-function-node-p node)))
+    (setq node (js2-node-parent node)))
+  node)
+
+(defun js2-node-parent-stmt (node)
+  "Return the node's first ancestor that is a statement.
+Returns nil if NODE is a `js2-ast-root'.  Note that any expression
+appearing in a statement context will have a parent that is a
+`js2-expr-stmt-node' that will be returned by this function."
+  (let ((parent (js2-node-parent node)))
+    (if (or (null parent)
+            (js2-stmt-node-p parent)
+            (and (js2-function-node-p parent)
+                 (not (eq (js2-function-node-form parent)
+                          'FUNCTION_EXPRESSION))))
+        parent
+      (js2-node-parent-stmt parent))))
+
+;; In the Mozilla Rhino sources, Roshan James writes:
+;;  Does consistent-return analysis on the function body when strict mode is
+;;  enabled.
+;;
+;;    function (x) { return (x+1) }
+;;
+;;  is ok, but
+;;
+;;    function (x) { if (x < 0) return (x+1); }
+;;
+;;  is not because the function can potentially return a value when the
+;;  condition is satisfied and if not, the function does not explicitly
+;;  return a value.
+;;
+;;  This extends to checking mismatches such as "return" and "return <value>"
+;;  used in the same function. Warnings are not emitted if inconsistent
+;;  returns exist in code that can be statically shown to be unreachable.
+;;  Ex.
+;;    function (x) { while (true) { ... if (..) { return value } ... } }
+;;
+;;  emits no warning. However if the loop had a break statement, then a
+;;  warning would be emitted.
+;;
+;;  The consistency analysis looks at control structures such as loops, ifs,
+;;  switch, try-catch-finally blocks, examines the reachable code paths and
+;;  warns the user about an inconsistent set of termination possibilities.
+;;
+;;  These flags enumerate the possible ways a statement/function can
+;;  terminate. These flags are used by endCheck() and by the Parser to
+;;  detect inconsistent return usage.
+;;
+;;  END_UNREACHED is reserved for code paths that are assumed to always be
+;;  able to execute (example: throw, continue)
+;;
+;;  END_DROPS_OFF indicates if the statement can transfer control to the
+;;  next one. Statement such as return dont. A compound statement may have
+;;  some branch that drops off control to the next statement.
+;;
+;;  END_RETURNS indicates that the statement can return with no value.
+;;  END_RETURNS_VALUE indicates that the statement can return a value.
+;;
+;;  A compound statement such as
+;;  if (condition) {
+;;    return value;
+;;  }
+;;  Will be detected as (END_DROPS_OFF | END_RETURN_VALUE) by endCheck()
+
+(defconst js2-END_UNREACHED 0)
+(defconst js2-END_DROPS_OFF 1)
+(defconst js2-END_RETURNS 2)
+(defconst js2-END_RETURNS_VALUE 4)
+(defconst js2-END_YIELDS 8)
+
+(defun js2-has-consistent-return-usage (node)
+  "Check that every return usage in a function body is consistent.
+Returns t if the function satisfies strict mode requirement."
+  (let ((n (js2-end-check node)))
+    ;; either it doesn't return a value in any branch...
+    (or (js2-flag-not-set-p n js2-END_RETURNS_VALUE)
+        ;; or it returns a value (or is unreached) at every branch
+        (js2-flag-not-set-p n (logior js2-END_DROPS_OFF
+                                      js2-END_RETURNS
+                                      js2-END_YIELDS)))))
+
+(defun js2-end-check-if (node)
+  "Ensure that return usage in then/else blocks is consistent.
+If there is no else block, then the return statement can fall through.
+Returns logical OR of END_* flags"
+  (let ((th (js2-if-node-then-part node))
+        (el (js2-if-node-else-part node)))
+    (if (null th)
+        js2-END_UNREACHED
+      (logior (js2-end-check th) (if el
+                                     (js2-end-check el)
+                                   js2-END_DROPS_OFF)))))
+
+(defun js2-end-check-switch (node)
+  "Consistency of return statements is checked between the case statements.
+If there is no default, then the switch can fall through. If there is a
+default, we check to see if all code paths in the default return or if
+there is a code path that can fall through.
+Returns logical OR of END_* flags."
+  (let ((rv js2-END_UNREACHED)
+        default-case)
+    ;; examine the cases
+    (catch 'break
+      (dolist (c (js2-switch-node-cases node))
+        (if (js2-case-node-expr c)
+            (js2-set-flag rv (js2-end-check-block c))
+          (setq default-case c)
+          (throw 'break nil))))
+    ;; we don't care how the cases drop into each other
+    (js2-clear-flag rv js2-END_DROPS_OFF)
+    ;; examine the default
+    (js2-set-flag rv (if default-case
+                         (js2-end-check default-case)
+                       js2-END_DROPS_OFF))
+    rv))
+
+(defun js2-end-check-try (node)
+ "If the block has a finally, return consistency is checked in the
+finally block. If all code paths in the finally return, then the
+returns in the try-catch blocks don't matter. If there is a code path
+that does not return or if there is no finally block, the returns
+of the try and catch blocks are checked for mismatch.
+Returns logical OR of END_* flags."
+ (let ((finally (js2-try-node-finally-block node))
+       rv)
+   ;; check the finally if it exists
+   (setq rv (if finally
+                (js2-end-check (js2-finally-node-body finally))
+              js2-END_DROPS_OFF))
+   ;; If the finally block always returns, then none of the returns
+   ;; in the try or catch blocks matter.
+   (when (js2-flag-set-p rv js2-END_DROPS_OFF)
+     (js2-clear-flag rv js2-END_DROPS_OFF)
+     ;; examine the try block
+     (js2-set-flag rv (js2-end-check (js2-try-node-try-block node)))
+     ;; check each catch block
+     (dolist (cb (js2-try-node-catch-clauses node))
+       (js2-set-flag rv (js2-end-check (js2-catch-node-block cb)))))
+   rv))
+
+(defun js2-end-check-loop (node)
+  "Return statement in the loop body must be consistent.
+The default assumption for any kind of a loop is that it will eventually
+terminate.  The only exception is a loop with a constant true condition.
+Code that follows such a loop is examined only if one can determine
+statically that there is a break out of the loop.
+
+    for(... ; ... ; ...) {}
+    for(... in ... ) {}
+    while(...) { }
+    do { } while(...)
+
+Returns logical OR of END_* flags."
+  (let ((rv (js2-end-check (js2-loop-node-body node)))
+        (condition (cond
+                    ((js2-while-node-p node)
+                     (js2-while-node-condition node))
+                     ((js2-do-node-p node)
+                      (js2-do-node-condition node))
+                     ((js2-for-node-p node)
+                      (js2-for-node-condition node)))))
+
+    ;; check to see if the loop condition is always true
+    (if (and condition
+             (eq (js2-always-defined-boolean-p condition) 'ALWAYS_TRUE))
+        (js2-clear-flag rv js2-END_DROPS_OFF))
+
+    ;; look for effect of breaks
+    (js2-set-flag rv (js2-node-get-prop node
+                                        'CONTROL_BLOCK_PROP
+                                        js2-END_UNREACHED))
+    rv))
+
+(defun js2-end-check-block (node)
+  "A general block of code is examined statement by statement.
+If any statement (even a compound one) returns in all branches, then
+subsequent statements are not examined.
+Returns logical OR of END_* flags."
+  (let* ((rv js2-END_DROPS_OFF)
+         (kids (js2-block-node-kids node))
+         (n (car kids)))
+    ;; Check each statment.  If the statement can continue onto the next
+    ;; one (i.e. END_DROPS_OFF is set), then check the next statement.
+    (while (and n (js2-flag-set-p rv js2-END_DROPS_OFF))
+      (js2-clear-flag rv js2-END_DROPS_OFF)
+      (js2-set-flag rv (js2-end-check n))
+      (setq kids (cdr kids)
+            n (car kids)))
+    rv))
+
+(defun js2-end-check-label (node)
+  "A labeled statement implies that there may be a break to the label.
+The function processes the labeled statement and then checks the
+CONTROL_BLOCK_PROP property to see if there is ever a break to the
+particular label.
+Returns logical OR of END_* flags."
+  (let ((rv (js2-end-check (js2-labeled-stmt-node-stmt node))))
+    (logior rv (js2-node-get-prop node
+                                  'CONTROL_BLOCK_PROP
+                                  js2-END_UNREACHED))))
+
+(defun js2-end-check-break (node)
+  "When a break is encountered annotate the statement being broken
+out of by setting its CONTROL_BLOCK_PROP property.
+Returns logical OR of END_* flags."
+  (and (js2-break-node-target node)
+       (js2-node-set-prop (js2-break-node-target node)
+                          'CONTROL_BLOCK_PROP
+                          js2-END_DROPS_OFF))
+  js2-END_UNREACHED)
+
+(defun js2-end-check (node)
+  "Examine the body of a function, doing a basic reachability analysis.
+Returns a combination of flags END_* flags that indicate
+how the function execution can terminate. These constitute only the
+pessimistic set of termination conditions. It is possible that at
+runtime certain code paths will never be actually taken. Hence this
+analysis will flag errors in cases where there may not be errors.
+Returns logical OR of END_* flags"
+  (let (kid)
+    (cond
+     ((js2-break-node-p node)
+      (js2-end-check-break node))
+     ((js2-expr-stmt-node-p node)
+      (if (setq kid (js2-expr-stmt-node-expr node))
+          (js2-end-check kid)
+        js2-END_DROPS_OFF))
+     ((or (js2-continue-node-p node)
+          (js2-throw-node-p node))
+      js2-END_UNREACHED)
+     ((js2-return-node-p node)
+      (if (setq kid (js2-return-node-retval node))
+          js2-END_RETURNS_VALUE
+        js2-END_RETURNS))
+     ((js2-loop-node-p node)
+      (js2-end-check-loop node))
+     ((js2-switch-node-p node)
+      (js2-end-check-switch node))
+     ((js2-labeled-stmt-node-p node)
+      (js2-end-check-label node))
+     ((js2-if-node-p node)
+      (js2-end-check-if node))
+     ((js2-try-node-p node)
+      (js2-end-check-try node))
+     ((js2-block-node-p node)
+      (if (null (js2-block-node-kids node))
+          js2-END_DROPS_OFF
+        (js2-end-check-block node)))
+     ((js2-yield-node-p node)
+      js2-END_YIELDS)
+     (t
+      js2-END_DROPS_OFF))))
+
+(defun js2-always-defined-boolean-p (node)
+  "Check if NODE always evaluates to true or false in boolean context.
+Returns 'ALWAYS_TRUE, 'ALWAYS_FALSE, or nil if it's neither always true
+nor always false."
+  (let ((tt (js2-node-type node))
+        num)
+    (cond
+     ((or (= tt js2-FALSE) (= tt js2-NULL))
+      'ALWAYS_FALSE)
+     ((= tt js2-TRUE)
+      'ALWAYS_TRUE)
+     ((= tt js2-NUMBER)
+      (setq num (js2-number-node-num-value node))
+      (if (and (not (eq num 0.0e+NaN))
+               (not (zerop num)))
+          'ALWAYS_TRUE
+        'ALWAYS_FALSE))
+     (t
+      nil))))
+
+;;; Scanner -- a port of Mozilla Rhino's lexer.
+;; Corresponds to Rhino files Token.java and TokenStream.java.
+
+(defvar js2-tokens nil
+  "List of all defined token names.")  ; initialized in `js2-token-names'
+
+(defconst js2-token-names
+  (let* ((names (make-vector js2-num-tokens -1))
+         (case-fold-search nil)  ; only match js2-UPPER_CASE
+         (syms (apropos-internal "^js2-\\(?:[A-Z_]+\\)")))
+    (loop for sym in syms
+          for i from 0
+          do
+          (unless (or (memq sym '(js2-EOF_CHAR js2-ERROR))
+                      (not (boundp sym)))
+            (aset names (symbol-value sym)           ; code, e.g. 152
+                  (downcase
+                   (substring (symbol-name sym) 4))) ; name, e.g. "let"
+            (push sym js2-tokens)))
+    names)
+  "Vector mapping int values to token string names, sans `js2-' prefix.")
+
+(defun js2-token-name (tok)
+  "Return a string name for TOK, a token symbol or code.
+Signals an error if it's not a recognized token."
+  (let ((code tok))
+    (if (symbolp tok)
+        (setq code (symbol-value tok)))
+    (if (eq code -1)
+        "ERROR"
+      (if (and (numberp code)
+               (not (minusp code))
+               (< code js2-num-tokens))
+          (aref js2-token-names code)
+        (error "Invalid token: %s" code)))))
+
+(defsubst js2-token-sym (tok)
+  "Return symbol for TOK given its code, e.g. 'js2-LP for code 86."
+  (intern (js2-token-name tok)))
+
+(defconst js2-token-codes
+  (let ((table (make-hash-table :test 'eq :size 256)))
+    (loop for name across js2-token-names
+          for sym = (intern (concat "js2-" (upcase name)))
+          do
+          (puthash sym (symbol-value sym) table))
+    ;; clean up a few that are "wrong" in Rhino's token codes
+    (puthash 'js2-DELETE js2-DELPROP table)
+    table)
+  "Hashtable mapping token symbols to their bytecodes.")
+
+(defsubst js2-token-code (sym)
+  "Return code for token symbol SYM, e.g. 86 for 'js2-LP."
+  (or (gethash sym js2-token-codes)
+      (error "Invalid token symbol: %s " sym)))  ; signal code bug
+
+(defun js2-report-scan-error (msg &optional no-throw beg len)
+  (setq js2-token-end js2-ts-cursor)
+  (js2-report-error msg nil
+                    (or beg js2-token-beg)
+                    (or len (- js2-token-end js2-token-beg)))
+  (unless no-throw
+    (throw 'return js2-ERROR)))
+
+(defun js2-get-string-from-buffer ()
+  "Reverse the char accumulator and return it as a string."
+  (setq js2-token-end js2-ts-cursor)
+  (if js2-ts-string-buffer
+      (apply #'string (nreverse js2-ts-string-buffer))
+    ""))
+
+;; TODO:  could potentially avoid a lot of consing by allocating a
+;; char buffer the way Rhino does.
+(defsubst js2-add-to-string (c)
+  (push c js2-ts-string-buffer))
+
+;; Note that when we "read" the end-of-file, we advance js2-ts-cursor
+;; to (1+ (point-max)), which lets the scanner treat end-of-file like
+;; any other character:  when it's not part of the current token, we
+;; unget it, allowing it to be read again by the following call.
+(defsubst js2-unget-char ()
+  (decf js2-ts-cursor))
+
+;; Rhino distinguishes \r and \n line endings.  We don't need to
+;; because we only scan from Emacs buffers, which always use \n.
+(defun js2-get-char ()
+  "Read and return the next character from the input buffer.
+Increments `js2-ts-lineno' if the return value is a newline char.
+Updates `js2-ts-cursor' to the point after the returned char.
+Returns `js2-EOF_CHAR' if we hit the end of the buffer.
+Also updates `js2-ts-hit-eof' and `js2-ts-line-start' as needed."
+  (let (c)
+    ;; check for end of buffer
+    (if (>= js2-ts-cursor (point-max))
+        (setq js2-ts-hit-eof t
+              js2-ts-cursor (1+ js2-ts-cursor)
+              c js2-EOF_CHAR)  ; return value
+      ;; otherwise read next char
+      (setq c (char-before (incf js2-ts-cursor)))
+      ;; if we read a newline, update counters
+      (if (= c ?\n)
+          (setq js2-ts-line-start js2-ts-cursor
+                js2-ts-lineno (1+ js2-ts-lineno)))
+      ;; TODO:  skip over format characters
+      c)))
+
+(defun js2-read-unicode-escape ()
+  "Read a \\uNNNN sequence from the input.
+Assumes the ?\ and ?u have already been read.
+Returns the unicode character, or nil if it wasn't a valid character.
+Doesn't change the values of any scanner variables."
+  ;; I really wish I knew a better way to do this, but I can't
+  ;; find the Emacs function that takes a 16-bit int and converts
+  ;; it to a Unicode/utf-8 character.  So I basically eval it with (read).
+  ;; Have to first check that it's 4 hex characters or it may stop
+  ;; the read early.
+  (ignore-errors
+    (let ((s (buffer-substring-no-properties js2-ts-cursor
+                                             (+ 4 js2-ts-cursor))))
+      (if (string-match "[a-zA-Z0-9]\\{4\\}" s)
+          (read (concat "?\\u" s))))))
+
+(defun js2-match-char (test)
+  "Consume and return next character if it matches TEST, a character.
+Returns nil and consumes nothing if TEST is not the next character."
+  (let ((c (js2-get-char)))
+    (if (eq c test)
+        t
+      (js2-unget-char)
+      nil)))
+
+(defun js2-peek-char ()
+  (prog1
+      (js2-get-char)
+    (js2-unget-char)))
+
+(defun js2-java-identifier-start-p (c)
+  (or
+   (memq c '(?$ ?_))
+   (js2-char-uppercase-p c)
+   (js2-char-lowercase-p c)))
+
+(defun js2-java-identifier-part-p (c)
+  "Implementation of java.lang.Character.isJavaIdentifierPart()."
+  ;; TODO:  make me Unicode-friendly.  See comments above.
+  (or
+   (memq c '(?$ ?_))
+   (js2-char-uppercase-p c)
+   (js2-char-lowercase-p c)
+   (and (>= c ?0) (<= c ?9))))
+
+(defun js2-alpha-p (c)
+  (cond ((and (<= ?A c) (<= c ?Z)) t)
+        ((and (<= ?a c) (<= c ?z)) t)
+        (t nil)))
+
+(defsubst js2-digit-p (c)
+  (and (<= ?0 c) (<= c ?9)))
+
+(defun js2-js-space-p (c)
+  (if (<= c 127)
+      (memq c '(#x20 #x9 #xB #xC #xD))
+    (or
+     (eq c #xA0)
+     ;; TODO:  change this nil to check for Unicode space character
+     nil)))
+
+(defconst js2-eol-chars (list js2-EOF_CHAR ?\n ?\r))
+
+(defun js2-skip-line ()
+  "Skip to end of line."
+  (let (c)
+    (while (not (memq (setq c (js2-get-char)) js2-eol-chars)))
+    (js2-unget-char)
+    (setq js2-token-end js2-ts-cursor)))
+
+(defun js2-init-scanner (&optional buf line)
+  "Create token stream for BUF starting on LINE.
+BUF defaults to `current-buffer' and LINE defaults to 1.
+
+A buffer can only have one scanner active at a time, which yields
+dramatically simpler code than using a defstruct.  If you need to
+have simultaneous scanners in a buffer, copy the regions to scan
+into temp buffers."
+  (with-current-buffer (or buf (current-buffer))
+    (setq js2-ts-dirty-line nil
+          js2-ts-regexp-flags nil
+          js2-ts-string ""
+          js2-ts-number nil
+          js2-ts-hit-eof nil
+          js2-ts-line-start 0
+          js2-ts-lineno (or line 1)
+          js2-ts-line-end-char -1
+          js2-ts-cursor (point-min)
+          js2-ts-is-xml-attribute nil
+          js2-ts-xml-is-tag-content nil
+          js2-ts-xml-open-tags-count 0
+          js2-ts-string-buffer nil)))
+
+;; This function uses the cached op, string and number fields in
+;; TokenStream; if getToken has been called since the passed token
+;; was scanned, the op or string printed may be incorrect.
+(defun js2-token-to-string (token)
+  ;; Not sure where this function is used in Rhino.  Not tested.
+  (if (not js2-debug-print-trees)
+      ""
+    (let ((name (js2-token-name token)))
+      (cond
+       ((memq token (list js2-STRING js2-REGEXP js2-NAME))
+        (concat name " `" js2-ts-string "'"))
+       ((eq token js2-NUMBER)
+        (format "NUMBER %g" js2-ts-number))
+       (t
+        name)))))
+
+(defconst js2-keywords
+  '(break
+    case catch const continue
+    debugger default delete do
+    else enum
+    false finally for function
+    if in instanceof import
+    let
+    new null
+    return
+    switch
+    this throw true try typeof
+    var void
+    while with
+    yield))
+
+;; Token names aren't exactly the same as the keywords, unfortunately.
+;; E.g. enum isn't in the tokens, and delete is js2-DELPROP.
+(defconst js2-kwd-tokens
+  (let ((table (make-vector js2-num-tokens nil))
+        (tokens
+         (list js2-BREAK
+               js2-CASE js2-CATCH js2-CONST js2-CONTINUE
+               js2-DEBUGGER js2-DEFAULT js2-DELPROP js2-DO
+               js2-ELSE
+               js2-FALSE js2-FINALLY js2-FOR js2-FUNCTION
+               js2-IF js2-IN js2-INSTANCEOF js2-IMPORT
+               js2-LET
+               js2-NEW js2-NULL
+               js2-RETURN
+               js2-SWITCH
+               js2-THIS js2-THROW js2-TRUE js2-TRY js2-TYPEOF
+               js2-VAR
+               js2-WHILE js2-WITH
+               js2-YIELD)))
+    (dolist (i tokens)
+      (aset table i 'font-lock-keyword-face))
+    (aset table js2-STRING 'font-lock-string-face)
+    (aset table js2-REGEXP 'font-lock-string-face)
+    (aset table js2-COMMENT 'font-lock-comment-face)
+    (aset table js2-THIS 'font-lock-builtin-face)
+    (aset table js2-VOID 'font-lock-constant-face)
+    (aset table js2-NULL 'font-lock-constant-face)
+    (aset table js2-TRUE 'font-lock-constant-face)
+    (aset table js2-FALSE 'font-lock-constant-face)
+    table)
+  "Vector whose values are non-nil for tokens that are keywords.
+The values are default faces to use for highlighting the keywords.")
+
+(defconst js2-reserved-words
+  '(abstract
+    boolean byte
+    char class
+    double
+    enum export extends
+    final float
+    goto
+    implements import int interface
+    long
+    native
+    package private protected public
+    short static super synchronized
+    throws transient
+    volatile))
+
+(defconst js2-keyword-names
+  (let ((table (make-hash-table :test 'equal)))
+    (loop for k in js2-keywords
+          do (puthash
+              (symbol-name k)                            ; instanceof
+              (intern (concat "js2-"
+                              (upcase (symbol-name k)))) ; js2-INSTANCEOF
+              table))
+    table)
+  "JavaScript keywords by name, mapped to their symbols.")
+
+(defconst js2-reserved-word-names
+  (let ((table (make-hash-table :test 'equal)))
+    (loop for k in js2-reserved-words
+          do
+          (puthash (symbol-name k) 'js2-RESERVED table))
+    table)
+  "JavaScript reserved words by name, mapped to 'js2-RESERVED.")
+
+(defun js2-collect-string (buf)
+  "Convert BUF, a list of chars, to a string.
+Reverses BUF before converting."
+  (cond
+   ((stringp buf)
+    buf)
+   ((null buf)  ; for emacs21 compat
+    "")
+   (t
+    (if buf
+        (apply #'string (nreverse buf))
+      ""))))
+
+(defun js2-string-to-keyword (s)
+  "Return token for S, a string, if S is a keyword or reserved word.
+Returns a symbol such as 'js2-BREAK, or nil if not keyword/reserved."
+  (or (gethash s js2-keyword-names)
+      (gethash s js2-reserved-word-names)))
+
+(defsubst js2-ts-set-char-token-bounds ()
+  "Used when next token is one character."
+  (setq js2-token-beg (1- js2-ts-cursor)
+        js2-token-end js2-ts-cursor))
+
+(defsubst js2-ts-return (token)
+  "Return an N-character TOKEN from `js2-get-token'.
+Updates `js2-token-end' accordingly."
+  (setq js2-token-end js2-ts-cursor)
+  (throw 'return token))
+
+(defun js2-x-digit-to-int (c accumulator)
+  "Build up a hex number.
+If C is a hexadecimal digit, return ACCUMULATOR * 16 plus
+corresponding number.  Otherwise return -1."
+  (catch 'return
+    (catch 'check
+      ;; Use 0..9 < A..Z < a..z
+      (cond
+       ((<= c ?9)
+        (decf c ?0)
+        (if (<= 0 c)
+            (throw 'check nil)))
+       ((<= c ?F)
+        (when (<= ?A c)
+          (decf c (- ?A 10))
+          (throw 'check nil)))
+       ((<= c ?f)
+        (when (<= ?a c)
+          (decf c (- ?a 10))
+          (throw 'check nil))))
+      (throw 'return -1))
+    (logior c (lsh accumulator 4))))
+
+(defun js2-get-token ()
+  "Return next JavaScript token, an int such as js2-RETURN."
+  (let (c c1 identifier-start is-unicode-escape-start
+        contains-escape escape-val escape-start str result base
+        is-integer quote-char val look-for-slash continue)
+    (catch 'return
+      (while t
+        ;; Eat whitespace, possibly sensitive to newlines.
+        (setq continue t)
+        (while continue
+          (setq c (js2-get-char))
+          (cond
+           ((eq c js2-EOF_CHAR)
+            (js2-ts-set-char-token-bounds)
+            (throw 'return js2-EOF))
+           ((eq c ?\n)
+            (js2-ts-set-char-token-bounds)
+            (setq js2-ts-dirty-line nil)
+            (throw 'return js2-EOL))
+           ((not (js2-js-space-p c))
+            (if (/= c ?-)               ; in case end of HTML comment
+                (setq js2-ts-dirty-line t))
+            (setq continue nil))))
+        ;; Assume the token will be 1 char - fixed up below.
+        (js2-ts-set-char-token-bounds)
+        (when (eq c ?@)
+          (throw 'return js2-XMLATTR))
+        ;; identifier/keyword/instanceof?
+        ;; watch out for starting with a <backslash>
+        (cond
+         ((eq c ?\\)
+          (setq c (js2-get-char))
+          (if (eq c ?u)
+              (setq identifier-start t
+                    is-unicode-escape-start t
+                    js2-ts-string-buffer nil)
+            (setq identifier-start nil)
+            (js2-unget-char)
+            (setq c ?\\)))
+         (t
+          (when (setq identifier-start (js2-java-identifier-start-p c))
+            (setq js2-ts-string-buffer nil)
+            (js2-add-to-string c))))
+        (when identifier-start
+          (setq contains-escape is-unicode-escape-start)
+          (catch 'break
+            (while t
+              (if is-unicode-escape-start
+                  ;; strictly speaking we should probably push-back
+                  ;; all the bad characters if the <backslash>uXXXX
+                  ;; sequence is malformed. But since there isn't a
+                  ;; correct context(is there?) for a bad Unicode
+                  ;; escape sequence in an identifier, we can report
+                  ;; an error here.
+                  (progn
+                    (setq escape-val 0)
+                    (dotimes (i 4)
+                      (setq c (js2-get-char)
+                            escape-val (js2-x-digit-to-int c escape-val))
+                      ;; Next check takes care of c < 0 and bad escape
+                      (if (minusp escape-val)
+                          (throw 'break nil)))
+                    (if (minusp escape-val)
+                        (js2-report-scan-error "msg.invalid.escape" t))
+                    (js2-add-to-string escape-val)
+                    (setq is-unicode-escape-start nil))
+                (setq c (js2-get-char))
+                (cond
+                 ((eq c ?\\)
+                  (setq c (js2-get-char))
+                  (if (eq c ?u)
+                      (setq is-unicode-escape-start t
+                            contains-escape t)
+                    (js2-report-scan-error "msg.illegal.character" t)))
+                 (t
+                  (if (or (eq c js2-EOF_CHAR)
+                          (not (js2-java-identifier-part-p c)))
+                      (throw 'break nil))
+                  (js2-add-to-string c))))))
+          (js2-unget-char)
+          (setq str (js2-get-string-from-buffer))
+          (unless contains-escape
+            ;; OPT we shouldn't have to make a string (object!) to
+            ;; check if it's a keyword.
+            ;; Return the corresponding token if it's a keyword
+            (when (setq result (js2-string-to-keyword str))
+              (if (and (< js2-language-version 170)
+                       (memq result '(js2-LET js2-YIELD)))
+                  ;; LET and YIELD are tokens only in 1.7 and later
+                  (setq result 'js2-NAME))
+              (if (not (eq result 'js2-RESERVED))
+                  (throw 'return (js2-token-code result)))
+              (js2-report-warning "msg.reserved.keyword" str)))
+          ;; If we want to intern these as Rhino does, just use (intern str)
+          (setq js2-ts-string str)
+          (throw 'return js2-NAME))     ; end identifier/kwd check
+        ;; is it a number?
+        (when (or (js2-digit-p c)
+                  (and (eq c ?.) (js2-digit-p (js2-peek-char))))
+          (setq js2-ts-string-buffer nil
+                base 10)
+          (when (eq c ?0)
+            (setq c (js2-get-char))
+            (cond
+             ((or (eq c ?x) (eq c ?X))
+              (setq base 16)
+              (setq c (js2-get-char)))
+             ((js2-digit-p c)
+              (setq base 8))
+             (t
+              (js2-add-to-string ?0))))
+          (if (eq base 16)
+              (while (<= 0 (js2-x-digit-to-int c 0))
+                (js2-add-to-string c)
+                (setq c (js2-get-char)))
+            (while (and (<= ?0 c) (<= c ?9))
+              ;; We permit 08 and 09 as decimal numbers, which
+              ;; makes our behavior a superset of the ECMA
+              ;; numeric grammar.  We might not always be so
+              ;; permissive, so we warn about it.
+              (when (and (eq base 8) (>= c ?8))
+                (js2-report-warning "msg.bad.octal.literal"
+                                    (if (eq c ?8) "8" "9"))
+                (setq base 10))
+              (js2-add-to-string c)
+              (setq c (js2-get-char))))
+          (setq is-integer t)
+          (when (and (eq base 10) (memq c '(?. ?e ?E)))
+            (setq is-integer nil)
+            (when (eq c ?.)
+              (loop do
+                    (js2-add-to-string c)
+                    (setq c (js2-get-char))
+                    while (js2-digit-p c)))
+            (when (memq c '(?e ?E))
+              (js2-add-to-string c)
+              (setq c (js2-get-char))
+              (when (memq c '(?+ ?-))
+                (js2-add-to-string c)
+                (setq c (js2-get-char)))
+              (unless (js2-digit-p c)
+                (js2-report-scan-error "msg.missing.exponent" t))
+              (loop do
+                    (js2-add-to-string c)
+                    (setq c (js2-get-char))
+                    while (js2-digit-p c))))
+          (js2-unget-char)
+          (setq js2-ts-string (js2-get-string-from-buffer)
+                js2-ts-number
+                (if (and (eq base 10) (not is-integer))
+                    (string-to-number js2-ts-string)
+                  ;; TODO:  call runtime number-parser.  Some of it is in
+                  ;; js2-util.el, but I need to port ScriptRuntime.stringToNumber.
+                  (string-to-number js2-ts-string)))
+          (throw 'return js2-NUMBER))
+        ;; is it a string?
+        (when (memq c '(?\" ?\'))
+          ;; We attempt to accumulate a string the fast way, by
+          ;; building it directly out of the reader.  But if there
+          ;; are any escaped characters in the string, we revert to
+          ;; building it out of a string buffer.
+          (setq quote-char c
+                js2-ts-string-buffer nil
+                c (js2-get-char))
+          (catch 'break
+            (while (/= c quote-char)
+              (catch 'continue
+                (when (or (eq c ?\n) (eq c js2-EOF_CHAR))
+                  (js2-unget-char)
+                  (setq js2-token-end js2-ts-cursor)
+                  (js2-report-error "msg.unterminated.string.lit")
+                  (throw 'return js2-STRING))
+                (when (eq c ?\\)
+                  ;; We've hit an escaped character
+                  (setq c (js2-get-char))
+                  (case c
+                    (?b (setq c ?\b))
+                    (?f (setq c ?\f))
+                    (?n (setq c ?\n))
+                    (?r (setq c ?\r))
+                    (?t (setq c ?\t))
+                    (?v (setq c ?\v))
+                    (?u
+                     (setq c1 (js2-read-unicode-escape))
+                     (if js2-parse-ide-mode
+                         (if c1
+                             (progn
+                               ;; just copy the string in IDE-mode
+                               (js2-add-to-string ?\\)
+                               (js2-add-to-string ?u)
+                               (dotimes (i 3)
+                                 (js2-add-to-string (js2-get-char)))
+                               (setq c (js2-get-char))) ; added at end of loop
+                           ;; flag it as an invalid escape
+                           (js2-report-warning "msg.invalid.escape"
+                                               nil (- js2-ts-cursor 2) 6))
+                       ;; Get 4 hex digits; if the u escape is not
+                       ;; followed by 4 hex digits, use 'u' + the
+                       ;; literal character sequence that follows.
+                       (js2-add-to-string ?u)
+                       (setq escape-val 0)
+                       (dotimes (i 4)
+                         (setq c (js2-get-char)
+                               escape-val (js2-x-digit-to-int c escape-val))
+                         (if (minusp escape-val)
+                             (throw 'continue nil))
+                         (js2-add-to-string c))
+                       ;; prepare for replace of stored 'u' sequence by escape value
+                       (setq js2-ts-string-buffer (nthcdr 5 js2-ts-string-buffer)
+                             c escape-val)))
+                    (?x
+                     ;; Get 2 hex digits, defaulting to 'x'+literal
+                     ;; sequence, as above.
+                     (setq c (js2-get-char)
+                           escape-val (js2-x-digit-to-int c 0))
+                     (if (minusp escape-val)
+                         (progn
+                           (js2-add-to-string ?x)
+                           (throw 'continue nil))
+                       (setq c1 c
+                             c (js2-get-char)
+                             escape-val (js2-x-digit-to-int c escape-val))
+                       (if (minusp escape-val)
+                           (progn
+                             (js2-add-to-string ?x)
+                             (js2-add-to-string c1)
+                             (throw 'continue nil))
+                         ;; got 2 hex digits
+                         (setq c escape-val))))
+                    (?\n
+                     ;; Remove line terminator after escape to follow
+                     ;; SpiderMonkey and C/C++
+                     (setq c (js2-get-char))
+                     (throw 'continue nil))
+                    (t
+                     (when (and (<= ?0 c) (< c ?8))
+                       (setq val (- c ?0)
+                             c (js2-get-char))
+                       (when (and (<= ?0 c) (< c ?8))
+                         (setq val (- (+ (* 8 val) c) ?0)
+                               c (js2-get-char))
+                         (when (and (<= ?0 c)
+                                    (< c ?8)
+                                    (< val #o37))
+                           ;; c is 3rd char of octal sequence only
+                           ;; if the resulting val <= 0377
+                           (setq val (- (+ (* 8 val) c) ?0)
+                                 c (js2-get-char))))
+                       (js2-unget-char)
+                       (setq c val)))))
+                (js2-add-to-string c)
+                (setq c (js2-get-char)))))
+          (setq js2-ts-string (js2-get-string-from-buffer))
+          (throw 'return js2-STRING))
+        (case c
+          (?\;
+           (throw 'return js2-SEMI))
+          (?\[
+           (throw 'return js2-LB))
+          (?\]
+           (throw 'return js2-RB))
+          (?{
+           (throw 'return js2-LC))
+          (?}
+           (throw 'return js2-RC))
+          (?\(
+           (throw 'return js2-LP))
+          (?\)
+           (throw 'return js2-RP))
+          (?,
+           (throw 'return js2-COMMA))
+          (??
+           (throw 'return js2-HOOK))
+          (?:
+           (if (js2-match-char ?:)
+               (js2-ts-return js2-COLONCOLON)
+             (throw 'return js2-COLON)))
+          (?.
+           (if (js2-match-char ?.)
+               (if (js2-match-char ?.)
+                   (js2-ts-return js2-TRIPLEDOT)
+                 (js2-ts-return js2-DOTDOT))
+             (if (js2-match-char ?\()
+                 (js2-ts-return js2-DOTQUERY)
+               (throw 'return js2-DOT))))
+          (?|
+           (if (js2-match-char ?|)
+               (throw 'return js2-OR)
+             (if (js2-match-char ?=)
+                 (js2-ts-return js2-ASSIGN_BITOR)
+               (throw 'return js2-BITOR))))
+          (?^
+           (if (js2-match-char ?=)
+               (js2-ts-return js2-ASSIGN_BITOR)
+             (throw 'return js2-BITXOR)))
+          (?&
+           (if (js2-match-char ?&)
+               (throw 'return js2-AND)
+             (if (js2-match-char ?=)
+                 (js2-ts-return js2-ASSIGN_BITAND)
+               (throw 'return js2-BITAND))))
+          (?=
+           (if (js2-match-char ?=)
+               (if (js2-match-char ?=)
+                   (js2-ts-return js2-SHEQ)
+                 (throw 'return js2-EQ))
+             (throw 'return js2-ASSIGN)))
+          (?!
+           (if (js2-match-char ?=)
+               (if (js2-match-char ?=)
+                   (js2-ts-return js2-SHNE)
+                 (js2-ts-return js2-NE))
+             (throw 'return js2-NOT)))
+          (?<
+           ;; NB:treat HTML begin-comment as comment-till-eol
+           (when (js2-match-char ?!)
+             (when (js2-match-char ?-)
+               (when (js2-match-char ?-)
+                 (js2-skip-line)
+                 (setq js2-ts-comment-type 'html)
+                 (throw 'return js2-COMMENT)))
+             (js2-unget-char))
+           (if (js2-match-char ?<)
+               (if (js2-match-char ?=)
+                   (js2-ts-return js2-ASSIGN_LSH)
+                 (js2-ts-return js2-LSH))
+             (if (js2-match-char ?=)
+                 (js2-ts-return js2-LE)
+               (throw 'return js2-LT))))
+          (?>
+           (if (js2-match-char ?>)
+               (if (js2-match-char ?>)
+                   (if (js2-match-char ?=)
+                       (js2-ts-return js2-ASSIGN_URSH)
+                     (js2-ts-return js2-URSH))
+                 (if (js2-match-char ?=)
+                     (js2-ts-return js2-ASSIGN_RSH)
+                   (js2-ts-return js2-RSH)))
+             (if (js2-match-char ?=)
+                 (js2-ts-return js2-GE)
+               (throw 'return js2-GT))))
+          (?*
+           (if (js2-match-char ?=)
+               (js2-ts-return js2-ASSIGN_MUL)
+             (throw 'return js2-MUL)))
+          (?/
+           ;; is it a // comment?
+           (when (js2-match-char ?/)
+             (setq js2-token-beg (- js2-ts-cursor 2))
+             (js2-skip-line)
+             (setq js2-ts-comment-type 'line)
+             ;; include newline so highlighting goes to end of window
+             (incf js2-token-end)
+             (throw 'return js2-COMMENT))
+           ;; is it a /* comment?
+           (when (js2-match-char ?*)
+             (setq look-for-slash nil
+                   js2-token-beg (- js2-ts-cursor 2)
+                   js2-ts-comment-type
+                   (if (js2-match-char ?*)
+                       (progn
+                         (setq look-for-slash t)
+                         'jsdoc)
+                     'block))
+             (while t
+               (setq c (js2-get-char))
+               (cond
+                ((eq c js2-EOF_CHAR)
+                 (setq js2-token-end (1- js2-ts-cursor))
+                 (js2-report-error "msg.unterminated.comment")
+                 (throw 'return js2-COMMENT))
+                ((eq c ?*)
+                 (setq look-for-slash t))
+                ((eq c ?/)
+                 (if look-for-slash
+                   (js2-ts-return js2-COMMENT)))
+                (t
+                 (setq look-for-slash nil
+                       js2-token-end js2-ts-cursor)))))
+           (if (js2-match-char ?=)
+               (js2-ts-return js2-ASSIGN_DIV)
+             (throw 'return js2-DIV)))
+           (?#
+            (when js2-skip-preprocessor-directives
+              (js2-skip-line)
+              (setq js2-ts-comment-type 'preprocessor
+                    js2-token-end js2-ts-cursor)
+              (throw 'return js2-COMMENT))
+            (throw 'return js2-ERROR))
+          (?%
+           (if (js2-match-char ?=)
+               (js2-ts-return js2-ASSIGN_MOD)
+             (throw 'return js2-MOD)))
+          (?~
+           (throw 'return js2-BITNOT))
+          (?+
+           (if (js2-match-char ?=)
+               (js2-ts-return js2-ASSIGN_ADD)
+             (if (js2-match-char ?+)
+                 (js2-ts-return js2-INC)
+               (throw 'return js2-ADD))))
+          (?-
+           (cond
+            ((js2-match-char ?=)
+             (setq c js2-ASSIGN_SUB))
+            ((js2-match-char ?-)
+             (unless js2-ts-dirty-line
+               ;; treat HTML end-comment after possible whitespace
+               ;; after line start as comment-until-eol
+               (when (js2-match-char ?>)
+                 (js2-skip-line)
+                 (setq js2-ts-comment-type 'html)
+                 (throw 'return js2-COMMENT)))
+             (setq c js2-DEC))
+            (t
+             (setq c js2-SUB)))
+           (setq js2-ts-dirty-line t)
+           (js2-ts-return c))
+          (otherwise
+           (js2-report-scan-error "msg.illegal.character")))))))
+
+(defun js2-read-regexp (start-token)
+  "Called by parser when it gets / or /= in literal context."
+  (let (c err
+        in-class  ; inside a '[' .. ']' character-class
+        flags
+        (continue t))
+    (setq js2-token-beg js2-ts-cursor
+          js2-ts-string-buffer nil
+          js2-ts-regexp-flags nil)
+    (if (eq start-token js2-ASSIGN_DIV)
+        ;; mis-scanned /=
+        (js2-add-to-string ?=)
+      (if (not (eq start-token js2-DIV))
+          (error "failed assertion")))
+    (while (and (not err)
+                (or (/= (setq c (js2-get-char)) ?/)
+                    in-class))
+      (cond
+       ((or (= c ?\n)
+            (= c js2-EOF_CHAR))
+        (setq js2-token-end (1- js2-ts-cursor)
+              err t
+              js2-ts-string (js2-collect-string js2-ts-string-buffer))
+        (js2-report-error "msg.unterminated.re.lit"))
+       (t (cond
+           ((= c ?\\)
+            (js2-add-to-string c)
+            (setq c (js2-get-char)))
+           ((= c ?\[)
+            (setq in-class t))
+           ((= c ?\])
+            (setq in-class nil)))
+          (js2-add-to-string c))))
+    (unless err
+      (while continue
+        (cond
+         ((js2-match-char ?g)
+          (push ?g flags))
+         ((js2-match-char ?i)
+          (push ?i flags))
+         ((js2-match-char ?m)
+          (push ?m flags))
+         (t
+          (setq continue nil))))
+      (if (js2-alpha-p (js2-peek-char))
+          (js2-report-scan-error "msg.invalid.re.flag" t
+                                 js2-ts-cursor 1))
+      (setq js2-ts-string (js2-collect-string js2-ts-string-buffer)
+            js2-ts-regexp-flags (js2-collect-string flags)
+            js2-token-end js2-ts-cursor)
+      ;; tell `parse-partial-sexp' to ignore this range of chars
+      (js2-record-text-property js2-token-beg js2-token-end 'syntax-class '(2)))))
+
+(defun js2-get-first-xml-token ()
+  (setq js2-ts-xml-open-tags-count 0
+        js2-ts-is-xml-attribute nil
+        js2-ts-xml-is-tag-content nil)
+  (js2-unget-char)
+  (js2-get-next-xml-token))
+
+(defun js2-xml-discard-string ()
+  "Throw away the string in progress and flag an XML parse error."
+  (setq js2-ts-string-buffer nil
+        js2-ts-string nil)
+  (js2-report-scan-error "msg.XML.bad.form" t))
+
+(defun js2-get-next-xml-token ()
+  (setq js2-ts-string-buffer nil  ; for recording the XML
+        js2-token-beg js2-ts-cursor)
+  (let (c result)
+    (setq result
+          (catch 'return
+            (while t
+              (setq c (js2-get-char))
+              (cond
+               ((= c js2-EOF_CHAR)
+                (throw 'return js2-ERROR))
+               (js2-ts-xml-is-tag-content
+                (case c
+                  (?>
+                   (js2-add-to-string c)
+                   (setq js2-ts-xml-is-tag-content nil
+                         js2-ts-is-xml-attribute nil))
+                  (?/
+                   (js2-add-to-string c)
+                   (when (eq ?> (js2-peek-char))
+                     (setq c (js2-get-char))
+                     (js2-add-to-string c)
+                     (setq js2-ts-xml-is-tag-content nil)
+                     (decf js2-ts-xml-open-tags-count)))
+                  (?{
+                   (js2-unget-char)
+                   (setq js2-ts-string (js2-get-string-from-buffer))
+                   (throw 'return js2-XML))
+                  ((?\' ?\")
+                   (js2-add-to-string c)
+                   (unless (js2-read-quoted-string c)
+                     (throw 'return js2-ERROR)))
+                  (?=
+                   (js2-add-to-string c)
+                   (setq js2-ts-is-xml-attribute t))
+                  ((? ?\t ?\r ?\n)
+                   (js2-add-to-string c))
+                  (t
+                   (js2-add-to-string c)
+                   (setq js2-ts-is-xml-attribute nil)))
+                (when (and (not js2-ts-xml-is-tag-content)
+                           (zerop js2-ts-xml-open-tags-count))
+                  (setq js2-ts-string (js2-get-string-from-buffer))
+                  (throw 'return js2-XMLEND)))
+               (t
+                ;; else not tag content
+                (case c
+                  (?<
+                   (js2-add-to-string c)
+                   (setq c (js2-peek-char))
+                   (case c
+                     (?!
+                      (setq c (js2-get-char)) ;; skip !
+                      (js2-add-to-string c)
+                      (setq c (js2-peek-char))
+                      (case c
+                        (?-
+                         (setq c (js2-get-char)) ;; skip -
+                         (js2-add-to-string c)
+                         (if (eq c ?-)
+                             (progn
+                               (js2-add-to-string c)
+                               (unless (js2-read-xml-comment)
+                                 (throw 'return js2-ERROR)))
+                           (js2-xml-discard-string)
+                           (throw 'return js2-ERROR)))
+                        (?\[
+                         (setq c (js2-get-char)) ;; skip [
+                         (js2-add-to-string c)
+                         (if (and (= (js2-get-char) ?C)
+                                  (= (js2-get-char) ?D)
+                                  (= (js2-get-char) ?A)
+                                  (= (js2-get-char) ?T)
+                                  (= (js2-get-char) ?A)
+                                  (= (js2-get-char) ?\[))
+                             (progn
+                               (js2-add-to-string ?C)
+                               (js2-add-to-string ?D)
+                               (js2-add-to-string ?A)
+                               (js2-add-to-string ?T)
+                               (js2-add-to-string ?A)
+                               (js2-add-to-string ?\[)
+                               (unless (js2-read-cdata)
+                                 (throw 'return js2-ERROR)))
+                           (js2-xml-discard-string)
+                           (throw 'return js2-ERROR)))
+                        (t
+                         (unless (js2-read-entity)
+                           (throw 'return js2-ERROR))))
+                      ;; Allow bare CDATA section, e.g.:
+                      ;;   let xml = <![CDATA[ foo bar baz ]]>;
+                      (when (zerop js2-ts-xml-open-tags-count)
+                        (throw 'return js2-XMLEND)))
+                     (??
+                      (setq c (js2-get-char)) ;; skip ?
+                      (js2-add-to-string c)
+                      (unless (js2-read-PI)
+                        (throw 'return js2-ERROR)))
+                     (?/
+                      ;; end tag
+                      (setq c (js2-get-char)) ;; skip /
+                      (js2-add-to-string c)
+                      (when (zerop js2-ts-xml-open-tags-count)
+                        (js2-xml-discard-string)
+                        (throw 'return js2-ERROR))
+                      (setq js2-ts-xml-is-tag-content t)
+                      (decf js2-ts-xml-open-tags-count))
+                     (t
+                      ;; start tag
+                      (setq js2-ts-xml-is-tag-content t)
+                      (incf js2-ts-xml-open-tags-count))))
+                  (?{
+                   (js2-unget-char)
+                   (setq js2-ts-string (js2-get-string-from-buffer))
+                   (throw 'return js2-XML))
+                  (t
+                   (js2-add-to-string c))))))))
+    (setq js2-token-end js2-ts-cursor)
+    result))
+
+(defun js2-read-quoted-string (quote)
+  (let (c)
+    (catch 'return
+      (while (/= (setq c (js2-get-char)) js2-EOF_CHAR)
+        (js2-add-to-string c)
+        (if (eq c quote)
+            (throw 'return t)))
+      (js2-xml-discard-string)  ;; throw away string in progress
+      nil)))
+
+(defun js2-read-xml-comment ()
+  (let ((c (js2-get-char)))
+    (catch 'return
+      (while (/= c js2-EOF_CHAR)
+        (catch 'continue
+          (js2-add-to-string c)
+          (when (and (eq c ?-) (eq ?- (js2-peek-char)))
+            (setq c (js2-get-char))
+            (js2-add-to-string c)
+            (if (eq (js2-peek-char) ?>)
+                (progn
+                  (setq c (js2-get-char)) ;; skip >
+                  (js2-add-to-string c)
+                  (throw 'return t))
+              (throw 'continue nil)))
+          (setq c (js2-get-char))))
+      (js2-xml-discard-string)
+      nil)))
+
+(defun js2-read-cdata ()
+  (let ((c (js2-get-char)))
+    (catch 'return
+      (while (/= c js2-EOF_CHAR)
+        (catch 'continue
+          (js2-add-to-string c)
+          (when (and (eq c ?\]) (eq (js2-peek-char) ?\]))
+            (setq c (js2-get-char))
+            (js2-add-to-string c)
+            (if (eq (js2-peek-char) ?>)
+                (progn
+                  (setq c (js2-get-char)) ;; Skip >
+                  (js2-add-to-string c)
+                  (throw 'return t))
+              (throw 'continue nil)))
+          (setq c (js2-get-char))))
+      (js2-xml-discard-string)
+      nil)))
+
+(defun js2-read-entity ()
+  (let ((decl-tags 1)
+        c)
+    (catch 'return
+      (while (/= js2-EOF_CHAR (setq c (js2-get-char)))
+        (js2-add-to-string c)
+        (case c
+          (?<
+           (incf decl-tags))
+          (?>
+           (decf decl-tags)
+           (if (zerop decl-tags)
+               (throw 'return t)))))
+      (js2-xml-discard-string)
+      nil)))
+
+(defun js2-read-PI ()
+  "Scan an XML processing instruction."
+  (let (c)
+    (catch 'return
+      (while (/= js2-EOF_CHAR (setq c (js2-get-char)))
+        (js2-add-to-string c)
+        (when (and (eq c ??) (eq (js2-peek-char) ?>))
+          (setq c (js2-get-char))  ;; Skip >
+          (js2-add-to-string c)
+          (throw 'return t)))
+      (js2-xml-discard-string)
+      nil)))
+
+;;; Highlighting
+
+(defun js2-set-face (beg end face &optional record)
+  "Fontify a region.  If RECORD is non-nil, record for later."
+  (when (plusp js2-highlight-level)
+    (setq beg (min (point-max) beg)
+          beg (max (point-min) beg)
+          end (min (point-max) end)
+          end (max (point-min) end))
+    (if record
+        (push (list beg end face) js2-mode-fontifications)
+      (put-text-property beg end 'font-lock-face face))))
+
+(defsubst js2-clear-face (beg end)
+  (remove-text-properties beg end '(font-lock-face nil
+                                    help-echo nil
+                                    point-entered nil
+                                    c-in-sws nil)))
+
+(defconst js2-ecma-global-props
+  (concat "^"
+          (regexp-opt
+           '("Infinity" "NaN" "undefined" "arguments") t)
+          "$")
+  "Value properties of the Ecma-262 Global Object.
+Shown at or above `js2-highlight-level' 2.")
+
+;; might want to add the name "arguments" to this list?
+(defconst js2-ecma-object-props
+  (concat "^"
+          (regexp-opt
+           '("prototype" "__proto__" "__parent__") t)
+          "$")
+  "Value properties of the Ecma-262 Object constructor.
+Shown at or above `js2-highlight-level' 2.")
+
+(defconst js2-ecma-global-funcs
+  (concat
+   "^"
+   (regexp-opt
+    '("decodeURI" "decodeURIComponent" "encodeURI" "encodeURIComponent"
+      "eval" "isFinite" "isNaN" "parseFloat" "parseInt") t)
+   "$")
+  "Function properties of the Ecma-262 Global object.
+Shown at or above `js2-highlight-level' 2.")
+
+(defconst js2-ecma-number-props
+  (concat "^"
+          (regexp-opt '("MAX_VALUE" "MIN_VALUE" "NaN"
+                        "NEGATIVE_INFINITY"
+                        "POSITIVE_INFINITY") t)
+          "$")
+  "Properties of the Ecma-262 Number constructor.
+Shown at or above `js2-highlight-level' 2.")
+
+(defconst js2-ecma-date-props "^\\(parse\\|UTC\\)$"
+  "Properties of the Ecma-262 Date constructor.
+Shown at or above `js2-highlight-level' 2.")
+
+(defconst js2-ecma-math-props
+  (concat "^"
+          (regexp-opt
+           '("E" "LN10" "LN2" "LOG2E" "LOG10E" "PI" "SQRT1_2" "SQRT2")
+           t)
+          "$")
+  "Properties of the Ecma-262 Math object.
+Shown at or above `js2-highlight-level' 2.")
+
+(defconst js2-ecma-math-funcs
+  (concat "^"
+          (regexp-opt
+           '("abs" "acos" "asin" "atan" "atan2" "ceil" "cos" "exp" "floor"
+             "log" "max" "min" "pow" "random" "round" "sin" "sqrt" "tan") t)
+          "$")
+  "Function properties of the Ecma-262 Math object.
+Shown at or above `js2-highlight-level' 2.")
+
+(defconst js2-ecma-function-props
+  (concat
+   "^"
+   (regexp-opt
+    '(;; properties of the Object prototype object
+      "hasOwnProperty" "isPrototypeOf" "propertyIsEnumerable"
+      "toLocaleString" "toString" "valueOf"
+      ;; properties of the Function prototype object
+      "apply" "call"
+      ;; properties of the Array prototype object
+      "concat" "join" "pop" "push" "reverse" "shift" "slice" "sort"
+      "splice" "unshift"
+      ;; properties of the String prototype object
+      "charAt" "charCodeAt" "fromCharCode" "indexOf" "lastIndexOf"
+      "localeCompare" "match" "replace" "search" "split" "substring"
+      "toLocaleLowerCase" "toLocaleUpperCase" "toLowerCase"
+      "toUpperCase"
+      ;; properties of the Number prototype object
+      "toExponential" "toFixed" "toPrecision"
+      ;; properties of the Date prototype object
+      "getDate" "getDay" "getFullYear" "getHours" "getMilliseconds"
+      "getMinutes" "getMonth" "getSeconds" "getTime"
+      "getTimezoneOffset" "getUTCDate" "getUTCDay" "getUTCFullYear"
+      "getUTCHours" "getUTCMilliseconds" "getUTCMinutes" "getUTCMonth"
+      "getUTCSeconds" "setDate" "setFullYear" "setHours"
+      "setMilliseconds" "setMinutes" "setMonth" "setSeconds" "setTime"
+      "setUTCDate" "setUTCFullYear" "setUTCHours" "setUTCMilliseconds"
+      "setUTCMinutes" "setUTCMonth" "setUTCSeconds" "toDateString"
+      "toLocaleDateString" "toLocaleString" "toLocaleTimeString"
+      "toTimeString" "toUTCString"
+      ;; properties of the RegExp prototype object
+      "exec" "test"
+      ;; properties of the JSON prototype object
+      "parse" "stringify"
+      ;; SpiderMonkey/Rhino extensions, versions 1.5+
+      "toSource" "__defineGetter__" "__defineSetter__"
+      "__lookupGetter__" "__lookupSetter__" "__noSuchMethod__"
+      "every" "filter" "forEach" "lastIndexOf" "map" "some")
+    t)
+   "$")
+  "Built-in functions defined by Ecma-262 and SpiderMonkey extensions.
+Shown at or above `js2-highlight-level' 3.")
+
+(defun js2-parse-highlight-prop-get (parent target prop call-p)
+  (let ((target-name (and target
+                          (js2-name-node-p target)
+                          (js2-name-node-name target)))
+        (prop-name (if prop (js2-name-node-name prop)))
+        (level1 (>= js2-highlight-level 1))
+        (level2 (>= js2-highlight-level 2))
+        (level3 (>= js2-highlight-level 3))
+        pos face)
+    (when level2
+      (if call-p
+          (cond
+           ((and target prop)
+            (cond
+             ((and level3 (string-match js2-ecma-function-props prop-name))
+              (setq face 'font-lock-builtin-face))
+             ((and target-name prop)
+              (cond
+               ((string= target-name "Date")
+                (if (string-match js2-ecma-date-props prop-name)
+                    (setq face 'font-lock-builtin-face)))
+               ((string= target-name "Math")
+                (if (string-match js2-ecma-math-funcs prop-name)
+                    (setq face 'font-lock-builtin-face)))))))
+           (prop
+            (if (string-match js2-ecma-global-funcs prop-name)
+                (setq face 'font-lock-builtin-face))))
+        (cond
+         ((and target prop)
+          (cond
+           ((string= target-name "Number")
+            (if (string-match js2-ecma-number-props prop-name)
+                (setq face 'font-lock-constant-face)))
+           ((string= target-name "Math")
+            (if (string-match js2-ecma-math-props prop-name)
+                (setq face 'font-lock-constant-face)))))
+         (prop
+          (if (string-match js2-ecma-object-props prop-name)
+              (setq face 'font-lock-constant-face)))))
+      (when face
+        (js2-set-face (setq pos (+ (js2-node-pos parent) ; absolute
+                                   (js2-node-pos prop))) ; relative
+                      (+ pos (js2-node-len prop))
+                      face 'record)))))
+
+(defun js2-parse-highlight-member-expr-node (node)
+  "Perform syntax highlighting of EcmaScript built-in properties.
+The variable `js2-highlight-level' governs this highighting."
+  (let (face target prop name pos end parent call-p callee)
+    (cond
+     ;; case 1:  simple name, e.g. foo
+     ((js2-name-node-p node)
+      (setq name (js2-name-node-name node))
+      ;; possible for name to be nil in rare cases - saw it when
+      ;; running js2-mode on an elisp buffer.  Might as well try to
+      ;; make it so js2-mode never barfs.
+      (when name
+        (setq face (if (string-match js2-ecma-global-props name)
+                       'font-lock-constant-face))
+        (when face
+          (setq pos (js2-node-pos node)
+                end (+ pos (js2-node-len node)))
+          (js2-set-face pos end face 'record))))
+     ;; case 2:  property access or function call
+     ((or (js2-prop-get-node-p node)
+          ;; highlight function call if expr is a prop-get node
+          ;; or a plain name (i.e. unqualified function call)
+          (and (setq call-p (js2-call-node-p node))
+               (setq callee (js2-call-node-target node)) ; separate setq!
+               (or (js2-prop-get-node-p callee)
+                   (js2-name-node-p callee))))
+      (setq parent node
+            node (if call-p callee node))
+      (if (and call-p (js2-name-node-p callee))
+          (setq prop callee)
+        (setq target (js2-prop-get-node-left node)
+              prop (js2-prop-get-node-right node)))
+      (cond
+       ((js2-name-node-p target)
+        (if (js2-name-node-p prop)
+            ;; case 2a:  simple target, simple prop name, e.g. foo.bar
+            (js2-parse-highlight-prop-get parent target prop call-p)
+          ;; case 2b:  simple target, complex name, e.g. foo.x[y]
+          (js2-parse-highlight-prop-get parent target nil call-p)))
+       ((js2-name-node-p prop)
+        ;; case 2c:  complex target, simple name, e.g. x[y].bar
+        (js2-parse-highlight-prop-get parent target prop call-p)))))))
+
+(defun js2-parse-highlight-member-expr-fn-name (expr)
+  "Highlight the `baz' in function foo.bar.baz(args) {...}.
+This is experimental Rhino syntax.  EXPR is the foo.bar.baz member expr.
+We currently only handle the case where the last component is a prop-get
+of a simple name.  Called before EXPR has a parent node."
+  (let (pos
+        (name (and (js2-prop-get-node-p expr)
+                   (js2-prop-get-node-right expr))))
+    (when (js2-name-node-p name)
+      (js2-set-face (setq pos (+ (js2-node-pos expr)  ; parent is absolute
+                                 (js2-node-pos name)))
+                    (+ pos (js2-node-len name))
+                    'font-lock-function-name-face
+                    'record))))
+
+;; source:  http://jsdoc.sourceforge.net/
+;; Note - this syntax is for Google's enhanced jsdoc parser that
+;; allows type specifications, and needs work before entering the wild.
+
+(defconst js2-jsdoc-param-tag-regexp
+  (concat "^\\s-*\\*+\\s-*\\(@"
+          "\\(?:param\\|argument\\)"
+          "\\)"
+          "\\s-*\\({[^}]+}\\)?"         ; optional type
+          "\\s-*\\[?\\([a-zA-Z0-9_$\.]+\\)?\\]?"  ; name
+          "\\>")
+  "Matches jsdoc tags with optional type and optional param name.")
+
+(defconst js2-jsdoc-typed-tag-regexp
+  (concat "^\\s-*\\*+\\s-*\\(@\\(?:"
+          (regexp-opt
+           '("enum"
+             "extends"
+             "field"
+             "id"
+             "implements"
+             "lends"
+             "mods"
+             "requires"
+             "return"
+             "returns"
+             "throw"
+             "throws"))
+          "\\)\\)\\s-*\\({[^}]+}\\)?")
+  "Matches jsdoc tags with optional type.")
+
+(defconst js2-jsdoc-arg-tag-regexp
+  (concat "^\\s-*\\*+\\s-*\\(@\\(?:"
+          (regexp-opt
+           '("alias"
+             "augments"
+             "borrows"
+             "bug"
+             "base"
+             "config"
+             "default"
+             "define"
+             "exception"
+             "function"
+             "member"
+             "memberOf"
+             "name"
+             "namespace"
+             "property"
+             "since"
+             "suppress"
+             "this"
+             "throws"
+             "type"
+             "version"))
+          "\\)\\)\\s-+\\([^ \t]+\\)")
+  "Matches jsdoc tags with a single argument.")
+
+(defconst js2-jsdoc-empty-tag-regexp
+  (concat "^\\s-*\\*+\\s-*\\(@\\(?:"
+          (regexp-opt
+           '("addon"
+             "author"
+             "class"
+             "const"
+             "constant"
+             "constructor"
+             "constructs"
+             "deprecated"
+             "desc"
+             "description"
+             "event"
+             "example"
+             "exec"
+             "export"
+             "fileoverview"
+             "final"
+             "function"
+             "hidden"
+             "ignore"
+             "implicitCast"
+             "inheritDoc"
+             "inner"
+             "interface"
+             "license"
+             "noalias"
+             "noshadow"
+             "notypecheck"
+             "override"
+             "owner"
+             "preserve"
+             "preserveTry"
+             "private"
+             "protected"
+             "public"
+             "static"
+             "supported"
+             ))
+          "\\)\\)\\s-*")
+  "Matches empty jsdoc tags.")
+
+(defconst js2-jsdoc-link-tag-regexp
+  "{\\(@\\(?:link\\|code\\)\\)\\s-+\\([^#}\n]+\\)\\(#.+\\)?}"
+  "Matches a jsdoc link or code tag.")
+
+(defconst js2-jsdoc-see-tag-regexp
+  "^\\s-*\\*+\\s-*\\(@see\\)\\s-+\\([^#}\n]+\\)\\(#.+\\)?"
+  "Matches a jsdoc @see tag.")
+
+(defconst js2-jsdoc-html-tag-regexp
+  "\\(</?\\)\\([a-zA-Z]+\\)\\s-*\\(/?>\\)"
+  "Matches a simple (no attributes) html start- or end-tag.")
+
+(defun js2-jsdoc-highlight-helper ()
+  (js2-set-face (match-beginning 1)
+                (match-end 1)
+                'js2-jsdoc-tag)
+  (if (match-beginning 2)
+      (if (save-excursion
+            (goto-char (match-beginning 2))
+            (= (char-after) ?{))
+          (js2-set-face (1+ (match-beginning 2))
+                        (1- (match-end 2))
+                        'js2-jsdoc-type)
+        (js2-set-face (match-beginning 2)
+                      (match-end 2)
+                      'js2-jsdoc-value)))
+  (if (match-beginning 3)
+      (js2-set-face (match-beginning 3)
+                    (match-end 3)
+                    'js2-jsdoc-value)))
+
+(defun js2-highlight-jsdoc (ast)
+  "Highlight doc comment tags."
+  (let ((comments (js2-ast-root-comments ast))
+        beg end)
+    (save-excursion
+      (dolist (node comments)
+        (when (eq (js2-comment-node-format node) 'jsdoc)
+          (setq beg (js2-node-abs-pos node)
+                end (+ beg (js2-node-len node)))
+          (save-restriction
+            (narrow-to-region beg end)
+            (dolist (re (list js2-jsdoc-param-tag-regexp
+                              js2-jsdoc-typed-tag-regexp
+                              js2-jsdoc-arg-tag-regexp
+                              js2-jsdoc-link-tag-regexp
+                              js2-jsdoc-see-tag-regexp
+                              js2-jsdoc-empty-tag-regexp))
+              (goto-char beg)
+              (while (re-search-forward re nil t)
+                (js2-jsdoc-highlight-helper)))
+            ;; simple highlighting for html tags
+            (goto-char beg)
+            (while (re-search-forward js2-jsdoc-html-tag-regexp nil t)
+              (js2-set-face (match-beginning 1)
+                            (match-end 1)
+                            'js2-jsdoc-html-tag-delimiter)
+              (js2-set-face (match-beginning 2)
+                            (match-end 2)
+                            'js2-jsdoc-html-tag-name)
+              (js2-set-face (match-beginning 3)
+                            (match-end 3)
+                            'js2-jsdoc-html-tag-delimiter))))))))
+
+(defun js2-highlight-assign-targets (node left right)
+  "Highlight function properties and external variables."
+  (let (leftpos end name)
+    ;; highlight vars and props assigned function values
+    (when (js2-function-node-p right)
+      (cond
+       ;; var foo = function() {...}
+       ((js2-name-node-p left)
+        (setq name left))
+       ;; foo.bar.baz = function() {...}
+       ((and (js2-prop-get-node-p left)
+             (js2-name-node-p (js2-prop-get-node-right left)))
+        (setq name (js2-prop-get-node-right left))))
+      (when name
+        (js2-set-face (setq leftpos (js2-node-abs-pos name))
+                      (+ leftpos (js2-node-len name))
+                      'font-lock-function-name-face
+                      'record)))))
+
+(defun js2-record-name-node (node)
+  "Saves NODE to `js2-recorded-identifiers' to check for undeclared variables
+later. NODE must be a name node."
+  (let (leftpos end)
+    (push (list node js2-current-scope
+                (setq leftpos (js2-node-abs-pos node))
+                (setq end (+ leftpos (js2-node-len node))))
+          js2-recorded-identifiers)))
+
+(defun js2-highlight-undeclared-vars ()
+  "After entire parse is finished, look for undeclared variable references.
+We have to wait until entire buffer is parsed, since JavaScript permits var
+decls to occur after they're used.
+
+If any undeclared var name is in `js2-externs' or `js2-additional-externs',
+it is considered declared."
+  (let (name)
+    (dolist (entry js2-recorded-identifiers)
+      (destructuring-bind (name-node scope pos end) entry
+        (setq name (js2-name-node-name name-node))
+        (unless (or (member name js2-global-externs)
+                    (member name js2-default-externs)
+                    (member name js2-additional-externs)
+                    (js2-get-defining-scope scope name))
+          (js2-report-warning "msg.undeclared.variable" name pos (- end pos)
+                              'js2-external-variable))))
+    (setq js2-recorded-identifiers nil)))
+
+(defun js2-set-default-externs ()
+  "Set the value of `js2-default-externs' based on the various
+`js2-include-?-externs' variables."
+  (setq js2-default-externs
+        (append js2-ecma-262-externs
+                (if js2-include-browser-externs js2-browser-externs)
+                (if js2-include-rhino-externs js2-rhino-externs)
+                (if js2-include-node-externs js2-node-externs)
+                (if (or js2-include-browser-externs js2-include-node-externs)
+                    js2-typed-array-externs))))
+
+(defun js2-apply-jslint-globals ()
+  (setq js2-additional-externs
+        (nconc (js2-get-jslint-globals)
+               js2-additional-externs)))
+
+(defun js2-get-jslint-globals ()
+  (loop for node in (js2-ast-root-comments js2-mode-ast)
+        when (and (eq 'block (js2-comment-node-format node))
+                  (save-excursion
+                    (goto-char (js2-node-abs-pos node))
+                    (looking-at "/\\*global ")))
+        append (js2-get-jslint-globals-in
+                (match-end 0)
+                (js2-node-abs-end node))))
+
+(defun js2-get-jslint-globals-in (beg end)
+  (let (res)
+    (save-excursion
+      (goto-char beg)
+      (while (re-search-forward js2-mode-identifier-re end t)
+        (let ((match (match-string 0)))
+          (unless (member match '("true" "false"))
+            (push match res)))))
+    (nreverse res)))
+
+;;; IMenu support
+
+;; We currently only support imenu, but eventually should support speedbar and
+;; possibly other browsing mechanisms.
+
+;; The basic strategy is to identify function assignment targets of the form
+;; `foo.bar.baz', convert them to (list fn foo bar baz <position>), and push the
+;; list into `js2-imenu-recorder'.  The lists are merged into a trie-like tree
+;; for imenu after parsing is finished.
+
+;; A `foo.bar.baz' assignment target may be expressed in many ways in
+;; JavaScript, and the general problem is undecidable.  However, several forms
+;; are readily recognizable at parse-time; the forms we attempt to recognize
+;; include:
+
+;;  function foo()  -- function declaration
+;;  foo = function()  -- function expression assigned to variable
+;;  foo.bar.baz = function()  -- function expr assigned to nested property-get
+;;  foo = {bar: function()}  -- fun prop in object literal assigned to var
+;;  foo = {bar: {baz: function()}} -- inside nested object literal
+;;  foo.bar = {baz: function()}} -- obj lit assigned to nested prop get
+;;  a.b = {c: {d: function()}} -- nested obj lit assigned to nested prop get
+;;  foo = {get bar() {...}}  -- getter/setter in obj literal
+;;  function foo() {function bar() {...}}  -- nested function
+;;  foo['a'] = function()  -- fun expr assigned to deterministic element-get
+
+;; This list boils down to a few forms that can be combined recursively.
+;; Top-level named function declarations include both the left-hand (name)
+;; and the right-hand (function value) expressions needed to produce an imenu
+;; entry.  The other "right-hand" forms we need to look for are:
+;;  - functions declared as props/getters/setters in object literals
+;;  - nested named function declarations
+;; The "left-hand" expressions that functions can be assigned to include:
+;;  - local/global variables
+;;  - nested property-get expressions like a.b.c.d
+;;  - element gets like foo[10] or foo['bar'] where the index
+;;    expression can be trivially converted to a property name.  They
+;;    effectively then become property gets.
+
+;; All the different definition types are canonicalized into the form
+;; foo.bar.baz = position-of-function-keyword
+
+;; We need to build a trie-like structure for imenu.  As an example,
+;; consider the following JavaScript code:
+
+;; a = function() {...}  // function at position 5
+;; b = function() {...}  // function at position 25
+;; foo = function() {...} // function at position 100
+;; foo.bar = function() {...} // function at position 200
+;; foo.bar.baz = function() {...} // function at position 300
+;; foo.bar.zab = function() {...} // function at position 400
+
+;; During parsing we accumulate an entry for each definition in
+;; the variable `js2-imenu-recorder', like so:
+
+;; '((fn a 5)
+;;   (fn b 25)
+;;   (fn foo 100)
+;;   (fn foo bar 200)
+;;   (fn foo bar baz 300)
+;;   (fn foo bar zab 400))
+
+;; Where 'fn' is the respective function node.
+;; After parsing these entries are merged into this alist-trie:
+
+;; '((a . 1)
+;;   (b . 2)
+;;   (foo (<definition> . 3)
+;;        (bar (<definition> . 6)
+;;             (baz . 100)
+;;             (zab . 200))))
+
+;; Note the wacky need for a <definition> name.  The token can be anything
+;; that isn't a valid JavaScript identifier, because you might make foo
+;; a function and then start setting properties on it that are also functions.
+
+(defun js2-prop-node-name (node)
+  "Return the name of a node that may be a property-get/property-name.
+If NODE is not a valid name-node, string-node or integral number-node,
+returns nil.  Otherwise returns the string name/value of the node."
+  (cond
+   ((js2-name-node-p node)
+    (js2-name-node-name node))
+   ((js2-string-node-p node)
+    (js2-string-node-value node))
+   ((and (js2-number-node-p node)
+         (string-match "^[0-9]+$" (js2-number-node-value node)))
+    (js2-number-node-value node))
+   ((js2-this-node-p node)
+    "this")))
+
+(defun js2-node-qname-component (node)
+  "Return the name of this node, if it contributes to a qname.
+Returns nil if the node doesn't contribute."
+  (copy-sequence
+   (or (js2-prop-node-name node)
+       (if (and (js2-function-node-p node)
+                (js2-function-node-name node))
+           (js2-name-node-name (js2-function-node-name node))))))
+
+(defun js2-record-imenu-entry (fn-node qname pos)
+  "Add an entry to `js2-imenu-recorder'.
+FN-NODE should be the current item's function node.
+
+Associate FN-NODE with its QNAME for later lookup.
+This is used in postprocessing the chain list.  For each chain, we find
+the parent function, look up its qname, then prepend a copy of it to the chain."
+  (push (cons fn-node (append qname (list pos))) js2-imenu-recorder)
+  (unless js2-imenu-function-map
+    (setq js2-imenu-function-map (make-hash-table :test 'eq)))
+  (puthash fn-node qname js2-imenu-function-map))
+
+(defun js2-record-imenu-functions (node &optional var)
+  "Record function definitions for imenu.
+NODE is a function node or an object literal.
+VAR, if non-nil, is the expression that NODE is being assigned to.
+When passed arguments of wrong type, does nothing."
+  (when js2-parse-ide-mode
+    (let ((fun-p (js2-function-node-p node))
+          qname left fname-node pos)
+      (cond
+       ;; non-anonymous function declaration?
+       ((and fun-p
+             (not var)
+             (setq fname-node (js2-function-node-name node)))
+        (js2-record-imenu-entry node (list fname-node) (js2-node-pos node)))
+       ;; for remaining forms, compute left-side tree branch first
+       ((and var (setq qname (js2-compute-nested-prop-get var)))
+        (cond
+         ;; foo.bar.baz = function
+         (fun-p
+          (js2-record-imenu-entry node qname (js2-node-pos node)))
+         ;; foo.bar.baz = object-literal
+         ;; look for nested functions:  {a: {b: function() {...} }}
+         ((js2-object-node-p node)
+          ;; Node position here is still absolute, since the parser
+          ;; passes the assignment target and value expressions
+          ;; to us before they are added as children of the assignment node.
+          (js2-record-object-literal node qname (js2-node-pos node)))))))))
+
+(defun js2-compute-nested-prop-get (node)
+  "If NODE is of form foo.bar, foo['bar'], or any nested combination, return
+component nodes as a list.  Otherwise return nil.  Element-gets are treated
+as property-gets if the index expression is a string, or a positive integer."
+  (let (left right head)
+    (cond
+     ((or (js2-name-node-p node)
+          (js2-this-node-p node))
+      (list node))
+     ;; foo.bar.baz is parenthesized as (foo.bar).baz => right operand is a leaf
+     ((js2-prop-get-node-p node)        ; foo.bar
+      (setq left (js2-prop-get-node-left node)
+            right (js2-prop-get-node-right node))
+      (if (setq head (js2-compute-nested-prop-get left))
+          (nconc head (list right))))
+     ((js2-elem-get-node-p node)        ; foo['bar'] or foo[101]
+      (setq left (js2-elem-get-node-target node)
+            right (js2-elem-get-node-element node))
+      (if (or (js2-string-node-p right)      ; ['bar']
+              (and (js2-number-node-p right) ; [10]
+                   (string-match "^[0-9]+$"
+                                 (js2-number-node-value right))))
+          (if (setq head (js2-compute-nested-prop-get left))
+              (nconc head (list right))))))))
+
+(defun js2-record-object-literal (node qname pos)
+  "Recursively process an object literal looking for functions.
+NODE is an object literal that is the right-hand child of an assignment
+expression.  QNAME is a list of nodes representing the assignment target,
+e.g. for foo.bar.baz = {...}, QNAME is (foo-node bar-node baz-node).
+POS is the absolute position of the node.
+We do a depth-first traversal of NODE.  For any functions we find,
+we append the property name to QNAME, then call `js2-record-imenu-entry'."
+  (let (left right prop-qname)
+    (dolist (e (js2-object-node-elems node))  ; e is a `js2-object-prop-node'
+      (let ((left (js2-infix-node-left e))
+            ;; Element positions are relative to the parent position.
+            (pos (+ pos (js2-node-pos e))))
+        (cond
+         ;; foo: function() {...}
+         ((js2-function-node-p (setq right (js2-infix-node-right e)))
+          (when (js2-prop-node-name left)
+            ;; As a policy decision, we record the position of the property,
+            ;; not the position of the `function' keyword, since the property
+            ;; is effectively the name of the function.
+            (js2-record-imenu-entry right (append qname (list left)) pos)))
+         ;; foo: {object-literal} -- add foo to qname, offset position, and recurse
+         ((js2-object-node-p right)
+          (js2-record-object-literal right
+                                     (append qname (list (js2-infix-node-left e)))
+                                     (+ pos (js2-node-pos right)))))))))
+
+(defun js2-node-top-level-decl-p (node)
+  "Return t if NODE's name is defined in the top-level scope.
+Also returns t if NODE's name is not defined in any scope, since it implies
+that it's an external variable, which must also be in the top-level scope."
+  (let* ((name (js2-prop-node-name node))
+         (this-scope (js2-node-get-enclosing-scope node))
+         defining-scope)
+    (cond
+     ((js2-this-node-p node)
+      nil)
+     ((null this-scope)
+      t)
+     ((setq defining-scope (js2-get-defining-scope this-scope name))
+      (js2-ast-root-p defining-scope))
+     (t t))))
+
+(defun js2-wrapper-function-p (node)
+  "Return t if NODE is a function expression that's immediately invoked.
+NODE must be `js2-function-node'."
+  (let ((parent (js2-node-parent node)))
+    (or
+     ;; function(){...}();
+     (js2-call-node-p parent)
+     (and (js2-paren-node-p parent)
+          ;; (function(){...})();
+          (or (js2-call-node-p (setq parent (js2-node-parent parent)))
+              ;; (function(){...}).call(this);
+              (and (js2-prop-get-node-p parent)
+                   (member (js2-name-node-name (js2-prop-get-node-right parent))
+                           '("call" "apply"))
+                   (js2-call-node-p (js2-node-parent parent))))))))
+
+(defun js2-browse-postprocess-chains (entries)
+  "Modify function-declaration name chains after parsing finishes.
+Some of the information is only available after the parse tree is complete.
+For instance, processing a nested scope requires a parent function node."
+  (let (result head fn current-fn parent-qname qname p elem)
+    (dolist (entry entries)
+      ;; function node goes first
+      (destructuring-bind (current-fn &rest (&whole chain head &rest)) entry
+        ;; Examine head's defining scope:
+        ;; Pre-processed chain, or top-level/external, keep as-is.
+        (if (or (stringp head) (js2-node-top-level-decl-p head))
+            (push chain result)
+          (when (js2-this-node-p head)
+            (setq chain (cdr chain))) ; discard this-node
+          (when (setq fn (js2-node-parent-script-or-fn current-fn))
+            (setq parent-qname (gethash fn js2-imenu-function-map 'not-found))
+            (when (eq parent-qname 'not-found)
+              ;; anonymous function expressions are not recorded
+              ;; during the parse, so we need to handle this case here
+              (setq parent-qname
+                    (if (js2-wrapper-function-p fn)
+                        (let ((grandparent (js2-node-parent-script-or-fn fn)))
+                          (if (js2-ast-root-p grandparent)
+                              nil
+                            (gethash grandparent js2-imenu-function-map 'skip)))
+                      'skip))
+              (puthash fn parent-qname js2-imenu-function-map))
+            (unless (eq parent-qname 'skip)
+              ;; prefix parent fn qname to this chain.
+              (let ((qname (append parent-qname chain)))
+                (puthash current-fn (butlast qname) js2-imenu-function-map)
+                (push qname result)))))))
+    ;; finally replace each node in each chain with its name.
+    (dolist (chain result)
+      (setq p chain)
+      (while p
+        (if (js2-node-p (setq elem (car p)))
+            (setcar p (js2-node-qname-component elem)))
+        (setq p (cdr p))))
+    result))
+
+;; Merge name chains into a trie-like tree structure of nested lists.
+;; To simplify construction of the trie, we first build it out using the rule
+;; that the trie consists of lists of pairs.  Each pair is a 2-element array:
+;; [key, num-or-list].  The second element can be a number; if so, this key
+;; is a leaf-node with only one value.  (I.e. there is only one declaration
+;; associated with the key at this level.)  Otherwise the second element is
+;; a list of pairs, with the rule applied recursively.  This symmetry permits
+;; a simple recursive formulation.
+;;
+;; js2-mode is building the data structure for imenu.  The imenu documentation
+;; claims that it's the structure above, but in practice it wants the children
+;; at the same list level as the key for that level, which is how I've drawn
+;; the "Expected final result" above.  We'll postprocess the trie to remove the
+;; list wrapper around the children at each level.
+;;
+;; A completed nested imenu-alist entry looks like this:
+;;       '(("foo"
+;;          ("<definition>" . 7)
+;;          ("bar"
+;;           ("a" . 40)
+;;           ("b" . 60))))
+;;
+;; In particular, the documentation for `imenu--index-alist' says that
+;; a nested sub-alist element looks like (INDEX-NAME SUB-ALIST).
+;; The sub-alist entries immediately follow INDEX-NAME, the head of the list.
+
+(defun js2-treeify (lst)
+  "Convert (a b c d) to (a ((b ((c d)))))."
+  (if (null (cddr lst))  ; list length <= 2
+      lst
+    (list (car lst) (list (js2-treeify (cdr lst))))))
+
+(defun js2-build-alist-trie (chains trie)
+  "Merge declaration name chains into a trie-like alist structure for imenu.
+CHAINS is the qname chain list produced during parsing. TRIE is a
+list of elements built up so far."
+  (let (head tail pos branch kids)
+    (dolist (chain chains)
+      (setq head (car chain)
+            tail (cdr chain)
+            pos (if (numberp (car tail)) (car tail))
+            branch (js2-find-if (lambda (n)
+                                  (string= (car n) head))
+                                trie)
+            kids (second branch))
+      (cond
+       ;; case 1:  this key isn't in the trie yet
+       ((null branch)
+        (if trie
+            (setcdr (last trie) (list (js2-treeify chain)))
+          (setq trie (list (js2-treeify chain)))))
+       ;; case 2:  key is present with a single number entry:  replace w/ list
+       ;;  ("a1" 10)  +  ("a1" 20) => ("a1" (("<definition>" 10)
+       ;;                                    ("<definition>" 20)))
+       ((numberp kids)
+        (setcar (cdr branch)
+                (list (list "<definition-1>" kids)
+                      (if pos
+                          (list "<definition-2>" pos)
+                        (js2-treeify tail)))))
+       ;; case 3:  key is there (with kids), and we're a number entry
+       (pos
+        (setcdr (last kids)
+                (list
+                 (list (format "<definition-%d>"
+                               (1+ (loop for kid in kids
+                                         count (eq ?< (aref (car kid) 0)))))
+                       pos))))
+       ;; case 4:  key is there with kids, need to merge in our chain
+       (t
+        (js2-build-alist-trie (list tail) kids))))
+    trie))
+
+(defun js2-flatten-trie (trie)
+  "Convert TRIE to imenu-format.
+Recurses through nodes, and for each one whose second element is a list,
+appends the list's flattened elements to the current element.  Also
+changes the tails into conses.  For instance, this pre-flattened trie
+
+'(a ((b 20)
+     (c ((d 30)
+         (e 40)))))
+
+becomes
+
+'(a (b . 20)
+    (c (d . 30)
+       (e . 40)))
+
+Note that the root of the trie has no key, just a list of chains.
+This is also true for the value of any key with multiple children,
+e.g. key 'c' in the example above."
+  (cond
+   ((listp (car trie))
+    (mapcar #'js2-flatten-trie trie))
+   (t
+    (if (numberp (second trie))
+        (cons (car trie) (second trie))
+      ;; else pop list and append its kids
+      (apply #'append (list (car trie)) (js2-flatten-trie (cdr trie)))))))
+
+(defun js2-build-imenu-index ()
+  "Turn `js2-imenu-recorder' into an imenu data structure."
+  (unless (eq js2-imenu-recorder 'empty)
+    (let* ((chains (js2-browse-postprocess-chains js2-imenu-recorder))
+           (result (js2-build-alist-trie chains nil)))
+      (js2-flatten-trie result))))
+
+(defun js2-test-print-chains (chains)
+  "Print a list of qname chains.
+Each element of CHAINS is a list of the form (NODE [NODE *] pos);
+i.e. one or more nodes, and an integer position as the list tail."
+  (mapconcat (lambda (chain)
+               (concat "("
+                       (mapconcat (lambda (elem)
+                                    (if (js2-node-p elem)
+                                        (or (js2-node-qname-component elem)
+                                            "nil")
+                                      (number-to-string elem)))
+                                  chain
+                                  " ")
+                       ")"))
+             chains
+             "\n"))
+
+;;; Parser
+
+(defconst js2-version "1.8.5"
+  "Version of JavaScript supported.")
+
+(defmacro js2-record-face (face)
+  "Record a style run of FACE for the current token."
+  `(js2-set-face js2-token-beg js2-token-end ,face 'record))
+
+(defsubst js2-node-end (n)
+  "Computes the absolute end of node N.
+Use with caution!  Assumes `js2-node-pos' is -absolute-, which
+is only true until the node is added to its parent; i.e., while parsing."
+  (+ (js2-node-pos n)
+     (js2-node-len n)))
+
+(defun js2-record-comment ()
+  "Record a comment in `js2-scanned-comments'."
+  (push (make-js2-comment-node :len (- js2-token-end js2-token-beg)
+                               :format js2-ts-comment-type)
+        js2-scanned-comments)
+  (when js2-parse-ide-mode
+    (js2-record-face (if (eq js2-ts-comment-type 'jsdoc)
+                         'font-lock-doc-face
+                       'font-lock-comment-face))
+    (when (memq js2-ts-comment-type '(html preprocessor))
+      ;; Tell cc-engine the bounds of the comment.
+      (js2-record-text-property js2-token-beg (1- js2-token-end) 'c-in-sws t))))
+
+;; This function is called depressingly often, so it should be fast.
+;; Most of the time it's looking at the same token it peeked before.
+(defun js2-peek-token ()
+  "Return the next token without consuming it.
+If previous token was consumed, calls scanner to get new token.
+If previous token was -not- consumed, returns it (idempotent).
+
+This function will not return a newline (js2-EOL) - instead, it
+gobbles newlines until it finds a non-newline token, and flags
+that token as appearing just after a newline.
+
+This function will also not return a js2-COMMENT.  Instead, it
+records comments found in `js2-scanned-comments'.  If the token
+returned by this function immediately follows a jsdoc comment,
+the token is flagged as such.
+
+Note that this function always returned the un-flagged token!
+The flags, if any, are saved in `js2-current-flagged-token'."
+  (if (/= js2-current-flagged-token js2-EOF) ; last token not consumed
+      js2-current-token  ; most common case - return already-peeked token
+    (let ((tt (js2-get-token))          ; call scanner
+          saw-eol
+          face)
+      ;; process comments and whitespace
+      (while (or (= tt js2-EOL)
+                 (= tt js2-COMMENT))
+        (if (= tt js2-EOL)
+            (setq saw-eol t)
+          (setq saw-eol nil)
+          (if js2-record-comments
+              (js2-record-comment)))
+        (setq tt (js2-get-token)))  ; call scanner
+      (setq js2-current-token tt
+            js2-current-flagged-token (if saw-eol
+                                          (logior tt js2-ti-after-eol)
+                                        tt))
+      ;; perform lexical fontification as soon as token is scanned
+      (when js2-parse-ide-mode
+        (cond
+         ((minusp tt)
+          (js2-record-face 'js2-error))
+         ((setq face (aref js2-kwd-tokens tt))
+          (js2-record-face face))
+         ((and (= tt js2-NAME)
+               (equal js2-ts-string "undefined"))
+          (js2-record-face 'font-lock-constant-face))))
+      tt)))  ; return unflagged token
+
+(defun js2-peek-flagged-token ()
+  "Return the current token along with any flags set for it."
+  (js2-peek-token)
+  js2-current-flagged-token)
+
+(defsubst js2-consume-token ()
+  (setq js2-current-flagged-token js2-EOF))
+
+(defun js2-next-token ()
+  (prog1
+      (js2-peek-token)
+    (js2-consume-token)))
+
+(defun js2-next-flagged-token ()
+  (js2-peek-token)
+  (prog1 js2-current-flagged-token
+    (js2-consume-token)))
+
+(defun js2-match-token (match)
+  "Consume and return t if next token matches MATCH, a bytecode.
+Returns nil and consumes nothing if MATCH is not the next token."
+  (if (/= (js2-peek-token) match)
+      nil
+    (js2-consume-token)
+    t))
+
+(defun js2-match-contextual-kwd (name)
+  "Consume and return t if next token is `js2-NAME', and its
+string is NAME.  Returns nil and does nothing otherwise."
+  (if (or (/= (js2-peek-token) js2-NAME)
+          (not (string= js2-ts-string name)))
+      nil
+    (js2-consume-token)
+    (js2-record-face 'font-lock-keyword-face)
+    t))
+
+(defun js2-valid-prop-name-token (tt)
+  (or (= tt js2-NAME)
+      (when (and js2-allow-keywords-as-property-names
+                 (plusp tt)
+                 (aref js2-kwd-tokens tt))
+        (js2-save-name-token-data js2-token-beg (js2-token-name tt))
+        t)))
+
+(defun js2-match-prop-name ()
+  "Consume token and return t if next token is a valid property name.
+It's valid if it's a js2-NAME, or `js2-allow-keywords-as-property-names'
+is non-nil and it's a keyword token."
+  (if (js2-valid-prop-name-token (js2-peek-token))
+      (progn
+        (js2-consume-token)
+        t)
+    nil))
+
+(defun js2-must-match-prop-name (msg-id &optional pos len)
+  (if (js2-match-prop-name)
+      t
+    (js2-report-error msg-id nil pos len)
+    nil))
+
+(defun js2-peek-token-or-eol ()
+  "Return js2-EOL if the current token immediately follows a newline.
+Else returns the current token.  Used in situations where we don't
+consider certain token types valid if they are preceded by a newline.
+One example is the postfix ++ or -- operator, which has to be on the
+same line as its operand."
+  (let ((tt (js2-peek-token)))
+    ;; Check for last peeked token flags
+    (if (js2-flag-set-p js2-current-flagged-token js2-ti-after-eol)
+        js2-EOL
+      tt)))
+
+(defun js2-set-check-for-label ()
+  (assert (= (logand js2-current-flagged-token js2-clear-ti-mask) js2-NAME))
+  (js2-set-flag js2-current-flagged-token js2-ti-check-label))
+
+(defun js2-must-match (token msg-id &optional pos len)
+  "Match next token to token code TOKEN, or record a syntax error.
+MSG-ID is the error message to report if the match fails.
+Returns t on match, nil if no match."
+  (if (js2-match-token token)
+      t
+    (js2-report-error msg-id nil pos len)
+    nil))
+
+(defsubst js2-inside-function ()
+  (plusp js2-nesting-of-function))
+
+(defun js2-set-requires-activation ()
+  (if (js2-function-node-p js2-current-script-or-fn)
+      (setf (js2-function-node-needs-activation js2-current-script-or-fn) t)))
+
+(defun js2-check-activation-name (name token)
+  (when (js2-inside-function)
+    ;; skip language-version 1.2 check from Rhino
+    (if (or (string= "arguments" name)
+            (and js2-compiler-activation-names  ; only used in codegen
+                 (gethash name js2-compiler-activation-names)))
+        (js2-set-requires-activation))))
+
+(defun js2-set-is-generator ()
+  (if (js2-function-node-p js2-current-script-or-fn)
+      (setf (js2-function-node-is-generator js2-current-script-or-fn) t)))
+
+(defun js2-must-have-xml ()
+  (unless js2-compiler-xml-available
+    (js2-report-error "msg.XML.not.available")))
+
+(defun js2-push-scope (scope)
+  "Push SCOPE, a `js2-scope', onto the lexical scope chain."
+  (assert (js2-scope-p scope))
+  (assert (null (js2-scope-parent-scope scope)))
+  (assert (not (eq js2-current-scope scope)))
+  (setf (js2-scope-parent-scope scope) js2-current-scope
+        js2-current-scope scope))
+
+(defsubst js2-pop-scope ()
+  (setq js2-current-scope
+        (js2-scope-parent-scope js2-current-scope)))
+
+(defun js2-enter-loop (loop-node)
+  (push loop-node js2-loop-set)
+  (push loop-node js2-loop-and-switch-set)
+  (js2-push-scope loop-node)
+  ;; Tell the current labeled statement (if any) its statement,
+  ;; and set the jump target of the first label to the loop.
+  ;; These are used in `js2-parse-continue' to verify that the
+  ;; continue target is an actual labeled loop.  (And for codegen.)
+  (when js2-labeled-stmt
+    (setf (js2-labeled-stmt-node-stmt js2-labeled-stmt) loop-node
+          (js2-label-node-loop (car (js2-labeled-stmt-node-labels
+                                     js2-labeled-stmt))) loop-node)))
+
+(defun js2-exit-loop ()
+  (pop js2-loop-set)
+  (pop js2-loop-and-switch-set)
+  (js2-pop-scope))
+
+(defsubst js2-enter-switch (switch-node)
+  (push switch-node js2-loop-and-switch-set))
+
+(defsubst js2-exit-switch ()
+  (pop js2-loop-and-switch-set))
+
+(defun js2-parse (&optional buf cb)
+  "Tell the js2 parser to parse a region of JavaScript.
+
+BUF is a buffer or buffer name containing the code to parse.
+Call `narrow-to-region' first to parse only part of the buffer.
+
+The returned AST root node is given some additional properties:
+  `node-count' - total number of nodes in the AST
+  `buffer' - BUF.  The buffer it refers to may change or be killed,
+             so the value is not necessarily reliable.
+
+An optional callback CB can be specified to report parsing
+progress.  If `(functionp CB)' returns t, it will be called with
+the current line number once before parsing begins, then again
+each time the lexer reaches a new line number.
+
+CB can also be a list of the form `(symbol cb ...)' to specify
+multiple callbacks with different criteria.  Each symbol is a
+criterion keyword, and the following element is the callback to
+call
+
+  :line  - called whenever the line number changes
+  :token - called for each new token consumed
+
+The list of criteria could be extended to include entering or
+leaving a statement, an expression, or a function definition."
+  (if (and cb (not (functionp cb)))
+      (error "criteria callbacks not yet implemented"))
+  (let ((inhibit-point-motion-hooks t)
+        (js2-compiler-xml-available (>= js2-language-version 160))
+        ;; This is a recursive-descent parser, so give it a big stack.
+        (max-lisp-eval-depth (max max-lisp-eval-depth 3000))
+        (max-specpdl-size (max max-specpdl-size 3000))
+        (case-fold-search nil)
+        ast)
+    (message nil)  ; clear any error message from previous parse
+    (with-current-buffer (or buf (current-buffer))
+      (setq js2-scanned-comments nil
+            js2-parsed-errors nil
+            js2-parsed-warnings nil
+            js2-imenu-recorder nil
+            js2-imenu-function-map nil
+            js2-label-set nil)
+      (js2-init-scanner)
+      (setq ast (with-silent-modifications
+                  (js2-do-parse)))
+      (unless js2-ts-hit-eof
+        (js2-report-error "msg.got.syntax.errors" (length js2-parsed-errors)))
+      (setf (js2-ast-root-errors ast) js2-parsed-errors
+            (js2-ast-root-warnings ast) js2-parsed-warnings)
+      ;; if we didn't find any declarations, put a dummy in this list so we
+      ;; don't end up re-parsing the buffer in `js2-mode-create-imenu-index'
+      (unless js2-imenu-recorder
+        (setq js2-imenu-recorder 'empty))
+      (run-hooks 'js2-parse-finished-hook)
+      ast)))
+
+;; Corresponds to Rhino's Parser.parse() method.
+(defun js2-do-parse ()
+  "Parse current buffer starting from current point.
+Scanner should be initialized."
+  (let ((pos js2-ts-cursor)
+        (end js2-ts-cursor)  ; in case file is empty
+        root n tt)
+    ;; initialize buffer-local parsing vars
+    (setf root (make-js2-ast-root :buffer (buffer-name) :pos pos)
+          js2-current-script-or-fn root
+          js2-current-scope root
+          js2-current-flagged-token js2-EOF
+          js2-nesting-of-function 0
+          js2-labeled-stmt nil
+          js2-recorded-identifiers nil)  ; for js2-highlight
+    (while (/= (setq tt (js2-peek-token)) js2-EOF)
+      (if (= tt js2-FUNCTION)
+          (progn
+            (js2-consume-token)
+            (setq n (js2-parse-function (if js2-called-by-compile-function
+                                            'FUNCTION_EXPRESSION
+                                          'FUNCTION_STATEMENT))))
+        ;; not a function - parse a statement
+        (setq n (js2-parse-statement)))
+      ;; add function or statement to script
+      (setq end (js2-node-end n))
+      (js2-block-node-push root n))
+    ;; add comments to root in lexical order
+    (when js2-scanned-comments
+      ;; if we find a comment beyond end of normal kids, use its end
+      (setq end (max end (js2-node-end (first js2-scanned-comments))))
+      (dolist (comment js2-scanned-comments)
+        (push comment (js2-ast-root-comments root))
+        (js2-node-add-children root comment)))
+    (setf (js2-node-len root) (- end pos))
+    (setq js2-mode-ast root)  ; Make sure this is available for callbacks.
+    ;; Give extensions a chance to muck with things before highlighting starts.
+    (let ((js2-additional-externs js2-additional-externs))
+      (save-excursion
+        (run-hooks 'js2-post-parse-callbacks))
+      (js2-highlight-undeclared-vars))
+    root))
+
+(defun js2-function-parser ()
+  (js2-consume-token)
+  (js2-parse-function 'FUNCTION_EXPRESSION_STATEMENT))
+
+(defun js2-parse-function-closure-body (fn-node)
+  "Parse a JavaScript 1.8 function closure body."
+  (let ((js2-nesting-of-function (1+ js2-nesting-of-function)))
+    (if js2-ts-hit-eof
+        (js2-report-error "msg.no.brace.body" nil
+                          (js2-node-pos fn-node)
+                          (- js2-ts-cursor (js2-node-pos fn-node)))
+      (js2-node-add-children fn-node
+                             (setf (js2-function-node-body fn-node)
+                                   (js2-parse-expr t))))))
+
+(defun js2-parse-function-body (fn-node)
+  (js2-must-match js2-LC "msg.no.brace.body"
+                  (js2-node-pos fn-node)
+                  (- js2-ts-cursor (js2-node-pos fn-node)))
+  (let ((pos js2-token-beg)         ; LC position
+        (pn (make-js2-block-node))  ; starts at LC position
+        tt
+        end)
+    (incf js2-nesting-of-function)
+    (unwind-protect
+        (while (not (or (= (setq tt (js2-peek-token)) js2-ERROR)
+                        (= tt js2-EOF)
+                        (= tt js2-RC)))
+          (js2-block-node-push pn (if (/= tt js2-FUNCTION)
+                                      (js2-parse-statement)
+                                    (js2-consume-token)
+                                    (js2-parse-function 'FUNCTION_STATEMENT))))
+      (decf js2-nesting-of-function))
+    (setq end js2-token-end)  ; assume no curly and leave at current token
+    (if (js2-must-match js2-RC "msg.no.brace.after.body" pos)
+        (setq end js2-token-end))
+    (setf (js2-node-pos pn) pos
+          (js2-node-len pn) (- end pos))
+    (setf (js2-function-node-body fn-node) pn)
+    (js2-node-add-children fn-node pn)
+    pn))
+
+(defun js2-define-destruct-symbols (node decl-type face &optional ignore-not-in-block)
+  "Declare and fontify destructuring parameters inside NODE.
+NODE is either `js2-array-node', `js2-object-node', or `js2-name-node'."
+  (cond
+   ((js2-name-node-p node)
+    (let (leftpos)
+      (js2-define-symbol decl-type (js2-name-node-name node)
+                         node ignore-not-in-block)
+      (when face
+        (js2-set-face (setq leftpos (js2-node-abs-pos node))
+                      (+ leftpos (js2-node-len node))
+                      face 'record))))
+   ((js2-object-node-p node)
+    (dolist (elem (js2-object-node-elems node))
+      (js2-define-destruct-symbols
+       (if (js2-object-prop-node-p elem)
+           (js2-object-prop-node-right elem)
+         ;; abbreviated destructuring {a, b}
+         elem)
+       decl-type face ignore-not-in-block)))
+   ((js2-array-node-p node)
+    (dolist (elem (js2-array-node-elems node))
+      (when elem
+        (js2-define-destruct-symbols elem decl-type face ignore-not-in-block))))
+   (t (js2-report-error "msg.no.parm" nil (js2-node-abs-pos node)
+                        (js2-node-len node)))))
+
+(defun js2-parse-function-params (fn-node pos)
+  (if (js2-match-token js2-RP)
+      (setf (js2-function-node-rp fn-node) (- js2-token-beg pos))
+    (let (params len param default-found rest-param-at)
+      (loop for tt = (js2-peek-token)
+            do
+            (cond
+             ;; destructuring param
+             ((or (= tt js2-LB) (= tt js2-LC))
+              (when default-found
+                (js2-report-error "msg.no.default.after.default.param"))
+              (setq param (js2-parse-destruct-primary-expr))
+              (js2-define-destruct-symbols param
+                                           js2-LP
+                                           'js2-function-param)
+              (push param params))
+             ;; variable name
+             (t
+              (when (and (>= js2-language-version 200)
+                         (js2-match-token js2-TRIPLEDOT)
+                         (not rest-param-at))
+                ;; to report errors if there are more parameters
+                (setq rest-param-at (length params)))
+              (js2-must-match js2-NAME "msg.no.parm")
+              (js2-record-face 'js2-function-param)
+              (setq param (js2-create-name-node))
+              (js2-define-symbol js2-LP js2-ts-string param)
+              ;; default parameter value
+              (when (or (and default-found
+                             (not rest-param-at)
+                             (js2-must-match js2-ASSIGN
+                                             "msg.no.default.after.default.param"
+                                             (js2-node-pos param)
+                                             (js2-node-len param)))
+                        (and (>= js2-language-version 200)
+                             (js2-match-token js2-ASSIGN)))
+                (let* ((pos (js2-node-pos param))
+                       (tt js2-current-token)
+                       (op-pos (- js2-token-beg pos))
+                       (left param)
+                       (right (js2-parse-assign-expr))
+                       (len (- (js2-node-end right) pos)))
+                  (setq param (make-js2-assign-node
+                               :type tt :pos pos :len len :op-pos op-pos
+                               :left left :right right)
+                        default-found t)
+                  (js2-node-add-children param left right)))
+              (push param params)))
+            (when (and rest-param-at (> (length params) (1+ rest-param-at)))
+              (js2-report-error "msg.param.after.rest" nil
+                                (js2-node-pos param) (js2-node-len param)))
+            while
+            (js2-match-token js2-COMMA))
+      (when (js2-must-match js2-RP "msg.no.paren.after.parms")
+        (setf (js2-function-node-rp fn-node) (- js2-token-beg pos)))
+      (when rest-param-at
+        (setf (js2-function-node-rest-p fn-node) t))
+      (dolist (p params)
+        (js2-node-add-children fn-node p)
+        (push p (js2-function-node-params fn-node))))))
+
+(defun js2-check-inconsistent-return-warning (fn-node name)
+  "Possibly show inconsistent-return warning.
+Last token scanned is the close-curly for the function body."
+  (when (and js2-mode-show-strict-warnings
+             js2-strict-inconsistent-return-warning
+             (not (js2-has-consistent-return-usage
+                   (js2-function-node-body fn-node))))
+    ;; Have it extend from close-curly to bol or beginning of block.
+    (let ((pos (save-excursion
+                 (goto-char js2-token-end)
+                 (max (js2-node-abs-pos (js2-function-node-body fn-node))
+                      (point-at-bol))))
+          (end js2-token-end))
+      (if (plusp (js2-name-node-length name))
+          (js2-add-strict-warning "msg.no.return.value"
+                                  (js2-name-node-name name) pos end)
+        (js2-add-strict-warning "msg.anon.no.return.value" nil pos end)))))
+
+(defun js2-parse-function (function-type)
+  "Function parser.  FUNCTION-TYPE is a symbol."
+  (let ((pos js2-token-beg)  ; start of 'function' keyword
+        name name-beg name-end fn-node lp
+        (synthetic-type function-type)
+        member-expr-node)
+    ;; parse function name, expression, or non-name (anonymous)
+    (cond
+     ;; function foo(...)
+     ((js2-match-token js2-NAME)
+      (setq name (js2-create-name-node t)
+            name-beg js2-token-beg
+            name-end js2-token-end)
+      (unless (js2-match-token js2-LP)
+        (when js2-allow-member-expr-as-function-name
+          ;; function foo.bar(...)
+          (setq member-expr-node name
+                name nil
+                member-expr-node (js2-parse-member-expr-tail
+                                  nil member-expr-node)))
+        (js2-must-match js2-LP "msg.no.paren.parms")))
+     ((js2-match-token js2-LP)
+      nil)  ; anonymous function:  leave name as null
+     (t
+      ;; function random-member-expr(...)
+      (when js2-allow-member-expr-as-function-name
+        ;; Note that memberExpr can not start with '(' like
+        ;; in function (1+2).toString(), because 'function (' already
+        ;; processed as anonymous function
+        (setq member-expr-node (js2-parse-member-expr)))
+      (js2-must-match js2-LP "msg.no.paren.parms")))
+    (if (= js2-current-token js2-LP)  ; eventually matched LP?
+        (setq lp js2-token-beg))
+    (if member-expr-node
+        (progn
+          (setq synthetic-type 'FUNCTION_EXPRESSION)
+          (js2-parse-highlight-member-expr-fn-name member-expr-node))
+      (if name
+          (js2-set-face name-beg name-end
+                        'font-lock-function-name-face 'record)))
+    (if (and (not (eq synthetic-type 'FUNCTION_EXPRESSION))
+             (plusp (js2-name-node-length name)))
+        ;; Function statements define a symbol in the enclosing scope
+        (js2-define-symbol js2-FUNCTION (js2-name-node-name name) fn-node))
+    (setf fn-node (make-js2-function-node :pos pos
+                                          :name name
+                                          :form function-type
+                                          :lp (if lp (- lp pos))))
+    (if (or (js2-inside-function) (plusp js2-nesting-of-with))
+        ;; 1. Nested functions are not affected by the dynamic scope flag
+        ;;    as dynamic scope is already a parent of their scope.
+        ;; 2. Functions defined under the with statement also immune to
+        ;;    this setup, in which case dynamic scope is ignored in favor
+        ;;    of the with object.
+        (setf (js2-function-node-ignore-dynamic fn-node) t))
+    ;; dynamically bind all the per-function variables
+    (let ((js2-current-script-or-fn fn-node)
+          (js2-current-scope fn-node)
+          (js2-nesting-of-with 0)
+          (js2-end-flags 0)
+          js2-label-set
+          js2-loop-set
+          js2-loop-and-switch-set)
+      (js2-parse-function-params fn-node pos)
+      (if (and (>= js2-language-version 180)
+               (/= (js2-peek-token) js2-LC))
+          (js2-parse-function-closure-body fn-node)
+        (js2-parse-function-body fn-node))
+      (if name
+          (js2-node-add-children fn-node name))
+      (js2-check-inconsistent-return-warning fn-node name)
+      ;; Function expressions define a name only in the body of the
+      ;; function, and only if not hidden by a parameter name
+      (if (and name
+               (eq synthetic-type 'FUNCTION_EXPRESSION)
+               (null (js2-scope-get-symbol js2-current-scope
+                                           (js2-name-node-name name))))
+          (js2-define-symbol js2-FUNCTION
+                             (js2-name-node-name name)
+                             fn-node))
+      (if (and name
+               (not (eq function-type 'FUNCTION_EXPRESSION)))
+          (js2-record-imenu-functions fn-node)))
+    (setf (js2-node-len fn-node) (- js2-ts-cursor pos)
+          (js2-function-node-member-expr fn-node) member-expr-node)  ; may be nil
+    ;; Rhino doesn't do this, but we need it for finding undeclared vars.
+    ;; We wait until after parsing the function to set its parent scope,
+    ;; since `js2-define-symbol' needs the defining-scope check to stop
+    ;; at the function boundary when checking for redeclarations.
+    (setf (js2-scope-parent-scope fn-node) js2-current-scope)
+    fn-node))
+
+(defun js2-parse-statements (&optional parent)
+  "Parse a statement list.  Last token consumed must be js2-LC.
+
+PARENT can be a `js2-block-node', in which case the statements are
+appended to PARENT.  Otherwise a new `js2-block-node' is created
+and returned.
+
+This function does not match the closing js2-RC: the caller
+matches the RC so it can provide a suitable error message if not
+matched.  This means it's up to the caller to set the length of
+the node to include the closing RC.  The node start pos is set to
+the absolute buffer start position, and the caller should fix it
+up to be relative to the parent node.  All children of this block
+node are given relative start positions and correct lengths."
+  (let ((pn (or parent (make-js2-block-node)))
+        tt)
+    (setf (js2-node-pos pn) js2-token-beg)
+    (while (and (> (setq tt (js2-peek-token)) js2-EOF)
+                (/= tt js2-RC))
+      (js2-block-node-push pn (js2-parse-statement)))
+    pn))
+
+(defun js2-parse-statement ()
+  (let (tt pn beg end)
+    ;; coarse-grained user-interrupt check - needs work
+    (and js2-parse-interruptable-p
+         (zerop (% (incf js2-parse-stmt-count)
+                   js2-statements-per-pause))
+         (input-pending-p)
+         (throw 'interrupted t))
+    (setq pn (js2-statement-helper))
+    ;; no-side-effects warning check
+    (unless (js2-node-has-side-effects pn)
+      (setq end (js2-node-end pn))
+      (save-excursion
+        (goto-char end)
+        (setq beg (max (js2-node-pos pn) (point-at-bol))))
+      (js2-add-strict-warning "msg.no.side.effects" nil beg end))
+    pn))
+
+;; These correspond to the switch cases in Parser.statementHelper
+(defconst js2-parsers
+  (let ((parsers (make-vector js2-num-tokens
+                                #'js2-parse-expr-stmt)))
+    (aset parsers js2-BREAK     #'js2-parse-break)
+    (aset parsers js2-CONST     #'js2-parse-const-var)
+    (aset parsers js2-CONTINUE  #'js2-parse-continue)
+    (aset parsers js2-DEBUGGER  #'js2-parse-debugger)
+    (aset parsers js2-DEFAULT   #'js2-parse-default-xml-namespace)
+    (aset parsers js2-DO        #'js2-parse-do)
+    (aset parsers js2-FOR       #'js2-parse-for)
+    (aset parsers js2-FUNCTION  #'js2-function-parser)
+    (aset parsers js2-IF        #'js2-parse-if)
+    (aset parsers js2-LC        #'js2-parse-block)
+    (aset parsers js2-LET       #'js2-parse-let-stmt)
+    (aset parsers js2-NAME      #'js2-parse-name-or-label)
+    (aset parsers js2-RETURN    #'js2-parse-ret-yield)
+    (aset parsers js2-SEMI      #'js2-parse-semi)
+    (aset parsers js2-SWITCH    #'js2-parse-switch)
+    (aset parsers js2-THROW     #'js2-parse-throw)
+    (aset parsers js2-TRY       #'js2-parse-try)
+    (aset parsers js2-VAR       #'js2-parse-const-var)
+    (aset parsers js2-WHILE     #'js2-parse-while)
+    (aset parsers js2-WITH      #'js2-parse-with)
+    (aset parsers js2-YIELD     #'js2-parse-ret-yield)
+    parsers)
+  "A vector mapping token types to parser functions.")
+
+(defun js2-parse-warn-missing-semi (beg end)
+  (and js2-mode-show-strict-warnings
+       js2-strict-missing-semi-warning
+       (js2-add-strict-warning
+        "msg.missing.semi" nil
+        ;; back up to beginning of statement or line
+        (max beg (save-excursion
+                   (goto-char end)
+                   (point-at-bol)))
+        end)))
+
+(defconst js2-no-semi-insertion
+  (list js2-IF
+        js2-SWITCH
+        js2-WHILE
+        js2-DO
+        js2-FOR
+        js2-TRY
+        js2-WITH
+        js2-LC
+        js2-ERROR
+        js2-SEMI
+        js2-FUNCTION)
+  "List of tokens that don't do automatic semicolon insertion.")
+
+(defconst js2-autoinsert-semi-and-warn
+  (list js2-ERROR js2-EOF js2-RC))
+
+(defun js2-statement-helper ()
+  (let* ((tt (js2-peek-token))
+         (first-tt tt)
+         (beg js2-token-beg)
+         (parser (if (= tt js2-ERROR)
+                     #'js2-parse-semi
+                   (aref js2-parsers tt)))
+         pn
+         tt-flagged)
+    ;; If the statement is set, then it's been told its label by now.
+    (and js2-labeled-stmt
+         (js2-labeled-stmt-node-stmt js2-labeled-stmt)
+         (setq js2-labeled-stmt nil))
+    (setq pn (funcall parser))
+    ;; Don't do auto semi insertion for certain statement types.
+    (unless (or (memq first-tt js2-no-semi-insertion)
+                (js2-labeled-stmt-node-p pn))
+      (js2-auto-insert-semicolon pn))
+    pn))
+
+(defun js2-auto-insert-semicolon (pn)
+  (let* ((tt-flagged (js2-peek-flagged-token))
+         (tt (logand tt-flagged js2-clear-ti-mask))
+         (pos (js2-node-pos pn)))
+      (cond
+       ((= tt js2-SEMI)
+        ;; Consume ';' as a part of expression
+        (js2-consume-token)
+        ;; extend the node bounds to include the semicolon.
+        (setf (js2-node-len pn) (- js2-token-end pos)))
+       ((memq tt js2-autoinsert-semi-and-warn)
+        ;; Autoinsert ;
+        (js2-parse-warn-missing-semi pos (js2-node-end pn)))
+       (t
+        (if (js2-flag-not-set-p tt-flagged js2-ti-after-eol)
+            ;; Report error if no EOL or autoinsert ';' otherwise
+            (js2-report-error "msg.no.semi.stmt")
+          (js2-parse-warn-missing-semi pos (js2-node-end pn)))))))
+
+(defun js2-parse-condition ()
+  "Parse a parenthesized boolean expression, e.g. in an if- or while-stmt.
+The parens are discarded and the expression node is returned.
+The `pos' field of the return value is set to an absolute position
+that must be fixed up by the caller.
+Return value is a list (EXPR LP RP), with absolute paren positions."
+  (let (pn lp rp)
+    (if (js2-must-match js2-LP "msg.no.paren.cond")
+        (setq lp js2-token-beg))
+    (setq pn (js2-parse-expr))
+    (if (js2-must-match js2-RP "msg.no.paren.after.cond")
+        (setq rp js2-token-beg))
+    ;; Report strict warning on code like "if (a = 7) ..."
+    (if (and js2-strict-cond-assign-warning
+             (js2-assign-node-p pn))
+        (js2-add-strict-warning "msg.equal.as.assign" nil
+                                (js2-node-pos pn)
+                                (+ (js2-node-pos pn)
+                                   (js2-node-len pn))))
+    (list pn lp rp)))
+
+(defun js2-parse-if ()
+  "Parser for if-statement.  Last matched token must be js2-IF."
+  (let ((pos js2-token-beg)
+        cond if-true if-false else-pos end pn)
+    (js2-consume-token)
+    (setq cond (js2-parse-condition)
+          if-true (js2-parse-statement)
+          if-false (if (js2-match-token js2-ELSE)
+                       (progn
+                         (setq else-pos (- js2-token-beg pos))
+                         (js2-parse-statement)))
+          end (js2-node-end (or if-false if-true))
+          pn (make-js2-if-node :pos pos
+                               :len (- end pos)
+                               :condition (car cond)
+                               :then-part if-true
+                               :else-part if-false
+                               :else-pos else-pos
+                               :lp (js2-relpos (second cond) pos)
+                               :rp (js2-relpos (third cond) pos)))
+    (js2-node-add-children pn (car cond) if-true if-false)
+    pn))
+
+(defun js2-parse-switch ()
+  "Parser for if-statement.  Last matched token must be js2-SWITCH."
+  (let ((pos js2-token-beg)
+        tt pn discriminant has-default case-expr case-node
+        case-pos cases stmt lp rp)
+    (js2-consume-token)
+    (if (js2-must-match js2-LP "msg.no.paren.switch")
+        (setq lp js2-token-beg))
+    (setq discriminant (js2-parse-expr)
+          pn (make-js2-switch-node :discriminant discriminant
+                                   :pos pos
+                                   :lp (js2-relpos lp pos)))
+    (js2-node-add-children pn discriminant)
+    (js2-enter-switch pn)
+    (unwind-protect
+        (progn
+          (if (js2-must-match js2-RP "msg.no.paren.after.switch")
+              (setf (js2-switch-node-rp pn) (- js2-token-beg pos)))
+          (js2-must-match js2-LC "msg.no.brace.switch")
+          (catch 'break
+            (while t
+              (setq tt (js2-next-token)
+                    case-pos js2-token-beg)
+              (cond
+               ((= tt js2-RC)
+                (setf (js2-node-len pn) (- js2-token-end pos))
+                (throw 'break nil))  ; done
+               ((= tt js2-CASE)
+                (setq case-expr (js2-parse-expr))
+                (js2-must-match js2-COLON "msg.no.colon.case"))
+               ((= tt js2-DEFAULT)
+                (if has-default
+                    (js2-report-error "msg.double.switch.default"))
+                (setq has-default t
+                      case-expr nil)
+                (js2-must-match js2-COLON "msg.no.colon.case"))
+               (t
+                (js2-report-error "msg.bad.switch")
+                (throw 'break nil)))
+              (setq case-node (make-js2-case-node :pos case-pos
+                                                  :len (- js2-token-end case-pos)
+                                                  :expr case-expr))
+              (js2-node-add-children case-node case-expr)
+              (while (and (/= (setq tt (js2-peek-token)) js2-RC)
+                          (/= tt js2-CASE)
+                          (/= tt js2-DEFAULT)
+                          (/= tt js2-EOF))
+                (setf stmt (js2-parse-statement)
+                      (js2-node-len case-node) (- (js2-node-end stmt) case-pos))
+                (js2-block-node-push case-node stmt))
+              (push case-node cases)))
+          ;; add cases last, as pushing reverses the order to be correct
+          (dolist (kid cases)
+            (js2-node-add-children pn kid)
+            (push kid (js2-switch-node-cases pn)))
+          pn)  ; return value
+      (js2-exit-switch))))
+
+(defun js2-parse-while ()
+  "Parser for while-statement.  Last matched token must be js2-WHILE."
+  (let ((pos js2-token-beg)
+        (pn (make-js2-while-node))
+        cond body)
+    (js2-consume-token)
+    (js2-enter-loop pn)
+    (unwind-protect
+        (progn
+          (setf cond (js2-parse-condition)
+                (js2-while-node-condition pn) (car cond)
+                body (js2-parse-statement)
+                (js2-while-node-body pn) body
+                (js2-node-len pn) (- (js2-node-end body) pos)
+                (js2-while-node-lp pn) (js2-relpos (second cond) pos)
+                (js2-while-node-rp pn) (js2-relpos (third cond) pos))
+          (js2-node-add-children pn body (car cond)))
+      (js2-exit-loop))
+    pn))
+
+(defun js2-parse-do ()
+  "Parser for do-statement.  Last matched token must be js2-DO."
+  (let ((pos js2-token-beg)
+        (pn (make-js2-do-node))
+        cond body end)
+    (js2-consume-token)
+    (js2-enter-loop pn)
+    (unwind-protect
+        (progn
+          (setq body (js2-parse-statement))
+          (js2-must-match js2-WHILE "msg.no.while.do")
+          (setf (js2-do-node-while-pos pn) (- js2-token-beg pos)
+                cond (js2-parse-condition)
+                (js2-do-node-condition pn) (car cond)
+                (js2-do-node-body pn) body
+                end js2-ts-cursor
+                (js2-do-node-lp pn) (js2-relpos (second cond) pos)
+                (js2-do-node-rp pn) (js2-relpos (third cond) pos))
+          (js2-node-add-children pn (car cond) body))
+      (js2-exit-loop))
+    ;; Always auto-insert semicolon to follow SpiderMonkey:
+    ;; It is required by ECMAScript but is ignored by the rest of
+    ;; world; see bug 238945
+    (if (js2-match-token js2-SEMI)
+        (setq end js2-ts-cursor))
+    (setf (js2-node-len pn) (- end pos))
+    pn))
+
+(defun js2-parse-for ()
+  "Parser for for-statement.  Last matched token must be js2-FOR.
+Parses for, for-in, and for each-in statements."
+  (let ((for-pos js2-token-beg)
+        pn is-for-each is-for-in-or-of is-for-of
+        in-pos each-pos tmp-pos
+        init  ; Node init is also foo in 'foo in object'
+        cond  ; Node cond is also object in 'foo in object'
+        incr  ; 3rd section of for-loop initializer
+        body tt lp rp)
+    (js2-consume-token)
+    ;; See if this is a for each () instead of just a for ()
+    (when (js2-match-token js2-NAME)
+      (if (string= "each" js2-ts-string)
+          (progn
+            (setq is-for-each t
+                  each-pos (- js2-token-beg for-pos)) ; relative
+            (js2-record-face 'font-lock-keyword-face))
+        (js2-report-error "msg.no.paren.for")))
+    (if (js2-must-match js2-LP "msg.no.paren.for")
+        (setq lp (- js2-token-beg for-pos)))
+    (setq tt (js2-peek-token))
+    ;; 'for' makes local scope
+    (js2-push-scope (make-js2-scope))
+    (unwind-protect
+        ;; parse init clause
+        (let ((js2-in-for-init t))  ; set as dynamic variable
+          (cond
+           ((= tt js2-SEMI)
+            (setq init (make-js2-empty-expr-node)))
+           ((or (= tt js2-VAR) (= tt js2-LET))
+            (js2-consume-token)
+            (setq init (js2-parse-variables tt js2-token-beg)))
+           (t
+            (setq init (js2-parse-expr)))))
+      (if (or (js2-match-token js2-IN)
+              (and (>= js2-language-version 200)
+                   (js2-match-contextual-kwd "of")
+                   (setq is-for-of t)))
+          (setq is-for-in-or-of t
+                in-pos (- js2-token-beg for-pos)
+                ;; scope of iteration target object is not the scope we've created above.
+                ;; stash current scope temporary.
+                cond (let ((js2-current-scope (js2-scope-parent-scope js2-current-scope)))
+                       (js2-parse-expr)))  ; object over which we're iterating
+        ;; else ordinary for loop - parse cond and incr
+        (js2-must-match js2-SEMI "msg.no.semi.for")
+        (setq cond (if (= (js2-peek-token) js2-SEMI)
+                       (make-js2-empty-expr-node) ; no loop condition
+                     (js2-parse-expr)))
+        (js2-must-match js2-SEMI "msg.no.semi.for.cond")
+        (setq tmp-pos js2-token-end
+              incr (if (= (js2-peek-token) js2-RP)
+                       (make-js2-empty-expr-node :pos tmp-pos)
+                     (js2-parse-expr))))
+      (if (js2-must-match js2-RP "msg.no.paren.for.ctrl")
+          (setq rp (- js2-token-beg for-pos)))
+      (if (not is-for-in-or-of)
+          (setq pn (make-js2-for-node :init init
+                                      :condition cond
+                                      :update incr
+                                      :lp lp
+                                      :rp rp))
+        ;; cond could be null if 'in obj' got eaten by the init node.
+        (if (js2-infix-node-p init)
+            ;; it was (foo in bar) instead of (var foo in bar)
+            (setq cond (js2-infix-node-right init)
+                  init (js2-infix-node-left init))
+          (if (and (js2-var-decl-node-p init)
+                   (> (length (js2-var-decl-node-kids init)) 1))
+              (js2-report-error "msg.mult.index")))
+        (setq pn (make-js2-for-in-node :iterator init
+                                       :object cond
+                                       :in-pos in-pos
+                                       :foreach-p is-for-each
+                                       :each-pos each-pos
+                                       :forof-p is-for-of
+                                       :lp lp
+                                       :rp rp)))
+      (unwind-protect
+          (progn
+            (js2-enter-loop pn)
+            ;; We have to parse the body -after- creating the loop node,
+            ;; so that the loop node appears in the js2-loop-set, allowing
+            ;; break/continue statements to find the enclosing loop.
+            (setf body (js2-parse-statement)
+                  (js2-loop-node-body pn) body
+                  (js2-node-pos pn) for-pos
+                  (js2-node-len pn) (- (js2-node-end body) for-pos))
+            (js2-node-add-children pn init cond incr body))
+        ;; finally
+        (js2-exit-loop))
+      (js2-pop-scope))
+    pn))
+
+(defun js2-parse-try ()
+  "Parser for try-statement.  Last matched token must be js2-TRY."
+  (let ((try-pos js2-token-beg)
+        try-end
+        try-block
+        catch-blocks
+        finally-block
+        saw-default-catch
+        peek
+        param
+        catch-cond
+        catch-node
+        guard-kwd
+        catch-pos
+        finally-pos
+        pn
+        block
+        lp
+        rp)
+    (js2-consume-token)
+    (if (/= (js2-peek-token) js2-LC)
+        (js2-report-error "msg.no.brace.try"))
+    (setq try-block (js2-parse-statement)
+          try-end (js2-node-end try-block)
+          peek (js2-peek-token))
+    (cond
+     ((= peek js2-CATCH)
+      (while (js2-match-token js2-CATCH)
+        (setq catch-pos js2-token-beg
+              guard-kwd nil
+              catch-cond nil
+              lp nil
+              rp nil)
+        (if saw-default-catch
+            (js2-report-error "msg.catch.unreachable"))
+        (if (js2-must-match js2-LP "msg.no.paren.catch")
+            (setq lp (- js2-token-beg catch-pos)))
+        (js2-push-scope (make-js2-scope))
+        (let ((tt (js2-peek-token)))
+          (cond
+           ;; destructuring pattern
+           ;;     catch ({ message, file }) { ... }
+           ((or (= tt js2-LB) (= tt js2-LC))
+            (setq param (js2-parse-destruct-primary-expr))
+            (js2-define-destruct-symbols param js2-LET nil))
+           ;; simple name
+           (t
+            (js2-must-match js2-NAME "msg.bad.catchcond")
+            (setq param (js2-create-name-node))
+            (js2-define-symbol js2-LET js2-ts-string param))))
+        ;; pattern guard
+        (if (js2-match-token js2-IF)
+            (setq guard-kwd (- js2-token-beg catch-pos)
+                  catch-cond (js2-parse-expr))
+          (setq saw-default-catch t))
+        (if (js2-must-match js2-RP "msg.bad.catchcond")
+            (setq rp (- js2-token-beg catch-pos)))
+        (js2-must-match js2-LC "msg.no.brace.catchblock")
+        (setq block (js2-parse-statements)
+              try-end (js2-node-end block)
+              catch-node (make-js2-catch-node :pos catch-pos
+                                              :param param
+                                              :guard-expr catch-cond
+                                              :guard-kwd guard-kwd
+                                              :block block
+                                              :lp lp
+                                              :rp rp))
+        (js2-pop-scope)
+        (if (js2-must-match js2-RC "msg.no.brace.after.body")
+            (setq try-end js2-token-beg))
+        (setf (js2-node-len block) (- try-end (js2-node-pos block))
+              (js2-node-len catch-node) (- try-end catch-pos))
+        (js2-node-add-children catch-node param catch-cond block)
+        (push catch-node catch-blocks)))
+     ((/= peek js2-FINALLY)
+      (js2-must-match js2-FINALLY "msg.try.no.catchfinally"
+                      (js2-node-pos try-block)
+                      (- (setq try-end (js2-node-end try-block))
+                         (js2-node-pos try-block)))))
+    (when (js2-match-token js2-FINALLY)
+      (setq finally-pos js2-token-beg
+            block (js2-parse-statement)
+            try-end (js2-node-end block)
+            finally-block (make-js2-finally-node :pos finally-pos
+                                                 :len (- try-end finally-pos)
+                                                 :body block))
+      (js2-node-add-children finally-block block))
+    (setq pn (make-js2-try-node :pos try-pos
+                                :len (- try-end try-pos)
+                                :try-block try-block
+                                :finally-block finally-block))
+    (js2-node-add-children pn try-block finally-block)
+    ;; push them onto the try-node, which reverses and corrects their order
+    (dolist (cb catch-blocks)
+      (js2-node-add-children pn cb)
+      (push cb (js2-try-node-catch-clauses pn)))
+    pn))
+
+(defun js2-parse-throw ()
+  "Parser for throw-statement.  Last matched token must be js2-THROW."
+  (let ((pos js2-token-beg)
+        expr pn)
+    (js2-consume-token)
+    (if (= (js2-peek-token-or-eol) js2-EOL)
+        ;; ECMAScript does not allow new lines before throw expression,
+        ;; see bug 256617
+        (js2-report-error "msg.bad.throw.eol"))
+    (setq expr (js2-parse-expr)
+          pn (make-js2-throw-node :pos pos
+                                  :len (- (js2-node-end expr) pos)
+                                  :expr expr))
+    (js2-node-add-children pn expr)
+    pn))
+
+(defun js2-match-jump-label-name (label-name)
+  "If break/continue specified a label, return that label's labeled stmt.
+Returns the corresponding `js2-labeled-stmt-node', or if LABEL-NAME
+does not match an existing label, reports an error and returns nil."
+  (let ((bundle (cdr (assoc label-name js2-label-set))))
+    (if (null bundle)
+        (js2-report-error "msg.undef.label"))
+    bundle))
+
+(defun js2-parse-break ()
+  "Parser for break-statement.  Last matched token must be js2-BREAK."
+  (let ((pos js2-token-beg)
+        (end js2-token-end)
+        break-target ; statement to break from
+        break-label  ; in "break foo", name-node representing the foo
+        labels       ; matching labeled statement to break to
+        pn)
+    (js2-consume-token)  ; `break'
+    (when (eq (js2-peek-token-or-eol) js2-NAME)
+      (js2-consume-token)
+      (setq break-label (js2-create-name-node)
+            end (js2-node-end break-label)
+            ;; matchJumpLabelName only matches if there is one
+            labels (js2-match-jump-label-name js2-ts-string)
+            break-target (if labels (car (js2-labeled-stmt-node-labels labels)))))
+    (unless (or break-target break-label)
+      ;; no break target specified - try for innermost enclosing loop/switch
+      (if (null js2-loop-and-switch-set)
+          (unless break-label
+            (js2-report-error "msg.bad.break" nil pos (length "break")))
+        (setq break-target (car js2-loop-and-switch-set))))
+    (setq pn (make-js2-break-node :pos pos
+                                  :len (- end pos)
+                                  :label break-label
+                                  :target break-target))
+    (js2-node-add-children pn break-label)  ; but not break-target
+    pn))
+
+(defun js2-parse-continue ()
+  "Parser for continue-statement.  Last matched token must be js2-CONTINUE."
+  (let ((pos js2-token-beg)
+        (end js2-token-end)
+        label   ; optional user-specified label, a `js2-name-node'
+        labels  ; current matching labeled stmt, if any
+        target  ; the `js2-loop-node' target of this continue stmt
+        pn)
+    (js2-consume-token)  ; `continue'
+    (when (= (js2-peek-token-or-eol) js2-NAME)
+      (js2-consume-token)
+      (setq label (js2-create-name-node)
+            end (js2-node-end label)
+            ;; matchJumpLabelName only matches if there is one
+            labels (js2-match-jump-label-name js2-ts-string)))
+    (cond
+     ((null labels)  ; no current label to go to
+      (if (null js2-loop-set)  ; no loop to continue to
+          (js2-report-error "msg.continue.outside" nil pos
+                            (length "continue"))
+        (setq target (car js2-loop-set))))  ; innermost enclosing loop
+     (t
+      (if (js2-loop-node-p (js2-labeled-stmt-node-stmt labels))
+          (setq target (js2-labeled-stmt-node-stmt labels))
+        (js2-report-error "msg.continue.nonloop" nil pos (- end pos)))))
+    (setq pn (make-js2-continue-node :pos pos
+                                     :len (- end pos)
+                                     :label label
+                                     :target target))
+    (js2-node-add-children pn label)  ; but not target - it's not our child
+    pn))
+
+(defun js2-parse-with ()
+  "Parser for with-statement.  Last matched token must be js2-WITH."
+  (js2-consume-token)
+  (let ((pos js2-token-beg)
+        obj body pn lp rp)
+    (if (js2-must-match js2-LP "msg.no.paren.with")
+        (setq lp js2-token-beg))
+    (setq obj (js2-parse-expr))
+    (if (js2-must-match js2-RP "msg.no.paren.after.with")
+        (setq rp js2-token-beg))
+    (let ((js2-nesting-of-with (1+ js2-nesting-of-with)))
+        (setq body (js2-parse-statement)))
+    (setq pn (make-js2-with-node :pos pos
+                                 :len (- (js2-node-end body) pos)
+                                 :object obj
+                                 :body body
+                                 :lp (js2-relpos lp pos)
+                                 :rp (js2-relpos rp pos)))
+    (js2-node-add-children pn obj body)
+    pn))
+
+(defun js2-parse-const-var ()
+  "Parser for var- or const-statement.
+Last matched token must be js2-CONST or js2-VAR."
+  (let ((tt (js2-peek-token))
+        (pos js2-token-beg)
+        expr pn)
+    (js2-consume-token)
+    (setq expr (js2-parse-variables tt js2-token-beg)
+          pn (make-js2-expr-stmt-node :pos pos
+                                      :len (- (js2-node-end expr) pos)
+                                      :expr expr))
+    (js2-node-add-children pn expr)
+    pn))
+
+(defun js2-wrap-with-expr-stmt (pos expr &optional add-child)
+  (let ((pn (make-js2-expr-stmt-node :pos pos
+                                     :len (js2-node-len expr)
+                                     :type (if (js2-inside-function)
+                                               js2-EXPR_VOID
+                                             js2-EXPR_RESULT)
+                                     :expr expr)))
+    (if add-child
+        (js2-node-add-children pn expr))
+    pn))
+
+(defun js2-parse-let-stmt ()
+  "Parser for let-statement.  Last matched token must be js2-LET."
+  (js2-consume-token)
+  (let ((pos js2-token-beg)
+        expr pn)
+    (if (= (js2-peek-token) js2-LP)
+        ;; let expression in statement context
+        (setq expr (js2-parse-let pos 'statement)
+              pn (js2-wrap-with-expr-stmt pos expr t))
+      ;; else we're looking at a statement like let x=6, y=7;
+      (setf expr (js2-parse-variables js2-LET pos)
+            pn (js2-wrap-with-expr-stmt pos expr t)
+            (js2-node-type pn) js2-EXPR_RESULT))
+    pn))
+
+(defun js2-parse-ret-yield ()
+  (js2-parse-return-or-yield (js2-peek-token) nil))
+
+(defconst js2-parse-return-stmt-enders
+  (list js2-SEMI js2-RC js2-EOF js2-EOL js2-ERROR js2-RB js2-RP js2-YIELD))
+
+(defsubst js2-now-all-set (before after mask)
+  "Return whether or not the bits in the mask have changed to all set.
+BEFORE is bits before change, AFTER is bits after change, and MASK is
+the mask for bits.  Returns t if all the bits in the mask are set in AFTER
+but not BEFORE."
+  (and (/= (logand before mask) mask)
+       (= (logand after mask) mask)))
+
+(defun js2-parse-return-or-yield (tt expr-context)
+  (let ((pos js2-token-beg)
+        (end js2-token-end)
+        (before js2-end-flags)
+        (inside-function (js2-inside-function))
+        e ret name)
+    (unless inside-function
+      (js2-report-error (if (eq tt js2-RETURN)
+                            "msg.bad.return"
+                          "msg.bad.yield")))
+    (js2-consume-token)
+    ;; This is ugly, but we don't want to require a semicolon.
+    (unless (memq (js2-peek-token-or-eol) js2-parse-return-stmt-enders)
+      (setq e (js2-parse-expr)
+            end (js2-node-end e)))
+    (cond
+     ((eq tt js2-RETURN)
+      (js2-set-flag js2-end-flags (if (null e)
+                                      js2-end-returns
+                                    js2-end-returns-value))
+      (setq ret (make-js2-return-node :pos pos
+                                      :len (- end pos)
+                                      :retval e))
+      (js2-node-add-children ret e)
+      ;; See if we need a strict mode warning.
+      ;; TODO:  The analysis done by `js2-has-consistent-return-usage' is
+      ;; more thorough and accurate than this before/after flag check.
+      ;; E.g. if there's a finally-block that always returns, we shouldn't
+      ;; show a warning generated by inconsistent returns in the catch blocks.
+      ;; Basically `js2-has-consistent-return-usage' needs to keep more state,
+      ;; so we know which returns/yields to highlight, and we should get rid of
+      ;; all the checking in `js2-parse-return-or-yield'.
+      (if (and js2-strict-inconsistent-return-warning
+               (js2-now-all-set before js2-end-flags
+                                (logior js2-end-returns js2-end-returns-value)))
+          (js2-add-strict-warning "msg.return.inconsistent" nil pos end)))
+     (t
+      (unless (js2-inside-function)
+        (js2-report-error "msg.bad.yield"))
+      (js2-set-flag js2-end-flags js2-end-yields)
+      (setq ret (make-js2-yield-node :pos pos
+                                     :len (- end pos)
+                                     :value e))
+      (js2-node-add-children ret e)
+      (unless expr-context
+        (setq e ret
+              ret (js2-wrap-with-expr-stmt pos e t))
+      (js2-set-requires-activation)
+      (js2-set-is-generator))))
+    ;; see if we are mixing yields and value returns.
+    (when (and inside-function
+               (js2-now-all-set before js2-end-flags
+                                (logior js2-end-yields js2-end-returns-value)))
+      (setq name (js2-function-name js2-current-script-or-fn))
+      (if (zerop (length name))
+          (js2-report-error "msg.anon.generator.returns" nil pos (- end pos))
+        (js2-report-error "msg.generator.returns" name pos (- end pos))))
+    ret))
+
+(defun js2-parse-debugger ()
+  (js2-consume-token)
+  (make-js2-keyword-node :type js2-DEBUGGER))
+
+(defun js2-parse-block ()
+  "Parser for a curly-delimited statement block.
+Last token matched must be `js2-LC'."
+  (let ((pos js2-token-beg)
+        (pn (make-js2-scope)))
+    (js2-consume-token)
+    (js2-push-scope pn)
+    (unwind-protect
+        (progn
+          (js2-parse-statements pn)
+          (js2-must-match js2-RC "msg.no.brace.block")
+          (setf (js2-node-len pn) (- js2-token-end pos)))
+      (js2-pop-scope))
+    pn))
+
+;; For `js2-ERROR' too, to have a node for error recovery to work on.
+(defun js2-parse-semi ()
+  "Parse a statement or handle an error.
+Last matched token is `js2-SEMI' or `js2-ERROR'."
+  (let ((tt (js2-peek-token)) pos len)
+    (js2-consume-token)
+    (if (eq tt js2-SEMI)
+        (make-js2-empty-expr-node :len 1)
+      (setq pos js2-token-beg
+            len (- js2-token-beg pos))
+      (js2-report-error "msg.syntax" nil pos len)
+      (make-js2-error-node :pos pos :len len))))
+
+(defun js2-parse-default-xml-namespace ()
+  "Parse a `default xml namespace = <expr>' e4x statement."
+  (let ((pos js2-token-beg)
+        end len expr unary es)
+    (js2-consume-token)
+    (js2-must-have-xml)
+    (js2-set-requires-activation)
+    (setq len (- js2-ts-cursor pos))
+    (unless (and (js2-match-token js2-NAME)
+                 (string= js2-ts-string "xml"))
+      (js2-report-error "msg.bad.namespace" nil pos len))
+    (unless (and (js2-match-token js2-NAME)
+                 (string= js2-ts-string "namespace"))
+      (js2-report-error "msg.bad.namespace" nil pos len))
+    (unless (js2-match-token js2-ASSIGN)
+      (js2-report-error "msg.bad.namespace" nil pos len))
+    (setq expr (js2-parse-expr)
+          end (js2-node-end expr)
+          unary (make-js2-unary-node :type js2-DEFAULTNAMESPACE
+                                     :pos pos
+                                     :len (- end pos)
+                                     :operand expr))
+    (js2-node-add-children unary expr)
+    (make-js2-expr-stmt-node :pos pos
+                             :len (- end pos)
+                             :expr unary)))
+
+(defun js2-record-label (label bundle)
+  ;; current token should be colon that `js2-parse-primary-expr' left untouched
+  (js2-consume-token)
+  (let ((name (js2-label-node-name label))
+        labeled-stmt
+        dup)
+    (when (setq labeled-stmt (cdr (assoc name js2-label-set)))
+      ;; flag both labels if possible when used in editing mode
+      (if (and js2-parse-ide-mode
+               (setq dup (js2-get-label-by-name labeled-stmt name)))
+          (js2-report-error "msg.dup.label" nil
+                            (js2-node-abs-pos dup) (js2-node-len dup)))
+      (js2-report-error "msg.dup.label" nil
+                        (js2-node-pos label) (js2-node-len label)))
+    (js2-labeled-stmt-node-add-label bundle label)
+    (js2-node-add-children bundle label)
+    ;; Add one reference to the bundle per label in `js2-label-set'
+    (push (cons name bundle) js2-label-set)))
+
+(defun js2-parse-name-or-label ()
+  "Parser for identifier or label.  Last token matched must be js2-NAME.
+Called when we found a name in a statement context.  If it's a label, we gather
+up any following labels and the next non-label statement into a
+`js2-labeled-stmt-node' bundle and return that.  Otherwise we parse an
+expression and return it wrapped in a `js2-expr-stmt-node'."
+  (let ((pos js2-token-beg)
+        (end js2-token-end)
+        expr stmt pn bundle
+        (continue t))
+    ;; set check for label and call down to `js2-parse-primary-expr'
+    (js2-set-check-for-label)
+    (setq expr (js2-parse-expr))
+    (if (/= (js2-node-type expr) js2-LABEL)
+        ;; Parsed non-label expression - wrap with expression stmt.
+        (setq pn (js2-wrap-with-expr-stmt pos expr t))
+      ;; else parsed a label
+      (setq bundle (make-js2-labeled-stmt-node :pos pos))
+      (js2-record-label expr bundle)
+      ;; look for more labels
+      (while (and continue (= (js2-peek-token) js2-NAME))
+        (js2-set-check-for-label)
+        (setq expr (js2-parse-expr))
+        (if (/= (js2-node-type expr) js2-LABEL)
+            (progn
+              (setq stmt (js2-wrap-with-expr-stmt (js2-node-pos expr) expr t)
+                    continue nil)
+              (js2-auto-insert-semicolon stmt))
+          (js2-record-label expr bundle)))
+      ;; no more labels; now parse the labeled statement
+      (unwind-protect
+            (unless stmt
+              (let ((js2-labeled-stmt bundle))  ; bind dynamically
+                (setq stmt (js2-statement-helper))))
+        ;; remove the labels for this statement from the global set
+        (dolist (label (js2-labeled-stmt-node-labels bundle))
+          (setq js2-label-set (remove label js2-label-set))))
+      (setf (js2-labeled-stmt-node-stmt bundle) stmt
+            (js2-node-len bundle) (- (js2-node-end stmt) pos))
+      (js2-node-add-children bundle stmt)
+      bundle)))
+
+(defun js2-parse-expr-stmt ()
+  "Default parser in statement context, if no recognized statement found."
+  (js2-wrap-with-expr-stmt js2-token-beg (js2-parse-expr) t))
+
+(defun js2-parse-variables (decl-type pos)
+  "Parse a comma-separated list of variable declarations.
+Could be a 'var', 'const' or 'let' expression, possibly in a for-loop initializer.
+
+DECL-TYPE is a token value: either VAR, CONST, or LET depending on context.
+For 'var' or 'const', the keyword should be the token last scanned.
+
+POS is the position where the node should start. It's sometimes the
+var/const/let keyword, and other times the beginning of the first token
+in the first variable declaration.
+
+Returns the parsed `js2-var-decl-node' expression node."
+  (let* ((result (make-js2-var-decl-node :decl-type decl-type
+                                         :pos pos))
+         destructuring kid-pos tt init name end nbeg nend vi
+         (continue t))
+    ;; Example:
+    ;; var foo = {a: 1, b: 2}, bar = [3, 4];
+    ;; var {b: s2, a: s1} = foo, x = 6, y, [s3, s4] = bar;
+    ;; var {a, b} = baz;
+    (while continue
+      (setq destructuring nil
+            name nil
+            tt (js2-peek-token)
+            kid-pos js2-token-beg
+            end js2-token-end
+            init nil)
+      (if (or (= tt js2-LB) (= tt js2-LC))
+          ;; Destructuring assignment, e.g., var [a, b] = ...
+          (setq destructuring (js2-parse-destruct-primary-expr)
+                end (js2-node-end destructuring))
+        ;; Simple variable name
+        (when (js2-must-match js2-NAME "msg.bad.var")
+          (setq name (js2-create-name-node)
+                nbeg js2-token-beg
+                nend js2-token-end
+                end nend)
+          (js2-define-symbol decl-type js2-ts-string name js2-in-for-init)))
+      (when (js2-match-token js2-ASSIGN)
+        (setq init (js2-parse-assign-expr)
+              end (js2-node-end init))
+        (js2-record-imenu-functions init name))
+      (when name
+        (js2-set-face nbeg nend (if (js2-function-node-p init)
+                                    'font-lock-function-name-face
+                                  'font-lock-variable-name-face)
+                      'record))
+      (setq vi (make-js2-var-init-node :pos kid-pos
+                                       :len (- end kid-pos)
+                                       :type decl-type))
+      (if destructuring
+          (progn
+            (if (and (null init) (not js2-in-for-init))
+                (js2-report-error "msg.destruct.assign.no.init"))
+            (js2-define-destruct-symbols destructuring
+                                         decl-type
+                                         'font-lock-variable-name-face)
+            (setf (js2-var-init-node-target vi) destructuring))
+        (setf (js2-var-init-node-target vi) name))
+      (setf (js2-var-init-node-initializer vi) init)
+      (js2-node-add-children vi name destructuring init)
+      (js2-block-node-push result vi)
+      (unless (js2-match-token js2-COMMA)
+        (setq continue nil)))
+    (setf (js2-node-len result) (- end pos))
+    result))
+
+(defun js2-parse-let (pos &optional stmt-p)
+  "Parse a let expression or statement.
+A let-expression is of the form `let (vars) expr'.
+A let-statment is of the form `let (vars) {statements}'.
+The third form of let is a variable declaration list, handled
+by `js2-parse-variables'."
+  (let ((pn (make-js2-let-node :pos pos))
+        beg vars body)
+    (if (js2-must-match js2-LP "msg.no.paren.after.let")
+        (setf (js2-let-node-lp pn) (- js2-token-beg pos)))
+    (js2-push-scope pn)
+    (unwind-protect
+        (progn
+          (setq vars (js2-parse-variables js2-LET js2-token-beg))
+          (if (js2-must-match js2-RP "msg.no.paren.let")
+              (setf (js2-let-node-rp pn) (- js2-token-beg pos)))
+          (if (and stmt-p (eq (js2-peek-token) js2-LC))
+              ;; let statement
+              (progn
+                (js2-consume-token)
+                (setf beg js2-token-beg  ; position stmt at LC
+                      body (js2-parse-statements))
+                (js2-must-match js2-RC "msg.no.curly.let")
+                (setf (js2-node-len body) (- js2-token-end beg)
+                      (js2-node-len pn) (- js2-token-end pos)
+                      (js2-let-node-body pn) body
+                      (js2-node-type pn) js2-LET))
+            ;; let expression
+            (setf body (js2-parse-expr)
+                  (js2-node-len pn) (- (js2-node-end body) pos)
+                  (js2-let-node-body pn) body))
+          (js2-node-add-children pn vars body))
+      (js2-pop-scope))
+    pn))
+
+(defun js2-define-new-symbol (decl-type name node &optional scope)
+  (js2-scope-put-symbol (or scope js2-current-scope)
+                        name
+                        (make-js2-symbol decl-type name node)))
+
+(defun js2-define-symbol (decl-type name &optional node ignore-not-in-block)
+  "Define a symbol in the current scope.
+If NODE is non-nil, it is the AST node associated with the symbol."
+  (let* ((defining-scope (js2-get-defining-scope js2-current-scope name))
+         (symbol (if defining-scope
+                     (js2-scope-get-symbol defining-scope name)))
+         (sdt (if symbol (js2-symbol-decl-type symbol) -1)))
+    (cond
+     ((and symbol ; already defined
+           (or (= sdt js2-CONST) ; old version is const
+               (= decl-type js2-CONST) ; new version is const
+               ;; two let-bound vars in this block have same name
+               (and (= sdt js2-LET)
+                    (eq defining-scope js2-current-scope))))
+      (js2-report-error
+       (cond
+        ((= sdt js2-CONST) "msg.const.redecl")
+        ((= sdt js2-LET) "msg.let.redecl")
+        ((= sdt js2-VAR) "msg.var.redecl")
+        ((= sdt js2-FUNCTION) "msg.function.redecl")
+        (t "msg.parm.redecl"))
+       name))
+     ((= decl-type js2-LET)
+      (if (and (not ignore-not-in-block)
+               (or (= (js2-node-type js2-current-scope) js2-IF)
+                   (js2-loop-node-p js2-current-scope)))
+          (js2-report-error "msg.let.decl.not.in.block")
+        (js2-define-new-symbol decl-type name node)))
+     ((or (= decl-type js2-VAR)
+          (= decl-type js2-CONST)
+          (= decl-type js2-FUNCTION))
+      (if symbol
+          (if (and js2-strict-var-redeclaration-warning (= sdt js2-VAR))
+              (js2-add-strict-warning "msg.var.redecl" name)
+            (if (and js2-strict-var-hides-function-arg-warning (= sdt js2-LP))
+                (js2-add-strict-warning "msg.var.hides.arg" name)))
+        (js2-define-new-symbol decl-type name node
+                               js2-current-script-or-fn)))
+     ((= decl-type js2-LP)
+      (if symbol
+          ;; must be duplicate parameter. Second parameter hides the
+          ;; first, so go ahead and add the second pararameter
+          (js2-report-warning "msg.dup.parms" name))
+      (js2-define-new-symbol decl-type name node))
+     (t (js2-code-bug)))))
+
+(defun js2-parse-expr (&optional oneshot)
+  (let* ((pn (js2-parse-assign-expr))
+         (pos (js2-node-pos pn))
+         left
+         right
+         op-pos)
+    (while (and (not oneshot)
+                (js2-match-token js2-COMMA))
+      (setq op-pos (- js2-token-beg pos))  ; relative
+      (if (= (js2-peek-token) js2-YIELD)
+          (js2-report-error "msg.yield.parenthesized"))
+      (setq right (js2-parse-assign-expr)
+            left pn
+            pn (make-js2-infix-node :type js2-COMMA
+                                    :pos pos
+                                    :len (- js2-ts-cursor pos)
+                                    :op-pos op-pos
+                                    :left left
+                                    :right right))
+      (js2-node-add-children pn left right))
+    pn))
+
+(defun js2-parse-assign-expr ()
+  (let ((tt (js2-peek-token))
+        (pos js2-token-beg)
+        pn left right op-pos)
+    (if (= tt js2-YIELD)
+        (js2-parse-return-or-yield tt t)
+      ;; not yield - parse assignment expression
+      (setq pn (js2-parse-cond-expr)
+            tt (js2-peek-token))
+      (when (and (<= js2-first-assign tt)
+                 (<= tt js2-last-assign))
+        ;; tt express assignment (=, |=, ^=, ..., %=)
+        (js2-consume-token)
+        (setq op-pos (- js2-token-beg pos)  ; relative
+              left pn
+              right (js2-parse-assign-expr)
+              pn (make-js2-assign-node :type tt
+                                       :pos pos
+                                       :len (- (js2-node-end right) pos)
+                                       :op-pos op-pos
+                                       :left left
+                                       :right right))
+        (when js2-parse-ide-mode
+          (js2-highlight-assign-targets pn left right)
+          (js2-record-imenu-functions right left))
+        ;; do this last so ide checks above can use absolute positions
+        (js2-node-add-children pn left right))
+      pn)))
+
+(defun js2-parse-cond-expr ()
+  (let ((pos js2-token-beg)
+        (pn (js2-parse-or-expr))
+        test-expr
+        if-true
+        if-false
+        q-pos
+        c-pos)
+    (when (js2-match-token js2-HOOK)
+      (setq q-pos (- js2-token-beg pos)
+            if-true (js2-parse-assign-expr))
+      (js2-must-match js2-COLON "msg.no.colon.cond")
+      (setq c-pos (- js2-token-beg pos)
+            if-false (js2-parse-assign-expr)
+            test-expr pn
+            pn (make-js2-cond-node :pos pos
+                                   :len (- (js2-node-end if-false) pos)
+                                   :test-expr test-expr
+                                   :true-expr if-true
+                                   :false-expr if-false
+                                   :q-pos q-pos
+                                   :c-pos c-pos))
+      (js2-node-add-children pn test-expr if-true if-false))
+    pn))
+
+(defun js2-make-binary (type left parser)
+  "Helper for constructing a binary-operator AST node.
+LEFT is the left-side-expression, already parsed, and the
+binary operator should have just been matched.
+PARSER is a function to call to parse the right operand,
+or a `js2-node' struct if it has already been parsed."
+  (let* ((pos (js2-node-pos left))
+         (op-pos (- js2-token-beg pos))
+         (right (if (js2-node-p parser)
+                    parser
+                  (funcall parser)))
+         (pn (make-js2-infix-node :type type
+                                  :pos pos
+                                  :len (- (js2-node-end right) pos)
+                                  :op-pos op-pos
+                                  :left left
+                                  :right right)))
+    (js2-node-add-children pn left right)
+    pn))
+
+(defun js2-parse-or-expr ()
+  (let ((pn (js2-parse-and-expr)))
+    (when (js2-match-token js2-OR)
+      (setq pn (js2-make-binary js2-OR
+                                pn
+                                'js2-parse-or-expr)))
+    pn))
+
+(defun js2-parse-and-expr ()
+  (let ((pn (js2-parse-bit-or-expr)))
+    (when (js2-match-token js2-AND)
+      (setq pn (js2-make-binary js2-AND
+                                pn
+                                'js2-parse-and-expr)))
+    pn))
+
+(defun js2-parse-bit-or-expr ()
+  (let ((pn (js2-parse-bit-xor-expr)))
+    (while (js2-match-token js2-BITOR)
+      (setq pn (js2-make-binary js2-BITOR
+                                pn
+                                'js2-parse-bit-xor-expr)))
+    pn))
+
+(defun js2-parse-bit-xor-expr ()
+  (let ((pn (js2-parse-bit-and-expr)))
+    (while (js2-match-token js2-BITXOR)
+      (setq pn (js2-make-binary js2-BITXOR
+                                pn
+                                'js2-parse-bit-and-expr)))
+    pn))
+
+(defun js2-parse-bit-and-expr ()
+  (let ((pn (js2-parse-eq-expr)))
+    (while (js2-match-token js2-BITAND)
+      (setq pn (js2-make-binary js2-BITAND
+                                pn
+                                'js2-parse-eq-expr)))
+    pn))
+
+(defconst js2-parse-eq-ops
+  (list js2-EQ js2-NE js2-SHEQ js2-SHNE))
+
+(defun js2-parse-eq-expr ()
+  (let ((pn (js2-parse-rel-expr))
+        tt)
+    (while (memq (setq tt (js2-peek-token)) js2-parse-eq-ops)
+      (js2-consume-token)
+      (setq pn (js2-make-binary tt
+                                pn
+                                'js2-parse-rel-expr)))
+    pn))
+
+(defconst js2-parse-rel-ops
+  (list js2-IN js2-INSTANCEOF js2-LE js2-LT js2-GE js2-GT))
+
+(defun js2-parse-rel-expr ()
+  (let ((pn (js2-parse-shift-expr))
+        (continue t)
+        tt)
+    (while continue
+      (setq tt (js2-peek-token))
+      (cond
+       ((and js2-in-for-init (= tt js2-IN))
+        (setq continue nil))
+       ((memq tt js2-parse-rel-ops)
+        (js2-consume-token)
+        (setq pn (js2-make-binary tt pn 'js2-parse-shift-expr)))
+       (t
+        (setq continue nil))))
+    pn))
+
+(defconst js2-parse-shift-ops
+  (list js2-LSH js2-URSH js2-RSH))
+
+(defun js2-parse-shift-expr ()
+  (let ((pn (js2-parse-add-expr))
+        tt
+        (continue t))
+    (while continue
+      (setq tt (js2-peek-token))
+      (if (memq tt js2-parse-shift-ops)
+          (progn
+            (js2-consume-token)
+            (setq pn (js2-make-binary tt pn 'js2-parse-add-expr)))
+        (setq continue nil)))
+    pn))
+
+(defun js2-parse-add-expr ()
+  (let ((pn (js2-parse-mul-expr))
+        tt
+        (continue t))
+    (while continue
+      (setq tt (js2-peek-token))
+      (if (or (= tt js2-ADD) (= tt js2-SUB))
+          (progn
+            (js2-consume-token)
+            (setq pn (js2-make-binary tt pn 'js2-parse-mul-expr)))
+        (setq continue nil)))
+    pn))
+
+(defconst js2-parse-mul-ops
+  (list js2-MUL js2-DIV js2-MOD))
+
+(defun js2-parse-mul-expr ()
+  (let ((pn (js2-parse-unary-expr))
+        tt
+        (continue t))
+    (while continue
+      (setq tt (js2-peek-token))
+      (if (memq tt js2-parse-mul-ops)
+          (progn
+            (js2-consume-token)
+            (setq pn (js2-make-binary tt pn 'js2-parse-unary-expr)))
+        (setq continue nil)))
+    pn))
+
+(defun js2-make-unary (type parser &rest args)
+  "Make a unary node of type TYPE.
+PARSER is either a node (for postfix operators) or a function to call
+to parse the operand (for prefix operators)."
+  (let* ((pos js2-token-beg)
+         (postfix (js2-node-p parser))
+         (expr (if postfix
+                   parser
+                 (apply parser args)))
+         end
+         pn)
+    (if postfix  ; e.g. i++
+        (setq pos (js2-node-pos expr)
+              end js2-token-end)
+      (setq end (js2-node-end expr)))
+    (setq pn (make-js2-unary-node :type type
+                                  :pos pos
+                                  :len (- end pos)
+                                  :operand expr))
+    (js2-node-add-children pn expr)
+    pn))
+
+(defconst js2-incrementable-node-types
+  (list js2-NAME js2-GETPROP js2-GETELEM js2-GET_REF js2-CALL)
+  "Node types that can be the operand of a ++ or -- operator.")
+
+(defun js2-check-bad-inc-dec (tt beg end unary)
+  (unless (memq (js2-node-type (js2-unary-node-operand unary))
+                js2-incrementable-node-types)
+    (js2-report-error (if (= tt js2-INC)
+                          "msg.bad.incr"
+                        "msg.bad.decr")
+                      nil beg (- end beg))))
+
+(defun js2-parse-unary-expr ()
+  (let ((tt (js2-peek-token))
+        pn expr beg end)
+    (cond
+     ((or (= tt js2-VOID)
+          (= tt js2-NOT)
+          (= tt js2-BITNOT)
+          (= tt js2-TYPEOF))
+      (js2-consume-token)
+      (js2-make-unary tt 'js2-parse-unary-expr))
+     ((= tt js2-ADD)
+      (js2-consume-token)
+      ;; Convert to special POS token in decompiler and parse tree
+      (js2-make-unary js2-POS 'js2-parse-unary-expr))
+     ((= tt js2-SUB)
+      (js2-consume-token)
+      ;; Convert to special NEG token in decompiler and parse tree
+      (js2-make-unary js2-NEG 'js2-parse-unary-expr))
+     ((or (= tt js2-INC)
+          (= tt js2-DEC))
+      (js2-consume-token)
+      (prog1
+          (setq beg js2-token-beg
+                end js2-token-end
+                expr (js2-make-unary tt 'js2-parse-member-expr t))
+        (js2-check-bad-inc-dec tt beg end expr)))
+     ((= tt js2-DELPROP)
+      (js2-consume-token)
+      (js2-make-unary js2-DELPROP 'js2-parse-unary-expr))
+     ((= tt js2-ERROR)
+      (js2-consume-token)
+      (make-js2-error-node))  ; try to continue
+     ((and (= tt js2-LT)
+           js2-compiler-xml-available)
+      ;; XML stream encountered in expression.
+      (js2-consume-token)
+      (js2-parse-member-expr-tail t (js2-parse-xml-initializer)))
+     (t
+      (setq pn (js2-parse-member-expr t)
+            ;; Don't look across a newline boundary for a postfix incop.
+            tt (js2-peek-token-or-eol))
+      (when (or (= tt js2-INC) (= tt js2-DEC))
+        (js2-consume-token)
+        (setf expr pn
+              pn (js2-make-unary tt expr))
+        (js2-node-set-prop pn 'postfix t)
+        (js2-check-bad-inc-dec tt js2-token-beg js2-token-end pn))
+      pn))))
+
+(defun js2-parse-xml-initializer ()
+  "Parse an E4X XML initializer.
+I'm parsing it the way Rhino parses it, but without the tree-rewriting.
+Then I'll postprocess the result, depending on whether we're in IDE
+mode or codegen mode, and generate the appropriate rewritten AST.
+IDE mode uses a rich AST that models the XML structure.  Codegen mode
+just concatenates everything and makes a new XML or XMLList out of it."
+  (let ((tt (js2-get-first-xml-token))
+        pn-xml pn expr kids expr-pos
+        (continue t)
+        (first-token t))
+    (when (not (or (= tt js2-XML) (= tt js2-XMLEND)))
+      (js2-report-error "msg.syntax"))
+    (setq pn-xml (make-js2-xml-node))
+    (while continue
+      (if first-token
+          (setq first-token nil)
+        (setq tt (js2-get-next-xml-token)))
+      (cond
+       ;; js2-XML means we found a {expr} in the XML stream.
+       ;; The js2-ts-string is the XML up to the left-curly.
+       ((= tt js2-XML)
+        (push (make-js2-string-node :pos js2-token-beg
+                                    :len (- js2-ts-cursor js2-token-beg))
+              kids)
+        (js2-must-match js2-LC "msg.syntax")
+        (setq expr-pos js2-ts-cursor
+              expr (if (eq (js2-peek-token) js2-RC)
+                       (make-js2-empty-expr-node :pos expr-pos)
+                     (js2-parse-expr)))
+        (js2-must-match js2-RC "msg.syntax")
+        (setq pn (make-js2-xml-js-expr-node :pos (js2-node-pos expr)
+                                            :len (js2-node-len expr)
+                                            :expr expr))
+        (js2-node-add-children pn expr)
+        (push pn kids))
+       ;; a js2-XMLEND token means we hit the final close-tag.
+       ((= tt js2-XMLEND)
+        (push (make-js2-string-node :pos js2-token-beg
+                                    :len (- js2-ts-cursor js2-token-beg))
+              kids)
+        (dolist (kid (nreverse kids))
+          (js2-block-node-push pn-xml kid))
+        (setf (js2-node-len pn-xml) (- js2-ts-cursor
+                                       (js2-node-pos pn-xml))
+              continue nil))
+       (t
+        (js2-report-error "msg.syntax")
+        (setq continue nil))))
+    pn-xml))
+
+
+(defun js2-parse-argument-list ()
+  "Parse an argument list and return it as a Lisp list of nodes.
+Returns the list in reverse order.  Consumes the right-paren token."
+  (let (result)
+    (unless (js2-match-token js2-RP)
+      (loop do
+            (if (= (js2-peek-token) js2-YIELD)
+                (js2-report-error "msg.yield.parenthesized"))
+            (push (js2-parse-assign-expr) result)
+            while
+            (js2-match-token js2-COMMA))
+      (js2-must-match js2-RP "msg.no.paren.arg")
+      result)))
+
+(defun js2-parse-member-expr (&optional allow-call-syntax)
+  (let ((tt (js2-peek-token))
+        pn pos target args beg end init tail)
+    (if (/= tt js2-NEW)
+        (setq pn (js2-parse-primary-expr))
+      ;; parse a 'new' expression
+      (js2-consume-token)
+      (setq pos js2-token-beg
+            beg pos
+            target (js2-parse-member-expr)
+            end (js2-node-end target)
+            pn (make-js2-new-node :pos pos
+                                  :target target
+                                  :len (- end pos)))
+      (js2-node-add-children pn target)
+      (when (js2-match-token js2-LP)
+        ;; Add the arguments to pn, if any are supplied.
+        (setf beg pos  ; start of "new" keyword
+              pos js2-token-beg
+              args (nreverse (js2-parse-argument-list))
+              (js2-new-node-args pn) args
+              end js2-token-end
+              (js2-new-node-lp pn) (- pos beg)
+              (js2-new-node-rp pn) (- end 1 beg))
+        (apply #'js2-node-add-children pn args))
+      (when (and js2-allow-rhino-new-expr-initializer
+                 (js2-match-token js2-LC))
+        (setf init (js2-parse-object-literal)
+              end (js2-node-end init)
+              (js2-new-node-initializer pn) init)
+        (js2-node-add-children pn init))
+        (setf (js2-node-len pn) (- end beg)))  ; end outer if
+    (js2-parse-member-expr-tail allow-call-syntax pn)))
+
+(defun js2-parse-member-expr-tail (allow-call-syntax pn)
+  "Parse a chain of property/array accesses or function calls.
+Includes parsing for E4X operators like `..' and `.@'.
+If ALLOW-CALL-SYNTAX is nil, stops when we encounter a left-paren.
+Returns an expression tree that includes PN, the parent node."
+  (let ((beg (js2-node-pos pn))
+        tt
+        (continue t))
+    (while continue
+      (setq tt (js2-peek-token))
+      (cond
+       ((or (= tt js2-DOT) (= tt js2-DOTDOT))
+        (setq pn (js2-parse-property-access tt pn)))
+       ((= tt js2-DOTQUERY)
+        (setq pn (js2-parse-dot-query pn)))
+       ((= tt js2-LB)
+        (setq pn (js2-parse-element-get pn)))
+       ((= tt js2-LP)
+        (if allow-call-syntax
+            (setq pn (js2-parse-function-call pn))
+          (setq continue nil)))
+       (t
+        (setq continue nil))))
+    (if (>= js2-highlight-level 2)
+        (js2-parse-highlight-member-expr-node pn))
+    pn))
+
+(defun js2-parse-dot-query (pn)
+  "Parse a dot-query expression, e.g. foo.bar.(@name == 2)
+Last token parsed must be `js2-DOTQUERY'."
+  (let ((pos (js2-node-pos pn))
+        op-pos expr end)
+    (js2-consume-token)
+    (js2-must-have-xml)
+    (js2-set-requires-activation)
+    (setq op-pos js2-token-beg
+          expr (js2-parse-expr)
+          end (js2-node-end expr)
+          pn (make-js2-xml-dot-query-node :left pn
+                                          :pos pos
+                                          :op-pos op-pos
+                                          :right expr))
+    (js2-node-add-children pn
+                           (js2-xml-dot-query-node-left pn)
+                           (js2-xml-dot-query-node-right pn))
+    (if (js2-must-match js2-RP "msg.no.paren")
+        (setf (js2-xml-dot-query-node-rp pn) js2-token-beg
+              end js2-token-end))
+    (setf (js2-node-len pn) (- end pos))
+    pn))
+
+(defun js2-parse-element-get (pn)
+  "Parse an element-get expression, e.g. foo[bar].
+Last token parsed must be `js2-RB'."
+  (let ((lb js2-token-beg)
+        (pos (js2-node-pos pn))
+        rb expr)
+    (js2-consume-token)
+    (setq expr (js2-parse-expr))
+    (if (js2-must-match js2-RB "msg.no.bracket.index")
+        (setq rb js2-token-beg))
+    (setq pn (make-js2-elem-get-node :target pn
+                                     :pos pos
+                                     :element expr
+                                     :lb (js2-relpos lb pos)
+                                     :rb (js2-relpos rb pos)
+                                     :len (- js2-token-end pos)))
+    (js2-node-add-children pn
+                           (js2-elem-get-node-target pn)
+                           (js2-elem-get-node-element pn))
+    pn))
+
+(defun js2-parse-function-call (pn)
+  (let (args
+        (pos (js2-node-pos pn)))
+    (js2-consume-token)
+    (setq pn (make-js2-call-node :pos pos
+                                 :target pn
+                                 :lp (- js2-token-beg pos)))
+    (js2-node-add-children pn (js2-call-node-target pn))
+    ;; Add the arguments to pn, if any are supplied.
+    (setf args (nreverse (js2-parse-argument-list))
+          (js2-call-node-rp pn) (- js2-token-beg pos)
+          (js2-call-node-args pn) args)
+    (apply #'js2-node-add-children pn args)
+    (setf (js2-node-len pn) (- js2-ts-cursor pos))
+    pn))
+
+(defun js2-parse-property-access (tt pn)
+  "Parse a property access, XML descendants access, or XML attr access."
+  (let ((member-type-flags 0)
+        (dot-pos js2-token-beg)
+        (dot-len (if (= tt js2-DOTDOT) 2 1))
+        name
+        ref  ; right side of . or .. operator
+        result)
+    (js2-consume-token)
+    (when (= tt js2-DOTDOT)
+      (js2-must-have-xml)
+      (setq member-type-flags js2-descendants-flag))
+    (if (not js2-compiler-xml-available)
+        (progn
+          (js2-must-match-prop-name "msg.no.name.after.dot")
+          (setq name (js2-create-name-node t js2-GETPROP)
+                result (make-js2-prop-get-node :left pn
+                                               :pos js2-token-beg
+                                               :right name
+                                               :len (- js2-token-end
+                                                       js2-token-beg)))
+          (js2-node-add-children result pn name)
+          result)
+      ;; otherwise look for XML operators
+      (setf result (if (= tt js2-DOT)
+                       (make-js2-prop-get-node)
+                     (make-js2-infix-node :type js2-DOTDOT))
+            (js2-node-pos result) (js2-node-pos pn)
+            (js2-infix-node-op-pos result) dot-pos
+            (js2-infix-node-left result) pn  ; do this after setting position
+            tt (js2-next-token))
+      (cond
+       ;; needed for generator.throw()
+       ((= tt js2-THROW)
+        (js2-save-name-token-data js2-token-beg "throw")
+        (setq ref (js2-parse-property-name nil js2-ts-string member-type-flags)))
+       ;; handles: name, ns::name, ns::*, ns::[expr]
+       ((js2-valid-prop-name-token tt)
+        (setq ref (js2-parse-property-name -1 js2-ts-string member-type-flags)))
+       ;; handles: *, *::name, *::*, *::[expr]
+       ((= tt js2-MUL)
+        (js2-save-name-token-data js2-token-beg "*")
+        (setq ref (js2-parse-property-name nil "*" member-type-flags)))
+       ;; handles: '@attr', '@ns::attr', '@ns::*', '@ns::[expr]', etc.
+       ((= tt js2-XMLATTR)
+        (setq result (js2-parse-attribute-access)))
+       (t
+        (js2-report-error "msg.no.name.after.dot" nil dot-pos dot-len)))
+      (if ref
+          (setf (js2-node-len result) (- (js2-node-end ref)
+                                         (js2-node-pos result))
+                (js2-infix-node-right result) ref))
+      (if (js2-infix-node-p result)
+          (js2-node-add-children result
+                                 (js2-infix-node-left result)
+                                 (js2-infix-node-right result)))
+      result)))
+
+(defun js2-parse-attribute-access ()
+  "Parse an E4X XML attribute expression.
+This includes expressions of the forms:
+
+  @attr      @ns::attr     @ns::*
+  @*         @*::attr      @*::*
+  @[expr]    @*::[expr]    @ns::[expr]
+
+Called if we peeked an '@' token."
+  (let ((tt (js2-next-token))
+        (at-pos js2-token-beg))
+    (cond
+     ;; handles: @name, @ns::name, @ns::*, @ns::[expr]
+     ((js2-valid-prop-name-token tt)
+      (js2-parse-property-name at-pos js2-ts-string 0))
+     ;; handles: @*, @*::name, @*::*, @*::[expr]
+     ((= tt js2-MUL)
+      (js2-save-name-token-data js2-token-beg "*")
+      (js2-parse-property-name js2-token-beg "*" 0))
+     ;; handles @[expr]
+     ((= tt js2-LB)
+      (js2-parse-xml-elem-ref at-pos))
+     (t
+      (js2-report-error "msg.no.name.after.xmlAttr")
+      ;; Avoid cascaded errors that happen if we make an error node here.
+      (js2-save-name-token-data js2-token-beg "")
+      (js2-parse-property-name js2-token-beg "" 0)))))
+
+(defun js2-parse-property-name (at-pos s member-type-flags)
+  "Check if :: follows name in which case it becomes qualified name.
+
+AT-POS is a natural number if we just read an '@' token, else nil.
+S is the name or string that was matched:  an identifier, 'throw' or '*'.
+MEMBER-TYPE-FLAGS is a bit set tracking whether we're a '.' or '..' child.
+
+Returns a `js2-xml-ref-node' if it's an attribute access, a child of a '..'
+operator, or the name is followed by ::.  For a plain name, returns a
+`js2-name-node'.  Returns a `js2-error-node' for malformed XML expressions."
+  (let ((pos (or at-pos js2-token-beg))
+        colon-pos
+        (name (js2-create-name-node t js2-current-token))
+        ns tt ref pn)
+    (catch 'return
+      (when (js2-match-token js2-COLONCOLON)
+        (setq ns name
+              colon-pos js2-token-beg
+              tt (js2-next-token))
+        (cond
+         ;; handles name::name
+         ((js2-valid-prop-name-token tt)
+          (setq name (js2-create-name-node)))
+         ;; handles name::*
+         ((= tt js2-MUL)
+          (js2-save-name-token-data js2-token-beg "*")
+          (setq name (js2-create-name-node)))
+         ;; handles name::[expr]
+         ((= tt js2-LB)
+          (throw 'return (js2-parse-xml-elem-ref at-pos ns colon-pos)))
+         (t
+          (js2-report-error "msg.no.name.after.coloncolon"))))
+      (if (and (null ns) (zerop member-type-flags))
+          name
+        (prog1
+            (setq pn
+                  (make-js2-xml-prop-ref-node :pos pos
+                                              :len (- (js2-node-end name) pos)
+                                              :at-pos at-pos
+                                              :colon-pos colon-pos
+                                              :propname name))
+          (js2-node-add-children pn name))))))
+
+(defun js2-parse-xml-elem-ref (at-pos &optional namespace colon-pos)
+  "Parse the [expr] portion of an xml element reference.
+For instance, @[expr], @*::[expr], or ns::[expr]."
+  (let* ((lb js2-token-beg)
+         (pos (or at-pos lb))
+         rb
+         (expr (js2-parse-expr))
+         (end (js2-node-end expr))
+         pn)
+    (if (js2-must-match js2-RB "msg.no.bracket.index")
+        (setq rb js2-token-beg
+              end js2-token-end))
+    (prog1
+        (setq pn
+              (make-js2-xml-elem-ref-node :pos pos
+                                          :len (- end pos)
+                                          :namespace namespace
+                                          :colon-pos colon-pos
+                                          :at-pos at-pos
+                                          :expr expr
+                                          :lb (js2-relpos lb pos)
+                                          :rb (js2-relpos rb pos)))
+      (js2-node-add-children pn namespace expr))))
+
+(defun js2-parse-destruct-primary-expr ()
+  (let ((js2-is-in-destructuring t))
+    (js2-parse-primary-expr)))
+
+(defun js2-parse-primary-expr ()
+  "Parse a literal (leaf) expression of some sort.
+Includes complex literals such as functions, object-literals,
+array-literals, array comprehensions and regular expressions."
+  (let ((tt-flagged (js2-next-flagged-token))
+        pn      ; parent node  (usually return value)
+        tt
+        px-pos  ; paren-expr pos
+        len
+        flags   ; regexp flags
+        expr)
+    (setq tt js2-current-token)
+    (cond
+     ((= tt js2-FUNCTION)
+      (js2-parse-function 'FUNCTION_EXPRESSION))
+     ((= tt js2-LB)
+      (js2-parse-array-literal))
+     ((= tt js2-LC)
+      (js2-parse-object-literal))
+     ((= tt js2-LET)
+      (js2-parse-let js2-token-beg))
+     ((= tt js2-LP)
+      (setq px-pos js2-token-beg
+            expr (js2-parse-expr))
+      (js2-must-match js2-RP "msg.no.paren")
+      (setq pn (make-js2-paren-node :pos px-pos
+                                    :expr expr
+                                    :len (- js2-token-end px-pos)))
+      (js2-node-add-children pn (js2-paren-node-expr pn))
+      pn)
+     ((= tt js2-XMLATTR)
+      (js2-must-have-xml)
+      (js2-parse-attribute-access))
+     ((= tt js2-NAME)
+      (js2-parse-name tt-flagged tt))
+     ((= tt js2-NUMBER)
+      (make-js2-number-node))
+     ((= tt js2-STRING)
+      (prog1
+          (make-js2-string-node)
+        (js2-record-face 'font-lock-string-face)))
+     ((or (= tt js2-DIV) (= tt js2-ASSIGN_DIV))
+      ;; Got / or /= which in this context means a regexp literal
+      (setq px-pos js2-token-beg)
+      (js2-read-regexp tt)
+      (setq flags js2-ts-regexp-flags
+            js2-ts-regexp-flags nil)
+      (prog1
+          (make-js2-regexp-node :pos px-pos
+                                :len (- js2-ts-cursor px-pos)
+                                :value js2-ts-string
+                                :flags flags)
+        (js2-set-face px-pos js2-ts-cursor 'font-lock-string-face 'record)
+        (js2-record-text-property px-pos js2-ts-cursor 'syntax-table '(2))))
+     ((or (= tt js2-NULL)
+          (= tt js2-THIS)
+          (= tt js2-FALSE)
+          (= tt js2-TRUE))
+      (make-js2-keyword-node :type tt))
+     ((= tt js2-RESERVED)
+      (js2-report-error "msg.reserved.id")
+      (make-js2-name-node))
+     ((= tt js2-ERROR)
+      ;; the scanner or one of its subroutines reported the error.
+      (make-js2-error-node))
+     ((= tt js2-EOF)
+      (setq px-pos (point-at-bol)
+            len (- js2-ts-cursor px-pos))
+      (js2-report-error "msg.unexpected.eof" nil px-pos len)
+      (make-js2-error-node :pos px-pos :len len))
+     (t
+      (js2-report-error "msg.syntax")
+      (make-js2-error-node)))))
+
+(defun js2-parse-name (tt-flagged tt)
+  (let ((name js2-ts-string)
+        (name-pos js2-token-beg)
+        node)
+    (if (and (js2-flag-set-p tt-flagged js2-ti-check-label)
+             (= (js2-peek-token) js2-COLON))
+        (prog1
+            ;; Do not consume colon, it is used as unwind indicator
+            ;; to return to statementHelper.
+            (make-js2-label-node :pos name-pos
+                                 :len (- js2-token-end name-pos)
+                                 :name name)
+          (js2-set-face name-pos
+                        js2-token-end
+                        'font-lock-variable-name-face 'record))
+      ;; Otherwise not a label, just a name.  Unfortunately peeking
+      ;; the next token to check for a colon has biffed js2-token-beg
+      ;; and js2-token-end.  We store the name's bounds in buffer vars
+      ;; and `js2-create-name-node' uses them.
+      (js2-save-name-token-data name-pos name)
+      (setq node (if js2-compiler-xml-available
+                     (js2-parse-property-name nil name 0)
+                   (js2-create-name-node 'check-activation)))
+      (if js2-highlight-external-variables
+          (js2-record-name-node node))
+      node)))
+
+(defun js2-parse-warn-trailing-comma (msg pos elems comma-pos)
+  (js2-add-strict-warning
+   msg nil
+   ;; back up from comma to beginning of line or array/objlit
+   (max (if elems
+            (js2-node-pos (car elems))
+          pos)
+        (save-excursion
+          (goto-char comma-pos)
+          (back-to-indentation)
+          (point)))
+   comma-pos))
+
+(defun js2-parse-array-literal ()
+  (let ((pos js2-token-beg)
+        (end js2-token-end)
+        (after-lb-or-comma t)
+        after-comma tt elems pn
+        (continue t))
+    (unless js2-is-in-destructuring
+        (js2-push-scope (make-js2-scope))) ; for array comp
+    (while continue
+      (setq tt (js2-peek-token))
+      (cond
+       ;; comma
+       ((= tt js2-COMMA)
+        (js2-consume-token)
+        (setq after-comma js2-token-end)
+        (if (not after-lb-or-comma)
+            (setq after-lb-or-comma t)
+          (push nil elems)))
+       ;; end of array
+       ((or (= tt js2-RB)
+            (= tt js2-EOF))  ; prevent infinite loop
+        (if (= tt js2-EOF)
+            (js2-report-error "msg.no.bracket.arg" nil pos)
+          (js2-consume-token))
+        (setq continue nil
+              end js2-token-end
+              pn (make-js2-array-node :pos pos
+                                      :len (- js2-ts-cursor pos)
+                                      :elems (nreverse elems)))
+        (apply #'js2-node-add-children pn (js2-array-node-elems pn))
+        (when (and after-comma (not js2-is-in-destructuring))
+          (js2-parse-warn-trailing-comma "msg.array.trailing.comma"
+                                         pos elems after-comma)))
+       ;; destructuring binding
+       (js2-is-in-destructuring
+        (push (if (or (= tt js2-LC)
+                      (= tt js2-LB)
+                      (= tt js2-NAME))
+                  ;; [a, b, c] | {a, b, c} | {a:x, b:y, c:z} | a
+                  (js2-parse-destruct-primary-expr)
+                ;; invalid pattern
+                (js2-consume-token)
+                (js2-report-error "msg.bad.var")
+                (make-js2-error-node))
+              elems)
+        (setq after-lb-or-comma nil
+              after-comma nil))
+       ;; array comp
+       ((and (>= js2-language-version 170)
+             (= tt js2-FOR)          ; check for array comprehension
+             (not after-lb-or-comma) ; "for" can't follow a comma
+             elems                   ; must have at least 1 element
+             (not (cdr elems)))      ; but no 2nd element
+        (setf continue nil
+              pn (js2-parse-array-comprehension (car elems) pos)))
+
+       ;; another element
+       (t
+        (unless after-lb-or-comma
+          (js2-report-error "msg.no.bracket.arg"))
+        (push (js2-parse-assign-expr) elems)
+        (setq after-lb-or-comma nil
+              after-comma nil))))
+    (unless js2-is-in-destructuring
+      (js2-pop-scope))
+    pn))
+
+(defun js2-parse-array-comprehension (expr pos)
+  "Parse a JavaScript 1.7 Array Comprehension.
+EXPR is the first expression after the opening left-bracket.
+POS is the beginning of the LB token preceding EXPR.
+We should have just parsed the 'for' keyword before calling this function."
+  (let (loops loop first prev filter if-pos result)
+    (while (= (js2-peek-token) js2-FOR)
+      (let ((prev (car loops))) ; rearrange scope chain
+        (push (setq loop (js2-parse-array-comp-loop)) loops)
+        (if prev ; each loop is parent scope to the next one
+            (setf (js2-scope-parent-scope loop) prev)
+          ; first loop takes expr scope's parent
+          (setf (js2-scope-parent-scope (setq first loop))
+                (js2-scope-parent-scope js2-current-scope)))))
+    ;; set expr scope's parent to the last loop
+    (setf (js2-scope-parent-scope js2-current-scope) (car loops))
+    (when (= (js2-peek-token) js2-IF)
+      (js2-consume-token)
+      (setq if-pos (- js2-token-beg pos)  ; relative
+            filter (js2-parse-condition)))
+    (js2-must-match js2-RB "msg.no.bracket.arg" pos)
+    (setq result (make-js2-array-comp-node :pos pos
+                                           :len (- js2-ts-cursor pos)
+                                           :result expr
+                                           :loops (nreverse loops)
+                                           :filter (car filter)
+                                           :lp (js2-relpos (second filter) pos)
+                                           :rp (js2-relpos (third filter) pos)
+                                           :if-pos if-pos))
+    (apply #'js2-node-add-children result expr (car filter)
+           (js2-array-comp-node-loops result))
+    (setq js2-current-scope first) ; pop to the first loop
+    result))
+
+(defun js2-parse-array-comp-loop ()
+  "Parse a 'for [each] (foo [in|of] bar)' expression in an Array comprehension.
+Last token peeked should be the initial FOR."
+  (let ((pos js2-token-beg)
+        (pn (make-js2-array-comp-loop-node))
+        tt iter obj foreach-p forof-p in-pos each-pos lp rp)
+    (assert (= (js2-next-token) js2-FOR))  ; consumes token
+    (js2-push-scope pn)
+    (unwind-protect
+        (progn
+          (when (js2-match-token js2-NAME)
+            (if (string= js2-ts-string "each")
+                (progn
+                  (setq foreach-p t
+                        each-pos (- js2-token-beg pos)) ; relative
+                  (js2-record-face 'font-lock-keyword-face))
+              (js2-report-error "msg.no.paren.for")))
+          (if (js2-must-match js2-LP "msg.no.paren.for")
+              (setq lp (- js2-token-beg pos)))
+          (setq tt (js2-peek-token))
+          (cond
+           ((or (= tt js2-LB)
+                (= tt js2-LC))
+            (setq iter (js2-parse-destruct-primary-expr))
+            (js2-define-destruct-symbols iter js2-LET
+                                         'font-lock-variable-name-face t))
+           ((js2-match-token js2-NAME)
+            (setq iter (js2-create-name-node)))
+           (t
+            (js2-report-error "msg.bad.var")))
+          ;; Define as a let since we want the scope of the variable to
+          ;; be restricted to the array comprehension
+          (if (js2-name-node-p iter)
+              (js2-define-symbol js2-LET (js2-name-node-name iter) pn t))
+          (if (or (js2-match-token js2-IN)
+                  (and (>= js2-language-version 200)
+                       (js2-match-contextual-kwd "of")
+                       (setq forof-p t)))
+              (setq in-pos (- js2-token-beg pos))
+            (js2-report-error "msg.in.after.for.name"))
+          (setq obj (js2-parse-expr))
+          (if (js2-must-match js2-RP "msg.no.paren.for.ctrl")
+              (setq rp (- js2-token-beg pos)))
+          (setf (js2-node-pos pn) pos
+                (js2-node-len pn) (- js2-ts-cursor pos)
+                (js2-array-comp-loop-node-iterator pn) iter
+                (js2-array-comp-loop-node-object pn) obj
+                (js2-array-comp-loop-node-in-pos pn) in-pos
+                (js2-array-comp-loop-node-each-pos pn) each-pos
+                (js2-array-comp-loop-node-foreach-p pn) foreach-p
+                (js2-array-comp-loop-node-forof-p pn) forof-p
+                (js2-array-comp-loop-node-lp pn) lp
+                (js2-array-comp-loop-node-rp pn) rp)
+          (js2-node-add-children pn iter obj))
+      (js2-pop-scope))
+    pn))
+
+(defun js2-parse-object-literal ()
+  (let ((pos js2-token-beg)
+        tt elems result after-comma
+        (continue t))
+    (while continue
+      (setq tt (js2-peek-token))
+      (cond
+       ;; {foo: ...}, {'foo': ...}, {foo, bar, ...},
+       ;; {get foo() {...}}, or {set foo(x) {...}}
+       ((or (js2-valid-prop-name-token tt)
+            (= tt js2-STRING))
+        (setq after-comma nil
+              result (js2-parse-named-prop tt))
+        (if (and (null result)
+                 (not js2-recover-from-parse-errors))
+            (setq continue nil)
+          (push result elems)))
+       ;; {12: x} or {10.7: x}
+       ((= tt js2-NUMBER)
+        (js2-consume-token)
+        (setq after-comma nil)
+        (push (js2-parse-plain-property (make-js2-number-node)) elems))
+       ;; trailing comma
+       ((= tt js2-RC)
+        (setq continue nil)
+        (if after-comma
+            (js2-parse-warn-trailing-comma "msg.extra.trailing.comma"
+                                           pos elems after-comma)))
+       (t
+        (js2-report-error "msg.bad.prop")
+        (unless js2-recover-from-parse-errors
+          (setq continue nil))))         ; end switch
+      (if (js2-match-token js2-COMMA)
+          (setq after-comma js2-token-end)
+        (setq continue nil)))           ; end loop
+    (js2-must-match js2-RC "msg.no.brace.prop")
+    (setq result (make-js2-object-node :pos pos
+                                       :len (- js2-ts-cursor pos)
+                                       :elems (nreverse elems)))
+    (apply #'js2-node-add-children result (js2-object-node-elems result))
+    result))
+
+(defun js2-parse-named-prop (tt)
+  "Parse a name, string, or getter/setter object property.
+When `js2-is-in-destructuring' is t, forms like {a, b, c} will be permitted."
+  (js2-consume-token)
+  (let ((string-prop (and (= tt js2-STRING)
+                          (make-js2-string-node)))
+        expr
+        (ppos js2-token-beg)
+        (pend js2-token-end)
+        (name (js2-create-name-node))
+        (prop js2-ts-string))
+    (cond
+     ;; getter/setter prop
+     ((and (= tt js2-NAME)
+           (= (js2-peek-token) js2-NAME)
+           (or (string= prop "get")
+               (string= prop "set")))
+      (js2-consume-token)
+      (js2-set-face ppos pend 'font-lock-keyword-face 'record)  ; get/set
+      (js2-record-face 'font-lock-function-name-face)      ; for peeked name
+      (setq name (js2-create-name-node)) ; discard get/set & use peeked name
+      (js2-parse-getter-setter-prop ppos name (string= prop "get")))
+     ;; Abbreviated destructuring binding, e.g. {a, b} = c;
+     ;; XXX: To be honest, the value of `js2-is-in-destructuring' becomes t only
+     ;; when patterns are used in variable declarations, function parameters,
+     ;; catch-clause, and iterators.
+     ;; We have to set `js2-is-in-destructuring' to t when the current
+     ;; expressions are on the left side of any assignment, but it's difficult
+     ;; because it requires looking ahead of expression.
+     ((and js2-is-in-destructuring
+           (= tt js2-NAME)
+           (let ((ctk (js2-peek-token)))
+             (or (= ctk js2-COMMA)
+                 (= ctk js2-RC)
+                 (js2-valid-prop-name-token ctk))))
+      name)
+     ;; regular prop
+     (t
+      (prog1
+          (setq expr (js2-parse-plain-property (or string-prop name)))
+        (js2-set-face ppos pend
+                      (if (js2-function-node-p
+                           (js2-object-prop-node-right expr))
+                          'font-lock-function-name-face
+                        'font-lock-variable-name-face)
+                      'record))))))
+
+(defun js2-parse-plain-property (prop)
+  "Parse a non-getter/setter property in an object literal.
+PROP is the node representing the property:  a number, name or string."
+  (js2-must-match js2-COLON "msg.no.colon.prop")
+  (let* ((pos (js2-node-pos prop))
+        (colon (- js2-token-beg pos))
+        (expr (js2-parse-assign-expr))
+        (result (make-js2-object-prop-node
+                 :pos pos
+                 ;; don't include last consumed token in length
+                 :len (- (+ (js2-node-pos expr)
+                            (js2-node-len expr))
+                         pos)
+                 :left prop
+                 :right expr
+                 :op-pos colon)))
+    (js2-node-add-children result prop expr)
+    result))
+
+(defun js2-parse-getter-setter-prop (pos prop get-p)
+  "Parse getter or setter property in an object literal.
+JavaScript syntax is:
+
+  { get foo() {...}, set foo(x) {...} }
+
+and expression closure style is also supported
+
+  { get foo() x, set foo(x) _x = x }
+
+POS is the start position of the `get' or `set' keyword.
+PROP is the `js2-name-node' representing the property name.
+GET-P is non-nil if the keyword was `get'."
+  (let ((type (if get-p js2-GET js2-SET))
+        result end
+        (fn (js2-parse-function 'FUNCTION_EXPRESSION)))
+    ;; it has to be an anonymous function, as we already parsed the name
+    (if (/= (js2-node-type fn) js2-FUNCTION)
+        (js2-report-error "msg.bad.prop")
+      (if (plusp (length (js2-function-name fn)))
+          (js2-report-error "msg.bad.prop")))
+    (js2-node-set-prop fn 'GETTER_SETTER type)  ; for codegen
+    (setq end (js2-node-end fn)
+          result (make-js2-getter-setter-node :type type
+                                              :pos pos
+                                              :len (- end pos)
+                                              :left prop
+                                              :right fn))
+    (js2-node-add-children result prop fn)
+    result))
+
+(defun js2-create-name-node (&optional check-activation-p token)
+  "Create a name node using the token info from last scanned name.
+In some cases we need to either synthesize a name node, or we lost
+the name token information by peeking.  If the TOKEN parameter is
+not `js2-NAME', then we use the token info saved in instance vars."
+  (let ((beg js2-token-beg)
+        (s js2-ts-string)
+        name)
+    (when (/= js2-current-token js2-NAME)
+      (setq beg (or js2-prev-name-token-start js2-ts-cursor)
+            s js2-prev-name-token-string
+            js2-prev-name-token-start nil
+            js2-prev-name-token-string nil))
+    (setq name (make-js2-name-node :pos beg
+                                   :name s
+                                   :len (length s)))
+    (if check-activation-p
+        (js2-check-activation-name s (or token js2-NAME)))
+    name))
+
+;;; Indentation support
+
+;; This indenter is based on Karl Landström's "javascript.el" indenter.
+;; Karl cleverly deduces that the desired indentation level is often a
+;; function of paren/bracket/brace nesting depth, which can be determined
+;; quickly via the built-in `parse-partial-sexp' function.  His indenter
+;; then does some equally clever checks to see if we're in the context of a
+;; substatement of a possibly braceless statement keyword such as if, while,
+;; or finally.  This approach yields pretty good results.
+
+;; The indenter is often "wrong", however, and needs to be overridden.
+;; The right long-term solution is probably to emulate (or integrate
+;; with) cc-engine, but it's a nontrivial amount of coding.  Even when a
+;; parse tree from `js2-parse' is present, which is not true at the
+;; moment the user is typing, computing indentation is still thousands
+;; of lines of code to handle every possible syntactic edge case.
+
+;; In the meantime, the compromise solution is that we offer a "bounce
+;; indenter", configured with `js2-bounce-indent-p', which cycles the
+;; current line indent among various likely guess points.  This approach
+;; is far from perfect, but should at least make it slightly easier to
+;; move the line towards its desired indentation when manually
+;; overriding Karl's heuristic nesting guesser.
+
+;; I've made miscellaneous tweaks to Karl's code to handle some Ecma
+;; extensions such as `let' and Array comprehensions.  Major kudos to
+;; Karl for coming up with the initial approach, which packs a lot of
+;; punch for so little code.
+
+(defconst js2-possibly-braceless-keywords-re
+  (concat "else[ \t]+if\\|for[ \t]+each\\|"
+          (regexp-opt '("catch" "do" "else" "finally" "for" "if"
+                        "try" "while" "with" "let")))
+  "Regular expression matching keywords that are optionally
+followed by an opening brace.")
+
+(defconst js2-indent-operator-re
+  (concat "[-+*/%<>=&^|?:.]\\([^-+*/]\\|$\\)\\|"
+          (regexp-opt '("in" "instanceof") 'words))
+  "Regular expression matching operators that affect indentation
+of continued expressions.")
+
+(defconst js2-declaration-keyword-re
+  (regexp-opt '("var" "let" "const") 'words)
+  "Regular expression matching variable declaration keywords.")
+
+(defun js2-re-search-forward-inner (regexp &optional bound count)
+  "Auxiliary function for `js2-re-search-forward'."
+  (let (parse saved-point)
+    (while (> count 0)
+      (re-search-forward regexp bound)
+      (setq parse (if saved-point
+                      (parse-partial-sexp saved-point (point))
+                    (syntax-ppss (point))))
+      (cond ((nth 3 parse)
+             (re-search-forward
+              (concat "\\([^\\]\\|^\\)" (string (nth 3 parse)))
+              (save-excursion (end-of-line) (point)) t))
+            ((nth 7 parse)
+             (forward-line))
+            ((or (nth 4 parse)
+                 (and (eq (char-before) ?\/) (eq (char-after) ?\*)))
+             (re-search-forward "\\*/"))
+            (t
+             (setq count (1- count))))
+      (setq saved-point (point))))
+  (point))
+
+(defun js2-re-search-forward (regexp &optional bound noerror count)
+  "Search forward but ignore strings and comments.
+Invokes `re-search-forward' but treats the buffer as if strings
+and comments have been removed."
+  (let ((saved-point (point))
+        (search-expr
+         (cond ((null count)
+                '(js2-re-search-forward-inner regexp bound 1))
+               ((< count 0)
+                '(js2-re-search-backward-inner regexp bound (- count)))
+               ((> count 0)
+                '(js2-re-search-forward-inner regexp bound count)))))
+    (condition-case err
+        (eval search-expr)
+      (search-failed
+       (goto-char saved-point)
+       (unless noerror
+         (error (error-message-string err)))))))
+
+(defun js2-re-search-backward-inner (regexp &optional bound count)
+  "Auxiliary function for `js2-re-search-backward'."
+  (let (parse)
+    (while (> count 0)
+      (re-search-backward regexp bound)
+      (setq parse (syntax-ppss (point)))
+      (cond ((nth 3 parse)
+             (re-search-backward
+              (concat "\\([^\\]\\|^\\)" (string (nth 3 parse)))
+              (line-beginning-position) t))
+            ((nth 7 parse)
+             (goto-char (nth 8 parse)))
+            ((or (nth 4 parse)
+                 (and (eq (char-before) ?/) (eq (char-after) ?*)))
+             (re-search-backward "/\\*"))
+            (t
+             (setq count (1- count))))))
+  (point))
+
+(defun js2-re-search-backward (regexp &optional bound noerror count)
+  "Search backward but ignore strings and comments.
+Invokes `re-search-backward' but treats the buffer as if strings
+and comments have been removed."
+  (let ((saved-point (point))
+        (search-expr
+         (cond ((null count)
+                '(js2-re-search-backward-inner regexp bound 1))
+               ((< count 0)
+                '(js2-re-search-forward-inner regexp bound (- count)))
+               ((> count 0)
+                '(js2-re-search-backward-inner regexp bound count)))))
+    (condition-case err
+        (eval search-expr)
+      (search-failed
+       (goto-char saved-point)
+       (unless noerror
+         (error (error-message-string err)))))))
+
+(defun js2-looking-at-operator-p ()
+  "Return non-nil if text after point is a non-comma operator."
+  (and (looking-at js2-indent-operator-re)
+       (or (not (looking-at ":"))
+           (save-excursion
+             (and (js2-re-search-backward "[?:{]\\|\\<case\\>" nil t)
+                  (looking-at "?"))))))
+
+(defun js2-continued-expression-p ()
+  "Return non-nil if the current line continues an expression."
+  (save-excursion
+    (back-to-indentation)
+    (or (js2-looking-at-operator-p)
+        (when (catch 'found
+                (while (and (re-search-backward "\n" nil t)
+                            (let ((state (syntax-ppss)))
+                              (when (nth 4 state)
+                                (goto-char (nth 8 state))) ;; skip comments
+                              (skip-chars-backward " \t")
+                              (if (bolp)
+                                  t
+                                (throw 'found t))))))
+          (backward-char)
+          (when (js2-looking-at-operator-p)
+            (backward-char)
+            (not (looking-at "\\*\\|++\\|--\\|/[/*]")))))))
+
+(defun js2-end-of-do-while-loop-p ()
+  "Return non-nil if word after point is `while' of a do-while
+statement, else returns nil. A braceless do-while statement
+spanning several lines requires that the start of the loop is
+indented to the same column as the current line."
+  (interactive)
+  (save-excursion
+    (when (looking-at "\\s-*\\<while\\>")
+      (if (save-excursion
+            (skip-chars-backward "[ \t\n]*}")
+            (looking-at "[ \t\n]*}"))
+          (save-excursion
+            (backward-list) (backward-word 1) (looking-at "\\<do\\>"))
+        (js2-re-search-backward "\\<do\\>" (point-at-bol) t)
+        (or (looking-at "\\<do\\>")
+            (let ((saved-indent (current-indentation)))
+              (while (and (js2-re-search-backward "^[ \t]*\\<" nil t)
+                          (/= (current-indentation) saved-indent)))
+              (and (looking-at "[ \t]*\\<do\\>")
+                   (not (js2-re-search-forward
+                         "\\<while\\>" (point-at-eol) t))
+                   (= (current-indentation) saved-indent))))))))
+
+(defun js2-multiline-decl-indentation ()
+  "Return the declaration indentation column if the current line belongs
+to a multiline declaration statement.  See `js2-pretty-multiline-declarations'."
+  (let (forward-sexp-function ; use Lisp version
+        at-opening-bracket)
+    (save-excursion
+      (back-to-indentation)
+      (when (not (looking-at js2-declaration-keyword-re))
+        (when (looking-at js2-indent-operator-re)
+          (goto-char (match-end 0))) ; continued expressions are ok
+        (while (and (not at-opening-bracket)
+                    (not (bobp))
+                    (let ((pos (point)))
+                      (save-excursion
+                        (js2-backward-sws)
+                        (or (eq (char-before) ?,)
+                            (and (not (eq (char-before) ?\;))
+                                 (prog2 (skip-syntax-backward ".")
+                                     (looking-at js2-indent-operator-re)
+                                   (js2-backward-sws))
+                                 (not (eq (char-before) ?\;)))
+                            (js2-same-line pos)))))
+          (condition-case err
+              (backward-sexp)
+            (scan-error (setq at-opening-bracket t))))
+        (when (looking-at js2-declaration-keyword-re)
+          (goto-char (match-end 0))
+          (1+ (current-column)))))))
+
+(defun js2-ctrl-statement-indentation ()
+  "Return the proper indentation of current line if it is a control statement.
+Returns an indentation if this line starts the body of a control
+statement without braces, else returns nil."
+  (let (forward-sexp-function)
+    (save-excursion
+      (back-to-indentation)
+      (when (and (not (js2-same-line (point-min)))
+                 (not (looking-at "{"))
+                 (js2-re-search-backward "[[:graph:]]" nil t)
+                 (not (looking-at "[{([]"))
+                 (progn
+                   (forward-char)
+                   (when (= (char-before) ?\))
+                     ;; scan-sexps sometimes throws an error
+                     (ignore-errors (backward-sexp))
+                     (skip-chars-backward " \t" (point-at-bol)))
+                   (let ((pt (point)))
+                     (back-to-indentation)
+                     (when (looking-at "}[ \t]*")
+                       (goto-char (match-end 0)))
+                     (and (looking-at js2-possibly-braceless-keywords-re)
+                          (= (match-end 0) pt)
+                          (not (js2-end-of-do-while-loop-p))))))
+        (+ (current-indentation) js2-basic-offset)))))
+
+(defun js2-indent-in-array-comp (parse-status)
+  "Return non-nil if we think we're in an array comprehension.
+In particular, return the buffer position of the first `for' kwd."
+  (let ((bracket (nth 1 parse-status))
+        (end (point)))
+    (when bracket
+      (save-excursion
+        (goto-char bracket)
+        (when (looking-at "\\[")
+          (forward-char 1)
+          (js2-forward-sws)
+          (if (looking-at "[[{]")
+              (let (forward-sexp-function) ; use Lisp version
+                (forward-sexp)             ; skip destructuring form
+                (js2-forward-sws)
+                (if (and (/= (char-after) ?,) ; regular array
+                         (looking-at "for"))
+                    (match-beginning 0)))
+            ;; to skip arbitrary expressions we need the parser,
+            ;; so we'll just guess at it.
+            (if (and (> end (point)) ; not empty literal
+                     (re-search-forward "[^,]]* \\(for\\) " end t)
+                     ;; not inside comment or string literal
+                     (let ((state (parse-partial-sexp bracket (point))))
+                       (not (or (nth 3 state) (nth 4 state)))))
+                (match-beginning 1))))))))
+
+(defun js2-array-comp-indentation (parse-status for-kwd)
+  (if (js2-same-line for-kwd)
+      ;; first continuation line
+      (save-excursion
+        (goto-char (nth 1 parse-status))
+        (forward-char 1)
+        (skip-chars-forward " \t")
+        (current-column))
+    (save-excursion
+      (goto-char for-kwd)
+      (current-column))))
+
+(defun js2-proper-indentation (parse-status)
+  "Return the proper indentation for the current line."
+  (save-excursion
+    (back-to-indentation)
+    (let ((ctrl-stmt-indent (js2-ctrl-statement-indentation))
+          (same-indent-p (looking-at "[]})]\\|\\<case\\>\\|\\<default\\>"))
+          (continued-expr-p (js2-continued-expression-p))
+          (declaration-indent (and js2-pretty-multiline-declarations
+                                   (js2-multiline-decl-indentation)))
+          (bracket (nth 1 parse-status))
+          beg)
+      (cond
+       ;; indent array comprehension continuation lines specially
+       ((and bracket
+             (>= js2-language-version 170)
+             (not (js2-same-line bracket))
+             (setq beg (js2-indent-in-array-comp parse-status))
+             (>= (point) (save-excursion
+                           (goto-char beg)
+                           (point-at-bol)))) ; at or after first loop?
+        (js2-array-comp-indentation parse-status beg))
+
+       (ctrl-stmt-indent)
+
+       ((and declaration-indent continued-expr-p)
+        (+ declaration-indent js2-basic-offset))
+
+       (declaration-indent)
+
+       (bracket
+        (goto-char bracket)
+        (cond
+         ((looking-at "[({[][ \t]*\\(/[/*]\\|$\\)")
+          (when (save-excursion (skip-chars-backward " \t)")
+                                (looking-at ")"))
+            (backward-list))
+          (back-to-indentation)
+          (and (eq js2-pretty-multiline-declarations 'all)
+               (looking-at js2-declaration-keyword-re)
+               (goto-char (1+ (match-end 0))))
+          (cond (same-indent-p
+                 (current-column))
+                (continued-expr-p
+                 (+ (current-column) (* 2 js2-basic-offset)))
+                (t
+                 (+ (current-column) js2-basic-offset))))
+         (t
+          (unless same-indent-p
+            (forward-char)
+            (skip-chars-forward " \t"))
+          (current-column))))
+
+       (continued-expr-p js2-basic-offset)
+
+       (t 0)))))
+
+(defun js2-lineup-comment (parse-status)
+  "Indent a multi-line block comment continuation line."
+  (let* ((beg (nth 8 parse-status))
+         (first-line (js2-same-line beg))
+         (offset (save-excursion
+                   (goto-char beg)
+                   (if (looking-at "/\\*")
+                       (+ 1 (current-column))
+                     0))))
+    (unless first-line
+      (indent-line-to offset))))
+
+(defun js2-backward-sws ()
+  "Move backward through whitespace and comments."
+  (interactive)
+  (while (forward-comment -1)))
+
+(defun js2-forward-sws ()
+  "Move forward through whitespace and comments."
+  (interactive)
+  (while (forward-comment 1)))
+
+(defun js2-current-indent (&optional pos)
+  "Return column of indentation on current line.
+If POS is non-nil, go to that point and return indentation for that line."
+  (save-excursion
+    (if pos
+        (goto-char pos))
+    (back-to-indentation)
+    (current-column)))
+
+(defun js2-arglist-close ()
+  "Return non-nil if we're on a line beginning with a close-paren/brace."
+  (save-excursion
+    (goto-char (point-at-bol))
+    (js2-forward-sws)
+    (looking-at "[])}]")))
+
+(defun js2-indent-looks-like-label-p ()
+  (goto-char (point-at-bol))
+  (js2-forward-sws)
+  (looking-at (concat js2-mode-identifier-re ":")))
+
+(defun js2-indent-in-objlit-p (parse-status)
+  "Return non-nil if this looks like an object-literal entry."
+  (let ((start (nth 1 parse-status)))
+    (and
+     start
+     (save-excursion
+       (and (zerop (forward-line -1))
+            (not (< (point) start))     ; crossed a {} boundary
+            (js2-indent-looks-like-label-p)))
+     (save-excursion
+       (js2-indent-looks-like-label-p)))))
+
+;; If prev line looks like foobar({ then we're passing an object
+;; literal to a function call, and people pretty much always want to
+;; de-dent back to the previous line, so move the 'basic-offset'
+;; position to the front.
+(defun js2-indent-objlit-arg-p (parse-status)
+  (save-excursion
+    (back-to-indentation)
+    (js2-backward-sws)
+    (and (eq (1- (point)) (nth 1 parse-status))
+         (eq (char-before) ?{)
+         (progn
+           (forward-char -1)
+           (skip-chars-backward " \t")
+           (eq (char-before) ?\()))))
+
+(defun js2-indent-case-block-p ()
+  (save-excursion
+    (back-to-indentation)
+    (js2-backward-sws)
+    (goto-char (point-at-bol))
+    (skip-chars-forward " \t")
+    (looking-at "case\\s-.+:")))
+
+(defun js2-bounce-indent (normal-col parse-status &optional backwards)
+  "Cycle among alternate computed indentation positions.
+PARSE-STATUS is the result of `parse-partial-sexp' from the beginning
+of the buffer to the current point.  NORMAL-COL is the indentation
+column computed by the heuristic guesser based on current paren,
+bracket, brace and statement nesting.  If BACKWARDS, cycle positions
+in reverse."
+  (let ((cur-indent (js2-current-indent))
+        (old-buffer-undo-list buffer-undo-list)
+        ;; Emacs 21 only has `count-lines', not `line-number-at-pos'
+        (current-line (save-excursion
+                        (forward-line 0)  ; move to bol
+                        (1+ (count-lines (point-min) (point)))))
+        positions pos main-pos anchor arglist-cont same-indent
+        prev-line-col basic-offset computed-pos)
+    ;; temporarily don't record undo info, if user requested this
+    (when js2-mode-indent-inhibit-undo
+      (setq buffer-undo-list t))
+    (unwind-protect
+        (progn
+          ;; First likely point:  indent from beginning of previous code line
+          (push (setq basic-offset
+                      (+ (save-excursion
+                           (back-to-indentation)
+                           (js2-backward-sws)
+                           (back-to-indentation)
+                           (setq prev-line-col (current-column)))
+                         js2-basic-offset))
+                positions)
+
+          ;; (First + epsilon) likely point:  indent 2x from beginning of
+          ;; previous code line.  Google does it this way.
+          (push (setq basic-offset
+                      (+ (save-excursion
+                           (back-to-indentation)
+                           (js2-backward-sws)
+                           (back-to-indentation)
+                           (setq prev-line-col (current-column)))
+                         (* 2 js2-basic-offset)))
+                positions)
+
+          ;; Second likely point:  indent from assign-expr RHS.  This
+          ;; is just a crude guess based on finding " = " on the previous
+          ;; line containing actual code.
+          (setq pos (save-excursion
+                      (forward-line -1)
+                      (goto-char (point-at-bol))
+                      (when (re-search-forward "\\s-+\\(=\\)\\s-+"
+                                               (point-at-eol) t)
+                        (goto-char (match-end 1))
+                        (skip-chars-forward " \t\r\n")
+                        (current-column))))
+          (when pos
+            (incf pos js2-basic-offset)
+            (push pos positions))
+
+          ;; Third likely point:  same indent as previous line of code.
+          ;; Make it the first likely point if we're not on an
+          ;; arglist-close line and previous line ends in a comma, or
+          ;; both this line and prev line look like object-literal
+          ;; elements.
+          (setq pos (save-excursion
+                      (goto-char (point-at-bol))
+                      (js2-backward-sws)
+                      (back-to-indentation)
+                      (prog1
+                          (current-column)
+                        ;; while we're here, look for trailing comma
+                        (if (save-excursion
+                              (goto-char (point-at-eol))
+                              (js2-backward-sws)
+                              (eq (char-before) ?,))
+                            (setq arglist-cont (1- (point)))))))
+          (when pos
+            (if (and (or arglist-cont
+                         (js2-indent-in-objlit-p parse-status))
+                     (not (js2-arglist-close)))
+                (setq same-indent pos))
+            (push pos positions))
+
+          ;; Fourth likely point:  first preceding code with less indentation.
+          ;; than the immediately preceding code line.
+          (setq pos (save-excursion
+                      (back-to-indentation)
+                      (js2-backward-sws)
+                      (back-to-indentation)
+                      (setq anchor (current-column))
+                      (while (and (zerop (forward-line -1))
+                                  (>= (progn
+                                        (back-to-indentation)
+                                        (current-column))
+                                      anchor)))
+                      (setq pos (current-column))))
+          (push pos positions)
+
+          ;; nesting-heuristic position, main by default
+          (push (setq main-pos normal-col) positions)
+
+          ;; delete duplicates and sort positions list
+          (setq positions (sort (delete-dups positions) '<))
+
+          ;; comma-list continuation lines:  prev line indent takes precedence
+          (if same-indent
+              (setq main-pos same-indent))
+
+          ;; common special cases where we want to indent in from previous line
+          (if (or (js2-indent-case-block-p)
+                  (js2-indent-objlit-arg-p parse-status))
+              (setq main-pos basic-offset))
+
+          ;; if bouncing backwards, reverse positions list
+          (if backwards
+              (setq positions (reverse positions)))
+
+          ;; record whether we're already sitting on one of the alternatives
+          (setq pos (member cur-indent positions))
+
+          (cond
+           ;; case 0:  we're one one of the alternatives and this is the
+           ;; first time they've pressed TAB on this line (best-guess).
+           ((and js2-mode-indent-ignore-first-tab
+                 pos
+                 ;; first time pressing TAB on this line?
+                 (not (eq js2-mode-last-indented-line current-line)))
+            ;; do nothing
+            (setq computed-pos nil))
+           ;; case 1:  only one computed position => use it
+           ((null (cdr positions))
+            (setq computed-pos 0))
+           ;; case 2:  not on any of the computed spots => use main spot
+           ((not pos)
+            (setq computed-pos (js2-position main-pos positions)))
+           ;; case 3:  on last position:  cycle to first position
+           ((null (cdr pos))
+            (setq computed-pos 0))
+           ;; case 4:  on intermediate position:  cycle to next position
+           (t
+            (setq computed-pos (js2-position (second pos) positions))))
+
+          ;; see if any hooks want to indent; otherwise we do it
+          (loop with result = nil
+                for hook in js2-indent-hook
+                while (null result)
+                do
+                (setq result (funcall hook positions computed-pos))
+                finally do
+                (unless (or result (null computed-pos))
+                  (indent-line-to (nth computed-pos positions)))))
+
+      ;; finally
+      (if js2-mode-indent-inhibit-undo
+          (setq buffer-undo-list old-buffer-undo-list))
+      ;; see commentary for `js2-mode-last-indented-line'
+      (setq js2-mode-last-indented-line current-line))))
+
+(defun js2-indent-bounce-backwards ()
+  "Calls `js2-indent-line'.  When `js2-bounce-indent-p',
+cycles between the computed indentation positions in reverse order."
+  (interactive)
+  (js2-indent-line t))
+
+(defun js2-1-line-comment-continuation-p ()
+  "Return t if we're in a 1-line comment continuation.
+If so, we don't ever want to use bounce-indent."
+  (save-excursion
+    (and (progn
+           (forward-line 0)
+           (looking-at "\\s-*//"))
+         (progn
+           (forward-line -1)
+           (forward-line 0)
+           (when (looking-at "\\s-*$")
+             (js2-backward-sws)
+             (forward-line 0))
+           (looking-at "\\s-*//")))))
+
+(defun js2-indent-line (&optional bounce-backwards)
+  "Indent the current line as JavaScript source text."
+  (interactive)
+  (let (parse-status current-indent offset indent-col moved
+        ;; Don't whine about errors/warnings when we're indenting.
+        ;; This has to be set before calling parse-partial-sexp below.
+        (inhibit-point-motion-hooks t))
+    (setq parse-status (save-excursion
+                         (syntax-ppss (point-at-bol)))
+          offset (- (point) (save-excursion
+                              (back-to-indentation)
+                              (point))))
+    (js2-with-underscore-as-word-syntax
+     (if (nth 4 parse-status)
+         (js2-lineup-comment parse-status)
+       (setq indent-col (js2-proper-indentation parse-status))
+       ;; See comments below about `js2-mode-last-indented-line'.
+       (cond
+        ;; bounce-indenting is disabled during electric-key indent.
+        ;; It doesn't work well on first line of buffer.
+        ((and js2-bounce-indent-p
+              (not (js2-same-line (point-min)))
+              (not (js2-1-line-comment-continuation-p)))
+         (js2-bounce-indent indent-col parse-status bounce-backwards))
+        ;; just indent to the guesser's likely spot
+        (t (indent-line-to indent-col))))
+     (when (plusp offset)
+       (forward-char offset)))))
+
+(defun js2-indent-region (start end)
+  "Indent the region, but don't use bounce indenting."
+  (let ((js2-bounce-indent-p nil)
+        (indent-region-function nil)
+        (after-change-functions (remq 'js2-mode-edit
+                                      after-change-functions)))
+    (indent-region start end nil) ; nil for byte-compiler
+    (js2-mode-edit start end (- end start))))
+
+(defvar js2-minor-mode-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map (kbd "C-c C-`") #'js2-next-error)
+    (define-key map [mouse-1] #'js2-mode-show-node)
+    map)
+  "Keymap used when `js2-minor-mode' is active.")
+
+;;;###autoload
+(define-minor-mode js2-minor-mode
+  "Minor mode for running js2 as a background linter.
+This allows you to use a different major mode for JavaScript editing,
+such as `espresso-mode', while retaining the asynchronous error/warning
+highlighting features of `js2-mode'."
+  :group 'js2-mode
+  :lighter " js-lint"
+  (if js2-minor-mode
+      (js2-minor-mode-enter)
+    (js2-minor-mode-exit)))
+
+(defun js2-minor-mode-enter ()
+  "Initialization for `js2-minor-mode'."
+  (set (make-local-variable 'max-lisp-eval-depth)
+       (max max-lisp-eval-depth 3000))
+  (setq next-error-function #'js2-next-error)
+  (js2-set-default-externs)
+  ;; Experiment:  make reparse-delay longer for longer files.
+  (if (plusp js2-dynamic-idle-timer-adjust)
+      (setq js2-idle-timer-delay
+            (* js2-idle-timer-delay
+               (/ (point-max) js2-dynamic-idle-timer-adjust))))
+  (setq js2-mode-buffer-dirty-p t
+        js2-mode-parsing nil)
+  (set (make-local-variable 'js2-highlight-level) 0) ; no syntax highlighting
+  (add-hook 'after-change-functions #'js2-minor-mode-edit nil t)
+  (add-hook 'change-major-mode-hook #'js2-minor-mode-exit nil t)
+  (when js2-include-jslint-globals
+    (add-hook 'js2-post-parse-callbacks 'js2-apply-jslint-globals nil t))
+  (run-hooks 'js2-init-hook)
+  (js2-reparse))
+
+(defun js2-minor-mode-exit ()
+  "Turn off `js2-minor-mode'."
+  (setq next-error-function nil)
+  (remove-hook 'after-change-functions #'js2-mode-edit t)
+  (remove-hook 'change-major-mode-hook #'js2-minor-mode-exit t)
+  (when js2-mode-node-overlay
+    (delete-overlay js2-mode-node-overlay)
+    (setq js2-mode-node-overlay nil))
+  (js2-remove-overlays)
+  (remove-hook 'js2-post-parse-callbacks 'js2-apply-jslint-globals t)
+  (setq js2-mode-ast nil))
+
+(defvar js2-source-buffer nil "Linked source buffer for diagnostics view")
+(make-variable-buffer-local 'js2-source-buffer)
+
+(defun* js2-display-error-list ()
+  "Display a navigable buffer listing parse errors/warnings."
+  (interactive)
+  (unless (js2-have-errors-p)
+    (message "No errors")
+    (return-from js2-display-error-list))
+  (labels ((annotate-list
+            (lst type)
+            "Add diagnostic TYPE and line number to errs list"
+            (mapcar (lambda (err)
+                      (list err type (line-number-at-pos (nth 1 err))))
+                    lst)))
+    (let* ((srcbuf (current-buffer))
+           (errbuf (get-buffer-create "*js-lint*"))
+           (errors (annotate-list
+                    (when js2-mode-ast (js2-ast-root-errors js2-mode-ast))
+                    'js2-error))  ; must be a valid face name
+           (warnings (annotate-list
+                      (when js2-mode-ast (js2-ast-root-warnings js2-mode-ast))
+                      'js2-warning))  ; must be a valid face name
+           (all-errs (sort (append errors warnings)
+                           (lambda (e1 e2) (< (cadar e1) (cadar e2))))))
+      (with-current-buffer errbuf
+        (let ((inhibit-read-only t))
+          (erase-buffer)
+          (dolist (err all-errs)
+            (destructuring-bind ((msg-key beg end &rest) type line) err
+              (insert-text-button
+               (format "line %d: %s" line (js2-get-msg msg-key))
+               'face type
+               'follow-link "\C-m"
+               'action 'js2-error-buffer-jump
+               'js2-msg (js2-get-msg msg-key)
+               'js2-pos beg)
+              (insert "\n"))))
+        (js2-error-buffer-mode)
+        (setq js2-source-buffer srcbuf)
+        (pop-to-buffer errbuf)
+        (goto-char (point-min))
+        (unless (eobp)
+          (js2-error-buffer-view))))))
+
+(defvar js2-error-buffer-mode-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map "n" #'js2-error-buffer-next)
+    (define-key map "p" #'js2-error-buffer-prev)
+    (define-key map (kbd "RET") #'js2-error-buffer-jump)
+    (define-key map "o" #'js2-error-buffer-view)
+    (define-key map "q" #'js2-error-buffer-quit)
+    map)
+  "Keymap used for js2 diagnostics buffers.")
+
+(defun js2-error-buffer-mode ()
+  "Major mode for js2 diagnostics buffers.
+Selecting an error will jump it to the corresponding source-buffer error.
+\\{js2-error-buffer-mode-map}"
+  (interactive)
+  (setq major-mode 'js2-error-buffer-mode
+        mode-name "JS Lint Diagnostics")
+  (use-local-map js2-error-buffer-mode-map)
+  (setq truncate-lines t)
+  (set-buffer-modified-p nil)
+  (setq buffer-read-only t)
+  (run-hooks 'js2-error-buffer-mode-hook))
+
+(defun js2-error-buffer-next ()
+  "Move to next error and view it."
+  (interactive)
+  (when (zerop (forward-line 1))
+    (js2-error-buffer-view)))
+
+(defun js2-error-buffer-prev ()
+  "Move to previous error and view it."
+  (interactive)
+  (when (zerop (forward-line -1))
+    (js2-error-buffer-view)))
+
+(defun js2-error-buffer-quit ()
+  "Kill the current buffer."
+  (interactive)
+  (kill-buffer))
+
+(defun js2-error-buffer-jump (&rest ignored)
+  "Jump cursor to current error in source buffer."
+  (interactive)
+  (when (js2-error-buffer-view)
+    (pop-to-buffer js2-source-buffer)))
+
+(defun js2-error-buffer-view ()
+  "Scroll source buffer to show error at current line."
+  (interactive)
+  (cond
+   ((not (eq major-mode 'js2-error-buffer-mode))
+    (message "Not in a js2 errors buffer"))
+   ((not (buffer-live-p js2-source-buffer))
+    (message "Source buffer has been killed"))
+   ((not (wholenump (get-text-property (point) 'js2-pos)))
+    (message "There does not seem to be an error here"))
+   (t
+    (let ((pos (get-text-property (point) 'js2-pos))
+          (msg (get-text-property (point) 'js2-msg)))
+      (save-selected-window
+        (pop-to-buffer js2-source-buffer)
+        (goto-char pos)
+        (message msg))))))
+
+;;;###autoload
+(define-derived-mode js2-mode prog-mode "Javascript-IDE"
+  ;; FIXME: Should derive from js-mode.
+  "Major mode for editing JavaScript code."
+  (setq comment-start "//"  ; used by comment-region; don't change it
+        comment-end "")
+  (set (make-local-variable 'max-lisp-eval-depth)
+       (max max-lisp-eval-depth 3000))
+  (set (make-local-variable 'indent-line-function) #'js2-indent-line)
+  (set (make-local-variable 'indent-region-function) #'js2-indent-region)
+  (set (make-local-variable 'fill-paragraph-function) #'c-fill-paragraph)
+  (set (make-local-variable 'comment-line-break-function) #'js2-line-break)
+  (set (make-local-variable 'beginning-of-defun-function) #'js2-beginning-of-defun)
+  (set (make-local-variable 'end-of-defun-function) #'js2-end-of-defun)
+  ;; We un-confuse `parse-partial-sexp' by setting syntax-table properties
+  ;; for characters inside regexp literals.
+  (set (make-local-variable 'parse-sexp-lookup-properties) t)
+  ;; this is necessary to make `show-paren-function' work properly
+  (set (make-local-variable 'parse-sexp-ignore-comments) t)
+  ;; needed for M-x rgrep, among other things
+  (put 'js2-mode 'find-tag-default-function #'js2-mode-find-tag)
+
+  (set (make-local-variable 'electric-indent-chars)
+       (append '("{" "}" "(" ")" "[" "]" ":" ";" "," "*")
+               electric-indent-chars))
+  (set (make-local-variable 'electric-layout-rules)
+       '((?\; . after) (?\{ . after) (?\} . before)))
+
+  ;; some variables needed by cc-engine for paragraph-fill, etc.
+  (setq c-comment-prefix-regexp js2-comment-prefix-regexp
+        c-comment-start-regexp "/[*/]\\|\\s|"
+        c-line-comment-starter "//"
+        c-paragraph-start js2-paragraph-start
+        c-paragraph-separate "$"
+        comment-start-skip js2-comment-start-skip
+        c-syntactic-ws-start js2-syntactic-ws-start
+        c-syntactic-ws-end js2-syntactic-ws-end
+        c-syntactic-eol js2-syntactic-eol)
+
+  (let ((c-buffer-is-cc-mode t))
+    ;; Copied from `js-mode'.  Also see Bug#6071.
+    (make-local-variable 'paragraph-start)
+    (make-local-variable 'paragraph-separate)
+    (make-local-variable 'paragraph-ignore-fill-prefix)
+    (make-local-variable 'adaptive-fill-mode)
+    (make-local-variable 'adaptive-fill-regexp)
+    (c-setup-paragraph-variables))
+
+  (setq font-lock-defaults '(nil t))
+
+  ;; Experiment:  make reparse-delay longer for longer files.
+  (when (plusp js2-dynamic-idle-timer-adjust)
+    (setq js2-idle-timer-delay
+          (* js2-idle-timer-delay
+             (/ (point-max) js2-dynamic-idle-timer-adjust))))
+
+  (add-hook 'change-major-mode-hook #'js2-mode-exit nil t)
+  (add-hook 'after-change-functions #'js2-mode-edit nil t)
+  (setq imenu-create-index-function #'js2-mode-create-imenu-index)
+  (setq next-error-function #'js2-next-error)
+  (imenu-add-to-menubar (concat "IM-" mode-name))
+  (add-to-invisibility-spec '(js2-outline . t))
+  (set (make-local-variable 'line-move-ignore-invisible) t)
+  (set (make-local-variable 'forward-sexp-function) #'js2-mode-forward-sexp)
+
+  (setq js2-mode-functions-hidden nil
+        js2-mode-comments-hidden nil
+        js2-mode-buffer-dirty-p t
+        js2-mode-parsing nil)
+
+  (js2-set-default-externs)
+
+  (when js2-include-jslint-globals
+    (add-hook 'js2-post-parse-callbacks 'js2-apply-jslint-globals nil t))
+
+  (run-hooks 'js2-init-hook)
+
+  (js2-reparse))
+
+(defun js2-mode-exit ()
+  "Exit `js2-mode' and clean up."
+  (interactive)
+  (when js2-mode-node-overlay
+    (delete-overlay js2-mode-node-overlay)
+    (setq js2-mode-node-overlay nil))
+  (js2-remove-overlays)
+  (setq js2-mode-ast nil)
+  (remove-hook 'change-major-mode-hook #'js2-mode-exit t)
+  (remove-from-invisibility-spec '(js2-outline . t))
+  (js2-mode-show-all)
+  (with-silent-modifications
+    (js2-clear-face (point-min) (point-max))))
+
+(defun js2-mode-reset-timer ()
+  "Cancel any existing parse timer and schedule a new one."
+  (if js2-mode-parse-timer
+      (cancel-timer js2-mode-parse-timer))
+  (setq js2-mode-parsing nil)
+  (let ((timer (timer-create)))
+    (setq js2-mode-parse-timer timer)
+    (timer-set-function timer 'js2-mode-idle-reparse (list (current-buffer)))
+    (timer-set-idle-time timer js2-idle-timer-delay)
+    ;; http://debbugs.gnu.org/cgi/bugreport.cgi?bug=12326
+    (timer-activate-when-idle timer nil)))
+
+(defun js2-mode-idle-reparse (buffer)
+  "Run `js2-reparse' if BUFFER is the current buffer, or schedule
+it to be reparsed when the buffer is selected."
+  (if (eq buffer (current-buffer))
+      (js2-reparse)
+    ;; reparse when the buffer is selected again
+    (with-current-buffer buffer
+      (add-hook 'window-configuration-change-hook
+                #'js2-mode-idle-reparse-inner
+                nil t))))
+
+(defun js2-mode-idle-reparse-inner ()
+  (remove-hook 'window-configuration-change-hook
+               #'js2-mode-idle-reparse-inner
+               t)
+  (js2-reparse))
+
+(defun js2-mode-edit (beg end len)
+  "Schedule a new parse after buffer is edited.
+Buffer edit spans from BEG to END and is of length LEN."
+  (setq js2-mode-buffer-dirty-p t)
+  (js2-mode-hide-overlay)
+  (js2-mode-reset-timer))
+
+(defun js2-minor-mode-edit (beg end len)
+  "Callback for buffer edits in `js2-mode'.
+Schedules a new parse after buffer is edited.
+Buffer edit spans from BEG to END and is of length LEN."
+  (setq js2-mode-buffer-dirty-p t)
+  (js2-mode-hide-overlay)
+  (js2-mode-reset-timer))
+
+(defun js2-reparse (&optional force)
+  "Re-parse current buffer after user finishes some data entry.
+If we get any user input while parsing, including cursor motion,
+we discard the parse and reschedule it.  If FORCE is nil, then the
+buffer will only rebuild its `js2-mode-ast' if the buffer is dirty."
+  (let (time
+        interrupted-p
+        (js2-compiler-strict-mode js2-mode-show-strict-warnings))
+    (unless js2-mode-parsing
+      (setq js2-mode-parsing t)
+      (unwind-protect
+          (when (or js2-mode-buffer-dirty-p force)
+            (js2-remove-overlays)
+            (with-silent-modifications
+              (setq js2-mode-buffer-dirty-p nil
+                    js2-mode-fontifications nil
+                    js2-mode-deferred-properties nil)
+              (if js2-mode-verbose-parse-p
+                  (message "parsing..."))
+              (setq time
+                    (js2-time
+                     (setq interrupted-p
+                           (catch 'interrupted
+                             (js2-parse)
+                             ;; if parsing is interrupted, comments and regex
+                             ;; literals stay ignored by `parse-partial-sexp'
+                             (remove-text-properties (point-min) (point-max)
+                                                     '(syntax-table))
+                             (js2-mode-apply-deferred-properties)
+                             (js2-mode-remove-suppressed-warnings)
+                             (js2-mode-show-warnings)
+                             (js2-mode-show-errors)
+                             (if (>= js2-highlight-level 1)
+                                 (js2-highlight-jsdoc js2-mode-ast))
+                             nil))))
+              (if interrupted-p
+                  (progn
+                    ;; unfinished parse => try again
+                    (setq js2-mode-buffer-dirty-p t)
+                    (js2-mode-reset-timer))
+                (if js2-mode-verbose-parse-p
+                    (message "Parse time: %s" time)))))
+        (setq js2-mode-parsing nil)
+        (unless interrupted-p
+          (setq js2-mode-parse-timer nil))))))
+
+(defun js2-mode-show-node (event)
+  "Debugging aid:  highlight selected AST node on mouse click."
+  (interactive "e")
+  (mouse-set-point event)
+  (setq deactivate-mark t)
+  (when js2-mode-show-overlay
+    (let ((node (js2-node-at-point))
+          beg end)
+      (if (null node)
+          (message "No node found at location %s" (point))
+        (setq beg (js2-node-abs-pos node)
+              end (+ beg (js2-node-len node)))
+        (if js2-mode-node-overlay
+            (move-overlay js2-mode-node-overlay beg end)
+          (setq js2-mode-node-overlay (make-overlay beg end))
+          (overlay-put js2-mode-node-overlay 'font-lock-face 'highlight))
+        (with-silent-modifications
+          (put-text-property beg end 'point-left #'js2-mode-hide-overlay))
+        (message "%s, parent: %s"
+                 (js2-node-short-name node)
+                 (if (js2-node-parent node)
+                     (js2-node-short-name (js2-node-parent node))
+                   "nil"))))))
+
+(defun js2-mode-hide-overlay (&optional p1 p2)
+  "Remove the debugging overlay when the point moves.
+P1 and P2 are the old and new values of point, respectively."
+  (when js2-mode-node-overlay
+    (let ((beg (overlay-start js2-mode-node-overlay))
+          (end (overlay-end js2-mode-node-overlay)))
+      ;; Sometimes we're called spuriously.
+      (unless (and p2
+                   (>= p2 beg)
+                   (<= p2 end))
+        (with-silent-modifications
+          (remove-text-properties beg end '(point-left nil)))
+        (delete-overlay js2-mode-node-overlay)
+        (setq js2-mode-node-overlay nil)))))
+
+(defun js2-mode-reset ()
+  "Debugging helper:  reset everything."
+  (interactive)
+  (js2-mode-exit)
+  (js2-mode))
+
+(defun js2-mode-show-warn-or-err (e face)
+  "Highlight a warning or error E with FACE.
+E is a list of ((MSG-KEY MSG-ARG) BEG LEN OVERRIDE-FACE).
+The last element is optional.  When present, use instead of FACE."
+  (let* ((key (first e))
+         (beg (second e))
+         (end (+ beg (third e)))
+         ;; Don't inadvertently go out of bounds.
+         (beg (max (point-min) (min beg (point-max))))
+         (end (max (point-min) (min end (point-max))))
+         (js2-highlight-level 3)    ; so js2-set-face is sure to fire
+         (ovl (make-overlay beg end)))
+    (overlay-put ovl 'font-lock-face (or (fourth e) face))
+    (overlay-put ovl 'js2-error t)
+    (put-text-property beg end 'help-echo (js2-get-msg key))
+    (put-text-property beg end 'point-entered #'js2-echo-error)))
+
+(defun js2-remove-overlays ()
+  "Remove overlays from buffer that have a `js2-error' property."
+  (let ((beg (point-min))
+        (end (point-max)))
+    (save-excursion
+      (dolist (o (overlays-in beg end))
+        (when (overlay-get o 'js2-error)
+          (delete-overlay o))))))
+
+(defun js2-error-at-point (&optional pos)
+  "Return non-nil if there's an error overlay at POS.
+Defaults to point."
+  (loop with pos = (or pos (point))
+        for o in (overlays-at pos)
+        thereis (overlay-get o 'js2-error)))
+
+(defun js2-mode-apply-deferred-properties ()
+  "Apply fontifications and other text properties recorded during parsing."
+  (when (plusp js2-highlight-level)
+    ;; We defer clearing faces as long as possible to eliminate flashing.
+    (js2-clear-face (point-min) (point-max))
+    ;; Have to reverse the recorded fontifications list so that errors
+    ;; and warnings overwrite the normal fontifications.
+    (dolist (f (nreverse js2-mode-fontifications))
+      (put-text-property (first f) (second f) 'font-lock-face (third f)))
+    (setq js2-mode-fontifications nil))
+  (dolist (p js2-mode-deferred-properties)
+    (apply #'put-text-property p))
+  (setq js2-mode-deferred-properties nil))
+
+(defun js2-mode-show-errors ()
+  "Highlight syntax errors."
+  (when js2-mode-show-parse-errors
+    (dolist (e (js2-ast-root-errors js2-mode-ast))
+      (js2-mode-show-warn-or-err e 'js2-error))))
+
+(defun js2-mode-remove-suppressed-warnings ()
+  "Take suppressed warnings out of the AST warnings list.
+This ensures that the counts and `next-error' are correct."
+  (setf (js2-ast-root-warnings js2-mode-ast)
+        (js2-delete-if
+         (lambda (e)
+           (let ((key (caar e)))
+             (or
+              (and (not js2-strict-trailing-comma-warning)
+                   (string-match "trailing\\.comma" key))
+              (and (not js2-strict-cond-assign-warning)
+                   (string= key "msg.equal.as.assign"))
+              (and js2-missing-semi-one-line-override
+                   (string= key "msg.missing.semi")
+                   (let* ((beg (second e))
+                          (node (js2-node-at-point beg))
+                          (fn (js2-mode-find-parent-fn node))
+                          (body (and fn (js2-function-node-body fn)))
+                          (lc (and body (js2-node-abs-pos body)))
+                          (rc (and lc (+ lc (js2-node-len body)))))
+                     (and fn
+                          (or (null body)
+                              (save-excursion
+                                (goto-char beg)
+                                (and (js2-same-line lc)
+                                     (js2-same-line rc))))))))))
+         (js2-ast-root-warnings js2-mode-ast))))
+
+(defun js2-mode-show-warnings ()
+  "Highlight strict-mode warnings."
+  (when js2-mode-show-strict-warnings
+    (dolist (e (js2-ast-root-warnings js2-mode-ast))
+      (js2-mode-show-warn-or-err e 'js2-warning))))
+
+(defun js2-echo-error (old-point new-point)
+  "Called by point-motion hooks."
+  (let ((msg (get-text-property new-point 'help-echo)))
+    (when (and (stringp msg)
+               (not (active-minibuffer-window))
+               (not (current-message)))
+      (message msg))))
+
+(defalias #'js2-echo-help #'js2-echo-error)
+
+(defun js2-line-break (&optional soft)
+  "Break line at point and indent, continuing comment if within one.
+If inside a string, and `js2-concat-multiline-strings' is not
+nil, turn it into concatenation."
+  (interactive)
+  (let ((parse-status (syntax-ppss)))
+    (cond
+     ;; Check if we're inside a string.
+     ((nth 3 parse-status)
+      (if js2-concat-multiline-strings
+          (js2-mode-split-string parse-status)
+        (insert "\n")))
+     ;; Check if inside a block comment.
+     ((nth 4 parse-status)
+      (js2-mode-extend-comment (nth 8 parse-status)))
+     (t
+      (newline-and-indent)))))
+
+(defun js2-mode-split-string (parse-status)
+  "Turn a newline in mid-string into a string concatenation.
+PARSE-STATUS is as documented in `parse-partial-sexp'."
+  (let* ((col (current-column))
+         (quote-char (nth 3 parse-status))
+         (string-beg (nth 8 parse-status))
+         (at-eol (eq js2-concat-multiline-strings 'eol)))
+    (insert quote-char)
+    (if at-eol
+        (insert " +\n")
+      (insert "\n"))
+    (unless at-eol
+      (insert "+ "))
+    (js2-indent-line)
+    (insert quote-char)
+    (when (eolp)
+      (insert quote-char)
+      (backward-char 1))))
+
+(defun js2-mode-extend-comment (start-pos)
+  "Indent the line and, when inside a comment block, add comment prefix."
+  (let (star single col first-line needs-close)
+    (save-excursion
+      (back-to-indentation)
+      (when (< (point) start-pos)
+        (goto-char start-pos))
+      (cond
+       ((looking-at "\\*[^/]")
+        (setq star t
+              col (current-column)))
+       ((looking-at "/\\*")
+        (setq star t
+              first-line t
+              col (1+ (current-column))))
+       ((looking-at "//")
+        (setq single t
+              col (current-column)))))
+    ;; Heuristic for whether we need to close the comment:
+    ;; if we've got a parse error here, assume it's an unterminated
+    ;; comment.
+    (setq needs-close
+          (or
+           (eq (get-text-property (1- (point)) 'point-entered)
+               'js2-echo-error)
+           ;; The heuristic above doesn't work well when we're
+           ;; creating a comment and there's another one downstream,
+           ;; as our parser thinks this one ends at the end of the
+           ;; next one.  (You can have a /* inside a js block comment.)
+           ;; So just close it if the next non-ws char isn't a *.
+           (and first-line
+                (eolp)
+                (save-excursion
+                  (skip-chars-forward " \t\r\n")
+                  (not (eq (char-after) ?*))))))
+    (delete-horizontal-space)
+    (insert "\n")
+    (cond
+     (star
+      (indent-to col)
+      (insert "* ")
+      (if (and first-line needs-close)
+          (save-excursion
+            (insert "\n")
+            (indent-to col)
+            (insert "*/"))))
+     ((and single
+           (save-excursion
+              (and (zerop (forward-line 1))
+                   (looking-at "\\s-*//"))))
+      (indent-to col)
+      (insert "// ")))
+    ;; Don't need to extend the comment after all.
+    (js2-indent-line)))
+
+(defun js2-beginning-of-line ()
+  "Toggle point between bol and first non-whitespace char in line.
+Also moves past comment delimiters when inside comments."
+  (interactive)
+  (let (node beg)
+    (cond
+     ((bolp)
+      (back-to-indentation))
+     ((looking-at "//")
+      (skip-chars-forward "/ \t"))
+     ((and (eq (char-after) ?*)
+           (setq node (js2-comment-at-point))
+           (memq (js2-comment-node-format node) '(jsdoc block))
+           (save-excursion
+             (skip-chars-backward " \t")
+             (bolp)))
+      (skip-chars-forward "\* \t"))
+     (t
+      (goto-char (point-at-bol))))))
+
+(defun js2-end-of-line ()
+  "Toggle point between eol and last non-whitespace char in line."
+  (interactive)
+  (if (eolp)
+      (skip-chars-backward " \t")
+    (goto-char (point-at-eol))))
+
+(defun js2-mode-wait-for-parse (callback)
+  "Invoke CALLBACK when parsing is finished.
+If parsing is already finished, calls CALLBACK immediately."
+  (if (not js2-mode-buffer-dirty-p)
+      (funcall callback)
+    (push callback js2-mode-pending-parse-callbacks)
+    (add-hook 'js2-parse-finished-hook #'js2-mode-parse-finished)))
+
+(defun js2-mode-parse-finished ()
+  "Invoke callbacks in `js2-mode-pending-parse-callbacks'."
+  ;; We can't let errors propagate up, since it prevents the
+  ;; `js2-parse' method from completing normally and returning
+  ;; the ast, which makes things mysteriously not work right.
+  (unwind-protect
+      (dolist (cb js2-mode-pending-parse-callbacks)
+        (condition-case err
+            (funcall cb)
+          (error (message "%s" err))))
+    (setq js2-mode-pending-parse-callbacks nil)))
+
+(defun js2-mode-flag-region (from to flag)
+  "Hide or show text from FROM to TO, according to FLAG.
+If FLAG is nil then text is shown, while if FLAG is t the text is hidden.
+Returns the created overlay if FLAG is non-nil."
+  (remove-overlays from to 'invisible 'js2-outline)
+  (when flag
+    (let ((o (make-overlay from to)))
+      (overlay-put o 'invisible 'js2-outline)
+      (overlay-put o 'isearch-open-invisible
+                   'js2-isearch-open-invisible)
+      o)))
+
+;; Function to be set as an outline-isearch-open-invisible' property
+;; to the overlay that makes the outline invisible (see
+;; `js2-mode-flag-region').
+(defun js2-isearch-open-invisible (overlay)
+  ;; We rely on the fact that isearch places point on the matched text.
+  (js2-mode-show-element))
+
+(defun js2-mode-invisible-overlay-bounds (&optional pos)
+  "Return cons cell of bounds of folding overlay at POS.
+Returns nil if not found."
+  (let ((overlays (overlays-at (or pos (point))))
+        o)
+    (while (and overlays
+                (not o))
+      (if (overlay-get (car overlays) 'invisible)
+          (setq o (car overlays))
+        (setq overlays (cdr overlays))))
+    (if o
+        (cons (overlay-start o) (overlay-end o)))))
+
+(defun js2-mode-function-at-point (&optional pos)
+  "Return the innermost function node enclosing current point.
+Returns nil if point is not in a function."
+  (let ((node (js2-node-at-point pos)))
+    (while (and node (not (js2-function-node-p node)))
+      (setq node (js2-node-parent node)))
+    (if (js2-function-node-p node)
+        node)))
+
+(defun js2-mode-toggle-element ()
+  "Hide or show the foldable element at the point."
+  (interactive)
+  (let (comment fn pos)
+    (save-excursion
+      (cond
+       ;; /* ... */ comment?
+       ((js2-block-comment-p (setq comment (js2-comment-at-point)))
+        (if (js2-mode-invisible-overlay-bounds
+             (setq pos (+ 3 (js2-node-abs-pos comment))))
+            (progn
+              (goto-char pos)
+              (js2-mode-show-element))
+          (js2-mode-hide-element)))
+       ;; //-comment?
+       ((save-excursion
+          (back-to-indentation)
+          (looking-at js2-mode-//-comment-re))
+        (js2-mode-toggle-//-comment))
+       ;; function?
+       ((setq fn (js2-mode-function-at-point))
+        (setq pos (and (js2-function-node-body fn)
+                       (js2-node-abs-pos (js2-function-node-body fn))))
+        (goto-char (1+ pos))
+        (if (js2-mode-invisible-overlay-bounds)
+            (js2-mode-show-element)
+          (js2-mode-hide-element)))
+       (t
+        (message "Nothing at point to hide or show"))))))
+
+(defun js2-mode-hide-element ()
+  "Fold/hide contents of a block, showing ellipses.
+Show the hidden text with \\[js2-mode-show-element]."
+  (interactive)
+  (if js2-mode-buffer-dirty-p
+      (js2-mode-wait-for-parse #'js2-mode-hide-element))
+  (let (node body beg end)
+    (cond
+     ((js2-mode-invisible-overlay-bounds)
+      (message "already hidden"))
+     (t
+      (setq node (js2-node-at-point))
+      (cond
+       ((js2-block-comment-p node)
+        (js2-mode-hide-comment node))
+       (t
+        (while (and node (not (js2-function-node-p node)))
+          (setq node (js2-node-parent node)))
+        (if (and node
+                 (setq body (js2-function-node-body node)))
+            (progn
+              (setq beg (js2-node-abs-pos body)
+                    end (+ beg (js2-node-len body)))
+              (js2-mode-flag-region (1+ beg) (1- end) 'hide))
+          (message "No collapsable element found at point"))))))))
+
+(defun js2-mode-show-element ()
+  "Show the hidden element at current point."
+  (interactive)
+  (let ((bounds (js2-mode-invisible-overlay-bounds)))
+    (if bounds
+        (js2-mode-flag-region (car bounds) (cdr bounds) nil)
+      (message "Nothing to un-hide"))))
+
+(defun js2-mode-show-all ()
+  "Show all of the text in the buffer."
+  (interactive)
+  (js2-mode-flag-region (point-min) (point-max) nil))
+
+(defun js2-mode-toggle-hide-functions ()
+  (interactive)
+  (if js2-mode-functions-hidden
+      (js2-mode-show-functions)
+    (js2-mode-hide-functions)))
+
+(defun js2-mode-hide-functions ()
+  "Hides all non-nested function bodies in the buffer.
+Use \\[js2-mode-show-all] to reveal them, or \\[js2-mode-show-element]
+to open an individual entry."
+  (interactive)
+  (if js2-mode-buffer-dirty-p
+      (js2-mode-wait-for-parse #'js2-mode-hide-functions))
+  (if (null js2-mode-ast)
+      (message "Oops - parsing failed")
+    (setq js2-mode-functions-hidden t)
+    (js2-visit-ast js2-mode-ast #'js2-mode-function-hider)))
+
+(defun js2-mode-function-hider (n endp)
+  (when (not endp)
+    (let ((tt (js2-node-type n))
+          body beg end)
+      (cond
+       ((and (= tt js2-FUNCTION)
+             (setq body (js2-function-node-body n)))
+        (setq beg (js2-node-abs-pos body)
+              end (+ beg (js2-node-len body)))
+        (js2-mode-flag-region (1+ beg) (1- end) 'hide)
+        nil)   ; don't process children of function
+       (t
+        t))))) ; keep processing other AST nodes
+
+(defun js2-mode-show-functions ()
+  "Un-hide any folded function bodies in the buffer."
+  (interactive)
+  (setq js2-mode-functions-hidden nil)
+  (save-excursion
+    (goto-char (point-min))
+    (while (/= (goto-char (next-overlay-change (point)))
+               (point-max))
+      (dolist (o (overlays-at (point)))
+        (when (and (overlay-get o 'invisible)
+                   (not (overlay-get o 'comment)))
+          (js2-mode-flag-region (overlay-start o) (overlay-end o) nil))))))
+
+(defun js2-mode-hide-comment (n)
+  (let* ((head (if (eq (js2-comment-node-format n) 'jsdoc)
+                   3  ; /**
+                 2))  ; /*
+         (beg (+ (js2-node-abs-pos n) head))
+         (end (- (+ beg (js2-node-len n)) head 2))
+         (o (js2-mode-flag-region beg end 'hide)))
+    (overlay-put o 'comment t)))
+
+(defun js2-mode-toggle-hide-comments ()
+  "Folds all block comments in the buffer.
+Use \\[js2-mode-show-all] to reveal them, or \\[js2-mode-show-element]
+to open an individual entry."
+  (interactive)
+  (if js2-mode-comments-hidden
+      (js2-mode-show-comments)
+    (js2-mode-hide-comments)))
+
+(defun js2-mode-hide-comments ()
+  (interactive)
+  (if js2-mode-buffer-dirty-p
+      (js2-mode-wait-for-parse #'js2-mode-hide-comments))
+  (if (null js2-mode-ast)
+      (message "Oops - parsing failed")
+    (setq js2-mode-comments-hidden t)
+    (dolist (n (js2-ast-root-comments js2-mode-ast))
+      (let ((format (js2-comment-node-format n)))
+        (when (js2-block-comment-p n)
+          (js2-mode-hide-comment n))))
+    (js2-mode-hide-//-comments)))
+
+(defun js2-mode-extend-//-comment (direction)
+  "Find start or end of a block of similar //-comment lines.
+DIRECTION is -1 to look back, 1 to look forward.
+INDENT is the indentation level to match.
+Returns the end-of-line position of the furthest adjacent
+//-comment line with the same indentation as the current line.
+If there is no such matching line, returns current end of line."
+  (let ((pos (point-at-eol))
+        (indent (current-indentation)))
+    (save-excursion
+      (while (and (zerop (forward-line direction))
+                  (looking-at js2-mode-//-comment-re)
+                  (eq indent (length (match-string 1))))
+        (setq pos (point-at-eol))
+      pos))))
+
+(defun js2-mode-hide-//-comments ()
+  "Fold adjacent 1-line comments, showing only snippet of first one."
+  (let (beg end)
+    (save-excursion
+      (goto-char (point-min))
+      (while (re-search-forward js2-mode-//-comment-re nil t)
+        (setq beg (point)
+              end (js2-mode-extend-//-comment 1))
+        (unless (eq beg end)
+          (overlay-put (js2-mode-flag-region beg end 'hide)
+                       'comment t))
+        (goto-char end)
+        (forward-char 1)))))
+
+(defun js2-mode-toggle-//-comment ()
+  "Fold or un-fold any multi-line //-comment at point.
+Caller should have determined that this line starts with a //-comment."
+  (let* ((beg (point-at-eol))
+         (end beg))
+    (save-excursion
+      (goto-char end)
+      (if (js2-mode-invisible-overlay-bounds)
+          (js2-mode-show-element)
+        ;; else hide the comment
+        (setq beg (js2-mode-extend-//-comment -1)
+              end (js2-mode-extend-//-comment 1))
+        (unless (eq beg end)
+          (overlay-put (js2-mode-flag-region beg end 'hide)
+                       'comment t))))))
+
+(defun js2-mode-show-comments ()
+  "Un-hide any hidden comments, leaving other hidden elements alone."
+  (interactive)
+  (setq js2-mode-comments-hidden nil)
+  (save-excursion
+    (goto-char (point-min))
+    (while (/= (goto-char (next-overlay-change (point)))
+               (point-max))
+      (dolist (o (overlays-at (point)))
+        (when (overlay-get o 'comment)
+          (js2-mode-flag-region (overlay-start o) (overlay-end o) nil))))))
+
+(defun js2-mode-display-warnings-and-errors ()
+  "Turn on display of warnings and errors."
+  (interactive)
+  (setq js2-mode-show-parse-errors t
+        js2-mode-show-strict-warnings t)
+  (js2-reparse 'force))
+
+(defun js2-mode-hide-warnings-and-errors ()
+  "Turn off display of warnings and errors."
+  (interactive)
+  (setq js2-mode-show-parse-errors nil
+        js2-mode-show-strict-warnings nil)
+  (js2-reparse 'force))
+
+(defun js2-mode-toggle-warnings-and-errors ()
+  "Toggle the display of warnings and errors.
+Some users don't like having warnings/errors reported while they type."
+  (interactive)
+  (setq js2-mode-show-parse-errors (not js2-mode-show-parse-errors)
+        js2-mode-show-strict-warnings (not js2-mode-show-strict-warnings))
+  (if (called-interactively-p 'any)
+      (message "warnings and errors %s"
+               (if js2-mode-show-parse-errors
+                   "enabled"
+                 "disabled")))
+  (js2-reparse 'force))
+
+(defun js2-mode-customize ()
+  (interactive)
+  (customize-group 'js2-mode))
+
+(defun js2-mode-forward-sexp (&optional arg)
+  "Move forward across one statement or balanced expression.
+With ARG, do it that many times.  Negative arg -N means
+move backward across N balanced expressions."
+  (interactive "p")
+  (setq arg (or arg 1))
+  (save-restriction
+    (widen) ;; `blink-matching-open' calls `narrow-to-region'
+    (js2-reparse))
+  (let (forward-sexp-function
+        node (start (point)) pos lp rp child)
+    (cond
+     ;; backward-sexp
+     ;; could probably make this better for some cases:
+     ;;  - if in statement block (e.g. function body), go to parent
+     ;;  - infix exprs like (foo in bar) - maybe go to beginning
+     ;;    of infix expr if in the right-side expression?
+     ((and arg (minusp arg))
+      (dotimes (i (- arg))
+        (js2-backward-sws)
+        (forward-char -1)   ; Enter the node we backed up to.
+        (when (setq node (js2-node-at-point (point) t))
+          (setq pos (js2-node-abs-pos node))
+          (let ((parens (js2-mode-forward-sexp-parens node pos)))
+            (setq lp (car parens)
+                  rp (cdr parens)))
+          (when (and lp (> start lp))
+            (if (and rp (<= start rp))
+                ;; Between parens, check if there's a child node we can jump.
+                (when (setq child (js2-node-closest-child node (point) lp t))
+                  (setq pos (js2-node-abs-pos child)))
+              ;; Before both parens.
+              (setq pos lp)))
+          (let ((state (parse-partial-sexp start pos)))
+            (goto-char (if (not (zerop (car state)))
+                           ;; Stumble at the unbalanced paren if < 0, or
+                           ;; jump a bit further if > 0.
+                           (scan-sexps start -1)
+                         pos))))
+        (unless pos (goto-char (point-min)))))
+     (t
+      ;; forward-sexp
+      (dotimes (i arg)
+        (js2-forward-sws)
+        (when (setq node (js2-node-at-point (point) t))
+          (setq pos (js2-node-abs-pos node))
+          (let ((parens (js2-mode-forward-sexp-parens node pos)))
+            (setq lp (car parens)
+                  rp (cdr parens)))
+          (or
+           (when (and rp (<= start rp))
+             (if (> start lp)
+                 (when (setq child (js2-node-closest-child node (point) rp))
+                   (setq pos (js2-node-abs-end child)))
+               (setq pos (1+ rp))))
+           ;; No parens or child nodes, looks for the end of the curren node.
+           (incf pos (js2-node-len
+                      (if (js2-expr-stmt-node-p (js2-node-parent node))
+                          ;; Stop after the semicolon.
+                          (js2-node-parent node)
+                        node))))
+          (let ((state (save-excursion (parse-partial-sexp start pos))))
+            (goto-char (if (not (zerop (car state)))
+                           (scan-sexps start 1)
+                         pos))))
+        (unless pos (goto-char (point-max))))))))
+
+(defun js2-mode-forward-sexp-parens (node abs-pos)
+  "Return a cons cell with positions of main parens in NODE."
+  (cond
+   ((or (js2-array-node-p node)
+        (js2-object-node-p node)
+        (js2-array-comp-node-p node)
+        (memq (aref node 0) '(cl-struct-js2-block-node cl-struct-js2-scope)))
+    (cons abs-pos (+ abs-pos (js2-node-len node) -1)))
+   ((js2-paren-expr-node-p node)
+    (let ((lp (js2-node-lp node))
+          (rp (js2-node-rp node)))
+      (cons (when lp (+ abs-pos lp))
+            (when rp (+ abs-pos rp)))))))
+
+(defun js2-node-closest-child (parent point limit &optional before)
+  (let* ((parent-pos (js2-node-abs-pos parent))
+         (rpoint (- point parent-pos))
+         (rlimit (- limit parent-pos))
+         (min (min rpoint rlimit))
+         (max (max rpoint rlimit))
+         found)
+    (catch 'done
+      (js2-visit-ast
+       parent
+       (lambda (node end-p)
+         (if (eq node parent)
+             t
+           (let ((pos (js2-node-pos node)) ;; Both relative values.
+                 (end (+ (js2-node-pos node) (js2-node-len node))))
+             (when (and (>= pos min) (<= end max)
+                        (if before (< pos rpoint) (> end rpoint)))
+               (setq found node))
+             (when (> end rpoint)
+               (throw 'done nil)))
+           nil))))
+    found))
+
+(defun js2-errors ()
+  "Return a list of errors found."
+  (and js2-mode-ast
+       (js2-ast-root-errors js2-mode-ast)))
+
+(defun js2-warnings ()
+  "Return a list of warnings found."
+  (and js2-mode-ast
+       (js2-ast-root-warnings js2-mode-ast)))
+
+(defun js2-have-errors-p ()
+  "Return non-nil if any parse errors or warnings were found."
+  (or (js2-errors) (js2-warnings)))
+
+(defun js2-errors-and-warnings ()
+  "Return a copy of the concatenated errors and warnings lists.
+They are appended:  first the errors, then the warnings.
+Entries are of the form (MSG BEG END)."
+  (when js2-mode-ast
+    (append (js2-ast-root-errors js2-mode-ast)
+            (copy-sequence (js2-ast-root-warnings js2-mode-ast)))))
+
+(defun js2-next-error (&optional arg reset)
+  "Move to next parse error.
+Typically invoked via \\[next-error].
+ARG is the number of errors, forward or backward, to move.
+RESET means start over from the beginning."
+  (interactive "p")
+  (if (not (or (js2-errors) (js2-warnings)))
+      (message "No errors")
+    (when reset
+      (goto-char (point-min)))
+    (let* ((errs (js2-errors-and-warnings))
+           (continue t)
+           (start (point))
+           (count (or arg 1))
+           (backward (minusp count))
+           (sorter (if backward '> '<))
+           (stopper (if backward '< '>))
+           (count (abs count))
+           all-errs err)
+      ;; Sort by start position.
+      (setq errs (sort errs (lambda (e1 e2)
+                              (funcall sorter (second e1) (second e2))))
+            all-errs errs)
+      ;; Find nth error with pos > start.
+      (while (and errs continue)
+        (when (funcall stopper (cadar errs) start)
+          (setq err (car errs))
+          (if (zerop (decf count))
+              (setq continue nil)))
+        (setq errs (cdr errs)))
+      ;; Clear for `js2-echo-error'.
+      (message nil)
+      (if err
+          (goto-char (second err))
+        ;; Wrap around to first error.
+        (goto-char (second (car all-errs)))
+        ;; If we were already on it, echo msg again.
+        (if (= (point) start)
+            (js2-echo-error (point) (point)))))))
+
+(defun js2-down-mouse-3 ()
+  "Make right-click move the point to the click location.
+This makes right-click context menu operations a bit more intuitive.
+The point will not move if the region is active, however, to avoid
+destroying the region selection."
+  (interactive)
+  (when (and js2-move-point-on-right-click
+             (not mark-active))
+    (let ((e last-input-event))
+      (ignore-errors
+        (goto-char (cadadr e))))))
+
+(defun js2-mode-create-imenu-index ()
+  "Return an alist for `imenu--index-alist'."
+  ;; This is built up in `js2-parse-record-imenu' during parsing.
+  (when js2-mode-ast
+    ;; if we have an ast but no recorder, they're requesting a rescan
+    (unless js2-imenu-recorder
+      (js2-reparse 'force))
+    (prog1
+        (js2-build-imenu-index)
+      (setq js2-imenu-recorder nil
+            js2-imenu-function-map nil))))
+
+(defun js2-mode-find-tag ()
+  "Replacement for `find-tag-default'.
+`find-tag-default' returns a ridiculous answer inside comments."
+  (let (beg end)
+    (js2-with-underscore-as-word-syntax
+      (save-excursion
+        (if (and (not (looking-at "[A-Za-z0-9_$]"))
+                 (looking-back "[A-Za-z0-9_$]"))
+            (setq beg (progn (forward-word -1) (point))
+                  end (progn (forward-word 1) (point)))
+          (setq beg (progn (forward-word 1) (point))
+                end (progn (forward-word -1) (point))))
+        (replace-regexp-in-string
+         "[\"']" ""
+         (buffer-substring-no-properties beg end))))))
+
+(defun js2-mode-forward-sibling ()
+  "Move to the end of the sibling following point in parent.
+Returns non-nil if successful, or nil if there was no following sibling."
+  (let* ((node (js2-node-at-point))
+         (parent (js2-mode-find-enclosing-fn node))
+         sib)
+    (when (setq sib (js2-node-find-child-after (point) parent))
+      (goto-char (+ (js2-node-abs-pos sib)
+                    (js2-node-len sib))))))
+
+(defun js2-mode-backward-sibling ()
+  "Move to the beginning of the sibling node preceding point in parent.
+Parent is defined as the enclosing script or function."
+  (let* ((node (js2-node-at-point))
+         (parent (js2-mode-find-enclosing-fn node))
+         sib)
+    (when (setq sib (js2-node-find-child-before (point) parent))
+      (goto-char (js2-node-abs-pos sib)))))
+
+(defun js2-beginning-of-defun (&optional arg)
+  "Go to line on which current function starts, and return t on success.
+If we're not in a function or already at the beginning of one, go
+to beginning of previous script-level element.
+With ARG N, do that N times. If N is negative, move forward."
+  (setq arg (or arg 1))
+  (if (plusp arg)
+      (let ((parent (js2-node-parent-script-or-fn (js2-node-at-point))))
+        (when (cond
+               ((js2-function-node-p parent)
+                (goto-char (js2-node-abs-pos parent)))
+               (t
+                (js2-mode-backward-sibling)))
+          (if (> arg 1)
+              (js2-beginning-of-defun (1- arg))
+            t)))
+    (when (js2-end-of-defun)
+      (if (>= arg -1)
+          (js2-beginning-of-defun 1)
+        (js2-beginning-of-defun (1+ arg))))))
+
+(defun js2-end-of-defun ()
+  "Go to the char after the last position of the current function
+or script-level element."
+  (let* ((node (js2-node-at-point))
+         (parent (or (and (js2-function-node-p node) node)
+                     (js2-node-parent-script-or-fn node)))
+         script)
+    (unless (js2-function-node-p parent)
+      ;; Use current script-level node, or, if none, the next one.
+      (setq script (or parent node)
+            parent (js2-node-find-child-before (point) script))
+      (when (or (null parent)
+                (>= (point) (+ (js2-node-abs-pos parent)
+                               (js2-node-len parent))))
+        (setq parent (js2-node-find-child-after (point) script))))
+    (when parent
+      (goto-char (+ (js2-node-abs-pos parent)
+                    (js2-node-len parent))))))
+
+(defun js2-mark-defun (&optional allow-extend)
+  "Put mark at end of this function, point at beginning.
+The function marked is the one that contains point.
+
+Interactively, if this command is repeated,
+or (in Transient Mark mode) if the mark is active,
+it marks the next defun after the ones already marked."
+  (interactive "p")
+  (let (extended)
+    (when (and allow-extend
+               (or (and (eq last-command this-command) (mark t))
+                   (and transient-mark-mode mark-active)))
+      (let ((sib (save-excursion
+                   (goto-char (mark))
+                   (if (js2-mode-forward-sibling)
+                       (point))))
+            node)
+        (if sib
+            (progn
+              (set-mark sib)
+              (setq extended t))
+          ;; no more siblings - try extending to enclosing node
+          (goto-char (mark t)))))
+   (when (not extended)
+     (let ((node (js2-node-at-point (point) t)) ; skip comments
+           ast fn stmt parent beg end)
+       (when (js2-ast-root-p node)
+         (setq ast node
+               node (or (js2-node-find-child-after (point) node)
+                        (js2-node-find-child-before (point) node))))
+       ;; only mark whole buffer if we can't find any children
+       (if (null node)
+           (setq node ast))
+       (if (js2-function-node-p node)
+           (setq parent node)
+         (setq fn (js2-mode-find-enclosing-fn node)
+               stmt (if (or (null fn)
+                            (js2-ast-root-p fn))
+                        (js2-mode-find-first-stmt node))
+               parent (or stmt fn)))
+       (setq beg (js2-node-abs-pos parent)
+             end (+ beg (js2-node-len parent)))
+       (push-mark beg)
+       (goto-char end)
+       (exchange-point-and-mark)))))
+
+(defun js2-narrow-to-defun ()
+  "Narrow to the function enclosing point."
+  (interactive)
+  (let* ((node (js2-node-at-point (point) t))  ; skip comments
+         (fn (if (js2-script-node-p node)
+                 node
+               (js2-mode-find-enclosing-fn node)))
+         (beg (js2-node-abs-pos fn)))
+    (unless (js2-ast-root-p fn)
+      (narrow-to-region beg (+ beg (js2-node-len fn))))))
+
+(provide 'js2-mode)
+
+;;; js2-mode.el ends here
diff --git a/packages/jumpc/jumpc.el b/packages/jumpc/jumpc.el
new file mode 100644 (file)
index 0000000..bf28d0c
--- /dev/null
@@ -0,0 +1,235 @@
+;;; jumpc.el --- jump to previous insertion points  -*- coding: utf-8; lexical-binding: t -*-
+
+;; Copyright (C) 2013  Free Software Foundation, Inc.
+
+;; Author: Ivan Kanis <ivan@kanis.fr>
+;; Version: 3.0
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This implements the jump cursor feature found in vim.
+
+;; A jump is added every time you insert a character on a different
+;; line.
+
+;; Jumps are remembered in a jump list.  With the C-o and C-i
+;; command you can go to cursor positions before older jumps, and back
+;; again.  Thus you can move up and down the list.
+
+;; Jumps are read and saved in the same configuration file as vim so
+;; you can switch back and forth between the two editors
+
+;;;; THANKS:
+
+;; Bram Moolenaar for writing a fine editor and helping needy children
+;; in Uganda
+
+;; Stefan Monnier for telling me how to add C-i binding
+
+;; Ted Zlatanov for suggesting to use less agressive key bindings
+
+;;;; BUGS:
+
+;;;; INSTALLATION:
+
+;; put this file somewhere in your load path then put the put the
+;; following in your .emacs:
+;;
+;; (require 'jumpc)
+;; (jumpc)
+;;
+;; Then either:
+;;
+;; (jumpc-bind-vim-key)
+;;
+;; Or:
+;;
+;; (global-set-key (kbd "<f8>") 'jumpc-jump-backward)
+;; (global-set-key (kbd "<f9>") 'jumpc-jump-forward)
+;;
+;; The first will bind C-i and C-o just like vim.  The second bind
+;; function keys 8 and 9. Of course you can pick any keys you like.  If
+;; you use Emacs on a console you will have to pick the second form as
+;; C-i and TAB are the same thing.
+;;
+;; If you use autoload you don't need to require the file
+
+;;;; TODO
+
+;; search for TODO within the file
+
+;; Add rotate jump list feature in vim
+;;   defined as JUMPLIST_ROTATE in mark.c
+;;     "If last used entry is not at the top, put it at the top by
+;;     rotating the stack until it is (the newer entries will be at
+;;     the bottom). Keep one entry (the last used one) at the top."
+
+;; Add a bit of looseness.  For example do not add jump points within
+;; three lines of the last one.
+
+;; Add jump list displaying each jump with the file and line in the
+;; file.  Clicking on a line takes you to the jump location.
+
+;; Add more commands that will insert jump.  Vim does: "'", "`", "G",
+;; "/", "?", "n", "N", "%", "(", ")", "[[", "]]", "{", "}", ":s",
+;; ":tag", "L", "M", "H"
+
+;; Remove files that do not exist when reading and writing from
+;; configuration file
+
+;;;; VERSION
+
+;; version 1
+
+;; version 2
+;;  - don't force vim key bindings
+;;  - remove debugging message
+;;  - insert a jump moves the index back to top of list
+;;  - insert jumps goes back to top of list
+
+;; version 3
+;;  - remove deleted files
+
+;;; Code:
+
+(defvar jumpc-file "~/.viminfo"
+  "File where jump information is written.")
+
+(defvar jumpc-list nil
+  "List of filenames and position to jump to.")
+
+(defvar jumpc-index 0
+  "Index of jump, 0 is the newest entry.")
+
+(defun jumpc-read-list ()
+  "Read jump list from file."
+  (when (file-exists-p jumpc-file)
+    (with-temp-buffer
+      (insert-file-contents jumpc-file)
+      (goto-char (point-min))
+      (when (re-search-forward "# Jumplist (newest first):" nil t)
+        (while (re-search-forward
+                "-'  \\([0-9]*\\)  \\([0-9]*\\)  \\(.*\\)" nil t)
+          (add-to-list 'jumpc-list
+                       (list (string-to-number (match-string 1))
+                             (string-to-number (match-string 2))
+                             (expand-file-name (match-string 3)))
+                       jumpc-list)))))
+  jumpc-list)
+
+(defun jumpc-write-list ()
+  "Write jump list to file."
+  (let (bgn end)
+    (jumpc-remove-deleted-file)
+    (find-file jumpc-file)
+    (goto-char (point-min))
+    (setq bgn (re-search-forward "# Jumplist (newest first):" nil t))
+    (if bgn
+        (progn
+          (setq end (re-search-forward "^$"))
+          (delete-region bgn end))
+      ;; looks like the entry doesn't exist, tack it at the end
+      (goto-char (point-max))
+      (insert "# Jumplist (newest first):"))
+    (insert "\n")
+    (dolist (line jumpc-list)
+      (insert (format "-'  %d  %d  %s\n"
+                      (nth 0 line) (nth 1 line)
+                      (abbreviate-file-name (nth 2 line)))))
+    (save-buffer)))
+
+(defun jumpc-jump-backward ()
+  "Jump backward in list of jumps."
+  (interactive)
+  (jumpc-jump 1))
+
+(defun jumpc-jump-forward ()
+  "Jump forward in list of jumps."
+  (interactive)
+  (jumpc-jump -1))
+
+;; TODO make it interactive with COUNT as argument
+(defun jumpc-jump (count)
+  "Jump COUNT from current index."
+  (jumpc-remove-deleted-file)
+  (let ((length (length jumpc-list)) file-name)
+    ;; first backward motion adds current point in the list
+    (when (and (> count 0) (= jumpc-index 0))
+      (jumpc-insert))
+    (setq jumpc-index (+ jumpc-index count))
+    ;; fix index if it's out of boundary
+    (cond
+     ((< jumpc-index 0)
+      (setq jumpc-index 0))
+     ((> jumpc-index length)
+      (setq jumpc-index length))
+     (t
+      (setq file-name (nth 2 (nth jumpc-index jumpc-list)))
+      (find-file file-name)
+      (goto-char (point-min))
+      (forward-line (1- (nth 0 (nth jumpc-index jumpc-list))))
+      (move-to-column (nth 0 (nth jumpc-index jumpc-list)))))))
+
+(defun jumpc-insert ()
+  "Insert jump location."
+  ;; It means we are going back to the top of the list
+  (setq jumpc-index 0)
+  (when buffer-file-name
+    (when (not (= (line-number-at-pos) (nth 0 (car jumpc-list))))
+      (setq jumpc-list
+            (cons (list (line-number-at-pos) (current-column) buffer-file-name)
+                  jumpc-list)))))
+
+(defun jumpc-remove-deleted-file ()
+  "Remove deleted file in the list.
+Returns list minus deleted files."
+  (let ((length (length jumpc-list))
+        (index 0)
+        reduced-list element)
+    (while (< index length)
+      (setq element (nth index jumpc-list))
+      (when (file-exists-p (nth 2 element))
+        (setq reduced-list (cons element reduced-list)))
+      (setq index (1+ index)))
+    (setq jumpc-list reduced-list)))
+
+(defun jumpc-bind-vim-key ()
+  "Bind keys just like vim."
+  (global-set-key (kbd "C-o") 'jumpc-jump-backward)
+  (define-key input-decode-map [?\C-i] [control-i])
+  (global-set-key [control-i] 'jumpc-jump-forward))
+
+;;;###autoload
+(defun jumpc ()
+  "Initialize jump cursor."
+  (interactive)
+  (setq jumpc-list (jumpc-read-list))
+  (defadvice self-insert-command
+    (after jumpc-insert activate)
+    "Insert jump position after insertion."
+    (jumpc-insert))
+  (add-hook 'kill-emacs-hook 'jumpc-write-list))
+
+
+;; vi:et:sw=4:ts=4:
+;; Local Variables:
+;; compile-command: "make"
+;; End:
+
+(provide 'jumpc)
+;;; jumpc.el ends here
diff --git a/packages/lex/lex-parse-re.el b/packages/lex/lex-parse-re.el
new file mode 100644 (file)
index 0000000..e5e954a
--- /dev/null
@@ -0,0 +1,258 @@
+;;; lex-parse-re.el --- Parse Emacs regexps using Lex
+
+;; Copyright (C) 2008,2013  Free Software Foundation, Inc.
+
+;; Author: Stefan Monnier <monnier@iro.umontreal.ca>
+;; Keywords:
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This exports lex-parse-re, but it also defines lex--parse-charset which is
+;; used internally by lex-compile to handle charsets specified as a string.
+
+;;; Code:
+
+(require 'lex)
+
+;;; Regexp parsers.
+
+(defun lex--tokenizer (lex string)
+  (let ((tokens ())
+        (i 0)
+        tmp)
+    (while (and (< i (length string))
+                (setq tmp (lex-match-string lex string i)))
+      (push (cons (car tmp) (substring string i (setq i (cadr tmp)))) tokens))
+    (nreverse tokens)))
+
+(defun lex--parse-charset (string)
+  (let ((i 0)
+        (ranges ()))
+    (when (eq (aref string i) ?^)
+      (push 'not ranges)
+      (setq i (1+ i)))
+    (let ((op nil)
+          (case-fold-search nil))
+      (while (not (eq op 'stop))
+        (lex-case string i
+          ((seq "[:" (0+ (char (?a . ?z) (?A . ?Z))) ":]")
+           (push (intern (substring string (+ 2 (match-beginning 0))
+                                    (- (match-end 0) 2)))
+                 ranges))
+          ((seq anything "-" anything)
+           (push (cons (aref string (match-beginning 0))
+                       (aref string (1- (match-end 0))))
+                 ranges))
+          (anything (push (aref string (1- (match-end 0))) ranges))
+          (eob (setq op 'stop))))
+
+      `(char ,@(nreverse ranges)))))
+
+(defconst lex--parse-re-lexspec
+  '(((or "*" "+" "?" "*?" "+?" "??") . suffix)
+    ((seq "[" (opt "^") (opt "]")
+          (0+ (or (seq (char not ?\]) "-" (char not ?\]))
+                  (seq "[:" (1+ (char (?a . ?z) (?A . ?Z))) ":]")
+                  (char not ?\]))) "]") . charset)
+    ((seq "\\c" anything) . category)
+    ((seq "\\C" anything) . not-category)
+    ((seq "\\s" anything) . syntax)
+    ((seq "\\S" anything) . not-syntax)
+    ((seq "\\" (char (?1 . ?9))) . backref)
+    ("\\'" . eob)
+    ("\\`" . bob)
+    ("." . dot)
+    ("^" . bol)
+    ("$" . eol)
+    ("." . dot)
+    ("\\<" . bow)
+    ("\\>" . eow)
+    ("\\_<" . symbol-start)
+    ("\\_>" . symbol-end)
+    ("\\w" . wordchar)
+    ("\\W" . not-wordchar)
+    ("\\b" . word-boundary)
+    ("\\B" . not-word-boundary)
+    ("\\=" . point)
+    ((or (seq ?\\ anything) anything) . char)))
+
+
+(defconst lex--parse-ere-lexer
+  (let ((case-fold-search nil))
+    (lex-compile
+     (append '(("(?:" . shy-group)
+               ("|"  . or)
+               ((seq "{" (0+ (char (?0 . ?9)))
+                     (opt (seq "," (0+ (char (?0 . ?9))))) "}") . repeat)
+               ((or ")" eob) . stop)
+               ("(" . group))
+             lex--parse-re-lexspec))))
+
+(defconst lex--parse-bre-lexer
+  (let ((case-fold-search nil))
+    (lex-compile
+     (append '(("\\(?:" . shy-group)
+               ("\\|"  . or)
+               ((seq "\\{" (0+ (char (?0 . ?9)))
+                     (opt (seq "," (0+ (char (?0 . ?9))))) "\\}") . repeat)
+               ((or "\\)" eob) . stop)
+               ("\\(" . group))
+             lex--parse-re-lexspec))))
+
+(defun lex--parse-re (string i lexer)
+  (let ((stack ())
+        (op nil)
+        (res nil)
+        tmp)
+    (while (and (not (eq op 'stop))
+                (setq tmp (lex-match-string lexer string i)))
+      (pcase (car tmp)
+        (`shy-group
+         (setq tmp (lex--parse-re string (cadr tmp) lexer))
+         (unless (eq (aref string (1- (cadr tmp))) ?\))
+           (error "Unclosed shy-group"))
+         (push (car tmp) res))
+        (`group
+         (setq tmp (lex--parse-re string (cadr tmp) lexer))
+         (unless (eq (aref string (1- (cadr tmp))) ?\))
+           (error "Unclosed group"))
+         (push (list 'group (car tmp)) res))
+        (`suffix
+         (if (null res) (error "Non-prefixed suffix operator")
+           (setq res (cons (list (cdr (assoc (substring string i (cadr tmp))
+                                             '(("*" . 0+)
+                                               ("+" . 1+)
+                                               ("?" . opt)
+                                               ("*?" . *\?)
+                                               ("+?" . +\?)
+                                               ("??" . \?\?))))
+                                 (car res))
+                           (cdr res)))))
+        (`or (push `(or (seq ,@(nreverse res))) stack)
+             (setq res nil))
+        (`charset
+         (push (lex--parse-charset (substring string (1+ i) (1- (cadr tmp))))
+               res))
+        (`repeat
+         ;; Here we would like to have sub-matches :-(
+         (let* ((min (string-to-number
+                      (substring string (+ i (if (eq (aref string i) ?\\) 2 1))
+                                 (cadr tmp))))
+                (max (let ((comma (string-match "," string i)))
+                       (if (not (and comma (< comma (cadr tmp))))
+                           min
+                         (if (= comma (- (cadr tmp) 2))
+                             nil
+                           (string-to-number (substring string (1+ comma))))))))
+           (if (null res) (error "Non-prefixed repeat operator")
+             (setq res (cons `(repeat ,min ,max ,(car res)) (cdr res))))))
+        (`stop (setq op 'stop))
+        ((or `syntax `category `not-syntax `not-category)
+         (push (list (car tmp) (aref string (1- (cadr tmp)))) res))
+        (`backref
+         (push (list (car tmp) (- (aref string (1- (cadr tmp))) ?0)) res))
+        (`char
+         (push (aref string (1- (cadr tmp))) res))
+        (_ (push (car tmp) res)))
+      (setq i (cadr tmp)))
+    (let ((re `(seq ,@(nreverse res))))
+      (while stack (setq re (nconc (pop stack) (list re))))
+      (list re i))))
+
+;;;###autoload
+(defun lex-parse-re (string &optional lexer)
+  "Parse STRING as a regular expression.
+LEXER specifies the regexp syntax to use.  It can be `ere', or `bre'
+and it defaults to `bre'."
+  (setq lexer (cond ((eq lexer 'ere) lex--parse-ere-lexer)
+                    ((memq lexer '(bre re nil)) lex--parse-bre-lexer)
+                    (t lexer)))
+  (let ((res (lex--parse-re string 0 lexer)))
+    (if (< (cadr res) (length string))
+        (error "Regexp parsing failed around %d: ...%s..."
+               (cadr res) (substring string (1- (cadr res)) (1+ (cadr res))))
+      (car res))))
+
+
+;; (defun lex--parse-re (string i)
+;;   (let ((stack ())
+;;         (op nil)
+;;         (res nil))
+;;     (while (and (not (eq op 'stop)))
+;;       (lex-case string i
+;;         ("(?:"                          ;shy-group.
+;;          (let ((tmp (lex--parse-re string i)))
+;;            (setq i (car tmp))
+;;            (unless (eq (aref string (1- i)) ?\)) (error "Unclosed shy-group"))
+;;            (push (cdr tmp) res)))
+;;         ((or "*?" "+?" "??")
+;;          (error "Greediness control unsupported `%s'" (match-string 0 string)))
+;;         ((or "*" "+" "?")
+;;          (if (null res) (error "Non-prefixed suffix operator")
+;;            (setq res (cons (list (cdr (assq (aref string (1- i))
+;;                                             '((?* . 0+)
+;;                                               (?+ . 1+)
+;;                                               (?? . opt))))
+;;                                  (car res))
+;;                            (cdr res)))))
+;;         ("|" (push `(or (seq ,@(nreverse res))) stack)
+;;          (setq res nil))
+;;         ((seq "[" (opt "^") (opt "]")
+;;                    (0+ (or (seq (char not ?\]) "-" (char not ?\]))
+;;                            (seq "[:" (1+ (char (?a . ?z) (?A . ?Z))) ":]")
+;;                            (char not ?\]))) "]")
+;;          (push (lex--parse-charset
+;;                 (substring string (1+ (match-beginning 0))
+;;                            (1- (match-end 0))))
+;;                res))
+;;         ((seq "{" (0+ (char (?0 . ?9)))
+;;                    (opt (seq "," (0+ (char (?0 . ?9))))) "}")
+;;          ;; Here we would like to have sub-matches :-(
+;;          (let* ((min (string-to-number (substring string
+;;                                                   (1+ (match-beginning 0))
+;;                                                   (match-end 0))))
+;;                 (max (let ((comma (string-match "," string (match-beginning 0))))
+;;                        (if (not (and comma (< comma (match-end 0))))
+;;                            min
+;;                          (if (= comma (- (match-end 0) 2))
+;;                              nil
+;;                            (string-to-number (substring string (1+ comma))))))))
+;;            (if (null res) (error "Non-prefixed repeat operator")
+;;              (setq res (cons `(repeat ,min ,max ,(car res)) (cdr res))))))
+;;         ((or ")" eob) (setq op 'stop))
+;;         ("\\'" (push 'eob res))
+;;         ("\\`" (push 'bob res))
+;;         ("^" (push 'bol res))
+;;         ("$" (push 'eol res))
+;;         ("." (push 'dot res))
+
+;;         ((or "(" "\\<" "\\>" "\\_<" "\\_>" "\\c" "\\s" "\\C" "\\S" "\\w" "\\W"
+;;              "\\b" "\\B" "\\=" (seq "\\" (char (?1 . ?9))))
+;;          (error "Unsupported construct `%s'" (match-string 0 string)))
+
+;;         ((or (seq ?\\ anything) anything)
+;;          (push (aref string (1- (match-end 0))) res))
+;;         ("" (error "This should not be reachable"))))
+;;     (let ((re `(seq ,@(nreverse res))))
+;;       (while stack (setq re (nconc (pop stack) (list re))))
+;;       (cons i re))))
+
+
+
+
+
+(provide 'lex-parse-re)
+;;; lex-parse-re.el ends here
diff --git a/packages/lex/lex-pkg.el b/packages/lex/lex-pkg.el
new file mode 100644 (file)
index 0000000..e35f44e
--- /dev/null
@@ -0,0 +1 @@
+(define-package "lex" "1.1" "Lexical analyser construction")
diff --git a/packages/lex/lex.el b/packages/lex/lex.el
new file mode 100644 (file)
index 0000000..494cefa
--- /dev/null
@@ -0,0 +1,1260 @@
+;;; lex.el --- Lexical analyser construction
+
+;; Copyright (C) 2008,2013  Free Software Foundation, Inc.
+
+;; Author: Stefan Monnier <monnier@iro.umontreal.ca>
+;; Keywords:
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Format of regexps is the same as used for `rx' and `sregex'.
+;; Additions:
+;; - (ere RE) specify regexps using the ERE syntax.
+;; - (inter REs...) (aka `&') make a regexp that only matches
+;;   if all its branches match.  E.g. (inter (ere ".*a.*") (ere ".*b.*"))
+;;   match any string that contain both an "a" and a "b", in any order.
+;; - (case-fold REs...) and (case-sensitive REs...) make a regexp that
+;;   is case sensitive or not, regardless of case-fold-search.
+
+;; Input format of lexers:
+;;
+;; ALIST of the form ((RE . VAL) ...)
+
+;; Format of compiled DFA lexers:
+;;
+;; nil                     ; The trivial lexer that fails
+;; (CHAR . LEXER)
+;; (table . CHAR-TABLE)
+;; (stop VAL . LEXER)      ; Match the empty string at point or LEXER.
+;; (check (PREDICATE . ARG) SUCCESS-LEXER . FAILURE-LEXER)
+
+;; Intermediate NFA nodes may additionally look like:
+;; (or LEXERs...)
+;; (orelse LEXERs...)
+;; (and LEXERs...)
+;; (join CONT . EXIT)
+;; Note: we call those things "NFA"s but they're not really NFAs.
+
+;;; Bugs:
+
+;; - `inter' doesn't work right.  Matching `join' to the corresponding `and'
+;;   is done incorrectly in some cases.
+;; - since `negate' uses intersections, it doesn't work right either.
+;; - "(\<)*" leads to a DFA that gets stuck in a cycle.
+
+;;; Todo:
+
+;; - dfa "no-fail" simplifier
+;; - dfa minimization
+;; - dfa compaction (different representation)
+;; - submatches
+;; - backrefs?
+;; - search rather than just match
+;; - extensions:
+;;   - repeated submatches
+;;   - negation
+;;   - lookbehind and lookahead
+;;   - match(&search?) backward
+;;   - agrep
+
+;;; Notes
+
+
+
+;; Search
+;; ------
+
+;; To turn a match into a search, the basic idea is to use ".*RE" to get
+;; a search-DFA as opposed to the match-DFA generated from "RE".
+
+;; Search in Plan9's regexp library is done as follows: match ".*RE" until
+;; reaching the first match and then continue with only "RE".  The first
+;; ".*RE" match corresponds to a search success for the leftmost shortest
+;; match.  If we want the longest match, we need to continue.  But if we
+;; continue with ".*RE" then we have no idea when to stop, so we should only
+;; continue with "RE".
+;; Downside: we may still match things after the "leftmost longest" match,
+;; but hopefully will stop soon after.  I.e. we may look at chars past the
+;; end of the leftmost longest match, but hopefully not too many.
+
+;; Alternatives:
+;; - Like emacs/src/regexp.c, we can just start a match at every buffer
+;;   position.  Advantage: no need for submatch info in order to find
+;;   (match-beginning 0), no need for a separate search-DFA.
+;;   Downsize: O(N^2) rather than O(N).  But it's no worse than what we live
+;;   with for decades in src/regexp.c.
+;;
+;; - After the shortest-search, stop the search and do a longest-match
+;;   starting at position (match-beginning 0).  The good thing is that we
+;;   will not look at any char further than needed.  Also we don't need to
+;;   figure out how to switch from ".*RE" to "RE" in the middle of the search.
+;;   The downside is that we end up looking twice at the chars common to the
+;;   shortest and longest matches.  Also this doesn't work: the shortest
+;;   match may not be the leftmost match, so we can't just start the match
+;;   at (match-beginning 0).
+;;
+;; - Generate a specialized search&match-DFA which encodes the job done by
+;;   Plan9's regexp library.  I.e. do a specialized merge on
+;;   (or LEXER (anything . LEXER)) where whenever we get a `stop' we don't
+;;   merge any more.  After matching such a lexer, we still have to figure
+;;   which of the matches we had is the leftmost longest match, of course.
+;;   Actually, it's not that easy: the tail of a `stop' in the match-DFA can
+;;   only match things whose (match-beginning 0) may be the same as the one
+;;   of the `stop', whereas we also want to accept longer matches that start
+;;   before (match-beginning 0).  So we want to keep merging on the tail of
+;;   `stop' nodes, but only "partially" (whatever that means).
+
+;; - Better yet, do what TRE does: after the shortest-search, use the
+;;   submatch data to figure out the NFA states (corresponding to the
+;;   current search-DFA state) which are only reachable from later starting
+;;   positions than (match-beginning 0), remove them and figure out from
+;;   that the match-DFA state to which to switch.  Problem is: there might
+;;   not be any such state in the match-DFA.
+;;
+;; - In the end I do a mix of the last 2: .*?RE
+;;   This uses the `orelse' merge operator, which contrary to `or' only
+;;   matches the righthand side when the lefthand side fails to match.
+;;   It turns out to be fairly simple to implement, and is optimal.
+;;
+;; Lookahead
+;; ---------
+
+;; I suspect that the (?=<RE>) lookahead can be encoded using something like
+;; `andalso'.  Of course, it can also trivially be encoded as a predicate,
+;; but then we get an O(N^2) complexity.
+
+;; Merging operators.
+;; ------------------
+
+;; The NFA merging operators (or, and, orelse) seem to work fine on their own,
+;; but I'm not convinced they always DTRT when combined.  It's not even
+;; clear that the NFA->DFA conversion terminates in all such cases.
+
+;; Intersection
+;; ------------
+
+;; Implementing the `inter' regexp operator turns out to be more difficult
+;; than it seemed.  The problem is basically in the `join'.  Each `and' has
+;; to have its own matching `join', but preserving this invariant is
+;; tricky.  Among other things, we cannot flatten nested `and's like we do
+;; for `or's and `orelse's.
+
+;; Submatch info
+;; -------------
+
+;; Keeping track of submatch info with a DFA is tricky business and can slow
+;; down the matcher or make it use algorithmically more memory
+;; (e.g. O(textsize)).  Here are some approaches:
+
+;; - Reproduce what an NFA matcher would do: when compiling the DFA, keep
+;;   track of the NFA nodes corresponding to each DFA node, and for every
+;;   transition, check the mapping between "incoming NFA nodes" and
+;;   "outgoing NFA nodes" to maintain the list of submatch-info (one element
+;;   per NFA node).
+
+;; - Keep a log of the states traversed during matching, so at the end it
+;;   can be used to reproduce the parse tree or submatch info, based on
+;;   auxiliary tables constructed during the DFA construction.
+
+;; - Some submatch info can be maintained cheaply: basically a submatch
+;;   position can be represented by a single global variable in the case
+;;   where we have the following property: every ε transition in the NFA
+;;   which corresponds to this submatch point has the following property:
+;;   no other ε transition for this same submatch can be traversed between
+;;   the text position where this transition is traversed and the position
+;;   where the target NFA subgraph fails to match.
+
+;;
+
+;;; Code:
+
+(eval-when-compile (require 'cl-lib))
+
+(eval-and-compile
+  (unless (fboundp 'case-table-get-table)
+    ;; Copied from 24.4
+    (defun case-table-get-table (case-table table)
+      "Return the TABLE of CASE-TABLE.
+TABLE can be `down', `up', `eqv' or `canon'."
+      (let ((slot-nb (cdr (assq table '((up . 0) (canon . 1) (eqv . 2))))))
+        (or (if (eq table 'down) case-table)
+            (char-table-extra-slot case-table slot-nb)
+            (let ((old (standard-case-table)))
+              (unwind-protect
+                  (progn
+                    (set-standard-case-table case-table)
+                    (char-table-extra-slot case-table slot-nb))
+                (or (eq case-table old)
+                    (set-standard-case-table old)))))))))
+
+(defun copy-char-table (ct1)
+  (let* ((subtype (char-table-subtype ct1))
+         (ct2 (make-char-table subtype)))
+    (map-char-table (lambda (c v) (set-char-table-range ct2 c v)) ct1)
+    (dotimes (i (or (get subtype 'char-table-extra-slots) 0))
+      (set-char-table-extra-slot ct2 i (char-table-extra-slot ct1 i)))
+    ct2))
+
+(defun lex--char-table->alist (ct)
+  (let ((res ()))
+    (map-char-table (lambda (k v)
+                      (push (cons (if (consp k)
+                                      ;; If k is a cons cell, we have to
+                                      ;; copy it because map-char-table
+                                      ;; reuses it.
+                                      (cons (car k) (cdr k))
+                                    ;; Otherwise, create a trivial cons-cell
+                                    ;; so we have fewer cases to handle.
+                                    (cons k k))
+                                  v)
+                            res))
+                    ct)
+    res))
+
+(defun lex--merge-into (op al1 al2 ct)
+  (cl-assert (memq op '(and or orelse)))
+  ;; We assume that map-char-table calls its function with increasing
+  ;; `key' arguments.
+  (while (and al1 al2)
+    (let ((k1 (caar al1)) (k2 (caar al2)))
+      (cond
+       ;; Perfect overlap.
+       ((equal k1 k2)
+        (set-char-table-range ct k1
+                              (lex--merge op (cdr (pop al1)) (cdr (pop al2)))))
+       ;; k1 strictly greater than k2.
+       ((and (consp k1) (consp k2) (> (car k1) (cdr k2)))
+        (let ((v (cdr (pop al1))))
+          (if (not (eq op 'and)) (set-char-table-range ct k1 v))))
+       ;; k2 strictly greater than k1.
+       ((and (consp k1) (consp k2) (> (car k2) (cdr k1)))
+        (let ((v (cdr (pop al2))))
+          (if (not (eq op 'and)) (set-char-table-range ct k2 v))))
+       ;; There's partial overlap.
+       ((and (consp k1) (consp k2) (> (cdr k1) (cdr k2)))
+        (if (not (eq op 'and))
+            (set-char-table-range ct (cons (1+ (cdr k2)) (cdr k1)) (cdar al1)))
+        (setcdr k1 (cdr k2)))
+       ((and (consp k1) (consp k2) (< (cdr k1) (cdr k2)))
+        (if (not (eq op 'and))
+            (set-char-table-range ct (cons (1+ (cdr k1)) (cdr k2)) (cdar al2)))
+        (setcdr k2 (cdr k1)))
+       ;; Now the tails are equal.
+       ((and (consp k1) (consp k2) (> (car k1) (car k2)))
+        (set-char-table-range ct k1 (lex--merge op (cdr (pop al1)) (cdar al2)))
+        (setcdr k2 (1- (car k1))))
+       ((and (consp k1) (consp k2) (< (car k1) (car k2)))
+        (set-char-table-range ct k2 (lex--merge op (cdar al1) (cdr (pop al2))))
+        (setcdr k1 (1- (car k2))))
+       (t (cl-assert nil)))))
+  (if (not (eq op 'and))
+      (dolist (x (or al1 al2))
+        (set-char-table-range ct (car x) (cdr x))))
+  ct)
+
+(defvar lex--states)
+(defvar lex--memoize)
+
+(defun lex--set-eq (l1 l2)
+  (let ((len (length l2)))
+    (setq l2 (copy-sequence l2))
+    (while (consp l1)
+      (cl-assert (= len (length l2)))
+      (unless (> len
+                 (setq len (length (setq l2 (delq (pop l1) l2)))))
+        (setq l1 t)))
+    (not l1)))
+
+(define-hash-table-test 'lex--set-eq 'lex--set-eq
+  (lambda (l)
+    (let ((hash 0))
+      (while l
+        (let ((x (pop l)))
+          (if (memq x l) (progn (debug) nil)
+            (setq hash (+ hash (sxhash x))))))
+      hash)))
+
+
+(defun lex--flatten-state (state)
+  (cl-assert (memq (car state) '(and or orelse)))
+  (let ((op (car state))
+        (todo (cdr state))
+        (done (list state))
+        (res nil))
+    (while todo
+      (setq state (pop todo))
+      (cond
+       ((null state) (if (eq op 'and) (setq res nil todo nil)))
+       ((memq state done) nil)
+       ((eq (car-safe state) op)
+        (push state done)
+        (setq todo (append (cdr state) todo)))
+       (t (unless (memq state res) (push state res)))))
+    (cons op (nreverse res))))
+
+(defun lex--merge-2 (op lex1 lex2)
+  (cl-assert (memq op '(and or orelse)))
+  ;; The order between lex1 and lex2 matters: preference is given to lex1.
+  (cond
+   ;; `lex1' and `lex2' might actually be the same when we use this code to
+   ;; cancel out the `and' and the `join' from lex--merge-and-join.
+   ;; ((eq lex1 lex2) (debug) lex1)  ;CHECK: ruled out by `lex--flatten-state'?
+   ;; ((equal lex1 lex2) lex1)             ;Stack overflow :-(
+
+   ;; Handle the 2 possible nil cases.
+   ;; CHECK: ruled out by `lex--flatten-state'?
+   ((null lex1) (debug) (if (eq op 'and) nil lex2))
+   ((null lex2) (debug) (if (eq op 'and) nil lex1))
+
+   ;; Do the predicate cases before the `stop' because the stop should
+   ;; always come after the checks.
+   ;; TODO: add optimizations for pairs of `checks' which are redundant,
+   ;; or mutually exclusive, ... although we can also do it in lex-optimize.
+   ((and (eq (car lex1) 'check) (eq (car lex2) 'check)
+         (equal (nth 1 lex1) (nth 1 lex2))) ; Same predicate.
+    (cl-list* 'check (nth 1 lex1)
+              (lex--merge op (nth 2 lex1) (nth 2 lex2))
+              (lex--merge op (nthcdr 3 lex1) (nthcdr 3 lex2))))
+   ((eq (car lex1) 'check)
+    (cl-list* 'check (nth 1 lex1)
+              (lex--merge op (nth 2 lex1) lex2)
+              (lex--merge op (nthcdr 3 lex1) lex2)))
+   ((eq (car lex2) 'check)
+    (cl-list* 'check (nth 1 lex2)
+              (lex--merge op lex1 (nth 2 lex2))
+              (lex--merge op lex1 (nthcdr 3 lex2))))
+
+   ;; Joins have the form (join CONT . EXIT) where EXIT is a lexer
+   ;; corresponding to the rest of the regexp after the `and' sub-regexp.
+   ;; All the joins corresponding to the same `and' have the same EXIT.
+   ;; CONT is a lexer that contains another join inside, it corresponds to
+   ;; the decision to not yet leave the `and'.
+   ((and (eq (car lex1) 'join) (eq (car lex2) 'join))
+    (cl-assert (eq (cddr lex1) (cddr lex2))) ;Check they're the same join.
+    (let ((in (lex--merge op (cadr lex1) (cadr lex2))))
+      (if (eq op 'and)
+          ;; Eliminate the join once it was all merged.
+          ;; FIXME: This arbitrarily chooses `or' instead of `orelse',
+          ;; and it arbitrarily gives CONT precedence over EXIT.
+          (lex--merge 'or in (cddr lex1))
+        `(join ,in ,@(cddr lex1)))))
+   ;; If one the two lex's is a join but the other not, the other must
+   ;; contain a corresponding join somewhere inside.
+   ((eq (car lex1) 'join)
+    (let ((next (lex--merge op (nth 1 lex1) lex2)))
+      ;; lex1 is a valid exit point but lex2 isn't.
+      (if (eq op 'and)
+          next
+        ;; FIXME: lex1 is implicitly an `or(else)' between (cadr lex1) and
+        ;; (cddr lex1).  Here we construct an `or(else)' between `next' and
+        ;; (cddr lex1).  I.e. we lose the `op' and we do not preserve the
+        ;; ordering between lex2 and (cddr lex1).
+        `(join ,next ,@(cddr lex1)))))
+   ((eq (car lex2) 'join)
+    (let ((next (lex--merge op lex1 (nth 1 lex2))))
+      (if (eq op 'and) next `(join ,next ,@(cddr lex2)))))
+
+   ;; The three `stop' cases.
+   ((and (eq (car lex1) 'stop) (eq (car lex2) 'stop))
+    ;; Here is where we give precedence to `lex1'.
+    (if (eq op 'orelse) lex1
+      (cl-list* 'stop (cadr lex1) (lex--merge op (cddr lex1) (cddr lex2)))))
+   ((eq (car lex1) 'stop)
+    (let ((next (lex--merge op (cddr lex1) lex2)))
+      (pcase op
+        (`or     (cl-list* 'stop (cadr lex1) next))
+        (`orelse lex1)
+        ;; CHECK: We should have hit a `join' before reaching a `stop'.
+        (`and    (debug) next)
+        (_       (error "lex.el: got %S but expected one of or/and/orelse"
+                        op)))))
+   ((eq (car lex2) 'stop)
+    (let ((next (lex--merge op lex1 (cddr lex2))))
+      ;; For `orelse', we want here to delay the `stop' until the point
+      ;; where we know that lex1 doesn't match.  Sadly, I don't know how to
+      ;; do it.
+      (pcase op
+        ;; FIXME: One thing we can do is to mark the value attached to the
+        ;; `stop' so as to indicate that an earlier match may finish later.
+        ;; This way, if the match is not `earlystop', we know it's one of
+        ;; the leftmost ones, and maybe the search loop can avoid some work
+        ;; when determining which is the leftmost longest match.
+        (`orelse (cl-list* 'stop `(earlystop ,(cadr lex2)) next))
+        ((or `or `orelse) (cl-list* 'stop (cadr lex2) next))
+        ;; CHECK: We should have hit a `join' before reaching a `stop'.
+        (`and    (debug) next)
+        (_       (error "lex.el: got %S but expected one of or/and/orelse"
+                        op)))))
+
+   ;; The most general case.
+   ((and (eq (car lex1) 'table) (eq (car lex2) 'table))
+    (let ((al1 (lex--char-table->alist (cdr lex1)))
+          (al2 (lex--char-table->alist (cdr lex2)))
+          (ct (make-char-table 'lexer)))
+      (lex--merge-into op al1 al2 ct)
+      (cons 'table ct)))
+
+   ((and (characterp (car lex1)) (characterp (car lex2))
+         (eq (car lex1) (car lex2)))
+    (cons (car lex1) (lex--merge op (cdr lex1) (cdr lex2))))
+   ((and (characterp (car lex1)) (characterp (car lex2)))
+    (unless (eq op 'and)
+      (let ((ct (make-char-table 'lexer)))
+        (aset ct (car lex1) (cdr lex1))
+        (aset ct (car lex2) (cdr lex2))
+        (cons 'table ct))))
+   ((and (characterp (car lex1)) (eq (car lex2) 'table))
+    (let ((next (lex--merge op (cdr lex1) (aref (cdr lex2) (car lex1)))))
+      (if (eq op 'and)
+          (if next (cons (car lex1) next))
+        (let ((ct (copy-sequence (cdr lex2))))
+          (aset ct (car lex1) next)
+          (cons 'table ct)))))
+   ((and (eq (car lex1) 'table) (characterp (car lex2)))
+    (let ((next (lex--merge op (aref (cdr lex1) (car lex2)) (cdr lex2))))
+      (if (eq op 'and)
+          (if next (cons (car lex2) next))
+        (let ((ct (copy-sequence (cdr lex1))))
+          (aset ct (car lex2) next)
+          (cons 'table ct)))))
+
+   ((or (memq (car lex1) '(or orelse and))  ;state
+        (memq (car lex2) '(or orelse and))) ;state
+    ;; `state' nodes are nodes whose content is not known yet, so we
+    ;; have to delay the merge via the memoization table.
+    ;; `or' and `and' nodes should only happen when the other `op' is being
+    ;; performed, in which case we can't do the merge either before lex1
+    ;; and lex2 have both been merged.
+    (lex--merge op lex1 lex2))
+   (t (cl-assert nil))))
+
+(defun lex--merge-now (&rest state)
+  (cl-assert (memq (car state) '(and or orelse)))
+  ;; Re-flatten, in case one of the sub-states was changed.
+  (setq state (lex--flatten-state state))
+  (if (<= (length state) 2)
+      (if (eq (car state) 'and)
+          ;; Need to strip out the `join's.
+          (lex--merge-and-join (cadr state))
+        (cadr state))
+    (let ((op (pop state))
+          (res (pop state)))
+      (dolist (lex state)
+        ;; CHECK: we fold the lexers  using left-associativity.
+        ;; For `orelse', that means that `earlystop' never accumulates,
+        ;; whereas if we folded in a right-associative way, we could get
+        ;; some (earlystop (earlystop (earlystop V))).  Not sure which one's
+        ;; preferable, so let's stick with what we have for now.
+        (setq res (lex--merge-2 op res lex)))
+      res)))
+
+(defun lex--merge-and-join (lex)
+  (lex--merge-2 'and lex lex))
+
+
+(defun lex--merge (&rest state)
+  (cl-assert (memq (car state) '(and or orelse)))
+  (setq state (lex--flatten-state state))
+  (if (and (<= (length state) 2)
+           (not (eq (car state) 'and)))
+      (cadr state)
+    (or (gethash state lex--memoize)
+        (progn
+          ;; (debug)
+          (cl-assert (memq (car state) '(and or orelse)))
+          (push state lex--states)
+          ;; The `state' node will be later on modified via setcar/setcdr,
+          ;; se be careful to use a copy of it for the key.
+          (puthash (cons (car state) (cdr state)) state lex--memoize)
+          state))))
+
+(defun lex--compile-category (category)
+  (if (and (integerp category) (< category 128))
+      category
+    (if (symbolp category)
+        (if (= 1 (length (symbol-name category)))
+            (aref (symbol-name category) 0)
+          (require 'rx)
+          (defvar rx-categories)
+          (cdr (assq category rx-categories))))))
+
+(defun lex--compile-syntax (&rest syntaxes)
+  (mapcar (lambda (x)
+            (if (and (integerp x) (< x 32)) x
+              (if (symbolp x)
+                  (setq x (if (= 1 (length (symbol-name x)))
+                              (symbol-name x)
+                            (require 'rx)
+                            (defvar rx-syntax)
+                            (cdr (assq x rx-syntax)))))
+              (if (characterp x) (setq x (string x)))
+              (car (string-to-syntax x))))
+          syntaxes))
+
+(defconst lex--char-classes
+  `((alnum alpha digit)
+    (alpha word (?a . ?z) (?A . ?Z))
+    (blank ?\s ?\t)
+    (cntrl (?\0 . ?\C-_))
+    (digit (?0 . ?9))
+    ;; Include all multibyte chars, plus all the bytes except 128-159.
+    (graph (?! . ?~) multibyte (#x3fffa0 . #x3fffff))
+    ;; src/regexp.c handles case-folding inconsistently: lower and upper
+    ;; match both lower- and uppercase ascii chars, but lower also matches
+    ;; uppercase non-ascii chars whereas upper does not match lowercase
+    ;; nonascii chars.  Here I simply ignore case-fold for [:lower:] and
+    ;; [:upper:] because it's simpler and doesn't seem worse.
+    (lower (check (lex--match-lower)))
+    (upper (check (lex--match-upper)))
+    (print graph ?\s)
+    (punct (check (not (lex--match-syntax . ,(lex--compile-syntax "w"))))
+           (?! . ?/) (?: . ?@) (?\[ . ?`) (?\{ . ?~))
+    (space (check (lex--match-syntax . ,(lex--compile-syntax " "))))
+    (xdigit digit (?a . ?f) (?A . ?F))
+    (ascii (?\0 . ?\177))
+    (nonascii (?\200 . #x3fffff))
+    (unibyte ascii (#x3fff00 . #x3fffff))
+    (multibyte (#x100 . #x3ffeff))
+    (word (check (lex--match-syntax . ,(lex--compile-syntax "w"))))
+    ;; `rx' alternative names.
+    (numeric digit)
+    (num digit)
+    (control cntrl)
+    (hex-digit xdigit)
+    (hex xdigit)
+    (graphic graph)
+    (printing print)
+    (alphanumeric alnum)
+    (letter alpha)
+    (alphabetic alpha)
+    (lower-case lower)
+    (upper-case upper)
+    (punctuation punct)
+    (whitespace space)
+    (white space))
+  "Definition of char classes.
+Each element has the form (CLASS . DEFINITION) where definition
+is a list of elements that can be either CHAR or (CHAR . CHAR),
+or CLASS (another char class) or (check (PREDICATE . ARG))
+or (check (not (PREDICATE . ARG))).")
+
+(defvar lex--char-equiv-table nil
+  "Equiv-case table to use to compile case-insensitive regexps.")
+
+(defun lex--char-equiv (char)
+  (when lex--char-equiv-table
+    (let ((chars ())
+          (tmp char))
+      (while (and (setq tmp (aref lex--char-equiv-table tmp))
+                  (not (eq tmp char)))
+        (push tmp chars))
+      (if chars (cons char chars)))))
+
+;; For convenience we use lex itself to tokenize charset strings, so we
+;; define it in another file.
+(autoload 'lex--parse-charset "lex-parse-re")
+
+(defun lex--nfa (re state)
+  (cl-assert state)                   ;If `state' is nil we can't match anyway.
+  (cond
+   ((characterp re)
+    (let ((chars (lex--char-equiv re)))
+      (if (null chars)
+          (cons re state)
+        (let ((ct (make-char-table 'lexer)))
+          (dolist (char chars) (aset ct char state))
+          (cons 'table ct)))))
+   ((stringp re)
+    (if (null lex--char-equiv-table)
+        ;; (Very) minor optimization.
+        (nconc (mapcar 'identity re) state)
+      (lex--nfa `(seq ,@(mapcar 'identity re)) state)))
+   (t
+    (pcase (or (car-safe re) re)
+      ((or `: `seq `sequence
+           ;; Hack!
+           `group)
+       (dolist (elem (reverse (cdr re)))
+         (setq state (lex--nfa elem state)))
+       state)
+      ((or `char `in `not-char)
+       (let ((chars (cdr re))
+             (checks nil)
+             (fail nil)
+             (char nil)  ;The char seen, or nil if none, or t if more than one.
+             (ct (make-char-table 'lexer)))
+         (when (or (eq 'not (car chars)) (eq 'not-char (car re)))
+           (setq chars (cdr chars))
+           (set-char-table-range ct t state)
+           (setq fail state)
+           (setq state nil))
+         (while chars
+           (let ((range (pop chars)))
+             (cond
+              ((stringp range)
+               (setq chars (append (cdr (lex--parse-charset range)) chars)))
+              ((symbolp range)
+               (setq range (or (cdr (assq range lex--char-classes))
+                               (error "Uknown char class `%s'" range)))
+               (setq chars (append range chars)))
+              ((and (consp range) (eq 'check (car range)))
+               (push (cadr range) checks))
+              (t
+               (setq char (if (or char (not (characterp range))
+                                  (and lex--char-equiv-table
+                                       (lex--char-equiv range)))
+                              t range))
+               ;; Set the range, first, regardless of case-folding.  This is
+               ;; important because case-tables like to be set with few
+               ;; large ranges rather than many small ones, as is done in
+               ;; the case-fold loop.
+               (set-char-table-range ct range state)
+               (when (and lex--char-equiv-table
+                          ;; Avoid looping over all characters.
+                          (not (equal range '(#x100 . #x3ffeff))))
+                 ;; Add all the case-equiv chars.
+                 (let ((i (if (consp range) (car range) range))
+                       (max (if (consp range) (cdr range) range))
+                       char)
+                   (while (<= i max)
+                     (setq char i)
+                     (while (and (setq char (aref lex--char-equiv-table char))
+                                 (not (eq char i)))
+                       (aset ct char state))
+                     (setq i (1+ i)))))))))
+
+         (let ((res (if (or (eq char t) fail)
+                        (cons 'table ct)
+                      (if char (cons char state)))))
+           (if (and (not fail) checks)
+               (setq state (lex--nfa 'anything state)))
+           (dolist (check checks)
+             (setq res
+                   (if fail
+                       ;; We do an `and' of the negation of the check and res.
+                       (if (eq (car-safe check) 'not)
+                           (list 'check (cadr check) res)
+                         (cl-list* 'check check nil res))
+                     ;; An `or' of the check and res.
+                     (if (eq (car-safe check) 'not)
+                         (list 'check (cadr check) res state)
+                       (cl-list* 'check check state res)))))
+           res)))
+
+      ((or `union `or `| `orelse)
+       (let ((newstate
+              (cons (if (eq (car re) 'orelse) 'orelse 'or)
+                    (mapcar (lambda (re) (lex--nfa re state)) (cdr re)))))
+         (push newstate lex--states)
+         newstate))
+
+      ((or `inter `intersection `&)
+       (if (<= (length re) 2)
+           ;; Avoid constructing degenerate `and' nodes.
+           (lex--nfa (cadr re) state)
+         ;; Just using `and' is not enough because we have to enforce that the
+         ;; sub-regexps (rather than the whole regexp) match the same string.
+         ;; So we need to mark the juncture point.
+         (let* ((join `(join nil ,@state))
+                (newstate
+                 `(and ,@(mapcar (lambda (re) (lex--nfa re join)) (cdr re)))))
+           (push newstate lex--states)
+           newstate)))
+
+      ((or `0+ `zero-or-more `* `*\?)
+       (let ((newstate (list 'state)))
+         (let ((lexer (lex--nfa (cons 'seq (cdr re)) newstate)))
+           (setcdr newstate (if (memq (car re) '(*\?))
+                                (list state lexer)
+                              (list lexer state))))
+         (setcar newstate (if (memq (car re) '(*\?)) 'orelse 'or))
+         (push newstate lex--states)
+         newstate))
+
+      ((or `string-end `eos `eot `buffer-end `eob)
+       `(check (lex--match-eobp) ,state))
+      ((or `string-start `bos `bot `buffer-start `bob)
+       `(check (lex--match-bobp) ,state))
+      ((or `line-end `eol) `(check (lex--match-eolp) ,state))
+      ((or `line-start `bol) `(check (lex--match-bolp) ,state))
+      ((or `word-start `bow) `(check (lex--match-bowp) ,state))
+      ((or `word-end `eow) `(check (lex--match-eowp) ,state))
+      (`symbol-start `(check (lex--match-bosp) ,state))
+      (`symbol-end `(check (lex--match-eosp) ,state))
+      (`not-word-boundary `(check (lex--match-not-word-boundary) ,state))
+      (`word-boundary `(check (lex--match-not-word-boundary) nil . ,state))
+      (`syntax `(check (lex--match-syntax
+                        . ,(apply 'lex--compile-syntax (cdr re)))
+                       ,(lex--nfa 'anything state)))
+      (`not-syntax `(check (lex--match-syntax
+                            . ,(apply 'lex--compile-syntax (cdr re)))
+                           nil . ,(lex--nfa 'anything state)))
+      (`category `(check (lex--match-category
+                          . ,(lex--compile-category (cadr re)))
+                         ,(lex--nfa 'anything state)))
+      (`not-category `(check (lex--match-category
+                              . ,(lex--compile-category (cadr re)))
+                             nil . ,(lex--nfa 'anything state)))
+
+      ;; `rx' accepts char-classes directly as regexps.  Let's reluctantly
+      ;; do the same.
+      ((or `digit `numeric `num `control `cntrl `hex-digit `hex `xdigit `blank
+           `graphic `graph `printing `print `alphanumeric `alnum `letter
+           `alphabetic `alpha `ascii `nonascii `lower `lower-case `upper
+           `upper-case `punctuation `punct `space `whitespace `white)
+       (lex--nfa `(char ,re) state))
+
+      (`case-sensitive
+       (let ((lex--char-equiv-table nil))
+         (lex--nfa `(seq ,@(cdr re)) state)))
+
+      (`case-fold
+       (let ((lex--char-equiv-table
+              (case-table-get-table (current-case-table) 'eqv)))
+         (lex--nfa `(seq ,@(cdr re)) state)))
+
+      ((or `point
+           ;; Sub groups!
+           `submatch `group `backref
+           ;; Greediness control
+           `minimal-match `maximal-match)
+       (error "`%s' Not implemented" (or (car-safe re) re)))
+
+      ((or `not-newline `nonl `dot) (lex--nfa '(char not ?\n) state))
+      (`anything (lex--nfa '(char not) state))
+      ((or `word `wordchar) (lex--nfa '(syntax w) state))
+      (`not-wordchar (lex--nfa '(not-syntax w) state))
+
+      (`any
+       ;; `rx' uses it for (char ...) sets, and sregex uses it for `dot'.
+       (lex--nfa (if (consp re) (cons 'char (cdr re)) '(char not ?\n)) state))
+
+      (`negate
+       ;; We could define negation directly on regexps, but it's easier to
+       ;; do it on NFAs since those have fewer cases to deal with.
+       (let ((posnfa
+              ;; Trow away the mergable states generated while computing the
+              ;; posnfa, since it's only an intermediate datastructure.
+              (let (lex--states)
+                (lex--nfa `(seq ,@(cdr re)) '(stop negate)))))
+         (lex-negate posnfa state)))
+
+      (`not
+       ;; The `not' as used in `rx' should be deprecated so we can make it
+       ;; an alias for `negate', whose semantics is different.  E.g.
+       ;; (negate (char ...)) matches the empty string and 2-char strings.
+       (setq re (cadr re))
+       (pcase (or (car-safe re) re)
+         (`word-boundary
+          (message "`not' deprecated: use not-word-boundary")
+          (lex--nfa 'not-word-boundary state))
+         ((or `any `in `char)
+          (message "`not' deprecated: use (%s not ...)" (or (car-safe re) re))
+          (lex--nfa (cl-list* (car re) 'not (cdr re)) state))
+         ((or `category `syntax)
+          (message "`not' deprecated: use not-%s" (car re))
+          (lex--nfa (cons (intern (format "not-%s" (car re))) (cdr re)) state))
+         (elem (error "lex.el: unexpected argument `%S' to `not'." elem))))
+
+      (`and
+       ;; `rx' defined `and' as `sequence', but we may want to define it
+       ;; as intersection instead.
+       (error "`and' is deprecated, use `seq', `:', or `sequence' instead"))
+
+      ((or `1+ `one-or-more `+ `+\?)
+       (lex--nfa `(seq (seq ,@(cdr re))
+                       (,(if (memq (car re) '(+\?)) '*\? '0+) ,@(cdr re)))
+                 state))
+      ((or `opt `zero-or-one `optional `\?)
+       (lex--nfa `(or (seq ,@(cdr re)) "") state))
+      (`\?\?
+       (lex--nfa `(orelse "" (seq ,@(cdr re))) state))
+      ((or `repeat `** `=)
+       (let ((min (nth 1 re))
+             (max (nth 2 re))
+             (res (nthcdr 3 re)))
+         (unless res
+           (setq res (list max)) (setq max min))
+         (lex--nfa `(seq ,@(append (make-list (or min 0)
+                                              (if (eq (length res) 1)
+                                                  (car res)
+                                                (cons 'seq res)))
+                                   (if (null max)
+                                       `((0+ ,@res))
+                                     (make-list (- max (or min 0))
+                                                `(opt ,@res)))))
+                   state)))
+      (`>= (lex--nfa `(repeat ,(nth 1 re) nil ,@(nthcdr 2 re)) state))
+
+      ((or `bre `re `ere)
+       (lex--nfa (lex-parse-re (nth 1 re) (car re)) state))
+      (elem (error "lex.el: unknown RE element %S" elem))))))
+
+(defun lex--negate-inftail (state howmany)
+  ;; We hashcons the infinite tails and store them in the memoize table.
+  ;; This is an abuse, but saves us from passing it around as an
+  ;; extra argument.
+  (let ((inftail-1+ (gethash state lex--memoize)))
+    (unless inftail-1+
+      ;; Precompute the final infinitely repeating tail.
+      (setq inftail-1+ `(table . ,(make-char-table 'lexer)))
+      (set-char-table-range (cdr inftail-1+) t `(or ,state ,inftail-1+))
+      (push (aref (cdr inftail-1+) 0) lex--states)
+      (puthash state inftail-1+ lex--memoize))
+    (pcase howmany
+      (`1+ inftail-1+)
+      (`0+ (aref (cdr inftail-1+) 0))
+      (_ (error "lex.el: howmany is `%S' instead of one of 1+/0+" howmany)))))
+
+(defun lex--negate-now (nfa state)
+  (pcase (car nfa)
+    (`nil (lex--negate-inftail state '0+))
+    (`check
+     `(check ,(nth 1 nfa) ,(lex--negate-memo (nth 2 nfa) state)
+             ,@(lex--negate-memo (nthcdr 3 nfa) state)))
+    (`stop
+     (if (cddr nfa)
+         ;; This is valid but should normally not happen.
+         (lex--negate-now `(or (stop ,(cadr nfa)) ,(cddr nfa)) state)
+       (lex--negate-inftail state '1+)))
+
+    ((or `or `orelse)
+     (let ((join `(join nil . ,state)))
+       `(and ,@(mapcar (lambda (nfa) (lex--negate-memo nfa join)) (cdr nfa)))))
+
+    (`and
+     `(or ,@(mapcar (lambda (nfa) (lex--negate-memo nfa state)) (cdr nfa))))
+
+    (`join
+     ;; The join says: either exit the `and' because we matched all branches,
+     ;; or keep matching further.  Negation makes the synchrony between
+     ;; `and' branches irrelevant, so we can consider it as an `or(else)'.
+     (if (cadr nfa)
+         ;; This is valid but should normally not happen.
+         (lex--negate-now `(or ,(cadr nfa) ,(cddr nfa)) state)
+       (lex-negate (cddr nfa) state)))
+    (_
+     (let ((ct (make-char-table 'lexer)))
+       ;; Get inftail-0+ from the hashtable.
+       (set-char-table-range ct t (lex--negate-inftail state '0+))
+       (if (characterp (car nfa))
+           (aset ct (car nfa) (lex--negate-memo (cdr nfa) state))
+         (cl-assert (eq 'table (car nfa)))
+         (map-char-table (lambda (range nfa)
+                           (set-char-table-range ct range
+                                                 (lex--negate-memo nfa state)))
+                         (cdr nfa)))
+       `(or ,state (table ,@ct))))))
+
+(defun lex--negate-memo (nfa state)
+  ;; Make sure our `inftail' abuse of the hastable doesn't break anything.
+  (cl-assert (not (eq nfa state)))
+  (or (gethash nfa lex--memoize)
+      (let ((newstate (cons 'state nil)))
+        (puthash nfa newstate lex--memoize)
+        (let ((res (lex--negate-now nfa state)))
+          (when (memq (car res) '(or and orelse))
+            (push newstate lex--states))
+          (if (null res)
+              (setq res '(?a))
+            (setcar newstate (car res))
+            (setcdr newstate (cdr res))
+            newstate)))))
+
+(defun lex-negate (nfa state)
+  "Concatenate the negation of NFA with STATE.
+Returns a new NFA."
+  (let ((lex--memoize (make-hash-table :test 'eq)))
+    (lex--negate-memo nfa state)))
+
+(defun lex--dfa-wrapper (f)
+  (let* ((lex--states ())
+         (res (funcall f))
+         (postponed ())
+         (lex--memoize (make-hash-table :test 'lex--set-eq))
+         (states-dfa (make-hash-table :test 'eq)))
+
+    (while lex--states
+      (dolist (state (prog1 lex--states (setq lex--states nil)))
+        (let ((merged (apply 'lex--merge-now state)))
+          (if (memq (car merged) '(and or orelse))
+              ;; The merge could not be performed for some reason:
+              ;; let's re-schedule it.
+              (push state postponed)
+            (puthash state merged states-dfa))))
+
+      (unless lex--states
+        ;; If states-dfa is empty it means we haven't made any progress,
+        ;; so we're stuck in an infinite loop.  Hopefully this cannot happen?
+        (cl-assert (not (zerop (hash-table-count states-dfa))))
+        (maphash (lambda (k v)
+                   (unless v
+                     ;; With `intersection', lex--merge may end up returning
+                     ;; nil if the intersection is empty, so `v' can be
+                     ;; nil here.  In since `k' is necessarily a cons cell,
+                     ;; we can't turn it into nil, so we turn it into
+                     ;; a more costly lexer that also fails for all inputs.
+                     (setq v '(?a)))
+                   (setcar k (car v))
+                   (setcdr k (cdr v)))
+                 states-dfa)
+        (clrhash states-dfa)
+        (setq lex--states postponed)
+        (setq postponed nil)))
+
+    res))
+
+(defun lex-compile (alist)
+  (lex--dfa-wrapper
+   (lambda ()
+     (let* ((lex--char-equiv-table
+             (if case-fold-search
+                 (case-table-get-table (current-case-table) 'eqv)))
+            (newstate
+             `(or
+               ,@(mapcar (lambda (x) (lex--nfa (car x) (list 'stop (cdr x))))
+                         alist))))
+       (push newstate lex--states)
+       newstate))))
+
+(defun lex-search-dfa (match-dfa)
+  ;; This constructs a search-DFA whose last match should be the leftmost
+  ;; longest match.
+  (lex--dfa-wrapper
+   (lambda ()
+     (lex--nfa '(*\? (char not)) match-dfa))))
+
+
+(defun lex--terminate-if (new old)
+  (cond
+   ((eq new t) t)
+   ((eq old t) t)
+   (t (while new (let ((x (pop new))) (if (not (memq x old)) (push x old))))
+      old)))
+
+(defun lex--optimize-1 (lexer)
+  (let ((terminate nil))
+    (cons
+     (pcase (car lexer)
+       (`table
+        (let ((ct (cdr lexer))
+              (char nil))
+          ;; Optimize each entry.
+          (map-char-table
+           (lambda (range v)
+             (let ((cell (lex--optimize v)))
+               (setq terminate (lex--terminate-if (cdr cell) terminate))
+               (set-char-table-range ct range (car cell))))
+           ct)
+          ;; Optimize the internal representation of the table.
+          (optimize-char-table (cdr lexer) 'eq)
+          ;; Eliminate the table if possible.
+          (map-char-table
+           (lambda (range v)
+             (setq char
+                   (if (and (characterp range) (null char))
+                       range t)))
+           ct)
+          (pcase char
+            (`nil nil)
+            (`t lexer)
+            (_ (setcar lexer 'char) (setcdr lexer (aref ct char)) lexer))))
+       (`stop
+        (let ((cell (lex--optimize (cddr lexer))))
+          (setq terminate t)
+          (setf (cddr lexer) (car cell)))
+        lexer)
+       (`check
+        (let* ((test (nth 1 lexer))
+               (cellf (lex--optimize (nthcdr 3 lexer)))
+               (fail (setf (nthcdr 3 lexer) (car cellf)))
+               (cells (lex--optimize (nth 2 lexer)))
+               (succ (setf (nth 2 lexer) (car cells))))
+          (setq terminate (lex--terminate-if (cdr cellf) terminate))
+          (setq terminate (lex--terminate-if (cdr cells) terminate))
+          ;; TODO: the check-optimizations below only work on consecutive
+          ;; pairs of checks.  We need to be more agressive and make sure
+          ;; the optimized DFA never does twice the same test at the same
+          ;; position.  Most importantly: don't do the same test in
+          ;; a tight loop as in "(^\<)*".
+          (when (eq 'check (car succ))
+            (cond
+             ((equal test (nth 1 succ)) ;Same successful test.
+              (setf (nth 2 lexer) (setq succ (nth 2 succ))))
+             ;; TODO: we can add rules such as bobp -> eolp,
+             ;; bosp -> bowp, (syntax X) -> (syntax Y X), ...
+             ))
+          (when (eq 'check (car fail))
+            (cond
+             ((equal test (nth 1 fail)) ;Same failing test.
+              (setf (nthcdr 3 lexer) (setq fail (nthcdr 3 succ))))
+             ;; TODO: we can add rules such as !eolp -> !bobp,
+             ;; !bowp -> !bosp, !(syntax Y X) -> !(syntax X), ...
+             ))
+          (if (or succ fail) lexer)))
+       (_
+        (cl-assert (characterp (car lexer)))
+        (let ((cell (lex--optimize (cdr lexer))))
+          (setq terminate (lex--terminate-if (cdr cell) terminate))
+          (if (setf (cdr lexer) (car cell))
+              lexer))))
+     (if (consp terminate)
+         (delq lexer terminate)
+       terminate))))
+
+(defun lex--optimize (lexer)
+  (when lexer
+    ;; The lex--memoize cache maps lexer states to (LEXER . TERMINATE) where
+    ;; TERMINATE is either t to say that LEXER can terminate or a list of
+    ;; lexers which means that LEXER terminates only if one of the lexers in
+    ;; the list terminates.
+    (let ((cache (gethash lexer lex--memoize)))
+      (if cache
+          ;; Optimize (char C) to nil.
+          (if (and (characterp (caar cache)) (null (cdar cache))) nil cache)
+        ;; Store a value indicating that we're in the process of computing it,
+        ;; so when we encounter a loop, we don't recurse indefinitely.
+        ;; Not knowing any better, we start by stating the tautology that
+        ;; `lexer' terminates if and only if `lexer' terminates.
+        (let ((cell (cons lexer (list lexer))))
+          (puthash lexer cell lex--memoize)
+          (let ((res (lex--optimize-1 lexer)))
+            (if (and (car res) (cdr res))
+                res
+              (setcar lexer ?a)
+              (setcdr lexer nil)
+              (puthash lexer '(nil) lex--memoize)
+              nil)))))))
+
+(defun lex-optimize (lexer)
+  (let ((lex--memoize (make-hash-table :test 'eq)))
+    (prog1 (car (lex--optimize lexer))
+      (message "Visited %d states" (hash-table-count lex--memoize)))))
+
+(defmacro lex-case (object posvar &rest cases)
+  (declare (indent 2))
+  (let* ((i -1)
+         (alist (mapcar (lambda (case) (cons (car case) (cl-incf i))) cases))
+         (lex (lex-compile alist))
+         (tmpsym (make-symbol "tmp")))
+    (setq i -1)
+    `(let ((,tmpsym (lex-match-string ',lex ,object ,posvar)))
+       (pcase (car ,tmpsym)
+         ,@(mapcar (lambda (case)
+                     `(,(cl-incf i)
+                       (set-match-data
+                        (list ,posvar (setq ,posvar (cadr ,tmpsym))))
+                       ,@(cdr case)))
+                   cases)))))
+
+;;; Matching engine
+
+(defun lex--match-bobp (arg pos &optional string)
+  (= pos (if string 0 (point-min))))
+
+(defun lex--match-eobp (arg pos &optional string)
+  (= pos (if string (length string) (point-max))))
+
+(defun lex--match-bolp (arg pos &optional string)
+  (if string (or (= pos 0) (eq ?\n (aref string (1- pos))))
+    (memq (char-before pos) '(nil ?\n))))
+
+(defun lex--match-eolp (arg pos &optional string)
+  (if string (or (= pos (length string)) (eq ?\n (aref string pos)))
+    (memq (char-after pos) '(nil ?\n))))
+
+(defun lex--match-bowp (arg pos &optional string)
+  (and (not (if string (and (> pos 0)
+                            (eq ?w (char-syntax (aref string (1- pos)))))
+              (and (> pos (point-min)) (eq 2 (car (syntax-after (1- pos)))))))
+       (if string (and (< pos (length string))
+                       (eq ?w (char-syntax (aref string pos))))
+         (eq 2 (car (syntax-after pos))))))
+
+(defun lex--match-eowp (arg pos &optional string)
+  (and (if string (and (> pos 0)
+                       (eq ?w (char-syntax (aref string (1- pos)))))
+         (and (> pos (point-min)) (eq 2 (car (syntax-after (1- pos))))))
+       (not (if string (and (< pos (length string))
+                            (eq ?w (char-syntax (aref string pos))))
+              (eq 2 (car (syntax-after pos)))))))
+
+(defun lex--match-bosp (arg pos &optional string)
+  (and (not (if string
+                (and (> pos 0)
+                     (memq (char-syntax (aref string (1- pos))) '(?w ?_)))
+              (and (> pos (point-min))
+                   (memq (car (syntax-after (1- pos))) '(2 3)))))
+       (if string (and (< pos (length string))
+                       (memq (char-syntax (aref string pos)) '(?w ?_)))
+         (memq (car (syntax-after pos)) '(2 3)))))
+
+(defun lex--match-eosp (arg pos &optional string)
+  (and (if string (and (> pos 0)
+                       (memq (char-syntax (aref string (1- pos))) '(?w ?_)))
+         (and (> pos (point-min)) (memq (car (syntax-after (1- pos))) '(2 3))))
+       (not (if string (and (< pos (length string))
+                            (memq (char-syntax (aref string pos)) '(?w ?_)))
+              (memq (car (syntax-after pos)) '(2 3))))))
+
+(defun lex--match-not-word-boundary (arg pos &optional string)
+  (eq (if string (and (> pos 0)
+                      (eq ?w (char-syntax (aref string (1- pos)))))
+        (and (> pos (point-min)) (eq 2 (car (syntax-after (1- pos))))))
+      (if string (and (< pos (length string))
+                      (eq ?w (char-syntax (aref string pos))))
+        (eq 2 (car (syntax-after pos))))))
+
+(defun lex--match-upper (arg pos &optional string)
+  (when (< pos (if string (length string) (point-max)))
+    (let ((char (if string (aref string pos) (char-after pos))))
+      (not (eq (downcase char) char)))))
+
+(defun lex--match-lower (arg pos &optional string)
+  (when (< pos (if string (length string) (point-max)))
+    (let ((char (if string (aref string pos) (char-after pos))))
+      (not (eq (upcase char) char)))))
+
+
+(defun lex--match-category (category pos &optional string)
+  (when (< pos (if string (length string) (point-max)))
+    (aref (char-category-set (if string (aref string pos)
+                               (char-after pos)))
+          category)))
+
+(defun lex--match-syntax (syntaxes pos &optional string)
+  (when (< pos (if string (length string) (point-max)))
+    (memq (car (if string (aref (syntax-table) (aref string pos))
+                 (syntax-after pos)))
+          syntaxes)))
+
+
+(defun lex-match-string (lex string &optional start stop)
+  "Match LEX against STRING between START and STOP.
+Return a triplet (VALUE ENDPOS . LEXER) where VALUE is the
+value of returned by the lexer for the match found (or nil), ENDPOS
+is the end position of the match found (or nil), and LEXER is the
+state of the engine at STOP, which can be passed back to
+`lex-match-string' to continue the match elsewhere."
+  ;; FIXME: Move this to C.
+  (unless start (setq start 0))
+  (unless stop  (setq stop (length string)))
+  (let ((match (list nil nil))
+        (lastlex lex))
+    (while
+        (progn
+          (while (eq (car lex) 'check)
+            (setq lex (if (funcall (car (nth 1 lex)) (cdr (nth 1 lex))
+                                   start string)
+                          (nth 2 lex) (nthcdr 3 lex))))
+          (when (eq (car lex) 'stop)
+            ;; Don't stop yet, we're looking for the longest match.
+            (setq match (list (cadr lex) start))
+            (message "Found match: %s" match)
+            (setq lex (cddr lex)))
+          (cl-assert (not (eq (car lex) 'stop)))
+          (and lex (< start stop)))
+      (let ((c (aref string start)))
+        (setq start (1+ start))
+        (setq lex (cond
+                   ((eq (car lex) 'table) (aref (cdr lex) c))
+                   ((integerp (car lex)) (if (eq c (car lex)) (cdr lex)))))
+        (setq lastlex lex)))
+    (message "Final search pos considered: %s" start)
+    ;; The difference between `lex' and `lastlex' is basically that `lex'
+    ;; may depend on data after `stop' (if there was an `end-of-file' or
+    ;; `word-boundary' or basically any `check').  So let's return `lastlex'
+    ;; so it can be correctly used to continue the match with a different
+    ;; content than what's after `stop'.
+    (nconc match lastlex)))
+
+(defun lex-match-string-first (lex string &optional start stop)
+  "Match LEX against STRING between START and STOP.
+Return a triplet (VALUE ENDPOS . LEXER) where VALUE is the
+value of returned by the lexer for the match found (or nil), ENDPOS
+is the end position of the match found (or nil), and LEXER is the
+state of the engine at STOP, which can be passed back to
+`lex-match-string' to continue the match elsewhere."
+  ;; FIXME: Move this to C.
+  (unless start (setq start 0))
+  (unless stop  (setq stop (length string)))
+  (let ((match (list nil nil))
+        (lastlex lex))
+    (catch 'found
+      (while
+          (progn
+            (while (eq (car lex) 'check)
+              (setq lex (if (funcall (car (nth 1 lex)) (cdr (nth 1 lex))
+                                     start string)
+                            (nth 2 lex) (nthcdr 3 lex))))
+            (when (eq (car lex) 'stop)
+              (throw 'found (cl-list* (cadr lex) start (cddr lex))))
+            (cl-assert (not (eq (car lex) 'stop)))
+            (and (not match) lex (< start stop)))
+        (let ((c (aref string start)))
+          (setq start (1+ start))
+          (setq lex (cond
+                     ((eq (car lex) 'table) (aref (cdr lex) c))
+                     ((integerp (car lex)) (if (eq c (car lex)) (cdr lex)))))
+          (setq lastlex lex)))
+      ;; The difference between `lex' and `lastlex' is basically that `lex'
+      ;; may depend on data after `stop' (if there was an `end-of-file' or
+      ;; `word-boundary' or basically any `check').  So let's return `lastlex'
+      ;; so it can be correctly used to continue the match with a different
+      ;; content than what's after `stop'.
+      (cl-list* nil start lastlex))))
+
+(defun lex-match-buffer (lex &optional stop)
+  "Match LEX against buffer between point and STOP.
+Return a triplet (VALUE ENDPOS . LEXER) where VALUE is the
+value of returned by the lexer for the match found (or nil), ENDPOS
+is the end position of the match found (or nil), and LEXER is the
+state of the engine at STOP, which can be passed back to
+continue the match elsewhere."
+  ;; FIXME: Move this to C.
+  (unless stop  (setq stop (point-max)))
+  (let ((start (point))
+        (match (list nil nil))
+        (lastlex lex))
+    (while
+        (progn
+          (while (eq (car lex) 'check)
+            (setq lex (if (funcall (car (nth 1 lex)) (cdr (nth 1 lex))
+                                   start)
+                          (nth 2 lex) (nthcdr 3 lex))))
+          (when (eq (car lex) 'stop)
+            ;; Don't stop yet, we're looking for the longest match.
+            (setq match (list (cadr lex) start))
+            (message "Found match: %s" match)
+            (setq lex (cddr lex)))
+          (cl-assert (not (eq (car lex) 'stop)))
+          (and lex (< start stop)))
+      (let ((c (char-after start)))
+        (setq start (1+ start))
+        (setq lex (cond
+                   ((eq (car lex) 'table) (aref (cdr lex) c))
+                   ((integerp (car lex)) (if (eq c (car lex)) (cdr lex)))))
+        (setq lastlex lex)))
+    (message "Final search pos considered: %s" start)
+    ;; The difference between `lex' and `lastlex' is basically that `lex'
+    ;; may depend on data after `stop' (if there was an `end-of-file' or
+    ;; `word-boundary' or basically any `check').  So let's return `lastlex'
+    ;; so it can be correctly used to continue the match with a different
+    ;; content than what's after `stop'.
+    (nconc match lastlex)))
+
+(provide 'lex)
+;;; lex.el ends here
diff --git a/packages/lmc/lmc.el b/packages/lmc/lmc.el
new file mode 100644 (file)
index 0000000..6eae564
--- /dev/null
@@ -0,0 +1,804 @@
+;;; lmc.el --- Little Man Computer in Elisp
+
+;; Copyright (C) 2011, 2013  Free Software Foundation, Inc.
+
+;; Author: Stefan Monnier <monnier@iro.umontreal.ca>
+;; Version: 1.2
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; A simulator for the Little Man Computer.
+;; http://en.wikipedia.org/wiki/Little_man_computer
+
+;; The simulator uses a plain editable buffer, so you can edit the machine
+;; words just like any other text, and every word can be given a name (label)
+;; which can also be edited in the normal way.  Additionally to the labels it
+;; shows the disassembled meaning of instruction words.  Of course, it can't
+;; always know which words are meant to be code rather than data, so it relies
+;; on information from the assembler to do that, and otherwise just marks every
+;; word it executes as being "code".
+
+;; The assembly uses a slightly different (Lispish) syntax where comments start
+;; with ";", and each instruction needs to be wrapped in parentheses.
+;; Other than that it's the same assembly as documented elsewhere
+;; (accepts a few mnemonic variants, such as IN/INP, STA/STO, BR/BRA).
+;; Another difference is that the DAT mnemonic accepts any number of words
+;; rather than just one.
+;;
+;; So the assembly (stored in files with extension ".elmc") looks like:
+;;
+;;   label1
+;;          (BR label2) ;Useless extra jump.
+;;   label2
+;;          (LDA data1) ;Cleverest part of the algorithm.
+;;          (ADD data2)
+;;          (STO data1)
+;;          (BR label1)
+;;          
+;;   data1  (DAT 0)
+;;   data2  (DAT 050 060 070)
+;;
+;; And actually, since the assembler re-uses the Emacs Lisp reader to parse the
+;; code, you can use binary, octal, and hexadecimal constants as well, using
+;; the notations #b101010, #o277, and #x5F respectively.
+;; 
+;; The lmc-asm-mode supports the usual editing features such as label
+;; completion, mnemonic completion, jumping to a label, automatic indentation,
+;; and code folding.
+
+;;; Code:
+
+(eval-when-compile (require 'cl))
+(require 'hexl)
+
+(defgroup lmc ()
+  "Customization group for the Little Man Computer simulator."
+  :group 'languages)
+
+;;; The LMC-Simulator
+
+(defvar lmc--pc 0 "Program counter for LMC.")
+(make-variable-buffer-local 'lmc--pc)
+
+(defvar lmc-acc 0 "Accumulator for LMC.")
+(make-variable-buffer-local 'lmc--acc)
+
+(defvar lmc-turbo nil
+  "When non-nil, evaluate the code without extra delays.
+When nil, evaluation flashes the cursor at to help you see what's going on,
+which slows it down significantly.
+Also, when nil, evaluation is interrupted when the user hits a key.")
+
+;; Emacs-22 backward compatibility.
+(defmacro lmc--with-silent-modifications (&rest body)
+  (declare (debug t) (indent 0))
+  (if (fboundp 'with-silent-modifications)
+      `(with-silent-modifications ,@body)
+    (let ((modified (make-symbol "modified")))
+      `(let* ((,modified (buffer-modified-p))
+             (buffer-undo-list t)
+             (inhibit-read-only t)
+             (inhibit-modification-hooks t)
+             deactivate-mark
+             ;; Avoid setting and removing file locks and checking
+             ;; buffer's uptodate-ness w.r.t the underlying file.
+             buffer-file-name
+             buffer-file-truename)
+        (unwind-protect
+            (progn
+              ,@body)
+          (unless ,modified
+            (restore-buffer-modified-p nil)))))))
+
+;; (defun lmc-check (cmds)
+;;   (dolist (cmd cmds)
+;;     (pcase cmd
+;;       ((pred symbolp))                                ;A label.
+;;       (`(,(or `IN `OUT `HLT `COB)))                   ;Arity-0 opcode.
+;;       (`(,(or `LDA `STO `ADD `SUB `BR `BRZ `BRP `DAT) ;Arity-1 opcode.
+;;          ,(or (pred lmc--numberp) (pred symbolp))))
+;;       (_ (error "Unknown instruction %S" cmd)))))
+
+(defun lmc--numberp (n max)
+  (when (numberp n)
+    (or (and (or (natnump n) (error "%S is not a positive integer" n))
+             (or (< n max) (error "%S is too large" n))))))
+
+(defun lmc--resolve (arg labels max)
+  (if (lmc--numberp arg max) arg
+    (or (cdr (assq arg labels))
+        (error (if (symbolp arg)
+                   "Unknown label %S"
+                 "Arg %S is neither a label nor a number")
+               arg))))
+
+(defconst lmc-mnemonic-1-table '((LDA . 5)
+                                 (STO . 3) (STA . 3)
+                                 (ADD . 1)
+                                 (SUB . 2)
+                                 (BR . 6) (BRA . 6)
+                                 (BRZ . 7)
+                                 (BRP . 8))
+  "Mnemonic table for arity-1 instructions.")
+
+(defconst lmc-mnemonic-0-table '((HLT . 000) (COB . 000)
+                                 (IN . 901) (INP . 901)
+                                 (OUT . 902))
+  "Mnemonic table for arity-0 instructions.")
+
+(defun lmc--assemble (cmds)
+  ;; FIXME: Move to error position upon error.
+  (let ((pos 0)
+        (labels ()))
+    ;; First pass, resolve labels to their positions.
+    (dolist (cmd cmds)
+      (setq cmd (cdr cmd))              ;Ignore position info at this stage.
+      (cond
+       ((or (consp cmd)
+            (assq cmd lmc-mnemonic-0-table))
+        (setq pos (+ pos (if (eq (car cmd) 'DAT)
+                             (1- (length cmd)) 1))))
+       ((numberp cmd)
+        (cond
+         ((not (and (natnump cmd) (< cmd 100)))
+          (error "%S is not a valid address" cmd))
+         ((< cmd pos)
+          (error "Address %S already used" cmd))
+         ((rassq pos labels)
+          (error "Label %S needs to come after address %S"
+                 (car (rassq pos labels)) cmd))
+         (t (setq pos cmd))))
+       ((and cmd (symbolp cmd))
+        ;; (assert (symbolp cmd))
+        (if (assq cmd labels)
+            (error "Duplicate label %S" cmd)
+          (push (cons cmd pos) labels)))))
+    ;; Second pass, do the actual assembly.
+    (let* ((words ())
+           (ll nil)
+           (newword
+            (lambda (w &optional code)
+              (push (list w ll code) words) (setq ll nil))))
+      (dolist (cmd cmds)
+        (goto-char (pop cmd))          ;Move to start of CMD, in case of error.
+        (cond
+         ((assq cmd lmc-mnemonic-0-table)
+          (funcall newword (cdr (assq cmd lmc-mnemonic-0-table)) 'code))
+         ((and (null (cdr-safe cmd))
+               (assq (car-safe cmd) lmc-mnemonic-0-table))
+          (funcall newword (cdr (assq (car cmd) lmc-mnemonic-0-table)) 'code))
+         ((eq (car-safe cmd) 'DAT)
+          (dolist (arg (cdr cmd))
+            (funcall newword (lmc--resolve arg labels 1000))))
+         ((assq (car-safe cmd) lmc-mnemonic-1-table)
+          (funcall newword
+                   (+ (* 100 (cdr (assq (car cmd) lmc-mnemonic-1-table)))
+                      (lmc--resolve (nth 1 cmd) labels 100))
+                   'code))
+         ((numberp cmd)
+          (dotimes (_ (- cmd (length words)))
+            (funcall newword 0)))
+         ((and cmd (symbolp cmd))
+          (assert (eq (cdr (assq cmd labels)) (length words)))
+          (setq ll cmd))
+         (t (error "Invalid instruction %S" cmd))))
+      (nreverse words))))
+
+;; (defvar lmc-label-width 8)
+
+(defun lmc--load-word (word addr)
+  (assert (bolp))
+  (insert (propertize (format " %02d:\t" addr)
+                      'read-only t
+                      'front-sticky t
+                      'rear-nonsticky t))
+  (let ((word (car word))
+        (label (nth 1 word))
+        (code (nth 2 word)))
+    (let ((basepos (point))
+          (base (current-column)))
+      (if (and label (symbolp label))
+          (insert (symbol-name label)))
+      ;; (when (>= (current-column) (+ base tab-width))
+      ;;   (while (>= (current-column) (+ base tab-width -1))
+      ;;     (delete-char -1))
+      ;;   (insert "…")
+      ;;   (put-text-property basepos (point)
+      ;;                      'help-echo (symbol-name label)))
+      ;; (insert (propertize
+      ;;      (make-string (1+ (- lmc-label-width (current-column))) ?\s)
+      ;;      'display '(space :align-to (1+ lmc-label-width))))
+      (insert (eval-when-compile (propertize "\t"
+                                             'read-only t
+                                             'rear-nonsticky t))))
+    (insert (format "  %03d" word))
+    (insert (if code
+                (eval-when-compile (propertize "\n"
+                                               'lmc-code t
+                                               'read-only t
+                                               'rear-nonsticky t))
+              (eval-when-compile (propertize "\n"
+                                             'read-only t
+                                             'rear-nonsticky t))))))
+
+(defun lmc-disassemble-word (word)
+  (let ((code (car (rassq (/ word 100) lmc-mnemonic-1-table))))
+    (cond
+     (code (list code (mod word 100)))
+     ((rassq word lmc-mnemonic-0-table)
+      (list (car (rassq word lmc-mnemonic-0-table)))))))
+
+(defun lmc-addr->point (addr)
+  (goto-char (point-min))
+  (forward-line addr))
+
+(defun lmc-point->addr ()
+  (- (count-lines (point-min) (point)) (if (bolp) 0 1)))
+
+(defun lmc-get-word (&optional addr fix)
+  (save-excursion
+    (if (null addr)
+        (forward-line 0)
+      (lmc-addr->point addr))
+    (cond
+     ((re-search-forward "\t.*\t  \\([0-9][0-9][0-9]\\)$"
+                         (line-end-position) t)
+      (string-to-number (match-string 1)))
+     ((re-search-forward "\t.*\t\\(.*\\)$" (line-end-position) t)
+      (let ((n (string-to-number (match-string 1))))
+        (unless (integerp n) (setq n (truncate n)))
+        (setq n (mod n 1000))
+        (when fix
+          (replace-match (format "  %03d" n) t t nil 1))
+        n))
+     (t 0))))
+
+(defconst lmc-label-re "^\\([^\t\n]*\\)\t\\(.*\\)\t *[0-9]")
+
+(defvar lmc-label-table nil)
+
+(defun lmc-record-label (addr label)
+  (let ((old (aref lmc-label-table addr)))
+    (unless (and old (equal (car old) label))
+      ;; (message "recordlabel %S = %S" addr label)
+      (aset lmc-label-table addr (list label))
+      (when (cdr old)
+        (run-with-timer
+         0 nil
+         (lambda (buf refaddrs)
+           (with-current-buffer buf
+             (save-excursion
+               ;; (message "refreshlabel in %S" refaddrs)
+               (dolist (refaddr refaddrs)
+                 (lmc-addr->point (1+ refaddr))
+                 (unless (bobp)
+                   (let ((inhibit-read-only t))
+                     (put-text-property (1- (point)) (point)
+                                        'fontified nil)))))))
+         (current-buffer) (cdr old))))))
+
+(defun lmc-get-label (addr)
+  (save-excursion
+    ;; (if (null addr)
+    ;;     (forward-line 0)
+    (lmc-addr->point addr) ;; )
+    (let ((label (when (re-search-forward lmc-label-re nil t)
+                   (if (> (match-end 2) (match-beginning 2))
+                       (match-string 2)))))
+      (lmc-record-label addr label)
+      label)))
+
+
+(defun lmc-font-lock-opcode ()
+  (save-match-data
+    (when (get-text-property (line-end-position) 'lmc-code)
+      (let* ((word (lmc-get-word))
+             (code (lmc-disassemble-word word)))
+        ;; Resolve labels.
+        (when (integerp (nth 1 code))
+          (let* ((addr (nth 1 code))
+                 (label (lmc-get-label addr)))
+            (pushnew (lmc-point->addr)
+                     (cdr (aref lmc-label-table addr)))
+            (when label
+              (setf (nth 1 code) label))))
+        (put-text-property
+         (line-end-position) (1+ (line-end-position))
+         'display
+         (format (eval-when-compile
+                   (concat (propertize "\t" 'cursor t)
+                           (propertize "%s" 'face font-lock-comment-face)
+                           "\n"))
+                 (or code '(Invalid opcode)))))
+      nil)))
+
+(defun lmc-font-lock-label ()
+  (lmc-record-label (lmc-point->addr)
+                    (if (> (match-end 2) (match-beginning 2))
+                       (match-string 2)))
+  (save-excursion
+    ;; ;; Replace any TAB found in label.
+    ;; (goto-char (match-beginning 2))
+    ;; (while (progn (skip-chars-forward "^\t" (match-end 2))
+    ;;               (< (point) (match-end 2)))
+    ;;   (insert " ") (delete-char 1))
+    ;; Truncate label's display if needed.
+    (move-to-column (1- (* 2 tab-width)))
+    (when (> (match-end 2) (point))
+      (forward-char -1)
+      (put-text-property (match-beginning 2) (match-end 2)
+                         'help-echo (match-string 2))
+      (put-text-property (point) (match-end 2) 'display "…")))
+  font-lock-constant-face)
+
+(defconst lmc-font-lock-keywords
+  `((,lmc-label-re
+     (1 'hexl-address-region)
+     (2 (lmc-font-lock-label)))
+    (".$" (0 (lmc-font-lock-opcode)))))
+
+(defun lmc-after-change (beg end len)
+  (unless inhibit-read-only
+    (save-excursion
+      ;; Replace any TAB or NL inserted, which could interfere with parsing.
+      (goto-char beg)
+      (while (progn (skip-chars-forward "^\t\n" end)
+                    (< (point) end))
+        (insert " ") (delete-char 1)))))
+
+(defvar lmc-pc 0 "LMC program counter.")
+(make-variable-buffer-local 'lmc-pc)
+(defvar lmc-acc nil "LMC accumulator.")
+(make-variable-buffer-local 'lmc-acc)
+(defvar lmc-output nil "Past LMC output,")
+(make-variable-buffer-local 'lmc-output)
+
+(defvar lmc--stopped nil "State where we stopped.")
+(make-variable-buffer-local 'lmc--stopped)
+
+(defun lmc-update-pc ()
+  (setq lmc-pc (mod lmc-pc 100))
+  (lmc-addr->point lmc-pc)
+  (move-marker overlay-arrow-position (point))
+  (re-search-forward "\t.*\t *" nil t)
+  (unless (get-text-property (line-end-position) 'lmc-code)
+    (let ((inhibit-read-only t))
+      (put-text-property (line-end-position)
+                         (min (1+ (line-end-position)) (point-max))
+                         'lmc-code t))))
+
+(defun lmc--state ()
+  (list (buffer-chars-modified-tick) lmc-acc lmc-pc))
+(defun lmc-stopped-p ()
+  (equal (lmc--state) lmc--stopped))
+
+;; FIXME: Add tool-bar to LMC-Sim.
+
+(defvar lmc-mode-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map "\C-c\C-s" 'lmc-step)
+    (define-key map "\C-c\C-r" 'lmc-run)
+    (define-key map "\C-c\C-l" 'lmc-load-file)
+    (define-key map "\C-c\C-a" 'lmc-set-acc)
+    (define-key map "\C-c\C-p" 'lmc-set-pc)
+    map))
+
+(easy-menu-define lmc-menu lmc-mode-map "Menu for LMC-Sim."
+  '("LMC-Sim"
+    ["Step" lmc-step (not (lmc-stopped-p))]
+    ["Run" lmc-run (not (lmc-stopped-p))]
+    ["Load file" lmc-load-file]
+    "--"
+    ["Set Program Counter" lmc-set-pc]
+    ["Set Accumulator" lmc-set-acc]))
+
+(defvar lmc-tool-bar-map
+  (let ((map (make-sparse-keymap)))
+    (tool-bar-local-item "gud/next" 'lmc-step 'step map
+                         :label "Step" ;; :vert-only t
+                         :enable '(not (lmc-stopped-p))
+                         )
+    (tool-bar-local-item "gud/run" 'lmc-run 'run map
+                         :label "Run" ;; :vert-only t
+                         :enable '(not (lmc-stopped-p))
+                         )
+    map))
+
+(defun lmc-tool-bar-to-string (&optional map)
+  (let ((res ""))
+    (map-keymap
+     (lambda (k v)
+       (when (eq (car v) 'menu-item)
+         (let* ((label (nth 1 v))
+                (cmd (nth 2 v))
+                (plist (nthcdr (if (consp (nth 3 v)) 4 3) v))
+                (help-echo (plist-get plist :help))
+                (image     (plist-get plist :image))
+                (enable-exp (if (plist-member plist :enable)
+                                (plist-get plist :enable)
+                              t))
+                (enable (eval enable-exp))
+                (map (let ((map (make-sparse-keymap)))
+                       (define-key map [header-line mouse-1] cmd)
+                       (define-key map [header-line mouse-2] cmd)
+                       map))
+                (button
+                 (propertize " " 'help-echo (or help-echo label)
+                             'keymap map
+                             'face 'header-line
+                             'mouse-face (if enable 'mode-line-highlight)
+                             'rear-nonsticky '(display keymap help-echo)
+                             'display (if (and (eq 'image (car image))
+                                               (not enable))
+                                          `(image :conversion disabled
+                                                  ,@(cdr image))
+                                        image))))
+           (setq res (concat res (propertize " " 'display '(space :width 0.5)
+                                             'face 'header-line
+                                             )
+                             button)))))
+     (or (let ((tool-bar-map map)) (tool-bar-make-keymap))
+         (key-binding [tool-bar])))
+    res))
+
+(define-derived-mode lmc-mode fundamental-mode "LMC-Sim"
+  "The simulator of the Little Man Computer."
+  (set (make-local-variable 'truncate-lines) t)
+  (set (make-local-variable 'truncate-partial-width-windows) t)
+  (set (make-local-variable 'tab-width) 10)
+  (set (make-local-variable 'font-lock-defaults)
+       '(lmc-font-lock-keywords t))
+  (set (make-local-variable 'font-lock-extra-managed-props)
+       '(display help-echo))
+  ;; (set (make-local-variable 'tool-bar-map) lmc-tool-bar-map)
+  (add-hook 'after-change-functions #'lmc-after-change nil t)
+  (set (make-local-variable 'lmc-label-table) (make-vector 100 nil))
+  (set (make-local-variable 'overlay-arrow-position) (point-min-marker))
+  (lmc-update-pc)
+  ;; (overwrite-mode 1)
+  (set (make-local-variable 'header-line-format)
+       `(""
+         (:eval (lmc-tool-bar-to-string lmc-tool-bar-map))
+         "  " ,(propertize "LMC-Sim" 'face '(bold italic)) "  "
+         ,(propertize "PC=" 'face 'font-lock-function-name-face)
+         (:eval (format ,(propertize "%02d"
+                                     'mouse-face 'mode-line-highlight
+                                     'help-echo
+                                     "mouse-2: set the Program Counter"
+                                     'follow-link t
+                                     ;; I'm having problems with mouse-2 to
+                                     ;; mouse-1 remapping in the mode-line and
+                                     ;; header-line, so I over-do it a bit.
+                                     'keymap
+                                     '(keymap
+                                       (header-line keymap
+                                                    (down-mouse-1 . ignore)
+                                                    (mouse-2 . lmc-set-pc)
+                                                    (mouse-1 . lmc-set-pc))))
+                        lmc-pc))
+         "  " ,(propertize "ACC=" 'face 'font-lock-function-name-face)
+         (:eval (format ,(propertize "%03d"
+                                     'mouse-face 'mode-line-highlight
+                                     'help-echo "mouse-2: set the Accumulator"
+                                     'follow-link t
+                                     'keymap
+                                     ;; I'm having problems with mouse-2 to
+                                     ;; mouse-1 remapping in the mode-line and
+                                     ;; header-line, so I over-do it a bit.
+                                     '(keymap
+                                       (header-line keymap
+                                                    (down-mouse-1 . ignore)
+                                                    (mouse-2 . lmc-set-acc)
+                                                    (mouse-1 . lmc-set-acc))))
+                        lmc-acc))
+         "      " ,(propertize "Recent output="
+                               'face 'font-lock-function-name-face)
+         (:eval (if lmc-output (format "%s" lmc-output) "()"))))
+  )
+
+(defun lmc-set-pc (pc)
+  "Set the Program Counter."
+  (interactive (list (read-number "New PC: " lmc-pc)))
+  (setq lmc-pc pc)
+  (lmc-update-pc))
+
+(defun lmc-set-acc (acc)
+  "Set the Accumulator."
+  (interactive (list (read-number "New Accumulator: " lmc-acc)))
+  (setq lmc-acc (mod acc 1000)))
+
+(defun lmc-load (words)
+  (pop-to-buffer "*LMC-Sim*")
+  (lmc-mode)
+  (let ((inhibit-read-only t)
+        (addr 0))
+    (setq lmc-pc 0)
+    (setq lmc-acc 0)
+    (setq lmc-output nil)
+    (erase-buffer)
+    (dolist (word words)
+      (lmc--load-word word addr)
+      (setq addr (1+ addr)))
+    (while (< addr 100)
+      (lmc--load-word '(0) addr)
+      (setq addr (1+ addr))))
+  (lmc-update-pc))
+
+(defcustom lmc-store-flash t
+  "If non-nil, memory words blink when modified."
+  :type 'boolean)
+
+(defun lmc--sit-for (secs)
+  (unless lmc-turbo (sit-for secs)))
+
+(defun lmc-store-word (addr word)
+  (save-excursion
+    (lmc-addr->point addr)
+    (if (not (re-search-forward "\t.*\t\\(.*\\)$" (line-end-position) t))
+        (error "Missing memory cell %S" addr)
+      (let ((mb1 (match-beginning 1)))
+        (when lmc-store-flash
+          (lmc--with-silent-modifications
+           (put-text-property mb1 (point) 'face 'region))
+          (lmc--sit-for 0.2))
+        (let ((me1 (point)))
+          (insert (format "  %03d" word)) (delete-region mb1 me1))
+        (when lmc-store-flash
+          (lmc--sit-for 0.1)
+          (lmc--with-silent-modifications
+           (put-text-property mb1 (point) 'face 'region))
+          (lmc--sit-for 0.1)
+          (lmc--with-silent-modifications
+           (put-text-property mb1 (point) 'face nil))
+          (lmc--sit-for 0.1))))))
+
+(defun lmc-step ()
+  "Execute one LMC instruction."
+  (interactive)
+  (let* ((inst (lmc-get-word lmc-pc 'fix))
+         (code (lmc-disassemble-word inst)))
+    (case (car code)
+      (HLT (if (lmc-stopped-p)
+               (error "Already halted")
+             (setq lmc--stopped (lmc--state))
+             (force-mode-line-update)
+             (message "Done.")))
+      (IN (setq lmc-acc (mod (read-number "Enter a number") 1000))
+          (incf lmc-pc))
+      (OUT (message "Output: %03d" lmc-acc)
+           (push (format "%03d" lmc-acc) lmc-output)
+           (incf lmc-pc))
+      (LDA (setq lmc-acc (lmc-get-word (nth 1 code)))
+           (incf lmc-pc))
+      (STO (lmc-store-word (nth 1 code) lmc-acc)
+           (incf lmc-pc))
+      (ADD (setq lmc-acc (mod (+ lmc-acc (lmc-get-word (nth 1 code)))
+                              1000))
+           (incf lmc-pc))
+      (SUB (setq lmc-acc (mod (- lmc-acc (lmc-get-word (nth 1 code)))
+                              1000))
+           (incf lmc-pc))
+      (BR (setq lmc-pc (nth 1 code)))
+      (BRZ (setq lmc-pc (if (zerop lmc-acc)
+                            (nth 1 code)
+                          (1+ lmc-pc))))
+      (BRP (setq lmc-pc (if (< lmc-acc 500)
+                            (nth 1 code)
+                          (1+ lmc-pc))))
+      ((nil) (error "Invalid instruction %S" inst))
+      (t (error "%S not implemented" code))))
+  (lmc-update-pc))
+
+(defun lmc-run ()
+  "Run the code until hitting a HLT.
+The machine will also stop if the user presses a key."
+  (interactive)
+  (while (not (or (unless lmc-turbo (input-pending-p)) (lmc-stopped-p)))
+    (lmc-step)
+    (lmc--sit-for 0.05)))
+
+;;; The LMC assembly language editor.
+
+(defvar lmc-asm-mode-map
+  (let ((map (make-sparse-keymap)))
+    ;; FIXME: Add "load" and "assemble" buttons.
+    (define-key map "\C-c\C-l" 'lmc-asm-load)
+    (define-key map "\C-c\C-a" 'lmc-asm-assemble)
+    map))
+
+(easy-menu-define lmc-asm-menu lmc-asm-mode-map
+  "Menu for the LMC-Asm mode."
+  '("LMC-Asm"
+    ["Assemble" lmc-asm-assemble]
+    ["Load into Simulator" lmc-asm-load]))
+
+
+(defconst lmc-asm-mnemonic-names
+  (mapcar #'symbol-name
+          (append (mapcar #'car lmc-mnemonic-1-table)
+                  (mapcar #'car lmc-mnemonic-0-table)
+                  '(DAT))))
+
+(defconst lmc-asm-mnemonic-names-re (regexp-opt lmc-asm-mnemonic-names))
+
+(defvar lmc-asm-font-lock-keywords
+  `(("^[ \t]*\\(?:\\sw\\|\\s_\\)+"
+     (0 (if (zerop (nth 0 (syntax-ppss))) font-lock-constant-face)))
+    (,(concat "(\\(" lmc-asm-mnemonic-names-re "\\_>\\)")
+     (1 font-lock-keyword-face))))
+
+(defvar lmc-asm-imenu-generic-expression
+  '((nil "^\\(\\(?:\\sw\\|\\s_\\)+\\)" 1)))
+
+(defvar lmc-asm-outline-regexp "^\\(?:\\sw\\|\\s_\\)")
+
+;; We use the ".elmc" extension since the syntax is not identical to
+;; the usual ".lmc" syntax.
+;;;###autoload
+(add-to-list 'auto-mode-alist '("\\.elmc\\'" . lmc-asm-mode))
+
+;;;###autoload
+(define-derived-mode lmc-asm-mode fundamental-mode "LMC-Asm"
+  "Major mode to edit LMC assembly code."
+  :syntax-table emacs-lisp-mode-syntax-table
+  (set (make-local-variable 'font-lock-defaults)
+       '(lmc-asm-font-lock-keywords))
+  (set (make-local-variable 'indent-line-function)
+       #'lmc-asm-indent-line)
+  (set (make-local-variable 'indent-tabs-mode) t)
+  (set (make-local-variable 'imenu-generic-expression)
+       lmc-asm-imenu-generic-expression)
+  (set (make-local-variable 'outline-regexp) lmc-asm-outline-regexp)
+  (add-hook 'completion-at-point-functions #'lmc-asm-completion nil t)
+  (set (make-local-variable 'comment-start) ";")
+  (set (make-local-variable 'comment-start-skip)
+       "\\(\\(^\\|[^\\\\\n]\\)\\(\\\\\\\\\\)*\\);+ *")
+  )
+
+(defun lmc-asm-labels (string)
+  (save-excursion
+    ;; We don't want to count the label being completed as a completion
+    ;; candidate, so let's keep track of the original position of point and
+    ;; skip any label nearby.
+    (let ((point (point)))
+      (goto-char (point-min))
+      (let ((ls ())
+            (re (concat "\\(^\\|(" lmc-asm-mnemonic-names-re "[ \t]+" "\\)"
+                        (regexp-quote string) "\\(?:\\sw\\|\\s_\\)"
+                        (if (> (length string) 0) "*" "+"))))
+        (while (re-search-forward re nil t)
+          (when (or (< point (match-end 1))
+                    (> (match-beginning 1) point))
+            (push (buffer-substring-no-properties
+                   (match-end 1) (match-end 0)) ls)))
+        ls))))
+
+(defun lmc-asm-completion ()
+  (save-excursion
+    (let ((ppss (syntax-ppss)))
+      (cond
+       ((nth 8 ppss) nil)               ;Inside string or comment.
+       ((zerop (nth 0 ppss))
+        (skip-syntax-backward "w_")
+        (when (save-excursion (skip-chars-backward " \t") (bolp))
+          (list (point)
+                (save-excursion (skip-syntax-forward "w_") (point))
+                (completion-table-dynamic #'lmc-asm-labels))))
+       ((= 1 (nth 0 ppss))              ;Inside paren.
+        (skip-syntax-backward "w_")
+        (list (point)
+              (save-excursion (skip-syntax-forward "w_") (point))
+              (if (eq (char-before) ?\()
+                  lmc-asm-mnemonic-names
+                (completion-table-dynamic #'lmc-asm-labels))))))))
+
+(defun lmc-asm-indentation ()
+  (save-excursion
+    (back-to-indentation)
+    (cond
+     ((> (nth 0 (syntax-ppss)) 0) nil)
+     ((looking-at "(") tab-width)
+     ((not (looking-at comment-start-skip)) 0)
+     ((not (looking-at "\\s<\\s<")) nil)
+     ((save-excursion (forward-comment (- (point))) (bobp)) 0)
+     (t (forward-comment (point-max)) (lmc-asm-indentation)))))
+
+(defun lmc-asm-indent-line (&optional arg)
+  (save-excursion
+    (back-to-indentation)
+    (when (and (zerop (nth 0 (syntax-ppss)))
+               (looking-at (concat lmc-asm-mnemonic-names-re "\\_>")))
+      ;; Apparently the user forgot to parenthesize the instruction.
+      (insert "(")
+      (if (assq (read (current-buffer)) lmc-mnemonic-0-table)
+          (insert ")")
+        (let ((eol (line-end-position)))
+          (ignore-errors
+            (read (current-buffer))
+            (when (<= (point) eol)
+              (insert ")")))))))
+  (let ((indent (lmc-asm-indentation)))
+    (cond
+     ((null indent) (lisp-indent-line arg))
+     (t
+      (let ((left-margin indent)) (indent-to-left-margin))
+      (when (zerop indent)
+        ;; Indent code (if any) after a label.
+        (save-excursion
+          (beginning-of-line)
+          (when (looking-at "\\(?:\\sw\\|\\s_\\)+\\([ \t]*\\)(")
+            (goto-char (match-beginning 1))
+            (if (< (current-column) tab-width)
+                (unless (save-excursion
+                          (goto-char (match-end 1))
+                          (= (current-column) tab-width))
+                  (delete-region (match-beginning 1) (match-end 1))
+                  (indent-to tab-width))
+              (unless (equal (match-string 1) " ")
+                (delete-region (match-beginning 1) (match-end 1))
+                (insert " "))))))))))
+
+(defun lmc-asm-read ()
+  (let ((prog ())
+        (initialpos (point)))
+    (goto-char (point-min))
+    (while (progn (forward-comment (point-max))
+                  (not (eobp)))
+      (let ((start (point)))
+        (condition-case nil
+            (push (cons (point) (read (current-buffer))) prog)
+          (end-of-file (goto-char start) (signal 'end-of-file nil)))))
+    (goto-char initialpos)
+    (nreverse prog)))
+
+(defun lmc-asm-load ()
+  "Load current buffer into the LMC simulator."
+  (interactive)
+  (let ((initialpos (point))
+        (window (if (eq (current-buffer) (window-buffer)) (selected-window))))
+    (save-current-buffer
+      (lmc-load (lmc--assemble (lmc-asm-read))))
+    (goto-char initialpos)
+    (if (and window (eq (current-buffer) (window-buffer window)))
+        (set-window-point window (point)))))
+
+(defun lmc-asm-assemble ()
+  "Assemble current buffer to check syntax."
+  (interactive)
+  (let ((initialpos (point)))
+    (lmc--assemble (lmc-asm-read))
+    (goto-char initialpos)
+    (message "No errors found")))
+
+(defun lmc-load-file (file)
+  "Load FILE into the LMC simulator."
+  (interactive
+   (list (read-file-name "Load LMC file: " nil nil t nil
+                         (lambda (file)
+                           (or (file-directory-p file)
+                               (string-match-p "\\.elmc\\'" file))))))
+  (let ((exists (find-buffer-visiting file))
+        (buf (find-file-noselect file)))
+    (unwind-protect
+        (with-current-buffer buf
+          (condition-case err
+              (lmc-asm-load)
+            (error (error "Error at line %d: %s" (line-number-at-pos)
+                          (error-message-string err)))))
+      (unless exists (kill-buffer buf)))))
+
+(provide 'lmc)
+;;; lmc.el ends here
diff --git a/packages/load-dir/load-dir.el b/packages/load-dir/load-dir.el
new file mode 100644 (file)
index 0000000..71b7dff
--- /dev/null
@@ -0,0 +1,137 @@
+;;; load-dir.el --- Load all Emacs Lisp files in a given directory
+
+;; Copyright (C) 2011 Free Software Foundation, Inc
+
+;; Authors: Teodor Zlatanov <tzz@lifelogs.com>,
+;;          Ben Key <bkey76@gmail.com>
+;; With-Help-From: Evans Winner <ego111@gmail.com>, PJ Weisberg <pj@irregularexpressions.net>
+;; Version: 0.0.3
+;; Keywords: lisp, files, convenience
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This package provides a way to load all Emacs Lisp snippets (they
+;; don't have to be libraries) in a directory on startup or when Emacs is
+;; already running.  It won't reload snippets unless the user requests
+;; it, so for instance adding a lambda to a hook is usually safe.
+;;
+;; You can specify ~/.emacs.d/load.d, a single directory, or a list of
+;; directories.  The file search can be recursive.  See the
+;; customizable variable `load-dirs' for details.
+;;
+;; The intent of ~/.emacs.d/load.d is to give package installers like
+;; el-get.el (see https://github.com/dimitri/el-get) and other tools a
+;; way to easily bootstrap themselves without necessarily modifying
+;; your .emacs or custom files directly.
+
+;;; Code:
+
+(eval-when-compile (require 'cl))
+
+(defgroup load-dir nil
+  "Automatically load all Emacs Lisp files in given directories."
+  :group 'initialization)
+
+(defcustom load-dir-debug t
+  "Debugging messages toggle, default to t."
+  :group 'load-dir
+  :type 'boolean)
+
+(defcustom load-dir-recursive nil
+  "Whether subdirectories should be loaded too."
+  :group 'load-dir
+  :type 'boolean)
+
+(defcustom load-dir-ignore-errors nil
+  "Whether errors in the loaded files should be ignored."
+  :group 'load-dir
+  :type 'boolean)
+
+(defcustom load-dirs nil
+  "This variable allows you to define which directories should be loaded.
+
+If nil, no directories are loaded.  This is the default behavior.
+If t, only files in ~/.emacs.d/load.d will be loaded.
+If a single directory name, only files in that directory will be loaded.
+If a list of directory names, all files found in all the
+directories will be loaded."
+  :group 'load-dir
+  :tag "What directories to load"
+  :type '(choice (const :tag "Load all from ~/.emacs.d/load.d" t)
+                 (const :tag "Don't load anything" nil)
+                 directory
+                 (repeat :tag "Directories" directory)))
+
+;;;###autoload
+(defun load-dirs ()
+  "Load all Emacs Lisp files in `load-dirs'.
+Will not load a file twice (use `load-dir-reload' for that).
+Recurses into subdirectories if `load-dir-recursive' is t."
+  (interactive)
+  ;; avoid the case where users inadvertently set `load-dirs' to a string
+  (mapc 'load-dir-one (cond
+                       ((eq load-dirs t)
+                        (list (expand-file-name "~/.emacs.d/load.d")))
+                       ((stringp load-dirs)
+                        (list load-dirs))
+                       (t load-dirs))))
+
+(defvar load-dir-loaded nil
+  "List of already loaded files.")
+
+;;;###autoload
+(defun load-dirs-reload ()
+  "Load all Emacs Lisp files in `load-dirs'.
+Clears the list of loaded files and just calls `load-dir-load'."
+  (interactive)
+  (setq load-dir-loaded nil)
+  (load-dirs))
+
+(defun load-dir-one (dir)
+  "Load all Emacs Lisp files in DIR.
+Recurses into subdirectories if `load-dir-recursive' is t."
+  (load-dir-debug "Loading Emacs Lisp code from %s" dir)
+  (let ((suffixes (get-load-suffixes)))
+    (dolist (f (and (file-exists-p dir)
+                    (file-directory-p dir)
+                    (directory-files dir t)))
+      (when (and (not (file-directory-p f))
+                 (member (file-name-extension f t) suffixes))
+        (setq f (file-name-sans-extension f))
+        (if (member f load-dir-loaded)
+            (load-dir-debug "Skipping %s, it's already loaded." f)
+          (if load-dir-ignore-errors
+              (with-demoted-errors (load f))
+            (load f))
+          (add-to-list 'load-dir-loaded f))))
+
+    (when load-dir-recursive
+      (dolist (f (directory-files dir t directory-files-no-dot-files-regexp))
+        (when (file-directory-p f)
+          (load-dir-one f))))))
+
+(defun load-dir-debug (&rest args)
+  "Print a debug message like `message' if `load-dir-debug' is set."
+  (when load-dir-debug
+    (apply 'message args)))
+
+;;;###autoload
+(add-hook 'after-init-hook 'load-dirs)
+
+(provide 'load-dir)
+;;; load-dir.el ends here
diff --git a/packages/markchars/markchars.el b/packages/markchars/markchars.el
new file mode 100644 (file)
index 0000000..cfaa6f7
--- /dev/null
@@ -0,0 +1,202 @@
+;;; markchars.el --- Mark chars fitting certain characteristics
+;;
+;; Author: Lennart Borgman (lennart O borgman A gmail O com)
+;; Contributhor: Ted Zlatanov <tzz@lifelogs.com>
+;; Created: 2010-03-22 Mon
+;; Version: 0.2.0
+;; Last-Updated: 2011-04-15
+;; URL:
+;; Keywords:
+;; Compatibility:
+;;
+;; Features that can be used by this library:
+;;
+;;   `idn'.
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;;; Commentary:
+;;
+;; Mark special chars, by default nonascii, non-IDN chars, in modes
+;; where they may be confused with regular chars. See `markchars-mode'
+;; and `markchars-what'.  There are two modes: confusable detection
+;; (where we look for mixed scripts within a word, without using the
+;; http://www.unicode.org/reports/tr39/ confusable tables) and pattern
+;; detection (where any regular expressions can be matched).
+;;
+;; The marked text will have the 'markchars property set to either
+;; 'confusable or 'pattern and the face set to either
+;; `markchars-face-confusable' or `markchars-face-pattern'
+;; respectively.
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;;; Change log:
+;;
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; 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, 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; see the file COPYING.  If not, write to
+;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth
+;; Floor, Boston, MA 02110-1301, USA.
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;;; Code:
+
+(require 'idn nil t)
+
+;;;###autoload
+(defgroup markchars nil
+  "Customization group for `markchars-mode'."
+  :group 'convenience)
+
+(defface markchars-light
+  '((t (:underline "light blue")))
+  "Light face for `markchars-mode' char marking."
+  :group 'markchars)
+
+(defface markchars-heavy
+  '((t (:underline "magenta")))
+  "Heavy face for `markchars-mode' char marking."
+  :group 'markchars)
+
+(defface markchars-white
+  '((t (:underline "white")))
+  "White face for `markchars-mode' char marking."
+  :group 'markchars)
+
+(defcustom markchars-face-pattern 'markchars-heavy
+  "Pointer to face used for marking matched patterns."
+  :type 'face
+  :group 'markchars)
+
+(defcustom markchars-face-confusable 'markchars-light
+  "Pointer to face used for marking confusables."
+  :type 'face
+  :group 'markchars)
+
+(defcustom markchars-face-nonidn 'markchars-white
+  "Pointer to face used for marking non-IDN characters."
+  :type 'face
+  :group 'markchars)
+
+(defcustom markchars-simple-pattern "[[:nonascii:]]+"
+  "Regexp for characters to mark, a simple pattern.
+
+By default it matches nonascii-chars."
+  :type 'regexp
+  :group 'markchars)
+
+(defcustom markchars-what
+  `(markchars-simple-pattern
+    markchars-confusables
+    ,@(when (fboundp 'idn-is-recommended) '(markchars-nonidn-fun)))
+  "Things to mark, a list of regular expressions or symbols."
+  :type `(repeat (choice :tag "Marking choices"
+                         (const
+                          :tag "Non IDN chars (Unicode.org tr39 suggestions)"
+                          markchars-nonidn-fun)
+                         (const :tag "Confusables" markchars-confusables)
+                         (const :tag "`markchars-simple-pattern'"
+                                markchars-simple-pattern)
+                         (regexp :tag "Arbitrary pattern")))
+  :group 'markchars)
+
+(make-obsolete-variable 'markchars-keywords 'markchars-what "markchars.el 0.2")
+
+(defvar markchars-used-keywords nil
+  "Keywords for font lock.")
+(put 'markchars-used-keywords 'permanent-local t)
+
+(defun markchars-set-keywords ()
+  "Set `markchars-used-keywords' from options."
+  (set (make-local-variable 'markchars-used-keywords)
+       (delq nil (mapcar (lambda (what)
+                           (when (eq what 'markchars-simple-pattern)
+                             (setq what markchars-simple-pattern))
+                           (cond
+                            ((eq what 'markchars-nonidn-fun)
+                             (list
+                              "\\<\\w+\\>"
+                              (list 0 '(markchars--render-nonidn
+                                        (match-beginning 0)
+                                        (match-end 0)))))
+                            ((eq what 'confusables)
+                             (list
+                              "\\<\\w+\\>"
+                              (list 0 '(markchars--render-confusables
+                                        (match-beginning 0)
+                                        (match-end 0)))))
+                            ((stringp what)
+                             (list
+                              what
+                              (list 0 '(markchars--render-pattern
+                                        (match-beginning 0)
+                                        (match-end 0)))))))
+                         markchars-what))))
+
+(defun markchars--render-pattern (beg end)
+  "Assign markchars pattern properties between BEG and END."
+  (put-text-property beg end 'face markchars-face-pattern)
+  (put-text-property beg end 'markchars 'pattern))
+
+(defun markchars--render-confusables (beg end)
+  "Assign markchars confusable properties between BEG and END."
+  (let* ((text (buffer-substring-no-properties beg end))
+         (scripts (mapcar
+                  '(lambda (c) (aref char-script-table c))
+                  (string-to-list text)))
+         ;; `scripts-extra' is not nil is there was more than one script
+         (scripts-extra (delq (car scripts) scripts)))
+    (when scripts-extra
+      (put-text-property beg end 'markchars 'confusable)
+      (put-text-property beg end 'face markchars-face-confusable))))
+
+(defun markchars--render-nonidn (beg end)
+  "Assign markchars confusable properties between BEG and END."
+  (save-excursion
+    (goto-char beg)
+    (while (<= (point) end)
+      (let ((c (char-after)))
+        (when (and (> c 256)
+                   (not (idn-is-recommended c)))
+          (put-text-property (point) (1+ (point)) 'markchars 'nonidn)
+          (put-text-property (point) (1+ (point)) 'face markchars-face-nonidn)))
+      (forward-char))))
+
+;;;###autoload
+(define-minor-mode markchars-mode
+  "Mark special characters.
+Which characters to mark are defined by `markchars-pattern'.
+
+The default is to mark nonascii chars with a magenta underline."
+  :group 'markchars
+  :lighter " Mchar"
+  (if markchars-mode
+      (progn
+        (markchars-set-keywords)
+        (let ((props (make-local-variable 'font-lock-extra-managed-props)))
+          (add-to-list props 'markchars))
+        (font-lock-add-keywords nil markchars-used-keywords))
+    (font-lock-remove-keywords nil markchars-used-keywords))
+  (font-lock-fontify-buffer))
+
+;;;###autoload
+(define-globalized-minor-mode markchars-global-mode markchars-mode
+  (lambda () (markchars-mode 1))
+  :group 'markchars)
+
+(provide 'markchars)
+;;; markchars.el ends here
diff --git a/packages/memory-usage/memory-usage.el b/packages/memory-usage/memory-usage.el
new file mode 100644 (file)
index 0000000..dd7571e
--- /dev/null
@@ -0,0 +1,179 @@
+;;; memory-usage.el --- Analyze the memory usage of Emacs in various ways
+
+;; Copyright (C) 2002, 2004, 2012  Free Software Foundation, Inc.
+
+;; Author: Stefan Monnier <monnier@cs.yale.edu>
+;; Keywords: maint
+;; Version: 0.2
+
+;; This file 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 2, or (at your option)
+;; any later version.
+
+;; This file 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; see the file COPYING.  If not, write to
+;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;; This package provides the command `memory-usage', which lists all
+;; buffers and how much memory they use.
+
+;;; Code:
+
+(defvar memory-usage-word-size (ceiling (/ (log most-positive-fixnum 2) 8))
+  "Size of a Lisp word box in bytes.")
+
+(defun memory-usage-buffer-size-bytes (b)
+  "Return total number of bytes in the buffer contents."
+  (with-current-buffer b
+    (save-restriction
+      (widen)
+      (- (position-bytes (point-max)) (position-bytes (point-min))))))
+
+(defun memory-usage-buffer-gap-bytes (b)
+  "Return total number of bytes in the buffer gap."
+  (with-current-buffer b
+    (gap-size)))
+
+(defun memory-usage-buffer-total-bytes (b)
+  "Return total number of ralloc bytes used by buffer."
+  (with-current-buffer b
+    (save-restriction
+      (widen)
+      (+ (position-bytes (point-max))
+        (- (position-bytes (point-min)))
+        (gap-size)))))
+
+(defun memory-usage-mult-cons (n c)
+  (setq n (* n memory-usage-word-size))
+  (cons (* n (car c)) (* n (cdr c))))
+
+(defun memory-usage-format (bytes)
+  (setq bytes (/ bytes 1024.0))
+  (let ((units '(;; "B"
+                 "kB" "MB" "GB" "TB")))
+    (while (>= bytes 1024)
+      (setq bytes (/ bytes 1024.0))
+      (setq units (cdr units)))
+    (cond
+     ;; ((integerp bytes) (format "%4d%s" bytes (car units)))
+     ((>= bytes 100) (format "%4.0f%s" bytes (car units)))
+     ((>= bytes 10) (format "%4.1f%s" bytes (car units)))
+     (t (format "%4.2f%s" bytes (car units))))))
+
+;;;###autoload
+(defun memory-usage ()
+  "List all buffers and their memory usage."
+  (interactive)
+  (pop-to-buffer (get-buffer-create "*Buffer Details*"))
+  (erase-buffer)
+  (let* ((bufs (buffer-list))
+        (num (length bufs))
+        (gc-stats (garbage-collect))
+         (gc-stats (if (numberp (caar gc-stats))
+                       (mapcar (lambda (x)
+                                 `(,(car x)
+                                   ,(max (* memory-usage-word-size (cadr x))
+                                         1)
+                                   ,@(let ((stat (nth (cddr x) gc-stats)))
+                                       (if (consp stat)
+                                           (list (car stat) (cdr stat))
+                                         (list stat)))))
+                               '((cons 2 . 0)
+                                 (symbol 6 . 1)
+                                 (marker 5 . 2)
+                                 (string 4 . 7)
+                                 (string-byte 0 . 3)
+                                 (vector-slot 1 . 4)
+                                 (float 2 . 5)
+                                 (interval 7 . 6)))
+                     gc-stats)))
+    (insert (format "Garbage collection stats:\n%s\n\n =>" gc-stats))
+    (let ((live 0)
+          (dead 0))
+      (dolist (x gc-stats)
+        (let* ((size (nth 1 x))
+               (xlive (* size (nth 2 x)))
+               (xdead (if (nth 3 x) (* size (nth 3 x)))))
+          (insert (if xdead
+                      (format "\t%s (+ %s dead) in %s\n"
+                              (memory-usage-format xlive)
+                              (memory-usage-format xdead)
+                              (car x))
+                    (format "\t%s in %s\n"
+                            (memory-usage-format xlive)
+                            (car x))))
+          (setq live (+ live xlive))
+          (if xdead (setq dead (+ dead xdead)))))
+
+      (insert (format "\nTotal in lisp objects: %s (live %s, dead %s)\n\n"
+                      (memory-usage-format (+ dead live))
+                      (memory-usage-format live)
+                      (memory-usage-format dead))))
+
+    (insert
+     (format "Buffer ralloc memory usage:\n%d buffers\n%s total (%s in gaps)\n"
+             num
+             (memory-usage-format
+              (apply #'+ (mapcar #'memory-usage-buffer-total-bytes bufs)))
+             (memory-usage-format
+              (apply #'+ (mapcar #'memory-usage-buffer-gap-bytes bufs)))))
+    (insert (format "%10s\t%s\t%s\n\n" "Size" "Gap" "Name"))
+    (insert (mapconcat
+            (lambda (b)
+              (format "%10d\t%s\t%s"
+                      (memory-usage-buffer-size-bytes b)
+                      (memory-usage-buffer-gap-bytes b)
+                      (buffer-name b)))
+            (sort bufs (lambda (b1 b2)
+                         (> (memory-usage-buffer-size-bytes b1)
+                             (memory-usage-buffer-size-bytes b2))))
+            "\n"))
+    (insert "\n"))
+  (goto-char (point-min)))
+
+(defun memory-usage-find-large-variables ()
+  "Find variables whose printed representation takes over 100KB."
+  (interactive)
+  (let ((min-size (* 100 1024)))
+    (pop-to-buffer "*Memory Explorer*")
+    (delete-region (point-min) (point-max))
+    ;; First find large global variables.
+    (mapatoms
+     (lambda (sym)
+       (let ((size (or (and (boundp sym)
+                            (length (prin1-to-string (symbol-value sym))))
+                       0)))
+         (when (> size min-size)
+           (insert (format "%d\tGlobal\t%s\n"
+                           size
+                           (symbol-name sym)))))))
+    ;; Second find large buffer-local variables.
+    (mapc
+     (lambda (buffer)
+       (let ((holder ""))
+         (with-current-buffer buffer
+           (mapc
+            (lambda (var-cons)
+              (let ((size (or (and (consp var-cons)
+                                   (length (prin1-to-string (cdr var-cons))))
+                              0)))
+                (if (> size min-size)
+                    (setq holder (format "%d\t%s\t%s\n"
+                                         size (buffer-name buffer)
+                                         (symbol-name (car var-cons)))))))
+            (buffer-local-variables)))
+         (insert holder)))
+     (buffer-list))
+    (sort-numeric-fields 1 (point-min) (point-max))))
+
+(provide 'memory-usage)
+;;; memory-usage.el ends here
diff --git a/packages/minimap/minimap.el b/packages/minimap/minimap.el
new file mode 100644 (file)
index 0000000..7c519c0
--- /dev/null
@@ -0,0 +1,627 @@
+;;; minimap.el --- Sidebar showing a "mini-map" of a buffer
+
+;; Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+;; Author: David Engster <dengste@eml.cc>
+;; Keywords:
+;; Version: 1.0
+
+;; This file is part of GNU Emacs.
+
+;; 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 2
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This file is an implementation of a minimap sidebar, i.e., a
+;; smaller display of the current buffer on the left side.  It
+;; highlights the currently shown region and updates its position
+;; automatically.  You can navigate in the minibar by dragging the
+;; active region with the mouse, which will scroll the corresponding
+;; edit buffer.
+
+;; To create the minimap sidebar, type M-x minimap-create.
+;; To dismiss it, type M-x minimap-kill.
+
+;; Usage:
+;;  * Use 'M-x minimap-create' in a buffer you're currently editing.
+;;  * Use 'M-x minimap-kill' to kill the minimap.
+;;  * Use 'M-x customize-group RET minimap RET' to adapt minimap to your needs.
+
+;;; KNOWN BUGS:
+
+;; * Currently cannot deal with images.
+;; * Display/movement can be a bit erratic at times.
+
+;;; TODO:
+
+;; * Fix known bugs.
+;; * Make sidebar permanently visible. This requires something like a
+;;   'window group' feature in Emacs, which is currently being worked on.
+;; * Moving the active region with the keyboard / mouse-wheel ?
+
+
+;;; Customizable variables:
+
+(defgroup minimap nil
+  "A minimap sidebar for Emacs."
+  :group 'convenience)
+
+(defface minimap-font-face
+  '((default :family "DejaVu Sans Mono" :height 30))
+  "Face used for text in minimap buffer, notably the font family and height.
+This height should be really small.  You probably want to use a
+TrueType font for this.  After changing this, you should
+recreate the minimap to avoid problems with recentering."
+  :group 'minimap)
+
+(defface minimap-active-region-background
+  '((((background dark)) (:background "#4517305D0000"))
+    (t (:background "#C847D8FEFFFF")))
+  "Face for the active region in the minimap.
+By default, this is only a different background color."
+  :group 'minimap)
+
+(defface minimap-semantic-function-face
+  '((((background dark))
+     (:box (:line-width 1 :color "white")
+          :inherit (font-lock-function-name-face minimap-font-face)
+          :height 2.5 :background "gray10"))
+    (t (:box (:line-width 1 :color "black")
+            :inherit (font-lock-function-name-face minimap-font-face)
+            :height 2.5 :background "gray90")))
+  "Face used for functions in the semantic overlay.")
+
+(defface minimap-semantic-variable-face
+  '((((background dark))
+     (:box (:line-width 1 :color "white")
+          :inherit (font-lock-variable-name-face minimap-font-face)
+           :height 2.5 :background "gray10"))
+    (t (:box (:line-width 1 :color "black")
+            :inherit (font-lock-function-name-face minimap-font-face)
+            :height 2.5 :background "gray90")))
+  "Face used for variables in the semantic overlay.")
+
+(defface minimap-semantic-type-face
+  '((((background dark))
+     (:box (:line-width 1 :color "white")
+          :inherit (font-lock-type-face minimap-font-face)
+          :height 2.5 :background "gray10"))
+    (t (:box (:line-width 1 :color "black")
+            :inherit (font-lock-function-name-face minimap-font-face)
+            :height 2.5 :background "gray90")))
+  "Face used for types in the semantic overlay.")
+
+(defcustom minimap-width-fraction 0.2
+  "Fraction of width which should be used for minimap sidebar."
+  :type 'number
+  :group 'minimap)
+
+(defcustom minimap-window-location 'left
+  "Location of the minimap window.
+Can be either the symbol `left' or `right'."
+  :type '(choice (const :tag "Left" left)
+                (const :tag "Right" right))
+  :group 'minimap)
+
+(defcustom minimap-buffer-name-prefix "*MINIMAP* "
+  "Prefix for buffer names of minimap sidebar."
+  :type 'string
+  :group 'minimap)
+
+(defcustom minimap-update-delay 0.2
+  "Delay in seconds after which sidebar gets updated.
+Setting this to 0 will let the minimap react immediately, but
+this will slow down scrolling."
+  :type 'number
+  :set (lambda (sym value)
+        (set sym value)
+        (when (and (boundp 'minimap-timer-object)
+                   minimap-timer-object)
+          (cancel-timer minimap-timer-object)
+          (setq minimap-timer-object
+                (run-with-idle-timer
+                 minimap-update-delay t 'minimap-update))))
+  :group 'minimap)
+
+(defcustom minimap-always-recenter nil
+  "Whether minimap sidebar should be recentered after every point movement."
+  :type 'boolean
+  :group 'minimap)
+
+(defcustom minimap-recenter-type 'relative
+  "Specifies the type of recentering the minimap should use.
+The minimap can use different types of recentering, i.e., how the
+minimap should behave when you scroll in the main window or when
+you drag the active region with the mouse.  The following
+explanations will probably not help much, so simply try them and
+choose the one which suits you best.
+
+`relative' -- The position of the active region in the minimap
+corresponds with the relative position of this region in the
+buffer.  This the default.
+
+`middle' -- The active region will stay fixed in the middle of
+the minimap.
+
+`free' -- The position will be more or less free.  When dragging
+the active region, the minimap will scroll when you reach the
+bottom or top."
+  :type '(choice (const :tag "Relative" relative)
+                (const :tag "Middle" middle)
+                (const :tag "Free" free))
+  :group 'minimap)
+
+(defcustom minimap-hide-scroll-bar t
+  "Whether the minimap should hide the vertical scrollbar."
+  :type 'boolean
+  :group 'minimap)
+
+(defcustom minimap-hide-fringes t
+  "Whether the minimap should hide the fringes."
+  :type 'boolean
+  :group 'minimap)
+
+(defcustom minimap-dedicated-window nil
+  "Whether the minimap should create a dedicated window."
+  :type 'boolean
+  :group 'minimap)
+
+(defcustom minimap-display-semantic-overlays t
+  "Display overlays from CEDET's semantic analyzer.
+If you use CEDET and the buffer's major-mode is supported, the
+minimap can display overlays generated by the semantic analyzer.
+By default, it will apply the faces `minimap-semantic-<X>-face',
+with <X> being \"function\", \"variable\" and \"type\".  Also, it
+will display the name of the tag in the middle of the overlay in
+the corresponding font-lock face.
+
+See also `minimap-enlarge-certain-faces', which can be used as
+fallback."
+  :type 'boolean
+  :group 'minimap)
+
+(defcustom minimap-enlarge-certain-faces 'as-fallback
+  "Whether certain faces should be enlarged in the minimap.
+All faces listed in `minimap-normal-height-faces' will be
+displayed using the default font height, allowing you to still
+read text using those faces.  By default, this should enlarge all
+function names in the minimap, given you have font locking
+enabled.  This variable can have the following values:
+
+'as-fallback (the default) -- The feature will only be activated
+  if information from CEDET's semantic analyzer isn't available
+  (see: `minimap-display-semantic-overlays').
+'always -- Always active.
+nil -- Inactive."
+  :type '(choice (const :tag "Fallback if CEDET unavailable." 'as-fallback)
+                (const :tag "Always active." 'always)
+                (const :tag "Inactive." nil))
+  :group 'minimap)
+
+(defcustom minimap-normal-height-faces '(font-lock-function-name-face)
+  "List of faces which should be displayed with normal height.
+When `minimap-enlarge-certain-faces' is non-nil, all faces in
+this list will be displayed using the default font height.  By
+default, this list contains `font-lock-function-name-face', so
+you can still read function names in the minimap."
+  :type '(repeat face)
+  :group 'minimap)
+
+(defcustom minimap-sync-overlay-properties '(face invisible)
+  "Specifies which overlay properties should be synced.
+Unlike text properties, overlays are not applied automatically to
+the minimap and must be explicitly synced.  This variable
+specifies which overlay properties should be synced by
+`minimap-sync-overlays'.  Most importantly, this variable should
+include 'invisible', so that hidden text does not appear in the
+minimap buffer."
+  :type '(repeat symbol)
+  :group 'minimap)
+
+;;; Internal variables
+
+(defvar minimap-start nil)
+(defvar minimap-end nil)
+(defvar minimap-active-overlay nil)
+(defvar minimap-bufname nil)
+(defvar minimap-timer-object nil)
+(defvar minimap-active-minimaps 0)
+(defvar minimap-base-overlay nil)
+(defvar minimap-numlines nil)
+(defvar minimap-pointmin-overlay nil)
+
+(make-variable-buffer-local 'minimap-start)
+(make-variable-buffer-local 'minimap-end)
+(make-variable-buffer-local 'minimap-active-overlay)
+(make-variable-buffer-local 'minimap-bufname)
+(make-variable-buffer-local 'minimap-base-overlay)
+(make-variable-buffer-local 'minimap-numlines)
+(make-variable-buffer-local 'minimap-pointmin-overlay)
+
+;;; Minimap creation / killing
+
+;;;###autoload
+(defun minimap-create ()
+  "Create a minimap sidebar for the current window."
+  (interactive)
+  ;; If minimap is visible, do nothing.
+  (unless (and minimap-bufname
+              (get-buffer minimap-bufname)
+              (get-buffer-window (get-buffer minimap-bufname)))
+    (let ((bufname (concat minimap-buffer-name-prefix
+                          (buffer-name (current-buffer))))
+         (new-win (if (eq minimap-window-location 'left)
+                      (split-window-horizontally
+                       (round (* (window-width)
+                                 minimap-width-fraction)))
+                    (split-window-horizontally
+                     (round (* (window-width)
+                               (- 1 minimap-width-fraction))))
+                    (other-window 1))))
+      ;; If minimap exists but isn't visible, reuse it.
+      (if (and minimap-bufname
+              (get-buffer minimap-bufname))
+         (switch-to-buffer minimap-bufname t)
+       ;; Otherwise create new minimap
+       (minimap-new-minimap bufname)
+       ;; If this is the first minimap, create the idle timer.
+       (when (zerop minimap-active-minimaps)
+         (setq minimap-timer-object
+               (run-with-idle-timer minimap-update-delay t 'minimap-update)))
+       (setq minimap-active-minimaps
+             (1+ minimap-active-minimaps))))
+    (other-window 1)
+    (minimap-sync-overlays)))
+
+(defun minimap-new-minimap (bufname)
+  "Create new minimap BUFNAME for current buffer and window."
+  (let ((indbuf (make-indirect-buffer (current-buffer) bufname t))
+       (edges (window-pixel-edges)))
+    (setq minimap-bufname bufname)
+    (set-buffer indbuf)
+    (when minimap-hide-scroll-bar
+      (setq vertical-scroll-bar nil))
+    (switch-to-buffer indbuf)
+    (setq minimap-base-overlay (make-overlay (point-min) (point-max) nil t t))
+    (overlay-put minimap-base-overlay 'face 'minimap-font-face)
+    (overlay-put minimap-base-overlay 'priority 1)
+    (setq minimap-pointmin-overlay (make-overlay (point-min) (1+ (point-min))))
+    (setq minimap-start (window-start)
+         minimap-end (window-end)
+         minimap-active-overlay (make-overlay minimap-start minimap-end)
+         line-spacing 0)
+    (overlay-put minimap-active-overlay 'face
+                'minimap-active-region-background)
+    (overlay-put minimap-active-overlay 'priority 5)
+    (minimap-mode 1)
+    (when (and (boundp 'linum-mode)
+              linum-mode)
+      (linum-mode 0))
+    (when minimap-hide-fringes
+      (set-window-fringes nil 0 0))
+    (when minimap-dedicated-window
+      (set-window-dedicated-p nil t))
+    (setq buffer-read-only t)
+    ;; Calculate the actual number of lines displayable with the minimap face.
+    (setq minimap-numlines
+         (floor
+          (/
+           (- (nth 3 edges) (nth 1 edges))
+           (car (progn (redisplay) (window-line-height))))))))
+
+;;;###autoload
+(defun minimap-kill ()
+  "Kill minimap for current buffer.
+Cancel the idle timer if no more minimaps are active."
+  (interactive)
+  (if (null minimap-bufname)
+      (message "No minimap associated with %s." (buffer-name (current-buffer)))
+    (let ((curname (buffer-name (current-buffer)))
+         (buf (get-buffer minimap-bufname))
+         (win (get-buffer-window minimap-bufname)))
+      (setq minimap-bufname nil)
+      (if (null buf)
+         (message "No minimap associated with %s." curname)
+       (when win
+         (delete-window win))
+       (kill-buffer buf)
+       (when (zerop
+              (setq minimap-active-minimaps
+                    (1- minimap-active-minimaps)))
+         (cancel-timer minimap-timer-object)
+         (setq minimap-timer-object nil))
+       (message "Minimap for %s killed." curname)))))
+
+;;; Minimap update
+
+(defun minimap-update (&optional force)
+  "Update minimap sidebar if necessary.
+This is meant to be called from the idle-timer or the post command hook.
+When FORCE, enforce update of the active region."
+  (when minimap-bufname
+    (let ((win (get-buffer-window minimap-bufname))
+         start end pt ov)
+      (when win
+       (setq start (window-start)
+             end (window-end)
+             pt (point)
+             ov)
+       (with-selected-window win
+         (unless (and (not force)
+                      (= minimap-start start)
+                      (= minimap-end end))
+           (move-overlay minimap-active-overlay start end)
+           (setq minimap-start start
+                 minimap-end end)
+           (minimap-recenter (line-number-at-pos (/ (+ end start) 2))
+                             (/ (- (line-number-at-pos end)
+                                   (line-number-at-pos start))
+                                2)))
+         (goto-char pt)
+         (when minimap-always-recenter
+           (recenter (round (/ (window-height) 2)))))))))
+
+;;; Overlay movement
+
+(defun minimap-move-overlay-mouse (start-event)
+  "Move overlay by tracking mouse movement."
+  (interactive "e")
+  (mouse-set-point start-event)
+  (when (get-buffer-window (buffer-base-buffer (current-buffer)))
+    (let* ((echo-keystrokes 0)
+          (end-posn (event-end start-event))
+          (start-point (posn-point end-posn))
+          (make-cursor-line-fully-visible nil)
+          (cursor-type nil)
+          (pcselmode (when (boundp 'pc-selection-mode)
+                       pc-selection-mode))
+           pt ev)
+      (when (and pcselmode (fboundp 'pc-selection-mode))
+       (pc-selection-mode -1))
+      (move-overlay minimap-active-overlay start-point minimap-end)
+      (track-mouse
+       (minimap-set-overlay start-point)
+       (while (and
+               (consp (setq ev (read-event)))
+               (eq (car ev) 'mouse-movement))
+         (setq pt (posn-point (event-start ev)))
+         (when (numberp pt)
+           (minimap-set-overlay pt))))
+      (select-window (get-buffer-window (buffer-base-buffer)))
+      (minimap-update)
+      (when (and pcselmode (fboundp 'pc-selection-mode))
+       (pc-selection-mode 1)))))
+
+(defun minimap-set-overlay (pt)
+  "Set overlay position, with PT being the middle."
+  (goto-char pt)
+  (let* ((ovstartline (line-number-at-pos minimap-start))
+        (ovendline (line-number-at-pos minimap-end))
+        (ovheight (round (/ (- ovendline ovstartline) 2)))
+        (line (line-number-at-pos))
+        (winstart (window-start))
+        (winend (window-end))
+        newstart newend)
+    (setq pt (point-at-bol))
+    (setq newstart (minimap-line-to-pos (- line ovheight)))
+    ;; Perform recentering
+    (minimap-recenter line ovheight)
+    ;; Set new position in main buffer and redisplay
+    (with-selected-window (get-buffer-window (buffer-base-buffer))
+      (goto-char pt)
+      (set-window-start nil newstart)
+      (redisplay t)
+      (setq newend (window-end)))
+    (when (eq minimap-recenter-type 'free)
+      (while (> newend winend)
+       (scroll-up 5)
+       (redisplay t)
+       (setq winend (window-end))))
+    (move-overlay minimap-active-overlay newstart newend)))
+
+(defun minimap-line-to-pos (line)
+  "Return point position of line number LINE."
+  (save-excursion
+    (goto-char 1)
+    (if (eq selective-display t)
+       (re-search-forward "[\n\C-m]" nil 'end (1- line))
+      (forward-line (1- line)))
+    (point)))
+
+(defun minimap-recenter (middle height)
+  "Recenter the minimap according to `minimap-recenter-type'.
+MIDDLE is the line number in the middle of the active region.
+HEIGHT is the number of lines from MIDDLE to begin/end of the
+active region."
+  (cond
+   ;; Relative recentering
+   ((eq minimap-recenter-type 'relative)
+    (let* ((maxlines (line-number-at-pos (point-max)))
+          percentage relpos newline start numlines)
+      (setq numlines (count-lines (window-start) (window-end)))
+      (setq percentage (/ (float middle) (float maxlines)))
+      (setq newline (ceiling (* percentage numlines)))
+      (setq start (minimap-line-to-pos
+                  (- middle height
+                     (floor (* percentage
+                               (- numlines height height))))))
+      (or (> start (point-min))
+         (setq start (point-min)))
+      ;; If (point-max) already visible, don't go further
+      (if (and (> start (window-start))
+              (with-selected-window (get-buffer-window (buffer-base-buffer))
+                (= (point-max) (window-end))))
+         (save-excursion
+           (goto-char (point-max))
+           (recenter -1))
+       (unless (and (> start (window-start))
+                    (= (point-max) (window-end)))
+         (set-window-start nil start)))))
+   ;; Middle recentering
+    ((eq minimap-recenter-type 'middle)
+     (let ((start (- middle height
+                    (floor (* 0.5
+                              (- minimap-numlines height height))))))
+       (if (< start 1)
+          (progn
+            ;; Hack: Emacs cannot scroll down any further, so we fake
+            ;; it using an overlay.  Otherwise, the active region
+            ;; would move to the top.
+            (overlay-put minimap-pointmin-overlay
+                         'display (concat
+                                   (make-string (abs start) 10)
+                                   (buffer-substring (point-min) (1+ (point-min)))))
+            (overlay-put minimap-pointmin-overlay
+                         'face `(:background ,(face-background 'default)))
+            (overlay-put minimap-pointmin-overlay
+                         'priority 10)
+            (setq start 1))
+        (overlay-put minimap-pointmin-overlay 'display "")
+        (overlay-put minimap-pointmin-overlay 'face nil))
+       (set-window-start nil (minimap-line-to-pos start))))
+    ;; Free recentering
+    ((eq minimap-recenter-type 'free)
+     (let ((newstart (minimap-line-to-pos (- middle height)))
+          (winstart (window-start)))
+       (while (< newstart winstart)
+        (scroll-down 5)
+        (redisplay t)
+        (setq winstart (window-start)))))))
+
+;;; Minimap minor mode
+
+(defvar minimap-mode-map (make-sparse-keymap)
+  "Keymap used by `minimap-mode'.")
+
+(define-key minimap-mode-map [down-mouse-1] 'minimap-move-overlay-mouse)
+(define-key minimap-mode-map [down-mouse-2] 'minimap-move-overlay-mouse)
+(define-key minimap-mode-map [down-mouse-3] 'minimap-move-overlay-mouse)
+
+(define-minor-mode minimap-mode
+  "Minor mode for minimap sidebar."
+  nil "minimap" minimap-mode-map)
+
+;;; Sync minimap with modes which create/delete overlays.
+
+(defun minimap-sync-overlays ()
+  "Synchronize overlays between base and minimap buffer.
+Apply semantic overlays or face enlargement if necessary."
+  (interactive)
+  (when minimap-bufname
+    (let ((baseov (overlays-in (point-min) (point-max)))
+         (semantic (and (boundp 'semantic-version)
+                        (semantic-active-p)))
+         ov props p)
+      (with-current-buffer minimap-bufname
+       (remove-overlays)
+       (while baseov
+         (when (setq props (minimap-get-sync-properties (car baseov)))
+           (setq ov (make-overlay (overlay-start (car baseov))
+                                  (overlay-end (car baseov))))
+           (while (setq p (car props))
+             (overlay-put ov (car p) (cadr p))
+             (setq props (cdr props))))
+         (setq baseov (cdr baseov)))
+       (move-overlay minimap-pointmin-overlay (point-min) (1+ (point-min)))
+       ;; Re-apply font overlay
+       (move-overlay minimap-base-overlay (point-min) (point-max)))
+      ;; Face enlargement
+      (when (and font-lock-mode
+                (or (eq minimap-enlarge-certain-faces 'always)
+                    (and (eq minimap-enlarge-certain-faces 'as-fallback)
+                         (or (not minimap-display-semantic-overlays)
+                             (not semantic)))))
+       (when (eq font-lock-support-mode 'jit-lock-mode)
+         (jit-lock-fontify-now))
+       (with-current-buffer minimap-bufname
+         (minimap-enlarge-faces)))
+      ;; Semantic overlays
+      (when (and semantic
+                minimap-display-semantic-overlays)
+         (minimap-apply-semantic-overlays)))
+    (minimap-update t)))
+
+(defun minimap-get-sync-properties (ov)
+  "Get properties from overlay OV which should be synced.
+You can specify those properties with
+`minimap-sync-overlay-properties'."
+  (delq nil
+       (mapcar
+        (lambda (p)
+          (let ((val (overlay-get ov p)))
+            (if val
+                (list p val)
+              nil)))
+        minimap-sync-overlay-properties)))
+
+(defun minimap-enlarge-faces ()
+  "Apply default font to all faces in `minimap-normal-height-faces'.
+This has to be called in the minimap buffer."
+  (let ((pos (next-single-property-change (point-min) 'face))
+       next ov face)
+    (while pos
+      (setq face (get-text-property pos 'face))
+      (when (delq nil (mapcar (lambda (x) (equal x face))
+                             minimap-normal-height-faces))
+       (setq ov
+             (make-overlay pos
+                           (setq pos (next-single-property-change pos 'face))))
+       (overlay-put ov 'face `(:family ,(face-font 'default)))
+       (overlay-put ov 'priority 5))
+      (setq pos (next-single-property-change pos 'face)))))
+
+(defun minimap-apply-semantic-overlays ()
+  "Apply semantic overlays to the minimap.
+This has to be called from the base buffer."
+    (let ((tags (semantic-fetch-tags))
+         tag class ov ovnew)
+      (while tags
+       (setq tag (car tags))
+       (setq class (semantic-tag-class tag))
+       (setq ov (semantic-tag-overlay tag))
+       (when (and (overlayp ov)
+                  (or (eq class 'function)
+                      (eq class 'type)
+                      (eq class 'variable)))
+         (with-current-buffer minimap-bufname
+           (let ((start (overlay-start ov))
+                 (end (overlay-end ov))
+                 (name (semantic-tag-name tag)))
+             (overlay-put
+              (setq ovnew (make-overlay start end))
+              'face `(:background ,(face-background
+                                    (intern (format "minimap-semantic-%s-face"
+                                                    (symbol-name class))))))
+             (overlay-put ovnew 'priority 1)
+             (setq start
+                   (minimap-line-to-pos (/ (+ (line-number-at-pos start)
+                                              (line-number-at-pos end)) 2)))
+             (setq end (progn (goto-char start) (point-at-eol)))
+             (setq ovnew (make-overlay start end))
+             (overlay-put ovnew 'face (format "minimap-semantic-%s-face"
+                                              (symbol-name class)))
+             (overlay-put ovnew 'display (concat "  " name "  "))
+             (overlay-put ovnew 'priority 6))))
+       (setq tags (cdr tags)))))
+
+;; outline-(minor-)mode
+(add-hook 'outline-view-change-hook 'minimap-sync-overlays)
+
+;; hideshow
+(add-hook 'hs-hide-hook 'minimap-sync-overlays)
+(add-hook 'hs-show-hook 'minimap-sync-overlays)
+
+(provide 'minimap)
+
+;;; minimap.el ends here
diff --git a/packages/muse/README b/packages/muse/README
new file mode 100644 (file)
index 0000000..5f6e20e
--- /dev/null
@@ -0,0 +1,7 @@
+Muse is a tool for easily authoring and publishing documents.  It
+allows for rapid prototyping of hyperlinked text, which may then be
+exported to multiple output formats, such as HTML, LaTeX, and Texinfo.
+
+The markup rules used by Muse are intended to be very friendly to
+people familiar with Emacs.  See the included manual for more
+information.
diff --git a/packages/muse/cgi.el b/packages/muse/cgi.el
new file mode 100644 (file)
index 0000000..936b33f
--- /dev/null
@@ -0,0 +1,217 @@
+;;; cgi.el -- Using Emacs for CGI scripting
+
+;; Copyright (C) 2000, 2006, 2012 Free Software Foundation, Inc.
+
+;; Author: Eric Marsden  <emarsden@laas.fr>
+;;         Michael Olson <mwolson@gnu.org> (slight modifications)
+;; Keywords: CGI web scripting slow
+;; Version: 0.3
+;; Time-stamp: <2001-08-24 emarsden>
+
+;;     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, write to the Free
+;;     Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+;;     MA 02111-1307, USA.
+
+;;; Commentary:
+
+;; People who like this sort of thing will find this the sort of
+;; thing they like.                           -- Abraham Lincoln
+;;
+;;
+;; Overview ==========================================================
+;;
+;; A simple library for the Common Gateway Interface for Emacs,
+;; allowing you to service requests for non static web pages in elisp.
+;; Provides routines for decoding arguments to GET- and POST-type CGI
+;; requests.
+;;
+;; Usage: place a shell script such as the following in your web
+;; server's CGI directory (typically called something like
+;; /var/www/cgi-bin/):
+;;
+;; ,-------------------------------------------------------------------
+;; | #!/bin/sh
+;; |
+;; | emacs -batch -l cgi.el -f cgi-calendar
+;; `-------------------------------------------------------------------
+;;
+;; (`cgi-calendar' is a sample elisp CGI script provided at the end of
+;; this file).
+;;
+;; Alternatively, if you're running version 2.x of the linux kernel
+;; you could make .elc files directly executable via the binfmt_misc
+;; mechanism and run them straight from the cgi-bin directory.
+;;
+;; Efficiency would be improved by having Emacs bind to the http
+;; service port and spawn a thread per connection.  Extending Emacs to
+;; support server sockets and multithreading is left as an exercise
+;; for the reader.
+;;
+;; References:
+;;   * rfc1738 "Uniform Resource Locators"
+;;   * rfc1630 "Universal Resource Identifiers in WWW"
+;;
+;; Thanks to Christoph Conrad <christoph.conrad@gmx.de> for pointing
+;; out a bug in the URI-decoding.
+
+;;; Code:
+
+(eval-when-compile
+  (require 'cl)
+  (require 'calendar))
+
+(defconst cgi-url-unreserved-chars '(
+    ?a ?b ?c ?d ?e ?f ?g ?h ?i ?j ?k ?l ?m
+    ?n ?o ?p ?q ?r ?s ?t ?u ?v ?w ?x ?y ?z
+    ?A ?B ?C ?D ?E ?F ?G ?H ?I ?J ?K ?L ?M
+    ?N ?O ?P ?Q ?R ?S ?T ?U ?V ?W ?X ?Y ?Z
+    ?0 ?1 ?2 ?3 ?4 ?5 ?6 ?7 ?8 ?9
+    ?\$ ?\- ?\_ ?\. ?\! ?\~ ?\* ?\' ?\( ?\) ?\,))
+
+(defun cgi-int-char (i)
+  (if (fboundp 'int-char) (int-char i) i))
+
+(defun cgi-hex-char-p (ch)
+  (declare (character ch))
+  (let ((hexchars '(?0 ?1 ?2 ?3 ?4 ?5 ?6 ?7 ?8 ?9
+                   ?A ?B ?C ?D ?E ?F)))
+    (member (upcase ch) hexchars)))
+
+;; decode %xx to the corresponding character and + to ' '
+(defun cgi-decode-string (str)
+  (do ((i 0)
+       (len (length str))
+       (decoded '()))
+      ((>= i len) (concat (nreverse decoded)))
+    (let ((ch (aref str i)))
+      (cond ((eq ?+ ch)
+            (push ?\  decoded)
+            (incf i))
+           ((and (eq ?% ch)
+                 (< (+ i 2) len)
+                 (cgi-hex-char-p (aref str (+ i 1)))
+                 (cgi-hex-char-p (aref str (+ i 2))))
+            (let ((hex (string-to-number (substring str (+ i 1) (+ i 3)) 16)))
+              (push (cgi-int-char hex) decoded)
+              (incf i 3)))
+           (t (push ch decoded)
+              (incf i))))))
+
+(defun cgi-position (item seq &optional start end)
+  (or start (setq start 0))
+  (or end (setq end (length seq)))
+  (while (and (< start end)
+             (not (equal item (aref seq start))))
+    (setq start (1+ start)))
+  (and (< start end) start))
+
+;; Parse "foo=x&bar=y+re" into (("foo" . "x") ("bar" . "y re"))
+;; Substrings are plus-decoded and then URI-decoded.
+(defun cgi-decode (q)
+  (when q
+    (flet ((split-= (str)
+           (let ((pos (or (cgi-position ?= str) 0)))
+             (cons (cgi-decode-string (substring str 0 pos))
+                   (cgi-decode-string (substring str (+ pos 1)))))))
+      (mapcar #'split-= (split-string q "&")))))
+
+(defun cgi-lose (fmt &rest args)
+  (let ((why (apply #'format fmt args)))
+    (message "Script error: %s" why)    ; to error_log
+    (princ "Content-type: text/html\n\n") ; to browser
+    (princ "<html><head><title>Script error</title></head>\r\n")
+    (princ "<body><h1>Script error</h1>\r\n<p>\r\n")
+    (princ why)
+    (princ "\r\n</body></html>\r\n")
+    (kill-emacs 0)))
+
+(defmacro cgi-evaluate (&rest forms)
+  `(condition-case why
+       (princ (with-output-to-string ,@forms))
+     (error (cgi-lose "Emacs Lisp error: %s" why))))
+
+(defun cgi-arguments ()
+  (let ((method (getenv "REQUEST_METHOD"))
+       req buf)
+    (cond ((null method)
+          (cgi-lose "No request method specified"))
+         ((string= "GET" method)
+          (unless (getenv "QUERY_STRING")
+            (cgi-lose "No query string for GET request"))
+          (cgi-decode (getenv "QUERY_STRING")))
+         ((string= "POST" method)
+          (setq req (getenv "CONTENT_LENGTH"))
+          (unless req
+            (cgi-lose "No content-length for POST request"))
+          (setq buf (get-buffer-create " *cgi*"))
+          (set-buffer buf)
+          (erase-buffer)
+          (loop for i from 1 to (string-to-number req)
+                do (insert (read-event)))
+          (cgi-decode (buffer-string)))
+         (t
+          (cgi-lose "Can't handle request method %s" method)))))
+
+;; ====================================================================
+;; a sample application: calendar via the web. If invoked without
+;; arguments, presents a calendar for the three months around the
+;; current date. You can request a calendar for a specific period by
+;; specifying the year and the month in the query string:
+;;
+;;   ~$ lynx -dump 'http://localhost/cgi-bin/cal?year=1975&month=6'
+;;
+;; When run in batch mode, text normally displayed in the echo area
+;; (via `princ' for example) goes to stdout, and thus to the browser.
+;; Text output using `message' goes to stderr, and thus normally to
+;; your web server's error_log.
+;; ====================================================================
+
+(eval-and-compile
+  (if (fboundp 'calendar-extract-month)
+      (defalias 'cgi-calendar-extract-month 'calendar-extract-month)
+    (defalias 'cgi-calendar-extract-month 'extract-calendar-month))
+
+  (if (fboundp 'calendar-extract-year)
+      (defalias 'cgi-calendar-extract-year 'calendar-extract-year)
+    (defalias 'cgi-calendar-extract-year 'extract-calendar-year))
+
+  (if (fboundp 'calendar-generate)
+      (defalias 'cgi-calendar-generate 'calendar-generate)
+    (defalias 'cgi-calendar-generate 'generate-calendar)))
+
+(defun cgi-calendar-string ()
+  (require 'calendar)
+  (let* ((args (cgi-arguments))
+        (now (calendar-current-date))
+        (mnth (cdr (assoc "month" args)))
+        (month (if mnth (string-to-number mnth)
+                 (cgi-calendar-extract-month now)))
+        (yr (cdr (assoc "year" args)))
+        (year (if yr (string-to-number yr)
+                (cgi-calendar-extract-year now))))
+    (with-temp-buffer
+      (cgi-calendar-generate month year)
+      (buffer-string))))
+
+(defun cgi-calendar ()
+  (cgi-evaluate
+   (princ "Content-type: text/html\n\n")
+   (princ "<html><head><title>Emacs calendar</title></head>\r\n")
+   (princ "<body> <h1>Emacs calendar</h1>\r\n")
+   (princ "<pre>\r\n")
+   (princ (cgi-calendar-string))
+   (princ "\r\n</pre></body></html>\r\n")))
+
+(provide 'cgi)
+;;; cgi.el ends here
diff --git a/packages/muse/dir b/packages/muse/dir
new file mode 100644 (file)
index 0000000..22af354
--- /dev/null
@@ -0,0 +1,18 @@
+This is the file .../info/dir, which contains the
+topmost node of the Info hierarchy, called (dir)Top.
+The first time you invoke Info you start off looking at this node.
+\1f
+File: dir,     Node: Top       This is the top of the INFO tree
+
+  This (the Directory node) gives a menu of major topics.
+  Typing "q" exits, "?" lists all Info commands, "d" returns here,
+  "h" gives a primer for first-timers,
+  "mEmacs<Return>" visits the Emacs manual, etc.
+
+  In Emacs, you can click mouse button 2 on a menu item or cross reference
+  to select it.
+
+* Menu:
+
+Emacs
+* Muse: (muse).                 Authoring and publishing environment for Emacs.
diff --git a/packages/muse/htmlize-hack.el b/packages/muse/htmlize-hack.el
new file mode 100644 (file)
index 0000000..e623946
--- /dev/null
@@ -0,0 +1,20 @@
+;; This file provides a fix for htmlize.el and Emacs 23.
+;; To use it, add the path to this directory to your load path and
+;; add (require 'htmlize-hack) to your Emacs init file.
+
+(eval-when-compile (require 'cl))
+(if t (require 'htmlize))               ; Don't load during compilation.
+
+(when (equal htmlize-version "1.34")
+  (defun htmlize-face-size (face)
+    ;; The size (height) of FACE, taking inheritance into account.
+    ;; Only works in Emacs 21 and later.
+    (let ((size-list
+           (loop
+            for f = face then (face-attribute f :inherit)
+            until (or (null f) (eq f 'unspecified))
+            for h = (face-attribute f :height)
+            collect (if (eq h 'unspecified) nil h))))
+      (reduce 'htmlize-merge-size (cons nil size-list)))))
+
+(provide 'htmlize-hack)
diff --git a/packages/muse/httpd.el b/packages/muse/httpd.el
new file mode 100644 (file)
index 0000000..1fb64a4
--- /dev/null
@@ -0,0 +1,288 @@
+;;; httpd.el -- A web server in Emacs Lisp
+
+;; Copyright (C) 2001, 2003, 2006, 2012 Free Software Foundation, Inc.
+
+;; Author: Eric Marsden <emarsden@laas.fr>
+;;         John Wiegley <johnw@gnu.org>
+;;         Michael Olson <mwolson@gnu.org> (slight modifications)
+;; Version: 1.1
+;; Keywords: games
+
+;;     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, write to the Free
+;;     Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+;;     MA 02111-1307, USA.
+;;
+;; The latest version of this package should be available from
+;;
+;;     <URL:http://purl.org/net/emarsden/home/downloads/>
+
+;;; Commentary:
+
+;; httpd.el is an HTTP server embedded in the Emacs.  It can handle GET
+;; and HEAD requests; adding support for POST should not be too
+;; difficult.  By default, httpd.el will listen on server side Emacs
+;; sockets for HTTP requests.
+;;
+;; I have only tested this code with Emacs; it may need modifications
+;; to work with XEmacs.
+;;
+;; This version has been modified to work with GNU Emacs 21 and 22.
+;;
+;;; Acknowledgements:
+;;
+;; httpd.el was inspired by pshttpd, an HTTP server written in
+;; Postscript by Anders Karlsson <URL:http://www.pugo.org:8080/>.
+;;
+;; Thanks to John Wiegley and Cyprian Adam Laskowski.
+
+;;; Code:
+
+(defvar httpd-document-root "/var/www")
+
+(defvar httpd-path-handlers '()
+  "Alist of (path-regexp . handler) forms.
+If a GET request is made for an URL whose path component matches
+a PATH-REGEXP, the corresponding handler is called to generate
+content.")
+
+(defvar httpd-mime-types-alist
+  '(("html" . "text/html; charset=iso-8859-1")
+    ("txt"  . "text/plain; charset=iso-8859-1")
+    ("jpg"  . "image/jpeg")
+    ("jpeg" . "image/jpeg")
+    ("gif"  . "image/gif")
+    ("png"  . "image/png")
+    ("tif"  . "image/tiff")
+    ("tiff" . "image/tiff")
+    ("css"  . "text/css")
+    ("gz"   . "application/octet-stream")
+    ("ps"   . "application/postscript")
+    ("pdf"  . "application/pdf")
+    ("eps"  . "application/postscript")
+    ("tar"  . "application/x-tar")
+    ("rpm"  . "application/x-rpm")
+    ("zip"  . "application/zip")
+    ("mp3"  . "audio/mpeg")
+    ("mp2"  . "audio/mpeg")
+    ("mid"  . "audio/midi")
+    ("midi" . "audio/midi")
+    ("wav"  . "audio/x-wav")
+    ("au"   . "audio/basic")
+    ("ram"  . "audio/pn-realaudio")
+    ("ra"   . "audio/x-realaudio")
+    ("mpg"  . "video/mpeg")
+    ("mpeg" . "video/mpeg")
+    ("qt"   . "video/quicktime")
+    ("mov"  . "video/quicktime")
+    ("avi"  . "video/x-msvideo")))
+
+(defun httpd-mime-type (filename)
+  (or (cdr (assoc (file-name-extension filename) httpd-mime-types-alist))
+      "text/plain"))
+
+(put 'httpd-exception 'error-conditions '(httpd-exception error))
+
+(defun defhttpd-exception (name code msg)
+  (put name 'error-conditions (list name 'httpd-exception 'error))
+  (put name 'httpd-code code)
+  (put name 'httpd-msg msg))
+
+(defhttpd-exception 'httpd-moved/perm       301 "Moved permanently")
+(defhttpd-exception 'httpd-moved/temp       302 "Moved temporarily")
+(defhttpd-exception 'httpd-bad-request      400 "Bad request")
+(defhttpd-exception 'httpd-forbidden        403 "Forbidden")
+(defhttpd-exception 'httpd-file-not-found   404 "Not found")
+(defhttpd-exception 'httpd-method-forbidden 405 "Method not allowed")
+(defhttpd-exception 'httpd-unimplemented    500 "Internal server error")
+(defhttpd-exception 'httpd-unimplemented    501 "Not implemented")
+(defhttpd-exception 'httpd-unimplemented    503 "Service unavailable")
+
+(defvar httpd-endl "\r\n")
+
+(defvar httpd-process nil)
+(defvar httpd-bytes-sent nil)          ; only used with `httpd-process'
+(defvar httpd-log-accesses t)
+
+(defun httpd-add-handler (path-regexp handler)
+  (push (cons path-regexp handler) httpd-path-handlers))
+
+(defun httpd-try-internal-handler (path &optional cont)
+  (catch 'result
+    (dolist (elem httpd-path-handlers)
+      (let ((regexp (car elem))
+           (handler (cdr elem)))
+       (if (string-match regexp path)
+           (throw 'result (funcall handler path cont)))))))
+
+(defun httpd-date-stamp ()
+  (format-time-string "[%d/%b/%Y %H:%M:%S %z]"))
+
+(defun httpd-log (&rest strings)
+  (if httpd-log-accesses
+      (save-excursion
+       (goto-char (point-max))
+       (with-current-buffer (get-buffer-create "*httpd access_log*")
+         (mapc 'insert strings)))))
+
+(defun httpd-send-data (&rest strings)
+  (dolist (s strings)
+    (send-string httpd-process s)
+    (if httpd-bytes-sent
+       (setq httpd-bytes-sent (+ httpd-bytes-sent (length s))))))
+
+(defun httpd-send (code msg &rest strings)
+  (httpd-log (number-to-string code) " ")
+  (apply 'httpd-send-data
+        "HTTP/1.0 " (number-to-string code) " " msg httpd-endl
+        strings))
+
+(defun httpd-send-eof ()
+  (httpd-log (number-to-string httpd-bytes-sent) "\n")
+  (process-send-eof httpd-process))
+
+(defun httpd-send-file (filename)
+  (with-temp-buffer
+    (insert-file-contents filename)
+    (httpd-send-data (buffer-string))))
+
+(defun httpd-lose (code msg)
+  (httpd-send code msg
+             "Content-Type: text/html" httpd-endl
+             "Connection: close" httpd-endl
+             httpd-endl
+             "<html><head><title>Error</title></head>" httpd-endl
+             "<body><h1>" msg "</h1>" httpd-endl
+             "<p>" msg httpd-endl
+             "</body></html>" httpd-endl)
+  (httpd-send-eof))
+
+(defun httpd-handle-redirect (req where)
+  "Redirect the client to new location WHERE."
+  (httpd-send 301 "Moved permanently"
+             "Location: " where httpd-endl
+             "URI: " where httpd-endl
+             "Connection: close" httpd-endl
+             httpd-endl)
+  (httpd-send-eof))
+
+(defun httpd-handle-GET+HEAD (path &optional want-data req)
+  (if (zerop (length path))
+      (setq path "index.html"))
+
+  ;; could use `expand-file-name' here instead of `concat', but we
+  ;; don't want tilde expansion, etc.
+  (let ((filename (concat httpd-document-root "/" path))
+       modified-since)
+    (cond ((httpd-try-internal-handler path) t)
+         ((file-directory-p filename)
+          (httpd-handle-redirect path (concat "http://" (system-name) "/"
+                                              path "/")))
+         ((file-readable-p filename)
+          (let ((attrs (file-attributes filename)))
+            (if (and (string-match "^If-Modified-Since:\\s-+\\(.+\\)" req)
+                     (setq modified-since
+                           (apply 'encode-time
+                                  (parse-time-string (match-string 1 req))))
+                     (time-less-p (nth 5 attrs) modified-since))
+                  (httpd-send 304 "Not modified"
+                              "Server: Emacs/httpd.el" httpd-endl
+                              "Connection: close" httpd-endl
+                              httpd-endl)
+              (httpd-send 200 "OK"
+                          "Server: Emacs/httpd.el" httpd-endl
+                          "Connection: close" httpd-endl
+                          "MIME-Version: 1.0" httpd-endl
+                          "Content-Type: "
+                          (httpd-mime-type filename) httpd-endl
+                          "Content-Length: "
+                          (number-to-string (nth 7 attrs)) httpd-endl
+                          httpd-endl)
+              (if want-data
+                  (httpd-send-file filename)))
+            (httpd-send-eof)))
+
+         (t (signal 'httpd-file-not-found path)))))
+
+(defun httpd-handle-request (req &optional cont)
+  (httpd-log (car (process-contact httpd-process)) " - - "
+            (httpd-date-stamp) " \"")
+  (if (not (string-match ".+" req))
+      (progn
+       (httpd-log "\"")
+       (error "HTTP request was empty"))
+    (let ((request (match-string 0 req)))
+      (httpd-log request "\" ")
+      (cond
+       ((string-match "\\.\\." request)
+       ;; reject requests containing ".." in the path. Should really
+       ;; URI-decode first.
+       (signal 'httpd-forbidden request))
+
+       ((string-match "\\`\\(GET\\|HEAD\\|POST\\)\\s-/\\(\\S-*\\)" request)
+       (let ((kind (match-string 1 request))
+             (arg  (match-string 2 request)))
+         (if (string= kind "POST")
+             (unless (httpd-try-internal-handler arg cont)
+               (signal 'httpd-unimplemented arg))
+           (httpd-handle-GET+HEAD arg (string= kind "GET") req))))
+
+       (t (signal 'httpd-bad-request request))))))
+
+(defun httpd-serve (proc string)
+  (let ((httpd-process proc)
+       (httpd-bytes-sent 0))
+    (condition-case why
+       (httpd-handle-request string)
+      (httpd-exception
+       (httpd-lose (get (car why) 'httpd-code)
+                  (get (car why) 'httpd-msg)))
+      ;; Comment out these two lines if you want to catch errors
+      ;; inside Emacs itself.
+      (error
+       (httpd-lose 500 (format "Emacs Lisp error: %s" why)))
+      )))
+
+(defun httpd-start (&optional port)
+  (interactive (list (read-string "Serve Web requests on port: " "8080")))
+  (if (null port)
+      (setq port 8080)
+    (if (stringp port)
+       (setq port (string-to-number port))))
+  (if httpd-process
+      (delete-process httpd-process))
+  (setq httpd-process
+       (if (fboundp 'make-network-process)
+           (make-network-process :name "httpd"
+                                 :buffer (generate-new-buffer "httpd")
+                                 :host 'local :service port
+                                 :server t :noquery t
+                                 :filter 'httpd-serve)
+         (and (fboundp 'open-network-stream-server)
+              (open-network-stream-server "httpd"
+                                          (generate-new-buffer "httpd")
+                                          port nil 'httpd-serve))))
+  (if (and (processp httpd-process)
+          (eq (process-status httpd-process) 'listen))
+      (message "httpd.el is listening on port %d" port)))
+
+(defun httpd-stop ()
+  (interactive)
+  (when httpd-process
+    (message "httpd.el server on port %d has stopped"
+            (cadr (process-contact httpd-process)))
+    (delete-process httpd-process)
+    (setq httpd-process nil)))
+
+(provide 'httpd)
+;;; httpd.el ends here
diff --git a/packages/muse/muse-backlink.el b/packages/muse/muse-backlink.el
new file mode 100644 (file)
index 0000000..bc21ddd
--- /dev/null
@@ -0,0 +1,327 @@
+;;; muse-backlink.el --- backlinks for Muse
+
+;; Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010
+;;   Free Software Foundation, Inc.
+
+;; Author: Jim Ottaway <j.ottaway@lse.ac.uk>
+;; Keywords:
+
+;; This file is part of Emacs Muse.  It is not part of GNU Emacs.
+
+;; Emacs Muse 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, or (at your
+;; option) any later version.
+
+;; Emacs Muse 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 Emacs Muse; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; Hierarchical backlink insertion into new muse pages.
+;;
+;; To add:
+;;
+;; (require 'muse-backlink)
+;; (muse-backlink-install)
+;;
+;; To control what gets backlinked, modify
+;; `muse-backlink-exclude-backlink-regexp' and
+;; `muse-backlink-exclude-backlink-parent-regexp'.
+;;
+;; To stop backlinking temporarily:
+;; (setq muse-backlink-create-backlinks nil)
+;;
+;; To remove the backlink functionality completely:
+;;
+;; (muse-backlink-remove)
+
+;;; Contributors:
+
+;;; Code:
+
+(require 'muse)
+(require 'muse-project)
+
+(eval-when-compile (require 'muse-mode))
+
+(eval-and-compile
+  (if (< emacs-major-version 22)
+      (progn
+        ;; Swiped from Emacs 22.0.50.4
+        (defvar muse-backlink-split-string-default-separators "[ \f\t\n\r\v]+"
+        "The default value of separators for `split-string'.
+
+A regexp matching strings of whitespace.  May be locale-dependent
+\(as yet unimplemented).  Should not match non-breaking spaces.
+
+Warning: binding this to a different value and using it as default is
+likely to have undesired semantics.")
+
+        (defun muse-backlink-split-string (string &optional separators omit-nulls)
+        "Split STRING into substrings bounded by matches for SEPARATORS.
+
+The beginning and end of STRING, and each match for SEPARATORS, are
+splitting points.  The substrings matching SEPARATORS are removed, and
+the substrings between the splitting points are collected as a list,
+which is returned.
+
+If SEPARATORS is non-nil, it should be a regular expression matching text
+which separates, but is not part of, the substrings.  If nil it defaults to
+`split-string-default-separators', normally \"[ \\f\\t\\n\\r\\v]+\", and
+OMIT-NULLS is forced to t.
+
+If OMIT-NULLS is t, zero-length substrings are omitted from the list \(so
+that for the default value of SEPARATORS leading and trailing whitespace
+are effectively trimmed).  If nil, all zero-length substrings are retained,
+which correctly parses CSV format, for example.
+
+Note that the effect of `(split-string STRING)' is the same as
+`(split-string STRING split-string-default-separators t)').  In the rare
+case that you wish to retain zero-length substrings when splitting on
+whitespace, use `(split-string STRING split-string-default-separators)'.
+
+Modifies the match data; use `save-match-data' if necessary."
+        (let ((keep-nulls (not (if separators omit-nulls t)))
+              (rexp (or separators muse-backlink-split-string-default-separators))
+              (start 0)
+              notfirst
+              (list nil))
+          (while (and (string-match rexp string
+                                    (if (and notfirst
+                                             (= start (match-beginning 0))
+                                             (< start (length string)))
+                                        (1+ start) start))
+                      (< start (length string)))
+            (setq notfirst t)
+            (if (or keep-nulls (< start (match-beginning 0)))
+                (setq list
+                      (cons (substring string start (match-beginning 0))
+                            list)))
+            (setq start (match-end 0)))
+          (if (or keep-nulls (< start (length string)))
+              (setq list
+                    (cons (substring string start)
+                          list)))
+          (nreverse list))))
+    (defalias 'muse-backlink-split-string 'split-string)))
+
+(defgroup muse-backlink nil
+  "Hierarchical backlinking for Muse."
+  :group 'muse)
+
+(defcustom muse-backlink-create-backlinks t
+  "When non-nil, create hierarchical backlinks in new Muse pages.
+For control over which pages will receive backlinks, see
+`muse-backlink-exclude-backlink-parent-regexp' and
+`muse-backlink-exclude-backlink-regexp'."
+  :type 'boolean
+  :group 'muse-backlink)
+
+(defcustom muse-backlink-avoid-bad-links t
+  "When non-nil, avoid bad links when backlinking."
+  :type 'boolean
+  :group 'muse-backlink)
+
+;; The default for exclusion stops backlinks from being added to and
+;; from planner day pages.
+(defcustom muse-backlink-exclude-backlink-parent-regexp
+  "^[0-9][0-9][0-9][0-9]\\.[0-9][0-9]\\.[0-9][0-9]$"
+  "Regular expression matching pages whose children should not have backlinks."
+  :type 'regexp
+  :group 'muse-backlink)
+
+(defcustom muse-backlink-exclude-backlink-regexp
+  "^[0-9][0-9][0-9][0-9]\\.[0-9][0-9]\\.[0-9][0-9]$"
+  "Regular expression matching pages that should not have backlinks."
+  :type 'regexp
+  :group 'muse-backlink)
+
+(defcustom muse-backlink-separator "/"
+  "String that separates backlinks.
+Should be something that will not appear as a substring in an explicit
+link that has no description."
+  :type 'string
+  :group 'muse-backlink)
+
+(defcustom muse-backlink-before-string "backlinks: "
+  "String to come before the backlink list."
+  :type 'string
+  :group 'muse-backlink)
+
+(defcustom muse-backlink-after-string ""
+  "String to come after the backlink list."
+  :type 'string
+  :group 'muse-backlink)
+
+(defcustom muse-backlink-separator "/"
+  "String that separates backlinks.
+Should be something that will not appear as a substring in an explicit
+link that has no description."
+  :type 'string
+  :group 'muse-backlink)
+
+(defcustom muse-backlink-regexp
+  (concat "^"
+          (regexp-quote muse-backlink-before-string)
+          "\\("
+          (regexp-quote muse-backlink-separator)
+          ".+\\)"
+          (regexp-quote muse-backlink-after-string))
+  ;; Really, I want something like this, but I can't make it work:
+  ;;   (concat "^\\("
+  ;;           (regexp-quote muse-backlink-separator)
+  ;;           "\\(?:"
+  ;;           muse-explicit-link-regexp
+  ;;           "\\)\\)+")
+  "Regular expression to match backlinks in a buffer.
+Match 1 is the list of backlinks without `muse-backlink-before-string'
+and `muse-backlink-after-string'."
+  :type 'regexp
+  :group 'muse-backlink)
+
+(defun muse-backlink-goto-insertion-point ()
+  "Find the right place to add backlinks."
+  (goto-char (point-min))
+  (when (looking-at "\\(?:^#.+[ \t]*\n\\)+")
+    (goto-char (match-end 0))))
+
+(defun muse-backlink-get-current ()
+  "Return a list of backlinks in the current buffer."
+  (save-excursion
+    (goto-char (point-min))
+    (when (re-search-forward muse-backlink-regexp nil t)
+      (muse-backlink-split-string
+       (match-string 1)
+       (regexp-quote muse-backlink-separator) t))))
+
+(defun muse-backlink-format-link-list (links)
+  "Format the list of LINKS as backlinks."
+  (concat muse-backlink-separator
+          (mapconcat #'identity links muse-backlink-separator)))
+
+(defun muse-backlink-insert-links (links)
+  "Insert backlinks to LINKS into the current page.
+LINKS is a list of links ordered by ancestry, with the parent as the
+last element."
+  (muse-backlink-goto-insertion-point)
+  (insert muse-backlink-before-string
+          (muse-backlink-format-link-list links)
+          muse-backlink-after-string
+          ;; Could have this in the after string, but they might get
+          ;; deleted.
+          "\n\n"))
+
+(defun muse-backlink-unsaved-page-p (page project)
+  "Return non-nil if PAGE is in PROJECT but has not been saved."
+  (member
+   page
+   (mapcar
+    #'(lambda (b)
+        (with-current-buffer b
+          (and (derived-mode-p 'muse-mode)
+               (equal muse-current-project project)
+               (not (muse-project-page-file
+                     (muse-page-name)
+                     muse-current-project))
+               (muse-page-name))))
+    (buffer-list))))
+
+(defvar muse-backlink-links nil
+  "Internal variable.
+The links to insert in the forthcomingly visited muse page.")
+
+(defvar muse-backlink-pending nil
+  "Internal variable.")
+
+(defvar muse-backlink-parent-buffer nil
+  "Internal variable.
+The parent buffer of the forthcomingly visited muse page.")
+
+
+;;; Attach hook to the derived mode hook, to avoid problems such as
+;;; planner-prepare-file thinking that the buffer needs no template.
+(defun muse-backlink-get-mode-hook ()
+  (derived-mode-hook-name major-mode))
+
+(defun muse-backlink-insert-hook-func ()
+  "Insert backlinks into the current buffer and clean up."
+  (when (and muse-backlink-links
+             muse-backlink-pending
+             (string= (car muse-backlink-links) (muse-page-name)))
+    (muse-backlink-insert-links (cdr muse-backlink-links))
+    (when muse-backlink-avoid-bad-links
+      (save-buffer)
+      (when muse-backlink-parent-buffer
+        (with-current-buffer muse-backlink-parent-buffer
+          (font-lock-fontify-buffer))))
+    (setq muse-backlink-links nil
+          muse-backlink-parent-buffer nil
+          muse-backlink-pending nil)
+    (remove-hook (muse-backlink-get-mode-hook) #'muse-backlink-insert-hook-func)))
+
+(defun muse-backlink-handle-link (link)
+  "When appropriate, arrange for backlinks on visiting LINK."
+  (when (and muse-backlink-create-backlinks
+             (not muse-backlink-pending)
+             (memq this-command
+                   '(muse-follow-name-at-point muse-follow-name-at-mouse))
+             (not muse-publishing-p)
+             (not (and (boundp 'muse-colors-fontifying-p)
+                       muse-colors-fontifying-p)))
+    (require 'muse-mode)
+    (setq
+     muse-backlink-links
+     (save-match-data
+       (let* ((orig-link (or link (match-string 1)))
+              (link (if (string-match "#" orig-link)
+                        (substring orig-link 0 (match-beginning 0))
+                      orig-link)))
+         (unless
+             (or (not muse-current-project)
+                 (string-match muse-url-regexp orig-link)
+                 (string-match muse-image-regexp orig-link)
+                 (and (boundp 'muse-wiki-interwiki-regexp)
+                      (string-match muse-wiki-interwiki-regexp
+                                    orig-link))
+                 ;; Don't add a backlink if the page already
+                 ;; exists, whether it has been saved or not.
+                 (or (muse-project-page-file link muse-current-project)
+                     (muse-backlink-unsaved-page-p link muse-current-project))
+                 (string-match muse-backlink-exclude-backlink-parent-regexp
+                               (muse-page-name))
+                 (string-match muse-backlink-exclude-backlink-regexp link))
+           ;; todo: Hmm. This will only work if the child page is the
+           ;; same mode as the parent page.
+           (add-hook (muse-backlink-get-mode-hook) #'muse-backlink-insert-hook-func)
+           (setq muse-backlink-pending t)
+           (when muse-backlink-avoid-bad-links
+             (setq muse-backlink-parent-buffer (current-buffer))
+             (unless (muse-project-page-file
+                      (muse-page-name) muse-current-project)
+               ;; It must be modified...
+               (save-buffer)))
+           (cons link
+                 (append (muse-backlink-get-current)
+                         (list (muse-make-link (muse-page-name))))))))))
+  ;; Make sure we always return nil
+  nil)
+
+(defun muse-backlink-install ()
+  "Add backlinking functionality to muse-mode."
+  (add-to-list 'muse-explicit-link-functions #'muse-backlink-handle-link))
+
+(defun muse-backlink-remove ()
+  "Remove backlinking functionality from muse-mode."
+  (setq muse-explicit-link-functions
+        (delq #'muse-backlink-handle-link muse-explicit-link-functions)))
+
+(provide 'muse-backlink)
+;;; muse-backlink.el ends here
diff --git a/packages/muse/muse-blosxom.el b/packages/muse/muse-blosxom.el
new file mode 100644 (file)
index 0000000..78038d7
--- /dev/null
@@ -0,0 +1,306 @@
+;;; muse-blosxom.el --- publish a document tree for serving by (py)Blosxom
+
+;; Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010
+;;   Free Software Foundation, Inc.
+
+;; Author: Michael Olson <mwolson@gnu.org>
+;; Date: Wed, 23 March 2005
+
+;; This file is part of Emacs Muse.  It is not part of GNU Emacs.
+
+;; Emacs Muse 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, or (at your
+;; option) any later version.
+
+;; Emacs Muse 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 Emacs Muse; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; The Blosxom publishing style publishes a tree of categorised files
+;; to a mirrored tree of stories to be served by blosxom.cgi or
+;; pyblosxom.cgi.
+;;
+;; Serving entries with (py)blosxom
+;; --------------------------------
+;;
+;; Each Blosxom file must include `#date yyyy-mm-dd', or optionally
+;; the longer `#date yyyy-mm-dd-hh-mm', a title (using the `#title'
+;; directive) plus whatever normal content is desired.
+;;
+;; The date directive is not used directly by (py)blosxom or this
+;; program.  You need to find two additional items to make use of this
+;; feature.
+;;
+;;  1. A script to gather date directives from the entire blog tree
+;;     into a single file.  The file must associate a blog entry with
+;;     a date.
+;;
+;;  2. A plugin for (py)blosxom that reads this file.
+;;
+;; These 2 things are provided for pyblosxom in the contrib/pyblosxom
+;; subdirectory.  `getstamps.py' provides the 1st service, while
+;; `hardcodedates.py' provides the second service.  Eventually it is
+;; hoped that a blosxom plugin and script will be found/written.
+;;
+;; Alternately, the pyblosxom metadate plugin may be used.  On the
+;; plus side, there is no need to run a script to gather the date.  On
+;; the downside, each entry is read twice rather than once when the
+;; page is rendered.  Set the value of muse-blosxom-use-metadate to
+;; non-nil to enable adding a #postdate directive to all published
+;; files.  You can do this by:
+;;
+;; M-x customize-variable RET muse-blosxom-use-metadate RET
+;;
+;; With the metadate plugin installed in pyblosxom, the date set in
+;; this directive will be used instead of the file's modification
+;; time.  The plugin is included with Muse at
+;; contrib/pyblosxom/metadate.py.
+;;
+;; Generating a Muse project entry
+;; -------------------------------
+;;
+;; Muse-blosxom has some helper functions to make specifying
+;; muse-blosxom projects a lot easier.  An example follows.
+;;
+;; (setq muse-project-alist
+;;       `(("blog"
+;;          (,@(muse-project-alist-dirs "~/path/to/blog-entries")
+;;           :default "index")
+;;          ,@(muse-project-alist-styles "~/path/to/blog-entries"
+;;                                       "~/public_html/blog"
+;;                                       "blosxom-xhtml")
+;;         )))
+;;
+;; Note that we need a backtick instead of a single quote on the
+;; second line of this example.
+;;
+;; Creating new blog entries
+;; -------------------------
+;;
+;; There is a function called `muse-blosxom-new-entry' that will
+;; automate the process of making a new blog entry.  To make use of
+;; it, do the following.
+;;
+;;  - Customize `muse-blosxom-base-directory' to the location that
+;;    your blog entries are stored.
+;;
+;;  - Assign the `muse-blosxom-new-entry' function to a key sequence.
+;;    I use the following code to assign this function to `C-c p l'.
+;;
+;;    (global-set-key "\C-cpl" 'muse-blosxom-new-entry)
+;;
+;;  - You should create your directory structure ahead of time under
+;;    your base directory.  These directories, which correspond with
+;;    category names, may be nested.
+;;
+;;  - When you enter this key sequence, you will be prompted for the
+;;    category of your entry and its title.  Upon entering this
+;;    information, a new file will be created that corresponds with
+;;    the title, but in lowercase letters and having special
+;;    characters converted to underscores.  The title and date
+;;    directives will be inserted automatically.
+;;
+;; Using tags
+;; ----------
+;;
+;; If you wish to keep all of your blog entries in one directory and
+;; use tags to classify your entries, set `muse-blosxom-use-tags' to
+;; non-nil.
+;;
+;; For this to work, you will need to be using the PyBlosxom plugin at
+;; http://pyblosxom.sourceforge.net/blog/registry/meta/Tags.
+
+;;; Contributors:
+
+;; Gary Vaughan (gary AT gnu DOT org) is the original author of
+;; `emacs-wiki-blosxom.el', which is the ancestor of this file.
+
+;; Brad Collins (brad AT chenla DOT org) ported this file to Muse.
+
+;; Björn Lindström (bkhl AT elektrubadur DOT se) made many valuable
+;; suggestions.
+
+;; Sasha Kovar (sasha AT arcocene DOT org) fixed
+;; muse-blosxom-new-entry when using tags and also implemented support
+;; for the #postdate directive.
+
+;;; Code:
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Muse Blosxom Publishing
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'muse-project)
+(require 'muse-publish)
+(require 'muse-html)
+
+(defgroup muse-blosxom nil
+  "Options controlling the behavior of Muse Blosxom publishing.
+See `muse-blosxom' for more information."
+  :group 'muse-publish)
+
+(defcustom muse-blosxom-extension ".txt"
+  "Default file extension for publishing Blosxom files."
+  :type 'string
+  :group 'muse-blosxom)
+
+(defcustom muse-blosxom-header
+  "<lisp>(concat (muse-publishing-directive \"title\") \"\\n\"
+  (when muse-blosxom-use-metadate
+    (let ((date (muse-publishing-directive \"date\")))
+      (when date (concat \"#postdate \"
+                         (muse-blosxom-format-date date) \"\\n\"))))
+  (when muse-blosxom-use-tags
+    (let ((tags (muse-publishing-directive \"tags\")))
+      (when tags (concat \"#tags \" tags \"\\n\")))))</lisp>"
+  "Header used for publishing Blosxom files.  This may be text or a filename."
+  :type 'string
+  :group 'muse-blosxom)
+
+(defcustom muse-blosxom-footer ""
+  "Footer used for publishing Blosxom files.  This may be text or a filename."
+  :type 'string
+  :group 'muse-blosxom)
+
+(defcustom muse-blosxom-base-directory "~/Blog"
+  "Base directory of blog entries.
+This is the top-level directory where your Muse blog entries may be found."
+  :type 'directory
+  :group 'muse-blosxom)
+
+(defcustom muse-blosxom-use-tags nil
+  "Determine whether or not to enable use of the #tags directive.
+
+If you wish to keep all of your blog entries in one directory and
+use tags to classify your entries, set `muse-blosxom-use-tags' to
+non-nil.
+
+For this to work, you will need to be using the PyBlosxom plugin
+at http://pyblosxom.sourceforge.net/blog/registry/meta/Tags."
+  :type 'boolean
+  :group 'muse-blosxom)
+
+(defcustom muse-blosxom-use-metadate nil
+  "Determine whether or not to use the #postdate directive.
+
+If non-nil, published entries include the original date (as specified
+in the muse #date line) which can be read by the metadate PyBlosxom
+plugin.
+
+For this to work, you will need to be using the PyBlosxom plugin
+at http://pyblosxom.sourceforge.net/blog/registry/date/metadate."
+  :type 'boolean
+  :group 'muse-blosxom)
+
+;; Maintain (published-file . date) alist, which will later be written
+;; to a timestamps file; not implemented yet.
+
+(defvar muse-blosxom-page-date-alist nil)
+
+(defun muse-blosxom-update-page-date-alist ()
+  "Add a date entry to `muse-blosxom-page-date-alist' for this page."
+  (when muse-publishing-current-file
+    ;; Make current file be relative to base directory
+    (let ((rel-file
+           (concat
+            (file-name-as-directory
+             (or (muse-publishing-directive "category")
+                 (file-relative-name
+                  (file-name-directory
+                   (expand-file-name muse-publishing-current-file))
+                  (file-truename muse-blosxom-base-directory))))
+            (file-name-nondirectory muse-publishing-current-file))))
+      ;; Strip the file extension
+      (when muse-ignored-extensions-regexp
+        (setq rel-file (save-match-data
+                         (and (string-match muse-ignored-extensions-regexp
+                                            rel-file)
+                              (replace-match "" t t rel-file)))))
+      ;; Add to page-date alist
+      (add-to-list
+       'muse-blosxom-page-date-alist
+       `(,rel-file . ,(muse-publishing-directive "date"))))))
+
+;; Enter a new blog entry
+
+(defun muse-blosxom-title-to-file (title)
+  "Derive a file name from the given TITLE.
+
+Feel free to overwrite this if you have a different concept of what
+should be allowed in a filename."
+  (muse-replace-regexp-in-string (concat "[^-." muse-regexp-alnum "]")
+                                 "_" (downcase title)))
+
+(defun muse-blosxom-format-date (date)
+  "Convert a date string to PyBlosxom metadate plugin format."
+  (apply #'format "%s-%s-%s %s:%s" (split-string date "-")))
+
+;;;###autoload
+(defun muse-blosxom-new-entry (category title)
+  "Start a new blog entry with given CATEGORY.
+The filename of the blog entry is derived from TITLE.
+The page will be initialized with the current date and TITLE."
+  (interactive
+   (list
+    (if muse-blosxom-use-tags
+        (let ((tag "foo")
+              (tags nil))
+          (while (progn (setq tag (read-string "Tag (RET to continue): "))
+                        (not (string= tag "")))
+            (add-to-list 'tags tag t))
+          tags)
+      (funcall muse-completing-read-function
+               "Category: "
+               (mapcar 'list (muse-project-recurse-directory
+                              muse-blosxom-base-directory))))
+    (read-string "Title: ")))
+  (let ((file (muse-blosxom-title-to-file title)))
+    (muse-project-find-file
+     file "blosxom" nil
+     (if muse-blosxom-use-tags
+         (directory-file-name muse-blosxom-base-directory)
+       (concat (directory-file-name muse-blosxom-base-directory)
+               "/" category))))
+  (goto-char (point-min))
+  (insert "#date " (format-time-string "%Y-%m-%d-%H-%M")
+          "\n#title " title)
+  (if muse-blosxom-use-tags
+      (if (> (length category) 0)
+          (insert (concat "\n#tags " (mapconcat #'identity category ","))))
+    (unless (string= category "")
+      (insert (concat "\n#category " category))))
+  (insert "\n\n")
+  (forward-line 2))
+
+;;; Register the Muse Blosxom Publisher
+
+(muse-derive-style "blosxom-html" "html"
+                   :suffix    'muse-blosxom-extension
+                   :link-suffix 'muse-html-extension
+                   :header    'muse-blosxom-header
+                   :footer    'muse-blosxom-footer
+                   :after     'muse-blosxom-update-page-date-alist
+                   :browser   'find-file)
+
+(muse-derive-style "blosxom-xhtml" "xhtml"
+                   :suffix    'muse-blosxom-extension
+                   :link-suffix 'muse-xhtml-extension
+                   :header    'muse-blosxom-header
+                   :footer    'muse-blosxom-footer
+                   :after     'muse-blosxom-update-page-date-alist
+                   :browser   'find-file)
+
+(provide 'muse-blosxom)
+
+;;; muse-blosxom.el ends here
diff --git a/packages/muse/muse-book.el b/packages/muse/muse-book.el
new file mode 100644 (file)
index 0000000..213a64e
--- /dev/null
@@ -0,0 +1,284 @@
+;;; muse-book.el --- publish entries into a compilation
+
+;; Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010
+;;   Free Software Foundation, Inc.
+
+;; This file is part of Emacs Muse.  It is not part of GNU Emacs.
+
+;; Emacs Muse 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, or (at your
+;; option) any later version.
+
+;; Emacs Muse 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 Emacs Muse; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;;; Contributors:
+
+;;; Code:
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Muse Book Publishing
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'muse-publish)
+(require 'muse-project)
+(require 'muse-latex)
+(require 'muse-regexps)
+
+(defgroup muse-book nil
+  "Module for publishing a series of Muse pages as a complete book.
+Each page will become a separate chapter in the book, unless the
+style keyword :nochapters is used, in which case they are all run
+together as if one giant chapter."
+  :group 'muse-publish)
+
+(defcustom muse-book-before-publish-hook nil
+  "A hook run in the book buffer before it is marked up."
+  :type 'hook
+  :group 'muse-book)
+
+(defcustom muse-book-after-publish-hook nil
+  "A hook run in the book buffer after it is marked up."
+  :type 'hook
+  :group 'muse-book)
+
+(defcustom muse-book-latex-header
+  "\\documentclass{book}
+
+\\usepackage[english]{babel}
+\\usepackage[latin1]{inputenc}
+\\usepackage[T1]{fontenc}
+
+\\begin{document}
+
+\\title{<lisp>(muse-publishing-directive \"title\")</lisp>}
+\\author{<lisp>(muse-publishing-directive \"author\")</lisp>}
+\\date{<lisp>(muse-publishing-directive \"date\")</lisp>}
+
+\\maketitle
+
+\\tableofcontents\n"
+  "Header used for publishing books to LaTeX.  This may be text or a filename."
+  :type 'string
+  :group 'muse-book)
+
+(defcustom muse-book-latex-footer
+  "<lisp>(muse-latex-bibliography)</lisp>
+\\end{document}"
+  "Footer used for publishing books to LaTeX.  This may be text or a filename."
+  :type 'string
+  :group 'muse-book)
+
+(defun muse-book-publish-chapter (title entry style &optional nochapters)
+  "Publish the chapter TITLE for the file ENTRY using STYLE.
+TITLE is a string, ENTRY is a cons of the form (PAGE-NAME .
+FILE), and STYLE is a Muse style list.
+
+This routine does the same basic work as `muse-publish-markup-buffer',
+but treating the page as if it were a single chapter within a book."
+  (let ((muse-publishing-directives (list (cons "title" title)))
+        (muse-publishing-current-file (cdr entry))
+        (beg (point)) end)
+    (muse-insert-file-contents (cdr entry))
+    (setq end (copy-marker (point-max) t))
+    (muse-publish-markup-region beg end (car entry) style)
+    (goto-char beg)
+    (unless (or nochapters
+                (muse-style-element :nochapters style))
+      (insert "\n")
+      (muse-insert-markup (muse-markup-text 'chapter))
+      (insert (let ((chap (muse-publishing-directive "title")))
+                (if (string= chap title)
+                    (car entry)
+                  chap)))
+      (muse-insert-markup (muse-markup-text 'chapter-end))
+      (insert "\n\n"))
+    (save-restriction
+      (narrow-to-region beg end)
+      (muse-publish-markup (or title "")
+                           '((100 "<\\(lisp\\)>" 0
+                              muse-publish-markup-tag)))
+      (muse-style-run-hooks :after style))
+    (goto-char end)))
+
+(defun muse-book-publish-p (project target)
+  "Determine whether the book in PROJECT is out-of-date."
+  (let ((pats (cadr project)))
+    (catch 'publish
+      (while pats
+        (if (symbolp (car pats))
+            (if (eq :book-end (car pats))
+                (throw 'publish nil)
+              ;; skip past symbol-value pair
+              (setq pats (cddr pats)))
+          (dolist (entry (muse-project-file-entries (car pats)))
+            (when (and (not (muse-project-private-p (cdr entry)))
+                       (file-newer-than-file-p (cdr entry) target))
+              (throw 'publish t)))
+          (setq pats (cdr pats)))))))
+
+(defun muse-book-get-directives (file)
+  "Interpret any publishing directives contained in FILE.
+This is meant to be called in a temp buffer that will later be
+used for publishing."
+  (save-restriction
+    (narrow-to-region (point) (point))
+    (unwind-protect
+        (progn
+          (muse-insert-file-contents file)
+          (muse-publish-markup
+           "attributes"
+           `(;; Remove leading and trailing whitespace from the file
+             (100 "\\(\\`\n+\\|\n+\\'\\)" 0 "")
+             ;; Remove trailing whitespace from all lines
+             (200 ,(concat "[" muse-regexp-blank "]+$") 0 "")
+             ;; Handle any leading #directives
+             (300 "\\`#\\([a-zA-Z-]+\\)\\s-+\\(.+\\)\n+"
+                  0 muse-publish-markup-directive))))
+      (delete-region (point-min) (point-max)))))
+
+(defun muse-book-publish-project
+  (project book title style &optional output-dir force)
+  "Publish PROJECT under the name BOOK with the given TITLE and STYLE.
+BOOK should be a page name, i.e., letting the style determine the
+prefix and/or suffix.  The book is published to OUTPUT-DIR.  If FORCE
+is nil, the book is only published if at least one of its component
+pages has changed since it was last published."
+  (interactive
+   (let ((project (muse-read-project "Publish project as book: " nil t)))
+     (append (list project
+                   (read-string "Basename of book (without extension): ")
+                   (read-string "Title of book: "))
+             (muse-publish-get-info))))
+  (setq project (muse-project project))
+  (let ((muse-current-project project))
+    ;; See if any of the project's files need saving first
+    (muse-project-save-buffers project)
+    ;; Publish the book
+    (muse-book-publish book style output-dir force title)))
+
+(defun muse-book-publish (file style &optional output-dir force title)
+  "Publish FILE as a book with the given TITLE and STYLE.
+The book is published to OUTPUT-DIR.  If FORCE is nil, the book
+is only published if at least one of its component pages has
+changed since it was last published."
+  ;; Cleanup some of the arguments
+  (let ((style-name style))
+    (setq style (muse-style style))
+    (unless style
+      (error "There is no style '%s' defined" style-name)))
+  ;; Publish each page in the project as a chapter in one large book
+  (let* ((output-path (muse-publish-output-file file output-dir style))
+         (output-suffix (muse-style-element :osuffix style))
+         (target output-path)
+         (project muse-current-project)
+         (published nil))
+    (when output-suffix
+      (setq target (concat (muse-path-sans-extension target)
+                           output-suffix)))
+    ;; Unless force is non-nil, determine if the book needs publishing
+    (if (and (not force)
+             (not (muse-book-publish-p project target)))
+        (message "The book \"%s\" is up-to-date." file)
+      ;; Create the book from all its component parts
+      (muse-with-temp-buffer
+        (let ((style-final  (muse-style-element :final  style t))
+              (style-header (muse-style-element :header style))
+              (style-footer (muse-style-element :footer style))
+              (muse-publishing-current-style style)
+              (muse-publishing-directives
+               (list (cons "title" (or title (muse-page-name file)))
+                     (cons "date" (format-time-string "%B %e, %Y"))))
+              (muse-publishing-p t)
+              (muse-current-project project)
+              (pats (cadr project))
+              (nochapters nil))
+          (run-hooks 'muse-before-book-publish-hook)
+          (let ((style-final style-final)
+                (style-header style-header)
+                (style-footer style-footer))
+            (unless title
+              (muse-book-get-directives file)
+              (setq title (muse-publishing-directive "title")))
+            (while pats
+              (if (symbolp (car pats))
+                  (cond
+                   ((eq :book-part (car pats))
+                    (insert "\n")
+                    (muse-insert-markup (muse-markup-text 'part))
+                    (insert (cadr pats))
+                    (muse-insert-markup (muse-markup-text 'part-end))
+                    (insert "\n")
+                    (setq pats (cddr pats)))
+                   ((eq :book-chapter (car pats))
+                    (insert "\n")
+                    (muse-insert-markup (muse-markup-text 'chapter))
+                    (insert (cadr pats))
+                    (muse-insert-markup (muse-markup-text 'chapter-end))
+                    (insert "\n")
+                    (setq pats (cddr pats)))
+                   ((eq :nochapters (car pats))
+                    (setq nochapters t
+                          pats (cddr pats)))
+                   ((eq :book-style (car pats))
+                    (setq style (muse-style (cadr pats)))
+                    (setq style-final  (muse-style-element :final  style t)
+                          style-header (muse-style-element :header style)
+                          style-footer (muse-style-element :footer style)
+                          muse-publishing-current-style style)
+                    (setq pats (cddr pats)))
+                   ((eq :book-funcall (car pats))
+                    (funcall (cadr pats))
+                    (setq pats (cddr pats)))
+                   ((eq :book-end (car pats))
+                    (setq pats nil))
+                   (t
+                    (setq pats (cddr pats))))
+                (let ((entries (muse-project-file-entries (car pats))))
+                  (while (and entries (car entries) (caar entries))
+                    (unless (muse-project-private-p (cdar entries))
+                      (muse-book-publish-chapter title (car entries)
+                                                 style nochapters)
+                      (setq published t))
+                    (setq entries (cdr entries))))
+                (setq pats (cdr pats)))))
+          (goto-char (point-min))
+          (if style-header (muse-insert-file-or-string style-header file))
+          (goto-char (point-max))
+          (if style-footer (muse-insert-file-or-string style-footer file))
+          (run-hooks 'muse-after-book-publish-hook)
+          (if (muse-write-file output-path)
+              (if style-final
+                  (funcall style-final file output-path target))
+            (setq published nil)))))
+    (if published
+        (message "The book \"%s\" has been published." file))
+    published))
+
+;;; Register the Muse BOOK Publishers
+
+(muse-derive-style "book-latex" "latex"
+                   :header 'muse-book-latex-header
+                   :footer 'muse-book-latex-footer
+                   :publish 'muse-book-publish)
+
+(muse-derive-style "book-pdf" "pdf"
+                   :header 'muse-book-latex-header
+                   :footer 'muse-book-latex-footer
+                   :publish 'muse-book-publish)
+
+(provide 'muse-book)
+
+;;; muse-book.el ends here
diff --git a/packages/muse/muse-colors.el b/packages/muse/muse-colors.el
new file mode 100644 (file)
index 0000000..132310d
--- /dev/null
@@ -0,0 +1,1019 @@
+;;; muse-colors.el --- coloring and highlighting used by Muse
+
+;; Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010
+;;   Free Software Foundation, Inc.
+
+;; Author: John Wiegley (johnw AT gnu DOT org)
+;; Keywords: hypermedia
+;; Date: Thu 11-Mar-2004
+
+;; This file is part of Emacs Muse.  It is not part of GNU Emacs.
+
+;; Emacs Muse 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, or (at your
+;; option) any later version.
+
+;; Emacs Muse 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 Emacs Muse; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;;; Contributors:
+
+;; Lan Yufeng (nlany DOT web AT gmail DOT com) found an error where
+;; headings were being given the wrong face, contributing a patch to
+;; fix this.
+
+;; Sergey Vlasov (vsu AT altlinux DOT ru) fixed an issue with coloring
+;; links that are in consecutive lines.
+
+;; Jim Ottaway ported the <lisp> tag from emacs-wiki.
+
+;; Per B. Sederberg (per AT med DOT upenn DOT edu) contributed the
+;; viewing of inline images.
+
+;;; Code:
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Emacs Muse Highlighting
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'muse-mode)
+(require 'muse-regexps)
+(require 'font-lock)
+
+(defgroup muse-colors nil
+  "Options controlling the behavior of Emacs Muse highlighting.
+See `muse-colors-buffer' for more information."
+  :group 'muse-mode)
+
+(defcustom muse-colors-autogen-headings t
+  "Specify whether the heading faces should be auto-generated.
+The default is to scale them.
+
+Choosing 'outline will copy the colors from the outline-mode
+headings.
+
+If you want to customize each of the headings individually, set
+this to nil."
+  :type '(choice (const :tag "Default (scaled) headings" t)
+                 (const :tag "Use outline-mode headings" outline)
+                 (const :tag "Don't touch the headings" nil))
+  :group 'muse-colors)
+
+(defcustom muse-colors-evaluate-lisp-tags t
+  "Specify whether to evaluate the contents of <lisp> tags at
+display time.  If nil, don't evaluate them.  If non-nil, evaluate
+them.
+
+The actual contents of the buffer are not changed, only the
+displayed text."
+  :type 'boolean
+  :group 'muse-colors)
+
+(defcustom muse-colors-inline-images t
+  "Specify whether to inline images inside the Emacs buffer.  If
+nil, don't inline them.  If non-nil, an image link will be
+replaced by the image.
+
+The actual contents of the buffer are not changed, only whether
+an image is displayed."
+  :type 'boolean
+  :group 'muse-colors)
+
+(defcustom muse-colors-inline-image-method 'default-directory
+  "Determine how to locate inline images.
+Setting this to 'default-directory uses the current directory of
+the current Muse buffer.
+
+Setting this to a function calls that function with the filename
+of the image to be inlined.  The value that is returned will be
+used as the filename of the image."
+  :type '(choice (const :tag "Current directory" default-directory)
+                 (const :tag "Publishing directory"
+                        muse-colors-use-publishing-directory)
+                 (function :tag "Custom function"))
+  :group 'muse-colors)
+
+(defvar muse-colors-region-end nil
+  "Indicate the end of the region that is currently being font-locked.")
+(make-variable-buffer-local 'muse-colors-region-end)
+
+;;;###autoload
+(defun muse-colors-toggle-inline-images ()
+  "Toggle display of inlined images on/off."
+  (interactive)
+  ;; toggle the custom setting
+  (if (not muse-colors-inline-images)
+      (setq muse-colors-inline-images t)
+    (setq muse-colors-inline-images nil))
+  ;; reprocess the buffer
+  (muse-colors-buffer)
+  ;; display informative message
+  (if muse-colors-inline-images
+      (message "Images are now displayed inline")
+    (message "Images are now displayed as links")))
+
+(defvar muse-colors-outline-faces-list
+  (if (facep 'outline-1)
+      '(outline-1 outline-2 outline-3 outline-4 outline-5)
+    ;; these are equivalent in coloring to the outline faces
+    '(font-lock-function-name-face
+      font-lock-variable-name-face
+      font-lock-keyword-face
+      font-lock-builtin-face
+      font-lock-comment-face))
+  "Outline faces to use when assigning Muse header faces.")
+
+(defun muse-make-faces-default (&optional later)
+  "Generate the default face definitions for headers."
+  (dolist (num '(1 2 3 4 5))
+    (let ((newsym (intern (concat "muse-header-" (int-to-string num))))
+          (docstring (concat
+                      "Muse header face.  See "
+                      "`muse-colors-autogen-headings' before changing it.")))
+      ;; put in the proper group and give documentation
+      (if later
+          (unless (featurep 'xemacs)
+            (muse-copy-face 'variable-pitch newsym)
+            (set-face-attribute newsym nil :height (1+ (* 0.1 (- 5 num)))
+                                :weight 'bold))
+        (if (featurep 'xemacs)
+            (eval `(defface ,newsym
+                     '((t (:size
+                           ,(nth (1- num)
+                                 '("24pt" "18pt" "14pt" "12pt" "11pt"))
+                           :bold t)))
+                     ,docstring
+                     :group 'muse-colors))
+          (eval `(defface ,newsym
+                   '((t (:height ,(1+ (* 0.1 (- 5 num)))
+                                 :inherit variable-pitch
+                                 :weight bold)))
+                   ,docstring
+                   :group 'muse-colors)))))))
+
+(progn (muse-make-faces-default))
+
+(defun muse-make-faces (&optional frame)
+  "Generate face definitions for headers based the user's preferences."
+  (cond
+   ((not muse-colors-autogen-headings)
+    nil)
+   ((eq muse-colors-autogen-headings t)
+    (muse-make-faces-default t))
+   (t
+    (dolist (num '(1 2 3 4 5))
+      (let ((newsym (intern (concat "muse-header-" (int-to-string num)))))
+        ;; copy the desired face definition
+        (muse-copy-face (nth (1- num) muse-colors-outline-faces-list)
+                        newsym))))))
+
+;; after displaying the Emacs splash screen, the faces are wiped out,
+;; so recover from that
+(add-hook 'window-setup-hook #'muse-make-faces)
+;; ditto for when a new frame is created
+(when (boundp 'after-make-frame-functions)
+  (add-hook 'after-make-frame-functions #'muse-make-faces))
+
+(defface muse-link
+  '((t :inherit link))
+  "Face for Muse cross-references."
+  :group 'muse-colors)
+
+(defface muse-bad-link
+  '((default :inherit link)
+    (((class color) (background light))
+     (:foreground "red" :underline "red" :bold t))
+    (((class color) (background dark))
+     (:foreground "coral" :underline "coral" :bold t))
+    (t (:bold t)))
+  "Face for bad Muse cross-references."
+  :group 'muse-colors)
+
+(defface muse-verbatim
+  '((((class color) (background light))
+     (:foreground "slate gray"))
+    (((class color) (background dark))
+     (:foreground "gray")))
+  "Face for verbatim text."
+  :group 'muse-colors)
+
+(defface muse-emphasis-1
+  '((t (:italic t)))
+  "Face for italic emphasized text."
+  :group 'muse-colors)
+
+(defface muse-emphasis-2
+  '((t (:bold t)))
+  "Face for bold emphasized text."
+  :group 'muse-colors)
+
+(defface muse-emphasis-3
+  '((t (:bold t :italic t)))
+  "Face for bold italic emphasized text."
+  :group 'muse-colors)
+
+(muse-copy-face 'italic 'muse-emphasis-1)
+(muse-copy-face 'bold 'muse-emphasis-2)
+(muse-copy-face 'bold-italic 'muse-emphasis-3)
+
+(defcustom muse-colors-buffer-hook nil
+  "A hook run after a region is highlighted.
+Each function receives three arguments: BEG END VERBOSE.
+BEG and END mark the range being highlighted, and VERBOSE specifies
+whether progress messages should be displayed to the user."
+  :type 'hook
+  :group 'muse-colors)
+
+(defvar muse-colors-highlighting-registry nil
+  "The rules for highlighting Muse and Muse-derived buffers.
+This is automatically generated when using font-lock in Muse buffers.
+
+This an alist of major-mode symbols to `muse-colors-rule' objects.")
+
+(defun muse-colors-make-highlighting-struct ()
+  (list nil nil nil))
+(defconst muse-colors-highlighting.regexp 0
+  "Regexp matching each car of the markup of the current rule.")
+(defconst muse-colors-highlighting.vector 1
+  "Vector of all characters that are part of the markup of the current rule.
+This is composed of the 2nd element of each markup entry.")
+(defconst muse-colors-highlighting.remaining 2
+  "Expressions for highlighting a buffer which have no corresponding
+entry in the vector.")
+
+(defsubst muse-colors-highlighting-entry (mode)
+  "Return the highlighting rules for MODE."
+  (assq mode muse-colors-highlighting-registry))
+
+(defun muse-colors-find-highlighting (mode)
+  "Return the highlighting rules to be used for MODE.
+If MODE does not have highlighting rules, check its parent modes."
+  (let ((seen nil))
+    (catch 'rules
+      (while (and mode (not (memq mode seen)))
+        (let ((entry (muse-colors-highlighting-entry mode)))
+          (when entry (throw 'rules (cdr entry))))
+        (setq seen (cons mode seen))
+        (setq mode (get mode 'derived-mode-parent)))
+      nil)))
+
+(defun muse-colors-define-highlighting (mode markup)
+  "Create or update the markup rules for MODE, using MARKUP.
+
+See `muse-colors-markup' for an explanation of the format that MARKUP
+should take."
+  (unless (and (symbolp mode) mode (consp markup))
+    (error "Invalid arguments"))
+  (let* ((highlighting-entry (muse-colors-highlighting-entry mode))
+         (struct (cdr highlighting-entry))
+         (regexp nil)
+         (vector nil)
+         (remaining nil))
+    ;; Initialize struct
+    (if struct
+        (setq vector (nth muse-colors-highlighting.vector struct))
+      (setq struct (muse-colors-make-highlighting-struct)))
+    ;; Initialize vector
+    (if vector
+        (let ((i 0))
+          (while (< i 128)
+            (aset vector i nil)
+            (setq i (1+ i))))
+      (setq vector (make-vector 128 nil)))
+    ;; Determine vector, regexp, remaining
+    (let ((regexps nil)
+          (rules nil))
+      (dolist (rule markup)
+        (let ((value (cond ((symbolp (car rule))
+                            (symbol-value (car rule)))
+                           ((stringp (car rule))
+                            (car rule))
+                           (t nil))))
+          (when value
+            (setq rules (cons rule rules))
+            (setq regexps (cons value regexps)))))
+      (setq regexps (nreverse regexps))
+      (setq regexp (concat "\\(" (mapconcat #'identity regexps "\\|") "\\)"))
+      (dolist (rule rules)
+        (if (eq (nth 1 rule) t)
+            (setq remaining (cons (cons (nth 0 rule) (nth 2 rule))
+                                  remaining))
+          (aset vector (nth 1 rule)
+                (cons (cons (nth 0 rule) (nth 2 rule))
+                      (aref vector (nth 1 rule)))))))
+    ;; Update the struct
+    (setcar (nthcdr muse-colors-highlighting.regexp struct) regexp)
+    (setcar (nthcdr muse-colors-highlighting.vector struct) vector)
+    (setcar (nthcdr muse-colors-highlighting.remaining struct) remaining)
+    ;; Update entry for mode in muse-colors-highlighting-registry
+    (if highlighting-entry
+        (setcdr highlighting-entry struct)
+      (setq muse-colors-highlighting-registry
+            (cons (cons mode struct)
+                  muse-colors-highlighting-registry)))))
+
+(defun muse-configure-highlighting (sym val)
+  "Extract color markup information from VAL and set to SYM.
+This is usually called with `muse-colors-markup' as both arguments."
+  (muse-colors-define-highlighting 'muse-mode val)
+  (set sym val))
+
+(defun muse-colors-emphasized ()
+  "Color emphasized text and headings."
+  ;; Here we need to check four different points - the start and end
+  ;; of the leading *s, and the start and end of the trailing *s.  We
+  ;; allow the outsides to be surrounded by whitespace or punctuation,
+  ;; but no word characters, and the insides must not be surrounded by
+  ;; whitespace or punctuation.  Thus the following are valid:
+  ;;
+  ;; " *foo bar* "
+  ;; "**foo**,"
+  ;; and the following is invalid:
+  ;; "** testing **"
+  (let* ((beg (match-beginning 0))
+         (e1 (match-end 0))
+         (leader (- e1 beg))
+         b2 e2 multiline)
+    (unless (or (eq (get-text-property beg 'invisible) 'muse)
+                (get-text-property beg 'muse-comment)
+                (get-text-property beg 'muse-directive))
+      ;; check if it's a header
+      (if (eq (char-after e1) ?\ )
+          (when (or (= beg (point-min))
+                    (eq (char-before beg) ?\n))
+            (add-text-properties
+             (muse-line-beginning-position) (muse-line-end-position)
+             (list 'face (intern (concat "muse-header-"
+                                         (int-to-string leader))))))
+        ;; beginning of line or space or symbol
+        (when (or (= beg (point-min))
+                  (eq (char-syntax (char-before beg)) ?\ )
+                  (memq (char-before beg)
+                        '(?\- ?\[ ?\< ?\( ?\' ?\` ?\" ?\n)))
+          (save-excursion
+            (skip-chars-forward "^*<>\n" muse-colors-region-end)
+            (when (eq (char-after) ?\n)
+              (setq multiline t)
+              (skip-chars-forward "^*<>" muse-colors-region-end))
+            (setq b2 (point))
+            (skip-chars-forward "*" muse-colors-region-end)
+            (setq e2 (point))
+            ;; Abort if space exists just before end
+            ;; or bad leader
+            ;; or no '*' at end
+            ;; or word constituent follows
+            (unless (or (> leader 5)
+                        (not (eq leader (- e2 b2)))
+                        (eq (char-syntax (char-before b2)) ?\ )
+                        (not (eq (char-after b2) ?*))
+                        (and (not (eobp))
+                             (eq (char-syntax (char-after (1+ b2))) ?w)))
+              (add-text-properties beg e1 '(invisible muse))
+              (add-text-properties
+               e1 b2 (list 'face (cond ((= leader 1) 'muse-emphasis-1)
+                                       ((= leader 2) 'muse-emphasis-2)
+                                       ((= leader 3) 'muse-emphasis-3))))
+              (add-text-properties b2 e2 '(invisible muse))
+              (when multiline
+                (add-text-properties
+                 beg e2 '(font-lock-multiline t))))))))))
+
+(defun muse-colors-underlined ()
+  "Color underlined text."
+  (let ((start (match-beginning 0))
+        multiline)
+    (unless (or (eq (get-text-property start 'invisible) 'muse)
+                (get-text-property start 'muse-comment)
+                (get-text-property start 'muse-directive))
+      ;; beginning of line or space or symbol
+      (when (or (= start (point-min))
+                (eq (char-syntax (char-before start)) ?\ )
+                (memq (char-before start)
+                      '(?\- ?\[ ?\< ?\( ?\' ?\` ?\" ?\n)))
+        (save-excursion
+          (skip-chars-forward "^_<>\n" muse-colors-region-end)
+          (when (eq (char-after) ?\n)
+            (setq multiline t)
+            (skip-chars-forward "^_<>" muse-colors-region-end))
+          ;; Abort if space exists just before end
+          ;; or no '_' at end
+          ;; or word constituent follows
+          (unless (or (eq (char-syntax (char-before (point))) ?\ )
+                      (not (eq (char-after (point)) ?_))
+                      (and (not (eobp))
+                           (eq (char-syntax (char-after (1+ (point)))) ?w)))
+            (add-text-properties start (1+ start) '(invisible muse))
+            (add-text-properties (1+ start) (point) '(face underline))
+            (add-text-properties (point)
+                                 (min (1+ (point)) (point-max))
+                                 '(invisible muse))
+            (when multiline
+              (add-text-properties
+               start (min (1+ (point)) (point-max))
+               '(font-lock-multiline t)))))))))
+
+(defun muse-colors-verbatim ()
+  "Render in teletype and suppress further parsing."
+  (let ((start (match-beginning 0))
+        multiline)
+    (unless (or (eq (get-text-property start 'invisible) 'muse)
+                (get-text-property start 'muse-comment)
+                (get-text-property start 'muse-directive))
+      ;; beginning of line or space or symbol
+      (when (or (= start (point-min))
+                (eq (char-syntax (char-before start)) ?\ )
+                (memq (char-before start)
+                      '(?\- ?\[ ?\< ?\( ?\' ?\` ?\" ?\n)))
+        (let ((pos (point)))
+          (skip-chars-forward "^=\n" muse-colors-region-end)
+          (when (eq (char-after) ?\n)
+            (setq multiline t)
+            (skip-chars-forward "^=" muse-colors-region-end))
+          ;; Abort if space exists just before end
+          ;; or no '=' at end
+          ;; or word constituent follows
+          (unless (or (eq (char-syntax (char-before (point))) ?\ )
+                      (not (eq (char-after (point)) ?=))
+                      (and (not (eobp))
+                           (eq (char-syntax (char-after (1+ (point)))) ?w)))
+            (setq pos (min (1+ (point)) (point-max)))
+            (add-text-properties start (1+ start) '(invisible muse))
+            (add-text-properties (1+ start) (point) '(face muse-verbatim))
+            (add-text-properties (point)
+                                 (min (1+ (point)) (point-max))
+                                 '(invisible muse))
+            (when multiline
+              (add-text-properties
+               start (min (1+ (point)) (point-max))
+               '(font-lock-multiline t))))
+          (goto-char pos))))))
+
+(defcustom muse-colors-markup
+  `(;; make emphasized text appear emphasized
+    ("\\*\\{1,5\\}" ?* muse-colors-emphasized)
+
+    ;; make underlined text appear underlined
+    (,(concat "_[^" muse-regexp-blank "_\n]")
+     ?_ muse-colors-underlined)
+
+    ("^#title " ?\# muse-colors-title)
+
+    (muse-explicit-link-regexp ?\[ muse-colors-explicit-link)
+
+    ;; render in teletype and suppress further parsing
+    (,(concat "=[^" muse-regexp-blank "=\n]") ?= muse-colors-verbatim)
+
+    ;; highlight any markup tags encountered
+    (muse-tag-regexp ?\< muse-colors-custom-tags)
+
+    ;; display comments
+    (,(concat "^;[" muse-regexp-blank "]") ?\; muse-colors-comment)
+
+    ;; this has to come later since it doesn't have a special
+    ;; character in the second cell
+    (muse-url-regexp t muse-colors-implicit-link)
+    )
+  "Expressions to highlight an Emacs Muse buffer.
+These are arranged in a rather special fashion, so as to be as quick as
+possible.
+
+Each element of the list is itself a list, of the form:
+
+  (LOCATE-REGEXP TEST-CHAR MATCH-FUNCTION)
+
+LOCATE-REGEXP is a partial regexp, and should be the smallest possible
+regexp to differentiate this rule from other rules.  It may also be a
+symbol containing such a regexp.  The buffer region is scanned only
+once, and LOCATE-REGEXP indicates where the scanner should stop to
+look for highlighting possibilities.
+
+TEST-CHAR is a char or t.  The character should match the beginning
+text matched by LOCATE-REGEXP.  These chars are used to build a vector
+for fast MATCH-FUNCTION calling.
+
+MATCH-FUNCTION is the function called when a region has been
+identified.  It is responsible for adding the appropriate text
+properties to change the appearance of the buffer.
+
+This markup is used to modify the appearance of the original text to
+make it look more like the published HTML would look (like making some
+markup text invisible, inlining images, etc).
+
+font-lock is used to apply the markup rules, so that they can happen
+on a deferred basis.  They are not always accurate, but you can use
+\\[font-lock-fontifty-block] near the point of error to force
+fontification in that area."
+  :type '(repeat
+          (list :tag "Highlight rule"
+                (choice (regexp :tag "Locate regexp")
+                        (symbol :tag "Regexp symbol"))
+                (choice (character :tag "Confirm character")
+                        (const :tag "Default rule" t))
+                function))
+  :set 'muse-configure-highlighting
+  :group 'muse-colors)
+
+;; XEmacs users don't have `font-lock-multiline'.
+(unless (boundp 'font-lock-multiline)
+  (defvar font-lock-multiline nil))
+
+(defun muse-use-font-lock ()
+  "Set up font-locking for Muse."
+  (muse-add-to-invisibility-spec 'muse)
+  (set (make-local-variable 'font-lock-multiline) 'undecided)
+  (set (make-local-variable 'font-lock-defaults)
+       `(nil t nil nil beginning-of-line
+         (font-lock-fontify-region-function . muse-colors-region)
+         (font-lock-unfontify-region-function
+          . muse-unhighlight-region)))
+  (set (make-local-variable 'font-lock-fontify-region-function)
+       'muse-colors-region)
+  (set (make-local-variable 'font-lock-unfontify-region-function)
+       'muse-unhighlight-region)
+  (muse-make-faces)
+  (muse-colors-define-highlighting 'muse-mode muse-colors-markup)
+  (font-lock-mode t))
+
+(defun muse-colors-buffer ()
+  "Re-highlight the entire Muse buffer."
+  (interactive)
+  (muse-colors-region (point-min) (point-max) t))
+
+(defvar muse-colors-fontifying-p nil
+  "Indicate whether Muse is fontifying the current buffer.")
+(make-variable-buffer-local 'muse-colors-fontifying-p)
+
+(defvar muse-colors-delayed-commands nil
+  "Commands to be run immediately after highlighting a region.
+
+This is meant to accommodate highlighting <lisp> in #title
+directives after everything else.
+
+It may be modified by Muse functions during highlighting, but not
+the user.")
+(make-variable-buffer-local 'muse-colors-delayed-commands)
+
+(defun muse-colors-region (beg end &optional verbose)
+  "Apply highlighting according to `muse-colors-markup'.
+Note that this function should NOT change the buffer, nor should any
+of the functions listed in `muse-colors-markup'."
+  (let ((buffer-undo-list t)
+        (inhibit-read-only t)
+        (inhibit-point-motion-hooks t)
+        (inhibit-modification-hooks t)
+        (modified-p (buffer-modified-p))
+        (muse-colors-fontifying-p t)
+        (muse-colors-region-end (muse-line-end-position end))
+        (muse-colors-delayed-commands nil)
+        (highlighting (muse-colors-find-highlighting major-mode))
+        regexp vector remaining
+        deactivate-mark)
+    (unless highlighting
+      (error "No highlighting found for this mode"))
+    (setq regexp (nth muse-colors-highlighting.regexp highlighting)
+          vector (nth muse-colors-highlighting.vector highlighting)
+          remaining (nth muse-colors-highlighting.remaining highlighting))
+    (unwind-protect
+        (save-excursion
+          (save-restriction
+            (widen)
+            ;; check to see if we should expand the beg/end area for
+            ;; proper multiline matches
+            (when (and font-lock-multiline
+                       (> beg (point-min))
+                       (get-text-property (1- beg) 'font-lock-multiline))
+              ;; We are just after or in a multiline match.
+              (setq beg (or (previous-single-property-change
+                             beg 'font-lock-multiline)
+                            (point-min)))
+              (goto-char beg)
+              (setq beg (muse-line-beginning-position)))
+            (when font-lock-multiline
+              (setq end (or (text-property-any end (point-max)
+                                               'font-lock-multiline nil)
+                            (point-max))))
+            (goto-char end)
+            (setq end (muse-line-beginning-position 2))
+            ;; Undo any fontification in the area.
+            (font-lock-unfontify-region beg end)
+            ;; And apply fontification based on `muse-colors-markup'
+            (let ((len (float (- end beg)))
+                  (case-fold-search nil)
+                  markup-list)
+              (goto-char beg)
+              (while (and (< (point) end)
+                          (re-search-forward regexp end t))
+                (if verbose
+                    (message "Highlighting buffer...%d%%"
+                             (* (/ (float (- (point) beg)) len) 100)))
+                (let ((ch (char-after (match-beginning 0))))
+                  (when (< ch 128)
+                    (setq markup-list (aref vector ch))))
+                (unless markup-list
+                  (setq markup-list remaining))
+                (let ((prev (point)))
+                  ;; backtrack and figure out which rule matched
+                  (goto-char (match-beginning 0))
+                  (catch 'done
+                    (dolist (entry markup-list)
+                      (let ((value (cond ((symbolp (car entry))
+                                          (symbol-value (car entry)))
+                                         ((stringp (car entry))
+                                          (car entry))
+                                         (t nil))))
+                        (when (and (stringp value) (looking-at value))
+                          (goto-char (match-end 0))
+                          (when (cdr entry)
+                            (funcall (cdr entry)))
+                          (throw 'done t))))
+                    ;; if no rule matched, which should never happen,
+                    ;; return to previous position so that forward
+                    ;; progress is ensured
+                    (goto-char prev))))
+              (dolist (command muse-colors-delayed-commands)
+                (apply (car command) (cdr command)))
+              (run-hook-with-args 'muse-colors-buffer-hook
+                                  beg end verbose)
+              (if verbose (message "Highlighting buffer...done")))))
+      (set-buffer-modified-p modified-p))))
+
+(defcustom muse-colors-tags
+  '(("example"  t nil nil muse-colors-example-tag)
+    ("code"     t nil nil muse-colors-example-tag)
+    ("verbatim" t nil nil muse-colors-literal-tag)
+    ("lisp"     t t   nil muse-colors-lisp-tag)
+    ("literal"  t nil nil muse-colors-literal-tag))
+  "A list of tag specifications for specially highlighting text.
+XML-style tags are the best way to add custom highlighting to Muse.
+This is easily accomplished by customizing this list of markup tags.
+
+For each entry, the name of the tag is given, whether it expects
+a closing tag and/or an optional set of attributes, whether it is
+nestable, and a function that performs whatever action is desired
+within the delimited region.
+
+The function is called with three arguments, the beginning and
+end of the region surrounded by the tags. If properties are
+allowed, they are passed as a third argument in the form of an
+alist. The `end' argument to the function is the last character
+of the enclosed tag or region.
+
+Functions should not modify the contents of the buffer."
+  :type '(repeat (list (string :tag "Markup tag")
+                       (boolean :tag "Expect closing tag" :value t)
+                       (boolean :tag "Parse attributes" :value nil)
+                       (boolean :tag "Nestable" :value nil)
+                       function))
+  :group 'muse-colors)
+
+(defvar muse-colors-inhibit-tags-in-directives t
+  "If non-nil, don't allow tags to be interpreted in directives.
+This is used to delay highlighting of <lisp> tags in #title until later.")
+(make-variable-buffer-local 'muse-colors-inhibit-tags-in-directives)
+
+(defsubst muse-colors-tag-info (tagname &rest args)
+  "Get tag info associated with TAGNAME, ignoring ARGS."
+  (assoc tagname muse-colors-tags))
+
+(defun muse-colors-custom-tags ()
+  "Highlight `muse-colors-tags'."
+  (let ((tag-info (muse-colors-tag-info (match-string 1))))
+    (unless (or (not tag-info)
+                (get-text-property (match-beginning 0) 'muse-comment)
+                (and muse-colors-inhibit-tags-in-directives
+                     (get-text-property (match-beginning 0) 'muse-directive)))
+      (let ((closed-tag (match-string 3))
+            (start (match-beginning 0))
+            end attrs)
+        (when (nth 2 tag-info)
+          (let ((attrstr (match-string 2)))
+            (while (and attrstr
+                        (string-match (concat "\\([^"
+                                              muse-regexp-blank
+                                              "=\n]+\\)\\(=\""
+                                              "\\([^\"]+\\)\"\\)?")
+                                      attrstr))
+              (let ((attr (cons (downcase
+                                 (muse-match-string-no-properties 1 attrstr))
+                                (muse-match-string-no-properties 3 attrstr))))
+                (setq attrstr (replace-match "" t t attrstr))
+                (if attrs
+                    (nconc attrs (list attr))
+                  (setq attrs (list attr)))))))
+        (if (and (cadr tag-info) (not closed-tag))
+            (if (muse-goto-tag-end (car tag-info) (nth 3 tag-info))
+                (setq end (match-end 0))
+              (setq tag-info nil)))
+        (when tag-info
+          (let ((args (list start end)))
+            (if (nth 2 tag-info)
+                (nconc args (list attrs)))
+            (apply (nth 4 tag-info) args)))))))
+
+(defun muse-unhighlight-region (begin end &optional verbose)
+  "Remove all visual highlights in the buffer (except font-lock)."
+  (let ((buffer-undo-list t)
+        (inhibit-read-only t)
+        (inhibit-point-motion-hooks t)
+        (inhibit-modification-hooks t)
+        (modified-p (buffer-modified-p))
+        deactivate-mark)
+    (unwind-protect
+        (remove-text-properties
+         begin end '(face nil font-lock-multiline nil end-glyph nil
+                          invisible nil intangible nil display nil
+                          mouse-face nil keymap nil help-echo nil
+                          muse-link nil muse-directive nil muse-comment nil
+                          muse-no-implicit-link nil muse-no-flyspell nil))
+      (set-buffer-modified-p modified-p))))
+
+(defun muse-colors-example-tag (beg end)
+  "Strip properties and colorize with `muse-verbatim'."
+  (muse-unhighlight-region beg end)
+  (let ((multi (save-excursion
+                 (goto-char beg)
+                 (forward-line 1)
+                 (> end (point)))))
+    (add-text-properties beg end `(face muse-verbatim
+                                   font-lock-multiline ,multi))))
+
+(defun muse-colors-literal-tag (beg end)
+  "Strip properties and mark as literal."
+  (muse-unhighlight-region beg end)
+  (let ((multi (save-excursion
+                 (goto-char beg)
+                 (forward-line 1)
+                 (> end (point)))))
+    (add-text-properties beg end `(font-lock-multiline ,multi))))
+
+(defun muse-colors-lisp-tag (beg end attrs)
+  "Color the region enclosed by a <lisp> tag."
+  (if (not muse-colors-evaluate-lisp-tags)
+      (muse-colors-literal-tag beg end)
+    (muse-unhighlight-region beg end)
+    (let (beg-lisp end-lisp)
+      (save-match-data
+        (goto-char beg)
+        (setq beg-lisp (and (looking-at "<[^>]+>")
+                            (match-end 0)))
+        (goto-char end)
+        (setq end-lisp (and (muse-looking-back "</[^>]+>")
+                            (match-beginning 0))))
+      (add-text-properties
+       beg end
+       (list 'font-lock-multiline t
+             'display (muse-eval-lisp
+                       (concat
+                        "(progn "
+                        (buffer-substring-no-properties beg-lisp end-lisp)
+                        ")"))
+             'intangible t)))))
+
+(defvar muse-mode-local-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map [return] 'muse-follow-name-at-point)
+    (define-key map [(control ?m)] 'muse-follow-name-at-point)
+    (define-key map [(shift return)] 'muse-follow-name-at-point-other-window)
+    (if (featurep 'xemacs)
+        (progn
+          (define-key map [(button2)] 'muse-follow-name-at-mouse)
+          (define-key map [(shift button2)]
+            'muse-follow-name-at-mouse-other-window))
+      (define-key map [(shift control ?m)]
+        'muse-follow-name-at-point-other-window)
+      (define-key map [mouse-2] 'muse-follow-name-at-mouse)
+      (define-key map [(shift mouse-2)]
+        'muse-follow-name-at-mouse-other-window)
+      (unless (eq emacs-major-version 21)
+        (set-keymap-parent map muse-mode-map)))
+    map)
+  "Local keymap used by Muse while on a link.")
+
+(defvar muse-keymap-property
+  (if (or (featurep 'xemacs)
+          (>= emacs-major-version 21))
+      'keymap
+    'local-map)
+  "The name of the keymap or local-map property.")
+
+(defsubst muse-link-properties (help-str &optional face)
+  "Determine text properties to use for a link."
+  (append (if face
+              (list 'face face 'mouse-face 'highlight 'muse-link t)
+            (list 'invisible 'muse 'intangible t))
+          (list 'help-echo help-str 'rear-nonsticky t
+                muse-keymap-property muse-mode-local-map)))
+
+(defun muse-link-face (link-name &optional explicit)
+  "Return the type of LINK-NAME as a face symbol.
+For EXPLICIT links, this is either a normal link or a bad-link
+face.  For implicit links, it is either colored normally or
+ignored."
+  (save-match-data
+    (let ((link (if explicit
+                    (muse-handle-explicit-link link-name)
+                  (muse-handle-implicit-link link-name))))
+      (when link
+        (cond ((string-match muse-url-regexp link)
+               'muse-link)
+              ((muse-file-remote-p link)
+               'muse-link)
+              ((string-match muse-file-regexp link)
+               (when (string-match "/[^/]+#[^#./]+\\'" link)
+                 ;; strip anchor from the end of a path
+                 (setq link (substring link 0 (match-beginning 0))))
+               (if (file-exists-p link)
+                   'muse-link
+                 'muse-bad-link))
+              ((not (featurep 'muse-project))
+               'muse-link)
+              (t
+               (if (string-match "#" link)
+                   (setq link (substring link 0 (match-beginning 0))))
+               (if (or (and (muse-project-of-file)
+                            (muse-project-page-file
+                             link muse-current-project t))
+                       (file-exists-p link))
+                   'muse-link
+                 'muse-bad-link)))))))
+
+(defun muse-colors-use-publishing-directory (link)
+  "Make LINK relative to the directory where we will publish the
+current file."
+  (let ((style (car (muse-project-applicable-styles
+                     link (cddr (muse-project)))))
+        path)
+    (when (and style
+               (setq path (muse-style-element :path style)))
+      (expand-file-name link path))))
+
+(defun muse-colors-resolve-image-file (link)
+  "Determine if we can create images and see if the link is an image
+file."
+  (save-match-data
+    (and (or (fboundp 'create-image)
+             (fboundp 'make-glyph))
+         (not (string-match "\\`[uU][rR][lL]:" link))
+         (string-match muse-image-regexp link))))
+
+(defun muse-make-file-glyph (filename)
+  "Given a file name, return a newly-created image glyph.
+This is a hack for supporting inline images in XEmacs."
+  (let ((case-fold-search nil))
+    ;; Scan filename to determine image type
+    (when (fboundp 'make-glyph)
+      (save-match-data
+        (cond ((string-match "jpe?g" filename)
+               (make-glyph (vector 'jpeg :file filename) 'buffer))
+              ((string-match "gif" filename)
+               (make-glyph (vector 'gif :file filename) 'buffer))
+              ((string-match "png" filename)
+               (make-glyph (vector 'png :file filename) 'buffer)))))))
+
+(defun muse-colors-insert-image (link beg end invis-props)
+  "Create an image using create-image or make-glyph and insert it
+in place of an image link defined by BEG and END."
+  (setq link (expand-file-name link))
+  (let ((image-file (cond
+                     ((eq muse-colors-inline-image-method 'default-directory)
+                      link)
+                     ((functionp muse-colors-inline-image-method)
+                      (funcall muse-colors-inline-image-method link))))
+        glyph)
+    (when (stringp image-file)
+      (if (fboundp 'create-image)
+          ;; use create-image and display property
+          (let ((display-stuff (condition-case nil
+                                   (create-image image-file)
+                                 (error nil))))
+            (when display-stuff
+              (add-text-properties beg end (list 'display display-stuff))))
+        ;; use make-glyph and invisible property
+        (and (setq glyph (muse-make-file-glyph image-file))
+             (progn
+               (add-text-properties beg end invis-props)
+               (add-text-properties beg end (list
+                                             'end-glyph glyph
+                                             'help-echo link))))))))
+
+(defun muse-colors-explicit-link ()
+  "Color explicit links."
+  (when (and (eq ?\[ (char-after (match-beginning 0)))
+             (not (get-text-property (match-beginning 0) 'muse-comment))
+             (not (get-text-property (match-beginning 0) 'muse-directive)))
+    ;; remove flyspell overlays
+    (when (fboundp 'flyspell-unhighlight-at)
+      (let ((cur (match-beginning 0)))
+        (while (> (match-end 0) cur)
+          (flyspell-unhighlight-at cur)
+          (setq cur (1+ cur)))))
+    (let* ((unesc-link (muse-get-link))
+           (unesc-desc (muse-get-link-desc))
+           (link (muse-link-unescape unesc-link))
+           (desc (muse-link-unescape unesc-desc))
+           (props (muse-link-properties desc (muse-link-face link t)))
+           (invis-props (append props (muse-link-properties desc))))
+      ;; see if we should try and inline an image
+      (if (and muse-colors-inline-images
+               (or (muse-colors-resolve-image-file link)
+                   (and desc
+                        (muse-colors-resolve-image-file desc)
+                        (setq link desc))))
+          ;; we found an image, so inline it
+          (muse-colors-insert-image
+           link
+           (match-beginning 0) (match-end 0) invis-props)
+        (if desc
+            (progn
+              ;; we put the normal face properties on the invisible
+              ;; portion too, since emacs sometimes will position
+              ;; the cursor on an intangible character
+              (add-text-properties (match-beginning 0)
+                                   (match-beginning 2) invis-props)
+              (add-text-properties (match-beginning 2) (match-end 2) props)
+              (add-text-properties (match-end 2) (match-end 0) invis-props)
+              ;; in case specials were escaped, cause the unescaped
+              ;; text to be displayed
+              (unless (string= desc unesc-desc)
+                (add-text-properties (match-beginning 2) (match-end 2)
+                                     (list 'display desc))))
+          (add-text-properties (match-beginning 0)
+                               (match-beginning 1) invis-props)
+          (add-text-properties (match-beginning 1) (match-end 0) props)
+          (add-text-properties (match-end 1) (match-end 0) invis-props)
+          (unless (string= link unesc-link)
+            (add-text-properties (match-beginning 1) (match-end 1)
+                                 (list 'display link))))
+        (goto-char (match-end 0))
+        (add-text-properties
+         (match-beginning 0) (match-end 0)
+         (muse-link-properties (muse-match-string-no-properties 0)
+                               (muse-link-face link t)))))))
+
+(defun muse-colors-implicit-link ()
+  "Color implicit links."
+  (unless (or (eq (get-text-property (match-beginning 0) 'invisible) 'muse)
+              (get-text-property (match-beginning 0) 'muse-comment)
+              (get-text-property (match-beginning 0) 'muse-directive)
+              (get-text-property (match-beginning 0) 'muse-no-implicit-link)
+              (eq (char-before (match-beginning 0)) ?\")
+              (eq (char-after (match-end 0)) ?\"))
+    ;; remove flyspell overlays
+    (when (fboundp 'flyspell-unhighlight-at)
+      (let ((cur (match-beginning 0)))
+        (while (> (match-end 0) cur)
+          (flyspell-unhighlight-at cur)
+          (setq cur (1+ cur)))))
+    ;; colorize link
+    (let ((link (muse-match-string-no-properties 0))
+          (face (muse-link-face (match-string 0))))
+      (when face
+        (add-text-properties (match-beginning 0) (match-end 0)
+                             (muse-link-properties
+                              (muse-match-string-no-properties 0) face))))))
+
+(defun muse-colors-title ()
+  "Color #title directives."
+  (let ((beg (+ 7 (match-beginning 0))))
+    (add-text-properties beg (muse-line-end-position) '(muse-directive t))
+    ;; colorize <lisp> tags in #title after other <lisp> tags have had a
+    ;; chance to run, so that we can have behavior that is consistent
+    ;; with how the document is published
+    (setq muse-colors-delayed-commands
+          (cons (list 'muse-colors-title-lisp beg (muse-line-end-position))
+                muse-colors-delayed-commands))))
+
+(defun muse-colors-title-lisp (beg end)
+  "Called after other highlighting is done for a region in order to handle
+<lisp> tags that exist in #title directives."
+  (save-restriction
+    (narrow-to-region beg end)
+    (goto-char (point-min))
+    (let ((muse-colors-inhibit-tags-in-directives nil)
+          (muse-colors-tags '(("lisp" t t nil muse-colors-lisp-tag))))
+      (while (re-search-forward muse-tag-regexp nil t)
+        (muse-colors-custom-tags))))
+  (add-text-properties beg end '(face muse-header-1)))
+
+(defun muse-colors-comment ()
+  "Color comments."
+  (add-text-properties (match-beginning 0) (muse-line-end-position)
+                       (list 'face 'font-lock-comment-face
+                             'muse-comment t)))
+
+
+(provide 'muse-colors)
+
+;;; muse-colors.el ends here
diff --git a/packages/muse/muse-context.el b/packages/muse/muse-context.el
new file mode 100644 (file)
index 0000000..45968b0
--- /dev/null
@@ -0,0 +1,458 @@
+;;; muse-context.el --- publish entries in ConTeXt or PDF format
+
+;; Copyright (C) 2007, 2008, 2009, 2010  Free Software Foundation, Inc.
+
+;; Author: Jean Magnan de Bornier (jean@bornier.net)
+;; Created: 16-Apr-2007
+
+;; Emacs Muse 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, or (at your
+;; option) any later version.
+
+;; This file when loaded allows you to publish .muse files as ConTeXt
+;; files or as pdf files, using respectively the "context" and
+;; "context-pdf" styles. It is far from being perfect, so any feedback
+;; will be welcome and any mistake hopefully fixed.
+
+;;; Author:
+
+;; Jean Magnan de Bornier, who based this file on muse-latex.el and
+;; made the context, context-pdf, context-slides, and
+;; context-slides-pdf Muse publishing styles.
+
+;; 16 Avril 2007
+
+;;; Code:
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Muse ConTeXt Publishing
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'muse-publish)
+
+(defgroup muse-context nil
+  "Rules for marking up a Muse file as a ConTeXt article."
+  :group 'muse-publish)
+
+(defcustom muse-context-extension ".tex"
+  "Default file extension for publishing ConTeXt files."
+  :type 'string
+  :group 'muse-context)
+
+(defcustom muse-context-pdf-extension ".pdf"
+  "Default file extension for publishing ConTeXt files to PDF."
+  :type 'string
+  :group 'muse-context)
+
+(defcustom muse-context-pdf-program "texexec --pdf"
+  "The program that is called to generate PDF content from ConTeXt content."
+  :type 'string
+  :group 'muse-context)
+
+(defcustom muse-context-pdf-cruft '(".pgf" ".tmp" ".tui" ".tuo" ".toc"  ".log")
+  "Extensions of files to remove after generating PDF output successfully."
+  :type 'string
+  :group 'muse-context)
+
+(defcustom muse-context-header
+  "\\setupinteraction [state=start]
+\\usemodule[tikz]
+\\usemodule[bib]\n
+<lisp>(muse-context-setup-bibliography)</lisp>
+ \\setuppublications[]\n
+\\setuppublicationlist[]\n\\setupcite[]\n
+\\starttext
+\\startalignment[center]
+  \\blank[2*big]
+    {\\tfd <lisp>(muse-publishing-directive \"title\")</lisp>}
+  \\blank[3*medium]
+    {\\tfa <lisp>(muse-publishing-directive \"author\")</lisp>}
+  \\blank[2*medium]
+    {\\tfa <lisp>(muse-publishing-directive \"date\")</lisp>}
+  \\blank[3*medium]
+\\stopalignment
+
+<lisp>(and muse-publish-generate-contents
+           (not muse-context-permit-contents-tag)
+           \"\\\\placecontent\n\\\\page[yes]\")</lisp>\n\n"
+  "Header used for publishing ConTeXt files.  This may be text or a filename."
+  :type 'string
+  :group 'muse-context)
+
+(defcustom muse-context-footer "<lisp>(muse-context-bibliography)</lisp>
+\\stoptext\n"
+  "Footer used for publishing ConTeXt files.  This may be text or a filename."
+  :type 'string
+  :group 'muse-context)
+
+(defcustom muse-context-markup-regexps
+  `(;; numeric ranges
+    (10000 "\\([0-9]+\\)-\\([0-9]+\\)" 0 "\\1--\\2")
+
+    ;; be careful of closing quote pairs
+    (10100 "\"'" 0 "\"\\\\-'"))
+  "List of markup regexps for identifying regions in a Muse page.
+For more on the structure of this list, see `muse-publish-markup-regexps'."
+  :type '(repeat (choice
+                  (list :tag "Markup rule"
+                        integer
+                        (choice regexp symbol)
+                        integer
+                        (choice string function symbol))
+                  function))
+  :group 'muse-context)
+
+(defcustom muse-context-markup-functions
+  '((table . muse-context-markup-table))
+  "An alist of style types to custom functions for that kind of text.
+For more on the structure of this list, see
+`muse-publish-markup-functions'."
+  :type '(alist :key-type symbol :value-type function)
+  :group 'muse-context)
+
+(defcustom muse-context-markup-strings
+  '((image-with-desc . "\\placefigure[][]{%3%}{\\externalfigure[%1%.%2%]}")
+    (image           . "\\placefigure[][]{}{\\externalfigure[%s.%s]}")
+    (image-link      . "\\useURL[aa][%s][][%1%] \\from[aa]")
+    (anchor-ref      . "\\goto{%2%}{}[%1%]")
+    (url             . "\\useURL[aa][%s][][%s] \\from[aa]")
+    (url-and-desc    . "\\useURL[bb][%s][][%s]\\from[bb]\\footnote{%1%}")
+    (link            . "\\goto{%2%}[program(%1%)]\\footnote{%1%}")
+    (link-and-anchor . "\\useexternaldocument[%4%][%4%][] \\at{%3%, page}{}[%4%::%2%]\\footnote{%1%}")
+    (email-addr      . "\\useURL[mail][mailto:%s][][%s]\\from[mail]")
+    (anchor          . "\\reference[%s] ")
+    (emdash          . "---")
+    (comment-begin   . "\\doifmode{comment}{")
+    (comment-end     . "}")
+    (rule            . "\\blank[medium]\\hrule\\blank[medium]")
+    (no-break-space  . "~")
+    (enddots         . "\\ldots ")
+    (dots            . "\\dots ")
+    (part            . "\\part{")
+    (part-end        . "}")
+    (chapter         . "\\chapter{")
+    (chapter-end     . "}")
+    (section         . "\\section{")
+    (section-end     . "}")
+    (subsection      . "\\subsection{")
+    (subsection-end  . "}")
+    (subsubsection   . "\\subsubsection{")
+    (subsubsection-end . "}")
+    (section-other   . "\\subsubsubject{")
+    (section-other-end . "}")
+    (footnote        . "\\footnote{")
+    (footnote-end    . "}")
+    (footnotetext    . "\\footnotetext[%d]{")
+    (begin-underline . "\\underbar{")
+    (end-underline   . "}")
+    (begin-literal   . "\\type{")
+    (end-literal     . "}")
+    (begin-emph      . "{\\em ")
+    (end-emph        . "}")
+    (begin-more-emph . "{\\bf ")
+    (end-more-emph   . "}")
+    (begin-most-emph . "{\\bf {\\em ")
+    (end-most-emph   . "}}")
+    (begin-example   . "\\starttyping")
+    (end-example     . "\\stoptyping")
+    (begin-center    . "\\startalignment[center]\n")
+    (end-center      . "\n\\stopalignment")
+    (begin-quote     . "\\startquotation\n")
+    (end-quote       . "\n\\stopquotation")
+    (begin-cite     . "\\cite[authoryear][")
+    (begin-cite-author . "\\cite[author][")
+    (begin-cite-year . "\\cite[year][")
+    (end-cite        . "]")
+    (begin-uli       . "\\startitemize\n")
+    (end-uli         . "\n\\stopitemize")
+    (begin-uli-item  . "\\item ")
+    (begin-oli       . "\\startitemize[n]\n")
+    (end-oli         . "\n\\stopitemize")
+    (begin-oli-item  . "\\item ")
+    (begin-dl        . "\\startitemize\n")
+    (end-dl          . "\n\\stopitemize")
+    (begin-ddt       . "\\head ")
+    (end-ddt         . "\n")
+    (begin-verse     . "\\blank[big]")
+    (end-verse-line  . "\\par")
+    (verse-space     . "\\fixedspaces ~~")
+    (end-verse       . "\\blank[big]"))
+  "Strings used for marking up text.
+These cover the most basic kinds of markup, the handling of which
+differs little between the various styles."
+  :type '(alist :key-type symbol :value-type string)
+  :group 'muse-context)
+
+(defcustom muse-context-slides-header
+  "\\usemodule[<lisp>(if (string-equal (muse-publishing-directive \"module\") nil) \"pre-01\" (muse-publishing-directive \"module\"))</lisp>]
+\\usemodule[tikz]
+\\usemodule[newmat]
+\\setupinteraction [state=start]
+\\starttext
+\\TitlePage { <lisp>(muse-publishing-directive \"title\")</lisp>
+\\blank[3*medium]
+\\tfa <lisp>(muse-publishing-directive \"author\")</lisp>
+ \\blank[2*medium]
+  \\tfa <lisp>(muse-publishing-directive \"date\")</lisp>}"
+  "Header for publishing a presentation (slides) using ConTeXt.
+Any of the predefined modules, which are available in the
+tex/context/base directory, can be used by writing a \"module\"
+directive at the top of the muse file; if no such directive is
+provided, module pre-01 is used.  Alternatively, you can use your
+own style (\"mystyle\", in this example) by replacing
+\"\\usemodule[]\" with \"\\input mystyle\".
+
+This may be text or a filename."
+  :type 'string
+  :group 'muse-context)
+
+(defcustom muse-context-slides-markup-strings
+   '((section      . "\\Topic {")
+     (subsection   . "\\page \n{\\bf ")
+     (subsubsection . "{\\em "))
+  "Strings used for marking up text in ConTeXt slides."
+  :type '(alist :key-type symbol :value-type string)
+  :group 'muse-context)
+
+(defcustom muse-context-markup-specials-document
+  '((?\\ . "\\textbackslash{}")
+    (?\_ . "\\textunderscore{}")
+    (?\< . "\\switchtobodyfont[small]")
+    (?\> . "\\switchtobodyfont[big]")
+    (?^  . "\\^")
+    (?\~ . "\\~")
+    (?\@ . "\\@")
+    (?\$ . "\\$")
+    (?\% . "\\%")
+    (?\{ . "\\{")
+    (?\} . "\\}")
+    (?\& . "\\&")
+    (?\# . "\\#"))
+  "A table of characters which must be represented specially.
+These are applied to the entire document, sans already-escaped
+regions."
+  :type '(alist :key-type character :value-type string)
+  :group 'muse-context)
+
+(defcustom muse-context-markup-specials-example
+  '()
+  "A table of characters which must be represented specially.
+These are applied to <example> regions.
+
+With the default interpretation of <example> regions, no specials
+need to be escaped."
+  :type '(alist :key-type character :value-type string)
+  :group 'muse-context)
+
+(defcustom muse-context-markup-specials-literal
+  '()
+  "A table of characters which must be represented specially.
+This applies to =monospaced text= and <code> regions."
+  :type '(alist :key-type character :value-type string)
+  :group 'muse-context)
+
+(defcustom muse-context-markup-specials-url
+  '((?\\ . "\\textbackslash")
+    (?\_ . "\\_")
+    (?\< . "\\<")
+    (?\> . "\\>")
+    (?\$ . "\\$")
+    (?\% . "\\%")
+    (?\{ . "\\{")
+    (?\} . "\\}")
+    (?\& . "\\&")
+    (?\# . "\\#"))
+  "A table of characters which must be represented specially.
+These are applied to URLs."
+  :type '(alist :key-type character :value-type string)
+  :group 'muse-context)
+
+(defcustom muse-context-markup-specials-image
+  '((?\\ . "\\textbackslash")       ; cannot find suitable replacement
+    (?\< . "\\<")
+    (?\> . "\\>")
+    (?\$ . "\\$")
+    (?\% . "\\%")
+    (?\{ . "\\{")
+    (?\} . "\\}")
+    (?\& . "\\&")
+    (?\# . "\\#")                     ; cannot find suitable replacement
+    )
+  "A table of characters which must be represented specially.
+These are applied to image filenames."
+  :type '(alist :key-type character :value-type string)
+  :group 'muse-context)
+
+(defun muse-context-decide-specials (context)
+  "Determine the specials to escape, depending on the CONTEXT argument."
+  (cond ((memq context '(underline emphasis document url-desc verbatim
+                                   footnote))
+         muse-context-markup-specials-document)
+        ((eq context 'image)
+         muse-context-markup-specials-image)
+        ((memq context '(email url))
+         muse-context-markup-specials-url)
+        ((eq context 'literal)
+         muse-context-markup-specials-literal)
+        ((eq context 'example)
+         muse-context-markup-specials-example)
+        (t (error "Invalid context argument '%s' in muse-context" context))))
+
+(defun muse-context-markup-table ()
+  (let* ((table-info (muse-publish-table-fields (match-beginning 0)
+                                                (match-end 0)))
+         (row-len (car table-info))
+         (field-list (cdr table-info)))
+    (when table-info
+      (muse-insert-markup "\\starttable[|"
+                          (mapconcat 'symbol-name (make-vector row-len 'l)
+                                     "|") "|]\n \\HL\n \\VL ")
+      (dolist (fields field-list)
+        (let ((type (car fields)))
+          (setq fields (cdr fields))
+          (when (= type 3)
+            (muse-insert-markup ""))
+          (insert (car fields))
+          (setq fields (cdr fields))
+          (dolist (field fields)
+            (muse-insert-markup " \\VL ")
+            (insert field))
+          (muse-insert-markup "\\VL\\NR\n \\HL\n \\VL ")
+          (when (= type 2)
+            (muse-insert-markup " "))))
+      (muse-insert-markup "\\stoptable\n")
+      (while (search-backward "VL \\stoptable" nil t)
+        (replace-match "stoptable" nil t)))))
+
+(defun muse-context-fixup-dquotes ()
+  "Fixup double quotes."
+  (goto-char (point-min))
+  (let ((open t))
+    (while (search-forward "\"" nil t)
+      (unless (get-text-property (match-beginning 0) 'read-only)
+        (when (or (bobp)
+                  (eq (char-before) ?\n))
+          (setq open t))
+        (if open
+            (progn
+              (replace-match "``")
+              (setq open nil))
+          (replace-match "''")
+          (setq open t))))))
+
+(defcustom muse-context-permit-contents-tag nil
+  "If nil, ignore <contents> tags.  Otherwise, insert table of contents.
+
+Most of the time, it is best to have a table of contents on the
+first page, with a new page immediately following.  To make this
+work with documents published in both HTML and ConTeXt, we need to
+ignore the <contents> tag.
+
+If you don't agree with this, then set this option to non-nil,
+and it will do what you expect."
+  :type 'boolean
+  :group 'muse-context)
+
+(defun muse-context-fixup-citations ()
+  "Replace semicolons in multi-head citations with colons."
+  (goto-char (point-min))
+  (while (re-search-forward "\\\\cite.?\\[" nil t)
+    (let ((start (point))
+          (end (re-search-forward "]")))
+      (save-restriction
+        (narrow-to-region start end)
+        (goto-char (point-min))
+        (while (re-search-forward ";" nil t)
+          (replace-match ","))))))
+
+(defun muse-context-munge-buffer ()
+  (muse-context-fixup-dquotes)
+  (muse-context-fixup-citations)
+  (when (and muse-context-permit-contents-tag
+             muse-publish-generate-contents)
+    (goto-char (car muse-publish-generate-contents))
+    (muse-insert-markup "\\placecontent")))
+
+(defun muse-context-bibliography ()
+  (save-excursion
+    (goto-char (point-min))
+    (if (re-search-forward "\\\\cite.?\\[" nil t)
+        "\\completepublications[criterium=all]"
+      "")))
+
+(defun muse-context-setup-bibliography ()
+  (save-excursion
+    (goto-char (point-min))
+    (if (re-search-forward "\\\\cite.?\\[" nil t)
+        (concat
+         "\\usemodule[bibltx]\n\\setupbibtex [database="
+         (muse-publishing-directive "bibsource") "]")
+      "")))
+
+(defun muse-context-pdf-browse-file (file)
+  (shell-command (concat "open " file)))
+
+(defun muse-context-pdf-generate (file output-path final-target)
+  (apply
+   #'muse-publish-transform-output
+   file output-path final-target "PDF"
+   (function
+    (lambda (file output-path)
+      (let* ((fnd (file-name-directory output-path))
+             (command (format "%s \"%s\""
+                              muse-context-pdf-program
+                              (file-relative-name file fnd)))
+             (times 0)
+             (default-directory fnd)
+             result)
+        ;; XEmacs can sometimes return a non-number result.  We'll err
+        ;; on the side of caution by continuing to attempt to generate
+        ;; the PDF if this happens and treat the final result as
+        ;; successful.
+        (while (and (< times 2)
+                    (or (not (numberp result))
+                        (not (eq result 0))
+                        ;; table of contents takes 2 passes
+;;                         (file-readable-p
+;;                          (muse-replace-regexp-in-string
+;;                           "\\.tex\\'" ".toc" file t t))
+                        ))
+          (setq result (shell-command command)
+                times (1+ times)))
+        (if (or (not (numberp result))
+                (eq result 0))
+            t
+          nil))))
+   muse-context-pdf-cruft))
+
+(muse-define-style "context"
+                   :suffix    'muse-context-extension
+                   :regexps   'muse-context-markup-regexps
+                   :functions 'muse-context-markup-functions
+                   :strings   'muse-context-markup-strings
+                   :specials  'muse-context-decide-specials
+                   :after     'muse-context-munge-buffer
+                   :header    'muse-context-header
+                   :footer    'muse-context-footer
+                   :browser   'find-file)
+
+(muse-derive-style "context-pdf" "context"
+                   :final   'muse-context-pdf-generate
+                   :browser 'muse-context-pdf-browse-file
+                   :link-suffix 'muse-context-pdf-extension
+                   :osuffix 'muse-context-pdf-extension)
+
+(muse-derive-style "context-slides" "context"
+                   :header  'muse-context-slides-header
+                   :strings 'muse-context-slides-markup-strings)
+
+(muse-derive-style "context-slides-pdf" "context-pdf"
+                   :header  'muse-context-slides-header
+                   :strings 'muse-context-slides-markup-strings)
+
+(provide 'muse-context)
+
+;;; muse-context.el ends here
diff --git a/packages/muse/muse-docbook.el b/packages/muse/muse-docbook.el
new file mode 100644 (file)
index 0000000..a54089f
--- /dev/null
@@ -0,0 +1,352 @@
+;;; muse-docbook.el --- publish DocBook files
+
+;; Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010
+;;   Free Software Foundation, Inc.
+
+;; This file is part of Emacs Muse.  It is not part of GNU Emacs.
+
+;; Emacs Muse 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, or (at your
+;; option) any later version.
+
+;; Emacs Muse 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 Emacs Muse; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;;; Contributors:
+
+;; Dale P. Smith (dpsm AT en DOT com) improved the markup
+;; significantly and made many valuable suggestions.
+
+;;; Code:
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Muse DocBook XML Publishing
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'muse-publish)
+(require 'muse-regexps)
+(require 'muse-xml-common)
+
+(defgroup muse-docbook nil
+  "Options controlling the behavior of Muse DocBook XML publishing.
+See `muse-docbook' for more information."
+  :group 'muse-publish)
+
+(defcustom muse-docbook-extension ".xml"
+  "Default file extension for publishing DocBook XML files."
+  :type 'string
+  :group 'muse-docbook)
+
+(defcustom muse-docbook-header
+  "<?xml version=\"1.0\" encoding=\"<lisp>
+  (muse-docbook-encoding)</lisp>\"?>
+<!DOCTYPE article PUBLIC \"-//OASIS//DTD DocBook V4.2//EN\"
+                  \"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd\"<lisp>(muse-docbook-entities)</lisp>>
+<article>
+  <articleinfo>
+    <title><lisp>(muse-publishing-directive \"title\")</lisp></title>
+    <author><lisp>(muse-docbook-get-author
+                    (muse-publishing-directive \"author\"))</lisp></author>
+    <pubdate><lisp>(muse-publishing-directive \"date\")</lisp></pubdate>
+  </articleinfo>
+  <!-- Page published by Emacs Muse begins here -->\n"
+  "Header used for publishing DocBook XML files.
+This may be text or a filename."
+  :type 'string
+  :group 'muse-docbook)
+
+(defcustom muse-docbook-footer "
+  <!-- Page published by Emacs Muse ends here -->
+<lisp>(muse-docbook-bibliography)</lisp></article>\n"
+  "Footer used for publishing DocBook XML files.
+This may be text or a filename."
+  :type 'string
+  :group 'muse-docbook)
+
+(defcustom muse-docbook-markup-regexps
+  `(;; Beginning of doc, end of doc, or plain paragraph separator
+    (10000 ,(concat "\\(\\(\n\\(?:[" muse-regexp-blank "]*\n\\)*"
+                    "\\([" muse-regexp-blank "]*\n\\)\\)"
+                    "\\|\\`\\s-*\\|\\s-*\\'\\)")
+           3 muse-docbook-markup-paragraph))
+  "List of markup rules for publishing a Muse page to DocBook XML.
+For more on the structure of this list, see `muse-publish-markup-regexps'."
+  :type '(repeat (choice
+                  (list :tag "Markup rule"
+                        integer
+                        (choice regexp symbol)
+                        integer
+                        (choice string function symbol))
+                  function))
+  :group 'muse-docbook)
+
+(defcustom muse-docbook-markup-functions
+  '((anchor . muse-xml-markup-anchor)
+    (table . muse-xml-markup-table))
+  "An alist of style types to custom functions for that kind of text.
+For more on the structure of this list, see
+`muse-publish-markup-functions'."
+  :type '(alist :key-type symbol :value-type function)
+  :group 'muse-docbook)
+
+(defcustom muse-docbook-markup-strings
+  '((image-with-desc . "<mediaobject>
+<imageobject>
+<imagedata fileref=\"%1%.%2%\" format=\"%2%\" />
+</imageobject>
+<caption><para>%3%</para></caption>
+</mediaobject>")
+    (image           . "<inlinemediaobject><imageobject>
+<imagedata fileref=\"%1%.%2%\" format=\"%2%\" />
+</imageobject></inlinemediaobject>")
+    (image-link      . "<ulink url=\"%1%\"><inlinemediaobject><imageobject>
+<imagedata fileref=\"%2%.%3%\" format=\"%3%\" />
+</imageobject></inlinemediaobject></ulink>")
+    (anchor-ref      . "<link linkend=\"%s\">%s</link>")
+    (url             . "<ulink url=\"%s\">%s</ulink>")
+    (link            . "<ulink url=\"%s\">%s</ulink>")
+    (link-and-anchor . "<ulink url=\"%s#%s\">%s</ulink>")
+    (email-addr      . "<email>%s</email>")
+    (anchor          . "<anchor id=\"%s\" />\n")
+    (emdash          . "%s&mdash;%s")
+    (comment-begin   . "<!-- ")
+    (comment-end     . " -->")
+    (rule            . "")
+    (no-break-space  . "&nbsp;")
+    (enddots         . "....")
+    (dots            . "...")
+    (section         . "<section><title>")
+    (section-end     . "</title>")
+    (subsection      . "<section><title>")
+    (subsection-end  . "</title>")
+    (subsubsection   . "<section><title>")
+    (subsubsection-end . "</title>")
+    (section-other   . "<section><title>")
+    (section-other-end . "</title>")
+    (section-close   . "</section>")
+    (footnote        . "<footnote><para>")
+    (footnote-end    . "</para></footnote>")
+    (begin-underline . "")
+    (end-underline   . "")
+    (begin-literal   . "<systemitem>")
+    (end-literal     . "</systemitem>")
+    (begin-emph      . "<emphasis>")
+    (end-emph        . "</emphasis>")
+    (begin-more-emph . "<emphasis role=\"strong\">")
+    (end-more-emph   . "</emphasis>")
+    (begin-most-emph . "<emphasis role=\"strong\"><emphasis>")
+    (end-most-emph   . "</emphasis></emphasis>")
+    (begin-verse     . "<literallayout>\n")
+    (verse-space     . "  ")
+    (end-verse       . "</literallayout>")
+    (begin-example   . "<programlisting>")
+    (end-example     . "</programlisting>")
+    (begin-center    . "<para role=\"centered\">\n")
+    (end-center      . "\n</para>")
+    (begin-quote     . "<blockquote>\n")
+    (end-quote       . "\n</blockquote>")
+    (begin-cite      . "<citation role=\"%s\">")
+    (begin-cite-author . "<citation role=\"%s\">A:")
+    (begin-cite-year . "<citation role=\"%s\">Y:")
+    (end-cite        . "</citation>")
+    (begin-quote-item . "<para>")
+    (end-quote-item  . "</para>")
+    (begin-uli       . "<itemizedlist mark=\"bullet\">\n")
+    (end-uli         . "\n</itemizedlist>")
+    (begin-uli-item  . "<listitem><para>")
+    (end-uli-item    . "</para></listitem>")
+    (begin-oli       . "<orderedlist>\n")
+    (end-oli         . "\n</orderedlist>")
+    (begin-oli-item  . "<listitem><para>")
+    (end-oli-item    . "</para></listitem>")
+    (begin-dl        . "<variablelist>\n")
+    (end-dl          . "\n</variablelist>")
+    (begin-dl-item   . "<varlistentry>\n")
+    (end-dl-item     . "\n</varlistentry>")
+    (begin-ddt       . "<term>")
+    (end-ddt         . "</term>")
+    (begin-dde       . "<listitem><para>")
+    (end-dde         . "</para></listitem>")
+    (begin-table     . "<informaltable>\n")
+    (end-table       . "</informaltable>")
+    (begin-table-group . "  <tgroup cols='%s'>\n")
+    (end-table-group . "  </tgroup>\n")
+    (begin-table-row . "    <row>\n")
+    (end-table-row   . "    </row>\n")
+    (begin-table-entry . "      <entry>")
+    (end-table-entry . "</entry>\n"))
+  "Strings used for marking up text.
+These cover the most basic kinds of markup, the handling of which
+differs little between the various styles."
+  :type '(alist :key-type symbol :value-type string)
+  :group 'muse-docbook)
+
+(defcustom muse-docbook-encoding-default 'utf-8
+  "The default Emacs buffer encoding to use in published files.
+This will be used if no special characters are found."
+  :type 'symbol
+  :group 'muse-docbook)
+
+(defcustom muse-docbook-charset-default "utf-8"
+  "The default DocBook XML charset to use if no translation is
+found in `muse-docbook-encoding-map'."
+  :type 'string
+  :group 'muse-docbook)
+
+(defun muse-docbook-encoding ()
+  (muse-xml-transform-content-type
+   (or (and (boundp 'buffer-file-coding-system)
+            buffer-file-coding-system)
+       muse-docbook-encoding-default)
+   muse-docbook-charset-default))
+
+(defun muse-docbook-markup-paragraph ()
+  (catch 'bail-out
+    (let ((end (copy-marker (match-end 0) t)))
+      (goto-char (match-beginning 0))
+      (when (save-excursion
+              (save-match-data
+                (and (not (get-text-property (max (point-min) (1- (point)))
+                                             'muse-no-paragraph))
+                     (re-search-backward
+                      "<\\(/?\\)\\(para\\|footnote\\|literallayout\\)[ >]"
+                      nil t)
+                     (cond ((string= (match-string 2) "literallayout")
+                            (and (not (string= (match-string 1) "/"))
+                                 (throw 'bail-out t)))
+                           ((string= (match-string 2) "para")
+                            (and
+                             (not (string= (match-string 1) "/"))
+                             ;; don't mess up nested lists
+                             (not (and (muse-looking-back "<listitem>")
+                                       (throw 'bail-out t)))))
+                           ((string= (match-string 2) "footnote")
+                            (string= (match-string 1) "/"))
+                           (t nil)))))
+        (when (get-text-property (1- (point)) 'muse-end-list)
+          (goto-char (previous-single-property-change (1- (point))
+                                                      'muse-end-list)))
+        (muse-insert-markup "</para>"))
+      (goto-char end))
+    (cond
+     ((eobp)
+      (unless (bolp)
+        (insert "\n")))
+     ((get-text-property (point) 'muse-no-paragraph)
+      (forward-char 1)
+      nil)
+     ((eq (char-after) ?\<)
+      (when (looking-at (concat "<\\(emphasis\\|systemitem\\|inlinemediaobject"
+                                "\\|u?link\\|anchor\\|email\\)[ >]"))
+        (muse-insert-markup "<para>")))
+     (t
+      (muse-insert-markup "<para>")))))
+
+(defun muse-docbook-get-author (&optional author)
+  "Split the AUTHOR directive into separate fields.
+AUTHOR should be of the form: \"Firstname Other Names Lastname\",
+and anything after `Firstname' is optional."
+  (setq author (save-match-data (split-string author)))
+  (let ((num-el (length author)))
+    (cond ((eq num-el 1)
+           (concat "<firstname>" (car author) "</firstname>"))
+          ((eq num-el 2)
+           (concat "<firstname>" (nth 0 author) "</firstname>"
+                   "<surname>" (nth 1 author) "</surname>"))
+          ((eq num-el 3)
+           (concat "<firstname>" (nth 0 author) "</firstname>"
+                   "<othername>" (nth 1 author) "</othername>"
+                   "<surname>" (nth 2 author) "</surname>"))
+          (t
+           (let (first last)
+             (setq first (car author))
+             (setq author (nreverse (cdr author)))
+             (setq last (car author))
+             (setq author (nreverse (cdr author)))
+             (concat "<firstname>" first "</firstname>"
+                     "<othername>"
+                     (mapconcat 'identity author " ")
+                     "</othername>"
+                     "<surname>" last "</surname>"))))))
+
+(defun muse-docbook-fixup-images ()
+  (goto-char (point-min))
+  (while (re-search-forward (concat "<imagedata fileref=\"[^\"]+\""
+                                    " format=\"\\([^\"]+\\)\" />$")
+                            nil t)
+    (replace-match (upcase (match-string 1)) t t nil 1)))
+
+(defun muse-docbook-fixup-citations ()
+  ;; remove the role attribute if there is no role
+  (goto-char (point-min))
+  (while (re-search-forward "<\\(citation role=\"nil\"\\)>" nil t)
+    (replace-match "citation" t t nil 1))
+  ;; replace colons in multi-head citations with semicolons
+  (goto-char (point-min))
+  (while (re-search-forward "<citation.*>" nil t)
+    (let ((start (point))
+          (end (re-search-forward "</citation>")))
+      (save-restriction
+        (narrow-to-region start end)
+        (goto-char (point-min))
+        (while (re-search-forward "," nil t)
+          (replace-match ";"))))))
+
+(defun muse-docbook-munge-buffer ()
+  (muse-docbook-fixup-images)
+  (muse-docbook-fixup-citations))
+
+(defun muse-docbook-entities ()
+  (save-excursion
+    (goto-char (point-min))
+    (if (re-search-forward "<citation" nil t)
+        (concat
+         " [\n<!ENTITY bibliography SYSTEM \""
+         (if (string-match ".short$" (muse-page-name))
+             (substring (muse-page-name) 0 -6)
+           (muse-page-name))
+         ".bib.xml\">\n]")
+      "")))
+
+(defun muse-docbook-bibliography ()
+  (save-excursion
+    (goto-char (point-min))
+    (if (re-search-forward "<citation" nil t)
+        "&bibliography;\n"
+      "")))
+
+(defun muse-docbook-finalize-buffer ()
+  (when (boundp 'buffer-file-coding-system)
+    (when (memq buffer-file-coding-system '(no-conversion undecided-unix))
+      ;; make it agree with the default charset
+      (setq buffer-file-coding-system muse-docbook-encoding-default))))
+
+;;; Register the Muse DocBook XML Publisher
+
+(muse-define-style "docbook"
+                   :suffix     'muse-docbook-extension
+                   :regexps    'muse-docbook-markup-regexps
+                   :functions  'muse-docbook-markup-functions
+                   :strings    'muse-docbook-markup-strings
+                   :specials   'muse-xml-decide-specials
+                   :before-end 'muse-docbook-munge-buffer
+                   :after      'muse-docbook-finalize-buffer
+                   :header     'muse-docbook-header
+                   :footer     'muse-docbook-footer
+                   :browser    'find-file)
+
+(provide 'muse-docbook)
+
+;;; muse-docbook.el ends here
diff --git a/packages/muse/muse-groff.el b/packages/muse/muse-groff.el
new file mode 100644 (file)
index 0000000..7218652
--- /dev/null
@@ -0,0 +1,274 @@
+;;; muse-groff.el --- publish groff -mom -mwww files
+
+;; Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010
+;;   Free Software Foundation, Inc.
+
+;; Author: Andrew J. Korty (ajk AT iu DOT edu)
+;; Date: Tue 5-Jul-2005
+
+;; This file is part of Emacs Muse.  It is not part of GNU Emacs.
+
+;; Emacs Muse 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, or (at your
+;; option) any later version.
+
+;; Emacs Muse 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 Emacs Muse; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;;; Contributors:
+
+;;; Code:
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Muse Publishing Using groff -mom -mwww
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'muse-publish)
+
+(defgroup muse-groff nil
+  "Rules for marking up a Muse file with groff -mom -mwww macros."
+  :group 'muse-publish)
+
+(defcustom muse-groff-extension ".groff"
+  "Default file extension for publishing groff -mom -mwww files."
+  :type 'string
+  :group 'muse-groff)
+
+(defcustom muse-groff-pdf-extension ".pdf"
+  "Default file extension for publishing groff -mom -mwww files to PDF."
+  :type 'string
+  :group 'muse-groff)
+
+(defcustom muse-groff-header
+  ".TITLE \"<lisp>(muse-publishing-directive \"title\")</lisp>\"
+.SUBTITLE \"<lisp>(muse-publishing-directive \"date\")</lisp>\"
+.AUTHOR \"<lisp>(muse-publishing-directive \"author\")</lisp>\"
+.PRINTSTYLE TYPESET
+.de list
+.    LIST \\$1
+.    SHIFT_LIST \\$2
+..
+.PARA_INDENT 0
+.START
+<lisp>(and muse-publish-generate-contents \".TOC\n\")</lisp>\n"
+  "Header used for publishing groff -mom -mwww files."
+  :type '(choice string file)
+  :group 'muse-groff)
+
+(defcustom muse-groff-footer " "
+  "Footer used for publishing groff -mom -mwww files."
+  :type '(choice string file)
+  :group 'muse-groff)
+
+(defcustom muse-groff-markup-regexps
+  `((10400 ,(concat "\\(\n</\\(blockquote\\|center\\)>\\)?\n"
+                    "\\(["
+                    muse-regexp-blank
+                    "]*\n\\)+\\(<\\(blockquote\\|center\\)>\n\\)?")
+           0 muse-groff-markup-paragraph))
+"List of markup regexps for identifying regions in a Muse page.
+For more on the structure of this list, see `muse-publish-markup-regexps'."
+  :type '(repeat (choice
+                  (list :tag "Markup rule"
+                        integer
+                        (choice regexp symbol)
+                        integer
+                        (choice string function symbol))
+                  function))
+  :group 'muse-groff)
+
+(defcustom muse-groff-markup-functions
+  '((table . muse-groff-markup-table))
+  "An alist of style types to custom functions for that kind of text.
+For more on the structure of this list, see
+`muse-publish-markup-functions'."
+  :type '(alist :key-type symbol :value-type function)
+  :group 'muse-groff)
+
+(defcustom muse-groff-markup-tags
+  '()
+  "A list of tag specifications, for specially marking up GROFF."
+  :type '(repeat (list (string :tag "Markup tag")
+                       (boolean :tag "Expect closing tag" :value t)
+                       (boolean :tag "Parse attributes" :value nil)
+                       (boolean :tag "Nestable" :value nil)
+                       function))
+  :group 'muse-groff)
+
+(defcustom muse-groff-markup-strings
+  `((image-with-desc . "\n.MPIMG -R %s.%s\n")
+    (image           . "\n.MPIMG -R %s.%s\n")
+    (image-link      . "\n.\\\" %s\n.MPIMG -R %s.%s")
+    (url             . "\n.URL %s %s\n\\z")
+    (link            . "\n.URL %s %s\n\\z")
+    (email-addr      . "\f[C]%s\f[]")
+    (emdash          . "\\(em")
+    (rule            . "\n.RULE\n")
+    (no-break-space  . "\\h")
+    (line-break      . "\\p")
+    (enddots         . "....")
+    (dots            . "...")
+;;     (part            . "\\part{")
+;;     (part-end        . "}")
+;;     (chapter         . "\\chapter{")
+;;     (chapter-end     . "}")
+    (section         . ".HEAD \"")
+    (section-end     . "\"")
+    (subsection      . ".SUBHEAD \"")
+    (subsection-end  . "\"")
+    (subsubsection   . ".PARAHEAD \"")
+    (subsubsection-end . "\"")
+;;     (footnote        . "\\c\n.FOOTNOTE\n")
+;;     (footnote-end    . "\n.FOOTNOTE OFF\n")
+;;     (footnotemark    . "\\footnotemark[%d]")
+;;     (footnotetext    . "\\footnotetext[%d]{")
+;;     (footnotetext-end . "}")
+    (begin-underline . "\n.UNDERSCORE \"")
+    (end-underline   . "\"\n")
+    (begin-literal   . "\\fC")
+    (end-literal     . "\\fP")
+    (begin-emph      . "\\fI")
+    (end-emph        . "\\fP")
+    (begin-more-emph . "\\fB")
+    (end-more-emph   . "\\fP")
+    (begin-most-emph . "\\f(BI")
+    (end-most-emph   . "\\fP")
+    (begin-verse     . ".QUOTE")
+    (end-verse       . ".QUOTE OFF")
+    (begin-center    . "\n.CENTER\n")
+    (end-center      . "\n.QUAD L\n")
+    (begin-example   . ,(concat
+                         ".QUOTE_FONT CR\n.QUOTE_INDENT 1\n"".QUOTE_SIZE -2\n"
+                         ".UNDERLINE_QUOTES OFF\n.QUOTE"))
+    (end-example     . ".QUOTE OFF")
+    (begin-quote     . ".BLOCKQUOTE")
+    (end-quote       . ".BLOCKQUOTE OFF")
+    (begin-cite     . "")
+    (begin-cite-author . "")
+    (begin-cite-year . "")
+    (end-cite        . "")
+    (begin-uli       . ".list BULLET\n.SHIFT_LIST 2m\n.ITEM\n")
+    (end-uli         . "\n.LIST OFF")
+    (begin-oli       . ".list DIGIT\n.SHIFT_LIST 2m\n.ITEM\n")
+    (end-oli         . "\n.LIST OFF")
+    (begin-ddt       . "\\fB")
+    (begin-dde       . "\\fP\n.IR 4P\n")
+    (end-ddt         . ".IRX CLEAR"))
+  "Strings used for marking up text.
+These cover the most basic kinds of markup, the handling of which
+differs little between the various styles."
+  :type '(alist :key-type symbol :value-type string)
+  :group 'muse-groff)
+
+(defcustom muse-groff-markup-specials
+  '((?\\ . "\\e"))
+  "A table of characters which must be represented specially."
+  :type '(alist :key-type character :value-type string)
+  :group 'muse-groff)
+
+(defun muse-groff-markup-paragraph ()
+  (let ((end (copy-marker (match-end 0) t)))
+    (goto-char (1+ (match-beginning 0)))
+    (delete-region (point) end)
+    (unless (looking-at "\.\\(\\(\\(SUB\\|PARA\\)?HEAD \\)\\|RULE$\\)")
+      (muse-insert-markup ".ALD .5v\n.PP\n.ne 2\n"))))
+
+(defun muse-groff-protect-leading-chars ()
+  "Protect leading periods and apostrophes from being interpreted as
+command characters."
+  (while (re-search-forward "^[.']" nil t)
+    (replace-match "\\\\&\\&" t)))
+
+(defun muse-groff-concat-lists ()
+  "Join like lists."
+  (let ((type "")
+        arg begin)
+    (while (re-search-forward "^\.LIST[ \t]+\\(.*\\)\n" nil t)
+      (setq arg (match-string 1))
+      (if (string= arg "OFF")
+          (setq begin (match-beginning 0))
+        (if (and begin (string= type arg))
+            (delete-region begin (match-end 0))
+          (setq type arg
+                begin 0))))))
+
+(defun muse-groff-fixup-dquotes ()
+  "Fixup double quotes."
+  (let ((open t))
+    (while (search-forward "\"" nil t)
+      (unless (get-text-property (match-beginning 0) 'read-only)
+        (if (and (bolp) (eq (char-before) ?\n))
+            (setq open t))
+        (if open
+            (progn
+              (replace-match "``")
+              (setq open nil))
+          (replace-match "''")
+          (setq open t))))))
+
+(defun muse-groff-prepare-buffer ()
+  (goto-char (point-min))
+  (muse-groff-protect-leading-chars))
+
+(defun muse-groff-munge-buffer ()
+  (goto-char (point-min))
+  (muse-groff-concat-lists))
+
+(defun muse-groff-pdf-browse-file (file)
+  (shell-command (concat "open " file)))
+
+(defun muse-groff-pdf-generate (file output-path final-target)
+  (muse-publish-transform-output
+   file output-path final-target "PDF"
+   (function
+    (lambda (file output-path)
+      (let ((command
+             (format
+              (concat "file=%s; ext=%s; cd %s && cp $file$ext $file.ref && "
+                      "groff -mom -mwww -t $file$ext > $file.ps && "
+                      "pstopdf $file.ps")
+              (file-name-sans-extension file)
+              muse-groff-extension
+              (file-name-directory output-path))))
+        (shell-command command))))
+   ".ps"))
+
+;;; Register the Muse GROFF Publisher
+
+(muse-define-style "groff"
+                   :suffix    'muse-groff-extension
+                   :regexps   'muse-groff-markup-regexps
+;;;               :functions 'muse-groff-markup-functions
+                   :strings   'muse-groff-markup-strings
+                   :tags      'muse-groff-markup-tags
+                   :specials  'muse-groff-markup-specials
+                   :before    'muse-groff-prepare-buffer
+                   :before-end 'muse-groff-munge-buffer
+                   :header    'muse-groff-header
+                   :footer    'muse-groff-footer
+                   :browser   'find-file)
+
+(muse-derive-style "groff-pdf" "groff"
+                   :final   'muse-groff-pdf-generate
+                   :browser 'muse-groff-pdf-browse-file
+                   :osuffix 'muse-groff-pdf-extension)
+
+(provide 'muse-groff)
+
+;;; muse-groff.el ends here
+;;
+;; Local Variables:
+;; indent-tabs-mode: nil
+;; End:
diff --git a/packages/muse/muse-html.el b/packages/muse/muse-html.el
new file mode 100644 (file)
index 0000000..6a9356b
--- /dev/null
@@ -0,0 +1,754 @@
+;;; muse-html.el --- publish to HTML and XHTML
+
+;; Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010
+;;   Free Software Foundation, Inc.
+
+;; This file is part of Emacs Muse.  It is not part of GNU Emacs.
+
+;; Emacs Muse 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, or (at your
+;; option) any later version.
+
+;; Emacs Muse 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 Emacs Muse; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;;; Contributors:
+
+;; Zhiqiang Ye (yezq AT mail DOT cbi DOT pku DOT edu DOT cn) suggested
+;; appending an 'encoding="..."' fragment to the first line of the
+;; sample publishing header so that when editing the resulting XHTML
+;; file, Emacs would use the proper encoding.
+
+;; Sun Jiyang (sunyijiang AT gmail DOT com) came up with the idea for
+;; the <src> tag and provided an implementation for emacs-wiki.
+
+;; Charles Wang (wcy123 AT gmail DOT com) provided an initial
+;; implementation of the <src> tag for Muse.
+
+;; Clinton Ebadi (clinton AT unknownlamer DOT org) provided further
+;; ideas for the implementation of the <src> tag.
+
+;;; Code:
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Muse HTML Publishing
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'muse-publish)
+(require 'muse-regexps)
+(require 'muse-xml-common)
+
+(defgroup muse-html nil
+  "Options controlling the behavior of Muse HTML publishing."
+  :group 'muse-publish)
+
+(defcustom muse-html-extension ".html"
+  "Default file extension for publishing HTML files."
+  :type 'string
+  :group 'muse-html)
+
+(defcustom muse-xhtml-extension ".html"
+  "Default file extension for publishing XHTML files."
+  :type 'string
+  :group 'muse-html)
+
+(defcustom muse-html-style-sheet
+  "<style type=\"text/css\">
+body {
+  background: white; color: black;
+  margin-left: 3%; margin-right: 7%;
+}
+
+p { margin-top: 1% }
+p.verse { margin-left: 3% }
+
+.example { margin-left: 3% }
+
+h2 {
+  margin-top: 25px;
+  margin-bottom: 0px;
+}
+h3 { margin-bottom: 0px; }
+    </style>"
+  "Store your stylesheet definitions here.
+This is used in `muse-html-header'.
+You can put raw CSS in here or a <link> tag to an external stylesheet.
+This text may contain <lisp> markup tags.
+
+An example of using <link> is as follows.
+
+<link rel=\"stylesheet\" type=\"text/css\" charset=\"utf-8\" media=\"all\" href=\"/default.css\">"
+  :type 'string
+  :group 'muse-html)
+
+(defcustom muse-xhtml-style-sheet
+  "<style type=\"text/css\">
+body {
+  background: white; color: black;
+  margin-left: 3%; margin-right: 7%;
+}
+
+p { margin-top: 1% }
+p.verse { margin-left: 3% }
+
+.example { margin-left: 3% }
+
+h2 {
+  margin-top: 25px;
+  margin-bottom: 0px;
+}
+h3 { margin-bottom: 0px; }
+    </style>"
+  "Store your stylesheet definitions here.
+This is used in `muse-xhtml-header'.
+You can put raw CSS in here or a <link> tag to an external stylesheet.
+This text may contain <lisp> markup tags.
+
+An example of using <link> is as follows.
+
+<link rel=\"stylesheet\" type=\"text/css\" charset=\"utf-8\" media=\"all\" href=\"/default.css\" />"
+  :type 'string
+  :group 'muse-html)
+
+(defcustom muse-html-header
+  "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">
+<html>
+  <head>
+    <title><lisp>
+  (concat (muse-publishing-directive \"title\")
+          (let ((author (muse-publishing-directive \"author\")))
+            (if (not (string= author (user-full-name)))
+                (concat \" (by \" author \")\"))))</lisp></title>
+    <meta name=\"generator\" content=\"muse.el\">
+    <meta http-equiv=\"<lisp>muse-html-meta-http-equiv</lisp>\"
+          content=\"<lisp>muse-html-meta-content-type</lisp>\">
+    <lisp>
+      (let ((maintainer (muse-style-element :maintainer)))
+        (when maintainer
+          (concat \"<link rev=\\\"made\\\" href=\\\"\" maintainer \"\\\">\")))
+    </lisp><lisp>
+      (muse-style-element :style-sheet muse-publishing-current-style)
+    </lisp>
+  </head>
+  <body>
+    <h1><lisp>
+  (concat (muse-publishing-directive \"title\")
+          (let ((author (muse-publishing-directive \"author\")))
+            (if (not (string= author (user-full-name)))
+                (concat \" (by \" author \")\"))))</lisp></h1>
+    <!-- Page published by Emacs Muse begins here -->\n"
+  "Header used for publishing HTML files.  This may be text or a filename."
+  :type 'string
+  :group 'muse-html)
+
+(defcustom muse-html-footer "
+<!-- Page published by Emacs Muse ends here -->
+  </body>
+</html>\n"
+  "Footer used for publishing HTML files.  This may be text or a filename."
+  :type 'string
+  :group 'muse-html)
+
+(defcustom muse-xhtml-header
+  "<?xml version=\"1.0\" encoding=\"<lisp>
+  (muse-html-encoding)</lisp>\"?>
+<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"
+    \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">
+<html xmlns=\"http://www.w3.org/1999/xhtml\">
+  <head>
+    <title><lisp>
+  (concat (muse-publishing-directive \"title\")
+          (let ((author (muse-publishing-directive \"author\")))
+            (if (not (string= author (user-full-name)))
+                (concat \" (by \" author \")\"))))</lisp></title>
+    <meta name=\"generator\" content=\"muse.el\" />
+    <meta http-equiv=\"<lisp>muse-html-meta-http-equiv</lisp>\"
+          content=\"<lisp>muse-html-meta-content-type</lisp>\" />
+    <lisp>
+      (let ((maintainer (muse-style-element :maintainer)))
+        (when maintainer
+          (concat \"<link rev=\\\"made\\\" href=\\\"\" maintainer \"\\\" />\")))
+    </lisp><lisp>
+      (muse-style-element :style-sheet muse-publishing-current-style)
+    </lisp>
+  </head>
+  <body>
+    <h1><lisp>
+  (concat (muse-publishing-directive \"title\")
+          (let ((author (muse-publishing-directive \"author\")))
+            (if (not (string= author (user-full-name)))
+                (concat \" (by \" author \")\"))))</lisp></h1>
+    <!-- Page published by Emacs Muse begins here -->\n"
+  "Header used for publishing XHTML files.  This may be text or a filename."
+  :type 'string
+  :group 'muse-html)
+
+(defcustom muse-xhtml-footer "
+<!-- Page published by Emacs Muse ends here -->
+  </body>
+</html>\n"
+  "Footer used for publishing XHTML files.  This may be text or a filename."
+  :type 'string
+  :group 'muse-html)
+
+(defcustom muse-html-anchor-on-word nil
+  "When true, anchors surround the closest word. This allows you
+to select them in a browser (i.e. for pasting), but has the
+side-effect of marking up headers in multiple colors if your
+header style is different from your link style."
+  :type 'boolean
+  :group 'muse-html)
+
+(defcustom muse-html-table-attributes
+  " class=\"muse-table\" border=\"2\" cellpadding=\"5\""
+  "The attribute to be used with HTML <table> tags.
+Note that Muse supports insertion of raw HTML tags, as long
+as you wrap the region in <literal></literal>."
+  :type 'string
+  :group 'muse-html)
+
+(defcustom muse-html-markup-regexps
+  `(;; Beginning of doc, end of doc, or plain paragraph separator
+    (10000 ,(concat "\\(\\(\n\\(?:[" muse-regexp-blank "]*\n\\)*"
+                    "\\([" muse-regexp-blank "]*\n\\)\\)"
+                    "\\|\\`\\s-*\\|\\s-*\\'\\)")
+           ;; this is somewhat repetitive because we only require the
+           ;; line just before the paragraph beginning to be not
+           ;; read-only
+           3 muse-html-markup-paragraph))
+  "List of markup rules for publishing a Muse page to HTML.
+For more on the structure of this list, see `muse-publish-markup-regexps'."
+  :type '(repeat (choice
+                  (list :tag "Markup rule"
+                        integer
+                        (choice regexp symbol)
+                        integer
+                        (choice string function symbol))
+                  function))
+  :group 'muse-html)
+
+(defcustom muse-html-markup-functions
+  '((anchor   . muse-html-markup-anchor)
+    (table    . muse-html-markup-table)
+    (footnote . muse-html-markup-footnote))
+  "An alist of style types to custom functions for that kind of text.
+For more on the structure of this list, see
+`muse-publish-markup-functions'."
+  :type '(alist :key-type symbol :value-type function)
+  :group 'muse-html)
+
+(defcustom muse-html-markup-strings
+  '((image-with-desc . "<table class=\"image\" width=\"100%%\">
+  <tr><td align=\"center\"><img src=\"%1%.%2%\" alt=\"%3%\"></td></tr>
+  <tr><td align=\"center\" class=\"image-caption\">%3%</td></tr>
+</table>")
+    (image           . "<img src=\"%s.%s\" alt=\"\">")
+    (image-link      . "<a class=\"image-link\" href=\"%s\">
+<img src=\"%s.%s\"></a>")
+    (anchor-ref      . "<a href=\"#%s\">%s</a>")
+    (url             . "<a href=\"%s\">%s</a>")
+    (link            . "<a href=\"%s\">%s</a>")
+    (link-and-anchor . "<a href=\"%s#%s\">%s</a>")
+    (email-addr      . "<a href=\"mailto:%s\">%s</a>")
+    (anchor          . "<a name=\"%1%\" id=\"%1%\">")
+    (emdash          . "%s&mdash;%s")
+    (comment-begin   . "<!-- ")
+    (comment-end     . " -->")
+    (rule            . "<hr>")
+    (fn-sep          . "<hr>\n")
+    (no-break-space  . "&nbsp;")
+    (line-break      . "<br>")
+    (enddots         . "....")
+    (dots            . "...")
+    (section         . "<h2>")
+    (section-end     . "</h2>")
+    (subsection      . "<h3>")
+    (subsection-end  . "</h3>")
+    (subsubsection   . "<h4>")
+    (subsubsection-end . "</h4>")
+    (section-other   . "<h5>")
+    (section-other-end . "</h5>")
+    (begin-underline . "<u>")
+    (end-underline   . "</u>")
+    (begin-literal   . "<code>")
+    (end-literal     . "</code>")
+    (begin-cite      . "<span class=\"citation\">")
+    (begin-cite-author . "<span class=\"citation-author\">")
+    (begin-cite-year . "<span class=\"citation-year\">")
+    (end-cite        . "</span>")
+    (begin-emph      . "<em>")
+    (end-emph        . "</em>")
+    (begin-more-emph . "<strong>")
+    (end-more-emph   . "</strong>")
+    (begin-most-emph . "<strong><em>")
+    (end-most-emph   . "</em></strong>")
+    (begin-verse     . "<p class=\"verse\">\n")
+    (verse-space     . "&nbsp;&nbsp;")
+    (end-verse-line  . "<br>")
+    (end-last-stanza-line . "<br>")
+    (empty-verse-line . "<br>")
+    (end-verse       . "</p>")
+    (begin-example   . "<pre class=\"example\">")
+    (end-example     . "</pre>")
+    (begin-center    . "<center>\n<p>")
+    (end-center      . "</p>\n</center>")
+    (begin-quote     . "<blockquote>\n")
+    (end-quote       . "\n</blockquote>")
+    (begin-quote-item . "<p class=\"quoted\">")
+    (end-quote-item  . "</p>")
+    (begin-uli       . "<ul>\n")
+    (end-uli         . "\n</ul>")
+    (begin-uli-item  . "<li>")
+    (end-uli-item    . "</li>")
+    (begin-oli       . "<ol>\n")
+    (end-oli         . "\n</ol>")
+    (begin-oli-item  . "<li>")
+    (end-oli-item    . "</li>")
+    (begin-dl        . "<dl>\n")
+    (end-dl          . "\n</dl>")
+    (begin-ddt       . "<dt><strong>")
+    (end-ddt         . "</strong></dt>")
+    (begin-dde       . "<dd>")
+    (end-dde         . "</dd>")
+    (begin-table     . "<table%s>\n")
+    (end-table       . "</table>")
+    (begin-table-row . "    <tr>\n")
+    (end-table-row   . "    </tr>\n")
+    (begin-table-entry . "      <%s>")
+    (end-table-entry . "</%s>\n"))
+  "Strings used for marking up text as HTML.
+These cover the most basic kinds of markup, the handling of which
+differs little between the various styles."
+  :type '(alist :key-type symbol :value-type string)
+  :group 'muse-html)
+
+(defcustom muse-xhtml-markup-strings
+  '((image-with-desc . "<table class=\"image\" width=\"100%%\">
+  <tr><td align=\"center\"><img src=\"%1%.%2%\" alt=\"%3%\" /></td></tr>
+  <tr><td align=\"center\" class=\"image-caption\">%3%</td></tr>
+</table>")
+    (image           . "<img src=\"%s.%s\" alt=\"\" />")
+    (image-link      . "<a class=\"image-link\" href=\"%s\">
+<img src=\"%s.%s\" alt=\"\" /></a>")
+    (rule            . "<hr />")
+    (fn-sep          . "<hr />\n")
+    (line-break      . "<br />")
+    (begin-underline . "<span style=\"text-decoration: underline;\">")
+    (end-underline   . "</span>")
+    (begin-center    . "<p style=\"text-align: center;\">\n")
+    (end-center      . "\n</p>")
+    (end-verse-line  . "<br />")
+    (end-last-stanza-line . "<br />")
+    (empty-verse-line . "<br />"))
+  "Strings used for marking up text as XHTML.
+These cover the most basic kinds of markup, the handling of which
+differs little between the various styles.
+
+If a markup rule is not found here, `muse-html-markup-strings' is
+searched."
+  :type '(alist :key-type symbol :value-type string)
+  :group 'muse-html)
+
+(defcustom muse-xhtml1.1-markup-strings
+  '((anchor          . "<a id=\"%s\">"))
+  "Strings used for marking up text as XHTML 1.1.
+These cover the most basic kinds of markup, the handling of which
+differs little between the various styles.
+
+If a markup rule is not found here, `muse-xhtml-markup-strings'
+and `muse-html-markup-strings' are searched."
+  :type '(alist :key-type symbol :value-type string)
+  :group 'muse-html)
+
+(defcustom muse-html-markup-tags
+  '(("class" t t   t muse-html-class-tag)
+    ("div"   t t   t muse-html-div-tag)
+    ("src"   t t nil muse-html-src-tag))
+ "A list of tag specifications, for specially marking up HTML."
+  :type '(repeat (list (string :tag "Markup tag")
+                       (boolean :tag "Expect closing tag" :value t)
+                       (boolean :tag "Parse attributes" :value nil)
+                       (boolean :tag "Nestable" :value nil)
+                       function))
+  :group 'muse-html)
+
+(defcustom muse-html-meta-http-equiv "Content-Type"
+  "The http-equiv attribute used for the HTML <meta> tag."
+  :type 'string
+  :group 'muse-html)
+
+(defcustom muse-html-meta-content-type "text/html"
+  "The content type used for the HTML <meta> tag.
+If you are striving for XHTML 1.1 compliance, you may want to
+change this to \"application/xhtml+xml\"."
+  :type 'string
+  :group 'muse-html)
+
+(defcustom muse-html-meta-content-encoding (if (featurep 'mule)
+                                              'detect
+                                            "iso-8859-1")
+  "The charset to append to the HTML <meta> tag.
+If set to the symbol 'detect, use `muse-html-encoding-map' to try
+and determine the HTML charset from emacs's coding.  If set to a
+string, this string will be used to force a particular charset"
+  :type '(choice string symbol)
+  :group 'muse-html)
+
+(defcustom muse-html-encoding-default 'iso-8859-1
+  "The default Emacs buffer encoding to use in published files.
+This will be used if no special characters are found."
+  :type 'symbol
+  :group 'muse-html)
+
+(defcustom muse-html-charset-default "iso-8859-1"
+  "The default HTML meta charset to use if no translation is found in
+`muse-html-encoding-map'."
+  :type 'string
+  :group 'muse-html)
+
+(defcustom muse-html-src-allowed-modes t
+  "Modes that we allow the <src> tag to colorize.
+If t, permit the <src> tag to colorize any mode.
+
+If a list of mode names, such as '(\"html\" \"latex\"), and the
+lang argument to <src> is not in the list, then use fundamental
+mode instead."
+  :type '(choice (const :tag "Any" t)
+                 (repeat (string :tag "Mode")))
+  :group 'muse-html)
+
+(defun muse-html-insert-anchor (anchor)
+  "Insert an anchor, either around the word at point, or within a tag."
+  (skip-chars-forward (concat muse-regexp-blank "\n"))
+  (if (looking-at (concat "<\\([^" muse-regexp-blank "/>\n]+\\)>"))
+      (let ((tag (match-string 1)))
+        (goto-char (match-end 0))
+        (muse-insert-markup (muse-markup-text 'anchor anchor))
+        (when muse-html-anchor-on-word
+          (or (and (search-forward (format "</%s>" tag)
+                                   (muse-line-end-position) t)
+                   (goto-char (match-beginning 0)))
+              (forward-word 1)))
+        (muse-insert-markup "</a>"))
+    (muse-insert-markup (muse-markup-text 'anchor anchor))
+    (when muse-html-anchor-on-word
+      (forward-word 1))
+    (muse-insert-markup "</a>\n")))
+
+(defun muse-html-markup-anchor ()
+  (unless (get-text-property (match-end 1) 'muse-link)
+    (save-match-data
+      (muse-html-insert-anchor (match-string 2)))
+    (match-string 1)))
+
+(defun muse-html-markup-paragraph ()
+  (let ((end (copy-marker (match-end 0) t)))
+    (goto-char (match-beginning 0))
+    (when (save-excursion
+            (save-match-data
+              (and (not (get-text-property (max (point-min) (1- (point)))
+                                           'muse-no-paragraph))
+                   (re-search-backward "<\\(/?\\)p[ >]" nil t)
+                   (not (string-equal (match-string 1) "/")))))
+      (when (get-text-property (1- (point)) 'muse-end-list)
+        (goto-char (previous-single-property-change (1- (point))
+                                                    'muse-end-list)))
+      (muse-insert-markup "</p>"))
+    (goto-char end))
+  (cond
+   ((eobp)
+    (unless (bolp)
+      (insert "\n")))
+   ((get-text-property (point) 'muse-no-paragraph)
+    (forward-char 1)
+    nil)
+   ((eq (char-after) ?\<)
+    (cond
+     ((looking-at "<\\(em\\|strong\\|code\\|span\\)[ >]")
+      (muse-insert-markup "<p>"))
+     ((looking-at "<a ")
+      (if (looking-at "<a[^>\n]+><img")
+          (muse-insert-markup "<p class=\"image-link\">")
+        (muse-insert-markup "<p>")))
+     ((looking-at "<img[ >]")
+      (muse-insert-markup "<p class=\"image\">"))
+     (t
+      (forward-char 1)
+      nil)))
+   ((muse-looking-back "\\(</h[1-4]>\\|<hr>\\)\n\n")
+    (muse-insert-markup "<p class=\"first\">"))
+   (t
+    (muse-insert-markup "<p>"))))
+
+(defun muse-html-markup-footnote ()
+  (cond
+   ((get-text-property (match-beginning 0) 'muse-link)
+    nil)
+   ((= (muse-line-beginning-position) (match-beginning 0))
+    (prog1
+        (let ((text (match-string 1)))
+          (muse-insert-markup
+           (concat "<p class=\"footnote\">"
+                   "<a class=\"footnum\" name=\"fn." text
+                   "\" href=\"#fnr." text "\">"
+                   text ".</a>")))
+      (save-excursion
+        (save-match-data
+          (let* ((beg (goto-char (match-end 0)))
+                 (end (and (search-forward "\n\n" nil t)
+                           (prog1
+                               (copy-marker (match-beginning 0))
+                             (goto-char beg)))))
+            (while (re-search-forward (concat "^["
+                                              muse-regexp-blank
+                                              "]+\\([^\n]\\)")
+                                      end t)
+              (replace-match "\\1" t)))))
+      (replace-match "")))
+   (t (let ((text (match-string 1)))
+        (muse-insert-markup
+         (concat "<sup><a class=\"footref\" name=\"fnr." text
+                 "\" href=\"#fn." text "\">"
+                 text "</a></sup>")))
+      (replace-match ""))))
+
+(defun muse-html-markup-table ()
+  (muse-xml-markup-table muse-html-table-attributes))
+
+;; Handling of tags for HTML
+
+(defun muse-html-strip-links (string)
+  "Remove all HTML links from STRING."
+  (muse-replace-regexp-in-string "\\(<a .*?>\\|</a>\\)" "" string nil t))
+
+(defun muse-html-insert-contents (depth)
+  "Scan the current document and generate a table of contents at point.
+DEPTH indicates how many levels of headings to include.  The default is 2."
+  (let ((max-depth (or depth 2))
+        (index 1)
+        base contents l end)
+    (save-excursion
+      (goto-char (point-min))
+      (search-forward "Page published by Emacs Muse begins here" nil t)
+      (catch 'done
+        (while (re-search-forward "<h\\([0-9]+\\)>\\(.+?\\)</h\\1>$" nil t)
+          (unless (and (get-text-property (point) 'read-only)
+                       (not (get-text-property (match-beginning 0)
+                                               'muse-contents)))
+            (remove-text-properties (match-beginning 0) (match-end 0)
+                                    '(muse-contents nil))
+            (setq l (1- (string-to-number (match-string 1))))
+            (if (null base)
+                (setq base l)
+              (if (< l base)
+                  (throw 'done t)))
+            (when (<= l max-depth)
+              ;; escape specials now before copying the text, so that we
+              ;; can deal sanely with both emphasis in titles and
+              ;; special characters
+              (goto-char (match-end 2))
+              (setq end (point-marker))
+              (muse-publish-escape-specials (match-beginning 2) end
+                                            nil 'document)
+              (muse-publish-mark-read-only (match-beginning 2) end)
+              (setq contents (cons (cons l (buffer-substring-no-properties
+                                            (match-beginning 2) end))
+                                   contents))
+              (set-marker end nil)
+              (goto-char (match-beginning 2))
+              (muse-html-insert-anchor (concat "sec" (int-to-string index)))
+              (setq index (1+ index)))))))
+    (setq index 1 contents (nreverse contents))
+    (let ((depth 1) (sub-open 0) (p (point)))
+      (muse-insert-markup "<div class=\"contents\">\n<dl>\n")
+      (while contents
+        (muse-insert-markup "<dt>\n"
+                            "<a href=\"#sec" (int-to-string index) "\">"
+                            (muse-html-strip-links (cdar contents))
+                            "</a>\n"
+                            "</dt>\n")
+        (setq index (1+ index)
+              depth (caar contents)
+              contents (cdr contents))
+        (when contents
+          (cond
+           ((< (caar contents) depth)
+            (let ((idx (caar contents)))
+              (while (< idx depth)
+                (muse-insert-markup "</dl>\n</dd>\n")
+                (setq sub-open (1- sub-open)
+                      idx (1+ idx)))))
+           ((> (caar contents) depth) ; can't jump more than one ahead
+            (muse-insert-markup "<dd>\n<dl>\n")
+            (setq sub-open (1+ sub-open))))))
+      (while (> sub-open 0)
+        (muse-insert-markup "</dl>\n</dd>\n")
+        (setq sub-open (1- sub-open)))
+      (muse-insert-markup "</dl>\n</div>\n")
+      (muse-publish-mark-read-only p (point)))))
+
+(defun muse-html-denote-headings ()
+  "Place a text property on any headings in the current buffer.
+This allows the headings to be picked up later on if publishing a
+table of contents."
+  (save-excursion
+    (goto-char (point-min))
+    (search-forward "Page published by Emacs Muse begins here" nil t)
+    (while (re-search-forward "<h\\([0-9]+\\)>\\(.+?\\)</h\\1>$" nil t)
+      (unless (get-text-property (point) 'read-only)
+        (add-text-properties (match-beginning 0) (match-end 0)
+                             '(muse-contents t))))))
+
+(defun muse-html-class-tag (beg end attrs)
+  (let ((name (cdr (assoc "name" attrs))))
+    (when name
+      (goto-char beg)
+      (muse-insert-markup "<span class=\"" name "\">")
+      (save-excursion
+        (goto-char end)
+        (muse-insert-markup "</span>")))))
+
+(defun muse-html-div-tag (beg end attrs)
+  "Publish a <div> tag for HTML."
+  (let ((id (cdr (assoc "id" attrs)))
+        (style (cdr (assoc "style" attrs))))
+    (when (or id style)
+      (goto-char beg)
+      (if (null id)
+          (muse-insert-markup "<div style=\"" style "\">")
+        (muse-insert-markup "<div id=\"" id "\">"))
+      (save-excursion
+        (goto-char end)
+        (muse-insert-markup "</div>")))))
+
+(defun muse-html-src-tag (beg end attrs)
+  "Publish the region using htmlize.
+The language to use may be specified by the \"lang\" attribute.
+
+Muse will look for a function named LANG-mode, where LANG is the
+value of the \"lang\" attribute.
+
+This tag requires htmlize 1.34 or later in order to work."
+  (if (condition-case nil
+          (progn
+            (require 'htmlize)
+            (if (fboundp 'htmlize-region-for-paste)
+                nil
+              (muse-display-warning
+               (concat "The `htmlize-region-for-paste' function was not"
+                       " found.\nThis is available in htmlize.el 1.34"
+                       " or later."))
+              t))
+        (error nil t))
+      ;; if htmlize.el was not found, treat this like an example tag
+      (muse-publish-example-tag beg end)
+    (muse-publish-ensure-block beg end)
+    (let* ((lang (cdr (assoc "lang" attrs)))
+           (mode (or (and (not (eq muse-html-src-allowed-modes t))
+                          (not (member lang muse-html-src-allowed-modes))
+                          'fundamental-mode)
+                     (intern-soft (concat lang "-mode"))))
+           (text (muse-delete-and-extract-region beg end))
+           (htmltext
+            (with-temp-buffer
+              (insert text)
+              (if (functionp mode)
+                  (funcall mode)
+                (fundamental-mode))
+              (font-lock-fontify-buffer)
+              ;; silence the byte-compiler
+              (when (fboundp 'htmlize-region-for-paste)
+                ;; transform the region to HTML
+                (htmlize-region-for-paste (point-min) (point-max))))))
+      (save-restriction
+        (narrow-to-region (point) (point))
+        (insert htmltext)
+        (goto-char (point-min))
+        (re-search-forward "<pre\\([^>]*\\)>\n?" nil t)
+        (replace-match "<pre class=\"src\">")
+        (goto-char (point-max))
+        (muse-publish-mark-read-only (point-min) (point-max))))))
+
+;; Register the Muse HTML Publisher
+
+(defun muse-html-browse-file (file)
+  (browse-url (concat "file:" file)))
+
+(defun muse-html-encoding ()
+  (if (stringp muse-html-meta-content-encoding)
+      muse-html-meta-content-encoding
+    (muse-xml-transform-content-type
+     (or (and (boundp 'buffer-file-coding-system)
+              buffer-file-coding-system)
+         muse-html-encoding-default)
+     muse-html-charset-default)))
+
+(defun muse-html-prepare-buffer ()
+  (make-local-variable 'muse-html-meta-http-equiv)
+  (set (make-local-variable 'muse-html-meta-content-type)
+       (if (save-match-data
+             (string-match "charset=" muse-html-meta-content-type))
+           muse-html-meta-content-type
+         (concat muse-html-meta-content-type "; charset="
+                 (muse-html-encoding)))))
+
+(defun muse-html-munge-buffer ()
+  (if muse-publish-generate-contents
+      (progn
+        (goto-char (car muse-publish-generate-contents))
+        (muse-html-insert-contents (cdr muse-publish-generate-contents))
+        (setq muse-publish-generate-contents nil))
+    (muse-html-denote-headings)))
+
+(defun muse-html-finalize-buffer ()
+  (when (and (boundp 'buffer-file-coding-system)
+             (memq buffer-file-coding-system '(no-conversion undecided-unix)))
+    ;; make it agree with the default charset
+    (setq buffer-file-coding-system muse-html-encoding-default)))
+
+;;; Register the Muse HTML and XHTML Publishers
+
+(muse-define-style "html"
+                   :suffix    'muse-html-extension
+                   :regexps   'muse-html-markup-regexps
+                   :functions 'muse-html-markup-functions
+                   :strings   'muse-html-markup-strings
+                   :tags      'muse-html-markup-tags
+                   :specials  'muse-xml-decide-specials
+                   :before    'muse-html-prepare-buffer
+                   :before-end 'muse-html-munge-buffer
+                   :after     'muse-html-finalize-buffer
+                   :header    'muse-html-header
+                   :footer    'muse-html-footer
+                   :style-sheet 'muse-html-style-sheet
+                   :browser   'muse-html-browse-file)
+
+(muse-derive-style "xhtml" "html"
+                   :suffix    'muse-xhtml-extension
+                   :strings   'muse-xhtml-markup-strings
+                   :header    'muse-xhtml-header
+                   :footer    'muse-xhtml-footer
+                   :style-sheet 'muse-xhtml-style-sheet)
+
+;; xhtml1.0 is an alias for xhtml
+(muse-derive-style "xhtml1.0" "xhtml")
+
+;; xhtml1.1 has some quirks that need attention from us
+(muse-derive-style "xhtml1.1" "xhtml"
+                   :strings   'muse-xhtml1.1-markup-strings)
+
+(provide 'muse-html)
+
+;;; muse-html.el ends here
diff --git a/packages/muse/muse-http.el b/packages/muse/muse-http.el
new file mode 100644 (file)
index 0000000..40bd1cb
--- /dev/null
@@ -0,0 +1,239 @@
+;;; muse-http.el --- publish HTML files over HTTP
+
+;; Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010
+;;   Free Software Foundation, Inc.
+
+;; This file is part of Emacs Muse.  It is not part of GNU Emacs.
+
+;; Emacs Muse 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, or (at your
+;; option) any later version.
+
+;; Emacs Muse 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 Emacs Muse; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;;; Contributors:
+
+;;; Code:
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Publishing HTML over HTTP (using httpd.el)
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'muse-html)
+(require 'muse-project)
+(require 'httpd)
+(require 'cgi)
+
+(defgroup muse-http nil
+  "Options controlling the behavior of Emacs Muse over HTTP."
+  :group 'press)
+
+(defcustom muse-http-maintainer (concat "webmaster@" (system-name))
+  "The maintainer address to use for the HTTP 'From' field."
+  :type 'string
+  :group 'muse-http)
+
+(defcustom muse-http-publishing-style "html"
+  "The style to use when publishing projects over http."
+  :type 'string
+  :group 'muse-http)
+
+(defcustom muse-http-max-cache-size 64
+  "The number of pages to cache when serving over HTTP.
+This only applies if set while running the persisted invocation
+server.  See main documentation for the `muse-http'
+customization group."
+  :type 'integer
+  :group 'muse-http)
+
+(defvar muse-buffer-mtime nil)
+(make-variable-buffer-local 'muse-buffer-mtime)
+
+(defun muse-sort-buffers (l r)
+  (let ((l-mtime (with-current-buffer l muse-buffer-mtime))
+        (r-mtime (with-current-buffer r muse-buffer-mtime)))
+    (cond
+     ((and (null l-mtime) (null r-mtime)) l)
+     ((null l-mtime) r)
+     ((null r-mtime) l)
+     (t (muse-time-less-p r-mtime l-mtime)))))
+
+(defun muse-winnow-list (entries &optional predicate)
+  "Return only those ENTRIES for which PREDICATE returns non-nil."
+  (let ((flist (list t)))
+    (let ((entry entries))
+      (while entry
+        (if (funcall predicate (car entry))
+            (nconc flist (list (car entry))))
+        (setq entry (cdr entry))))
+    (cdr flist)))
+
+(defun muse-http-prune-cache ()
+  "If the page cache has become too large, prune it."
+  (let* ((buflist
+          (sort (muse-winnow-list (buffer-list)
+                                  (function
+                                   (lambda (buf)
+                                     (with-current-buffer buf
+                                       muse-buffer-mtime))))
+                'muse-sort-buffers))
+         (len (length buflist)))
+    (while (> len muse-http-max-cache-size)
+      (kill-buffer (car buflist))
+      (setq len (1- len)))))
+
+(defvar muse-http-serving-p nil)
+
+(defun muse-http-send-buffer (&optional modified code msg)
+  "Markup and send the contents of the current buffer via HTTP."
+  (httpd-send (or code 200) (or msg "OK")
+              "Server: muse.el/" muse-version httpd-endl
+              "Connection: close" httpd-endl
+              "MIME-Version: 1.0" httpd-endl
+              "Date: " (format-time-string "%a, %e %b %Y %T %Z")
+              httpd-endl
+              "From: " muse-http-maintainer httpd-endl)
+  (when modified
+    (httpd-send-data "Last-Modified: "
+                     (format-time-string "%a, %e %b %Y %T %Z" modified)
+                     httpd-endl))
+  (httpd-send-data "Content-Type: text/html; charset=iso-8859-1" httpd-endl
+                   "Content-Length: " (number-to-string (1- (point-max)))
+                   httpd-endl httpd-endl
+                   (buffer-string))
+  (httpd-send-eof))
+
+(defun muse-http-reject (title msg &optional annotation)
+  (muse-with-temp-buffer
+    (insert msg ".\n")
+    (if annotation
+        (insert annotation "\n"))
+    (muse-publish-markup-buffer title muse-http-publishing-style)
+    (muse-http-send-buffer nil 404 msg)))
+
+(defun muse-http-prepare-url (target explicit)
+  (save-match-data
+    (unless (or (not explicit)
+                (string-match muse-url-regexp target)
+                (string-match muse-image-regexp target)
+                (string-match muse-file-regexp target))
+      (setq target (concat "page?" target
+                           "&project=" muse-http-serving-p))))
+  (muse-publish-read-only target))
+
+(defun muse-http-render-page (name)
+  "Render the Muse page identified by NAME.
+When serving from a dedicated Emacs process (see the httpd-serve
+script), a maximum of `muse-http-max-cache-size' pages will be
+cached in memory to speed up serving time."
+  (let ((file (muse-project-page-file name muse-http-serving-p))
+        (muse-publish-url-transforms
+         (cons 'muse-http-prepare-url muse-publish-url-transforms))
+        (inhibit-read-only t))
+    (when file
+      (with-current-buffer (get-buffer-create file)
+        (let ((modified-time (nth 5 (file-attributes file)))
+              (muse-publishing-current-file file)
+              muse-publishing-current-style)
+          (when (or (null muse-buffer-mtime)
+                    (muse-time-less-p muse-buffer-mtime modified-time))
+            (erase-buffer)
+            (setq muse-buffer-mtime modified-time))
+          (goto-char (point-max))
+          (when (bobp)
+            (muse-insert-file-contents file t)
+            (let ((styles (cddr (muse-project muse-http-serving-p)))
+                  style)
+              (while (and styles (null style))
+                (let ((include-regexp
+                       (muse-style-element :include (car styles)))
+                      (exclude-regexp
+                       (muse-style-element :exclude (car styles))))
+                  (when (and (or (and (null include-regexp)
+                                      (null exclude-regexp))
+                                 (if include-regexp
+                                     (string-match include-regexp file)
+                                   (not (string-match exclude-regexp file))))
+                             (not (muse-project-private-p file)))
+                    (setq style (car styles))
+                    (while (muse-style-element :base style)
+                      (setq style
+                            (muse-style (muse-style-element :base style))))
+                    (if (string= (car style) muse-http-publishing-style)
+                        (setq style (car styles))
+                      (setq style nil))))
+                (setq styles (cdr styles)))
+              (muse-publish-markup-buffer
+               name (or style muse-http-publishing-style))))
+          (set-buffer-modified-p nil)
+          (muse-http-prune-cache)
+          (current-buffer))))))
+
+(defun muse-http-transmit-page (name)
+  "Render the Muse page identified by NAME.
+When serving from a dedicated Emacs process (see the httpd-serve
+script), a maximum of `muse-http-max-cache-size' pages will be
+cached in memory to speed up serving time."
+  (let ((inhibit-read-only t)
+        (buffer (muse-http-render-page name)))
+    (if buffer
+        (with-current-buffer buffer
+          (muse-http-send-buffer muse-buffer-mtime)))))
+
+(defvar httpd-vars nil)
+
+(defsubst httpd-var (var)
+  "Return value of VAR as a URL variable.  If VAR doesn't exist, nil."
+  (cdr (assoc var httpd-vars)))
+
+(defsubst httpd-var-p (var)
+  "Return non-nil if VAR was passed as a URL variable."
+  (not (null (assoc var httpd-vars))))
+
+(defun muse-http-serve (page &optional content)
+  "Serve the given PAGE from this press server."
+  ;; index.html is really a reference to the project home page
+  (if (and muse-project-alist
+           (string-match "\\`index.html?\\'" page))
+      (setq page (concat "page?"
+                         (muse-get-keyword :default
+                                           (cadr (car muse-project-alist))))))
+  ;; handle the actual request
+  (let ((vc-follow-symlinks t)
+        (muse-publish-report-threshhold nil)
+        muse-http-serving-p
+        httpd-vars)
+    (save-excursion
+      ;; process any CGI variables, if cgi.el is available
+      (if (string-match "\\`\\([^&]+\\)&" page)
+          (setq httpd-vars (cgi-decode (substring page (match-end 0)))
+                page (match-string 1 page)))
+      (unless (setq muse-http-serving-p (httpd-var "project"))
+        (let ((project (car muse-project-alist)))
+          (setq muse-http-serving-p (car project))
+          (setq httpd-vars (cons (cons "project" (car project))
+                                 httpd-vars))))
+      (if (and muse-http-serving-p
+               (string-match "\\`page\\?\\(.+\\)" page))
+          (muse-http-transmit-page (match-string 1 page))))))
+
+(if (featurep 'httpd)
+    (httpd-add-handler "\\`\\(index\\.html?\\|page\\(\\?\\|\\'\\)\\)"
+                       'muse-http-serve))
+
+(provide 'muse-http)
+
+;;; muse-http.el ends here
diff --git a/packages/muse/muse-ikiwiki.el b/packages/muse/muse-ikiwiki.el
new file mode 100644 (file)
index 0000000..a664880
--- /dev/null
@@ -0,0 +1,219 @@
+;;; muse-ikiwiki.el --- integrate with Ikiwiki
+
+;; Copyright (C) 2008, 2009, 2010  Free Software Foundation, Inc.
+
+;; This file is part of Emacs Muse.  It is not part of GNU Emacs.
+
+;; Emacs Muse 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, or (at your
+;; option) any later version.
+
+;; Emacs Muse 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 Emacs Muse; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;;; Contributors:
+
+;;; Code:
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Muse Ikiwiki Integration
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'muse)
+(require 'muse-html)
+(require 'muse-ipc)
+(require 'muse-publish)
+
+(eval-when-compile
+  (require 'muse-colors))
+
+(defgroup muse-ikiwiki nil
+  "Options controlling the behavior of Muse integration with Ikiwiki."
+  :group 'muse-publish)
+
+(defcustom muse-ikiwiki-header ""
+  "Header used for publishing Ikiwiki output files.
+This may be text or a filename."
+  :type 'string
+  :group 'muse-ikiwiki)
+
+(defcustom muse-ikiwiki-footer ""
+  "Footer used for publishing Ikiwiki output files.
+This may be text or a filename."
+  :type 'string
+  :group 'muse-ikiwiki)
+
+(defcustom muse-ikiwiki-markup-regexps
+  `(;; Ikiwiki directives
+    (1350 ,(concat "\\(\\\\?\\)\\[\\[!""\\(?:-\\|\\w\\)+"
+                   "\\([" muse-regexp-blank "\n]+"
+                   "\\(?:\\(?:\\(?:-\\|\\w\\)+=\\)?"
+                   "\\(?:\"\"\".*?\"\"\"\\|\"[^\"]+\""
+                   "\\|[^]" muse-regexp-blank "\n]+\\)"
+                   "[" muse-regexp-blank "\n]*\\)*\\)?\\]\\]")
+          0 muse-ikiwiki-markup-directive))
+  "List of markup rules for publishing Ikiwiki markup on Muse pages.
+For more on the structure of this list, see `muse-publish-markup-regexps'."
+  :type '(repeat (choice
+                  (list :tag "Markup rule"
+                        integer
+                        (choice regexp symbol)
+                        integer
+                        (choice string function symbol))
+                  function))
+  :group 'muse-ikiwiki)
+
+;;; Publishing
+
+(defun muse-ikiwiki-markup-directive ()
+  "Handle publishing of an Ikiwiki directive."
+  (unless (get-text-property (match-beginning 0) 'read-only)
+    (add-text-properties (match-beginning 0) (match-end 0)
+                         '(muse-no-paragraph t))
+    (muse-publish-mark-read-only (match-beginning 0) (match-end 0))))
+
+(defun muse-ikiwiki-publish-buffer (name title &optional style)
+  "Publish a buffer for Ikiwki.
+The name of the corresponding file is NAME.
+The name of the style is given by STYLE.  It defaults to \"ikiwiki\"."
+  (unless style (setq style "ikiwiki"))
+  (unless title (setq title (muse-page-name name)))
+  (let ((muse-batch-publishing-p t)
+        (muse-publishing-current-file name)
+        (muse-publishing-current-output-path name)
+        (muse-publishing-current-style style)
+        (font-lock-verbose nil)
+        (vc-handled-backends nil)) ; don't activate VC when publishing files
+    (run-hooks 'muse-before-publish-hook)
+    (let ((muse-inhibit-before-publish-hook t))
+      (muse-publish-markup-buffer title style))))
+
+(defun muse-ikiwiki-publish-file (file name &optional style)
+  "Publish a single file for Ikiwiki.
+The name of the real file is NAME, and the name of the temporary
+file containing the content is FILE.
+The name of the style is given by STYLE.  It defaults to \"ikiwiki\"."
+  (if (not (stringp file))
+      (message "Error: No file given to publish")
+    (unless style
+      (setq style "ikiwiki"))
+    (let ((output-path file)
+          (target file)
+          (vc-handled-backends nil) ; don't activate VC when publishing files
+          auto-mode-alist
+          muse-current-output-style)
+      (setq auto-mode-alist
+            (delete (cons (concat "\\." muse-file-extension "\\'")
+                          'muse-mode-choose-mode)
+                    auto-mode-alist))
+      (setq muse-current-output-style (list :base style :path file))
+      (muse-with-temp-buffer
+        (muse-insert-file-contents file)
+        (muse-ikiwiki-publish-buffer name nil style)
+        (when (muse-write-file output-path t)
+          (muse-style-run-hooks :final style file output-path target))))))
+
+(defun muse-ikiwiki-start-server (port)
+  "Start Muse IPC server, initializing with the client on PORT."
+  (muse-ipc-start "foo" #'muse-ikiwiki-publish-buffer port))
+
+;;; Colors
+
+(defface muse-ikiwiki-directive
+  '((((class color) (background light))
+     (:foreground "dark green"))
+    (((class color) (background dark))
+     (:foreground "green")))
+  "Face for Ikiwiki directives."
+  :group 'muse-ikiwiki)
+
+(defun muse-colors-ikiwiki-directive ()
+  "Color ikiwiki directives."
+  (let ((start (match-beginning 0)))
+    (unless (or (eq (get-text-property start 'invisible) 'muse)
+                (get-text-property start 'muse-comment)
+                (get-text-property start 'muse-directive))
+      ;; beginning of line or space or symbol
+      (save-excursion
+        (and
+         (catch 'valid
+           (while t
+             (skip-chars-forward "^\"]" muse-colors-region-end)
+             (cond ((eq (point) (point-max))
+                    (throw 'valid nil))
+                   ((> (point) muse-colors-region-end)
+                    (throw 'valid nil))
+                   ((eq (char-after) ?\")
+                    (if (and (< (1+ (point)) muse-colors-region-end)
+                             (eq (char-after (1+ (point))) ?\"))
+                        (if (and (< (+ 2 (point)) muse-colors-region-end)
+                                 (eq (char-after (+ 2 (point))) ?\"))
+                            ;; triple-quote
+                            (progn
+                              (forward-char 3)
+                              (or (and (looking-at "\"\"\"")
+                                       (goto-char (match-end 0)))
+                                  (re-search-forward
+                                   "\"\"\"" muse-colors-region-end t)
+                                  (throw 'valid nil)))
+                          ;; empty quotes (""), which are invalid
+                          (throw 'valid nil))
+                      ;; quote with content
+                      (forward-char 1)
+                      (skip-chars-forward "^\"" muse-colors-region-end)
+                      (when (eq (char-after) ?\")
+                        (forward-char 1))))
+                   ((eq (char-after) ?\])
+                    (forward-char 1)
+                    (when (and (< (point) muse-colors-region-end)
+                               (eq (char-after (point)) ?\]))
+                      (forward-char 1)
+                      (throw 'valid t)))
+                   (t (throw 'valid nil)))))
+         ;; found a valid directive
+         (let ((end (point)))
+           ;; remove flyspell overlays
+           (when (fboundp 'flyspell-unhighlight-at)
+             (let ((cur start))
+               (while (> end cur)
+                 (flyspell-unhighlight-at cur)
+                 (setq cur (1+ cur)))))
+           (add-text-properties start end
+                                '(face muse-ikiwiki-directive
+                                  muse-directive t muse-no-flyspell t))
+           (when (progn
+                   (goto-char start)
+                   (skip-chars-forward "^\n" end)
+                   (and (eq (char-after) ?\n)
+                        (not (= (point) end))))
+             (add-text-properties start end
+                                  '(font-lock-multiline t)))))))))
+
+(defun muse-ikiwiki-insinuate-colors ()
+  (add-to-list 'muse-colors-markup
+               '("\\[\\[!" ?\[ muse-colors-ikiwiki-directive)
+               nil))
+
+(eval-after-load "muse-colors" '(muse-ikiwiki-insinuate-colors))
+
+;; Styles
+(muse-derive-style "ikiwiki" "xhtml"
+                   :header  'muse-ikiwiki-header
+                   :footer  'muse-ikiwiki-footer
+                   :regexps 'muse-ikiwiki-markup-regexps)
+
+(provide 'muse-ikiwiki)
+
+;;; muse-ikiwiki.el ends here
diff --git a/packages/muse/muse-import-docbook.el b/packages/muse/muse-import-docbook.el
new file mode 100644 (file)
index 0000000..ed1b22b
--- /dev/null
@@ -0,0 +1,137 @@
+;;; muse-import-docbook.el --- convert Docbook XML into Muse format
+
+;; Copyright (C) 2006, 2007, 2008, 2009, 2010
+;;   Free Software Foundation, Inc.
+
+;; Author: Elena Pomohaci <e.pomohaci@gmail.com>
+
+;; This file is part of Emacs Muse.  It is not part of GNU Emacs.
+
+;; Emacs Muse 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, or (at your
+;; option) any later version.
+
+;; Emacs Muse 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 Emacs Muse; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; It works only for article type docbook docs and recognize
+;; followings elements: article, sect1, sect2, sect3, title,
+
+;;; Contributors:
+
+;;; Code:
+
+(require 'muse-import-xml)
+
+(defvar muse-import-docbook-prefix "muse-import-docbook-"
+  "The name prefix for tag functions")
+
+(defvar muse-import-docbook-para-indent "\n\n"
+  "Para elements indentation (0, less than 6 spaces, more than 6 spaces)")
+
+(defun muse-import-docbook-reset-para-indent ()
+  (setq muse-import-docbook-para-indent "\n\n"))
+
+
+;;;###autoload
+(defun muse-import-docbook (src dest)
+  "Convert the Docbook buffer SRC to Muse, writing output in the DEST buffer."
+  (interactive "bDocbook buffer:\nBMuse buffer:")
+  (setq muse-import-xml-prefix muse-import-docbook-prefix)
+  (setq muse-import-xml-generic-function-name "muse-import-xml-node")
+  (muse-import-xml src dest))
+
+;;;###autoload
+(defun muse-import-docbook-files (src dest)
+  "Convert the Docbook file SRC to Muse, writing output to the DEST file."
+  (interactive "fDocbook file:\nFMuse file:")
+  (with-temp-file dest
+    (muse-import-docbook (find-file-noselect src) (current-buffer))))
+
+
+;;; element specific functions
+
+(defun muse-import-docbook-get-title (node)
+  (let ((tit (car (xml-get-children node 'title))))
+    (insert (car (cddr tit)) ?\n ?\n)
+    (muse-import-xml-parse-tree (xml-node-children (remove tit node)))))
+
+
+(defun muse-import-docbook-article (node)
+  "Article conversion function"
+  (muse-import-xml-node node))
+
+(defun muse-import-docbook-articleinfo (node)
+  "Article conversion function"
+  (insert "#title ")
+  (muse-import-docbook-get-title node)
+  (insert ?\n))
+
+
+(defalias 'muse-import-docbook-appendix 'muse-import-docbook-article)
+
+(defalias 'muse-import-docbook-appendixinfo 'muse-import-docbook-articleinfo)
+
+
+(defun muse-import-docbook-sect1 (node)
+  "Section 1 conversion function"
+  (insert ?\n "* ")
+  (muse-import-docbook-get-title node))
+
+(defun muse-import-docbook-sect2 (node)
+  "Section 2 conversion function"
+  (insert ?\n "** ")
+  (muse-import-docbook-get-title node))
+
+(defun muse-import-docbook-sect3 (node)
+  "Section 3 conversion function"
+  (insert ?\n "*** ")
+  (muse-import-docbook-get-title node))
+
+
+(defun muse-import-docbook-graphic (node)
+  "Graphic conversion function. Image format is forced to PNG"
+  (let ((name (xml-get-attribute node 'fileref)))
+  (insert "\n[[img/" name ".png][" name "]]")))
+
+(defun muse-import-docbook-para (node)
+  (insert muse-import-docbook-para-indent)
+  (muse-import-xml-node node))
+
+
+(defun muse-import-docbook-emphasis (node)
+  (insert "*")
+  (muse-import-xml-node node)
+  (insert "*"))
+
+(defun muse-import-docbook-quote (node)
+  (insert "\"")
+  (muse-import-xml-node node)
+  (insert "\""))
+
+(defun muse-import-docbook-blockquote (node)
+  (setq muse-import-docbook-para-indent "\n\n  ")
+  (muse-import-xml-node node)
+  (muse-import-docbook-reset-para-indent))
+
+(defun muse-import-docbook-member (node)
+  (insert "\n> ")
+  (muse-import-xml-node node))
+
+(defun muse-import-docbook-bridgehead (node)
+  (insert "\n* ")
+  (muse-import-xml-node node))
+
+(provide 'muse-import-docbook)
+
+;;; muse-import-docbook.el ends here
diff --git a/packages/muse/muse-import-latex.el b/packages/muse/muse-import-latex.el
new file mode 100644 (file)
index 0000000..5297131
--- /dev/null
@@ -0,0 +1,149 @@
+;;; muse-import-latex.el --- convert a LaTex file into a Muse file
+
+;; Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010
+;;   Free Software Foundation, Inc.
+
+;; This file is part of Emacs Muse.  It is not part of GNU Emacs.
+
+;; Emacs Muse 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, or (at your
+;; option) any later version.
+
+;; Emacs Muse 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 Emacs Muse; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; Helper commands for converting a LaTeX file into a Muse file.
+
+;;; Contributors:
+
+;;; Code:
+
+(require 'muse)
+(require 'muse-regexps)
+
+(defun muse-i-l-write-citation (note author citation pages)
+  (save-excursion
+    (goto-char (point-max))
+    (if (= note 1)
+        (insert "\nFootnotes:\n\n"))
+    (let ((beg (point)))
+      (insert "\n[" (number-to-string note) "]  " author)
+      (if (and citation pages)
+          (insert ", " citation ", " pages))
+      (insert "\n")
+      (goto-char beg)
+      (while (re-search-forward (concat "p.\\\\[" muse-regexp-blank "\n]+")
+                                nil t)
+        (replace-match "p."))
+      (goto-char beg)
+      (while (re-search-forward "--" nil t)
+        (replace-match "-")))))
+
+(defun muse-i-l-write-footnote (note text)
+  (save-excursion
+    (goto-char (point-max))
+    (if (= note 1)
+        (insert "\nFootnotes:\n\n"))
+    (insert "\n[" (number-to-string note) "]  " text ?\n)))
+
+;;;###autoload
+(defun muse-import-latex ()
+  (interactive)
+  (goto-char (point-min))
+  (while (not (eobp))
+    (cond
+     ((or (looking-at "^\\\\documentclass")
+          (looking-at "^\\\\input")
+          (looking-at "^\\\\begin{document}")
+          (looking-at "^\\\\end{document}")
+          (looking-at "^\\\\author")
+          (looking-at "^\\\\\\(med\\|big\\|small\\)skip")
+          (looking-at "^\\\\maketitle"))
+      (delete-region (point) (muse-line-end-position)))
+     ((looking-at "^\\\\title{\\(.+\\)}")
+      (delete-region (match-end 1) (muse-line-end-position))
+      (delete-region (point) (match-beginning 1))
+      (insert "#title ")))
+    (forward-line))
+  (goto-char (point-min))
+  (while (re-search-forward "\\\\\\(l\\)?dots{}" nil t)
+    (replace-match (concat (and (string= (match-string 1) "l") ".")
+                           "...")))
+  (goto-char (point-min))
+  (while (re-search-forward "\\(``\\|''\\)" nil t)
+    (replace-match "\""))
+  (goto-char (point-min))
+  (while (re-search-forward "---" nil t)
+    (replace-match " -- "))
+  (goto-char (point-min))
+  (while (re-search-forward "\\\\tableofcontents" nil t)
+    (replace-match "<contents>"))
+  (goto-char (point-min))
+  (while (re-search-forward "\\\\\\\\" nil t)
+    (replace-match ""))
+  (goto-char (point-min))
+  (while (re-search-forward "\\\\\\(sub\\)?section{\\([^}]+\\)}" nil t)
+    (replace-match (concat (if (string= (match-string 1) "sub")
+                               "**" "*")
+                           " " (match-string 2))))
+  (goto-char (point-min))
+  (while (re-search-forward "\\\\\\(begin\\|end\\){verse}" nil t)
+    (replace-match (concat "<" (if (string= (match-string 1) "end") "/")
+                           "verse>")))
+  (goto-char (point-min))
+  (while (re-search-forward "\\\\\\(begin\\|end\\){quote}\n" nil t)
+    (replace-match ""))
+  (goto-char (point-min))
+  (while (re-search-forward
+          "\\\\\\(emph\\|textbf\\){\\([^}]+?\\)\\(\\\\/\\)?}" nil t)
+    (replace-match
+     (if (string= (match-string 1) "emph") "*\\2*" "**\\2**")))
+  (let ((footnote-index 1))
+    (goto-char (point-min))
+    (while (re-search-forward
+            (concat "\\\\\\(q\\)?\\(footnote\\|excerpt\\)\\(np\\)?"
+                    "\\({\\([^}]+\\)}\\)?"
+                    "\\({\\([^}]+\\)}{\\([^}]+\\)}\\)?{\\([^}]+\\)}") nil t)
+      (let ((beg (match-beginning 0))
+            (end (match-end 0)))
+        (unless (string= (match-string 2) "footnote")
+          (if (null (match-string 1))
+              (insert "  " (match-string 9))
+            (let ((b (point)) e)
+              (insert "\"" (match-string 9) "\"")
+              (setq e (point-marker))
+              (save-match-data
+                (save-excursion
+                  (goto-char b)
+                  (while (< (point) e)
+                    (if (looking-at "\\s-+")
+                        (delete-region (match-beginning 0)
+                                       (match-end 0)))
+                    (forward-line))))
+              (set-marker e nil))))
+        (insert "[" (number-to-string footnote-index) "]")
+        (if (string= (match-string 2) "footnote")
+            (muse-i-l-write-footnote footnote-index (match-string 9))
+          (muse-i-l-write-citation footnote-index (match-string 5)
+                                   (match-string 7) (match-string 8)))
+        (setq footnote-index (1+ footnote-index))
+        (delete-region beg end))))
+  (goto-char (point-min))
+  (while (looking-at "\n") (delete-char 1))
+  (goto-char (point-min))
+  (while (re-search-forward "\n\n+" nil t)
+    (replace-match "\n\n")))
+
+(provide 'muse-import-latex)
+
+;;; muse-import-latex.el ends here
diff --git a/packages/muse/muse-import-xml.el b/packages/muse/muse-import-xml.el
new file mode 100644 (file)
index 0000000..2579ce8
--- /dev/null
@@ -0,0 +1,88 @@
+;;; muse-import-xml.el --- common to all from-xml converters
+
+;; Copyright (C) 2006, 2007, 2008, 2009, 2010
+;;   Free Software Foundation, Inc.
+
+;; Author: Elena Pomohaci <e.pomohaci@gmail.com>
+
+;; This file is part of Emacs Muse.  It is not part of GNU Emacs.
+
+;; Emacs Muse 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, or (at your
+;; option) any later version.
+
+;; Emacs Muse 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 Emacs Muse; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;;; Contributors:
+
+;;; Code:
+
+(provide 'muse-import-xml)
+
+(require 'xml)
+(require 'muse)
+
+(defvar muse-import-xml-prefix ""
+  "The name prefix for tag functions")
+
+(defvar muse-import-xml-generic-function-name "muse-import-xml-generic"
+  "The generic function name")
+
+(defun muse-import-xml-convert-to-list (buf)
+  "Convert xml BUF in a xml-list"
+  (with-temp-buffer
+    (insert-buffer-substring buf)
+    (goto-char (point-min))
+    (while (re-search-forward ">[ \n\t]*<" nil t)
+      (replace-match "><" nil nil)) ; clean all superfluous blank characters
+    (xml-parse-region (point-min)
+                      (point-max)
+                      (current-buffer))))
+
+
+(defun muse-import-xml-generic (node)
+  "The generic function called when there is no node specific function."
+  (let ((name (xml-node-name node)))
+    (insert "<" (symbol-name name)  ">")
+    (muse-import-xml-node node)
+    (insert "</" (symbol-name name) ">")))
+
+(defun muse-import-xml-parse-tree (lst)
+  "Parse an xml tree list"
+  (mapc #'muse-import-xml-parse-node lst))
+
+(defun muse-import-xml-parse-node (node)
+  "Parse a xml tree node"
+  (if (stringp node)
+      (insert (muse-replace-regexp-in-string "^[ \t]+" "" node))
+    (let ((fname (intern-soft (concat muse-import-xml-prefix
+                                      (symbol-name (xml-node-name node))))))
+      (if (functionp fname)
+          (funcall fname node)
+        (funcall (intern muse-import-xml-generic-function-name) node)))))
+
+
+(defun muse-import-xml-node (node)
+  "Default node function"
+  (muse-import-xml-parse-tree (xml-node-children node)))
+
+
+(defun muse-import-xml (src dest)
+  "Convert the xml SRC buffer in a muse DEST buffer"
+  (set-buffer (get-buffer-create dest))
+  (when (fboundp 'muse-mode)
+    (muse-mode))
+  (muse-import-xml-parse-tree (muse-import-xml-convert-to-list src)))
+
+;;; muse-import-xml.el ends here
diff --git a/packages/muse/muse-ipc.el b/packages/muse/muse-ipc.el
new file mode 100644 (file)
index 0000000..9ce8eb1
--- /dev/null
@@ -0,0 +1,194 @@
+;;; muse-ipc.el --- publish Muse documents from other processes
+
+;; Copyright (C) 2009, 2010  Free Software Foundation, Inc.
+
+;; This file is part of Emacs Muse.  It is not part of GNU Emacs.
+
+;; Emacs Muse 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, or (at your
+;; option) any later version.
+
+;; Emacs Muse 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 Emacs Muse; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file is still in alpha state.  Not for production use!
+
+;;; Contributors:
+
+;;; Code:
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Muse Inter-Process Communication
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(eval-when-compile (require 'cl))
+
+(require 'muse)
+(require 'muse-publish)
+
+(defgroup muse-ipc nil
+  "Options controlling the behavior of Muse's IPC module."
+  :group 'muse-publish)
+
+(defcustom muse-ipc-timeout 60
+  "Maximum time to wait for a client to respond."
+  :group 'muse-ipc
+  :type 'number)
+
+(defcustom muse-ipc-ignore-done nil
+  "If non-nil, ignore any 'done' messages that we get from clients."
+  :group 'muse-ipc
+  :type 'boolean)
+
+(defvar muse-ipc-server-port nil
+  "Port of the Emacs server.")
+
+(defvar muse-ipc-server-process nil
+  "Process of the Emacs server.")
+
+(defvar muse-ipc-server-registered nil
+  "Whether we have successfully registered our port with the client.")
+
+(defun muse-ipc-init-filter (proc string)
+  "Handle data from client while initiating a connection."
+  (unless muse-ipc-server-registered
+    (when (string-match "\\`ok$" string)
+      (setq muse-ipc-server-registered t))))
+
+(defun muse-ipc-delete-client (proc)
+  "Delete a client."
+  (let ((buffer (process-get proc :buffer)))
+    (when (and buffer (buffer-live-p buffer))
+      (with-current-buffer buffer
+        (set-buffer-modified-p nil))
+      (kill-buffer buffer)))
+  (when (eq (process-status proc) 'open)
+    (delete-process proc)))
+
+(defun* muse-ipc-server-filter (proc string)
+  "Handle data from a client after it connects."
+  ;; Authenticate
+  (unless (process-get proc :authenticated)
+    (if (and (string-match "\\`begin \\(.+\\)$" string)
+             (equal (match-string 1 string)
+                    (process-get proc :shared-secret)))
+        (progn
+          (setq string (substring string (match-end 0)))
+          (process-put proc :authenticated t)
+          (process-send-string proc "ok\n"))
+      (process-send-string proc "nok\n")
+      (delete-process proc))
+    (return-from muse-ipc-server-filter))
+
+  ;; Handle case where the client is sending data to be published
+  (when (process-get proc :sending-data)
+    (with-current-buffer (process-get proc :buffer)
+      (insert string)
+      (let ((buf-len (1- (point)))
+            (expected-len (process-get proc :data-bytes)))
+        (cond ((= buf-len expected-len)
+               (process-put proc :sending-data nil))
+              ((> buf-len expected-len)
+               (process-send-string proc "nok\n")
+               (muse-ipc-delete-client proc)))))
+    (return-from muse-ipc-server-filter))
+
+  ;; Dispatch commands
+  (cond
+   ((string-match "\\`done$" string)
+    ;; done, close the server
+    (unless muse-ipc-ignore-done
+      (muse-ipc-stop-server)))
+
+   ((string-match "\\`name \\(.+\\)$" string)
+    ;; set name
+    (process-put proc :file-name (match-string 1 string))
+    (process-send-string proc "ok\n"))
+
+   ((string-match "\\`title \\(.+\\)$" string)
+    ;; set title
+    (process-put proc :title (match-string 1 string))
+    (process-send-string proc "ok\n"))
+
+   (t
+    ;; unrecognized command
+    (process-send-string proc "nok\n"))))
+
+(defun muse-ipc-stop-server ()
+  "Stop Muse IPC server and reset connection data."
+  (stop-process muse-ipc-server-process)
+  (delete-process muse-ipc-server-process)
+  (setq muse-ipc-server-port nil)
+  (setq muse-ipc-server-process nil))
+
+(defun muse-ipc-start (shared-secret publish-fn client-port &optional server-port)
+  "Start an IPC connection and send a response to CLIENT-PORT.
+If SERVER-PORT is provided, start the IPC server on that port, otherwise
+choose a random port.
+
+SHARED-SECRET is used as a very minimal security measure to
+authenticate the Muse IPC server during initialization, and also
+any incoming clients once the server is started.
+
+PUBLISH-FN is the function which should be called in buffer of
+the received contents.  It should transform the buffer into a
+published state.  It must take at least two arguments.  The first
+argument is the full path of the file that the contents
+correspond with.  The second argument is the title to use when
+publishing the file."
+  (when (stringp client-port)
+    (setq client-port (string-to-number client-port)))
+  (when (stringp server-port)
+    (setq server-port (string-to-number server-port)))
+  (setq muse-ipc-server-process
+        (make-network-process
+         :name "muse-ipc"
+         :buffer nil
+         :host 'local :service (or server-port t)
+         :server t :noquery t :nowait t
+         :plist (list :authenticated nil :shared-secret shared-secret
+                      :publish-fn publish-fn)
+         :filter 'muse-ipc-server-filter))
+  (unless muse-ipc-server-process
+    (error "Error: Could not start Muse IPC Server process"))
+  (set-process-coding-system muse-ipc-server-process
+                             'raw-text-unix 'raw-text-unix)
+  (setq muse-ipc-server-port
+        (number-to-string
+         (cadr (process-contact muse-ipc-server-process))))
+  (let ((client-proc
+         (make-network-process
+          :name "muse-ipc-client"
+          :buffer nil
+          :host 'local :service client-port
+          :noquery t
+          :filter 'muse-ipc-init-filter)))
+    (setq muse-ipc-server-registered nil)
+    (process-send-string client-proc
+                         (concat "begin " shared-secret "\n"))
+    (accept-process-output client-proc muse-ipc-timeout nil t)
+    (unless muse-ipc-server-registered
+      (error "Error: Did not register listener"))
+    (process-send-string client-proc
+                         (concat "port " muse-ipc-server-port "\n"))
+    (stop-process client-proc)
+    (delete-process client-proc))
+
+  ;; Accept process output until the server dies
+  (while muse-ipc-server-process (accept-process-output nil 1)))
+
+(provide 'muse-ipc)
+
+;;; muse-ipc.el ends here
diff --git a/packages/muse/muse-journal.el b/packages/muse/muse-journal.el
new file mode 100644 (file)
index 0000000..e523b4c
--- /dev/null
@@ -0,0 +1,774 @@
+;;; muse-journal.el --- keep and publish a journal
+
+;; Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010
+;;   Free Software Foundation, Inc.
+
+;; This file is part of Emacs Muse.  It is not part of GNU Emacs.
+
+;; Emacs Muse 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, or (at your
+;; option) any later version.
+
+;; Emacs Muse 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 Emacs Muse; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; The module facilitates the keeping and publication of a journal.
+;; When publishing to HTML, it assumes the form of a web log, or blog.
+;;
+;; The input format for each entry is as follows:
+;;
+;;   * 20040317: Title of entry
+;;
+;;   Text for the entry.
+;;
+;;   <qotd>
+;;   "You know who you are. It comes down to a simple gut check: You
+;;   either love what you do or you don't. Period." -- P. Bronson
+;;   </qotd>
+;;
+;; The "qotd", or Quote of the Day, is entirely optional.  When
+;; generated to HTML, this entry is rendered as:
+;;
+;;   <div class="entry">
+;;     <div class="entry-qotd">
+;;       <h3>Quote of the Day:</h3>
+;;       <p>"You know who you are. It comes down to a simple gut
+;;         check: You either love what you do or you don't. Period."
+;;         -- P. Bronson</p>
+;;     </div>
+;;     <div class="entry-body">
+;;       <div class="entry-head">
+;;         <div class="entry-date">
+;;           <span class="date">March 17, 2004</span>
+;;         </div>
+;;         <div class="entry-title">
+;;           <h2>Title of entry</h2>
+;;         </div>
+;;       </div>
+;;       <div class="entry-text">
+;;         <p>Text for the entry.</p>
+;;       </div>
+;;     </div>
+;;   </div>
+;;
+;; The plurality of "div" tags makes it possible to display the
+;; entries in any form you wish, using a CSS style.
+;;
+;; Also, an .RDF file can be generated from your journal by publishing
+;; it with the "rdf" style.  It uses the first two sentences of the
+;; first paragraph of each entry as its "description", and
+;; autogenerates tags for linking to the various entries.
+
+;;; Contributors:
+
+;; René Stadler (mail AT renestadler DOT de) provided a patch that
+;; causes dates in RSS feeds to be generated in a format that RSS
+;; readers can parse.
+
+;;; Code:
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Muse Journal Publishing
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'muse-publish)
+(require 'muse-html)
+(require 'muse-latex)
+(require 'muse-book)
+
+(defgroup muse-journal nil
+  "Rules for transforming a journal into its final form."
+  :group 'muse-publish)
+
+(defcustom muse-journal-heading-regexp
+  "\\(?:\\([0-9]+\\)\\(?:: \\)?\\)?\\(.+?\\)?"
+  "A regexp that matches a journal heading.
+Paren group 1 is the ISO date, group 2 is the optional category,
+and group 3 is the optional heading for the entry."
+  :type 'regexp
+  :group 'muse-journal)
+
+(defcustom muse-journal-date-format "%a, %e %b %Y"
+  "Date format to use for journal entries."
+  :type 'string
+  :group 'muse-journal)
+
+(defcustom muse-journal-html-heading-regexp
+  (concat "^<h2[^>\n]*>" muse-journal-heading-regexp "</h2>$")
+  "A regexp that matches a journal heading from an HTML document.
+Paren group 1 is the ISO date, group 2 is the optional category,
+and group 3 is the optional heading for the entry."
+  :type 'regexp
+  :group 'muse-journal)
+
+(defcustom muse-journal-rss-heading-regexp
+  (concat "^\\* " muse-journal-heading-regexp "$")
+  "A regexp that matches a journal heading from an HTML document.
+Paren group 1 is the ISO date, group 2 is the optional category,
+and group 3 is the optional heading for the entry."
+  :type 'regexp
+  :group 'muse-journal)
+
+(defcustom muse-journal-html-entry-template
+  "<div class=\"entry\">
+  <a name=\"%anchor%\" style=\"text-decoration: none\">&nbsp;</a>
+  <div class=\"entry-body\">
+    <div class=\"entry-head\">
+      <div class=\"entry-date\">
+        <span class=\"date\">%date%</span>
+      </div>
+      <div class=\"entry-title\">
+        <h2>%title%</h2>
+      </div>
+    </div>
+    <div class=\"entry-text\">
+      <div class=\"entry-qotd\">
+        <p>%qotd%</p>
+      </div>
+%text%
+    </div>
+  </div>
+</div>\n\n"
+  "Template used to publish individual journal entries as HTML.
+This may be text or a filename."
+  :type 'string
+  :group 'muse-journal)
+
+(defcustom muse-journal-latex-section
+  "\\section*{%title% \\hfill {\\normalsize %date%}}
+\\addcontentsline{toc}{chapter}{%title%}"
+  "Template used to publish a LaTeX section."
+  :type 'string
+  :group 'muse-journal)
+
+(defcustom muse-journal-latex-subsection
+  "\\subsection*{%title%}
+\\addcontentsline{toc}{section}{%title%}"
+  "Template used to publish a LaTeX subsection."
+  :type 'string
+  :group 'muse-journal)
+
+(defcustom muse-journal-markup-tags
+  '(("qotd" t nil nil muse-journal-qotd-tag))
+  "A list of tag specifications, for specially marking up Journal entries.
+See `muse-publish-markup-tags' for more info.
+
+This is used by journal-latex and its related styles, as well as
+the journal-rss-entry style, which both journal-rdf and
+journal-rss use."
+  :type '(repeat (list (string :tag "Markup tag")
+                       (boolean :tag "Expect closing tag" :value t)
+                       (boolean :tag "Parse attributes" :value nil)
+                       (boolean :tag "Nestable" :value nil)
+                       function))
+  :group 'muse-journal)
+
+;; FIXME: This doesn't appear to be used.
+(defun muse-journal-generate-pages ()
+  (let ((output-dir (muse-style-element :path)))
+    (goto-char (point-min))
+    (while (re-search-forward muse-journal-heading-regexp nil t)
+      (let* ((date (match-string 1))
+             (category (match-string 1))
+             (category-file (concat output-dir category "/index.html"))
+             (heading (match-string 1)))
+        t))))
+
+(defcustom muse-journal-rdf-extension ".rdf"
+  "Default file extension for publishing RDF (RSS 1.0) files."
+  :type 'string
+  :group 'muse-journal)
+
+(defcustom muse-journal-rdf-base-url ""
+  "The base URL of the website referenced by the RDF file."
+  :type 'string
+  :group 'muse-journal)
+
+(defcustom muse-journal-rdf-header
+  "<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"
+         xmlns=\"http://purl.org/rss/1.0/\"
+         xmlns:dc=\"http://purl.org/dc/elements/1.1/\">
+  <channel rdf:about=\"<lisp>(concat (muse-style-element :base-url)
+                                     (muse-publish-link-name))</lisp>\">
+    <title><lisp>(muse-publishing-directive \"title\")</lisp></title>
+    <link><lisp>(concat (muse-style-element :base-url)
+                       (concat (muse-page-name)
+                               muse-html-extension))</lisp></link>
+    <description><lisp>(muse-publishing-directive \"desc\")</lisp></description>
+    <items>
+      <rdf:Seq>
+        <rdf:li resource=\"<lisp>
+          (concat (muse-style-element :base-url)
+                  (concat (muse-page-name)
+                          muse-html-extension))</lisp>\"/>
+      </rdf:Seq>
+    </items>
+  </channel>\n"
+  "Header used for publishing RDF (RSS 1.0) files.
+This may be text or a filename."
+  :type 'string
+  :group 'muse-journal)
+
+(defcustom muse-journal-rdf-footer
+  "</rdf:RDF>\n"
+  "Footer used for publishing RDF (RSS 1.0) files.
+This may be text or a filename."
+  :type 'string
+  :group 'muse-journal)
+
+(defcustom muse-journal-rdf-date-format
+  "%Y-%m-%dT%H:%M:%S"
+  "Date format to use for RDF entries."
+  :type 'string
+  :group 'muse-journal)
+
+(defcustom muse-journal-rdf-entry-template
+  "\n  <item rdf:about=\"%link%#%anchor%\">
+    <title>%title%</title>
+    <description>
+      %desc%
+    </description>
+    <link>%link%#%anchor%</link>
+    <dc:date>%date%</dc:date>
+    <dc:creator>%maintainer%</dc:creator>
+  </item>\n"
+  "Template used to publish individual journal entries as RDF.
+This may be text or a filename."
+  :type 'string
+  :group 'muse-journal)
+
+(defcustom muse-journal-rdf-summarize-entries nil
+  "If non-nil, include only summaries in the RDF file, not the full data.
+
+The default is nil, because this annoys some subscribers."
+  :type 'boolean
+  :group 'muse-journal)
+
+(defcustom muse-journal-rss-extension ".xml"
+  "Default file extension for publishing RSS 2.0 files."
+  :type 'string
+  :group 'muse-journal)
+
+(defcustom muse-journal-rss-base-url ""
+  "The base URL of the website referenced by the RSS file."
+  :type 'string
+  :group 'muse-journal)
+
+(defcustom muse-journal-rss-header
+  "<\?xml version=\"1.0\" encoding=\"<lisp>
+  (muse-html-encoding)</lisp>\"?>
+<rss version=\"2.0\">
+  <channel>
+    <title><lisp>(muse-publishing-directive \"title\")</lisp></title>
+    <link><lisp>(concat (muse-style-element :base-url)
+                        (concat (muse-page-name)
+                                muse-html-extension))</lisp></link>
+    <description><lisp>(muse-publishing-directive \"desc\")</lisp></description>
+    <language>en-us</language>
+    <generator>Emacs Muse</generator>\n\n"
+  "Header used for publishing RSS 2.0 files.  This may be text or a filename."
+  :type 'string
+  :group 'muse-journal)
+
+(defcustom muse-journal-rss-footer
+  "\n\n  </channel>
+</rss>\n"
+  "Footer used for publishing RSS 2.0 files.  This may be text or a filename."
+  :type 'string
+  :group 'muse-journal)
+
+(defcustom muse-journal-rss-date-format
+  "%a, %d %b %Y %H:%M:%S %Z"
+  "Date format to use for RSS 2.0 entries."
+  :type 'string
+  :group 'muse-journal)
+
+(defcustom muse-journal-rss-entry-template
+  "\n    <item>
+      <title>%title%</title>
+      <link>%link%#%anchor%</link>
+      <description>%desc%</description>
+      <author><lisp>(muse-publishing-directive \"author\")</lisp></author>
+      <pubDate>%date%</pubDate>
+      <guid>%link%#%anchor%</guid>
+      %enclosure%
+    </item>\n"
+  "Template used to publish individual journal entries as RSS 2.0.
+This may be text or a filename."
+  :type 'string
+  :group 'muse-journal)
+
+(defcustom muse-journal-rss-enclosure-types-alist
+  '(("mp3" . "audio/mpeg"))
+  "File types that are accepted as RSS enclosures.
+This is an alist that maps file extension to content type.
+Useful for podcasting."
+  :type '(alist :key-type string :value-type string)
+  :group 'muse-journal)
+
+(defcustom muse-journal-rss-summarize-entries nil
+  "If non-nil, include only summaries in the RSS file, not the full data.
+
+The default is nil, because this annoys some subscribers."
+  :type 'boolean
+  :group 'muse-journal)
+
+(defcustom muse-journal-rss-markup-regexps
+  '((10000 muse-explicit-link-regexp 0 "\\2"))
+  "List of markup rules for publishing a Muse journal page to RSS 2.0.
+For more information on the structure of this list, see
+`muse-publish-markup-regexps'."
+  :type '(repeat (choice
+                  (list :tag "Markup rule"
+                        integer
+                        (choice regexp symbol)
+                        integer
+                        (choice string function symbol))
+                  function))
+  :group 'muse-journal)
+
+(defcustom muse-journal-rss-markup-functions
+  '((email . ignore)
+    (link  . ignore)
+    (url   . ignore))
+  "An alist of style types to custom functions for that kind of text.
+For more on the structure of this list, see
+`muse-publish-markup-functions'."
+  :type '(alist :key-type symbol :value-type function)
+  :group 'muse-journal)
+
+(defun muse-journal-anchorize-title (title)
+  "This strips tags from TITLE, truncates TITLE at begin parenthesis,
+and escapes any remaining non-alphanumeric characters."
+  (save-match-data
+    (if (string-match "(" title)
+        (setq title (substring title 0 (match-beginning 0))))
+    (if (string-match "<[^>]+>" title)
+        (setq title (replace-match "" nil nil title)))
+    (let (pos code len ch)
+      (while (setq pos (string-match (concat "[^" muse-regexp-alnum "_]")
+                                     title pos))
+          (setq ch (aref title pos)
+                code (format "%%%02X" (cond ((fboundp 'char-to-ucs)
+                                             (char-to-ucs ch))
+                                            ((fboundp 'char-to-int)
+                                             (char-to-int ch))
+                                            (t ch)))
+                len (length code)
+                title (concat (substring title 0 pos)
+                              code
+                              (when (< pos (length title))
+                                (substring title (1+ pos) nil)))
+                pos (+ len pos)))
+        title)))
+
+(defun muse-journal-sort-entries (&optional direction)
+  (interactive "P")
+  (sort-subr
+   direction
+   (function
+    (lambda ()
+      (if (re-search-forward "^\\* [0-9]+" nil t)
+          (goto-char (match-beginning 0))
+        (goto-char (point-max)))))
+   (function
+    (lambda ()
+      (if (re-search-forward "^\\* [0-9]+" nil t)
+          (goto-char (1- (match-beginning 0)))
+        (goto-char (point-max)))))
+   (function
+    (lambda ()
+      (forward-char 2)))
+   (function
+    (lambda ()
+      (end-of-line)))))
+
+(defun muse-journal-qotd-tag (beg end)
+  (muse-publish-ensure-block beg end)
+  (muse-insert-markup (muse-markup-text 'begin-quote))
+  (muse-insert-markup (muse-markup-text 'begin-quote-item))
+  (goto-char end)
+  (muse-insert-markup (muse-markup-text 'end-quote-item))
+  (muse-insert-markup (muse-markup-text 'end-quote)))
+
+(defun muse-journal-html-munge-buffer ()
+  (goto-char (point-min))
+  (let ((heading-regexp muse-journal-html-heading-regexp)
+        (inhibit-read-only t))
+    (while (re-search-forward heading-regexp nil t)
+      (let* ((date (match-string 1))
+             (orig-date date)
+             (title (match-string 2))
+             (clean-title title)
+             datestamp qotd text)
+        (delete-region (match-beginning 0) (match-end 0))
+        (if clean-title
+            (save-match-data
+              (while (string-match "\\(^<[^>]+>\\|<[^>]+>$\\)" clean-title)
+                (setq clean-title (replace-match "" nil nil clean-title)))))
+        (save-match-data
+          (when (and date
+                     (string-match
+                      (concat "\\`\\([1-9][0-9][0-9][0-9]\\)[./]?"
+                              "\\([0-1][0-9]\\)[./]?\\([0-3][0-9]\\)") date))
+            (setq datestamp
+                  (encode-time
+                   0 0 0
+                   (string-to-number (match-string 3 date))
+                   (string-to-number (match-string 2 date))
+                   (string-to-number (match-string 1 date))
+                   nil)
+                  date (concat (format-time-string
+                                muse-journal-date-format datestamp)
+                               (substring date (match-end 0))))))
+        (save-restriction
+          (narrow-to-region
+           (point) (if (re-search-forward
+                        (concat "\\(^<hr>$\\|"
+                                heading-regexp "\\)") nil t)
+                       (match-beginning 0)
+                     (point-max)))
+          (goto-char (point-max))
+          (while (and (not (bobp))
+                      (eq ?\  (char-syntax (char-before))))
+            (delete-char -1))
+          (goto-char (point-min))
+          (while (and (not (eobp))
+                      (eq ?\  (char-syntax (char-after))))
+            (delete-char 1))
+          (save-excursion
+            (when (search-forward "<qotd>" nil t)
+              (let ((tag-beg (match-beginning 0))
+                    (beg (match-end 0))
+                    end)
+                (re-search-forward "</qotd>\n*")
+                (setq end (point-marker))
+                (save-restriction
+                  (narrow-to-region beg (match-beginning 0))
+                  (muse-publish-escape-specials (point-min) (point-max)
+                                                nil 'document)
+                  (setq qotd (buffer-substring-no-properties
+                              (point-min) (point-max))))
+                (delete-region tag-beg end)
+                (set-marker end nil))))
+          (setq text (buffer-string))
+          (delete-region (point-min) (point-max))
+          (let ((entry muse-journal-html-entry-template))
+            (muse-insert-file-or-string entry)
+            (muse-publish-mark-read-only (point-min) (point-max))
+            (goto-char (point-min))
+            (while (search-forward "%date%" nil t)
+              (remove-text-properties (match-beginning 0) (match-end 0)
+                                      '(read-only nil rear-nonsticky nil))
+              (replace-match (or date "") nil t))
+            (goto-char (point-min))
+            (while (search-forward "%title%" nil t)
+              (remove-text-properties (match-beginning 0) (match-end 0)
+                                      '(read-only nil rear-nonsticky nil))
+              (replace-match (or title "&nbsp;") nil t))
+            (goto-char (point-min))
+            (while (search-forward "%anchor%" nil t)
+              (replace-match (muse-journal-anchorize-title
+                              (or clean-title orig-date))
+                             nil t))
+            (goto-char (point-min))
+            (while (search-forward "%qotd%" nil t)
+              (save-restriction
+                (narrow-to-region (match-beginning 0) (match-end 0))
+                (delete-region (point-min) (point-max))
+                (when qotd (muse-insert-markup qotd))))
+            (goto-char (point-min))
+            (while (search-forward "%text%" nil t)
+              (remove-text-properties (match-beginning 0) (match-end 0)
+                                      '(read-only nil rear-nonsticky nil))
+              (replace-match text nil t))
+            (when (null qotd)
+              (goto-char (point-min))
+              (when (search-forward "<div class=\"entry-qotd\">" nil t)
+                (let ((beg (match-beginning 0)))
+                  (re-search-forward "</div>\n*" nil t)
+                  (delete-region beg (point))))))))))
+  ;; indicate that we are to continue the :before-end processing
+  nil)
+
+(defun muse-journal-latex-munge-buffer ()
+  (goto-char (point-min))
+  (let ((heading-regexp
+         (concat "^" (regexp-quote (muse-markup-text 'section))
+                 muse-journal-heading-regexp
+                 (regexp-quote (muse-markup-text 'section-end)) "$"))
+        (inhibit-read-only t))
+    (when (re-search-forward heading-regexp nil t)
+      (goto-char (match-beginning 0))
+      (sort-subr nil
+                 (function
+                  (lambda ()
+                    (if (re-search-forward heading-regexp nil t)
+                        (goto-char (match-beginning 0))
+                      (goto-char (point-max)))))
+                 (function
+                  (lambda ()
+                    (if (re-search-forward heading-regexp nil t)
+                        (goto-char (1- (match-beginning 0)))
+                      (goto-char (point-max)))))
+                 (function
+                  (lambda ()
+                    (forward-char 2)))
+                 (function
+                  (lambda ()
+                    (end-of-line)))))
+    (while (re-search-forward heading-regexp nil t)
+      (let ((date (match-string 1))
+            (title (match-string 2))
+            ;; FIXME: Nothing is done with qotd
+            qotd section)
+        (save-match-data
+          (when (and date
+                     (string-match
+                      (concat "\\([1-9][0-9][0-9][0-9]\\)[./]?"
+                              "\\([0-1][0-9]\\)[./]?\\([0-3][0-9]\\)") date))
+            (setq date (encode-time
+                        0 0 0
+                        (string-to-number (match-string 3 date))
+                        (string-to-number (match-string 2 date))
+                        (string-to-number (match-string 1 date))
+                        nil)
+                  date (format-time-string
+                        muse-journal-date-format date))))
+        (save-restriction
+          (narrow-to-region (match-beginning 0) (match-end 0))
+          (delete-region (point-min) (point-max))
+          (muse-insert-markup muse-journal-latex-section)
+          (goto-char (point-min))
+          (while (search-forward "%title%" nil t)
+            (replace-match (or title "Untitled") nil t))
+          (goto-char (point-min))
+          (while (search-forward "%date%" nil t)
+            (replace-match (or date "") nil t))))))
+  (goto-char (point-min))
+  (let ((subheading-regexp
+         (concat "^" (regexp-quote (muse-markup-text 'subsection))
+                 "\\([^\n}]+\\)"
+                 (regexp-quote (muse-markup-text 'subsection-end)) "$"))
+        (inhibit-read-only t))
+    (while (re-search-forward subheading-regexp nil t)
+      (let ((title (match-string 1)))
+        (save-restriction
+          (narrow-to-region (match-beginning 0) (match-end 0))
+          (delete-region (point-min) (point-max))
+          (muse-insert-markup muse-journal-latex-subsection)
+          (goto-char (point-min))
+          (while (search-forward "%title%" nil t)
+            (replace-match title nil t))))))
+  ;; indicate that we are to continue the :before-end processing
+  nil)
+
+(defun muse-journal-rss-munge-buffer ()
+  (goto-char (point-min))
+  (let ((heading-regexp muse-journal-rss-heading-regexp)
+        (inhibit-read-only t))
+    (while (re-search-forward heading-regexp nil t)
+      (let* ((date (match-string 1))
+             (orig-date date)
+             (title (match-string 2))
+             ;; FIXME: Nothing is done with qotd
+             enclosure qotd desc)
+        (if title
+            (save-match-data
+              (if (string-match muse-explicit-link-regexp title)
+                  (setq enclosure (muse-get-link title)
+                        title (muse-get-link-desc title)))))
+        (save-match-data
+          (when (and date
+                     (string-match
+                      (concat "\\([1-9][0-9][0-9][0-9]\\)[./]?"
+                              "\\([0-1][0-9]\\)[./]?\\([0-3][0-9]\\)") date))
+            (setq date (encode-time 0 0 0
+                                    (string-to-number (match-string 3 date))
+                                    (string-to-number (match-string 2 date))
+                                    (string-to-number (match-string 1 date))
+                                    nil)
+                  ;; make sure that date is in a format that RSS
+                  ;; readers can handle
+                  date (let ((system-time-locale "C"))
+                         (format-time-string
+                          (muse-style-element :date-format) date)))))
+        (save-restriction
+          (narrow-to-region
+           (match-beginning 0)
+           (if (re-search-forward heading-regexp nil t)
+               (match-beginning 0)
+             (if (re-search-forward "^Footnotes:" nil t)
+                 (match-beginning 0)
+               (point-max))))
+          (goto-char (point-min))
+          (delete-region (point) (muse-line-end-position))
+          (re-search-forward "</qotd>\n+" nil t)
+          (while (and (char-after)
+                      (eq ?\  (char-syntax (char-after))))
+            (delete-char 1))
+          (let ((beg (point)))
+            (if (muse-style-element :summarize)
+                (progn
+                  (forward-sentence 2)
+                  (setq desc (concat (buffer-substring beg (point)) "...")))
+              (save-restriction
+                (muse-publish-markup-buffer "rss-entry" "journal-rss-entry")
+                (goto-char (point-min))
+                (if (re-search-forward "Page published by Emacs Muse" nil t)
+                    (goto-char (muse-line-end-position))
+                  (muse-display-warning
+                   (concat
+                    "Cannot find 'Page published by Emacs Muse begins here'.\n"
+                    "You will probably need this text in your header."))
+                  (goto-char (point-min)))
+                (setq beg (point))
+                (if (re-search-forward "Page published by Emacs Muse" nil t)
+                    (goto-char (muse-line-beginning-position))
+                  (muse-display-warning
+                   (concat
+                    "Cannot find 'Page published by Emacs Muse ends here'.\n"
+                    "You will probably need this text in your footer."))
+                  (goto-char (point-max)))
+                (setq desc (buffer-substring beg (point))))))
+          (unless (string= desc "")
+            (setq desc (concat "<![CDATA[" desc "]]>")))
+          (delete-region (point-min) (point-max))
+          (let ((entry (muse-style-element :entry-template)))
+            (muse-insert-file-or-string entry)
+            (goto-char (point-min))
+            (while (search-forward "%date%" nil t)
+              (replace-match (or date "") nil t))
+            (goto-char (point-min))
+            (while (search-forward "%title%" nil t)
+              (replace-match "")
+              (save-restriction
+                (narrow-to-region (point) (point))
+                (insert (or title "Untitled"))
+                (remove-text-properties (match-beginning 0) (match-end 0)
+                                        '(read-only nil rear-nonsticky nil))
+                (let ((muse-publishing-current-style (muse-style "html")))
+                  (muse-publish-escape-specials (point-min) (point-max)
+                                                nil 'document))))
+            (goto-char (point-min))
+            (while (search-forward "%desc%" nil t)
+              (replace-match desc nil t))
+            (goto-char (point-min))
+            (while (search-forward "%enclosure%" nil t)
+              (replace-match
+               (if (null enclosure)
+                   ""
+                 (save-match-data
+                   (format
+                    "<enclosure url=\"%s\" %stype=\"%s\"/>"
+                    (if (string-match "//" enclosure)
+                        enclosure
+                      (concat (muse-style-element :base-url)
+                              enclosure))
+                    (let ((file
+                           (expand-file-name enclosure
+                                             (muse-style-element :path))))
+                      (if (file-readable-p file)
+                          (format "length=\"%d\" "
+                                  (nth 7 (file-attributes file)))
+                        ""))
+                    (if (string-match "\\.\\([^.]+\\)$" enclosure)
+                        (let* ((ext (match-string 1 enclosure))
+                               (type
+                                (assoc
+                                 ext muse-journal-rss-enclosure-types-alist)))
+                          (if type
+                              (cdr type)
+                            "application/octet-stream"))))))
+               nil t))
+            (goto-char (point-min))
+            (while (search-forward "%link%" nil t)
+              (replace-match
+               (concat (muse-style-element :base-url)
+                       (concat (muse-page-name)
+                               muse-html-extension))
+               nil t))
+            (goto-char (point-min))
+            (while (search-forward "%anchor%" nil t)
+              (replace-match
+               (muse-journal-anchorize-title (or title orig-date))
+               nil t))
+            (goto-char (point-min))
+            (while (search-forward "%maintainer%" nil t)
+              (replace-match
+               (or (muse-style-element :maintainer)
+                   (concat "webmaster@" (system-name)))
+               nil t)))))))
+  ;; indicate that we are to continue the :before-end processing
+  nil)
+
+
+;;; Register the Muse Journal Publishers
+
+(muse-derive-style "journal-html" "html"
+                   :before-end 'muse-journal-html-munge-buffer)
+
+(muse-derive-style "journal-xhtml" "xhtml"
+                   :before-end 'muse-journal-html-munge-buffer)
+
+(muse-derive-style "journal-latex" "latex"
+                   :tags 'muse-journal-markup-tags
+                   :before-end 'muse-journal-latex-munge-buffer)
+
+(muse-derive-style "journal-pdf" "pdf"
+                   :tags 'muse-journal-markup-tags
+                   :before-end 'muse-journal-latex-munge-buffer)
+
+(muse-derive-style "journal-book-latex" "book-latex"
+                   ;;:nochapters
+                   :tags 'muse-journal-markup-tags
+                   :before-end 'muse-journal-latex-munge-buffer)
+
+(muse-derive-style "journal-book-pdf" "book-pdf"
+                   ;;:nochapters
+                   :tags 'muse-journal-markup-tags
+                   :before-end 'muse-journal-latex-munge-buffer)
+
+(muse-define-style "journal-rdf"
+                   :suffix         'muse-journal-rdf-extension
+                   :regexps        'muse-journal-rss-markup-regexps
+                   :functions      'muse-journal-rss-markup-functions
+                   :before         'muse-journal-rss-munge-buffer
+                   :header         'muse-journal-rdf-header
+                   :footer         'muse-journal-rdf-footer
+                   :date-format    'muse-journal-rdf-date-format
+                   :entry-template 'muse-journal-rdf-entry-template
+                   :base-url       'muse-journal-rdf-base-url
+                   :summarize      'muse-journal-rdf-summarize-entries)
+
+(muse-define-style "journal-rss"
+                   :suffix         'muse-journal-rss-extension
+                   :regexps        'muse-journal-rss-markup-regexps
+                   :functions      'muse-journal-rss-markup-functions
+                   :before         'muse-journal-rss-munge-buffer
+                   :header         'muse-journal-rss-header
+                   :footer         'muse-journal-rss-footer
+                   :date-format    'muse-journal-rss-date-format
+                   :entry-template 'muse-journal-rss-entry-template
+                   :base-url       'muse-journal-rss-base-url
+                   :summarize      'muse-journal-rss-summarize-entries)
+
+;; Used by `muse-journal-rss-munge-buffer' to mark up individual entries
+(muse-derive-style "journal-rss-entry" "html"
+                   :tags 'muse-journal-markup-tags)
+
+(provide 'muse-journal)
+
+;;; muse-journal.el ends here
diff --git a/packages/muse/muse-latex.el b/packages/muse/muse-latex.el
new file mode 100644 (file)
index 0000000..e416367
--- /dev/null
@@ -0,0 +1,669 @@
+;;; muse-latex.el --- publish entries in LaTex or PDF format
+
+;; Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010
+;;   Free Software Foundation, Inc.
+
+;; This file is part of Emacs Muse.  It is not part of GNU Emacs.
+
+;; Emacs Muse 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, or (at your
+;; option) any later version.
+
+;; Emacs Muse 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 Emacs Muse; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;;; Contributors:
+
+;; Li Daobing (lidaobing AT gmail DOT com) provided CJK support.
+
+;; Trent Buck (trentbuck AT gmail DOT com) gave valuable advice for
+;; how to treat LaTeX specials and the like.
+
+;; Matthias Kegelmann (mathias DOT kegelmann AT sdm DOT de) provided a
+;; scenario where we would need to respect the <contents> tag.
+
+;; Jean Magnan de Bornier (jean AT bornier DOT net) provided the
+;; markup string for link-and-anchor.
+
+;; Jim Ottaway (j DOT ottaway AT lse DOT ac DOT uk) implemented slides
+;; and lecture notes.
+
+;; Karl Berry (karl AT freefriends DOT org) suggested how to escape
+;; additional special characters in image filenames.
+
+;;; Code:
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Muse LaTeX Publishing
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'muse-publish)
+
+(defgroup muse-latex nil
+  "Rules for marking up a Muse file as a LaTeX article."
+  :group 'muse-publish)
+
+(defcustom muse-latex-extension ".tex"
+  "Default file extension for publishing LaTeX files."
+  :type 'string
+  :group 'muse-latex)
+
+(defcustom muse-latex-pdf-extension ".pdf"
+  "Default file extension for publishing LaTeX files to PDF."
+  :type 'string
+  :group 'muse-latex)
+
+(defcustom muse-latex-pdf-browser "open %s"
+  "The program to use when browsing a published PDF file.
+This should be a format string."
+  :type 'string
+  :group 'muse-latex)
+
+(defcustom muse-latex-pdf-program "pdflatex"
+  "The program that is called to generate PDF content from LaTeX content."
+  :type 'string
+  :group 'muse-latex)
+
+(defcustom muse-latex-pdf-cruft
+  '(".aux" ".log" ".nav" ".out" ".snm" ".toc" ".vrb")
+  "Extensions of files to remove after generating PDF output successfully."
+  :type 'string
+  :group 'muse-latex)
+
+(defcustom muse-latex-header
+  "\\documentclass{article}
+
+\\usepackage[english]{babel}
+\\usepackage{ucs}
+\\usepackage[utf8x]{inputenc}
+\\usepackage[T1]{fontenc}
+\\usepackage{hyperref}
+\\usepackage[pdftex]{graphicx}
+
+\\def\\museincludegraphics{%
+  \\begingroup
+  \\catcode`\\|=0
+  \\catcode`\\\\=12
+  \\catcode`\\#=12
+  \\includegraphics[width=0.75\\textwidth]
+}
+
+\\begin{document}
+
+\\title{<lisp>(muse-publish-escape-specials-in-string
+  (muse-publishing-directive \"title\") 'document)</lisp>}
+\\author{<lisp>(muse-publishing-directive \"author\")</lisp>}
+\\date{<lisp>(muse-publishing-directive \"date\")</lisp>}
+
+\\maketitle
+
+<lisp>(and muse-publish-generate-contents
+           (not muse-latex-permit-contents-tag)
+           \"\\\\tableofcontents\n\\\\newpage\")</lisp>\n\n"
+  "Header used for publishing LaTeX files.  This may be text or a filename."
+  :type 'string
+  :group 'muse-latex)
+
+(defcustom muse-latex-footer "<lisp>(muse-latex-bibliography)</lisp>
+\\end{document}\n"
+  "Footer used for publishing LaTeX files.  This may be text or a filename."
+  :type 'string
+  :group 'muse-latex)
+
+(defcustom muse-latexcjk-header
+  "\\documentclass{article}
+
+\\usepackage{CJK}
+\\usepackage{indentfirst}
+\\usepackage[CJKbookmarks=true]{hyperref}
+\\usepackage[pdftex]{graphicx}
+
+\\begin{document}
+\\begin{CJK*}<lisp>(muse-latexcjk-encoding)</lisp>
+
+\\title{<lisp>(muse-publish-escape-specials-in-string
+  (muse-publishing-directive \"title\") 'document)</lisp>}
+\\author{<lisp>(muse-publishing-directive \"author\")</lisp>}
+\\date{<lisp>(muse-publishing-directive \"date\")</lisp>}
+
+\\maketitle
+
+<lisp>(and muse-publish-generate-contents
+           (not muse-latex-permit-contents-tag)
+           \"\\\\tableofcontents\n\\\\newpage\")</lisp>\n\n"
+  "Header used for publishing LaTeX files (CJK).  This may be text or a
+filename."
+  :type 'string
+  :group 'muse-latex)
+
+(defcustom muse-latexcjk-footer
+  "\n\\end{CJK*}
+\\end{document}\n"
+  "Footer used for publishing LaTeX files (CJK).  This may be text or a
+filename."
+  :type 'string
+  :group 'muse-latex)
+
+(defcustom muse-latex-slides-header
+  "\\documentclass[ignorenonframetext]{beamer}
+
+\\usepackage[english]{babel}
+\\usepackage{ucs}
+\\usepackage[utf8x]{inputenc}
+\\usepackage[T1]{fontenc}
+\\usepackage{hyperref}
+
+\\def\\museincludegraphics{%
+  \\begingroup
+  \\catcode`\\|=0
+  \\catcode`\\\\=12
+  \\catcode`\\#=12
+  \\includegraphics[width=0.50\\textwidth]
+}
+
+\\title{<lisp>(muse-publish-escape-specials-in-string
+  (muse-publishing-directive \"title\") 'document)</lisp>}
+\\author{<lisp>(muse-publishing-directive \"author\")</lisp>}
+\\date{<lisp>(muse-publishing-directive \"date\")</lisp>}
+
+\\begin{document}
+
+\\frame{\\titlepage}
+
+<lisp>(and muse-publish-generate-contents
+           \"\\\\frame{\\\\tableofcontents}\")</lisp>\n\n"
+  "Header for publishing of slides using LaTeX.
+This may be text or a filename.
+
+You must have the Beamer extension for LaTeX installed for this to work."
+  :type 'string
+  :group 'muse-latex)
+
+(defcustom muse-latex-lecture-notes-header
+  "\\documentclass{article}
+\\usepackage{beamerarticle}
+
+\\usepackage[english]{babel}
+\\usepackage{ucs}
+\\usepackage[utf8x]{inputenc}
+\\usepackage[T1]{fontenc}
+\\usepackage{hyperref}
+\\usepackage[pdftex]{graphicx}
+
+\\def\\museincludegraphics{%
+  \\begingroup
+  \\catcode`\\|=0
+  \\catcode`\\\\=12
+  \\catcode`\\#=12
+  \\includegraphics[width=0.50\\textwidth]
+}
+
+\\title{<lisp>(muse-publish-escape-specials-in-string
+  (muse-publishing-directive \"title\") 'document)</lisp>}
+\\author{<lisp>(muse-publishing-directive \"author\")</lisp>}
+\\date{<lisp>(muse-publishing-directive \"date\")</lisp>}
+
+\\begin{document}
+
+\\frame{\\titlepage}
+
+<lisp>(and muse-publish-generate-contents
+           \"\\\\frame{\\\\tableofcontents}\")</lisp>\n\n"
+  "Header for publishing of lecture notes using LaTeX.
+This may be text or a filename.
+
+You must have the Beamer extension for LaTeX installed for this to work."
+  :type 'string
+  :group 'muse-latex)
+
+(defcustom muse-latex-markup-regexps
+  `(;; numeric ranges
+    (10000 "\\([0-9]+\\)-\\([0-9]+\\)" 0 "\\1--\\2")
+
+    ;; be careful of closing quote pairs
+    (10100 "\"'" 0 "\"\\\\-'"))
+  "List of markup regexps for identifying regions in a Muse page.
+For more on the structure of this list, see `muse-publish-markup-regexps'."
+  :type '(repeat (choice
+                  (list :tag "Markup rule"
+                        integer
+                        (choice regexp symbol)
+                        integer
+                        (choice string function symbol))
+                  function))
+  :group 'muse-latex)
+
+(defcustom muse-latex-markup-functions
+  '((table . muse-latex-markup-table))
+  "An alist of style types to custom functions for that kind of text.
+For more on the structure of this list, see
+`muse-publish-markup-functions'."
+  :type '(alist :key-type symbol :value-type function)
+  :group 'muse-latex)
+
+(defcustom muse-latex-markup-strings
+  '((image-with-desc . "\\begin{figure}[h]
+\\centering\\museincludegraphics{%s.%s}|endgroup
+\\caption{%s}
+\\end{figure}")
+    (image           . "\\begin{figure}[h]
+\\centering\\museincludegraphics{%s.%s}|endgroup
+\\end{figure}")
+    (image-link      . "%% %s
+\\museincludegraphics{%s.%s}|endgroup")
+    (anchor-ref      . "\\ref{%s}")
+    (url             . "\\url{%s}")
+    (url-and-desc    . "\\href{%s}{%s}\\footnote{%1%}")
+    (link            . "\\href{%s}{%s}\\footnote{%1%}")
+    (link-and-anchor . "\\href{%1%}{%3%}\\footnote{%1%}")
+    (email-addr      . "\\verb|%s|")
+    (anchor          . "\\label{%s}")
+    (emdash          . "---")
+    (comment-begin   . "% ")
+    (rule            . "\\vspace{.5cm}\\hrule\\vspace{.5cm}")
+    (no-break-space  . "~")
+    (line-break      . "\\\\")
+    (enddots         . "\\ldots{}")
+    (dots            . "\\dots{}")
+    (part            . "\\part{")
+    (part-end        . "}")
+    (chapter         . "\\chapter{")
+    (chapter-end     . "}")
+    (section         . "\\section{")
+    (section-end     . "}")
+    (subsection      . "\\subsection{")
+    (subsection-end  . "}")
+    (subsubsection   . "\\subsubsection{")
+    (subsubsection-end . "}")
+    (section-other   . "\\paragraph{")
+    (section-other-end . "}")
+    (footnote        . "\\footnote{")
+    (footnote-end    . "}")
+    (footnotetext    . "\\footnotetext[%d]{")
+    (begin-underline . "\\underline{")
+    (end-underline   . "}")
+    (begin-literal   . "\\texttt{")
+    (end-literal     . "}")
+    (begin-emph      . "\\emph{")
+    (end-emph        . "}")
+    (begin-more-emph . "\\textbf{")
+    (end-more-emph   . "}")
+    (begin-most-emph . "\\textbf{\\emph{")
+    (end-most-emph   . "}}")
+    (begin-verse     . "\\begin{verse}\n")
+    (end-verse-line  . " \\\\")
+    (verse-space     . "~~~~")
+    (end-verse       . "\n\\end{verse}")
+    (begin-example   . "\\begin{quote}\n\\begin{verbatim}")
+    (end-example     . "\\end{verbatim}\n\\end{quote}")
+    (begin-center    . "\\begin{center}\n")
+    (end-center      . "\n\\end{center}")
+    (begin-quote     . "\\begin{quote}\n")
+    (end-quote       . "\n\\end{quote}")
+    (begin-cite     . "\\cite{")
+    (begin-cite-author . "\\citet{")
+    (begin-cite-year . "\\citet{")
+    (end-cite        . "}")
+    (begin-uli       . "\\begin{itemize}\n")
+    (end-uli         . "\n\\end{itemize}")
+    (begin-uli-item  . "\\item ")
+    (begin-oli       . "\\begin{enumerate}\n")
+    (end-oli         . "\n\\end{enumerate}")
+    (begin-oli-item  . "\\item ")
+    (begin-dl        . "\\begin{description}\n")
+    (end-dl          . "\n\\end{description}")
+    (begin-ddt       . "\\item[")
+    (end-ddt         . "] \\mbox{}\n"))
+  "Strings used for marking up text.
+These cover the most basic kinds of markup, the handling of which
+differs little between the various styles."
+  :type '(alist :key-type symbol :value-type string)
+  :group 'muse-latex)
+
+(defcustom muse-latex-slides-markup-tags
+  '(("slide" t t nil muse-latex-slide-tag))
+ "A list of tag specifications, for specially marking up LaTeX slides."
+  :type '(repeat (list (string :tag "Markup tag")
+                       (boolean :tag "Expect closing tag" :value t)
+                       (boolean :tag "Parse attributes" :value nil)
+                       (boolean :tag "Nestable" :value nil)
+                       function))
+  :group 'muse-latex)
+
+(defcustom muse-latexcjk-encoding-map
+  '((utf-8              . "{UTF8}{song}")
+    (japanese-iso-8bit  . "[dnp]{JIS}{min}")
+    (chinese-big5       . "{Bg5}{bsmi}")
+    (mule-utf-8         . "{UTF8}{song}")
+    (chinese-iso-8bit   . "{GB}{song}")
+    (chinese-gbk        . "{GBK}{song}"))
+  "An alist mapping emacs coding systems to appropriate CJK codings.
+Use the base name of the coding system (ie, without the -unix)."
+  :type '(alist :key-type coding-system :value-type string)
+  :group 'muse-latex)
+
+(defcustom muse-latexcjk-encoding-default "{GB}{song}"
+  "The default Emacs buffer encoding to use in published files.
+This will be used if no special characters are found."
+  :type 'string
+  :group 'muse-latex)
+
+(defun muse-latexcjk-encoding ()
+  (when (boundp 'buffer-file-coding-system)
+    (muse-latexcjk-transform-content-type buffer-file-coding-system)))
+
+(defun muse-latexcjk-transform-content-type (content-type)
+  "Using `muse-cjklatex-encoding-map', try and resolve an emacs coding
+system to an associated CJK coding system."
+  (let ((match (and (fboundp 'coding-system-base)
+                    (assoc (coding-system-base content-type)
+                           muse-latexcjk-encoding-map))))
+    (if match
+        (cdr match)
+      muse-latexcjk-encoding-default)))
+
+(defcustom muse-latex-markup-specials-document
+  '((?\\ . "\\textbackslash{}")
+    (?\_ . "\\textunderscore{}")
+    (?\< . "\\textless{}")
+    (?\> . "\\textgreater{}")
+    (?^  . "\\^{}")
+    (?\~ . "\\~{}")
+    (?\@ . "\\@")
+    (?\$ . "\\$")
+    (?\% . "\\%")
+    (?\{ . "\\{")
+    (?\} . "\\}")
+    (?\& . "\\&")
+    (?\# . "\\#"))
+  "A table of characters which must be represented specially.
+These are applied to the entire document, sans already-escaped
+regions."
+  :type '(alist :key-type character :value-type string)
+  :group 'muse-latex)
+
+(defcustom muse-latex-markup-specials-example
+  '()
+  "A table of characters which must be represented specially.
+These are applied to <example> regions.
+
+With the default interpretation of <example> regions, no specials
+need to be escaped."
+  :type '(alist :key-type character :value-type string)
+  :group 'muse-latex)
+
+(defcustom muse-latex-markup-specials-literal
+  '((?\n . "\\\n")
+    (?\\ . "\\textbackslash{}")
+    (?_  . "\\textunderscore{}")
+    (?\< . "\\textless{}")
+    (?\> . "\\textgreater{}")
+    (?^  . "\\^{}")
+    (?\~ . "\\~{}")
+    (?\$ . "\\$")
+    (?\% . "\\%")
+    (?\{ . "\\{")
+    (?\} . "\\}")
+    (?\& . "\\&")
+    (?\# . "\\#"))
+  "A table of characters which must be represented specially.
+This applies to =monospaced text= and <code> regions."
+  :type '(alist :key-type character :value-type string)
+  :group 'muse-latex)
+
+(defcustom muse-latex-markup-specials-url
+  '((?\\ . "\\textbackslash{}")
+    (?\_ . "\\_")
+    (?\< . "\\<")
+    (?\> . "\\>")
+    (?\$ . "\\$")
+    (?\% . "\\%")
+    (?\{ . "\\{")
+    (?\} . "\\}")
+    (?\& . "\\&")
+    (?\# . "\\#"))
+  "A table of characters which must be represented specially.
+These are applied to URLs."
+  :type '(alist :key-type character :value-type string)
+  :group 'muse-latex)
+
+(defcustom muse-latex-markup-specials-image
+  '((?\\ . "\\\\")
+    (?\< . "\\<")
+    (?\> . "\\>")
+    (?\$ . "\\$")
+    (?\% . "\\%")
+    (?\{ . "\\{")
+    (?\} . "\\}")
+    (?\& . "\\&")
+    (?\# . "\\#")
+    (?\| . "\\|"))
+  "A table of characters which must be represented specially.
+These are applied to image filenames."
+  :type '(alist :key-type character :value-type string)
+  :group 'muse-latex)
+
+(defun muse-latex-decide-specials (context)
+  "Determine the specials to escape, depending on CONTEXT."
+  (cond ((memq context '(underline emphasis document url-desc verbatim
+                                   footnote))
+         muse-latex-markup-specials-document)
+        ((eq context 'image)
+         muse-latex-markup-specials-image)
+        ((memq context '(email url))
+         muse-latex-markup-specials-url)
+        ((eq context 'literal)
+         muse-latex-markup-specials-literal)
+        ((eq context 'example)
+         muse-latex-markup-specials-example)
+        (t (error "Invalid context '%s' in muse-latex" context))))
+
+(defcustom muse-latex-permit-contents-tag nil
+  "If nil, ignore <contents> tags.  Otherwise, insert table of contents.
+
+Most of the time, it is best to have a table of contents on the
+first page, with a new page immediately following.  To make this
+work with documents published in both HTML and LaTeX, we need to
+ignore the <contents> tag.
+
+If you don't agree with this, then set this option to non-nil,
+and it will do what you expect."
+  :type 'boolean
+  :group 'muse-latex)
+
+(defun muse-latex-markup-table ()
+  (let* ((table-info (muse-publish-table-fields (match-beginning 0)
+                                                (match-end 0)))
+         (row-len (car table-info))
+         (field-list (cdr table-info)))
+    (when table-info
+      (muse-insert-markup "\\begin{tabular}{" (make-string row-len ?l) "}\n")
+      (dolist (fields field-list)
+        (let ((type (car fields)))
+          (setq fields (cdr fields))
+          (if (eq type 'hline)
+              (muse-insert-markup "\\hline\n")
+            (when (= type 3)
+              (muse-insert-markup "\\hline\n"))
+            (insert (car fields))
+            (setq fields (cdr fields))
+            (dolist (field fields)
+              (muse-insert-markup " & ")
+              (insert field))
+            (muse-insert-markup " \\\\\n")
+            (when (= type 2)
+              (muse-insert-markup "\\hline\n")))))
+      (muse-insert-markup "\\end{tabular}"))))
+
+;;; Tags for LaTeX
+
+(defun muse-latex-slide-tag (beg end attrs)
+  "Publish the <slide> tag in LaTeX.
+This is used by the slides and lecture-notes publishing styles."
+  (let ((title (cdr (assoc "title" attrs))))
+    (goto-char beg)
+    (muse-insert-markup "\\begin{frame}[fragile]\n")
+    (when title
+      (muse-insert-markup "\\frametitle{")
+      (insert title)
+      (muse-insert-markup "}\n"))
+    (save-excursion
+      (goto-char end)
+      (muse-insert-markup "\n\\end{frame}"))))
+
+;;; Post-publishing functions
+
+(defun muse-latex-fixup-dquotes ()
+  "Fixup double quotes."
+  (goto-char (point-min))
+  (let ((open t))
+    (while (search-forward "\"" nil t)
+      (unless (get-text-property (match-beginning 0) 'read-only)
+        (when (or (bobp)
+                  (eq (char-before) ?\n))
+          (setq open t))
+        (if open
+            (progn
+              (replace-match "``")
+              (setq open nil))
+          (replace-match "''")
+          (setq open t))))))
+
+(defun muse-latex-fixup-citations ()
+  "Replace semicolons in multi-head citations with colons."
+  (goto-char (point-min))
+  (while (re-search-forward "\\\\cite.?{" nil t)
+    (let ((start (point))
+          (end (re-search-forward "}")))
+      (save-restriction
+        (narrow-to-region start end)
+        (goto-char (point-min))
+        (while (re-search-forward ";" nil t)
+          (replace-match ","))))))
+
+(defun muse-latex-fixup-headings ()
+  "Remove footnotes in headings, since LaTeX does not permit them to exist.
+
+This can happen if there is a link in a heading, because by
+default Muse will add a footnote for each link."
+  (goto-char (point-min))
+  (while (re-search-forward "^\\\\section.?{" nil t)
+    (save-restriction
+      (narrow-to-region (match-beginning 0) (muse-line-end-position))
+      (goto-char (point-min))
+      (while (re-search-forward "\\\\footnote{[^}\n]+}" nil t)
+        (replace-match ""))
+      (forward-line 1))))
+
+(defun muse-latex-munge-buffer ()
+  (muse-latex-fixup-dquotes)
+  (muse-latex-fixup-citations)
+  (muse-latex-fixup-headings)
+  (when (and muse-latex-permit-contents-tag
+             muse-publish-generate-contents)
+    (goto-char (car muse-publish-generate-contents))
+    (muse-insert-markup "\\tableofcontents")))
+
+(defun muse-latex-bibliography ()
+  (save-excursion
+    (goto-char (point-min))
+    (if (re-search-forward "\\\\cite.?{" nil t)
+        (concat
+         "\\bibliography{"
+         (muse-publishing-directive "bibsource")
+         "}\n")
+      "")))
+
+(defun muse-latex-pdf-browse-file (file)
+  (shell-command (format muse-latex-pdf-browser file)))
+
+(defun muse-latex-pdf-generate (file output-path final-target)
+  (apply
+   #'muse-publish-transform-output
+   file output-path final-target "PDF"
+   (function
+    (lambda (file output-path)
+      (let* ((fnd (file-name-directory output-path))
+             (command (format "%s \"%s\""
+                              muse-latex-pdf-program
+                              (file-relative-name file fnd)))
+             (times 0)
+             (default-directory fnd)
+             result)
+        ;; XEmacs can sometimes return a non-number result.  We'll err
+        ;; on the side of caution by continuing to attempt to generate
+        ;; the PDF if this happens and treat the final result as
+        ;; successful.
+        (while (and (< times 2)
+                    (or (not (numberp result))
+                        (not (eq result 0))
+                        ;; table of contents takes 2 passes
+                        (file-readable-p
+                         (muse-replace-regexp-in-string
+                          "\\.tex\\'" ".toc" file t t))))
+          (setq result (shell-command command)
+                times (1+ times)))
+        (if (or (not (numberp result))
+                (eq result 0))
+            t
+          nil))))
+   muse-latex-pdf-cruft))
+
+;;; Register the Muse LATEX Publishers
+
+(muse-define-style "latex"
+                   :suffix    'muse-latex-extension
+                   :regexps   'muse-latex-markup-regexps
+                   :functions 'muse-latex-markup-functions
+                   :strings   'muse-latex-markup-strings
+                   :specials  'muse-latex-decide-specials
+                   :before-end 'muse-latex-munge-buffer
+                   :header    'muse-latex-header
+                   :footer    'muse-latex-footer
+                   :browser   'find-file)
+
+(muse-derive-style "pdf" "latex"
+                   :final   'muse-latex-pdf-generate
+                   :browser 'muse-latex-pdf-browse-file
+                   :link-suffix 'muse-latex-pdf-extension
+                   :osuffix 'muse-latex-pdf-extension)
+
+(muse-derive-style "latexcjk" "latex"
+                   :header    'muse-latexcjk-header
+                   :footer    'muse-latexcjk-footer)
+
+(muse-derive-style "pdfcjk" "latexcjk"
+                   :final   'muse-latex-pdf-generate
+                   :browser 'muse-latex-pdf-browse-file
+                   :link-suffix 'muse-latex-pdf-extension
+                   :osuffix 'muse-latex-pdf-extension)
+
+(muse-derive-style "slides" "latex"
+                   :header 'muse-latex-slides-header
+                   :tags   'muse-latex-slides-markup-tags)
+
+(muse-derive-style "slides-pdf" "pdf"
+                   :header 'muse-latex-slides-header
+                   :tags   'muse-latex-slides-markup-tags)
+
+(muse-derive-style "lecture-notes" "slides"
+                   :header 'muse-latex-lecture-notes-header)
+
+(muse-derive-style "lecture-notes-pdf" "slides-pdf"
+                   :header 'muse-latex-lecture-notes-header)
+
+(provide 'muse-latex)
+
+;;; muse-latex.el ends here
diff --git a/packages/muse/muse-latex2png.el b/packages/muse/muse-latex2png.el
new file mode 100644 (file)
index 0000000..2b4373d
--- /dev/null
@@ -0,0 +1,277 @@
+;; muse-latex2png.el --- generate PNG images from inline LaTeX code
+
+;; Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010
+;;   Free Software Foundation, Inc.
+
+;; Author: Michael Olson <mwolson@gnu.org>
+;; Created: 12-Oct-2005
+
+;; This file is part of Emacs Muse.  It is not part of GNU Emacs.
+
+;; Emacs Muse 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, or (at your
+;; option) any later version.
+
+;; Emacs Muse 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 Emacs Muse; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; This was taken from latex2png.el, by Ganesh Swami <ganesh AT
+;; iamganesh DOT com>, which was made for emacs-wiki.  It has since
+;; been extensively rewritten for Muse.
+
+;;; To do
+
+;; Remove stale image files.  This could be done by making a function
+;; for `muse-before-publish-hook' that deletes according to
+;; (muse-page-name).
+
+;;; Code
+
+(require 'muse-publish)
+
+(defgroup muse-latex2png nil
+  "Publishing LaTeX formulas as PNG files."
+  :group 'muse-publish)
+
+(defcustom muse-latex2png-img-dest "./latex"
+  "The folder where the generated images will be placed.
+This is relative to the current publishing directory."
+  :type 'string
+  :group 'muse-latex2png)
+
+(defcustom muse-latex2png-scale-factor 2.5
+  "The scale factor to be used for sizing the resulting LaTeX output."
+  :type 'number
+  :group 'muse-latex2png)
+
+(defcustom muse-latex2png-fg "Black"
+  "The foreground color."
+  :type 'string
+  :group 'muse-latex2png)
+
+(defcustom muse-latex2png-bg "Transparent"
+  "The background color."
+  :type 'string
+  :group 'muse-latex2png)
+
+(defcustom muse-latex2png-template
+  "\\documentclass{article}
+\\usepackage{fullpage}
+\\usepackage{amssymb}
+\\usepackage[usenames]{color}
+\\usepackage{amsmath}
+\\usepackage{latexsym}
+\\usepackage[mathscr]{eucal}
+%preamble%
+\\pagestyle{empty}
+\\begin{document}
+{%code%}
+\\end{document}\n"
+  "The LaTeX template to use."
+  :type 'string
+  :group 'muse-latex2png)
+
+(defun muse-latex2png-move2pubdir (file prefix pubdir)
+  "Move FILE to the PUBDIR folder.
+
+This is done so that the resulting images do not clutter your
+main publishing directory.
+
+Old files with PREFIX in the name are deleted."
+  (when file
+    (if (file-exists-p file)
+        (progn
+          (unless (file-directory-p pubdir)
+            (message "Creating latex directory %s" pubdir)
+            (make-directory pubdir))
+          (copy-file file (expand-file-name (file-name-nondirectory file)
+                                            pubdir)
+                     t)
+          (delete-file file)
+          (concat muse-latex2png-img-dest "/" (file-name-nondirectory file)))
+      (message "Cannot find %s!" file))))
+
+(defun muse-latex2png (code prefix preamble)
+  "Convert the LaTeX CODE into a png file beginning with PREFIX.
+PREAMBLE indicates extra packages and definitions to include."
+  (unless preamble
+    (setq preamble ""))
+  (unless prefix
+    (setq prefix "muse-latex2png"))
+  (let* ((tmpdir (cond ((boundp 'temporary-file-directory)
+                        temporary-file-directory)
+                       ((fboundp 'temp-directory)
+                        (temp-directory))
+                       (t "/tmp")))
+         (texfile (expand-file-name
+                   (concat prefix "__"  (format "%d" (abs (sxhash code))))
+                   tmpdir))
+         (defalt-directory default-directory))
+    (with-temp-file (concat texfile ".tex")
+      (insert muse-latex2png-template)
+      (goto-char (point-min))
+      (while (search-forward "%preamble%" nil t)
+        (replace-match preamble nil t))
+      (goto-char (point-min))
+      (while (search-forward "%code%" nil t)
+        (replace-match code nil t)))
+    (setq default-directory tmpdir)
+    (call-process "latex" nil nil nil texfile)
+    (if (file-exists-p (concat texfile ".dvi"))
+        (progn
+          (call-process
+           "dvipng" nil nil nil
+           "-E"
+           "-fg" muse-latex2png-fg
+           "-bg" muse-latex2png-bg
+           "-T" "tight"
+           "-x" (format  "%s" (* muse-latex2png-scale-factor 1000))
+           "-y" (format  "%s" (* muse-latex2png-scale-factor 1000))
+           "-o" (concat texfile ".png")
+           (concat texfile ".dvi"))
+          (if (file-exists-p (concat texfile ".png"))
+              (progn
+                (delete-file (concat texfile ".dvi"))
+                (delete-file (concat texfile ".tex"))
+                (delete-file (concat texfile ".aux"))
+                (delete-file (concat texfile ".log"))
+                (concat texfile ".png"))
+            (message "Failed to create png file")
+            nil))
+      (message (concat "Failed to create dvi file " texfile))
+      nil)))
+
+(defun muse-latex2png-region (beg end attrs)
+  "Generate an image for the Latex code between BEG and END.
+If a Muse page is currently being published, replace the given
+region with the appropriate markup that displays the image.
+Otherwise, just return the path of the generated image.
+
+Valid keys for the ATTRS alist are as follows.
+
+prefix: The prefix given to the image file.
+preamble: Extra text to add to the Latex preamble.
+inline: Display image as inline, instead of a block."
+  (let ((end-marker (set-marker (make-marker) (1+ end)))
+        (pubdir (expand-file-name
+                 muse-latex2png-img-dest
+                 (file-name-directory muse-publishing-current-output-path))))
+    (save-restriction
+      (narrow-to-region beg end)
+      (let* ((text (buffer-substring-no-properties beg end))
+             ;; the prefix given to the image file.
+             (prefix (cdr (assoc "prefix" attrs)))
+             ;; preamble (for extra options)
+             (preamble (cdr (assoc "preamble" attrs)))
+             ;; display inline or as a block
+             (display (car (assoc "inline" attrs))))
+        (when muse-publishing-p
+          (delete-region beg end)
+          (goto-char (point-min)))
+        (unless (file-directory-p pubdir)
+          (make-directory pubdir))
+        (let ((path (muse-latex2png-move2pubdir
+                     (muse-latex2png text prefix preamble)
+                     prefix pubdir)))
+          (when path
+            (when muse-publishing-p
+              (muse-insert-markup
+               (if (muse-style-derived-p "html")
+                   (concat "<img src=\"" path
+                           "\" alt=\"latex2png equation\" "
+                           (if display (concat "class=\"latex-inline\"")
+                             (concat "class=\"latex-display\""))
+                           (if (muse-style-derived-p "xhtml")
+                               " />"
+                             ">")
+                           (muse-insert-markup "<!-- " text "-->"))
+                 (let ((ext (or (file-name-extension path) ""))
+                       (path (muse-path-sans-extension path)))
+                   (muse-markup-text 'image path ext))))
+              (goto-char (point-max)))
+            path))))))
+
+(defun muse-publish-latex-tag (beg end attrs)
+  "If the current style is not Latex-based, generate an image for the
+given Latex code.  Otherwise, don't do anything to the region.
+See `muse-latex2png-region' for valid keys for ATTRS."
+  (unless (assoc "prefix" attrs)
+    (setq attrs (cons (cons "prefix"
+                            (concat "latex2png-" (muse-page-name)))
+                      attrs)))
+  (if (or (muse-style-derived-p "latex") (muse-style-derived-p "context"))
+      (muse-publish-mark-read-only beg end)
+    (muse-latex2png-region beg end attrs)))
+
+(put 'muse-publish-latex-tag 'muse-dangerous-tag t)
+
+(defun muse-publish-math-tag (beg end)
+  "Surround the given region with \"$\" characters.  Then, if the
+current style is not Latex-based, generate an image for the given
+Latex math code.
+
+If 6 or more spaces come before the tag, and the end of the tag
+is at the end of a line, then surround the region with the
+equivalent of \"$$\" instead.  This causes the region to be
+centered in the published output, among other things."
+  (let* ((centered (and (re-search-backward
+                         (concat "^[" muse-regexp-blank "]\\{6,\\}\\=")
+                         nil t)
+                        (save-excursion
+                          (save-match-data
+                            (goto-char end)
+                            (looking-at (concat "[" muse-regexp-blank "]*$"))))
+                        (prog1 t
+                          (replace-match "")
+                          (when (and (or (muse-style-derived-p "latex")
+                                         (muse-style-derived-p "context"))
+                                     (not (bobp)))
+                            (backward-char 1)
+                            (if (bolp)
+                                (delete-char 1)
+                              (forward-char 1)))
+                          (setq beg (point)))))
+         (tag-beg (if centered
+                      (if (muse-style-derived-p "context")
+                          "\\startformula " "\\[ ")
+                    "$"))
+         (tag-end (if centered
+                      (if (muse-style-derived-p "context")
+                          " \\stopformula" " \\]")
+                    "$"))
+         (attrs (nconc (list (cons "prefix"
+                                   (concat "latex2png-" (muse-page-name))))
+                       (if centered nil
+                         '(("inline" . t))))))
+    (goto-char beg)
+    (muse-insert-markup tag-beg)
+    (goto-char end)
+    (muse-insert-markup tag-end)
+    (if (or (muse-style-derived-p "latex") (muse-style-derived-p "context"))
+        (muse-publish-mark-read-only beg (point))
+      (muse-latex2png-region beg (point) attrs))))
+
+(put 'muse-publish-math-tag 'muse-dangerous-tag t)
+
+;;; Insinuate with muse-publish
+
+(add-to-list 'muse-publish-markup-tags
+             '("latex" t t nil muse-publish-latex-tag)
+             t)
+
+(add-to-list 'muse-publish-markup-tags
+             '("math" t nil nil muse-publish-math-tag)
+             t)
+
+(provide 'muse-latex2png)
+;;; muse-latex2png.el ends here
diff --git a/packages/muse/muse-mode.el b/packages/muse/muse-mode.el
new file mode 100644 (file)
index 0000000..9659843
--- /dev/null
@@ -0,0 +1,1013 @@
+;;; muse-mode.el --- mode for editing Muse files; has font-lock support
+
+;; Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010
+;;   Free Software Foundation, Inc.
+
+;; This file is part of Emacs Muse.  It is not part of GNU Emacs.
+
+;; Emacs Muse 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, or (at your
+;; option) any later version.
+
+;; Emacs Muse 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 Emacs Muse; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; The Emacs Muse major mode is basically a hyped-up text-mode which
+;; knows a lot more about the apparent structure of the document.
+
+;;; Contributors:
+
+;; Andrea Riciputi (ariciputi AT pito DOT com) gave an initial
+;; implementation for tag completion by means of the `muse-insert-tag'
+;; function.
+
+;; Per B. Sederberg (per AT med DOT upenn DOT edu) contributed the
+;; insertion of relative links and list items, backlink searching, and
+;; other things as well.
+
+;; Stefan Schlee (stefan_schlee AT yahoo DOT com) fixed a bug in
+;; muse-next-reference and muse-previous-reference involving links
+;; that begin at point 1.
+
+;; Gregory Collins (greg AT gregorycollins DOT net) fixed a bug with
+;; paragraph separation and headings when filling.
+
+;;; Code:
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Emacs Muse Major Mode
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(provide 'muse-mode)
+
+(require 'muse)
+(require 'muse-regexps)
+(require 'muse-project)
+
+(autoload 'muse-use-font-lock "muse-colors")
+(autoload 'muse-publish-this-file "muse-publish")
+(autoload 'muse-publish-get-style "muse-publish")
+(autoload 'muse-publish-output-file "muse-publish")
+
+(require 'derived)
+(eval-when-compile
+  (condition-case nil
+      (require 'pcomplete)              ; load if available
+    (error nil)))
+
+;;; Options:
+
+(defgroup muse-mode nil
+  "Options controlling the behavior of the Muse editing Mode."
+  :group 'muse)
+
+(defcustom muse-mode-highlight-p t
+  "If non-nil, highlight the content of Muse buffers."
+  :type 'boolean
+  :require 'muse-colors
+  :group 'muse-mode)
+
+(defcustom muse-mode-auto-p nil
+  "If non-nil, automagically determine when Muse mode should be activated."
+  :type 'boolean
+  :set (function
+        (lambda (sym value)
+          (if value
+              (add-hook 'find-file-hooks 'muse-mode-maybe)
+            (remove-hook 'find-file-hooks 'muse-mode-maybe))
+          (set sym value)))
+  :group 'muse-mode)
+
+(defun muse-mode-maybe-after-init ()
+  (when muse-mode-auto-p
+    (add-hook 'find-file-hooks 'muse-mode-maybe)))
+
+;; If the user sets this value in their init file, make sure that
+;; it takes effect
+(add-hook 'after-init-hook 'muse-mode-maybe-after-init)
+
+(defcustom muse-mode-intangible-links nil
+  "If non-nil, use the intangible property on links.
+This can cause problems with flyspell (and potentially fill-mode),
+so only enable this if you don't use either of these."
+  :type 'boolean
+  :group 'muse-mode)
+
+(defcustom muse-mode-hook nil
+  "A hook that is run when Muse mode is entered."
+  :type 'hook
+  :options '(flyspell-mode footnote-mode turn-on-auto-fill
+             highlight-changes-mode)
+  :group 'muse-mode)
+
+(defcustom muse-grep-command
+  "find %D -type f ! -name '*~' | xargs -I {} echo \\\"{}\\\" | xargs egrep -n -e \"%W\""
+  "The command to use when grepping for backlinks and other
+searches through the muse projects.  The string %D is replaced by
+the directories from muse-project-alist, space-separated.  The
+string %W is replaced with the name of the muse page or whatever
+else you are searching for.  This command has been modified to
+handle spaces in filenames, which were giving egrep a problem.
+
+Note: We highly recommend using glimpse to search large projects.
+To use glimpse, install and edit a file called .glimpse_exclude
+in your home directory.  Put a list of glob patterns in that file
+to exclude Emacs backup files, etc.  Then, run the indexer using:
+
+  glimpseindex -o <list of Wiki directories>
+
+Once that's completed, customize this variable to have the
+following value:
+
+  glimpse -nyi \"%W\"
+
+Your searches will go much, much faster, especially for very
+large projects.  Don't forget to add a user cronjob to update the
+index at intervals."
+  :type 'string
+  :group 'muse-mode)
+
+(defvar muse-insert-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map "l" 'muse-insert-relative-link-to-file)
+    (define-key map "t" 'muse-insert-tag)
+    (define-key map "u" 'muse-insert-url)
+
+    map))
+
+;;; Muse mode
+
+(defvar muse-mode-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map [(control ?c) (control ?a)] 'muse-index)
+    (define-key map [(control ?c) (control ?e)] 'muse-edit-link-at-point)
+    (define-key map [(control ?c) (control ?l)] 'font-lock-mode)
+    (define-key map [(control ?c) (control ?t)]
+      'muse-project-publish-this-file)
+    (define-key map [(control ?c) (control ?T)] 'muse-publish-this-file)
+    (define-key map [(control ?c) (meta control ?t)] 'muse-publish-this-file)
+    (define-key map [(control ?c) (control ?v)] 'muse-browse-result)
+
+    (define-key map [(control ?c) ?=]           'muse-what-changed)
+
+    (define-key map [tab] 'muse-next-reference)
+    (define-key map [(control ?i)] 'muse-next-reference)
+
+    (if (featurep 'xemacs)
+        (progn
+          (define-key map [(button2)] 'muse-follow-name-at-mouse)
+          (define-key map [(shift button2)]
+            'muse-follow-name-at-mouse-other-window))
+      (define-key map [(shift control ?m)]
+        'muse-follow-name-at-point-other-window)
+      (define-key map [mouse-2] 'muse-follow-name-at-mouse)
+      (define-key map [(shift mouse-2)]
+        'muse-follow-name-at-mouse-other-window))
+
+    (define-key map [(shift tab)] 'muse-previous-reference)
+    (unless (featurep 'xemacs)
+      (define-key map [(shift iso-lefttab)] 'muse-previous-reference)
+      (define-key map [(shift control ?i)] 'muse-previous-reference))
+
+    (define-key map [(control ?c) (control ?f)] 'muse-project-find-file)
+    (define-key map [(control ?c) (control ?p)] 'muse-project-publish)
+
+    (define-key map [(control ?c) (control ?i)] 'muse-insert-thing)
+    (define-key map [(control ?c) tab] 'muse-insert-thing)
+
+    ;; Searching functions
+    (define-key map [(control ?c) (control ?b)] 'muse-find-backlinks)
+    (define-key map [(control ?c) (control ?s)] 'muse-search)
+
+    ;; Enhanced list functions
+    (define-key map [(meta return)] 'muse-insert-list-item)
+    (define-key map [(control ?>)] 'muse-increase-list-item-indentation)
+    (define-key map [(control ?<)] 'muse-decrease-list-item-indentation)
+
+    (when (featurep 'pcomplete)
+      (define-key map [(meta tab)] 'pcomplete)
+      (define-key map [(meta control ?i)] 'pcomplete))
+
+    map)
+  "Keymap used by Emacs Muse mode.")
+
+;;;###autoload
+(define-derived-mode muse-mode text-mode "Muse"
+  "Muse is an Emacs mode for authoring and publishing documents.
+\\{muse-mode-map}"
+  ;; Since we're not inheriting from normal-mode, we need to
+  ;; explicitly run file variables.
+  (condition-case err
+      (hack-local-variables)
+    (error (message "File local-variables error: %s"
+                    (prin1-to-string err))))
+  ;; Avoid lock-up caused by use of the 'intangible' text property
+  ;; with flyspell.
+  (unless muse-mode-intangible-links
+    (set (make-local-variable 'inhibit-point-motion-hooks) t))
+  (setq muse-current-project (muse-project-of-file))
+  (muse-project-set-variables)
+  ;; Make fill not split up links
+  (when (boundp 'fill-nobreak-predicate)
+    (make-local-variable 'fill-nobreak-predicate)
+    ;; Work around annoying inconsistency in fill handling between
+    ;; Emacs 21 and 22.
+    (if (< emacs-major-version 22)
+        (setq fill-nobreak-predicate 'muse-mode-fill-nobreak-p)
+      (add-to-list 'fill-nobreak-predicate
+                   'muse-mode-fill-nobreak-p)))
+  ;; Make fill work nicely with item lists
+  (let ((regexp (concat "\\s-+\\(-\\|[0-9]+\\.\\)\\s-+"
+                        "\\|\\[[0-9]+\\]\\s-*"
+                        "\\|.*\\s-*::\\s-+"
+                        "\\|\\*+\\s-+")))
+    (set (make-local-variable 'adaptive-fill-regexp)
+         (concat regexp "\\|\\s-*"))
+    (set (make-local-variable 'paragraph-start)
+         (concat paragraph-start "\\|" regexp))
+    (set (make-local-variable 'paragraph-separate)
+         (concat paragraph-separate "\\|\\*+\\s-+")))
+  (set (make-local-variable 'fill-paragraph-function)
+       'muse-mode-fill-paragraph)
+
+  ;; Comment syntax is `; comment'
+  (set (make-local-variable 'comment-start)
+       "; ")
+  (set (make-local-variable 'comment-start-skip)
+       "^;\\s-+")
+  (set (make-local-variable 'indent-line-function)
+       #'ignore)
+  ;; If we're using Emacs21, this makes flyspell work like it should
+  (when (boundp 'flyspell-generic-check-word-p)
+    (set (make-local-variable 'flyspell-generic-check-word-p)
+         'muse-mode-flyspell-p))
+  ;; If pcomplete is available, set it up
+  (when (featurep 'pcomplete)
+    (set (make-local-variable 'pcomplete-default-completion-function)
+         'muse-mode-completions)
+    (set (make-local-variable 'pcomplete-command-completion-function)
+         'muse-mode-completions)
+    (set (make-local-variable 'pcomplete-parse-arguments-function)
+         'muse-mode-current-word))
+  ;; Initialize any auto-generated variables
+  (run-hooks 'muse-update-values-hook)
+  (when muse-mode-highlight-p
+    (muse-use-font-lock)))
+
+(put 'muse-mode
+     'flyspell-mode-predicate
+     'muse-mode-flyspell-p)
+
+(defun muse-mode-fill-nobreak-p ()
+  "Return nil if we should allow a fill to occur at point.
+Otherwise return non-nil.
+
+This is used to keep long explicit links from being mangled by
+fill mode."
+  (save-excursion
+    (save-match-data
+      (and (re-search-backward "\\[\\[\\|\\]\\]"
+                               (line-beginning-position) t)
+           (string= (or (match-string 0) "")
+                    "[[")))))
+
+(defun muse-mode-fill-paragraph (arg)
+  "If a definition list is at point, use special filling rules for it.
+Otherwise return nil to let the normal filling function take care
+of things.
+
+ARG is passed to `fill-paragraph'."
+  (let ((count 2))
+    (and (not (muse-mode-fill-nobreak-p))
+         (save-excursion
+           (beginning-of-line)
+           (and (looking-at muse-dl-term-regexp)
+                (prog1 t
+                  ;; Take initial whitespace into account
+                  (when (looking-at (concat "[" muse-regexp-blank "]+"))
+                    (setq count (+ count (length (match-string 0))))))))
+         (let ((fill-prefix (make-string count ?\ ))
+               (fill-paragraph-function nil))
+           (prog1 t
+             (fill-paragraph arg))))))
+
+(defun muse-mode-flyspell-p ()
+  "Return non-nil if we should allow spell-checking to occur at point.
+Otherwise return nil.
+
+This is used to keep links from being improperly colorized by flyspell."
+  (let ((pos (if (bobp) (point) (1- (point)))))
+    (and (not (get-text-property pos 'muse-no-flyspell))
+         (not (get-text-property pos 'muse-link))
+         (save-match-data
+           (null (muse-link-at-point))))))
+
+;;;###autoload
+(defun muse-mode-choose-mode ()
+  "Turn the proper Emacs Muse related mode on for this file."
+  (let ((project (muse-project-of-file)))
+    (funcall (or (and project (muse-get-keyword :major-mode (cadr project) t))
+                 'muse-mode))))
+
+(defun muse-mode-maybe ()
+  "Maybe turn Emacs Muse mode on for this file."
+  (let ((project (muse-project-of-file)))
+    (and project
+         (funcall (or (muse-get-keyword :major-mode (cadr project) t)
+                      'muse-mode)))))
+
+;;; Enhanced list editing
+
+(defun muse-on-blank-line ()
+  "See if point is on a blank line"
+  (save-excursion
+    (beginning-of-line)
+    (looking-at (concat "[" muse-regexp-blank "]*$"))))
+
+(defun muse-get-paragraph-start ()
+  "Return the start of the current paragraph. This function will
+return nil if there are no prior paragraphs and the beginning of
+the line if point is on a blank line."
+  (let ((para-start (concat "^[" muse-regexp-blank "]*$")))
+    ;; search back to start of paragraph
+    (save-excursion
+      (save-match-data
+        (if (not (muse-on-blank-line))
+            (re-search-backward para-start nil t)
+          (line-beginning-position))))))
+
+(defun muse-insert-thing ()
+  "Prompt for something to insert into the current buffer."
+  (interactive)
+  (message "Insert:\nl  link\nt  Muse tag\nu  URL")
+  (let (key cmd)
+    (let ((overriding-local-map muse-insert-map))
+      (setq key (read-key-sequence nil)))
+    (if (commandp (setq cmd (lookup-key muse-insert-map key)))
+        (progn (message "")
+               (call-interactively cmd))
+      (message "Not inserting anything"))))
+
+;;;###autoload
+(defun muse-insert-list-item ()
+  "Insert a list item at the current point, taking into account
+your current list type and indentation level."
+  (interactive)
+  (let ((newitem " - ")
+        (itemno nil)
+        (pstart (muse-get-paragraph-start))
+        (list-item (format muse-list-item-regexp
+                           (concat "[" muse-regexp-blank "]*"))))
+    ;; search backwards for start of current item
+    (save-excursion
+      (when (re-search-backward list-item pstart t)
+        ;; save the matching item
+        (setq newitem (match-string 0))
+        ;; see what type it is
+        (if (string-match "::" (match-string 0))
+            ;; is a definition, replace the term
+            (setq newitem (concat " "
+                                  (read-string "Term: ")
+                                  " :: "))
+          ;; see if it's a numbered list
+          (when (string-match "[0-9]+" newitem)
+            ;; is numbered, so increment
+            (setq itemno (1+
+                          (string-to-number
+                           (match-string 0 newitem))))
+            (setq newitem (replace-match
+                           (number-to-string itemno)
+                           nil nil newitem))))))
+    ;; insert the new item
+    (insert (concat "\n" newitem))))
+
+(defun muse-alter-list-item-indentation (operation)
+  "Alter the indentation of the current list item.
+Valid values of OPERATION are 'increase and 'decrease."
+  (let ((pstart (muse-get-paragraph-start))
+        (list-item (format muse-list-item-regexp
+                           (concat "[" muse-regexp-blank "]*")))
+        beg move-func indent)
+    ;; search backwards until start of paragraph to see if we are on a
+    ;; current item
+    (save-excursion
+      (if (or (progn (goto-char (muse-line-beginning-position))
+                     ;; we are on an item
+                     (looking-at list-item))
+              ;; not on item, so search backwards
+              (re-search-backward list-item pstart t))
+          (let ((beg (point)))
+            ;; we are on an item
+            (setq indent (buffer-substring (match-beginning 0)
+                                           (match-beginning 1)))
+            (muse-forward-list-item (muse-list-item-type (match-string 1))
+                                    (concat "[" muse-regexp-blank "]*")
+                                    t)
+            (save-restriction
+              (narrow-to-region beg (point))
+              (goto-char (point-min))
+              (let ((halt nil))
+                (while (< (point) (point-max))
+                  ;; increase or decrease the indentation
+                  (unless halt
+                    (cond ((eq operation 'increase)
+                           (insert "  "))
+                          ((eq operation 'decrease)
+                           (if (looking-at "  ")
+                               ;; we have enough space, so delete it
+                               (delete-region (match-beginning 0)
+                                              (match-end 0))
+                             (setq halt t)))))
+                  (forward-line 1)))))
+        ;; we are not on an item, so warn
+        (message "You are not on a list item.")))))
+
+;;;###autoload
+(defun muse-increase-list-item-indentation ()
+  "Increase the indentation of the current list item."
+  (interactive)
+  (muse-alter-list-item-indentation 'increase))
+
+;;;###autoload
+(defun muse-decrease-list-item-indentation ()
+  "Decrease the indentation of the current list item."
+  (interactive)
+  (muse-alter-list-item-indentation 'decrease))
+
+;;; Support page name completion using pcomplete
+
+(defun muse-mode-completions ()
+  "Return a list of possible completions names for this buffer."
+  (let ((project (muse-project-of-file)))
+    (if project
+        (while (pcomplete-here
+                (mapcar 'car (muse-project-file-alist project)))))))
+
+(defun muse-mode-current-word ()
+  (let ((end (point)))
+    (save-excursion
+      (save-restriction
+        (skip-chars-backward (concat "^\\[\n" muse-regexp-blank))
+        (narrow-to-region (point) end))
+      (pcomplete-parse-buffer-arguments))))
+
+;;; Navigate/visit links or URLs.  Use TAB, S-TAB and RET (or mouse-2).
+
+(defun muse-link-at-point (&optional pos)
+  "Return link text if a URL or link is at point."
+  (let ((case-fold-search nil)
+        (inhibit-point-motion-hooks t)
+        (here (or pos (point))))
+    ;; if we are using muse-colors, we can just use link properties to
+    ;; determine whether we are on a link
+    (if (featurep 'muse-colors)
+        (when (get-text-property here 'muse-link)
+          (save-excursion
+            (when (and (not (bobp))
+                       (get-text-property (1- here) 'muse-link))
+              (goto-char (or (previous-single-property-change here 'muse-link)
+                             (point-min))))
+            (if (looking-at muse-explicit-link-regexp)
+                (progn
+                  (goto-char (match-beginning 1))
+                  (muse-handle-explicit-link))
+              (muse-handle-implicit-link))))
+      ;; use fallback method to find a link
+      (when (or (null pos)
+                (and (char-after pos)
+                     (not (eq (char-syntax (char-after pos)) ?\ ))))
+        (save-excursion
+          (goto-char here)
+          ;; check for explicit link here or before point
+          (if (or (looking-at muse-explicit-link-regexp)
+                  (and
+                   (re-search-backward "\\[\\[\\|\\]\\]"
+                                       (muse-line-beginning-position)
+                                       t)
+                   (string= (or (match-string 0) "") "[[")
+                   (looking-at muse-explicit-link-regexp)))
+              (progn
+                (goto-char (match-beginning 1))
+                (muse-handle-explicit-link))
+            (goto-char here)
+            ;; check for bare URL or other link type
+            (skip-chars-backward (concat "^'\"<>{}(\n" muse-regexp-blank))
+            (and (looking-at muse-implicit-link-regexp)
+                 (muse-handle-implicit-link))))))))
+
+(defun muse-make-link (link &optional desc)
+  "Return a link to LINK with DESC as the description."
+  (when (string-match muse-explicit-link-regexp link)
+    (unless desc (setq desc (muse-get-link-desc link)))
+    (setq link (muse-get-link link)))
+  (if (and desc
+           link
+           (not (string= desc ""))
+           (not (string= link desc)))
+      (concat "[[" (muse-link-escape link) "][" (muse-link-escape desc) "]]")
+    (concat "[[" (or (muse-link-escape link) "") "]]")))
+
+;;;###autoload
+(defun muse-insert-relative-link-to-file ()
+  "Insert a relative link to a file, with optional description, at point."
+  ;; Perhaps the relative location should be configurable, so that the
+  ;; file search would start in the publishing directory and then
+  ;; insert the link relative to the publishing directory
+  (interactive)
+  (insert
+   (muse-make-link (file-relative-name (read-file-name "Link: "))
+                   (read-string "Text: "))))
+
+(defcustom muse-insert-url-initial-input "http://"
+  "The string to insert before reading a URL interactively.
+This is used by the `muse-insert-url' command."
+  :type 'string
+  :group 'muse-mode)
+
+(defun muse-insert-url ()
+  "Insert a URL, with optional description, at point."
+  (interactive)
+  (insert
+   (muse-make-link (read-string "URL: " muse-insert-url-initial-input)
+                   (read-string "Text: "))))
+
+;;;###autoload
+(defun muse-edit-link-at-point ()
+  "Edit the current link.
+Do not rename the page originally referred to."
+  (interactive)
+  (if (muse-link-at-point)
+      (let ((link (muse-link-unescape (muse-get-link)))
+            (desc (muse-link-unescape (muse-get-link-desc))))
+        (replace-match
+         (save-match-data
+           (muse-make-link
+            (read-string "Link: " link)
+            (read-string "Text: " desc)))
+         t t))
+    (error "There is no valid link at point")))
+
+(defun muse-visit-link-default (link &optional other-window)
+  "Visit the URL or link named by LINK.
+If ANCHOR is specified, search for it after opening LINK.
+
+This is the default function to call when visiting links; it is
+used by `muse-visit-link' if you have not specified :visit-link
+in `muse-project-alist'."
+  (if (string-match muse-url-regexp link)
+      (muse-browse-url link)
+    (let (anchor
+          base-buffer)
+      (when (string-match "#" link)
+        (setq anchor (substring link (match-beginning 0))
+              link (if (= (match-beginning 0) 0)
+                       ;; If there is an anchor but no link, default
+                       ;; to the current page.
+                       nil
+                     (substring link 0 (match-beginning 0)))))
+      (when link
+        (setq base-buffer (get-buffer link))
+        (if (and base-buffer (not (buffer-file-name base-buffer)))
+            ;; If file is temporary (no associated file), just switch to
+            ;; the buffer
+            (if other-window
+                (switch-to-buffer-other-window base-buffer)
+              (switch-to-buffer base-buffer))
+          (let ((project (muse-project-of-file)))
+            (if project
+                (muse-project-find-file link project
+                                        (and other-window
+                                             'find-file-other-window))
+              (if other-window
+                  (find-file-other-window link)
+                (find-file link))))))
+      (when anchor
+        (let ((pos (point))
+              (regexp (concat "^\\W*" (regexp-quote anchor) "\\b"))
+              last)
+          (goto-char (point-min))
+          (while (and (setq last (re-search-forward regexp nil t))
+                      (muse-link-at-point)))
+          (unless last
+            (goto-char pos)
+            (message "Could not find anchor `%s'" anchor)))))))
+
+(defun muse-visit-link (link &optional other-window)
+  "Visit the URL or link named by LINK."
+  (let ((visit-link-function
+         (muse-get-keyword :visit-link (cadr (muse-project-of-file)) t)))
+    (if visit-link-function
+        (funcall visit-link-function link other-window)
+      (muse-visit-link-default link other-window))))
+
+;;;###autoload
+(defun muse-browse-result (style &optional other-window)
+  "Visit the current page's published result."
+  (interactive
+   (list (muse-project-get-applicable-style buffer-file-name
+                                            (cddr muse-current-project))
+         current-prefix-arg))
+  (setq style (muse-style style))
+  (muse-project-publish-this-file nil style)
+  (let* ((output-dir (muse-style-element :path style))
+         (output-suffix (muse-style-element :osuffix style))
+         (output-path (muse-publish-output-file buffer-file-name output-dir
+                                                style))
+         (target (if output-suffix
+                     (concat (muse-path-sans-extension output-path)
+                             output-suffix)
+                   output-path))
+         (muse-current-output-style (list :base (car style)
+                                          :path output-dir)))
+    (if (not (file-readable-p target))
+        (error "Cannot open output file '%s'" target)
+      (if other-window
+          (find-file-other-window target)
+        (let ((func (muse-style-element :browser style t)))
+          (if func
+              (funcall func target)
+            (message "The %s publishing style does not support browsing."
+                     style)))))))
+
+;;;###autoload
+(defun muse-follow-name-at-point (&optional other-window)
+  "Visit the link at point."
+  (interactive "P")
+  (let ((link (muse-link-at-point)))
+    (if link
+        (muse-visit-link link other-window)
+      (error "There is no valid link at point"))))
+
+;;;###autoload
+(defun muse-follow-name-at-point-other-window ()
+  "Visit the link at point in other window."
+  (interactive)
+  (muse-follow-name-at-point t))
+
+(defun muse-follow-name-at-mouse (event &optional other-window)
+  "Visit the link at point, or yank text if none is found."
+  (interactive "eN")
+  (unless
+      (save-excursion
+        (cond ((fboundp 'event-window)      ; XEmacs
+               (set-buffer (window-buffer (event-window event)))
+               (and (funcall (symbol-function 'event-point) event)
+                    (goto-char (funcall (symbol-function 'event-point)
+                                        event))))
+              ((fboundp 'posn-window)       ; Emacs
+               (set-buffer (window-buffer (posn-window (event-start event))))
+               (goto-char (posn-point (event-start event)))))
+        (let ((link (muse-link-at-point)))
+          (when link
+            (muse-visit-link link other-window)
+            t)))
+    ;; Fall back to normal binding for this event
+    (call-interactively
+     (lookup-key (current-global-map) (this-command-keys)))))
+
+(defun muse-follow-name-at-mouse-other-window (event)
+  "Visit the link at point"
+  (interactive "e")
+  ;; throw away the old window position, since other-window will
+  ;; change it anyway
+  (select-window (car (cadr event)))
+  (muse-follow-name-at-mouse event t))
+
+;;;###autoload
+(defun muse-next-reference ()
+  "Move forward to next Muse link or URL, cycling if necessary."
+  (interactive)
+  (let ((pos))
+    (save-excursion
+      (when (get-text-property (point) 'muse-link)
+        (goto-char (or (next-single-property-change (point) 'muse-link)
+                       (point-max))))
+
+      (setq pos (next-single-property-change (point) 'muse-link))
+
+      (when (not pos)
+        (if (get-text-property (point-min) 'muse-link)
+            (setq pos (point-min))
+          (setq pos (next-single-property-change (point-min) 'muse-link)))))
+
+    (when pos
+      (goto-char pos))))
+
+;;;###autoload
+(defun muse-previous-reference ()
+  "Move backward to the next Muse link or URL, cycling if necessary.
+In case of Emacs x <= 21 and ignoring of intangible properties (see
+`muse-mode-intangible-links').
+
+This function is not entirely accurate, but it's close enough."
+  (interactive)
+  (let ((pos))
+    (save-excursion
+
+      ;; Hack: The user perceives the two cases of point ("|")
+      ;; position (1) "|[[" and (2) "[[|" or "][|" as "point is at
+      ;; start of link".  But in the sense of the function
+      ;; "previous-single-property-change" these two cases are
+      ;; different.  The following code aligns these two cases.  Emacs
+      ;; 21: If the intangible property is ignored case (2) is more
+      ;; complicate and this hack only solves the problem partially.
+      ;;
+      (when (and (get-text-property (point) 'muse-link)
+                 (muse-looking-back "\\[\\|\\]"))
+        (goto-char (or (previous-single-property-change (point) 'muse-link)
+                       (point-min))))
+
+      (when (eq (point) (point-min))
+        (goto-char (point-max)))
+
+      (setq pos (previous-single-property-change (point) 'muse-link))
+
+      (when (not pos)
+        (if (get-text-property (point-min) 'muse-link)
+            (setq pos (point-min))
+          (setq pos (previous-single-property-change (point-max)
+                                                     'muse-link)))))
+
+    (when pos
+      (if (get-text-property pos 'muse-link)
+          (goto-char pos)
+        (goto-char (or (previous-single-property-change pos 'muse-link)
+                       (point-min)))))))
+
+;;;###autoload
+(defun muse-what-changed ()
+  "Show the unsaved changes that have been made to the current file."
+  (interactive)
+  (diff-backup buffer-file-name))
+
+
+;;; Find text in project pages, or pages referring to the current page
+
+(defvar muse-search-history nil)
+
+(defun muse-grep (string &optional grep-command-no-shadow)
+  "Grep for STRING in the project directories.
+GREP-COMMAND if passed will supplant `muse-grep-command'."
+  ;; careful - grep-command leaks into compile, so we call it
+  ;; -no-shadow instead
+  (require 'compile)
+  (let* ((str (or grep-command-no-shadow muse-grep-command))
+         (muse-directories (mapcar
+                            (lambda (thing)
+                              (car (cadr thing)))
+                            muse-project-alist))
+         (dirs (mapconcat (lambda (dir)
+                            (shell-quote-argument
+                             (expand-file-name dir)))
+                          muse-directories " ")))
+    (if (string= dirs "")
+        (muse-display-warning
+         "No directories were found in the current project; aborting search")
+      (while (string-match "%W" str)
+        (setq str (replace-match string t t str)))
+      (while (string-match "%D" str)
+        (setq str (replace-match dirs t t str)))
+      (if (fboundp 'compilation-start)
+          (compilation-start str nil (lambda (&rest args) "*search*")
+                             grep-regexp-alist)
+        (and (fboundp 'compile-internal)
+             (compile-internal str "No more search hits" "search"
+                               nil grep-regexp-alist))))))
+
+;;;###autoload
+(defun muse-search-with-command (text)
+  "Search for the given TEXT string in the project directories
+using the specified command."
+  (interactive
+   (list (let ((str (concat muse-grep-command)) pos)
+           (when (string-match "%W" str)
+             (setq pos (match-beginning 0))
+             (unless (featurep 'xemacs)
+               (setq pos (1+ pos)))
+             (setq str (replace-match "" t t str)))
+           (read-from-minibuffer "Search command: "
+                                 (cons str pos) nil nil
+                                 'muse-search-history))))
+  (muse-grep nil text))
+
+;;;###autoload
+(defun muse-search ()
+  "Search for the given TEXT using the default grep command."
+  (interactive)
+  (muse-grep (read-string "Search: ")))
+
+;;;###autoload
+(defun muse-find-backlinks ()
+  "Grep for the current pagename in all the project directories."
+  (interactive)
+  (muse-grep (muse-page-name)))
+
+
+;;; Generate an index of all known Muse pages
+
+(defun muse-generate-index (&optional as-list exclude-private)
+  "Generate an index of all Muse pages."
+  (let ((index (muse-index-as-string as-list exclude-private)))
+    (with-current-buffer (get-buffer-create "*Muse Index*")
+      (erase-buffer)
+      (insert index)
+      (current-buffer))))
+
+;;;###autoload
+(defun muse-index ()
+  "Display an index of all known Muse pages."
+  (interactive)
+  (message "Generating Muse index...")
+  (let ((project (muse-project)))
+    (with-current-buffer (muse-generate-index)
+      (goto-char (point-min))
+      (muse-mode)
+      (setq muse-current-project project)
+      (pop-to-buffer (current-buffer))))
+  (message "Generating Muse index...done"))
+
+(defun muse-index-as-string (&optional as-list exclude-private exclude-current)
+  "Generate an index of all Muse pages.
+If AS-LIST is non-nil, insert a dash and spaces before each item.
+If EXCLUDE-PRIVATE is non-nil, exclude files that have private permissions.
+If EXCLUDE-CURRENT is non-nil, exclude the current file from the output."
+  (let ((files (sort (copy-alist (muse-project-file-alist))
+                     (function
+                      (lambda (l r)
+                        (string-lessp (car l) (car r)))))))
+    (when (and exclude-current (muse-page-name))
+      (setq files (delete (assoc (muse-page-name) files) files)))
+    (with-temp-buffer
+      (while files
+        (unless (and exclude-private
+                     (muse-project-private-p (cdar files)))
+          (insert (if as-list " - " "") "[[" (caar files) "]]\n"))
+        (setq files (cdr files)))
+      (buffer-string))))
+
+;;; Insert tags interactively on C-c TAB t
+
+(defvar muse-tag-history nil
+  "List of recently-entered tags; used by `muse-insert-tag'.
+If you want a tag to start as the default, you may manually set
+this variable to a list.")
+
+(defvar muse-custom-tags nil
+  "Keep track of any new tags entered in `muse-insert-tag'.
+If there are (X)HTML tags that you use frequently with that
+function, you might want to set this manually.")
+
+;;;###autoload
+(defun muse-insert-tag (tag)
+  "Insert a tag interactively with a blank line after it."
+  (interactive
+   (list
+    (funcall
+     muse-completing-read-function
+     (concat "Tag: "
+             (when muse-tag-history
+               (concat "(default: " (car muse-tag-history) ") ")))
+     (progn
+       (require 'muse-publish)
+       (mapcar 'list (nconc (mapcar 'car muse-publish-markup-tags)
+                            muse-custom-tags)))
+     nil nil nil 'muse-tag-history
+     (car muse-tag-history))))
+  (when (equal tag "")
+    (setq tag (car muse-tag-history)))
+  (unless (interactive-p)
+    (require 'muse-publish))
+  (let ((tag-entry (assoc tag muse-publish-markup-tags))
+        (options ""))
+    ;; Add to custom list if no entry exists
+    (unless tag-entry
+      (add-to-list 'muse-custom-tags tag))
+    ;; Get option
+    (when (nth 2 tag-entry)
+      (setq options (read-string "Option: ")))
+    (unless (equal options "")
+      (setq options (concat " " options)))
+    ;; Insert the tag, closing if necessary
+    (when tag (insert (concat "<" tag options ">")))
+    (when (nth 1 tag-entry)
+      (insert (concat "\n\n</" tag ">\n"))
+      (forward-line -2))))
+
+;;; Muse list edit minor mode
+
+(defvar muse-list-edit-minor-mode-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map [(meta return)] 'muse-l-e-m-m-insert-list-item)
+    (define-key map [(control ?>)] 'muse-l-e-m-m-increase-list-item-indent)
+    (define-key map [(control ?<)] 'muse-l-e-m-m-decrease-list-item-indent)
+
+    map)
+  "Keymap used by Muse list edit minor mode.")
+
+(defvar muse-l-e-m-m-list-item-regexp
+  (concat "^%s\\(\\([^\n" muse-regexp-blank "].*?\\)?::"
+          "\\(?:[" muse-regexp-blank "]+\\|$\\)"
+          "\\|[" muse-regexp-blank "]?[-*+][" muse-regexp-blank "]*"
+          "\\|[" muse-regexp-blank "][0-9]+\\.[" muse-regexp-blank "]*\\)")
+  "Regexp used to match the beginning of a list item.
+This is used by `muse-list-edit-minor-mode'.
+The '%s' will be replaced with a whitespace regexp when publishing.")
+
+(defun muse-l-e-m-m-insert-list-item ()
+  "Insert a list item at the current point, taking into account
+your current list type and indentation level."
+  (interactive)
+  (let ((muse-list-item-regexp muse-l-e-m-m-list-item-regexp))
+    (call-interactively 'muse-insert-list-item)))
+
+(defun muse-l-e-m-m-increase-list-item-indent ()
+  "Increase the indentation of the current list item."
+  (interactive)
+  (let ((muse-list-item-regexp muse-l-e-m-m-list-item-regexp))
+    (call-interactively 'muse-increase-list-item-indentation)))
+
+(defun muse-l-e-m-m-decrease-list-item-indent ()
+  "Decrease the indentation of the current list item."
+  (interactive)
+  (let ((muse-list-item-regexp muse-l-e-m-m-list-item-regexp))
+    (call-interactively 'muse-decrease-list-item-indentation)))
+
+(defvar muse-l-e-m-m-data nil
+  "A list of data that was changed by Muse list edit minor mode.")
+(make-variable-buffer-local 'muse-l-e-m-m-data)
+
+;;;###autoload
+(define-minor-mode muse-list-edit-minor-mode
+  "This is a global minor mode for editing files with lists.
+It is meant to be used with other major modes, and not with Muse mode.
+
+Interactively, with no prefix argument, toggle the mode.
+With universal prefix ARG turn mode on.
+With zero or negative ARG turn mode off.
+
+This minor mode provides the Muse keybindings for editing lists,
+and support for filling lists properly.
+
+It recognizes not only Muse-style lists, which use the \"-\"
+character or numbers, but also lists that use asterisks or plus
+signs.  This should make the minor mode generally useful.
+
+Definition lists and footnotes are also recognized.
+
+Note that list items may omit leading spaces, for compatibility
+with modes that set `left-margin', such as
+`debian-changelog-mode'.
+
+\\{muse-list-edit-minor-mode-map}"
+  :init-value nil
+  :lighter ""
+  :keymap muse-list-edit-minor-mode-map
+  :global nil
+  :group 'muse-mode
+  (if (not muse-list-edit-minor-mode)
+      ;; deactivate
+      (when muse-l-e-m-m-data
+        (setq adaptive-fill-regexp (cdr (assoc "a-f-r" muse-l-e-m-m-data))
+              paragraph-start (cdr (assoc "p-s" muse-l-e-m-m-data))
+              fill-prefix (cdr (assoc "f-p" muse-l-e-m-m-data)))
+        (setq muse-l-e-m-m-data nil))
+    ;; activate
+    (unless muse-l-e-m-m-data
+      ;; save previous fill-related data so we can restore it later
+      (setq muse-l-e-m-m-data
+            (list (cons "a-f-r" adaptive-fill-regexp)
+                  (cons "p-s" paragraph-start)
+                  (cons "f-p" fill-prefix))))
+    ;; make fill work nicely with item lists
+    (let ((regexp (concat "\\s-*\\([-*+]\\|[0-9]+\\.\\)\\s-+"
+                          "\\|\\[[0-9]+\\]\\s-*"
+                          "\\|.*\\s-*::\\s-+")))
+      (set (make-local-variable 'adaptive-fill-regexp)
+           (concat regexp "\\|\\s-*"))
+      (set (make-local-variable 'paragraph-start)
+           (concat paragraph-start "\\|" regexp)))
+    ;; force fill-prefix to be nil, because if it is a string that has
+    ;; initial spaces, it messes up fill-paragraph's algorithm
+    (set (make-local-variable 'fill-prefix) nil)))
+
+(defun turn-on-muse-list-edit-minor-mode ()
+  "Unconditionally turn on Muse list edit minor mode."
+  (muse-list-edit-minor-mode 1))
+
+(defun turn-off-muse-list-edit-minor-mode ()
+  "Unconditionally turn off Muse list edit minor mode."
+  (muse-list-edit-minor-mode -1))
+
+;;; muse-mode.el ends here
diff --git a/packages/muse/muse-pkg.el b/packages/muse/muse-pkg.el
new file mode 100644 (file)
index 0000000..6ff6560
--- /dev/null
@@ -0,0 +1,2 @@
+(define-package "muse" "3.20"
+  "Authoring and publishing tool")
diff --git a/packages/muse/muse-poem.el b/packages/muse/muse-poem.el
new file mode 100644 (file)
index 0000000..bd08b7e
--- /dev/null
@@ -0,0 +1,263 @@
+;;; muse-poem.el --- publish a poem to LaTex or PDF
+
+;; Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010
+;;   Free Software Foundation, Inc.
+
+;; This file is part of Emacs Muse.  It is not part of GNU Emacs.
+
+;; Emacs Muse 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, or (at your
+;; option) any later version.
+
+;; Emacs Muse 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 Emacs Muse; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file specifies a form for recording poetry.  It is as follows.
+;;
+;;   Title
+;;
+;;
+;;   Body of poem
+;;
+;;
+;;   Annotations, history, notes, etc.
+;;
+;; The `muse-poem' module makes it easy to attractively publish and
+;; reference poems in this format, using the "memoir" module for LaTeX
+;; publishing.  It will also markup poems for every other output
+;; style, though none are nearly as pretty.
+;;
+;; Once a poem is written in this format, just publish it to PDF using
+;; the "poem-pdf" style.  To make an inlined reference to a poem that
+;; you've written -- for example, from a blog page -- there is a
+;; "poem" tag defined by this module:
+;;
+;;   <poem title="name.of.poem.page">
+;;
+;; Let's assume the template above was called "name.of.poem.page";
+;; then the above tag would result in this inclusion:
+;;
+;;   ** Title
+;;
+;;   > Body of poem
+;;
+;; I use this module for publishing all of the poems on my website,
+;; which are at: http://www.newartisans.com/johnw/poems.html.
+
+;;; Contributors:
+
+;;; Code:
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Muse Poem Publishing
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'muse-latex)
+(require 'muse-project)
+
+(defgroup muse-poem nil
+  "Rules for marking up a Muse file as a LaTeX article."
+  :group 'muse-latex)
+
+(defcustom muse-poem-latex-header
+  "\\documentclass[14pt,oneside]{memoir}
+
+\\usepackage[english]{babel}
+\\usepackage[latin1]{inputenc}
+\\usepackage[T1]{fontenc}
+
+\\setlength{\\beforepoemtitleskip}{-5.0ex}
+
+\\begin{document}
+
+\\pagestyle{empty}
+
+\\renewcommand{\\poemtoc}{section}
+\\settocdepth{section}
+
+\\mbox{}
+\\vfill
+
+\\poemtitle{<lisp>(muse-publishing-directive \"title\")</lisp>}
+
+\\settowidth{\\versewidth}{<lisp>muse-poem-longest-line</lisp>}\n\n"
+  "Header used for publishing LaTeX poems.  This may be text or a filename."
+  :type 'string
+  :group 'muse-poem)
+
+(defcustom muse-poem-latex-footer "\n\\vfill
+\\mbox{}
+
+\\end{document}"
+  "Footer used for publishing LaTeX files.  This may be text or a filename."
+  :type 'string
+  :group 'muse-poem)
+
+(defcustom muse-poem-markup-strings
+  '((begin-verse . "\\begin{verse}[\\versewidth]\n")
+    (verse-space . "\\vin "))
+  "Strings used for marking up poems.
+These cover the most basic kinds of markup, the handling of which
+differs little between the various styles."
+  :type '(alist :key-type symbol :value-type string)
+  :group 'muse-poem)
+
+(defcustom muse-chapbook-latex-header
+  "\\documentclass{book}
+
+\\usepackage[english]{babel}
+\\usepackage[latin1]{inputenc}
+\\usepackage[T1]{fontenc}
+
+\\setlength{\\beforepoemtitleskip}{-5.0ex}
+
+\\begin{document}
+
+\\title{<lisp>(muse-publishing-directive \"title\")</lisp>}
+\\author{<lisp>(muse-publishing-directive \"author\")</lisp>}
+\\date{<lisp>(muse-publishing-directive \"date\")</lisp>}
+
+\\maketitle
+
+\\tableofcontents
+
+\\renewcommand{\\poemtoc}{section}
+\\settocdepth{section}\n"
+  "Header used for publishing a book of poems in LaTeX form.
+This may be text or a filename."
+  :type 'string
+  :group 'muse-poem)
+
+(defcustom muse-chapbook-latex-footer "\n\\end{document}"
+  "Footer used for publishing a book of poems in LaTeX form.
+This may be text or a filename."
+  :type 'string
+  :group 'muse-poem)
+
+(defvar muse-poem-longest-line "")
+
+(defcustom muse-poem-chapbook-strings
+  '((begin-verse . "\\newpage
+\\mbox{}
+\\vfill
+
+\\poemtitle{<lisp>(muse-publishing-directive \"title\")</lisp>}
+
+\\settowidth{\\versewidth}{<lisp>muse-poem-longest-line</lisp>}
+
+\\begin{verse}[\\versewidth]\n")
+    (end-verse   . "\n\\end{verse}\n\\vfill\n\\mbox{}")
+    (verse-space . "\\vin "))
+  "Strings used for marking up books of poems.
+These cover the most basic kinds of markup, the handling of which
+differs little between the various styles."
+  :type '(alist :key-type symbol :value-type string)
+  :group 'muse-poem)
+
+(defun muse-poem-prepare-buffer ()
+  (goto-char (point-min))
+  (insert "#title ")
+  (forward-line 1)
+  (delete-region (point) (1+ (muse-line-end-position)))
+  (insert "\n<verse>")
+  (let ((beg (point)) end line)
+    (if (search-forward "\n\n\n" nil t)
+        (progn
+          (setq end (copy-marker (match-beginning 0) t))
+          (replace-match "\n</verse>\n")
+          (delete-region (point) (point-max)))
+      (goto-char (point-max))
+      (setq end (point))
+      (insert "</verse>\n"))
+    (goto-char (1+ beg))
+    (set (make-local-variable 'muse-poem-longest-line) "")
+    (while (< (point) end)
+      (setq line (buffer-substring-no-properties (point)
+                                                 (muse-line-end-position)))
+      (if (> (length line) (length muse-poem-longest-line))
+          (setq muse-poem-longest-line line))
+      (forward-line 1))
+    nil))
+
+(defvar muse-poem-tag '("poem" nil t nil muse-poem-markup-tag))
+
+(defun muse-poem-markup-tag (beg end attrs)
+  "This markup tag allows a poem to be included from another project page.
+The form of usage is:
+  <poem title=\"page.name\">"
+  (let ((page (cdr (assoc (cdr (assoc "title" attrs))
+                          (muse-project-file-alist))))
+        beg end)
+    (if (null page)
+        (insert "  *Reference to\n  unknown poem \""
+                (cdr (assoc "title" attrs)) "\".*\n")
+      (setq beg (point))
+      (insert
+       (muse-with-temp-buffer
+         (muse-insert-file-contents page)
+         (goto-char (point-min))
+         (if (assoc "nohead" attrs)
+             (progn
+               (forward-line 3)
+               (delete-region (point-min) (point)))
+           (insert "** ")
+           (search-forward "\n\n\n")
+           (replace-match "\n\n"))
+         (if (search-forward "\n\n\n" nil t)
+             (setq end (match-beginning 0))
+           (setq end (point-max)))
+         (buffer-substring-no-properties (point-min) end)))
+      (setq end (point-marker))
+      (goto-char beg)
+      (unless (assoc "nohead" attrs)
+        (forward-line 2))
+      (while (< (point) end)
+        (insert "> ")
+        (forward-line 1))
+      (set-marker end nil))))
+
+(put 'muse-poem-markup-tag 'muse-dangerous-tag t)
+
+(add-to-list 'muse-publish-markup-tags muse-poem-tag)
+
+;;; Register the Muse POEM Publishers
+
+(muse-derive-style "poem-latex" "latex"
+                   :before  'muse-poem-prepare-buffer
+                   :strings 'muse-poem-markup-strings
+                   :header  'muse-poem-latex-header
+                   :footer  'muse-poem-latex-footer)
+
+(muse-derive-style "poem-pdf" "pdf"
+                   :before  'muse-poem-prepare-buffer
+                   :strings 'muse-poem-markup-strings
+                   :header  'muse-poem-latex-header
+                   :footer  'muse-poem-latex-footer)
+
+(muse-derive-style "chapbook-latex" "latex"
+                   :before  'muse-poem-prepare-buffer
+                   :strings 'muse-poem-chapbook-strings
+                   :header  'muse-chapbook-latex-header
+                   :footer  'muse-chapbook-latex-footer)
+
+(muse-derive-style "chapbook-pdf" "pdf"
+                   :before  'muse-poem-prepare-buffer
+                   :strings 'muse-poem-chapbook-strings
+                   :header  'muse-chapbook-latex-header
+                   :footer  'muse-chapbook-latex-footer)
+
+(provide 'muse-poem)
+
+;;; muse-poem.el ends here
diff --git a/packages/muse/muse-project.el b/packages/muse/muse-project.el
new file mode 100644 (file)
index 0000000..7489706
--- /dev/null
@@ -0,0 +1,973 @@
+;;; muse-project.el --- handle Muse projects
+
+;; Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010
+;;   Free Software Foundation, Inc.
+
+;; This file is part of Emacs Muse.  It is not part of GNU Emacs.
+
+;; Emacs Muse 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, or (at your
+;; option) any later version.
+
+;; Emacs Muse 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 Emacs Muse; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;;; Contributors:
+
+;;; Code:
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Muse Project Maintainance
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(provide 'muse-project)
+
+(require 'muse)
+(require 'muse-publish)
+(require 'cus-edit)
+
+(defgroup muse-project nil
+  "Options controlling the behavior of Muse project handling."
+  :group 'muse)
+
+(defcustom muse-before-project-publish-hook nil
+  "A hook run before a project is published.
+Each function is passed the project object, a cons with the format
+  (PROJNAME . SETTINGS)"
+  :type 'hook
+  :group 'muse-project)
+
+(defcustom muse-after-project-publish-hook nil
+  "A hook run after a project is published.
+Each function is passed the project object, a cons with the format
+  (PROJNAME . SETTINGS)"
+  :type 'hook
+  :group 'muse-project)
+
+(defvar muse-project-alist-using-customize nil
+  "Used internally by Muse to indicate whether `muse-project-alist'
+has been modified via the customize interface.")
+(make-variable-buffer-local 'muse-project-alist-using-customize)
+
+(defmacro with-muse-project (project &rest body)
+  `(progn
+     (unless (muse-project ,project)
+       (error "Can't find project %s" ,project))
+     (with-temp-buffer
+       (muse-mode)
+       (setq muse-current-project (muse-project ,project))
+       (muse-project-set-variables)
+       ,@body)))
+
+(put 'with-muse-project 'lisp-indent-function 0)
+(put 'with-muse-project 'edebug-form-spec '(sexp body))
+
+(defun muse-project-alist-get (sym)
+  "Turn `muse-project-alist' into something we can customize easily."
+  (when (boundp sym)
+    (setq muse-project-alist-using-customize t)
+    (let* ((val (copy-alist (symbol-value sym)))
+           (head val))
+      (while val
+        (let ((head (car (cdar val)))
+              res)
+          ;; Turn settings of first part into cons cells, symbol->string
+          (while head
+            (cond ((stringp (car head))
+                   (add-to-list 'res (car head) t)
+                   (setq head (cdr head)))
+                  ((symbolp (car head))
+                   (add-to-list 'res (list (symbol-name (car head))
+                                           (cadr head)) t)
+                   (setq head (cddr head)))
+                  (t
+                   (setq head (cdr head)))))
+          (setcdr (car val) (cons res (cdr (cdar val)))))
+        (let ((styles (cdar val)))
+          ;; Symbol->string in every style
+          (while (cdr styles)
+            (let ((head (cadr styles))
+                  res)
+              (while (consp head)
+                (setq res (plist-put res (symbol-name (car head))
+                                     (cadr head)))
+                (setq head (cddr head)))
+              (setcdr styles (cons res (cddr styles))))
+            (setq styles (cdr styles))))
+        (setq val (cdr val)))
+      head)))
+
+(defun muse-project-alist-set (sym val)
+  "Turn customized version of `muse-project-alist' into something
+Muse can make use of."
+  (set sym val)
+  (when muse-project-alist-using-customize
+    ;; Make sure the unescaped version is written to .emacs
+    (put sym 'saved-value (list (custom-quote val)))
+    ;; Perform unescaping
+    (while val
+      (let ((head (car (cdar val)))
+            res)
+        ;; Turn cons cells into flat list, string->symbol
+        (while head
+          (cond ((stringp (car head))
+                 (add-to-list 'res (car head) t))
+                ((consp (car head))
+                 (add-to-list 'res (intern (caar head)) t)
+                 (add-to-list 'res (car (cdar head)) t)))
+          (setq head (cdr head)))
+        (setcdr (car val) (cons res (cdr (cdar val)))))
+      (let ((styles (cdar val)))
+        ;; String->symbol in every style
+        (while (cdr styles)
+          (let ((head (cadr styles))
+                res)
+            (while (consp head)
+              (setq res (plist-put res (intern (car head))
+                                   (cadr head)))
+              (setq head (cddr head)))
+            (setcdr styles (cons res (cddr styles))))
+          (setq styles (cdr styles))))
+      (setq val (cdr val)))))
+
+(define-widget 'muse-project 'default
+  "A widget that defines a Muse project."
+  :format "\n%v"
+  :value-create 'muse-widget-type-value-create
+  :value-get 'muse-widget-child-value-get
+  :value-delete 'ignore
+  :match 'muse-widget-type-match
+  :type '(cons :format "    %v"
+               (repeat :tag "Settings" :format "%{%t%}:\n%v%i\n\n"
+                       (choice
+                        (string :tag "Directory")
+                        (list :tag "Book function"
+                              (const :tag ":book-funcall" ":book-funcall")
+                              (choice (function)
+                                      (sexp :tag "Unknown")))
+                        (list :tag "Book part"
+                              (const :tag ":book-part" ":book-part")
+                              (string :tag "Name"))
+                        (list :tag "Book style"
+                              (const :tag ":book-style" ":book-style")
+                              (string :tag "Style"))
+                        (list :tag "Default file"
+                              (const :tag ":default" ":default")
+                              (string :tag "File"))
+                        (list :tag "End of book"
+                              (const :tag ":book-end" ":book-end")
+                              (const t))
+                        (list :tag "Force publishing"
+                              (const :tag ":force-publish" ":force-publish")
+                              (repeat (string :tag "File")))
+                        (list :tag "Major mode"
+                              (const :tag ":major-mode" ":major-mode")
+                              (choice (function :tag "Mode")
+                                      (sexp :tag "Unknown")))
+                        (list :tag "New chapter"
+                              (const :tag ":book-chapter" ":book-chapter")
+                              (string :tag "Name"))
+                        (list :tag "No chapters"
+                              (const :tag ":nochapters" ":nochapters")
+                              (const t))
+                        (list :tag "Project-level publishing function"
+                              (const :tag ":publish-project"
+                                     ":publish-project")
+                              (choice (function :tag "Function")
+                                      (sexp :tag "Unknown")))
+                        (list :tag "Set variables"
+                              (const :tag ":set" ":set")
+                              (repeat (list :inline t
+                                            (symbol :tag "Variable")
+                                            (sexp :tag "Setting"))))
+                        (list :tag "Visit links using"
+                              (const :tag ":visit-link" ":visit-link")
+                              (choice (function)
+                                      (sexp :tag "Unknown")))))
+               (repeat :tag "Output styles" :format "%{%t%}:\n%v%i\n\n"
+                       (set :tag "Style"
+                            (list :inline t
+                                  :tag "Publishing style"
+                                  (const :tag ":base" ":base")
+                                  (string :tag "Style"))
+                            (list :inline t
+                                  :tag "Base URL"
+                                  (const :tag ":base-url" ":base-url")
+                                  (string :tag "URL"))
+                            (list :inline t
+                                  :tag "Exclude matching"
+                                  (const :tag ":exclude" ":exclude")
+                                  (regexp))
+                            (list :inline t
+                                  :tag "Include matching"
+                                  (const :tag ":include" ":include")
+                                  (regexp))
+                            (list :inline t
+                                  :tag "Timestamps file"
+                                  (const :tag ":timestamps" ":timestamps")
+                                  (file))
+                            (list :inline t
+                                  :tag "Path"
+                                  (const :tag ":path" ":path")
+                                  (string :tag "Path"))))))
+
+(defcustom muse-project-alist nil
+  "An alist of Muse projects.
+A project defines a fileset, and a list of custom attributes for use
+when publishing files in that project."
+  :type '(choice (const :tag "No projects defined." nil)
+                 (repeat (cons :format "%{%t%}:\n\n%v"
+                               :tag "Project" :indent 4
+                               (string :tag "Project name")
+                               muse-project))
+                 (sexp :tag "Cannot parse expression"))
+  :get 'muse-project-alist-get
+  :set 'muse-project-alist-set
+  :group 'muse-project)
+
+;; Make it easier to specify a muse-project-alist entry
+
+(defcustom muse-project-ignore-regexp
+  (concat "\\`\\(#.*#\\|.*,v\\|.*~\\|\\.\\.?\\|\\.#.*\\|,.*\\)\\'\\|"
+          "/\\(CVS\\|RCS\\|\\.arch-ids\\|{arch}\\|,.*\\|\\.svn\\|"
+          "\\.hg\\|\\.git\\|\\.bzr\\|_darcs\\)\\(/\\|\\'\\)")
+  "A regexp matching files to be ignored in Muse directories.
+
+You should set `case-fold-search' to nil before using this regexp
+in code."
+  :type 'regexp
+  :group 'muse-regexp)
+
+(defcustom muse-project-publish-private-files t
+  "If this is non-nil, files will be published even if their permissions
+are set so that no one else on the filesystem can read them.
+
+Set this to nil if you would like to indicate that some files
+should not be published by manually doing \"chmod o-rwx\" on
+them.
+
+This setting has no effect under Windows (that is, all files are
+published regardless of permissions) because Windows lacks the
+needed filesystem attributes."
+  :type 'boolean
+  :group 'muse-project)
+
+(defun muse-project-recurse-directory (base)
+  "Recusively retrieve all of the directories underneath BASE.
+A list of these directories is returned.
+
+Directories starting with \".\" will be ignored, as well as those
+which match `muse-project-ignore-regexp'."
+  (let ((case-fold-search nil)
+        list dir)
+    (when (and (file-directory-p base)
+               (not (string-match muse-project-ignore-regexp base)))
+      (dolist (file (directory-files base t "^[^.]"))
+        (when (and (file-directory-p file)
+                   (not (string-match muse-project-ignore-regexp file)))
+          (setq dir (file-name-nondirectory file))
+          (push dir list)
+          (nconc list (mapcar #'(lambda (item)
+                                  (concat dir "/" item))
+                              (muse-project-recurse-directory file)))))
+      list)))
+
+(defun muse-project-alist-styles (entry-dir output-dir style &rest other)
+  "Return a list of styles to use in a `muse-project-alist' entry.
+ENTRY-DIR is the top-level directory of the project.
+OUTPUT-DIR is where Muse files are published, keeping directory structure.
+STYLE is the publishing style to use.
+
+OTHER contains other definitions to add to each style.  It is optional.
+
+For an example of the use of this function, see
+`examples/mwolson/muse-init.el' from the Muse distribution."
+  (let ((fnd (file-name-nondirectory entry-dir)))
+    (when (string= fnd "")
+      ;; deal with cases like "foo/" that have a trailing slash
+      (setq fnd (file-name-nondirectory (substring entry-dir 0 -1))))
+    (cons `(:base ,style :path ,(if (muse-file-remote-p output-dir)
+                                    output-dir
+                                  (expand-file-name output-dir))
+                  :include ,(concat "/" fnd "/[^/]+$")
+                  ,@other)
+          (mapcar (lambda (dir)
+                    `(:base ,style
+                            :path ,(expand-file-name dir output-dir)
+                            :include ,(concat "/" dir "/[^/]+$")
+                            ,@other))
+                  (muse-project-recurse-directory entry-dir)))))
+
+(defun muse-project-alist-dirs (entry-dir)
+  "Return a list of directories to use in a `muse-project-alist' entry.
+ENTRY-DIR is the top-level directory of the project.
+
+For an example of the use of this function, see
+`examples/mwolson/muse-init.el' from the Muse distribution."
+  (cons (expand-file-name entry-dir)
+        (mapcar (lambda (dir) (expand-file-name dir entry-dir))
+                (muse-project-recurse-directory entry-dir))))
+
+;; Constructing the file-alist
+
+(defvar muse-project-file-alist nil
+  "This variable is automagically constructed as needed.")
+
+(defvar muse-project-file-alist-hook nil
+  "Functions that are to be exectuted immediately after updating
+`muse-project-file-alist'.")
+
+(defvar muse-current-project nil
+  "Project we are currently visiting.")
+(make-variable-buffer-local 'muse-current-project)
+(defvar muse-current-project-global nil
+  "Project we are currently visiting.  This is used to propagate the value
+of `muse-current-project' into a new buffer during publishing.")
+
+(defvar muse-current-output-style nil
+  "The output style that we are currently using for publishing files.")
+
+(defsubst muse-project (&optional project)
+  "Resolve the given PROJECT into a full Muse project, if it is a string."
+  (if (null project)
+      (or muse-current-project
+          (muse-project-of-file))
+    (if (stringp project)
+        (assoc project muse-project-alist)
+      (muse-assert (consp project))
+      project)))
+
+(defun muse-project-page-file (page project &optional no-check-p)
+  "Return a filename if PAGE exists within the given Muse PROJECT."
+  (setq project (muse-project project))
+  (if (null page)
+      ;; if not given a page, return the first directory instead
+      (let ((pats (cadr project)))
+        (catch 'done
+          (while pats
+            (if (symbolp (car pats))
+                (setq pats (cddr pats))
+              (throw 'done (file-name-as-directory (car pats)))))))
+    (let ((dir (file-name-directory page))
+          (expanded-path nil))
+      (when dir
+        (setq expanded-path (concat (expand-file-name
+                                     page
+                                     (file-name-directory (muse-current-file)))
+                                    (when muse-file-extension
+                                      (concat "." muse-file-extension))))
+        (setq page (file-name-nondirectory page)))
+      (let ((files (muse-collect-alist
+                    (muse-project-file-alist project no-check-p)
+                    page))
+            (matches nil))
+        (if dir
+            (catch 'done
+              (save-match-data
+                (dolist (file files)
+                  (if (and expanded-path
+                           (string= expanded-path (cdr file)))
+                      (throw 'done (cdr file))
+                    (let ((pos (string-match (concat (regexp-quote dir) "\\'")
+                                             (file-name-directory
+                                              (cdr file)))))
+                      (when pos
+                        (setq matches (cons (cons pos (cdr file))
+                                            matches)))))))
+              ;; if we haven't found an exact match, pick a candidate
+              (car (muse-sort-by-rating matches)))
+          (dolist (file files)
+            (setq matches (cons (cons (length (cdr file)) (cdr file))
+                                matches)))
+          (car (muse-sort-by-rating matches '<)))))))
+
+(defun muse-project-private-p (file)
+  "Return non-nil if NAME is a private page with PROJECT."
+  (unless (or muse-under-windows-p
+              muse-project-publish-private-files)
+    (setq file (file-truename file))
+    (if (file-attributes file)  ; don't publish if no attributes exist
+        (or (when (eq ?- (aref (nth 8 (file-attributes
+                                       (file-name-directory file))) 7))
+              (message (concat
+                        "The " (file-name-directory file)
+                        " directory must be readable by others"
+                        " in order for its contents to be published.")))
+            (eq ?- (aref (nth 8 (file-attributes file)) 7)))
+      t)))
+
+(defun muse-project-file-entries (path)
+  (let* ((names (list t))
+         (lnames names)
+         (case-fold-search nil))
+    (cond
+     ((file-directory-p path)
+      (dolist (file (directory-files
+                     path t (when (and muse-file-extension
+                                       (not (string= muse-file-extension "")))
+                              (concat "." muse-file-extension "\\'"))))
+        (unless (or (string-match muse-project-ignore-regexp file)
+                    (string-match muse-project-ignore-regexp
+                                  (file-name-nondirectory file))
+                    (file-directory-p file))
+          (setcdr lnames
+                  (cons (cons (muse-page-name file) file) nil))
+          (setq lnames (cdr lnames)))))
+     ((file-readable-p path)
+      (setcdr lnames
+              (cons (cons (muse-page-name path) path) nil))
+      (setq lnames (cdr lnames)))
+     (t                                 ; regexp
+      (muse-assert (file-name-directory path))
+      (dolist (file (directory-files
+                     (file-name-directory path) t
+                     (file-name-nondirectory path)))
+        (unless (or (string-match muse-project-ignore-regexp file)
+                    (string-match muse-project-ignore-regexp
+                                  (file-name-nondirectory file)))
+          (setcdr lnames
+                  (cons (cons (muse-page-name file) file) nil))
+          (setq lnames (cdr lnames))))))
+    (cdr names)))
+
+(defvar muse-updating-file-alist-p nil
+  "Make sure that recursive calls to `muse-project-file-alist' are bounded.")
+
+(defun muse-project-determine-last-mod (project &optional no-check-p)
+  "Return the most recent last-modified timestamp of dirs in PROJECT."
+  (let ((last-mod nil))
+    (unless (or muse-under-windows-p no-check-p)
+      (let ((pats (cadr project)))
+        (while pats
+          (if (symbolp (car pats))
+              (setq pats (cddr pats))
+            (let* ((fnd (file-name-directory (car pats)))
+                   (dir (cond ((file-directory-p (car pats))
+                               (car pats))
+                              ((and (not (file-readable-p (car pats)))
+                                    fnd
+                                    (file-directory-p fnd))
+                               fnd))))
+              (when dir
+                (let ((mod-time (nth 5 (file-attributes dir))))
+                  (when (or (null last-mod)
+                            (and mod-time
+                                 (muse-time-less-p last-mod mod-time)))
+                    (setq last-mod mod-time)))))
+            (setq pats (cdr pats))))))
+    last-mod))
+
+(defun muse-project-file-alist (&optional project no-check-p)
+  "Return member filenames for the given Muse PROJECT.
+Also, update the `muse-project-file-alist' variable.
+
+On UNIX, this alist is only updated if one of the directories'
+contents have changed.  On Windows, it is always reread from
+disk.
+
+If NO-CHECK-P is non-nil, do not update the alist, just return
+the current one."
+  (setq project (muse-project project))
+  (when (and project muse-project-alist)
+    (let* ((file-alist (assoc (car project) muse-project-file-alist))
+           (last-mod (muse-project-determine-last-mod project no-check-p)))
+      ;; Either return the currently known list, or read it again from
+      ;; disk
+      (if (or (and no-check-p (cadr file-alist))
+              muse-updating-file-alist-p
+              (not (or muse-under-windows-p
+                       (null (cddr file-alist))
+                       (null last-mod)
+                       (muse-time-less-p (cddr file-alist) last-mod))))
+          (cadr file-alist)
+        (if file-alist
+            (setcdr (cdr file-alist) last-mod)
+          (setq file-alist (cons (car project) (cons nil last-mod))
+                muse-project-file-alist
+                (cons file-alist muse-project-file-alist)))
+        ;; Read in all of the file entries
+        (let ((muse-updating-file-alist-p t))
+          (prog1
+              (save-match-data
+                (setcar
+                 (cdr file-alist)
+                 (let* ((names (list t))
+                        (pats (cadr project)))
+                   (while pats
+                     (if (symbolp (car pats))
+                         (setq pats (cddr pats))
+                       (nconc names (muse-project-file-entries (car pats)))
+                       (setq pats (cdr pats))))
+                   (cdr names))))
+            (run-hooks 'muse-project-file-alist-hook)))))))
+
+(defun muse-project-add-to-alist (file &optional project)
+  "Make sure FILE is added to `muse-project-file-alist'.
+
+It works by either calling the `muse-project-file-alist' function
+if a directory has been modified since we last checked, or
+manually forcing the file entry to exist in the alist.  This
+works around an issue where if several files being saved at the
+same time, only the first one will make it into the alist.  It is
+meant to be called by `muse-project-after-save-hook'.
+
+The project of the file is determined by either the PROJECT
+argument, or `muse-project-of-file' if PROJECT is not specified."
+  (setq project (or (muse-project project) (muse-project-of-file file)))
+  (when (and project muse-project-alist)
+    (let* ((file-alist (assoc (car project) muse-project-file-alist))
+           (last-mod (muse-project-determine-last-mod project)))
+      ;; Determine whether we need to call this
+      (if (or (null (cddr file-alist))
+              (null last-mod)
+              (muse-time-less-p (cddr file-alist) last-mod))
+          ;; The directory will show up as modified, so go ahead and
+          ;; call `muse-project-file-alist'
+          (muse-project-file-alist project)
+        ;; It is not showing as modified, so forcefully add the
+        ;; current file to the project file-alist
+        (let ((muse-updating-file-alist-p t))
+          (prog1
+              (save-match-data
+                (setcar (cdr file-alist)
+                        (nconc (muse-project-file-entries file)
+                               (cadr file-alist))))
+            (run-hooks 'muse-project-file-alist-hook)))))))
+
+(defun muse-project-of-file (&optional pathname)
+  "Determine which project the given PATHNAME relates to.
+If PATHNAME is nil, the current buffer's filename is used."
+  (if (and (null pathname) muse-current-project)
+      muse-current-project
+    (unless pathname (setq pathname (muse-current-file)))
+    (save-match-data
+      (when (and (stringp pathname)
+                 muse-project-alist
+                 (not (string= pathname ""))
+                 (not (let ((case-fold-search nil))
+                        (or (string-match muse-project-ignore-regexp
+                                          pathname)
+                            (string-match muse-project-ignore-regexp
+                                          (file-name-nondirectory
+                                           pathname))))))
+        (let* ((file (file-truename pathname))
+               (dir  (file-name-directory file))
+               found rating matches)
+          (catch 'found
+            (dolist (project-entry muse-project-alist)
+              (let ((pats (cadr project-entry)))
+                (while pats
+                  (if (symbolp (car pats))
+                      (setq pats (cddr pats))
+                    (let ((tname (file-truename (car pats))))
+                      (cond ((or (string= tname file)
+                                 (string= (file-name-as-directory tname) dir))
+                             (throw 'found project-entry))
+                            ((string-match (concat "\\`" (regexp-quote tname))
+                                           file)
+                             (setq matches (cons (cons (match-end 0)
+                                                       project-entry)
+                                                 matches)))))
+                    (setq pats (cdr pats))))))
+            ;; if we haven't found an exact match, pick a candidate
+            (car (muse-sort-by-rating matches))))))))
+
+(defun muse-project-after-save-hook ()
+  "Update Muse's file-alist if we are saving a Muse file."
+  (let ((project (muse-project-of-file)))
+    (when project
+      (muse-project-add-to-alist (buffer-file-name) project))))
+
+(add-hook 'after-save-hook 'muse-project-after-save-hook)
+
+(defun muse-read-project (prompt &optional no-check-p no-assume)
+  "Read a project name from the minibuffer, if it can't be figured
+  out."
+  (if (null muse-project-alist)
+      (error "There are no Muse projects defined; see `muse-project-alist'")
+    (or (unless no-check-p
+          (muse-project-of-file))
+        (if (and (not no-assume)
+                 (= 1 (length muse-project-alist)))
+            (car muse-project-alist)
+          (assoc (funcall muse-completing-read-function
+                          prompt muse-project-alist)
+                 muse-project-alist)))))
+
+(defvar muse-project-page-history nil)
+
+(defun muse-read-project-file (project prompt &optional default)
+  (let* ((file-list (muse-delete-dups
+                     (mapcar #'(lambda (a) (list (car a)))
+                             (muse-project-file-alist project))))
+         (name (funcall muse-completing-read-function
+                       prompt file-list nil nil nil
+                       'muse-project-page-history default)))
+    (cons name (muse-project-page-file name project))))
+
+;;;###autoload
+(defun muse-project-find-file (name project &optional command directory)
+  "Open the Muse page given by NAME in PROJECT.
+If COMMAND is non-nil, it is the function used to visit the file.
+If DIRECTORY is non-nil, it is the directory in which the page
+will be created if it does not already exist.  Otherwise, the
+first directory within the project's fileset is used."
+  (interactive
+   (let* ((project (muse-read-project "Find in project: "
+                                      current-prefix-arg))
+          (default (muse-get-keyword :default (cadr project)))
+          (entry (muse-read-project-file
+                  project (if default
+                              (format "Find page: (default: %s) "
+                                      default)
+                            "Find page: ")
+                  default)))
+     (list entry project)))
+  (setq project (muse-project project))
+  (let ((project-name (car project)))
+    (unless (interactive-p)
+      (setq project (muse-project project)
+            name (cons name (muse-project-page-file name project))))
+    ;; If we're given a relative or absolute filename, open it as-is
+    (if (and (car name)
+             (save-match-data
+               (or (string-match "\\`\\.+/" (car name))
+                   (string-match muse-file-regexp (car name))
+                   (string-match muse-image-regexp (car name)))))
+        (setcdr name (car name))
+      ;; At this point, name is (PAGE . FILE).
+      (unless (cdr name)
+        (let ((pats (cadr project)))
+          (while (and pats (null directory))
+            (if (symbolp (car pats))
+                (setq pats (cddr pats))
+              (if (file-directory-p (car pats))
+                  (setq directory (car pats) pats nil)
+                (setq pats (cdr pats))))))
+        (when directory
+          (let ((filename (expand-file-name (car name) directory)))
+            (when (and muse-file-extension
+                       (not (string= muse-file-extension ""))
+                       (not (file-exists-p (car name))))
+              (setq filename (concat filename "." muse-file-extension)))
+            (unless (file-exists-p directory)
+              (make-directory directory t))
+            (setcdr name filename)))))
+    ;; Open the file
+    (if (cdr name)
+        (funcall (or command 'find-file) (cdr name))
+      (error "There is no page %s in project %s"
+             (car name) project-name))))
+
+(defun muse-project-choose-style (closure test styles)
+  "Run TEST on STYLES and return first style where TEST yields non-nil.
+TEST should take two arguments.  The first is CLOSURE, which is
+passed verbatim.  The second if the current style to consider.
+
+If no style passes TEST, return the first style."
+  (or (catch 'winner
+        (dolist (style styles)
+          (when (funcall test closure style)
+            (throw 'winner style))))
+      (car styles)))
+
+(defun muse-project-choose-style-by-link-suffix (given-suffix style)
+  "If the given STYLE has a link-suffix that equals GIVEN-SUFFIX,
+return non-nil."
+  (let ((link-suffix (or (muse-style-element :link-suffix style)
+                         (muse-style-element :suffix style))))
+    (and (stringp link-suffix)
+         (string= given-suffix link-suffix))))
+
+(defun muse-project-applicable-styles (file styles)
+  "Given STYLES, return a list of the ones that are considered for FILE.
+The name of a project may be used for STYLES."
+  (when (stringp styles)
+    (setq styles (cddr (muse-project styles))))
+  (when (and file styles)
+    (let ((used-styles nil))
+      (dolist (style styles)
+        (let ((include-regexp (muse-style-element :include style))
+              (exclude-regexp (muse-style-element :exclude style))
+              (rating nil))
+          (when (and (or (and (null include-regexp)
+                              (null exclude-regexp))
+                         (if include-regexp
+                             (setq rating (string-match include-regexp file))
+                           (not (string-match exclude-regexp file))))
+                     (file-exists-p file)
+                     (not (muse-project-private-p file)))
+            (setq used-styles (cons (cons rating style) used-styles)))))
+      (muse-sort-by-rating (nreverse used-styles)))))
+
+(defun muse-project-get-applicable-style (file styles)
+  "Choose a style from the STYLES that FILE can publish to.
+The user is prompted if several styles are found."
+  (muse-publish-get-style
+   (mapcar (lambda (style)
+             (cons (muse-get-keyword :base style) style))
+           (muse-project-applicable-styles file styles))))
+
+(defun muse-project-resolve-directory (page local-style remote-style)
+  "Figure out the directory part of the path that provides a link to PAGE.
+LOCAL-STYLE is the style of the current Muse file, and
+REMOTE-STYLE is the style associated with PAGE.
+
+If REMOTE-STYLE has a :base-url element, concatenate it and PAGE.
+Otherwise, return a relative link."
+  (let ((prefix (muse-style-element :base-url remote-style)))
+    (if prefix
+        (concat prefix page)
+      (file-relative-name (expand-file-name
+                           (file-name-nondirectory page)
+                           (muse-style-element :path remote-style))
+                          (expand-file-name
+                           (muse-style-element :path local-style))))))
+
+(defun muse-project-resolve-link (page local-style remote-styles)
+  "Return a published link from the output path of one file to another file.
+
+The best match for PAGE is determined by comparing the link
+suffix of the given local style and that of the remote styles.
+
+The remote styles are usually populated by
+`muse-project-applicable-styles'.
+
+If no remote style is found, return PAGE verbatim
+
+If PAGE has a :base-url associated with it, return the
+concatenation of the :base-url value and PAGE.
+
+Otherwise, return a relative path from the directory of
+LOCAL-STYLE to the best directory among REMOTE-STYLES."
+  (let ((link-suffix (or (muse-style-element :link-suffix local-style)
+                         (muse-style-element :suffix local-style)))
+        remote-style)
+    (if (not (stringp link-suffix))
+        (setq remote-style (car remote-styles))
+      (setq remote-style (muse-project-choose-style
+                          link-suffix
+                          #'muse-project-choose-style-by-link-suffix
+                          remote-styles)))
+    (if (null remote-style)
+        page
+      (setq page (muse-project-resolve-directory
+                  page local-style remote-style))
+      (concat (file-name-directory page)
+              (muse-publish-link-name page remote-style)))))
+
+(defun muse-project-current-output-style (&optional file project)
+  (or muse-current-output-style
+      (progn
+        (unless file (setq file (muse-current-file)))
+        (unless project (setq project (muse-project-of-file file)))
+        (car (muse-project-applicable-styles file (cddr project))))))
+
+(defun muse-project-link-page (page)
+  (let ((project (muse-project-of-file)))
+    (muse-project-resolve-link page
+                               (muse-project-current-output-style)
+                               (muse-project-applicable-styles
+                                (muse-project-page-file page project)
+                                (cddr project)))))
+
+(defun muse-project-publish-file-default (file style output-dir force)
+  ;; ensure the publishing location is available
+  (unless (file-exists-p output-dir)
+    (message "Creating publishing directory %s" output-dir)
+    (make-directory output-dir t))
+  ;; publish the member file!
+  (muse-publish-file file style output-dir force))
+
+(defun muse-project-publish-file (file styles &optional force)
+  (setq styles (muse-project-applicable-styles file styles))
+  (let (published)
+    (dolist (style styles)
+      (if (or (not (listp style))
+              (not (cdr style)))
+          (muse-display-warning
+           (concat "Skipping malformed muse-project-alist style."
+                   "\nPlease double-check your configuration,"))
+        (let ((output-dir (muse-style-element :path style))
+              (muse-current-output-style style)
+              (fun (or (muse-style-element :publish style t)
+                       'muse-project-publish-file-default)))
+          (when (funcall fun file style output-dir force)
+            (setq published t)))))
+    published))
+
+;;;###autoload
+(defun muse-project-publish-this-file (&optional force style)
+  "Publish the currently-visited file according to `muse-project-alist',
+prompting if more than one style applies.
+
+If FORCE is given, publish the file even if it is up-to-date.
+
+If STYLE is given, use that publishing style rather than
+prompting for one."
+  (interactive (list current-prefix-arg))
+  (let ((muse-current-project (muse-project-of-file)))
+    (if (not muse-current-project)
+        ;; file is not part of a project, so fall back to muse-publish
+        (if (interactive-p) (call-interactively 'muse-publish-this-file)
+          (muse-publish-this-file style nil force))
+      (unless style
+        (setq style (muse-project-get-applicable-style
+                     buffer-file-name (cddr muse-current-project))))
+      (let* ((output-dir (muse-style-element :path style))
+             (muse-current-project-global muse-current-project)
+             (muse-current-output-style (list :base (car style)
+                                              :path output-dir))
+             (fun (or (muse-style-element :publish style t)
+                      'muse-project-publish-file-default)))
+        (unless (funcall fun buffer-file-name style output-dir force)
+          (message (concat "The published version is up-to-date; use"
+                           " C-u C-c C-t to force an update.")))))))
+
+(defun muse-project-save-buffers (&optional project)
+  (setq project (muse-project project))
+  (when project
+    (save-excursion
+      (map-y-or-n-p
+       (function
+        (lambda (buffer)
+          (and (buffer-modified-p buffer)
+               (not (buffer-base-buffer buffer))
+               (or (buffer-file-name buffer)
+                   (progn
+                     (set-buffer buffer)
+                     (and buffer-offer-save
+                          (> (buffer-size) 0))))
+               (with-current-buffer buffer
+                 (let ((proj (muse-project-of-file)))
+                   (and proj (string= (car proj)
+                                      (car project)))))
+               (if (buffer-file-name buffer)
+                   (format "Save file %s? "
+                           (buffer-file-name buffer))
+                 (format "Save buffer %s? "
+                         (buffer-name buffer))))))
+       (function
+        (lambda (buffer)
+          (set-buffer buffer)
+          (save-buffer)))
+       (buffer-list)
+       '("buffer" "buffers" "save")
+       (if (boundp 'save-some-buffers-action-alist)
+           save-some-buffers-action-alist)))))
+
+(defun muse-project-publish-default (project styles &optional force)
+  "Publish the pages of PROJECT that need publishing."
+  (setq project (muse-project project))
+  (let ((published nil))
+    ;; publish all files in the project, for each style; the actual
+    ;; publishing will only happen if the files are newer than the
+    ;; last published output, or if the file is listed in
+    ;; :force-publish.  Files in :force-publish will not trigger the
+    ;; "All pages need to be published" message.
+    (let ((forced-files (muse-get-keyword :force-publish (cadr project)))
+          (file-alist (muse-project-file-alist project)))
+      (dolist (pair file-alist)
+        (when (muse-project-publish-file (cdr pair) styles force)
+          (setq forced-files (delete (car pair) forced-files))
+          (setq published t)))
+      (dolist (file forced-files)
+        (muse-project-publish-file (cdr (assoc file file-alist)) styles t)))
+    ;; run hook after publishing ends
+    (run-hook-with-args 'muse-after-project-publish-hook project)
+    ;; notify the user that everything is now done
+    (if published
+        (message "All pages in %s have been published." (car project))
+      (message "No pages in %s need publishing at this time."
+               (car project)))))
+
+;;;###autoload
+(defun muse-project-publish (project &optional force)
+  "Publish the pages of PROJECT that need publishing."
+  (interactive (list (muse-read-project "Publish project: " nil t)
+                     current-prefix-arg))
+  (setq project (muse-project project))
+  (let ((styles (cddr project))
+        (muse-current-project project)
+        (muse-current-project-global project))
+    ;; determine the style from the project, or else ask
+    (unless styles
+      (setq styles (list (muse-publish-get-style))))
+    (unless project
+      (error "Cannot find a project to publish"))
+    ;; prompt to save any buffers related to this project
+    (muse-project-save-buffers project)
+    ;; run hook before publishing begins
+    (run-hook-with-args 'muse-before-project-publish-hook project)
+    ;; run the project-level publisher
+    (let ((fun (or (muse-get-keyword :publish-project (cadr project) t)
+                   'muse-project-publish-default)))
+      (funcall fun project styles force))))
+
+(defun muse-project-batch-publish ()
+  "Publish Muse files in batch mode."
+  (let ((muse-batch-publishing-p t)
+        force)
+    (if (string= "--force" (or (car command-line-args-left) ""))
+        (setq force t
+              command-line-args-left (cdr command-line-args-left)))
+    (if command-line-args-left
+        (dolist (project command-line-args-left)
+          (message "Publishing project %s ..." project)
+          (muse-project-publish project force))
+      (message "No projects specified."))))
+
+(eval-when-compile
+  (put 'make-local-hook 'byte-compile nil))
+
+(defun muse-project-set-variables ()
+  "Load project-specific variables."
+  (when (and muse-current-project-global (null muse-current-project))
+    (setq muse-current-project muse-current-project-global))
+  (let ((vars (muse-get-keyword :set (cadr muse-current-project)))
+        sym custom-set var)
+    (while vars
+      (setq sym (car vars))
+      (setq custom-set (or (get sym 'custom-set) 'set))
+      (setq var (if (eq (get sym 'custom-type) 'hook)
+                    (make-local-hook sym)
+                  (make-local-variable sym)))
+      (funcall custom-set var (car (cdr vars)))
+      (setq vars (cdr (cdr vars))))))
+
+(custom-add-option 'muse-before-publish-hook 'muse-project-set-variables)
+(add-to-list 'muse-before-publish-hook 'muse-project-set-variables)
+
+(defun muse-project-delete-output-files (project)
+  (interactive
+   (list (muse-read-project "Remove all output files for project: " nil t)))
+  (setq project (muse-project project))
+  (let ((file-alist (muse-project-file-alist project))
+        (styles (cddr project))
+        output-file path)
+    (dolist (entry file-alist)
+      (dolist (style styles)
+        (setq output-file
+              (and (setq path (muse-style-element :path style))
+                   (expand-file-name
+                    (concat (muse-style-element :prefix style)
+                            (car entry)
+                            (or (muse-style-element :osuffix style)
+                                (muse-style-element :suffix style)))
+                    path)))
+        (if output-file
+            (muse-delete-file-if-exists output-file))))))
+
+;;; muse-project.el ends here
diff --git a/packages/muse/muse-protocols.el b/packages/muse/muse-protocols.el
new file mode 100644 (file)
index 0000000..5e1061c
--- /dev/null
@@ -0,0 +1,251 @@
+;;; muse-protocols.el --- URL protocols that Muse recognizes
+
+;; Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010
+;;   Free Software Foundation, Inc.
+
+;; Author: Brad Collins (brad AT chenla DOT org)
+
+;; This file is part of Emacs Muse.  It is not part of GNU Emacs.
+
+;; Emacs Muse 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, or (at your
+;; option) any later version.
+
+;; Emacs Muse 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 Emacs Muse; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; Here's an example for adding a protocol for the site yubnub, a Web
+;; Command line service.
+;;
+;; (add-to-list 'muse-url-protocols '("yubnub://" muse-browse-url-yubnub
+;;                                                muse-resolve-url-yubnub))
+;;
+;; (defun muse-resolve-url-yubnub (url)
+;;   "Resolve a yubnub URL."
+;;   ;; Remove the yubnub://
+;;   (when (string-match "\\`yubnub://\\(.+\\)" url)
+;;     (match-string 1)))
+;;
+;; (defun muse-browse-url-yubnub (url)
+;;   "If this is a yubnub URL-command, jump to it."
+;;   (setq url (muse-resolve-url-yubnub url))
+;;   (browse-url (concat "http://yubnub.org/parser/parse?command="
+;;                       url)))
+
+;;; Contributors:
+
+;; Phillip Lord (Phillip.Lord AT newcastle DOT ac DOT uk) provided a
+;; handler for DOI URLs.
+
+;; Stefan Schlee fixed a bug with handling of colons at the end of
+;; URLs.
+
+;; Valery V. Vorotyntsev contribued the woman:// protocol handler and
+;; simplified `muse-browse-url-man'.
+
+;;; Code:
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Muse URL Protocols
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'info)
+(require 'muse-regexps)
+
+(defvar muse-url-regexp nil
+  "A regexp used to match URLs within a Muse page.
+This is autogenerated from `muse-url-protocols'.")
+
+(defun muse-update-url-regexp (sym value)
+  (setq muse-url-regexp
+        (concat "\\<\\(" (mapconcat 'car value "\\|") "\\)"
+                "[^][" muse-regexp-blank "\"'()<>^`{}\n]*"
+                "[^][" muse-regexp-blank "\"'()<>^`{}.,;:\n]+"))
+  (set sym value))
+
+(defcustom muse-url-protocols
+  '(("[uU][rR][lL]:" muse-browse-url-url identity)
+    ("info://" muse-browse-url-info nil)
+    ("man://" muse-browse-url-man nil)
+    ("woman://" muse-browse-url-woman nil)
+    ("google://" muse-browse-url-google muse-resolve-url-google)
+    ("http:/?/?" browse-url identity)
+    ("https:/?/?" browse-url identity)
+    ("ftp:/?/?" browse-url identity)
+    ("gopher://" browse-url identity)
+    ("telnet://" browse-url identity)
+    ("wais://" browse-url identity)
+    ("file://?" browse-url identity)
+    ("dict:" muse-browse-url-dict muse-resolve-url-dict)
+    ("doi:" muse-browse-url-doi muse-resolve-url-doi)
+    ("news:" browse-url identity)
+    ("snews:" browse-url identity)
+    ("mailto:" browse-url identity))
+  "A list of (PROTOCOL BROWSE-FUN RESOLVE-FUN) used to match URL protocols.
+PROTOCOL describes the first part of the URL, including the
+\"://\" part.  This may be a regexp.
+
+BROWSE-FUN should accept URL as an argument and open the URL in
+the current window.
+
+RESOLVE-FUN should accept URL as an argument and return the final
+URL, or nil if no URL should be included."
+  :type '(repeat (list :tag "Protocol"
+                       (string :tag "Regexp")
+                       (function :tag "Browse")
+                       (choice (function :tag "Resolve")
+                               (const :tag "Don't resolve" nil))))
+  :set 'muse-update-url-regexp
+  :group 'muse)
+
+(add-hook 'muse-update-values-hook
+          (lambda ()
+            (muse-update-url-regexp 'muse-url-protocols muse-url-protocols)))
+
+(defcustom muse-wikipedia-country "en"
+  "Indicate the 2-digit country code that we use for Wikipedia
+queries."
+  :type 'string
+  :options '("de" "en" "es" "fr" "it" "pl" "pt" "ja" "nl" "sv")
+  :group 'muse)
+
+(defun muse-protocol-find (proto list)
+  "Return the first element of LIST whose car matches the regexp PROTO."
+  (catch 'found
+    (dolist (item list)
+      (when (string-match (concat "\\`" (car item)) proto)
+        (throw 'found item)))))
+
+;;;###autoload
+(defun muse-browse-url (url &optional other-window)
+  "Handle URL with the function specified in `muse-url-protocols'.
+If OTHER-WINDOW is non-nil, open in a different window."
+  (interactive (list (read-string "URL: ")
+                     current-prefix-arg))
+  ;; Strip text properties
+  (when (fboundp 'set-text-properties)
+    (set-text-properties 0 (length url) nil url))
+  (when other-window
+    (switch-to-buffer-other-window (current-buffer)))
+  (when (string-match muse-url-regexp url)
+    (let* ((proto (match-string 1 url))
+           (entry (muse-protocol-find proto muse-url-protocols)))
+      (when entry
+        (funcall (cadr entry) url)))))
+
+(defun muse-resolve-url (url &rest ignored)
+  "Resolve URL with the function specified in `muse-url-protocols'."
+  (when (string-match muse-url-regexp url)
+    (let* ((proto (match-string 1 url))
+           (entry (muse-protocol-find proto muse-url-protocols)))
+      (when entry
+        (let ((func (car (cddr entry))))
+          (if func
+              (setq url (funcall func url))
+            (setq url nil))))))
+  url)
+
+(defun muse-protocol-add (protocol browse-function resolve-function)
+  "Add PROTOCOL to `muse-url-protocols'.  PROTOCOL may be a regexp.
+
+BROWSE-FUNCTION should be a function that visits a URL in the
+current buffer.
+
+RESOLVE-FUNCTION should be a function that transforms a URL for
+publishing or returns nil if not linked."
+  (add-to-list 'muse-url-protocols
+               (list protocol browse-function resolve-function))
+  (muse-update-url-regexp 'muse-url-protocols
+                          muse-url-protocols))
+
+(defun muse-browse-url-url (url)
+  "Call `muse-protocol-browse-url' to browse URL.
+This is used when we are given something like
+\"URL:http://example.org/\".
+
+If you're looking for a good example for how to make a custom URL
+handler, look at `muse-browse-url-dict' instead."
+  (when (string-match "\\`[uU][rR][lL]:\\(.+\\)" url)
+    (muse-browse-url (match-string 1 url))))
+
+(defun muse-resolve-url-dict (url)
+  "Return the Wikipedia link corresponding with the given URL."
+  (when (string-match "\\`dict:\\(.+\\)" url)
+    (concat "http://" muse-wikipedia-country ".wikipedia.org/"
+            "wiki/Special:Search?search=" (match-string 1 url))))
+
+(defun muse-browse-url-dict (url)
+  "If this is a Wikipedia URL, browse it."
+  (let ((dict-url (muse-resolve-url-dict url)))
+    (when dict-url
+      (browse-url dict-url))))
+
+(defun muse-resolve-url-doi (url)
+  "Return the URL through DOI proxy server."
+  (when (string-match "\\`doi:\\(.+\\)" url)
+    (concat "http://dx.doi.org/"
+            (match-string 1 url))))
+
+(defun muse-browse-url-doi (url)
+  "If this is a DOI URL, browse it.
+
+DOI's (digitial object identifiers) are a standard identifier
+used in the publishing industry."
+  (let ((doi-url (muse-resolve-url-doi url)))
+    (when doi-url
+      (browse-url doi-url))))
+
+(defun muse-resolve-url-google (url)
+  "Return the correct Google search string."
+  (when (string-match "\\`google:/?/?\\(.+\\)" url)
+    (concat "http://www.google.com/search?q="
+            (match-string 1 url))))
+
+(defun muse-browse-url-google (url)
+  "If this is a Google URL, jump to it."
+  (let ((google-url (muse-resolve-url-google url)))
+    (when google-url
+      (browse-url google-url))))
+
+(defun muse-browse-url-info (url)
+  "If this in an Info URL, jump to it."
+  (require 'info)
+  (cond
+   ((string-match "\\`info://\\([^#\n]+\\)#\\(.+\\)" url)
+    (Info-find-node (match-string 1 url)
+                    (match-string 2 url)))
+   ((string-match "\\`info://\\([^#\n]+\\)" url)
+    (Info-find-node (match-string 1 url)
+                    "Top"))
+   ((string-match "\\`info://(\\([^)\n]+\\))\\(.+\\)" url)
+    (Info-find-node (match-string 1 url) (match-string 2 url)))
+   ((string-match "\\`info://\\(.+\\)" url)
+    (Info-find-node (match-string 1 url) "Top"))))
+
+(defun muse-browse-url-man (url)
+  "If this in a manpage URL, jump to it."
+  (require 'man)
+  (when (string-match "\\`man://\\([^(]+\\(([^)]+)\\)?\\)" url)
+    (man (match-string 1 url))))
+
+(defun muse-browse-url-woman (url)
+  "If this is a WoMan URL, jump to it."
+  (require 'woman)
+  (when (string-match "\\`woman://\\(.+\\)" url)
+    (woman (match-string 1 url))))
+
+(provide 'muse-protocols)
+
+;;; muse-protocols.el ends here
diff --git a/packages/muse/muse-publish.el b/packages/muse/muse-publish.el
new file mode 100644 (file)
index 0000000..ec6e176
--- /dev/null
@@ -0,0 +1,2193 @@
+;;; muse-publish.el --- base publishing implementation
+
+;; Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010
+;;   Free Software Foundation, Inc.
+
+;; This file is part of Emacs Muse.  It is not part of GNU Emacs.
+
+;; Emacs Muse 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, or (at your
+;; option) any later version.
+
+;; Emacs Muse 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 Emacs Muse; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;;; Contributors:
+
+;; Yann Hodique (yann DOT hodique AT gmail DOT com) fixed an
+;; unnecessary URL description transform in `muse-publish-url'.
+
+;; Peter K. Lee (saint AT corenova DOT com) provided the
+;; `muse-style-elements-list' function.
+
+;; Jim Ottaway (j DOT ottaway AT lse DOT ac DOT uk) provided a
+;; reference implementation for nested lists, as well as some code for
+;; the "style" element of the <literal> tag.
+
+;; Deus Max (deusmax AT gmail DOT com) provided the <php> tag.
+
+;;; Code:
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Muse Publishing
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(provide 'muse-publish)
+
+(require 'muse)
+(require 'muse-regexps)
+
+(defgroup muse-publish nil
+  "Options controlling the general behavior of Muse publishing."
+  :group 'muse)
+
+(defcustom muse-before-publish-hook nil
+  "A hook run in the buffer to be published, before it is done."
+  :type 'hook
+  :group 'muse-publish)
+
+(defcustom muse-after-publish-hook nil
+  "A hook run in the buffer to be published, after it is done."
+  :type 'hook
+  :group 'muse-publish)
+
+(defcustom muse-publish-url-transforms
+  '(muse-resolve-url)
+  "A list of functions used to prepare URLs for publication.
+Each is passed the URL.  The transformed URL should be returned."
+  :type 'hook
+  :options '(muse-resolve-url)
+  :group 'muse-publish)
+
+(defcustom muse-publish-desc-transforms
+  '(muse-publish-strip-URL)
+  "A list of functions used to prepare URL desciptions for publication.
+Each is passed the description.  The modified description should
+be returned."
+  :type 'hook
+  :options '(muse-publish-strip-URL)
+  :group 'muse-publish)
+
+(defcustom muse-publish-date-format "%B %e, %Y"
+  "Format string for the date, used by `muse-publish-markup-buffer'.
+See `format-time-string' for details on the format options."
+  :type 'string
+  :group 'muse-publish)
+
+(defcustom muse-publish-comments-p nil
+  "If nil, remove comments before publishing.
+If non-nil, publish comments using the markup of the current style."
+  :type 'boolean
+  :group 'muse-publish)
+
+(defcustom muse-publish-report-threshhold 100000
+  "If a file is this size or larger, report publishing progress."
+  :type 'integer
+  :group 'muse-publish)
+
+(defcustom muse-publish-markup-regexps
+  `(;; Remove leading and trailing whitespace from the file
+    (1000 "\\(\\`\n+\\|\n+\\'\\)" 0 "")
+
+    ;; Remove trailing whitespace from all lines
+    (1100 ,(concat "[" muse-regexp-blank "]+$") 0 "")
+
+    ;; Handle any leading #directives
+    (1200 "\\`#\\([a-zA-Z-]+\\)\\s-+\\(.+\\)\n+" 0 directive)
+
+    ;; commented lines
+    (1250 ,(concat "^;\\(?:[" muse-regexp-blank "]+\\(.+\\)\\|$\\|'\\)")
+          0 comment)
+
+    ;; markup tags
+    (1300 muse-tag-regexp 0 tag)
+
+    ;; prevent emphasis characters in explicit links from being marked
+    (1400 muse-explicit-link-regexp 0 muse-publish-mark-link)
+
+    ;; emphasized or literal text
+    (1600 ,(concat "\\(^\\|[-[" muse-regexp-blank
+                   "<('`\"\n]\\)\\(=[^=" muse-regexp-blank
+                   "\n]\\|_[^_" muse-regexp-blank
+                   "\n]\\|\\*+[^*" muse-regexp-blank
+                   "\n]\\)")
+          2 word)
+
+    ;; headings, outline-mode style
+    (1700 "^\\(\\*+\\)\\s-+" 0 heading)
+
+    ;; ellipses
+    (1800 "\\.\\.\\.\\." 0 enddots)
+    (1850 "\\.\\.\\." 0 dots)
+
+    ;; horizontal rule, or section separator
+    (1900 "^----+" 0 rule)
+
+    ;; non-breaking space
+    (1950 "~~" 0 no-break-space)
+
+    ;; beginning of footnotes section
+    (2000 "^Footnotes:?\\s-*" 0 fn-sep)
+    ;; footnote definition/reference (def if at beginning of line)
+    (2100 "\\[\\([1-9][0-9]*\\)\\]" 0 footnote)
+
+    ;; unnumbered List items begin with a -.  numbered list items
+    ;; begin with number and a period.  definition lists have a
+    ;; leading term separated from the body with ::.  centered
+    ;; paragraphs begin with at least six columns of whitespace; any
+    ;; other whitespace at the beginning indicates a blockquote.  The
+    ;; reason all of these rules are handled here, is so that
+    ;; blockquote detection doesn't interfere with indented list
+    ;; members.
+    (2200 ,(format muse-list-item-regexp (concat "[" muse-regexp-blank "]*"))
+          0 list)
+
+    ;; support table.el style tables
+    (2300 ,(concat "^" muse-table-el-border-regexp "\n"
+                   "\\(\\(" muse-table-el-line-regexp "\n\\)+"
+                   "\\(" muse-table-el-border-regexp "\\)"
+                   "\\(\n\\|\\'\\)\\)+")
+          0 table-el)
+
+    ;; simple table markup is supported, nothing fancy.  use | to
+    ;; separate cells, || to separate header cells, and ||| for footer
+    ;; cells
+    (2350 ,(concat "\\(\\([" muse-regexp-blank "]*\n\\)?"
+                   "\\(\\(?:" muse-table-line-regexp "\\|"
+                   muse-table-hline-regexp "\\)\\(?:\n\\|\\'\\)\\)\\)+")
+          0 table)
+
+    ;; blockquote and centered text
+    (2400 ,(concat "^\\([" muse-regexp-blank "]+\\).+") 0 quote)
+
+    ;; the emdash ("--" or "---")
+    (2500 ,(concat "\\(^\\|[" muse-regexp-blank "]*\\)---?\\($\\|["
+                   muse-regexp-blank "]*\\)")
+          0 emdash)
+
+    ;; "verse" text is indicated the same way as a quoted e-mail
+    ;; response: "> text", where text may contain initial whitespace
+    ;; (see below).
+    (2600 ,(concat "^[" muse-regexp-blank "]*> ") 0 verse)
+
+    ;; define anchor points
+    (2700 "^\\(\\W*\\)#\\(\\S-+\\)\\s-*" 0 anchor)
+
+    ;; replace links in the buffer (links to other pages)
+    (2900 muse-explicit-link-regexp 0 link)
+
+    ;; bare URLs
+    (3000 muse-url-regexp 0 url)
+
+    ;; bare email addresses
+    (3500
+     "\\([^[]\\)[-a-zA-Z0-9._]+@\\([-a-zA-z0-9_]+\\.\\)+[a-zA-Z0-9]+" 0 email)
+    )
+  "List of markup rules for publishing a page with Muse.
+The rules given in this variable are invoked first, followed by
+whatever rules are specified by the current style.
+
+Each member of the list is either a function, or a list of the form:
+
+  (REGEXP/SYMBOL TEXT-BEGIN-GROUP REPLACEMENT-TEXT/FUNCTION/SYMBOL)
+
+REGEXP is a regular expression, or symbol whose value is a regular
+expression, which is searched for using `re-search-forward'.
+TEXT-BEGIN-GROUP is the matching group within that regexp which
+denotes the beginning of the actual text to be marked up.
+REPLACEMENT-TEXT is a string that will be passed to `replace-match'.
+If it is not a string, but a function, it will be called to determine
+what the replacement text should be (it must return a string).  If it
+is a symbol, the value of that symbol should be a string.
+
+The replacements are done in order, one rule at a time.  Writing
+the regular expressions can be a tricky business.  Note that case
+is never ignored.  `case-fold-search' is always bound to nil
+while processing the markup rules."
+  :type '(repeat (choice
+                  (list :tag "Markup rule"
+                        integer
+                        (choice regexp symbol)
+                        integer
+                        (choice string function symbol))
+                  function))
+  :group 'muse-publish)
+
+(defcustom muse-publish-markup-functions
+  '((directive . muse-publish-markup-directive)
+    (comment   . muse-publish-markup-comment)
+    (anchor    . muse-publish-markup-anchor)
+    (tag       . muse-publish-markup-tag)
+    (word      . muse-publish-markup-word)
+    (emdash    . muse-publish-markup-emdash)
+    (enddots   . muse-publish-markup-enddots)
+    (dots      . muse-publish-markup-dots)
+    (rule      . muse-publish-markup-rule)
+    (no-break-space . muse-publish-markup-no-break-space)
+    (heading   . muse-publish-markup-heading)
+    (footnote  . muse-publish-markup-footnote)
+    (fn-sep    . muse-publish-markup-fn-sep)
+    (list      . muse-publish-markup-list)
+    (quote     . muse-publish-markup-quote)
+    (verse     . muse-publish-markup-verse)
+    (table     . muse-publish-markup-table)
+    (table-el  . muse-publish-markup-table-el)
+    (email     . muse-publish-markup-email)
+    (link      . muse-publish-markup-link)
+    (url       . muse-publish-markup-url))
+  "An alist of style types to custom functions for that kind of text.
+
+Each member of the list is of the form:
+
+  (SYMBOL FUNCTION)
+
+SYMBOL describes the type of text to associate with this rule.
+`muse-publish-markup-regexps' maps regexps to these symbols.
+
+FUNCTION is the function to use to mark up this kind of rule if
+no suitable function is found through the :functions tag of the
+current style."
+  :type '(alist :key-type symbol :value-type function)
+  :group 'muse-publish)
+
+(defcustom muse-publish-markup-tags
+  '(("contents" nil t   nil muse-publish-contents-tag)
+    ("verse"    t   nil nil muse-publish-verse-tag)
+    ("example"  t   nil nil muse-publish-example-tag)
+    ("src"      t   t   nil muse-publish-src-tag)
+    ("code"     t   nil nil muse-publish-code-tag)
+    ("quote"    t   nil t   muse-publish-quote-tag)
+    ("literal"  t   t   nil muse-publish-literal-tag)
+    ("verbatim" t   nil nil muse-publish-verbatim-tag)
+    ("br"       nil nil nil muse-publish-br-tag)
+    ("lisp"     t   t   nil muse-publish-lisp-tag)
+    ("class"    t   t   nil muse-publish-class-tag)
+    ("div"      t   t   nil muse-publish-div-tag)
+    ("command"  t   t   nil muse-publish-command-tag)
+    ("perl"     t   t   nil muse-publish-perl-tag)
+    ("php"      t   t   nil muse-publish-php-tag)
+    ("python"   t   t   nil muse-publish-python-tag)
+    ("ruby"     t   t   nil muse-publish-ruby-tag)
+    ("comment"  t   nil nil muse-publish-comment-tag)
+    ("include"  nil t   nil muse-publish-include-tag)
+    ("markup"   t   t   nil muse-publish-mark-up-tag)
+    ("cite"     t   t   nil muse-publish-cite-tag))
+  "A list of tag specifications, for specially marking up text.
+XML-style tags are the best way to add custom markup to Muse.
+This is easily accomplished by customizing this list of markup tags.
+
+For each entry, the name of the tag is given, whether it expects
+a closing tag, whether it takes an optional set of attributes,
+whether it is nestable, and a function that performs whatever
+action is desired within the delimited region.
+
+The tags themselves are deleted during publishing, before the
+function is called.  The function is called with three arguments,
+the beginning and end of the region surrounded by the tags.  If
+properties are allowed, they are passed as a third argument in
+the form of an alist.  The `end' argument to the function is
+always a marker.
+
+Point is always at the beginning of the region within the tags, when
+the function is called.  Wherever point is when the function finishes
+is where tag markup will resume.
+
+These tag rules are processed once at the beginning of markup, and
+once at the end, to catch any tags which may have been inserted
+in-between."
+  :type '(repeat (list (string :tag "Markup tag")
+                       (boolean :tag "Expect closing tag" :value t)
+                       (boolean :tag "Parse attributes" :value nil)
+                       (boolean :tag "Nestable" :value nil)
+                       function))
+  :group 'muse-publish)
+
+(defcustom muse-publish-markup-header-footer-tags
+  '(("lisp"     t   t   nil muse-publish-lisp-tag)
+    ("markup"   t   t   nil muse-publish-mark-up-tag))
+  "Tags used when publishing headers and footers.
+See `muse-publish-markup-tags' for details."
+  :type '(repeat (list (string :tag "Markup tag")
+                       (boolean :tag "Expect closing tag" :value t)
+                       (boolean :tag "Parse attributes" :value nil)
+                       (boolean :tag "Nestable" :value nil)
+                       function))
+  :group 'muse-publish)
+
+(defcustom muse-publish-markup-specials nil
+  "A table of characters which must be represented specially."
+  :type '(alist :key-type character :value-type string)
+  :group 'muse-publish)
+
+(defcustom muse-publish-enable-local-variables nil
+  "If non-nil, interpret local variables in a file when publishing."
+  :type 'boolean
+  :group 'muse-publish)
+
+(defcustom muse-publish-enable-dangerous-tags t
+  "If non-nil, publish tags like <lisp> and <command> that can
+call external programs or expose sensitive information.
+Otherwise, ignore tags like this.
+
+This is useful to set to nil when the file to publish is coming
+from an untrusted source."
+  :type 'boolean
+  :group 'muse-publish)
+
+(defvar muse-publishing-p nil
+  "This is set to t while a page is being published.")
+(defvar muse-batch-publishing-p nil
+  "This is set to t while a page is being batch published.")
+(defvar muse-inhibit-before-publish-hook nil
+  "This is set to t when publishing a file rather than just a buffer.
+It is used by `muse-publish-markup-buffer'.")
+(defvar muse-publishing-styles nil
+  "The publishing styles that Muse recognizes.
+This is automatically generated when loading publishing styles.")
+(defvar muse-publishing-current-file nil
+  "The file that is currently being published.")
+(defvar muse-publishing-current-output-path nil
+  "The path where the current file will be published to.")
+(defvar muse-publishing-current-style nil
+  "The style of the file that is currently being published.")
+(defvar muse-publishing-directives nil
+  "An alist of publishing directives from the top of a file.")
+(defvar muse-publish-generate-contents nil
+  "Non-nil if a table of contents should be generated.
+If non-nil, it is a cons cell specifying (MARKER . DEPTH), to
+tell where the <contents> was seen, and to what depth the
+contents were requested.")
+(defvar muse-publishing-last-position nil
+  "Last position of the point when publishing.
+This is used to make sure that publishing doesn't get stalled.")
+
+(defvar muse-publish-inhibit-style-hooks nil
+  "If non-nil, do not call the :before or :before-end hooks when publishing.")
+
+(defvar muse-publish-use-header-footer-tags nil
+  "If non-nil, use `muse-publish-markup-header-footer-tags' for looking up
+tags.  Otherwise, use `muse-publish-markup-tags'.")
+
+(defvar muse-inhibit-style-tags nil
+  "If non-nil, do not search for style-specific tags.
+This is used when publishing headers and footers.")
+
+;; Functions for handling style information
+
+(defsubst muse-style (&optional style)
+  "Resolve the given STYLE into a Muse style, if it is a string."
+  (if (null style)
+      muse-publishing-current-style
+    (if (stringp style)
+        (assoc style muse-publishing-styles)
+      (muse-assert (consp style))
+      style)))
+
+(defun muse-define-style (name &rest elements)
+  (let ((entry (assoc name muse-publishing-styles)))
+    (if entry
+        (setcdr entry elements)
+      (setq muse-publishing-styles
+            (cons (append (list name) elements)
+                  muse-publishing-styles)))))
+
+(defun muse-derive-style (new-name base-name &rest elements)
+  (apply 'muse-define-style new-name
+         (append elements (list :base base-name))))
+
+(defsubst muse-get-keyword (keyword list &optional direct)
+  (let ((value (cadr (memq keyword list))))
+    (if (and (not direct) (symbolp value))
+        (symbol-value value)
+      value)))
+
+(defun muse-style-elements-list (elem &optional style)
+  "Return a list all references to ELEM in STYLE, including base styles.
+If STYLE is not specified, use current style."
+  (let (base elements)
+    (while style
+      (setq style (muse-style style))
+      (setq elements (append elements
+                             (muse-get-keyword elem style)))
+      (setq style (muse-get-keyword :base style)))
+    elements))
+
+(defun muse-style-element (elem &optional style direct)
+  "Search for ELEM in STYLE, including base styles.
+If STYLE is not specified, use current style."
+  (setq style (muse-style style))
+  (let ((value (muse-get-keyword elem style direct)))
+    (if value
+        value
+      (let ((base (muse-get-keyword :base style)))
+        (if base
+            (muse-style-element elem base direct))))))
+
+(defun muse-style-derived-p-1 (base style)
+  "Internal function used by `muse-style-derived-p'."
+  (if (and (stringp style)
+           (string= style base))
+      t
+    (setq style (muse-style style))
+    (let ((value (muse-get-keyword :base style)))
+      (when value
+        (muse-style-derived-p base value)))))
+
+(defun muse-style-derived-p (base &optional style)
+  "Return non-nil if STYLE is equal to or derived from BASE,
+non-nil otherwise.
+
+BASE should be a string."
+  (unless style
+    (setq style (muse-style)))
+  (when (and (consp style)
+             (stringp (car style)))
+    (setq style (car style)))
+  (muse-style-derived-p-1 base style))
+
+(defun muse-find-markup-element (keyword ident style)
+  (let ((def (assq ident (muse-style-element keyword style))))
+    (if def
+        (cdr def)
+      (let ((base (muse-style-element :base style)))
+        (if base
+            (muse-find-markup-element keyword ident base))))))
+
+(defun muse-markup-text (ident &rest args)
+  "Insert ARGS into the text markup associated with IDENT.
+If the markup text has sections like %N%, this will be replaced
+with the N-1th argument in ARGS.  After that, `format' is applied
+to the text with ARGS as parameters."
+  (let ((text (muse-find-markup-element :strings ident (muse-style))))
+    (if (and text args)
+        (progn
+          (let (start repl-text)
+            (while (setq start (string-match "%\\([1-9][0-9]*\\)%" text start))
+              ;; escape '%' in the argument text, since we will be
+              ;; using format on it
+              (setq repl-text (muse-replace-regexp-in-string
+                               "%" "%%"
+                               (nth (1- (string-to-number
+                                         (match-string 1 text))) args)
+                               t t)
+                    start (+ start (length repl-text))
+                    text (replace-match repl-text t t text))))
+          (apply 'format text args))
+      (or text ""))))
+
+(defun muse-insert-markup (&rest args)
+  (let ((beg (point)))
+    (apply 'insert args)
+    (muse-publish-mark-read-only beg (point))))
+
+(defun muse-find-markup-tag (keyword tagname style)
+  (let ((def (assoc tagname (muse-style-element keyword style))))
+    (or def
+        (let ((base (muse-style-element :base style)))
+          (if base
+              (muse-find-markup-tag keyword tagname base))))))
+
+(defun muse-markup-tag-info (tagname &rest args)
+  (let ((tag-info (and (not muse-inhibit-style-tags)
+                       (muse-find-markup-tag :tags tagname (muse-style)))))
+    (or tag-info
+        (assoc tagname
+               (if muse-publish-use-header-footer-tags
+                   muse-publish-markup-header-footer-tags
+                 muse-publish-markup-tags)))))
+
+(defsubst muse-markup-function (category)
+  (let ((func (muse-find-markup-element :functions category (muse-style))))
+    (or func
+        (cdr (assq category muse-publish-markup-functions)))))
+
+;; Publishing routines
+
+(defun muse-publish-markup (name rules)
+  (let* ((case-fold-search nil)
+         (inhibit-read-only t)
+         (limit (* (length rules) (point-max)))
+         (verbose (and muse-publish-report-threshhold
+                       (> (point-max) muse-publish-report-threshhold)))
+         (base 0))
+    (while rules
+      (goto-char (point-min))
+      (let ((regexp (nth 1 (car rules)))
+            (group (nth 2 (car rules)))
+            (repl (nth 3 (car rules)))
+            pos)
+        (setq muse-publishing-last-position nil)
+        (if (symbolp regexp)
+            (setq regexp (symbol-value regexp)))
+        (if (and verbose (not muse-batch-publishing-p))
+            (message "Publishing %s...%d%%" name
+                     (* (/ (float (+ (point) base)) limit) 100)))
+        (while (and regexp (progn
+                             (when (and (get-text-property (point) 'read-only)
+                                        (> (point) (point-min)))
+                               (goto-char (or (next-single-property-change
+                                               (point) 'read-only)
+                                              (point-max))))
+                             (setq pos (re-search-forward regexp nil t))))
+          (if (and verbose (not muse-batch-publishing-p))
+              (message "Publishing %s...%d%%" name
+                       (* (/ (float (+ (point) base)) limit) 100)))
+          (unless (and (> (- (match-end 0) (match-beginning 0)) 0)
+                       (match-beginning group)
+                       (get-text-property (match-beginning group) 'read-only))
+            (let* (func
+                   (text (cond
+                          ((and (symbolp repl)
+                                (setq func (muse-markup-function repl)))
+                           (funcall func))
+                          ((functionp repl)
+                           (funcall repl))
+                          ((symbolp repl)
+                           (symbol-value repl))
+                          (t repl))))
+              (if (stringp text)
+                  (replace-match text t))))
+          (if (and muse-publishing-last-position
+                   (= pos muse-publishing-last-position))
+              (if (eobp)
+                  (setq regexp nil)
+                (forward-char 1)))
+          (setq muse-publishing-last-position pos)))
+      (setq rules (cdr rules)
+            base (+ base (point-max))))
+    (if (and verbose (not muse-batch-publishing-p))
+        (message "Publishing %s...done" name))))
+
+(defun muse-insert-file-or-string (file-or-string &optional title)
+  (let ((beg (point)) end)
+    (if (and (not (string-equal file-or-string ""))
+             (not (string-match "\n" file-or-string))
+             (file-readable-p file-or-string))
+        (setq end (+ beg
+                     (cadr (muse-insert-file-contents file-or-string))))
+      (insert file-or-string)
+      (setq end (point)))
+    (save-restriction
+      (narrow-to-region beg end)
+      (remove-text-properties (point-min) (point-max)
+                              '(read-only nil rear-nonsticky nil))
+      (goto-char (point-min))
+      (let ((muse-inhibit-style-tags t)
+            (muse-publish-use-header-footer-tags t))
+        (muse-publish-markup (or title "")
+                             '((100 muse-tag-regexp 0
+                                    muse-publish-markup-tag)))))))
+
+(defun muse-style-run-hooks (keyword style &rest args)
+  (catch 'handled
+    (let ((cache nil))
+      (while (and style
+                  (setq style (muse-style style)))
+        (let ((func (muse-style-element keyword style t)))
+          (when (and func
+                     (not (member func cache)))
+            (setq cache (cons func cache))
+            (when (apply func args)
+              (throw 'handled t))))
+        (setq style (muse-style-element :base style))))))
+
+(defun muse-publish-markup-region (beg end &optional title style)
+  "Apply the given STYLE's markup rules to the given region.
+TITLE is used when indicating the publishing progress; it may be nil.
+
+The point is guaranteed to be at END if the routine terminates
+normally."
+  (unless title (setq title ""))
+  (unless style
+    (or (setq style muse-publishing-current-style)
+        (error "Cannot find any publishing styles to use")))
+  (save-restriction
+    (narrow-to-region beg end)
+    (let ((muse-publish-generate-contents nil))
+      (unless muse-publish-inhibit-style-hooks
+        (muse-style-run-hooks :before style))
+      (muse-publish-markup
+       title
+       (sort (copy-alist (append muse-publish-markup-regexps
+                                 (muse-style-elements-list :regexps style)))
+             (function
+              (lambda (l r)
+                (< (car l) (car r))))))
+      (unless muse-publish-inhibit-style-hooks
+        (muse-style-run-hooks :before-end style))
+      (muse-publish-escape-specials (point-min) (point-max) nil 'document))
+    (goto-char (point-max))))
+
+(defun muse-publish-markup-buffer (title style)
+  "Apply the given STYLE's markup rules to the current buffer."
+  (setq style (muse-style style))
+  (let ((style-header (muse-style-element :header style))
+        (style-footer (muse-style-element :footer style))
+        (muse-publishing-current-style style)
+        (muse-publishing-directives
+         (list (cons "title" title)
+               (cons "author" (user-full-name))
+               (cons "date" (format-time-string
+                             muse-publish-date-format
+                             (if muse-publishing-current-file
+                                 (nth 5 (file-attributes
+                                         muse-publishing-current-file))
+                               (current-time))))))
+        (muse-publishing-p t)
+        (inhibit-read-only t))
+    (run-hooks 'muse-update-values-hook)
+    (unless muse-inhibit-before-publish-hook
+      (run-hooks 'muse-before-publish-hook))
+    (muse-publish-markup-region (point-min) (point-max) title style)
+    (goto-char (point-min))
+    (when style-header
+      (muse-insert-file-or-string style-header title))
+    (goto-char (point-max))
+    (when style-footer
+      (muse-insert-file-or-string style-footer title))
+    (muse-style-run-hooks :after style)
+    (run-hooks 'muse-after-publish-hook)))
+
+(defun muse-publish-markup-string (string &optional style)
+  "Markup STRING using the given STYLE's markup rules."
+  (setq style (muse-style style))
+  (muse-with-temp-buffer
+    (insert string)
+    (let ((muse-publishing-current-style style)
+          (muse-publishing-p t))
+      (muse-publish-markup "*string*" (muse-style-element :rules style)))
+    (buffer-string)))
+
+;; Commands for publishing files
+
+(defun muse-publish-get-style (&optional styles)
+  (unless styles (setq styles muse-publishing-styles))
+  (if (= 1 (length styles))
+      (car styles)
+    (when (catch 'different
+            (let ((first (car (car styles))))
+              (dolist (style (cdr styles))
+                (unless (equal first (car style))
+                  (throw 'different t)))))
+      (setq styles (muse-collect-alist
+                    styles
+                    (funcall muse-completing-read-function
+                             "Publish with style: " styles nil t))))
+    (if (or (= 1 (length styles))
+            (not (muse-get-keyword :path (car styles))))
+        (car styles)
+      (setq styles (mapcar (lambda (style)
+                             (cons (muse-get-keyword :path style)
+                                   style))
+                           styles))
+      (cdr (assoc (funcall muse-completing-read-function
+                           "Publish to directory: " styles nil t)
+                  styles)))))
+
+(defsubst muse-publish-get-output-dir (style)
+  (let ((default-directory (or (muse-style-element :path style)
+                               default-directory)))
+    (muse-read-directory-name "Publish to directory: " nil default-directory)))
+
+(defsubst muse-publish-get-info ()
+  (let ((style (muse-publish-get-style)))
+    (list style (muse-publish-get-output-dir style)
+          current-prefix-arg)))
+
+(defsubst muse-publish-output-name (&optional file style)
+  (setq style (muse-style style))
+  (concat (muse-style-element :prefix style)
+          (muse-page-name file)
+          (muse-style-element :suffix style)))
+
+(defsubst muse-publish-output-file (file &optional output-dir style)
+  (setq style (muse-style style))
+  (if output-dir
+      (expand-file-name (muse-publish-output-name file style) output-dir)
+    (concat (file-name-directory file)
+            (muse-publish-output-name file style))))
+
+(defsubst muse-publish-link-name (&optional file style)
+  "Take FILE and add :prefix and either :link-suffix or :suffix from STYLE.
+We assume that FILE is a Muse file.
+
+We call `muse-page-name' on FILE to remove the directory part of
+FILE and any extensions that are in `muse-ignored-extensions'."
+  (setq style (muse-style style))
+  (concat (muse-style-element :prefix style)
+          (muse-page-name file)
+          (or (muse-style-element :link-suffix style)
+              (muse-style-element :suffix style))))
+
+(defsubst muse-publish-link-file (file &optional style)
+  "Turn FILE into a URL.
+
+If FILE exists on the system as-is, return it without
+modification.  In the case of wanting to link to Muse files when
+`muse-file-extension' is nil, you should load muse-project.el.
+
+Otherwise, assume that it is a Muse file and call
+`muse-publish-link-name' to add :prefix, :link-suffix, :suffix,
+and removing ignored file extensions, but preserving the
+directory part of FILE."
+  (setq style (muse-style style))
+  (if (file-exists-p file)
+      file
+    (concat (file-name-directory file)
+            (muse-publish-link-name file style))))
+
+(defsubst muse-publish-link-page (page)
+  "Turn PAGE into a URL.
+
+This is called by `muse-publish-classify-url' to figure out what
+a link to another file or Muse page should look like.
+
+If muse-project.el is loaded, call `muse-project-link-page' for this.
+Otherwise, call `muse-publish-link-file'."
+  (if (fboundp 'muse-project-link-page)
+      (muse-project-link-page page)
+    (muse-publish-link-file page)))
+
+(defmacro muse-publish-ensure-block (beg &optional end)
+  "Ensure that block-level markup at BEG is published with at least one
+preceding blank line.  BEG must be an unquoted symbol that contains a
+position or marker.  BEG is modified to be the new position.
+The point is left at the new value of BEG.
+
+Additionally, make sure that BEG is placed on a blank line.
+
+If END is given, make sure that it is placed on a blank line.  In
+order to achieve this, END must be an unquoted symbol that
+contains a marker.  This is the case with Muse tag functions."
+  `(progn
+     (goto-char ,beg)
+     (cond ((not (bolp)) (insert "\n\n"))
+           ((eq (point) (point-min)) nil)
+           ((prog2 (backward-char) (bolp) (forward-char)) nil)
+           (t (insert "\n")))
+     (unless (and (bolp) (eolp))
+       (insert "\n")
+       (backward-char))
+     (setq ,beg (point))
+     (when (markerp ,end)
+       (goto-char ,end)
+       (unless (and (bolp) (eolp))
+         (insert-before-markers "\n")))
+     (goto-char ,beg)))
+
+;;;###autoload
+(defun muse-publish-region (beg end &optional title style)
+  "Apply the given STYLE's markup rules to the given region.
+The result is placed in a new buffer that includes TITLE in its name."
+  (interactive "r")
+  (when (interactive-p)
+    (unless title (setq title (read-string "Title: ")))
+    (unless style (setq style (muse-publish-get-style))))
+  (let ((text (buffer-substring beg end))
+        (buf (generate-new-buffer (concat "*Muse: " title "*"))))
+    (with-current-buffer buf
+      (insert text)
+      (muse-publish-markup-buffer title style)
+      (goto-char (point-min))
+      (let ((inhibit-read-only t))
+        (remove-text-properties (point-min) (point-max)
+                                '(rear-nonsticky nil read-only nil))))
+    (pop-to-buffer buf)))
+
+;;;###autoload
+(defun muse-publish-file (file style &optional output-dir force)
+  "Publish the given FILE in a particular STYLE to OUTPUT-DIR.
+If the argument FORCE is nil, each file is only published if it is
+newer than the published version.  If the argument FORCE is non-nil,
+the file is published no matter what."
+  (interactive (cons (read-file-name "Publish file: ")
+                     (muse-publish-get-info)))
+  (let ((style-name style))
+    (setq style (muse-style style))
+    (unless style
+      (error "There is no style '%s' defined" style-name)))
+  (let* ((output-path (muse-publish-output-file file output-dir style))
+         (output-suffix (muse-style-element :osuffix style))
+         (muse-publishing-current-file file)
+         (muse-publishing-current-output-path output-path)
+         (target (if output-suffix
+                     (concat (muse-path-sans-extension output-path)
+                             output-suffix)
+                   output-path))
+         (threshhold (nth 7 (file-attributes file))))
+    (if (not threshhold)
+        (message "Please save %s before publishing" file)
+      (when (or force (file-newer-than-file-p file target))
+        (if (and muse-publish-report-threshhold
+                 (> threshhold
+                    muse-publish-report-threshhold))
+            (message "Publishing %s ..." file))
+        (muse-with-temp-buffer
+          (muse-insert-file-contents file)
+          (run-hooks 'muse-before-publish-hook)
+          (when muse-publish-enable-local-variables
+            (hack-local-variables))
+          (let ((muse-inhibit-before-publish-hook t))
+            (muse-publish-markup-buffer (muse-page-name file) style))
+          (when (muse-write-file output-path)
+            (muse-style-run-hooks :final style file output-path target)))
+        t))))
+
+;;;###autoload
+(defun muse-publish-this-file (style output-dir &optional force)
+  "Publish the currently-visited file.
+Prompt for both the STYLE and OUTPUT-DIR if they are not
+supplied."
+  (interactive (muse-publish-get-info))
+  (setq style (muse-style style))
+  (if buffer-file-name
+      (let ((muse-current-output-style (list :base (car style)
+                                             :path output-dir)))
+        (unless (muse-publish-file buffer-file-name style output-dir force)
+          (message (concat "The published version is up-to-date; use"
+                           " C-u C-c C-T to force an update."))))
+    (message "This buffer is not associated with any file")))
+
+(defun muse-batch-publish-files ()
+  "Publish Muse files in batch mode."
+  (let ((muse-batch-publishing-p t)
+        (font-lock-verbose nil)
+        muse-current-output-style
+        style output-dir)
+    ;; don't activate VC when publishing files
+    (setq vc-handled-backends nil)
+    (setq style (car command-line-args-left)
+          command-line-args-left (cdr command-line-args-left)
+          output-dir (car command-line-args-left)
+          output-dir
+          (if (string-match "\\`--output-dir=" output-dir)
+              (prog1
+                  (substring output-dir (match-end 0))
+                (setq command-line-args-left (cdr command-line-args-left))))
+          muse-current-output-style (list :base style :path output-dir))
+    (setq auto-mode-alist
+          (delete (cons (concat "\\." muse-file-extension "\\'")
+                        'muse-mode-choose-mode)
+                  auto-mode-alist))
+    (dolist (file command-line-args-left)
+      (muse-publish-file file style output-dir t))))
+
+;; Default publishing rules
+
+(defun muse-publish-section-close (depth)
+  "Seach forward for the closing tag of given DEPTH."
+  (let (not-end)
+    (save-excursion
+      (while (and (setq not-end (re-search-forward
+                                 (concat "^\\*\\{1," (number-to-string depth)
+                                         "\\}\\s-+")
+                                 nil t))
+                  (get-text-property (match-beginning 0) 'read-only)))
+      (if not-end
+          (forward-line 0)
+        (goto-char (point-max)))
+      (cond ((not (eq (char-before) ?\n))
+             (insert "\n\n"))
+            ((not (eq (char-before (1- (point))) ?\n))
+             (insert "\n")))
+      (muse-insert-markup (muse-markup-text 'section-close depth))
+      (insert "\n"))))
+
+(defun muse-publish-markup-directive (&optional name value)
+  (unless name (setq name (match-string 1)))
+  (unless value (setq value (match-string 2)))
+  (let ((elem (assoc name muse-publishing-directives)))
+    (if elem
+        (setcdr elem value)
+      (setq muse-publishing-directives
+            (cons (cons name value)
+                  muse-publishing-directives))))
+  ;; Make sure we don't ever try to move the point forward (past the
+  ;; beginning of buffer) while we're still searching for directives.
+  (setq muse-publishing-last-position nil)
+  (delete-region (match-beginning 0) (match-end 0)))
+
+(defsubst muse-publishing-directive (name)
+  (cdr (assoc name muse-publishing-directives)))
+
+(defmacro muse-publish-get-and-delete-attr (attr attrs)
+  "Delete attribute ATTR from ATTRS only once, destructively.
+
+This function returns the matching attribute value, if found."
+  (let ((last (make-symbol "last"))
+        (found (make-symbol "found"))
+        (vals (make-symbol "vals")))
+    `(let ((,vals ,attrs))
+       (if (string= (caar ,vals) ,attr)
+           (prog1 (cdar ,vals)
+             (setq ,attrs (cdr ,vals)))
+         (let ((,last ,vals)
+               (,found nil))
+           (while ,vals
+             (setq ,vals (cdr ,vals))
+             (when (string= (caar ,vals) ,attr)
+               (setq ,found (cdar ,vals))
+               (setcdr ,last (cdr ,vals))
+               (setq ,vals nil))
+             (setq ,last ,vals))
+           ,found)))))
+
+(defun muse-publish-markup-anchor ()
+  (unless (get-text-property (match-end 1) 'muse-link)
+    (let ((text (muse-markup-text 'anchor (match-string 2))))
+      (unless (string= text "")
+        (save-match-data
+          (skip-chars-forward (concat muse-regexp-blank "\n"))
+          (muse-insert-markup text)))
+      (match-string 1))))
+
+(defun muse-publish-markup-comment ()
+  (if (null muse-publish-comments-p)
+      ""
+    (goto-char (match-end 0))
+    (muse-insert-markup (muse-markup-text 'comment-end))
+    (if (match-beginning 1)
+        (progn
+          (muse-publish-mark-read-only (match-beginning 1) (match-end 1))
+          (delete-region (match-beginning 0) (match-beginning 1)))
+      (delete-region (match-beginning 0) (match-end 0)))
+    (goto-char (match-beginning 0))
+    (muse-insert-markup (muse-markup-text 'comment-begin))))
+
+(defun muse-publish-markup-tag ()
+  (let ((tag-info (muse-markup-tag-info (match-string 1))))
+    (when (and tag-info
+               (not (get-text-property (match-beginning 0) 'read-only))
+               (nth 4 tag-info)
+               (or muse-publish-enable-dangerous-tags
+                   (not (get (nth 4 tag-info) 'muse-dangerous-tag))))
+      (let ((closed-tag (match-string 3))
+            (start (match-beginning 0))
+            (beg (point))
+            end attrs)
+        (when (nth 2 tag-info)
+          (let ((attrstr (match-string 2)))
+            (while (and attrstr
+                        (string-match (concat "\\([^"
+                                              muse-regexp-blank
+                                              "=\n]+\\)\\(=\"\\"
+                                              "([^\"]+\\)\"\\)?")
+                                      attrstr))
+              (let ((attr (cons (downcase
+                                 (muse-match-string-no-properties 1 attrstr))
+                                (muse-match-string-no-properties 3 attrstr))))
+                (setq attrstr (replace-match "" t t attrstr))
+                (if attrs
+                    (nconc attrs (list attr))
+                  (setq attrs (list attr)))))))
+        (if (and (cadr tag-info) (not closed-tag))
+            (if (muse-goto-tag-end (car tag-info) (nth 3 tag-info))
+                (delete-region (match-beginning 0) (point))
+              (setq tag-info nil)))
+        (when tag-info
+          (setq end (point-marker))
+          (delete-region start beg)
+          (goto-char start)
+          (let ((args (list start end)))
+            (if (nth 2 tag-info)
+                (nconc args (list attrs)))
+            (let ((muse-inhibit-style-tags nil))
+              ;; remove the inhibition
+              (apply (nth 4 tag-info) args)))
+          (set-marker end nil)))))
+  nil)
+
+(defun muse-publish-escape-specials (beg end &optional ignore-read-only context)
+  "Escape specials from BEG to END using style-specific :specials.
+If IGNORE-READ-ONLY is non-nil, ignore the read-only property.
+CONTEXT is used to figure out what kind of specials to escape.
+
+The following contexts exist in Muse.
+'underline  _underlined text_
+'literal    =monospaced text= or <code> region (monospaced, escaped)
+'emphasis   *emphasized text*
+'email      email@example.com
+'url        http://example.com
+'url-desc   [[...][description of an explicit link]]
+'image      [[image.png]]
+'example    <example> region (monospaced, block context, escaped)
+'verbatim   <verbatim> region (escaped)
+'footnote   footnote text
+'document   normal text"
+  (let ((specials (muse-style-element :specials nil t)))
+    (cond ((functionp specials)
+           (setq specials (funcall specials context)))
+          ((symbolp specials)
+           (setq specials (symbol-value specials))))
+    (if (functionp specials)
+        (funcall specials beg end ignore-read-only)
+      (save-excursion
+        (save-restriction
+        (narrow-to-region beg end)
+        (goto-char (point-min))
+        (while (< (point) (point-max))
+          (if (and (not ignore-read-only)
+                   (get-text-property (point) 'read-only))
+              (goto-char (or (next-single-property-change (point) 'read-only)
+                             (point-max)))
+            (let ((repl (or (assoc (char-after) specials)
+                            (assoc (char-after)
+                                   muse-publish-markup-specials))))
+              (if (null repl)
+                  (forward-char 1)
+                (delete-char 1)
+                (insert-before-markers (cdr repl)))))))))))
+
+(defun muse-publish-markup-word ()
+  (let* ((beg (match-beginning 2))
+         (end (1- (match-end 2)))
+         (leader (buffer-substring-no-properties beg end))
+         open-tag close-tag mark-read-only loc context)
+    (cond
+     ((string= leader "_")
+      (setq context 'underline
+            open-tag (muse-markup-text 'begin-underline)
+            close-tag (muse-markup-text 'end-underline)))
+     ((string= leader "=")
+      (setq context 'literal
+            open-tag (muse-markup-text 'begin-literal)
+            close-tag (muse-markup-text 'end-literal))
+      (setq mark-read-only t))
+     (t
+      (let ((l (length leader)))
+        (setq context 'emphasis)
+        (cond
+         ((= l 1) (setq open-tag (muse-markup-text 'begin-emph)
+                        close-tag (muse-markup-text 'end-emph)))
+         ((= l 2) (setq open-tag (muse-markup-text 'begin-more-emph)
+                        close-tag (muse-markup-text 'end-more-emph)))
+         ((= l 3) (setq open-tag (muse-markup-text 'begin-most-emph)
+                        close-tag (muse-markup-text 'end-most-emph)))
+         (t (setq context nil))))))
+    (if (and context
+             (not (get-text-property beg 'muse-link))
+             (setq loc (search-forward leader nil t))
+             (or (eobp) (not (eq (char-syntax (char-after loc)) ?w)))
+             (not (eq (char-syntax (char-before (point))) ?\ ))
+             (not (get-text-property (point) 'muse-link)))
+        (progn
+          (replace-match "")
+          (delete-region beg end)
+          (setq end (point-marker))
+          (muse-insert-markup close-tag)
+          (goto-char beg)
+          (muse-insert-markup open-tag)
+          (setq beg (point))
+          (when mark-read-only
+            (muse-publish-escape-specials beg end t context)
+            (muse-publish-mark-read-only beg end))
+          (set-marker end nil))
+      (backward-char))
+    nil))
+
+(defun muse-publish-markup-emdash ()
+  (unless (get-text-property (match-beginning 0) 'muse-link)
+    (let ((prespace (match-string 1))
+          (postspace (match-string 2)))
+      (delete-region (match-beginning 0) (match-end 0))
+      (muse-insert-markup (muse-markup-text 'emdash prespace postspace))
+      (when (eq (char-after) ?\<)
+        (insert ?\n)))))
+
+(defun muse-publish-markup-enddots ()
+  (unless (get-text-property (match-beginning 0) 'muse-link)
+    (delete-region (match-beginning 0) (match-end 0))
+    (muse-insert-markup (muse-markup-text 'enddots))))
+
+(defun muse-publish-markup-dots ()
+  (unless (get-text-property (match-beginning 0) 'muse-link)
+    (delete-region (match-beginning 0) (match-end 0))
+    (muse-insert-markup (muse-markup-text 'dots))))
+
+(defun muse-publish-markup-rule ()
+  (unless (get-text-property (match-beginning 0) 'muse-link)
+    (delete-region (match-beginning 0) (match-end 0))
+    (muse-insert-markup (muse-markup-text 'rule))))
+
+(defun muse-publish-markup-no-break-space ()
+  (unless (get-text-property (match-beginning 0) 'muse-link)
+    (delete-region (match-beginning 0) (match-end 0))
+    (muse-insert-markup (muse-markup-text 'no-break-space))))
+
+(defun muse-publish-markup-heading ()
+  (let* ((len (length (match-string 1)))
+         (start (muse-markup-text
+                 (cond ((= len 1) 'section)
+                       ((= len 2) 'subsection)
+                       ((= len 3) 'subsubsection)
+                       (t 'section-other))
+                 len))
+         (end   (muse-markup-text
+                 (cond ((= len 1) 'section-end)
+                       ((= len 2) 'subsection-end)
+                       ((= len 3) 'subsubsection-end)
+                       (t 'section-other-end))
+                 len)))
+    (delete-region (match-beginning 0) (match-end 0))
+    (muse-insert-markup start)
+    (end-of-line)
+    (when end
+      (muse-insert-markup end))
+    (forward-line 1)
+    (unless (eq (char-after) ?\n)
+      (insert "\n"))
+    (muse-publish-section-close len)))
+
+(defvar muse-publish-footnotes nil)
+
+(defun muse-publish-markup-footnote ()
+  "Scan ahead and snarf up the footnote body."
+  (cond
+   ((get-text-property (match-beginning 0) 'muse-link)
+    nil)
+   ((= (muse-line-beginning-position) (match-beginning 0))
+    "")
+   (t
+    (let ((footnote (save-match-data
+                      (string-to-number (match-string 1))))
+          (oldtext (match-string 0))
+          footnotemark)
+      (delete-region (match-beginning 0) (match-end 0))
+      (save-excursion
+        (when (re-search-forward (format "^\\[%d\\]\\s-+" footnote) nil t)
+          (let* ((start (match-beginning 0))
+                 (beg (goto-char (match-end 0)))
+                 (end (save-excursion
+                        (if (search-forward "\n\n" nil t)
+                            (copy-marker (match-beginning 0))
+                          (goto-char (point-max))
+                          (skip-chars-backward "\n")
+                          (point-marker)))))
+            (while (re-search-forward
+                    (concat "^[" muse-regexp-blank "]+\\([^\n]\\)")
+                    end t)
+              (replace-match "\\1" t))
+            (let ((footnotemark-cmd (muse-markup-text 'footnotemark))
+                  (footnotemark-end-cmd (muse-markup-text 'footnotemark-end)))
+              (if (string= "" footnotemark-cmd)
+                  (setq footnotemark
+                        (concat (muse-markup-text 'footnote)
+                                (muse-publish-escape-specials-in-string
+                                 (buffer-substring-no-properties beg end)
+                                 'footnote)
+                                (muse-markup-text 'footnote-end)))
+                (setq footnotemark (format footnotemark-cmd footnote
+                                           footnotemark-end-cmd))
+                (unless muse-publish-footnotes
+                  (set (make-local-variable 'muse-publish-footnotes)
+                       (make-vector 256 nil)))
+                (unless (aref muse-publish-footnotes footnote)
+                  (setq footnotemark
+                        (concat
+                         footnotemark
+                         (concat (format (muse-markup-text 'footnotetext)
+                                         footnote)
+                                 (buffer-substring-no-properties beg end)
+                                 (muse-markup-text 'footnotetext-end))))
+                  (aset muse-publish-footnotes footnote footnotemark))))
+            (goto-char end)
+            (skip-chars-forward "\n")
+            (delete-region start (point))
+            (set-marker end nil))))
+      (if footnotemark
+          (muse-insert-markup footnotemark)
+        (insert oldtext))))))
+
+(defun muse-publish-markup-fn-sep ()
+  (delete-region (match-beginning 0) (match-end 0))
+  (muse-insert-markup (muse-markup-text 'fn-sep)))
+
+(defun muse-insert-markup-end-list (&rest args)
+  (let ((beg (point)))
+    (apply 'insert args)
+    (add-text-properties beg (point) '(muse-end-list t))
+    (muse-publish-mark-read-only beg (point))))
+
+(defun muse-publish-determine-dl-indent (continue indent-sym determine-sym)
+  ;; If the caller doesn't know how much indentation to use, figure it
+  ;; out ourselves.  It is assumed that `muse-forward-list-item' has
+  ;; been called just before this to set the match data.
+  (when (and continue
+             (symbol-value determine-sym))
+    (save-match-data
+      ;; snarf all leading whitespace
+      (let ((indent (and (match-beginning 2)
+                         (buffer-substring (match-beginning 1)
+                                           (match-beginning 2)))))
+        (when (and indent
+                   (not (string= indent "")))
+          (set indent-sym indent)
+          (set determine-sym nil))))))
+
+(defun muse-publish-surround-dl (indent post-indent)
+  (let* ((beg-item (muse-markup-text 'begin-dl-item))
+         (end-item (muse-markup-text 'end-dl-item))
+         (beg-ddt (muse-markup-text 'begin-ddt)) ;; term
+         (end-ddt (muse-markup-text 'end-ddt))
+         (beg-dde (muse-markup-text 'begin-dde)) ;; definition
+         (end-dde (muse-markup-text 'end-dde))
+         (continue t)
+         (no-terms t)
+         beg)
+    (while continue
+      ;; envelope this as one term+definitions unit -- HTML does not
+      ;; need this, but DocBook and Muse's custom XML format do
+      (muse-insert-markup beg-item)
+      (when (looking-at muse-dl-term-regexp)
+        ;; find the term and wrap it with published markup
+        (setq beg (point)
+              no-terms nil)
+        (goto-char (match-end 1))
+        (delete-region (point) (match-end 0))
+        (muse-insert-markup-end-list end-ddt)
+        ;; if definition is immediately after term, move to next line
+        (unless (eq (char-after) ?\n)
+          (insert ?\n))
+        (save-excursion
+          (goto-char beg)
+          (delete-region (point) (match-beginning 1))
+          (muse-insert-markup beg-ddt)))
+      ;; handle pathological edge case where there is no term -- I
+      ;; would prefer to just disallow this, but people seem to want
+      ;; this behavior
+      (when (and no-terms
+                 (looking-at (concat "[" muse-regexp-blank "]*::"
+                                     "[" muse-regexp-blank "]*")))
+        (delete-region (point) (match-end 0))
+        ;; but only do this once
+        (setq no-terms nil))
+      (setq beg (point)
+            ;; move past current item
+            continue (muse-forward-list-item 'dl-term indent))
+      (save-restriction
+        (narrow-to-region beg (point))
+        (goto-char (point-min))
+        ;; publish each definition that we find, defaulting to an
+        ;; empty definition if none are found
+        (muse-publish-surround-text beg-dde end-dde
+         (lambda (indent)
+           (muse-forward-list-item 'dl-entry indent))
+         indent post-indent
+         #'muse-publish-determine-dl-indent)
+        (goto-char (point-max))
+        (skip-chars-backward (concat muse-regexp-blank "\n"))
+        (muse-insert-markup-end-list end-item)
+        (when continue
+          (goto-char (point-max)))))))
+
+(defun muse-publish-strip-list-indentation (list-item empty-line indent post-indent)
+  (let ((list-nested nil)
+        (indent-found nil))
+    (while (< (point) (point-max))
+      (when (and (looking-at list-item)
+                 (not (or (get-text-property
+                           (muse-list-item-critical-point) 'read-only)
+                          (get-text-property
+                           (muse-list-item-critical-point) 'muse-link))))
+        ;; if we encounter a list item, allow no post-indent space
+        (setq list-nested t))
+      (when (and (not (looking-at empty-line))
+                 (looking-at (concat indent "\\("
+                                     (or (and list-nested "")
+                                         post-indent)
+                                     "\\)")))
+        ;; if list is not nested, remove indentation
+        (unless indent-found
+          (setq post-indent (match-string 1)
+                indent-found t))
+        (replace-match ""))
+      (forward-line 1))))
+
+(defun muse-publish-surround-text (beg-tag end-tag move-func &optional indent post-indent determine-indent-func list-item)
+  (unless list-item
+    (setq list-item (format muse-list-item-regexp
+                            (concat "[" muse-regexp-blank "]*"))))
+  (let ((continue t)
+        (empty-line (concat "^[" muse-regexp-blank "]*\n"))
+        (determine-indent (if determine-indent-func t nil))
+        (new-indent indent)
+        (first t)
+        beg)
+    (unless indent
+      (setq indent (concat "[" muse-regexp-blank "]+")))
+    (if post-indent
+        (setq post-indent (concat " \\{0," (number-to-string post-indent)
+                                  "\\}"))
+      (setq post-indent ""))
+    (while continue
+      (if (or (not end-tag) (string= end-tag ""))
+          ;; if no end of list item markup exists, treat the beginning
+          ;; of list item markup as it if it were the end -- this
+          ;; prevents multiple-level lists from being confused
+          (muse-insert-markup-end-list beg-tag)
+        (muse-insert-markup beg-tag))
+      (setq beg (point)
+            ;; move past current item; continue is non-nil if there
+            ;; are more like items to be processed
+            continue (if (and determine-indent-func first)
+                         (funcall move-func (concat indent post-indent))
+                       (funcall move-func indent)))
+      (when determine-indent-func
+        (funcall determine-indent-func continue 'new-indent 'determine-indent))
+      (when continue
+          ;; remove list markup if we encountered another item of the
+          ;; same type
+          (replace-match "" t t nil 1))
+      (save-restriction
+        ;; narrow to current item
+        (narrow-to-region beg (point))
+        (goto-char (point-min))
+        (if (looking-at empty-line)
+            ;; if initial line is blank, move to first non-blank line
+            (while (progn (forward-line 1)
+                          (and (< (point) (point-max))
+                               (looking-at empty-line))))
+          ;; otherwise, move to second line of text
+          (forward-line 1))
+        ;; strip list indentation
+        (muse-publish-strip-list-indentation list-item empty-line
+                                             indent post-indent)
+        (skip-chars-backward (concat muse-regexp-blank "\n"))
+        (muse-insert-markup-end-list end-tag)
+        (when determine-indent-func
+          (setq indent new-indent))
+        (when first
+          (setq first nil))
+        (when continue
+          (goto-char (point-max)))))))
+
+(defun muse-publish-ensure-blank-line ()
+  "Make sure that a blank line exists on the line before point."
+  (let ((pt (point-marker)))
+    (beginning-of-line)
+    (cond ((eq (point) (point-min)) nil)
+          ((prog2 (backward-char) (bolp) (forward-char)) nil)
+          (t (insert-before-markers "\n")))
+    (goto-char pt)
+    (set-marker pt nil)))
+
+(defun muse-publish-markup-list ()
+  "Markup a list entry.
+This function works by marking up items of the same list level
+and type, respecting the end-of-list property."
+  (let* ((str (match-string 1))
+         (type (muse-list-item-type str))
+         (indent (buffer-substring (muse-line-beginning-position)
+                                   (match-beginning 1)))
+         (post-indent (length str)))
+    (cond
+     ((or (get-text-property (muse-list-item-critical-point) 'read-only)
+          (get-text-property (muse-list-item-critical-point) 'muse-link))
+      nil)
+     ((eq type 'ul)
+      (unless (eq (char-after (match-end 1)) ?-)
+        (delete-region (match-beginning 0) (match-end 0))
+        (muse-publish-ensure-blank-line)
+        (muse-insert-markup (muse-markup-text 'begin-uli))
+        (save-excursion
+          (muse-publish-surround-text
+           (muse-markup-text 'begin-uli-item)
+           (muse-markup-text 'end-uli-item)
+           (lambda (indent)
+             (muse-forward-list-item 'ul indent))
+           indent post-indent)
+          (muse-insert-markup-end-list (muse-markup-text 'end-uli)))
+        (forward-line 1)))
+     ((eq type 'ol)
+      (delete-region (match-beginning 0) (match-end 0))
+      (muse-publish-ensure-blank-line)
+      (muse-insert-markup (muse-markup-text 'begin-oli))
+      (save-excursion
+        (muse-publish-surround-text
+         (muse-markup-text 'begin-oli-item)
+         (muse-markup-text 'end-oli-item)
+         (lambda (indent)
+           (muse-forward-list-item 'ol indent))
+         indent post-indent)
+        (muse-insert-markup-end-list (muse-markup-text 'end-oli)))
+      (forward-line 1))
+     (t
+      (goto-char (match-beginning 0))
+      (muse-publish-ensure-blank-line)
+      (muse-insert-markup (muse-markup-text 'begin-dl))
+      (save-excursion
+        (muse-publish-surround-dl indent post-indent)
+        (muse-insert-markup-end-list (muse-markup-text 'end-dl)))
+      (forward-line 1))))
+  nil)
+
+(defun muse-publish-markup-quote ()
+  "Markup a quoted paragraph.
+The reason this function is so funky, is to prevent text properties
+like read-only from being inadvertently deleted."
+  (let* ((ws (match-string 1))
+         (centered (>= (string-width ws) 6))
+         (begin-elem (if centered 'begin-center 'begin-quote-item))
+         (end-elem (if centered 'end-center 'end-quote-item)))
+    (replace-match "" t t nil 1)
+    (unless centered
+      (muse-insert-markup (muse-markup-text 'begin-quote)))
+    (muse-publish-surround-text (muse-markup-text begin-elem)
+                                (muse-markup-text end-elem)
+                                (function (lambda (indent)
+                                            (muse-forward-paragraph)
+                                            nil)))
+    (unless centered
+      (muse-insert-markup (muse-markup-text 'end-quote)))))
+
+(defun muse-publish-markup-leading-space (markup-space multiple)
+  (let (count)
+    (when (and markup-space
+               (>= (setq count (skip-chars-forward " ")) 0))
+      (delete-region (muse-line-beginning-position) (point))
+      (while (> count 0)
+        (muse-insert-markup markup-space)
+        (setq count (- count multiple))))))
+
+(defun muse-publish-markup-verse ()
+  (let ((leader (match-string 0)))
+    (goto-char (match-beginning 0))
+    (muse-insert-markup (muse-markup-text 'begin-verse))
+    (while (looking-at leader)
+      (replace-match "")
+      (muse-publish-markup-leading-space (muse-markup-text 'verse-space) 2)
+      (let ((beg (point)))
+        (end-of-line)
+        (cond
+         ((bolp)
+          (let ((text (muse-markup-text 'empty-verse-line)))
+            (when text (muse-insert-markup text))))
+         ((save-excursion
+            (save-match-data
+              (forward-line 1)
+              (or (looking-at (concat leader "["
+                                      muse-regexp-blank
+                                      "]*$"))
+                  (not (looking-at leader)))))
+          (let ((begin-text (muse-markup-text 'begin-last-stanza-line))
+                (end-text (muse-markup-text 'end-last-stanza-line)))
+            (when end-text (muse-insert-markup end-text))
+            (goto-char beg)
+            (when begin-text (muse-insert-markup begin-text))
+            (end-of-line)))
+         (t
+          (let ((begin-text (muse-markup-text 'begin-verse-line))
+                (end-text (muse-markup-text 'end-verse-line)))
+            (when end-text (muse-insert-markup end-text))
+            (goto-char beg)
+            (when begin-text (muse-insert-markup begin-text))
+            (end-of-line))))
+        (forward-line 1))))
+  (muse-insert-markup (muse-markup-text 'end-verse))
+  (insert ?\n))
+
+(defun muse-publish-trim-table (table)
+  "Remove completely blank columns from table, if at start or end of row."
+  ;; remove first
+  (catch 'found
+    (dolist (row (cdr table))
+      (let ((el (cadr row)))
+        (when (and (stringp el) (not (string= el "")))
+          (throw 'found t))))
+    (dolist (row (cdr table))
+      (setcdr row (cddr row)))
+    (setcar table (1- (car table))))
+  ;; remove last
+  (catch 'found
+    (dolist (row (cdr table))
+      (let ((el (car (last row))))
+        (when (and (stringp el) (not (string= el "")))
+          (throw 'found t))))
+    (dolist (row (cdr table))
+      (setcdr (last row 2) nil))
+    (setcar table (1- (car table))))
+  table)
+
+(defun muse-publish-table-fields (beg end)
+  "Parse given region as a table, returning a cons cell.
+The car is the length of the longest row.
+
+The cdr is a list of the fields of the table, with the first
+element indicating the type of the row:
+  1: body, 2: header, 3: footer, hline: separator.
+
+The existing region will be removed, except for initial blank lines."
+  (unless (muse-publishing-directive "disable-tables")
+    (let ((longest 0)
+          (left 0)
+          (seen-hline nil)
+          fields field-list)
+      (save-restriction
+        (narrow-to-region beg end)
+        (goto-char (point-min))
+        (while (looking-at (concat "^[" muse-regexp-blank "]*$"))
+          (forward-line 1))
+        (setq beg (point))
+        (while (= left 0)
+          (cond
+           ((looking-at muse-table-hline-regexp)
+            (when field-list  ; skip if at the beginning of table
+              (if seen-hline
+                  (setq field-list (cons (cons 'hline nil) field-list))
+                (dolist (field field-list)
+                  ;; the preceding fields are header lines
+                  (setcar field 2))
+                (setq seen-hline t))))
+           ((looking-at muse-table-line-regexp)
+            (setq fields (cons (length (match-string 1))
+                               (mapcar #'muse-trim-whitespace
+                                       (split-string (match-string 0)
+                                                     muse-table-field-regexp)))
+                  field-list (cons fields field-list)
+                  longest (max (length fields) longest))
+            ;; strip initial bars, if they exist
+            (let ((first (cadr fields)))
+              (when (and first (string-match "\\`|+\\s-*" first))
+                (setcar (cdr fields) (replace-match "" t t first))))))
+          (setq left (forward-line 1))))
+      (delete-region beg end)
+      (if (= longest 0)
+          (cons 0 nil)
+        ;; if the last line was an hline, remove it
+        (when (eq (caar field-list) 'hline)
+          (setq field-list (cdr field-list)))
+        (muse-publish-trim-table (cons (1- longest) (nreverse field-list)))))))
+
+(defun muse-publish-markup-table ()
+  "Style does not support tables.\n")
+
+(defun muse-publish-table-el-table (variant)
+  "Publish table.el-style tables in the format given by VARIANT."
+  (when (condition-case nil
+            (progn (require 'table)
+                   t)
+          (error nil))
+    (let ((muse-buf (current-buffer)))
+      (save-restriction
+        (narrow-to-region (match-beginning 0) (match-end 0))
+        (goto-char (point-min))
+        (forward-line 1)
+        (when (search-forward "|" nil t)
+          (with-temp-buffer
+            (let ((temp-buf (current-buffer)))
+              (with-current-buffer muse-buf
+                (table-generate-source variant temp-buf))
+              (with-current-buffer muse-buf
+                (delete-region (point-min) (point-max))
+                (insert-buffer-substring temp-buf)
+                (muse-publish-mark-read-only (point-min) (point-max))))))))))
+
+(defun muse-publish-markup-table-el ()
+  "Mark up table.el-style tables."
+  (cond ((muse-style-derived-p 'html)
+         (muse-publish-table-el-table 'html))
+        ((muse-style-derived-p 'latex)
+         (muse-publish-table-el-table 'latex))
+        ((muse-style-derived-p 'docbook)
+         (muse-publish-table-el-table 'cals))
+        (t "Style does not support table.el tables.\n")))
+
+(defun muse-publish-escape-specials-in-string (string &optional context)
+  "Escape specials in STRING using style-specific :specials.
+CONTEXT is used to figure out what kind of specials to escape.
+
+See the documentation of the `muse-publish-escape-specials'
+function for the list of available contexts."
+  (unless string
+    (setq string ""))
+  (let ((specials (muse-style-element :specials nil t)))
+    (cond ((functionp specials)
+           (setq specials (funcall specials context)))
+          ((symbolp specials)
+           (setq specials (symbol-value specials))))
+    (if (functionp specials)
+        (funcall specials string)
+      (apply (function concat)
+             (mapcar
+              (lambda (ch)
+                (let ((repl (or (assoc ch specials)
+                                (assoc ch muse-publish-markup-specials))))
+                  (if (null repl)
+                      (char-to-string ch)
+                    (cdr repl))))
+              (append string nil))))))
+
+(defun muse-publish-markup-email ()
+  (let* ((beg (match-end 1))
+         (addr (buffer-substring-no-properties beg (match-end 0))))
+    (setq addr (muse-publish-escape-specials-in-string addr 'email))
+    (goto-char beg)
+    (delete-region beg (match-end 0))
+    (if (or (eq (char-before (match-beginning 0)) ?\")
+            (eq (char-after (match-end 0)) ?\"))
+        (insert addr)
+      (insert (format (muse-markup-text 'email-addr) addr addr)))
+    (muse-publish-mark-read-only beg (point))))
+
+(defun muse-publish-classify-url (target)
+  "Transform anchors and get published name, if TARGET is a page.
+The return value is two linked cons cells.  The car is the type
+of link, the cadr is the page name, and the cddr is the anchor."
+  (save-match-data
+    (cond ((or (null target) (string= target ""))
+           nil)
+          ((string-match "\\`[uU][rR][lL]:\\(.+\\)\\'" target)
+           (cons 'url (cons (match-string 1 target) nil)))
+          ((string-match muse-image-regexp target)
+           (cons 'image (cons target nil)))
+          ((string-match muse-url-regexp target)
+           (cons 'url (cons target nil)))
+          ((string-match muse-file-regexp target)
+           (cons 'file (cons target nil)))
+          ((string-match "#" target)
+           (if (eq (aref target 0) ?\#)
+              (cons 'anchor-ref (cons nil (substring target 1)))
+             (cons 'link-and-anchor
+                   ;; match-data is changed by
+                   ;; `muse-publish-link-page' or descendants.
+                   (cons (save-match-data
+                           (muse-publish-link-page
+                            (substring target 0 (match-beginning 0))))
+                         (substring target (match-end 0))))))
+          (t
+           (cons 'link (cons (muse-publish-link-page target) nil))))))
+
+(defun muse-publish-url-desc (desc explicit)
+  (when desc
+    (dolist (transform muse-publish-desc-transforms)
+      (setq desc (save-match-data
+                   (when desc (funcall transform desc explicit)))))
+    (setq desc (muse-link-unescape desc))
+    (muse-publish-escape-specials-in-string desc 'url-desc)))
+
+(defun muse-publish-url (url &optional desc orig-url explicit)
+  "Resolve a URL into its final <a href> form."
+  (let ((unesc-url url)
+        (unesc-orig-url orig-url)
+        (unesc-desc desc)
+        type anchor)
+    ;; Transform URL
+    (dolist (transform muse-publish-url-transforms)
+      (setq url (save-match-data (when url (funcall transform url explicit)))))
+    ;; Classify URL
+    (let ((target (muse-publish-classify-url url)))
+      (setq type (car target)
+            url (if (eq type 'image)
+                    (muse-publish-escape-specials-in-string (cadr target)
+                                                            'image)
+                  (muse-publish-escape-specials-in-string (cadr target) 'url))
+            anchor (muse-publish-escape-specials-in-string
+                    (cddr target) 'url)))
+    ;; Transform description
+    (if desc
+        (setq desc (muse-publish-url-desc desc explicit))
+      (when orig-url
+        (setq orig-url (muse-publish-url-desc orig-url explicit))))
+    ;; Act on URL classification
+    (cond ((eq type 'anchor-ref)
+           (muse-markup-text 'anchor-ref anchor (or desc orig-url)))
+          ((and unesc-desc (string-match muse-image-regexp unesc-desc))
+           (let ((ext (or (file-name-extension desc) "")))
+             (setq desc (muse-publish-escape-specials-in-string unesc-desc
+                                                                'image))
+             (setq desc (muse-path-sans-extension desc))
+             (muse-markup-text 'image-link url desc ext)))
+          ((string= url "")
+           desc)
+          ((eq type 'image)
+           (let ((ext (or (file-name-extension url) "")))
+             (setq url (muse-path-sans-extension url))
+             (if desc
+                 (muse-markup-text 'image-with-desc url ext desc)
+               (muse-markup-text 'image url ext))))
+          ((eq type 'link-and-anchor)
+           (muse-markup-text 'link-and-anchor url anchor
+                             (or desc orig-url)
+                             (muse-path-sans-extension url)))
+          ((eq type 'link)
+           (muse-markup-text 'link url (or desc orig-url)))
+          (t
+           (or (and (or desc
+                        ;; compare the not-escaped versions of url and
+                        ;; orig-url
+                        (not (string= unesc-url unesc-orig-url)))
+                    (let ((text (muse-markup-text 'url-and-desc url
+                                                  (or desc orig-url))))
+                      (and (not (string= text ""))
+                           text)))
+               (muse-markup-text 'url url (or desc orig-url)))))))
+
+(defun muse-publish-insert-url (url &optional desc orig-url explicit)
+  "Resolve a URL into its final <a href> form."
+  (delete-region (match-beginning 0) (match-end 0))
+  (let ((text (muse-publish-url url desc orig-url explicit)))
+    (when text
+      (muse-insert-markup text))))
+
+(defun muse-publish-markup-link ()
+  (let (desc explicit orig-link link)
+    (setq explicit (save-match-data
+                     (if (string-match muse-explicit-link-regexp
+                                       (match-string 0))
+                         t nil)))
+    (setq orig-link (if explicit (match-string 1) (match-string 0)))
+    (setq desc (when explicit (match-string 2)))
+    (setq link (if explicit
+                   (muse-handle-explicit-link orig-link)
+                 (muse-handle-implicit-link orig-link)))
+    (when (and link
+               (or explicit
+                   (not (or (eq (char-before (match-beginning 0)) ?\")
+                            (eq (char-after (match-end 0)) ?\")))))
+      ;; if explicit link has no user-provided description, treat it
+      ;; as if it were an implicit link
+      (when (and explicit (not desc))
+        (setq explicit nil))
+      (muse-publish-insert-url link desc orig-link explicit))))
+
+(defun muse-publish-markup-url ()
+  (unless (or (eq (char-before (match-beginning 0)) ?\")
+              (eq (char-after (match-end 0)) ?\"))
+    (let ((url (match-string 0)))
+      (muse-publish-insert-url url nil url))))
+
+;; Default publishing tags
+
+(defcustom muse-publish-contents-depth 2
+  "The number of heading levels to include with <contents> tags."
+  :type 'integer
+  :group 'muse-publish)
+
+(defun muse-publish-contents-tag (beg end attrs)
+  (set (make-local-variable 'muse-publish-generate-contents)
+       (cons (copy-marker (point) t)
+             (let ((depth (cdr (assoc "depth" attrs))))
+               (or (and depth (string-to-number depth))
+                   muse-publish-contents-depth)))))
+
+(defun muse-publish-verse-tag (beg end)
+  (muse-publish-ensure-block beg end)
+  (save-excursion
+    (save-restriction
+      (narrow-to-region beg end)
+      (goto-char (point-min))
+      (delete-char 1)
+      (while (< (point) (point-max))
+        (insert "> ")
+        (forward-line))
+      (if (eq ?\  (char-syntax (char-before)))
+          (delete-char -1)))))
+
+(defun muse-publish-mark-read-only (beg end)
+  "Add read-only properties to the given region."
+  (add-text-properties beg end '(rear-nonsticky (read-only) read-only t))
+  nil)
+
+(defun muse-publish-mark-link (&optional beg end)
+  "Indicate that the given region is a Muse link, so that other
+markup elements respect it.  If a region is not specified, use
+the 0th match data to determine it.
+
+This is usually applied to explicit links."
+  (unless beg (setq beg (match-beginning 0)))
+  (unless end (setq end (match-end 0)))
+  (add-text-properties beg end '(muse-link t))
+  nil)
+
+(defun muse-publish-quote-tag (beg end)
+  (muse-publish-ensure-block beg)
+  (save-excursion
+    (save-restriction
+      (narrow-to-region beg end)
+      (let ((quote-regexp "^\\(<\\(/?\\)quote>\\)"))
+        (muse-insert-markup (muse-markup-text 'begin-quote))
+        (while (progn
+                 (unless (looking-at (concat "[" muse-regexp-blank "\n]*"
+                                             "<quote>"))
+                   (muse-publish-surround-text
+                    (muse-markup-text 'begin-quote-item)
+                    (muse-markup-text 'end-quote-item)
+                    (function
+                     (lambda (indent)
+                       (muse-forward-paragraph)
+                       (goto-char (match-end 0))
+                       (and (< (point) (point-max))
+                            (not (looking-at quote-regexp)))))
+                    nil nil nil
+                    quote-regexp))
+                 (if (>= (point) (point-max))
+                     t
+                   (and (search-forward "<quote>" nil t)
+                        (muse-goto-tag-end "quote" t)
+                        (progn (forward-line 1) t)
+                        (< (point) (point-max))))))
+        (goto-char (point-max))
+        (muse-insert-markup (muse-markup-text 'end-quote))))))
+
+(defun muse-publish-code-tag (beg end)
+  (muse-publish-escape-specials beg end nil 'literal)
+  (goto-char beg)
+  (insert (muse-markup-text 'begin-literal))
+  (goto-char end)
+  (insert (muse-markup-text 'end-literal))
+  (muse-publish-mark-read-only beg (point)))
+
+(defun muse-publish-cite-tag (beg end attrs)
+  (let* ((type (muse-publish-get-and-delete-attr "type" attrs))
+         (citetag (cond ((string-equal type "author")
+                         'begin-cite-author)
+                        ((string-equal type "year")
+                         'begin-cite-year)
+                        (t
+                         'begin-cite))))
+    (goto-char beg)
+    (insert (muse-markup-text citetag (muse-publishing-directive "bibsource")))
+    (goto-char end)
+    (insert (muse-markup-text 'end-cite))
+    (muse-publish-mark-read-only beg (point))))
+
+(defun muse-publish-src-tag (beg end attrs)
+  (muse-publish-example-tag beg end))
+
+(defun muse-publish-example-tag (beg end)
+  (muse-publish-ensure-block beg end)
+  (muse-publish-escape-specials beg end nil 'example)
+  (goto-char beg)
+  (insert (muse-markup-text 'begin-example))
+  (goto-char end)
+  (insert (muse-markup-text 'end-example))
+  (muse-publish-mark-read-only beg (point)))
+
+(defun muse-publish-literal-tag (beg end attrs)
+  "Ensure that the text between BEG and END is not interpreted later on.
+
+ATTRS is an alist of attributes.
+
+If it contains a \"style\" element, delete the region if the
+current style is neither derived from nor equal to this style.
+
+If it contains both a \"style\" element and an \"exact\" element
+with the value \"t\", delete the region only if the current style
+is exactly this style."
+  (let* ((style (cdr (assoc "style" attrs)))
+         (exact (cdr (assoc "exact" attrs)))
+         (exactp (and (stringp exact) (string= exact "t"))))
+    (if (or (not style)
+            (and exactp (equal (muse-style style)
+                               muse-publishing-current-style))
+            (and (not exactp) (muse-style-derived-p style)))
+        (muse-publish-mark-read-only beg end)
+      (delete-region beg end)
+      (when (and (bolp) (eolp) (not (eobp)))
+        (delete-char 1)))))
+
+(put 'muse-publish-literal-tag 'muse-dangerous-tag t)
+
+(defun muse-publish-verbatim-tag (beg end)
+  (muse-publish-escape-specials beg end nil 'verbatim)
+  (muse-publish-mark-read-only beg end))
+
+(defun muse-publish-br-tag (beg end)
+  "Insert a line break."
+  (delete-region beg end)
+  (muse-insert-markup (muse-markup-text 'line-break)))
+
+(defalias 'muse-publish-class-tag 'ignore)
+(defalias 'muse-publish-div-tag 'ignore)
+
+(defun muse-publish-call-tag-on-buffer (tag &optional attrs)
+  "Transform the current buffer as if it were surrounded by the tag TAG.
+If attributes ATTRS are given, pass them to the tag function."
+  (let ((tag-info (muse-markup-tag-info tag)))
+    (when tag-info
+      (let* ((end (progn (goto-char (point-max)) (point-marker)))
+             (args (list (point-min) end))
+             (muse-inhibit-style-tags nil))
+        (when (nth 2 tag-info)
+          (nconc args (list attrs)))
+        (apply (nth 4 tag-info) args)
+        (set-marker end nil)))))
+
+(defun muse-publish-examplify-buffer (&optional attrs)
+  "Transform the current buffer as if it were an <example> region."
+  (muse-publish-call-tag-on-buffer "example" attrs))
+
+(defun muse-publish-srcify-buffer (&optional attrs)
+  "Transform the current buffer as if it were a <src> region."
+  (muse-publish-call-tag-on-buffer "src" attrs))
+
+(defun muse-publish-versify-buffer (&optional attrs)
+  "Transform the current buffer as if it were a <verse> region."
+  (muse-publish-call-tag-on-buffer "verse" attrs)
+  (muse-publish-markup ""
+                       `((100 ,(concat "^[" muse-regexp-blank "]*> ") 0
+                              muse-publish-markup-verse)))
+  (goto-char (point-min)))
+
+(defmacro muse-publish-markup-attribute (beg end attrs reinterp &rest body)
+  "Evaluate BODY within the bounds of BEG and END.
+ATTRS is an alist.  Only the \"markup\" element of ATTRS is acted
+on.
+
+If it is omitted, publish the region with the normal Muse rules.
+If RE-INTERP is specified, this is done immediately in a new
+publishing process.  Currently, RE-INTERP is specified only by
+the <include> tag.
+
+If \"nil\", do not mark up the region at all, but prevent it from
+being further interpreted by Muse.
+
+If \"example\", treat the region as if it was surrounded by the
+<example> tag.
+
+If \"src\", treat the region as if it was surrounded by the
+<src> tag.
+
+If \"verse\", treat the region as if it was surrounded by the
+<verse> tag, to preserve newlines.
+
+Otherwise, it should be the name of a function to call in the
+narrowed region after evaluating BODY.  The function should
+take the ATTRS parameter.
+
+BEG is modified to be the start of the published markup."
+  (let ((attrs-sym (make-symbol "attrs"))
+        (markup (make-symbol "markup"))
+        (markup-function (make-symbol "markup-function")))
+    `(let* ((,attrs-sym ,attrs)
+            (,markup (muse-publish-get-and-delete-attr "markup" ,attrs-sym)))
+       (save-restriction
+         (narrow-to-region ,beg ,end)
+         (goto-char (point-min))
+         ,@body
+         (if (not ,markup)
+             (when ,reinterp
+               (muse-publish-markup-region (point-min) (point-max))
+               (muse-publish-mark-read-only (point-min) (point-max))
+               (goto-char (point-max)))
+           (let ((,markup-function (read ,markup)))
+             (cond ((eq ,markup-function 'example)
+                    (setq ,markup-function #'muse-publish-examplify-buffer))
+                   ((eq ,markup-function 'src)
+                    (setq ,markup-function #'muse-publish-srcify-buffer))
+                   ((eq ,markup-function 'verse)
+                    (setq ,markup-function #'muse-publish-versify-buffer))
+                   ((and ,markup-function (not (functionp ,markup-function)))
+                    (error "Invalid markup function `%s'" ,markup))
+                   (t nil))
+             (if ,markup-function
+                 (funcall ,markup-function ,attrs-sym)
+               (muse-publish-mark-read-only (point-min) (point-max))
+               (goto-char (point-max)))))))))
+
+(put 'muse-publish-markup-attribute 'lisp-indent-function 4)
+(put 'muse-publish-markup-attribute 'edebug-form-spec
+     '(sexp sexp sexp sexp body))
+
+(defun muse-publish-lisp-tag (beg end attrs)
+  (muse-publish-markup-attribute beg end attrs nil
+    (save-excursion
+      (save-restriction
+        (let ((str (muse-eval-lisp
+                    (prog1
+                        (concat "(progn "
+                                (buffer-substring-no-properties (point-min)
+                                                                (point-max))
+                                ")")
+                      (delete-region (point-min) (point-max))
+                      (widen)))))
+          (set-text-properties 0 (length str) nil str)
+          (insert str))))))
+
+(put 'muse-publish-lisp-tag 'muse-dangerous-tag t)
+
+(defun muse-publish-command-tag (beg end attrs)
+  (muse-publish-markup-attribute beg end attrs nil
+    (while (looking-at "\\s-*$")
+      (forward-line))
+    (let ((interp (muse-publish-get-and-delete-attr "interp" attrs)))
+      (if interp
+          (shell-command-on-region (point) (point-max) interp t t)
+        (shell-command
+         (prog1
+             (buffer-substring-no-properties (point) (point-max))
+           (delete-region (point-min) (point-max)))
+         t)))
+    ;; make sure there is a newline at end
+    (goto-char (point-max))
+    (forward-line 0)
+    (unless (looking-at "\\s-*$")
+      (goto-char (point-max))
+      (insert ?\n))
+    (goto-char (point-min))))
+
+(put 'muse-publish-command-tag 'muse-dangerous-tag t)
+
+(defun muse-publish-perl-tag (beg end attrs)
+  (muse-publish-command-tag beg end
+                            (cons (cons "interp" (executable-find "perl"))
+                                  attrs)))
+
+(put 'muse-publish-perl-tag 'muse-dangerous-tag t)
+
+(defun muse-publish-php-tag (beg end attrs)
+  (muse-publish-command-tag beg end
+                            (cons (cons "interp" (executable-find "php"))
+                                  attrs)))
+
+(put 'muse-publish-php-tag 'muse-dangerous-tag t)
+
+(defun muse-publish-python-tag (beg end attrs)
+  (muse-publish-command-tag beg end
+                            (cons (cons "interp" (executable-find "python"))
+                                  attrs)))
+
+(put 'muse-publish-python-tag 'muse-dangerous-tag t)
+
+(defun muse-publish-ruby-tag (beg end attrs)
+  (muse-publish-command-tag beg end
+                            (cons (cons "interp" (executable-find "ruby"))
+                                  attrs)))
+
+(put 'muse-publish-ruby-tag 'muse-dangerous-tag t)
+
+(defun muse-publish-comment-tag (beg end)
+  (if (null muse-publish-comments-p)
+      (delete-region beg end)
+    (goto-char end)
+    (muse-insert-markup (muse-markup-text 'comment-end))
+    (muse-publish-mark-read-only beg end)
+    (goto-char beg)
+    (muse-insert-markup (muse-markup-text 'comment-begin))))
+
+(defun muse-publish-include-tag (beg end attrs)
+  "Include the named file at the current location during publishing.
+
+<include file=\"...\" markup=\"...\">
+
+The `markup' attribute controls how this file is marked up after
+being inserted.  See `muse-publish-markup-attribute' for an
+explanation of how it works."
+  (let ((filename (muse-publish-get-and-delete-attr "file" attrs))
+        (muse-publishing-directives (copy-alist muse-publishing-directives)))
+    (if filename
+        (setq filename (expand-file-name
+                        filename
+                        (file-name-directory muse-publishing-current-file)))
+      (error "No file attribute specified in <include> tag"))
+    (muse-publish-markup-attribute beg end attrs t
+      (muse-insert-file-contents filename))))
+
+(put 'muse-publish-include-tag 'muse-dangerous-tag t)
+
+(defun muse-publish-mark-up-tag (beg end attrs)
+  "Run an Emacs Lisp function on the region delimted by this tag.
+
+<markup function=\"...\" style=\"...\" exact=\"...\">
+
+The optional \"function\" attribute controls how this section is
+marked up.  If used, it should be the name of a function to call
+with the buffer narrowed to the delimited region.  Note that no
+further marking-up will be performed on this region.
+
+If \"function\" is omitted, use the standard Muse markup function.
+This is useful for marking up content in headers and footers.
+
+The optional \"style\" attribute causes the region to be deleted
+if the current style is neither derived from nor equal to this
+style.
+
+If both a \"style\" attribute and an \"exact\" attribute are
+provided, and \"exact\" is \"t\", delete the region only if the
+current style is exactly this style."
+  (let* ((style (cdr (assoc "style" attrs)))
+         (exact (cdr (assoc "exact" attrs)))
+         (exactp (and (stringp exact) (string= exact "t"))))
+    (if (or (not style)
+            (and exactp (equal (muse-style style)
+                               muse-publishing-current-style))
+            (and (not exactp) (muse-style-derived-p style)))
+        (let* ((function (cdr (assoc "function" attrs)))
+               (muse-publish-use-header-footer-tags nil)
+               (markup-function (and function (intern-soft function))))
+          (if (and markup-function (functionp markup-function))
+              (save-restriction
+                (narrow-to-region beg end)
+                (funcall markup-function)
+                (goto-char (point-max)))
+            (let ((muse-publish-inhibit-style-hooks t))
+              (muse-publish-markup-region beg end)))
+          (muse-publish-mark-read-only beg (point)))
+      (delete-region beg end))))
+
+(put 'muse-publish-mark-up-tag 'muse-dangerous-tag t)
+
+;; Miscellaneous helper functions
+
+(defun muse-publish-strip-URL (string &rest ignored)
+  "If the text \"URL:\" exists at the beginning of STRING, remove it.
+The text is removed regardless of whether and part of it is uppercase."
+  (save-match-data
+    (if (string-match "\\`[uU][rR][lL]:\\(.+\\)\\'" string)
+        (match-string 1 string)
+      string)))
+
+(defun muse-publish-markup-type (category default-func)
+  (let ((rule (muse-find-markup-element :overrides category (muse-style))))
+    (funcall (or rule default-func))))
+
+(defun muse-published-buffer-contents (buffer)
+  (with-current-buffer buffer
+    (goto-char (point-min))
+    (let ((beg (and (search-forward "Emacs Muse begins here")
+                    (muse-line-end-position)))
+          (end (and (search-forward "Emacs Muse ends here")
+                    (muse-line-beginning-position))))
+      (buffer-substring-no-properties beg end))))
+
+(defun muse-published-contents (file)
+  (when (file-readable-p file)
+    (muse-with-temp-buffer
+      (muse-insert-file-contents file)
+      (muse-published-buffer-contents (current-buffer)))))
+
+(defun muse-publish-transform-output
+  (file temp-file output-path name gen-func &rest cleanup-exts)
+  "Transform the given TEMP-FILE into the OUTPUT-PATH, using GEN-FUNC."
+  (setq file (muse-page-name file))
+  (message "Generating %s output for %s..." name file)
+  (if (not (funcall gen-func temp-file output-path))
+      (message "Generating %s from %s...failed" name file)
+    (message "Generating %s output for %s...done" name file)
+    (muse-delete-file-if-exists temp-file)
+    (dolist (ext cleanup-exts)
+      (muse-delete-file-if-exists
+       (expand-file-name (concat file ext)
+                         (file-name-directory output-path))))
+    (message "Wrote %s" output-path)))
+
+(defun muse-publish-read-only (string)
+  (let ((end (1- (length string))))
+    (add-text-properties 0 end
+                         '(rear-nonsticky (read-only) read-only t)
+                         string)
+    string))
+
+;;; muse-publish.el ends here
diff --git a/packages/muse/muse-regexps.el b/packages/muse/muse-regexps.el
new file mode 100644 (file)
index 0000000..ad3ce3f
--- /dev/null
@@ -0,0 +1,270 @@
+;;; muse-regexps.el --- define regexps used by Muse
+
+;; Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010
+;;   Free Software Foundation, Inc.
+
+;; This file is part of Emacs Muse.  It is not part of GNU Emacs.
+
+;; Emacs Muse 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, or (at your
+;; option) any later version.
+
+;; Emacs Muse 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 Emacs Muse; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file is the part of the Muse project that describes regexps
+;; that are used throughout the project.
+
+;;; Contributors:
+
+;;; Code:
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Muse Regular Expressions
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defgroup muse-regexp nil
+  "Regular expressions used in publishing and syntax highlighting."
+  :group 'muse)
+
+;;; Deal with the lack of character classes for regexps in Emacs21 and
+;;; XEmacs
+
+(defcustom muse-regexp-use-character-classes 'undecided
+  "Indicate whether to use extended character classes like [:space:].
+If 'undecided, Muse will use them if your emacs is known to support them.
+
+Emacs 22 and Emacs 21.3.50 are known to support them.  XEmacs
+does not support them.
+
+Emacs 21.2 or higher support them, but with enough annoying edge
+cases that the sanest default is to leave them disabled."
+  :type '(choice (const :tag "Yes" t)
+                 (const :tag "No" nil)
+                 (const :tag "Let Muse decide" undecided))
+  :group 'muse-regexp)
+
+(defvar muse-regexp-emacs-revision
+  (save-match-data
+    (and (string-match "^[0-9]+\\.[0-9]+\\.\\([0-9]+\\)"
+                       emacs-version)
+         (match-string 1 emacs-version)
+         (string-to-number (match-string 1 emacs-version))))
+  "The revision number of this version of Emacs.")
+
+(defun muse-extreg-usable-p ()
+  "Return non-nil if extended character classes can be used,
+nil otherwise.
+
+This is used when deciding the initial values of the muse-regexp
+options."
+  (cond
+   ((eq muse-regexp-use-character-classes t)
+    t)
+   ((eq muse-regexp-use-character-classes nil)
+    nil)
+   ((featurep 'xemacs) nil)             ; unusable on XEmacs
+   ((> emacs-major-version 21) t)       ; usable if > 21
+   ((< emacs-major-version 21) nil)
+   ((< emacs-minor-version 3) nil)
+   ;; don't use if version is of format 21.x
+   ((null muse-regexp-emacs-revision) nil)
+   ;; only trust 21.3.50 or higher
+   ((>= muse-regexp-emacs-revision 50) t)
+   (t nil)))
+
+(defcustom muse-regexp-blank
+  (if (muse-extreg-usable-p)
+      "[:blank:]"
+    " \t")
+  "Regexp to use in place of \"[:blank:]\".
+This should be something that matches spaces and tabs.
+
+It is like a regexp, but should be embeddable inside brackets.
+Muse will detect the appropriate value correctly most of
+the time."
+  :type 'string
+  :options '("[:blank:]" " \t")
+  :group 'muse-regexp)
+
+(defcustom muse-regexp-alnum
+  (if (muse-extreg-usable-p)
+      "[:alnum:]"
+    "A-Za-z0-9")
+  "Regexp to use in place of \"[:alnum:]\".
+This should be something that matches all letters and numbers.
+
+It is like a regexp, but should be embeddable inside brackets.
+muse will detect the appropriate value correctly most of
+the time."
+  :type 'string
+  :options '("[:alnum:]" "A-Za-z0-9")
+  :group 'muse-regexp)
+
+(defcustom muse-regexp-lower
+  (if (muse-extreg-usable-p)
+      "[:lower:]"
+    "a-z")
+  "Regexp to use in place of \"[:lower:]\".
+This should match all lowercase characters.
+
+It is like a regexp, but should be embeddable inside brackets.
+muse will detect the appropriate value correctly most of
+the time."
+  :type 'string
+  :options '("[:lower:]" "a-z")
+  :group 'muse-regexp)
+
+(defcustom muse-regexp-upper
+  (if (muse-extreg-usable-p)
+      "[:upper:]"
+    "A-Z")
+  "Regexp to use in place of \"[:upper:]\".
+This should match all uppercase characters.
+
+It is like a regexp, but should be embeddable inside brackets.
+muse will detect the appropriate value correctly most of
+the time."
+  :type 'string
+  :options '("[:upper:]" "A-Z")
+  :group 'muse-regexp)
+
+;;; Regexps used to define Muse publishing syntax
+
+(defcustom muse-list-item-regexp
+  (concat "^%s\\(\\([^\n" muse-regexp-blank "].*?\\)?::"
+          "\\(?:[" muse-regexp-blank "]+\\|$\\)"
+          "\\|[" muse-regexp-blank "]-[" muse-regexp-blank "]*"
+          "\\|[" muse-regexp-blank "][0-9]+\\.[" muse-regexp-blank "]*\\)")
+  "Regexp used to match the beginning of a list item.
+The '%s' will be replaced with a whitespace regexp when publishing."
+  :type 'regexp
+  :group 'muse-regexp)
+
+(defcustom muse-ol-item-regexp (concat "\\`[" muse-regexp-blank "]+[0-9]+\\.")
+  "Regexp used to match an ordered list item."
+  :type 'regexp
+  :group 'muse-regexp)
+
+(defcustom muse-ul-item-regexp (concat "\\`[" muse-regexp-blank "]+-")
+  "Regexp used to match an unordered list item."
+  :type 'regexp
+  :group 'muse-regexp)
+
+(defcustom muse-dl-term-regexp
+  (concat "[" muse-regexp-blank "]*\\(.+?\\)["
+          muse-regexp-blank "]+::\\(?:[" muse-regexp-blank "]+\\|$\\)")
+  "Regexp used to match a definition list term.
+The first match string must contain the term."
+  :type 'regexp
+  :group 'muse-regexp)
+
+(defcustom muse-dl-entry-regexp (concat "\\`[" muse-regexp-blank "]*::")
+  "Regexp used to match a definition list entry."
+  :type 'regexp
+  :group 'muse-regexp)
+
+(defcustom muse-table-field-regexp
+  (concat "[" muse-regexp-blank "]+\\(|+\\)\\(?:["
+          muse-regexp-blank "]\\|$\\)")
+  "Regexp used to match table separators when publishing."
+  :type 'regexp
+  :group 'muse-regexp)
+
+(defcustom muse-table-line-regexp (concat ".*" muse-table-field-regexp ".*")
+  "Regexp used to match a table line when publishing."
+  :type 'regexp
+  :group 'muse-regexp)
+
+(defcustom muse-table-hline-regexp (concat "[" muse-regexp-blank
+                                           "]*|[-+]+|[" muse-regexp-blank
+                                           "]*")
+  "Regexp used to match a horizontal separator line in a table."
+  :type 'regexp
+  :group 'muse-regexp)
+
+(defcustom muse-table-el-border-regexp (concat "[" muse-regexp-blank "]*"
+                                               "\\+\\(-*\\+\\)+"
+                                               "[" muse-regexp-blank "]*")
+  "Regexp used to match the beginning and end of a table.el-style table."
+  :type 'regexp
+  :group 'muse-regexp)
+
+(defcustom muse-table-el-line-regexp (concat "[" muse-regexp-blank "]*"
+                                             "|\\(.*|\\)*"
+                                           "[" muse-regexp-blank "]*")
+  "Regexp used to match a table line of a table.el-style table."
+  :type 'regexp
+  :group 'muse-regexp)
+
+(defcustom muse-tag-regexp
+  (concat "<\\([^/" muse-regexp-blank "\n][^" muse-regexp-blank
+          "</>\n]*\\)\\(\\s-+[^<>]+[^</>\n]\\)?\\(/\\)?>")
+  "A regexp used to find XML-style tags within a buffer when publishing.
+Group 1 should be the tag name, group 2 the properties, and group
+3 the optional immediate ending slash."
+  :type 'regexp
+  :group 'muse-regexp)
+
+(defcustom muse-explicit-link-regexp
+  "\\[\\[\\([^][\n]+\\)\\]\\(?:\\[\\([^][\n]+\\)\\]\\)?\\]"
+  "Regexp used to match [[target][description]] links.
+Paren group 1 must match the URL, and paren group 2 the description."
+  :type 'regexp
+  :group 'muse-regexp)
+
+(defcustom muse-implicit-link-regexp
+  (concat "\\([^" muse-regexp-blank "\n]+\\)")
+  "Regexp used to match an implicit link.
+An implicit link is the largest block of text to be checked for
+URLs and bare WikiNames by the `muse-link-at-point' function.
+Paren group 1 is the text to be checked.
+
+URLs are checked by default.  To get WikiNames, load
+muse-wiki.el.
+
+This is only used when you are using muse-mode.el, but not
+muse-colors.el.
+
+If the above applies, and you want to match things with spaces in
+them, you will have to modify this."
+  :type 'regexp
+  :group 'muse-regexp)
+
+;;; Regexps used to determine file types
+
+(defcustom muse-file-regexp
+  (concat "\\`[~/]\\|\\?\\|/\\'\\|\\."
+          "\\(html?\\|pdf\\|mp3\\|el\\|zip\\|txt\\|tar\\)"
+          "\\(\\.\\(gz\\|bz2\\)\\)?\\'")
+  "A link matching this regexp will be regarded as a link to a file."
+  :type 'regexp
+  :group 'muse-regexp)
+
+(defcustom muse-image-regexp
+  "\\.\\(eps\\|gif\\|jp\\(e?g\\)\\|p\\(bm\\|ng\\)\\|tiff\\|x\\([bp]m\\)\\)\\'"
+  "A link matching this regexp will be published inline as an image.
+For example:
+
+  [[./wife.jpg][A picture of my wife]]
+
+If you omit the description, the alt tag of the resulting HTML
+buffer will be the name of the file."
+  :type 'regexp
+  :group 'muse-regexp)
+
+(provide 'muse-regexps)
+
+;;; muse-regexps.el ends here
diff --git a/packages/muse/muse-texinfo.el b/packages/muse/muse-texinfo.el
new file mode 100644 (file)
index 0000000..4ad0092
--- /dev/null
@@ -0,0 +1,346 @@
+;;; muse-texinfo.el --- publish entries to Texinfo format or PDF
+
+;; Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010
+;;   Free Software Foundation, Inc.
+
+;; This file is part of Emacs Muse.  It is not part of GNU Emacs.
+
+;; Emacs Muse 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, or (at your
+;; option) any later version.
+
+;; Emacs Muse 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 Emacs Muse; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;;; Contributors:
+
+;;; Code:
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Muse Texinfo Publishing
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'muse-publish)
+(require 'muse-latex)
+(require 'texnfo-upd)
+
+(defgroup muse-texinfo nil
+  "Rules for marking up a Muse file as a Texinfo article."
+  :group 'muse-publish)
+
+(defcustom muse-texinfo-process-natively nil
+  "If non-nil, use the Emacs `texinfmt' module to make Info files."
+  :type 'boolean
+  :require 'texinfmt
+  :group 'muse-texinfo)
+
+(defcustom muse-texinfo-extension ".texi"
+  "Default file extension for publishing Texinfo files."
+  :type 'string
+  :group 'muse-texinfo)
+
+(defcustom muse-texinfo-info-extension ".info"
+  "Default file extension for publishing Info files."
+  :type 'string
+  :group 'muse-texinfo)
+
+(defcustom muse-texinfo-pdf-extension ".pdf"
+  "Default file extension for publishing PDF files."
+  :type 'string
+  :group 'muse-texinfo)
+
+(defcustom muse-texinfo-header
+  "\\input texinfo  @c -*-texinfo-*-
+
+@setfilename <lisp>(concat (muse-page-name) \".info\")</lisp>
+@settitle <lisp>(muse-publishing-directive \"title\")</lisp>
+
+@documentencoding iso-8859-1
+
+@iftex
+@finalout
+@end iftex
+
+@titlepage
+@title <lisp>(muse-publishing-directive \"title\")</lisp>
+@author <lisp>(muse-publishing-directive \"author\")</lisp>
+@end titlepage
+
+<lisp>(and muse-publish-generate-contents \"@contents\")</lisp>
+
+@node Top, Overview, , (dir)
+@top Overview
+@c Page published by Emacs Muse begins here\n\n"
+  "Text to prepend to a Muse page being published as Texinfo.
+This may be text or a filename.
+It may contain <lisp> markup tags."
+  :type 'string
+  :group 'muse-texinfo)
+
+(defcustom muse-texinfo-footer
+  "\n@c Page published by Emacs Muse ends here
+@bye\n"
+  "Text to append to a Muse page being published as Texinfo.
+This may be text or a filename.
+It may contain <lisp> markup tags."
+  :type 'string
+  :group 'muse-texinfo)
+
+(defcustom muse-texinfo-markup-regexps nil
+  "List of markup rules for publishing a Muse page to Texinfo.
+For more on the structure of this list, see `muse-publish-markup-regexps'."
+  :type '(repeat (choice
+                  (list :tag "Markup rule"
+                        integer
+                        (choice regexp symbol)
+                        integer
+                        (choice string function symbol))
+                  function))
+  :group 'muse-texinfo)
+
+(defcustom muse-texinfo-markup-functions
+  '((table . muse-texinfo-markup-table)
+    (heading . muse-texinfo-markup-heading))
+  "An alist of style types to custom functions for that kind of text.
+For more on the structure of this list, see
+`muse-publish-markup-functions'."
+  :type '(alist :key-type symbol :value-type function)
+  :group 'muse-texinfo)
+
+(defcustom muse-texinfo-markup-strings
+  '((image-with-desc . "@center @image{%1%, , , %3%, %2%}@*\n@center %3%")
+    (image           . "@noindent @image{%s, , , , %s}")
+    (image-link      . "@uref{%s, %s.%s}")
+    (anchor-ref      . "@ref{%s, %s}")
+    (url             . "@uref{%s, %s}")
+    (link            . "@ref{Top, %2%, , %1%, }")
+    (link-and-anchor . "@ref{%3%, %2%, , %1%, %3%}")
+    (email-addr      . "@email{%s}")
+    (anchor          . "@anchor{%s} ")
+    (emdash          . "---")
+    (comment-begin   . "@ignore\n")
+    (comment-end     . "\n@end ignore\n")
+    (rule            . "@sp 1")
+    (no-break-space  . "@w{ }")
+    (line-break      . "@*")
+    (enddots         . "@enddots{}")
+    (dots            . "@dots{}")
+    (section         . "@chapter ")
+    (subsection      . "@section ")
+    (subsubsection   . "@subsection ")
+    (section-other   . "@subsubheading ")
+    (footnote        . "@footnote{")
+    (footnote-end    . "}")
+    (begin-underline . "_")
+    (end-underline   . "_")
+    (begin-literal   . "@samp{")
+    (end-literal     . "}")
+    (begin-emph      . "@emph{")
+    (end-emph        . "}")
+    (begin-more-emph . "@strong{")
+    (end-more-emph   . "}")
+    (begin-most-emph . "@strong{@emph{")
+    (end-most-emph   . "}}")
+    (begin-verse     . "@display\n")
+    (end-verse-line  . "")
+    (verse-space     . "@ @ ")
+    (end-verse       . "\n@end display")
+    (begin-example   . "@example\n")
+    (end-example     . "\n@end example")
+    (begin-center    . "@quotation\n")
+    (end-center      . "\n@end quotation")
+    (begin-quote     . "@quotation\n")
+    (end-quote       . "\n@end quotation")
+    (begin-cite     . "")
+    (begin-cite-author . "")
+    (begin-cite-year . "")
+    (end-cite        . "")
+    (begin-uli       . "@itemize @bullet\n")
+    (end-uli         . "\n@end itemize")
+    (begin-uli-item  . "@item\n")
+    (begin-oli       . "@enumerate\n")
+    (end-oli         . "\n@end enumerate")
+    (begin-oli-item  . "@item\n")
+    (begin-dl        . "@table @strong\n")
+    (end-dl          . "\n@end table")
+    (begin-ddt       . "@item "))
+  "Strings used for marking up text.
+These cover the most basic kinds of markup, the handling of which
+differs little between the various styles."
+  :type '(alist :key-type symbol :value-type string)
+  :group 'muse-texinfo)
+
+(defcustom muse-texinfo-markup-specials
+  '((?@ . "@@")
+    (?{ . "@{")
+    (?} . "@}"))
+  "A table of characters which must be represented specially."
+  :type '(alist :key-type character :value-type string)
+  :group 'muse-texinfo)
+
+(defcustom muse-texinfo-markup-specials-url
+  '((?@ . "@@")
+    (?{ . "@{")
+    (?} . "@}")
+    (?, . "@comma{}"))
+  "A table of characters which must be represented specially.
+These are applied to URLs."
+  :type '(alist :key-type character :value-type string)
+  :group 'muse-texinfo)
+
+(defun muse-texinfo-decide-specials (context)
+  "Determine the specials to escape, depending on CONTEXT."
+  (cond ((memq context '(underline literal emphasis email url url-desc image
+                                   footnote))
+         muse-texinfo-markup-specials-url)
+        (t muse-texinfo-markup-specials)))
+
+(defun muse-texinfo-markup-table ()
+  (let* ((table-info (muse-publish-table-fields (match-beginning 0)
+                                                (match-end 0)))
+         (row-len (car table-info))
+         (field-list (cdr table-info)))
+    (when table-info
+      (muse-insert-markup "@multitable @columnfractions")
+      (dotimes (field row-len)
+        (muse-insert-markup " " (number-to-string (/ 1.0 row-len))))
+      (dolist (fields field-list)
+        (let ((type (car fields)))
+          (unless (eq type 'hline)
+            (setq fields (cdr fields))
+            (if (= type 2)
+                (muse-insert-markup "\n@headitem ")
+              (muse-insert-markup "\n@item "))
+            (insert (car fields))
+            (setq fields (cdr fields))
+            (dolist (field fields)
+              (muse-insert-markup " @tab ")
+              (insert field)))))
+      (muse-insert-markup "\n@end multitable")
+      (insert ?\n))))
+
+(defun muse-texinfo-remove-links (string)
+  "Remove explicit links from STRING, replacing them with the link
+description.
+
+If no description exists for the link, use the link itself."
+  (let ((start nil))
+    (while (setq start (string-match muse-explicit-link-regexp string
+                                     start))
+      (setq string
+            (replace-match (or (match-string 2 string)
+                               (match-string 1 string))
+                           t t string)))
+    string))
+
+(defun muse-texinfo-protect-wikiwords (start end)
+  "Protect all wikiwords from START to END from further processing."
+  (and (boundp 'muse-wiki-wikiword-regexp)
+       (featurep 'muse-wiki)
+       (save-excursion
+         (goto-char start)
+         (while (re-search-forward muse-wiki-wikiword-regexp end t)
+           (muse-publish-mark-read-only (match-beginning 0)
+                                        (match-end 0))))))
+
+(defun muse-texinfo-markup-heading ()
+  (save-excursion
+    (muse-publish-markup-heading))
+  (let* ((eol (muse-line-end-position))
+         (orig-heading (buffer-substring (point) eol))
+         (beg (point)))
+    (delete-region (point) eol)
+    ;; don't allow links to be published in headings
+    (insert (muse-texinfo-remove-links orig-heading))
+    (muse-texinfo-protect-wikiwords beg (point))))
+
+(defun muse-texinfo-munge-buffer ()
+  (muse-latex-fixup-dquotes)
+  (texinfo-insert-node-lines (point-min) (point-max) t)
+  (texinfo-all-menus-update t))
+
+(defun muse-texinfo-pdf-browse-file (file)
+  (shell-command (concat "open " file)))
+
+(defun muse-texinfo-info-generate (file output-path final-target)
+  ;; The version of `texinfmt.el' that comes with Emacs 21 doesn't
+  ;; support @documentencoding, so hack it in.
+  (when (and (not (featurep 'xemacs))
+             (eq emacs-major-version 21))
+    (put 'documentencoding 'texinfo-format
+         'texinfo-discard-line-with-args))
+  ;; Most versions of `texinfmt.el' do not support @headitem, so hack
+  ;; it in.
+  (unless (get 'headitem 'texinfo-format)
+    (put 'headitem 'texinfo-format 'texinfo-multitable-item))
+  (muse-publish-transform-output
+   file output-path final-target "Info"
+   (function
+    (lambda (file output-path)
+      (if muse-texinfo-process-natively
+          (save-window-excursion
+            (save-excursion
+              (find-file file)
+              (let ((inhibit-read-only t))
+                (texinfo-format-buffer))
+              (save-buffer)
+              (kill-buffer (current-buffer))
+              (let ((buf (get-file-buffer file)))
+                (with-current-buffer buf
+                  (set-buffer-modified-p nil)
+                  (kill-buffer (current-buffer))))
+              t))
+        (let ((result (shell-command
+                       (concat "makeinfo --enable-encoding --output="
+                               output-path " " file))))
+          (if (or (not (numberp result))
+                  (eq result 0))
+              t
+            nil)))))))
+
+(defun muse-texinfo-pdf-generate (file output-path final-target)
+  (let ((muse-latex-pdf-program "pdftex")
+        (muse-latex-pdf-cruft '(".aux" ".cp" ".fn" ".ky" ".log" ".pg" ".toc"
+                                ".tp" ".vr")))
+    (muse-latex-pdf-generate file output-path final-target)))
+
+;;; Register the Muse TEXINFO Publishers
+
+(muse-define-style "texi"
+                   :suffix    'muse-texinfo-extension
+                   :regexps   'muse-texinfo-markup-regexps
+                   :functions 'muse-texinfo-markup-functions
+                   :strings   'muse-texinfo-markup-strings
+                   :specials  'muse-texinfo-decide-specials
+                   :after     'muse-texinfo-munge-buffer
+                   :header    'muse-texinfo-header
+                   :footer    'muse-texinfo-footer
+                   :browser   'find-file)
+
+(muse-derive-style "info" "texi"
+                   :final   'muse-texinfo-info-generate
+                   :link-suffix 'muse-texinfo-info-extension
+                   :osuffix 'muse-texinfo-info-extension
+                   :browser 'info)
+
+(muse-derive-style "info-pdf" "texi"
+                   :final   'muse-texinfo-pdf-generate
+                   :link-suffix 'muse-texinfo-pdf-extension
+                   :osuffix 'muse-texinfo-pdf-extension
+                   :browser 'muse-texinfo-pdf-browse-file)
+
+(provide 'muse-texinfo)
+
+;;; muse-texinfo.el ends here
diff --git a/packages/muse/muse-wiki.el b/packages/muse/muse-wiki.el
new file mode 100644 (file)
index 0000000..e2cd3a2
--- /dev/null
@@ -0,0 +1,498 @@
+;;; muse-wiki.el --- wiki features for Muse
+
+;; Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010
+;;   Free Software Foundation, Inc.
+
+;; Author: Yann Hodique <Yann.Hodique@lifl.fr>
+;; Keywords:
+
+;; This file is part of Emacs Muse.  It is not part of GNU Emacs.
+
+;; Emacs Muse 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, or (at your
+;; option) any later version.
+
+;; Emacs Muse 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 Emacs Muse; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;;; Contributors:
+
+;; Per B. Sederberg (per AT med DOT upenn DOT edu) made it so that all
+;; files in a Muse project can become implicit links.
+
+;;; Code:
+
+(require 'muse-regexps)
+(require 'muse-mode)
+
+(eval-when-compile
+  (require 'muse-colors))
+
+(defgroup muse-wiki nil
+  "Options controlling the behavior of Emacs Muse Wiki features."
+  :group 'muse-mode)
+
+(defcustom muse-wiki-use-wikiword t
+  "Whether to use color and publish bare WikiNames."
+  :type 'boolean
+  :group 'muse-wiki)
+
+(defcustom muse-wiki-allow-nonexistent-wikiword nil
+  "Whether to color bare WikiNames that don't have an existing file."
+  :type 'boolean
+  :group 'muse-wiki)
+
+(defcustom muse-wiki-match-all-project-files nil
+  "If non-nil, Muse will color and publish implicit links to any
+file in your project, regardless of whether its name is a WikiWord."
+  :type 'boolean
+  :group 'muse-wiki)
+
+(defcustom muse-wiki-ignore-implicit-links-to-current-page nil
+  "If non-nil, Muse will not recognize implicit links to the current
+page, both when formatting and publishing."
+  :type 'boolean
+  :group 'muse-wiki)
+
+(defvar muse-wiki-project-file-regexp nil
+  "Regexp used to match the files in the current project.
+
+This is set by `muse-wiki-update-project-file-regexp' automatically
+when `muse-wiki-match-all-project-files' is non-nil.")
+(make-variable-buffer-local 'muse-wiki-project-file-regexp)
+
+(defun muse-wiki-update-project-file-regexp ()
+  "Update a local copy of `muse-wiki-project-file-regexp' to include
+all the files in the project."
+  ;; see if the user wants to match project files
+  (when muse-wiki-match-all-project-files
+    (let ((files (mapcar #'car (muse-project-file-alist (muse-project)))))
+      (setq muse-wiki-project-file-regexp
+            (when files
+              (concat "\\("
+                      ;; include all files from the project
+                      (regexp-opt files 'words)
+                      "\\)"))))
+    ;; update coloring setup
+    (when (featurep 'muse-colors)
+      (muse-colors-define-highlighting 'muse-mode muse-colors-markup))))
+
+(add-hook 'muse-update-values-hook
+          'muse-wiki-update-project-file-regexp)
+(add-hook 'muse-project-file-alist-hook
+          'muse-wiki-update-project-file-regexp)
+
+(defcustom muse-wiki-wikiword-regexp
+  (concat "\\<\\(\\(?:[" muse-regexp-upper
+          "]+[" muse-regexp-lower "]+\\)\\(?:["
+          muse-regexp-upper "]+[" muse-regexp-lower "]+\\)+\\)")
+  "Regexp used to match WikiWords."
+  :set (function
+        (lambda (sym value)
+          (set sym value)
+          (when (featurep 'muse-colors)
+            (muse-colors-define-highlighting 'muse-mode muse-colors-markup))))
+  :type 'regexp
+  :group 'muse-wiki)
+
+(defcustom muse-wiki-ignore-bare-project-names nil
+  "Determine whether project names without a page specifer are links.
+
+If non-nil, project names without a page specifier will not be
+considered links.
+
+When nil, project names without a specifier are highlighted and
+they link to the default page of the project that they name."
+  :type 'boolean
+  :group 'muse-wiki)
+
+(defvar muse-wiki-interwiki-regexp nil
+  "Regexp that matches all interwiki links.
+
+This is automatically generated by setting `muse-wiki-interwiki-alist'.
+It can also be set by calling `muse-wiki-update-interwiki-regexp'.")
+
+(defcustom muse-wiki-interwiki-delimiter "#\\|::"
+  "Delimiter regexp used for InterWiki links.
+
+If you use groups, use only shy groups."
+  :type 'regexp
+  :group 'muse-wiki)
+
+(defcustom muse-wiki-interwiki-replacement ": "
+  "Regexp used for replacing `muse-wiki-interwiki-delimiter' in
+InterWiki link descriptions.
+
+If you want this replacement to happen, you must add
+`muse-wiki-publish-pretty-interwiki' to
+`muse-publish-desc-transforms'."
+  :type 'regexp
+  :group 'muse-wiki)
+
+(eval-when-compile
+  (defvar muse-wiki-interwiki-alist))
+
+(defun muse-wiki-project-files-with-spaces (&optional project)
+  "Return a list of files in PROJECT that have spaces."
+  (setq project (muse-project project))
+  (let ((flist nil))
+    (save-match-data
+      (dolist (entry (muse-project-file-alist project))
+        (when (string-match " " (car entry))
+          (setq flist (cons (car entry) flist)))))
+    flist))
+
+(defun muse-wiki-update-interwiki-regexp ()
+  "Update the value of `muse-wiki-interwiki-regexp' based on
+`muse-wiki-interwiki-alist' and `muse-project-alist'."
+  (if (null muse-project-alist)
+      (setq muse-wiki-interwiki-regexp nil)
+    (let ((old-value muse-wiki-interwiki-regexp))
+      (setq muse-wiki-interwiki-regexp
+            (concat "\\<\\(" (regexp-opt (mapcar #'car muse-project-alist))
+                    (when muse-wiki-interwiki-alist
+                      (let ((interwiki-rules
+                             (mapcar #'car muse-wiki-interwiki-alist)))
+                        (when interwiki-rules
+                          (concat "\\|" (regexp-opt interwiki-rules)))))
+                    "\\)\\(?:\\(" muse-wiki-interwiki-delimiter
+                    "\\)\\("
+                    (when muse-wiki-match-all-project-files
+                      ;; append the files from the project
+                      (let ((files nil))
+                        (dolist (proj muse-project-alist)
+                          (setq files
+                                (nconc (muse-wiki-project-files-with-spaces
+                                        (car proj))
+                                       files)))
+                        (when files
+                          (concat (regexp-opt files) "\\|"))))
+                    "\\sw+\\)\\(#\\S-+\\)?\\)?\\>"))
+      (when (and (featurep 'muse-colors)
+                 (not (string= old-value muse-wiki-interwiki-regexp)))
+        (muse-colors-define-highlighting 'muse-mode muse-colors-markup)))))
+
+(defcustom muse-wiki-interwiki-alist
+  '(("EmacsWiki" . "http://www.emacswiki.org/cgi-bin/wiki/"))
+  "A table of WikiNames that refer to external entities.
+
+The format of this table is an alist, or series of cons cells.
+Each cons cell must be of the form:
+
+  (WIKINAME . STRING-OR-FUNCTION)
+
+The second part of the cons cell may either be a STRING, which in most
+cases should be a URL, or a FUNCTION.  If a function, it will be
+called with one argument: the tag applied to the Interwiki name, or
+nil if no tag was used.  If the cdr was a STRING and a tag is used,
+the tag is simply appended.
+
+Here are some examples:
+
+  (\"JohnWiki\" . \"http://alice.dynodns.net/wiki?\")
+
+Referring to [[JohnWiki::EmacsModules]] then really means:
+
+  http://alice.dynodns.net/wiki?EmacsModules
+
+If a function is used for the replacement text, you can get creative
+depending on what the tag is.  Tags may contain any alphabetic
+character, any number, % or _.  If you need other special characters,
+use % to specify the hex code, as in %2E.  All browsers should support
+this."
+  :type '(repeat (cons (string :tag "WikiName")
+                       (choice (string :tag "URL") function)))
+  :set (function
+        (lambda (sym value)
+          (set sym value)
+          (muse-wiki-update-interwiki-regexp)))
+  :group 'muse-wiki)
+
+(add-hook 'muse-update-values-hook
+          'muse-wiki-update-interwiki-regexp)
+
+(defun muse-wiki-resolve-project-page (&optional project page)
+  "Return the published path from the current page to PAGE of PROJECT.
+
+If PAGE is not specified, use the value of :default in PROJECT.
+
+If PROJECT is not specified, default to the current project.  If
+no project is current, use the first project of
+`muse-projects-alist'.
+
+Note that PAGE can have several output directories.  If this is
+the case, we will use the first one that matches our current
+style and has the same link suffix, ignoring the others.  If no
+style has the same link suffix as the current publishing style,
+use the first style we find."
+  (setq project (or (and project
+                         (muse-project project))
+                    (muse-project)
+                    (car muse-project-alist))
+        page (or page (muse-get-keyword :default (cadr project))))
+  (let* ((page-path (and muse-project-alist
+                         (muse-project-page-file page project)))
+         (remote-styles (and page-path (muse-project-applicable-styles
+                                        page-path (cddr project))))
+         (local-style (muse-project-current-output-style)))
+    (cond ((and remote-styles local-style muse-publishing-p)
+           (muse-project-resolve-link page local-style remote-styles))
+          ((not muse-publishing-p)
+           (if page-path
+               page-path
+             (when muse-wiki-allow-nonexistent-wikiword
+               ;; make a path to a nonexistent file in project
+               (setq page-path (expand-file-name
+                                page (car (cadr project))))
+               (if (and muse-file-extension
+                        (not (string= muse-file-extension "")))
+                   (concat page-path "." muse-file-extension)
+                 page-path)))))))
+
+(defun muse-wiki-handle-implicit-interwiki (&optional string)
+  "If STRING or point has an interwiki link, resolve it to a filename.
+
+Match string 0 is set to the link."
+  (when (and muse-wiki-interwiki-regexp
+             (if string (string-match muse-wiki-interwiki-regexp string)
+               (looking-at muse-wiki-interwiki-regexp)))
+    (let* ((project (match-string 1 string))
+           (subst (cdr (assoc project muse-wiki-interwiki-alist)))
+           (word (match-string 3 string))
+           (anchor (if (match-beginning 4)
+                       (match-string 4 string)
+                     "")))
+      (if subst
+          (if (functionp subst)
+              (and (setq word (funcall subst word))
+                   (concat word anchor))
+            (concat subst word anchor))
+        (and (assoc project muse-project-alist)
+             (or word (not muse-wiki-ignore-bare-project-names))
+             (setq word (muse-wiki-resolve-project-page project word))
+             (concat word anchor))))))
+
+(defun muse-wiki-handle-explicit-interwiki (&optional string)
+  "If STRING or point has an interwiki link, resolve it to a filename."
+  (let ((right-pos (if string (length string) (match-end 1))))
+    (when (and muse-wiki-interwiki-regexp
+               (if string (string-match muse-wiki-interwiki-regexp string)
+                 (save-restriction
+                   (narrow-to-region (point) right-pos)
+                   (looking-at muse-wiki-interwiki-regexp))))
+      (let* ((project (match-string 1 string))
+             (subst (cdr (assoc project muse-wiki-interwiki-alist)))
+             (anchor (and (match-beginning 4)
+                          (match-string 4 string)))
+             (word (when (match-end 2)
+                     (cond (anchor (match-string 3 string))
+                           (string (substring string (match-end 2)))
+                           (right-pos (buffer-substring (match-end 2)
+                                                        right-pos))
+                           (t nil)))))
+        (if (and (null word)
+                 right-pos
+                 (not (= right-pos (match-end 1))))
+            ;; if only a project name was found, it must take up the
+            ;; entire string or link
+            nil
+          (unless anchor
+            (if (or (null word)
+                    (not (string-match "#[^#]+\\'" word)))
+                (setq anchor "")
+              (setq anchor (match-string 0 word))
+              (setq word (substring word 0 (match-beginning 0)))))
+          (if subst
+              (if (functionp subst)
+                  (and (setq word (funcall subst word))
+                       (concat word anchor))
+                (concat subst word anchor))
+            (and (assoc project muse-project-alist)
+                 (or word (not muse-wiki-ignore-bare-project-names))
+                 (setq word (muse-wiki-resolve-project-page project word))
+                 (concat word anchor))))))))
+
+(defun muse-wiki-handle-wikiword (&optional string)
+  "If STRING or point has a WikiWord, return it.
+
+Match 1 is set to the WikiWord."
+  (when (and (or (and muse-wiki-match-all-project-files
+                      muse-wiki-project-file-regexp
+                      (if string
+                          (string-match muse-wiki-project-file-regexp string)
+                        (looking-at muse-wiki-project-file-regexp)))
+                 (and muse-wiki-use-wikiword
+                      (if string
+                          (string-match muse-wiki-wikiword-regexp string)
+                        (looking-at muse-wiki-wikiword-regexp))))
+             (cond
+              (muse-wiki-allow-nonexistent-wikiword
+               t)
+              ((and muse-wiki-ignore-implicit-links-to-current-page
+                    (string= (match-string 1 string) (muse-page-name)))
+               nil)
+              ((and (muse-project-of-file)
+                    (muse-project-page-file
+                     (match-string 1 string) muse-current-project t))
+               t)
+              ((file-exists-p (match-string 1 string))
+               t)
+              (t nil)))
+    (match-string 1 string)))
+
+;;; Prettifications
+
+(defcustom muse-wiki-publish-small-title-words
+  '("the" "and" "at" "on" "of" "for" "in" "an" "a")
+  "Strings that should be downcased in a page title.
+
+This is used by `muse-wiki-publish-pretty-title', which must be
+called manually."
+  :type '(repeat string)
+  :group 'muse-wiki)
+
+(defcustom muse-wiki-hide-nop-tag t
+  "If non-nil, hide <nop> tags when coloring a Muse buffer."
+  :type 'boolean
+  :group 'muse-wiki)
+
+(defun muse-wiki-publish-pretty-title (&optional title explicit)
+  "Return a pretty version of the given TITLE.
+
+If EXPLICIT is non-nil, TITLE will be returned unmodified."
+  (unless title (setq title (or (muse-publishing-directive "title") "")))
+  (if (or explicit
+          (save-match-data (string-match muse-url-regexp title)))
+      title
+    (save-match-data
+      (let ((case-fold-search nil))
+        (while (string-match (concat "\\([" muse-regexp-lower
+                                     "]\\)\\([" muse-regexp-upper
+                                     "0-9]\\)")
+                             title)
+          (setq title (replace-match "\\1 \\2" t nil title)))
+        (let* ((words (split-string title))
+               (w (cdr words)))
+          (while w
+            (if (member (downcase (car w))
+                        muse-wiki-publish-small-title-words)
+                (setcar w (downcase (car w))))
+            (setq w (cdr w)))
+          (mapconcat 'identity words " "))))))
+
+(defun muse-wiki-publish-pretty-interwiki (desc &optional explicit)
+  "Replace instances of `muse-wiki-interwiki-delimiter' with
+`muse-wiki-interwiki-replacement'."
+  (if (or explicit
+          (save-match-data (string-match muse-url-regexp desc)))
+      desc
+    (muse-replace-regexp-in-string muse-wiki-interwiki-delimiter
+                                   muse-wiki-interwiki-replacement
+                                   desc)))
+
+;;; Coloring setup
+
+(defun muse-wiki-colors-nop-tag (beg end)
+  "Inhibit the colorization of inhibit links just after the tag.
+
+Example: <nop>WikiWord"
+  (when muse-wiki-hide-nop-tag
+    (add-text-properties beg (+ beg 5)
+                         '(invisible muse intangible t)))
+  (unless (> (+ beg 6) (point-max))
+    (add-text-properties (+ beg 5) (+ beg 6)
+                         '(muse-no-implicit-link t))))
+
+(defun muse-colors-wikiword-separate ()
+  (add-text-properties (match-beginning 0) (match-end 0)
+                       '(invisible muse intangible t)))
+
+(defun muse-wiki-insinuate-colors ()
+  (add-to-list 'muse-colors-tags
+               '("nop" nil nil nil muse-wiki-colors-nop-tag)
+               t)
+  (add-to-list 'muse-colors-markup
+               '(muse-wiki-interwiki-regexp t muse-colors-implicit-link)
+               t)
+  (add-to-list 'muse-colors-markup
+               '(muse-wiki-wikiword-regexp t muse-colors-implicit-link)
+               t)
+  (add-to-list 'muse-colors-markup
+               '(muse-wiki-project-file-regexp t muse-colors-implicit-link)
+               t)
+  (add-to-list 'muse-colors-markup
+               '("''''" ?\' muse-colors-wikiword-separate)
+               nil)
+  (muse-colors-define-highlighting 'muse-mode muse-colors-markup))
+
+(eval-after-load "muse-colors" '(muse-wiki-insinuate-colors))
+
+;;; Publishing setup
+
+(defun muse-wiki-publish-nop-tag (beg end)
+  "Inhibit the colorization of inhibit links just after the tag.
+
+Example: <nop>WikiWord"
+  (unless (= (point) (point-max))
+    (muse-publish-mark-read-only (point) (+ (point) 1))))
+
+(defun muse-wiki-insinuate-publish ()
+  (add-to-list 'muse-publish-markup-tags
+               '("nop" nil nil nil muse-wiki-publish-nop-tag)
+               t)
+  (add-to-list 'muse-publish-markup-regexps
+               '(3100 muse-wiki-interwiki-regexp 0 link)
+               t)
+  (add-to-list 'muse-publish-markup-regexps
+               '(3200 muse-wiki-wikiword-regexp 0 link)
+               t)
+  (add-to-list 'muse-publish-markup-regexps
+               '(3250 muse-wiki-project-file-regexp 0 link)
+               t)
+  (add-to-list 'muse-publish-markup-regexps
+               '(3300 "''''" 0 "")
+               t)
+  (custom-add-option 'muse-publish-desc-transforms
+                     'muse-wiki-publish-pretty-interwiki)
+  (custom-add-option 'muse-publish-desc-transforms
+                     'muse-wiki-publish-pretty-title))
+
+(eval-after-load "muse-publish" '(muse-wiki-insinuate-publish))
+
+;;; Insinuate link handling
+
+(custom-add-option 'muse-implicit-link-functions
+                   'muse-wiki-handle-implicit-interwiki)
+(custom-add-option 'muse-implicit-link-functions
+                   'muse-wiki-handle-wikiword)
+
+(custom-add-option 'muse-explicit-link-functions
+                   'muse-wiki-handle-explicit-interwiki)
+
+(add-to-list 'muse-implicit-link-functions
+             'muse-wiki-handle-implicit-interwiki t)
+(add-to-list 'muse-implicit-link-functions
+             'muse-wiki-handle-wikiword t)
+
+(add-to-list 'muse-explicit-link-functions
+             'muse-wiki-handle-explicit-interwiki t)
+
+;;; Obsolete functions
+
+(defun muse-wiki-update-custom-values ()
+  (muse-display-warning
+   (concat "Please remove `muse-wiki-update-custom-values' from"
+           " `muse-mode-hook'.  Its use is now deprecated.")))
+
+(provide 'muse-wiki)
+;;; muse-wiki.el ends here
diff --git a/packages/muse/muse-xml-common.el b/packages/muse/muse-xml-common.el
new file mode 100644 (file)
index 0000000..75869ca
--- /dev/null
@@ -0,0 +1,201 @@
+;;; muse-xml-common.el --- common routines for XML-like publishing styles
+
+;; Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010
+;;   Free Software Foundation, Inc.
+
+;; This file is part of Emacs Muse.  It is not part of GNU Emacs.
+
+;; Emacs Muse 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, or (at your
+;; option) any later version.
+
+;; Emacs Muse 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 Emacs Muse; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;;; Contributors:
+
+;;; Code:
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Muse XML Publishing - Common Elements
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'muse-publish)
+(require 'muse-regexps)
+
+(defcustom muse-xml-encoding-map
+  '((iso-8859-1         . "iso-8859-1")
+    (iso-2022-jp        . "iso-2022-jp")
+    (utf-8              . "utf-8")
+    (japanese-iso-8bit  . "euc-jp")
+    (chinese-big5       . "big5")
+    (mule-utf-8         . "utf-8")
+    (chinese-iso-8bit   . "gb2312")
+    (chinese-gbk        . "gbk"))
+  "An alist mapping Emacs coding systems to appropriate XML charsets.
+Use the base name of the coding system (i.e. without the -unix)."
+  :type '(alist :key-type coding-system :value-type string)
+  :group 'muse-xml)
+
+(defun muse-xml-transform-content-type (content-type default)
+  "Using `muse-xml-encoding-map', try and resolve an Emacs coding
+system to an associated XML coding system.
+If no match is found, the DEFAULT charset is used instead."
+  (let ((match (and (fboundp 'coding-system-base)
+                    (assoc (coding-system-base content-type)
+                           muse-xml-encoding-map))))
+    (if match
+        (cdr match)
+      default)))
+
+(defcustom muse-xml-markup-specials
+  '((?\" . "&quot;")
+    (?\< . "&lt;")
+    (?\> . "&gt;")
+    (?\& . "&amp;"))
+  "A table of characters which must be represented specially."
+  :type '(alist :key-type character :value-type string)
+  :group 'muse-xml)
+
+(defcustom muse-xml-markup-specials-url-extra
+  '((?\" . "&quot;")
+    (?\< . "&lt;")
+    (?\> . "&gt;")
+    (?\& . "&amp;")
+    (?\  . "%20")
+    (?\n . "%0D%0A"))
+  "A table of characters which must be represented specially.
+These are extra characters that are escaped within URLs."
+  :type '(alist :key-type character :value-type string)
+  :group 'muse-xml)
+
+(defun muse-xml-decide-specials (context)
+  "Determine the specials to escape, depending on CONTEXT."
+  (cond ((memq context '(email url image))
+         'muse-xml-escape-url)
+        ((eq context 'url-extra)
+         muse-xml-markup-specials-url-extra)
+        (t muse-xml-markup-specials)))
+
+(defun muse-xml-escape-url (str)
+  "Convert to character entities any non-alphanumeric characters
+outside a few punctuation symbols, that risk being misinterpreted
+if not escaped."
+  (when str
+    (setq str (muse-publish-escape-specials-in-string str 'url-extra))
+    (let (pos code len ch)
+      (save-match-data
+        (while (setq pos (string-match (concat "[^-"
+                                               muse-regexp-alnum
+                                               "/:._=@\\?~#%\"\\+<>()&;]")
+                                       str pos))
+          (setq ch (aref str pos)
+                code (concat "&#" (int-to-string
+                                   (cond ((fboundp 'char-to-ucs)
+                                          (char-to-ucs ch))
+                                         ((fboundp 'char-to-int)
+                                          (char-to-int ch))
+                                         (t ch)))
+                             ";")
+                len (length code)
+                str (concat (substring str 0 pos)
+                            code
+                            (when (< pos (length str))
+                              (substring str (1+ pos) nil)))
+                pos (+ len pos)))
+        str))))
+
+(defun muse-xml-markup-anchor ()
+  (unless (get-text-property (match-end 1) 'muse-link)
+    (let ((text (muse-markup-text 'anchor (match-string 2))))
+      (save-match-data
+        (skip-chars-forward (concat muse-regexp-blank "\n"))
+        (when (looking-at (concat "<\\([^" muse-regexp-blank "/>\n]+\\)>"))
+          (goto-char (match-end 0)))
+        (muse-insert-markup text)))
+    (match-string 1)))
+
+(defun muse-xml-sort-table (table)
+  "Sort the given table structure so that it validates properly."
+  ;; Note that the decision matrix must have a nil diagonal, or else
+  ;; elements with the same type will be reversed with respect to each
+  ;; other.
+  (let ((decisions '((nil nil nil)      ; body < header, body < footer
+                     (t   nil t)        ; header stays where it is
+                     (t   nil nil))))   ; footer < header
+    (sort table #'(lambda (l r)
+                    (and (integerp (car l)) (integerp (car r))
+                         (nth (1- (car r))
+                              (nth (1- (car l)) decisions)))))))
+
+(defun muse-xml-markup-table (&optional attributes)
+  "Publish the matched region into a table.
+If a string ATTRIBUTES is given, pass it to the markup string begin-table."
+  (let* ((table-info (muse-publish-table-fields (match-beginning 0)
+                                                (match-end 0)))
+         (row-len (car table-info))
+         (supports-group (not (string= (muse-markup-text 'begin-table-group
+                                                         row-len)
+                                       "")))
+         (field-list (muse-xml-sort-table (cdr table-info)))
+         last-part)
+    (when table-info
+      (let ((beg (point)))
+        (muse-publish-ensure-block beg))
+      (muse-insert-markup (muse-markup-text 'begin-table (or attributes "")))
+      (muse-insert-markup (muse-markup-text 'begin-table-group row-len))
+      (dolist (fields field-list)
+        (let* ((type (car fields))
+               (part (cond ((eq type 'hline) nil)
+                           ((= type 1) "tbody")
+                           ((= type 2) "thead")
+                           ((= type 3) "tfoot")))
+               (col (cond ((eq type 'hline) nil)
+                          ((= type 1) "td")
+                          ((= type 2) "th")
+                          ((= type 3) "td"))))
+          (setq fields (cdr fields))
+          (unless (and part last-part (string= part last-part))
+            (when last-part
+              (muse-insert-markup "  </" last-part ">\n")
+              (when (eq type 'hline)
+                ;; horizontal separators are represented by closing
+                ;; the current table group and opening a new one
+                (muse-insert-markup (muse-markup-text 'end-table-group))
+                (muse-insert-markup (muse-markup-text 'begin-table-group
+                                                      row-len))))
+            (when part
+              (muse-insert-markup "  <" part ">\n"))
+            (setq last-part part))
+          (unless (eq type 'hline)
+            (muse-insert-markup (muse-markup-text 'begin-table-row))
+            (dolist (field fields)
+              (muse-insert-markup (muse-markup-text 'begin-table-entry  col))
+              (insert field)
+              (muse-insert-markup (muse-markup-text 'end-table-entry  col)))
+            (muse-insert-markup (muse-markup-text 'end-table-row)))))
+      (when last-part
+        (muse-insert-markup "  </" last-part ">\n"))
+      (muse-insert-markup (muse-markup-text 'end-table-group))
+      (muse-insert-markup (muse-markup-text 'end-table))
+      (insert ?\n))))
+
+(defun muse-xml-prepare-buffer ()
+  (set (make-local-variable 'muse-publish-url-transforms)
+       (cons 'muse-xml-escape-string muse-publish-url-transforms)))
+
+(provide 'muse-xml-common)
+
+;;; muse-xml-common.el ends here
diff --git a/packages/muse/muse-xml.el b/packages/muse/muse-xml.el
new file mode 100644 (file)
index 0000000..9f26ade
--- /dev/null
@@ -0,0 +1,274 @@
+;;; muse-xml.el --- publish XML files
+
+;; Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010
+;;   Free Software Foundation, Inc.
+
+;; Author: Michael Olson <mwolson@gnu.org>
+;; Date: Sat 23-Jul-2005
+
+;; This file is part of Emacs Muse.  It is not part of GNU Emacs.
+
+;; Emacs Muse 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, or (at your
+;; option) any later version.
+
+;; Emacs Muse 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 Emacs Muse; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; James Clarke's nxml-mode can be used for editing and validating
+;; Muse-generated XML files.  If you are in nxml-mode use the command
+;; C-c C-s C-f to point to the schema in `contrib/muse.rnc', which
+;; comes with Muse.  Say yes if you are asked if you want to copy the
+;; file to your location.  C-c C-s C-a can then be used to reload the
+;; schema if you make changes to the file.
+
+;;; Contributors:
+
+;; Peter K. Lee (saint AT corenova DOT com) made the initial
+;; implementation of planner-publish.el, which was heavily borrowed
+;; from.
+
+;; Brad Collins (brad AT chenla DOT org) provided a Compact RelaxNG
+;; schema.
+
+;;; Code:
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Muse XML Publishing
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'muse-publish)
+(require 'muse-regexps)
+(require 'muse-xml-common)
+
+(defgroup muse-xml nil
+  "Options controlling the behavior of Muse XML publishing.
+See `muse-xml' for more information."
+  :group 'muse-publish)
+
+(defcustom muse-xml-extension ".xml"
+  "Default file extension for publishing XML files."
+  :type 'string
+  :group 'muse-xml)
+
+(defcustom muse-xml-header
+  "<?xml version=\"1.0\" encoding=\"<lisp>
+  (muse-xml-encoding)</lisp>\"?>
+<MUSE>
+  <pageinfo>
+    <title><lisp>(muse-publishing-directive \"title\")</lisp></title>
+    <author><lisp>(muse-publishing-directive \"author\")</lisp></author>
+    <maintainer><lisp>(muse-style-element :maintainer)</lisp></maintainer>
+    <pubdate><lisp>(muse-publishing-directive \"date\")</lisp></pubdate>
+  </pageinfo>
+  <!-- Page published by Emacs Muse begins here -->\n"
+  "Header used for publishing XML files.
+This may be text or a filename."
+  :type 'string
+  :group 'muse-xml)
+
+(defcustom muse-xml-footer "
+  <!-- Page published by Emacs Muse ends here -->
+</MUSE>\n"
+  "Footer used for publishing XML files.
+This may be text or a filename."
+  :type 'string
+  :group 'muse-xml)
+
+(defcustom muse-xml-markup-regexps
+  `(;; Beginning of doc, end of doc, or plain paragraph separator
+    (10000 ,(concat "\\(\\(\n\\(?:[" muse-regexp-blank "]*\n\\)*"
+                    "\\([" muse-regexp-blank "]*\n\\)\\)"
+                    "\\|\\`\\s-*\\|\\s-*\\'\\)")
+           ;; this is somewhat repetitive because we only require the
+           ;; line just before the paragraph beginning to be not
+           ;; read-only
+           3 muse-xml-markup-paragraph))
+  "List of markup rules for publishing a Muse page to XML.
+For more on the structure of this list, see `muse-publish-markup-regexps'."
+  :type '(repeat (choice
+                  (list :tag "Markup rule"
+                        integer
+                        (choice regexp symbol)
+                        integer
+                        (choice string function symbol))
+                  function))
+  :group 'muse-xml)
+
+(defcustom muse-xml-markup-functions
+  '((anchor . muse-xml-markup-anchor)
+    (table . muse-xml-markup-table))
+  "An alist of style types to custom functions for that kind of text.
+For more on the structure of this list, see
+`muse-publish-markup-functions'."
+  :type '(alist :key-type symbol :value-type function)
+  :group 'muse-xml)
+
+(defcustom muse-xml-markup-strings
+  '((image-with-desc . "<image href=\"%s.%s\">%s</image>")
+    (image           . "<image href=\"%s.%s\"></image>")
+    (image-link      . "<link type=\"image\" href=\"%s\">%s.%s</link>")
+    (anchor-ref      . "<link type=\"url\" href=\"#%s\">%s</link>")
+    (url             . "<link type=\"url\" href=\"%s\">%s</link>")
+    (link            . "<link type=\"url\" href=\"%s\">%s</link>")
+    (link-and-anchor . "<link type=\"url\" href=\"%s#%s\">%s</link>")
+    (email-addr      . "<link type=\"email\" href=\"%s\">%s</link>")
+    (anchor          . "<anchor id=\"%s\" />\n")
+    (emdash          . "%s--%s")
+    (comment-begin   . "<!-- ")
+    (comment-end     . " -->")
+    (rule            . "<hr />")
+    (fn-sep          . "<hr />\n")
+    (no-break-space  . "&nbsp;")
+    (line-break      . "<br>")
+    (enddots         . "....")
+    (dots            . "...")
+    (section         . "<section level=\"1\"><title>")
+    (section-end     . "</title>")
+    (subsection      . "<section level=\"2\"><title>")
+    (subsection-end  . "</title>")
+    (subsubsection   . "<section level=\"3\"><title>")
+    (subsubsection-end . "</title>")
+    (section-other   . "<section level=\"%s\"><title>")
+    (section-other-end . "</title>")
+    (section-close   . "</section>")
+    (footnote        . "<footnote>")
+    (footnote-end    . "</footnote>")
+    (begin-underline . "<format type=\"underline\">")
+    (end-underline   . "</format>")
+    (begin-literal   . "<code>")
+    (end-literal     . "</code>")
+    (begin-emph      . "<format type=\"emphasis\" level=\"1\">")
+    (end-emph        . "</format>")
+    (begin-more-emph . "<format type=\"emphasis\" level=\"2\">")
+    (end-more-emph   . "</format>")
+    (begin-most-emph . "<format type=\"emphasis\" level=\"3\">")
+    (end-most-emph   . "</format>")
+    (begin-verse     . "<verse>\n")
+    (begin-verse-line . "<line>")
+    (end-verse-line  . "</line>")
+    (empty-verse-line . "<line />")
+    (begin-last-stanza-line . "<line>")
+    (end-last-stanza-line . "</line>")
+    (end-verse       . "</verse>")
+    (begin-example   . "<example>")
+    (end-example     . "</example>")
+    (begin-center    . "<p><format type=\"center\">\n")
+    (end-center      . "\n</format></p>")
+    (begin-quote     . "<blockquote>\n")
+    (end-quote       . "\n</blockquote>")
+    (begin-cite      . "<cite>")
+    (begin-cite-author . "<cite type=\"author\">")
+    (begin-cite-year . "<cite type=\"year\">")
+    (end-cite        . "</cite>")
+    (begin-quote-item . "<p>")
+    (end-quote-item  . "</p>")
+    (begin-uli       . "<list type=\"unordered\">\n")
+    (end-uli         . "\n</list>")
+    (begin-uli-item  . "<item>")
+    (end-uli-item    . "</item>")
+    (begin-oli       . "<list type=\"ordered\">\n")
+    (end-oli         . "\n</list>")
+    (begin-oli-item  . "<item>")
+    (end-oli-item    . "</item>")
+    (begin-dl        . "<list type=\"definition\">\n")
+    (end-dl          . "\n</list>")
+    (begin-dl-item   . "<item>\n")
+    (end-dl-item     . "\n</item>")
+    (begin-ddt       . "<term>")
+    (end-ddt         . "</term>")
+    (begin-dde       . "<definition>")
+    (end-dde         . "</definition>")
+    (begin-table     . "<table%s>\n")
+    (end-table       . "</table>")
+    (begin-table-row . "    <tr>\n")
+    (end-table-row   . "    </tr>\n")
+    (begin-table-entry . "      <%s>")
+    (end-table-entry . "</%s>\n"))
+  "Strings used for marking up text.
+These cover the most basic kinds of markup, the handling of which
+differs little between the various styles."
+  :type '(alist :key-type symbol :value-type string)
+  :group 'muse-xml)
+
+(defcustom muse-xml-encoding-default 'utf-8
+  "The default Emacs buffer encoding to use in published files.
+This will be used if no special characters are found."
+  :type 'symbol
+  :group 'muse-xml)
+
+(defcustom muse-xml-charset-default "utf-8"
+  "The default XML charset to use if no translation is
+found in `muse-xml-encoding-map'."
+  :type 'string
+  :group 'muse-xml)
+
+(defun muse-xml-encoding ()
+  (muse-xml-transform-content-type
+   (or (and (boundp 'buffer-file-coding-system)
+            buffer-file-coding-system)
+       muse-xml-encoding-default)
+   muse-xml-charset-default))
+
+(defun muse-xml-markup-paragraph ()
+  (let ((end (copy-marker (match-end 0) t)))
+    (goto-char (match-beginning 0))
+    (when (save-excursion
+            (save-match-data
+              (and (not (get-text-property (max (point-min) (1- (point)))
+                                           'muse-no-paragraph))
+                   (re-search-backward "<\\(/?\\)p[ >]" nil t)
+                   (not (string-equal (match-string 1) "/")))))
+      (when (get-text-property (1- (point)) 'muse-end-list)
+        (goto-char (previous-single-property-change (1- (point))
+                                                    'muse-end-list)))
+      (muse-insert-markup "</p>"))
+    (goto-char end))
+  (cond
+   ((eobp)
+    (unless (bolp)
+      (insert "\n")))
+   ((get-text-property (point) 'muse-no-paragraph)
+    (forward-char 1)
+    nil)
+   ((eq (char-after) ?\<)
+    (when (looking-at (concat "<\\(format\\|code\\|link\\|image"
+                              "\\|anchor\\|footnote\\)[ >]"))
+      (muse-insert-markup "<p>")))
+   (t
+    (muse-insert-markup "<p>"))))
+
+(defun muse-xml-finalize-buffer ()
+  (when (boundp 'buffer-file-coding-system)
+    (when (memq buffer-file-coding-system '(no-conversion undecided-unix))
+      ;; make it agree with the default charset
+      (setq buffer-file-coding-system muse-xml-encoding-default))))
+
+;;; Register the Muse XML Publisher
+
+(muse-define-style "xml"
+                   :suffix     'muse-xml-extension
+                   :regexps    'muse-xml-markup-regexps
+                   :functions  'muse-xml-markup-functions
+                   :strings    'muse-xml-markup-strings
+                   :specials   'muse-xml-decide-specials
+                   :after      'muse-xml-finalize-buffer
+                   :header     'muse-xml-header
+                   :footer     'muse-xml-footer
+                   :browser    'find-file)
+
+(provide 'muse-xml)
+
+;;; muse-xml.el ends here
diff --git a/packages/muse/muse.el b/packages/muse/muse.el
new file mode 100644 (file)
index 0000000..4d4a0b9
--- /dev/null
@@ -0,0 +1,881 @@
+;;; muse.el --- an authoring and publishing tool for Emacs
+
+;; Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010
+;;   Free Software Foundation, Inc.
+
+;; Emacs Lisp Archive Entry
+;; Filename: muse.el
+;; Version: 3.20
+;; Date: Sun 31 Jan-2010
+;; Keywords: hypermedia
+;; Author: John Wiegley <johnw@gnu.org>
+;; Maintainer: Michael Olson <mwolson@gnu.org>
+;; Description: An authoring and publishing tool for Emacs
+;; URL: http://mwolson.org/projects/EmacsMuse.html
+;; Compatibility: Emacs21 XEmacs21 Emacs22
+
+;; This file is part of Emacs Muse.  It is not part of GNU Emacs.
+
+;; Emacs Muse 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, or (at your
+;; option) any later version.
+
+;; Emacs Muse 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 Emacs Muse; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; Muse is a tool for easily authoring and publishing documents.  It
+;; allows for rapid prototyping of hyperlinked text, which may then be
+;; exported to multiple output formats -- such as HTML, LaTeX,
+;; Texinfo, etc.
+
+;; The markup rules used by Muse are intended to be very friendly to
+;; people familiar with Emacs.  See the included manual for more
+;; information.
+
+;;; Contributors:
+
+;;; Code:
+
+;; Indicate that this version of Muse supports nested tags
+(provide 'muse-nested-tags)
+
+(defvar muse-version "3.20"
+  "The version of Muse currently loaded")
+
+(defun muse-version (&optional insert)
+  "Display the version of Muse that is currently loaded.
+If INSERT is non-nil, insert the text instead of displaying it."
+  (interactive "P")
+  (if insert
+      (insert muse-version)
+    (message muse-version)))
+
+(defgroup muse nil
+  "Options controlling the behavior of Muse.
+The markup used by Muse is intended to be very friendly to people
+familiar with Emacs."
+  :group 'hypermedia)
+
+(defvar muse-under-windows-p (memq system-type '(ms-dos windows-nt)))
+
+(provide 'muse)
+
+(condition-case nil
+    (require 'derived)
+  (error nil))
+(require 'wid-edit)
+(require 'muse-regexps)
+
+(defvar muse-update-values-hook nil
+  "Hook for values that are automatically generated.
+This is to be used by add-on modules for Muse.
+It is run just before colorizing or publishing a buffer.")
+
+(defun muse-update-values ()
+  "Update various values that are automatically generated.
+
+Call this after changing `muse-project-alist'."
+  (interactive)
+  (run-hooks 'muse-update-values-hook)
+  (dolist (buffer (buffer-list))
+    (when (buffer-live-p buffer)
+      (with-current-buffer buffer
+        (when (derived-mode-p 'muse-mode)
+          (and (boundp 'muse-current-project)
+               (fboundp 'muse-project-of-file)
+               (setq muse-current-project nil)
+               (setq muse-current-project (muse-project-of-file))))))))
+
+;; Default file extension
+
+;; By default, use the .muse file extension.
+;;;###autoload (add-to-list 'auto-mode-alist '("\\.muse\\'" . muse-mode-choose-mode))
+
+;; We need to have this at top-level, as well, so that any Muse or
+;; Planner documents opened during init will just work.
+(add-to-list 'auto-mode-alist '("\\.muse\\'" . muse-mode-choose-mode))
+
+(eval-when-compile
+  (defvar muse-ignored-extensions))
+
+(defvar muse-ignored-extensions-regexp nil
+  "A regexp of extensions to omit from the ending of a Muse page name.
+This is autogenerated from `muse-ignored-extensions'.")
+
+(defun muse-update-file-extension (sym val)
+  "Update the value of `muse-file-extension'."
+  (let ((old (and (boundp sym) (symbol-value sym))))
+    (set sym val)
+    (when (and (featurep 'muse-mode)
+               (or (not (stringp val))
+                   (not (stringp old))
+                   (not (string= old val))))
+      ;; remove old auto-mode-alist association
+      (when (and (boundp sym) (stringp old))
+        (setq auto-mode-alist
+              (delete (cons (concat "\\." old "\\'")
+                            'muse-mode-choose-mode)
+                      auto-mode-alist)))
+      ;; associate the new file extension with muse-mode
+      (when (stringp val)
+        (add-to-list 'auto-mode-alist
+                     (cons (concat "\\." val "\\'")
+                           'muse-mode-choose-mode)))
+      ;; update the ignored extensions regexp
+      (when (fboundp 'muse-update-ignored-extensions-regexp)
+        (muse-update-ignored-extensions-regexp
+         'muse-ignored-extensions muse-ignored-extensions)))))
+
+(defcustom muse-file-extension "muse"
+  "File extension of Muse files.  Omit the period at the beginning.
+If you don't want Muse files to have an extension, set this to nil."
+  :type '(choice
+          (const :tag "None" nil)
+          (string))
+  :set 'muse-update-file-extension
+  :group 'muse)
+
+(defcustom muse-completing-read-function 'completing-read
+  "Function to call when prompting user to choose between a list of options.
+This should take the same arguments as `completing-read'."
+  :type 'function
+  :group 'muse)
+
+(defun muse-update-ignored-extensions-regexp (sym val)
+  "Update the value of `muse-ignored-extensions-regexp'."
+  (set sym val)
+  (if val
+      (setq muse-ignored-extensions-regexp
+            (concat "\\.\\("
+                    (regexp-quote (or muse-file-extension "")) "\\|"
+                    (mapconcat 'identity val "\\|")
+                    "\\)\\'"))
+    (setq muse-ignored-extensions-regexp
+          (if muse-file-extension
+              (concat "\\.\\(" muse-file-extension "\\)\\'")
+            nil))))
+
+(add-hook 'muse-update-values-hook
+          (lambda ()
+            (muse-update-ignored-extensions-regexp
+             'muse-ignored-extensions muse-ignored-extensions)))
+
+(defcustom muse-ignored-extensions '("bz2" "gz" "[Zz]")
+  "A list of extensions to omit from the ending of a Muse page name.
+These are regexps.
+
+Don't put a period at the beginning of each extension unless you
+understand that it is part of a regexp."
+  :type '(repeat (regexp :tag "Extension"))
+  :set 'muse-update-ignored-extensions-regexp
+  :group 'muse)
+
+(defun muse-update-file-extension-after-init ()
+  ;; This is short, but it has to be a function, otherwise Emacs21
+  ;; does not load it properly when running after-init-hook
+  (unless (string= muse-file-extension "muse")
+    (let ((val muse-file-extension)
+          (muse-file-extension "muse"))
+      (muse-update-file-extension 'muse-file-extension val))))
+
+;; Once the user's init file has been processed, determine whether
+;; they want a file extension
+(add-hook 'after-init-hook 'muse-update-file-extension-after-init)
+
+;; URL protocols
+
+(require 'muse-protocols)
+
+;; Helper functions
+
+(defsubst muse-delete-file-if-exists (file)
+  (when (file-exists-p file)
+    (delete-file file)
+    (message "Removed %s" file)))
+
+(defsubst muse-time-less-p (t1 t2)
+  "Say whether time T1 is less than time T2."
+  (or (< (car t1) (car t2))
+      (and (= (car t1) (car t2))
+           (< (nth 1 t1) (nth 1 t2)))))
+
+(eval-when-compile
+  (defvar muse-publishing-current-file nil))
+
+(defun muse-current-file ()
+  "Return the name of the currently visited or published file."
+  (or (and (boundp 'muse-publishing-current-file)
+           muse-publishing-current-file)
+      (buffer-file-name)
+      (concat default-directory (buffer-name))))
+
+(defun muse-page-name (&optional name)
+  "Return the canonical form of a Muse page name.
+
+What this means is that the directory part of NAME is removed,
+and the file extensions in `muse-ignored-extensions' are also
+removed from NAME."
+  (save-match-data
+    (unless (and name (not (string= name "")))
+      (setq name (muse-current-file)))
+    (if name
+        (let ((page (file-name-nondirectory name)))
+          (if (and muse-ignored-extensions-regexp
+                   (string-match muse-ignored-extensions-regexp page))
+              (replace-match "" t t page)
+            page)))))
+
+(defun muse-display-warning (message)
+  "Display the given MESSAGE as a warning."
+  (if (fboundp 'display-warning)
+      (display-warning 'muse message
+                       (if (featurep 'xemacs)
+                           'warning
+                         :warning))
+    (let ((buf (get-buffer-create "*Muse warnings*")))
+      (with-current-buffer buf
+        (goto-char (point-max))
+        (insert "Warning (muse): " message)
+        (unless (bolp)
+          (newline)))
+      (display-buffer buf)
+      (sit-for 0))))
+
+(defun muse-eval-lisp (form)
+  "Evaluate the given form and return the result as a string."
+  (require 'pp)
+  (save-match-data
+    (condition-case err
+        (let ((object (eval (read form))))
+          (cond
+           ((stringp object) object)
+           ((and (listp object)
+                 (not (eq object nil)))
+            (let ((string (pp-to-string object)))
+              (substring string 0 (1- (length string)))))
+           ((numberp object)
+            (number-to-string object))
+           ((eq object nil) "")
+           (t
+            (pp-to-string object))))
+      (error
+       (muse-display-warning (format "%s: Error evaluating %s: %s"
+                                     (muse-page-name) form err))
+       "; INVALID LISP CODE"))))
+
+(defmacro muse-with-temp-buffer (&rest body)
+  "Create a temporary buffer, and evaluate BODY there like `progn'.
+See also `with-temp-file' and `with-output-to-string'.
+
+Unlike `with-temp-buffer', this will never attempt to save the
+temp buffer.  It is meant to be used along with
+`insert-file-contents' or `muse-insert-file-contents'.
+
+The undo feature will be disabled in the new buffer.
+
+If `debug-on-error' is set to t, keep the buffer around for
+debugging purposes rather than removing it."
+  (let ((temp-buffer (make-symbol "temp-buffer")))
+    `(let ((,temp-buffer (generate-new-buffer " *muse-temp*")))
+       (buffer-disable-undo ,temp-buffer)
+       (unwind-protect
+           (if debug-on-error
+               (with-current-buffer ,temp-buffer
+                 ,@body)
+             (condition-case err
+                 (with-current-buffer ,temp-buffer
+                   ,@body)
+               (error
+                (if (and (boundp 'muse-batch-publishing-p)
+                         muse-batch-publishing-p)
+                    (progn
+                      (message "%s: Error occured: %s"
+                               (muse-page-name) err)
+                      (backtrace))
+                  (muse-display-warning
+                   (format (concat "An error occurred while publishing"
+                                   " %s:\n  %s\n\nSet debug-on-error to"
+                                   " `t' if you would like a backtrace.")
+                                 (muse-page-name) err))))))
+         (when (buffer-live-p ,temp-buffer)
+           (with-current-buffer ,temp-buffer
+             (set-buffer-modified-p nil))
+           (unless debug-on-error (kill-buffer ,temp-buffer)))))))
+
+(put 'muse-with-temp-buffer 'lisp-indent-function 0)
+(put 'muse-with-temp-buffer 'edebug-form-spec '(body))
+
+(defun muse-insert-file-contents (filename &optional visit)
+  "Insert the contents of file FILENAME after point.
+Do character code conversion and end-of-line conversion, but none
+of the other unnecessary things like format decoding or
+`find-file-hook'.
+
+If VISIT is non-nil, the buffer's visited filename
+and last save file modtime are set, and it is marked unmodified.
+If visiting and the file does not exist, visiting is completed
+before the error is signaled."
+  (let ((format-alist nil)
+        (after-insert-file-functions nil)
+        (inhibit-file-name-handlers
+         (append '(jka-compr-handler image-file-handler epa-file-handler)
+                 inhibit-file-name-handlers))
+        (inhibit-file-name-operation 'insert-file-contents))
+    (insert-file-contents filename visit)))
+
+(defun muse-write-file (filename &optional nomessage)
+  "Write current buffer into file FILENAME.
+Unlike `write-file', this does not visit the file, try to back it
+up, or interact with vc.el in any way.
+
+If the file was not written successfully, return nil.  Otherwise,
+return non-nil.
+
+If the NOMESSAGE argument is non-nil, suppress the \"Wrote file\"
+message."
+  (when nomessage (setq nomessage 'nomessage))
+  (let ((backup-inhibited t)
+        (buffer-file-name filename)
+        (buffer-file-truename (file-truename filename)))
+    (save-current-buffer
+      (save-restriction
+        (widen)
+        (if (not (file-writable-p buffer-file-name))
+            (prog1 nil
+              (muse-display-warning
+               (format "Cannot write file %s:\n  %s" buffer-file-name
+                       (let ((dir (file-name-directory buffer-file-name)))
+                         (if (not (file-directory-p dir))
+                             (if (file-exists-p dir)
+                                 (format "%s is not a directory" dir)
+                               (format "No directory named %s exists" dir))
+                           (if (not (file-exists-p buffer-file-name))
+                               (format "Directory %s write-protected" dir)
+                             "File is write-protected"))))))
+          (let ((coding-system-for-write
+                 (or (and (boundp 'save-buffer-coding-system)
+                          save-buffer-coding-system)
+                     coding-system-for-write)))
+            (write-region (point-min) (point-max) buffer-file-name
+                          nil nomessage))
+          (when (boundp 'last-file-coding-system-used)
+            (when (boundp 'buffer-file-coding-system-explicit)
+              (setq buffer-file-coding-system-explicit
+                    last-coding-system-used))
+            (if save-buffer-coding-system
+                (setq save-buffer-coding-system last-coding-system-used)
+              (setq buffer-file-coding-system last-coding-system-used)))
+          t)))))
+
+(defun muse-collect-alist (list element &optional test)
+  "Collect items from LIST whose car is equal to ELEMENT.
+If TEST is specified, use it to compare ELEMENT."
+  (unless test (setq test 'equal))
+  (let ((items nil))
+    (dolist (item list)
+      (when (funcall test element (car item))
+        (setq items (cons item items))))
+    items))
+
+(defmacro muse-sort-with-closure (list predicate closure)
+  "Sort LIST, stably, comparing elements using PREDICATE.
+Returns the sorted list.  LIST is modified by side effects.
+PREDICATE is called with two elements of list and CLOSURE.
+PREDICATE should return non-nil if the first element should sort
+before the second."
+  `(sort ,list (lambda (a b) (funcall ,predicate a b ,closure))))
+
+(put 'muse-sort-with-closure 'lisp-indent-function 0)
+(put 'muse-sort-with-closure 'edebug-form-spec '(form function-form form))
+
+(defun muse-sort-by-rating (rated-list &optional test)
+  "Sort RATED-LIST according to the rating of each element.
+The rating is stripped out in the returned list.
+Default sorting is highest-first.
+
+If TEST if specified, use it to sort the list.  The default test is '>."
+  (unless test (setq test '>))
+  (mapcar (function cdr)
+          (muse-sort-with-closure
+            rated-list
+            (lambda (a b closure)
+              (let ((na (numberp (car a)))
+                    (nb (numberp (car b))))
+                (cond ((and na nb) (funcall closure (car a) (car b)))
+                      (na (not nb))
+                      (t nil))))
+            test)))
+
+(defun muse-escape-specials-in-string (specials string &optional reverse)
+  "Apply the transformations in SPECIALS to STRING.
+
+The transforms should form a fully reversible and non-ambiguous
+syntax when STRING is parsed from left to right.
+
+If REVERSE is specified, reverse an already-escaped string."
+  (let ((rules (mapcar (lambda (rule)
+                         (cons (regexp-quote (if reverse
+                                                 (cdr rule)
+                                               (car rule)))
+                               (if reverse (car rule) (cdr rule))))
+                       specials)))
+    (save-match-data
+      (with-temp-buffer
+        (insert string)
+        (goto-char (point-min))
+        (while (not (eobp))
+          (unless (catch 'found
+                    (dolist (rule rules)
+                      (when (looking-at (car rule))
+                        (replace-match (cdr rule) t t)
+                        (throw 'found t))))
+            (forward-char)))
+        (buffer-string)))))
+
+(defun muse-trim-whitespace (string)
+  "Return a version of STRING with no initial nor trailing whitespace."
+  (muse-replace-regexp-in-string
+   (concat "\\`[" muse-regexp-blank "]+\\|[" muse-regexp-blank "]+\\'")
+   "" string))
+
+(defun muse-path-sans-extension (path)
+  "Return PATH sans final \"extension\".
+
+The extension, in a file name, is the part that follows the last `.',
+except that a leading `.', if any, doesn't count.
+
+This differs from `file-name-sans-extension' in that it will
+never modify the directory part of the path."
+  (concat (file-name-directory path)
+          (file-name-nondirectory (file-name-sans-extension path))))
+
+;; The following code was extracted from cl
+
+(defun muse-const-expr-p (x)
+  (cond ((consp x)
+         (or (eq (car x) 'quote)
+             (and (memq (car x) '(function function*))
+                  (or (symbolp (nth 1 x))
+                      (and (eq (and (consp (nth 1 x))
+                                    (car (nth 1 x))) 'lambda) 'func)))))
+        ((symbolp x) (and (memq x '(nil t)) t))
+        (t t)))
+
+(put 'muse-assertion-failed 'error-conditions '(error))
+(put 'muse-assertion-failed 'error-message "Assertion failed")
+
+(defun muse-list* (arg &rest rest)
+  "Return a new list with specified args as elements, cons'd to last arg.
+Thus, `(list* A B C D)' is equivalent to `(nconc (list A B C) D)', or to
+`(cons A (cons B (cons C D)))'."
+  (cond ((not rest) arg)
+        ((not (cdr rest)) (cons arg (car rest)))
+        (t (let* ((n (length rest))
+                  (copy (copy-sequence rest))
+                  (last (nthcdr (- n 2) copy)))
+             (setcdr last (car (cdr last)))
+             (cons arg copy)))))
+
+(defmacro muse-assert (form &optional show-args string &rest args)
+  "Verify that FORM returns non-nil; signal an error if not.
+Second arg SHOW-ARGS means to include arguments of FORM in message.
+Other args STRING and ARGS... are arguments to be passed to `error'.
+They are not evaluated unless the assertion fails.  If STRING is
+omitted, a default message listing FORM itself is used."
+  (let ((sargs
+         (and show-args
+              (delq nil (mapcar
+                         (function
+                          (lambda (x)
+                            (and (not (muse-const-expr-p x)) x)))
+                         (cdr form))))))
+    (list 'progn
+          (list 'or form
+                (if string
+                    (muse-list* 'error string (append sargs args))
+                  (list 'signal '(quote muse-assertion-failed)
+                        (muse-list* 'list (list 'quote form) sargs))))
+          nil)))
+
+;; Compatibility functions
+
+(if (fboundp 'looking-back)
+    (defalias 'muse-looking-back 'looking-back)
+  (defun muse-looking-back (regexp &optional limit &rest ignored)
+    (save-excursion
+      (re-search-backward (concat "\\(?:" regexp "\\)\\=") limit t))))
+
+(eval-and-compile
+  (if (fboundp 'line-end-position)
+      (defalias 'muse-line-end-position 'line-end-position)
+    (defun muse-line-end-position (&optional n)
+      (save-excursion (end-of-line n) (point))))
+
+  (if (fboundp 'line-beginning-position)
+      (defalias 'muse-line-beginning-position 'line-beginning-position)
+    (defun muse-line-beginning-position (&optional n)
+      (save-excursion (beginning-of-line n) (point))))
+
+  (if (fboundp 'match-string-no-properties)
+      (defalias 'muse-match-string-no-properties 'match-string-no-properties)
+    (defun muse-match-string-no-properties (num &optional string)
+      (match-string num string))))
+
+(defun muse-replace-regexp-in-string (regexp replacement text &optional fixedcase literal)
+  "Replace REGEXP with REPLACEMENT in TEXT.
+
+Return a new string containing the replacements.
+
+If fourth arg FIXEDCASE is non-nil, do not alter case of replacement text.
+If fifth arg LITERAL is non-nil, insert REPLACEMENT literally."
+  (cond
+   ((and (featurep 'xemacs) (fboundp 'replace-in-string))
+    (and (fboundp 'replace-in-string)   ; stupid byte-compiler warning
+         (replace-in-string text regexp replacement literal)))
+   ((fboundp 'replace-regexp-in-string)
+    (replace-regexp-in-string regexp replacement text fixedcase literal))
+   (t (error (concat "Neither `replace-in-string' nor "
+                     "`replace-regexp-in-string' was found")))))
+
+(if (fboundp 'add-to-invisibility-spec)
+    (defalias 'muse-add-to-invisibility-spec 'add-to-invisibility-spec)
+  (defun muse-add-to-invisibility-spec (element)
+    "Add ELEMENT to `buffer-invisibility-spec'.
+See documentation for `buffer-invisibility-spec' for the kind of elements
+that can be added."
+    (if (eq buffer-invisibility-spec t)
+        (setq buffer-invisibility-spec (list t)))
+    (setq buffer-invisibility-spec
+          (cons element buffer-invisibility-spec))))
+
+(if (fboundp 'read-directory-name)
+    (defalias 'muse-read-directory-name  'read-directory-name)
+  (defun muse-read-directory-name (prompt &optional dir default-dirname mustmatch initial)
+    "Read directory name - see `read-file-name' for details."
+    (unless dir
+      (setq dir default-directory))
+    (read-file-name prompt dir (or default-dirname
+                                   (if initial (expand-file-name initial dir)
+                                     dir))
+                    mustmatch initial)))
+
+(defun muse-file-remote-p (file)
+  "Test whether FILE specifies a location on a remote system.
+Return non-nil if the location is indeed remote.
+
+For example, the filename \"/user@host:/foo\" specifies a location
+on the system \"/user@host:\"."
+  (cond ((fboundp 'file-remote-p)
+         (file-remote-p file))
+        ((fboundp 'tramp-handle-file-remote-p)
+         (tramp-handle-file-remote-p file))
+        ((and (boundp 'ange-ftp-name-format)
+              (string-match (car ange-ftp-name-format) file))
+         t)
+        (t nil)))
+
+(if (fboundp 'delete-and-extract-region)
+    (defalias 'muse-delete-and-extract-region 'delete-and-extract-region)
+  (defun muse-delete-and-extract-region (start end)
+    "Delete the text between START and END and return it."
+    (prog1 (buffer-substring start end)
+      (delete-region start end))))
+
+(if (fboundp 'delete-dups)
+    (defalias 'muse-delete-dups 'delete-dups)
+  (defun muse-delete-dups (list)
+    "Destructively remove `equal' duplicates from LIST.
+Store the result in LIST and return it.  LIST must be a proper list.
+Of several `equal' occurrences of an element in LIST, the first
+one is kept."
+    (let ((tail list))
+      (while tail
+        (setcdr tail (delete (car tail) (cdr tail)))
+        (setq tail (cdr tail))))
+    list))
+
+;; Set face globally in a predictable fashion
+(defun muse-copy-face (old new)
+  "Copy face OLD to NEW."
+  (if (featurep 'xemacs)
+      (copy-face old new 'all)
+    (copy-face old new)))
+
+;; Widget compatibility functions
+
+(defun muse-widget-type-value-create (widget)
+  "Convert and instantiate the value of the :type attribute of WIDGET.
+Store the newly created widget in the :children attribute.
+
+The value of the :type attribute should be an unconverted widget type."
+  (let ((value (widget-get widget :value))
+        (type (widget-get widget :type)))
+    (widget-put widget :children
+                (list (widget-create-child-value widget
+                                                 (widget-convert type)
+                                                 value)))))
+
+(defun muse-widget-child-value-get (widget)
+  "Get the value of the first member of :children in WIDGET."
+  (widget-value (car (widget-get widget :children))))
+
+(defun muse-widget-type-match (widget value)
+  "Non-nil if the :type value of WIDGET matches VALUE.
+
+The value of the :type attribute should be an unconverted widget type."
+  (widget-apply (widget-convert (widget-get widget :type)) :match value))
+
+;; Link-handling functions and variables
+
+(defun muse-get-link (&optional target)
+  "Based on the match data, retrieve the link.
+Use TARGET to get the string, if it is specified."
+  (muse-match-string-no-properties 1 target))
+
+(defun muse-get-link-desc (&optional target)
+  "Based on the match data, retrieve the link description.
+Use TARGET to get the string, if it is specified."
+  (muse-match-string-no-properties 2 target))
+
+(defvar muse-link-specials
+  '(("[" . "%5B")
+    ("]" . "%5D")
+    ("%" . "%%"))
+  "Syntax used for escaping and unescaping links.
+This allows brackets to occur in explicit links as long as you
+use the standard Muse functions to create them.")
+
+(defun muse-link-escape (text)
+  "Escape characters in TEXT that conflict with the explicit link
+regexp."
+  (when (stringp text)
+    (muse-escape-specials-in-string muse-link-specials text)))
+
+(defun muse-link-unescape (text)
+  "Un-escape characters in TEXT that conflict with the explicit
+link regexp."
+  (when (stringp text)
+    (muse-escape-specials-in-string muse-link-specials text t)))
+
+(defun muse-handle-url (&optional string)
+  "If STRING or point has a URL, match and return it."
+  (if (if string (string-match muse-url-regexp string)
+        (looking-at muse-url-regexp))
+      (match-string 0 string)))
+
+(defcustom muse-implicit-link-functions '(muse-handle-url)
+  "A list of functions to handle an implicit link.
+An implicit link is one that is not surrounded by brackets.
+
+By default, Muse handles URLs only.
+If you want to handle WikiWords, load muse-wiki.el."
+  :type 'hook
+  :options '(muse-handle-url)
+  :group 'muse)
+
+(defun muse-handle-implicit-link (&optional link)
+  "Handle implicit links.  If LINK is not specified, look at point.
+An implicit link is one that is not surrounded by brackets.
+By default, Muse handles URLs only.
+If you want to handle WikiWords, load muse-wiki.el.
+
+This function modifies the match data so that match 0 is the
+link.
+
+The match data is restored after each unsuccessful handler
+function call.  If LINK is specified, only restore at very end.
+
+This behavior is needed because the part of the buffer that
+`muse-implicit-link-regexp' matches must be narrowed to the part
+that is an accepted link."
+  (let ((funcs muse-implicit-link-functions)
+        (res nil)
+        (data (match-data t)))
+    (while funcs
+      (setq res (funcall (car funcs) link))
+      (if res
+          (setq funcs nil)
+        (unless link (set-match-data data))
+        (setq funcs (cdr funcs))))
+    (when link (set-match-data data))
+    res))
+
+(defcustom muse-explicit-link-functions nil
+  "A list of functions to handle an explicit link.
+An explicit link is one [[like][this]] or [[this]]."
+  :type 'hook
+  :group 'muse)
+
+(defun muse-handle-explicit-link (&optional link)
+  "Handle explicit links.  If LINK is not specified, look at point.
+An explicit link is one that looks [[like][this]] or [[this]].
+
+The match data is preserved.  If no handlers are able to process
+LINK, return LINK (if specified) or the 1st match string.  If
+LINK is not specified, it is assumed that Muse has matched
+against `muse-explicit-link-regexp' before calling this
+function."
+  (let ((funcs muse-explicit-link-functions)
+        (res nil))
+    (save-match-data
+      (while funcs
+        (setq res (funcall (car funcs) link))
+        (if res
+            (setq funcs nil)
+          (setq funcs (cdr funcs)))))
+    (muse-link-unescape
+     (if res
+         res
+       (or link (muse-get-link))))))
+
+;; Movement functions
+
+(defun muse-list-item-type (str)
+  "Determine the type of list given STR.
+Returns either 'ul, 'ol, 'dl-term, 'dl-entry, or nil."
+  (save-match-data
+    (cond ((or (string= str "")
+               (< (length str) 2))
+           nil)
+          ((string-match muse-dl-entry-regexp str)
+           'dl-entry)
+          ((string-match muse-dl-term-regexp str)
+           'dl-term)
+          ((string-match muse-ol-item-regexp str)
+           'ol)
+          ((string-match muse-ul-item-regexp str)
+           'ul)
+          (t nil))))
+
+(defun muse-list-item-critical-point (&optional offset)
+  "Figure out where the important markup character for the
+currently-matched list item is.
+
+If OFFSET is specified, it is the number of groupings outside of
+the contents of `muse-list-item-regexp'."
+  (unless offset (setq offset 0))
+  (if (match-end (+ offset 2))
+      ;; at a definition list
+      (match-end (+ offset 2))
+    ;; at a different kind of list
+    (match-beginning (+ offset 1))))
+
+(defun muse-forward-paragraph (&optional pattern)
+  "Move forward safely by one paragraph, or according to PATTERN."
+  (when (get-text-property (point) 'muse-end-list)
+    (goto-char (next-single-property-change (point) 'muse-end-list)))
+  (setq pattern (if pattern
+                    (concat "^\\(?:" pattern "\\|\n\\|\\'\\)")
+                  "^\\s-*\\(\n\\|\\'\\)"))
+  (let ((next-list-end (or (next-single-property-change (point) 'muse-end-list)
+                           (point-max))))
+    (forward-line 1)
+    (if (re-search-forward pattern nil t)
+        (goto-char (match-beginning 0))
+      (goto-char (point-max)))
+    (when (> (point) next-list-end)
+      (goto-char next-list-end))))
+
+(defun muse-forward-list-item-1 (type empty-line indented-line)
+  "Determine whether a nested list item is after point."
+  (if (match-beginning 1)
+      ;; if we are given a dl entry, skip past everything on the same
+      ;; level, except for other dl entries
+      (and (eq type 'dl-entry)
+           (not (eq (char-after (match-beginning 2)) ?\:)))
+    ;; blank line encountered with no list item on the same
+    ;; level after it
+    (let ((beg (point)))
+      (forward-line 1)
+      (if (save-match-data
+            (and (looking-at indented-line)
+                 (not (looking-at empty-line))))
+          ;; found that this blank line is followed by some
+          ;; indentation, plus other text, so we'll keep
+          ;; going
+          t
+        (goto-char beg)
+        nil))))
+
+(defun muse-forward-list-item (type indent &optional no-skip-nested)
+  "Move forward to the next item of TYPE.
+Return non-nil if successful, nil otherwise.
+The beginning indentation is given by INDENT.
+
+If NO-SKIP-NESTED is non-nil, do not skip past nested items.
+Note that if you desire this behavior, you will also need to
+provide a very liberal INDENT value, such as
+\(concat \"[\" muse-regexp-blank \"]*\")."
+  (let* ((list-item (format muse-list-item-regexp indent))
+         (empty-line (concat "^[" muse-regexp-blank "]*\n"))
+         (indented-line (concat "^" indent "[" muse-regexp-blank "]"))
+         (list-pattern (concat "\\(?:" empty-line "\\)?"
+                               "\\(" list-item "\\)")))
+    (while (progn
+             (muse-forward-paragraph list-pattern)
+             ;; make sure we don't go past boundary
+             (and (not (or (get-text-property (point) 'muse-end-list)
+                           (>= (point) (point-max))))
+                  ;; move past markup that is part of another construct
+                  (or (and (match-beginning 1)
+                           (or (get-text-property
+                                (muse-list-item-critical-point 1) 'muse-link)
+                               (and (derived-mode-p 'muse-mode)
+                                    (get-text-property
+                                     (muse-list-item-critical-point 1)
+                                     'face))))
+                      ;; skip nested items
+                      (and (not no-skip-nested)
+                           (muse-forward-list-item-1 type empty-line
+                                                     indented-line))))))
+    (cond ((or (get-text-property (point) 'muse-end-list)
+               (>= (point) (point-max)))
+           ;; at a list boundary, so stop
+           nil)
+          ((let ((str (when (match-beginning 2)
+                        ;; get the entire line
+                        (save-excursion
+                          (goto-char (match-beginning 2))
+                          (buffer-substring (muse-line-beginning-position)
+                                            (muse-line-end-position))))))
+             (and str (eq type (muse-list-item-type str))))
+           ;; same type, so indicate that there are more items to be
+           ;; parsed
+           (goto-char (match-beginning 1)))
+          (t
+           (when (match-beginning 1)
+             (goto-char (match-beginning 1)))
+           ;; move to just before foreign list item markup
+           nil))))
+
+(defun muse-goto-tag-end (tag nested)
+  "Move forward past the end of TAG.
+
+If NESTED is non-nil, look for other instances of this tag that
+may be nested inside of this tag, and skip past them."
+  (if (not nested)
+      (search-forward (concat "</" tag ">") nil t)
+    (let ((nesting 1)
+          (tag-regexp (concat "\\(<\\(/?\\)" tag "\\([ >]\\)\\)"))
+          (match-found nil))
+      (while (and (> nesting 0)
+                  (setq match-found (re-search-forward tag-regexp nil t)))
+        ;; for the sake of font-locking code, skip matches in comments
+        (unless (get-text-property (match-beginning 0) 'muse-comment)
+          (if (string-equal (match-string 2) "/")
+              (and (string-equal (match-string 3) ">")
+                   (setq nesting (1- nesting)))
+            (setq nesting (1+ nesting)))))
+      match-found)))
+
+;;; muse.el ends here
diff --git a/packages/muse/muse.info b/packages/muse/muse.info
new file mode 100644 (file)
index 0000000..28bd20d
--- /dev/null
@@ -0,0 +1,4656 @@
+This is muse.info, produced by makeinfo version 4.13 from muse.texi.
+
+INFO-DIR-SECTION Emacs
+START-INFO-DIR-ENTRY
+* Muse: (muse). Authoring and publishing environment for Emacs.
+END-INFO-DIR-ENTRY
+
+   This manual is for Emacs Muse version 3.20.
+
+   Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010  Free
+Software Foundation, Inc.
+
+     Permission is granted to copy, distribute and/or modify this
+     document under the terms of the GNU Free Documentation License,
+     Version 1.2 or any later version published by the Free Software
+     Foundation; with no Invariant Sections, with the Front-Cover texts
+     being "A GNU Manual", and with the Back-Cover Texts as in (a)
+     below.  A copy of the license is included in the section entitled
+     "GNU Free Documentation License" in this manual.
+
+     (a) The FSF's Back-Cover Text is: "You have freedom to copy and
+     modify this GNU Manual, like GNU software.  Copies published by
+     the Free Software Foundation raise funds for GNU development."
+
+     This document is part of a collection distributed under the GNU
+     Free Documentation License.  If you want to distribute this
+     document separately from the collection, you can do so by adding a
+     copy of the license to the document, as described in section 6 of
+     the license.
+
+     All Emacs Lisp code contained in this document may be used,
+     distributed, and modified without restriction.
+
+\1f
+File: muse.info,  Node: Top,  Next: Preface,  Prev: (dir),  Up: (dir)
+
+Muse
+****
+
+This manual is for Emacs Muse version 3.20.
+
+   Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010  Free
+Software Foundation, Inc.
+
+     Permission is granted to copy, distribute and/or modify this
+     document under the terms of the GNU Free Documentation License,
+     Version 1.2 or any later version published by the Free Software
+     Foundation; with no Invariant Sections, with the Front-Cover texts
+     being "A GNU Manual", and with the Back-Cover Texts as in (a)
+     below.  A copy of the license is included in the section entitled
+     "GNU Free Documentation License" in this manual.
+
+     (a) The FSF's Back-Cover Text is: "You have freedom to copy and
+     modify this GNU Manual, like GNU software.  Copies published by
+     the Free Software Foundation raise funds for GNU development."
+
+     This document is part of a collection distributed under the GNU
+     Free Documentation License.  If you want to distribute this
+     document separately from the collection, you can do so by adding a
+     copy of the license to the document, as described in section 6 of
+     the license.
+
+     All Emacs Lisp code contained in this document may be used,
+     distributed, and modified without restriction.
+
+* Menu:
+
+* Preface::                     About the documentation.
+* Introduction::                What is Muse?
+* Obtaining Muse::              How to get Muse releases and development
+                                  changes.
+* Installation::                Compiling and installing Muse.
+* Getting Started::             Setting up Muse and editing files.
+* Projects::                    Creating and managing Muse projects.
+* Keystroke Summary::           Keys used in Muse mode.
+* Markup Rules::                Rules for using markup.
+* Publishing Styles::           Publishing various types of documents.
+* Extending Muse::              Making your own publishing styles.
+* Miscellaneous::               Miscellaneous add-ons, like a minor mode.
+* Getting Help and Reporting Bugs::
+* History::                     History of this document.
+* Contributors::                Contributors to this documentation.
+* GNU Free Documentation License::  The license for this documentation.
+* Concept Index::               Search for terms.
+
+ --- The Detailed Node Listing ---
+
+How to Get Muse Releases and Development Changes
+
+* Releases::                    Released versions of Muse.
+* Development::                 Latest unreleased development changes.
+
+Getting Started
+
+* Loading Muse::                How to load Muse.
+* Using Muse Mode::             How to edit files in Muse.
+* Publishing Files Overview::   Publishing a single file or project.
+* File Extensions::             Using a different file extension.
+
+Creating and Managing Muse Projects
+
+* Single Project::              A single-project example.
+* Multiple Projects::           A multiple-project example.
+* Projects and Subdirectories::  Publishing subdirectories in projects.
+* Options for Projects::        Listing of available options for projects.
+
+Rules for Using Markup
+
+* Paragraphs::                  Paragraphs: centering and quoting.
+* Headings::                    Levels of headings.
+* Directives::                  Directives at the beginning of a
+                                  document.
+* Emphasizing Text::            Bold, italicized, and underlined text.
+* Footnotes::                   Making notes to be shown at the end.
+* Verse::                       Indicating poetic stanzas.
+* Lists::                       Lists of items.
+* Tables::                      Generation of data tables.
+* Explicit Links::              Hyperlinks and email addresses with
+                                  descriptions.
+* Implicit Links::              Bare URLs, WikiNames, and InterWiki
+                                  links.
+* Images::                      Publishing and displaying images.
+* Horizontal Rules and Anchors::  Inserting a horizontal line or anchor.
+* Embedded Lisp::               Evaluating Emacs Lisp code in documents
+                                  for extensibility.
+* Citations::                   Support for citing other resources.
+* Comments::                    Lines to omit from published output.
+* Tag Summary::                 Tags that Muse recognizes.
+
+Publishing Various Types of Documents
+
+* Blosxom::                     Integrating Muse and pyblosxom.cgi.
+* Book::                        Publishing entries into a compilation.
+* ConTeXt::                     Publishing ConTeXt documents.
+* DocBook::                     Publishing in DocBook XML form.
+* HTML::                        Publishing in HTML or XHTML form.
+* Ikiwiki::                     Integrating with ikiwiki.
+* Journal::                     Keeping a journal or blog.
+* LaTeX::                       Publishing LaTeX documents.
+* Poem::                        Publish a poem to LaTeX or PDF.
+* Texinfo::                     Publish entries to Texinfo format or PDF.
+* XML::                         Publish entries to XML.
+
+Integrating Muse and pyblosxom.cgi
+
+* Blosxom Requirements::        Other tools needed for the Blosxom style.
+* Blosxom Entries::             Format of a Blosxom entry and automation.
+* Blosxom Options::             Blosxom styles and options provided.
+
+Making your own publishing styles
+
+* Markup Functions::            Specifying functions to mark up text.
+* Markup Regexps::              Markup rules for publishing.
+* Markup Strings::              Strings specific to a publishing style.
+* Markup Tags::                 Tag specifications for special markup.
+* Style Elements::              Parameters used for defining styles.
+* Deriving Styles::             Deriving a new style from an existing
+                                  one.
+
+Miscellaneous add-ons, like a minor mode
+
+* Muse List Edit Minor Mode::   Edit lists easily in other major modes.
+
+\1f
+File: muse.info,  Node: Preface,  Next: Introduction,  Prev: Top,  Up: Top
+
+1 About the documentation
+*************************
+
+This document describes Muse, which was written by John Wiegley and is
+now maintained by Michael Olson.  Several versions of this manual are
+available on-line.
+
+   * PDF: http://mwolson.org/static/doc/muse.pdf
+
+   * HTML (single file): http://mwolson.org/static/doc/muse.html
+
+   * HTML (multiple files): http://mwolson.org/static/doc/muse/
+
+\1f
+File: muse.info,  Node: Introduction,  Next: Obtaining Muse,  Prev: Preface,  Up: Top
+
+2 What is Muse?
+***************
+
+Emacs Muse (also known as "Muse" or "Emacs-Muse") is an authoring and
+publishing environment for Emacs.  It simplifies the process of writing
+documents and publishing them to various output formats.
+
+   Muse consists of two main parts: an enhanced text-mode for authoring
+documents and navigating within Muse projects, and a set of publishing
+styles for generating different kinds of output.
+
+   What makes Muse distinct from other text-publishing systems is a
+modular environment, with a rather simple core, in which "styles" are
+derived from to create new styles.  Much of Muse's overall
+functionality is optional.  For example, you can use the publisher
+without the major-mode, or the mode without doing any publishing; or if
+you don't load the Texinfo or LaTeX modules, those styles won't be
+available.
+
+   The Muse codebase is a departure from emacs-wiki.el version 2.44. The
+code has been restructured and rewritten, especially its publishing
+functions.  The focus in this revision is on the authoring and
+publishing aspects, and the "wikiness" has been removed as a default
+behavior (available in the optional `muse-wiki' module).  CamelCase
+words are no longer special by default.
+
+   One of the principal aims in the development of Muse is to make it
+very easy to produce good-looking, standards-compliant documents.
+
+\1f
+File: muse.info,  Node: Obtaining Muse,  Next: Installation,  Prev: Introduction,  Up: Top
+
+3 How to Get Muse Releases and Development Changes
+**************************************************
+
+* Menu:
+
+* Releases::                    Released versions of Muse.
+* Development::                 Latest unreleased development changes.
+
+\1f
+File: muse.info,  Node: Releases,  Next: Development,  Prev: Obtaining Muse,  Up: Obtaining Muse
+
+3.1 Released versions of Muse
+=============================
+
+Choose to install a release if you want to minimize risk.
+
+   Errors are corrected in development first.  User-visible changes
+will be announced on the <muse-el-discuss@gna.org> mailing list.  *Note
+Getting Help and Reporting Bugs::.
+
+   Debian users can get Muse via apt-get.  The `muse-el' package is
+available both at Michael Olson's APT repository and the official Debian
+repository.  To make use of the former, add the following line to your
+`/etc/apt/sources.list' file and run `apt-get install muse'.
+
+     deb http://mwolson.org/debian/ ./
+
+   Ubuntu users can also get Muse via apt-get.  The `muse-el' package
+is available both at Michael Olson's APT repository and the official
+Ubuntu repository.  To make use of the former, add the following line to
+your `/etc/apt/sources.list' file and run `apt-get install muse'.
+
+     deb http://mwolson.org/ubuntu/ ./
+
+   The reason for making separate Debian and Ubuntu packages is that
+this manual is under the GFDL, and Debian will not allow it to be
+distributed in its main repository.  Ubuntu, on the other hand, permits
+this manual to be included with the `muse-el' package.
+
+   Alternatively, you can download the latest release from
+`http://download.gna.org/muse-el/' .
+
+\1f
+File: muse.info,  Node: Development,  Prev: Releases,  Up: Obtaining Muse
+
+3.2 Latest unreleased development changes
+=========================================
+
+Choose the development version if you want to live on the bleeding edge
+of Muse development or try out new features before release.
+
+   The git version control system allows you to keep up-to-date with the
+latest changes to the development version of Muse.  It also allows you
+to contribute changes (via commits, if you are have developer access to
+the repository, or via patches, otherwise).  If you would like to
+contribute to Muse development, it is highly recommended that you use
+git.
+
+   If you are new to git, you might find this tutorial helpful:
+`http://www.kernel.org/pub/software/scm/git/docs/tutorial.html'.
+
+   Downloading the Muse module with git and staying up-to-date involves
+the following steps.
+
+  1. Install git.
+
+        * Debian and Ubuntu: `apt-get install git-core'.
+
+        * Windows: `http://git.or.cz/gitwiki/WindowsInstall'.
+
+        * Other operating systems: download, compile, and install the
+          source from `http://www.kernel.org/pub/software/scm/git/', or
+          find a git package for your operating system.
+
+  2. Download the Muse development branch.
+
+     If you have developer access to Muse, do:
+
+          git clone ssh://repo.or.cz/srv/git/muse-el.git muse
+
+     otherwise, do:
+
+          git clone git://repo.or.cz/muse-el.git muse
+
+     If you are behind a restrictive firewall, and do not have developer
+     access, then do the following instead:
+
+          git clone http://repo.or.cz/r/muse-el.git muse
+
+  3. List upstream changes that are missing from your local copy.  Do
+     this whenever you want to see whether new changes have been
+     committed to Muse.  If you wish, you may skip this step and
+     proceed directly to the "update" step.
+
+          # Change to the source directory you are interested in.
+          cd muse
+
+          # Fetch new changes from the repository, but don't apply them yet
+          git fetch origin
+
+          # Display log messages for the new changes
+          git log HEAD..origin
+
+     "origin" is git's name for the location where you originally got
+     Muse from.  You can change this location at any time by editing the
+     `.git/config' file in the directory where the Muse source was
+     placed.
+
+  4. Update to the latest version by pulling in any missing changes.
+
+          cd muse
+          git pull origin
+
+     git will show how many files changed, and will provide a visual
+     display for how many lines were changed in each file.
+
+
+   There are other ways to interact with the Muse repository.
+
+   * Browse git repo: `http://repo.or.cz/w/muse-el.git'
+
+   * Latest development snapshot:
+     `http://mwolson.org/static/dist/muse-latest.tar.gz'
+
+   * Latest development snapshot (zip file):
+     `http://mwolson.org/static/dist/muse-latest.zip'
+
+   The latest development snapshot can lag behind the git repo by as
+much as 20 minutes, but never more than that.
+
+Becoming a Muse developer
+-------------------------
+
+If you want commit access to the shared Muse repository, then register
+an account at `http://repo.or.cz' (be sure to add an SSH key), and
+contact the current maintainer at <mwolson@gnu.org>.  It would be best
+to send some patches to the <muse-el-discuss@gna.org> mailing list
+first, so that he knows that you know what you are doing.  *Note
+Getting Help and Reporting Bugs::, for instructions on subscribing to
+the mailing list.
+
+   You must also be willing to sign a copyright assignment for your
+changes to Muse, since Muse is a GNU project.  The current maintainer
+will assist you in this process if you contact him.
+
+   For information on committing changes to Muse and performing
+development, please consult
+`http://emacswiki.org/cgi-bin/wiki/MuseDevelopment'.
+
+\1f
+File: muse.info,  Node: Installation,  Next: Getting Started,  Prev: Obtaining Muse,  Up: Top
+
+4 Compiling and Installing Muse
+*******************************
+
+Muse may be compiled and installed on your machine.
+
+Compilation
+-----------
+
+This is an optional step, since Emacs Lisp source code does not
+necessarily have to be byte-compiled.  Byte-compilation may yield a very
+slight speed increase.
+
+   A working copy of Emacs or XEmacs is needed in order to compile Emacs
+Muse.  By default, the program that is installed with the name `emacs'
+will be used.
+
+   If you want to use the `xemacs' binary to perform the compilation,
+you must copy `Makefile.defs.default' to `Makefile.defs' in the
+top-level directory, and then edit `Makefile.defs' as follows.  You can
+put either a full path to an Emacs or XEmacs binary or just the command
+name, as long as it is in the `PATH'.
+
+     EMACS    = xemacs
+     SITEFLAG = -no-site-file
+     # Edit the section as necessary
+     install_info = install-info --section "XEmacs 21.4" $(1).info \
+             $(INFODIR)/dir || :
+
+   Running `make' in the top-level directory should compile the Muse
+source files in the `lisp' directory, and generate an autoloads file in
+`lisp/muse-autoloads.el'.
+
+Installation
+------------
+
+Muse may be installed into your file hierarchy by doing the following.
+
+   Copy `Makefile.defs.default' to `Makefile.defs' in the top-level
+directory, if you haven't done so already.  Then edit the
+`Makefile.defs' file so that `ELISPDIR' points to where you want the
+source and compiled Muse files to be installed and `INFODIR' indicates
+where to put the Muse manual.  You may use a combination of `DESTDIR'
+and `PREFIX' to further determine where the installed files should be
+placed.  As mentioned earlier, you will want to edit `EMACS' and
+`SITEFLAG' as shown in the Compilation section if you are using XEmacs.
+
+   If you are installing Muse on a Debian or Ubuntu system, you might
+want to change the value of `INSTALLINFO' as specified in
+`Makefile.defs'.
+
+   If you wish to install Muse to different locations than the defaults
+specify, edit `Makefile.defs' accordingly.
+
+   Run `make' as a normal user, if you haven't done so already.
+
+   Run `make install' as the root user if you have chosen installation
+locations that require root permissions.
+
+ELPA
+----
+
+For those used to installing software packages, there will be a `muse'
+package available in the Emacs Lisp Package Archive (abbreviated
+"ELPA") as of the 3.10 release of Muse.  This package will be compiled
+and installed automatically in a user-specific location.  For more
+information on ELPA, see `http://tromey.com/elpa/'.
+
+\1f
+File: muse.info,  Node: Getting Started,  Next: Projects,  Prev: Installation,  Up: Top
+
+5 Getting Started
+*****************
+
+* Menu:
+
+* Loading Muse::                How to load Muse.
+* Using Muse Mode::             How to edit files in Muse.
+* Publishing Files Overview::   Publishing a single file or project.
+* File Extensions::             Using a different file extension.
+
+\1f
+File: muse.info,  Node: Loading Muse,  Next: Using Muse Mode,  Prev: Getting Started,  Up: Getting Started
+
+5.1 How to Load Muse
+====================
+
+To use Muse, add the directory containing its files to your `load-path'
+variable, in your `.emacs' file.  Then, load in the authoring mode, and
+the styles you wish to publish to.  An example follows.
+
+     (add-to-list 'load-path "<path to Muse>")
+
+     (require 'muse-mode)     ; load authoring mode
+
+     (require 'muse-html)     ; load publishing styles I use
+     (require 'muse-latex)
+     (require 'muse-texinfo)
+     (require 'muse-docbook)
+
+     (require 'muse-project)  ; publish files in projects
+
+   An easy way of seeing which settings are available and changing
+settings is to use the Muse customization interface.  To do this, type
+`M-x customize-group muse RET'.  Each of the options has its own
+documentation.  Options are grouped logically according to what effect
+they have.
+
+\1f
+File: muse.info,  Node: Using Muse Mode,  Next: Publishing Files Overview,  Prev: Loading Muse,  Up: Getting Started
+
+5.2 How to Edit Files in Muse
+=============================
+
+Muse Mode should automatically be activated when you visit a file with a
+".muse" extension.  One such file is `QuickStart.muse', which is
+available in the `examples' directory of the Muse distribution.  You
+can tell that Muse Mode has been activated by checking for the text
+"Muse" in your mode line.  If Muse Mode has not been activated, you may
+activate it by type `M-x muse-mode RET'.
+
+   You will notice that Muse files are highlighted very simply.  Links
+are colored blue, headings are large and bold text, and <example> tags
+are colored in grey.
+
+   There are several different ways to edit things like links, which
+hide the underlying Muse markup.  One way is to toggle font-locking off
+by hitting `C-c C-l', which is also `M-x font-lock-mode', make changes,
+and then hit `C-c C-l' again to toggle font-locking back on.  Another
+way is just to move into the text and edit it.  Markup can also be
+removed by normal deletion methods, though some side effects might
+require a second deletion.
+
+   For the particular case of editing links, it is easiest to move to
+the link and do `C-c C-e', which is also `M-x muse-edit-link-at-point'.
+This prompts you for the link and its description, using the previous
+contents of the link as initial values.  A link to another Muse file
+may be created by hitting `C-c TAB l'.  A link to a URL may be created
+by hitting `C-c TAB u'.  Links may be followed by hitting `RET' on them.
+
+   If you want to add a new list item, this may by accomplished by
+hitting `M-RET'.  This will put a dash and some spaces on the screen.
+The dash is the Muse markup that indicates a list item.  It is also
+possible to created "nested" lists with this command, by adjusting the
+number of spaces in front of the dashes.  If you have lists with long
+lines, you can move to a list item and hit `M-q' to wrap it onto
+multiple lines.
+
+\1f
+File: muse.info,  Node: Publishing Files Overview,  Next: File Extensions,  Prev: Using Muse Mode,  Up: Getting Started
+
+5.3 Publishing a Single File or Project
+=======================================
+
+The command `M-x muse-project-publish-this-file' will publish the
+current document to any available publishing style (a publishing style
+is an output format, like HTML or Docbook), placing the output in the
+current directory.  If you are in Muse Mode, this command will be bound
+to `C-c C-t'.  If the file has been published recently, and its
+contents have not changed, running `C-c C-t' again will not publish the
+file.  To force publishing in this case, do `C-u C-c C-t'.
+
+   If you have set up projects and are visiting a file that is part of a
+project, then `C-c C-t' will restrict the output formats to those which
+are used by the project, and will automatically publish to the output
+directory defined by the project.  If you want to publish to a
+different directory or use a different format, then use `C-c M-C-t',
+which is also `M-x muse-publish-this-file'.
+
+   If the currently opened file is part of a defined project in
+`muse-project-alist', it (and the rest of the changed files in a
+project) may be published using `C-c C-p'.
+
+\1f
+File: muse.info,  Node: File Extensions,  Prev: Publishing Files Overview,  Up: Getting Started
+
+5.4 Using a Different File Extension
+====================================
+
+By default, Muse expects all project files to have the file extension
+`.muse'. Files without this extension will not be associated with Muse
+mode and will not be considered part of any project, even if they are
+within a project directory.
+
+   If you don't want to use `.muse', you can customize the extension by
+setting the value of `muse-file-extension'.
+
+   If you don't want to use any extension at all, and want Muse to
+autodetect project files based on their location, then add the following
+to your Muse settings file.
+
+     (setq muse-file-extension nil
+           muse-mode-auto-p t)
+
+   Note that if you chose to have `muse-file-extension' set to `nil',
+you may have trouble if your `.emacs' file or other init scripts
+attempt to visit a Muse file.  (A very common example of this is if you
+use Planner with Muse and run `(plan)' from your `.emacs'.)  If you
+wish to visit Muse files from your `.emacs', be sure to also add the
+following additional code before any such visits happen:
+
+     (add-hook 'find-file-hooks 'muse-mode-maybe)
+
+\1f
+File: muse.info,  Node: Projects,  Next: Keystroke Summary,  Prev: Getting Started,  Up: Top
+
+6 Creating and Managing Muse Projects
+*************************************
+
+Often you will want to publish all the files within a directory to a
+particular set of output styles automatically.  To support, Muse allows
+for the creation of "projects".
+
+* Menu:
+
+* Single Project::              A single-project example.
+* Multiple Projects::           A multiple-project example.
+* Projects and Subdirectories::  Publishing subdirectories in projects.
+* Options for Projects::        Listing of available options for projects.
+
+\1f
+File: muse.info,  Node: Single Project,  Next: Multiple Projects,  Prev: Projects,  Up: Projects
+
+6.1 A Single-Project Example
+============================
+
+Here is a sample project, which may be defined in your `.emacs' file.
+
+     (setq muse-project-alist
+           '(("Website" ("~/Pages" :default "index")
+              (:base "html" :path "~/public_html")
+              (:base "pdf" :path "~/public_html/pdf"))))
+
+   The above defines a project named "website", whose files are located
+in the directory `~/Pages'.  The default page to visit is `index'.
+When this project is published, each page will be output as HTML to the
+directory `~/public_html', and as PDF to the directory
+`~/public_html/pdf'.  Within any project page, you may create a link to
+other pages using the syntax `[[pagename]]'.
+
+   If you would like to include only some files from a directory in a
+Muse project, you may use a regexp in place of `~/Pages' in the example.
+
+\1f
+File: muse.info,  Node: Multiple Projects,  Next: Projects and Subdirectories,  Prev: Single Project,  Up: Projects
+
+6.2 A Multiple-Project Example
+==============================
+
+It is possible to specify multiple projects.  Here is an example of
+three projects: a generic website, a projects area, and a day-planner
+(the day-planner part requires Planner Mode--see
+`http://wjsullivan.net/PlannerMode.html' to get it).
+
+     (setq muse-project-alist
+           '(("Website" ("~/Pages" :default "index")
+              (:base "html" :path "~/public_html"))
+             (("Projects" ("~/Projects" :default "index")
+              (:base "xhtml"
+                     :path "~/public_html/projects"
+                     :exclude "/TopSecret")
+              (:base "pdf"
+                     :path "~/public_html/projects/pdf"
+                     :exclude "/TopSecret")))
+             ("Plans" ("~/Plans"
+                       :default "TaskPool"
+                       :major-mode planner-mode
+                       :visit-link planner-visit-link)
+              (:base "planner-xhtml"
+                     :path "~/public_html/plans"))))
+
+   The `:major-mode' attribute specifies which major to use when
+visiting files in this directory.
+
+   The `:visit-link' attribute specifies the function to call when
+visiting links.
+
+   The `:exclude' attribute has a regexp that matches files to never
+publish.
+
+\1f
+File: muse.info,  Node: Projects and Subdirectories,  Next: Options for Projects,  Prev: Multiple Projects,  Up: Projects
+
+6.3 Publishing Subdirectories in Projects
+=========================================
+
+If you want to publish a directory and all of its subdirectories, Muse
+provides two convenience functions that together generate the proper
+rules for you.  Note that we use the backtick to begin this
+muse-project-alist definition, rather than a single quote.
+
+     (setq muse-project-alist
+           `(("Website" ("~/Pages" :default "index")
+              (:base "html" :path "~/public_html"))
+             ("Blog" (,@(muse-project-alist-dirs "~/Blog")
+                      :default "index")
+              ;; Publish this directory and its subdirectories.  Arguments
+              ;; are as follows.  The above `muse-project-alist-dirs' part
+              ;; is also needed.
+              ;;   1. Source directory
+              ;;   2. Output directory
+              ;;   3. Publishing style
+              ;;   remainder: Other things to put in every generated style
+              ,@(muse-project-alist-styles "~/Blog"
+                                           "~/public_html/blog"
+                                           "blosxom"))))
+
+   The `muse-project-alist-dirs' function takes a directory and returns
+it and all of its subdirectories in a list.
+
+   The `muse-project-alist-styles' function is explained by the
+comments above.
+
+   The "blosxom" text is the name of another publishing style, much like
+"html".  *Note Blosxom::, for further information about it.  You can
+use any publishing style you like for the third argument to
+`muse-project-alist-styles'.
+
+\1f
+File: muse.info,  Node: Options for Projects,  Prev: Projects and Subdirectories,  Up: Projects
+
+6.4 Listing of Available Options for Projects
+=============================================
+
+This is a listing of all of the various options (or, more accurately:
+attributes) that may be specified in `muse-project-alist'.
+
+   Each muse-project-alist entry looks like this:
+
+       (PROJECT-NAME (SOURCES)
+         OUTPUTS)
+
+   We refer to these names below.
+
+   "Attributes", which compose SOURCES and OUTPUTS, are a pair of
+values.  The first value is a keyword, like `:default'.  The second part
+is the value associated with that keyword, such as the text "index".
+If you are familiar with Emacs Lisp property lists, the concept is
+similar to that, except that in the SOURCES section, single directories
+can be interspersed with two-value attributes.
+
+Project Name
+------------
+
+This is a string that indicates the name of the project.  It is
+primarily used for publishing interwiki links with the `muse-wiki.el'
+module.
+
+Sources
+-------
+
+This part of a muse-project-alist entry consists of two-value
+attributes, and also directory names.  If you are publishing a book, the
+order of directories and attributes is significant.
+
+   The minimal content for the sources section is a list of directories.
+
+`:book-chapter'
+     Indicates a new chapter of a book.  The text of the title of the
+     chapter comes immediately after this keyword.
+
+`:book-end'
+     Indicates the end of a book.  Directories listed after this one are
+     ignored when publishing a book.  The value "t" (without quotes)
+     should come immediately after this keyword.
+
+`:book-funcall'
+     A function to call while publishing a book.  This is useful for
+     doing something just after a particular chapter.
+
+`:book-part'
+     Indicates the beginning of a new part of the book.  The text of the
+     title should come immediately after this keyword.
+
+`:book-style'
+     Indicate a particular publishing style to use for this part of the
+     book.  If this is specified, it should come just after a `:part'
+     attribute.
+
+`:default'
+     The default page to visit when browsing a project.  Also, if you
+     are using the `muse-wiki.el' module, publishing a link to just a
+     project's name will cause it to link to this default file.
+
+`:force-publish'
+     This specifies a list of pages which should be published every
+     time a project is published (by using `C-c C-p', for example),
+     regardless of whether their contents have changed.  This is useful
+     for updating Index pages, pages that use the <include> tag, and
+     other pages that have dynamically-generated content.
+
+`:major-mode'
+     This specifies the major mode to use when visiting files in this
+     project.  The default is `muse-mode'.
+
+`:nochapters'
+     This indicates that while publishing a book, do not automatically
+     create chapters.  Values which may follow this are nil (the
+     default, which means that we automatically create chapters), or
+     non-nil, which means that we manually specify chapters with the
+     `:book-chapter' attribute,
+
+`:publish-project'
+     Indicates which function we should call when publishing a project.
+
+`:set'
+     This specifies a list of variables and values to set when
+     publishing a project.  The list should be a property list, which
+     is in the form:
+
+          (VAR1 VALUE1 VAR2 VALUE2 ...)
+
+`:visit-link'
+     Specifies the function to call when visiting a link.  The default
+     is `muse-visit-link-default'.  The arguments for that function
+     should be (1) the link and (2) whether to visit the link in a new
+     window.
+
+
+Outputs
+-------
+
+This part of a muse-project-alist entry is composed of lists of
+attributes.  Each list is called an "output style".
+
+   The minimal content for an output style is a `:base' attribute and a
+`:path' attribute.
+
+`:base'
+     Publishing style to use, such as "html", "docbook", or "pdf".
+
+`:base-url'
+     An external URL which can be used to access published files.  This
+     is mainly used by the `muse-wiki' module when publishing links
+     between two separate projects, if the projects are served on
+     different domains.
+
+     It is also used by the `muse-journal' module to create the RSS or
+     RDF output.
+
+`:exclude'
+     Exclude items matching a regexp from being published.  The regexp
+     should usually begin with "/".
+
+`:include'
+     Only include items matching a regexp when publishing.  The regexp
+     should usually begin with "/".
+
+`:path'
+     The directory in which to store published files.
+
+`:timestamps'
+     A file containing the timestamps (that is, time of creation) for
+     files in this project.  It might eventually used by the
+     `muse-blosxom' module, but this option is not currently in use by
+     any Muse code.
+
+
+\1f
+File: muse.info,  Node: Keystroke Summary,  Next: Markup Rules,  Prev: Projects,  Up: Top
+
+7 Keys Used in Muse Mode
+************************
+
+This is a summary of keystrokes available in every Muse buffer.
+
+`C-c C-a (`muse-index')'
+     Display an index of all known Muse pages.
+
+`C-c C-b (`muse-find-backlinks')'
+     Find all pages that link to this page.
+
+`C-c C-e (`muse-edit-link-at-point')'
+     Edit link at point.
+
+`C-c C-f (`muse-project-find-file')'
+     Open another Muse page.  Prompt for the name.
+
+`C-c C-i l, C-c TAB l (`muse-insert-relative-link-to-file')'
+     Insert a link to a file interactively.
+
+`C-c C-i t, C-c TAB t (`muse-insert-tag')'
+     Insert a tag interactively.
+
+`C-c C-i u, C-c TAB u (`muse-insert-url')'
+     Insert a URL interactively.
+
+`C-c C-l (`font-lock-mode')'
+     Toggle font lock / highlighting for the current buffer.
+
+`C-c C-p (`muse-project-publish')'
+     Publish any Muse pages that have changed.
+
+`C-c C-s (`muse-search')'
+     Find text in all files of the current project.
+
+`C-c C-t (`muse-project-publish-this-file')'
+     Publish the currently-visited file.  Prompt for the style if the
+     current file can be published using more than one style.
+
+`C-c C-S-t, or C-c C-M-t (`muse-publish-this-file')'
+     Publish the currently-visited file.  Prompt for both the style and
+     output directory.
+
+`C-c C-v (`muse-browse-result')'
+     Show the published result of this page.
+
+`C-c = (`muse-what-changed')'
+     Diff this page against the last backup version.
+
+`TAB'
+     Move to the next Wiki reference.
+
+`S-TAB'
+     Move to the previous Wiki reference.
+
+`M-TAB'
+     Complete the name of a page from the current project at point.
+
+`M-RET'
+     Insert a new list item at point, indenting properly.
+
+`C-<'
+     Decrease the indentation of the list item at point.
+
+`C->'
+     Increase the indentation of the list item at point.
+
+`M-x muse-colors-toggle-inline-images RET'
+     Toggle display of inlined images on/off.
+
+`M-x muse-update-values RET'
+     Update various values that are automatically generated.
+
+     Call this after changing `muse-project-alist'.
+
+\1f
+File: muse.info,  Node: Markup Rules,  Next: Publishing Styles,  Prev: Keystroke Summary,  Up: Top
+
+8 Rules for Using Markup
+************************
+
+A Muse document uses special, contextual markup rules to determine how
+to format the output result.  For example, if a paragraph is indented,
+Muse assumes it should be quoted.
+
+   There are not too many markup rules, and all of them strive to be as
+simple as possible so that you can focus on document creation, rather
+than formatting.
+
+* Menu:
+
+* Paragraphs::                  Paragraphs: centering and quoting.
+* Headings::                    Levels of headings.
+* Directives::                  Directives at the beginning of a
+                                  document.
+* Emphasizing Text::            Bold, italicized, and underlined text.
+* Footnotes::                   Making notes to be shown at the end.
+* Verse::                       Indicating poetic stanzas.
+* Lists::                       Lists of items.
+* Tables::                      Generation of data tables.
+* Explicit Links::              Hyperlinks and email addresses with
+                                  descriptions.
+* Implicit Links::              Bare URLs, WikiNames, and InterWiki
+                                  links.
+* Images::                      Publishing and displaying images.
+* Horizontal Rules and Anchors::  Inserting a horizontal line or anchor.
+* Embedded Lisp::               Evaluating Emacs Lisp code in documents
+                                  for extensibility.
+* Citations::                   Support for citing other resources.
+* Comments::                    Lines to omit from published output.
+* Tag Summary::                 Tags that Muse recognizes.
+
+\1f
+File: muse.info,  Node: Paragraphs,  Next: Headings,  Prev: Markup Rules,  Up: Markup Rules
+
+8.1 Paragraphs: centering and quoting
+=====================================
+
+Paragraphs in Muse must be separated by a blank line.
+
+Centered paragraphs and quotations
+----------------------------------
+
+A line that begins with six or more columns of whitespace (either tabs
+or spaces) indicates a centered paragraph.  Alternatively, you can use
+the <center> tag to surround regions that are to be published as
+centered paragraphs.
+
+   But if a line begins with whitespace, though less than six columns,
+it indicates a quoted paragraph.  Alternatively, you can use the
+<quote> tag to surround regions that are to be published as quoted
+paragraphs.
+
+Literal paragraphs
+------------------
+
+The <example> tag is used for examples, where whitespace should be
+preserved, the text rendered in monospace, and any characters special
+to the output style escaped.
+
+   There is also the <literal> tag, which causes a marked block to be
+entirely left alone.  This can be used for inserting a hand-coded HTML
+blocks into HTML output, for example.
+
+   If you want some text to only be inserted when publishing to a
+particular publishing style, use the `style' attribute for the
+<literal> tag.  An example follows.
+
+     <literal style="latex">
+     A LaTeX-based style was used in the publishing of this document.
+     </literal>
+
+   This will leave the region alone if the current publishing style is
+"latex" or based on "latex", such as "pdf", and delete the region
+otherwise.  It is also possible to leave the text alone only for one
+particular style, rather than its derivations, by adding `exact="t"' to
+the tag.
+
+Line breaks
+-----------
+
+If you need a line break, then use the `<br>' tag.  Most of the time
+this tag is unnecessary, because Muse will automatically detect
+paragraphs by means of blank lines.  If you want to preserve newlines in
+several lines of text, then use verse markup instead (*note Verse::).
+
+\1f
+File: muse.info,  Node: Headings,  Next: Directives,  Prev: Paragraphs,  Up: Markup Rules
+
+8.2 Levels of headings
+======================
+
+A heading becomes a chapter or section in printed output - depending on
+the style.  To indicate a heading, start a new paragraph with one or
+more asterices, followed by a space and the heading title.  Then begin
+another paragraph to enter the text for that section.
+
+   All levels of headings will be published.  Most publishing styles
+only distinguish the between the first 4 levels, however.
+
+     * First level
+
+     ** Second level
+
+     *** Third level
+
+     **** Fourth level
+
+\1f
+File: muse.info,  Node: Directives,  Next: Emphasizing Text,  Prev: Headings,  Up: Markup Rules
+
+8.3 Directives at the beginning of a document
+=============================================
+
+Directives are lines beginning with the `#' character that come before
+any paragraphs or sections in the document.  Directives are of the form
+"#directive content of directive".  You can use any combination of
+uppercase and lowercase letters for directives, even if the directive
+is not in the list below.
+
+   The `muse-publishing-directive' function may be used in header and
+footer text to access directives.  For example, to access the `#title'
+directive, use `(muse-publishing-directive "title")'.
+
+   The following is a list of directives that Muse uses.
+
+`#author'
+     The author of this document.
+
+     If this is not specified, Muse will attempt to figure it out from
+     the `user-full-name' variable.
+
+`#date'
+     The date that the document was last modified.
+
+     This is used by publishing styles that are able to embed the date
+     information.
+
+`#desc'
+     A short description of this document.
+
+     This is used by the `journal' publishing style to embed information
+     inside of an RSS/RDF feed.
+
+`#title'
+     The title of this document.
+
+     If this is not specified, the name of the file is used.
+
+
+\1f
+File: muse.info,  Node: Emphasizing Text,  Next: Footnotes,  Prev: Directives,  Up: Markup Rules
+
+8.4 Bold, italicized, and underlined text
+=========================================
+
+To emphasize text, surround it with certain specially recognized
+characters.
+
+     *emphasis*
+     **strong emphasis**
+     ***very strong emphasis***
+     _underlined_
+     =verbatim and monospace=
+
+   While editing a Muse document in Muse mode, these forms of emphasis
+will be highlighted in a WYSIWYG manner.  Each of these forms may span
+multiple lines.
+
+   Verbatim text will be colored as gray by default.  To change this,
+customize `muse-verbatim-face'.
+
+   You can also use the <code> tag to indicate verbatim and monospace
+text.  This is handy for regions that have an "=" in them.
+
+\1f
+File: muse.info,  Node: Footnotes,  Next: Verse,  Prev: Emphasizing Text,  Up: Markup Rules
+
+8.5 Making notes to be shown at the end
+=======================================
+
+A footnote reference is simply a number in square brackets.  To define
+the footnote, place this definition at the bottom of your file.
+`footnote-mode' can be used to greatly facilitate the creation of these
+kinds of footnotes.
+
+   Footnotes are defined by the same number in brackets occurring at the
+beginning of a line.  Use footnote-mode's `C-c ! a' command, to very
+easily insert footnotes while typing.  Use `C-x C-x' to return to the
+point of insertion.
+
+\1f
+File: muse.info,  Node: Verse,  Next: Lists,  Prev: Footnotes,  Up: Markup Rules
+
+8.6 Indicating poetic stanzas
+=============================
+
+Poetry requires that whitespace be preserved, but without resorting to
+monospace.  To indicate this, use the following markup, reminiscent of
+email quotations.
+
+     > A line of Emacs verse;
+     >   forgive its being so terse.
+
+   You can also use the <verse> tag, if you prefer.
+
+     <verse>
+     A line of Emacs verse;
+       forgive its being so terse.
+     </verse>
+
+   Multiple stanzas may be included in one set of <verse> tags, as
+follows.
+
+     <verse>
+     A line of Emacs verse;
+       forgive its being so terse.
+
+     In terms of terse verse,
+       you could do worse.
+     </verse>
+
+\1f
+File: muse.info,  Node: Lists,  Next: Tables,  Prev: Verse,  Up: Markup Rules
+
+8.7 Lists of items
+==================
+
+Lists are given using special characters at the beginning of a line.
+Whitespace must occur before bullets or numbered items, to distinguish
+from the possibility of those characters occurring in a real sentence.
+
+   These are rendered as a bullet list.
+
+     Normal text.
+
+      - bullet item one
+      - bullet item two
+
+   An enumerated list follows.
+
+     Normal text.
+
+      1. Enum item one
+      2. Enum item two
+
+   Here is a definition list.
+
+     Term1 ::
+       This is a first definition
+       And it has two lines;
+       no, make that three.
+
+     Term2 :: This is a second definition
+
+Nested lists
+------------
+
+It is possible to nest lists of the same or different kinds.  The
+"level" of the list is determined by the amount of initial whitespace.
+
+     Normal text.
+
+      - Level 1, bullet item one
+        1. Level 2, enum item one
+        2. Level 2, enum item two
+      - Level 1, bullet item two
+        1. Level 2, enum item three
+        2. Level 2, enum item four
+           term :: definition
+
+Breaking list items
+-------------------
+
+If you want to break up a line within any list type, just put one blank
+line between the end of the previous line and the beginning of the next
+line, using the same amount of initial indentation.
+
+      - bullet item 1, line 1
+
+        bullet item 1, line 2
+
+        1. Enum line 1
+
+           Enum line 2
+
+      - bullet item 2, line 1
+
+        bullet item 2, line 2
+
+\1f
+File: muse.info,  Node: Tables,  Next: Explicit Links,  Prev: Lists,  Up: Markup Rules
+
+8.8 Generation of data tables
+=============================
+
+Only very simple tables are supported.  The syntax is as follows.
+
+     Double bars  || Separate header fields
+
+     Single bars   | Separate body fields
+     Here are more | body fields
+
+     Triple bars ||| Separate footer fields
+
+   Some publishing styles require header fields to come first, then
+footer fields, and then the body fields.  You can use any order for
+these sections that you like, and Muse will re-order them for you at
+publish-time.
+
+   If you wish to disable table generation for one Muse file, add the
+directive `#disable-tables t' to the top of the file.
+
+Other table formats
+-------------------
+
+It is possible to publish very basic Orgtbl-mode style tables.
+
+     | org  | style | table |
+     |------+-------+-------|
+     | one  |       | one   |
+     | two  | two   |       |
+     |      | three | three |
+     |------+-------+-------|
+     | more | stuff |       |
+
+   If you are used to the way that Org Mode publishes these tables, then
+customize `muse-html-table-attributes' to the following, in order to get
+a similar kind of output.
+
+     border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"
+
+   `table.el' style tables are also supported, as long as `table.el'
+itself supports outputting tables for a particular publishing style.
+At the time of this writing, the "html", "latex", and "docbook" styles
+are supported by `table.el'.  Styles derived from these styles will
+also work.
+
+     +---+-----+---+
+     |   | one | 1 |
+     +---+-----+---+
+     | b | two |   |
+     +---+-----+---+
+     | c |     | 3 |
+     +---+-----+---+
+
+\1f
+File: muse.info,  Node: Explicit Links,  Next: Implicit Links,  Prev: Tables,  Up: Markup Rules
+
+8.9 Hyperlinks and email addresses with descriptions
+====================================================
+
+A hyperlink can reference a URL, or another page within a Muse project.
+In addition, descriptive text can be specified, which should be
+displayed rather than the link text in output styles that supports link
+descriptions.  The syntax is as follows.
+
+     [[link target][link description]]
+     [[link target without description]]
+
+   Thus, the current maintainer's homepage for Muse can be found
+`[[http://mwolson.org/projects/EmacsMuse.html][here]]', or at
+`[[http://mwolson.org/projects/EmacsMuse.html]]'.
+
+\1f
+File: muse.info,  Node: Implicit Links,  Next: Images,  Prev: Explicit Links,  Up: Markup Rules
+
+8.10 Bare URLs, WikiNames, and InterWiki links
+==============================================
+
+A URL or email address encountered in the input text is published as a
+hyperlink.  These kind of links are called "implicit links" because
+they are not separated from the rest of the Muse document in any way.
+
+   Some characters in URLs will prevent Muse from recognizing them as
+implicit links. If you want to link to a URL containing spaces or any of
+the characters "][,"'`()<>^", you will have to make the link explicit.
+The punctuation characters ".,;:" are also not recognized as part of a
+URL when they appear at its end. For information on how to make an
+explicit link, see *note Hyperlinks and email addresses with
+descriptions: Explicit Links.
+
+   If the `muse-wiki' module is loaded, another form of implicit link
+will be made available.  WikiNames, which are typed in CamelCase, are
+highlighted and published as links, provided that the file they refer
+to exists.
+
+   Customization of WikiName recognition may be accomplished by editing
+the `muse-wiki-wikiword-regexp' option and subsequently running
+`(muse-configure-highlighting 'muse-colors-markupmuse-colors-markup)'.
+If you use the Customize interface, the latter will be done
+automatically.
+
+   The `muse-wiki' module also allows for InterWiki links.  These are
+similar to WikiWords, but they specify both the project and page of a
+file.  The names of your project entries in `muse-project-alist' will
+be used as InterWiki names by default.  Several examples follow.
+
+     Blog::DocumentingMuse
+     Projects#EmacsMuse
+     Website
+
+   In the first case, the interwiki delimiter is `::', `Blog' is the
+project name, and `DocumentingMuse' is the page name.  In the second
+example, `#' is the interwiki delimiter.  If the name of a project
+occurs by itself in text, like the third case, it will be colorized and
+published as a link to the default page of the given project.
+
+   Customization of interwiki links may be accomplished by editing the
+`muse-wiki-interwiki-alist' option.
+
+   It is also possible to link to an anchor in an interwiki document.
+This is called a "three-part link".  Examples of this follow.
+
+     Blog::DocumentingMuse#anchor1
+     Projects#EmacsMuse#anchor2
+
+\1f
+File: muse.info,  Node: Images,  Next: Horizontal Rules and Anchors,  Prev: Implicit Links,  Up: Markup Rules
+
+8.11 Publishing and displaying images
+=====================================
+
+Image links
+-----------
+
+Links to images may be used in either the target or the description, or
+both.  Thus, the following code will publish as a clickable image that
+points to `http://mwolson.org/'.
+
+     [[http://mwolson.org/][/static/logos/site-logo.png]]
+
+   Normally, images in the link part will be inlined.
+
+   If you want these images to be published as links instead, place the
+text "URL:" immediately in front of the link text.  An example follows.
+
+     [[URL:http://mwolson.org/static/logos/site-logo.png]]
+
+Displaying images in Muse mode
+------------------------------
+
+If a link to a locally-available image is encountered in the link
+description, Muse mode will attempt to display it if your version of
+Emacs permits this.
+
+   This behavior may be toggled with `C-c C-i', or disabled permanently
+by setting the `muse-colors-inline-images' option to `nil'.
+
+   The method for finding images may be altered by customizing the
+`muse-colors-inline-image-method' option.  One useful value for this
+option is `muse-colors-use-publishing-directory', which tells Muse mode
+to look in the directory where the current file will be published.  The
+default is to look in the current directory.  Relative paths like
+`../pics/' should work for either setting.
+
+   Eventually, it is hoped that Muse will be able to copy images from
+the a "source" directory to a publishing directory by customizing
+`muse-project-alist', but this has not been implemented yet.
+
+Publishing simple images
+------------------------
+
+The following example will display correctly and publish correctly if a
+PNG file called `TestLogo.png' exists in the `../pics/' directory.  If
+text is on the same line as the picture, it will remain so in the
+output.
+
+     [[../myimage.png]]
+
+Publishing images with captions
+-------------------------------
+
+If you want to add a caption to an image, use the following syntax.
+This will center the image (if the output format supports it) and add a
+centered caption below the picture.  Formats that do not support
+centering the image will instead leave it against the left margin.
+
+     [[../pics/mycat.png][My cat Dexter]]
+
+   Images with captions may only occur in their own paragraphs, with no
+text on the same line.  Otherwise, the published output will not be
+syntactically correct.
+
+\1f
+File: muse.info,  Node: Horizontal Rules and Anchors,  Next: Embedded Lisp,  Prev: Images,  Up: Markup Rules
+
+8.12 Inserting a horizontal line or anchor
+==========================================
+
+Horizontal Rules
+----------------
+
+Four or more dashes indicate a horizontal rule.  Be sure to put blank
+lines around it, or it will be considered part of the proceeding or
+following paragraph!
+
+Anchors
+-------
+
+If you begin a line with "#anchor" - where "anchor" can be any word
+that doesn't contain whitespace - it defines an anchor at that point
+into the document.  This point can be referenced using "page#anchor" as
+the target in a Muse link.
+
+\1f
+File: muse.info,  Node: Embedded Lisp,  Next: Citations,  Prev: Horizontal Rules and Anchors,  Up: Markup Rules
+
+8.13 Evaluating Emacs Lisp code in documents for extensibility
+==============================================================
+
+Arbitrary kinds of markup can be achieved using the <lisp> tag.  With
+the <lisp> tag, you may generate whatever output text you wish.  The
+inserted output will get marked up if the <lisp> tag appears within the
+main text of the document.
+
+     <lisp>(concat "This form gets " "inserted")</lisp>
+
+   Note that you should not use the `insert' command within a set of
+<lisp> tags, since the return value from the <lisp> tags will be
+automatically inserted into the document.
+
+   It is also possible to treat the output as if it were surrounded by
+the <example>, <src>, or <verse> tags, by specifying "example", "src",
+or "verse" as the `markup' attribute of the <lisp> tag.
+
+     <lisp markup="example">
+     (concat "Insert" " me")
+     </lisp>
+
+   Other languages also have tags that cause source code to be
+evaluated.  *Note Tag Summary::, for details.
+
+\1f
+File: muse.info,  Node: Citations,  Next: Comments,  Prev: Embedded Lisp,  Up: Markup Rules
+
+8.14 Support for citing other resources
+=======================================
+
+Example
+-------
+
+Here is an example of what citations look like in a Muse document.
+
+     #bibsource REFDB
+
+     * Title
+     ** Subtitle
+
+     Some text before <cite>Miller1999</cite> and after the citation.
+
+     This is an author-only citation <cite type="author">Miller1999</cite>.
+
+     And this is a year-only citation <cite type="year">Miller1999</cite>.
+
+     Finally, this is a multi-head citation
+     <cite>Miller1999,Andrews2005</cite>.
+
+Overview
+--------
+
+The `#bibsource' directive defines the source of the bibliographies.
+The following sources are possible.
+
+   * DocBook + RefDB: the string "REFDB"
+
+   * LaTeX + bibtex: the name of an appropriate bibtex file
+
+   * LaTeX + RefDB: if the input file is called "foo.muse", then set
+     this to "foo.bib"
+
+   Citations are encoded as <cite> elements which enclose the citation
+keys as they are defined in the bibliography file or database.  In
+multi-head citations, the citation keys have to be separated by colons
+or semicolons.  The `latex' and `docbook' styles translate these to the
+proper separator automatically.
+
+   The <cite> elements take an optional "type" attribute that defines
+how the citation is rendered.  If the attribute is missing, you'll get
+a regular citation according to the bibliography style, e.g." (Miller
+et al., 1999)".  If the attribute is set to "author", only the name of
+the author(s) will be rendered.  Accordingly, "year" will cause the
+year to be printed.  This is useful to create citations like this:
+
+     Miller et al. had already shown in a previous publication (1999) that
+     this is not going to work.
+
+   Remember that refdb-mode (the Emacs interface to RefDB) can retrieve
+references by simply marking the citation key and running the
+`refdb-getref-by-field-on-region' command.  Later versions of
+`refdb-mode' will also allow to insert references as Muse citations
+(which is already implemented for DocBook, TEI, and LaTeX documents).
+
+   You may have noticed that there is no element to indicate the
+position of the bibliography.  The latter is always created at a valid
+position close to the end of the document.  The functions
+`muse-docbook-bibliography' and `muse-latex-bibliography' are called in
+the header or footer to generate this content, so it is possible to
+change the exact position.
+
+\1f
+File: muse.info,  Node: Comments,  Next: Tag Summary,  Prev: Citations,  Up: Markup Rules
+
+8.15 Lines to omit from published output
+========================================
+
+Use the following syntax to indicate a comment.  Comments will not be
+published.
+
+     ; Comment text goes here.
+
+   That is, only a semi-colon at the beginning of a line, followed by a
+literal space, will cause that line to be treated as a comment.
+
+   You can alternatively surround the region with the <comment> tag.
+
+   If you wish the comment to be published, but just commented out using
+the comment syntax of the output format, then set
+`muse-publish-comments-p' to non-nil.
+
+\1f
+File: muse.info,  Node: Tag Summary,  Prev: Comments,  Up: Markup Rules
+
+8.16 Tags that Muse recognizes
+==============================
+
+Muse has several built-in tags that may prove useful during publishing.
+*Note muse-publish-markup-tags::, to see how to customize the tags that
+Muse uses, as well as make your own tags.
+
+   Only a small subset of these tags are available in header and footer
+text.  The `muse-publish-markup-header-footer-tags' option lists the
+tags that are allowed in headers and footers.
+
+Syntax
+------
+
+If a tag takes arguments, it will look like this, where "tagname" is
+the name of the tag.
+
+     <tagname arg1="string1" arg2="string2">
+
+   If you want the tag to look like it came straight from an XHTML
+document, you can alternatively do the following.
+
+     <tagname arg1="string1" arg2="string2" />
+
+   If a tag surrounds some text, it will look like this.
+
+     <tagname>Some text</tagname>
+
+   If a tag surrounds a large region, it will look like this.
+
+     <tagname>
+     Some text.
+     Some more text.
+     </tagname>
+
+Tag listing
+-----------
+
+This is the complete list of tags that Muse accepts, including those
+that were mentioned in previous sections.
+
+`<br>'
+     Insert a line break.
+
+     Muse will automatically detect paragraphs when publishing by means
+     of blank lines, so this tag is usually unnecessary.
+
+`<cite>'
+     Insert a citation to another source.
+
+     This takes the argument `type', which indicates the type of
+     citation.  The valid types are "author" and "year".  If this
+     argument is omitted, include both author and year in the citation.
+
+     The bibliography to use for the citation may be specified by the
+     `#bibsource' directive.
+
+     *Note Citations::, for additional information.
+
+`<class>'
+     If publishing to HTML, surround the given text with a <span> tag.
+     It takes one argument called "name" that specifies the "class"
+     attribute of the <span> tag.
+
+     If publishing to a different format, do nothing extra to the text.
+
+`<code>'
+     Treat the text surrounded by the tag as if they were enclosed in
+     equal signs, that is, make it monospace.
+
+`<command>'
+     Run a command on the region, replacing the region with the result
+     of the command.  The command is specified with the "interp"
+     argument.  If no value for "interp" is given, pass the entire
+     region to the shell.
+
+     The "markup" argument controls how this section is marked up.
+
+     If it is omitted, publish the region with the normal Muse rules.
+
+     If "nil", do not mark up the region at all, but prevent Muse from
+     further interpreting it.
+
+     If "example", treat the region as if it was surrounded by the
+     <example> tag.
+
+     If "src", treat the included text as if it was surrounded by the
+     <src> tag.  You should also specify the "lang" attribute if doing
+     this.
+
+     If "verse", treat the region as if it was surrounded by the
+     <verse> tag, to preserve newlines.
+
+     Otherwise, it should be the name of a function to call, with the
+     buffer narrowed to the region.
+
+`<comment>'
+     Treat the entire region as a comment.  If the option
+     MUSE-PUBLISH-COMMENTS-P is nil, delete the region, otherwise
+     publish it using the comment syntax of the current publishing
+     style.
+
+`<contents>'
+     Publish a Table of Contents.  This will either be inserted
+     in-place or at the beginning of the document, depending on your
+     publishing style.  It does not have a delimiting tag.
+
+     By default, only 2 levels of headings will be included in the
+     generated Table of Contents.  To change this globally, customize
+     the MUSE-PUBLISH-CONTENTS-DEPTH option.  To change this only for
+     the current tag, use the "depth" argument.
+
+`<div>'
+     Insert a <div> tag into HTML documents, and do not insert anything
+     special for other non-HTML publishing formats.
+
+     If the "style" argument is provided, include it with the published
+     <div> tag.  Likewise for the "id" argument.
+
+`<example>'
+     Publish the region in monospace, preserving the newlines in the
+     region.  This is useful for snippets of code.
+
+`<include>'
+     Insert the given file at the current location during publishing.
+     The basic use of this tag is as follows, replacing "included_file"
+     with the name of the file that you want to include.
+
+          <include file="included_file">
+
+     The "markup" argument controls how this section is marked up.
+
+     If it is omitted, publish the included text with the normal Muse
+     rules.
+
+     If "nil", do not mark up the included text at all.
+
+     If "example", treat the included text as if it was surrounded by
+     the <example> tag.
+
+     If "src", treat the included text as if it was surrounded by the
+     <src> tag.  You should also specify the "lang" attribute if doing
+     this.
+
+     If "verse", treat the included text as if it was surrounded by the
+     <verse> tag, to preserve newlines.
+
+     Otherwise, it should be the name of a function to call after
+     inserting the file with the buffer narrowed to the section
+     inserted.
+
+`<lisp>'
+     Evaluate the Emacs Lisp expressions between the initial and ending
+     tags.  The result is then inserted into the document, so you do
+     not need to explicitly call `insert'.  All text properties are
+     removed from the resulting text.
+
+     This tag takes the "markup" argument.  See the description of
+     <command> for details.
+
+`<literal>'
+     Make sure that the text enclosed by this tag is published without
+     escaping it in any way.  This is useful for inserting markup
+     directly into the published document, when Muse does not provide
+     the desired functionality.
+
+`<markup>'
+     Mark up the text between the initial and ending tags.  The markup
+     command to use may be specified by the "function" argument.  The
+     standard Muse markup routines are used by default if no "function"
+     argument is provided.
+
+     This is useful for marking up regions in headers and footers.  One
+     example that comes to mind is generating a published index of all
+     of the files in the current project by doing the following.
+
+          <markup><lisp>(muse-index-as-string t t)</lisp></markup>
+
+`<perl>'
+     Run the `perl' language interpreter on the region, replacing the
+     region with the result of the command.
+
+     This tag takes the "markup" argument.  See the description of
+     <command> for details.
+
+`<python>'
+     Run the `python' language interpreter on the region, replacing the
+     region with the result of the command.
+
+     This tag takes the "markup" argument.  See the description of
+     <command> for details.
+
+`<quote>'
+     Publish the region as a blockquote.  This will either be inserted
+     in-place or at the beginning of the document, depending on your
+     publishing style.  It does not have a delimiting tag.
+
+`<ruby>'
+     Run the `ruby' language interpreter on the region, replacing the
+     region with the result of the command.
+
+     This tag takes the "markup" argument.  See the description of
+     <command> for details.
+
+`<src>'
+     Publish the region using htmlize.  The language to use may be
+     specified by the "lang" attribute.
+
+     Muse will look for a function named LANG-mode, where LANG is the
+     value of the "lang" attribute.
+
+     This tag requires htmlize 1.34 or later in order to work.  If this
+     is not satisfied, or the current publishing style is not
+     HTML-based, Muse will publish the region like an <example> tag.
+
+`<verbatim>'
+     This is used when you want to prevent Muse from trying to
+     interpret some markup.  Surround the markup in <verbatim> and
+     </verbatim>, and it will not be interpreted.
+
+     This tag was used often in previous versions of Muse because they
+     did not support whole-document escaping of specials.  Now, it will
+     only be needed for other tags, and perhaps footnotes as well.
+
+`<verse>'
+     Preserve the newlines in the region.  In formats like HTML,
+     newlines are removed by default, hence the need for this tag.  In
+     other publishing styles, this tag may cause the text to be
+     indented slightly in a way that looks nice for poetry and prose.
+
+
+\1f
+File: muse.info,  Node: Publishing Styles,  Next: Extending Muse,  Prev: Markup Rules,  Up: Top
+
+9 Publishing Various Types of Documents
+***************************************
+
+One of the principle features of Muse is the ability to publish a simple
+input text to a variety of different output styles.  Muse also makes it
+easy to create new styles, or derive from an existing style.
+
+* Menu:
+
+* Blosxom::                     Integrating Muse and pyblosxom.cgi.
+* Book::                        Publishing entries into a compilation.
+* ConTeXt::                     Publishing ConTeXt documents.
+* DocBook::                     Publishing in DocBook XML form.
+* HTML::                        Publishing in HTML or XHTML form.
+* Ikiwiki::                     Integrating with ikiwiki.
+* Journal::                     Keeping a journal or blog.
+* LaTeX::                       Publishing LaTeX documents.
+* Poem::                        Publish a poem to LaTeX or PDF.
+* Texinfo::                     Publish entries to Texinfo format or PDF.
+* XML::                         Publish entries to XML.
+
+\1f
+File: muse.info,  Node: Blosxom,  Next: Book,  Prev: Publishing Styles,  Up: Publishing Styles
+
+9.1 Integrating Muse and pyblosxom.cgi
+======================================
+
+The Blosxom publishing style publishes a tree of categorised files to a
+mirrored tree of stories to be served by blosxom.cgi or pyblosxom.cgi.
+In other words, each blog entry corresponds with one file.
+
+* Menu:
+
+* Blosxom Requirements::        Other tools needed for the Blosxom style.
+* Blosxom Entries::             Format of a Blosxom entry and automation.
+* Blosxom Options::             Blosxom styles and options provided.
+
+\1f
+File: muse.info,  Node: Blosxom Requirements,  Next: Blosxom Entries,  Prev: Blosxom,  Up: Blosxom
+
+9.1.1 Other tools needed for the Blosxom style
+----------------------------------------------
+
+You will need to have `pyblosxom.cgi' or `blosxom.cgi' installed on a
+machine that you have upload access to.
+
+   The major difficulty in both of these programs is specifying the
+date of the entries.  Both programs rely on the file modification time
+rather than any data contained in the entries themselves.  A plugin is
+needed in order for these programs to be able to get the correct date.
+
+PyBlosxom
+---------
+
+There are two different ways of accomplishing this in pyblosxom.  The
+first way involves gathering the timestamps (as specified by the
+`#date' directive) into one file and then sending that file along with
+published entries to the webserver.
+
+   The second will read each file at render time and parse the
+`#postdate' directive.  Muse will translate the `#date' directive into
+`#postdate' at publish time, so you don't have to do any extra work.
+
+Placing timestamps in one file
+..............................
+
+The following additional components are required in order to make the
+date of blog entries display as something sensible.
+
+  1. A script to gather date directives from the entire blog tree into a
+     single file.  The file must associate a blog entry with a date.
+
+  2. A plugin for (py)blosxom that reads this file.
+
+   These 2 things are provided for `pyblosxom.cgi' in the
+`contrib/pyblosxom' subdirectory.  `getstamps.py' provides the former
+service, while `hardcodedates.py' provides the latter service.
+
+   Here is a sample listing from my `timestamps' file, which maps each
+file to a date.  This can really be in any format, as long as your
+date-gathering script and your plugin can both understand it.
+
+     2005-04-01-14-16 personal/paper_cranes
+     2005-03-21 personal/spring_break_over
+     2004-10-24 personal/finished_free_culture
+
+   The script `contrib/pyblosxom/make-blog' demonstrates how to call
+`getstamps.py'.  Note that you will need to set the current directory
+to where your Muse files are, execute `getstamps.py', and then move the
+generated timestamps file to your publishing directory.
+
+Getting timestamp from entry while rendering
+............................................
+
+Alternately, the pyblosxom metadate plugin may be used.  On the plus
+side, there is no need to run a script to gather the date.  On the
+downside, each entry is read twice rather than once when the page is
+rendered.  Set the value of `muse-blosxom-use-metadate' to non-nil to
+enable adding a `#postdate' directive to all published files.  You can
+do this by:
+
+     M-x customize-variable RET muse-blosxom-use-metadate RET
+
+   With the metadate plugin installed in pyblosxom, the date set in this
+directive will be used instead of the file's modification time.  The
+plugin is included with Muse at `contrib/pyblosxom/metadate.py'.
+
+Blosxom
+-------
+
+It is also possible to use Blosxom, which is written in Perl, to serve
+blog entries that were published with Muse.  The steps are as follows.
+
+  1. Download and install blosxom from
+     `http://blosxom.sourceforge.net/'.
+
+  2. Install the metadate plugin.  It is available in
+     `contrib/blosxom/metadate_0_0_3'.
+
+  3. Every time you make a new blog entry, change to the blosxom data
+     directory and execute the `contrib/blosxom/getstamps.pl' script.
+     This script has only recently been made, and may still have some
+     bugs, so use with caution.
+
+
+\1f
+File: muse.info,  Node: Blosxom Entries,  Next: Blosxom Options,  Prev: Blosxom Requirements,  Up: Blosxom
+
+9.1.2 Format of a Blosxom entry and automation
+----------------------------------------------
+
+Each Blosxom file must include `#date yyyy-mm-dd', or optionally the
+longer `#date yyyy-mm-dd-hh-mm', a title (using the `#title'
+directive), plus whatever normal content is desired.
+
+   The date directive is not used directly by `pyblosxom.cgi' or this
+program.  You need to have the two additional items from the former
+section to make use of this feature.
+
+   There is a function called `muse-blosxom-new-entry' that will
+automate the process of making a new blog entry.  To make use of it, do
+the following.
+
+   * Customize `muse-blosxom-base-directory' to the location that your
+     blog entries are stored.
+
+   * Assign the `muse-blosxom-new-entry' function to a key sequence.  I
+     use the following code to assign this function to `C-c p l''.
+
+          (global-set-key "\C-cpl" 'muse-blosxom-new-entry)
+
+   * You should create your directory structure ahead of time under
+     your base directory.  These directories, which correspond with
+     category names, may be nested.
+
+   * When you enter this key sequence, you will be prompted for the
+     category of your entry and its title.  Upon entering this
+     information, a new file will be created that corresponds with the
+     title, but in lowercase letters and having special characters
+     converted to underscores.  The title and date directives will be
+     inserted automatically.
+
+\1f
+File: muse.info,  Node: Blosxom Options,  Prev: Blosxom Entries,  Up: Blosxom
+
+9.1.3 Blosxom styles and options provided
+-----------------------------------------
+
+The following styles and options are available in the Blosxom publishing
+style.
+
+Styles provided
+---------------
+
+`blosxom-html'
+     Publish Blosxom entries in HTML form.
+
+`blosxom-xhtml'
+     Publish Blosxom entries in XHTML form.
+
+
+Options provided
+----------------
+
+`muse-blosxom-extension'
+     Default file extension for publishing Blosxom files.
+
+`muse-blosxom-header'
+     Header used for publishing Blosxom files.
+
+     This may be text or a filename.
+
+`muse-blosxom-footer'
+     Footer used for publishing Blosxom files.
+
+     This may be text or a filename.
+
+`muse-blosxom-base-directory'
+     Base directory of blog entries, used by `muse-blosxom-new-entry'.
+
+     This is the top-level directory where your blog entries may be
+     found locally.
+
+
+\1f
+File: muse.info,  Node: Book,  Next: ConTeXt,  Prev: Blosxom,  Up: Publishing Styles
+
+9.2 Publishing entries into a compilation
+=========================================
+
+This publishing style is used to output "books" in LaTeX or PDF format.
+
+   Each page will become a separate chapter in the book, unless the
+style keyword `:nochapters' is used, in which case they are all run
+together as if one giant chapter.
+
+   One way of publishing a book is to make a project for it, add the
+project to `muse-project-alist', and use the `book-pdf' style with a
+very specific `:include' value to specify some page whose contents will
+be checked for the values of `#title' and `#date', and whose name will
+be used in the output file.  Then to publish the book, visit the
+aforementioned page and use `C-c C-t' or `C-c C-p' to trigger the
+publishing process.  An example `muse-project-alist' for this method
+follows.
+
+     (setq muse-project-alist
+           '(("MyNotes" (:nochapters t  ; do automatically add chapters
+                         :book-chapter "Computer Science"
+                         "~/Notes/cs"
+                         :book-chapter "Mathematics"
+                         "~/Notes/math"
+                         :book-chapter "Emacs"
+                         "~/Notes/emacs"
+                         :book-end t ; the rest will not be placed in the book
+                         "~/Notes"   ; so we can find the notes-anthology page
+                         "~/Notes/private"
+                         :force-publish ("index")
+                         :default "index")
+              (:base "book-pdf"
+                     :include "/notes-anthology[^/]*$"
+                     :path "~/public_html/notes")
+              ;; other publishing styles for each directory go here,
+              ;; if desired
+              )))
+
+   In this example, there would be a file called
+`~/Notes/notes-anthology.muse', which would contain just the following.
+The resulting book would be published to
+`~/public_html/notes/notes-anthology.pdf'.
+
+     #title My Technology Ramblings
+
+   Another way is to call the `muse-book-publish-project' function
+manually, with a custom project entry.  An example of this may be found
+in John Wiegley's configuration file at `examples/johnw/muse-init.el',
+in the `muse-publish-my-books' function.
+
+Styles provided
+---------------
+
+`book-latex'
+     Publish a book in LaTeX form.  The header and footer are different
+     than the normal LaTeX publishing mode.
+
+`book-pdf'
+     Publish a book in PDF form.  The header and footer are different
+     than the normal PDF publishing mode.
+
+
+Options provided
+----------------
+
+`muse-book-before-publish-hook'
+     A hook run in the book buffer before it is marked up.
+
+`muse-book-after-publish-hook'
+     A hook run in the book buffer after it is marked up.
+
+`muse-book-latex-header'
+     Header used for publishing books to LaTeX.
+
+     This may be text or a filename.
+
+`muse-book-latex-footer'
+     Footer used for publishing books to LaTeX.
+
+     This may be text or a filename.
+
+
+\1f
+File: muse.info,  Node: ConTeXt,  Next: DocBook,  Prev: Book,  Up: Publishing Styles
+
+9.3 Publishing ConTeXt documents
+================================
+
+This publishing style is capable of producing ConTeXt or PDF documents.
+
+   If you wish to publish PDF documents based on ConTeXt, you will need
+to have it installed.  For Debian and Ubuntu, this can be accomplished
+by installing the "texlive" package.
+
+Styles provided
+---------------
+
+`context'
+     Publish a ConTeXt document.
+
+`context-pdf'
+     Publish a PDF document, using an external ConTeXt document
+     conversion tool.
+
+`context-slides'
+     Produce slides from a ConTeXt document.
+
+     Here is an example of a slide.
+
+          * First Slide
+
+          [[Some-sort-of-cute-image.png]]
+
+          ** A subheading
+
+           - A bullet point.
+           - Another bullet point.
+
+          * Second Slide
+
+          ... and so on
+
+`context-slides-pdf'
+     Publish a PDF document of ConTeXt slides.
+
+
+Options provided
+----------------
+
+`muse-context-extension'
+     Default file extension for publishing ConTeXt files.
+
+`muse-context-pdf-extension'
+     Default file extension for publishing ConTeXt files to PDF.
+
+`muse-context-pdf-program'
+     The program that is called to generate PDF content from ConTeXt
+     content.
+
+`muse-context-pdf-cruft'
+     Extensions of files to remove after generating PDF output
+     successfully.
+
+`muse-context-header'
+     Header used for publishing ConTeXt files.
+
+     This may be text or a filename.
+
+`muse-context-footer'
+     Footer used for publishing ConTeXt files.
+
+     This may be text or a filename.
+
+`muse-context-markup-regexps'
+     List of markup regexps for identifying regions in a Muse page.
+
+     For more on the structure of this list, *Note
+     muse-publish-markup-regexps::.
+
+`muse-context-markup-functions'
+     An alist of style types to custom functions for that kind of text.
+
+     For more on the structure of this list, *Note
+     muse-publish-markup-functions::.
+
+`muse-context-markup-strings'
+     Strings used for marking up text.
+
+     These cover the most basic kinds of markup, the handling of which
+     differs little between the various styles.
+
+`muse-context-slides-header'
+     Header for publishing a presentation (slides) using ConTeXt.
+
+     Any of the predefined modules, which are available in the
+     tex/context/base directory, can be used by writing a "module"
+     directive at the top of the Muse file; if no such directive is
+     provided, module pre-01 is used.  Alternatively, you can use your
+     own style ("mystyle", in this example) by replacing "\usemodule[]"
+     with "\input mystyle".
+
+     This may be text or a filename.
+
+`muse-context-slides-markup-strings'
+     Strings used for marking up text in ConTeXt slides.
+
+`muse-context-markup-specials-document'
+     A table of characters which must be represented specially.  These
+     are applied to the entire document, sans already-escaped regions.
+
+`muse-context-markup-specials-example'
+     A table of characters which must be represented specially.  These
+     are applied to example> regions.
+
+     With the default interpretation of <example> regions, no specials
+     need to be escaped.
+
+`muse-context-markup-specials-literal'
+     A table of characters which must be represented specially.  This
+     applies to =monospaced text= and <code> regions.
+
+`muse-context-markup-specials-url'
+     A table of characters which must be represented specially.  These
+     are applied to URLs.
+
+`muse-context-markup-specials-image'
+     A table of characters which must be represented specially.  These
+     are applied to image filenames.
+
+`muse-context-permit-contents-tag'
+     If nil, ignore <contents> tags.  Otherwise, insert table of
+     contents.
+
+     Most of the time, it is best to have a table of contents on the
+     first page, with a new page immediately following.  To make this
+     work with documents published in both HTML and ConTeXt, we need to
+     ignore the <contents> tag.
+
+     If you don't agree with this, then set this option to non-nil, and
+     it will do what you expect.
+
+
+\1f
+File: muse.info,  Node: DocBook,  Next: HTML,  Prev: ConTeXt,  Up: Publishing Styles
+
+9.4 Publishing in DocBook XML form
+==================================
+
+This publishing style is used to generate DocBook XML files.
+
+Styles provided
+---------------
+
+`docbook'
+     Publish a file in Docbook form.
+
+
+Options provided
+----------------
+
+This publishing style uses the same options for markup up special
+characters as the "xml" publishing style.  *Note XML::, for details.
+
+`muse-docbook-extension'
+     Default file extension for publishing DocBook XML files.
+
+`muse-docbook-header'
+     Header used for publishing DocBook XML files.
+
+     This may be text or a filename.
+
+`muse-docbook-footer'
+     Footer used for publishing DocBook XML files.
+
+     This may be text or a filename.
+
+`muse-docbook-markup-regexps'
+     List of markup rules for publishing a Muse page to DocBook XML.
+
+`muse-docbook-markup-functions'
+     An alist of style types to custom functions for that kind of text.
+
+`muse-docbook-markup-strings'
+     Strings used for marking up text.
+
+     These cover the most basic kinds of markup, the handling of which
+     differs little between the various styles.
+
+`muse-docbook-encoding-default'
+     The default Emacs buffer encoding to use in published files.  This
+     will be used if no special characters are found.
+
+`muse-docbook-charset-default'
+     The default DocBook XML charset to use if no translation is found
+     in `muse-xml-encoding-map'.
+
+
+\1f
+File: muse.info,  Node: HTML,  Next: Ikiwiki,  Prev: DocBook,  Up: Publishing Styles
+
+9.5 Publishing in HTML or XHTML form
+====================================
+
+This publishing style is capable of producing HTML or XHTML documents.
+
+Styles provided
+---------------
+
+`html'
+     Supports publishing to HTML 4.0 and HTML 4.01, Strict or
+     Transitional.
+
+`xhtml'
+     Supports publishing to XHTML 1.0 and XHTML 1.1, Strict or
+     Transitional.
+
+
+Options provided
+----------------
+
+If an HTML option does not have a corresponding XHTML option, it will
+be used for both of these publishing styles.
+
+   These publishing styles use the same options for markup up special
+characters as the "xml" publishing style.  *Note XML::, for details.
+
+`muse-html-extension'
+     Default file extension for publishing HTML files.
+
+`muse-xhtml-extension'
+     Default file extension for publishing XHTML files.
+
+`muse-html-style-sheet'
+     Store your stylesheet definitions here.
+
+     This is used in `muse-html-header'.  You can put raw CSS in here or
+     a <link> tag to an external stylesheet.  This text may contain
+     <lisp> markup tags.
+
+     If you are publishing to XHTML, then customize the
+     `muse-xhtml-style-sheet' option instead.
+
+`muse-xhtml-style-sheet'
+     Store your stylesheet definitions here.
+
+     This is used in `muse-xhtml-header'.  You can put raw CSS in here
+     or a <link> tag to an external stylesheet.  This text may contain
+     <lisp> markup tags.
+
+`muse-html-header'
+     Header used for publishing HTML files.
+
+     This may be text or a filename.
+
+`muse-html-footer'
+     Footer used for publishing HTML files.
+
+     This may be text or a filename.
+
+`muse-xhtml-header'
+     Header used for publishing XHTML files.
+
+     This may be text or a filename.
+
+`muse-xhtml-footer'
+     Footer used for publishing XHTML files.
+
+     This may be text or a filename.
+
+`muse-html-anchor-on-word'
+     When true, anchors surround the closest word.
+
+     This allows you to select them in a browser (i.e. for pasting),
+     but has the side-effect of marking up headers in multiple colors
+     if your header style is different from your link style.
+
+`muse-html-table-attributes'
+     The attribute to be used with HTML <table> tags.
+
+     If you want to make more-complicated tables in HTML, surround the
+     HTML with the literal tag, so that it does not get escaped.
+
+`muse-html-markup-regexps'
+     List of markup rules for publishing a Muse page to HTML.
+
+`muse-html-markup-functions'
+     An alist of style types to custom functions for that kind of text.
+
+`muse-html-markup-strings'
+     Strings used for marking up text as HTML.
+
+     These cover the most basic kinds of markup, the handling of which
+     differs little between the various styles.
+
+`muse-xhtml-markup-strings'
+     Strings used for marking up text as XHTML.
+
+     These cover the most basic kinds of markup, the handling of which
+     differs little between the various styles.
+
+`muse-html-markup-tags'
+     A list of tag specifications, for specially marking up HTML.
+     *Note muse-publish-markup-tags::, for more information.
+
+`muse-html-meta-http-equiv'
+     The http-equiv attribute used for the HTML <meta> tag.
+
+`muse-html-meta-content-type'
+     The content type used for the HTML <meta> tag.
+
+     If you are striving for XHTML 1.1 compliance, you may want to
+     change this to "application/xhtml+xml".
+
+`muse-html-meta-content-encoding'
+     The charset to append to the HTML <meta> tag.
+
+     If set to the symbol 'detect, use `muse-xml-encoding-map' to try
+     and determine the HTML charset from emacs's coding.  If set to a
+     string, this string will be used to force a particular charset.
+
+`muse-html-charset-default'
+     The default HTML meta charset to use if no translation is found in
+     `muse-xml-encoding-map'.
+
+`muse-html-encoding-default'
+     The default Emacs buffer encoding to use in published files.  This
+     will be used if no special characters are found.
+
+
+\1f
+File: muse.info,  Node: Ikiwiki,  Next: Journal,  Prev: HTML,  Up: Publishing Styles
+
+9.6 Integrating with ikiwiki
+============================
+
+Note: Support for Ikiwiki is not yet complete.  Use at your own risk.
+
+   Ikiwiki is a wiki compiler (`http://ikiwiki.info/').  Emacs Muse can
+(not yet) be used as a source format for Ikiwiki pages with the plugin
+`IkiWiki::Plugin::muse'.
+
+   The `lisp/muse-ikiwiki.el' file provides publishing functions and
+styles for Ikiwiki.  The plugin for Ikiwiki to recognize Muse files is
+provided by the `contrib/ikiwiki/IkiWiki/Plugin/muse.pm' file.  Two
+sample init files are available in the `examples/ikiwiki' directory.
+Configure your `ikiwiki.setup' file so that the `muse_init' variable
+has the location of your Muse init file.
+
+   If you are using CGI, The directory `contrib/ikiwiki/IkiWiki' must
+be copied to the same directory as the CGI script that Ikiwiki
+generates.  When publishing your wiki, the PERL5LIB environment
+variable must contain the path to the `contrib/ikiwiki/IkiWiki'
+directory.
+
+Styles provided
+---------------
+
+`ikiwiki'
+     Supports publishing XHTML output that Ikiwiki can understand.
+
+
+Options provided
+----------------
+
+`muse-ikiwiki-header'
+     Header used for publishing Ikiwiki output files.
+
+     This may be text or a filename.
+
+`muse-ikiwiki-footer'
+     Footer used for publishing Ikiwiki output files.
+
+     This may be text or a filename.
+
+
+Other relevant options
+----------------------
+
+`muse-colors-evaluate-lisp-tags'
+     Specify whether to evaluate the contents of <lisp> tags at display
+     time.  If nil, don't evaluate them.  If non-nil, evaluate them.
+
+     The actual contents of the buffer are not changed, only the
+     displayed text.
+
+`muse-html-src-allowed-modes'
+     Modes that we allow the <src> tag to colorize.  If `t', permit the
+     <src> tag to colorize any mode.
+
+     If a list of mode names, such as `'("html" "latex")', and the lang
+     argument to <src> is not in the list, then use fundamental mode
+     instead.
+
+`muse-publish-enable-dangerous-tags'
+     If non-nil, publish tags like <lisp> and <command> that can call
+     external programs or expose sensitive information.  Otherwise,
+     ignore tags like this.
+
+     This is useful to set to `nil' when the file to publish is coming
+     from an untrusted source.
+
+
+\1f
+File: muse.info,  Node: Journal,  Next: LaTeX,  Prev: Ikiwiki,  Up: Publishing Styles
+
+9.7 Keeping a journal or blog
+=============================
+
+The module facilitates the keeping and publication of a journal.  When
+publishing to HTML, it assumes the form of a web log, or blog.
+
+   The input format for each entry is as follows.
+
+     * 20040317: Title of entry
+
+     text for the entry.
+
+     <qotd>
+     "You know who you are. It comes down to a simple gut check: You
+     either love what you do or you don't. Period." -- P. Bronson
+     </qotd>
+
+   The "qotd", or Quote of the Day, is entirely optional.  When
+generated to HTML, this entry is rendered as the following.
+
+     <div class="entry">
+       <div class="entry-qotd">
+         <h3>Quote of the Day:</h3>
+         <p>"You know who you are. It comes down to a simple gut
+           check: You either love what you do or you don't. Period."
+           -- P. Bronson</p>
+       </div>
+       <div class="entry-body">
+         <div class="entry-head">
+           <div class="entry-date">
+             <span class="date">March 17, 2004</span>
+           </div>
+           <div class="entry-title">
+             <h2>Title of entry</h2>
+           </div>
+         </div>
+         <div class="entry-text">
+           <p>Text for the entry.</p>
+         </div>
+       </div>
+     </div>
+
+   The plurality of "div" tags makes it possible to display the entries
+in any form you wish, using a CSS style.
+
+   Also, an .RDF file can be generated from your journal by publishing
+it with the "rdf" style.  It uses the first two sentences of the first
+paragraph of each entry as its "description", and auto-generates tags
+for linking to the various entries.
+
+muse-project-alist considerations
+---------------------------------
+
+If you wish to publish an RDF or RSS feed, it is important to include
+the `:base-url' attribute in your `muse-project-alist' entry for your
+Journal projects.  An example follows.
+
+     (setq muse-project-alist
+           '(("Journal" ("~/Journal/"
+                         :default "journal")
+             (:base "journal-rss"
+                    :base-url "http://example.org/journal/"
+                    :path "~/public_html/journal"))))
+
+Styles provided
+---------------
+
+`journal-html'
+     Publish journal entries as an HTML document.
+
+`journal-xhtml'
+     Publish journal entries as an XHTML document.
+
+`journal-latex'
+     Publish journal entries as a LaTeX document.
+
+`journal-pdf'
+     Publish journal entries as a PDF document.
+
+`journal-book-latex'
+     Publish journal entries as a LaTeX book.
+
+`journal-book-pdf'
+     Publish journal entries as a PDF book.
+
+`journal-rdf'
+     Publish journal entries as an RDF file (RSS 1.0).
+
+`journal-rss'
+     Publish journal entries as an RSS file (RSS 2.0).
+
+`journal-rss-entry'
+     Used internally by `journal-rss' and `journal-rdf' for publishing
+     individual entries.
+
+
+Options provided
+----------------
+
+`muse-journal-heading-regexp'
+     A regexp that matches a journal heading.
+
+     Paren group 1 is the ISO date, group 2 is the optional category,
+     and group 3 is the optional heading for the entry.
+
+`muse-journal-date-format'
+     Date format to use for journal entries.
+
+`muse-journal-html-heading-regexp'
+     A regexp that matches a journal heading from an HTML document.
+
+     Paren group 1 is the ISO date, group 2 is the optional category,
+     and group 3 is the optional heading for the entry.
+
+`muse-journal-html-entry-template'
+     Template used to publish individual journal entries as HTML.
+
+     This may be text or a filename.
+
+`muse-journal-latex-section'
+     Template used to publish a LaTeX section.
+
+`muse-journal-latex-subsection'
+     Template used to publish a LaTeX subsection.
+
+`muse-journal-markup-tags'
+     A list of tag specifications, for specially marking up Journal
+     entries.
+
+     *Note muse-publish-markup-tags::, for more information.
+
+     This is used by `journal-latex' and its related styles, as well as
+     the `journal-rss-entry' style, which both `journal-rdf' and
+     `journal-rss' use.
+
+`muse-journal-rdf-extension'
+     Default file extension for publishing RDF (RSS 1.0) files.
+
+`muse-journal-rdf-base-url'
+     The base URL of the website referenced by the RDF file.
+
+`muse-journal-rdf-header'
+     Header used for publishing RDF (RSS 1.0) files.
+
+     This may be text or a filename.
+
+`muse-journal-rdf-footer'
+     Footer used for publishing RDF (RSS 1.0) files.
+
+     This may be text or a filename.
+
+`muse-journal-rdf-date-format'
+     Date format to use for RDF entries.
+
+`muse-journal-rdf-entry-template'
+     Template used to publish individual journal entries as RDF.
+
+     This may be text or a filename.
+
+`muse-journal-rdf-summarize-entries'
+     If non-nil, include only summaries in the RDF file, not the full
+     data.
+
+     The default is nil, because this annoys some subscribers.
+
+`muse-journal-rss-heading-regexp'
+     A regexp that matches a journal heading from an HTML document.
+
+     Paren group 1 is the ISO date, group 2 is the optional category,
+     and group 3 is the optional heading for the entry.
+
+`muse-journal-rss-extension'
+     Default file extension for publishing RSS 2.0 files.
+
+`muse-journal-rss-base-url'
+     The base URL of the website referenced by the RSS file.
+
+`muse-journal-rss-header'
+     Header used for publishing RSS 2.0 files.
+
+     This may be text or a filename.
+
+`muse-journal-rss-footer'
+     Footer used for publishing RSS 2.0 files.
+
+     This may be text or a filename.
+
+`muse-journal-rss-date-format'
+     Date format to use for RSS 2.0 entries.
+
+`muse-journal-rss-entry-template'
+     Template used to publish individual journal entries as RSS 2.0.
+
+     This may be text or a filename.
+
+`muse-journal-rss-enclosure-types-alist'
+     File types that are accepted as RSS enclosures.
+
+     This is an alist that maps file extension to content type.
+
+     Useful for podcasting.
+
+`muse-journal-rss-summarize-entries'
+     If non-nil, include only summaries in the RSS file, not the full
+     data.
+
+     The default is nil, because this annoys some subscribers.
+
+`muse-journal-rss-markup-regexps'
+     List of markup rules for publishing a Muse journal page to RSS.
+
+     For more information on the structure of this list, *Note
+     muse-publish-markup-regexps::.
+
+`muse-journal-rss-markup-functions'
+     An alist of style types to custom functions for that kind of text.
+
+     For more on the structure of this list, *Note
+     muse-publish-markup-functions::.
+
+
+\1f
+File: muse.info,  Node: LaTeX,  Next: Poem,  Prev: Journal,  Up: Publishing Styles
+
+9.8 Publishing LaTeX documents
+==============================
+
+This publishing style is capable of producing LaTeX or PDF documents.
+
+   If you wish to publish PDF documents, you will need to have a good
+LaTeX installation.  For Debian and Ubuntu, this can be accomplished by
+installing the "tetex-bin" and "tetex-extra" packages.  TeX fonts are
+also a must.
+
+   If your LaTeX installation has the file `grffile.sty', which may be
+found in the `texlive-latex-recommended' package for Debian and Ubuntu,
+then consider using it by adding the following to your header file.
+This allows spaces in filenames to work.
+
+     \usepackage{grffile}
+
+Styles provided
+---------------
+
+`latex'
+     Publish a LaTeX document.
+
+`pdf'
+     Publish a PDF document, using an external LaTeX document conversion
+     tool.
+
+`latexcjk'
+     Publish a LaTeX document with CJK (Chinese) encodings.
+
+`pdfcjk'
+     Publish a PDF document with CJK (Chinese) encodings, using an
+     external LaTeX document conversion tool.
+
+`slides'
+     Publish a LaTeX document that uses the Beamer extension.  This is
+     suitable for producing slides.
+
+     Here is an example of a slide.
+
+          <slide title="First Slide">
+          Everything between the slide tags composes this slide.
+
+          [[Some-sort-of-cute-image.png]]
+
+           - A bullet point.
+           - Another bullet point.
+          </slide>
+
+`slides-pdf'
+     Publish a PDF document of slides, using the Beamer extension.
+
+`lecture-notes'
+     Publish a LaTeX document that uses the Beamer extension.  This is
+     suitable for producing lecture notes.
+
+     This can also use the <slide> tag.
+
+`lecture-notes-pdf'
+     Publish a PDF document of lecture notes, using the Beamer
+     extension.
+
+
+Options provided
+----------------
+
+`muse-latex-extension'
+     Default file extension for publishing LaTeX files.
+
+`muse-latex-pdf-extension'
+     Default file extension for publishing LaTeX files to PDF.
+
+`muse-latex-pdf-browser'
+     The program to use when browsing a published PDF file.
+
+     This should be a format string.
+
+`muse-latex-pdf-program'
+     The program that is called to generate PDF content from LaTeX
+     content.
+
+`muse-latex-pdf-cruft'
+     Extensions of files to remove after generating PDF output
+     successfully.
+
+`muse-latex-header'
+     Header used for publishing LaTeX files.
+
+     This may be text or a filename.
+
+`muse-latex-footer'
+     Footer used for publishing LaTeX files.
+
+     This may be text or a filename.
+
+`muse-latexcjk-header'
+     Header used for publishing LaTeX files (CJK).
+
+     This may be text or a filename.
+
+`muse-latexcjk-footer'
+     Footer used for publishing LaTeX files (CJK).
+
+     This may be text or a filename.
+
+`muse-latex-slides-header'
+     Header for publishing of slides using LaTeX.
+
+     This may be text or a filename.
+
+     You must have the Beamer extension for LaTeX installed for this to
+     work.
+
+`muse-latex-lecture-notes-header'
+     Header publishing of lecture notes using LaTeX.
+
+     This may be text or a filename.
+
+     You must have the Beamer extension for LaTeX installed for this to
+     work.
+
+`muse-latex-markup-regexps'
+     List of markup regexps for identifying regions in a Muse page.
+
+     For more on the structure of this list, *Note
+     muse-publish-markup-regexps::.
+
+`muse-latex-markup-functions'
+     An alist of style types to custom functions for that kind of text.
+
+     For more on the structure of this list, *Note
+     muse-publish-markup-functions::.
+
+`muse-latex-markup-strings'
+     Strings used for marking up text.
+
+     These cover the most basic kinds of markup, the handling of which
+     differs little between the various styles.
+
+`muse-latex-slides-markup-tags'
+     A list of tag specifications, for specially marking up LaTeX
+     slides.
+
+`muse-latexcjk-encoding-map'
+     An alist mapping emacs coding systems to appropriate CJK codings.
+     Use the base name of the coding system (ie, without the -unix).
+
+`muse-latexcjk-encoding-default'
+     The default Emacs buffer encoding to use in published files.
+
+     This will be used if no special characters are found.
+
+`muse-latex-markup-specials-document'
+     A table of characters which must be represented specially.  These
+     are applied to the entire document, sans already-escaped regions.
+
+`muse-latex-markup-specials-example'
+     A table of characters which must be represented specially.  These
+     are applied to example> regions.
+
+     With the default interpretation of <example> regions, no specials
+     need to be escaped.
+
+`muse-latex-markup-specials-literal'
+     A table of characters which must be represented specially.  This
+     applies to =monospaced text= and <code> regions.
+
+`muse-latex-markup-specials-url'
+     A table of characters which must be represented specially.  These
+     are applied to URLs.
+
+`muse-latex-markup-specials-image'
+     A table of characters which must be represented specially.  These
+     are applied to image filenames.
+
+`muse-latex-permit-contents-tag'
+     If nil, ignore <contents> tags.  Otherwise, insert table of
+     contents.
+
+     Most of the time, it is best to have a table of contents on the
+     first page, with a new page immediately following.  To make this
+     work with documents published in both HTML and LaTeX, we need to
+     ignore the <contents> tag.
+
+     If you don't agree with this, then set this option to non-nil, and
+     it will do what you expect.
+
+
+\1f
+File: muse.info,  Node: Poem,  Next: Texinfo,  Prev: LaTeX,  Up: Publishing Styles
+
+9.9 Publish a poem to LaTeX or PDF
+==================================
+
+The `muse-poem' module makes it easy to attractively publish and
+reference poems in the following format, using the "memoir" module for
+LaTeX publishing.  It will also markup poems for every other output
+style, though none are nearly as pretty.
+
+     Title
+
+
+     Body of poem
+
+
+     Annotations, history, notes, etc.
+
+   Once a poem is written in this format, just publish it to PDF using
+the `poem-pdf' style.  To make an inlined reference to a poem that
+you've written - for example, from a blog page - there is a "poem" tag
+defined by this module.
+
+     <poem title="name.of.poem.page">
+
+   Let's assume the template above was called `name.of.poem.page'; then
+the above tag would result in this inclusion.
+
+     ** Title
+
+     > Body of poem
+
+   John Wiegley uses this module for publishing all of the poems on his
+website, which are at `http://www.newartisans.com/johnw/poems.html'.
+
+Styles provided
+---------------
+
+`poem-latex'
+     Publish a poem in LaTeX form.
+
+`poem-pdf'
+     Publish a poem to a PDF document.
+
+`chapbook-latex'
+     Publish a book of poems in LaTeX form.
+
+`chapbook-pdf'
+     Publish a book of poems to a PDF document.
+
+
+Options provided
+----------------
+
+`muse-poem-latex-header'
+     Header used for publishing LaTeX poems.
+
+     This may be text or a filename.
+
+`muse-poem-latex-footer'
+     Footer used for publishing LaTeX files.
+
+     This may be text or a filename.
+
+`muse-poem-markup-strings'
+     Strings used for marking up poems.
+
+     These cover the most basic kinds of markup, the handling of which
+     differs little between the various styles.
+
+`muse-chapbook-latex-header'
+     Header used for publishing a book of poems in LaTeX form.
+
+     This may be text or a filename.
+
+`muse-chapbook-latex-footer'
+     Footer used for publishing a book of poems in LaTeX form.
+
+     This may be text or a filename.
+
+`muse-poem-chapbook-strings'
+     Strings used for marking up books of poems.
+
+     These cover the most basic kinds of markup, the handling of which
+     differs little between the various styles.
+
+
+\1f
+File: muse.info,  Node: Texinfo,  Next: XML,  Prev: Poem,  Up: Publishing Styles
+
+9.10 Publish entries to Texinfo format or PDF
+=============================================
+
+Rules for publishing a Muse file as a Texinfo article.
+
+Styles provided
+---------------
+
+`texi'
+     Publish a file in Texinfo form.
+
+`info'
+     Generate an Info file from a Muse file.
+
+`info-pdf'
+     Publish a file in PDF form.
+
+
+Options provided
+----------------
+
+`muse-texinfo-process-natively'
+     If non-nil, use the Emacs `texinfmt' module to make Info files.
+
+`muse-texinfo-extension'
+     Default file extension for publishing Texinfo files.
+
+`muse-texinfo-info-extension'
+     Default file extension for publishing Info files.
+
+`muse-texinfo-pdf-extension'
+     Default file extension for publishing PDF files.
+
+`muse-texinfo-header'
+     Text to prepend to a Muse page being published as Texinfo.
+
+     This may be text or a filename.  It may contain <lisp> markup tags.
+
+`muse-texinfo-footer'
+     Text to append to a Muse page being published as Texinfo.
+
+     This may be text or a filename.  It may contain <lisp> markup tags.
+
+`muse-texinfo-markup-regexps'
+     List of markup rules for publishing a Muse page to Texinfo.
+
+     For more on the structure of this list, *Note
+     muse-publish-markup-regexps::.
+
+`muse-texinfo-markup-functions'
+     An alist of style types to custom functions for that kind of text.
+
+     For more on the structure of this list, *Note
+     muse-publish-markup-functions::.
+
+`muse-texinfo-markup-strings'
+     Strings used for marking up text.
+
+     These cover the most basic kinds of markup, the handling of which
+     differs little between the various styles.
+
+`muse-texinfo-markup-specials'
+     A table of characters which must be represented specially.
+
+`muse-texinfo-markup-specials'
+     A table of characters which must be represented specially.  These
+     are applied to URLs.
+
+
+\1f
+File: muse.info,  Node: XML,  Prev: Texinfo,  Up: Publishing Styles
+
+9.11 Publish entries to XML
+===========================
+
+Muse is capable of publishing XML documents, with the help of the
+`muse-xml.el' module.
+
+   A RelaxNG schema is available as part of the Muse distribution in the
+`etc/muse.rnc' file.
+
+Styles provided
+---------------
+
+`xml'
+     Publish a file in XML form.
+
+
+Options provided
+----------------
+
+`muse-xml-encoding-map'
+     An alist mapping Emacs coding systems to appropriate XML charsets.
+     Use the base name of the coding system (i.e. without the -unix).
+
+`muse-xml-markup-specials'
+     A table of characters which must be represented specially in all
+     XML-like markup formats.
+
+`muse-xml-markup-specials-url-extra'
+     A table of characters which must be represented specially in all
+     XML-like markup formats.
+
+     These are extra characters that are escaped within URLs.
+
+`muse-xml-extension'
+     Default file extension used for publishing XML files.
+
+`muse-xml-header'
+     Header used for publishing XML files.
+
+     This may be text or a filename.
+
+`muse-xml-footer'
+     Footer used for publishing XML files.
+
+     This may be text or a filename.
+
+`muse-xml-markup-regexps'
+     List of markup rules for publishing a Muse page to XML.
+
+     For more on the structure of this list, *Note
+     muse-publish-markup-regexps::.
+
+`muse-xml-markup-functions'
+     An alist of style types to custom functions for that kind of text.
+
+     For more on the structure of this list, *Note
+     muse-publish-markup-functions::.
+
+`muse-xml-markup-strings'
+     Strings used for marking up text.
+
+     These cover the most basic kinds of markup, the handling of which
+     differs little between the various styles.
+
+`muse-xml-encoding-default'
+     The default Emacs buffer encoding to use in published files.
+
+     This will be used if no special characters are found.
+
+`muse-xml-charset-default'
+     The default XML charset to use if no translation is found in
+     `muse-xml-encoding-map'.
+
+
+\1f
+File: muse.info,  Node: Extending Muse,  Next: Miscellaneous,  Prev: Publishing Styles,  Up: Top
+
+10 Making your own publishing styles
+************************************
+
+* Menu:
+
+* Markup Functions::            Specifying functions to mark up text.
+* Markup Regexps::              Markup rules for publishing.
+* Markup Strings::              Strings specific to a publishing style.
+* Markup Tags::                 Tag specifications for special markup.
+* Style Elements::              Parameters used for defining styles.
+* Deriving Styles::             Deriving a new style from an existing
+                                  one.
+
+\1f
+File: muse.info,  Node: Markup Functions,  Next: Markup Regexps,  Up: Extending Muse
+
+10.1 Specifying functions to mark up text
+=========================================
+
+`muse-publish-markup-functions'
+
+   An alist of style types to custom functions for that kind of text.
+
+   This is used by publishing styles to attempt to minimize the amount
+of custom regexps that each has to define.  `muse-publish' provides
+rules for the most common types of markup.
+
+   Each member of the list is of the following form.
+
+     (SYMBOL FUNCTION)
+
+   * SYMBOL Describes the type of text to associate with this rule.
+     `muse-publish-markup-regexps' maps regexps to these symbols.
+
+   * FUNCTION Function to use to mark up this kind of rule if no
+     suitable function is found through the `:functions' tag of the
+     current style.
+
+\1f
+File: muse.info,  Node: Markup Regexps,  Next: Markup Strings,  Prev: Markup Functions,  Up: Extending Muse
+
+10.2 Markup rules for publishing
+================================
+
+`muse-publish-markup-regexps'
+
+   List of markup rules for publishing a page with Muse.
+
+   The rules given in this variable are invoked first, followed by
+whatever rules are specified by the current style.
+
+   Each member of the list is either a function, or a list of the
+following form.
+
+     (REGEXP/SYMBOL TEXT-BEGIN-GROUP REPLACEMENT-TEXT/FUNCTION/SYMBOL)
+
+   * REGEXP A regular expression, or symbol whose value is a regular
+     expression, which is searched for using `re-search-forward'.
+
+   * TEXT-BEGIN-GROUP The matching group within that regexp which
+     denotes the beginning of the actual text to be marked up.
+
+   * REPLACEMENT-TEXT A string that will be passed to `replace-match'.
+
+     If it is not a string, but a function, it will be called to
+     determine what the replacement text should be (it must return a
+     string).  If it is a symbol, the value of that symbol should be a
+     string.
+
+   The replacements are done in order, one rule at a time.  Writing the
+regular expressions can be a tricky business.  Note that case is never
+ignored.  `case-fold-search' is always bound to nil while processing
+the markup rules.
+
+Publishing order
+----------------
+
+This is the order that the publishing rules are consulted, by default.
+This may be changed by customizing `muse-publish-markup-regexps'.
+
+`trailing and leading whitespace'
+     Remove trailing and leading whitespace from a file.
+
+`directive'
+     `#directive'
+
+     This is only recognized at the beginning of a file.
+
+`comment'
+     `; a commented line'
+
+`tag'
+     `<tag>'
+
+`comment'
+     `; comment'
+
+`explicit links'
+     Prevent emphasis characters in explicit links from being marked up.
+
+     Don't actually publish them here, just add a special no-emphasis
+     text property.
+
+`word'
+     Whitespace-delimited word, possibly with emphasis characters
+
+     This function is responsible for marking up emphasis and escaping
+     some specials.
+
+`heading'
+     `** Heading'
+
+     Outline-mode style headings.
+
+`enddots'
+     `....'
+
+     These are ellipses with a dot at end.
+
+`dots'
+     `...'
+
+     Ellipses.
+
+`rule'
+     `----'
+
+     Horizontal rule or section separator.
+
+`no-break-space'
+     `~~'
+
+     Prevent lines from being split before or after these characters.
+
+`line-break'
+     `<br>'
+
+     Break a line at point.
+
+`fn-sep'
+     `Footnotes:'
+
+     Beginning of footnotes section.
+
+`footnote'
+     `[1]'
+
+     Footnote definition or reference.  If at beginning of line, it is a
+     definition.
+
+`list'
+        * ` 1. '
+
+        * ` - '
+
+        * `term :: '
+
+     Numbered list, item list, or term definition list.
+
+`table-el'
+     `table.el' style tables
+
+`table'
+     `table | cells'
+
+     Muse tables or orgtbl-mode style tables.
+
+`quote'
+     spaces before beginning of text
+
+     Blockquotes.
+
+`emdash'
+     `--'
+
+     2-wide dash
+
+`verse'
+     `> verse text'
+
+`anchor'
+     `#anchor'
+
+`link'
+     `[[explicit][links]]'
+
+`url'
+     `http://example.com/'
+
+`email'
+     `bare-email@example.com'
+
+
+\1f
+File: muse.info,  Node: Markup Strings,  Next: Markup Tags,  Prev: Markup Regexps,  Up: Extending Muse
+
+10.3 Strings specific to a publishing style
+===========================================
+
+"Markup strings" are strings used for marking up text for a particular
+style.
+
+   These cover the most basic kinds of markup, the handling of which
+differs little between the various styles.
+
+Available markup strings
+------------------------
+
+`image-with-desc'
+     An image and a description.
+
+     Argument 1: image without extension.  Argument 2: image extension.
+     Argument 3: description.
+
+`image'
+     An inlined image.
+
+     Argument 1: image without extension.  Argument 2: image extension.
+
+`image-link'
+     An image with a link around it.
+
+     Argument 1: link.  Argument 2: image without extension.  Argument
+     3: image extension.
+
+`anchor-ref'
+     A reference to an anchor on the current page.
+
+     Argument 1: anchor name.  Argument 2: description if one exists,
+     or the original link otherwise.
+
+`url'
+     A URL without a description.
+
+     Argument 1: URL.
+
+`link'
+     A link to a Muse page with a description.
+
+     Argument 1: link.  Argument 2: description if one exists, or the
+     original link otherwise.
+
+`link-and-anchor'
+     A link to a Muse page with an anchor, and a description.
+
+     Argument 1: link.  Argument 2: anchor name.  Argument 3:
+     description if one exists, or the original link otherwise.
+     Argument 4: link without an extension.
+
+`email-addr'
+     A link to an email address.
+
+     Argument 1: email address.  Argument 2: email address.
+
+`anchor'
+     An anchor.
+
+     Argument 1: name of anchor.
+
+`emdash'
+     A 2-length dash.
+
+     Argument 1: Initial whitespace.  Argument 2: Terminating
+     whitespace.
+
+`comment-begin'
+     Beginning of a comment.
+
+`comment-end'
+     End of a comment.
+
+`rule'
+     A horizontal line or space.
+
+`no-break-space'
+     A space that separates two words which are not to be separated.
+
+`footnote'
+     Beginning of footnote.
+
+`footnote-end'
+     End of footnote.
+
+`footnotemark'
+     Mark a reference for the current footnote.
+
+     Argument 1: number of this footnote.
+
+`footnotemark-end'
+     End of a reference for the current footnote.
+
+`footnotetext'
+     Indicate the text of the current footnote.
+
+     Argument 1: number of this footnote.
+
+`footnotetext-end'
+     End of a footnote text line.
+
+`fn-sep'
+     Text used to replace "Footnotes:" line.
+
+`dots'
+     3 dots.
+
+`enddots'
+     4 dots.
+
+`part'
+     Beginning of a part indicator line.  This is used by book
+     publishing.
+
+`part-end'
+     End of a part indicator line.  This is used by book publishing.
+
+`chapter'
+     Beginning of a chapter indicator line.  This is used by book
+     publishing.
+
+`chapter-end'
+     End of a chapter indicator line.  This is used by book publishing.
+
+`section'
+     Beginning of level 1 section indicator line.
+
+     Argument 1: level of section; always 1.
+
+`section-end'
+     End of level 1 section indicator line.
+
+     Argument 1: level of section; always 1.
+
+`subsection'
+     Beginning of level 2 section indicator line.
+
+     Argument 1: level of section; always 2.
+
+`subsection-end'
+     End of level 2 section indicator line.
+
+     Argument 1: level of section; always 2.
+
+`subsubsection'
+     Beginning of level 3 section indicator line.
+
+     Argument 1: level of section; always 3.
+
+`subsubsection-end'
+     End of level 3 section indicator line.
+
+     Argument 1: level of section; always 3.
+
+`section-other'
+     Beginning of section indicator line, where level is greater than 3.
+
+     Argument 1: level of section.
+
+`section-other-end'
+     End of section indicator line, where level is greater than 3.
+
+     Argument 1: level of section.
+
+`begin-underline'
+     Beginning of underlined text.
+
+`end-underline'
+     End of underlined text.
+
+`begin-literal'
+     Beginning of verbatim text.  This includes <code> tags and
+     =teletype text=.
+
+`end-literal'
+     End of verbatim text.  This includes <code> tags and =teletype
+     text=.
+
+`begin-emph'
+     Beginning of the first level of emphasized text.
+
+`end-emph'
+     End of the first level of emphasized text.
+
+`begin-more-emph'
+     Beginning of the second level of emphasized text.
+
+`end-more-emph'
+     End of the second level of emphasized text.
+
+`begin-most-emph'
+     Beginning of the third (and final) level of emphasized text.
+
+`end-most-emph'
+     End of the third (and final) level of emphasized text.
+
+`begin-verse'
+     Beginning of verse text.
+
+`verse-space'
+     String used to each space that is further indented than the
+     beginning of the verse.
+
+`begin-verse-line'
+     Beginning of a line of verse.
+
+`empty-verse-line'
+     End of a line of verse.
+
+`begin-last-stanza-line'
+     Beginning of the last line of a verse stanza.
+
+`end-last-stanza-line'
+     End of the last line of a verse stanza.
+
+`end-verse'
+     End of verse text.
+
+`begin-example'
+     Beginning of an example region.  To make use of this, an
+     `<example>' tag is needed.
+
+`end-example'
+     End of an example region.  To make use of this, an `</example>' tag
+     is needed.
+
+`begin-center'
+     Begin a centered line.
+
+`end-center'
+     End a centered line.
+
+`begin-quote'
+     Begin a quoted region.
+
+`end-quote'
+     End a quoted region.
+
+`begin-quote-item'
+     Begin a quote paragraph.
+
+`end-quote-item'
+     End a quote paragraph.
+
+`begin-uli'
+     Begin an unordered list.
+
+`end-uli'
+     End an unordered list.
+
+`begin-uli-item'
+     Begin an unordered list item.
+
+`end-uli-item'
+     End an unordered list item.
+
+`begin-oli'
+     Begin an ordered list.
+
+`end-oli'
+     End an ordered list.
+
+`begin-oli-item'
+     Begin an ordered list item.
+
+`end-oli-item'
+     End an ordered list item.
+
+`begin-dl'
+     Begin a definition list.
+
+`end-dl'
+     End a definition list.
+
+`begin-dl-item'
+     Begin a definition list item.
+
+`end-dl-item'
+     End a definition list item.
+
+`begin-ddt'
+     Begin a definition list term.
+
+`end-ddt'
+     End a definition list term.
+
+`begin-dde'
+     Begin a definition list entry.
+
+`end-dde'
+     End a definition list entry.
+
+`begin-table'
+     Begin a table.
+
+`end-table'
+     End a table.
+
+`begin-table-group'
+     Begin a table grouping.
+
+`end-table-group'
+     End a table grouping.
+
+`begin-table-row'
+     Begin a table row.
+
+`end-table-row'
+     End a table row.
+
+`begin-table-entry'
+     Begin a table entry.
+
+`end-table-entry'
+     End a table entry.
+
+
+\1f
+File: muse.info,  Node: Markup Tags,  Next: Style Elements,  Prev: Markup Strings,  Up: Extending Muse
+
+10.4 Tag specifications for special markup
+==========================================
+
+`muse-publish-markup-tags'
+
+   A list of tag specifications, for specially marking up text.
+
+   XML-style tags are the best way to add custom markup to Muse.  This
+is easily accomplished by customizing this list of markup tags.
+
+   For each entry, the name of the tag is given, whether it expects a
+closing tag and/or an optional set of attributes, whether it is
+nestable, and a function that performs whatever action is desired within
+the delimited region.
+
+   The tags themselves are deleted during publishing, before the
+function is called.  The function is called with three arguments, the
+beginning and end of the region surrounded by the tags.  If properties
+are allowed, they are passed as a third argument in the form of an
+alist.  The `end' argument to the function is always a marker.
+
+   Point is always at the beginning of the region within the tags, when
+the function is called.  Wherever point is when the function finishes is
+where tag markup will resume.
+
+   These tag rules are processed once at the beginning of markup, and
+once at the end, to catch any tags which may have been inserted
+in-between.
+
+\1f
+File: muse.info,  Node: Style Elements,  Next: Deriving Styles,  Prev: Markup Tags,  Up: Extending Muse
+
+10.5 Parameters used for defining styles
+========================================
+
+Style elements are tags that define a style.  Use either
+`muse-define-style' or `muse-derive-style' (*note Deriving Styles::) to
+create a new style.
+
+ -- Function: muse-define-style name &rest elements
+
+Usable elements
+---------------
+
+`:suffix'
+     File extension to use for publishing files with this style.
+
+`:link-suffix'
+     File extension to use for publishing links to Muse files with this
+     style.
+
+`:osuffix'
+     File extension to use for publishing second-stage files with this
+     style.
+
+     For example, PDF publishing generates a LaTeX file first, then a
+     PDF from that LaTeX file.
+
+`:regexps'
+     List of markup rules for publishing a page with Muse.  *Note
+     muse-publish-markup-regexps::.
+
+`:functions'
+     An alist of style types to custom functions for that kind of text.
+     *Note muse-publish-markup-functions::.
+
+`:strings'
+     Strings used for marking up text with this style.
+
+     These cover the most basic kinds of markup, the handling of which
+     differs little between the various styles.
+
+`:tags'
+     A list of tag specifications, used for handling extra tags.  *Note
+     muse-publish-markup-tags::.
+
+`:specials'
+     A table of characters which must be represented specially.
+
+`:before'
+     A function that is to be executed on the newly-created publishing
+     buffer (or the current region) before any publishing occurs.
+
+     This is used to set extra parameters that direct the publishing
+     process.
+
+`:before-end'
+     A function that is to be executed on the publishing buffer (or the
+     current region) immediately after applying all of the markup
+     regexps.
+
+     This is used to fix the order of table elements (header, footer,
+     body) in XML-ish styles.
+
+`:after'
+     A function that is to be executed on the publishing buffer after
+     :before-end, and immediately after inserting the header and footer.
+
+     This is used for generating the table of contents as well as
+     setting the file coding system.
+
+`:final'
+     A function that is to be executed after saving the published file,
+     but while still in its buffer.
+
+     This is used for generating second-stage documents like PDF files
+     from just-published LaTeX files.
+
+     The function must accept three arguments: the name of the muse
+     source file, the name of the just-published file, and the name of
+     the second-stage target file.  The name of the second-stage target
+     file is the same as that of the just-published file if no
+     second-stage publishing is required.
+
+`:header'
+     Header used for publishing files of this style.
+
+     This may be a variable, text, or a filename.  It is inserted at the
+     beginning of a file, after evaluating the publishing markup.
+
+`:footer'
+     Footer used for publishing files of this style.
+
+     This may be a variable, text, or a filename.  It is inserted at
+     the end of a file, after evaluating the publishing markup.
+
+`:style-sheet'
+     Style sheet used for publishing files of this style.
+
+     This may be a variable or text.  It is used in the header of HTML
+     and XHTML based publishing styles.
+
+`:browser'
+     The function used to browse the published result of files of this
+     style.
+
+
+\1f
+File: muse.info,  Node: Deriving Styles,  Prev: Style Elements,  Up: Extending Muse
+
+10.6 Deriving a new style from an existing one
+==============================================
+
+To create a new style from an existing one, use `muse-derive-style' as
+follows.  This is a good way to fix something you don't like about a
+particular publishing style, or to personalize it.
+
+ -- Function: muse-derive-style new-name base-name &rest elements
+
+   The derived name is a string defining the new style, such as
+"my-html".  The base name must identify an existing style, such as
+"html" - if you have loaded `muse-html'.  The style parameters are the
+same as those used to create a style, except that they override whatever
+definitions exist in the base style.  However, some definitions only
+partially override.  The following parameters support partial
+overriding.
+
+   *Note Style Elements::, for a complete list of all parameters.
+
+`:functions'
+     If a markup function is not found in the derived style's function
+     list, the base style's function list will be queried.
+
+`:regexps'
+     All regexps in the current style and the base style(s) will be
+     used.
+
+`:strings'
+     If a markup string is not found in the derived style's string
+     list, the base style's string list will be queried.
+
+
+\1f
+File: muse.info,  Node: Miscellaneous,  Next: Getting Help and Reporting Bugs,  Prev: Extending Muse,  Up: Top
+
+11 Miscellaneous add-ons, like a minor mode
+*******************************************
+
+* Menu:
+
+* Muse List Edit Minor Mode::   Edit lists easily in other major modes.
+
+\1f
+File: muse.info,  Node: Muse List Edit Minor Mode,  Up: Miscellaneous
+
+11.1 Edit lists easily in other major modes
+===========================================
+
+`muse-list-edit-minor-mode' is meant to be used with other major modes,
+such as Message (for composing email) and debian-changelog-mode (for
+editing debian/changelog files).
+
+   It implements practically perfect support for editing and filling
+lists.  It can even handle nested lists.  In addition to Muse-specific
+list items ("-", numbers, definition lists, footnotes), it can also
+handle items that begin with "*" or "+".  Filling list items behaves in
+the same way that it does in Muse, regardless of whether filladapt is
+also enabled, which is the primary reason to use this tool.
+
+Installation
+------------
+
+To use it, add "(require 'muse-mode)" to your Emacs customization file
+and add the function `turn-on-muse-list-edit-minor-mode' to any mode
+hooks where you wish to enable this minor mode.
+
+Keybindings
+-----------
+
+`muse-list-edit-minor-mode' uses the following keybindings.
+
+`M-RET (`muse-l-e-m-m-insert-list-item')'
+     Insert a new list item at point, using the indentation level of the
+     current list item.
+
+`C-< (`muse-l-e-m-m-decrease-list-item-indent')'
+     Decrease indentation of the current list item.
+
+`C-> (`muse-l-e-m-m-increase-list-item-indent')'
+     Increase indentation of the current list item.
+
+
+Functions
+---------
+
+ -- Function: muse-list-edit-minor-mode
+     This is a global minor mode for editing files with lists.  It is
+     meant to be used with other major modes, and not with Muse mode.
+
+     Interactively, with no prefix argument, toggle the mode.  With
+     universal prefix ARG turn mode on.  With zero or negative ARG turn
+     mode off.
+
+     This minor mode provides the Muse keybindings for editing lists,
+     and support for filling lists properly.
+
+     It recognizes not only Muse-style lists, which use the "-"
+     character or numbers, but also lists that use asterisks or plus
+     signs.  This should make the minor mode generally useful.
+
+     Definition lists and footnotes are also recognized.
+
+     Note that list items may omit leading spaces, for compatibility
+     with modes that set `left-margin', such as `debian-changelog-mode'.
+
+ -- Function: turn-on-muse-list-edit-minor-mode
+     Unconditionally turn on Muse list edit minor mode.
+
+ -- Function: turn-off-muse-list-edit-minor-mode
+     Unconditionally turn off Muse list edit minor mode.
+
+\1f
+File: muse.info,  Node: Getting Help and Reporting Bugs,  Next: History,  Prev: Miscellaneous,  Up: Top
+
+12 Getting Help and Reporting Bugs
+**********************************
+
+After you have read this guide, if you still have questions about Muse,
+or if you have bugs to report, there are several places you can go.
+
+   * `http://www.emacswiki.org/cgi-bin/wiki/EmacsMuse' is the
+     emacswiki.org page, and anyone may add tips, hints, or bug
+     descriptions to it.
+
+   * `http://mwolson.org/projects/EmacsMuse.html' is the web page that
+     Michael Olson (the current maintainer) made for Muse.
+
+   * Muse has several different mailing lists.
+
+    `muse-el-announce'
+          Low-traffic list for Muse-related announcements.
+
+          You can join this mailing list (<muse-el-announce@gna.org>)
+          using the subscription form at
+          `http://mail.gna.org/listinfo/muse-el-announce/'.  This
+          mailing list is also available via Gmane
+          (`http://gmane.org/'). The group is called
+          `gmane.emacs.muse.announce'.
+
+    `muse-el-discuss'
+          Discussion, bugfixes, suggestions, tips, and the like for
+          Muse.  This mailing list also includes the content of
+          muse-el-announce.
+
+          You can join this mailing list (<muse-el-discuss@gna.org>)
+          using the subscription form at
+          `http://mail.gna.org/listinfo/muse-el-discuss/'.  This mailing
+          list is also available via Gmane with the identifier
+          `gmane.emacs.muse.general'.
+
+    `muse-el-logs'
+          Log messages for commits made to Muse.
+
+          You can join this mailing list (<muse-el-logs@gna.org>) using
+          the subscription form at
+          `http://mail.gna.org/listinfo/muse-el-logs/'.  This mailing
+          list is also available via Gmane with the identifier
+          `gmane.emacs.muse.scm'.
+
+    `muse-el-commits'
+          Generated bug reports for Emacs Muse.  If you use our
+          bug-tracker at `https://gna.org/bugs/?group=muse-el', the bug
+          reports will be sent to this list automatically.
+
+          You can join this mailing list (<muse-el-commits@gna.org>)
+          using the subscription form at
+          `http://mail.gna.org/listinfo/muse-el-commits/'.  This
+          mailing list is also available via Gmane with the identifier
+          `gmane.emacs.muse.cvs'.
+
+    `muse-el-internationalization'
+          Discussion of translation of the Muse website and
+          documentation into many languages.
+
+          You can join this mailing list
+          (<muse-el-internationalization@gna.org>) using the
+          subscription form at
+          `http://mail.gna.org/listinfo/internationalization/'.  This
+          mailing list is also available via Gmane with the identifier
+          `gmane.emacs.muse.internationalization'.
+
+
+   * You can visit the IRC Freenode channel `#emacs'. Many of the
+     contributors are frequently around and willing to answer your
+     questions.  The `#muse' channel is also available for
+     Muse-specific help, and its current maintainer hangs out there.
+
+   * The maintainer of Emacs Muse, Michael Olson, may be contacted at
+     <mwolson@gnu.org>.  He can be rather slow at answering email, so
+     it is often better to use the muse-el-discuss mailing list.
+
+
+\1f
+File: muse.info,  Node: History,  Next: Contributors,  Prev: Getting Help and Reporting Bugs,  Up: Top
+
+13 History of This Document
+***************************
+
+   * 2004 John Wiegley started Muse upon realizing that EmacsWiki had
+     some serious limitations. Around February 2004, he started making
+     "emacs-wiki version 3.00 APLHA", which eventually became known as
+     Muse.
+
+     Most of those who frequent the emacs-wiki mailing list continued
+     to use emacs-wiki, mainly because Planner hasn't been ported over
+     to it.
+
+     As of 2004-12-01, Michael Olson became the maintainer of Muse, as
+     per John Wiegley's request.
+
+   * 2005 Michael Olson overhauled this document and added many new
+     sections in preparation for the first release of Muse (3.01).
+
+
+\1f
+File: muse.info,  Node: Contributors,  Next: GNU Free Documentation License,  Prev: History,  Up: Top
+
+14 Contributors to This Documentation
+*************************************
+
+The first draft of this document was taken from the emacs-wiki texinfo
+manual.  Michael Olson adapted it for Muse and added most of its
+content.
+
+   John Sullivan did a majority of the work on the emacs-wiki texinfo
+manual.
+
+   While Sacha Chua maintained emacs-wiki, she worked quite a bit on the
+emacs-wiki texinfo manual.
+
+\1f
+File: muse.info,  Node: GNU Free Documentation License,  Next: Concept Index,  Prev: Contributors,  Up: Top
+
+Appendix A GNU Free Documentation License
+*****************************************
+
+                      Version 1.2, November 2002
+
+     Copyright (C) 2000,2001,2002  Free Software Foundation, Inc.
+     51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+     Everyone is permitted to copy and distribute verbatim copies
+     of this license document, but changing it is not allowed.
+
+
+  0. PREAMBLE
+
+     The purpose of this License is to make a manual, textbook, or other
+     functional and useful document "free" in the sense of freedom: to
+     assure everyone the effective freedom to copy and redistribute it,
+     with or without modifying it, either commercially or
+     noncommercially.  Secondarily, this License preserves for the
+     author and publisher a way to get credit for their work, while not
+     being considered responsible for modifications made by others.
+
+     This License is a kind of "copyleft," which means that derivative
+     works of the document must themselves be free in the same sense.
+     It complements the GNU General Public License, which is a copyleft
+     license designed for free software.
+
+     We have designed this License in order to use it for manuals for
+     free software, because free software needs free documentation: a
+     free program should come with manuals providing the same freedoms
+     that the software does.  But this License is not limited to
+     software manuals; it can be used for any textual work, regardless
+     of subject matter or whether it is published as a printed book.
+     We recommend this License principally for works whose purpose is
+     instruction or reference.
+
+
+  1. APPLICABILITY AND DEFINITIONS
+
+     This License applies to any manual or other work, in any medium,
+     that contains a notice placed by the copyright holder saying it
+     can be distributed under the terms of this License.  Such a notice
+     grants a world-wide, royalty-free license, unlimited in duration,
+     to use that work under the conditions stated herein.  The
+     "Document," below, refers to any such manual or work.  Any member
+     of the public is a licensee, and is addressed as "you."  You
+     accept the license if you copy, modify or distribute the work in a
+     way requiring permission under copyright law.
+
+     A "Modified Version" of the Document means any work containing the
+     Document or a portion of it, either copied verbatim, or with
+     modifications and/or translated into another language.
+
+     A "Secondary Section" is a named appendix or a front-matter
+     section of the Document that deals exclusively with the
+     relationship of the publishers or authors of the Document to the
+     Document's overall subject (or to related matters) and contains
+     nothing that could fall directly within that overall subject.
+     (Thus, if the Document is in part a textbook of mathematics, a
+     Secondary Section may not explain any mathematics.)  The
+     relationship could be a matter of historical connection with the
+     subject or with related matters, or of legal, commercial,
+     philosophical, ethical or political position regarding them.
+
+     The "Invariant Sections" are certain Secondary Sections whose
+     titles are designated, as being those of Invariant Sections, in
+     the notice that says that the Document is released under this
+     License.  If a section does not fit the above definition of
+     Secondary then it is not allowed to be designated as Invariant.
+     The Document may contain zero Invariant Sections.  If the Document
+     does not identify any Invariant Sections then there are none.
+
+     The "Cover Texts" are certain short passages of text that are
+     listed, as Front-Cover Texts or Back-Cover Texts, in the notice
+     that says that the Document is released under this License.  A
+     Front-Cover Text may be at most 5 words, and a Back-Cover Text may
+     be at most 25 words.
+
+     A "Transparent" copy of the Document means a machine-readable copy,
+     represented in a format whose specification is available to the
+     general public, that is suitable for revising the document
+     straightforwardly with generic text editors or (for images
+     composed of pixels) generic paint programs or (for drawings) some
+     widely available drawing editor, and that is suitable for input to
+     text formatters or for automatic translation to a variety of
+     formats suitable for input to text formatters.  A copy made in an
+     otherwise Transparent file format whose markup, or absence of
+     markup, has been arranged to thwart or discourage subsequent
+     modification by readers is not Transparent.  An image format is
+     not Transparent if used for any substantial amount of text.  A
+     copy that is not "Transparent" is called "Opaque."
+
+     Examples of suitable formats for Transparent copies include plain
+     ASCII without markup, Texinfo input format, LaTeX input format,
+     SGML or XML using a publicly available DTD, and
+     standard-conforming simple HTML, PostScript or PDF designed for
+     human modification.  Examples of transparent image formats include
+     PNG, XCF and JPG.  Opaque formats include proprietary formats that
+     can be read and edited only by proprietary word processors, SGML
+     or XML for which the DTD and/or processing tools are not generally
+     available, and the machine-generated HTML, PostScript or PDF
+     produced by some word processors for output purposes only.
+
+     The "Title Page" means, for a printed book, the title page itself,
+     plus such following pages as are needed to hold, legibly, the
+     material this License requires to appear in the title page.  For
+     works in formats which do not have any title page as such, "Title
+     Page" means the text near the most prominent appearance of the
+     work's title, preceding the beginning of the body of the text.
+
+     A section "Entitled XYZ" means a named subunit of the Document
+     whose title either is precisely XYZ or contains XYZ in parentheses
+     following text that translates XYZ in another language.  (Here XYZ
+     stands for a specific section name mentioned below, such as
+     "Acknowledgements," "Dedications," "Endorsements," or "History.")
+     To "Preserve the Title" of such a section when you modify the
+     Document means that it remains a section "Entitled XYZ" according
+     to this definition.
+
+     The Document may include Warranty Disclaimers next to the notice
+     which states that this License applies to the Document.  These
+     Warranty Disclaimers are considered to be included by reference in
+     this License, but only as regards disclaiming warranties: any other
+     implication that these Warranty Disclaimers may have is void and
+     has no effect on the meaning of this License.
+
+  2. VERBATIM COPYING
+
+     You may copy and distribute the Document in any medium, either
+     commercially or noncommercially, provided that this License, the
+     copyright notices, and the license notice saying this License
+     applies to the Document are reproduced in all copies, and that you
+     add no other conditions whatsoever to those of this License.  You
+     may not use technical measures to obstruct or control the reading
+     or further copying of the copies you make or distribute.  However,
+     you may accept compensation in exchange for copies.  If you
+     distribute a large enough number of copies you must also follow
+     the conditions in section 3.
+
+     You may also lend copies, under the same conditions stated above,
+     and you may publicly display copies.
+
+  3. COPYING IN QUANTITY
+
+     If you publish printed copies (or copies in media that commonly
+     have printed covers) of the Document, numbering more than 100, and
+     the Document's license notice requires Cover Texts, you must
+     enclose the copies in covers that carry, clearly and legibly, all
+     these Cover Texts: Front-Cover Texts on the front cover, and
+     Back-Cover Texts on the back cover.  Both covers must also clearly
+     and legibly identify you as the publisher of these copies.  The
+     front cover must present the full title with all words of the
+     title equally prominent and visible.  You may add other material
+     on the covers in addition.  Copying with changes limited to the
+     covers, as long as they preserve the title of the Document and
+     satisfy these conditions, can be treated as verbatim copying in
+     other respects.
+
+     If the required texts for either cover are too voluminous to fit
+     legibly, you should put the first ones listed (as many as fit
+     reasonably) on the actual cover, and continue the rest onto
+     adjacent pages.
+
+     If you publish or distribute Opaque copies of the Document
+     numbering more than 100, you must either include a
+     machine-readable Transparent copy along with each Opaque copy, or
+     state in or with each Opaque copy a computer-network location from
+     which the general network-using public has access to download
+     using public-standard network protocols a complete Transparent
+     copy of the Document, free of added material.  If you use the
+     latter option, you must take reasonably prudent steps, when you
+     begin distribution of Opaque copies in quantity, to ensure that
+     this Transparent copy will remain thus accessible at the stated
+     location until at least one year after the last time you
+     distribute an Opaque copy (directly or through your agents or
+     retailers) of that edition to the public.
+
+     It is requested, but not required, that you contact the authors of
+     the Document well before redistributing any large number of
+     copies, to give them a chance to provide you with an updated
+     version of the Document.
+
+  4. MODIFICATIONS
+
+     You may copy and distribute a Modified Version of the Document
+     under the conditions of sections 2 and 3 above, provided that you
+     release the Modified Version under precisely this License, with
+     the Modified Version filling the role of the Document, thus
+     licensing distribution and modification of the Modified Version to
+     whoever possesses a copy of it.  In addition, you must do these
+     things in the Modified Version:
+
+     A. Use in the Title Page (and on the covers, if any) a title
+     distinct    from that of the Document, and from those of previous
+     versions    (which should, if there were any, be listed in the
+     History section    of the Document).  You may use the same title
+     as a previous version    if the original publisher of that version
+     gives permission.
+     B. List on the Title Page, as authors, one or more persons or
+     entities    responsible for authorship of the modifications in the
+     Modified    Version, together with at least five of the principal
+     authors of the    Document (all of its principal authors, if it
+     has fewer than five),    unless they release you from this
+     requirement.
+     C. State on the Title page the name of the publisher of the
+     Modified Version, as the publisher.
+     D. Preserve all the copyright notices of the Document.
+     E. Add an appropriate copyright notice for your modifications
+     adjacent to the other copyright notices.
+     F. Include, immediately after the copyright notices, a license
+     notice    giving the public permission to use the Modified Version
+     under the    terms of this License, in the form shown in the
+     Addendum below.
+     G. Preserve in that license notice the full lists of Invariant
+     Sections    and required Cover Texts given in the Document's
+     license notice.
+     H. Include an unaltered copy of this License.
+     I. Preserve the section Entitled "History," Preserve its Title,
+     and add    to it an item stating at least the title, year, new
+     authors, and    publisher of the Modified Version as given on the
+     Title Page.  If    there is no section Entitled "History" in the
+     Document, create one    stating the title, year, authors, and
+     publisher of the Document as    given on its Title Page, then add
+     an item describing the Modified    Version as stated in the
+     previous sentence.
+     J. Preserve the network location, if any, given in the Document for
+       public access to a Transparent copy of the Document, and likewise
+       the network locations given in the Document for previous versions
+       it was based on.  These may be placed in the "History" section.
+       You may omit a network location for a work that was published at
+       least four years before the Document itself, or if the original
+      publisher of the version it refers to gives permission.
+     K. For any section Entitled "Acknowledgements" or "Dedications,"
+     Preserve the Title of the section, and preserve in the section all
+       the substance and tone of each of the contributor
+     acknowledgements    and/or dedications given therein.
+     L. Preserve all the Invariant Sections of the Document,
+     unaltered in their text and in their titles.  Section numbers
+     or the equivalent are not considered part of the section titles.
+     M. Delete any section Entitled "Endorsements."  Such a section
+     may not be included in the Modified Version.
+     N. Do not retitle any existing section to be Entitled
+     "Endorsements"    or to conflict in title with any Invariant
+     Section.
+     O. Preserve any Warranty Disclaimers.
+
+     If the Modified Version includes new front-matter sections or
+     appendices that qualify as Secondary Sections and contain no
+     material copied from the Document, you may at your option
+     designate some or all of these sections as invariant.  To do this,
+     add their titles to the list of Invariant Sections in the Modified
+     Version's license notice.  These titles must be distinct from any
+     other section titles.
+
+     You may add a section Entitled "Endorsements," provided it contains
+     nothing but endorsements of your Modified Version by various
+     parties-for example, statements of peer review or that the text has
+     been approved by an organization as the authoritative definition
+     of a standard.
+
+     You may add a passage of up to five words as a Front-Cover Text,
+     and a passage of up to 25 words as a Back-Cover Text, to the end
+     of the list of Cover Texts in the Modified Version.  Only one
+     passage of Front-Cover Text and one of Back-Cover Text may be
+     added by (or through arrangements made by) any one entity.  If the
+     Document already includes a cover text for the same cover,
+     previously added by you or by arrangement made by the same entity
+     you are acting on behalf of, you may not add another; but you may
+     replace the old one, on explicit permission from the previous
+     publisher that added the old one.
+
+     The author(s) and publisher(s) of the Document do not by this
+     License give permission to use their names for publicity for or to
+     assert or imply endorsement of any Modified Version.
+
+  5. COMBINING DOCUMENTS
+
+     You may combine the Document with other documents released under
+     this License, under the terms defined in section 4 above for
+     modified versions, provided that you include in the combination
+     all of the Invariant Sections of all of the original documents,
+     unmodified, and list them all as Invariant Sections of your
+     combined work in its license notice, and that you preserve all
+     their Warranty Disclaimers.
+
+     The combined work need only contain one copy of this License, and
+     multiple identical Invariant Sections may be replaced with a single
+     copy.  If there are multiple Invariant Sections with the same name
+     but different contents, make the title of each such section unique
+     by adding at the end of it, in parentheses, the name of the
+     original author or publisher of that section if known, or else a
+     unique number.  Make the same adjustment to the section titles in
+     the list of Invariant Sections in the license notice of the
+     combined work.
+
+     In the combination, you must combine any sections Entitled
+     "History" in the various original documents, forming one section
+     Entitled "History"; likewise combine any sections Entitled
+     "Acknowledgements," and any sections Entitled "Dedications."  You
+     must delete all sections Entitled "Endorsements."
+
+  6. COLLECTIONS OF DOCUMENTS
+
+     You may make a collection consisting of the Document and other
+     documents released under this License, and replace the individual
+     copies of this License in the various documents with a single copy
+     that is included in the collection, provided that you follow the
+     rules of this License for verbatim copying of each of the
+     documents in all other respects.
+
+     You may extract a single document from such a collection, and
+     distribute it individually under this License, provided you insert
+     a copy of this License into the extracted document, and follow
+     this License in all other respects regarding verbatim copying of
+     that document.
+
+  7. AGGREGATION WITH INDEPENDENT WORKS
+
+     A compilation of the Document or its derivatives with other
+     separate and independent documents or works, in or on a volume of
+     a storage or distribution medium, is called an "aggregate" if the
+     copyright resulting from the compilation is not used to limit the
+     legal rights of the compilation's users beyond what the individual
+     works permit.  When the Document is included in an aggregate, this
+     License does not apply to the other works in the aggregate which
+     are not themselves derivative works of the Document.
+
+     If the Cover Text requirement of section 3 is applicable to these
+     copies of the Document, then if the Document is less than one half
+     of the entire aggregate, the Document's Cover Texts may be placed
+     on covers that bracket the Document within the aggregate, or the
+     electronic equivalent of covers if the Document is in electronic
+     form.  Otherwise they must appear on printed covers that bracket
+     the whole aggregate.
+
+  8. TRANSLATION
+
+     Translation is considered a kind of modification, so you may
+     distribute translations of the Document under the terms of section
+     4.  Replacing Invariant Sections with translations requires special
+     permission from their copyright holders, but you may include
+     translations of some or all Invariant Sections in addition to the
+     original versions of these Invariant Sections.  You may include a
+     translation of this License, and all the license notices in the
+     Document, and any Warranty Disclaimers, provided that you also
+     include the original English version of this License and the
+     original versions of those notices and disclaimers.  In case of a
+     disagreement between the translation and the original version of
+     this License or a notice or disclaimer, the original version will
+     prevail.
+
+     If a section in the Document is Entitled "Acknowledgements,"
+     "Dedications," or "History," the requirement (section 4) to
+     Preserve its Title (section 1) will typically require changing the
+     actual title.
+
+  9. TERMINATION
+
+     You may not copy, modify, sublicense, or distribute the Document
+     except as expressly provided for under this License.  Any other
+     attempt to copy, modify, sublicense or distribute the Document is
+     void, and will automatically terminate your rights under this
+     License.  However, parties who have received copies, or rights,
+     from you under this License will not have their licenses
+     terminated so long as such parties remain in full compliance.
+
+ 10. FUTURE REVISIONS OF THIS LICENSE
+
+     The Free Software Foundation may publish new, revised versions of
+     the GNU Free Documentation License from time to time.  Such new
+     versions will be similar in spirit to the present version, but may
+     differ in detail to address new problems or concerns.  See
+     http://www.gnu.org/copyleft/.
+
+     Each version of the License is given a distinguishing version
+     number.  If the Document specifies that a particular numbered
+     version of this License "or any later version" applies to it, you
+     have the option of following the terms and conditions either of
+     that specified version or of any later version that has been
+     published (not as a draft) by the Free Software Foundation.  If
+     the Document does not specify a version number of this License,
+     you may choose any version ever published (not as a draft) by the
+     Free Software Foundation.
+
+
+ADDENDUM: How to use this License for your documents
+====================================================
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and license
+notices just after the title page:
+
+     Copyright (C)  YEAR  YOUR NAME.
+     Permission is granted to copy, distribute and/or modify this document
+     under the terms of the GNU Free Documentation License, Version 1.2
+     or any later version published by the Free Software Foundation;
+     with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+     A copy of the license is included in the section entitled ``GNU
+     Free Documentation License.''
+
+   If you have Invariant Sections, Front-Cover Texts and Back-Cover
+Texts, replace the "with...Texts." line with this:
+
+     with the Invariant Sections being LIST THEIR TITLES, with the
+     Front-Cover Texts being LIST, and with the Back-Cover Texts being
+     LIST.
+
+   If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+   If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License, to
+permit their use in free software.
+
+\1f
+File: muse.info,  Node: Concept Index,  Prev: GNU Free Documentation License,  Up: Top
+
+Index
+*****
+
+\0\b[index\0\b]
+* Menu:
+
+* #author:                               Directives.           (line 18)
+* #date:                                 Directives.           (line 24)
+* #desc:                                 Directives.           (line 30)
+* #title:                                Directives.           (line 36)
+* anchors:                               Horizontal Rules and Anchors.
+                                                               (line 13)
+* blog, journal style:                   Journal.              (line  6)
+* blog, one-file-per-entry style:        Blosxom.              (line  6)
+* bugs, reporting:                       Getting Help and Reporting Bugs.
+                                                               (line  6)
+* citations:                             Citations.            (line  6)
+* comments:                              Comments.             (line  6)
+* compiling Muse:                        Installation.         (line 11)
+* contributors:                          Contributors.         (line  6)
+* dashes:                                Horizontal Rules and Anchors.
+                                                               (line  6)
+* Debian package for Muse:               Releases.             (line 12)
+* developer, becoming:                   Development.          (line 91)
+* development:                           Development.          (line  6)
+* directives:                            Directives.           (line  6)
+* editing Muse files <1>:                Publishing Files Overview.
+                                                               (line  6)
+* editing Muse files:                    Using Muse Mode.      (line  6)
+* ELPA package for Muse:                 Installation.         (line 64)
+* Email addresses:                       Implicit Links.       (line  6)
+* emphasizing text:                      Emphasizing Text.     (line  6)
+* examples:                              Paragraphs.           (line 21)
+* file extension, specifying:            File Extensions.      (line  6)
+* footnotes:                             Footnotes.            (line  6)
+* git version control system, using:     Development.          (line  9)
+* headings:                              Headings.             (line  6)
+* help, getting:                         Getting Help and Reporting Bugs.
+                                                               (line  6)
+* history, of Muse:                      History.              (line  6)
+* horizontal rules:                      Horizontal Rules and Anchors.
+                                                               (line  6)
+* HTML, inserting a raw block:           Paragraphs.           (line 28)
+* HTML, rendering blocks in monospace:   Paragraphs.           (line 21)
+* images:                                Images.               (line  6)
+* images, captions:                      Images.               (line 53)
+* images, displaying:                    Images.               (line 22)
+* images, inlined:                       Images.               (line 43)
+* images, local:                         Images.               (line 22)
+* images, without descriptions:          Images.               (line 43)
+* inserting files at publish time:       Tag Summary.          (line  6)
+* installing Muse:                       Installation.         (line 38)
+* inter-project links:                   Implicit Links.       (line 29)
+* InterWiki links:                       Implicit Links.       (line 29)
+* italicizing text:                      Emphasizing Text.     (line  6)
+* journal:                               Journal.              (line  6)
+* keystrokes:                            Keystroke Summary.    (line  6)
+* line breaks:                           Paragraphs.           (line 46)
+* links, explicit:                       Explicit Links.       (line  6)
+* links, implicit:                       Implicit Links.       (line  6)
+* links, raw:                            Implicit Links.       (line  6)
+* links, with images:                    Images.               (line  6)
+* links, with target on same page:       Horizontal Rules and Anchors.
+                                                               (line 13)
+* lisp, and insert command:              Embedded Lisp.        (line 13)
+* lisp, embedded:                        Embedded Lisp.        (line  6)
+* lists:                                 Lists.                (line  6)
+* lists, breaking lines:                 Lists.                (line 52)
+* lists, bullets:                        Lists.                (line 10)
+* lists, definitions:                    Lists.                (line 24)
+* lists, enumerated:                     Lists.                (line 17)
+* lists, nested:                         Lists.                (line 36)
+* literal text:                          Paragraphs.           (line 28)
+* markup:                                Markup Rules.         (line  6)
+* monospace, rendering blocks:           Paragraphs.           (line 21)
+* monospace, rendering words:            Emphasizing Text.     (line  6)
+* muse-define-style:                     Style Elements.       (line 11)
+* muse-derive-style:                     Deriving Styles.      (line 11)
+* muse-list-edit-minor-mode:             Muse List Edit Minor Mode.
+                                                               (line 44)
+* muse-project-alist, reference:         Options for Projects. (line  6)
+* muse-xml-encoding-map:                 XML.                  (line 22)
+* paragraphs:                            Paragraphs.           (line  6)
+* paragraphs, centered:                  Paragraphs.           (line  8)
+* paragraphs, quoted:                    Paragraphs.           (line 16)
+* poetry:                                Verse.                (line  6)
+* projects:                              Projects.             (line  6)
+* projects, multiple:                    Multiple Projects.    (line  6)
+* projects, options:                     Options for Projects. (line  6)
+* projects, single:                      Single Project.       (line  6)
+* projects, subdirectories:              Projects and Subdirectories.
+                                                               (line  6)
+* publishing styles:                     Publishing Styles.    (line  6)
+* publishing styles, blosxom-html:       Blosxom Options.      (line 12)
+* publishing styles, blosxom-xhtml:      Blosxom Options.      (line 15)
+* publishing styles, book-latex:         Book.                 (line 56)
+* publishing styles, book-pdf:           Book.                 (line 60)
+* publishing styles, chapbook-latex:     Poem.                 (line 45)
+* publishing styles, chapbook-pdf:       Poem.                 (line 48)
+* publishing styles, context:            ConTeXt.              (line 15)
+* publishing styles, context-pdf:        ConTeXt.              (line 18)
+* publishing styles, context-slides:     ConTeXt.              (line 22)
+* publishing styles, context-slides-pdf: ConTeXt.              (line 40)
+* publishing styles, deriving:           Deriving Styles.      (line  6)
+* publishing styles, docbook:            DocBook.              (line 11)
+* publishing styles, html:               HTML.                 (line 11)
+* publishing styles, ikiwiki:            Ikiwiki.              (line 28)
+* publishing styles, info-pdf:           Texinfo.              (line 17)
+* publishing styles, journal-book-latex: Journal.              (line 82)
+* publishing styles, journal-book-pdf:   Journal.              (line 85)
+* publishing styles, journal-html:       Journal.              (line 70)
+* publishing styles, journal-latex:      Journal.              (line 76)
+* publishing styles, journal-pdf:        Journal.              (line 79)
+* publishing styles, journal-rdf:        Journal.              (line 88)
+* publishing styles, journal-rss:        Journal.              (line 91)
+* publishing styles, journal-rss-entry:  Journal.              (line 94)
+* publishing styles, journal-xhtml:      Journal.              (line 73)
+* publishing styles, latex:              LaTeX.                (line 23)
+* publishing styles, latexcjk:           LaTeX.                (line 30)
+* publishing styles, lecture-notes:      LaTeX.                (line 55)
+* publishing styles, lecture-notes-pdf:  LaTeX.                (line 61)
+* publishing styles, pdf:                LaTeX.                (line 26)
+* publishing styles, pdfcjk:             LaTeX.                (line 33)
+* publishing styles, poem-latex:         Poem.                 (line 39)
+* publishing styles, poem-pdf:           Poem.                 (line 42)
+* publishing styles, RSS 1.0:            Journal.              (line 88)
+* publishing styles, RSS 2.0:            Journal.              (line 91)
+* publishing styles, slides:             LaTeX.                (line 37)
+* publishing styles, slides-pdf:         LaTeX.                (line 52)
+* publishing styles, texi:               Texinfo.              (line 14)
+* publishing styles, xml:                XML.                  (line 15)
+* publishing, including markup in headers and footers: Tag Summary.
+                                                               (line  6)
+* publishing, inserting files:           Tag Summary.          (line  6)
+* publishing, markup functions:          Markup Functions.     (line  6)
+* publishing, markup regexps:            Markup Regexps.       (line  6)
+* publishing, markup strings:            Markup Strings.       (line  6)
+* publishing, markup tags:               Markup Tags.          (line  6)
+* publishing, omitting lines:            Comments.             (line  6)
+* publishing, rules:                     Markup Regexps.       (line  6)
+* publishing, style elements:            Style Elements.       (line  6)
+* quotations:                            Paragraphs.           (line 16)
+* releases, Debian package:              Releases.             (line 12)
+* releases, from source:                 Releases.             (line 31)
+* releases, Ubuntu package:              Releases.             (line 19)
+* settings:                              Getting Started.      (line  6)
+* settings, init file:                   Loading Muse.         (line  6)
+* tables:                                Tables.               (line  6)
+* tables, orgtbl-mode style:             Tables.               (line 26)
+* tables, simple:                        Tables.               (line  6)
+* tables, table.el style:                Tables.               (line 42)
+* tags:                                  Tag Summary.          (line  6)
+* tags, <cite>:                          Citations.            (line  6)
+* turn-off-muse-list-edit-minor-mode:    Muse List Edit Minor Mode.
+                                                               (line 67)
+* turn-on-muse-list-edit-minor-mode:     Muse List Edit Minor Mode.
+                                                               (line 64)
+* Ubuntu package for Muse:               Releases.             (line 19)
+* underlining text:                      Emphasizing Text.     (line  6)
+* updating Muse with git:                Development.          (line 66)
+* URLs:                                  Implicit Links.       (line  6)
+* verbatim text:                         Emphasizing Text.     (line  6)
+* verses:                                Verse.                (line  6)
+* verses, multiple stanzas:              Verse.                (line 20)
+* WikiNames:                             Implicit Links.       (line 18)
+* WYSIWYG:                               Emphasizing Text.     (line 15)
+
+
+\1f
+Tag Table:
+Node: Top\7f1427
+Node: Preface\7f7398
+Node: Introduction\7f7871
+Node: Obtaining Muse\7f9320
+Node: Releases\7f9657
+Node: Development\7f11046
+Node: Installation\7f14905
+Node: Getting Started\7f17564
+Node: Loading Muse\7f17946
+Node: Using Muse Mode\7f18893
+Node: Publishing Files Overview\7f20926
+Node: File Extensions\7f22170
+Node: Projects\7f23390
+Node: Single Project\7f24012
+Node: Multiple Projects\7f24962
+Node: Projects and Subdirectories\7f26365
+Node: Options for Projects\7f28048
+Node: Keystroke Summary\7f32872
+Node: Markup Rules\7f34991
+Node: Paragraphs\7f36710
+Node: Headings\7f38711
+Node: Directives\7f39334
+Node: Emphasizing Text\7f40654
+Node: Footnotes\7f41431
+Node: Verse\7f42068
+Node: Lists\7f42812
+Node: Tables\7f44361
+Node: Explicit Links\7f46095
+Node: Implicit Links\7f46810
+Node: Images\7f49153
+Node: Horizontal Rules and Anchors\7f51643
+Node: Embedded Lisp\7f52291
+Node: Citations\7f53387
+Node: Comments\7f55871
+Node: Tag Summary\7f56530
+Node: Publishing Styles\7f64773
+Node: Blosxom\7f65872
+Node: Blosxom Requirements\7f66479
+Node: Blosxom Entries\7f70014
+Node: Blosxom Options\7f71577
+Node: Book\7f72505
+Node: ConTeXt\7f75564
+Node: DocBook\7f79691
+Node: HTML\7f81168
+Node: Ikiwiki\7f85163
+Node: Journal\7f87502
+Node: LaTeX\7f94029
+Node: Poem\7f99573
+Node: Texinfo\7f101782
+Node: XML\7f103699
+Node: Extending Muse\7f105730
+Node: Markup Functions\7f106367
+Ref: muse-publish-markup-functions\7f106540
+Node: Markup Regexps\7f107194
+Ref: muse-publish-markup-regexps\7f107372
+Node: Markup Strings\7f110379
+Node: Markup Tags\7f116839
+Ref: muse-publish-markup-tags\7f117032
+Node: Style Elements\7f118151
+Node: Deriving Styles\7f121558
+Node: Miscellaneous\7f122857
+Node: Muse List Edit Minor Mode\7f123142
+Node: Getting Help and Reporting Bugs\7f125621
+Node: History\7f128923
+Node: Contributors\7f129706
+Node: GNU Free Documentation License\7f130214
+Node: Concept Index\7f152443
+\1f
+End Tag Table
diff --git a/packages/muse/texi/Makefile b/packages/muse/texi/Makefile
new file mode 100644 (file)
index 0000000..8f9f341
--- /dev/null
@@ -0,0 +1,29 @@
+.PHONY: all info-only doc clean realclean distclean fullclean install
+.PRECIOUS: %.info %.html
+
+DEFS = $(shell test -f ../Makefile.defs && echo ../Makefile.defs \
+       || echo ../Makefile.defs.default)
+
+include $(DEFS)
+
+all: doc
+
+%.info: %.texi
+       makeinfo $<
+
+%.html: %.texi
+       makeinfo --html --no-split $<
+
+info-only: $(MANUAL).info
+
+doc: $(MANUAL).info $(MANUAL).html
+
+clean: ;
+
+distclean realclean fullclean: clean
+       -rm -f $(MANUAL).info $(MANUAL).html
+
+install: $(MANUAL).info
+       [ -d $(INFODIR) ] || install -d $(INFODIR)
+       install -m 0644 $(MANUAL).info $(INFODIR)/$(MANUAL)
+       $(call install_info,$(MANUAL))
diff --git a/packages/muse/texi/dir-template b/packages/muse/texi/dir-template
new file mode 100644 (file)
index 0000000..08346cd
--- /dev/null
@@ -0,0 +1,15 @@
+This is the file .../info/dir, which contains the
+topmost node of the Info hierarchy, called (dir)Top.
+The first time you invoke Info you start off looking at this node.
+\1f
+File: dir,     Node: Top       This is the top of the INFO tree
+
+  This (the Directory node) gives a menu of major topics.
+  Typing "q" exits, "?" lists all Info commands, "d" returns here,
+  "h" gives a primer for first-timers,
+  "mEmacs<Return>" visits the Emacs manual, etc.
+
+  In Emacs, you can click mouse button 2 on a menu item or cross reference
+  to select it.
+
+* Menu:
diff --git a/packages/muse/texi/doclicense.texi b/packages/muse/texi/doclicense.texi
new file mode 100644 (file)
index 0000000..83e9d6b
--- /dev/null
@@ -0,0 +1,416 @@
+@c -*-texinfo-*-
+@center Version 1.2, November 2002
+
+@display
+Copyright (C) 2000,2001,2002  Free Software Foundation, Inc.
+51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+@end display
+@sp 1
+@enumerate 0
+@item
+PREAMBLE
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document ``free'' in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+
+This License is a kind of ``copyleft,'' which means that derivative
+works of the document must themselves be free in the same sense.  It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does.  But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book.  We recommend this License
+principally for works whose purpose is instruction or reference.
+
+@sp 1
+@item
+APPLICABILITY AND DEFINITIONS
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License.  Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein.  The ``Document,'' below,
+refers to any such manual or work.  Any member of the public is a
+licensee, and is addressed as ``you.''  You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+
+A ``Modified Version'' of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A ``Secondary Section'' is a named appendix or a front-matter section of
+the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall subject
+(or to related matters) and contains nothing that could fall directly
+within that overall subject.  (Thus, if the Document is in part a
+textbook of mathematics, a Secondary Section may not explain any
+mathematics.)  The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+
+The ``Invariant Sections'' are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License.  If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant.  The Document may contain zero
+Invariant Sections.  If the Document does not identify any Invariant
+Sections then there are none.
+
+The ``Cover Texts'' are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License.  A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+
+A ``Transparent'' copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters.  A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text.  A copy that is not ``Transparent'' is called ``Opaque.''
+
+
+Examples of suitable formats for Transparent copies include plain
+ASCII without markup, Texinfo input format, LaTeX input format, SGML
+or XML using a publicly available DTD, and standard-conforming simple
+HTML, PostScript or PDF designed for human modification.  Examples of
+transparent image formats include PNG, XCF and JPG.  Opaque formats
+include proprietary formats that can be read and edited only by
+proprietary word processors, SGML or XML for which the DTD and/or
+processing tools are not generally available, and the
+machine-generated HTML, PostScript or PDF produced by some word
+processors for output purposes only.
+
+The ``Title Page'' means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page.  For works in
+formats which do not have any title page as such, ``Title Page'' means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+
+A section ``Entitled XYZ'' means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language.  (Here XYZ stands for a
+specific section name mentioned below, such as ``Acknowledgements,''
+``Dedications,'' ``Endorsements,'' or ``History.'')  To ``Preserve the Title''
+of such a section when you modify the Document means that it remains a
+section ``Entitled XYZ'' according to this definition.
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document.  These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+@sp 1
+@item
+VERBATIM COPYING
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License.  You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute.  However, you may accept
+compensation in exchange for copies.  If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+@sp 1
+@item
+COPYING IN QUANTITY
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover.  Both covers must also clearly and legibly identify
+you as the publisher of these copies.  The front cover must present
+the full title with all words of the title equally prominent and
+visible.  You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+@sp 1
+@item
+MODIFICATIONS
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it.  In addition, you must do these things in the Modified Version:
+
+A. Use in the Title Page (and on the covers, if any) a title distinct
+   from that of the Document, and from those of previous versions
+   (which should, if there were any, be listed in the History section
+   of the Document).  You may use the same title as a previous version
+   if the original publisher of that version gives permission.@*
+B. List on the Title Page, as authors, one or more persons or entities
+   responsible for authorship of the modifications in the Modified
+   Version, together with at least five of the principal authors of the
+   Document (all of its principal authors, if it has fewer than five),
+   unless they release you from this requirement.@*
+C. State on the Title page the name of the publisher of the
+   Modified Version, as the publisher.@*
+D. Preserve all the copyright notices of the Document.@*
+E. Add an appropriate copyright notice for your modifications
+   adjacent to the other copyright notices.@*
+F. Include, immediately after the copyright notices, a license notice
+   giving the public permission to use the Modified Version under the
+   terms of this License, in the form shown in the Addendum below.@*
+G. Preserve in that license notice the full lists of Invariant Sections
+   and required Cover Texts given in the Document's license notice.@*
+H. Include an unaltered copy of this License.@*
+I. Preserve the section Entitled ``History,'' Preserve its Title, and add
+   to it an item stating at least the title, year, new authors, and
+   publisher of the Modified Version as given on the Title Page.  If
+   there is no section Entitled ``History'' in the Document, create one
+   stating the title, year, authors, and publisher of the Document as
+   given on its Title Page, then add an item describing the Modified
+   Version as stated in the previous sentence.@*
+J. Preserve the network location, if any, given in the Document for
+   public access to a Transparent copy of the Document, and likewise
+   the network locations given in the Document for previous versions
+   it was based on.  These may be placed in the ``History'' section.
+   You may omit a network location for a work that was published at
+   least four years before the Document itself, or if the original
+   publisher of the version it refers to gives permission.@*
+K. For any section Entitled ``Acknowledgements'' or ``Dedications,''
+   Preserve the Title of the section, and preserve in the section all
+   the substance and tone of each of the contributor acknowledgements
+   and/or dedications given therein.@*
+L. Preserve all the Invariant Sections of the Document,
+   unaltered in their text and in their titles.  Section numbers
+   or the equivalent are not considered part of the section titles.@*
+M. Delete any section Entitled ``Endorsements.''  Such a section
+   may not be included in the Modified Version.@*
+N. Do not retitle any existing section to be Entitled ``Endorsements''
+   or to conflict in title with any Invariant Section.@*
+O. Preserve any Warranty Disclaimers.@*
+@sp 1
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant.  To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+
+You may add a section Entitled ``Endorsements,'' provided it contains
+nothing but endorsements of your Modified Version by various
+parties--for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version.  Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity.  If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+@sp 1
+@item
+COMBINING DOCUMENTS
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy.  If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections Entitled ``History''
+in the various original documents, forming one section Entitled
+``History''; likewise combine any sections Entitled ``Acknowledgements,''
+and any sections Entitled ``Dedications.''  You must delete all sections
+Entitled ``Endorsements.''
+@sp 1
+@item
+COLLECTIONS OF DOCUMENTS
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+@sp 1
+@item
+AGGREGATION WITH INDEPENDENT WORKS
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an ``aggregate'' if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+@sp 1
+@item
+TRANSLATION
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections.  You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers.  In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+
+If a section in the Document is Entitled ``Acknowledgements,''
+``Dedications,'' or ``History,'' the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+@sp 1
+@item
+TERMINATION
+
+You may not copy, modify, sublicense, or distribute the Document except
+as expressly provided for under this License.  Any other attempt to
+copy, modify, sublicense or distribute the Document is void, and will
+automatically terminate your rights under this License.  However,
+parties who have received copies, or rights, from you under this
+License will not have their licenses terminated so long as such
+parties remain in full compliance.
+@sp 1
+@item
+FUTURE REVISIONS OF THIS LICENSE
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation License from time to time.  Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.  See
+http://www.gnu.org/copyleft/.
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License ``or any later version'' applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation.  If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.
+
+@end enumerate
+
+@unnumberedsec ADDENDUM: How to use this License for your documents
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+
+@smallexample
+@group
+Copyright (C)  @var{year}  @var{your name}.
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2
+or any later version published by the Free Software Foundation;
+with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+A copy of the license is included in the section entitled ``GNU
+Free Documentation License.''
+@end group
+@end smallexample
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the ``with...Texts.'' line with this:
+
+@smallexample
+@group
+with the Invariant Sections being @var{list their titles}, with the
+Front-Cover Texts being @var{list}, and with the Back-Cover Texts being
+@var{list}.
+@end group
+@end smallexample
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
+
+@ignore
+   arch-tag: c1679162-1d8a-4f02-bc52-2e71765f0165
+@end ignore
diff --git a/packages/muse/texi/muse.texi b/packages/muse/texi/muse.texi
new file mode 100644 (file)
index 0000000..f62c030
--- /dev/null
@@ -0,0 +1,4247 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename muse.info
+@settitle Muse
+@c %**end of header
+
+@dircategory Emacs
+@direntry
+* Muse: (muse). Authoring and publishing environment for Emacs.
+@end direntry
+
+@syncodeindex fn cp
+
+@copying
+This manual is for Emacs Muse version 3.20.
+
+Copyright @copyright{} 2004, 2005, 2006, 2007,
+2008, 2009, 2010  Free Software Foundation, Inc.
+
+@quotation
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with the Front-Cover texts being ``A GNU
+Manual'', and with the Back-Cover Texts as in (a) below.  A copy of the
+license is included in the section entitled ``GNU Free Documentation
+License'' in this manual.
+
+(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify
+this GNU Manual, like GNU software.  Copies published by the Free
+Software Foundation raise funds for GNU development.''
+
+This document is part of a collection distributed under the GNU Free
+Documentation License.  If you want to distribute this document
+separately from the collection, you can do so by adding a copy of the
+license to the document, as described in section 6 of the license.
+
+All Emacs Lisp code contained in this document may be used, distributed,
+and modified without restriction.
+@end quotation
+@end copying
+
+@titlepage
+@title Muse manual
+@subtitle an authoring and publishing environment
+@subtitle for GNU Emacs and XEmacs
+
+@c The following two commands
+@c start the copyright page.
+@page
+@vskip 0pt plus 1filll
+@insertcopying
+@end titlepage
+
+@c So the toc is printed at the start
+@contents
+
+@ifnottex
+@node Top, Preface, (dir), (dir)
+@comment  node-name,  next,  previous,  up
+@top Muse
+
+@insertcopying
+@end ifnottex
+
+@menu
+* Preface::                     About the documentation.
+* Introduction::                What is Muse?
+* Obtaining Muse::              How to get Muse releases and development
+                                  changes.
+* Installation::                Compiling and installing Muse.
+* Getting Started::             Setting up Muse and editing files.
+* Projects::                    Creating and managing Muse projects.
+* Keystroke Summary::           Keys used in Muse mode.
+* Markup Rules::                Rules for using markup.
+* Publishing Styles::           Publishing various types of documents.
+* Extending Muse::              Making your own publishing styles.
+* Miscellaneous::               Miscellaneous add-ons, like a minor mode.
+* Getting Help and Reporting Bugs::  
+* History::                     History of this document.
+* Contributors::                Contributors to this documentation.
+* GNU Free Documentation License::  The license for this documentation.
+* Concept Index::               Search for terms.
+
+@detailmenu
+ --- The Detailed Node Listing ---
+
+How to Get Muse Releases and Development Changes
+
+* Releases::                    Released versions of Muse.
+* Development::                 Latest unreleased development changes.
+
+Getting Started
+
+* Loading Muse::                How to load Muse.
+* Using Muse Mode::             How to edit files in Muse.
+* Publishing Files Overview::   Publishing a single file or project.
+* File Extensions::             Using a different file extension.
+
+Creating and Managing Muse Projects
+
+* Single Project::              A single-project example.
+* Multiple Projects::           A multiple-project example.
+* Projects and Subdirectories::  Publishing subdirectories in projects.
+* Options for Projects::        Listing of available options for projects.
+
+Rules for Using Markup
+
+* Paragraphs::                  Paragraphs: centering and quoting.
+* Headings::                    Levels of headings.
+* Directives::                  Directives at the beginning of a
+                                  document.
+* Emphasizing Text::            Bold, italicized, and underlined text.
+* Footnotes::                   Making notes to be shown at the end.
+* Verse::                       Indicating poetic stanzas.
+* Lists::                       Lists of items.
+* Tables::                      Generation of data tables.
+* Explicit Links::              Hyperlinks and email addresses with
+                                  descriptions.
+* Implicit Links::              Bare URLs, WikiNames, and InterWiki
+                                  links.
+* Images::                      Publishing and displaying images.
+* Horizontal Rules and Anchors::  Inserting a horizontal line or anchor.
+* Embedded Lisp::               Evaluating Emacs Lisp code in documents
+                                  for extensibility.
+* Citations::                   Support for citing other resources.
+* Comments::                    Lines to omit from published output.
+* Tag Summary::                 Tags that Muse recognizes.
+
+Publishing Various Types of Documents
+
+* Blosxom::                     Integrating Muse and pyblosxom.cgi.
+* Book::                        Publishing entries into a compilation.
+* ConTeXt::                     Publishing ConTeXt documents.
+* DocBook::                     Publishing in DocBook XML form.
+* HTML::                        Publishing in HTML or XHTML form.
+* Ikiwiki::                     Integrating with ikiwiki.
+* Journal::                     Keeping a journal or blog.
+* LaTeX::                       Publishing LaTeX documents.
+* Poem::                        Publish a poem to LaTeX or PDF.
+* Texinfo::                     Publish entries to Texinfo format or PDF.
+* XML::                         Publish entries to XML.
+
+Integrating Muse and pyblosxom.cgi
+
+* Blosxom Requirements::        Other tools needed for the Blosxom style.
+* Blosxom Entries::             Format of a Blosxom entry and automation.
+* Blosxom Options::             Blosxom styles and options provided.
+
+Making your own publishing styles
+
+* Markup Functions::            Specifying functions to mark up text.
+* Markup Regexps::              Markup rules for publishing.
+* Markup Strings::              Strings specific to a publishing style.
+* Markup Tags::                 Tag specifications for special markup.
+* Style Elements::              Parameters used for defining styles.
+* Deriving Styles::             Deriving a new style from an existing
+                                  one.
+
+Miscellaneous add-ons, like a minor mode
+
+* Muse List Edit Minor Mode::   Edit lists easily in other major modes.
+
+@end detailmenu
+@end menu
+
+@node Preface, Introduction, Top, Top
+@comment  node-name,  next,  previous,  up
+@chapter About the documentation
+
+This document describes Muse, which was written by John Wiegley and is
+now maintained by Michael Olson.  Several versions of this manual are
+available on-line.
+
+@itemize @bullet
+@item PDF: http://mwolson.org/static/doc/muse.pdf
+@item HTML (single file): http://mwolson.org/static/doc/muse.html
+@item HTML (multiple files): http://mwolson.org/static/doc/muse/
+@end itemize
+
+@node Introduction, Obtaining Muse, Preface, Top
+@comment  node-name,  next,  previous,  up
+@chapter What is Muse?
+
+Emacs Muse (also known as ``Muse'' or ``Emacs-Muse'') is an authoring
+and publishing environment for Emacs.  It simplifies the process of
+writing documents and publishing them to various output formats.
+
+Muse consists of two main parts: an enhanced text-mode for authoring
+documents and navigating within Muse projects, and a set of publishing
+styles for generating different kinds of output.
+
+What makes Muse distinct from other text-publishing systems is a modular
+environment, with a rather simple core, in which "styles" are derived
+from to create new styles.  Much of Muse's overall functionality is
+optional.  For example, you can use the publisher without the
+major-mode, or the mode without doing any publishing; or if you don't
+load the Texinfo or LaTeX modules, those styles won't be available.
+
+The Muse codebase is a departure from emacs-wiki.el version 2.44. The
+code has been restructured and rewritten, especially its publishing
+functions.  The focus in this revision is on the authoring and
+publishing aspects, and the "wikiness" has been removed as a default
+behavior (available in the optional @file{muse-wiki} module).  CamelCase
+words are no longer special by default.
+
+One of the principal aims in the development of Muse is to make it very
+easy to produce good-looking, standards-compliant documents.
+
+@node Obtaining Muse, Installation, Introduction, Top
+@comment  node-name,  next,  previous,  up
+@chapter How to Get Muse Releases and Development Changes
+
+@menu
+* Releases::                    Released versions of Muse.
+* Development::                 Latest unreleased development changes.
+@end menu
+
+@node Releases, Development, Obtaining Muse, Obtaining Muse
+@comment  node-name,  next,  previous,  up
+@section Released versions of Muse
+
+Choose to install a release if you want to minimize risk.
+
+Errors are corrected in development first.  User-visible changes will be
+announced on the @email{muse-el-discuss@@gna.org} mailing list.
+@xref{Getting Help and Reporting Bugs}.
+
+@cindex releases, Debian package
+@cindex Debian package for Muse
+Debian users can get Muse via apt-get.  The @file{muse-el} package is
+available both at Michael Olson's APT repository and the official Debian
+repository.  To make use of the former, add the following line to your
+@file{/etc/apt/sources.list} file and run @code{apt-get install muse}.
+
+@example
+deb http://mwolson.org/debian/ ./
+@end example
+
+@cindex releases, Ubuntu package
+@cindex Ubuntu package for Muse
+Ubuntu users can also get Muse via apt-get.  The @file{muse-el} package
+is available both at Michael Olson's APT repository and the official
+Ubuntu repository.  To make use of the former, add the following line to
+your @file{/etc/apt/sources.list} file and run @code{apt-get install
+muse}.
+
+@example
+deb http://mwolson.org/ubuntu/ ./
+@end example
+
+The reason for making separate Debian and Ubuntu packages is that this
+manual is under the GFDL, and Debian will not allow it to be distributed
+in its main repository.  Ubuntu, on the other hand, permits this manual
+to be included with the @file{muse-el} package.
+
+@cindex releases, from source
+Alternatively, you can download the latest release from
+@uref{http://download.gna.org/muse-el/} .
+
+@node Development,  , Releases, Obtaining Muse
+@comment  node-name,  next,  previous,  up
+@section Latest unreleased development changes
+@cindex development
+
+Choose the development version if you want to live on the bleeding edge
+of Muse development or try out new features before release.
+
+@cindex git version control system, using
+The git version control system allows you to keep up-to-date with the
+latest changes to the development version of Muse.  It also allows you
+to contribute changes (via commits, if you are have developer access to
+the repository, or via patches, otherwise).  If you would like to
+contribute to Muse development, it is highly recommended that you use
+git.
+
+If you are new to git, you might find this tutorial helpful:
+@uref{http://www.kernel.org/pub/software/scm/git/docs/tutorial.html}.
+
+Downloading the Muse module with git and staying up-to-date involves
+the following steps.
+
+@enumerate
+@item Install git.
+
+@itemize @bullet
+@item Debian and Ubuntu: @kbd{apt-get install git-core}.
+@item Windows: @uref{http://git.or.cz/gitwiki/WindowsInstall}.
+@item Other operating systems: download, compile, and install the source
+from @uref{http://www.kernel.org/pub/software/scm/git/}, or find a git
+package for your operating system.
+@end itemize
+
+@item Download the Muse development branch.
+
+If you have developer access to Muse, do:
+
+@example
+git clone ssh://repo.or.cz/srv/git/muse-el.git muse
+@end example
+
+otherwise, do:
+
+@example
+git clone git://repo.or.cz/muse-el.git muse
+@end example
+
+If you are behind a restrictive firewall, and do not have developer
+access, then do the following instead:
+
+@example
+git clone http://repo.or.cz/r/muse-el.git muse
+@end example
+
+@item List upstream changes that are missing from your local copy.
+Do this whenever you want to see whether new changes have been committed
+to Muse.  If you wish, you may skip this step and proceed directly to
+the ``update'' step.
+
+@example
+# Change to the source directory you are interested in.
+cd muse
+
+# Fetch new changes from the repository, but don't apply them yet
+git fetch origin
+
+# Display log messages for the new changes
+git log HEAD..origin
+@end example
+
+``origin'' is git's name for the location where you originally got Muse
+from.  You can change this location at any time by editing the
+@file{.git/config} file in the directory where the Muse source was
+placed.
+
+@cindex updating Muse with git
+@item Update to the latest version by pulling in any missing changes.
+
+@example
+cd muse
+git pull origin
+@end example
+
+git will show how many files changed, and will provide a visual display
+for how many lines were changed in each file.
+
+@end enumerate
+
+There are other ways to interact with the Muse repository.
+
+@itemize
+@item Browse git repo: @uref{http://repo.or.cz/w/muse-el.git}
+@item Latest development snapshot: @uref{http://mwolson.org/static/dist/muse-latest.tar.gz}
+@item Latest development snapshot (zip file): @uref{http://mwolson.org/static/dist/muse-latest.zip}
+@end itemize
+
+The latest development snapshot can lag behind the git repo by as much
+as 20 minutes, but never more than that.
+
+@subheading Becoming a Muse developer
+@cindex developer, becoming
+
+If you want commit access to the shared Muse repository, then register
+an account at @uref{http://repo.or.cz} (be sure to add an SSH key), and
+contact the current maintainer at @email{mwolson@@gnu.org}.  It would be
+best to send some patches to the @email{muse-el-discuss@@gna.org}
+mailing list first, so that he knows that you know what you are doing.
+@xref{Getting Help and Reporting Bugs}, for instructions on subscribing
+to the mailing list.
+
+You must also be willing to sign a copyright assignment for your changes
+to Muse, since Muse is a GNU project.  The current maintainer will
+assist you in this process if you contact him.
+
+For information on committing changes to Muse and performing
+development, please consult
+@uref{http://emacswiki.org/cgi-bin/wiki/MuseDevelopment}.
+
+@node Installation, Getting Started, Obtaining Muse, Top
+@comment  node-name,  next,  previous,  up
+@chapter Compiling and Installing Muse
+
+Muse may be compiled and installed on your machine.
+
+@subheading Compilation
+@cindex compiling Muse
+
+This is an optional step, since Emacs Lisp source code does not
+necessarily have to be byte-compiled.  Byte-compilation may yield a very
+slight speed increase.
+
+A working copy of Emacs or XEmacs is needed in order to compile Emacs
+Muse.  By default, the program that is installed with the name
+@command{emacs} will be used.
+
+If you want to use the @command{xemacs} binary to perform the
+compilation, you must copy @file{Makefile.defs.default} to
+@file{Makefile.defs} in the top-level directory, and then edit
+@file{Makefile.defs} as follows.  You can put either a full path to an
+Emacs or XEmacs binary or just the command name, as long as it is in the
+@env{PATH}.
+
+@example
+EMACS    = xemacs
+SITEFLAG = -no-site-file
+# Edit the section as necessary
+install_info = install-info --section "XEmacs 21.4" $(1).info \
+        $(INFODIR)/dir || :
+@end example
+
+Running @code{make} in the top-level directory should compile the Muse
+source files in the @file{lisp} directory, and generate an autoloads
+file in @file{lisp/muse-autoloads.el}.
+
+@subheading Installation
+@cindex installing Muse
+
+Muse may be installed into your file hierarchy by doing the following.
+
+Copy @file{Makefile.defs.default} to @file{Makefile.defs} in the
+top-level directory, if you haven't done so already.  Then edit the
+@file{Makefile.defs} file so that @env{ELISPDIR} points to where you
+want the source and compiled Muse files to be installed and
+@env{INFODIR} indicates where to put the Muse manual.  You may use a
+combination of @env{DESTDIR} and @env{PREFIX} to further determine where
+the installed files should be placed.  As mentioned earlier, you will
+want to edit @env{EMACS} and @env{SITEFLAG} as shown in the Compilation
+section if you are using XEmacs.
+
+If you are installing Muse on a Debian or Ubuntu system, you might want
+to change the value of @env{INSTALLINFO} as specified in
+@file{Makefile.defs}.
+
+If you wish to install Muse to different locations than the defaults
+specify, edit @file{Makefile.defs} accordingly.
+
+Run @code{make} as a normal user, if you haven't done so already.
+
+Run @code{make install} as the root user if you have chosen installation
+locations that require root permissions.
+
+@subheading ELPA
+@cindex ELPA package for Muse
+
+For those used to installing software packages, there will be a
+@code{muse} package available in the Emacs Lisp Package Archive
+(abbreviated ``ELPA'') as of the 3.10 release of Muse.  This package
+will be compiled and installed automatically in a user-specific
+location.  For more information on ELPA, see
+@uref{http://tromey.com/elpa/}.
+
+@node Getting Started, Projects, Installation, Top
+@comment  node-name,  next,  previous,  up
+@chapter Getting Started
+@cindex settings
+
+@menu
+* Loading Muse::                How to load Muse.
+* Using Muse Mode::             How to edit files in Muse.
+* Publishing Files Overview::   Publishing a single file or project.
+* File Extensions::             Using a different file extension.
+@end menu
+
+@node Loading Muse, Using Muse Mode, Getting Started, Getting Started
+@comment  node-name,  next,  previous,  up
+@section How to Load Muse
+@cindex settings, init file
+
+To use Muse, add the directory containing its files to your
+@code{load-path} variable, in your @file{.emacs} file.  Then, load in
+the authoring mode, and the styles you wish to publish to.  An example
+follows.
+
+@lisp
+(add-to-list 'load-path "<path to Muse>")
+
+(require 'muse-mode)     ; load authoring mode
+
+(require 'muse-html)     ; load publishing styles I use
+(require 'muse-latex)
+(require 'muse-texinfo)
+(require 'muse-docbook)
+
+(require 'muse-project)  ; publish files in projects
+@end lisp
+
+An easy way of seeing which settings are available and changing settings
+is to use the Muse customization interface.  To do this, type
+@kbd{M-x customize-group muse RET}.  Each of the options has its own
+documentation.  Options are grouped logically according to what effect
+they have.
+
+@node Using Muse Mode, Publishing Files Overview, Loading Muse, Getting Started
+@comment  node-name,  next,  previous,  up
+@section How to Edit Files in Muse
+@cindex editing Muse files
+
+Muse Mode should automatically be activated when you visit a file with a
+``.muse'' extension.  One such file is @file{QuickStart.muse}, which is
+available in the @file{examples} directory of the Muse distribution.
+You can tell that Muse Mode has been activated by checking for the text
+``Muse'' in your mode line.  If Muse Mode has not been activated, you
+may activate it by type @kbd{M-x muse-mode RET}.
+
+You will notice that Muse files are highlighted very simply.  Links are
+colored blue, headings are large and bold text, and @verb{|<example>|}
+tags are colored in grey.
+
+There are several different ways to edit things like links, which hide
+the underlying Muse markup.  One way is to toggle font-locking off by
+hitting @kbd{C-c C-l}, which is also @kbd{M-x font-lock-mode}, make
+changes, and then hit @kbd{C-c C-l} again to toggle font-locking back
+on.  Another way is just to move into the text and edit it.  Markup can
+also be removed by normal deletion methods, though some side effects
+might require a second deletion.
+
+For the particular case of editing links, it is easiest to move to the
+link and do @kbd{C-c C-e}, which is also @kbd{M-x
+muse-edit-link-at-point}.  This prompts you for the link and its
+description, using the previous contents of the link as initial values.
+A link to another Muse file may be created by hitting @kbd{C-c TAB l}.
+A link to a URL may be created by hitting @kbd{C-c TAB u}.  Links may be
+followed by hitting @kbd{RET} on them.
+
+If you want to add a new list item, this may by accomplished by hitting
+@kbd{M-RET}.  This will put a dash and some spaces on the screen.  The
+dash is the Muse markup that indicates a list item.  It is also possible
+to created ``nested'' lists with this command, by adjusting the number
+of spaces in front of the dashes.  If you have lists with long lines,
+you can move to a list item and hit @kbd{M-q} to wrap it onto multiple
+lines.
+
+@node Publishing Files Overview, File Extensions, Using Muse Mode, Getting Started
+@comment  node-name,  next,  previous,  up
+@section Publishing a Single File or Project
+@cindex editing Muse files
+
+The command @kbd{M-x muse-project-publish-this-file} will publish the
+current document to any available publishing style (a publishing style
+is an output format, like HTML or Docbook), placing the output in the
+current directory.  If you are in Muse Mode, this command will be bound
+to @kbd{C-c C-t}.  If the file has been published recently, and its
+contents have not changed, running @kbd{C-c C-t} again will not publish
+the file.  To force publishing in this case, do @kbd{C-u C-c C-t}.
+
+If you have set up projects and are visiting a file that is part of a
+project, then @kbd{C-c C-t} will restrict the output formats to those
+which are used by the project, and will automatically publish to the
+output directory defined by the project.  If you want to publish to a
+different directory or use a different format, then use @kbd{C-c M-C-t},
+which is also @kbd{M-x muse-publish-this-file}.
+
+If the currently opened file is part of a defined project in
+@code{muse-project-alist}, it (and the rest of the changed files in a
+project) may be published using @kbd{C-c C-p}.
+
+@node File Extensions, , Publishing Files Overview, Getting Started
+@comment  node-name,  next,  previous,  up
+@section Using a Different File Extension
+@cindex file extension, specifying
+
+By default, Muse expects all project files to have the file extension
+@file{.muse}. Files without this extension will not be associated with
+Muse mode and will not be considered part of any project, even if they
+are within a project directory.
+
+If you don't want to use @file{.muse}, you can customize the extension
+by setting the value of @code{muse-file-extension}.
+
+If you don't want to use any extension at all, and want Muse to
+autodetect project files based on their location, then add the following
+to your Muse settings file.
+
+@lisp
+(setq muse-file-extension nil
+      muse-mode-auto-p t)
+@end lisp
+
+Note that if you chose to have @code{muse-file-extension} set to
+@code{nil}, you may have trouble if your @file{.emacs} file or other
+init scripts attempt to visit a Muse file.  (A very common example of
+this is if you use Planner with Muse and run @code{(plan)} from your
+@file{.emacs}.)  If you wish to visit Muse files from your
+@file{.emacs}, be sure to also add the following additional code before
+any such visits happen:
+
+@lisp
+(add-hook 'find-file-hooks 'muse-mode-maybe)
+@end lisp
+
+
+@node Projects, Keystroke Summary, Getting Started, Top
+@comment  node-name,  next,  previous,  up
+@chapter Creating and Managing Muse Projects
+@cindex projects
+
+Often you will want to publish all the files within a directory to a
+particular set of output styles automatically.  To support, Muse
+allows for the creation of "projects".
+
+@menu
+* Single Project::              A single-project example.
+* Multiple Projects::           A multiple-project example.
+* Projects and Subdirectories::  Publishing subdirectories in projects.
+* Options for Projects::        Listing of available options for projects.
+@end menu
+
+@node Single Project, Multiple Projects, Projects, Projects
+@comment  node-name,  next,  previous,  up
+@section A Single-Project Example
+@cindex projects, single
+
+Here is a sample project, which may be defined in your @file{.emacs}
+file.
+
+@lisp
+(setq muse-project-alist
+      '(("Website" ("~/Pages" :default "index")
+         (:base "html" :path "~/public_html")
+         (:base "pdf" :path "~/public_html/pdf"))))
+@end lisp
+
+The above defines a project named "website", whose files are located
+in the directory @file{~/Pages}.  The default page to visit is
+@file{index}.  When this project is published, each page will be
+output as HTML to the directory @file{~/public_html}, and as PDF to
+the directory @file{~/public_html/pdf}.  Within any project page, you
+may create a link to other pages using the syntax @samp{[[pagename]]}.
+
+If you would like to include only some files from a directory in a Muse
+project, you may use a regexp in place of @file{~/Pages} in the example.
+
+@node Multiple Projects, Projects and Subdirectories, Single Project, Projects
+@comment  node-name,  next,  previous,  up
+@section A Multiple-Project Example
+@cindex projects, multiple
+
+It is possible to specify multiple projects.  Here is an example of
+three projects: a generic website, a projects area, and a day-planner
+(the day-planner part requires Planner Mode---see
+@uref{http://wjsullivan.net/PlannerMode.html} to get it).
+
+@lisp
+(setq muse-project-alist
+      '(("Website" ("~/Pages" :default "index")
+         (:base "html" :path "~/public_html"))
+        (("Projects" ("~/Projects" :default "index")
+         (:base "xhtml"
+                :path "~/public_html/projects"
+                :exclude "/TopSecret")
+         (:base "pdf"
+                :path "~/public_html/projects/pdf"
+                :exclude "/TopSecret")))
+        ("Plans" ("~/Plans"
+                  :default "TaskPool"
+                  :major-mode planner-mode
+                  :visit-link planner-visit-link)
+         (:base "planner-xhtml"
+                :path "~/public_html/plans"))))
+@end lisp
+
+The @option{:major-mode} attribute specifies which major to use when
+visiting files in this directory.
+
+The @option{:visit-link} attribute specifies the function to call when
+visiting links.
+
+The @option{:exclude} attribute has a regexp that matches files to never
+publish.
+
+@node Projects and Subdirectories, Options for Projects, Multiple Projects, Projects
+@comment  node-name,  next,  previous,  up
+@section Publishing Subdirectories in Projects
+@cindex projects, subdirectories
+
+If you want to publish a directory and all of its subdirectories, Muse
+provides two convenience functions that together generate the proper
+rules for you.  Note that we use the backtick to begin this
+muse-project-alist definition, rather than a single quote.
+
+@lisp
+(setq muse-project-alist
+      `(("Website" ("~/Pages" :default "index")
+         (:base "html" :path "~/public_html"))
+        ("Blog" (,@@(muse-project-alist-dirs "~/Blog")
+                 :default "index")
+         ;; Publish this directory and its subdirectories.  Arguments
+         ;; are as follows.  The above `muse-project-alist-dirs' part
+         ;; is also needed.
+         ;;   1. Source directory
+         ;;   2. Output directory
+         ;;   3. Publishing style
+         ;;   remainder: Other things to put in every generated style
+         ,@@(muse-project-alist-styles "~/Blog"
+                                      "~/public_html/blog"
+                                      "blosxom"))))
+@end lisp
+
+The @code{muse-project-alist-dirs} function takes a directory and
+returns it and all of its subdirectories in a list.
+
+The @code{muse-project-alist-styles} function is explained by the
+comments above.
+
+The ``blosxom'' text is the name of another publishing style, much like
+``html''.  @xref{Blosxom}, for further information about it.  You can
+use any publishing style you like for the third argument to
+@code{muse-project-alist-styles}.
+
+@node Options for Projects, , Projects and Subdirectories, Projects
+@comment  node-name,  next,  previous,  up
+@section Listing of Available Options for Projects
+@cindex projects, options
+@cindex muse-project-alist, reference
+
+This is a listing of all of the various options (or, more accurately:
+attributes) that may be specified in @code{muse-project-alist}.
+
+Each muse-project-alist entry looks like this:
+
+@example
+  (PROJECT-NAME (SOURCES)
+    OUTPUTS)
+@end example
+
+We refer to these names below.
+
+``Attributes'', which compose SOURCES and OUTPUTS, are a pair of values.
+The first value is a keyword, like @option{:default}.  The second part
+is the value associated with that keyword, such as the text ``index''.
+If you are familiar with Emacs Lisp property lists, the concept is
+similar to that, except that in the SOURCES section, single directories
+can be interspersed with two-value attributes.
+
+@subheading Project Name
+
+This is a string that indicates the name of the project.  It is
+primarily used for publishing interwiki links with the
+@file{muse-wiki.el} module.
+
+@subheading Sources
+
+This part of a muse-project-alist entry consists of two-value
+attributes, and also directory names.  If you are publishing a book, the
+order of directories and attributes is significant.
+
+The minimal content for the sources section is a list of directories.
+
+@table @option
+
+@item :book-chapter
+Indicates a new chapter of a book.  The text of the title of the chapter
+comes immediately after this keyword.
+
+@item :book-end
+Indicates the end of a book.  Directories listed after this one are
+ignored when publishing a book.  The value ``t'' (without quotes) should
+come immediately after this keyword.
+
+@item :book-funcall
+A function to call while publishing a book.  This is useful for doing
+something just after a particular chapter.
+
+@item :book-part
+Indicates the beginning of a new part of the book.  The text of the
+title should come immediately after this keyword.
+
+@item :book-style
+Indicate a particular publishing style to use for this part of the book.
+If this is specified, it should come just after a @option{:part}
+attribute.
+
+@item :default
+The default page to visit when browsing a project.  Also, if you are
+using the @file{muse-wiki.el} module, publishing a link to just a
+project's name will cause it to link to this default file.
+
+@item :force-publish
+This specifies a list of pages which should be published every time a
+project is published (by using @kbd{C-c C-p}, for example), regardless
+of whether their contents have changed.  This is useful for updating
+Index pages, pages that use the @verb{|<include>|} tag, and other pages
+that have dynamically-generated content.
+
+@item :major-mode
+This specifies the major mode to use when visiting files in this
+project.  The default is @code{muse-mode}.
+
+@item :nochapters
+This indicates that while publishing a book, do not automatically create
+chapters.  Values which may follow this are nil (the default, which
+means that we automatically create chapters), or non-nil, which means
+that we manually specify chapters with the @option{:book-chapter}
+attribute,
+
+@item :publish-project
+Indicates which function we should call when publishing a project.
+
+@item :set
+This specifies a list of variables and values to set when publishing a
+project.  The list should be a property list, which is in the form:
+
+@example
+(VAR1 VALUE1 VAR2 VALUE2 ...)
+@end example
+
+@item :visit-link
+Specifies the function to call when visiting a link.  The default is
+@code{muse-visit-link-default}.  The arguments for that function should
+be (1) the link and (2) whether to visit the link in a new window.
+
+@end table
+
+@subheading Outputs
+
+This part of a muse-project-alist entry is composed of lists of
+attributes.  Each list is called an ``output style''.
+
+The minimal content for an output style is a @option{:base} attribute
+and a @option{:path} attribute.
+
+@table @option
+
+@item :base
+Publishing style to use, such as ``html'', ``docbook'', or ``pdf''.
+
+@item :base-url
+An external URL which can be used to access published files.  This is
+mainly used by the @file{muse-wiki} module when publishing links between
+two separate projects, if the projects are served on different domains.
+
+It is also used by the @file{muse-journal} module to create the RSS or
+RDF output.
+
+@item :exclude
+Exclude items matching a regexp from being published.  The regexp should
+usually begin with "/".
+
+@item :include
+Only include items matching a regexp when publishing.  The regexp should
+usually begin with "/".
+
+@item :path
+The directory in which to store published files.
+
+@item :timestamps
+A file containing the timestamps (that is, time of creation) for files
+in this project.  It might eventually used by the @file{muse-blosxom}
+module, but this option is not currently in use by any Muse code.
+
+@end table
+
+
+@node Keystroke Summary, Markup Rules, Projects, Top
+@comment  node-name,  next,  previous,  up
+@chapter Keys Used in Muse Mode
+@cindex keystrokes
+
+This is a summary of keystrokes available in every Muse buffer.
+
+@table @kbd
+
+@item C-c C-a (`muse-index')
+Display an index of all known Muse pages.
+
+@item C-c C-b (`muse-find-backlinks')
+Find all pages that link to this page.
+
+@item C-c C-e (`muse-edit-link-at-point')
+Edit link at point.
+
+@item C-c C-f (`muse-project-find-file')
+Open another Muse page.  Prompt for the name.
+
+@item C-c C-i l, C-c TAB l (`muse-insert-relative-link-to-file')
+Insert a link to a file interactively.
+
+@item C-c C-i t, C-c TAB t (`muse-insert-tag')
+Insert a tag interactively.
+
+@item C-c C-i u, C-c TAB u (`muse-insert-url')
+Insert a URL interactively.
+
+@item C-c C-l (`font-lock-mode')
+Toggle font lock / highlighting for the current buffer.
+
+@item C-c C-p (`muse-project-publish')
+Publish any Muse pages that have changed.
+
+@item C-c C-s (`muse-search')
+Find text in all files of the current project.
+
+@item C-c C-t (`muse-project-publish-this-file')
+Publish the currently-visited file.  Prompt for the style if the current
+file can be published using more than one style.
+
+@item C-c C-S-t, or C-c C-M-t (`muse-publish-this-file')
+Publish the currently-visited file.  Prompt for both the style and
+output directory.
+
+@item C-c C-v (`muse-browse-result')
+Show the published result of this page.
+
+@item C-c = (`muse-what-changed')
+Diff this page against the last backup version.
+
+@item TAB
+Move to the next Wiki reference.
+
+@item S-TAB
+Move to the previous Wiki reference.
+
+@item M-TAB
+Complete the name of a page from the current project at point.
+
+@item M-RET
+Insert a new list item at point, indenting properly.
+
+@item C-<
+Decrease the indentation of the list item at point.
+
+@item C->
+Increase the indentation of the list item at point.
+
+@item M-x muse-colors-toggle-inline-images RET
+Toggle display of inlined images on/off.
+
+@item M-x muse-update-values RET
+Update various values that are automatically generated.
+
+Call this after changing @code{muse-project-alist}.
+@end table
+
+
+@node Markup Rules, Publishing Styles, Keystroke Summary, Top
+@comment  node-name,  next,  previous,  up
+@chapter Rules for Using Markup
+@cindex markup
+
+A Muse document uses special, contextual markup rules to determine how
+to format the output result.  For example, if a paragraph is indented,
+Muse assumes it should be quoted.
+
+There are not too many markup rules, and all of them strive to be as
+simple as possible so that you can focus on document creation, rather
+than formatting.
+
+@menu
+* Paragraphs::                  Paragraphs: centering and quoting.
+* Headings::                    Levels of headings.
+* Directives::                  Directives at the beginning of a
+                                  document.
+* Emphasizing Text::            Bold, italicized, and underlined text.
+* Footnotes::                   Making notes to be shown at the end.
+* Verse::                       Indicating poetic stanzas.
+* Lists::                       Lists of items.
+* Tables::                      Generation of data tables.
+* Explicit Links::              Hyperlinks and email addresses with
+                                  descriptions.
+* Implicit Links::              Bare URLs, WikiNames, and InterWiki
+                                  links.
+* Images::                      Publishing and displaying images.
+* Horizontal Rules and Anchors::  Inserting a horizontal line or anchor.
+* Embedded Lisp::               Evaluating Emacs Lisp code in documents
+                                  for extensibility.
+* Citations::                   Support for citing other resources.
+* Comments::                    Lines to omit from published output.
+* Tag Summary::                 Tags that Muse recognizes.
+@end menu
+
+@node Paragraphs, Headings, Markup Rules, Markup Rules
+@comment  node-name,  next,  previous,  up
+@section Paragraphs: centering and quoting
+@cindex paragraphs
+
+Paragraphs in Muse must be separated by a blank line.
+
+@cindex paragraphs, centered
+@subheading Centered paragraphs and quotations
+
+A line that begins with six or more columns of whitespace (either tabs
+or spaces) indicates a centered paragraph.  Alternatively, you can use
+the @verb{|<center>|} tag to surround regions that are to be published
+as centered paragraphs.
+
+@cindex paragraphs, quoted
+@cindex quotations
+But if a line begins with whitespace, though less than six columns, it
+indicates a quoted paragraph.  Alternatively, you can use the
+@verb{|<quote>|} tag to surround regions that are to be published as
+quoted paragraphs.
+
+@cindex examples
+@cindex monospace, rendering blocks
+@cindex HTML, rendering blocks in monospace
+@subheading Literal paragraphs
+
+The @verb{|<example>|} tag is used for examples, where whitespace should
+be preserved, the text rendered in monospace, and any characters special
+to the output style escaped.
+
+@cindex literal text
+@cindex HTML, inserting a raw block
+There is also the @verb{|<literal>|} tag, which causes a marked block to
+be entirely left alone.  This can be used for inserting a hand-coded
+HTML blocks into HTML output, for example.
+
+If you want some text to only be inserted when publishing to a
+particular publishing style, use the @option{style} attribute for the
+@verb{|<literal>|} tag.  An example follows.
+
+@example
+<literal style="latex">
+A LaTeX-based style was used in the publishing of this document.
+</literal>
+@end example
+
+This will leave the region alone if the current publishing style is
+``latex'' or based on ``latex'', such as ``pdf'', and delete the region
+otherwise.  It is also possible to leave the text alone only for one
+particular style, rather than its derivations, by adding
+@code{exact="t"} to the tag.
+
+@cindex line breaks
+@subheading Line breaks
+
+If you need a line break, then use the @samp{<br>} tag.  Most of the
+time this tag is unnecessary, because Muse will automatically detect
+paragraphs by means of blank lines.  If you want to preserve newlines in
+several lines of text, then use verse markup instead (@pxref{Verse}).
+
+@node Headings, Directives, Paragraphs, Markup Rules
+@comment  node-name,  next,  previous,  up
+@section Levels of headings
+@cindex headings
+
+A heading becomes a chapter or section in printed output -- depending on
+the style.  To indicate a heading, start a new paragraph with one or
+more asterices, followed by a space and the heading title.  Then begin
+another paragraph to enter the text for that section.
+
+All levels of headings will be published.  Most publishing styles only
+distinguish the between the first 4 levels, however.
+
+@example
+* First level
+
+** Second level
+
+*** Third level
+
+**** Fourth level
+@end example
+
+@node Directives, Emphasizing Text, Headings, Markup Rules
+@comment  node-name,  next,  previous,  up
+@section Directives at the beginning of a document
+@cindex directives
+
+Directives are lines beginning with the @samp{#} character that come
+before any paragraphs or sections in the document.  Directives are of
+the form ``#directive content of directive''.  You can use any
+combination of uppercase and lowercase letters for directives, even if
+the directive is not in the list below.
+
+The @code{muse-publishing-directive} function may be used in header and
+footer text to access directives.  For example, to access the
+@code{#title} directive, use @code{(muse-publishing-directive "title")}.
+
+The following is a list of directives that Muse uses.
+
+@table @code
+@cindex #author
+@item #author
+The author of this document.
+
+If this is not specified, Muse will attempt to figure it out from the
+@code{user-full-name} variable.
+
+@cindex #date
+@item #date
+The date that the document was last modified.
+
+This is used by publishing styles that are able to embed the date
+information.
+
+@cindex #desc
+@item #desc
+A short description of this document.
+
+This is used by the @code{journal} publishing style to embed information
+inside of an RSS/RDF feed.
+
+@cindex #title
+@item #title
+The title of this document.
+
+If this is not specified, the name of the file is used.
+
+@end table
+
+@node Emphasizing Text, Footnotes, Directives, Markup Rules
+@comment  node-name,  next,  previous,  up
+@section Bold, italicized, and underlined text
+@cindex emphasizing text
+@cindex underlining text
+@cindex italicizing text
+@cindex verbatim text
+@cindex monospace, rendering words
+
+To emphasize text, surround it with certain specially recognized
+characters.
+
+@example
+*emphasis*
+**strong emphasis**
+***very strong emphasis***
+_underlined_
+=verbatim and monospace=
+@end example
+
+@cindex WYSIWYG
+While editing a Muse document in Muse mode, these forms of emphasis will
+be highlighted in a WYSIWYG manner.  Each of these forms may span
+multiple lines.
+
+Verbatim text will be colored as gray by default.  To change this,
+customize @code{muse-verbatim-face}.
+
+You can also use the @verb{|<code>|} tag to indicate verbatim and
+monospace text.  This is handy for regions that have an ``='' in them.
+
+@node Footnotes, Verse, Emphasizing Text, Markup Rules
+@comment  node-name,  next,  previous,  up
+@section Making notes to be shown at the end
+@cindex footnotes
+
+A footnote reference is simply a number in square brackets.  To define
+the footnote, place this definition at the bottom of your file.
+@samp{footnote-mode} can be used to greatly facilitate the creation of
+these kinds of footnotes.
+
+Footnotes are defined by the same number in brackets occurring at the
+beginning of a line.  Use footnote-mode's @kbd{C-c ! a} command, to very
+easily insert footnotes while typing.  Use @kbd{C-x C-x} to return to
+the point of insertion.
+
+@node Verse, Lists, Footnotes, Markup Rules
+@comment  node-name,  next,  previous,  up
+@section Indicating poetic stanzas
+@cindex verses
+@cindex poetry
+
+Poetry requires that whitespace be preserved, but without resorting to
+monospace.  To indicate this, use the following markup, reminiscent of
+email quotations.
+
+@example
+> A line of Emacs verse;
+>   forgive its being so terse.
+@end example
+
+You can also use the @verb{|<verse>|} tag, if you prefer.
+
+@example
+<verse>
+A line of Emacs verse;
+  forgive its being so terse.
+</verse>
+@end example
+
+@cindex verses, multiple stanzas
+Multiple stanzas may be included in one set of @verb{|<verse>|} tags, as
+follows.
+
+@example
+<verse>
+A line of Emacs verse;
+  forgive its being so terse.
+
+In terms of terse verse,
+  you could do worse.
+</verse>
+@end example
+
+@node Lists, Tables, Verse, Markup Rules
+@comment  node-name,  next,  previous,  up
+@section Lists of items
+@cindex lists
+
+Lists are given using special characters at the beginning of a line.
+Whitespace must occur before bullets or numbered items, to distinguish
+from the possibility of those characters occurring in a real sentence.
+
+@cindex lists, bullets
+These are rendered as a bullet list.
+
+@example
+Normal text.
+
+ - bullet item one
+ - bullet item two
+@end example
+
+@cindex lists, enumerated
+An enumerated list follows.
+
+@example
+Normal text.
+
+ 1. Enum item one
+ 2. Enum item two
+@end example
+
+@cindex lists, definitions
+Here is a definition list.
+
+@example
+Term1 ::
+  This is a first definition
+  And it has two lines;
+  no, make that three.
+
+Term2 :: This is a second definition
+@end example
+
+@subheading Nested lists
+
+@cindex lists, nested
+It is possible to nest lists of the same or different kinds.  The
+``level'' of the list is determined by the amount of initial whitespace.
+
+@example
+Normal text.
+
+ - Level 1, bullet item one
+   1. Level 2, enum item one
+   2. Level 2, enum item two
+ - Level 1, bullet item two
+   1. Level 2, enum item three
+   2. Level 2, enum item four
+      term :: definition
+@end example
+
+@subheading Breaking list items
+
+@cindex lists, breaking lines
+If you want to break up a line within any list type, just put one blank
+line between the end of the previous line and the beginning of the next
+line, using the same amount of initial indentation.
+
+@example
+ - bullet item 1, line 1
+
+   bullet item 1, line 2
+
+   1. Enum line 1
+
+      Enum line 2
+
+ - bullet item 2, line 1
+
+   bullet item 2, line 2
+@end example
+
+@node Tables, Explicit Links, Lists, Markup Rules
+@comment  node-name,  next,  previous,  up
+@section Generation of data tables
+@cindex tables
+
+@cindex tables, simple
+Only very simple tables are supported.  The syntax is as follows.
+
+@example
+Double bars  || Separate header fields
+
+Single bars   | Separate body fields
+Here are more | body fields
+
+Triple bars ||| Separate footer fields
+@end example
+
+Some publishing styles require header fields to come first, then footer
+fields, and then the body fields.  You can use any order for these
+sections that you like, and Muse will re-order them for you at
+publish-time.
+
+If you wish to disable table generation for one Muse file, add the
+directive @samp{#disable-tables t} to the top of the file.
+
+@subheading Other table formats
+
+@cindex tables, orgtbl-mode style
+It is possible to publish very basic Orgtbl-mode style tables.
+
+@example
+| org  | style | table |
+|------+-------+-------|
+| one  |       | one   |
+| two  | two   |       |
+|      | three | three |
+|------+-------+-------|
+| more | stuff |       |
+@end example
+
+If you are used to the way that Org Mode publishes these tables, then
+customize `muse-html-table-attributes' to the following, in order to get
+a similar kind of output.
+
+@example
+border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"
+@end example
+
+@cindex tables, table.el style
+@file{table.el} style tables are also supported, as long as
+@file{table.el} itself supports outputting tables for a particular
+publishing style.  At the time of this writing, the ``html'', ``latex'',
+and ``docbook'' styles are supported by @file{table.el}.  Styles derived
+from these styles will also work.
+
+@example
++---+-----+---+
+|   | one | 1 |
++---+-----+---+
+| b | two |   |
++---+-----+---+
+| c |     | 3 |
++---+-----+---+
+@end example
+
+@node Explicit Links, Implicit Links, Tables, Markup Rules
+@comment  node-name,  next,  previous,  up
+@section Hyperlinks and email addresses with descriptions
+@cindex links, explicit
+
+A hyperlink can reference a URL, or another page within a Muse
+project.  In addition, descriptive text can be specified, which should
+be displayed rather than the link text in output styles that supports
+link descriptions.  The syntax is as follows.
+
+@example
+[[link target][link description]]
+[[link target without description]]
+@end example
+
+Thus, the current maintainer's homepage for Muse can be found
+@samp{[[http://mwolson.org/projects/EmacsMuse.html][here]]},
+or at @samp{[[http://mwolson.org/projects/EmacsMuse.html]]}.
+
+@node Implicit Links, Images, Explicit Links, Markup Rules
+@comment  node-name,  next,  previous,  up
+@section Bare URLs, WikiNames, and InterWiki links
+@cindex links, implicit
+@cindex links, raw
+
+@cindex URLs
+@cindex Email addresses
+
+A URL or email address encountered in the input text is published as a
+hyperlink.  These kind of links are called @dfn{implicit links} because
+they are not separated from the rest of the Muse document in any way.
+
+Some characters in URLs will prevent Muse from recognizing them as
+implicit links. If you want to link to a URL containing spaces or any of
+the characters ``][,"'`()<>^'', you will have to make the link
+explicit. The punctuation characters ``.,;:'' are also not recognized as
+part of a URL when they appear at its end. For information on how to
+make an explicit link, see @ref{Explicit Links,,Hyperlinks and email
+addresses with descriptions}.
+
+@cindex WikiNames
+If the @command{muse-wiki} module is loaded, another form of implicit
+link will be made available.  WikiNames, which are typed in CamelCase,
+are highlighted and published as links, provided that the file they
+refer to exists.
+
+Customization of WikiName recognition may be accomplished by editing the
+@code{muse-wiki-wikiword-regexp} option and subsequently running
+@code{(muse-configure-highlighting 'muse-colors-markupmuse-colors-markup)}.
+If you use the Customize interface, the latter will be done
+automatically.
+
+@cindex InterWiki links
+@cindex inter-project links
+The @command{muse-wiki} module also allows for InterWiki links.  These
+are similar to WikiWords, but they specify both the project and page of
+a file.  The names of your project entries in @code{muse-project-alist}
+will be used as InterWiki names by default.  Several examples follow.
+
+@example
+Blog::DocumentingMuse
+Projects#EmacsMuse
+Website
+@end example
+
+In the first case, the interwiki delimiter is @samp{::}, @samp{Blog} is
+the project name, and @samp{DocumentingMuse} is the page name.  In the
+second example, @samp{#} is the interwiki delimiter.  If the name of a
+project occurs by itself in text, like the third case, it will be
+colorized and published as a link to the default page of the given
+project.
+
+Customization of interwiki links may be accomplished by editing the
+@code{muse-wiki-interwiki-alist} option.
+
+It is also possible to link to an anchor in an interwiki document.  This
+is called a ``three-part link''.  Examples of this follow.
+
+@example
+Blog::DocumentingMuse#anchor1
+Projects#EmacsMuse#anchor2
+@end example
+
+@node Images, Horizontal Rules and Anchors, Implicit Links, Markup Rules
+@comment  node-name,  next,  previous,  up
+@section Publishing and displaying images
+@cindex images
+@cindex links, with images
+@subheading Image links
+
+Links to images may be used in either the target or the description, or
+both.  Thus, the following code will publish as a clickable image that
+points to @url{http://mwolson.org/}.
+
+@example
+[[http://mwolson.org/][/static/logos/site-logo.png]]
+@end example
+
+Normally, images in the link part will be inlined.
+
+If you want these images to be published as links instead, place the
+text ``URL:'' immediately in front of the link text.  An example
+follows.
+
+@example
+[[URL:http://mwolson.org/static/logos/site-logo.png]]
+@end example
+
+@cindex images, displaying
+@cindex images, local
+@subheading Displaying images in Muse mode
+If a link to a locally-available image is encountered in the link
+description, Muse mode will attempt to display it if your version of
+Emacs permits this.
+
+This behavior may be toggled with @kbd{C-c C-i}, or disabled permanently
+by setting the @code{muse-colors-inline-images} option to @code{nil}.
+
+The method for finding images may be altered by customizing the
+@code{muse-colors-inline-image-method} option.  One useful value for
+this option is @code{muse-colors-use-publishing-directory}, which tells
+Muse mode to look in the directory where the current file will be
+published.  The default is to look in the current directory.  Relative
+paths like @samp{../pics/} should work for either setting.
+
+Eventually, it is hoped that Muse will be able to copy images from the a
+``source'' directory to a publishing directory by customizing
+@code{muse-project-alist}, but this has not been implemented yet.
+
+@cindex images, without descriptions
+@cindex images, inlined
+@subheading Publishing simple images
+The following example will display correctly and publish correctly if a
+@acronym{PNG} file called @file{TestLogo.png} exists in the
+@file{../pics/} directory.  If text is on the same line as the picture,
+it will remain so in the output.
+
+@example
+[[../myimage.png]]
+@end example
+
+@cindex images, captions
+@subheading Publishing images with captions
+If you want to add a caption to an image, use the following syntax.
+This will center the image (if the output format supports it) and add a
+centered caption below the picture.  Formats that do not support
+centering the image will instead leave it against the left margin.
+
+@example
+[[../pics/mycat.png][My cat Dexter]]
+@end example
+
+Images with captions may only occur in their own paragraphs, with no
+text on the same line.  Otherwise, the published output will not be
+syntactically correct.
+
+@node Horizontal Rules and Anchors, Embedded Lisp, Images, Markup Rules
+@comment  node-name,  next,  previous,  up
+@section Inserting a horizontal line or anchor
+
+@cindex horizontal rules
+@cindex dashes
+@subheading Horizontal Rules
+
+Four or more dashes indicate a horizontal rule.  Be sure to put blank
+lines around it, or it will be considered part of the proceeding or
+following paragraph!
+
+@cindex anchors
+@cindex links, with target on same page
+@subheading Anchors
+
+If you begin a line with "#anchor" -- where "anchor" can be any word
+that doesn't contain whitespace -- it defines an anchor at that point
+into the document.  This point can be referenced using "page#anchor" as
+the target in a Muse link.
+
+@node Embedded Lisp, Citations, Horizontal Rules and Anchors, Markup Rules
+@comment  node-name,  next,  previous,  up
+@section Evaluating Emacs Lisp code in documents for extensibility
+@cindex lisp, embedded
+
+Arbitrary kinds of markup can be achieved using the @verb{|<lisp>|} tag.
+With the @verb{|<lisp>|} tag, you may generate whatever output text you
+wish.  The inserted output will get marked up if the @verb{|<lisp>|}
+tag appears within the main text of the document.
+
+@example
+<lisp>(concat "This form gets " "inserted")</lisp>
+@end example
+
+@cindex lisp, and insert command
+Note that you should not use the @code{insert} command within a set of
+@verb{|<lisp>|} tags, since the return value from the @verb{|<lisp>|}
+tags will be automatically inserted into the document.
+
+It is also possible to treat the output as if it were surrounded by the
+@verb{|<example>|}, @verb{|<src>|}, or @verb{|<verse>|} tags, by
+specifying ``example'', ``src'', or ``verse'' as the @option{markup}
+attribute of the @verb{|<lisp>|} tag.
+
+@example
+<lisp markup="example">
+(concat "Insert" " me")
+</lisp>
+@end example
+
+Other languages also have tags that cause source code to be evaluated.
+@xref{Tag Summary}, for details.
+
+@node Citations, Comments, Embedded Lisp, Markup Rules
+@comment  node-name,  next,  previous,  up
+@section Support for citing other resources
+@cindex citations
+@cindex tags, <cite>
+
+@subheading Example
+
+Here is an example of what citations look like in a Muse document.
+
+@example
+#bibsource REFDB
+
+* Title
+** Subtitle
+
+Some text before <cite>Miller1999</cite> and after the citation.
+
+This is an author-only citation <cite type="author">Miller1999</cite>.
+
+And this is a year-only citation <cite type="year">Miller1999</cite>.
+
+Finally, this is a multi-head citation
+<cite>Miller1999,Andrews2005</cite>.
+@end example
+
+@subheading Overview
+
+The @code{#bibsource} directive defines the source of the
+bibliographies.  The following sources are possible.
+
+@itemize @bullet
+@item DocBook + RefDB:
+the string "REFDB"
+
+@item LaTeX + bibtex:
+the name of an appropriate bibtex file
+
+@item LaTeX + RefDB:
+if the input file is called "foo.muse", then set this to "foo.bib"
+@end itemize
+
+Citations are encoded as @verb{|<cite>|} elements which enclose the
+citation keys as they are defined in the bibliography file or database.
+In multi-head citations, the citation keys have to be separated by
+colons or semicolons.  The @code{latex} and @code{docbook} styles
+translate these to the proper separator automatically.
+
+The @verb{|<cite>|} elements take an optional ``type'' attribute that
+defines how the citation is rendered.  If the attribute is missing,
+you'll get a regular citation according to the bibliography style,
+e.g.'' (Miller et al., 1999)''.  If the attribute is set to "author",
+only the name of the author(s) will be rendered.  Accordingly, "year"
+will cause the year to be printed.  This is useful to create citations
+like this:
+
+@example
+Miller et al. had already shown in a previous publication (1999) that
+this is not going to work.
+@end example
+
+Remember that refdb-mode (the Emacs interface to RefDB) can retrieve
+references by simply marking the citation key and running the
+@code{refdb-getref-by-field-on-region} command.  Later versions of
+@code{refdb-mode} will also allow to insert references as Muse citations
+(which is already implemented for DocBook, TEI, and LaTeX documents).
+
+You may have noticed that there is no element to indicate the position
+of the bibliography.  The latter is always created at a valid position
+close to the end of the document.  The functions
+@code{muse-docbook-bibliography} and @code{muse-latex-bibliography} are
+called in the header or footer to generate this content, so it is
+possible to change the exact position.
+
+@node Comments, Tag Summary, Citations, Markup Rules
+@comment  node-name,  next,  previous,  up
+@section Lines to omit from published output
+@cindex comments
+@cindex publishing, omitting lines
+
+Use the following syntax to indicate a comment.  Comments will not be
+published.
+
+@example
+; Comment text goes here.
+@end example
+
+That is, only a semi-colon at the beginning of a line, followed by a
+literal space, will cause that line to be treated as a comment.
+
+You can alternatively surround the region with the @verb{|<comment>|}
+tag.
+
+If you wish the comment to be published, but just commented out using
+the comment syntax of the output format, then set
+@option{muse-publish-comments-p} to non-nil.
+
+@node Tag Summary, , Comments, Markup Rules
+@comment  node-name,  next,  previous,  up
+@section Tags that Muse recognizes
+@cindex tags
+@cindex inserting files at publish time
+@cindex publishing, including markup in headers and footers
+@cindex publishing, inserting files
+
+Muse has several built-in tags that may prove useful during publishing.
+@xref{muse-publish-markup-tags}, to see how to customize the tags that
+Muse uses, as well as make your own tags.
+
+Only a small subset of these tags are available in header and footer
+text.  The @code{muse-publish-markup-header-footer-tags} option lists
+the tags that are allowed in headers and footers.
+
+@subheading Syntax
+
+If a tag takes arguments, it will look like this, where ``tagname'' is
+the name of the tag.
+
+@example
+<tagname arg1="string1" arg2="string2">
+@end example
+
+If you want the tag to look like it came straight from an XHTML
+document, you can alternatively do the following.
+
+@example
+<tagname arg1="string1" arg2="string2" />
+@end example
+
+If a tag surrounds some text, it will look like this.
+
+@example
+<tagname>Some text</tagname>
+@end example
+
+If a tag surrounds a large region, it will look like this.
+
+@example
+<tagname>
+Some text.
+Some more text.
+</tagname>
+@end example
+
+@subheading Tag listing
+
+This is the complete list of tags that Muse accepts, including those
+that were mentioned in previous sections.
+
+@table @samp
+
+@item <br>
+Insert a line break.
+
+Muse will automatically detect paragraphs when publishing by means of
+blank lines, so this tag is usually unnecessary.
+
+@item <cite>
+Insert a citation to another source.
+
+This takes the argument @option{type}, which indicates the type of
+citation.  The valid types are "author" and "year".  If this argument is
+omitted, include both author and year in the citation.
+
+The bibliography to use for the citation may be specified by the
+@option{#bibsource} directive.
+
+@xref{Citations}, for additional information.
+
+@item <class>
+If publishing to HTML, surround the given text with a @verb{|<span>|}
+tag.  It takes one argument called ``name'' that specifies the ``class''
+attribute of the @verb{|<span>|} tag.
+
+If publishing to a different format, do nothing extra to the text.
+
+@item <code>
+Treat the text surrounded by the tag as if they were enclosed in equal
+signs, that is, make it monospace.
+
+@item <command>
+Run a command on the region, replacing the region with the result of the
+command.  The command is specified with the ``interp'' argument.  If no
+value for ``interp'' is given, pass the entire region to the shell.
+
+The ``markup'' argument controls how this section is marked up.
+
+If it is omitted, publish the region with the normal Muse rules.
+
+If "nil", do not mark up the region at all, but prevent Muse from
+further interpreting it.
+
+If "example", treat the region as if it was surrounded by the
+@verb{|<example>|} tag.
+
+If "src", treat the included text as if it was surrounded by the
+@verb{|<src>|} tag.  You should also specify the ``lang'' attribute if
+doing this.
+
+If "verse", treat the region as if it was surrounded by the
+@verb{|<verse>|} tag, to preserve newlines.
+
+Otherwise, it should be the name of a function to call, with the buffer
+narrowed to the region.
+
+@item <comment>
+Treat the entire region as a comment.  If the option
+@var{muse-publish-comments-p} is nil, delete the region, otherwise
+publish it using the comment syntax of the current publishing style.
+
+@item <contents>
+Publish a Table of Contents.  This will either be inserted in-place or
+at the beginning of the document, depending on your publishing style.
+It does not have a delimiting tag.
+
+By default, only 2 levels of headings will be included in the generated
+Table of Contents.  To change this globally, customize the
+@var{muse-publish-contents-depth} option.  To change this only for the
+current tag, use the ``depth'' argument.
+
+@item <div>
+Insert a <div> tag into HTML documents, and do not insert anything
+special for other non-HTML publishing formats.
+
+If the ``style'' argument is provided, include it with the published
+@verb{|<div>|} tag.  Likewise for the ``id'' argument.
+
+@item <example>
+Publish the region in monospace, preserving the newlines in the region.
+This is useful for snippets of code.
+
+@item <include>
+Insert the given file at the current location during publishing.  The
+basic use of this tag is as follows, replacing ``included_file'' with
+the name of the file that you want to include.
+
+@example
+<include file="included_file">
+@end example
+
+The ``markup'' argument controls how this section is marked up.
+
+If it is omitted, publish the included text with the normal Muse
+rules.
+
+If "nil", do not mark up the included text at all.
+
+If "example", treat the included text as if it was surrounded by the
+@verb{|<example>|} tag.
+
+If "src", treat the included text as if it was surrounded by the
+@verb{|<src>|} tag.  You should also specify the ``lang'' attribute if
+doing this.
+
+If "verse", treat the included text as if it was surrounded by the
+@verb{|<verse>|} tag, to preserve newlines.
+
+Otherwise, it should be the name of a function to call after inserting
+the file with the buffer narrowed to the section inserted.
+
+@item <lisp>
+Evaluate the Emacs Lisp expressions between the initial and ending tags.
+The result is then inserted into the document, so you do not need to
+explicitly call @code{insert}.  All text properties are removed from the
+resulting text.
+
+This tag takes the ``markup'' argument.  See the description of
+@verb{|<command>|} for details.
+
+@item <literal>
+Make sure that the text enclosed by this tag is published without
+escaping it in any way.  This is useful for inserting markup directly
+into the published document, when Muse does not provide the desired
+functionality.
+
+@item <markup>
+Mark up the text between the initial and ending tags.  The markup
+command to use may be specified by the ``function'' argument.  The
+standard Muse markup routines are used by default if no ``function''
+argument is provided.
+
+This is useful for marking up regions in headers and footers.  One
+example that comes to mind is generating a published index of all of the
+files in the current project by doing the following.
+
+@example
+<markup><lisp>(muse-index-as-string t t)</lisp></markup>
+@end example
+
+@item <perl>
+Run the @command{perl} language interpreter on the region, replacing the
+region with the result of the command.
+
+This tag takes the ``markup'' argument.  See the description of
+@verb{|<command>|} for details.
+
+@item <python>
+Run the @command{python} language interpreter on the region, replacing
+the region with the result of the command.
+
+This tag takes the ``markup'' argument.  See the description of
+@verb{|<command>|} for details.
+
+@item <quote>
+Publish the region as a blockquote.  This will either be inserted
+in-place or at the beginning of the document, depending on your
+publishing style.  It does not have a delimiting tag.
+
+@item <ruby>
+Run the @command{ruby} language interpreter on the region, replacing the
+region with the result of the command.
+
+This tag takes the ``markup'' argument.  See the description of
+@verb{|<command>|} for details.
+
+@item <src>
+Publish the region using htmlize.
+The language to use may be specified by the ``lang'' attribute.
+
+Muse will look for a function named @var{lang}-mode, where @var{lang} is
+the value of the ``lang'' attribute.
+
+This tag requires htmlize 1.34 or later in order to work.  If this is
+not satisfied, or the current publishing style is not HTML-based, Muse
+will publish the region like an @verb{|<example>|} tag.
+
+@item <verbatim>
+This is used when you want to prevent Muse from trying to interpret some
+markup.  Surround the markup in @verb{|<verbatim>|} and
+@verb{|</verbatim>|}, and it will not be interpreted.
+
+This tag was used often in previous versions of Muse because they did
+not support whole-document escaping of specials.  Now, it will only be
+needed for other tags, and perhaps footnotes as well.
+
+@item <verse>
+Preserve the newlines in the region.  In formats like HTML, newlines are
+removed by default, hence the need for this tag.  In other publishing
+styles, this tag may cause the text to be indented slightly in a way
+that looks nice for poetry and prose.
+
+@end table
+
+@node Publishing Styles, Extending Muse, Markup Rules, Top
+@comment  node-name,  next,  previous,  up
+@chapter Publishing Various Types of Documents
+@cindex publishing styles
+
+One of the principle features of Muse is the ability to publish a simple
+input text to a variety of different output styles.  Muse also makes it
+easy to create new styles, or derive from an existing style.
+
+@menu
+* Blosxom::                     Integrating Muse and pyblosxom.cgi.
+* Book::                        Publishing entries into a compilation.
+* ConTeXt::                     Publishing ConTeXt documents.
+* DocBook::                     Publishing in DocBook XML form.
+* HTML::                        Publishing in HTML or XHTML form.
+* Ikiwiki::                     Integrating with ikiwiki.
+* Journal::                     Keeping a journal or blog.
+* LaTeX::                       Publishing LaTeX documents.
+* Poem::                        Publish a poem to LaTeX or PDF.
+* Texinfo::                     Publish entries to Texinfo format or PDF.
+* XML::                         Publish entries to XML.
+@end menu
+
+@node Blosxom, Book, Publishing Styles, Publishing Styles
+@comment  node-name,  next,  previous,  up
+@section Integrating Muse and pyblosxom.cgi
+@cindex blog, one-file-per-entry style
+
+The Blosxom publishing style publishes a tree of categorised files to a
+mirrored tree of stories to be served by blosxom.cgi or pyblosxom.cgi.
+In other words, each blog entry corresponds with one file.
+
+@menu
+* Blosxom Requirements::        Other tools needed for the Blosxom style.
+* Blosxom Entries::             Format of a Blosxom entry and automation.
+* Blosxom Options::             Blosxom styles and options provided.
+@end menu
+
+@node Blosxom Requirements, Blosxom Entries, Blosxom, Blosxom
+@comment  node-name,  next,  previous,  up
+@subsection Other tools needed for the Blosxom style
+
+You will need to have @command{pyblosxom.cgi} or @command{blosxom.cgi}
+installed on a machine that you have upload access to.
+
+The major difficulty in both of these programs is specifying the date of
+the entries.  Both programs rely on the file modification time rather
+than any data contained in the entries themselves.  A plugin is needed
+in order for these programs to be able to get the correct date.
+
+@subheading PyBlosxom
+
+There are two different ways of accomplishing this in pyblosxom.  The
+first way involves gathering the timestamps (as specified by the
+@code{#date} directive) into one file and then sending that file along
+with published entries to the webserver.
+
+The second will read each file at render time and parse the
+@code{#postdate} directive.  Muse will translate the @code{#date}
+directive into @code{#postdate} at publish time, so you don't have to do
+any extra work.
+
+@subsubheading Placing timestamps in one file
+
+The following additional components are required in order to make the
+date of blog entries display as something sensible.
+
+@enumerate
+@item
+A script to gather date directives from the entire blog tree into a
+single file.  The file must associate a blog entry with a date.
+
+@item
+A plugin for (py)blosxom that reads this file.
+@end enumerate
+
+These 2 things are provided for @command{pyblosxom.cgi} in the
+@file{contrib/pyblosxom} subdirectory.  @file{getstamps.py} provides the
+former service, while @file{hardcodedates.py} provides the latter
+service.
+
+Here is a sample listing from my @file{timestamps} file, which maps
+each file to a date.  This can really be in any format, as long as your
+date-gathering script and your plugin can both understand it.
+
+@example
+2005-04-01-14-16 personal/paper_cranes
+2005-03-21 personal/spring_break_over
+2004-10-24 personal/finished_free_culture
+@end example
+
+The script @file{contrib/pyblosxom/make-blog} demonstrates how to call
+@file{getstamps.py}.  Note that you will need to set the current
+directory to where your Muse files are, execute @file{getstamps.py}, and
+then move the generated timestamps file to your publishing directory.
+
+@subsubheading Getting timestamp from entry while rendering
+
+Alternately, the pyblosxom metadate plugin may be used.  On the plus
+side, there is no need to run a script to gather the date.  On the
+downside, each entry is read twice rather than once when the page is
+rendered.  Set the value of @code{muse-blosxom-use-metadate} to non-nil
+to enable adding a @code{#postdate} directive to all published files.
+You can do this by:
+
+@example
+M-x customize-variable RET muse-blosxom-use-metadate RET
+@end example
+
+With the metadate plugin installed in pyblosxom, the date set in this
+directive will be used instead of the file's modification time.  The
+plugin is included with Muse at @file{contrib/pyblosxom/metadate.py}.
+
+@subheading Blosxom
+
+It is also possible to use Blosxom, which is written in Perl, to serve
+blog entries that were published with Muse.  The steps are as follows.
+
+@enumerate
+@item
+Download and install blosxom from @url{http://blosxom.sourceforge.net/}.
+
+@item
+Install the metadate plugin.  It is available in
+@file{contrib/blosxom/metadate_0_0_3}.
+
+@item
+Every time you make a new blog entry, change to the blosxom data
+directory and execute the @file{contrib/blosxom/getstamps.pl} script.
+This script has only recently been made, and may still have some bugs,
+so use with caution.
+
+@end enumerate
+
+@node Blosxom Entries, Blosxom Options, Blosxom Requirements, Blosxom
+@comment  node-name,  next,  previous,  up
+@subsection Format of a Blosxom entry and automation
+
+Each Blosxom file must include `#date yyyy-mm-dd', or optionally the
+longer `#date yyyy-mm-dd-hh-mm', a title (using the @code{#title}
+directive), plus whatever normal content is desired.
+
+The date directive is not used directly by @command{pyblosxom.cgi} or
+this program.  You need to have the two additional items from the former
+section to make use of this feature.
+
+There is a function called @code{muse-blosxom-new-entry} that will
+automate the process of making a new blog entry.  To make use of it, do
+the following.
+
+@itemize @bullet
+@item
+Customize @code{muse-blosxom-base-directory} to the location that your
+blog entries are stored.
+
+@item
+Assign the @code{muse-blosxom-new-entry} function to a key sequence.  I
+use the following code to assign this function to @kbd{C-c p l'}.
+
+@example
+(global-set-key "\C-cpl" 'muse-blosxom-new-entry)
+@end example
+
+@item
+You should create your directory structure ahead of time under your base
+directory.  These directories, which correspond with category names, may
+be nested.
+
+@item
+When you enter this key sequence, you will be prompted for the category
+of your entry and its title.  Upon entering this information, a new file
+will be created that corresponds with the title, but in lowercase
+letters and having special characters converted to underscores.  The
+title and date directives will be inserted automatically.
+@end itemize
+
+@node Blosxom Options, , Blosxom Entries, Blosxom
+@comment  node-name,  next,  previous,  up
+@subsection Blosxom styles and options provided
+
+The following styles and options are available in the Blosxom publishing
+style.
+
+@subheading Styles provided
+
+@table @code
+
+@cindex publishing styles, blosxom-html
+@item blosxom-html
+Publish Blosxom entries in HTML form.
+
+@cindex publishing styles, blosxom-xhtml
+@item blosxom-xhtml
+Publish Blosxom entries in XHTML form.
+
+@end table
+
+@subheading Options provided
+
+@table @code
+
+@item muse-blosxom-extension
+Default file extension for publishing Blosxom files.
+
+@item muse-blosxom-header
+Header used for publishing Blosxom files.
+
+This may be text or a filename.
+
+@item muse-blosxom-footer
+Footer used for publishing Blosxom files.
+
+This may be text or a filename.
+
+@item muse-blosxom-base-directory
+Base directory of blog entries, used by @code{muse-blosxom-new-entry}.
+
+This is the top-level directory where your blog entries may be found
+locally.
+
+@end table
+
+@node Book, ConTeXt, Blosxom, Publishing Styles
+@comment  node-name,  next,  previous,  up
+@section Publishing entries into a compilation
+
+This publishing style is used to output ``books'' in LaTeX or PDF
+format.
+
+Each page will become a separate chapter in the book, unless the style
+keyword @option{:nochapters} is used, in which case they are all run
+together as if one giant chapter.
+
+One way of publishing a book is to make a project for it, add the
+project to @code{muse-project-alist}, and use the @code{book-pdf} style
+with a very specific @option{:include} value to specify some page whose
+contents will be checked for the values of @code{#title} and
+@code{#date}, and whose name will be used in the output file.  Then to
+publish the book, visit the aforementioned page and use @kbd{C-c C-t} or
+@kbd{C-c C-p} to trigger the publishing process.  An example
+@code{muse-project-alist} for this method follows.
+
+@example
+(setq muse-project-alist
+      '(("MyNotes" (:nochapters t  ; do automatically add chapters
+                    :book-chapter "Computer Science"
+                    "~/Notes/cs"
+                    :book-chapter "Mathematics"
+                    "~/Notes/math"
+                    :book-chapter "Emacs"
+                    "~/Notes/emacs"
+                    :book-end t ; the rest will not be placed in the book
+                    "~/Notes"   ; so we can find the notes-anthology page
+                    "~/Notes/private"
+                    :force-publish ("index")
+                    :default "index")
+         (:base "book-pdf"
+                :include "/notes-anthology[^/]*$"
+                :path "~/public_html/notes")
+         ;; other publishing styles for each directory go here,
+         ;; if desired
+         )))
+@end example
+
+In this example, there would be a file called
+@file{~/Notes/notes-anthology.muse}, which would contain just the
+following.  The resulting book would be published to
+@file{~/public_html/notes/notes-anthology.pdf}.
+
+@example
+#title My Technology Ramblings
+@end example
+
+Another way is to call the @code{muse-book-publish-project} function
+manually, with a custom project entry.  An example of this may be found
+in John Wiegley's configuration file at
+@file{examples/johnw/muse-init.el}, in the @code{muse-publish-my-books}
+function.
+
+@subheading Styles provided
+
+@table @code
+
+@cindex publishing styles, book-latex
+@item book-latex
+Publish a book in LaTeX form.  The header and footer are different than
+the normal LaTeX publishing mode.
+
+@cindex publishing styles, book-pdf
+@item book-pdf
+Publish a book in PDF form.  The header and footer are different than
+the normal PDF publishing mode.
+
+@end table
+
+@subheading Options provided
+
+@table @code
+
+@item muse-book-before-publish-hook
+A hook run in the book buffer before it is marked up.
+
+@item muse-book-after-publish-hook
+A hook run in the book buffer after it is marked up.
+
+@item muse-book-latex-header
+Header used for publishing books to LaTeX.
+
+This may be text or a filename.
+
+@item muse-book-latex-footer
+Footer used for publishing books to LaTeX.
+
+This may be text or a filename.
+
+@end table
+@node ConTeXt, DocBook, Book, Publishing Styles
+@comment  node-name,  next,  previous,  up
+@section Publishing ConTeXt documents
+
+This publishing style is capable of producing ConTeXt or PDF documents.
+
+If you wish to publish PDF documents based on ConTeXt, you will need to
+have it installed.  For Debian and Ubuntu, this can be accomplished by
+installing the ``texlive'' package.
+
+@subheading Styles provided
+
+@table @code
+
+@cindex publishing styles, context
+@item context
+Publish a ConTeXt document.
+
+@cindex publishing styles, context-pdf
+@item context-pdf
+Publish a PDF document, using an external ConTeXt document conversion
+tool.
+
+@cindex publishing styles, context-slides
+@item context-slides
+Produce slides from a ConTeXt document.
+
+Here is an example of a slide.
+
+@example
+* First Slide
+
+[[Some-sort-of-cute-image.png]]
+
+** A subheading
+
+ - A bullet point.
+ - Another bullet point.
+
+* Second Slide
+
+... and so on
+@end example
+
+@cindex publishing styles, context-slides-pdf
+@item context-slides-pdf
+Publish a PDF document of ConTeXt slides.
+
+@end table
+
+@subheading Options provided
+
+@table @code
+
+@item muse-context-extension
+Default file extension for publishing ConTeXt files.
+
+@item muse-context-pdf-extension
+Default file extension for publishing ConTeXt files to PDF.
+
+@item muse-context-pdf-program
+The program that is called to generate PDF content from ConTeXt content.
+
+@item muse-context-pdf-cruft
+Extensions of files to remove after generating PDF output successfully.
+
+@item muse-context-header
+Header used for publishing ConTeXt files.
+
+This may be text or a filename.
+
+@item muse-context-footer
+Footer used for publishing ConTeXt files.
+
+This may be text or a filename.
+
+@item muse-context-markup-regexps
+List of markup regexps for identifying regions in a Muse page.
+
+For more on the structure of this list,
+@xref{muse-publish-markup-regexps}.
+
+@item muse-context-markup-functions
+An alist of style types to custom functions for that kind of text.
+
+For more on the structure of this list,
+@xref{muse-publish-markup-functions}.
+
+@item muse-context-markup-strings
+Strings used for marking up text.
+
+These cover the most basic kinds of markup, the handling of which
+differs little between the various styles.
+
+@item muse-context-slides-header
+Header for publishing a presentation (slides) using ConTeXt.
+
+Any of the predefined modules, which are available in the
+tex/context/base directory, can be used by writing a "module" directive
+at the top of the Muse file; if no such directive is provided, module
+pre-01 is used.  Alternatively, you can use your own style ("mystyle",
+in this example) by replacing "\usemodule[]" with "\input mystyle".
+
+This may be text or a filename.
+
+@item muse-context-slides-markup-strings
+Strings used for marking up text in ConTeXt slides.
+
+@item muse-context-markup-specials-document
+A table of characters which must be represented specially.
+These are applied to the entire document, sans already-escaped
+regions.
+
+@item muse-context-markup-specials-example
+A table of characters which must be represented specially.
+These are applied to @verb{|example>|} regions.
+
+With the default interpretation of @verb{|<example>|} regions, no
+specials need to be escaped.
+
+@item muse-context-markup-specials-literal
+A table of characters which must be represented specially.
+This applies to =monospaced text= and @verb{|<code>|} regions.
+
+@item muse-context-markup-specials-url
+A table of characters which must be represented specially.
+These are applied to URLs.
+
+@item muse-context-markup-specials-image
+A table of characters which must be represented specially.
+These are applied to image filenames.
+
+@item muse-context-permit-contents-tag
+If nil, ignore @verb{|<contents>|} tags.  Otherwise, insert table of
+contents.
+
+Most of the time, it is best to have a table of contents on the
+first page, with a new page immediately following.  To make this
+work with documents published in both HTML and ConTeXt, we need to
+ignore the @verb{|<contents>|} tag.
+
+If you don't agree with this, then set this option to non-nil,
+and it will do what you expect.
+
+@end table
+
+@node DocBook, HTML, ConTeXt, Publishing Styles
+@comment  node-name,  next,  previous,  up
+@section Publishing in DocBook XML form
+
+This publishing style is used to generate DocBook XML files.
+
+@subheading Styles provided
+
+@table @code
+
+@cindex publishing styles, docbook
+@item docbook
+Publish a file in Docbook form.
+
+@end table
+
+@subheading Options provided
+
+This publishing style uses the same options for markup up special
+characters as the ``xml'' publishing style.  @xref{XML}, for details.
+
+@table @code
+
+@item muse-docbook-extension
+Default file extension for publishing DocBook XML files.
+
+@item muse-docbook-header
+Header used for publishing DocBook XML files.
+
+This may be text or a filename.
+
+@item muse-docbook-footer
+Footer used for publishing DocBook XML files.
+
+This may be text or a filename.
+
+@item muse-docbook-markup-regexps
+List of markup rules for publishing a Muse page to DocBook XML.
+
+@item muse-docbook-markup-functions
+An alist of style types to custom functions for that kind of text.
+
+@item muse-docbook-markup-strings
+Strings used for marking up text.
+
+These cover the most basic kinds of markup, the handling of which
+differs little between the various styles.
+
+@item muse-docbook-encoding-default
+The default Emacs buffer encoding to use in published files.
+This will be used if no special characters are found.
+
+@item muse-docbook-charset-default
+The default DocBook XML charset to use if no translation is
+found in @code{muse-xml-encoding-map}.
+
+@end table
+
+@node HTML, Ikiwiki, DocBook, Publishing Styles
+@comment  node-name,  next,  previous,  up
+@section Publishing in HTML or XHTML form
+
+This publishing style is capable of producing HTML or XHTML documents.
+
+@subheading Styles provided
+
+@table @code
+
+@cindex publishing styles, html
+@item html
+Supports publishing to HTML 4.0 and HTML 4.01, Strict or Transitional.
+
+@item xhtml
+Supports publishing to XHTML 1.0 and XHTML 1.1, Strict or Transitional.
+
+@end table
+
+@subheading Options provided
+
+If an HTML option does not have a corresponding XHTML option, it will
+be used for both of these publishing styles.
+
+These publishing styles use the same options for markup up special
+characters as the ``xml'' publishing style.  @xref{XML}, for details.
+
+@table @code
+
+@item muse-html-extension
+Default file extension for publishing HTML files.
+
+@item muse-xhtml-extension
+Default file extension for publishing XHTML files.
+
+@item muse-html-style-sheet
+Store your stylesheet definitions here.
+
+This is used in @code{muse-html-header}.  You can put raw CSS in here or
+a @verb{|<link>|} tag to an external stylesheet.  This text may contain
+@verb{|<lisp>|} markup tags.
+
+If you are publishing to XHTML, then customize the
+@code{muse-xhtml-style-sheet} option instead.
+
+@item muse-xhtml-style-sheet
+Store your stylesheet definitions here.
+
+This is used in @code{muse-xhtml-header}.  You can put raw CSS in here
+or a @verb{|<link>|} tag to an external stylesheet.  This text may
+contain @verb{|<lisp>|} markup tags.
+
+@item muse-html-header
+Header used for publishing HTML files.
+
+This may be text or a filename.
+
+@item muse-html-footer
+Footer used for publishing HTML files.
+
+This may be text or a filename.
+
+@item muse-xhtml-header
+Header used for publishing XHTML files.
+
+This may be text or a filename.
+
+@item muse-xhtml-footer
+Footer used for publishing XHTML files.
+
+This may be text or a filename.
+
+@item muse-html-anchor-on-word
+When true, anchors surround the closest word.
+
+This allows you to select them in a browser (i.e. for pasting), but has
+the side-effect of marking up headers in multiple colors if your header
+style is different from your link style.
+
+@item muse-html-table-attributes
+The attribute to be used with HTML @verb{|<table>|} tags.
+
+If you want to make more-complicated tables in HTML, surround the HTML
+with the @verb{|literal|} tag, so that it does not get escaped.
+
+@item muse-html-markup-regexps
+List of markup rules for publishing a Muse page to HTML.
+
+@item muse-html-markup-functions
+An alist of style types to custom functions for that kind of text.
+
+@item muse-html-markup-strings
+Strings used for marking up text as HTML.
+
+These cover the most basic kinds of markup, the handling of which
+differs little between the various styles.
+
+@item muse-xhtml-markup-strings
+Strings used for marking up text as XHTML.
+
+These cover the most basic kinds of markup, the handling of which
+differs little between the various styles.
+
+@item muse-html-markup-tags
+A list of tag specifications, for specially marking up HTML.
+@xref{muse-publish-markup-tags}, for more information.
+
+@item muse-html-meta-http-equiv
+The http-equiv attribute used for the HTML @verb{|<meta>|} tag.
+
+@item muse-html-meta-content-type
+The content type used for the HTML @verb{|<meta>|} tag.
+
+If you are striving for XHTML 1.1 compliance, you may want to change
+this to ``application/xhtml+xml''.
+
+@item muse-html-meta-content-encoding
+The charset to append to the HTML @verb{|<meta>|} tag.
+
+If set to the symbol 'detect, use @code{muse-xml-encoding-map} to try
+and determine the HTML charset from emacs's coding.  If set to a string,
+this string will be used to force a particular charset.
+
+@item muse-html-charset-default
+The default HTML meta charset to use if no translation is found in
+@code{muse-xml-encoding-map}.
+
+@item muse-html-encoding-default
+The default Emacs buffer encoding to use in published files.
+This will be used if no special characters are found.
+
+@end table
+
+@node Ikiwiki, Journal, HTML, Publishing Styles
+@comment  node-name,  next,  previous,  up
+@section Integrating with ikiwiki
+
+Note: Support for Ikiwiki is not yet complete.  Use at your own risk.
+
+Ikiwiki is a wiki compiler (@url{http://ikiwiki.info/}).  Emacs Muse can
+(not yet) be used as a source format for Ikiwiki pages with the plugin
+@file{IkiWiki::Plugin::muse}.
+
+The @file{lisp/muse-ikiwiki.el} file provides publishing functions and
+styles for Ikiwiki.  The plugin for Ikiwiki to recognize Muse files is
+provided by the @file{contrib/ikiwiki/IkiWiki/Plugin/muse.pm} file.  Two
+sample init files are available in the @file{examples/ikiwiki}
+directory.  Configure your @file{ikiwiki.setup} file so that the
+@code{muse_init} variable has the location of your Muse init file.
+
+If you are using CGI, The directory @file{contrib/ikiwiki/IkiWiki} must
+be copied to the same directory as the CGI script that Ikiwiki
+generates.  When publishing your wiki, the @var{PERL5LIB} environment
+variable must contain the path to the @file{contrib/ikiwiki/IkiWiki}
+directory.
+
+@subheading Styles provided
+
+@table @code
+
+@cindex publishing styles, ikiwiki
+@item ikiwiki
+Supports publishing XHTML output that Ikiwiki can understand.
+
+@end table
+
+@subheading Options provided
+
+@table @code
+
+@item muse-ikiwiki-header
+Header used for publishing Ikiwiki output files.
+
+This may be text or a filename.
+
+@item muse-ikiwiki-footer
+Footer used for publishing Ikiwiki output files.
+
+This may be text or a filename.
+
+@end table
+
+@subheading Other relevant options
+
+@table @code
+
+@item muse-colors-evaluate-lisp-tags
+Specify whether to evaluate the contents of @verb{|<lisp>|} tags at
+display time.  If nil, don't evaluate them.  If non-nil, evaluate
+them.
+
+The actual contents of the buffer are not changed, only the
+displayed text.
+
+@item muse-html-src-allowed-modes
+Modes that we allow the @verb{|<src>|} tag to colorize.  If @code{t},
+permit the @verb{|<src>|} tag to colorize any mode.
+
+If a list of mode names, such as @code{'("html" "latex")}, and the lang
+argument to @verb{|<src>|} is not in the list, then use fundamental mode
+instead.
+
+@item muse-publish-enable-dangerous-tags
+If non-nil, publish tags like @verb{|<lisp>|} and @verb{|<command>|}
+that can call external programs or expose sensitive information.
+Otherwise, ignore tags like this.
+
+This is useful to set to @code{nil} when the file to publish is coming
+from an untrusted source.
+
+@end table
+
+@node Journal, LaTeX, Ikiwiki, Publishing Styles
+@comment  node-name,  next,  previous,  up
+@section Keeping a journal or blog
+@cindex journal
+@cindex blog, journal style
+
+The module facilitates the keeping and publication of a journal.  When
+publishing to HTML, it assumes the form of a web log, or blog.
+
+The input format for each entry is as follows.
+
+@example
+* 20040317: Title of entry
+
+text for the entry.
+
+<qotd>
+"You know who you are. It comes down to a simple gut check: You
+either love what you do or you don't. Period." -- P. Bronson
+</qotd>
+@end example
+
+The "qotd", or Quote of the Day, is entirely optional.  When generated
+to HTML, this entry is rendered as the following.
+
+@example
+<div class="entry">
+  <div class="entry-qotd">
+    <h3>Quote of the Day:</h3>
+    <p>"You know who you are. It comes down to a simple gut
+      check: You either love what you do or you don't. Period."
+      -- P. Bronson</p>
+  </div>
+  <div class="entry-body">
+    <div class="entry-head">
+      <div class="entry-date">
+        <span class="date">March 17, 2004</span>
+      </div>
+      <div class="entry-title">
+        <h2>Title of entry</h2>
+      </div>
+    </div>
+    <div class="entry-text">
+      <p>Text for the entry.</p>
+    </div>
+  </div>
+</div>
+@end example
+
+The plurality of "div" tags makes it possible to display the entries in
+any form you wish, using a CSS style.
+
+Also, an .RDF file can be generated from your journal by publishing it
+with the "rdf" style.  It uses the first two sentences of the first
+paragraph of each entry as its "description", and auto-generates tags
+for linking to the various entries.
+
+@subheading muse-project-alist considerations
+
+If you wish to publish an RDF or RSS feed, it is important to include
+the @option{:base-url} attribute in your @code{muse-project-alist} entry
+for your Journal projects.  An example follows.
+
+@example
+(setq muse-project-alist
+      '(("Journal" ("~/Journal/"
+                    :default "journal")
+        (:base "journal-rss"
+               :base-url "http://example.org/journal/"
+               :path "~/public_html/journal"))))
+@end example
+
+@subheading Styles provided
+
+@table @code
+
+@cindex publishing styles, journal-html
+@item journal-html
+Publish journal entries as an HTML document.
+
+@cindex publishing styles, journal-xhtml
+@item journal-xhtml
+Publish journal entries as an XHTML document.
+
+@cindex publishing styles, journal-latex
+@item journal-latex
+Publish journal entries as a LaTeX document.
+
+@cindex publishing styles, journal-pdf
+@item journal-pdf
+Publish journal entries as a PDF document.
+
+@cindex publishing styles, journal-book-latex
+@item journal-book-latex
+Publish journal entries as a LaTeX book.
+
+@cindex publishing styles, journal-book-pdf
+@item journal-book-pdf
+Publish journal entries as a PDF book.
+
+@cindex publishing styles, journal-rdf
+@cindex publishing styles, RSS 1.0
+@item journal-rdf
+Publish journal entries as an RDF file (RSS 1.0).
+
+@cindex publishing styles, journal-rss
+@cindex publishing styles, RSS 2.0
+@item journal-rss
+Publish journal entries as an RSS file (RSS 2.0).
+
+@cindex publishing styles, journal-rss-entry
+@item journal-rss-entry
+Used internally by @code{journal-rss} and @code{journal-rdf} for
+publishing individual entries.
+
+@end table
+
+@subheading Options provided
+
+@table @code
+
+@item muse-journal-heading-regexp
+A regexp that matches a journal heading.
+
+Paren group 1 is the ISO date, group 2 is the optional category, and
+group 3 is the optional heading for the entry.
+
+@item muse-journal-date-format
+Date format to use for journal entries.
+
+@item muse-journal-html-heading-regexp
+A regexp that matches a journal heading from an HTML document.
+
+Paren group 1 is the ISO date, group 2 is the optional category, and
+group 3 is the optional heading for the entry.
+
+@item muse-journal-html-entry-template
+Template used to publish individual journal entries as HTML.
+
+This may be text or a filename.
+
+@item muse-journal-latex-section
+Template used to publish a LaTeX section.
+
+@item muse-journal-latex-subsection
+Template used to publish a LaTeX subsection.
+
+@item muse-journal-markup-tags
+A list of tag specifications, for specially marking up Journal entries.
+
+@xref{muse-publish-markup-tags}, for more information.
+
+This is used by @code{journal-latex} and its related styles, as well as
+the @code{journal-rss-entry} style, which both @code{journal-rdf} and
+@code{journal-rss} use.
+
+@item muse-journal-rdf-extension
+Default file extension for publishing RDF (RSS 1.0) files.
+
+@item muse-journal-rdf-base-url
+The base URL of the website referenced by the RDF file.
+
+@item muse-journal-rdf-header
+Header used for publishing RDF (RSS 1.0) files.
+
+This may be text or a filename.
+
+@item muse-journal-rdf-footer
+Footer used for publishing RDF (RSS 1.0) files.
+
+This may be text or a filename.
+
+@item muse-journal-rdf-date-format
+Date format to use for RDF entries.
+
+@item muse-journal-rdf-entry-template
+Template used to publish individual journal entries as RDF.
+
+This may be text or a filename.
+
+@item muse-journal-rdf-summarize-entries
+If non-nil, include only summaries in the RDF file, not the full data.
+
+The default is nil, because this annoys some subscribers.
+
+@item muse-journal-rss-heading-regexp
+A regexp that matches a journal heading from an HTML document.
+
+Paren group 1 is the ISO date, group 2 is the optional category,
+and group 3 is the optional heading for the entry.
+
+@item muse-journal-rss-extension
+Default file extension for publishing RSS 2.0 files.
+
+@item muse-journal-rss-base-url
+The base URL of the website referenced by the RSS file.
+
+@item muse-journal-rss-header
+Header used for publishing RSS 2.0 files.
+
+This may be text or a filename.
+
+@item muse-journal-rss-footer
+Footer used for publishing RSS 2.0 files.
+
+This may be text or a filename.
+
+@item muse-journal-rss-date-format
+Date format to use for RSS 2.0 entries.
+
+@item muse-journal-rss-entry-template
+Template used to publish individual journal entries as RSS 2.0.
+
+This may be text or a filename.
+
+@item muse-journal-rss-enclosure-types-alist
+File types that are accepted as RSS enclosures.
+
+This is an alist that maps file extension to content type.
+
+Useful for podcasting.
+
+@item muse-journal-rss-summarize-entries
+If non-nil, include only summaries in the RSS file, not the full data.
+
+The default is nil, because this annoys some subscribers.
+
+@item muse-journal-rss-markup-regexps
+List of markup rules for publishing a Muse journal page to RSS.
+
+For more information on the structure of this list,
+@xref{muse-publish-markup-regexps}.
+
+@item muse-journal-rss-markup-functions
+An alist of style types to custom functions for that kind of text.
+
+For more on the structure of this list,
+@xref{muse-publish-markup-functions}.
+
+@end table
+
+@node LaTeX, Poem, Journal, Publishing Styles
+@comment  node-name,  next,  previous,  up
+@section Publishing LaTeX documents
+
+This publishing style is capable of producing LaTeX or PDF documents.
+
+If you wish to publish PDF documents, you will need to have a good LaTeX
+installation.  For Debian and Ubuntu, this can be accomplished by
+installing the ``tetex-bin'' and ``tetex-extra'' packages.  TeX fonts
+are also a must.
+
+If your LaTeX installation has the file @file{grffile.sty}, which may be
+found in the @file{texlive-latex-recommended} package for Debian and
+Ubuntu, then consider using it by adding the following to your header
+file.  This allows spaces in filenames to work.
+
+@example
+\usepackage@{grffile@}
+@end example
+
+@subheading Styles provided
+
+@table @code
+
+@cindex publishing styles, latex
+@item latex
+Publish a LaTeX document.
+
+@cindex publishing styles, pdf
+@item pdf
+Publish a PDF document, using an external LaTeX document conversion
+tool.
+
+@cindex publishing styles, latexcjk
+@item latexcjk
+Publish a LaTeX document with CJK (Chinese) encodings.
+
+@cindex publishing styles, pdfcjk
+@item pdfcjk
+Publish a PDF document with CJK (Chinese) encodings, using an external
+LaTeX document conversion tool.
+
+@cindex publishing styles, slides
+@item slides
+Publish a LaTeX document that uses the Beamer extension.  This is
+suitable for producing slides.
+
+Here is an example of a slide.
+
+@example
+<slide title="First Slide">
+Everything between the slide tags composes this slide.
+
+[[Some-sort-of-cute-image.png]]
+
+ - A bullet point.
+ - Another bullet point.
+</slide>
+@end example
+
+@cindex publishing styles, slides-pdf
+@item slides-pdf
+Publish a PDF document of slides, using the Beamer extension.
+
+@cindex publishing styles, lecture-notes
+@item lecture-notes
+Publish a LaTeX document that uses the Beamer extension.  This is
+suitable for producing lecture notes.
+
+This can also use the @verb{|<slide>|} tag.
+
+@cindex publishing styles, lecture-notes-pdf
+@item lecture-notes-pdf
+Publish a PDF document of lecture notes, using the Beamer extension.
+
+@end table
+
+@subheading Options provided
+
+@table @code
+
+@item muse-latex-extension
+Default file extension for publishing LaTeX files.
+
+@item muse-latex-pdf-extension
+Default file extension for publishing LaTeX files to PDF.
+
+@item muse-latex-pdf-browser
+The program to use when browsing a published PDF file.
+
+This should be a format string.
+
+@item muse-latex-pdf-program
+The program that is called to generate PDF content from LaTeX content.
+
+@item muse-latex-pdf-cruft
+Extensions of files to remove after generating PDF output successfully.
+
+@item muse-latex-header
+Header used for publishing LaTeX files.
+
+This may be text or a filename.
+
+@item muse-latex-footer
+Footer used for publishing LaTeX files.
+
+This may be text or a filename.
+
+@item muse-latexcjk-header
+Header used for publishing LaTeX files (CJK).
+
+This may be text or a filename.
+
+@item muse-latexcjk-footer
+Footer used for publishing LaTeX files (CJK).
+
+This may be text or a filename.
+
+@item muse-latex-slides-header
+Header for publishing of slides using LaTeX.
+
+This may be text or a filename.
+
+You must have the Beamer extension for LaTeX installed for this to work.
+
+@item muse-latex-lecture-notes-header
+Header publishing of lecture notes using LaTeX.
+
+This may be text or a filename.
+
+You must have the Beamer extension for LaTeX installed for this to work.
+
+@item muse-latex-markup-regexps
+List of markup regexps for identifying regions in a Muse page.
+
+For more on the structure of this list,
+@xref{muse-publish-markup-regexps}.
+
+@item muse-latex-markup-functions
+An alist of style types to custom functions for that kind of text.
+
+For more on the structure of this list,
+@xref{muse-publish-markup-functions}.
+
+@item muse-latex-markup-strings
+Strings used for marking up text.
+
+These cover the most basic kinds of markup, the handling of which
+differs little between the various styles.
+
+@item muse-latex-slides-markup-tags
+A list of tag specifications, for specially marking up LaTeX slides.
+
+@item muse-latexcjk-encoding-map
+An alist mapping emacs coding systems to appropriate CJK codings.
+Use the base name of the coding system (ie, without the -unix).
+
+@item muse-latexcjk-encoding-default
+The default Emacs buffer encoding to use in published files.
+
+This will be used if no special characters are found.
+
+@item muse-latex-markup-specials-document
+A table of characters which must be represented specially.
+These are applied to the entire document, sans already-escaped
+regions.
+
+@item muse-latex-markup-specials-example
+A table of characters which must be represented specially.
+These are applied to @verb{|example>|} regions.
+
+With the default interpretation of @verb{|<example>|} regions, no
+specials need to be escaped.
+
+@item muse-latex-markup-specials-literal
+A table of characters which must be represented specially.
+This applies to =monospaced text= and @verb{|<code>|} regions.
+
+@item muse-latex-markup-specials-url
+A table of characters which must be represented specially.
+These are applied to URLs.
+
+@item muse-latex-markup-specials-image
+A table of characters which must be represented specially.
+These are applied to image filenames.
+
+@item muse-latex-permit-contents-tag
+If nil, ignore @verb{|<contents>|} tags.  Otherwise, insert table of
+contents.
+
+Most of the time, it is best to have a table of contents on the
+first page, with a new page immediately following.  To make this
+work with documents published in both HTML and LaTeX, we need to
+ignore the @verb{|<contents>|} tag.
+
+If you don't agree with this, then set this option to non-nil,
+and it will do what you expect.
+
+@end table
+
+@node Poem, Texinfo, LaTeX, Publishing Styles
+@comment  node-name,  next,  previous,  up
+@section Publish a poem to LaTeX or PDF
+
+The @code{muse-poem} module makes it easy to attractively publish and
+reference poems in the following format, using the "memoir" module for
+LaTeX publishing.  It will also markup poems for every other output
+style, though none are nearly as pretty.
+
+@example
+Title
+
+
+Body of poem
+
+
+Annotations, history, notes, etc.
+@end example
+
+Once a poem is written in this format, just publish it to PDF using the
+@code{poem-pdf} style.  To make an inlined reference to a poem that
+you've written -- for example, from a blog page -- there is a "poem" tag
+defined by this module.
+
+@example
+<poem title="name.of.poem.page">
+@end example
+
+Let's assume the template above was called @file{name.of.poem.page};
+then the above tag would result in this inclusion.
+
+@example
+** Title
+
+> Body of poem
+@end example
+
+John Wiegley uses this module for publishing all of the poems on his
+website, which are at
+@uref{http://www.newartisans.com/johnw/poems.html}.
+
+@subheading Styles provided
+
+@table @code
+
+@cindex publishing styles, poem-latex
+@item poem-latex
+Publish a poem in LaTeX form.
+
+@cindex publishing styles, poem-pdf
+@item poem-pdf
+Publish a poem to a PDF document.
+
+@cindex publishing styles, chapbook-latex
+@item chapbook-latex
+Publish a book of poems in LaTeX form.
+
+@cindex publishing styles, chapbook-pdf
+@item chapbook-pdf
+Publish a book of poems to a PDF document.
+
+@end table
+
+@subheading Options provided
+
+@table @code
+
+@item muse-poem-latex-header
+Header used for publishing LaTeX poems.
+
+This may be text or a filename.
+
+@item muse-poem-latex-footer
+Footer used for publishing LaTeX files.
+
+This may be text or a filename.
+
+@item muse-poem-markup-strings
+Strings used for marking up poems.
+
+These cover the most basic kinds of markup, the handling of which
+differs little between the various styles.
+
+@item muse-chapbook-latex-header
+Header used for publishing a book of poems in LaTeX form.
+
+This may be text or a filename.
+
+@item muse-chapbook-latex-footer
+Footer used for publishing a book of poems in LaTeX form.
+
+This may be text or a filename.
+
+@item muse-poem-chapbook-strings
+Strings used for marking up books of poems.
+
+These cover the most basic kinds of markup, the handling of which
+differs little between the various styles.
+
+@end table
+
+@node Texinfo, XML, Poem, Publishing Styles
+@comment  node-name,  next,  previous,  up
+@section Publish entries to Texinfo format or PDF
+
+Rules for publishing a Muse file as a Texinfo article.
+
+@subheading Styles provided
+
+@table @code
+
+@cindex publishing styles, texi
+@item texi
+Publish a file in Texinfo form.
+
+@cindex publishing styles, texi
+@item info
+Generate an Info file from a Muse file.
+
+@cindex publishing styles, info-pdf
+@item info-pdf
+Publish a file in PDF form.
+
+@end table
+
+@subheading Options provided
+
+@table @code
+
+@item muse-texinfo-process-natively
+If non-nil, use the Emacs `texinfmt' module to make Info files.
+
+@item muse-texinfo-extension
+Default file extension for publishing Texinfo files.
+
+@item muse-texinfo-info-extension
+Default file extension for publishing Info files.
+
+@item muse-texinfo-pdf-extension
+Default file extension for publishing PDF files.
+
+@item muse-texinfo-header
+Text to prepend to a Muse page being published as Texinfo.
+
+This may be text or a filename.
+It may contain @verb{|<lisp>|} markup tags.
+
+@item muse-texinfo-footer
+Text to append to a Muse page being published as Texinfo.
+
+This may be text or a filename.
+It may contain @verb{|<lisp>|} markup tags.
+
+@item muse-texinfo-markup-regexps
+List of markup rules for publishing a Muse page to Texinfo.
+
+For more on the structure of this list,
+@xref{muse-publish-markup-regexps}.
+
+@item muse-texinfo-markup-functions
+An alist of style types to custom functions for that kind of text.
+
+For more on the structure of this list,
+@xref{muse-publish-markup-functions}.
+
+@item muse-texinfo-markup-strings
+Strings used for marking up text.
+
+These cover the most basic kinds of markup, the handling of which
+differs little between the various styles.
+
+@item muse-texinfo-markup-specials
+A table of characters which must be represented specially.
+
+@item muse-texinfo-markup-specials
+A table of characters which must be represented specially.
+These are applied to URLs.
+
+@end table
+
+@node XML, , Texinfo, Publishing Styles
+@comment  node-name,  next,  previous,  up
+@section Publish entries to XML
+
+Muse is capable of publishing XML documents, with the help of the
+@file{muse-xml.el} module.
+
+A RelaxNG schema is available as part of the Muse distribution in the
+@file{etc/muse.rnc} file.
+
+@subheading Styles provided
+
+@table @code
+
+@cindex publishing styles, xml
+@item xml
+Publish a file in XML form.
+
+@end table
+
+@subheading Options provided
+
+@table @code
+
+@cindex muse-xml-encoding-map
+@item muse-xml-encoding-map
+An alist mapping Emacs coding systems to appropriate XML charsets.
+Use the base name of the coding system (i.e. without the -unix).
+
+@item muse-xml-markup-specials
+A table of characters which must be represented specially in all
+XML-like markup formats.
+
+@item muse-xml-markup-specials-url-extra
+A table of characters which must be represented specially in all
+XML-like markup formats.
+
+These are extra characters that are escaped within URLs.
+
+@item muse-xml-extension
+Default file extension used for publishing XML files.
+
+@item muse-xml-header
+Header used for publishing XML files.
+
+This may be text or a filename.
+
+@item muse-xml-footer
+Footer used for publishing XML files.
+
+This may be text or a filename.
+
+@item muse-xml-markup-regexps
+List of markup rules for publishing a Muse page to XML.
+
+For more on the structure of this list,
+@xref{muse-publish-markup-regexps}.
+
+@item muse-xml-markup-functions
+An alist of style types to custom functions for that kind of text.
+
+For more on the structure of this list,
+@xref{muse-publish-markup-functions}.
+
+@item muse-xml-markup-strings
+Strings used for marking up text.
+
+These cover the most basic kinds of markup, the handling of which
+differs little between the various styles.
+
+@item muse-xml-encoding-default
+The default Emacs buffer encoding to use in published files.
+
+This will be used if no special characters are found.
+
+@item muse-xml-charset-default
+The default XML charset to use if no translation is found in
+@code{muse-xml-encoding-map}.
+
+@end table
+
+
+@node Extending Muse, Miscellaneous, Publishing Styles, Top
+@comment  node-name,  next,  previous,  up
+@chapter Making your own publishing styles
+
+@menu
+* Markup Functions::            Specifying functions to mark up text.
+* Markup Regexps::              Markup rules for publishing.
+* Markup Strings::              Strings specific to a publishing style.
+* Markup Tags::                 Tag specifications for special markup.
+* Style Elements::              Parameters used for defining styles.
+* Deriving Styles::             Deriving a new style from an existing
+                                  one.
+@end menu
+
+@node Markup Functions, Markup Regexps, , Extending Muse
+@comment  node-name,  next,  previous,  up
+@section Specifying functions to mark up text
+@cindex publishing, markup functions
+
+@anchor{muse-publish-markup-functions}
+@code{muse-publish-markup-functions}
+
+An alist of style types to custom functions for that kind of text.
+
+This is used by publishing styles to attempt to minimize the amount of
+custom regexps that each has to define.  @file{muse-publish} provides
+rules for the most common types of markup.
+
+Each member of the list is of the following form.
+
+@example
+(SYMBOL FUNCTION)
+@end example
+
+@itemize @bullet
+@item SYMBOL
+Describes the type of text to associate with this rule.
+@code{muse-publish-markup-regexps} maps regexps to these symbols.
+
+@item FUNCTION
+Function to use to mark up this kind of rule if no suitable function is
+found through the @option{:functions} tag of the current style.
+@end itemize
+
+@node Markup Regexps, Markup Strings, Markup Functions, Extending Muse
+@comment  node-name,  next,  previous,  up
+@section Markup rules for publishing
+@cindex publishing, markup regexps
+@cindex publishing, rules
+
+@anchor{muse-publish-markup-regexps}
+@code{muse-publish-markup-regexps}
+
+List of markup rules for publishing a page with Muse.
+
+The rules given in this variable are invoked first, followed by whatever
+rules are specified by the current style.
+
+Each member of the list is either a function, or a list of the following
+form.
+
+@example
+(REGEXP/SYMBOL TEXT-BEGIN-GROUP REPLACEMENT-TEXT/FUNCTION/SYMBOL)
+@end example
+
+@itemize @bullet
+@item REGEXP
+A regular expression, or symbol whose value is a regular expression,
+which is searched for using `re-search-forward'.
+
+@item TEXT-BEGIN-GROUP
+The matching group within that regexp which denotes the beginning of the
+actual text to be marked up.
+
+@item REPLACEMENT-TEXT
+A string that will be passed to `replace-match'.
+
+If it is not a string, but a function, it will be called to determine
+what the replacement text should be (it must return a string).  If it is
+a symbol, the value of that symbol should be a string.
+@end itemize
+
+The replacements are done in order, one rule at a time.  Writing
+the regular expressions can be a tricky business.  Note that case
+is never ignored.  `case-fold-search' is always bound to nil
+while processing the markup rules.
+
+@subheading Publishing order
+
+This is the order that the publishing rules are consulted, by default.
+This may be changed by customizing @code{muse-publish-markup-regexps}.
+
+@table @code
+
+@item trailing and leading whitespace
+Remove trailing and leading whitespace from a file.
+
+@item directive
+@samp{#directive}
+
+This is only recognized at the beginning of a file.
+
+@item comment
+@samp{; a commented line}
+
+@item tag
+@samp{<tag>}
+
+@item comment
+@samp{; comment}
+
+@item explicit links
+Prevent emphasis characters in explicit links from being marked up.
+
+Don't actually publish them here, just add a special no-emphasis text
+property.
+
+@item word
+Whitespace-delimited word, possibly with emphasis characters
+
+This function is responsible for marking up emphasis and escaping some
+specials.
+
+@item heading
+@samp{** Heading}
+
+Outline-mode style headings.
+
+@item enddots
+@samp{....}
+
+These are ellipses with a dot at end.
+
+@item dots
+@samp{...}
+
+Ellipses.
+
+@item rule
+@samp{----}
+
+Horizontal rule or section separator.
+
+@item no-break-space
+@samp{~~}
+
+Prevent lines from being split before or after these characters.
+
+@item line-break
+@samp{<br>}
+
+Break a line at point.
+
+@item fn-sep
+@samp{Footnotes:}
+
+Beginning of footnotes section.
+
+@item footnote
+@samp{[1]}
+
+Footnote definition or reference.  If at beginning of line, it is a
+definition.
+
+@item list
+@itemize @bullet
+@item
+@samp{ 1. }
+
+@item
+@samp{ - }
+
+@item
+@samp{term :: }
+@end itemize
+
+Numbered list, item list, or term definition list.
+
+@item table-el
+
+@file{table.el} style tables
+
+@item table
+@samp{table | cells}
+
+Muse tables or orgtbl-mode style tables.
+
+@item quote
+spaces before beginning of text
+
+Blockquotes.
+
+@item emdash
+@samp{--}
+
+2-wide dash
+
+@item verse
+@samp{> verse text}
+
+@item anchor
+@samp{#anchor}
+
+@item link
+@samp{[[explicit][links]]}
+
+@item url
+@samp{http://example.com/}
+
+@item email
+@samp{bare-email@@example.com}
+
+@end table
+
+@node Markup Strings, Markup Tags, Markup Regexps, Extending Muse
+@comment  node-name,  next,  previous,  up
+@section Strings specific to a publishing style
+@cindex publishing, markup strings
+
+@dfn{Markup strings} are strings used for marking up text for a
+particular style.
+
+These cover the most basic kinds of markup, the handling of which
+differs little between the various styles.
+
+@subheading Available markup strings
+
+@table @code
+
+@item image-with-desc
+An image and a description.
+
+Argument 1: image without extension.  Argument 2: image extension.
+Argument 3: description.
+
+@item image
+An inlined image.
+
+Argument 1: image without extension.  Argument 2: image extension.
+
+@item image-link
+An image with a link around it.
+
+Argument 1: link.  Argument 2: image without extension.
+Argument 3: image extension.
+
+@item anchor-ref
+A reference to an anchor on the current page.
+
+Argument 1: anchor name.  Argument 2: description if one exists, or the
+original link otherwise.
+
+@item url
+A URL without a description.
+
+Argument 1: URL.
+
+@item link
+A link to a Muse page with a description.
+
+Argument 1: link.  Argument 2: description if one exists, or the
+original link otherwise.
+
+@item link-and-anchor
+A link to a Muse page with an anchor, and a description.
+
+Argument 1: link.  Argument 2: anchor name.
+Argument 3: description if one exists, or the original link otherwise.
+Argument 4: link without an extension.
+
+@item email-addr
+A link to an email address.
+
+Argument 1: email address.  Argument 2: email address.
+
+@item anchor
+An anchor.
+
+Argument 1: name of anchor.
+
+@item emdash
+A 2-length dash.
+
+Argument 1: Initial whitespace.  Argument 2: Terminating whitespace.
+
+@item comment-begin
+Beginning of a comment.
+
+@item comment-end
+End of a comment.
+
+@item rule
+A horizontal line or space.
+
+@item no-break-space
+A space that separates two words which are not to be separated.
+
+@item footnote
+Beginning of footnote.
+
+@item footnote-end
+End of footnote.
+
+@item footnotemark
+Mark a reference for the current footnote.
+
+Argument 1: number of this footnote.
+
+@item footnotemark-end
+End of a reference for the current footnote.
+
+@item footnotetext
+Indicate the text of the current footnote.
+
+Argument 1: number of this footnote.
+
+@item footnotetext-end
+End of a footnote text line.
+
+@item fn-sep
+Text used to replace ``Footnotes:'' line.
+
+@item dots
+3 dots.
+
+@item enddots
+4 dots.
+
+@item part
+Beginning of a part indicator line.  This is used by book publishing.
+
+@item part-end
+End of a part indicator line.  This is used by book publishing.
+
+@item chapter
+Beginning of a chapter indicator line.  This is used by book publishing.
+
+@item chapter-end
+End of a chapter indicator line.  This is used by book publishing.
+
+@item section
+Beginning of level 1 section indicator line.
+
+Argument 1: level of section; always 1.
+
+@item section-end
+End of level 1 section indicator line.
+
+Argument 1: level of section; always 1.
+
+@item subsection
+Beginning of level 2 section indicator line.
+
+Argument 1: level of section; always 2.
+
+@item subsection-end
+End of level 2 section indicator line.
+
+Argument 1: level of section; always 2.
+
+@item subsubsection
+Beginning of level 3 section indicator line.
+
+Argument 1: level of section; always 3.
+
+@item subsubsection-end
+End of level 3 section indicator line.
+
+Argument 1: level of section; always 3.
+
+@item section-other
+Beginning of section indicator line, where level is greater than 3.
+
+Argument 1: level of section.
+
+@item section-other-end
+End of section indicator line, where level is greater than 3.
+
+Argument 1: level of section.
+
+@item begin-underline
+Beginning of underlined text.
+
+@item end-underline
+End of underlined text.
+
+@item begin-literal
+Beginning of verbatim text.  This includes @verb{|<code>|} tags and
+=teletype text=.
+
+@item end-literal
+End of verbatim text.  This includes @verb{|<code>|} tags and =teletype
+text=.
+
+@item begin-emph
+Beginning of the first level of emphasized text.
+
+@item end-emph
+End of the first level of emphasized text.
+
+@item begin-more-emph
+Beginning of the second level of emphasized text.
+
+@item end-more-emph
+End of the second level of emphasized text.
+
+@item begin-most-emph
+Beginning of the third (and final) level of emphasized text.
+
+@item end-most-emph
+End of the third (and final) level of emphasized text.
+
+@item begin-verse
+Beginning of verse text.
+
+@item verse-space
+String used to each space that is further indented than the beginning of
+the verse.
+
+@item begin-verse-line
+Beginning of a line of verse.
+
+@item empty-verse-line
+End of a line of verse.
+
+@item begin-last-stanza-line
+Beginning of the last line of a verse stanza.
+
+@item end-last-stanza-line
+End of the last line of a verse stanza.
+
+@item end-verse
+End of verse text.
+
+@item begin-example
+Beginning of an example region.  To make use of this, an
+@samp{<example>} tag is needed.
+
+@item end-example
+End of an example region.  To make use of this, an @samp{</example>} tag
+is needed.
+
+@item begin-center
+Begin a centered line.
+
+@item end-center
+End a centered line.
+
+@item begin-quote
+Begin a quoted region.
+
+@item end-quote
+End a quoted region.
+
+@item begin-quote-item
+Begin a quote paragraph.
+
+@item end-quote-item
+End a quote paragraph.
+
+@item begin-uli
+Begin an unordered list.
+
+@item end-uli
+End an unordered list.
+
+@item begin-uli-item
+Begin an unordered list item.
+
+@item end-uli-item
+End an unordered list item.
+
+@item begin-oli
+Begin an ordered list.
+
+@item end-oli
+End an ordered list.
+
+@item begin-oli-item
+Begin an ordered list item.
+
+@item end-oli-item
+End an ordered list item.
+
+@item begin-dl
+Begin a definition list.
+
+@item end-dl
+End a definition list.
+
+@item begin-dl-item
+Begin a definition list item.
+
+@item end-dl-item
+End a definition list item.
+
+@item begin-ddt
+Begin a definition list term.
+
+@item end-ddt
+End a definition list term.
+
+@item begin-dde
+Begin a definition list entry.
+
+@item end-dde
+End a definition list entry.
+
+@item begin-table
+Begin a table.
+
+@item end-table
+End a table.
+
+@item begin-table-group
+Begin a table grouping.
+
+@item end-table-group
+End a table grouping.
+
+@item begin-table-row
+Begin a table row.
+
+@item end-table-row
+End a table row.
+
+@item begin-table-entry
+Begin a table entry.
+
+@item end-table-entry
+End a table entry.
+
+@end table
+
+@node Markup Tags, Style Elements, Markup Strings, Extending Muse
+@comment  node-name,  next,  previous,  up
+@section Tag specifications for special markup
+@cindex publishing, markup tags
+
+@anchor{muse-publish-markup-tags}
+@code{muse-publish-markup-tags}
+
+A list of tag specifications, for specially marking up text.
+
+XML-style tags are the best way to add custom markup to Muse.  This is
+easily accomplished by customizing this list of markup tags.
+
+For each entry, the name of the tag is given, whether it expects a
+closing tag and/or an optional set of attributes, whether it is
+nestable, and a function that performs whatever action is desired within
+the delimited region.
+
+The tags themselves are deleted during publishing, before the function
+is called.  The function is called with three arguments, the beginning
+and end of the region surrounded by the tags.  If properties are
+allowed, they are passed as a third argument in the form of an alist.
+The `end' argument to the function is always a marker.
+
+Point is always at the beginning of the region within the tags, when the
+function is called.  Wherever point is when the function finishes is
+where tag markup will resume.
+
+These tag rules are processed once at the beginning of markup, and once
+at the end, to catch any tags which may have been inserted in-between.
+
+@node Style Elements, Deriving Styles, Markup Tags, Extending Muse
+@comment  node-name,  next,  previous,  up
+@section Parameters used for defining styles
+@cindex publishing, style elements
+
+Style elements are tags that define a style.  Use either
+@code{muse-define-style} or @code{muse-derive-style}
+(@pxref{Deriving Styles}) to create a new style.
+
+@defun muse-define-style name &rest elements
+@end defun
+
+@subheading Usable elements
+
+@table @option
+
+@item :suffix
+File extension to use for publishing files with this style.
+
+@item :link-suffix
+File extension to use for publishing links to Muse files with this
+style.
+
+@item :osuffix
+File extension to use for publishing second-stage files with this style.
+
+For example, PDF publishing generates a LaTeX file first, then a PDF
+from that LaTeX file.
+
+@item :regexps
+List of markup rules for publishing a page with Muse.
+@xref{muse-publish-markup-regexps}.
+
+@item :functions
+An alist of style types to custom functions for that kind of text.
+@xref{muse-publish-markup-functions}.
+
+@item :strings
+Strings used for marking up text with this style.
+
+These cover the most basic kinds of markup, the handling of which
+differs little between the various styles.
+
+@item :tags
+A list of tag specifications, used for handling extra tags.
+@xref{muse-publish-markup-tags}.
+
+@item :specials
+A table of characters which must be represented specially.
+
+@item :before
+A function that is to be executed on the newly-created publishing buffer
+(or the current region) before any publishing occurs.
+
+This is used to set extra parameters that direct the publishing process.
+
+@item :before-end
+A function that is to be executed on the publishing buffer (or the
+current region) immediately after applying all of the markup regexps.
+
+This is used to fix the order of table elements (header, footer, body)
+in XML-ish styles.
+
+@item :after
+A function that is to be executed on the publishing buffer after
+:before-end, and immediately after inserting the header and footer.
+
+This is used for generating the table of contents as well as setting the
+file coding system.
+
+@item :final
+A function that is to be executed after saving the published file, but
+while still in its buffer.
+
+This is used for generating second-stage documents like PDF files from
+just-published LaTeX files.
+
+The function must accept three arguments: the name of the muse source
+file, the name of the just-published file, and the name of the
+second-stage target file.  The name of the second-stage target file is
+the same as that of the just-published file if no second-stage
+publishing is required.
+
+@item :header
+Header used for publishing files of this style.
+
+This may be a variable, text, or a filename.  It is inserted at the
+beginning of a file, after evaluating the publishing markup.
+
+@item :footer
+Footer used for publishing files of this style.
+
+This may be a variable, text, or a filename.  It is inserted at the end
+of a file, after evaluating the publishing markup.
+
+@item :style-sheet
+Style sheet used for publishing files of this style.
+
+This may be a variable or text.  It is used in the header of HTML and
+XHTML based publishing styles.
+
+@item :browser
+The function used to browse the published result of files of this style.
+
+@end table
+
+@node Deriving Styles, , Style Elements, Extending Muse
+@comment  node-name,  next,  previous,  up
+@section Deriving a new style from an existing one
+@cindex publishing styles, deriving
+
+To create a new style from an existing one, use @code{muse-derive-style}
+as follows.  This is a good way to fix something you don't like about a
+particular publishing style, or to personalize it.
+
+@defun muse-derive-style new-name base-name &rest elements
+@end defun
+
+The derived name is a string defining the new style, such as "my-html".
+The base name must identify an existing style, such as "html" -- if you
+have loaded @file{muse-html}.  The style parameters are the same as
+those used to create a style, except that they override whatever
+definitions exist in the base style.  However, some definitions only
+partially override.  The following parameters support partial
+overriding.
+
+@xref{Style Elements}, for a complete list of all parameters.
+
+@table @option
+
+@item :functions
+If a markup function is not found in the derived style's function list,
+the base style's function list will be queried.
+
+@item :regexps
+All regexps in the current style and the base style(s) will be used.
+
+@item :strings
+If a markup string is not found in the derived style's string list, the
+base style's string list will be queried.
+
+@end table
+
+@node Miscellaneous, Getting Help and Reporting Bugs, Extending Muse, Top
+@comment  node-name,  next,  previous,  up
+@chapter Miscellaneous add-ons, like a minor mode
+
+@menu
+* Muse List Edit Minor Mode::   Edit lists easily in other major modes.
+@end menu
+
+@node Muse List Edit Minor Mode, , , Miscellaneous
+@comment  node-name,  next,  previous,  up
+@section Edit lists easily in other major modes
+@cindex muse-list-edit-minor-mode
+
+@code{muse-list-edit-minor-mode} is meant to be used with other major
+modes, such as Message (for composing email) and debian-changelog-mode
+(for editing debian/changelog files).
+
+It implements practically perfect support for editing and filling lists.
+It can even handle nested lists.  In addition to Muse-specific list
+items ("-", numbers, definition lists, footnotes), it can also handle
+items that begin with "*" or "+".  Filling list items behaves in the
+same way that it does in Muse, regardless of whether filladapt is also
+enabled, which is the primary reason to use this tool.
+
+@subheading Installation
+
+To use it, add ``(require 'muse-mode)'' to your Emacs customization file
+and add the function @code{turn-on-muse-list-edit-minor-mode} to any
+mode hooks where you wish to enable this minor mode.
+
+@subheading Keybindings
+
+@code{muse-list-edit-minor-mode} uses the following keybindings.
+
+@table @kbd
+
+@item M-RET (`muse-l-e-m-m-insert-list-item')
+Insert a new list item at point, using the indentation level of the
+current list item.
+
+@item C-< (`muse-l-e-m-m-decrease-list-item-indent')
+Decrease indentation of the current list item.
+
+@item C-> (`muse-l-e-m-m-increase-list-item-indent')
+Increase indentation of the current list item.
+
+@end table
+
+@subheading Functions
+
+@defun muse-list-edit-minor-mode
+This is a global minor mode for editing files with lists.
+It is meant to be used with other major modes, and not with Muse mode.
+
+Interactively, with no prefix argument, toggle the mode.
+With universal prefix @var{arg} turn mode on.
+With zero or negative @var{arg} turn mode off.
+
+This minor mode provides the Muse keybindings for editing lists,
+and support for filling lists properly.
+
+It recognizes not only Muse-style lists, which use the "-"
+character or numbers, but also lists that use asterisks or plus
+signs.  This should make the minor mode generally useful.
+
+Definition lists and footnotes are also recognized.
+
+Note that list items may omit leading spaces, for compatibility
+with modes that set @code{left-margin}, such as
+@code{debian-changelog-mode}.
+@end defun
+
+@defun turn-on-muse-list-edit-minor-mode
+Unconditionally turn on Muse list edit minor mode.
+@end defun
+
+@defun turn-off-muse-list-edit-minor-mode
+Unconditionally turn off Muse list edit minor mode.
+@end defun
+
+@node Getting Help and Reporting Bugs, History, Miscellaneous, Top
+@comment  node-name,  next,  previous,  up
+@chapter Getting Help and Reporting Bugs
+@cindex help, getting
+@cindex bugs, reporting
+
+After you have read this guide, if you still have questions about
+Muse, or if you have bugs to report, there are several places you can
+go.
+
+@itemize @bullet
+
+@item
+@uref{http://www.emacswiki.org/cgi-bin/wiki/EmacsMuse} is the
+emacswiki.org page, and anyone may add tips, hints, or bug descriptions
+to it.
+
+@item
+@uref{http://mwolson.org/projects/EmacsMuse.html} is the web page
+that Michael Olson (the current maintainer) made for Muse.
+
+@item
+Muse has several different mailing lists.
+
+@table @samp
+
+@item muse-el-announce
+Low-traffic list for Muse-related announcements.
+
+You can join this mailing list (@email{muse-el-announce@@gna.org})
+using the subscription form at
+@url{http://mail.gna.org/listinfo/muse-el-announce/}.  This
+mailing list is also available via Gmane (@url{http://gmane.org/}). The
+group is called @samp{gmane.emacs.muse.announce}.
+
+@item muse-el-discuss
+Discussion, bugfixes, suggestions, tips, and the like for Muse.
+This mailing list also includes the content of muse-el-announce.
+
+You can join this mailing list (@email{muse-el-discuss@@gna.org})
+using the subscription form at
+@url{http://mail.gna.org/listinfo/muse-el-discuss/}.  This mailing
+list is also available via Gmane with the identifier
+@samp{gmane.emacs.muse.general}.
+
+@item muse-el-logs
+Log messages for commits made to Muse.
+
+You can join this mailing list (@email{muse-el-logs@@gna.org}) using
+the subscription form at
+@url{http://mail.gna.org/listinfo/muse-el-logs/}.  This mailing list
+is also available via Gmane with the identifier
+@samp{gmane.emacs.muse.scm}.
+
+@item muse-el-commits
+Generated bug reports for Emacs Muse.  If you use our bug-tracker at
+@url{https://gna.org/bugs/?group=muse-el}, the bug reports will be
+sent to this list automatically.
+
+You can join this mailing list (@email{muse-el-commits@@gna.org}) using
+the subscription form at
+@url{http://mail.gna.org/listinfo/muse-el-commits/}.  This mailing list
+is also available via Gmane with the identifier
+@samp{gmane.emacs.muse.cvs}.
+
+@item muse-el-internationalization
+Discussion of translation of the Muse website and documentation into
+many languages.
+
+You can join this mailing list
+(@email{muse-el-internationalization@@gna.org}) using the subscription
+form at @url{http://mail.gna.org/listinfo/internationalization/}.  This
+mailing list is also available via Gmane with the identifier
+@samp{gmane.emacs.muse.internationalization}.
+
+@end table
+
+@item
+You can visit the IRC Freenode channel @samp{#emacs}. Many of the
+contributors are frequently around and willing to answer your
+questions.  The @samp{#muse} channel is also available for
+Muse-specific help, and its current maintainer hangs out there.
+
+@item
+The maintainer of Emacs Muse, Michael Olson, may be contacted at
+@email{mwolson@@gnu.org}.  He can be rather slow at answering email, so
+it is often better to use the muse-el-discuss mailing list.
+
+@end itemize
+
+@node History, Contributors, Getting Help and Reporting Bugs, Top
+@comment  node-name,  next,  previous,  up
+@chapter History of This Document
+@cindex history, of Muse
+
+@itemize
+@item 2004
+John Wiegley started Muse upon realizing that EmacsWiki had some serious
+limitations. Around February 2004, he started making "emacs-wiki version
+3.00 APLHA", which eventually became known as Muse.
+
+Most of those who frequent the emacs-wiki mailing list continued to use
+emacs-wiki, mainly because Planner hasn't been ported over to it.
+
+As of 2004-12-01, Michael Olson became the maintainer of Muse, as per
+John Wiegley's request.
+
+@item 2005
+Michael Olson overhauled this document and added many new sections in
+preparation for the first release of Muse (3.01).
+
+@end itemize
+
+@node Contributors, GNU Free Documentation License, History, Top
+@comment  node-name,  next,  previous,  up
+@chapter Contributors to This Documentation
+@cindex contributors
+
+The first draft of this document was taken from the emacs-wiki texinfo
+manual.  Michael Olson adapted it for Muse and added most of its
+content.
+
+John Sullivan did a majority of the work on the emacs-wiki texinfo
+manual.
+
+While Sacha Chua maintained emacs-wiki, she worked quite a bit on the
+emacs-wiki texinfo manual.
+
+
+@node GNU Free Documentation License, Concept Index, Contributors, Top
+@appendix GNU Free Documentation License
+@include doclicense.texi
+
+
+@node Concept Index,  , GNU Free Documentation License, Top
+@comment  node-name,  next,  previous,  up
+@unnumbered Index
+
+@printindex cp
+
+@bye
diff --git a/packages/nhexl-mode/nhexl-mode.el b/packages/nhexl-mode/nhexl-mode.el
new file mode 100644 (file)
index 0000000..d4a3d26
--- /dev/null
@@ -0,0 +1,262 @@
+;;; nhexl-mode.el --- Minor mode to edit files via hex-dump format  -*- lexical-binding: t -*-
+
+;; Copyright (C) 2010, 2012  Free Software Foundation, Inc.
+
+;; Author: Stefan Monnier <monnier@iro.umontreal.ca>
+;; Keywords: data
+;; Version: 0.1
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This package implements NHexl mode, a minor mode for editing files
+;; in hex dump format.  The mode command is called `nhexl-mode'.
+;;
+;; This minor mode implements similar functionality to `hexl-mode',
+;; but using a different implementation technique, which makes it
+;; usable as a "plain" minor mode.  It works on any buffer, and does
+;; not mess with the undo boundary or with the major mode.
+;;
+;; In theory it could also work just fine even on very large buffers,
+;; although in practice it seems to make the display engine suffer.
+
+;;; Todo:
+;; - Clicks on the hex side should put point at the right place.
+
+;;; Code:
+
+(eval-when-compile (require 'cl))
+(require 'hexl)                         ;For faces.
+
+(defgroup nhexl nil
+  "Edit a file in a hex dump format."
+  :group 'data)
+
+(defvar nhexl-line-width 16
+  "Number of bytes per line.")
+
+(defvar nhexl--display-table
+  (let ((dt (make-display-table)))
+    ;; (aset dt ?\n [?␊])
+    (aset dt ?\t [?␉])
+    dt))
+
+(defvar nhexl--saved-vars nil)
+(make-variable-buffer-local 'nhexl--saved-vars)
+(defvar nhexl--point nil)
+(make-variable-buffer-local 'nhexl--point)
+
+;;;###autoload
+(define-minor-mode nhexl-mode
+  "Minor mode to edit files via hex-dump format"
+  :lighter " NHexl"
+  (if (not nhexl-mode)
+      (progn
+        (dolist (varl nhexl--saved-vars)
+          (set (make-local-variable (car varl)) (cdr varl)))
+        (kill-local-variable 'nhexl--saved-vars)
+        (jit-lock-unregister #'nhexl--jit)
+        (remove-hook 'after-change-functions #'nhexl--change-function 'local)
+        (remove-hook 'post-command-hook #'nhexl--post-command 'local)
+        ;; FIXME: This will conflict with any other use of `display'.
+        (with-silent-modifications
+          (put-text-property (point-min) (point-max) 'display nil))
+        (remove-overlays (point-min) (point-max) 'nhexl t))
+    (unless (local-variable-p 'nhexl--saved-vars)
+      (dolist (var '(buffer-display-table buffer-invisibility-spec
+                     overwrite-mode header-line-format))
+        (push (cons var (symbol-value var)) nhexl--saved-vars)))
+    (setq nhexl--point (point))
+    (setq header-line-format '(:eval (nhexl--header-line)))
+    (binary-overwrite-mode 1)
+    (setq buffer-invisibility-spec ())
+    (set (make-local-variable 'buffer-display-table) nhexl--display-table)
+    (jit-lock-register #'nhexl--jit)
+    (add-hook 'change-major-mode-hook (lambda () (nhexl-mode -1)) nil 'local)
+    (add-hook 'post-command-hook #'nhexl--post-command nil 'local)
+    (add-hook 'after-change-functions #'nhexl--change-function nil 'local)))
+
+(defun nhexl--change-function (beg end len)
+  ;; Jit-lock already takes care of refreshing the changed area, so we
+  ;; only have to make sure the tail's addresses are refreshed when
+  ;; text is inserted/removed.
+  (when (/= len (- end beg))
+    (put-text-property beg (point-max) 'fontified nil)))
+
+(defvar nhexl--overlay-counter 100)
+(make-variable-buffer-local 'nhexl--overlay-counter)
+
+(defun nhexl--debug-count-ols ()
+  (let ((i 0))
+    (dolist (ol (overlays-in (point-min) (point-max)))
+      (when (overlay-get ol 'nhexl) (incf i)))
+    i))
+
+(defun nhexl--flush-overlays (buffer)
+  (with-current-buffer buffer
+    (kill-local-variable 'nhexl--overlay-counter)
+    ;; We've created many overlays in this buffer, which can slow
+    ;; down operations significantly.  Let's flush them.
+    ;; An easy way to flush them is
+    ;;   (remove-overlays min max 'nhexl t)
+    ;;   (put-text-property min max 'fontified nil)
+    ;; but if the visible part of the buffer requires more than
+    ;; nhexl--overlay-counter overlays, then we'll inf-loop.
+    ;; So let's be more careful about removing overlays.
+    (let ((windows (get-buffer-window-list nil nil t))
+          (start (point-min))
+          (zero (save-restriction (widen) (point-min)))
+          (debug-count (nhexl--debug-count-ols)))
+      (with-silent-modifications
+        (while (< start (point-max))
+          (let ((end (point-max)))
+            (dolist (window windows)
+              (cond
+               ((< start (1- (window-start window)))
+                (setq end (min (1- (window-start window)) end)))
+               ((< start (1+ (window-end window)))
+                (setq start (1+ (window-end window))))))
+            ;; Round to multiple of nhexl-line-width.
+            (setq start (+ zero (* (ceiling (- start zero) nhexl-line-width)
+                                   nhexl-line-width)))
+            (setq end (+ zero (* (truncate (- end zero) nhexl-line-width)
+                                 nhexl-line-width)))
+            (when (< start end)
+              (remove-overlays start end 'nhexl t)
+              (put-text-property start end 'fontified nil)
+              (setq start (+ end nhexl-line-width))))))
+      (let ((debug-new-count (nhexl--debug-count-ols)))
+        (message "Flushed %d overlays, %d remaining"
+                 (- debug-count debug-new-count) debug-new-count)))))
+
+(defun nhexl--make-line (from next zero)
+  (let* ((nextpos (min next (point-max)))
+         (bufstr (buffer-substring from nextpos))
+         (i -1)
+         (s (concat
+             (unless (eq zero from) "\n")
+             (format (propertize "%08x:" 'face
+                                 (if (or (< nhexl--point from)
+                                         (>= nhexl--point next))
+                                     'hexl-address-region
+                                   '(highlight hexl-address-region)))
+                     (- from zero))
+             (propertize " " 'display '(space :align-to 12))
+             (mapconcat (lambda (c)
+                          (setq i (1+ i))
+                          ;; FIXME: In multibyte buffers,
+                          ;; do something clever about
+                          ;; non-ascii chars.
+                          (let ((s (format "%02x" c)))
+                            (when (eq nhexl--point (+ from i))
+                              (put-text-property 0 (length s)
+                                                 'face 'highlight
+                                                 s))
+                            (if (zerop (mod i 2))
+                                s (concat s " "))))
+                        bufstr
+                        "")
+             (if (> next nextpos)
+                 (make-string (+ (/ (1+ (- next nextpos)) 2)
+                                 (* (- next nextpos) 2))
+                              ?\s))
+             (propertize "  " 'display
+                         `(space :align-to
+                                 ,(+ (/ (* nhexl-line-width 5) 2)
+                                     12 3))))))
+    (font-lock-append-text-property 0 (length s) 'face 'default s)
+    s))
+
+(defun nhexl--jit (from to)
+  (let ((zero (save-restriction (widen) (point-min))))
+    (setq from (+ zero (* (truncate (- from zero) nhexl-line-width)
+                          nhexl-line-width)))
+    (setq to (+ zero (* (ceiling (- to zero) nhexl-line-width)
+                        nhexl-line-width)))
+    (remove-overlays from (min to (point-max)) 'nhexl t)
+    (save-excursion
+      (goto-char from)
+      (while (search-forward "\n" to t)
+        (put-text-property (match-beginning 0) (match-end 0)
+                           'display (copy-sequence "␊"))))
+    (while (< from to)
+
+      (decf nhexl--overlay-counter)
+      (when (and (= nhexl--overlay-counter 0)
+                 ;; If the user enabled jit-lock-stealth fontification, then
+                 ;; removing overlays is just a waste since
+                 ;; jit-lock-stealth will restore them anyway.
+                 (not jit-lock-stealth-time))
+        ;; (run-with-idle-timer 0 nil 'nhexl--flush-overlays (current-buffer))
+        )
+      
+      (let* ((next (+ from nhexl-line-width))
+             (ol (make-overlay from next))
+             (s (nhexl--make-line from next zero)))
+        (overlay-put ol 'nhexl t)
+        (overlay-put ol 'face 'hexl-ascii-region)
+        (overlay-put ol 'before-string s)
+        (setq from next)))))
+
+(defun nhexl--header-line ()
+  ;; FIXME: merge with nhexl--make-line.
+  (let* ((zero (save-restriction (widen) (point-min)))
+         (text
+          (let ((tmp ()))
+            (dotimes (i nhexl-line-width)
+              (push (if (< i 10) (+ i ?0) (+ i -10 ?a)) tmp))
+            (apply 'string (nreverse tmp))))
+         (pos (mod (- nhexl--point zero) nhexl-line-width))
+         (i -1))
+    (put-text-property pos (1+ pos) 'face 'highlight text)
+    (concat
+     (propertize " " 'display '(space :align-to 0))
+     "Address:"
+     (propertize " " 'display '(space :align-to 12))
+     (mapconcat (lambda (c)
+                  (setq i (1+ i))
+                  (let ((s (string c c)))
+                    (when (eq i pos)
+                      (put-text-property 0 (length s)
+                                         'face 'highlight
+                                         s))
+                    (if (zerop (mod i 2)) s
+                      (concat
+                       s (propertize " " 'display
+                                     `(space :align-to
+                                             ,(+ (/ (* i 5) 2) 12 3)))))))
+                text
+                "")
+     (propertize "  " 'display
+                 `(space :align-to
+                         ,(+ (/ (* nhexl-line-width 5) 2)
+                             12 3)))
+     text)))
+  
+
+(defun nhexl--post-command ()
+  (when (/= (point) nhexl--point)
+    (let ((zero (save-restriction (widen) (point-min)))
+          (oldpoint nhexl--point))
+      (setq nhexl--point (point))
+      (with-silent-modifications
+        (nhexl--jit (point) (1+ (point)))
+        (if (/= (truncate (- (point) zero) nhexl-line-width)
+                (truncate (- oldpoint zero) nhexl-line-width))
+            (nhexl--jit oldpoint (1+ oldpoint)))))))
+  
+
+(provide 'nhexl-mode)
+;;; nhexl-mode.el ends here
diff --git a/packages/nlinum/nlinum.el b/packages/nlinum/nlinum.el
new file mode 100644 (file)
index 0000000..1c9e4e8
--- /dev/null
@@ -0,0 +1,182 @@
+;;; nlinum.el --- Show line numbers in the margin  -*- lexical-binding: t -*-
+
+;; Copyright (C) 2012  Free Software Foundation, Inc.
+
+;; Author: Stefan Monnier <monnier@iro.umontreal.ca>
+;; Keywords: convenience
+;; Version: 1.1
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This is like linum-mode, but uses jit-lock to be (hopefully)
+;; more efficient.
+
+;;; Code:
+
+(require 'linum)                        ;For its face.
+
+(defvar nlinum--width 2)
+(make-variable-buffer-local 'nlinum--width)
+
+;; (defvar nlinum--desc "")
+
+;;;###autoload
+(define-minor-mode nlinum-mode
+  "Toggle display of line numbers in the left margin (Linum mode).
+With a prefix argument ARG, enable Linum mode if ARG is positive,
+and disable it otherwise.  If called from Lisp, enable the mode
+if ARG is omitted or nil.
+
+Linum mode is a buffer-local minor mode."
+  :lighter nil ;; (" NLinum" nlinum--desc)
+  (jit-lock-unregister #'nlinum--region)
+  (remove-hook 'window-configuration-change-hook #'nlinum--setup-window t)
+  (remove-hook 'after-change-functions #'nlinum--after-change)
+  (kill-local-variable 'nlinum--line-number-cache)
+  (remove-overlays (point-min) (point-max) 'nlinum t)
+  ;; (kill-local-variable 'nlinum--ol-counter)
+  (kill-local-variable 'nlinum--width)
+  (when nlinum-mode
+    (add-hook 'window-configuration-change-hook #'nlinum--setup-window nil t)
+    (add-hook 'after-change-functions #'nlinum--after-change nil t)
+    (jit-lock-register #'nlinum--region t))
+  (nlinum--setup-windows))
+
+(defun nlinum--setup-window ()
+  (set-window-margins nil (if nlinum-mode nlinum--width)
+                      (cdr (window-margins))))
+
+(defun nlinum--setup-windows ()
+  (dolist (win (get-buffer-window-list nil nil t))
+    (with-selected-window win (nlinum--setup-window))))
+
+(defun nlinum--new-width ()
+  (nlinum--setup-windows)
+  ;; (kill-local-variable 'nlinum--ol-counter)
+  (remove-overlays (point-min) (point-max) 'nlinum t)
+  (run-with-timer 0 nil
+                  (lambda (buf)
+                    (with-current-buffer buf
+                      (with-silent-modifications
+                        (remove-text-properties
+                         (point-min) (point-max) '(fontified)))))
+                  (current-buffer)))
+
+;; (defun nlinum--ol-count ()
+;;   (let ((i 0))
+;;     (dolist (ol (overlays-in (point-min) (point-max)))
+;;       (when (overlay-get ol 'nlinum) (incf i)))
+;;     i))
+
+;; (defvar nlinum--ol-counter 100)
+;; (make-variable-buffer-local 'nlinum--ol-counter)
+
+;; (defun nlinum--flush-overlays (buffer)
+;;   (with-current-buffer buffer
+;;     (kill-local-variable 'nlinum--ol-counter)
+;;     ;; We've created many overlays in this buffer, which can slow
+;;     ;; down operations significantly.  Let's flush them.
+;;     ;; An easy way to flush them is
+;;     ;;   (remove-overlays min max 'nlinum t)
+;;     ;;   (put-text-property min max 'fontified nil)
+;;     ;; but if the visible part of the buffer requires more than
+;;     ;; nlinum-overlay-threshold overlays, then we'll inf-loop.
+;;     ;; So let's be more careful about removing overlays.
+;;     (let ((windows (get-buffer-window-list nil nil t))
+;;           (start (point-min))
+;;           (debug-count (nlinum--ol-count)))
+;;       (with-silent-modifications
+;;         (while (< start (point-max))
+;;           (let ((end (point-max)))
+;;             (dolist (window windows)
+;;               (cond
+;;                ((< start (1- (window-start window)))
+;;                 (setq end (min (1- (window-start window)) end)))
+;;                ((< start (1+ (window-end window)))
+;;                 (setq start (1+ (window-end window))))))
+;;             (when (< start end)
+;;               (remove-overlays start end 'nlinum t)
+;;               ;; Warn jit-lock that this part of the buffer is not done any
+;;               ;; more.  This has the downside that font-lock will be re-applied
+;;               ;; as well.  But jit-lock doesn't know how to (and doesn't want
+;;               ;; to) keep track of the status of its various
+;;               ;; clients independently.
+;;               (put-text-property start end 'fontified nil)
+;;               (setq start (+ end 1))))))
+;;       (let ((debug-new-count (nlinum--ol-count)))
+;;         (message "Flushed %d overlays, %d remaining"
+;;                  (- debug-count debug-new-count) debug-new-count)))))
+
+
+(defvar nlinum--line-number-cache nil)
+(make-variable-buffer-local 'nlinum--line-number-cache)
+
+(defun nlinum--after-change (&rest _args)
+  (setq nlinum--line-number-cache nil))
+
+(defun nlinum--line-number-at-pos ()
+  "Like `line-number-at-pos' but sped up with a cache."
+  ;; (assert (bolp))
+  (let ((pos
+         (if (and nlinum--line-number-cache
+                  (> (- (point) (point-min))
+                     (abs (- (point) (car nlinum--line-number-cache)))))
+             (funcall (if (> (point) (car nlinum--line-number-cache))
+                          #'+ #'-)
+                      (cdr nlinum--line-number-cache)
+                      (count-lines (point) (car nlinum--line-number-cache)))
+           (line-number-at-pos))))
+    ;;(assert (= pos (line-number-at-pos)))
+    (setq nlinum--line-number-cache (cons (point) pos))
+    pos))
+
+(defun nlinum--region (start limit)
+  (save-excursion
+    ;; Text may contain those nasty intangible properties, but
+    ;; that shouldn't prevent us from counting those lines.
+    (let ((inhibit-point-motion-hooks t))
+      (goto-char start)
+      (unless (bolp) (forward-line 1))
+      (remove-overlays (point) limit 'nlinum t)
+      (let ((line (nlinum--line-number-at-pos))
+            (fmt (format "%%%dd" nlinum--width)))
+        (while
+            (and (not (eobp)) (< (point) limit)
+                 (let* ((ol (make-overlay (point) (1+ (point))))
+                        (str (format fmt line))
+                        (width (string-width str)))
+                   (when (< nlinum--width width)
+                     (setq nlinum--width width)
+                     (nlinum--new-width))
+                   (overlay-put ol 'nlinum t)
+                   (overlay-put ol 'evaporate t)
+                   (overlay-put ol 'before-string
+                                (propertize " " 'display
+                                            `((margin left-margin)
+                                              ,(propertize str
+                                                           'face 'linum))))
+                   ;; (setq nlinum--ol-counter (1- nlinum--ol-counter))
+                   ;; (when (= nlinum--ol-counter 0)
+                   ;;   (run-with-idle-timer 0.5 nil #'nlinum--flush-overlays
+                   ;;                        (current-buffer)))
+                   (setq line (1+ line))
+                   (zerop (forward-line 1))))))))
+  ;; (setq nlinum--desc (format "-%d" (nlinum--ol-count)))
+  nil)
+                 
+        
+(provide 'nlinum)
+;;; nlinum.el ends here
diff --git a/packages/notes-mode/COPYING b/packages/notes-mode/COPYING
new file mode 100644 (file)
index 0000000..94a9ed0
--- /dev/null
@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    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 <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/packages/notes-mode/HTML/notes-mode.html b/packages/notes-mode/HTML/notes-mode.html
new file mode 100644 (file)
index 0000000..737a88e
--- /dev/null
@@ -0,0 +1,2364 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+<html>
+<!-- Created on April 4, 2012 by texi2html 1.82
+texi2html was written by: 
+            Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+-->
+<head>
+<title>Notes-mode</title>
+
+<meta name="description" content="Notes-mode">
+<meta name="keywords" content="Notes-mode">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="texi2html 1.82">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+blockquote.smallquotation {font-size: smaller}
+pre.display {font-family: serif}
+pre.format {font-family: serif}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+pre.smalldisplay {font-family: serif; font-size: smaller}
+pre.smallexample {font-size: smaller}
+pre.smallformat {font-family: serif; font-size: smaller}
+pre.smalllisp {font-size: smaller}
+span.roman {font-family:serif; font-weight:normal;}
+span.sansserif {font-family:sans-serif; font-weight:normal;}
+ul.toc {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+
+<a name="Top"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h1 class="settitle">Notes-mode</h1>
+
+
+
+
+
+
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top"><a href="#Introduction">1. Introduction</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">                
+</td></tr>
+<tr><td align="left" valign="top"><a href="#Basics">2. Basics</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">                      
+</td></tr>
+<tr><td align="left" valign="top"><a href="#Advanced-Features">3. Advanced Features</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">           
+</td></tr>
+<tr><td align="left" valign="top"><a href="#History">4. History</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">                     
+</td></tr>
+<tr><td align="left" valign="top"><a href="#Installation">5. Installation</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">                
+</td></tr>
+<tr><td align="left" valign="top"><a href="#Keystroke-index">Keystroke index</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">             
+</td></tr>
+<tr><td align="left" valign="top"><a href="#Concept-index">Concept index</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">               
+</td></tr>
+<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment"> &mdash; The Detailed Node Listing &mdash;
+
+Introduction
+
+</pre></th></tr><tr><td align="left" valign="top"><a href="#What-is-it_003f">1.1 What is it?</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">                 
+</td></tr>
+<tr><td align="left" valign="top"><a href="#Why-keep-notes-at-all_003f">1.2 Why keep notes at all?</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">      
+</td></tr>
+<tr><td align="left" valign="top"><a href="#Why-keep-notes-on_002dline_003f">1.3 Why keep notes on-line?</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">     
+</td></tr>
+<tr><td align="left" valign="top"><a href="#Why-use-notes_002dmode_003f">1.4 Why use notes-mode?</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">         
+</td></tr>
+<tr><td align="left" valign="top"><a href="#Y2K-Statement">1.5 Y2K Statement</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">               
+</td></tr>
+<tr><td align="left" valign="top"><a href="#Related-work">1.6 Related work</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">                
+</td></tr>
+<tr><td align="left" valign="top"><a href="#Staying-on-top">1.7 Staying on top</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">              
+</td></tr>
+<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
+Basics
+
+</pre></th></tr><tr><td align="left" valign="top"><a href="#Getting-started">2.1 Getting started</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">             
+</td></tr>
+<tr><td align="left" valign="top"><a href="#A-notes-file">2.2 A notes file</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">                
+</td></tr>
+<tr><td align="left" valign="top"><a href="#The-notes-index">2.3 The notes index</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">             
+</td></tr>
+<tr><td align="left" valign="top"><a href="#The-notes-directories">2.4 The notes directories</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">       
+</td></tr>
+<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
+Advanced Features
+
+</pre></th></tr><tr><td align="left" valign="top"><a href="#Notes-files">3.1 Notes files</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">                 
+</td></tr>
+<tr><td align="left" valign="top"><a href="#Notes-indices">3.2 Notes indices</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">               
+</td></tr>
+<tr><td align="left" valign="top"><a href="#Notes_002dmode-configuration">3.3 Notes-mode configuration</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">    
+</td></tr>
+<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
+Notes files
+
+</pre></th></tr><tr><td align="left" valign="top"><a href="#Getting-around">3.1.1 Getting around</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">              
+</td></tr>
+<tr><td align="left" valign="top"><a href="#Subject-summary">3.1.2 Subject summary</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">             
+</td></tr>
+<tr><td align="left" valign="top"><a href="#Encryption">3.1.3 Encryption</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">                  
+</td></tr>
+<tr><td align="left" valign="top"><a href="#Useful-conventions">3.1.4 Useful conventions</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">          
+</td></tr>
+<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
+History
+
+</pre></th></tr><tr><td align="left" valign="top"><a href="#Notes_002dmode-history">4.1 Notes-mode history</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">          
+</td></tr>
+<tr><td align="left" valign="top"><a href="#Credits">4.2 Credits</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">                     
+</td></tr>
+<tr><td align="left" valign="top"><a href="#Changes">4.3 Changes</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">                     
+</td></tr>
+<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
+</pre></th></tr></table>
+
+
+<hr size="1">
+<a name="Introduction"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Top" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#What-is-it_003f" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[ &lt;&lt; ]</td>
+<td valign="middle" align="left">[<a href="#Top" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#Basics" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Introduction-1"></a>
+<h1 class="chapter">1. Introduction</h1>
+
+<p>What is notes-mode and why should you (perhaps) use it?
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top"><a href="#What-is-it_003f">1.1 What is it?</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">                 
+</td></tr>
+<tr><td align="left" valign="top"><a href="#Why-keep-notes-at-all_003f">1.2 Why keep notes at all?</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">      
+</td></tr>
+<tr><td align="left" valign="top"><a href="#Why-keep-notes-on_002dline_003f">1.3 Why keep notes on-line?</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">     
+</td></tr>
+<tr><td align="left" valign="top"><a href="#Why-use-notes_002dmode_003f">1.4 Why use notes-mode?</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">         
+</td></tr>
+<tr><td align="left" valign="top"><a href="#Y2K-Statement">1.5 Y2K Statement</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">               
+</td></tr>
+<tr><td align="left" valign="top"><a href="#Related-work">1.6 Related work</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">                
+</td></tr>
+<tr><td align="left" valign="top"><a href="#Staying-on-top">1.7 Staying on top</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">              
+</td></tr>
+</table>
+
+<hr size="6">
+<a name="What-is-it_003f"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Introduction" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Why-keep-notes-at-all_003f" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Introduction" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Introduction" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#Basics" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="What-is-it_003f-1"></a>
+<h2 class="section">1.1 What is it?</h2>
+
+<p>Notes-mode is an indexing system for on-line note-taking.
+Notes-mode is composed of two parts, the visible part,
+a major-mode for emacs to aid note-taking;
+and the invisible part,
+scripts which periodically index your notes for you.
+</p>
+<p>Note that notes-mode provides tools to <em>index</em> your notes,
+not to <em>search</em> them.
+(Other existing tools such as &lsquo;<tt>grep</tt>&rsquo;, &lsquo;<tt>agrep</tt>&rsquo;, and &lsquo;<tt>glimpse</tt>&rsquo;
+already allow file search.)
+</p>
+<p>A digression about indexing vs. searching:
+Indexing in this sense means
+organize them according to categories you give,
+while searching looks through all text for arbitrary strings.
+Drawing on the World Wide Web for examples,
+Yahoo (&lsquo;<tt>http://www.yahoo.com/</tt>&rsquo;) is an index,
+while Alta Vista (&lsquo;<tt>http://www.altavista.digital.com/</tt>&rsquo;)
+is a search-engine.
+In (potentially) more familiar terms,
+the yellow pages
+<a name="DOCF1" href="#FOOT1">(1)</a>
+are an index,
+while directory information (411 in the USA)
+is sort of a search-engine.
+</p>
+
+<hr size="6">
+<a name="Why-keep-notes-at-all_003f"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#What-is-it_003f" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Why-keep-notes-on_002dline_003f" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Introduction" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Introduction" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#Basics" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Why-keep-notes-at-all_003f-1"></a>
+<h2 class="section">1.2 Why keep notes at all?</h2>
+
+<p>So why should you use notes-mode?
+Well, first, consider why you should (perhaps)
+keep your notes on line.
+First,
+I assume that you take notes as part of your work or school.
+If you don&rsquo;t,
+you can stop reading now and go back to watching TV.
+</p>
+<p>If you keep notes, ask yourself why you keep them.
+Reasons vary for different people, but some include:
+</p>
+<ul>
+<li>
+To remember what is said or done.
+
+</li><li>
+To focus on what is important about what is said.
+
+</li><li>
+To provide proof of having done something
+at a particular time or date.
+
+</li><li>
+I know there were other reasons here,
+but they slipped my mind.
+</li></ul>
+
+
+<hr size="6">
+<a name="Why-keep-notes-on_002dline_003f"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Why-keep-notes-at-all_003f" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Why-use-notes_002dmode_003f" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Introduction" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Introduction" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#Basics" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Why-keep-notes-on_002dline_003f-1"></a>
+<h2 class="section">1.3 Why keep notes on-line?</h2>
+
+<p>OK, I&rsquo;ve talked you into keeping notes.
+Why do it on-line?
+Again, there are different reasons for different people.
+If you don&rsquo;t want to consider keeping your notes on-line,
+you&rsquo;re welcome to go back to your (clay tablets)
+paper notes.
+</p>
+<p>However, if you do much of your work on-line,
+or if you have portable computer,
+then you might want to consider keeping your notes on-line.
+</p>
+<ul>
+<li>
+It&rsquo;s faster to type than write,
+and possibly more legible at high speed.
+
+</li><li>
+Often information is already on-line.
+For example, in software development, bug reports,
+measurement results, and everything else that&rsquo;s useful
+is on-line.
+
+</li><li>
+You can take down more detail than you otherwise would
+(especially if the data is already on-line).
+Taking more copious notes can be helpful when you go back
+to figure out why that strange thing was happening.
+
+</li><li>
+On-line notes are easy to search.
+Full-text search with 
+grep, agrep, and glimpse are all much faster
+and are often more accurate than paging through paper notes
+looking for a particular keyword.
+
+</li><li>
+On-line notes are easy to index.
+(At least with notes-mode!)
+In addition to full-text search,
+it&rsquo;s helpful to organize notes by category.
+If you keep a table-of-contents of your paper notes,
+you are either extremely fastidious
+or a librarian (Nadia?).
+
+</li><li>
+You can keep all of your notes with you at all times
+(if you have a portable computer).
+Even at a page a day,
+paper notes quickly become bulky and awkward to carry around.
+On-line notes fit on your computer&rsquo;s hard disk,
+an extraordinarily compact medium
+by comparison.
+
+</li><li>
+Your notes can be automatically backed up.
+Paper notes can become damaged with time,
+and as a graduate student
+one of my fears was fire in Boelter Hall
+consuming all my research experiments
+and and therefore hopes of a degree.
+Electronic notes are extremely easy to duplicate
+and can be automatically backed up with the rest of your computer.
+(You <em>do</em> back up your computer, don&rsquo;t you?)
+
+</li></ul>
+
+<p>While these advantages are undoubtedly clear to any
+right-thinking computer user,
+it should be said that there are a few disadvantages 
+for on-line note-taking.
+</p>
+<ul>
+<li>
+If you don&rsquo;t have a computer with you most of the time,
+it&rsquo;s difficult take notes on-line (because you&rsquo;re off-line, of course).
+<a name="DOCF2" href="#FOOT2">(2)</a>
+
+</li><li>
+Computers require power.
+If your portable computer runs out of juice,
+you&rsquo;re on your own.
+Corollary:  watch your power, or bring paper.
+Better corollary:  watch your power, <em>and</em> bring paper.
+
+</li><li>
+Social limitations.
+It&rsquo;s not always socially acceptable to take notes-on-line.
+For example,
+at a party,
+few people would use a computer
+to take down the phone number of a person
+to whom they&rsquo;re attracted
+(at least, if they wanted the attraction to be mutual).
+<a name="DOCF3" href="#FOOT3">(3)</a>
+Sometimes other people find the sound of typing distracting.
+
+</li><li>
+Health issues.
+Repetitive stress injuries do occur
+writing (slower) by hand is at least 
+an alternate motion than typing.
+
+</li><li>
+Legal limitations.
+If you want to use your electronic notes
+to justify a patent or invention,
+you may be breaking legal ground.
+Being on the legal cutting-edge is rarely an easy thing
+for the person involved.<a name="DOCF4" href="#FOOT4">(4)</a>
+
+</li></ul>
+
+
+<hr size="6">
+<a name="Why-use-notes_002dmode_003f"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Why-keep-notes-on_002dline_003f" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Y2K-Statement" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Introduction" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Introduction" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#Basics" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Why-use-notes_002dmode_003f-1"></a>
+<h2 class="section">1.4 Why use notes-mode?</h2>
+
+<p>OK, I&rsquo;ve sold you on note-taking and even on on-line note-taking.
+What about notes-mode?
+Naturally,
+it slices, dices, and makes julienne fries.
+But wait, there&rsquo;s more:
+</p>
+<ul>
+<li>
+It automates indexing your notes,
+linking notes with the same subject together.
+
+</li><li>
+It supports embedded links,
+allowing you to manually link together different topics 
+and external files.
+
+</li><li>
+It includes a number of convenience-features in emacs.
+Subjects can be completed based on existing subjects.
+The usual emacs customization mechanisms are available.
+
+</li><li>
+Notes containing sensitive information can be encrypted.
+
+</li><li>
+Notes-mode seems better than the other, currently available alternatives.
+</li></ul>
+
+<p>What are the alternatives?  I&rsquo;m glad you asked.
+<a name="DOCF5" href="#FOOT5">(5)</a>
+</p>
+<ul>
+<li>
+<strong>HTML</strong>.
+HTML has better formatting capabilities than notes-mode,
+and it has excellent linking capabilities.
+Unfortunately,
+HTML&rsquo;s tags are fairly intrusive
+ (each is at least four characters long and most come with a pair),
+ tags can get confused with normal text,
+ errors in HTML can be bad (obscuring data),
+ and there&rsquo;s no automatic indexing feature
+ (at least with plain HTML).
+Besides,
+ all data should be kept as close to the ASCII from whence it came,
+ as God Intended (hi, Steve).
+
+</li><li>
+<strong>Word Processors</strong>.
+Word processors are strong in the formatting department,
+ but most don&rsquo;t really have linking capabilities,
+ and have poor or restricted indexing.
+
+</li></ul>
+
+<hr size="6">
+<a name="Y2K-Statement"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Why-use-notes_002dmode_003f" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Related-work" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Introduction" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Introduction" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#Basics" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Y2K-Statement-1"></a>
+<h2 class="section">1.5 Y2K Statement</h2>
+
+<p>Notes mode uses dates extensively,
+ both two-digit years and seconds-since-1970.
+However, notes-mode has been coded to function correctly through
+ the year 2038.
+</p>
+<p>To avoid problems with the year 2000, notes-mode assumes
+ that any two-digit years before &ldquo;70&rdquo; are 20xx, not 19xx.
+Notes-mode should therefore work correctly in both the year 1999 and 2000.
+</p>
+<p>(Notes-mode 1.17 released February 1999 fixes a lingering Y2K problem.)
+</p>
+<p>Because notes-mode uses seconds-since-1970 for some date calculations
+ it will fail beyond the year 2038 on computers with 32-bit integers.
+</p>
+<p>If I&rsquo;m still using notes-mode then on a 32-bit machine I&rsquo;ll see what I can do.
+</p>
+
+<hr size="6">
+<a name="Related-work"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Y2K-Statement" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Staying-on-top" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Introduction" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Introduction" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#Basics" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Related-work-1"></a>
+<h2 class="section">1.6 Related work</h2>
+
+<p>What would a document be without related work?
+</p>
+<p>Notes-mode is not related in any way to Lotus Notes.
+</p>
+<p>I am told (by David Weisman)
+ that it&rsquo;s something like the now defunct Lotus Agenda.
+</p>
+<p>Ashvin Goel, one of the contributors to notes-mode,
+ has gone off and done a from-scratch reimplementation
+ called records-mode.
+It&rsquo;s very similar to notes mode,
+ and emphasizes on-the-fly updates to entry links
+ but lacks a manual.
+You may want to check it out at
+ &lsquo;<tt>http://www.cse.ogi.edu/~ashvin/software.html</tt>&rsquo;.
+</p>
+<p>Hyperbole (by Bob Weiner) offers better linking facilities
+than notes-mode, but it has a bunch of stuff notes-mode doesn&rsquo;t need
+and it&rsquo;s missing notes-specific indexing provided by notes-mode.
+For people already using Hyperbole
+ it would be interesting to replace notes-mode&rsquo;s linking
+ with Hyperbole&rsquo;s.
+Contributions in this area are welcome, provided they make Hyperbole
+ optional.
+</p>
+<hr size="6">
+<a name="Staying-on-top"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Related-work" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Basics" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Introduction" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Introduction" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#Basics" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Staying-on-top-1"></a>
+<h2 class="section">1.7 Staying on top</h2>
+
+<p>The most recent distribution of notes-mode 
+ is always available via
+ &lsquo;<tt>http://www.isi.edu/~johnh/SOFTWARE/NOTES_MODE/</tt>&rsquo;.
+</p>
+<p>After you&rsquo;ve installed notes mode you&rsquo;re encouraged to subscribe
+to the mailing lists.
+To subscribe, go to the web page
+Send the message &quot;subscribe&quot; to
+&lsquo;<tt>http://www.heidemann.la.ca.us/mailman/listinfo/notes-mode-announce</tt>&rsquo; or
+&lsquo;<tt>http://www.heidemann.la.ca.us/mailman/listinfo/notes-mode-talk</tt>&rsquo;.
+</p>
+<p>The announce list will contain only release announcements
+and so is guaranteed to be very low bandwidth.
+</p>
+
+
+<hr size="6">
+<a name="Basics"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Staying-on-top" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Getting-started" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Introduction" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Top" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#Advanced-Features" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Basics-1"></a>
+<h1 class="chapter">2. Basics</h1>
+
+<p>All you need to use notes-mode
+ in a chapter.
+(Except for installation, See section <a href="#Installation">Installation</a>.)
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top"><a href="#Getting-started">2.1 Getting started</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">             
+</td></tr>
+<tr><td align="left" valign="top"><a href="#A-notes-file">2.2 A notes file</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">                
+</td></tr>
+<tr><td align="left" valign="top"><a href="#The-notes-index">2.3 The notes index</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">             
+</td></tr>
+<tr><td align="left" valign="top"><a href="#The-notes-directories">2.4 The notes directories</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">       
+</td></tr>
+</table>
+
+<hr size="6">
+<a name="Getting-started"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Basics" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#A-notes-file" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Basics" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Basics" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#Advanced-Features" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Getting-started-1"></a>
+<h2 class="section">2.1 Getting started</h2>
+<a name="index-notesinit"></a>
+<a name="index-setup"></a>
+
+<p>To get started with notes-mode,
+ read the introduction this chapter,
+ then either:
+</p>
+<ul>
+<li>
+Start emacs, do 
+ <kbd>M-x</kbd> <code>load-library</code> <kbd>RET</kbd> <code>notes-mode</code> <kbd>RET</kbd>
+This approach will set up notes-mode with the default parameters.
+
+</li><li>
+OR, from the shell, 
+ run the program &lsquo;<tt>notesinit</tt>&rsquo;.
+This approach will ask you some questions about how you want to configure
+ notes mode.
+
+</li></ul>
+
+<p>Either way these should set up everything notes-mode needs.
+This program will modify your environment (as described in this section),
+ or it will give you the exact commands you should run yourself.
+</p>
+<p>After you&rsquo;ve done one of these,
+ start up emacs and note-away.
+I usually begin a
+ day of note-taking by running the command
+ <kbd>M-x</kbd> <code>notes-index-todays-link</code>
+ to jump directly to today&rsquo;s note.
+You may even wish to bind this to something,
+ perhaps with
+ <code>(define-key global-map &quot;\C-cn&quot; 'notes-index-todays-link)</code>
+ in your &lsquo;<tt>.emacs</tt>&rsquo;. 
+</p>
+<p>If you want to browse your existing notes,
+ you might instead want to edit the
+ &lsquo;<tt>~/NOTES/index</tt>&rsquo;.
+(What is a notes file and the index? Hurry up and finish
+ reading this chapter.) 
+</p>
+
+<hr size="6">
+<a name="A-notes-file"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Getting-started" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#The-notes-index" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Basics" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Basics" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#Advanced-Features" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="A-notes-file-1"></a>
+<h2 class="section">2.2 A notes file</h2>
+
+<a name="index-Notes-files"></a>
+
+<p>The notes file is the focus of most of the activity in notes-mode,
+ it&rsquo;s where you take your notes.
+Notes files are mostly free-form text
+ broken up into <em>entries</em>.
+Here&rsquo;s an example:
+</p>
+<a name="index-Notes-entries"></a>
+
+<table><tr><td>&nbsp;</td><td><pre class="example">8-Jun-95 Thursday
+-----------------
+
+* Today
+-------
+prev: &lt;none&gt;
+next: &lt;file:///~/NOTES/199506/950609#* Today&gt;
+
+next week - release notes-mode
+
+
+* Environment/notes
+-------------------
+
+I explained notes mode to Ashvin and Geoff.
+...
+</pre></td></tr></table>
+
+<p>Each entry has a subject-block, (maybe) some links, and then (maybe) some text.
+</p>
+<p>The subject-block must begin with an asterisk-space (<kbd>* </kbd>)
+ at the beginning of a line, followed by the subject itself.
+Subjects must be underlined with a row of dashes
+ (if they&rsquo;re not exact, that&rsquo;s OK;
+ notes-mode will fix them periodically).
+For convenience,
+ notes-mode will automatically add the underlines when you
+ hit <kbd>&lt;RTN&gt;</kbd> (<code>notes-electric-return</code>),
+ and <kbd>&lt;TAB&gt;</kbd> on a partially completed subject will
+ invoke completion based on indexed subjects (<code>notes-complete-subject</code>).
+<a name="index-Notes-subjects"></a>
+<a name="index-RTN"></a>
+<a name="index-TAB"></a>
+</p>
+<p>Following the subject may be links.
+(In the example, the &ldquo;Today&rdquo; entry has links,
+ the &ldquo;Environment/notes&rdquo; entry doesn&rsquo;t.)
+These links will be automatically updated by notes-mode
+ when your notes are re-indexed;
+ just leave a blank line when writing the note.
+<a name="index-Notes-links"></a>
+</p>
+<p>Links are made with pseudo-URLs,
+ sort of like those in the World Wide Web. 
+Any of these URLs can be followed in notes-mode files
+ by clicking <kbd>S-mouse-2</kbd> on the pseudo-URL
+ (<code>notes-w3-follow-link-mouse</code>).
+<a name="index-Pseudo_002dURLs"></a>
+<a name="index-URLs"></a>
+<a name="index-S_002dmouse_002d2"></a>
+</p>
+<p>Finally comes the text.
+Go wild, but just don&rsquo;t include text that looks like a subject.
+You can embed pseudo-URLs to link notes together manually.
+</p>
+<p>The more anal of you may have noticed
+ that the lines before the first subject
+ are not part of any entry.
+These lines are
+ <em>front matter</em>.
+They&rsquo;re not usually used for much,
+ but they can be a good place to label the file.
+<a name="index-Notes-files_002c-font-matter"></a>
+<a name="index-Font-matter"></a>
+</p>
+<p>There are a number of useful conventions
+ that can be adopted to organize your notes.
+The most common is the &ldquo;Today&rdquo; entry.
+If you keep an entry with the same subject
+ at the beginning of each file,
+ you link all of your notes together.
+Notes-mode will help you out with some of these convetions
+ by automatically creating or copying some fields for you;
+ see see section <a href="#Useful-conventions">Useful conventions</a> for details.
+</p>
+<p>Finally, notes-mode can also work with outline-minor-mode
+ (thanks to Tim Carroll for pointing this out).
+Outline-mode supports hiding and revealing text and other helpful
+ features beyond the scope of this document.
+See <a href="emacs.html#Outline-Mode">Outline Mode: (emacs)Outline Mode</a> section &lsquo;Outline Mode&rsquo; in <cite>The Emacs Editor</cite>, for details.
+</p>
+<hr size="6">
+<a name="The-notes-index"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#A-notes-file" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#The-notes-directories" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Basics" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Basics" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#Advanced-Features" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="The-notes-index-1"></a>
+<h2 class="section">2.3 The notes index</h2>
+
+<a name="index-Notes-index"></a>
+
+<p>The notes index lists all subjects you&rsquo;ve kept notes about,
+ and each date of each note.
+Impress your friends,
+ show your advisor why you&rsquo;re worth the <em>big</em> peanuts,
+ you&rsquo;ll soon have the biggest index of all.
+</p>
+<p>The index has one line per subject, listing the subject
+ and each day a note was made about that subject.
+For example:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example">Bicycle: 950314, 950316
+Bicycle/maintenance/books: 951028
+Bridge/hands: 951113, 951114, 951116, 951117
+Bridge/UCLA: 960222, 960409
+</pre></td></tr></table>
+
+<p>Clicking on any of the dates with <kbd>mouse-2</kbd>
+ will take you to that note
+ (<code>notes-index-mouse-follow-link</code>).
+(You can also move the point over the date and hit <kbd>&lt;RTN&gt;</kbd>
+ if you&rsquo;re musaphobic [<code>notes-index-follow-link</code>].)
+<a name="index-mouse_002d2"></a>
+<a name="index-RTN-1"></a>
+</p>
+<p>The notes index is automatically updated by the program &lsquo;<tt>mkall</tt>&rsquo;.
+Typically &lsquo;<tt>mkall</tt>&rsquo; is run nightly by &lsquo;<tt>cron</tt>&rsquo;.
+On most modern versions of Unix, you can add this command to cron by
+ running &lsquo;<tt>crontab -e</tt>&rsquo; and adding the line:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example">0 4 * * * /usr/local/lib/notes-mode/mkall
+</pre></td></tr></table>
+<a name="index-Crontab"></a>
+<a name="index-mkall"></a>
+<a name="index-re_002dindexing"></a>
+
+<p>(Assuming that your notes programs are installed
+ in /usr/local/lib/notes-mode, the default location.)
+</p>
+
+<hr size="6">
+<a name="The-notes-directories"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#The-notes-index" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Advanced-Features" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Basics" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Basics" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#Advanced-Features" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="The-notes-directories-1"></a>
+<h2 class="section">2.4 The notes directories</h2>
+
+<a name="index-Notes-directories"></a>
+<a name="index-Directory-hierarchy"></a>
+
+<p>The final thing needed to tie basic notes-mode together his how
+the pieces fit together.
+Since my graduate work is in file systems,
+you can bet that directories are involved.
+</p>
+<p>Notes-mode keeps its files in a two-level hierarchy:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example">~/NOTES
+~/NOTES/index
+~/NOTES/rawindex
+~/NOTES/199603
+~/NOTES/199603/960329
+~/NOTES/199603/960330
+~/NOTES/199604
+~/NOTES/199604/960401
+</pre></td></tr></table>
+
+<p>The top level, &lsquo;<tt>~/NOTES</tt>&rsquo;, is the notes directory.
+It keeps all notes in one place.
+(The name of this directory is configurable, See section <a href="#Notes_002dmode-configuration">Notes-mode configuration</a>.)
+</p>
+<p>Inside the notes directory are two files and a number of directories.
+The files are &lsquo;<tt>index</tt>&rsquo;,
+ the index of all entries (see section <a href="#The-notes-index">The notes index</a>),
+ and &lsquo;<tt>rawindex</tt>&rsquo;,
+ used internally.
+<a name="index-Root-directory"></a>
+</p>
+<p>The notes directory also contains a number of subdirectories,
+ sometimes called <em>intermediate directories</em>.
+These directories group the actual notes files into manageable chunks,
+ keeping any directory from getting too large.
+Intermediate directories are named
+ by the four-digit year and the two-digit month
+ of the entries they contain.
+(The format of intermediate directories
+ is configurable, See section <a href="#Notes_002dmode-configuration">Notes-mode configuration</a>.)
+<a name="index-Intermediate-directories"></a>
+</p>
+<p>Finally,
+ each intermediate directory are the notes files themselves,
+ named according to the two-digit year, month, and day-of-month.
+<a name="index-Notes-files-1"></a>
+</p>
+<p>For the most part,
+ notes-mode will automatically maintain this organization of files,
+ once you create the top-level directory.
+Notes-mode will also automatically insure
+ that all files in the notes directory are unreadable by
+ anyone other than their owner.
+Notes are personal things.
+(This behavior is not currently configurable,
+ but it probably should be.)
+<a name="index-Notes-file-permissions"></a>
+</p>
+
+
+<hr size="6">
+<a name="Advanced-Features"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#The-notes-directories" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Notes-files" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Basics" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Top" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#History" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Advanced-Features-1"></a>
+<h1 class="chapter">3. Advanced Features</h1>
+
+<p>Notes-mode, the minutiae, and some other good stuff.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top"><a href="#Notes-files">3.1 Notes files</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">                 
+</td></tr>
+<tr><td align="left" valign="top"><a href="#Notes-indices">3.2 Notes indices</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">               
+</td></tr>
+<tr><td align="left" valign="top"><a href="#Notes_002dmode-configuration">3.3 Notes-mode configuration</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">    
+</td></tr>
+</table>
+
+<hr size="6">
+<a name="Notes-files"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Advanced-Features" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Getting-around" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Advanced-Features" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Advanced-Features" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#History" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Notes-files-1"></a>
+<h2 class="section">3.1 Notes files</h2>
+
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top"><a href="#Getting-around">3.1.1 Getting around</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">              
+</td></tr>
+<tr><td align="left" valign="top"><a href="#Subject-summary">3.1.2 Subject summary</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">             
+</td></tr>
+<tr><td align="left" valign="top"><a href="#Encryption">3.1.3 Encryption</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">                  
+</td></tr>
+<tr><td align="left" valign="top"><a href="#Useful-conventions">3.1.4 Useful conventions</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">          
+</td></tr>
+</table>
+
+<hr size="6">
+<a name="Getting-around"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Notes-files" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Subject-summary" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Advanced-Features" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Notes-files" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#History" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Getting-around-1"></a>
+<h3 class="subsection">3.1.1 Getting around</h3>
+
+<p>Moving between notes entries and around the hierarchy is fairly common,
+ so there are some accelerators.
+</p>
+<dl compact="compact">
+<dt> <kbd>C-c C-i</kbd></dt>
+<dd><p>Jump to the index entry for the current entry&rsquo;s subject
+(<code>notes-goto-index-entry</code>).
+<a name="index-C_002dc-C_002di"></a>
+</p>
+</dd>
+<dt> <kbd>C-c C-n</kbd></dt>
+<dt> <kbd>C-c C-p</kbd></dt>
+<dd><p>Move to the next or prior note with the same subject
+(<code>notes-follow-next-link</code> and <code>notes-follow-prev-link</code>).
+These functions follow the links in the note,
+ if they&rsquo;re defined.
+If not,
+ they look through the index file.
+This approach usually works,
+ but will fail if there are multiple new entries created
+ with the given subject
+ between when the index is recomputed.
+<a name="index-C_002dc-C_002dn"></a>
+<a name="index-C_002dc-C_002dp"></a>
+</p>
+</dd>
+<dt> <kbd>C-c&lt;RTN&gt;</kbd></dt>
+<dd><p>Follow the link under the point
+(<code>notes-w3-follow-link</code>),
+ a keyboard equivalent of &lt;S-mouse-2&gt;.
+<a name="index-C_002dcRTN"></a>
+</p>
+</dd>
+<dt> <kbd>M-C-a</kbd></dt>
+<dt> <kbd>M-C-e</kbd></dt>
+<dd><p>Jump to the beginning or end of the current note entry
+(<code>notes-beginning-of-defun</code> and <code>notes-end-of-defun</code>).
+<a name="index-M_002dC_002da"></a>
+<a name="index-M_002dC_002de"></a>
+</p>
+</dd>
+<dt> <kbd>C-c C-k</kbd></dt>
+<dd><p>Copies the pseudo-URL for the current note into the kill-ring
+(<code>current-url-as-kill</code>).
+To link two entries, go to the target,
+ grab its URL with <kbd>C-c C-k</kbd>,
+ go to where you want to make the link,
+ and yank the URL with <kbd>C-y</kbd>.
+<a name="index-C_002dc-C_002dk"></a>
+</p>
+</dd>
+</dl>
+
+
+<p>Notes mode supports imenu,
+ if you have it bound to something
+ (I use <code>(global-set-key [down-mouse-3] 'imenu)</code>).
+<a name="index-imenu"></a>
+</p>
+
+<hr size="6">
+<a name="Subject-summary"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Getting-around" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Encryption" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Advanced-Features" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Notes-files" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#History" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Subject-summary-1"></a>
+<h3 class="subsection">3.1.2 Subject summary</h3>
+
+<p>It&rsquo;s often helpful to look at all
+ entries for a given subject
+<kbd>C-c C-s</kbd>
+ collects all entries with the subject of the current
+ entry in a new buffer
+ (<code>notes-summarize-subject</code>).
+<a name="index-C_002dc-C_002ds"></a>
+<a name="index-Subject-summary"></a>
+</p>
+
+<hr size="6">
+<a name="Encryption"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Subject-summary" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Useful-conventions" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Advanced-Features" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Notes-files" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#History" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Encryption-1"></a>
+<h3 class="subsection">3.1.3 Encryption</h3>
+
+<a name="index-Encryption"></a>
+<a name="index-Decryption"></a>
+
+<p>Notes occasionally contain private material.
+While Unix has strong services for file protection
+ (compared to other, say, more wide-selling operating systems),
+ in many systems root passwords are shared,
+ while other systems are vulnerable to physical compromise.
+In such systems,
+ properly used encryption is the best approach to security.
+</p>
+<p>Notes-mode encryption is based
+ Phill Zimmerman&rsquo;s PGP (Pretty Good Privacy)
+(see &lsquo;<tt>http://www.mantis.co.uk/pgp/pgp.html</tt>&rsquo;)
+ and either
+ with Rick Campbell&rsquo;s
+ emacs interface, PAM (PGP Augmented Messaging)
+(from &lsquo;<tt>ftp://h.gp.cs.cmu.edu/usr/rfb/pam/</tt>&rsquo;)
+ (note that as of January 1997, PAM is no longer at this ftp site
+ and appears to not be publicly available),
+ or LoPresti and Choi&rsquo;s mailcrypt
+(from &lsquo;<tt>http://cag-www.lcs.mit.edu/mailcrypt/</tt>&rsquo;).
+<a name="index-PGP"></a>
+<a name="index-Pretty-good-privacy"></a>
+<a name="index-PAM"></a>
+<a name="index-PGP-Augmented-Messaging"></a>
+<a name="index-mailcrypt"></a>
+</p>
+<dl compact="compact">
+<dt> <kbd>C-c C-e</kbd></dt>
+<dd><p>Encrypt the current note
+(<code>notes-encrypt-note</code>).
+By default this function encrypts the whole entry.
+With a prefix argument,
+ only the part from the point to the end of the entry is encrypted.
+<a name="index-C_002dc-C_002de"></a>
+</p>
+</dd>
+<dt> <kbd>C-c C-d</kbd></dt>
+<dd><p>Decrypt the current note
+(<code>notes-decrypt-note</code>).
+</p></dd>
+</dl>
+<a name="index-C_002dc-C_002dd"></a>
+
+<p>By default notes-mode determines your public key by looking 
+ up your <code>user-full-name</code> in your PGP keyring.
+You can override this default by setting
+ <code>notes-encryption-key-id</code>
+ to the desired key-id.
+<a name="index-key_002did"></a>
+</p>
+
+<hr size="6">
+<a name="Useful-conventions"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Encryption" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Notes-indices" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Advanced-Features" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Notes-files" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#History" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Useful-conventions-1"></a>
+<h3 class="subsection">3.1.4 Useful conventions</h3>
+
+
+<a name="index-conventions"></a>
+<a name="index-mknew"></a>
+
+<p>There are a number of conventions which can make notes-mode
+ easier to use.
+These conventions are a matter of personal taste,
+ of course.
+Do what works for you.
+</p>
+<p>First,
+ I find it helpful to keep the date of each notes-file at the top
+ of the file.
+This makes the file self-identifying
+ if the filename is lost.
+</p>
+<p>Second,
+ I find it useful to have the first entry of each file
+ have the same subject (perhaps &ldquo;Today&rdquo;).
+This entry then links all notes together,
+ making it easy to go to yesterday and tomorrow.
+I keep a to-do list on this entry,
+ bringing the list forward each day.
+<a name="index-Today"></a>
+</p>
+<p>A third useful convention is to keep an
+ entry with the name based on the day of the week
+ in each file.
+Analogous to &ldquo;Today&rdquo;, this entry links together
+ weeks.
+</p>
+<p>Notes-mode supports these conventions.
+When you make a new notes-file in emacs,
+ notes-mode searches for the preceding file.
+If it follows any of these conventions,
+ the new file is initialized appropriately.
+Currently
+ the approach to do this process
+ (in the program &lsquo;<tt>mknew</tt>&rsquo;)
+ is fairly sensitive,
+ so it may not work in all cases.
+In particular,
+ the date convention works only on
+ for English-language dates.
+(If you use notes-mode with a non-English language,
+ let me know and I&rsquo;ll work with you to fix this limitation.)
+</p>
+<p>If you find other helpful conventions,
+ please let me know.
+Modifications to &lsquo;<tt>mknew</tt>&rsquo; to implement
+ new conventions are also invited.
+</p>
+<p>If you don&rsquo;t want to use these conventions,
+ or if you want to use different ones,
+ set the emacs variable notes-mode-initialization-program
+ to nil or the name of your initialization program.
+<a name="index-notes_002dmode_002dinitialization_002dprogram"></a>
+</p>
+
+<hr size="6">
+<a name="Notes-indices"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Useful-conventions" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Notes_002dmode-configuration" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Advanced-Features" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Advanced-Features" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#History" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Notes-indices-1"></a>
+<h2 class="section">3.2 Notes indices</h2>
+
+
+<p>Only two features of notes index mode haven&rsquo;t yet been described.
+First,
+ you can open any notes-file based on date
+ with <code>notes-index-link</code>,
+ normally bound to &lt;o&gt;.
+<a name="index-o"></a>
+</p>
+<p>Second,
+ you can get a subject-summary
+ with &lt;C-c C-s&gt;
+ (see section <a href="#Subject-summary">Subject summary</a>).
+The subject defaults to that of the current index line.
+<a name="index-C_002dc-C_002ds-1"></a>
+</p>
+
+<hr size="6">
+<a name="Notes_002dmode-configuration"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Notes-indices" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#History" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Advanced-Features" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Advanced-Features" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#History" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Notes_002dmode-configuration-1"></a>
+<h2 class="section">3.3 Notes-mode configuration</h2>
+
+<a name="index-configuration"></a>
+<a name="index-_002enotesrc"></a>
+
+<p>Several aspects of notes mode are particularly visible
+ to the user.
+Because I&rsquo;m not a fascist,
+ a user can change most of these.
+</p>
+<p>Preferences are specified in &lsquo;<tt>~/.notesrc</tt>&rsquo;.
+This file lists things to change:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"># lines beginning with a hash are comments
+dir: ~/NOTES
+int_form: %Y%m
+</pre></td></tr></table>
+
+<p>Currently, two things can be changed:
+</p>
+<dl compact="compact">
+<dt> <code>dir</code></dt>
+<dd><p>Specifies the root of the notes directory hierarchy
+ (see section <a href="#The-notes-directories">The notes directories</a>).
+</p>
+</dd>
+<dt> <code>int_form</code></dt>
+<dd><p>Specifies the form of the intermediate directory.
+A limited subset of <code>strftime(3)</code>
+ formatting is allowed.
+</p></dd>
+</dl>
+
+<p>The subset of <code>strftime(3)</code> supported in <code>int_form</code> is:
+</p><dl compact="compact">
+<dt> <code>%Y</code></dt>
+<dd><p>The four-digit year.
+</p>
+</dd>
+<dt> <code>%y</code></dt>
+<dd><p>The two-digit year.
+</p>
+</dd>
+<dt> <code>%m</code></dt>
+<dd><p>A two-digit numeric month.
+</p>
+</dd>
+<dt> <code>%d</code></dt>
+<dd><p>A two-digit day.
+</p></dd>
+</dl>
+
+<p>In addition to &lsquo;<tt>.notesrc</tt>&rsquo;,
+ there are a number of emacs-specific variables.
+These variables are documented in the file
+ &lsquo;<tt>notes-variables.el</tt>&rsquo;.
+</p>
+
+
+
+<hr size="6">
+<a name="History"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Notes_002dmode-configuration" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Notes_002dmode-history" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Advanced-Features" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Top" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#Installation" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="History-1"></a>
+<h1 class="chapter">4. History</h1>
+
+<p>More about notes-mode than you wanted to know,
+and some thanks.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top"><a href="#Notes_002dmode-history">4.1 Notes-mode history</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">          
+</td></tr>
+<tr><td align="left" valign="top"><a href="#Credits">4.2 Credits</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">                     
+</td></tr>
+<tr><td align="left" valign="top"><a href="#Changes">4.3 Changes</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">                     
+</td></tr>
+<tr><td align="left" valign="top"><a href="#Suggested-features">4.4 Suggested features</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">                     
+</td></tr>
+</table>
+
+
+
+<hr size="6">
+<a name="Notes_002dmode-history"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#History" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Credits" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#History" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#History" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#Installation" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Notes_002dmode-history-1"></a>
+<h2 class="section">4.1 Notes-mode history</h2>
+
+<p>Briefly,
+ I started keeping notes on-line shortly after I got a portable computer
+ in January, 1994.
+After a month-and-a-half of notes, I realized that
+ one does not live by grep alone,
+ so I started adding indexing facilities.
+</p>
+<p>In June of 1995
+ some other Ficus-project members started
+ keeping and indexing on-line notes
+ using other home-grown systems.
+After some discussion,
+ we generalized my notes-mode work and
+ they started using it.
+</p>
+<p>Over the next 18 months notes-mode grew.
+Finally, in April, 1996 I wrote documentation,
+ guaranteeing that innovation on notes-mode will now cease
+ or the documentation will become out of date.
+</p>
+
+<hr size="6">
+<a name="Credits"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Notes_002dmode-history" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Changes" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#History" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#History" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#Installation" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Credits-1"></a>
+<h2 class="section">4.2 Credits</h2>
+
+<p>I (John Heidemann, &lt;johnh@isi.edu&gt;)
+ started, documented, and currently maintain notes-mode.
+I take ultimate responsibility for the code,
+ especially for the ugly parts that I won&rsquo;t let others change.
+</p>
+<p>Ashvin Goel
+ &lt;ashvin@ficus.cs.ucla.edu&gt;
+ has been a very enthusiastic notes-mode user and contributor.
+He is responsible for at least
+ the ideas behind <code>notes-summarize-subject</code>
+and the ideas and initial implementations of
+ some of the original generalization and modularity improvements,
+ <code>notes-follow-next-link</code> and <code>notes-follow-prev-link</code>,
+ <code>notes-goto-index-entry</code>,
+ programmed subject completion,
+ and
+ context-sensitive mouse-2 handling.
+In addition,
+ he is an invaluable second opinion about
+ what and how things should be done
+ (even if I don&rsquo;t always agree with him).
+</p>
+<p>Geoff Kuenning
+ &lt;geoff@ficus.cs.ucla.edu&gt;
+ has been another enthusiastic notes-mode user and victim.
+He is responsible for
+ finding several bugs,
+ motivation for mouse-less operation,
+ comments about the documentation,
+ the day-of-week convention,
+ and an initial implementation and the idea of
+ multiple entries with the same subjects in a single notes-file.
+</p>
+<p>Ramesh Govindan &lt;govindan@isi.edu&gt; did the xemacs port.
+</p>
+<p>Since it&rsquo;s release on Usenet in April 1996 several
+ other folks have contributed.
+Thanks to
+ David Weisman &lt;weisman@app1.osf.org&gt;,
+ Martin L. Smith &lt;martin@ner.com&gt;,
+ Jason Bastek &lt;jason@aai.com&gt;,
+ Ulrich Herbst &lt;Ulrich.Herbst@t-systems.com&gt;.
+See the next section (See section <a href="#Changes">Changes</a>.) for details of their exploits.
+</p>
+<p>Thanks to Larry Ayers &lt;layers@marktwain.net&gt;
+ for popularizing notes-mode with reviews in
+ the Linux Gazette
+ (at &lt;http://www.linuxgazette.com/issue22/notes-mode.html&gt; and
+ &lt;http://www.linuxgazette.com/issue35/ayers.html&gt;).
+</p>
+<hr size="6">
+<a name="Changes"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Credits" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Suggested-features" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#History" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#History" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#Installation" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Changes-1"></a>
+<h2 class="section">4.3 Changes</h2>
+
+<p>For the bored:
+</p>
+<p>First semi-public release. 12-Jul-95: version 0.1
+ Shared a version with Ashvin and Geoff.
+</p>
+<p>Changed  6-Dec-95: version 0.3
+ Ashvin&rsquo;s changes for note traversal added (C-c C-p and C-c C-n now
+move to the prev/next note in note-mode).
+ URL parsing changed so that &quot;localhost&quot; is optional.
+</p>
+<p>Changed 19-Dec-95:  version 0.4
+ More robust prev/next code added, both to handle going back and
+forward in the middle of chains through the index file, and to handle
+back/forward in a single file.
+ URL parsing changed so that notes-goto-index-entry correctly handles
+lookups on notes names such as &quot;252A&quot;.
+</p>
+<p>Changed 20-Dec-95: version 0.5.
+ Fixed a missing variable in notes-url.el.
+ Added a work-around to a bug in emacs-19.30&rsquo;s define-derived-mode.
+</p>
+<p>Changed 24-Dec-95: version 0.6.
+ Prev/next code re-re-written to be more robust.
+</p>
+<p>Changed 26-Dec-96:  version 0.7.
+ Bug fix release.
+</p>
+<p>Changed 23-Jan-96: version 0.8.
+ Initialization code added to set up a new note.
+New variable:  notes-bin-dir.
+</p>
+<p> I&rsquo;m skipping version 0.9 because I erroneously release version 0.1
+as version 0.9 (only on the web, not on Usenet).
+</p>
+<p> I&rsquo;m bumping from version &quot;0&quot; to version &quot;1&quot; since the code is has been
+in production use for more than a year by several people.  Minor
+numbers are the same.
+</p>
+<p>Changed 26-Mar-96: version 1.10.
+ Setup code completely re-written.
+ Several incompatible changes have been made:
+ - the lisp and Perl code must be installed via make install,
+not by copying.
+ - some data is specified in a .notesrc file; copy and modify sample.notesrc.
+ - several internal elisp changes.
+ - catsubject added (bound to C-cC-s):  collect all notes about the
+current subject.
+ - new notes-files are initialized with fields based on the prior
+day&rsquo;s notes; see mknew for details.
+ - daily_work is gone; mkall is rewritten to use .notesrc.
+</p>
+<p>Changed 29-Apr-96: version 1.11.
+ Real documentation.
+ Mknew caching added.
+</p>
+<p>Changed  9-Aug-96: version 1.12.
+ Added notesinit to do all setup for new users.
+</p>
+<p>Changed 24-Aug-96: version 1.13.
+ Minor documentation fixes.
+</p>
+<p>Changed 20-Dec-97: version 1.14.
+Autoconf support.
+</p>
+<p>Fontification of the index buffer is now pre-computed in perl
+other than done when the file is needed (in elisp with slow regular
+expressions).  2000-line index files are now 1-2 seconds rather than
+15-30 on a 100MHz Pentium.  If necessary (the
+pre-computed version isn&rsquo;t up-to-date) we fall back on the slower
+code.
+</p>
+<p>Related work improved (suggestion by David Weisman &lt;weisman@app1.osf.org&gt;).
+</p>
+<p>Documentation improvement (problem found by Martin L. Smith
+&lt;martin@ner.com&gt;).
+</p>
+<p>Installation improved (code by Jason Bastek &lt;jason@aai.com&gt;).
+</p>
+<p>Bug in notes-index mode with subjects containing colons fixed (johnh).
+</p>
+<p>Encryption now supports mailcrypt.el.
+</p>
+<p>Support for emacs 20 (a small font-lock change).
+</p>
+<p>Changed  5-Jan-98: version 1.15.
+Bug in decryption for non-PAM users fixed
+ (suggestion by Kevin Davidson &lt;tkld@quadstone.com&gt;).
+</p>
+<p>Y2K statement added
+ (suggestion by Kevin Davidson &lt;tkld@quadstone.com&gt;).
+</p>
+<p>Pointer to mailcrypt added (as a supported encryption package).
+Problem pointed out by K. Ueda &lt;kueda@jupiter.qse.tohoku.ac.jp&gt;.
+</p>
+<p>Changed  4-Nov-98: version 1.16.
+Bug in kill-ring handling of notes-old-underline-line
+ fixed by Tim Potter &lt;timp@jna.com.au&gt;.
+Bug in whitespace handling after PGP encryption fixed by Tim Potter.
+Bugs in handling of entries with hash signs in their name fixed
+ (found by Tim Potter).
+Fontification of index buffer further improved
+ (mapcar is your friend).
+Xemacs support added based on code contributed by Ramesh Govindan.
+</p>
+<p>Changed 28-Feb-99: version 1.17:
+Improvement:  notes-electric-return now fixes up the prev/next links
+ of new entries (only).  Code contributed by
+ Takashi Nishimoto.
+</p>
+<p>Bug fix:  reversed options -batch and -q in configure.in to placate
+ XEmacs 20.0; changed notesinit to not downcase the pathname
+ (bugs found by Thierry Bezecourt).
+</p>
+<p>Clarification: Autofilling of new notes more clear in the manual (hopefully,
+ suggested by Solofo Ramangalahy).
+</p>
+<p>Bug fix:  a y2k bug in was found and fixed in mkindex.  Sigh.
+</p>
+<p>New:  Two mailing lists for notes-mode have been created:
+&lsquo;<tt>notes-mode-announce@heidemann.la.ca.us</tt>&rsquo; and 
+&lsquo;<tt>notes-mode-talk@heidemann.la.ca.us</tt>&rsquo;.
+Send the line &ldquo;subscribe notes-mode-announce&rdquo;
+(or &ldquo;subscribe notes-mode-talk&rdquo;)
+to &lsquo;<tt>majordomo@heidemann.la.ca.us</tt>&rsquo;
+to join them.
+[<em>These instructions are now superceeded; to subscribe, go to
+&lsquo;<tt>http://www.heidemann.la.ca.us/mailman/listinfo/notes-mode-talk</tt>&rsquo;
+and
+&lsquo;<tt>http://www.heidemann.la.ca.us/mailman/listinfo/notes-mode-announce</tt>&rsquo;.</em>]
+</p>
+<p>Changed  6-Oct-99: version 1.18:
+Bug fix:  handling of electric-prevnext is better when there are
+ existing prev/next links.
+</p> 
+<p>Clarification: I added some pointers in the code to the installation
+ instructions.  (Apparently people can&rsquo;t RTF README.)
+</p>
+<p>Extension: mailcrypt-3.5.x suported including pgp, pgp5 and gpg.
+</p>
+<p>Changed (date 23-Dec-00): version 1.19:
+Bug fix (cosmetic): suppress comments in encrypted nodes.
+</p>
+<p>Install fixes from Kannan Varadhan: elisp directories changed on install.
+</p>
+<p>Added C-j as a synonym for RET in notes-mode to parallel C++ or perl mode.
+(Suggested by Fred Jaggi &lsquo;<tt>jaggi@rsn.hp.com</tt>&rsquo;.)
+</p>
+<p>Outline-minor-mode support added and documented.
+(Suggested by Tim Carroll &lsquo;<tt>tim@boomboom.com</tt>&rsquo;.)
+</p>
+<p>Bug/typo fixes in gpg support
+(Contributed by William A. Perkins &lsquo;<tt>wa_perkins@pnl.gov</tt>&rsquo;,
+with separate patches from Knut Anders Hatlen &lsquo;<tt>kahatlen@online.no</tt>&rsquo;.)
+</p>
+<p>Installation improvements suggested by Christophe Troestler
+&lsquo;<tt>Ch.Troestler@linkline.be</tt>&rsquo;:
+use install-info to update the info dir,
+warn users of &ndash;prefix that lisp files go elsewhere.
+</p>
+<p>Changed (date  1-Feb-01): version 1.20:
+Bug fix: missing file notes-first.el added to the distribution.
+(Bug found by Michael Totschnig &lsquo;<tt>michaelt@supernet.ca</tt>&rsquo;.)
+</p>
+<p>Changed ( 5-Dec-01): version 1.21:
+(backed-out&mdash;didn&rsquo;t work with spaced URLs) 
+URL lookup now uses thing-at-point.
+</p>
+<p>Fix to make notes-mode work with emacs-21.1
+(Fix from Klaus Zeitler  &lsquo;<tt>kzeitler@lucent.com</tt>&rsquo;.)
+</p>
+<p>Changed ( 3-Jan-02): version 1.22:
+Several bugs in &lsquo;<tt>notesinit</tt>&rsquo; for stricter Perl implementations
+(bug found by Paul Craven&quot; &lsquo;<tt>pcraven@yorku.ca</tt>&rsquo;,
+and Kasper van Wijk &lsquo;<tt>kasper@acoustics.mines.edu</tt>&rsquo;)
+and to make it run cleanly more often.
+</p>
+<p>Notes-first now autoinitializes notes mode from emacs.
+(As instisted by rms, unfortunately about two years later than requested.)
+</p>
+
+<p>Changed (20-Feb-05): version 1.23:
+Outline mode is now forcebly turned on to avoid interactions
+with user&rsquo;s text-mode hooks
+(bug and fix from Nils Ackermann &lsquo;<tt>nils@nieback.de</tt>&rsquo;).
+</p>
+<p>Install bug involving ordering of scripts and byte-compilation
+fixed (bug and fix from Mark Allman &lsquo;<tt>mallman@grc.nasa.gov</tt>&rsquo;).
+</p>
+<p>Fix obscure bug in configure, reported by Klaus Zeitler &lsquo;<tt>kzeitler@lucent.com</tt>&rsquo;.
+</p>
+<p>Fix for notes-summarize-subject when no subject is specified (bug and fix
+from Geoff Kuenning).
+</p>
+<p>Changed (14-Jan-06): version 1.24:
+</p>
+<p>install-info bug documented with the Debian install-info
+(bug reported by Aaron Falk &lsquo;<tt>falk@isi.edu</tt>&rsquo;).
+</p>
+<p>Automatic date completion in new days is now done in the current
+locale, so it should now work for non-English languages.  Bug reported
+by Torsten Bronger &lsquo;<tt>bronger@physik.rwth-aachen.de</tt>&rsquo;.
+</p>
+<p>Fixed a bug in mkindexcache, triggered by subjects with percent signs
+in them.  Bug reported by Philip Austin &lsquo;<tt>paustin@eos.ubc.ca</tt>&rsquo;.
+</p>
+<p>We&rsquo;re a bit more robust about subjects, I hope.  Warnings should
+appear about embedded number signs, and leading spaces should be
+filtered.  Bug reported by Philip Austin &lsquo;<tt>paustin@eos.ubc.ca</tt>&rsquo;.
+</p>
+<p>Notes-mode now dervies from indented-text-mode rather than
+paragraph-indent-text mode.  Unfortunatley this is not customizable
+because of limitations of define-derived-mode.  Change suggested by
+Aaron Falk &lsquo;<tt>falk@isi.edu</tt>&rsquo;.
+</p>
+<p>Provide better hints about how to get started after installation or
+running notes-mode in emacs for the first time.
+</p>
+<p>In notes init, the default path for dir was the full path, not the tilde
+version of the path.  Now it defaults to using tidle for home
+directory.  Bug reported by Mark Allman &lsquo;<tt>allman@icir.org</tt>&rsquo;.
+</p>
+<p>Changed (26-May-06): version 1.25:
+</p>
+<p>fixed a bug in the release tar.gz file that had a additional copies
+copy nested.
+</p>
+<p>Changed (30-Jun-08): version 1.26:
+</p>
+<p>Force unicode I/O in &lsquo;<tt>mkindexcache</tt>&rsquo; to fix highlighting mis-alignment
+when using emacs-21 with unicode subject lines.
+</p>
+<p>Changed mkprevnext and mkrawindex to optionally take the list of notes files
+to index from stdin rather than from the command line.  Yes, I finally
+have 4093 notes files, overflowing the Unix command line buffer.
+</p>
+<p>Changes notes-mode.el to put path in quotes, allowing spaces to appear in home directory names (bug fix from Ulrich Herbst).
+</p>
+<p>Added a suggested features section.
+</p>
+<p>Changed ( 8-Aug-08): version 1.27:
+</p>
+<p>Change I/O in &lsquo;<tt>mkindexcache</tt>&rsquo; to use locale (the sadly correct thing)
+rather than forcing utf-8 (the Righteous Path).
+Bug report from Geoff Kuenning, a man with an older Unix environment than I.
+</p>
+<p>Changed (20-Jun-10): version 1.28:
+</p>
+<p>Changed a regular expression in &lsquo;<tt>notes-index-mode.el</tt>&rsquo; that was 
+causing emacs-v23 (a pre-release version)
+to regular expression infinite recursion.
+</p>
+<p>Changed (2012-04-04): version 1.29
+</p>
+<p>(2011-08-23) Changed <code>run-hooks</code> to <code>run-mode-hooks</code>.
+Bug report from Geoff Kuenning.
+</p>
+<p>Changed some handling of PGP encryption to account for 
+some apparent API changes.
+</p>
+<p>(2012-04-04) Fixed encyrption to handle encrypting empty notes at the end 
+of buffers without going into an infinite loop.
+Clearly wrong code, but you have to ask this guy for why he tried:
+Bug report from Geoff Kuenning.
+</p>
+
+
+<hr size="6">
+<a name="Suggested-features"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Changes" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Installation" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#History" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#History" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#Installation" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Suggested-features-1"></a>
+<h2 class="section">4.4 Suggested features</h2>
+
+<p>Features suggested by users but not yet implemented:
+</p>
+<p>21-Feb-08: (from Xavier Maillard): should support &ldquo;disconnected&rdquo; notes that
+are indexed but not date-based.
+</p>
+<p>21-Feb-08: (from John Heidemann): should switch all notes files to have an extension (maybe &lsquo;<tt>.notes</tt>&rsquo;).
+</p>
+<hr size="6">
+<a name="Installation"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Suggested-features" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Keystroke-index" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#History" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Top" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#Keystroke-index" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Installation-1"></a>
+<h1 class="chapter">5. Installation</h1>
+
+<p>To install notes-mode,
+</p>
+<ol>
+<li>
+Unpack and extract the distribution
+(gunzip notes-mode-xxx.tar.gz; tar xvf notes-mode-xxx.tar; cd notes-mode-xxx).
+
+</li><li>
+Run configure (./configure).
+
+</li><li>
+Type &ldquo;make install&rdquo;.
+</li></ol>
+
+<p>(To control what&rsquo;s installed where, use &ndash;prefix=/where, or
+&ndash;with-lisp-dir=/where, &ndash;datadir=/where (for scripts),
+and &ndash;infodir=/where.)
+</p>
+<p>For each user:
+</p><ol>
+<li>
+Run notesinit
+</li></ol>
+
+<p>If you have problems with paths being incorrect, please be aware that
+you <em>cannot</em> run notes directly out of where you untar it.  The
+installation process customizes the programs for where things are on
+your system.
+Make sure you move out of the directory where you untarred it
+before running it.
+</p>
+
+<p>The most recent distribution of notes-mode 
+ is always available via
+ &lsquo;<tt>http://www.isi.edu/~johnh/SOFTWARE/NOTES_MODE/</tt>&rsquo;.
+</p>
+
+
+<hr size="6">
+<a name="Keystroke-index"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Installation" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Concept-index" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Installation" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Top" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="#Concept-index" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Keystroke-index-1"></a>
+<h1 class="unnumbered">Keystroke index</h1>
+
+<p>This index lists notes-mode keystrokes.
+</p>
+<table><tr><th valign="top">Jump to: &nbsp; </th><td><a href="#Keystroke-index-1_ky_letter-C" class="summary-letter"><b>C</b></a>
+ &nbsp; 
+<a href="#Keystroke-index-1_ky_letter-M" class="summary-letter"><b>M</b></a>
+ &nbsp; 
+<a href="#Keystroke-index-1_ky_letter-O" class="summary-letter"><b>O</b></a>
+ &nbsp; 
+<a href="#Keystroke-index-1_ky_letter-R" class="summary-letter"><b>R</b></a>
+ &nbsp; 
+<a href="#Keystroke-index-1_ky_letter-S" class="summary-letter"><b>S</b></a>
+ &nbsp; 
+<a href="#Keystroke-index-1_ky_letter-T" class="summary-letter"><b>T</b></a>
+ &nbsp; 
+</td></tr></table>
+<table border="0" class="index-ky">
+<tr><td></td><th align="left">Index Entry</th><th align="left"> Section</th></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="Keystroke-index-1_ky_letter-C">C</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-C_002dc-C_002dd"><code>C-c C-d</code></a></td><td valign="top"><a href="#Encryption">3.1.3 Encryption</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-C_002dc-C_002de"><code>C-c C-e</code></a></td><td valign="top"><a href="#Encryption">3.1.3 Encryption</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-C_002dc-C_002di"><code>C-c C-i</code></a></td><td valign="top"><a href="#Getting-around">3.1.1 Getting around</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-C_002dc-C_002dk"><code>C-c C-k</code></a></td><td valign="top"><a href="#Getting-around">3.1.1 Getting around</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-C_002dc-C_002dn"><code>C-c C-n</code></a></td><td valign="top"><a href="#Getting-around">3.1.1 Getting around</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-C_002dc-C_002dp"><code>C-c C-p</code></a></td><td valign="top"><a href="#Getting-around">3.1.1 Getting around</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-C_002dc-C_002ds"><code>C-c C-s</code></a></td><td valign="top"><a href="#Subject-summary">3.1.2 Subject summary</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-C_002dc-C_002ds-1"><code>C-c C-s</code></a></td><td valign="top"><a href="#Notes-indices">3.2 Notes indices</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-C_002dcRTN"><code>C-c&lt;RTN&gt;</code></a></td><td valign="top"><a href="#Getting-around">3.1.1 Getting around</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="Keystroke-index-1_ky_letter-M">M</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-M_002dC_002da"><code>M-C-a</code></a></td><td valign="top"><a href="#Getting-around">3.1.1 Getting around</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-M_002dC_002de"><code>M-C-e</code></a></td><td valign="top"><a href="#Getting-around">3.1.1 Getting around</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-mouse_002d2"><code>mouse-2</code></a></td><td valign="top"><a href="#The-notes-index">2.3 The notes index</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="Keystroke-index-1_ky_letter-O">O</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-o"><code>o</code></a></td><td valign="top"><a href="#Notes-indices">3.2 Notes indices</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="Keystroke-index-1_ky_letter-R">R</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-RTN"><code>RTN</code></a></td><td valign="top"><a href="#A-notes-file">2.2 A notes file</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-RTN-1"><code>RTN</code></a></td><td valign="top"><a href="#The-notes-index">2.3 The notes index</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="Keystroke-index-1_ky_letter-S">S</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-S_002dmouse_002d2"><code>S-mouse-2</code></a></td><td valign="top"><a href="#A-notes-file">2.2 A notes file</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="Keystroke-index-1_ky_letter-T">T</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TAB"><code>TAB</code></a></td><td valign="top"><a href="#A-notes-file">2.2 A notes file</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+</table>
+<table><tr><th valign="top">Jump to: &nbsp; </th><td><a href="#Keystroke-index-1_ky_letter-C" class="summary-letter"><b>C</b></a>
+ &nbsp; 
+<a href="#Keystroke-index-1_ky_letter-M" class="summary-letter"><b>M</b></a>
+ &nbsp; 
+<a href="#Keystroke-index-1_ky_letter-O" class="summary-letter"><b>O</b></a>
+ &nbsp; 
+<a href="#Keystroke-index-1_ky_letter-R" class="summary-letter"><b>R</b></a>
+ &nbsp; 
+<a href="#Keystroke-index-1_ky_letter-S" class="summary-letter"><b>S</b></a>
+ &nbsp; 
+<a href="#Keystroke-index-1_ky_letter-T" class="summary-letter"><b>T</b></a>
+ &nbsp; 
+</td></tr></table>
+
+
+<hr size="6">
+<a name="Concept-index"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Keystroke-index" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[ &gt; ]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Keystroke-index" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Top" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[ &gt;&gt; ]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Concept-index-1"></a>
+<h1 class="unnumbered">Concept index</h1>
+
+<p>This index lists notes-mode concepts.
+</p>
+<table><tr><th valign="top">Jump to: &nbsp; </th><td><a href="#Concept-index-1_cp_symbol-1" class="summary-letter"><b>.</b></a>
+ &nbsp; 
+<br>
+<a href="#Concept-index-1_cp_letter-C" class="summary-letter"><b>C</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-D" class="summary-letter"><b>D</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-E" class="summary-letter"><b>E</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-F" class="summary-letter"><b>F</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-I" class="summary-letter"><b>I</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-K" class="summary-letter"><b>K</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-M" class="summary-letter"><b>M</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-N" class="summary-letter"><b>N</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-P" class="summary-letter"><b>P</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-R" class="summary-letter"><b>R</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-S" class="summary-letter"><b>S</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-T" class="summary-letter"><b>T</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-U" class="summary-letter"><b>U</b></a>
+ &nbsp; 
+</td></tr></table>
+<table border="0" class="index-cp">
+<tr><td></td><th align="left">Index Entry</th><th align="left"> Section</th></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="Concept-index-1_cp_symbol-1">.</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002enotesrc">.notesrc</a></td><td valign="top"><a href="#Notes_002dmode-configuration">3.3 Notes-mode configuration</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="Concept-index-1_cp_letter-C">C</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-configuration">configuration</a></td><td valign="top"><a href="#Notes_002dmode-configuration">3.3 Notes-mode configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-conventions">conventions</a></td><td valign="top"><a href="#Useful-conventions">3.1.4 Useful conventions</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Crontab">Crontab</a></td><td valign="top"><a href="#The-notes-index">2.3 The notes index</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="Concept-index-1_cp_letter-D">D</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Decryption">Decryption</a></td><td valign="top"><a href="#Encryption">3.1.3 Encryption</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Directory-hierarchy">Directory hierarchy</a></td><td valign="top"><a href="#The-notes-directories">2.4 The notes directories</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="Concept-index-1_cp_letter-E">E</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Encryption">Encryption</a></td><td valign="top"><a href="#Encryption">3.1.3 Encryption</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="Concept-index-1_cp_letter-F">F</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Font-matter">Font matter</a></td><td valign="top"><a href="#A-notes-file">2.2 A notes file</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="Concept-index-1_cp_letter-I">I</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-imenu">imenu</a></td><td valign="top"><a href="#Getting-around">3.1.1 Getting around</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Intermediate-directories">Intermediate directories</a></td><td valign="top"><a href="#The-notes-directories">2.4 The notes directories</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="Concept-index-1_cp_letter-K">K</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-key_002did">key-id</a></td><td valign="top"><a href="#Encryption">3.1.3 Encryption</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="Concept-index-1_cp_letter-M">M</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-mailcrypt">mailcrypt</a></td><td valign="top"><a href="#Encryption">3.1.3 Encryption</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-mkall">mkall</a></td><td valign="top"><a href="#The-notes-index">2.3 The notes index</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-mknew">mknew</a></td><td valign="top"><a href="#Useful-conventions">3.1.4 Useful conventions</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="Concept-index-1_cp_letter-N">N</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Notes-directories">Notes directories</a></td><td valign="top"><a href="#The-notes-directories">2.4 The notes directories</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Notes-entries">Notes entries</a></td><td valign="top"><a href="#A-notes-file">2.2 A notes file</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Notes-file-permissions">Notes file permissions</a></td><td valign="top"><a href="#The-notes-directories">2.4 The notes directories</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Notes-files">Notes files</a></td><td valign="top"><a href="#A-notes-file">2.2 A notes file</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Notes-files-1">Notes files</a></td><td valign="top"><a href="#The-notes-directories">2.4 The notes directories</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Notes-files_002c-font-matter">Notes files, font matter</a></td><td valign="top"><a href="#A-notes-file">2.2 A notes file</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Notes-index">Notes index</a></td><td valign="top"><a href="#The-notes-index">2.3 The notes index</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Notes-links">Notes links</a></td><td valign="top"><a href="#A-notes-file">2.2 A notes file</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Notes-subjects">Notes subjects</a></td><td valign="top"><a href="#A-notes-file">2.2 A notes file</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-notes_002dmode_002dinitialization_002dprogram">notes-mode-initialization-program</a></td><td valign="top"><a href="#Useful-conventions">3.1.4 Useful conventions</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-notesinit">notesinit</a></td><td valign="top"><a href="#Getting-started">2.1 Getting started</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="Concept-index-1_cp_letter-P">P</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-PAM">PAM</a></td><td valign="top"><a href="#Encryption">3.1.3 Encryption</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-PGP">PGP</a></td><td valign="top"><a href="#Encryption">3.1.3 Encryption</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-PGP-Augmented-Messaging">PGP Augmented Messaging</a></td><td valign="top"><a href="#Encryption">3.1.3 Encryption</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Pretty-good-privacy">Pretty good privacy</a></td><td valign="top"><a href="#Encryption">3.1.3 Encryption</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Pseudo_002dURLs">Pseudo-URLs</a></td><td valign="top"><a href="#A-notes-file">2.2 A notes file</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="Concept-index-1_cp_letter-R">R</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-re_002dindexing">re-indexing</a></td><td valign="top"><a href="#The-notes-index">2.3 The notes index</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Root-directory">Root directory</a></td><td valign="top"><a href="#The-notes-directories">2.4 The notes directories</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="Concept-index-1_cp_letter-S">S</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-setup">setup</a></td><td valign="top"><a href="#Getting-started">2.1 Getting started</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Subject-summary">Subject summary</a></td><td valign="top"><a href="#Subject-summary">3.1.2 Subject summary</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="Concept-index-1_cp_letter-T">T</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Today">Today</a></td><td valign="top"><a href="#Useful-conventions">3.1.4 Useful conventions</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="Concept-index-1_cp_letter-U">U</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-URLs">URLs</a></td><td valign="top"><a href="#A-notes-file">2.2 A notes file</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+</table>
+<table><tr><th valign="top">Jump to: &nbsp; </th><td><a href="#Concept-index-1_cp_symbol-1" class="summary-letter"><b>.</b></a>
+ &nbsp; 
+<br>
+<a href="#Concept-index-1_cp_letter-C" class="summary-letter"><b>C</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-D" class="summary-letter"><b>D</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-E" class="summary-letter"><b>E</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-F" class="summary-letter"><b>F</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-I" class="summary-letter"><b>I</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-K" class="summary-letter"><b>K</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-M" class="summary-letter"><b>M</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-N" class="summary-letter"><b>N</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-P" class="summary-letter"><b>P</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-R" class="summary-letter"><b>R</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-S" class="summary-letter"><b>S</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-T" class="summary-letter"><b>T</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-U" class="summary-letter"><b>U</b></a>
+ &nbsp; 
+</td></tr></table>
+
+
+
+
+<hr size="6">
+<a name="SEC_Foot"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h1>Footnotes</h1>
+<h3><a name="FOOT1" href="#DOCF1">(1)</a></h3>
+<p>Trademarked, in Great Britain, Sunone tells me.
+</p><h3><a name="FOOT2" href="#DOCF2">(2)</a></h3>
+<p>I consider myself pretty anal about this subject,
+often typing notes in from paper after-the-fact,
+and <em>I</em> certainly don&rsquo;t manage to back-enter
+my notes all time time.
+</p><h3><a name="FOOT3" href="#DOCF3">(3)</a></h3>
+
+<p>On the other hand, some folks at MIT are working
+on this problem from both the hardware and the social side of
+things (&lsquo;<tt>http://wearables.www.media.mit.edu/projects/wearables/</tt>&rsquo;)
+(Perhaps they have wild parties with computers, too.)
+</p><h3><a name="FOOT4" href="#DOCF4">(4)</a></h3>
+<p>My hat is off to Rosa Parks
+and the many other normal people who triggered landmark cases.
+</p><h3><a name="FOOT5" href="#DOCF5">(5)</a></h3>
+<p>If you think I&rsquo;m missing an alternative, please let me know.
+</p><hr size="1">
+<a name="SEC_Contents"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h1>Table of Contents</h1>
+<div class="contents">
+
+<ul class="toc">
+  <li><a name="toc-Introduction-1" href="#Introduction">1. Introduction</a>
+  <ul class="toc">
+    <li><a name="toc-What-is-it_003f-1" href="#What-is-it_003f">1.1 What is it?</a></li>
+    <li><a name="toc-Why-keep-notes-at-all_003f-1" href="#Why-keep-notes-at-all_003f">1.2 Why keep notes at all?</a></li>
+    <li><a name="toc-Why-keep-notes-on_002dline_003f-1" href="#Why-keep-notes-on_002dline_003f">1.3 Why keep notes on-line?</a></li>
+    <li><a name="toc-Why-use-notes_002dmode_003f-1" href="#Why-use-notes_002dmode_003f">1.4 Why use notes-mode?</a></li>
+    <li><a name="toc-Y2K-Statement-1" href="#Y2K-Statement">1.5 Y2K Statement</a></li>
+    <li><a name="toc-Related-work-1" href="#Related-work">1.6 Related work</a></li>
+    <li><a name="toc-Staying-on-top-1" href="#Staying-on-top">1.7 Staying on top</a></li>
+  </ul></li>
+  <li><a name="toc-Basics-1" href="#Basics">2. Basics</a>
+  <ul class="toc">
+    <li><a name="toc-Getting-started-1" href="#Getting-started">2.1 Getting started</a></li>
+    <li><a name="toc-A-notes-file-1" href="#A-notes-file">2.2 A notes file</a></li>
+    <li><a name="toc-The-notes-index-1" href="#The-notes-index">2.3 The notes index</a></li>
+    <li><a name="toc-The-notes-directories-1" href="#The-notes-directories">2.4 The notes directories</a></li>
+  </ul></li>
+  <li><a name="toc-Advanced-Features-1" href="#Advanced-Features">3. Advanced Features</a>
+  <ul class="toc">
+    <li><a name="toc-Notes-files-1" href="#Notes-files">3.1 Notes files</a>
+    <ul class="toc">
+      <li><a name="toc-Getting-around-1" href="#Getting-around">3.1.1 Getting around</a></li>
+      <li><a name="toc-Subject-summary-1" href="#Subject-summary">3.1.2 Subject summary</a></li>
+      <li><a name="toc-Encryption-1" href="#Encryption">3.1.3 Encryption</a></li>
+      <li><a name="toc-Useful-conventions-1" href="#Useful-conventions">3.1.4 Useful conventions</a></li>
+    </ul></li>
+    <li><a name="toc-Notes-indices-1" href="#Notes-indices">3.2 Notes indices</a></li>
+    <li><a name="toc-Notes_002dmode-configuration-1" href="#Notes_002dmode-configuration">3.3 Notes-mode configuration</a></li>
+  </ul></li>
+  <li><a name="toc-History-1" href="#History">4. History</a>
+  <ul class="toc">
+    <li><a name="toc-Notes_002dmode-history-1" href="#Notes_002dmode-history">4.1 Notes-mode history</a></li>
+    <li><a name="toc-Credits-1" href="#Credits">4.2 Credits</a></li>
+    <li><a name="toc-Changes-1" href="#Changes">4.3 Changes</a></li>
+    <li><a name="toc-Suggested-features-1" href="#Suggested-features">4.4 Suggested features</a></li>
+  </ul></li>
+  <li><a name="toc-Installation-1" href="#Installation">5. Installation</a></li>
+  <li><a name="toc-Keystroke-index-1" href="#Keystroke-index">Keystroke index</a></li>
+  <li><a name="toc-Concept-index-1" href="#Concept-index">Concept index</a></li>
+</ul>
+</div>
+<hr size="1">
+<a name="SEC_About"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h1>About This Document</h1>
+<p>
+  This document was generated by <em>John Heidemann</em> on <em>April 4, 2012</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.82</em></a>.
+</p>
+<p>
+  The buttons in the navigation panels have the following meaning:
+</p>
+<table border="1">
+  <tr>
+    <th> Button </th>
+    <th> Name </th>
+    <th> Go to </th>
+    <th> From 1.2.3 go to</th>
+  </tr>
+  <tr>
+    <td align="center"> [ &lt; ] </td>
+    <td align="center">Back</td>
+    <td>Previous section in reading order</td>
+    <td>1.2.2</td>
+  </tr>
+  <tr>
+    <td align="center"> [ &gt; ] </td>
+    <td align="center">Forward</td>
+    <td>Next section in reading order</td>
+    <td>1.2.4</td>
+  </tr>
+  <tr>
+    <td align="center"> [ &lt;&lt; ] </td>
+    <td align="center">FastBack</td>
+    <td>Beginning of this chapter or previous chapter</td>
+    <td>1</td>
+  </tr>
+  <tr>
+    <td align="center"> [ Up ] </td>
+    <td align="center">Up</td>
+    <td>Up section</td>
+    <td>1.2</td>
+  </tr>
+  <tr>
+    <td align="center"> [ &gt;&gt; ] </td>
+    <td align="center">FastForward</td>
+    <td>Next chapter</td>
+    <td>2</td>
+  </tr>
+  <tr>
+    <td align="center"> [Top] </td>
+    <td align="center">Top</td>
+    <td>Cover (top) of document</td>
+    <td> &nbsp; </td>
+  </tr>
+  <tr>
+    <td align="center"> [Contents] </td>
+    <td align="center">Contents</td>
+    <td>Table of contents</td>
+    <td> &nbsp; </td>
+  </tr>
+  <tr>
+    <td align="center"> [Index] </td>
+    <td align="center">Index</td>
+    <td>Index</td>
+    <td> &nbsp; </td>
+  </tr>
+  <tr>
+    <td align="center"> [ ? ] </td>
+    <td align="center">About</td>
+    <td>About (help)</td>
+    <td> &nbsp; </td>
+  </tr>
+</table>
+
+<p>
+  where the <strong> Example </strong> assumes that the current position is at <strong> Subsubsection One-Two-Three </strong> of a document of the following structure:
+</p>
+
+<ul>
+  <li> 1. Section One
+    <ul>
+      <li>1.1 Subsection One-One
+        <ul>
+          <li>...</li>
+        </ul>
+      </li>
+      <li>1.2 Subsection One-Two
+        <ul>
+          <li>1.2.1 Subsubsection One-Two-One</li>
+          <li>1.2.2 Subsubsection One-Two-Two</li>
+          <li>1.2.3 Subsubsection One-Two-Three &nbsp; &nbsp;
+            <strong>&lt;== Current Position </strong></li>
+          <li>1.2.4 Subsubsection One-Two-Four</li>
+        </ul>
+      </li>
+      <li>1.3 Subsection One-Three
+        <ul>
+          <li>...</li>
+        </ul>
+      </li>
+      <li>1.4 Subsection One-Four</li>
+    </ul>
+  </li>
+</ul>
+
+<hr size="1">
+<p>
+ <font size="-1">
+  This document was generated by <em>John Heidemann</em> on <em>April 4, 2012</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.82</em></a>.
+ </font>
+ <br>
+
+</p>
+</body>
+</html>
diff --git a/packages/notes-mode/HTML/notes-mode/notes-mode.html b/packages/notes-mode/HTML/notes-mode/notes-mode.html
new file mode 100644 (file)
index 0000000..09b626b
--- /dev/null
@@ -0,0 +1,152 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+<html>
+<!-- Created on August, 8 2008 by texi2html 1.78 -->
+<!--
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<head>
+<title>Notes-mode: Top</title>
+
+<meta name="description" content="Notes-mode: Top">
+<meta name="keywords" content="Notes-mode: Top">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="texi2html 1.78">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+pre.display {font-family: serif}
+pre.format {font-family: serif}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+pre.smalldisplay {font-family: serif; font-size: smaller}
+pre.smallexample {font-size: smaller}
+pre.smallformat {font-family: serif; font-size: smaller}
+pre.smalllisp {font-size: smaller}
+span.roman {font-family:serif; font-weight:normal;}
+span.sansserif {font-family:sans-serif; font-weight:normal;}
+ul.toc {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+
+<a name="Top"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h1 class="settitle">Notes-mode
+</h1>
+
+
+
+
+
+
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top"><a href="notes-mode_1.html#SEC1">1. Introduction</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">                
+</td></tr>
+<tr><td align="left" valign="top"><a href="notes-mode_2.html#SEC9">2. Basics</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">                      
+</td></tr>
+<tr><td align="left" valign="top"><a href="notes-mode_3.html#SEC14">3. Advanced Features</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">           
+</td></tr>
+<tr><td align="left" valign="top"><a href="notes-mode_4.html#SEC22">4. History</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">                     
+</td></tr>
+<tr><td align="left" valign="top"><a href="notes-mode_5.html#SEC27">5. Installation</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">                
+</td></tr>
+<tr><td align="left" valign="top"><a href="notes-mode_6.html#SEC28">Keystroke index</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">             
+</td></tr>
+<tr><td align="left" valign="top"><a href="notes-mode_7.html#SEC29">Concept index</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">               
+</td></tr>
+<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
+ --- The Detailed Node Listing ---
+
+Introduction
+
+</pre></th></tr><tr><td align="left" valign="top"><a href="notes-mode_1.html#SEC2">1.1 What is it?</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">                 
+</td></tr>
+<tr><td align="left" valign="top"><a href="notes-mode_1.html#SEC3">1.2 Why keep notes at all?</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">      
+</td></tr>
+<tr><td align="left" valign="top"><a href="notes-mode_1.html#SEC4">1.3 Why keep notes on-line?</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">     
+</td></tr>
+<tr><td align="left" valign="top"><a href="notes-mode_1.html#SEC5">1.4 Why use notes-mode?</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">         
+</td></tr>
+<tr><td align="left" valign="top"><a href="notes-mode_1.html#SEC6">1.5 Y2K Statement</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">               
+</td></tr>
+<tr><td align="left" valign="top"><a href="notes-mode_1.html#SEC7">1.6 Related work</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">                
+</td></tr>
+<tr><td align="left" valign="top"><a href="notes-mode_1.html#SEC8">1.7 Staying on top</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">              
+</td></tr>
+<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
+Basics
+
+</pre></th></tr><tr><td align="left" valign="top"><a href="notes-mode_2.html#SEC10">2.1 Getting started</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">             
+</td></tr>
+<tr><td align="left" valign="top"><a href="notes-mode_2.html#SEC11">2.2 A notes file</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">                
+</td></tr>
+<tr><td align="left" valign="top"><a href="notes-mode_2.html#SEC12">2.3 The notes index</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">             
+</td></tr>
+<tr><td align="left" valign="top"><a href="notes-mode_2.html#SEC13">2.4 The notes directories</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">       
+</td></tr>
+<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
+Advanced Features
+
+</pre></th></tr><tr><td align="left" valign="top"><a href="notes-mode_3.html#SEC15">3.1 Notes files</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">                 
+</td></tr>
+<tr><td align="left" valign="top"><a href="notes-mode_3.html#SEC20">3.2 Notes indices</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">               
+</td></tr>
+<tr><td align="left" valign="top"><a href="notes-mode_3.html#SEC21">3.3 Notes-mode configuration</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">    
+</td></tr>
+<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
+Notes files
+
+</pre></th></tr><tr><td align="left" valign="top"><a href="notes-mode_3.html#SEC16">3.1.1 Getting around</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">              
+</td></tr>
+<tr><td align="left" valign="top"><a href="notes-mode_3.html#SEC17">3.1.2 Subject summary</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">             
+</td></tr>
+<tr><td align="left" valign="top"><a href="notes-mode_3.html#SEC18">3.1.3 Encryption</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">                  
+</td></tr>
+<tr><td align="left" valign="top"><a href="notes-mode_3.html#SEC19">3.1.4 Useful conventions</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">          
+</td></tr>
+<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
+History
+
+</pre></th></tr><tr><td align="left" valign="top"><a href="notes-mode_4.html#SEC23">4.1 Notes-mode history</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">          
+</td></tr>
+<tr><td align="left" valign="top"><a href="notes-mode_4.html#SEC24">4.2 Credits</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">                     
+</td></tr>
+<tr><td align="left" valign="top"><a href="notes-mode_4.html#SEC25">4.3 Changes</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">                     
+</td></tr>
+<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
+</pre></th></tr></table>
+
+
+<hr size="1">
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<p>
+ <font size="-1">
+  This document was generated by <em>John Heidemann</em> on <em>August, 8 2008</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.78</em></a>.
+ </font>
+ <br>
+
+</p>
+</body>
+</html>
diff --git a/packages/notes-mode/HTML/notes-mode/notes-mode_1.html b/packages/notes-mode/HTML/notes-mode/notes-mode_1.html
new file mode 100644 (file)
index 0000000..dc5a59a
--- /dev/null
@@ -0,0 +1,533 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+<html>
+<!-- Created on August, 8 2008 by texi2html 1.78 -->
+<!--
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<head>
+<title>Notes-mode: 1. Introduction</title>
+
+<meta name="description" content="Notes-mode: 1. Introduction">
+<meta name="keywords" content="Notes-mode: 1. Introduction">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="texi2html 1.78">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+pre.display {font-family: serif}
+pre.format {font-family: serif}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+pre.smalldisplay {font-family: serif; font-size: smaller}
+pre.smallexample {font-size: smaller}
+pre.smallformat {font-family: serif; font-size: smaller}
+pre.smalllisp {font-size: smaller}
+span.roman {font-family:serif; font-weight:normal;}
+span.sansserif {font-family:sans-serif; font-weight:normal;}
+ul.toc {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+
+<a name="Introduction"></a>
+<a name="SEC1"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC2" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[ &lt;&lt; ]</td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_2.html#SEC9" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h1 class="chapter"> 1. Introduction </h1>
+
+<p>What is notes-mode and why should you (perhaps) use it?
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top"><a href="#SEC2">1.1 What is it?</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">                 
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC3">1.2 Why keep notes at all?</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">      
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC4">1.3 Why keep notes on-line?</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">     
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC5">1.4 Why use notes-mode?</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">         
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC6">1.5 Y2K Statement</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">               
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC7">1.6 Related work</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">                
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC8">1.7 Staying on top</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">              
+</td></tr>
+</table>
+
+<hr size="6">
+<a name="What-is-it_003f"></a>
+<a name="SEC2"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC1" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC3" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC1" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC1" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_2.html#SEC9" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 1.1 What is it? </h2>
+
+<p>Notes-mode is an indexing system for on-line note-taking.
+Notes-mode is composed of two parts, the visible part,
+a major-mode for emacs to aid note-taking;
+and the invisible part,
+scripts which periodically index your notes for you.
+</p>
+<p>Note that notes-mode provides tools to <em>index</em> your notes,
+not to <em>search</em> them.
+(Other existing tools such as &lsquo;<tt>grep</tt>&rsquo;, &lsquo;<tt>agrep</tt>&rsquo;, and &lsquo;<tt>glimpse</tt>&rsquo;
+already allow file search.)
+</p>
+<p>A digression about indexing vs. searching:
+Indexing in this sense means
+organize them according to categories you give,
+while searching looks through all text for arbitrary strings.
+Drawing on the World Wide Web for examples,
+Yahoo (&lsquo;<tt>http://www.yahoo.com/</tt>&rsquo;) is an index,
+while Alta Vista (&lsquo;<tt>http://www.altavista.digital.com/</tt>&rsquo;)
+is a search-engine.
+In (potentially) more familiar terms,
+the yellow pages
+<a name="DOCF1" href="notes-mode_fot.html#FOOT1">(1)</a>
+are an index,
+while directory information (411 in the USA)
+is sort of a search-engine.
+</p>
+
+<hr size="6">
+<a name="Why-keep-notes-at-all_003f"></a>
+<a name="SEC3"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC2" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC4" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC1" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC1" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_2.html#SEC9" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 1.2 Why keep notes at all? </h2>
+
+<p>So why should you use notes-mode?
+Well, first, consider why you should (perhaps)
+keep your notes on line.
+First,
+I assume that you take notes as part of your work or school.
+If you don't,
+you can stop reading now and go back to watching TV.
+</p>
+<p>If you keep notes, ask yourself why you keep them.
+Reasons vary for different people, but some include:
+</p>
+<ul>
+<li>
+To remember what is said or done.
+
+</li><li>
+To focus on what is important about what is said.
+
+</li><li>
+To provide proof of having done something
+at a particular time or date.
+
+</li><li>
+I know there were other reasons here,
+but they slipped my mind.
+</li></ul>
+
+
+<hr size="6">
+<a name="Why-keep-notes-on_002dline_003f"></a>
+<a name="SEC4"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC3" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC5" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC1" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC1" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_2.html#SEC9" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 1.3 Why keep notes on-line? </h2>
+
+<p>OK, I've talked you into keeping notes.
+Why do it on-line?
+Again, there are different reasons for different people.
+If you don't want to consider keeping your notes on-line,
+you're welcome to go back to your (clay tablets)
+paper notes.
+</p>
+<p>However, if you do much of your work on-line,
+or if you have portable computer,
+then you might want to consider keeping your notes on-line.
+</p>
+<ul>
+<li>
+It's faster to type than write,
+and possibly more legible at high speed.
+
+</li><li>
+Often information is already on-line.
+For example, in software development, bug reports,
+measurement results, and everything else that's useful
+is on-line.
+
+</li><li>
+You can take down more detail than you otherwise would
+(especially if the data is already on-line).
+Taking more copious notes can be helpful when you go back
+to figure out why that strange thing was happening.
+
+</li><li>
+On-line notes are easy to search.
+Full-text search with 
+grep, agrep, and glimpse are all much faster
+and are often more accurate than paging through paper notes
+looking for a particular keyword.
+
+</li><li>
+On-line notes are easy to index.
+(At least with notes-mode!)
+In addition to full-text search,
+it's helpful to organize notes by category.
+If you keep a table-of-contents of your paper notes,
+you are either extremely fastidious
+or a librarian (Nadia?).
+
+</li><li>
+You can keep all of your notes with you at all times
+(if you have a portable computer).
+Even at a page a day,
+paper notes quickly become bulky and awkward to carry around.
+On-line notes fit on your computer's hard disk,
+an extraordinarily compact medium
+by comparison.
+
+</li><li>
+Your notes can be automatically backed up.
+Paper notes can become damaged with time,
+and as a graduate student
+one of my fears was fire in Boelter Hall
+consuming all my research experiments
+and and therefore hopes of a degree.
+Electronic notes are extremely easy to duplicate
+and can be automatically backed up with the rest of your computer.
+(You <em>do</em> back up your computer, don't you?)
+
+</li></ul>
+
+<p>While these advantages are undoubtedly clear to any
+right-thinking computer user,
+it should be said that there are a few disadvantages 
+for on-line note-taking.
+</p>
+<ul>
+<li>
+If you don't have a computer with you most of the time,
+it's difficult take notes on-line (because you're off-line, of course).
+<a name="DOCF2" href="notes-mode_fot.html#FOOT2">(2)</a>
+
+</li><li>
+Computers require power.
+If your portable computer runs out of juice,
+you're on your own.
+Corollary:  watch your power, or bring paper.
+Better corollary:  watch your power, <em>and</em> bring paper.
+
+</li><li>
+Social limitations.
+It's not always socially acceptable to take notes-on-line.
+For example,
+at a party,
+few people would use a computer
+to take down the phone number of a person
+to whom they're attracted
+(at least, if they wanted the attraction to be mutual).
+<a name="DOCF3" href="notes-mode_fot.html#FOOT3">(3)</a>
+Sometimes other people find the sound of typing distracting.
+
+</li><li>
+Health issues.
+Repetitive stress injuries do occur
+writing (slower) by hand is at least 
+an alternate motion than typing.
+
+</li><li>
+Legal limitations.
+If you want to use your electronic notes
+to justify a patent or invention,
+you may be breaking legal ground.
+Being on the legal cutting-edge is rarely an easy thing
+for the person involved.<a name="DOCF4" href="notes-mode_fot.html#FOOT4">(4)</a>
+
+</li></ul>
+
+
+<hr size="6">
+<a name="Why-use-notes_002dmode_003f"></a>
+<a name="SEC5"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC4" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC6" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC1" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC1" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_2.html#SEC9" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 1.4 Why use notes-mode? </h2>
+
+<p>OK, I've sold you on note-taking and even on on-line note-taking.
+What about notes-mode?
+Naturally,
+it slices, dices, and makes julienne fries.
+But wait, there's more:
+</p>
+<ul>
+<li>
+It automates indexing your notes,
+linking notes with the same subject together.
+
+</li><li>
+It supports embedded links,
+allowing you to manually link together different topics 
+and external files.
+
+</li><li>
+It includes a number of convenience-features in emacs.
+Subjects can be completed based on existing subjects.
+The usual emacs customization mechanisms are available.
+
+</li><li>
+Notes containing sensitive information can be encrypted.
+
+</li><li>
+Notes-mode seems better than the other, currently available alternatives.
+</li></ul>
+
+<p>What are the alternatives?  I'm glad you asked.
+<a name="DOCF5" href="notes-mode_fot.html#FOOT5">(5)</a>
+</p>
+<ul>
+<li>
+<strong>HTML</strong>.
+HTML has better formatting capabilities than notes-mode,
+and it has excellent linking capabilities.
+Unfortunately,
+HTML's tags are fairly intrusive
+ (each is at least four characters long and most come with a pair),
+ tags can get confused with normal text,
+ errors in HTML can be bad (obscuring data),
+ and there's no automatic indexing feature
+ (at least with plain HTML).
+Besides,
+ all data should be kept as close to the ASCII from whence it came,
+ as God Intended (hi, Steve).
+
+</li><li>
+<strong>Word Processors</strong>.
+Word processors are strong in the formatting department,
+ but most don't really have linking capabilities,
+ and have poor or restricted indexing.
+
+</li></ul>
+
+<hr size="6">
+<a name="Y2K-Statement"></a>
+<a name="SEC6"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC5" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC7" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC1" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC1" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_2.html#SEC9" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 1.5 Y2K Statement </h2>
+
+<p>Notes mode uses dates extensively,
+ both two-digit years and seconds-since-1970.
+However, notes-mode has been coded to function correctly through
+ the year 2038.
+</p>
+<p>To avoid problems with the year 2000, notes-mode assumes
+ that any two-digit years before &ldquo;70&rdquo; are 20xx, not 19xx.
+Notes-mode should therefore work correctly in both the year 1999 and 2000.
+</p>
+<p>(Notes-mode 1.17 released February 1999 fixes a lingering Y2K problem.)
+</p>
+<p>Because notes-mode uses seconds-since-1970 for some date calculations
+ it will fail beyond the year 2038 on computers with 32-bit integers.
+</p>
+<p>If I'm still using notes-mode then on a 32-bit machine I'll see what I can do.
+</p>
+
+<hr size="6">
+<a name="Related-work"></a>
+<a name="SEC7"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC6" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC8" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC1" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC1" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_2.html#SEC9" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 1.6 Related work </h2>
+
+<p>What would a document be without related work?
+</p>
+<p>Notes-mode is not related in any way to Lotus Notes.
+</p>
+<p>I am told (by David Weisman)
+ that it's something like the now defunct Lotus Agenda.
+</p>
+<p>Ashvin Goel, one of the contributors to notes-mode,
+ has gone off and done a from-scratch reimplementation
+ called records-mode.
+It's very similar to notes mode,
+ and emphasizes on-the-fly updates to entry links
+ but lacks a manual.
+You may want to check it out at
+ &lsquo;<tt>http://www.cse.ogi.edu/~ashvin/software.html</tt>&rsquo;.
+</p>
+<p>Hyperbole (by Bob Weiner) offers better linking facilities
+than notes-mode, but it has a bunch of stuff notes-mode doesn't need
+and it's missing notes-specific indexing provided by notes-mode.
+For people already using Hyperbole
+ it would be interesting to replace notes-mode's linking
+ with Hyperbole's.
+Contributions in this area are welcome, provided they make Hyperbole
+ optional.
+</p>
+<hr size="6">
+<a name="Staying-on-top"></a>
+<a name="SEC8"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC7" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_2.html#SEC9" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC1" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC1" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_2.html#SEC9" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 1.7 Staying on top </h2>
+
+<p>The most recent distribution of notes-mode 
+ is always available via
+ &lsquo;<tt>http://www.isi.edu/~johnh/SOFTWARE/NOTES_MODE/</tt>&rsquo;.
+</p>
+<p>After you've installed notes mode you're encouraged to subscribe
+to the mailing lists.
+To subscribe, go to the web page
+Send the message &quot;subscribe&quot; to
+&lsquo;<tt>http://www.heidemann.la.ca.us/mailman/listinfo/notes-mode-announce</tt>&rsquo; or
+&lsquo;<tt>http://www.heidemann.la.ca.us/mailman/listinfo/notes-mode-talk</tt>&rsquo;.
+</p>
+<p>The announce list will contain only release announcements
+and so is guaranteed to be very low bandwidth.
+</p>
+
+
+<hr size="6">
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC1" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_2.html#SEC9" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<p>
+ <font size="-1">
+  This document was generated by <em>John Heidemann</em> on <em>August, 8 2008</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.78</em></a>.
+ </font>
+ <br>
+
+</p>
+</body>
+</html>
diff --git a/packages/notes-mode/HTML/notes-mode/notes-mode_2.html b/packages/notes-mode/HTML/notes-mode/notes-mode_2.html
new file mode 100644 (file)
index 0000000..61a3bf9
--- /dev/null
@@ -0,0 +1,413 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+<html>
+<!-- Created on August, 8 2008 by texi2html 1.78 -->
+<!--
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<head>
+<title>Notes-mode: 2. Basics</title>
+
+<meta name="description" content="Notes-mode: 2. Basics">
+<meta name="keywords" content="Notes-mode: 2. Basics">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="texi2html 1.78">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+pre.display {font-family: serif}
+pre.format {font-family: serif}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+pre.smalldisplay {font-family: serif; font-size: smaller}
+pre.smallexample {font-size: smaller}
+pre.smallformat {font-family: serif; font-size: smaller}
+pre.smalllisp {font-size: smaller}
+span.roman {font-family:serif; font-weight:normal;}
+span.sansserif {font-family:sans-serif; font-weight:normal;}
+ul.toc {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+
+<a name="Basics"></a>
+<a name="SEC9"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="notes-mode_1.html#SEC8" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC10" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode_1.html#SEC1" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_3.html#SEC14" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h1 class="chapter"> 2. Basics </h1>
+
+<p>All you need to use notes-mode
+ in a chapter.
+(Except for installation, See section <a href="notes-mode_5.html#SEC27">Installation</a>.)
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top"><a href="#SEC10">2.1 Getting started</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">             
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC11">2.2 A notes file</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">                
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC12">2.3 The notes index</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">             
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC13">2.4 The notes directories</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">       
+</td></tr>
+</table>
+
+<hr size="6">
+<a name="Getting-started"></a>
+<a name="SEC10"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC9" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC11" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC9" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC9" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_3.html#SEC14" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 2.1 Getting started </h2>
+
+<p>To get started with notes-mode,
+ read the introduction this chapter,
+ then either:
+</p>
+<ul>
+<li>
+Start emacs, do 
+ <kbd>M-x</kbd> <code>load-library</code> <kbd>RET</kbd> <code>notes-mode</code> <kbd>RET</kbd>
+This approach will set up notes-mode with the default parameters.
+
+</li><li>
+OR, from the shell, 
+ run the program &lsquo;<tt>notesinit</tt>&rsquo;.
+This approach will ask you some questions about how you want to configure
+ notes mode.
+
+</li></ul>
+
+<p>Either way these should set up everything notes-mode needs.
+This program will modify your environment (as described in this section),
+ or it will give you the exact commands you should run yourself.
+</p>
+<p>After you've done one of these,
+ start up emacs and note-away.
+I usually begin a
+ day of note-taking by running the command
+ <kbd>M-x</kbd> <code>notes-index-todays-link</code>
+ to jump directly to today's note.
+You may even wish to bind this to something,
+ perhaps with
+ <code>(define-key global-map &quot;\C-cn&quot; 'notes-index-todays-link)</code>
+ in your &lsquo;<tt>.emacs</tt>&rsquo;. 
+</p>
+<p>If you want to browse your existing notes,
+ you might instead want to edit the
+ &lsquo;<tt>~/NOTES/index</tt>&rsquo;.
+(What is a notes file and the index? Hurry up and finish
+ reading this chapter.) 
+</p>
+
+<hr size="6">
+<a name="A-notes-file"></a>
+<a name="SEC11"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC10" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC12" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC9" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC9" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_3.html#SEC14" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 2.2 A notes file </h2>
+
+
+<p>The notes file is the focus of most of the activity in notes-mode,
+ it's where you take your notes.
+Notes files are mostly free-form text
+ broken up into <em>entries</em>.
+Here's an example:
+</p>
+<a name="IDX1"></a>
+
+<table><tr><td>&nbsp;</td><td><pre class="example">8-Jun-95 Thursday
+-----------------
+
+* Today
+-------
+prev: &lt;none&gt;
+next: &lt;file:///~/NOTES/199506/950609#* Today&gt;
+
+next week - release notes-mode
+
+
+* Environment/notes
+-------------------
+
+I explained notes mode to Ashvin and Geoff.
+...
+</pre></td></tr></table>
+
+<p>Each entry has a subject-block, (maybe) some links, and then (maybe) some text.
+</p>
+<p>The subject-block must begin with an asterisk-space (<kbd>* </kbd>)
+ at the beginning of a line, followed by the subject itself.
+Subjects must be underlined with a row of dashes
+ (if they're not exact, that's OK;
+ notes-mode will fix them periodically).
+For convenience,
+ notes-mode will automatically add the underlines when you
+ hit <kbd>&lt;RTN&gt;</kbd> (<code>notes-electric-return</code>),
+ and <kbd>&lt;TAB&gt;</kbd> on a partially completed subject will
+ invoke completion based on indexed subjects (<code>notes-complete-subject</code>).
+<a name="IDX2"></a>
+<a name="IDX3"></a>
+<a name="IDX4"></a>
+</p>
+<p>Following the subject may be links.
+(In the example, the &ldquo;Today&rdquo; entry has links,
+ the &ldquo;Environment/notes&rdquo; entry doesn't.)
+These links will be automatically updated by notes-mode
+ when your notes are re-indexed;
+ just leave a blank line when writing the note.
+<a name="IDX5"></a>
+</p>
+<p>Links are made with pseudo-URLs,
+ sort of like those in the World Wide Web. 
+Any of these URLs can be followed in notes-mode files
+ by clicking <kbd>S-mouse-2</kbd> on the pseudo-URL
+ (<code>notes-w3-follow-link-mouse</code>).
+<a name="IDX6"></a>
+<a name="IDX7"></a>
+<a name="IDX8"></a>
+</p>
+<p>Finally comes the text.
+Go wild, but just don't include text that looks like a subject.
+You can embed pseudo-URLs to link notes together manually.
+</p>
+<p>The more anal of you may have noticed
+ that the lines before the first subject
+ are not part of any entry.
+These lines are
+ <em>front matter</em>.
+They're not usually used for much,
+ but they can be a good place to label the file.
+<a name="IDX9"></a>
+<a name="IDX10"></a>
+</p>
+<p>There are a number of useful conventions
+ that can be adopted to organize your notes.
+The most common is the &ldquo;Today&rdquo; entry.
+If you keep an entry with the same subject
+ at the beginning of each file,
+ you link all of your notes together.
+Notes-mode will help you out with some of these convetions
+ by automatically creating or copying some fields for you;
+ see see section <a href="notes-mode_3.html#SEC19">Useful conventions</a> for details.
+</p>
+<p>Finally, notes-mode can also work with outline-minor-mode
+ (thanks to Tim Carroll for pointing this out).
+Outline-mode supports hiding and revealing text and other helpful
+ features beyond the scope of this document.
+See <a href="../emacs/Outline-Mode.html#Outline-Mode">Outline Mode: (emacs)Outline Mode</a> section `Outline Mode' in <cite>The Emacs Editor</cite>, for details.
+</p>
+<hr size="6">
+<a name="The-notes-index"></a>
+<a name="SEC12"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC11" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC13" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC9" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC9" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_3.html#SEC14" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 2.3 The notes index </h2>
+
+
+<p>The notes index lists all subjects you've kept notes about,
+ and each date of each note.
+Impress your friends,
+ show your advisor why you're worth the <em>big</em> peanuts,
+ you'll soon have the biggest index of all.
+</p>
+<p>The index has one line per subject, listing the subject
+ and each day a note was made about that subject.
+For example:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example">Bicycle: 950314, 950316
+Bicycle/maintenance/books: 951028
+Bridge/hands: 951113, 951114, 951116, 951117
+Bridge/UCLA: 960222, 960409
+</pre></td></tr></table>
+
+<p>Clicking on any of the dates with <kbd>mouse-2</kbd>
+ will take you to that note
+ (<code>notes-index-mouse-follow-link</code>).
+(You can also move the point over the date and hit <kbd>&lt;RTN&gt;</kbd>
+ if you're musaphobic [<code>notes-index-follow-link</code>].)
+<a name="IDX11"></a>
+<a name="IDX12"></a>
+</p>
+<p>The notes index is automatically updated by the program &lsquo;<tt>mkall</tt>&rsquo;.
+Typically &lsquo;<tt>mkall</tt>&rsquo; is run nightly by &lsquo;<tt>cron</tt>&rsquo;.
+On most modern versions of Unix, you can add this command to cron by
+ running &lsquo;<tt>crontab -e</tt>&rsquo; and adding the line:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example">0 4 * * * /usr/local/lib/notes-mode/mkall
+</pre></td></tr></table>
+<a name="IDX13"></a>
+<a name="IDX14"></a>
+<a name="IDX15"></a>
+
+<p>(Assuming that your notes programs are installed
+ in /usr/local/lib/notes-mode, the default location.)
+</p>
+
+<hr size="6">
+<a name="The-notes-directories"></a>
+<a name="SEC13"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC12" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_3.html#SEC14" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC9" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC9" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_3.html#SEC14" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 2.4 The notes directories </h2>
+
+
+<p>The final thing needed to tie basic notes-mode together his how
+the pieces fit together.
+Since my graduate work is in file systems,
+you can bet that directories are involved.
+</p>
+<p>Notes-mode keeps its files in a two-level hierarchy:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example">~/NOTES
+~/NOTES/index
+~/NOTES/rawindex
+~/NOTES/199603
+~/NOTES/199603/960329
+~/NOTES/199603/960330
+~/NOTES/199604
+~/NOTES/199604/960401
+</pre></td></tr></table>
+
+<p>The top level, &lsquo;<tt>~/NOTES</tt>&rsquo;, is the notes directory.
+It keeps all notes in one place.
+(The name of this directory is configurable, See section <a href="notes-mode_3.html#SEC21">Notes-mode configuration</a>.)
+</p>
+<p>Inside the notes directory are two files and a number of directories.
+The files are &lsquo;<tt>index</tt>&rsquo;,
+ the index of all entries (see section <a href="#SEC12">The notes index</a>),
+ and &lsquo;<tt>rawindex</tt>&rsquo;,
+ used internally.
+<a name="IDX16"></a>
+</p>
+<p>The notes directory also contains a number of subdirectories,
+ sometimes called <em>intermediate directories</em>.
+These directories group the actual notes files into manageable chunks,
+ keeping any directory from getting too large.
+Intermediate directories are named
+ by the four-digit year and the two-digit month
+ of the entries they contain.
+(The format of intermediate directories
+ is configurable, See section <a href="notes-mode_3.html#SEC21">Notes-mode configuration</a>.)
+<a name="IDX17"></a>
+</p>
+<p>Finally,
+ each intermediate directory are the notes files themselves,
+ named according to the two-digit year, month, and day-of-month.
+<a name="IDX18"></a>
+</p>
+<p>For the most part,
+ notes-mode will automatically maintain this organization of files,
+ once you create the top-level directory.
+Notes-mode will also automatically insure
+ that all files in the notes directory are unreadable by
+ anyone other than their owner.
+Notes are personal things.
+(This behavior is not currently configurable,
+ but it probably should be.)
+<a name="IDX19"></a>
+</p>
+
+
+<hr size="6">
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC9" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_3.html#SEC14" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<p>
+ <font size="-1">
+  This document was generated by <em>John Heidemann</em> on <em>August, 8 2008</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.78</em></a>.
+ </font>
+ <br>
+
+</p>
+</body>
+</html>
diff --git a/packages/notes-mode/HTML/notes-mode/notes-mode_3.html b/packages/notes-mode/HTML/notes-mode/notes-mode_3.html
new file mode 100644 (file)
index 0000000..fef21b8
--- /dev/null
@@ -0,0 +1,505 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+<html>
+<!-- Created on August, 8 2008 by texi2html 1.78 -->
+<!--
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<head>
+<title>Notes-mode: 3. Advanced Features</title>
+
+<meta name="description" content="Notes-mode: 3. Advanced Features">
+<meta name="keywords" content="Notes-mode: 3. Advanced Features">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="texi2html 1.78">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+pre.display {font-family: serif}
+pre.format {font-family: serif}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+pre.smalldisplay {font-family: serif; font-size: smaller}
+pre.smallexample {font-size: smaller}
+pre.smallformat {font-family: serif; font-size: smaller}
+pre.smalllisp {font-size: smaller}
+span.roman {font-family:serif; font-weight:normal;}
+span.sansserif {font-family:sans-serif; font-weight:normal;}
+ul.toc {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+
+<a name="Advanced-Features"></a>
+<a name="SEC14"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="notes-mode_2.html#SEC13" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC15" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode_2.html#SEC9" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_4.html#SEC22" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h1 class="chapter"> 3. Advanced Features </h1>
+
+<p>Notes-mode, the minutiae, and some other good stuff.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top"><a href="#SEC15">3.1 Notes files</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">                 
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC20">3.2 Notes indices</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">               
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC21">3.3 Notes-mode configuration</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">    
+</td></tr>
+</table>
+
+<hr size="6">
+<a name="Notes-files"></a>
+<a name="SEC15"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC14" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC16" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC14" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC14" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_4.html#SEC22" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 3.1 Notes files </h2>
+
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top"><a href="#SEC16">3.1.1 Getting around</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">              
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC17">3.1.2 Subject summary</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">             
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC18">3.1.3 Encryption</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">                  
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC19">3.1.4 Useful conventions</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">          
+</td></tr>
+</table>
+
+<hr size="6">
+<a name="Getting-around"></a>
+<a name="SEC16"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC15" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC17" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC14" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC15" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_4.html#SEC22" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h3 class="subsection"> 3.1.1 Getting around </h3>
+
+<p>Moving between notes entries and around the hierarchy is fairly common,
+ so there are some accelerators.
+</p>
+<dl compact="compact">
+<dt> <kbd>C-c C-i</kbd></dt>
+<dd><p>Jump to the index entry for the current entry's subject
+(<code>notes-goto-index-entry</code>).
+<a name="IDX20"></a>
+</p>
+</dd>
+<dt> <kbd>C-c C-n</kbd></dt>
+<dt> <kbd>C-c C-p</kbd></dt>
+<dd><p>Move to the next or prior note with the same subject
+(<code>notes-follow-next-link</code> and <code>notes-follow-prev-link</code>).
+These functions follow the links in the note,
+ if they're defined.
+If not,
+ they look through the index file.
+This approach usually works,
+ but will fail if there are multiple new entries created
+ with the given subject
+ between when the index is recomputed.
+<a name="IDX21"></a>
+<a name="IDX22"></a>
+</p>
+</dd>
+<dt> <kbd>C-c&lt;RTN&gt;</kbd></dt>
+<dd><p>Follow the link under the point
+(<code>notes-w3-follow-link</code>),
+ a keyboard equivalent of &lt;S-mouse-2&gt;.
+<a name="IDX23"></a>
+</p>
+</dd>
+<dt> <kbd>M-C-a</kbd></dt>
+<dt> <kbd>M-C-e</kbd></dt>
+<dd><p>Jump to the beginning or end of the current note entry
+(<code>notes-beginning-of-defun</code> and <code>notes-end-of-defun</code>).
+<a name="IDX24"></a>
+<a name="IDX25"></a>
+</p>
+</dd>
+<dt> <kbd>C-c C-k</kbd></dt>
+<dd><p>Copies the pseudo-URL for the current note into the kill-ring
+(<code>current-url-as-kill</code>).
+To link two entries, go to the target,
+ grab its URL with <kbd>C-c C-k</kbd>,
+ go to where you want to make the link,
+ and yank the URL with <kbd>C-y</kbd>.
+<a name="IDX26"></a>
+</p>
+</dd>
+</dl>
+
+
+<p>Notes mode supports imenu,
+ if you have it bound to something
+ (I use <code>(global-set-key [down-mouse-3] 'imenu)</code>).
+<a name="IDX27"></a>
+</p>
+
+<hr size="6">
+<a name="Subject-summary"></a>
+<a name="SEC17"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC16" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC18" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC14" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC15" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_4.html#SEC22" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h3 class="subsection"> 3.1.2 Subject summary </h3>
+
+<p>It's often helpful to look at all
+ entries for a given subject
+<kbd>C-c C-s</kbd>
+ collects all entries with the subject of the current
+ entry in a new buffer
+ (<code>notes-summarize-subject</code>).
+<a name="IDX28"></a>
+<a name="IDX29"></a>
+</p>
+
+<hr size="6">
+<a name="Encryption"></a>
+<a name="SEC18"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC17" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC19" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC14" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC15" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_4.html#SEC22" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h3 class="subsection"> 3.1.3 Encryption </h3>
+
+
+<p>Notes occasionally contain private material.
+While Unix has strong services for file protection
+ (compared to other, say, more wide-selling operating systems),
+ in many systems root passwords are shared,
+ while other systems are vulnerable to physical compromise.
+In such systems,
+ properly used encryption is the best approach to security.
+</p>
+<p>Notes-mode encryption is based
+ Phill Zimmerman's PGP (Pretty Good Privacy)
+(see &lsquo;<tt>http://www.mantis.co.uk/pgp/pgp.html</tt>&rsquo;)
+ and either
+ with Rick Campbell's
+ emacs interface, PAM (PGP Augmented Messaging)
+(from &lsquo;<tt>ftp://h.gp.cs.cmu.edu/usr/rfb/pam/</tt>&rsquo;)
+ (note that as of January 1997, PAM is no longer at this ftp site
+ and appears to not be publicly available),
+ or LoPresti and Choi's mailcrypt
+(from &lsquo;<tt>http://cag-www.lcs.mit.edu/mailcrypt/</tt>&rsquo;).
+<a name="IDX30"></a>
+<a name="IDX31"></a>
+<a name="IDX32"></a>
+<a name="IDX33"></a>
+<a name="IDX34"></a>
+</p>
+<dl compact="compact">
+<dt> <kbd>C-c C-e</kbd></dt>
+<dd><p>Encrypt the current note
+(<code>notes-encrypt-note</code>).
+By default this function encrypts the whole entry.
+With a prefix argument,
+ only the part from the point to the end of the entry is encrypted.
+<a name="IDX35"></a>
+</p>
+</dd>
+<dt> <kbd>C-c C-d</kbd></dt>
+<dd><p>Decrypt the current note
+(<code>notes-decrypt-note</code>).
+</p></dd>
+</dl>
+<a name="IDX36"></a>
+
+<p>By default notes-mode determines your public key by looking 
+ up your <code>user-full-name</code> in your PGP keyring.
+You can override this default by setting
+ <code>notes-encryption-key-id</code>
+ to the desired key-id.
+<a name="IDX37"></a>
+</p>
+
+<hr size="6">
+<a name="Useful-conventions"></a>
+<a name="SEC19"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC18" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC20" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC14" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC15" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_4.html#SEC22" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h3 class="subsection"> 3.1.4 Useful conventions </h3>
+
+
+
+<p>There are a number of conventions which can make notes-mode
+ easier to use.
+These conventions are a matter of personal taste,
+ of course.
+Do what works for you.
+</p>
+<p>First,
+ I find it helpful to keep the date of each notes-file at the top
+ of the file.
+This makes the file self-identifying
+ if the filename is lost.
+</p>
+<p>Second,
+ I find it useful to have the first entry of each file
+ have the same subject (perhaps &ldquo;Today&rdquo;).
+This entry then links all notes together,
+ making it easy to go to yesterday and tomorrow.
+I keep a to-do list on this entry,
+ bringing the list forward each day.
+<a name="IDX38"></a>
+</p>
+<p>A third useful convention is to keep an
+ entry with the name based on the day of the week
+ in each file.
+Analogous to &ldquo;Today&rdquo;, this entry links together
+ weeks.
+</p>
+<p>Notes-mode supports these conventions.
+When you make a new notes-file in emacs,
+ notes-mode searches for the preceding file.
+If it follows any of these conventions,
+ the new file is initialized appropriately.
+Currently
+ the approach to do this process
+ (in the program &lsquo;<tt>mknew</tt>&rsquo;)
+ is fairly sensitive,
+ so it may not work in all cases.
+In particular,
+ the date convention works only on
+ for English-language dates.
+(If you use notes-mode with a non-English language,
+ let me know and I'll work with you to fix this limitation.)
+</p>
+<p>If you find other helpful conventions,
+ please let me know.
+Modifications to &lsquo;<tt>mknew</tt>&rsquo; to implement
+ new conventions are also invited.
+</p>
+<p>If you don't want to use these conventions,
+ or if you want to use different ones,
+ set the emacs variable notes-mode-initialization-program
+ to nil or the name of your initialization program.
+<a name="IDX39"></a>
+</p>
+
+<hr size="6">
+<a name="Notes-indices"></a>
+<a name="SEC20"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC19" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC21" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC14" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC14" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_4.html#SEC22" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 3.2 Notes indices </h2>
+
+
+<p>Only two features of notes index mode haven't yet been described.
+First,
+ you can open any notes-file based on date
+ with <code>notes-index-link</code>,
+ normally bound to &lt;o&gt;.
+<a name="IDX40"></a>
+</p>
+<p>Second,
+ you can get a subject-summary
+ with &lt;C-c C-s&gt;
+ (see section <a href="#SEC17">Subject summary</a>).
+The subject defaults to that of the current index line.
+<a name="IDX41"></a>
+</p>
+
+<hr size="6">
+<a name="Notes_002dmode-configuration"></a>
+<a name="SEC21"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC20" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_4.html#SEC22" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC14" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC14" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_4.html#SEC22" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 3.3 Notes-mode configuration </h2>
+
+
+<p>Several aspects of notes mode are particularly visible
+ to the user.
+Because I'm not a fascist,
+ a user can change most of these.
+</p>
+<p>Preferences are specified in &lsquo;<tt>~/.notesrc</tt>&rsquo;.
+This file lists things to change:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"># lines beginning with a hash are comments
+dir: ~/NOTES
+int_form: %Y%m
+</pre></td></tr></table>
+
+<p>Currently, two things can be changed:
+</p>
+<dl compact="compact">
+<dt> <code>dir</code></dt>
+<dd><p>Specifies the root of the notes directory hierarchy
+ (see section <a href="notes-mode_2.html#SEC13">The notes directories</a>).
+</p>
+</dd>
+<dt> <code>int_form</code></dt>
+<dd><p>Specifies the form of the intermediate directory.
+A limited subset of <code>strftime(3)</code>
+ formatting is allowed.
+</p></dd>
+</dl>
+
+<p>The subset of <code>strftime(3)</code> supported in <code>int_form</code> is:
+</p><dl compact="compact">
+<dt> <code>%Y</code></dt>
+<dd><p>The four-digit year.
+</p>
+</dd>
+<dt> <code>%y</code></dt>
+<dd><p>The two-digit year.
+</p>
+</dd>
+<dt> <code>%m</code></dt>
+<dd><p>A two-digit numeric month.
+</p>
+</dd>
+<dt> <code>%d</code></dt>
+<dd><p>A two-digit day.
+</p></dd>
+</dl>
+
+<p>In addition to &lsquo;<tt>.notesrc</tt>&rsquo;,
+ there are a number of emacs-specific variables.
+These variables are documented in the file
+ &lsquo;<tt>notes-variables.el</tt>&rsquo;.
+</p>
+
+
+
+<hr size="6">
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC14" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_4.html#SEC22" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<p>
+ <font size="-1">
+  This document was generated by <em>John Heidemann</em> on <em>August, 8 2008</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.78</em></a>.
+ </font>
+ <br>
+
+</p>
+</body>
+</html>
diff --git a/packages/notes-mode/HTML/notes-mode/notes-mode_4.html b/packages/notes-mode/HTML/notes-mode/notes-mode_4.html
new file mode 100644 (file)
index 0000000..65b3686
--- /dev/null
@@ -0,0 +1,511 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+<html>
+<!-- Created on August, 8 2008 by texi2html 1.78 -->
+<!--
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<head>
+<title>Notes-mode: 4. History</title>
+
+<meta name="description" content="Notes-mode: 4. History">
+<meta name="keywords" content="Notes-mode: 4. History">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="texi2html 1.78">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+pre.display {font-family: serif}
+pre.format {font-family: serif}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+pre.smalldisplay {font-family: serif; font-size: smaller}
+pre.smallexample {font-size: smaller}
+pre.smallformat {font-family: serif; font-size: smaller}
+pre.smalllisp {font-size: smaller}
+span.roman {font-family:serif; font-weight:normal;}
+span.sansserif {font-family:sans-serif; font-weight:normal;}
+ul.toc {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+
+<a name="History"></a>
+<a name="SEC22"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="notes-mode_3.html#SEC21" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC23" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode_3.html#SEC14" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_5.html#SEC27" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h1 class="chapter"> 4. History </h1>
+
+<p>More about notes-mode than you wanted to know,
+and some thanks.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top"><a href="#SEC23">4.1 Notes-mode history</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">          
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC24">4.2 Credits</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">                     
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC25">4.3 Changes</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">                     
+</td></tr>
+<tr><td align="left" valign="top"><a href="#SEC26">4.4 Suggested features</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">                     
+</td></tr>
+</table>
+
+
+
+<hr size="6">
+<a name="Notes_002dmode-history"></a>
+<a name="SEC23"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC22" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC24" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC22" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC22" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_5.html#SEC27" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 4.1 Notes-mode history </h2>
+
+<p>Briefly,
+ I started keeping notes on-line shortly after I got a portable computer
+ in January, 1994.
+After a month-and-a-half of notes, I realized that
+ one does not live by grep alone,
+ so I started adding indexing facilities.
+</p>
+<p>In June of 1995
+ some other Ficus-project members started
+ keeping and indexing on-line notes
+ using other home-grown systems.
+After some discussion,
+ we generalized my notes-mode work and
+ they started using it.
+</p>
+<p>Over the next 18 months notes-mode grew.
+Finally, in April, 1996 I wrote documentation,
+ guaranteeing that innovation on notes-mode will now cease
+ or the documentation will become out of date.
+</p>
+
+<hr size="6">
+<a name="Credits"></a>
+<a name="SEC24"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC23" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC25" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC22" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC22" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_5.html#SEC27" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 4.2 Credits </h2>
+
+<p>I (John Heidemann, &lt;johnh@isi.edu&gt;)
+ started, documented, and currently maintain notes-mode.
+I take ultimate responsibility for the code,
+ especially for the ugly parts that I won't let others change.
+</p>
+<p>Ashvin Goel
+ &lt;ashvin@ficus.cs.ucla.edu&gt;
+ has been a very enthusiastic notes-mode user and contributor.
+He is responsible for at least
+ the ideas behind <code>notes-summarize-subject</code>
+and the ideas and initial implementations of
+ some of the original generalization and modularity improvements,
+ <code>notes-follow-next-link</code> and <code>notes-follow-prev-link</code>,
+ <code>notes-goto-index-entry</code>,
+ programmed subject completion,
+ and
+ context-sensitive mouse-2 handling.
+In addition,
+ he is an invaluable second opinion about
+ what and how things should be done
+ (even if I don't always agree with him).
+</p>
+<p>Geoff Kuenning
+ &lt;geoff@ficus.cs.ucla.edu&gt;
+ has been another enthusiastic notes-mode user and victim.
+He is responsible for
+ finding several bugs,
+ motivation for mouse-less operation,
+ comments about the documentation,
+ the day-of-week convention,
+ and an initial implementation and the idea of
+ multiple entries with the same subjects in a single notes-file.
+</p>
+<p>Ramesh Govindan &lt;govindan@isi.edu&gt; did the xemacs port.
+</p>
+<p>Since it's release on Usenet in April 1996 several
+ other folks have contributed.
+Thanks to
+ David Weisman &lt;weisman@app1.osf.org&gt;,
+ Martin L. Smith &lt;martin@ner.com&gt;,
+ Jason Bastek &lt;jason@aai.com&gt;,
+ Ulrich Herbst &lt;Ulrich.Herbst@t-systems.com&gt;.
+See the next section (See section <a href="#SEC25">Changes</a>.) for details of their exploits.
+</p>
+<p>Thanks to Larry Ayers &lt;layers@marktwain.net&gt;
+ for popularizing notes-mode with reviews in
+ the Linux Gazette
+ (at &lt;http://www.linuxgazette.com/issue22/notes-mode.html&gt; and
+ &lt;http://www.linuxgazette.com/issue35/ayers.html&gt;).
+</p>
+<hr size="6">
+<a name="Changes"></a>
+<a name="SEC25"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC24" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC26" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC22" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC22" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_5.html#SEC27" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 4.3 Changes </h2>
+
+<p>For the bored:
+</p>
+<p>First semi-public release. 12-Jul-95: version 0.1
+ Shared a version with Ashvin and Geoff.
+</p>
+<p>Changed  6-Dec-95: version 0.3
+ Ashvin's changes for note traversal added (C-c C-p and C-c C-n now
+move to the prev/next note in note-mode).
+ URL parsing changed so that &quot;localhost&quot; is optional.
+</p>
+<p>Changed 19-Dec-95:  version 0.4
+ More robust prev/next code added, both to handle going back and
+forward in the middle of chains through the index file, and to handle
+back/forward in a single file.
+ URL parsing changed so that notes-goto-index-entry correctly handles
+lookups on notes names such as &quot;252A&quot;.
+</p>
+<p>Changed 20-Dec-95: version 0.5.
+ Fixed a missing variable in notes-url.el.
+ Added a work-around to a bug in emacs-19.30's define-derived-mode.
+</p>
+<p>Changed 24-Dec-95: version 0.6.
+ Prev/next code re-re-written to be more robust.
+</p>
+<p>Changed 26-Dec-96:  version 0.7.
+ Bug fix release.
+</p>
+<p>Changed 23-Jan-96: version 0.8.
+ Initialization code added to set up a new note.
+New variable:  notes-bin-dir.
+</p>
+<p> I'm skipping version 0.9 because I erroneously release version 0.1
+as version 0.9 (only on the web, not on Usenet).
+</p>
+<p> I'm bumping from version &quot;0&quot; to version &quot;1&quot; since the code is has been
+in production use for more than a year by several people.  Minor
+numbers are the same.
+</p>
+<p>Changed 26-Mar-96: version 1.10.
+ Setup code completely re-written.
+ Several incompatible changes have been made:
+ - the lisp and Perl code must be installed via make install,
+not by copying.
+ - some data is specified in a .notesrc file; copy and modify sample.notesrc.
+ - several internal elisp changes.
+ - catsubject added (bound to C-cC-s):  collect all notes about the
+current subject.
+ - new notes-files are initialized with fields based on the prior
+day's notes; see mknew for details.
+ - daily_work is gone; mkall is rewritten to use .notesrc.
+</p>
+<p>Changed 29-Apr-96: version 1.11.
+ Real documentation.
+ Mknew caching added.
+</p>
+<p>Changed  9-Aug-96: version 1.12.
+ Added notesinit to do all setup for new users.
+</p>
+<p>Changed 24-Aug-96: version 1.13.
+ Minor documentation fixes.
+</p>
+<p>Changed 20-Dec-97: version 1.14.
+Autoconf support.
+</p>
+<p>Fontification of the index buffer is now pre-computed in perl
+other than done when the file is needed (in elisp with slow regular
+expressions).  2000-line index files are now 1-2 seconds rather than
+15-30 on a 100MHz Pentium.  If necessary (the
+pre-computed version isn't up-to-date) we fall back on the slower
+code.
+</p>
+<p>Related work improved (suggestion by David Weisman &lt;weisman@app1.osf.org&gt;).
+</p>
+<p>Documentation improvement (problem found by Martin L. Smith
+&lt;martin@ner.com&gt;).
+</p>
+<p>Installation improved (code by Jason Bastek &lt;jason@aai.com&gt;).
+</p>
+<p>Bug in notes-index mode with subjects containing colons fixed (johnh).
+</p>
+<p>Encryption now supports mailcrypt.el.
+</p>
+<p>Support for emacs 20 (a small font-lock change).
+</p>
+<p>Changed  5-Jan-98: version 1.15.
+Bug in decryption for non-PAM users fixed
+ (suggestion by Kevin Davidson &lt;tkld@quadstone.com&gt;).
+</p>
+<p>Y2K statement added
+ (suggestion by Kevin Davidson &lt;tkld@quadstone.com&gt;).
+</p>
+<p>Pointer to mailcrypt added (as a supported encryption package).
+Problem pointed out by K. Ueda &lt;kueda@jupiter.qse.tohoku.ac.jp&gt;.
+</p>
+<p>Changed  4-Nov-98: version 1.16.
+Bug in kill-ring handling of notes-old-underline-line
+ fixed by Tim Potter &lt;timp@jna.com.au&gt;.
+Bug in whitespace handling after PGP encryption fixed by Tim Potter.
+Bugs in handling of entries with hash signs in their name fixed
+ (found by Tim Potter).
+Fontification of index buffer further improved
+ (mapcar is your friend).
+Xemacs support added based on code contributed by Ramesh Govindan.
+</p>
+<p>Changed 28-Feb-99: version 1.17:
+Improvement:  notes-electric-return now fixes up the prev/next links
+ of new entries (only).  Code contributed by
+ Takashi Nishimoto.
+</p>
+<p>Bug fix:  reversed options -batch and -q in configure.in to placate
+ XEmacs 20.0; changed notesinit to not downcase the pathname
+ (bugs found by Thierry Bezecourt).
+</p>
+<p>Clarification: Autofilling of new notes more clear in the manual (hopefully,
+ suggested by Solofo Ramangalahy).
+</p>
+<p>Bug fix:  a y2k bug in was found and fixed in mkindex.  Sigh.
+</p>
+<p>New:  Two mailing lists for notes-mode have been created:
+&lsquo;<tt>notes-mode-announce@heidemann.la.ca.us</tt>&rsquo; and 
+&lsquo;<tt>notes-mode-talk@heidemann.la.ca.us</tt>&rsquo;.
+Send the line &ldquo;subscribe notes-mode-announce&rdquo;
+(or &ldquo;subscribe notes-mode-talk&rdquo;)
+to &lsquo;<tt>majordomo@heidemann.la.ca.us</tt>&rsquo;
+to join them.
+[<em>These instructions are now superceeded; to subscribe, go to
+&lsquo;<tt>http://www.heidemann.la.ca.us/mailman/listinfo/notes-mode-talk</tt>&rsquo;
+and
+&lsquo;<tt>http://www.heidemann.la.ca.us/mailman/listinfo/notes-mode-announce</tt>&rsquo;.</em>]
+</p>
+<p>Changed  6-Oct-99: version 1.18:
+Bug fix:  handling of electric-prevnext is better when there are
+ existing prev/next links.
+</p> 
+<p>Clarification: I added some pointers in the code to the installation
+ instructions.  (Apparently people can't RTF README.)
+</p>
+<p>Extension: mailcrypt-3.5.x suported including pgp, pgp5 and gpg.
+</p>
+<p>Changed (date 23-Dec-00): version 1.19:
+Bug fix (cosmetic): suppress comments in encrypted nodes.
+</p>
+<p>Install fixes from Kannan Varadhan: elisp directories changed on install.
+</p>
+<p>Added C-j as a synonym for RET in notes-mode to parallel C++ or perl mode.
+(Suggested by Fred Jaggi &lsquo;<tt>jaggi@rsn.hp.com</tt>&rsquo;.)
+</p>
+<p>Outline-minor-mode support added and documented.
+(Suggested by Tim Carroll &lsquo;<tt>tim@boomboom.com</tt>&rsquo;.)
+</p>
+<p>Bug/typo fixes in gpg support
+(Contributed by William A. Perkins &lsquo;<tt>wa_perkins@pnl.gov</tt>&rsquo;,
+with separate patches from Knut Anders Hatlen &lsquo;<tt>kahatlen@online.no</tt>&rsquo;.)
+</p>
+<p>Installation improvements suggested by Christophe Troestler
+&lsquo;<tt>Ch.Troestler@linkline.be</tt>&rsquo;:
+use install-info to update the info dir,
+warn users of &ndash;prefix that lisp files go elsewhere.
+</p>
+<p>Changed (date  1-Feb-01): version 1.20:
+Bug fix: missing file notes-first.el added to the distribution.
+(Bug found by Michael Totschnig &lsquo;<tt>michaelt@supernet.ca</tt>&rsquo;.)
+</p>
+<p>Changed ( 5-Dec-01): version 1.21:
+(backed-out&mdash;didn't work with spaced URLs) 
+URL lookup now uses thing-at-point.
+</p>
+<p>Fix to make notes-mode work with emacs-21.1
+(Fix from Klaus Zeitler  &lsquo;<tt>kzeitler@lucent.com</tt>&rsquo;.)
+</p>
+<p>Changed ( 3-Jan-02): version 1.22:
+Several bugs in &lsquo;<tt>notesinit</tt>&rsquo; for stricter Perl implementations
+(bug found by Paul Craven&quot; &lsquo;<tt>pcraven@yorku.ca</tt>&rsquo;,
+and Kasper van Wijk &lsquo;<tt>kasper@acoustics.mines.edu</tt>&rsquo;)
+and to make it run cleanly more often.
+</p>
+<p>Notes-first now autoinitializes notes mode from emacs.
+(As instisted by rms, unfortunately about two years later than requested.)
+</p>
+
+<p>Changed (20-Feb-05): version 1.23:
+Outline mode is now forcebly turned on to avoid interactions
+with user's text-mode hooks
+(bug and fix from Nils Ackermann &lsquo;<tt>nils@nieback.de</tt>&rsquo;).
+</p>
+<p>Install bug involving ordering of scripts and byte-compilation
+fixed (bug and fix from Mark Allman &lsquo;<tt>mallman@grc.nasa.gov</tt>&rsquo;).
+</p>
+<p>Fix obscure bug in configure, reported by Klaus Zeitler &lsquo;<tt>kzeitler@lucent.com</tt>&rsquo;.
+</p>
+<p>Fix for notes-summarize-subject when no subject is specified (bug and fix
+from Geoff Kuenning).
+</p>
+<p>Changed (14-Jan-06): version 1.24:
+</p>
+<p>install-info bug documented with the Debian install-info
+(bug reported by Aaron Falk &lsquo;<tt>falk@isi.edu</tt>&rsquo;).
+</p>
+<p>Automatic date completion in new days is now done in the current
+locale, so it should now work for non-English languages.  Bug reported
+by Torsten Bronger &lsquo;<tt>bronger@physik.rwth-aachen.de</tt>&rsquo;.
+</p>
+<p>Fixed a bug in mkindexcache, triggered by subjects with percent signs
+in them.  Bug reported by Philip Austin &lsquo;<tt>paustin@eos.ubc.ca</tt>&rsquo;.
+</p>
+<p>We're a bit more robust about subjects, I hope.  Warnings should
+appear about embedded number signs, and leading spaces should be
+filtered.  Bug reported by Philip Austin &lsquo;<tt>paustin@eos.ubc.ca</tt>&rsquo;.
+</p>
+<p>Notes-mode now dervies from indented-text-mode rather than
+paragraph-indent-text mode.  Unfortunatley this is not customizable
+because of limitations of define-derived-mode.  Change suggested by
+Aaron Falk &lsquo;<tt>falk@isi.edu</tt>&rsquo;.
+</p>
+<p>Provide better hints about how to get started after installation or
+running notes-mode in emacs for the first time.
+</p>
+<p>In notes init, the default path for dir was the full path, not the tilde
+version of the path.  Now it defaults to using tidle for home
+directory.  Bug reported by Mark Allman &lsquo;<tt>allman@icir.org</tt>&rsquo;.
+</p>
+<p>Changed (26-May-06): version 1.25:
+</p>
+<p>fixed a bug in the release tar.gz file that had a additional copies
+copy nested.
+</p>
+<p>Changed (30-Jun-08): version 1.26:
+</p>
+<p>Force unicode I/O in &lsquo;<tt>mkindexcache</tt>&rsquo; to fix highlighting mis-alignment
+when using emacs-21 with unicode subject lines.
+</p>
+<p>Changed mkprevnext and mkrawindex to optionally take the list of notes files
+to index from stdin rather than from the command line.  Yes, I finally
+have 4093 notes files, overflowing the Unix command line buffer.
+</p>
+<p>Changes notes-mode.el to put path in quotes, allowing spaces to appear in home directory names (bug fix from Ulrich Herbst).
+</p>
+<p>Added a suggested features section.
+</p>
+<p>Changed ( 8-Aug-08): version 1.27:
+</p>
+<p>Change I/O in &lsquo;<tt>mkindexcache</tt>&rsquo; to use locale (the sadly correct thing)
+rather than forcing utf-8 (the Righteous Path).
+Bug report from Geoff Kuenning, a man with an older Unix environment than I.
+</p>
+
+<hr size="6">
+<a name="Suggested-features"></a>
+<a name="SEC26"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC25" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_5.html#SEC27" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#SEC22" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#SEC22" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_5.html#SEC27" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h2 class="section"> 4.4 Suggested features </h2>
+
+<p>Features suggested by users but not yet implemented:
+</p>
+<p>21-Feb-08: (from Xavier Maillard): should support &ldquo;disconnected&rdquo; notes that
+are indexed but not date-based.
+</p>
+<p>21-Feb-08: (from John Heidemann): should switch all notes files to have an extension (maybe &lsquo;<tt>.notes</tt>&rsquo;).
+</p>
+
+<hr size="6">
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC22" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_5.html#SEC27" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<p>
+ <font size="-1">
+  This document was generated by <em>John Heidemann</em> on <em>August, 8 2008</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.78</em></a>.
+ </font>
+ <br>
+
+</p>
+</body>
+</html>
diff --git a/packages/notes-mode/HTML/notes-mode/notes-mode_5.html b/packages/notes-mode/HTML/notes-mode/notes-mode_5.html
new file mode 100644 (file)
index 0000000..7bb3c6b
--- /dev/null
@@ -0,0 +1,124 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+<html>
+<!-- Created on August, 8 2008 by texi2html 1.78 -->
+<!--
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<head>
+<title>Notes-mode: 5. Installation</title>
+
+<meta name="description" content="Notes-mode: 5. Installation">
+<meta name="keywords" content="Notes-mode: 5. Installation">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="texi2html 1.78">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+pre.display {font-family: serif}
+pre.format {font-family: serif}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+pre.smalldisplay {font-family: serif; font-size: smaller}
+pre.smallexample {font-size: smaller}
+pre.smallformat {font-family: serif; font-size: smaller}
+pre.smalllisp {font-size: smaller}
+span.roman {font-family:serif; font-weight:normal;}
+span.sansserif {font-family:sans-serif; font-weight:normal;}
+ul.toc {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+
+<a name="Installation"></a>
+<a name="SEC27"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="notes-mode_4.html#SEC26" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode_4.html#SEC22" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h1 class="chapter"> 5. Installation </h1>
+
+<p>To install notes-mode,
+</p>
+<ol>
+<li>
+Unpack and extract the distribution
+(gunzip notes-mode-xxx.tar.gz; tar xvf notes-mode-xxx.tar; cd notes-mode-xxx).
+
+</li><li>
+Run configure (./configure).
+
+</li><li>
+Type &ldquo;make install&rdquo;.
+</li></ol>
+
+<p>(To control what's installed where, use &ndash;prefix=/where, or
+&ndash;with-lisp-dir=/where, &ndash;datadir=/where (for scripts),
+and &ndash;infodir=/where.)
+</p>
+<p>For each user:
+</p><ol>
+<li>
+Run notesinit
+</li></ol>
+
+<p>If you have problems with paths being incorrect, please be aware that
+you <em>cannot</em> run notes directly out of where you untar it.  The
+installation process customizes the programs for where things are on
+your system.
+Make sure you move out of the directory where you untarred it
+before running it.
+</p>
+
+<p>The most recent distribution of notes-mode 
+ is always available via
+ &lsquo;<tt>http://www.isi.edu/~johnh/SOFTWARE/NOTES_MODE/</tt>&rsquo;.
+</p>
+
+
+<hr size="6">
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="notes-mode_4.html#SEC22" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<p>
+ <font size="-1">
+  This document was generated by <em>John Heidemann</em> on <em>August, 8 2008</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.78</em></a>.
+ </font>
+ <br>
+
+</p>
+</body>
+</html>
diff --git a/packages/notes-mode/HTML/notes-mode/notes-mode_6.html b/packages/notes-mode/HTML/notes-mode/notes-mode_6.html
new file mode 100644 (file)
index 0000000..34ee2aa
--- /dev/null
@@ -0,0 +1,149 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+<html>
+<!-- Created on August, 8 2008 by texi2html 1.78 -->
+<!--
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<head>
+<title>Notes-mode: Keystroke index</title>
+
+<meta name="description" content="Notes-mode: Keystroke index">
+<meta name="keywords" content="Notes-mode: Keystroke index">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="texi2html 1.78">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+pre.display {font-family: serif}
+pre.format {font-family: serif}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+pre.smalldisplay {font-family: serif; font-size: smaller}
+pre.smallexample {font-size: smaller}
+pre.smallformat {font-family: serif; font-size: smaller}
+pre.smalllisp {font-size: smaller}
+span.roman {font-family:serif; font-weight:normal;}
+span.sansserif {font-family:sans-serif; font-weight:normal;}
+ul.toc {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+
+<a name="Keystroke-index"></a>
+<a name="SEC28"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="notes-mode_5.html#SEC27" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_7.html#SEC29" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode_5.html#SEC27" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_7.html#SEC29" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC28" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h1 class="unnumbered"> Keystroke index </h1>
+
+<p>This index lists notes-mode keystrokes.
+</p>
+<table><tr><th valign="top">Jump to: &nbsp; </th><td><a href="#SEC28_0" class="summary-letter"><b>C</b></a>
+ &nbsp; 
+<a href="#SEC28_1" class="summary-letter"><b>M</b></a>
+ &nbsp; 
+<a href="#SEC28_2" class="summary-letter"><b>O</b></a>
+ &nbsp; 
+<a href="#SEC28_3" class="summary-letter"><b>R</b></a>
+ &nbsp; 
+<a href="#SEC28_4" class="summary-letter"><b>S</b></a>
+ &nbsp; 
+<a href="#SEC28_5" class="summary-letter"><b>T</b></a>
+ &nbsp; 
+</td></tr></table>
+<table border="0" class="index-ky">
+<tr><td></td><th align="left">Index Entry</th><th align="left"> Section</th></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC28_0">C</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#IDX36"><code>C-c C-d</code></a></td><td valign="top"><a href="notes-mode_3.html#SEC18">3.1.3 Encryption</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#IDX35"><code>C-c C-e</code></a></td><td valign="top"><a href="notes-mode_3.html#SEC18">3.1.3 Encryption</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#IDX20"><code>C-c C-i</code></a></td><td valign="top"><a href="notes-mode_3.html#SEC16">3.1.1 Getting around</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#IDX26"><code>C-c C-k</code></a></td><td valign="top"><a href="notes-mode_3.html#SEC16">3.1.1 Getting around</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#IDX21"><code>C-c C-n</code></a></td><td valign="top"><a href="notes-mode_3.html#SEC16">3.1.1 Getting around</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#IDX22"><code>C-c C-p</code></a></td><td valign="top"><a href="notes-mode_3.html#SEC16">3.1.1 Getting around</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#IDX28"><code>C-c C-s</code></a></td><td valign="top"><a href="notes-mode_3.html#SEC17">3.1.2 Subject summary</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#IDX41"><code>C-c C-s</code></a></td><td valign="top"><a href="notes-mode_3.html#SEC20">3.2 Notes indices</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#IDX23"><code>C-c&lt;RTN&gt;</code></a></td><td valign="top"><a href="notes-mode_3.html#SEC16">3.1.1 Getting around</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC28_1">M</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#IDX24"><code>M-C-a</code></a></td><td valign="top"><a href="notes-mode_3.html#SEC16">3.1.1 Getting around</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#IDX25"><code>M-C-e</code></a></td><td valign="top"><a href="notes-mode_3.html#SEC16">3.1.1 Getting around</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#IDX11"><code>mouse-2</code></a></td><td valign="top"><a href="notes-mode_2.html#SEC12">2.3 The notes index</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC28_2">O</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#IDX40"><code>o</code></a></td><td valign="top"><a href="notes-mode_3.html#SEC20">3.2 Notes indices</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC28_3">R</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#IDX3"><code>RTN</code></a></td><td valign="top"><a href="notes-mode_2.html#SEC11">2.2 A notes file</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#IDX12"><code>RTN</code></a></td><td valign="top"><a href="notes-mode_2.html#SEC12">2.3 The notes index</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC28_4">S</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#IDX8"><code>S-mouse-2</code></a></td><td valign="top"><a href="notes-mode_2.html#SEC11">2.2 A notes file</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC28_5">T</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#IDX4"><code>TAB</code></a></td><td valign="top"><a href="notes-mode_2.html#SEC11">2.2 A notes file</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+</table>
+<table><tr><th valign="top">Jump to: &nbsp; </th><td><a href="#SEC28_0" class="summary-letter"><b>C</b></a>
+ &nbsp; 
+<a href="#SEC28_1" class="summary-letter"><b>M</b></a>
+ &nbsp; 
+<a href="#SEC28_2" class="summary-letter"><b>O</b></a>
+ &nbsp; 
+<a href="#SEC28_3" class="summary-letter"><b>R</b></a>
+ &nbsp; 
+<a href="#SEC28_4" class="summary-letter"><b>S</b></a>
+ &nbsp; 
+<a href="#SEC28_5" class="summary-letter"><b>T</b></a>
+ &nbsp; 
+</td></tr></table>
+
+
+<hr size="6">
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="notes-mode_5.html#SEC27" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_7.html#SEC29" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC28" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<p>
+ <font size="-1">
+  This document was generated by <em>John Heidemann</em> on <em>August, 8 2008</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.78</em></a>.
+ </font>
+ <br>
+
+</p>
+</body>
+</html>
diff --git a/packages/notes-mode/HTML/notes-mode/notes-mode_7.html b/packages/notes-mode/HTML/notes-mode/notes-mode_7.html
new file mode 100644 (file)
index 0000000..eb20b12
--- /dev/null
@@ -0,0 +1,220 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+<html>
+<!-- Created on August, 8 2008 by texi2html 1.78 -->
+<!--
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<head>
+<title>Notes-mode: Concept index</title>
+
+<meta name="description" content="Notes-mode: Concept index">
+<meta name="keywords" content="Notes-mode: Concept index">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="texi2html 1.78">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+pre.display {font-family: serif}
+pre.format {font-family: serif}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+pre.smalldisplay {font-family: serif; font-size: smaller}
+pre.smallexample {font-size: smaller}
+pre.smallformat {font-family: serif; font-size: smaller}
+pre.smalllisp {font-size: smaller}
+span.roman {font-family:serif; font-weight:normal;}
+span.sansserif {font-family:sans-serif; font-weight:normal;}
+ul.toc {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+
+<a name="Concept-index"></a>
+<a name="SEC29"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[ &gt; ]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[ &gt;&gt; ]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h1 class="unnumbered"> Concept index </h1>
+
+<p>This index lists notes-mode concepts.
+</p>
+<table><tr><th valign="top">Jump to: &nbsp; </th><td><a href="#SEC29_0" class="summary-letter"><b>.</b></a>
+ &nbsp; 
+<br>
+<a href="#SEC29_1" class="summary-letter"><b>C</b></a>
+ &nbsp; 
+<a href="#SEC29_2" class="summary-letter"><b>D</b></a>
+ &nbsp; 
+<a href="#SEC29_3" class="summary-letter"><b>E</b></a>
+ &nbsp; 
+<a href="#SEC29_4" class="summary-letter"><b>F</b></a>
+ &nbsp; 
+<a href="#SEC29_5" class="summary-letter"><b>I</b></a>
+ &nbsp; 
+<a href="#SEC29_6" class="summary-letter"><b>K</b></a>
+ &nbsp; 
+<a href="#SEC29_7" class="summary-letter"><b>M</b></a>
+ &nbsp; 
+<a href="#SEC29_8" class="summary-letter"><b>N</b></a>
+ &nbsp; 
+<a href="#SEC29_9" class="summary-letter"><b>P</b></a>
+ &nbsp; 
+<a href="#SEC29_10" class="summary-letter"><b>R</b></a>
+ &nbsp; 
+<a href="#SEC29_11" class="summary-letter"><b>S</b></a>
+ &nbsp; 
+<a href="#SEC29_12" class="summary-letter"><b>T</b></a>
+ &nbsp; 
+<a href="#SEC29_13" class="summary-letter"><b>U</b></a>
+ &nbsp; 
+</td></tr></table>
+<table border="0" class="index-cp">
+<tr><td></td><th align="left">Index Entry</th><th align="left"> Section</th></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC29_0">.</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#SEC21">.notesrc</a></td><td valign="top"><a href="notes-mode_3.html#SEC21">3.3 Notes-mode configuration</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC29_1">C</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#SEC21">configuration</a></td><td valign="top"><a href="notes-mode_3.html#SEC21">3.3 Notes-mode configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#SEC19">conventions</a></td><td valign="top"><a href="notes-mode_3.html#SEC19">3.1.4 Useful conventions</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#IDX13">Crontab</a></td><td valign="top"><a href="notes-mode_2.html#SEC12">2.3 The notes index</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC29_2">D</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#SEC18">Decryption</a></td><td valign="top"><a href="notes-mode_3.html#SEC18">3.1.3 Encryption</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#SEC13">Directory hierarchy</a></td><td valign="top"><a href="notes-mode_2.html#SEC13">2.4 The notes directories</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC29_3">E</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#SEC18">Encryption</a></td><td valign="top"><a href="notes-mode_3.html#SEC18">3.1.3 Encryption</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC29_4">F</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#IDX10">Font matter</a></td><td valign="top"><a href="notes-mode_2.html#SEC11">2.2 A notes file</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC29_5">I</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#IDX27">imenu</a></td><td valign="top"><a href="notes-mode_3.html#SEC16">3.1.1 Getting around</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#IDX17">Intermediate directories</a></td><td valign="top"><a href="notes-mode_2.html#SEC13">2.4 The notes directories</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC29_6">K</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#IDX37">key-id</a></td><td valign="top"><a href="notes-mode_3.html#SEC18">3.1.3 Encryption</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC29_7">M</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#IDX34">mailcrypt</a></td><td valign="top"><a href="notes-mode_3.html#SEC18">3.1.3 Encryption</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#IDX14">mkall</a></td><td valign="top"><a href="notes-mode_2.html#SEC12">2.3 The notes index</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#SEC19">mknew</a></td><td valign="top"><a href="notes-mode_3.html#SEC19">3.1.4 Useful conventions</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC29_8">N</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#SEC13">Notes directories</a></td><td valign="top"><a href="notes-mode_2.html#SEC13">2.4 The notes directories</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#IDX1">Notes entries</a></td><td valign="top"><a href="notes-mode_2.html#SEC11">2.2 A notes file</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#IDX19">Notes file permissions</a></td><td valign="top"><a href="notes-mode_2.html#SEC13">2.4 The notes directories</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#SEC11">Notes files</a></td><td valign="top"><a href="notes-mode_2.html#SEC11">2.2 A notes file</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#IDX18">Notes files</a></td><td valign="top"><a href="notes-mode_2.html#SEC13">2.4 The notes directories</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#IDX9">Notes files, font matter</a></td><td valign="top"><a href="notes-mode_2.html#SEC11">2.2 A notes file</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#SEC12">Notes index</a></td><td valign="top"><a href="notes-mode_2.html#SEC12">2.3 The notes index</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#IDX5">Notes links</a></td><td valign="top"><a href="notes-mode_2.html#SEC11">2.2 A notes file</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#IDX2">Notes subjects</a></td><td valign="top"><a href="notes-mode_2.html#SEC11">2.2 A notes file</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#IDX39">notes-mode-initialization-program</a></td><td valign="top"><a href="notes-mode_3.html#SEC19">3.1.4 Useful conventions</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#SEC10">notesinit</a></td><td valign="top"><a href="notes-mode_2.html#SEC10">2.1 Getting started</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC29_9">P</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#IDX32">PAM</a></td><td valign="top"><a href="notes-mode_3.html#SEC18">3.1.3 Encryption</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#IDX30">PGP</a></td><td valign="top"><a href="notes-mode_3.html#SEC18">3.1.3 Encryption</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#IDX33">PGP Augmented Messaging</a></td><td valign="top"><a href="notes-mode_3.html#SEC18">3.1.3 Encryption</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#IDX31">Pretty good privacy</a></td><td valign="top"><a href="notes-mode_3.html#SEC18">3.1.3 Encryption</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#IDX6">Pseudo-URLs</a></td><td valign="top"><a href="notes-mode_2.html#SEC11">2.2 A notes file</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC29_10">R</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#IDX15">re-indexing</a></td><td valign="top"><a href="notes-mode_2.html#SEC12">2.3 The notes index</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#IDX16">Root directory</a></td><td valign="top"><a href="notes-mode_2.html#SEC13">2.4 The notes directories</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC29_11">S</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#SEC10">setup</a></td><td valign="top"><a href="notes-mode_2.html#SEC10">2.1 Getting started</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#IDX29">Subject summary</a></td><td valign="top"><a href="notes-mode_3.html#SEC17">3.1.2 Subject summary</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC29_12">T</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#IDX38">Today</a></td><td valign="top"><a href="notes-mode_3.html#SEC19">3.1.4 Useful conventions</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC29_13">U</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#IDX7">URLs</a></td><td valign="top"><a href="notes-mode_2.html#SEC11">2.2 A notes file</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+</table>
+<table><tr><th valign="top">Jump to: &nbsp; </th><td><a href="#SEC29_0" class="summary-letter"><b>.</b></a>
+ &nbsp; 
+<br>
+<a href="#SEC29_1" class="summary-letter"><b>C</b></a>
+ &nbsp; 
+<a href="#SEC29_2" class="summary-letter"><b>D</b></a>
+ &nbsp; 
+<a href="#SEC29_3" class="summary-letter"><b>E</b></a>
+ &nbsp; 
+<a href="#SEC29_4" class="summary-letter"><b>F</b></a>
+ &nbsp; 
+<a href="#SEC29_5" class="summary-letter"><b>I</b></a>
+ &nbsp; 
+<a href="#SEC29_6" class="summary-letter"><b>K</b></a>
+ &nbsp; 
+<a href="#SEC29_7" class="summary-letter"><b>M</b></a>
+ &nbsp; 
+<a href="#SEC29_8" class="summary-letter"><b>N</b></a>
+ &nbsp; 
+<a href="#SEC29_9" class="summary-letter"><b>P</b></a>
+ &nbsp; 
+<a href="#SEC29_10" class="summary-letter"><b>R</b></a>
+ &nbsp; 
+<a href="#SEC29_11" class="summary-letter"><b>S</b></a>
+ &nbsp; 
+<a href="#SEC29_12" class="summary-letter"><b>T</b></a>
+ &nbsp; 
+<a href="#SEC29_13" class="summary-letter"><b>U</b></a>
+ &nbsp; 
+</td></tr></table>
+
+
+
+
+<hr size="6">
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[ &gt;&gt; ]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<p>
+ <font size="-1">
+  This document was generated by <em>John Heidemann</em> on <em>August, 8 2008</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.78</em></a>.
+ </font>
+ <br>
+
+</p>
+</body>
+</html>
diff --git a/packages/notes-mode/HTML/notes-mode/notes-mode_abt.html b/packages/notes-mode/HTML/notes-mode/notes-mode_abt.html
new file mode 100644 (file)
index 0000000..c44cb63
--- /dev/null
@@ -0,0 +1,167 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+<html>
+<!-- Created on August, 8 2008 by texi2html 1.78 -->
+<!--
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<head>
+<title>Notes-mode: About This Document</title>
+
+<meta name="description" content="Notes-mode: About This Document">
+<meta name="keywords" content="Notes-mode: About This Document">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="texi2html 1.78">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+pre.display {font-family: serif}
+pre.format {font-family: serif}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+pre.smalldisplay {font-family: serif; font-size: smaller}
+pre.smallexample {font-size: smaller}
+pre.smallformat {font-family: serif; font-size: smaller}
+pre.smalllisp {font-size: smaller}
+span.roman {font-family:serif; font-weight:normal;}
+span.sansserif {font-family:sans-serif; font-weight:normal;}
+ul.toc {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+
+<a name="SEC_About"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h1>About This Document</h1>
+<p>
+  This document was generated by <em>John Heidemann</em> on <em>August, 8 2008</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.78</em></a>.
+</p>
+<p>
+  The buttons in the navigation panels have the following meaning:
+</p>
+<table border="1">
+  <tr>
+    <th> Button </th>
+    <th> Name </th>
+    <th> Go to </th>
+    <th> From 1.2.3 go to</th>
+  </tr>
+  <tr>
+    <td align="center"> [ &lt; ] </td>
+    <td align="center">Back</td>
+    <td>Previous section in reading order</td>
+    <td>1.2.2</td>
+  </tr>
+  <tr>
+    <td align="center"> [ &gt; ] </td>
+    <td align="center">Forward</td>
+    <td>Next section in reading order</td>
+    <td>1.2.4</td>
+  </tr>
+  <tr>
+    <td align="center"> [ &lt;&lt; ] </td>
+    <td align="center">FastBack</td>
+    <td>Beginning of this chapter or previous chapter</td>
+    <td>1</td>
+  </tr>
+  <tr>
+    <td align="center"> [ Up ] </td>
+    <td align="center">Up</td>
+    <td>Up section</td>
+    <td>1.2</td>
+  </tr>
+  <tr>
+    <td align="center"> [ &gt;&gt; ] </td>
+    <td align="center">FastForward</td>
+    <td>Next chapter</td>
+    <td>2</td>
+  </tr>
+  <tr>
+    <td align="center"> [Top] </td>
+    <td align="center">Top</td>
+    <td>Cover (top) of document</td>
+    <td> &nbsp; </td>
+  </tr>
+  <tr>
+    <td align="center"> [Contents] </td>
+    <td align="center">Contents</td>
+    <td>Table of contents</td>
+    <td> &nbsp; </td>
+  </tr>
+  <tr>
+    <td align="center"> [Index] </td>
+    <td align="center">Index</td>
+    <td>Index</td>
+    <td> &nbsp; </td>
+  </tr>
+  <tr>
+    <td align="center"> [ ? ] </td>
+    <td align="center">About</td>
+    <td>About (help)</td>
+    <td> &nbsp; </td>
+  </tr>
+</table>
+
+<p>
+  where the <strong> Example </strong> assumes that the current position is at <strong> Subsubsection One-Two-Three </strong> of a document of the following structure:
+</p>
+
+<ul>
+  <li> 1. Section One
+    <ul>
+      <li>1.1 Subsection One-One
+        <ul>
+          <li>...</li>
+        </ul>
+      </li>
+      <li>1.2 Subsection One-Two
+        <ul>
+          <li>1.2.1 Subsubsection One-Two-One</li>
+          <li>1.2.2 Subsubsection One-Two-Two</li>
+          <li>1.2.3 Subsubsection One-Two-Three &nbsp; &nbsp;
+            <strong>&lt;== Current Position </strong></li>
+          <li>1.2.4 Subsubsection One-Two-Four</li>
+        </ul>
+      </li>
+      <li>1.3 Subsection One-Three
+        <ul>
+          <li>...</li>
+        </ul>
+      </li>
+      <li>1.4 Subsection One-Four</li>
+    </ul>
+  </li>
+</ul>
+
+<hr size="1">
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<p>
+ <font size="-1">
+  This document was generated by <em>John Heidemann</em> on <em>August, 8 2008</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.78</em></a>.
+ </font>
+ <br>
+
+</p>
+</body>
+</html>
diff --git a/packages/notes-mode/HTML/notes-mode/notes-mode_fot.html b/packages/notes-mode/HTML/notes-mode/notes-mode_fot.html
new file mode 100644 (file)
index 0000000..ab85b1c
--- /dev/null
@@ -0,0 +1,85 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+<html>
+<!-- Created on August, 8 2008 by texi2html 1.78 -->
+<!--
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<head>
+<title>Notes-mode: Footnotes</title>
+
+<meta name="description" content="Notes-mode: Footnotes">
+<meta name="keywords" content="Notes-mode: Footnotes">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="texi2html 1.78">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+pre.display {font-family: serif}
+pre.format {font-family: serif}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+pre.smalldisplay {font-family: serif; font-size: smaller}
+pre.smallexample {font-size: smaller}
+pre.smallformat {font-family: serif; font-size: smaller}
+pre.smalllisp {font-size: smaller}
+span.roman {font-family:serif; font-weight:normal;}
+span.sansserif {font-family:sans-serif; font-weight:normal;}
+ul.toc {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+
+<a name="SEC_Foot"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h1>Footnotes</h1>
+<h3><a name="FOOT1" href="notes-mode_1.html#DOCF1">(1)</a></h3>
+<p>Trademarked, in Great Britain, Sunone tells me.
+</p><h3><a name="FOOT2" href="notes-mode_1.html#DOCF2">(2)</a></h3>
+<p>I consider myself pretty anal about this subject,
+often typing notes in from paper after-the-fact,
+and <em>I</em> certainly don't manage to back-enter
+my notes all time time.
+</p><h3><a name="FOOT3" href="notes-mode_1.html#DOCF3">(3)</a></h3>
+
+<p>On the other hand, some folks at MIT are working
+on this problem from both the hardware and the social side of
+things (&lsquo;<tt>http://wearables.www.media.mit.edu/projects/wearables/</tt>&rsquo;)
+(Perhaps they have wild parties with computers, too.)
+</p><h3><a name="FOOT4" href="notes-mode_1.html#DOCF4">(4)</a></h3>
+<p>My hat is off to Rosa Parks
+and the many other normal people who triggered landmark cases.
+</p><h3><a name="FOOT5" href="notes-mode_1.html#DOCF5">(5)</a></h3>
+<p>If you think I'm missing an alternative, please let me know.
+</p><hr size="1">
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<p>
+ <font size="-1">
+  This document was generated by <em>John Heidemann</em> on <em>August, 8 2008</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.78</em></a>.
+ </font>
+ <br>
+
+</p>
+</body>
+</html>
diff --git a/packages/notes-mode/HTML/notes-mode/notes-mode_toc.html b/packages/notes-mode/HTML/notes-mode/notes-mode_toc.html
new file mode 100644 (file)
index 0000000..4b4cfc9
--- /dev/null
@@ -0,0 +1,111 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+<html>
+<!-- Created on August, 8 2008 by texi2html 1.78 -->
+<!--
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<head>
+<title>Notes-mode: Table of Contents</title>
+
+<meta name="description" content="Notes-mode: Table of Contents">
+<meta name="keywords" content="Notes-mode: Table of Contents">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="texi2html 1.78">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+pre.display {font-family: serif}
+pre.format {font-family: serif}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+pre.smalldisplay {font-family: serif; font-size: smaller}
+pre.smallexample {font-size: smaller}
+pre.smallformat {font-family: serif; font-size: smaller}
+pre.smalllisp {font-size: smaller}
+span.roman {font-family:serif; font-weight:normal;}
+span.sansserif {font-family:sans-serif; font-weight:normal;}
+ul.toc {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+
+<a name="SEC_Contents"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h1>Table of Contents</h1>
+<div class="contents">
+
+<ul class="toc">
+  <li><a name="TOC1" href="notes-mode_1.html#SEC1">1. Introduction</a>
+  <ul class="toc">
+    <li><a name="TOC2" href="notes-mode_1.html#SEC2">1.1 What is it?</a></li>
+    <li><a name="TOC3" href="notes-mode_1.html#SEC3">1.2 Why keep notes at all?</a></li>
+    <li><a name="TOC4" href="notes-mode_1.html#SEC4">1.3 Why keep notes on-line?</a></li>
+    <li><a name="TOC5" href="notes-mode_1.html#SEC5">1.4 Why use notes-mode?</a></li>
+    <li><a name="TOC6" href="notes-mode_1.html#SEC6">1.5 Y2K Statement</a></li>
+    <li><a name="TOC7" href="notes-mode_1.html#SEC7">1.6 Related work</a></li>
+    <li><a name="TOC8" href="notes-mode_1.html#SEC8">1.7 Staying on top</a></li>
+  </ul></li>
+  <li><a name="TOC9" href="notes-mode_2.html#SEC9">2. Basics</a>
+  <ul class="toc">
+    <li><a name="TOC10" href="notes-mode_2.html#SEC10">2.1 Getting started</a></li>
+    <li><a name="TOC11" href="notes-mode_2.html#SEC11">2.2 A notes file</a></li>
+    <li><a name="TOC12" href="notes-mode_2.html#SEC12">2.3 The notes index</a></li>
+    <li><a name="TOC13" href="notes-mode_2.html#SEC13">2.4 The notes directories</a></li>
+  </ul></li>
+  <li><a name="TOC14" href="notes-mode_3.html#SEC14">3. Advanced Features</a>
+  <ul class="toc">
+    <li><a name="TOC15" href="notes-mode_3.html#SEC15">3.1 Notes files</a>
+    <ul class="toc">
+      <li><a name="TOC16" href="notes-mode_3.html#SEC16">3.1.1 Getting around</a></li>
+      <li><a name="TOC17" href="notes-mode_3.html#SEC17">3.1.2 Subject summary</a></li>
+      <li><a name="TOC18" href="notes-mode_3.html#SEC18">3.1.3 Encryption</a></li>
+      <li><a name="TOC19" href="notes-mode_3.html#SEC19">3.1.4 Useful conventions</a></li>
+    </ul></li>
+    <li><a name="TOC20" href="notes-mode_3.html#SEC20">3.2 Notes indices</a></li>
+    <li><a name="TOC21" href="notes-mode_3.html#SEC21">3.3 Notes-mode configuration</a></li>
+  </ul></li>
+  <li><a name="TOC22" href="notes-mode_4.html#SEC22">4. History</a>
+  <ul class="toc">
+    <li><a name="TOC23" href="notes-mode_4.html#SEC23">4.1 Notes-mode history</a></li>
+    <li><a name="TOC24" href="notes-mode_4.html#SEC24">4.2 Credits</a></li>
+    <li><a name="TOC25" href="notes-mode_4.html#SEC25">4.3 Changes</a></li>
+    <li><a name="TOC26" href="notes-mode_4.html#SEC26">4.4 Suggested features</a></li>
+  </ul></li>
+  <li><a name="TOC27" href="notes-mode_5.html#SEC27">5. Installation</a></li>
+  <li><a name="TOC28" href="notes-mode_6.html#SEC28">Keystroke index</a></li>
+  <li><a name="TOC29" href="notes-mode_7.html#SEC29">Concept index</a></li>
+</ul>
+</div>
+<hr size="1">
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#SEC28" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<p>
+ <font size="-1">
+  This document was generated by <em>John Heidemann</em> on <em>August, 8 2008</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.78</em></a>.
+ </font>
+ <br>
+
+</p>
+</body>
+</html>
diff --git a/packages/notes-mode/HTML/notes-mode_1.html b/packages/notes-mode/HTML/notes-mode_1.html
new file mode 100644 (file)
index 0000000..45f7ec2
--- /dev/null
@@ -0,0 +1,533 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+<html>
+<!-- Created on April 4, 2012 by texi2html 1.82
+texi2html was written by: 
+            Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+-->
+<head>
+<title>Notes-mode: 1. Introduction</title>
+
+<meta name="description" content="Notes-mode: 1. Introduction">
+<meta name="keywords" content="Notes-mode: 1. Introduction">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="texi2html 1.82">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+blockquote.smallquotation {font-size: smaller}
+pre.display {font-family: serif}
+pre.format {font-family: serif}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+pre.smalldisplay {font-family: serif; font-size: smaller}
+pre.smallexample {font-size: smaller}
+pre.smallformat {font-family: serif; font-size: smaller}
+pre.smalllisp {font-size: smaller}
+span.roman {font-family:serif; font-weight:normal;}
+span.sansserif {font-family:sans-serif; font-weight:normal;}
+ul.toc {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+
+<a name="Introduction"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#What-is-it_003f" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[ &lt;&lt; ]</td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_2.html#Basics" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Introduction-1"></a>
+<h1 class="chapter">1. Introduction</h1>
+
+<p>What is notes-mode and why should you (perhaps) use it?
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top"><a href="#What-is-it_003f">1.1 What is it?</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">                 
+</td></tr>
+<tr><td align="left" valign="top"><a href="#Why-keep-notes-at-all_003f">1.2 Why keep notes at all?</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">      
+</td></tr>
+<tr><td align="left" valign="top"><a href="#Why-keep-notes-on_002dline_003f">1.3 Why keep notes on-line?</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">     
+</td></tr>
+<tr><td align="left" valign="top"><a href="#Why-use-notes_002dmode_003f">1.4 Why use notes-mode?</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">         
+</td></tr>
+<tr><td align="left" valign="top"><a href="#Y2K-Statement">1.5 Y2K Statement</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">               
+</td></tr>
+<tr><td align="left" valign="top"><a href="#Related-work">1.6 Related work</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">                
+</td></tr>
+<tr><td align="left" valign="top"><a href="#Staying-on-top">1.7 Staying on top</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">              
+</td></tr>
+</table>
+
+<hr size="6">
+<a name="What-is-it_003f"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Introduction" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Why-keep-notes-at-all_003f" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Introduction" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Introduction" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_2.html#Basics" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="What-is-it_003f-1"></a>
+<h2 class="section">1.1 What is it?</h2>
+
+<p>Notes-mode is an indexing system for on-line note-taking.
+Notes-mode is composed of two parts, the visible part,
+a major-mode for emacs to aid note-taking;
+and the invisible part,
+scripts which periodically index your notes for you.
+</p>
+<p>Note that notes-mode provides tools to <em>index</em> your notes,
+not to <em>search</em> them.
+(Other existing tools such as &lsquo;<tt>grep</tt>&rsquo;, &lsquo;<tt>agrep</tt>&rsquo;, and &lsquo;<tt>glimpse</tt>&rsquo;
+already allow file search.)
+</p>
+<p>A digression about indexing vs. searching:
+Indexing in this sense means
+organize them according to categories you give,
+while searching looks through all text for arbitrary strings.
+Drawing on the World Wide Web for examples,
+Yahoo (&lsquo;<tt>http://www.yahoo.com/</tt>&rsquo;) is an index,
+while Alta Vista (&lsquo;<tt>http://www.altavista.digital.com/</tt>&rsquo;)
+is a search-engine.
+In (potentially) more familiar terms,
+the yellow pages
+<a name="DOCF1" href="notes-mode_fot.html#FOOT1">(1)</a>
+are an index,
+while directory information (411 in the USA)
+is sort of a search-engine.
+</p>
+
+<hr size="6">
+<a name="Why-keep-notes-at-all_003f"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#What-is-it_003f" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Why-keep-notes-on_002dline_003f" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Introduction" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Introduction" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_2.html#Basics" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Why-keep-notes-at-all_003f-1"></a>
+<h2 class="section">1.2 Why keep notes at all?</h2>
+
+<p>So why should you use notes-mode?
+Well, first, consider why you should (perhaps)
+keep your notes on line.
+First,
+I assume that you take notes as part of your work or school.
+If you don&rsquo;t,
+you can stop reading now and go back to watching TV.
+</p>
+<p>If you keep notes, ask yourself why you keep them.
+Reasons vary for different people, but some include:
+</p>
+<ul>
+<li>
+To remember what is said or done.
+
+</li><li>
+To focus on what is important about what is said.
+
+</li><li>
+To provide proof of having done something
+at a particular time or date.
+
+</li><li>
+I know there were other reasons here,
+but they slipped my mind.
+</li></ul>
+
+
+<hr size="6">
+<a name="Why-keep-notes-on_002dline_003f"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Why-keep-notes-at-all_003f" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Why-use-notes_002dmode_003f" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Introduction" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Introduction" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_2.html#Basics" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Why-keep-notes-on_002dline_003f-1"></a>
+<h2 class="section">1.3 Why keep notes on-line?</h2>
+
+<p>OK, I&rsquo;ve talked you into keeping notes.
+Why do it on-line?
+Again, there are different reasons for different people.
+If you don&rsquo;t want to consider keeping your notes on-line,
+you&rsquo;re welcome to go back to your (clay tablets)
+paper notes.
+</p>
+<p>However, if you do much of your work on-line,
+or if you have portable computer,
+then you might want to consider keeping your notes on-line.
+</p>
+<ul>
+<li>
+It&rsquo;s faster to type than write,
+and possibly more legible at high speed.
+
+</li><li>
+Often information is already on-line.
+For example, in software development, bug reports,
+measurement results, and everything else that&rsquo;s useful
+is on-line.
+
+</li><li>
+You can take down more detail than you otherwise would
+(especially if the data is already on-line).
+Taking more copious notes can be helpful when you go back
+to figure out why that strange thing was happening.
+
+</li><li>
+On-line notes are easy to search.
+Full-text search with 
+grep, agrep, and glimpse are all much faster
+and are often more accurate than paging through paper notes
+looking for a particular keyword.
+
+</li><li>
+On-line notes are easy to index.
+(At least with notes-mode!)
+In addition to full-text search,
+it&rsquo;s helpful to organize notes by category.
+If you keep a table-of-contents of your paper notes,
+you are either extremely fastidious
+or a librarian (Nadia?).
+
+</li><li>
+You can keep all of your notes with you at all times
+(if you have a portable computer).
+Even at a page a day,
+paper notes quickly become bulky and awkward to carry around.
+On-line notes fit on your computer&rsquo;s hard disk,
+an extraordinarily compact medium
+by comparison.
+
+</li><li>
+Your notes can be automatically backed up.
+Paper notes can become damaged with time,
+and as a graduate student
+one of my fears was fire in Boelter Hall
+consuming all my research experiments
+and and therefore hopes of a degree.
+Electronic notes are extremely easy to duplicate
+and can be automatically backed up with the rest of your computer.
+(You <em>do</em> back up your computer, don&rsquo;t you?)
+
+</li></ul>
+
+<p>While these advantages are undoubtedly clear to any
+right-thinking computer user,
+it should be said that there are a few disadvantages 
+for on-line note-taking.
+</p>
+<ul>
+<li>
+If you don&rsquo;t have a computer with you most of the time,
+it&rsquo;s difficult take notes on-line (because you&rsquo;re off-line, of course).
+<a name="DOCF2" href="notes-mode_fot.html#FOOT2">(2)</a>
+
+</li><li>
+Computers require power.
+If your portable computer runs out of juice,
+you&rsquo;re on your own.
+Corollary:  watch your power, or bring paper.
+Better corollary:  watch your power, <em>and</em> bring paper.
+
+</li><li>
+Social limitations.
+It&rsquo;s not always socially acceptable to take notes-on-line.
+For example,
+at a party,
+few people would use a computer
+to take down the phone number of a person
+to whom they&rsquo;re attracted
+(at least, if they wanted the attraction to be mutual).
+<a name="DOCF3" href="notes-mode_fot.html#FOOT3">(3)</a>
+Sometimes other people find the sound of typing distracting.
+
+</li><li>
+Health issues.
+Repetitive stress injuries do occur
+writing (slower) by hand is at least 
+an alternate motion than typing.
+
+</li><li>
+Legal limitations.
+If you want to use your electronic notes
+to justify a patent or invention,
+you may be breaking legal ground.
+Being on the legal cutting-edge is rarely an easy thing
+for the person involved.<a name="DOCF4" href="notes-mode_fot.html#FOOT4">(4)</a>
+
+</li></ul>
+
+
+<hr size="6">
+<a name="Why-use-notes_002dmode_003f"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Why-keep-notes-on_002dline_003f" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Y2K-Statement" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Introduction" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Introduction" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_2.html#Basics" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Why-use-notes_002dmode_003f-1"></a>
+<h2 class="section">1.4 Why use notes-mode?</h2>
+
+<p>OK, I&rsquo;ve sold you on note-taking and even on on-line note-taking.
+What about notes-mode?
+Naturally,
+it slices, dices, and makes julienne fries.
+But wait, there&rsquo;s more:
+</p>
+<ul>
+<li>
+It automates indexing your notes,
+linking notes with the same subject together.
+
+</li><li>
+It supports embedded links,
+allowing you to manually link together different topics 
+and external files.
+
+</li><li>
+It includes a number of convenience-features in emacs.
+Subjects can be completed based on existing subjects.
+The usual emacs customization mechanisms are available.
+
+</li><li>
+Notes containing sensitive information can be encrypted.
+
+</li><li>
+Notes-mode seems better than the other, currently available alternatives.
+</li></ul>
+
+<p>What are the alternatives?  I&rsquo;m glad you asked.
+<a name="DOCF5" href="notes-mode_fot.html#FOOT5">(5)</a>
+</p>
+<ul>
+<li>
+<strong>HTML</strong>.
+HTML has better formatting capabilities than notes-mode,
+and it has excellent linking capabilities.
+Unfortunately,
+HTML&rsquo;s tags are fairly intrusive
+ (each is at least four characters long and most come with a pair),
+ tags can get confused with normal text,
+ errors in HTML can be bad (obscuring data),
+ and there&rsquo;s no automatic indexing feature
+ (at least with plain HTML).
+Besides,
+ all data should be kept as close to the ASCII from whence it came,
+ as God Intended (hi, Steve).
+
+</li><li>
+<strong>Word Processors</strong>.
+Word processors are strong in the formatting department,
+ but most don&rsquo;t really have linking capabilities,
+ and have poor or restricted indexing.
+
+</li></ul>
+
+<hr size="6">
+<a name="Y2K-Statement"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Why-use-notes_002dmode_003f" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Related-work" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Introduction" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Introduction" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_2.html#Basics" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Y2K-Statement-1"></a>
+<h2 class="section">1.5 Y2K Statement</h2>
+
+<p>Notes mode uses dates extensively,
+ both two-digit years and seconds-since-1970.
+However, notes-mode has been coded to function correctly through
+ the year 2038.
+</p>
+<p>To avoid problems with the year 2000, notes-mode assumes
+ that any two-digit years before &ldquo;70&rdquo; are 20xx, not 19xx.
+Notes-mode should therefore work correctly in both the year 1999 and 2000.
+</p>
+<p>(Notes-mode 1.17 released February 1999 fixes a lingering Y2K problem.)
+</p>
+<p>Because notes-mode uses seconds-since-1970 for some date calculations
+ it will fail beyond the year 2038 on computers with 32-bit integers.
+</p>
+<p>If I&rsquo;m still using notes-mode then on a 32-bit machine I&rsquo;ll see what I can do.
+</p>
+
+<hr size="6">
+<a name="Related-work"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Y2K-Statement" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Staying-on-top" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Introduction" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Introduction" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_2.html#Basics" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Related-work-1"></a>
+<h2 class="section">1.6 Related work</h2>
+
+<p>What would a document be without related work?
+</p>
+<p>Notes-mode is not related in any way to Lotus Notes.
+</p>
+<p>I am told (by David Weisman)
+ that it&rsquo;s something like the now defunct Lotus Agenda.
+</p>
+<p>Ashvin Goel, one of the contributors to notes-mode,
+ has gone off and done a from-scratch reimplementation
+ called records-mode.
+It&rsquo;s very similar to notes mode,
+ and emphasizes on-the-fly updates to entry links
+ but lacks a manual.
+You may want to check it out at
+ &lsquo;<tt>http://www.cse.ogi.edu/~ashvin/software.html</tt>&rsquo;.
+</p>
+<p>Hyperbole (by Bob Weiner) offers better linking facilities
+than notes-mode, but it has a bunch of stuff notes-mode doesn&rsquo;t need
+and it&rsquo;s missing notes-specific indexing provided by notes-mode.
+For people already using Hyperbole
+ it would be interesting to replace notes-mode&rsquo;s linking
+ with Hyperbole&rsquo;s.
+Contributions in this area are welcome, provided they make Hyperbole
+ optional.
+</p>
+<hr size="6">
+<a name="Staying-on-top"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Related-work" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_2.html#Basics" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Introduction" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Introduction" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_2.html#Basics" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Staying-on-top-1"></a>
+<h2 class="section">1.7 Staying on top</h2>
+
+<p>The most recent distribution of notes-mode 
+ is always available via
+ &lsquo;<tt>http://www.isi.edu/~johnh/SOFTWARE/NOTES_MODE/</tt>&rsquo;.
+</p>
+<p>After you&rsquo;ve installed notes mode you&rsquo;re encouraged to subscribe
+to the mailing lists.
+To subscribe, go to the web page
+Send the message &quot;subscribe&quot; to
+&lsquo;<tt>http://www.heidemann.la.ca.us/mailman/listinfo/notes-mode-announce</tt>&rsquo; or
+&lsquo;<tt>http://www.heidemann.la.ca.us/mailman/listinfo/notes-mode-talk</tt>&rsquo;.
+</p>
+<p>The announce list will contain only release announcements
+and so is guaranteed to be very low bandwidth.
+</p>
+
+
+<hr size="6">
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Introduction" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_2.html#Basics" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<p>
+ <font size="-1">
+  This document was generated by <em>John Heidemann</em> on <em>April 4, 2012</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.82</em></a>.
+ </font>
+ <br>
+
+</p>
+</body>
+</html>
diff --git a/packages/notes-mode/HTML/notes-mode_2.html b/packages/notes-mode/HTML/notes-mode_2.html
new file mode 100644 (file)
index 0000000..0f5af2d
--- /dev/null
@@ -0,0 +1,419 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+<html>
+<!-- Created on April 4, 2012 by texi2html 1.82
+texi2html was written by: 
+            Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+-->
+<head>
+<title>Notes-mode: 2. Basics</title>
+
+<meta name="description" content="Notes-mode: 2. Basics">
+<meta name="keywords" content="Notes-mode: 2. Basics">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="texi2html 1.82">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+blockquote.smallquotation {font-size: smaller}
+pre.display {font-family: serif}
+pre.format {font-family: serif}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+pre.smalldisplay {font-family: serif; font-size: smaller}
+pre.smallexample {font-size: smaller}
+pre.smallformat {font-family: serif; font-size: smaller}
+pre.smalllisp {font-size: smaller}
+span.roman {font-family:serif; font-weight:normal;}
+span.sansserif {font-family:sans-serif; font-weight:normal;}
+ul.toc {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+
+<a name="Basics"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="notes-mode_1.html#Staying-on-top" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Getting-started" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode_1.html#Introduction" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_3.html#Advanced-Features" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Basics-1"></a>
+<h1 class="chapter">2. Basics</h1>
+
+<p>All you need to use notes-mode
+ in a chapter.
+(Except for installation, See section <a href="notes-mode_5.html#Installation">Installation</a>.)
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top"><a href="#Getting-started">2.1 Getting started</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">             
+</td></tr>
+<tr><td align="left" valign="top"><a href="#A-notes-file">2.2 A notes file</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">                
+</td></tr>
+<tr><td align="left" valign="top"><a href="#The-notes-index">2.3 The notes index</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">             
+</td></tr>
+<tr><td align="left" valign="top"><a href="#The-notes-directories">2.4 The notes directories</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">       
+</td></tr>
+</table>
+
+<hr size="6">
+<a name="Getting-started"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Basics" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#A-notes-file" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Basics" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Basics" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_3.html#Advanced-Features" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Getting-started-1"></a>
+<h2 class="section">2.1 Getting started</h2>
+<a name="index-notesinit"></a>
+<a name="index-setup"></a>
+
+<p>To get started with notes-mode,
+ read the introduction this chapter,
+ then either:
+</p>
+<ul>
+<li>
+Start emacs, do 
+ <kbd>M-x</kbd> <code>load-library</code> <kbd>RET</kbd> <code>notes-mode</code> <kbd>RET</kbd>
+This approach will set up notes-mode with the default parameters.
+
+</li><li>
+OR, from the shell, 
+ run the program &lsquo;<tt>notesinit</tt>&rsquo;.
+This approach will ask you some questions about how you want to configure
+ notes mode.
+
+</li></ul>
+
+<p>Either way these should set up everything notes-mode needs.
+This program will modify your environment (as described in this section),
+ or it will give you the exact commands you should run yourself.
+</p>
+<p>After you&rsquo;ve done one of these,
+ start up emacs and note-away.
+I usually begin a
+ day of note-taking by running the command
+ <kbd>M-x</kbd> <code>notes-index-todays-link</code>
+ to jump directly to today&rsquo;s note.
+You may even wish to bind this to something,
+ perhaps with
+ <code>(define-key global-map &quot;\C-cn&quot; 'notes-index-todays-link)</code>
+ in your &lsquo;<tt>.emacs</tt>&rsquo;. 
+</p>
+<p>If you want to browse your existing notes,
+ you might instead want to edit the
+ &lsquo;<tt>~/NOTES/index</tt>&rsquo;.
+(What is a notes file and the index? Hurry up and finish
+ reading this chapter.) 
+</p>
+
+<hr size="6">
+<a name="A-notes-file"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Getting-started" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#The-notes-index" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Basics" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Basics" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_3.html#Advanced-Features" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="A-notes-file-1"></a>
+<h2 class="section">2.2 A notes file</h2>
+
+<a name="index-Notes-files"></a>
+
+<p>The notes file is the focus of most of the activity in notes-mode,
+ it&rsquo;s where you take your notes.
+Notes files are mostly free-form text
+ broken up into <em>entries</em>.
+Here&rsquo;s an example:
+</p>
+<a name="index-Notes-entries"></a>
+
+<table><tr><td>&nbsp;</td><td><pre class="example">8-Jun-95 Thursday
+-----------------
+
+* Today
+-------
+prev: &lt;none&gt;
+next: &lt;file:///~/NOTES/199506/950609#* Today&gt;
+
+next week - release notes-mode
+
+
+* Environment/notes
+-------------------
+
+I explained notes mode to Ashvin and Geoff.
+...
+</pre></td></tr></table>
+
+<p>Each entry has a subject-block, (maybe) some links, and then (maybe) some text.
+</p>
+<p>The subject-block must begin with an asterisk-space (<kbd>* </kbd>)
+ at the beginning of a line, followed by the subject itself.
+Subjects must be underlined with a row of dashes
+ (if they&rsquo;re not exact, that&rsquo;s OK;
+ notes-mode will fix them periodically).
+For convenience,
+ notes-mode will automatically add the underlines when you
+ hit <kbd>&lt;RTN&gt;</kbd> (<code>notes-electric-return</code>),
+ and <kbd>&lt;TAB&gt;</kbd> on a partially completed subject will
+ invoke completion based on indexed subjects (<code>notes-complete-subject</code>).
+<a name="index-Notes-subjects"></a>
+<a name="index-RTN"></a>
+<a name="index-TAB"></a>
+</p>
+<p>Following the subject may be links.
+(In the example, the &ldquo;Today&rdquo; entry has links,
+ the &ldquo;Environment/notes&rdquo; entry doesn&rsquo;t.)
+These links will be automatically updated by notes-mode
+ when your notes are re-indexed;
+ just leave a blank line when writing the note.
+<a name="index-Notes-links"></a>
+</p>
+<p>Links are made with pseudo-URLs,
+ sort of like those in the World Wide Web. 
+Any of these URLs can be followed in notes-mode files
+ by clicking <kbd>S-mouse-2</kbd> on the pseudo-URL
+ (<code>notes-w3-follow-link-mouse</code>).
+<a name="index-Pseudo_002dURLs"></a>
+<a name="index-URLs"></a>
+<a name="index-S_002dmouse_002d2"></a>
+</p>
+<p>Finally comes the text.
+Go wild, but just don&rsquo;t include text that looks like a subject.
+You can embed pseudo-URLs to link notes together manually.
+</p>
+<p>The more anal of you may have noticed
+ that the lines before the first subject
+ are not part of any entry.
+These lines are
+ <em>front matter</em>.
+They&rsquo;re not usually used for much,
+ but they can be a good place to label the file.
+<a name="index-Notes-files_002c-font-matter"></a>
+<a name="index-Font-matter"></a>
+</p>
+<p>There are a number of useful conventions
+ that can be adopted to organize your notes.
+The most common is the &ldquo;Today&rdquo; entry.
+If you keep an entry with the same subject
+ at the beginning of each file,
+ you link all of your notes together.
+Notes-mode will help you out with some of these convetions
+ by automatically creating or copying some fields for you;
+ see see section <a href="notes-mode_3.html#Useful-conventions">Useful conventions</a> for details.
+</p>
+<p>Finally, notes-mode can also work with outline-minor-mode
+ (thanks to Tim Carroll for pointing this out).
+Outline-mode supports hiding and revealing text and other helpful
+ features beyond the scope of this document.
+See <a href="../emacs/Outline-Mode.html#Outline-Mode">Outline Mode: (emacs)Outline Mode</a> section &lsquo;Outline Mode&rsquo; in <cite>The Emacs Editor</cite>, for details.
+</p>
+<hr size="6">
+<a name="The-notes-index"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#A-notes-file" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#The-notes-directories" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Basics" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Basics" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_3.html#Advanced-Features" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="The-notes-index-1"></a>
+<h2 class="section">2.3 The notes index</h2>
+
+<a name="index-Notes-index"></a>
+
+<p>The notes index lists all subjects you&rsquo;ve kept notes about,
+ and each date of each note.
+Impress your friends,
+ show your advisor why you&rsquo;re worth the <em>big</em> peanuts,
+ you&rsquo;ll soon have the biggest index of all.
+</p>
+<p>The index has one line per subject, listing the subject
+ and each day a note was made about that subject.
+For example:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example">Bicycle: 950314, 950316
+Bicycle/maintenance/books: 951028
+Bridge/hands: 951113, 951114, 951116, 951117
+Bridge/UCLA: 960222, 960409
+</pre></td></tr></table>
+
+<p>Clicking on any of the dates with <kbd>mouse-2</kbd>
+ will take you to that note
+ (<code>notes-index-mouse-follow-link</code>).
+(You can also move the point over the date and hit <kbd>&lt;RTN&gt;</kbd>
+ if you&rsquo;re musaphobic [<code>notes-index-follow-link</code>].)
+<a name="index-mouse_002d2"></a>
+<a name="index-RTN-1"></a>
+</p>
+<p>The notes index is automatically updated by the program &lsquo;<tt>mkall</tt>&rsquo;.
+Typically &lsquo;<tt>mkall</tt>&rsquo; is run nightly by &lsquo;<tt>cron</tt>&rsquo;.
+On most modern versions of Unix, you can add this command to cron by
+ running &lsquo;<tt>crontab -e</tt>&rsquo; and adding the line:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example">0 4 * * * /usr/local/lib/notes-mode/mkall
+</pre></td></tr></table>
+<a name="index-Crontab"></a>
+<a name="index-mkall"></a>
+<a name="index-re_002dindexing"></a>
+
+<p>(Assuming that your notes programs are installed
+ in /usr/local/lib/notes-mode, the default location.)
+</p>
+
+<hr size="6">
+<a name="The-notes-directories"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#The-notes-index" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_3.html#Advanced-Features" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Basics" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Basics" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_3.html#Advanced-Features" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="The-notes-directories-1"></a>
+<h2 class="section">2.4 The notes directories</h2>
+
+<a name="index-Notes-directories"></a>
+<a name="index-Directory-hierarchy"></a>
+
+<p>The final thing needed to tie basic notes-mode together his how
+the pieces fit together.
+Since my graduate work is in file systems,
+you can bet that directories are involved.
+</p>
+<p>Notes-mode keeps its files in a two-level hierarchy:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example">~/NOTES
+~/NOTES/index
+~/NOTES/rawindex
+~/NOTES/199603
+~/NOTES/199603/960329
+~/NOTES/199603/960330
+~/NOTES/199604
+~/NOTES/199604/960401
+</pre></td></tr></table>
+
+<p>The top level, &lsquo;<tt>~/NOTES</tt>&rsquo;, is the notes directory.
+It keeps all notes in one place.
+(The name of this directory is configurable, See section <a href="notes-mode_3.html#Notes_002dmode-configuration">Notes-mode configuration</a>.)
+</p>
+<p>Inside the notes directory are two files and a number of directories.
+The files are &lsquo;<tt>index</tt>&rsquo;,
+ the index of all entries (see section <a href="#The-notes-index">The notes index</a>),
+ and &lsquo;<tt>rawindex</tt>&rsquo;,
+ used internally.
+<a name="index-Root-directory"></a>
+</p>
+<p>The notes directory also contains a number of subdirectories,
+ sometimes called <em>intermediate directories</em>.
+These directories group the actual notes files into manageable chunks,
+ keeping any directory from getting too large.
+Intermediate directories are named
+ by the four-digit year and the two-digit month
+ of the entries they contain.
+(The format of intermediate directories
+ is configurable, See section <a href="notes-mode_3.html#Notes_002dmode-configuration">Notes-mode configuration</a>.)
+<a name="index-Intermediate-directories"></a>
+</p>
+<p>Finally,
+ each intermediate directory are the notes files themselves,
+ named according to the two-digit year, month, and day-of-month.
+<a name="index-Notes-files-1"></a>
+</p>
+<p>For the most part,
+ notes-mode will automatically maintain this organization of files,
+ once you create the top-level directory.
+Notes-mode will also automatically insure
+ that all files in the notes directory are unreadable by
+ anyone other than their owner.
+Notes are personal things.
+(This behavior is not currently configurable,
+ but it probably should be.)
+<a name="index-Notes-file-permissions"></a>
+</p>
+
+
+<hr size="6">
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Basics" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_3.html#Advanced-Features" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<p>
+ <font size="-1">
+  This document was generated by <em>John Heidemann</em> on <em>April 4, 2012</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.82</em></a>.
+ </font>
+ <br>
+
+</p>
+</body>
+</html>
diff --git a/packages/notes-mode/HTML/notes-mode_3.html b/packages/notes-mode/HTML/notes-mode_3.html
new file mode 100644 (file)
index 0000000..cdfd7e6
--- /dev/null
@@ -0,0 +1,511 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+<html>
+<!-- Created on April 4, 2012 by texi2html 1.82
+texi2html was written by: 
+            Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+-->
+<head>
+<title>Notes-mode: 3. Advanced Features</title>
+
+<meta name="description" content="Notes-mode: 3. Advanced Features">
+<meta name="keywords" content="Notes-mode: 3. Advanced Features">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="texi2html 1.82">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+blockquote.smallquotation {font-size: smaller}
+pre.display {font-family: serif}
+pre.format {font-family: serif}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+pre.smalldisplay {font-family: serif; font-size: smaller}
+pre.smallexample {font-size: smaller}
+pre.smallformat {font-family: serif; font-size: smaller}
+pre.smalllisp {font-size: smaller}
+span.roman {font-family:serif; font-weight:normal;}
+span.sansserif {font-family:sans-serif; font-weight:normal;}
+ul.toc {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+
+<a name="Advanced-Features"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="notes-mode_2.html#The-notes-directories" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Notes-files" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode_2.html#Basics" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_4.html#History" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Advanced-Features-1"></a>
+<h1 class="chapter">3. Advanced Features</h1>
+
+<p>Notes-mode, the minutiae, and some other good stuff.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top"><a href="#Notes-files">3.1 Notes files</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">                 
+</td></tr>
+<tr><td align="left" valign="top"><a href="#Notes-indices">3.2 Notes indices</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">               
+</td></tr>
+<tr><td align="left" valign="top"><a href="#Notes_002dmode-configuration">3.3 Notes-mode configuration</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">    
+</td></tr>
+</table>
+
+<hr size="6">
+<a name="Notes-files"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Advanced-Features" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Getting-around" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Advanced-Features" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Advanced-Features" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_4.html#History" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Notes-files-1"></a>
+<h2 class="section">3.1 Notes files</h2>
+
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top"><a href="#Getting-around">3.1.1 Getting around</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">              
+</td></tr>
+<tr><td align="left" valign="top"><a href="#Subject-summary">3.1.2 Subject summary</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">             
+</td></tr>
+<tr><td align="left" valign="top"><a href="#Encryption">3.1.3 Encryption</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">                  
+</td></tr>
+<tr><td align="left" valign="top"><a href="#Useful-conventions">3.1.4 Useful conventions</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">          
+</td></tr>
+</table>
+
+<hr size="6">
+<a name="Getting-around"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Notes-files" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Subject-summary" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Advanced-Features" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Notes-files" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_4.html#History" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Getting-around-1"></a>
+<h3 class="subsection">3.1.1 Getting around</h3>
+
+<p>Moving between notes entries and around the hierarchy is fairly common,
+ so there are some accelerators.
+</p>
+<dl compact="compact">
+<dt> <kbd>C-c C-i</kbd></dt>
+<dd><p>Jump to the index entry for the current entry&rsquo;s subject
+(<code>notes-goto-index-entry</code>).
+<a name="index-C_002dc-C_002di"></a>
+</p>
+</dd>
+<dt> <kbd>C-c C-n</kbd></dt>
+<dt> <kbd>C-c C-p</kbd></dt>
+<dd><p>Move to the next or prior note with the same subject
+(<code>notes-follow-next-link</code> and <code>notes-follow-prev-link</code>).
+These functions follow the links in the note,
+ if they&rsquo;re defined.
+If not,
+ they look through the index file.
+This approach usually works,
+ but will fail if there are multiple new entries created
+ with the given subject
+ between when the index is recomputed.
+<a name="index-C_002dc-C_002dn"></a>
+<a name="index-C_002dc-C_002dp"></a>
+</p>
+</dd>
+<dt> <kbd>C-c&lt;RTN&gt;</kbd></dt>
+<dd><p>Follow the link under the point
+(<code>notes-w3-follow-link</code>),
+ a keyboard equivalent of &lt;S-mouse-2&gt;.
+<a name="index-C_002dcRTN"></a>
+</p>
+</dd>
+<dt> <kbd>M-C-a</kbd></dt>
+<dt> <kbd>M-C-e</kbd></dt>
+<dd><p>Jump to the beginning or end of the current note entry
+(<code>notes-beginning-of-defun</code> and <code>notes-end-of-defun</code>).
+<a name="index-M_002dC_002da"></a>
+<a name="index-M_002dC_002de"></a>
+</p>
+</dd>
+<dt> <kbd>C-c C-k</kbd></dt>
+<dd><p>Copies the pseudo-URL for the current note into the kill-ring
+(<code>current-url-as-kill</code>).
+To link two entries, go to the target,
+ grab its URL with <kbd>C-c C-k</kbd>,
+ go to where you want to make the link,
+ and yank the URL with <kbd>C-y</kbd>.
+<a name="index-C_002dc-C_002dk"></a>
+</p>
+</dd>
+</dl>
+
+
+<p>Notes mode supports imenu,
+ if you have it bound to something
+ (I use <code>(global-set-key [down-mouse-3] 'imenu)</code>).
+<a name="index-imenu"></a>
+</p>
+
+<hr size="6">
+<a name="Subject-summary"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Getting-around" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Encryption" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Advanced-Features" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Notes-files" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_4.html#History" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Subject-summary-1"></a>
+<h3 class="subsection">3.1.2 Subject summary</h3>
+
+<p>It&rsquo;s often helpful to look at all
+ entries for a given subject
+<kbd>C-c C-s</kbd>
+ collects all entries with the subject of the current
+ entry in a new buffer
+ (<code>notes-summarize-subject</code>).
+<a name="index-C_002dc-C_002ds"></a>
+<a name="index-Subject-summary"></a>
+</p>
+
+<hr size="6">
+<a name="Encryption"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Subject-summary" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Useful-conventions" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Advanced-Features" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Notes-files" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_4.html#History" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Encryption-1"></a>
+<h3 class="subsection">3.1.3 Encryption</h3>
+
+<a name="index-Encryption"></a>
+<a name="index-Decryption"></a>
+
+<p>Notes occasionally contain private material.
+While Unix has strong services for file protection
+ (compared to other, say, more wide-selling operating systems),
+ in many systems root passwords are shared,
+ while other systems are vulnerable to physical compromise.
+In such systems,
+ properly used encryption is the best approach to security.
+</p>
+<p>Notes-mode encryption is based
+ Phill Zimmerman&rsquo;s PGP (Pretty Good Privacy)
+(see &lsquo;<tt>http://www.mantis.co.uk/pgp/pgp.html</tt>&rsquo;)
+ and either
+ with Rick Campbell&rsquo;s
+ emacs interface, PAM (PGP Augmented Messaging)
+(from &lsquo;<tt>ftp://h.gp.cs.cmu.edu/usr/rfb/pam/</tt>&rsquo;)
+ (note that as of January 1997, PAM is no longer at this ftp site
+ and appears to not be publicly available),
+ or LoPresti and Choi&rsquo;s mailcrypt
+(from &lsquo;<tt>http://cag-www.lcs.mit.edu/mailcrypt/</tt>&rsquo;).
+<a name="index-PGP"></a>
+<a name="index-Pretty-good-privacy"></a>
+<a name="index-PAM"></a>
+<a name="index-PGP-Augmented-Messaging"></a>
+<a name="index-mailcrypt"></a>
+</p>
+<dl compact="compact">
+<dt> <kbd>C-c C-e</kbd></dt>
+<dd><p>Encrypt the current note
+(<code>notes-encrypt-note</code>).
+By default this function encrypts the whole entry.
+With a prefix argument,
+ only the part from the point to the end of the entry is encrypted.
+<a name="index-C_002dc-C_002de"></a>
+</p>
+</dd>
+<dt> <kbd>C-c C-d</kbd></dt>
+<dd><p>Decrypt the current note
+(<code>notes-decrypt-note</code>).
+</p></dd>
+</dl>
+<a name="index-C_002dc-C_002dd"></a>
+
+<p>By default notes-mode determines your public key by looking 
+ up your <code>user-full-name</code> in your PGP keyring.
+You can override this default by setting
+ <code>notes-encryption-key-id</code>
+ to the desired key-id.
+<a name="index-key_002did"></a>
+</p>
+
+<hr size="6">
+<a name="Useful-conventions"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Encryption" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Notes-indices" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Advanced-Features" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Notes-files" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_4.html#History" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Useful-conventions-1"></a>
+<h3 class="subsection">3.1.4 Useful conventions</h3>
+
+
+<a name="index-conventions"></a>
+<a name="index-mknew"></a>
+
+<p>There are a number of conventions which can make notes-mode
+ easier to use.
+These conventions are a matter of personal taste,
+ of course.
+Do what works for you.
+</p>
+<p>First,
+ I find it helpful to keep the date of each notes-file at the top
+ of the file.
+This makes the file self-identifying
+ if the filename is lost.
+</p>
+<p>Second,
+ I find it useful to have the first entry of each file
+ have the same subject (perhaps &ldquo;Today&rdquo;).
+This entry then links all notes together,
+ making it easy to go to yesterday and tomorrow.
+I keep a to-do list on this entry,
+ bringing the list forward each day.
+<a name="index-Today"></a>
+</p>
+<p>A third useful convention is to keep an
+ entry with the name based on the day of the week
+ in each file.
+Analogous to &ldquo;Today&rdquo;, this entry links together
+ weeks.
+</p>
+<p>Notes-mode supports these conventions.
+When you make a new notes-file in emacs,
+ notes-mode searches for the preceding file.
+If it follows any of these conventions,
+ the new file is initialized appropriately.
+Currently
+ the approach to do this process
+ (in the program &lsquo;<tt>mknew</tt>&rsquo;)
+ is fairly sensitive,
+ so it may not work in all cases.
+In particular,
+ the date convention works only on
+ for English-language dates.
+(If you use notes-mode with a non-English language,
+ let me know and I&rsquo;ll work with you to fix this limitation.)
+</p>
+<p>If you find other helpful conventions,
+ please let me know.
+Modifications to &lsquo;<tt>mknew</tt>&rsquo; to implement
+ new conventions are also invited.
+</p>
+<p>If you don&rsquo;t want to use these conventions,
+ or if you want to use different ones,
+ set the emacs variable notes-mode-initialization-program
+ to nil or the name of your initialization program.
+<a name="index-notes_002dmode_002dinitialization_002dprogram"></a>
+</p>
+
+<hr size="6">
+<a name="Notes-indices"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Useful-conventions" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Notes_002dmode-configuration" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Advanced-Features" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Advanced-Features" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_4.html#History" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Notes-indices-1"></a>
+<h2 class="section">3.2 Notes indices</h2>
+
+
+<p>Only two features of notes index mode haven&rsquo;t yet been described.
+First,
+ you can open any notes-file based on date
+ with <code>notes-index-link</code>,
+ normally bound to &lt;o&gt;.
+<a name="index-o"></a>
+</p>
+<p>Second,
+ you can get a subject-summary
+ with &lt;C-c C-s&gt;
+ (see section <a href="#Subject-summary">Subject summary</a>).
+The subject defaults to that of the current index line.
+<a name="index-C_002dc-C_002ds-1"></a>
+</p>
+
+<hr size="6">
+<a name="Notes_002dmode-configuration"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Notes-indices" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_4.html#History" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#Advanced-Features" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Advanced-Features" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_4.html#History" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Notes_002dmode-configuration-1"></a>
+<h2 class="section">3.3 Notes-mode configuration</h2>
+
+<a name="index-configuration"></a>
+<a name="index-_002enotesrc"></a>
+
+<p>Several aspects of notes mode are particularly visible
+ to the user.
+Because I&rsquo;m not a fascist,
+ a user can change most of these.
+</p>
+<p>Preferences are specified in &lsquo;<tt>~/.notesrc</tt>&rsquo;.
+This file lists things to change:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"># lines beginning with a hash are comments
+dir: ~/NOTES
+int_form: %Y%m
+</pre></td></tr></table>
+
+<p>Currently, two things can be changed:
+</p>
+<dl compact="compact">
+<dt> <code>dir</code></dt>
+<dd><p>Specifies the root of the notes directory hierarchy
+ (see section <a href="notes-mode_2.html#The-notes-directories">The notes directories</a>).
+</p>
+</dd>
+<dt> <code>int_form</code></dt>
+<dd><p>Specifies the form of the intermediate directory.
+A limited subset of <code>strftime(3)</code>
+ formatting is allowed.
+</p></dd>
+</dl>
+
+<p>The subset of <code>strftime(3)</code> supported in <code>int_form</code> is:
+</p><dl compact="compact">
+<dt> <code>%Y</code></dt>
+<dd><p>The four-digit year.
+</p>
+</dd>
+<dt> <code>%y</code></dt>
+<dd><p>The two-digit year.
+</p>
+</dd>
+<dt> <code>%m</code></dt>
+<dd><p>A two-digit numeric month.
+</p>
+</dd>
+<dt> <code>%d</code></dt>
+<dd><p>A two-digit day.
+</p></dd>
+</dl>
+
+<p>In addition to &lsquo;<tt>.notesrc</tt>&rsquo;,
+ there are a number of emacs-specific variables.
+These variables are documented in the file
+ &lsquo;<tt>notes-variables.el</tt>&rsquo;.
+</p>
+
+
+
+<hr size="6">
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Advanced-Features" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_4.html#History" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<p>
+ <font size="-1">
+  This document was generated by <em>John Heidemann</em> on <em>April 4, 2012</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.82</em></a>.
+ </font>
+ <br>
+
+</p>
+</body>
+</html>
diff --git a/packages/notes-mode/HTML/notes-mode_4.html b/packages/notes-mode/HTML/notes-mode_4.html
new file mode 100644 (file)
index 0000000..eb785a3
--- /dev/null
@@ -0,0 +1,530 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+<html>
+<!-- Created on April 4, 2012 by texi2html 1.82
+texi2html was written by: 
+            Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+-->
+<head>
+<title>Notes-mode: 4. History</title>
+
+<meta name="description" content="Notes-mode: 4. History">
+<meta name="keywords" content="Notes-mode: 4. History">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="texi2html 1.82">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+blockquote.smallquotation {font-size: smaller}
+pre.display {font-family: serif}
+pre.format {font-family: serif}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+pre.smalldisplay {font-family: serif; font-size: smaller}
+pre.smallexample {font-size: smaller}
+pre.smallformat {font-family: serif; font-size: smaller}
+pre.smalllisp {font-size: smaller}
+span.roman {font-family:serif; font-weight:normal;}
+span.sansserif {font-family:sans-serif; font-weight:normal;}
+ul.toc {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+
+<a name="History"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="notes-mode_3.html#Notes_002dmode-configuration" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Notes_002dmode-history" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode_3.html#Advanced-Features" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_5.html#Installation" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="History-1"></a>
+<h1 class="chapter">4. History</h1>
+
+<p>More about notes-mode than you wanted to know,
+and some thanks.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top"><a href="#Notes_002dmode-history">4.1 Notes-mode history</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">          
+</td></tr>
+<tr><td align="left" valign="top"><a href="#Credits">4.2 Credits</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">                     
+</td></tr>
+<tr><td align="left" valign="top"><a href="#Changes">4.3 Changes</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">                     
+</td></tr>
+<tr><td align="left" valign="top"><a href="#Suggested-features">4.4 Suggested features</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">                     
+</td></tr>
+</table>
+
+
+
+<hr size="6">
+<a name="Notes_002dmode-history"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#History" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Credits" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#History" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#History" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_5.html#Installation" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Notes_002dmode-history-1"></a>
+<h2 class="section">4.1 Notes-mode history</h2>
+
+<p>Briefly,
+ I started keeping notes on-line shortly after I got a portable computer
+ in January, 1994.
+After a month-and-a-half of notes, I realized that
+ one does not live by grep alone,
+ so I started adding indexing facilities.
+</p>
+<p>In June of 1995
+ some other Ficus-project members started
+ keeping and indexing on-line notes
+ using other home-grown systems.
+After some discussion,
+ we generalized my notes-mode work and
+ they started using it.
+</p>
+<p>Over the next 18 months notes-mode grew.
+Finally, in April, 1996 I wrote documentation,
+ guaranteeing that innovation on notes-mode will now cease
+ or the documentation will become out of date.
+</p>
+
+<hr size="6">
+<a name="Credits"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Notes_002dmode-history" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Changes" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#History" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#History" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_5.html#Installation" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Credits-1"></a>
+<h2 class="section">4.2 Credits</h2>
+
+<p>I (John Heidemann, &lt;johnh@isi.edu&gt;)
+ started, documented, and currently maintain notes-mode.
+I take ultimate responsibility for the code,
+ especially for the ugly parts that I won&rsquo;t let others change.
+</p>
+<p>Ashvin Goel
+ &lt;ashvin@ficus.cs.ucla.edu&gt;
+ has been a very enthusiastic notes-mode user and contributor.
+He is responsible for at least
+ the ideas behind <code>notes-summarize-subject</code>
+and the ideas and initial implementations of
+ some of the original generalization and modularity improvements,
+ <code>notes-follow-next-link</code> and <code>notes-follow-prev-link</code>,
+ <code>notes-goto-index-entry</code>,
+ programmed subject completion,
+ and
+ context-sensitive mouse-2 handling.
+In addition,
+ he is an invaluable second opinion about
+ what and how things should be done
+ (even if I don&rsquo;t always agree with him).
+</p>
+<p>Geoff Kuenning
+ &lt;geoff@ficus.cs.ucla.edu&gt;
+ has been another enthusiastic notes-mode user and victim.
+He is responsible for
+ finding several bugs,
+ motivation for mouse-less operation,
+ comments about the documentation,
+ the day-of-week convention,
+ and an initial implementation and the idea of
+ multiple entries with the same subjects in a single notes-file.
+</p>
+<p>Ramesh Govindan &lt;govindan@isi.edu&gt; did the xemacs port.
+</p>
+<p>Since it&rsquo;s release on Usenet in April 1996 several
+ other folks have contributed.
+Thanks to
+ David Weisman &lt;weisman@app1.osf.org&gt;,
+ Martin L. Smith &lt;martin@ner.com&gt;,
+ Jason Bastek &lt;jason@aai.com&gt;,
+ Ulrich Herbst &lt;Ulrich.Herbst@t-systems.com&gt;.
+See the next section (See section <a href="#Changes">Changes</a>.) for details of their exploits.
+</p>
+<p>Thanks to Larry Ayers &lt;layers@marktwain.net&gt;
+ for popularizing notes-mode with reviews in
+ the Linux Gazette
+ (at &lt;http://www.linuxgazette.com/issue22/notes-mode.html&gt; and
+ &lt;http://www.linuxgazette.com/issue35/ayers.html&gt;).
+</p>
+<hr size="6">
+<a name="Changes"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Credits" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#Suggested-features" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#History" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#History" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_5.html#Installation" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Changes-1"></a>
+<h2 class="section">4.3 Changes</h2>
+
+<p>For the bored:
+</p>
+<p>First semi-public release. 12-Jul-95: version 0.1
+ Shared a version with Ashvin and Geoff.
+</p>
+<p>Changed  6-Dec-95: version 0.3
+ Ashvin&rsquo;s changes for note traversal added (C-c C-p and C-c C-n now
+move to the prev/next note in note-mode).
+ URL parsing changed so that &quot;localhost&quot; is optional.
+</p>
+<p>Changed 19-Dec-95:  version 0.4
+ More robust prev/next code added, both to handle going back and
+forward in the middle of chains through the index file, and to handle
+back/forward in a single file.
+ URL parsing changed so that notes-goto-index-entry correctly handles
+lookups on notes names such as &quot;252A&quot;.
+</p>
+<p>Changed 20-Dec-95: version 0.5.
+ Fixed a missing variable in notes-url.el.
+ Added a work-around to a bug in emacs-19.30&rsquo;s define-derived-mode.
+</p>
+<p>Changed 24-Dec-95: version 0.6.
+ Prev/next code re-re-written to be more robust.
+</p>
+<p>Changed 26-Dec-96:  version 0.7.
+ Bug fix release.
+</p>
+<p>Changed 23-Jan-96: version 0.8.
+ Initialization code added to set up a new note.
+New variable:  notes-bin-dir.
+</p>
+<p> I&rsquo;m skipping version 0.9 because I erroneously release version 0.1
+as version 0.9 (only on the web, not on Usenet).
+</p>
+<p> I&rsquo;m bumping from version &quot;0&quot; to version &quot;1&quot; since the code is has been
+in production use for more than a year by several people.  Minor
+numbers are the same.
+</p>
+<p>Changed 26-Mar-96: version 1.10.
+ Setup code completely re-written.
+ Several incompatible changes have been made:
+ - the lisp and Perl code must be installed via make install,
+not by copying.
+ - some data is specified in a .notesrc file; copy and modify sample.notesrc.
+ - several internal elisp changes.
+ - catsubject added (bound to C-cC-s):  collect all notes about the
+current subject.
+ - new notes-files are initialized with fields based on the prior
+day&rsquo;s notes; see mknew for details.
+ - daily_work is gone; mkall is rewritten to use .notesrc.
+</p>
+<p>Changed 29-Apr-96: version 1.11.
+ Real documentation.
+ Mknew caching added.
+</p>
+<p>Changed  9-Aug-96: version 1.12.
+ Added notesinit to do all setup for new users.
+</p>
+<p>Changed 24-Aug-96: version 1.13.
+ Minor documentation fixes.
+</p>
+<p>Changed 20-Dec-97: version 1.14.
+Autoconf support.
+</p>
+<p>Fontification of the index buffer is now pre-computed in perl
+other than done when the file is needed (in elisp with slow regular
+expressions).  2000-line index files are now 1-2 seconds rather than
+15-30 on a 100MHz Pentium.  If necessary (the
+pre-computed version isn&rsquo;t up-to-date) we fall back on the slower
+code.
+</p>
+<p>Related work improved (suggestion by David Weisman &lt;weisman@app1.osf.org&gt;).
+</p>
+<p>Documentation improvement (problem found by Martin L. Smith
+&lt;martin@ner.com&gt;).
+</p>
+<p>Installation improved (code by Jason Bastek &lt;jason@aai.com&gt;).
+</p>
+<p>Bug in notes-index mode with subjects containing colons fixed (johnh).
+</p>
+<p>Encryption now supports mailcrypt.el.
+</p>
+<p>Support for emacs 20 (a small font-lock change).
+</p>
+<p>Changed  5-Jan-98: version 1.15.
+Bug in decryption for non-PAM users fixed
+ (suggestion by Kevin Davidson &lt;tkld@quadstone.com&gt;).
+</p>
+<p>Y2K statement added
+ (suggestion by Kevin Davidson &lt;tkld@quadstone.com&gt;).
+</p>
+<p>Pointer to mailcrypt added (as a supported encryption package).
+Problem pointed out by K. Ueda &lt;kueda@jupiter.qse.tohoku.ac.jp&gt;.
+</p>
+<p>Changed  4-Nov-98: version 1.16.
+Bug in kill-ring handling of notes-old-underline-line
+ fixed by Tim Potter &lt;timp@jna.com.au&gt;.
+Bug in whitespace handling after PGP encryption fixed by Tim Potter.
+Bugs in handling of entries with hash signs in their name fixed
+ (found by Tim Potter).
+Fontification of index buffer further improved
+ (mapcar is your friend).
+Xemacs support added based on code contributed by Ramesh Govindan.
+</p>
+<p>Changed 28-Feb-99: version 1.17:
+Improvement:  notes-electric-return now fixes up the prev/next links
+ of new entries (only).  Code contributed by
+ Takashi Nishimoto.
+</p>
+<p>Bug fix:  reversed options -batch and -q in configure.in to placate
+ XEmacs 20.0; changed notesinit to not downcase the pathname
+ (bugs found by Thierry Bezecourt).
+</p>
+<p>Clarification: Autofilling of new notes more clear in the manual (hopefully,
+ suggested by Solofo Ramangalahy).
+</p>
+<p>Bug fix:  a y2k bug in was found and fixed in mkindex.  Sigh.
+</p>
+<p>New:  Two mailing lists for notes-mode have been created:
+&lsquo;<tt>notes-mode-announce@heidemann.la.ca.us</tt>&rsquo; and 
+&lsquo;<tt>notes-mode-talk@heidemann.la.ca.us</tt>&rsquo;.
+Send the line &ldquo;subscribe notes-mode-announce&rdquo;
+(or &ldquo;subscribe notes-mode-talk&rdquo;)
+to &lsquo;<tt>majordomo@heidemann.la.ca.us</tt>&rsquo;
+to join them.
+[<em>These instructions are now superceeded; to subscribe, go to
+&lsquo;<tt>http://www.heidemann.la.ca.us/mailman/listinfo/notes-mode-talk</tt>&rsquo;
+and
+&lsquo;<tt>http://www.heidemann.la.ca.us/mailman/listinfo/notes-mode-announce</tt>&rsquo;.</em>]
+</p>
+<p>Changed  6-Oct-99: version 1.18:
+Bug fix:  handling of electric-prevnext is better when there are
+ existing prev/next links.
+</p> 
+<p>Clarification: I added some pointers in the code to the installation
+ instructions.  (Apparently people can&rsquo;t RTF README.)
+</p>
+<p>Extension: mailcrypt-3.5.x suported including pgp, pgp5 and gpg.
+</p>
+<p>Changed (date 23-Dec-00): version 1.19:
+Bug fix (cosmetic): suppress comments in encrypted nodes.
+</p>
+<p>Install fixes from Kannan Varadhan: elisp directories changed on install.
+</p>
+<p>Added C-j as a synonym for RET in notes-mode to parallel C++ or perl mode.
+(Suggested by Fred Jaggi &lsquo;<tt>jaggi@rsn.hp.com</tt>&rsquo;.)
+</p>
+<p>Outline-minor-mode support added and documented.
+(Suggested by Tim Carroll &lsquo;<tt>tim@boomboom.com</tt>&rsquo;.)
+</p>
+<p>Bug/typo fixes in gpg support
+(Contributed by William A. Perkins &lsquo;<tt>wa_perkins@pnl.gov</tt>&rsquo;,
+with separate patches from Knut Anders Hatlen &lsquo;<tt>kahatlen@online.no</tt>&rsquo;.)
+</p>
+<p>Installation improvements suggested by Christophe Troestler
+&lsquo;<tt>Ch.Troestler@linkline.be</tt>&rsquo;:
+use install-info to update the info dir,
+warn users of &ndash;prefix that lisp files go elsewhere.
+</p>
+<p>Changed (date  1-Feb-01): version 1.20:
+Bug fix: missing file notes-first.el added to the distribution.
+(Bug found by Michael Totschnig &lsquo;<tt>michaelt@supernet.ca</tt>&rsquo;.)
+</p>
+<p>Changed ( 5-Dec-01): version 1.21:
+(backed-out&mdash;didn&rsquo;t work with spaced URLs) 
+URL lookup now uses thing-at-point.
+</p>
+<p>Fix to make notes-mode work with emacs-21.1
+(Fix from Klaus Zeitler  &lsquo;<tt>kzeitler@lucent.com</tt>&rsquo;.)
+</p>
+<p>Changed ( 3-Jan-02): version 1.22:
+Several bugs in &lsquo;<tt>notesinit</tt>&rsquo; for stricter Perl implementations
+(bug found by Paul Craven&quot; &lsquo;<tt>pcraven@yorku.ca</tt>&rsquo;,
+and Kasper van Wijk &lsquo;<tt>kasper@acoustics.mines.edu</tt>&rsquo;)
+and to make it run cleanly more often.
+</p>
+<p>Notes-first now autoinitializes notes mode from emacs.
+(As instisted by rms, unfortunately about two years later than requested.)
+</p>
+
+<p>Changed (20-Feb-05): version 1.23:
+Outline mode is now forcebly turned on to avoid interactions
+with user&rsquo;s text-mode hooks
+(bug and fix from Nils Ackermann &lsquo;<tt>nils@nieback.de</tt>&rsquo;).
+</p>
+<p>Install bug involving ordering of scripts and byte-compilation
+fixed (bug and fix from Mark Allman &lsquo;<tt>mallman@grc.nasa.gov</tt>&rsquo;).
+</p>
+<p>Fix obscure bug in configure, reported by Klaus Zeitler &lsquo;<tt>kzeitler@lucent.com</tt>&rsquo;.
+</p>
+<p>Fix for notes-summarize-subject when no subject is specified (bug and fix
+from Geoff Kuenning).
+</p>
+<p>Changed (14-Jan-06): version 1.24:
+</p>
+<p>install-info bug documented with the Debian install-info
+(bug reported by Aaron Falk &lsquo;<tt>falk@isi.edu</tt>&rsquo;).
+</p>
+<p>Automatic date completion in new days is now done in the current
+locale, so it should now work for non-English languages.  Bug reported
+by Torsten Bronger &lsquo;<tt>bronger@physik.rwth-aachen.de</tt>&rsquo;.
+</p>
+<p>Fixed a bug in mkindexcache, triggered by subjects with percent signs
+in them.  Bug reported by Philip Austin &lsquo;<tt>paustin@eos.ubc.ca</tt>&rsquo;.
+</p>
+<p>We&rsquo;re a bit more robust about subjects, I hope.  Warnings should
+appear about embedded number signs, and leading spaces should be
+filtered.  Bug reported by Philip Austin &lsquo;<tt>paustin@eos.ubc.ca</tt>&rsquo;.
+</p>
+<p>Notes-mode now dervies from indented-text-mode rather than
+paragraph-indent-text mode.  Unfortunatley this is not customizable
+because of limitations of define-derived-mode.  Change suggested by
+Aaron Falk &lsquo;<tt>falk@isi.edu</tt>&rsquo;.
+</p>
+<p>Provide better hints about how to get started after installation or
+running notes-mode in emacs for the first time.
+</p>
+<p>In notes init, the default path for dir was the full path, not the tilde
+version of the path.  Now it defaults to using tidle for home
+directory.  Bug reported by Mark Allman &lsquo;<tt>allman@icir.org</tt>&rsquo;.
+</p>
+<p>Changed (26-May-06): version 1.25:
+</p>
+<p>fixed a bug in the release tar.gz file that had a additional copies
+copy nested.
+</p>
+<p>Changed (30-Jun-08): version 1.26:
+</p>
+<p>Force unicode I/O in &lsquo;<tt>mkindexcache</tt>&rsquo; to fix highlighting mis-alignment
+when using emacs-21 with unicode subject lines.
+</p>
+<p>Changed mkprevnext and mkrawindex to optionally take the list of notes files
+to index from stdin rather than from the command line.  Yes, I finally
+have 4093 notes files, overflowing the Unix command line buffer.
+</p>
+<p>Changes notes-mode.el to put path in quotes, allowing spaces to appear in home directory names (bug fix from Ulrich Herbst).
+</p>
+<p>Added a suggested features section.
+</p>
+<p>Changed ( 8-Aug-08): version 1.27:
+</p>
+<p>Change I/O in &lsquo;<tt>mkindexcache</tt>&rsquo; to use locale (the sadly correct thing)
+rather than forcing utf-8 (the Righteous Path).
+Bug report from Geoff Kuenning, a man with an older Unix environment than I.
+</p>
+<p>Changed (20-Jun-10): version 1.28:
+</p>
+<p>Changed a regular expression in &lsquo;<tt>notes-index-mode.el</tt>&rsquo; that was 
+causing emacs-v23 (a pre-release version)
+to regular expression infinite recursion.
+</p>
+<p>Changed (2012-04-04): version 1.29
+</p>
+<p>(2011-08-23) Changed <code>run-hooks</code> to <code>run-mode-hooks</code>.
+Bug report from Geoff Kuenning.
+</p>
+<p>Changed some handling of PGP encryption to account for 
+some apparent API changes.
+</p>
+<p>(2012-04-04) Fixed encyrption to handle encrypting empty notes at the end 
+of buffers without going into an infinite loop.
+Clearly wrong code, but you have to ask this guy for why he tried:
+Bug report from Geoff Kuenning.
+</p>
+
+
+<hr size="6">
+<a name="Suggested-features"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#Changes" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_5.html#Installation" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="#History" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="#History" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_5.html#Installation" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Suggested-features-1"></a>
+<h2 class="section">4.4 Suggested features</h2>
+
+<p>Features suggested by users but not yet implemented:
+</p>
+<p>21-Feb-08: (from Xavier Maillard): should support &ldquo;disconnected&rdquo; notes that
+are indexed but not date-based.
+</p>
+<p>21-Feb-08: (from John Heidemann): should switch all notes files to have an extension (maybe &lsquo;<tt>.notes</tt>&rsquo;).
+</p>
+<hr size="6">
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#History" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_5.html#Installation" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<p>
+ <font size="-1">
+  This document was generated by <em>John Heidemann</em> on <em>April 4, 2012</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.82</em></a>.
+ </font>
+ <br>
+
+</p>
+</body>
+</html>
diff --git a/packages/notes-mode/HTML/notes-mode_5.html b/packages/notes-mode/HTML/notes-mode_5.html
new file mode 100644 (file)
index 0000000..7e28399
--- /dev/null
@@ -0,0 +1,124 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+<html>
+<!-- Created on April 4, 2012 by texi2html 1.82
+texi2html was written by: 
+            Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+-->
+<head>
+<title>Notes-mode: 5. Installation</title>
+
+<meta name="description" content="Notes-mode: 5. Installation">
+<meta name="keywords" content="Notes-mode: 5. Installation">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="texi2html 1.82">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+blockquote.smallquotation {font-size: smaller}
+pre.display {font-family: serif}
+pre.format {font-family: serif}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+pre.smalldisplay {font-family: serif; font-size: smaller}
+pre.smallexample {font-size: smaller}
+pre.smallformat {font-family: serif; font-size: smaller}
+pre.smalllisp {font-size: smaller}
+span.roman {font-family:serif; font-weight:normal;}
+span.sansserif {font-family:sans-serif; font-weight:normal;}
+ul.toc {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+
+<a name="Installation"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="notes-mode_4.html#Suggested-features" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#Keystroke-index" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode_4.html#History" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#Keystroke-index" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Installation-1"></a>
+<h1 class="chapter">5. Installation</h1>
+
+<p>To install notes-mode,
+</p>
+<ol>
+<li>
+Unpack and extract the distribution
+(gunzip notes-mode-xxx.tar.gz; tar xvf notes-mode-xxx.tar; cd notes-mode-xxx).
+
+</li><li>
+Run configure (./configure).
+
+</li><li>
+Type &ldquo;make install&rdquo;.
+</li></ol>
+
+<p>(To control what&rsquo;s installed where, use &ndash;prefix=/where, or
+&ndash;with-lisp-dir=/where, &ndash;datadir=/where (for scripts),
+and &ndash;infodir=/where.)
+</p>
+<p>For each user:
+</p><ol>
+<li>
+Run notesinit
+</li></ol>
+
+<p>If you have problems with paths being incorrect, please be aware that
+you <em>cannot</em> run notes directly out of where you untar it.  The
+installation process customizes the programs for where things are on
+your system.
+Make sure you move out of the directory where you untarred it
+before running it.
+</p>
+
+<p>The most recent distribution of notes-mode 
+ is always available via
+ &lsquo;<tt>http://www.isi.edu/~johnh/SOFTWARE/NOTES_MODE/</tt>&rsquo;.
+</p>
+
+
+<hr size="6">
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="notes-mode_4.html#History" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#Keystroke-index" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<p>
+ <font size="-1">
+  This document was generated by <em>John Heidemann</em> on <em>April 4, 2012</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.82</em></a>.
+ </font>
+ <br>
+
+</p>
+</body>
+</html>
diff --git a/packages/notes-mode/HTML/notes-mode_6.html b/packages/notes-mode/HTML/notes-mode_6.html
new file mode 100644 (file)
index 0000000..9cbb6d9
--- /dev/null
@@ -0,0 +1,149 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+<html>
+<!-- Created on April 4, 2012 by texi2html 1.82
+texi2html was written by: 
+            Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+-->
+<head>
+<title>Notes-mode: Keystroke index</title>
+
+<meta name="description" content="Notes-mode: Keystroke index">
+<meta name="keywords" content="Notes-mode: Keystroke index">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="texi2html 1.82">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+blockquote.smallquotation {font-size: smaller}
+pre.display {font-family: serif}
+pre.format {font-family: serif}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+pre.smalldisplay {font-family: serif; font-size: smaller}
+pre.smallexample {font-size: smaller}
+pre.smallformat {font-family: serif; font-size: smaller}
+pre.smalllisp {font-size: smaller}
+span.roman {font-family:serif; font-weight:normal;}
+span.sansserif {font-family:sans-serif; font-weight:normal;}
+ul.toc {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+
+<a name="Keystroke-index"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="notes-mode_5.html#Installation" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_7.html#Concept-index" title="Next section in reading order"> &gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode_5.html#Installation" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_7.html#Concept-index" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Keystroke-index-1"></a>
+<h1 class="unnumbered">Keystroke index</h1>
+
+<p>This index lists notes-mode keystrokes.
+</p>
+<table><tr><th valign="top">Jump to: &nbsp; </th><td><a href="#Keystroke-index-1_ky_letter-C" class="summary-letter"><b>C</b></a>
+ &nbsp; 
+<a href="#Keystroke-index-1_ky_letter-M" class="summary-letter"><b>M</b></a>
+ &nbsp; 
+<a href="#Keystroke-index-1_ky_letter-O" class="summary-letter"><b>O</b></a>
+ &nbsp; 
+<a href="#Keystroke-index-1_ky_letter-R" class="summary-letter"><b>R</b></a>
+ &nbsp; 
+<a href="#Keystroke-index-1_ky_letter-S" class="summary-letter"><b>S</b></a>
+ &nbsp; 
+<a href="#Keystroke-index-1_ky_letter-T" class="summary-letter"><b>T</b></a>
+ &nbsp; 
+</td></tr></table>
+<table border="0" class="index-ky">
+<tr><td></td><th align="left">Index Entry</th><th align="left"> Section</th></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="Keystroke-index-1_ky_letter-C">C</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#index-C_002dc-C_002dd"><code>C-c C-d</code></a></td><td valign="top"><a href="notes-mode_3.html#Encryption">3.1.3 Encryption</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#index-C_002dc-C_002de"><code>C-c C-e</code></a></td><td valign="top"><a href="notes-mode_3.html#Encryption">3.1.3 Encryption</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#index-C_002dc-C_002di"><code>C-c C-i</code></a></td><td valign="top"><a href="notes-mode_3.html#Getting-around">3.1.1 Getting around</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#index-C_002dc-C_002dk"><code>C-c C-k</code></a></td><td valign="top"><a href="notes-mode_3.html#Getting-around">3.1.1 Getting around</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#index-C_002dc-C_002dn"><code>C-c C-n</code></a></td><td valign="top"><a href="notes-mode_3.html#Getting-around">3.1.1 Getting around</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#index-C_002dc-C_002dp"><code>C-c C-p</code></a></td><td valign="top"><a href="notes-mode_3.html#Getting-around">3.1.1 Getting around</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#index-C_002dc-C_002ds"><code>C-c C-s</code></a></td><td valign="top"><a href="notes-mode_3.html#Subject-summary">3.1.2 Subject summary</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#index-C_002dc-C_002ds-1"><code>C-c C-s</code></a></td><td valign="top"><a href="notes-mode_3.html#Notes-indices">3.2 Notes indices</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#index-C_002dcRTN"><code>C-c&lt;RTN&gt;</code></a></td><td valign="top"><a href="notes-mode_3.html#Getting-around">3.1.1 Getting around</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="Keystroke-index-1_ky_letter-M">M</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#index-M_002dC_002da"><code>M-C-a</code></a></td><td valign="top"><a href="notes-mode_3.html#Getting-around">3.1.1 Getting around</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#index-M_002dC_002de"><code>M-C-e</code></a></td><td valign="top"><a href="notes-mode_3.html#Getting-around">3.1.1 Getting around</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#index-mouse_002d2"><code>mouse-2</code></a></td><td valign="top"><a href="notes-mode_2.html#The-notes-index">2.3 The notes index</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="Keystroke-index-1_ky_letter-O">O</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#index-o"><code>o</code></a></td><td valign="top"><a href="notes-mode_3.html#Notes-indices">3.2 Notes indices</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="Keystroke-index-1_ky_letter-R">R</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#index-RTN"><code>RTN</code></a></td><td valign="top"><a href="notes-mode_2.html#A-notes-file">2.2 A notes file</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#index-RTN-1"><code>RTN</code></a></td><td valign="top"><a href="notes-mode_2.html#The-notes-index">2.3 The notes index</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="Keystroke-index-1_ky_letter-S">S</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#index-S_002dmouse_002d2"><code>S-mouse-2</code></a></td><td valign="top"><a href="notes-mode_2.html#A-notes-file">2.2 A notes file</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="Keystroke-index-1_ky_letter-T">T</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#index-TAB"><code>TAB</code></a></td><td valign="top"><a href="notes-mode_2.html#A-notes-file">2.2 A notes file</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+</table>
+<table><tr><th valign="top">Jump to: &nbsp; </th><td><a href="#Keystroke-index-1_ky_letter-C" class="summary-letter"><b>C</b></a>
+ &nbsp; 
+<a href="#Keystroke-index-1_ky_letter-M" class="summary-letter"><b>M</b></a>
+ &nbsp; 
+<a href="#Keystroke-index-1_ky_letter-O" class="summary-letter"><b>O</b></a>
+ &nbsp; 
+<a href="#Keystroke-index-1_ky_letter-R" class="summary-letter"><b>R</b></a>
+ &nbsp; 
+<a href="#Keystroke-index-1_ky_letter-S" class="summary-letter"><b>S</b></a>
+ &nbsp; 
+<a href="#Keystroke-index-1_ky_letter-T" class="summary-letter"><b>T</b></a>
+ &nbsp; 
+</td></tr></table>
+
+
+<hr size="6">
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="notes-mode_5.html#Installation" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_7.html#Concept-index" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<p>
+ <font size="-1">
+  This document was generated by <em>John Heidemann</em> on <em>April 4, 2012</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.82</em></a>.
+ </font>
+ <br>
+
+</p>
+</body>
+</html>
diff --git a/packages/notes-mode/HTML/notes-mode_7.html b/packages/notes-mode/HTML/notes-mode_7.html
new file mode 100644 (file)
index 0000000..3ad23bd
--- /dev/null
@@ -0,0 +1,220 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+<html>
+<!-- Created on April 4, 2012 by texi2html 1.82
+texi2html was written by: 
+            Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+-->
+<head>
+<title>Notes-mode: Concept index</title>
+
+<meta name="description" content="Notes-mode: Concept index">
+<meta name="keywords" content="Notes-mode: Concept index">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="texi2html 1.82">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+blockquote.smallquotation {font-size: smaller}
+pre.display {font-family: serif}
+pre.format {font-family: serif}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+pre.smalldisplay {font-family: serif; font-size: smaller}
+pre.smallexample {font-size: smaller}
+pre.smallformat {font-family: serif; font-size: smaller}
+pre.smalllisp {font-size: smaller}
+span.roman {font-family:serif; font-weight:normal;}
+span.sansserif {font-family:sans-serif; font-weight:normal;}
+ul.toc {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+
+<a name="Concept-index"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="notes-mode_6.html#Keystroke-index" title="Previous section in reading order"> &lt; </a>]</td>
+<td valign="middle" align="left">[ &gt; ]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#Keystroke-index" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Up section"> Up </a>]</td>
+<td valign="middle" align="left">[ &gt;&gt; ]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<a name="Concept-index-1"></a>
+<h1 class="unnumbered">Concept index</h1>
+
+<p>This index lists notes-mode concepts.
+</p>
+<table><tr><th valign="top">Jump to: &nbsp; </th><td><a href="#Concept-index-1_cp_symbol-1" class="summary-letter"><b>.</b></a>
+ &nbsp; 
+<br>
+<a href="#Concept-index-1_cp_letter-C" class="summary-letter"><b>C</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-D" class="summary-letter"><b>D</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-E" class="summary-letter"><b>E</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-F" class="summary-letter"><b>F</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-I" class="summary-letter"><b>I</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-K" class="summary-letter"><b>K</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-M" class="summary-letter"><b>M</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-N" class="summary-letter"><b>N</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-P" class="summary-letter"><b>P</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-R" class="summary-letter"><b>R</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-S" class="summary-letter"><b>S</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-T" class="summary-letter"><b>T</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-U" class="summary-letter"><b>U</b></a>
+ &nbsp; 
+</td></tr></table>
+<table border="0" class="index-cp">
+<tr><td></td><th align="left">Index Entry</th><th align="left"> Section</th></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="Concept-index-1_cp_symbol-1">.</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#index-_002enotesrc">.notesrc</a></td><td valign="top"><a href="notes-mode_3.html#Notes_002dmode-configuration">3.3 Notes-mode configuration</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="Concept-index-1_cp_letter-C">C</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#index-configuration">configuration</a></td><td valign="top"><a href="notes-mode_3.html#Notes_002dmode-configuration">3.3 Notes-mode configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#index-conventions">conventions</a></td><td valign="top"><a href="notes-mode_3.html#Useful-conventions">3.1.4 Useful conventions</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#index-Crontab">Crontab</a></td><td valign="top"><a href="notes-mode_2.html#The-notes-index">2.3 The notes index</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="Concept-index-1_cp_letter-D">D</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#index-Decryption">Decryption</a></td><td valign="top"><a href="notes-mode_3.html#Encryption">3.1.3 Encryption</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#index-Directory-hierarchy">Directory hierarchy</a></td><td valign="top"><a href="notes-mode_2.html#The-notes-directories">2.4 The notes directories</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="Concept-index-1_cp_letter-E">E</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#index-Encryption">Encryption</a></td><td valign="top"><a href="notes-mode_3.html#Encryption">3.1.3 Encryption</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="Concept-index-1_cp_letter-F">F</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#index-Font-matter">Font matter</a></td><td valign="top"><a href="notes-mode_2.html#A-notes-file">2.2 A notes file</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="Concept-index-1_cp_letter-I">I</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#index-imenu">imenu</a></td><td valign="top"><a href="notes-mode_3.html#Getting-around">3.1.1 Getting around</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#index-Intermediate-directories">Intermediate directories</a></td><td valign="top"><a href="notes-mode_2.html#The-notes-directories">2.4 The notes directories</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="Concept-index-1_cp_letter-K">K</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#index-key_002did">key-id</a></td><td valign="top"><a href="notes-mode_3.html#Encryption">3.1.3 Encryption</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="Concept-index-1_cp_letter-M">M</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#index-mailcrypt">mailcrypt</a></td><td valign="top"><a href="notes-mode_3.html#Encryption">3.1.3 Encryption</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#index-mkall">mkall</a></td><td valign="top"><a href="notes-mode_2.html#The-notes-index">2.3 The notes index</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#index-mknew">mknew</a></td><td valign="top"><a href="notes-mode_3.html#Useful-conventions">3.1.4 Useful conventions</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="Concept-index-1_cp_letter-N">N</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#index-Notes-directories">Notes directories</a></td><td valign="top"><a href="notes-mode_2.html#The-notes-directories">2.4 The notes directories</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#index-Notes-entries">Notes entries</a></td><td valign="top"><a href="notes-mode_2.html#A-notes-file">2.2 A notes file</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#index-Notes-file-permissions">Notes file permissions</a></td><td valign="top"><a href="notes-mode_2.html#The-notes-directories">2.4 The notes directories</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#index-Notes-files">Notes files</a></td><td valign="top"><a href="notes-mode_2.html#A-notes-file">2.2 A notes file</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#index-Notes-files-1">Notes files</a></td><td valign="top"><a href="notes-mode_2.html#The-notes-directories">2.4 The notes directories</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#index-Notes-files_002c-font-matter">Notes files, font matter</a></td><td valign="top"><a href="notes-mode_2.html#A-notes-file">2.2 A notes file</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#index-Notes-index">Notes index</a></td><td valign="top"><a href="notes-mode_2.html#The-notes-index">2.3 The notes index</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#index-Notes-links">Notes links</a></td><td valign="top"><a href="notes-mode_2.html#A-notes-file">2.2 A notes file</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#index-Notes-subjects">Notes subjects</a></td><td valign="top"><a href="notes-mode_2.html#A-notes-file">2.2 A notes file</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#index-notes_002dmode_002dinitialization_002dprogram">notes-mode-initialization-program</a></td><td valign="top"><a href="notes-mode_3.html#Useful-conventions">3.1.4 Useful conventions</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#index-notesinit">notesinit</a></td><td valign="top"><a href="notes-mode_2.html#Getting-started">2.1 Getting started</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="Concept-index-1_cp_letter-P">P</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#index-PAM">PAM</a></td><td valign="top"><a href="notes-mode_3.html#Encryption">3.1.3 Encryption</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#index-PGP">PGP</a></td><td valign="top"><a href="notes-mode_3.html#Encryption">3.1.3 Encryption</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#index-PGP-Augmented-Messaging">PGP Augmented Messaging</a></td><td valign="top"><a href="notes-mode_3.html#Encryption">3.1.3 Encryption</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#index-Pretty-good-privacy">Pretty good privacy</a></td><td valign="top"><a href="notes-mode_3.html#Encryption">3.1.3 Encryption</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#index-Pseudo_002dURLs">Pseudo-URLs</a></td><td valign="top"><a href="notes-mode_2.html#A-notes-file">2.2 A notes file</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="Concept-index-1_cp_letter-R">R</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#index-re_002dindexing">re-indexing</a></td><td valign="top"><a href="notes-mode_2.html#The-notes-index">2.3 The notes index</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#index-Root-directory">Root directory</a></td><td valign="top"><a href="notes-mode_2.html#The-notes-directories">2.4 The notes directories</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="Concept-index-1_cp_letter-S">S</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#index-setup">setup</a></td><td valign="top"><a href="notes-mode_2.html#Getting-started">2.1 Getting started</a></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#index-Subject-summary">Subject summary</a></td><td valign="top"><a href="notes-mode_3.html#Subject-summary">3.1.2 Subject summary</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="Concept-index-1_cp_letter-T">T</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_3.html#index-Today">Today</a></td><td valign="top"><a href="notes-mode_3.html#Useful-conventions">3.1.4 Useful conventions</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="Concept-index-1_cp_letter-U">U</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="notes-mode_2.html#index-URLs">URLs</a></td><td valign="top"><a href="notes-mode_2.html#A-notes-file">2.2 A notes file</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+</table>
+<table><tr><th valign="top">Jump to: &nbsp; </th><td><a href="#Concept-index-1_cp_symbol-1" class="summary-letter"><b>.</b></a>
+ &nbsp; 
+<br>
+<a href="#Concept-index-1_cp_letter-C" class="summary-letter"><b>C</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-D" class="summary-letter"><b>D</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-E" class="summary-letter"><b>E</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-F" class="summary-letter"><b>F</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-I" class="summary-letter"><b>I</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-K" class="summary-letter"><b>K</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-M" class="summary-letter"><b>M</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-N" class="summary-letter"><b>N</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-P" class="summary-letter"><b>P</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-R" class="summary-letter"><b>R</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-S" class="summary-letter"><b>S</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-T" class="summary-letter"><b>T</b></a>
+ &nbsp; 
+<a href="#Concept-index-1_cp_letter-U" class="summary-letter"><b>U</b></a>
+ &nbsp; 
+</td></tr></table>
+
+
+
+
+<hr size="6">
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="notes-mode_6.html#Keystroke-index" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[ &gt;&gt; ]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<p>
+ <font size="-1">
+  This document was generated by <em>John Heidemann</em> on <em>April 4, 2012</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.82</em></a>.
+ </font>
+ <br>
+
+</p>
+</body>
+</html>
diff --git a/packages/notes-mode/HTML/notes-mode_abt.html b/packages/notes-mode/HTML/notes-mode_abt.html
new file mode 100644 (file)
index 0000000..0671729
--- /dev/null
@@ -0,0 +1,167 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+<html>
+<!-- Created on April 4, 2012 by texi2html 1.82
+texi2html was written by: 
+            Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+-->
+<head>
+<title>Notes-mode: About This Document</title>
+
+<meta name="description" content="Notes-mode: About This Document">
+<meta name="keywords" content="Notes-mode: About This Document">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="texi2html 1.82">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+blockquote.smallquotation {font-size: smaller}
+pre.display {font-family: serif}
+pre.format {font-family: serif}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+pre.smalldisplay {font-family: serif; font-size: smaller}
+pre.smallexample {font-size: smaller}
+pre.smallformat {font-family: serif; font-size: smaller}
+pre.smalllisp {font-size: smaller}
+span.roman {font-family:serif; font-weight:normal;}
+span.sansserif {font-family:sans-serif; font-weight:normal;}
+ul.toc {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+
+<a name="SEC_About"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h1>About This Document</h1>
+<p>
+  This document was generated by <em>John Heidemann</em> on <em>April 4, 2012</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.82</em></a>.
+</p>
+<p>
+  The buttons in the navigation panels have the following meaning:
+</p>
+<table border="1">
+  <tr>
+    <th> Button </th>
+    <th> Name </th>
+    <th> Go to </th>
+    <th> From 1.2.3 go to</th>
+  </tr>
+  <tr>
+    <td align="center"> [ &lt; ] </td>
+    <td align="center">Back</td>
+    <td>Previous section in reading order</td>
+    <td>1.2.2</td>
+  </tr>
+  <tr>
+    <td align="center"> [ &gt; ] </td>
+    <td align="center">Forward</td>
+    <td>Next section in reading order</td>
+    <td>1.2.4</td>
+  </tr>
+  <tr>
+    <td align="center"> [ &lt;&lt; ] </td>
+    <td align="center">FastBack</td>
+    <td>Beginning of this chapter or previous chapter</td>
+    <td>1</td>
+  </tr>
+  <tr>
+    <td align="center"> [ Up ] </td>
+    <td align="center">Up</td>
+    <td>Up section</td>
+    <td>1.2</td>
+  </tr>
+  <tr>
+    <td align="center"> [ &gt;&gt; ] </td>
+    <td align="center">FastForward</td>
+    <td>Next chapter</td>
+    <td>2</td>
+  </tr>
+  <tr>
+    <td align="center"> [Top] </td>
+    <td align="center">Top</td>
+    <td>Cover (top) of document</td>
+    <td> &nbsp; </td>
+  </tr>
+  <tr>
+    <td align="center"> [Contents] </td>
+    <td align="center">Contents</td>
+    <td>Table of contents</td>
+    <td> &nbsp; </td>
+  </tr>
+  <tr>
+    <td align="center"> [Index] </td>
+    <td align="center">Index</td>
+    <td>Index</td>
+    <td> &nbsp; </td>
+  </tr>
+  <tr>
+    <td align="center"> [ ? ] </td>
+    <td align="center">About</td>
+    <td>About (help)</td>
+    <td> &nbsp; </td>
+  </tr>
+</table>
+
+<p>
+  where the <strong> Example </strong> assumes that the current position is at <strong> Subsubsection One-Two-Three </strong> of a document of the following structure:
+</p>
+
+<ul>
+  <li> 1. Section One
+    <ul>
+      <li>1.1 Subsection One-One
+        <ul>
+          <li>...</li>
+        </ul>
+      </li>
+      <li>1.2 Subsection One-Two
+        <ul>
+          <li>1.2.1 Subsubsection One-Two-One</li>
+          <li>1.2.2 Subsubsection One-Two-Two</li>
+          <li>1.2.3 Subsubsection One-Two-Three &nbsp; &nbsp;
+            <strong>&lt;== Current Position </strong></li>
+          <li>1.2.4 Subsubsection One-Two-Four</li>
+        </ul>
+      </li>
+      <li>1.3 Subsection One-Three
+        <ul>
+          <li>...</li>
+        </ul>
+      </li>
+      <li>1.4 Subsection One-Four</li>
+    </ul>
+  </li>
+</ul>
+
+<hr size="1">
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<p>
+ <font size="-1">
+  This document was generated by <em>John Heidemann</em> on <em>April 4, 2012</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.82</em></a>.
+ </font>
+ <br>
+
+</p>
+</body>
+</html>
diff --git a/packages/notes-mode/HTML/notes-mode_fot.html b/packages/notes-mode/HTML/notes-mode_fot.html
new file mode 100644 (file)
index 0000000..088f9d6
--- /dev/null
@@ -0,0 +1,85 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+<html>
+<!-- Created on April 4, 2012 by texi2html 1.82
+texi2html was written by: 
+            Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+-->
+<head>
+<title>Notes-mode: Footnotes</title>
+
+<meta name="description" content="Notes-mode: Footnotes">
+<meta name="keywords" content="Notes-mode: Footnotes">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="texi2html 1.82">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+blockquote.smallquotation {font-size: smaller}
+pre.display {font-family: serif}
+pre.format {font-family: serif}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+pre.smalldisplay {font-family: serif; font-size: smaller}
+pre.smallexample {font-size: smaller}
+pre.smallformat {font-family: serif; font-size: smaller}
+pre.smalllisp {font-size: smaller}
+span.roman {font-family:serif; font-weight:normal;}
+span.sansserif {font-family:sans-serif; font-weight:normal;}
+ul.toc {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+
+<a name="SEC_Foot"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h1>Footnotes</h1>
+<h3><a name="FOOT1" href="notes-mode_1.html#DOCF1">(1)</a></h3>
+<p>Trademarked, in Great Britain, Sunone tells me.
+</p><h3><a name="FOOT2" href="notes-mode_1.html#DOCF2">(2)</a></h3>
+<p>I consider myself pretty anal about this subject,
+often typing notes in from paper after-the-fact,
+and <em>I</em> certainly don&rsquo;t manage to back-enter
+my notes all time time.
+</p><h3><a name="FOOT3" href="notes-mode_1.html#DOCF3">(3)</a></h3>
+
+<p>On the other hand, some folks at MIT are working
+on this problem from both the hardware and the social side of
+things (&lsquo;<tt>http://wearables.www.media.mit.edu/projects/wearables/</tt>&rsquo;)
+(Perhaps they have wild parties with computers, too.)
+</p><h3><a name="FOOT4" href="notes-mode_1.html#DOCF4">(4)</a></h3>
+<p>My hat is off to Rosa Parks
+and the many other normal people who triggered landmark cases.
+</p><h3><a name="FOOT5" href="notes-mode_1.html#DOCF5">(5)</a></h3>
+<p>If you think I&rsquo;m missing an alternative, please let me know.
+</p><hr size="1">
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<p>
+ <font size="-1">
+  This document was generated by <em>John Heidemann</em> on <em>April 4, 2012</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.82</em></a>.
+ </font>
+ <br>
+
+</p>
+</body>
+</html>
diff --git a/packages/notes-mode/HTML/notes-mode_toc.html b/packages/notes-mode/HTML/notes-mode_toc.html
new file mode 100644 (file)
index 0000000..f03a834
--- /dev/null
@@ -0,0 +1,111 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+<html>
+<!-- Created on April 4, 2012 by texi2html 1.82
+texi2html was written by: 
+            Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+-->
+<head>
+<title>Notes-mode: Table of Contents</title>
+
+<meta name="description" content="Notes-mode: Table of Contents">
+<meta name="keywords" content="Notes-mode: Table of Contents">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="texi2html 1.82">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+blockquote.smallquotation {font-size: smaller}
+pre.display {font-family: serif}
+pre.format {font-family: serif}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+pre.smalldisplay {font-family: serif; font-size: smaller}
+pre.smallexample {font-size: smaller}
+pre.smallformat {font-family: serif; font-size: smaller}
+pre.smalllisp {font-size: smaller}
+span.roman {font-family:serif; font-weight:normal;}
+span.sansserif {font-family:sans-serif; font-weight:normal;}
+ul.toc {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+
+<a name="SEC_Contents"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h1>Table of Contents</h1>
+<div class="contents">
+
+<ul class="toc">
+  <li><a name="toc-Introduction-1" href="notes-mode_1.html#Introduction">1. Introduction</a>
+  <ul class="toc">
+    <li><a name="toc-What-is-it_003f-1" href="notes-mode_1.html#What-is-it_003f">1.1 What is it?</a></li>
+    <li><a name="toc-Why-keep-notes-at-all_003f-1" href="notes-mode_1.html#Why-keep-notes-at-all_003f">1.2 Why keep notes at all?</a></li>
+    <li><a name="toc-Why-keep-notes-on_002dline_003f-1" href="notes-mode_1.html#Why-keep-notes-on_002dline_003f">1.3 Why keep notes on-line?</a></li>
+    <li><a name="toc-Why-use-notes_002dmode_003f-1" href="notes-mode_1.html#Why-use-notes_002dmode_003f">1.4 Why use notes-mode?</a></li>
+    <li><a name="toc-Y2K-Statement-1" href="notes-mode_1.html#Y2K-Statement">1.5 Y2K Statement</a></li>
+    <li><a name="toc-Related-work-1" href="notes-mode_1.html#Related-work">1.6 Related work</a></li>
+    <li><a name="toc-Staying-on-top-1" href="notes-mode_1.html#Staying-on-top">1.7 Staying on top</a></li>
+  </ul></li>
+  <li><a name="toc-Basics-1" href="notes-mode_2.html#Basics">2. Basics</a>
+  <ul class="toc">
+    <li><a name="toc-Getting-started-1" href="notes-mode_2.html#Getting-started">2.1 Getting started</a></li>
+    <li><a name="toc-A-notes-file-1" href="notes-mode_2.html#A-notes-file">2.2 A notes file</a></li>
+    <li><a name="toc-The-notes-index-1" href="notes-mode_2.html#The-notes-index">2.3 The notes index</a></li>
+    <li><a name="toc-The-notes-directories-1" href="notes-mode_2.html#The-notes-directories">2.4 The notes directories</a></li>
+  </ul></li>
+  <li><a name="toc-Advanced-Features-1" href="notes-mode_3.html#Advanced-Features">3. Advanced Features</a>
+  <ul class="toc">
+    <li><a name="toc-Notes-files-1" href="notes-mode_3.html#Notes-files">3.1 Notes files</a>
+    <ul class="toc">
+      <li><a name="toc-Getting-around-1" href="notes-mode_3.html#Getting-around">3.1.1 Getting around</a></li>
+      <li><a name="toc-Subject-summary-1" href="notes-mode_3.html#Subject-summary">3.1.2 Subject summary</a></li>
+      <li><a name="toc-Encryption-1" href="notes-mode_3.html#Encryption">3.1.3 Encryption</a></li>
+      <li><a name="toc-Useful-conventions-1" href="notes-mode_3.html#Useful-conventions">3.1.4 Useful conventions</a></li>
+    </ul></li>
+    <li><a name="toc-Notes-indices-1" href="notes-mode_3.html#Notes-indices">3.2 Notes indices</a></li>
+    <li><a name="toc-Notes_002dmode-configuration-1" href="notes-mode_3.html#Notes_002dmode-configuration">3.3 Notes-mode configuration</a></li>
+  </ul></li>
+  <li><a name="toc-History-1" href="notes-mode_4.html#History">4. History</a>
+  <ul class="toc">
+    <li><a name="toc-Notes_002dmode-history-1" href="notes-mode_4.html#Notes_002dmode-history">4.1 Notes-mode history</a></li>
+    <li><a name="toc-Credits-1" href="notes-mode_4.html#Credits">4.2 Credits</a></li>
+    <li><a name="toc-Changes-1" href="notes-mode_4.html#Changes">4.3 Changes</a></li>
+    <li><a name="toc-Suggested-features-1" href="notes-mode_4.html#Suggested-features">4.4 Suggested features</a></li>
+  </ul></li>
+  <li><a name="toc-Installation-1" href="notes-mode_5.html#Installation">5. Installation</a></li>
+  <li><a name="toc-Keystroke-index-1" href="notes-mode_6.html#Keystroke-index">Keystroke index</a></li>
+  <li><a name="toc-Concept-index-1" href="notes-mode_7.html#Concept-index">Concept index</a></li>
+</ul>
+</div>
+<hr size="1">
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="notes-mode.html#Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_6.html#Keystroke-index" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="notes-mode_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<p>
+ <font size="-1">
+  This document was generated by <em>John Heidemann</em> on <em>April 4, 2012</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.82</em></a>.
+ </font>
+ <br>
+
+</p>
+</body>
+</html>
diff --git a/packages/notes-mode/Makefile.in b/packages/notes-mode/Makefile.in
new file mode 100644 (file)
index 0000000..286bf63
--- /dev/null
@@ -0,0 +1,192 @@
+
+#
+# Makefile.in
+# (if you're reading Makefile, it's autogenerated from Makefile.in)
+# $Id: Makefile.in,v 1.31 2006/01/14 23:26:41 johnh Exp $
+#
+
+######################################################################
+#
+# user configurable parameters
+#
+
+prefix=@prefix@
+# LIB_DIR should be a private place for notes-mode stuff.
+LIB_DIR=@datadir@/notes-mode
+# EL_DIR should be where your site-specific emacs .el{,c}'s go.
+EL_DIR=@lisp_dir@
+# INFO_DIR is for emacs info files.
+INFO_DIR=@infodir@
+INSTALL_INFO=@install_info@
+INSTALL_INFO_SECTION=@install_info_section@
+
+# must be perl 5.000 or better.
+PERL=@perlbin@
+# must be 19 or greater
+EMACS=@emacsbin@
+
+MKDIR_P=@mkdir_p@
+
+#
+# end of user configurable parameters
+#
+######################################################################
+
+
+INSTALLABLE_OTHERS = \
+       README \
+       sample.notesrc \
+       release
+
+OTHERS = \
+       COPYING \
+       Makefile.in \
+       configure \
+       configure.in \
+       install-sh \
+       notes-mode.texi \
+       notes-mode.info \
+       notes-mode.ps.gz
+
+SCRIPTS = \
+       mkall mkindex mkprevnext mkrawindex mkindexcache \
+       mkconfig mknew catsubject notesinit setcrontab \
+       Notes.pm NotesIndex.pm NotesVars.pm
+
+ELS = \
+       notes-variables.el \
+       notes-mode.el notes-index-mode.el \
+       notes-url.el notes-aux.el \
+       notes-emacs.el notes-xemacs.el \
+       notes-first.el
+
+ITMP = /tmp/notes-mode
+
+MY_PERL=/usr/bin/perl
+MY_LIB_DIR=/home/johnh/NOTES/BIN
+MY_EL_DIR=/home/johnh/LIB/EMACS
+
+######################################################################
+#
+# Compliation stuff.
+#
+
+all:
+       @echo "nothing required for make; just run \"make install\""
+
+
+######################################################################
+#
+# Installation stuff.
+#
+
+# install_bins: $(BINS)
+
+install_els: 
+       $(MKDIR_P) $(EL_DIR)
+       $(MKDIR_P) $(LIB_DIR)
+       echo '(setq load-path (cons "$(EL_DIR)" load-path))' >.notes-recompile.el
+       echo '(cd "$(EL_DIR)")' >>.notes-recompile.el
+       for i in $(ELS); \
+       do \
+               sed -e 's@$(MY_LIB_DIR)@$(LIB_DIR)@' \
+                       -e 's@$(MY_EL_DIR)@$(EL_DIR)@' \
+                       -e 's@$(MY_LIB_DIR)@$(LIB_DIR)@' < $$i >$(EL_DIR)/$$i; \
+               echo '(byte-compile-file "'$$i'")' >>.notes-recompile.el; \
+       done
+       @echo Warnings in the elisp compilation can be ignored.
+       $(EMACS) -q -batch -l .notes-recompile.el
+
+install_scripts:
+       for i in $(SCRIPTS); \
+       do \
+               sed -e 's@$(MY_PERL)@$(PERL)@' \
+                       -e 's@$(MY_EL_DIR)@$(EL_DIR)@' \
+                       -e 's@$(MY_LIB_DIR)@$(LIB_DIR)@' < $$i >$(LIB_DIR)/$$i; \
+               chmod +x $(LIB_DIR)/$$i; \
+       done
+
+install_others:
+       cp $(INSTALLABLE_OTHERS) $(LIB_DIR)
+
+install_info:
+       $(MKDIR_P) $(INFO_DIR)
+       cp notes-mode.info $(INFO_DIR)/notes-mode
+       if test x$(INSTALL_INFO) = xno; \
+       then \
+                echo 'You must manually add notes mode to your info "dir" file.'; \
+       else \
+               $(INSTALL_INFO) $(INSTALL_INFO_SECTION) --info-file=notes-mode.info --dir-file=$(INFO_DIR)/dir; \
+       fi
+
+
+install_whatnext:
+       @echo "Once notes-mode is installed, start it by running emacs,"
+       @echo "and then do M-x load-library RET notes-mode RET."
+       @echo "Or run   info notes-mode   to read the manual."
+
+
+install: install_els install_scripts install_others install_info install_whatnext
+       @echo Notes-mode is installed.
+
+
+######################################################################
+#
+# Documentation stuff.
+#
+
+notes-mode.info: notes-mode.texi
+       makeinfo notes-mode.texi
+
+notes-mode.dvi: notes-mode.texi
+       texi2dvi notes-mode.texi
+
+notes-mode.ps.gz: notes-mode.dvi notes-mode.texi
+       dvips -f notes-mode.dvi |gzip >notes-mode.ps.gz
+
+html:
+       test -d HTML || mkdir HTML
+       ( cd HTML; texi2html -split_chapter ../notes-mode.texi )
+       ( cd HTML; texi2html -monolithic ../notes-mode.texi )
+
+texi: notes-mode.info notes-mode.dvi notes-mode.ps.gz html
+
+# Install_www is only for me.
+WWW_DIR=$$HOME/LIB/WWW/SOFTWARE/NOTES_MODE
+install_www: texi
+       cp HTML/*.html $(WWW_DIR)
+       cp notes-mode.ps.gz $(WWW_DIR)
+       cp notes-mode-`cat release`.tar.gz $(WWW_DIR)
+
+######################################################################
+#
+# Release stuff.
+#
+
+tar.gz: texi
+       $(MKDIR_P) $(ITMP)-`cat release`
+       cp $(INSTALLABLE_OTHERS) $(OTHERS)  $(ITMP)-`cat release`
+       mkdir $(ITMP)-`cat release`/HTML
+       cp -R HTML/.  $(ITMP)-`cat release`/HTML
+       cp $(SCRIPTS)  $(ITMP)-`cat release`
+#      cp $(SRCS)  $(ITMP)-`cat release`
+       for i in $(ELS); do cp $$i $(ITMP)-`cat release`; done
+#      cp -r SAMPLE  $(ITMP)-`cat release`
+#      echo "dir: $(ITMP)-`cat release`/SAMPLE" >$(ITMP)/notesrc
+#      ( NOTESRC=$(ITMP)-`cat release`/notesrc; export NOTESRC;  $(ITMP)-`cat release`/mkall )
+       ( cd /tmp; tar cvf - ./notes-mode-* ) | gzip >notes-mode-`cat release`.tar.gz
+       rm -rf $(ITMP)-`cat release`/HTML
+       rm -f $(ITMP)-`cat release`/*
+       rmdir $(ITMP)-`cat release`
+
+tar.gz.uu: tar.gz
+       uuencode notes-mode-`cat release`.tar.gz <notes-mode-`cat release`.tar.gz >notes-mode-`cat release`.tar.gz.uu
+
+RELEASE_DIR=$$HOME/WORKING/JOHNH_WWW/SOFTWARE/NOTES_MODE
+
+copy_release:
+       cp notes-mode-`cat release`.tar.gz $(RELEASE_DIR)
+       mv notes-mode-`cat release`.tar.gz RELEASES
+       cp HTML/notes-mode/* $(RELEASE_DIR)
+       cp HTML/notes-mode.html $(RELEASE_DIR)
+
diff --git a/packages/notes-mode/Notes.pm b/packages/notes-mode/Notes.pm
new file mode 100755 (executable)
index 0000000..129299b
--- /dev/null
@@ -0,0 +1,116 @@
+#!/usr/bin/perl
+
+#
+# Notes.pm
+# $Id: Notes.pm,v 1.9 2010/06/20 18:31:22 johnh Exp $
+#
+# Copyright (C) 1996-2006,2012  Free Software Foundation, Inc.
+# Comments to <johnh@isi.edu>.
+#
+# This file is under the Gnu Public License, version 2.
+# For details see the COPYING which accompanies this distribution.
+#
+
+#
+# A Perl module implement a notes class. 
+#
+
+require 5.000;
+package Notes;
+use Carp;
+use strict;
+
+#----------------------------------------------------------------------
+
+# my($Notes::revsion) = '$Id: Notes.pm,v 1.9 2010/06/20 18:31:22 johnh Exp $'; #' font-lock hack
+# my($Notes::VERSION) = 1.00;
+
+# public method
+# optional argument: pathname to read
+sub new {
+    my ($class, $file) = @_;
+    my $self = bless {};
+    if (defined($file)) {
+       $self->read_from_file($file);
+    } else {
+        $self->init();
+    };
+    return $self;
+}
+
+
+# public method
+sub read_from_file {
+    my ($self, $filename) = @_;
+
+    $self->init();
+
+    open(FILE, "<$filename") || croak "Cannot open $filename";
+    my(@lines) = <FILE>;
+    close FILE;
+    my($i);
+    my($start, $Subject) = (0, undef);
+    my(%entries);
+
+    for ($i = 0; $i < $#lines; $i++) {
+       if ($lines[$i] =~ /^\* / &&
+               $lines[$i+1] =~ /^-+\r?$/) {
+           $self->push_entry($Subject, join("", @lines[$start .. $i-1]));
+           $start = $i;
+           ($Subject) = ($lines[$i] =~ /^\*\s+(.*)\r?$/);
+       };
+    };
+    $i = $#lines + 1;
+    $self->push_entry($Subject, join("", @lines[$start .. $i-1]));
+    return 1;
+}
+
+# public_method
+sub subjects {
+    my($self) = @_;
+    return $self->{'subjects'};
+}
+
+# public method
+sub by_subject {
+    my($self, $Subject) = @_;
+    my($subject) = lc($Subject);
+    return wantarray ? () : undef
+       if (!defined($self->{'entryis_by_subject'}{$subject}));
+    my(@ret) = ();
+    foreach (@{$self->{'entryis_by_subject'}{$subject}}) {
+       push (@ret, $self->{'entries'}[$_]);
+    };
+    return @ret;
+}
+
+# public method
+sub prelude {
+    my($self) = @_;
+    return $self->{'pre'};
+}
+
+
+# private method
+sub push_entry {
+    my($self, $Subject, $entry) = @_;
+    if (!defined($Subject)) {
+       $self->{'pre'} = $entry;
+       return;
+    };
+    my($subject) = lc($Subject);
+    push (@{ $self->{'subjects'} }, $Subject);
+    push (@{ $self->{'entries'} }, $entry);
+    push (@{ $self->{'entryis_by_subject'}{$subject} }, $#{$self->{'entries'}});
+}
+
+
+# private method
+sub init {
+    my($self) = @_;
+# These inits break things.  Go figure.
+#    @{ $self->{'subjects'} } =  @{$self->{'entries'}} = ();
+#    %{ $self->{'entryis_by_subject'} } = ();
+    $self->{'pre'} = '';
+}
+
diff --git a/packages/notes-mode/NotesIndex.pm b/packages/notes-mode/NotesIndex.pm
new file mode 100755 (executable)
index 0000000..f547435
--- /dev/null
@@ -0,0 +1,100 @@
+#!/usr/bin/perl
+
+#
+# NotesIndex.pm
+# $Id: NotesIndex.pm,v 1.3 2003/05/23 16:26:19 johnh Exp $
+#
+# Copyright (C) 1996,2012  Free Software Foundation, Inc.
+# Comments to <johnh@isi.edu>.
+#
+# This file is under the Gnu Public License, version 2.
+# For details see the COPYING which accompanies this distribution.
+#
+
+#
+# A Perl module implement a notes-index class. 
+#
+
+package NotesIndex;
+use Carp;
+use strict;
+
+require 5.000;
+$Notes::revsion = '$Id: NotesIndex.pm,v 1.3 2003/05/23 16:26:19 johnh Exp $';
+$Notes::VERSION = 1.00;
+
+=head1 NAME
+
+NotesIndex - a simple class for notes-index files
+
+=head1 Public Methods
+
+new, read_from_file, subjects, by_subject, prelude
+
+=cut
+#' # font-lock hack
+
+#----------------------------------------------------------------------
+
+
+# public method
+sub new {
+    my ($class, $file) = @_;
+    my $self = bless {};
+    if (!defined($file)) {
+        $self->init();
+    } else {
+       $self->read_from_file($file);
+    };
+    return $self;
+}
+
+
+# public method
+sub read_from_file {
+    my ($self, $filename) = @_;
+
+    $self->init();
+
+    open(FILE, "<$filename") || croak "Cannot open $filename";
+
+    while (<FILE>) {
+       chomp;
+       $self->push_link($_);
+    }; 
+
+    close FILE;
+    return 1;
+}
+
+# public_method
+sub subjects {
+    my($self) = @_;
+    return keys %{$self->{'links_by_subject'}};
+}
+
+# public method
+sub by_subject {
+    my($self, $subject) = @_;
+    $subject = lc($subject);
+    my($resref) = $self->{'links_by_subject'}{$subject};
+    return wantarray ? () : undef
+       if (!defined($resref));
+    return wantarray ? @$resref : 1;
+}
+
+
+# private method
+sub push_link {
+    my($self, $link) = @_;
+    my($subject) = ($link =~ m/\d{2}\#\* (.*)$/);
+    $subject = lc($subject);
+    push (@{ $self->{'links_by_subject'}{$subject} }, $link);
+}
+
+
+# private method
+sub init {
+    my($self) = @_;
+}
+
diff --git a/packages/notes-mode/NotesVars.pm b/packages/notes-mode/NotesVars.pm
new file mode 100755 (executable)
index 0000000..da35dab
--- /dev/null
@@ -0,0 +1,122 @@
+#!/usr/bin/perl -w
+
+#
+# NotesVars.pm
+# $Id: NotesVars.pm,v 1.8 2003/05/23 16:26:22 johnh Exp $
+#
+# Copyright (C) 1996,2012  Free Software Foundation, Inc.
+# Comments to <johnh@isi.edu>.
+#
+# This file is under the Gnu Public License, version 2.
+# For details see the COPYING which accompanies this distribution.
+#
+
+require 5.000;
+
+#
+# basic initialization
+#
+BEGIN {
+    no strict 'vars';   # avoid %::notes
+    $notes{'home'} = ((getpwuid($<))[7]);
+    my(@config) = `"$ENV{'NOTES_BIN_DIR'}/mkconfig" perl`;
+    die "$0: mkconfig failed\n" if ($#config == -1);
+    eval join("", @config);
+    unshift(@INC, $notes{'bin_dir'});
+}
+
+package NotesVars;
+require Exporter;
+
+@ISA = Exporter;
+#my(%notes);
+@EXPORT = qw(pathname_to_Ymd Ymd_to_epoch
+           pathname_to_epoch epoch_to_pathname
+           url_to_pathname
+           strftime_epoch
+           );
+use Time::Local;
+use POSIX qw(strftime);
+use strict;
+
+
+##
+## Strftime
+##
+## Because "use POSIX" is so slow, I wrote a standalone strftime program.
+## I'm not distributing it because mknew caching seems to solve this problem.
+##
+#
+#my($strftime_inited) = 0;
+#sub init_strftime {
+#    my($x);
+#    # We currently don't support an external strftime.
+#    if (-x "$::notes{'bin_dir'}/strftime" ) {
+#      # run the program
+#      $x = q<
+#              sub strftime_backend {
+#                  my($output) = `> .$::notes{'bin_dir'} .
+#                              q</strftime '$_[0]' $_[1]`;
+#                  chomp $output;
+#                  return $output;
+#              }
+#              >;
+#    } else {
+#      # use POSIX
+#      # This option is about 10 times slower to load.
+#      # Unfortunately eval'ing this code causes perl5.002
+#      # to crash on exit.
+#      $x = q<
+#              use POSIX;
+#              sub strftime_backend {
+#                  return POSIX::strftime($_[0],localtime($_[1])) ;
+#              }
+#              >;
+#    };
+#    eval $x;
+#    $strftime_inited = 1;
+#}
+#
+#sub strftime_epoch {
+#    &init_strftime() unless ($strftime_inited);
+#    return &strftime_backend(@_);
+#}
+
+sub strftime_epoch {
+    return POSIX::strftime($_[0], localtime($_[1]));
+}
+
+sub pathname_to_Ymd {
+    my($pathname) = @_;
+    # NEEDSWORK:  not general (assumes file_form is %y%m%d)
+    my($Y, $m, $d) = ($pathname =~ /(..)(..)(..)$/);
+    $Y += 1900 if ($Y >= 90 && $Y < 100);
+    $Y += 2000 if ($Y < 90 && $Y < 100);
+    return ($Y, $m, $d);
+}
+
+sub Ymd_to_epoch {
+    my($y, $m, $d) = @_;
+    $y -= 1900 if ($y > 1000);   # convert possible $Y to $y
+    return timelocal(0, 0, 12, $d, ($m-1), $y);
+}
+
+sub pathname_to_epoch {
+    my($pathname) = @_;
+    my($Y, $m, $d) = &pathname_to_Ymd($pathname);
+    return &Ymd_to_epoch($Y, $m, $d);
+}
+
+sub epoch_to_pathname {
+    my($epoch) = @_;
+    return strftime_epoch("$::notes{dir}/$::notes{int_form}/$::notes{file_form}", $epoch);
+}
+
+sub url_to_pathname {
+    my($url) = @_;
+    $url =~ s@^file:///@@;
+    my($home) = $::notes{home};
+    $url =~ s@^\~@${home}@;
+    $url =~ s@\#\* .*$@@;
+    return $url;
+}
diff --git a/packages/notes-mode/README b/packages/notes-mode/README
new file mode 100644 (file)
index 0000000..d26c446
--- /dev/null
@@ -0,0 +1,72 @@
+Notes-mode
+----------
+by John Heidemann, <johnh@isi.edu>
+
+For documentation, see
+       notes-mode.info
+       HTML/notes-mode.html
+or     <http://www.isi.edu/~johnh/SOFTWARE/NOTES_MODE/>
+
+
+WHAT IS NOTES-MODE?
+-------------------
+
+(From the info documentation)
+
+Notes-mode is an indexing system for on-line note-taking.
+Notes-mode is composed of two parts, the visible part, a major-mode for
+emacs to aid note-taking; and the invisible part, scripts which
+periodically index your notes for you.
+
+For more sales, including
+       Why keep notes?
+       Why keep notes on-line?
+       Why keep notes with notes-mode?
+see <http://www.isi.edu/~johnh/SOFTWARE/NOTES_MODE/notes-mode_1.html>
+
+
+REQUIREMENTS
+------------
+
+Notes-mode requires Perl-5.  For information: http://www.perl.com
+
+
+INSTALLATION
+------------
+
+For each user:
+       1. Run notesinit
+               (from where it's installed, /usr/local/bin/notesinit
+               by default)
+
+After you've installed notes mode you're encouraged to subscribe
+to the mailing lists:
+Send the message "subscribe" to
+       notes-mode-announce-request@heidemann.la.ca.us and 
+       notes-mode-talk-request@heidemann.la.ca.us.
+(Or use majordomo@heidemann.la.ca.us.)
+
+
+COPYRIGHT
+---------
+
+Notes-mode is Copyright (C) 1994-2002,2012  Free Software Foundation, Inc.
+Notes-mode comes with ABSOLUTELY NO WARRANTY.
+This is Free Software, and you are welcome to redistribute it under certain
+conditions.  See the file ``COPYING'' for details about both of
+these conditions.
+
+
+TODO
+----
+
+- figure out how to pass the configured file names to the Perl scripts.
+- Use `completion-at-point-functions'.
+- Use epa/epg for encryption.
+- Figure out what to do about mkall.
+- Use defcustom and get rid of "* in docstrings.
+- Remove notes-use-font-lock.
+- Don't run notes-first just because we load the .el files.
+- Unify notes-utility-dir and notes-bin-dir.
+- Add support for mouse-1-click-follows-link.
+
diff --git a/packages/notes-mode/catsubject b/packages/notes-mode/catsubject
new file mode 100755 (executable)
index 0000000..38ba8f5
--- /dev/null
@@ -0,0 +1,112 @@
+#!/usr/bin/perl -w
+
+#
+# catsubject
+# $Id: catsubject,v 1.7 2003/05/23 16:26:24 johnh Exp $
+#
+# Copyright (C) 1996,2012  Free Software Foundation, Inc.
+# Comments to <johnh@isi.edu>.
+#
+# This file is under the Gnu Public License, version 2.
+# For details see the COPYING which accompanies this distribution.
+#
+
+
+sub usage {
+    print STDOUT <<END;
+usage: $0 [-m] subject
+
+Outputs (to stdout) the contents of all entries with the given subject.
+
+Assumes that rawindex is up-to-date.
+
+Options:
+    -m match subjects with a perl regexp
+
+END
+    exit 1
+}
+
+require 5.000;
+
+use Getopt::Long;
+
+&usage if ($#ARGV >= 0 && $ARGV[0] eq '-?');
+my(%opts);
+&GetOptions(\%opts, qw(m));
+&usage if ($#ARGV < 0);
+
+#BEGIN {
+#    $home_dir = ((getpwuid($<))[7]);
+#    @config = `$home_dir/.notesrc perl`;
+#    die "$0: missing .notesrc\n" if ($#config == -1);
+#    eval join("", @config);
+#    unshift(@INC, $notes{'bin_dir'});
+#}
+
+use POSIX;
+BEGIN { unshift(@INC, $ENV{'NOTES_BIN_DIR'}); };
+use NotesVars;
+use Notes;
+use NotesIndex;
+use strict;
+
+
+
+# NEEDSWORK: replace with real argument parsing
+my($Subject) = @ARGV;
+my($subject) = lc($Subject);
+my($match_subject) = ($opts{'m'});
+
+my($subject_description) = ($match_subject ? "match on " : "") . $Subject;
+
+
+#
+# Say what we're doing.
+#
+print "\n* What\n------\n\nOutput of:\n\t$0 " . $subject_description . "\n" .
+    "as of " . localtime(time) . "\n\n\n";
+
+my($notes_index) = new NotesIndex($::notes{dir} . "/rawindex");
+
+
+#
+# Match?
+#
+my(@subjects);
+if ($match_subject) {
+    my($subjects) = ();
+    my($code) = '$s =~ m{' . $subject . '}';
+    my($s);
+    foreach $s ($notes_index->subjects()) {
+       if (eval $code) {
+           push(@subjects, $s);
+       };
+    };
+    print "Subjects:\n", join("\n", @subjects), "\n\n";
+} else {
+    @subjects = ($subject);
+};
+
+#
+#  Do it.
+#
+my($url);
+my($s);
+foreach $s (@subjects) {
+    foreach $url ($notes_index->by_subject($s)) {
+        my($notes) = new Notes(url_to_pathname($url));
+        my($entry);
+        foreach $entry ($notes->by_subject($s)) {
+            my($this) = "this: <$url>";
+           my(@lines) = split(/\n/, $entry);
+           if ($lines[2] =~ /^prev: /) {
+               print join("\n", @lines[0..2], $this, @lines[3..$#lines], "\n\n");
+           } else {
+               print join("\n", @lines[0..1], $this, @lines[2..$#lines], "\n\n");
+           };
+        };
+    };
+};
+
+exit 0;
diff --git a/packages/notes-mode/dir b/packages/notes-mode/dir
new file mode 100644 (file)
index 0000000..8f1258f
--- /dev/null
@@ -0,0 +1,20 @@
+Ceci est le fichier .../info/dir, lequel contient le noeud 
+le plus haut dans la hiérarchie Info, noeud appelé (dir)Top.
+La première fois que Info est invoqué, vous démarrez la recherche 
+à partir de ce noeud.
+\1f
+File: dir,     Node: Top       Ceci est le haut de l'arborescence INFO
+
+  Ceci (le noeud Répertoire) fournit un menu des sujets majeurs.
+  Taper « q » pour quitter, « ? » pour lister toutes les commandes Info,
+  « d » pour revenir à cet endroit,
+  « h » fournit un guide d'initiation pour les nouveaux venus,
+  « mEmacs<Return> » démarre une consultation du manuel Emacs, etc.
+
+  En Emacs, vous pouvez cliquer avec le bouton-2 de la souris sur un item menu 
+  ou sur une référence croisée pour le sélectionner.
+
+* Menu:
+
+Emacs
+* Notes-mode: (notes-mode).     Organizing on-line note-taking.
diff --git a/packages/notes-mode/mkall b/packages/notes-mode/mkall
new file mode 100755 (executable)
index 0000000..f2ec8b6
--- /dev/null
@@ -0,0 +1,216 @@
+#!/usr/bin/perl -w
+# If the above path is incorrect for your system,
+# FOLLOW THE INSTALLATION INSTRUCTIONS in README.
+
+#
+# mkall
+# $Id: mkall,v 1.18 2007/02/23 05:14:59 johnh Exp $
+#
+# Copyright (C) 1996,2012  Free Software Foundation, Inc.
+# Comments to <johnh@isi.edu>.
+#
+# This file is under the Gnu Public License, version 2.
+# For details see the COPYING which accompanies this distribution.
+#
+
+sub usage {
+    print STDOUT <<END;
+usage: $0
+
+Does all reindexing needed for notes-mode.
+END
+    exit 1;
+}
+
+
+require 5.000;
+BEGIN { unshift(@INC, $ENV{'NOTES_BIN_DIR'}); };
+use NotesVars;
+use strict;
+use Config;
+
+&usage if (($#ARGV >= 0 && $ARGV[0] eq '-?'));
+
+my($perl) = &find_perl_binary;
+
+# xxx: currently rawindex generates @subjects that index uses.
+# Should remove this dependency.
+my(@subjects) = ();
+
+&make_rawindex;
+&make_index;
+&make_index_cache;
+&make_prevnext;
+&make_mknew_cache;
+&fix_perms;
+
+exit 0;
+
+
+sub find_perl_binary {
+    my($perl) = $^X;
+    return $perl if (-x $perl);
+    $perl = $Config{'installbin'} . "/perl";
+    return $perl if (-x $perl);
+    # If we can't find perl, then we assume the user's set the #! lines correctly.
+    return '';
+}
+
+
+sub run_over_all_notes {
+    my($cmd, $user_cmd_name) = @_;
+    open(CMD, "| $cmd") || die ("$0: cannot run $user_cmd_name.\n");
+    foreach (glob "$::notes{'int_glob'}/$::notes{'file_glob'}") {
+       print CMD "$_\n";
+    };    
+    close CMD;
+    if ($? >> 8) {
+        die "$0: $user_cmd_name failed.";
+    };
+}
+
+
+#
+# rawindex 
+#
+#
+# The main thing that happens here is we find and sort the notes entries.
+# We do the sorting in perl because the system sort is less portable
+# (wrt stability, for example).
+#
+sub make_rawindex {
+    chdir ($::notes{'dir'}) || die "$0: cannot cd to $::notes{'dir'}.\n";
+    # if (-f "rawindex") {
+    #     rename('rawindex', 'rawindex~') || die "$0: cannot rename rawindex.\n";
+    # };
+    # my($sed_arg) = '"s@' . $::notes{home} . '@/~@"';
+    # system(<<END);
+    #     $::notes{'bin_dir'}/mkrawindex $::notes{'dir'}/$::notes{'int_glob'}/$::notes{'file_glob'} |
+    #     sort -f -t# +1 +0 |
+    #     sed $sed_arg > rawindex
+    # END
+    # if ($? >> 8) {
+    #     rename('rawindex', 'rawindex.bad');
+    #     rename('rawindex~', 'rawindex');
+    #     die "$0: rawindex pipeline failed.";
+    # };
+    #
+    # xxx: eventually this will overflow the buffer and we'll need to
+    # do something like xargs.  However, in 10 years of use this hasn't happened
+    # for me yet.
+    run_over_all_notes("$perl $::notes{'bin_dir'}/mkrawindex -X >prerawindex", "mkrawindex");
+#    open (IF, "$perl $::notes{'bin_dir'}/mkrawindex $::notes{'dir'}/$::notes{'int_glob'}/$::notes{'file_glob'} |") || die "$0: cannot run mkrawindex\n";
+#    binmode IF;
+    open(IF, "<prerawindex") || die  "$0: cannot open prerawindex.\n";
+    binmode IF;
+    open (OF, ">rawindex+") || die "$0: cannot write to rawindex+\n";
+    binmode OF;
+    my($internal_marker) = chr(1);
+    foreach (<IF>) {
+        chomp;
+       s@$::notes{'home'}@/~@;
+       my($left, $right) = /^([^#]+)\#(.*)$/;
+       push(@subjects, "${right}${internal_marker}${left}");
+    };
+    close IF;
+    @subjects = sort { uc($a) cmp uc($b) } @subjects;
+    foreach (0..$#subjects) {
+        my($left, $right) = ($subjects[$_] =~ /^(.+)${internal_marker}(.*)$/);
+       $subjects[$_] = "$right#$left";
+       print OF "$subjects[$_]\n";
+    };
+    close OF;
+    if (-f 'rawindex') {
+        rename('rawindex', 'rawindex~') || die "$0: rename rawindex{,~} failed.\n";
+    };
+    rename('rawindex+', 'rawindex') || die "$0: rename rawindex{+,} failed.\n";
+}
+
+#
+# index
+#
+sub make_index {
+    if (-f 'index') {
+        rename('index', 'index~') || die "$0: rename index{,~} failed.\n";
+    };
+    open (OF, "| $perl $::notes{'bin_dir'}/mkindex > index") || die "$0: cannot run mkindex.\n";
+    binmode OF;
+    my($last);
+    foreach (@subjects) {
+        if (!defined($last) || $last ne uc($_)) {
+           print OF "$_\n";
+           $last = uc($_);
+         };
+    };
+    close OF;
+    if ($? >> 8) {
+        rename('index', 'index.bad') || warn "$0: recovery rename index{,.bad} failed.\n";
+       rename('index~', 'index') || warn "$0: recovery rename index{~,} failed.\n";
+       die "$0: index pipeline failed.";
+    };
+}
+
+#
+# index_cache.el
+#
+# Yes, the code should probably be compiled,
+# but compilation time doesn't seem to be the problem.
+#
+sub make_index_cache {
+    if (-f 'index_cache.el') {
+        rename('index_cache.el', 'index_cache.el~') || die "$0: rename index_cache.el{,~} failed.\n";
+    };
+    system(<<END);
+    $perl $::notes{'bin_dir'}/mkindexcache < index > index_cache.el
+END
+    #    emacs -batch --eval '(byte-compile-file "index_cache.el")' 2>&1 | grep -v 'free variable'
+    if ($? >> 8) {
+        rename('index_cache.el', 'index_cache.el.bad') || warn "$0: reanme index_cache.el{,.bad} failed.\n";
+       rename('index_cache.el~', 'index_cache.el') || warn "$0: rename index_cache.el{~,} failed.\n";
+       unlink('index_cache.elc') if (-f 'index_cache.elc');
+       die "$0: index pipeline failed.";
+    };
+    #
+    # Bug found by Klaus Zeitler <kzeitler@lucent.com>:
+    # if we generate index_cache.el in less than a second,
+    # it won't be considered up-to-date.
+    #
+    if (-M 'index' == -M 'index_cache.el') {
+       # We're too fast---stall and update the file
+       sleep(1);   # stall
+       system('touch index_cache.el');   # "update"
+    };
+}
+
+
+#
+# prevnext
+#
+sub make_prevnext {
+    run_over_all_notes("$perl $::notes{'bin_dir'}/mkprevnext -X ./rawindex", "mkprevnext");
+}
+
+#
+# mknew cache
+#
+sub make_mknew_cache {
+    my($todays_file) = &epoch_to_pathname(time);
+    system(<<END);
+    $perl $::notes{'bin_dir'}/mknew -c $todays_file >./mknew.cache
+END
+}
+
+#
+# fix permissions
+#
+sub fix_perms {
+    my($perm);
+    foreach (glob("*"), glob("*/*")) {
+       my($mode) = (stat($_))[2];
+       if ($mode & 0077) {
+           chmod (($mode & 0700), $_) || warn "$0: could not chmod $_.\n";
+        };
+    };
+}
+
+
diff --git a/packages/notes-mode/mkconfig b/packages/notes-mode/mkconfig
new file mode 100755 (executable)
index 0000000..eeb8180
--- /dev/null
@@ -0,0 +1,118 @@
+#!/usr/bin/perl -w
+
+#
+# mkconfig
+# $Id: mkconfig,v 1.10 2003/05/23 16:26:30 johnh Exp $
+#
+# Copyright (C) 1996,2012  Free Software Foundation, Inc.
+# Comments to <johnh@isi.edu>.
+#
+# This file is under the Gnu Public License, version 2.
+# For details see the COPYING which accompanies this distribution.
+#
+
+sub usage {
+    print STDOUT <<END;
+usage: $0 [elisp|perl]
+END
+    exit 1;
+}
+
+require 5.000;
+use strict;
+
+&usage if ($#ARGV != 0 || $ARGV[0] eq '-?');
+
+
+my($type) = $ARGV[0];
+&usage if ($type ne 'elisp' && $type ne 'perl');
+
+
+my($home_dir) = ((getpwuid($<))[7]);
+
+my(%defaults) = (
+    'dir'      => ['path', '~/NOTES'],
+    'int_form' => ['form', '%Y%m'],
+    'file_form'        => ['form', '%y%m%d'],
+    );
+$defaults{'bin_dir'} = ['path', "$ENV{'NOTES_BIN_DIR'}"]
+    if defined($ENV{'NOTES_BIN_DIR'});
+
+my($key, $value, %notes);
+while (($key, $value) = each %defaults) {
+    $notes{$key} = $value->[1];
+}
+
+#
+# open the file
+#
+my($notesrc) = "$home_dir/.notesrc";
+$notesrc = $ENV{'NOTESRC'} if (defined($ENV{'NOTESRC'}));
+
+if (open (CONFIG, "<$notesrc")) {
+    while (<CONFIG>) {
+        next if (/^\s*#/);
+        next if (/^\s*$/);
+        next if (/^\s*exec/);
+        ($key, $value) = /^\s*([^:]+):\s*(.*)$/;
+        $notes{$key} = $value;
+        die("$0: file_form cannot be changed from %y%m%d.\n")
+       if ($key eq 'file_form' && $value ne '%y%m%d');
+    };
+    close CONFIG;
+};
+
+#
+# generate extra forms
+#
+my(%old_notes) = %notes;
+while (($key, $value) = each %old_notes) {
+    next if ($key eq '');
+
+    # fix forms
+    if ($defaults{$key}->[0] eq 'form') {
+       my($oldkey, $oldvalue) = ($key, $value);
+       $key =~ s/_form/_glob/;
+       $value =~ s/%Y/[12][90][0-9][0-9]/g;
+       $value =~ s/%(y|m|d)/[0-9][0-9]/g;
+       $notes{$key} = $value;
+
+       my($key, $value) = ($oldkey, $oldvalue);
+       $key =~ s/_form/_regexp/;
+       $value =~ s/%Y/[12][90]([0-9][0-9])/g;
+       $value =~ s/%(y|m|d)/([0-9][0-9])/g;
+       $notes{$key} = $value;
+    };
+};
+$notes{'url_prefix'} = "file:///$notes{'dir'}/";
+
+#
+# output
+#
+#if ($type eq 'perl') {
+#} else {
+#};
+my($comment) = ($type eq 'perl' ? '# ' : '; ');
+print "$comment automatically generated by $0\n";
+while (($key, $value) = each %notes) {
+    next if ($key eq '');
+
+    # normalize stuff
+    if (defined($defaults{$key}) && $defaults{$key}->[0] eq 'path') {
+       # not absolute or ~, then it's in notes_dir.
+       $value = "$notes{'dir'}/$value" if ($value !~ m@^[~/]@);
+       # fix ~
+        $value =~ s@^~/@$home_dir/@;
+    };
+
+    if ($type eq 'perl') {
+       print "\$notes{'$key'} = '$value';\n";
+    } else {
+       $key =~ s/_/-/g;
+       $value =~ s/([()])/\\\\$1/g if ($key =~ /-regexp$/);
+       print "(defvar notes-$key \"$value\")\n";
+    };
+};
+
+exit 0;
+
diff --git a/packages/notes-mode/mkindex b/packages/notes-mode/mkindex
new file mode 100755 (executable)
index 0000000..e184875
--- /dev/null
@@ -0,0 +1,41 @@
+#!/usr/bin/perl -w
+
+#
+# mkindex
+# $Id: mkindex,v 1.9 2003/05/23 16:26:33 johnh Exp $
+#
+# Copyright (C) 1994-1996,2012  Free Software Foundation, Inc.
+# Comments to <johnh@isi.edu>.
+#
+# This file is under the Gnu Public License.
+#
+
+sub usage {
+    print STDERR <<END;
+usage: $0 <rawindex >index
+
+Converts a raw index from a notes database into an index
+suitable for notes-index-mode in emacs.
+END
+    exit 1;
+}
+
+require 5.000;
+
+while (<>) {
+    chomp;
+    ($date, $subject) = m@/(\d{6})#\* (.*)$@;
+    warn("could not find date in rawindex line ``$_''.\n"), next if (!defined($date));
+    warn("could not find subject in rawindex line ``$_''.\n"), next if (!defined($subject));
+    $lcsubject = lc($subject);
+    $subject{$lcsubject} = $subject;
+    $list{$lcsubject} = "" if (!defined($list{$lcsubject}));   # for -w
+    $list{$lcsubject} .= "$date, ";
+};
+
+print "# -*- mode: notes-index -*-\n";
+foreach (sort keys %list) {
+    # Trim the trailing ", ".
+    $list{$_} =~ s/, $//;
+    print "$subject{$_}: $list{$_}\n";
+};
diff --git a/packages/notes-mode/mkindexcache b/packages/notes-mode/mkindexcache
new file mode 100755 (executable)
index 0000000..6d8f391
--- /dev/null
@@ -0,0 +1,82 @@
+#!/usr/bin/perl -w
+
+#
+# mkindexcache
+# $Id: mkindexcache,v 1.12 2008/08/08 17:41:14 johnh Exp $
+#
+# Copyright (C) 1994-2006,2012  Free Software Foundation, Inc.
+# Comments to <johnh@isi.edu>.
+#
+# This file is under the Gnu Public License.
+#
+
+sub usage {
+    print STDERR <<END;
+usage: $0 <index >index.el
+
+Converts a processed index into elisp code to intern
+the symbols and font-lock the buffer.
+END
+    exit 1;
+}
+
+require 5.006;  # for IO handling of :locale
+
+# Force unicode for input and output.
+# Without this requirement, unicode on the input results in incorrect
+# (byte-level, not character-level) values of $seek,
+# and since emacs' put-text-property is char-level,
+# it gets off.
+use open ':locale';   # Now let $ENV{LANG} and $ENV{LC_CTYPE} determine input encoding; previously we forced utf8, but not all are pure.
+
+my(@subjects) = ();
+my(@sstart, @send) = ();
+my($seek) = 1;
+
+while (<>) {
+    if (m@^(.*): \d@) {
+        push(@subjects, $1);
+       push(@sstart, $seek);
+       push(@send, $seek + length($1));
+    };
+    $seek += length($_);
+#    my $l1 = length($_);
+#    my $l2;
+#    do { use bytes; $l2 = length($_); };
+#    print "; $l1 $l2\n";
+};
+
+sub round_to_power_of_8 {
+    my($n) = @_;
+    return 8 ** (length(sprintf("%o", $n)));
+}
+
+print ";; auto-generated by mkindexcache\n";
+print "(defun notes-index-parse-buffer-cached ()\n";
+my($asize) = round_to_power_of_8($#subjects) - 1;
+print "  (setq notes-subject-table (make-vector $asize 0))\n";
+
+# output intern'ing code
+print "  (mapcar (function (lambda (a) (intern a notes-subject-table))) '(\n";
+foreach (@subjects) {
+    my($qsubject) = $_;
+    $qsubject =~ s/(["\\])/\\$1/g; #"
+    print "\t\"$qsubject\"\n";
+};
+print "    ))\n";
+
+# output font-lock code
+print "  (if notes-use-font-lock\n" .
+      "    (progn\n" .
+      "      (remove-text-properties (point-min) (point-max) '(face nil))\n" .
+      "        (mapcar (function (lambda (a)\n" .
+      "                            (put-text-property (car a) (cdr a) 'face notes-bold-face)))\n" .
+      "                '(\n";
+for (0..$#subjects) {
+    print "\t\t($sstart[$_] . $send[$_])\n";
+};
+print "      )))))\n";
+
+exit 0;
+
+
diff --git a/packages/notes-mode/mknew b/packages/notes-mode/mknew
new file mode 100755 (executable)
index 0000000..3df1ae8
--- /dev/null
@@ -0,0 +1,254 @@
+#!/usr/bin/perl -w
+
+#
+# mknew
+# $Id: mknew,v 1.19 2006/01/14 18:28:41 johnh Exp $
+#
+# Copyright (C) 1996,2012  Free Software Foundation, Inc.
+# Comments to <johnh@isi.edu>.
+#
+# This file is under the Gnu Public License, version 2.
+# For details see the COPYING which accompanies this distribution.
+#
+
+
+sub usage {
+    print STDOUT <<END;
+usage: $0 new-date
+
+Create a new notes file by cloning the most recent date.
+Output goes to stdout.
+
+This program makes several assumptions about the notes-file format.
+Current hurestics:
+
+1.  Before the first real entry, lines of the form
+"12-Jan-96 Friday" and "12 Jan 1996" are updated.
+
+2.  A "today" entry is brought forward each day.
+(Some people use this as a to-do list.)
+
+3.  If an entry named according to the day of the week exists, a new
+one is made.
+
+
+Known Bugs:
+We assume that notes are created on the day that they correspond to.
+The date is not inferred from the filename.
+
+Known non-bug:  this program is Y2K OK.
+END
+    exit 1
+}
+
+
+&usage if ($#ARGV == -1 || ($#ARGV >= 0 && $ARGV[0] eq '-?'));
+
+require 5.000;
+use File::Basename;
+BEGIN { unshift(@INC, $ENV{'NOTES_BIN_DIR'}); };
+use NotesVars;
+use Notes;
+use POSIX qw(strftime);
+use strict;
+
+
+# xxx: dumb arg parsing
+my($cache) = 0;
+if ($ARGV[0] eq '-c') {
+    $cache = 1;
+    shift;
+};
+&usage if ($#ARGV != 0);
+my($date) = @ARGV;
+my($date_epoch) = pathname_to_epoch($date);
+my($name, $path) = fileparse($date);
+
+
+#
+# Constants.
+#
+my(@days, @months, @short_days, @short_months, $all_days_regexp_switch, $all_months_regexp_switch);
+&generate_constants;
+
+sub generate_constants {
+    # this stuff is based on the suggestion in perllocale(1)
+    # The junk at the end is an list that is struct tm;
+    # things are hardcoded to year 106 == 2006 since Jan 1 is nicely on a Sunday.
+    foreach (0..6) {
+       push(@days, strftime("%A",  1,0,0,$_+1,0, 106,$_));
+       push(@short_days, strftime("%a", 1,0,0,$_+1,0, 106,$_));
+    };
+    foreach (0..11) {
+       push(@months, strftime("%B", 1,0,0,1,$_, 106));
+       push(@short_months, strftime("%b", 1,0,0,1,$_, 106));
+    };
+    $all_days_regexp_switch = join("|", @days, @short_days);
+    $all_months_regexp_switch = join("|", @months, @short_months);
+};
+
+my($prev) = &figure_prev($name, $path);
+
+if ($cache) {
+    print "mknew.cache 830494922\n$prev\n$date\n";
+};
+my($prev_notes) = new Notes($prev);
+&mknew($prev_notes);
+
+
+exit 0;
+
+
+sub figure_prev {
+    my($name, $path) = @_;
+
+    # Given ${name,path}form, back-compute noon of the current date.
+    my($epoch) = &pathname_to_epoch("$path/$name");
+
+    my($tries);
+    # search back up to a year
+    for ($tries = 0; $tries < 365; $tries++) {
+       my($newpathname) = &epoch_to_pathname($epoch);
+       # print "$newpathname\n";
+       return $newpathname if (-f $newpathname);
+       $epoch -= 24 * 60 * 60;
+    };
+    exit 0;
+    # die("$0: could not find prior note.\n");
+}
+
+sub sanitize_note {
+    my($note, $title) = @_;
+    $note =~ s/\nprev: <.*>\nnext: <.*>\n/\n/m;
+    $note =~ s/\* .*\n-+\n//m if ($title);
+    return $note;
+}
+
+sub infer_day_form {
+    my($sample) = @_;
+    return '' if ($sample eq '');
+    return '%a' if (length($sample) == 3);
+    return '%A';
+}
+
+sub infer_month_form {
+    my($sample) = @_;
+    return '' if ($sample eq '');
+    return '%b' if (length($sample) == 3);
+    return '%B';
+}
+
+sub infer_year_form {
+    my($sample) = @_;
+    return '' if ($sample eq '');
+    return '%y' if (length($sample) == 2);
+    return '%Y';
+}
+
+sub mknew {
+    my($prev_notes) = @_;
+    my($pre) = $prev_notes->prelude();
+    my(@F);
+
+    #
+    # Case 1:  dates at the beginning
+    # This convetion in the format ``30-Apr-96 Tuesday'' is in use by johnh,
+    # and in the format ``30 Apr 1996'' by geoff.
+    #
+    # Case 1a:  DayName? DayNum Month Year DayName?
+    @F = ($pre =~ /[\s\n]?
+           ($all_days_regexp_switch)?(\W+)?
+           (\d+)(\W+)
+           ($all_months_regexp_switch)(\W+)
+           (\d+)
+           (\W+)?($all_days_regexp_switch)?[\n]
+           [ ]?(\-+)?
+           (\n+)/xm);
+    if ($#F != -1) {
+       # date heading
+       # Sigh.  Back-infer date format.
+       foreach (0..$#F) {
+           $F[$_] = '' if (!defined($F[$_]));
+       };
+       my($form);
+       $form = &infer_day_form($F[0]) . $F[1] .
+               "%d" . $F[3] .
+               &infer_month_form($F[4]) . $F[5] .
+               &infer_year_form($F[6]) .
+               $F[7] . &infer_day_form($F[8]);
+       # This next (bogus) line works around
+       # a bug in redhat 5.0's perl-5.004-2.
+       my($x) = sprintf("%x", 10);
+# print STDERR "mknew: 1a1b\n";
+       my($new_date) = strftime_epoch($form, $date_epoch);
+       # Hack to fix leading zeros.
+       # strftime should support something like %!0d.
+       if ($form =~ /^%d/m && $new_date =~ /^0\d/m) {
+           $new_date =~ s/^0//m;
+       };
+       print "\n$new_date\n";
+       print "" . ("-" x length($new_date))
+           if ($F[9] =~ /\-/);
+       print $F[10];
+    };
+    # Sigh, reverse month and DayNum
+    # Case 1b:  DayName? Month DayNum Year DayName?
+    @F = ($pre =~ /[\s\n]?
+           ($all_days_regexp_switch)?(\W+)?
+           ($all_months_regexp_switch)(\W+)
+           (\d+)(\W+)
+           (\d+)
+           (\W+)?($all_days_regexp_switch)?[\n]
+           [ ]?(\-+)?
+           (\n+)/xm);
+    if ($#F != -1) {
+       # date heading
+       # Sigh.  Back-infer date format.
+       foreach (0..$#F) {
+           $F[$_] = '' if (!defined($F[$_]));
+       };
+       my($form);
+       $form = &infer_day_form($F[0]) . $F[1] .
+               &infer_month_form($F[2]) . $F[3] .
+               "%d" . $F[5] .
+               &infer_year_form($F[6]) .
+               $F[7] . &infer_day_form($F[8]);
+       my($new_date) = strftime_epoch($form, $date_epoch);
+       print "\n$new_date\n";
+       print "" . ("-" x length($new_date)) . "\n\n"
+           if ($F[9] =~ /\-/);
+       print $F[10];
+    };
+
+    #
+    # Case 2:  the "today" entry.
+    # This convention is in use by johnh.
+    #
+    my(@todays) = $prev_notes->by_subject('Today');
+    if ($#todays >= 0) {
+        die ("Too many today entries.\n")
+           if ($#todays != 0);
+       print sanitize_note($todays[0], 0);
+    };
+
+    #
+    # Case 3:  a day-of-the-week entry.
+    # This convention is in use by geoff.
+    #
+    my($i);
+    foreach $i (@days) {
+       my(@entries) = $prev_notes->by_subject($i);
+       if ($#entries != -1) {
+           # Generate a raw entry; don't bother to move forward contents.
+           my($t) = "* " . strftime_epoch("%A", $date_epoch);
+           print "\n" .
+               $t .
+               "\n" .
+               ("-" x length($t)) .
+               "\n" .
+               sanitize_note($entries[0], 1);
+       };
+    };
+}
+
+
diff --git a/packages/notes-mode/mkprevnext b/packages/notes-mode/mkprevnext
new file mode 100755 (executable)
index 0000000..5e65149
--- /dev/null
@@ -0,0 +1,275 @@
+#!/usr/bin/perl -w
+
+#
+# mkprevnext
+# $Id: mkprevnext,v 1.22 2007/02/23 05:15:17 johnh Exp $
+#
+# Copyright (C) 1994-1996,2012  Free Software Foundation, Inc.
+# Comments to <johnh@isi.edu>.
+#
+# This file is under the Gnu Public License.
+#
+
+sub usage {
+    print STDOUT <<END;
+usage: $0 [-X] indexfile [FILE...]
+       Update the prev and next pointers in [file...]
+       based on indexfile.
+
+       We assume that indexfile is sorted.
+
+Option: -X means read the filesname from stdin rather than the command line.
+
+To update prev/next pointers do:
+       ./mkprevnext ./index 9?????
+END
+    exit 1
+}
+
+require 5.000;
+
+
+my($files_from_stdin) = undef;
+if ($ARGV[0] eq '-X') {
+    $files_from_stdin = 1;
+    shift @ARGV;
+}
+&usage if ($#ARGV < 0);
+
+%direction_delta = split(/ +/, 'prev -1   next 1');
+
+
+#
+# read the index
+#
+&read_index(shift);
+
+foreach (@ARGV) {
+    &reindex_file($_);
+};
+if ($files_from_stdin) {
+    while (<STDIN>) {
+       chomp;
+       &reindex_file($_);
+    }
+};
+
+exit 0;
+
+#
+# Read the index file.
+# Build links of in $index{"$file#$subject","$prevnext"}.
+# Assumes that the index is sorted.
+#
+sub read_index {
+    local($indexfile) = @_;
+    local ($file, $subject);
+    local (@old_sort_order, @sort_order);
+    local($filesubject, $prevfilesubject) = ('', '');
+
+    if (-z $indexfile) {
+       warn("$0: aborted.  $indexfile is zero length.\n");
+       exit 0;
+    };
+    open(INDEX,"<$indexfile") || die("Cannot open $indexfile");
+    binmode INDEX;
+    ($prevurl, $prevfile, $prevsubject) = ("", "", "");
+    @sort_order = ("") x 3;
+    while (<INDEX>) {
+        chop if (/\n$/);
+       $url = $_;
+       ($filehead, $file, $subject) = /^(.*)\/([^#]*)\#(.*)$/;
+       # Sigh, have to fold things to upper case since sort only
+       # does that, not to lower case.
+       $filehead = uc($filehead);
+       $file = uc($file);
+       $subject = uc($subject);
+       $filesubject = "$file#$subject";
+       
+       # verification
+       die ("Bad index entry: $_") if (!defined($file) || !defined($subject));
+       @old_sort_order = @sort_order;
+       @sort_order = ($subject, $filehead, $file);
+       foreach $i (0..$#sort_order) {
+           last if ($sort_order[$i] gt $old_sort_order[$i]);
+           die ("Index is not in sorted order (entries $i).\n\t$sort_order[$i]\n\t$old_sort_order[$i]\n")
+               if ($sort_order[$i] lt $old_sort_order[$i])
+       };
+
+       # Skip repeated entries.
+       if ($filesubject eq $prevfilesubject) {
+           $count_i{$filesubject}++;
+           next;
+       };
+
+       # Record the links.
+       $url_i{$filesubject} = $url;
+       if ($prevsubject eq $subject) {
+           $link_i{$filesubject,'prev'} = $prevfilesubject;
+           $link_i{$prevfilesubject,'next'} = $filesubject;
+       } else {
+           $link_i{$filesubject,'prev'} = 'none';
+           $link_i{$prevfilesubject,'next'} = 'none';
+       };
+       # Count entries per-file.
+       $count_i{$filesubject} = 1;
+       ($prevurl, $prevfile, $prevsubject, $prevfilesubject) =
+           ($url, $file, $subject, $filesubject);
+    };
+    # Close the last pointer and hacks for null pointers.
+    $link_i{$prevfilesubject,'next'} = 'none';
+    $url_i{'none'} = 'none';
+    $count_i{'none'} = 1;
+    close (INDEX);
+}
+
+
+#
+# Go through a particular file
+# and update its prev/next pointers.
+#
+sub reindex_file {
+    local ($fullfile) = @_;
+    local (@data, $change, $mode, $subject);
+    local ($mode_lookheader, $mode_expectdash, $mode_expectprev, $mode_expectnext) = (0..99);
+    local(@olddata);
+    local (@data, $data, $error);
+    local ($subject_length, $found_expected_label);
+    local (%subject_count) = ();
+
+    local($file) = ($fullfile);
+    $file =~ s@.*/([^/]+)@$1@;   # basename
+
+    open(FILE,"<$fullfile") || die("Cannot open $file");
+    @olddata = <FILE>;
+    close(FILE);
+    # $file = uc($file);
+    $change = 0;
+    $mode = $mode_lookheader;
+    #
+    # Scan through the file, looking for headers.
+    # There is some context senstivity using $mode.
+    #
+    foreach (@olddata) {
+       if ($mode == $mode_lookheader) {
+           if (!/^(\* .*)$/) {
+               # skip simple data
+               push (@data, $_);
+               next;
+           } else {
+               # header
+               $subject = uc($1);
+               $filesubject = "$file#$subject";
+               push (@data, $_);
+               $subject_length = length($_) - 1;
+               $subject_count{$subject}++;
+               $mode = $mode_expectdash;
+               next;
+           };
+       } elsif ($mode == $mode_expectdash) {
+           if (/^\-+$/) {
+               # Check and fix dash length.
+               if (length($_)-1 != $subject_length) {
+                   $_ = ("-" x $subject_length) . "\n";
+                   $change++;
+               };
+               push (@data, $_);
+               $mode = $mode_expectprev;
+               next;
+           } else {
+               # warn("warning: subject <$subject> missing dashes in $file.\n") if (!/^\*/);
+               push (@data, $_);
+               $mode = $mode_lookheader;
+               next;
+           };
+       } elsif ($mode == $mode_expectprev) {
+           $found_expected_label = (/^prev: \<(.*)\>$/) ? 1 : 0;
+           push (@data, &new_link('prev', $file, $subject, $subject_count{$subject}));
+           $change++ if (!$found_expected_label ||
+                       ($found_expected_label && $data[$#data] ne $_));
+           $mode = $mode_expectnext;
+           if ($found_expected_label) { next; } else { redo; };
+       } elsif ($mode == $mode_expectnext) {
+           $found_expected_label = (/^next: \<(.*)\>$/) ? 1 : 0;
+           push (@data, &new_link('next', $file, $subject, $subject_count{$subject}));
+           $change++ if (!$found_expected_label ||
+                       ($found_expected_label && $data[$#data] ne $_));
+           $mode = $mode_lookheader;
+           if ($found_expected_label) { next; } else { redo; };
+       } else {
+           die ("bad mode: $mode");
+       };
+       die("end of loop reached unexpectedly.");               
+    };
+    close (FILE);
+
+    return if (!$change);
+
+    warn("Updating file $file.\n") if ($verbose);
+    warn("   writing backup file ${fullfile}~.\n") if ($verbose);
+    open(BFILE, ">$fullfile~") || die("Cannot write backup file $fullfile~.\n");
+    $data = join("", @olddata);
+    $error = syswrite(BFILE, $data, length($data));
+    die("Backup file failed.\n") unless ($error = length($data));
+
+    open (FILE, ">$fullfile") || goto abort;
+    $data = join("", @data);
+    $error = syswrite(FILE, $data, length($data));
+    goto abort unless ($error == length($data));
+    close (FILE) || goto abort;
+    return;
+
+abort:
+    close (FILE);   # ignore error
+    warn ("Aborting changes to file $file.\n");
+    rename("$fullfile~", "$fullfile") ||
+       die("Could not back-out changes to $file.  Old data saved in $file~.");
+    return;
+}
+
+
+sub new_link {
+    local ($direction, $file, $subject, $srcposition) = @_;
+    local($filesubject) = "$file#$subject";
+    local($other_count);
+
+    # First handle ignorance.
+    return &format_url($direction,'none')
+        if (!defined($link_i{$filesubject,$direction}));
+
+    # See if we're in the same file.
+    if (($direction eq 'prev' && $srcposition > 1) ||
+       ($direction eq 'next' && $srcposition < $count_i{$filesubject})) {
+
+       return &format_url($direction, $url_i{$filesubject},
+           $srcposition + $direction_delta{$direction});
+
+    } else {
+       # In a different file.  Does the other file have multple entries?
+       $other_count = $count_i{ $link_i{$filesubject,$direction} };
+       if ($other_count != 1) {
+           
+           return &format_url($direction,
+               $url_i{ $link_i{$filesubject,$direction} },
+               ( $direction eq 'prev' ? $other_count : 1));
+
+       } else {
+           # Different file with only one entry.
+           return &format_url($direction,
+               $url_i{ $link_i{$filesubject,$direction} } );
+       };
+    };
+}
+
+sub format_url {
+    local($direction, $url, $count) = @_;
+    $url =~ s/\#\*/#$count*/ if (defined($count));
+    return "$direction: <$url>\n";
+}
+
+## substutite for "uc", if you want to back-port to perl4.
+# sub tolower {
+#     local ($s) = @_;
+#     $s =~ tr/a-z/A-Z/;
+#     return $s;
+# }
diff --git a/packages/notes-mode/mkrawindex b/packages/notes-mode/mkrawindex
new file mode 100755 (executable)
index 0000000..09c2eb6
--- /dev/null
@@ -0,0 +1,92 @@
+#!/usr/bin/perl -w
+
+#
+# mkrawindex -- index notes files
+# $Id: mkrawindex,v 1.17 2007/02/24 01:25:08 johnh Exp $
+#
+# Copyright (C) 1994-2006,2012  Free Software Foundation, Inc.
+# Comments to <johnh@isi.edu>.
+#
+# This file is under the Gnu Public License, version 2.
+# For details see the COPYING which accompanies this distribution.
+#
+
+sub usage {
+    print STDOUT <<END;
+usage: $0 [-X] [file...]
+       Writes a raw index to stdout.
+
+       If no files are specified as arguments,
+       they are read from stdin.
+
+Option: -X means read the filesname from stdin rather than the command line.
+
+END
+    exit 1
+}
+
+# old implementation:
+# To make an index do:
+#    ./mkrawindex /h/local/users/johnh/STUFF/NOTES/9????? |
+#      sort -f -t# +1 +0 |
+#      sed 's:/h/local/users/johnh:~:' >index
+
+require 5.000;
+BEGIN { unshift(@INC, $ENV{'NOTES_BIN_DIR'}); };
+use Notes;
+use NotesVars;
+
+my($files_from_stdin) = undef;
+if ($ARGV[0] eq '-X') {
+    $files_from_stdin = 1;
+    shift @ARGV;
+}
+
+&usage if ($#ARGV == 0 && $ARGV[0] eq '-?');
+
+my($opthost) = "";
+# could be localhost to have urls be file://localhost/foo instead of
+# file:///foo.
+
+#
+#
+#
+foreach (@ARGV) {
+    &add_file_to_index($_);
+}
+if ($files_from_stdin) {
+    while (<STDIN>) {
+       chomp;
+        &add_file_to_index($_);
+    };
+};
+
+exit 0;
+
+
+sub add_file_to_index {
+    my($fn) = @_;
+
+    # "cannonicalize" the filename
+    my($cannon_fn) = $fn;
+    if ($cannon_fn !~ m@^/@) {
+       $cannon_fn = $::notes{dir} . "/" . $cannon_fn;
+       $cannon_fn =~ s@^$::notes{home}@/~@;
+    };
+
+    my($n) = new Notes($fn);
+    my($subs_ref) = $n->subjects();
+    if (!defined($subs_ref)) {
+       warn "$0: no subjects for file $fn.\n";
+       return;
+    };
+    foreach (@$subs_ref) {
+       warn("$0: subject $_ in $fn has leading spaces.\n")
+           if (/^\s$/);
+       warn("$0: subject $_ in $fn has trailing spaces.\n")
+           if (/\s$/);
+       warn("$0: subject $_ in $fn has an embedded number sign---this will cause problems with prev/next entries.\n")
+           if (/\#/);
+        print "file://$opthost$cannon_fn#* $_\n";
+    };
+}
diff --git a/packages/notes-mode/notes-aux.el b/packages/notes-mode/notes-aux.el
new file mode 100644 (file)
index 0000000..a7575e2
--- /dev/null
@@ -0,0 +1,72 @@
+;;; notes-aux.el --- Auxiliary functions for notes-mode and friends
+
+;; Copyright (C) 1994,1995,1998,2012  Free Software Foundation, Inc.
+
+;; Author: <johnh@isi.edu>.
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;; Code:
+
+;;;###autoload
+;;(defun notes-format-date (&optional calendar-date)
+;;  "Format the calendar-date-style DATE up to be a notes-format date.
+;;If no DATE is specified, use today's date."
+;;  (require 'calendar)
+;;  (let* ((date (if calendar-date
+;;                calendar-date
+;;              (calendar-current-date)))
+;;      (month (car date))
+;;      (day (nth 1 date))
+;;      (year (nth 2 date)))
+;;    (format "%02d%02d%02d" (- year 1900) month day)))
+(defun notes-format-date (&optional time)
+  "Format the TIME up to be a notes-format date.
+If no TIME is specified, use today's date."
+  (require 'notes-variables)
+  (if (null time)
+      (setq time (current-time)))
+  (format-time-string notes-file-form time))
+
+(defun notes-file-to-epoch (file)
+  "Convert a notes FILE to an epoch time."
+  (string-match notes-file-regexp file)
+  (let
+      ((y (string-to-number (match-string 1 file)))
+       (m (string-to-number (match-string 2 file)))
+       (d (string-to-number (match-string 3 file))))
+    (if (< y 1900)
+       (setq y (+ y 1900)))
+    (if (< y 1970)
+       (setq y (+ y 100)))
+    (encode-time 0 0 12 d m y)))
+
+(defun notes-file-to-url (file &optional tag)
+  "Convert a notes FILE to a URL with an optional TAG."
+  (let
+      ((epoch (notes-file-to-epoch file)))
+    (concat
+     notes-url-prefix
+     (format-time-string notes-int-form epoch)
+     "/"
+     (format-time-string notes-file-form epoch)
+     (if tag "#* " "")
+     tag)))
+
+(provide 'notes-aux)
+;;; notes-aux.el ends here
diff --git a/packages/notes-mode/notes-emacs.el b/packages/notes-mode/notes-emacs.el
new file mode 100644 (file)
index 0000000..6fd4874
--- /dev/null
@@ -0,0 +1,39 @@
+;;; notes-emacs.el --- Emacs compatibility functions
+
+;; Copyright (C) 1998,2012  Free Software Foundation, Inc.
+
+;; Author: <johnh@isi.edu>
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;; Code:
+
+(defun notes-platform-bind-mouse (map generic-key fn)
+  "Map Emacs symbols (a no-op)."
+  (define-key map (vector generic-key) fn))
+
+(defun notes-platform-init ()
+  "Init platform-specific stuff for notes-mode."
+  (if notes-platform-inited
+      t
+    (setq notes-platform-inited t)
+    (if (eq notes-bold-face 'notes-bold-face)
+       (copy-face 'bold notes-bold-face))))
+
+(provide 'notes-emacs)
+;;; notes-emacs.el ends here
diff --git a/packages/notes-mode/notes-first.el b/packages/notes-mode/notes-first.el
new file mode 100644 (file)
index 0000000..92c9c59
--- /dev/null
@@ -0,0 +1,54 @@
+;;; notes-first.el --- Setup notes-mode before first use
+
+;; Copyright (C) 2000-2006,2012  Free Software Foundation, Inc.
+
+;; Author: <johnh@isi.edu>.
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; 
+
+;;; Code:
+
+(defvar notes-first-perl5-binary "perl"
+  "Location of the perl binary to invoke notesinit (must be perl v5).")
+
+(defun notes-first-use-init ()
+  "Set up notes mode for the first time for a new user."
+  ;; note that we CAN'T assume the contents of notes-variables is loaded.
+  (if (y-or-n-p "Setup notes-mode with defaults? ")
+      (notes-first-run-notes-init)
+    (error (concat "Please run " notes-utility-dir "/notesinit by hand in a shell to customize defaults."))))
+
+;; xxx: eventually we might do something more sophisticated here
+;; (like asking the user questions directly).
+(defun notes-first-run-notes-init ()
+  "Run notesinit with defaults."
+  (let*
+      ((notes-init-cmd (expand-file-name "notesinit" notes-utility-dir))
+       (process-environment
+        (cons (concat "NOTES_BIN_DIR=" (directory-file-name notes-utility-dir))
+              process-environment)))
+    (message (concat "Running \"" notes-first-perl5-binary notes-init-cmd "\" to set up notes-mode."))
+    (call-process notes-first-perl5-binary nil nil nil notes-init-cmd "-D"))
+  ;; ok, things are setup, but we want to lead the user to what to do next
+  ;; => start up on today's note
+  (message "Notes are now set up.  Run M-x notes-index-todays-link to start."))
+
+(provide 'notes-first)
+;;; notes-first.el ends here
diff --git a/packages/notes-mode/notes-index-mode.el b/packages/notes-mode/notes-index-mode.el
new file mode 100644 (file)
index 0000000..5d959ec
--- /dev/null
@@ -0,0 +1,269 @@
+;;; notes-index-mode.el --- Index manipulation for notes-mode
+
+;; Copyright (C) 1994-1998,2012  Free Software Foundation, Inc.
+
+;; Author: <johnh@isi.edu>
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;; Code:
+
+(require 'notes-variables)
+(require 'notes-aux)
+
+
+(defvar notes-index-mode-map
+  (let ((map (make-sparse-keymap)))
+    ;; There were bindings to make mouse-1 do pointer following,
+    ;; but I removed it because all the rest of emacs uses mouse-2.
+    ;; If you want them, add them with notes-index-mode-hook.
+    (notes-platform-bind-mouse map 'mouse-2 'notes-index-mouse-follow-link)
+    (notes-platform-bind-mouse map 'S-mouse-2 'notes-index-mouse-follow-link-other-window)
+    (define-key map "\r" 'notes-index-follow-link)
+    (define-key map "\C-c\C-s" 'notes-summarize-subject)
+    (define-key map "o" 'notes-index-link)
+    map))
+
+
+(defvar notes-index-lazy-message-old-time 0)
+
+(defun notes-index-lazy-percent-message (text fraction whole)
+  "Put up a message occasionally.
+Displays TEXT (a format string), with FRACTION of WHOLE
+shown as a percentage.  (Read the code to see what this
+cryptic statement means.)"
+  (if (= notes-index-lazy-message-old-time
+        (setq notes-index-lazy-message-old-time (+ 1 (nth 1 (current-time)))))
+      nil
+    (message text (/ (* fraction 100) whole))))
+
+(defun notes-index-parse-buffer ()
+  "Parse a notes-index buffer, fontifying and building subject completion.
+
+If fontification is enabled, subjects will be emboldened
+and dates will be mouse-highlighted.
+
+In any event a subject completion table will be built.
+
+This routine works by calling either \[notes-index-parse-buffer-uncached]
+or \[notes-index-parse-buffer-cached] (if possible)."
+  (interactive)
+  (let
+      ((inhibit-read-only t))
+    (if (and (file-exists-p (expand-file-name "index_cache.el" notes-dir))
+            (file-newer-than-file-p
+              (expand-file-name "index_cache.el" notes-dir)
+              (expand-file-name "index" notes-dir)))
+       (progn
+         (load (expand-file-name "index_cache" notes-dir))
+         (notes-index-parse-buffer-cached))
+      ;; cache miss
+      (message "notes-index-parse-buffer: cache is not present or is not up-to-date")
+      (notes-index-parse-buffer-uncached))
+    ;; clean some things up
+    (message "")
+    (set-buffer-modified-p nil)))
+
+(defun notes-index-parse-buffer-uncached ()
+  "Parse a notes-index buffer, fontifying and building subject completion.
+
+If fontification is enabled, subjects will be emboldened
+and dates will be mouse-highlighted.
+
+In any event a subject completion table will be built.
+
+Tenses passive will be."
+  (interactive)
+  (save-excursion
+    (let ((start (point-min))
+         end subject)
+      ;; prepare the way
+      (if notes-use-font-lock
+          ;; FIXME: That's quite drastic!  What is this trying to do?
+         (set-text-properties (point-min) (point-max) nil))
+      ;; There used to be problem that we used a fixed obarray length,
+      ;; creating a lot of hash collisions.  Now we dynamically compute it
+      ;; by rounding up the number of lines to the next power of 8.
+      (if (and notes-mode-complete-subjects (not notes-subject-table))
+         (setq notes-subject-table (make-vector
+                                    (- (expt
+                                     8 
+                                     (length
+                                      (format
+                                       "%o"
+                                       (count-lines
+                                        (point-min)
+                                        (point-max)))))
+                                       1)
+                                    0)))
+      ;; do it
+      (goto-char start)
+      (while (< start (point-max))
+       ;; find the end-of-line
+       (end-of-line)
+       (setq end (point))
+       (goto-char start)
+
+       ;; find the subject
+       (while (not (eq (following-char) ?\ ))
+         (skip-chars-forward "^:" end)
+         (forward-char))
+       (backward-char)
+       (if notes-subject-table
+           (intern (buffer-substring start (point)) notes-subject-table))
+       (notes-index-lazy-percent-message "Notes-index'ing (%d%%)..." start (point-max))
+
+       (if notes-use-font-lock
+           (progn
+             ;; highlight the title
+             (put-text-property start (point) 'face notes-bold-face)
+             (if notes-index-fontify-dates
+                 (progn
+                   ;; now highlight each date
+                   (skip-chars-forward "^0-9" end)
+                   (while (looking-at "[0-9]")
+                     (setq start (point))
+                     (skip-chars-forward "0-9")
+                     (put-text-property start (point) 'mouse-face 'highlight)
+                     (skip-chars-forward "^0-9" end))))))
+       ;; set up for next line
+       (forward-line 1)
+       (setq start (point))))))
+
+
+(defun notes-index-date-search (start end iter-proc done-proc done-arg)
+  "Iterate over a notes-index entry bounded by START to END.
+Iteration is done by (ITER-PROC END), which leaves match 0
+set to what we're looking for.
+A match terminates iteration if (DONE-PROC match DONE-ARG) is non-nil.
+Returns the buffer position of a successful hit, or nil."
+  (goto-char start)
+  (let (stop)
+    (while (and (not stop)
+               (funcall iter-proc end))
+      (if (funcall done-proc (match-string 0) done-arg)
+         (setq stop (goto-char (match-beginning 0)))))
+    stop))
+
+
+(defun notes-index-goto-date (date &optional direction)
+  "Goto the DATE in the current line of the index file, modified by DIRECTION.
+If DIRECTION is 'this, go there.
+If DIRECTION is 'next or 'prev, go to the corresponding entry.
+If the entry doesn't exist, then go to the nearest entry according
+to DIRECTION (and the next one if DIRECTION is 'this)."
+  (cond
+   ((eq direction 'prev)
+    (notes-index-date-search
+     (line-end-position) (line-beginning-position)
+     (function (lambda (end) (re-search-backward notes-file-regexp end t)))
+     (function (lambda (trial target) (string-lessp trial target)))
+     date))
+   ((eq direction 'next)
+    (notes-index-date-search
+     (line-beginning-position) (line-end-position)
+     (function (lambda (end) (re-search-forward notes-file-regexp end t)))
+     (function (lambda (trial target) (string-lessp target trial)))
+     date))
+   (t
+    (notes-index-date-search
+     (line-beginning-position) (line-end-position)
+     (function (lambda (end) (re-search-forward notes-file-regexp end t)))
+     (function (lambda (trial target) (string-equal trial target)))
+     date))))
+
+(defun notes-index-link (link &optional tag where)
+  "* Follow a notes-index LINK.
+Optionally takes a subject TAG and
+WHERE ('otherwindow or nil) to open the new file."
+  (interactive "sNotes-index link: ")
+  (notes-w3-url (notes-file-to-url link tag) where t))
+
+;;;###autoload
+(defun notes-index-todays-link ()
+  "* Open the notes file for today."
+  (interactive)
+  (notes-index-link (format-time-string notes-file-form (current-time))))
+
+(defun notes-index-follow-link (pt &optional where)
+  "Follow a link at PT in notes-index-mode.
+The link is taken from the location PT,
+and the new information is shown WHERE (either 'otherwindow or not)."
+  (interactive "d")
+  (save-excursion
+    (let (start date tag)
+      ;; determine the date
+      (skip-chars-backward "0-9")
+      (setq start (point))
+      (if (not (re-search-forward notes-file-regexp (+ (point) 6) t))
+         (error "Not on notes-index-mode link."))
+      (setq date (match-string 0))
+      ;; pick out the tag
+      (beginning-of-line)
+      (if (not (re-search-forward "^\\([^:]*\\):" start t))
+         (error "Not on notes-index-mode link line."))
+      (setq tag (match-string 1))
+      ;; make and process the url
+      (notes-index-link date tag where))))
+
+(defun notes-index-mouse-follow-link (e)
+  "Handle a mouse click in notes-index-mode."
+  (interactive "e")
+  (mouse-set-point e)
+  (notes-index-follow-link (point) nil))
+
+(defun notes-index-mouse-follow-link-other-window (e)
+  "Handle a mouse click in notes-index-mode (other-window)."
+  (interactive "e")
+  (mouse-set-point e)
+  (notes-index-follow-link (point) 'otherwindow))
+
+(defun notes-index-extract-subject ()
+  "Extract the notes-index subject for the current line."
+  (save-excursion
+    (beginning-of-line)
+    (if (re-search-forward "^\\(.*\\): " (line-end-position) t)
+       (match-string 1)
+      nil)))
+
+;;;###autoload
+(define-derived-mode notes-index-mode special-mode "Notes-index"
+  "Notes-index-mode with mouse support.
+
+You may wish to change notes-bold-face and notes-use-font-lock.
+
+There should be no need to add notes-index-mode to auto-mode-alist
+since the index generation functions add code to the index file
+which invokes notes-index-mode.
+
+Key bindings are:
+\\{notes-index-mode-map}"
+  (notes-platform-init)
+
+  (notes-index-parse-buffer)
+
+  (set (make-local-variable 'font-lock-defaults)
+       '(notes-index-font-lock-keywords
+         t nil nil beginning-of-line))
+
+  ;; No editing is allowed.
+  (setq buffer-read-only t)
+)
+
+(provide 'notes-index-mode)
+;;; notes-index-mode.el ends here
diff --git a/packages/notes-mode/notes-mode-pkg.el b/packages/notes-mode/notes-mode-pkg.el
new file mode 100644 (file)
index 0000000..e7f0eb0
--- /dev/null
@@ -0,0 +1 @@
+(define-package "notes-mode" "1.30" "Organizing on-line note-taking")
diff --git a/packages/notes-mode/notes-mode.el b/packages/notes-mode/notes-mode.el
new file mode 100644 (file)
index 0000000..0b37a49
--- /dev/null
@@ -0,0 +1,723 @@
+;;; notes-mode.el --- Indexing system for on-line note-taking
+
+;;; Copyright (C) 1994-2007,2012  Free Software Foundation, Inc.
+
+;; Author: <johnh@isi.edu>.
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+
+;;; Commentary:
+;; 
+
+;;; Code:
+
+(require 'notes-variables)
+(require 'notes-aux)
+
+(defvar notes-mode-hooks nil
+  "Hooks to run when entering notes-mode.")
+(defvar notes-load-mode-hooks nil
+  "Hooks to run when entering notes-mode is loaded.")
+
+(defconst notes-beginning-of-defun-regexp "^\\* .*\n\\-"
+  "Regexp matching the beginning of notes section.")
+
+(defvar notes-default-tab-binding (global-key-binding "\t")
+  "Saved tab binding for notes-complete-subject.")
+(defvar notes-default-return-binding (global-key-binding "\r")
+  "Saved return binding for notes-electric-return.")
+
+
+(defun notes-beginning-of-defun ()
+  "Go to the beginning of a notes ``section''."
+  (interactive)
+  (let
+      ((old-point (point)))
+    (beginning-of-line)
+    ;; handle starting on a title
+    (if (and (looking-at notes-beginning-of-defun-regexp)
+            (/= (point) old-point))
+       nil
+      (goto-char old-point)
+      (if (looking-at "^-")  ;; handle starting on the underline under a title
+         (forward-char 1))
+      (re-search-backward notes-beginning-of-defun-regexp nil 'to-limit))))
+
+(defun notes-end-of-defun ()
+  "Go to the end of a notes ``section''."
+  (interactive)
+  (let ((regexp notes-beginning-of-defun-regexp))
+    (if (looking-at regexp)
+        (goto-char (match-end 0)))
+    ;; Find next section and leave cursor at section beginning
+    (if (re-search-forward regexp nil 'to-limit)
+        (re-search-backward regexp 0 t)
+      ;;(goto-char restore-point)
+      )))
+
+(defun notes-follow-link (which)
+  "Go to the WHICH link for this topic.
+WHICH is either \"next\" or \"prev\".
+If there are no links for the current note,
+we go to the last note based upon the index file."
+  (let
+      (beginning-of-note
+       end-of-note
+       (start-buffer (current-buffer))
+       ;; We have to handle links in the same buffer,
+       ;; so the following code figure out where we go
+       ;; and returns it out of the save-excursion.
+       ;; If we end up in another buffer, we let the save-excursion
+       ;; leave the original buffer unchanged.  If we end up in
+       ;; the same buffer, we need to go wherever we end up.
+       ;; Can anyone suggest a better way?
+       (end-buffer-and-point
+       (save-excursion
+         (notes-end-of-defun)
+         (setq end-of-note (point))
+         (notes-beginning-of-defun)
+         (setq beginning-of-note (point))
+         (if (and (= beginning-of-note 1) (not (looking-at notes-beginning-of-defun-regexp)))
+             (progn
+               ;; When "above" the first note, search to end of first
+               ;; real note (otherwise end-of-note is just the start
+               ;; of the first real note and there are no links).
+               (notes-end-of-defun)
+               (notes-end-of-defun)
+               (setq end-of-note (point))
+               (goto-char beginning-of-note)))
+         (if (re-search-forward (concat "^"
+                                        (if (eq which 'next) "next" "prev")
+                                        ":[ ]+<") end-of-note t)
+             (progn ; link exists, just take it
+               (beginning-of-line)
+               (notes-w3-follow-link (point))
+               (cons (current-buffer) (point)))
+           ;; No link; go through the index file.
+           (if (notes-goto-index-entry which)
+               (let ((index-buffer (current-buffer)))
+                 (notes-index-follow-link (point))
+                 (bury-buffer index-buffer))
+             (error "No known notes in that direction.")
+             (bury-buffer (current-buffer)))
+           (cons (current-buffer) (point))))))
+    ;; Check for going to the same buffer (and the save-excursion
+    ;; undoing our work).
+    (if (eq start-buffer (car end-buffer-and-point))
+       (goto-char (cdr end-buffer-and-point)))))
+       
+
+(defun notes-follow-next-link ()
+  "Go to the next link for this topic."
+  (interactive)
+  (notes-follow-link 'next))
+
+(defun notes-follow-prev-link ()
+  "Go to the previous link for this topic."
+  (interactive)
+  (notes-follow-link 'prev))
+
+(defvar notes-complete-subject-abbrevs-alist
+  '(("SP2010" "USC/Classes/CS551/SP2010")
+    ("FA2011" "USC/Classes/CS551/FA2011"))
+  "Alist of simple substitution of subjects.
+If subject completion is requested, then subject that matches
+the left-side of an alist value is replaced by the right-side value.")
+
+(defun notes-complete-subject-abbrevs (key)
+  "Handle abbreviations on notes SUBJECTS.
+Currently this is just a hack."
+  (let ((value (assoc key notes-complete-subject-abbrevs-alist)))
+    (if value
+       (car (cdr value))
+      key)))
+  
+
+(defun notes-complete-subject ()
+  "Complete the notes subject under point."
+  (interactive)
+  (let
+      ((subject (save-excursion 
+                 (beginning-of-line) 
+                 (notes-extract-subject t)))
+       old-completion-ignore-case
+       full-subject)
+    (if (not (and notes-mode-complete-subjects subject))
+       (call-interactively notes-default-tab-binding)
+      ;; Complete the title.
+      (if (null notes-subject-table)
+         (save-excursion ;; FIXME: Why??
+           (find-file-noselect (expand-file-name "index" notes-dir))))
+      ;; Do completion.
+      ;; Run completer if it's loaded,
+      ;; otherwise do our own thing.
+      (setq completion-ignore-case t)
+      (cond
+       ((fboundp 'completer-complete-goto)
+       (completer-complete-goto "^ \t\n\"" " " notes-subject-table nil))
+       ;; NEEDSWORK:  should try other completers, too.
+       (t   ;; Do our own completion.
+       (setq full-subject (try-completion subject notes-subject-table)
+             subject (completing-read "Subject: "
+                                      notes-subject-table nil nil 
+                                      (if (stringp full-subject)
+                                          full-subject
+                                        subject)))
+       (delete-region (line-beginning-position) (line-end-position))
+       (insert "* " (notes-complete-subject-abbrevs subject))))
+       (setq completion-ignore-case old-completion-ignore-case))))
+
+(defun notes-fix-prevnext-this-entry ()
+  "Fix up the prev link for the current entry, if necessary.
+Currently this code only handles brand new entries."
+  ;; Contributed from Takashi Nishimoto <g96p0935@mse.waseda.ac.jp>.
+  ;; Thanks!
+  (interactive)
+  (let ((subject (notes-extract-subject nil t))
+        (this-url (notes-current-url))
+        last-url)
+    (with-current-buffer (find-file-noselect
+                          (expand-file-name "index" notes-dir))
+      (goto-char (point-min))
+      (if (re-search-forward
+           (concat "^" (regexp-quote subject) ":.* \\([0-9]+\\)$")
+           (point-max) t) 
+          (save-window-excursion
+            (cond ((and (notes-w3-url
+                         (notes-file-to-url (match-string 1) subject))
+                        (re-search-forward "^next: " nil t)
+                        (looking-at "<none>"))
+                  (let
+                      (pre-modified (buffer-modified-p))
+                    (delete-char 6)
+                    (insert this-url)
+                    (setq last-url (notes-current-url))
+                    (if (and (null pre-modified) 
+                             (>= notes-electric-prevnext 2))
+                        (save-buffer))))))))
+    (if last-url
+       (progn
+         (notes-beginning-of-defun)
+         (forward-line 2)
+         (if (not (looking-at "prev: "))
+             (insert "prev: " last-url "\n" "next: <none>\n\n")
+           (forward-line 3))))))
+
+(defun notes-electric-return (arg)
+  "* Return, underlining if we're on a subject."
+  (interactive "*P")
+  (if (let ((cur-point (point)))
+       (save-excursion
+         (beginning-of-line)
+         (and (not (eq cur-point (point)))  ;; normal return if at b-o-ln
+              (notes-extract-subject t)))) 
+      (progn (notes-underline-line)
+            (if notes-electric-prevnext
+                (notes-fix-prevnext-this-entry)))
+    (call-interactively notes-default-return-binding)))
+
+(defun notes-current-url ()
+  "Return the notes-URL of the current entry around the current point."
+  (let ((subject (notes-extract-subject nil t))
+       (date (file-name-nondirectory buffer-file-name)))
+    (concat "<file:///"
+           (abbreviate-file-name buffer-file-name)
+           (if subject (concat "#* " subject) "")
+           ">")))
+
+(defun notes-current-url-as-kill ()
+  "* Put the notes-URL of the current entry into the kill ring."
+  (interactive)
+  (kill-new (notes-current-url)))
+
+(defun notes-goto-index-entry (&optional direction)
+  "* Jump to the index entry corresponding to our current note entry.
+If we're not in an entry, we leave you in the index file.
+If the current date doesn't exist, error in DIRECTION.
+Returns nil if on errors (no index; no date in DIRECTION),
+otherwise the point of the hit."
+  (interactive) 
+  (let ((start-buffer (current-buffer))
+       (subject (notes-extract-subject))  ; get subject if on it
+       (date (if (null (buffer-file-name)) nil 
+               (file-name-nondirectory (buffer-file-name)))))
+    ;; Try and get the subject, either forward...
+    (if (not subject)
+       (save-excursion 
+         (notes-beginning-of-defun)
+         (setq subject (notes-extract-subject))))
+    ;;    ...or backwards.
+    (if (not subject)
+       (save-excursion 
+         (notes-end-of-defun)
+         (setq subject (notes-extract-subject))))
+    ;; Form and jump to the url for the index-entry.
+    (if (and (notes-w3-url (concat notes-url-prefix
+                                  "index"
+                                  (if subject (concat "#" subject) ""))
+                          nil t)
+            ;; Go to the current date, if any.
+            (notes-index-goto-date date direction))
+       t
+      nil)))
+
+(defun notes-extract-subject (&optional relaxed search)
+  "Extract the subject under the point in the current buffer.
+If RELAXED, then accept non-underlined subjects.
+If SEARCH we'll search back in the buffer for the nearest
+subject title.
+
+Returns nil if we're not on as subject."
+  (save-match-data
+    (cond
+     ;; directly on a note
+     ((or (looking-at notes-beginning-of-defun-regexp)
+         (and relaxed
+              (looking-at "^\\* ")))
+      (save-excursion
+       (let
+           ((start (+ (point) 2))
+            (end (progn (end-of-line) (point))))
+         (buffer-substring start end))))
+     (search
+      (save-excursion
+       (notes-beginning-of-defun)
+       (notes-extract-subject relaxed nil)))
+     (t
+      nil))))
+
+
+;;;###autoload
+(defun notes-underline-line ()
+  "* Create a row of dashes as long as this line, or adjust the current underline."
+  (interactive)
+  ;; check to see if it's already underlined
+  (if (save-excursion
+       (forward-line 1)
+       (looking-at "^[ \t]*--*$"))
+      (notes-old-underline-line)
+    (progn
+      (notes-new-underline-line)
+      (insert "\n\n"))))
+
+(defun notes-new-underline-line ()
+  "Underline a line with a row of dashes.  Move point after the dashes.
+\\[notes-new-underline-line] reproduces leading spaces."
+  (interactive)
+  (let*
+      ((bol (progn (beginning-of-line)
+                  (point)))
+       (bospaces (progn (skip-chars-forward " \t")
+                       (point)))
+       (nospaces (- bospaces bol))
+       (eol (progn (end-of-line)
+                  (untabify bol (point))
+                  (point))))
+    (insert "\n" (buffer-substring bol bospaces))
+    (insert-char ?- (- eol bospaces))))
+
+(defun notes-old-underline-line ()
+  "Replace the following line with a row of dashes.  Leave the point unchanged."
+  (save-excursion
+    (save-excursion
+      (forward-line 1)
+      (delete-region (line-beginning-position) (1+ (line-end-position))))
+    (notes-new-underline-line)))
+
+(defun notes-mode-initialize-note-from-cache ()
+  "Build a new note from the cache.  Return valid cache contents or nil."
+  (save-excursion
+    (let*
+       ((new-buffer (current-buffer))
+        (cache-file (expand-file-name "mknew.cache" notes-dir))
+        (buf (find-file cache-file))
+        magic-line
+        prev-file
+        this-file
+        cache-contents
+        m
+        (result
+         (if (and buf
+                  (>= (count-lines (point-min) (point-max)) 3))
+             (progn
+               ;; If you know a more elegant way to extact the first
+               ;; three lines of a file, please let me know.
+               (goto-char (point-min))
+               (setq m (point))
+               (forward-line 1)
+               (setq magic-line (buffer-substring m (- (point) 1)))
+               (setq m (point))
+               (forward-line 1)
+               (setq prev-file (buffer-substring m (- (point) 1)))
+               (setq m (point))
+               (forward-line 1)
+               (setq this-file (buffer-substring m (- (point) 1)))
+               (setq cache-contents (buffer-substring (point) (point-max)))
+               (bury-buffer buf)
+               ;; is cache valid?
+               (if
+                   (and
+                    (string-equal magic-line "mknew.cache 830494922")
+                    (file-newer-than-file-p cache-file prev-file)
+                    (string-equal (file-name-nondirectory this-file)
+                                  (file-name-nondirectory (buffer-file-name
+                                                           new-buffer))))
+                   cache-contents
+                 nil))
+           nil)))
+      ;; Kill the buffer to avoid "buf changed, reload?" warnings.
+      (if buf
+         (kill-buffer buf))
+      result)))
+
+(defun notes-mode-initialize-note ()
+  "Fill in an empty new note.
+Create any directories as necessary.
+Use the mknew cache if possible."
+  (interactive)
+  (let
+      ((dir (directory-file-name (file-name-directory (buffer-file-name)))))
+    (if (file-exists-p dir)
+       t
+      (make-directory dir t)
+      (message "New intermediate directory created.")))
+  (if notes-mode-initialization-program
+      (let
+         ((cache-contents (notes-mode-initialize-note-from-cache)))
+       (if cache-contents
+           (insert cache-contents)
+         (shell-command-on-region
+          (point-min)
+          (point-max)
+          (concat (expand-file-name notes-mode-initialization-program
+                                     notes-bin-dir)
+                   " '"
+                   ;; FIXME: Use shell-quote-argument.
+                  (buffer-file-name) "'") 't)))))
+  
+\f
+;;;
+;;; encryption
+;; requires "PEM - PGP Enhanced Messaging for GNU Emacs"
+;; from Roy Frederick Busdiecker, III (Rick)
+;; or mailcrypt 3.4.x or >=3.5.x
+;;
+
+(defvar notes-encryption-library 
+  'mailcrypt
+;  (cond
+;   ((fboundp 'mc-encrypt-region) 'mailcrypt)
+;   ((fboundp 'npgp:encrypt-region) 'npgp)
+;   (t nil))
+  "PGP library to use.")
+
+(defvar notes-encryption-sub-library
+  'gpg
+  "Variant of mailcrypt to use (`pgp', `pgp50', or `gpg').")
+
+(defvar notes-encryption-npgp-userid nil
+  "PGP key for the current user.")
+
+(defvar notes-encryption-npgp-key-id nil
+  "Keyid of PGP key for the current user.
+Useful if your \\[user-full-name] doesn't match a unique key.
+Should have a leading 0x.")
+
+(defun notes-encryption-npgp-userid ()
+  "Return notes-encryption-userid, initializing it if necessary."
+  (require 'pam)
+  (if (and notes-encryption-userid
+          npgp:*pass-phrases*)
+      notes-encryption-userid
+    (setq notes-encryption-userid
+         (list
+          (if notes-encryption-key-id
+              (npgp:get-key-by-key-id notes-encryption-key-id)
+            (pam:read-name-key (user-full-name)))))))
+
+(defun notes-encryption-mailcrypt-keyid ()
+  "Do the right thing."
+  (require 'mailcrypt)
+  (cond
+   ((eq notes-encryption-sub-library 'pgp)
+    (cdr (mc-pgp-lookup-key mc-pgp-user-id)))
+   ((eq notes-encryption-sub-library 'pgp50)
+    (cdr (mc-pgp50-lookup-key mc-pgp50-user-id)))
+   ((eq notes-encryption-sub-library 'gpg)
+    (cdr (mc-gpg-lookup-key mc-gpg-user-id)))
+   (t (error "notes-encryption-decrypt-region: no pgp sub-library."))))
+
+(defun notes-encryption-load-mailcrypt ()
+  (require 'mailcrypt)
+  ;; ick ick ick this code needs to be cleaned up
+  (cond
+   ((null (eq notes-encryption-library 'mailcrypt))
+    t)
+   ((eq notes-encryption-sub-library 'pgp)
+    (load-library "mc-pgp"))
+   ((eq notes-encryption-sub-library 'pgp50)
+    (load-library "mc-pgp5"))
+   ((eq notes-encryption-sub-library 'gpg)
+    (load-library "mc-gpg"))
+   (t (error "notes-encryption-load-mailcrypt: no pgp sub-library."))))
+
+(defun notes-encryption-decrypt-region (start end)
+  (cond
+   ((eq notes-encryption-library 'npgp)
+    (require 'pam)
+    (require 'npgp)
+    (npgp:decrypt-region start end))
+   ((eq notes-encryption-library 'mailcrypt)
+    (notes-encryption-load-mailcrypt)
+    (cond
+     ((eq notes-encryption-sub-library 'pgp)
+      (mc-pgp-decrypt-region start end))
+     ((eq notes-encryption-sub-library 'pgp50)
+      (mc-pgp50-decrypt-region start end))
+     ((eq notes-encryption-sub-library 'gpg)
+      (mc-gpg-decrypt-region start end))
+     (t (error "notes-encryption-decrypt-region: no pgp sub-library."))))
+   (t (error "notes-encryption-decrypt-region: no pgp library."))))
+
+(defun notes-encryption-encrypt-region (start end)
+  (cond
+   ((eq notes-encryption-library 'npgp)
+    (npgp:encrypt-region (notes-encryption-npgp-userid) start end))
+   ((eq notes-encryption-library 'mailcrypt)
+    (notes-encryption-load-mailcrypt)
+    (let ((old-sign mc-pgp-always-sign)
+         old-comment recipients)
+      (setq mc-pgp-always-sign 'never
+           recipients (list (notes-encryption-mailcrypt-keyid)))
+      (cond
+       ((eq notes-encryption-sub-library 'pgp)
+       (setq old-comment mc-pgp-comment
+             mc-pgp-comment "")
+       (mc-pgp-encrypt-region recipients start end
+                              (notes-encryption-mailcrypt-keyid) nil)
+       (setq mc-pgp-comment old-comment))
+       ((eq notes-encryption-sub-library 'pgp50)
+       (setq old-comment mc-pgp50-comment
+             mc-pgp50-comment "")
+       (mc-pgp50-encrypt-region recipients start end
+                              (notes-encryption-mailcrypt-keyid) nil)
+       (setq mc-pgp50-comment old-comment))
+       ((eq notes-encryption-sub-library 'gpg)
+       (setq old-comment mc-gpg-comment
+             mc-gpg-comment "")
+       (mc-gpg-encrypt-region recipients start end
+                              (notes-encryption-mailcrypt-keyid) nil)
+       (setq mc-gpg-comment old-comment))
+       (t (error "notes-encryption-decrypt-region: no gpg sub-library.")))
+      (setq mc-pgp-always-sign old-sign)))
+   (t (error "notes-encryption-decrypt-region: no pgp library."))))
+
+(defun notes-encrypt-note (prefix)
+  "Encrypt the current note for the current user.  With PREFIX, start from point."
+  (interactive "P")
+  (save-excursion
+    (let (start end)
+      ;; Unless a prefix arg, start at beginning-of-note.
+      (if prefix
+         nil
+       (if (not (looking-at notes-beginning-of-defun-regexp))
+           (notes-beginning-of-defun))
+       ;; skip over the header
+       (while (and (or (looking-at notes-beginning-of-defun-regexp)
+                       (looking-at "^-+$")
+                       (looking-at "^\\(prev\\|next\\): ")
+                       (looking-at "^[ \t]*$"))
+                   (< (point) (point-max)))
+         (forward-line 1)))
+      (setq start (point))
+      ;; sanity check
+      (if (re-search-forward "^-----BEGIN PGP MESSAGE" 
+                            (progn 
+                              (save-excursion 
+                                (notes-end-of-defun) 
+                                (point))) t)
+         (error "Note is already encrypted."))
+      ;; find the end
+      (notes-end-of-defun)
+      (while (or (looking-at notes-beginning-of-defun-regexp)
+                (looking-at "^[ \t]*$"))
+       (forward-line -1))
+      (forward-line 1)
+      (setq end (point))
+      (notes-encryption-encrypt-region start end))))
+
+(defun notes-decrypt-note ()
+  "Decrypt the current note for the current user."
+  (interactive)
+  (save-excursion
+    (if (not (looking-at notes-beginning-of-defun-regexp))
+       (notes-beginning-of-defun))
+    (if (null (re-search-forward "^-----BEGIN PGP" 
+                                (progn 
+                                  (save-excursion 
+                                    (notes-end-of-defun) 
+                                    (point))) t))
+       (error "Note is not encrypted."))
+    (beginning-of-line)
+    (let ((start (point)))
+      (if (null (re-search-forward "^-----END PGP"
+                                  (progn
+                                    (save-excursion
+                                      (notes-end-of-defun)
+                                      (point))) t))
+         (error "Could not find end of encrypted note."))
+      (forward-line)
+      (beginning-of-line)
+      (notes-encryption-decrypt-region start (point)))))
+
+\f
+;;;
+;;; notes or notes-index?
+;;;
+(defun notes-summarize-subject (regexp-subject &optional subject)
+  "* Collect all of a subject."
+  (interactive "P")
+  (require 'notes-index-mode)
+  (if (null subject)
+      (cond
+       ((eq major-mode 'notes-mode)
+       (setq subject (notes-extract-subject nil t)))
+       ((eq major-mode 'notes-index-mode)
+       (setq subject (notes-index-extract-subject)))))
+  (if (null subject)
+   (error "notes-summarize-subject:  no subject specified or inferable."))
+  (let
+      ((buf (get-buffer-create (concat "*notes on " subject "*"))))
+    (pop-to-buffer buf)
+    (erase-buffer)
+    (apply 'call-process (expand-file-name "catsubject" notes-bin-dir)
+           nil buf t
+          (if regexp-subject
+              (list "-m" subject)
+            (list subject)))
+    (notes-mode)))
+
+\f
+;;;
+;;; notes-rename-subject
+;;;
+(defun notes-rename-subject ()
+  "* Rename the current subject.
+Assumes working next/prev linkage between the entries."
+  (interactive)
+  (let ((subject (notes-extract-subject)))
+    (condition-case nil
+       (progn
+         (end-of-line)
+         (beginning-of-defun)
+         (if (not (looking-at "* "))
+             (error "confused"))
+         (forward-char 2)
+         (error "not yet done")
+         )
+      (error nil))))
+
+\f
+;;;
+;;; notes-mode
+;;;
+
+(defvar notes-mode-map
+  (let ((map (make-sparse-keymap)))
+    ;; Random key-bindings.
+    (define-key map "\M-\C-a" 'notes-beginning-of-defun)
+    (define-key map "\M-\C-e" 'notes-end-of-defun)
+    (define-key map "\C-c\C-d" 'notes-decrypt-note)
+    (define-key map "\C-c\C-e" 'notes-encrypt-note)
+    (define-key map "\C-c\r" 'notes-w3-follow-link)
+    (define-key map "\C-c\C-p" 'notes-follow-prev-link)
+    (define-key map "\C-c\C-n" 'notes-follow-next-link)
+    (define-key map "\C-c\C-i" 'notes-goto-index-entry)
+    (define-key map "\C-c\C-k" 'notes-current-url-as-kill)
+    (define-key map "\C-c\C-s" 'notes-summarize-subject)
+    (define-key map "\C-c-" 'notes-underline-line)
+    ;; FIXME: Use completion-at-point-functions instead.
+    (define-key map "\t" 'notes-complete-subject)
+    ;; FIXME: Use post-self-insert-hook instead.
+    (define-key map "\r" 'notes-electric-return)
+    (define-key map "\n" 'notes-electric-return) ; a more common synonym
+    (notes-platform-bind-mouse map 'S-mouse-2 'notes-w3-follow-link-mouse)
+    map))
+
+;;;###autoload
+(define-derived-mode notes-mode indented-text-mode "Notes"
+  "Enable notes-mode for a buffer.
+
+Inside a notes buffer one can click on URLs and follow them to
+other notes files.
+
+See the file notes-variables.el for all customization options.
+To change options, (require 'notes-variables) in your .emacs
+and then change things.
+
+Subjects in notes mode are lines beginning with an asterisk
+and underlined with dashes.  Subjects can be completed 
+with \\[notes-complete-subject] and are automatically underlined.
+
+You may wish to add this code to your .emacs file:
+    (add-to-list 'auto-mode-alist
+       (cons \"/9[0-9][0-9][0-9][0-9][0-9].?\\\\'\" 'notes-mode))
+    (define-key global-map [?\\C-c ?n] 'notes-index-todays-link)
+to automatically enter notes mode.
+
+I have two suggestions for how to organize your notes files.
+First, I collect my notes into a separate file per day.  (If you have
+fewer notes, you may find once-per-week or month more suitable.)
+Second, at the beginning of each file I have a subject \"* Today\".
+Since every file has this subject, I can use its prev and next links
+to easily move around the collection of files.
+
+The key-bindings of this mode are:
+\\{notes-mode-map}"
+  (notes-platform-init)
+
+  ;; Now set up the mode.
+  (auto-fill-mode 1)
+
+  ;; Imenu stuff.
+  (set (make-local-variable 'imenu-prev-index-position-function)
+       'notes-beginning-of-defun)
+  (set (make-local-variable 'imenu-extract-index-name-function)
+       'notes-extract-subject)
+
+  (set (make-local-variable 'font-lock-defaults)
+       `(notes-font-lock-keywords
+         t nil nil beginning-of-line))
+
+  ;; Finally, try to fill in an empty note.
+  (if (zerop (buffer-size))
+      (notes-mode-initialize-note))
+
+  ;; Enable outline-minor-mode (forcebly, in case someone already
+  ;; has it in their text-mode hook).  Bug found by
+  ;; Nils Ackermann <nils@nieback.de>.
+  (if notes-use-outline-mode
+      (outline-minor-mode 1)))
+
+
+
+\f
+;;;
+
+(run-hooks 'notes-mode-load-hooks)
+(provide 'notes-mode)
+;;; notes-mode.el ends here
diff --git a/packages/notes-mode/notes-mode.info b/packages/notes-mode/notes-mode.info
new file mode 100644 (file)
index 0000000..6e9118e
--- /dev/null
@@ -0,0 +1,1257 @@
+This is notes-mode.info, produced by makeinfo version 4.13 from
+notes-mode.texi.
+
+INFO-DIR-SECTION Emacs
+START-INFO-DIR-ENTRY
+* Notes-mode: (notes-mode).         Organizing on-line note-taking.
+END-INFO-DIR-ENTRY
+
+   Notes-mode:  Organizing on-line note-taking.
+
+   This file documents notes-mode, a package for organizing on-line
+note-taking.
+
+   Copyright (C) 1994-1996,2012  Free Software Foundation, Inc.
+
+     Permission is granted to copy, distribute and/or modify this
+     document under the terms of the GNU Free Documentation License,
+     Version 1.3 or any later version published by the Free Software
+     Foundation; with no Invariant Sections, with the Front-Cover texts
+     being "A GNU Manual", and with the Back-Cover Texts as in (a)
+     below.  A copy of the license is included in the section entitled
+     "GNU Free Documentation License".
+
+     (a) The FSF's Back-Cover Text is: "You have the freedom to copy and
+     modify this GNU manual.  Buying copies from the FSF supports it in
+     developing GNU and promoting software freedom."
+
+\1f
+File: notes-mode.info,  Node: Top,  Next: Introduction,  Prev: (dir),  Up: (dir)
+
+   This file documents notes-mode, a package for organizing on-line
+note-taking.  This is edition $Revision: 1.40 $, for notes-mode version
+1.16,  last updated $Date: 2010/06/20 18:30:34 $.
+
+* Menu:
+
+* Introduction::
+* Basics::
+* Advanced Features::
+* History::
+* Installation::
+* Keystroke index::
+* Concept index::
+
+ --- The Detailed Node Listing ---
+
+Introduction
+
+* What is it?::
+* Why keep notes at all?::
+* Why keep notes on-line?::
+* Why use notes-mode?::
+* Y2K Statement::
+* Related work::
+* Staying on top::
+
+Basics
+
+* Getting started::
+* A notes file::
+* The notes index::
+* The notes directories::
+
+Advanced Features
+
+* Notes files::
+* Notes indices::
+* Notes-mode configuration::
+
+Notes files
+
+* Getting around::
+* Subject summary::
+* Encryption::
+* Useful conventions::
+
+History
+
+* Notes-mode history::
+* Credits::
+* Changes::
+
+\1f
+File: notes-mode.info,  Node: Introduction,  Next: Basics,  Prev: Top,  Up: Top
+
+1 Introduction
+**************
+
+What is notes-mode and why should you (perhaps) use it?
+
+* Menu:
+
+* What is it?::
+* Why keep notes at all?::
+* Why keep notes on-line?::
+* Why use notes-mode?::
+* Y2K Statement::
+* Related work::
+* Staying on top::
+
+\1f
+File: notes-mode.info,  Node: What is it?,  Next: Why keep notes at all?,  Prev: Introduction,  Up: Introduction
+
+1.1 What is it?
+===============
+
+Notes-mode is an indexing system for on-line note-taking.  Notes-mode
+is composed of two parts, the visible part, a major-mode for emacs to
+aid note-taking; and the invisible part, scripts which periodically
+index your notes for you.
+
+   Note that notes-mode provides tools to "index" your notes, not to
+"search" them.  (Other existing tools such as `grep', `agrep', and
+`glimpse' already allow file search.)
+
+   A digression about indexing vs. searching: Indexing in this sense
+means organize them according to categories you give, while searching
+looks through all text for arbitrary strings.  Drawing on the World
+Wide Web for examples, Yahoo (`http://www.yahoo.com/') is an index,
+while Alta Vista (`http://www.altavista.digital.com/') is a
+search-engine.  In (potentially) more familiar terms, the yellow pages
+(1) are an index, while directory information (411 in the USA) is sort
+of a search-engine.
+
+   ---------- Footnotes ----------
+
+   (1) Trademarked, in Great Britain, Sunone tells me.
+
+\1f
+File: notes-mode.info,  Node: Why keep notes at all?,  Next: Why keep notes on-line?,  Prev: What is it?,  Up: Introduction
+
+1.2 Why keep notes at all?
+==========================
+
+So why should you use notes-mode?  Well, first, consider why you should
+(perhaps) keep your notes on line.  First, I assume that you take notes
+as part of your work or school.  If you don't, you can stop reading now
+and go back to watching TV.
+
+   If you keep notes, ask yourself why you keep them.  Reasons vary for
+different people, but some include:
+
+   * To remember what is said or done.
+
+   * To focus on what is important about what is said.
+
+   * To provide proof of having done something at a particular time or
+     date.
+
+   * I know there were other reasons here, but they slipped my mind.
+
+\1f
+File: notes-mode.info,  Node: Why keep notes on-line?,  Next: Why use notes-mode?,  Prev: Why keep notes at all?,  Up: Introduction
+
+1.3 Why keep notes on-line?
+===========================
+
+OK, I've talked you into keeping notes.  Why do it on-line?  Again,
+there are different reasons for different people.  If you don't want to
+consider keeping your notes on-line, you're welcome to go back to your
+(clay tablets) paper notes.
+
+   However, if you do much of your work on-line, or if you have
+portable computer, then you might want to consider keeping your notes
+on-line.
+
+   * It's faster to type than write, and possibly more legible at high
+     speed.
+
+   * Often information is already on-line.  For example, in software
+     development, bug reports, measurement results, and everything else
+     that's useful is on-line.
+
+   * You can take down more detail than you otherwise would (especially
+     if the data is already on-line).  Taking more copious notes can be
+     helpful when you go back to figure out why that strange thing was
+     happening.
+
+   * On-line notes are easy to search.  Full-text search with grep,
+     agrep, and glimpse are all much faster and are often more accurate
+     than paging through paper notes looking for a particular keyword.
+
+   * On-line notes are easy to index.  (At least with notes-mode!)  In
+     addition to full-text search, it's helpful to organize notes by
+     category.  If you keep a table-of-contents of your paper notes,
+     you are either extremely fastidious or a librarian (Nadia?).
+
+   * You can keep all of your notes with you at all times (if you have
+     a portable computer).  Even at a page a day, paper notes quickly
+     become bulky and awkward to carry around.  On-line notes fit on
+     your computer's hard disk, an extraordinarily compact medium by
+     comparison.
+
+   * Your notes can be automatically backed up.  Paper notes can become
+     damaged with time, and as a graduate student one of my fears was
+     fire in Boelter Hall consuming all my research experiments and and
+     therefore hopes of a degree.  Electronic notes are extremely easy
+     to duplicate and can be automatically backed up with the rest of
+     your computer.  (You _do_ back up your computer, don't you?)
+
+
+   While these advantages are undoubtedly clear to any right-thinking
+computer user, it should be said that there are a few disadvantages for
+on-line note-taking.
+
+   * If you don't have a computer with you most of the time, it's
+     difficult take notes on-line (because you're off-line, of course).
+     (1)
+
+   * Computers require power.  If your portable computer runs out of
+     juice, you're on your own.  Corollary:  watch your power, or bring
+     paper.  Better corollary:  watch your power, _and_ bring paper.
+
+   * Social limitations.  It's not always socially acceptable to take
+     notes-on-line.  For example, at a party, few people would use a
+     computer to take down the phone number of a person to whom they're
+     attracted (at least, if they wanted the attraction to be mutual).
+     (2) Sometimes other people find the sound of typing distracting.
+
+   * Health issues.  Repetitive stress injuries do occur writing
+     (slower) by hand is at least an alternate motion than typing.
+
+   * Legal limitations.  If you want to use your electronic notes to
+     justify a patent or invention, you may be breaking legal ground.
+     Being on the legal cutting-edge is rarely an easy thing for the
+     person involved.(3)
+
+
+   ---------- Footnotes ----------
+
+   (1) I consider myself pretty anal about this subject, often typing
+notes in from paper after-the-fact, and _I_ certainly don't manage to
+back-enter my notes all time time.
+
+   (2) On the other hand, some folks at MIT are working on this problem
+from both the hardware and the social side of things
+(`http://wearables.www.media.mit.edu/projects/wearables/') (Perhaps
+they have wild parties with computers, too.)
+
+   (3) My hat is off to Rosa Parks and the many other normal people who
+triggered landmark cases.
+
+\1f
+File: notes-mode.info,  Node: Why use notes-mode?,  Next: Y2K Statement,  Prev: Why keep notes on-line?,  Up: Introduction
+
+1.4 Why use notes-mode?
+=======================
+
+OK, I've sold you on note-taking and even on on-line note-taking.  What
+about notes-mode?  Naturally, it slices, dices, and makes julienne
+fries.  But wait, there's more:
+
+   * It automates indexing your notes, linking notes with the same
+     subject together.
+
+   * It supports embedded links, allowing you to manually link together
+     different topics and external files.
+
+   * It includes a number of convenience-features in emacs.  Subjects
+     can be completed based on existing subjects.  The usual emacs
+     customization mechanisms are available.
+
+   * Notes containing sensitive information can be encrypted.
+
+   * Notes-mode seems better than the other, currently available
+     alternatives.
+
+   What are the alternatives?  I'm glad you asked.  (1)
+
+   * *HTML*.  HTML has better formatting capabilities than notes-mode,
+     and it has excellent linking capabilities.  Unfortunately, HTML's
+     tags are fairly intrusive  (each is at least four characters long
+     and most come with a pair),  tags can get confused with normal
+     text,  errors in HTML can be bad (obscuring data),  and there's no
+     automatic indexing feature  (at least with plain HTML).  Besides,
+     all data should be kept as close to the ASCII from whence it came,
+     as God Intended (hi, Steve).
+
+   * *Word Processors*.  Word processors are strong in the formatting
+     department,  but most don't really have linking capabilities,  and
+     have poor or restricted indexing.
+
+
+   ---------- Footnotes ----------
+
+   (1) If you think I'm missing an alternative, please let me know.
+
+\1f
+File: notes-mode.info,  Node: Y2K Statement,  Next: Related work,  Prev: Why use notes-mode?,  Up: Introduction
+
+1.5 Y2K Statement
+=================
+
+Notes mode uses dates extensively,  both two-digit years and
+seconds-since-1970.  However, notes-mode has been coded to function
+correctly through  the year 2038.
+
+   To avoid problems with the year 2000, notes-mode assumes  that any
+two-digit years before "70" are 20xx, not 19xx.  Notes-mode should
+therefore work correctly in both the year 1999 and 2000.
+
+   (Notes-mode 1.17 released February 1999 fixes a lingering Y2K
+problem.)
+
+   Because notes-mode uses seconds-since-1970 for some date calculations
+it will fail beyond the year 2038 on computers with 32-bit integers.
+
+   If I'm still using notes-mode then on a 32-bit machine I'll see what
+I can do.
+
+\1f
+File: notes-mode.info,  Node: Related work,  Next: Staying on top,  Prev: Y2K Statement,  Up: Introduction
+
+1.6 Related work
+================
+
+What would a document be without related work?
+
+   Notes-mode is not related in any way to Lotus Notes.
+
+   I am told (by David Weisman)  that it's something like the now
+defunct Lotus Agenda.
+
+   Ashvin Goel, one of the contributors to notes-mode,  has gone off
+and done a from-scratch reimplementation  called records-mode.  It's
+very similar to notes mode,  and emphasizes on-the-fly updates to entry
+links  but lacks a manual.  You may want to check it out at
+`http://www.cse.ogi.edu/~ashvin/software.html'.
+
+   Hyperbole (by Bob Weiner) offers better linking facilities than
+notes-mode, but it has a bunch of stuff notes-mode doesn't need and
+it's missing notes-specific indexing provided by notes-mode.  For
+people already using Hyperbole  it would be interesting to replace
+notes-mode's linking  with Hyperbole's.  Contributions in this area are
+welcome, provided they make Hyperbole  optional.
+
+\1f
+File: notes-mode.info,  Node: Staying on top,  Prev: Related work,  Up: Introduction
+
+1.7 Staying on top
+==================
+
+The most recent distribution of notes-mode  is always available via
+`http://www.isi.edu/~johnh/SOFTWARE/NOTES_MODE/'.
+
+   After you've installed notes mode you're encouraged to subscribe to
+the mailing lists.  To subscribe, go to the web page Send the message
+"subscribe" to
+`http://www.heidemann.la.ca.us/mailman/listinfo/notes-mode-announce' or
+`http://www.heidemann.la.ca.us/mailman/listinfo/notes-mode-talk'.
+
+   The announce list will contain only release announcements and so is
+guaranteed to be very low bandwidth.
+
+\1f
+File: notes-mode.info,  Node: Basics,  Next: Advanced Features,  Prev: Introduction,  Up: Top
+
+2 Basics
+********
+
+All you need to use notes-mode  in a chapter.  (Except for
+installation, *Note Installation::.)
+
+* Menu:
+
+* Getting started::
+* A notes file::
+* The notes index::
+* The notes directories::
+
+\1f
+File: notes-mode.info,  Node: Getting started,  Next: A notes file,  Prev: Basics,  Up: Basics
+
+2.1 Getting started
+===================
+
+To get started with notes-mode,  read the introduction this chapter,
+then either:
+
+   * Start emacs, do  `M-x' `load-library' `RET' `notes-mode' `RET'
+     This approach will set up notes-mode with the default parameters.
+
+   * OR, from the shell,  run the program `notesinit'.  This approach
+     will ask you some questions about how you want to configure  notes
+     mode.
+
+
+   Either way these should set up everything notes-mode needs.  This
+program will modify your environment (as described in this section),
+or it will give you the exact commands you should run yourself.
+
+   After you've done one of these,  start up emacs and note-away.  I
+usually begin a  day of note-taking by running the command  `M-x'
+`notes-index-todays-link'  to jump directly to today's note.  You may
+even wish to bind this to something,  perhaps with  `(define-key
+global-map "\C-cn" 'notes-index-todays-link)'  in your `.emacs'.
+
+   If you want to browse your existing notes,  you might instead want
+to edit the  `~/NOTES/index'.  (What is a notes file and the index?
+Hurry up and finish  reading this chapter.)
+
+\1f
+File: notes-mode.info,  Node: A notes file,  Next: The notes index,  Prev: Getting started,  Up: Basics
+
+2.2 A notes file
+================
+
+The notes file is the focus of most of the activity in notes-mode,
+it's where you take your notes.  Notes files are mostly free-form text
+broken up into "entries".  Here's an example:
+
+     8-Jun-95 Thursday
+     -----------------
+
+     * Today
+     -------
+     prev: <none>
+     next: <file:///~/NOTES/199506/950609#* Today>
+
+     next week - release notes-mode
+
+
+     * Environment/notes
+     -------------------
+
+     I explained notes mode to Ashvin and Geoff.
+     ...
+
+   Each entry has a subject-block, (maybe) some links, and then (maybe)
+some text.
+
+   The subject-block must begin with an asterisk-space (`* ')  at the
+beginning of a line, followed by the subject itself.  Subjects must be
+underlined with a row of dashes  (if they're not exact, that's OK;
+notes-mode will fix them periodically).  For convenience,  notes-mode
+will automatically add the underlines when you  hit `<RTN>'
+(`notes-electric-return'),  and `<TAB>' on a partially completed
+subject will  invoke completion based on indexed subjects
+(`notes-complete-subject').  
+
+   Following the subject may be links.  (In the example, the "Today"
+entry has links,  the "Environment/notes" entry doesn't.)  These links
+will be automatically updated by notes-mode  when your notes are
+re-indexed;  just leave a blank line when writing the note.  
+
+   Links are made with pseudo-URLs,  sort of like those in the World
+Wide Web.  Any of these URLs can be followed in notes-mode files  by
+clicking `S-mouse-2' on the pseudo-URL  (`notes-w3-follow-link-mouse').  
+
+   Finally comes the text.  Go wild, but just don't include text that
+looks like a subject.  You can embed pseudo-URLs to link notes together
+manually.
+
+   The more anal of you may have noticed  that the lines before the
+first subject  are not part of any entry.  These lines are  "front
+matter".  They're not usually used for much,  but they can be a good
+place to label the file.  
+
+   There are a number of useful conventions  that can be adopted to
+organize your notes.  The most common is the "Today" entry.  If you
+keep an entry with the same subject  at the beginning of each file,
+you link all of your notes together.  Notes-mode will help you out with
+some of these convetions  by automatically creating or copying some
+fields for you;  see *note Useful conventions:: for details.
+
+   Finally, notes-mode can also work with outline-minor-mode  (thanks
+to Tim Carroll for pointing this out).  Outline-mode supports hiding
+and revealing text and other helpful  features beyond the scope of this
+document.  *Note Outline Mode: (emacs)Outline Mode, for details.
+
+\1f
+File: notes-mode.info,  Node: The notes index,  Next: The notes directories,  Prev: A notes file,  Up: Basics
+
+2.3 The notes index
+===================
+
+The notes index lists all subjects you've kept notes about,  and each
+date of each note.  Impress your friends,  show your advisor why you're
+worth the _big_ peanuts,  you'll soon have the biggest index of all.
+
+   The index has one line per subject, listing the subject  and each
+day a note was made about that subject.  For example:
+
+     Bicycle: 950314, 950316
+     Bicycle/maintenance/books: 951028
+     Bridge/hands: 951113, 951114, 951116, 951117
+     Bridge/UCLA: 960222, 960409
+
+   Clicking on any of the dates with `mouse-2'  will take you to that
+note  (`notes-index-mouse-follow-link').  (You can also move the point
+over the date and hit `<RTN>'  if you're musaphobic
+[`notes-index-follow-link'].)  
+
+   The notes index is automatically updated by the program `mkall'.
+Typically `mkall' is run nightly by `cron'.  On most modern versions of
+Unix, you can add this command to cron by  running `crontab -e' and
+adding the line:
+
+     0 4 * * * /usr/local/lib/notes-mode/mkall
+   
+   (Assuming that your notes programs are installed  in
+/usr/local/lib/notes-mode, the default location.)
+
+\1f
+File: notes-mode.info,  Node: The notes directories,  Prev: The notes index,  Up: Basics
+
+2.4 The notes directories
+=========================
+
+The final thing needed to tie basic notes-mode together his how the
+pieces fit together.  Since my graduate work is in file systems, you
+can bet that directories are involved.
+
+   Notes-mode keeps its files in a two-level hierarchy:
+
+     ~/NOTES
+     ~/NOTES/index
+     ~/NOTES/rawindex
+     ~/NOTES/199603
+     ~/NOTES/199603/960329
+     ~/NOTES/199603/960330
+     ~/NOTES/199604
+     ~/NOTES/199604/960401
+
+   The top level, `~/NOTES', is the notes directory.  It keeps all
+notes in one place.  (The name of this directory is configurable, *Note
+Notes-mode configuration::.)
+
+   Inside the notes directory are two files and a number of directories.
+The files are `index',  the index of all entries (*note The notes
+index::),  and `rawindex',  used internally.  
+
+   The notes directory also contains a number of subdirectories,
+sometimes called "intermediate directories".  These directories group
+the actual notes files into manageable chunks,  keeping any directory
+from getting too large.  Intermediate directories are named  by the
+four-digit year and the two-digit month  of the entries they contain.
+(The format of intermediate directories  is configurable, *Note
+Notes-mode configuration::.)  
+
+   Finally,  in each intermediate directory are the notes files
+themselves,  named according to the two-digit year, month, and
+day-of-month.  
+
+   For the most part,  notes-mode will automatically maintain this
+organization of files,  once you create the top-level directory.
+Notes-mode will also automatically ensure  that all files in the notes
+directory are unreadable by  anyone other than their owner.  Notes are
+personal things.  (This behavior is not currently configurable,  but it
+probably should be.)  
+
+\1f
+File: notes-mode.info,  Node: Advanced Features,  Next: History,  Prev: Basics,  Up: Top
+
+3 Advanced Features
+*******************
+
+Notes-mode, the minutiae, and some other good stuff.
+
+* Menu:
+
+* Notes files::
+* Notes indices::
+* Notes-mode configuration::
+
+\1f
+File: notes-mode.info,  Node: Notes files,  Next: Notes indices,  Prev: Advanced Features,  Up: Advanced Features
+
+3.1 Notes files
+===============
+
+* Menu:
+
+* Getting around::
+* Subject summary::
+* Encryption::
+* Useful conventions::
+
+\1f
+File: notes-mode.info,  Node: Getting around,  Next: Subject summary,  Prev: Notes files,  Up: Notes files
+
+3.1.1 Getting around
+--------------------
+
+Moving between notes entries and around the hierarchy is fairly common,
+so there are some accelerators.
+
+`C-c C-i'
+     Jump to the index entry for the current entry's subject
+     (`notes-goto-index-entry').  
+
+`C-c C-n'
+
+`C-c C-p'
+     Move to the next or prior note with the same subject
+     (`notes-follow-next-link' and `notes-follow-prev-link').  These
+     functions follow the links in the note,  if they're defined.  If
+     not,  they look through the index file.  This approach usually
+     works,  but will fail if there are multiple new entries created
+     with the given subject  between when the index is recomputed.  
+
+`C-c<RTN>'
+     Follow the link under the point (`notes-w3-follow-link'),  a
+     keyboard equivalent of <S-mouse-2>.  
+
+`M-C-a'
+
+`M-C-e'
+     Jump to the beginning or end of the current note entry
+     (`notes-beginning-of-defun' and `notes-end-of-defun').  
+
+`C-c C-k'
+     Copies the pseudo-URL for the current note into the kill-ring
+     (`current-url-as-kill').  To link two entries, go to the target,
+     grab its URL with `C-c C-k',  go to where you want to make the
+     link,  and yank the URL with `C-y'.  
+
+
+   Notes mode supports imenu,  if you have it bound to something  (I
+use `(global-set-key [down-mouse-3] 'imenu)').  
+
+\1f
+File: notes-mode.info,  Node: Subject summary,  Next: Encryption,  Prev: Getting around,  Up: Notes files
+
+3.1.2 Subject summary
+---------------------
+
+It's often helpful to look at all  entries for a given subject `C-c C-s'
+collects all entries with the subject of the current  entry in a new
+buffer  (`notes-summarize-subject').  
+
+\1f
+File: notes-mode.info,  Node: Encryption,  Next: Useful conventions,  Prev: Subject summary,  Up: Notes files
+
+3.1.3 Encryption
+----------------
+
+Notes occasionally contain private material.  While Unix has strong
+services for file protection  (compared to other, say, more
+wide-selling operating systems),  in many systems root passwords are
+shared,  while other systems are vulnerable to physical compromise.  In
+such systems,  properly used encryption is the best approach to
+security.
+
+   Notes-mode encryption is based  Phill Zimmerman's PGP (Pretty Good
+Privacy) (see `http://www.mantis.co.uk/pgp/pgp.html')  and either  with
+Rick Campbell's  emacs interface, PAM (PGP Augmented Messaging) (from
+`ftp://h.gp.cs.cmu.edu/usr/rfb/pam/')  (note that as of January 1997,
+PAM is no longer at this ftp site  and appears to not be publicly
+available),  or LoPresti and Choi's mailcrypt (from
+`http://cag-www.lcs.mit.edu/mailcrypt/').  
+
+`C-c C-e'
+     Encrypt the current note (`notes-encrypt-note').  By default this
+     function encrypts the whole entry.  With a prefix argument,  only
+     the part from the point to the end of the entry is encrypted.  
+
+`C-c C-d'
+     Decrypt the current note (`notes-decrypt-note').
+   
+   By default notes-mode determines your public key by looking  up your
+`user-full-name' in your PGP keyring.  You can override this default by
+setting  `notes-encryption-key-id'  to the desired key-id.  
+
+\1f
+File: notes-mode.info,  Node: Useful conventions,  Prev: Encryption,  Up: Notes files
+
+3.1.4 Useful conventions
+------------------------
+
+There are a number of conventions which can make notes-mode  easier to
+use.  These conventions are a matter of personal taste,  of course.  Do
+what works for you.
+
+   First,  I find it helpful to keep the date of each notes-file at the
+top  of the file.  This makes the file self-identifying  if the
+filename is lost.
+
+   Second,  I find it useful to have the first entry of each file  have
+the same subject (perhaps "Today").  This entry then links all notes
+together,  making it easy to go to yesterday and tomorrow.  I keep a
+to-do list on this entry,  bringing the list forward each day.  
+
+   A third useful convention is to keep an  entry with the name based
+on the day of the week  in each file.  Analogous to "Today", this entry
+links together  weeks.
+
+   Notes-mode supports these conventions.  When you make a new
+notes-file in emacs,  notes-mode searches for the preceding file.  If
+it follows any of these conventions,  the new file is initialized
+appropriately.  Currently  the approach to do this process  (in the
+program `mknew')  is fairly sensitive,  so it may not work in all cases.
+In particular,  the date convention works only on  for English-language
+dates.  (If you use notes-mode with a non-English language,  let me
+know and I'll work with you to fix this limitation.)
+
+   If you find other helpful conventions,  please let me know.
+Modifications to `mknew' to implement  new conventions are also invited.
+
+   If you don't want to use these conventions,  or if you want to use
+different ones,  set the emacs variable
+notes-mode-initialization-program  to nil or the name of your
+initialization program.  
+
+\1f
+File: notes-mode.info,  Node: Notes indices,  Next: Notes-mode configuration,  Prev: Notes files,  Up: Advanced Features
+
+3.2 Notes indices
+=================
+
+Only two features of notes index mode haven't yet been described.
+First,  you can open any notes-file based on date  with
+`notes-index-link',  normally bound to <o>.  
+
+   Second,  you can get a subject-summary  with <C-c C-s>  (*note
+Subject summary::).  The subject defaults to that of the current index
+line.  
+
+\1f
+File: notes-mode.info,  Node: Notes-mode configuration,  Prev: Notes indices,  Up: Advanced Features
+
+3.3 Notes-mode configuration
+============================
+
+Several aspects of notes mode are particularly visible  to the user.
+Because I'm not a fascist,  a user can change most of these.
+
+   Preferences are specified in `~/.notesrc'.  This file lists things
+to change:
+
+     # lines beginning with a hash are comments
+     dir: ~/NOTES
+     int_form: %Y%m
+
+   Currently, two things can be changed:
+
+`dir'
+     Specifies the root of the notes directory hierarchy  (*note The
+     notes directories::).
+
+`int_form'
+     Specifies the form of the intermediate directory.  A limited
+     subset of `strftime(3)'  formatting is allowed.
+
+   The subset of `strftime(3)' supported in `int_form' is:
+`%Y'
+     The four-digit year.
+
+`%y'
+     The two-digit year.
+
+`%m'
+     A two-digit numeric month.
+
+`%d'
+     A two-digit day.
+
+   In addition to `.notesrc',  there are a number of emacs-specific
+variables.  These variables are documented in the file
+`notes-variables.el'.
+
+\1f
+File: notes-mode.info,  Node: History,  Next: Installation,  Prev: Advanced Features,  Up: Top
+
+4 History
+*********
+
+More about notes-mode than you wanted to know, and some thanks.
+
+* Menu:
+
+* Notes-mode history::
+* Credits::
+* Changes::
+* Suggested features::
+
+\1f
+File: notes-mode.info,  Node: Notes-mode history,  Next: Credits,  Prev: History,  Up: History
+
+4.1 Notes-mode history
+======================
+
+Briefly,  I started keeping notes on-line shortly after I got a
+portable computer  in January, 1994.  After a month-and-a-half of
+notes, I realized that  one does not live by grep alone,  so I started
+adding indexing facilities.
+
+   In June of 1995  some other Ficus-project members started  keeping
+and indexing on-line notes  using other home-grown systems.  After some
+discussion,  we generalized my notes-mode work and  they started using
+it.
+
+   Over the next 18 months notes-mode grew.  Finally, in April, 1996 I
+wrote documentation,  guaranteeing that innovation on notes-mode will
+now cease  or the documentation will become out of date.
+
+\1f
+File: notes-mode.info,  Node: Credits,  Next: Changes,  Prev: Notes-mode history,  Up: History
+
+4.2 Credits
+===========
+
+I (John Heidemann, <johnh@isi.edu>)  started, documented, and currently
+maintain notes-mode.  I take ultimate responsibility for the code,
+especially for the ugly parts that I won't let others change.
+
+   Ashvin Goel  <ashvin@ficus.cs.ucla.edu>  has been a very
+enthusiastic notes-mode user and contributor.  He is responsible for at
+least  the ideas behind `notes-summarize-subject' and the ideas and
+initial implementations of  some of the original generalization and
+modularity improvements,  `notes-follow-next-link' and
+`notes-follow-prev-link',  `notes-goto-index-entry',  programmed
+subject completion,  and  context-sensitive mouse-2 handling.  In
+addition,  he is an invaluable second opinion about  what and how
+things should be done  (even if I don't always agree with him).
+
+   Geoff Kuenning  <geoff@ficus.cs.ucla.edu>  has been another
+enthusiastic notes-mode user and victim.  He is responsible for
+finding several bugs,  motivation for mouse-less operation,  comments
+about the documentation,  the day-of-week convention,  and an initial
+implementation and the idea of  multiple entries with the same subjects
+in a single notes-file.
+
+   Ramesh Govindan <govindan@isi.edu> did the xemacs port.
+
+   Since it's release on Usenet in April 1996 several  other folks have
+contributed.  Thanks to  David Weisman <weisman@app1.osf.org>,  Martin
+L. Smith <martin@ner.com>,  Jason Bastek <jason@aai.com>,  Ulrich
+Herbst <Ulrich.Herbst@t-systems.com>.  See the next section (*Note
+Changes::.) for details of their exploits.
+
+   Thanks to Larry Ayers <layers@marktwain.net>  for popularizing
+notes-mode with reviews in  the Linux Gazette  (at
+<http://www.linuxgazette.com/issue22/notes-mode.html> and
+<http://www.linuxgazette.com/issue35/ayers.html>).
+
+\1f
+File: notes-mode.info,  Node: Changes,  Next: Suggested features,  Prev: Credits,  Up: History
+
+4.3 Changes
+===========
+
+For the bored:
+
+   First semi-public release. 12-Jul-95: version 0.1  Shared a version
+with Ashvin and Geoff.
+
+   Changed  6-Dec-95: version 0.3  Ashvin's changes for note traversal
+added (C-c C-p and C-c C-n now move to the prev/next note in note-mode).
+URL parsing changed so that "localhost" is optional.
+
+   Changed 19-Dec-95:  version 0.4  More robust prev/next code added,
+both to handle going back and forward in the middle of chains through
+the index file, and to handle back/forward in a single file.   URL
+parsing changed so that notes-goto-index-entry correctly handles
+lookups on notes names such as "252A".
+
+   Changed 20-Dec-95: version 0.5.   Fixed a missing variable in
+notes-url.el.   Added a work-around to a bug in emacs-19.30's
+define-derived-mode.
+
+   Changed 24-Dec-95: version 0.6.   Prev/next code re-re-written to be
+more robust.
+
+   Changed 26-Dec-96:  version 0.7.   Bug fix release.
+
+   Changed 23-Jan-96: version 0.8.   Initialization code added to set
+up a new note.  New variable:  notes-bin-dir.
+
+   I'm skipping version 0.9 because I erroneously release version 0.1
+as version 0.9 (only on the web, not on Usenet).
+
+   I'm bumping from version "0" to version "1" since the code is has
+been in production use for more than a year by several people.  Minor
+numbers are the same.
+
+   Changed 26-Mar-96: version 1.10.   Setup code completely re-written.
+Several incompatible changes have been made:  - the lisp and Perl code
+must be installed via make install, not by copying.   - some data is
+specified in a .notesrc file; copy and modify sample.notesrc.   -
+several internal elisp changes.   - catsubject added (bound to C-cC-s):
+collect all notes about the current subject.   - new notes-files are
+initialized with fields based on the prior day's notes; see mknew for
+details.   - daily_work is gone; mkall is rewritten to use .notesrc.
+
+   Changed 29-Apr-96: version 1.11.   Real documentation.   Mknew
+caching added.
+
+   Changed  9-Aug-96: version 1.12.   Added notesinit to do all setup
+for new users.
+
+   Changed 24-Aug-96: version 1.13.   Minor documentation fixes.
+
+   Changed 20-Dec-97: version 1.14.  Autoconf support.
+
+   Fontification of the index buffer is now pre-computed in perl other
+than done when the file is needed (in elisp with slow regular
+expressions).  2000-line index files are now 1-2 seconds rather than
+15-30 on a 100MHz Pentium.  If necessary (the pre-computed version
+isn't up-to-date) we fall back on the slower code.
+
+   Related work improved (suggestion by David Weisman
+<weisman@app1.osf.org>).
+
+   Documentation improvement (problem found by Martin L. Smith
+<martin@ner.com>).
+
+   Installation improved (code by Jason Bastek <jason@aai.com>).
+
+   Bug in notes-index mode with subjects containing colons fixed
+(johnh).
+
+   Encryption now supports mailcrypt.el.
+
+   Support for emacs 20 (a small font-lock change).
+
+   Changed  5-Jan-98: version 1.15.  Bug in decryption for non-PAM
+users fixed  (suggestion by Kevin Davidson <tkld@quadstone.com>).
+
+   Y2K statement added  (suggestion by Kevin Davidson
+<tkld@quadstone.com>).
+
+   Pointer to mailcrypt added (as a supported encryption package).
+Problem pointed out by K. Ueda <kueda@jupiter.qse.tohoku.ac.jp>.
+
+   Changed  4-Nov-98: version 1.16.  Bug in kill-ring handling of
+notes-old-underline-line  fixed by Tim Potter <timp@jna.com.au>.  Bug
+in whitespace handling after PGP encryption fixed by Tim Potter.  Bugs
+in handling of entries with hash signs in their name fixed  (found by
+Tim Potter).  Fontification of index buffer further improved  (mapcar
+is your friend).  Xemacs support added based on code contributed by
+Ramesh Govindan.
+
+   Changed 28-Feb-99: version 1.17: Improvement:  notes-electric-return
+now fixes up the prev/next links  of new entries (only).  Code
+contributed by  Takashi Nishimoto.
+
+   Bug fix:  reversed options -batch and -q in configure.in to placate
+XEmacs 20.0; changed notesinit to not downcase the pathname  (bugs
+found by Thierry Bezecourt).
+
+   Clarification: Autofilling of new notes more clear in the manual
+(hopefully,  suggested by Solofo Ramangalahy).
+
+   Bug fix:  a y2k bug in was found and fixed in mkindex.  Sigh.
+
+   New:  Two mailing lists for notes-mode have been created:
+`notes-mode-announce@heidemann.la.ca.us' and
+`notes-mode-talk@heidemann.la.ca.us'.  Send the line "subscribe
+notes-mode-announce" (or "subscribe notes-mode-talk") to
+`majordomo@heidemann.la.ca.us' to join them.  [_These instructions are
+now superceeded; to subscribe, go to
+`http://www.heidemann.la.ca.us/mailman/listinfo/notes-mode-talk' and
+`http://www.heidemann.la.ca.us/mailman/listinfo/notes-mode-announce'._]
+
+   Changed  6-Oct-99: version 1.18: Bug fix:  handling of
+electric-prevnext is better when there are  existing prev/next links.
+
+   Clarification: I added some pointers in the code to the installation
+instructions.  (Apparently people can't RTF README.)
+
+   Extension: mailcrypt-3.5.x suported including pgp, pgp5 and gpg.
+
+   Changed (date 23-Dec-00): version 1.19: Bug fix (cosmetic): suppress
+comments in encrypted nodes.
+
+   Install fixes from Kannan Varadhan: elisp directories changed on
+install.
+
+   Added C-j as a synonym for RET in notes-mode to parallel C++ or perl
+mode.  (Suggested by Fred Jaggi `jaggi@rsn.hp.com'.)
+
+   Outline-minor-mode support added and documented.  (Suggested by Tim
+Carroll `tim@boomboom.com'.)
+
+   Bug/typo fixes in gpg support (Contributed by William A. Perkins
+`wa_perkins@pnl.gov', with separate patches from Knut Anders Hatlen
+`kahatlen@online.no'.)
+
+   Installation improvements suggested by Christophe Troestler
+`Ch.Troestler@linkline.be': use install-info to update the info dir,
+warn users of -prefix that lisp files go elsewhere.
+
+   Changed (date  1-Feb-01): version 1.20: Bug fix: missing file
+notes-first.el added to the distribution.  (Bug found by Michael
+Totschnig `michaelt@supernet.ca'.)
+
+   Changed ( 5-Dec-01): version 1.21: (backed-out--didn't work with
+spaced URLs) URL lookup now uses thing-at-point.
+
+   Fix to make notes-mode work with emacs-21.1 (Fix from Klaus Zeitler
+`kzeitler@lucent.com'.)
+
+   Changed ( 3-Jan-02): version 1.22: Several bugs in `notesinit' for
+stricter Perl implementations (bug found by Paul Craven"
+`pcraven@yorku.ca', and Kasper van Wijk `kasper@acoustics.mines.edu')
+and to make it run cleanly more often.
+
+   Notes-first now autoinitializes notes mode from emacs.  (As
+instisted by rms, unfortunately about two years later than requested.)
+
+   Changed (20-Feb-05): version 1.23: Outline mode is now forcebly
+turned on to avoid interactions with user's text-mode hooks (bug and
+fix from Nils Ackermann `nils@nieback.de').
+
+   Install bug involving ordering of scripts and byte-compilation fixed
+(bug and fix from Mark Allman `mallman@grc.nasa.gov').
+
+   Fix obscure bug in configure, reported by Klaus Zeitler
+`kzeitler@lucent.com'.
+
+   Fix for notes-summarize-subject when no subject is specified (bug
+and fix from Geoff Kuenning).
+
+   Changed (14-Jan-06): version 1.24:
+
+   install-info bug documented with the Debian install-info (bug
+reported by Aaron Falk `falk@isi.edu').
+
+   Automatic date completion in new days is now done in the current
+locale, so it should now work for non-English languages.  Bug reported
+by Torsten Bronger `bronger@physik.rwth-aachen.de'.
+
+   Fixed a bug in mkindexcache, triggered by subjects with percent signs
+in them.  Bug reported by Philip Austin `paustin@eos.ubc.ca'.
+
+   We're a bit more robust about subjects, I hope.  Warnings should
+appear about embedded number signs, and leading spaces should be
+filtered.  Bug reported by Philip Austin `paustin@eos.ubc.ca'.
+
+   Notes-mode now dervies from indented-text-mode rather than
+paragraph-indent-text mode.  Unfortunatley this is not customizable
+because of limitations of define-derived-mode.  Change suggested by
+Aaron Falk `falk@isi.edu'.
+
+   Provide better hints about how to get started after installation or
+running notes-mode in emacs for the first time.
+
+   In notes init, the default path for dir was the full path, not the
+tilde version of the path.  Now it defaults to using tidle for home
+directory.  Bug reported by Mark Allman `allman@icir.org'.
+
+   Changed (26-May-06): version 1.25:
+
+   fixed a bug in the release tar.gz file that had a additional copies
+copy nested.
+
+   Changed (30-Jun-08): version 1.26:
+
+   Force unicode I/O in `mkindexcache' to fix highlighting mis-alignment
+when using emacs-21 with unicode subject lines.
+
+   Changed mkprevnext and mkrawindex to optionally take the list of
+notes files to index from stdin rather than from the command line.
+Yes, I finally have 4093 notes files, overflowing the Unix command line
+buffer.
+
+   Changes notes-mode.el to put path in quotes, allowing spaces to
+appear in home directory names (bug fix from Ulrich Herbst).
+
+   Added a suggested features section.
+
+   Changed ( 8-Aug-08): version 1.27:
+
+   Change I/O in `mkindexcache' to use locale (the sadly correct thing)
+rather than forcing utf-8 (the Righteous Path).  Bug report from Geoff
+Kuenning, a man with an older Unix environment than I.
+
+   Changed (20-Jun-10): version 1.28:
+
+   Changed a regular expression in `notes-index-mode.el' that was
+causing emacs-v23 (a pre-release version) to regular expression
+infinite recursion.
+
+   Changed (2012-04-04): version 1.29
+
+   (2011-08-23) Changed `run-hooks' to `run-mode-hooks'.  Bug report
+from Geoff Kuenning.
+
+   Changed some handling of PGP encryption to account for some apparent
+API changes.
+
+   (2012-04-04) Fixed encyrption to handle encrypting empty notes at
+the end of buffers without going into an infinite loop.  Clearly wrong
+code, but you have to ask this guy for why he tried: Bug report from
+Geoff Kuenning.
+
+\1f
+File: notes-mode.info,  Node: Suggested features,  Prev: Changes,  Up: History
+
+4.4 Suggested features
+======================
+
+Features suggested by users but not yet implemented:
+
+   21-Feb-08: (from Xavier Maillard): should support "disconnected"
+notes that are indexed but not date-based.
+
+   21-Feb-08: (from John Heidemann): should switch all notes files to
+have an extension (maybe `.notes').
+
+\1f
+File: notes-mode.info,  Node: Installation,  Next: Keystroke index,  Prev: History,  Up: Top
+
+5 Installation
+**************
+
+To install notes-mode,
+
+  1. Unpack and extract the distribution (gunzip notes-mode-xxx.tar.gz;
+     tar xvf notes-mode-xxx.tar; cd notes-mode-xxx).
+
+  2. Run configure (./configure).
+
+  3. Type "make install".
+
+   (To control what's installed where, use -prefix=/where, or
+-with-lisp-dir=/where, -datadir=/where (for scripts), and
+-infodir=/where.)
+
+   For each user:
+  1. Run notesinit
+
+   If you have problems with paths being incorrect, please be aware that
+you _cannot_ run notes directly out of where you untar it.  The
+installation process customizes the programs for where things are on
+your system.  Make sure you move out of the directory where you
+untarred it before running it.
+
+   The most recent distribution of notes-mode  is always available via
+`http://www.isi.edu/~johnh/SOFTWARE/NOTES_MODE/'.
+
+\1f
+File: notes-mode.info,  Node: Keystroke index,  Next: Concept index,  Prev: Installation,  Up: Top
+
+Keystroke index
+***************
+
+This index lists notes-mode keystrokes.
+
+\0\b[index\0\b]
+* Menu:
+
+* C-c C-d:                               Encryption.           (line 28)
+* C-c C-e:                               Encryption.           (line 24)
+* C-c C-i:                               Getting around.       (line 11)
+* C-c C-k:                               Getting around.       (line 37)
+* C-c C-n:                               Getting around.       (line 21)
+* C-c C-p:                               Getting around.       (line 21)
+* C-c C-s <1>:                           Notes indices.        (line 12)
+* C-c C-s:                               Subject summary.      (line  8)
+* C-c<RTN>:                              Getting around.       (line 25)
+* M-C-a:                                 Getting around.       (line 31)
+* M-C-e:                                 Getting around.       (line 31)
+* mouse-2:                               The notes index.      (line 21)
+* o:                                     Notes indices.        (line  8)
+* RTN <1>:                               The notes index.      (line 21)
+* RTN:                                   A notes file.         (line 37)
+* S-mouse-2:                             A notes file.         (line 46)
+* TAB:                                   A notes file.         (line 37)
+
+\1f
+File: notes-mode.info,  Node: Concept index,  Prev: Keystroke index,  Up: Top
+
+Concept index
+*************
+
+This index lists notes-mode concepts.
+
+\0\b[index\0\b]
+* Menu:
+
+* .notesrc:                              Notes-mode configuration.
+                                                               (line  6)
+* configuration:                         Notes-mode configuration.
+                                                               (line  6)
+* conventions:                           Useful conventions.   (line  6)
+* Crontab:                               The notes index.      (line 29)
+* Decryption:                            Encryption.           (line  6)
+* Directory hierarchy:                   The notes directories.
+                                                               (line  6)
+* Encryption:                            Encryption.           (line  6)
+* Font matter:                           A notes file.         (line 55)
+* imenu:                                 Getting around.       (line 41)
+* Intermediate directories:              The notes directories.
+                                                               (line 35)
+* key-id:                                Encryption.           (line 31)
+* mailcrypt:                             Encryption.           (line 19)
+* mkall:                                 The notes index.      (line 29)
+* mknew:                                 Useful conventions.   (line  6)
+* Notes directories:                     The notes directories.
+                                                               (line  6)
+* Notes entries:                         A notes file.         (line 10)
+* Notes file permissions:                The notes directories.
+                                                               (line 46)
+* Notes files <1>:                       The notes directories.
+                                                               (line 39)
+* Notes files:                           A notes file.         (line  6)
+* Notes files, font matter:              A notes file.         (line 55)
+* Notes index:                           The notes index.      (line  6)
+* Notes links:                           A notes file.         (line 42)
+* Notes subjects:                        A notes file.         (line 37)
+* notes-mode-initialization-program:     Useful conventions.   (line 38)
+* notesinit:                             Getting started.      (line  6)
+* PAM:                                   Encryption.           (line 19)
+* PGP:                                   Encryption.           (line 19)
+* PGP Augmented Messaging:               Encryption.           (line 19)
+* Pretty good privacy:                   Encryption.           (line 19)
+* Pseudo-URLs:                           A notes file.         (line 46)
+* re-indexing:                           The notes index.      (line 29)
+* Root directory:                        The notes directories.
+                                                               (line 27)
+* setup:                                 Getting started.      (line  6)
+* Subject summary:                       Subject summary.      (line  8)
+* Today:                                 Useful conventions.   (line 17)
+* URLs:                                  A notes file.         (line 46)
+
+
+\1f
+Tag Table:
+Node: Top\7f1063
+Node: Introduction\7f1988
+Node: What is it?\7f2318
+Ref: What is it?-Footnote-1\7f3411
+Node: Why keep notes at all?\7f3467
+Node: Why keep notes on-line?\7f4252
+Ref: Why keep notes on-line?-Footnote-1\7f7805
+Ref: Why keep notes on-line?-Footnote-2\7f7981
+Ref: Why keep notes on-line?-Footnote-3\7f8220
+Node: Why use notes-mode?\7f8319
+Ref: Why use notes-mode?-Footnote-1\7f10010
+Node: Y2K Statement\7f10079
+Node: Related work\7f10892
+Node: Staying on top\7f11940
+Node: Basics\7f12590
+Node: Getting started\7f12896
+Node: A notes file\7f14135
+Node: The notes index\7f16878
+Node: The notes directories\7f18130
+Node: Advanced Features\7f19994
+Node: Notes files\7f20254
+Node: Getting around\7f20491
+Node: Subject summary\7f21921
+Node: Encryption\7f22257
+Node: Useful conventions\7f23690
+Node: Notes indices\7f25461
+Node: Notes-mode configuration\7f25937
+Node: History\7f27010
+Node: Notes-mode history\7f27274
+Node: Credits\7f28066
+Node: Changes\7f29947
+Node: Suggested features\7f39800
+Node: Installation\7f40202
+Node: Keystroke index\7f41142
+Node: Concept index\7f42581
+\1f
+End Tag Table
diff --git a/packages/notes-mode/notes-mode.texi b/packages/notes-mode/notes-mode.texi
new file mode 100644 (file)
index 0000000..60382c2
--- /dev/null
@@ -0,0 +1,1585 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename notes-mode.info
+@settitle Notes-mode:  Organizing on-line note-taking.
+@c For double-sided printing, uncomment:
+@c @setchapternewpage odd
+@c %**end of header
+
+@c FIXME: Figure out a way to keep these things up-to-date w/o RCS/CVS!
+@set EDITION $Revision: 1.40 $
+@c XXX: the next line should track the release file.
+@set VERSION 1.16
+@set UPDATED $Date: 2010/06/20 18:30:34 $
+
+@iftex
+@finalout
+@end iftex
+
+@dircategory Emacs
+@direntry
+* Notes-mode: (notes-mode).         Organizing on-line note-taking.
+@end direntry
+
+@c FIXME: The leading spaces lead to double spaces inside the
+@c generated .info file!
+
+@ifinfo
+Notes-mode:  Organizing on-line note-taking.
+
+This file documents notes-mode, a package
+for organizing on-line note-taking.
+@end ifinfo
+
+@copying
+Copyright (C) 1994-1996,2012  Free Software Foundation, Inc.
+
+@quotation
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with the Front-Cover texts being ``A GNU Manual'',
+and with the Back-Cover Texts as in (a) below.  A copy of the license
+is included in the section entitled ``GNU Free Documentation License''.
+
+(a) The FSF's Back-Cover Text is: ``You have the freedom to copy and
+modify this GNU manual.  Buying copies from the FSF supports it in
+developing GNU and promoting software freedom.''
+@end quotation
+@end copying
+
+@titlepage
+@title Notes-mode
+@subtitle Organizing on-line note-taking
+@subtitle Edition @value{EDITION}, for notes-mode version @value{VERSION}
+@subtitle @value{UPDATED}
+@author by John Heidemann
+
+@end titlepage
+
+@node Top, Introduction, (dir), (dir)
+@comment  node-name,  next,  previous,  up
+
+@ifinfo
+This file documents notes-mode, a package
+for organizing on-line note-taking.
+This is edition @value{EDITION}, for notes-mode version @value{VERSION},
+ last updated @value{UPDATED}.
+
+@end ifinfo
+
+@c
+@c Outline as of 16-Apr-96:
+@c
+@c introduction
+@c - what is notes mode
+@c - why keep notes on-line
+@c   - easier to type than write
+@c   - information already on-line (program errors, measurement data, etc.)
+@c   - easy to search (grep, glimpse)
+@c   - easy to index (notes-mode)
+@c - why use notes-mode
+@c   - automates indexing
+@c   - supports links
+@c   - emacs helpers (subject completion, elisp customization)
+@c   - alternatives:
+@c     HTML (+formatting, +links, -tags are intrusive, -errors are bad, -index by hand)
+@c     word processor (+formatting, -links, -indexing)
+@c - related work
+@c   - notes-mode is not related to Lotus Notes
+@c basics
+@c - notes-file
+@c   (text mode)
+@c   - front-matter
+@c   - entries
+@c     - subject
+@c     - links
+@c     like urls, but not quite
+@c     mouse-2 follows a link (and also pastes)
+@c     - text
+@c     can contain other, embedded links
+@c - notes-index
+@c   - subjects
+@c    mouse-2 follows links
+@c   - re-indexing
+@c - file layout
+@c   - root ~/NOTES, changing
+@c   - intermediate directories @cY@cm
+@c   - notes-files @cy@cm@cd
+@c intermediate features
+@c - notes-files
+@c     - conventions
+@c      today
+@c      Monday
+@c      date in front-matter
+@c      hierarchical subjects
+@c     - C-c C-s subject summary
+@c     - C-c C-k current-url-as-kill
+@c     - getting around
+@c       - C-c C-i notes-goto-index-entry
+@c     - C-c C-n notes-follow-next-link, C-c C-p notes-follow-prev-link
+@c     - C-c C-f notes-w3-follow-link
+@c     - M-C-a notes-beginning-of-defun, M-C-e notes-end-of-defun
+@c     - C-c C-e, C-c C-s encryption
+@c - notes-index
+@c   - RET notes-index-follow-link
+@c   - o notes-index-link
+@c   - C-c C-s summarize subject
+@c advanced features:
+@c - .notesrc
+@c history
+@c - genesis: minimal functionality: subject collection
+@c - Leviticus: indexing, urls
+@c - exodus: share with others
+@c - Deuteronomy: features are added
+@c
+
+
+
+@c The master menu, created with texinfo-master-menu, goes here.
+
+@menu
+* Introduction::                
+* Basics::                      
+* Advanced Features::           
+* History::                     
+* Installation::                
+* Keystroke index::             
+* Concept index::               
+
+@detailmenu
+ --- The Detailed Node Listing ---
+
+Introduction
+
+* What is it?::                 
+* Why keep notes at all?::      
+* Why keep notes on-line?::     
+* Why use notes-mode?::         
+* Y2K Statement::               
+* Related work::                
+* Staying on top::              
+
+Basics
+
+* Getting started::             
+* A notes file::                
+* The notes index::             
+* The notes directories::       
+
+Advanced Features
+
+* Notes files::                 
+* Notes indices::               
+* Notes-mode configuration::    
+
+Notes files
+
+* Getting around::              
+* Subject summary::             
+* Encryption::                  
+* Useful conventions::          
+
+History
+
+* Notes-mode history::          
+* Credits::                     
+* Changes::                     
+
+@end detailmenu
+@end menu
+
+@c ----------------------------------------------------------------------
+
+@node Introduction, Basics, Top, Top
+@chapter Introduction
+
+What is notes-mode and why should you (perhaps) use it?
+
+@menu
+* What is it?::                 
+* Why keep notes at all?::      
+* Why keep notes on-line?::     
+* Why use notes-mode?::         
+* Y2K Statement::               
+* Related work::                
+* Staying on top::              
+@end menu
+
+@node What is it?, Why keep notes at all?, Introduction, Introduction
+@comment  node-name,  next,  previous,  up
+@section What is it?
+
+Notes-mode is an indexing system for on-line note-taking.
+Notes-mode is composed of two parts, the visible part,
+a major-mode for emacs to aid note-taking;
+and the invisible part,
+scripts which periodically index your notes for you.
+
+Note that notes-mode provides tools to @dfn{index} your notes,
+not to @dfn{search} them.
+(Other existing tools such as @file{grep}, @file{agrep}, and @file{glimpse}
+already allow file search.)
+
+A digression about indexing vs. searching:
+Indexing in this sense means
+organize them according to categories you give,
+while searching looks through all text for arbitrary strings.
+Drawing on the World Wide Web for examples,
+Yahoo (@file{http://www.yahoo.com/}) is an index,
+while Alta Vista (@file{http://www.altavista.digital.com/})
+is a search-engine.
+In (potentially) more familiar terms,
+the yellow pages
+@footnote{Trademarked, in Great Britain, Sunone tells me.}
+are an index,
+while directory information (411 in the USA)
+is sort of a search-engine.
+
+
+@node  Why keep notes at all?, Why keep notes on-line?, What is it?, Introduction
+@comment  node-name,  next,  previous,  up
+@section Why keep notes at all?
+
+So why should you use notes-mode?
+Well, first, consider why you should (perhaps)
+keep your notes on line.
+First,
+I assume that you take notes as part of your work or school.
+If you don't,
+you can stop reading now and go back to watching TV.
+
+If you keep notes, ask yourself why you keep them.
+Reasons vary for different people, but some include:
+
+@itemize @bullet
+
+@item
+To remember what is said or done.
+
+@item
+To focus on what is important about what is said.
+
+@item
+To provide proof of having done something
+at a particular time or date.
+
+@item
+I know there were other reasons here,
+but they slipped my mind.
+@end itemize
+
+
+@node  Why keep notes on-line?, Why use notes-mode?, Why keep notes at all?, Introduction
+@comment  node-name,  next,  previous,  up
+@section Why keep notes on-line?
+
+OK, I've talked you into keeping notes.
+Why do it on-line?
+Again, there are different reasons for different people.
+If you don't want to consider keeping your notes on-line,
+you're welcome to go back to your (clay tablets)
+paper notes.
+
+However, if you do much of your work on-line,
+or if you have portable computer,
+then you might want to consider keeping your notes on-line.
+
+@itemize @bullet
+
+@item
+It's faster to type than write,
+and possibly more legible at high speed.
+
+@item
+Often information is already on-line.
+For example, in software development, bug reports,
+measurement results, and everything else that's useful
+is on-line.
+
+@item
+You can take down more detail than you otherwise would
+(especially if the data is already on-line).
+Taking more copious notes can be helpful when you go back
+to figure out why that strange thing was happening.
+
+@item
+On-line notes are easy to search.
+Full-text search with 
+grep, agrep, and glimpse are all much faster
+and are often more accurate than paging through paper notes
+looking for a particular keyword.
+
+@item
+On-line notes are easy to index.
+(At least with notes-mode!)
+In addition to full-text search,
+it's helpful to organize notes by category.
+If you keep a table-of-contents of your paper notes,
+you are either extremely fastidious
+or a librarian (Nadia?).
+
+@item
+You can keep all of your notes with you at all times
+(if you have a portable computer).
+Even at a page a day,
+paper notes quickly become bulky and awkward to carry around.
+On-line notes fit on your computer's hard disk,
+an extraordinarily compact medium
+by comparison.
+
+@item
+Your notes can be automatically backed up.
+Paper notes can become damaged with time,
+and as a graduate student
+one of my fears was fire in Boelter Hall
+consuming all my research experiments
+and and therefore hopes of a degree.
+Electronic notes are extremely easy to duplicate
+and can be automatically backed up with the rest of your computer.
+(You @emph{do} back up your computer, don't you?)
+
+@end itemize
+
+While these advantages are undoubtedly clear to any
+right-thinking computer user,
+it should be said that there are a few disadvantages 
+for on-line note-taking.
+
+@itemize @bullet
+
+@item
+If you don't have a computer with you most of the time,
+it's difficult take notes on-line (because you're off-line, of course).
+@footnote{I consider myself pretty anal about this subject,
+often typing notes in from paper after-the-fact,
+and @emph{I} certainly don't manage to back-enter
+my notes all time time.}
+
+@item
+Computers require power.
+If your portable computer runs out of juice,
+you're on your own.
+Corollary:  watch your power, or bring paper.
+Better corollary:  watch your power, @emph{and} bring paper.
+
+@item
+Social limitations.
+It's not always socially acceptable to take notes-on-line.
+For example,
+at a party,
+few people would use a computer
+to take down the phone number of a person
+to whom they're attracted
+(at least, if they wanted the attraction to be mutual).
+@footnote{
+On the other hand, some folks at MIT are working
+on this problem from both the hardware and the social side of
+things (@file{http://wearables.www.media.mit.edu/projects/wearables/})
+(Perhaps they have wild parties with computers, too.)
+}
+Sometimes other people find the sound of typing distracting.
+
+@item
+Health issues.
+Repetitive stress injuries do occur
+writing (slower) by hand is at least 
+an alternate motion than typing.
+
+@item
+Legal limitations.
+If you want to use your electronic notes
+to justify a patent or invention,
+you may be breaking legal ground.
+Being on the legal cutting-edge is rarely an easy thing
+for the person involved.@footnote{My hat is off to Rosa Parks
+and the many other normal people who triggered landmark cases.}
+
+@end itemize
+
+
+@node  Why use notes-mode?, Y2K Statement, Why keep notes on-line?, Introduction
+@comment  node-name,  next,  previous,  up
+@section Why use notes-mode?
+
+OK, I've sold you on note-taking and even on on-line note-taking.
+What about notes-mode?
+Naturally,
+it slices, dices, and makes julienne fries.
+But wait, there's more:
+
+@itemize @bullet
+
+@item
+It automates indexing your notes,
+linking notes with the same subject together.
+
+@item
+It supports embedded links,
+allowing you to manually link together different topics 
+and external files.
+
+@item
+It includes a number of convenience-features in emacs.
+Subjects can be completed based on existing subjects.
+The usual emacs customization mechanisms are available.
+
+@item
+Notes containing sensitive information can be encrypted.
+
+@item
+Notes-mode seems better than the other, currently available alternatives.
+@end itemize
+
+What are the alternatives?  I'm glad you asked.
+@footnote{If you think I'm missing an alternative, please let me know.}
+
+@itemize @bullet
+
+@item
+@strong{HTML}.
+HTML has better formatting capabilities than notes-mode,
+and it has excellent linking capabilities.
+Unfortunately,
+HTML's tags are fairly intrusive
+ (each is at least four characters long and most come with a pair),
+ tags can get confused with normal text,
+ errors in HTML can be bad (obscuring data),
+ and there's no automatic indexing feature
+ (at least with plain HTML).
+Besides,
+ all data should be kept as close to the ASCII from whence it came,
+ as God Intended (hi, Steve).
+
+@item
+@strong{Word Processors}.
+Word processors are strong in the formatting department,
+ but most don't really have linking capabilities,
+ and have poor or restricted indexing.
+
+@end itemize
+
+@node  Y2K Statement, Related work, Why use notes-mode?, Introduction
+@comment  node-name,  next,  previous,  up
+@section Y2K Statement
+
+Notes mode uses dates extensively,
+ both two-digit years and seconds-since-1970.
+However, notes-mode has been coded to function correctly through
+ the year 2038.
+
+To avoid problems with the year 2000, notes-mode assumes
+ that any two-digit years before ``70'' are 20xx, not 19xx.
+Notes-mode should therefore work correctly in both the year 1999 and 2000.
+
+(Notes-mode 1.17 released February 1999 fixes a lingering Y2K problem.)
+
+Because notes-mode uses seconds-since-1970 for some date calculations
+ it will fail beyond the year 2038 on computers with 32-bit integers.
+
+If I'm still using notes-mode then on a 32-bit machine I'll see what I can do.
+
+
+@node  Related work, Staying on top, Y2K Statement, Introduction
+@comment  node-name,  next,  previous,  up
+@section Related work
+
+What would a document be without related work?
+
+Notes-mode is not related in any way to Lotus Notes.
+
+I am told (by David Weisman)
+ that it's something like the now defunct Lotus Agenda.
+
+Ashvin Goel, one of the contributors to notes-mode,
+ has gone off and done a from-scratch reimplementation
+ called records-mode.
+It's very similar to notes mode,
+ and emphasizes on-the-fly updates to entry links
+ but lacks a manual.
+You may want to check it out at
+ @file{http://www.cse.ogi.edu/~ashvin/software.html}.
+
+Hyperbole (by Bob Weiner) offers better linking facilities
+than notes-mode, but it has a bunch of stuff notes-mode doesn't need
+and it's missing notes-specific indexing provided by notes-mode.
+For people already using Hyperbole
+ it would be interesting to replace notes-mode's linking
+ with Hyperbole's.
+Contributions in this area are welcome, provided they make Hyperbole
+ optional.
+
+@node  Staying on top,  , Related work, Introduction
+@comment  node-name,  next,  previous,  up
+@section Staying on top
+
+The most recent distribution of notes-mode 
+ is always available via
+ @file{http://www.isi.edu/~johnh/SOFTWARE/NOTES_MODE/}.
+
+After you've installed notes mode you're encouraged to subscribe
+to the mailing lists.
+To subscribe, go to the web page
+Send the message "subscribe" to
+@file{http://www.heidemann.la.ca.us/mailman/listinfo/notes-mode-announce} or
+@file{http://www.heidemann.la.ca.us/mailman/listinfo/notes-mode-talk}.
+
+The announce list will contain only release announcements
+and so is guaranteed to be very low bandwidth.
+
+
+@c ----------------------------------------------------------------------
+
+@node  Basics, Advanced Features, Introduction, Top
+@comment  node-name,  next,  previous,  up
+@chapter Basics
+
+All you need to use notes-mode
+ in a chapter.
+(Except for installation, @xref{Installation}.)
+
+@menu
+* Getting started::             
+* A notes file::                
+* The notes index::             
+* The notes directories::       
+@end menu
+
+@node  Getting started, A notes file, Basics, Basics
+@comment  node-name,  next,  previous,  up
+@section Getting started
+@cindex notesinit
+@cindex setup
+
+To get started with notes-mode,
+ read the introduction this chapter,
+ then either:
+
+@itemize @bullet
+
+@item
+Start emacs, do 
+ @kbd{M-x} @code{load-library} @kbd{RET} @code{notes-mode} @kbd{RET}
+This approach will set up notes-mode with the default parameters.
+
+@item
+OR, from the shell, 
+ run the program @file{notesinit}.
+This approach will ask you some questions about how you want to configure
+ notes mode.
+
+@end itemize
+
+Either way these should set up everything notes-mode needs.
+This program will modify your environment (as described in this section),
+ or it will give you the exact commands you should run yourself.
+
+After you've done one of these,
+ start up emacs and note-away.
+I usually begin a
+ day of note-taking by running the command
+ @kbd{M-x} @code{notes-index-todays-link}
+ to jump directly to today's note.
+You may even wish to bind this to something,
+ perhaps with
+ @code{(define-key global-map "\C-cn" 'notes-index-todays-link)}
+ in your @file{.emacs}. 
+
+If you want to browse your existing notes,
+ you might instead want to edit the
+ @file{~/NOTES/index}.
+(What is a notes file and the index? Hurry up and finish
+ reading this chapter.) 
+
+
+@node  A notes file, The notes index, Getting started, Basics
+@comment  node-name,  next,  previous,  up
+@section A notes file
+@c - notes-file
+@c   (text mode)
+@c   - front-matter
+@c   - entries
+@c     - subject
+@c     - links
+@c     like urls, but not quite
+@c     mouse-2 follows a link (and also pastes)
+@c     - text
+@c     can contain other, embedded links
+
+@cindex Notes files
+
+The notes file is the focus of most of the activity in notes-mode,
+ it's where you take your notes.
+Notes files are mostly free-form text
+ broken up into @dfn{entries}.
+Here's an example:
+
+@cindex Notes entries
+
+@example
+8-Jun-95 Thursday
+-----------------
+
+* Today
+-------
+prev: <none>
+next: <file:///~/NOTES/199506/950609#* Today>
+
+next week - release notes-mode
+
+
+* Environment/notes
+-------------------
+
+I explained notes mode to Ashvin and Geoff.
+...
+@end example
+
+Each entry has a subject-block, (maybe) some links, and then (maybe) some text.
+
+The subject-block must begin with an asterisk-space (@kbd{* })
+ at the beginning of a line, followed by the subject itself.
+Subjects must be underlined with a row of dashes
+ (if they're not exact, that's OK;
+ notes-mode will fix them periodically).
+For convenience,
+ notes-mode will automatically add the underlines when you
+ hit @kbd{@key{RTN}} (@code{notes-electric-return}),
+ and @kbd{@key{TAB}} on a partially completed subject will
+ invoke completion based on indexed subjects (@code{notes-complete-subject}).
+@cindex Notes subjects
+@kindex RTN
+@kindex TAB
+
+Following the subject may be links.
+(In the example, the ``Today'' entry has links,
+ the ``Environment/notes'' entry doesn't.)
+These links will be automatically updated by notes-mode
+ when your notes are re-indexed;
+ just leave a blank line when writing the note.
+@cindex Notes links
+
+Links are made with pseudo-URLs,
+ sort of like those in the World Wide Web. 
+Any of these URLs can be followed in notes-mode files
+ by clicking @kbd{S-mouse-2} on the pseudo-URL
+ (@code{notes-w3-follow-link-mouse}).
+@cindex Pseudo-URLs
+@cindex URLs
+@kindex S-mouse-2
+
+Finally comes the text.
+Go wild, but just don't include text that looks like a subject.
+You can embed pseudo-URLs to link notes together manually.
+
+The more anal of you may have noticed
+ that the lines before the first subject
+ are not part of any entry.
+These lines are
+ @dfn{front matter}.
+They're not usually used for much,
+ but they can be a good place to label the file.
+@cindex Notes files, font matter
+@cindex Font matter
+
+There are a number of useful conventions
+ that can be adopted to organize your notes.
+The most common is the ``Today'' entry.
+If you keep an entry with the same subject
+ at the beginning of each file,
+ you link all of your notes together.
+Notes-mode will help you out with some of these convetions
+ by automatically creating or copying some fields for you;
+ see @pxref{Useful conventions} for details.
+
+Finally, notes-mode can also work with outline-minor-mode
+ (thanks to Tim Carroll for pointing this out).
+Outline-mode supports hiding and revealing text and other helpful
+ features beyond the scope of this document.
+@xref{Outline Mode, Outline Mode, , emacs, The Emacs Editor}, for details.
+
+@node  The notes index, The notes directories, A notes file, Basics
+@comment  node-name,  next,  previous,  up
+@section The notes index
+@c - notes-index
+@c   - subjects
+@c    mouse-2 follows links
+@c   - re-indexing
+
+@cindex Notes index
+
+The notes index lists all subjects you've kept notes about,
+ and each date of each note.
+Impress your friends,
+ show your advisor why you're worth the @emph{big} peanuts,
+ you'll soon have the biggest index of all.
+
+The index has one line per subject, listing the subject
+ and each day a note was made about that subject.
+For example:
+
+@example
+Bicycle: 950314, 950316
+Bicycle/maintenance/books: 951028
+Bridge/hands: 951113, 951114, 951116, 951117
+Bridge/UCLA: 960222, 960409
+@end example
+
+Clicking on any of the dates with @kbd{mouse-2}
+ will take you to that note
+ (@code{notes-index-mouse-follow-link}).
+(You can also move the point over the date and hit @kbd{@key{RTN}}
+ if you're musaphobic [@code{notes-index-follow-link}].)
+@kindex mouse-2
+@kindex RTN
+
+The notes index is automatically updated by the program @file{mkall}.
+Typically @file{mkall} is run nightly by @file{cron}.
+On most modern versions of Unix, you can add this command to cron by
+ running @file{crontab -e} and adding the line:
+
+@example
+0 4 * * * /usr/local/lib/notes-mode/mkall
+@end example
+@cindex Crontab
+@cindex mkall
+@cindex re-indexing
+
+(Assuming that your notes programs are installed
+ in /usr/local/lib/notes-mode, the default location.)
+
+
+@node  The notes directories,  , The notes index, Basics
+@comment  node-name,  next,  previous,  up
+@section The notes directories
+
+@cindex Notes directories
+@cindex Directory hierarchy
+
+The final thing needed to tie basic notes-mode together his how
+the pieces fit together.
+Since my graduate work is in file systems,
+you can bet that directories are involved.
+
+Notes-mode keeps its files in a two-level hierarchy:
+
+@example
+~/NOTES
+~/NOTES/index
+~/NOTES/rawindex
+~/NOTES/199603
+~/NOTES/199603/960329
+~/NOTES/199603/960330
+~/NOTES/199604
+~/NOTES/199604/960401
+@end example
+
+The top level, @file{~/NOTES}, is the notes directory.
+It keeps all notes in one place.
+(The name of this directory is configurable, @xref{Notes-mode configuration}.)
+
+Inside the notes directory are two files and a number of directories.
+The files are @file{index},
+ the index of all entries (@pxref{The notes index}),
+ and @file{rawindex},
+ used internally.
+@cindex Root directory
+
+The notes directory also contains a number of subdirectories,
+ sometimes called @dfn{intermediate directories}.
+These directories group the actual notes files into manageable chunks,
+ keeping any directory from getting too large.
+Intermediate directories are named
+ by the four-digit year and the two-digit month
+ of the entries they contain.
+(The format of intermediate directories
+ is configurable, @xref{Notes-mode configuration}.)
+@cindex Intermediate directories
+
+Finally,
+ in each intermediate directory are the notes files themselves,
+ named according to the two-digit year, month, and day-of-month.
+@cindex Notes files
+
+For the most part,
+ notes-mode will automatically maintain this organization of files,
+ once you create the top-level directory.
+Notes-mode will also automatically ensure
+ that all files in the notes directory are unreadable by
+ anyone other than their owner.
+Notes are personal things.
+(This behavior is not currently configurable,
+ but it probably should be.)
+@cindex Notes file permissions
+
+
+@c ----------------------------------------------------------------------
+
+@node  Advanced Features, History, Basics, Top
+@comment  node-name,  next,  previous,  up
+@chapter Advanced Features
+
+Notes-mode, the minutiae, and some other good stuff.
+
+@menu
+* Notes files::                 
+* Notes indices::               
+* Notes-mode configuration::    
+@end menu
+
+@node  Notes files, Notes indices, Advanced Features, Advanced Features
+@comment  node-name,  next,  previous,  up
+@section Notes files
+
+@menu
+* Getting around::              
+* Subject summary::             
+* Encryption::                  
+* Useful conventions::          
+@end menu
+
+@node  Getting around, Subject summary, Notes files, Notes files
+@comment  node-name,  next,  previous,  up
+@subsection Getting around
+
+Moving between notes entries and around the hierarchy is fairly common,
+ so there are some accelerators.
+
+@table @kbd
+@item C-c C-i
+Jump to the index entry for the current entry's subject
+(@code{notes-goto-index-entry}).
+@kindex C-c C-i
+
+@item C-c C-n
+@item C-c C-p
+Move to the next or prior note with the same subject
+(@code{notes-follow-next-link} and @code{notes-follow-prev-link}).
+These functions follow the links in the note,
+ if they're defined.
+If not,
+ they look through the index file.
+This approach usually works,
+ but will fail if there are multiple new entries created
+ with the given subject
+ between when the index is recomputed.
+@kindex C-c C-n
+@kindex C-c C-p
+
+@item C-c@key{RTN}
+Follow the link under the point
+(@code{notes-w3-follow-link}),
+ a keyboard equivalent of @key{S-mouse-2}.
+@kindex C-c@key{RTN}
+
+@item M-C-a
+@item M-C-e
+Jump to the beginning or end of the current note entry
+(@code{notes-beginning-of-defun} and @code{notes-end-of-defun}).
+@kindex M-C-a
+@kindex M-C-e
+
+@item C-c C-k
+Copies the pseudo-URL for the current note into the kill-ring
+(@code{current-url-as-kill}).
+To link two entries, go to the target,
+ grab its URL with @kbd{C-c C-k},
+ go to where you want to make the link,
+ and yank the URL with @kbd{C-y}.
+@kindex C-c C-k
+
+@end table 
+
+Notes mode supports imenu,
+ if you have it bound to something
+ (I use @code{(global-set-key [down-mouse-3] 'imenu)}).
+@cindex imenu
+
+
+@node  Subject summary, Encryption, Getting around, Notes files
+@comment  node-name,  next,  previous,  up
+@subsection Subject summary
+
+It's often helpful to look at all
+ entries for a given subject
+@kbd{C-c C-s}
+ collects all entries with the subject of the current
+ entry in a new buffer
+ (@code{notes-summarize-subject}).
+@kindex C-c C-s
+@cindex Subject summary
+
+
+@node  Encryption, Useful conventions, Subject summary, Notes files
+@comment  node-name,  next,  previous,  up
+@subsection Encryption
+
+@cindex Encryption
+@cindex Decryption
+
+@c     - C-c C-e, C-c C-d encryption
+Notes occasionally contain private material.
+While Unix has strong services for file protection
+ (compared to other, say, more wide-selling operating systems),
+ in many systems root passwords are shared,
+ while other systems are vulnerable to physical compromise.
+In such systems,
+ properly used encryption is the best approach to security.
+
+Notes-mode encryption is based
+ Phill Zimmerman's PGP (Pretty Good Privacy)
+(see @file{http://www.mantis.co.uk/pgp/pgp.html})
+ and either
+ with Rick Campbell's
+ emacs interface, PAM (PGP Augmented Messaging)
+(from @file{ftp://h.gp.cs.cmu.edu/usr/rfb/pam/})
+ (note that as of January 1997, PAM is no longer at this ftp site
+ and appears to not be publicly available),
+ or LoPresti and Choi's mailcrypt
+(from @file{http://cag-www.lcs.mit.edu/mailcrypt/}).
+@cindex PGP
+@cindex Pretty good privacy
+@cindex PAM
+@cindex PGP Augmented Messaging
+@cindex mailcrypt
+
+@table @kbd
+@item C-c C-e
+Encrypt the current note
+(@code{notes-encrypt-note}).
+By default this function encrypts the whole entry.
+With a prefix argument,
+ only the part from the point to the end of the entry is encrypted.
+@kindex C-c C-e
+
+@item C-c C-d
+Decrypt the current note
+(@code{notes-decrypt-note}).
+@end table
+@kindex C-c C-d
+
+By default notes-mode determines your public key by looking 
+ up your @code{user-full-name} in your PGP keyring.
+You can override this default by setting
+ @code{notes-encryption-key-id}
+ to the desired key-id.
+@cindex key-id
+
+
+@node  Useful conventions,  , Encryption, Notes files
+@comment  node-name,  next,  previous,  up
+@subsection Useful conventions
+
+@c     - conventions
+@c date, 12-Jan-96 Friday
+@c Today
+@c Monday
+@c hierarchical subjects
+
+@cindex conventions
+@cindex mknew
+
+There are a number of conventions which can make notes-mode
+ easier to use.
+These conventions are a matter of personal taste,
+ of course.
+Do what works for you.
+
+First,
+ I find it helpful to keep the date of each notes-file at the top
+ of the file.
+This makes the file self-identifying
+ if the filename is lost.
+
+Second,
+ I find it useful to have the first entry of each file
+ have the same subject (perhaps ``Today'').
+This entry then links all notes together,
+ making it easy to go to yesterday and tomorrow.
+I keep a to-do list on this entry,
+ bringing the list forward each day.
+@cindex Today
+
+A third useful convention is to keep an
+ entry with the name based on the day of the week
+ in each file.
+Analogous to ``Today'', this entry links together
+ weeks.
+
+Notes-mode supports these conventions.
+When you make a new notes-file in emacs,
+ notes-mode searches for the preceding file.
+If it follows any of these conventions,
+ the new file is initialized appropriately.
+Currently
+ the approach to do this process
+ (in the program @file{mknew})
+ is fairly sensitive,
+ so it may not work in all cases.
+In particular,
+ the date convention works only on
+ for English-language dates.
+(If you use notes-mode with a non-English language,
+ let me know and I'll work with you to fix this limitation.)
+
+If you find other helpful conventions,
+ please let me know.
+Modifications to @file{mknew} to implement
+ new conventions are also invited.
+
+If you don't want to use these conventions,
+ or if you want to use different ones,
+ set the emacs variable notes-mode-initialization-program
+ to nil or the name of your initialization program.
+@cindex notes-mode-initialization-program
+
+
+@node  Notes indices, Notes-mode configuration, Notes files, Advanced Features
+@comment  node-name,  next,  previous,  up
+@section Notes indices
+
+@c - notes-index
+@c   - RET notes-index-follow-link
+@c   - o notes-index-link
+@c   - C-c C-s summarize subject
+
+Only two features of notes index mode haven't yet been described.
+First,
+ you can open any notes-file based on date
+ with @code{notes-index-link},
+ normally bound to @key{o}.
+@kindex o
+
+Second,
+ you can get a subject-summary
+ with @key{C-c C-s}
+ (@pxref{Subject summary}).
+The subject defaults to that of the current index line.
+@kindex C-c C-s
+
+
+@node  Notes-mode configuration,  , Notes indices, Advanced Features
+@comment  node-name,  next,  previous,  up
+@section Notes-mode configuration
+
+@cindex configuration
+@cindex .notesrc
+
+Several aspects of notes mode are particularly visible
+ to the user.
+Because I'm not a fascist,
+ a user can change most of these.
+
+Preferences are specified in @file{~/.notesrc}.
+This file lists things to change:
+
+@example
+# lines beginning with a hash are comments
+dir: ~/NOTES
+int_form: %Y%m
+@end example
+
+Currently, two things can be changed:
+
+@table @code
+@item dir
+Specifies the root of the notes directory hierarchy
+ (@pxref{The notes directories}).
+
+@item int_form
+Specifies the form of the intermediate directory.
+A limited subset of @code{strftime(3)}
+ formatting is allowed.
+@end table
+
+The subset of @code{strftime(3)} supported in @code{int_form} is:
+@table @code
+@item %Y
+The four-digit year.
+
+@item %y
+The two-digit year.
+
+@item %m
+A two-digit numeric month.
+
+@item %d
+A two-digit day.
+@end table
+
+In addition to @file{.notesrc},
+ there are a number of emacs-specific variables.
+These variables are documented in the file
+ @file{notes-variables.el}.
+
+
+
+@c ----------------------------------------------------------------------
+
+@node  History, Installation, Advanced Features, Top
+@comment  node-name,  next,  previous,  up
+@chapter History
+
+More about notes-mode than you wanted to know,
+and some thanks.
+
+@menu
+* Notes-mode history::          
+* Credits::                     
+* Changes::                     
+* Suggested features::                     
+@end menu
+
+@c history
+@c - genesis: minimal functionality: subject collection
+@c - Leviticus: indexing, urls
+@c - exodus: share with others
+@c - Deuteronomy: features are added
+
+
+@node  Notes-mode history, Credits, History, History
+@comment  node-name,  next,  previous,  up
+@section Notes-mode history
+
+Briefly,
+ I started keeping notes on-line shortly after I got a portable computer
+ in January, 1994.
+After a month-and-a-half of notes, I realized that
+ one does not live by grep alone,
+ so I started adding indexing facilities.
+
+In June of 1995
+ some other Ficus-project members started
+ keeping and indexing on-line notes
+ using other home-grown systems.
+After some discussion,
+ we generalized my notes-mode work and
+ they started using it.
+
+Over the next 18 months notes-mode grew.
+Finally, in April, 1996 I wrote documentation,
+ guaranteeing that innovation on notes-mode will now cease
+ or the documentation will become out of date.
+
+
+@node  Credits, Changes, Notes-mode history, History
+@comment  node-name,  next,  previous,  up
+@section Credits
+
+I (John Heidemann, <johnh@@isi.edu>)
+ started, documented, and currently maintain notes-mode.
+I take ultimate responsibility for the code,
+ especially for the ugly parts that I won't let others change.
+
+Ashvin Goel
+ <ashvin@@ficus.cs.ucla.edu>
+ has been a very enthusiastic notes-mode user and contributor.
+He is responsible for at least
+ the ideas behind @code{notes-summarize-subject}
+and the ideas and initial implementations of
+ some of the original generalization and modularity improvements,
+ @code{notes-follow-next-link} and @code{notes-follow-prev-link},
+ @code{notes-goto-index-entry},
+ programmed subject completion,
+ and
+ context-sensitive mouse-2 handling.
+In addition,
+ he is an invaluable second opinion about
+ what and how things should be done
+ (even if I don't always agree with him).
+
+Geoff Kuenning
+ <geoff@@ficus.cs.ucla.edu>
+ has been another enthusiastic notes-mode user and victim.
+He is responsible for
+ finding several bugs,
+ motivation for mouse-less operation,
+ comments about the documentation,
+ the day-of-week convention,
+ and an initial implementation and the idea of
+ multiple entries with the same subjects in a single notes-file.
+
+Ramesh Govindan <govindan@@isi.edu> did the xemacs port.
+
+Since it's release on Usenet in April 1996 several
+ other folks have contributed.
+Thanks to
+ David Weisman <weisman@@app1.osf.org>,
+ Martin L. Smith <martin@@ner.com>,
+ Jason Bastek <jason@@aai.com>,
+ Ulrich Herbst <Ulrich.Herbst@@t-systems.com>.
+See the next section (@xref{Changes}.) for details of their exploits.
+
+Thanks to Larry Ayers <layers@@marktwain.net>
+ for popularizing notes-mode with reviews in
+ the Linux Gazette
+ (at <http://www.linuxgazette.com/issue22/notes-mode.html> and
+ <http://www.linuxgazette.com/issue35/ayers.html>).
+
+@node  Changes, Suggested features, Credits, History
+@comment  node-name,  next,  previous,  up
+@section Changes
+
+For the bored:
+
+First semi-public release. 12-Jul-95: version 0.1
+ Shared a version with Ashvin and Geoff.
+
+Changed  6-Dec-95: version 0.3
+ Ashvin's changes for note traversal added (C-c C-p and C-c C-n now
+move to the prev/next note in note-mode).
+ URL parsing changed so that "localhost" is optional.
+
+Changed 19-Dec-95:  version 0.4
+ More robust prev/next code added, both to handle going back and
+forward in the middle of chains through the index file, and to handle
+back/forward in a single file.
+ URL parsing changed so that notes-goto-index-entry correctly handles
+lookups on notes names such as "252A".
+
+Changed 20-Dec-95: version 0.5.
+ Fixed a missing variable in notes-url.el.
+ Added a work-around to a bug in emacs-19.30's define-derived-mode.
+
+Changed 24-Dec-95: version 0.6.
+ Prev/next code re-re-written to be more robust.
+
+Changed 26-Dec-96:  version 0.7.
+ Bug fix release.
+
+Changed 23-Jan-96: version 0.8.
+ Initialization code added to set up a new note.
+New variable:  notes-bin-dir.
+
+ I'm skipping version 0.9 because I erroneously release version 0.1
+as version 0.9 (only on the web, not on Usenet).
+
+ I'm bumping from version "0" to version "1" since the code is has been
+in production use for more than a year by several people.  Minor
+numbers are the same.
+
+Changed 26-Mar-96: version 1.10.
+ Setup code completely re-written.
+ Several incompatible changes have been made:
+ - the lisp and Perl code must be installed via make install,
+not by copying.
+ - some data is specified in a .notesrc file; copy and modify sample.notesrc.
+ - several internal elisp changes.
+ - catsubject added (bound to C-cC-s):  collect all notes about the
+current subject.
+ - new notes-files are initialized with fields based on the prior
+day's notes; see mknew for details.
+ - daily_work is gone; mkall is rewritten to use .notesrc.
+
+Changed 29-Apr-96: version 1.11.
+ Real documentation.
+ Mknew caching added.
+
+Changed  9-Aug-96: version 1.12.
+ Added notesinit to do all setup for new users.
+
+Changed 24-Aug-96: version 1.13.
+ Minor documentation fixes.
+
+Changed 20-Dec-97: version 1.14.
+Autoconf support.
+
+Fontification of the index buffer is now pre-computed in perl
+other than done when the file is needed (in elisp with slow regular
+expressions).  2000-line index files are now 1-2 seconds rather than
+15-30 on a 100MHz Pentium.  If necessary (the
+pre-computed version isn't up-to-date) we fall back on the slower
+code.
+
+Related work improved (suggestion by David Weisman <weisman@@app1.osf.org>).
+
+Documentation improvement (problem found by Martin L. Smith
+<martin@@ner.com>).
+
+Installation improved (code by Jason Bastek <jason@@aai.com>).
+
+Bug in notes-index mode with subjects containing colons fixed (johnh).
+
+Encryption now supports mailcrypt.el.
+
+Support for emacs 20 (a small font-lock change).
+
+Changed  5-Jan-98: version 1.15.
+Bug in decryption for non-PAM users fixed
+ (suggestion by Kevin Davidson <tkld@@quadstone.com>).
+
+Y2K statement added
+ (suggestion by Kevin Davidson <tkld@@quadstone.com>).
+
+Pointer to mailcrypt added (as a supported encryption package).
+Problem pointed out by K. Ueda <kueda@@jupiter.qse.tohoku.ac.jp>.
+
+Changed  4-Nov-98: version 1.16.
+Bug in kill-ring handling of notes-old-underline-line
+ fixed by Tim Potter <timp@@jna.com.au>.
+Bug in whitespace handling after PGP encryption fixed by Tim Potter.
+Bugs in handling of entries with hash signs in their name fixed
+ (found by Tim Potter).
+Fontification of index buffer further improved
+ (mapcar is your friend).
+Xemacs support added based on code contributed by Ramesh Govindan.
+
+Changed 28-Feb-99: version 1.17:
+Improvement:  notes-electric-return now fixes up the prev/next links
+ of new entries (only).  Code contributed by
+ Takashi Nishimoto.
+
+Bug fix:  reversed options -batch and -q in configure.in to placate
+ XEmacs 20.0; changed notesinit to not downcase the pathname
+ (bugs found by Thierry Bezecourt).
+
+Clarification: Autofilling of new notes more clear in the manual (hopefully,
+ suggested by Solofo Ramangalahy).
+
+Bug fix:  a y2k bug in was found and fixed in mkindex.  Sigh.
+
+New:  Two mailing lists for notes-mode have been created:
+@file{notes-mode-announce@@heidemann.la.ca.us} and 
+@file{notes-mode-talk@@heidemann.la.ca.us}.
+Send the line ``subscribe notes-mode-announce''
+(or ``subscribe notes-mode-talk'')
+to @file{majordomo@@heidemann.la.ca.us}
+to join them.
+[@emph{These instructions are now superceeded; to subscribe, go to
+@file{http://www.heidemann.la.ca.us/mailman/listinfo/notes-mode-talk}
+and
+@file{http://www.heidemann.la.ca.us/mailman/listinfo/notes-mode-announce}.}]
+
+Changed  6-Oct-99: version 1.18:
+Bug fix:  handling of electric-prevnext is better when there are
+ existing prev/next links.
+Clarification: I added some pointers in the code to the installation
+ instructions.  (Apparently people can't RTF README.)
+
+Extension: mailcrypt-3.5.x suported including pgp, pgp5 and gpg.
+
+Changed (date 23-Dec-00): version 1.19:
+Bug fix (cosmetic): suppress comments in encrypted nodes.
+
+Install fixes from Kannan Varadhan: elisp directories changed on install.
+
+Added C-j as a synonym for RET in notes-mode to parallel C++ or perl mode.
+(Suggested by Fred Jaggi @file{jaggi@@rsn.hp.com}.)
+
+Outline-minor-mode support added and documented.
+(Suggested by Tim Carroll @file{tim@@boomboom.com}.)
+
+Bug/typo fixes in gpg support
+(Contributed by William A. Perkins @file{wa_perkins@@pnl.gov},
+with separate patches from Knut Anders Hatlen @file{kahatlen@@online.no}.)
+
+Installation improvements suggested by Christophe Troestler
+@file{Ch.Troestler@@linkline.be}:
+use install-info to update the info dir,
+warn users of --prefix that lisp files go elsewhere.
+
+Changed (date  1-Feb-01): version 1.20:
+Bug fix: missing file notes-first.el added to the distribution.
+(Bug found by Michael Totschnig @file{michaelt@@supernet.ca}.)
+
+Changed ( 5-Dec-01): version 1.21:
+(backed-out---didn't work with spaced URLs) 
+URL lookup now uses thing-at-point.
+
+Fix to make notes-mode work with emacs-21.1
+(Fix from Klaus Zeitler  @file{kzeitler@@lucent.com}.)
+
+Changed ( 3-Jan-02): version 1.22:
+Several bugs in @file{notesinit} for stricter Perl implementations
+(bug found by Paul Craven" @file{pcraven@@yorku.ca},
+and Kasper van Wijk @file{kasper@@acoustics.mines.edu})
+and to make it run cleanly more often.
+
+Notes-first now autoinitializes notes mode from emacs.
+(As instisted by rms, unfortunately about two years later than requested.)
+
+
+Changed (20-Feb-05): version 1.23:
+Outline mode is now forcebly turned on to avoid interactions
+with user's text-mode hooks
+(bug and fix from Nils Ackermann @file{nils@@nieback.de}).
+
+Install bug involving ordering of scripts and byte-compilation
+fixed (bug and fix from Mark Allman @file{mallman@@grc.nasa.gov}).
+
+Fix obscure bug in configure, reported by Klaus Zeitler @file{kzeitler@@lucent.com}.
+
+Fix for notes-summarize-subject when no subject is specified (bug and fix
+from Geoff Kuenning).
+
+Changed (14-Jan-06): version 1.24:
+
+install-info bug documented with the Debian install-info
+(bug reported by Aaron Falk @file{falk@@isi.edu}).
+
+Automatic date completion in new days is now done in the current
+locale, so it should now work for non-English languages.  Bug reported
+by Torsten Bronger @file{bronger@@physik.rwth-aachen.de}.
+
+Fixed a bug in mkindexcache, triggered by subjects with percent signs
+in them.  Bug reported by Philip Austin @file{paustin@@eos.ubc.ca}.
+
+We're a bit more robust about subjects, I hope.  Warnings should
+appear about embedded number signs, and leading spaces should be
+filtered.  Bug reported by Philip Austin @file{paustin@@eos.ubc.ca}.
+
+Notes-mode now dervies from indented-text-mode rather than
+paragraph-indent-text mode.  Unfortunatley this is not customizable
+because of limitations of define-derived-mode.  Change suggested by
+Aaron Falk @file{falk@@isi.edu}.
+
+Provide better hints about how to get started after installation or
+running notes-mode in emacs for the first time.
+
+In notes init, the default path for dir was the full path, not the tilde
+version of the path.  Now it defaults to using tidle for home
+directory.  Bug reported by Mark Allman @file{allman@@icir.org}.
+
+Changed (26-May-06): version 1.25:
+
+fixed a bug in the release tar.gz file that had a additional copies
+copy nested.
+
+Changed (30-Jun-08): version 1.26:
+
+Force unicode I/O in @file{mkindexcache} to fix highlighting mis-alignment
+when using emacs-21 with unicode subject lines.
+
+Changed mkprevnext and mkrawindex to optionally take the list of notes files
+to index from stdin rather than from the command line.  Yes, I finally
+have 4093 notes files, overflowing the Unix command line buffer.
+
+Changes notes-mode.el to put path in quotes, allowing spaces to appear in home directory names (bug fix from Ulrich Herbst).
+
+Added a suggested features section.
+
+Changed ( 8-Aug-08): version 1.27:
+
+Change I/O in @file{mkindexcache} to use locale (the sadly correct thing)
+rather than forcing utf-8 (the Righteous Path).
+Bug report from Geoff Kuenning, a man with an older Unix environment than I.
+
+Changed (20-Jun-10): version 1.28:
+
+Changed a regular expression in @file{notes-index-mode.el} that was 
+causing emacs-v23 (a pre-release version)
+to regular expression infinite recursion.
+
+Changed (2012-04-04): version 1.29
+
+(2011-08-23) Changed @code{run-hooks} to @code{run-mode-hooks}.
+Bug report from Geoff Kuenning.
+
+Changed some handling of PGP encryption to account for 
+some apparent API changes.
+
+(2012-04-04) Fixed encyrption to handle encrypting empty notes at the end 
+of buffers without going into an infinite loop.
+Clearly wrong code, but you have to ask this guy for why he tried:
+Bug report from Geoff Kuenning.
+
+
+@c ----------------------------------------------------------------------
+
+@node  Suggested features,  , Changes, History
+@comment  node-name,  next,  previous,  up
+@section Suggested features
+
+Features suggested by users but not yet implemented:
+
+21-Feb-08: (from Xavier Maillard): should support ``disconnected'' notes that
+are indexed but not date-based.
+
+21-Feb-08: (from John Heidemann): should switch all notes files to have an extension (maybe @file{.notes}).
+@c ----------------------------------------------------------------------
+
+@node  Installation, Keystroke index, History, Top
+@comment  node-name,  next,  previous,  up
+@chapter Installation
+
+@c FIXME: Out-of-date now that we install via package.el.
+
+To install notes-mode,
+
+@enumerate
+@item
+Unpack and extract the distribution
+(gunzip notes-mode-xxx.tar.gz; tar xvf notes-mode-xxx.tar; cd notes-mode-xxx).
+
+@item
+Run configure (./configure).
+
+@item
+Type ``make install''.
+@end enumerate
+
+(To control what's installed where, use --prefix=/where, or
+--with-lisp-dir=/where, --datadir=/where (for scripts),
+and --infodir=/where.)
+
+For each user:
+@enumerate
+@item
+Run notesinit
+@end enumerate
+
+If you have problems with paths being incorrect, please be aware that
+you @emph{cannot} run notes directly out of where you untar it.  The
+installation process customizes the programs for where things are on
+your system.
+Make sure you move out of the directory where you untarred it
+before running it.
+
+
+The most recent distribution of notes-mode 
+ is always available via
+ @file{http://www.isi.edu/~johnh/SOFTWARE/NOTES_MODE/}.
+
+
+@c ----------------------------------------------------------------------
+
+@node  Keystroke index, Concept index, Installation, Top
+@comment  node-name,  next,  previous,  up
+@unnumbered Keystroke index
+
+This index lists notes-mode keystrokes.
+
+@printindex ky
+
+
+@node  Concept index,  , Keystroke index, Top
+@comment  node-name,  next,  previous,  up
+@unnumbered Concept index
+
+This index lists notes-mode concepts.
+
+@printindex cp
+
+
+
+
+@contents
+@bye
+
+@c Geoff, make ispell support texinfo mode!
+@c
+@c  LocalWords:  texinfo setfilename settitle iftex finalout ifinfo DIR vskip
+@c  LocalWords:  titlepage pt filll dir urls prev defun dfn Yahoo yahoo com Jun
+@c  LocalWords:  alta Trademarked Sunone Grep agrep Nadia emph HTML's notesrc
+@c  LocalWords:  altavista julienne kbd RTN pxref musaphobic mkall cron crontab
+@c  LocalWords:  usr lib rawindex xref cC url imenu Phill PGP Campbell's ftp gp
+@c  LocalWords:  cmu rfb pam keyring mknew Apr int strftime cindex kindex grep
+@c  LocalWords:  isi ashvin geoff printindex ky cp wearables mit mantis co uk
+@c  LocalWords:  pgp html setchapternewpage XXX elisp cY cy cd RET Weisman cn
+@c  LocalWords:  reimplementation mode's Hyperbole's notesinit weisman app osf
+@c  LocalWords:  org ner Bastek jason aai Jul Ashvin's localhost catsubject Aug
+@c  LocalWords:  Autoconf Fontification perl mailcrypt LoPresti Choi's cag lcs
+@c  LocalWords:  Ramesh govindan xemacs tkld quadstone Ueda kueda jupiter qse
+@c  LocalWords:  tohoku ac jp Nov timp jna au mapcar gunzip xxx gz xvf xxx xxx
+@c  LocalWords:  datadir infodir untar
diff --git a/packages/notes-mode/notes-url.el b/packages/notes-mode/notes-url.el
new file mode 100644 (file)
index 0000000..407f644
--- /dev/null
@@ -0,0 +1,210 @@
+;;; notes-url.el --- Simplified url management routines for notes-mode
+
+;;; Copyright (C) 1994-1998,2012  Free Software Foundation, Inc.
+
+;; Author: <johnh@isi.edu>
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This code was originallly cribbed from w3.el
+;; by William M. Perry <wmperry@indiana.edu>,
+;; but has since been completely rewritten.
+;;
+;; Why don't I just call his code?  Because to use
+;; w3-follow-link I need to pull in at least 150k of w3.el
+;; and 150k of url.el, all just to open a file on the local
+;; computer.  Instead I've hacked his code down to the 3k
+;; needed for opening local files.
+
+;;; Code:
+
+(require 'notes-variables)
+(require 'notes-aux)
+
+(defvar notes-last-url nil
+  "Last URL interpreted.
+This record is useful for debugging.")
+
+;;;###autoload
+(defun notes-w3-url (url &optional where best-effort)
+  "Open a notes-url.  Handle simple URLs here, or call notes-w3-alternate-url.
+Takes the URL as an argument.  Optionally you specify
+WHERE the information should appear (either 'otherwindow or not,
+defaults to not).
+BEST-EFFORT causes notes-w3-url allows the tag portion of the URL to not
+match.  If there's no tag match, it looks for the nearest matching prefix.
+
+URLs optionally can begin with an URL: tag, which will be ignored.
+
+notes-w3-url handles only <file://localhost/...> (or <file:///...>) URLs.
+Other URLs it hands off to the routine in notes-w3-alternate-url
+for processing.  If you use w3-mode, then
+    (setq notes-w3-alternate-url 'w3-follow-link)
+will have w3 handle tough URLs."
+  (if (string-match "\\`[Uu][Rr][Ll]:" url)
+      (setq url (substring url 4)))
+  (if (not (string-match "\\`file://\\(localhost\\)?/\\(.*\\)\\'" url))
+      (if (string-match "none" url)
+         (error "Notes-mode can't follow URL <none>.")
+       (funcall notes-w3-alternate-url url where)) ;; now, with where! (emacs-20.4)
+    (let ((filetag (match-string 2 url))
+         fname tag count count-string)
+      ;; pick out the tag, if any
+      (if (string-match "\\`\\([^#]*\\)#\\([0-9]+\\)?\\(.*\\)\\'" filetag)
+         (setq fname (match-string 1 filetag)
+               count-string (match-string 2 filetag)
+               count (if count-string (string-to-number count-string) 1)
+               tag (match-string 3 filetag))
+       (setq fname filetag
+             count 1
+             tag nil))
+      ;; Hack---url's refering to notes-index files have different tags.
+      ;; Otherwise notes-goto-index-entry fails on subjects like "* 252A".
+      (if (and count-string tag (string-match "/index\\'" fname))
+         (setq tag (concat count-string tag)
+               count-string "1"
+               count 1))
+      (if (not (string-match "\\`~" fname))   ; non-~ fnames start at fs root
+         (setq fname (concat "/" fname)))
+      ;; open the file
+      (cond
+       ((equal where 'otherwindow) (find-file-other-window fname))
+       (t (find-file (expand-file-name fname))))
+      ;; handle the tag
+      (if tag
+         (notes-w3-url-tag tag best-effort)
+       t))))
+
+(defun notes-w3-url-tag-backup (tag)
+  "Strip the last ``part'' off of TAG."
+  (let ((result)
+       (separators " /\t.:")
+       (buf (get-buffer-create " *notes-w3-url-tag-backup")))
+    (with-current-buffer buf
+      (erase-buffer)
+      (insert tag)
+      (goto-char (point-max))
+      (skip-chars-backward (concat "^" separators))
+      (skip-chars-backward separators)
+      (delete-region (point) (point-max))
+      (setq result (buffer-string)))
+    (kill-buffer buf)
+    result))
+
+(defun notes-w3-url-tag (tag best-effort)
+  "Find the TAG in the current buffer according to MODE.
+BEST-EFFORT is either t (do prefix matching),
+nil find the tag exactly,
+or 'searching (used internally)."
+  (cond
+   ((not tag) nil)
+   ((and (string= tag "") (eq best-effort 'searching)) nil)
+   (t
+    (goto-char (point-min))
+    (if (re-search-forward
+        (concat "^" (regexp-quote tag)
+                (if (not (eq best-effort 'searching))
+                    (if (eq major-mode 'notes-index-mode)
+                        ": "
+                      "$")))
+        (point-max) t count)
+       t  ;; hit
+      (if (not best-effort)
+         (error "Cannot find tag ``%s'' in %s." tag fname))
+      (notes-w3-url-tag (notes-w3-url-tag-backup tag) 'searching)))))
+  
+
+(defun notes-w3-pass-through-alternate-url (url &optional where)
+  "Pass a click event through to the old binding for notes-w3-url.
+Try this combination:
+  (add-hook 'notes-mode-load-hooks
+            (function (lambda ()
+                        (define-key notes-mode-map [mouse-2]
+                          'notes-w3-follow-link-mouse)
+                        (setq notes-w3-alternate-url
+                          'notes-w3-my-alternate-url))))"
+  (let ((event last-input-event))
+    (funcall (lookup-key
+             (current-global-map)
+             (vector (car event)))
+            event nil)))
+
+;;;###autoload
+(defun notes-w3-follow-link (pt &optional where)
+  "* Follow the URL at the point.
+Takes a PT to look at and a WHERE to open the URL ('otherwindow or nil).
+This code works hard to recognize URLs based on context information.
+URLs can be quoted by whitespace, beginning and end of lines,
+or the official < and >.
+
+As a special case we also recognize (and skip) the text \"prev:\"
+and \"next:\" before the URL.  Notes-mode uses these fields to link
+entries."
+  (interactive "d")
+  (let*
+      ((whitespace-regexp  "[ \t\n]")
+       (quote-regexp whitespace-regexp)
+       start end direction)
+    (save-excursion
+      ;; If we're on the URL header, skip over it so the next search works.
+      (if (looking-at "[<A-Za-z]*:")
+         (skip-chars-forward "<A-Za-z:"))
+      ;; First look backwards to whitespace or beginning of line
+      ;; followed by a url header "asdf:".
+      (if (re-search-backward "[ \t\n][^ \t\n]+:" (line-beginning-position) 1)
+         (forward-char 1)          ; whitespace bound
+       (setq quote-regexp "\n"))   ; eoln bound
+      ;; Handle the common case of next/prev pointers.
+      ;; If we're on one, skip to the <> quoted URL which presumably
+      ;; follows.  (This hack is to support a guy who doesn't use
+      ;; the mouse and so looks up urls at the beginning of the line.)
+      (if (looking-at "\\(prev\\|next\\):")
+         (skip-chars-forward "^<" (line-end-position)))
+      ;; Check for a quoting character.
+      (cond
+       ((equal (char-after (point)) ?<)
+       (progn
+         (setq quote-regexp ">")
+         (forward-char 1)))
+       ((equal (char-after (point)) ?\")
+       (progn
+         (setq quote-regexp "\"")
+         (forward-char 1))))
+      ;; Remember start of url.
+      (setq start (point))
+      ;; Search for end of url.
+      (if (re-search-forward quote-regexp (line-end-position) 1)
+         (forward-char -1))
+      (setq end (point))
+      ;; Interpret it (outside the save-excursion so we can go
+      ;; to places in the same buffer).
+      (setq notes-last-url (buffer-substring start end)))
+    (notes-w3-url notes-last-url where)))
+
+;;;###autoload
+(defun notes-w3-follow-link-mouse (e)
+  "* Follow the URL where the mouse is."
+  (interactive "e")
+  (mouse-set-point e)
+  (notes-w3-follow-link (point)
+                       (if notes-w3-follow-link-mouse-other-window
+                           'otherwindow
+                         nil)))
+
+(provide 'notes-url)
+;;; notes-url.el ends here
diff --git a/packages/notes-mode/notes-variables.el b/packages/notes-mode/notes-variables.el
new file mode 100644 (file)
index 0000000..de141c5
--- /dev/null
@@ -0,0 +1,154 @@
+;;; notes-variables.el --- Configuration variables for notes-mode
+
+;; Copyright (C) 1994-2000,2012  Free Software Foundation, Inc.
+
+;; Author: <johnh@isi.edu>
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;
+;; This file lists all parameters you might wish to change in
+;; notes{-index,}-mode.  The best way to handle this in your
+;; .emacs file is to do
+;;     (require 'notes-variables)
+;;     (setq your-variable-to-change 'your-new value)
+;;
+
+;;; Code:
+
+;; xxx: if part of emacs, this should be probably be set to exec-directory (?)
+(defconst notes-utility-dir (file-name-directory load-file-name)
+  "Location of notes utility programs.")
+
+;;
+;; Notice:  several notes parameters are defined in your
+;; ~/.notesrc file.  These are not specified here.
+;; See mkconfig for details.
+;; We fetch them here.
+;;
+;; To make this fast, we cache the configuration in a .notesrc.el
+;; file.  We only have to invoke mkconfig when that file is out-of-date.
+;; This optimization is very important because notes-variables is
+;; required every time emacs is started.
+;;
+(save-current-buffer
+  (if (null (file-exists-p (expand-file-name "mkconfig" notes-utility-dir)))
+      (error "Notes-mode is incorrectly installed."))
+  (let*
+      ((source-file (expand-file-name "~/.notesrc"))
+       (cache-file (expand-file-name "~/.notesrc.el")))
+    (if (and
+        (not (file-exists-p source-file))
+        (not noninteractive))
+       (progn
+         (require 'notes-first)
+         (notes-first-use-init)))
+    (with-temp-buffer
+      (if (and ;; Requirements for a valid cache-file.
+           (file-exists-p cache-file)
+           (if (file-exists-p source-file)
+               (file-newer-than-file-p cache-file source-file)
+             t)
+           (file-newer-than-file-p
+            cache-file (expand-file-name "mkconfig" notes-utility-dir)))
+          (insert-file-contents cache-file) ;; Cache is up-to-date.
+        ;; Otherwise, refresh the cache.
+        (call-process (expand-file-name "mkconfig" notes-utility-dir)
+                      nil t nil "elisp")
+        (write-region (point-min) (point-max) cache-file)
+        (set-file-modes cache-file #o644)) ;; Protect it => mode 0644.
+      (eval-buffer))))
+
+;; notes-int-glob and notes-file-glob should have been set in ~/.notesrc.el.
+(add-to-list 'auto-mode-alist
+             (cons
+              ;; FIXME: auto-mode-alist actually takes a regexp, not a glob.
+              ;; The default globs happen to fall within the intersection of
+              ;; regexps and globs, but we shouldn't rely on it!
+              (concat notes-int-glob "/" notes-file-glob ".?\\'")
+              'notes-mode))
+
+;;; xxx: most of these should use defcustom or something similar, I presume.
+(defvar notes-w3-alternate-url 'browse-url
+  "* A function to call when notes-w3-url cannot handle a complex URL.
+It now goes through the Emacs `browse-url' package,
+but you could also set it manually (say, to w3-fetch).")
+
+(defvar notes-use-font-lock t
+  "* Enable notes fontification.")
+
+(defvar notes-use-outline-mode t
+  "* Enable `outline-minor-mode' in all notes buffers?")
+
+(defvar notes-index-fontify-dates nil
+  "* Fontify dates in notes-index-mode.
+Turning this off for large notes-index's can improve performance.")
+
+(defvar notes-bold-face 'notes-bold-face
+  "* Face to use for notes-index-mode and notes-mode subjects.
+The default face is copied from 'bold.")
+
+(defvar notes-font-lock-keywords
+  '(("^\\* .*$" . notes-bold-face)
+    ("^\\-+$" . notes-bold-face)
+    ;; ("^[0-9]+\\-[A-Za-z]+\\-[0-9]+ [A-Za-z]+$" . font-lock-bold-face)
+    ;; NEEDSWORK:  should also highlight URLs, maybe?
+   )
+  "* Font-lock keywords for notes mode.")
+
+(defvar notes-index-font-lock-keywords
+  '(("^[^:]*:" . notes-bold-face)
+    ("\\<[0-9]*\\>" . mouse-face)
+   )
+  "* Font-lock keywords for notes-index mode.")
+
+(defvar notes-mode-complete-subjects t
+  "* Enable subject completion in notes mode?")
+
+(defvar notes-w3-follow-link-mouse-other-window t
+  "* Should notes-w3-follow-link-mouse open another window?")
+
+(defvar notes-subject-table nil
+  "List of notes-subjects needed for subject completion.
+Reloaded by loading the notes-index file.")
+
+(defvar notes-mode-initialization-program "mknew"
+  "Program to run to initialize a new notes file.  Must be in notes-bin-dir.
+If nil, no initialization is done.")
+
+(defvar notes-encryption-key-id nil
+  "Keyid of PGP key for the current user.
+Useful if your \\[user-full-name] doesn't match a unique key.
+Should have a leading 0x.")
+
+(defvar notes-electric-prevnext 2
+  "Amount of electricity in prevnext for notes-mode.
+nil: don't auto-update anything.
+1: update prevnext, but don't autosave the old buffer
+2: update prevnext and autosave the old buffer.")
+
+(if (featurep 'xemacs)
+    (require 'notes-xemacs)
+  (require 'notes-emacs))
+
+(defvar notes-platform-inited nil
+  "Have we inited our platform (XEmacs/Emacs)?")
+
+(run-hooks 'notes-variables-load-hooks)
+(provide 'notes-variables)
+;;; notes-variables.el ends here
diff --git a/packages/notes-mode/notes-xemacs.el b/packages/notes-mode/notes-xemacs.el
new file mode 100644 (file)
index 0000000..a3cdfa3
--- /dev/null
@@ -0,0 +1,47 @@
+;;; notes-xemacs.el --- XEmacs compatibility functions
+
+;;; Copyright (C) 1998,2012  Free Software Foundation, Inc.
+
+;; Author: <johnh@isi.edu>
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;; Code:
+
+(defun notes-platform-bind-mouse (map generic-key fn)
+  "Map from Emacs symbols to XEmacs for notes-mode (sigh)."
+  (let
+      ((xemacs-key
+       (cond
+        ((eq generic-key 'mouse-2) [(button2)])
+        ((eq generic-key 'S-mouse-2) [(shift button2)]))))
+    (define-key map xemacs-key fn)))
+
+(defun notes-platform-init ()
+  "Init platform-specific stuff for notes-mode."
+  (if notes-platform-inited
+      t
+    (setq notes-platform-inited t)
+    (make-face notes-bold-face)
+    (if (not (face-differs-from-default-p notes-bold-face))
+           (copy-face 'bold notes-bold-face))
+
+    ))
+
+(provide 'notes-xemacs)
+;;; notes-xemacs.el ends here
diff --git a/packages/notes-mode/notesinit b/packages/notes-mode/notesinit
new file mode 100755 (executable)
index 0000000..ab8eb47
--- /dev/null
@@ -0,0 +1,200 @@
+#!/usr/bin/perl -w
+
+#
+# notesinit
+# Copyright (C) 1996-2002,2012  Free Software Foundation, Inc.
+# $Id: notesinit,v 1.12 2006/01/14 22:52:56 johnh Exp $
+#
+
+sub usage {
+    print STDERR <<END;
+usage: $0 [-D]
+
+This program sets up notes mode for the first time.
+It typically runs interactively.
+
+Options:
+    -D     use all defaults (also turns off prompting)
+END
+    exit 1;
+}
+
+require 5.000;
+use strict;
+use Getopt::Long;
+
+my(%opts);
+&GetOptions(\%opts, qw(D));
+&usage if ($#ARGV >= 0 && $ARGV[0] eq '-?');
+my($use_defaults) = defined($opts{'D'});
+
+my($PERL) = $^X;  # location of perl executable
+
+
+use POSIX;
+BEGIN { unshift(@INC, $ENV{'NOTES_BIN_DIR'}); };
+use NotesVars;
+use strict;
+
+
+sub query {
+    my($lc) = 1;
+    if ($_[0] eq '-nolc') {
+       $lc = undef;
+       shift @_;
+    };
+    my($expl, $query, $valid_regexp, $default) = @_;
+    return $default if ($use_defaults);
+    print $expl;
+    my($a);
+    for (;;) {
+        print $query;
+        $a = <>;
+       chomp $a;
+       $a = lc($a) if ($lc);
+        return $default if ($a eq '');
+        return $a if ($a =~ /$valid_regexp/);
+       print "I didn't understand your answer `$a'.\n";
+    };
+}
+
+my($expl);
+$expl =  <<END;
+notesinit will set up notes-mode for the first time.
+
+What is notes mode?  Texinfo documentation should be installed on your
+system.  Documentation is also available on the web at
+<http://www.isi.edu/~johnh/SOFTWARE/NOTES_MODE/>.  Everything you will
+be asked here is discussed in greater detail in the documentation.
+
+END
+
+my($home_dir) = ((getpwuid($<))[7]);
+my($def_choices, $def) = ('(Y/n)', 'y');
+if (-f "$home_dir/.notesrc") {
+    die "$0: will not override existing .notesrc with -D option.\n"
+       if ($use_defaults);
+    ($def_choices, $def) = ('(y/N)', 'n');
+    print "WARNING:  you already appear to have notes configured.\n\n"
+};
+
+my($a) = query($expl, "Do you want to set up notes mode now $def_choices? ", '(y|n)', $def);
+if ($a ne 'y') {
+    print "\nnotesinit exited.\n\n";
+    exit 1;
+};
+
+$expl = <<END;
+
+Notes are stored in two-level hierarchy of directories.
+For example:
+~/NOTES/199603/960329
+               ^^^^^^-- a notes file (the date, in YYMMDD)
+        ^^^^^^--------- one subdirectory per month (form: YYYYMM)
+  ^^^^^---------------- the parent directory of everything
+
+END
+$::notes{dir} = query("-nolc", $expl, "What should the parent directory be (default: ~/NOTES)? ", '.', '~/NOTES');
+# fix ~  (in honor of Cliffette's "yes, I have no tilde")
+$::notes{dir_notilde} = $::notes{dir};
+$::notes{dir_notilde} =~ s@^~/@$home_dir/@;
+$::notes{dir} =~ s@^$home_dir/@~/@;
+
+
+my($now) = time;
+my($today_pathname) = epoch_to_pathname($now);
+
+$expl = <<END;
+
+notesinit can now set-up your environment for notes.
+It will take the following steps:
+
+0. set up your .notesrc
+1. create $::notes{dir}
+2. create a sample note for today ($today_pathname)
+3. index the default note
+4. set up a crontab entry to re-index notes at 4am every morning
+    (by running mkall)
+
+END
+($def_choices, $def) = ('(M/d/s)', 'm');
+($def_choices, $def) = ('(m/D/s)', 'd') if (-f "$home_dir/.notesrc");
+my($go) = query($expl, "Make these changes, describe the changes, or stop $def_choices? ", '[mds]', $def);
+exit 1 if ($go eq 's');
+
+sub commands {
+    my($expl, $cmd) = @_;
+    print $expl if (!$use_defaults);
+    if ($go eq 'm') {
+       system($cmd);
+    } else {
+       print "$cmd\n";
+    };
+}
+
+#
+# Ok, the code below is less-than-ideal.
+# It's somewhat silly to have Perl output the shell commands
+# rather than just "do it".
+# The reason is that we to allow the user to look at what's being done.
+#
+
+$expl = "\n### changes begin here\n" . 
+    "\n### 0. set up your .notesrc\n";
+commands($expl, "cat >$home_dir/.notesrc <<END
+dir: $::notes{dir}
+END
+");
+
+$expl = "\n### 1. creating $::notes{dir}\n";
+commands($expl, "mkdir -p $::notes{dir_notilde};\nchmod 0700  $::notes{dir_notilde}\n");
+
+my($heading) = strftime_epoch("%d-%b-%y %A", $now);
+my($underline) = "-" x length($heading);
+$expl = "\n### 2. create a sample note for today ($today_pathname)\n";
+commands($expl, "mkdir -p `dirname $today_pathname`;\n cat >$today_pathname <<END
+
+$heading
+$underline
+
+* Today
+-------
+
+to do list goes here?
+
+
+* Environment/notes
+-------------------
+
+Set up notes with notesinit.
+
+(To read the manual, run   info notes-mode .)
+
+END
+");
+
+my($mkall) = $PERL . " " . $::notes{bin_dir} . "/mkall";
+my($crontab_entry) = "0 4 * * * $mkall";
+
+$expl = "\n### 3. index the default note\n";
+commands($expl, $mkall);
+
+$expl = "\n### 4. set up a crontab entry to re-index notes at 4am every morning\n";
+my($tmpfile) = "$home_dir/notesinit.$$~";
+# this whole touch thing is to avoid leaving a globally writable crontab
+commands($expl, "touch $tmpfile;
+chmod 0600 $tmpfile;
+echo 'If you do not have a crontab, errors about not being able to open a cron table can be ignored.';
+crontab -l | sed 's/^\\(.*\\/mkall\\)\$/# \\1/' >>$tmpfile;
+echo '$crontab_entry' >>$tmpfile;
+" . $::notes{bin_dir} . "/setcrontab $tmpfile
+rm -f $tmpfile");
+
+print "\n### changes end here\n" if (!$use_defaults);
+
+print "\nYou have elected to have the changes DESCRIBED but not made.\n" .
+       "To make the changes yourself, run the commands between\n" .
+       "\"changes begin here\" and \"changes end here\".\n"
+       if ($go eq 'd');
+
+exit 0;
diff --git a/packages/notes-mode/release b/packages/notes-mode/release
new file mode 100644 (file)
index 0000000..57432cb
--- /dev/null
@@ -0,0 +1 @@
+1.30
diff --git a/packages/notes-mode/sample.notesrc b/packages/notes-mode/sample.notesrc
new file mode 100755 (executable)
index 0000000..68556b9
--- /dev/null
@@ -0,0 +1,16 @@
+
+dir: ~/NOTES
+# the root of the document tree
+
+int_form: %Y%m
+# strftime(3) format for intermediate directories
+# Only a subset of strftime is supported:
+#      %Y  four-digit year
+#      %y  two digit year w/leading zeros
+#      %m  two digit numeric month w/leading zeros
+#      %d  two digit day w/leading zeros
+
+# XXX: Currently, file_form cannot be changed.
+# file_form: %y%m%d
+# strftime(3) format for notes files directories
+
diff --git a/packages/notes-mode/setcrontab b/packages/notes-mode/setcrontab
new file mode 100755 (executable)
index 0000000..c811307
--- /dev/null
@@ -0,0 +1,42 @@
+#!/bin/sh
+
+#
+# setcrontab
+# Copyright (C) 1996,2012  Free Software Foundation, Inc.
+# $Id: setcrontab,v 1.2 2002/01/03 04:35:18 johnh Exp $
+#
+
+usage () {
+       cat <<END
+usage: $0 newcrontabfile
+
+Sets the users crontab to whatever's given in stdin.
+Works around the dumb (only interactive) crontab -e interface.
+END
+       #' 
+}
+
+TMP=/tmp
+FE=$TMP/$$.fakeeditor
+NCT=$1
+
+trap 'rm -f $FE $NCT; exit 1' 1 2 15
+
+# stdin to the crontab
+
+cat >$FE <<END
+#!/bin/sh
+cat $NCT >\$1
+exit 0
+END
+
+chmod 0700 $FE
+EDITOR=$FE
+VISUAL=$FE
+export EDITOR VISUAL
+
+crontab -e
+
+rm -f $FE $NCT
+exit 0
+
diff --git a/packages/num3-mode/num3-mode.el b/packages/num3-mode/num3-mode.el
new file mode 100644 (file)
index 0000000..b890c89
--- /dev/null
@@ -0,0 +1,149 @@
+;;; num3-mode.el --- highlight groups of digits in long numbers  -*- lexical-binding: t -*-
+
+;; Copyright (C) 2012 Free Software Foundation, Inc.
+
+;; Author: Felix Lee <felix8a@gmail.com>, Michal Nazarewicz <mina86@mina86.com>
+;; Maintainer: Michal Nazarewicz <mina86@mina86.com>
+;; Keywoards: faces, minor-mode
+;; Version: 1.1
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Num3 is a minor mode that makes long numbers more readable by
+;; highlighting groups of 3 (customisable) decimal digits or 4 hex
+;; digits when font-lock is on.  Highlighting alternates between two
+;; faces that can be customised.
+
+;;; Usage:
+
+;;     M-x num3-mode           toggle for current buffer.
+;;     M-x global-num3-mode    toggle for all buffers.
+;;
+;; Or add the following to your ~/.emacs file:
+;;     (load "path/to/num3")
+;;     (global-num3-mode)
+
+;;; Code:
+
+(defgroup num3 nil
+  "Num3 is a minor mode that makes long numbers more readable by
+highlighting groups of decimal digits or 4 hex digits when
+font-lock is on."
+  :group 'text)
+
+(defcustom num3-group-size 3
+  "Number of digits to group in decimal numbers.")
+
+(defcustom num3-threshold 5
+  "Number must be at least that long to start highlighting.")
+
+(defface num3-face-odd
+  '((t))
+  "Face to add for odd groups of digits."
+  :group 'num3)
+
+(defface num3-face-even
+  '((t :underline t :weight bold :background "#eeeeee"))
+  "Face to add for even groups of digits.
+The default face uses redundant signaling, because this is in
+addition to any other font-lock highlighting."
+  :group 'num3)
+
+;;; Implementation:
+
+;;;###autoload
+(define-minor-mode num3-mode
+  "Toggle num3 minor mode in the current buffer.
+Num3 minor mode makes long numbers more readable by highlighting
+groups of digits when font-lock mode is on.
+
+If a number is longer than `num3-threshold', the mode will split
+it into a group of `num3-group-size' (if number is decimal) or
+4 (if number is hexadecimal) digits.  Hexadecimal number is
+detected as one starting with 0x, 0X or #.
+
+With decimal numbers, fractions are recognised as well and
+grouped from the beginning rathar then from end.  For instance,
+with group size of 3, a number \"12345.12345\" will be split into
+groups as follows: \"12|345.123|45\".  Fractions without integer
+part are also recognised, eg. \".12345\".
+
+The groups are highlighted alternately using `num3-face-odd' and
+`num3-face-even' faces.  `num3-face-odd' face (which is empty by
+default) is the one used for the group closest to the decimal point,
+ie. groups are counted starting with one outwards from the (place
+where) decimal point (would be) is."
+  nil " num3" nil
+  (if num3-mode
+      (unless (assoc 'num3--matcher font-lock-keywords)
+        (font-lock-add-keywords nil '(num3--matcher) 'append))
+    (font-lock-remove-keywords nil '(num3--matcher)))
+  (when font-lock-mode
+    (font-lock-fontify-buffer)))
+
+;;;###autoload
+(define-globalized-minor-mode global-num3-mode num3-mode num3-mode)
+
+(defconst num3--number-re
+  (concat    "\\(?:0[xX]\\|#\\)\\([0-9a-fA-F]+\\)"  ; 1 = hexadecimal
+          "\\|\\([0-9]+\\)"                         ; 2 = decimal
+          "\\|\\.\\([0-9]+\\)"))                    ; 3 = fraction
+
+(defun num3--matcher (lim)
+  "Function used as a font-lock-keywoard handler used in `num3-mode'.
+Performs fontification of numbers from point to LIM."
+  (save-excursion
+    (while (re-search-forward num3--number-re lim t)
+      (num3--int  (match-beginning 1) (match-end 1) 4)
+      (num3--int  (match-beginning 2) (match-end 2) num3-group-size)
+      (num3--frac (match-beginning 3) (match-end 3) num3-group-size)))
+  nil)
+
+(defun num3--int (lo hi n)
+  "Highlight groups of digits in a long number.
+LO and HI arguments specify the range where the number is
+located.  If the length of that region exceeds `num3-threshold',
+the function will split it into groups of N digits and fontify
+tham alternately using `num3-face-odd' and `num3-face-even'
+faces.  Grouping is done from the end, eg. (12)(345)."
+  (when (and lo (>= (- hi lo) num3-threshold))
+    (let (even)
+      (while (< lo hi)
+        (num3--put even (max lo (- hi n)) hi)
+        (setq hi (- hi n) even (not even))))))
+
+(defun num3--frac (lo hi n)
+  "Highlight groups of digits in a long number.
+LO and HI arguments specify the range where the number is
+located.  If the length of that region exceeds `num3-threshold',
+the function will split it into groups of N digits and fontify
+tham alternately using `num3-face-odd' and `num3-face-even'
+faces.  Grouping is done from the beginning, eg. (123)(45)."
+  (when (and lo (>= (- hi lo) num3-threshold))
+    (let (even)
+      (while (< lo hi)
+        (num3--put even lo (min hi (+ lo n)))
+        (setq lo (+ lo n) even (not even))))))
+
+(defun num3--put (even lo hi)
+  "Add font lock text property to highlight a single group of digit.
+Use `num3-face-odd' if EVEN is nil and `num3-face-even' if EVEN is
+non-nil.  The region the face is set to is from LO to HI."
+  (font-lock-append-text-property lo hi 'face
+                                  (if even 'num3-face-even 'num3-face-odd)))
+
+(provide 'num3-mode)
+;;; num3-mode.el ends here
diff --git a/packages/oauth2/oauth2.el b/packages/oauth2/oauth2.el
new file mode 100644 (file)
index 0000000..64962bf
--- /dev/null
@@ -0,0 +1,219 @@
+;;; oauth2.el --- OAuth 2.0 Authorization Protocol
+
+;; Copyright (C) 2011-2013 Free Software Foundation, Inc
+
+;; Author: Julien Danjou <julien@danjou.info>
+;; Version: 0.9
+;; Keywords: comm
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Implementation of the OAuth 2.0 draft.
+;;
+;; The main entry point is `oauth2-auth-and-store' which will return a token
+;; structure. This token structure can be then used with
+;; `oauth2-url-retrieve-synchronously' to retrieve any data that need OAuth
+;; authentication to be accessed.
+;;
+;; If the token needs to be refreshed, the code handles it automatically and
+;; store the new value of the access token.
+
+;;; Code:
+
+(eval-when-compile (require 'cl))
+(require 'plstore)
+(require 'json)
+(require 'url-http)
+
+(defun oauth2-request-authorization (auth-url client-id &optional scope state redirect-uri)
+  "Request OAuth authorization at AUTH-URL by launching `browse-url'.
+CLIENT-ID is the client id provided by the provider.
+It returns the code provided by the service."
+  (browse-url (concat auth-url
+                      (if (string-match-p "\?" auth-url) "&" "?")
+                      "client_id=" (url-hexify-string client-id)
+                      "&response_type=code"
+                      "&redirect_uri=" (url-hexify-string (or redirect-uri "urn:ietf:wg:oauth:2.0:oob"))
+                      (if scope (concat "&scope=" (url-hexify-string scope)) "")
+                      (if state (concat "&state=" (url-hexify-string state)) "")))
+  (read-string "Enter the code your browser displayed: "))
+
+(defun oauth2-request-access-parse ()
+  "Parse the result of an OAuth request."
+  (goto-char (point-min))
+  (when (search-forward-regexp "^$" nil t)
+    (json-read)))
+
+(defun oauth2-make-access-request (url data)
+  "Make an access request to URL using DATA in POST."
+  (let ((url-request-method "POST")
+        (url-request-data data)
+        (url-request-extra-headers
+         '(("Content-Type" . "application/x-www-form-urlencoded"))))
+    (with-current-buffer (url-retrieve-synchronously url)
+      (let ((data (oauth2-request-access-parse)))
+        (kill-buffer (current-buffer))
+        data))))
+
+(defstruct oauth2-token
+  plstore
+  plstore-id
+  client-id
+  client-secret
+  access-token
+  refresh-token
+  token-url
+  access-response)
+
+(defun oauth2-request-access (token-url client-id client-secret code &optional redirect-uri)
+  "Request OAuth access at TOKEN-URL.
+The CODE should be obtained with `oauth2-request-authorization'.
+Return an `oauth2-token' structure."
+  (when code
+    (let ((result
+           (oauth2-make-access-request
+            token-url
+            (concat
+             "client_id=" client-id
+             "&client_secret=" client-secret
+             "&code=" code
+             "&redirect_uri=" (url-hexify-string (or redirect-uri "urn:ietf:wg:oauth:2.0:oob"))
+             "&grant_type=authorization_code"))))
+      (make-oauth2-token :client-id client-id
+                         :client-secret client-secret
+                         :access-token (cdr (assoc 'access_token result))
+                         :refresh-token (cdr (assoc 'refresh_token result))
+                         :token-url token-url
+                         :access-response result))))
+
+;;;###autoload
+(defun oauth2-refresh-access (token)
+  "Refresh OAuth access TOKEN.
+TOKEN should be obtained with `oauth2-request-access'."
+  (setf (oauth2-token-access-token token)
+        (cdr (assoc 'access_token
+                    (oauth2-make-access-request
+                     (oauth2-token-token-url token)
+                     (concat "client_id=" (oauth2-token-client-id token)
+                             "&client_secret=" (oauth2-token-client-secret token)
+                             "&refresh_token=" (oauth2-token-refresh-token token)
+                             "&grant_type=refresh_token")))))
+  ;; If the token has a plstore, update it
+  (let ((plstore (oauth2-token-plstore token)))
+    (when plstore
+      (plstore-put plstore (oauth2-token-plstore-id token)
+                   nil `(:access-token
+                         ,(oauth2-token-access-token token)
+                         :refresh-token
+                         ,(oauth2-token-refresh-token token)
+                         :access-response
+                         ,(oauth2-token-access-response token)
+                         ))
+      (plstore-save plstore)))
+  token)
+
+;;;###autoload
+(defun oauth2-auth (auth-url token-url client-id client-secret &optional scope state redirect-uri)
+  "Authenticate application via OAuth2."
+  (oauth2-request-access
+   token-url
+   client-id
+   client-secret
+   (oauth2-request-authorization
+    auth-url client-id scope state redirect-uri)
+   redirect-uri))
+
+(defcustom oauth2-token-file (concat user-emacs-directory "oauth2.plstore")
+  "File path where store OAuth tokens."
+  :group 'oauth2
+  :type 'file)
+
+(defun oauth2-compute-id (auth-url token-url resource-url)
+  "Compute an unique id based on URLs.
+This allows to store the token in an unique way."
+  (secure-hash 'md5 (concat auth-url token-url resource-url)))
+
+;;;###autoload
+(defun oauth2-auth-and-store (auth-url token-url resource-url client-id client-secret &optional redirect-uri)
+  "Request access to a resource and store it using `plstore'."
+  ;; We store a MD5 sum of all URL
+  (let* ((plstore (plstore-open oauth2-token-file))
+         (id (oauth2-compute-id auth-url token-url resource-url))
+         (plist (cdr (plstore-get plstore id))))
+    ;; Check if we found something matching this access
+    (if plist
+        ;; We did, return the token object
+        (make-oauth2-token :plstore plstore
+                           :plstore-id id
+                           :client-id client-id
+                           :client-secret client-secret
+                           :access-token (plist-get plist :access-token)
+                           :refresh-token (plist-get plist :refresh-token)
+                           :token-url token-url
+                           :access-response (plist-get plist :access-response))
+      (let ((token (oauth2-auth auth-url token-url
+                                client-id client-secret resource-url nil redirect-uri)))
+        ;; Set the plstore
+        (setf (oauth2-token-plstore token) plstore)
+        (setf (oauth2-token-plstore-id token) id)
+        (plstore-put plstore id nil `(:access-token
+                                      ,(oauth2-token-access-token token)
+                                      :refresh-token
+                                      ,(oauth2-token-refresh-token token)
+                                      :access-response
+                                      ,(oauth2-token-access-response token)))
+        (plstore-save plstore)
+        token))))
+
+(defun oauth2-url-append-access-token (token url)
+  "Append access token to URL."
+  (concat url
+          (if (string-match-p "\?" url) "&" "?")
+          "access_token=" (oauth2-token-access-token token)))
+
+(defvar oauth--url-advice nil)
+(defvar oauth--tokens-need-renew)
+
+;; FIXME: We should change URL so that this can be done without an advice.
+(defadvice url-http-handle-authentication (around oauth-hack activate)
+  (if (not oauth--url-advice)
+      ad-do-it
+    (setq oauth--tokens-need-renew t)
+    ;; This is to make `url' think it's done.
+    (if (boundp 'success) (setq success t)) ;For URL library in Emacs<24.4.
+    (setq ad-return-value t)))              ;For URL library in Emacs≥24.4.
+
+;;;###autoload
+(defun oauth2-url-retrieve-synchronously (token url &optional request-method request-data request-extra-headers)
+  "Retrieve an URL synchronously using TOKENS to access it.
+TOKENS can be obtained with `oauth2-auth'."
+  (let* ((oauth--tokens-need-renew nil)
+         (url-buffer
+          (let ((oauth--url-advice t) ;Activate our advice.
+                (url-request-method request-method)
+                (url-request-data request-data)
+                (url-request-extra-headers request-extra-headers))
+            (url-retrieve-synchronously
+             (oauth2-url-append-access-token token url)))))
+    (if oauth--tokens-need-renew
+        (oauth2-url-retrieve-synchronously (oauth2-refresh-access token) url request-method request-data request-extra-headers)
+      url-buffer)))
+
+(provide 'oauth2)
+
+;;; oauth2.el ends here
diff --git a/packages/omn-mode/omn-mode.el b/packages/omn-mode/omn-mode.el
new file mode 100644 (file)
index 0000000..ef663bf
--- /dev/null
@@ -0,0 +1,237 @@
+;;; omn-mode.el --- Support for OWL Manchester Notation
+
+;; Copyright (C) 2013  Free Software Foundation, Inc.
+
+;; Author: Phillip Lord <phillip.lord@newcastle.ac.uk>
+;; Maintainer: Phillip Lord <phillip.lord@newcastle.ac.uk>
+;; Website: http://www.russet.org.uk/blog
+;; Version: 1.0
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;
+;; Defines a major mode for editing the Manchester OWL syntax.
+;; Basically, this is just a bit of font locking.
+
+;;; Code:
+
+;; (defgroup omn-mode nil
+;;   "Major mode to edit OWL Manchester Notation."
+;;   :group 'languages)
+
+(defvar omn-obsolete-electric-indent nil
+  "Set to t to use the old electric indent.  Better use `electric-indent-mode'.")
+
+(defvar omn-imenu-generic-expression
+  '(
+    ("Class"  "Class: \\([a-zA-Z:_]+\\)" 1)
+    ("ObjectProperty" "ObjectProperty: \\([a-zA-Z:_]+\\)" 1)
+    ("Individual" "Individual: \\([a-zA-Z:_]+\\)" 1)
+    )
+
+  "Imenu support for OMN.
+See `imenu-generic-expression' for details")
+
+
+(defvar omn-mode-entity-keywords
+  '(
+    "Ontology:"
+    "Namespace:"
+    "Class:"
+    "Individual:"
+    "ObjectProperty:"
+    "Import:"
+    "Datatype:"
+    "AnnotationProperty:"
+    "DisjointClasses:"
+    "Prefix:"
+    "Alias:"
+    "owl:Thing"))
+
+(defvar omn-mode-property-keywords
+  '(
+    "EquivalentTo:"
+    "SubClassOf:"
+    "Annotations:"
+    "Characteristics:"
+    "DisjointUnion:"
+    "DisjointWith:"
+    "Domain:"
+    "Range:"
+    "InverseOf:"
+    "SubPropertyOf:"
+    "Types:"
+    "Facts:"
+    ))
+
+
+;; indentation engine
+(defun omn-indent-line()
+  (indent-line-to
+   (omn-determine-line-indent)))
+
+(defun omn-determine-line-indent()
+  (save-excursion
+    (beginning-of-line)
+    ;; check the first word
+
+    (let* ((match (re-search-forward "\\w+" (line-end-position) t))
+           (word (if match
+                     (match-string 0)
+                   "")))
+
+      (cond
+       ;; ((not match)
+       ;;  (progn
+       ;;    (if (not (forward-line -1))
+       ;;        (omn-determine-line-indent)
+       ;;      0)))
+
+       ;; if it is string, ident should be 0.
+       ((nth 3 (syntax-ppss (point)))
+        0)
+
+       ;; if it is a comment
+       ((nth 4 (syntax-ppss (point)))
+        ;; if there is a next line, indent the same as that
+        (cond
+         ((eq 0 (forward-line 1))
+          (omn-determine-line-indent))
+         ;; if there isn't return the same as the line before
+         ((eq 0 (forward-line -1))
+          (omn-determine-line-indent))
+         ;; who knows?
+         (t 0)))
+
+       ;; if it is one of Class:, Prefix: or so on, then indent should be 0
+       ((member word omn-mode-entity-keywords)
+        0)
+       ;; if it is Annotations:, SubClassOf: or so on, then indent should be 4
+       ((member word omn-mode-property-keywords)
+        4)
+
+       ;; if it is something else, then 8
+       (t 8)))))
+
+(add-to-list 'auto-mode-alist '("\\.pomn\\'" . omn-mode))
+
+(add-to-list 'auto-mode-alist '("\\.omn\\'" . omn-mode))
+
+(defvar omn-font-lock-defaults
+  `(,(concat "\\_<"
+             (regexp-opt omn-mode-entity-keywords t)
+             "\\_>")
+    (,(mapconcat
+       (lambda(x) x)
+       '("\\<some\\>"
+         "\\<only\\>"
+         "\\<and\\>"
+         "\\<or\\>"
+         "\\<exactly\\>"
+         "Transitive"
+         )
+       "\\|")
+     . font-lock-type-face)
+    (,(regexp-opt omn-mode-property-keywords)
+     . font-lock-builtin-face)
+    ("\\w+:\\w+" . font-lock-function-name-face)))
+
+
+(defvar omn-mode-syntax-table
+  (let ((st (make-syntax-table)))
+    ;; string quotes
+    (modify-syntax-entry ?\" "\"" st)
+    ;; This is a bit underhand, but we define the < and > characters to be
+    ;; "generic-string" delimiters. This results in fontification for URLs
+    ;; which is no bad thing. Additionally, it makes the comment character
+    ;; work, as "#" is a valid in a URL. The semantics of this isn't quite
+    ;; right, because the two characters are not paired. So <url> is
+    ;; recognised, but so is <url< or >url>.
+    ;; We could use a syntax-propertize-function to do more carefully.
+    (modify-syntax-entry ?\< "|" st)
+    (modify-syntax-entry ?\> "|" st)
+    ;; define comment characters for syntax
+    (modify-syntax-entry ?\# "<" st)
+    (modify-syntax-entry ?\n ">" st)
+    ;; Let's not confuse "words" and "symbols": "_" should not be part of the
+    ;; definition of a "word".
+    ;;(modify-syntax-entry ?\_ "w" st)
+    ;; For name space prefixes.
+    (modify-syntax-entry ?\: "w" st)
+    st))
+
+(defvar omn-mode-map
+  (let ((map (make-sparse-keymap)))
+    (when omn-obsolete-electric-indent
+      (dolist (x `(" " "," ":"))
+        (define-key map x 'omn-mode-electric-indent))
+      ;; need to bind to return as well
+      (define-key map (kbd "RET") 'omn-mode-electric-newline))
+    map))
+
+(defun omn-mode-electric-indent()
+  (interactive)
+  (self-insert-command 1)
+  (omn-mode-indent-here))
+
+(defun omn-mode-indent-here()
+  (let ((m (point-marker)))
+    (omn-indent-line)
+    (goto-char (marker-position m))))
+
+(defun omn-mode-electric-newline()
+  (interactive)
+  (newline)
+  (save-excursion
+    (forward-line -1)
+    (omn-indent-line)))
+
+(define-derived-mode omn-mode fundamental-mode "Omn"
+  "Doc string to add"
+
+  ;; font-lock stuff
+  (setq font-lock-defaults
+        '(omn-font-lock-defaults))
+
+  (set (make-local-variable 'comment-start) "#")
+  (set (make-local-variable 'comment-end) "")
+  ;; no idea what this is about -- stolen from generic
+  (set (make-local-variable 'comment-start-skip) "#+\\s-*")
+
+  (set (make-local-variable 'imenu-generic-expression)
+       omn-imenu-generic-expression)
+
+  (set (make-local-variable 'electric-indent-chars)
+       (append `(?\  ?\, ?\:)
+               (if (boundp 'electric-indent-chars)
+                   (default-value 'electric-indent-chars)
+                 '(?\n))))
+  
+  (set (make-local-variable 'indent-line-function) 'omn-indent-line))
+
+
+;; interaction with a reasoner.....
+;; Define a struct using CL, which defines a command. Then send this to the command line
+;; program as a single key-value pair line.
+;;
+;; Write a parser for this in Java.
+;; Write a "command" interface, use annotation to mark each of the command setMethods.
+;;
+;; Have the command interface return results between tags as lisp. We can eval
+;; this, and get the result in that way.
+
+(provide 'omn-mode)
+
+;;; omn-mode.el ends here
diff --git a/packages/quarter-plane/quarter-plane.el b/packages/quarter-plane/quarter-plane.el
new file mode 100644 (file)
index 0000000..f73fd4e
--- /dev/null
@@ -0,0 +1,113 @@
+;;; quarter-plane.el --- Minor mode for quarter-plane style editing
+
+;; Copyright (C) 2011  Free Software Foundation, Inc.
+
+;; Author: Peter J. Weisberg
+;; Version: 0.1
+;; Keywords: convenience wp
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This package provides Quarter Plane mode, a minor mode which
+;; provides Picture mode style editing (treating the screen as a
+;; semi-infinite quarter-plane).  Unlike Picture mode, it is a minor
+;; modes (see the Emacs manual for the documentation of Picture mode).
+;; Type M-x quarter-plane-mode to enable Quarter Plane mode in the
+;; current buffer, and M-x global-quarter-plane-mode to enable it
+;; globally.
+
+;; In Quarter Plane mode, the commands `right-char', `forward-char',
+;; `previous-line', `next-line', and `mouse-set-point' are rebound to
+;; Quarter Plane commands.
+
+;; Known issues:
+
+;; Quarter-Plane mode doesn't work in read-only buffers, where it
+;; can't insert spaces.
+
+;; The user doesn't really care about the "modifications" of adding
+;; whitespace that's going to be trimmed when he exits quarter-plane
+;; mode or saves, but it's still part of the undo history.
+
+;; Both of these are due to the disconnect between what the user
+;; really wants--movement of the cursor within the window, regardless
+;; of where the text is--and what the mode can actually do--add dummy
+;; text to give the cursor a place to move to.
+
+;;; Code:
+
+(require 'picture)
+
+(defvar quarter-plane-mode-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map [remap right-char] 'picture-forward-column)
+    (define-key map [remap forward-char] 'picture-forward-column)
+    (define-key map [remap previous-line] 'picture-move-up)
+    (define-key map [remap next-line] 'picture-move-down)
+    (define-key map [remap mouse-set-point] 'picture-mouse-set-point)
+    map))
+
+(defvar quarter-plane-saved-values nil)
+(make-variable-buffer-local 'quarter-plane-saved-values)
+
+;;;###autoload
+(define-minor-mode quarter-plane-mode
+  "Toggle Quarter-Plane mode on or off.
+Interactively, with no prefix argument, toggle the mode.
+With universal prefix ARG turn mode on.
+With zero or negative ARG turn mode off.
+
+Use point movement commands that act as if the text extended
+infinitely down and to the right, inserting spaces as necessary.
+Excess whitespace is trimmed when saving or exiting Quarter-Plane mode.
+
+Because it works by inserting spaces, Quarter-Plane mode won't work in
+read-only buffers.
+
+\\{quarter-plane-mode-map}"
+  :lighter " Plane"
+  :group 'picture
+  :keymap quarter-plane-mode-map
+  (remove-hook 'before-save-hook 'quarter-plane-delete-whitespace t)
+  (dolist (symval (prog1 quarter-plane-saved-values
+                    (setq quarter-plane-saved-values nil)))
+    (set (car symval) (cdr symval)))
+  (when quarter-plane-mode
+    (add-hook 'before-save-hook 'quarter-plane-delete-whitespace nil t)
+    ;; Since quarter-plane-mode is not permanent-local, it should turn itself
+    ;; off cleanly.
+    (add-hook 'change-major-mode-hook (lambda () (quarter-plane-mode -1)) nil t)
+    (dolist (symval '((truncate-lines . t)
+                      (show-trailing-whitespace . nil)))
+      (push (cons (car symval) (symbol-value (car symval)))
+            quarter-plane-saved-values)
+      (set (car symval) (cdr symval)))))
+
+;;;###autoload
+(define-global-minor-mode global-quarter-plane-mode quarter-plane-mode
+  quarter-plane-mode
+  :group 'picture)
+
+(defun quarter-plane-delete-whitespace ()
+  "Call `delete-trailing-whitespace' if the buffer is not read-only."
+  (if (not buffer-read-only)
+      (delete-trailing-whitespace)))
+
+(add-hook 'quarter-plane-mode-off-hook 'quarter-plane-delete-whitespace)
+
+(provide 'quarter-plane)
+
+;;; quarter-plane.el ends here
diff --git a/packages/queue/queue.el b/packages/queue/queue.el
new file mode 100644 (file)
index 0000000..f065089
--- /dev/null
@@ -0,0 +1,157 @@
+;;; queue.el --- Queue data structure
+
+;; Copyright (C) 1991-1995, 2008-2009, 2012  Free Software Foundation, Inc
+
+;; Author: Inge Wallin <inge@lysator.liu.se>
+;;         Toby Cubitt <toby-predictive@dr-qubit.org>
+;; Maintainer: Toby Cubitt <toby-predictive@dr-qubit.org>
+;; Version: 0.1
+;; Keywords: extensions, data structures, queue
+;; URL: http://www.dr-qubit.org/emacs.php
+;; Repository: http://www.dr-qubit.org/git/predictive.git
+
+;; This file is part of 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 <http://www.gnu.org/licenses/>.
+
+
+;;; Commentary:
+;;
+;; These queues can be used both as a first-in last-out (FILO) and as a
+;; first-in first-out (FIFO) stack, i.e. elements can be added to the front or
+;; back of the queue, and can be removed from the front. (This type of data
+;; structure is sometimes called an "output-restricted deque".)
+;;
+;; You create a queue using `make-queue', add an element to the end of the
+;; queue using `queue-enqueue', and push an element onto the front of the
+;; queue using `queue-prepend'. To remove the first element from a queue, use
+;; `queue-dequeue'. A number of other queue convenience functions are also
+;; provided, all starting with the prefix `queue-'.  Functions with prefix
+;; `queue--' are for internal use only, and should never be used outside this
+;; package.
+
+
+;;; Change Log:
+;;
+;; Version 0.1
+;; * the old Elib library of the same name, updated to use defstructs
+
+
+
+;;; Code:
+
+(eval-when-compile (require 'cl))
+
+
+(defstruct (queue
+            ;; A tagged list is the pre-defstruct representation.
+            ;; (:type list)
+           :named
+           (:constructor nil)
+           (:constructor queue-create ())
+           (:copier nil))
+  head tail)
+
+
+;;;###autoload
+(defalias 'make-queue 'queue-create
+  "Create an empty queue data structure.")
+
+
+(defun queue-enqueue (queue element)
+  "Append an ELEMENT to the end of the QUEUE."
+  (if (queue-head queue)
+      (setcdr (queue-tail queue)
+             (setf (queue-tail queue) (cons element nil)))
+    (setf (queue-head queue)
+         (setf (queue-tail queue) (cons element nil)))))
+
+(defalias 'queue-append 'queue-enqueue)
+
+
+(defun queue-prepend (queue element)
+  "Prepend an ELEMENT to the front of the QUEUE."
+  (if (queue-head queue)
+      (push element (queue-head queue))
+    (setf (queue-head queue)
+         (setf (queue-tail queue) (cons element nil)))))
+
+
+(defun queue-dequeue (queue)
+  "Remove the first element of QUEUE and return it.
+Returns nil if the queue is empty."
+  (unless (cdr (queue-head queue)) (setf (queue-tail queue) nil))
+  (pop (queue-head queue)))
+
+
+(defmacro queue-empty (queue)
+  "Return t if QUEUE is empty, otherwise return nil."
+  (null (queue-head queue)))
+
+
+(defmacro queue-first (queue)
+  "Return the first element of QUEUE or nil if it is empty,
+without removing it from the QUEUE."
+  (car (queue-head queue)))
+
+
+(defun queue-nth (queue n)
+  "Return the nth element of a queue, without removing it.
+If the length of the queue is less than N, return nil. The first
+element in the queue has index 0."
+  (nth n (queue-head queue)))
+
+
+(defun queue-last (queue)
+  "Return the last element of QUEUE, without removing it.
+Returns nil if the QUEUE is empty."
+  (car (queue-tail queue)))
+
+
+(defun queue-all (queue)
+  "Return a list of all elements of QUEUE or nil if it is empty.
+The oldest element in the queue is the first in the list."
+  (queue-head queue))
+
+
+(defun queue-copy (queue)
+  "Return a copy of QUEUE.
+The new queue contains the elements of QUEUE in the same
+order. The elements themselves are *not* copied."
+  (let ((q (queue-create))
+       (list (queue-head queue)))
+    (when (queue-head queue)
+      (setf (queue-head q) (cons (car (queue-head queue)) nil)
+           (queue-tail q) (queue-head q))
+      (while (setq list (cdr list))
+       (setf (queue-tail q)
+             (setcdr (queue-tail q) (cons (car list) nil)))))
+    q))
+
+
+(defun queue-length (queue)
+  "Return the number of elements in QUEUE."
+  (length (queue-head queue)))
+
+
+(defun queue-clear (queue)
+  "Remove all elements from QUEUE."
+  (setf (queue-head queue) nil
+       (queue-tail queue) nil))
+
+
+(provide 'queue)
+
+
+;;; queue.el ends here
diff --git a/packages/rainbow-mode/rainbow-mode.el b/packages/rainbow-mode/rainbow-mode.el
new file mode 100644 (file)
index 0000000..e6bb602
--- /dev/null
@@ -0,0 +1,1166 @@
+;;; rainbow-mode.el --- Colorize color names in buffers
+
+;; Copyright (C) 2010-2012 Free Software Foundation, Inc
+
+;; Author: Julien Danjou <julien@danjou.info>
+;; Keywords: faces
+;; Version: 0.9
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;
+;; This minor mode sets background color to strings that match color
+;; names, e.g. #0000ff is displayed in white with a blue background.
+;;
+
+;;; Code:
+
+(eval-when-compile
+  (require 'cl))
+
+(require 'regexp-opt)
+(require 'faces)
+(require 'color)
+
+(unless (require 'xterm-color nil t)
+  (require 'ansi-color))
+
+(defgroup rainbow nil
+  "Show color strings with a background color."
+  :tag "Rainbow"
+  :group 'help)
+
+;; Hexadecimal colors
+(defvar rainbow-hexadecimal-colors-font-lock-keywords
+  '(("[^&]\\(#\\(?:[0-9a-fA-F]\\{3\\}\\)+\\{1,4\\}\\)"
+     (1 (rainbow-colorize-itself 1)))
+    ("^\\(#\\(?:[0-9a-fA-F]\\{3\\}\\)+\\{1,4\\}\\)"
+     (0 (rainbow-colorize-itself)))
+    ("[Rr][Gg][Bb]:[0-9a-fA-F]\\{1,4\\}/[0-9a-fA-F]\\{1,4\\}/[0-9a-fA-F]\\{1,4\\}"
+     (0 (rainbow-colorize-itself)))
+    ("[Rr][Gg][Bb][Ii]:[0-9.]+/[0-9.]+/[0-9.]+"
+     (0 (rainbow-colorize-itself)))
+    ("\\(?:[Cc][Ii][Ee]\\(?:[Xx][Yy][Zz]\\|[Uu][Vv][Yy]\\|[Xx][Yy][Yy]\\|[Ll][Aa][Bb]\\|[Ll][Uu][Vv]\\)\\|[Tt][Ee][Kk][Hh][Vv][Cc]\\):[+-]?[0-9.]+\\(?:[Ee][+-]?[0-9]+\\)?/[+-]?[0-9.]+\\(?:[Ee][+-]?[0-9]+\\)?/[+-]?[0-9.]+\\(?:[Ee][+-]?[0-9]+\\)?"
+     (0 (rainbow-colorize-itself))))
+  "Font-lock keywords to add for hexadecimal colors.")
+
+;; rgb() colors
+(defvar rainbow-html-rgb-colors-font-lock-keywords
+  '(("rgb(\s*\\([0-9]\\{1,3\\}\\(?:\s*%\\)?\\)\s*,\s*\\([0-9]\\{1,3\\}\\(?:\s*%\\)?\\)\s*,\s*\\([0-9]\\{1,3\\}\\(?:\s*%\\)?\\)\s*)"
+     (0 (rainbow-colorize-rgb)))
+    ("rgba(\s*\\([0-9]\\{1,3\\}\\(?:\s*%\\)?\\)\s*,\s*\\([0-9]\\{1,3\\}\\(?:\s*%\\)?\\)\s*,\s*\\([0-9]\\{1,3\\}\\(?:\s*%\\)?\\)\s*,\s*[0-9]*\.?[0-9]+\s*%?\s*)"
+     (0 (rainbow-colorize-rgb)))
+    ("hsl(\s*\\([0-9]\\{1,3\\}\\)\s*,\s*\\([0-9]\\{1,3\\}\\)\s*%\s*,\s*\\([0-9]\\{1,3\\}\\)\s*%\s*)"
+     (0 (rainbow-colorize-hsl)))
+    ("hsla(\s*\\([0-9]\\{1,3\\}\\)\s*,\s*\\([0-9]\\{1,3\\}\\)\s*%\s*,\s*\\([0-9]\\{1,3\\}\\)\s*%\s*,\s*[0-9]*\.?[0-9]+\s*%?\s*)"
+     (0 (rainbow-colorize-hsl))))
+  "Font-lock keywords to add for RGB colors.")
+
+;; HTML colors name
+(defvar rainbow-html-colors-font-lock-keywords nil
+  "Font-lock keywords to add for HTML colors.")
+(make-variable-buffer-local 'rainbow-html-colors-font-lock-keywords)
+
+(defcustom rainbow-html-colors-alist
+  '(("AliceBlue" . "#F0F8FF")
+    ("AntiqueWhite" . "#FAEBD7")
+    ("Aqua" . "#00FFFF")
+    ("Aquamarine" . "#7FFFD4")
+    ("Azure" . "#F0FFFF")
+    ("Beige" . "#F5F5DC")
+    ("Bisque" . "#FFE4C4")
+    ("Black" . "#000000")
+    ("BlanchedAlmond" . "#FFEBCD")
+    ("Blue" . "#0000FF")
+    ("BlueViolet" . "#8A2BE2")
+    ("Brown" . "#A52A2A")
+    ("BurlyWood" . "#DEB887")
+    ("CadetBlue" . "#5F9EA0")
+    ("Chartreuse" . "#7FFF00")
+    ("Chocolate" . "#D2691E")
+    ("Coral" . "#FF7F50")
+    ("CornflowerBlue" . "#6495ED")
+    ("Cornsilk" . "#FFF8DC")
+    ("Crimson" . "#DC143C")
+    ("Cyan" . "#00FFFF")
+    ("DarkBlue" . "#00008B")
+    ("DarkCyan" . "#008B8B")
+    ("DarkGoldenRod" . "#B8860B")
+    ("DarkGray" . "#A9A9A9")
+    ("DarkGrey" . "#A9A9A9")
+    ("DarkGreen" . "#006400")
+    ("DarkKhaki" . "#BDB76B")
+    ("DarkMagenta" . "#8B008B")
+    ("DarkOliveGreen" . "#556B2F")
+    ("Darkorange" . "#FF8C00")
+    ("DarkOrchid" . "#9932CC")
+    ("DarkRed" . "#8B0000")
+    ("DarkSalmon" . "#E9967A")
+    ("DarkSeaGreen" . "#8FBC8F")
+    ("DarkSlateBlue" . "#483D8B")
+    ("DarkSlateGray" . "#2F4F4F")
+    ("DarkSlateGrey" . "#2F4F4F")
+    ("DarkTurquoise" . "#00CED1")
+    ("DarkViolet" . "#9400D3")
+    ("DeepPink" . "#FF1493")
+    ("DeepSkyBlue" . "#00BFFF")
+    ("DimGray" . "#696969")
+    ("DimGrey" . "#696969")
+    ("DodgerBlue" . "#1E90FF")
+    ("FireBrick" . "#B22222")
+    ("FloralWhite" . "#FFFAF0")
+    ("ForestGreen" . "#228B22")
+    ("Fuchsia" . "#FF00FF")
+    ("Gainsboro" . "#DCDCDC")
+    ("GhostWhite" . "#F8F8FF")
+    ("Gold" . "#FFD700")
+    ("GoldenRod" . "#DAA520")
+    ("Gray" . "#808080")
+    ("Grey" . "#808080")
+    ("Green" . "#008000")
+    ("GreenYellow" . "#ADFF2F")
+    ("HoneyDew" . "#F0FFF0")
+    ("HotPink" . "#FF69B4")
+    ("IndianRed" . "#CD5C5C")
+    ("Indigo" . "#4B0082")
+    ("Ivory" . "#FFFFF0")
+    ("Khaki" . "#F0E68C")
+    ("Lavender" . "#E6E6FA")
+    ("LavenderBlush" . "#FFF0F5")
+    ("LawnGreen" . "#7CFC00")
+    ("LemonChiffon" . "#FFFACD")
+    ("LightBlue" . "#ADD8E6")
+    ("LightCoral" . "#F08080")
+    ("LightCyan" . "#E0FFFF")
+    ("LightGoldenRodYellow" . "#FAFAD2")
+    ("LightGray" . "#D3D3D3")
+    ("LightGrey" . "#D3D3D3")
+    ("LightGreen" . "#90EE90")
+    ("LightPink" . "#FFB6C1")
+    ("LightSalmon" . "#FFA07A")
+    ("LightSeaGreen" . "#20B2AA")
+    ("LightSkyBlue" . "#87CEFA")
+    ("LightSlateGray" . "#778899")
+    ("LightSlateGrey" . "#778899")
+    ("LightSteelBlue" . "#B0C4DE")
+    ("LightYellow" . "#FFFFE0")
+    ("Lime" . "#00FF00")
+    ("LimeGreen" . "#32CD32")
+    ("Linen" . "#FAF0E6")
+    ("Magenta" . "#FF00FF")
+    ("Maroon" . "#800000")
+    ("MediumAquaMarine" . "#66CDAA")
+    ("MediumBlue" . "#0000CD")
+    ("MediumOrchid" . "#BA55D3")
+    ("MediumPurple" . "#9370D8")
+    ("MediumSeaGreen" . "#3CB371")
+    ("MediumSlateBlue" . "#7B68EE")
+    ("MediumSpringGreen" . "#00FA9A")
+    ("MediumTurquoise" . "#48D1CC")
+    ("MediumVioletRed" . "#C71585")
+    ("MidnightBlue" . "#191970")
+    ("MintCream" . "#F5FFFA")
+    ("MistyRose" . "#FFE4E1")
+    ("Moccasin" . "#FFE4B5")
+    ("NavajoWhite" . "#FFDEAD")
+    ("Navy" . "#000080")
+    ("OldLace" . "#FDF5E6")
+    ("Olive" . "#808000")
+    ("OliveDrab" . "#6B8E23")
+    ("Orange" . "#FFA500")
+    ("OrangeRed" . "#FF4500")
+    ("Orchid" . "#DA70D6")
+    ("PaleGoldenRod" . "#EEE8AA")
+    ("PaleGreen" . "#98FB98")
+    ("PaleTurquoise" . "#AFEEEE")
+    ("PaleVioletRed" . "#D87093")
+    ("PapayaWhip" . "#FFEFD5")
+    ("PeachPuff" . "#FFDAB9")
+    ("Peru" . "#CD853F")
+    ("Pink" . "#FFC0CB")
+    ("Plum" . "#DDA0DD")
+    ("PowderBlue" . "#B0E0E6")
+    ("Purple" . "#800080")
+    ("Red" . "#FF0000")
+    ("RosyBrown" . "#BC8F8F")
+    ("RoyalBlue" . "#4169E1")
+    ("SaddleBrown" . "#8B4513")
+    ("Salmon" . "#FA8072")
+    ("SandyBrown" . "#F4A460")
+    ("SeaGreen" . "#2E8B57")
+    ("SeaShell" . "#FFF5EE")
+    ("Sienna" . "#A0522D")
+    ("Silver" . "#C0C0C0")
+    ("SkyBlue" . "#87CEEB")
+    ("SlateBlue" . "#6A5ACD")
+    ("SlateGray" . "#708090")
+    ("SlateGrey" . "#708090")
+    ("Snow" . "#FFFAFA")
+    ("SpringGreen" . "#00FF7F")
+    ("SteelBlue" . "#4682B4")
+    ("Tan" . "#D2B48C")
+    ("Teal" . "#008080")
+    ("Thistle" . "#D8BFD8")
+    ("Tomato" . "#FF6347")
+    ("Turquoise" . "#40E0D0")
+    ("Violet" . "#EE82EE")
+    ("Wheat" . "#F5DEB3")
+    ("White" . "#FFFFFF")
+    ("WhiteSmoke" . "#F5F5F5")
+    ("Yellow" . "#FFFF00")
+    ("YellowGreen" . "#9ACD32"))
+  "Alist of HTML colors.
+Each entry should have the form (COLOR-NAME . HEXADECIMAL-COLOR)."
+  :group 'rainbow)
+
+(defcustom rainbow-html-colors-major-mode-list
+  '(html-mode css-mode php-mode nxml-mode xml-mode)
+  "List of major mode where HTML colors are enabled when
+`rainbow-html-colors' is set to auto."
+  :group 'rainbow)
+
+(defcustom rainbow-html-colors 'auto
+  "When to enable HTML colors.
+If set to t, the HTML colors will be enabled.  If set to nil, the
+HTML colors will not be enabled.  If set to auto, the HTML colors
+will be enabled if a major mode has been detected from the
+`rainbow-html-colors-major-mode-list'."
+  :group 'rainbow)
+
+;; X colors
+(defvar rainbow-x-colors-font-lock-keywords
+  `((,(regexp-opt (x-defined-colors) 'words)
+     (0 (rainbow-colorize-itself))))
+  "Font-lock keywords to add for X colors.")
+
+(defcustom rainbow-x-colors-major-mode-list
+  '(emacs-lisp-mode lisp-interaction-mode c-mode c++-mode java-mode)
+  "List of major mode where X colors are enabled when
+`rainbow-x-colors' is set to auto."
+  :group 'rainbow)
+
+(defcustom rainbow-x-colors 'auto
+  "When to enable X colors.
+If set to t, the X colors will be enabled.  If set to nil, the
+X colors will not be enabled.  If set to auto, the X colors
+will be enabled if a major mode has been detected from the
+`rainbow-x-colors-major-mode-list'."
+  :group 'rainbow)
+
+;; LaTeX colors
+(defvar rainbow-latex-rgb-colors-font-lock-keywords
+  '(("{rgb}{\\([0-9.]+\\),\s*\\([0-9.]+\\),\s*\\([0-9.]+\\)}"
+     (0 (rainbow-colorize-rgb-float)))
+    ("{RGB}{\\([0-9]\\{1,3\\}\\),\s*\\([0-9]\\{1,3\\}\\),\s*\\([0-9]\\{1,3\\}\\)}"
+     (0 (rainbow-colorize-rgb)))
+    ("{HTML}{\\([0-9A-Fa-f]\\{6\\}\\)}"
+     (0 (rainbow-colorize-hexadecimal-without-sharp))))
+  "Font-lock keywords to add for LaTeX colors.")
+
+(defcustom rainbow-latex-colors-major-mode-list
+  '(latex-mode)
+  "List of major mode where LaTeX colors are enabled when
+`rainbow-x-colors' is set to auto."
+  :group 'rainbow)
+
+(defcustom rainbow-latex-colors 'auto
+  "When to enable LaTeX colors.
+If set to t, the LaTeX colors will be enabled. If set to nil, the
+LaTeX colors will not be enabled.  If set to auto, the LaTeX colors
+will be enabled if a major mode has been detected from the
+`rainbow-latex-colors-major-mode-list'."
+  :group 'rainbow)
+
+;; Shell colors
+(defvar rainbow-ansi-colors-font-lock-keywords
+  '(("\\(\\\\[eE]\\|\\\\033\\|\\\\x1[bB]\\|\033\\)\\[\\([0-9;]*m\\)"
+     (0 (rainbow-colorize-ansi))))
+  "Font-lock keywords to add for ANSI colors.")
+
+(defcustom rainbow-ansi-colors-major-mode-list
+  '(sh-mode c-mode c++-mode)
+  "List of major mode where ANSI colors are enabled when
+`rainbow-ansi-colors' is set to auto."
+  :group 'rainbow)
+
+(defcustom rainbow-ansi-colors 'auto
+  "When to enable ANSI colors.
+If set to t, the ANSI colors will be enabled. If set to nil, the
+ANSI colors will not be enabled.  If set to auto, the ANSI colors
+will be enabled if a major mode has been detected from the
+`rainbow-ansi-colors-major-mode-list'."
+  :group 'rainbow)
+
+;; R colors
+
+;; R colors name
+(defvar rainbow-r-colors-font-lock-keywords nil
+  "Font-lock keywords to add for R colors.")
+(make-variable-buffer-local 'rainbow-r-colors-font-lock-keywords)
+
+;; use the following code to generate the list in R
+;; output_colors <- function(colors) {for(color in colors) {col <- col2rgb(color); cat(sprintf("(\"%s\" . \"#%02X%02X%02X\")\n",color,col[1],col[2],col[3]));}}
+;; output_colors(colors())
+(defcustom rainbow-r-colors-alist
+  '(("white" . "#FFFFFF")
+    ("aliceblue" . "#F0F8FF")
+    ("antiquewhite" . "#FAEBD7")
+    ("antiquewhite1" . "#FFEFDB")
+    ("antiquewhite2" . "#EEDFCC")
+    ("antiquewhite3" . "#CDC0B0")
+    ("antiquewhite4" . "#8B8378")
+    ("aquamarine" . "#7FFFD4")
+    ("aquamarine1" . "#7FFFD4")
+    ("aquamarine2" . "#76EEC6")
+    ("aquamarine3" . "#66CDAA")
+    ("aquamarine4" . "#458B74")
+    ("azure" . "#F0FFFF")
+    ("azure1" . "#F0FFFF")
+    ("azure2" . "#E0EEEE")
+    ("azure3" . "#C1CDCD")
+    ("azure4" . "#838B8B")
+    ("beige" . "#F5F5DC")
+    ("bisque" . "#FFE4C4")
+    ("bisque1" . "#FFE4C4")
+    ("bisque2" . "#EED5B7")
+    ("bisque3" . "#CDB79E")
+    ("bisque4" . "#8B7D6B")
+    ("black" . "#000000")
+    ("blanchedalmond" . "#FFEBCD")
+    ("blue" . "#0000FF")
+    ("blue1" . "#0000FF")
+    ("blue2" . "#0000EE")
+    ("blue3" . "#0000CD")
+    ("blue4" . "#00008B")
+    ("blueviolet" . "#8A2BE2")
+    ("brown" . "#A52A2A")
+    ("brown1" . "#FF4040")
+    ("brown2" . "#EE3B3B")
+    ("brown3" . "#CD3333")
+    ("brown4" . "#8B2323")
+    ("burlywood" . "#DEB887")
+    ("burlywood1" . "#FFD39B")
+    ("burlywood2" . "#EEC591")
+    ("burlywood3" . "#CDAA7D")
+    ("burlywood4" . "#8B7355")
+    ("cadetblue" . "#5F9EA0")
+    ("cadetblue1" . "#98F5FF")
+    ("cadetblue2" . "#8EE5EE")
+    ("cadetblue3" . "#7AC5CD")
+    ("cadetblue4" . "#53868B")
+    ("chartreuse" . "#7FFF00")
+    ("chartreuse1" . "#7FFF00")
+    ("chartreuse2" . "#76EE00")
+    ("chartreuse3" . "#66CD00")
+    ("chartreuse4" . "#458B00")
+    ("chocolate" . "#D2691E")
+    ("chocolate1" . "#FF7F24")
+    ("chocolate2" . "#EE7621")
+    ("chocolate3" . "#CD661D")
+    ("chocolate4" . "#8B4513")
+    ("coral" . "#FF7F50")
+    ("coral1" . "#FF7256")
+    ("coral2" . "#EE6A50")
+    ("coral3" . "#CD5B45")
+    ("coral4" . "#8B3E2F")
+    ("cornflowerblue" . "#6495ED")
+    ("cornsilk" . "#FFF8DC")
+    ("cornsilk1" . "#FFF8DC")
+    ("cornsilk2" . "#EEE8CD")
+    ("cornsilk3" . "#CDC8B1")
+    ("cornsilk4" . "#8B8878")
+    ("cyan" . "#00FFFF")
+    ("cyan1" . "#00FFFF")
+    ("cyan2" . "#00EEEE")
+    ("cyan3" . "#00CDCD")
+    ("cyan4" . "#008B8B")
+    ("darkblue" . "#00008B")
+    ("darkcyan" . "#008B8B")
+    ("darkgoldenrod" . "#B8860B")
+    ("darkgoldenrod1" . "#FFB90F")
+    ("darkgoldenrod2" . "#EEAD0E")
+    ("darkgoldenrod3" . "#CD950C")
+    ("darkgoldenrod4" . "#8B6508")
+    ("darkgray" . "#A9A9A9")
+    ("darkgreen" . "#006400")
+    ("darkgrey" . "#A9A9A9")
+    ("darkkhaki" . "#BDB76B")
+    ("darkmagenta" . "#8B008B")
+    ("darkolivegreen" . "#556B2F")
+    ("darkolivegreen1" . "#CAFF70")
+    ("darkolivegreen2" . "#BCEE68")
+    ("darkolivegreen3" . "#A2CD5A")
+    ("darkolivegreen4" . "#6E8B3D")
+    ("darkorange" . "#FF8C00")
+    ("darkorange1" . "#FF7F00")
+    ("darkorange2" . "#EE7600")
+    ("darkorange3" . "#CD6600")
+    ("darkorange4" . "#8B4500")
+    ("darkorchid" . "#9932CC")
+    ("darkorchid1" . "#BF3EFF")
+    ("darkorchid2" . "#B23AEE")
+    ("darkorchid3" . "#9A32CD")
+    ("darkorchid4" . "#68228B")
+    ("darkred" . "#8B0000")
+    ("darksalmon" . "#E9967A")
+    ("darkseagreen" . "#8FBC8F")
+    ("darkseagreen1" . "#C1FFC1")
+    ("darkseagreen2" . "#B4EEB4")
+    ("darkseagreen3" . "#9BCD9B")
+    ("darkseagreen4" . "#698B69")
+    ("darkslateblue" . "#483D8B")
+    ("darkslategray" . "#2F4F4F")
+    ("darkslategray1" . "#97FFFF")
+    ("darkslategray2" . "#8DEEEE")
+    ("darkslategray3" . "#79CDCD")
+    ("darkslategray4" . "#528B8B")
+    ("darkslategrey" . "#2F4F4F")
+    ("darkturquoise" . "#00CED1")
+    ("darkviolet" . "#9400D3")
+    ("deeppink" . "#FF1493")
+    ("deeppink1" . "#FF1493")
+    ("deeppink2" . "#EE1289")
+    ("deeppink3" . "#CD1076")
+    ("deeppink4" . "#8B0A50")
+    ("deepskyblue" . "#00BFFF")
+    ("deepskyblue1" . "#00BFFF")
+    ("deepskyblue2" . "#00B2EE")
+    ("deepskyblue3" . "#009ACD")
+    ("deepskyblue4" . "#00688B")
+    ("dimgray" . "#696969")
+    ("dimgrey" . "#696969")
+    ("dodgerblue" . "#1E90FF")
+    ("dodgerblue1" . "#1E90FF")
+    ("dodgerblue2" . "#1C86EE")
+    ("dodgerblue3" . "#1874CD")
+    ("dodgerblue4" . "#104E8B")
+    ("firebrick" . "#B22222")
+    ("firebrick1" . "#FF3030")
+    ("firebrick2" . "#EE2C2C")
+    ("firebrick3" . "#CD2626")
+    ("firebrick4" . "#8B1A1A")
+    ("floralwhite" . "#FFFAF0")
+    ("forestgreen" . "#228B22")
+    ("gainsboro" . "#DCDCDC")
+    ("ghostwhite" . "#F8F8FF")
+    ("gold" . "#FFD700")
+    ("gold1" . "#FFD700")
+    ("gold2" . "#EEC900")
+    ("gold3" . "#CDAD00")
+    ("gold4" . "#8B7500")
+    ("goldenrod" . "#DAA520")
+    ("goldenrod1" . "#FFC125")
+    ("goldenrod2" . "#EEB422")
+    ("goldenrod3" . "#CD9B1D")
+    ("goldenrod4" . "#8B6914")
+    ("gray" . "#BEBEBE")
+    ("gray0" . "#000000")
+    ("gray1" . "#030303")
+    ("gray2" . "#050505")
+    ("gray3" . "#080808")
+    ("gray4" . "#0A0A0A")
+    ("gray5" . "#0D0D0D")
+    ("gray6" . "#0F0F0F")
+    ("gray7" . "#121212")
+    ("gray8" . "#141414")
+    ("gray9" . "#171717")
+    ("gray10" . "#1A1A1A")
+    ("gray11" . "#1C1C1C")
+    ("gray12" . "#1F1F1F")
+    ("gray13" . "#212121")
+    ("gray14" . "#242424")
+    ("gray15" . "#262626")
+    ("gray16" . "#292929")
+    ("gray17" . "#2B2B2B")
+    ("gray18" . "#2E2E2E")
+    ("gray19" . "#303030")
+    ("gray20" . "#333333")
+    ("gray21" . "#363636")
+    ("gray22" . "#383838")
+    ("gray23" . "#3B3B3B")
+    ("gray24" . "#3D3D3D")
+    ("gray25" . "#404040")
+    ("gray26" . "#424242")
+    ("gray27" . "#454545")
+    ("gray28" . "#474747")
+    ("gray29" . "#4A4A4A")
+    ("gray30" . "#4D4D4D")
+    ("gray31" . "#4F4F4F")
+    ("gray32" . "#525252")
+    ("gray33" . "#545454")
+    ("gray34" . "#575757")
+    ("gray35" . "#595959")
+    ("gray36" . "#5C5C5C")
+    ("gray37" . "#5E5E5E")
+    ("gray38" . "#616161")
+    ("gray39" . "#636363")
+    ("gray40" . "#666666")
+    ("gray41" . "#696969")
+    ("gray42" . "#6B6B6B")
+    ("gray43" . "#6E6E6E")
+    ("gray44" . "#707070")
+    ("gray45" . "#737373")
+    ("gray46" . "#757575")
+    ("gray47" . "#787878")
+    ("gray48" . "#7A7A7A")
+    ("gray49" . "#7D7D7D")
+    ("gray50" . "#7F7F7F")
+    ("gray51" . "#828282")
+    ("gray52" . "#858585")
+    ("gray53" . "#878787")
+    ("gray54" . "#8A8A8A")
+    ("gray55" . "#8C8C8C")
+    ("gray56" . "#8F8F8F")
+    ("gray57" . "#919191")
+    ("gray58" . "#949494")
+    ("gray59" . "#969696")
+    ("gray60" . "#999999")
+    ("gray61" . "#9C9C9C")
+    ("gray62" . "#9E9E9E")
+    ("gray63" . "#A1A1A1")
+    ("gray64" . "#A3A3A3")
+    ("gray65" . "#A6A6A6")
+    ("gray66" . "#A8A8A8")
+    ("gray67" . "#ABABAB")
+    ("gray68" . "#ADADAD")
+    ("gray69" . "#B0B0B0")
+    ("gray70" . "#B3B3B3")
+    ("gray71" . "#B5B5B5")
+    ("gray72" . "#B8B8B8")
+    ("gray73" . "#BABABA")
+    ("gray74" . "#BDBDBD")
+    ("gray75" . "#BFBFBF")
+    ("gray76" . "#C2C2C2")
+    ("gray77" . "#C4C4C4")
+    ("gray78" . "#C7C7C7")
+    ("gray79" . "#C9C9C9")
+    ("gray80" . "#CCCCCC")
+    ("gray81" . "#CFCFCF")
+    ("gray82" . "#D1D1D1")
+    ("gray83" . "#D4D4D4")
+    ("gray84" . "#D6D6D6")
+    ("gray85" . "#D9D9D9")
+    ("gray86" . "#DBDBDB")
+    ("gray87" . "#DEDEDE")
+    ("gray88" . "#E0E0E0")
+    ("gray89" . "#E3E3E3")
+    ("gray90" . "#E5E5E5")
+    ("gray91" . "#E8E8E8")
+    ("gray92" . "#EBEBEB")
+    ("gray93" . "#EDEDED")
+    ("gray94" . "#F0F0F0")
+    ("gray95" . "#F2F2F2")
+    ("gray96" . "#F5F5F5")
+    ("gray97" . "#F7F7F7")
+    ("gray98" . "#FAFAFA")
+    ("gray99" . "#FCFCFC")
+    ("gray100" . "#FFFFFF")
+    ("green" . "#00FF00")
+    ("green1" . "#00FF00")
+    ("green2" . "#00EE00")
+    ("green3" . "#00CD00")
+    ("green4" . "#008B00")
+    ("greenyellow" . "#ADFF2F")
+    ("grey" . "#BEBEBE")
+    ("grey0" . "#000000")
+    ("grey1" . "#030303")
+    ("grey2" . "#050505")
+    ("grey3" . "#080808")
+    ("grey4" . "#0A0A0A")
+    ("grey5" . "#0D0D0D")
+    ("grey6" . "#0F0F0F")
+    ("grey7" . "#121212")
+    ("grey8" . "#141414")
+    ("grey9" . "#171717")
+    ("grey10" . "#1A1A1A")
+    ("grey11" . "#1C1C1C")
+    ("grey12" . "#1F1F1F")
+    ("grey13" . "#212121")
+    ("grey14" . "#242424")
+    ("grey15" . "#262626")
+    ("grey16" . "#292929")
+    ("grey17" . "#2B2B2B")
+    ("grey18" . "#2E2E2E")
+    ("grey19" . "#303030")
+    ("grey20" . "#333333")
+    ("grey21" . "#363636")
+    ("grey22" . "#383838")
+    ("grey23" . "#3B3B3B")
+    ("grey24" . "#3D3D3D")
+    ("grey25" . "#404040")
+    ("grey26" . "#424242")
+    ("grey27" . "#454545")
+    ("grey28" . "#474747")
+    ("grey29" . "#4A4A4A")
+    ("grey30" . "#4D4D4D")
+    ("grey31" . "#4F4F4F")
+    ("grey32" . "#525252")
+    ("grey33" . "#545454")
+    ("grey34" . "#575757")
+    ("grey35" . "#595959")
+    ("grey36" . "#5C5C5C")
+    ("grey37" . "#5E5E5E")
+    ("grey38" . "#616161")
+    ("grey39" . "#636363")
+    ("grey40" . "#666666")
+    ("grey41" . "#696969")
+    ("grey42" . "#6B6B6B")
+    ("grey43" . "#6E6E6E")
+    ("grey44" . "#707070")
+    ("grey45" . "#737373")
+    ("grey46" . "#757575")
+    ("grey47" . "#787878")
+    ("grey48" . "#7A7A7A")
+    ("grey49" . "#7D7D7D")
+    ("grey50" . "#7F7F7F")
+    ("grey51" . "#828282")
+    ("grey52" . "#858585")
+    ("grey53" . "#878787")
+    ("grey54" . "#8A8A8A")
+    ("grey55" . "#8C8C8C")
+    ("grey56" . "#8F8F8F")
+    ("grey57" . "#919191")
+    ("grey58" . "#949494")
+    ("grey59" . "#969696")
+    ("grey60" . "#999999")
+    ("grey61" . "#9C9C9C")
+    ("grey62" . "#9E9E9E")
+    ("grey63" . "#A1A1A1")
+    ("grey64" . "#A3A3A3")
+    ("grey65" . "#A6A6A6")
+    ("grey66" . "#A8A8A8")
+    ("grey67" . "#ABABAB")
+    ("grey68" . "#ADADAD")
+    ("grey69" . "#B0B0B0")
+    ("grey70" . "#B3B3B3")
+    ("grey71" . "#B5B5B5")
+    ("grey72" . "#B8B8B8")
+    ("grey73" . "#BABABA")
+    ("grey74" . "#BDBDBD")
+    ("grey75" . "#BFBFBF")
+    ("grey76" . "#C2C2C2")
+    ("grey77" . "#C4C4C4")
+    ("grey78" . "#C7C7C7")
+    ("grey79" . "#C9C9C9")
+    ("grey80" . "#CCCCCC")
+    ("grey81" . "#CFCFCF")
+    ("grey82" . "#D1D1D1")
+    ("grey83" . "#D4D4D4")
+    ("grey84" . "#D6D6D6")
+    ("grey85" . "#D9D9D9")
+    ("grey86" . "#DBDBDB")
+    ("grey87" . "#DEDEDE")
+    ("grey88" . "#E0E0E0")
+    ("grey89" . "#E3E3E3")
+    ("grey90" . "#E5E5E5")
+    ("grey91" . "#E8E8E8")
+    ("grey92" . "#EBEBEB")
+    ("grey93" . "#EDEDED")
+    ("grey94" . "#F0F0F0")
+    ("grey95" . "#F2F2F2")
+    ("grey96" . "#F5F5F5")
+    ("grey97" . "#F7F7F7")
+    ("grey98" . "#FAFAFA")
+    ("grey99" . "#FCFCFC")
+    ("grey100" . "#FFFFFF")
+    ("honeydew" . "#F0FFF0")
+    ("honeydew1" . "#F0FFF0")
+    ("honeydew2" . "#E0EEE0")
+    ("honeydew3" . "#C1CDC1")
+    ("honeydew4" . "#838B83")
+    ("hotpink" . "#FF69B4")
+    ("hotpink1" . "#FF6EB4")
+    ("hotpink2" . "#EE6AA7")
+    ("hotpink3" . "#CD6090")
+    ("hotpink4" . "#8B3A62")
+    ("indianred" . "#CD5C5C")
+    ("indianred1" . "#FF6A6A")
+    ("indianred2" . "#EE6363")
+    ("indianred3" . "#CD5555")
+    ("indianred4" . "#8B3A3A")
+    ("ivory" . "#FFFFF0")
+    ("ivory1" . "#FFFFF0")
+    ("ivory2" . "#EEEEE0")
+    ("ivory3" . "#CDCDC1")
+    ("ivory4" . "#8B8B83")
+    ("khaki" . "#F0E68C")
+    ("khaki1" . "#FFF68F")
+    ("khaki2" . "#EEE685")
+    ("khaki3" . "#CDC673")
+    ("khaki4" . "#8B864E")
+    ("lavender" . "#E6E6FA")
+    ("lavenderblush" . "#FFF0F5")
+    ("lavenderblush1" . "#FFF0F5")
+    ("lavenderblush2" . "#EEE0E5")
+    ("lavenderblush3" . "#CDC1C5")
+    ("lavenderblush4" . "#8B8386")
+    ("lawngreen" . "#7CFC00")
+    ("lemonchiffon" . "#FFFACD")
+    ("lemonchiffon1" . "#FFFACD")
+    ("lemonchiffon2" . "#EEE9BF")
+    ("lemonchiffon3" . "#CDC9A5")
+    ("lemonchiffon4" . "#8B8970")
+    ("lightblue" . "#ADD8E6")
+    ("lightblue1" . "#BFEFFF")
+    ("lightblue2" . "#B2DFEE")
+    ("lightblue3" . "#9AC0CD")
+    ("lightblue4" . "#68838B")
+    ("lightcoral" . "#F08080")
+    ("lightcyan" . "#E0FFFF")
+    ("lightcyan1" . "#E0FFFF")
+    ("lightcyan2" . "#D1EEEE")
+    ("lightcyan3" . "#B4CDCD")
+    ("lightcyan4" . "#7A8B8B")
+    ("lightgoldenrod" . "#EEDD82")
+    ("lightgoldenrod1" . "#FFEC8B")
+    ("lightgoldenrod2" . "#EEDC82")
+    ("lightgoldenrod3" . "#CDBE70")
+    ("lightgoldenrod4" . "#8B814C")
+    ("lightgoldenrodyellow" . "#FAFAD2")
+    ("lightgray" . "#D3D3D3")
+    ("lightgreen" . "#90EE90")
+    ("lightgrey" . "#D3D3D3")
+    ("lightpink" . "#FFB6C1")
+    ("lightpink1" . "#FFAEB9")
+    ("lightpink2" . "#EEA2AD")
+    ("lightpink3" . "#CD8C95")
+    ("lightpink4" . "#8B5F65")
+    ("lightsalmon" . "#FFA07A")
+    ("lightsalmon1" . "#FFA07A")
+    ("lightsalmon2" . "#EE9572")
+    ("lightsalmon3" . "#CD8162")
+    ("lightsalmon4" . "#8B5742")
+    ("lightseagreen" . "#20B2AA")
+    ("lightskyblue" . "#87CEFA")
+    ("lightskyblue1" . "#B0E2FF")
+    ("lightskyblue2" . "#A4D3EE")
+    ("lightskyblue3" . "#8DB6CD")
+    ("lightskyblue4" . "#607B8B")
+    ("lightslateblue" . "#8470FF")
+    ("lightslategray" . "#778899")
+    ("lightslategrey" . "#778899")
+    ("lightsteelblue" . "#B0C4DE")
+    ("lightsteelblue1" . "#CAE1FF")
+    ("lightsteelblue2" . "#BCD2EE")
+    ("lightsteelblue3" . "#A2B5CD")
+    ("lightsteelblue4" . "#6E7B8B")
+    ("lightyellow" . "#FFFFE0")
+    ("lightyellow1" . "#FFFFE0")
+    ("lightyellow2" . "#EEEED1")
+    ("lightyellow3" . "#CDCDB4")
+    ("lightyellow4" . "#8B8B7A")
+    ("limegreen" . "#32CD32")
+    ("linen" . "#FAF0E6")
+    ("magenta" . "#FF00FF")
+    ("magenta1" . "#FF00FF")
+    ("magenta2" . "#EE00EE")
+    ("magenta3" . "#CD00CD")
+    ("magenta4" . "#8B008B")
+    ("maroon" . "#B03060")
+    ("maroon1" . "#FF34B3")
+    ("maroon2" . "#EE30A7")
+    ("maroon3" . "#CD2990")
+    ("maroon4" . "#8B1C62")
+    ("mediumaquamarine" . "#66CDAA")
+    ("mediumblue" . "#0000CD")
+    ("mediumorchid" . "#BA55D3")
+    ("mediumorchid1" . "#E066FF")
+    ("mediumorchid2" . "#D15FEE")
+    ("mediumorchid3" . "#B452CD")
+    ("mediumorchid4" . "#7A378B")
+    ("mediumpurple" . "#9370DB")
+    ("mediumpurple1" . "#AB82FF")
+    ("mediumpurple2" . "#9F79EE")
+    ("mediumpurple3" . "#8968CD")
+    ("mediumpurple4" . "#5D478B")
+    ("mediumseagreen" . "#3CB371")
+    ("mediumslateblue" . "#7B68EE")
+    ("mediumspringgreen" . "#00FA9A")
+    ("mediumturquoise" . "#48D1CC")
+    ("mediumvioletred" . "#C71585")
+    ("midnightblue" . "#191970")
+    ("mintcream" . "#F5FFFA")
+    ("mistyrose" . "#FFE4E1")
+    ("mistyrose1" . "#FFE4E1")
+    ("mistyrose2" . "#EED5D2")
+    ("mistyrose3" . "#CDB7B5")
+    ("mistyrose4" . "#8B7D7B")
+    ("moccasin" . "#FFE4B5")
+    ("navajowhite" . "#FFDEAD")
+    ("navajowhite1" . "#FFDEAD")
+    ("navajowhite2" . "#EECFA1")
+    ("navajowhite3" . "#CDB38B")
+    ("navajowhite4" . "#8B795E")
+    ("navy" . "#000080")
+    ("navyblue" . "#000080")
+    ("oldlace" . "#FDF5E6")
+    ("olivedrab" . "#6B8E23")
+    ("olivedrab1" . "#C0FF3E")
+    ("olivedrab2" . "#B3EE3A")
+    ("olivedrab3" . "#9ACD32")
+    ("olivedrab4" . "#698B22")
+    ("orange" . "#FFA500")
+    ("orange1" . "#FFA500")
+    ("orange2" . "#EE9A00")
+    ("orange3" . "#CD8500")
+    ("orange4" . "#8B5A00")
+    ("orangered" . "#FF4500")
+    ("orangered1" . "#FF4500")
+    ("orangered2" . "#EE4000")
+    ("orangered3" . "#CD3700")
+    ("orangered4" . "#8B2500")
+    ("orchid" . "#DA70D6")
+    ("orchid1" . "#FF83FA")
+    ("orchid2" . "#EE7AE9")
+    ("orchid3" . "#CD69C9")
+    ("orchid4" . "#8B4789")
+    ("palegoldenrod" . "#EEE8AA")
+    ("palegreen" . "#98FB98")
+    ("palegreen1" . "#9AFF9A")
+    ("palegreen2" . "#90EE90")
+    ("palegreen3" . "#7CCD7C")
+    ("palegreen4" . "#548B54")
+    ("paleturquoise" . "#AFEEEE")
+    ("paleturquoise1" . "#BBFFFF")
+    ("paleturquoise2" . "#AEEEEE")
+    ("paleturquoise3" . "#96CDCD")
+    ("paleturquoise4" . "#668B8B")
+    ("palevioletred" . "#DB7093")
+    ("palevioletred1" . "#FF82AB")
+    ("palevioletred2" . "#EE799F")
+    ("palevioletred3" . "#CD6889")
+    ("palevioletred4" . "#8B475D")
+    ("papayawhip" . "#FFEFD5")
+    ("peachpuff" . "#FFDAB9")
+    ("peachpuff1" . "#FFDAB9")
+    ("peachpuff2" . "#EECBAD")
+    ("peachpuff3" . "#CDAF95")
+    ("peachpuff4" . "#8B7765")
+    ("peru" . "#CD853F")
+    ("pink" . "#FFC0CB")
+    ("pink1" . "#FFB5C5")
+    ("pink2" . "#EEA9B8")
+    ("pink3" . "#CD919E")
+    ("pink4" . "#8B636C")
+    ("plum" . "#DDA0DD")
+    ("plum1" . "#FFBBFF")
+    ("plum2" . "#EEAEEE")
+    ("plum3" . "#CD96CD")
+    ("plum4" . "#8B668B")
+    ("powderblue" . "#B0E0E6")
+    ("purple" . "#A020F0")
+    ("purple1" . "#9B30FF")
+    ("purple2" . "#912CEE")
+    ("purple3" . "#7D26CD")
+    ("purple4" . "#551A8B")
+    ("red" . "#FF0000")
+    ("red1" . "#FF0000")
+    ("red2" . "#EE0000")
+    ("red3" . "#CD0000")
+    ("red4" . "#8B0000")
+    ("rosybrown" . "#BC8F8F")
+    ("rosybrown1" . "#FFC1C1")
+    ("rosybrown2" . "#EEB4B4")
+    ("rosybrown3" . "#CD9B9B")
+    ("rosybrown4" . "#8B6969")
+    ("royalblue" . "#4169E1")
+    ("royalblue1" . "#4876FF")
+    ("royalblue2" . "#436EEE")
+    ("royalblue3" . "#3A5FCD")
+    ("royalblue4" . "#27408B")
+    ("saddlebrown" . "#8B4513")
+    ("salmon" . "#FA8072")
+    ("salmon1" . "#FF8C69")
+    ("salmon2" . "#EE8262")
+    ("salmon3" . "#CD7054")
+    ("salmon4" . "#8B4C39")
+    ("sandybrown" . "#F4A460")
+    ("seagreen" . "#2E8B57")
+    ("seagreen1" . "#54FF9F")
+    ("seagreen2" . "#4EEE94")
+    ("seagreen3" . "#43CD80")
+    ("seagreen4" . "#2E8B57")
+    ("seashell" . "#FFF5EE")
+    ("seashell1" . "#FFF5EE")
+    ("seashell2" . "#EEE5DE")
+    ("seashell3" . "#CDC5BF")
+    ("seashell4" . "#8B8682")
+    ("sienna" . "#A0522D")
+    ("sienna1" . "#FF8247")
+    ("sienna2" . "#EE7942")
+    ("sienna3" . "#CD6839")
+    ("sienna4" . "#8B4726")
+    ("skyblue" . "#87CEEB")
+    ("skyblue1" . "#87CEFF")
+    ("skyblue2" . "#7EC0EE")
+    ("skyblue3" . "#6CA6CD")
+    ("skyblue4" . "#4A708B")
+    ("slateblue" . "#6A5ACD")
+    ("slateblue1" . "#836FFF")
+    ("slateblue2" . "#7A67EE")
+    ("slateblue3" . "#6959CD")
+    ("slateblue4" . "#473C8B")
+    ("slategray" . "#708090")
+    ("slategray1" . "#C6E2FF")
+    ("slategray2" . "#B9D3EE")
+    ("slategray3" . "#9FB6CD")
+    ("slategray4" . "#6C7B8B")
+    ("slategrey" . "#708090")
+    ("snow" . "#FFFAFA")
+    ("snow1" . "#FFFAFA")
+    ("snow2" . "#EEE9E9")
+    ("snow3" . "#CDC9C9")
+    ("snow4" . "#8B8989")
+    ("springgreen" . "#00FF7F")
+    ("springgreen1" . "#00FF7F")
+    ("springgreen2" . "#00EE76")
+    ("springgreen3" . "#00CD66")
+    ("springgreen4" . "#008B45")
+    ("steelblue" . "#4682B4")
+    ("steelblue1" . "#63B8FF")
+    ("steelblue2" . "#5CACEE")
+    ("steelblue3" . "#4F94CD")
+    ("steelblue4" . "#36648B")
+    ("tan" . "#D2B48C")
+    ("tan1" . "#FFA54F")
+    ("tan2" . "#EE9A49")
+    ("tan3" . "#CD853F")
+    ("tan4" . "#8B5A2B")
+    ("thistle" . "#D8BFD8")
+    ("thistle1" . "#FFE1FF")
+    ("thistle2" . "#EED2EE")
+    ("thistle3" . "#CDB5CD")
+    ("thistle4" . "#8B7B8B")
+    ("tomato" . "#FF6347")
+    ("tomato1" . "#FF6347")
+    ("tomato2" . "#EE5C42")
+    ("tomato3" . "#CD4F39")
+    ("tomato4" . "#8B3626")
+    ("turquoise" . "#40E0D0")
+    ("turquoise1" . "#00F5FF")
+    ("turquoise2" . "#00E5EE")
+    ("turquoise3" . "#00C5CD")
+    ("turquoise4" . "#00868B")
+    ("violet" . "#EE82EE")
+    ("violetred" . "#D02090")
+    ("violetred1" . "#FF3E96")
+    ("violetred2" . "#EE3A8C")
+    ("violetred3" . "#CD3278")
+    ("violetred4" . "#8B2252")
+    ("wheat" . "#F5DEB3")
+    ("wheat1" . "#FFE7BA")
+    ("wheat2" . "#EED8AE")
+    ("wheat3" . "#CDBA96")
+    ("wheat4" . "#8B7E66")
+    ("whitesmoke" . "#F5F5F5")
+    ("yellow" . "#FFFF00")
+    ("yellow1" . "#FFFF00")
+    ("yellow2" . "#EEEE00")
+    ("yellow3" . "#CDCD00")
+    ("yellow4" . "#8B8B00")
+    ("yellowgreen" . "#9ACD32"))
+  "Alist of R colors.
+Each entry should have the form (COLOR-NAME . HEXADECIMAL-COLOR)."
+  :group 'rainbow)
+(defcustom rainbow-r-colors-major-mode-list
+  '(ess-mode)
+  "List of major mode where R colors are enabled when
+`rainbow-r-colors' is set to auto."
+  :group 'rainbow)
+
+(defcustom rainbow-r-colors 'auto
+  "When to enable R colors.
+If set to t, the R colors will be enabled.  If set to nil, the
+R colors will not be enabled.  If set to auto, the R colors
+will be enabled if a major mode has been detected from the
+`rainbow-r-colors-major-mode-list'."
+  :group 'rainbow)
+
+
+;; Functions
+(defun rainbow-colorize-match (color &optional match)
+  "Return a matched string propertized with a face whose
+background is COLOR. The foreground is computed using
+`rainbow-color-luminance', and is either white or black."
+  (let ((match (or match 0)))
+    (put-text-property
+     (match-beginning match) (match-end match)
+     'face `((:foreground ,(if (> 0.5 (rainbow-x-color-luminance color))
+                               "white" "black"))
+             (:background ,color)))))
+
+(defun rainbow-colorize-itself (&optional match)
+  "Colorize a match with itself."
+  (rainbow-colorize-match (match-string-no-properties (or match 0)) match))
+
+(defun rainbow-colorize-hexadecimal-without-sharp ()
+  "Colorize an hexadecimal colors and prepend # to it."
+  (rainbow-colorize-match (concat "#" (match-string-no-properties 1))))
+
+(defun rainbow-colorize-by-assoc (assoc-list)
+  "Colorize a match with its association from ASSOC-LIST."
+  (rainbow-colorize-match (cdr (assoc-string (match-string-no-properties 0)
+                                             assoc-list t))))
+
+(defun rainbow-rgb-relative-to-absolute (number)
+  "Convert a relative NUMBER to absolute. If NUMBER is absolute, return NUMBER.
+This will convert \"80 %\" to 204, \"100 %\" to 255 but \"123\" to \"123\"."
+  (let ((string-length (- (length number) 1)))
+    ;; Is this a number with %?
+    (if (eq (elt number string-length) ?%)
+        (/ (* (string-to-number (substring number 0 string-length)) 255) 100)
+      (string-to-number number))))
+
+(defun rainbow-colorize-hsl ()
+  "Colorize a match with itself."
+  (let ((h (/ (string-to-number (match-string-no-properties 1)) 360.0))
+        (s (/ (string-to-number (match-string-no-properties 2)) 100.0))
+        (l (/ (string-to-number (match-string-no-properties 3)) 100.0)))
+    (rainbow-colorize-match
+     (multiple-value-bind (r g b)
+        (color-hsl-to-rgb h s l)
+       (format "#%02X%02X%02X" (* r 255) (* g 255) (* b 255))))))
+
+(defun rainbow-colorize-rgb ()
+  "Colorize a match with itself."
+  (let ((r (rainbow-rgb-relative-to-absolute (match-string-no-properties 1)))
+        (g (rainbow-rgb-relative-to-absolute (match-string-no-properties 2)))
+        (b (rainbow-rgb-relative-to-absolute (match-string-no-properties 3))))
+    (rainbow-colorize-match (format "#%02X%02X%02X" r g b))))
+
+(defun rainbow-colorize-rgb-float ()
+  "Colorize a match with itself, with relative value."
+  (let ((r (* (string-to-number (match-string-no-properties 1)) 255.0))
+        (g (* (string-to-number (match-string-no-properties 2)) 255.0))
+        (b (* (string-to-number (match-string-no-properties 3)) 255.0)))
+    (rainbow-colorize-match (format "#%02X%02X%02X" r g b))))
+
+(defun rainbow-colorize-ansi ()
+  "Return a matched string propertized with ansi color face."
+  (let ((xterm-color? (featurep 'xterm-color))
+        (string (match-string-no-properties 0))
+        color)
+    (save-match-data
+      (let* ((replaced (concat
+                        (replace-regexp-in-string
+                         "^\\(\\\\[eE]\\|\\\\033\\|\\\\x1[bB]\\)"
+                         "\033" string) "x"))
+             xterm-color-current
+             ansi-color-context
+             (applied (funcall (if xterm-color?
+                                   'xterm-color-filter
+                                 'ansi-color-apply)
+                               replaced))
+             (face-property (get-text-property
+                             0
+                             (if xterm-color? 'face 'font-lock-face)
+                             applied)))
+        (unless (listp (car face-property))
+          (setq face-property (list face-property)))
+        (setq color (funcall (if xterm-color? 'cadr 'cdr)
+                             (or (assq (if xterm-color?
+                                           :foreground
+                                         'foreground-color)
+                                       face-property)
+                                 (assq (if xterm-color?
+                                           :background
+                                         'background-color)
+                                       face-property))))))
+    (when color
+      (rainbow-colorize-match color))))
+
+(defun rainbow-color-luminance (red green blue)
+  "Calculate the luminance of color composed of RED, BLUE and GREEN.
+Return a value between 0 and 1."
+  (/ (+ (* .2126 red) (* .7152 green) (* .0722 blue)) 256))
+
+(defun rainbow-x-color-luminance (color)
+  "Calculate the luminance of a color string (e.g. \"#ffaa00\", \"blue\").
+Return a value between 0 and 1."
+  (let* ((values (x-color-values color))
+        (r (/ (car values) 256.0))
+         (g (/ (cadr values) 256.0))
+        (b (/ (caddr values) 256.0)))
+    (rainbow-color-luminance r g b)))
+
+(defun rainbow-turn-on ()
+  "Turn on raibow-mode."
+  (font-lock-add-keywords nil
+                          rainbow-hexadecimal-colors-font-lock-keywords)
+  ;; Activate X colors?
+  (when (or (eq rainbow-x-colors t)
+            (and (eq rainbow-x-colors 'auto)
+                 (memq major-mode rainbow-x-colors-major-mode-list)))
+    (font-lock-add-keywords nil
+                            rainbow-x-colors-font-lock-keywords))
+  ;; Activate LaTeX colors?
+  (when (or (eq rainbow-latex-colors t)
+            (and (eq rainbow-latex-colors 'auto)
+                 (memq major-mode rainbow-latex-colors-major-mode-list)))
+    (font-lock-add-keywords nil
+                            rainbow-latex-rgb-colors-font-lock-keywords))
+  ;; Activate ANSI colors?
+  (when (or (eq rainbow-ansi-colors t)
+            (and (eq rainbow-ansi-colors 'auto)
+                 (memq major-mode rainbow-ansi-colors-major-mode-list)))
+    (font-lock-add-keywords nil
+                            rainbow-ansi-colors-font-lock-keywords))
+  ;; Activate HTML colors?
+  (when (or (eq rainbow-html-colors t)
+            (and (eq rainbow-html-colors 'auto)
+                 (memq major-mode rainbow-html-colors-major-mode-list)))
+    (setq rainbow-html-colors-font-lock-keywords
+          `((,(regexp-opt (mapcar 'car rainbow-html-colors-alist) 'words)
+             (0 (rainbow-colorize-by-assoc rainbow-html-colors-alist)))))
+    (font-lock-add-keywords nil
+                            `(,@rainbow-html-colors-font-lock-keywords
+                              ,@rainbow-html-rgb-colors-font-lock-keywords)))
+  ;; Activate R colors?
+  (when (or (eq rainbow-r-colors t)
+            (and (eq rainbow-r-colors 'auto)
+                 (memq major-mode rainbow-r-colors-major-mode-list)))
+    (setq rainbow-r-colors-font-lock-keywords
+          `((,(regexp-opt (mapcar 'car rainbow-r-colors-alist) 'words)
+             (0 (rainbow-colorize-by-assoc rainbow-r-colors-alist)))))
+    (font-lock-add-keywords nil
+                            rainbow-r-colors-font-lock-keywords
+                            )))
+
+(defun rainbow-turn-off ()
+  "Turn off rainbow-mode."
+  (font-lock-remove-keywords
+   nil
+   `(,@rainbow-hexadecimal-colors-font-lock-keywords
+     ,@rainbow-x-colors-font-lock-keywords
+     ,@rainbow-latex-rgb-colors-font-lock-keywords
+     ,@rainbow-r-colors-font-lock-keywords
+     ,@rainbow-html-colors-font-lock-keywords
+     ,@rainbow-html-rgb-colors-font-lock-keywords)))
+
+;;;###autoload
+(define-minor-mode rainbow-mode
+  "Colorize strings that represent colors.
+This will fontify with colors the string like \"#aabbcc\" or \"blue\"."
+  :lighter " Rbow"
+  (progn
+    (if rainbow-mode
+        (rainbow-turn-on)
+      (rainbow-turn-off))))
+
+(provide 'rainbow-mode)
+
+;;; rainbow-mode.el ends here
diff --git a/packages/register-list/register-list.el b/packages/register-list/register-list.el
new file mode 100755 (executable)
index 0000000..5e622b9
--- /dev/null
@@ -0,0 +1,664 @@
+;;; register-list.el ---  Interactively list/edit registers
+;;
+;; Copyright (C) 2011  Free Software Foundation, Inc.
+;;
+;; Filename: register-list.el
+;; Author: Bastien Guerry <bzg AT altern DOT org>
+;; Maintainer: Bastien Guerry <bzg AT altern DOT org>
+;; Keywords: register
+;; Description: List and edit the register
+;; Version: 0.1
+;;
+;; 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, 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, write to the Free Software
+;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+;;
+;; This is not part of GNU Emacs.
+;;
+;;; Commentary:
+;;
+;; This library lets you list and edit registers.  M-x `register-list'
+;; displays a list of currently set registers.
+
+;; This list is similar to that of `bookmark-bmenu-list': you can set
+;; registers to delete with `d' and delete them with `x'.  If you want
+;; to concatenate the content of registers, mark them with `c' and
+;; process with `x'.
+
+;; You can also edit the register's key with `k' and its value with `v'
+;; Hitting RET on a value string will jump to the register's location or
+;; add the text to the kill ring.  Hitting RET on a register's type will
+;; restrict the list to registers of this type.
+;;
+;; Put this file into your load-path and the following into your ~/.emacs:
+;;   (require 'register-list)
+;; 
+;;; Todo:
+;; 
+;; - better sorting (interactive)
+;; - overlay register when deleting duplicates
+;; - more useful message when selecting a type
+;; - concatenation -> merge
+;; - support merging rectangles
+;; - add numbers when "merging" them
+;; - C-k to kill a register
+;; 
+;;; History: 
+;; 
+;; - [2008-03-09] Released v0.1
+;;   http://article.gmane.org/gmane.emacs.sources/2832
+;; 
+;;; Code:
+
+(eval-when-compile
+  (require 'cl))
+
+(defgroup register-list nil
+  "Interactively list/edit registers."
+  :tag "Register List"
+  :group 'register)
+
+(defcustom register-list-string-width nil
+  "Maximum width for the register value string."
+  :type 'integer
+  :group 'register-list)
+
+(defcustom register-list-preserve-fontification nil
+  "Non-nil means keep the value strings fontified."
+  :type 'integer
+  :group 'register-list)
+
+(defcustom register-list-default-types "[FNMRSW]"
+  "A regexp matching the default register types to list.
+
+The available types are: [F]rame [N]umber [M]arkers [R]ectangle
+\[S]string and [W]window.  [FW] will list markers, frame and
+window configuration, [SM] will list strings and markers, etc."
+  :type 'regexp
+  :group 'register-list)
+
+(defface register-list-off-rectangle
+  '((t (:inverse-video t)))
+  "Face used to show what falls out of a rectangle."
+  :group 'register-list)
+
+;;; Variables, map, mode
+
+(defvar register-list-mode-map
+  (let ((map (make-keymap)))
+    (suppress-keymap map t)
+    (define-key map "q" 'quit-window)
+    (define-key map "Q" 'register-list-quit)
+    (define-key map [(tab)] 'register-list-tab)
+    (define-key map "d" 'register-list-mark-delete)
+    (define-key map "D" 'register-list-delete-duplicates)
+    (define-key map "c" 'register-list-mark-concat)
+    (define-key map "x" 'register-list-execute)
+    (define-key map "+" 'register-list-increment-key)
+    (define-key map "-" 'register-list-decrement-key)
+    (define-key map "e" 'register-list-edit-key)
+    (define-key map "E" 'register-list-edit-value)
+    (define-key map "f" 'register-list-toggle-fontification)
+    (define-key map " " 'next-line)
+    (define-key map "n" 'next-line)
+    (define-key map "p" 'previous-line)
+    (define-key map "u" 'register-list-unmark)
+    (define-key map "U" 'register-list-unmark-all)
+    (define-key map "g" 'register-list-refresh)
+    (define-key map "F"
+      (lambda () (interactive) (register-list-refresh "F")))
+    (define-key map "N"
+      (lambda () (interactive) (register-list-refresh "N")))
+    (define-key map "M"
+      (lambda () (interactive) (register-list-refresh "M")))
+    (define-key map "R"
+      (lambda () (interactive) (register-list-refresh "R")))
+    (define-key map "S"
+      (lambda () (interactive) (register-list-refresh "S")))
+    (define-key map "W"
+      (lambda () (interactive) (register-list-refresh "W")))
+    (define-key map "G"
+      (lambda() (interactive) (register-list-refresh "[FNMRSW]")))
+    (define-key map "?" 'describe-mode)
+
+    (define-key map [follow-link] 'mouse-face)
+    (define-key map [mouse-2] 'register-list-call-handler-at-mouse)
+    (define-key map [(return)] 'register-list-call-handler-at-point)
+    map)
+  "Keymap for `register-list-mode'.")
+(defvar register-list-edit-value-mode-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map (kbd "C-c C-c") 'register-list-send-value)
+    map)
+  "Keymap for editing the value of a register.")
+(defvar register-list-current-type nil
+  "The current type for the register menu.")
+(defvar register-list-current-fontification nil
+  "Whether the value strings are currently fontified.")
+(defvar register-list-temp-pos nil
+  "Temporary store the line the cursor is on.")
+(defvar register-list-temp-window-cfg nil
+  "Temporary window configuration.
+Saved before editing the value of a register.")
+(defvar register-list-temp-register nil
+  "Temporary value of the edited register.")
+(defvar register-list-edit-value-type nil
+  "The type of the edited value.")
+(defvar register-list-rectangle-column nil
+  "End of a rectangle line.")
+
+;;; Marks
+
+(defmacro register-list-preserve-pos (force-line &rest body)
+  "Preserve the position and execute BODY.
+If FORCE-LINE is non-nil, force moving to this line."
+  `(let ((line (line-number-at-pos (point)))
+        (col (current-column)))
+     ,@body
+     (goto-char (point-min))
+     (line-move ,(or (eval force-line) '(1- line)) t)
+     (line-move-to-column col)))
+
+(defmacro register-list-map-lines (let-vals &rest body)
+  "Execute BODY inside a let form with LET-VALS on all lines."
+  `(save-excursion
+     (goto-char (point-min))
+     (while (not (eobp))
+       (let* ,let-vals
+        ,@body
+        (forward-line 1)))))
+
+(defvar register-list-concat-separator "\n"
+  "Default separator when merging.")
+
+(defvar register-list-concat-key-select 'last)
+
+;; FIXME skip rectangle (or handle them separatly
+(defun register-list-execute nil
+  "Delete/concatenate registers marker for deletion/concatenation."
+  (interactive)
+  (let ((line (line-number-at-pos (point))) newreg concat)
+    (goto-char (point-min))
+    (while (re-search-forward "^[DC]" nil t)
+      (let* ((reg-point (next-single-property-change (point) 'register))
+            (reg (get-text-property reg-point 'register)))
+       (if (string= (match-string 0) "D")
+           (setq register-alist (delete reg register-alist))
+         (push reg concat))))
+    (when concat
+      ;; set the new register 
+      (setq newreg 
+           (cons (cond ((eq register-list-concat-key-select 'first)
+                        (caar concat))
+                       ((eq register-list-concat-key-select 'last)
+                        (caar (reverse concat)))
+                       (t (read-char 
+                           (format "Key [%s]: " 
+                                   (mapconcat (lambda(x) (char-to-string (car x)))
+                                              concat "")))))
+                 (mapconcat (lambda (i) (cdr i)) (reverse concat)
+                            (cond ((eq register-list-concat-separator 'ask)
+                                   (read-from-minibuffer "Separator: "))
+                                  ((stringp register-list-concat-separator) 
+                                   register-list-concat-separator)
+                                  (t "")))))
+      ;; delete old registers
+      (dolist (r concat)
+       (setq register-alist (delete r register-alist)))
+      ;; push the new register
+      (push newreg register-alist))
+    (register-list register-list-current-type
+                  register-list-current-fontification)
+    ;; move the cursor back
+    (goto-char (point-min))
+    (line-move (- line 2) t)))
+
+(defun register-list-set-mark (mark)
+  "Set mark at the beginning of the line."
+  (let ((inhibit-read-only t))
+    (beginning-of-line)
+    (unless (get-text-property (point) 'intangible)
+      (delete-char 1)
+      (save-excursion (insert mark))
+      (unless (save-excursion (forward-line 1) (eobp))
+       (forward-line 1)))))
+
+(defun register-list-mark-delete nil
+  "Mark the register at point for deletion."
+  (interactive)
+  (register-list-set-mark "D"))
+
+(defun register-list-mark-concat nil
+  "Mark the register at point for further concatenation."
+  (interactive)
+  (register-list-set-mark "C"))
+
+(defun register-list-unmark nil
+  "Unmark the register at point."
+  (interactive)
+  (register-list-set-mark " "))
+
+(defun register-list-unmark-all nil
+  "Unmark all registers."
+  (interactive)
+  (let ((inhibit-read-only t))
+    (save-excursion
+      (goto-char (point-min))
+      (forward-line 1)
+      (while (and (forward-line 1) (not (eobp)))
+       (delete-char 1)
+       (insert " ")))))
+
+(defun register-list-refresh (&optional type)
+  "Refresh the list of registers.
+An optional TYPE argument restrict the list these types."
+  (interactive "P")
+  (register-list-preserve-pos
+   (1- (line-number-at-pos (point)))
+   (register-list (or type register-list-current-type)
+                 register-list-current-fontification)))
+
+(defun register-list-quit nil
+  "Quit the register list and kill its buffer."
+  (interactive)
+  (kill-buffer (current-buffer)))
+
+(defun register-list-toggle-fontification nil
+  "Toggle fontification of the value strings."
+  (interactive)
+  (register-list-preserve-pos
+   nil
+   (setq register-list-current-fontification
+        (not register-list-current-fontification))
+   (register-list register-list-current-type
+                 register-list-current-fontification)))
+
+(define-derived-mode register-list-mode special-mode "Register List"
+  "Major mode for editing a list of register keys.
+
+Each line is of the form:
+
+\[Delete-flag] Key Type Value
+
+The leftmost column displays a `D' character if the register key
+is flagged for further deletion.  You can add such flag by hitting
+\\[register-list-delete].
+
+The Key column displays the character used for this register.
+Hitting \\[register-list-call-handler-at-point] on the key will
+prompt for a replacement.
+
+The Type column displays the type of the register, either [F]rame
+\[N]umber [M]arkers [R]ectangle [S]string or [W]window.  Hitting
+\\[register-list-call-handler-at-point] on this column will
+restrict the register list to this type of registers.  To quickly
+list a specific type, hit the type character among [FNMRSW].
+
+The Value column displays information about the value of the
+register: either a string if the register's value is a string, a
+number or a rectangle, or the location of the marker or some
+information about window and frame configuration.  Hitting
+\\[register-list-call-handler-at-point] on this column will
+copy the string to the kill ring or jump to the location.
+
+\\[register-list-edit-key] -- edit the key for this register.
+\\[register-list-edit-value] -- edit the value for this register.
+\\[register-list-increment-key] -- increment key at point.
+\\[register-list-decrement-key] -- decrement key at point.
+\\[register-list-mark-delete] -- mark the register at point for deletion.
+\\[register-list-mark-concat] -- mark the register at point for concatenation.
+\\[register-list-unmark] -- unmark the register at point.
+\\[register-list-unmark-all] -- unmark all registers.
+\\[register-list-execute] -- execute deletions or concatenations.
+\\[register-list-toggle-fontification] -- toggle fontification of value strings.
+\\[register-list-refresh] -- refresh the register menu display.
+\\[register-list-tab] -- cycle between the key, the type and the value.
+\\[register-list-quit] -- quit the register menu."
+  (setq truncate-lines t)
+  (setq buffer-read-only t))
+
+;;\\[register-list-edit-key-or-value] -- edit the key for this register.
+
+(defun register-list-tab nil
+  "Cycle between the register key, the type and the value."
+  (interactive)
+  (let* ((eol (save-excursion (end-of-line) (point)))
+        (m-f-chg (next-single-property-change (point) 'mouse-face nil eol))
+        (m-f-pos (text-property-any m-f-chg eol 'mouse-face 'highlight))
+        (r-f-chg (next-single-property-change (point) 'register nil eol))
+        (r-f-prop (get-text-property r-f-chg 'register)) point)
+    (cond (r-f-prop (goto-char r-f-chg))
+         (m-f-pos (goto-char m-f-pos))
+         (t  (beginning-of-line 2)
+             (if (setq point (next-single-property-change
+                              (point) 'register))
+                 (goto-char point))))))
+
+;;;###autoload
+(defun register-list (&optional type fontify)
+  "Display a list of registers.
+An optional argument TYPE defines a regexp to restrict the
+register menu to.  A second optional argument FONTIFICATION
+decides if the display preserves original fontification for
+values.
+
+The default types are defined in `register-list-default-types',
+which see.
+
+The list is displayed in a buffer named `*Register List*' in
+`register-list-mode', which see."
+  (interactive)
+  (switch-to-buffer (get-buffer-create "*Register List*"))
+  (let ((inhibit-read-only t) reg-alist)
+    (setq type (or type register-list-default-types))
+    (setq register-list-current-fontification
+         (or fontify register-list-preserve-fontification))
+    (setq register-list-current-type type)
+
+    (setq register-alist ;; TODO better sorting.
+         (sort register-alist (lambda (a b) (< (car a) (car b)))))
+    (erase-buffer)
+    ;; FIXME: Why `intangible'?
+    (insert (concat (propertize "% Key  Type  Value\n"
+                               'face 'font-lock-type-face
+                               'intangible t) ;; 'front-sticky t)
+                   (propertize "- ---  ----  -----\n"
+                               'intangible t
+                               'face 'font-lock-comment-delimiter-face)))
+    (mapc
+     (lambda (register)
+       (let* ((key (char-to-string (car register)))
+             (val (cdr register))
+             (typ (register-list-get-type val))
+             (hdl (register-list-get-handler register typ)))
+        (when (string-match typ type)
+          (insert
+           (format "  %s    %s   %s\n"
+                   (propertize key 'face 'bold 'register register
+                               'register-handler hdl)
+                   (propertize (concat "[" typ "]")
+                               'mouse-face 'highlight
+                               'help-echo "mouse-2: restrict to this type"
+                               'register-handler
+                               `(lambda()
+                                  (register-list-preserve-pos nil
+                                   (register-list
+                                    ,typ ,register-list-current-fontification))))
+                   (propertize (register-list-prepare-string
+                                (register-list-value-to-string val typ) fontify)
+                               'mouse-face 'highlight
+                               'register-handler hdl
+                               'help-echo "mouse-2: use this register"))))))
+     register-alist))
+  (register-list-mode)
+  (goto-char (point-min))
+  (line-move 2 t)
+  (if (called-interactively-p)
+      (message "[d]elete  [e/E]dit key/value  RET:jump/copy  [FNRSW]:select type  ?:help")
+    (message "Register type: %s" register-list-current-type)))
+
+(defun register-list-call-handler-at-mouse (ev)
+  "Call the register handler at point.
+See `register-list-call-handler-at-point' for details."
+  (interactive "e")
+  (mouse-set-point ev)
+  (register-list-call-handler-at-point))
+
+(defun register-list-call-handler-at-point nil
+  "Call the register handler at point.
+If the point is on a register key, edit the key.  If the point is
+on a register type, rebuild the list restricting to registers of
+this type.  If the point is on a register value, either jump to
+the register or copy its value into the kill ring."
+  (interactive)
+  (let ((handler (get-text-property (point) 'register-handler)))
+    (if handler
+       (condition-case nil
+           (funcall (get-text-property (point) 'register-handler))
+         (error (message "Can't jump to register location"))))))
+
+(defun register-list-get-handler (register type)
+  "Return a handler function for a REGISTER with TYPE."
+  (cond ((string= "?" type)
+        `(lambda() (message "No action with this type")))
+       ((string= "S" type)
+        `(lambda()
+           (kill-new ,(cdr register))
+           (message "String copied to the kill ring")))
+       ((string= "N" type)
+        `(lambda()
+           (kill-new ,(number-to-string (cdr register)))
+           (message "Number copied to the kill ring as a string")))
+       ((string= "R" type)
+        `(lambda()
+           (kill-new ,(mapconcat 'identity (cdr register) "\n"))
+           (message "Rectangle copied to the kill ring")))
+       ((string-match "[FMW]" type)
+        `(lambda()
+           (jump-to-register ,(car register))
+           (message (format "Jumped to register %s"
+                            ,(char-to-string (car register))))))))
+
+(defun register-list-value-to-string (value type)
+  "Convert a register VALUE into a string according to its TYPE."
+  (cond ((string= "M" type)
+        (cond ((marker-position value)
+               (format "[Marker at point %d in buffer %s]"
+                       (marker-position value)
+                       (buffer-name (marker-buffer value))))
+              ((marker-buffer value)
+               (format "[Marker in buffer %s]"
+                       (buffer-name (marker-buffer value))))
+              (t (format "[Marker gone?]"))))
+       ((string= "N" type)
+        (format "Number: %s" (number-to-string value)))
+       ((string= "S" type)
+        (replace-regexp-in-string "[\n\r\t]" " " value))
+       ((string= "R" type)
+        (mapconcat 'identity value "\\ "))
+       ((string= "W" type)
+        (format "[Window configuration in frame \"%s\"]"
+                 (frame-parameter
+                  (window-configuration-frame (car value)) 'name)))
+       ((string= "F" type)
+        (format "[Frame configuration]"))
+       (t "[Error: unknow type]")))
+
+(defun register-list-get-type (key)
+  "Get the type for register's KEY."
+  (if (atom key)
+      (cond ((stringp key) "S")
+           ((markerp key) "M")
+           ((numberp key) "N")
+           (t "error"))
+    (cond ((window-configuration-p (car key)) "W")
+         ((frame-configuration-p (car key)) "F")
+         ((stringp (car key)) "R")
+         ((string= "Unprintable entity" (car key)) "?")
+         (t "error"))))
+
+;;; Edit key/value of the register
+
+;; FIXME delete?
+;; (defun register-list-edit-key-or-value nil
+;;   "Edit the register key or value depending on the point."
+;;   (interactive)
+;;   (if (get-text-property (point) 'register)
+;;       (register-list-edit-key)
+;;     (register-list-edit-value)))
+
+(defun register-list-edit-key nil
+  "Edit the key of the register at point."
+  (interactive)
+  (register-list-set-key 
+   (lambda (v) (read-char (format "New key (%s): " 
+                                 (char-to-string v))))))
+
+(defun register-list-increment-key nil
+  "Increment the key of the register at point."
+  (interactive)
+  (register-list-set-key '1+))
+
+(defun register-list-delete-duplicates nil
+  "Interactively delete duplicates."
+  (interactive)
+  (mapc (lambda (r)
+         (mapc (lambda(rr)
+                 (if (and (eq (car r) (car rr))
+                          (y-or-n-p 
+                           (format "Delete register with key `%s'? "
+                                   (char-to-string (car rr)))))
+                     (setq register-alist (delete rr register-alist))))
+               (cdr (member r register-alist))))
+       register-alist))
+
+;; (defun register-list- (register)
+;;   "Overline the register with KEY."
+;;   (save-excursion
+;;     (goto-char (point-min))
+;;     (while (re-search-forward (concat "^[ DC]" (char-to-string key)) nil t)
+;;       (goto-char
+;;     (while (next-single-property-change (point) 'register)
+
+(defun register-list-decrement-key nil
+  "Decrement the key of the register at point."
+  (interactive)
+  (register-list-set-key '1-))
+
+(defun register-list-set-key (function)
+  "Update the regsiter key by applying FUNCTION."
+  (register-list-preserve-pos
+   2 ;; go back to top of the sorted list
+   (beginning-of-line)
+   (let* ((reg-point (next-single-property-change (point) 'register))
+         (reg (get-text-property reg-point 'register))
+         (val (car reg)))
+     (setq register-alist (delete reg register-alist))
+     (add-to-list 'register-alist
+                 (cons (setcar reg (funcall function val)) (cdr reg)))
+     (register-list register-list-current-type
+                   register-list-current-fontification))))
+
+(defun register-list-edit-value nil
+  "Edit the value of the register at point."
+  (interactive)
+  (let* ((reg-at-point
+         (save-excursion
+           (beginning-of-line)
+           (next-single-property-change (point) 'register)))
+        (reg (get-text-property reg-at-point 'register))
+        (val (cdr reg))
+        new-val)
+    (if (not (or (stringp val) (numberp val)
+                (and (listp val) (stringp (car val)))))
+       (message "Can't edit this type of register")
+      (setq register-list-temp-window-cfg (current-window-configuration))
+      (setq register-list-temp-register reg)
+      (setq register-list-temp-pos
+           (cons (line-number-at-pos (point)) (current-column)))
+      (setq register-list-edit-value-type
+           (cond ((numberp val) 'number)
+                 ((listp val) 'rectangle)
+                 (t 'string)))
+      (pop-to-buffer (get-buffer-create "*Register Edit*"))
+      (erase-buffer)
+      (insert (cond ((numberp val) (number-to-string val))
+                   ((listp val) (mapconcat 'identity val "\n"))
+                   (t val)))
+      (setq register-list-rectangle-column
+           (if (eq register-list-edit-value-type 'rectangle)
+               (length (car val)) nil))
+      (register-list-edit-value-mode)
+      (message "Press C-c C-c when you're done"))))
+
+(define-derived-mode register-list-edit-value-mode text-mode
+  "Edit Register Value"
+  "Mode for editing the value of a register.
+When you are done editing the value, store it with \\[register-list-send-string].
+
+\\{register-list-edit-value-mode-map}")
+
+(defun register-list-add-rectangle-overlays (column)
+  "Add overlays to display strings beyond COLUMN.
+Do this on all lines in the current buffer."
+  (register-list-map-lines
+   ((beg (progn (forward-char column) (point)))
+    (end (progn (end-of-line) (point))))
+   (unless (eq beg end)
+     (overlay-put (make-overlay beg end)
+                 'face 'register-list-off-rectangle))))
+
+(defun register-list-add-trailing-whitespace (column)
+  "Add trailing whitespaces to fill to COLUMN.
+Do this on all lines in the current buffer."
+  (register-list-map-lines
+   ((eol (save-excursion (end-of-line) (point)))
+    (rem (% eol (1+ column))))
+   (if (and (not (eq rem 0))
+           (< eol (* (1+ column) (line-number-at-pos (point)))))
+       (save-excursion
+        (end-of-line)
+        (insert (make-string (- (1+ column) rem) 32))))))
+
+(defun register-list-send-value nil
+  "Use the buffer to store the new value of a register.
+Convert the buffer to a number or a rectangle if required."
+  (interactive)
+  (catch 'cancel
+    (when register-list-rectangle-column
+      ;; fix whitespace before sending a rectangle
+      (register-list-add-trailing-whitespace
+       register-list-rectangle-column)
+      ;; cut off trailing string before sending a rectangle
+      (register-list-add-rectangle-overlays
+       register-list-rectangle-column)
+      (if (and (delq nil (overlay-lists))
+              (not (y-or-n-p "Cut off the fontified part of the rectangle? ")))
+         (throw 'cancel (message "Back to editing"))))
+    ;; now send the value
+    (set-register (car register-list-temp-register)
+                 (cond ((eq register-list-edit-value-type 'number)
+                        (string-to-number (buffer-string)))
+                       ((eq register-list-edit-value-type 'rectangle)
+                        (mapcar (lambda (l) (truncate-string-to-width
+                                             l register-list-rectangle-column
+                                             0 32))
+                                (split-string (buffer-string) "\n")))
+                       (t (buffer-string))))
+    (kill-buffer (current-buffer))
+    (register-list register-list-current-type
+                  register-list-current-fontification)
+    (set-window-configuration register-list-temp-window-cfg)
+    (line-move (1- (car register-list-temp-pos)) t)
+    (line-move-to-column (cdr register-list-temp-pos)))
+  ;; remove overlays if sending was cancelled
+  (mapc (lambda(ovs) (mapc (lambda(o) (delete-overlay o)) ovs))
+       (overlay-lists))
+  (message "New value stored"))
+
+(defun register-list-prepare-string (string &optional fontify)
+  "Prepare STRING for the register list.
+An optional argument FONTIFY takes precedence over
+`register-list-preserve-fontification' to decide whether the
+string should keep its original fontification.  Also shorten the
+output string to `register-list-string-width'."
+  (if (and register-list-string-width
+          (> (length string) register-list-string-width))
+      (setq string (substring string 0 register-list-string-width)))
+  (when (or fontify register-list-preserve-fontification)
+    (remove-text-properties 0 (length string) '(face nil) string))
+  string)
+
+(provide 'register-list)
+
+;;; register-list.el ends here
diff --git a/packages/shen-mode/README b/packages/shen-mode/README
new file mode 100644 (file)
index 0000000..22ddde1
--- /dev/null
@@ -0,0 +1,6 @@
+Shen-mode provides functionality for working with the shen programming
+language.  This includes both a major mode `shen-mode' and an inferior
+Shen mode (`run-shen') for evaluating shen code in a comint buffer or
+from a buffer of Shen source code.
+
+For information on shen see http://www.shenlanguage.org/.
\ No newline at end of file
diff --git a/packages/shen-mode/inf-shen.el b/packages/shen-mode/inf-shen.el
new file mode 100644 (file)
index 0000000..dcbc4aa
--- /dev/null
@@ -0,0 +1,602 @@
+;;; inferior-shen-mode --- an inferior-shen mode
+
+;; Copyright (C) 2011 Free Software Foundation, Inc.
+
+;; Authors: Michael Ilseman, Eric Schulte <schulte.eric@gmail.com>
+;; Version: 0.1
+;; Keywords: languages, shen, comint
+;; Description: A major mode for editing shen source code
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This file defines an inferior Shen mode.
+
+;;; Code:
+(require 'comint)
+(require 'shen-mode)
+
+;;;###autoload
+(defvar inferior-shen-filter-regexp "\\`\\s *\\(:\\(\\w\\|\\s_\\)\\)?\\s *\\'"
+  "*What not to save on inferior Shen's input history.
+Input matching this regexp is not saved on the input history in Inferior Shen
+mode.  Default is whitespace followed by 0 or 1 single-letter colon-keyword
+\(as in :a, :c, etc.)")
+
+(defvar inferior-shen-mode-map nil)
+(unless inferior-shen-mode-map
+  (setq inferior-shen-mode-map (copy-keymap comint-mode-map))
+;  (set-keymap-parent inferior-shen-mode-map shen-mode-shared-map)
+  (define-key inferior-shen-mode-map "\C-x\C-e" 'shen-eval-last-sexp)
+  (define-key inferior-shen-mode-map "\C-c\C-l" 'shen-load-file)
+  (define-key inferior-shen-mode-map "\C-c\C-k" 'shen-compile-file)
+  (define-key inferior-shen-mode-map "\C-c\C-a" 'shen-show-arglist)
+  (define-key inferior-shen-mode-map "\C-c\C-d" 'shen-describe-sym)
+  (define-key inferior-shen-mode-map "\C-c\C-f"
+    'shen-show-function-documentation)
+  (define-key inferior-shen-mode-map "\C-c\C-v"
+    'shen-show-variable-documentation))
+
+;;; These commands augment Shen mode, so you can process Shen code in
+;;; the source files.
+(define-key shen-mode-map "\M-\C-x"  'shen-eval-defun)     ; Gnu convention
+(define-key shen-mode-map "\C-x\C-e" 'shen-eval-last-sexp) ; Gnu convention
+(define-key shen-mode-map "\C-c\C-e" 'shen-eval-defun)
+(define-key shen-mode-map "\C-c\C-r" 'shen-eval-region)
+(define-key shen-mode-map "\C-c\C-c" 'shen-compile-defun)
+(define-key shen-mode-map "\C-c\C-z" 'switch-to-shen)
+(define-key shen-mode-map "\C-c\C-l" 'shen-load-file)
+(define-key shen-mode-map "\C-c\C-k" 'shen-compile-file)  ; "kompile" file
+(define-key shen-mode-map "\C-c\C-a" 'shen-show-arglist)
+(define-key shen-mode-map "\C-c\C-d" 'shen-describe-sym)
+(define-key shen-mode-map "\C-c\C-f" 'shen-show-function-documentation)
+(define-key shen-mode-map "\C-c\C-v" 'shen-show-variable-documentation)
+
+
+;;; This function exists for backwards compatibility.
+;;; Previous versions of this package bound commands to C-c <letter>
+;;; bindings, which is not allowed by the gnumacs standard.
+
+;;;  "This function binds many inferior-shen commands to C-c <letter> bindings,
+;;;where they are more accessible. C-c <letter> bindings are reserved for the
+;;;user, so these bindings are non-standard. If you want them, you should
+;;;have this function called by the inferior-shen-load-hook:
+;;;    (setq inferior-shen-load-hook '(inferior-shen-install-letter-bindings))
+;;;You can modify this function to install just the bindings you want."
+(defun inferior-shen-install-letter-bindings ()
+  (define-key shen-mode-map "\C-ce" 'shen-eval-defun-and-go)
+  (define-key shen-mode-map "\C-cr" 'shen-eval-region-and-go)
+  (define-key shen-mode-map "\C-cc" 'shen-compile-defun-and-go)
+  (define-key shen-mode-map "\C-cz" 'switch-to-shen)
+  (define-key shen-mode-map "\C-cl" 'shen-load-file)
+  (define-key shen-mode-map "\C-ck" 'shen-compile-file)
+  (define-key shen-mode-map "\C-ca" 'shen-show-arglist)
+  (define-key shen-mode-map "\C-cd" 'shen-describe-sym)
+  (define-key shen-mode-map "\C-cf" 'shen-show-function-documentation)
+  (define-key shen-mode-map "\C-cv" 'shen-show-variable-documentation)
+
+  (define-key inferior-shen-mode-map "\C-cl" 'shen-load-file)
+  (define-key inferior-shen-mode-map "\C-ck" 'shen-compile-file)
+  (define-key inferior-shen-mode-map "\C-ca" 'shen-show-arglist)
+  (define-key inferior-shen-mode-map "\C-cd" 'shen-describe-sym)
+  (define-key inferior-shen-mode-map "\C-cf" 'shen-show-function-documentation)
+  (define-key inferior-shen-mode-map "\C-cv"
+    'shen-show-variable-documentation))
+
+
+;;;###autoload
+(defvar inferior-shen-program "shen"
+  "*Program name for invoking an inferior Shen with for Inferior Shen mode.")
+
+;;;###autoload
+(defvar inferior-shen-load-command "(load \"%s\")\n"
+  "*Format-string for building a Shen expression to load a file.
+This format string should use `%s' to substitute a file name
+and should result in a Shen expression that will command the inferior Shen
+to load that file.  The default works acceptably on most Shens.
+The string \"(progn (load \\\"%s\\\" :verbose nil :print t) (values))\\n\"
+produces cosmetically superior output for this application,
+but it works only in Common Shen.")
+
+;;;###autoload
+(defvar inferior-shen-prompt "^[^> \n]*>+:? *"
+  "Regexp to recognise prompts in the Inferior Shen mode.
+Defaults to \"^[^> \\n]*>+:? *\", which works pretty good for Lucid, kcl,
+and franz.  This variable is used to initialize `comint-prompt-regexp' in the
+Inferior Shen buffer.
+
+This variable is only used if the variable
+`comint-use-prompt-regexp-instead-of-fields' is non-nil.
+
+More precise choices:
+Lucid Common Shen: \"^\\\\(>\\\\|\\\\(->\\\\)+\\\\) *\"
+franz: \"^\\\\(->\\\\|<[0-9]*>:\\\\) *\"
+kcl: \"^>+ *\"
+
+This is a fine thing to set in your .emacs file.")
+
+(defvar inferior-shen-buffer nil "*The current inferior-shen process buffer.
+
+MULTIPLE PROCESS SUPPORT
+===========================================================================
+To run multiple Shen processes, you start the first up
+with \\[inferior-shen].  It will be in a buffer named `*inferior-shen*'.
+Rename this buffer with \\[rename-buffer].  You may now start up a new
+process with another \\[inferior-shen].  It will be in a new buffer,
+named `*inferior-shen*'.  You can switch between the different process
+buffers with \\[switch-to-buffer].
+
+Commands that send text from source buffers to Shen processes --
+like `shen-eval-defun' or `shen-show-arglist' -- have to choose a process
+to send to, when you have more than one Shen process around.  This
+is determined by the global variable `inferior-shen-buffer'.  Suppose you
+have three inferior Shens running:
+    Buffer              Process
+    foo                 inferior-shen
+    bar                 inferior-shen<2>
+    *inferior-shen*     inferior-shen<3>
+If you do a \\[shen-eval-defun] command on some Shen source code,
+what process do you send it to?
+
+- If you're in a process buffer (foo, bar, or *inferior-shen*),
+  you send it to that process.
+- If you're in some other buffer (e.g., a source file), you
+  send it to the process attached to buffer `inferior-shen-buffer'.
+This process selection is performed by function `inferior-shen-proc'.
+
+Whenever \\[inferior-shen] fires up a new process, it resets
+`inferior-shen-buffer' to be the new process's buffer.  If you only run
+one process, this does the right thing.  If you run multiple
+processes, you can change `inferior-shen-buffer' to another process
+buffer with \\[set-variable].")
+
+;;;###autoload
+(defvar inferior-shen-mode-hook '()
+  "*Hook for customising Inferior Shen mode.")
+
+(put 'inferior-shen-mode 'mode-class 'special)
+
+(defun inferior-shen-mode ()
+  "Major mode for interacting with an inferior Shen process.
+Runs a Shen interpreter as a subprocess of Emacs, with Shen I/O through an
+Emacs buffer.  Variable `inferior-shen-program' controls which Shen interpreter
+is run.  Variables `inferior-shen-prompt', `inferior-shen-filter-regexp' and
+`inferior-shen-load-command' can customize this mode for different Shen
+interpreters.
+
+For information on running multiple processes in multiple buffers, see
+documentation for variable `inferior-shen-buffer'.
+
+\\{inferior-shen-mode-map}
+
+Customisation: Entry to this mode runs the hooks on `comint-mode-hook' and
+`inferior-shen-mode-hook' (in that order).
+
+You can send text to the inferior Shen process from other buffers containing
+Shen source.
+    switch-to-shen switches the current buffer to the Shen process buffer.
+    shen-eval-defun sends the current defun to the Shen process.
+    shen-compile-defun compiles the current defun.
+    shen-eval-region sends the current region to the Shen process.
+    shen-compile-region compiles the current region.
+
+    Prefixing the shen-eval/compile-defun/region commands with
+    a \\[universal-argument] causes a switch to the Shen process buffer after sending
+    the text.
+
+Commands:
+Return after the end of the process' output sends the text from the
+    end of process to point.
+Return before the end of the process' output copies the sexp ending at point
+    to the end of the process' output, and sends it.
+Delete converts tabs to spaces as it moves back.
+Tab indents for Shen; with argument, shifts rest
+    of expression rigidly with the current line.
+C-M-q 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."
+  (interactive)
+  (comint-mode)
+  (set (make-local-variable 'font-lock-defaults) '(shen-font-lock-keywords))
+  (setq comint-prompt-regexp inferior-shen-prompt)
+  (setq major-mode 'inferior-shen-mode)
+  (setq mode-name "Inferior Shen")
+  (setq mode-line-process '(":%s"))
+
+  (use-local-map inferior-shen-mode-map)    ;c-c c-k for "kompile" file
+  (setq comint-get-old-input (function shen-get-old-input))
+  (setq comint-input-filter (function shen-input-filter))
+  (run-hooks 'inferior-shen-mode-hook))
+
+(defun shen-get-old-input ()
+  "Return a string containing the sexp ending at point."
+  (save-excursion
+    (let ((end (point)))
+      (backward-sexp)
+      (buffer-substring (point) end))))
+
+(defun shen-input-filter (str)
+  "t if STR does not match `inferior-shen-filter-regexp'."
+  (not (string-match inferior-shen-filter-regexp str)))
+
+;;;###autoload
+(defun inferior-shen (cmd)
+  "Run an inferior Shen process, input and output via buffer `*inferior-shen*'.
+If there is a process already running in `*inferior-shen*', just switch
+to that buffer.
+With argument, allows you to edit the command line (default is value
+of `inferior-shen-program').  Runs the hooks from
+`inferior-shen-mode-hook' (after the `comint-mode-hook' is run).
+\(Type \\[describe-mode] in the process buffer for a list of commands.)"
+  (interactive (list (if current-prefix-arg
+                        (read-string "Run shen: " inferior-shen-program)
+                      inferior-shen-program)))
+  (if (not (comint-check-proc "*inferior-shen*"))
+      (let ((cmdlist (split-string cmd)))
+       (set-buffer (apply (function make-comint)
+                          "inferior-shen" (car cmdlist) nil (cdr cmdlist)))
+       (inferior-shen-mode)))
+  (setq inferior-shen-buffer "*inferior-shen*")
+  (pop-to-buffer "*inferior-shen*"))
+;;;###autoload (add-hook 'same-window-buffer-names "*inferior-shen*")
+
+;;;###autoload
+(defalias 'run-shen 'inferior-shen)
+
+(defcustom shen-pre-eval-hook '()
+  "Hook to run on code before sending it to the inferior-shen-process.
+Functions on this hook will be called with an active region
+containing the shen source code about to be evaluated.")
+
+(defun shen-remember-functions (start end)
+  "Add functions defined between START and END to `shen-functions'."
+  (interactive "r")
+  (flet ((clean (text)
+                (when text
+                  (set-text-properties 0 (length text) nil text) text)))
+    (save-excursion
+      (goto-char start)
+      (let ((re (concat
+                 "^(define[ \t]+\\(.+\\)[\n\r]" ; function name
+                 "\\([ \t]*\\\\\\*[ \t]*\\([^\000]+?\\)[ \t]*\\*\\\\\\)?" ; doc
+                 "[\n\r]?[ \t]*\\({\\(.+\\)}\\)?"))) ; type
+        (while (re-search-forward re end t)
+          (let ((name (intern (match-string 1)))
+                (doc (clean (match-string 3)))
+                (type (clean (match-string 5))))
+            (add-to-list 'shen-functions (list name type doc))))))))
+
+(add-hook 'shen-pre-eval-hook #'shen-remember-functions)
+
+(defun check-balanced-parens (start end)
+  "Check if parentheses in the region are balanced."
+  (save-restriction (save-excursion
+    (let ((deactivate-mark nil))
+      (condition-case c
+          (progn (narrow-to-region start end) (goto-char (point-min))
+                 (while (/= 0 (- (point) (forward-list)))) t)
+          (scan-error (signal 'scan-error '("Parentheses not balanced."))))))))
+
+(add-hook 'shen-pre-eval-hook
+          (lambda (start end)
+            (condition-case err (check-balanced-parens start end)
+              (error (unless (y-or-n-p (format "%s Eval anyway ?"
+                                               (error-message-string err)))
+                       (signal 'scan-error err))))))
+
+(defun shen-eval-region (start end &optional and-go)
+  "Send the current region to the inferior Shen process.
+Prefix argument means switch to the Shen buffer afterwards."
+  (interactive "r\nP")
+  (let ((before-input (marker-position (process-mark (inferior-shen-proc))))
+        result)
+    
+    (run-hook-with-args 'shen-pre-eval-hook start end)
+    (comint-send-region (inferior-shen-proc) start end)
+    (comint-send-string (inferior-shen-proc) "\n")
+    (accept-process-output (inferior-shen-proc))
+    (sit-for 0)
+    (save-excursion
+      (set-buffer inferior-shen-buffer)
+      (goto-char before-input)
+      (setq result (buffer-substring (point) (point-at-eol)))
+      (message "%s" result)
+      (goto-char (process-mark (inferior-shen-proc))))
+    (if and-go (switch-to-shen t))
+    result))
+
+(defun shen-eval-defun (&optional and-go)
+  "Send the current defun to the inferior Shen process.
+Prefix argument means switch to the Shen buffer afterwards."
+  (interactive "P")
+  (let (result)
+    (save-excursion
+      (end-of-defun)
+      (skip-chars-backward " \t\n\r\f") ;  Makes allegro happy
+      (let ((end (point)))
+        (beginning-of-defun)
+        (setq result (shen-eval-region (point) end))))
+    (if and-go (switch-to-shen t))
+    result))
+
+(defun shen-eval-last-sexp (&optional and-go)
+  "Send the previous sexp to the inferior Shen process.
+Prefix argument means switch to the Shen buffer afterwards."
+  (interactive "P")
+  (shen-eval-region (save-excursion (backward-sexp) (point)) (point) and-go))
+
+;;; Common Shen COMPILE sux.
+(defun shen-compile-region (start end &optional and-go)
+  "Compile the current region in the inferior Shen process.
+Prefix argument means switch to the Shen buffer afterwards."
+  (interactive "r\nP")
+  (comint-send-string
+   (inferior-shen-proc)
+   (format "(funcall (compile nil `(lambda () (progn 'compile %s))))\n"
+          (buffer-substring start end)))
+  (if and-go (switch-to-shen t)))
+
+(defun shen-compile-defun (&optional and-go)
+  "Compile the current defun in the inferior Shen process.
+Prefix argument means switch to the Shen buffer afterwards."
+  (interactive "P")
+  (save-excursion
+    (end-of-defun)
+    (skip-chars-backward " \t\n\r\f") ;  Makes allegro happy
+    (let ((e (point)))
+      (beginning-of-defun)
+      (shen-compile-region (point) e)))
+  (if and-go (switch-to-shen t)))
+
+(defun switch-to-shen (eob-p)
+  "Switch to the inferior Shen process buffer.
+With argument, positions cursor at end of buffer."
+  (interactive "P")
+  (if (get-buffer-process inferior-shen-buffer)
+      (let ((pop-up-frames
+            ;; Be willing to use another frame
+            ;; that already has the window in it.
+            (or pop-up-frames
+                (get-buffer-window inferior-shen-buffer t))))
+       (pop-to-buffer inferior-shen-buffer))
+      (run-shen inferior-shen-program))
+  (when eob-p
+        (push-mark)
+    (goto-char (point-max))))
+
+
+;;; Now that shen-compile/eval-defun/region takes an optional prefix arg,
+;;; these commands are redundant. But they are kept around for the user
+;;; to bind if he wishes, for backwards functionality, and because it's
+;;; easier to type C-c e than C-u C-c C-e.
+(defun shen-eval-region-and-go (start end)
+  "Send the current region to the inferior Shen, and switch to its buffer."
+  (interactive "r")
+  (shen-eval-region start end t))
+
+(defun shen-eval-defun-and-go ()
+  "Send the current defun to the inferior Shen, and switch to its buffer."
+  (interactive)
+  (shen-eval-defun t))
+
+(defun shen-compile-region-and-go (start end)
+  "Compile the current region in the inferior Shen, and switch to its buffer."
+  (interactive "r")
+  (shen-compile-region start end t))
+
+(defun shen-compile-defun-and-go ()
+  "Compile the current defun in the inferior Shen, and switch to its buffer."
+  (interactive)
+  (shen-compile-defun t))
+
+;;; A version of the form in H. Shevis' soar-mode.el package. Less robust.
+;;; (defun shen-compile-sexp (start end)
+;;;   "Compile the s-expression bounded by START and END in the inferior shen.
+;;; If the sexp isn't a DEFUN form, it is evaluated instead."
+;;;   (cond ((looking-at "(defun\\s +")
+;;;     (goto-char (match-end 0))
+;;;     (let ((name-start (point)))
+;;;       (forward-sexp 1)
+;;;       (process-send-string "inferior-shen"
+;;;                            (format "(compile '%s #'(lambda "
+;;;                                    (buffer-substring name-start
+;;;                                                      (point)))))
+;;;     (let ((body-start (point)))
+;;;       (goto-char start) (forward-sexp 1) ; Can't use end-of-defun.
+;;;       (process-send-region "inferior-shen"
+;;;                            (buffer-substring body-start (point))))
+;;;     (process-send-string "inferior-shen" ")\n"))
+;;;    (t (shen-eval-region start end)))))
+;;;
+;;; (defun shen-compile-region (start end)
+;;;   "Each s-expression in the current region is compiled (if a DEFUN)
+;;; or evaluated (if not) in the inferior shen."
+;;;   (interactive "r")
+;;;   (save-excursion
+;;;     (goto-char start) (end-of-defun) (beginning-of-defun) ; error check
+;;;     (if (< (point) start) (error "region begins in middle of defun"))
+;;;     (goto-char start)
+;;;     (let ((s start))
+;;;       (end-of-defun)
+;;;       (while (<= (point) end) ; Zip through
+;;;    (shen-compile-sexp s (point)) ; compiling up defun-sized chunks.
+;;;    (setq s (point))
+;;;    (end-of-defun))
+;;;       (if (< s end) (shen-compile-sexp s end)))))
+;;;
+;;; End of HS-style code
+
+
+(defvar shen-prev-l/c-dir/file nil
+  "Record last directory and file used in loading or compiling.
+This holds a cons cell of the form `(DIRECTORY . FILE)'
+describing the last `shen-load-file' or `shen-compile-file' command.")
+
+(defvar shen-source-modes '(shen-mode)
+  "*Used to determine if a buffer contains Shen source code.
+If it's loaded into a buffer that is in one of these major modes, it's
+considered a Shen source file by `shen-load-file' and `shen-compile-file'.
+Used by these commands to determine defaults.")
+
+(defun shen-load-file (file-name)
+  "Load a Shen file into the inferior Shen process."
+  (interactive (comint-get-source "Load Shen file: " shen-prev-l/c-dir/file
+                                 shen-source-modes nil)) ; NIL because LOAD
+                                       ; doesn't need an exact name
+  (comint-check-source file-name) ; Check to see if buffer needs saved.
+  (setq shen-prev-l/c-dir/file (cons (file-name-directory    file-name)
+                                    (file-name-nondirectory file-name)))
+  (comint-send-string (inferior-shen-proc)
+                     (format inferior-shen-load-command file-name))
+  (switch-to-shen t))
+
+
+(defun shen-compile-file (file-name)
+  "Compile a Shen file in the inferior Shen process."
+  (interactive (comint-get-source "Compile Shen file: " shen-prev-l/c-dir/file
+                                 shen-source-modes nil)) ; NIL = don't need
+                                       ; suffix .shen
+  (comint-check-source file-name) ; Check to see if buffer needs saved.
+  (setq shen-prev-l/c-dir/file (cons (file-name-directory    file-name)
+                                    (file-name-nondirectory file-name)))
+  (comint-send-string (inferior-shen-proc) (concat "(compile-file \""
+                                                  file-name
+                                                  "\"\)\n"))
+  (switch-to-shen t))
+
+
+
+;;; Documentation functions: function doc, var doc, arglist, and
+;;; describe symbol.
+;;; ===========================================================================
+
+;;; Command strings
+;;; ===============
+
+(defvar shen-function-doc-command
+  "(let ((fn '%s))
+     (format t \"Documentation for ~a:~&~a\"
+            fn (documentation fn 'function))
+     (values))\n"
+  "Command to query inferior Shen for a function's documentation.")
+
+(defvar shen-var-doc-command
+  "(let ((v '%s))
+     (format t \"Documentation for ~a:~&~a\"
+            v (documentation v 'variable))
+     (values))\n"
+  "Command to query inferior Shen for a variable's documentation.")
+
+(defvar shen-arglist-command
+  "(let ((fn '%s))
+     (format t \"Arglist for ~a: ~a\" fn (arglist fn))
+     (values))\n"
+  "Command to query inferior Shen for a function's arglist.")
+
+(defvar shen-describe-sym-command
+  "(describe '%s)\n"
+  "Command to query inferior Shen for a variable's documentation.")
+
+
+;;; Ancillary functions
+;;; ===================
+
+;;; Reads a string from the user.
+(defun shen-symprompt (prompt default)
+  (list (let* ((prompt (if default
+                          (format "%s (default %s): " prompt default)
+                        (concat prompt ": ")))
+              (ans (read-string prompt)))
+         (if (zerop (length ans)) default ans))))
+
+
+;;; Adapted from function-called-at-point in help.el.
+(defun shen-fn-called-at-pt ()
+  "Returns the name of the function called in the current call.
+The value is nil if it can't find one."
+  (condition-case nil
+      (save-excursion
+       (save-restriction
+         (narrow-to-region (max (point-min) (- (point) 1000)) (point-max))
+         (backward-up-list 1)
+         (forward-char 1)
+         (let ((obj (read (current-buffer))))
+           (and (symbolp obj) obj))))
+    (error nil)))
+
+
+;;; Adapted from variable-at-point in help.el.
+(defun shen-var-at-pt ()
+  (condition-case ()
+      (save-excursion
+       (forward-sexp -1)
+       (skip-chars-forward "'")
+       (let ((obj (read (current-buffer))))
+         (and (symbolp obj) obj)))
+    (error nil)))
+
+
+;;; Documentation functions: fn and var doc, arglist, and symbol describe.
+;;; ======================================================================
+(defun shen-show-function-documentation (fn)
+  "Send a command to the inferior Shen to give documentation for function FN.
+See variable `shen-function-doc-command'."
+  (interactive (shen-symprompt "Function doc" (shen-fn-called-at-pt)))
+  (comint-proc-query (inferior-shen-proc)
+                    (format shen-function-doc-command fn)))
+
+(defun shen-show-variable-documentation (var)
+  "Send a command to the inferior Shen to give documentation for function FN.
+See variable `shen-var-doc-command'."
+  (interactive (shen-symprompt "Variable doc" (shen-var-at-pt)))
+  (comint-proc-query (inferior-shen-proc) (format shen-var-doc-command var)))
+
+(defun shen-show-arglist (fn)
+  "Send a query to the inferior Shen for the arglist for function FN.
+See variable `shen-arglist-command'."
+  (interactive (shen-symprompt "Arglist" (shen-fn-called-at-pt)))
+  (comint-proc-query (inferior-shen-proc) (format shen-arglist-command fn)))
+
+(defun shen-describe-sym (sym)
+  "Send a command to the inferior Shen to describe symbol SYM.
+See variable `shen-describe-sym-command'."
+  (interactive (shen-symprompt "Describe" (shen-var-at-pt)))
+  (comint-proc-query (inferior-shen-proc)
+                    (format shen-describe-sym-command sym)))
+
+\f
+;;  "Returns the current inferior Shen process.
+;; See variable `inferior-shen-buffer'."
+(defun inferior-shen-proc ()
+  (let ((proc (get-buffer-process (if (eq major-mode 'inferior-shen-mode)
+                                     (current-buffer)
+                                   inferior-shen-buffer))))
+    (or proc
+       (error "No Shen subprocess; see variable `inferior-shen-buffer'"))))
+
+
+;;; Do the user's customisation...
+;;;===============================
+(defvar inferior-shen-load-hook nil
+  "This hook is run when the library `inf-shen' is loaded.
+This is a good place to put keybindings.")
+
+(run-hooks 'inferior-shen-load-hook)
+
+(provide 'inf-shen)
+;;; inf-shen.el ends here
diff --git a/packages/shen-mode/shen-mode-pkg.el b/packages/shen-mode/shen-mode-pkg.el
new file mode 100644 (file)
index 0000000..aab0c59
--- /dev/null
@@ -0,0 +1 @@
+(define-package "shen-mode" "0.1" "Utilities for working with Shen code.")
diff --git a/packages/shen-mode/shen-mode.el b/packages/shen-mode/shen-mode.el
new file mode 100644 (file)
index 0000000..747679c
--- /dev/null
@@ -0,0 +1,429 @@
+;;; shen-mode.el --- A major mode for editing shen source code
+
+;; Copyright (C) 2011, 2013 Free Software Foundation, Inc.
+
+;; Author: Eric Schulte <schulte.eric@gmail.com>
+;; Version: 0.1
+;; Keywords: languages, shen
+;; Description: A major mode for editing shen source code
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; A minor mode for editing shen source code.  Shen is a modern lisp
+;; dialect with support for functional and declarative programming,
+;; pattern matching and a very powerful type system.  See the
+;; following for more information on Shen. http://www.shenlanguage.org
+
+;;; Code:
+(require 'lisp-mode)
+(require 'imenu)
+
+(defcustom shen-mode-hook '(turn-on-eldoc-mode)
+  "Normal hook run when entering `shen-mode'."
+  :type 'hook
+  :group 'shen)
+
+(defvar shen-mode-map
+  (let ((map (make-sparse-keymap)))
+    (set-keymap-parent map lisp-mode-shared-map)
+    map)
+  "Currently just inherits from `lisp-mode-shared-map'.")
+
+(eval-and-compile
+(defconst shen-functions
+  '((* "number --> number --> number" "Number multiplication.")
+    (+ "number --> number --> number" "Number addition.")
+    (- "number --> number --> number" "Number subtraction.")
+    (/ "number --> number --> number" "Number division.")
+    (/. "_" "Abstraction builder, receives a variable and an expression; does the job of --> in the lambda calculus.")
+    (< "number --> number --> boolean" "Less than.")
+    (<-vector nil nil)
+    (<= "number --> number --> boolean" "Less than or equal to.")
+    (<e> nil nil)
+    (= "A --> A --> boolean" "Equal to.")
+    (== "A --> B --> boolean" "Equal to.")
+    (> "number --> number --> boolean" "Greater than.")
+    (>= "number --> number --> boolean" "Greater than or equal to.")
+    (@p "_" "Takes two inputs and forms an ordered pair.")
+    (@s "_" "Takes two or more inputs and forms a string.")
+    (@v "_" "Takes two or more inputs and forms a vector.")
+    (abort nil "throw a simple error")
+    (adjoin nil "add arg1 to list arg2 if not already a member")
+    (and "boolean --> boolean --> boolean" "Boolean and.")
+    (append "(list A) --> (list A) --> (list A)" "Appends two lists into one list.")
+    (apply "(A --> B) --> (A --> B)" "Applies a function to an input.")
+    (arity nil nil)
+    (assoc nil nil)
+    (assoc-type "symbol --> variable --> symbol" "Associates a Qi type (first input) with  Lisp type (second input)..")
+    (average nil "return the average of two numbers")
+    (bind nil nil)
+    (boolean\? "A --> boolean" "Recognisor for booleans.")
+    (bound\? nil "check is a symbol is bound")
+    (byte->string nil "return the string represented by bytes")
+    (call nil nil)
+    (cd "string --> string" "Changes the home directory. (cd \"My Programs\") will cause (load \"hello_world.txt\") to load MyPrograms/hello_world.txt.   (cd \"\")  is the default.")
+    (character\? "A --> boolean" "Recognisor for characters.")
+    (compile nil nil)
+    (complex\? "A --> boolean" "Recognisor for complex numbers.")
+    (concat "symbol --> symbol --> symbol" "Concatenates two symbols.")
+    (congruent\? "A --> A --> boolean" "Retrns true if objects are identical or else if they are strings or characters which are identical differing at most in case or numbers of equal value (e.g. 1 and 1.0) or tuples composed of congruent elements.")
+    (cons "_" "A special form that takes an object e of type A and a list l of type (list A) and produces a list of type (list A) by adding e to the front of  l.")
+    (cons\? "--> boolean" "Returns true iff the input is a non-empty list.")
+    (core nil nil)
+    (cut nil nil)
+    (debug "A --> string" "The input is ignored and debugging is returned; but all terminal output is echoed to the file debug.txt until the undebug function is executed.")
+    (declare "_" "Takes a function name f and a type t expressed as a list and gives f the type t.")
+    (define "_" "Define a function, takes a name, an optional type and a pattern matching body.")
+    (delete-file "string --> string" "The file named in the string is deleted and the string returned.")
+    (destroy "_" "Receives the name of a function and removes it and its type from the environment.")
+    (difference "(list A) --> (list A) --> (list A)" "Subtracts the elements of the second list from the first")
+    (do "_" "A special form: receives n well-typed expressions and evaluates each one, returning the normal form of the last one.")
+    (dump "string --> string" "Dumps all user-generated Lisp from the file f denoted by the argument into a file f.lsp.")
+    (echo "string --> string" "Echoes all terminal input/output to a file named by string (which is either appended to if it exists or created if not) until the command (echo \"\") is received which switches echo off.")
+    (element\? "A -> (list A) --> boolean" "Returns true iff the first input is an element in the second.")
+    (empty\? "--> boolean" "Returns true iff the input is [].")
+    (error "_" "A special form: takes a string followed by n (n --> 0) expressions. Prints error string.")
+    (eval "_" "Evaluates the input.")
+    (explode "A --> (list character)" "Explodes an object to a list of characters.")
+    (fail nil nil)
+    (fix "(A --> A) --> (A --> A)" "Applies a function to generate a fixpoint.")
+    (float\? "A --> boolean" "Recognisor for floating point numbers.")
+    (floor nil nil)
+    (format nil "takes a stream, a format string and args, formats and prints to the stream")
+    (freeze "A --> (lazy A)" "Returns a frozen version of its input.")
+    (fst "(A * B) --> A" "Returns the first element of a tuple.")
+    (fwhen nil nil)
+    (gensym "_" "Generates a fresh symbol or variable from a string..")
+    (get nil "gets property arg2 from object arg1")
+    (get-array "(array A) --> (list number) --> A --> A" "3-place function that takes an array of elements of type A, an index to that array as a list of natural numbers and an expression E of type A.  If an object is stored at the index, then it is returned, otherwise the normal form of E is returned.")
+    (get-prop "_" "3-place function that takes a symbol S, a pointer P (which can be a string, symbol or number), and an expression E of any kind and returns the value pointed by P from S  (if one exists) or the normal form of E otherwise.")
+    (hash nil "hash an object")
+    (hdv nil nil)
+    (head "(list A) --> A" "Returns the first element of a list.")
+    (identical nil nil)
+    (if "boolean --> A --> A" "takes a boolean b and two expressions x and y and evaluates x if b evaluates to true and evaluates y if b evaluates to false.")
+    (if-with-checking "string --> (list A)" "If type checking is enabled, raises the string as an error otherwise returns the empty list..")
+    (if-without-checking "string --> (list A)" "If type checking is disabled, raises the string as an error otherwise returns the empty list.")
+    (include "(list symbol) --> (list symbol)" "Includes the datatype theories or synonyms for use in type checking.")
+    (include-all-but "(list symbol) --> (list symbol)" "Includes all loaded datatype theories and synonyms for use in type checking apart from those entered.")
+    (inferences "A --> number" "The input is ignored. Returns the number of logical inferences executed since the last call to the top level.")
+    (input "_" "0-place function. Takes a user input i and returns the normal form of i.")
+    (input+ "_" "Special form. Takes inputs of the form : <expr>. Where d(<expr>) is the type denoted by the choice of expression (e.g. \"number\" denotes the type number). Takes a user input i and returns the normal form of i given i is of the type d(<expr>).")
+    (integer\? "A --> boolean" "Recognisor for integers.")
+    (interror nil nil)
+    (intersection "(list A) --> (list A) --> (list A)" "Computes the intersection of two lists.")
+    (intmake-string nil nil)
+    (intoutput nil nil)
+    (lambda "_" "Lambda operator from lambda calculus.")
+    (length "(list A) --> integer" "Returns the number of elements in a list.")
+    (let nil nil)
+    (limit nil nil)
+    (lineread "_" "Top level reader of read-evaluate-print loop. Reads elements into a list.  lineread terminates with carriage return when brackets are balanced.  ^ aborts lineread.")
+    (list "A .. A --> (list A)" "A special form. Assembles n (n  --> 0) inputs into a list.")
+    (load "string --> symbol" "Takes a file name and loads the file, returning loaded as a symbol.")
+    (macroexpand nil nil)
+    (make-string "string A1 - An --> string" "A special form: takes a string followed by n (n --> 0) well-typed expressions; assembles and returns a string.")
+    (map "(A --> B) --> (list A) --> (list B)" "The first input is applied to each member of the second input and the results consed into one list..")
+    (mapcan "(A --> (list B)) --> (list A) --> (list B)" "The first input is applied to each member of the second input and the results appended into one list.")
+    (maxinferences "number --> number" "Returns the input and as a side-effect, sets a global variable to a number that limits the maximum number of inferences that can be expended on attempting to typecheck a program.  The default is 1,000,000.")
+    (mod nil "arg1 mod arg2")
+    (newsym "symbol --> symbol" "Generates a fresh symbol from a symbol.")
+    (newvar "variable --> variable" "Generates a fresh variable from a variable")
+    (nl nil nil)
+    (not "boolean --> boolean" "Boolean not.")
+    (nth "number --> (list A) --> A" "Gets the nth element of a list numbered from 1.")
+    (number\? "A --> boolean" "Recognisor for numbers.")
+    (occurences "A --> B --> number" "Returns the number of times the first argument occurs in the second.")
+    (occurrences nil "returns the number of occurrences of arg1 in arg2")
+    (occurs-check "symbol --> boolean" "Receives either + or - and enables/disables occur checking in Prolog,    datatype definitions and rule closures.   The default is +.")
+    (opaque "symbol --> symbol" "Applied to a Lisp macro makes it opaque to Qi.")
+    (or "boolean -->  (boolean --> boolean)" "Boolean or.")
+    (output "string A1 - An --> string" "A special form: takes a string followed by n (n --> 0) well-typed expressions; prints a message to the screen and returns an object of type string (the string \"done\").")
+    (preclude "(list symbol) --> (list symbol)" "Removes the mentioned datatype theories and synonyms from use in type checking.")
+    (preclude-all-but "(list symbol) --> (list symbol)" "Removes all the datatype theories and synonyms from use in type checking apart from the ones given.")
+    (print "A --> A" "Takes an object and prints it, returning it as a result.")
+    (profile "(A --> B) --> (A --> B)" "Takes a function represented by a function name and inserts profiling code returning the function as an output.")
+    (profile-results "A --> symbol" "The input is ignored.  Returns a list of profiled functions and their     timings since  profile-results was last used.")
+    (ps "_" "Receives a symbol  denoting a Qi function and prints the Lisp source    code associated with the function.")
+    (put nil "puts value of arg3 as property arg2 in object arg1")
+    (put-array "(array A) --> (list number) --> A --> A" "3-place function that takes an array of elements of type A, an index to that array as a list of natural numbers and an expression E of type A.  The normal form of E is stored at that index and then returned.")
+    (put-prop "_" "3-place function that takes a symbol S, a pointer P (a string symbol or number), and an expression E. The pointer P is set to point from S to the normal form of E which is then returned.")
+    (quit "_" "0-place function that exits Qi.")
+    (random "number --> number" "Given a positive number n, generates a random number between 0 and    n-1.")
+    (rational\? "A --> boolean" "Recognisor for rational numbers.")
+    (read nil nil)
+    (read-char "A --> character" "The input is discarded and the character typed by the user is returned.")
+    (read-chars-as-stringlist "(list character) --> (character -->  boolean) -->  (list string)" "Returns a list of strings whose components are taken from the character list. The second input acts as a tokeniser.  Thus (read-chars-as-stringlist [#\\H #\\i #\\Space #\\P #\\a #\\t]  (/. X (= X #\\Space))) will produce [\"Hi\" \"Pat\"].")
+    (read-file "string --> (list unit)" "Returns the contents of an ASCII file designated by a string.  Returns a list of units,  where unit is an unspecified type.")
+    (read-file-as-charlist "string --> (list character)" "Returns the list of characters from the contents of an ASCII file designated by a string.")
+    (read-file-as-string nil nil)
+    (real\? "A --> boolean" "Recognisor for real numbers.")
+    (remove "A --> (list A) --> (list A)" "Removes all occurrences of an element from a list.")
+    (return nil nil)
+    (reverse "(list A)--> ?(list A)" "Reverses a list.")
+    (round "number--> ?number" "Rounds a number.")
+    (save "_" "0 place function. Saves a Qi image.")
+    (snd "(A * B) --> B" "Returns the second element of a tuple.")
+    (specialise "symbol --> symbol" "Receives the name of a function and turns it into a special form. Special forms are not curried during evaluation or compilation.")
+    (speed "number --> number" "Receives a value 0 to 3 and sets the performance of the generated Lisp code, returning its input.  0 is the lowest setting.")
+    (spy "symbol --> boolean" "Receives either + or - and respectively enables/disables tracing the    operation of T*.")
+    (sqrt "number --> number" "Returns the square root of a number.")
+    (step "symbol --> boolean" "Receives either + or - and enables/disables stepping in the trace.")
+    (stinput nil nil)
+    (string\? "A --> boolean" "Recognisor for strings.")
+    (strong-warning "symbol --> boolean" "Takes + or -; if + then warnings are treated as error messages.")
+    (subst nil nil)
+    (sugar "symbol --> (A --> B) --> number --> (A --> B)" "Receives either in or out as first argument, a function f and an integer    greater than 0 and returns f as a result.  The function f is placed on the    sugaring list at a position determined by the number.")
+    (sugar-list "symbol --> (list symbol)" "Receives either in or out as first argument, and returns the list of sugar    functions.")
+    (sum nil "sum a list of numbers")
+    (symbol\? "A --> boolean" "Recognisor for symbols.")
+    (systemf nil nil)
+    (tail "(list A) --> (list A)" "Returns all but the first element of a non-empty list.")
+    (tc "symbol --> boolean" "Receives either + or - and respectively enables/disables static typing.")
+    (tc\? nil "return true if type checking")
+    (thaw "(lazy A) --> A" "Receives a frozen input and evaluates it to get the unthawed result..")
+    (time "A --> A" "Prints the run time for the evaluation of its input and returns its normal form.")
+    (tlv nil nil)
+    (track "symbol --> symbol" "Tracks the I/O behaviour of a function.")
+    (transparent "symbol --> symbol" "Applied to a Lisp macro makes it transparent to Qi.")
+    (tuple\? "A --> boolean" "Recognisor for tuples.")
+    (type "_" "Returns a type for its input (if any) or false if the input has no type.")
+    (unassoc-type "symbol --> symbol" "Removes any associations with the Qi type in the type association table.")
+    (undebug "A --> string" "The input is ignored, undebugging is returned and all terminal output is closed to the file debug.txt.")
+    (unify nil nil)
+    (unify! nil nil)
+    (union "(list A) --> (list A) --> (list A)" "Forms the union of two lists.")
+    (unprofile "(A --> B) --> (A --> B)" "Unprofiles a function.")
+    (unspecialise "symbol --> symbol" "Receives the name of a function and deletes its special form status.")
+    (unsugar "symbol --> (A --> B) --> (A --> B)" "Receives either out or in and the name of a function and removes its status as a sugar function.")
+    (untrack "symbol --> symbol" "Untracks a function.")
+    (value "_" "Applied to a symbol, returns the global value assigned to it.")
+    (variable\? "A --> boolean" "Applied to a variable, returns true.")
+    (vector nil nil)
+    (vector-> nil nil)
+    (vector\? nil nil)
+    (version "string --> string" "Changes the version string displayed on startup.")
+    (warn "string --> string" "Prints the string as a warning and returns \"done\".  See strong-warning")
+    (write-to-file "string --> A --> string" "Writes the second input into a file named in the first input. If the file does not exist, it is created, else it is overwritten. If the second input is a string then it is written to the file without the enclosing quotes.  The first input is returned.")
+    (y-or-n\? "string --> boolean" "Prints the string as a question and returns true for y and false for n."))
+  "Shen functions taken largely from the Qi documentation by Dr. Mark Tarver."))
+
+\f
+;;; Fontification
+(defconst shen-font-lock-keywords
+  (eval-when-compile
+    `(;; definitions
+      (,(concat "(\\("
+                (regexp-opt
+                 '("define" "defmacro" "defprolog" "/." "synonyms" "defcc"))
+                "\\)\\>"
+                "[ \t]*(?"
+                "\\(\\sw+\\)?")
+       (1 font-lock-keyword-face)
+       (2 font-lock-function-name-face nil t))
+      ("(\\(lambda\\)\\>[ \t]*(?\\(\\sw+\\)?"
+       (1 font-lock-keyword-face)
+       (2 font-lock-variable-name-face nil t))
+      ;; data types
+      ("(\\(datatype\\)\\>[ \t]*(?\\(\\sw+\\)?"
+       (1 font-lock-keyword-face)
+       (2 font-lock-type-face nil t))
+      ;; variables
+      ("\\<\\([A-Z]\\w*\\)\\>" . font-lock-variable-name-face)
+      ;; control structures
+      (,(concat
+         "("
+         (regexp-opt
+          (append
+           '("let" "=" "eval-without-reader-macros" "freeze" "type") ; generic
+           '("if" "and" "or" "cond")) t) ; boolean
+         "\\>") . 1)
+      ;; errors
+      ("(\\(error\\)\\>" 1 font-lock-warning-face)
+      ;; built-in
+      (,(concat
+         "("
+         (regexp-opt
+          (mapcar
+           (lambda (it) (format "%s" it))
+           (append
+            '(intern function)                          ; symbols
+            '(pos tlstr cn str string?)                 ; strings
+            '(set value)                                ; assignment
+            '(cons hd tl cons?)                         ; lists
+            '(absvector address-> <-address absvector?) ; vector
+            '(pr read-byte open close)                  ; stream
+            '(get-time)                                 ; time
+            '(+ - * / > < >= <= number?)                ; arithmetic
+            '(fst snd tupple?)                          ; tuple
+            '(@s @v @p)
+            '(put get)                  ; property lists
+            '(simple-error trap-error error-to-string) ; error
+            ;; predicates
+            (mapcar
+             (lambda (it) (format "%s?" it))
+             '(boolean character complex congruent cons element empty float
+                       integer number provable rational solved string symbol
+                       tuple variable))
+            ;; misc functions
+            (mapcar #'car shen-functions)))
+          t)
+         "\\>")
+       1 font-lock-builtin-face)
+      ;; external global variables
+      (,(concat
+         (regexp-opt
+          (mapcar
+           (lambda (cnst) (format "*%s*" cnst))
+           '("language" "implementation" "port" "porters"
+             "stinput" "home-directory" "version"
+             "maximum-print-sequence-size" "printer" "macros")) t)
+         "\\>")
+       1 font-lock-builtin-face)))
+  "Default expressions to highlight in Shen mode.")
+
+(defvar shen-mode-syntax-table
+  (let ((table (make-syntax-table)))
+    (dolist (pair '((?@  . "w")
+                    (?_  . "w")
+                    (?-  . "w")
+                    (?+  . "w")
+                    (??  . "w")
+                    (?!  . "w")
+                    (?<  . "w")
+                    (?>  . "w")
+                    (?/  . "w")
+                    ;; comment delimiters
+                    (?\\ . ". 14")
+                    (?*  . ". 23")))
+      (modify-syntax-entry (car pair) (cdr pair) table))
+    table)
+  "Syntax table to use in shen-mode.")
+
+\f
+;;; Indentation
+;; Copied from qi-mode, which in turn is from scheme-mode and from lisp-mode
+(defun shen-indent-function (indent-point state)
+  (let ((normal-indent (current-column)))
+    (goto-char (1+ (elt state 1)))
+    (parse-partial-sexp (point) calculate-lisp-indent-last-sexp 0 t)
+    (if (and (elt state 2)
+             (not (looking-at "\\sw\\|\\s_")))
+      ;; car of form doesn't seem to be a symbol
+      (progn
+        (if (not (> (save-excursion (forward-line 1) (point))
+                    calculate-lisp-indent-last-sexp))
+          (progn (goto-char calculate-lisp-indent-last-sexp)
+                 (beginning-of-line)
+                 (parse-partial-sexp (point)
+                                     calculate-lisp-indent-last-sexp 0 t)))
+        ;; Indent under the list or under the first sexp on the same
+        ;; line as calculate-lisp-indent-last-sexp.  Note that first
+        ;; thing on that line has to be complete sexp since we are
+        ;; inside the innermost containing sexp.
+        (backward-prefix-chars)
+        (current-column))
+      (let ((function (buffer-substring (point)
+                                       (progn (forward-sexp 1) (point))))
+           method)
+       (setq method (or (get (intern-soft function) 'shen-indent-function)
+                        (get (intern-soft function) 'shen-indent-hook)))
+       (cond ((or (eq method 'defun)
+                  (and (null method)
+                       (> (length function) 3)
+                       (string-match "\\`def" function)))
+              (lisp-indent-defform state indent-point))
+             ((integerp method)
+              (lisp-indent-specform method state
+                                    indent-point normal-indent))
+             (method
+               (funcall method state indent-point normal-indent)))))))
+
+(defun shen-let-indent (state indent-point normal-indent)
+  (let ((edge (- (current-column) 2)))
+    (goto-char indent-point) (skip-chars-forward " \t")
+    (if (looking-at "[-a-zA-Z0-9+*/?!@$%^&_:~]")
+        ;; deeper indent because we're still defining local variables
+        (lisp-indent-specform 5 state indent-point normal-indent)
+      ;; shallow indent because we're in the body
+      edge)))
+
+(defun shen-package-indent (state indent-point normal-indent)
+  (- (current-column) 8))
+
+(put 'let 'shen-indent-function 'shen-let-indent)
+(put 'lambda 'shen-indent-function 1)
+(put 'package 'shen-indent-function 'shen-package-indent)
+(put 'datatype 'shen-indent-function 1)
+
+\f
+;;; Function documentation
+(defun shen-current-function ()
+  (ignore-errors
+    (save-excursion
+      (backward-up-list)
+      (forward-char 1)
+      (thing-at-point 'word))))
+
+(defun shen-mode-eldoc ()
+  (let ((func (assoc (intern (or (shen-current-function) "")) shen-functions)))
+    (when func
+      (format "%s%s:%s"
+              (propertize (symbol-name (car func))
+                          'face 'font-lock-function-name-face)
+              (if (cadr func)  (concat "[" (cadr func) "]") "")
+              (if (caddr func) (concat " " (caddr func)) "")))))
+
+(defvar shen-imenu-generic-expression
+  '(("Functions" "^\\s-*(\\(define\\)" 1)))
+
+\f
+;;; Major mode definition
+;; apparently some versions of Emacs don't have `prog-mode' defined
+(unless (fboundp 'prog-mode)
+  (defalias 'prog-mode 'fundamental-mode))
+
+(define-derived-mode shen-mode prog-mode "shen"
+  "Major mode for editing Shen code."
+  :syntax-table shen-mode-syntax-table
+  ;; set a variety of local variables
+  ((lambda (local-vars)
+     (dolist (pair local-vars)
+       (set (make-local-variable (car pair)) (cdr pair))))
+   `((adaptive-fill-mode . nil)
+     (fill-paragraph-function . lisp-fill-paragraph)
+     (indent-line-function . lisp-indent-line)
+     (lisp-indent-function . shen-indent-function)
+     (parse-sexp-ignore-comments . t)
+     (comment-start . "\\* ")
+     (comment-end . " *\\")
+     (comment-add . 0)
+     (comment-column . 32)
+     (parse-sexp-ignore-comments . t)
+     (comment-use-global-state . nil)
+     (comment-multi-line . t)
+     (eldoc-documentation-function . shen-mode-eldoc)
+     (imenu-case-fold-search . t)
+     (imenu-generic-expression . ,shen-imenu-generic-expression)
+     (mode-name . "Shen")
+     (font-lock-defaults . (shen-font-lock-keywords)))))
+
+(add-to-list 'auto-mode-alist '("\\.shen\\'" . shen-mode))
+
+(provide 'shen-mode)
+;;; shen-mode.el ends here
diff --git a/packages/sisu-mode/sisu-mode.el b/packages/sisu-mode/sisu-mode.el
new file mode 100644 (file)
index 0000000..9d287f1
--- /dev/null
@@ -0,0 +1,371 @@
+;;; sisu-mode.el --- Major mode for SiSU markup text
+
+;; Copyright (C) 2011  Free Software Foundation, Inc.
+
+;; Author: Ambrose Kofi Laing (& Ralph Amissah)
+;; Keywords: text, processes, tools
+;; Version: 3.0.3
+;; License: GPLv3
+;; Home URL: SiSU:   http://www.jus.uio.no/sisu
+;; originally looked at (based on) doc-mode, with kind permission of the author
+;;   Author: SUN, Tong <suntong001@users.sf.net>, (c)2001-6, all right reserved
+;;   Version: $Date: 2006/01/19 03:13:41 $ $Revision: 1.14 $
+;;   Home URL: http://xpt.sourceforge.net/
+
+;; 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, 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 <http://www.gnu.org/licenses/>.
+
+;; Viva Software Libre!
+;; Support the free software movement!
+;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;; Commentary:
+
+;; SiSU (http://www.sisudoc.org/) is a document structuring and
+;; publishing framework.  This package provides an Emacs major mode
+;; for SiSU markup.
+
+;; When this package is installed, files ending in ".sisu" are
+;; automatically associated with sisu-mode.  If a file doesn't have a
+;; .sisu extension, add a first line:
+;; # -*- Sisu -*-
+
+;; The documentation for the "Structure Of The Hierarchy Text" can be
+;; found in the sisustring for the sisu-mode function.
+
+;;; Code:
+
+;;{{{ Variables:
+
+(defgroup sisu-faces nil
+  "AsciiSisu highlighting"
+  :group 'sisus)
+
+;; == Colors
+; color n is more prominent than color n+1
+
+(defface sisu-title-1-face
+  `((((class color)
+      (background dark))
+     (:foreground "brown3" :bold t :height 1.2 :inherit variable-pitch))
+    (((class color)
+      (background light))
+     (:foreground "brown3" :bold t :height 1.2 :inherit variable-pitch))
+    (t (:weight bold :inherit variable-pitch)))
+  "Face for AsciiSisu titles at level 1."
+  :group 'sisu-faces)
+
+(defface sisu-title-2-face
+  `((((class color)
+      (background dark))
+     (:foreground "yellow4" :bold t :height 1.1 :inherit variable-pitch))
+    (((class color)
+      (background light))
+     (:foreground "yellow4" :bold t :height 1.1 :inherit variable-pitch))
+    (t (:weight bold :inherit variable-pitch)))
+  "Face for AsciiSisu titles at level 2."
+  :group 'sisu-faces)
+
+(defface sisu-title-3-face
+  `((((class color)
+      (background dark))
+     (:foreground "sienna3" :bold t))
+    (((class color)
+      (background light))
+     (:foreground "sienna3" :bold t))
+    (t (:weight bold)))
+  "Face for AsciiSisu titles at level 3."
+  :group 'sisu-faces)
+
+(defface sisu-title-4-face
+  `((((class color)
+      (background dark))
+     (:foreground "burlywood3"))
+    (((class color)
+      (background light))
+     (:foreground "burlywood3"))
+    (t ()))
+  "Face for AsciiSisu titles at level 4."
+  :group 'sisu-faces)
+
+(defface info-node
+  '((((class color) (background light)) (:foreground "brown" :bold t :italic t))
+    (((class color) (background dark)) (:foreground "white" :bold t :italic t))
+    (t (:bold t :italic t)))
+  "Face for Info node names."
+  :group 'sisu-faces)
+
+(defvar sisu-title-1 'sisu-title-1-face)
+(defvar sisu-title-2 'sisu-title-2-face)
+(defvar sisu-title-3 'sisu-title-3-face)
+(defvar sisu-title-4 'sisu-title-4-face)
+
+(defvar general-font-lock-red1 font-lock-warning-face)
+(defvar general-font-lock-red2 font-lock-comment-face)
+(defvar general-font-lock-red3 font-lock-string-face)
+
+(defvar general-font-lock-green1 font-lock-type-face)
+(defvar general-font-lock-green2 font-lock-constant-face)
+
+(defvar general-font-lock-blue1 font-lock-keyword-face)
+(defvar general-font-lock-blue2 font-lock-function-name-face)
+(defvar general-font-lock-blue3 font-lock-builtin-face)
+
+(defvar general-font-lock-yellow1 font-lock-variable-name-face)
+(defvar general-font-lock-yellow2 font-lock-comment-face)
+
+;; == sisu-mode settings
+
+(defvar sisu-mode-hook nil
+  "Normal hook run when entering Sisu Text mode.")
+
+(defvar sisu-mode-abbrev-table nil
+  "Abbrev table in use in Sisu-mode buffers.")
+(define-abbrev-table 'sisu-mode-abbrev-table ())
+
+(defconst sisu-font-lock-keywords
+  (eval-when-compile
+    (list
+
+     ;;grouped text
+     (cons "^group\{\\|^\}group"       'general-font-lock-red2)
+     (cons "^block\{\\|^\}block"       'general-font-lock-red2)
+     (cons "^code\{\\|^\}code"         'general-font-lock-red2)
+     (cons "^poem\{\\|^\}poem"         'general-font-lock-red2)
+     (cons "^alt\{\\|^\}alt"           'general-font-lock-red2)
+     (cons "^table\{.+\\|^\}table"     'general-font-lock-red2)
+     (cons "^\{table[^}]+\}"           'general-font-lock-red2)
+
+     ;; footnote/endnote
+       ;(cons "\~\{.+?\}\~"  'general-font-lock-green1)
+     (cons "\~\{\\*\\*\\|\~\{\\*\\|\~\{\\|\}\~"   'general-font-lock-red2)
+     (cons "\~\\[\\+\\|\~\\[\\*\\|\~\\[\\|\\]\~"  'general-font-lock-red2)
+
+     (cons "\~\\^ \\|^\\^\~ " 'general-font-lock-red2)
+
+     (list (concat
+      "\\(\*\~\\)"
+      "\\([^ \r\t\n]+\\)")
+     '(1 general-font-lock-red1 t)
+     '(2 general-font-lock-blue2 t))
+
+     ;; emphasis (can be program configured to be bold italics or underscore)
+     (list (concat
+      "\\([*]\{\\)"
+      "\\([^\}]+\\)"
+      "\\(\}[*]\\)")
+     '(1 general-font-lock-red1 t)
+     '(2 general-font-lock-red1 t)
+     '(3 general-font-lock-red1 t))
+
+     ;; bold
+     (list (concat
+      "\\([!]\{\\)"
+      "\\([^\}]+\\)"
+      "\\(\}[!]\\)")
+     '(1 general-font-lock-red1 t)
+     '(2 general-font-lock-red1 t)
+     '(3 general-font-lock-red1 t))
+     (cons "\\*[^ ]+\\*"               'general-font-lock-red1)
+     (cons "^!_ .+"                    'general-font-lock-red1)
+
+     ;;; italics
+     (list (concat
+      "\\([/]\{\\)"
+      "\\([^\}]+\\)"
+      "\\(\}[/]\\)")
+     '(1 general-font-lock-red1 t)
+     '(2 general-font-lock-blue1 t)
+           '(3 general-font-lock-red1 t))
+
+     ;; underscore
+     (list (concat
+      "\\([_]\{\\)"
+      "\\([^\}]+\\)"
+      "\\(\}[_]\\)")
+     '(1 general-font-lock-red1 t)
+     '(2 general-font-lock-red1 t)
+           '(3 general-font-lock-red1 t))
+
+     ;; monospace
+     (list (concat
+      "\\([#]\{\\)"
+      "\\([^\}]+\\)"
+      "\\(\}[#]\\)")
+     '(1 general-font-lock-red1 t)
+     '(2 general-font-lock-red1 t)
+           '(3 general-font-lock-red1 t))
+
+     ;; citation
+     (list (concat
+      "\\([\"]\{\\)"
+      "\\([^\}]+\\)"
+      "\\(\}[\"]\\)")
+     '(1 general-font-lock-red1 t)
+     '(2 general-font-lock-red1 t)
+           '(3 general-font-lock-red1 t))
+
+     ;; inserted text
+     (list (concat
+      "\\([\+]\{\\)"
+      "\\([^\}]+\\)"
+      "\\(\}[\+]\\)")
+     '(1 general-font-lock-red1 t)
+     '(2 general-font-lock-red1 t)
+           '(3 general-font-lock-red1 t))
+
+     ;; strike through
+     (list (concat
+      "\\(\\-\{\\)"
+      "\\([^\}]+\\)"
+      "\\(\}\\-\\)")
+     '(1 general-font-lock-red1 t)
+     '(2 general-font-lock-red1 t)
+           '(3 general-font-lock-red1 t))
+
+     ;; superscript
+     (list (concat
+      "\\(\\^\{\\)"
+      "\\([^\}]+\\)"
+      "\\(\}\\^\\)")
+     '(1 general-font-lock-red1 t)
+     '(2 general-font-lock-red1 t)
+           '(3 general-font-lock-red1 t))
+
+     ;; subscript
+     (list (concat
+      "\\([,]\{\\)"
+      "\\([^\}]+\\)"
+      "\\(\}[,]\\)")
+     '(1 general-font-lock-red1 t)
+     '(2 general-font-lock-red1 t)
+           '(3 general-font-lock-red1 t))
+
+     ;;numbered list
+     (cons "^# \\|^_# "                'general-font-lock-red1)
+
+     ;;bullet text
+     (cons "^_\\*[1-9] \\|^_\\* "      'general-font-lock-red1)
+
+     ;;indented text
+     (cons "^_[1-9] "                  'general-font-lock-red1)
+
+     ;;url
+     (cons "\\(^\\|[ ]\\)http:[/][/][^ \t\n\r<]+" 'general-font-lock-blue2)
+
+;; \\|\$
+
+     ;; Comment Lines
+     (cons "^% .*"                     'general-font-lock-blue1)
+     ;; line break
+     (cons "<br>"                      'general-font-lock-red1)
+
+     ;; Section titles
+     (list "^\\(\\([1-8]\\|:?[A-C]\\)\\~\\)\\(.*\\)"
+     '(1 sisu-title-1 t)
+     '(3 sisu-title-2 t))
+
+     ;; hyper-links
+     (list (concat
+      "\\(\{~^\\|\{\\)"
+      "\\([^\}\{]+\\)"
+      "\\(\}http:[/][/][^ \r\n\t<]+\\)")
+     '(1 general-font-lock-blue2 t)
+     '(2 general-font-lock-red1 t)
+     '(3 general-font-lock-blue2 t))
+
+     ;; book index
+     (cons "^\=\{.+\}"                 'general-font-lock-green1)
+
+     ;; numbers
+     (cons "\\<[.0-9]+\\>"             'general-font-lock-green2)
+
+     ;; bullets sisu_normal (nearly copied regexp)
+     (cons "^_\\([1-9*]\\|[1-9]\\*\\) " 'general-font-lock-blue2)
+
+     ;; image links
+     (list (concat
+      "\\(\{\\)"
+      "\\([^\}\{]+\\)"
+      "\\(\}image\\)")
+     '(1 general-font-lock-blue2 t)
+     '(2 general-font-lock-red1 t)
+           '(3 general-font-lock-blue2 t))
+
+     ;; insert file links
+     (list (concat
+      "\\(<< \\)"
+      "\\([^ \r\t\n]+\\.ss\\)"
+      "\\(i\\|t\\)")
+     '(1 general-font-lock-blue2 t)
+     '(2 general-font-lock-blue2 t)
+           '(3 general-font-lock-blue2 t))
+
+     ;; raw keywords
+     (list (concat
+      "^\\(\\@\\("
+      "title\\|"
+      "creator\\|"
+      "date\\|"
+      "publisher\\|"
+      "rights\\|"
+      "classify\\|"
+      "original\\|"
+      "notes\\|"
+      "links\\|"
+      "make\\|"
+      "\\):\\)\\(.*\\)")
+     '(1 sisu-title-2 keep)
+     '(3 sisu-title-3 keep))
+
+     ))
+ "Default expressions to highlight in AsciiSisu mode.")
+
+;;}}}
+
+;;{{{ Sisu & Autoload:
+
+;;;###autoload
+(define-derived-mode sisu-mode text-mode "SiSU"
+  "Major mode for editing SiSU files.
+SiSU (http://www.sisudoc.org/) is a document structuring and
+publishing framework.  This major mode handles SiSU markup."
+  (modify-syntax-entry ?\'  ".")
+  ;(flyspell-mode nil)
+
+  (make-local-variable 'paragraph-start)
+  (setq paragraph-start (concat "$\\|>" page-delimiter))
+  (make-local-variable 'paragraph-separate)
+  (setq paragraph-separate paragraph-start)
+  (make-local-variable 'paragraph-ignore-fill-prefix)
+  (setq paragraph-ignore-fill-prefix t)
+
+  (make-local-variable 'require-final-newline)
+  (setq require-final-newline t)
+
+  (make-local-variable 'font-lock-defaults)
+  (setq font-lock-defaults
+  '(sisu-font-lock-keywords
+    nil        ; KEYWORDS-ONLY: no
+    nil        ; CASE-FOLD: no
+    ((?_ . "w"))      ; SYNTAX-ALIST
+    ))
+  (run-hooks 'sisu-mode-hook))
+
+;;;###autoload (add-to-list 'auto-mode-alist '("\\.sisu\\'" . sisu-mode))
+
+(provide 'sisu-mode)
+
+;;}}}
+
+;;; sisu-mode.el ends here
diff --git a/packages/smart-operator/smart-operator.el b/packages/smart-operator/smart-operator.el
new file mode 100644 (file)
index 0000000..68332dd
--- /dev/null
@@ -0,0 +1,355 @@
+;;; smart-operator.el --- Insert operators with surrounding spaces smartly
+
+;; Copyright (C) 2004, 2005, 2007-2013 Free Software Foundation, Inc.
+
+;; Author: William Xu <william.xwl@gmail.com>
+;; Version: 4.0
+;; Url: http://xwl.appspot.com/ref/smart-operator.el
+
+;; 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, 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 EMMS; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; Smart Operator mode is a minor mode which automatically inserts
+;; surrounding spaces around operator symbols.  For example, `='
+;; becomes ` = ', `+=' becomes ` += '.  This is most handy for writing
+;; C-style source code.
+;;
+;; Type `M-x smart-operator-mode' to toggle this minor mode.
+
+;;; Acknowledgements
+
+;; Nikolaj Schumacher <n_schumacher@web.de>, for suggesting
+;; reimplementing as a minor mode and providing an initial patch for
+;; that.
+
+;;; Code:
+
+(require 'cc-mode)
+
+;;; smart-operator minor mode
+
+(defvar smart-operator-mode-map
+  (let ((keymap (make-sparse-keymap)))
+    (define-key keymap "=" 'smart-operator-self-insert-command)
+    (define-key keymap "<" 'smart-operator-<)
+    (define-key keymap ">" 'smart-operator->)
+    (define-key keymap "%" 'smart-operator-%)
+    (define-key keymap "+" 'smart-operator-+)
+    (define-key keymap "-" 'smart-operator--)
+    (define-key keymap "*" 'smart-operator-*)
+    (define-key keymap "/" 'smart-operator-/)
+    (define-key keymap "&" 'smart-operator-&)
+    (define-key keymap "|" 'smart-operator-self-insert-command)
+    ;; (define-key keymap "!" 'smart-operator-self-insert-command)
+    (define-key keymap ":" 'smart-operator-:)
+    (define-key keymap "?" 'smart-operator-?)
+    (define-key keymap "," 'smart-operator-\,)
+    (define-key keymap "~" 'smart-operator-~)
+    (define-key keymap "." 'smart-operator-.)
+    keymap)
+  "Keymap used my `smart-operator-mode'.")
+
+(defvar smart-operator-double-space-docs t
+  "Enable double spacing of . in document lines - e,g, type '.' => get '.  '")
+
+(defvar smart-operator-docs t
+  "Enable smart-operator in strings and comments")
+
+;;;###autoload
+(define-minor-mode smart-operator-mode
+  "Insert operators with surrounding spaces smartly."
+  nil " _+_" smart-operator-mode-map)
+
+;;;###autoload
+(defun smart-operator-mode-on ()
+  "Turn on `smart-operator-mode'.  "
+  (smart-operator-mode 1))
+
+;;;###autoload
+(defun smart-operator-self-insert-command (arg)
+  "Insert the entered operator plus surrounding spaces."
+  (interactive "p")
+  (smart-operator-insert (string last-command-event)))
+
+(defvar smart-operator-list
+  '("=" "<" ">" "%" "+" "-" "*" "/" "&" "|" "!" ":" "?" "," "."))
+
+(defun smart-operator-insert (op &optional only-where)
+  "See `smart-operator-insert-1'."
+  (delete-horizontal-space)
+  (cond ((and (smart-operator-lispy-mode?)
+           (not (smart-operator-document-line?)))
+         (smart-operator-lispy op))
+        ((not smart-operator-docs)
+         (smart-operator-insert-1 op 'middle))
+        (t
+         (smart-operator-insert-1 op only-where))))
+
+(defun smart-operator-insert-1 (op &optional only-where)
+  "Insert operator OP with surrounding spaces.
+e.g., `=' becomes ` = ', `+=' becomes ` += '.
+
+When `only-where' is 'after, we will insert space at back only;
+when `only-where' is 'before, we will insert space at front only;
+when `only-where' is 'middle, we will not insert space."
+  (pcase only-where
+    (`before (insert " " op))
+    (`middle (insert op))
+    (`after (insert op " "))
+    (_
+     (let ((begin? (bolp)))
+       (unless (or (looking-back (regexp-opt smart-operator-list)
+                                 (line-beginning-position))
+                   begin?)
+         (insert " "))
+       (insert op " ")
+       (when begin?
+         (indent-according-to-mode))))))
+
+(defun smart-operator-c-types ()
+  (concat c-primitive-type-key "?"))
+
+(defun smart-operator-document-line? ()
+  (memq (syntax-ppss-context (syntax-ppss)) '(comment string)))
+
+(defun smart-operator-lispy-mode? ()
+  (memq major-mode '(emacs-lisp-mode
+                     lisp-mode
+                     lisp-interaction-mode
+                     scheme-mode)))
+
+(defun smart-operator-lispy (op)
+  "We're in a Lisp-ish mode, so let's look for parenthesis.
+Meanwhile, if not found after ( operators are more likely to be function names,
+so let's not get too insert-happy."
+  (cond
+   ((save-excursion
+      (backward-char 1)
+      (looking-at "("))
+    (if (equal op ",")
+        (smart-operator-insert-1 op 'middle)
+      (smart-operator-insert-1 op 'after)))
+   ((equal op ",")
+    (smart-operator-insert-1 op 'before))
+   (t
+    (smart-operator-insert-1 op 'middle))))
+
+\f
+;;; Fine Tunings
+
+(defun smart-operator-< ()
+  "See `smart-operator-insert'."
+  (interactive)
+  (cond
+   ((or (and c-buffer-is-cc-mode
+             (looking-back
+              (concat "\\("
+                      (regexp-opt
+                       '("#include" "vector" "deque" "list" "map" "stack"
+                          "multimap" "set" "hash_map" "iterator" "template"
+                          "pair" "auto_ptr" "static_cast"
+                          "dynmaic_cast" "const_cast" "reintepret_cast"
+
+                          "#import"))
+                      "\\)\\ *")
+              (line-beginning-position)))
+        (eq major-mode 'sgml-mode))
+    (insert "<>")
+    (backward-char))
+   (t
+    (smart-operator-insert "<"))))
+
+(defun smart-operator-: ()
+  "See `smart-operator-insert'."
+  (interactive)
+  (cond (c-buffer-is-cc-mode
+         (if (looking-back "\\?.+")
+             (smart-operator-insert ":")
+           (smart-operator-insert ":" 'middle)))
+        ((memq major-mode '(haskell-mode))
+         (smart-operator-insert ":"))
+        (t
+         (smart-operator-insert ":" 'after))))
+
+(defun smart-operator-\, ()
+  "See `smart-operator-insert'."
+  (interactive)
+  (smart-operator-insert "," 'after))
+
+(defun smart-operator-. ()
+  "See `smart-operator-insert'."
+  (interactive)
+  (cond ((and smart-operator-double-space-docs
+          (smart-operator-document-line?))
+         (smart-operator-insert "." 'after)
+         (insert " "))
+        ((or (looking-back "[0-9]")
+             (or (and c-buffer-is-cc-mode
+                      (looking-back "[a-z]"))
+                 (and
+                  (memq major-mode '(python-mode ruby-mode))
+                  (looking-back "[a-z\)]"))
+                 (and
+                  (memq major-mode '(js-mode js2-mode))
+                  (looking-back "[a-z\)$]"))))
+             (insert "."))
+        ((memq major-mode '(cperl-mode perl-mode ruby-mode))
+         ;; Check for the .. range operator
+         (if (looking-back ".")
+               (insert ".")
+           (insert " . ")))
+        (t
+         (smart-operator-insert "." 'after)
+         (insert " "))))
+
+(defun smart-operator-& ()
+  "See `smart-operator-insert'."
+  (interactive)
+  (cond (c-buffer-is-cc-mode
+         ;; ,----[ cases ]
+         ;; | char &a = b; // FIXME
+         ;; | void foo(const int& a);
+         ;; | char *a = &b;
+         ;; | int c = a & b;
+         ;; | a && b;
+         ;; `----
+         (cond ((looking-back (concat (smart-operator-c-types) " *" ))
+                (smart-operator-insert "&" 'after))
+               ((looking-back "= *")
+                (smart-operator-insert "&" 'before))
+               (t
+                (smart-operator-insert "&"))))
+        (t
+         (smart-operator-insert "&"))))
+
+(defun smart-operator-* ()
+  "See `smart-operator-insert'."
+  (interactive)
+  (cond (c-buffer-is-cc-mode
+         ;; ,----
+         ;; | a * b;
+         ;; | char *a;
+         ;; | char **b;
+         ;; | (*a)->func();
+         ;; | *p++;
+         ;; | *a = *b;
+         ;; `----
+         (cond ((looking-back (concat (smart-operator-c-types) " *" ))
+                (smart-operator-insert "*" 'before))
+               ((looking-back "\\* *")
+                (smart-operator-insert "*" 'middle))
+               ((looking-back "^[ (]*")
+                (smart-operator-insert "*" 'middle)
+                (indent-according-to-mode))
+               ((looking-back "= *")
+                (smart-operator-insert "*" 'before))
+               (t
+                (smart-operator-insert "*"))))
+        (t
+         (smart-operator-insert "*"))))
+
+(defun smart-operator-> ()
+  "See `smart-operator-insert'."
+  (interactive)
+  (cond ((and c-buffer-is-cc-mode (looking-back " - "))
+         (delete-char -3)
+         (insert "->"))
+        (t
+         (smart-operator-insert ">"))))
+
+(defun smart-operator-+ ()
+  "See `smart-operator-insert'."
+  (interactive)
+  (cond ((and c-buffer-is-cc-mode (looking-back "\\+ *"))
+         (when (looking-back "[a-zA-Z0-9_] +\\+ *")
+           (save-excursion
+             (backward-char 2)
+             (delete-horizontal-space)))
+         (smart-operator-insert "+" 'middle)
+         (indent-according-to-mode))
+        (t
+         (smart-operator-insert "+"))))
+
+(defun smart-operator-- ()
+  "See `smart-operator-insert'."
+  (interactive)
+  (cond ((and c-buffer-is-cc-mode (looking-back "\\- *"))
+         (when (looking-back "[a-zA-Z0-9_] +\\- *")
+           (save-excursion
+             (backward-char 2)
+             (delete-horizontal-space)))
+         (smart-operator-insert "-" 'middle)
+         (indent-according-to-mode))
+        (t
+         (smart-operator-insert "-"))))
+
+(defun smart-operator-? ()
+  "See `smart-operator-insert'."
+  (interactive)
+  (cond (c-buffer-is-cc-mode
+         (smart-operator-insert "?"))
+        (t
+         (smart-operator-insert "?" 'after))))
+
+(defun smart-operator-% ()
+  "See `smart-operator-insert'."
+  (interactive)
+  (cond (c-buffer-is-cc-mode
+         ;; ,----
+         ;; | a % b;
+         ;; | printf("%d %d\n", a % b);
+         ;; `----
+         (if (and (looking-back "\".*")
+                  (not (looking-back "\",.*")))
+             (insert "%")
+           (smart-operator-insert "%")))
+        ;; If this is a comment or string, we most likely
+        ;; want no spaces - probably string formatting
+        ((and (memq major-mode '(python-mode))
+                    (smart-operator-document-line?))
+               (insert "%"))
+        (t
+         (smart-operator-insert "%"))))
+
+(defun smart-operator-~ ()
+  "See `smart-operator-insert'."
+  (interactive)
+  ;; First class regex operator =~ langs
+  (cond ((memq major-mode '(ruby-mode perl-mode cperl-mode))
+         (if (looking-back "= ")
+             (progn
+               (delete-char -2)
+               (insert "=~ "))
+           (insert "~")))
+        (t
+         (insert "~"))))
+
+(defun smart-operator-/ ()
+  "See `smart-operator-insert'."
+  (interactive)
+  ;; *nix shebangs #!
+  (cond ((and (eq 1 (line-number-at-pos))
+              (save-excursion
+                (move-beginning-of-line nil)
+                (looking-at "#!")))
+         (insert "/"))
+        (t
+         (smart-operator-insert "/"))))
+
+(provide 'smart-operator)
+
+;;; smart-operator.el ends here
diff --git a/packages/sml-mode/README b/packages/sml-mode/README
new file mode 100644 (file)
index 0000000..9632487
--- /dev/null
@@ -0,0 +1,19 @@
+SML-MODE is a major Emacs mode for editing Standard ML.
+It provides syntax highlighting and automatic indentation and
+comes with sml-proc which allows interaction with an inferior SML
+interactive loop.
+
+This release should work on any recent version of Emacs or XEmacs.
+If it doesn't: complain.
+
+Some more or less out of date documentation can be found in TeXinfo format.
+
+Check the INSTALL file for installation instructions.
+Check the NEWS file for a list of changes in this version.
+Check the BUGS and TODO file before sending me bug reports and requests for
+enhancements.
+
+Send any complaint/question/praise/ice-cream to me,
+
+
+       Stefan Monnier <monnier@iro.umontreal.ca>
diff --git a/packages/sml-mode/TODO b/packages/sml-mode/TODO
new file mode 100644 (file)
index 0000000..b9c7d34
--- /dev/null
@@ -0,0 +1,46 @@
+* file-name completion in sml-cm-mode.
+
+* Don't always jump to the *sml* buffer when you send a snippet of code.
+
+* Fix inferior-sml-mode's TAB completion of filenames so it doesn't append
+  a space.
+
+* Improve support for MLton's def-use info (see http://mlton.org/Emacs)
+
+* Add an sml-mlb-mode for ML Basis files (see http://mlton.org/Emacs)
+
+* make `M-x sml-compile' more generic.
+
+* allow specifying indentation of dependent keywords (how to indent `in'
+  relative to `let', for example).
+
+* recognize irrefutable patterns (with "Capital"-heuristics, for example:
+  a regexp like "\\([(),]\\|[_a-z][_a-z0-9]*\\)+").
+  This can then be used to allow indenting like
+
+               (fn x =>
+                some expressions)
+
+* take advantage of text after-the-line (when available) for indentation.
+
+* obey fixity directives.
+
+* dangling `case e' in stuff like
+
+  fun myfunction x = case x
+   of bla =>
+    | bli =>
+
+* deal with CPS kind of code ???
+
+  function1 (arg1, arg2, fn v1 =>
+  function2 (arg2, fn v2 =>
+  function3 (arg5, arg3, arg8, fn v3 =>
+  function4 (v1, v2, v3))))
+
+  or even just
+
+  F.LET (v1, foo,
+  F.LET (v2, bar,
+  F.LET (v3, baz,
+  F.RET [v1, v2, v3])))
diff --git a/packages/sml-mode/mltags b/packages/sml-mode/mltags
new file mode 100755 (executable)
index 0000000..606fc4c
--- /dev/null
@@ -0,0 +1,8 @@
+#!/bin/sh
+exec etags \
+  --language=none \
+  --regex='/[ \t]*\(exception\|datatype\|type\|val\|and\|fun\|structure\|signature\|functor\) \([A-Za-z_0-9]+\)/\2/' \
+  --regex='/[ \t]*[=|] \([A-Z_]+\)/\1/' \
+  $*
+
+#  --regex='/[ \t]*val [^:]+:[ \t]*\(.*\)/\1/' \
diff --git a/packages/sml-mode/sml-mode.el b/packages/sml-mode/sml-mode.el
new file mode 100644 (file)
index 0000000..aee66ba
--- /dev/null
@@ -0,0 +1,1802 @@
+;;; sml-mode.el --- Major mode for editing (Standard) ML  -*- lexical-binding: t; coding: utf-8 -*-
+
+;; Copyright (C) 1989,1999,2000,2004,2007,2010-2013  Free Software Foundation, Inc.
+
+;; Maintainer: (Stefan Monnier) <monnier@iro.umontreal.ca>
+;; Version: 6.4
+;; Keywords: SML
+;; Author:     Lars Bo Nielsen
+;;             Olin Shivers
+;;             Fritz Knabe (?)
+;;             Steven Gilmore (?)
+;;             Matthew Morley <mjm@scs.leeds.ac.uk>
+;;             Matthias Blume <blume@cs.princeton.edu>
+;;             (Stefan Monnier) <monnier@iro.umontreal.ca>
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; A major mode to edit Standard ML (SML) code.
+;; Provides the following features, among others:
+;; - Indentation.
+;; - Syntax highlighting.
+;; - Prettified display of ->, =>, fn, ...
+;; - Imenu.
+;; - which-function-mode.
+;; - Skeletons/templates.
+;; - Electric pipe key.
+;; - outline-minor-mode (with some known problems).
+;; - Interaction with a read-eval-print loop.
+
+;;;; Known bugs:
+
+;; - Indentation after "functor toto() where type foo = bar ="
+;;   Because the last is treated as an equality comparison.
+;; - indentation of a declaration after a long `datatype' can be slow.
+
+;;;; News:
+
+;;;;; Changes since 5.0:
+
+;; - sml-electric-pipe-mode to make the | key electric.
+;; - Removal of a lot of compatibility code.  Requires Emacs-24.
+;; - Integrate in GNU ELPA.
+
+;;;;; Changes since 4.1:
+
+;; - New indentation code using SMIE when available.
+;; - `sml-back-to-outer-indent' is now on S-tab (aka `backtab') rather
+;;   than M-tab.
+;; - Support for electric-layout-mode and electric-indent-mode.
+;; - `sml-mark-defun' tries to be more clever.
+;; - A single file (sml-mode.el) is needed unless you want to use an
+;;   interactive process like SML/NJ, or if your Emacs does not provide SMIE.
+
+;;;;; Changes since 4.0:
+
+;; - Switch to GPLv3+.
+;; - When possible (i.e. running under Emacs>=23), be case-sensitive when
+;;   expanding abbreviations, and don't expand them in comments and strings.
+;; - When you `next-error' to a type error, highlight the actual parts of the
+;;   types that differ.
+;; - Flush the recorded errors not only upon sml-compile and friends, but also
+;;   when typing commands directly at the prompt.
+;; - New command sml-mlton-typecheck.
+;; - Simple support to parse errors and warnings in MLton's output.
+;; - Simple support for MLton's def-use files.
+
+;;;;; Changes since 3.9.5:
+
+;; - No need to add the dir to your load-path any more.
+;;   The sml-mode-startup.el file does it for you.
+;; - Symbols like -> can be displayed as real arrows.
+;;   See sml-font-lock-symbols.
+;; - Fix some incompatibilities with the upcoming Emacs-21.4.
+;; - Indentation rules improved.  New customizable variable
+;;   `sml-rightalign-and'.  Also `sml-symbol-indent' is now customizable.
+
+;;;;; Changes since 3.9.3:
+
+;; - New add-log support (try C-x 4 a from within an SML function).
+;; - Imenu support
+;; - sml-bindings has disappeared.
+;; - The code skeletons are now abbrevs as well.
+;; - A new *sml* process is sent the content of sml-config-file
+;;   (~/.sml-proc.sml) if it exists.
+;; - `sml-compile' works yet a bit differently.  The command can begin
+;;   with `cd "path";' and it will be replaced by OS.FileSys.chDir.
+;; - run-sml now pops up the new buffer.  It can also run the command on
+;;   another machine.  And it always prompts for the command name.
+;;   Use a prefix argument if you want to give args or to specify a host on
+;;   which to run the command.
+;; - mouse-2 to yank in *sml* should work again (but won't work for next-error
+;;   any more).
+;; - New major-modes sml-cm-mode, sml-lex-mode and sml-yacc-mode.
+;; - sml-load-hook has disappeared as has inferior-sml-load-hook.
+;; - sml-mode-startup.el is now automatically generated and you're supposed to
+;;   `load' it from .emacs or site-start.el.
+;; - Minor bug fixes.
+
+;;; Code:
+
+(eval-when-compile (require 'cl))
+(require 'smie nil 'noerror)
+(require 'electric)
+
+(defgroup sml ()
+  "Editing SML code."
+  :group 'languages)
+
+(defcustom sml-indent-level 4
+  "Basic indentation step for SML code."
+  :type 'integer)
+
+(defcustom sml-indent-args sml-indent-level
+  "Indentation of args placed on a separate line."
+  :type 'integer)
+
+(defcustom sml-rightalign-and t
+  "If non-nil, right-align `and' with its leader.
+If nil:                                        If t:
+       datatype a = A                          datatype a = A
+       and b = B                                    and b = B"
+  :type 'boolean)
+
+(defcustom sml-electric-pipe-mode t
+  "If non-nil, automatically insert appropriate template when hitting |."
+  :type 'boolean)
+
+(defvar sml-mode-hook nil
+  "Run upon entering `sml-mode'.
+This is a good place to put your preferred key bindings.")
+
+;; font-lock setup
+
+(defvar sml-outline-regexp
+  ;; `st' and `si' are to match structure and signature.
+  "\f\\|s[ti]\\|[ \t]*\\(let[ \t]+\\)?\\(fun\\|and\\)\\_>"
+  "Regexp matching a major heading.
+This actually can't work without extending `outline-minor-mode' with the
+notion of \"the end of an outline\".")
+
+;;
+;; Internal defines
+;;
+
+(defvar sml-mode-map
+  (let ((map (make-sparse-keymap)))
+    ;; Text-formatting commands:
+    (define-key map "\C-c\C-m" 'sml-insert-form)
+    (define-key map "\M-|" 'sml-electric-pipe)
+    (define-key map "\M-\ " 'sml-electric-space)
+    (define-key map [backtab] 'sml-back-to-outer-indent)
+    ;; The standard binding is C-c C-z, but we add this one for compatibility.
+    (define-key map "\C-c\C-s" 'sml-prog-proc-switch-to)
+    map)
+  "The keymap used in `sml-mode'.")
+
+(defvar sml-mode-syntax-table
+  (let ((st (make-syntax-table)))
+    (modify-syntax-entry ?\* ". 23n" st)
+    (modify-syntax-entry ?\( "()1" st)
+    (modify-syntax-entry ?\) ")(4" st)
+    (mapc (lambda (c) (modify-syntax-entry c "_" st)) "._'")
+    (mapc (lambda (c) (modify-syntax-entry c "." st)) ",;")
+    ;; `!' is not really a prefix-char, oh well!
+    (mapc (lambda (c) (modify-syntax-entry c "'"  st)) "~#!")
+    (mapc (lambda (c) (modify-syntax-entry c "."  st)) "%&$+-/:<=>?@`^|")
+    st)
+  "The syntax table used in `sml-mode'.")
+
+
+(easy-menu-define sml-mode-menu sml-mode-map "Menu used in `sml-mode'."
+  '("SML"
+    ("Process"
+     ["Start SML repl"         sml-run         t]
+     ["-" nil nil]
+     ["Compile the project"    sml-prog-proc-compile   t]
+     ["Send file"              sml-prog-proc-load-file t]
+     ["Switch to SML repl"     sml-prog-proc-switch-to t]
+     ["--" nil nil]
+     ["Send buffer"            sml-prog-proc-send-buffer       t]
+     ["Send region"            sml-prog-proc-send-region       t]
+     ["Send function"          sml-send-function t]
+     ["Goto next error"                next-error      t])
+    ["Insert SML form"         sml-insert-form t]
+    ("Forms" :filter sml-forms-menu)
+    ["Indent region"           indent-region t]
+    ["Outdent line"            sml-back-to-outer-indent t]
+    ["-----" nil nil]
+    ["Customize SML-mode"  (customize-group 'sml)      t]
+    ["SML mode help"       describe-mode t]))
+
+;;
+;; Regexps
+;;
+
+(defun sml-syms-re (syms)
+  (concat "\\_<" (regexp-opt syms t) "\\_>"))
+
+;;
+
+(defconst sml-module-head-syms
+  '("signature" "structure" "functor" "abstraction"))
+
+
+(defconst sml-=-starter-syms
+  (list* "|" "val" "fun" "and" "datatype" "type" "abstype" "eqtype"
+        sml-module-head-syms)
+  "Symbols that can be followed by a `='.")
+(defconst sml-=-starter-re
+  (concat "\\S.|\\S.\\|" (sml-syms-re (cdr sml-=-starter-syms)))
+  "Symbols that can be followed by a `='.")
+
+(defconst sml-non-nested-of-starter-re
+  (sml-syms-re '("datatype" "abstype" "exception"))
+  "Symbols that can introduce an `of' that shouldn't behave like a paren.")
+
+(defconst sml-starters-syms
+  (append sml-module-head-syms
+         '("abstype" "datatype" "exception" "fun"
+           "local" "infix" "infixr" "sharing" "nonfix"
+           "open" "type" "val" "and"
+           "withtype" "with"))
+  "The starters of new expressions.")
+
+(defconst sml-pipeheads
+  '("|" "of" "fun" "fn" "and" "handle" "datatype" "abstype"
+    "(" "{" "[")
+   "A `|' corresponds to one of these.")
+
+(defconst sml-keywords-regexp
+  (sml-syms-re '("abstraction" "abstype" "and" "andalso" "as" "before" "case"
+                 "datatype" "else" "end" "eqtype" "exception" "do" "fn"
+                 "fun" "functor" "handle" "if" "in" "include" "infix"
+                 "infixr" "let" "local" "nonfix" "o" "of" "op" "open" "orelse"
+                 "overload" "raise" "rec" "sharing" "sig" "signature"
+                 "struct" "structure" "then" "type" "val" "where" "while"
+                 "with" "withtype"))
+  "A regexp that matches any and all keywords of SML.")
+
+(eval-and-compile
+  (defconst sml-id-re "\\sw\\(?:\\sw\\|\\s_\\)*"))
+
+(defconst sml-tyvarseq-re
+  (concat "\\(?:\\(?:'+" sml-id-re "\\|(\\(?:[,']\\|" sml-id-re
+          "\\|\\s-\\)+)\\)\\s-+\\)?"))
+
+;;; Font-lock settings ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defcustom sml-font-lock-symbols nil
+  "Display \\ and -> and such using symbols in fonts.
+This may sound like a neat trick, but be extra careful: it changes the
+alignment and can thus lead to nasty surprises w.r.t layout."
+  :type 'boolean)
+
+(defconst sml-font-lock-symbols-alist
+  '(("fn" . ?λ)
+    ("andalso" . ?∧) ;; ?⋀
+    ("orelse"  . ?∨) ;; ?⋁
+    ;; ("as" . ?≡)
+    ("not" . ?¬)
+    ("div" . ?÷)
+    ("*"   . ?×)
+    ("o"   . ?○)
+    ("->"  . ?→)
+    ("=>"  . ?⇒)
+    ("<-"  . ?←)
+    ("<>"  . ?≠)
+    (">="  . ?≥)
+    ("<="  . ?≤)
+    ("..." . ?⋯)
+    ;; ("::" . ?∷)
+    ;; Some greek letters for type parameters.
+    ("'a" . ?α)
+    ("'b" . ?β)
+    ("'c" . ?γ)
+    ("'d" . ?δ)
+    ))
+
+(defun sml-font-lock-compose-symbol ()
+  "Compose a sequence of ascii chars into a symbol.
+Regexp match data 0 points to the chars."
+  ;; Check that the chars should really be composed into a symbol.
+  (let* ((start (match-beginning 0))
+        (end (match-end 0))
+        (syntaxes (if (eq (char-syntax (char-after start)) ?w)
+                      '(?w) '(?. ?\\))))
+    (if (or (memq (char-syntax (or (char-before start) ?\ )) syntaxes)
+           (memq (char-syntax (or (char-after end) ?\ )) syntaxes)
+           (memq (get-text-property start 'face)
+                 '(font-lock-doc-face font-lock-string-face
+                   font-lock-comment-face)))
+       ;; No composition for you.  Let's actually remove any composition
+       ;; we may have added earlier and which is now incorrect.
+       (remove-text-properties start end '(composition))
+      ;; That's a symbol alright, so add the composition.
+      (compose-region start end (cdr (assoc (match-string 0)
+                                            sml-font-lock-symbols-alist)))))
+  ;; Return nil because we're not adding any face property.
+  nil)
+
+(defun sml-font-lock-symbols-keywords ()
+  (when sml-font-lock-symbols
+    `((,(regexp-opt (mapcar 'car sml-font-lock-symbols-alist) t)
+       (0 (sml-font-lock-compose-symbol))))))
+
+;; The font lock regular expressions.
+
+(defconst sml-font-lock-keywords
+  `(;;(sml-font-comments-and-strings)
+    (,(concat "\\_<\\(fun\\|and\\)\\s-+" sml-tyvarseq-re
+              "\\(" sml-id-re "\\)\\s-+[^ \t\n=]")
+     (1 font-lock-keyword-face)
+     (2 font-lock-function-name-face))
+    (,(concat "\\_<\\(\\(?:data\\|abs\\|with\\|eq\\)?type\\)\\s-+"
+              sml-tyvarseq-re "\\(" sml-id-re "\\)")
+     (1 font-lock-keyword-face)
+     (2 font-lock-type-def-face))
+    (,(concat "\\_<\\(val\\)\\s-+\\(?:" sml-id-re "\\_>\\s-*\\)?\\("
+              sml-id-re "\\)\\s-*[=:]")
+     (1 font-lock-keyword-face)
+     (2 font-lock-variable-name-face))
+    (,(concat "\\_<\\(structure\\|functor\\|abstraction\\)\\s-+\\("
+              sml-id-re "\\)")
+     (1 font-lock-keyword-face)
+     (2 font-lock-module-def-face))
+    (,(concat "\\_<\\(signature\\)\\s-+\\(" sml-id-re "\\)")
+     (1 font-lock-keyword-face)
+     (2 font-lock-interface-def-face))
+    
+    (,sml-keywords-regexp . font-lock-keyword-face)
+    ,@(sml-font-lock-symbols-keywords))
+  "Regexps matching standard SML keywords.")
+
+(defface font-lock-type-def-face
+  '((t (:bold t)))
+  "Font Lock mode face used to highlight type definitions."
+  :group 'font-lock-highlighting-faces)
+(defvar font-lock-type-def-face 'font-lock-type-def-face
+  "Face name to use for type definitions.")
+
+(defface font-lock-module-def-face
+  '((t (:bold t)))
+  "Font Lock mode face used to highlight module definitions."
+  :group 'font-lock-highlighting-faces)
+(defvar font-lock-module-def-face 'font-lock-module-def-face
+  "Face name to use for module definitions.")
+
+(defface font-lock-interface-def-face
+  '((t (:bold t)))
+  "Font Lock mode face used to highlight interface definitions."
+  :group 'font-lock-highlighting-faces)
+(defvar font-lock-interface-def-face 'font-lock-interface-def-face
+  "Face name to use for interface definitions.")
+
+;;
+;; Code to handle nested comments and unusual string escape sequences
+;;
+
+(defvar sml-syntax-prop-table
+  (let ((st (make-syntax-table)))
+    (modify-syntax-entry ?\\ "." st)
+    (modify-syntax-entry ?* "." st)
+    st)
+  "Syntax table for text-properties.")
+
+(defconst sml-font-lock-syntactic-keywords
+  `(("^\\s-*\\(\\\\\\)" (1 ',sml-syntax-prop-table))))
+
+(defconst sml-font-lock-defaults
+  '(sml-font-lock-keywords nil nil nil nil
+    (font-lock-syntactic-keywords . sml-font-lock-syntactic-keywords)))
+
+
+;;; Indentation with SMIE
+
+(defconst sml-smie-grammar
+  ;; We have several problem areas where SML's syntax can't be handled by an
+  ;; operator precedence grammar:
+  ;;
+  ;; "= A before B" is "= A) before B" if this is the
+  ;;   `boolean-=' but it is "= (A before B)" if it's the `definitional-='.
+  ;;   We can work around the problem by tweaking the lexer to return two
+  ;;   different tokens for the two different kinds of `='.
+  ;; "of A | B" in a "case" we want "of (A | B, but in a `datatype'
+  ;;   we want "of A) | B".
+  ;; "= A | B" can be "= A ) | B" if the = is from a "fun" definition,
+  ;;   but it is "= (A | B" if it is a `datatype' definition (of course, if
+  ;;   the previous token introducing the = is `and', deciding whether
+  ;;   it's a datatype or a function requires looking even further back).
+  ;; "functor foo (...) where type a = b = ..." the first `=' looks very much
+  ;;   like a `definitional-=' even tho it's just an equality constraint.
+  ;;   Currently I don't even try to handle `where' at all.
+  (smie-prec2->grammar
+   (smie-merge-prec2s
+    (smie-bnf->prec2
+     '((exp ("if" exp "then" exp "else" exp)
+            ("case" exp "of" branches)
+            ("let" decls "in" cmds "end")
+            ("struct" decls "end")
+            ("sig" decls "end")
+            (sexp)
+            (sexp "handle" branches)
+            ("fn" sexp "=>" exp))
+       ;; "simple exp"s are the ones that can appear to the left of `handle'.
+       (sexp (sexp ":" type) ("(" exps ")")
+             (sexp "orelse" sexp)
+             (marg ":>" type)
+             (sexp "andalso" sexp))
+       (cmds (cmds ";" cmds) (exp))
+       (exps (exps "," exps) (exp))     ; (exps ";" exps)
+       (branches (sexp "=>" exp) (branches "|" branches))
+       ;; Operator precedence grammars handle separators much better then
+       ;; starters/terminators, so let's pretend that let/fun are separators.
+       (decls (sexp "d=" exp)
+              (sexp "d=" databranches)
+              (funbranches "|" funbranches)
+              (sexp "=of" type)         ;After "exception".
+              ;; FIXME: Just like PROCEDURE in Pascal and Modula-2, this
+              ;; interacts poorly with the other constructs since I
+              ;; can't make "local" a separator like fun/val/type/...
+              ("local" decls "in" decls "end")
+              ;; (decls "local" decls "in" decls "end")
+              (decls "functor" decls)
+              (decls "signature" decls)
+              (decls "structure" decls)
+              (decls "type" decls)
+              (decls "open" decls)
+              (decls "and" decls)
+              (decls "infix" decls)
+              (decls "infixr" decls)
+              (decls "nonfix" decls)
+              (decls "abstype" decls)
+              (decls "datatype" decls)
+              (decls "exception" decls)
+              (decls "fun" decls)
+              (decls "val" decls))
+       (type (type "->" type)
+             (type "*" type))
+       (funbranches (sexp "d=" exp))
+       (databranches (sexp "=of" type) (databranches "d|" databranches))
+       ;; Module language.
+       ;; (mexp ("functor" marg "d=" mexp)
+       ;;       ("structure" marg "d=" mexp)
+       ;;       ("signature" marg "d=" mexp))
+       (marg (marg ":" type) (marg ":>" type))
+       (toplevel (decls) (exp) (toplevel ";" toplevel)))
+     ;; '(("local" . opener))
+     ;; '((nonassoc "else") (right "handle"))
+     '((nonassoc "of") (assoc "|"))     ; "case a of b => case c of d => e | f"
+     '((nonassoc "handle") (assoc "|")) ; Idem for "handle".
+     '((assoc "->") (assoc "*"))
+     '((assoc "val" "fun" "type" "datatype" "abstype" "open" "infix" "infixr"
+              "nonfix" "functor" "signature" "structure" "exception"
+              ;; "local"
+              )
+       (assoc "and"))
+     '((assoc "orelse") (assoc "andalso") (nonassoc ":"))
+     '((assoc ";")) '((assoc ",")) '((assoc "d|")))
+
+    (smie-precs->prec2
+     '((nonassoc "andalso")                       ;To anchor the prec-table.
+       (assoc "before")                           ;0
+       (assoc ":=" "o")                           ;3
+       (nonassoc ">" ">=" "<>" "<" "<=" "=")      ;4
+       (assoc "::" "@")                           ;5
+       (assoc "+" "-" "^")                        ;6
+       (assoc "/" "*" "quot" "rem" "div" "mod")   ;7
+       (nonassoc " -dummy- ")))                   ;Bogus anchor at the end.
+    )))
+
+(defvar sml-indent-separator-outdent 2)
+
+(defun sml-smie-rules (kind token)
+  ;; I much preferred the pcase version of the code, especially while
+  ;; edebugging the code.  But that will have to wait until we get rid of
+  ;; support for Emacs-23.
+  (case kind
+    (:elem (case token
+             (basic sml-indent-level)
+             (args  sml-indent-args)))
+    (:list-intro (member token '("fn")))
+    (:after
+     (cond
+      ((equal token "struct") 0)
+      ((equal token "=>") (if (smie-rule-hanging-p) 0 2))
+      ((equal token "in") (if (smie-rule-parent-p "local") 0))
+      ((equal token "of") 3)
+      ((member token '("(" "{" "[")) (if (not (smie-rule-hanging-p)) 2))
+      ((equal token "else") (if (smie-rule-hanging-p) 0)) ;; (:next "if" 0)
+      ((member token '("|" "d|" ";" ",")) (smie-rule-separator kind))
+      ((equal token "d=")
+       (if (and (smie-rule-parent-p "val") (smie-rule-next-p "fn")) -3))))
+    (:before
+     (cond
+      ((equal token "=>") (if (smie-rule-parent-p "fn") 3))
+      ((equal token "of") 1)
+      ;; In case the language is extended to allow a | directly after of.
+      ((and (equal token "|") (smie-rule-prev-p "of")) 1)
+      ((member token '("|" "d|" ";" ",")) (smie-rule-separator kind))
+      ;; Treat purely syntactic block-constructs as being part of their parent,
+      ;; when the opening statement is hanging.
+      ((member token '("let" "(" "[" "{"))
+       (if (smie-rule-hanging-p) (smie-rule-parent)))
+      ;; Treat if ... else if ... as a single long syntactic construct.
+      ;; Similarly, treat fn a => fn b => ... as a single construct.
+      ((member token '("if" "fn"))
+       (and (not (smie-rule-bolp))
+            (smie-rule-prev-p (if (equal token "if") "else" "=>"))
+            (smie-rule-parent)))
+      ((equal token "and")
+       ;; FIXME: maybe "and" (c|sh)ould be handled as an smie-separator.
+       (cond
+        ((smie-rule-parent-p "datatype") (if sml-rightalign-and 5 0))
+        ((smie-rule-parent-p "fun" "val") 0)))
+      ((equal token "d=")
+       (cond
+        ((smie-rule-parent-p "datatype") (if (smie-rule-bolp) 2))
+        ((smie-rule-parent-p "structure" "signature") 0)))
+      ;; Indent an expression starting with "local" as if it were starting
+      ;; with "fun".
+      ((equal token "local") (smie-indent-keyword "fun"))
+      ;; FIXME: type/val/fun/... are separators but "local" is not, even though
+      ;; it appears in the same list.  Try to fix up the problem by hand.
+      ;; ((or (equal token "local")
+      ;;      (equal (cdr (assoc token smie-grammar))
+      ;;             (cdr (assoc "fun" smie-grammar))))
+      ;;  (let ((parent (save-excursion (smie-backward-sexp))))
+      ;;    (when (or (and (equal (nth 2 parent) "local")
+      ;;                   (null (car parent)))
+      ;;              (progn
+      ;;                (setq parent (save-excursion (smie-backward-sexp "fun")))
+      ;;                (eq (car parent) (nth 1 (assoc "fun" smie-grammar)))))
+      ;;      (goto-char (nth 1 parent))
+      ;;      (cons 'column (smie-indent-virtual)))))
+      ))))
+
+(defun sml-smie-definitional-equal-p ()
+  "Figure out which kind of \"=\" this is.
+Assumes point is right before the = sign."
+  ;; The idea is to look backward for the first occurrence of a token that
+  ;; requires a definitional "=" and then see if there's such a definitional
+  ;; equal between that token and ourselves (in which case we're not
+  ;; a definitional = ourselves).
+  ;; The "search for =" is naive and will match "=>" and "<=", but it turns
+  ;; out to be OK in practice because such tokens very rarely (if ever) appear
+  ;; between the =-starter and the corresponding definitional equal.
+  ;; One known problem case is code like:
+  ;; "functor foo (structure s : S) where type t = s.t ="
+  ;; where the "type t = s.t" is mistaken for a type definition.
+  (let ((re (concat "\\(" sml-=-starter-re "\\)\\|=")))
+    (save-excursion
+      (and (re-search-backward re nil t)
+           (or (match-beginning 1)
+               ;; If we first hit a "=", then that = is probably definitional
+               ;; and  we're an equality, but not necessarily.  One known
+               ;; problem case is code like:
+               ;; "functor foo (structure s : S) where type t = s.t ="
+               ;; where the first = is more like an equality (tho it doesn't
+               ;; matter much) and the second is definitional.
+               ;;
+               ;; FIXME: The test below could be used to recognize that the
+               ;; second = is not a mere equality, but that's not enough to
+               ;; parse the construct properly: we'd need something
+               ;; like a third kind of = token for structure definitions, in
+               ;; order for the parser to be able to skip the "type t = s.t"
+               ;; as a sub-expression.
+               ;;
+               ;; (and (not (looking-at "=>"))
+               ;;      (not (eq ?< (char-before))) ;Not a <=
+               ;;      (re-search-backward re nil t)
+               ;;      (match-beginning 1)
+               ;;      (equal "type" (buffer-substring (- (match-end 1) 4)
+               ;;                                      (match-end 1))))
+               )))))
+
+(defun sml-smie-non-nested-of-p ()
+  ;; FIXME: Maybe datatype-|-p makes this nested-of business unnecessary.
+  "Figure out which kind of \"of\" this is.
+Assumes point is right before the \"of\" symbol."
+  (save-excursion
+    (and (re-search-backward (concat "\\(" sml-non-nested-of-starter-re
+                                     "\\)\\|\\_<case\\_>") nil t)
+         (match-beginning 1))))
+
+(defun sml-smie-datatype-|-p ()
+  "Figure out which kind of \"|\" this is.
+Assumes point is right before the | symbol."
+  (save-excursion
+    (forward-char 1)                    ;Skip the |.
+    (let ((after-type-def
+           '("|" "of" "in" "datatype" "and" "exception" "abstype" "infix"
+             "infixr" "nonfix" "local" "val" "fun" "structure" "functor"
+             "signature")))
+      (or (member (sml-smie-forward-token-1) after-type-def) ;Skip the tag.
+          (member (sml-smie-forward-token-1) after-type-def)))))
+
+(defun sml-smie-forward-token-1 ()
+  (forward-comment (point-max))
+  (buffer-substring-no-properties
+   (point)
+   (progn
+     (or (/= 0 (skip-syntax-forward "'w_"))
+         (skip-syntax-forward ".'"))
+     (point))))
+
+(defun sml-smie-forward-token ()
+  (let ((sym (sml-smie-forward-token-1)))
+    (cond
+     ((equal "op" sym)
+      (concat "op " (sml-smie-forward-token-1)))
+     ((member sym '("|" "of" "="))
+      ;; The important lexer for indentation's performance is the backward
+      ;; lexer, so for the forward lexer we delegate to the backward one.
+      (save-excursion (sml-smie-backward-token)))
+     (t sym))))
+
+(defun sml-smie-backward-token-1 ()
+  (forward-comment (- (point)))
+  (buffer-substring-no-properties
+   (point)
+   (progn
+     (or (/= 0 (skip-syntax-backward ".'"))
+         (skip-syntax-backward "'w_"))
+     (point))))
+
+(defun sml-smie-backward-token ()
+  (let ((sym (sml-smie-backward-token-1)))
+    (unless (zerop (length sym))
+      ;; FIXME: what should we do if `sym' = "op" ?
+      (let ((point (point)))
+       (if (equal "op" (sml-smie-backward-token-1))
+           (concat "op " sym)
+         (goto-char point)
+         (cond
+          ((string= sym "=") (if (sml-smie-definitional-equal-p) "d=" "="))
+          ((string= sym "of") (if (sml-smie-non-nested-of-p) "=of" "of"))
+           ((string= sym "|") (if (sml-smie-datatype-|-p) "d|" "|"))
+          (t sym)))))))
+
+;;;;
+;;;; Imenu support
+;;;;
+
+(defconst sml-imenu-regexp
+  (concat "^[ \t]*\\(let[ \t]+\\)?"
+         (regexp-opt (append sml-module-head-syms
+                             '("and" "fun" "datatype" "abstype" "type")) t)
+         "\\_>"))
+
+(defun sml-imenu-create-index ()
+  (let (alist)
+    (goto-char (point-max))
+    (while (re-search-backward sml-imenu-regexp nil t)
+      (save-excursion
+       (let ((kind (match-string 2))
+             (column (progn (goto-char (match-beginning 2)) (current-column)))
+             (location
+              (progn (goto-char (match-end 0))
+                     (forward-comment (point-max))
+                     (when (looking-at sml-tyvarseq-re)
+                       (goto-char (match-end 0)))
+                     (point)))
+             (name (sml-smie-forward-token)))
+         ;; Eliminate trivial renamings.
+         (when (or (not (member kind '("structure" "signature")))
+                   (when (search-forward "=" nil t)
+                      (forward-comment (point-max))
+                      (looking-at "sig\\|struct")))
+           (push (cons (concat (make-string (/ column 2) ?\ ) name) location)
+                 alist)))))
+    alist))
+
+;;; Generic prog-proc interaction.
+
+(require 'comint)
+(require 'compile)
+
+(defvar sml-prog-proc-mode-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map [?\C-c ?\C-l] 'sml-prog-proc-load-file)
+    (define-key map [?\C-c ?\C-c] 'sml-prog-proc-compile)
+    (define-key map [?\C-c ?\C-z] 'sml-prog-proc-switch-to)
+    (define-key map [?\C-c ?\C-r] 'sml-prog-proc-send-region)
+    (define-key map [?\C-c ?\C-b] 'sml-prog-proc-send-buffer)
+    ;; FIXME: Add
+    ;; (define-key map [?\M-C-x] 'sml-prog-proc-send-defun)
+    ;; (define-key map [?\C-x ?\C-e] 'sml-prog-proc-send-last-sexp)
+    ;; FIXME: Add menu.  Now, that's trickier because keymap inheritance
+    ;; doesn't play nicely with menus!
+    map)
+  "Keymap for `sml-prog-proc-mode'.")
+
+(defvar sml-prog-proc--buffer nil
+  "The inferior-process buffer to which to send code.")
+(make-variable-buffer-local 'sml-prog-proc--buffer)
+
+(defstruct (sml-prog-proc-descriptor
+            (:constructor sml-prog-proc-make)
+            (:predicate nil)
+            (:copier nil))
+  (name nil :read-only t)
+  (run nil :read-only t)
+  (load-cmd nil :read-only t)
+  (chdir-cmd nil :read-only t)
+  (command-eol "\n" :read-only t)
+  (compile-commands-alist nil :read-only t))
+
+(defvar sml-prog-proc-descriptor nil
+  "Struct containing the various functions to create a new process, ...")
+
+(defmacro sml-prog-proc--prop (prop)
+  `(,(intern (format "sml-prog-proc-descriptor-%s" prop))
+    (or sml-prog-proc-descriptor
+        ;; FIXME: Look for available ones and pick one.
+        (error "Not a `sml-prog-proc' buffer"))))
+(defmacro sml-prog-proc--call (method &rest args)
+  `(funcall (sml-prog-proc--prop ,method) ,@args))
+
+;; The inferior process and his buffer are basically interchangeable.
+;; Currently the code takes sml-prog-proc--buffer as the main reference,
+;; but all users should either use sml-prog-proc-proc or sml-prog-proc-buffer
+;; to find the info.
+
+(defun sml-prog-proc-proc ()
+  "Return the inferior process for the code in current buffer."
+  (or (and (buffer-live-p sml-prog-proc--buffer)
+           (get-buffer-process sml-prog-proc--buffer))
+      (when (derived-mode-p 'sml-prog-proc-mode 'sml-prog-proc-comint-mode)
+        (setq sml-prog-proc--buffer (current-buffer))
+        (get-buffer-process sml-prog-proc--buffer))
+      (let ((ppd sml-prog-proc-descriptor)
+            (buf (sml-prog-proc--call run)))
+        (with-current-buffer buf
+          (if (and ppd (null sml-prog-proc-descriptor))
+              (set (make-local-variable 'sml-prog-proc-descriptor) ppd)))
+        (setq sml-prog-proc--buffer buf)
+        (get-buffer-process sml-prog-proc--buffer))))
+
+(defun sml-prog-proc-buffer ()
+  "Return the buffer of the inferior process."
+  (process-buffer (sml-prog-proc-proc)))
+
+(defun sml-prog-proc-switch-to ()
+  "Switch to the buffer running the read-eval-print process."
+  (interactive)
+  (pop-to-buffer (sml-prog-proc-buffer)))
+
+(defun sml-prog-proc-send-string (proc str)
+  "Send command STR to PROC, with an EOL terminator appended."
+  (with-current-buffer (process-buffer proc)
+    ;; FIXME: comint-send-string does not pass the string through
+    ;; comint-input-filter-function, so we have to do it by hand.
+    ;; Maybe we should insert the command into the buffer and then call
+    ;; comint-send-input?
+    (sml-prog-proc-comint-input-filter-function nil)
+    (comint-send-string proc (concat str (sml-prog-proc--prop command-eol)))))
+
+(defun sml-prog-proc-load-file (file &optional and-go)
+  "Load FILE into the read-eval-print process.
+FILE is the file visited by the current buffer.
+If prefix argument AND-GO is used, then we additionally switch
+to the buffer where the process is running."
+  (interactive
+   (list (or buffer-file-name
+             (read-file-name "File to load: " nil nil t))
+         current-prefix-arg))
+  (comint-check-source file)
+  (let ((proc (sml-prog-proc-proc)))
+    (sml-prog-proc-send-string proc (sml-prog-proc--call load-cmd file))
+    (when and-go (pop-to-buffer (process-buffer proc)))))
+
+(defvar sml-prog-proc--tmp-file nil)
+
+(defun sml-prog-proc-send-region (start end &optional and-go)
+  "Send the content of the region to the read-eval-print process.
+START..END delimit the region; AND-GO if non-nil indicate to additionally
+switch to the process's buffer."
+  (interactive "r\nP")
+  (if (> start end) (let ((tmp end)) (setq end start) (setq start tmp))
+    (if (= start end) (error "Nothing to send: the region is empty")))
+  (let ((proc (sml-prog-proc-proc))
+        (tmp (make-temp-file "emacs-region")))
+    (write-region start end tmp nil 'silently)
+    (when sml-prog-proc--tmp-file
+      (ignore-errors (delete-file (car sml-prog-proc--tmp-file)))
+      (set-marker (cdr sml-prog-proc--tmp-file) nil))
+    (setq sml-prog-proc--tmp-file (cons tmp (copy-marker start)))
+    (sml-prog-proc-send-string proc (sml-prog-proc--call load-cmd tmp))
+    (when and-go (pop-to-buffer (process-buffer proc)))))
+
+(defun sml-prog-proc-send-buffer (&optional and-go)
+  "Send the content of the current buffer to the read-eval-print process.
+AND-GO if non-nil indicate to additionally switch to the process's buffer."
+  (interactive "P")
+  (sml-prog-proc-send-region (point-min) (point-max) and-go))
+
+(define-derived-mode sml-prog-proc-mode prog-mode "Sml-Prog-Proc"
+  "Major mode for editing source code and interact with an interactive loop."
+  )
+
+;;; Extended comint-mode for Sml-Prog-Proc.
+
+(defun sml-prog-proc-chdir (dir)
+  "Change the working directory of the inferior process to DIR."
+  (interactive "DChange to directory: ")
+  (let ((dir (expand-file-name dir))
+        (proc (sml-prog-proc-proc)))
+    (with-current-buffer (process-buffer proc)
+      (sml-prog-proc-send-string proc (sml-prog-proc--call chdir-cmd dir))
+      (setq default-directory (file-name-as-directory dir)))))
+
+(defun sml-prog-proc-comint-input-filter-function (str)
+  ;; `compile.el' doesn't know that file location info from errors should be
+  ;; recomputed afresh (without using stale info from earlier compilations).
+  (compilation-forget-errors)       ;Has to run before compilation-fake-loc.
+  (if (and sml-prog-proc--tmp-file (marker-buffer (cdr sml-prog-proc--tmp-file)))
+      (compilation-fake-loc (cdr sml-prog-proc--tmp-file)
+                            (car sml-prog-proc--tmp-file)))
+  str)
+
+(defvar sml-prog-proc-comint-mode-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map "\C-c\C-l" 'sml-prog-proc-load-file)
+    map))
+
+(define-derived-mode sml-prog-proc-comint-mode comint-mode "Sml-Prog-Proc-Comint"
+  "Major mode for an inferior process used to run&compile source code."
+  ;; Enable compilation-minor-mode, but only after the child mode is setup
+  ;; since the child-mode might want to add rules to
+  ;; compilation-error-regexp-alist.
+  (add-hook 'after-change-major-mode-hook #'compilation-minor-mode nil t)
+  ;; The keymap of compilation-minor-mode is too unbearable, so we
+  ;; need to hide most of the bindings.
+  (let ((map (make-sparse-keymap)))
+    (dolist (keys '([menu-bar] [follow-link]))
+      ;; Preserve some of the bindings.
+      (define-key map keys (lookup-key compilation-minor-mode-map keys)))
+    (add-to-list 'minor-mode-overriding-map-alist
+                 (cons 'compilation-minor-mode map)))
+
+  (add-hook 'comint-input-filter-functions
+            #'sml-prog-proc-comint-input-filter-function nil t))
+
+(defvar sml-prog-proc--compile-command nil
+  "The command used by default by `sml-prog-proc-compile'.")
+
+(defun sml-prog-proc-compile (command &optional and-go)
+  "Pass COMMAND to the read-eval-loop process to compile the current file.
+
+You can then use the command \\[next-error] to find the next error message
+and move to the source code that caused it.
+
+Interactively, prompts for the command if `compilation-read-command' is
+non-nil.  With prefix arg, always prompts.
+
+Prefix arg AND-GO also means to switch to the read-eval-loop buffer afterwards."
+  (interactive
+   (let* ((dir default-directory)
+         (cmd "cd \"."))
+     ;; Look for files to determine the default command.
+     (while (and (stringp dir)
+                 (progn
+                   (dolist (cf (sml-prog-proc--prop compile-commands-alist))
+                     (when (file-exists-p (expand-file-name (cdr cf) dir))
+                       (setq cmd (concat cmd "\"; " (car cf)))
+                       (return nil)))
+                   (not cmd)))
+       (let ((newdir (file-name-directory (directory-file-name dir))))
+        (setq dir (unless (equal newdir dir) newdir))
+        (setq cmd (concat cmd "/.."))))
+     (setq cmd
+          (cond
+           ((local-variable-p 'sml-prog-proc--compile-command)
+             sml-prog-proc--compile-command)
+           ((string-match "^\\s-*cd\\s-+\"\\.\"\\s-*;\\s-*" cmd)
+            (substring cmd (match-end 0)))
+           ((string-match "^\\s-*cd\\s-+\"\\(\\./\\)" cmd)
+            (replace-match "" t t cmd 1))
+           ((string-match ";" cmd) cmd)
+           (t sml-prog-proc--compile-command)))
+     ;; code taken from compile.el
+     (list (if (or compilation-read-command current-prefix-arg)
+               (read-from-minibuffer "Compile command: "
+                                    cmd nil nil '(compile-history . 1))
+             cmd))))
+     ;; ;; now look for command's file to determine the directory
+     ;; (setq dir default-directory)
+     ;; (while (and (stringp dir)
+     ;;            (dolist (cf (sml-prog-proc--prop compile-commands-alist) t)
+     ;;              (when (and (equal cmd (car cf))
+     ;;                         (file-exists-p (expand-file-name (cdr cf) dir)))
+     ;;                (return nil))))
+     ;;   (let ((newdir (file-name-directory (directory-file-name dir))))
+     ;;     (setq dir (unless (equal newdir dir) newdir))))
+     ;; (setq dir (or dir default-directory))
+     ;; (list cmd dir)))
+  (set (make-local-variable 'sml-prog-proc--compile-command) command)
+  (save-some-buffers (not compilation-ask-about-save) nil)
+  (let ((dir default-directory))
+    (when (string-match "^\\s-*cd\\s-+\"\\([^\"]+\\)\"\\s-*;" command)
+      (setq dir (match-string 1 command))
+      (setq command (replace-match "" t t command)))
+    (setq dir (expand-file-name dir))
+    (let ((proc (sml-prog-proc-proc))
+          (eol (sml-prog-proc--prop command-eol)))
+      (with-current-buffer (process-buffer proc)
+        (setq default-directory dir)
+        (sml-prog-proc-send-string
+         proc (concat (sml-prog-proc--call chdir-cmd dir)
+                      ;; Strip the newline, to avoid adding a prompt.
+                      (if (string-match "\n\\'" eol)
+                          (replace-match " " t t eol) eol)
+                      command))
+        (when and-go (pop-to-buffer (process-buffer proc)))))))
+
+
+;;; SML Sml-Prog-Proc support.
+
+(defcustom sml-program-name "sml"
+  "Program to run as Standard SML read-eval-print loop."
+  :type 'string)
+
+(defcustom sml-default-arg ""
+  "Default command line option to pass to `sml-program-name', if any."
+  :type 'string)
+
+(defcustom sml-host-name ""
+  "Host on which to run `sml-program-name'."
+  :type 'string)
+
+(defcustom sml-config-file "~/.smlproc.sml"
+  "File that should be fed to the SML process when started."
+  :type 'string)
+
+
+(defcustom sml-prompt-regexp "^[-=>#] *"
+  "Regexp used to recognise prompts in the inferior SML process."
+  :type 'regexp)
+
+(defcustom sml-compile-commands-alist
+  '(("CMB.make()" . "all-files.cm")
+    ("CMB.make()" . "pathconfig")
+    ("CM.make()" . "sources.cm")
+    ("use \"load-all\"" . "load-all"))
+  "Commands used by default by `sml-sml-prog-proc-compile'.
+Each command is associated with its \"main\" file.
+It is perfectly OK to associate several files with a command or several
+commands with the same file.")
+
+;; FIXME: Try to auto-detect the process and set those vars accordingly.
+
+(defvar sml-use-command "use \"%s\""
+  "Template for loading a file into the inferior SML process.
+Set to \"use \\\"%s\\\"\" for SML/NJ or Edinburgh ML; 
+set to \"PolyML.use \\\"%s\\\"\" for Poly/ML, etc.")
+
+(defvar sml-cd-command "OS.FileSys.chDir \"%s\""
+  "Command template for changing working directories under SML.
+Set this to nil if your compiler can't change directories.
+
+The format specifier \"%s\" will be converted into the directory name
+specified when running the command \\[sml-cd].")
+
+(defvar sml-error-regexp-alist
+  `( ;; Poly/ML messages
+    ("^\\(Error\\|Warning:\\) in '\\(.+\\)', line \\([0-9]+\\)" 2 3)
+    ;; Moscow ML
+    ("^File \"\\([^\"]+\\)\", line \\([0-9]+\\)\\(-\\([0-9]+\\)\\)?, characters \\([0-9]+\\)-\\([0-9]+\\):" 1 2 5)
+    ;; SML/NJ:  the file-pattern is anchored to avoid
+    ;; pathological behavior with very long lines.
+    ("^[-= ]*\\(.*[^\n)]\\)\\( (.*)\\)?:\\([0-9]+\\)\\.\\([0-9]+\\)\\(-\\([0-9]+\\)\\.\\([0-9]+\\)\\)? \\(Error\\|Warnin\\(g\\)\\): .*" 1
+     (3 . 6) (4 . 7) (9))
+    ;; SML/NJ's exceptions:  see above.
+    ("^ +\\(raised at: \\)?\\(.+\\):\\([0-9]+\\)\\.\\([0-9]+\\)\\(-\\([0-9]+\\)\\.\\([0-9]+\\)\\)" 2
+     (3 . 6) (4 . 7)))
+  "Alist that specifies how to match errors in compiler output.
+See `compilation-error-regexp-alist' for a description of the format.")
+
+(defconst sml-pp-functions
+  (sml-prog-proc-make :name "SML"
+                  :run (lambda () (call-interactively #'sml-run))
+                  :load-cmd (lambda (file) (format sml-use-command file))
+                  :chdir-cmd (lambda (dir) (format sml-cd-command dir))
+                  :compile-commands-alist sml-compile-commands-alist
+                  :command-eol ";\n"
+                  ))
+
+;; font-lock support
+(defconst inferior-sml-font-lock-keywords
+  `(;; prompt and following interactive command
+    ;; FIXME: Actually, this should already be taken care of by comint.
+    (,(concat "\\(" sml-prompt-regexp "\\)\\(.*\\)")
+     (1 font-lock-prompt-face)
+     (2 font-lock-command-face keep))
+    ;; CM's messages
+    ("^\\[\\(.*GC #.*\n\\)*.*\\]" . font-lock-comment-face)
+    ;; SML/NJ's irritating GC messages
+    ("^GC #.*" . font-lock-comment-face))
+  "Font-locking specification for inferior SML mode.")
+
+(defface font-lock-prompt-face
+  '((t (:bold t)))
+  "Font Lock mode face used to highlight prompts."
+  :group 'font-lock-highlighting-faces)
+(defvar font-lock-prompt-face 'font-lock-prompt-face
+  "Face name to use for prompts.")
+
+(defface font-lock-command-face
+  '((t (:bold t)))
+  "Font Lock mode face used to highlight interactive commands."
+  :group 'font-lock-highlighting-faces)
+(defvar font-lock-command-face 'font-lock-command-face
+  "Face name to use for interactive commands.")
+
+(defconst inferior-sml-font-lock-defaults
+  '(inferior-sml-font-lock-keywords nil nil nil nil))
+
+(defun sml--read-run-cmd ()
+  (list
+   (read-string "SML command: " sml-program-name)
+   (if (or current-prefix-arg (> (length sml-default-arg) 0))
+       (read-string "Any args: " sml-default-arg)
+     sml-default-arg)
+   (if (or current-prefix-arg (> (length sml-host-name) 0))
+       (read-string "On host: " sml-host-name)
+     sml-host-name)))
+
+;;;###autoload
+(defalias 'run-sml 'sml-run)
+
+;;;###autoload
+(defun sml-run (cmd arg &optional host)
+  "Run the program CMD with given arguments ARG.
+The command is run in buffer *CMD* using mode `inferior-sml-mode'.
+If the buffer already exists and has a running process, then
+just go to this buffer.
+
+If a prefix argument is used, the user is also prompted for a HOST
+on which to run CMD using `remote-shell-program'.
+
+\(Type \\[describe-mode] in the process's buffer for a list of commands.)"
+  (interactive (sml--read-run-cmd))
+  (let* ((pname (file-name-nondirectory cmd))
+         (args (split-string arg))
+        (file (when (and sml-config-file (file-exists-p sml-config-file))
+                sml-config-file)))
+    ;; And this -- to keep these as defaults even if
+    ;; they're set in the mode hooks.
+    (setq sml-program-name cmd)
+    (setq sml-default-arg arg)
+    (setq sml-host-name host)
+    ;; For remote execution, use `remote-shell-program'
+    (when (> (length host) 0)
+      (setq args (list* host "cd" default-directory ";" cmd args))
+      (setq cmd remote-shell-program))
+    ;; Go for it.
+    (save-current-buffer
+      (let ((exec-path (if (and (file-name-directory cmd)
+                                (not (file-name-absolute-p cmd)))
+                           ;; If the command has slashes, make sure we
+                           ;; first look relative to the current directory.
+                           ;; Emacs-21 does it for us, but not Emacs-20.
+                           (cons default-directory exec-path) exec-path)))
+        (pop-to-buffer (apply 'make-comint pname cmd file args)))
+
+      (inferior-sml-mode)
+      (goto-char (point-max))
+      (current-buffer))))
+
+(defun sml-send-function (&optional and-go)
+  "Send current paragraph to the inferior SML process. 
+With a prefix argument AND-GO switch to the repl buffer as well."
+  (interactive "P")
+  (save-excursion
+    (sml-mark-function)
+    (sml-prog-proc-send-region (point) (mark)))
+  (if and-go (sml-prog-proc-switch-to)))
+
+(defvar inferior-sml-mode-map
+  (let ((map (make-sparse-keymap)))
+    (set-keymap-parent map comint-mode-map)
+    (define-key map "\C-c\C-s" 'sml-run)
+    (define-key map "\t" 'completion-at-point)
+    map)
+  "Keymap for inferior-sml mode.")
+
+
+(declare-function smerge-refine-subst "smerge-mode"
+                  (beg1 end1 beg2 end2 props-c))
+
+(defun inferior-sml-next-error-hook ()
+  ;; Try to recognize SML/NJ type error message and to highlight finely the
+  ;; difference between the two types (in case they're large, it's not
+  ;; always obvious to spot it).
+  ;;
+  ;; Sample messages:
+  ;; 
+  ;; Data.sml:31.9-33.33 Error: right-hand-side of clause doesn't agree with function result type [tycon mismatch]
+  ;;   expression:  Hstring
+  ;;   result type:  Hstring * int
+  ;;   in declaration:
+  ;;     des2hs = (fn SYM_ID hs => hs
+  ;;                | SYM_OP hs => hs
+  ;;                | SYM_CHR hs => hs)
+  ;; Data.sml:35.44-35.63 Error: operator and operand don't agree [tycon mismatch]
+  ;;   operator domain: Hstring * Hstring
+  ;;   operand:         (Hstring * int) * (Hstring * int)
+  ;;   in expression:
+  ;;     HSTRING.ieq (h1,h2)
+  ;; vparse.sml:1861.6-1922.14 Error: case object and rules don't agree [tycon mismatch]
+  ;;   rule domain: STConstraints list list option
+  ;;   object: STConstraints list option
+  ;;   in expression:
+  (save-current-buffer
+    (when (and (derived-mode-p 'sml-mode 'inferior-sml-mode)
+               (boundp 'next-error-last-buffer)
+               (bufferp next-error-last-buffer)
+               (set-buffer next-error-last-buffer)
+               (derived-mode-p 'inferior-sml-mode)
+               ;; The position of `point' is not guaranteed :-(
+               (looking-at (concat ".*\\[tycon mismatch\\]\n"
+                                   "  \\(operator domain\\|expression\\|rule domain\\): +")))
+      (require 'smerge-mode)
+      (save-excursion
+        (let ((b1 (match-end 0))
+              e1 b2 e2)
+          (when (re-search-forward "\n  in \\(expression\\|declaration\\):\n"
+                                   nil t)
+            (setq e2 (match-beginning 0))
+            (when (re-search-backward
+                   "\n  \\(operand\\|result type\\|object\\): +"
+                   b1 t)
+              (setq e1 (match-beginning 0))
+              (setq b2 (match-end 0))
+              (smerge-refine-subst b1 e1 b2 e2
+                                   '((face . smerge-refined-change))))))))))
+
+(define-derived-mode inferior-sml-mode sml-prog-proc-comint-mode "Inferior-SML"
+  "Major mode for interacting with an inferior SML process.
+
+The following commands are available:
+\\{inferior-sml-mode-map}
+
+An SML process can be fired up (again) with \\[sml].
+
+Customisation: Entry to this mode runs the hooks on `comint-mode-hook'
+and `inferior-sml-mode-hook' (in that order).
+
+Variables controlling behaviour of this mode are
+
+`sml-program-name' (default \"sml\")
+    Program to run as SML.
+
+`sml-use-command' (default \"use \\\"%s\\\"\")
+    Template for loading a file into the inferior SML process.
+
+`sml-cd-command' (default \"System.Directory.cd \\\"%s\\\"\")
+    SML command for changing directories in SML process (if possible).
+
+`sml-prompt-regexp' (default \"^[\\-=] *\")
+    Regexp used to recognise prompts in the inferior SML process.
+
+You can send text to the inferior SML process from other buffers containing
+SML source.
+    `switch-to-sml' switches the current buffer to the SML process buffer.
+    `sml-send-function' sends the current *paragraph* to the SML process.
+    `sml-send-region' sends the current region to the SML process.
+
+    Prefixing the sml-send-<whatever> commands with \\[universal-argument]
+    causes a switch to the SML process buffer after sending the text.
+
+For information on running multiple processes in multiple buffers, see
+documentation for variable `sml-buffer'.
+
+Commands:
+RET after the end of the process' output sends the text from the
+    end of process to point.
+RET before the end of the process' output copies the current line
+    to the end of the process' output, and sends it.
+DEL converts tabs to spaces as it moves back.
+TAB file name completion, as in shell-mode, etc.."
+  (setq comint-prompt-regexp sml-prompt-regexp)
+  (sml-mode-variables)
+
+  ;; We have to install it globally, 'cause it's run in the *source* buffer :-(
+  (add-hook 'next-error-hook 'inferior-sml-next-error-hook)
+
+  ;; Make TAB add a " rather than a space at the end of a file name.
+  (set (make-local-variable 'comint-completion-addsuffix) '("/" . "\""))
+
+  (set (make-local-variable 'font-lock-defaults)
+       inferior-sml-font-lock-defaults)
+
+  ;; Compilation support (used for `next-error').
+  (set (make-local-variable 'compilation-error-regexp-alist)
+       sml-error-regexp-alist)
+  ;; FIXME: move it to sml-mode?
+  (set (make-local-variable 'compilation-error-screen-columns) nil)
+
+  (setq mode-line-process '(": %s")))
+
+;;; MORE CODE FOR SML-MODE
+
+;;;###autoload
+(add-to-list 'auto-mode-alist '("\\.s\\(ml\\|ig\\)\\'" . sml-mode))
+
+(defvar comment-quote-nested)
+
+;;;###autoload
+(define-derived-mode sml-mode sml-prog-proc-mode "SML"
+  "\\<sml-mode-map>Major mode for editing Standard ML code.
+This mode runs `sml-mode-hook' just before exiting.
+See also (info \"(sml-mode)Top\").
+\\{sml-mode-map}"
+  (set (make-local-variable 'font-lock-defaults) sml-font-lock-defaults)
+  (set (make-local-variable 'outline-regexp) sml-outline-regexp)
+  (set (make-local-variable 'imenu-create-index-function)
+       'sml-imenu-create-index)
+  (set (make-local-variable 'add-log-current-defun-function)
+       'sml-current-fun-name)
+  ;; Treat paragraph-separators in comments as paragraph-separators.
+  (set (make-local-variable 'paragraph-separate)
+       (concat "\\([ \t]*\\*)?\\)?\\(" paragraph-separate "\\)"))
+  (set (make-local-variable 'require-final-newline) t)
+  (set (make-local-variable 'electric-indent-chars)
+       (cons ?\; (if (boundp 'electric-indent-chars)
+                     electric-indent-chars '(?\n))))
+  (set (make-local-variable 'electric-layout-rules)
+       `((?\; . ,(lambda ()
+                   (save-excursion
+                     (skip-chars-backward " \t;")
+                     (unless (or (bolp)
+                                 (progn (skip-chars-forward " \t;")
+                                        (eolp)))
+                       'after))))))
+  (when sml-electric-pipe-mode
+    (add-hook 'post-self-insert-hook #'sml-post-self-insert-pipe nil t))
+  (sml-mode-variables))
+
+(defun sml-mode-variables ()
+  (set (make-local-variable 'sml-prog-proc-descriptor) sml-pp-functions)
+  (set-syntax-table sml-mode-syntax-table)
+  (setq local-abbrev-table sml-mode-abbrev-table)
+  ;; Setup indentation and sexp-navigation.
+  (smie-setup sml-smie-grammar #'sml-smie-rules
+              :backward-token #'sml-smie-backward-token
+              :forward-token #'sml-smie-forward-token)
+  (set (make-local-variable 'parse-sexp-ignore-comments) t)
+  (set (make-local-variable 'comment-start) "(* ")
+  (set (make-local-variable 'comment-end) " *)")
+  (set (make-local-variable 'comment-start-skip) "(\\*+\\s-*")
+  (set (make-local-variable 'comment-end-skip) "\\s-*\\*+)")
+  ;; No need to quote nested comments markers.
+  (set (make-local-variable 'comment-quote-nested) nil))
+
+(defun sml-funname-of-and ()
+  "Name of the function this `and' defines, or nil if not a function.
+Point has to be right after the `and' symbol and is not preserved."
+  (forward-comment (point-max))
+  (if (looking-at sml-tyvarseq-re) (goto-char (match-end 0)))
+  (let ((sym (sml-smie-forward-token)))
+    (forward-comment (point-max))
+    (unless (or (member sym '(nil "d="))
+               (member (sml-smie-forward-token) '("d=")))
+      sym)))
+
+(defun sml-find-forward (re)
+  (while (progn (forward-comment (point-max))
+                (not (looking-at re)))
+    (or (ignore-errors (forward-sexp 1) t) (forward-char 1))))
+
+(defun sml-electric-pipe ()
+  "Insert a \"|\".
+Depending on the context insert the name of function, a \"=>\" etc."
+  (interactive)
+  (unless (save-excursion (skip-chars-backward "\t ") (bolp)) (insert "\n"))
+  (insert "| ")
+  (unless (sml-post-self-insert-pipe (1- (point)))
+    (indent-according-to-mode)))
+
+(defun sml-post-self-insert-pipe (&optional acp)
+  (when (or acp (and (eq ?| last-command-event)
+                     (setq acp (electric--after-char-pos))))
+    (let ((text
+           (save-excursion
+             (goto-char (1- acp))       ;Jump before the "|" we just inserted.
+             (let ((sym (sml-find-matching-starter sml-pipeheads
+                                                   ;; (sml-op-prec "|" 'back)
+                                                   )))
+               (sml-smie-forward-token)
+               (forward-comment (point-max))
+               (cond
+                ((string= sym "|")
+                 (let ((f (sml-smie-forward-token)))
+                   (sml-find-forward "\\(=>\\|=\\||\\)\\S.")
+                   (cond
+                    ((looking-at "|") nil)     ; A datatype or an OR pattern?
+                    ((looking-at "=>") " => ") ;`case', or `fn' or `handle'.
+                    ((looking-at "=")          ;A function.
+                     (cons (concat f " ")" = ")))))
+                ((string= sym "and")
+                 ;; Could be a datatype or a function.
+                 (let ((funname (sml-funname-of-and)))
+                   (if funname (cons (concat funname " ") " = ") nil)))
+                ((string= sym "fun")
+                 (while (and (setq sym (sml-smie-forward-token))
+                             (string-match "^'" sym))
+                   (forward-comment (point-max)))
+                 (cons (concat sym " ") " = "))
+                ((member sym '("case" "handle" "of")) " => ") ;; "fn"?
+                ;;((member sym '("abstype" "datatype")) "")
+                (t nil))))))
+      (when text
+        (save-excursion
+          (goto-char (1- acp))
+          (unless (save-excursion (skip-chars-backward "\t ") (bolp))
+            (insert "\n")))
+        (unless (memq (char-before) '(?\s ?\t)) (insert " "))
+        (let ((use-region (and (use-region-p) (< (point) (mark)))))
+          ;; (skeleton-proxy-new `(nil ,(if (consp text) (pop text)) _ ,text))
+          (when (consp text) (insert (pop text)))
+          (if (not use-region)
+              (save-excursion (insert text))
+            (goto-char (mark))
+            (insert text)))
+        (indent-according-to-mode)
+        t))))
+
+
+;;; Misc
+
+(defun sml-mark-function ()
+  "Mark the surrounding function.  Or try to at least."
+  (interactive)
+  ;; FIXME: Provide beginning-of-defun-function so mark-defun "just works".
+  (let ((start (point)))
+    (sml-beginning-of-defun)
+    (let ((beg (point)))
+      (smie-forward-sexp 'halfsexp)
+      (if (or (< start beg) (> start (point)))
+          (progn
+            (goto-char start)
+            (mark-paragraph))
+        (push-mark nil t t)
+        (goto-char beg)))))
+
+(defun sml-back-to-outer-indent ()
+  "Unindents to the next outer level of indentation."
+  (interactive)
+  (save-excursion
+    (forward-line 0)
+    (let ((start-column (current-indentation))
+          indent)
+      (when (> start-column 0)
+        (save-excursion
+          (while (>= (setq indent
+                           (if (re-search-backward "^[ \t]*[^\n\t]" nil t)
+                               (current-indentation)
+                             0))
+                     start-column))
+          (skip-chars-forward " \t")
+          (let ((pos (point)))
+            (move-to-column start-column)
+            (when (re-search-backward " \\([^ \t\n]\\)" pos t)
+              (goto-char (match-beginning 1))
+              (setq indent (current-column)))))
+        (indent-line-to indent)))))
+
+(defun sml-find-matching-starter (syms)
+  (let ((halfsexp nil)
+        tok)
+    ;;(sml-smie-forward-token)
+    (while (not (or (bobp)
+                    (member (nth 2 (setq tok (smie-backward-sexp halfsexp)))
+                            syms)))
+      (cond
+       ((null (car tok)) nil)
+       ((numberp (car tok)) (setq halfsexp 'half))
+       (t (goto-char (cadr tok)))))
+    (if (nth 2 tok) (goto-char (cadr tok)))
+    (nth 2 tok)))
+
+(defun sml-skip-siblings ()
+  (let (tok)
+    (while (and (not (bobp))
+                (progn (setq tok (smie-backward-sexp 'half))
+                       (cond
+                        ((null (car tok)) t)
+                        ((numberp (car tok)) t)
+                        (t nil)))))
+    (if (nth 2 tok) (goto-char (cadr tok)))
+    (nth 2 tok)))
+
+(defun sml-beginning-of-defun ()
+  (let ((sym (sml-find-matching-starter sml-starters-syms)))
+    (if (member sym '("fun" "and" "functor" "signature" "structure"
+                     "abstraction" "datatype" "abstype"))
+       (save-excursion (sml-smie-forward-token) (forward-comment (point-max))
+                       (sml-smie-forward-token))
+      ;; We're inside a "non function declaration": let's skip all other
+      ;; declarations that we find at the same level and try again.
+      (sml-skip-siblings)
+      ;; Obviously, let's not try again if we're at bobp.
+      (unless (bobp) (sml-beginning-of-defun)))))
+
+(defcustom sml-max-name-components 3
+  "Maximum number of components to use for the current function name."
+  :type 'integer)
+
+(defun sml-current-fun-name ()
+  (save-excursion
+    (let ((count sml-max-name-components)
+         fullname name)
+      (end-of-line)
+      (while (and (> count 0)
+                 (setq name (sml-beginning-of-defun)))
+       (decf count)
+       (setq fullname (if fullname (concat name "." fullname) name))
+       ;; Skip all other declarations that we find at the same level.
+       (sml-skip-siblings))
+      fullname)))
+
+
+;;; INSERTING PROFORMAS (COMMON SML-FORMS)
+
+(defvar sml-forms-alist nil
+  "Alist of code templates.
+You can extend this alist to your heart's content.  For each additional
+template NAME in the list, declare a keyboard macro or function (or
+interactive command) called 'sml-form-NAME'.
+If 'sml-form-NAME' is a function it takes no arguments and should
+insert the template at point\; if this is a command it may accept any
+sensible interactive call arguments\; keyboard macros can't take
+arguments at all.
+`sml-forms-alist' understands let, local, case, abstype, datatype,
+signature, structure, and functor by default.")
+
+(defmacro sml-def-skeleton (name interactor &rest elements)
+  (let ((fsym (intern (concat "sml-form-" name))))
+    `(progn
+       (add-to-list 'sml-forms-alist ',(cons name fsym))
+       (define-abbrev sml-mode-abbrev-table ,name "" ',fsym nil 'system)
+       (let ((abbrev (abbrev-symbol ,name sml-mode-abbrev-table)))
+         (abbrev-put abbrev :case-fixed t)
+         (abbrev-put abbrev :enable-function
+                     (lambda () (not (nth 8 (syntax-ppss))))))
+       (define-skeleton ,fsym
+         ,(format "SML-mode skeleton for `%s..' expressions" name)
+         ,interactor
+         ,(concat name " ") >
+         ,@elements))))
+(put 'sml-def-skeleton 'lisp-indent-function 2)
+
+(sml-def-skeleton "let" nil
+  @ "\nin " > _ "\nend" >)
+
+(sml-def-skeleton "if" nil
+  @ " then " > _ "\nelse " > _)
+
+(sml-def-skeleton "local" nil
+  @ "\nin" > _ "\nend" >)
+
+(sml-def-skeleton "case" "Case expr: "
+  str "\nof " > _ " => ")
+
+(sml-def-skeleton "signature" "Signature name: "
+  str " =\nsig" > "\n" > _ "\nend" >)
+
+(sml-def-skeleton "structure" "Structure name: "
+  str " =\nstruct" > "\n" > _ "\nend" >)
+
+(sml-def-skeleton "functor" "Functor name: "
+  str " () : =\nstruct" > "\n" > _ "\nend" >)
+
+(sml-def-skeleton "datatype" "Datatype name and type params: "
+  str " =" \n)
+
+(sml-def-skeleton "abstype" "Abstype name and type params: "
+  str " =" \n _ "\nwith" > "\nend" >)
+
+;;
+
+(sml-def-skeleton "struct" nil
+  _ "\nend" >)
+
+(sml-def-skeleton "sig" nil
+  _ "\nend" >)
+
+(sml-def-skeleton "val" nil
+  @ " = " > _)
+
+(sml-def-skeleton "fn" nil
+  @ " =>" > _)
+
+(sml-def-skeleton "fun" nil
+  @ " =" > _)
+
+;;
+
+(defun sml-forms-menu (_menu)
+  (mapcar (lambda (x) (vector (car x) (cdr x) t))
+         sml-forms-alist))
+
+(defvar sml-last-form "let")
+
+(defun sml-electric-space ()
+  "Expand a symbol into an SML form, or just insert a space.
+If the point directly precedes a symbol for which an SML form exists,
+the corresponding form is inserted."
+  (interactive)
+  (let ((abbrev-mode (not abbrev-mode))
+       (last-command-event ?\s)
+       ;; Bind `this-command' to fool skeleton's special abbrev handling.
+       (this-command 'self-insert-command))
+    (call-interactively 'self-insert-command)))
+
+(defun sml-insert-form (name newline)
+  "Interactive short-cut to insert the NAME common SML form.
+If a prefix argument is given insert a NEWLINE and indent first, or
+just move to the proper indentation if the line is blank\; otherwise
+insert at point (which forces indentation to current column).
+
+The default form to insert is 'whatever you inserted last time'
+\(just hit return when prompted\)\; otherwise the command reads with
+completion from `sml-forms-alist'."
+  (interactive
+   (list (completing-read
+         (format "Form to insert (default %s): " sml-last-form)
+         sml-forms-alist nil t nil nil sml-forms-alist)
+        current-prefix-arg))
+  (setq sml-last-form name)
+  (unless (or (not newline)
+             (save-excursion (beginning-of-line) (looking-at "\\s-*$")))
+    (insert "\n"))
+  (when (memq (char-syntax (preceding-char)) '(?_ ?w)) (insert " "))
+  (let ((f (cdr (assoc name sml-forms-alist))))
+    (cond
+     ((commandp f) (command-execute f))
+     (f (funcall f))
+     (t (error "Undefined SML form: %s" name)))))
+
+;;;
+;;; MLton support
+;;;
+
+(defvar sml-mlton-command "mlton"
+  "Command to run MLton.   Can include arguments.")
+
+(defvar sml-mlton-mainfile nil)
+
+(defconst sml-mlton-error-regexp-alist
+  ;; I wish they just changed MLton to use one of the standard
+  ;; error formats.
+  `(("^\\(?:Error\\|\\(Warning\\)\\): \\(.+\\) \\([0-9]+\\)\\.\\([0-9]+\\)\\.$"
+     2 3 4
+     ;; If subgroup 1 matched, then it's a warning, otherwise it's an error.
+     (1))))
+
+(defvar compilation-error-regexp-alist)
+(eval-after-load "compile"
+  '(dolist (x sml-mlton-error-regexp-alist)
+     (add-to-list 'compilation-error-regexp-alist x)))
+
+(defun sml-mlton-typecheck (mainfile)
+  "Typecheck using MLton.
+MAINFILE is the top level file of the project."
+  (interactive
+   (list (if (and sml-mlton-mainfile (not current-prefix-arg))
+             sml-mlton-mainfile
+           (read-file-name "Main file: "))))
+  (setq sml-mlton-mainfile mainfile)
+  (save-some-buffers)
+  (require 'compile)
+  (dolist (x sml-mlton-error-regexp-alist)
+    (add-to-list 'compilation-error-regexp-alist x))
+  (with-current-buffer (find-file-noselect mainfile)
+    (compile (concat sml-mlton-command
+                     " -stop tc "       ;Stop right after type checking.
+                     (shell-quote-argument
+                      (file-relative-name buffer-file-name))))))
+
+;;;
+;;; MLton's def-use info.
+;;;
+
+(defvar sml-defuse-file nil)
+
+(defun sml-defuse-file ()
+  (or sml-defuse-file (sml-defuse-set-file)))
+
+(defun sml-defuse-set-file ()
+  "Specify the def-use file to use."
+  (interactive)
+  (setq sml-defuse-file (read-file-name "Def-use file: ")))
+
+(defun sml-defuse-symdata-at-point ()
+  (save-excursion
+    (sml-smie-forward-token)
+    (let ((symname (sml-smie-backward-token)))
+      (if (equal symname "op")
+          (save-excursion (setq symname (sml-smie-forward-token))))
+      (when (string-match "op " symname)
+        (setq symname (substring symname (match-end 0)))
+        (forward-word)
+        (forward-comment (point-max)))
+      (list symname
+            ;; Def-use files seem to count chars, not columns.
+            ;; We hope here that they don't actually count bytes.
+            ;; Also they seem to start counting at 1.
+            (1+ (- (point) (progn (beginning-of-line) (point))))
+            (save-restriction
+              (widen) (1+ (count-lines (point-min) (point))))
+            buffer-file-name))))
+
+(defconst sml-defuse-def-regexp
+  "^[[:alpha:]]+ \\([^ \n]+\\) \\(.+\\) \\([0-9]+\\)\\.\\([0-9]+\\)$")
+(defconst sml-defuse-use-regexp-format "^    %s %d\\.%d $")
+
+(defun sml-defuse-jump-to-def ()
+  "Jump to the definition corresponding to the symbol at point."
+  (interactive)
+  (let ((symdata (sml-defuse-symdata-at-point)))
+    (if (null (car symdata))
+        (error "Not on a symbol")
+      (with-current-buffer (find-file-noselect (sml-defuse-file))
+        (goto-char (point-min))
+        (unless (re-search-forward
+                 (format sml-defuse-use-regexp-format
+                         (concat "\\(?:"
+                                 ;; May be an absolute file name.
+                                 (regexp-quote (nth 3 symdata))
+                                 "\\|"
+                                 ;; Or a relative file name.
+                                 (regexp-quote (file-relative-name
+                                                (nth 3 symdata)))
+                                 "\\)")
+                         (nth 2 symdata)
+                         (nth 1 symdata))
+                 nil t)
+          ;; FIXME: This is typically due to editing: any minor editing will
+          ;; mess everything up.  We should try to fail more gracefully.
+          (error "Def-use info not found"))
+        (unless (re-search-backward sml-defuse-def-regexp nil t)
+          ;; This indicates a bug in this code.
+          (error "Internal failure while looking up def-use"))
+        (unless (equal (match-string 1) (nth 0 symdata))
+          ;; FIXME: This again is most likely due to editing.
+          (error "Incoherence in the def-use info found"))
+        (let ((line (string-to-number (match-string 3)))
+              (char (string-to-number (match-string 4))))
+          (pop-to-buffer (find-file-noselect (match-string 2)))
+          (goto-char (point-min))
+          (forward-line (1- line))
+          (forward-char (1- char)))))))
+
+;;;
+;;; SML/NJ's Compilation Manager support
+;;;
+
+(defvar sml-cm-mode-syntax-table sml-mode-syntax-table)
+(defvar sml-cm-font-lock-keywords
+ `(,(concat "\\_<" (regexp-opt '("library" "group" "is" "structure"
+                               "functor" "signature" "funsig") t)
+           "\\_>")))
+;;;###autoload
+(add-to-list 'completion-ignored-extensions ".cm/")
+;; This was used with the old compilation manager.
+(add-to-list 'completion-ignored-extensions "CM/")
+;;;###autoload
+(add-to-list 'auto-mode-alist '("\\.cm\\'" . sml-cm-mode))
+;;;###autoload
+(define-derived-mode sml-cm-mode fundamental-mode "SML-CM"
+  "Major mode for SML/NJ's Compilation Manager configuration files."
+  (set (make-local-variable 'sml-prog-proc-descriptor) sml-pp-functions)
+  (set (make-local-variable 'font-lock-defaults)
+       '(sml-cm-font-lock-keywords nil t nil nil)))
+
+;;;
+;;; ML-Lex support
+;;;
+
+(defvar sml-lex-font-lock-keywords
+  (append
+   `((,(concat "^%" sml-id-re) . font-lock-builtin-face)
+     ("^%%" . font-lock-module-def-face))
+   sml-font-lock-keywords))
+(defconst sml-lex-font-lock-defaults
+  (cons 'sml-lex-font-lock-keywords (cdr sml-font-lock-defaults)))
+
+;;;###autoload
+(define-derived-mode sml-lex-mode sml-mode "SML-Lex"
+  "Major Mode for editing ML-Lex files."
+  (set (make-local-variable 'font-lock-defaults) sml-lex-font-lock-defaults))
+
+;;;
+;;; ML-Yacc support
+;;;
+
+(defface sml-yacc-bnf-face
+  '((t (:foreground "darkgreen")))
+  "Face used to highlight (non)terminals in `sml-yacc-mode'.")
+(defvar sml-yacc-bnf-face 'sml-yacc-bnf-face)
+
+(defcustom sml-yacc-indent-action 16
+  "Indentation column of the opening paren of actions."
+  :type 'integer)
+
+(defcustom sml-yacc-indent-pipe nil
+  "Indentation column of the pipe char in the BNF.
+If nil, align it with `:' or with previous cases."
+  :type 'integer)
+
+(defcustom sml-yacc-indent-term nil
+  "Indentation column of the (non)term part.
+If nil, align it with previous cases."
+  :type 'integer)
+
+(defvar sml-yacc-font-lock-keywords
+  (cons `((concat "^\\(" sml-id-re "\\s-*:\\|\\s-*|\\)\\(\\s-*" sml-id-re
+                  "\\)*\\s-*\\(\\(%" sml-id-re "\\)\\s-+" sml-id-re "\\|\\)")
+          (0 (save-excursion
+               (save-match-data
+                 (goto-char (match-beginning 0))
+                 (unless (or (re-search-forward "\\_<of\\_>"
+                                                (match-end 0) 'move)
+                             (progn (forward-comment (point-max))
+                                    (not (looking-at "("))))
+                   sml-yacc-bnf-face))))
+          (4 font-lock-builtin-face t t))
+        sml-lex-font-lock-keywords))
+(defconst sml-yacc-font-lock-defaults
+  (cons 'sml-yacc-font-lock-keywords (cdr sml-font-lock-defaults)))
+
+(defun sml-yacc-indent-line ()
+  "Indent current line of ML-Yacc code."
+  (let ((savep (> (current-column) (current-indentation)))
+       (indent (max (or (ignore-errors (sml-yacc-indentation)) 0) 0)))
+    (if savep
+       (save-excursion (indent-line-to indent))
+      (indent-line-to indent))))
+
+(defun sml-yacc-indentation ()
+  (save-excursion
+    (back-to-indentation)
+    (or (and (looking-at (eval-when-compile
+                           (concat "%\\|" sml-id-re "\\s-*:")))
+             0)
+       (when (save-excursion
+               (condition-case nil (progn (up-list -1) nil) (scan-error t)))
+         ;; We're outside an action.
+         (cond
+          ;; Special handling of indentation inside %term and %nonterm
+          ((save-excursion
+             (and (re-search-backward "^%\\(\\sw+\\)" nil t)
+                  (member (match-string 1) '("term" "nonterm"))))
+           (if (numberp sml-yacc-indent-term) sml-yacc-indent-term
+             (let ((offset (if (looking-at "|") -2 0)))
+               (forward-line -1)
+               (looking-at "\\s-*\\(%\\sw*\\||\\)?\\s-*")
+               (goto-char (match-end 0))
+               (+ offset (current-column)))))
+          ((looking-at "(") sml-yacc-indent-action)
+          ((looking-at "|")
+           (if (numberp sml-yacc-indent-pipe) sml-yacc-indent-pipe
+             (backward-sexp 1)
+             (while (progn (forward-comment (- (point)))
+                           (/= 0 (skip-syntax-backward "w_"))))
+             (forward-comment (- (point)))
+             (if (not (looking-at "\\s-$"))
+                 (1- (current-column))
+               (skip-syntax-forward " ")
+               (- (current-column) 2))))))
+       ;; default to SML rules
+        (smie-indent-calculate))))
+
+;;;###autoload
+(add-to-list 'auto-mode-alist '("\\.grm\\'" . sml-yacc-mode))
+;;;###autoload
+(define-derived-mode sml-yacc-mode sml-mode "SML-Yacc"
+  "Major Mode for editing ML-Yacc files."
+  (set (make-local-variable 'indent-line-function) 'sml-yacc-indent-line)
+  (set (make-local-variable 'font-lock-defaults) sml-yacc-font-lock-defaults))
+
+\f
+(provide 'sml-mode)
+
+;;; sml-mode.el ends here
diff --git a/packages/sml-mode/sml-mode.spec b/packages/sml-mode/sml-mode.spec
new file mode 100644 (file)
index 0000000..f0d8437
--- /dev/null
@@ -0,0 +1,67 @@
+%define lispdir                %{_datadir}/emacs/site-lisp
+%define startupfile    %{lispdir}/site-start.el
+
+Summary:       Emacs mode for editing Standard ML source code
+Name:          sml-mode
+Version:       $Name$
+Release:       0.1
+Group:         Applications/Editors
+Copyright:     GPL
+Packager:      Stefan Monnier
+Source:                http://iro.umontreal.ca/~monnier/elisp/%{name}.tar.gz
+Buildroot:     %{_tmppath}/%{name}-buildroot
+BuildPreReq:   emacs >= 20 xemacs >= 21
+BuildArch:     noarch
+
+%description
+SML-MODE is a major Emacs mode for editing Standard ML. It provides
+syntax highlighting and automatic indentation and comes with sml-proc
+which allows interaction with an inferior SML interactive loop.
+
+%prep
+%setup -q -n %{name}
+
+%install
+make install \
+  prefix=%{buildroot}%{_prefix} \
+  infodir=%{buildroot}%{_infodir} \
+  lispdir=%{buildroot}%{lispdir}
+gzip -9f %{buildroot}%{lispdir}/sml-mode/*.el
+
+texi2pdf sml-mode.texi
+
+%post
+cat >> %{lispdir}/site-start.el <<EOF
+;; sml-mode-start
+;; This section was automatically generated by rpm
+(load "sml-mode-startup")
+;; End of automatically generated section
+;; sml-mode-end
+EOF
+
+/sbin/install-info %{_infodir}/sml-mode.info.gz %{_infodir}/dir
+
+%postun
+ed -s %{lispdir}/site-start.el <<EOF
+/^;; sml-mode-start$/,/^;; sml-mode-end$/d
+wq
+EOF
+
+/sbin/install-info --delete %{_infodir}/sml-mode.info.gz %{_infodir}/dir \
+    --section=Emacs \
+    --entry="* SML: (sml-mode).    Editing & Running Standard ML from Emacs"
+
+%clean
+rm -rf %{buildroot}
+
+%files
+%defattr(-,root,root)
+%doc BUGS ChangeLog INSTALL NEWS README TODO
+%doc sml-mode.texi sml-mode.pdf
+%doc %{_infodir}/*.info*
+%dir %{lispdir}/%{name}
+%{lispdir}/%{name}/*.elc
+%{lispdir}/%{name}/*.el
+%{lispdir}/%{name}/*.el.*
+
+%changelog
diff --git a/packages/sml-mode/sml-mode.texi b/packages/sml-mode/sml-mode.texi
new file mode 100644 (file)
index 0000000..d9980f7
--- /dev/null
@@ -0,0 +1,1143 @@
+\input texinfo @c -*-texinfo-*-
+
+@comment "@(#)$Name$:$Id$"
+
+@comment Documentation for the GNU Emacs SML mode.
+@comment Copyright (C) 1997-1999 Matthew J.@: Morley
+
+@comment This file is part of the sml-mode distribution.
+
+@comment sml-mode is free software; you can redistribute it and/or modify
+@comment it under the terms of the GNU General Public License as published by
+@comment the Free Software Foundation; either version 3 of the License,
+@comment or (at your option) any later version.
+
+@comment sml-mode is distributed in the hope that it will be useful,
+@comment but WITHOUT ANY WARRANTY; without even the implied warranty of
+@comment MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+@comment GNU General Public License for more details.
+
+@comment You should have received a copy of the GNU General Public License
+@comment along with sml-mode; see the file COPYING.  If not, write to
+@comment the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+
+@setfilename sml-mode.info
+@settitle SML mode - The Emacs SML editing mode
+@dircategory Emacs
+@direntry
+* sml:(sml-mode).      Emacs mode for editing SML
+@end direntry
+@setchapternewpage on
+
+@titlepage
+@sp 5
+@center @titlefont{Editing and Running Standard ML}
+@center @titlefont{under GNU Emacs}
+@sp 5
+@center {SML mode, Version $Name$}
+@center {August 1999}
+@sp 2
+@author Authors: Matthew J.@: Morley and Stefan Monnier
+
+@page
+@vskip 0pt plus 1filll
+Copyright @copyright{} (Anon) 
+
+@sp 1
+@noindent
+GNU General Public License as published by the Free Software Foundation;
+either version 3, or (at your option) any later version.
+
+@sp 1
+@noindent
+SML mode 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.
+
+@sp 1
+@noindent
+You should have received a copy of the GNU General Public License along
+with GNU Emacs; see the file COPYING. If not, write to the Free Software
+Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+
+@end titlepage
+
+@setchapternewpage off
+@headings double
+
+@c ============================================================ TOP NODE
+
+@node Top, Copying, (dir), (dir)
+
+@ifinfo
+@chapter SML Mode Info
+
+@c == Top, Copying, (dir), (dir) =======================================
+
+@noindent
+You are looking at the top node of the Info tree documenting
+@sc{sml-mode} (Version $Name$). Not all functions are documented here, but
+those that aren't you probably won't miss. All commands and settable
+variables have built-in documentation, as per usual Emacs conventions.
+@end ifinfo
+
+@menu
+* Copying::             You can copy SML mode
+* Introduction::        Setting things up
+* SML Mode::            Editing SML source
+* Interaction Mode::    Running ML processes
+* Configuration::       Menus, highlighting, setting defaults
+
+Indexes
+* Command Index::       Commands you can invoke
+* Variable Index::      Variables you can set
+* Key Index::           Default keybindings
+
+Introduction
+* Contributors::        Who did what
+* Getting Started::     What to tell Emacs
+* Getting Help::        How Emacs can help
+
+SML Mode
+* Basics::              On entering SML mode
+* Indentation::         Prettying SML text
+* Magic Insertion::     Templates and electric keys
+* SML Mode Defaults::   Variables controlling indentation
+
+Interaction Mode
+* Running ML::          Commands to run the ML compiler in a buffer
+* ML Interaction::      Sending program fragments to the compiler
+* Tracking Errors::     Finding reported syntax errors
+* Process Defaults::    Setting defaults for process interaction
+
+Configuration
+* Hooks::               Creating hooks
+* Key Bindings::        Binding commands to keys
+* Highlighting::        Syntax colouring
+* Advanced Topics::     You may need to speak Emacs Lisp
+@end menu
+
+
+@c ============================================================= COPYING
+
+@node Copying, Introduction, Top, Top
+
+@ifinfo
+@chapter Copying
+
+@c == Copying, Introduction, Top, Top ==================================
+
+@noindent
+You can freely copy, modify and redistribute SML mode because it's
+made available under the liberal terms of the GNU General Public
+License.
+
+GNU General Public License as published by the Free Software Foundation;
+either version 3, or (at your option) any later version.
+
+SML mode 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; see the file COPYING. If not, write to the Free Software
+Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+
+@end ifinfo
+
+
+
+
+@c ======================================================== INTRODUCTION
+
+@node Introduction, SML Mode, Copying, Top
+
+@chapter Introduction
+
+@c == Introduction, SML Mode, Copying, Top =============================
+
+
+@noindent
+SML mode is a major mode for Emacs for editing Standard ML. It has
+some novel bugs, and some nice features:
+
+@itemize @bullet
+@item
+Automatic indentation of sml code---a number of variables to customise
+the indentation.
+@item
+Easy insertion for commonly used templates like let, local, signature,
+and structure declarations, with minibuffer prompting for types and
+expressions.
+@item
+Magic pipe insertion: @code{|} automatically determines if it is used
+in a case or fun construct, and indents the next line as appropriate, 
+inserting @code{=>} or the name of the function.
+@item
+Inferior shell for running ML. There's no need to leave Emacs, just keep
+on editing while the compiler runs in another window.
+@item
+Automatic ``use file'' in the inferior shell---you can send files,
+buffers, or regions of code to the ML subprocess.
+@item
+Menus, and syntax and keyword highlighting supported for Emacs 19 and
+derivatives.
+@item
+Parsing errors from the inferior shell, and repositioning the
+source with next-error---just like in c-mode.
+@item
+SML mode can be easily configured to work with a number of Standard
+ML compilers, and other SML based tools.
+@end itemize
+
+@menu
+* Contributors::        Who did what
+* Getting Started::     What to tell Emacs
+* Getting Help::        How Emacs can help
+@end menu
+
+
+
+@c ======================================================== CONTRIBUTORS
+
+@node Contributors, Getting Started, Introduction, Introduction
+
+@section Contributors to the SML mode
+@cindex Contributors
+@cindex Authors
+
+Contributions to the package are welcome.  I have limited time to work
+on this project, but I will gladly add any code that you contribute to
+me to this package.
+
+Although the history of sml-mode is obscure, it seems that
+the following persons have made contributions to sml-mode:
+
+@itemize @bullet
+@item
+Lars Bo Nielsen wrote the original version of the code, providing the
+sml editing mode and the inferior-sml support.
+
+@item
+Olin Shivers (@samp{shivers@@ai.mit.edu}) hacked the inferior-sml support
+to use comint and call the whole thing ml-mode.
+
+@item
+Steven Gilmore supposedly provided some early attempt at menubar support.
+
+@item
+Matthew J. Morley (@samp{matthew@@verisity.com}) was maintainer for
+a long time (until version 3.4) and provided many additions and fixes in
+all areas.
+
+@item
+Frederick Knabe (@samp{knabe@@ecrc.de}) provided the original code for
+font-lock and hilite support as well as for proper handling of nested
+comments and of all the string escape sequences.
+
+@item
+Matthias Blume (@samp{blume@@kurims.kyoto-u.ac.jp}) provided a sml-make
+which was replaced by sml-compile.
+
+@item
+Monnier Stefan (@samp{monnier@@iro.umontreal.ca}) completely reworked the
+indentation engine as well as most of the rest of the code and is
+the current maintainer since after version 3.4.
+
+@end itemize
+
+
+@c ===================================================== GETTING STARTED
+
+@node Getting Started, Getting Help, Contributors, Introduction
+
+@section Getting started
+
+@c == Getting Started, Getting Help, Contributors, Introduction ========
+
+
+@noindent
+With luck your system administrator will have installed SML mode
+somewhere convenient, so it will just magically all work---you can
+skip the rest of this getting started section. Otherwise you will need
+to tell Emacs where to find all the SML mode @file{.el} files, and
+when to use them. The where is addressed by locating the Lisp code on
+your Emacs Lisp load path---you may have to create a directory for this,
+say @file{/home/mjm/elisp}, and then insert the following lines in your
+@file{/home/mjm/.emacs} file:
+
+@lisp
+(add-to-list 'load-path "/home/mjm/elisp")
+(autoload 'sml-mode "sml-mode" "Major mode for editing SML." t)
+(autoload 'run-sml "sml-proc" "Run an inferior SML process." t)
+@end lisp
+
+@noindent
+The first line adjusts Emacs' internal search path so it can locate the
+Lisp source you have copied to that directory; the second and third
+lines tell Emacs to load the code automatically when it is needed. You
+can then switch any Emacs buffer into SML mode by entering the command
+
+@example
+M-x sml-mode
+@end example
+
+@noindent
+It is usually more convenient to have Emacs automatically place the
+buffer in SML mode whenever you visit a file containing ML
+programs. The simplest way of achieving this is to put something like
+
+@lisp
+(add-to-list 'auto-mode-alist '("\\.\\(sml\\|sig\\)\\'" . sml-mode))
+@end lisp
+
+@noindent
+also in your @file{.emacs} file. Subsequently (after a restart), any
+files with these extensions will be placed in SML mode buffers when
+you visit them.
+
+
+You may want to pre-compile the @file{sml-*.el} files (@kbd{M-x
+byte-compile-file}) for greater speed---byte compiled code loads and
+runs somewhat faster.
+
+
+@c ======================================================== GETTING HELP
+
+@node Getting Help, , Getting Started, Introduction
+
+@section Help!
+
+@c == Getting Help, , Getting Started, Introduction ====================
+
+
+@noindent
+You're reading it. Apart from the on-line info tree (@kbd{C-h i} is the
+Emacs key to enter the @code{info} system---you should follow the brief
+tutorial if this is unfamiliar), there are further details on specific
+commands in their documentation strings. Only the most useful
+SML mode commands are documented in the info tree: to find out more
+use Emacs' help facilities.
+
+Briefly, to get help on a specific function use @kbd{C-h f} and enter
+the command name. All (almost all, then) SML mode commands begin
+with @code{sml-}, so if you type this and press @key{TAB} (for
+completion) you will get a list of all commands. Another way is to use
+@kbd{C-h a} and enter the string @code{sml}. This is command apropos; it
+will list all commands with that sub-string in their names, and any key
+binding they may have in the current buffer. Command apropos gives a
+one-line synopsis of what each command does.
+
+Some commands are also variables---such things are allowed in Lisp, if
+not in ML! @xref{Command Index}, for a list of (info) documented
+functions. @xref{Variable Index}, for a list of user settable variables
+to control the behaviour of SML mode.
+
+Before accessing this information on-line from within Emacs you may have
+to set the variable @code{sml-mode-info}. Put in your @file{.emacs} file
+something like:
+
+@vindex sml-mode-info
+@findex sml-mode-info
+@kindex @kbd{C-c C-i}
+@lisp
+(setq sml-mode-info "/home/mjm/info/sml-mode.info")
+@end lisp
+
+@noindent
+When different from the default this variable should be a string giving
+the absolute name of the @file{.info} file. Then @kbd{C-c C-i} in
+SML mode (i.e., the command @kbd{M-x sml-mode-info}) will bring up
+the manual. This help is also accessible from the menu. (Resetting this
+variable will not be necessary if your site administrator has been kind
+enough to install SML mode and its attendant documentation in the
+Emacs hierarchy.)
+
+
+@c ============================================================ SML MODE
+
+@node SML Mode, Interaction Mode, Introduction, Top
+
+@chapter Editing with SML Mode
+
+@c == SML Mode, Interaction Mode, Introduction, Top ====================
+
+
+@noindent
+Now SML mode provides just a few additional editing commands. Most of
+the work has gone into implementing the indentation algorithm which, if
+you think about it, has to be complicated for a language like
+ML. @xref{SML Mode Defaults,,Indentation Defaults}, for details on how
+to control some of the behaviour of the indentation algorithm. Principal
+goodies are the `electric pipe' feature, and the ability to insert
+common SML forms (macros or templates).
+
+@menu
+* Basics::              On entering SML mode
+* Indentation::         Prettying SML text
+* Magic Insertion::     Templates and electric keys
+* SML Mode Defaults::   Variables controlling indentation
+@end menu
+
+
+@c ============================================================== BASICS
+
+@node Basics, Indentation, SML Mode, SML Mode
+
+@section On entering SML mode
+
+@c == Basics, Indentation, SML Mode, SML Mode ==========================
+
+@noindent
+
+
+@deffn Command sml-mode
+This switches a buffer into SML mode. This is a @emph{major mode} in
+Emacs. To get out of SML mode the buffer's major mode must be set to
+something else, like @t{text-mode}. @xref{Getting Started}, for details
+on how to set this up automatically when visiting an SML file.
+@end deffn
+
+Emacs is all hooks of course. A hook is a variable: if the variable is
+non-nil it binds a list of Emacs Lisp functions to be run in some order
+(usually left to right). You can customise SML mode with these
+hooks:
+
+
+@defvr Hook sml-mode-hook
+Default: @code{nil}
+
+This is run every time a new SML mode buffer is created (or if you
+type @kbd{M-x sml-mode}). This is one place to put your preferred key
+bindings. @xref{Configuration}, for some examples.
+@end defvr
+
+
+@c ========================================================= INDENTATION
+
+@node Indentation, Magic Insertion, Basics, SML Mode
+
+@section Automatic indentation
+
+@c == Indentation, Magic Insertion, Basics, SML Mode ===================
+
+
+@noindent
+ML is a complicated language to parse, let alone compile. The
+indentation algorithm is a little wooden (for some tastes), and the best
+advice is not to fight it! There are several variables that can be
+adjusted to control the indentation algorithm (@pxref{SML Mode
+Defaults,,Customising SML Mode}, below).
+
+
+@deffn Command indent-for-tab-command
+Key: @key{TAB}
+@kindex @key{TAB}
+
+This command indents the current line. If you set the indentation of the
+previous line by hand, @code{indent-for-tab-command} will indent relative to
+this setting.
+@end deffn
+
+
+@deffn Command indent-region
+Key: @kbd{C-M-\}
+@kindex @kbd{C-M-\}
+
+Indent the current region. Be patient if the region is large (like the
+whole buffer).
+@end deffn
+
+
+@deffn Command sml-back-to-outer-indent
+Key: @kbd{M-@key{TAB}}
+@kindex @kbd{M-@key{TAB}}
+
+Unindents the line to the next outer level of indentation.
+@end deffn
+
+
+
+Further indentation commands that Emacs provides (generically, for all
+modes) that you may like to recall:
+
+@itemize @minus
+@item
+@kbd{M-x newline-and-indent}
+
+On @key{LFD} by default.
+@kindex @key{LFD}
+Insert a newline, then indent according to the major mode. @xref{Program
+Indent,,Indentation for Programs,emacs,The Emacs Editor Manual}, for
+details.
+
+@item
+@kbd{M-x indent-rigidly}
+
+On @kbd{C-x @key{TAB}} by default.
+@kindex @kbd{C-x @key{TAB}}
+Moves all lines in the region right by its argument (left, for negative
+arguments). @xref{Indentation,,,emacs,The Emacs Editor Manual}.
+
+@item
+@kbd{M-x indent-for-comment} 
+
+On @kbd{M-;} by default.
+@kindex @kbd{M-;}
+Indent this line's comment to comment column, or insert an empty
+comment. @xref{Comment Commands,,,emacs,The Emacs Editor
+Manual}.
+
+@item
+@kbd{M-x indent-new-comment-line}
+
+On @kbd{M-@key{LFD}} by default.
+@kindex @kbd{M-@key{LFD}}
+Break line at point and indent, continuing comment if within one.
+@xref{Multi-Line Comments,,,emacs,The Emacs Editor Manual}.
+@end itemize
+
+@kindex @kbd{C-x ;}
+As with other language modes, @kbd{M-;} gives you a comment at the end
+of the current line. The column where the comment starts is determined
+by the variable @code{comment-column}---default is 40, but it can be
+changed with @code{set-comment-column} (on @kbd{C-x ;} by default).
+
+
+@c ===================================================== MAGIC INSERTION
+
+@node Magic Insertion, SML Mode Defaults, Indentation, SML Mode
+
+@section Electric features
+
+@c == Magic Insertion, SML Mode Defaults, Indentation, SML Mode ========
+
+
+@noindent
+Electric keys are generally pretty irritating, so those provided by
+SML mode are fairly muted. The only truly electric key is @kbd{;},
+and this has to be enabled to take effect.
+
+
+@deffn Command sml-electric-pipe
+Key: @kbd{M-|}
+@kindex @kbd{M-|}
+
+When the point is in a `case' statement this opens a new line, indents
+and inserts @code{| =>} leaving point just before the double arrow; if
+the enclosing construct is a `fun' declaration, the newline is indented
+and the function name copied at the appropriate column. Generally, try
+it whenever a @code{|} is wanted---you'll like it!
+@end deffn
+
+@deffn Command sml-electric-space
+Key: @kbd{M-SPC}
+@kindex @kbd{M-SPC}
+
+When the point is after a keyword like `let', this inserts the
+corresponding predefined skeleton if one exists.  Else it just inserts a
+space.  Another way to insert those skeletons is to use
+@code{sml-insert-form}, described below.
+@end deffn
+
+@deffn Command sml-insert-form
+Key: @kbd{C-c @key{RET}}
+@kindex @kbd{C-c @key{RET}}
+
+Interactive short-cut to insert common ML forms (a.k.a.@: macros, or
+templates). Recognised forms are `let', `local', `case', `abstype',
+`datatype', `signature', `structure', and `functor'. Except for `let'
+and `local', these will prompt for appropriate parameters like functor
+name and signature, etc.. This command prompts in the mini-buffer, with
+completion.
+
+By default @kbd{C-c @key{RET}} will insert at point, with the
+indentation of the current column; if you give a prefix argument (i.e.,
+@kbd{C-u C-c @key{RET}}) the command will insert a newline first,
+indent, and then insert the template.
+@end deffn
+
+@code{sml-insert-form} is also extensible: see @ref{Configuration} for
+further details.
+
+
+
+@c ======================================================= MODE DEFAULTS
+
+@node SML Mode Defaults, , Magic Insertion, SML Mode
+
+@section Indentation defaults
+
+@c == SML Mode Defaults, , Magic Insertion, SML Mode ===================
+
+
+@noindent
+Several variables try to control the indentation algorithm and other
+features of SML mode.  Most of them are still in flux so they are not
+described here yet.
+If the default values are not acceptable you can set these variables
+permanently in your @file{.emacs} file. @xref{Configuration}, for
+details and examples.
+
+
+@defvr Variable sml-indent-level
+@findex sml-indent-level
+Default: @code{4}
+
+This variable controls the block indentation level.
+@end defvr
+
+@c end vtable
+
+
+@c ========================================================= INTERACTION
+
+@node Interaction Mode, Configuration, SML Mode, Top
+
+@chapter Running ML under Emacs
+
+@c == Interaction Mode, Configuration, SML Mode, Top ===================
+
+
+@noindent
+The most useful feature of SML mode is that it provides a convenient
+interface to the compiler. How serious users of ML put up with a
+teletype interface to the compiler is beyond me@.@.@. but perhaps there
+are other interfaces to compilers that require one to part with serious
+money. Such remarks can quickly become dated---in this case, let's hope
+so!
+
+Anyway, SML mode provides an interaction mode,
+@code{inferior-sml-mode}, where the compiler runs in a separate buffer
+in a window or frame of its own. You can use this buffer just like a
+terminal, but it's usually more convenient to mark some text in the
+SML mode buffer and have Emacs communicate with the sub-process. The
+features discussed below are syntax-independent, so they should work
+with a wide range of ML-like tools and compilers. @xref{Process
+Defaults}, for some hints.
+
+@findex inferior-sml-mode
+@code{inferior-sml-mode} is a specialisation of the @file{comint}
+package that comes with Emacs and XEmacs.
+
+
+@menu
+* Running ML::          Commands to run the ML compiler in a buffer
+* ML Interaction::      Sending program fragments to the compiler
+* Tracking Errors::     Finding reported syntax errors
+* Process Defaults::    Setting defaults for process interaction
+@end menu
+
+
+
+@c ========================================================== RUNNING ML
+
+@node Running ML, ML Interaction, Interaction Mode, Interaction Mode
+
+@section Starting the compiler
+
+@c == Running ML, ML Interaction, Interaction Mode, Interaction Mode ==
+
+@noindent
+Start your favourite ML compiler with the command
+
+@example
+@kbd{M-x run-sml}
+@end example
+
+@noindent
+This creates a process interaction buffer that inherits some key
+bindings from SML mode and from @file{comint} (@pxref{Shell Mode, ,
+, emacs, The Emacs Editor Manual}). Starting the ML compiler adds some
+functions to SML mode buffers so that program text can be
+communicated between editor and compiler (@pxref{ML Interaction}).
+
+The name of the ML compiler is the first thing you should know how to
+specify:
+
+
+@defvar sml-program-name
+Default: @code{"sml"}
+
+The program to run as ML. You might need to specify the full path name
+of the program.
+@end defvar
+
+
+@defvar sml-default-arg
+Default: @code{""}
+
+Useful for Poly/ML users who may supply a database file, or others who
+have wrappers for setting various options around the command to run the
+compiler. Moscow ML people might set this to @code{"-P full"}, etc..
+@end defvar
+
+The variable @code{sml-program-name} is a string holding the name
+of the program @emph{as you would type it at the shell}. You 
+can always choose a program different to the default by invoking
+
+@example
+@kbd{C-u M-x run-sml}
+@end example
+
+@noindent
+With the prefix argument Emacs will prompt for the command name and any
+command line arguments to pass to the compiler. Thereafter Emacs will
+use this new name as the default, but for a permanent change you should
+set this in your @file{.emacs} with, e.g.:
+
+@lisp
+(setq sml-program-name "nj-sml")
+@end lisp
+
+
+@deffn Command run-sml
+Launches ML as an inferior process in another buffer; if an ML process
+already exists, just switch to the process buffer. A prefix argument
+allows you to edit the command line to specify the program, and any
+command line options.
+@end deffn
+
+
+@defvr Hook inferior-sml-mode-hook
+Default: @code{nil}
+
+@kbd{M-x run-sml} runs @code{comint-mode-hook} and
+@code{inferior-sml-mode-hook} hooks in that order, but @emph{after} the
+compiler is started. Use @code{inferior-sml-mode-hook} to set any
+@code{comint} buffer-local configurations for SML mode you like.
+@end defvr
+
+
+@deffn Command switch-to-sml
+Key: @kbd{C-c C-s}
+@kindex @kbd{C-c C-s}
+
+Switch from the SML buffer to the interaction buffer. By default point
+will be placed at the end of the process buffer, but a prefix argument
+will leave point wherever it was before. If you try @kbd{C-c C-s} before
+an ML process has been started, you'll just get an error message to the
+effect that there's no current process buffer.
+@end deffn
+
+
+@deffn Command sml-cd
+When started, the ML compiler's default working directory is the
+current buffer's default directory. This command allows the working
+directory to be changed, if the compiler can do this. The variable
+@code{sml-cd-command} specifies the compiler command to invoke
+(@pxref{Process Defaults}).
+@end deffn
+
+
+@c ======================================================== SENDING TEXT
+
+@node ML Interaction, Tracking Errors, Running ML, Interaction Mode
+
+@section Speaking to the compiler
+
+@c == ML Interaction, Tracking Errors, Running ML, Interaction Mode ====
+
+
+@noindent
+Several commands are defined for sending program fragments to the
+running compiler. Each of the following commands takes a prefix argument
+that will switch the input focus to the process buffer afterwards
+(leaving point at the end of the buffer):
+
+
+@deffn Command sml-load-file
+Key: @kbd{C-c C-l}
+@kindex @kbd{C-c C-l}
+
+Send a `use file' command to the current ML process. The variable
+@code{sml-use-command} is used to define the correct template for the
+command to invoke (@pxref{Process Defaults}). The default file is the
+file associated with the current buffer, or the last file loaded if you
+are in the interaction buffer.
+@end deffn
+
+
+
+@deffn Command sml-send-region
+@findex sml-send-region-and-go
+Key: @kbd{C-c C-r}
+@kindex @kbd{C-c C-r}
+
+Send the current region of text in the SML buffer.
+@code{sml-send-region-and-go} is a similar command for you to bind in
+SML mode if you wish: it'll send the region and then switch-to-sml.
+@end deffn
+
+@c @deffn Command sml-send-function
+@c @findex sml-send-function-and-go
+
+@c Send the enclosing `function' definition. Contrary to the suggestive
+@c name, this command @emph{does not} try to determine the extent of the
+@c function definition because that is too difficult with ML. Instead
+@c this just sends the enclosing @emph{paragraph} (delimited by blank
+@c lines or form-feed characters).
+@c @end deffn
+
+@deffn Command sml-send-buffer
+Key: @kbd{C-c C-b}
+@kindex @kbd{C-c C-b}
+
+Send the contents of the current buffer to ML.
+@end deffn
+
+@c ===================================================== TRACKING ERRORS
+
+@node Tracking Errors, Process Defaults, ML Interaction, Interaction Mode
+
+@section Finding errors
+
+@c == Tracking Errors, Process Defaults, ML Interaction, Interaction Mode
+
+
+@noindent
+SML mode provides one customisable function for locating the source
+position of errors reported by the compiler. This should work whether
+you type @code{use "puzzle.sml";} into the interaction buffer, or use
+one of the mechanisms provided for sending programs directly to the
+compiler---@pxref{ML Interaction}.
+
+
+@deffn Command next-error
+@findex next-error
+Key: @kbd{C-x`}
+@kindex @kbd{C-x`}
+
+Jump to the source location of the next error reported by the compiler.
+All the usual error-navigation commands are available, see
+@pxref{Compilation Mode, , , emacs, The Emacs Editor Manual}.
+@end deffn
+
+
+@c ==================================================== PROCESS DEFAULTS
+
+@node Process Defaults, , Tracking Errors, Interaction Mode
+
+@section Process defaults
+
+@c == Process Defaults, , Tracking Errors, Interaction Mode ============
+
+@noindent
+The process interaction code is independent of the compiler used,
+deliberately, so SML mode will work with a variety of ML compilers
+and ML-based tools. There are therefore a number of variables that may
+need to be set correctly before SML mode can speak to the compiler.
+Things are by default set up for Standard ML of New Jersey, but
+switching to a new system is quite easy.
+
+
+
+@defvar sml-use-command
+Default: @code{"use \"%s\""}
+
+Use file command template. Emacs will replace the @code{%s} with a file
+name. Note that Emacs requires double quote characters inside strings
+to be quoted with a backslash.
+@end defvar
+
+
+@defvar sml-cd-command
+Default: @code{"OS.FileSys.chDir \"%s\""}
+
+Compiler command to change the working directory. Not all ML systems
+support this feature (well, Edinburgh (core) ML didn't), but they
+should.
+@end defvar
+
+
+@defvar sml-prompt-regexp
+Default: @code{"^[-=>#] *"}
+
+Matches the ML compiler's prompt: @file{comint} uses this for various
+purposes.
+@end defvar
+
+
+To customise error reportage for different ML compilers you need to set
+two further variables before @code{next-error} can be useful:
+
+
+@defvar sml-error-regexp-alist
+
+Alist that specifies how to match errors in compiler output.
+Each elt has the form (REGEXP FILE-IDX LINE-IDX [COLUMN-IDX FILE-FORMAT...])
+If REGEXP matches, the FILE-IDX'th subexpression gives the file name, and
+the LINE-IDX'th subexpression gives the line number.  If COLUMN-IDX is
+given, the COLUMN-IDX'th subexpression gives the column number on that line.
+If any FILE-FORMAT is given, each is a format string to produce a file name to
+try; %s in the string is replaced by the text matching the FILE-IDX'th
+subexpression.
+@end defvar
+
+
+@c A typical way of (re)setting these variables correctly is to put
+@c something in your @file{.emacs} file that resembles
+
+@c @example
+@c (setq sml-use-command "PolyML.use \"%s\"")
+@c (setq sml-prompt-regexp "^[>#] *")
+@c @end example
+
+@c ======================================================= CONFIGURATION
+
+@node Configuration, , Interaction Mode, Top
+
+@chapter Configuration Summary
+
+@c @footnote{@url{http://www.ahl.co.uk/}}
+@c @footnote{@url{http://www.dina.kvl.dk/~sestoft/mosml.html}}
+
+@noindent
+This (sort of pedagogic) section gives more information on how to
+configure SML mode: menus, key bindings, hooks and highlighting are
+discussed, along with a few other random topics.
+
+@menu
+* Hooks::               Creating them
+* Key Bindings::        Binding commands to keys
+* Highlighting::        Syntax colouring
+* Advanced Topics::     You may need to speak Emacs Lisp
+@end menu
+
+
+@c =============================================================== HOOKS
+
+@node Hooks, Key Bindings, Configuration, Configuration
+
+@section Hooks
+
+@c == Hooks, Key Bindings, Configuration, Configuration ================
+
+
+@noindent
+One way to set SML mode variables (@pxref{SML Mode
+Defaults,,Indentation Defaults}), and other defaults, is through the
+@code{sml-mode-hook} in your @file{.emacs}. A simple example:
+
+@lisp
+(defun my-sml-mode-hook () "Local defaults for SML mode"
+  (setq sml-indent-level 2)        ; conserve on horizontal space
+  (setq words-include-escape t)    ; \ loses word break status
+  (setq indent-tabs-mode nil))     ; never ever indent with tabs
+(add-hook 'sml-mode-hook #'my-sml-mode-hook)
+@end lisp
+@noindent
+The body of @code{my-sml-mode-hook} is a sequence of assignments. In this
+case it is not really necessary to set @code{sml-indent-level} in a hook
+because this variable is global (most SML mode variables are). With
+similar effect:
+
+@lisp
+(setq sml-indent-level 2)
+@end lisp
+@noindent
+anywhere in your @file{.emacs} file. The variable @code{indent-tabs-mode} is
+automatically made local to the current buffer whenever it is set
+explicitly, so it @emph{must} be set in a hook if you always want
+SML mode to behave like this.
+
+Another hook is @code{inferior-sml-mode-hook}. This can be used to
+control the behaviour of the interaction buffer through various
+variables meaningful to @file{comint}-based packages:
+
+@lisp
+(defun my-inf-sml-mode-hook () "Local defaults for inferior SML mode"
+  (add-hook 'comint-output-filter-functions 'comint-truncate-buffer)
+  (setq      comint-scroll-show-maximum-output t)
+  (setq      comint-input-autoexpand nil))
+(add-hook 'inferior-sml-mode-hook 'my-inf-sml-mode-hook)
+@end lisp
+@noindent
+Again, the body is a sequence of assignments. Unless you run several ML
+compilers simultaneously under one Emacs, this hook will normally only
+get run once. You might want to look up the documentation (@kbd{C-h v}
+and @kbd{C-h f}) for these buffer-local @code{comint} things.
+
+
+@c ======================================================== Key Bindings
+
+@node Key Bindings, Highlighting, Hooks, Configuration
+
+@section Key bindings
+
+@noindent
+Customisation (in Emacs) usually entails putting favourite commands on
+easily remembered keys. Two `keymaps' are defined in SML mode: one
+is effective in program text buffers (@code{sml-mode-map}) and the other
+is effective in interaction buffers (@code{inferior-sml-mode-map}).
+The initial design ensures that (many of) the default key bindings from
+the former keymap will also be available in the latter (e.g.,
+@kbd{C-c`}).
+
+Type @kbd{C-h m} in an SML mode buffer to find the default key
+bindings (and similarly in an ML interaction buffer), and use the hooks
+provided to install your preferred key bindings. Given that the keymaps
+are global (variables):
+
+@lisp
+(defun my-sml-mode-hook () "Global defaults for SML mode"
+  (define-key sml-mode-map "\C-cd" 'sml-cd))
+(add-hook 'sml-mode-hook 'my-sml-mode-hook)
+@end lisp
+@noindent
+This has the effect of binding @code{sml-cd} to the key @kbd{C-c d}.
+If you want the same behaviour from @kbd{C-c d} in the ML buffer:
+
+@lisp
+(defun my-inf-sml-mode-hook () "Global defaults for inferior SML mode"
+  (define-key inferior-sml-mode-map "\C-cd" 'sml-cd)
+  ;; NB. for SML/NJ '96
+  (setq sml-cd-command "OS.FileSys.chDir \"%s\""))
+(add-hook 'inferior-sml-mode-hook 'my-inf-sml-mode-hook)
+@end lisp
+
+There is nothing to stop you rebuilding the entire keymap for
+SML mode and the ML interaction buffer in your @file{.emacs} of
+course: SML mode won't define @code{sml-mode-map} or
+@code{inferior-sml-mode-map} if you have already done so. 
+
+
+@c ======================================================== Highlighting
+
+@node Highlighting, Advanced Topics, Key Bindings, Configuration
+
+@section Syntax colouring
+
+
+@noindent
+Highlighting is very handy for picking out keywords in the program text,
+spotting misspelled kewyords, and, if you have Emacs' @file{ps-print}
+package installed (you usually do these days), obtaining pretty, even
+colourful code listings---quite properly for your colourful ML programs.
+
+The indentation scheme (strangely enough) also relies on the
+highlighting code to properly handle nested comments, which is yet
+another reason to turn on highlighting.  To turn on highlighting,
+use either of:
+
+@lisp
+M-x font-lock-mode
+(add-hook 'sml-mode-hook 'turn-on-font-lock)
+(global-font-lock-mode 1)
+@end lisp
+
+The first will turn it on in the current buffer.
+The second will turn it on in all sml-mode buffers.
+The last will turn it on everywhere.
+This is valid for Emacs but maybe not for XEmacs.  Check font-lock
+documentation if you encounter problems.
+
+@c ===================================================== ADVANCED TOPICS
+
+@node Advanced Topics, , Highlighting, Configuration
+
+@section Advanced Topics
+
+@flushright
+@emph{These forms are bloody useless; can't we have better ones?}
+@end flushright
+
+@sp 1
+@noindent
+You can indeed. @code{sml-insert-form} is extensible so all you need to
+do is create the macros yourself. Define a @emph{keybord macro}
+(@kbd{C-x (} <something> @kbd{C-x )}) and give it a suitable name:
+@code{sml-addto-forms-alist} prompts for a name, say @code{NAME}, and
+binds the macro @code{sml-form-NAME}. Thereafter @kbd{C-c @key{RET}
+NAME} will insert the macro at point, and @kbd{C-u C-c @key{RET} NAME}
+will insert the macro after a @code{newline-and-indent}. If you want to
+keep your macros from one editing session to the next, go to your
+@file{.emacs} file and call @code{insert-kbd-macro}; you'll need
+to add @code{NAME} to @code{sml-forms-alist} permanently yourself:
+
+@lisp
+(defun my-sml-mode-hook () "Global defaults for SML mode"
+  ;; whatever else you do
+  (add-to-list 'sml-forms-alist '("NAME" . FUNCTION)))
+@end lisp
+
+If you want to create templates like `case' that prompt for parameters
+you'll have to do some Lisp programming. The @code{skeleton} package is
+a good stating point.  Better yet, you can reuse the wrappers used by
+sml-mode itself in your sml-mode-hook:
+
+@lisp
+(add-hook 'sml-mode-hook
+  (lambda ()
+    (sml-def-skeleton "case" "Case expr: "
+      str " of" \n _ " => ")))
+@end lisp
+
+This will redefine `case' in order to leave the `of' on the first line.
+See the documentation of @code{skeleton-insert} to get a better
+understanding of how this works.
+
+@sp 1
+@flushright
+@emph{I hate that indentation algorithm; can't I tweak it?}
+@end flushright
+
+@sp 1
+@noindent
+Ah, yes, of course, but this manual will not tell you how.
+
+
+@sp 1
+@flushright
+@emph{Can SML mode handle more than one compiler running at once?}
+@end flushright
+
+Sure, just rename the @samp{*sml*} buffer and then use @code{run-sml}
+as usual.
+
+@sp 1
+@flushright
+@emph{What needs to be done to support other ML compilers?}
+@end flushright
+
+@sp 1
+@noindent
+Not much really.  Just add the right regular expressions to
+@code{sml-error-regexp-alist} and that should be all.
+
+
+@c ======================================================= COMMAND INDEX
+
+@headings singleafter
+
+@node Command Index, Variable Index, , Top
+
+@unnumbered Command Index
+
+@printindex fn
+
+@c ====================================================== VARIABLE INDEX
+
+@c node Variable Index, , Command Index, Top
+@node Variable Index, Key Index, Command Index, Top
+
+@unnumbered Variable Index
+
+@c == Variable Index, Key Index, Command Index, Top ====================
+
+@printindex vr
+
+@c =========================================================== KEY INDEX
+
+@node Key Index, , Variable Index, Top
+
+@unnumbered Key Index
+
+@c == Key Index, , Variable Index, Top =================================
+
+@printindex ky
+
+@contents
+@bye
diff --git a/packages/sml-mode/testcases.sml b/packages/sml-mode/testcases.sml
new file mode 100644 (file)
index 0000000..adab3e2
--- /dev/null
@@ -0,0 +1,563 @@
+(* Copyright 1999,2004,2007,2010-2012 Stefan Monnier <monnier@gnu.org> *)
+
+(* sml-mode here treats the second `=' as an equal op because it
+ * thinks it's seeing something like "... type t = (s.t = ...)".  FIXME!  *)
+functor foo (structure s : S) where type t = s.t =
+struct                          (* fixindent *)
+val bar = fn a1 a2 a3
+            a5 a6
+            a4 => 1
+val rec bar =
+ fn a1 a2 a3
+    a5 a6 a4 => 1
+val bar =
+ fn a1 a2 a3
+    a5 a6
+    a4 => (1
+          ;(
+              w
+            ,
+              s
+            ,
+              s
+            , s , a ,
+              a
+            , s , a ,
+              a
+          )
+          ;(
+              w
+             ,s
+             ,a
+          )
+          ;(
+              w
+          ,   s
+          ,   a
+          )
+          ;(   w
+           ,   s
+           ,   a
+           )
+          ;( w
+            ,s
+            ,a
+           )
+          ;3
+           + a
+             * 4
+           + let val x = 3
+             in toto
+             end
+           + if a then
+                 b
+             else
+                 c
+          ;4)
+
+val ber = 1;
+val sdfg = 1
+val tut = fn (x,y) z y e r =>
+             body
+val tut = fn (x,y) => fn z y => fn e r =>
+             body
+val tut = fn (x,y)
+             z
+             y e
+             r =>
+             body
+val tut =
+    (let
+        local
+            val x = 1 in val x = x end
+        val a = 1 val b = 2
+        local val x = 1 in val x = x end
+        local val x = 1 in val x = x end
+            local val x = 1 in val x = x end (* fixindent *)
+            local val x = 1 in val x = x end
+            val c = 3
+    in
+       let
+            val x = 3
+       in
+            x +   a * b
+                  * c
+       end
+    end)
+
+val x =
+    (* From "Christopher Dutchyn" <cdutchyn@cs.ubc.ca> *)
+    (case foo of
+       (* This is actually not valid SML anyway.  *)
+       | BAR => baz
+       | BAR => baz)
+
+
+val x =
+    (x := 1;
+     x := 2;
+       (* Testing obedience to user overrides: *)
+       x := 3;                  (* fixindent *)
+       case x of
+           FOO => 1
+         | BAR =>
+           2;
+       case x of
+           FOO => 1
+         | BAR =>
+           case y of
+              FAR => 2
+            | FRA => 3;
+       hello);
+
+datatype foobar
+  = FooB of int
+  | FooA of bool * int
+datatype foo = FOO | BAR of baz
+     and baz = BAZ | QUUX of foo
+
+fun toto = if a
+           then
+               b
+           else c
+
+datatype foo = FOO
+             | BAR of baz
+  and baz = BAZ                        (* fixindent *)
+         | QUUX of foo
+  and b = g
+
+datatype foo = datatype M.foo
+val _ = 42 val x = 5
+
+signature S = S' where type foo = int
+val _ = 42
+
+val foo = [
+    "blah"
+  , let val x = f 42 in g (x,x,44) end
+]
+
+val foo = [
+    "blah",
+    let val x = f 42 in g (x,x,44) end
+]
+
+val foo =
+    [
+      "blah",
+      let val x = f 42 in g (x,x,44) end
+    ]
+
+val foo = [ "blah"
+         , let val x = f 42 in g (x,x,44) end
+         , foldl (fn ((p,q),s) => g (p,q,Vector.length q) ^ ":" ^ s)
+                  "" (Beeblebrox.masterCountList mlist2)
+          , if null mlist2 then ";" else ""
+         ]
+
+fun foo (true::rest) = 1 + 2 * foo rest
+  | foo (false::rest)
+    = let val _ = 1 in 2 end
+      + 2
+        * foo rest
+
+val x = if foo then
+           1
+       else if bar then
+           2
+       else
+           3
+val y = if foo
+       then 1
+       else if foo
+       then 2              (* Could also be indented by a basic offset.  *)
+       else 3
+
+val yt = 4
+
+val x =
+    (if a then b else c;
+     case M.find(m,f)
+      of SOME(fl, filt) =>
+         F.APP(F.VAR fl, OU.filter filt vs)
+       | NONE
+         => le
+       | NONE =>
+         le
+       | NONE => le;
+     x := x + 1;
+     (case foo
+       of a => f
+    ))
+
+val y = (
+    let fun f1 =
+            let fun g1 x = 2
+                fun g2 y = 4
+                local fun toto y = 1
+                (* val x = 5 *)
+                in
+                fun g3 z = z
+                end
+            in toto
+            end
+    in a;( ( let
+               val f =1
+           in
+               toto
+           end
+           )
+         )
+             foo("(*")
+         * 2;
+    end;
+
+    let
+    in a
+     ; b
+    end;
+
+    let
+    in
+        a +
+        b +
+        c
+      ; b
+    end;
+
+    let
+    in if a then
+           b
+       else
+           c
+    end;
+
+    let
+    in case a of
+           F => 1
+         | D => 2
+    end;
+
+    let
+    in case a
+        of F => 1
+         | D => 2
+    end;
+
+    let
+    in if a then b else
+       c
+    end;
+
+    let
+    in if a then b
+       else
+           c
+    end)
+end;
+
+structure Foo = struct
+val x = 1
+end
+
+structure Foo = struct val x = 1
+                end
+
+signature FSPLIT =
+sig
+    type flint = FLINT.prog
+    val split: flint -> flint * flint option
+end
+
+structure FSplit :> FSPLIT =
+struct
+
+local
+    structure F  = FLINT
+    structure S  = IntRedBlackSet
+    structure M  = FLINTIntMap
+    structure O  = Option
+    structure OU = OptUtils
+    structure FU = FlintUtil
+    structure LT = LtyExtern
+    structure PO = PrimOp
+    structure PP = PPFlint
+    structure CTRL = FLINT_Control
+in
+
+val say = Control_Print.say
+fun bug msg = ErrorMsg.impossible ("FSplit: "^msg)
+fun buglexp (msg,le) = (say "\n"; PP.printLexp le; say " "; bug msg)
+fun bugval (msg,v) = (say "\n"; PP.printSval v; say " "; bug msg)
+fun assert p = if p then () else bug ("assertion failed")
+
+type flint = F.prog
+val mklv = LambdaVar.mkLvar
+val cplv = LambdaVar.dupLvar
+
+fun S_rmv(x, s) = S.delete(s, x) handle NotFound => s
+
+fun addv (s,F.VAR lv) = S.add(s, lv)
+  | addv (s,_) = s
+fun addvs (s,vs) = foldl (fn (v,s) => addv(s, v)) s vs
+fun rmvs (s,lvs) = foldl (fn (l,s) => S_rmv(l, s)) s lvs
+
+exception Unknown
+
+fun split (fdec as (fk,f,args,body)) = let
+    val {getLty,addLty,...} = Recover.recover (fdec, false)
+
+    val m = Intmap.new(64, Unknown)
+    fun addpurefun f = Intmap.add m (f, false)
+    fun funeffect f = (Intmap.map m f) handle Uknown => true
+
+(* sexp: env -> lexp -> (leE, leI, fvI, leRet)
+ * - env: IntSetF.set  current environment
+ * - lexp: lexp                expression to split
+ * - leRet: lexp       the core return expression of lexp
+ * - leE: lexp -> lexp recursively split lexp:  leE leRet == lexp
+ * - leI: lexp option  inlinable part of lexp (if any)
+ * - fvI: IntSetF.set  free variables of leI:   FU.freevars leI == fvI
+ *
+ * sexp splits the lexp into an expansive part and an inlinable part.
+ * The inlinable part is guaranteed to be side-effect free.
+ * The expansive part doesn't bother to eliminate unused copies of
+ *   elements copied to the inlinable part.
+ * If the inlinable part cannot be constructed, leI is set to F.RET[].
+ *   This implies that fvI == S.empty, which in turn prevents us from
+ *   mistakenly adding anything to leI.
+ *)
+fun sexp env lexp =                    (* fixindent *)
+    let
+       (* non-side effecting binds are copied to leI if exported *)
+       fun let1 (le,lewrap,lv,vs,effect) =
+           let  val (leE,leI,fvI,leRet) = sexp (S.add(env, lv)) le
+                val leE = lewrap o leE
+           in if effect orelse not (S.member(fvI, lv))
+              then (leE, leI, fvI, leRet)
+              else (leE, lewrap leI, addvs(S_rmv(lv, fvI), vs), leRet)
+           end
+
+    in case lexp
+       (* we can completely move both RET and TAPP to the I part *)
+       of F.RECORD (rk,vs,lv,le as F.RET [F.VAR lv']) =>
+          if lv' = lv
+          then (fn e => e, lexp, addvs(S.empty, vs), lexp)
+          else (fn e => e, le, S.singleton lv', le)
+        | F.RET vs =>
+          (fn e => e, lexp, addvs(S.empty, vs), lexp)
+        | F.TAPP (F.VAR tf,tycs) =>
+          (fn e => e, lexp, S.singleton tf, lexp)
+
+        (* recursive splittable lexps *)
+        | F.FIX (fdecs,le) => sfix env (fdecs, le)
+        | F.TFN (tfdec,le) => stfn env (tfdec, le)
+
+        (* binding-lexps *)
+        | F.CON (dc,tycs,v,lv,le) =>
+          let1(le, fn e => F.CON(dc, tycs, v, lv, e), lv, [v], false)
+        | F.RECORD (rk,vs,lv,le) =>
+          let1(le, fn e => F.RECORD(rk, vs, lv, e), lv, vs, false)
+        | F.SELECT (v,i,lv,le) =>
+          let1(le, fn e => F.SELECT(v, i, lv, e), lv, [v], false)
+        | F.PRIMOP (po,vs,lv,le) =>
+          let1(le, fn e => F.PRIMOP(po, vs, lv, e), lv, vs, PO.effect(#2 po))
+
+        (* IMPROVEME: lvs should not be restricted to [lv] *)
+        | F.LET(lvs as [lv],body as F.TAPP (v,tycs),le) =>
+          let1(le, fn e => F.LET(lvs, body, e), lv, [v], false)
+        | F.LET (lvs as [lv],body as F.APP (v as F.VAR f,vs),le) =>
+          let1(le, fn e => F.LET(lvs, body, e), lv, v::vs, funeffect f)
+
+        | F.SWITCH (v,ac,[(dc as F.DATAcon(_,_,lv),le)],NONE) =>
+          let1(le, fn e => F.SWITCH(v, ac, [(dc, e)], NONE), lv, [v], false)
+
+        | F.LET (lvs,body,le) =>
+          let val (leE,leI,fvI,leRet) = sexp (S.union(S.addList(S.empty, lvs), env)) le
+          in (fn e => F.LET(lvs, body, leE e), leI, fvI, leRet)
+          end
+
+        (* useless sophistication *)
+        | F.APP (F.VAR f,args) =>
+          if funeffect f
+          then (fn e => e, F.RET[], S.empty, lexp)
+          else (fn e => e, lexp, addvs(S.singleton f, args), lexp)
+
+        (* other non-binding lexps result in unsplittable functions *)
+        | (F.APP _ | F.TAPP _) => bug "strange (T)APP"
+        | (F.SWITCH _ | F.RAISE _ | F.BRANCH _ | F.HANDLE _) =>
+          (fn e => e, F.RET[], S.empty, lexp)
+    end
+
+(* Functions definitions fall into the following categories:
+ * - inlinable:  if exported, copy to leI
+ * - (mutually) recursive:  don't bother
+ * - non-inlinable non-recursive:  split recursively *)
+and sfix env (fdecs,le) =
+    let val nenv = S.union(S.addList(S.empty, map #2 fdecs), env)
+       val (leE,leI,fvI,leRet) = sexp nenv le
+       val nleE = fn e => F.FIX(fdecs, leE e)
+    in case fdecs
+       of [({inline=inl as (F.IH_ALWAYS | F.IH_MAYBE _),...},f,args,body)] =>
+          let val min = case inl of F.IH_MAYBE(n,_) => n | _ => 0
+          in if not(S.member(fvI, f)) orelse min > !CTRL.splitThreshold
+             then (nleE, leI, fvI, leRet)
+             else (nleE, F.FIX(fdecs, leI),
+                   rmvs(S.union(fvI, FU.freevars body),
+                        f::(map #1 args)),
+                   leRet)
+          end
+        | [fdec as (fk as {cconv=F.CC_FCT,...},_,_,_)] =>
+          sfdec env (leE,leI,fvI,leRet) fdec
+
+        | _ => (nleE, leI, fvI, leRet)
+    end
+
+and sfdec env (leE,leI,fvI,leRet) (fk,f,args,body) =
+    let val benv = S.union(S.addList(S.empty, map #1 args), env)
+       val (bodyE,bodyI,fvbI,bodyRet) = sexp benv body
+    in case bodyI
+       of F.RET[] =>
+          (fn e => F.FIX([(fk, f, args, bodyE bodyRet)], e),
+           leI, fvI, leRet)
+        | _ =>
+          let val fvbIs = S.listItems(S.difference(fvbI, benv))
+              val (nfk,fkE) = OU.fk_wrap(fk, NONE)
+
+              (* fdecE *)
+              val fE = cplv f
+              val fErets = (map F.VAR fvbIs)
+              val bodyE = bodyE(F.RET fErets)
+              (* val tmp = mklv()
+               val bodyE = bodyE(F.RECORD(F.RK_STRUCT, map F.VAR fvbIs,
+                                          tmp, F.RET[F.VAR tmp])) *)
+              val fdecE = (fkE, fE, args, bodyE)
+              val fElty = LT.ltc_fct(map #2 args, map getLty fErets)
+              val _ = addLty(fE, fElty)
+
+              (* fdecI *)
+              val fkI = {inline=F.IH_ALWAYS, cconv=F.CC_FCT,
+                         known=true, isrec=NONE}
+              val argsI =
+                  (map (fn lv => (lv, getLty(F.VAR lv))) fvbIs) @ args
+              val fdecI as (_,fI,_,_) = FU.copyfdec(fkI,f,argsI,bodyI)
+              val _ = addpurefun fI
+
+              (* nfdec *)
+              val nargs = map (fn (v,t) => (cplv v, t)) args
+              val argsv = map (fn (v,t) => F.VAR v) nargs
+              val nbody =
+                  let val lvs = map cplv fvbIs
+                  in F.LET(lvs, F.APP(F.VAR fE, argsv),
+                           F.APP(F.VAR fI, (map F.VAR lvs)@argsv))
+                  end
+              (* let val lv = mklv()
+                 in F.LET([lv], F.APP(F.VAR fE, argsv),
+                          F.APP(F.VAR fI, (F.VAR lv)::argsv))
+                 end *)
+              val nfdec = (nfk, f, nargs, nbody)
+
+              (* and now, for the whole F.FIX *)
+              fun nleE e =
+                  F.FIX([fdecE], F.FIX([fdecI], F.FIX([nfdec], leE e)))
+
+          in if not(S.member(fvI, f)) then (nleE, leI, fvI, leRet)
+             else (nleE,
+                   F.FIX([fdecI], F.FIX([nfdec], leI)),
+                   S.add(S.union(S_rmv(f, fvI), S.intersection(env, fvbI)), fE),
+                   leRet)
+          end
+    end
+
+(* TFNs are kinda like FIX except there's no recursion *)
+and stfn env (tfdec as (tfk,tf,args,body),le) =
+    let val (bodyE,bodyI,fvbI,bodyRet) =
+           if #inline tfk = F.IH_ALWAYS
+           then (fn e => body, body, FU.freevars body, body)
+           else sexp env body
+       val nenv = S.add(env, tf)
+       val (leE,leI,fvI,leRet) = sexp nenv le
+    in case (bodyI, S.listItems(S.difference(fvbI, env)))
+       of ((F.RET _ | F.RECORD(_,_,_,F.RET _)),_) =>
+          (* split failed *)
+          (fn e => F.TFN((tfk, tf, args, bodyE bodyRet), leE e),
+           leI, fvI, leRet)
+        | (_,[]) =>
+          (* everything was split out *)
+          let val ntfdec = ({inline=F.IH_ALWAYS}, tf, args, bodyE bodyRet)
+              val nlE = fn e => F.TFN(ntfdec, leE e)
+          in if not(S.member(fvI, tf)) then (nlE, leI, fvI, leRet)
+             else (nlE, F.TFN(ntfdec, leI),
+                   S_rmv(tf, S.union(fvI, fvbI)), leRet)
+          end
+        | (_,fvbIs) =>
+          let (* tfdecE *)
+              val tfE = cplv tf
+              val tfEvs = map F.VAR fvbIs
+              val bodyE = bodyE(F.RET tfEvs)
+              val tfElty = LT.lt_nvpoly(args, map getLty tfEvs)
+              val _ = addLty(tfE, tfElty)
+
+              (* tfdecI *)
+              val tfkI = {inline=F.IH_ALWAYS}
+              val argsI = map (fn (v,k) => (cplv v, k)) args
+              (* val tmap = ListPair.map (fn (a1,a2) =>
+               *                               (#1 a1, LT.tcc_nvar(#1 a2)))
+               *                              (args, argsI) *)
+              val bodyI = FU.copy tmap M.empty
+                                  (F.LET(fvbIs, F.TAPP(F.VAR tfE, map #2 tmap),
+                                         bodyI))
+              (* F.TFN *)
+              fun nleE e =
+                  F.TFN((tfk, tfE, args, bodyE),
+                        F.TFN((tfkI, tf, argsI, bodyI), leE e))
+
+          in if not(S.member(fvI, tf)) then (nleE, leI, fvI, leRet)
+             else (nleE,
+                   F.TFN((tfkI, tf, argsI, bodyI), leI),
+                   S.add(S.union(S_rmv(tf, fvI), S.intersection(env, fvbI)), tfE),
+                   leRet)
+          end
+    end
+
+(* here, we use B-decomposition, so the args should not be
+ * considered as being in scope *)
+val (bodyE,bodyI,fvbI,bodyRet) = sexp S.empty body
+in case (bodyI, bodyRet)
+    of (F.RET _,_) => ((fk, f, args, bodyE bodyRet), NONE)
+     | (_,F.RECORD (rk,vs,lv,F.RET[lv'])) =>
+       let val fvbIs = S.listItems fvbI
+
+          (* fdecE *)
+          val bodyE = bodyE(F.RECORD(rk, vs@(map F.VAR fvbIs), lv, F.RET[lv']))
+          val fdecE as (_,fE,_,_) = (fk, cplv f, args, bodyE)
+
+          (* fdecI *)
+          val argI = mklv()
+          val argLtys = (map getLty vs) @ (map (getLty o F.VAR) fvbIs)
+          val argsI = [(argI, LT.ltc_str argLtys)]
+          val (_,bodyI) = foldl (fn (lv,(n,le)) =>
+                                    (n+1, F.SELECT(F.VAR argI, n, lv, le)))
+                                (length vs, bodyI) fvbIs
+          val fdecI as (_,fI,_,_) = FU.copyfdec (fk, f, argsI, bodyI)
+
+          val nargs = map (fn (v,t) => (cplv v, t)) args
+       in
+          (fdecE, SOME fdecI)
+       (* ((fk, f, nargs,
+           F.FIX([fdecE],
+                 F.FIX([fdecI],
+                       F.LET([argI],
+                             F.APP(F.VAR fE, map (F.VAR o #1) nargs),
+                             F.APP(F.VAR fI, [F.VAR argI]))))),
+          NONE) *)
+       end
+
+     | _ => (fdec, NONE)               (* sorry, can't do that *)
+(* (PPFlint.printLexp bodyRet; bug "couldn't find the returned record") *)
+
+end
+
+end
+end
diff --git a/packages/sokoban/sokoban-pkg.el b/packages/sokoban/sokoban-pkg.el
new file mode 100644 (file)
index 0000000..195179c
--- /dev/null
@@ -0,0 +1 @@
+(define-package "sokoban" "1.0.4" "Sokoban game for emacs")
diff --git a/packages/sokoban/sokoban.el b/packages/sokoban/sokoban.el
new file mode 100644 (file)
index 0000000..3c63ca0
--- /dev/null
@@ -0,0 +1,787 @@
+;;; sokoban.el --- Implementation of Sokoban for Emacs.
+
+;; Copyright (C) 1998, 2013 Free Software Foundation, Inc.
+
+;; Author: Glynn Clements <glynn.clements@virgin.net>
+;; Version: 1.04
+;; Created: 1997-09-11
+;; Keywords: games
+
+;; This file is part of XEmacs.
+
+;; XEmacs 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.
+
+;; XEmacs 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 XEmacs; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+;; 02111-1307, USA.
+
+;;; Synched up with: Not synched.
+
+;;; Commentary:
+
+;; Modified: 1998-01-09, conditionalised use of locate-data-directory
+;; Modified: 1998-01-27, added mouse interface code
+;;   (provided by Sean MacLennan <bn932@freenet.carleton.ca>
+;; Modified: 1998-02-06, fixed bug, where sokoban-done wasn't reset to
+;;   zero in sokoban-restart-level
+;; Modified: 1998-02-27, patches from Hrvoje Niksic
+;;   added bounds check to sokoban-goto-level
+;;   added popup menu
+;;   display level and score in modeline
+;; Modified: 1998-06-04, added `undo' feature
+;;   added number of blocks done/total to score and modeline
+;; Modified: 2003-06-14, update email address, remove URL
+
+;; Tested with XEmacs 20.3/4/5 and Emacs 19.34
+
+;; The game is based upon XSokoban, by
+;; Michael Bischoff <mbi@mo.math.nat.tu-bs.de>
+
+;; The levels and some of the pixmaps were
+;; taken directly from XSokoban
+
+;;; Code:
+
+(eval-when-compile
+  (require 'cl))
+
+(require 'gamegrid)
+
+;; ;;;;;;;;;;;;; customization variables ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defvar sokoban-use-glyphs t
+  "Non-nil means use glyphs when available.")
+
+(defvar sokoban-use-color t
+  "Non-nil means use color when available.")
+
+(defvar sokoban-font "-*-courier-medium-r-*-*-*-200-100-75-*-*-iso8859-*"
+  "Name of the font used in X mode.")
+
+(defvar sokoban-buffer-name "*Sokoban*")
+
+(defvar sokoban-temp-buffer-name " Sokoban-tmp")
+
+(defvar sokoban-level-file
+  (if (fboundp 'locate-data-file)
+      (locate-data-file "sokoban.levels")
+    (or (locate-library "sokoban.levels")
+            (let ((file (expand-file-name
+                         "sokoban.levels"
+                         (if load-file-name
+                             (file-name-directory load-file-name)))))
+              (and (file-exists-p file) file))
+       (expand-file-name "sokoban.levels" data-directory))))
+
+(defvar sokoban-width 20)
+(defvar sokoban-height 16)
+
+(defvar sokoban-buffer-width 20)
+(defvar sokoban-buffer-height 20)
+
+(defvar sokoban-score-x 0)
+(defvar sokoban-score-y 17)
+
+(defvar sokoban-level-data nil)
+
+;; ;;;;;;;;;;;;; constants ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defconst sokoban-floor-xpm "\
+/* XPM */
+static char * floor_xpm[] = {
+\"32 32 1 1\",
+\"  c None\",
+\"                                \",
+\"                                \",
+\"                                \",
+\"                                \",
+\"                                \",
+\"                                \",
+\"                                \",
+\"                                \",
+\"                                \",
+\"                                \",
+\"                                \",
+\"                                \",
+\"                                \",
+\"                                \",
+\"                                \",
+\"                                \",
+\"                                \",
+\"                                \",
+\"                                \",
+\"                                \",
+\"                                \",
+\"                                \",
+\"                                \",
+\"                                \",
+\"                                \",
+\"                                \",
+\"                                \",
+\"                                \",
+\"                                \",
+\"                                \",
+\"                                \",
+\"                                \",
+};
+")
+
+(defconst sokoban-target-xpm "\
+/* XPM */
+static char * target_xpm[] = {
+\"32 32 3 1\",
+\"  c None\",
+\". c black\",
+\"X c yellow\",
+\"                                \",
+\"                                \",
+\"                                \",
+\"                                \",
+\"                                \",
+\"                                \",
+\"          ............          \",
+\"          .XXXXXXXXXX.          \",
+\"           .XXXXXXXX.           \",
+\"            .XXXXXX.            \",
+\"      ..     .XXXX.     ..      \",
+\"      .X.     .XX.     .X.      \",
+\"      .XX.     ..     .XX.      \",
+\"      .XXX.          .XXX.      \",
+\"      .XXXX.        .XXXX.      \",
+\"      .XXXXX.      .XXXXX.      \",
+\"      .XXXXX.      .XXXXX.      \",
+\"      .XXXX.        .XXXX.      \",
+\"      .XXX.          .XXX.      \",
+\"      .XX.     ..     .XX.      \",
+\"      .X.     .XX.     .X.      \",
+\"      ..     .XXXX.     ..      \",
+\"            .XXXXXX.            \",
+\"           .XXXXXXXX.           \",
+\"          .XXXXXXXXXX.          \",
+\"          ............          \",
+\"                                \",
+\"                                \",
+\"                                \",
+\"                                \",
+\"                                \",
+\"                                \",
+};
+")
+
+(defconst sokoban-wall-xpm "\
+/* XPM */
+static char * wall_xpm[] = {
+\"32 32 2 1\",
+\"  c white\",
+\". c SteelBlue\",
+\" .............................. \",
+\". ............................ .\",
+\".. .......................... . \",
+\"... ........................ . .\",
+\"....                        . . \",
+\".... ......................  . .\",
+\".... ...................... . . \",
+\".... ......................  . .\",
+\".... ...................... . . \",
+\".... ......................  . .\",
+\".... ...................... . . \",
+\".... ......................  . .\",
+\".... ...................... . . \",
+\".... ......................  . .\",
+\".... ...................... . . \",
+\".... ......................  . .\",
+\".... ...................... . . \",
+\".... ......................  . .\",
+\".... ...................... . . \",
+\".... ......................  . .\",
+\".... ...................... . . \",
+\".... ......................  . .\",
+\".... ...................... . . \",
+\".... ......................  . .\",
+\".... ...................... . . \",
+\".... ......................  . .\",
+\".... ...................... . . \",
+\"....                         . .\",
+\"... . . . . . . . . . . . .   . \",
+\".. . . . . . . . . . . . . .   .\",
+\". . . . . . . . . . . . . . .   \",
+\" . . . . . . . . . . . . . . .  \",
+};
+")
+
+(defconst sokoban-block-xpm "\
+/* XPM */
+static char * block_xpm[] = {
+\"32 32 3 1\",
+\"  c None\",
+\". c black\",
+\"X c yellow\",
+\".............................   \",
+\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.   \",
+\".XXXXXXXXXXXXXXXXXXXXXXXXXXX..  \",
+\".XXXXXXXXXXXXXXXXXXXXXXXXXXX..  \",
+\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.X. \",
+\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.X. \",
+\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
+\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
+\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
+\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
+\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
+\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
+\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
+\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
+\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
+\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
+\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
+\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
+\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
+\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
+\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
+\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
+\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
+\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
+\".............................XX.\",
+\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
+\" .XXXXXXXXXXXXXXXXXXXXXXXXXXX.X.\",
+\" .XXXXXXXXXXXXXXXXXXXXXXXXXXX.X.\",
+\"  .XXXXXXXXXXXXXXXXXXXXXXXXXXX..\",
+\"  .XXXXXXXXXXXXXXXXXXXXXXXXXXX..\",
+\"   .XXXXXXXXXXXXXXXXXXXXXXXXXXX.\",
+\"   .............................\",
+};
+")
+
+(defconst sokoban-player-xpm "\
+/* XPM */
+static char * player_xpm[] = {
+\"32 32 3 1\",
+\"  c None\",
+\"o c white\",
+\". c black\",
+\"                                \",
+\"                                \",
+\"                                \",
+\"            oooooooo            \",
+\"            o......o            \",
+\"           o.oooooo.o           \",
+\"           o.oooooo.o           \",
+\"          o.oooooooo.o          \",
+\"          o.o..oo..o.o          \",
+\"          o.oooooooo.o          \",
+\"          oo.o....o.oo          \",
+\"         oo..oo..oo..oo         \",
+\"         o....o..o....o         \",
+\"         o.o..o..o..o.o         \",
+\"         o.o...oo...o.o         \",
+\"        o.oo........oo.o        \",
+\"        o.oo........oo.o        \",
+\"       o.ooo........ooo.o       \",
+\"       o.ooo........ooo.o       \",
+\"       o.ooo........ooo.o       \",
+\"        o.oo........oo.o        \",
+\"        o.oo........oo.o        \",
+\"        o.o..........o.o        \",
+\"         o............o         \",
+\"          o..........o          \",
+\"           o........o           \",
+\"          o.o.oooo.o.o          \",
+\"         o.....oo.....o         \",
+\"        o......oo......o        \",
+\"       o.......oo.......o       \",
+\"      o..o..o..oo.oo..o..o      \",
+\"      oooooooooooooooooooo      \",
+};
+")
+
+(defconst sokoban-floor ?\+)
+;; note - space character in level file is also allowed to indicate floor
+(defconst sokoban-target ?\.)
+(defconst sokoban-wall ?\#)
+(defconst sokoban-block ?\$)
+(defconst sokoban-player ?\@)
+(defconst sokoban-block-on-target ?\*)
+
+;; ;;;;;;;;;;;;; display options ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defvar sokoban-floor-options
+  `(((glyph
+      [xpm :data ,sokoban-floor-xpm])
+     (t ?\040))
+    ((color-x color-x)
+     (mono-x grid-x)
+     (color-tty color-tty))
+    (((glyph color-x) [0 0 0])
+     (color-tty "black"))))
+
+(defvar sokoban-target-options
+  `(((glyph
+      [xpm :data ,sokoban-target-xpm])
+     ((mono-x mono-tty emacs-tty) ?\.)
+     (t ?\040))
+    ((color-x color-x)
+     (mono-x grid-x)
+     (color-tty color-tty))
+    (((glyph color-x) [1 1 0.5])
+     (color-tty "yellow"))))
+
+(defvar sokoban-wall-options
+  `(((glyph
+      [xpm :data ,sokoban-wall-xpm])
+     (emacs-tty ?\X)
+     (t ?\040))
+    ((color-x color-x)
+     (mono-x mono-x)
+     (color-tty color-tty)
+     (mono-tty mono-tty))
+    (((glyph color-x) [0 0 1])
+     (color-tty "blue"))))
+
+(defvar sokoban-block-options
+  `(((glyph
+      [xpm :data ,sokoban-block-xpm])
+     ((mono-x mono-tty emacs-tty) ?\O)
+     (t ?\040))
+    ((color-x color-x)
+     (mono-x grid-x)
+     (color-tty color-tty))
+    (((glyph color-x) [1 0 0])
+     (color-tty "red"))))
+
+(defvar sokoban-player-options
+  `(((glyph
+      [xpm :data ,sokoban-player-xpm])
+     (t ?\*))
+    ((color-x color-x)
+     (mono-x grid-x)
+     (color-tty color-tty))
+    (((glyph color-x) [0 1 0])
+     (color-tty "green"))))
+
+;; ;;;;;;;;;;;;; variables ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defvar sokoban-level 0)
+(make-variable-buffer-local 'sokoban-level)
+(defvar sokoban-level-map nil)
+(make-variable-buffer-local 'sokoban-level-map)
+(defvar sokoban-targets 0)
+(make-variable-buffer-local 'sokoban-targets)
+(defvar sokoban-x 0)
+(make-variable-buffer-local 'sokoban-x)
+(defvar sokoban-y 0)
+(make-variable-buffer-local 'sokoban-y)
+(defvar sokoban-moves 0)
+(make-variable-buffer-local 'sokoban-moves)
+(defvar sokoban-pushes 0)
+(make-variable-buffer-local 'sokoban-pushes)
+(defvar sokoban-done 0)
+(make-variable-buffer-local 'sokoban-done)
+(defvar sokoban-mouse-x 0)
+(make-variable-buffer-local 'sokoban-mouse-x)
+(defvar sokoban-mouse-y 0)
+(make-variable-buffer-local 'sokoban-mouse-y)
+(defvar sokoban-undo-list nil)
+(make-variable-buffer-local 'sokoban-undo-list)
+
+;; ;;;;;;;;;;;;; keymaps ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defvar sokoban-mode-map
+  (let ((map (make-sparse-keymap
+             (when (featurep 'xemacs) 'sokoban-mode-map))))
+    (define-key map "n"        'sokoban-start-game)
+    (define-key map "r"        'sokoban-restart-level)
+    (define-key map "g"        'sokoban-goto-level)
+
+    (define-key map [left]     'sokoban-move-left)
+    (define-key map [right]    'sokoban-move-right)
+    (define-key map [up]       'sokoban-move-up)
+    (define-key map [down]     'sokoban-move-down)
+
+    (when (featurep 'xemacs)
+      (define-key map [button2]          'sokoban-mouse-event-start)
+      (define-key map [button2up] 'sokoban-mouse-event-end))
+
+    (define-key map [down-mouse-2] 'sokoban-mouse-event-start)
+    (define-key map [mouse-2]      'sokoban-mouse-event-end)
+    ;; On some systems (OS X) middle mouse is difficult.
+    ;; FIXME: Use follow-link?
+    (define-key map [down-mouse-1] 'sokoban-mouse-event-start)
+    (define-key map [mouse-1]      'sokoban-mouse-event-end)
+
+    (define-key map [(control ?/)]     'sokoban-undo)
+    map))
+
+;; ;;;;;;;;;;;;;;;; level file parsing functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defconst sokoban-level-regexp "^;LEVEL [0-9]+$")
+
+(defconst sokoban-comment-regexp "^;")
+
+(defun sokoban-init-level-data ()
+  (setq sokoban-level-data nil)
+  (with-current-buffer (find-file-noselect sokoban-level-file)
+    (if (fboundp 'read-only-mode)
+        (read-only-mode 1)
+      (setq buffer-read-only t))
+    (goto-char (point-min))
+    (re-search-forward sokoban-level-regexp nil t)
+    (forward-char)
+    (while (not (eobp))
+      (while (looking-at sokoban-comment-regexp)
+       (forward-line))
+      (let ((data (make-vector sokoban-height nil))
+           (fmt (format "%%-%ds" sokoban-width)))
+       (dotimes (y sokoban-height)
+         (cond ((or (eobp)
+                    (looking-at sokoban-comment-regexp))
+                (aset data y (format fmt "")))
+               (t
+                (let ((start (point))
+                       (end (line-end-position)))
+                   (aset data
+                         y
+                         (format fmt (buffer-substring start end)))
+                   (goto-char (1+ end))))))
+       (push data sokoban-level-data)))
+    (kill-buffer (current-buffer))
+    (setq sokoban-level-data (nreverse sokoban-level-data))))
+
+;; ;;;;;;;;;;;;;;;; game functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defun sokoban-display-options ()
+  (let ((options (make-vector 256 nil)))
+    (dotimes (c 256)
+      (aset options c
+           (cond ((= c sokoban-floor)
+                  sokoban-floor-options)
+                  ((= c sokoban-target)
+                  sokoban-target-options)
+                  ((= c sokoban-wall)
+                  sokoban-wall-options)
+                  ((= c sokoban-block)
+                  sokoban-block-options)
+                  ((= c sokoban-player)
+                  sokoban-player-options)
+                  (t
+                  '(nil nil nil)))))
+    options))
+
+(defun sokoban-get-level-data ()
+  (setq sokoban-level-map (nth (1- sokoban-level) sokoban-level-data)
+       sokoban-targets 0)
+  (dotimes (y sokoban-height)
+    (dotimes (x sokoban-width)
+      (let ((c (aref (aref sokoban-level-map y) x)))
+       (cond
+        ((= c sokoban-target)
+         (incf sokoban-targets))
+        ((= c sokoban-block-on-target)
+         (incf sokoban-targets)
+         (incf sokoban-done))
+        ((= c ?\040) ;; treat space characters in level file as floor
+         (aset (aref sokoban-level-map y) x sokoban-floor)))))))
+
+(defun sokoban-get-floor (x y)
+  (let ((c (aref (aref sokoban-level-map y) x)))
+    (if (or (= c sokoban-target)
+           (= c sokoban-block-on-target))
+       sokoban-target
+      sokoban-floor)))
+
+(defun sokoban-init-buffer ()
+  (gamegrid-init-buffer sokoban-buffer-width
+                       sokoban-buffer-height
+                       ?\040)
+  (dotimes (y sokoban-height)
+    (dotimes (x sokoban-width)
+      (let ((c (aref (aref sokoban-level-map y) x)))
+       (if (= c sokoban-player)
+           (setq sokoban-x x
+                 sokoban-y y))
+       (if (= c sokoban-block-on-target)
+           (setq c sokoban-block))
+       (gamegrid-set-cell x y c)))))
+
+(defun sokoban-draw-score ()
+  (let ((strings (vector (format "Moves:  %05d" sokoban-moves)
+                        (format "Pushes: %05d" sokoban-pushes)
+                        (format "Done:   %d/%d"
+                                sokoban-done
+                                sokoban-targets))))
+    (dotimes (y 2)
+      (let* ((string (aref strings y))
+            (len (length string)))
+       (dotimes (x len)
+         (gamegrid-set-cell (+ sokoban-score-x x)
+                            (+ sokoban-score-y y)
+                            (aref string x))))))
+  (setq mode-line-format
+       (format "Sokoban:   Level: %3d   Moves: %05d   Pushes: %05d   Done: %d/%d"
+               sokoban-level sokoban-moves sokoban-pushes
+               sokoban-done sokoban-targets))
+  (force-mode-line-update))
+
+(defun sokoban-add-move (dx dy)
+  (push (list 'move dx dy) sokoban-undo-list)
+  (incf sokoban-moves)
+  (sokoban-draw-score))
+
+(defun sokoban-add-push (dx dy)
+  (push (list 'push dx dy) sokoban-undo-list)
+  (incf sokoban-moves)
+  (incf sokoban-pushes)
+  (sokoban-draw-score))
+
+(defun sokoban-undo ()
+  "Undo previous Sokoban change."
+  (interactive)
+  ;; FIXME: Use the normal undo (via `apply' undo entries).
+  (if (null sokoban-undo-list)
+      (message "Nothing to undo")
+    (let* ((entry (pop sokoban-undo-list))
+          (type (car entry))
+          (dx (nth 1 entry))
+          (dy (nth 2 entry)))
+      (cond ((eq type 'push)
+            (let* ((x (+ sokoban-x dx))
+                   (y (+ sokoban-y dy))
+                   (c (sokoban-get-floor x y)))
+              (gamegrid-set-cell x y c)
+              (if (eq c sokoban-target)
+                  (decf sokoban-done))
+              (gamegrid-set-cell sokoban-x sokoban-y sokoban-block)
+              (setq c (sokoban-get-floor sokoban-x sokoban-y))
+              (if (eq c sokoban-target)
+                  (incf sokoban-done)))
+            (setq sokoban-x (- sokoban-x dx))
+            (setq sokoban-y (- sokoban-y dy))
+            (gamegrid-set-cell sokoban-x sokoban-y sokoban-player)
+            (decf sokoban-pushes)
+            (decf sokoban-moves))
+           ((eq type 'move)
+            (let ((c (sokoban-get-floor sokoban-x sokoban-y)))
+              (gamegrid-set-cell sokoban-x sokoban-y c))
+            (setq sokoban-x (- sokoban-x dx))
+            (setq sokoban-y (- sokoban-y dy))
+            (gamegrid-set-cell sokoban-x sokoban-y sokoban-player)
+            (decf sokoban-moves))
+           (t
+            (message "Invalid entry in sokoban-undo-list")))
+      (sokoban-draw-score))))
+
+(defun sokoban-move (dx dy)
+  (let* ((x (+ sokoban-x dx))
+        (y (+ sokoban-y dy))
+        (c (gamegrid-get-cell x y)))
+    (cond ((or (eq c sokoban-floor)
+              (eq c sokoban-target))
+          (gamegrid-set-cell sokoban-x
+                             sokoban-y
+                             (sokoban-get-floor sokoban-x
+                                                sokoban-y))
+          (setq sokoban-x x
+                sokoban-y y)
+          (gamegrid-set-cell sokoban-x
+                             sokoban-y
+                             sokoban-player)
+          (sokoban-add-move dx dy))
+         ((eq c sokoban-block)
+          (let* ((xx (+ x dx))
+                 (yy (+ y dy))
+                 (cc (gamegrid-get-cell xx yy)))
+            (cond ((or (eq cc sokoban-floor)
+                       (eq cc sokoban-target))
+                   (if (eq (sokoban-get-floor x y) sokoban-target)
+                       (decf sokoban-done))
+                   (gamegrid-set-cell xx yy sokoban-block)
+                   (gamegrid-set-cell x y sokoban-player)
+                   (gamegrid-set-cell sokoban-x
+                                      sokoban-y
+                                      (sokoban-get-floor sokoban-x
+                                                         sokoban-y))
+                   (setq sokoban-x x
+                         sokoban-y y)
+                   (if (eq (sokoban-get-floor xx yy) sokoban-target)
+                       (incf sokoban-done))
+                   (sokoban-add-push dx dy)
+                   (cond ((= sokoban-done sokoban-targets)
+                          (sit-for 3)
+                          (sokoban-next-level))))))))))
+
+(defun sokoban-event-x (event)
+  (let ((x (gamegrid-event-x event)))
+    (if (featurep 'xemacs)
+        x
+      ;; 32.0 is the pixel width of the xpm image
+      (floor x (/ 32.0 (frame-char-width))))))
+
+(defun sokoban-event-y (event)
+  (let ((y (gamegrid-event-y event)))
+    (if (featurep 'xemacs)
+        y
+      (floor y (/ 32.0 (frame-char-height))))))
+
+(defun sokoban-mouse-event-start (event)
+  "Record the beginning of a mouse click."
+  (interactive "e")
+  (setq sokoban-mouse-x (sokoban-event-x event))
+  (setq sokoban-mouse-y (sokoban-event-y event)))
+
+(defun sokoban-mouse-event-end (event)
+  "Move according to the clicked position."
+  (interactive "e")
+  (let* ((x (sokoban-event-x event))
+        (y (sokoban-event-y event))
+        (dx (- x sokoban-x))
+        (dy (- y sokoban-y)))
+    (cond
+     ;; Ensure that press and release are in the same square
+     ;; (which allows you to abort a move)
+     ((not (and (eq sokoban-mouse-x x) (eq sokoban-mouse-y y)))
+      nil)
+     ;; Check that the move isn't diagonal
+     ((not (or (eq dx 0) (eq dy 0)))
+      nil)
+     ((< dx 0) ;; Left
+      (while (< dx 0)
+       (sokoban-move -1 0)
+       (setq dx (1+ dx))))
+     ((> dx 0) ;; Right
+      (while (> dx 0)
+       (sokoban-move 1 0)
+       (setq dx (1- dx))))
+     ((> dy 0) ;; Up
+      (while (> dy 0)
+       (sokoban-move 0 1)
+       (setq dy (1- dy))))
+     ((< dy 0) ;; Down
+      (while (< dy 0)
+       (sokoban-move 0 -1)
+       (setq dy (1+ dy)))))))
+
+(defun sokoban-move-left ()
+  "Move one square left."
+  (interactive)
+  (sokoban-move -1 0))
+
+(defun sokoban-move-right ()
+  "Move one square right."
+  (interactive)
+  (sokoban-move 1 0))
+
+(defun sokoban-move-up ()
+  "Move one square up."
+  (interactive)
+  (sokoban-move 0 -1))
+
+(defun sokoban-move-down ()
+  "Move one square down."
+  (interactive)
+  (sokoban-move 0 1))
+
+(defun sokoban-restart-level ()
+  "Restart the current level."
+  (interactive)
+  (setq sokoban-moves 0
+       sokoban-pushes 0
+       sokoban-done 0
+       sokoban-undo-list nil)
+  (sokoban-get-level-data)
+  (sokoban-init-buffer)
+  (sokoban-draw-score))
+
+(defun sokoban-next-level ()
+  (incf sokoban-level)
+  (sokoban-restart-level))
+
+(defun sokoban-goto-level (level)
+  "Jump to a specified LEVEL."
+  (interactive "nLevel: ")
+  (when (or (< level 1)
+            (> level (length sokoban-level-data)))
+    (signal 'args-out-of-range
+            (list "No such level number"
+                  level 1 (> level (length sokoban-level-data)))))
+  (setq sokoban-level level)
+  (sokoban-restart-level))
+
+(defun sokoban-start-game ()
+  "Start a new game of Sokoban."
+  (interactive)
+  (setq sokoban-level 0)
+  (sokoban-next-level))
+
+(put 'sokoban-mode 'mode-class 'special)
+
+(unless (featurep 'xemacs)
+  (easy-menu-define sokoban-popup-menu nil "Popup menu for Sokoban mode."
+    '("Sokoban Commands"
+      ["Restart this level" sokoban-restart-level]
+      ["Start new game" sokoban-start-game]
+      ["Go to specific level" sokoban-goto-level]))
+  (define-key sokoban-mode-map [down-mouse-3] sokoban-popup-menu))
+
+(define-derived-mode sokoban-mode special-mode "Sokoban"
+  "A mode for playing Sokoban.
+
+sokoban-mode keybindings:
+   \\{sokoban-mode-map}"
+
+  (when (featurep 'xemacs)
+    (setq mode-popup-menu
+          '("Sokoban Commands"
+            ["Restart this level" sokoban-restart-level]
+            ["Start new game" sokoban-start-game]
+            ["Go to specific level" sokoban-goto-level])))
+
+  (set (make-local-variable 'gamegrid-use-glyphs) sokoban-use-glyphs)
+  (set (make-local-variable 'gamegrid-use-color) sokoban-use-color)
+  (set (make-local-variable 'gamegrid-font) sokoban-font)
+
+  (gamegrid-init (sokoban-display-options))
+
+  (if (null sokoban-level-data)
+      (sokoban-init-level-data)))
+
+;;;###autoload
+(defun sokoban ()
+  "Sokoban.
+
+Push the blocks onto the target squares.
+
+sokoban-mode keybindings:
+   \\<sokoban-mode-map>
+\\[sokoban-start-game] Starts a new game of Sokoban
+\\[sokoban-restart-level]      Restarts the current level
+\\[sokoban-goto-level] Jumps to a specified level
+\\[sokoban-move-left]  Move one square to the left
+\\[sokoban-move-right] Move one square to the right
+\\[sokoban-move-up]    Move one square up
+\\[sokoban-move-down]  Move one square down"
+  (interactive)
+
+  (switch-to-buffer sokoban-buffer-name)
+  (gamegrid-kill-timer)
+  (sokoban-mode)
+  (sokoban-start-game))
+
+;;;###autoload
+(unless (featurep 'xemacs)
+  (define-key-after                    ; install a menu entry
+    (lookup-key global-map [menu-bar tools games])
+    [sokoban]
+    '(menu-item "Sokoban" sokoban)
+    'snake))
+
+(provide 'sokoban)
+
+;;; sokoban.el ends here
+
diff --git a/packages/sokoban/sokoban.levels b/packages/sokoban/sokoban.levels
new file mode 100644 (file)
index 0000000..383146a
--- /dev/null
@@ -0,0 +1,1290 @@
+;WALLS
+            12     f     f   ff      0   standard floor
+.           13     f     f   ff      4   target field
+#            0     0     0    0      0   walls
+
+;OBJECTS
+@            0       f       0    101   201    1     0 player
+$            1       f       0    100     0    2  1000 heavy box
+
+;MAXLEVEL 88
+;ATOP *$.
+;LEVEL 1
+    #####
+    #   #
+    #$  #
+  ###  $##
+  #  $ $ #
+### # ## #   ######
+#   # ## #####  ..#
+# $  $          ..#
+##### ### #@##  ..#
+    #     #########
+    #######
+;LEVEL 2
+############
+#..  #     ###
+#..  # $  $  #
+#..  #$####  #
+#..    @ ##  #
+#..  # #  $ ##
+###### ##$ $ #
+  # $  $ $ $ #
+  #    #     #
+  ############
+;LEVEL 3
+        ########
+        #     @#
+        # $#$ ##
+        # $  $#
+        ##$ $ #
+######### $ # ###
+#....  ## $  $  #
+##...    $  $   #
+#....  ##########
+########
+;LEVEL 4
+           ########
+           #  ....#
+############  ....#
+#    #  $ $   ....#
+# $$$#$  $ #  ....#
+#  $     $ #  ....#
+# $$ #$ $ $########
+#  $ #     #
+## #########
+#    #    ##
+#     $   ##
+#  $$#$$  @#
+#    #    ##
+###########
+;LEVEL 5
+        #####
+        #   #####
+        # #$##  #
+        #     $ #
+######### ###   #
+#....  ## $  $###
+#....    $ $$ ##
+#....  ##$  $ @#
+#########  $  ##
+        # $ $  #
+        ### ## #
+          #    #
+          ######
+;LEVEL 6
+######  ###
+#..  # ##@##
+#..  ###   #
+#..     $$ #
+#..  # # $ #
+#..### # $ #
+#### $ #$  #
+   #  $# $ #
+   # $  $  #
+   #  ##   #
+   #########
+;LEVEL 7
+       #####
+ #######   ##
+## # @## $$ #
+#    $      #
+#  $  ###   #
+### #####$###
+# $  ### ..#
+# $ $ $ ...#
+#    ###...#
+# $$ # #...#
+#  ### #####
+####
+;LEVEL 8
+  ####
+  #  ###########
+  #    $   $ $ #
+  # $# $ #  $  #
+  #  $ $  #    #
+### $# #  #### #
+#@#$ $ $  ##   #
+#    $ #$#   # #
+#   $    $ $ $ #
+#####  #########
+  #      #
+  #      #
+  #......#
+  #......#
+  #......#
+  ########
+;LEVEL 9
+          #######
+          #  ...#
+      #####  ...#
+      #      . .#
+      #  ##  ...#
+      ## ##  ...#
+     ### ########
+     # $$$ ##
+ #####  $ $ #####
+##   #$ $   #   #
+#@ $  $    $  $ #
+###### $$ $ #####
+     #      #
+     ########
+;LEVEL 10
+ ###  #############
+##@####       #   #
+# $$   $$  $ $ ...#
+#  $$$#    $  #...#
+# $   # $$ $$ #...#
+###   #  $    #...#
+#     # $ $ $ #...#
+#    ###### ###...#
+## #  #  $ $  #...#
+#  ## # $$ $ $##..#
+# ..# #  $      #.#
+# ..# # $$$ $$$ #.#
+##### #       # #.#
+    # ######### #.#
+    #           #.#
+    ###############
+;LEVEL 11
+          ####
+     #### #  #
+   ### @###$ #
+  ##      $  #
+ ##  $ $$## ##
+ #  #$##     #
+ # # $ $$ # ###
+ #   $ #  # $ #####
+####    #  $$ #   #
+#### ## $         #
+#.    ###  ########
+#.. ..# ####
+#...#.#
+#.....#
+#######
+;LEVEL 12
+################
+#              #
+# # ######     #
+# #  $ $ $ $#  #
+# #   $@$   ## ##
+# #  $ $ $###...#
+# #   $ $  ##...#
+# ###$$$ $ ##...#
+#     # ## ##...#
+#####   ## ##...#
+    #####     ###
+        #     #
+        #######
+;LEVEL 13
+   #########
+  ##   ##  #####
+###     #  #    ###
+#  $ #$ #  #  ... #
+# # $#@$## # #.#. #
+#  # #$  #    . . #
+# $    $ # # #.#. #
+#   ##  ##$ $ . . #
+# $ #   #  #$#.#. #
+## $  $   $  $... #
+ #$ ######    ##  #
+ #  #    ##########
+ ####
+;LEVEL 14
+       #######
+ #######     #
+ #     # $@$ #
+ #$$ #   #########
+ # ###......##   #
+ #   $......## # #
+ # ###......     #
+##   #### ### #$##
+#  #$   #  $  # #
+#  $ $$$  # $## #
+#   $ $ ###$$ # #
+#####     $   # #
+    ### ###   # #
+      #     #   #
+      ########  #
+             ####
+;LEVEL 15
+   ########
+   #   #  #
+   #  $   #
+ ### #$   ####
+ #  $  ##$   #
+ #  # @ $ # $#
+ #  #      $ ####
+ ## ####$##     #
+ # $#.....# #   #
+ #  $..**. $# ###
+##  #.....#   #
+#   ### #######
+# $$  #  #
+#  #     #
+######   #
+     #####
+;LEVEL 16
+#####
+#   ##
+#    #  ####
+# $  ####  #
+#  $$ $   $#
+###@ #$    ##
+ #  ##  $ $ ##
+ # $  ## ## .#
+ #  #$##$  #.#
+ ###   $..##.#
+  #    #.*...#
+  # $$ #.....#
+  #  #########
+  #  #
+  ####
+;LEVEL 17
+   ##########
+   #..  #   #
+   #..      #
+   #..  #  ####
+  #######  #  ##
+  #            #
+  #  #  ##  #  #
+#### ##  #### ##
+#  $  ##### #  #
+# # $  $  # $  #
+# @$  $   #   ##
+#### ## #######
+   #    #
+   ######
+;LEVEL 18
+     ###########
+     #  .  #   #
+     # #.    @ #
+ ##### ##..# ####
+##  # ..###     ###
+# $ #...   $ #  $ #
+#    .. ##  ## ## #
+####$##$# $ #   # #
+  ## #    #$ $$ # #
+  #  $ # #  # $## #
+  #               #
+  #  ###########  #
+  ####         ####
+;LEVEL 19
+  ######
+  #   @####
+##### $   #
+#   ##    ####
+# $ #  ##    #
+# $ #  ##### #
+## $  $    # #
+## $ $ ### # #
+## #  $  # # #
+## # #$#   # #
+## ###   # # ######
+#  $  #### # #....#
+#    $    $   ..#.#
+####$  $# $   ....#
+#       #  ## ....#
+###################
+;LEVEL 20
+    ##########
+#####        ####
+#     #   $  #@ #
+# #######$####  ###
+# #    ## #  #$ ..#
+# # $     #  #  #.#
+# # $  #     #$ ..#
+# #  ### ##     #.#
+# ###  #  #  #$ ..#
+# #    #  ####  #.#
+# #$   $  $  #$ ..#
+#    $ # $ $ #  #.#
+#### $###    #$ ..#
+   #    $$ ###....#
+   #      ## ######
+   ########
+;LEVEL 21
+#########
+#       #
+#       ####
+## #### #  #
+## #@##    #
+# $$$ $  $$#
+#  # ## $  #
+#  # ##  $ ####
+####  $$$ $#  #
+ #   ##   ....#
+ # #   # #.. .#
+ #   # # ##...#
+ ##### $  #...#
+     ##   #####
+      #####
+;LEVEL 22
+######     ####
+#    #######  #####
+#   $#  #  $  #   #
+#  $  $  $ # $ $  #
+##$ $   # @# $    #
+#  $ ########### ##
+# #   #.......# $#
+# ##  # ......#  #
+# #   $........$ #
+# # $ #.... ..#  #
+#  $ $####$#### $#
+# $   ### $   $  ##
+# $     $ $  $    #
+## ###### $ ##### #
+#         #       #
+###################
+;LEVEL 23
+    #######
+    #  #  ####
+##### $#$ #  ##
+#.. #  #  #   #
+#.. # $#$ #  $####
+#.  #     #$  #  #
+#..   $#  # $    #
+#..@#  #$ #$  #  #
+#.. # $#     $#  #
+#.. #  #$$#$  #  ##
+#.. # $#  #  $#$  #
+#.. #  #  #   #   #
+##. ####  #####   #
+ ####  ####   #####
+;LEVEL 24
+###############
+#..........  .####
+#..........$$.#  #
+###########$ #   ##
+#      $  $     $ #
+## ####   #  $ #  #
+#      #   ##  # ##
+#  $#  # ##  ### ##
+# $ #$###    ### ##
+###  $ #  #  ### ##
+###    $ ## #  # ##
+ # $  #  $  $ $   #
+ #  $  $#$$$  #   #
+ #  #  $      #####
+ # @##  #  #  #
+ ##############
+;LEVEL 25
+####
+#  ##############
+#  #   ..#......#
+#  # # ##### ...#
+##$#    ........#
+#   ##$######  ####
+# $ #     ######@ #
+##$ # $   ######  #
+#  $ #$$$##       #
+#      #    #$#$###
+# #### #$$$$$    #
+# #    $     #   #
+# #   ##        ###
+# ######$###### $ #
+#        #    #   #
+##########    #####
+;LEVEL 26
+ #######
+ #  #  #####
+##  #  #...###
+#  $#  #...  #
+# $ #$$ ...  #
+#  $#  #... .#
+#   # $########
+##$       $ $ #
+##  #  $$ #   #
+ ######  ##$$@#
+      #      ##
+      ########
+;LEVEL 27
+ #################
+ #...   #    #   ##
+##.....  $## # #$ #
+#......#  $  #    #
+#......#  #  # #  #
+######### $  $ $  #
+  #     #$##$ ##$##
+ ##   $    # $    #
+ #  ## ### #  ##$ #
+ # $ $$     $  $  #
+ # $    $##$ ######
+ #######  @ ##
+       ######
+;LEVEL 28
+         #####
+     #####   #
+    ## $  $  ####
+##### $  $ $ ##.#
+#       $$  ##..#
+#  ###### ###.. #
+## #  #    #... #
+# $   #    #... #
+#@ #$ ## ####...#
+####  $ $$  ##..#
+   ##  $ $  $...#
+    # $$  $ #  .#
+    #   $ $  ####
+    ######   #
+         #####
+;LEVEL 29
+#####
+#   ##
+# $  #########
+## # #       ######
+## #   $#$#@  #   #
+#  #      $ #   $ #
+#  ### ######### ##
+#  ## ..*..... # ##
+## ## *.*..*.* # ##
+# $########## ##$ #
+#  $   $  $    $  #
+#  #   #   #   #  #
+###################
+;LEVEL 30
+       ###########
+       #   #     #
+#####  #     $ $ #
+#   ##### $## # ##
+# $ ##   # ## $  #
+# $  @$$ # ##$$$ #
+## ###   # ##    #
+## #   ### #####$#
+## #     $  #....#
+#  ### ## $ #....##
+# $   $ #   #..$. #
+#  ## $ #  ##.... #
+#####   ######...##
+    #####    #####
+;LEVEL 31
+  ####
+  #  #########
+ ##  ##  #   #
+ #  $# $@$   ####
+ #$  $  # $ $#  ##
+##  $## #$ $     #
+#  #  # #   $$$  #
+# $    $  $## ####
+# $ $ #$#  #  #
+##  ###  ###$ #
+ #  #....     #
+ ####......####
+   #....####
+   #...##
+   #...#
+   #####
+;LEVEL 32
+      ####
+  #####  #
+ ##     $#
+## $  ## ###
+#@$ $ # $  #
+#### ##   $#
+ #....#$ $ #
+ #....#   $#
+ #....  $$ ##
+ #... # $   #
+ ######$ $  #
+      #   ###
+      #$ ###
+      #  #
+      ####
+;LEVEL 33
+############
+##     ##  #
+##   $   $ #
+#### ## $$ #
+#   $ #    #
+# $$$ # ####
+#   # # $ ##
+#  #  #  $ #
+# $# $#    #
+#   ..# ####
+####.. $ #@#
+#.....# $# #
+##....#  $ #
+###..##    #
+############
+;LEVEL 34
+ #########
+ #....   ##
+ #.#.#  $ ##
+##....# # @##
+# ....#  #  ##
+#     #$ ##$ #
+## ###  $    #
+ #$  $ $ $#  #
+ # #  $ $ ## #
+ #  ###  ##  #
+ #    ## ## ##
+ #  $ #  $  #
+ ###$ $   ###
+   #  #####
+   ####
+;LEVEL 35
+############ ######
+#   #    # ###....#
+#   $$#   @  .....#
+#   # ###   # ....#
+## ## ###  #  ....#
+ # $ $     # # ####
+ #  $ $##  #      #
+#### #  #### # ## #
+#  # #$   ## #    #
+# $  $  # ## #   ##
+# # $ $    # #   #
+#  $ ## ## # #####
+# $$     $$  #
+## ## ### $  #
+ #    # #    #
+ ###### ######
+;LEVEL 36
+            #####
+#####  ######   #
+#   ####  $ $ $ #
+# $   ## ## ##  ##
+#   $ $     $  $ #
+### $  ## ##     ##
+  # ##### #####$$ #
+ ##$##### @##     #
+ # $  ###$### $  ##
+ # $  #   ###  ###
+ # $$ $ #   $$ #
+ #     #   ##  #
+ #######.. .###
+    #.........#
+    #.........#
+    ###########
+;LEVEL 37
+###########
+#......   #########
+#......   #  ##   #
+#..### $    $     #
+#... $ $ #   ##   #
+#...#$#####    #  #
+###    #   #$  #$ #
+  #  $$ $ $  $##  #
+  #  $   #$#$ ##$ #
+  ### ## #    ##  #
+   #  $ $ ## ######
+   #    $  $  #
+   ##   # #   #
+    #####@#####
+        ###
+;LEVEL 38
+      ####
+####### @#
+#     $  #
+#   $## $#
+##$#...# #
+ # $...  #
+ # #. .# ##
+ #   # #$ #
+ #$  $    #
+ #  #######
+ ####
+;LEVEL 39
+             ######
+ #############....#
+##   ##     ##....#
+#  $$##  $ @##....#
+#      $$ $#  ....#
+#  $ ## $$ # # ...#
+#  $ ## $  #  ....#
+## ##### ### ##.###
+##   $  $ ##   .  #
+# $###  # ##### ###
+#   $   #       #
+#  $ #$ $ $###  #
+# $$$# $   # ####
+#    #  $$ #
+######   ###
+     #####
+;LEVEL 40
+    ############
+    #          ##
+    #  # #$$ $  #
+    #$ #$#  ## @#
+   ## ## # $ # ##
+   #   $ #$  # #
+   #   # $   # #
+   ## $ $   ## #
+   #  #  ##  $ #
+   #    ## $$# #
+######$$   #   #
+#....#  ########
+#.#... ##
+#....   #
+#....   #
+#########
+;LEVEL 41
+           #####
+          ##   ##
+         ##     #
+        ##  $$  #
+       ## $$  $ #
+       # $    $ #
+####   #   $$ #####
+#  ######## ##    #
+#.            $$$@#
+#.# ####### ##   ##
+#.# #######. #$ $##
+#........... #    #
+##############  $ #
+             ##  ##
+              ####
+;LEVEL 42
+     ########
+  ####      ######
+  #    ## $ $   @#
+  # ## ##$#$ $ $##
+### ......#  $$ ##
+#   ......#  #   #
+# # ......#$  $  #
+# #$...... $$# $ #
+#   ### ###$  $ ##
+###  $  $  $  $ #
+  #  $  $  $  $ #
+  ######   ######
+       #####
+;LEVEL 43
+        #######
+    #####  #  ####
+    #   #   $    #
+ #### #$$ ## ##  #
+##      # #  ## ###
+#  ### $#$  $  $  #
+#...    # ##  #   #
+#...#    @ # ### ##
+#...#  ###  $  $  #
+######## ##   #   #
+          #########
+;LEVEL 44
+ #####
+ #   #
+ # # #######
+ #      $@######
+ # $ ##$ ###   #
+ # #### $    $ #
+ # ##### #  #$ ####
+##  #### ##$      #
+#  $#  $  # ## ## #
+#         # #...# #
+######  ###  ...  #
+     #### # #...# #
+          # ### # #
+          #       #
+          #########
+;LEVEL 45
+##### ####
+#...# #  ####
+#...###  $  #
+#....## $  $###
+##....##   $  #
+###... ## $ $ #
+# ##    #  $  #
+#  ## # ### ####
+# $ # #$  $    #
+#  $ @ $    $  #
+#   # $ $$ $ ###
+#  ######  ###
+# ##    ####
+###
+;LEVEL 46
+##########
+#        ####
+# ###### #  ##
+# # $ $ $  $ #
+#       #$   #
+###$  $$#  ###
+  #  ## # $##
+  ##$#   $ @#
+   #  $ $ ###
+   # #   $  #
+   # ##   # #
+  ##  ##### #
+  #         #
+  #.......###
+  #.......#
+  #########
+;LEVEL 47
+         ####
+ #########  ##
+##  $      $ #####
+#   ## ##   ##...#
+# #$$ $ $$#$##...#
+# #   @   #   ...#
+#  $# ###$$   ...#
+# $  $$  $ ##....#
+###$       #######
+  #  #######
+  ####
+;LEVEL 48
+  #########
+  #*.*#*.*#
+  #.*.*.*.#
+  #*.*.*.*#
+  #.*.*.*.#
+  #*.*.*.*#
+  ###   ###
+    #   #
+###### ######
+#           #
+# $ $ $ $ $ #
+## $ $ $ $ ##
+ #$ $ $ $ $#
+ #   $@$   #
+ #  #####  #
+ ####   ####
+;LEVEL 49
+       ####
+       #  ##
+       #   ##
+       # $$ ##
+     ###$  $ ##
+  ####    $   #
+###  # #####  #
+#    # #....$ #
+# #   $ ....# #
+#  $ # #.*..# #
+###  #### ### #
+  #### @$  ##$##
+     ### $     #
+       #  ##   #
+       #########
+;LEVEL 50
+      ############
+     ##..    #   #
+    ##..* $    $ #
+   ##..*.# # # $##
+   #..*.# # # $  #
+####...#  #    # #
+#  ## #          #
+# @$ $ ###  #   ##
+# $   $   # #   #
+###$$   # # # # #
+  #   $   # # #####
+  # $# #####      #
+  #$   #   #    # #
+  #  ###   ##     #
+  #  #      #    ##
+  ####      ######
+;LEVEL 51
+#########
+#       #
+#  $   $#
+####    #
+   # $  ##
+####   $ #
+#.. $ ## ####
+#..  $##    #
+#..    $    #
+#.###$### #@#
+#.# #     ###
+### #######
+;LEVEL 52
+####################
+#  ##########     @#
+# $#    #     ######
+#      ####   #  ###
+#####         #  ###
+#   $         #  ###
+#  $####  #   #    #
+# # #  #..#$###  # #
+# # #$ #..#  $  $$ #
+#      #..#  #   # #
+#   #  #..#  #   # #
+####################
+;LEVEL 53
+####################
+#                ###
+# $#   $ ##  $    ##
+#    $###    # $$ ##
+#.###     $ $ ##  ##
+#...#  #  #    #$  #
+#..##$$#### $  #   #
+#...#      $ ##  ###
+#...$  ###  #    # #
+##..  $#  ##   ##@ #
+###.#              #
+####################
+;LEVEL 54
+####################
+#   #    #   #   #@#
+# $      $   $   # #
+## ###..## ###     #
+#   #....#$#  $### #
+# $ #....#  $  $ $ #
+#   #....# # # $ $ #
+#   ##..##   #$#   #
+##$##    ##  #  #$##
+#   $  $     #  #  #
+#   #    #   #     #
+####################
+;LEVEL 55
+####################
+#    @##      #   ##
+#    ##    $    $ ##
+#  ###....# # #  ###
+#   #....# # # $   #
+### #...#  #       #
+##  ##.#     $   $ #
+##  $ $ ###  # # ###
+## $       # # $   #
+#### $  $# # # # $ #
+####         # #  ##
+####################
+;LEVEL 56
+####################
+#  #  ##    #   @###
+##    $    # $###  #
+##$# $ ##$# $ $    #
+#   $#    $      ###
+# ##   $ ###  #....#
+# # $# # # # #....##
+#    $ $ #  #....###
+##$ ###  $ #....####
+#  # $        ######
+#      # #    ######
+####################
+;LEVEL 57
+####################
+#@     ###   #  #  #
+# # #  #  $  $     #
+#####     # $ $#$# #
+#.#..#    ##$ $    #
+#.....    $   #   ##
+#.....    ###$##$###
+#.#..#    $    #   #
+#####     #  #$  $ #
+#####  #  $    $ $ #
+#####  #  #  #  #  #
+####################
+;LEVEL 58
+####################
+##...   ## #    #  #
+#....         $ ## #
+#....# # #$###$    #
+#...#    #       # #
+##.#  #$ #     $## #
+#  #  # $ $ ###  $ #
+#     $  $ #  # ## #
+## # ## #$$# $#  # #
+#  #   $ $ #      ##
+#    #     #  #   @#
+####################
+;LEVEL 59
+####################
+#   #  #@# ##  #####
+# # #  $    $  #####
+# #    ###### $  ###
+#   #  #....#  $$  #
+##$##$##....#      #
+#      #....##$##$##
+#  $$  #....#      #
+# $  $  #  #  ###  #
+#####  $   $    $  #
+##### #    #  #   ##
+####################
+;LEVEL 60
+####################
+# #     #          #
+#       $  ## ### ##
+#####  ##   $  $   #
+##..##  # # $ # #  #
+#....  $     ##$# ##
+#....  $#####   #$##
+##..# #  #   #  $  #
+###.# #  $   $  # @#
+##  $  $ #   #  ####
+##       ###########
+####################
+;LEVEL 61
+####################
+#     ###..###     #
+# $$  ###..###  $@ #
+#  # ##......#  $  #
+#     #......#  $  #
+####  ###..######$ #
+#   $$$ #..#    #  #
+# $#   $  $  $$ #$ #
+#  #  ## $  ##  #  #
+# $    $ ## $    $ #
+#  #  ##    ##  #  #
+####################
+;LEVEL 62
+####################
+#    #  # #  #  #  #
+# @# # ## $   $   ##
+#### #    #  # $   #
+#    # ## #$ ## ## #
+#      $   $   $   #
+#..###$$## $##$ ## #
+#..#.#  # $   $ #  #
+#....# $$   ##$ ####
+#....#  #####      #
+#...###        ##  #
+####################
+;LEVEL 63
+####################
+#....#       #  #  #
+#....# # $  $      #
+#.... ##  $# # $#$ #
+#...#   $   $#  $  #
+#..####  # $   $$  #
+#      #### #### ###
+#        #   #     #
+# ##   #   $ # $ $ #
+# ##    $ ## $  $  #
+#     @#     #   # #
+####################
+;LEVEL 64
+####################
+#....###           #
+#....##### #  #$# ##
+#....###   #$  $   #
+#....###    $  #$$##
+##  #### $#  #$ $  #
+##  ####  $  $  #  #
+#@  ####$###$## $  #
+##        #  #  $  #
+##   ###  #  $  ####
+########  #  #     #
+####################
+;LEVEL 65
+####################
+#     #     @#...###
+#     #      ##...##
+# # # ##$## ## ....#
+#   $ #   $$$  ....#
+###$### $$  ### ##.#
+#     $  #    # ####
+#  $  #  ###  # #  #
+## #$##    $  $$   #
+#   $ ##   #  # #  #
+#     #    #  #    #
+####################
+;LEVEL 66
+####################
+#     #  #...#@    #
+# #       ....#    #
+#  $  #   #....#   #
+# ##$#### ##....#  #
+# $   $  #  #...#  #
+# $$ #   #   # $$  #
+###  $$$#   $$  $  #
+# $  #  #    # $#  #
+#   $#  #       $  #
+#  #    #    #  #  #
+####################
+;LEVEL 67
+####################
+#####@###.##...##  #
+#####$  ..#...#    #
+####    ......#  $ #
+###  $ #.....## # ##
+##  $$# #####  $ $ #
+## $# $    ##  $$  #
+##  #  #    # $  $ #
+##   $$ ### #$##   #
+## $#      $ $  $ ##
+###    #    #    ###
+####################
+;LEVEL 68
+####################
+#@     #   #       #
+## ### ##  #### # ##
+#    # #  $$       #
+#  # # # $ # $ ## ##
+#     $ #  #$$ #   #
+#  ###  #      ## ##
+#..#.# $ #  $ #    #
+#..#.#  $ # ## $$  #
+#....##   $$  $  # #
+#.....##        #  #
+####################
+;LEVEL 69
+####################
+#  #      #   #   ##
+# $# $ $ ##...$  $ #
+#  $  # ##....# $  #
+# ## $ ##....#   $ #
+# $    #....## $   #
+# $##  #...#       #
+#   $$$##$##  ### ##
+# # #  #   #  #    #
+# $ #  $  ##       #
+#    #    #@       #
+####################
+;LEVEL 70
+####################
+#  #  # #    #  #  #
+#   $      $ $     #
+## #  #$###$##  ## #
+#   $     $  #  $  #
+# ###$##$#   # $   #
+# #   $ $  ###### $#
+# $  $$ $  #@#.#...#
+# #     #  # #.#...#
+# ########## #.....#
+#            #.....#
+####################
+;LEVEL 71
+####################
+#  #     #  ##    ##
+# $#   $ #     ##  #
+# $  $  #..#     $ #
+# $ $  #....#   # ##
+# $#  #......### $ #
+#   #  #....#  #$  #
+# $  ####..#   #   #
+## $   ## # # $  $##
+### $    $#@$ $#   #
+####   #       #   #
+####################
+;LEVEL 72
+####################
+#      ....#    ####
+#      ....        #
+# # ##########     #
+# #$   #      ###..#
+#  $   #$$###   #..#
+# $ ### $   $   #..#
+# $ #   $ $ #  ##..#
+#  #  $$ # $ ##   ##
+#@## $#  $  $     ##
+##       ##   #  ###
+####################
+;LEVEL 73
+####################
+#        #   #@ #  #
+# $$  #$$# # #  ## #
+#  # $ $ #$$ #     #
+## #  #  # # #  #  #
+#   ##       #     #
+#   # $ #   #   #  #
+# $ #$ #   #  $ #..#
+##$ #  ####    #...#
+#  $          #....#
+#   #  #     #.....#
+####################
+;LEVEL 74
+####################
+#     #   #####    #
+## $  #   ####  $  #
+#### $$   #..#  #  #
+#  $  $  ##..#### ##
+# $   ###....   $$ #
+#  #$#   ....# # $ #
+# #  # $ ..###$#   #
+# #   $ #..#   ##  #
+#   $#  ####   # $##
+# #  #    @#      ##
+####################
+;LEVEL 75
+####################
+#   #   #    #   #@#
+#   $  $     # $ # #
+##$# $### #    $$# #
+#  #  #.###  #$ $  #
+#  #$#....#  # ### #
+# $  #.....##    # #
+##$  #.#....#$$ $  #
+#  ######..## #  # #
+#  $         $ ### #
+#   #   #        # #
+####################
+;LEVEL 76
+####################
+# # # #   #@##   # #
+#             $    #
+#  ##$# ##### $ # ##
+##    ##.....#  #  #
+##$##$#.....###$#$ #
+#   # ##.....#  # ##
+#  $    ##..##  #  #
+# $ #   $   $  $$$ #
+## $  $# #  #  $   #
+#   ##   #  #      #
+####################
+;LEVEL 77
+######  #####
+#    #  #   #
+# $  #### $ #
+# $      $  #
+#  ###@###$ #
+########## ###
+#..   ##     #
+#..   ##$    #
+#..   ## $   #
+#..   ## $   #
+#..     $ $  #
+###  #########
+  ####
+;LEVEL 78
+       ###########
+       #         #
+       #    $ $  #
+###### # $ ##### #
+#    ##### $  ##$#
+#       $ $      #
+#          ## ## #
+#    ##@##### ## #
+#    ####   # ## ##
+#....#      # $   #
+#....#      #     #
+######      #######
+;LEVEL 79
+#############
+#           #
+# ### $$    #
+#   # $  $  #
+#  $####$######
+# $ ##        #####
+#  $$ $        ...#
+### ## $$#     ...#
+  # ##   #     ...#
+  #      #     ...#
+  ###@#############
+    ###
+;LEVEL 80
+  #################
+###@##         ...#
+#    #         ...#
+# $  #         ...#
+# $$ #         ...#
+## $ ###$##########
+ # ###  $ #
+##   $  $ #
+#  $ #  $ #
+# $  #    #
+#  $ #    #
+#    #    #
+###########
+;LEVEL 81
+              #####
+     ##########   #
+     #        #   #
+     #  $ $    $$ #
+     # ##### ## $ #
+     #$$   #$## $ #
+     # ### # ##$  #
+###### ### $ $    #
+#....        ##   #
+#....        ######
+#....        #
+###########@##
+          ###
+;LEVEL 82
+    ######
+ ####    #
+ #    ## #
+ # $     #
+### #### ########
+#  $   $ ##  ...#
+#   $$ $$    ...#
+#    $  $##  ...#
+##@## ## ##  ...#
+ ###  $  ########
+ #   $$  #
+ #    #  #
+ #########
+;LEVEL 83
+####### #########
+#     # #   ##  #
+# ### # #   $   #
+# # $ ###   $   #
+#   $$      ##$ #
+#    ####   ##  #
+#@############ ##
+###..    #####$ #
+  #..    ####   #
+  #..       $$  #
+  #..    #### $ #
+  #..    #  #   #
+  ########  #####
+;LEVEL 84
+#######
+#     ##########
+#     #    #  ##
+# $   #   $ $  #
+#  $  #  $ ##  #
+# $$  ##$ $    #
+## #  ## #######
+## #  ##    ...#
+#  #$       ...#
+#   $$      ...#
+#     ##@#  ...#
+################
+;LEVEL 85
+############
+#      #   ##
+# $  $   #  ######
+####  #####      #
+ #..  #     #### #
+ #.####  ####    #
+ #....    #  $ ####
+ # ...#   # $$$#  ##
+###.#### ##  $@$   #
+#     ##### $ #    #
+# #.# $      $###$ #
+# #.########  #  $ #
+# #..        ##  $ #
+# # ####### $ # #  #
+#   #     #       ##
+#####     ##########
+;LEVEL 86
+;COMMENT Level 18, with one more box.
+;AUTHOR Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)
+     ###########
+     #  .  #   #
+     # #.    @ #
+ ##### ##..# ####
+##  #...###     ###
+# $ #...   $ #  $ #
+#    .. ##  ## ## #
+####$##$# $ #   # #
+  ## #    #$ $$ # #
+  #  $ #$#  # $## #
+  #               #
+  #  ###########  #
+  ####         ####
+;LEVEL 87
+;COMMENT ... and two more for level 22.
+;AUTHOR Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)
+######     ####
+#    #######  #####
+#   $#  #  $  #   #
+#  $  $  $ # $ $  #
+##$ $   # @# $    #
+#  $ ########### ##
+# #   #.......# $#
+# ##  #.......#  #
+# #   *........$ #
+# # $ #.... ..#  #
+#  $ $####$#### $#
+# $ $ ### $   $  ##
+# $     $ $  $  $ #
+## ###### $ ##### #
+#         #       #
+###################
+;LEVEL 88
+;COMMENT One more for 35.
+;AUTHOR Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de)
+############ ######
+#   #    # ###....#
+#   $$#   @  .....#
+#   # ###   # ....#
+## ## ###  #  ....#
+ # $ $     # #.####
+ #  $ $##  #      #
+#### #  #### # ## #
+#  # #$   ## #    #
+# $  $  # ## #   ##
+# # $ $    # #   #
+#  $ ## ## # #####
+# $$     $$  #   #
+## ## ### $  $   #
+ #    # #    #####
+ ###### ######
diff --git a/packages/svg-clock/svg-clock.el b/packages/svg-clock/svg-clock.el
new file mode 100644 (file)
index 0000000..3897243
--- /dev/null
@@ -0,0 +1,273 @@
+;;; svg-clock.el --- Analog clock using Scalable Vector Graphics
+
+;; Copyright (C) 2011  Free Software Foundation, Inc.
+
+;; Author:      Ulf Jasper <ulf.jasper@web.de>
+;; Created:     22. Sep. 2011
+;; Keywords:    demo, svg, clock
+;; Version:     0.5
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; svg-clock provides a scalable analog clock.  Rendering is done by
+;; means of svg (Scalable Vector Graphics).  Works only with Emacsen
+;; which were built with svg support -- (image-type-available-p 'svg)
+;; must return t.  Call `svg-clock' to start/stop the clock.
+;; Set `svg-clock-size' to change its size.
+
+;; Installation
+;; ------------
+
+;; Add the following lines to your Emacs startup file (`~/.emacs').
+;; (add-to-list 'load-path "/path/to/svg-clock.el")
+;; (autoload 'svg-clock "svg-clock" "Start/stop svg-clock" t)
+
+;; ======================================================================
+
+;;; Code:
+(defconst svg-clock-version "0.5" "Version number of `svg-clock'.")
+
+(require 'image-mode)
+
+(defgroup svg-clock nil
+  "svg-clock"
+  :group 'applications)
+
+(defcustom svg-clock-size t
+  "Size (width and height) of the clock.
+Either an integer which gives the clock size in pixels, or t
+which makes the clock fit to its window automatically."
+  :type '(choice (integer :tag "Fixed Size" :value 250)
+                 (const :tag "Fit to window" t))
+  :group 'svg-clock)
+
+(defvar svg-clock-timer nil)
+
+(defconst svg-clock-template
+  "<?xml version=\"1.0\"?>
+<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"
+\"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">
+<svg xmlns=\"http://www.w3.org/2000/svg\"
+     width=\"%SIZE%\" height=\"%SIZE%\" >
+    <defs>
+        <symbol id=\"tick\">
+            <line x1=\"50\" y1=\"2\" x2=\"50\" y2=\"4\"
+                  style=\"stroke:%FG%;stroke-width:1\"/>
+        </symbol>
+        <symbol id=\"ticklong\">
+            <line x1=\"50\" y1=\"2\" x2=\"50\" y2=\"9\"
+                  style=\"stroke:%FG%;stroke-width:2\"/>
+        </symbol>
+        <symbol id=\"hand-hour\">
+            <line x1=\"50\" y1=\"22\" x2=\"50\" y2=\"54\"
+                  style=\"stroke:%FG%;stroke-width:3\"/>
+        </symbol>
+        <symbol id=\"hand-minute\">
+            <line x1=\"50\" y1=\"12\" x2=\"50\" y2=\"55\"
+                  style=\"stroke:%FG%;stroke-width:3\"/>
+        </symbol>
+        <symbol id=\"hand-second\">
+            <line x1=\"50\" y1=\"10\" x2=\"50\" y2=\"59\"
+                  style=\"stroke:%FG%;stroke-width:0.5\"/>
+        </symbol>
+        <g id=\"minute-ticks-a\">
+           <use xlink:href=\"#tick\"
+                transform=\"rotate(6, 50, 50)\" />
+           <use xlink:href=\"#tick\"
+                transform=\"rotate(12, 50, 50)\" />
+           <use xlink:href=\"#tick\"
+                transform=\"rotate(18, 50, 50)\" />
+           <use xlink:href=\"#tick\"
+                transform=\"rotate(24, 50, 50)\" />
+        </g>
+        <g id=\"minute-ticks-b\">
+            <use xlink:href=\"#minute-ticks-a\"
+                 transform=\"rotate(0, 50, 50)\" />
+            <use xlink:href=\"#minute-ticks-a\"
+                 transform=\"rotate(30, 50, 50)\" />
+            <use xlink:href=\"#minute-ticks-a\"
+                 transform=\"rotate(60, 50, 50)\" />
+            <use xlink:href=\"#minute-ticks-a\"
+                 transform=\"rotate(90, 50, 50)\" />
+            <use xlink:href=\"#minute-ticks-a\"
+                 transform=\"rotate(120, 50, 50)\" />
+            <use xlink:href=\"#minute-ticks-a\"
+                 transform=\"rotate(150, 50, 50)\" />
+        </g>
+
+        <g id=\"5-minute-ticks\">
+           <use xlink:href=\"#ticklong\" />
+           <use xlink:href=\"#ticklong\" transform=\"rotate(30, 50, 50)\" />
+           <use xlink:href=\"#ticklong\" transform=\"rotate(60, 50, 50)\" />
+        </g>
+
+        <g id=\"clock\">
+          <use xlink:href=\"#5-minute-ticks\"
+               transform=\"rotate(0, 50, 50)\" />
+          <use xlink:href=\"#5-minute-ticks\"
+               transform=\"rotate(90, 50, 50)\" />
+          <use xlink:href=\"#5-minute-ticks\"
+               transform=\"rotate(180, 50, 50)\" />
+          <use xlink:href=\"#5-minute-ticks\"
+               transform=\"rotate(270, 50, 50)\" />
+
+          <use xlink:href=\"#minute-ticks-b\"
+               transform=\"rotate(0, 50, 50)\" />
+          <use xlink:href=\"#minute-ticks-b\"
+               transform=\"rotate(180, 50, 50)\" />
+
+          <use xlink:href=\"#hand-second\"
+               transform=\"rotate(%SECOND%, 50, 50)\">
+          </use>
+          <use xlink:href=\"#hand-minute\"
+               transform=\"rotate(%MINUTE%, 50, 50)\">
+          </use>
+          <use xlink:href=\"#hand-hour\"
+               transform=\"rotate(%HOUR%, 50, 50)\">
+          </use>
+
+          <circle cx=\"50\" cy=\"50\" r=\"3\" fill=\"%FG%\"/>
+        </g>
+    </defs>
+    <use xlink:href=\"#clock\"
+         transform=\"scale(%SCALE%, %SCALE%)\"/>
+</svg>"
+  "The template for drawing the `svg-clock'.")
+
+(defvar svg-clock--actual-size 100
+  "Actual size of the svg clock.")
+
+(defun svg-clock-color-to-hex (colour)
+  "Return hex representation of COLOUR."
+  (let ((values (color-values colour)))
+    (format "#%02x%02x%02x" (nth 0 values) (nth 1 values) (nth 2 values))))
+
+(defun svg-clock-replace (from to)
+  "Replace all occurrences of FROM with TO."
+  (goto-char (point-min))
+  (while (re-search-forward from nil t)
+    (replace-match to)))
+
+(defun svg-clock-do-update (time)
+  "Make the clock display TIME.
+TIME must have the form (SECOND MINUTE HOUR ...), as returned by `decode-time'."
+  (with-current-buffer (get-buffer-create "*clock*")
+    (let* ((inhibit-read-only t)
+           (seconds (nth 0 time))
+           (minutes (nth 1 time))
+           (hours (nth 2 time))
+           (bg-colour (svg-clock-color-to-hex (face-background 'default)))
+           (fg-colour (svg-clock-color-to-hex (face-foreground 'default))))
+      (erase-buffer)
+      (insert svg-clock-template)
+
+      (svg-clock-replace "%BG%" bg-colour)
+      (svg-clock-replace "%FG%" fg-colour)
+      (svg-clock-replace "%HOUR%"
+                         (format "%f" (+ (* hours 30) (/ minutes 2.0))))
+      (svg-clock-replace "%MINUTE%"
+                         (format "%f" (+ (* minutes 6) (/ seconds 10.0))))
+      (svg-clock-replace "%SECOND%" (format "%f" (* seconds 6)))
+      (svg-clock-replace "%SIZE%" (format "%d" svg-clock--actual-size))
+      (svg-clock-replace "%SCALE%"
+                         (format "%f" (/ svg-clock--actual-size 100.0)))
+      (image-mode)
+      (image-toggle-display-image))))
+
+(defun svg-clock-update ()
+  "Update the clock."
+  (if (integerp svg-clock-size)
+      (setq svg-clock--actual-size svg-clock-size)
+    (svg-clock-fit-window))
+  (svg-clock-do-update (decode-time (current-time))))
+
+(defun svg-clock-set-size (size &optional perform-update)
+  "Set the SIZE of the clock and optionally PERFORM-UPDATE."
+  (setq svg-clock--actual-size size)
+  (if perform-update
+      (svg-clock-update)))
+
+(defun svg-clock-grow ()
+  "Enlarge the size of the svg clock by 10 pixesl.
+If `svg-clock-size' is t this command has no effect."
+  (interactive)
+  (svg-clock-set-size (+ 10 svg-clock--actual-size) t))
+
+(defun svg-clock-shrink ()
+  "Reduce the size of the svg clock by 10 pixesl.
+If `svg-clock-size' is t this command has no effect."
+  (interactive)
+  (svg-clock-set-size (max 10 (- svg-clock--actual-size 10)) t))
+
+(defun svg-clock-fit-window (&optional perform-update)
+  "Make the svg clock fill the whole window it is displayed in.
+Optionally PERFORM-UPDATE immediately."
+  (interactive)
+  (let  ((clock-win (get-buffer-window "*clock*")))
+    (if clock-win
+        (let* ((coords (window-inside-pixel-edges clock-win))
+               (width (- (nth 2 coords) (nth 0 coords)))
+               (height (- (nth 3 coords) (nth 1 coords))))
+          (svg-clock-set-size (min width height) perform-update)))))
+
+(defun svg-clock-stop ()
+  "Stop the svg clock and hide it."
+  (interactive)
+  (if (not svg-clock-timer)
+      (message "svg-clock is not running.")
+    (cancel-timer svg-clock-timer)
+    (setq svg-clock-timer nil)
+    (replace-buffer-in-windows "*clock*")
+    (message "Clock stopped")))
+
+(defun svg-clock-start ()
+  "Start the svg clock."
+  (if svg-clock-timer
+      (message "svg-clock is running already")
+    (switch-to-buffer (get-buffer-create "*clock*"))
+    (unless (integerp svg-clock-size)
+      (svg-clock-fit-window))
+    (setq svg-clock-timer
+          (run-with-timer 0 1 'svg-clock-update))
+    (svg-clock-mode)
+    (message "Clock started")))
+
+(defvar svg-clock-mode-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map [?+] 'svg-clock-grow)
+    (define-key map [?-] 'svg-clock-shrink)
+    (define-key map [?q] 'svg-clock-stop)
+    (define-key map [?f] 'svg-clock-fit-window)
+    map))
+
+(define-derived-mode svg-clock-mode fundamental-mode "svg clock"
+  "Major mode for the svg-clock buffer.
+\\{svg-clock-mode-map}"
+  (buffer-disable-undo))
+
+;;;###autoload
+(defun svg-clock ()
+  "Start/stop the svg clock."
+  (interactive)
+  (if svg-clock-timer
+      (svg-clock-stop)
+    (svg-clock-start)))
+
+(provide 'svg-clock)
+
+;;; svg-clock.el ends here
diff --git a/packages/tNFA/tNFA.el b/packages/tNFA/tNFA.el
new file mode 100644 (file)
index 0000000..8ef3682
--- /dev/null
@@ -0,0 +1,1113 @@
+;;; tNFA.el --- Tagged non-deterministic finite-state automata
+
+;; Copyright (C) 2008-2010, 2012   Free Software Foundation, Inc
+
+;; Author: Toby Cubitt <toby-predictive@dr-qubit.org>
+;; Version: 0.1.1
+;; Keywords: extensions, matching, data structures
+;;           tNFA, NFA, DFA, finite state automata, automata, regexp
+;; Package-Requires: ((queue "0.1"))
+;; URL: http://www.dr-qubit.org/emacs.php
+;; Repository: http://www.dr-qubit.org/git/predictive.git
+
+;; This file is part of 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 <http://www.gnu.org/licenses/>.
+
+
+;;; Commentary:
+;;
+;; A tagged, non-deterministic finite state automata (NFA) is an abstract
+;; computing machine that recognises regular languages. In layman's terms,
+;; they are used to decide whether a string matches a regular expression. The
+;; "tagged" part allows the NFA to do group-capture: it returns information
+;; about which parts of a string matched which subgroup of the regular
+;; expression.
+;;
+;; Why re-implement regular expression matching when Emacs comes with
+;; extensive built-in support for regexps? Primarily, because some algorithms
+;; require access to the NFA states produced part way through the regular
+;; expression matching process (see the trie.el package for an
+;; example). Secondarily, because Emacs regexps only work on strings, whereas
+;; regular expressions can usefully be used in Elisp code to match other
+;; sequence types, not just strings.
+;;
+;; A tagged NFA can be created from a regular expression using
+;; `tNFA-from-regexp', and its state can be updated using
+;; `tNFA-next-state'. You can discover whether a state is a matching state
+;; using `tNFA-match-p', extract subgroup capture data from it using
+;; `tNFA-group-data', check whether a state has any wildcard transitions using
+;; `tNFA-wildcard-p', and get a list of non-wildcard transitions using
+;; `tNFA-transitions'. Finally, `tNFA-regexp-match' uses tagged NFAs to decide
+;; whether a regexp matches a given string.
+;;
+;; Note that Emacs' regexps are not regular expressions in the original
+;; meaning of that phrase. Emacs regexps implement additional features (in
+;; particular, back-references) that allow them to match far more than just
+;; regular languages. This comes at a cost: regexp matching can potentially be
+;; very slow (NP-hard in fact, though the hard cases rarely crop up in
+;; practise), whereas there are efficient (polynomial-time) algorithms for
+;; matching regular expressions (in the original sense). Therefore, this
+;; package only supports a subset of the full Emacs regular expression
+;; syntax. See the function docstrings for more information.
+;;
+;; This package essentially implements Laurikari's algorithm, as described in
+;; his master's thesis, but it builds the corresponding tagged deterministic
+;; finite state automaton (DFA) on-the-fly as needed.
+;;
+;; This package uses the queue package queue.el.
+
+
+;;; Change Log:
+;;
+;; Version 0.1.1
+;; * work-around mysterious byte-compiler bug by defining
+;;   `tNFA--NFA-state-create' and `tNFA--NFA-state-create-tag' via `defun'
+;;   instead of directly in `defstruct'
+;;
+;; Version 0.1
+;; * initial version
+
+
+
+;;; Code:
+
+(eval-when-compile (require 'cl))
+(require 'queue)
+
+
+
+;;; ================================================================
+;;;                  Replcements for CL functions
+
+(defun* tNFA--assoc (item alist &key (test 'eq))
+  ;; Return first cons cell in ALIST whose CAR matches ITEM according to
+  ;; :test function (defaulting to `eq')
+  (while (and alist
+             (or (not (consp (car alist)))
+                 (not (funcall test item (caar alist)))))
+    (setq alist (cdr alist)))
+  (car alist))
+
+
+
+;;; ================================================================
+;;;                    Data structures
+
+;;; ----------------------------------------------------------------
+;;;                    tagged NFA states
+
+(defstruct
+  (tNFA--state
+   (:constructor nil)
+   (:constructor tNFA--state-create-initial
+                (NFA-state num-tags min-tags max-tags
+                 &aux
+                 (tags (tNFA--tags-create num-tags min-tags max-tags))))
+   (:constructor tNFA--state-create (NFA-state tags))
+   (:copier nil))
+  NFA-state tags)
+
+(defmacro tNFA--state-id (state)
+  `(tNFA--NFA-state-id (tNFA--state-NFA-state ,state)))
+
+(defmacro tNFA--state-type (state)
+  `(tNFA--NFA-state-type (tNFA--state-NFA-state ,state)))
+
+(defmacro tNFA--state-label (state)
+  `(tNFA--NFA-state-label (tNFA--state-NFA-state ,state)))
+
+(defmacro tNFA--state-in-degree (state)
+  `(tNFA--NFA-state-in-degree (tNFA--state-NFA-state ,state)))
+
+(defmacro tNFA--state-next (state)
+  `(tNFA--NFA-state-next (tNFA--state-NFA-state ,state)))
+
+(defmacro tNFA--state-count (state)
+  `(tNFA--NFA-state-count (tNFA--state-NFA-state ,state)))
+
+
+
+;;; ----------------------------------------------------------------
+;;;                         NFA states
+
+(declare (special NFA--state-id))
+
+(defstruct
+  (tNFA--NFA-state
+   (:type vector)
+   (:constructor nil)
+   (:constructor tNFA---NFA-state-create
+                (&optional type label next
+                 &aux
+                 (in-degree 0)
+                 (count 0)
+                 (id (incf NFA--state-id))
+                 ;; (dummy
+                 ;;  (when next
+                 ;;    (setf (tNFA--NFA-state-count next)
+                 ;;       (incf (tNFA--NFA-state-in-degree next)))))
+                 ))
+   (:constructor tNFA--NFA-state-create-branch
+                (&rest next
+                 &aux
+                 (type 'branch)
+                 (in-degree 0)
+                 (count 0)
+                 (id (incf NFA--state-id))))
+   (:constructor tNFA---NFA-state-create-tag
+                (tag &optional next
+                 &aux
+                 (type 'tag)
+                 (label tag)
+                 (in-degree 0)
+                 (count 0)
+                 (id (incf NFA--state-id))
+                 ;; (dummy
+                 ;;  (when next
+                 ;;    (setf (tNFA--NFA-state-count next)
+                 ;;       (incf (tNFA--NFA-state-in-degree next)))))
+                 ))
+   (:copier nil))
+  id type label in-degree
+  count tNFA-state  ; used internally in NFA evolution algorithms
+  next)
+
+
+;; Define these via defun instead of using the dummy argument in the
+;; above defstruct to work around a mysterious byte-compiler bug.
+
+(defun tNFA--NFA-state-create (&optional type label next)
+  (when next
+    (setf (tNFA--NFA-state-count next)
+         (incf (tNFA--NFA-state-in-degree next))))
+    (tNFA---NFA-state-create type label next))
+
+(defun tNFA--NFA-state-create-tag (tag &optional next)
+  (when next
+    (setf (tNFA--NFA-state-count next)
+         (incf (tNFA--NFA-state-in-degree next))))
+    (tNFA---NFA-state-create-tag tag next))
+
+
+;; tag number for a tagged epsilon transition is stored in label slot
+(defalias 'tNFA--NFA-state-tag 'tNFA--NFA-state-label)
+
+(defmacro tNFA--NFA-state-tags (state)
+  `(tNFA--state-tags (tNFA--NFA-state-tNFA-state ,state)))
+
+
+(defun tNFA--NFA-state-patch (attach state)
+  ;; patch STATE onto ATTACH. Return value is meaningless
+  (setf
+   (tNFA--NFA-state-type attach)
+     (tNFA--NFA-state-type state)
+   (tNFA--NFA-state-label attach)
+     (tNFA--NFA-state-label state)
+   (tNFA--NFA-state-next attach)
+     (tNFA--NFA-state-next state)
+   (tNFA--NFA-state-count state)
+     (incf (tNFA--NFA-state-in-degree state))))
+
+
+(defun tNFA--NFA-state-make-epsilon (state next)
+  ;; create an epsilon transition from STATE to NEXT
+  (setf
+   (tNFA--NFA-state-type state)  'epsilon
+   (tNFA--NFA-state-label state) nil
+   (tNFA--NFA-state-next state)  next
+   (tNFA--NFA-state-count next)
+     (incf (tNFA--NFA-state-in-degree next))))
+
+
+(defun tNFA--NFA-state-make-branch (state next)
+  ;; create a branch from STATE to all states in NEXT list
+  (setf (tNFA--NFA-state-type state)  'branch
+       (tNFA--NFA-state-label state) nil
+       (tNFA--NFA-state-next state)  next)
+  (dolist (n next)
+    (setf (tNFA--NFA-state-count n)
+         (incf (tNFA--NFA-state-in-degree n)))))
+
+
+(defun tNFA--NFA-state-copy (state)
+  ;; Return a copy of STATE. The next link is *not* copied, it is `eq'
+  ;; to the original next link. Use `tNFA--fragment-copy' if you want to
+  ;; recursively copy a chain of states. Note: NFA--state-id must be
+  ;; bound to something appropriate when this function is called.
+  (let ((copy (copy-sequence state)))
+    (setf (tNFA--NFA-state-id copy) (incf NFA--state-id))
+    copy))
+
+
+
+;;; ----------------------------------------------------------------
+;;;                        NFA fragments
+
+(defstruct
+  (tNFA--fragment
+   (:type vector)
+   (:constructor nil)
+   (:constructor tNFA--fragment-create (initial final))
+   (:copier nil))
+  initial final)
+
+
+(defun tNFA--fragment-patch (frag1 frag2)
+  ;; patch FRAG2 onto end of FRAG1; return value is meaningless
+  (tNFA--NFA-state-patch (tNFA--fragment-final frag1)
+                       (tNFA--fragment-initial frag2))
+  (setf (tNFA--fragment-final frag1) (tNFA--fragment-final frag2)))
+
+
+(defun tNFA--fragment-copy (fragment)
+  ;; return a copy of FRAGMENT.
+  (declare (special copied-states))
+  (let (copied-states)
+    (tNFA--fragment-create
+     (tNFA--do-fragment-copy (tNFA--fragment-initial fragment))
+     (cdr (assq (tNFA--fragment-final fragment) copied-states)))))
+
+
+(defun tNFA--do-fragment-copy (state)
+  ;; return a copy of STATE, recursively following and copying links
+  ;; (note: NFA--state-id must be bound to something appropriate when
+  ;; this is called)
+  (declare (special copied-states))
+  (let ((copy (tNFA--NFA-state-copy state)))
+    (push (cons state copy) copied-states)
+
+    ;; if STATE is a branch, copy all links
+    (cond
+     ((eq (tNFA--NFA-state-type copy) 'branch)
+      (setf (tNFA--NFA-state-next copy)
+           (mapcar (lambda (next)
+                     (or (cdr (assq next copied-states))
+                         (tNFA--do-fragment-copy next)))
+                   (tNFA--NFA-state-next copy))))
+
+     ;; if state doesn't have a next link, return
+     ((or (eq (tNFA--NFA-state-type copy) 'match)
+         (null (tNFA--NFA-state-type copy))))
+
+     ;; otherwise, copy next link
+     ((tNFA--NFA-state-type copy)
+      ;; for a non-branch STATE, copy next link
+      (setf (tNFA--NFA-state-next copy)
+           ;; if we've already copied next state, set next link to that
+           (or (cdr (assq (tNFA--NFA-state-next copy) copied-states))
+               ;; otherwise, recursively copy next state
+               (tNFA--do-fragment-copy (tNFA--NFA-state-next copy))))))
+    copy))
+
+
+
+;;; ----------------------------------------------------------------
+;;;                      DFA states
+
+(defstruct
+  (tNFA--DFA-state
+   :named
+   (:constructor nil)
+   (:constructor tNFA--DFA-state--create
+                (list pool
+                 &key
+                 (test 'eq)
+                 &aux
+                 (transitions ())))
+   (:copier nil))
+  list transitions test wildcard match pool)
+
+
+(defun* tNFA--DFA-state-create (state-list state-pool &key (test 'eq))
+  ;; create DFA state and add it to the state pool
+  (let ((DFA-state (tNFA--DFA-state--create
+                   state-list state-pool :test test))
+       tmp-list)
+    (puthash state-list DFA-state (tNFA--DFA-state-pool DFA-state))
+
+    (dolist (state state-list)
+      ;; if state in state list is...
+      (cond
+       ;; literal state: add literal transition
+       ((eq (tNFA--state-type state) 'literal)
+       (setq tmp-list (tNFA--DFA-state-transitions DFA-state))
+       (add-to-list 'tmp-list (cons (tNFA--state-label state) t))
+       (setf (tNFA--DFA-state-transitions DFA-state) tmp-list))
+
+       ;; character alternative: add transitions for all alternatives
+       ((eq (tNFA--state-type state) 'char-alt)
+       (dolist (c (tNFA--state-label state))
+         (setq tmp-list (tNFA--DFA-state-transitions DFA-state))
+         (add-to-list 'tmp-list (cons c t))
+         (setf (tNFA--DFA-state-transitions DFA-state) tmp-list)))
+
+       ;; wildcard or negated character alternative: add wildcard
+       ;; transistion
+       ((or (eq (tNFA--state-type state) 'wildcard)
+           (eq (tNFA--state-type state) 'neg-char-alt))
+       (setf (tNFA--DFA-state-wildcard DFA-state) t))
+
+       ;; match state: set match tags
+       ((eq (tNFA--state-type state) 'match)
+       (setf (tNFA--DFA-state-match DFA-state)
+             (tNFA--state-tags state)))))
+
+    ;; return constructed state
+    DFA-state))
+
+
+(defun* tNFA--DFA-state-create-initial (state-list &key (test 'eq))
+  ;; create initial DFA state from initial tNFA state INITIAL-STATE
+  (tNFA--DFA-state-create state-list
+                         (make-hash-table :test 'equal)
+                         :test test))
+
+
+(defalias 'tNFA-match-p 'tNFA--DFA-state-match
+  "Return non-nil if STATE is a matching state, otherwise return nil.")
+
+
+(defalias 'tNFA-wildcard-p 'tNFA--DFA-state-wildcard
+  "Return non-nil if STATE has a wildcard transition,
+ otherwise return nil.")
+
+
+(defun tNFA-transitions (state)
+  "Return list of literal transitions from tNFA state STATE."
+  (mapcar 'car (tNFA--DFA-state-transitions state)))
+
+
+
+;;; ----------------------------------------------------------------
+;;;                      tag tables
+
+(defun tNFA--tags-create (num-tags min-tags max-tags)
+  ;; construct a new tags table
+  (let ((vec (make-vector num-tags nil)))
+    (dolist (tag min-tags)
+      (aset vec tag (cons -1 'min)))
+    (dolist (tag max-tags)
+      (aset vec tag (cons -1 'max)))
+    vec))
+
+
+(defun tNFA--tags-copy (tags)
+  ;; return a copy of TAGS table
+  (let* ((len (length tags))
+        (vec (make-vector len nil)))
+    (dotimes (i len)
+      (aset vec i (cons (car (aref tags i))
+                       (cdr (aref tags i)))))
+    vec))
+
+
+(defmacro tNFA--tags-set (tags tag val)
+  ;; set value of TAG in TAGS table to VAL
+  `(setcar (aref ,tags ,tag) ,val))
+
+
+(defmacro tNFA--tags-get (tags tag)
+  ;; get value of TAG in TAGS table
+  `(car (aref ,tags ,tag)))
+
+
+(defmacro tNFA--tags-type (tags tag)
+  ;; return tag type ('min or 'max)
+  `(cdr (aref ,tags ,tag)))
+
+
+(defun tNFA--tags< (val tag tags)
+  ;; return non-nil if VAL takes precedence over the value of TAG in
+  ;; TAGS table, nil otherwise
+  (setq tag (aref tags tag))
+  (or (and (eq (cdr tag) 'min)
+          (< val (car tag)))
+    ;;(and (eq (cdr tag) 'max)
+          (> val (car tag));)
+          ))
+
+
+(defun tNFA--tags-to-groups (tags)
+  ;; Convert TAGS table to a list of indices of group matches. The n'th
+  ;; element of the list is a cons cell, whose car is the starting index
+  ;; of the nth group and whose cdr is its end index. If a group didn't
+  ;; match, the corresponding list element will be null."
+  (let ((groups (make-list (/ (length tags) 2) nil))
+       group-stack
+       (grp 0))
+    (dotimes (i (length tags))
+      (if (eq (tNFA--tags-type tags i) 'max)
+         (unless (= (tNFA--tags-get tags i) -1)
+           (setf (nth (caar group-stack) groups)
+                 (cons (cdr (pop group-stack))
+                       (tNFA--tags-get tags i))))
+       (unless (= (tNFA--tags-get tags i) -1)
+         (push (cons grp (tNFA--tags-get tags i)) group-stack))
+       (incf grp)))
+    groups))
+
+
+
+
+;;; ================================================================
+;;;                        Regexp -> tNFA
+
+;;;###autoload
+(defun* tNFA-from-regexp (regexp &key (test 'eq))
+  "Create a tagged NFA that recognizes the regular expression REGEXP.
+The return value is the initial state of the tagged NFA.
+
+REGEXP can be any sequence type (vector, list, or string); it
+need not be an actual string. Special characters in REGEXP are
+still just that: elements of the sequence that are characters
+which have a special meaning in regexps.
+
+The :test keyword argument specifies how to test whether two
+individual elements of STRING are identical. The default is `eq'.
+
+Only a subset of the full Emacs regular expression syntax is
+supported. There is no support for regexp constructs that are
+only meaningful for strings (character ranges and character
+classes inside character alternatives, and syntax-related
+backslash constructs). Back-references and non-greedy postfix
+operators are not supported, so `?' after a postfix operator
+loses its special meaning. Also, matches are always anchored, so
+`$' and `^' lose their special meanings (use `.*' at the
+beginning and end of the regexp to get an unanchored match)."
+
+  ;; convert regexp to list, build NFA, and return initial state
+  (declare (special NFA--state-id))
+  (destructuring-bind (fragment num-tags min-tags max-tags regexp)
+      (let ((NFA--state-id -1))
+       (tNFA--from-regexp (append regexp nil) 0 '() '() 'top-level))
+    (if regexp
+       (error "Syntax error in regexp: missing \"(\"")
+      (setf (tNFA--NFA-state-type (tNFA--fragment-final fragment))
+           'match)
+      (tNFA--DFA-state-create-initial
+       (tNFA--epsilon-boundary
+       (list
+        (tNFA--state-create-initial
+         (tNFA--fragment-initial fragment) num-tags min-tags max-tags))
+       0)
+       :test test)
+      )))
+
+
+(defmacro tNFA--regexp-postfix-p (regexp)
+  ;; return t if next token in REGEXP is a postfix operator, nil
+  ;; otherwise
+  `(or (eq (car ,regexp) ?*)
+       (eq (car ,regexp) ?+)
+       (eq (car ,regexp) ??)
+       (and (eq (car ,regexp) ?\\)
+           (cdr ,regexp)
+           (eq (cadr ,regexp) ?{))))
+
+
+(defun tNFA--from-regexp (regexp num-tags min-tags max-tags
+                                &optional top-level shy-group)
+  ;; Construct a tagged NFA fragment from REGEXP, up to first end-group
+  ;; character or end of REGEXP. The TAGS arguments are used to pass the
+  ;; tags created so far. A non-nil TOP-LEVEL indicates that REGEXP is
+  ;; the complete regexp, so we're constructing the entire tNFA. A
+  ;; non-nil SHY-GROUP indicates that we're constructing a shy subgroup
+  ;; fragment. (Both optional arguments are only used for spotting
+  ;; syntax errors in REGEXP.)
+  ;;
+  ;; Returns a list: (FRAGMENT NUM-TAGS MIN-TAGS MAX-TAGS
+  ;; REGEXP). FRAGMENT is the constructed tNFA fragment, REGEXP is the
+  ;; remaining, unused portion of the regexp, and the TAGS return values
+  ;; give the tags created so far.
+
+  (let* ((new (tNFA--NFA-state-create))
+        (fragment-stack (list (tNFA--fragment-create new new)))
+        fragment copy attach token type group-end-tag)
+
+    (catch 'constructed
+      (while t
+       (setq regexp (tNFA--regexp-next-token regexp)
+             type   (nth 0 regexp)
+             token  (nth 1 regexp)
+             regexp (nth 2 regexp))
+       (setq fragment nil
+             group-end-tag nil)
+
+       ;; ----- construct new fragment -----
+       (cond
+        ;; syntax error: missing )
+        ((and (null type) (not top-level))
+         (error "Syntax error in regexp:\
+ extra \"(\" or missing \")\""))
+
+        ;; syntax error: extra )
+        ((and (eq type 'shy-group-end) top-level)
+         (error "Syntax error in regexp:\
+ extra \")\" or missing \"(\""))
+
+        ;; syntax error: ) ending a shy group
+        ((and (eq type 'shy-group-end) (not shy-group))
+         (error "Syntax error in regexp: \"(\" matched with \")?\""))
+
+        ;; syntax error: )? ending a group
+        ((and (eq type 'group-end) shy-group)
+         (error "Syntax error in regexp: \"(?\" matched with \")\""))
+
+        ;; syntax error: postfix operator not after atom
+        ((eq type 'postfix)
+         (error "Syntax error in regexp: unexpected \"%s\""
+                (char-to-string token)))
+
+
+        ;; regexp atom: construct new literal fragment
+        ((or (eq type 'literal) (eq type 'wildcard)
+             (eq type 'char-alt) (eq type 'neg-char-alt))
+         (setq new (tNFA--NFA-state-create
+                    type token (tNFA--NFA-state-create))
+               fragment (tNFA--fragment-create
+                         new (tNFA--NFA-state-next new))))
+
+        ;; shy subgroup start: recursively construct subgroup fragment
+        ((eq type 'shy-group-start)
+         (setq new (tNFA--from-regexp
+                    regexp num-tags min-tags max-tags nil t)
+               num-tags (nth 1 new)
+               min-tags (nth 2 new)
+               max-tags (nth 3 new)
+               regexp   (nth 4 new)
+               fragment (nth 0 new)))
+
+        ;; subgroup start: add minimize tag to current fragment, and
+        ;;                 recursively construct subgroup fragment
+        ((eq type 'group-start)
+         (setq new (tNFA--NFA-state-create))
+         (setq fragment
+               (tNFA--fragment-create
+                (tNFA--NFA-state-create-tag
+                 (car (push (1- (incf num-tags)) min-tags))
+                 new)
+                new))
+         (tNFA--fragment-patch (car fragment-stack) fragment)
+         ;; reserve next tag number for subgroup end tag
+         (setq group-end-tag num-tags)
+         (incf num-tags)
+         ;; recursively construct subgroup fragment
+         (setq new (tNFA--from-regexp
+                    regexp num-tags min-tags max-tags)
+               num-tags (nth 1 new)
+               min-tags (nth 2 new)
+               max-tags (nth 3 new)
+               regexp   (nth 4 new)
+               fragment (nth 0 new)))
+
+
+        ;; end of regexp or subgroup: ...
+        ((or (null type) (eq type 'shy-group-end) (eq type 'group-end))
+
+         ;; if fragment-stack contains only one fragment, throw
+         ;; fragment up to recursion level above
+         (cond
+          ((null (nth 1 fragment-stack))
+           (throw 'constructed
+                  (list (car fragment-stack)
+                        num-tags min-tags max-tags regexp)))
+
+          ;; if fragment-stack contains multiple alternation fragments,
+          ;; attach them all together
+          ;;
+          ;;          .--fragment--.
+          ;;         /              \
+          ;;        /----fragment----\
+          ;;       /                  \
+          ;;   ---o------fragment------o--->
+          ;;       \        .         /
+          ;;        \       .        /
+          ;;                .
+          (t
+           ;; create a new fragment containing start and end of
+           ;; alternation
+           (setq fragment
+                 (tNFA--fragment-create
+                  (tNFA--NFA-state-create-branch)
+                  (tNFA--NFA-state-create)))
+           ;; patch alternation fragments into new fragment
+           (dolist (frag fragment-stack)
+             (push (tNFA--fragment-initial frag)
+                   (tNFA--NFA-state-next
+                    (tNFA--fragment-initial fragment)))
+             (setf (tNFA--NFA-state-count
+                    (tNFA--fragment-initial frag))
+                   (incf (tNFA--NFA-state-in-degree
+                          (tNFA--fragment-initial frag))))
+             (tNFA--NFA-state-make-epsilon (tNFA--fragment-final frag)
+                                     (tNFA--fragment-final fragment)))
+           ;; throw constructed fragment up to recursion level above
+           (throw 'constructed
+                  (list fragment num-tags min-tags max-tags regexp)))
+          ))
+
+        ;; | alternation: start new fragment
+        ((eq type 'alternation)
+         (setq new (tNFA--NFA-state-create))
+         (push (tNFA--fragment-create new new) fragment-stack)))
+
+
+       ;; ----- attach new fragment -----
+       (when fragment
+         ;; if next token is not a postfix operator, attach new
+         ;; fragment onto end of current NFA fragment
+         (if (not (tNFA--regexp-postfix-p regexp))
+             (tNFA--fragment-patch (car fragment-stack) fragment)
+
+           ;; if next token is a postfix operator, splice new fragment
+           ;; into NFA as appropriate
+           (when (eq type 'alternation)
+             (error "Syntax error in regexp: unexpected \"%s\""
+                    (char-to-string token)))
+           (setq regexp (tNFA--regexp-next-token regexp)
+                 type   (nth 0 regexp)
+                 token  (nth 1 regexp)
+                 regexp (nth 2 regexp))
+
+           (while fragment
+             (setq attach (tNFA--fragment-final (car fragment-stack)))
+             (setq new (tNFA--NFA-state-create))
+             (cond
+
+              ;; * postfix = \{0,\}:
+              ;;
+              ;;    .--fragment--.
+              ;;   /              \
+              ;;   \        ______/
+              ;;    \      /
+              ;;  ---attach-----new---
+              ;;
+              ((and (eq (car token) 0) (null (cdr token)))
+               (tNFA--NFA-state-make-branch
+                attach (list (tNFA--fragment-initial fragment) new))
+               (tNFA--NFA-state-make-epsilon
+                (tNFA--fragment-final fragment) attach)
+               (setf (tNFA--fragment-final (car fragment-stack)) new)
+               (setq fragment nil))
+
+              ;; + postfix = \{1,\}:
+              ;;
+              ;;      .----.
+              ;;     /      \
+              ;;    /        \
+              ;;    \        /
+              ;;  ---fragment-----new---
+              ;;
+              ((and (eq (car token) 1) (null (cdr token)))
+               (tNFA--NFA-state-patch
+                attach (tNFA--fragment-initial fragment))
+               (tNFA--NFA-state-make-branch
+                (tNFA--fragment-final fragment) (list attach new))
+               (setf (tNFA--fragment-final (car fragment-stack)) new)
+               (setq fragment nil))
+
+              ;; \{0,n\} (note: ? postfix = \{0,1\}):
+              ;;
+              ;;            .--fragment--.
+              ;;           /              \
+              ;;  ---attach                new---
+              ;;           \______________/
+              ;;
+              ((eq (car token) 0)
+               ;; ? postfix = \{0,1\}: after this we're done
+               (if (eq (cdr token) 1)
+                   (setq copy nil)
+                 (setq copy (tNFA--fragment-copy fragment)))
+               ;; attach fragment
+               (tNFA--NFA-state-make-branch
+                attach (list (tNFA--fragment-initial fragment) new))
+               (tNFA--NFA-state-make-epsilon
+                (tNFA--fragment-final fragment) new)
+               (setf (tNFA--fragment-final (car fragment-stack)) new)
+               ;; prepare for next iteration
+               (decf (cdr token))
+               (setq fragment copy))
+
+              ;; \{n,\} or \{n,m\}:
+              ;;
+              ;;  ---attach----fragment----new---
+              ;;
+              (t
+               (setq copy (tNFA--fragment-copy fragment))
+               (tNFA--fragment-patch (car fragment-stack) fragment)
+               ;; prepare for next iteration
+               (decf (car token))
+               (when (cdr token) (decf (cdr token)))
+               (if (eq (cdr token) 0)
+                   (setq fragment nil)
+                 (setq fragment copy)))
+              )))
+
+
+         ;; if ending a group, add a maximize tag to end
+         (when group-end-tag
+           (setq new (tNFA--NFA-state-create)
+                 fragment (tNFA--fragment-create
+                           (tNFA--NFA-state-create-tag
+                            group-end-tag new)
+                           new))
+           (push group-end-tag max-tags)
+           (tNFA--fragment-patch (car fragment-stack) fragment)))
+       ))  ; end of infinite loop and catch
+    ))
+
+
+
+;; Note: hard-coding the parsing like this is ugly, though sufficient
+;;       for our purposes. Perhaps it would be more elegant to implement
+;;       this in terms of a proper parser...
+
+(defun tNFA--regexp-next-token (regexp)
+  ;; if regexp is empty, return null values for next token type, token
+  ;; and remaining regexp
+  (if (null regexp)
+      (list nil nil nil)
+
+    (let ((token (pop regexp))
+         (type 'literal))  ; assume token is literal initially
+      (cond
+
+       ;; [: gobble up to closing ]
+       ((eq token ?\[)
+       ;; character alternatives are stored in lists
+       (setq token '())
+       (cond
+        ;; gobble ] appearing straight after [
+        ((eq (car regexp) ?\]) (push (pop regexp) token))
+        ;; gobble ] appearing straight after [^
+        ((and (eq (car regexp) ?^) (eq (nth 1 regexp) ?\]))
+         (push (pop regexp) token)
+         (push (pop regexp) token)))
+       ;; gobble everything up to closing ]
+       (while (not (eq (car regexp) ?\]))
+         (push (pop regexp) token)
+         (unless regexp
+           (error "Syntax error in regexp: missing \"]\"")))
+       (pop regexp)  ; dump closing ]
+       (if (not (eq (car (last token)) ?^))
+           (setq type 'char-alt)
+         (setq type 'neg-char-alt)
+         (setq token (butlast token))))
+
+       ;; ]: syntax error (always gobbled when parsing [)
+       ((eq token ?\])
+       (error "Syntax error in regexp: missing \"[\""))
+
+       ;; . * + ?: set appropriate type
+       ((eq token ?*) (setq type 'postfix token (cons 0 nil)))
+       ((eq token ?+) (setq type 'postfix token (cons 1 nil)))
+       ((eq token ??) (setq type 'postfix token (cons 0 1)))
+       ((eq token ?.) (setq type 'wildcard))
+
+       ;; \: look at next character
+       ((eq token ?\\)
+       (unless (setq token (pop regexp))
+         (error "Syntax error in regexp:\
+ missing character after \"\\\""))
+       (cond
+        ;; |: alternation
+        ((eq token ?|) (setq type 'alternation))
+        ;; \(?: shy group start
+        ((and (eq token ?\() (eq (car regexp) ??))
+         (setq type 'shy-group-start)
+         (pop regexp))
+        ;; \)?: shy group end
+        ((and (eq token ?\)) (eq (car regexp) ??))
+         (setq type 'shy-group-end)
+         (pop regexp))
+        ;; \(: group start
+        ((eq token ?\() (setq type 'group-start))
+        ;; \): group end
+        ((eq token ?\)) (setq type 'group-end))
+
+        ;; \{: postfix repetition operator
+        ((eq token ?{)
+         (setq type 'postfix token (cons nil nil))
+         ;; extract first number from repetition operator
+         (while (if (null regexp)
+                    (error "Syntax error in regexp:\
+ malformed \\{...\\}")
+                  (not (or (eq (car regexp) ?,)
+                           (eq (car regexp) ?\\))))
+           (setcar token
+                   (concat (car token) (char-to-string (pop regexp)))))
+         (if (null (car token))
+             (setcar token 0)
+           (unless (string-match "[0-9]+" (car token))
+             (error "Syntax error in regexp: malformed \\{...\\}"))
+           (setcar token (string-to-number (car token))))
+         (cond
+          ;; if next character is "\", we expect "}" to follow
+          ((eq (car regexp) ?\\)
+           (pop regexp)
+           (unless (eq (car regexp) ?})
+             (error "Syntax error in regexp: expected \"}\""))
+           (pop regexp)
+           (unless (car token)
+             (error "Syntax error in regexp: malformed \\{...\\}"))
+           (setcdr token (car token)))
+          ;; if next character is ",", we expect a second number to
+          ;; follow
+          ((eq (car regexp) ?,)
+           (pop regexp)
+           (while (if (null regexp)
+                      (error "Syntax error in regexp:\
+ malformed \\{...\\}")
+                    (not (eq (car regexp) ?\\)))
+             (setcdr token
+                     (concat (cdr token)
+                             (char-to-string (pop regexp)))))
+           (unless (null (cdr token))
+             (unless (string-match "[0-9]+" (cdr token))
+               (error "Syntax error in regexp: malformed \\{...\\}"))
+             (setcdr token (string-to-number (cdr token))))
+           (pop regexp)
+           (unless (eq (car regexp) ?})
+             (error "Syntax error in regexp: expected \"}\""))
+           (pop regexp))))
+        ))
+       )
+
+      ;; return first token type, token, and remaining regexp
+      (list type token regexp))))
+
+
+
+;;; ================================================================
+;;;                     tNFA evolution
+
+(defun tNFA-next-state (tNFA chr pos)
+  "Evolve tNFA according to CHR, which corresponds to position
+POS in a string."
+  (let (elem state)
+    ;; if there is a transition for character CHR...
+    (cond
+     ((setq elem (tNFA--assoc chr (tNFA--DFA-state-transitions tNFA)
+                              :test (tNFA--DFA-state-test tNFA)))
+      ;; if next state has not already been computed, do so
+      (unless (tNFA--DFA-state-p (setq state (cdr elem)))
+       (setq state (tNFA--DFA-next-state tNFA chr pos nil))
+       (setcdr elem state)))
+
+     ;; if there's a wildcard transition...
+     ((setq state (tNFA--DFA-state-wildcard tNFA))
+      ;; if next state has not already been computed, do so
+      (unless (tNFA--DFA-state-p state)
+       (setq state (tNFA--DFA-next-state tNFA chr pos t))
+       (setf (tNFA--DFA-state-wildcard tNFA) state))))
+    state))
+
+
+
+(defun tNFA--DFA-next-state (DFA-state chr pos wildcard)
+  (let (state-list state)
+    ;; add all states reached by a CHR transition from DFA-STATE to
+    ;; state list
+    (if wildcard
+       (dolist (state (tNFA--DFA-state-list DFA-state))
+         (when (or (eq (tNFA--state-type state) 'wildcard)
+                   (and (eq (tNFA--state-type state) 'neg-char-alt)
+                        (not (memq chr (tNFA--state-label state)))))
+           (push (tNFA--state-create
+                  (tNFA--state-next state)
+                  (tNFA--tags-copy (tNFA--state-tags state)))
+                 state-list)))
+      (dolist (state (tNFA--DFA-state-list DFA-state))
+       (when (or (and (eq (tNFA--state-type state) 'literal)
+                      (eq chr (tNFA--state-label state)))
+                 (and (eq (tNFA--state-type state) 'char-alt)
+                      (memq chr (tNFA--state-label state)))
+                 (and (eq (tNFA--state-type state) 'neg-char-alt)
+                      (not (memq chr (tNFA--state-label state))))
+                 (eq (tNFA--state-type state) 'wildcard))
+         (push (tNFA--state-create
+                (tNFA--state-next state)
+                (tNFA--tags-copy (tNFA--state-tags state)))
+               state-list))))
+
+    ;; if state list is empty, return empty, failure DFA state
+    (when state-list
+      ;; otherwise, construct new DFA state and add it to the pool if
+      ;; it's not already there
+      (setq state-list (tNFA--epsilon-boundary state-list (1+ pos)))
+      (setq state
+           (or (gethash state-list (tNFA--DFA-state-pool DFA-state))
+               (tNFA--DFA-state-create
+                state-list
+                (tNFA--DFA-state-pool DFA-state)
+                :test (tNFA--DFA-state-test DFA-state))))
+      ;; return next state
+      state)))
+
+
+
+(defun tNFA--epsilon-boundary (state-set pos)
+  ;; Return the tagged epsilon-boundary of the NFA states listed in
+  ;; STATE-SET, that is the set of all states that can be reached via
+  ;; epsilon transitions from some state in STATE-SET (not including
+  ;; states in STATE-SET itself).
+  (let ((queue (queue-create))
+       (result '())
+       (reset '())
+       state next tags)
+    ;; temporarily link the NFA states to their corresponding tNFA
+    ;; states, and add them to the queue
+    (dolist (t-state state-set)
+      (setf state (tNFA--state-NFA-state t-state)
+           (tNFA--NFA-state-tNFA-state state) t-state)
+      (push state reset)
+      (queue-enqueue queue state))
+
+    (while (setq state (queue-dequeue queue))
+      (cond
+       ;; branch or epsilon: add next states as necessary, copying tags
+       ;; across
+       ((or (eq (tNFA--NFA-state-type state) 'branch)
+           (eq (tNFA--NFA-state-type state) 'epsilon))
+       (dolist (next (if (eq (tNFA--NFA-state-type state) 'epsilon)
+                         (list (tNFA--NFA-state-next state))
+                       (tNFA--NFA-state-next state)))
+         (unless (tNFA--NFA-state-tNFA-state next)
+           (setf (tNFA--NFA-state-tNFA-state next)
+                 (tNFA--state-create
+                  next (tNFA--tags-copy (tNFA--NFA-state-tags state))))
+           (push next reset)
+           ;; if next state hasn't already been seen in-degree times,
+           ;; add it to the end of the queue
+           (if (/= (decf (tNFA--NFA-state-count next)) 0)
+               (queue-enqueue queue next)
+             ;; if it has now been seen in-degree times, reset count
+             ;; and add it back to the front of the queue
+             (setf (tNFA--NFA-state-count next)
+                   (tNFA--NFA-state-in-degree next))
+             (queue-prepend queue next)))))
+
+       ;; tag: add next state if necessary, updating tags if necessary
+       ((eq (tNFA--NFA-state-type state) 'tag)
+       (setq next (tNFA--NFA-state-next state))
+       ;; if next state is not already in results list, or it is
+       ;; already in results but new tag value takes precedence...
+       (when (or (not (tNFA--NFA-state-tNFA-state next))
+                 (tNFA--tags< pos (tNFA--NFA-state-tag state)
+                             (tNFA--NFA-state-tags next)))
+         ;; if next state is already in results, update tag value
+         (if (tNFA--NFA-state-tNFA-state next)
+             (tNFA--tags-set (tNFA--NFA-state-tags next)
+                            (tNFA--NFA-state-tag state) pos)
+           ;; if state is not already in results, copy tags, updating
+           ;; tag value, and add next state to results list
+           (setq tags (tNFA--tags-copy (tNFA--NFA-state-tags state)))
+           (tNFA--tags-set tags (tNFA--NFA-state-tag state) pos)
+           (setf (tNFA--NFA-state-tNFA-state next)
+                 (tNFA--state-create next tags))
+           (push next reset))
+         ;; if next state hasn't already been seen in-degree times, add
+         ;; it to the end of the queue
+         (if (/= (decf (tNFA--NFA-state-count next)) 0)
+             (queue-enqueue queue next)
+           ;; if it has now been seen in-degree times, reset count and
+           ;; add it back to the front of the queue
+           (setf (tNFA--NFA-state-count next)
+                 (tNFA--NFA-state-in-degree next))
+           (queue-prepend queue next))))
+
+       ;; anything else is a non-epsilon-transition state, so add it to
+       ;; result
+       (t (push (tNFA--NFA-state-tNFA-state state) result))
+       ))
+
+    ;; reset temporary NFA state link and count
+    (dolist (state reset)
+      (setf (tNFA--NFA-state-tNFA-state state) nil
+           (tNFA--NFA-state-count state)
+             (tNFA--NFA-state-in-degree state)))
+    ;; sort result states
+    (sort result
+         (lambda (a b) (< (tNFA--state-id a) (tNFA--state-id b))))
+    ))
+
+
+
+;;; ================================================================
+;;;                       tNFA matching
+
+;;;###autoload
+(defun* tNFA-regexp-match (regexp string &key (test 'eq))
+  "Return non-nil if STRING matches REGEXP, nil otherwise.
+Sets the match data if there was a match; see `match-beginning',
+`match-end' and `match-string'.
+
+REGEXP and STRING can be any sequence type (vector, list, or
+string); they need not be actual strings. Special characters in
+REGEXP are still just that: elements of the sequence that are
+characters which have a special meaning in regexps.
+
+The :test keyword argument specifies how to test whether two
+individual elements of STRING are identical. The default is `eq'.
+
+Only a subset of the full Emacs regular expression syntax is
+supported. There is no support for regexp constructs that are
+only meaningful for strings (character ranges and character
+classes inside character alternatives, and syntax-related
+backslash constructs). Back-references and non-greedy postfix
+operators are not supported, so `?' after a postfix operator
+loses its special meaning. Also, matches are always anchored, so
+`$' and `^' lose their special meanings (use `.*' at the
+beginning and end of the regexp to get an unanchored match)."
+
+  (let ((tNFA (tNFA-from-regexp regexp :test test))
+       (i -1) tags match-data group-stack (grp 0))
+
+    ;; evolve tNFA according to characters of STRING
+    (catch 'fail
+      (dolist (chr (append string nil))
+       (unless (setq tNFA (tNFA-next-state tNFA chr (incf i)))
+         (throw 'fail nil)))
+
+      ;; if REGEXP matched...
+      (when (setq tags (tNFA--DFA-state-match tNFA))
+       (setq match-data (make-list (+ (length tags) 2) nil))
+       ;; set match data
+       (setf (nth 0 match-data) 0
+             (nth 1 match-data) (length string))
+       ;; set group match data if there were any groups
+       (dotimes (i (length tags))
+         (if (eq (tNFA--tags-type tags i) 'max)
+             (unless (= (tNFA--tags-get tags i) -1)
+               (setf (nth (1+ (* 2 (pop group-stack))) match-data)
+                     (tNFA--tags-get tags i)))
+           (incf grp)
+           (unless (= (tNFA--tags-get tags i) -1)
+             (push grp group-stack)
+             (setf (nth (* 2 grp) match-data)
+                   (tNFA--tags-get tags i)))))
+       (set-match-data match-data)
+       tags))))
+
+
+(defun tNFA-group-data (tNFA)
+  "Return the group match data associated with a tNFA state."
+  (tNFA--tags-to-groups (tNFA--DFA-state-match tNFA)))
+
+
+
+(provide 'tNFA)
+
+;;; tNFA.el ends here
diff --git a/packages/trie/trie.el b/packages/trie/trie.el
new file mode 100644 (file)
index 0000000..894aa60
--- /dev/null
@@ -0,0 +1,1902 @@
+;;; trie.el --- Trie data structure
+
+;; Copyright (C) 2008-2010, 2012  Free Software Foundation, Inc
+
+;; Author: Toby Cubitt <toby-predictive@dr-qubit.org>
+;; Version: 0.2.6
+;; Keywords: extensions, matching, data structures
+;;           trie, ternary search tree, tree, completion, regexp
+;; Package-Requires: ((tNFA "0.1.1") (heap "0.3"))
+;; URL: http://www.dr-qubit.org/emacs.php
+;; Repository: http://www.dr-qubit.org/git/predictive.git
+
+;; This file is part of 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 <http://www.gnu.org/licenses/>.
+
+
+;;; Commentary:
+;;
+;; Quick Overview
+;; --------------
+;; A trie is a data structure used to store keys that are ordered sequences of
+;; elements (vectors, lists or strings in Elisp; strings are by far the most
+;; common), in such a way that both storage and retrieval are space- and
+;; time-efficient. But, more importantly, a variety of more advanced queries
+;; can also be performed efficiently: for example, returning all strings with
+;; a given prefix, searching for keys matching a given wildcard pattern or
+;; regular expression, or searching for all keys that match any of the above
+;; to within a given Lewenstein distance (though this last is not yet
+;; implemented in this package - code contributions welcome!).
+;;
+;; You create a trie using `make-trie', create an association using
+;; `trie-insert', retrieve an association using `trie-lookup', and map over a
+;; trie using `trie-map', `trie-mapc', `trie-mapcar', or `trie-mapf'. You can
+;; find completions of a prefix sequence using `trie-complete', or search for
+;; keys matching a regular expression using `trie-regexp-search'. Using
+;; `trie-stack', you can create an object that allows the contents of the trie
+;; to be used like a stack, useful for building other algorithms on top of
+;; tries; `trie-stack-pop' pops elements off the stack one-by-one, in
+;; "lexical" order, whilst `trie-stack-push' pushes things onto the
+;; stack. Similarly, `trie-complete-stack', and `trie-regexp-stack' create
+;; "lexically-ordered" stacks of query results.
+;;
+;; Note that there are two uses for a trie: as a lookup table, in which case
+;; only the presence or absence of a key in the trie is significant, or as an
+;; associative array, in which case each key carries some associated
+;; data. Libraries for other data structure often only implement lookup
+;; tables, leaving it up to you to implement an associative array on top of
+;; this (by storing key+data pairs in the data structure's keys, then defining
+;; a comparison function that only compares the key part). For a trie,
+;; however, the underlying data structures naturally support associative
+;; arrays at no extra cost, so this package does the opposite: it implements
+;; associative arrays, and leaves it up to you to use them as lookup tables if
+;; you so desire.
+;;
+;;
+;; Different Types of Trie
+;; -----------------------
+;; There are numerous ways to implement trie data structures internally, each
+;; with its own time- and space-efficiency trade-offs. By viewing a trie as a
+;; tree whose nodes are themselves lookup tables for key elements, this
+;; package is able to support all types of trie in a uniform manner. This
+;; relies on there existing (or you writing!) an Elisp implementation of the
+;; corresponding type of lookup table. The best type of trie to use will
+;; depend on what trade-offs are appropriate for your particular
+;; application. The following gives an overview of the advantages and
+;; disadvantages of various types of trie. (Not all of the underlying lookup
+;; tables have been implemented in Elisp yet, so using some of the trie types
+;; described below would require writing the missing Elisp package!)
+;;
+;;
+;; One of the most effective all-round implementations of a trie is a ternary
+;; search tree, which can be viewed as a tree of binary trees. If basic binary
+;; search trees are used for the nodes of the trie, we get a standard ternary
+;; search tree. If self-balancing binary trees are used (e.g. AVL or red-black
+;; trees), we get a self-balancing ternary search tree. If splay trees are
+;; used, we get yet another self-organising variant of a ternary search
+;; tree. All ternary search trees have, in common, good space-efficiency. The
+;; time-efficiency of the various trie operations is also good, assuming the
+;; underlying binary trees are balanced. Under that assumption, all variants
+;; of ternary search trees described below have the same asymptotic
+;; time-complexity for all trie operations.
+;;
+;; Self-balancing trees ensure the underlying binary trees are always close to
+;; perfectly balanced, with the usual trade-offs between the different the
+;; types of self-balancing binary tree: AVL trees are slightly more efficient
+;; for lookup operations than red-black trees, at a cost of slightly less
+;; efficienct insertion operations, and less efficient deletion
+;; operations. Splay trees give good average-case complexity and are simpler
+;; to implement than AVL or red-black trees (which can mean they're faster in
+;; practice!), at the expense of poor worst-case complexity.
+;;
+;; If your tries are going to be static (i.e. created once and rarely
+;; modified), then using perfectly balanced binary search trees might be
+;; appropriate. Perfectly balancing the binary trees is very inefficient, but
+;; it only has to be when the trie is first created or modified. Lookup
+;; operations will then be as efficient as possible for ternary search trees,
+;; and the implementation will also be simpler (so probably faster) than a
+;; self-balancing tree, without the space and time overhead required to keep
+;; track of rebalancing.
+;;
+;; On the other hand, adding data to a binary search tree in a random order
+;; usually results in a reasonably balanced tree. If this is the likely
+;; scenario, using a basic binary tree without bothering to balance it at all
+;; might be quite efficient, and, being even simpler to implement, could be
+;; quite fast overall.
+;;
+;;
+;; A digital trie is a different implementation of a trie, which can be viewed
+;; as a tree of arrays, and has different space- and time-complexities than a
+;; ternary search tree. Roughly speaking, a digital trie has worse
+;; space-complexity, but better time-complexity. Using hash tables instead of
+;; arrays for the nodes gives something similar to a digital trie, potentially
+;; with better space-complexity and the same amortised time-complexity, but at
+;; the expense of occasional significant inefficiency when inserting and
+;; deleting (whenever a hash table has to be resized). Indeed, an array can be
+;; viewed as a perfect hash table, but as such it requires the number of
+;; possible values to be known in advance.
+;;
+;; Finally, if you really need optimal efficiency from your trie, you could
+;; even write a custom type of underlying lookup table, optimised for your
+;; specific needs.
+;;
+;; This package uses the AVL tree package avl-tree.el, the tagged NFA package
+;; tNFA.el, and the heap package heap.el.
+
+
+;;; Code:
+
+(eval-when-compile (require 'cl))
+(require 'avl-tree)
+(require 'heap)
+(require 'tNFA)
+
+
+
+;;; ================================================================
+;;;                   Pre-defined trie types
+
+(defconst trie--types '(avl))
+
+
+;; --- avl-tree ---
+(put 'avl :trie-createfun
+     (lambda (cmpfun seq) (avl-tree-create cmpfun)))
+(put 'avl :trie-insertfun 'avl-tree-enter)
+(put 'avl :trie-deletefun 'avl-tree-delete)
+(put 'avl :trie-lookupfun 'avl-tree-member)
+(put 'avl :trie-mapfun 'avl-tree-mapc)
+(put 'avl :trie-emptyfun 'avl-tree-empty)
+(put 'avl :trie-stack-createfun 'avl-tree-stack)
+(put 'avl :trie-stack-popfun 'avl-tree-stack-pop)
+(put 'avl :trie-stack-emptyfun 'avl-tree-stack-empty-p)
+(put 'avl :trie-transform-for-print 'trie--avl-transform-for-print)
+(put 'avl :trie-transform-from-read 'trie--avl-transform-from-read)
+
+
+
+;;; ================================================================
+;;;           Internal utility functions and macros
+
+;;; ----------------------------------------------------------------
+;;;           Functions and macros for handling a trie.
+
+;; symbol used to denote a trie leaf node
+(defconst trie--terminator '--trie--terminator)
+
+(defstruct
+  (trie-
+   :named
+   (:constructor nil)
+   (:constructor trie--create
+                (comparison-function &optional (type 'avl)
+                 &aux
+                 (dummy
+                  (or (memq type trie--types)
+                      (error "trie--create: unknown trie TYPE, %s" type)))
+                 (createfun (get type :trie-createfun))
+                 (insertfun (get type :trie-insertfun))
+                 (deletefun (get type :trie-deletefun))
+                 (lookupfun (get type :trie-lookupfun))
+                 (mapfun (get type :trie-mapfun))
+                 (emptyfun (get type :trie-emptyfun))
+                 (stack-createfun (get type :trie-stack-createfun))
+                 (stack-popfun (get type :trie-stack-popfun))
+                 (stack-emptyfun (get type :trie-stack-emptyfun))
+                 (transform-for-print (get type :trie-transform-for-print))
+                 (transform-from-read (get type :trie-transform-from-read))
+                 (cmpfun (trie--wrap-cmpfun comparison-function))
+                 (root (trie--node-create-root createfun cmpfun))
+                 ))
+   (:constructor trie--create-custom
+                (comparison-function
+                 &key
+                 (createfun 'avl-tree-create-bare)
+                 (insertfun 'avl-tree-enter)
+                 (deletefun 'avl-tree-delete)
+                 (lookupfun 'avl-tree-member)
+                 (mapfun 'avl-tree-mapc)
+                 (emptyfun 'avl-tree-empty)
+                 (stack-createfun 'avl-tree-stack)
+                 (stack-popfun 'avl-tree-stack-pop)
+                 (stack-emptyfun 'avl-tree-stack-empty-p)
+                 (transform-for-print 'trie--avl-transform-for-print)
+                 (transform-from-read 'trie--avl-transform-from-read)
+                 &aux
+                 (cmpfun (trie--wrap-cmpfun comparison-function))
+                 (root (trie--node-create-root createfun cmpfun))
+                 ))
+   (:copier nil))
+  root comparison-function cmpfun
+  createfun insertfun deletefun lookupfun mapfun emptyfun
+  stack-createfun stack-popfun stack-emptyfun
+  transform-for-print transform-from-read print-form)
+
+
+(defun trie--wrap-cmpfun (cmpfun)
+  ;; wrap CMPFUN for use in a subtree
+  `(lambda (a b)
+     (setq a (trie--node-split a)
+          b (trie--node-split b))
+     (cond ((eq a trie--terminator)
+           (if (eq b trie--terminator) nil t))
+          ((eq b trie--terminator) nil)
+          (t (,cmpfun a b)))))
+
+
+(defun trie--construct-equality-function (comparison-function)
+  ;; create equality function from trie comparison function
+  `(lambda (a b)
+     (and (not (,comparison-function a b))
+         (not (,comparison-function b a)))))
+
+
+
+;;; ----------------------------------------------------------------
+;;;          Functions and macros for handling a trie node.
+
+(defstruct
+  (trie--node
+   (:type vector)
+   (:constructor nil)
+   (:constructor trie--node-create
+                (split seq trie
+                 &aux (subtree (funcall (trie--createfun trie)
+                                        (trie--cmpfun trie) seq))))
+   (:constructor trie--node-create-data
+                (data &aux (split trie--terminator) (subtree data)))
+   (:constructor trie--node-create-dummy
+                (split &aux (subtree nil)))
+   (:constructor trie--node-create-root
+                (createfun cmpfun
+                 &aux
+                 (split nil)
+                 (subtree (funcall createfun cmpfun []))))
+   (:copier nil))
+   split subtree)
+
+;; data is stored in the subtree cell of a terminal node
+(defalias 'trie--node-data 'trie--node-subtree)
+
+(defsetf trie--node-data (node) (data)
+  `(setf (trie--node-subtree ,node) ,data))
+
+(defmacro trie--node-data-p (node)
+  ;; Return t if NODE is a data node, nil otherwise.
+  `(eq (trie--node-split ,node) trie--terminator))
+
+(defmacro trie--node-p (node)
+  ;; Return t if NODE is a TRIE trie--node, nil otherwise.  Have to
+  ;; define this ourselves, because we created a defstruct without any
+  ;; identifying tags (i.e. (:type vector)) for efficiency, but this
+  ;; means we can only perform a rudimentary and very unreliable test.
+  `(and (vectorp ,node) (= (length ,node) 2)))
+
+
+(defun trie--node-find (node seq lookupfun)
+  ;; Returns the node below NODE corresponding to SEQ, or nil if none
+  ;; found.
+  (let ((len (length seq))
+       (i -1))
+    ;; descend trie until we find SEQ or run out of trie
+    (while (and node (< (incf i) len))
+      (setq node
+           (funcall lookupfun
+                    (trie--node-subtree node)
+                    (trie--node-create-dummy (elt seq i))
+                    nil)))
+    node))
+
+
+(defmacro trie--find-data-node (node lookupfun)
+  ;; Return data node from NODE's subtree, or nil if NODE has no data
+  ;; node in its subtree.
+  `(funcall ,lookupfun
+           (trie--node-subtree ,node)
+           (trie--node-create-dummy trie--terminator)
+           nil))
+
+
+(defmacro trie--find-data (node lookupfun)
+  ;; Return data associated with sequence corresponding to NODE, or nil
+  ;; if sequence has no associated data.
+  `(let ((node (trie--find-data-node ,node ,lookupfun)))
+     (when node (trie--node-data node))))
+
+
+
+;;; ----------------------------------------------------------------
+;;;              print/read transformation functions
+
+(defun trie-transform-for-print (trie)
+  "Transform TRIE to print form."
+  (when (trie--transform-for-print trie)
+    (if (trie--print-form trie)
+       (warn "Trie has already been transformed to print-form")
+      (funcall (trie--transform-for-print trie) trie)
+      (setf (trie--print-form trie) t))))
+
+
+(defun trie-transform-from-read (trie)
+  "Transform TRIE from print form."
+  (when (trie--transform-from-read trie)
+    (if (not (trie--print-form trie))
+       (warn "Trie is not in print-form")
+      (funcall (trie--transform-from-read trie) trie)
+      (setf (trie--print-form trie) nil))))
+
+
+(defmacro trie-transform-from-read-warn (trie)
+  "Transform TRIE from print form, with warning."
+  `(when (trie--print-form ,trie)
+     (warn (concat "Attempt to operate on trie in print-form;\
+ converting to normal form"))
+     (trie-transform-from-read ,trie)))
+
+
+(defun trie--avl-transform-for-print (trie)
+  ;; transform avl-tree based TRIE to print form.
+  (trie-mapc-internal
+   (lambda (avl seq) (setf (avl-tree--cmpfun avl) nil))
+   trie))
+
+
+(defun trie--avl-transform-from-read (trie)
+  ;; transform avl-tree based TRIE from print form."
+  (let ((--trie-avl-transform--cmpfun (trie--cmpfun trie)))
+    (trie-mapc-internal
+     (lambda (avl seq)
+       (setf (avl-tree--cmpfun avl) --trie-avl-transform--cmpfun))
+     trie)))
+
+
+
+;;; ----------------------------------------------------------------
+;;;                Replacements for CL functions
+
+;; copied from cl-extra.el
+(defun trie--subseq (seq start &optional end)
+  "Return the subsequence of SEQ from START to END.
+If END is omitted, it defaults to the length of the sequence.
+If START or END is negative, it counts from the end."
+  (if (stringp seq) (substring seq start end)
+    (let (len)
+      (and end (< end 0) (setq end (+ end (setq len (length seq)))))
+      (when (< start 0)
+       (setq start (+ start (or len (setq len (length seq))))))
+      (cond ((listp seq)
+            (if (> start 0) (setq seq (nthcdr start seq)))
+            (if end
+                (let ((res nil))
+                  (while (>= (setq end (1- end)) start)
+                    (push (pop seq) res))
+                  (nreverse res))
+              (copy-sequence seq)))
+           (t
+            (or end (setq end (or len (length seq))))
+            (let ((res (make-vector (max (- end start) 0) nil))
+                  (i 0))
+              (while (< start end)
+                (aset res i (aref seq start))
+                (setq i (1+ i) start (1+ start)))
+              res))))))
+
+
+(defun trie--position (item list)
+  "Find the first occurrence of ITEM in LIST.
+Return the index of the matching item, or nil of not found.
+Comparison is done with 'equal."
+  (let ((i 0))
+    (catch 'found
+      (while (progn
+              (when (equal item (car list)) (throw 'found i))
+              (setq i (1+ i))
+              (setq list (cdr list))))
+      nil)))
+
+
+(defsubst trie--seq-append (seq el)
+  "Append EL to the end of sequence SEQ."
+  (cond
+   ((stringp seq) (concat seq (string el)))
+   ((vectorp seq) (vconcat seq (vector el)))
+   ((listp seq)          (append seq (list el)))))
+
+
+(defsubst trie--seq-concat (seq &rest sequences)
+  "Concatenate SEQ and SEQUENCES, and make the result the same
+type of sequence as SEQ."
+  (cond
+   ((stringp seq) (apply 'concat  seq sequences))
+   ((vectorp seq) (apply 'vconcat seq sequences))
+   ((listp seq)          (apply 'append  seq sequences))))
+
+
+
+
+;;; ================================================================
+;;;                     Basic trie operations
+
+;;;###autoload
+(defalias 'make-trie 'trie--create
+  "Return a new trie that uses comparison function COMPARISON-FUNCTION.
+
+A trie stores sequences (strings, vectors or lists) along with
+associated data. COMPARISON-FUNCTEION should accept two
+arguments, each being an element of such a sequence, and return t
+if the first is strictly smaller than the second.
+
+The optional argument TYPE specifies the type of trie to
+create. However, the only one that is currently implemented is
+the default, so this argument is useless for now.
+
+(See also `make-trie-custom'.)")
+
+
+;;;###autoload
+(defalias 'trie-create 'make-trie)
+
+
+;;;###autoload
+(defalias 'make-trie-custom 'trie--create-custom
+  "Return a new trie that uses comparison function COMPARISON-FUNCTION.
+
+A trie stores sequences (strings, vectors or lists) along with
+associated data. COMPARISON-FUNCTION should accept two arguments,
+each being an element of such a sequence, and return t if the
+first is strictly smaller than the second.
+
+The remaining keyword arguments: :CREATEFUN, :INSERTFUN, :DELETEFUN,
+:LOOKUPFUN, :MAPFUN, :EMPTYFUN, :STACK-CREATEFUN, :STACK-POPFUN,
+:STACK-EMPTYFUN, :TRANSFORM-FOR-PRINT and :TRANSFORM-FROM-READ
+determine the type of trie that is created.
+
+CREATEFUN is called as follows:
+
+  (CREATEFUN COMPARISON-FUNCTION SEQ)
+
+and should return a data structure (\"ARRAY\") that can be used
+as an associative array, where two elements A and B are equal if
+the following is non-nil:
+
+  (and (COMPARISON-FUNCTION b a)
+       (COMPARISON-FUNCTION b a))
+
+The SEQ argument is a vector containing the sequence that will
+correspond to the newly created array in the trie. For most types
+of trie, this value is ignored. It is passed to CREATEFUN only in
+order to allow the creation of \"hybrid\" trie structures, in
+which different types of associative array are used in different
+parts of the trie. For example, the type of associative array
+could be chosen based on the depth in the trie, given by \(length
+SEQ\). (Note that all the other functions described below must be
+able to correctly handle *any* of the types of associate array
+that might be created by CREATEFUN.)
+
+INSERTFUN, DELETEFUN, LOOKUPFUN, MAPFUN and EMPTYFUN should
+insert, delete, lookup, map over, and check-if-there-exist-any
+elements in an associative array. They are called as follows:
+
+  (INSERTFUN array element &optional updatefun)
+  (DELETEFUN array element &optional predicate nilflag)
+  (LOOKUPFUN array element &optional nilflag)
+  (MAPFUN function array &optional reverse)
+  (EMPTYFUN array)
+
+INSERTFUN should insert ELEMENT into ARRAY and return the new
+element, which will be ELEMENT itself unless UPDATEFUN is
+specified. In that case, if and only if an element matching
+ELEMENT already exists in the associative array, INSERTFUN should
+instead pass ELEMENT and the matching element as arguments to
+UPDATEFUN, replace the matching element with the return value,
+and return that return value.
+
+DELETEFUN should delete the element in the associative array that
+matches ELEMENT, and return the deleted element. However, if
+PREDICATE is specified and a matching element exists in ARRAY,
+DELETEFUN should first pass the matching element as an argument
+to PREDICATE before deleting, and should only delete the element
+if PREDICATE returns non-nil. DELETEFUN should return NILFLAG if
+no element was deleted (either becuase no matching element was
+found, or because TESTFUN returned nil).
+
+LOOKUPFUN should return the element from the associative array
+that matches ELEMENT, or NILFLAG if no matching element exists.
+
+MAPFUN should map FUNCTION over all elements in the order defined by
+COMPARISON-FUNCTION, or in reverse order if REVERSE is non-nil.
+
+
+STACK-CREATEFUN, STACK-POPFUN and STACK-EMPTYFUN should allow the
+associative array to be used as a stack. STACK-CREATEFUN is
+called as follows:
+
+  (STACK-CREATEFUN array)
+
+and should return a data structure (\"STACK\") that behaves like
+a sorted stack of all elements in the associative array. I.e.
+successive calls to
+
+  (STACK-POPFUN stack)
+
+should return elements from the associative array in the order
+defined by COMPARISON-FUNCTION, and
+
+  (STACK-EMPTYFUN stack)
+
+should return non-nil if the stack is empty, nil otherwise.
+
+The stack functions are optional, in that all trie operations
+other than the stack-related ones will work correctly. However,
+any code that makes use of trie-stacks will complain if supplied
+with this type of trie.
+
+
+The :TRANSFORM-FOR-PRINT and :TRANSFORM-FROM-READ arguments are
+optional. If supplied, they can be used to transform the trie
+into a format suitable for passing to Elisp's `print'
+functions (typically used to persistently store the trie by
+writing it to file), and transform from that format back to the
+original usable form.
+
+
+Warning: to avoid nasty dynamic scoping bugs, the supplied
+functions must *never* bind any variables with names commencing
+\"--\".")
+
+
+;;;###autoload
+(defalias 'trie-create-custom 'make-trie-custom)
+
+
+
+(defalias 'trie-comparison-function 'trie--comparison-function
+  "Return the comparison function for TRIE.")
+
+
+(defalias 'trie-p 'trie--p
+  "Return t if argument is a trie, nil otherwise.")
+
+
+(defun trie-empty (trie)
+  "Return t if the TRIE is empty, nil otherwise."
+  (trie-transform-from-read-warn trie)
+  (funcall (trie--emptyfun trie)
+          (trie--node-subtree (trie--root trie))))
+
+
+(defun trie-construct-sortfun (cmpfun &optional reverse)
+  "Construct function to compare key sequences, based on a CMPFUN
+that compares individual elements of the sequence. Order is
+reversed if REVERSE is non-nil."
+  (if reverse
+      `(lambda (a b)
+        (let (cmp)
+          (catch 'compared
+            (dotimes (i (min (length a) (length b)))
+              (cond ((,cmpfun (elt b i) (elt a i))
+                     (throw 'compared t))
+                    ((,cmpfun (elt a i) (elt b i))
+                     (throw 'compared nil))))
+            (< (length a) (length b)))))
+    `(lambda (a b)
+       (let (cmp)
+        (catch 'compared
+          (dotimes (i (min (length a) (length b)))
+            (cond ((,cmpfun (elt a i) (elt b i))
+                   (throw 'compared t))
+                  ((,cmpfun (elt b i) (elt a i))
+                   (throw 'compared nil))))
+          (< (length a) (length b)))))))
+
+
+
+;; ----------------------------------------------------------------
+;;                        Inserting data
+
+(defun trie-insert (trie key &optional data updatefun)
+  "Associate DATA with KEY in TRIE.
+
+If KEY already exists in TRIE, then DATA replaces the existing
+association, unless UPDATEFUN is supplied. Note that if DATA is
+*not* supplied, this means that the existing association of KEY
+will be replaced by nil.
+
+If UPDATEFUN is supplied and KEY already exists in TRIE,
+UPDATEFUN is called with two arguments: DATA and the existing
+association of KEY. Its return value becomes the new association
+for KEY.
+
+Returns the new association of KEY.
+
+Note: to avoid nasty dynamic scoping bugs, UPDATEFUN must *not*
+bind any variables with names commencing \"--\"."
+
+  ;; convert trie from print-form if necessary
+  (trie-transform-from-read-warn trie)
+
+  ;; absurd variable names are an attempt to avoid dynamic scoping bugs
+  (let ((--trie-insert--updatefun updatefun)
+       --trie-insert--old-node-flag
+       (node (trie--root trie))
+       (len (length key))
+       (i -1))
+    ;; Descend trie, adding nodes for non-existent elements of KEY. The
+    ;; update function passed to `trie--insertfun' ensures that existing
+    ;; nodes are left intact.
+    (while (< (incf i) len)
+      (setq --trie-insert--old-node-flag nil)
+      (setq node (funcall (trie--insertfun trie)
+                         (trie--node-subtree node)
+                         (trie--node-create (elt key i) key trie)
+                         (lambda (a b)
+                           (setq --trie-insert--old-node-flag t) b))))
+    ;; Create or update data node.
+    (setq node (funcall (trie--insertfun trie)
+                       (trie--node-subtree node)
+                       (trie--node-create-data data)
+                       ;; if using existing data node, wrap UPDATEFUN
+                       ;; if any was supplied
+                       (when (and --trie-insert--old-node-flag
+                                  --trie-insert--updatefun)
+                         (lambda (new old)
+                           (setf (trie--node-data old)
+                                 (funcall --trie-insert--updatefun
+                                          (trie--node-data new)
+                                          (trie--node-data old)))
+                           old))))
+    (trie--node-data node)))  ; return new data
+
+
+
+;; ----------------------------------------------------------------
+;;                        Deleting data
+
+(defun trie-delete (trie key &optional test)
+  "Delete KEY and its associated data from TRIE.
+
+If KEY was deleted, a cons cell containing KEY and its
+association is returned. Returns nil if KEY does not exist in
+TRIE.
+
+If TEST is supplied, it should be a function that accepts two
+arguments: the key being deleted, and its associated data. The
+key will then only be deleted if TEST returns non-nil.
+
+Note: to avoid nasty dynamic scoping bugs, TEST must *not* bind
+any variables with names commencing \"--\"."
+  ;; convert trie from print-form if necessary
+  (trie-transform-from-read-warn trie)
+  ;; set up deletion (real work is done by `trie--do-delete'
+  (let (--trie-deleted--node
+       (--trie-delete--key key))
+    (declare (special --trie-deleted--node)
+            (special --trie-delete--key))
+    (trie--do-delete (trie--root trie) key test
+                    (trie--deletefun trie)
+                    (trie--emptyfun trie)
+                    (trie--cmpfun trie))
+    (when --trie-deleted--node
+      (cons key (trie--node-data --trie-deleted--node)))))
+
+
+(defun trie--do-delete (node --trie--do-delete--seq
+                            --trie--do-delete--test
+                            --trie--do-delete--deletefun
+                            --trie--do-delete--emptyfun
+                            --trie--do-delete--cmpfun)
+  ;; Delete --TRIE--DO-DELETE--SEQ starting from trie node NODE, and
+  ;; return non-nil if we deleted a node. If --TRIE--DO-DELETE--TEST is
+  ;; supplied, it is called with two arguments, the key being deleted
+  ;; and the associated data, and the deletion is only carried out if it
+  ;; returns non-nil.
+
+  ;; The absurd argument names are to lessen the likelihood of dynamical
+  ;; scoping bugs caused by a supplied function binding a variable with
+  ;; the same name as one of the arguments, which would cause a nasty
+  ;; bug when the lambda's (below) are called.
+  (declare (special --trie-deleted--node)
+          (special --trie-delete--key))
+  ;; if --TRIE--DO-DELETE--SEQ is empty, try to delete data node and
+  ;; return non-nil if we did (return value of
+  ;; --TRIE--DO-DELETE--DELETEFUN is the deleted data, which is always
+  ;; non-nil for a trie)
+  (if (= (length --trie--do-delete--seq) 0)
+      (setq --trie-deleted--node
+           (funcall --trie--do-delete--deletefun
+                    (trie--node-subtree node)
+                    (trie--node-create-dummy trie--terminator)
+                    (when --trie--do-delete--test
+                      (lambda (n)
+                        (funcall --trie--do-delete--test
+                                 --trie-delete--key (trie--node-data n))))
+                    nil))
+    ;; otherwise, delete on down (return value of
+    ;; --TRIE--DO-DELETE--DELETEFUN is the deleted data, which is always
+    ;; non-nil for a trie)
+    (funcall --trie--do-delete--deletefun
+            (trie--node-subtree node)
+            (trie--node-create-dummy (elt --trie--do-delete--seq 0))
+            (lambda (n)
+              (and (trie--do-delete
+                    n (trie--subseq --trie--do-delete--seq 1)
+                    --trie--do-delete--test
+                    --trie--do-delete--deletefun
+                    --trie--do-delete--emptyfun
+                    --trie--do-delete--cmpfun)
+                   (funcall --trie--do-delete--emptyfun
+                            (trie--node-subtree n))))
+            nil)))
+
+
+
+;; ----------------------------------------------------------------
+;;                       Retrieving data
+
+(defun trie-lookup (trie key &optional nilflag)
+  "Return the data associated with KEY in the TRIE,
+or nil if KEY does not exist in TRIE.
+
+Optional argument NILFLAG specifies a value to return instead of
+nil if KEY does not exist in TRIE. This allows a non-existent KEY
+to be distinguished from an element with a null association. (See
+also `trie-member-p', which does this for you.)"
+  ;; convert trie from print-form if necessary
+  (trie-transform-from-read-warn trie)
+  ;; find node corresponding to key, then find data node, then return
+  ;; data
+  (let (node)
+    (or (and (setq node (trie--node-find (trie--root trie) key
+                                        (trie--lookupfun trie)))
+            (trie--find-data node (trie--lookupfun trie)))
+       nilflag)))
+
+(defalias 'trie-member 'trie-lookup)
+
+
+(defun trie-member-p (trie key)
+  "Return t if KEY exists in TRIE, nil otherwise."
+  ;; convert trie from print-form if necessary
+  (trie-transform-from-read-warn trie)
+  (let ((flag '(nil)))
+    (not (eq flag (trie-member trie key flag)))))
+
+
+
+
+;;; ================================================================
+;;;                      Mapping over tries
+
+(defun trie--mapc (--trie--mapc--function --trie--mapc--mapfun
+                  --trie--mapc--root --trie--mapc--seq
+                  &optional --trie--mapc--reverse)
+  ;; Apply TRIE--MAPC--FUNCTION to all elements in a trie beneath
+  ;; TRIE--MAPC--ROOT, which should correspond to the sequence
+  ;; TRIE--MAPC--SEQ. TRIE--MAPC--FUNCTION is passed two arguments: the
+  ;; trie node itself and the sequence it corresponds to. It is applied
+  ;; in ascending order, or descending order if TRIE--MAPC--REVERSE is
+  ;; non-nil.
+
+  ;; The absurd argument names are to lessen the likelihood of dynamical
+  ;; scoping bugs caused by a supplied function binding a variable with
+  ;; the same name as one of the arguments.
+  (funcall
+   --trie--mapc--mapfun
+   (lambda (--trie--mapc--node)
+     ;; data node: apply function
+     (if (trie--node-data-p --trie--mapc--node)
+        (funcall --trie--mapc--function
+                 --trie--mapc--node
+                 --trie--mapc--seq)
+       ;; internal node: append split value to seq and keep descending
+       (trie--mapc --trie--mapc--function
+                  --trie--mapc--mapfun
+                  --trie--mapc--node
+                  (trie--seq-append
+                   (copy-sequence --trie--mapc--seq)
+                   (trie--node-split --trie--mapc--node))
+                  --trie--mapc--reverse)))
+   ;; --TRIE--MAPC--MAPFUN target
+   (trie--node-subtree --trie--mapc--root)
+   --trie--mapc--reverse))
+
+
+(defun trie-mapc-internal (function trie &optional type)
+  "Apply FUNCTION to all internal associative arrays within TRIE.
+FUNCTION is passed two arguments: an associative array, and the
+sequence it corresponds to.
+
+Optional argument TYPE (one of the symbols vector, lisp or
+string) sets the type of sequence passed to FUNCTION. Defaults to
+vector."
+  (trie--mapc-internal function (trie--mapfun trie) (trie--root trie)
+                      (cond ((eq type 'string) "")
+                            ((eq type 'lisp) ())
+                            (t []))))
+
+
+(defun trie--mapc-internal (--trie--mapc-internal--function
+                            --trie--mapc-internal--mapfun
+                            --trie--mapc-internal--root
+                            --trie--mapc-internal--seq)
+  (funcall
+   --trie--mapc-internal--mapfun
+   (lambda (--trie--mapc-internal--node)
+     ;; data node
+     (unless (trie--node-data-p --trie--mapc-internal--node)
+       (funcall --trie--mapc-internal--function
+               (trie--node-subtree --trie--mapc-internal--node)
+               --trie--mapc-internal--seq)
+       (trie--mapc-internal
+       --trie--mapc-internal--function
+       --trie--mapc-internal--mapfun
+       --trie--mapc-internal--node
+       (trie--seq-append
+        (copy-sequence --trie--mapc-internal--seq)
+        (trie--node-split --trie--mapc-internal--node)))))
+   (trie--node-subtree --trie--mapc-internal--root)))
+
+
+(defun trie-map (function trie &optional type reverse)
+  "Modify all elements in TRIE by applying FUNCTION to them.
+
+FUNCTION should take two arguments: a sequence stored in the trie
+and its associated data. Its return value replaces the existing
+data.
+
+Optional argument TYPE (one of the symbols vector, lisp or
+string) sets the type of sequence passed to FUNCTION. Defaults to
+vector.
+
+FUNCTION is applied in ascending order, or descending order if
+REVERSE is non-nil.
+
+Note: to avoid nasty dynamic scoping bugs, FUNCTION must *not*
+bind any variables with names commencing \"--\"."
+  ;; convert from print-form if necessary
+  (trie-transform-from-read-warn trie)
+  ;; map FUNCTION over TRIE
+  (let ((--trie-map--function function)) ; avoid dynamic scoping bugs
+    (trie--mapc
+     (lambda (node seq)
+       (setf (trie--node-data node)
+            (funcall --trie-map--function seq (trie--node-data node))))
+     (trie--mapfun trie)
+     (trie--root trie)
+     (cond ((eq type 'string) "") ((eq type 'lisp) ()) (t []))
+     reverse)))
+
+
+(defun trie-mapc (function trie &optional type reverse)
+  "Apply FUNCTION to all elements in TRIE for side effect only.
+
+FUNCTION should take two arguments: a sequence stored in the trie
+and its associated data.
+
+Optional argument TYPE (one of the symbols vector, lisp or
+string) sets the type of sequence passed to FUNCTION. Defaults to
+vector.
+
+FUNCTION is applied in ascending order, or descending order if
+REVERSE is non-nil.
+
+Note: to avoid nasty dynamic scoping bugs, FUNCTION must *not*
+bind any variables with names commencing \"--\"."
+  ;; convert from print-form if necessary
+  (trie-transform-from-read-warn trie)
+  ;; map FUNCTION over TRIE
+  (let ((--trie-mapc--function function)) ; avoid dynamic scoping bugs
+    (trie--mapc
+     (lambda (node seq)
+       (funcall --trie-mapc--function seq (trie--node-data node)))
+     (trie--mapfun trie)
+     (trie--root trie)
+     (cond ((eq type 'string) "") ((eq type 'lisp) ()) (t []))
+     reverse)))
+
+
+(defun trie-mapf (function combinator trie &optional type reverse)
+  "Apply FUNCTION to all elements in TRIE, and combine the results
+using COMBINATOR.
+
+FUNCTION should take two arguments: a sequence stored in the
+trie, and its associated data.
+
+Optional argument TYPE (one of the symbols vector, lisp or
+string; defaults to vector) sets the type of sequence passed to
+FUNCTION. If TYPE is 'string, it must be possible to apply the
+function `string' to the individual elements of key sequences
+stored in TRIE.
+
+The FUNCTION is applied and the results combined in ascending
+order, or descending order if REVERSE is non-nil.
+
+Note: to avoid nasty dynamic scoping bugs, FUNCTION and
+COMBINATOR must *not* bind any variables with names
+commencing \"--\"."
+  ;; convert from print-form if necessary
+  (trie-transform-from-read-warn trie)
+  ;; map FUNCTION over TRIE, combining results with COMBINATOR
+  (let ((--trie-mapf--function function) ; avoid dynamic scoping bugs
+       --trie-mapf--accumulate)
+    (trie--mapc
+     (lambda (node seq)
+       (setq --trie-mapf--accumulate
+            (funcall combinator
+                     (funcall --trie-mapf--function
+                              seq (trie--node-data node))
+                     --trie-mapf--accumulate)))
+     (trie--mapfun trie)
+     (trie--root trie)
+     (cond ((eq type 'string) "") ((eq type 'lisp) ()) (t []))
+     reverse)
+    --trie-mapf--accumulate))
+
+
+(defun trie-mapcar (function trie &optional type reverse)
+  "Apply FUNCTION to all elements in TRIE,
+and make a list of the results.
+
+FUNCTION should take two arguments: a sequence stored in the trie
+and its associated data.
+
+Optional argument TYPE (one of the symbols vector, lisp or
+string) sets the type of sequence passed to FUNCTION. Defaults to
+vector.
+
+The FUNCTION is applied and the list constructed in ascending
+order, or descending order if REVERSE is non-nil.
+
+Note that if you don't care about the order in which FUNCTION is
+applied, just that the resulting list is in the correct order,
+then
+
+  (trie-mapf function 'cons trie type (not reverse))
+
+is more efficient.
+
+Note: to avoid nasty dynamic scoping bugs, FUNCTION must *not*
+bind any variables with names commencing \"--\"."
+  ;; convert from print-form if necessary
+  (trie-transform-from-read-warn trie)
+  ;; map FUNCTION over TRIE and accumulate in a list
+  (nreverse (trie-mapf function 'cons trie type reverse)))
+
+
+
+
+;;; ================================================================
+;;;                    Using tries as stacks
+
+(defstruct (trie--stack
+           (:constructor nil)
+           (:constructor
+            trie--stack-create
+            (trie
+             &optional
+             (type 'vector)
+             reverse
+             &aux
+             (comparison-function (trie--comparison-function trie))
+             (lookupfun (trie--lookupfun trie))
+             (stack-createfun (trie--stack-createfun trie))
+             (stack-popfun (trie--stack-popfun trie))
+             (stack-emptyfun (trie--stack-emptyfun trie))
+             (repopulatefun 'trie--stack-repopulate)
+             (store
+              (if (trie-empty trie)
+                  nil
+                (trie--stack-repopulate
+                 (list (cons
+                        (cond ((eq type 'list) ())
+                              ((eq type 'string) "")
+                              (t []))
+                        (funcall
+                         stack-createfun
+                         (trie--node-subtree (trie--root trie))
+                         reverse)))
+                 reverse
+                 comparison-function lookupfun
+                 stack-createfun stack-popfun stack-emptyfun)))
+             (pushed '())
+             ))
+           (:constructor
+            trie--completion-stack-create
+            (trie prefix
+             &optional
+             reverse
+             &aux
+             (comparison-function (trie--comparison-function trie))
+             (lookupfun (trie--lookupfun trie))
+             (stack-createfun (trie--stack-createfun trie))
+             (stack-popfun (trie--stack-popfun trie))
+             (stack-emptyfun (trie--stack-emptyfun trie))
+             (repopulatefun 'trie--stack-repopulate)
+             (store (trie--completion-stack-construct-store
+                     trie prefix reverse))
+             (pushed '())
+             ))
+           (:constructor
+            trie--regexp-stack-create
+            (trie regexp
+             &optional
+             reverse
+             &aux
+             (comparison-function (trie--comparison-function trie))
+             (lookupfun (trie--lookupfun trie))
+             (stack-createfun (trie--stack-createfun trie))
+             (stack-popfun (trie--stack-popfun trie))
+             (stack-emptyfun (trie--stack-emptyfun trie))
+             (repopulatefun 'trie--regexp-stack-repopulate)
+             (store (trie--regexp-stack-construct-store
+                     trie regexp reverse))
+             (pushed '())
+             ))
+           (:copier nil))
+  reverse comparison-function lookupfun
+  stack-createfun stack-popfun stack-emptyfun
+  repopulatefun store pushed)
+
+
+(defun trie-stack (trie &optional type reverse)
+  "Return an object that allows TRIE to be accessed as a stack.
+
+The stack is sorted in \"lexical\" order, i.e. the order defined
+by the trie's comparison function, or in reverse order if REVERSE
+is non-nil. Calling `trie-stack-pop' pops the top element (a key
+and its associated data) from the stack.
+
+Optional argument TYPE (one of the symbols vector, lisp or
+string) sets the type of sequence used for the keys.
+
+Note that any modification to TRIE *immediately* invalidates all
+trie-stacks created before the modification (in particular,
+calling `trie-stack-pop' will give unpredictable results).
+
+Operations on trie-stacks are significantly more efficient than
+constructing a real stack from the trie and using standard stack
+functions. As such, they can be useful in implementing efficient
+algorithms on tries. However, in cases where mapping functions
+`trie-mapc', `trie-mapcar' or `trie-mapf' would be sufficient, it
+is better to use one of those instead."
+  ;; convert trie from print-form if necessary
+  (trie-transform-from-read-warn trie)
+  ;; if stack functions aren't defined for trie type, throw error
+  (if (not (functionp (trie--stack-createfun trie)))
+      (error "Trie type does not support stack operations")
+    ;; otherwise, create and initialise a stack
+    (trie--stack-create trie type reverse)))
+
+
+(defun trie-stack-pop (trie-stack &optional nilflag)
+  "Pop the first element from TRIE-STACK.
+
+Returns nil if the stack is empty, or NILFLAG if specified. (The
+latter allows an empty stack to be distinguished from a null
+element stored in the trie.)"
+  ;; return nilflag if stack is empty
+  (if (trie-stack-empty-p trie-stack)
+      nilflag
+    ;; if elements have been pushed onto the stack, pop those first
+    (if (trie--stack-pushed trie-stack)
+       (pop (trie--stack-pushed trie-stack))
+      ;; otherwise, pop first element from trie-stack and repopulate it
+      (prog1
+         (pop (trie--stack-store trie-stack))
+       (setf (trie--stack-store trie-stack)
+             (funcall (trie--stack-repopulatefun trie-stack)
+                      (trie--stack-store trie-stack)
+                      (trie--stack-reverse trie-stack)
+                      (trie--stack-comparison-function trie-stack)
+                      (trie--stack-lookupfun trie-stack)
+                      (trie--stack-stack-createfun trie-stack)
+                      (trie--stack-stack-popfun trie-stack)
+                      (trie--stack-stack-emptyfun trie-stack)))))))
+
+
+(defun trie-stack-push (element trie-stack)
+  "Push ELEMENT onto TRIE-STACK."
+  (push element (trie--stack-pushed trie-stack)))
+
+
+(defun trie-stack-first (trie-stack &optional nilflag)
+  "Return the first element from TRIE-STACK, without removing it
+from the stack.
+
+Returns nil if the stack is empty, or NILFLAG if specified. (The
+latter allows an empty stack to be distinguished from a null
+element stored in the trie.)"
+  ;; return nilflag if stack is empty
+  (if (trie-stack-empty-p trie-stack)
+      nilflag
+    ;; if elements have been pushed onto the stack, return first of
+    ;; those
+    (if (trie--stack-pushed trie-stack)
+       (car (trie--stack-pushed trie-stack))
+      ;; otherwise, return first element from trie-stack
+      (car (trie--stack-store trie-stack)))))
+
+
+(defalias 'trie-stack-p 'trie--stack-p
+  "Return t if argument is a trie-stack, nil otherwise.")
+
+
+(defun trie-stack-empty-p (trie-stack)
+  "Return t if TRIE-STACK is empty, nil otherwise."
+  (and (null (trie--stack-store trie-stack))
+       (null (trie--stack-pushed trie-stack))))
+
+
+(defun trie--stack-repopulate
+  (store reverse comparison-function lookupfun
+        stack-createfun stack-popfun stack-emptyfun)
+  ;; Recursively push children of the node at the head of STORE onto the
+  ;; front of STORE, until a data node is reached.
+
+  ;; nothing to do if stack is empty
+  (when store
+    (let ((node (funcall stack-popfun (cdar store)))
+         (seq (caar store)))
+      (when (funcall stack-emptyfun (cdar store))
+       ;; (pop store) here produces irritating compiler warnings
+       (setq store (cdr store)))
+
+      (while (not (trie--node-data-p node))
+       (push
+        (cons (trie--seq-append seq (trie--node-split node))
+              (funcall stack-createfun
+                       (trie--node-subtree node) reverse))
+        store)
+       (setq node (funcall stack-popfun (cdar store))
+             seq (caar store))
+       (when (funcall stack-emptyfun (cdar store))
+         ;; (pop store) here produces irritating compiler warnings
+         (setq store (cdr store))))
+
+      (push (cons seq (trie--node-data node)) store))))
+
+
+
+
+;; ================================================================
+;;                   Query-building utility macros
+
+;; Implementation Note
+;; -------------------
+;; For queries ranked in anything other than lexical order, we use a
+;; partial heap-sort to find the k=MAXNUM highest ranked matches among
+;; the n possibile matches. This has worst-case time complexity
+;; O(n log k), and is both simple and elegant. An optimal algorithm
+;; (e.g. partial quick-sort discarding the irrelevant partition at each
+;; step) would have complexity O(n + k log k), but is probably not worth
+;; the extra coding effort, and would have worse space complexity unless
+;; coded to work "in-place", which would be highly non-trivial. (I
+;; haven't done any benchmarking, though, so feel free to do so and let
+;; me know the results!)
+
+(defmacro trie--construct-accumulator (maxnum filter resultfun)
+  ;; Does what it says on the tin! | sed -e 's/tin/macro name/'
+  `(cond
+    ;; filter, maxnum, resultfun
+    ((and ,filter ,maxnum ,resultfun)
+     (lambda (seq data)
+       (when (funcall ,filter seq data)
+        (aset trie--accumulate 0
+              (cons (funcall ,resultfun seq data)
+                    (aref trie--accumulate 0)))
+        (and (>= (length (aref trie--accumulate 0)) ,maxnum)
+             (throw 'trie-accumulate--done nil)))))
+    ;; filter, maxnum, !resultfun
+    ((and ,filter ,maxnum (not ,resultfun))
+     (lambda (seq data)
+       (when (funcall ,filter seq data)
+        (aset trie--accumulate 0
+              (cons (cons seq data)
+                    (aref trie--accumulate 0)))
+        (and (>= (length (aref trie--accumulate 0)) ,maxnum)
+             (throw 'trie-accumulate--done nil)))))
+    ;; filter, !maxnum, resultfun
+    ((and ,filter (not ,maxnum) ,resultfun)
+     (lambda (seq data)
+       (when (funcall ,filter seq data)
+        (aset trie--accumulate 0
+              (cons (funcall ,resultfun seq data)
+                    (aref trie--accumulate 0))))))
+    ;; filter, !maxnum, !resultfun
+    ((and ,filter (not ,maxnum) (not ,resultfun))
+     (lambda (seq data)
+       (when (funcall ,filter seq data)
+        (aset trie--accumulate 0
+              (cons (cons seq data)
+                    (aref trie--accumulate 0))))))
+    ;; !filter, maxnum, resultfun
+    ((and (not ,filter) ,maxnum ,resultfun)
+     (lambda (seq data)
+       (aset trie--accumulate 0
+            (cons (funcall ,resultfun seq data)
+                  (aref trie--accumulate 0)))
+       (and (>= (length (aref trie--accumulate 0)) ,maxnum)
+           (throw 'trie-accumulate--done nil))))
+    ;; !filter, maxnum, !resultfun
+    ((and (not ,filter) ,maxnum (not ,resultfun))
+     (lambda (seq data)
+       (aset trie--accumulate 0
+            (cons (cons seq data)
+                  (aref trie--accumulate 0)))
+       (and (>= (length (aref trie--accumulate 0)) ,maxnum)
+           (throw 'trie-accumulate--done nil))))
+    ;; !filter, !maxnum, resultfun
+    ((and (not ,filter) (not ,maxnum) ,resultfun)
+     (lambda (seq data)
+       (aset trie--accumulate 0
+            (cons (funcall ,resultfun seq data)
+                  (aref trie--accumulate 0)))))
+    ;; !filter, !maxnum, !resultfun
+    ((and (not ,filter) (not ,maxnum) (not ,resultfun))
+     (lambda (seq data)
+       (aset trie--accumulate 0
+            (cons (cons seq data)
+                  (aref trie--accumulate 0)))))
+    ))
+
+
+
+(defmacro trie--construct-ranked-accumulator (maxnum filter)
+  ;; Does what it says on the tin! | sed -e 's/tin/macro name/'
+  `(cond
+    ;; filter, maxnum
+    ((and ,filter ,maxnum)
+     (lambda (seq data)
+       (when (funcall ,filter seq data)
+        (heap-add trie--accumulate (cons seq data))
+        (and (> (heap-size trie--accumulate) ,maxnum)
+             (heap-delete-root trie--accumulate)))))
+    ;; filter, !maxnum
+    ((and ,filter (not ,maxnum))
+     (lambda (seq data)
+       (when (funcall ,filter seq data)
+        (heap-add trie--accumulate (cons seq data)))))
+    ;; !filter, maxnum
+    ((and (not ,filter) ,maxnum)
+     (lambda (seq data)
+       (heap-add trie--accumulate (cons seq data))
+       (and (> (heap-size trie--accumulate) ,maxnum)
+           (heap-delete-root trie--accumulate))))
+    ;; !filter, !maxnum
+    ((and (not ,filter) (not ,maxnum))
+     (lambda (seq data)
+       (heap-add trie--accumulate (cons seq data))))))
+
+
+
+(defmacro trie--accumulate-results
+  (rankfun maxnum reverse filter resultfun accfun duplicates &rest body)
+  ;; Accumulate results of running BODY code, and return them in
+  ;; appropriate order. BODY should call ACCFUN to accumulate a result,
+  ;; passing it two arguments: a trie data node, and the corresponding
+  ;; sequence. BODY can throw 'trie-accumulate--done to terminate the
+  ;; accumulation and return the results. A non-null DUPLICATES flag
+  ;; signals that the accumulated results might contain duplicates,
+  ;; which should be deleted. Note that DUPLICATES is ignored if RANKFUN
+  ;; is null. The other arguments should be passed straight through from
+  ;; the query function.
+
+  ;; rename functions to help avoid dynamic-scoping bugs
+  `(let* ((--trie-accumulate--rankfun ,rankfun)
+         (--trie-accumulate--filter ,filter)
+         (--trie-accumulate--resultfun ,resultfun)
+         ;; construct structure in which to accumulate results
+         (trie--accumulate
+          (if ,rankfun
+              (heap-create  ; heap order is inverse of rank order
+               (if ,reverse
+                   (lambda (a b)
+                     (funcall --trie-accumulate--rankfun a b))
+                 (lambda (a b)
+                   (not (funcall --trie-accumulate--rankfun a b))))
+               (when ,maxnum (1+ ,maxnum)))
+            (make-vector 1 nil)))
+         ;; construct function to accumulate completions
+         (,accfun
+          (if ,rankfun
+              (trie--construct-ranked-accumulator
+               ,maxnum --trie-accumulate--filter)
+            (trie--construct-accumulator
+             ,maxnum --trie-accumulate--filter
+             --trie-accumulate--resultfun))))
+
+     ;; accumulate results
+     (catch 'trie-accumulate--done ,@body)
+
+     ;; return list of completions
+     (cond
+      ;; for a ranked query, extract completions from heap
+      (,rankfun
+       (let (completions)
+        ;; check for and delete duplicates if flag is set
+        (if ,duplicates
+            (while (not (heap-empty trie--accumulate))
+              (if (equal (car (heap-root trie--accumulate))
+                         (caar completions))
+                  (heap-delete-root trie--accumulate)
+                (push (heap-delete-root trie--accumulate)
+                      completions)))
+          ;; skip duplicate checking if flag is not set
+          (while (not (heap-empty trie--accumulate))
+            (if ,resultfun
+                (let ((res (heap-delete-root trie--accumulate)))
+                  (push (funcall ,resultfun (car res) (cdr res))
+                        completions))
+              (push (heap-delete-root trie--accumulate)
+                    completions))))
+        completions))
+
+      ;; for lexical query, reverse result list if MAXNUM supplied
+      (,maxnum (nreverse (aref trie--accumulate 0)))
+      ;; otherwise, just return list
+      (t (aref trie--accumulate 0)))))
+
+
+
+
+;; ================================================================
+;;                          Completing
+
+(defun trie-complete
+  (trie prefix &optional rankfun maxnum reverse filter resultfun)
+  "Return an alist containing all completions of PREFIX in TRIE
+along with their associated data, in the order defined by
+RANKFUN, defaulting to \"lexical\" order (i.e. the order defined
+by the trie's comparison function). If REVERSE is non-nil, the
+completions are sorted in the reverse order. Returns nil if no
+completions are found.
+
+PREFIX must be a sequence (vector, list or string) containing
+elements of the type used to reference data in the trie. (If
+PREFIX is a string, it must be possible to apply `string' to
+individual elements of the sequences stored in the trie.) The
+completions returned in the alist will be sequences of the same
+type as KEY. If PREFIX is a list of sequences, completions of all
+sequences in the list are included in the returned alist. All
+sequences in the list must be of the same type.
+
+The optional integer argument MAXNUM limits the results to the
+first MAXNUM completions. Otherwise, all completions are
+returned.
+
+If specified, RANKFUN must accept two arguments, both cons
+cells. The car contains a sequence from the trie (of the same
+type as PREFIX), the cdr contains its associated data. It should
+return non-nil if first argument is ranked strictly higher than
+the second, nil otherwise.
+
+The FILTER argument sets a filter function for the
+completions. If supplied, it is called for each possible
+completion with two arguments: the completion, and its associated
+data. If the filter function returns nil, the completion is not
+included in the results, and does not count towards MAXNUM.
+
+RESULTFUN defines a function used to process results before
+adding them to the final result list. If specified, it should
+accept two arguments: a key and its associated data. It's return
+value is what gets added to the final result list, instead of the
+default key-data cons cell."
+
+  ;; convert trie from print-form if necessary
+  (trie-transform-from-read-warn trie)
+  ;; wrap prefix in a list if necessary
+  ;; FIXME: the test for a list of prefixes, below, will fail if the
+  ;;        PREFIX sequence is a list, and the elements of PREFIX are
+  ;;        themselves lists (there might be no easy way to fully fix
+  ;;        this...)
+  (if (or (atom prefix)
+         (and (listp prefix) (not (sequencep (car prefix)))))
+      (setq prefix (list prefix))
+    ;; sort list of prefixes if sorting completions lexically
+    (when (null rankfun)
+      (setq prefix
+           (sort prefix (trie-construct-sortfun
+                         (trie--comparison-function trie))))))
+
+  ;; accumulate completions
+  (let (node)
+    (declare (special accumulator))
+    (trie--accumulate-results
+     rankfun maxnum reverse filter resultfun accumulator nil
+     (mapc (lambda (pfx)
+            (setq node (trie--node-find (trie--root trie) pfx
+                                        (trie--lookupfun trie)))
+            (when node
+              (trie--mapc
+               (lambda (node seq)
+                 (funcall accumulator seq (trie--node-data node)))
+               (trie--mapfun trie) node pfx
+               (if maxnum reverse (not reverse)))))
+          prefix))
+    ))
+
+
+
+(defun trie-complete-stack (trie prefix &optional reverse)
+  "Return an object that allows completions of PREFIX to be accessed
+as if they were a stack.
+
+The stack is sorted in \"lexical\" order, i.e. the order defined
+by TRIE's comparison function, or in reverse order if REVERSE is
+non-nil. Calling `trie-stack-pop' pops the top element (a key and
+its associated data) from the stack.
+
+PREFIX must be a sequence (vector, list or string) that forms the
+initial part of a TRIE key, or a list of such sequences. (If
+PREFIX is a string, it must be possible to apply `string' to
+individual elements of TRIE keys.)  The completions returned in
+the alist will be sequences of the same type as KEY. If PREFIX is
+a list of sequences, completions of all sequences in the list are
+included in the stack. All sequences in the list must be of the
+same type.
+
+Note that any modification to TRIE *immediately* invalidates all
+trie-stacks created before the modification (in particular,
+calling `trie-stack-pop' will give unpredictable results).
+
+Operations on trie-stacks are significantly more efficient than
+constructing a real stack from completions of PREFIX in TRIE and
+using standard stack functions. As such, they can be useful in
+implementing efficient algorithms on tries. However, in cases
+where `trie-complete' or `trie-complete-ordered' is sufficient,
+it is better to use one of those instead."
+  ;; convert trie from print-form if necessary
+  (trie-transform-from-read-warn trie)
+  ;; if stack functions aren't defined for trie type, throw error
+  (if (not (functionp (trie--stack-createfun trie)))
+      (error "Trie type does not support stack operations")
+    ;; otherwise, create and initialise a stack
+    (trie--completion-stack-create trie prefix reverse)))
+
+
+(defun trie--completion-stack-construct-store (trie prefix reverse)
+  ;; Construct store for completion stack based on TRIE.
+  (let (store node)
+    (if (or (atom prefix)
+           (and (listp prefix)
+                (not (sequencep (car prefix)))))
+       (setq prefix (list prefix))
+      (setq prefix
+           (sort prefix
+                 (trie-construct-sortfun
+                  (trie--comparison-function trie)
+                  (not reverse)))))
+    (dolist (pfx prefix)
+      (when (setq node (trie--node-find (trie--root trie) pfx
+                                       (trie--lookupfun trie)))
+       (push (cons pfx (funcall (trie--stack-createfun trie)
+                                (trie--node-subtree node)
+                                reverse))
+             store)))
+    (trie--stack-repopulate
+     store reverse
+     (trie--comparison-function trie)
+     (trie--lookupfun trie)
+     (trie--stack-createfun trie)
+     (trie--stack-popfun trie)
+     (trie--stack-emptyfun trie))))
+
+
+
+
+;; ================================================================
+;;                        Regexp search
+
+(defun trie-regexp-search
+  (trie regexp &optional rankfun maxnum reverse filter resultfun type)
+  "Return an alist containing all matches for REGEXP in TRIE
+along with their associated data, in the order defined by
+RANKFUN, defauling to \"lexical\" order (i.e. the order defined
+by the trie's comparison function).  If REVERSE is non-nil, the
+completions are sorted in the reverse order. Returns nil if no
+completions are found.
+
+REGEXP is a regular expression, but it need not necessarily be a
+string. It must be a sequence (vector, list of string) whose
+elements are either elements of the same type as elements of the
+trie keys (which behave as literals in the regexp), or any of the
+usual regexp special characters and backslash constructs. If
+REGEXP is a string, it must be possible to apply `string' to
+individual elements of the keys stored in the trie. The matches
+returned in the alist will be sequences of the same type as KEY.
+
+Only a subset of the full Emacs regular expression syntax is
+supported. There is no support for regexp constructs that are
+only meaningful for strings (character ranges and character
+classes inside character alternatives, and syntax-related
+backslash constructs). Back-references and non-greedy postfix
+operators are not supported, so `?' after a postfix operator
+loses its special meaning. Also, matches are always anchored, so
+`$' and `^' lose their special meanings (use `.*' at the
+beginning and end of the regexp to get an unanchored match).
+
+If the regexp contains any non-shy grouping constructs, subgroup
+match data is included in the results. In this case, the car of
+each match is no longer just a key. Instead, it is a list whose
+first element is the matching key, and whose remaining elements
+are cons cells whose cars and cdrs give the start and end indices
+of the elements that matched the corresponding groups, in order.
+
+The optional integer argument MAXNUM limits the results to the
+first MAXNUM matches. Otherwise, all matches are returned.
+
+If specified, RANKFUN must accept two arguments, both cons
+cells. The car contains a sequence from the trie (of the same
+type as PREFIX), the cdr contains its associated data. It should
+return non-nil if first argument is ranked strictly higher than
+the second, nil otherwise.
+
+The FILTER argument sets a filter function for the matches. If
+supplied, it is called for each possible match with two
+arguments: the matching key, and its associated data. If the
+filter function returns nil, the match is not included in the
+results, and does not count towards MAXNUM.
+
+RESULTFUN defines a function used to process results before
+adding them to the final result list. If specified, it should
+accept two arguments: a key and its associated data. It's return
+value is what gets added to the final result list, instead of the
+default key-data cons cell."
+
+  ;; convert trie from print-form if necessary
+  (trie-transform-from-read-warn trie)
+
+  ;; massage rankfun to cope with grouping data
+  ;; FIXME: could skip this if REGEXP contains no grouping constructs
+  (when rankfun
+    (setq rankfun
+         `(lambda (a b)
+            ;; if car of argument contains a key+group list rather than
+            ;; a straight key, remove group list
+            ;; FIXME: the test for straight key, below, will fail if
+            ;;        the key is a list, and the first element of the
+            ;;        key is itself a list (there might be no easy way
+            ;;        to fully fix this...)
+            (unless (or (atom (car a))
+                        (and (listp (car a))
+                             (not (sequencep (caar a)))))
+              (setq a (cons (caar a) (cdr a))))
+            (unless (or (atom (car b))
+                        (and (listp (car b))
+                             (not (sequencep (caar b)))))
+              (setq b (cons (caar b) (cdr b))))
+            ;; call rankfun on massaged arguments
+            (,rankfun a b))))
+
+  ;; accumulate completions
+  (declare (special accumulator))
+  (trie--accumulate-results
+   rankfun maxnum reverse filter resultfun accumulator nil
+   (trie--do-regexp-search
+    (trie--root trie)
+    (tNFA-from-regexp regexp :test (trie--construct-equality-function
+                                   (trie--comparison-function trie)))
+    (cond ((stringp regexp) "") ((listp regexp) ()) (t []))  0
+    (or (and maxnum reverse) (and (not maxnum) (not reverse)))
+    (trie--comparison-function trie)
+    (trie--lookupfun trie)
+    (trie--mapfun trie))))
+
+
+
+(defun trie--do-regexp-search
+  (--trie--regexp-search--node tNFA seq pos reverse
+                              comparison-function lookupfun mapfun)
+  ;; Search everything below the node --TRIE--REGEXP-SEARCH-NODE for
+  ;; matches to the regexp encoded in tNFA. SEQ is the sequence
+  ;; corresponding to NODE, POS is it's length. REVERSE is the usual
+  ;; query argument, and the remaining arguments are the corresponding
+  ;; trie functions.
+  (declare (special accumulator))
+
+  ;; if NFA has matched and we're accumulating in normal order, check if
+  ;; trie contains current string
+  (when (and (not reverse) (tNFA-match-p tNFA))
+    (let (node groups)
+      (when (setq node (trie--find-data-node
+                       --trie--regexp-search--node lookupfun))
+       (setq groups (tNFA-group-data tNFA))
+       (funcall accumulator
+                (if groups (cons seq groups) seq)
+                (trie--node-data node)))))
+
+  (cond
+   ;; ;; data node
+   ;; ((trie--node-data-p --trie--regexp-search--node)
+   ;;  (when (tNFA-match-p tNFA)
+   ;;    (let ((groups (tNFA-group-data tNFA)))
+   ;;  (funcall accumulator
+   ;;           (if groups (cons seq groups) seq)
+   ;;           (trie--node-data --trie--regexp-search--node)))))
+
+   ;; wildcard transition: map over all nodes in subtree
+   ((tNFA-wildcard-p tNFA)
+    (let (state groups)
+      (funcall mapfun
+              (lambda (node)
+                (unless (trie--node-data-p node)
+                    ;; (when (tNFA-match-p tNFA)
+                    ;;   (setq groups (tNFA-group-data tNFA))
+                    ;;   (funcall accumulator
+                    ;;                 (if groups (cons seq groups) seq)
+                    ;;                 (trie--node-data node)))
+                  (when (setq state (tNFA-next-state
+                                     tNFA (trie--node-split node) pos))
+                    (trie--do-regexp-search
+                     node state
+                     (trie--seq-append seq (trie--node-split node))
+                     (1+ pos) reverse comparison-function
+                     lookupfun mapfun))))
+              (trie--node-subtree --trie--regexp-search--node)
+              reverse)))
+
+   (t ;; no wildcard transition: loop over all transitions
+    (let (node state)
+      (dolist (chr (sort (tNFA-transitions tNFA)
+                        (if reverse
+                            `(lambda (a b) (,comparison-function b a))
+                          comparison-function)))
+       (when (and (setq node (trie--node-find
+                              --trie--regexp-search--node
+                              (vector chr) lookupfun))
+                  (setq state (tNFA-next-state tNFA chr pos)))
+         (trie--do-regexp-search
+          node state (trie--seq-append seq chr) (1+ pos)
+          reverse comparison-function lookupfun mapfun))))))
+
+  ;; if NFA has matched and we're accumulating in reverse order, check if
+  ;; trie contains current string
+  (when (and reverse (tNFA-match-p tNFA))
+    (let (node groups)
+      (when (setq node (trie--find-data-node
+                       --trie--regexp-search--node lookupfun))
+       (setq groups (tNFA-group-data tNFA))
+       (funcall accumulator
+                (if groups (cons seq groups) seq)
+                (trie--node-data node))))))
+
+
+
+(defun trie-regexp-stack  (trie regexp &optional reverse)
+  "Return an object that allows matches to REGEXP to be accessed
+as if they were a stack.
+
+The stack is sorted in \"lexical\" order, i.e. the order defined
+by TRIE's comparison function, or in reverse order if REVERSE is
+non-nil. Calling `trie-stack-pop' pops the top element (a cons
+cell containing a key and its associated data) from the stack.
+
+REGEXP is a regular expression, but it need not necessarily be a
+string. It must be a sequence (vector, list of string) whose
+elements are either elements of the same type as elements of the
+trie keys (which behave as literals in the regexp), or any of the
+usual regexp special characters and backslash constructs. If
+REGEXP is a string, it must be possible to apply `string' to
+individual elements of the keys stored in the trie. The matches
+returned in the alist will be sequences of the same type as KEY.
+
+Back-references and non-greedy postfix operators are *not*
+supported, and the matches are always anchored, so `$' and `^'
+lose their special meanings.
+
+If the regexp contains any non-shy grouping constructs, subgroup
+match data is included in the results. In this case, the car of
+each match (as returned by a call to `trie-stack-pop' is no
+longer just a key. Instead, it is a list whose first element is
+the matching key, and whose remaining elements are cons cells
+whose cars and cdrs give the start and end indices of the
+elements that matched the corresponding groups, in order."
+
+  ;; convert trie from print-form if necessary
+  (trie-transform-from-read-warn trie)
+  ;; if stack functions aren't defined for trie type, throw error
+  (if (not (functionp (trie--stack-createfun trie)))
+      (error "Trie type does not support stack operations")
+    ;; otherwise, create and initialise a regexp stack
+    (trie--regexp-stack-create trie regexp reverse)))
+
+
+(defun trie--regexp-stack-construct-store
+  (trie regexp &optional reverse)
+  ;; Construct store for regexp stack based on TRIE.
+  (let ((seq (cond ((stringp regexp) "") ((listp regexp) ()) (t [])))
+       store)
+    (push (list seq (trie--root trie)
+               (tNFA-from-regexp
+                regexp :test (trie--construct-equality-function
+                              (trie--comparison-function trie)))
+               0)
+         store)
+    (trie--regexp-stack-repopulate
+     store reverse
+     (trie--comparison-function trie)
+     (trie--lookupfun trie)
+     (trie--stack-createfun trie)
+     (trie--stack-popfun trie)
+     (trie--stack-emptyfun trie))))
+
+
+(defun trie--regexp-stack-repopulate
+  (store reverse comparison-function lookupfun
+        stack-createfun stack-popfun stack-emptyfun)
+  ;; Recursively push matching children of the node at the head of STORE
+  ;; onto STORE, until a data node is reached. REVERSE is the usual
+  ;; query argument, and the remaining arguments are the corresponding
+  ;; trie functions.
+  (let (state seq node pos groups n s)
+    (while
+       (progn
+         (setq pos (pop store)
+               seq (nth 0 pos)
+               node (nth 1 pos)
+               state (nth 2 pos)
+               pos (nth 3 pos))
+         (cond
+          ;; if stack is empty, we're done
+          ((null node) nil)
+
+          ;; if stack element is a trie node...
+          ((trie--node-p node)
+           (cond
+            ;; matching data node: add data to the stack and we're done
+            ((trie--node-data-p node)
+             (when (tNFA-match-p state)
+               (setq groups (tNFA-group-data state))
+               (push (cons (if groups (cons groups seq) seq)
+                           (trie--node-data node))
+                     store))
+             nil)  ; return nil to exit loop
+
+            ;; wildcard transition: add new node stack
+            ((tNFA-wildcard-p state)
+             (push (list seq
+                         (funcall stack-createfun
+                                  (trie--node-subtree node) reverse)
+                         state pos)
+                   store))
+
+            (t ;; non-wildcard transition: add all possible next nodes
+             (dolist (chr (sort (tNFA-transitions state)
+                                (if reverse
+                                    comparison-function
+                                  `(lambda (a b)
+                                     (,comparison-function b a)))))
+               (when (and (setq n (trie--node-find
+                                   node (vector chr) lookupfun))
+                          (setq s (tNFA-next-state state chr pos)))
+                 (push (list (trie--seq-append seq chr) n s (1+ pos))
+                       store)))
+             t)))  ; return t to keep looping
+
+          ;; otherwise, stack element is a node stack...
+          (t
+           ;; if node stack is empty, dump it and keep repopulating
+           (if (funcall stack-emptyfun node)
+               t  ; return t to keep looping
+             ;; otherwise, add node stack back, and add next node from
+             ;; stack
+             (push (list seq node state pos) store)
+             (setq node (funcall stack-popfun node)
+                   state (tNFA-next-state state
+                                          (trie--node-split node) pos))
+             (when state
+               ;; matching data node: add data to the stack and we're
+               ;; done
+               (if (trie--node-data-p node)
+                   (progn
+                     (push (cons seq (trie--node-data node)) store)
+                     nil)  ; return nil to exit loop
+                 ;; normal node: add it to the stack and keep
+                 ;; repopulating
+                 (push (list
+                        (trie--seq-append seq (trie--node-split node))
+                        node state (1+ pos))
+                       store)))))
+          ))))
+  store)
+
+
+
+;; ----------------------------------------------------------------
+;;            Pretty-print tries during edebug
+
+;; Note:
+;; -----
+
+;; We advise the `edebug-prin1' and `edebug-prin1-to-string' functions
+;; (actually, aliases) so that they print "#<trie>" instead of the full
+;; print form for tries.
+;;
+;; This is because, if left to its own devices, edebug hangs for ages
+;; whilst printing large tries, and you either have to wait for a *very*
+;; long time for it to finish, or kill Emacs entirely. (Even C-g C-g
+;; fails!)
+;;
+;; We do this also for lists of tries, since those occur quite often,
+;; but not for other sequence types or deeper nested structures, to keep
+;; the implementation as simple as possible.
+;;
+;; Since the print form of a trie is practically incomprehensible
+;; anyway, we don't lose much by doing this. If you *really* want to
+;; print tries in full whilst edebugging, despite this warning, disable
+;; the advice.
+;;
+;; FIXME: We could use `cedet-edebug-prin1-extensions' instead of advice
+;;        when `cedet-edebug' is loaded, though I believe the current
+;;        implementation still works in that case.
+
+
+(eval-when-compile
+  (require 'edebug)
+  (require 'advice))
+
+
+(defun trie--edebug-pretty-print (object)
+  (cond
+   ((trie-p object) "#<trie>")
+   ((null object) "nil")
+   ((let ((tlist object) (test t))
+      (while (or (trie-p (car-safe tlist))
+                (and tlist (setq test nil)))
+       (setq tlist (cdr tlist)))
+      test)
+    (concat "(" (mapconcat (lambda (dummy) "#<trie>") object " ") ")"))
+;; ((vectorp object)
+;;  (let ((pretty "[") (len (length object)))
+;;    (dotimes (i (1- len))
+;;     (setq pretty
+;;           (concat pretty
+;;                   (if (trie-p (aref object i))
+;;                       "#<trie>" (prin1-to-string (aref object i))) " ")))
+;;    (concat pretty
+;;           (if (trie-p (aref object (1- len)))
+;;               "#<trie>" (prin1-to-string (aref object (1- len))))
+;;           "]")))
+   ))
+
+
+(when (fboundp 'ad-define-subr-args)
+  (ad-define-subr-args 'edebug-prin1 '(object &optional printcharfun)))
+
+(defadvice edebug-prin1
+  (around trie activate compile preactivate)
+  (let ((pretty (trie--edebug-pretty-print object)))
+    (if pretty
+       (progn
+         (prin1 pretty printcharfun)
+         (setq ad-return-value pretty))
+    ad-do-it)))
+
+
+(when (fboundp 'ad-define-subr-args)
+  (ad-define-subr-args 'edebug-prin1-to-string '(object &optional noescape)))
+
+(defadvice edebug-prin1-to-string
+  (around trie activate compile preactivate)
+  (let ((pretty (trie--edebug-pretty-print object)))
+    (if pretty
+       (setq ad-return-value pretty)
+      ad-do-it)))
+
+
+
+(provide 'trie)
+
+;;; trie.el ends here
diff --git a/packages/undo-tree/undo-tree.el b/packages/undo-tree/undo-tree.el
new file mode 100644 (file)
index 0000000..a597be9
--- /dev/null
@@ -0,0 +1,4230 @@
+;;; undo-tree.el --- Treat undo history as a tree  -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2009-2012  Free Software Foundation, Inc
+
+;; Author: Toby Cubitt <toby-undo-tree@dr-qubit.org>
+;; Version: 0.6.3
+;; Keywords: convenience, files, undo, redo, history, tree
+;; URL: http://www.dr-qubit.org/emacs.php
+;; Repository: http://www.dr-qubit.org/git/undo-tree.git
+
+;; This file is part of Emacs.
+;;
+;; This file 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 GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
+
+
+;;; Commentary:
+;;
+;; Emacs has a powerful undo system. Unlike the standard undo/redo system in
+;; most software, it allows you to recover *any* past state of a buffer
+;; (whereas the standard undo/redo system can lose past states as soon as you
+;; redo). However, this power comes at a price: many people find Emacs' undo
+;; system confusing and difficult to use, spawning a number of packages that
+;; replace it with the less powerful but more intuitive undo/redo system.
+;;
+;; Both the loss of data with standard undo/redo, and the confusion of Emacs'
+;; undo, stem from trying to treat undo history as a linear sequence of
+;; changes. It's not. The `undo-tree-mode' provided by this package replaces
+;; Emacs' undo system with a system that treats undo history as what it is: a
+;; branching tree of changes. This simple idea allows the more intuitive
+;; behaviour of the standard undo/redo system to be combined with the power of
+;; never losing any history. An added side bonus is that undo history can in
+;; some cases be stored more efficiently, allowing more changes to accumulate
+;; before Emacs starts discarding history.
+;;
+;; The only downside to this more advanced yet simpler undo system is that it
+;; was inspired by Vim. But, after all, most successful religions steal the
+;; best ideas from their competitors!
+;;
+;;
+;; Installation
+;; ============
+;;
+;; This package has only been tested with Emacs versions 24 and CVS. It should
+;; work in Emacs versions 22 and 23 too, but will not work without
+;; modifications in earlier versions of Emacs.
+;;
+;; To install `undo-tree-mode', make sure this file is saved in a directory in
+;; your `load-path', and add the line:
+;;
+;;   (require 'undo-tree)
+;;
+;; to your .emacs file. Byte-compiling undo-tree.el is recommended (e.g. using
+;; "M-x byte-compile-file" from within emacs).
+;;
+;; If you want to replace the standard Emacs' undo system with the
+;; `undo-tree-mode' system in all buffers, you can enable it globally by
+;; adding:
+;;
+;;   (global-undo-tree-mode)
+;;
+;; to your .emacs file.
+;;
+;;
+;; Quick-Start
+;; ===========
+;;
+;; If you're the kind of person who likes to jump in the car and drive,
+;; without bothering to first figure out whether the button on the left dips
+;; the headlights or operates the ejector seat (after all, you'll soon figure
+;; it out when you push it), then here's the minimum you need to know:
+;;
+;; `undo-tree-mode' and `global-undo-tree-mode'
+;;   Enable undo-tree mode (either in the current buffer or globally).
+;;
+;; C-_  C-/  (`undo-tree-undo')
+;;   Undo changes.
+;;
+;; M-_  C-?  (`undo-tree-redo')
+;;   Redo changes.
+;;
+;; `undo-tree-switch-branch'
+;;   Switch undo-tree branch.
+;;   (What does this mean? Better press the button and see!)
+;;
+;; C-x u  (`undo-tree-visualize')
+;;   Visualize the undo tree.
+;;   (Better try pressing this button too!)
+;;
+;; C-x r u  (`undo-tree-save-state-to-register')
+;;   Save current buffer state to register.
+;;
+;; C-x r U  (`undo-tree-restore-state-from-register')
+;;   Restore buffer state from register.
+;;
+;;
+;;
+;; In the undo-tree visualizer:
+;;
+;; <up>  p  C-p  (`undo-tree-visualize-undo')
+;;   Undo changes.
+;;
+;; <down>  n  C-n  (`undo-tree-visualize-redo')
+;;   Redo changes.
+;;
+;; <left>  b  C-b  (`undo-tree-visualize-switch-branch-left')
+;;   Switch to previous undo-tree branch.
+;;
+;; <right>  f  C-f  (`undo-tree-visualize-switch-branch-right')
+;;   Switch to next undo-tree branch.
+;;
+;; C-<up>  M-{  (`undo-tree-visualize-undo-to-x')
+;;   Undo changes up to last branch point.
+;;
+;; C-<down>  M-}  (`undo-tree-visualize-redo-to-x')
+;;   Redo changes down to next branch point.
+;;
+;; <down>  n  C-n  (`undo-tree-visualize-redo')
+;;   Redo changes.
+;;
+;; <mouse-1>  (`undo-tree-visualizer-mouse-set')
+;;   Set state to node at mouse click.
+;;
+;; t  (`undo-tree-visualizer-toggle-timestamps')
+;;   Toggle display of time-stamps.
+;;
+;; d  (`undo-tree-visualizer-toggle-diff')
+;;   Toggle diff display.
+;;
+;; s  (`undo-tree-visualizer-selection-mode')
+;;   Toggle keyboard selection mode.
+;;
+;; q  (`undo-tree-visualizer-quit')
+;;   Quit undo-tree-visualizer.
+;;
+;; C-q  (`undo-tree-visualizer-abort')
+;;   Abort undo-tree-visualizer.
+;;
+;; ,  <
+;;   Scroll left.
+;;
+;; .  >
+;;   Scroll right.
+;;
+;; <pgup>  M-v
+;;   Scroll up.
+;;
+;; <pgdown>  C-v
+;;   Scroll down.
+;;
+;;
+;;
+;; In visualizer selection mode:
+;;
+;; <up>  p  C-p  (`undo-tree-visualizer-select-previous')
+;;   Select previous node.
+;;
+;; <down>  n  C-n  (`undo-tree-visualizer-select-next')
+;;   Select next node.
+;;
+;; <left>  b  C-b  (`undo-tree-visualizer-select-left')
+;;   Select left sibling node.
+;;
+;; <right>  f  C-f  (`undo-tree-visualizer-select-right')
+;;   Select right sibling node.
+;;
+;; <pgup>  M-v
+;;   Select node 10 above.
+;;
+;; <pgdown>  C-v
+;;   Select node 10 below.
+;;
+;; <enter>  (`undo-tree-visualizer-set')
+;;   Set state to selected node and exit selection mode.
+;;
+;; s  (`undo-tree-visualizer-mode')
+;;   Exit selection mode.
+;;
+;; t  (`undo-tree-visualizer-toggle-timestamps')
+;;   Toggle display of time-stamps.
+;;
+;; d  (`undo-tree-visualizer-toggle-diff')
+;;   Toggle diff display.
+;;
+;; q  (`undo-tree-visualizer-quit')
+;;   Quit undo-tree-visualizer.
+;;
+;; C-q  (`undo-tree-visualizer-abort')
+;;   Abort undo-tree-visualizer.
+;;
+;; ,  <
+;;   Scroll left.
+;;
+;; .  >
+;;   Scroll right.
+;;
+;;
+;;
+;; Persistent undo history:
+;;
+;; Note: Requires a recent development version of Emacs checked out out from
+;;       the Emacs bzr repository. All stable versions of Emacs currently
+;;       break this feature.
+;;
+;; `undo-tree-auto-save-history' (variable)
+;;    automatically save and restore undo-tree history along with buffer
+;;    (disabled by default)
+;;
+;; `undo-tree-save-history' (command)
+;;    manually save undo history to file
+;;
+;; `undo-tree-load-history' (command)
+;;    manually load undo history from file
+;;
+;;
+;;
+;; Compressing undo history:
+;;
+;;   Undo history files cannot grow beyond the maximum undo tree size, which
+;;   is limited by `undo-limit', `undo-strong-limit' and
+;;   `undo-outer-limit'. Nevertheless, undo history files can grow quite
+;;   large. If you want to automatically compress undo history, add the
+;;   following advice to your .emacs file (replacing ".gz" with the filename
+;;   extension of your favourite compression algorithm):
+;;
+;;   (defadvice undo-tree-make-history-save-file-name
+;;     (after undo-tree activate)
+;;     (setq concat ad-return-value ".gz"))
+;;
+;;
+;;
+;;
+;; Undo Systems
+;; ============
+;;
+;; To understand the different undo systems, it's easiest to consider an
+;; example. Imagine you make a few edits in a buffer. As you edit, you
+;; accumulate a history of changes, which we might visualize as a string of
+;; past buffer states, growing downwards:
+;;
+;;                                o  (initial buffer state)
+;;                                |
+;;                                |
+;;                                o  (first edit)
+;;                                |
+;;                                |
+;;                                o  (second edit)
+;;                                |
+;;                                |
+;;                                x  (current buffer state)
+;;
+;;
+;; Now imagine that you undo the last two changes. We can visualize this as
+;; rewinding the current state back two steps:
+;;
+;;                                o  (initial buffer state)
+;;                                |
+;;                                |
+;;                                x  (current buffer state)
+;;                                |
+;;                                |
+;;                                o
+;;                                |
+;;                                |
+;;                                o
+;;
+;;
+;; However, this isn't a good representation of what Emacs' undo system
+;; does. Instead, it treats the undos as *new* changes to the buffer, and adds
+;; them to the history:
+;;
+;;                                o  (initial buffer state)
+;;                                |
+;;                                |
+;;                                o  (first edit)
+;;                                |
+;;                                |
+;;                                o  (second edit)
+;;                                |
+;;                                |
+;;                                x  (buffer state before undo)
+;;                                |
+;;                                |
+;;                                o  (first undo)
+;;                                |
+;;                                |
+;;                                x  (second undo)
+;;
+;;
+;; Actually, since the buffer returns to a previous state after an undo,
+;; perhaps a better way to visualize it is to imagine the string of changes
+;; turning back on itself:
+;;
+;;        (initial buffer state)  o
+;;                                |
+;;                                |
+;;                  (first edit)  o  x  (second undo)
+;;                                |  |
+;;                                |  |
+;;                 (second edit)  o  o  (first undo)
+;;                                | /
+;;                                |/
+;;                                o  (buffer state before undo)
+;;
+;; Treating undos as new changes might seem a strange thing to do. But the
+;; advantage becomes clear as soon as we imagine what happens when you edit
+;; the buffer again. Since you've undone a couple of changes, new edits will
+;; branch off from the buffer state that you've rewound to. Conceptually, it
+;; looks like this:
+;;
+;;                                o  (initial buffer state)
+;;                                |
+;;                                |
+;;                                o
+;;                                |\
+;;                                | \
+;;                                o  x  (new edit)
+;;                                |
+;;                                |
+;;                                o
+;;
+;; The standard undo/redo system only lets you go backwards and forwards
+;; linearly. So as soon as you make that new edit, it discards the old
+;; branch. Emacs' undo just keeps adding changes to the end of the string. So
+;; the undo history in the two systems now looks like this:
+;;
+;;            Undo/Redo:                      Emacs' undo
+;;
+;;               o                                o
+;;               |                                |
+;;               |                                |
+;;               o                                o  o
+;;               .\                               |  |\
+;;               . \                              |  | \
+;;               .  x  (new edit)                 o  o  |
+;;   (discarded  .                                | /   |
+;;     branch)   .                                |/    |
+;;               .                                o     |
+;;                                                      |
+;;                                                      |
+;;                                                      x  (new edit)
+;;
+;; Now, what if you change your mind about those undos, and decide you did
+;; like those other changes you'd made after all? With the standard undo/redo
+;; system, you're lost. There's no way to recover them, because that branch
+;; was discarded when you made the new edit.
+;;
+;; However, in Emacs' undo system, those old buffer states are still there in
+;; the undo history. You just have to rewind back through the new edit, and
+;; back through the changes made by the undos, until you reach them. Of
+;; course, since Emacs treats undos (even undos of undos!) as new changes,
+;; you're really weaving backwards and forwards through the history, all the
+;; time adding new changes to the end of the string as you go:
+;;
+;;                       o
+;;                       |
+;;                       |
+;;                       o  o     o  (undo new edit)
+;;                       |  |\    |\
+;;                       |  | \   | \
+;;                       o  o  |  |  o  (undo the undo)
+;;                       | /   |  |  |
+;;                       |/    |  |  |
+;;      (trying to get   o     |  |  x  (undo the undo)
+;;       to this state)        | /
+;;                             |/
+;;                             o
+;;
+;; So far, this is still reasonably intuitive to use. It doesn't behave so
+;; differently to standard undo/redo, except that by going back far enough you
+;; can access changes that would be lost in standard undo/redo.
+;;
+;; However, imagine that after undoing as just described, you decide you
+;; actually want to rewind right back to the initial state. If you're lucky,
+;; and haven't invoked any command since the last undo, you can just keep on
+;; undoing until you get back to the start:
+;;
+;;      (trying to get   o              x  (got there!)
+;;       to this state)  |              |
+;;                       |              |
+;;                       o  o     o     o  (keep undoing)
+;;                       |  |\    |\    |
+;;                       |  | \   | \   |
+;;                       o  o  |  |  o  o  (keep undoing)
+;;                       | /   |  |  | /
+;;                       |/    |  |  |/
+;;      (already undid   o     |  |  o  (got this far)
+;;       to this state)        | /
+;;                             |/
+;;                             o
+;;
+;; But if you're unlucky, and you happen to have moved the point (say) after
+;; getting to the state labelled "got this far", then you've "broken the undo
+;; chain". Hold on to something solid, because things are about to get
+;; hairy. If you try to undo now, Emacs thinks you're trying to undo the
+;; undos! So to get back to the initial state you now have to rewind through
+;; *all* the changes, including the undos you just did:
+;;
+;;      (trying to get   o                          x  (finally got there!)
+;;       to this state)  |                          |
+;;                       |                          |
+;;                       o  o     o     o     o     o
+;;                       |  |\    |\    |\    |\    |
+;;                       |  | \   | \   | \   | \   |
+;;                       o  o  |  |  o  o  o  |  o  o
+;;                       | /   |  |  | /   |  |  | /
+;;                       |/    |  |  |/    |  |  |/
+;;      (already undid   o     |  |  o<.   |  |  o
+;;       to this state)        | /     :   | /
+;;                             |/      :   |/
+;;                             o       :   o
+;;                                     :
+;;                             (got this far, but
+;;                              broke the undo chain)
+;;
+;; Confused?
+;;
+;; In practice you can just hold down the undo key until you reach the buffer
+;; state that you want. But whatever you do, don't move around in the buffer
+;; to *check* that you've got back to where you want! Because you'll break the
+;; undo chain, and then you'll have to traverse the entire string of undos
+;; again, just to get back to the point at which you broke the
+;; chain. Undo-in-region and commands such as `undo-only' help to make using
+;; Emacs' undo a little easier, but nonetheless it remains confusing for many
+;; people.
+;;
+;;
+;; So what does `undo-tree-mode' do? Remember the diagram we drew to represent
+;; the history we've been discussing (make a few edits, undo a couple of them,
+;; and edit again)? The diagram that conceptually represented our undo
+;; history, before we started discussing specific undo systems? It looked like
+;; this:
+;;
+;;                                o  (initial buffer state)
+;;                                |
+;;                                |
+;;                                o
+;;                                |\
+;;                                | \
+;;                                o  x  (current state)
+;;                                |
+;;                                |
+;;                                o
+;;
+;; Well, that's *exactly* what the undo history looks like to
+;; `undo-tree-mode'.  It doesn't discard the old branch (as standard undo/redo
+;; does), nor does it treat undos as new changes to be added to the end of a
+;; linear string of buffer states (as Emacs' undo does). It just keeps track
+;; of the tree of branching changes that make up the entire undo history.
+;;
+;; If you undo from this point, you'll rewind back up the tree to the previous
+;; state:
+;;
+;;                                o
+;;                                |
+;;                                |
+;;                                x  (undo)
+;;                                |\
+;;                                | \
+;;                                o  o
+;;                                |
+;;                                |
+;;                                o
+;;
+;; If you were to undo again, you'd rewind back to the initial state. If on
+;; the other hand you redo the change, you'll end up back at the bottom of the
+;; most recent branch:
+;;
+;;                                o  (undo takes you here)
+;;                                |
+;;                                |
+;;                                o  (start here)
+;;                                |\
+;;                                | \
+;;                                o  x  (redo takes you here)
+;;                                |
+;;                                |
+;;                                o
+;;
+;; So far, this is just like the standard undo/redo system. But what if you
+;; want to return to a buffer state located on a previous branch of the
+;; history? Since `undo-tree-mode' keeps the entire history, you simply need
+;; to tell it to switch to a different branch, and then redo the changes you
+;; want:
+;;
+;;                                o
+;;                                |
+;;                                |
+;;                                o  (start here, but switch
+;;                                |\  to the other branch)
+;;                                | \
+;;                        (redo)  o  o
+;;                                |
+;;                                |
+;;                        (redo)  x
+;;
+;; Now you're on the other branch, if you undo and redo changes you'll stay on
+;; that branch, moving up and down through the buffer states located on that
+;; branch. Until you decide to switch branches again, of course.
+;;
+;; Real undo trees might have multiple branches and sub-branches:
+;;
+;;                                o
+;;                            ____|______
+;;                           /           \
+;;                          o             o
+;;                      ____|__         __|
+;;                     /    |  \       /   \
+;;                    o     o   o     o     x
+;;                    |               |
+;;                   / \             / \
+;;                  o   o           o   o
+;;
+;; Trying to imagine what Emacs' undo would do as you move about such a tree
+;; will likely frazzle your brain circuits! But in `undo-tree-mode', you're
+;; just moving around this undo history tree. Most of the time, you'll
+;; probably only need to stay on the most recent branch, in which case it
+;; behaves like standard undo/redo, and is just as simple to understand. But
+;; if you ever need to recover a buffer state on a different branch, the
+;; possibility of switching between branches and accessing the full undo
+;; history is still there.
+;;
+;;
+;;
+;; The Undo-Tree Visualizer
+;; ========================
+;;
+;; Actually, it gets better. You don't have to imagine all these tree
+;; diagrams, because `undo-tree-mode' includes an undo-tree visualizer which
+;; draws them for you! In fact, it draws even better diagrams: it highlights
+;; the node representing the current buffer state, it highlights the current
+;; branch, and you can toggle the display of time-stamps (by hitting "t") and
+;; a diff of the undo changes (by hitting "d"). (There's one other tiny
+;; difference: the visualizer puts the most recent branch on the left rather
+;; than the right.)
+;;
+;; Bring up the undo tree visualizer whenever you want by hitting "C-x u".
+;;
+;; In the visualizer, the usual keys for moving up and down a buffer instead
+;; move up and down the undo history tree (e.g. the up and down arrow keys, or
+;; "C-n" and "C-p"). The state of the "parent" buffer (the buffer whose undo
+;; history you are visualizing) is updated as you move around the undo tree in
+;; the visualizer. If you reach a branch point in the visualizer, the usual
+;; keys for moving forward and backward in a buffer instead switch branch
+;; (e.g. the left and right arrow keys, or "C-f" and "C-b").
+;;
+;; Clicking with the mouse on any node in the visualizer will take you
+;; directly to that node, resetting the state of the parent buffer to the
+;; state represented by that node.
+;;
+;; You can also select nodes directly using the keyboard, by hitting "s" to
+;; toggle selection mode. The usual motion keys now allow you to move around
+;; the tree without changing the parent buffer. Hitting <enter> will reset the
+;; state of the parent buffer to the state represented by the currently
+;; selected node.
+;;
+;; It can be useful to see how long ago the parent buffer was in the state
+;; represented by a particular node in the visualizer. Hitting "t" in the
+;; visualizer toggles the display of time-stamps for all the nodes. (Note
+;; that, because of the way `undo-tree-mode' works, these time-stamps may be
+;; somewhat later than the true times, especially if it's been a long time
+;; since you last undid any changes.)
+;;
+;; To get some idea of what changes are represented by a given node in the
+;; tree, it can be useful to see a diff of the changes. Hit "d" in the
+;; visualizer to toggle a diff display. This normally displays a diff between
+;; the current state and the previous one, i.e. it shows you the changes that
+;; will be applied if you undo (move up the tree). However, the diff display
+;; really comes into its own in the visualizer's selection mode (see above),
+;; where it instead shows a diff between the current state and the currently
+;; selected state, i.e. it shows you the changes that will be applied if you
+;; reset to the selected state.
+;;
+;; (Note that the diff is generated by the Emacs `diff' command, and is
+;; displayed using `diff-mode'. See the corresponding customization groups if
+;; you want to customize the diff display.)
+;;
+;; Finally, hitting "q" will quit the visualizer, leaving the parent buffer in
+;; whatever state you ended at. Hitting "C-q" will abort the visualizer,
+;; returning the parent buffer to whatever state it was originally in when the
+;; visualizer was .
+;;
+;;
+;;
+;; Undo-in-Region
+;; ==============
+;;
+;; Emacs allows a very useful and powerful method of undoing only selected
+;; changes: when a region is active, only changes that affect the text within
+;; that region will be undone. With the standard Emacs undo system, changes
+;; produced by undoing-in-region naturally get added onto the end of the
+;; linear undo history:
+;;
+;;                       o
+;;                       |
+;;                       |  x  (second undo-in-region)
+;;                       o  |
+;;                       |  |
+;;                       |  o  (first undo-in-region)
+;;                       o  |
+;;                       | /
+;;                       |/
+;;                       o
+;;
+;; You can of course redo these undos-in-region as usual, by undoing the
+;; undos:
+;;
+;;                       o
+;;                       |
+;;                       |  o_
+;;                       o  | \
+;;                       |  |  |
+;;                       |  o  o  (undo the undo-in-region)
+;;                       o  |  |
+;;                       | /   |
+;;                       |/    |
+;;                       o     x  (undo the undo-in-region)
+;;
+;;
+;; In `undo-tree-mode', undo-in-region works similarly: when there's an active
+;; region, undoing only undoes changes that affect that region. However, the
+;; way these undos-in-region are recorded in the undo history is quite
+;; different. In `undo-tree-mode', undo-in-region creates a new branch in the
+;; undo history. The new branch consists of an undo step that undoes some of
+;; the changes that affect the current region, and another step that undoes
+;; the remaining changes needed to rejoin the previous undo history.
+;;
+;;      Previous undo history                Undo-in-region
+;;
+;;               o                                o
+;;               |                                |
+;;               |                                |
+;;               o                                o
+;;               |                                |\
+;;               |                                | \
+;;               o                                o  x  (undo-in-region)
+;;               |                                |  |
+;;               |                                |  |
+;;               x                                o  o
+;;
+;; As long as you don't change the active region after undoing-in-region,
+;; continuing to undo-in-region extends the new branch, pulling more changes
+;; that affect the current region into an undo step immediately above your
+;; current location in the undo tree, and pushing the point at which the new
+;; branch is attached further up the tree:
+;;
+;;      First undo-in-region                 Second undo-in-region
+;;
+;;               o                                o
+;;               |                                |\
+;;               |                                | \
+;;               o                                o  x  (undo-in-region)
+;;               |\                               |  |
+;;               | \                              |  |
+;;               o  x                             o  o
+;;               |  |                             |  |
+;;               |  |                             |  |
+;;               o  o                             o  o
+;;
+;; Redoing takes you back down the undo tree, as usual (as long as you haven't
+;; changed the active region after undoing-in-region, it doesn't matter if it
+;; is still active):
+;;
+;;                       o
+;;                      |\
+;;                      | \
+;;                      o  o
+;;                      |  |
+;;                      |  |
+;;                      o  o  (redo)
+;;                      |  |
+;;                      |  |
+;;                      o  x  (redo)
+;;
+;;
+;; What about redo-in-region? Obviously, this only makes sense if you have
+;; already undone some changes, so that there are some changes to redo!
+;; Redoing-in-region splits off a new branch of the undo history below your
+;; current location in the undo tree. This time, the new branch consists of a
+;; redo step that redoes some of the redo changes that affect the current
+;; region, followed by all the remaining redo changes.
+;;
+;;      Previous undo history                Redo-in-region
+;;
+;;               o                                o
+;;               |                                |
+;;               |                                |
+;;               x                                o
+;;               |                                |\
+;;               |                                | \
+;;               o                                o  x  (redo-in-region)
+;;               |                                |  |
+;;               |                                |  |
+;;               o                                o  o
+;;
+;; As long as you don't change the active region after redoing-in-region,
+;; continuing to redo-in-region extends the new branch, pulling more redo
+;; changes into a redo step immediately below your current location in the
+;; undo tree.
+;;
+;;      First redo-in-region                 Second redo-in-region
+;;
+;;          o                                     o
+;;          |                                     |
+;;          |                                     |
+;;          o                                     o
+;;          |\                                    |\
+;;          | \                                   | \
+;;          o  x  (redo-in-region)                o  o
+;;          |  |                                  |  |
+;;          |  |                                  |  |
+;;          o  o                                  o  x  (redo-in-region)
+;;                                                   |
+;;                                                   |
+;;                                                   o
+;;
+;; Note that undo-in-region and redo-in-region only ever add new changes to
+;; the undo tree, they *never* modify existing undo history. So you can always
+;; return to previous buffer states by switching to a previous branch of the
+;; tree.
+
+
+
+;;; Code:
+
+(eval-when-compile (require 'cl))
+(require 'diff)
+
+
+\f
+;;; =====================================================================
+;;;              Compatibility hacks for older Emacsen
+
+;; `characterp' isn't defined in Emacs versions < 23
+(unless (fboundp 'characterp)
+  (defalias 'characterp 'char-valid-p))
+
+;; `region-active-p' isn't defined in Emacs versions < 23
+(unless (fboundp 'region-active-p)
+  (defun region-active-p () (and transient-mark-mode mark-active)))
+
+
+;; `registerv' defstruct isn't defined in Emacs versions < 24
+(unless (fboundp 'registerv-make)
+  (defmacro registerv-make (data &rest _dummy) data))
+
+(unless (fboundp 'registerv-data)
+  (defmacro registerv-data (data) data))
+
+
+;; `diff-no-select' and `diff-file-local-copy' aren't defined in Emacs
+;; versions < 24 (copied and adapted from Emacs 24)
+(unless (fboundp 'diff-no-select)
+  (defun diff-no-select (old new &optional switches no-async buf)
+    ;; Noninteractive helper for creating and reverting diff buffers
+    (unless (bufferp new) (setq new (expand-file-name new)))
+    (unless (bufferp old) (setq old (expand-file-name old)))
+    (or switches (setq switches diff-switches)) ; If not specified, use default.
+    (unless (listp switches) (setq switches (list switches)))
+    (or buf (setq buf (get-buffer-create "*Diff*")))
+    (let* ((old-alt (diff-file-local-copy old))
+          (new-alt (diff-file-local-copy new))
+          (command
+           (mapconcat 'identity
+                      `(,diff-command
+                        ;; Use explicitly specified switches
+                        ,@switches
+                        ,@(mapcar #'shell-quote-argument
+                                  (nconc
+                                   (when (or old-alt new-alt)
+                                     (list "-L" (if (stringp old)
+                                                    old (prin1-to-string old))
+                                           "-L" (if (stringp new)
+                                                    new (prin1-to-string new))))
+                                   (list (or old-alt old)
+                                         (or new-alt new)))))
+                      " "))
+          (thisdir default-directory))
+      (with-current-buffer buf
+       (setq buffer-read-only t)
+       (buffer-disable-undo (current-buffer))
+       (let ((inhibit-read-only t))
+         (erase-buffer))
+       (buffer-enable-undo (current-buffer))
+       (diff-mode)
+       (set (make-local-variable 'revert-buffer-function)
+            (lambda (_ignore-auto _noconfirm)
+              (diff-no-select old new switches no-async (current-buffer))))
+       (setq default-directory thisdir)
+       (let ((inhibit-read-only t))
+         (insert command "\n"))
+       (if (and (not no-async) (fboundp 'start-process))
+           (let ((proc (start-process "Diff" buf shell-file-name
+                                      shell-command-switch command)))
+             (set-process-filter proc 'diff-process-filter)
+             (set-process-sentinel
+              proc (lambda (proc _msg)
+                     (with-current-buffer (process-buffer proc)
+                       (diff-sentinel (process-exit-status proc))
+                       (if old-alt (delete-file old-alt))
+                       (if new-alt (delete-file new-alt))))))
+         ;; Async processes aren't available.
+         (let ((inhibit-read-only t))
+           (diff-sentinel
+            (call-process shell-file-name nil buf nil
+                          shell-command-switch command))
+           (if old-alt (delete-file old-alt))
+           (if new-alt (delete-file new-alt)))))
+      buf)))
+
+(unless (fboundp 'diff-file-local-copy)
+  (defun diff-file-local-copy (file-or-buf)
+    (if (bufferp file-or-buf)
+       (with-current-buffer file-or-buf
+         (let ((tempfile (make-temp-file "buffer-content-")))
+           (write-region nil nil tempfile nil 'nomessage)
+           tempfile))
+      (file-local-copy file-or-buf))))
+
+
+
+\f
+;;; =====================================================================
+;;;              Global variables and customization options
+
+(defvar buffer-undo-tree nil
+  "Tree of undo entries in current buffer.")
+(make-variable-buffer-local 'buffer-undo-tree)
+(put 'buffer-undo-tree 'permanent-local t)
+
+
+(defgroup undo-tree nil
+  "Tree undo/redo."
+  :group 'undo)
+
+(defcustom undo-tree-mode-lighter " Undo-Tree"
+  "Lighter displayed in mode line
+when `undo-tree-mode' is enabled."
+  :group 'undo-tree
+  :type 'string)
+
+
+(defcustom undo-tree-incompatible-major-modes '(term-mode)
+  "List of major-modes in which `undo-tree-mode' should not be enabled.
+\(See `turn-on-undo-tree-mode'.\)"
+  :group 'undo-tree
+  :type '(repeat symbol))
+
+
+(defcustom undo-tree-enable-undo-in-region t
+  "When non-nil, enable undo-in-region.
+
+When undo-in-region is enabled, undoing or redoing when the
+region is active (in `transient-mark-mode') or with a prefix
+argument (not in `transient-mark-mode') only undoes changes
+within the current region."
+  :group 'undo-tree
+  :type 'boolean)
+
+
+(defcustom undo-tree-auto-save-history nil
+  "When non-nil, `undo-tree-mode' will save undo history to file
+when a buffer is saved to file.
+
+It will automatically load undo history when a buffer is loaded
+from file, if an undo save file exists.
+
+Undo-tree history is saved to a file called
+\".<buffer-file-name>.~undo-tree\" in the same directory as the
+file itself.
+
+WARNING! `undo-tree-auto-save-history' will not work properly in
+Emacs versions prior to 24.3, so it cannot be enabled via
+the customization interface in versions earlier than that one. To
+ignore this warning and enable it regardless, set
+`undo-tree-auto-save-history' to a non-nil value outside of
+customize."
+  :group 'undo-tree
+  :type (if (version-list-< (version-to-list emacs-version) '(24 3))
+           '(choice (const :tag "<disabled>" nil))
+         'boolean))
+
+
+(defcustom undo-tree-history-directory-alist nil
+  "Alist of filename patterns and undo history directory names.
+Each element looks like (REGEXP . DIRECTORY).  Undo history for
+files with names matching REGEXP will be saved in DIRECTORY.
+DIRECTORY may be relative or absolute.  If it is absolute, so
+that all matching files are backed up into the same directory,
+the file names in this directory will be the full name of the
+file backed up with all directory separators changed to `!' to
+prevent clashes.  This will not work correctly if your filesystem
+truncates the resulting name.
+
+For the common case of all backups going into one directory, the
+alist should contain a single element pairing \".\" with the
+appropriate directory name.
+
+If this variable is nil, or it fails to match a filename, the
+backup is made in the original file's directory.
+
+On MS-DOS filesystems without long names this variable is always
+ignored."
+  :group 'undo-tree
+  :type '(repeat (cons (regexp :tag "Regexp matching filename")
+                      (directory :tag "Undo history directory name"))))
+
+
+
+(defcustom undo-tree-visualizer-relative-timestamps t
+  "When non-nil, display times relative to current time
+when displaying time stamps in visualizer.
+
+Otherwise, display absolute times."
+  :group 'undo-tree
+  :type 'boolean)
+
+
+(defcustom undo-tree-visualizer-timestamps nil
+  "When non-nil, display time-stamps by default
+in undo-tree visualizer.
+
+\\<undo-tree-visualizer-map>You can always toggle time-stamps on and off \
+using \\[undo-tree-visualizer-toggle-timestamps], regardless of the
+setting of this variable."
+  :group 'undo-tree
+  :type 'boolean)
+
+
+(defcustom undo-tree-visualizer-diff nil
+  "When non-nil, display diff by default in undo-tree visualizer.
+
+\\<undo-tree-visualizer-map>You can always toggle the diff display \
+using \\[undo-tree-visualizer-toggle-diff], regardless of the
+setting of this variable."
+  :group 'undo-tree
+  :type 'boolean)
+
+
+(defcustom undo-tree-visualizer-lazy-drawing 100
+  "When non-nil, use lazy undo-tree drawing in visualizer.
+
+Setting this to a number causes the visualizer to switch to lazy
+drawing when the number of nodes in the tree is larger than this
+value.
+
+Lazy drawing means that only the visible portion of the tree will
+be drawn initially , and the tree will be extended later as
+needed. For the most part, the only visible effect of this is to
+significantly speed up displaying the visualizer for very large
+trees.
+
+There is one potential negative effect of lazy drawing. Other
+branches of the tree will only be drawn once the node from which
+they branch off becomes visible. So it can happen that certain
+portions of the tree that would be shown with lazy drawing
+disabled, will not be drawn immediately when it is
+enabled. However, this effect is quite rare in practice."
+  :group 'undo-tree
+  :type '(choice (const :tag "never" nil)
+                (const :tag "always" t)
+                (integer :tag "> size")))
+
+
+(defface undo-tree-visualizer-default-face
+  '((((class color)) :foreground "gray"))
+  "Face used to draw undo-tree in visualizer."
+  :group 'undo-tree)
+
+(defface undo-tree-visualizer-current-face
+  '((((class color)) :foreground "red"))
+  "Face used to highlight current undo-tree node in visualizer."
+  :group 'undo-tree)
+
+(defface undo-tree-visualizer-active-branch-face
+  '((((class color) (background dark))
+     (:foreground "white" :weight bold))
+    (((class color) (background light))
+     (:foreground "black" :weight bold)))
+  "Face used to highlight active undo-tree branch in visualizer."
+  :group 'undo-tree)
+
+(defface undo-tree-visualizer-register-face
+  '((((class color)) :foreground "yellow"))
+  "Face used to highlight undo-tree nodes saved to a register
+in visualizer."
+  :group 'undo-tree)
+
+(defface undo-tree-visualizer-unmodified-face
+  '((((class color)) :foreground "cyan"))
+  "Face used to highlight nodes corresponding to unmodified buffers
+in visualizer."
+  :group 'undo-tree)
+
+
+(defvar undo-tree-visualizer-parent-buffer nil
+  "Parent buffer in visualizer.")
+(make-variable-buffer-local 'undo-tree-visualizer-parent-buffer)
+
+;; stores modification time of parent buffer's file, if any
+(defvar undo-tree-visualizer-parent-mtime nil)
+(make-variable-buffer-local 'undo-tree-visualizer-parent-mtime)
+
+;; stores current horizontal spacing needed for drawing undo-tree
+(defvar undo-tree-visualizer-spacing nil)
+(make-variable-buffer-local 'undo-tree-visualizer-spacing)
+
+;; calculate horizontal spacing required for drawing tree with current
+;; settings
+(defsubst undo-tree-visualizer-calculate-spacing ()
+  (if undo-tree-visualizer-timestamps
+      (if undo-tree-visualizer-relative-timestamps 9 13)
+    3))
+
+;; holds node that was current when visualizer was invoked
+(defvar undo-tree-visualizer-initial-node nil)
+(make-variable-buffer-local 'undo-tree-visualizer-initial-node)
+
+;; holds currently selected node in visualizer selection mode
+(defvar undo-tree-visualizer-selected-node nil)
+(make-variable-buffer-local 'undo-tree-visualizer-selected)
+
+;; used to store nodes at edge of currently drawn portion of tree
+(defvar undo-tree-visualizer-needs-extending-down nil)
+(make-variable-buffer-local 'undo-tree-visualizer-needs-extending-down)
+(defvar undo-tree-visualizer-needs-extending-up nil)
+(make-variable-buffer-local 'undo-tree-visualizer-needs-extending-up)
+
+;; dynamically bound to t when undoing from visualizer, to inhibit
+;; `undo-tree-kill-visualizer' hook function in parent buffer
+(defvar undo-tree-inhibit-kill-visualizer nil)
+
+;; can be let-bound to a face name, used in drawing functions
+(defvar undo-tree-insert-face nil)
+
+;; visualizer buffer names
+(defconst undo-tree-visualizer-buffer-name " *undo-tree*")
+(defconst undo-tree-diff-buffer-name "*undo-tree Diff*")
+
+;; prevent debugger being called on "No further redo information"
+(add-to-list 'debug-ignored-errors "^No further redo information")
+(add-to-list 'debug-ignored-errors "^No further redo information for region")
+
+;; install history-auto-save hooks
+(add-hook 'write-file-functions 'undo-tree-save-history-hook)
+(add-hook 'find-file-hook 'undo-tree-load-history-hook)
+
+
+
+\f
+;;; =================================================================
+;;;                          Default keymaps
+
+(defvar undo-tree-map nil
+  "Keymap used in undo-tree-mode.")
+
+(unless undo-tree-map
+  (let ((map (make-sparse-keymap)))
+    ;; remap `undo' and `undo-only' to `undo-tree-undo'
+    (define-key map [remap undo] 'undo-tree-undo)
+    (define-key map [remap undo-only] 'undo-tree-undo)
+    ;; bind standard undo bindings (since these match redo counterparts)
+    (define-key map (kbd "C-/") 'undo-tree-undo)
+    (define-key map "\C-_" 'undo-tree-undo)
+    ;; redo doesn't exist normally, so define our own keybindings
+    (define-key map (kbd "C-?") 'undo-tree-redo)
+    (define-key map (kbd "M-_") 'undo-tree-redo)
+    ;; just in case something has defined `redo'...
+    (define-key map [remap redo] 'undo-tree-redo)
+    ;; we use "C-x u" for the undo-tree visualizer
+    (define-key map (kbd "\C-x u") 'undo-tree-visualize)
+    ;; bind register commands
+    (define-key map (kbd "C-x r u") 'undo-tree-save-state-to-register)
+    (define-key map (kbd "C-x r U") 'undo-tree-restore-state-from-register)
+    ;; set keymap
+    (setq undo-tree-map map)))
+
+
+(defvar undo-tree-visualizer-map nil
+  "Keymap used in undo-tree visualizer.")
+
+(unless undo-tree-visualizer-map
+  (let ((map (make-sparse-keymap)))
+    ;; vertical motion keys undo/redo
+    (define-key map [remap previous-line] 'undo-tree-visualize-undo)
+    (define-key map [remap next-line] 'undo-tree-visualize-redo)
+    (define-key map [up] 'undo-tree-visualize-undo)
+    (define-key map "p" 'undo-tree-visualize-undo)
+    (define-key map "\C-p" 'undo-tree-visualize-undo)
+    (define-key map [down] 'undo-tree-visualize-redo)
+    (define-key map "n" 'undo-tree-visualize-redo)
+    (define-key map "\C-n" 'undo-tree-visualize-redo)
+    ;; horizontal motion keys switch branch
+    (define-key map [remap forward-char]
+      'undo-tree-visualize-switch-branch-right)
+    (define-key map [remap backward-char]
+      'undo-tree-visualize-switch-branch-left)
+    (define-key map [right] 'undo-tree-visualize-switch-branch-right)
+    (define-key map "f" 'undo-tree-visualize-switch-branch-right)
+    (define-key map "\C-f" 'undo-tree-visualize-switch-branch-right)
+    (define-key map [left] 'undo-tree-visualize-switch-branch-left)
+    (define-key map "b" 'undo-tree-visualize-switch-branch-left)
+    (define-key map "\C-b" 'undo-tree-visualize-switch-branch-left)
+    ;; paragraph motion keys undo/redo to significant points in tree
+    (define-key map [remap backward-paragraph] 'undo-tree-visualize-undo-to-x)
+    (define-key map [remap forward-paragraph] 'undo-tree-visualize-redo-to-x)
+    (define-key map "\M-{" 'undo-tree-visualize-undo-to-x)
+    (define-key map "\M-}" 'undo-tree-visualize-redo-to-x)
+    (define-key map [C-down] 'undo-tree-visualize-undo-to-x)
+    (define-key map [C-up] 'undo-tree-visualize-redo-to-x)
+    ;; mouse sets buffer state to node at click
+    (define-key map [mouse-1] 'undo-tree-visualizer-mouse-set)
+    ;; toggle timestamps
+    (define-key map "t" 'undo-tree-visualizer-toggle-timestamps)
+    ;; toggle diff
+    (define-key map "d" 'undo-tree-visualizer-toggle-diff)
+    ;; selection mode
+    (define-key map "s" 'undo-tree-visualizer-selection-mode)
+    ;; horizontal scrolling may be needed if the tree is very wide
+    (define-key map "," 'undo-tree-visualizer-scroll-left)
+    (define-key map "." 'undo-tree-visualizer-scroll-right)
+    (define-key map "<" 'undo-tree-visualizer-scroll-left)
+    (define-key map ">" 'undo-tree-visualizer-scroll-right)
+    ;; vertical scrolling may be needed if the tree is very tall
+    (define-key map [next] 'undo-tree-visualizer-scroll-up)
+    (define-key map [prior] 'undo-tree-visualizer-scroll-down)
+    ;; quit/abort visualizer
+    (define-key map "q" 'undo-tree-visualizer-quit)
+    (define-key map "\C-q" 'undo-tree-visualizer-abort)
+    ;; set keymap
+    (setq undo-tree-visualizer-map map)))
+
+
+(defvar undo-tree-visualizer-selection-map nil
+  "Keymap used in undo-tree visualizer selection mode.")
+
+(unless undo-tree-visualizer-selection-map
+  (let ((map (make-sparse-keymap)))
+    ;; vertical motion keys move up and down tree
+    (define-key map [remap previous-line]
+      'undo-tree-visualizer-select-previous)
+    (define-key map [remap next-line]
+      'undo-tree-visualizer-select-next)
+    (define-key map [up] 'undo-tree-visualizer-select-previous)
+    (define-key map "p" 'undo-tree-visualizer-select-previous)
+    (define-key map "\C-p" 'undo-tree-visualizer-select-previous)
+    (define-key map [down] 'undo-tree-visualizer-select-next)
+    (define-key map "n" 'undo-tree-visualizer-select-next)
+    (define-key map "\C-n" 'undo-tree-visualizer-select-next)
+    ;; vertical scroll keys move up and down quickly
+    (define-key map [next]
+      (lambda () (interactive) (undo-tree-visualizer-select-next 10)))
+    (define-key map [prior]
+      (lambda () (interactive) (undo-tree-visualizer-select-previous 10)))
+    ;; horizontal motion keys move to left and right siblings
+    (define-key map [remap forward-char] 'undo-tree-visualizer-select-right)
+    (define-key map [remap backward-char] 'undo-tree-visualizer-select-left)
+    (define-key map [right] 'undo-tree-visualizer-select-right)
+    (define-key map "f" 'undo-tree-visualizer-select-right)
+    (define-key map "\C-f" 'undo-tree-visualizer-select-right)
+    (define-key map [left] 'undo-tree-visualizer-select-left)
+    (define-key map "b" 'undo-tree-visualizer-select-left)
+    (define-key map "\C-b" 'undo-tree-visualizer-select-left)
+    ;; horizontal scroll keys move left or right quickly
+    (define-key map ","
+      (lambda () (interactive) (undo-tree-visualizer-select-left 10)))
+    (define-key map "."
+      (lambda () (interactive) (undo-tree-visualizer-select-right 10)))
+    (define-key map "<"
+      (lambda () (interactive) (undo-tree-visualizer-select-left 10)))
+    (define-key map ">"
+      (lambda () (interactive) (undo-tree-visualizer-select-right 10)))
+    ;; mouse or <enter> sets buffer state to node at point/click
+    (define-key map "\r" 'undo-tree-visualizer-set)
+    (define-key map [mouse-1] 'undo-tree-visualizer-mouse-set)
+    ;; toggle timestamps
+    (define-key map "t" 'undo-tree-visualizer-toggle-timestamps)
+    ;; toggle diff
+    (define-key map "d" 'undo-tree-visualizer-selection-toggle-diff)
+    ;; quit visualizer selection mode
+    (define-key map "s" 'undo-tree-visualizer-mode)
+    ;; quit visualizer
+    (define-key map "q" 'undo-tree-visualizer-quit)
+    (define-key map "\C-q" 'undo-tree-visualizer-abort)
+    ;; set keymap
+    (setq undo-tree-visualizer-selection-map map)))
+
+
+
+\f
+;;; =====================================================================
+;;;                     Undo-tree data structure
+
+(defstruct
+  (undo-tree
+   :named
+   (:constructor nil)
+   (:constructor make-undo-tree
+                 (&aux
+                  (root (undo-tree-make-node nil nil))
+                  (current root)
+                  (size 0)
+                 (count 0)
+                 (object-pool (make-hash-table :test 'eq :weakness 'value))))
+   ;;(:copier nil)
+   )
+  root current size count object-pool)
+
+
+
+(defstruct
+  (undo-tree-node
+   (:type vector)   ; create unnamed struct
+   (:constructor nil)
+   (:constructor undo-tree-make-node
+                 (previous undo
+                 &optional redo
+                  &aux
+                  (timestamp (current-time))
+                  (branch 0)))
+   (:constructor undo-tree-make-node-backwards
+                 (next-node undo
+                 &optional redo
+                  &aux
+                  (next (list next-node))
+                  (timestamp (current-time))
+                  (branch 0)))
+   (:copier nil))
+  previous next undo redo timestamp branch meta-data)
+
+
+(defmacro undo-tree-node-p (n)
+  (let ((len (length (undo-tree-make-node nil nil))))
+    `(and (vectorp ,n) (= (length ,n) ,len))))
+
+
+
+(defstruct
+  (undo-tree-region-data
+   (:type vector)   ; create unnamed struct
+   (:constructor nil)
+   (:constructor undo-tree-make-region-data
+                (&optional undo-beginning undo-end
+                            redo-beginning redo-end))
+   (:constructor undo-tree-make-undo-region-data
+                (undo-beginning undo-end))
+   (:constructor undo-tree-make-redo-region-data
+                (redo-beginning redo-end))
+   (:copier nil))
+  undo-beginning undo-end redo-beginning redo-end)
+
+
+(defmacro undo-tree-region-data-p (r)
+  (let ((len (length (undo-tree-make-region-data))))
+    `(and (vectorp ,r) (= (length ,r) ,len))))
+
+(defmacro undo-tree-node-clear-region-data (node)
+  `(setf (undo-tree-node-meta-data ,node)
+        (delq nil
+              (delq :region
+                    (plist-put (undo-tree-node-meta-data ,node)
+                               :region nil)))))
+
+
+(defmacro undo-tree-node-undo-beginning (node)
+  `(let ((r (plist-get (undo-tree-node-meta-data ,node) :region)))
+     (when (undo-tree-region-data-p r)
+       (undo-tree-region-data-undo-beginning r))))
+
+(defmacro undo-tree-node-undo-end (node)
+  `(let ((r (plist-get (undo-tree-node-meta-data ,node) :region)))
+     (when (undo-tree-region-data-p r)
+       (undo-tree-region-data-undo-end r))))
+
+(defmacro undo-tree-node-redo-beginning (node)
+  `(let ((r (plist-get (undo-tree-node-meta-data ,node) :region)))
+     (when (undo-tree-region-data-p r)
+       (undo-tree-region-data-redo-beginning r))))
+
+(defmacro undo-tree-node-redo-end (node)
+  `(let ((r (plist-get (undo-tree-node-meta-data ,node) :region)))
+     (when (undo-tree-region-data-p r)
+       (undo-tree-region-data-redo-end r))))
+
+
+(defsetf undo-tree-node-undo-beginning (node) (val)
+  `(let ((r (plist-get (undo-tree-node-meta-data ,node) :region)))
+     (unless (undo-tree-region-data-p r)
+       (setf (undo-tree-node-meta-data ,node)
+            (plist-put (undo-tree-node-meta-data ,node) :region
+                       (setq r (undo-tree-make-region-data)))))
+     (setf (undo-tree-region-data-undo-beginning r) ,val)))
+
+(defsetf undo-tree-node-undo-end (node) (val)
+  `(let ((r (plist-get (undo-tree-node-meta-data ,node) :region)))
+     (unless (undo-tree-region-data-p r)
+       (setf (undo-tree-node-meta-data ,node)
+            (plist-put (undo-tree-node-meta-data ,node) :region
+                       (setq r (undo-tree-make-region-data)))))
+     (setf (undo-tree-region-data-undo-end r) ,val)))
+
+(defsetf undo-tree-node-redo-beginning (node) (val)
+  `(let ((r (plist-get (undo-tree-node-meta-data ,node) :region)))
+     (unless (undo-tree-region-data-p r)
+       (setf (undo-tree-node-meta-data ,node)
+            (plist-put (undo-tree-node-meta-data ,node) :region
+                       (setq r (undo-tree-make-region-data)))))
+     (setf (undo-tree-region-data-redo-beginning r) ,val)))
+
+(defsetf undo-tree-node-redo-end (node) (val)
+  `(let ((r (plist-get (undo-tree-node-meta-data ,node) :region)))
+     (unless (undo-tree-region-data-p r)
+       (setf (undo-tree-node-meta-data ,node)
+            (plist-put (undo-tree-node-meta-data ,node) :region
+                       (setq r (undo-tree-make-region-data)))))
+     (setf (undo-tree-region-data-redo-end r) ,val)))
+
+
+
+(defstruct
+  (undo-tree-visualizer-data
+   (:type vector)   ; create unnamed struct
+   (:constructor nil)
+   (:constructor undo-tree-make-visualizer-data
+                (&optional lwidth cwidth rwidth marker))
+   (:copier nil))
+  lwidth cwidth rwidth marker)
+
+
+(defmacro undo-tree-visualizer-data-p (v)
+  (let ((len (length (undo-tree-make-visualizer-data))))
+    `(and (vectorp ,v) (= (length ,v) ,len))))
+
+(defun undo-tree-node-clear-visualizer-data (node)
+  (let ((plist (undo-tree-node-meta-data node)))
+    (if (eq (car plist) :visualizer)
+       (setf (undo-tree-node-meta-data node) (nthcdr 2 plist))
+      (while (and plist (not (eq (cadr plist) :visualizer)))
+       (setq plist (cdr plist)))
+      (if plist (setcdr plist (nthcdr 3 plist))))))
+
+(defmacro undo-tree-node-lwidth (node)
+  `(let ((v (plist-get (undo-tree-node-meta-data ,node) :visualizer)))
+     (when (undo-tree-visualizer-data-p v)
+       (undo-tree-visualizer-data-lwidth v))))
+
+(defmacro undo-tree-node-cwidth (node)
+  `(let ((v (plist-get (undo-tree-node-meta-data ,node) :visualizer)))
+     (when (undo-tree-visualizer-data-p v)
+       (undo-tree-visualizer-data-cwidth v))))
+
+(defmacro undo-tree-node-rwidth (node)
+  `(let ((v (plist-get (undo-tree-node-meta-data ,node) :visualizer)))
+     (when (undo-tree-visualizer-data-p v)
+       (undo-tree-visualizer-data-rwidth v))))
+
+(defmacro undo-tree-node-marker (node)
+  `(let ((v (plist-get (undo-tree-node-meta-data ,node) :visualizer)))
+     (when (undo-tree-visualizer-data-p v)
+       (undo-tree-visualizer-data-marker v))))
+
+
+(defsetf undo-tree-node-lwidth (node) (val)
+  `(let ((v (plist-get (undo-tree-node-meta-data ,node) :visualizer)))
+     (unless (undo-tree-visualizer-data-p v)
+       (setf (undo-tree-node-meta-data ,node)
+            (plist-put (undo-tree-node-meta-data ,node) :visualizer
+                       (setq v (undo-tree-make-visualizer-data)))))
+     (setf (undo-tree-visualizer-data-lwidth v) ,val)))
+
+(defsetf undo-tree-node-cwidth (node) (val)
+  `(let ((v (plist-get (undo-tree-node-meta-data ,node) :visualizer)))
+     (unless (undo-tree-visualizer-data-p v)
+       (setf (undo-tree-node-meta-data ,node)
+            (plist-put (undo-tree-node-meta-data ,node) :visualizer
+                       (setq v (undo-tree-make-visualizer-data)))))
+     (setf (undo-tree-visualizer-data-cwidth v) ,val)))
+
+(defsetf undo-tree-node-rwidth (node) (val)
+  `(let ((v (plist-get (undo-tree-node-meta-data ,node) :visualizer)))
+     (unless (undo-tree-visualizer-data-p v)
+       (setf (undo-tree-node-meta-data ,node)
+            (plist-put (undo-tree-node-meta-data ,node) :visualizer
+                       (setq v (undo-tree-make-visualizer-data)))))
+     (setf (undo-tree-visualizer-data-rwidth v) ,val)))
+
+(defsetf undo-tree-node-marker (node) (val)
+  `(let ((v (plist-get (undo-tree-node-meta-data ,node) :visualizer)))
+     (unless (undo-tree-visualizer-data-p v)
+       (setf (undo-tree-node-meta-data ,node)
+            (plist-put (undo-tree-node-meta-data ,node) :visualizer
+                       (setq v (undo-tree-make-visualizer-data)))))
+     (setf (undo-tree-visualizer-data-marker v) ,val)))
+
+
+
+(defstruct
+  (undo-tree-register-data
+   (:type vector)
+   (:constructor nil)
+   (:constructor undo-tree-make-register-data (buffer node)))
+  buffer node)
+
+(defun undo-tree-register-data-p (data)
+  (and (vectorp data)
+       (= (length data) 2)
+       (undo-tree-node-p (undo-tree-register-data-node data))))
+
+(defun undo-tree-register-data-print-func (data)
+  (princ (format "an undo-tree state for buffer %s"
+                (undo-tree-register-data-buffer data))))
+
+(defmacro undo-tree-node-register (node)
+  `(plist-get (undo-tree-node-meta-data ,node) :register))
+
+(defsetf undo-tree-node-register (node) (val)
+  `(setf (undo-tree-node-meta-data ,node)
+        (plist-put (undo-tree-node-meta-data ,node) :register ,val)))
+
+
+
+\f
+;;; =====================================================================
+;;;              Basic undo-tree data structure functions
+
+(defun undo-tree-grow (undo)
+  "Add an UNDO node to current branch of `buffer-undo-tree'."
+  (let* ((current (undo-tree-current buffer-undo-tree))
+         (new (undo-tree-make-node current undo)))
+    (push new (undo-tree-node-next current))
+    (setf (undo-tree-current buffer-undo-tree) new)))
+
+
+(defun undo-tree-grow-backwards (node undo &optional redo)
+  "Add new node *above* undo-tree NODE, and return new node.
+Note that this will overwrite NODE's \"previous\" link, so should
+only be used on a detached NODE, never on nodes that are already
+part of `buffer-undo-tree'."
+  (let ((new (undo-tree-make-node-backwards node undo redo)))
+    (setf (undo-tree-node-previous node) new)
+    new))
+
+
+(defun undo-tree-splice-node (node splice)
+  "Splice NODE into undo tree, below node SPLICE.
+Note that this will overwrite NODE's \"next\" and \"previous\"
+links, so should only be used on a detached NODE, never on nodes
+that are already part of `buffer-undo-tree'."
+  (setf (undo-tree-node-next node) (undo-tree-node-next splice)
+       (undo-tree-node-branch node) (undo-tree-node-branch splice)
+       (undo-tree-node-previous node) splice
+       (undo-tree-node-next splice) (list node)
+       (undo-tree-node-branch splice) 0)
+  (dolist (n (undo-tree-node-next node))
+    (setf (undo-tree-node-previous n) node)))
+
+
+(defun undo-tree-snip-node (node)
+  "Snip NODE out of undo tree."
+  (let* ((parent (undo-tree-node-previous node))
+        position p)
+    ;; if NODE is only child, replace parent's next links with NODE's
+    (if (= (length (undo-tree-node-next parent)) 0)
+       (setf (undo-tree-node-next parent) (undo-tree-node-next node)
+             (undo-tree-node-branch parent) (undo-tree-node-branch node))
+      ;; otherwise...
+      (setq position (undo-tree-position node (undo-tree-node-next parent)))
+      (cond
+       ;; if active branch used do go via NODE, set parent's branch to active
+       ;; branch of NODE
+       ((= (undo-tree-node-branch parent) position)
+       (setf (undo-tree-node-branch parent)
+             (+ position (undo-tree-node-branch node))))
+       ;; if active branch didn't go via NODE, update parent's branch to point
+       ;; to same node as before
+       ((> (undo-tree-node-branch parent) position)
+       (incf (undo-tree-node-branch parent)
+             (1- (length (undo-tree-node-next node))))))
+      ;; replace NODE in parent's next list with NODE's entire next list
+      (if (= position 0)
+         (setf (undo-tree-node-next parent)
+               (nconc (undo-tree-node-next node)
+                      (cdr (undo-tree-node-next parent))))
+       (setq p (nthcdr (1- position) (undo-tree-node-next parent)))
+       (setcdr p (nconc (undo-tree-node-next node) (cddr p)))))
+    ;; update previous links of NODE's children
+    (dolist (n (undo-tree-node-next node))
+      (setf (undo-tree-node-previous n) parent))))
+
+
+(defun undo-tree-mapc (--undo-tree-mapc-function-- node)
+  ;; Apply FUNCTION to NODE and to each node below it.
+  (let ((stack (list node))
+       n)
+    (while stack
+      (setq n (pop stack))
+      (funcall --undo-tree-mapc-function-- n)
+      (setq stack (append (undo-tree-node-next n) stack)))))
+
+
+(defmacro undo-tree-num-branches ()
+  "Return number of branches at current undo tree node."
+  '(length (undo-tree-node-next (undo-tree-current buffer-undo-tree))))
+
+
+(defun undo-tree-position (node list)
+  "Find the first occurrence of NODE in LIST.
+Return the index of the matching item, or nil of not found.
+Comparison is done with `eq'."
+  (let ((i 0))
+    (catch 'found
+      (while (progn
+               (when (eq node (car list)) (throw 'found i))
+               (incf i)
+               (setq list (cdr list))))
+      nil)))
+
+
+(defvar *undo-tree-id-counter* 0)
+(make-variable-buffer-local '*undo-tree-id-counter*)
+
+(defmacro undo-tree-generate-id ()
+  ;; Generate a new, unique id (uninterned symbol).
+  ;; The name is made by appending a number to "undo-tree-id".
+  ;; (Copied from CL package `gensym'.)
+  `(let ((num (prog1 *undo-tree-id-counter* (incf *undo-tree-id-counter*))))
+     (make-symbol (format "undo-tree-id%d" num))))
+
+
+(defun undo-tree-decircle (undo-tree)
+  ;; Nullify PREVIOUS links of UNDO-TREE nodes, to make UNDO-TREE data
+  ;; structure non-circular.
+  (undo-tree-mapc
+   (lambda (node)
+     (dolist (n (undo-tree-node-next node))
+       (setf (undo-tree-node-previous n) nil)))
+   (undo-tree-root undo-tree)))
+
+
+(defun undo-tree-recircle (undo-tree)
+  ;; Recreate PREVIOUS links of UNDO-TREE nodes, to restore circular UNDO-TREE
+  ;; data structure.
+  (undo-tree-mapc
+   (lambda (node)
+     (dolist (n (undo-tree-node-next node))
+       (setf (undo-tree-node-previous n) node)))
+   (undo-tree-root undo-tree)))
+
+
+
+\f
+;;; =====================================================================
+;;;             Undo list and undo changeset utility functions
+
+(defmacro undo-list-marker-elt-p (elt)
+  `(markerp (car-safe ,elt)))
+
+(defmacro undo-list-GCd-marker-elt-p (elt)
+  ;; Return t if ELT is a marker element whose marker has been moved to the
+  ;; object-pool, so may potentially have been garbage-collected.
+  ;; Note: Valid marker undo elements should be uniquely identified as cons
+  ;; cells with a symbol in the car (replacing the marker), and a number in
+  ;; the cdr. However, to guard against future changes to undo element
+  ;; formats, we perform an additional redundant check on the symbol name.
+  `(and (car-safe ,elt)
+       (symbolp (car ,elt))
+       (let ((str (symbol-name (car ,elt))))
+         (and (> (length str) 12)
+              (string= (substring str 0 12) "undo-tree-id")))
+       (numberp (cdr-safe ,elt))))
+
+
+(defun undo-tree-move-GC-elts-to-pool (elt)
+  ;; Move elements that can be garbage-collected into `buffer-undo-tree'
+  ;; object pool, substituting a unique id that can be used to retrieve them
+  ;; later. (Only markers require this treatment currently.)
+  (when (undo-list-marker-elt-p elt)
+    (let ((id (undo-tree-generate-id)))
+      (puthash id (car elt) (undo-tree-object-pool buffer-undo-tree))
+      (setcar elt id))))
+
+
+(defun undo-tree-restore-GC-elts-from-pool (elt)
+  ;; Replace object id's in ELT with corresponding objects from
+  ;; `buffer-undo-tree' object pool and return modified ELT, or return nil if
+  ;; any object in ELT has been garbage-collected.
+  (if (undo-list-GCd-marker-elt-p elt)
+      (when (setcar elt (gethash (car elt)
+                                (undo-tree-object-pool buffer-undo-tree)))
+       elt)
+    elt))
+
+
+(defun undo-list-clean-GCd-elts (undo-list)
+  ;; Remove object id's from UNDO-LIST that refer to elements that have been
+  ;; garbage-collected. UNDO-LIST is modified by side-effect.
+  (while (undo-list-GCd-marker-elt-p (car undo-list))
+    (unless (gethash (caar undo-list)
+                    (undo-tree-object-pool buffer-undo-tree))
+      (setq undo-list (cdr undo-list))))
+  (let ((p undo-list))
+    (while (cdr p)
+      (when (and (undo-list-GCd-marker-elt-p (cadr p))
+                (null (gethash (car (cadr p))
+                               (undo-tree-object-pool buffer-undo-tree))))
+       (setcdr p (cddr p)))
+      (setq p (cdr p))))
+  undo-list)
+
+
+(defun undo-list-pop-changeset (&optional discard-pos)
+  ;; Pop changeset from `buffer-undo-list'. If DISCARD-POS is non-nil, discard
+  ;; any position entries from changeset.
+
+  ;; discard undo boundaries and (if DISCARD-POS is non-nil) position entries
+  ;; at head of undo list
+  (while (or (null (car buffer-undo-list))
+            (and discard-pos (integerp (car buffer-undo-list))))
+    (setq buffer-undo-list (cdr buffer-undo-list)))
+  ;; pop elements up to next undo boundary, discarding position entries if
+  ;; DISCARD-POS is non-nil
+  (if (eq (car buffer-undo-list) 'undo-tree-canary)
+      (push nil buffer-undo-list)
+    (let* ((changeset (list (pop buffer-undo-list)))
+           (p changeset))
+      (while (progn
+              (undo-tree-move-GC-elts-to-pool (car p))
+              (while (and discard-pos (integerp (car buffer-undo-list)))
+                (setq buffer-undo-list (cdr buffer-undo-list)))
+              (and (car buffer-undo-list)
+                   (not (eq (car buffer-undo-list) 'undo-tree-canary))))
+        (setcdr p (list (pop buffer-undo-list)))
+       (setq p (cdr p)))
+      changeset)))
+
+
+(defun undo-tree-copy-list (undo-list)
+  ;; Return a deep copy of first changeset in `undo-list'. Object id's are
+  ;; replaced by corresponding objects from `buffer-undo-tree' object-pool.
+  (when undo-list
+    (let (copy p)
+      ;; if first element contains an object id, replace it with object from
+      ;; pool, discarding element entirely if it's been GC'd
+      (while (null copy)
+       (setq copy
+             (undo-tree-restore-GC-elts-from-pool (pop undo-list))))
+      (setq copy (list copy)
+           p copy)
+      ;; copy remaining elements, replacing object id's with objects from
+      ;; pool, or discarding them entirely if they've been GC'd
+      (while undo-list
+       (when (setcdr p (undo-tree-restore-GC-elts-from-pool
+                        (undo-copy-list-1 (pop undo-list))))
+         (setcdr p (list (cdr p)))
+         (setq p (cdr p))))
+      copy)))
+
+
+
+(defun undo-list-transfer-to-tree ()
+  ;; Transfer entries accumulated in `buffer-undo-list' to `buffer-undo-tree'.
+
+  ;; `undo-list-transfer-to-tree' should never be called when undo is disabled
+  ;; (i.e. `buffer-undo-tree' is t)
+  (assert (not (eq buffer-undo-tree t)))
+
+  ;; if `buffer-undo-tree' is empty, create initial undo-tree
+  (when (null buffer-undo-tree) (setq buffer-undo-tree (make-undo-tree)))
+  ;; make sure there's a canary at end of `buffer-undo-list'
+  (when (null buffer-undo-list)
+    (setq buffer-undo-list '(nil undo-tree-canary)))
+
+  (unless (or (eq (cadr buffer-undo-list) 'undo-tree-canary)
+             (eq (car buffer-undo-list) 'undo-tree-canary))
+    ;; create new node from first changeset in `buffer-undo-list', save old
+    ;; `buffer-undo-tree' current node, and make new node the current node
+    (let* ((node (undo-tree-make-node nil (undo-list-pop-changeset)))
+          (splice (undo-tree-current buffer-undo-tree))
+          (size (undo-list-byte-size (undo-tree-node-undo node)))
+          (count 1))
+      (setf (undo-tree-current buffer-undo-tree) node)
+      ;; grow tree fragment backwards using `buffer-undo-list' changesets
+      (while (and buffer-undo-list
+                 (not (eq (cadr buffer-undo-list) 'undo-tree-canary)))
+       (setq node
+             (undo-tree-grow-backwards node (undo-list-pop-changeset)))
+       (incf size (undo-list-byte-size (undo-tree-node-undo node)))
+       (incf count))
+      ;; if no undo history has been discarded from `buffer-undo-list' since
+      ;; last transfer, splice new tree fragment onto end of old
+      ;; `buffer-undo-tree' current node
+      (if (or (eq (cadr buffer-undo-list) 'undo-tree-canary)
+             (eq (car buffer-undo-list) 'undo-tree-canary))
+         (progn
+           (setf (undo-tree-node-previous node) splice)
+           (push node (undo-tree-node-next splice))
+           (setf (undo-tree-node-branch splice) 0)
+           (incf (undo-tree-size buffer-undo-tree) size)
+           (incf (undo-tree-count buffer-undo-tree) count))
+       ;; if undo history has been discarded, replace entire
+       ;; `buffer-undo-tree' with new tree fragment
+       (setq node (undo-tree-grow-backwards node nil))
+       (setf (undo-tree-root buffer-undo-tree) node)
+       (setq buffer-undo-list '(nil undo-tree-canary))
+       (setf (undo-tree-size buffer-undo-tree) size)
+       (setf (undo-tree-count buffer-undo-tree) count)
+       (setq buffer-undo-list '(nil undo-tree-canary))))
+    ;; discard undo history if necessary
+    (undo-tree-discard-history)))
+
+
+(defun undo-list-byte-size (undo-list)
+  ;; Return size (in bytes) of UNDO-LIST
+  (let ((size 0) (p undo-list))
+    (while p
+      (incf size 8)  ; cons cells use up 8 bytes
+      (when (and (consp (car p)) (stringp (caar p)))
+        (incf size (string-bytes (caar p))))
+      (setq p (cdr p)))
+    size))
+
+
+
+(defun undo-list-rebuild-from-tree ()
+  "Rebuild `buffer-undo-list' from information in `buffer-undo-tree'."
+  (unless (eq buffer-undo-list t)
+    (undo-list-transfer-to-tree)
+    (setq buffer-undo-list nil)
+    (when buffer-undo-tree
+      (let ((stack (list (list (undo-tree-root buffer-undo-tree)))))
+       (push (sort (mapcar 'identity (undo-tree-node-next (caar stack)))
+                   (lambda (a b)
+                     (time-less-p (undo-tree-node-timestamp a)
+                                  (undo-tree-node-timestamp b))))
+             stack)
+       ;; Traverse tree in depth-and-oldest-first order, but add undo records
+       ;; on the way down, and redo records on the way up.
+       (while (or (car stack)
+                  (not (eq (car (nth 1 stack))
+                           (undo-tree-current buffer-undo-tree))))
+         (if (car stack)
+             (progn
+               (setq buffer-undo-list
+                     (append (undo-tree-node-undo (caar stack))
+                             buffer-undo-list))
+               (undo-boundary)
+               (push (sort (mapcar 'identity
+                                   (undo-tree-node-next (caar stack)))
+                           (lambda (a b)
+                             (time-less-p (undo-tree-node-timestamp a)
+                                          (undo-tree-node-timestamp b))))
+                     stack))
+           (pop stack)
+           (setq buffer-undo-list
+                 (append (undo-tree-node-redo (caar stack))
+                         buffer-undo-list))
+           (undo-boundary)
+           (pop (car stack))))))))
+
+
+
+\f
+;;; =====================================================================
+;;;                History discarding utility functions
+
+(defun undo-tree-oldest-leaf (node)
+  ;; Return oldest leaf node below NODE.
+  (while (undo-tree-node-next node)
+    (setq node
+          (car (sort (mapcar 'identity (undo-tree-node-next node))
+                     (lambda (a b)
+                       (time-less-p (undo-tree-node-timestamp a)
+                                    (undo-tree-node-timestamp b)))))))
+  node)
+
+
+(defun undo-tree-discard-node (node)
+  ;; Discard NODE from `buffer-undo-tree', and return next in line for
+  ;; discarding.
+
+  ;; don't discard current node
+  (unless (eq node (undo-tree-current buffer-undo-tree))
+
+    ;; discarding root node...
+    (if (eq node (undo-tree-root buffer-undo-tree))
+        (cond
+         ;; should always discard branches before root
+         ((> (length (undo-tree-node-next node)) 1)
+          (error "Trying to discard undo-tree root which still\
+ has multiple branches"))
+         ;; don't discard root if current node is only child
+         ((eq (car (undo-tree-node-next node))
+              (undo-tree-current buffer-undo-tree))
+         nil)
+        ;; discard root
+         (t
+         ;; clear any register referring to root
+         (let ((r (undo-tree-node-register node)))
+           (when (and r (eq (get-register r) node))
+             (set-register r nil)))
+          ;; make child of root into new root
+          (setq node (setf (undo-tree-root buffer-undo-tree)
+                           (car (undo-tree-node-next node))))
+         ;; update undo-tree size
+         (decf (undo-tree-size buffer-undo-tree)
+               (+ (undo-list-byte-size (undo-tree-node-undo node))
+                  (undo-list-byte-size (undo-tree-node-redo node))))
+         (decf (undo-tree-count buffer-undo-tree))
+         ;; discard new root's undo data and PREVIOUS link
+         (setf (undo-tree-node-undo node) nil
+               (undo-tree-node-redo node) nil
+               (undo-tree-node-previous node) nil)
+          ;; if new root has branches, or new root is current node, next node
+          ;; to discard is oldest leaf, otherwise it's new root
+          (if (or (> (length (undo-tree-node-next node)) 1)
+                  (eq (car (undo-tree-node-next node))
+                      (undo-tree-current buffer-undo-tree)))
+              (undo-tree-oldest-leaf node)
+            node)))
+
+      ;; discarding leaf node...
+      (let* ((parent (undo-tree-node-previous node))
+             (current (nth (undo-tree-node-branch parent)
+                           (undo-tree-node-next parent))))
+       ;; clear any register referring to the discarded node
+       (let ((r (undo-tree-node-register node)))
+         (when (and r (eq (get-register r) node))
+           (set-register r nil)))
+       ;; update undo-tree size
+       (decf (undo-tree-size buffer-undo-tree)
+             (+ (undo-list-byte-size (undo-tree-node-undo node))
+                (undo-list-byte-size (undo-tree-node-redo node))))
+       (decf (undo-tree-count buffer-undo-tree))
+       ;; discard leaf
+        (setf (undo-tree-node-next parent)
+                (delq node (undo-tree-node-next parent))
+              (undo-tree-node-branch parent)
+                (undo-tree-position current (undo-tree-node-next parent)))
+        ;; if parent has branches, or parent is current node, next node to
+        ;; discard is oldest leaf, otherwise it's the parent itself
+        (if (or (eq parent (undo-tree-current buffer-undo-tree))
+                (and (undo-tree-node-next parent)
+                     (or (not (eq parent (undo-tree-root buffer-undo-tree)))
+                         (> (length (undo-tree-node-next parent)) 1))))
+            (undo-tree-oldest-leaf parent)
+          parent)))))
+
+
+
+(defun undo-tree-discard-history ()
+  "Discard undo history until we're within memory usage limits
+set by `undo-limit', `undo-strong-limit' and `undo-outer-limit'."
+
+  (when (> (undo-tree-size buffer-undo-tree) undo-limit)
+    ;; if there are no branches off root, first node to discard is root;
+    ;; otherwise it's leaf node at botom of oldest branch
+    (let ((node (if (> (length (undo-tree-node-next
+                                (undo-tree-root buffer-undo-tree))) 1)
+                    (undo-tree-oldest-leaf (undo-tree-root buffer-undo-tree))
+                  (undo-tree-root buffer-undo-tree))))
+
+      ;; discard nodes until memory use is within `undo-strong-limit'
+      (while (and node
+                  (> (undo-tree-size buffer-undo-tree) undo-strong-limit))
+        (setq node (undo-tree-discard-node node)))
+
+      ;; discard nodes until next node to discard would bring memory use
+      ;; within `undo-limit'
+      (while (and node
+                 ;; check first if last discard has brought us within
+                 ;; `undo-limit', in case we can avoid more expensive
+                 ;; `undo-strong-limit' calculation
+                 ;; Note: this assumes undo-strong-limit > undo-limit;
+                 ;;       if not, effectively undo-strong-limit = undo-limit
+                 (> (undo-tree-size buffer-undo-tree) undo-limit)
+                  (> (- (undo-tree-size buffer-undo-tree)
+                       ;; if next node to discard is root, the memory we
+                       ;; free-up comes from discarding changesets from its
+                       ;; only child...
+                       (if (eq node (undo-tree-root buffer-undo-tree))
+                           (+ (undo-list-byte-size
+                               (undo-tree-node-undo
+                                (car (undo-tree-node-next node))))
+                              (undo-list-byte-size
+                               (undo-tree-node-redo
+                                (car (undo-tree-node-next node)))))
+                         ;; ...otherwise, it comes from discarding changesets
+                         ;; from along with the node itself
+                         (+ (undo-list-byte-size (undo-tree-node-undo node))
+                            (undo-list-byte-size (undo-tree-node-redo node)))
+                         ))
+                     undo-limit))
+        (setq node (undo-tree-discard-node node)))
+
+      ;; if we're still over the `undo-outer-limit', discard entire history
+      (when (> (undo-tree-size buffer-undo-tree) undo-outer-limit)
+        ;; query first if `undo-ask-before-discard' is set
+        (if undo-ask-before-discard
+            (when (yes-or-no-p
+                   (format
+                    "Buffer `%s' undo info is %d bytes long;  discard it? "
+                    (buffer-name) (undo-tree-size buffer-undo-tree)))
+              (setq buffer-undo-tree nil))
+          ;; otherwise, discard and display warning
+          (display-warning
+           '(undo discard-info)
+           (concat
+            (format "Buffer `%s' undo info was %d bytes long.\n"
+                    (buffer-name) (undo-tree-size buffer-undo-tree))
+            "The undo info was discarded because it exceeded\
+ `undo-outer-limit'.
+
+This is normal if you executed a command that made a huge change
+to the buffer. In that case, to prevent similar problems in the
+future, set `undo-outer-limit' to a value that is large enough to
+cover the maximum size of normal changes you expect a single
+command to make, but not so large that it might exceed the
+maximum memory allotted to Emacs.
+
+If you did not execute any such command, the situation is
+probably due to a bug and you should report it.
+
+You can disable the popping up of this buffer by adding the entry
+\(undo discard-info) to the user option `warning-suppress-types',
+which is defined in the `warnings' library.\n")
+           :warning)
+          (setq buffer-undo-tree nil)))
+      )))
+
+
+
+\f
+;;; =====================================================================
+;;;                   Visualizer utility functions
+
+(defun undo-tree-compute-widths (node)
+  "Recursively compute widths for nodes below NODE."
+  (let ((stack (list node))
+        res)
+    (while stack
+      ;; try to compute widths for node at top of stack
+      (if (undo-tree-node-p
+           (setq res (undo-tree-node-compute-widths (car stack))))
+          ;; if computation fails, it returns a node whose widths still need
+          ;; computing, which we push onto the stack
+          (push res stack)
+        ;; otherwise, store widths and remove it from stack
+        (setf (undo-tree-node-lwidth (car stack)) (aref res 0)
+              (undo-tree-node-cwidth (car stack)) (aref res 1)
+              (undo-tree-node-rwidth (car stack)) (aref res 2))
+        (pop stack)))))
+
+
+(defun undo-tree-node-compute-widths (node)
+  ;; Compute NODE's left-, centre-, and right-subtree widths. Returns widths
+  ;; (in a vector) if successful. Otherwise, returns a node whose widths need
+  ;; calculating before NODE's can be calculated.
+  (let ((num-children (length (undo-tree-node-next node)))
+        (lwidth 0) (cwidth 0) (rwidth 0) p)
+    (catch 'need-widths
+      (cond
+       ;; leaf nodes have 0 width
+       ((= 0 num-children)
+        (setf cwidth 1
+              (undo-tree-node-lwidth node) 0
+              (undo-tree-node-cwidth node) 1
+              (undo-tree-node-rwidth node) 0))
+
+       ;; odd number of children
+       ((= (mod num-children 2) 1)
+        (setq p (undo-tree-node-next node))
+        ;; compute left-width
+        (dotimes (i (/ num-children 2))
+          (if (undo-tree-node-lwidth (car p))
+              (incf lwidth (+ (undo-tree-node-lwidth (car p))
+                              (undo-tree-node-cwidth (car p))
+                              (undo-tree-node-rwidth (car p))))
+            ;; if child's widths haven't been computed, return that child
+            (throw 'need-widths (car p)))
+          (setq p (cdr p)))
+        (if (undo-tree-node-lwidth (car p))
+            (incf lwidth (undo-tree-node-lwidth (car p)))
+          (throw 'need-widths (car p)))
+        ;; centre-width is inherited from middle child
+        (setf cwidth (undo-tree-node-cwidth (car p)))
+        ;; compute right-width
+        (incf rwidth (undo-tree-node-rwidth (car p)))
+        (setq p (cdr p))
+        (dotimes (i (/ num-children 2))
+          (if (undo-tree-node-lwidth (car p))
+              (incf rwidth (+ (undo-tree-node-lwidth (car p))
+                              (undo-tree-node-cwidth (car p))
+                              (undo-tree-node-rwidth (car p))))
+            (throw 'need-widths (car p)))
+          (setq p (cdr p))))
+
+       ;; even number of children
+       (t
+        (setq p (undo-tree-node-next node))
+        ;; compute left-width
+        (dotimes (i (/ num-children 2))
+          (if (undo-tree-node-lwidth (car p))
+              (incf lwidth (+ (undo-tree-node-lwidth (car p))
+                              (undo-tree-node-cwidth (car p))
+                              (undo-tree-node-rwidth (car p))))
+            (throw 'need-widths (car p)))
+          (setq p (cdr p)))
+        ;; centre-width is 0 when number of children is even
+        (setq cwidth 0)
+        ;; compute right-width
+        (dotimes (i (/ num-children 2))
+          (if (undo-tree-node-lwidth (car p))
+              (incf rwidth (+ (undo-tree-node-lwidth (car p))
+                              (undo-tree-node-cwidth (car p))
+                              (undo-tree-node-rwidth (car p))))
+            (throw 'need-widths (car p)))
+          (setq p (cdr p)))))
+
+      ;; return left-, centre- and right-widths
+      (vector lwidth cwidth rwidth))))
+
+
+(defun undo-tree-clear-visualizer-data (tree)
+  ;; Clear visualizer data below NODE.
+  (undo-tree-mapc
+   (lambda (n) (undo-tree-node-clear-visualizer-data n))
+   (undo-tree-root tree)))
+
+
+(defun undo-tree-node-unmodified-p (node &optional mtime)
+  ;; Return non-nil if NODE corresponds to a buffer state that once upon a
+  ;; time was unmodified. If a file modification time MTIME is specified,
+  ;; return non-nil if the corresponding buffer state really is unmodified.
+  (let (changeset ntime)
+    (setq changeset
+         (or (undo-tree-node-redo node)
+             (and (setq changeset (car (undo-tree-node-next node)))
+                  (undo-tree-node-undo changeset)))
+         ntime
+         (catch 'found
+           (dolist (elt changeset)
+             (when (and (consp elt) (eq (car elt) t) (consp (cdr elt))
+                        (throw 'found (cdr elt)))))))
+    (and ntime
+        (or (null mtime)
+            ;; high-precision timestamps
+            (if (listp (cdr ntime))
+                (equal ntime mtime)
+              ;; old-style timestamps
+              (and (= (car ntime) (car mtime))
+                   (= (cdr ntime) (cadr mtime))))))))
+
+
+
+\f
+;;; =====================================================================
+;;;                  Undo-in-region utility functions
+
+;; `undo-elt-in-region' uses this as a dynamically-scoped variable
+(defvar undo-adjusted-markers nil)
+
+
+(defun undo-tree-pull-undo-in-region-branch (start end)
+  ;; Pull out entries from undo changesets to create a new undo-in-region
+  ;; branch, which undoes changeset entries lying between START and END first,
+  ;; followed by remaining entries from the changesets, before rejoining the
+  ;; existing undo tree history. Repeated calls will, if appropriate, extend
+  ;; the current undo-in-region branch rather than creating a new one.
+
+  ;; if we're just reverting the last redo-in-region, we don't need to
+  ;; manipulate the undo tree at all
+  (if (undo-tree-reverting-redo-in-region-p start end)
+      t  ; return t to indicate success
+
+    ;; We build the `region-changeset' and `delta-list' lists forwards, using
+    ;; pointers `r' and `d' to the penultimate element of the list. So that we
+    ;; don't have to treat the first element differently, we prepend a dummy
+    ;; leading nil to the lists, and have the pointers point to that
+    ;; initially.
+    ;; Note: using '(nil) instead of (list nil) in the `let*' results in
+    ;;       bizarre errors when the code is byte-compiled, where parts of the
+    ;;       lists appear to survive across different calls to this function.
+    ;;       An obscure byte-compiler bug, perhaps?
+    (let* ((region-changeset (list nil))
+          (r region-changeset)
+          (delta-list (list nil))
+          (d delta-list)
+          (node (undo-tree-current buffer-undo-tree))
+          (repeated-undo-in-region
+           (undo-tree-repeated-undo-in-region-p start end))
+          undo-adjusted-markers  ; `undo-elt-in-region' expects this
+          fragment splice original-fragment original-splice original-current
+          got-visible-elt undo-list elt)
+
+      ;; --- initialisation ---
+      (cond
+       ;; if this is a repeated undo in the same region, start pulling changes
+       ;; from NODE at which undo-in-region branch iss attached, and detatch
+       ;; the branch, using it as initial FRAGMENT of branch being constructed
+       (repeated-undo-in-region
+       (setq original-current node
+             fragment (car (undo-tree-node-next node))
+             splice node)
+       ;; undo up to node at which undo-in-region branch is attached
+       ;; (recognizable as first node with more than one branch)
+       (let ((mark-active nil))
+         (while (= (length (undo-tree-node-next node)) 1)
+           (undo-tree-undo-1)
+           (setq fragment node
+                 node (undo-tree-current buffer-undo-tree))))
+       (when (eq splice node) (setq splice nil))
+       ;; detatch undo-in-region branch
+       (setf (undo-tree-node-next node)
+             (delq fragment (undo-tree-node-next node))
+             (undo-tree-node-previous fragment) nil
+             original-fragment fragment
+             original-splice node))
+
+       ;; if this is a new undo-in-region, initial FRAGMENT is a copy of all
+       ;; nodes below the current one in the active branch
+       ((undo-tree-node-next node)
+       (setq fragment (undo-tree-make-node nil nil)
+             splice fragment)
+       (while (setq node (nth (undo-tree-node-branch node)
+                              (undo-tree-node-next node)))
+         (push (undo-tree-make-node
+                splice
+                (undo-copy-list (undo-tree-node-undo node))
+                (undo-copy-list (undo-tree-node-redo node)))
+               (undo-tree-node-next splice))
+         (setq splice (car (undo-tree-node-next splice))))
+       (setq fragment (car (undo-tree-node-next fragment))
+             splice nil
+             node (undo-tree-current buffer-undo-tree))))
+
+
+      ;; --- pull undo-in-region elements into branch ---
+      ;; work backwards up tree, pulling out undo elements within region until
+      ;; we've got one that undoes a visible change (insertion or deletion)
+      (catch 'abort
+       (while (and (not got-visible-elt) node (undo-tree-node-undo node))
+         ;; we cons a dummy nil element on the front of the changeset so that
+         ;; we can conveniently remove the first (real) element from the
+         ;; changeset if we need to; the leading nil is removed once we're
+         ;; done with this changeset
+         (setq undo-list (cons nil (undo-copy-list (undo-tree-node-undo node)))
+               elt (cadr undo-list))
+         (if fragment
+             (progn
+               (setq fragment (undo-tree-grow-backwards fragment undo-list))
+               (unless splice (setq splice fragment)))
+           (setq fragment (undo-tree-make-node nil undo-list))
+           (setq splice fragment))
+
+         (while elt
+           (cond
+            ;; keep elements within region
+            ((undo-elt-in-region elt start end)
+             ;; set flag if kept element is visible (insertion or deletion)
+             (when (and (consp elt)
+                        (or (stringp (car elt)) (integerp (car elt))))
+               (setq got-visible-elt t))
+             ;; adjust buffer positions in elements previously undone before
+             ;; kept element, as kept element will now be undone first
+             (undo-tree-adjust-elements-to-elt splice elt)
+             ;; move kept element to undo-in-region changeset, adjusting its
+             ;; buffer position as it will now be undone first
+             (setcdr r (list (undo-tree-apply-deltas elt (cdr delta-list))))
+             (setq r (cdr r))
+             (setcdr undo-list (cddr undo-list)))
+
+            ;; discard "was unmodified" elements
+            ;; FIXME: deal properly with these
+            ((and (consp elt) (eq (car elt) t))
+             (setcdr undo-list (cddr undo-list)))
+
+            ;; if element crosses region, we can't pull any more elements
+            ((undo-elt-crosses-region elt start end)
+             ;; if we've found a visible element, it must be earlier in
+             ;; current node's changeset; stop pulling elements (null
+             ;; `undo-list' and non-nil `got-visible-elt' cause loop to exit)
+             (if got-visible-elt
+                 (setq undo-list nil)
+               ;; if we haven't found a visible element yet, pulling
+               ;; undo-in-region branch has failed
+               (setq region-changeset nil)
+               (throw 'abort t)))
+
+            ;; if rejecting element, add its delta (if any) to the list
+            (t
+             (let ((delta (undo-delta elt)))
+               (when (/= 0 (cdr delta))
+                 (setcdr d (list delta))
+                 (setq d (cdr d))))
+             (setq undo-list (cdr undo-list))))
+
+           ;; process next element of current changeset
+           (setq elt (cadr undo-list)))
+
+         ;; if there are remaining elements in changeset, remove dummy nil
+         ;; from front
+         (if (cadr (undo-tree-node-undo fragment))
+             (pop (undo-tree-node-undo fragment))
+           ;; otherwise, if we've kept all elements in changeset, discard
+           ;; empty changeset
+           (when (eq splice fragment) (setq splice nil))
+           (setq fragment (car (undo-tree-node-next fragment))))
+         ;; process changeset from next node up the tree
+         (setq node (undo-tree-node-previous node))))
+
+      ;; pop dummy nil from front of `region-changeset'
+      (setq region-changeset (cdr region-changeset))
+
+
+      ;; --- integrate branch into tree ---
+      ;; if no undo-in-region elements were found, restore undo tree
+      (if (null region-changeset)
+         (when original-current
+           (push original-fragment (undo-tree-node-next original-splice))
+           (setf (undo-tree-node-branch original-splice) 0
+                 (undo-tree-node-previous original-fragment) original-splice)
+           (let ((mark-active nil))
+             (while (not (eq (undo-tree-current buffer-undo-tree)
+                             original-current))
+               (undo-tree-redo-1)))
+           nil)  ; return nil to indicate failure
+
+       ;; otherwise...
+       ;; need to undo up to node where new branch will be attached, to
+       ;; ensure redo entries are populated, and then redo back to where we
+       ;; started
+       (let ((mark-active nil)
+             (current (undo-tree-current buffer-undo-tree)))
+         (while (not (eq (undo-tree-current buffer-undo-tree) node))
+           (undo-tree-undo-1))
+         (while (not (eq (undo-tree-current buffer-undo-tree) current))
+           (undo-tree-redo-1)))
+
+       (cond
+        ;; if there's no remaining fragment, just create undo-in-region node
+        ;; and attach it to parent of last node from which elements were
+        ;; pulled
+        ((null fragment)
+         (setq fragment (undo-tree-make-node node region-changeset))
+         (push fragment (undo-tree-node-next node))
+         (setf (undo-tree-node-branch node) 0)
+         ;; set current node to undo-in-region node
+         (setf (undo-tree-current buffer-undo-tree) fragment))
+
+        ;; if no splice point has been set, add undo-in-region node to top of
+        ;; fragment and attach it to parent of last node from which elements
+        ;; were pulled
+        ((null splice)
+         (setq fragment (undo-tree-grow-backwards fragment region-changeset))
+         (push fragment (undo-tree-node-next node))
+         (setf (undo-tree-node-branch node) 0
+               (undo-tree-node-previous fragment) node)
+         ;; set current node to undo-in-region node
+         (setf (undo-tree-current buffer-undo-tree) fragment))
+
+        ;; if fragment contains nodes, attach fragment to parent of last node
+        ;; from which elements were pulled, and splice in undo-in-region node
+        (t
+         (setf (undo-tree-node-previous fragment) node)
+         (push fragment (undo-tree-node-next node))
+         (setf (undo-tree-node-branch node) 0)
+         ;; if this is a repeated undo-in-region, then we've left the current
+         ;; node at the original splice-point; we need to set the current
+         ;; node to the equivalent node on the undo-in-region branch and redo
+         ;; back to where we started
+         (when repeated-undo-in-region
+           (setf (undo-tree-current buffer-undo-tree)
+                 (undo-tree-node-previous original-fragment))
+           (let ((mark-active nil))
+             (while (not (eq (undo-tree-current buffer-undo-tree) splice))
+               (undo-tree-redo-1 nil 'preserve-undo))))
+         ;; splice new undo-in-region node into fragment
+         (setq node (undo-tree-make-node nil region-changeset))
+         (undo-tree-splice-node node splice)
+         ;; set current node to undo-in-region node
+         (setf (undo-tree-current buffer-undo-tree) node)))
+
+       ;; update undo-tree size
+       (setq node (undo-tree-node-previous fragment))
+       (while (progn
+                (and (setq node (car (undo-tree-node-next node)))
+                     (not (eq node original-fragment))
+                     (incf (undo-tree-count buffer-undo-tree))
+                     (incf (undo-tree-size buffer-undo-tree)
+                           (+ (undo-list-byte-size (undo-tree-node-undo node))
+                              (undo-list-byte-size (undo-tree-node-redo node)))))))
+       t)  ; indicate undo-in-region branch was successfully pulled
+      )))
+
+
+
+(defun undo-tree-pull-redo-in-region-branch (start end)
+  ;; Pull out entries from redo changesets to create a new redo-in-region
+  ;; branch, which redoes changeset entries lying between START and END first,
+  ;; followed by remaining entries from the changesets. Repeated calls will,
+  ;; if appropriate, extend the current redo-in-region branch rather than
+  ;; creating a new one.
+
+  ;; if we're just reverting the last undo-in-region, we don't need to
+  ;; manipulate the undo tree at all
+  (if (undo-tree-reverting-undo-in-region-p start end)
+      t  ; return t to indicate success
+
+    ;; We build the `region-changeset' and `delta-list' lists forwards, using
+    ;; pointers `r' and `d' to the penultimate element of the list. So that we
+    ;; don't have to treat the first element differently, we prepend a dummy
+    ;; leading nil to the lists, and have the pointers point to that
+    ;; initially.
+    ;; Note: using '(nil) instead of (list nil) in the `let*' causes bizarre
+    ;;       errors when the code is byte-compiled, where parts of the lists
+    ;;       appear to survive across different calls to this function.  An
+    ;;       obscure byte-compiler bug, perhaps?
+    (let* ((region-changeset (list nil))
+          (r region-changeset)
+          (delta-list (list nil))
+          (d delta-list)
+          (node (undo-tree-current buffer-undo-tree))
+          (repeated-redo-in-region
+           (undo-tree-repeated-redo-in-region-p start end))
+          undo-adjusted-markers  ; `undo-elt-in-region' expects this
+          fragment splice got-visible-elt redo-list elt)
+
+      ;; --- inisitalisation ---
+      (cond
+       ;; if this is a repeated redo-in-region, detach fragment below current
+       ;; node
+       (repeated-redo-in-region
+       (when (setq fragment (car (undo-tree-node-next node)))
+         (setf (undo-tree-node-previous fragment) nil
+               (undo-tree-node-next node)
+               (delq fragment (undo-tree-node-next node)))))
+       ;; if this is a new redo-in-region, initial fragment is a copy of all
+       ;; nodes below the current one in the active branch
+       ((undo-tree-node-next node)
+       (setq fragment (undo-tree-make-node nil nil)
+             splice fragment)
+       (while (setq node (nth (undo-tree-node-branch node)
+                              (undo-tree-node-next node)))
+         (push (undo-tree-make-node
+                splice nil
+                (undo-copy-list (undo-tree-node-redo node)))
+               (undo-tree-node-next splice))
+         (setq splice (car (undo-tree-node-next splice))))
+       (setq fragment (car (undo-tree-node-next fragment)))))
+
+
+      ;; --- pull redo-in-region elements into branch ---
+      ;; work down fragment, pulling out redo elements within region until
+      ;; we've got one that redoes a visible change (insertion or deletion)
+      (setq node fragment)
+      (catch 'abort
+       (while (and (not got-visible-elt) node (undo-tree-node-redo node))
+         ;; we cons a dummy nil element on the front of the changeset so that
+         ;; we can conveniently remove the first (real) element from the
+         ;; changeset if we need to; the leading nil is removed once we're
+         ;; done with this changeset
+         (setq redo-list (push nil (undo-tree-node-redo node))
+               elt (cadr redo-list))
+         (while elt
+           (cond
+            ;; keep elements within region
+            ((undo-elt-in-region elt start end)
+             ;; set flag if kept element is visible (insertion or deletion)
+             (when (and (consp elt)
+                        (or (stringp (car elt)) (integerp (car elt))))
+               (setq got-visible-elt t))
+             ;; adjust buffer positions in elements previously redone before
+             ;; kept element, as kept element will now be redone first
+             (undo-tree-adjust-elements-to-elt fragment elt t)
+             ;; move kept element to redo-in-region changeset, adjusting its
+             ;; buffer position as it will now be redone first
+             (setcdr r (list (undo-tree-apply-deltas elt (cdr delta-list) -1)))
+             (setq r (cdr r))
+             (setcdr redo-list (cddr redo-list)))
+
+            ;; discard "was unmodified" elements
+            ;; FIXME: deal properly with these
+            ((and (consp elt) (eq (car elt) t))
+             (setcdr redo-list (cddr redo-list)))
+
+            ;; if element crosses region, we can't pull any more elements
+            ((undo-elt-crosses-region elt start end)
+             ;; if we've found a visible element, it must be earlier in
+             ;; current node's changeset; stop pulling elements (null
+             ;; `redo-list' and non-nil `got-visible-elt' cause loop to exit)
+             (if got-visible-elt
+                 (setq redo-list nil)
+               ;; if we haven't found a visible element yet, pulling
+               ;; redo-in-region branch has failed
+               (setq region-changeset nil)
+               (throw 'abort t)))
+
+            ;; if rejecting element, add its delta (if any) to the list
+            (t
+             (let ((delta (undo-delta elt)))
+               (when (/= 0 (cdr delta))
+                 (setcdr d (list delta))
+                 (setq d (cdr d))))
+             (setq redo-list (cdr redo-list))))
+
+           ;; process next element of current changeset
+           (setq elt (cadr redo-list)))
+
+         ;; if there are remaining elements in changeset, remove dummy nil
+         ;; from front
+         (if (cadr (undo-tree-node-redo node))
+             (pop (undo-tree-node-undo node))
+           ;; otherwise, if we've kept all elements in changeset, discard
+           ;; empty changeset
+           (if (eq fragment node)
+               (setq fragment (car (undo-tree-node-next fragment)))
+             (undo-tree-snip-node node)))
+         ;; process changeset from next node in fragment
+         (setq node (car (undo-tree-node-next node)))))
+
+      ;; pop dummy nil from front of `region-changeset'
+      (setq region-changeset (cdr region-changeset))
+
+
+      ;; --- integrate branch into tree ---
+      (setq node (undo-tree-current buffer-undo-tree))
+      ;; if no redo-in-region elements were found, restore undo tree
+      (if (null (car region-changeset))
+         (when (and repeated-redo-in-region fragment)
+           (push fragment (undo-tree-node-next node))
+           (setf (undo-tree-node-branch node) 0
+                 (undo-tree-node-previous fragment) node)
+           nil)  ; return nil to indicate failure
+
+       ;; otherwise, add redo-in-region node to top of fragment, and attach
+       ;; it below current node
+       (setq fragment
+             (if fragment
+                 (undo-tree-grow-backwards fragment nil region-changeset)
+               (undo-tree-make-node nil nil region-changeset)))
+       (push fragment (undo-tree-node-next node))
+       (setf (undo-tree-node-branch node) 0
+             (undo-tree-node-previous fragment) node)
+       ;; update undo-tree size
+       (unless repeated-redo-in-region
+         (setq node fragment)
+         (while (and (setq node (car (undo-tree-node-next node)))
+                     (incf (undo-tree-count buffer-undo-tree))
+                     (incf (undo-tree-size buffer-undo-tree)
+                           (undo-list-byte-size
+                            (undo-tree-node-redo node))))))
+       (incf (undo-tree-size buffer-undo-tree)
+             (undo-list-byte-size (undo-tree-node-redo fragment)))
+       t)  ; indicate redo-in-region branch was successfully pulled
+      )))
+
+
+
+(defun undo-tree-adjust-elements-to-elt (node undo-elt &optional below)
+  "Adjust buffer positions of undo elements, starting at NODE's
+and going up the tree (or down the active branch if BELOW is
+non-nil) and through the nodes' undo elements until we reach
+UNDO-ELT.  UNDO-ELT must appear somewhere in the undo changeset
+of either NODE itself or some node above it in the tree."
+  (let ((delta (list (undo-delta undo-elt)))
+       (undo-list (undo-tree-node-undo node)))
+    ;; adjust elements until we reach UNDO-ELT
+    (while (and (car undo-list)
+               (not (eq (car undo-list) undo-elt)))
+      (setcar undo-list
+             (undo-tree-apply-deltas (car undo-list) delta -1))
+      ;; move to next undo element in list, or to next node if we've run out
+      ;; of elements
+      (unless (car (setq undo-list (cdr undo-list)))
+       (if below
+           (setq node (nth (undo-tree-node-branch node)
+                           (undo-tree-node-next node)))
+         (setq node (undo-tree-node-previous node)))
+       (setq undo-list (undo-tree-node-undo node))))))
+
+
+
+(defun undo-tree-apply-deltas (undo-elt deltas &optional sgn)
+  ;; Apply DELTAS in order to UNDO-ELT, multiplying deltas by SGN
+  ;; (only useful value for SGN is -1).
+  (let (position offset)
+    (dolist (delta deltas)
+      (setq position (car delta)
+           offset (* (cdr delta) (or sgn 1)))
+      (cond
+       ;; POSITION
+       ((integerp undo-elt)
+       (when (>= undo-elt position)
+         (setq undo-elt (- undo-elt offset))))
+       ;; nil (or any other atom)
+       ((atom undo-elt))
+       ;; (TEXT . POSITION)
+       ((stringp (car undo-elt))
+       (let ((text-pos (abs (cdr undo-elt)))
+             (point-at-end (< (cdr undo-elt) 0)))
+         (if (>= text-pos position)
+             (setcdr undo-elt (* (if point-at-end -1 1)
+                                 (- text-pos offset))))))
+       ;; (BEGIN . END)
+       ((integerp (car undo-elt))
+       (when (>= (car undo-elt) position)
+         (setcar undo-elt (- (car undo-elt) offset))
+         (setcdr undo-elt (- (cdr undo-elt) offset))))
+       ;; (nil PROPERTY VALUE BEG . END)
+       ((null (car undo-elt))
+       (let ((tail (nthcdr 3 undo-elt)))
+         (when (>= (car tail) position)
+           (setcar tail (- (car tail) offset))
+           (setcdr tail (- (cdr tail) offset)))))
+       ))
+    undo-elt))
+
+
+
+(defun undo-tree-repeated-undo-in-region-p (start end)
+  ;; Return non-nil if undo-in-region between START and END is a repeated
+  ;; undo-in-region
+  (let ((node (undo-tree-current buffer-undo-tree)))
+    (and (setq node
+              (nth (undo-tree-node-branch node) (undo-tree-node-next node)))
+        (eq (undo-tree-node-undo-beginning node) start)
+        (eq (undo-tree-node-undo-end node) end))))
+
+
+(defun undo-tree-repeated-redo-in-region-p (start end)
+  ;; Return non-nil if undo-in-region between START and END is a repeated
+  ;; undo-in-region
+  (let ((node (undo-tree-current buffer-undo-tree)))
+    (and (eq (undo-tree-node-redo-beginning node) start)
+        (eq (undo-tree-node-redo-end node) end))))
+
+
+;; Return non-nil if undo-in-region between START and END is simply
+;; reverting the last redo-in-region
+(defalias 'undo-tree-reverting-undo-in-region-p
+  'undo-tree-repeated-undo-in-region-p)
+
+
+;; Return non-nil if redo-in-region between START and END is simply
+;; reverting the last undo-in-region
+(defalias 'undo-tree-reverting-redo-in-region-p
+  'undo-tree-repeated-redo-in-region-p)
+
+
+
+\f
+;;; =====================================================================
+;;;                        Undo-tree commands
+
+;;;###autoload
+(define-minor-mode undo-tree-mode
+  "Toggle undo-tree mode.
+With no argument, this command toggles the mode.
+A positive prefix argument turns the mode on.
+A negative prefix argument turns it off.
+
+Undo-tree-mode replaces Emacs' standard undo feature with a more
+powerful yet easier to use version, that treats the undo history
+as what it is: a tree.
+
+The following keys are available in `undo-tree-mode':
+
+  \\{undo-tree-map}
+
+Within the undo-tree visualizer, the following keys are available:
+
+  \\{undo-tree-visualizer-map}"
+
+  nil                       ; init value
+  undo-tree-mode-lighter    ; lighter
+  undo-tree-map             ; keymap
+
+  ;; if disabling `undo-tree-mode', rebuild `buffer-undo-list' from tree so
+  ;; Emacs undo can work
+  (if (not undo-tree-mode)
+    (undo-list-rebuild-from-tree)
+    (setq buffer-undo-tree nil)))
+
+
+(defun turn-on-undo-tree-mode (&optional print-message)
+  "Enable `undo-tree-mode' in the current buffer, when appropriate.
+Some major modes implement their own undo system, which should
+not normally be overridden by `undo-tree-mode'. This command does
+not enable `undo-tree-mode' in such buffers. If you want to force
+`undo-tree-mode' to be enabled regardless, use (undo-tree-mode 1)
+instead.
+
+The heuristic used to detect major modes in which
+`undo-tree-mode' should not be used is to check whether either
+the `undo' command has been remapped, or the default undo
+keybindings (C-/ and C-_) have been overridden somewhere other
+than in the global map. In addition, `undo-tree-mode' will not be
+enabled if the buffer's `major-mode' appears in
+`undo-tree-incompatible-major-modes'."
+  (interactive "p")
+  (if (or (key-binding [remap undo])
+         (undo-tree-overridden-undo-bindings-p)
+         (memq major-mode undo-tree-incompatible-major-modes))
+      (when print-message
+       (message "Buffer does not support undo-tree-mode;\
+ undo-tree-mode NOT enabled"))
+    (undo-tree-mode 1)))
+
+
+(defun undo-tree-overridden-undo-bindings-p ()
+  "Returns t if default undo bindings are overridden, nil otherwise.
+Checks if either of the default undo key bindings (\"C-/\" or
+\"C-_\") are overridden in the current buffer by any keymap other
+than the global one. (So global redefinitions of the default undo
+key bindings do not count.)"
+  (let ((binding1 (lookup-key (current-global-map) [?\C-/]))
+       (binding2 (lookup-key (current-global-map) [?\C-_])))
+    (global-set-key [?\C-/] 'undo)
+    (global-set-key [?\C-_] 'undo)
+    (unwind-protect
+       (or (and (key-binding [?\C-/])
+                (not (eq (key-binding [?\C-/]) 'undo)))
+           (and (key-binding [?\C-_])
+                (not (eq (key-binding [?\C-_]) 'undo))))
+      (global-set-key [?\C-/] binding1)
+      (global-set-key [?\C-_] binding2))))
+
+
+;;;###autoload
+(define-globalized-minor-mode global-undo-tree-mode
+  undo-tree-mode turn-on-undo-tree-mode)
+
+
+
+(defun undo-tree-undo (&optional arg)
+  "Undo changes.
+Repeat this command to undo more changes.
+A numeric ARG serves as a repeat count.
+
+In Transient Mark mode when the mark is active, only undo changes
+within the current region. Similarly, when not in Transient Mark
+mode, just \\[universal-argument] as an argument limits undo to
+changes within the current region."
+  (interactive "*P")
+  ;; throw error if undo is disabled in buffer
+  (when (eq buffer-undo-list t) (error "No undo information in this buffer"))
+  (undo-tree-undo-1 arg)
+  ;; inform user if at branch point
+  (when (> (undo-tree-num-branches) 1) (message "Undo branch point!")))
+
+
+(defun undo-tree-undo-1 (&optional arg preserve-redo preserve-timestamps)
+  ;; Internal undo function. An active mark in `transient-mark-mode', or
+  ;; non-nil ARG otherwise, enables undo-in-region. Non-nil PRESERVE-REDO
+  ;; causes the existing redo record to be preserved, rather than replacing it
+  ;; with the new one generated by undoing. Non-nil PRESERVE-TIMESTAMPS
+  ;; disables updating of timestamps in visited undo-tree nodes. (This latter
+  ;; should *only* be used when temporarily visiting another undo state and
+  ;; immediately returning to the original state afterwards. Otherwise, it
+  ;; could cause history-discarding errors.)
+  (let ((undo-in-progress t)
+       (undo-in-region (and undo-tree-enable-undo-in-region
+                            (or (region-active-p)
+                                (and arg (not (numberp arg))))))
+       pos current)
+    ;; transfer entries accumulated in `buffer-undo-list' to
+    ;; `buffer-undo-tree'
+    (undo-list-transfer-to-tree)
+
+    (dotimes (i (or (and (numberp arg) (prefix-numeric-value arg)) 1))
+      ;; check if at top of undo tree
+      (unless (undo-tree-node-previous (undo-tree-current buffer-undo-tree))
+       (error "No further undo information"))
+
+      ;; if region is active, or a non-numeric prefix argument was supplied,
+      ;; try to pull out a new branch of changes affecting the region
+      (when (and undo-in-region
+                (not (undo-tree-pull-undo-in-region-branch
+                      (region-beginning) (region-end))))
+       (error "No further undo information for region"))
+
+      ;; remove any GC'd elements from node's undo list
+      (setq current (undo-tree-current buffer-undo-tree))
+      (decf (undo-tree-size buffer-undo-tree)
+           (undo-list-byte-size (undo-tree-node-undo current)))
+      (setf (undo-tree-node-undo current)
+           (undo-list-clean-GCd-elts (undo-tree-node-undo current)))
+      (incf (undo-tree-size buffer-undo-tree)
+           (undo-list-byte-size (undo-tree-node-undo current)))
+      ;; undo one record from undo tree
+      (when undo-in-region
+       (setq pos (set-marker (make-marker) (point)))
+       (set-marker-insertion-type pos t))
+      (primitive-undo 1 (undo-tree-copy-list (undo-tree-node-undo current)))
+      (undo-boundary)
+
+      ;; if preserving old redo record, discard new redo entries that
+      ;; `primitive-undo' has added to `buffer-undo-list', and remove any GC'd
+      ;; elements from node's redo list
+      (if preserve-redo
+         (progn
+           (undo-list-pop-changeset)
+           (decf (undo-tree-size buffer-undo-tree)
+                 (undo-list-byte-size (undo-tree-node-redo current)))
+           (setf (undo-tree-node-redo current)
+                 (undo-list-clean-GCd-elts (undo-tree-node-redo current)))
+           (incf (undo-tree-size buffer-undo-tree)
+                 (undo-list-byte-size (undo-tree-node-redo current))))
+       ;; otherwise, record redo entries that `primitive-undo' has added to
+       ;; `buffer-undo-list' in current node's redo record, replacing
+       ;; existing entry if one already exists
+       (decf (undo-tree-size buffer-undo-tree)
+             (undo-list-byte-size (undo-tree-node-redo current)))
+       (setf (undo-tree-node-redo current)
+             (undo-list-pop-changeset 'discard-pos))
+       (incf (undo-tree-size buffer-undo-tree)
+             (undo-list-byte-size (undo-tree-node-redo current))))
+
+      ;; rewind current node and update timestamp
+      (setf (undo-tree-current buffer-undo-tree)
+           (undo-tree-node-previous (undo-tree-current buffer-undo-tree)))
+      (unless preserve-timestamps
+       (setf (undo-tree-node-timestamp (undo-tree-current buffer-undo-tree))
+             (current-time)))
+
+      ;; if undoing-in-region, record current node, region and direction so we
+      ;; can tell if undo-in-region is repeated, and re-activate mark if in
+      ;; `transient-mark-mode'; if not, erase any leftover data
+      (if (not undo-in-region)
+         (undo-tree-node-clear-region-data current)
+       (goto-char pos)
+       ;; note: we deliberately want to store the region information in the
+       ;; node *below* the now current one
+       (setf (undo-tree-node-undo-beginning current) (region-beginning)
+             (undo-tree-node-undo-end current) (region-end))
+       (set-marker pos nil)))
+
+    ;; undo deactivates mark unless undoing-in-region
+    (setq deactivate-mark (not undo-in-region))))
+
+
+
+(defun undo-tree-redo (&optional arg)
+  "Redo changes. A numeric ARG serves as a repeat count.
+
+In Transient Mark mode when the mark is active, only redo changes
+within the current region. Similarly, when not in Transient Mark
+mode, just \\[universal-argument] as an argument limits redo to
+changes within the current region."
+  (interactive "*P")
+  ;; throw error if undo is disabled in buffer
+  (when (eq buffer-undo-list t) (error "No undo information in this buffer"))
+  (undo-tree-redo-1 arg)
+  ;; inform user if at branch point
+  (when (> (undo-tree-num-branches) 1) (message "Undo branch point!")))
+
+
+(defun undo-tree-redo-1 (&optional arg preserve-undo preserve-timestamps)
+  ;; Internal redo function. An active mark in `transient-mark-mode', or
+  ;; non-nil ARG otherwise, enables undo-in-region. Non-nil PRESERVE-UNDO
+  ;; causes the existing redo record to be preserved, rather than replacing it
+  ;; with the new one generated by undoing. Non-nil PRESERVE-TIMESTAMPS
+  ;; disables updating of timestamps in visited undo-tree nodes. (This latter
+  ;; should *only* be used when temporarily visiting another undo state and
+  ;; immediately returning to the original state afterwards. Otherwise, it
+  ;; could cause history-discarding errors.)
+  (let ((undo-in-progress t)
+       (redo-in-region (and undo-tree-enable-undo-in-region
+                            (or (region-active-p)
+                                (and arg (not (numberp arg))))))
+       pos current)
+    ;; transfer entries accumulated in `buffer-undo-list' to
+    ;; `buffer-undo-tree'
+    (undo-list-transfer-to-tree)
+
+    (dotimes (i (or (and (numberp arg) (prefix-numeric-value arg)) 1))
+      ;; check if at bottom of undo tree
+      (when (null (undo-tree-node-next (undo-tree-current buffer-undo-tree)))
+       (error "No further redo information"))
+
+      ;; if region is active, or a non-numeric prefix argument was supplied,
+      ;; try to pull out a new branch of changes affecting the region
+      (when (and redo-in-region
+                (not (undo-tree-pull-redo-in-region-branch
+                      (region-beginning) (region-end))))
+       (error "No further redo information for region"))
+
+      ;; get next node (but DON'T advance current node in tree yet, in case
+      ;; redoing fails)
+      (setq current (undo-tree-current buffer-undo-tree)
+           current (nth (undo-tree-node-branch current)
+                        (undo-tree-node-next current)))
+      ;; remove any GC'd elements from node's redo list
+      (decf (undo-tree-size buffer-undo-tree)
+           (undo-list-byte-size (undo-tree-node-redo current)))
+      (setf (undo-tree-node-redo current)
+           (undo-list-clean-GCd-elts (undo-tree-node-redo current)))
+      (incf (undo-tree-size buffer-undo-tree)
+           (undo-list-byte-size (undo-tree-node-redo current)))
+      ;; redo one record from undo tree
+      (when redo-in-region
+       (setq pos (set-marker (make-marker) (point)))
+       (set-marker-insertion-type pos t))
+      (primitive-undo 1 (undo-tree-copy-list (undo-tree-node-redo current)))
+      (undo-boundary)
+      ;; advance current node in tree
+      (setf (undo-tree-current buffer-undo-tree) current)
+
+      ;; if preserving old undo record, discard new undo entries that
+      ;; `primitive-undo' has added to `buffer-undo-list', and remove any GC'd
+      ;; elements from node's redo list
+      (if preserve-undo
+         (progn
+           (undo-list-pop-changeset)
+           (decf (undo-tree-size buffer-undo-tree)
+                 (undo-list-byte-size (undo-tree-node-undo current)))
+           (setf (undo-tree-node-undo current)
+                 (undo-list-clean-GCd-elts (undo-tree-node-undo current)))
+           (incf (undo-tree-size buffer-undo-tree)
+                 (undo-list-byte-size (undo-tree-node-undo current))))
+       ;; otherwise, record undo entries that `primitive-undo' has added to
+       ;; `buffer-undo-list' in current node's undo record, replacing
+       ;; existing entry if one already exists
+       (decf (undo-tree-size buffer-undo-tree)
+             (undo-list-byte-size (undo-tree-node-undo current)))
+       (setf (undo-tree-node-undo current)
+             (undo-list-pop-changeset 'discard-pos))
+       (incf (undo-tree-size buffer-undo-tree)
+             (undo-list-byte-size (undo-tree-node-undo current))))
+
+      ;; update timestamp
+      (unless preserve-timestamps
+       (setf (undo-tree-node-timestamp current) (current-time)))
+
+      ;; if redoing-in-region, record current node, region and direction so we
+      ;; can tell if redo-in-region is repeated, and re-activate mark if in
+      ;; `transient-mark-mode'
+      (if (not redo-in-region)
+         (undo-tree-node-clear-region-data current)
+       (goto-char pos)
+       (setf (undo-tree-node-redo-beginning current) (region-beginning)
+             (undo-tree-node-redo-end current) (region-end))
+       (set-marker pos nil)))
+
+    ;; redo deactivates the mark unless redoing-in-region
+    (setq deactivate-mark (not redo-in-region))))
+
+
+
+(defun undo-tree-switch-branch (branch)
+  "Switch to a different BRANCH of the undo tree.
+This will affect which branch to descend when *redoing* changes
+using `undo-tree-redo'."
+  (interactive (list (or (and prefix-arg (prefix-numeric-value prefix-arg))
+                         (and (not (eq buffer-undo-list t))
+                             (or (undo-list-transfer-to-tree) t)
+                             (let ((b (undo-tree-node-branch
+                                       (undo-tree-current
+                                        buffer-undo-tree))))
+                               (cond
+                                ;; switch to other branch if only 2
+                                ((= (undo-tree-num-branches) 2) (- 1 b))
+                                ;; prompt if more than 2
+                                ((> (undo-tree-num-branches) 2)
+                                 (read-number
+                                  (format "Branch (0-%d, on %d): "
+                                          (1- (undo-tree-num-branches)) b)))
+                                ))))))
+  ;; throw error if undo is disabled in buffer
+  (when (eq buffer-undo-list t) (error "No undo information in this buffer"))
+  ;; sanity check branch number
+  (when (<= (undo-tree-num-branches) 1) (error "Not at undo branch point"))
+  (when (or (< branch 0) (> branch (1- (undo-tree-num-branches))))
+    (error "Invalid branch number"))
+  ;; transfer entries accumulated in `buffer-undo-list' to `buffer-undo-tree'
+  (undo-list-transfer-to-tree)
+  ;; switch branch
+  (setf (undo-tree-node-branch (undo-tree-current buffer-undo-tree))
+       branch)
+  (message "Switched to branch %d" branch))
+
+
+(defun undo-tree-set (node &optional preserve-timestamps)
+  ;; Set buffer to state corresponding to NODE. Returns intersection point
+  ;; between path back from current node and path back from selected NODE.
+  ;; Non-nil PRESERVE-TIMESTAMPS disables updating of timestamps in visited
+  ;; undo-tree nodes. (This should *only* be used when temporarily visiting
+  ;; another undo state and immediately returning to the original state
+  ;; afterwards. Otherwise, it could cause history-discarding errors.)
+  (let ((path (make-hash-table :test 'eq))
+        (n node))
+    (puthash (undo-tree-root buffer-undo-tree) t path)
+    ;; build list of nodes leading back from selected node to root, updating
+    ;; branches as we go to point down to selected node
+    (while (progn
+             (puthash n t path)
+             (when (undo-tree-node-previous n)
+               (setf (undo-tree-node-branch (undo-tree-node-previous n))
+                     (undo-tree-position
+                      n (undo-tree-node-next (undo-tree-node-previous n))))
+               (setq n (undo-tree-node-previous n)))))
+    ;; work backwards from current node until we intersect path back from
+    ;; selected node
+    (setq n (undo-tree-current buffer-undo-tree))
+    (while (not (gethash n path))
+      (setq n (undo-tree-node-previous n)))
+    ;; ascend tree until intersection node
+    (while (not (eq (undo-tree-current buffer-undo-tree) n))
+      (undo-tree-undo-1 nil nil preserve-timestamps))
+    ;; descend tree until selected node
+    (while (not (eq (undo-tree-current buffer-undo-tree) node))
+      (undo-tree-redo-1 nil nil preserve-timestamps))
+    n))  ; return intersection node
+
+
+
+(defun undo-tree-save-state-to-register (register)
+  "Store current undo-tree state to REGISTER.
+The saved state can be restored using
+`undo-tree-restore-state-from-register'.
+Argument is a character, naming the register."
+  (interactive "cUndo-tree state to register: ")
+  ;; throw error if undo is disabled in buffer
+  (when (eq buffer-undo-list t) (error "No undo information in this buffer"))
+  ;; transfer entries accumulated in `buffer-undo-list' to `buffer-undo-tree'
+  (undo-list-transfer-to-tree)
+  ;; save current node to REGISTER
+  (set-register
+   register (registerv-make
+            (undo-tree-make-register-data
+             (current-buffer) (undo-tree-current buffer-undo-tree))
+            :print-func 'undo-tree-register-data-print-func))
+  ;; record REGISTER in current node, for visualizer
+  (setf (undo-tree-node-register (undo-tree-current buffer-undo-tree))
+       register))
+
+
+
+(defun undo-tree-restore-state-from-register (register)
+  "Restore undo-tree state from REGISTER.
+The state must be saved using `undo-tree-save-state-to-register'.
+Argument is a character, naming the register."
+  (interactive "*cRestore undo-tree state from register: ")
+  ;; throw error if undo is disabled in buffer, or if register doesn't contain
+  ;; an undo-tree node
+  (let ((data (registerv-data (get-register register))))
+    (cond
+     ((eq buffer-undo-list t)
+      (error "No undo information in this buffer"))
+     ((not (undo-tree-register-data-p data))
+      (error "Register doesn't contain undo-tree state"))
+     ((not (eq (current-buffer) (undo-tree-register-data-buffer data)))
+      (error "Register contains undo-tree state for a different buffer")))
+    ;; transfer entries accumulated in `buffer-undo-list' to `buffer-undo-tree'
+    (undo-list-transfer-to-tree)
+    ;; restore buffer state corresponding to saved node
+    (undo-tree-set (undo-tree-register-data-node data))))
+
+
+
+\f
+;;; =====================================================================
+;;;                    Persistent storage commands
+
+(defun undo-tree-make-history-save-file-name (file)
+  "Create the undo history file name for FILE.
+Normally this is the file's name with `.' prepended and
+`~undo-tree~' appended.
+
+A match for FILE is sought in `undo-tree-history-directory-alist';
+see the documentation of that variable.  If the directory for the
+backup doesn't exist, it is created."
+  (let* ((backup-directory-alist undo-tree-history-directory-alist)
+        (name (make-backup-file-name-1 file)))
+    (concat (file-name-directory name) "." (file-name-nondirectory name)
+           "~undo-tree~")))
+
+
+(defun undo-tree-save-history (&optional filename overwrite)
+  "Store undo-tree history to file.
+
+If optional argument FILENAME is omitted, default save file is
+\".<buffer-file-name>.~undo-tree\" if buffer is visiting a file.
+Otherwise, prompt for one.
+
+If OVERWRITE is non-nil, any existing file will be overwritten
+without asking for confirmation."
+  (interactive)
+  (when (eq buffer-undo-list t) (error "No undo information in this buffer"))
+  (undo-list-transfer-to-tree)
+  (when (and buffer-undo-tree (not (eq buffer-undo-tree t)))
+    (condition-case nil
+       (undo-tree-kill-visualizer)
+      (error (undo-tree-clear-visualizer-data buffer-undo-tree)))
+    (let ((buff (current-buffer))
+         tree)
+      ;; get filename
+      (unless filename
+       (setq filename
+             (if buffer-file-name
+                 (undo-tree-make-history-save-file-name buffer-file-name)
+               (expand-file-name (read-file-name "File to save in: ") nil))))
+      (when (or (not (file-exists-p filename))
+               overwrite
+               (yes-or-no-p (format "Overwrite \"%s\"? " filename)))
+       (unwind-protect
+           (progn
+             ;; transform undo-tree into non-circular structure, and make
+             ;; temporary copy
+             (undo-tree-decircle buffer-undo-tree)
+             (setq tree (copy-undo-tree buffer-undo-tree))
+             ;; discard undo-tree object pool before saving
+             (setf (undo-tree-object-pool tree) nil)
+             ;; print undo-tree to file
+             ;; NOTE: We use `with-temp-buffer' instead of `with-temp-file'
+             ;;       to allow `auto-compression-mode' to take effect, in
+             ;;       case user has overridden or advised the default
+             ;;       `undo-tree-make-history-save-file-name' to add a
+             ;;       compressed file extension.
+             (with-auto-compression-mode
+               (with-temp-buffer
+                 (prin1 (sha1 buff) (current-buffer))
+                 (terpri (current-buffer))
+                 (let ((print-circle t)) (prin1 tree (current-buffer)))
+                 (write-region nil nil filename))))
+         ;; restore circular undo-tree data structure
+         (undo-tree-recircle buffer-undo-tree))
+       ))))
+
+
+
+(defun undo-tree-load-history (&optional filename noerror)
+  "Load undo-tree history from file.
+
+If optional argument FILENAME is null, default load file is
+\".<buffer-file-name>.~undo-tree\" if buffer is visiting a file.
+Otherwise, prompt for one.
+
+If optional argument NOERROR is non-nil, return nil instead of
+signaling an error if file is not found."
+  (interactive)
+  ;; get filename
+  (unless filename
+    (setq filename
+         (if buffer-file-name
+             (undo-tree-make-history-save-file-name buffer-file-name)
+           (expand-file-name (read-file-name "File to load from: ") nil))))
+
+  ;; attempt to read undo-tree from FILENAME
+  (catch 'load-error
+    (unless (file-exists-p filename)
+      (if noerror
+         (throw 'load-error nil)
+       (error "File \"%s\" does not exist; could not load undo-tree history"
+              filename)))
+    (let (buff hash tree)
+      (setq buff (current-buffer))
+      (with-auto-compression-mode
+       (with-temp-buffer
+         (insert-file-contents filename)
+         (goto-char (point-min))
+         (condition-case nil
+             (setq hash (read (current-buffer)))
+           (error
+            (kill-buffer nil)
+            (funcall (if noerror 'message 'error)
+                     "Error reading undo-tree history from \"%s\"" filename)
+            (throw 'load-error nil)))
+         (unless (string= (sha1 buff) hash)
+           (kill-buffer nil)
+           (funcall (if noerror 'message 'error)
+                    "Buffer has been modified; could not load undo-tree history")
+           (throw 'load-error nil))
+         (condition-case nil
+             (setq tree (read (current-buffer)))
+           (error
+            (kill-buffer nil)
+            (funcall (if noerror 'message 'error)
+                     "Error reading undo-tree history from \"%s\"" filename)
+            (throw 'load-error nil)))
+         (kill-buffer nil)))
+      ;; initialise empty undo-tree object pool
+      (setf (undo-tree-object-pool tree)
+           (make-hash-table :test 'eq :weakness 'value))
+      ;; restore circular undo-tree data structure
+      (undo-tree-recircle tree)
+      (setq buffer-undo-tree tree))))
+
+
+
+;; Versions of save/load functions for use in hooks
+(defun undo-tree-save-history-hook ()
+  (when (and undo-tree-mode undo-tree-auto-save-history
+            (not (eq buffer-undo-list t)))
+    (undo-tree-save-history nil t) nil))
+
+(defun undo-tree-load-history-hook ()
+  (when (and undo-tree-mode undo-tree-auto-save-history
+            (not (eq buffer-undo-list t)))
+    (undo-tree-load-history nil t)))
+
+
+
+\f
+;;; =====================================================================
+;;;                    Visualizer drawing functions
+
+(defun undo-tree-visualize ()
+  "Visualize the current buffer's undo tree."
+  (interactive "*")
+  (deactivate-mark)
+  ;; throw error if undo is disabled in buffer
+  (when (eq buffer-undo-list t) (error "No undo information in this buffer"))
+  ;; transfer entries accumulated in `buffer-undo-list' to `buffer-undo-tree'
+  (undo-list-transfer-to-tree)
+  ;; add hook to kill visualizer buffer if original buffer is changed
+  (add-hook 'before-change-functions 'undo-tree-kill-visualizer nil t)
+  ;; prepare *undo-tree* buffer, then draw tree in it
+  (let ((undo-tree buffer-undo-tree)
+        (buff (current-buffer))
+       (display-buffer-mark-dedicated 'soft))
+    (switch-to-buffer-other-window
+     (get-buffer-create undo-tree-visualizer-buffer-name))
+    (setq undo-tree-visualizer-parent-buffer buff)
+    (setq undo-tree-visualizer-parent-mtime
+         (and (buffer-file-name buff)
+              (nth 5 (file-attributes (buffer-file-name buff)))))
+    (setq buffer-undo-tree undo-tree)
+    (setq undo-tree-visualizer-initial-node (undo-tree-current undo-tree))
+    (setq undo-tree-visualizer-spacing
+         (undo-tree-visualizer-calculate-spacing))
+    (make-local-variable 'undo-tree-visualizer-timestamps)
+    (make-local-variable 'undo-tree-visualizer-diff)
+    (set (make-local-variable 'undo-tree-visualizer-lazy-drawing)
+        (or (eq undo-tree-visualizer-lazy-drawing t)
+            (and (numberp undo-tree-visualizer-lazy-drawing)
+                 (>= (undo-tree-count undo-tree)
+                     undo-tree-visualizer-lazy-drawing))))
+    (when undo-tree-visualizer-diff (undo-tree-visualizer-show-diff))
+    (undo-tree-visualizer-mode)
+    (let ((inhibit-read-only t)) (undo-tree-draw-tree undo-tree))))
+
+
+(defun undo-tree-kill-visualizer (&rest _dummy)
+  ;; Kill visualizer. Added to `before-change-functions' hook of original
+  ;; buffer when visualizer is invoked.
+  (unless undo-tree-inhibit-kill-visualizer
+    (unwind-protect
+       (with-current-buffer undo-tree-visualizer-buffer-name
+         (undo-tree-visualizer-quit)))))
+
+
+
+(defun undo-tree-draw-tree (undo-tree)
+  ;; Draw undo-tree in current buffer starting from NODE (or root if nil).
+  (let ((node (if undo-tree-visualizer-lazy-drawing
+                 (undo-tree-current undo-tree)
+               (undo-tree-root undo-tree))))
+    (erase-buffer)
+    (undo-tree-clear-visualizer-data undo-tree)
+    (undo-tree-compute-widths node)
+    ;; lazy drawing starts vertically centred and displaced horizontally to
+    ;; the left (window-width/4), since trees will typically grow right
+    (if undo-tree-visualizer-lazy-drawing
+       (progn
+         (undo-tree-move-down (/ (window-height) 2))
+         (undo-tree-move-forward (max 2 (/ (window-width) 4)))) ; left margin
+      ;; non-lazy drawing starts in centre at top of buffer
+      (undo-tree-move-down 1)  ; top margin
+      (undo-tree-move-forward
+       (max (/ (window-width) 2)
+           (+ (undo-tree-node-char-lwidth node)
+              ;; add space for left part of left-most time-stamp
+              (if undo-tree-visualizer-timestamps
+                  (/ (- undo-tree-visualizer-spacing 4) 2)
+                0)
+              2))))  ; left margin
+    ;; link starting node to its representation in visualizer
+    (setf (undo-tree-node-marker node) (make-marker))
+    (set-marker-insertion-type (undo-tree-node-marker node) nil)
+    (move-marker (undo-tree-node-marker node) (point))
+    ;; draw undo-tree
+    (let ((undo-tree-insert-face 'undo-tree-visualizer-default-face)
+         node-list)
+      (if (not undo-tree-visualizer-lazy-drawing)
+         (undo-tree-extend-down node t)
+       (undo-tree-extend-down node)
+       (undo-tree-extend-up node)
+       (setq node-list undo-tree-visualizer-needs-extending-down
+             undo-tree-visualizer-needs-extending-down nil)
+       (while node-list (undo-tree-extend-down (pop node-list)))))
+    ;; highlight active branch
+    (let ((undo-tree-insert-face 'undo-tree-visualizer-active-branch-face))
+      (undo-tree-highlight-active-branch
+       (or undo-tree-visualizer-needs-extending-up
+          (undo-tree-root undo-tree))))
+    ;; highlight current node
+    (undo-tree-draw-node (undo-tree-current undo-tree) 'current)))
+
+
+(defun undo-tree-extend-down (node &optional bottom)
+  ;; Extend tree downwards starting from NODE and point. If BOTTOM is t,
+  ;; extend all the way down to the leaves. If BOTTOM is a node, extend down
+  ;; as far as that node. If BOTTOM is an integer, extend down as far as that
+  ;; line. Otherwise, only extend visible portion of tree. NODE is assumed to
+  ;; already have a node marker. Returns non-nil if anything was actually
+  ;; extended.
+  (let ((extended nil)
+       (cur-stack (list node))
+       next-stack)
+    ;; don't bother extending if BOTTOM specifies an already-drawn node
+    (unless (and (undo-tree-node-p bottom) (undo-tree-node-marker bottom))
+      ;; draw nodes layer by layer
+      (while (or cur-stack
+                (prog1 (setq cur-stack next-stack)
+                  (setq next-stack nil)))
+       (setq node (pop cur-stack))
+       ;; if node is within range being drawn...
+       (if (or (eq bottom t)
+               (and (undo-tree-node-p bottom)
+                    (not (eq (undo-tree-node-previous node) bottom)))
+               (and (integerp bottom)
+                    (>= bottom (line-number-at-pos
+                                (undo-tree-node-marker node))))
+               (and (null bottom)
+                    (pos-visible-in-window-p (undo-tree-node-marker node)
+                                             nil t)))
+           ;; ...draw one layer of node's subtree (if not already drawn)
+           (progn
+             (unless (and (undo-tree-node-next node)
+                          (undo-tree-node-marker
+                           (nth (undo-tree-node-branch node)
+                                (undo-tree-node-next node))))
+               (goto-char (undo-tree-node-marker node))
+               (undo-tree-draw-subtree node)
+               (setq extended t))
+             (setq next-stack
+                   (append (undo-tree-node-next node) next-stack)))
+         ;; ...otherwise, postpone drawing until later
+         (push node undo-tree-visualizer-needs-extending-down))))
+    extended))
+
+
+(defun undo-tree-extend-up (node &optional top)
+  ;; Extend tree upwards starting from NODE. If TOP is t, extend all the way
+  ;; to root. If TOP is a node, extend up as far as that node. If TOP is an
+  ;; integer, extend up as far as that line. Otherwise, only extend visible
+  ;; portion of tree. NODE is assumed to already have a node marker. Returns
+  ;; non-nil if anything was actually extended.
+  (let ((extended nil) parent n)
+    ;; don't bother extending if TOP specifies an already-drawn node
+    (unless (and (undo-tree-node-p top) (undo-tree-node-marker top))
+      (while node
+       (setq parent (undo-tree-node-previous node))
+       ;; if we haven't reached root...
+       (if parent
+           ;; ...and node is within range being drawn...
+           (if (or (eq top t)
+                   (and (undo-tree-node-p top) (not (eq node top)))
+                   (and (integerp top)
+                        (< top (line-number-at-pos
+                                (undo-tree-node-marker node))))
+                   (and (null top)
+                        ;; NOTE: check point in case window-start is outdated
+                        (< (min (line-number-at-pos (point))
+                                (line-number-at-pos (window-start)))
+                           (line-number-at-pos
+                            (undo-tree-node-marker node)))))
+               ;; ...and it hasn't already been drawn
+               (when (not (undo-tree-node-marker parent))
+                 ;; link parent node to its representation in visualizer
+                 (undo-tree-compute-widths parent)
+                 (undo-tree-move-to-parent node)
+                 (setf (undo-tree-node-marker parent) (make-marker))
+                 (set-marker-insertion-type
+                  (undo-tree-node-marker parent) nil)
+                 (move-marker (undo-tree-node-marker parent) (point))
+                 ;; draw subtree beneath parent
+                 (setq undo-tree-visualizer-needs-extending-down
+                       (nconc (delq node (undo-tree-draw-subtree parent))
+                              undo-tree-visualizer-needs-extending-down))
+                 (setq extended t))
+             ;; ...otherwise, postpone drawing for later and exit
+             (setq undo-tree-visualizer-needs-extending-up (when parent node)
+                   parent nil))
+
+         ;; if we've reached root, stop extending and add top margin
+         (setq undo-tree-visualizer-needs-extending-up nil)
+         (goto-char (undo-tree-node-marker node))
+         (undo-tree-move-up 1)  ; top margin
+         (delete-region (point-min) (line-beginning-position)))
+       ;; next iteration
+       (setq node parent)))
+    extended))
+
+
+(defun undo-tree-expand-down (from &optional to)
+  ;; Expand tree downwards. FROM is the node to start expanding from. Stop
+  ;; expanding at TO if specified. Otherwise, just expand visible portion of
+  ;; tree and highlight active branch from FROM.
+  (when undo-tree-visualizer-needs-extending-down
+    (let ((inhibit-read-only t)
+         node-list extended)
+      ;; extend down as far as TO node
+      (when to
+       (setq extended (undo-tree-extend-down from to))
+       (goto-char (undo-tree-node-marker to))
+       (redisplay t))  ; force redisplay to scroll buffer if necessary
+      ;; extend visible portion of tree downwards
+      (setq node-list undo-tree-visualizer-needs-extending-down
+           undo-tree-visualizer-needs-extending-down nil)
+      (when node-list
+       (dolist (n node-list)
+         (when (undo-tree-extend-down n) (setq extended t)))
+       ;; highlight active branch in newly-extended-down portion, if any
+       (when extended
+         (let ((undo-tree-insert-face
+                'undo-tree-visualizer-active-branch-face))
+           (undo-tree-highlight-active-branch from)))))))
+
+
+(defun undo-tree-expand-up (from &optional to)
+  ;; Expand tree upwards. FROM is the node to start expanding from, TO is the
+  ;; node to stop expanding at. If TO node isn't specified, just expand visible
+  ;; portion of tree and highlight active branch down to FROM.
+  (when undo-tree-visualizer-needs-extending-up
+    (let ((inhibit-read-only t)
+         extended node-list)
+      ;; extend up as far as TO node
+      (when to
+       (setq extended (undo-tree-extend-up from to))
+       (goto-char (undo-tree-node-marker to))
+       ;; simulate auto-scrolling if close to top of buffer
+       (when (<= (line-number-at-pos (point)) scroll-margin)
+         (undo-tree-move-up (if (= scroll-conservatively 0)
+                                (/ (window-height) 2) 3))
+         (when (undo-tree-extend-up to) (setq extended t))
+         (goto-char (undo-tree-node-marker to))
+         (unless (= scroll-conservatively 0) (recenter scroll-margin))))
+      ;; extend visible portion of tree upwards
+      (and undo-tree-visualizer-needs-extending-up
+          (undo-tree-extend-up undo-tree-visualizer-needs-extending-up)
+          (setq extended t))
+      ;; extend visible portion of tree downwards
+      (setq node-list undo-tree-visualizer-needs-extending-down
+           undo-tree-visualizer-needs-extending-down nil)
+      (dolist (n node-list) (undo-tree-extend-down n))
+      ;; highlight active branch in newly-extended-up portion, if any
+      (when extended
+       (let ((undo-tree-insert-face
+              'undo-tree-visualizer-active-branch-face))
+         (undo-tree-highlight-active-branch
+          (or undo-tree-visualizer-needs-extending-up
+              (undo-tree-root buffer-undo-tree))
+          from))))))
+
+
+
+(defun undo-tree-highlight-active-branch (node &optional end)
+  ;; Draw highlighted active branch below NODE in current buffer. Stop
+  ;; highlighting at END node if specified.
+  (let ((stack (list node)))
+    ;; draw active branch
+    (while stack
+      (setq node (pop stack))
+      (unless (or (eq node end)
+                 (memq node undo-tree-visualizer-needs-extending-down))
+       (goto-char (undo-tree-node-marker node))
+       (setq node (undo-tree-draw-subtree node 'active)
+             stack (nconc stack node))))))
+
+
+(defun undo-tree-draw-node (node &optional current)
+  ;; Draw symbol representing NODE in visualizer. If CURRENT is non-nil, node
+  ;; is current node.
+  (goto-char (undo-tree-node-marker node))
+  (when undo-tree-visualizer-timestamps
+    (undo-tree-move-backward (/ undo-tree-visualizer-spacing 2)))
+
+  (let* ((undo-tree-insert-face (and undo-tree-insert-face
+                                    (or (and (consp undo-tree-insert-face)
+                                             undo-tree-insert-face)
+                                        (list undo-tree-insert-face))))
+        (register (undo-tree-node-register node))
+        (unmodified (if undo-tree-visualizer-parent-mtime
+                        (undo-tree-node-unmodified-p
+                         node undo-tree-visualizer-parent-mtime)
+                      (undo-tree-node-unmodified-p node)))
+       node-string)
+    ;; check node's register (if any) still stores appropriate undo-tree state
+    (unless (and register
+                (undo-tree-register-data-p
+                 (registerv-data (get-register register)))
+                (eq node (undo-tree-register-data-node
+                          (registerv-data (get-register register)))))
+      (setq register nil))
+    ;; represent node by different symbols, depending on whether it's the
+    ;; current node, is saved in a register, or corresponds to an unmodified
+    ;; buffer
+    (setq node-string
+           (cond
+            (undo-tree-visualizer-timestamps
+               (undo-tree-timestamp-to-string
+                (undo-tree-node-timestamp node)
+                undo-tree-visualizer-relative-timestamps
+                current register))
+            (register (char-to-string register))
+            (unmodified "s")
+            (current "x")
+            (t "o"))
+         undo-tree-insert-face
+           (nconc
+            (cond
+             (current    '(undo-tree-visualizer-current-face))
+             (unmodified '(undo-tree-visualizer-unmodified-face))
+             (register   '(undo-tree-visualizer-register-face)))
+            undo-tree-insert-face))
+    ;; draw node and link it to its representation in visualizer
+    (undo-tree-insert node-string)
+    (undo-tree-move-backward (if undo-tree-visualizer-timestamps
+                                (1+ (/ undo-tree-visualizer-spacing 2))
+                              1))
+    (move-marker (undo-tree-node-marker node) (point))
+    (put-text-property (point) (1+ (point)) 'undo-tree-node node)))
+
+
+(defun undo-tree-draw-subtree (node &optional active-branch)
+  ;; Draw subtree rooted at NODE. The subtree will start from point.
+  ;; If ACTIVE-BRANCH is non-nil, just draw active branch below NODE. Returns
+  ;; list of nodes below NODE.
+  (let ((num-children (length (undo-tree-node-next node)))
+        node-list pos trunk-pos n)
+    ;; draw node itself
+    (undo-tree-draw-node node)
+
+    (cond
+     ;; if we're at a leaf node, we're done
+     ((= num-children 0))
+
+     ;; if node has only one child, draw it (not strictly necessary to deal
+     ;; with this case separately, but as it's by far the most common case
+     ;; this makes the code clearer and more efficient)
+     ((= num-children 1)
+      (undo-tree-move-down 1)
+      (undo-tree-insert ?|)
+      (undo-tree-move-backward 1)
+      (undo-tree-move-down 1)
+      (undo-tree-insert ?|)
+      (undo-tree-move-backward 1)
+      (undo-tree-move-down 1)
+      (setq n (car (undo-tree-node-next node)))
+      ;; link next node to its representation in visualizer
+      (unless (markerp (undo-tree-node-marker n))
+        (setf (undo-tree-node-marker n) (make-marker))
+        (set-marker-insertion-type (undo-tree-node-marker n) nil))
+      (move-marker (undo-tree-node-marker n) (point))
+      ;; add next node to list of nodes to draw next
+      (push n node-list))
+
+     ;; if node has multiple children, draw branches
+     (t
+      (undo-tree-move-down 1)
+      (undo-tree-insert ?|)
+      (undo-tree-move-backward 1)
+      (move-marker (setq trunk-pos (make-marker)) (point))
+      ;; left subtrees
+      (undo-tree-move-backward
+       (- (undo-tree-node-char-lwidth node)
+          (undo-tree-node-char-lwidth
+           (car (undo-tree-node-next node)))))
+      (move-marker (setq pos (make-marker)) (point))
+      (setq n (cons nil (undo-tree-node-next node)))
+      (dotimes (i (/ num-children 2))
+        (setq n (cdr n))
+        (when (or (null active-branch)
+                  (eq (car n)
+                      (nth (undo-tree-node-branch node)
+                           (undo-tree-node-next node))))
+          (undo-tree-move-forward 2)
+          (undo-tree-insert ?_ (- trunk-pos pos 2))
+          (goto-char pos)
+          (undo-tree-move-forward 1)
+          (undo-tree-move-down 1)
+          (undo-tree-insert ?/)
+          (undo-tree-move-backward 2)
+          (undo-tree-move-down 1)
+          ;; link node to its representation in visualizer
+          (unless (markerp (undo-tree-node-marker (car n)))
+            (setf (undo-tree-node-marker (car n)) (make-marker))
+            (set-marker-insertion-type (undo-tree-node-marker (car n)) nil))
+          (move-marker (undo-tree-node-marker (car n)) (point))
+          ;; add node to list of nodes to draw next
+          (push (car n) node-list))
+        (goto-char pos)
+        (undo-tree-move-forward
+         (+ (undo-tree-node-char-rwidth (car n))
+            (undo-tree-node-char-lwidth (cadr n))
+            undo-tree-visualizer-spacing 1))
+        (move-marker pos (point)))
+      ;; middle subtree (only when number of children is odd)
+      (when (= (mod num-children 2) 1)
+        (setq n (cdr n))
+        (when (or (null active-branch)
+                  (eq (car n)
+                      (nth (undo-tree-node-branch node)
+                           (undo-tree-node-next node))))
+          (undo-tree-move-down 1)
+          (undo-tree-insert ?|)
+          (undo-tree-move-backward 1)
+          (undo-tree-move-down 1)
+          ;; link node to its representation in visualizer
+          (unless (markerp (undo-tree-node-marker (car n)))
+            (setf (undo-tree-node-marker (car n)) (make-marker))
+            (set-marker-insertion-type (undo-tree-node-marker (car n)) nil))
+          (move-marker (undo-tree-node-marker (car n)) (point))
+          ;; add node to list of nodes to draw next
+          (push (car n) node-list))
+        (goto-char pos)
+        (undo-tree-move-forward
+         (+ (undo-tree-node-char-rwidth (car n))
+            (if (cadr n) (undo-tree-node-char-lwidth (cadr n)) 0)
+            undo-tree-visualizer-spacing 1))
+        (move-marker pos (point)))
+      ;; right subtrees
+      (move-marker trunk-pos (1+ trunk-pos))
+      (dotimes (i (/ num-children 2))
+        (setq n (cdr n))
+        (when (or (null active-branch)
+                  (eq (car n)
+                      (nth (undo-tree-node-branch node)
+                           (undo-tree-node-next node))))
+          (goto-char trunk-pos)
+          (undo-tree-insert ?_ (- pos trunk-pos 1))
+          (goto-char pos)
+          (undo-tree-move-backward 1)
+          (undo-tree-move-down 1)
+          (undo-tree-insert ?\\)
+          (undo-tree-move-down 1)
+          ;; link node to its representation in visualizer
+          (unless (markerp (undo-tree-node-marker (car n)))
+            (setf (undo-tree-node-marker (car n)) (make-marker))
+            (set-marker-insertion-type (undo-tree-node-marker (car n)) nil))
+          (move-marker (undo-tree-node-marker (car n)) (point))
+          ;; add node to list of nodes to draw next
+          (push (car n) node-list))
+        (when (cdr n)
+          (goto-char pos)
+          (undo-tree-move-forward
+           (+ (undo-tree-node-char-rwidth (car n))
+              (if (cadr n) (undo-tree-node-char-lwidth (cadr n)) 0)
+              undo-tree-visualizer-spacing 1))
+          (move-marker pos (point))))
+      ))
+    ;; return list of nodes to draw next
+    (nreverse node-list)))
+
+
+(defun undo-tree-node-char-lwidth (node)
+  ;; Return left-width of NODE measured in characters.
+  (if (= (length (undo-tree-node-next node)) 0) 0
+    (- (* (+ undo-tree-visualizer-spacing 1) (undo-tree-node-lwidth node))
+       (if (= (undo-tree-node-cwidth node) 0)
+           (1+ (/ undo-tree-visualizer-spacing 2)) 0))))
+
+
+(defun undo-tree-node-char-rwidth (node)
+  ;; Return right-width of NODE measured in characters.
+  (if (= (length (undo-tree-node-next node)) 0) 0
+    (- (* (+ undo-tree-visualizer-spacing 1) (undo-tree-node-rwidth node))
+       (if (= (undo-tree-node-cwidth node) 0)
+           (1+ (/ undo-tree-visualizer-spacing 2)) 0))))
+
+
+(defun undo-tree-insert (str &optional arg)
+  ;; Insert character or string STR ARG times, overwriting, and using
+  ;; `undo-tree-insert-face'.
+  (unless arg (setq arg 1))
+  (when (characterp str)
+    (setq str (make-string arg str))
+    (setq arg 1))
+  (dotimes (i arg) (insert str))
+  (setq arg (* arg (length str)))
+  (undo-tree-move-forward arg)
+  ;; make sure mark isn't active, otherwise `backward-delete-char' might
+  ;; delete region instead of single char if transient-mark-mode is enabled
+  (setq mark-active nil)
+  (backward-delete-char arg)
+  (when undo-tree-insert-face
+    (put-text-property (- (point) arg) (point) 'face undo-tree-insert-face)))
+
+
+(defun undo-tree-move-down (&optional arg)
+  ;; Move down, extending buffer if necessary.
+  (let ((row (line-number-at-pos))
+        (col (current-column))
+        line)
+    (unless arg (setq arg 1))
+    (forward-line arg)
+    (setq line (line-number-at-pos))
+    ;; if buffer doesn't have enough lines, add some
+    (when (/= line (+ row arg))
+      (cond
+       ((< arg 0)
+       (insert (make-string (- line row arg) ?\n))
+       (forward-line (+ arg (- row line))))
+       (t (insert (make-string (- arg (- line row)) ?\n)))))
+    (undo-tree-move-forward col)))
+
+
+(defun undo-tree-move-up (&optional arg)
+  ;; Move up, extending buffer if necessary.
+  (unless arg (setq arg 1))
+  (undo-tree-move-down (- arg)))
+
+
+(defun undo-tree-move-forward (&optional arg)
+  ;; Move forward, extending buffer if necessary.
+  (unless arg (setq arg 1))
+  (let (n)
+    (cond
+     ((>= arg 0)
+      (setq n (- (line-end-position) (point)))
+      (if (> n arg)
+         (forward-char arg)
+       (end-of-line)
+       (insert (make-string (- arg n) ? ))))
+     ((< arg 0)
+      (setq arg (- arg))
+      (setq n (- (point) (line-beginning-position)))
+      (when (< (- n 2) arg)  ; -2 to create left-margin
+       ;; no space left - shift entire buffer contents right!
+       (let ((pos (move-marker (make-marker) (point))))
+         (set-marker-insertion-type pos t)
+         (goto-char (point-min))
+         (while (not (eobp))
+           (insert-before-markers (make-string (- arg -2 n) ? ))
+           (forward-line 1))
+         (goto-char pos)))
+      (backward-char arg)))))
+
+
+(defun undo-tree-move-backward (&optional arg)
+  ;; Move backward, extending buffer if necessary.
+  (unless arg (setq arg 1))
+  (undo-tree-move-forward (- arg)))
+
+
+(defun undo-tree-move-to-parent (node)
+  ;; Move to position of parent of NODE, extending buffer if necessary.
+  (let* ((parent (undo-tree-node-previous node))
+        (n (undo-tree-node-next parent))
+        (l (length n)) p)
+    (goto-char (undo-tree-node-marker node))
+    (unless (= l 1)
+      ;; move horizontally
+      (setq p (undo-tree-position node n))
+      (cond
+       ;; node in centre subtree: no horizontal movement
+       ((and (= (mod l 2) 1) (= p (/ l 2))))
+       ;; node in left subtree: move right
+       ((< p (/ l 2))
+       (setq n (nthcdr p n))
+       (undo-tree-move-forward
+        (+ (undo-tree-node-char-rwidth (car n))
+           (/ undo-tree-visualizer-spacing 2) 1))
+       (dotimes (i (- (/ l 2) p 1))
+         (setq n (cdr n))
+         (undo-tree-move-forward
+          (+ (undo-tree-node-char-lwidth (car n))
+             (undo-tree-node-char-rwidth (car n))
+             undo-tree-visualizer-spacing 1)))
+       (when (= (mod l 2) 1)
+         (setq n (cdr n))
+         (undo-tree-move-forward
+          (+ (undo-tree-node-char-lwidth (car n))
+             (/ undo-tree-visualizer-spacing 2) 1))))
+       (t ;; node in right subtree: move left
+       (setq n (nthcdr (/ l 2) n))
+       (when (= (mod l 2) 1)
+         (undo-tree-move-backward
+          (+ (undo-tree-node-char-rwidth (car n))
+             (/ undo-tree-visualizer-spacing 2) 1))
+         (setq n (cdr n)))
+       (dotimes (i (- p (/ l 2) (mod l 2)))
+         (undo-tree-move-backward
+          (+ (undo-tree-node-char-lwidth (car n))
+             (undo-tree-node-char-rwidth (car n))
+             undo-tree-visualizer-spacing 1))
+         (setq n (cdr n)))
+       (undo-tree-move-backward
+        (+ (undo-tree-node-char-lwidth (car n))
+           (/ undo-tree-visualizer-spacing 2) 1)))))
+    ;; move vertically
+    (undo-tree-move-up 3)))
+
+
+(defun undo-tree-timestamp-to-string
+  (timestamp &optional relative current register)
+  ;; Convert TIMESTAMP to string (either absolute or RELATVE time), indicating
+  ;; if it's the CURRENT node and/or has an associated REGISTER.
+  (if relative
+      ;; relative time
+      (let ((time (floor (float-time
+                         (subtract-time (current-time) timestamp))))
+           n)
+       (setq time
+             ;; years
+             (if (> (setq n (/ time 315360000)) 0)
+                 (if (> n 999) "-ages" (format "-%dy" n))
+               (setq time (% time 315360000))
+               ;; days
+               (if (> (setq n (/ time 86400)) 0)
+                   (format "-%dd" n)
+                 (setq time (% time 86400))
+                 ;; hours
+                 (if (> (setq n (/ time 3600)) 0)
+                     (format "-%dh" n)
+                   (setq time (% time 3600))
+                   ;; mins
+                   (if (> (setq n (/ time 60)) 0)
+                       (format "-%dm" n)
+                     ;; secs
+                     (format "-%ds" (% time 60)))))))
+       (setq time (concat
+                   (if current "*" " ")
+                   time
+                   (if register (concat "[" (char-to-string register) "]")
+                     "   ")))
+       (setq n (length time))
+       (if (< n 9)
+           (concat (make-string (- 9 n) ? ) time)
+         time))
+    ;; absolute time
+    (concat (if current "*" " ")
+           (format-time-string "%H:%M:%S" timestamp)
+           (if register
+               (concat "[" (char-to-string register) "]")
+             "   "))))
+
+
+
+\f
+;;; =====================================================================
+;;;                        Visualizer commands
+
+(defun undo-tree-visualizer-mode ()
+  "Major mode used in undo-tree visualizer.
+
+The undo-tree visualizer can only be invoked from a buffer in
+which `undo-tree-mode' is enabled. The visualizer displays the
+undo history tree graphically, and allows you to browse around
+the undo history, undoing or redoing the corresponding changes in
+the parent buffer.
+
+Within the undo-tree visualizer, the following keys are available:
+
+  \\{undo-tree-visualizer-map}"
+  (interactive)
+  (setq major-mode 'undo-tree-visualizer-mode)
+  (setq mode-name "undo-tree-visualizer-mode")
+  (use-local-map undo-tree-visualizer-map)
+  (setq truncate-lines t)
+  (setq cursor-type nil)
+  (setq buffer-read-only t)
+  (setq undo-tree-visualizer-selected-node nil)
+  (when undo-tree-visualizer-diff (undo-tree-visualizer-update-diff)))
+
+
+
+(defun undo-tree-visualize-undo (&optional arg)
+  "Undo changes. A numeric ARG serves as a repeat count."
+  (interactive "p")
+  (let ((old (undo-tree-current buffer-undo-tree))
+       current)
+    ;; unhighlight old current node
+    (let ((undo-tree-insert-face 'undo-tree-visualizer-active-branch-face)
+         (inhibit-read-only t))
+      (undo-tree-draw-node old))
+    ;; undo in parent buffer
+    (switch-to-buffer-other-window undo-tree-visualizer-parent-buffer)
+    (deactivate-mark)
+    (unwind-protect
+       (let ((undo-tree-inhibit-kill-visualizer t)) (undo-tree-undo-1 arg))
+      (setq current (undo-tree-current buffer-undo-tree))
+      (switch-to-buffer-other-window undo-tree-visualizer-buffer-name)
+      ;; when using lazy drawing, extend tree upwards as required
+      (when undo-tree-visualizer-lazy-drawing
+       (undo-tree-expand-up old current))
+      ;; highlight new current node
+      (let ((inhibit-read-only t)) (undo-tree-draw-node current 'current))
+      ;; update diff display, if any
+      (when undo-tree-visualizer-diff (undo-tree-visualizer-update-diff)))))
+
+
+(defun undo-tree-visualize-redo (&optional arg)
+  "Redo changes. A numeric ARG serves as a repeat count."
+  (interactive "p")
+  (let ((old (undo-tree-current buffer-undo-tree))
+       current)
+    ;; unhighlight old current node
+    (let ((undo-tree-insert-face 'undo-tree-visualizer-active-branch-face)
+         (inhibit-read-only t))
+      (undo-tree-draw-node (undo-tree-current buffer-undo-tree)))
+    ;; redo in parent buffer
+    (switch-to-buffer-other-window undo-tree-visualizer-parent-buffer)
+    (deactivate-mark)
+    (unwind-protect
+       (let ((undo-tree-inhibit-kill-visualizer t)) (undo-tree-redo-1 arg))
+      (setq current (undo-tree-current buffer-undo-tree))
+      (switch-to-buffer-other-window undo-tree-visualizer-buffer-name)
+      ;; when using lazy drawing, extend tree downwards as required
+      (when undo-tree-visualizer-lazy-drawing
+       (undo-tree-expand-down old current))
+      ;; highlight new current node
+      (let ((inhibit-read-only t)) (undo-tree-draw-node current 'current))
+      ;; update diff display, if any
+      (when undo-tree-visualizer-diff (undo-tree-visualizer-update-diff)))))
+
+
+(defun undo-tree-visualize-switch-branch-right (arg)
+  "Switch to next branch of the undo tree.
+This will affect which branch to descend when *redoing* changes
+using `undo-tree-redo' or `undo-tree-visualizer-redo'."
+  (interactive "p")
+  ;; un-highlight old active branch below current node
+  (goto-char (undo-tree-node-marker (undo-tree-current buffer-undo-tree)))
+  (let ((undo-tree-insert-face 'undo-tree-visualizer-default-face)
+       (inhibit-read-only t))
+    (undo-tree-highlight-active-branch (undo-tree-current buffer-undo-tree)))
+  ;; increment branch
+  (let ((branch (undo-tree-node-branch (undo-tree-current buffer-undo-tree))))
+  (setf (undo-tree-node-branch (undo-tree-current buffer-undo-tree))
+        (cond
+         ((>= (+ branch arg) (undo-tree-num-branches))
+          (1- (undo-tree-num-branches)))
+         ((<= (+ branch arg) 0) 0)
+         (t (+ branch arg))))
+  (let ((inhibit-read-only t))
+    ;; highlight new active branch below current node
+    (goto-char (undo-tree-node-marker (undo-tree-current buffer-undo-tree)))
+    (let ((undo-tree-insert-face 'undo-tree-visualizer-active-branch-face))
+      (undo-tree-highlight-active-branch (undo-tree-current buffer-undo-tree)))
+    ;; re-highlight current node
+    (undo-tree-draw-node (undo-tree-current buffer-undo-tree) 'current))))
+
+
+(defun undo-tree-visualize-switch-branch-left (arg)
+  "Switch to previous branch of the undo tree.
+This will affect which branch to descend when *redoing* changes
+using `undo-tree-redo' or `undo-tree-visualizer-redo'."
+  (interactive "p")
+  (undo-tree-visualize-switch-branch-right (- arg)))
+
+
+(defun undo-tree-visualizer-quit ()
+  "Quit the undo-tree visualizer."
+  (interactive)
+  (undo-tree-clear-visualizer-data buffer-undo-tree)
+  ;; remove kill visualizer hook from parent buffer
+  (unwind-protect
+      (with-current-buffer undo-tree-visualizer-parent-buffer
+       (remove-hook 'before-change-functions 'undo-tree-kill-visualizer t))
+    ;; kill diff buffer, if any
+    (when undo-tree-visualizer-diff (undo-tree-visualizer-hide-diff))
+    (let ((parent undo-tree-visualizer-parent-buffer)
+         window)
+      ;; kill visualizer buffer
+      (kill-buffer nil)
+      ;; switch back to parent buffer
+      (unwind-protect
+         (if (setq window (get-buffer-window parent))
+             (select-window window)
+           (switch-to-buffer parent))))))
+
+
+(defun undo-tree-visualizer-abort ()
+  "Quit the undo-tree visualizer and return buffer to original state."
+  (interactive)
+  (let ((node undo-tree-visualizer-initial-node))
+    (undo-tree-visualizer-quit)
+    (undo-tree-set node)))
+
+
+(defun undo-tree-visualizer-set (&optional pos)
+  "Set buffer to state corresponding to undo tree node
+at POS, or point if POS is nil."
+  (interactive)
+  (unless pos (setq pos (point)))
+  (let ((node (get-text-property pos 'undo-tree-node)))
+    (when node
+      ;; set parent buffer to state corresponding to node at POS
+      (switch-to-buffer-other-window undo-tree-visualizer-parent-buffer)
+      (let ((undo-tree-inhibit-kill-visualizer t)) (undo-tree-set node))
+      (switch-to-buffer-other-window undo-tree-visualizer-buffer-name)
+      ;; re-draw undo tree
+      (let ((inhibit-read-only t)) (undo-tree-draw-tree buffer-undo-tree))
+      (when undo-tree-visualizer-diff (undo-tree-visualizer-update-diff)))))
+
+
+(defun undo-tree-visualizer-mouse-set (pos)
+  "Set buffer to state corresponding to undo tree node
+at mouse event POS."
+  (interactive "@e")
+  (undo-tree-visualizer-set (event-start (nth 1 pos))))
+
+
+(defun undo-tree-visualize-undo-to-x (&optional x)
+  "Undo to last branch point, register, or saved state.
+If X is 'branch, undo to last branch point. If X is 'register,
+undo to last register. If X is 'saved, undo to last saved state.
+
+Interactively, a single \\[universal-argument] specifies
+`branch', a double \\[universal-argument] \[universal-argument]
+spcified `saved', and a negative prefix argument specifies
+`register'."
+  (interactive "P")
+  (when (and (called-interactively-p 'any) x)
+    (setq x (prefix-numeric-value x)
+         x (cond
+            ((< x 0)  'register)
+            ((<= x 4) 'branch)
+            (t        'saved))))
+  (let ((current (undo-tree-current buffer-undo-tree))
+       r)
+    (while (and (undo-tree-node-previous current)
+               (or (undo-tree-visualize-undo) t)
+               (setq current (undo-tree-current buffer-undo-tree))
+                        ;; branch point
+               (not (or (and (or (null x) (eq x 'branch))
+                             (> (undo-tree-num-branches) 1))
+                        ;; register
+                        (and (or (null x) (eq x 'register))
+                             (setq r (undo-tree-node-register current))
+                             (undo-tree-register-data-p
+                              (setq r (registerv-data (get-register r))))
+                             (eq current (undo-tree-register-data-node r)))
+                        ;; saved state
+                        (and (or (null x) (eq x 'saved))
+                             (undo-tree-node-unmodified-p current))
+                        ))))))
+
+
+(defun undo-tree-visualize-redo-to-x (&optional x)
+  "Redo to next branch point or register.
+If X is the symbol `branch', redo to next branch point ignoring
+registers. If X is the symbol 'register', redo to next register,
+ignoring branch points.
+
+Interactively, a positive prefix argument specifies `branch', and
+a negative prefix argument specifies `register'."
+  (interactive "P")
+  (when (and (called-interactively-p 'any) x)
+    (setq x (prefix-numeric-value x)
+         x (cond
+            ((< x 0)  'register)
+            ((<= x 4) 'branch)
+            (t        'saved))))
+  (let ((current (undo-tree-current buffer-undo-tree))
+       r)
+    (while (and (undo-tree-node-next current)
+               (or (undo-tree-visualize-redo) t)
+               (setq current (undo-tree-current buffer-undo-tree))
+                        ;; branch point
+               (not (or (and (or (null x) (eq x 'branch))
+                             (> (undo-tree-num-branches) 1))
+                        ;; register
+                        (and (or (null x) (eq x 'register))
+                             (setq r (undo-tree-node-register current))
+                             (undo-tree-register-data-p
+                              (setq r (registerv-data (get-register r))))
+                             (eq current (undo-tree-register-data-node r)))
+                        ;; saved state
+                        (and (or (null x) (eq x 'saved))
+                             (undo-tree-node-unmodified-p current))
+                        ))))))
+
+
+(defun undo-tree-visualizer-toggle-timestamps ()
+  "Toggle display of time-stamps."
+  (interactive)
+  (setq undo-tree-visualizer-timestamps (not undo-tree-visualizer-timestamps))
+  (setq undo-tree-visualizer-spacing (undo-tree-visualizer-calculate-spacing))
+  ;; redraw tree
+  (let ((inhibit-read-only t)) (undo-tree-draw-tree buffer-undo-tree)))
+
+
+(defun undo-tree-visualizer-scroll-left (&optional arg)
+  (interactive "p")
+  (scroll-left (or arg 1) t))
+
+
+(defun undo-tree-visualizer-scroll-right (&optional arg)
+  (interactive "p")
+  (scroll-right (or arg 1) t))
+
+
+(defun undo-tree-visualizer-scroll-up (&optional arg)
+  (interactive "P")
+  (if (or (and (numberp arg) (< arg 0)) (eq arg '-))
+      (undo-tree-visualizer-scroll-down arg)
+    ;; scroll up and expand newly-visible portion of tree
+    (unwind-protect
+       (scroll-up-command arg)
+      (undo-tree-expand-down
+       (nth (undo-tree-node-branch (undo-tree-current buffer-undo-tree))
+           (undo-tree-node-next (undo-tree-current buffer-undo-tree)))))
+    ;; signal error if at eob
+    (when (and (not undo-tree-visualizer-needs-extending-down) (eobp))
+      (scroll-up))))
+
+
+(defun undo-tree-visualizer-scroll-down (&optional arg)
+  (interactive "P")
+  (if (or (and (numberp arg) (< arg 0)) (eq arg '-))
+      (undo-tree-visualizer-scroll-up arg)
+    ;; ensure there's enough room at top of buffer to scroll
+    (let ((scroll-lines
+          (or arg (- (window-height) next-screen-context-lines)))
+         (window-line (1- (line-number-at-pos (window-start)))))
+      (when (and undo-tree-visualizer-needs-extending-up
+                (< window-line scroll-lines))
+       (let ((inhibit-read-only t))
+         (goto-char (point-min))
+         (undo-tree-move-up (- scroll-lines window-line)))))
+    ;; scroll down and expand newly-visible portion of tree
+    (unwind-protect
+       (scroll-down-command arg)
+      (undo-tree-expand-up
+       (undo-tree-node-previous (undo-tree-current buffer-undo-tree))))
+    ;; signal error if at bob
+    (when (and (not undo-tree-visualizer-needs-extending-down) (bobp))
+      (scroll-down))))
+
+
+
+\f
+;;; =====================================================================
+;;;                    Visualizer selection mode
+
+(defun undo-tree-visualizer-selection-mode ()
+  "Major mode used to select nodes in undo-tree visualizer."
+  (interactive)
+  (setq major-mode 'undo-tree-visualizer-selection-mode)
+  (setq mode-name "undo-tree-visualizer-selection-mode")
+  (use-local-map undo-tree-visualizer-selection-map)
+  (setq cursor-type 'box)
+  (setq undo-tree-visualizer-selected-node
+       (undo-tree-current buffer-undo-tree))
+  ;; erase diff (if any), as initially selected node is identical to current
+  (when undo-tree-visualizer-diff
+    (let ((buff (get-buffer undo-tree-diff-buffer-name))
+         (inhibit-read-only t))
+      (when buff (with-current-buffer buff (erase-buffer))))))
+
+
+(defun undo-tree-visualizer-select-previous (&optional arg)
+  "Move to previous node."
+  (interactive "p")
+  (let ((node undo-tree-visualizer-selected-node))
+    (catch 'top
+      (dotimes (i arg)
+       (unless (undo-tree-node-previous node) (throw 'top t))
+       (setq node (undo-tree-node-previous node))))
+    ;; when using lazy drawing, extend tree upwards as required
+    (when undo-tree-visualizer-lazy-drawing
+      (undo-tree-expand-up undo-tree-visualizer-selected-node node))
+    ;; update diff display, if any
+    (when (and undo-tree-visualizer-diff
+              (not (eq node undo-tree-visualizer-selected-node)))
+      (undo-tree-visualizer-update-diff node))
+    ;; move to selected node
+    (goto-char (undo-tree-node-marker node))
+    (setq undo-tree-visualizer-selected-node node)))
+
+
+(defun undo-tree-visualizer-select-next (&optional arg)
+  "Move to next node."
+  (interactive "p")
+  (let ((node undo-tree-visualizer-selected-node))
+    (catch 'bottom
+      (dotimes (i arg)
+       (unless (nth (undo-tree-node-branch node) (undo-tree-node-next node))
+         (throw 'bottom t))
+       (setq node
+             (nth (undo-tree-node-branch node) (undo-tree-node-next node)))))
+    ;; when using lazy drawing, extend tree upwards as required
+    (when undo-tree-visualizer-lazy-drawing
+      (undo-tree-expand-down undo-tree-visualizer-selected-node node))
+    ;; update diff display, if any
+    (when (and undo-tree-visualizer-diff
+              (not (eq node undo-tree-visualizer-selected-node)))
+      (undo-tree-visualizer-update-diff node))
+    ;; move to selected node
+    (goto-char (undo-tree-node-marker node))
+    (setq undo-tree-visualizer-selected-node node)))
+
+
+(defun undo-tree-visualizer-select-right (&optional arg)
+  "Move right to a sibling node."
+  (interactive "p")
+  (let ((node undo-tree-visualizer-selected-node)
+       end)
+    (goto-char (undo-tree-node-marker undo-tree-visualizer-selected-node))
+    (setq end (line-end-position))
+    (catch 'end
+      (dotimes (i arg)
+       (while (or (null node) (eq node undo-tree-visualizer-selected-node))
+         (forward-char)
+         (setq node (get-text-property (point) 'undo-tree-node))
+         (when (= (point) end) (throw 'end t)))))
+    (goto-char (undo-tree-node-marker
+               (or node undo-tree-visualizer-selected-node)))
+    (when (and undo-tree-visualizer-diff node
+              (not (eq node undo-tree-visualizer-selected-node)))
+      (undo-tree-visualizer-update-diff node))
+    (when node (setq undo-tree-visualizer-selected-node node))))
+
+
+(defun undo-tree-visualizer-select-left (&optional arg)
+  "Move left to a sibling node."
+  (interactive "p")
+  (let ((node (get-text-property (point) 'undo-tree-node))
+       beg)
+    (goto-char (undo-tree-node-marker undo-tree-visualizer-selected-node))
+    (setq beg (line-beginning-position))
+    (catch 'beg
+      (dotimes (i arg)
+       (while (or (null node) (eq node undo-tree-visualizer-selected-node))
+         (backward-char)
+         (setq node (get-text-property (point) 'undo-tree-node))
+         (when (= (point) beg) (throw 'beg t)))))
+    (goto-char (undo-tree-node-marker
+               (or node undo-tree-visualizer-selected-node)))
+    (when (and undo-tree-visualizer-diff node
+              (not (eq node undo-tree-visualizer-selected-node)))
+      (undo-tree-visualizer-update-diff node))
+    (when node (setq undo-tree-visualizer-selected-node node))))
+
+
+\f
+;;; =====================================================================
+;;;                      Visualizer diff display
+
+(defun undo-tree-visualizer-toggle-diff ()
+  "Toggle diff display in undo-tree visualizer."
+  (interactive)
+  (if undo-tree-visualizer-diff
+      (undo-tree-visualizer-hide-diff)
+    (undo-tree-visualizer-show-diff)))
+
+
+(defun undo-tree-visualizer-selection-toggle-diff ()
+  "Toggle diff display in undo-tree visualizer selection mode."
+  (interactive)
+  (if undo-tree-visualizer-diff
+      (undo-tree-visualizer-hide-diff)
+    (let ((node (get-text-property (point) 'undo-tree-node)))
+      (when node (undo-tree-visualizer-show-diff node)))))
+
+
+(defun undo-tree-visualizer-show-diff (&optional node)
+  ;; show visualizer diff display
+  (setq undo-tree-visualizer-diff t)
+  (let ((buff (with-current-buffer undo-tree-visualizer-parent-buffer
+               (undo-tree-diff node)))
+       (display-buffer-mark-dedicated 'soft)
+       win)
+    (setq win (split-window))
+    (set-window-buffer win buff)
+    (shrink-window-if-larger-than-buffer win)))
+
+
+(defun undo-tree-visualizer-hide-diff ()
+  ;; hide visualizer diff display
+  (setq undo-tree-visualizer-diff nil)
+  (let ((win (get-buffer-window undo-tree-diff-buffer-name)))
+    (when win (with-selected-window win (kill-buffer-and-window)))))
+
+
+(defun undo-tree-diff (&optional node)
+  ;; Create diff between current state and NODE (or previous state, if NODE is
+  ;; null). Returns buffer containing diff.
+  (let (tmpfile buff)
+    ;; generate diff
+    (let ((undo-tree-inhibit-kill-visualizer t)
+         (current (undo-tree-current buffer-undo-tree)))
+      (undo-tree-set (or node (undo-tree-node-previous current) current)
+                    'preserve-timestamps)
+      (setq tmpfile (diff-file-local-copy (current-buffer)))
+      (undo-tree-set current 'preserve-timestamps))
+    (setq buff (diff-no-select
+               (current-buffer) tmpfile nil 'noasync
+               (get-buffer-create undo-tree-diff-buffer-name)))
+    ;; delete process messages and useless headers from diff buffer
+    (with-current-buffer buff
+      (goto-char (point-min))
+      (delete-region (point) (1+ (line-end-position 3)))
+      (goto-char (point-max))
+      (forward-line -2)
+      (delete-region (point) (point-max))
+      (setq cursor-type nil)
+      (setq buffer-read-only t))
+    buff))
+
+
+(defun undo-tree-visualizer-update-diff (&optional node)
+  ;; update visualizer diff display to show diff between current state and
+  ;; NODE (or previous state, if NODE is null)
+  (with-current-buffer undo-tree-visualizer-parent-buffer
+    (undo-tree-diff node))
+  (let ((win (get-buffer-window undo-tree-diff-buffer-name)))
+    (when win
+      (balance-windows)
+      (shrink-window-if-larger-than-buffer win))))
+
+
+
+(provide 'undo-tree)
+
+;;; undo-tree.el ends here
diff --git a/packages/uni-confusables/confusables.txt b/packages/uni-confusables/confusables.txt
new file mode 100644 (file)
index 0000000..c303b5a
--- /dev/null
@@ -0,0 +1,31196 @@
+# Recommended confusable mapping for IDN
+# File: confusables.txt
+# Version: 2.1
+# Generated: 2010-04-13, 01:33:26 GMT
+# Checkin: $Revision: 1.29 $
+#
+# For documentation and usage, see http://www.unicode.org/reports/tr39/
+#
+
+# Single-Script, Lowercase Confusables
+
+05AD ; 0596 ;  SL      # ( ֭ → ֖ ) HEBREW ACCENT DEHI → HEBREW ACCENT TIPEHA     # 
+
+05AE ; 0598 ;  SL      # ( ֮ → ֘ ) HEBREW ACCENT ZINOR → HEBREW ACCENT ZARQA     # 
+
+05A8 ; 0599 ;  SL      # ( ֨ → ֙ ) HEBREW ACCENT QADMA → HEBREW ACCENT PASHTA    # 
+
+05A4 ; 059A ;  SL      # ( ֤ → ֚ ) HEBREW ACCENT MAHAPAKH → HEBREW ACCENT YETIV  # 
+
+06EC ; 06DF ;  SL      # ( ۬ → ۟ ) ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE → ARABIC SMALL HIGH ROUNDED ZERO  # 
+
+0619 ; 0313 ;  SL      # ( ؙ → ̓ ) ARABIC SMALL DAMMA → COMBINING COMMA ABOVE    # →ُ→
+0343 ; 0313 ;  SL      # ( ̓ → ̓ ) COMBINING GREEK KORONIS → COMBINING COMMA ABOVE       # 
+0315 ; 0313 ;  SL      # ( ̕ → ̓ ) COMBINING COMMA ABOVE RIGHT → COMBINING COMMA ABOVE   # 
+064F ; 0313 ;  SL      # ( ُ → ̓ ) ARABIC DAMMA → COMBINING COMMA ABOVE  # 
+
+059C ; 0301 ;  SL      # ( ֜ → ́ ) HEBREW ACCENT GERESH → COMBINING ACUTE ACCENT # 
+059D ; 0301 ;  SL      # ( ֝ → ́ ) HEBREW ACCENT GERESH MUQDAM → COMBINING ACUTE ACCENT  # →֜→
+0747 ; 0301 ;  SL      # ( ݇ → ́ ) SYRIAC OBLIQUE LINE ABOVE → COMBINING ACUTE ACCENT    # 
+0341 ; 0301 ;  SL      # ( ́ → ́ ) COMBINING ACUTE TONE MARK → COMBINING ACUTE ACCENT    # 
+0954 ; 0301 ;  SL      # ( ॔ → ́ ) DEVANAGARI ACUTE ACCENT → COMBINING ACUTE ACCENT     # 
+
+0340 ; 0300 ;  SL      # ( ̀ → ̀ ) COMBINING GRAVE TONE MARK → COMBINING GRAVE ACCENT    # 
+0953 ; 0300 ;  SL      # ( ॓ → ̀ ) DEVANAGARI GRAVE ACCENT → COMBINING GRAVE ACCENT     # 
+
+030C ; 0306 ;  SL      # ( ̌ → ̆ ) COMBINING CARON → COMBINING BREVE     # 
+036E ; 0306 ;  SL      # ( ͮ → ̆ ) COMBINING LATIN SMALL LETTER V → COMBINING BREVE      # →̌→
+
+0310 ; 0306 0307 ;     SL      # ( ̐ → ̆̇ ) COMBINING CANDRABINDU → COMBINING BREVE, COMBINING DOT ABOVE        # 
+0901 ; 0306 0307 ;     SL      # ( ँ → ̆̇ ) DEVANAGARI SIGN CANDRABINDU → COMBINING BREVE, COMBINING DOT ABOVE # →̐→
+0981 ; 0306 0307 ;     SL      # ( ঁ → ̆̇ ) BENGALI SIGN CANDRABINDU → COMBINING BREVE, COMBINING DOT ABOVE    # →̐→
+0A81 ; 0306 0307 ;     SL      # ( ઁ → ̆̇ ) GUJARATI SIGN CANDRABINDU → COMBINING BREVE, COMBINING DOT ABOVE   # →̐→
+0B01 ; 0306 0307 ;     SL      # ( ଁ → ̆̇ ) ORIYA SIGN CANDRABINDU → COMBINING BREVE, COMBINING DOT ABOVE      # →̐→
+
+0311 ; 0302 ;  SL      # ( ̑ → ̂ ) COMBINING INVERTED BREVE → COMBINING CIRCUMFLEX ACCENT        # 
+07EE ; 0302 ;  SL      # ( ߮ → ̂ ) NKO COMBINING LONG DESCENDING TONE → COMBINING CIRCUMFLEX ACCENT      # 
+
+05AF ; 030A ;  SL      # ( ֯ → ̊ ) HEBREW MARK MASORA CIRCLE → COMBINING RING ABOVE      # 
+17D3 ; 030A ;  SL      # ( ៓ → ̊ ) KHMER SIGN BATHAMASAT → COMBINING RING ABOVE # 
+0B82 ; 030A ;  SL      # ( ஂ → ̊ ) TAMIL SIGN ANUSVARA → COMBINING RING ABOVE   # 
+0E4D ; 030A ;  SL      # ( ํ → ̊ ) THAI CHARACTER NIKHAHIT → COMBINING RING ABOVE       # 
+0ECD ; 030A ;  SL      # ( ໍ → ̊ ) LAO NIGGAHITA → COMBINING RING ABOVE # 
+1036 ; 030A ;  SL      # ( ံ → ̊ ) MYANMAR SIGN ANUSVARA → COMBINING RING ABOVE # 
+17C6 ; 030A ;  SL      # ( ំ → ̊ ) KHMER SIGN NIKAHIT → COMBINING RING ABOVE    # 
+309A ; 030A ;  SL      # ( ゚ → ̊ ) COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK → COMBINING RING ABOVE    # 
+0366 ; 030A ;  SL      # ( ͦ → ̊ ) COMBINING LATIN SMALL LETTER O → COMBINING RING ABOVE # 
+
+07F3 ; 0308 ;  SL      # ( ߳ → ̈ ) NKO COMBINING DOUBLE DOT ABOVE → COMBINING DIAERESIS  # 
+
+0342 ; 0303 ;  SL      # ( ͂ → ̃ ) COMBINING GREEK PERISPOMENI → COMBINING TILDE # 
+
+05C4 ; 0307 ;  SL      # ( ׄ → ̇ ) HEBREW MARK UPPER DOT → COMBINING DOT ABOVE   # 
+0740 ; 0307 ;  SL      # ( ݀ → ̇ ) SYRIAC FEMININE DOT → COMBINING DOT ABOVE     # →݁→
+0741 ; 0307 ;  SL      # ( ݁ → ̇ ) SYRIAC QUSHSHAYA → COMBINING DOT ABOVE        # 
+0358 ; 0307 ;  SL      # ( ͘ → ̇ ) COMBINING DOT ABOVE RIGHT → COMBINING DOT ABOVE       # 
+05B9 ; 0307 ;  SL      # ( ֹ → ̇ ) HEBREW POINT HOLAM → COMBINING DOT ABOVE      # 
+05BA ; 0307 ;  SL      # ( ֺ → ̇ ) HEBREW POINT HOLAM HASER FOR VAV → COMBINING DOT ABOVE        # →ׁ→
+05C2 ; 0307 ;  SL      # ( ׂ → ̇ ) HEBREW POINT SIN DOT → COMBINING DOT ABOVE    # 
+05C1 ; 0307 ;  SL      # ( ׁ → ̇ ) HEBREW POINT SHIN DOT → COMBINING DOT ABOVE   # 
+07ED ; 0307 ;  SL      # ( ߭ → ̇ ) NKO COMBINING SHORT RISING TONE → COMBINING DOT ABOVE # 
+0902 ; 0307 ;  SL      # ( ं → ̇ ) DEVANAGARI SIGN ANUSVARA → COMBINING DOT ABOVE       # 
+0A02 ; 0307 ;  SL      # ( ਂ → ̇ ) GURMUKHI SIGN BINDI → COMBINING DOT ABOVE    # 
+0A82 ; 0307 ;  SL      # ( ં → ̇ ) GUJARATI SIGN ANUSVARA → COMBINING DOT ABOVE # 
+0BCD ; 0307 ;  SL      # ( ் → ̇ ) TAMIL SIGN VIRAMA → COMBINING DOT ABOVE      # 
+
+0337 ; 0338 ;  SL      # ( ̷ → ̸ ) COMBINING SHORT SOLIDUS OVERLAY → COMBINING LONG SOLIDUS OVERLAY      # 
+
+0322 ; 0328 ;  SL      # ( ̢ → ̨ ) COMBINING RETROFLEX HOOK BELOW → COMBINING OGONEK     # 
+
+0305 ; 0304 ;  SL      # ( ̅ → ̄ ) COMBINING OVERLINE → COMBINING MACRON # 
+07EB ; 0304 ;  SL      # ( ߫ → ̄ ) NKO COMBINING SHORT HIGH TONE → COMBINING MACRON      # 
+
+0347 ; 0333 ;  SL      # ( ͇ → ̳ ) COMBINING EQUALS SIGN BELOW → COMBINING DOUBLE LOW LINE       # 
+
+302C ; 0309 ;  SL      # ( 〬 → ̉ ) IDEOGRAPHIC DEPARTING TONE MARK → COMBINING HOOK ABOVE       # 
+
+05C5 ; 0323 ;  SL      # ( ׅ → ̣ ) HEBREW MARK LOWER DOT → COMBINING DOT BELOW   # 
+05B4 ; 0323 ;  SL      # ( ִ → ̣ ) HEBREW POINT HIRIQ → COMBINING DOT BELOW      # 
+093C ; 0323 ;  SL      # ( ़ → ̣ ) DEVANAGARI SIGN NUKTA → COMBINING DOT BELOW  # 
+09BC ; 0323 ;  SL      # ( ় → ̣ ) BENGALI SIGN NUKTA → COMBINING DOT BELOW     # 
+0A3C ; 0323 ;  SL      # ( ਼ → ̣ ) GURMUKHI SIGN NUKTA → COMBINING DOT BELOW    # 
+0ABC ; 0323 ;  SL      # ( ઼ → ̣ ) GUJARATI SIGN NUKTA → COMBINING DOT BELOW    # 
+0B3C ; 0323 ;  SL      # ( ଼ → ̣ ) ORIYA SIGN NUKTA → COMBINING DOT BELOW       # 
+10A3A ;        0323 ;  SL      # ( 𐨺 → ̣ ) KHAROSHTHI SIGN DOT BELOW → COMBINING DOT BELOW     # 
+
+302D ; 0325 ;  SL      # ( 〭 → ̥ ) IDEOGRAPHIC ENTERING TONE MARK → COMBINING RING BELOW        # 
+
+0327 ; 0326 ;  SL      # ( ̧ → ̦ ) COMBINING CEDILLA → COMBINING COMMA BELOW     # →̡→
+0321 ; 0326 ;  SL      # ( ̡ → ̦ ) COMBINING PALATALIZED HOOK BELOW → COMBINING COMMA BELOW      # 
+0339 ; 0326 ;  SL      # ( ̹ → ̦ ) COMBINING RIGHT HALF RING BELOW → COMBINING COMMA BELOW       # →̧→→̡→
+
+0952 ; 0331 ;  SL      # ( ॒ → ̱ ) DEVANAGARI STRESS SIGN ANUDATTA → COMBINING MACRON BELOW     # 
+0320 ; 0331 ;  SL      # ( ̠ → ̱ ) COMBINING MINUS SIGN BELOW → COMBINING MACRON BELOW   # 
+
+0336 ; 0335 ;  SL      # ( ̶ → ̵ ) COMBINING LONG STROKE OVERLAY → COMBINING SHORT STROKE OVERLAY        # 
+
+FC5E ; FE72 0651 ;     SL      #* ( ‎ﱞ‎ → ‎ﹲّ‎ ) ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM → ARABIC DAMMATAN ISOLATED FORM, ARABIC SHADDA    # 
+
+FC5F ; FE74 0651 ;     SL      #* ( ‎ﱟ‎ → ‎ﹴّ‎ ) ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM → ARABIC KASRATAN ISOLATED FORM, ARABIC SHADDA    # 
+
+0618 ; 064E ;  SL      # ( ؘ → َ ) ARABIC SMALL FATHA → ARABIC FATHA     # 
+
+FCF2 ; FE77 0651 ;     SL      # ( ‎ﳲ‎ → ‎ﹷّ‎ ) ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM → ARABIC FATHA MEDIAL FORM, ARABIC SHADDA       # 
+
+FC60 ; FE76 0651 ;     SL      #* ( ‎ﱠ‎ → ‎ﹶّ‎ ) ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM → ARABIC FATHA ISOLATED FORM, ARABIC SHADDA  # 
+FC62 ; FE76 0651 ;     SL      #* ( ‎ﱢ‎ → ‎ﹶّ‎ ) ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM → ARABIC FATHA ISOLATED FORM, ARABIC SHADDA  # →‎ﱠ‎→
+
+FCF3 ; FE79 0651 ;     SL      # ( ‎ﳳ‎ → ‎ﹹّ‎ ) ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM → ARABIC DAMMA MEDIAL FORM, ARABIC SHADDA       # 
+
+FC61 ; FE78 0651 ;     SL      #* ( ‎ﱡ‎ → ‎ﹸّ‎ ) ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM → ARABIC DAMMA ISOLATED FORM, ARABIC SHADDA  # 
+
+061A ; 0650 ;  SL      # ( ؚ → ِ ) ARABIC SMALL KASRA → ARABIC KASRA     # 
+
+FCF4 ; FE7B 0651 ;     SL      # ( ‎ﳴ‎ → ‎ﹻّ‎ ) ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM → ARABIC KASRA MEDIAL FORM, ARABIC SHADDA       # 
+
+FC63 ; FE7C 0670 ;     SL      #* ( ‎ﱣ‎ → ‎ﹼٰ‎ ) ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM → ARABIC SHADDA ISOLATED FORM, ARABIC LETTER SUPERSCRIPT ALEF     # 
+
+0742 ; 073C ;  SL      # ( ݂ → ܼ ) SYRIAC RUKKAKHA → SYRIAC HBASA-ESASA DOTTED   # 
+
+309B ; FF9E ;  SL      #* ( ゛ → ゙ ) KATAKANA-HIRAGANA VOICED SOUND MARK → HALFWIDTH KATAKANA VOICED SOUND MARK # 
+
+309C ; FF9F ;  SL      #* ( ゜ → ゚ ) KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK → HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK       # 
+
+180E ; 0020 ;  SL      #* ( ᠎ →   ) MONGOLIAN VOWEL SEPARATOR → SPACE    # 
+2028 ; 0020 ;  SL      #* (  →   ) LINE SEPARATOR → SPACE  # 
+2029 ; 0020 ;  SL      #* (  →   ) PARAGRAPH SEPARATOR → SPACE     # 
+2000 ; 0020 ;  SL      #* (   →   ) EN QUAD → SPACE      # 
+2001 ; 0020 ;  SL      #* (   →   ) EM QUAD → SPACE      # 
+2002 ; 0020 ;  SL      #* (   →   ) EN SPACE → SPACE     # 
+2003 ; 0020 ;  SL      #* (   →   ) EM SPACE → SPACE     # 
+2004 ; 0020 ;  SL      #* (   →   ) THREE-PER-EM SPACE → SPACE   # 
+2005 ; 0020 ;  SL      #* (   →   ) FOUR-PER-EM SPACE → SPACE    # 
+2006 ; 0020 ;  SL      #* (   →   ) SIX-PER-EM SPACE → SPACE     # 
+2008 ; 0020 ;  SL      #* (   →   ) PUNCTUATION SPACE → SPACE    # 
+2009 ; 0020 ;  SL      #* (   →   ) THIN SPACE → SPACE   # 
+200A ; 0020 ;  SL      #* (   →   ) HAIR SPACE → SPACE   # 
+205F ; 0020 ;  SL      #* (   →   ) MEDIUM MATHEMATICAL SPACE → SPACE    # 
+00A0 ; 0020 ;  SL      #* (   →   ) NO-BREAK SPACE → SPACE        # 
+2007 ; 0020 ;  SL      #* (   →   ) FIGURE SPACE → SPACE # 
+202F ; 0020 ;  SL      #* (   →   ) NARROW NO-BREAK SPACE → SPACE        # 
+1680 ; 0020 ;  SL      #* (   →   ) OGHAM SPACE MARK → SPACE     # 
+
+02C4 ; 005E ;  SL      #* ( ˄ → ^ ) MODIFIER LETTER UP ARROWHEAD → CIRCUMFLEX ACCENT      # 
+02C6 ; 005E ;  SL      # ( ˆ → ^ ) MODIFIER LETTER CIRCUMFLEX ACCENT → CIRCUMFLEX ACCENT  # 
+
+07FA ; 005F ;  SL      # ( ‎ߺ‎ → _ ) NKO LAJANYALAN → LOW LINE        # 
+FE4D ; 005F ;  SL      # ( ﹍ → _ ) DASHED LOW LINE → LOW LINE    # 
+FE4E ; 005F ;  SL      # ( ﹎ → _ ) CENTRELINE LOW LINE → LOW LINE        # 
+FE4F ; 005F ;  SL      # ( ﹏ → _ ) WAVY LOW LINE → LOW LINE      # 
+
+2307 ; FE34 ;  SL      #* ( ⌇ → ︴ ) WAVY LINE → PRESENTATION FORM FOR VERTICAL WAVY LOW LINE   # 
+
+2010 ; 002D ;  SL      #* ( ‐ → - ) HYPHEN → HYPHEN-MINUS        # 
+2011 ; 002D ;  SL      #* ( ‑ → - ) NON-BREAKING HYPHEN → HYPHEN-MINUS   # 
+2012 ; 002D ;  SL      #* ( ‒ → - ) FIGURE DASH → HYPHEN-MINUS   # 
+2013 ; 002D ;  SL      #* ( – → - ) EN DASH → HYPHEN-MINUS       # 
+FE58 ; 002D ;  SL      #* ( ﹘ → - ) SMALL EM DASH → HYPHEN-MINUS # 
+2043 ; 002D ;  SL      #* ( ⁃ → - ) HYPHEN BULLET → HYPHEN-MINUS # →‒→
+02D7 ; 002D ;  SL      #* ( ˗ → - ) MODIFIER LETTER MINUS SIGN → HYPHEN-MINUS     # 
+2212 ; 002D ;  SL      #* ( − → - ) MINUS SIGN → HYPHEN-MINUS    # 
+
+A4FE ; 002D 002E ;     SL      #* ( ꓾ → -. ) LISU PUNCTUATION COMMA → HYPHEN-MINUS, FULL STOP    # 
+
+FF5E ; 301C ;  SL      #* ( ~ → 〜 ) FULLWIDTH TILDE → WAVE DASH        # 
+
+00B8 ; 002C ;  SL      #* ( ¸ → , ) CEDILLA → COMMA       # 
+066B ; 002C ;  SL      #* ( ‎٫‎ → , ) ARABIC DECIMAL SEPARATOR → COMMA        # 
+201A ; 002C ;  SL      #* ( ‚ → , ) SINGLE LOW-9 QUOTATION MARK → COMMA  # 
+
+066C ; 060C ;  SL      #* ( ‎٬‎ → ، ) ARABIC THOUSANDS SEPARATOR → ARABIC COMMA      # 
+
+037E ; 003B ;  SL      #* ( ; → ; ) GREEK QUESTION MARK → SEMICOLON       # 
+
+0903 ; 003A ;  SL      # ( ः → : ) DEVANAGARI SIGN VISARGA → COLON       # 
+0A83 ; 003A ;  SL      # ( ઃ → : ) GUJARATI SIGN VISARGA → COLON # 
+FF1A ; 003A ;  SL      #* ( : → : ) FULLWIDTH COLON → COLON      # →︰→
+0589 ; 003A ;  SL      #* ( ։ → : ) ARMENIAN FULL STOP → COLON    # 
+0703 ; 003A ;  SL      #* ( ‎܃‎ → : ) SYRIAC SUPRALINEAR COLON → COLON        # 
+0704 ; 003A ;  SL      #* ( ‎܄‎ → : ) SYRIAC SUBLINEAR COLON → COLON  # 
+FE30 ; 003A ;  SL      #* ( ︰ → : ) PRESENTATION FORM FOR VERTICAL TWO DOT LEADER → COLON        # 
+1803 ; 003A ;  SL      #* ( ᠃ → : ) MONGOLIAN FULL STOP → COLON  # 
+1809 ; 003A ;  SL      #* ( ᠉ → : ) MONGOLIAN MANCHU FULL STOP → COLON   # 
+205A ; 003A ;  SL      #* ( ⁚ → : ) TWO DOT PUNCTUATION → COLON  # 
+05C3 ; 003A ;  SL      #* ( ‎׃‎ → : ) HEBREW PUNCTUATION SOF PASUQ → COLON    # 
+02F8 ; 003A ;  SL      #* ( ˸ → : ) MODIFIER LETTER RAISED COLON → COLON  # 
+A789 ; 003A ;  SL      #* ( ꞉ → : ) MODIFIER LETTER COLON → COLON        # 
+2236 ; 003A ;  SL      #* ( ∶ → : ) RATIO → COLON        # 
+02D0 ; 003A ;  SL      # ( ː → : ) MODIFIER LETTER TRIANGULAR COLON → COLON       # 
+A4FD ; 003A ;  SL      # ( ꓽ → : ) LISU LETTER TONE MYA JEU → COLON      # 
+
+2A74 ; 003A 003A 003D ;        SL      #* ( ⩴ → ::= ) DOUBLE COLON EQUAL → COLON, COLON, EQUALS SIGN     # 
+
+FF01 ; 0021 ;  SL      #* ( ! → ! ) FULLWIDTH EXCLAMATION MARK → EXCLAMATION MARK        # →ǃ→
+01C3 ; 0021 ;  SL      # ( ǃ → ! ) LATIN LETTER RETROFLEX CLICK → EXCLAMATION MARK        # 
+
+203C ; 0021 0021 ;     SL      #* ( ‼ → !! ) DOUBLE EXCLAMATION MARK → EXCLAMATION MARK, EXCLAMATION MARK        # 
+
+2049 ; 0021 003F ;     SL      #* ( ⁉ → !? ) EXCLAMATION QUESTION MARK → EXCLAMATION MARK, QUESTION MARK # 
+
+0294 ; 003F ;  SL      # ( ʔ → ? ) LATIN LETTER GLOTTAL STOP → QUESTION MARK      # 
+097D ; 003F ;  SL      # ( ॽ → ? ) DEVANAGARI LETTER GLOTTAL STOP → QUESTION MARK        # 
+
+2048 ; 003F 0021 ;     SL      #* ( ⁈ → ?! ) QUESTION EXCLAMATION MARK → QUESTION MARK, EXCLAMATION MARK # 
+
+2047 ; 003F 003F ;     SL      #* ( ⁇ → ?? ) DOUBLE QUESTION MARK → QUESTION MARK, QUESTION MARK # 
+
+1D16D ;        002E ;  SL      # ( 𝅭 → . ) MUSICAL SYMBOL COMBINING AUGMENTATION DOT → FULL STOP        # 
+2024 ; 002E ;  SL      #* ( ․ → . ) ONE DOT LEADER → FULL STOP   # 
+06D4 ; 002E ;  SL      #* ( ‎۔‎ → . ) ARABIC FULL STOP → FULL STOP    # 
+0701 ; 002E ;  SL      #* ( ‎܁‎ → . ) SYRIAC SUPRALINEAR FULL STOP → FULL STOP        # 
+0702 ; 002E ;  SL      #* ( ‎܂‎ → . ) SYRIAC SUBLINEAR FULL STOP → FULL STOP  # 
+A60E ; 002E ;  SL      #* ( ꘎ → . ) VAI FULL STOP → FULL STOP    # 
+10A50 ;        002E ;  SL      #* ( ‎𐩐‎ → . ) KHAROSHTHI PUNCTUATION DOT → FULL STOP        # 
+0660 ; 002E ;  SL      # ( ‎٠‎ → . ) ARABIC-INDIC DIGIT ZERO → FULL STOP      # 
+06F0 ; 002E ;  SL      # ( ۰ → . ) EXTENDED ARABIC-INDIC DIGIT ZERO → FULL STOP   # →‎٠‎→
+A4F8 ; 002E ;  SL      # ( ꓸ → . ) LISU LETTER TONE MYA TI → FULL STOP   # 
+A4FB ; 002E ;  SL      # ( ꓻ → . ) LISU LETTER TONE MYA BO → FULL STOP   # 
+
+2025 ; 002E 002E ;     SL      #* ( ‥ → .. ) TWO DOT LEADER → FULL STOP, FULL STOP       # 
+A4FA ; 002E 002E ;     SL      # ( ꓺ → .. ) LISU LETTER TONE MYA CYA → FULL STOP, FULL STOP      # 
+
+2026 ; 002E 002E 002E ;        SL      #* ( … → ... ) HORIZONTAL ELLIPSIS → FULL STOP, FULL STOP, FULL STOP      # 
+
+30FB ; 00B7 ;  SL      #* ( ・ → · ) KATAKANA MIDDLE DOT → MIDDLE DOT    # →•→
+FF65 ; 00B7 ;  SL      #* ( ・ → · ) HALFWIDTH KATAKANA MIDDLE DOT → MIDDLE DOT  # →•→
+0387 ; 00B7 ;  SL      # ( · → · ) GREEK ANO TELEIA → MIDDLE DOT # 
+10101 ;        00B7 ;  SL      #* ( 𐄁 → · ) AEGEAN WORD SEPARATOR DOT → MIDDLE DOT     # 
+2022 ; 00B7 ;  SL      #* ( • → · ) BULLET → MIDDLE DOT # 
+2027 ; 00B7 ;  SL      #* ( ‧ → · ) HYPHENATION POINT → MIDDLE DOT      # 
+2219 ; 00B7 ;  SL      #* ( ∙ → · ) BULLET OPERATOR → MIDDLE DOT        # 
+22C5 ; 00B7 ;  SL      #* ( ⋅ → · ) DOT OPERATOR → MIDDLE DOT   # 
+1427 ; 00B7 ;  SL      # ( ᐧ → · ) CANADIAN SYLLABICS FINAL MIDDLE DOT → MIDDLE DOT     # 
+
+22EF ; 00B7 00B7 00B7 ;        SL      #* ( ⋯ → ··· ) MIDLINE HORIZONTAL ELLIPSIS → MIDDLE DOT, MIDDLE DOT, MIDDLE DOT        # 
+
+152F ; 00B7 0034 ;     SL      # ( ᔯ → ·4 ) CANADIAN SYLLABICS YWE → MIDDLE DOT, DIGIT FOUR     # →ᐧ4→
+
+140C ; 00B7 1401 ;     SL      # ( ᐌ → ·ᐁ ) CANADIAN SYLLABICS WE → MIDDLE DOT, CANADIAN SYLLABICS E  # →ᐧᐁ→
+
+140E ; 00B7 1403 ;     SL      # ( ᐎ → ·ᐃ ) CANADIAN SYLLABICS WI → MIDDLE DOT, CANADIAN SYLLABICS I  # →ᐧᐃ→
+
+1410 ; 00B7 1404 ;     SL      # ( ᐐ → ·ᐄ ) CANADIAN SYLLABICS WII → MIDDLE DOT, CANADIAN SYLLABICS II        # →ᐧᐄ→
+
+1412 ; 00B7 1405 ;     SL      # ( ᐒ → ·ᐅ ) CANADIAN SYLLABICS WO → MIDDLE DOT, CANADIAN SYLLABICS O  # →ᐧᐅ→
+
+1414 ; 00B7 1406 ;     SL      # ( ᐔ → ·ᐆ ) CANADIAN SYLLABICS WOO → MIDDLE DOT, CANADIAN SYLLABICS OO        # →ᐧᐆ→
+
+1417 ; 00B7 140A ;     SL      # ( ᐗ → ·ᐊ ) CANADIAN SYLLABICS WA → MIDDLE DOT, CANADIAN SYLLABICS A  # →ᐧᐊ→
+
+1419 ; 00B7 140B ;     SL      # ( ᐙ → ·ᐋ ) CANADIAN SYLLABICS WAA → MIDDLE DOT, CANADIAN SYLLABICS AA        # →ᐧᐋ→
+
+1437 ; 00B7 1433 ;     SL      # ( ᐷ → ·ᐳ ) CANADIAN SYLLABICS CARRIER HI → MIDDLE DOT, CANADIAN SYLLABICS PO # →ᑀ→→ᐧᐳ→
+1440 ; 00B7 1433 ;     SL      # ( ᑀ → ·ᐳ ) CANADIAN SYLLABICS PWO → MIDDLE DOT, CANADIAN SYLLABICS PO        # →ᐧᐳ→
+
+1442 ; 00B7 1434 ;     SL      # ( ᑂ → ·ᐴ ) CANADIAN SYLLABICS PWOO → MIDDLE DOT, CANADIAN SYLLABICS POO      # →ᐧᐴ→
+
+1444 ; 00B7 1438 ;     SL      # ( ᑄ → ·ᐸ ) CANADIAN SYLLABICS PWA → MIDDLE DOT, CANADIAN SYLLABICS PA        # →ᐧᐸ→
+
+1446 ; 00B7 1439 ;     SL      # ( ᑆ → ·ᐹ ) CANADIAN SYLLABICS PWAA → MIDDLE DOT, CANADIAN SYLLABICS PAA      # →ᐧᐹ→
+
+1457 ; 00B7 144C ;     SL      # ( ᑗ → ·ᑌ ) CANADIAN SYLLABICS TWE → MIDDLE DOT, CANADIAN SYLLABICS TE        # →ᐧᑌ→
+
+1459 ; 00B7 144E ;     SL      # ( ᑙ → ·ᑎ ) CANADIAN SYLLABICS TWI → MIDDLE DOT, CANADIAN SYLLABICS TI        # →ᐧᑎ→
+
+145B ; 00B7 144F ;     SL      # ( ᑛ → ·ᑏ ) CANADIAN SYLLABICS TWII → MIDDLE DOT, CANADIAN SYLLABICS TII      # →ᐧᑏ→
+
+1454 ; 00B7 1450 ;     SL      # ( ᑔ → ·ᑐ ) CANADIAN SYLLABICS CARRIER DI → MIDDLE DOT, CANADIAN SYLLABICS TO # →ᑝ→→ᐧᑐ→
+145D ; 00B7 1450 ;     SL      # ( ᑝ → ·ᑐ ) CANADIAN SYLLABICS TWO → MIDDLE DOT, CANADIAN SYLLABICS TO        # →ᐧᑐ→
+
+145F ; 00B7 1451 ;     SL      # ( ᑟ → ·ᑑ ) CANADIAN SYLLABICS TWOO → MIDDLE DOT, CANADIAN SYLLABICS TOO      # →ᐧᑑ→
+
+1461 ; 00B7 1455 ;     SL      # ( ᑡ → ·ᑕ ) CANADIAN SYLLABICS TWA → MIDDLE DOT, CANADIAN SYLLABICS TA        # →ᐧᑕ→
+
+1463 ; 00B7 1456 ;     SL      # ( ᑣ → ·ᑖ ) CANADIAN SYLLABICS TWAA → MIDDLE DOT, CANADIAN SYLLABICS TAA      # →ᐧᑖ→
+
+1474 ; 00B7 146B ;     SL      # ( ᑴ → ·ᑫ ) CANADIAN SYLLABICS KWE → MIDDLE DOT, CANADIAN SYLLABICS KE        # →ᐧᑫ→
+
+1478 ; 00B7 146E ;     SL      # ( ᑸ → ·ᑮ ) CANADIAN SYLLABICS KWII → MIDDLE DOT, CANADIAN SYLLABICS KII      # →ᐧᑮ→
+
+147C ; 00B7 1470 ;     SL      # ( ᑼ → ·ᑰ ) CANADIAN SYLLABICS KWOO → MIDDLE DOT, CANADIAN SYLLABICS KOO      # →ᐧᑰ→
+
+147E ; 00B7 1472 ;     SL      # ( ᑾ → ·ᑲ ) CANADIAN SYLLABICS KWA → MIDDLE DOT, CANADIAN SYLLABICS KA        # →ᐧᑲ→
+
+1480 ; 00B7 1473 ;     SL      # ( ᒀ → ·ᑳ ) CANADIAN SYLLABICS KWAA → MIDDLE DOT, CANADIAN SYLLABICS KAA      # →ᐧᑳ→
+
+1492 ; 00B7 1489 ;     SL      # ( ᒒ → ·ᒉ ) CANADIAN SYLLABICS CWE → MIDDLE DOT, CANADIAN SYLLABICS CE        # →ᐧᒉ→
+
+1494 ; 00B7 148B ;     SL      # ( ᒔ → ·ᒋ ) CANADIAN SYLLABICS CWI → MIDDLE DOT, CANADIAN SYLLABICS CI        # →ᐧᒋ→
+
+1496 ; 00B7 148C ;     SL      # ( ᒖ → ·ᒌ ) CANADIAN SYLLABICS CWII → MIDDLE DOT, CANADIAN SYLLABICS CII      # →ᐧᒌ→
+
+149A ; 00B7 148E ;     SL      # ( ᒚ → ·ᒎ ) CANADIAN SYLLABICS CWOO → MIDDLE DOT, CANADIAN SYLLABICS COO      # →ᐧᒎ→
+
+149C ; 00B7 1490 ;     SL      # ( ᒜ → ·ᒐ ) CANADIAN SYLLABICS CWA → MIDDLE DOT, CANADIAN SYLLABICS CA        # →ᐧᒐ→
+
+149E ; 00B7 1491 ;     SL      # ( ᒞ → ·ᒑ ) CANADIAN SYLLABICS CWAA → MIDDLE DOT, CANADIAN SYLLABICS CAA      # →ᐧᒑ→
+
+14AC ; 00B7 14A3 ;     SL      # ( ᒬ → ·ᒣ ) CANADIAN SYLLABICS MWE → MIDDLE DOT, CANADIAN SYLLABICS ME        # →ᐧᒣ→
+
+14AE ; 00B7 14A5 ;     SL      # ( ᒮ → ·ᒥ ) CANADIAN SYLLABICS MWI → MIDDLE DOT, CANADIAN SYLLABICS MI        # →ᐧᒥ→
+
+14B0 ; 00B7 14A6 ;     SL      # ( ᒰ → ·ᒦ ) CANADIAN SYLLABICS MWII → MIDDLE DOT, CANADIAN SYLLABICS MII      # →ᐧᒦ→
+
+14B2 ; 00B7 14A7 ;     SL      # ( ᒲ → ·ᒧ ) CANADIAN SYLLABICS MWO → MIDDLE DOT, CANADIAN SYLLABICS MO        # →ᐧᒧ→
+
+14B4 ; 00B7 14A8 ;     SL      # ( ᒴ → ·ᒨ ) CANADIAN SYLLABICS MWOO → MIDDLE DOT, CANADIAN SYLLABICS MOO      # →ᐧᒨ→
+
+14B6 ; 00B7 14AA ;     SL      # ( ᒶ → ·ᒪ ) CANADIAN SYLLABICS MWA → MIDDLE DOT, CANADIAN SYLLABICS MA        # →ᐧᒪ→
+
+14B8 ; 00B7 14AB ;     SL      # ( ᒸ → ·ᒫ ) CANADIAN SYLLABICS MWAA → MIDDLE DOT, CANADIAN SYLLABICS MAA      # →ᐧᒫ→
+
+14C9 ; 00B7 14C0 ;     SL      # ( ᓉ → ·ᓀ ) CANADIAN SYLLABICS NWE → MIDDLE DOT, CANADIAN SYLLABICS NE        # →ᐧᓀ→
+
+14CB ; 00B7 14C7 ;     SL      # ( ᓋ → ·ᓇ ) CANADIAN SYLLABICS NWA → MIDDLE DOT, CANADIAN SYLLABICS NA        # →ᐧᓇ→
+
+14CD ; 00B7 14C8 ;     SL      # ( ᓍ → ·ᓈ ) CANADIAN SYLLABICS NWAA → MIDDLE DOT, CANADIAN SYLLABICS NAA      # →ᐧᓈ→
+
+14DC ; 00B7 14D3 ;     SL      # ( ᓜ → ·ᓓ ) CANADIAN SYLLABICS LWE → MIDDLE DOT, CANADIAN SYLLABICS LE        # →ᐧᓓ→
+
+14DE ; 00B7 14D5 ;     SL      # ( ᓞ → ·ᓕ ) CANADIAN SYLLABICS LWI → MIDDLE DOT, CANADIAN SYLLABICS LI        # →ᐧᓕ→
+
+14E0 ; 00B7 14D6 ;     SL      # ( ᓠ → ·ᓖ ) CANADIAN SYLLABICS LWII → MIDDLE DOT, CANADIAN SYLLABICS LII      # →ᐧᓖ→
+
+14E2 ; 00B7 14D7 ;     SL      # ( ᓢ → ·ᓗ ) CANADIAN SYLLABICS LWO → MIDDLE DOT, CANADIAN SYLLABICS LO        # →ᐧᓗ→
+
+14E4 ; 00B7 14D8 ;     SL      # ( ᓤ → ·ᓘ ) CANADIAN SYLLABICS LWOO → MIDDLE DOT, CANADIAN SYLLABICS LOO      # →ᐧᓘ→
+
+14E6 ; 00B7 14DA ;     SL      # ( ᓦ → ·ᓚ ) CANADIAN SYLLABICS LWA → MIDDLE DOT, CANADIAN SYLLABICS LA        # →ᐧᓚ→
+
+14E8 ; 00B7 14DB ;     SL      # ( ᓨ → ·ᓛ ) CANADIAN SYLLABICS LWAA → MIDDLE DOT, CANADIAN SYLLABICS LAA      # →ᐧᓛ→
+
+14F6 ; 00B7 14ED ;     SL      # ( ᓶ → ·ᓭ ) CANADIAN SYLLABICS SWE → MIDDLE DOT, CANADIAN SYLLABICS SE        # →ᐧᓭ→
+
+14F8 ; 00B7 14EF ;     SL      # ( ᓸ → ·ᓯ ) CANADIAN SYLLABICS SWI → MIDDLE DOT, CANADIAN SYLLABICS SI        # →ᐧᓯ→
+
+14FA ; 00B7 14F0 ;     SL      # ( ᓺ → ·ᓰ ) CANADIAN SYLLABICS SWII → MIDDLE DOT, CANADIAN SYLLABICS SII      # →ᐧᓰ→
+
+14FC ; 00B7 14F1 ;     SL      # ( ᓼ → ·ᓱ ) CANADIAN SYLLABICS SWO → MIDDLE DOT, CANADIAN SYLLABICS SO        # →ᐧᓱ→
+
+14FE ; 00B7 14F2 ;     SL      # ( ᓾ → ·ᓲ ) CANADIAN SYLLABICS SWOO → MIDDLE DOT, CANADIAN SYLLABICS SOO      # →ᐧᓲ→
+
+1500 ; 00B7 14F4 ;     SL      # ( ᔀ → ·ᓴ ) CANADIAN SYLLABICS SWA → MIDDLE DOT, CANADIAN SYLLABICS SA        # →ᐧᓴ→
+
+1502 ; 00B7 14F5 ;     SL      # ( ᔂ → ·ᓵ ) CANADIAN SYLLABICS SWAA → MIDDLE DOT, CANADIAN SYLLABICS SAA      # →ᐧᓵ→
+
+1517 ; 00B7 1510 ;     SL      # ( ᔗ → ·ᔐ ) CANADIAN SYLLABICS SHWE → MIDDLE DOT, CANADIAN SYLLABICS SHE      # →ᐧᔐ→
+
+1519 ; 00B7 1511 ;     SL      # ( ᔙ → ·ᔑ ) CANADIAN SYLLABICS SHWI → MIDDLE DOT, CANADIAN SYLLABICS SHI      # →ᐧᔑ→
+
+151B ; 00B7 1512 ;     SL      # ( ᔛ → ·ᔒ ) CANADIAN SYLLABICS SHWII → MIDDLE DOT, CANADIAN SYLLABICS SHII    # →ᐧᔒ→
+
+151D ; 00B7 1513 ;     SL      # ( ᔝ → ·ᔓ ) CANADIAN SYLLABICS SHWO → MIDDLE DOT, CANADIAN SYLLABICS SHO      # →ᐧᔓ→
+
+151F ; 00B7 1514 ;     SL      # ( ᔟ → ·ᔔ ) CANADIAN SYLLABICS SHWOO → MIDDLE DOT, CANADIAN SYLLABICS SHOO    # →ᐧᔔ→
+
+1521 ; 00B7 1515 ;     SL      # ( ᔡ → ·ᔕ ) CANADIAN SYLLABICS SHWA → MIDDLE DOT, CANADIAN SYLLABICS SHA      # →ᐧᔕ→
+
+1523 ; 00B7 1516 ;     SL      # ( ᔣ → ·ᔖ ) CANADIAN SYLLABICS SHWAA → MIDDLE DOT, CANADIAN SYLLABICS SHAA    # →ᐧᔖ→
+
+1531 ; 00B7 1528 ;     SL      # ( ᔱ → ·ᔨ ) CANADIAN SYLLABICS YWI → MIDDLE DOT, CANADIAN SYLLABICS YI        # →ᐧᔨ→
+
+1533 ; 00B7 1529 ;     SL      # ( ᔳ → ·ᔩ ) CANADIAN SYLLABICS YWII → MIDDLE DOT, CANADIAN SYLLABICS YII      # →ᐧᔩ→
+
+1535 ; 00B7 152A ;     SL      # ( ᔵ → ·ᔪ ) CANADIAN SYLLABICS YWO → MIDDLE DOT, CANADIAN SYLLABICS YO        # →ᐧᔪ→
+
+1537 ; 00B7 152B ;     SL      # ( ᔷ → ·ᔫ ) CANADIAN SYLLABICS YWOO → MIDDLE DOT, CANADIAN SYLLABICS YOO      # →ᐧᔫ→
+
+1539 ; 00B7 152D ;     SL      # ( ᔹ → ·ᔭ ) CANADIAN SYLLABICS YWA → MIDDLE DOT, CANADIAN SYLLABICS YA        # →ᐧᔭ→
+
+153B ; 00B7 152E ;     SL      # ( ᔻ → ·ᔮ ) CANADIAN SYLLABICS YWAA → MIDDLE DOT, CANADIAN SYLLABICS YAA      # →ᐧᔮ→
+
+154E ; 00B7 154C ;     SL      # ( ᕎ → ·ᕌ ) CANADIAN SYLLABICS RWAA → MIDDLE DOT, CANADIAN SYLLABICS RAA      # →ᐧᕌ→
+
+155B ; 00B7 155A ;     SL      # ( ᕛ → ·ᕚ ) CANADIAN SYLLABICS FWAA → MIDDLE DOT, CANADIAN SYLLABICS FAA      # →ᐧᕚ→
+
+1568 ; 00B7 1567 ;     SL      # ( ᕨ → ·ᕧ ) CANADIAN SYLLABICS THWAA → MIDDLE DOT, CANADIAN SYLLABICS THAA    # →ᐧᕧ→
+
+FE19 ; 205D ;  SL      #* ( ︙ → ⁝ ) PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS → TRICOLON      # 
+22EE ; 205D ;  SL      #* ( ⋮ → ⁝ ) VERTICAL ELLIPSIS → TRICOLON       # →︙→
+
+0060 ; 0027 ;  SL      #* ( ` → ' ) GRAVE ACCENT → APOSTROPHE      # →ˋ→→`→→‘→
+1FEF ; 0027 ;  SL      #* ( ` → ' ) GREEK VARIA → APOSTROPHE     # →ˋ→→`→→‘→
+FF40 ; 0027 ;  SL      #* ( ` → ' ) FULLWIDTH GRAVE ACCENT → APOSTROPHE  # →‘→
+00B4 ; 0027 ;  SL      #* ( ´ → ' ) ACUTE ACCENT → APOSTROPHE     # →΄→→ʹ→
+0384 ; 0027 ;  SL      #* ( ΄ → ' ) GREEK TONOS → APOSTROPHE      # →ʹ→
+1FFD ; 0027 ;  SL      #* ( ´ → ' ) GREEK OXIA → APOSTROPHE      # →ˊ→→ʹ→→′→
+1FBD ; 0027 ;  SL      #* ( ᾽ → ' ) GREEK KORONIS → APOSTROPHE   # →’→
+1FBF ; 0027 ;  SL      #* ( ᾿ → ' ) GREEK PSILI → APOSTROPHE     # →’→
+1FFE ; 0027 ;  SL      #* ( ῾ → ' ) GREEK DASIA → APOSTROPHE     # →‛→→′→
+055D ; 0027 ;  SL      #* ( ՝ → ' ) ARMENIAN COMMA → APOSTROPHE   # →ˋ→→`→→‘→
+FF07 ; 0027 ;  SL      #* ( ' → ' ) FULLWIDTH APOSTROPHE → APOSTROPHE    # →’→
+2018 ; 0027 ;  SL      #* ( ‘ → ' ) LEFT SINGLE QUOTATION MARK → APOSTROPHE      # 
+2019 ; 0027 ;  SL      #* ( ’ → ' ) RIGHT SINGLE QUOTATION MARK → APOSTROPHE     # 
+201B ; 0027 ;  SL      #* ( ‛ → ' ) SINGLE HIGH-REVERSED-9 QUOTATION MARK → APOSTROPHE   # →′→
+2032 ; 0027 ;  SL      #* ( ′ → ' ) PRIME → APOSTROPHE   # 
+2035 ; 0027 ;  SL      #* ( ‵ → ' ) REVERSED PRIME → APOSTROPHE  # →ʽ→→‘→
+055A ; 0027 ;  SL      #* ( ՚ → ' ) ARMENIAN APOSTROPHE → APOSTROPHE      # →’→
+05F3 ; 0027 ;  SL      #* ( ‎׳‎ → ' ) HEBREW PUNCTUATION GERESH → APOSTROPHE  # 
+02B9 ; 0027 ;  SL      # ( ʹ → ' ) MODIFIER LETTER PRIME → APOSTROPHE     # 
+0374 ; 0027 ;  SL      # ( ʹ → ' ) GREEK NUMERAL SIGN → APOSTROPHE        # →′→
+02CA ; 0027 ;  SL      # ( ˊ → ' ) MODIFIER LETTER ACUTE ACCENT → APOSTROPHE      # →ʹ→→′→
+02CB ; 0027 ;  SL      # ( ˋ → ' ) MODIFIER LETTER GRAVE ACCENT → APOSTROPHE      # →`→→‘→
+02F4 ; 0027 ;  SL      #* ( ˴ → ' ) MODIFIER LETTER MIDDLE GRAVE ACCENT → APOSTROPHE      # →ˋ→→`→→‘→
+02BB ; 0027 ;  SL      # ( ʻ → ' ) MODIFIER LETTER TURNED COMMA → APOSTROPHE      # →‘→
+02BD ; 0027 ;  SL      # ( ʽ → ' ) MODIFIER LETTER REVERSED COMMA → APOSTROPHE    # →‘→
+02BC ; 0027 ;  SL      # ( ʼ → ' ) MODIFIER LETTER APOSTROPHE → APOSTROPHE        # →′→
+02BE ; 0027 ;  SL      # ( ʾ → ' ) MODIFIER LETTER RIGHT HALF RING → APOSTROPHE   # →ʼ→→′→
+A78C ; 0027 ;  SL      # ( ꞌ → ' ) LATIN SMALL LETTER SALTILLO → APOSTROPHE      # 
+05D9 ; 0027 ;  SL      # ( ‎י‎ → ' ) HEBREW LETTER YOD → APOSTROPHE   # 
+07F4 ; 0027 ;  SL      # ( ‎ߴ‎ → ' ) NKO HIGH TONE APOSTROPHE → APOSTROPHE    # →’→
+07F5 ; 0027 ;  SL      # ( ‎ߵ‎ → ' ) NKO LOW TONE APOSTROPHE → APOSTROPHE     # →‘→
+
+02DD ; 0027 0027 ;     SL      #* ( ˝ → '' ) DOUBLE ACUTE ACCENT → APOSTROPHE, APOSTROPHE # →"→
+0022 ; 0027 0027 ;     SL      #* ( " → '' ) QUOTATION MARK → APOSTROPHE, APOSTROPHE       # 
+FF02 ; 0027 0027 ;     SL      #* ( " → '' ) FULLWIDTH QUOTATION MARK → APOSTROPHE, APOSTROPHE   # →”→→"→
+201C ; 0027 0027 ;     SL      #* ( “ → '' ) LEFT DOUBLE QUOTATION MARK → APOSTROPHE, APOSTROPHE # →"→
+201D ; 0027 0027 ;     SL      #* ( ” → '' ) RIGHT DOUBLE QUOTATION MARK → APOSTROPHE, APOSTROPHE        # →"→
+201F ; 0027 0027 ;     SL      #* ( ‟ → '' ) DOUBLE HIGH-REVERSED-9 QUOTATION MARK → APOSTROPHE, APOSTROPHE      # →”→→"→
+2033 ; 0027 0027 ;     SL      #* ( ″ → '' ) DOUBLE PRIME → APOSTROPHE, APOSTROPHE       # →"→
+2036 ; 0027 0027 ;     SL      #* ( ‶ → '' ) REVERSED DOUBLE PRIME → APOSTROPHE, APOSTROPHE      # →‵‵→
+3003 ; 0027 0027 ;     SL      #* ( 〃 → '' ) DITTO MARK → APOSTROPHE, APOSTROPHE # →″→→"→
+05F4 ; 0027 0027 ;     SL      #* ( ‎״‎ → '' ) HEBREW PUNCTUATION GERSHAYIM → APOSTROPHE, APOSTROPHE  # →"→
+02BA ; 0027 0027 ;     SL      # ( ʺ → '' ) MODIFIER LETTER DOUBLE PRIME → APOSTROPHE, APOSTROPHE # →"→
+02F6 ; 0027 0027 ;     SL      #* ( ˶ → '' ) MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT → APOSTROPHE, APOSTROPHE  # →˝→→"→
+02EE ; 0027 0027 ;     SL      # ( ˮ → '' ) MODIFIER LETTER DOUBLE APOSTROPHE → APOSTROPHE, APOSTROPHE    # →″→→"→
+05F2 ; 0027 0027 ;     SL      # ( ‎ײ‎ → '' ) HEBREW LIGATURE YIDDISH DOUBLE YOD → APOSTROPHE, APOSTROPHE     # →‎יי‎→
+
+2034 ; 0027 0027 0027 ;        SL      #* ( ‴ → ''' ) TRIPLE PRIME → APOSTROPHE, APOSTROPHE, APOSTROPHE  # →′′′→
+2037 ; 0027 0027 0027 ;        SL      #* ( ‷ → ''' ) REVERSED TRIPLE PRIME → APOSTROPHE, APOSTROPHE, APOSTROPHE # →‵‵‵→
+
+2057 ; 0027 0027 0027 0027 ;   SL      #* ( ⁗ → '''' ) QUADRUPLE PRIME → APOSTROPHE, APOSTROPHE, APOSTROPHE, APOSTROPHE  # →′′′′→
+
+FF3B ; 0028 ;  SL      #* ( [ → ( ) FULLWIDTH LEFT SQUARE BRACKET → LEFT PARENTHESIS     # →〔→
+3014 ; 0028 ;  SL      #* ( 〔 → ( ) LEFT TORTOISE SHELL BRACKET → LEFT PARENTHESIS       # 
+FD3E ; 0028 ;  SL      #* ( ﴾ → ( ) ORNATE LEFT PARENTHESIS → LEFT PARENTHESIS   # 
+2768 ; 0028 ;  SL      #* ( ❨ → ( ) MEDIUM LEFT PARENTHESIS ORNAMENT → LEFT PARENTHESIS  # 
+2772 ; 0028 ;  SL      #* ( ❲ → ( ) LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT → LEFT PARENTHESIS        # →〔→
+
+3220 ; 0028 30FC 0029 ;        SL      #* ( ㈠ → (ー) ) PARENTHESIZED IDEOGRAPH ONE → LEFT PARENTHESIS, KATAKANA-HIRAGANA PROLONGED SOUND MARK, RIGHT PARENTHESIS        # →(一)→
+
+247D ; 0028 0031 0030 0029 ;   SL      #* ( ⑽ → (10) ) PARENTHESIZED NUMBER TEN → LEFT PARENTHESIS, DIGIT ONE, DIGIT ZERO, RIGHT PARENTHESIS     # 
+
+2475 ; 0028 0032 0029 ;        SL      #* ( ⑵ → (2) ) PARENTHESIZED DIGIT TWO → LEFT PARENTHESIS, DIGIT TWO, RIGHT PARENTHESIS   # 
+
+2487 ; 0028 0032 0030 0029 ;   SL      #* ( ⒇ → (20) ) PARENTHESIZED NUMBER TWENTY → LEFT PARENTHESIS, DIGIT TWO, DIGIT ZERO, RIGHT PARENTHESIS  # 
+
+2476 ; 0028 0033 0029 ;        SL      #* ( ⑶ → (3) ) PARENTHESIZED DIGIT THREE → LEFT PARENTHESIS, DIGIT THREE, RIGHT PARENTHESIS       # 
+
+2477 ; 0028 0034 0029 ;        SL      #* ( ⑷ → (4) ) PARENTHESIZED DIGIT FOUR → LEFT PARENTHESIS, DIGIT FOUR, RIGHT PARENTHESIS # 
+
+2478 ; 0028 0035 0029 ;        SL      #* ( ⑸ → (5) ) PARENTHESIZED DIGIT FIVE → LEFT PARENTHESIS, DIGIT FIVE, RIGHT PARENTHESIS # 
+
+2479 ; 0028 0036 0029 ;        SL      #* ( ⑹ → (6) ) PARENTHESIZED DIGIT SIX → LEFT PARENTHESIS, DIGIT SIX, RIGHT PARENTHESIS   # 
+
+247A ; 0028 0037 0029 ;        SL      #* ( ⑺ → (7) ) PARENTHESIZED DIGIT SEVEN → LEFT PARENTHESIS, DIGIT SEVEN, RIGHT PARENTHESIS       # 
+
+247B ; 0028 0038 0029 ;        SL      #* ( ⑻ → (8) ) PARENTHESIZED DIGIT EIGHT → LEFT PARENTHESIS, DIGIT EIGHT, RIGHT PARENTHESIS       # 
+
+247C ; 0028 0039 0029 ;        SL      #* ( ⑼ → (9) ) PARENTHESIZED DIGIT NINE → LEFT PARENTHESIS, DIGIT NINE, RIGHT PARENTHESIS # 
+
+249C ; 0028 0061 0029 ;        SL      #* ( ⒜ → (a) ) PARENTHESIZED LATIN SMALL LETTER A → LEFT PARENTHESIS, LATIN SMALL LETTER A, RIGHT PARENTHESIS     # 
+
+249D ; 0028 0062 0029 ;        SL      #* ( ⒝ → (b) ) PARENTHESIZED LATIN SMALL LETTER B → LEFT PARENTHESIS, LATIN SMALL LETTER B, RIGHT PARENTHESIS     # 
+
+249E ; 0028 0063 0029 ;        SL      #* ( ⒞ → (c) ) PARENTHESIZED LATIN SMALL LETTER C → LEFT PARENTHESIS, LATIN SMALL LETTER C, RIGHT PARENTHESIS     # 
+
+249F ; 0028 0064 0029 ;        SL      #* ( ⒟ → (d) ) PARENTHESIZED LATIN SMALL LETTER D → LEFT PARENTHESIS, LATIN SMALL LETTER D, RIGHT PARENTHESIS     # 
+
+24A0 ; 0028 0065 0029 ;        SL      #* ( ⒠ → (e) ) PARENTHESIZED LATIN SMALL LETTER E → LEFT PARENTHESIS, LATIN SMALL LETTER E, RIGHT PARENTHESIS     # 
+
+24A1 ; 0028 0066 0029 ;        SL      #* ( ⒡ → (f) ) PARENTHESIZED LATIN SMALL LETTER F → LEFT PARENTHESIS, LATIN SMALL LETTER F, RIGHT PARENTHESIS     # 
+
+24A2 ; 0028 0067 0029 ;        SL      #* ( ⒢ → (g) ) PARENTHESIZED LATIN SMALL LETTER G → LEFT PARENTHESIS, LATIN SMALL LETTER G, RIGHT PARENTHESIS     # 
+
+24A3 ; 0028 0068 0029 ;        SL      #* ( ⒣ → (h) ) PARENTHESIZED LATIN SMALL LETTER H → LEFT PARENTHESIS, LATIN SMALL LETTER H, RIGHT PARENTHESIS     # 
+
+24A4 ; 0028 0069 0029 ;        SL      #* ( ⒤ → (i) ) PARENTHESIZED LATIN SMALL LETTER I → LEFT PARENTHESIS, LATIN SMALL LETTER I, RIGHT PARENTHESIS     # 
+
+24A5 ; 0028 006A 0029 ;        SL      #* ( ⒥ → (j) ) PARENTHESIZED LATIN SMALL LETTER J → LEFT PARENTHESIS, LATIN SMALL LETTER J, RIGHT PARENTHESIS     # 
+
+24A6 ; 0028 006B 0029 ;        SL      #* ( ⒦ → (k) ) PARENTHESIZED LATIN SMALL LETTER K → LEFT PARENTHESIS, LATIN SMALL LETTER K, RIGHT PARENTHESIS     # 
+
+2474 ; 0028 006C 0029 ;        SL      #* ( ⑴ → (l) ) PARENTHESIZED DIGIT ONE → LEFT PARENTHESIS, LATIN SMALL LETTER L, RIGHT PARENTHESIS        # →(1)→
+1F118 ;        0028 006C 0029 ;        SL      #* ( 🄘 → (l) ) PARENTHESIZED LATIN CAPITAL LETTER I → LEFT PARENTHESIS, LATIN SMALL LETTER L, RIGHT PARENTHESIS  # →(I)→
+24A7 ; 0028 006C 0029 ;        SL      #* ( ⒧ → (l) ) PARENTHESIZED LATIN SMALL LETTER L → LEFT PARENTHESIS, LATIN SMALL LETTER L, RIGHT PARENTHESIS     # 
+
+247F ; 0028 006C 0032 0029 ;   SL      #* ( ⑿ → (l2) ) PARENTHESIZED NUMBER TWELVE → LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT TWO, RIGHT PARENTHESIS        # →(12)→
+
+2480 ; 0028 006C 0033 0029 ;   SL      #* ( ⒀ → (l3) ) PARENTHESIZED NUMBER THIRTEEN → LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT THREE, RIGHT PARENTHESIS    # →(13)→
+
+2481 ; 0028 006C 0034 0029 ;   SL      #* ( ⒁ → (l4) ) PARENTHESIZED NUMBER FOURTEEN → LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT FOUR, RIGHT PARENTHESIS     # →(14)→
+
+2482 ; 0028 006C 0035 0029 ;   SL      #* ( ⒂ → (l5) ) PARENTHESIZED NUMBER FIFTEEN → LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT FIVE, RIGHT PARENTHESIS      # →(15)→
+
+2483 ; 0028 006C 0036 0029 ;   SL      #* ( ⒃ → (l6) ) PARENTHESIZED NUMBER SIXTEEN → LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT SIX, RIGHT PARENTHESIS       # →(16)→
+
+2484 ; 0028 006C 0037 0029 ;   SL      #* ( ⒄ → (l7) ) PARENTHESIZED NUMBER SEVENTEEN → LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT SEVEN, RIGHT PARENTHESIS   # →(17)→
+
+2485 ; 0028 006C 0038 0029 ;   SL      #* ( ⒅ → (l8) ) PARENTHESIZED NUMBER EIGHTEEN → LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT EIGHT, RIGHT PARENTHESIS    # →(18)→
+
+2486 ; 0028 006C 0039 0029 ;   SL      #* ( ⒆ → (l9) ) PARENTHESIZED NUMBER NINETEEN → LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT NINE, RIGHT PARENTHESIS     # →(19)→
+
+247E ; 0028 006C 006C 0029 ;   SL      #* ( ⑾ → (ll) ) PARENTHESIZED NUMBER ELEVEN → LEFT PARENTHESIS, LATIN SMALL LETTER L, LATIN SMALL LETTER L, RIGHT PARENTHESIS     # →(11)→
+
+24A9 ; 0028 006E 0029 ;        SL      #* ( ⒩ → (n) ) PARENTHESIZED LATIN SMALL LETTER N → LEFT PARENTHESIS, LATIN SMALL LETTER N, RIGHT PARENTHESIS     # 
+
+24AA ; 0028 006F 0029 ;        SL      #* ( ⒪ → (o) ) PARENTHESIZED LATIN SMALL LETTER O → LEFT PARENTHESIS, LATIN SMALL LETTER O, RIGHT PARENTHESIS     # 
+
+24AB ; 0028 0070 0029 ;        SL      #* ( ⒫ → (p) ) PARENTHESIZED LATIN SMALL LETTER P → LEFT PARENTHESIS, LATIN SMALL LETTER P, RIGHT PARENTHESIS     # 
+
+24AC ; 0028 0071 0029 ;        SL      #* ( ⒬ → (q) ) PARENTHESIZED LATIN SMALL LETTER Q → LEFT PARENTHESIS, LATIN SMALL LETTER Q, RIGHT PARENTHESIS     # 
+
+24AD ; 0028 0072 0029 ;        SL      #* ( ⒭ → (r) ) PARENTHESIZED LATIN SMALL LETTER R → LEFT PARENTHESIS, LATIN SMALL LETTER R, RIGHT PARENTHESIS     # 
+
+24A8 ; 0028 0072 006E 0029 ;   SL      #* ( ⒨ → (rn) ) PARENTHESIZED LATIN SMALL LETTER M → LEFT PARENTHESIS, LATIN SMALL LETTER R, LATIN SMALL LETTER N, RIGHT PARENTHESIS      # →(m)→
+
+24AE ; 0028 0073 0029 ;        SL      #* ( ⒮ → (s) ) PARENTHESIZED LATIN SMALL LETTER S → LEFT PARENTHESIS, LATIN SMALL LETTER S, RIGHT PARENTHESIS     # 
+
+1F12A ;        1F122 ; SL      #* ( 🄪 → 🄢 ) TORTOISE SHELL BRACKETED LATIN CAPITAL LETTER S → PARENTHESIZED LATIN CAPITAL LETTER S   # →〔S〕→→(S)→
+
+24AF ; 0028 0074 0029 ;        SL      #* ( ⒯ → (t) ) PARENTHESIZED LATIN SMALL LETTER T → LEFT PARENTHESIS, LATIN SMALL LETTER T, RIGHT PARENTHESIS     # 
+
+24B0 ; 0028 0075 0029 ;        SL      #* ( ⒰ → (u) ) PARENTHESIZED LATIN SMALL LETTER U → LEFT PARENTHESIS, LATIN SMALL LETTER U, RIGHT PARENTHESIS     # 
+
+24B1 ; 0028 0076 0029 ;        SL      #* ( ⒱ → (v) ) PARENTHESIZED LATIN SMALL LETTER V → LEFT PARENTHESIS, LATIN SMALL LETTER V, RIGHT PARENTHESIS     # 
+
+24B2 ; 0028 0076 0076 0029 ;   SL      #* ( ⒲ → (vv) ) PARENTHESIZED LATIN SMALL LETTER W → LEFT PARENTHESIS, LATIN SMALL LETTER V, LATIN SMALL LETTER V, RIGHT PARENTHESIS      # →(w)→
+
+24B3 ; 0028 0078 0029 ;        SL      #* ( ⒳ → (x) ) PARENTHESIZED LATIN SMALL LETTER X → LEFT PARENTHESIS, LATIN SMALL LETTER X, RIGHT PARENTHESIS     # 
+
+24B4 ; 0028 0079 0029 ;        SL      #* ( ⒴ → (y) ) PARENTHESIZED LATIN SMALL LETTER Y → LEFT PARENTHESIS, LATIN SMALL LETTER Y, RIGHT PARENTHESIS     # 
+
+24B5 ; 0028 007A 0029 ;        SL      #* ( ⒵ → (z) ) PARENTHESIZED LATIN SMALL LETTER Z → LEFT PARENTHESIS, LATIN SMALL LETTER Z, RIGHT PARENTHESIS     # 
+
+3200 ; 0028 1100 0029 ;        SL      #* ( ㈀ → (ᄀ) ) PARENTHESIZED HANGUL KIYEOK → LEFT PARENTHESIS, HANGUL CHOSEONG KIYEOK, RIGHT PARENTHESIS        # 
+
+320E ; 0028 AC00 0029 ;        SL      #* ( ㈎ → (가) ) PARENTHESIZED HANGUL KIYEOK A → LEFT PARENTHESIS, HANGUL SYLLABLE GA, RIGHT PARENTHESIS  # 
+
+3201 ; 0028 1102 0029 ;        SL      #* ( ㈁ → (ᄂ) ) PARENTHESIZED HANGUL NIEUN → LEFT PARENTHESIS, HANGUL CHOSEONG NIEUN, RIGHT PARENTHESIS  # 
+
+320F ; 0028 B098 0029 ;        SL      #* ( ㈏ → (나) ) PARENTHESIZED HANGUL NIEUN A → LEFT PARENTHESIS, HANGUL SYLLABLE NA, RIGHT PARENTHESIS   # 
+
+3202 ; 0028 1103 0029 ;        SL      #* ( ㈂ → (ᄃ) ) PARENTHESIZED HANGUL TIKEUT → LEFT PARENTHESIS, HANGUL CHOSEONG TIKEUT, RIGHT PARENTHESIS        # 
+
+3210 ; 0028 B2E4 0029 ;        SL      #* ( ㈐ → (다) ) PARENTHESIZED HANGUL TIKEUT A → LEFT PARENTHESIS, HANGUL SYLLABLE DA, RIGHT PARENTHESIS  # 
+
+3203 ; 0028 1105 0029 ;        SL      #* ( ㈃ → (ᄅ) ) PARENTHESIZED HANGUL RIEUL → LEFT PARENTHESIS, HANGUL CHOSEONG RIEUL, RIGHT PARENTHESIS  # 
+
+3211 ; 0028 B77C 0029 ;        SL      #* ( ㈑ → (라) ) PARENTHESIZED HANGUL RIEUL A → LEFT PARENTHESIS, HANGUL SYLLABLE RA, RIGHT PARENTHESIS   # 
+
+3204 ; 0028 1106 0029 ;        SL      #* ( ㈄ → (ᄆ) ) PARENTHESIZED HANGUL MIEUM → LEFT PARENTHESIS, HANGUL CHOSEONG MIEUM, RIGHT PARENTHESIS  # 
+
+3212 ; 0028 B9C8 0029 ;        SL      #* ( ㈒ → (마) ) PARENTHESIZED HANGUL MIEUM A → LEFT PARENTHESIS, HANGUL SYLLABLE MA, RIGHT PARENTHESIS   # 
+
+3205 ; 0028 1107 0029 ;        SL      #* ( ㈅ → (ᄇ) ) PARENTHESIZED HANGUL PIEUP → LEFT PARENTHESIS, HANGUL CHOSEONG PIEUP, RIGHT PARENTHESIS  # 
+
+3213 ; 0028 BC14 0029 ;        SL      #* ( ㈓ → (바) ) PARENTHESIZED HANGUL PIEUP A → LEFT PARENTHESIS, HANGUL SYLLABLE BA, RIGHT PARENTHESIS   # 
+
+3206 ; 0028 1109 0029 ;        SL      #* ( ㈆ → (ᄉ) ) PARENTHESIZED HANGUL SIOS → LEFT PARENTHESIS, HANGUL CHOSEONG SIOS, RIGHT PARENTHESIS    # 
+
+3214 ; 0028 C0AC 0029 ;        SL      #* ( ㈔ → (사) ) PARENTHESIZED HANGUL SIOS A → LEFT PARENTHESIS, HANGUL SYLLABLE SA, RIGHT PARENTHESIS    # 
+
+3207 ; 0028 110B 0029 ;        SL      #* ( ㈇ → (ᄋ) ) PARENTHESIZED HANGUL IEUNG → LEFT PARENTHESIS, HANGUL CHOSEONG IEUNG, RIGHT PARENTHESIS  # 
+
+3215 ; 0028 C544 0029 ;        SL      #* ( ㈕ → (아) ) PARENTHESIZED HANGUL IEUNG A → LEFT PARENTHESIS, HANGUL SYLLABLE A, RIGHT PARENTHESIS    # 
+
+321D ; 0028 C624 C804 0029 ;   SL      #* ( ㈝ → (오전) ) PARENTHESIZED KOREAN CHARACTER OJEON → LEFT PARENTHESIS, HANGUL SYLLABLE O, HANGUL SYLLABLE JEON, RIGHT PARENTHESIS   # 
+
+321E ; 0028 C624 D6C4 0029 ;   SL      #* ( ㈞ → (오후) ) PARENTHESIZED KOREAN CHARACTER O HU → LEFT PARENTHESIS, HANGUL SYLLABLE O, HANGUL SYLLABLE HU, RIGHT PARENTHESIS      # 
+
+3208 ; 0028 110C 0029 ;        SL      #* ( ㈈ → (ᄌ) ) PARENTHESIZED HANGUL CIEUC → LEFT PARENTHESIS, HANGUL CHOSEONG CIEUC, RIGHT PARENTHESIS  # 
+
+3216 ; 0028 C790 0029 ;        SL      #* ( ㈖ → (자) ) PARENTHESIZED HANGUL CIEUC A → LEFT PARENTHESIS, HANGUL SYLLABLE JA, RIGHT PARENTHESIS   # 
+
+321C ; 0028 C8FC 0029 ;        SL      #* ( ㈜ → (주) ) PARENTHESIZED HANGUL CIEUC U → LEFT PARENTHESIS, HANGUL SYLLABLE JU, RIGHT PARENTHESIS   # 
+
+3209 ; 0028 110E 0029 ;        SL      #* ( ㈉ → (ᄎ) ) PARENTHESIZED HANGUL CHIEUCH → LEFT PARENTHESIS, HANGUL CHOSEONG CHIEUCH, RIGHT PARENTHESIS      # 
+
+3217 ; 0028 CC28 0029 ;        SL      #* ( ㈗ → (차) ) PARENTHESIZED HANGUL CHIEUCH A → LEFT PARENTHESIS, HANGUL SYLLABLE CA, RIGHT PARENTHESIS # 
+
+320A ; 0028 110F 0029 ;        SL      #* ( ㈊ → (ᄏ) ) PARENTHESIZED HANGUL KHIEUKH → LEFT PARENTHESIS, HANGUL CHOSEONG KHIEUKH, RIGHT PARENTHESIS      # 
+
+3218 ; 0028 CE74 0029 ;        SL      #* ( ㈘ → (카) ) PARENTHESIZED HANGUL KHIEUKH A → LEFT PARENTHESIS, HANGUL SYLLABLE KA, RIGHT PARENTHESIS # 
+
+320B ; 0028 1110 0029 ;        SL      #* ( ㈋ → (ᄐ) ) PARENTHESIZED HANGUL THIEUTH → LEFT PARENTHESIS, HANGUL CHOSEONG THIEUTH, RIGHT PARENTHESIS      # 
+
+3219 ; 0028 D0C0 0029 ;        SL      #* ( ㈙ → (타) ) PARENTHESIZED HANGUL THIEUTH A → LEFT PARENTHESIS, HANGUL SYLLABLE TA, RIGHT PARENTHESIS # 
+
+320C ; 0028 1111 0029 ;        SL      #* ( ㈌ → (ᄑ) ) PARENTHESIZED HANGUL PHIEUPH → LEFT PARENTHESIS, HANGUL CHOSEONG PHIEUPH, RIGHT PARENTHESIS      # 
+
+321A ; 0028 D30C 0029 ;        SL      #* ( ㈚ → (파) ) PARENTHESIZED HANGUL PHIEUPH A → LEFT PARENTHESIS, HANGUL SYLLABLE PA, RIGHT PARENTHESIS # 
+
+320D ; 0028 1112 0029 ;        SL      #* ( ㈍ → (ᄒ) ) PARENTHESIZED HANGUL HIEUH → LEFT PARENTHESIS, HANGUL CHOSEONG HIEUH, RIGHT PARENTHESIS  # 
+
+321B ; 0028 D558 0029 ;        SL      #* ( ㈛ → (하) ) PARENTHESIZED HANGUL HIEUH A → LEFT PARENTHESIS, HANGUL SYLLABLE HA, RIGHT PARENTHESIS   # 
+
+3226 ; 0028 4E03 0029 ;        SL      #* ( ㈦ → (七) ) PARENTHESIZED IDEOGRAPH SEVEN → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4E03, RIGHT PARENTHESIS  # 
+
+3222 ; 0028 4E09 0029 ;        SL      #* ( ㈢ → (三) ) PARENTHESIZED IDEOGRAPH THREE → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4E09, RIGHT PARENTHESIS  # 
+1F241 ;        0028 4E09 0029 ;        SL      #* ( 🉁 → (三) ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E09 → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4E09, RIGHT PARENTHESIS   # →〔三〕→
+
+3228 ; 0028 4E5D 0029 ;        SL      #* ( ㈨ → (九) ) PARENTHESIZED IDEOGRAPH NINE → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4E5D, RIGHT PARENTHESIS   # 
+
+3221 ; 0028 4E8C 0029 ;        SL      #* ( ㈡ → (二) ) PARENTHESIZED IDEOGRAPH TWO → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4E8C, RIGHT PARENTHESIS    # 
+1F242 ;        0028 4E8C 0029 ;        SL      #* ( 🉂 → (二) ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E8C → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4E8C, RIGHT PARENTHESIS   # →〔二〕→
+
+3224 ; 0028 4E94 0029 ;        SL      #* ( ㈤ → (五) ) PARENTHESIZED IDEOGRAPH FIVE → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4E94, RIGHT PARENTHESIS   # 
+
+3239 ; 0028 4EE3 0029 ;        SL      #* ( ㈹ → (代) ) PARENTHESIZED IDEOGRAPH REPRESENT → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4EE3, RIGHT PARENTHESIS      # 
+
+323D ; 0028 4F01 0029 ;        SL      #* ( ㈽ → (企) ) PARENTHESIZED IDEOGRAPH ENTERPRISE → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4F01, RIGHT PARENTHESIS     # 
+
+3241 ; 0028 4F11 0029 ;        SL      #* ( ㉁ → (休) ) PARENTHESIZED IDEOGRAPH REST → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4F11, RIGHT PARENTHESIS   # 
+
+3227 ; 0028 516B 0029 ;        SL      #* ( ㈧ → (八) ) PARENTHESIZED IDEOGRAPH EIGHT → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-516B, RIGHT PARENTHESIS  # 
+
+3225 ; 0028 516D 0029 ;        SL      #* ( ㈥ → (六) ) PARENTHESIZED IDEOGRAPH SIX → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-516D, RIGHT PARENTHESIS    # 
+
+3238 ; 0028 52B4 0029 ;        SL      #* ( ㈸ → (労) ) PARENTHESIZED IDEOGRAPH LABOR → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-52B4, RIGHT PARENTHESIS  # 
+
+1F247 ;        0028 52DD 0029 ;        SL      #* ( 🉇 → (勝) ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-52DD → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-52DD, RIGHT PARENTHESIS   # →〔勝〕→
+
+3229 ; 0028 5341 0029 ;        SL      #* ( ㈩ → (十) ) PARENTHESIZED IDEOGRAPH TEN → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-5341, RIGHT PARENTHESIS    # 
+
+323F ; 0028 5354 0029 ;        SL      #* ( ㈿ → (協) ) PARENTHESIZED IDEOGRAPH ALLIANCE → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-5354, RIGHT PARENTHESIS       # 
+
+3234 ; 0028 540D 0029 ;        SL      #* ( ㈴ → (名) ) PARENTHESIZED IDEOGRAPH NAME → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-540D, RIGHT PARENTHESIS   # 
+
+323A ; 0028 547C 0029 ;        SL      #* ( ㈺ → (呼) ) PARENTHESIZED IDEOGRAPH CALL → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-547C, RIGHT PARENTHESIS   # 
+
+3223 ; 0028 56DB 0029 ;        SL      #* ( ㈣ → (四) ) PARENTHESIZED IDEOGRAPH FOUR → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-56DB, RIGHT PARENTHESIS   # 
+
+322F ; 0028 571F 0029 ;        SL      #* ( ㈯ → (土) ) PARENTHESIZED IDEOGRAPH EARTH → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-571F, RIGHT PARENTHESIS  # 
+
+323B ; 0028 5B66 0029 ;        SL      #* ( ㈻ → (学) ) PARENTHESIZED IDEOGRAPH STUDY → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-5B66, RIGHT PARENTHESIS  # 
+
+1F243 ;        0028 5B89 0029 ;        SL      #* ( 🉃 → (安) ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-5B89 → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-5B89, RIGHT PARENTHESIS   # →〔安〕→
+
+1F245 ;        0028 6253 0029 ;        SL      #* ( 🉅 → (打) ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6253 → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-6253, RIGHT PARENTHESIS   # →〔打〕→
+
+1F248 ;        0028 6557 0029 ;        SL      #* ( 🉈 → (敗) ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557 → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-6557, RIGHT PARENTHESIS   # →〔敗〕→
+
+3230 ; 0028 65E5 0029 ;        SL      #* ( ㈰ → (日) ) PARENTHESIZED IDEOGRAPH SUN → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-65E5, RIGHT PARENTHESIS    # 
+
+322A ; 0028 6708 0029 ;        SL      #* ( ㈪ → (月) ) PARENTHESIZED IDEOGRAPH MOON → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-6708, RIGHT PARENTHESIS   # 
+
+3232 ; 0028 6709 0029 ;        SL      #* ( ㈲ → (有) ) PARENTHESIZED IDEOGRAPH HAVE → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-6709, RIGHT PARENTHESIS   # 
+
+322D ; 0028 6728 0029 ;        SL      #* ( ㈭ → (木) ) PARENTHESIZED IDEOGRAPH WOOD → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-6728, RIGHT PARENTHESIS   # 
+
+1F240 ;        0028 672C 0029 ;        SL      #* ( 🉀 → (本) ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-672C, RIGHT PARENTHESIS   # →〔本〕→
+
+3231 ; 0028 682A 0029 ;        SL      #* ( ㈱ → (株) ) PARENTHESIZED IDEOGRAPH STOCK → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-682A, RIGHT PARENTHESIS  # 
+
+322C ; 0028 6C34 0029 ;        SL      #* ( ㈬ → (水) ) PARENTHESIZED IDEOGRAPH WATER → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-6C34, RIGHT PARENTHESIS  # 
+
+322B ; 0028 706B 0029 ;        SL      #* ( ㈫ → (火) ) PARENTHESIZED IDEOGRAPH FIRE → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-706B, RIGHT PARENTHESIS   # 
+
+1F244 ;        0028 70B9 0029 ;        SL      #* ( 🉄 → (点) ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-70B9 → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-70B9, RIGHT PARENTHESIS   # →〔点〕→
+
+3235 ; 0028 7279 0029 ;        SL      #* ( ㈵ → (特) ) PARENTHESIZED IDEOGRAPH SPECIAL → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-7279, RIGHT PARENTHESIS        # 
+
+1F246 ;        0028 76D7 0029 ;        SL      #* ( 🉆 → (盗) ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-76D7 → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-76D7, RIGHT PARENTHESIS   # →〔盗〕→
+
+323C ; 0028 76E3 0029 ;        SL      #* ( ㈼ → (監) ) PARENTHESIZED IDEOGRAPH SUPERVISE → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-76E3, RIGHT PARENTHESIS      # 
+
+3233 ; 0028 793E 0029 ;        SL      #* ( ㈳ → (社) ) PARENTHESIZED IDEOGRAPH SOCIETY → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-793E, RIGHT PARENTHESIS        # 
+
+3237 ; 0028 795D 0029 ;        SL      #* ( ㈷ → (祝) ) PARENTHESIZED IDEOGRAPH CONGRATULATION → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-795D, RIGHT PARENTHESIS # 
+
+3240 ; 0028 796D 0029 ;        SL      #* ( ㉀ → (祭) ) PARENTHESIZED IDEOGRAPH FESTIVAL → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-796D, RIGHT PARENTHESIS       # 
+
+3242 ; 0028 81EA 0029 ;        SL      #* ( ㉂ → (自) ) PARENTHESIZED IDEOGRAPH SELF → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-81EA, RIGHT PARENTHESIS   # 
+
+3243 ; 0028 81F3 0029 ;        SL      #* ( ㉃ → (至) ) PARENTHESIZED IDEOGRAPH REACH → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-81F3, RIGHT PARENTHESIS  # 
+
+3236 ; 0028 8CA1 0029 ;        SL      #* ( ㈶ → (財) ) PARENTHESIZED IDEOGRAPH FINANCIAL → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-8CA1, RIGHT PARENTHESIS      # 
+
+323E ; 0028 8CC7 0029 ;        SL      #* ( ㈾ → (資) ) PARENTHESIZED IDEOGRAPH RESOURCE → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-8CC7, RIGHT PARENTHESIS       # 
+
+322E ; 0028 91D1 0029 ;        SL      #* ( ㈮ → (金) ) PARENTHESIZED IDEOGRAPH METAL → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-91D1, RIGHT PARENTHESIS  # 
+
+FF3D ; 0029 ;  SL      #* ( ] → ) ) FULLWIDTH RIGHT SQUARE BRACKET → RIGHT PARENTHESIS   # →〕→
+3015 ; 0029 ;  SL      #* ( 〕 → ) ) RIGHT TORTOISE SHELL BRACKET → RIGHT PARENTHESIS     # 
+FD3F ; 0029 ;  SL      #* ( ﴿ → ) ) ORNATE RIGHT PARENTHESIS → RIGHT PARENTHESIS # 
+2769 ; 0029 ;  SL      #* ( ❩ → ) ) MEDIUM RIGHT PARENTHESIS ORNAMENT → RIGHT PARENTHESIS        # 
+2773 ; 0029 ;  SL      #* ( ❳ → ) ) LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT → RIGHT PARENTHESIS      # →〕→
+
+2774 ; 007B ;  SL      #* ( ❴ → { ) MEDIUM LEFT CURLY BRACKET ORNAMENT → LEFT CURLY BRACKET      # 
+
+2775 ; 007D ;  SL      #* ( ❵ → } ) MEDIUM RIGHT CURLY BRACKET ORNAMENT → RIGHT CURLY BRACKET    # 
+
+FF3E ; FE3F ;  SL      #* ( ^ → ︿ ) FULLWIDTH CIRCUMFLEX ACCENT → PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET    # 
+
+204E ; 002A ;  SL      #* ( ⁎ → * ) LOW ASTERISK → ASTERISK      # 
+066D ; 002A ;  SL      #* ( ‎٭‎ → * ) ARABIC FIVE POINTED STAR → ASTERISK     # 
+2217 ; 002A ;  SL      #* ( ∗ → * ) ASTERISK OPERATOR → ASTERISK # 
+
+1735 ; 002F ;  SL      #* ( ᜵ → / ) PHILIPPINE SINGLE PUNCTUATION → SOLIDUS      # 
+2044 ; 002F ;  SL      #* ( ⁄ → / ) FRACTION SLASH → SOLIDUS     # 
+2041 ; 002F ;  SL      #* ( ⁁ → / ) CARET INSERTION POINT → SOLIDUS      # 
+2215 ; 002F ;  SL      #* ( ∕ → / ) DIVISION SLASH → SOLIDUS     # 
+2571 ; 002F ;  SL      #* ( ╱ → / ) BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT → SOLIDUS      # 
+29F8 ; 002F ;  SL      #* ( ⧸ → / ) BIG SOLIDUS → SOLIDUS        # 
+31D3 ; 002F ;  SL      #* ( ㇓ → / ) CJK STROKE SP → SOLIDUS      # →⼃→
+3033 ; 002F ;  SL      # ( 〳 → / ) VERTICAL KANA REPEAT MARK UPPER HALF → SOLIDUS        # 
+4E3F ; 002F ;  SL      # ( 丿 → / ) CJK UNIFIED IDEOGRAPH-4E3F → SOLIDUS  # →⼃→
+2F03 ; 002F ;  SL      #* ( ⼃ → / ) KANGXI RADICAL SLASH → SOLIDUS       # 
+
+29F6 ; 002F 0304 ;     SL      #* ( ⧶ → /̄ ) SOLIDUS WITH OVERBAR → SOLIDUS, COMBINING MACRON   # 
+
+2AFD ; 002F 002F ;     SL      #* ( ⫽ → // ) DOUBLE SOLIDUS OPERATOR → SOLIDUS, SOLIDUS  # 
+
+2AFB ; 002F 002F 002F ;        SL      #* ( ⫻ → /// ) TRIPLE SOLIDUS BINARY RELATION → SOLIDUS, SOLIDUS, SOLIDUS # 
+
+FF3C ; 005C ;  SL      #* ( \ → \ ) FULLWIDTH REVERSE SOLIDUS → REVERSE SOLIDUS  # →∖→
+FE68 ; 005C ;  SL      #* ( ﹨ → \ ) SMALL REVERSE SOLIDUS → REVERSE SOLIDUS      # →∖→
+2216 ; 005C ;  SL      #* ( ∖ → \ ) SET MINUS → REVERSE SOLIDUS  # 
+29F5 ; 005C ;  SL      #* ( ⧵ → \ ) REVERSE SOLIDUS OPERATOR → REVERSE SOLIDUS   # 
+29F9 ; 005C ;  SL      #* ( ⧹ → \ ) BIG REVERSE SOLIDUS → REVERSE SOLIDUS        # 
+31D4 ; 005C ;  SL      #* ( ㇔ → \ ) CJK STROKE D → REVERSE SOLIDUS       # →⼂→
+4E36 ; 005C ;  SL      # ( 丶 → \ ) CJK UNIFIED IDEOGRAPH-4E36 → REVERSE SOLIDUS  # →⼂→
+2F02 ; 005C ;  SL      #* ( ⼂ → \ ) KANGXI RADICAL DOT → REVERSE SOLIDUS # 
+
+2CF9 ; 005C 005C ;     SL      #* ( ⳹ → \\ ) COPTIC OLD NUBIAN FULL STOP → REVERSE SOLIDUS, REVERSE SOLIDUS      # 
+244A ; 005C 005C ;     SL      #* ( ⑊ → \\ ) OCR DOUBLE BACKSLASH → REVERSE SOLIDUS, REVERSE SOLIDUS     # 
+
+A778 ; 0026 ;  SL      # ( ꝸ → & ) LATIN SMALL LETTER UM → AMPERSAND     # 
+
+110BB ;        0970 ;  SL      #* ( 𑂻 → ॰ ) KAITHI ABBREVIATION SIGN → DEVANAGARI ABBREVIATION SIGN   # 
+26AC ; 0970 ;  SL      #* ( ⚬ → ॰ ) MEDIUM SMALL WHITE CIRCLE → DEVANAGARI ABBREVIATION SIGN   # 
+
+0F0C ; 0F0B ;  SL      #* ( ༌ → ་ ) TIBETAN MARK DELIMITER TSHEG BSTAR → TIBETAN MARK INTERSYLLABIC TSHEG      # 
+
+02D8 ; 02C7 ;  SL      #* ( ˘ → ˇ ) BREVE → CARON        # 
+A67E ; 02C7 ;  SL      #* ( ꙾ → ˇ ) CYRILLIC KAVYKA → CARON     # →˘→
+
+00AF ; 02C9 ;  SL      #* ( ¯ → ˉ ) MACRON → MODIFIER LETTER MACRON      # 
+FFE3 ; 02C9 ;  SL      #* (  ̄ → ˉ ) FULLWIDTH MACRON → MODIFIER LETTER MACRON   # →‾→
+203E ; 02C9 ;  SL      #* ( ‾ → ˉ ) OVERLINE → MODIFIER LETTER MACRON   # 
+FE49 ; 02C9 ;  SL      #* ( ﹉ → ˉ ) DASHED OVERLINE → MODIFIER LETTER MACRON    # →‾→
+FE4A ; 02C9 ;  SL      #* ( ﹊ → ˉ ) CENTRELINE OVERLINE → MODIFIER LETTER MACRON        # →‾→
+FE4B ; 02C9 ;  SL      #* ( ﹋ → ˉ ) WAVY OVERLINE → MODIFIER LETTER MACRON      # →‾→
+FE4C ; 02C9 ;  SL      #* ( ﹌ → ˉ ) DOUBLE WAVY OVERLINE → MODIFIER LETTER MACRON       # →‾→
+2594 ; 02C9 ;  SL      #* ( ▔ → ˉ ) UPPER ONE EIGHTH BLOCK → MODIFIER LETTER MACRON     # →¯→
+
+0375 ; 02CF ;  SL      #* ( ͵ → ˏ ) GREEK LOWER NUMERAL SIGN → MODIFIER LETTER LOW ACUTE ACCENT  # 
+
+02FB ; 02EA ;  SL      #* ( ˻ → ˪ ) MODIFIER LETTER BEGIN LOW TONE → MODIFIER LETTER YIN DEPARTING TONE MARK     # 
+A716 ; 02EA ;  SL      #* ( ꜖ → ˪ ) MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR → MODIFIER LETTER YIN DEPARTING TONE MARK      # 
+
+A714 ; 02EB ;  SL      #* ( ꜔ → ˫ ) MODIFIER LETTER MID LEFT-STEM TONE BAR → MODIFIER LETTER YANG DEPARTING TONE MARK   # 
+
+2E30 ; 02F3 ;  SL      #* ( ⸰ → ˳ ) RING POINT → MODIFIER LETTER LOW RING       # 
+3002 ; 02F3 ;  SL      #* ( 。 → ˳ ) IDEOGRAPHIC FULL STOP → MODIFIER LETTER LOW RING    # 
+
+02DA ; 00B0 ;  SL      #* ( ˚ → ° ) RING ABOVE → DEGREE SIGN     # 
+2218 ; 00B0 ;  SL      #* ( ∘ → ° ) RING OPERATOR → DEGREE SIGN # 
+25CB ; 00B0 ;  SL      #* ( ○ → ° ) WHITE CIRCLE → DEGREE SIGN  # →◦→→∘→
+25E6 ; 00B0 ;  SL      #* ( ◦ → ° ) WHITE BULLET → DEGREE SIGN  # →∘→
+
+0BF5 ; 0BF3 ;  SL      #* ( ௵ → ௳ ) TAMIL YEAR SIGN → TAMIL DAY SIGN   # 
+
+21B5 ; 21B2 ;  SL      #* ( ↵ → ↲ ) DOWNWARDS ARROW WITH CORNER LEFTWARDS → DOWNWARDS ARROW WITH TIP LEFTWARDS # 
+
+2A21 ; 21BE ;  SL      #* ( ⨡ → ↾ ) Z NOTATION SCHEMA PROJECTION → UPWARDS HARPOON WITH BARB RIGHTWARDS        # 
+
+1D6DB ;        2202 ;  SL      #* ( 𝛛 → ∂ ) MATHEMATICAL BOLD PARTIAL DIFFERENTIAL → PARTIAL DIFFERENTIAL     # 
+1D715 ;        2202 ;  SL      #* ( 𝜕 → ∂ ) MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL → PARTIAL DIFFERENTIAL   # 
+1D74F ;        2202 ;  SL      #* ( 𝝏 → ∂ ) MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL → PARTIAL DIFFERENTIAL      # 
+1D789 ;        2202 ;  SL      #* ( 𝞉 → ∂ ) MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL → PARTIAL DIFFERENTIAL  # 
+1D7C3 ;        2202 ;  SL      #* ( 𝟃 → ∂ ) MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL → PARTIAL DIFFERENTIAL   # 
+
+00F0 ; 2202 0335 ;     SL      # ( ð → ∂̵ ) LATIN SMALL LETTER ETH → PARTIAL DIFFERENTIAL, COMBINING SHORT STROKE OVERLAY      # 
+
+2300 ; 2205 ;  SL      #* ( ⌀ → ∅ ) DIAMETER SIGN → EMPTY SET  # 
+
+1D6C1 ;        2207 ;  SL      #* ( 𝛁 → ∇ ) MATHEMATICAL BOLD NABLA → NABLA   # 
+1D6FB ;        2207 ;  SL      #* ( 𝛻 → ∇ ) MATHEMATICAL ITALIC NABLA → NABLA # 
+1D735 ;        2207 ;  SL      #* ( 𝜵 → ∇ ) MATHEMATICAL BOLD ITALIC NABLA → NABLA    # 
+1D76F ;        2207 ;  SL      #* ( 𝝯 → ∇ ) MATHEMATICAL SANS-SERIF BOLD NABLA → NABLA        # 
+1D7A9 ;        2207 ;  SL      #* ( 𝞩 → ∇ ) MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA → NABLA # 
+
+2588 ; 220E ;  SL      #* ( █ → ∎ ) FULL BLOCK → END OF PROOF  # →■→
+25A0 ; 220E ;  SL      #* ( ■ → ∎ ) BLACK SQUARE → END OF PROOF        # 
+
+2A3F ; 2210 ;  SL      #* ( ⨿ → ∐ ) AMALGAMATION OR COPRODUCT → N-ARY COPRODUCT        # 
+
+FB29 ; 002B ;  SL      #* ( ﬩ → + ) HEBREW LETTER ALTERNATIVE PLUS SIGN → PLUS SIGN      # 
+
+2039 ; 003C ;  SL      #* ( ‹ → < ) SINGLE LEFT-POINTING ANGLE QUOTATION MARK → LESS-THAN SIGN   # 
+02C2 ; 003C ;  SL      #* ( ˂ → < ) MODIFIER LETTER LEFT ARROWHEAD → LESS-THAN SIGN       # 
+276E ; 003C ;  SL      #* ( ❮ → < ) HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT → LESS-THAN SIGN   # →‹→
+
+A4FF ; 003D ;  SL      #* ( ꓿ → = ) LISU PUNCTUATION FULL STOP → EQUALS SIGN     # 
+
+2A75 ; 003D 003D ;     SL      #* ( ⩵ → == ) TWO CONSECUTIVE EQUALS SIGNS → EQUALS SIGN, EQUALS SIGN     # 
+
+2A76 ; 003D 003D 003D ;        SL      #* ( ⩶ → === ) THREE CONSECUTIVE EQUALS SIGNS → EQUALS SIGN, EQUALS SIGN, EQUALS SIGN     # 
+
+203A ; 003E ;  SL      #* ( › → > ) SINGLE RIGHT-POINTING ANGLE QUOTATION MARK → GREATER-THAN SIGN       # 
+02C3 ; 003E ;  SL      #* ( ˃ → > ) MODIFIER LETTER RIGHT ARROWHEAD → GREATER-THAN SIGN   # 
+276F ; 003E ;  SL      #* ( ❯ → > ) HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT → GREATER-THAN SIGN       # →›→
+
+05F0 ; 007C 007C ;     SL      # ( ‎װ‎ → || ) HEBREW LIGATURE YIDDISH DOUBLE VAV → VERTICAL LINE, VERTICAL LINE       # →‎וו‎→→ll→
+
+02DC ; 007E ;  SL      #* ( ˜ → ~ ) SMALL TILDE → TILDE   # 
+1FC0 ; 007E ;  SL      #* ( ῀ → ~ ) GREEK PERISPOMENI → TILDE    # →˜→
+2053 ; 007E ;  SL      #* ( ⁓ → ~ ) SWUNG DASH → TILDE   # 
+223C ; 007E ;  SL      #* ( ∼ → ~ ) TILDE OPERATOR → TILDE       # 
+
+22C0 ; 2227 ;  SL      #* ( ⋀ → ∧ ) N-ARY LOGICAL AND → LOGICAL AND    # 
+
+22C3 ; 222A ;  SL      #* ( ⋃ → ∪ ) N-ARY UNION → UNION        # 
+
+222F ; 222E 222E ;     SL      #* ( ∯ → ∮∮ ) SURFACE INTEGRAL → CONTOUR INTEGRAL, CONTOUR INTEGRAL   # 
+
+2230 ; 222E 222E 222E ;        SL      #* ( ∰ → ∮∮∮ ) VOLUME INTEGRAL → CONTOUR INTEGRAL, CONTOUR INTEGRAL, CONTOUR INTEGRAL       # 
+
+2263 ; 2261 ;  SL      #* ( ≣ → ≡ ) STRICTLY EQUIVALENT TO → IDENTICAL TO      # 
+
+2A20 ; 226B ;  SL      #* ( ⨠ → ≫ ) Z NOTATION SCHEMA PIPING → MUCH GREATER-THAN       # 
+
+2A03 ; 228D ;  SL      #* ( ⨃ → ⊍ ) N-ARY UNION OPERATOR WITH DOT → MULTISET MULTIPLICATION    # 
+
+2A04 ; 228E ;  SL      #* ( ⨄ → ⊎ ) N-ARY UNION OPERATOR WITH PLUS → MULTISET UNION    # 
+
+2A05 ; 2293 ;  SL      #* ( ⨅ → ⊓ ) N-ARY SQUARE INTERSECTION OPERATOR → SQUARE CAP    # 
+
+2A06 ; 2294 ;  SL      #* ( ⨆ → ⊔ ) N-ARY SQUARE UNION OPERATOR → SQUARE CUP   # 
+
+2641 ; 2295 ;  SL      #* ( ♁ → ⊕ ) EARTH → CIRCLED PLUS       # 
+2A01 ; 2295 ;  SL      #* ( ⨁ → ⊕ ) N-ARY CIRCLED PLUS OPERATOR → CIRCLED PLUS # 
+
+2A02 ; 2297 ;  SL      #* ( ⨂ → ⊗ ) N-ARY CIRCLED TIMES OPERATOR → CIRCLED TIMES       # 
+
+2609 ; 2299 ;  SL      #* ( ☉ → ⊙ ) SUN → CIRCLED DOT OPERATOR # 
+2A00 ; 2299 ;  SL      #* ( ⨀ → ⊙ ) N-ARY CIRCLED DOT OPERATOR → CIRCLED DOT OPERATOR  # 
+
+25B7 ; 22B2 ;  SL      #* ( ▷ → ⊲ ) WHITE RIGHT-POINTING TRIANGLE → NORMAL SUBGROUP OF # 
+
+25C7 ; 22C4 ;  SL      #* ( ◇ → ⋄ ) WHITE DIAMOND → DIAMOND OPERATOR   # 
+25CA ; 22C4 ;  SL      #* ( ◊ → ⋄ ) LOZENGE → DIAMOND OPERATOR # 
+2662 ; 22C4 ;  SL      #* ( ♢ → ⋄ ) WHITE DIAMOND SUIT → DIAMOND OPERATOR      # →◊→
+
+2A1D ; 22C8 ;  SL      #* ( ⨝ → ⋈ ) JOIN → BOWTIE      # 
+
+25E0 ; 2312 ;  SL      #* ( ◠ → ⌒ ) UPPER HALF CIRCLE → ARC    # 
+
+2A3D ; 2319 ;  SL      #* ( ⨽ → ⌙ ) RIGHTHAND INTERIOR PRODUCT → TURNED NOT SIGN       # 
+
+2325 ; 2324 ;  SL      #* ( ⌥ → ⌤ ) OPTION KEY → UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS      # 
+
+2638 ; 2388 ;  SL      #* ( ☸ → ⎈ ) WHEEL OF DHARMA → HELM SYMBOL      # 
+
+FE35 ; 23DC ;  SL      #* ( ︵ → ⏜ ) PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS → TOP PARENTHESIS  # 
+
+FE36 ; 23DD ;  SL      #* ( ︶ → ⏝ ) PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS → BOTTOM PARENTHESIS      # 
+
+FE37 ; 23DE ;  SL      #* ( ︷ → ⏞ ) PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET → TOP CURLY BRACKET      # 
+
+FE38 ; 23DF ;  SL      #* ( ︸ → ⏟ ) PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET → BOTTOM CURLY BRACKET  # 
+
+FE39 ; 23E0 ;  SL      #* ( ︹ → ⏠ ) PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET → TOP TORTOISE SHELL BRACKET    # 
+
+FE3A ; 23E1 ;  SL      #* ( ︺ → ⏡ ) PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET → BOTTOM TORTOISE SHELL BRACKET        # 
+
+25B1 ; 23E5 ;  SL      #* ( ▱ → ⏥ ) WHITE PARALLELOGRAM → FLATNESS     # 
+
+FE31 ; 2502 ;  SL      #* ( ︱ → │ ) PRESENTATION FORM FOR VERTICAL EM DASH → BOX DRAWINGS LIGHT VERTICAL       # →|→
+FF5C ; 2502 ;  SL      #* ( | → │ ) FULLWIDTH VERTICAL LINE → BOX DRAWINGS LIGHT VERTICAL      # 
+2503 ; 2502 ;  SL      #* ( ┃ → │ ) BOX DRAWINGS HEAVY VERTICAL → BOX DRAWINGS LIGHT VERTICAL  # 
+
+250F ; 250C ;  SL      #* ( ┏ → ┌ ) BOX DRAWINGS HEAVY DOWN AND RIGHT → BOX DRAWINGS LIGHT DOWN AND RIGHT      # 
+
+2523 ; 251C ;  SL      #* ( ┣ → ├ ) BOX DRAWINGS HEAVY VERTICAL AND RIGHT → BOX DRAWINGS LIGHT VERTICAL AND RIGHT      # 
+
+2590 ; 258C ;  SL      #* ( ▐ → ▌ ) RIGHT HALF BLOCK → LEFT HALF BLOCK # 
+
+2597 ; 2596 ;  SL      #* ( ▗ → ▖ ) QUADRANT LOWER RIGHT → QUADRANT LOWER LEFT # 
+
+259D ; 2598 ;  SL      #* ( ▝ → ▘ ) QUADRANT UPPER RIGHT → QUADRANT UPPER LEFT # 
+
+2610 ; 25A1 ;  SL      #* ( ☐ → □ ) BALLOT BOX → WHITE SQUARE  # 
+
+FFED ; 25AA ;  SL      #* ( ■ → ▪ ) HALFWIDTH BLACK SQUARE → BLACK SMALL SQUARE        # 
+
+25B8 ; 25B6 ;  SL      #* ( ▸ → ▶ ) BLACK RIGHT-POINTING SMALL TRIANGLE → BLACK RIGHT-POINTING TRIANGLE        # →►→
+25BA ; 25B6 ;  SL      #* ( ► → ▶ ) BLACK RIGHT-POINTING POINTER → BLACK RIGHT-POINTING TRIANGLE       # 
+
+29BE ; 25CE ;  SL      #* ( ⦾ → ◎ ) CIRCLED WHITE BULLET → BULLSEYE    # 
+
+2CE9 ; 2627 ;  SL      #* ( ⳩ → ☧ ) COPTIC SYMBOL KHI RO → CHI RHO     # 
+
+2329 ; 276C ;  SL      #* ( 〈 → ❬ ) LEFT-POINTING ANGLE BRACKET → MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT  # →〈→
+3008 ; 276C ;  SL      #* ( 〈 → ❬ ) LEFT ANGLE BRACKET → MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT   # 
+27E8 ; 276C ;  SL      #* ( ⟨ → ❬ ) MATHEMATICAL LEFT ANGLE BRACKET → MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT      # →〈→
+
+232A ; 276D ;  SL      #* ( 〉 → ❭ ) RIGHT-POINTING ANGLE BRACKET → MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT        # →〉→
+3009 ; 276D ;  SL      #* ( 〉 → ❭ ) RIGHT ANGLE BRACKET → MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT # 
+27E9 ; 276D ;  SL      #* ( ⟩ → ❭ ) MATHEMATICAL RIGHT ANGLE BRACKET → MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT    # →〉→
+
+301B ; 27E7 ;  SL      #* ( 〛 → ⟧ ) RIGHT WHITE SQUARE BRACKET → MATHEMATICAL RIGHT WHITE SQUARE BRACKET       # 
+
+29D9 ; 299A ;  SL      #* ( ⧙ → ⦚ ) RIGHT WIGGLY FENCE → VERTICAL ZIGZAG LINE  # 
+
+2A3E ; 2A1F ;  SL      #* ( ⨾ → ⨟ ) Z NOTATION RELATIONAL COMPOSITION → Z NOTATION SCHEMA COMPOSITION  # 
+
+3036 ; 3012 ;  SL      #* ( 〶 → 〒 ) CIRCLED POSTAL MARK → POSTAL MARK  # 
+
+02D9 ; 0971 ;  SL      #* ( ˙ → ॱ ) DOT ABOVE → DEVANAGARI SIGN HIGH SPACING DOT        # 
+
+FF0D ; 30FC ;  SL      #* ( - → ー ) FULLWIDTH HYPHEN-MINUS → KATAKANA-HIRAGANA PROLONGED SOUND MARK    # 
+2014 ; 30FC ;  SL      #* ( — → ー ) EM DASH → KATAKANA-HIRAGANA PROLONGED SOUND MARK   # →一→
+2015 ; 30FC ;  SL      #* ( ― → ー ) HORIZONTAL BAR → KATAKANA-HIRAGANA PROLONGED SOUND MARK    # →—→→一→
+2500 ; 30FC ;  SL      #* ( ─ → ー ) BOX DRAWINGS LIGHT HORIZONTAL → KATAKANA-HIRAGANA PROLONGED SOUND MARK     # →―→→—→→一→
+2501 ; 30FC ;  SL      #* ( ━ → ー ) BOX DRAWINGS HEAVY HORIZONTAL → KATAKANA-HIRAGANA PROLONGED SOUND MARK     # →—→→一→
+31D0 ; 30FC ;  SL      #* ( ㇐ → ー ) CJK STROKE H → KATAKANA-HIRAGANA PROLONGED SOUND MARK      # →一→
+1173 ; 30FC ;  SL      # ( ᅳ → ー ) HANGUL JUNGSEONG EU → KATAKANA-HIRAGANA PROLONGED SOUND MARK        # →ㅡ→→—→→一→
+3161 ; 30FC ;  SL      # ( ㅡ → ー ) HANGUL LETTER EU → KATAKANA-HIRAGANA PROLONGED SOUND MARK   # →—→→一→
+4E00 ; 30FC ;  SL      # ( 一 → ー ) CJK UNIFIED IDEOGRAPH-4E00 → KATAKANA-HIRAGANA PROLONGED SOUND MARK # 
+2F00 ; 30FC ;  SL      #* ( ⼀ → ー ) KANGXI RADICAL ONE → KATAKANA-HIRAGANA PROLONGED SOUND MARK        # →一→
+
+1196 ; 30FC 30FC ;     SL      # ( ᆖ → ーー ) HANGUL JUNGSEONG EU-EU → KATAKANA-HIRAGANA PROLONGED SOUND MARK, KATAKANA-HIRAGANA PROLONGED SOUND MARK  # →ᅳᅳ→
+
+20A4 ; 00A3 ;  SL      #* ( ₤ → £ ) LIRA SIGN → POUND SIGN      # 
+
+1D7CE ;        0030 ;  SL      # ( 𝟎 → 0 ) MATHEMATICAL BOLD DIGIT ZERO → DIGIT ZERO    # 
+1D7D8 ;        0030 ;  SL      # ( 𝟘 → 0 ) MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO → DIGIT ZERO   # 
+1D7E2 ;        0030 ;  SL      # ( 𝟢 → 0 ) MATHEMATICAL SANS-SERIF DIGIT ZERO → DIGIT ZERO      # 
+1D7EC ;        0030 ;  SL      # ( 𝟬 → 0 ) MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO → DIGIT ZERO # 
+1D7F6 ;        0030 ;  SL      # ( 𝟶 → 0 ) MATHEMATICAL MONOSPACE DIGIT ZERO → DIGIT ZERO       # 
+07C0 ; 0030 ;  SL      # ( ‎߀‎ → 0 ) NKO DIGIT ZERO → DIGIT ZERO      # 
+09E6 ; 0030 ;  SL      # ( ০ → 0 ) BENGALI DIGIT ZERO → DIGIT ZERO       # 
+0B66 ; 0030 ;  SL      # ( ୦ → 0 ) ORIYA DIGIT ZERO → DIGIT ZERO # 
+3007 ; 0030 ;  SL      # ( 〇 → 0 ) IDEOGRAPHIC NUMBER ZERO → DIGIT ZERO  # →O→
+1D40E ;        0030 ;  SL      # ( 𝐎 → 0 ) MATHEMATICAL BOLD CAPITAL O → DIGIT ZERO     # →O→
+1D442 ;        0030 ;  SL      # ( 𝑂 → 0 ) MATHEMATICAL ITALIC CAPITAL O → DIGIT ZERO   # →O→
+1D476 ;        0030 ;  SL      # ( 𝑶 → 0 ) MATHEMATICAL BOLD ITALIC CAPITAL O → DIGIT ZERO      # →O→
+1D4AA ;        0030 ;  SL      # ( 𝒪 → 0 ) MATHEMATICAL SCRIPT CAPITAL O → DIGIT ZERO   # →O→
+1D4DE ;        0030 ;  SL      # ( 𝓞 → 0 ) MATHEMATICAL BOLD SCRIPT CAPITAL O → DIGIT ZERO      # →O→
+1D512 ;        0030 ;  SL      # ( 𝔒 → 0 ) MATHEMATICAL FRAKTUR CAPITAL O → DIGIT ZERO  # →O→
+1D546 ;        0030 ;  SL      # ( 𝕆 → 0 ) MATHEMATICAL DOUBLE-STRUCK CAPITAL O → DIGIT ZERO    # →O→
+1D57A ;        0030 ;  SL      # ( 𝕺 → 0 ) MATHEMATICAL BOLD FRAKTUR CAPITAL O → DIGIT ZERO     # →O→
+1D5AE ;        0030 ;  SL      # ( 𝖮 → 0 ) MATHEMATICAL SANS-SERIF CAPITAL O → DIGIT ZERO       # →O→
+1D5E2 ;        0030 ;  SL      # ( 𝗢 → 0 ) MATHEMATICAL SANS-SERIF BOLD CAPITAL O → DIGIT ZERO  # →O→
+1D616 ;        0030 ;  SL      # ( 𝘖 → 0 ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL O → DIGIT ZERO        # →O→
+1D64A ;        0030 ;  SL      # ( 𝙊 → 0 ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O → DIGIT ZERO   # →O→
+1D67E ;        0030 ;  SL      # ( 𝙾 → 0 ) MATHEMATICAL MONOSPACE CAPITAL O → DIGIT ZERO        # →O→
+1D6B6 ;        0030 ;  SL      # ( 𝚶 → 0 ) MATHEMATICAL BOLD CAPITAL OMICRON → DIGIT ZERO       # →Ο→
+1D6F0 ;        0030 ;  SL      # ( 𝛰 → 0 ) MATHEMATICAL ITALIC CAPITAL OMICRON → DIGIT ZERO     # →Ο→
+1D72A ;        0030 ;  SL      # ( 𝜪 → 0 ) MATHEMATICAL BOLD ITALIC CAPITAL OMICRON → DIGIT ZERO        # →Ο→
+1D764 ;        0030 ;  SL      # ( 𝝤 → 0 ) MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON → DIGIT ZERO    # →Ο→
+1D79E ;        0030 ;  SL      # ( 𝞞 → 0 ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON → DIGIT ZERO     # →Ο→
+2D54 ; 0030 ;  SL      # ( ⵔ → 0 ) TIFINAGH LETTER YAR → DIGIT ZERO      # →Ο→
+0B20 ; 0030 ;  SL      # ( ଠ → 0 ) ORIYA LETTER TTHA → DIGIT ZERO        # →୦→
+0D20 ; 0030 ;  SL      # ( ഠ → 0 ) MALAYALAM LETTER TTHA → DIGIT ZERO    # 
+A4F3 ; 0030 ;  SL      # ( ꓳ → 0 ) LISU LETTER O → DIGIT ZERO    # →O→
+
+1B5C ; 1B50 ;  SL      #* ( ᭜ → ᭐ ) BALINESE WINDU → BALINESE DIGIT ZERO       # 
+
+A9C6 ; A9D0 ;  SL      #* ( ꧆ → ꧐ ) JAVANESE PADA WINDU → JAVANESE DIGIT ZERO  # 
+
+1F101 ;        0030 002C ;     SL      #* ( 🄁 → 0, ) DIGIT ZERO COMMA → DIGIT ZERO, COMMA       # 
+
+1F100 ;        0030 002E ;     SL      #* ( 🄀 → 0. ) DIGIT ZERO FULL STOP → DIGIT ZERO, FULL STOP       # 
+
+066A ; 2070 002F 2080 2080 ;   SL      #* ( ٪ → ⁰/₀₀ ) ARABIC PERCENT SIGN → SUPERSCRIPT ZERO, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO      # →%→→‰→
+0609 ; 2070 002F 2080 2080 ;   SL      #* ( ؉ → ⁰/₀₀ ) ARABIC-INDIC PER MILLE SIGN → SUPERSCRIPT ZERO, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO      # →%→→‰→
+060A ; 2070 002F 2080 2080 ;   SL      #* ( ؊ → ⁰/₀₀ ) ARABIC-INDIC PER TEN THOUSAND SIGN → SUPERSCRIPT ZERO, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO       # →%→→‰→
+
+3358 ; 0030 70B9 ;     SL      #* ( ㍘ → 0点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO → DIGIT ZERO, CJK UNIFIED IDEOGRAPH-70B9       # 
+
+05D5 ; 0031 ;  SL      # ( ‎ו‎ → 1 ) HEBREW LETTER VAV → DIGIT ONE    # →l→
+05DF ; 0031 ;  SL      # ( ‎ן‎ → 1 ) HEBREW LETTER FINAL NUN → DIGIT ONE      # →l→
+07CA ; 0031 ;  SL      # ( ‎ߊ‎ → 1 ) NKO LETTER A → DIGIT ONE # →∣→→|→→l→
+2D4F ; 0031 ;  SL      # ( ⵏ → 1 ) TIFINAGH LETTER YAN → DIGIT ONE       # →I→
+A4F2 ; 0031 ;  SL      # ( ꓲ → 1 ) LISU LETTER I → DIGIT ONE     # →I→
+
+2460 ; 2780 ;  SL      #* ( ① → ➀ ) CIRCLED DIGIT ONE → DINGBAT CIRCLED SANS-SERIF DIGIT ONE   # 
+
+06F1 ; 0661 ;  SL      # ( ۱ → ‎١‎ ) EXTENDED ARABIC-INDIC DIGIT ONE → ARABIC-INDIC DIGIT ONE        # 
+
+1065 ; 1041 ;  SL      # ( ၥ → ၁ ) MYANMAR LETTER WESTERN PWO KAREN THA → MYANMAR DIGIT ONE    # 
+
+2469 ; 2789 ;  SL      #* ( ⑩ → ➉ ) CIRCLED NUMBER TEN → DINGBAT CIRCLED SANS-SERIF NUMBER TEN # 
+
+2491 ; 0031 0030 002E ;        SL      #* ( ⒑ → 10. ) NUMBER TEN FULL STOP → DIGIT ONE, DIGIT ZERO, FULL STOP    # 
+
+33E9 ; 0031 0030 65E5 ;        SL      #* ( ㏩ → 10日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN → DIGIT ONE, DIGIT ZERO, CJK UNIFIED IDEOGRAPH-65E5     # 
+
+32C9 ; 0031 0030 6708 ;        SL      #* ( ㋉ → 10月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER → DIGIT ONE, DIGIT ZERO, CJK UNIFIED IDEOGRAPH-6708     # 
+
+3362 ; 0031 0030 70B9 ;        SL      #* ( ㍢ → 10点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN → DIGIT ONE, DIGIT ZERO, CJK UNIFIED IDEOGRAPH-70B9    # 
+
+33EA ; 0031 0031 65E5 ;        SL      #* ( ㏪ → 11日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN → DIGIT ONE, DIGIT ONE, CJK UNIFIED IDEOGRAPH-65E5   # 
+
+32CA ; 0031 0031 6708 ;        SL      #* ( ㋊ → 11月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER → DIGIT ONE, DIGIT ONE, CJK UNIFIED IDEOGRAPH-6708     # 
+
+3363 ; 0031 0031 70B9 ;        SL      #* ( ㍣ → 11点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN → DIGIT ONE, DIGIT ONE, CJK UNIFIED IDEOGRAPH-70B9  # 
+
+33EB ; 0031 0032 65E5 ;        SL      #* ( ㏫ → 12日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE → DIGIT ONE, DIGIT TWO, CJK UNIFIED IDEOGRAPH-65E5   # 
+
+32CB ; 0031 0032 6708 ;        SL      #* ( ㋋ → 12月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER → DIGIT ONE, DIGIT TWO, CJK UNIFIED IDEOGRAPH-6708     # 
+
+3364 ; 0031 0032 70B9 ;        SL      #* ( ㍤ → 12点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE → DIGIT ONE, DIGIT TWO, CJK UNIFIED IDEOGRAPH-70B9  # 
+
+33EC ; 0031 0033 65E5 ;        SL      #* ( ㏬ → 13日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN → DIGIT ONE, DIGIT THREE, CJK UNIFIED IDEOGRAPH-65E5       # 
+
+3365 ; 0031 0033 70B9 ;        SL      #* ( ㍥ → 13点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN → DIGIT ONE, DIGIT THREE, CJK UNIFIED IDEOGRAPH-70B9      # 
+
+33ED ; 0031 0034 65E5 ;        SL      #* ( ㏭ → 14日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN → DIGIT ONE, DIGIT FOUR, CJK UNIFIED IDEOGRAPH-65E5        # 
+
+3366 ; 0031 0034 70B9 ;        SL      #* ( ㍦ → 14点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN → DIGIT ONE, DIGIT FOUR, CJK UNIFIED IDEOGRAPH-70B9       # 
+
+33EE ; 0031 0035 65E5 ;        SL      #* ( ㏮ → 15日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN → DIGIT ONE, DIGIT FIVE, CJK UNIFIED IDEOGRAPH-65E5 # 
+
+3367 ; 0031 0035 70B9 ;        SL      #* ( ㍧ → 15点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN → DIGIT ONE, DIGIT FIVE, CJK UNIFIED IDEOGRAPH-70B9        # 
+
+33EF ; 0031 0036 65E5 ;        SL      #* ( ㏯ → 16日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN → DIGIT ONE, DIGIT SIX, CJK UNIFIED IDEOGRAPH-65E5  # 
+
+3368 ; 0031 0036 70B9 ;        SL      #* ( ㍨ → 16点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN → DIGIT ONE, DIGIT SIX, CJK UNIFIED IDEOGRAPH-70B9 # 
+
+33F0 ; 0031 0037 65E5 ;        SL      #* ( ㏰ → 17日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN → DIGIT ONE, DIGIT SEVEN, CJK UNIFIED IDEOGRAPH-65E5      # 
+
+3369 ; 0031 0037 70B9 ;        SL      #* ( ㍩ → 17点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN → DIGIT ONE, DIGIT SEVEN, CJK UNIFIED IDEOGRAPH-70B9     # 
+
+33F1 ; 0031 0038 65E5 ;        SL      #* ( ㏱ → 18日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN → DIGIT ONE, DIGIT EIGHT, CJK UNIFIED IDEOGRAPH-65E5       # 
+
+336A ; 0031 0038 70B9 ;        SL      #* ( ㍪ → 18点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN → DIGIT ONE, DIGIT EIGHT, CJK UNIFIED IDEOGRAPH-70B9      # 
+
+33F2 ; 0031 0039 65E5 ;        SL      #* ( ㏲ → 19日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN → DIGIT ONE, DIGIT NINE, CJK UNIFIED IDEOGRAPH-65E5        # 
+
+336B ; 0031 0039 70B9 ;        SL      #* ( ㍫ → 19点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN → DIGIT ONE, DIGIT NINE, CJK UNIFIED IDEOGRAPH-70B9       # 
+
+14B7 ; 0031 1427 ;     SL      # ( ᒷ → 1ᐧ ) CANADIAN SYLLABICS WEST-CREE MWA → DIGIT ONE, CANADIAN SYLLABICS FINAL MIDDLE DOT  # 
+
+33E0 ; 0031 65E5 ;     SL      #* ( ㏠ → 1日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE → DIGIT ONE, CJK UNIFIED IDEOGRAPH-65E5  # 
+
+32C0 ; 0031 6708 ;     SL      #* ( ㋀ → 1月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY → DIGIT ONE, CJK UNIFIED IDEOGRAPH-6708  # 
+
+3359 ; 0031 70B9 ;     SL      #* ( ㍙ → 1点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE → DIGIT ONE, CJK UNIFIED IDEOGRAPH-70B9 # 
+
+1D7D0 ;        0032 ;  SL      # ( 𝟐 → 2 ) MATHEMATICAL BOLD DIGIT TWO → DIGIT TWO      # 
+1D7DA ;        0032 ;  SL      # ( 𝟚 → 2 ) MATHEMATICAL DOUBLE-STRUCK DIGIT TWO → DIGIT TWO     # 
+1D7E4 ;        0032 ;  SL      # ( 𝟤 → 2 ) MATHEMATICAL SANS-SERIF DIGIT TWO → DIGIT TWO        # 
+1D7EE ;        0032 ;  SL      # ( 𝟮 → 2 ) MATHEMATICAL SANS-SERIF BOLD DIGIT TWO → DIGIT TWO   # 
+1D7F8 ;        0032 ;  SL      # ( 𝟸 → 2 ) MATHEMATICAL MONOSPACE DIGIT TWO → DIGIT TWO # 
+14BF ; 0032 ;  SL      # ( ᒿ → 2 ) CANADIAN SYLLABICS SAYISI M → DIGIT TWO       # 
+
+2461 ; 2781 ;  SL      #* ( ② → ➁ ) CIRCLED DIGIT TWO → DINGBAT CIRCLED SANS-SERIF DIGIT TWO   # 
+
+06F2 ; 0662 ;  SL      # ( ۲ → ‎٢‎ ) EXTENDED ARABIC-INDIC DIGIT TWO → ARABIC-INDIC DIGIT TWO        # 
+
+1F103 ;        0032 002C ;     SL      #* ( 🄃 → 2, ) DIGIT TWO COMMA → DIGIT TWO, COMMA # 
+
+2489 ; 0032 002E ;     SL      #* ( ⒉ → 2. ) DIGIT TWO FULL STOP → DIGIT TWO, FULL STOP  # 
+
+249B ; 0032 0030 002E ;        SL      #* ( ⒛ → 20. ) NUMBER TWENTY FULL STOP → DIGIT TWO, DIGIT ZERO, FULL STOP # 
+
+33F3 ; 0032 0030 65E5 ;        SL      #* ( ㏳ → 20日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY → DIGIT TWO, DIGIT ZERO, CJK UNIFIED IDEOGRAPH-65E5  # 
+
+336C ; 0032 0030 70B9 ;        SL      #* ( ㍬ → 20点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY → DIGIT TWO, DIGIT ZERO, CJK UNIFIED IDEOGRAPH-70B9 # 
+
+33F4 ; 0032 0031 65E5 ;        SL      #* ( ㏴ → 21日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE → DIGIT TWO, DIGIT ONE, CJK UNIFIED IDEOGRAPH-65E5       # 
+
+336D ; 0032 0031 70B9 ;        SL      #* ( ㍭ → 21点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE → DIGIT TWO, DIGIT ONE, CJK UNIFIED IDEOGRAPH-70B9      # 
+
+33F5 ; 0032 0032 65E5 ;        SL      #* ( ㏵ → 22日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO → DIGIT TWO, DIGIT TWO, CJK UNIFIED IDEOGRAPH-65E5       # 
+
+336E ; 0032 0032 70B9 ;        SL      #* ( ㍮ → 22点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO → DIGIT TWO, DIGIT TWO, CJK UNIFIED IDEOGRAPH-70B9      # 
+
+33F6 ; 0032 0033 65E5 ;        SL      #* ( ㏶ → 23日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE → DIGIT TWO, DIGIT THREE, CJK UNIFIED IDEOGRAPH-65E5   # 
+
+336F ; 0032 0033 70B9 ;        SL      #* ( ㍯ → 23点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE → DIGIT TWO, DIGIT THREE, CJK UNIFIED IDEOGRAPH-70B9  # 
+
+33F7 ; 0032 0034 65E5 ;        SL      #* ( ㏷ → 24日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR → DIGIT TWO, DIGIT FOUR, CJK UNIFIED IDEOGRAPH-65E5     # 
+
+3370 ; 0032 0034 70B9 ;        SL      #* ( ㍰ → 24点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR → DIGIT TWO, DIGIT FOUR, CJK UNIFIED IDEOGRAPH-70B9    # 
+
+33F8 ; 0032 0035 65E5 ;        SL      #* ( ㏸ → 25日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE → DIGIT TWO, DIGIT FIVE, CJK UNIFIED IDEOGRAPH-65E5     # 
+
+33F9 ; 0032 0036 65E5 ;        SL      #* ( ㏹ → 26日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX → DIGIT TWO, DIGIT SIX, CJK UNIFIED IDEOGRAPH-65E5       # 
+
+33FA ; 0032 0037 65E5 ;        SL      #* ( ㏺ → 27日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN → DIGIT TWO, DIGIT SEVEN, CJK UNIFIED IDEOGRAPH-65E5   # 
+
+33FB ; 0032 0038 65E5 ;        SL      #* ( ㏻ → 28日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT → DIGIT TWO, DIGIT EIGHT, CJK UNIFIED IDEOGRAPH-65E5   # 
+
+33FC ; 0032 0039 65E5 ;        SL      #* ( ㏼ → 29日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE → DIGIT TWO, DIGIT NINE, CJK UNIFIED IDEOGRAPH-65E5     # 
+
+33E1 ; 0032 65E5 ;     SL      #* ( ㏡ → 2日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO → DIGIT TWO, CJK UNIFIED IDEOGRAPH-65E5  # 
+
+32C1 ; 0032 6708 ;     SL      #* ( ㋁ → 2月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY → DIGIT TWO, CJK UNIFIED IDEOGRAPH-6708 # 
+
+335A ; 0032 70B9 ;     SL      #* ( ㍚ → 2点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO → DIGIT TWO, CJK UNIFIED IDEOGRAPH-70B9 # 
+
+1D7D1 ;        0033 ;  SL      # ( 𝟑 → 3 ) MATHEMATICAL BOLD DIGIT THREE → DIGIT THREE  # 
+1D7DB ;        0033 ;  SL      # ( 𝟛 → 3 ) MATHEMATICAL DOUBLE-STRUCK DIGIT THREE → DIGIT THREE # 
+1D7E5 ;        0033 ;  SL      # ( 𝟥 → 3 ) MATHEMATICAL SANS-SERIF DIGIT THREE → DIGIT THREE    # 
+1D7EF ;        0033 ;  SL      # ( 𝟯 → 3 ) MATHEMATICAL SANS-SERIF BOLD DIGIT THREE → DIGIT THREE       # 
+1D7F9 ;        0033 ;  SL      # ( 𝟹 → 3 ) MATHEMATICAL MONOSPACE DIGIT THREE → DIGIT THREE     # 
+
+2462 ; 2782 ;  SL      #* ( ③ → ➂ ) CIRCLED DIGIT THREE → DINGBAT CIRCLED SANS-SERIF DIGIT THREE       # 
+
+06F3 ; 0663 ;  SL      # ( ۳ → ‎٣‎ ) EXTENDED ARABIC-INDIC DIGIT THREE → ARABIC-INDIC DIGIT THREE    # 
+
+1F104 ;        0033 002C ;     SL      #* ( 🄄 → 3, ) DIGIT THREE COMMA → DIGIT THREE, COMMA     # 
+
+248A ; 0033 002E ;     SL      #* ( ⒊ → 3. ) DIGIT THREE FULL STOP → DIGIT THREE, FULL STOP      # 
+
+33FD ; 0033 0030 65E5 ;        SL      #* ( ㏽ → 30日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY → DIGIT THREE, DIGIT ZERO, CJK UNIFIED IDEOGRAPH-65E5        # 
+
+33FE ; 0033 0031 65E5 ;        SL      #* ( ㏾ → 31日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE → DIGIT THREE, DIGIT ONE, CJK UNIFIED IDEOGRAPH-65E5     # 
+
+33E2 ; 0033 65E5 ;     SL      #* ( ㏢ → 3日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE → DIGIT THREE, CJK UNIFIED IDEOGRAPH-65E5      # 
+
+32C2 ; 0033 6708 ;     SL      #* ( ㋂ → 3月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH → DIGIT THREE, CJK UNIFIED IDEOGRAPH-6708  # 
+
+335B ; 0033 70B9 ;     SL      #* ( ㍛ → 3点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE → DIGIT THREE, CJK UNIFIED IDEOGRAPH-70B9     # 
+
+1D7D2 ;        0034 ;  SL      # ( 𝟒 → 4 ) MATHEMATICAL BOLD DIGIT FOUR → DIGIT FOUR    # 
+1D7DC ;        0034 ;  SL      # ( 𝟜 → 4 ) MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR → DIGIT FOUR   # 
+1D7E6 ;        0034 ;  SL      # ( 𝟦 → 4 ) MATHEMATICAL SANS-SERIF DIGIT FOUR → DIGIT FOUR      # 
+1D7F0 ;        0034 ;  SL      # ( 𝟰 → 4 ) MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR → DIGIT FOUR # 
+1D7FA ;        0034 ;  SL      # ( 𝟺 → 4 ) MATHEMATICAL MONOSPACE DIGIT FOUR → DIGIT FOUR       # 
+13CE ; 0034 ;  SL      # ( Ꮞ → 4 ) CHEROKEE LETTER SE → DIGIT FOUR       # 
+
+2463 ; 2783 ;  SL      #* ( ④ → ➃ ) CIRCLED DIGIT FOUR → DINGBAT CIRCLED SANS-SERIF DIGIT FOUR # 
+
+1F105 ;        0034 002C ;     SL      #* ( 🄅 → 4, ) DIGIT FOUR COMMA → DIGIT FOUR, COMMA       # 
+
+248B ; 0034 002E ;     SL      #* ( ⒋ → 4. ) DIGIT FOUR FULL STOP → DIGIT FOUR, FULL STOP        # 
+
+1530 ; 0034 00B7 ;     SL      # ( ᔰ → 4· ) CANADIAN SYLLABICS WEST-CREE YWE → DIGIT FOUR, MIDDLE DOT   # →4ᐧ→
+
+33E3 ; 0034 65E5 ;     SL      #* ( ㏣ → 4日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR → DIGIT FOUR, CJK UNIFIED IDEOGRAPH-65E5        # 
+
+32C3 ; 0034 6708 ;     SL      #* ( ㋃ → 4月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL → DIGIT FOUR, CJK UNIFIED IDEOGRAPH-6708   # 
+
+335C ; 0034 70B9 ;     SL      #* ( ㍜ → 4点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR → DIGIT FOUR, CJK UNIFIED IDEOGRAPH-70B9       # 
+
+1D7D3 ;        0035 ;  SL      # ( 𝟓 → 5 ) MATHEMATICAL BOLD DIGIT FIVE → DIGIT FIVE    # 
+1D7DD ;        0035 ;  SL      # ( 𝟝 → 5 ) MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE → DIGIT FIVE   # 
+1D7E7 ;        0035 ;  SL      # ( 𝟧 → 5 ) MATHEMATICAL SANS-SERIF DIGIT FIVE → DIGIT FIVE      # 
+1D7F1 ;        0035 ;  SL      # ( 𝟱 → 5 ) MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE → DIGIT FIVE # 
+1D7FB ;        0035 ;  SL      # ( 𝟻 → 5 ) MATHEMATICAL MONOSPACE DIGIT FIVE → DIGIT FIVE       # 
+
+2464 ; 2784 ;  SL      #* ( ⑤ → ➄ ) CIRCLED DIGIT FIVE → DINGBAT CIRCLED SANS-SERIF DIGIT FIVE # 
+
+0C02 ; 0665 ;  SL      # ( ం → ‎٥‎ ) TELUGU SIGN ANUSVARA → ARABIC-INDIC DIGIT FIVE # →o→
+0C82 ; 0665 ;  SL      # ( ಂ → ‎٥‎ ) KANNADA SIGN ANUSVARA → ARABIC-INDIC DIGIT FIVE        # →o→
+0D02 ; 0665 ;  SL      # ( ം → ‎٥‎ ) MALAYALAM SIGN ANUSVARA → ARABIC-INDIC DIGIT FIVE      # →o→
+0D82 ; 0665 ;  SL      # ( ං → ‎٥‎ ) SINHALA SIGN ANUSVARAYA → ARABIC-INDIC DIGIT FIVE      # →o→
+0966 ; 0665 ;  SL      # ( ० → ‎٥‎ ) DEVANAGARI DIGIT ZERO → ARABIC-INDIC DIGIT FIVE        # →o→
+0A66 ; 0665 ;  SL      # ( ੦ → ‎٥‎ ) GURMUKHI DIGIT ZERO → ARABIC-INDIC DIGIT FIVE  # →o→
+0AE6 ; 0665 ;  SL      # ( ૦ → ‎٥‎ ) GUJARATI DIGIT ZERO → ARABIC-INDIC DIGIT FIVE  # →o→
+0BE6 ; 0665 ;  SL      # ( ௦ → ‎٥‎ ) TAMIL DIGIT ZERO → ARABIC-INDIC DIGIT FIVE     # →o→
+0C66 ; 0665 ;  SL      # ( ౦ → ‎٥‎ ) TELUGU DIGIT ZERO → ARABIC-INDIC DIGIT FIVE    # →o→
+0CE6 ; 0665 ;  SL      # ( ೦ → ‎٥‎ ) KANNADA DIGIT ZERO → ARABIC-INDIC DIGIT FIVE   # →౦→→o→
+0D66 ; 0665 ;  SL      # ( ൦ → ‎٥‎ ) MALAYALAM DIGIT ZERO → ARABIC-INDIC DIGIT FIVE # →o→
+0E50 ; 0665 ;  SL      # ( ๐ → ‎٥‎ ) THAI DIGIT ZERO → ARABIC-INDIC DIGIT FIVE      # →o→
+0ED0 ; 0665 ;  SL      # ( ໐ → ‎٥‎ ) LAO DIGIT ZERO → ARABIC-INDIC DIGIT FIVE       # →o→
+1040 ; 0665 ;  SL      # ( ၀ → ‎٥‎ ) MYANMAR DIGIT ZERO → ARABIC-INDIC DIGIT FIVE   # →o→
+2C9F ; 0665 ;  SL      # ( ⲟ → ‎٥‎ ) COPTIC SMALL LETTER O → ARABIC-INDIC DIGIT FIVE        # →o→
+101D ; 0665 ;  SL      # ( ဝ → ‎٥‎ ) MYANMAR LETTER WA → ARABIC-INDIC DIGIT FIVE    # →o→
+
+1F106 ;        0035 002C ;     SL      #* ( 🄆 → 5, ) DIGIT FIVE COMMA → DIGIT FIVE, COMMA       # 
+
+248C ; 0035 002E ;     SL      #* ( ⒌ → 5. ) DIGIT FIVE FULL STOP → DIGIT FIVE, FULL STOP        # 
+
+33E4 ; 0035 65E5 ;     SL      #* ( ㏤ → 5日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE → DIGIT FIVE, CJK UNIFIED IDEOGRAPH-65E5        # 
+
+32C4 ; 0035 6708 ;     SL      #* ( ㋄ → 5月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY → DIGIT FIVE, CJK UNIFIED IDEOGRAPH-6708     # 
+
+335D ; 0035 70B9 ;     SL      #* ( ㍝ → 5点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE → DIGIT FIVE, CJK UNIFIED IDEOGRAPH-70B9       # 
+
+1D7D4 ;        0036 ;  SL      # ( 𝟔 → 6 ) MATHEMATICAL BOLD DIGIT SIX → DIGIT SIX      # 
+1D7DE ;        0036 ;  SL      # ( 𝟞 → 6 ) MATHEMATICAL DOUBLE-STRUCK DIGIT SIX → DIGIT SIX     # 
+1D7E8 ;        0036 ;  SL      # ( 𝟨 → 6 ) MATHEMATICAL SANS-SERIF DIGIT SIX → DIGIT SIX        # 
+1D7F2 ;        0036 ;  SL      # ( 𝟲 → 6 ) MATHEMATICAL SANS-SERIF BOLD DIGIT SIX → DIGIT SIX   # 
+1D7FC ;        0036 ;  SL      # ( 𝟼 → 6 ) MATHEMATICAL MONOSPACE DIGIT SIX → DIGIT SIX # 
+0431 ; 0036 ;  SL      # ( б → 6 ) CYRILLIC SMALL LETTER BE → DIGIT SIX   # 
+
+2465 ; 2785 ;  SL      #* ( ⑥ → ➅ ) CIRCLED DIGIT SIX → DINGBAT CIRCLED SANS-SERIF DIGIT SIX   # 
+
+1F107 ;        0036 002C ;     SL      #* ( 🄇 → 6, ) DIGIT SIX COMMA → DIGIT SIX, COMMA # 
+
+248D ; 0036 002E ;     SL      #* ( ⒍ → 6. ) DIGIT SIX FULL STOP → DIGIT SIX, FULL STOP  # 
+
+33E5 ; 0036 65E5 ;     SL      #* ( ㏥ → 6日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX → DIGIT SIX, CJK UNIFIED IDEOGRAPH-65E5  # 
+
+32C5 ; 0036 6708 ;     SL      #* ( ㋅ → 6月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE → DIGIT SIX, CJK UNIFIED IDEOGRAPH-6708     # 
+
+335E ; 0036 70B9 ;     SL      #* ( ㍞ → 6点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX → DIGIT SIX, CJK UNIFIED IDEOGRAPH-70B9 # 
+
+1D7D5 ;        0037 ;  SL      # ( 𝟕 → 7 ) MATHEMATICAL BOLD DIGIT SEVEN → DIGIT SEVEN  # 
+1D7DF ;        0037 ;  SL      # ( 𝟟 → 7 ) MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN → DIGIT SEVEN # 
+1D7E9 ;        0037 ;  SL      # ( 𝟩 → 7 ) MATHEMATICAL SANS-SERIF DIGIT SEVEN → DIGIT SEVEN    # 
+1D7F3 ;        0037 ;  SL      # ( 𝟳 → 7 ) MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN → DIGIT SEVEN       # 
+1D7FD ;        0037 ;  SL      # ( 𝟽 → 7 ) MATHEMATICAL MONOSPACE DIGIT SEVEN → DIGIT SEVEN     # 
+
+2466 ; 2786 ;  SL      #* ( ⑦ → ➆ ) CIRCLED DIGIT SEVEN → DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN       # 
+
+06F7 ; 0667 ;  SL      # ( ۷ → ‎٧‎ ) EXTENDED ARABIC-INDIC DIGIT SEVEN → ARABIC-INDIC DIGIT SEVEN    # 
+
+1F108 ;        0037 002C ;     SL      #* ( 🄈 → 7, ) DIGIT SEVEN COMMA → DIGIT SEVEN, COMMA     # 
+
+248E ; 0037 002E ;     SL      #* ( ⒎ → 7. ) DIGIT SEVEN FULL STOP → DIGIT SEVEN, FULL STOP      # 
+
+33E6 ; 0037 65E5 ;     SL      #* ( ㏦ → 7日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN → DIGIT SEVEN, CJK UNIFIED IDEOGRAPH-65E5      # 
+
+32C6 ; 0037 6708 ;     SL      #* ( ㋆ → 7月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY → DIGIT SEVEN, CJK UNIFIED IDEOGRAPH-6708   # 
+
+335F ; 0037 70B9 ;     SL      #* ( ㍟ → 7点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN → DIGIT SEVEN, CJK UNIFIED IDEOGRAPH-70B9     # 
+
+0B03 ; 0038 ;  SL      # ( ଃ → 8 ) ORIYA SIGN VISARGA → DIGIT EIGHT      # 
+09EA ; 0038 ;  SL      # ( ৪ → 8 ) BENGALI DIGIT FOUR → DIGIT EIGHT      # 
+0A6A ; 0038 ;  SL      # ( ੪ → 8 ) GURMUKHI DIGIT FOUR → DIGIT EIGHT     # 
+1D7D6 ;        0038 ;  SL      # ( 𝟖 → 8 ) MATHEMATICAL BOLD DIGIT EIGHT → DIGIT EIGHT  # 
+1D7E0 ;        0038 ;  SL      # ( 𝟠 → 8 ) MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT → DIGIT EIGHT # 
+1D7EA ;        0038 ;  SL      # ( 𝟪 → 8 ) MATHEMATICAL SANS-SERIF DIGIT EIGHT → DIGIT EIGHT    # 
+1D7F4 ;        0038 ;  SL      # ( 𝟴 → 8 ) MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT → DIGIT EIGHT       # 
+1D7FE ;        0038 ;  SL      # ( 𝟾 → 8 ) MATHEMATICAL MONOSPACE DIGIT EIGHT → DIGIT EIGHT     # 
+0223 ; 0038 ;  SL      # ( ȣ → 8 ) LATIN SMALL LETTER OU → DIGIT EIGHT    # 
+
+2467 ; 2787 ;  SL      #* ( ⑧ → ➇ ) CIRCLED DIGIT EIGHT → DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT       # 
+
+06F8 ; 0668 ;  SL      # ( ۸ → ‎٨‎ ) EXTENDED ARABIC-INDIC DIGIT EIGHT → ARABIC-INDIC DIGIT EIGHT    # 
+
+1F109 ;        0038 002C ;     SL      #* ( 🄉 → 8, ) DIGIT EIGHT COMMA → DIGIT EIGHT, COMMA     # 
+
+248F ; 0038 002E ;     SL      #* ( ⒏ → 8. ) DIGIT EIGHT FULL STOP → DIGIT EIGHT, FULL STOP      # 
+
+33E7 ; 0038 65E5 ;     SL      #* ( ㏧ → 8日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT → DIGIT EIGHT, CJK UNIFIED IDEOGRAPH-65E5      # 
+
+32C7 ; 0038 6708 ;     SL      #* ( ㋇ → 8月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST → DIGIT EIGHT, CJK UNIFIED IDEOGRAPH-6708 # 
+
+3360 ; 0038 70B9 ;     SL      #* ( ㍠ → 8点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT → DIGIT EIGHT, CJK UNIFIED IDEOGRAPH-70B9     # 
+
+0A67 ; 0039 ;  SL      # ( ੧ → 9 ) GURMUKHI DIGIT ONE → DIGIT NINE       # 
+0B68 ; 0039 ;  SL      # ( ୨ → 9 ) ORIYA DIGIT TWO → DIGIT NINE  # 
+09ED ; 0039 ;  SL      # ( ৭ → 9 ) BENGALI DIGIT SEVEN → DIGIT NINE      # 
+1D7D7 ;        0039 ;  SL      # ( 𝟗 → 9 ) MATHEMATICAL BOLD DIGIT NINE → DIGIT NINE    # 
+1D7E1 ;        0039 ;  SL      # ( 𝟡 → 9 ) MATHEMATICAL DOUBLE-STRUCK DIGIT NINE → DIGIT NINE   # 
+1D7EB ;        0039 ;  SL      # ( 𝟫 → 9 ) MATHEMATICAL SANS-SERIF DIGIT NINE → DIGIT NINE      # 
+1D7F5 ;        0039 ;  SL      # ( 𝟵 → 9 ) MATHEMATICAL SANS-SERIF BOLD DIGIT NINE → DIGIT NINE # 
+1D7FF ;        0039 ;  SL      # ( 𝟿 → 9 ) MATHEMATICAL MONOSPACE DIGIT NINE → DIGIT NINE       # 
+
+2468 ; 2788 ;  SL      #* ( ⑨ → ➈ ) CIRCLED DIGIT NINE → DINGBAT CIRCLED SANS-SERIF DIGIT NINE # 
+
+06F9 ; 0669 ;  SL      # ( ۹ → ‎٩‎ ) EXTENDED ARABIC-INDIC DIGIT NINE → ARABIC-INDIC DIGIT NINE      # 
+
+1F10A ;        0039 002C ;     SL      #* ( 🄊 → 9, ) DIGIT NINE COMMA → DIGIT NINE, COMMA       # 
+
+2490 ; 0039 002E ;     SL      #* ( ⒐ → 9. ) DIGIT NINE FULL STOP → DIGIT NINE, FULL STOP        # 
+
+33E8 ; 0039 65E5 ;     SL      #* ( ㏨ → 9日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE → DIGIT NINE, CJK UNIFIED IDEOGRAPH-65E5        # 
+
+32C8 ; 0039 6708 ;     SL      #* ( ㋈ → 9月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER → DIGIT NINE, CJK UNIFIED IDEOGRAPH-6708       # 
+
+3361 ; 0039 70B9 ;     SL      #* ( ㍡ → 9点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE → DIGIT NINE, CJK UNIFIED IDEOGRAPH-70B9       # 
+
+237A ; 0061 ;  SL      #* ( ⍺ → a ) APL FUNCTIONAL SYMBOL ALPHA → LATIN SMALL LETTER A   # →α→
+FF41 ; 0061 ;  SL      # ( a → a ) FULLWIDTH LATIN SMALL LETTER A → LATIN SMALL LETTER A # →а→
+1D41A ;        0061 ;  SL      # ( 𝐚 → a ) MATHEMATICAL BOLD SMALL A → LATIN SMALL LETTER A     # 
+1D44E ;        0061 ;  SL      # ( 𝑎 → a ) MATHEMATICAL ITALIC SMALL A → LATIN SMALL LETTER A   # 
+1D482 ;        0061 ;  SL      # ( 𝒂 → a ) MATHEMATICAL BOLD ITALIC SMALL A → LATIN SMALL LETTER A      # 
+1D4B6 ;        0061 ;  SL      # ( 𝒶 → a ) MATHEMATICAL SCRIPT SMALL A → LATIN SMALL LETTER A   # 
+1D4EA ;        0061 ;  SL      # ( 𝓪 → a ) MATHEMATICAL BOLD SCRIPT SMALL A → LATIN SMALL LETTER A      # 
+1D51E ;        0061 ;  SL      # ( 𝔞 → a ) MATHEMATICAL FRAKTUR SMALL A → LATIN SMALL LETTER A  # 
+1D552 ;        0061 ;  SL      # ( 𝕒 → a ) MATHEMATICAL DOUBLE-STRUCK SMALL A → LATIN SMALL LETTER A    # 
+1D586 ;        0061 ;  SL      # ( 𝖆 → a ) MATHEMATICAL BOLD FRAKTUR SMALL A → LATIN SMALL LETTER A     # 
+1D5BA ;        0061 ;  SL      # ( 𝖺 → a ) MATHEMATICAL SANS-SERIF SMALL A → LATIN SMALL LETTER A       # 
+1D5EE ;        0061 ;  SL      # ( 𝗮 → a ) MATHEMATICAL SANS-SERIF BOLD SMALL A → LATIN SMALL LETTER A  # 
+1D622 ;        0061 ;  SL      # ( 𝘢 → a ) MATHEMATICAL SANS-SERIF ITALIC SMALL A → LATIN SMALL LETTER A        # 
+1D656 ;        0061 ;  SL      # ( 𝙖 → a ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A → LATIN SMALL LETTER A   # 
+1D68A ;        0061 ;  SL      # ( 𝚊 → a ) MATHEMATICAL MONOSPACE SMALL A → LATIN SMALL LETTER A        # 
+0251 ; 0061 ;  SL      # ( ɑ → a ) LATIN SMALL LETTER ALPHA → LATIN SMALL LETTER A        # 
+1D6C2 ;        0061 ;  SL      # ( 𝛂 → a ) MATHEMATICAL BOLD SMALL ALPHA → LATIN SMALL LETTER A # →α→
+1D6FC ;        0061 ;  SL      # ( 𝛼 → a ) MATHEMATICAL ITALIC SMALL ALPHA → LATIN SMALL LETTER A       # →α→
+1D736 ;        0061 ;  SL      # ( 𝜶 → a ) MATHEMATICAL BOLD ITALIC SMALL ALPHA → LATIN SMALL LETTER A  # →α→
+1D770 ;        0061 ;  SL      # ( 𝝰 → a ) MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA → LATIN SMALL LETTER A      # →α→
+1D7AA ;        0061 ;  SL      # ( 𝞪 → a ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA → LATIN SMALL LETTER A       # →α→
+
+01CE ; 0103 ;  SL      # ( ǎ → ă ) LATIN SMALL LETTER A WITH CARON → LATIN SMALL LETTER A WITH BREVE     # 
+
+0227 ; 00E5 ;  SL      # ( ȧ → å ) LATIN SMALL LETTER A WITH DOT ABOVE → LATIN SMALL LETTER A WITH RING ABOVE    # 
+
+A733 ; 0061 0061 ;     SL      # ( ꜳ → aa ) LATIN SMALL LETTER AA → LATIN SMALL LETTER A, LATIN SMALL LETTER A   # 
+
+00E6 ; 0061 0065 ;     SL      # ( æ → ae ) LATIN SMALL LETTER AE → LATIN SMALL LETTER A, LATIN SMALL LETTER E    # 
+
+A735 ; 0061 006F ;     SL      # ( ꜵ → ao ) LATIN SMALL LETTER AO → LATIN SMALL LETTER A, LATIN SMALL LETTER O   # 
+
+A737 ; 0061 0075 ;     SL      # ( ꜷ → au ) LATIN SMALL LETTER AU → LATIN SMALL LETTER A, LATIN SMALL LETTER U   # 
+
+A739 ; 0061 0076 ;     SL      # ( ꜹ → av ) LATIN SMALL LETTER AV → LATIN SMALL LETTER A, LATIN SMALL LETTER V   # 
+A73B ; 0061 0076 ;     SL      # ( ꜻ → av ) LATIN SMALL LETTER AV WITH HORIZONTAL BAR → LATIN SMALL LETTER A, LATIN SMALL LETTER V       # 
+
+A73D ; 0061 0079 ;     SL      # ( ꜽ → ay ) LATIN SMALL LETTER AY → LATIN SMALL LETTER A, LATIN SMALL LETTER Y   # 
+
+1D41B ;        0062 ;  SL      # ( 𝐛 → b ) MATHEMATICAL BOLD SMALL B → LATIN SMALL LETTER B     # 
+1D44F ;        0062 ;  SL      # ( 𝑏 → b ) MATHEMATICAL ITALIC SMALL B → LATIN SMALL LETTER B   # 
+1D483 ;        0062 ;  SL      # ( 𝒃 → b ) MATHEMATICAL BOLD ITALIC SMALL B → LATIN SMALL LETTER B      # 
+1D4B7 ;        0062 ;  SL      # ( 𝒷 → b ) MATHEMATICAL SCRIPT SMALL B → LATIN SMALL LETTER B   # 
+1D4EB ;        0062 ;  SL      # ( 𝓫 → b ) MATHEMATICAL BOLD SCRIPT SMALL B → LATIN SMALL LETTER B      # 
+1D51F ;        0062 ;  SL      # ( 𝔟 → b ) MATHEMATICAL FRAKTUR SMALL B → LATIN SMALL LETTER B  # 
+1D553 ;        0062 ;  SL      # ( 𝕓 → b ) MATHEMATICAL DOUBLE-STRUCK SMALL B → LATIN SMALL LETTER B    # 
+1D587 ;        0062 ;  SL      # ( 𝖇 → b ) MATHEMATICAL BOLD FRAKTUR SMALL B → LATIN SMALL LETTER B     # 
+1D5BB ;        0062 ;  SL      # ( 𝖻 → b ) MATHEMATICAL SANS-SERIF SMALL B → LATIN SMALL LETTER B       # 
+1D5EF ;        0062 ;  SL      # ( 𝗯 → b ) MATHEMATICAL SANS-SERIF BOLD SMALL B → LATIN SMALL LETTER B  # 
+1D623 ;        0062 ;  SL      # ( 𝘣 → b ) MATHEMATICAL SANS-SERIF ITALIC SMALL B → LATIN SMALL LETTER B        # 
+1D657 ;        0062 ;  SL      # ( 𝙗 → b ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B → LATIN SMALL LETTER B   # 
+1D68B ;        0062 ;  SL      # ( 𝚋 → b ) MATHEMATICAL MONOSPACE SMALL B → LATIN SMALL LETTER B        # 
+
+0253 ; 0062 0314 ;     SL      # ( ɓ → b̔ ) LATIN SMALL LETTER B WITH HOOK → LATIN SMALL LETTER B, COMBINING REVERSED COMMA ABOVE        # 
+
+0183 ; 0062 0304 ;     SL      # ( ƃ → b̄ ) LATIN SMALL LETTER B WITH TOPBAR → LATIN SMALL LETTER B, COMBINING MACRON    # 
+
+0180 ; 0062 0335 ;     SL      # ( ƀ → b̵ ) LATIN SMALL LETTER B WITH STROKE → LATIN SMALL LETTER B, COMBINING SHORT STROKE OVERLAY      # 
+
+FF43 ; 0063 ;  SL      # ( c → c ) FULLWIDTH LATIN SMALL LETTER C → LATIN SMALL LETTER C # →ϲ→
+217D ; 0063 ;  SL      # ( ⅽ → c ) SMALL ROMAN NUMERAL ONE HUNDRED → LATIN SMALL LETTER C        # 
+1D41C ;        0063 ;  SL      # ( 𝐜 → c ) MATHEMATICAL BOLD SMALL C → LATIN SMALL LETTER C     # 
+1D450 ;        0063 ;  SL      # ( 𝑐 → c ) MATHEMATICAL ITALIC SMALL C → LATIN SMALL LETTER C   # 
+1D484 ;        0063 ;  SL      # ( 𝒄 → c ) MATHEMATICAL BOLD ITALIC SMALL C → LATIN SMALL LETTER C      # 
+1D4B8 ;        0063 ;  SL      # ( 𝒸 → c ) MATHEMATICAL SCRIPT SMALL C → LATIN SMALL LETTER C   # 
+1D4EC ;        0063 ;  SL      # ( 𝓬 → c ) MATHEMATICAL BOLD SCRIPT SMALL C → LATIN SMALL LETTER C      # 
+1D520 ;        0063 ;  SL      # ( 𝔠 → c ) MATHEMATICAL FRAKTUR SMALL C → LATIN SMALL LETTER C  # 
+1D554 ;        0063 ;  SL      # ( 𝕔 → c ) MATHEMATICAL DOUBLE-STRUCK SMALL C → LATIN SMALL LETTER C    # 
+1D588 ;        0063 ;  SL      # ( 𝖈 → c ) MATHEMATICAL BOLD FRAKTUR SMALL C → LATIN SMALL LETTER C     # 
+1D5BC ;        0063 ;  SL      # ( 𝖼 → c ) MATHEMATICAL SANS-SERIF SMALL C → LATIN SMALL LETTER C       # 
+1D5F0 ;        0063 ;  SL      # ( 𝗰 → c ) MATHEMATICAL SANS-SERIF BOLD SMALL C → LATIN SMALL LETTER C  # 
+1D624 ;        0063 ;  SL      # ( 𝘤 → c ) MATHEMATICAL SANS-SERIF ITALIC SMALL C → LATIN SMALL LETTER C        # 
+1D658 ;        0063 ;  SL      # ( 𝙘 → c ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C → LATIN SMALL LETTER C   # 
+1D68C ;        0063 ;  SL      # ( 𝚌 → c ) MATHEMATICAL MONOSPACE SMALL C → LATIN SMALL LETTER C        # 
+1D04 ; 0063 ;  SL      # ( ᴄ → c ) LATIN LETTER SMALL CAPITAL C → LATIN SMALL LETTER C   # 
+
+00A2 ; 0063 0338 ;     SL      #* ( ¢ → c̸ ) CENT SIGN → LATIN SMALL LETTER C, COMBINING LONG SOLIDUS OVERLAY    # 
+
+00E7 ; 0063 0326 ;     SL      # ( ç → c̦ ) LATIN SMALL LETTER C WITH CEDILLA → LATIN SMALL LETTER C, COMBINING COMMA BELOW      # →ҫ→→с̡→
+
+217E ; 0064 ;  SL      # ( ⅾ → d ) SMALL ROMAN NUMERAL FIVE HUNDRED → LATIN SMALL LETTER D       # 
+2146 ; 0064 ;  SL      # ( ⅆ → d ) DOUBLE-STRUCK ITALIC SMALL D → LATIN SMALL LETTER D   # 
+1D41D ;        0064 ;  SL      # ( 𝐝 → d ) MATHEMATICAL BOLD SMALL D → LATIN SMALL LETTER D     # 
+1D451 ;        0064 ;  SL      # ( 𝑑 → d ) MATHEMATICAL ITALIC SMALL D → LATIN SMALL LETTER D   # 
+1D485 ;        0064 ;  SL      # ( 𝒅 → d ) MATHEMATICAL BOLD ITALIC SMALL D → LATIN SMALL LETTER D      # 
+1D4B9 ;        0064 ;  SL      # ( 𝒹 → d ) MATHEMATICAL SCRIPT SMALL D → LATIN SMALL LETTER D   # 
+1D4ED ;        0064 ;  SL      # ( 𝓭 → d ) MATHEMATICAL BOLD SCRIPT SMALL D → LATIN SMALL LETTER D      # 
+1D521 ;        0064 ;  SL      # ( 𝔡 → d ) MATHEMATICAL FRAKTUR SMALL D → LATIN SMALL LETTER D  # 
+1D555 ;        0064 ;  SL      # ( 𝕕 → d ) MATHEMATICAL DOUBLE-STRUCK SMALL D → LATIN SMALL LETTER D    # 
+1D589 ;        0064 ;  SL      # ( 𝖉 → d ) MATHEMATICAL BOLD FRAKTUR SMALL D → LATIN SMALL LETTER D     # 
+1D5BD ;        0064 ;  SL      # ( 𝖽 → d ) MATHEMATICAL SANS-SERIF SMALL D → LATIN SMALL LETTER D       # 
+1D5F1 ;        0064 ;  SL      # ( 𝗱 → d ) MATHEMATICAL SANS-SERIF BOLD SMALL D → LATIN SMALL LETTER D  # 
+1D625 ;        0064 ;  SL      # ( 𝘥 → d ) MATHEMATICAL SANS-SERIF ITALIC SMALL D → LATIN SMALL LETTER D        # 
+1D659 ;        0064 ;  SL      # ( 𝙙 → d ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D → LATIN SMALL LETTER D   # 
+1D68D ;        0064 ;  SL      # ( 𝚍 → d ) MATHEMATICAL MONOSPACE SMALL D → LATIN SMALL LETTER D        # 
+
+0257 ; 0064 0314 ;     SL      # ( ɗ → d̔ ) LATIN SMALL LETTER D WITH HOOK → LATIN SMALL LETTER D, COMBINING REVERSED COMMA ABOVE        # 
+
+0256 ; 0064 0328 ;     SL      # ( ɖ → d̨ ) LATIN SMALL LETTER D WITH TAIL → LATIN SMALL LETTER D, COMBINING OGONEK      # →d̢→
+
+018C ; 0064 0304 ;     SL      # ( ƌ → d̄ ) LATIN SMALL LETTER D WITH TOPBAR → LATIN SMALL LETTER D, COMBINING MACRON    # 
+
+0111 ; 0064 0335 ;     SL      # ( đ → d̵ ) LATIN SMALL LETTER D WITH STROKE → LATIN SMALL LETTER D, COMBINING SHORT STROKE OVERLAY      # 
+
+20AB ; 0064 0335 0331 ;        SL      #* ( ₫ → ḏ̵ ) DONG SIGN → LATIN SMALL LETTER D, COMBINING SHORT STROKE OVERLAY, COMBINING MACRON BELOW # →đ̱→
+
+01F3 ; 0064 007A ;     SL      # ( dz → dz ) LATIN SMALL LETTER DZ → LATIN SMALL LETTER D, LATIN SMALL LETTER Z    # 
+02A3 ; 0064 007A ;     SL      # ( ʣ → dz ) LATIN SMALL LETTER DZ DIGRAPH → LATIN SMALL LETTER D, LATIN SMALL LETTER Z    # 
+
+01C6 ; 0064 017E ;     SL      # ( dž → dž ) LATIN SMALL LETTER DZ WITH CARON → LATIN SMALL LETTER D, LATIN SMALL LETTER Z WITH CARON     # 
+
+02A5 ; 0064 0291 ;     SL      # ( ʥ → dʑ ) LATIN SMALL LETTER DZ DIGRAPH WITH CURL → LATIN SMALL LETTER D, LATIN SMALL LETTER Z WITH CURL       # 
+
+02A4 ; 0064 021D ;     SL      # ( ʤ → dȝ ) LATIN SMALL LETTER DEZH DIGRAPH → LATIN SMALL LETTER D, LATIN SMALL LETTER YOGH      # →dʒ→
+
+1D6C5 ;        1E9F ;  SL      # ( 𝛅 → ẟ ) MATHEMATICAL BOLD SMALL DELTA → LATIN SMALL LETTER DELTA   # →δ→
+1D6FF ;        1E9F ;  SL      # ( 𝛿 → ẟ ) MATHEMATICAL ITALIC SMALL DELTA → LATIN SMALL LETTER DELTA # →δ→
+1D739 ;        1E9F ;  SL      # ( 𝜹 → ẟ ) MATHEMATICAL BOLD ITALIC SMALL DELTA → LATIN SMALL LETTER DELTA    # →δ→
+1D773 ;        1E9F ;  SL      # ( 𝝳 → ẟ ) MATHEMATICAL SANS-SERIF BOLD SMALL DELTA → LATIN SMALL LETTER DELTA        # →δ→
+1D7AD ;        1E9F ;  SL      # ( 𝞭 → ẟ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA → LATIN SMALL LETTER DELTA # →δ→
+
+212E ; 0065 ;  SL      # ( ℮ → e ) ESTIMATED SYMBOL → LATIN SMALL LETTER E       # 
+FF45 ; 0065 ;  SL      # ( e → e ) FULLWIDTH LATIN SMALL LETTER E → LATIN SMALL LETTER E # →е→
+212F ; 0065 ;  SL      # ( ℯ → e ) SCRIPT SMALL E → LATIN SMALL LETTER E # 
+2147 ; 0065 ;  SL      # ( ⅇ → e ) DOUBLE-STRUCK ITALIC SMALL E → LATIN SMALL LETTER E   # 
+1D41E ;        0065 ;  SL      # ( 𝐞 → e ) MATHEMATICAL BOLD SMALL E → LATIN SMALL LETTER E     # 
+1D452 ;        0065 ;  SL      # ( 𝑒 → e ) MATHEMATICAL ITALIC SMALL E → LATIN SMALL LETTER E   # 
+1D486 ;        0065 ;  SL      # ( 𝒆 → e ) MATHEMATICAL BOLD ITALIC SMALL E → LATIN SMALL LETTER E      # 
+1D4EE ;        0065 ;  SL      # ( 𝓮 → e ) MATHEMATICAL BOLD SCRIPT SMALL E → LATIN SMALL LETTER E      # 
+1D522 ;        0065 ;  SL      # ( 𝔢 → e ) MATHEMATICAL FRAKTUR SMALL E → LATIN SMALL LETTER E  # 
+1D556 ;        0065 ;  SL      # ( 𝕖 → e ) MATHEMATICAL DOUBLE-STRUCK SMALL E → LATIN SMALL LETTER E    # 
+1D58A ;        0065 ;  SL      # ( 𝖊 → e ) MATHEMATICAL BOLD FRAKTUR SMALL E → LATIN SMALL LETTER E     # 
+1D5BE ;        0065 ;  SL      # ( 𝖾 → e ) MATHEMATICAL SANS-SERIF SMALL E → LATIN SMALL LETTER E       # 
+1D5F2 ;        0065 ;  SL      # ( 𝗲 → e ) MATHEMATICAL SANS-SERIF BOLD SMALL E → LATIN SMALL LETTER E  # 
+1D626 ;        0065 ;  SL      # ( 𝘦 → e ) MATHEMATICAL SANS-SERIF ITALIC SMALL E → LATIN SMALL LETTER E        # 
+1D65A ;        0065 ;  SL      # ( 𝙚 → e ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E → LATIN SMALL LETTER E   # 
+1D68E ;        0065 ;  SL      # ( 𝚎 → e ) MATHEMATICAL MONOSPACE SMALL E → LATIN SMALL LETTER E        # 
+
+011B ; 0115 ;  SL      # ( ě → ĕ ) LATIN SMALL LETTER E WITH CARON → LATIN SMALL LETTER E WITH BREVE     # 
+
+0259 ; 01DD ;  SL      # ( ə → ǝ ) LATIN SMALL LETTER SCHWA → LATIN SMALL LETTER TURNED E        # 
+
+025A ; 01DD 02DE ;     SL      # ( ɚ → ǝ˞ ) LATIN SMALL LETTER SCHWA WITH HOOK → LATIN SMALL LETTER TURNED E, MODIFIER LETTER RHOTIC HOOK       # →ə˞→
+
+1D14 ; 01DD 006F ;     SL      # ( ᴔ → ǝo ) LATIN SMALL LETTER TURNED OE → LATIN SMALL LETTER TURNED E, LATIN SMALL LETTER O    # →əo→
+
+22F4 ; 025B ;  SL      #* ( ⋴ → ɛ ) SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE → LATIN SMALL LETTER OPEN E  # 
+1D6C6 ;        025B ;  SL      # ( 𝛆 → ɛ ) MATHEMATICAL BOLD SMALL EPSILON → LATIN SMALL LETTER OPEN E # →ε→
+1D6DC ;        025B ;  SL      # ( 𝛜 → ɛ ) MATHEMATICAL BOLD EPSILON SYMBOL → LATIN SMALL LETTER OPEN E        # →ε→
+1D700 ;        025B ;  SL      # ( 𝜀 → ɛ ) MATHEMATICAL ITALIC SMALL EPSILON → LATIN SMALL LETTER OPEN E       # →ε→
+1D716 ;        025B ;  SL      # ( 𝜖 → ɛ ) MATHEMATICAL ITALIC EPSILON SYMBOL → LATIN SMALL LETTER OPEN E      # →ε→
+1D73A ;        025B ;  SL      # ( 𝜺 → ɛ ) MATHEMATICAL BOLD ITALIC SMALL EPSILON → LATIN SMALL LETTER OPEN E  # →ε→
+1D750 ;        025B ;  SL      # ( 𝝐 → ɛ ) MATHEMATICAL BOLD ITALIC EPSILON SYMBOL → LATIN SMALL LETTER OPEN E # →ε→
+1D774 ;        025B ;  SL      # ( 𝝴 → ɛ ) MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON → LATIN SMALL LETTER OPEN E      # →ε→
+1D78A ;        025B ;  SL      # ( 𝞊 → ɛ ) MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL → LATIN SMALL LETTER OPEN E     # →ε→
+1D7AE ;        025B ;  SL      # ( 𝞮 → ɛ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON → LATIN SMALL LETTER OPEN E       # →ε→
+1D7C4 ;        025B ;  SL      # ( 𝟄 → ɛ ) MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL → LATIN SMALL LETTER OPEN E      # →ε→
+
+20AC ; 2107 ;  SL      #* ( € → ℇ ) EURO SIGN → EULER CONSTANT # →Є→
+
+1D9F ; 1D4B ;  SL      # ( ᶟ → ᵋ ) MODIFIER LETTER SMALL REVERSED OPEN E → MODIFIER LETTER SMALL OPEN E        # 
+
+1D08 ; 025C ;  SL      # ( ᴈ → ɜ ) LATIN SMALL LETTER TURNED OPEN E → LATIN SMALL LETTER REVERSED OPEN E        # 
+
+1D41F ;        0066 ;  SL      # ( 𝐟 → f ) MATHEMATICAL BOLD SMALL F → LATIN SMALL LETTER F     # 
+1D453 ;        0066 ;  SL      # ( 𝑓 → f ) MATHEMATICAL ITALIC SMALL F → LATIN SMALL LETTER F   # 
+1D487 ;        0066 ;  SL      # ( 𝒇 → f ) MATHEMATICAL BOLD ITALIC SMALL F → LATIN SMALL LETTER F      # 
+1D4BB ;        0066 ;  SL      # ( 𝒻 → f ) MATHEMATICAL SCRIPT SMALL F → LATIN SMALL LETTER F   # 
+1D4EF ;        0066 ;  SL      # ( 𝓯 → f ) MATHEMATICAL BOLD SCRIPT SMALL F → LATIN SMALL LETTER F      # 
+1D523 ;        0066 ;  SL      # ( 𝔣 → f ) MATHEMATICAL FRAKTUR SMALL F → LATIN SMALL LETTER F  # 
+1D557 ;        0066 ;  SL      # ( 𝕗 → f ) MATHEMATICAL DOUBLE-STRUCK SMALL F → LATIN SMALL LETTER F    # 
+1D58B ;        0066 ;  SL      # ( 𝖋 → f ) MATHEMATICAL BOLD FRAKTUR SMALL F → LATIN SMALL LETTER F     # 
+1D5BF ;        0066 ;  SL      # ( 𝖿 → f ) MATHEMATICAL SANS-SERIF SMALL F → LATIN SMALL LETTER F       # 
+1D5F3 ;        0066 ;  SL      # ( 𝗳 → f ) MATHEMATICAL SANS-SERIF BOLD SMALL F → LATIN SMALL LETTER F  # 
+1D627 ;        0066 ;  SL      # ( 𝘧 → f ) MATHEMATICAL SANS-SERIF ITALIC SMALL F → LATIN SMALL LETTER F        # 
+1D65B ;        0066 ;  SL      # ( 𝙛 → f ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F → LATIN SMALL LETTER F   # 
+1D68F ;        0066 ;  SL      # ( 𝚏 → f ) MATHEMATICAL MONOSPACE SMALL F → LATIN SMALL LETTER F        # 
+1E9D ; 0066 ;  SL      # ( ẝ → f ) LATIN SMALL LETTER LONG S WITH HIGH STROKE → LATIN SMALL LETTER F     # 
+
+0192 ; 0066 0326 ;     SL      # ( ƒ → f̦ ) LATIN SMALL LETTER F WITH HOOK → LATIN SMALL LETTER F, COMBINING COMMA BELOW # →f̡→
+
+02A9 ; 0066 014B ;     SL      # ( ʩ → fŋ ) LATIN SMALL LETTER FENG DIGRAPH → LATIN SMALL LETTER F, LATIN SMALL LETTER ENG       # 
+
+FF47 ; 0067 ;  SL      # ( g → g ) FULLWIDTH LATIN SMALL LETTER G → LATIN SMALL LETTER G # →ɡ→
+210A ; 0067 ;  SL      # ( ℊ → g ) SCRIPT SMALL G → LATIN SMALL LETTER G # 
+1D420 ;        0067 ;  SL      # ( 𝐠 → g ) MATHEMATICAL BOLD SMALL G → LATIN SMALL LETTER G     # 
+1D454 ;        0067 ;  SL      # ( 𝑔 → g ) MATHEMATICAL ITALIC SMALL G → LATIN SMALL LETTER G   # 
+1D488 ;        0067 ;  SL      # ( 𝒈 → g ) MATHEMATICAL BOLD ITALIC SMALL G → LATIN SMALL LETTER G      # 
+1D4F0 ;        0067 ;  SL      # ( 𝓰 → g ) MATHEMATICAL BOLD SCRIPT SMALL G → LATIN SMALL LETTER G      # 
+1D524 ;        0067 ;  SL      # ( 𝔤 → g ) MATHEMATICAL FRAKTUR SMALL G → LATIN SMALL LETTER G  # 
+1D558 ;        0067 ;  SL      # ( 𝕘 → g ) MATHEMATICAL DOUBLE-STRUCK SMALL G → LATIN SMALL LETTER G    # 
+1D58C ;        0067 ;  SL      # ( 𝖌 → g ) MATHEMATICAL BOLD FRAKTUR SMALL G → LATIN SMALL LETTER G     # 
+1D5C0 ;        0067 ;  SL      # ( 𝗀 → g ) MATHEMATICAL SANS-SERIF SMALL G → LATIN SMALL LETTER G       # 
+1D5F4 ;        0067 ;  SL      # ( 𝗴 → g ) MATHEMATICAL SANS-SERIF BOLD SMALL G → LATIN SMALL LETTER G  # 
+1D628 ;        0067 ;  SL      # ( 𝘨 → g ) MATHEMATICAL SANS-SERIF ITALIC SMALL G → LATIN SMALL LETTER G        # 
+1D65C ;        0067 ;  SL      # ( 𝙜 → g ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G → LATIN SMALL LETTER G   # 
+1D690 ;        0067 ;  SL      # ( 𝚐 → g ) MATHEMATICAL MONOSPACE SMALL G → LATIN SMALL LETTER G        # 
+0261 ; 0067 ;  SL      # ( ɡ → g ) LATIN SMALL LETTER SCRIPT G → LATIN SMALL LETTER G     # 
+1D83 ; 0067 ;  SL      # ( ᶃ → g ) LATIN SMALL LETTER G WITH PALATAL HOOK → LATIN SMALL LETTER G # 
+018D ; 0067 ;  SL      # ( ƍ → g ) LATIN SMALL LETTER TURNED DELTA → LATIN SMALL LETTER G # 
+
+1DA2 ; 1D4D ;  SL      # ( ᶢ → ᵍ ) MODIFIER LETTER SMALL SCRIPT G → MODIFIER LETTER SMALL G    # 
+
+0260 ; 0067 0314 ;     SL      # ( ɠ → g̔ ) LATIN SMALL LETTER G WITH HOOK → LATIN SMALL LETTER G, COMBINING REVERSED COMMA ABOVE        # 
+
+01E7 ; 011F ;  SL      # ( ǧ → ğ ) LATIN SMALL LETTER G WITH CARON → LATIN SMALL LETTER G WITH BREVE     # 
+
+01F5 ; 0123 ;  SL      # ( ǵ → ģ ) LATIN SMALL LETTER G WITH ACUTE → LATIN SMALL LETTER G WITH CEDILLA   # 
+
+01E5 ; 0067 0335 ;     SL      # ( ǥ → g̵ ) LATIN SMALL LETTER G WITH STROKE → LATIN SMALL LETTER G, COMBINING SHORT STROKE OVERLAY      # 
+
+FF48 ; 0068 ;  SL      # ( h → h ) FULLWIDTH LATIN SMALL LETTER H → LATIN SMALL LETTER H # →һ→
+210E ; 0068 ;  SL      # ( ℎ → h ) PLANCK CONSTANT → LATIN SMALL LETTER H        # 
+1D421 ;        0068 ;  SL      # ( 𝐡 → h ) MATHEMATICAL BOLD SMALL H → LATIN SMALL LETTER H     # 
+1D489 ;        0068 ;  SL      # ( 𝒉 → h ) MATHEMATICAL BOLD ITALIC SMALL H → LATIN SMALL LETTER H      # 
+1D4BD ;        0068 ;  SL      # ( 𝒽 → h ) MATHEMATICAL SCRIPT SMALL H → LATIN SMALL LETTER H   # 
+1D4F1 ;        0068 ;  SL      # ( 𝓱 → h ) MATHEMATICAL BOLD SCRIPT SMALL H → LATIN SMALL LETTER H      # 
+1D525 ;        0068 ;  SL      # ( 𝔥 → h ) MATHEMATICAL FRAKTUR SMALL H → LATIN SMALL LETTER H  # 
+1D559 ;        0068 ;  SL      # ( 𝕙 → h ) MATHEMATICAL DOUBLE-STRUCK SMALL H → LATIN SMALL LETTER H    # 
+1D58D ;        0068 ;  SL      # ( 𝖍 → h ) MATHEMATICAL BOLD FRAKTUR SMALL H → LATIN SMALL LETTER H     # 
+1D5C1 ;        0068 ;  SL      # ( 𝗁 → h ) MATHEMATICAL SANS-SERIF SMALL H → LATIN SMALL LETTER H       # 
+1D5F5 ;        0068 ;  SL      # ( 𝗵 → h ) MATHEMATICAL SANS-SERIF BOLD SMALL H → LATIN SMALL LETTER H  # 
+1D629 ;        0068 ;  SL      # ( 𝘩 → h ) MATHEMATICAL SANS-SERIF ITALIC SMALL H → LATIN SMALL LETTER H        # 
+1D65D ;        0068 ;  SL      # ( 𝙝 → h ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H → LATIN SMALL LETTER H   # 
+1D691 ;        0068 ;  SL      # ( 𝚑 → h ) MATHEMATICAL MONOSPACE SMALL H → LATIN SMALL LETTER H        # 
+
+0266 ; 0068 0314 ;     SL      # ( ɦ → h̔ ) LATIN SMALL LETTER H WITH HOOK → LATIN SMALL LETTER H, COMBINING REVERSED COMMA ABOVE        # 
+
+0127 ; 0068 0335 ;     SL      # ( ħ → h̵ ) LATIN SMALL LETTER H WITH STROKE → LATIN SMALL LETTER H, COMBINING SHORT STROKE OVERLAY      # 
+210F ; 0068 0335 ;     SL      # ( ℏ → h̵ ) PLANCK CONSTANT OVER TWO PI → LATIN SMALL LETTER H, COMBINING SHORT STROKE OVERLAY  # →ħ→
+
+02DB ; 0069 ;  SL      #* ( ˛ → i ) OGONEK → LATIN SMALL LETTER I # →ͺ→→ι→→ι→
+2373 ; 0069 ;  SL      #* ( ⍳ → i ) APL FUNCTIONAL SYMBOL IOTA → LATIN SMALL LETTER I    # →ι→
+FF49 ; 0069 ;  SL      # ( i → i ) FULLWIDTH LATIN SMALL LETTER I → LATIN SMALL LETTER I # →і→
+2170 ; 0069 ;  SL      # ( ⅰ → i ) SMALL ROMAN NUMERAL ONE → LATIN SMALL LETTER I        # 
+2139 ; 0069 ;  SL      # ( ℹ → i ) INFORMATION SOURCE → LATIN SMALL LETTER I     # 
+2148 ; 0069 ;  SL      # ( ⅈ → i ) DOUBLE-STRUCK ITALIC SMALL I → LATIN SMALL LETTER I   # 
+1D422 ;        0069 ;  SL      # ( 𝐢 → i ) MATHEMATICAL BOLD SMALL I → LATIN SMALL LETTER I     # 
+1D456 ;        0069 ;  SL      # ( 𝑖 → i ) MATHEMATICAL ITALIC SMALL I → LATIN SMALL LETTER I   # 
+1D48A ;        0069 ;  SL      # ( 𝒊 → i ) MATHEMATICAL BOLD ITALIC SMALL I → LATIN SMALL LETTER I      # 
+1D4BE ;        0069 ;  SL      # ( 𝒾 → i ) MATHEMATICAL SCRIPT SMALL I → LATIN SMALL LETTER I   # 
+1D4F2 ;        0069 ;  SL      # ( 𝓲 → i ) MATHEMATICAL BOLD SCRIPT SMALL I → LATIN SMALL LETTER I      # 
+1D526 ;        0069 ;  SL      # ( 𝔦 → i ) MATHEMATICAL FRAKTUR SMALL I → LATIN SMALL LETTER I  # 
+1D55A ;        0069 ;  SL      # ( 𝕚 → i ) MATHEMATICAL DOUBLE-STRUCK SMALL I → LATIN SMALL LETTER I    # 
+1D58E ;        0069 ;  SL      # ( 𝖎 → i ) MATHEMATICAL BOLD FRAKTUR SMALL I → LATIN SMALL LETTER I     # 
+1D5C2 ;        0069 ;  SL      # ( 𝗂 → i ) MATHEMATICAL SANS-SERIF SMALL I → LATIN SMALL LETTER I       # 
+1D5F6 ;        0069 ;  SL      # ( 𝗶 → i ) MATHEMATICAL SANS-SERIF BOLD SMALL I → LATIN SMALL LETTER I  # 
+1D62A ;        0069 ;  SL      # ( 𝘪 → i ) MATHEMATICAL SANS-SERIF ITALIC SMALL I → LATIN SMALL LETTER I        # 
+1D65E ;        0069 ;  SL      # ( 𝙞 → i ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I → LATIN SMALL LETTER I   # 
+1D692 ;        0069 ;  SL      # ( 𝚒 → i ) MATHEMATICAL MONOSPACE SMALL I → LATIN SMALL LETTER I        # 
+0131 ; 0069 ;  SL      # ( ı → i ) LATIN SMALL LETTER DOTLESS I → LATIN SMALL LETTER I    # 
+1D6A4 ;        0069 ;  SL      # ( 𝚤 → i ) MATHEMATICAL ITALIC SMALL DOTLESS I → LATIN SMALL LETTER I   # →ı→
+026A ; 0069 ;  SL      # ( ɪ → i ) LATIN LETTER SMALL CAPITAL I → LATIN SMALL LETTER I    # →ı→
+0269 ; 0069 ;  SL      # ( ɩ → i ) LATIN SMALL LETTER IOTA → LATIN SMALL LETTER I # 
+1D6CA ;        0069 ;  SL      # ( 𝛊 → i ) MATHEMATICAL BOLD SMALL IOTA → LATIN SMALL LETTER I  # →ι→
+1D704 ;        0069 ;  SL      # ( 𝜄 → i ) MATHEMATICAL ITALIC SMALL IOTA → LATIN SMALL LETTER I        # →ι→
+1D73E ;        0069 ;  SL      # ( 𝜾 → i ) MATHEMATICAL BOLD ITALIC SMALL IOTA → LATIN SMALL LETTER I   # →ι→
+1D778 ;        0069 ;  SL      # ( 𝝸 → i ) MATHEMATICAL SANS-SERIF BOLD SMALL IOTA → LATIN SMALL LETTER I       # →ι→
+1D7B2 ;        0069 ;  SL      # ( 𝞲 → i ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA → LATIN SMALL LETTER I        # →ι→
+
+01D0 ; 012D ;  SL      # ( ǐ → ĭ ) LATIN SMALL LETTER I WITH CARON → LATIN SMALL LETTER I WITH BREVE     # 
+
+0268 ; 0069 0335 ;     SL      # ( ɨ → i̵ ) LATIN SMALL LETTER I WITH STROKE → LATIN SMALL LETTER I, COMBINING SHORT STROKE OVERLAY      # 
+
+2171 ; 0069 0069 ;     SL      # ( ⅱ → ii ) SMALL ROMAN NUMERAL TWO → LATIN SMALL LETTER I, LATIN SMALL LETTER I # 
+
+2172 ; 0069 0069 0069 ;        SL      # ( ⅲ → iii ) SMALL ROMAN NUMERAL THREE → LATIN SMALL LETTER I, LATIN SMALL LETTER I, LATIN SMALL LETTER I        # 
+
+0133 ; 0069 006A ;     SL      # ( ij → ij ) LATIN SMALL LIGATURE IJ → LATIN SMALL LETTER I, LATIN SMALL LETTER J  # 
+
+2173 ; 0069 0076 ;     SL      # ( ⅳ → iv ) SMALL ROMAN NUMERAL FOUR → LATIN SMALL LETTER I, LATIN SMALL LETTER V        # 
+
+2178 ; 0069 0078 ;     SL      # ( ⅸ → ix ) SMALL ROMAN NUMERAL NINE → LATIN SMALL LETTER I, LATIN SMALL LETTER X        # 
+
+FF4A ; 006A ;  SL      # ( j → j ) FULLWIDTH LATIN SMALL LETTER J → LATIN SMALL LETTER J # →ј→
+2149 ; 006A ;  SL      # ( ⅉ → j ) DOUBLE-STRUCK ITALIC SMALL J → LATIN SMALL LETTER J   # 
+1D423 ;        006A ;  SL      # ( 𝐣 → j ) MATHEMATICAL BOLD SMALL J → LATIN SMALL LETTER J     # 
+1D457 ;        006A ;  SL      # ( 𝑗 → j ) MATHEMATICAL ITALIC SMALL J → LATIN SMALL LETTER J   # 
+1D48B ;        006A ;  SL      # ( 𝒋 → j ) MATHEMATICAL BOLD ITALIC SMALL J → LATIN SMALL LETTER J      # 
+1D4BF ;        006A ;  SL      # ( 𝒿 → j ) MATHEMATICAL SCRIPT SMALL J → LATIN SMALL LETTER J   # 
+1D4F3 ;        006A ;  SL      # ( 𝓳 → j ) MATHEMATICAL BOLD SCRIPT SMALL J → LATIN SMALL LETTER J      # 
+1D527 ;        006A ;  SL      # ( 𝔧 → j ) MATHEMATICAL FRAKTUR SMALL J → LATIN SMALL LETTER J  # 
+1D55B ;        006A ;  SL      # ( 𝕛 → j ) MATHEMATICAL DOUBLE-STRUCK SMALL J → LATIN SMALL LETTER J    # 
+1D58F ;        006A ;  SL      # ( 𝖏 → j ) MATHEMATICAL BOLD FRAKTUR SMALL J → LATIN SMALL LETTER J     # 
+1D5C3 ;        006A ;  SL      # ( 𝗃 → j ) MATHEMATICAL SANS-SERIF SMALL J → LATIN SMALL LETTER J       # 
+1D5F7 ;        006A ;  SL      # ( 𝗷 → j ) MATHEMATICAL SANS-SERIF BOLD SMALL J → LATIN SMALL LETTER J  # 
+1D62B ;        006A ;  SL      # ( 𝘫 → j ) MATHEMATICAL SANS-SERIF ITALIC SMALL J → LATIN SMALL LETTER J        # 
+1D65F ;        006A ;  SL      # ( 𝙟 → j ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J → LATIN SMALL LETTER J   # 
+1D693 ;        006A ;  SL      # ( 𝚓 → j ) MATHEMATICAL MONOSPACE SMALL J → LATIN SMALL LETTER J        # 
+0237 ; 006A ;  SL      # ( ȷ → j ) LATIN SMALL LETTER DOTLESS J → LATIN SMALL LETTER J    # →յ→
+1D6A5 ;        006A ;  SL      # ( 𝚥 → j ) MATHEMATICAL ITALIC SMALL DOTLESS J → LATIN SMALL LETTER J   # →ȷ→→յ→
+
+1D424 ;        006B ;  SL      # ( 𝐤 → k ) MATHEMATICAL BOLD SMALL K → LATIN SMALL LETTER K     # 
+1D458 ;        006B ;  SL      # ( 𝑘 → k ) MATHEMATICAL ITALIC SMALL K → LATIN SMALL LETTER K   # 
+1D48C ;        006B ;  SL      # ( 𝒌 → k ) MATHEMATICAL BOLD ITALIC SMALL K → LATIN SMALL LETTER K      # 
+1D4C0 ;        006B ;  SL      # ( 𝓀 → k ) MATHEMATICAL SCRIPT SMALL K → LATIN SMALL LETTER K   # 
+1D4F4 ;        006B ;  SL      # ( 𝓴 → k ) MATHEMATICAL BOLD SCRIPT SMALL K → LATIN SMALL LETTER K      # 
+1D528 ;        006B ;  SL      # ( 𝔨 → k ) MATHEMATICAL FRAKTUR SMALL K → LATIN SMALL LETTER K  # 
+1D55C ;        006B ;  SL      # ( 𝕜 → k ) MATHEMATICAL DOUBLE-STRUCK SMALL K → LATIN SMALL LETTER K    # 
+1D590 ;        006B ;  SL      # ( 𝖐 → k ) MATHEMATICAL BOLD FRAKTUR SMALL K → LATIN SMALL LETTER K     # 
+1D5C4 ;        006B ;  SL      # ( 𝗄 → k ) MATHEMATICAL SANS-SERIF SMALL K → LATIN SMALL LETTER K       # 
+1D5F8 ;        006B ;  SL      # ( 𝗸 → k ) MATHEMATICAL SANS-SERIF BOLD SMALL K → LATIN SMALL LETTER K  # 
+1D62C ;        006B ;  SL      # ( 𝘬 → k ) MATHEMATICAL SANS-SERIF ITALIC SMALL K → LATIN SMALL LETTER K        # 
+1D660 ;        006B ;  SL      # ( 𝙠 → k ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K → LATIN SMALL LETTER K   # 
+1D694 ;        006B ;  SL      # ( 𝚔 → k ) MATHEMATICAL MONOSPACE SMALL K → LATIN SMALL LETTER K        # 
+1D0B ; 006B ;  SL      # ( ᴋ → k ) LATIN LETTER SMALL CAPITAL K → LATIN SMALL LETTER K   # →к→
+0138 ; 006B ;  SL      # ( ĸ → k ) LATIN SMALL LETTER KRA → LATIN SMALL LETTER K  # →к→
+1D6CB ;        006B ;  SL      # ( 𝛋 → k ) MATHEMATICAL BOLD SMALL KAPPA → LATIN SMALL LETTER K # →κ→→к→
+1D6DE ;        006B ;  SL      # ( 𝛞 → k ) MATHEMATICAL BOLD KAPPA SYMBOL → LATIN SMALL LETTER K        # →κ→→к→
+1D705 ;        006B ;  SL      # ( 𝜅 → k ) MATHEMATICAL ITALIC SMALL KAPPA → LATIN SMALL LETTER K       # →κ→→к→
+1D718 ;        006B ;  SL      # ( 𝜘 → k ) MATHEMATICAL ITALIC KAPPA SYMBOL → LATIN SMALL LETTER K      # →κ→→к→
+1D73F ;        006B ;  SL      # ( 𝜿 → k ) MATHEMATICAL BOLD ITALIC SMALL KAPPA → LATIN SMALL LETTER K  # →κ→→к→
+1D752 ;        006B ;  SL      # ( 𝝒 → k ) MATHEMATICAL BOLD ITALIC KAPPA SYMBOL → LATIN SMALL LETTER K # →κ→→к→
+1D779 ;        006B ;  SL      # ( 𝝹 → k ) MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA → LATIN SMALL LETTER K      # →κ→→к→
+1D78C ;        006B ;  SL      # ( 𝞌 → k ) MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL → LATIN SMALL LETTER K     # →κ→→к→
+1D7B3 ;        006B ;  SL      # ( 𝞳 → k ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA → LATIN SMALL LETTER K       # →κ→→к→
+1D7C6 ;        006B ;  SL      # ( 𝟆 → k ) MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL → LATIN SMALL LETTER K      # →κ→→к→
+
+0199 ; 006B 0314 ;     SL      # ( ƙ → k̔ ) LATIN SMALL LETTER K WITH HOOK → LATIN SMALL LETTER K, COMBINING REVERSED COMMA ABOVE        # 
+
+007C ; 006C ;  SL      #* ( | → l ) VERTICAL LINE → LATIN SMALL LETTER L   # 
+2223 ; 006C ;  SL      #* ( ∣ → l ) DIVIDES → LATIN SMALL LETTER L       # →|→
+FFE8 ; 006C ;  SL      #* ( │ → l ) HALFWIDTH FORMS LIGHT VERTICAL → LATIN SMALL LETTER L        # →|→
+0031 ; 006C ;  SL      # ( 1 → l ) DIGIT ONE → LATIN SMALL LETTER L        # 
+1D7CF ;        006C ;  SL      # ( 𝟏 → l ) MATHEMATICAL BOLD DIGIT ONE → LATIN SMALL LETTER L   # →1→
+1D7D9 ;        006C ;  SL      # ( 𝟙 → l ) MATHEMATICAL DOUBLE-STRUCK DIGIT ONE → LATIN SMALL LETTER L  # →1→
+1D7E3 ;        006C ;  SL      # ( 𝟣 → l ) MATHEMATICAL SANS-SERIF DIGIT ONE → LATIN SMALL LETTER L     # →1→
+1D7ED ;        006C ;  SL      # ( 𝟭 → l ) MATHEMATICAL SANS-SERIF BOLD DIGIT ONE → LATIN SMALL LETTER L        # →1→
+1D7F7 ;        006C ;  SL      # ( 𝟷 → l ) MATHEMATICAL MONOSPACE DIGIT ONE → LATIN SMALL LETTER L      # →1→
+2110 ; 006C ;  SL      # ( ℐ → l ) SCRIPT CAPITAL I → LATIN SMALL LETTER L       # →I→
+2111 ; 006C ;  SL      # ( ℑ → l ) BLACK-LETTER CAPITAL I → LATIN SMALL LETTER L # →I→
+1D408 ;        006C ;  SL      # ( 𝐈 → l ) MATHEMATICAL BOLD CAPITAL I → LATIN SMALL LETTER L   # →I→
+1D43C ;        006C ;  SL      # ( 𝐼 → l ) MATHEMATICAL ITALIC CAPITAL I → LATIN SMALL LETTER L # →I→
+1D470 ;        006C ;  SL      # ( 𝑰 → l ) MATHEMATICAL BOLD ITALIC CAPITAL I → LATIN SMALL LETTER L    # →I→
+1D4D8 ;        006C ;  SL      # ( 𝓘 → l ) MATHEMATICAL BOLD SCRIPT CAPITAL I → LATIN SMALL LETTER L    # →I→
+1D540 ;        006C ;  SL      # ( 𝕀 → l ) MATHEMATICAL DOUBLE-STRUCK CAPITAL I → LATIN SMALL LETTER L  # →I→
+1D574 ;        006C ;  SL      # ( 𝕴 → l ) MATHEMATICAL BOLD FRAKTUR CAPITAL I → LATIN SMALL LETTER L   # →I→
+1D5A8 ;        006C ;  SL      # ( 𝖨 → l ) MATHEMATICAL SANS-SERIF CAPITAL I → LATIN SMALL LETTER L     # →I→
+1D5DC ;        006C ;  SL      # ( 𝗜 → l ) MATHEMATICAL SANS-SERIF BOLD CAPITAL I → LATIN SMALL LETTER L        # →I→
+1D610 ;        006C ;  SL      # ( 𝘐 → l ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL I → LATIN SMALL LETTER L      # →I→
+1D644 ;        006C ;  SL      # ( 𝙄 → l ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I → LATIN SMALL LETTER L # →I→
+1D678 ;        006C ;  SL      # ( 𝙸 → l ) MATHEMATICAL MONOSPACE CAPITAL I → LATIN SMALL LETTER L      # →I→
+FF4C ; 006C ;  SL      # ( l → l ) FULLWIDTH LATIN SMALL LETTER L → LATIN SMALL LETTER L # →Ⅰ→→Ӏ→
+217C ; 006C ;  SL      # ( ⅼ → l ) SMALL ROMAN NUMERAL FIFTY → LATIN SMALL LETTER L      # 
+2113 ; 006C ;  SL      # ( ℓ → l ) SCRIPT SMALL L → LATIN SMALL LETTER L # 
+1D425 ;        006C ;  SL      # ( 𝐥 → l ) MATHEMATICAL BOLD SMALL L → LATIN SMALL LETTER L     # 
+1D459 ;        006C ;  SL      # ( 𝑙 → l ) MATHEMATICAL ITALIC SMALL L → LATIN SMALL LETTER L   # 
+1D48D ;        006C ;  SL      # ( 𝒍 → l ) MATHEMATICAL BOLD ITALIC SMALL L → LATIN SMALL LETTER L      # 
+1D4C1 ;        006C ;  SL      # ( 𝓁 → l ) MATHEMATICAL SCRIPT SMALL L → LATIN SMALL LETTER L   # 
+1D4F5 ;        006C ;  SL      # ( 𝓵 → l ) MATHEMATICAL BOLD SCRIPT SMALL L → LATIN SMALL LETTER L      # 
+1D529 ;        006C ;  SL      # ( 𝔩 → l ) MATHEMATICAL FRAKTUR SMALL L → LATIN SMALL LETTER L  # 
+1D55D ;        006C ;  SL      # ( 𝕝 → l ) MATHEMATICAL DOUBLE-STRUCK SMALL L → LATIN SMALL LETTER L    # 
+1D591 ;        006C ;  SL      # ( 𝖑 → l ) MATHEMATICAL BOLD FRAKTUR SMALL L → LATIN SMALL LETTER L     # 
+1D5C5 ;        006C ;  SL      # ( 𝗅 → l ) MATHEMATICAL SANS-SERIF SMALL L → LATIN SMALL LETTER L       # 
+1D5F9 ;        006C ;  SL      # ( 𝗹 → l ) MATHEMATICAL SANS-SERIF BOLD SMALL L → LATIN SMALL LETTER L  # 
+1D62D ;        006C ;  SL      # ( 𝘭 → l ) MATHEMATICAL SANS-SERIF ITALIC SMALL L → LATIN SMALL LETTER L        # 
+1D661 ;        006C ;  SL      # ( 𝙡 → l ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L → LATIN SMALL LETTER L   # 
+1D695 ;        006C ;  SL      # ( 𝚕 → l ) MATHEMATICAL MONOSPACE SMALL L → LATIN SMALL LETTER L        # 
+01C0 ; 006C ;  SL      # ( ǀ → l ) LATIN LETTER DENTAL CLICK → LATIN SMALL LETTER L       # 
+1D6B0 ;        006C ;  SL      # ( 𝚰 → l ) MATHEMATICAL BOLD CAPITAL IOTA → LATIN SMALL LETTER L        # →Ι→
+1D6EA ;        006C ;  SL      # ( 𝛪 → l ) MATHEMATICAL ITALIC CAPITAL IOTA → LATIN SMALL LETTER L      # →Ι→
+1D724 ;        006C ;  SL      # ( 𝜤 → l ) MATHEMATICAL BOLD ITALIC CAPITAL IOTA → LATIN SMALL LETTER L # →Ι→
+1D75E ;        006C ;  SL      # ( 𝝞 → l ) MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA → LATIN SMALL LETTER L     # →Ι→
+1D798 ;        006C ;  SL      # ( 𝞘 → l ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA → LATIN SMALL LETTER L      # →Ι→
+
+0142 ; 006C 0338 ;     SL      # ( ł → l̸ ) LATIN SMALL LETTER L WITH STROKE → LATIN SMALL LETTER L, COMBINING LONG SOLIDUS OVERLAY      # →l̷→
+
+026D ; 006C 0328 ;     SL      # ( ɭ → l̨ ) LATIN SMALL LETTER L WITH RETROFLEX HOOK → LATIN SMALL LETTER L, COMBINING OGONEK    # →l̢→
+
+026B ; 006C 0334 ;     SL      # ( ɫ → l̴ ) LATIN SMALL LETTER L WITH MIDDLE TILDE → LATIN SMALL LETTER L, COMBINING TILDE OVERLAY       # 
+
+019A ; 006C 0335 ;     SL      # ( ƚ → l̵ ) LATIN SMALL LETTER L WITH BAR → LATIN SMALL LETTER L, COMBINING SHORT STROKE OVERLAY # 
+
+0140 ; 006C 00B7 ;     SL      # ( ŀ → l· ) LATIN SMALL LETTER L WITH MIDDLE DOT → LATIN SMALL LETTER L, MIDDLE DOT      # 
+
+1F102 ;        006C 002C ;     SL      #* ( 🄂 → l, ) DIGIT ONE COMMA → LATIN SMALL LETTER L, COMMA      # →1,→
+
+2488 ; 006C 002E ;     SL      #* ( ⒈ → l. ) DIGIT ONE FULL STOP → LATIN SMALL LETTER L, FULL STOP       # →1.→
+
+2493 ; 006C 0032 002E ;        SL      #* ( ⒓ → l2. ) NUMBER TWELVE FULL STOP → LATIN SMALL LETTER L, DIGIT TWO, FULL STOP       # →12.→
+
+2494 ; 006C 0033 002E ;        SL      #* ( ⒔ → l3. ) NUMBER THIRTEEN FULL STOP → LATIN SMALL LETTER L, DIGIT THREE, FULL STOP   # →13.→
+
+2495 ; 006C 0034 002E ;        SL      #* ( ⒕ → l4. ) NUMBER FOURTEEN FULL STOP → LATIN SMALL LETTER L, DIGIT FOUR, FULL STOP    # →14.→
+
+2496 ; 006C 0035 002E ;        SL      #* ( ⒖ → l5. ) NUMBER FIFTEEN FULL STOP → LATIN SMALL LETTER L, DIGIT FIVE, FULL STOP     # →15.→
+
+2497 ; 006C 0036 002E ;        SL      #* ( ⒗ → l6. ) NUMBER SIXTEEN FULL STOP → LATIN SMALL LETTER L, DIGIT SIX, FULL STOP      # →16.→
+
+2498 ; 006C 0037 002E ;        SL      #* ( ⒘ → l7. ) NUMBER SEVENTEEN FULL STOP → LATIN SMALL LETTER L, DIGIT SEVEN, FULL STOP  # →17.→
+
+2499 ; 006C 0038 002E ;        SL      #* ( ⒙ → l8. ) NUMBER EIGHTEEN FULL STOP → LATIN SMALL LETTER L, DIGIT EIGHT, FULL STOP   # →18.→
+
+249A ; 006C 0039 002E ;        SL      #* ( ⒚ → l9. ) NUMBER NINETEEN FULL STOP → LATIN SMALL LETTER L, DIGIT NINE, FULL STOP    # →19.→
+
+01C9 ; 006C 006A ;     SL      # ( lj → lj ) LATIN SMALL LETTER LJ → LATIN SMALL LETTER L, LATIN SMALL LETTER J    # 
+
+2016 ; 006C 006C ;     SL      #* ( ‖ → ll ) DOUBLE VERTICAL LINE → LATIN SMALL LETTER L, LATIN SMALL LETTER L   # →∥→→||→
+2225 ; 006C 006C ;     SL      #* ( ∥ → ll ) PARALLEL TO → LATIN SMALL LETTER L, LATIN SMALL LETTER L    # →||→
+01C1 ; 006C 006C ;     SL      # ( ǁ → ll ) LATIN LETTER LATERAL CLICK → LATIN SMALL LETTER L, LATIN SMALL LETTER L       # →‖→→∥→→||→
+
+2492 ; 006C 006C 002E ;        SL      #* ( ⒒ → ll. ) NUMBER ELEVEN FULL STOP → LATIN SMALL LETTER L, LATIN SMALL LETTER L, FULL STOP    # →11.→
+
+1D427 ;        006E ;  SL      # ( 𝐧 → n ) MATHEMATICAL BOLD SMALL N → LATIN SMALL LETTER N     # 
+1D45B ;        006E ;  SL      # ( 𝑛 → n ) MATHEMATICAL ITALIC SMALL N → LATIN SMALL LETTER N   # 
+1D48F ;        006E ;  SL      # ( 𝒏 → n ) MATHEMATICAL BOLD ITALIC SMALL N → LATIN SMALL LETTER N      # 
+1D4C3 ;        006E ;  SL      # ( 𝓃 → n ) MATHEMATICAL SCRIPT SMALL N → LATIN SMALL LETTER N   # 
+1D4F7 ;        006E ;  SL      # ( 𝓷 → n ) MATHEMATICAL BOLD SCRIPT SMALL N → LATIN SMALL LETTER N      # 
+1D52B ;        006E ;  SL      # ( 𝔫 → n ) MATHEMATICAL FRAKTUR SMALL N → LATIN SMALL LETTER N  # 
+1D55F ;        006E ;  SL      # ( 𝕟 → n ) MATHEMATICAL DOUBLE-STRUCK SMALL N → LATIN SMALL LETTER N    # 
+1D593 ;        006E ;  SL      # ( 𝖓 → n ) MATHEMATICAL BOLD FRAKTUR SMALL N → LATIN SMALL LETTER N     # 
+1D5C7 ;        006E ;  SL      # ( 𝗇 → n ) MATHEMATICAL SANS-SERIF SMALL N → LATIN SMALL LETTER N       # 
+1D5FB ;        006E ;  SL      # ( 𝗻 → n ) MATHEMATICAL SANS-SERIF BOLD SMALL N → LATIN SMALL LETTER N  # 
+1D62F ;        006E ;  SL      # ( 𝘯 → n ) MATHEMATICAL SANS-SERIF ITALIC SMALL N → LATIN SMALL LETTER N        # 
+1D663 ;        006E ;  SL      # ( 𝙣 → n ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N → LATIN SMALL LETTER N   # 
+1D697 ;        006E ;  SL      # ( 𝚗 → n ) MATHEMATICAL MONOSPACE SMALL N → LATIN SMALL LETTER N        # 
+213C ; 006E ;  SL      # ( ℼ → n ) DOUBLE-STRUCK SMALL PI → LATIN SMALL LETTER N # →π→
+1D6D1 ;        006E ;  SL      # ( 𝛑 → n ) MATHEMATICAL BOLD SMALL PI → LATIN SMALL LETTER N    # →π→
+1D6E1 ;        006E ;  SL      # ( 𝛡 → n ) MATHEMATICAL BOLD PI SYMBOL → LATIN SMALL LETTER N   # →π→
+1D70B ;        006E ;  SL      # ( 𝜋 → n ) MATHEMATICAL ITALIC SMALL PI → LATIN SMALL LETTER N  # →π→
+1D71B ;        006E ;  SL      # ( 𝜛 → n ) MATHEMATICAL ITALIC PI SYMBOL → LATIN SMALL LETTER N # →π→
+1D745 ;        006E ;  SL      # ( 𝝅 → n ) MATHEMATICAL BOLD ITALIC SMALL PI → LATIN SMALL LETTER N     # →π→
+1D755 ;        006E ;  SL      # ( 𝝕 → n ) MATHEMATICAL BOLD ITALIC PI SYMBOL → LATIN SMALL LETTER N    # →π→
+1D77F ;        006E ;  SL      # ( 𝝿 → n ) MATHEMATICAL SANS-SERIF BOLD SMALL PI → LATIN SMALL LETTER N # →π→
+1D78F ;        006E ;  SL      # ( 𝞏 → n ) MATHEMATICAL SANS-SERIF BOLD PI SYMBOL → LATIN SMALL LETTER N        # →π→
+1D7B9 ;        006E ;  SL      # ( 𝞹 → n ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI → LATIN SMALL LETTER N  # →π→
+1D7C9 ;        006E ;  SL      # ( 𝟉 → n ) MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL → LATIN SMALL LETTER N # →π→
+
+0272 ; 0146 ;  SL      # ( ɲ → ņ ) LATIN SMALL LETTER N WITH LEFT HOOK → LATIN SMALL LETTER N WITH CEDILLA       # 
+
+0273 ; 006E 0328 ;     SL      # ( ɳ → n̨ ) LATIN SMALL LETTER N WITH RETROFLEX HOOK → LATIN SMALL LETTER N, COMBINING OGONEK    # →n̢→
+
+019E ; 006E 0329 ;     SL      # ( ƞ → n̩ ) LATIN SMALL LETTER N WITH LONG RIGHT LEG → LATIN SMALL LETTER N, COMBINING VERTICAL LINE BELOW       # 
+1D6C8 ;        006E 0329 ;     SL      # ( 𝛈 → n̩ ) MATHEMATICAL BOLD SMALL ETA → LATIN SMALL LETTER N, COMBINING VERTICAL LINE BELOW  # →η→→ƞ→
+1D702 ;        006E 0329 ;     SL      # ( 𝜂 → n̩ ) MATHEMATICAL ITALIC SMALL ETA → LATIN SMALL LETTER N, COMBINING VERTICAL LINE BELOW        # →η→→ƞ→
+1D73C ;        006E 0329 ;     SL      # ( 𝜼 → n̩ ) MATHEMATICAL BOLD ITALIC SMALL ETA → LATIN SMALL LETTER N, COMBINING VERTICAL LINE BELOW   # →η→→ƞ→
+1D776 ;        006E 0329 ;     SL      # ( 𝝶 → n̩ ) MATHEMATICAL SANS-SERIF BOLD SMALL ETA → LATIN SMALL LETTER N, COMBINING VERTICAL LINE BELOW       # →η→→ƞ→
+1D7B0 ;        006E 0329 ;     SL      # ( 𝞰 → n̩ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA → LATIN SMALL LETTER N, COMBINING VERTICAL LINE BELOW        # →η→→ƞ→
+
+01CC ; 006E 006A ;     SL      # ( nj → nj ) LATIN SMALL LETTER NJ → LATIN SMALL LETTER N, LATIN SMALL LETTER J    # 
+
+0665 ; 006F ;  SL      # ( ‎٥‎ → o ) ARABIC-INDIC DIGIT FIVE → LATIN SMALL LETTER O   # 
+FF4F ; 006F ;  SL      # ( o → o ) FULLWIDTH LATIN SMALL LETTER O → LATIN SMALL LETTER O # →ο→
+2134 ; 006F ;  SL      # ( ℴ → o ) SCRIPT SMALL O → LATIN SMALL LETTER O # 
+1D428 ;        006F ;  SL      # ( 𝐨 → o ) MATHEMATICAL BOLD SMALL O → LATIN SMALL LETTER O     # 
+1D45C ;        006F ;  SL      # ( 𝑜 → o ) MATHEMATICAL ITALIC SMALL O → LATIN SMALL LETTER O   # 
+1D490 ;        006F ;  SL      # ( 𝒐 → o ) MATHEMATICAL BOLD ITALIC SMALL O → LATIN SMALL LETTER O      # 
+1D4F8 ;        006F ;  SL      # ( 𝓸 → o ) MATHEMATICAL BOLD SCRIPT SMALL O → LATIN SMALL LETTER O      # 
+1D52C ;        006F ;  SL      # ( 𝔬 → o ) MATHEMATICAL FRAKTUR SMALL O → LATIN SMALL LETTER O  # 
+1D560 ;        006F ;  SL      # ( 𝕠 → o ) MATHEMATICAL DOUBLE-STRUCK SMALL O → LATIN SMALL LETTER O    # 
+1D594 ;        006F ;  SL      # ( 𝖔 → o ) MATHEMATICAL BOLD FRAKTUR SMALL O → LATIN SMALL LETTER O     # 
+1D5C8 ;        006F ;  SL      # ( 𝗈 → o ) MATHEMATICAL SANS-SERIF SMALL O → LATIN SMALL LETTER O       # 
+1D5FC ;        006F ;  SL      # ( 𝗼 → o ) MATHEMATICAL SANS-SERIF BOLD SMALL O → LATIN SMALL LETTER O  # 
+1D630 ;        006F ;  SL      # ( 𝘰 → o ) MATHEMATICAL SANS-SERIF ITALIC SMALL O → LATIN SMALL LETTER O        # 
+1D664 ;        006F ;  SL      # ( 𝙤 → o ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O → LATIN SMALL LETTER O   # 
+1D698 ;        006F ;  SL      # ( 𝚘 → o ) MATHEMATICAL MONOSPACE SMALL O → LATIN SMALL LETTER O        # 
+1D0F ; 006F ;  SL      # ( ᴏ → o ) LATIN LETTER SMALL CAPITAL O → LATIN SMALL LETTER O   # 
+1D11 ; 006F ;  SL      # ( ᴑ → o ) LATIN SMALL LETTER SIDEWAYS O → LATIN SMALL LETTER O  # 
+1D6D0 ;        006F ;  SL      # ( 𝛐 → o ) MATHEMATICAL BOLD SMALL OMICRON → LATIN SMALL LETTER O       # →ο→
+1D70A ;        006F ;  SL      # ( 𝜊 → o ) MATHEMATICAL ITALIC SMALL OMICRON → LATIN SMALL LETTER O     # →ο→
+1D744 ;        006F ;  SL      # ( 𝝄 → o ) MATHEMATICAL BOLD ITALIC SMALL OMICRON → LATIN SMALL LETTER O        # →ο→
+1D77E ;        006F ;  SL      # ( 𝝾 → o ) MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON → LATIN SMALL LETTER O    # →ο→
+1D7B8 ;        006F ;  SL      # ( 𝞸 → o ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON → LATIN SMALL LETTER O     # →ο→
+1D6D4 ;        006F ;  SL      # ( 𝛔 → o ) MATHEMATICAL BOLD SMALL SIGMA → LATIN SMALL LETTER O # →σ→
+1D70E ;        006F ;  SL      # ( 𝜎 → o ) MATHEMATICAL ITALIC SMALL SIGMA → LATIN SMALL LETTER O       # →σ→
+1D748 ;        006F ;  SL      # ( 𝝈 → o ) MATHEMATICAL BOLD ITALIC SMALL SIGMA → LATIN SMALL LETTER O  # →σ→
+1D782 ;        006F ;  SL      # ( 𝞂 → o ) MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA → LATIN SMALL LETTER O      # →σ→
+1D7BC ;        006F ;  SL      # ( 𝞼 → o ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA → LATIN SMALL LETTER O       # →σ→
+
+2070 ; 00BA ;  SL      #* ( ⁰ → º ) SUPERSCRIPT ZERO → MASCULINE ORDINAL INDICATOR      # 
+1D52 ; 00BA ;  SL      # ( ᵒ → º ) MODIFIER LETTER SMALL O → MASCULINE ORDINAL INDICATOR        # →⁰→
+
+01D2 ; 014F ;  SL      # ( ǒ → ŏ ) LATIN SMALL LETTER O WITH CARON → LATIN SMALL LETTER O WITH BREVE     # 
+
+00F8 ; 006F 0338 ;     SL      # ( ø → o̸ ) LATIN SMALL LETTER O WITH STROKE → LATIN SMALL LETTER O, COMBINING LONG SOLIDUS OVERLAY      # →o̷→
+
+0275 ; 006F 0335 ;     SL      # ( ɵ → o̵ ) LATIN SMALL LETTER BARRED O → LATIN SMALL LETTER O, COMBINING SHORT STROKE OVERLAY   # 
+
+01A1 ; 006F 0027 ;     SL      # ( ơ → o' ) LATIN SMALL LETTER O WITH HORN → LATIN SMALL LETTER O, APOSTROPHE     # →oʼ→
+
+0025 ; 00BA 002F 2080 2080 ;   SL      #* ( % → º/₀₀ ) PERCENT SIGN → MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO    # →‰→→⁰/₀₀→
+2030 ; 00BA 002F 2080 2080 ;   SL      #* ( ‰ → º/₀₀ ) PER MILLE SIGN → MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO        # →⁰/₀₀→
+2052 ; 00BA 002F 2080 2080 ;   SL      #* ( ⁒ → º/₀₀ ) COMMERCIAL MINUS SIGN → MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO # →%→→‰→→⁰/₀₀→
+2100 ; 00BA 002F 2080 2080 ;   SL      #* ( ℀ → º/₀₀ ) ACCOUNT OF → MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO    # →%→→‰→→⁰/₀₀→
+2101 ; 00BA 002F 2080 2080 ;   SL      #* ( ℁ → º/₀₀ ) ADDRESSED TO THE SUBJECT → MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO      # →%→→‰→→⁰/₀₀→
+2105 ; 00BA 002F 2080 2080 ;   SL      #* ( ℅ → º/₀₀ ) CARE OF → MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO       # →%→→‰→→⁰/₀₀→
+2106 ; 00BA 002F 2080 2080 ;   SL      #* ( ℆ → º/₀₀ ) CADA UNA → MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO      # →%→→‰→→⁰/₀₀→
+
+2031 ; 00BA 002F 2080 2080 2080 ;      SL      #* ( ‱ → º/₀₀₀ ) PER TEN THOUSAND SIGN → MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO, SUBSCRIPT ZERO      # →⁰/₀₀₀→
+
+0153 ; 006F 0065 ;     SL      # ( œ → oe ) LATIN SMALL LIGATURE OE → LATIN SMALL LETTER O, LATIN SMALL LETTER E  # 
+
+0276 ; 006F 1D07 ;     SL      # ( ɶ → oᴇ ) LATIN LETTER SMALL CAPITAL OE → LATIN SMALL LETTER O, LATIN LETTER SMALL CAPITAL E  # 
+
+A74F ; 006F 006F ;     SL      # ( ꝏ → oo ) LATIN SMALL LETTER OO → LATIN SMALL LETTER O, LATIN SMALL LETTER O   # 
+
+2184 ; 0254 ;  SL      # ( ↄ → ɔ ) LATIN SMALL LETTER REVERSED C → LATIN SMALL LETTER OPEN O    # 
+1D10 ; 0254 ;  SL      # ( ᴐ → ɔ ) LATIN LETTER SMALL CAPITAL OPEN O → LATIN SMALL LETTER OPEN O        # 
+
+2374 ; 0070 ;  SL      #* ( ⍴ → p ) APL FUNCTIONAL SYMBOL RHO → LATIN SMALL LETTER P     # →ρ→
+FF50 ; 0070 ;  SL      # ( p → p ) FULLWIDTH LATIN SMALL LETTER P → LATIN SMALL LETTER P # →р→
+1D429 ;        0070 ;  SL      # ( 𝐩 → p ) MATHEMATICAL BOLD SMALL P → LATIN SMALL LETTER P     # 
+1D45D ;        0070 ;  SL      # ( 𝑝 → p ) MATHEMATICAL ITALIC SMALL P → LATIN SMALL LETTER P   # 
+1D491 ;        0070 ;  SL      # ( 𝒑 → p ) MATHEMATICAL BOLD ITALIC SMALL P → LATIN SMALL LETTER P      # 
+1D4C5 ;        0070 ;  SL      # ( 𝓅 → p ) MATHEMATICAL SCRIPT SMALL P → LATIN SMALL LETTER P   # 
+1D4F9 ;        0070 ;  SL      # ( 𝓹 → p ) MATHEMATICAL BOLD SCRIPT SMALL P → LATIN SMALL LETTER P      # 
+1D52D ;        0070 ;  SL      # ( 𝔭 → p ) MATHEMATICAL FRAKTUR SMALL P → LATIN SMALL LETTER P  # 
+1D561 ;        0070 ;  SL      # ( 𝕡 → p ) MATHEMATICAL DOUBLE-STRUCK SMALL P → LATIN SMALL LETTER P    # 
+1D595 ;        0070 ;  SL      # ( 𝖕 → p ) MATHEMATICAL BOLD FRAKTUR SMALL P → LATIN SMALL LETTER P     # 
+1D5C9 ;        0070 ;  SL      # ( 𝗉 → p ) MATHEMATICAL SANS-SERIF SMALL P → LATIN SMALL LETTER P       # 
+1D5FD ;        0070 ;  SL      # ( 𝗽 → p ) MATHEMATICAL SANS-SERIF BOLD SMALL P → LATIN SMALL LETTER P  # 
+1D631 ;        0070 ;  SL      # ( 𝘱 → p ) MATHEMATICAL SANS-SERIF ITALIC SMALL P → LATIN SMALL LETTER P        # 
+1D665 ;        0070 ;  SL      # ( 𝙥 → p ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P → LATIN SMALL LETTER P   # 
+1D699 ;        0070 ;  SL      # ( 𝚙 → p ) MATHEMATICAL MONOSPACE SMALL P → LATIN SMALL LETTER P        # 
+1D6D2 ;        0070 ;  SL      # ( 𝛒 → p ) MATHEMATICAL BOLD SMALL RHO → LATIN SMALL LETTER P   # →ρ→
+1D6E0 ;        0070 ;  SL      # ( 𝛠 → p ) MATHEMATICAL BOLD RHO SYMBOL → LATIN SMALL LETTER P  # →ρ→
+1D70C ;        0070 ;  SL      # ( 𝜌 → p ) MATHEMATICAL ITALIC SMALL RHO → LATIN SMALL LETTER P # →ρ→
+1D71A ;        0070 ;  SL      # ( 𝜚 → p ) MATHEMATICAL ITALIC RHO SYMBOL → LATIN SMALL LETTER P        # →ρ→
+1D746 ;        0070 ;  SL      # ( 𝝆 → p ) MATHEMATICAL BOLD ITALIC SMALL RHO → LATIN SMALL LETTER P    # →ρ→
+1D754 ;        0070 ;  SL      # ( 𝝔 → p ) MATHEMATICAL BOLD ITALIC RHO SYMBOL → LATIN SMALL LETTER P   # →ρ→
+1D780 ;        0070 ;  SL      # ( 𝞀 → p ) MATHEMATICAL SANS-SERIF BOLD SMALL RHO → LATIN SMALL LETTER P        # →ρ→
+1D78E ;        0070 ;  SL      # ( 𝞎 → p ) MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL → LATIN SMALL LETTER P       # →ρ→
+1D7BA ;        0070 ;  SL      # ( 𝞺 → p ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO → LATIN SMALL LETTER P # →ρ→
+1D7C8 ;        0070 ;  SL      # ( 𝟈 → p ) MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL → LATIN SMALL LETTER P        # →ρ→
+
+01A5 ; 0070 0314 ;     SL      # ( ƥ → p̔ ) LATIN SMALL LETTER P WITH HOOK → LATIN SMALL LETTER P, COMBINING REVERSED COMMA ABOVE        # 
+
+1D6D7 ;        0278 ;  SL      # ( 𝛗 → ɸ ) MATHEMATICAL BOLD SMALL PHI → LATIN SMALL LETTER PHI        # →φ→
+1D6DF ;        0278 ;  SL      # ( 𝛟 → ɸ ) MATHEMATICAL BOLD PHI SYMBOL → LATIN SMALL LETTER PHI       # →φ→
+1D711 ;        0278 ;  SL      # ( 𝜑 → ɸ ) MATHEMATICAL ITALIC SMALL PHI → LATIN SMALL LETTER PHI      # →φ→
+1D719 ;        0278 ;  SL      # ( 𝜙 → ɸ ) MATHEMATICAL ITALIC PHI SYMBOL → LATIN SMALL LETTER PHI     # →φ→
+1D74B ;        0278 ;  SL      # ( 𝝋 → ɸ ) MATHEMATICAL BOLD ITALIC SMALL PHI → LATIN SMALL LETTER PHI # →φ→
+1D753 ;        0278 ;  SL      # ( 𝝓 → ɸ ) MATHEMATICAL BOLD ITALIC PHI SYMBOL → LATIN SMALL LETTER PHI        # →φ→
+1D785 ;        0278 ;  SL      # ( 𝞅 → ɸ ) MATHEMATICAL SANS-SERIF BOLD SMALL PHI → LATIN SMALL LETTER PHI     # →φ→
+1D78D ;        0278 ;  SL      # ( 𝞍 → ɸ ) MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL → LATIN SMALL LETTER PHI    # →φ→
+1D7BF ;        0278 ;  SL      # ( 𝞿 → ɸ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI → LATIN SMALL LETTER PHI      # →φ→
+1D7C7 ;        0278 ;  SL      # ( 𝟇 → ɸ ) MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL → LATIN SMALL LETTER PHI     # →φ→
+
+1D42A ;        0071 ;  SL      # ( 𝐪 → q ) MATHEMATICAL BOLD SMALL Q → LATIN SMALL LETTER Q     # 
+1D45E ;        0071 ;  SL      # ( 𝑞 → q ) MATHEMATICAL ITALIC SMALL Q → LATIN SMALL LETTER Q   # 
+1D492 ;        0071 ;  SL      # ( 𝒒 → q ) MATHEMATICAL BOLD ITALIC SMALL Q → LATIN SMALL LETTER Q      # 
+1D4C6 ;        0071 ;  SL      # ( 𝓆 → q ) MATHEMATICAL SCRIPT SMALL Q → LATIN SMALL LETTER Q   # 
+1D4FA ;        0071 ;  SL      # ( 𝓺 → q ) MATHEMATICAL BOLD SCRIPT SMALL Q → LATIN SMALL LETTER Q      # 
+1D52E ;        0071 ;  SL      # ( 𝔮 → q ) MATHEMATICAL FRAKTUR SMALL Q → LATIN SMALL LETTER Q  # 
+1D562 ;        0071 ;  SL      # ( 𝕢 → q ) MATHEMATICAL DOUBLE-STRUCK SMALL Q → LATIN SMALL LETTER Q    # 
+1D596 ;        0071 ;  SL      # ( 𝖖 → q ) MATHEMATICAL BOLD FRAKTUR SMALL Q → LATIN SMALL LETTER Q     # 
+1D5CA ;        0071 ;  SL      # ( 𝗊 → q ) MATHEMATICAL SANS-SERIF SMALL Q → LATIN SMALL LETTER Q       # 
+1D5FE ;        0071 ;  SL      # ( 𝗾 → q ) MATHEMATICAL SANS-SERIF BOLD SMALL Q → LATIN SMALL LETTER Q  # 
+1D632 ;        0071 ;  SL      # ( 𝘲 → q ) MATHEMATICAL SANS-SERIF ITALIC SMALL Q → LATIN SMALL LETTER Q        # 
+1D666 ;        0071 ;  SL      # ( 𝙦 → q ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q → LATIN SMALL LETTER Q   # 
+1D69A ;        0071 ;  SL      # ( 𝚚 → q ) MATHEMATICAL MONOSPACE SMALL Q → LATIN SMALL LETTER Q        # 
+
+1D410 ;        211A ;  SL      # ( 𝐐 → ℚ ) MATHEMATICAL BOLD CAPITAL Q → DOUBLE-STRUCK CAPITAL Q      # →Q→
+1D444 ;        211A ;  SL      # ( 𝑄 → ℚ ) MATHEMATICAL ITALIC CAPITAL Q → DOUBLE-STRUCK CAPITAL Q    # →Q→
+1D478 ;        211A ;  SL      # ( 𝑸 → ℚ ) MATHEMATICAL BOLD ITALIC CAPITAL Q → DOUBLE-STRUCK CAPITAL Q       # →Q→
+1D4AC ;        211A ;  SL      # ( 𝒬 → ℚ ) MATHEMATICAL SCRIPT CAPITAL Q → DOUBLE-STRUCK CAPITAL Q    # →Q→
+1D4E0 ;        211A ;  SL      # ( 𝓠 → ℚ ) MATHEMATICAL BOLD SCRIPT CAPITAL Q → DOUBLE-STRUCK CAPITAL Q       # →Q→
+1D514 ;        211A ;  SL      # ( 𝔔 → ℚ ) MATHEMATICAL FRAKTUR CAPITAL Q → DOUBLE-STRUCK CAPITAL Q   # →Q→
+1D57C ;        211A ;  SL      # ( 𝕼 → ℚ ) MATHEMATICAL BOLD FRAKTUR CAPITAL Q → DOUBLE-STRUCK CAPITAL Q      # →Q→
+1D5B0 ;        211A ;  SL      # ( 𝖰 → ℚ ) MATHEMATICAL SANS-SERIF CAPITAL Q → DOUBLE-STRUCK CAPITAL Q        # →Q→
+1D5E4 ;        211A ;  SL      # ( 𝗤 → ℚ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL Q → DOUBLE-STRUCK CAPITAL Q   # →Q→
+1D618 ;        211A ;  SL      # ( 𝘘 → ℚ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q → DOUBLE-STRUCK CAPITAL Q # →Q→
+1D64C ;        211A ;  SL      # ( 𝙌 → ℚ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q → DOUBLE-STRUCK CAPITAL Q    # →Q→
+1D680 ;        211A ;  SL      # ( 𝚀 → ℚ ) MATHEMATICAL MONOSPACE CAPITAL Q → DOUBLE-STRUCK CAPITAL Q # →Q→
+
+02A0 ; 0071 0314 ;     SL      # ( ʠ → q̔ ) LATIN SMALL LETTER Q WITH HOOK → LATIN SMALL LETTER Q, COMBINING REVERSED COMMA ABOVE        # 
+
+1D42B ;        0072 ;  SL      # ( 𝐫 → r ) MATHEMATICAL BOLD SMALL R → LATIN SMALL LETTER R     # 
+1D45F ;        0072 ;  SL      # ( 𝑟 → r ) MATHEMATICAL ITALIC SMALL R → LATIN SMALL LETTER R   # 
+1D493 ;        0072 ;  SL      # ( 𝒓 → r ) MATHEMATICAL BOLD ITALIC SMALL R → LATIN SMALL LETTER R      # 
+1D4C7 ;        0072 ;  SL      # ( 𝓇 → r ) MATHEMATICAL SCRIPT SMALL R → LATIN SMALL LETTER R   # 
+1D4FB ;        0072 ;  SL      # ( 𝓻 → r ) MATHEMATICAL BOLD SCRIPT SMALL R → LATIN SMALL LETTER R      # 
+1D52F ;        0072 ;  SL      # ( 𝔯 → r ) MATHEMATICAL FRAKTUR SMALL R → LATIN SMALL LETTER R  # 
+1D563 ;        0072 ;  SL      # ( 𝕣 → r ) MATHEMATICAL DOUBLE-STRUCK SMALL R → LATIN SMALL LETTER R    # 
+1D597 ;        0072 ;  SL      # ( 𝖗 → r ) MATHEMATICAL BOLD FRAKTUR SMALL R → LATIN SMALL LETTER R     # 
+1D5CB ;        0072 ;  SL      # ( 𝗋 → r ) MATHEMATICAL SANS-SERIF SMALL R → LATIN SMALL LETTER R       # 
+1D5FF ;        0072 ;  SL      # ( 𝗿 → r ) MATHEMATICAL SANS-SERIF BOLD SMALL R → LATIN SMALL LETTER R  # 
+1D633 ;        0072 ;  SL      # ( 𝘳 → r ) MATHEMATICAL SANS-SERIF ITALIC SMALL R → LATIN SMALL LETTER R        # 
+1D667 ;        0072 ;  SL      # ( 𝙧 → r ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R → LATIN SMALL LETTER R   # 
+1D69B ;        0072 ;  SL      # ( 𝚛 → r ) MATHEMATICAL MONOSPACE SMALL R → LATIN SMALL LETTER R        # 
+
+027D ; 0072 0328 ;     SL      # ( ɽ → r̨ ) LATIN SMALL LETTER R WITH TAIL → LATIN SMALL LETTER R, COMBINING OGONEK      # 
+
+027C ; 0072 0329 ;     SL      # ( ɼ → r̩ ) LATIN SMALL LETTER R WITH LONG LEG → LATIN SMALL LETTER R, COMBINING VERTICAL LINE BELOW     # 
+
+006D ; 0072 006E ;     SL      # ( m → rn ) LATIN SMALL LETTER M → LATIN SMALL LETTER R, LATIN SMALL LETTER N      # 
+217F ; 0072 006E ;     SL      # ( ⅿ → rn ) SMALL ROMAN NUMERAL ONE THOUSAND → LATIN SMALL LETTER R, LATIN SMALL LETTER N        # →m→
+1D426 ;        0072 006E ;     SL      # ( 𝐦 → rn ) MATHEMATICAL BOLD SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N      # →m→
+1D45A ;        0072 006E ;     SL      # ( 𝑚 → rn ) MATHEMATICAL ITALIC SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N    # →m→
+1D48E ;        0072 006E ;     SL      # ( 𝒎 → rn ) MATHEMATICAL BOLD ITALIC SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N       # →m→
+1D4C2 ;        0072 006E ;     SL      # ( 𝓂 → rn ) MATHEMATICAL SCRIPT SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N    # →m→
+1D4F6 ;        0072 006E ;     SL      # ( 𝓶 → rn ) MATHEMATICAL BOLD SCRIPT SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N       # →m→
+1D52A ;        0072 006E ;     SL      # ( 𝔪 → rn ) MATHEMATICAL FRAKTUR SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N   # →m→
+1D55E ;        0072 006E ;     SL      # ( 𝕞 → rn ) MATHEMATICAL DOUBLE-STRUCK SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N     # →m→
+1D592 ;        0072 006E ;     SL      # ( 𝖒 → rn ) MATHEMATICAL BOLD FRAKTUR SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N      # →m→
+1D5C6 ;        0072 006E ;     SL      # ( 𝗆 → rn ) MATHEMATICAL SANS-SERIF SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N        # →m→
+1D5FA ;        0072 006E ;     SL      # ( 𝗺 → rn ) MATHEMATICAL SANS-SERIF BOLD SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N   # →m→
+1D62E ;        0072 006E ;     SL      # ( 𝘮 → rn ) MATHEMATICAL SANS-SERIF ITALIC SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N # →m→
+1D662 ;        0072 006E ;     SL      # ( 𝙢 → rn ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N    # →m→
+1D696 ;        0072 006E ;     SL      # ( 𝚖 → rn ) MATHEMATICAL MONOSPACE SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N # →m→
+028D ; 0072 006E ;     SL      # ( ʍ → rn ) LATIN SMALL LETTER TURNED W → LATIN SMALL LETTER R, LATIN SMALL LETTER N      # →m→
+
+0271 ; 0072 006E 0326 ;        SL      # ( ɱ → rn̦ ) LATIN SMALL LETTER M WITH HOOK → LATIN SMALL LETTER R, LATIN SMALL LETTER N, COMBINING COMMA BELOW  # →m̡→
+
+2129 ; 027F ;  SL      #* ( ℩ → ɿ ) TURNED GREEK SMALL LETTER IOTA → LATIN SMALL LETTER REVERSED R WITH FISHHOOK        # 
+
+FF53 ; 0073 ;  SL      # ( s → s ) FULLWIDTH LATIN SMALL LETTER S → LATIN SMALL LETTER S # →ѕ→
+1D42C ;        0073 ;  SL      # ( 𝐬 → s ) MATHEMATICAL BOLD SMALL S → LATIN SMALL LETTER S     # 
+1D460 ;        0073 ;  SL      # ( 𝑠 → s ) MATHEMATICAL ITALIC SMALL S → LATIN SMALL LETTER S   # 
+1D494 ;        0073 ;  SL      # ( 𝒔 → s ) MATHEMATICAL BOLD ITALIC SMALL S → LATIN SMALL LETTER S      # 
+1D4C8 ;        0073 ;  SL      # ( 𝓈 → s ) MATHEMATICAL SCRIPT SMALL S → LATIN SMALL LETTER S   # 
+1D4FC ;        0073 ;  SL      # ( 𝓼 → s ) MATHEMATICAL BOLD SCRIPT SMALL S → LATIN SMALL LETTER S      # 
+1D530 ;        0073 ;  SL      # ( 𝔰 → s ) MATHEMATICAL FRAKTUR SMALL S → LATIN SMALL LETTER S  # 
+1D564 ;        0073 ;  SL      # ( 𝕤 → s ) MATHEMATICAL DOUBLE-STRUCK SMALL S → LATIN SMALL LETTER S    # 
+1D598 ;        0073 ;  SL      # ( 𝖘 → s ) MATHEMATICAL BOLD FRAKTUR SMALL S → LATIN SMALL LETTER S     # 
+1D5CC ;        0073 ;  SL      # ( 𝗌 → s ) MATHEMATICAL SANS-SERIF SMALL S → LATIN SMALL LETTER S       # 
+1D600 ;        0073 ;  SL      # ( 𝘀 → s ) MATHEMATICAL SANS-SERIF BOLD SMALL S → LATIN SMALL LETTER S  # 
+1D634 ;        0073 ;  SL      # ( 𝘴 → s ) MATHEMATICAL SANS-SERIF ITALIC SMALL S → LATIN SMALL LETTER S        # 
+1D668 ;        0073 ;  SL      # ( 𝙨 → s ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S → LATIN SMALL LETTER S   # 
+1D69C ;        0073 ;  SL      # ( 𝚜 → s ) MATHEMATICAL MONOSPACE SMALL S → LATIN SMALL LETTER S        # 
+A731 ; 0073 ;  SL      # ( ꜱ → s ) LATIN LETTER SMALL CAPITAL S → LATIN SMALL LETTER S   # 
+01BD ; 0073 ;  SL      # ( ƽ → s ) LATIN SMALL LETTER TONE FIVE → LATIN SMALL LETTER S    # 
+
+0282 ; 0073 0328 ;     SL      # ( ʂ → s̨ ) LATIN SMALL LETTER S WITH HOOK → LATIN SMALL LETTER S, COMBINING OGONEK      # 
+
+222B ; 0283 ;  SL      #* ( ∫ → ʃ ) INTEGRAL → LATIN SMALL LETTER ESH   # 
+
+222C ; 0283 0283 ;     SL      #* ( ∬ → ʃʃ ) DOUBLE INTEGRAL → LATIN SMALL LETTER ESH, LATIN SMALL LETTER ESH  # →∫∫→
+
+222D ; 0283 0283 0283 ;        SL      #* ( ∭ → ʃʃʃ ) TRIPLE INTEGRAL → LATIN SMALL LETTER ESH, LATIN SMALL LETTER ESH, LATIN SMALL LETTER ESH        # →∫∫∫→
+
+2A0C ; 0283 0283 0283 0283 ;   SL      #* ( ⨌ → ʃʃʃʃ ) QUADRUPLE INTEGRAL OPERATOR → LATIN SMALL LETTER ESH, LATIN SMALL LETTER ESH, LATIN SMALL LETTER ESH, LATIN SMALL LETTER ESH  # →∫∫∫∫→
+
+1D42D ;        0074 ;  SL      # ( 𝐭 → t ) MATHEMATICAL BOLD SMALL T → LATIN SMALL LETTER T     # 
+1D461 ;        0074 ;  SL      # ( 𝑡 → t ) MATHEMATICAL ITALIC SMALL T → LATIN SMALL LETTER T   # 
+1D495 ;        0074 ;  SL      # ( 𝒕 → t ) MATHEMATICAL BOLD ITALIC SMALL T → LATIN SMALL LETTER T      # 
+1D4C9 ;        0074 ;  SL      # ( 𝓉 → t ) MATHEMATICAL SCRIPT SMALL T → LATIN SMALL LETTER T   # 
+1D4FD ;        0074 ;  SL      # ( 𝓽 → t ) MATHEMATICAL BOLD SCRIPT SMALL T → LATIN SMALL LETTER T      # 
+1D531 ;        0074 ;  SL      # ( 𝔱 → t ) MATHEMATICAL FRAKTUR SMALL T → LATIN SMALL LETTER T  # 
+1D565 ;        0074 ;  SL      # ( 𝕥 → t ) MATHEMATICAL DOUBLE-STRUCK SMALL T → LATIN SMALL LETTER T    # 
+1D599 ;        0074 ;  SL      # ( 𝖙 → t ) MATHEMATICAL BOLD FRAKTUR SMALL T → LATIN SMALL LETTER T     # 
+1D5CD ;        0074 ;  SL      # ( 𝗍 → t ) MATHEMATICAL SANS-SERIF SMALL T → LATIN SMALL LETTER T       # 
+1D601 ;        0074 ;  SL      # ( 𝘁 → t ) MATHEMATICAL SANS-SERIF BOLD SMALL T → LATIN SMALL LETTER T  # 
+1D635 ;        0074 ;  SL      # ( 𝘵 → t ) MATHEMATICAL SANS-SERIF ITALIC SMALL T → LATIN SMALL LETTER T        # 
+1D669 ;        0074 ;  SL      # ( 𝙩 → t ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T → LATIN SMALL LETTER T   # 
+1D69D ;        0074 ;  SL      # ( 𝚝 → t ) MATHEMATICAL MONOSPACE SMALL T → LATIN SMALL LETTER T        # 
+1D1B ; 0074 ;  SL      # ( ᴛ → t ) LATIN LETTER SMALL CAPITAL T → LATIN SMALL LETTER T   # →т→→τ→
+1D6D5 ;        0074 ;  SL      # ( 𝛕 → t ) MATHEMATICAL BOLD SMALL TAU → LATIN SMALL LETTER T   # →τ→
+1D70F ;        0074 ;  SL      # ( 𝜏 → t ) MATHEMATICAL ITALIC SMALL TAU → LATIN SMALL LETTER T # →τ→
+1D749 ;        0074 ;  SL      # ( 𝝉 → t ) MATHEMATICAL BOLD ITALIC SMALL TAU → LATIN SMALL LETTER T    # →τ→
+1D783 ;        0074 ;  SL      # ( 𝞃 → t ) MATHEMATICAL SANS-SERIF BOLD SMALL TAU → LATIN SMALL LETTER T        # →τ→
+1D7BD ;        0074 ;  SL      # ( 𝞽 → t ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU → LATIN SMALL LETTER T # →τ→
+
+01AD ; 0074 0314 ;     SL      # ( ƭ → t̔ ) LATIN SMALL LETTER T WITH HOOK → LATIN SMALL LETTER T, COMBINING REVERSED COMMA ABOVE        # 
+
+021B ; 0163 ;  SL      # ( ț → ţ ) LATIN SMALL LETTER T WITH COMMA BELOW → LATIN SMALL LETTER T WITH CEDILLA     # 
+01AB ; 0163 ;  SL      # ( ƫ → ţ ) LATIN SMALL LETTER T WITH PALATAL HOOK → LATIN SMALL LETTER T WITH CEDILLA    # 
+
+0167 ; 0074 0335 ;     SL      # ( ŧ → t̵ ) LATIN SMALL LETTER T WITH STROKE → LATIN SMALL LETTER T, COMBINING SHORT STROKE OVERLAY      # 
+
+02A8 ; 0074 0255 ;     SL      # ( ʨ → tɕ ) LATIN SMALL LETTER TC DIGRAPH WITH CURL → LATIN SMALL LETTER T, LATIN SMALL LETTER C WITH CURL       # 
+
+A777 ; 0074 0066 ;     SL      # ( ꝷ → tf ) LATIN SMALL LETTER TUM → LATIN SMALL LETTER T, LATIN SMALL LETTER F  # 
+
+02A6 ; 0074 0073 ;     SL      # ( ʦ → ts ) LATIN SMALL LETTER TS DIGRAPH → LATIN SMALL LETTER T, LATIN SMALL LETTER S    # 
+
+02A7 ; 0074 0283 ;     SL      # ( ʧ → tʃ ) LATIN SMALL LETTER TESH DIGRAPH → LATIN SMALL LETTER T, LATIN SMALL LETTER ESH       # 
+
+A729 ; 0074 021D ;     SL      # ( ꜩ → tȝ ) LATIN SMALL LETTER TZ → LATIN SMALL LETTER T, LATIN SMALL LETTER YOGH       # 
+
+1D42E ;        0075 ;  SL      # ( 𝐮 → u ) MATHEMATICAL BOLD SMALL U → LATIN SMALL LETTER U     # 
+1D462 ;        0075 ;  SL      # ( 𝑢 → u ) MATHEMATICAL ITALIC SMALL U → LATIN SMALL LETTER U   # 
+1D496 ;        0075 ;  SL      # ( 𝒖 → u ) MATHEMATICAL BOLD ITALIC SMALL U → LATIN SMALL LETTER U      # 
+1D4CA ;        0075 ;  SL      # ( 𝓊 → u ) MATHEMATICAL SCRIPT SMALL U → LATIN SMALL LETTER U   # 
+1D4FE ;        0075 ;  SL      # ( 𝓾 → u ) MATHEMATICAL BOLD SCRIPT SMALL U → LATIN SMALL LETTER U      # 
+1D532 ;        0075 ;  SL      # ( 𝔲 → u ) MATHEMATICAL FRAKTUR SMALL U → LATIN SMALL LETTER U  # 
+1D566 ;        0075 ;  SL      # ( 𝕦 → u ) MATHEMATICAL DOUBLE-STRUCK SMALL U → LATIN SMALL LETTER U    # 
+1D59A ;        0075 ;  SL      # ( 𝖚 → u ) MATHEMATICAL BOLD FRAKTUR SMALL U → LATIN SMALL LETTER U     # 
+1D5CE ;        0075 ;  SL      # ( 𝗎 → u ) MATHEMATICAL SANS-SERIF SMALL U → LATIN SMALL LETTER U       # 
+1D602 ;        0075 ;  SL      # ( 𝘂 → u ) MATHEMATICAL SANS-SERIF BOLD SMALL U → LATIN SMALL LETTER U  # 
+1D636 ;        0075 ;  SL      # ( 𝘶 → u ) MATHEMATICAL SANS-SERIF ITALIC SMALL U → LATIN SMALL LETTER U        # 
+1D66A ;        0075 ;  SL      # ( 𝙪 → u ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U → LATIN SMALL LETTER U   # 
+1D69E ;        0075 ;  SL      # ( 𝚞 → u ) MATHEMATICAL MONOSPACE SMALL U → LATIN SMALL LETTER U        # 
+1D1C ; 0075 ;  SL      # ( ᴜ → u ) LATIN LETTER SMALL CAPITAL U → LATIN SMALL LETTER U   # 
+028B ; 0075 ;  SL      # ( ʋ → u ) LATIN SMALL LETTER V WITH HOOK → LATIN SMALL LETTER U  # 
+1D6D6 ;        0075 ;  SL      # ( 𝛖 → u ) MATHEMATICAL BOLD SMALL UPSILON → LATIN SMALL LETTER U       # →υ→→ʋ→
+1D710 ;        0075 ;  SL      # ( 𝜐 → u ) MATHEMATICAL ITALIC SMALL UPSILON → LATIN SMALL LETTER U     # →υ→→ʋ→
+1D74A ;        0075 ;  SL      # ( 𝝊 → u ) MATHEMATICAL BOLD ITALIC SMALL UPSILON → LATIN SMALL LETTER U        # →υ→→ʋ→
+1D784 ;        0075 ;  SL      # ( 𝞄 → u ) MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON → LATIN SMALL LETTER U    # →υ→→ʋ→
+1D7BE ;        0075 ;  SL      # ( 𝞾 → u ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON → LATIN SMALL LETTER U     # →υ→→ʋ→
+
+01D4 ; 016D ;  SL      # ( ǔ → ŭ ) LATIN SMALL LETTER U WITH CARON → LATIN SMALL LETTER U WITH BREVE     # 
+
+2228 ; 0076 ;  SL      #* ( ∨ → v ) LOGICAL OR → LATIN SMALL LETTER V    # 
+22C1 ; 0076 ;  SL      #* ( ⋁ → v ) N-ARY LOGICAL OR → LATIN SMALL LETTER V      # →∨→
+FF56 ; 0076 ;  SL      # ( v → v ) FULLWIDTH LATIN SMALL LETTER V → LATIN SMALL LETTER V # →ν→
+2174 ; 0076 ;  SL      # ( ⅴ → v ) SMALL ROMAN NUMERAL FIVE → LATIN SMALL LETTER V       # 
+1D42F ;        0076 ;  SL      # ( 𝐯 → v ) MATHEMATICAL BOLD SMALL V → LATIN SMALL LETTER V     # 
+1D463 ;        0076 ;  SL      # ( 𝑣 → v ) MATHEMATICAL ITALIC SMALL V → LATIN SMALL LETTER V   # 
+1D497 ;        0076 ;  SL      # ( 𝒗 → v ) MATHEMATICAL BOLD ITALIC SMALL V → LATIN SMALL LETTER V      # 
+1D4CB ;        0076 ;  SL      # ( 𝓋 → v ) MATHEMATICAL SCRIPT SMALL V → LATIN SMALL LETTER V   # 
+1D4FF ;        0076 ;  SL      # ( 𝓿 → v ) MATHEMATICAL BOLD SCRIPT SMALL V → LATIN SMALL LETTER V      # 
+1D533 ;        0076 ;  SL      # ( 𝔳 → v ) MATHEMATICAL FRAKTUR SMALL V → LATIN SMALL LETTER V  # 
+1D567 ;        0076 ;  SL      # ( 𝕧 → v ) MATHEMATICAL DOUBLE-STRUCK SMALL V → LATIN SMALL LETTER V    # 
+1D59B ;        0076 ;  SL      # ( 𝖛 → v ) MATHEMATICAL BOLD FRAKTUR SMALL V → LATIN SMALL LETTER V     # 
+1D5CF ;        0076 ;  SL      # ( 𝗏 → v ) MATHEMATICAL SANS-SERIF SMALL V → LATIN SMALL LETTER V       # 
+1D603 ;        0076 ;  SL      # ( 𝘃 → v ) MATHEMATICAL SANS-SERIF BOLD SMALL V → LATIN SMALL LETTER V  # 
+1D637 ;        0076 ;  SL      # ( 𝘷 → v ) MATHEMATICAL SANS-SERIF ITALIC SMALL V → LATIN SMALL LETTER V        # 
+1D66B ;        0076 ;  SL      # ( 𝙫 → v ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V → LATIN SMALL LETTER V   # 
+1D69F ;        0076 ;  SL      # ( 𝚟 → v ) MATHEMATICAL MONOSPACE SMALL V → LATIN SMALL LETTER V        # 
+1D20 ; 0076 ;  SL      # ( ᴠ → v ) LATIN LETTER SMALL CAPITAL V → LATIN SMALL LETTER V   # 
+1D6CE ;        0076 ;  SL      # ( 𝛎 → v ) MATHEMATICAL BOLD SMALL NU → LATIN SMALL LETTER V    # →ν→
+1D708 ;        0076 ;  SL      # ( 𝜈 → v ) MATHEMATICAL ITALIC SMALL NU → LATIN SMALL LETTER V  # →ν→
+1D742 ;        0076 ;  SL      # ( 𝝂 → v ) MATHEMATICAL BOLD ITALIC SMALL NU → LATIN SMALL LETTER V     # →ν→
+1D77C ;        0076 ;  SL      # ( 𝝼 → v ) MATHEMATICAL SANS-SERIF BOLD SMALL NU → LATIN SMALL LETTER V # →ν→
+1D7B6 ;        0076 ;  SL      # ( 𝞶 → v ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU → LATIN SMALL LETTER V  # →ν→
+
+2175 ; 0076 0069 ;     SL      # ( ⅵ → vi ) SMALL ROMAN NUMERAL SIX → LATIN SMALL LETTER V, LATIN SMALL LETTER I # 
+
+2176 ; 0076 0069 0069 ;        SL      # ( ⅶ → vii ) SMALL ROMAN NUMERAL SEVEN → LATIN SMALL LETTER V, LATIN SMALL LETTER I, LATIN SMALL LETTER I        # 
+
+2177 ; 0076 0069 0069 0069 ;   SL      # ( ⅷ → viii ) SMALL ROMAN NUMERAL EIGHT → LATIN SMALL LETTER V, LATIN SMALL LETTER I, LATIN SMALL LETTER I, LATIN SMALL LETTER I # 
+
+026F ; 0076 0076 ;     SL      # ( ɯ → vv ) LATIN SMALL LETTER TURNED M → LATIN SMALL LETTER V, LATIN SMALL LETTER V      # →w→
+0077 ; 0076 0076 ;     SL      # ( w → vv ) LATIN SMALL LETTER W → LATIN SMALL LETTER V, LATIN SMALL LETTER V      # 
+1D430 ;        0076 0076 ;     SL      # ( 𝐰 → vv ) MATHEMATICAL BOLD SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V      # →w→
+1D464 ;        0076 0076 ;     SL      # ( 𝑤 → vv ) MATHEMATICAL ITALIC SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V    # →w→
+1D498 ;        0076 0076 ;     SL      # ( 𝒘 → vv ) MATHEMATICAL BOLD ITALIC SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V       # →w→
+1D4CC ;        0076 0076 ;     SL      # ( 𝓌 → vv ) MATHEMATICAL SCRIPT SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V    # →w→
+1D500 ;        0076 0076 ;     SL      # ( 𝔀 → vv ) MATHEMATICAL BOLD SCRIPT SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V       # →w→
+1D534 ;        0076 0076 ;     SL      # ( 𝔴 → vv ) MATHEMATICAL FRAKTUR SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V   # →w→
+1D568 ;        0076 0076 ;     SL      # ( 𝕨 → vv ) MATHEMATICAL DOUBLE-STRUCK SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V     # →w→
+1D59C ;        0076 0076 ;     SL      # ( 𝖜 → vv ) MATHEMATICAL BOLD FRAKTUR SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V      # →w→
+1D5D0 ;        0076 0076 ;     SL      # ( 𝗐 → vv ) MATHEMATICAL SANS-SERIF SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V        # →w→
+1D604 ;        0076 0076 ;     SL      # ( 𝘄 → vv ) MATHEMATICAL SANS-SERIF BOLD SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V   # →w→
+1D638 ;        0076 0076 ;     SL      # ( 𝘸 → vv ) MATHEMATICAL SANS-SERIF ITALIC SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→
+1D66C ;        0076 0076 ;     SL      # ( 𝙬 → vv ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V    # →w→
+1D6A0 ;        0076 0076 ;     SL      # ( 𝚠 → vv ) MATHEMATICAL MONOSPACE SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→
+1D21 ; 0076 0076 ;     SL      # ( ᴡ → vv ) LATIN LETTER SMALL CAPITAL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V    # →w→
+
+A761 ; 0076 0079 ;     SL      # ( ꝡ → vy ) LATIN SMALL LETTER VY → LATIN SMALL LETTER V, LATIN SMALL LETTER Y   # 
+
+00D7 ; 0078 ;  SL      #* ( × → x ) MULTIPLICATION SIGN → LATIN SMALL LETTER X    # 
+2573 ; 0078 ;  SL      #* ( ╳ → x ) BOX DRAWINGS LIGHT DIAGONAL CROSS → LATIN SMALL LETTER X     # 
+292B ; 0078 ;  SL      #* ( ⤫ → x ) RISING DIAGONAL CROSSING FALLING DIAGONAL → LATIN SMALL LETTER X     # 
+292C ; 0078 ;  SL      #* ( ⤬ → x ) FALLING DIAGONAL CROSSING RISING DIAGONAL → LATIN SMALL LETTER X     # 
+2A2F ; 0078 ;  SL      #* ( ⨯ → x ) VECTOR OR CROSS PRODUCT → LATIN SMALL LETTER X       # →×→
+FF58 ; 0078 ;  SL      # ( x → x ) FULLWIDTH LATIN SMALL LETTER X → LATIN SMALL LETTER X # →х→
+2179 ; 0078 ;  SL      # ( ⅹ → x ) SMALL ROMAN NUMERAL TEN → LATIN SMALL LETTER X        # 
+1D431 ;        0078 ;  SL      # ( 𝐱 → x ) MATHEMATICAL BOLD SMALL X → LATIN SMALL LETTER X     # 
+1D465 ;        0078 ;  SL      # ( 𝑥 → x ) MATHEMATICAL ITALIC SMALL X → LATIN SMALL LETTER X   # 
+1D499 ;        0078 ;  SL      # ( 𝒙 → x ) MATHEMATICAL BOLD ITALIC SMALL X → LATIN SMALL LETTER X      # 
+1D4CD ;        0078 ;  SL      # ( 𝓍 → x ) MATHEMATICAL SCRIPT SMALL X → LATIN SMALL LETTER X   # 
+1D501 ;        0078 ;  SL      # ( 𝔁 → x ) MATHEMATICAL BOLD SCRIPT SMALL X → LATIN SMALL LETTER X      # 
+1D535 ;        0078 ;  SL      # ( 𝔵 → x ) MATHEMATICAL FRAKTUR SMALL X → LATIN SMALL LETTER X  # 
+1D569 ;        0078 ;  SL      # ( 𝕩 → x ) MATHEMATICAL DOUBLE-STRUCK SMALL X → LATIN SMALL LETTER X    # 
+1D59D ;        0078 ;  SL      # ( 𝖝 → x ) MATHEMATICAL BOLD FRAKTUR SMALL X → LATIN SMALL LETTER X     # 
+1D5D1 ;        0078 ;  SL      # ( 𝗑 → x ) MATHEMATICAL SANS-SERIF SMALL X → LATIN SMALL LETTER X       # 
+1D605 ;        0078 ;  SL      # ( 𝘅 → x ) MATHEMATICAL SANS-SERIF BOLD SMALL X → LATIN SMALL LETTER X  # 
+1D639 ;        0078 ;  SL      # ( 𝘹 → x ) MATHEMATICAL SANS-SERIF ITALIC SMALL X → LATIN SMALL LETTER X        # 
+1D66D ;        0078 ;  SL      # ( 𝙭 → x ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X → LATIN SMALL LETTER X   # 
+1D6A1 ;        0078 ;  SL      # ( 𝚡 → x ) MATHEMATICAL MONOSPACE SMALL X → LATIN SMALL LETTER X        # 
+
+166D ; 1D417 ; SL      #* ( ᙭ → 𝐗 ) CANADIAN SYLLABICS CHI SIGN → MATHEMATICAL BOLD CAPITAL X # →X→
+
+2A30 ; 0078 0307 ;     SL      #* ( ⨰ → ẋ ) MULTIPLICATION SIGN WITH DOT ABOVE → LATIN SMALL LETTER X, COMBINING DOT ABOVE     # →×̇→
+
+217A ; 0078 0069 ;     SL      # ( ⅺ → xi ) SMALL ROMAN NUMERAL ELEVEN → LATIN SMALL LETTER X, LATIN SMALL LETTER I      # 
+
+217B ; 0078 0069 0069 ;        SL      # ( ⅻ → xii ) SMALL ROMAN NUMERAL TWELVE → LATIN SMALL LETTER X, LATIN SMALL LETTER I, LATIN SMALL LETTER I       # 
+
+1D8C ; 0079 ;  SL      # ( ᶌ → y ) LATIN SMALL LETTER V WITH PALATAL HOOK → LATIN SMALL LETTER Y # 
+FF59 ; 0079 ;  SL      # ( y → y ) FULLWIDTH LATIN SMALL LETTER Y → LATIN SMALL LETTER Y # →у→
+1D432 ;        0079 ;  SL      # ( 𝐲 → y ) MATHEMATICAL BOLD SMALL Y → LATIN SMALL LETTER Y     # 
+1D466 ;        0079 ;  SL      # ( 𝑦 → y ) MATHEMATICAL ITALIC SMALL Y → LATIN SMALL LETTER Y   # 
+1D49A ;        0079 ;  SL      # ( 𝒚 → y ) MATHEMATICAL BOLD ITALIC SMALL Y → LATIN SMALL LETTER Y      # 
+1D4CE ;        0079 ;  SL      # ( 𝓎 → y ) MATHEMATICAL SCRIPT SMALL Y → LATIN SMALL LETTER Y   # 
+1D502 ;        0079 ;  SL      # ( 𝔂 → y ) MATHEMATICAL BOLD SCRIPT SMALL Y → LATIN SMALL LETTER Y      # 
+1D536 ;        0079 ;  SL      # ( 𝔶 → y ) MATHEMATICAL FRAKTUR SMALL Y → LATIN SMALL LETTER Y  # 
+1D56A ;        0079 ;  SL      # ( 𝕪 → y ) MATHEMATICAL DOUBLE-STRUCK SMALL Y → LATIN SMALL LETTER Y    # 
+1D59E ;        0079 ;  SL      # ( 𝖞 → y ) MATHEMATICAL BOLD FRAKTUR SMALL Y → LATIN SMALL LETTER Y     # 
+1D5D2 ;        0079 ;  SL      # ( 𝗒 → y ) MATHEMATICAL SANS-SERIF SMALL Y → LATIN SMALL LETTER Y       # 
+1D606 ;        0079 ;  SL      # ( 𝘆 → y ) MATHEMATICAL SANS-SERIF BOLD SMALL Y → LATIN SMALL LETTER Y  # 
+1D63A ;        0079 ;  SL      # ( 𝘺 → y ) MATHEMATICAL SANS-SERIF ITALIC SMALL Y → LATIN SMALL LETTER Y        # 
+1D66E ;        0079 ;  SL      # ( 𝙮 → y ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y → LATIN SMALL LETTER Y   # 
+1D6A2 ;        0079 ;  SL      # ( 𝚢 → y ) MATHEMATICAL MONOSPACE SMALL Y → LATIN SMALL LETTER Y        # 
+028F ; 0079 ;  SL      # ( ʏ → y ) LATIN LETTER SMALL CAPITAL Y → LATIN SMALL LETTER Y    # →ү→→у→
+1EFF ; 0079 ;  SL      # ( ỿ → y ) LATIN SMALL LETTER Y WITH LOOP → LATIN SMALL LETTER Y # 
+213D ; 0079 ;  SL      # ( ℽ → y ) DOUBLE-STRUCK SMALL GAMMA → LATIN SMALL LETTER Y      # →γ→
+1D6C4 ;        0079 ;  SL      # ( 𝛄 → y ) MATHEMATICAL BOLD SMALL GAMMA → LATIN SMALL LETTER Y # →γ→
+1D6FE ;        0079 ;  SL      # ( 𝛾 → y ) MATHEMATICAL ITALIC SMALL GAMMA → LATIN SMALL LETTER Y       # →γ→
+1D738 ;        0079 ;  SL      # ( 𝜸 → y ) MATHEMATICAL BOLD ITALIC SMALL GAMMA → LATIN SMALL LETTER Y  # →γ→
+1D772 ;        0079 ;  SL      # ( 𝝲 → y ) MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA → LATIN SMALL LETTER Y      # →γ→
+1D7AC ;        0079 ;  SL      # ( 𝞬 → y ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA → LATIN SMALL LETTER Y       # →γ→
+
+01B4 ; 0079 0314 ;     SL      # ( ƴ → y̔ ) LATIN SMALL LETTER Y WITH HOOK → LATIN SMALL LETTER Y, COMBINING REVERSED COMMA ABOVE        # 
+
+1D433 ;        007A ;  SL      # ( 𝐳 → z ) MATHEMATICAL BOLD SMALL Z → LATIN SMALL LETTER Z     # 
+1D467 ;        007A ;  SL      # ( 𝑧 → z ) MATHEMATICAL ITALIC SMALL Z → LATIN SMALL LETTER Z   # 
+1D49B ;        007A ;  SL      # ( 𝒛 → z ) MATHEMATICAL BOLD ITALIC SMALL Z → LATIN SMALL LETTER Z      # 
+1D4CF ;        007A ;  SL      # ( 𝓏 → z ) MATHEMATICAL SCRIPT SMALL Z → LATIN SMALL LETTER Z   # 
+1D503 ;        007A ;  SL      # ( 𝔃 → z ) MATHEMATICAL BOLD SCRIPT SMALL Z → LATIN SMALL LETTER Z      # 
+1D537 ;        007A ;  SL      # ( 𝔷 → z ) MATHEMATICAL FRAKTUR SMALL Z → LATIN SMALL LETTER Z  # 
+1D56B ;        007A ;  SL      # ( 𝕫 → z ) MATHEMATICAL DOUBLE-STRUCK SMALL Z → LATIN SMALL LETTER Z    # 
+1D59F ;        007A ;  SL      # ( 𝖟 → z ) MATHEMATICAL BOLD FRAKTUR SMALL Z → LATIN SMALL LETTER Z     # 
+1D5D3 ;        007A ;  SL      # ( 𝗓 → z ) MATHEMATICAL SANS-SERIF SMALL Z → LATIN SMALL LETTER Z       # 
+1D607 ;        007A ;  SL      # ( 𝘇 → z ) MATHEMATICAL SANS-SERIF BOLD SMALL Z → LATIN SMALL LETTER Z  # 
+1D63B ;        007A ;  SL      # ( 𝘻 → z ) MATHEMATICAL SANS-SERIF ITALIC SMALL Z → LATIN SMALL LETTER Z        # 
+1D66F ;        007A ;  SL      # ( 𝙯 → z ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z → LATIN SMALL LETTER Z   # 
+1D6A3 ;        007A ;  SL      # ( 𝚣 → z ) MATHEMATICAL MONOSPACE SMALL Z → LATIN SMALL LETTER Z        # 
+1D22 ; 007A ;  SL      # ( ᴢ → z ) LATIN LETTER SMALL CAPITAL Z → LATIN SMALL LETTER Z   # 
+
+0290 ; 007A 0328 ;     SL      # ( ʐ → z̨ ) LATIN SMALL LETTER Z WITH RETROFLEX HOOK → LATIN SMALL LETTER Z, COMBINING OGONEK    # →z̢→
+
+0225 ; 007A 0326 ;     SL      # ( ȥ → z̦ ) LATIN SMALL LETTER Z WITH HOOK → LATIN SMALL LETTER Z, COMBINING COMMA BELOW # →z̡→
+
+01B6 ; 007A 0335 ;     SL      # ( ƶ → z̵ ) LATIN SMALL LETTER Z WITH STROKE → LATIN SMALL LETTER Z, COMBINING SHORT STROKE OVERLAY      # 
+
+0292 ; 021D ;  SL      # ( ʒ → ȝ ) LATIN SMALL LETTER EZH → LATIN SMALL LETTER YOGH      # 
+A76B ; 021D ;  SL      # ( ꝫ → ȝ ) LATIN SMALL LETTER ET → LATIN SMALL LETTER YOGH      # 
+
+01BF ; 00FE ;  SL      # ( ƿ → þ ) LATIN LETTER WYNN → LATIN SMALL LETTER THORN  # 
+
+1D24 ; 01A8 ;  SL      # ( ᴤ → ƨ ) LATIN LETTER VOICED LARYNGEAL SPIRANT → LATIN SMALL LETTER TONE TWO  # 
+
+02C1 ; 02E4 ;  SL      # ( ˁ → ˤ ) MODIFIER LETTER REVERSED GLOTTAL STOP → MODIFIER LETTER SMALL REVERSED GLOTTAL STOP   # 
+
+1D6C3 ;        03B2 ;  SL      # ( 𝛃 → β ) MATHEMATICAL BOLD SMALL BETA → GREEK SMALL LETTER BETA      # 
+1D6FD ;        03B2 ;  SL      # ( 𝛽 → β ) MATHEMATICAL ITALIC SMALL BETA → GREEK SMALL LETTER BETA    # 
+1D737 ;        03B2 ;  SL      # ( 𝜷 → β ) MATHEMATICAL BOLD ITALIC SMALL BETA → GREEK SMALL LETTER BETA       # 
+1D771 ;        03B2 ;  SL      # ( 𝝱 → β ) MATHEMATICAL SANS-SERIF BOLD SMALL BETA → GREEK SMALL LETTER BETA   # 
+1D7AB ;        03B2 ;  SL      # ( 𝞫 → β ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA → GREEK SMALL LETTER BETA    # 
+
+1D7CB ;        03DD ;  SL      # ( 𝟋 → ϝ ) MATHEMATICAL BOLD SMALL DIGAMMA → GREEK SMALL LETTER DIGAMMA        # 
+
+1D6C7 ;        03B6 ;  SL      # ( 𝛇 → ζ ) MATHEMATICAL BOLD SMALL ZETA → GREEK SMALL LETTER ZETA      # 
+1D701 ;        03B6 ;  SL      # ( 𝜁 → ζ ) MATHEMATICAL ITALIC SMALL ZETA → GREEK SMALL LETTER ZETA    # 
+1D73B ;        03B6 ;  SL      # ( 𝜻 → ζ ) MATHEMATICAL BOLD ITALIC SMALL ZETA → GREEK SMALL LETTER ZETA       # 
+1D775 ;        03B6 ;  SL      # ( 𝝵 → ζ ) MATHEMATICAL SANS-SERIF BOLD SMALL ZETA → GREEK SMALL LETTER ZETA   # 
+1D7AF ;        03B6 ;  SL      # ( 𝞯 → ζ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA → GREEK SMALL LETTER ZETA    # 
+
+2296 ; 03B8 ;  SL      #* ( ⊖ → θ ) CIRCLED MINUS → GREEK SMALL LETTER THETA    # 
+229D ; 03B8 ;  SL      #* ( ⊝ → θ ) CIRCLED DASH → GREEK SMALL LETTER THETA     # →⊖→
+236C ; 03B8 ;  SL      #* ( ⍬ → θ ) APL FUNCTIONAL SYMBOL ZILDE → GREEK SMALL LETTER THETA      # 
+1D6C9 ;        03B8 ;  SL      # ( 𝛉 → θ ) MATHEMATICAL BOLD SMALL THETA → GREEK SMALL LETTER THETA    # 
+1D6DD ;        03B8 ;  SL      # ( 𝛝 → θ ) MATHEMATICAL BOLD THETA SYMBOL → GREEK SMALL LETTER THETA   # 
+1D703 ;        03B8 ;  SL      # ( 𝜃 → θ ) MATHEMATICAL ITALIC SMALL THETA → GREEK SMALL LETTER THETA  # 
+1D717 ;        03B8 ;  SL      # ( 𝜗 → θ ) MATHEMATICAL ITALIC THETA SYMBOL → GREEK SMALL LETTER THETA # 
+1D73D ;        03B8 ;  SL      # ( 𝜽 → θ ) MATHEMATICAL BOLD ITALIC SMALL THETA → GREEK SMALL LETTER THETA     # 
+1D751 ;        03B8 ;  SL      # ( 𝝑 → θ ) MATHEMATICAL BOLD ITALIC THETA SYMBOL → GREEK SMALL LETTER THETA    # 
+1D777 ;        03B8 ;  SL      # ( 𝝷 → θ ) MATHEMATICAL SANS-SERIF BOLD SMALL THETA → GREEK SMALL LETTER THETA # 
+1D78B ;        03B8 ;  SL      # ( 𝞋 → θ ) MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL → GREEK SMALL LETTER THETA        # 
+1D7B1 ;        03B8 ;  SL      # ( 𝞱 → θ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA → GREEK SMALL LETTER THETA  # 
+1D7C5 ;        03B8 ;  SL      # ( 𝟅 → θ ) MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL → GREEK SMALL LETTER THETA # 
+1D6AF ;        03B8 ;  SL      # ( 𝚯 → θ ) MATHEMATICAL BOLD CAPITAL THETA → GREEK SMALL LETTER THETA  # →Θ→→⊖→
+1D6B9 ;        03B8 ;  SL      # ( 𝚹 → θ ) MATHEMATICAL BOLD CAPITAL THETA SYMBOL → GREEK SMALL LETTER THETA   # →Θ→→⊖→
+1D6E9 ;        03B8 ;  SL      # ( 𝛩 → θ ) MATHEMATICAL ITALIC CAPITAL THETA → GREEK SMALL LETTER THETA        # →Θ→→⊖→
+1D6F3 ;        03B8 ;  SL      # ( 𝛳 → θ ) MATHEMATICAL ITALIC CAPITAL THETA SYMBOL → GREEK SMALL LETTER THETA # →Θ→→⊖→
+1D723 ;        03B8 ;  SL      # ( 𝜣 → θ ) MATHEMATICAL BOLD ITALIC CAPITAL THETA → GREEK SMALL LETTER THETA   # →Θ→→⊖→
+1D72D ;        03B8 ;  SL      # ( 𝜭 → θ ) MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL → GREEK SMALL LETTER THETA    # →Θ→→⊖→
+1D75D ;        03B8 ;  SL      # ( 𝝝 → θ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA → GREEK SMALL LETTER THETA       # →Θ→→⊖→
+1D767 ;        03B8 ;  SL      # ( 𝝧 → θ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL → GREEK SMALL LETTER THETA        # →Θ→→⊖→
+1D797 ;        03B8 ;  SL      # ( 𝞗 → θ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA → GREEK SMALL LETTER THETA        # →Θ→→⊖→
+1D7A1 ;        03B8 ;  SL      # ( 𝞡 → θ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL → GREEK SMALL LETTER THETA # →Θ→→⊖→
+
+037A ; 03B9 ;  SL      #* ( ͺ → ι ) GREEK YPOGEGRAMMENI → GREEK SMALL LETTER IOTA        # →ι→
+
+1D6CC ;        03BB ;  SL      # ( 𝛌 → λ ) MATHEMATICAL BOLD SMALL LAMDA → GREEK SMALL LETTER LAMDA    # 
+1D706 ;        03BB ;  SL      # ( 𝜆 → λ ) MATHEMATICAL ITALIC SMALL LAMDA → GREEK SMALL LETTER LAMDA  # 
+1D740 ;        03BB ;  SL      # ( 𝝀 → λ ) MATHEMATICAL BOLD ITALIC SMALL LAMDA → GREEK SMALL LETTER LAMDA     # 
+1D77A ;        03BB ;  SL      # ( 𝝺 → λ ) MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA → GREEK SMALL LETTER LAMDA # 
+1D7B4 ;        03BB ;  SL      # ( 𝞴 → λ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA → GREEK SMALL LETTER LAMDA  # 
+
+1D6CD ;        03BC ;  SL      # ( 𝛍 → μ ) MATHEMATICAL BOLD SMALL MU → GREEK SMALL LETTER MU  # 
+1D707 ;        03BC ;  SL      # ( 𝜇 → μ ) MATHEMATICAL ITALIC SMALL MU → GREEK SMALL LETTER MU        # 
+1D741 ;        03BC ;  SL      # ( 𝝁 → μ ) MATHEMATICAL BOLD ITALIC SMALL MU → GREEK SMALL LETTER MU   # 
+1D77B ;        03BC ;  SL      # ( 𝝻 → μ ) MATHEMATICAL SANS-SERIF BOLD SMALL MU → GREEK SMALL LETTER MU       # 
+1D7B5 ;        03BC ;  SL      # ( 𝞵 → μ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU → GREEK SMALL LETTER MU        # 
+
+1D6CF ;        03BE ;  SL      # ( 𝛏 → ξ ) MATHEMATICAL BOLD SMALL XI → GREEK SMALL LETTER XI  # 
+1D709 ;        03BE ;  SL      # ( 𝜉 → ξ ) MATHEMATICAL ITALIC SMALL XI → GREEK SMALL LETTER XI        # 
+1D743 ;        03BE ;  SL      # ( 𝝃 → ξ ) MATHEMATICAL BOLD ITALIC SMALL XI → GREEK SMALL LETTER XI   # 
+1D77D ;        03BE ;  SL      # ( 𝝽 → ξ ) MATHEMATICAL SANS-SERIF BOLD SMALL XI → GREEK SMALL LETTER XI       # 
+1D7B7 ;        03BE ;  SL      # ( 𝞷 → ξ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI → GREEK SMALL LETTER XI        # 
+
+1D6EF ;        1D6B5 ; SL      # ( 𝛯 → 𝚵 ) MATHEMATICAL ITALIC CAPITAL XI → MATHEMATICAL BOLD CAPITAL XI     # →Ξ→
+1D729 ;        1D6B5 ; SL      # ( 𝜩 → 𝚵 ) MATHEMATICAL BOLD ITALIC CAPITAL XI → MATHEMATICAL BOLD CAPITAL XI        # →Ξ→
+1D763 ;        1D6B5 ; SL      # ( 𝝣 → 𝚵 ) MATHEMATICAL SANS-SERIF BOLD CAPITAL XI → MATHEMATICAL BOLD CAPITAL XI    # →Ξ→
+1D79D ;        1D6B5 ; SL      # ( 𝞝 → 𝚵 ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI → MATHEMATICAL BOLD CAPITAL XI     # →Ξ→
+
+03C3 ; 03BF ;  SL      # ( σ → ο ) GREEK SMALL LETTER SIGMA → GREEK SMALL LETTER OMICRON # →o→
+
+1D28 ; 03C0 ;  SL      # ( ᴨ → π ) GREEK LETTER SMALL CAPITAL PI → GREEK SMALL LETTER PI        # →п→
+
+220F ; 213F ;  SL      #* ( ∏ → ℿ ) N-ARY PRODUCT → DOUBLE-STRUCK CAPITAL PI   # →Π→
+1D6B7 ;        213F ;  SL      # ( 𝚷 → ℿ ) MATHEMATICAL BOLD CAPITAL PI → DOUBLE-STRUCK CAPITAL PI    # →Π→
+1D6F1 ;        213F ;  SL      # ( 𝛱 → ℿ ) MATHEMATICAL ITALIC CAPITAL PI → DOUBLE-STRUCK CAPITAL PI  # →Π→
+1D72B ;        213F ;  SL      # ( 𝜫 → ℿ ) MATHEMATICAL BOLD ITALIC CAPITAL PI → DOUBLE-STRUCK CAPITAL PI     # →Π→
+1D765 ;        213F ;  SL      # ( 𝝥 → ℿ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL PI → DOUBLE-STRUCK CAPITAL PI # →Π→
+1D79F ;        213F ;  SL      # ( 𝞟 → ℿ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI → DOUBLE-STRUCK CAPITAL PI  # →Π→
+
+1D70D ;        1D6D3 ; SL      # ( 𝜍 → 𝛓 ) MATHEMATICAL ITALIC SMALL FINAL SIGMA → MATHEMATICAL BOLD SMALL FINAL SIGMA       # →ς→
+1D747 ;        1D6D3 ; SL      # ( 𝝇 → 𝛓 ) MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA → MATHEMATICAL BOLD SMALL FINAL SIGMA  # →ς→
+1D781 ;        1D6D3 ; SL      # ( 𝞁 → 𝛓 ) MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA → MATHEMATICAL BOLD SMALL FINAL SIGMA      # →ς→
+1D7BB ;        1D6D3 ; SL      # ( 𝞻 → 𝛓 ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA → MATHEMATICAL BOLD SMALL FINAL SIGMA       # →ς→
+
+1D6F7 ;        1D6BD ; SL      # ( 𝛷 → 𝚽 ) MATHEMATICAL ITALIC CAPITAL PHI → MATHEMATICAL BOLD CAPITAL PHI   # →Φ→
+1D731 ;        1D6BD ; SL      # ( 𝜱 → 𝚽 ) MATHEMATICAL BOLD ITALIC CAPITAL PHI → MATHEMATICAL BOLD CAPITAL PHI      # →Φ→
+1D76B ;        1D6BD ; SL      # ( 𝝫 → 𝚽 ) MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI → MATHEMATICAL BOLD CAPITAL PHI  # →Φ→
+1D7A5 ;        1D6BD ; SL      # ( 𝞥 → 𝚽 ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI → MATHEMATICAL BOLD CAPITAL PHI   # →Φ→
+
+1D6D8 ;        03C7 ;  SL      # ( 𝛘 → χ ) MATHEMATICAL BOLD SMALL CHI → GREEK SMALL LETTER CHI        # 
+1D712 ;        03C7 ;  SL      # ( 𝜒 → χ ) MATHEMATICAL ITALIC SMALL CHI → GREEK SMALL LETTER CHI      # 
+1D74C ;        03C7 ;  SL      # ( 𝝌 → χ ) MATHEMATICAL BOLD ITALIC SMALL CHI → GREEK SMALL LETTER CHI # 
+1D786 ;        03C7 ;  SL      # ( 𝞆 → χ ) MATHEMATICAL SANS-SERIF BOLD SMALL CHI → GREEK SMALL LETTER CHI     # 
+1D7C0 ;        03C7 ;  SL      # ( 𝟀 → χ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI → GREEK SMALL LETTER CHI      # 
+
+1D6D9 ;        03C8 ;  SL      # ( 𝛙 → ψ ) MATHEMATICAL BOLD SMALL PSI → GREEK SMALL LETTER PSI        # 
+1D713 ;        03C8 ;  SL      # ( 𝜓 → ψ ) MATHEMATICAL ITALIC SMALL PSI → GREEK SMALL LETTER PSI      # 
+1D74D ;        03C8 ;  SL      # ( 𝝍 → ψ ) MATHEMATICAL BOLD ITALIC SMALL PSI → GREEK SMALL LETTER PSI # 
+1D787 ;        03C8 ;  SL      # ( 𝞇 → ψ ) MATHEMATICAL SANS-SERIF BOLD SMALL PSI → GREEK SMALL LETTER PSI     # 
+1D7C1 ;        03C8 ;  SL      # ( 𝟁 → ψ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI → GREEK SMALL LETTER PSI      # 
+
+1D6F9 ;        1D6BF ; SL      # ( 𝛹 → 𝚿 ) MATHEMATICAL ITALIC CAPITAL PSI → MATHEMATICAL BOLD CAPITAL PSI   # →Ψ→
+1D733 ;        1D6BF ; SL      # ( 𝜳 → 𝚿 ) MATHEMATICAL BOLD ITALIC CAPITAL PSI → MATHEMATICAL BOLD CAPITAL PSI      # →Ψ→
+1D76D ;        1D6BF ; SL      # ( 𝝭 → 𝚿 ) MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI → MATHEMATICAL BOLD CAPITAL PSI  # →Ψ→
+1D7A7 ;        1D6BF ; SL      # ( 𝞧 → 𝚿 ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI → MATHEMATICAL BOLD CAPITAL PSI   # →Ψ→
+
+2375 ; 03C9 ;  SL      #* ( ⍵ → ω ) APL FUNCTIONAL SYMBOL OMEGA → GREEK SMALL LETTER OMEGA      # 
+1D6DA ;        03C9 ;  SL      # ( 𝛚 → ω ) MATHEMATICAL BOLD SMALL OMEGA → GREEK SMALL LETTER OMEGA    # 
+1D714 ;        03C9 ;  SL      # ( 𝜔 → ω ) MATHEMATICAL ITALIC SMALL OMEGA → GREEK SMALL LETTER OMEGA  # 
+1D74E ;        03C9 ;  SL      # ( 𝝎 → ω ) MATHEMATICAL BOLD ITALIC SMALL OMEGA → GREEK SMALL LETTER OMEGA     # 
+1D788 ;        03C9 ;  SL      # ( 𝞈 → ω ) MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA → GREEK SMALL LETTER OMEGA # 
+1D7C2 ;        03C9 ;  SL      # ( 𝟂 → ω ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA → GREEK SMALL LETTER OMEGA  # 
+
+04D5 ; 0430 0435 ;     SL      # ( ӕ → ае ) CYRILLIC SMALL LIGATURE A IE → CYRILLIC SMALL LETTER A, CYRILLIC SMALL LETTER IE    # 
+
+0493 ; 0433 0335 ;     SL      # ( ғ → г̵ ) CYRILLIC SMALL LETTER GHE WITH STROKE → CYRILLIC SMALL LETTER GHE, COMBINING SHORT STROKE OVERLAY   # 
+
+0491 ; 0433 02C8 ;     SL      # ( ґ → гˈ ) CYRILLIC SMALL LETTER GHE WITH UPTURN → CYRILLIC SMALL LETTER GHE, MODIFIER LETTER VERTICAL LINE    # 
+
+0511 ; 0454 ;  SL      # ( ԑ → є ) CYRILLIC SMALL LETTER REVERSED ZE → CYRILLIC SMALL LETTER UKRAINIAN IE        # →ε→
+
+0497 ; 0436 0329 ;     SL      # ( җ → ж̩ ) CYRILLIC SMALL LETTER ZHE WITH DESCENDER → CYRILLIC SMALL LETTER ZHE, COMBINING VERTICAL LINE BELOW # 
+
+0499 ; 0437 0321 ;     SL      # ( ҙ → з̡ ) CYRILLIC SMALL LETTER ZE WITH DESCENDER → CYRILLIC SMALL LETTER ZE, COMBINING PALATALIZED HOOK BELOW        # 
+
+04CF ; 0456 ;  SL      # ( ӏ → і ) CYRILLIC SMALL LETTER PALOCHKA → CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I       # →ı→→ι→
+
+045D ; 0439 ;  SL      # ( ѝ → й ) CYRILLIC SMALL LETTER I WITH GRAVE → CYRILLIC SMALL LETTER SHORT I    # 
+
+048B ; 0439 0326 ;     SL      # ( ҋ → й̦ ) CYRILLIC SMALL LETTER SHORT I WITH TAIL → CYRILLIC SMALL LETTER SHORT I, COMBINING COMMA BELOW      # →й̡→
+
+049B ; 043A 0329 ;     SL      # ( қ → к̩ ) CYRILLIC SMALL LETTER KA WITH DESCENDER → CYRILLIC SMALL LETTER KA, COMBINING VERTICAL LINE BELOW   # 
+
+049F ; 043A 0335 ;     SL      # ( ҟ → к̵ ) CYRILLIC SMALL LETTER KA WITH STROKE → CYRILLIC SMALL LETTER KA, COMBINING SHORT STROKE OVERLAY     # 
+
+1D2B ; 043B ;  SL      # ( ᴫ → л ) CYRILLIC LETTER SMALL CAPITAL EL → CYRILLIC SMALL LETTER EL  # 
+
+04C6 ; 043B 0326 ;     SL      # ( ӆ → л̦ ) CYRILLIC SMALL LETTER EL WITH TAIL → CYRILLIC SMALL LETTER EL, COMBINING COMMA BELOW        # →л̡→
+
+04CE ; 043C 0321 ;     SL      # ( ӎ → м̡ ) CYRILLIC SMALL LETTER EM WITH TAIL → CYRILLIC SMALL LETTER EM, COMBINING PALATALIZED HOOK BELOW     # 
+
+04A3 ; 043D 0329 ;     SL      # ( ң → н̩ ) CYRILLIC SMALL LETTER EN WITH DESCENDER → CYRILLIC SMALL LETTER EN, COMBINING VERTICAL LINE BELOW   # 
+
+04CA ; 043D 0321 ;     SL      # ( ӊ → н̡ ) CYRILLIC SMALL LETTER EN WITH TAIL → CYRILLIC SMALL LETTER EN, COMBINING PALATALIZED HOOK BELOW     # 
+04C8 ; 043D 0321 ;     SL      # ( ӈ → н̡ ) CYRILLIC SMALL LETTER EN WITH HOOK → CYRILLIC SMALL LETTER EN, COMBINING PALATALIZED HOOK BELOW     # 
+
+04E9 ; 043E 0335 ;     SL      # ( ө → о̵ ) CYRILLIC SMALL LETTER BARRED O → CYRILLIC SMALL LETTER O, COMBINING SHORT STROKE OVERLAY    # 
+0473 ; 043E 0335 ;     SL      # ( ѳ → о̵ ) CYRILLIC SMALL LETTER FITA → CYRILLIC SMALL LETTER O, COMBINING SHORT STROKE OVERLAY        # 
+
+04AB ; 0441 0321 ;     SL      # ( ҫ → с̡ ) CYRILLIC SMALL LETTER ES WITH DESCENDER → CYRILLIC SMALL LETTER ES, COMBINING PALATALIZED HOOK BELOW        # 
+
+04AD ; 0442 0329 ;     SL      # ( ҭ → т̩ ) CYRILLIC SMALL LETTER TE WITH DESCENDER → CYRILLIC SMALL LETTER TE, COMBINING VERTICAL LINE BELOW   # 
+
+04AF ; 0443 ;  SL      # ( ү → у ) CYRILLIC SMALL LETTER STRAIGHT U → CYRILLIC SMALL LETTER U    # 
+
+04B1 ; 04AF 0335 ;     SL      # ( ұ → ү̵ ) CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE → CYRILLIC SMALL LETTER STRAIGHT U, COMBINING SHORT STROKE OVERLAY     # 
+
+045B ; 04BB 0335 ;     SL      # ( ћ → һ̵ ) CYRILLIC SMALL LETTER TSHE → CYRILLIC SMALL LETTER SHHA, COMBINING SHORT STROKE OVERLAY     # 
+
+047D ; 0461 0483 ;     SL      # ( ѽ → ѡ҃ ) CYRILLIC SMALL LETTER OMEGA WITH TITLO → CYRILLIC SMALL LETTER OMEGA, COMBINING CYRILLIC TITLO      # 
+
+04CC ; 04B7 ;  SL      # ( ӌ → ҷ ) CYRILLIC SMALL LETTER KHAKASSIAN CHE → CYRILLIC SMALL LETTER CHE WITH DESCENDER       # 
+
+04BF ; 04BD 0328 ;     SL      # ( ҿ → ҽ̨ ) CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER → CYRILLIC SMALL LETTER ABKHASIAN CHE, COMBINING OGONEK  # →ҽ̢→
+
+0463 ; 048D ;  SL      # ( ѣ → ҍ ) CYRILLIC SMALL LETTER YAT → CYRILLIC SMALL LETTER SEMISOFT SIGN       # 
+
+0461 ; 051D ;  SL      # ( ѡ → ԝ ) CYRILLIC SMALL LETTER OMEGA → CYRILLIC SMALL LETTER WE        # →w→
+
+0566 ; 0563 ;  SL      # ( զ → գ ) ARMENIAN SMALL LETTER ZA → ARMENIAN SMALL LETTER GIM  # 
+
+057C ; 0578 ;  SL      # ( ռ → ո ) ARMENIAN SMALL LETTER RA → ARMENIAN SMALL LETTER VO   # →n→
+
+02D3 ; 0559 ;  SL      #* ( ˓ → ՙ ) MODIFIER LETTER CENTRED LEFT HALF RING → ARMENIAN MODIFIER LETTER LEFT HALF RING     # 
+02BF ; 0559 ;  SL      # ( ʿ → ՙ ) MODIFIER LETTER LEFT HALF RING → ARMENIAN MODIFIER LETTER LEFT HALF RING      # 
+
+2135 ; 05D0 ;  SL      # ( ℵ → ‎א‎ ) ALEF SYMBOL → HEBREW LETTER ALEF       # 
+FB21 ; 05D0 ;  SL      # ( ‎ﬡ‎ → ‎א‎ ) HEBREW LETTER WIDE ALEF → HEBREW LETTER ALEF     # 
+
+FB2F ; FB2E ;  SL      # ( ‎אָ‎ → ‎אַ‎ ) HEBREW LETTER ALEF WITH QAMATS → HEBREW LETTER ALEF WITH PATAH  # 
+FB30 ; FB2E ;  SL      # ( ‎אּ‎ → ‎אַ‎ ) HEBREW LETTER ALEF WITH MAPIQ → HEBREW LETTER ALEF WITH PATAH   # 
+
+FB4F ; 05D0 05DC ;     SL      # ( ‎ﭏ‎ → ‎אל‎ ) HEBREW LIGATURE ALEF LAMED → HEBREW LETTER ALEF, HEBREW LETTER LAMED   # 
+
+2136 ; 05D1 ;  SL      # ( ℶ → ‎ב‎ ) BET SYMBOL → HEBREW LETTER BET # 
+
+2137 ; 05D2 ;  SL      # ( ℷ → ‎ג‎ ) GIMEL SYMBOL → HEBREW LETTER GIMEL     # 
+
+2138 ; 05D3 ;  SL      # ( ℸ → ‎ד‎ ) DALET SYMBOL → HEBREW LETTER DALET     # 
+FB22 ; 05D3 ;  SL      # ( ‎ﬢ‎ → ‎ד‎ ) HEBREW LETTER WIDE DALET → HEBREW LETTER DALET   # 
+
+FB23 ; 05D4 ;  SL      # ( ‎ﬣ‎ → ‎ה‎ ) HEBREW LETTER WIDE HE → HEBREW LETTER HE # 
+
+05F1 ; 05D5 05D9 ;     SL      # ( ‎ױ‎ → ‎וי‎ ) HEBREW LIGATURE YIDDISH VAV YOD → HEBREW LETTER VAV, HEBREW LETTER YOD  # 
+
+FB39 ; FB1D ;  SL      # ( ‎יּ‎ → ‎יִ‎ ) HEBREW LETTER YOD WITH DAGESH → HEBREW LETTER YOD WITH HIRIQ    # 
+
+FB24 ; 05DB ;  SL      # ( ‎ﬤ‎ → ‎כ‎ ) HEBREW LETTER WIDE KAF → HEBREW LETTER KAF       # 
+
+FB25 ; 05DC ;  SL      # ( ‎ﬥ‎ → ‎ל‎ ) HEBREW LETTER WIDE LAMED → HEBREW LETTER LAMED   # 
+
+FB26 ; 05DD ;  SL      # ( ‎ﬦ‎ → ‎ם‎ ) HEBREW LETTER WIDE FINAL MEM → HEBREW LETTER FINAL MEM   # 
+
+FB20 ; 05E2 ;  SL      # ( ‎ﬠ‎ → ‎ע‎ ) HEBREW LETTER ALTERNATIVE AYIN → HEBREW LETTER AYIN      # 
+
+FB27 ; 05E8 ;  SL      # ( ‎ﬧ‎ → ‎ר‎ ) HEBREW LETTER WIDE RESH → HEBREW LETTER RESH     # 
+
+FB2B ; FB2A ;  SL      # ( ‎שׂ‎ → ‎שׁ‎ ) HEBREW LETTER SHIN WITH SIN DOT → HEBREW LETTER SHIN WITH SHIN DOT      # 
+FB49 ; FB2A ;  SL      # ( ‎שּ‎ → ‎שׁ‎ ) HEBREW LETTER SHIN WITH DAGESH → HEBREW LETTER SHIN WITH SHIN DOT       # 
+
+FB2D ; FB2C ;  SL      # ( ‎שּׂ‎ → ‎שּׁ‎ ) HEBREW LETTER SHIN WITH DAGESH AND SIN DOT → HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT        # 
+
+FB28 ; 05EA ;  SL      # ( ‎ﬨ‎ → ‎ת‎ ) HEBREW LETTER WIDE TAV → HEBREW LETTER TAV       # 
+
+FE80 ; 0621 ;  SL      # ( ‎ﺀ‎ → ‎ء‎ ) ARABIC LETTER HAMZA ISOLATED FORM → ARABIC LETTER HAMZA  # 
+
+FE82 ; 0622 ;  SL      # ( ‎ﺂ‎ → ‎آ‎ ) ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM → ARABIC LETTER ALEF WITH MADDA ABOVE     # 
+FE81 ; 0622 ;  SL      # ( ‎ﺁ‎ → ‎آ‎ ) ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM → ARABIC LETTER ALEF WITH MADDA ABOVE  # 
+
+FB51 ; 0671 ;  SL      # ( ‎ﭑ‎ → ‎ٱ‎ ) ARABIC LETTER ALEF WASLA FINAL FORM → ARABIC LETTER ALEF WASLA   # 
+FB50 ; 0671 ;  SL      # ( ‎ﭐ‎ → ‎ٱ‎ ) ARABIC LETTER ALEF WASLA ISOLATED FORM → ARABIC LETTER ALEF WASLA        # 
+
+FE88 ; 0625 ;  SL      # ( ‎ﺈ‎ → ‎إ‎ ) ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM → ARABIC LETTER ALEF WITH HAMZA BELOW     # 
+FE87 ; 0625 ;  SL      # ( ‎ﺇ‎ → ‎إ‎ ) ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM → ARABIC LETTER ALEF WITH HAMZA BELOW  # 
+
+FE8E ; 0627 ;  SL      # ( ‎ﺎ‎ → ‎ا‎ ) ARABIC LETTER ALEF FINAL FORM → ARABIC LETTER ALEF       # 
+FE8D ; 0627 ;  SL      # ( ‎ﺍ‎ → ‎ا‎ ) ARABIC LETTER ALEF ISOLATED FORM → ARABIC LETTER ALEF    # 
+
+FD3C ; 0627 064B ;     SL      # ( ‎ﴼ‎ → ‎اً‎ ) ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM → ARABIC LETTER ALEF, ARABIC FATHATAN    # 
+FD3D ; 0627 064B ;     SL      # ( ‎ﴽ‎ → ‎اً‎ ) ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM → ARABIC LETTER ALEF, ARABIC FATHATAN # 
+
+0623 ; 0627 0674 ;     SL      # ( ‎أ‎ → ‎اٴ‎ ) ARABIC LETTER ALEF WITH HAMZA ABOVE → ARABIC LETTER ALEF, ARABIC LETTER HIGH HAMZA      # →‎ٵ‎→
+FE84 ; 0627 0674 ;     SL      # ( ‎ﺄ‎ → ‎اٴ‎ ) ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM → ARABIC LETTER ALEF, ARABIC LETTER HIGH HAMZA  # →‎أ‎→→‎ٵ‎→
+FE83 ; 0627 0674 ;     SL      # ( ‎ﺃ‎ → ‎اٴ‎ ) ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM → ARABIC LETTER ALEF, ARABIC LETTER HIGH HAMZA       # →‎ٵ‎→
+0675 ; 0627 0674 ;     SL      # ( ‎ٵ‎ → ‎اٴ‎ ) ARABIC LETTER HIGH HAMZA ALEF → ARABIC LETTER ALEF, ARABIC LETTER HIGH HAMZA    # 
+
+FDF3 ; 0627 0643 0628 0631 ;   SL      # ( ‎ﷳ‎ → ‎اكبر‎ ) ARABIC LIGATURE AKBAR ISOLATED FORM → ARABIC LETTER ALEF, ARABIC LETTER KAF, ARABIC LETTER BEH, ARABIC LETTER REH  # 
+
+FDF2 ; 0627 0644 0644 0647 ;   SL      # ( ‎ﷲ‎ → ‎الله‎ ) ARABIC LIGATURE ALLAH ISOLATED FORM → ARABIC LETTER ALEF, ARABIC LETTER LAM, ARABIC LETTER LAM, ARABIC LETTER HEH  # 
+
+FE91 ; 0628 ;  SL      # ( ‎ﺑ‎ → ‎ب‎ ) ARABIC LETTER BEH INITIAL FORM → ARABIC LETTER BEH       # 
+FE92 ; 0628 ;  SL      # ( ‎ﺒ‎ → ‎ب‎ ) ARABIC LETTER BEH MEDIAL FORM → ARABIC LETTER BEH        # 
+FE90 ; 0628 ;  SL      # ( ‎ﺐ‎ → ‎ب‎ ) ARABIC LETTER BEH FINAL FORM → ARABIC LETTER BEH # 
+FE8F ; 0628 ;  SL      # ( ‎ﺏ‎ → ‎ب‎ ) ARABIC LETTER BEH ISOLATED FORM → ARABIC LETTER BEH      # 
+0646 ; 0628 ;  SL      # ( ‎ن‎ → ‎ب‎ ) ARABIC LETTER NOON → ARABIC LETTER BEH    # →‎ﻨ‎→→‎ﺒ‎→
+FEE7 ; 0628 ;  SL      # ( ‎ﻧ‎ → ‎ب‎ ) ARABIC LETTER NOON INITIAL FORM → ARABIC LETTER BEH      # →‎ﺒ‎→
+FEE8 ; 0628 ;  SL      # ( ‎ﻨ‎ → ‎ب‎ ) ARABIC LETTER NOON MEDIAL FORM → ARABIC LETTER BEH       # →‎ﺒ‎→
+FEE6 ; 0628 ;  SL      # ( ‎ﻦ‎ → ‎ب‎ ) ARABIC LETTER NOON FINAL FORM → ARABIC LETTER BEH        # →‎ن‎→→‎ﻨ‎→→‎ﺒ‎→
+FEE5 ; 0628 ;  SL      # ( ‎ﻥ‎ → ‎ب‎ ) ARABIC LETTER NOON ISOLATED FORM → ARABIC LETTER BEH     # →‎ن‎→→‎ﻨ‎→→‎ﺒ‎→
+
+FC6D ; 0628 0628 ;     SL      # ( ‎ﱭ‎ → ‎بب‎ ) ARABIC LIGATURE BEH WITH NOON FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER BEH        # →‎بن‎→
+FC8D ; 0628 0628 ;     SL      # ( ‎ﲍ‎ → ‎بب‎ ) ARABIC LIGATURE NOON WITH NOON FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER BEH       # →‎نن‎→
+
+FC9C ; 0628 062C ;     SL      # ( ‎ﲜ‎ → ‎بج‎ ) ARABIC LIGATURE BEH WITH JEEM INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM     # 
+FC05 ; 0628 062C ;     SL      # ( ‎ﰅ‎ → ‎بج‎ ) ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM    # 
+FC9E ; 0628 062C ;     SL      # ( ‎ﲞ‎ → ‎بج‎ ) ARABIC LIGATURE BEH WITH KHAH INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM     # →‎بخ‎→→‎ﰇ‎→→‎ﰅ‎→
+FC07 ; 0628 062C ;     SL      # ( ‎ﰇ‎ → ‎بج‎ ) ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM    # →‎ﰅ‎→
+FCD2 ; 0628 062C ;     SL      # ( ‎ﳒ‎ → ‎بج‎ ) ARABIC LIGATURE NOON WITH JEEM INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM    # →‎ﲞ‎→→‎بخ‎→→‎ﰇ‎→→‎ﰅ‎→
+FC4B ; 0628 062C ;     SL      # ( ‎ﱋ‎ → ‎بج‎ ) ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM   # →‎نج‎→→‎ﳒ‎→→‎ﲞ‎→→‎بخ‎→→‎ﰇ‎→→‎ﰅ‎→
+FCD4 ; 0628 062C ;     SL      # ( ‎ﳔ‎ → ‎بج‎ ) ARABIC LIGATURE NOON WITH KHAH INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM    # →‎نخ‎→→‎ﱍ‎→→‎ﱋ‎→→‎نج‎→→‎ﳒ‎→→‎ﲞ‎→→‎بخ‎→→‎ﰇ‎→→‎ﰅ‎→
+FC4D ; 0628 062C ;     SL      # ( ‎ﱍ‎ → ‎بج‎ ) ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM   # →‎ﱋ‎→→‎نج‎→→‎ﳒ‎→→‎ﲞ‎→→‎بخ‎→→‎ﰇ‎→→‎ﰅ‎→
+
+FDB8 ; 0628 062C 062D ;        SL      # ( ‎ﶸ‎ → ‎بجح‎ ) ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM, ARABIC LETTER HAH      # →‎نجح‎→
+FDBD ; 0628 062C 062D ;        SL      # ( ‎ﶽ‎ → ‎بجح‎ ) ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM, ARABIC LETTER HAH        # →‎نجح‎→
+
+FD98 ; 0628 062C 0645 ;        SL      # ( ‎ﶘ‎ → ‎بجم‎ ) ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM, ARABIC LETTER MEEM    # →‎نجم‎→
+FD97 ; 0628 062C 0645 ;        SL      # ( ‎ﶗ‎ → ‎بجم‎ ) ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM, ARABIC LETTER MEEM      # →‎نجم‎→
+
+FD9E ; 0628 062C 0649 ;        SL      # ( ‎ﶞ‎ → ‎بجى‎ ) ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA        # →‎بخي‎→
+FD99 ; 0628 062C 0649 ;        SL      # ( ‎ﶙ‎ → ‎بجى‎ ) ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA      # →‎نجى‎→
+FDC7 ; 0628 062C 0649 ;        SL      # ( ‎ﷇ‎ → ‎بجى‎ ) ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA       # →‎نجي‎→
+
+FC9D ; 0628 062D ;     SL      # ( ‎ﲝ‎ → ‎بح‎ ) ARABIC LIGATURE BEH WITH HAH INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER HAH       # 
+FC06 ; 0628 062D ;     SL      # ( ‎ﰆ‎ → ‎بح‎ ) ARABIC LIGATURE BEH WITH HAH ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER HAH      # 
+FCD3 ; 0628 062D ;     SL      # ( ‎ﳓ‎ → ‎بح‎ ) ARABIC LIGATURE NOON WITH HAH INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER HAH      # →‎نح‎→
+FC4C ; 0628 062D ;     SL      # ( ‎ﱌ‎ → ‎بح‎ ) ARABIC LIGATURE NOON WITH HAH ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER HAH     # →‎نح‎→
+
+FD95 ; 0628 062D 0645 ;        SL      # ( ‎ﶕ‎ → ‎بحم‎ ) ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER HAH, ARABIC LETTER MEEM      # →‎نحم‎→
+
+FDC2 ; 0628 062D 0649 ;        SL      # ( ‎ﷂ‎ → ‎بحى‎ ) ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA  # →‎بحي‎→
+FD96 ; 0628 062D 0649 ;        SL      # ( ‎ﶖ‎ → ‎بحى‎ ) ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA        # →‎نحى‎→
+FDB3 ; 0628 062D 0649 ;        SL      # ( ‎ﶳ‎ → ‎بحى‎ ) ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA # →‎نحي‎→
+
+FC6A ; 0628 0631 ;     SL      # ( ‎ﱪ‎ → ‎بر‎ ) ARABIC LIGATURE BEH WITH REH FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER REH # 
+FC8A ; 0628 0631 ;     SL      # ( ‎ﲊ‎ → ‎بر‎ ) ARABIC LIGATURE NOON WITH REH FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER REH        # →‎نر‎→
+
+FC6B ; 0628 0632 ;     SL      # ( ‎ﱫ‎ → ‎بز‎ ) ARABIC LIGATURE BEH WITH ZAIN FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER ZAIN       # 
+FC8B ; 0628 0632 ;     SL      # ( ‎ﲋ‎ → ‎بز‎ ) ARABIC LIGATURE NOON WITH ZAIN FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER ZAIN      # →‎نز‎→
+
+FC9F ; 0628 0645 ;     SL      # ( ‎ﲟ‎ → ‎بم‎ ) ARABIC LIGATURE BEH WITH MEEM INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER MEEM     # 
+FCE1 ; 0628 0645 ;     SL      # ( ‎ﳡ‎ → ‎بم‎ ) ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM → ARABIC LETTER BEH, ARABIC LETTER MEEM      # 
+FC6C ; 0628 0645 ;     SL      # ( ‎ﱬ‎ → ‎بم‎ ) ARABIC LIGATURE BEH WITH MEEM FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER MEEM       # 
+FC08 ; 0628 0645 ;     SL      # ( ‎ﰈ‎ → ‎بم‎ ) ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER MEEM    # 
+FCD5 ; 0628 0645 ;     SL      # ( ‎ﳕ‎ → ‎بم‎ ) ARABIC LIGATURE NOON WITH MEEM INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER MEEM    # →‎نم‎→
+FCEE ; 0628 0645 ;     SL      # ( ‎ﳮ‎ → ‎بم‎ ) ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM → ARABIC LETTER BEH, ARABIC LETTER MEEM     # →‎نم‎→
+FC8C ; 0628 0645 ;     SL      # ( ‎ﲌ‎ → ‎بم‎ ) ARABIC LIGATURE NOON WITH MEEM FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER MEEM      # →‎نم‎→
+FC4E ; 0628 0645 ;     SL      # ( ‎ﱎ‎ → ‎بم‎ ) ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER MEEM   # →‎نم‎→
+
+FD9B ; 0628 0645 0649 ;        SL      # ( ‎ﶛ‎ → ‎بمى‎ ) ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA      # →‎نمى‎→
+FD9A ; 0628 0645 0649 ;        SL      # ( ‎ﶚ‎ → ‎بمى‎ ) ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA       # →‎نمي‎→
+
+FCA0 ; 0628 0647 ;     SL      # ( ‎ﲠ‎ → ‎به‎ ) ARABIC LIGATURE BEH WITH HEH INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER HEH       # 
+FCE2 ; 0628 0647 ;     SL      # ( ‎ﳢ‎ → ‎به‎ ) ARABIC LIGATURE BEH WITH HEH MEDIAL FORM → ARABIC LETTER BEH, ARABIC LETTER HEH        # 
+FCD6 ; 0628 0647 ;     SL      # ( ‎ﳖ‎ → ‎به‎ ) ARABIC LIGATURE NOON WITH HEH INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER HEH      # →‎نه‎→
+FCEF ; 0628 0647 ;     SL      # ( ‎ﳯ‎ → ‎به‎ ) ARABIC LIGATURE NOON WITH HEH MEDIAL FORM → ARABIC LETTER BEH, ARABIC LETTER HEH       # →‎نه‎→
+
+FC6E ; 0628 0649 ;     SL      # ( ‎ﱮ‎ → ‎بى‎ ) ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER ALEF MAKSURA       # 
+FC09 ; 0628 0649 ;     SL      # ( ‎ﰉ‎ → ‎بى‎ ) ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER ALEF MAKSURA    # 
+FC6F ; 0628 0649 ;     SL      # ( ‎ﱯ‎ → ‎بى‎ ) ARABIC LIGATURE BEH WITH YEH FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER ALEF MAKSURA        # →‎بي‎→
+FC0A ; 0628 0649 ;     SL      # ( ‎ﰊ‎ → ‎بى‎ ) ARABIC LIGATURE BEH WITH YEH ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER ALEF MAKSURA     # →‎بي‎→
+FC8E ; 0628 0649 ;     SL      # ( ‎ﲎ‎ → ‎بى‎ ) ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER ALEF MAKSURA      # →‎نى‎→
+FC4F ; 0628 0649 ;     SL      # ( ‎ﱏ‎ → ‎بى‎ ) ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER ALEF MAKSURA   # →‎نى‎→
+FC8F ; 0628 0649 ;     SL      # ( ‎ﲏ‎ → ‎بى‎ ) ARABIC LIGATURE NOON WITH YEH FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER ALEF MAKSURA       # →‎ني‎→
+FC50 ; 0628 0649 ;     SL      # ( ‎ﱐ‎ → ‎بى‎ ) ARABIC LIGATURE NOON WITH YEH ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER ALEF MAKSURA    # →‎ني‎→
+
+FB58 ; 067E ;  SL      # ( ‎ﭘ‎ → ‎پ‎ ) ARABIC LETTER PEH INITIAL FORM → ARABIC LETTER PEH       # 
+FB59 ; 067E ;  SL      # ( ‎ﭙ‎ → ‎پ‎ ) ARABIC LETTER PEH MEDIAL FORM → ARABIC LETTER PEH        # 
+FB57 ; 067E ;  SL      # ( ‎ﭗ‎ → ‎پ‎ ) ARABIC LETTER PEH FINAL FORM → ARABIC LETTER PEH # 
+FB56 ; 067E ;  SL      # ( ‎ﭖ‎ → ‎پ‎ ) ARABIC LETTER PEH ISOLATED FORM → ARABIC LETTER PEH      # 
+
+FE94 ; 0629 ;  SL      # ( ‎ﺔ‎ → ‎ة‎ ) ARABIC LETTER TEH MARBUTA FINAL FORM → ARABIC LETTER TEH MARBUTA # 
+FE93 ; 0629 ;  SL      # ( ‎ﺓ‎ → ‎ة‎ ) ARABIC LETTER TEH MARBUTA ISOLATED FORM → ARABIC LETTER TEH MARBUTA      # 
+06C3 ; 0629 ;  SL      # ( ‎ۃ‎ → ‎ة‎ ) ARABIC LETTER TEH MARBUTA GOAL → ARABIC LETTER TEH MARBUTA        # →ö→
+
+FE97 ; 062A ;  SL      # ( ‎ﺗ‎ → ‎ت‎ ) ARABIC LETTER TEH INITIAL FORM → ARABIC LETTER TEH       # 
+FE98 ; 062A ;  SL      # ( ‎ﺘ‎ → ‎ت‎ ) ARABIC LETTER TEH MEDIAL FORM → ARABIC LETTER TEH        # 
+FE96 ; 062A ;  SL      # ( ‎ﺖ‎ → ‎ت‎ ) ARABIC LETTER TEH FINAL FORM → ARABIC LETTER TEH # 
+FE95 ; 062A ;  SL      # ( ‎ﺕ‎ → ‎ت‎ ) ARABIC LETTER TEH ISOLATED FORM → ARABIC LETTER TEH      # 
+
+FC73 ; 062A 0628 ;     SL      # ( ‎ﱳ‎ → ‎تب‎ ) ARABIC LIGATURE TEH WITH NOON FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER BEH        # →‎تن‎→
+
+FCA1 ; 062A 062C ;     SL      # ( ‎ﲡ‎ → ‎تج‎ ) ARABIC LIGATURE TEH WITH JEEM INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM     # 
+FC0B ; 062A 062C ;     SL      # ( ‎ﰋ‎ → ‎تج‎ ) ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM    # 
+FCA3 ; 062A 062C ;     SL      # ( ‎ﲣ‎ → ‎تج‎ ) ARABIC LIGATURE TEH WITH KHAH INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM     # →‎تخ‎→→‎ﰍ‎→→‎ﰋ‎→
+FC0D ; 062A 062C ;     SL      # ( ‎ﰍ‎ → ‎تج‎ ) ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM    # →‎ﰋ‎→
+FCDA ; 062A 062C ;     SL      # ( ‎ﳚ‎ → ‎تج‎ ) ARABIC LIGATURE YEH WITH JEEM INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM     # →‎ﲡ‎→
+FC55 ; 062A 062C ;     SL      # ( ‎ﱕ‎ → ‎تج‎ ) ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM    # →‎يج‎→→‎ﳚ‎→→‎ﲡ‎→
+FCDC ; 062A 062C ;     SL      # ( ‎ﳜ‎ → ‎تج‎ ) ARABIC LIGATURE YEH WITH KHAH INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM     # →‎ﲣ‎→→‎تخ‎→→‎ﰍ‎→→‎ﰋ‎→
+FC57 ; 062A 062C ;     SL      # ( ‎ﱗ‎ → ‎تج‎ ) ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM    # →‎ﱕ‎→→‎يج‎→→‎ﳚ‎→→‎ﲡ‎→
+
+FD50 ; 062A 062C 0645 ;        SL      # ( ‎ﵐ‎ → ‎تجم‎ ) ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM, ARABIC LETTER MEEM     # 
+FD54 ; 062A 062C 0645 ;        SL      # ( ‎ﵔ‎ → ‎تجم‎ ) ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM, ARABIC LETTER MEEM     # →‎تخم‎→
+
+FDA0 ; 062A 062C 0649 ;        SL      # ( ‎ﶠ‎ → ‎تجى‎ ) ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA       # 
+FD9F ; 062A 062C 0649 ;        SL      # ( ‎ﶟ‎ → ‎تجى‎ ) ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA        # →‎تجي‎→
+FDA2 ; 062A 062C 0649 ;        SL      # ( ‎ﶢ‎ → ‎تجى‎ ) ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA       # →‎تخى‎→
+FDA1 ; 062A 062C 0649 ;        SL      # ( ‎ﶡ‎ → ‎تجى‎ ) ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA        # →‎تخي‎→
+
+FCA2 ; 062A 062D ;     SL      # ( ‎ﲢ‎ → ‎تح‎ ) ARABIC LIGATURE TEH WITH HAH INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER HAH       # 
+FC0C ; 062A 062D ;     SL      # ( ‎ﰌ‎ → ‎تح‎ ) ARABIC LIGATURE TEH WITH HAH ISOLATED FORM → ARABIC LETTER TEH, ARABIC LETTER HAH      # 
+FCDB ; 062A 062D ;     SL      # ( ‎ﳛ‎ → ‎تح‎ ) ARABIC LIGATURE YEH WITH HAH INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER HAH       # →‎ﲢ‎→
+FC56 ; 062A 062D ;     SL      # ( ‎ﱖ‎ → ‎تح‎ ) ARABIC LIGATURE YEH WITH HAH ISOLATED FORM → ARABIC LETTER TEH, ARABIC LETTER HAH      # →‎يح‎→→‎ﳛ‎→→‎ﲢ‎→
+
+FD52 ; 062A 062D 062C ;        SL      # ( ‎ﵒ‎ → ‎تحج‎ ) ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER HAH, ARABIC LETTER JEEM       # 
+FD51 ; 062A 062D 062C ;        SL      # ( ‎ﵑ‎ → ‎تحج‎ ) ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER HAH, ARABIC LETTER JEEM # 
+
+FD53 ; 062A 062D 0645 ;        SL      # ( ‎ﵓ‎ → ‎تحم‎ ) ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER HAH, ARABIC LETTER MEEM       # 
+
+FC70 ; 062A 0631 ;     SL      # ( ‎ﱰ‎ → ‎تر‎ ) ARABIC LIGATURE TEH WITH REH FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER REH # 
+
+FC71 ; 062A 0632 ;     SL      # ( ‎ﱱ‎ → ‎تز‎ ) ARABIC LIGATURE TEH WITH ZAIN FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER ZAIN       # 
+
+FCA4 ; 062A 0645 ;     SL      # ( ‎ﲤ‎ → ‎تم‎ ) ARABIC LIGATURE TEH WITH MEEM INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER MEEM     # 
+FCE3 ; 062A 0645 ;     SL      # ( ‎ﳣ‎ → ‎تم‎ ) ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM → ARABIC LETTER TEH, ARABIC LETTER MEEM      # 
+FC72 ; 062A 0645 ;     SL      # ( ‎ﱲ‎ → ‎تم‎ ) ARABIC LIGATURE TEH WITH MEEM FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER MEEM       # 
+FC0E ; 062A 0645 ;     SL      # ( ‎ﰎ‎ → ‎تم‎ ) ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM → ARABIC LETTER TEH, ARABIC LETTER MEEM    # 
+
+FD55 ; 062A 0645 062C ;        SL      # ( ‎ﵕ‎ → ‎تمج‎ ) ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER MEEM, ARABIC LETTER JEEM     # 
+FD57 ; 062A 0645 062C ;        SL      # ( ‎ﵗ‎ → ‎تمج‎ ) ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER MEEM, ARABIC LETTER JEEM     # →‎تمخ‎→
+
+FD56 ; 062A 0645 062D ;        SL      # ( ‎ﵖ‎ → ‎تمح‎ ) ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER MEEM, ARABIC LETTER HAH       # 
+
+FDA4 ; 062A 0645 0649 ;        SL      # ( ‎ﶤ‎ → ‎تمى‎ ) ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA       # 
+FDA3 ; 062A 0645 0649 ;        SL      # ( ‎ﶣ‎ → ‎تمى‎ ) ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA        # →‎تمي‎→
+
+FCA5 ; 062A 0647 ;     SL      # ( ‎ﲥ‎ → ‎ته‎ ) ARABIC LIGATURE TEH WITH HEH INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER HEH       # 
+FCE4 ; 062A 0647 ;     SL      # ( ‎ﳤ‎ → ‎ته‎ ) ARABIC LIGATURE TEH WITH HEH MEDIAL FORM → ARABIC LETTER TEH, ARABIC LETTER HEH        # 
+
+FC74 ; 062A 0649 ;     SL      # ( ‎ﱴ‎ → ‎تى‎ ) ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER ALEF MAKSURA       # 
+FC0F ; 062A 0649 ;     SL      # ( ‎ﰏ‎ → ‎تى‎ ) ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER TEH, ARABIC LETTER ALEF MAKSURA    # 
+FC75 ; 062A 0649 ;     SL      # ( ‎ﱵ‎ → ‎تى‎ ) ARABIC LIGATURE TEH WITH YEH FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER ALEF MAKSURA        # →‎تي‎→
+FC10 ; 062A 0649 ;     SL      # ( ‎ﰐ‎ → ‎تى‎ ) ARABIC LIGATURE TEH WITH YEH ISOLATED FORM → ARABIC LETTER TEH, ARABIC LETTER ALEF MAKSURA     # →‎تي‎→
+
+FE9B ; 062B ;  SL      # ( ‎ﺛ‎ → ‎ث‎ ) ARABIC LETTER THEH INITIAL FORM → ARABIC LETTER THEH     # 
+FE9C ; 062B ;  SL      # ( ‎ﺜ‎ → ‎ث‎ ) ARABIC LETTER THEH MEDIAL FORM → ARABIC LETTER THEH      # 
+FE9A ; 062B ;  SL      # ( ‎ﺚ‎ → ‎ث‎ ) ARABIC LETTER THEH FINAL FORM → ARABIC LETTER THEH       # 
+FE99 ; 062B ;  SL      # ( ‎ﺙ‎ → ‎ث‎ ) ARABIC LETTER THEH ISOLATED FORM → ARABIC LETTER THEH    # 
+
+FC79 ; 062B 0628 ;     SL      # ( ‎ﱹ‎ → ‎ثب‎ ) ARABIC LIGATURE THEH WITH NOON FINAL FORM → ARABIC LETTER THEH, ARABIC LETTER BEH      # →‎ثن‎→
+
+FC11 ; 062B 062C ;     SL      # ( ‎ﰑ‎ → ‎ثج‎ ) ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM → ARABIC LETTER THEH, ARABIC LETTER JEEM  # 
+
+FC76 ; 062B 0631 ;     SL      # ( ‎ﱶ‎ → ‎ثر‎ ) ARABIC LIGATURE THEH WITH REH FINAL FORM → ARABIC LETTER THEH, ARABIC LETTER REH       # 
+
+FC77 ; 062B 0632 ;     SL      # ( ‎ﱷ‎ → ‎ثز‎ ) ARABIC LIGATURE THEH WITH ZAIN FINAL FORM → ARABIC LETTER THEH, ARABIC LETTER ZAIN     # 
+
+FCA6 ; 062B 0645 ;     SL      # ( ‎ﲦ‎ → ‎ثم‎ ) ARABIC LIGATURE THEH WITH MEEM INITIAL FORM → ARABIC LETTER THEH, ARABIC LETTER MEEM   # 
+FCE5 ; 062B 0645 ;     SL      # ( ‎ﳥ‎ → ‎ثم‎ ) ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM → ARABIC LETTER THEH, ARABIC LETTER MEEM    # 
+FC78 ; 062B 0645 ;     SL      # ( ‎ﱸ‎ → ‎ثم‎ ) ARABIC LIGATURE THEH WITH MEEM FINAL FORM → ARABIC LETTER THEH, ARABIC LETTER MEEM     # 
+FC12 ; 062B 0645 ;     SL      # ( ‎ﰒ‎ → ‎ثم‎ ) ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM → ARABIC LETTER THEH, ARABIC LETTER MEEM  # 
+
+FCE6 ; 062B 0647 ;     SL      # ( ‎ﳦ‎ → ‎ثه‎ ) ARABIC LIGATURE THEH WITH HEH MEDIAL FORM → ARABIC LETTER THEH, ARABIC LETTER HEH      # 
+
+FC7A ; 062B 0649 ;     SL      # ( ‎ﱺ‎ → ‎ثى‎ ) ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER THEH, ARABIC LETTER ALEF MAKSURA     # 
+FC13 ; 062B 0649 ;     SL      # ( ‎ﰓ‎ → ‎ثى‎ ) ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER THEH, ARABIC LETTER ALEF MAKSURA  # 
+FC7B ; 062B 0649 ;     SL      # ( ‎ﱻ‎ → ‎ثى‎ ) ARABIC LIGATURE THEH WITH YEH FINAL FORM → ARABIC LETTER THEH, ARABIC LETTER ALEF MAKSURA      # →‎ثي‎→
+FC14 ; 062B 0649 ;     SL      # ( ‎ﰔ‎ → ‎ثى‎ ) ARABIC LIGATURE THEH WITH YEH ISOLATED FORM → ARABIC LETTER THEH, ARABIC LETTER ALEF MAKSURA   # →‎ثي‎→
+
+FB68 ; 0679 ;  SL      # ( ‎ﭨ‎ → ‎ٹ‎ ) ARABIC LETTER TTEH INITIAL FORM → ARABIC LETTER TTEH     # 
+FB69 ; 0679 ;  SL      # ( ‎ﭩ‎ → ‎ٹ‎ ) ARABIC LETTER TTEH MEDIAL FORM → ARABIC LETTER TTEH      # 
+FB67 ; 0679 ;  SL      # ( ‎ﭧ‎ → ‎ٹ‎ ) ARABIC LETTER TTEH FINAL FORM → ARABIC LETTER TTEH       # 
+FB66 ; 0679 ;  SL      # ( ‎ﭦ‎ → ‎ٹ‎ ) ARABIC LETTER TTEH ISOLATED FORM → ARABIC LETTER TTEH    # 
+06BB ; 0679 ;  SL      # ( ‎ڻ‎ → ‎ٹ‎ ) ARABIC LETTER RNOON → ARABIC LETTER TTEH  # →‎ﮢ‎→→‎ﭩ‎→
+FBA2 ; 0679 ;  SL      # ( ‎ﮢ‎ → ‎ٹ‎ ) ARABIC LETTER RNOON INITIAL FORM → ARABIC LETTER TTEH    # →‎ﭩ‎→
+FBA3 ; 0679 ;  SL      # ( ‎ﮣ‎ → ‎ٹ‎ ) ARABIC LETTER RNOON MEDIAL FORM → ARABIC LETTER TTEH     # →‎ﭩ‎→
+FBA1 ; 0679 ;  SL      # ( ‎ﮡ‎ → ‎ٹ‎ ) ARABIC LETTER RNOON FINAL FORM → ARABIC LETTER TTEH      # →‎ڻ‎→→‎ﮢ‎→→‎ﭩ‎→
+FBA0 ; 0679 ;  SL      # ( ‎ﮠ‎ → ‎ٹ‎ ) ARABIC LETTER RNOON ISOLATED FORM → ARABIC LETTER TTEH   # →‎ڻ‎→→‎ﮢ‎→→‎ﭩ‎→
+
+067B ; 067A ;  SL      # ( ‎ٻ‎ → ‎ٺ‎ ) ARABIC LETTER BEEH → ARABIC LETTER TTEHEH # →‎ﭞ‎→
+FB54 ; 067A ;  SL      # ( ‎ﭔ‎ → ‎ٺ‎ ) ARABIC LETTER BEEH INITIAL FORM → ARABIC LETTER TTEHEH   # →‎ﭡ‎→
+FB55 ; 067A ;  SL      # ( ‎ﭕ‎ → ‎ٺ‎ ) ARABIC LETTER BEEH MEDIAL FORM → ARABIC LETTER TTEHEH    # →‎ﭡ‎→
+FB53 ; 067A ;  SL      # ( ‎ﭓ‎ → ‎ٺ‎ ) ARABIC LETTER BEEH FINAL FORM → ARABIC LETTER TTEHEH     # 
+FB52 ; 067A ;  SL      # ( ‎ﭒ‎ → ‎ٺ‎ ) ARABIC LETTER BEEH ISOLATED FORM → ARABIC LETTER TTEHEH  # 
+FB60 ; 067A ;  SL      # ( ‎ﭠ‎ → ‎ٺ‎ ) ARABIC LETTER TTEHEH INITIAL FORM → ARABIC LETTER TTEHEH # 
+FB61 ; 067A ;  SL      # ( ‎ﭡ‎ → ‎ٺ‎ ) ARABIC LETTER TTEHEH MEDIAL FORM → ARABIC LETTER TTEHEH  # 
+FB5F ; 067A ;  SL      # ( ‎ﭟ‎ → ‎ٺ‎ ) ARABIC LETTER TTEHEH FINAL FORM → ARABIC LETTER TTEHEH   # 
+FB5E ; 067A ;  SL      # ( ‎ﭞ‎ → ‎ٺ‎ ) ARABIC LETTER TTEHEH ISOLATED FORM → ARABIC LETTER TTEHEH        # 
+06D0 ; 067A ;  SL      # ( ‎ې‎ → ‎ٺ‎ ) ARABIC LETTER E → ARABIC LETTER TTEHEH    # →‎ﯦ‎→→‎ﭡ‎→
+FBE6 ; 067A ;  SL      # ( ‎ﯦ‎ → ‎ٺ‎ ) ARABIC LETTER E INITIAL FORM → ARABIC LETTER TTEHEH      # →‎ﭡ‎→
+FBE7 ; 067A ;  SL      # ( ‎ﯧ‎ → ‎ٺ‎ ) ARABIC LETTER E MEDIAL FORM → ARABIC LETTER TTEHEH       # →‎ﭡ‎→
+FBE5 ; 067A ;  SL      # ( ‎ﯥ‎ → ‎ٺ‎ ) ARABIC LETTER E FINAL FORM → ARABIC LETTER TTEHEH        # →‎ې‎→→‎ﯦ‎→→‎ﭡ‎→
+FBE4 ; 067A ;  SL      # ( ‎ﯤ‎ → ‎ٺ‎ ) ARABIC LETTER E ISOLATED FORM → ARABIC LETTER TTEHEH     # →‎ې‎→→‎ﯦ‎→→‎ﭡ‎→
+
+0680 ; 067F ;  SL      # ( ‎ڀ‎ → ‎ٿ‎ ) ARABIC LETTER BEHEH → ARABIC LETTER TEHEH # →‎ﭚ‎→
+FB5C ; 067F ;  SL      # ( ‎ﭜ‎ → ‎ٿ‎ ) ARABIC LETTER BEHEH INITIAL FORM → ARABIC LETTER TEHEH   # →‎ﭥ‎→
+FB5D ; 067F ;  SL      # ( ‎ﭝ‎ → ‎ٿ‎ ) ARABIC LETTER BEHEH MEDIAL FORM → ARABIC LETTER TEHEH    # →‎ﭥ‎→
+FB5B ; 067F ;  SL      # ( ‎ﭛ‎ → ‎ٿ‎ ) ARABIC LETTER BEHEH FINAL FORM → ARABIC LETTER TEHEH     # 
+FB5A ; 067F ;  SL      # ( ‎ﭚ‎ → ‎ٿ‎ ) ARABIC LETTER BEHEH ISOLATED FORM → ARABIC LETTER TEHEH  # 
+FB64 ; 067F ;  SL      # ( ‎ﭤ‎ → ‎ٿ‎ ) ARABIC LETTER TEHEH INITIAL FORM → ARABIC LETTER TEHEH   # 
+FB65 ; 067F ;  SL      # ( ‎ﭥ‎ → ‎ٿ‎ ) ARABIC LETTER TEHEH MEDIAL FORM → ARABIC LETTER TEHEH    # 
+FB63 ; 067F ;  SL      # ( ‎ﭣ‎ → ‎ٿ‎ ) ARABIC LETTER TEHEH FINAL FORM → ARABIC LETTER TEHEH     # 
+FB62 ; 067F ;  SL      # ( ‎ﭢ‎ → ‎ٿ‎ ) ARABIC LETTER TEHEH ISOLATED FORM → ARABIC LETTER TEHEH  # 
+
+FE9F ; 062C ;  SL      # ( ‎ﺟ‎ → ‎ج‎ ) ARABIC LETTER JEEM INITIAL FORM → ARABIC LETTER JEEM     # 
+FEA0 ; 062C ;  SL      # ( ‎ﺠ‎ → ‎ج‎ ) ARABIC LETTER JEEM MEDIAL FORM → ARABIC LETTER JEEM      # 
+FE9E ; 062C ;  SL      # ( ‎ﺞ‎ → ‎ج‎ ) ARABIC LETTER JEEM FINAL FORM → ARABIC LETTER JEEM       # 
+FE9D ; 062C ;  SL      # ( ‎ﺝ‎ → ‎ج‎ ) ARABIC LETTER JEEM ISOLATED FORM → ARABIC LETTER JEEM    # 
+062E ; 062C ;  SL      # ( ‎خ‎ → ‎ج‎ ) ARABIC LETTER KHAH → ARABIC LETTER JEEM   # 
+FEA7 ; 062C ;  SL      # ( ‎ﺧ‎ → ‎ج‎ ) ARABIC LETTER KHAH INITIAL FORM → ARABIC LETTER JEEM     # →‎خ‎→
+FEA8 ; 062C ;  SL      # ( ‎ﺨ‎ → ‎ج‎ ) ARABIC LETTER KHAH MEDIAL FORM → ARABIC LETTER JEEM      # →‎خ‎→
+FEA6 ; 062C ;  SL      # ( ‎ﺦ‎ → ‎ج‎ ) ARABIC LETTER KHAH FINAL FORM → ARABIC LETTER JEEM       # →‎خ‎→
+FEA5 ; 062C ;  SL      # ( ‎ﺥ‎ → ‎ج‎ ) ARABIC LETTER KHAH ISOLATED FORM → ARABIC LETTER JEEM    # 
+
+FCAB ; 062C 062C ;     SL      # ( ‎ﲫ‎ → ‎جج‎ ) ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM → ARABIC LETTER JEEM, ARABIC LETTER JEEM   # →‎خج‎→
+FC19 ; 062C 062C ;     SL      # ( ‎ﰙ‎ → ‎جج‎ ) ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM → ARABIC LETTER JEEM, ARABIC LETTER JEEM  # →‎خج‎→
+
+FCA7 ; 062C 062D ;     SL      # ( ‎ﲧ‎ → ‎جح‎ ) ARABIC LIGATURE JEEM WITH HAH INITIAL FORM → ARABIC LETTER JEEM, ARABIC LETTER HAH     # 
+FC15 ; 062C 062D ;     SL      # ( ‎ﰕ‎ → ‎جح‎ ) ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM → ARABIC LETTER JEEM, ARABIC LETTER HAH    # 
+FC1A ; 062C 062D ;     SL      # ( ‎ﰚ‎ → ‎جح‎ ) ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM → ARABIC LETTER JEEM, ARABIC LETTER HAH    # →‎ﰕ‎→
+
+FDA6 ; 062C 062D 0649 ;        SL      # ( ‎ﶦ‎ → ‎جحى‎ ) ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER JEEM, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA       # 
+FDBE ; 062C 062D 0649 ;        SL      # ( ‎ﶾ‎ → ‎جحى‎ ) ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM → ARABIC LETTER JEEM, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA        # →‎جحي‎→
+
+FDFB ; 062C 0644 0020 062C 0644 0627 0644 0647 ;       SL      #* ( ‎ﷻ‎ → ‎جل جلاله‎ ) ARABIC LIGATURE JALLAJALALOUHOU → ARABIC LETTER JEEM, ARABIC LETTER LAM, SPACE, ARABIC LETTER JEEM, ARABIC LETTER LAM, ARABIC LETTER ALEF, ARABIC LETTER LAM, ARABIC LETTER HEH    # 
+
+FCA8 ; 062C 0645 ;     SL      # ( ‎ﲨ‎ → ‎جم‎ ) ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM → ARABIC LETTER JEEM, ARABIC LETTER MEEM   # 
+FC16 ; 062C 0645 ;     SL      # ( ‎ﰖ‎ → ‎جم‎ ) ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM → ARABIC LETTER JEEM, ARABIC LETTER MEEM  # 
+FCAC ; 062C 0645 ;     SL      # ( ‎ﲬ‎ → ‎جم‎ ) ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM → ARABIC LETTER JEEM, ARABIC LETTER MEEM   # →‎ﲨ‎→
+FC1B ; 062C 0645 ;     SL      # ( ‎ﰛ‎ → ‎جم‎ ) ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM → ARABIC LETTER JEEM, ARABIC LETTER MEEM  # →‎ﰖ‎→
+
+FD59 ; 062C 0645 062D ;        SL      # ( ‎ﵙ‎ → ‎جمح‎ ) ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM → ARABIC LETTER JEEM, ARABIC LETTER MEEM, ARABIC LETTER HAH     # 
+FD58 ; 062C 0645 062D ;        SL      # ( ‎ﵘ‎ → ‎جمح‎ ) ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM → ARABIC LETTER JEEM, ARABIC LETTER MEEM, ARABIC LETTER HAH       # 
+
+FDA7 ; 062C 0645 0649 ;        SL      # ( ‎ﶧ‎ → ‎جمى‎ ) ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER JEEM, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA     # 
+FDA5 ; 062C 0645 0649 ;        SL      # ( ‎ﶥ‎ → ‎جمى‎ ) ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER JEEM, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA      # →‎جمي‎→
+
+FD1D ; 062C 0649 ;     SL      # ( ‎ﴝ‎ → ‎جى‎ ) ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA     # 
+FD01 ; 062C 0649 ;     SL      # ( ‎ﴁ‎ → ‎جى‎ ) ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA  # 
+FD1E ; 062C 0649 ;     SL      # ( ‎ﴞ‎ → ‎جى‎ ) ARABIC LIGATURE JEEM WITH YEH FINAL FORM → ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA      # →‎جي‎→
+FD02 ; 062C 0649 ;     SL      # ( ‎ﴂ‎ → ‎جى‎ ) ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM → ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA   # →‎جي‎→
+FD1F ; 062C 0649 ;     SL      # ( ‎ﴟ‎ → ‎جى‎ ) ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA     # →‎خى‎→→‎ﴃ‎→→‎ﴁ‎→
+FD03 ; 062C 0649 ;     SL      # ( ‎ﴃ‎ → ‎جى‎ ) ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA  # →‎ﴁ‎→
+FD20 ; 062C 0649 ;     SL      # ( ‎ﴠ‎ → ‎جى‎ ) ARABIC LIGATURE KHAH WITH YEH FINAL FORM → ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA      # →‎خي‎→→‎ﴄ‎→→‎ﴂ‎→→‎جي‎→
+FD04 ; 062C 0649 ;     SL      # ( ‎ﴄ‎ → ‎جى‎ ) ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM → ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA   # →‎ﴂ‎→→‎جي‎→
+
+FB78 ; 0683 ;  SL      # ( ‎ﭸ‎ → ‎ڃ‎ ) ARABIC LETTER NYEH INITIAL FORM → ARABIC LETTER NYEH     # 
+FB79 ; 0683 ;  SL      # ( ‎ﭹ‎ → ‎ڃ‎ ) ARABIC LETTER NYEH MEDIAL FORM → ARABIC LETTER NYEH      # 
+FB77 ; 0683 ;  SL      # ( ‎ﭷ‎ → ‎ڃ‎ ) ARABIC LETTER NYEH FINAL FORM → ARABIC LETTER NYEH       # 
+FB76 ; 0683 ;  SL      # ( ‎ﭶ‎ → ‎ڃ‎ ) ARABIC LETTER NYEH ISOLATED FORM → ARABIC LETTER NYEH    # 
+
+FB7C ; 0686 ;  SL      # ( ‎ﭼ‎ → ‎چ‎ ) ARABIC LETTER TCHEH INITIAL FORM → ARABIC LETTER TCHEH   # 
+FB7D ; 0686 ;  SL      # ( ‎ﭽ‎ → ‎چ‎ ) ARABIC LETTER TCHEH MEDIAL FORM → ARABIC LETTER TCHEH    # 
+FB7B ; 0686 ;  SL      # ( ‎ﭻ‎ → ‎چ‎ ) ARABIC LETTER TCHEH FINAL FORM → ARABIC LETTER TCHEH     # 
+FB7A ; 0686 ;  SL      # ( ‎ﭺ‎ → ‎چ‎ ) ARABIC LETTER TCHEH ISOLATED FORM → ARABIC LETTER TCHEH  # 
+
+FB80 ; 0687 ;  SL      # ( ‎ﮀ‎ → ‎ڇ‎ ) ARABIC LETTER TCHEHEH INITIAL FORM → ARABIC LETTER TCHEHEH       # 
+FB81 ; 0687 ;  SL      # ( ‎ﮁ‎ → ‎ڇ‎ ) ARABIC LETTER TCHEHEH MEDIAL FORM → ARABIC LETTER TCHEHEH        # 
+FB7F ; 0687 ;  SL      # ( ‎ﭿ‎ → ‎ڇ‎ ) ARABIC LETTER TCHEHEH FINAL FORM → ARABIC LETTER TCHEHEH # 
+FB7E ; 0687 ;  SL      # ( ‎ﭾ‎ → ‎ڇ‎ ) ARABIC LETTER TCHEHEH ISOLATED FORM → ARABIC LETTER TCHEHEH      # 
+
+FEA3 ; 062D ;  SL      # ( ‎ﺣ‎ → ‎ح‎ ) ARABIC LETTER HAH INITIAL FORM → ARABIC LETTER HAH       # 
+FEA4 ; 062D ;  SL      # ( ‎ﺤ‎ → ‎ح‎ ) ARABIC LETTER HAH MEDIAL FORM → ARABIC LETTER HAH        # 
+FEA2 ; 062D ;  SL      # ( ‎ﺢ‎ → ‎ح‎ ) ARABIC LETTER HAH FINAL FORM → ARABIC LETTER HAH # 
+FEA1 ; 062D ;  SL      # ( ‎ﺡ‎ → ‎ح‎ ) ARABIC LETTER HAH ISOLATED FORM → ARABIC LETTER HAH      # 
+
+FCA9 ; 062D 062C ;     SL      # ( ‎ﲩ‎ → ‎حج‎ ) ARABIC LIGATURE HAH WITH JEEM INITIAL FORM → ARABIC LETTER HAH, ARABIC LETTER JEEM     # 
+FC17 ; 062D 062C ;     SL      # ( ‎ﰗ‎ → ‎حج‎ ) ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM → ARABIC LETTER HAH, ARABIC LETTER JEEM    # 
+
+FDBF ; 062D 062C 0649 ;        SL      # ( ‎ﶿ‎ → ‎حجى‎ ) ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM → ARABIC LETTER HAH, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA        # →‎حجي‎→
+
+FCAA ; 062D 0645 ;     SL      # ( ‎ﲪ‎ → ‎حم‎ ) ARABIC LIGATURE HAH WITH MEEM INITIAL FORM → ARABIC LETTER HAH, ARABIC LETTER MEEM     # 
+FC18 ; 062D 0645 ;     SL      # ( ‎ﰘ‎ → ‎حم‎ ) ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM → ARABIC LETTER HAH, ARABIC LETTER MEEM    # 
+
+FD5B ; 062D 0645 0649 ;        SL      # ( ‎ﵛ‎ → ‎حمى‎ ) ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER HAH, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA       # 
+FD5A ; 062D 0645 0649 ;        SL      # ( ‎ﵚ‎ → ‎حمى‎ ) ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER HAH, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA        # →‎حمي‎→
+
+FD1B ; 062D 0649 ;     SL      # ( ‎ﴛ‎ → ‎حى‎ ) ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA       # 
+FCFF ; 062D 0649 ;     SL      # ( ‎ﳿ‎ → ‎حى‎ ) ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA    # 
+FD1C ; 062D 0649 ;     SL      # ( ‎ﴜ‎ → ‎حى‎ ) ARABIC LIGATURE HAH WITH YEH FINAL FORM → ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA        # →‎حي‎→
+FD00 ; 062D 0649 ;     SL      # ( ‎ﴀ‎ → ‎حى‎ ) ARABIC LIGATURE HAH WITH YEH ISOLATED FORM → ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA     # →‎حي‎→
+
+0684 ; 0682 ;  SL      # ( ‎ڄ‎ → ‎ڂ‎ ) ARABIC LETTER DYEH → ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE       # 
+FB74 ; 0682 ;  SL      # ( ‎ﭴ‎ → ‎ڂ‎ ) ARABIC LETTER DYEH INITIAL FORM → ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE # →‎ڄ‎→
+FB75 ; 0682 ;  SL      # ( ‎ﭵ‎ → ‎ڂ‎ ) ARABIC LETTER DYEH MEDIAL FORM → ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE  # →‎ڄ‎→
+FB73 ; 0682 ;  SL      # ( ‎ﭳ‎ → ‎ڂ‎ ) ARABIC LETTER DYEH FINAL FORM → ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE   # →‎ڄ‎→
+FB72 ; 0682 ;  SL      # ( ‎ﭲ‎ → ‎ڂ‎ ) ARABIC LETTER DYEH ISOLATED FORM → ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE        # 
+
+FEAA ; 062F ;  SL      # ( ‎ﺪ‎ → ‎د‎ ) ARABIC LETTER DAL FINAL FORM → ARABIC LETTER DAL # 
+FEA9 ; 062F ;  SL      # ( ‎ﺩ‎ → ‎د‎ ) ARABIC LETTER DAL ISOLATED FORM → ARABIC LETTER DAL      # 
+
+FEAC ; 0630 ;  SL      # ( ‎ﺬ‎ → ‎ذ‎ ) ARABIC LETTER THAL FINAL FORM → ARABIC LETTER THAL       # 
+FEAB ; 0630 ;  SL      # ( ‎ﺫ‎ → ‎ذ‎ ) ARABIC LETTER THAL ISOLATED FORM → ARABIC LETTER THAL    # 
+
+FC5B ; 0630 0670 ;     SL      # ( ‎ﱛ‎ → ‎ذٰ‎ ) ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM → ARABIC LETTER THAL, ARABIC LETTER SUPERSCRIPT ALEF  # 
+
+FB89 ; 0688 ;  SL      # ( ‎ﮉ‎ → ‎ڈ‎ ) ARABIC LETTER DDAL FINAL FORM → ARABIC LETTER DDAL       # 
+FB88 ; 0688 ;  SL      # ( ‎ﮈ‎ → ‎ڈ‎ ) ARABIC LETTER DDAL ISOLATED FORM → ARABIC LETTER DDAL    # 
+
+FB85 ; 068C ;  SL      # ( ‎ﮅ‎ → ‎ڌ‎ ) ARABIC LETTER DAHAL FINAL FORM → ARABIC LETTER DAHAL     # 
+FB84 ; 068C ;  SL      # ( ‎ﮄ‎ → ‎ڌ‎ ) ARABIC LETTER DAHAL ISOLATED FORM → ARABIC LETTER DAHAL  # 
+
+FB83 ; 068D ;  SL      # ( ‎ﮃ‎ → ‎ڍ‎ ) ARABIC LETTER DDAHAL FINAL FORM → ARABIC LETTER DDAHAL   # 
+FB82 ; 068D ;  SL      # ( ‎ﮂ‎ → ‎ڍ‎ ) ARABIC LETTER DDAHAL ISOLATED FORM → ARABIC LETTER DDAHAL        # 
+
+FB87 ; 068E ;  SL      # ( ‎ﮇ‎ → ‎ڎ‎ ) ARABIC LETTER DUL FINAL FORM → ARABIC LETTER DUL # 
+FB86 ; 068E ;  SL      # ( ‎ﮆ‎ → ‎ڎ‎ ) ARABIC LETTER DUL ISOLATED FORM → ARABIC LETTER DUL      # 
+
+FEAE ; 0631 ;  SL      # ( ‎ﺮ‎ → ‎ر‎ ) ARABIC LETTER REH FINAL FORM → ARABIC LETTER REH # 
+FEAD ; 0631 ;  SL      # ( ‎ﺭ‎ → ‎ر‎ ) ARABIC LETTER REH ISOLATED FORM → ARABIC LETTER REH      # 
+
+FC5C ; 0631 0670 ;     SL      # ( ‎ﱜ‎ → ‎رٰ‎ ) ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM → ARABIC LETTER REH, ARABIC LETTER SUPERSCRIPT ALEF    # 
+
+FDF6 ; 0631 0633 0648 0644 ;   SL      # ( ‎ﷶ‎ → ‎رسول‎ ) ARABIC LIGATURE RASOUL ISOLATED FORM → ARABIC LETTER REH, ARABIC LETTER SEEN, ARABIC LETTER WAW, ARABIC LETTER LAM # 
+
+FDFC ; 0631 0649 0627 0644 ;   SL      #* ( ‎﷼‎ → ‎رىال‎ ) RIAL SIGN → ARABIC LETTER REH, ARABIC LETTER ALEF MAKSURA, ARABIC LETTER ALEF, ARABIC LETTER LAM  # →‎ریال‎→
+
+FEB0 ; 0632 ;  SL      # ( ‎ﺰ‎ → ‎ز‎ ) ARABIC LETTER ZAIN FINAL FORM → ARABIC LETTER ZAIN       # 
+FEAF ; 0632 ;  SL      # ( ‎ﺯ‎ → ‎ز‎ ) ARABIC LETTER ZAIN ISOLATED FORM → ARABIC LETTER ZAIN    # 
+0694 ; 0632 ;  SL      # ( ‎ڔ‎ → ‎ز‎ ) ARABIC LETTER REH WITH DOT BELOW → ARABIC LETTER ZAIN     # 
+
+FB8D ; 0691 ;  SL      # ( ‎ﮍ‎ → ‎ڑ‎ ) ARABIC LETTER RREH FINAL FORM → ARABIC LETTER RREH       # 
+FB8C ; 0691 ;  SL      # ( ‎ﮌ‎ → ‎ڑ‎ ) ARABIC LETTER RREH ISOLATED FORM → ARABIC LETTER RREH    # 
+
+FB8B ; 0698 ;  SL      # ( ‎ﮋ‎ → ‎ژ‎ ) ARABIC LETTER JEH FINAL FORM → ARABIC LETTER JEH # 
+FB8A ; 0698 ;  SL      # ( ‎ﮊ‎ → ‎ژ‎ ) ARABIC LETTER JEH ISOLATED FORM → ARABIC LETTER JEH      # 
+
+FEB3 ; 0633 ;  SL      # ( ‎ﺳ‎ → ‎س‎ ) ARABIC LETTER SEEN INITIAL FORM → ARABIC LETTER SEEN     # 
+FEB4 ; 0633 ;  SL      # ( ‎ﺴ‎ → ‎س‎ ) ARABIC LETTER SEEN MEDIAL FORM → ARABIC LETTER SEEN      # 
+FEB2 ; 0633 ;  SL      # ( ‎ﺲ‎ → ‎س‎ ) ARABIC LETTER SEEN FINAL FORM → ARABIC LETTER SEEN       # 
+FEB1 ; 0633 ;  SL      # ( ‎ﺱ‎ → ‎س‎ ) ARABIC LETTER SEEN ISOLATED FORM → ARABIC LETTER SEEN    # 
+
+FCAD ; 0633 062C ;     SL      # ( ‎ﲭ‎ → ‎سج‎ ) ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER JEEM   # 
+FD34 ; 0633 062C ;     SL      # ( ‎ﴴ‎ → ‎سج‎ ) ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER JEEM    # 
+FC1C ; 0633 062C ;     SL      # ( ‎ﰜ‎ → ‎سج‎ ) ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM → ARABIC LETTER SEEN, ARABIC LETTER JEEM  # 
+FCAF ; 0633 062C ;     SL      # ( ‎ﲯ‎ → ‎سج‎ ) ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER JEEM   # →‎سخ‎→→‎ﰞ‎→→‎ﰜ‎→
+FD36 ; 0633 062C ;     SL      # ( ‎ﴶ‎ → ‎سج‎ ) ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER JEEM    # →‎سخ‎→→‎ﰞ‎→→‎ﰜ‎→
+FC1E ; 0633 062C ;     SL      # ( ‎ﰞ‎ → ‎سج‎ ) ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM → ARABIC LETTER SEEN, ARABIC LETTER JEEM  # →‎ﰜ‎→
+
+FD5D ; 0633 062C 062D ;        SL      # ( ‎ﵝ‎ → ‎سجح‎ ) ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER JEEM, ARABIC LETTER HAH     # 
+
+FD5E ; 0633 062C 0649 ;        SL      # ( ‎ﵞ‎ → ‎سجى‎ ) ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER SEEN, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA     # 
+FDA8 ; 0633 062C 0649 ;        SL      # ( ‎ﶨ‎ → ‎سجى‎ ) ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER SEEN, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA     # →‎سخى‎→
+FDC6 ; 0633 062C 0649 ;        SL      # ( ‎ﷆ‎ → ‎سجى‎ ) ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM → ARABIC LETTER SEEN, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA      # →‎سخي‎→
+
+FCAE ; 0633 062D ;     SL      # ( ‎ﲮ‎ → ‎سح‎ ) ARABIC LIGATURE SEEN WITH HAH INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER HAH     # 
+FD35 ; 0633 062D ;     SL      # ( ‎ﴵ‎ → ‎سح‎ ) ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER HAH      # 
+FC1D ; 0633 062D ;     SL      # ( ‎ﰝ‎ → ‎سح‎ ) ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM → ARABIC LETTER SEEN, ARABIC LETTER HAH    # 
+
+FD5C ; 0633 062D 062C ;        SL      # ( ‎ﵜ‎ → ‎سحج‎ ) ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER HAH, ARABIC LETTER JEEM     # 
+
+FD2A ; 0633 0631 ;     SL      # ( ‎ﴪ‎ → ‎سر‎ ) ARABIC LIGATURE SEEN WITH REH FINAL FORM → ARABIC LETTER SEEN, ARABIC LETTER REH       # 
+FD0E ; 0633 0631 ;     SL      # ( ‎ﴎ‎ → ‎سر‎ ) ARABIC LIGATURE SEEN WITH REH ISOLATED FORM → ARABIC LETTER SEEN, ARABIC LETTER REH    # 
+
+FCB0 ; 0633 0645 ;     SL      # ( ‎ﲰ‎ → ‎سم‎ ) ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER MEEM   # 
+FCE7 ; 0633 0645 ;     SL      # ( ‎ﳧ‎ → ‎سم‎ ) ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER MEEM    # 
+FC1F ; 0633 0645 ;     SL      # ( ‎ﰟ‎ → ‎سم‎ ) ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM → ARABIC LETTER SEEN, ARABIC LETTER MEEM  # 
+
+FD61 ; 0633 0645 062C ;        SL      # ( ‎ﵡ‎ → ‎سمج‎ ) ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER MEEM, ARABIC LETTER JEEM   # 
+
+FD60 ; 0633 0645 062D ;        SL      # ( ‎ﵠ‎ → ‎سمح‎ ) ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER MEEM, ARABIC LETTER HAH     # 
+FD5F ; 0633 0645 062D ;        SL      # ( ‎ﵟ‎ → ‎سمح‎ ) ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM → ARABIC LETTER SEEN, ARABIC LETTER MEEM, ARABIC LETTER HAH       # 
+
+FD63 ; 0633 0645 0645 ;        SL      # ( ‎ﵣ‎ → ‎سمم‎ ) ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER MEEM, ARABIC LETTER MEEM   # 
+FD62 ; 0633 0645 0645 ;        SL      # ( ‎ﵢ‎ → ‎سمم‎ ) ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM → ARABIC LETTER SEEN, ARABIC LETTER MEEM, ARABIC LETTER MEEM     # 
+
+FD31 ; 0633 0647 ;     SL      # ( ‎ﴱ‎ → ‎سه‎ ) ARABIC LIGATURE SEEN WITH HEH INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER HEH     # 
+FCE8 ; 0633 0647 ;     SL      # ( ‎ﳨ‎ → ‎سه‎ ) ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER HEH      # 
+
+FD17 ; 0633 0649 ;     SL      # ( ‎ﴗ‎ → ‎سى‎ ) ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER SEEN, ARABIC LETTER ALEF MAKSURA     # 
+FCFB ; 0633 0649 ;     SL      # ( ‎ﳻ‎ → ‎سى‎ ) ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER SEEN, ARABIC LETTER ALEF MAKSURA  # 
+FD18 ; 0633 0649 ;     SL      # ( ‎ﴘ‎ → ‎سى‎ ) ARABIC LIGATURE SEEN WITH YEH FINAL FORM → ARABIC LETTER SEEN, ARABIC LETTER ALEF MAKSURA      # →‎سي‎→
+FCFC ; 0633 0649 ;     SL      # ( ‎ﳼ‎ → ‎سى‎ ) ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM → ARABIC LETTER SEEN, ARABIC LETTER ALEF MAKSURA   # →‎سي‎→
+
+FEB7 ; 0634 ;  SL      # ( ‎ﺷ‎ → ‎ش‎ ) ARABIC LETTER SHEEN INITIAL FORM → ARABIC LETTER SHEEN   # 
+FEB8 ; 0634 ;  SL      # ( ‎ﺸ‎ → ‎ش‎ ) ARABIC LETTER SHEEN MEDIAL FORM → ARABIC LETTER SHEEN    # 
+FEB6 ; 0634 ;  SL      # ( ‎ﺶ‎ → ‎ش‎ ) ARABIC LETTER SHEEN FINAL FORM → ARABIC LETTER SHEEN     # 
+FEB5 ; 0634 ;  SL      # ( ‎ﺵ‎ → ‎ش‎ ) ARABIC LETTER SHEEN ISOLATED FORM → ARABIC LETTER SHEEN  # 
+
+FD2D ; 0634 062C ;     SL      # ( ‎ﴭ‎ → ‎شج‎ ) ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER JEEM # 
+FD37 ; 0634 062C ;     SL      # ( ‎ﴷ‎ → ‎شج‎ ) ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER JEEM  # 
+FD25 ; 0634 062C ;     SL      # ( ‎ﴥ‎ → ‎شج‎ ) ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER JEEM   # 
+FD09 ; 0634 062C ;     SL      # ( ‎ﴉ‎ → ‎شج‎ ) ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM → ARABIC LETTER SHEEN, ARABIC LETTER JEEM        # 
+FD2F ; 0634 062C ;     SL      # ( ‎ﴯ‎ → ‎شج‎ ) ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER JEEM # →‎شخ‎→→‎ﴧ‎→→‎ﴥ‎→
+FD39 ; 0634 062C ;     SL      # ( ‎ﴹ‎ → ‎شج‎ ) ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER JEEM  # →‎شخ‎→→‎ﴧ‎→→‎ﴥ‎→
+FD27 ; 0634 062C ;     SL      # ( ‎ﴧ‎ → ‎شج‎ ) ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER JEEM   # →‎ﴥ‎→
+FD0B ; 0634 062C ;     SL      # ( ‎ﴋ‎ → ‎شج‎ ) ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM → ARABIC LETTER SHEEN, ARABIC LETTER JEEM        # →‎ﴉ‎→
+
+FD69 ; 0634 062C 0649 ;        SL      # ( ‎ﵩ‎ → ‎شجى‎ ) ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA    # →‎شجي‎→
+
+FD2E ; 0634 062D ;     SL      # ( ‎ﴮ‎ → ‎شح‎ ) ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER HAH   # 
+FD38 ; 0634 062D ;     SL      # ( ‎ﴸ‎ → ‎شح‎ ) ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER HAH    # 
+FD26 ; 0634 062D ;     SL      # ( ‎ﴦ‎ → ‎شح‎ ) ARABIC LIGATURE SHEEN WITH HAH FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER HAH     # 
+FD0A ; 0634 062D ;     SL      # ( ‎ﴊ‎ → ‎شح‎ ) ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM → ARABIC LETTER SHEEN, ARABIC LETTER HAH  # 
+
+FD68 ; 0634 062D 0645 ;        SL      # ( ‎ﵨ‎ → ‎شحم‎ ) ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER HAH, ARABIC LETTER MEEM   # 
+FD67 ; 0634 062D 0645 ;        SL      # ( ‎ﵧ‎ → ‎شحم‎ ) ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER HAH, ARABIC LETTER MEEM     # 
+
+FDAA ; 0634 062D 0649 ;        SL      # ( ‎ﶪ‎ → ‎شحى‎ ) ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA      # →‎شحي‎→
+
+FD29 ; 0634 0631 ;     SL      # ( ‎ﴩ‎ → ‎شر‎ ) ARABIC LIGATURE SHEEN WITH REH FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER REH     # 
+FD0D ; 0634 0631 ;     SL      # ( ‎ﴍ‎ → ‎شر‎ ) ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM → ARABIC LETTER SHEEN, ARABIC LETTER REH  # 
+
+FD30 ; 0634 0645 ;     SL      # ( ‎ﴰ‎ → ‎شم‎ ) ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER MEEM # 
+FCE9 ; 0634 0645 ;     SL      # ( ‎ﳩ‎ → ‎شم‎ ) ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER MEEM  # 
+FD28 ; 0634 0645 ;     SL      # ( ‎ﴨ‎ → ‎شم‎ ) ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER MEEM   # 
+FD0C ; 0634 0645 ;     SL      # ( ‎ﴌ‎ → ‎شم‎ ) ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM → ARABIC LETTER SHEEN, ARABIC LETTER MEEM        # 
+
+FD6B ; 0634 0645 062C ;        SL      # ( ‎ﵫ‎ → ‎شمج‎ ) ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER MEEM, ARABIC LETTER JEEM # →‎شمخ‎→
+FD6A ; 0634 0645 062C ;        SL      # ( ‎ﵪ‎ → ‎شمج‎ ) ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER MEEM, ARABIC LETTER JEEM   # →‎شمخ‎→
+
+FD6D ; 0634 0645 0645 ;        SL      # ( ‎ﵭ‎ → ‎شمم‎ ) ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER MEEM, ARABIC LETTER MEEM # 
+FD6C ; 0634 0645 0645 ;        SL      # ( ‎ﵬ‎ → ‎شمم‎ ) ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER MEEM, ARABIC LETTER MEEM   # 
+
+FD32 ; 0634 0647 ;     SL      # ( ‎ﴲ‎ → ‎شه‎ ) ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER HEH   # 
+FCEA ; 0634 0647 ;     SL      # ( ‎ﳪ‎ → ‎شه‎ ) ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER HEH    # 
+
+FD19 ; 0634 0649 ;     SL      # ( ‎ﴙ‎ → ‎شى‎ ) ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER ALEF MAKSURA   # 
+FCFD ; 0634 0649 ;     SL      # ( ‎ﳽ‎ → ‎شى‎ ) ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER SHEEN, ARABIC LETTER ALEF MAKSURA        # 
+FD1A ; 0634 0649 ;     SL      # ( ‎ﴚ‎ → ‎شى‎ ) ARABIC LIGATURE SHEEN WITH YEH FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER ALEF MAKSURA    # →‎شي‎→
+FCFE ; 0634 0649 ;     SL      # ( ‎ﳾ‎ → ‎شى‎ ) ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM → ARABIC LETTER SHEEN, ARABIC LETTER ALEF MAKSURA # →‎شي‎→
+
+FEBB ; 0635 ;  SL      # ( ‎ﺻ‎ → ‎ص‎ ) ARABIC LETTER SAD INITIAL FORM → ARABIC LETTER SAD       # 
+FEBC ; 0635 ;  SL      # ( ‎ﺼ‎ → ‎ص‎ ) ARABIC LETTER SAD MEDIAL FORM → ARABIC LETTER SAD        # 
+FEBA ; 0635 ;  SL      # ( ‎ﺺ‎ → ‎ص‎ ) ARABIC LETTER SAD FINAL FORM → ARABIC LETTER SAD # 
+FEB9 ; 0635 ;  SL      # ( ‎ﺹ‎ → ‎ص‎ ) ARABIC LETTER SAD ISOLATED FORM → ARABIC LETTER SAD      # 
+
+FCB2 ; 0635 062C ;     SL      # ( ‎ﲲ‎ → ‎صج‎ ) ARABIC LIGATURE SAD WITH KHAH INITIAL FORM → ARABIC LETTER SAD, ARABIC LETTER JEEM     # →‎صخ‎→
+
+FCB1 ; 0635 062D ;     SL      # ( ‎ﲱ‎ → ‎صح‎ ) ARABIC LIGATURE SAD WITH HAH INITIAL FORM → ARABIC LETTER SAD, ARABIC LETTER HAH       # 
+FC20 ; 0635 062D ;     SL      # ( ‎ﰠ‎ → ‎صح‎ ) ARABIC LIGATURE SAD WITH HAH ISOLATED FORM → ARABIC LETTER SAD, ARABIC LETTER HAH      # 
+
+FD65 ; 0635 062D 062D ;        SL      # ( ‎ﵥ‎ → ‎صحح‎ ) ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM → ARABIC LETTER SAD, ARABIC LETTER HAH, ARABIC LETTER HAH # 
+FD64 ; 0635 062D 062D ;        SL      # ( ‎ﵤ‎ → ‎صحح‎ ) ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM → ARABIC LETTER SAD, ARABIC LETTER HAH, ARABIC LETTER HAH   # 
+
+FDA9 ; 0635 062D 0649 ;        SL      # ( ‎ﶩ‎ → ‎صحى‎ ) ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM → ARABIC LETTER SAD, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA  # →‎صحي‎→
+
+FD2B ; 0635 0631 ;     SL      # ( ‎ﴫ‎ → ‎صر‎ ) ARABIC LIGATURE SAD WITH REH FINAL FORM → ARABIC LETTER SAD, ARABIC LETTER REH # 
+FD0F ; 0635 0631 ;     SL      # ( ‎ﴏ‎ → ‎صر‎ ) ARABIC LIGATURE SAD WITH REH ISOLATED FORM → ARABIC LETTER SAD, ARABIC LETTER REH      # 
+
+FDF5 ; 0635 0644 0639 0645 ;   SL      # ( ‎ﷵ‎ → ‎صلعم‎ ) ARABIC LIGATURE SALAM ISOLATED FORM → ARABIC LETTER SAD, ARABIC LETTER LAM, ARABIC LETTER AIN, ARABIC LETTER MEEM  # 
+
+FDF9 ; 0635 0644 0649 ;        SL      # ( ‎ﷹ‎ → ‎صلى‎ ) ARABIC LIGATURE SALLA ISOLATED FORM → ARABIC LETTER SAD, ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA       # 
+
+FDFA ; 0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 0649 0647 0020 0648 0633 0644 0645 ;     SL      #* ( ‎ﷺ‎ → ‎صلى الله علىه وسلم‎ ) ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM → ARABIC LETTER SAD, ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA, SPACE, ARABIC LETTER ALEF, ARABIC LETTER LAM, ARABIC LETTER LAM, ARABIC LETTER HEH, SPACE, ARABIC LETTER AIN, ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HEH, SPACE, ARABIC LETTER WAW, ARABIC LETTER SEEN, ARABIC LETTER LAM, ARABIC LETTER MEEM      # →‎صلى الله عليه وسلم‎→
+
+FDF0 ; 0635 0644 06D2 ;        SL      # ( ‎ﷰ‎ → ‎صلے‎ ) ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM → ARABIC LETTER SAD, ARABIC LETTER LAM, ARABIC LETTER YEH BARREE       # 
+
+FCB3 ; 0635 0645 ;     SL      # ( ‎ﲳ‎ → ‎صم‎ ) ARABIC LIGATURE SAD WITH MEEM INITIAL FORM → ARABIC LETTER SAD, ARABIC LETTER MEEM     # 
+FC21 ; 0635 0645 ;     SL      # ( ‎ﰡ‎ → ‎صم‎ ) ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM → ARABIC LETTER SAD, ARABIC LETTER MEEM    # 
+
+FDC5 ; 0635 0645 0645 ;        SL      # ( ‎ﷅ‎ → ‎صمم‎ ) ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM → ARABIC LETTER SAD, ARABIC LETTER MEEM, ARABIC LETTER MEEM     # 
+FD66 ; 0635 0645 0645 ;        SL      # ( ‎ﵦ‎ → ‎صمم‎ ) ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM → ARABIC LETTER SAD, ARABIC LETTER MEEM, ARABIC LETTER MEEM       # 
+
+FD21 ; 0635 0649 ;     SL      # ( ‎ﴡ‎ → ‎صى‎ ) ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER SAD, ARABIC LETTER ALEF MAKSURA       # 
+FD05 ; 0635 0649 ;     SL      # ( ‎ﴅ‎ → ‎صى‎ ) ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER SAD, ARABIC LETTER ALEF MAKSURA    # 
+FD22 ; 0635 0649 ;     SL      # ( ‎ﴢ‎ → ‎صى‎ ) ARABIC LIGATURE SAD WITH YEH FINAL FORM → ARABIC LETTER SAD, ARABIC LETTER ALEF MAKSURA        # →‎صي‎→
+FD06 ; 0635 0649 ;     SL      # ( ‎ﴆ‎ → ‎صى‎ ) ARABIC LIGATURE SAD WITH YEH ISOLATED FORM → ARABIC LETTER SAD, ARABIC LETTER ALEF MAKSURA     # →‎صي‎→
+
+FEBF ; 0636 ;  SL      # ( ‎ﺿ‎ → ‎ض‎ ) ARABIC LETTER DAD INITIAL FORM → ARABIC LETTER DAD       # 
+FEC0 ; 0636 ;  SL      # ( ‎ﻀ‎ → ‎ض‎ ) ARABIC LETTER DAD MEDIAL FORM → ARABIC LETTER DAD        # 
+FEBE ; 0636 ;  SL      # ( ‎ﺾ‎ → ‎ض‎ ) ARABIC LETTER DAD FINAL FORM → ARABIC LETTER DAD # 
+FEBD ; 0636 ;  SL      # ( ‎ﺽ‎ → ‎ض‎ ) ARABIC LETTER DAD ISOLATED FORM → ARABIC LETTER DAD      # 
+
+FCB4 ; 0636 062C ;     SL      # ( ‎ﲴ‎ → ‎ضج‎ ) ARABIC LIGATURE DAD WITH JEEM INITIAL FORM → ARABIC LETTER DAD, ARABIC LETTER JEEM     # 
+FC22 ; 0636 062C ;     SL      # ( ‎ﰢ‎ → ‎ضج‎ ) ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM → ARABIC LETTER DAD, ARABIC LETTER JEEM    # 
+FCB6 ; 0636 062C ;     SL      # ( ‎ﲶ‎ → ‎ضج‎ ) ARABIC LIGATURE DAD WITH KHAH INITIAL FORM → ARABIC LETTER DAD, ARABIC LETTER JEEM     # →‎ضخ‎→→‎ﰤ‎→→‎ﰢ‎→
+FC24 ; 0636 062C ;     SL      # ( ‎ﰤ‎ → ‎ضج‎ ) ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM → ARABIC LETTER DAD, ARABIC LETTER JEEM    # →‎ﰢ‎→
+
+FD70 ; 0636 062C 0645 ;        SL      # ( ‎ﵰ‎ → ‎ضجم‎ ) ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM → ARABIC LETTER DAD, ARABIC LETTER JEEM, ARABIC LETTER MEEM     # →‎ضخم‎→
+FD6F ; 0636 062C 0645 ;        SL      # ( ‎ﵯ‎ → ‎ضجم‎ ) ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM → ARABIC LETTER DAD, ARABIC LETTER JEEM, ARABIC LETTER MEEM       # →‎ضخم‎→
+
+FCB5 ; 0636 062D ;     SL      # ( ‎ﲵ‎ → ‎ضح‎ ) ARABIC LIGATURE DAD WITH HAH INITIAL FORM → ARABIC LETTER DAD, ARABIC LETTER HAH       # 
+FC23 ; 0636 062D ;     SL      # ( ‎ﰣ‎ → ‎ضح‎ ) ARABIC LIGATURE DAD WITH HAH ISOLATED FORM → ARABIC LETTER DAD, ARABIC LETTER HAH      # 
+
+FD6E ; 0636 062D 0649 ;        SL      # ( ‎ﵮ‎ → ‎ضحى‎ ) ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER DAD, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA # 
+FDAB ; 0636 062D 0649 ;        SL      # ( ‎ﶫ‎ → ‎ضحى‎ ) ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM → ARABIC LETTER DAD, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA  # →‎ضحي‎→
+
+FD2C ; 0636 0631 ;     SL      # ( ‎ﴬ‎ → ‎ضر‎ ) ARABIC LIGATURE DAD WITH REH FINAL FORM → ARABIC LETTER DAD, ARABIC LETTER REH # 
+FD10 ; 0636 0631 ;     SL      # ( ‎ﴐ‎ → ‎ضر‎ ) ARABIC LIGATURE DAD WITH REH ISOLATED FORM → ARABIC LETTER DAD, ARABIC LETTER REH      # 
+
+FCB7 ; 0636 0645 ;     SL      # ( ‎ﲷ‎ → ‎ضم‎ ) ARABIC LIGATURE DAD WITH MEEM INITIAL FORM → ARABIC LETTER DAD, ARABIC LETTER MEEM     # 
+FC25 ; 0636 0645 ;     SL      # ( ‎ﰥ‎ → ‎ضم‎ ) ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM → ARABIC LETTER DAD, ARABIC LETTER MEEM    # 
+
+FD23 ; 0636 0649 ;     SL      # ( ‎ﴣ‎ → ‎ضى‎ ) ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER DAD, ARABIC LETTER ALEF MAKSURA       # 
+FD07 ; 0636 0649 ;     SL      # ( ‎ﴇ‎ → ‎ضى‎ ) ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER DAD, ARABIC LETTER ALEF MAKSURA    # 
+FD24 ; 0636 0649 ;     SL      # ( ‎ﴤ‎ → ‎ضى‎ ) ARABIC LIGATURE DAD WITH YEH FINAL FORM → ARABIC LETTER DAD, ARABIC LETTER ALEF MAKSURA        # →‎ضي‎→
+FD08 ; 0636 0649 ;     SL      # ( ‎ﴈ‎ → ‎ضى‎ ) ARABIC LIGATURE DAD WITH YEH ISOLATED FORM → ARABIC LETTER DAD, ARABIC LETTER ALEF MAKSURA     # →‎ضي‎→
+
+FEC3 ; 0637 ;  SL      # ( ‎ﻃ‎ → ‎ط‎ ) ARABIC LETTER TAH INITIAL FORM → ARABIC LETTER TAH       # 
+FEC4 ; 0637 ;  SL      # ( ‎ﻄ‎ → ‎ط‎ ) ARABIC LETTER TAH MEDIAL FORM → ARABIC LETTER TAH        # 
+FEC2 ; 0637 ;  SL      # ( ‎ﻂ‎ → ‎ط‎ ) ARABIC LETTER TAH FINAL FORM → ARABIC LETTER TAH # 
+FEC1 ; 0637 ;  SL      # ( ‎ﻁ‎ → ‎ط‎ ) ARABIC LETTER TAH ISOLATED FORM → ARABIC LETTER TAH      # 
+
+FCB8 ; 0637 062D ;     SL      # ( ‎ﲸ‎ → ‎طح‎ ) ARABIC LIGATURE TAH WITH HAH INITIAL FORM → ARABIC LETTER TAH, ARABIC LETTER HAH       # 
+FC26 ; 0637 062D ;     SL      # ( ‎ﰦ‎ → ‎طح‎ ) ARABIC LIGATURE TAH WITH HAH ISOLATED FORM → ARABIC LETTER TAH, ARABIC LETTER HAH      # 
+
+FD33 ; 0637 0645 ;     SL      # ( ‎ﴳ‎ → ‎طم‎ ) ARABIC LIGATURE TAH WITH MEEM INITIAL FORM → ARABIC LETTER TAH, ARABIC LETTER MEEM     # 
+FD3A ; 0637 0645 ;     SL      # ( ‎ﴺ‎ → ‎طم‎ ) ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM → ARABIC LETTER TAH, ARABIC LETTER MEEM      # 
+FC27 ; 0637 0645 ;     SL      # ( ‎ﰧ‎ → ‎طم‎ ) ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM → ARABIC LETTER TAH, ARABIC LETTER MEEM    # 
+
+FD72 ; 0637 0645 062D ;        SL      # ( ‎ﵲ‎ → ‎طمح‎ ) ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM → ARABIC LETTER TAH, ARABIC LETTER MEEM, ARABIC LETTER HAH       # 
+FD71 ; 0637 0645 062D ;        SL      # ( ‎ﵱ‎ → ‎طمح‎ ) ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM → ARABIC LETTER TAH, ARABIC LETTER MEEM, ARABIC LETTER HAH # 
+
+FD73 ; 0637 0645 0645 ;        SL      # ( ‎ﵳ‎ → ‎طمم‎ ) ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM → ARABIC LETTER TAH, ARABIC LETTER MEEM, ARABIC LETTER MEEM     # 
+
+FD74 ; 0637 0645 0649 ;        SL      # ( ‎ﵴ‎ → ‎طمى‎ ) ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER TAH, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA        # →‎طمي‎→
+
+FD11 ; 0637 0649 ;     SL      # ( ‎ﴑ‎ → ‎طى‎ ) ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER TAH, ARABIC LETTER ALEF MAKSURA       # 
+FCF5 ; 0637 0649 ;     SL      # ( ‎ﳵ‎ → ‎طى‎ ) ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER TAH, ARABIC LETTER ALEF MAKSURA    # 
+FD12 ; 0637 0649 ;     SL      # ( ‎ﴒ‎ → ‎طى‎ ) ARABIC LIGATURE TAH WITH YEH FINAL FORM → ARABIC LETTER TAH, ARABIC LETTER ALEF MAKSURA        # →‎طي‎→
+FCF6 ; 0637 0649 ;     SL      # ( ‎ﳶ‎ → ‎طى‎ ) ARABIC LIGATURE TAH WITH YEH ISOLATED FORM → ARABIC LETTER TAH, ARABIC LETTER ALEF MAKSURA     # →‎طي‎→
+
+FEC7 ; 0638 ;  SL      # ( ‎ﻇ‎ → ‎ظ‎ ) ARABIC LETTER ZAH INITIAL FORM → ARABIC LETTER ZAH       # 
+FEC8 ; 0638 ;  SL      # ( ‎ﻈ‎ → ‎ظ‎ ) ARABIC LETTER ZAH MEDIAL FORM → ARABIC LETTER ZAH        # 
+FEC6 ; 0638 ;  SL      # ( ‎ﻆ‎ → ‎ظ‎ ) ARABIC LETTER ZAH FINAL FORM → ARABIC LETTER ZAH # 
+FEC5 ; 0638 ;  SL      # ( ‎ﻅ‎ → ‎ظ‎ ) ARABIC LETTER ZAH ISOLATED FORM → ARABIC LETTER ZAH      # 
+
+FCB9 ; 0638 0645 ;     SL      # ( ‎ﲹ‎ → ‎ظم‎ ) ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM → ARABIC LETTER ZAH, ARABIC LETTER MEEM     # 
+FD3B ; 0638 0645 ;     SL      # ( ‎ﴻ‎ → ‎ظم‎ ) ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM → ARABIC LETTER ZAH, ARABIC LETTER MEEM      # 
+FC28 ; 0638 0645 ;     SL      # ( ‎ﰨ‎ → ‎ظم‎ ) ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM → ARABIC LETTER ZAH, ARABIC LETTER MEEM    # 
+
+FECB ; 0639 ;  SL      # ( ‎ﻋ‎ → ‎ع‎ ) ARABIC LETTER AIN INITIAL FORM → ARABIC LETTER AIN       # 
+FECC ; 0639 ;  SL      # ( ‎ﻌ‎ → ‎ع‎ ) ARABIC LETTER AIN MEDIAL FORM → ARABIC LETTER AIN        # 
+FECA ; 0639 ;  SL      # ( ‎ﻊ‎ → ‎ع‎ ) ARABIC LETTER AIN FINAL FORM → ARABIC LETTER AIN # 
+FEC9 ; 0639 ;  SL      # ( ‎ﻉ‎ → ‎ع‎ ) ARABIC LETTER AIN ISOLATED FORM → ARABIC LETTER AIN      # 
+
+FCBA ; 0639 062C ;     SL      # ( ‎ﲺ‎ → ‎عج‎ ) ARABIC LIGATURE AIN WITH JEEM INITIAL FORM → ARABIC LETTER AIN, ARABIC LETTER JEEM     # 
+FC29 ; 0639 062C ;     SL      # ( ‎ﰩ‎ → ‎عج‎ ) ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM → ARABIC LETTER AIN, ARABIC LETTER JEEM    # 
+
+FDC4 ; 0639 062C 0645 ;        SL      # ( ‎ﷄ‎ → ‎عجم‎ ) ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM → ARABIC LETTER AIN, ARABIC LETTER JEEM, ARABIC LETTER MEEM     # 
+FD75 ; 0639 062C 0645 ;        SL      # ( ‎ﵵ‎ → ‎عجم‎ ) ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM → ARABIC LETTER AIN, ARABIC LETTER JEEM, ARABIC LETTER MEEM       # 
+
+FDF7 ; 0639 0644 0649 0647 ;   SL      # ( ‎ﷷ‎ → ‎علىه‎ ) ARABIC LIGATURE ALAYHE ISOLATED FORM → ARABIC LETTER AIN, ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HEH # →‎عليه‎→
+
+FCBB ; 0639 0645 ;     SL      # ( ‎ﲻ‎ → ‎عم‎ ) ARABIC LIGATURE AIN WITH MEEM INITIAL FORM → ARABIC LETTER AIN, ARABIC LETTER MEEM     # 
+FC2A ; 0639 0645 ;     SL      # ( ‎ﰪ‎ → ‎عم‎ ) ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM → ARABIC LETTER AIN, ARABIC LETTER MEEM    # 
+
+FD77 ; 0639 0645 0645 ;        SL      # ( ‎ﵷ‎ → ‎عمم‎ ) ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM → ARABIC LETTER AIN, ARABIC LETTER MEEM, ARABIC LETTER MEEM     # 
+FD76 ; 0639 0645 0645 ;        SL      # ( ‎ﵶ‎ → ‎عمم‎ ) ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM → ARABIC LETTER AIN, ARABIC LETTER MEEM, ARABIC LETTER MEEM       # 
+
+FD78 ; 0639 0645 0649 ;        SL      # ( ‎ﵸ‎ → ‎عمى‎ ) ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER AIN, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA       # 
+FDB6 ; 0639 0645 0649 ;        SL      # ( ‎ﶶ‎ → ‎عمى‎ ) ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER AIN, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA        # →‎عمي‎→
+
+FD13 ; 0639 0649 ;     SL      # ( ‎ﴓ‎ → ‎عى‎ ) ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER AIN, ARABIC LETTER ALEF MAKSURA       # 
+FCF7 ; 0639 0649 ;     SL      # ( ‎ﳷ‎ → ‎عى‎ ) ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER AIN, ARABIC LETTER ALEF MAKSURA    # 
+FD14 ; 0639 0649 ;     SL      # ( ‎ﴔ‎ → ‎عى‎ ) ARABIC LIGATURE AIN WITH YEH FINAL FORM → ARABIC LETTER AIN, ARABIC LETTER ALEF MAKSURA        # →‎عي‎→
+FCF8 ; 0639 0649 ;     SL      # ( ‎ﳸ‎ → ‎عى‎ ) ARABIC LIGATURE AIN WITH YEH ISOLATED FORM → ARABIC LETTER AIN, ARABIC LETTER ALEF MAKSURA     # →‎عي‎→
+
+FECF ; 063A ;  SL      # ( ‎ﻏ‎ → ‎غ‎ ) ARABIC LETTER GHAIN INITIAL FORM → ARABIC LETTER GHAIN   # 
+FED0 ; 063A ;  SL      # ( ‎ﻐ‎ → ‎غ‎ ) ARABIC LETTER GHAIN MEDIAL FORM → ARABIC LETTER GHAIN    # 
+FECE ; 063A ;  SL      # ( ‎ﻎ‎ → ‎غ‎ ) ARABIC LETTER GHAIN FINAL FORM → ARABIC LETTER GHAIN     # 
+FECD ; 063A ;  SL      # ( ‎ﻍ‎ → ‎غ‎ ) ARABIC LETTER GHAIN ISOLATED FORM → ARABIC LETTER GHAIN  # 
+
+FCBC ; 063A 062C ;     SL      # ( ‎ﲼ‎ → ‎غج‎ ) ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM → ARABIC LETTER GHAIN, ARABIC LETTER JEEM # 
+FC2B ; 063A 062C ;     SL      # ( ‎ﰫ‎ → ‎غج‎ ) ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM → ARABIC LETTER GHAIN, ARABIC LETTER JEEM        # 
+
+FCBD ; 063A 0645 ;     SL      # ( ‎ﲽ‎ → ‎غم‎ ) ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM → ARABIC LETTER GHAIN, ARABIC LETTER MEEM # 
+FC2C ; 063A 0645 ;     SL      # ( ‎ﰬ‎ → ‎غم‎ ) ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM → ARABIC LETTER GHAIN, ARABIC LETTER MEEM        # 
+
+FD79 ; 063A 0645 0645 ;        SL      # ( ‎ﵹ‎ → ‎غمم‎ ) ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM → ARABIC LETTER GHAIN, ARABIC LETTER MEEM, ARABIC LETTER MEEM   # 
+
+FD7B ; 063A 0645 0649 ;        SL      # ( ‎ﵻ‎ → ‎غمى‎ ) ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER GHAIN, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA   # 
+FD7A ; 063A 0645 0649 ;        SL      # ( ‎ﵺ‎ → ‎غمى‎ ) ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER GHAIN, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA    # →‎غمي‎→
+
+FD15 ; 063A 0649 ;     SL      # ( ‎ﴕ‎ → ‎غى‎ ) ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER GHAIN, ARABIC LETTER ALEF MAKSURA   # 
+FCF9 ; 063A 0649 ;     SL      # ( ‎ﳹ‎ → ‎غى‎ ) ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER GHAIN, ARABIC LETTER ALEF MAKSURA        # 
+FD16 ; 063A 0649 ;     SL      # ( ‎ﴖ‎ → ‎غى‎ ) ARABIC LIGATURE GHAIN WITH YEH FINAL FORM → ARABIC LETTER GHAIN, ARABIC LETTER ALEF MAKSURA    # →‎غي‎→
+FCFA ; 063A 0649 ;     SL      # ( ‎ﳺ‎ → ‎غى‎ ) ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM → ARABIC LETTER GHAIN, ARABIC LETTER ALEF MAKSURA # →‎غي‎→
+
+FED3 ; 0641 ;  SL      # ( ‎ﻓ‎ → ‎ف‎ ) ARABIC LETTER FEH INITIAL FORM → ARABIC LETTER FEH       # 
+FED4 ; 0641 ;  SL      # ( ‎ﻔ‎ → ‎ف‎ ) ARABIC LETTER FEH MEDIAL FORM → ARABIC LETTER FEH        # 
+FED2 ; 0641 ;  SL      # ( ‎ﻒ‎ → ‎ف‎ ) ARABIC LETTER FEH FINAL FORM → ARABIC LETTER FEH # 
+FED1 ; 0641 ;  SL      # ( ‎ﻑ‎ → ‎ف‎ ) ARABIC LETTER FEH ISOLATED FORM → ARABIC LETTER FEH      # 
+
+FCBE ; 0641 062C ;     SL      # ( ‎ﲾ‎ → ‎فج‎ ) ARABIC LIGATURE FEH WITH JEEM INITIAL FORM → ARABIC LETTER FEH, ARABIC LETTER JEEM     # 
+FC2D ; 0641 062C ;     SL      # ( ‎ﰭ‎ → ‎فج‎ ) ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM → ARABIC LETTER FEH, ARABIC LETTER JEEM    # 
+FCC0 ; 0641 062C ;     SL      # ( ‎ﳀ‎ → ‎فج‎ ) ARABIC LIGATURE FEH WITH KHAH INITIAL FORM → ARABIC LETTER FEH, ARABIC LETTER JEEM     # →‎فخ‎→→‎ﰯ‎→→‎ﰭ‎→
+FC2F ; 0641 062C ;     SL      # ( ‎ﰯ‎ → ‎فج‎ ) ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM → ARABIC LETTER FEH, ARABIC LETTER JEEM    # →‎ﰭ‎→
+
+FD7D ; 0641 062C 0645 ;        SL      # ( ‎ﵽ‎ → ‎فجم‎ ) ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM → ARABIC LETTER FEH, ARABIC LETTER JEEM, ARABIC LETTER MEEM     # →‎فخم‎→
+FD7C ; 0641 062C 0645 ;        SL      # ( ‎ﵼ‎ → ‎فجم‎ ) ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM → ARABIC LETTER FEH, ARABIC LETTER JEEM, ARABIC LETTER MEEM       # →‎فخم‎→
+
+FCBF ; 0641 062D ;     SL      # ( ‎ﲿ‎ → ‎فح‎ ) ARABIC LIGATURE FEH WITH HAH INITIAL FORM → ARABIC LETTER FEH, ARABIC LETTER HAH       # 
+FC2E ; 0641 062D ;     SL      # ( ‎ﰮ‎ → ‎فح‎ ) ARABIC LIGATURE FEH WITH HAH ISOLATED FORM → ARABIC LETTER FEH, ARABIC LETTER HAH      # 
+
+FCC1 ; 0641 0645 ;     SL      # ( ‎ﳁ‎ → ‎فم‎ ) ARABIC LIGATURE FEH WITH MEEM INITIAL FORM → ARABIC LETTER FEH, ARABIC LETTER MEEM     # 
+FC30 ; 0641 0645 ;     SL      # ( ‎ﰰ‎ → ‎فم‎ ) ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM → ARABIC LETTER FEH, ARABIC LETTER MEEM    # 
+
+FDC1 ; 0641 0645 0649 ;        SL      # ( ‎ﷁ‎ → ‎فمى‎ ) ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER FEH, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA        # →‎فمي‎→
+
+FC7C ; 0641 0649 ;     SL      # ( ‎ﱼ‎ → ‎فى‎ ) ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER FEH, ARABIC LETTER ALEF MAKSURA       # 
+FC31 ; 0641 0649 ;     SL      # ( ‎ﰱ‎ → ‎فى‎ ) ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER FEH, ARABIC LETTER ALEF MAKSURA    # 
+FC7D ; 0641 0649 ;     SL      # ( ‎ﱽ‎ → ‎فى‎ ) ARABIC LIGATURE FEH WITH YEH FINAL FORM → ARABIC LETTER FEH, ARABIC LETTER ALEF MAKSURA        # →‎في‎→
+FC32 ; 0641 0649 ;     SL      # ( ‎ﰲ‎ → ‎فى‎ ) ARABIC LIGATURE FEH WITH YEH ISOLATED FORM → ARABIC LETTER FEH, ARABIC LETTER ALEF MAKSURA     # →‎في‎→
+
+FB6C ; 06A4 ;  SL      # ( ‎ﭬ‎ → ‎ڤ‎ ) ARABIC LETTER VEH INITIAL FORM → ARABIC LETTER VEH       # 
+FB6D ; 06A4 ;  SL      # ( ‎ﭭ‎ → ‎ڤ‎ ) ARABIC LETTER VEH MEDIAL FORM → ARABIC LETTER VEH        # 
+FB6B ; 06A4 ;  SL      # ( ‎ﭫ‎ → ‎ڤ‎ ) ARABIC LETTER VEH FINAL FORM → ARABIC LETTER VEH # 
+FB6A ; 06A4 ;  SL      # ( ‎ﭪ‎ → ‎ڤ‎ ) ARABIC LETTER VEH ISOLATED FORM → ARABIC LETTER VEH      # 
+
+FB70 ; 06A6 ;  SL      # ( ‎ﭰ‎ → ‎ڦ‎ ) ARABIC LETTER PEHEH INITIAL FORM → ARABIC LETTER PEHEH   # 
+FB71 ; 06A6 ;  SL      # ( ‎ﭱ‎ → ‎ڦ‎ ) ARABIC LETTER PEHEH MEDIAL FORM → ARABIC LETTER PEHEH    # 
+FB6F ; 06A6 ;  SL      # ( ‎ﭯ‎ → ‎ڦ‎ ) ARABIC LETTER PEHEH FINAL FORM → ARABIC LETTER PEHEH     # 
+FB6E ; 06A6 ;  SL      # ( ‎ﭮ‎ → ‎ڦ‎ ) ARABIC LETTER PEHEH ISOLATED FORM → ARABIC LETTER PEHEH  # 
+
+FED7 ; 0642 ;  SL      # ( ‎ﻗ‎ → ‎ق‎ ) ARABIC LETTER QAF INITIAL FORM → ARABIC LETTER QAF       # 
+FED8 ; 0642 ;  SL      # ( ‎ﻘ‎ → ‎ق‎ ) ARABIC LETTER QAF MEDIAL FORM → ARABIC LETTER QAF        # 
+FED6 ; 0642 ;  SL      # ( ‎ﻖ‎ → ‎ق‎ ) ARABIC LETTER QAF FINAL FORM → ARABIC LETTER QAF # 
+FED5 ; 0642 ;  SL      # ( ‎ﻕ‎ → ‎ق‎ ) ARABIC LETTER QAF ISOLATED FORM → ARABIC LETTER QAF      # 
+
+FCC2 ; 0642 062D ;     SL      # ( ‎ﳂ‎ → ‎قح‎ ) ARABIC LIGATURE QAF WITH HAH INITIAL FORM → ARABIC LETTER QAF, ARABIC LETTER HAH       # 
+FC33 ; 0642 062D ;     SL      # ( ‎ﰳ‎ → ‎قح‎ ) ARABIC LIGATURE QAF WITH HAH ISOLATED FORM → ARABIC LETTER QAF, ARABIC LETTER HAH      # 
+
+FDF1 ; 0642 0644 06D2 ;        SL      # ( ‎ﷱ‎ → ‎قلے‎ ) ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM → ARABIC LETTER QAF, ARABIC LETTER LAM, ARABIC LETTER YEH BARREE        # 
+
+FCC3 ; 0642 0645 ;     SL      # ( ‎ﳃ‎ → ‎قم‎ ) ARABIC LIGATURE QAF WITH MEEM INITIAL FORM → ARABIC LETTER QAF, ARABIC LETTER MEEM     # 
+FC34 ; 0642 0645 ;     SL      # ( ‎ﰴ‎ → ‎قم‎ ) ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM → ARABIC LETTER QAF, ARABIC LETTER MEEM    # 
+
+FDB4 ; 0642 0645 062D ;        SL      # ( ‎ﶴ‎ → ‎قمح‎ ) ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM → ARABIC LETTER QAF, ARABIC LETTER MEEM, ARABIC LETTER HAH       # 
+FD7E ; 0642 0645 062D ;        SL      # ( ‎ﵾ‎ → ‎قمح‎ ) ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM → ARABIC LETTER QAF, ARABIC LETTER MEEM, ARABIC LETTER HAH # 
+
+FD7F ; 0642 0645 0645 ;        SL      # ( ‎ﵿ‎ → ‎قمم‎ ) ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM → ARABIC LETTER QAF, ARABIC LETTER MEEM, ARABIC LETTER MEEM       # 
+
+FDB2 ; 0642 0645 0649 ;        SL      # ( ‎ﶲ‎ → ‎قمى‎ ) ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER QAF, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA        # →‎قمي‎→
+
+FC7E ; 0642 0649 ;     SL      # ( ‎ﱾ‎ → ‎قى‎ ) ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER QAF, ARABIC LETTER ALEF MAKSURA       # 
+FC35 ; 0642 0649 ;     SL      # ( ‎ﰵ‎ → ‎قى‎ ) ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER QAF, ARABIC LETTER ALEF MAKSURA    # 
+FC7F ; 0642 0649 ;     SL      # ( ‎ﱿ‎ → ‎قى‎ ) ARABIC LIGATURE QAF WITH YEH FINAL FORM → ARABIC LETTER QAF, ARABIC LETTER ALEF MAKSURA        # →‎قي‎→
+FC36 ; 0642 0649 ;     SL      # ( ‎ﰶ‎ → ‎قى‎ ) ARABIC LIGATURE QAF WITH YEH ISOLATED FORM → ARABIC LETTER QAF, ARABIC LETTER ALEF MAKSURA     # →‎قي‎→
+
+FEDB ; 0643 ;  SL      # ( ‎ﻛ‎ → ‎ك‎ ) ARABIC LETTER KAF INITIAL FORM → ARABIC LETTER KAF       # 
+FEDC ; 0643 ;  SL      # ( ‎ﻜ‎ → ‎ك‎ ) ARABIC LETTER KAF MEDIAL FORM → ARABIC LETTER KAF        # 
+FEDA ; 0643 ;  SL      # ( ‎ﻚ‎ → ‎ك‎ ) ARABIC LETTER KAF FINAL FORM → ARABIC LETTER KAF # 
+FED9 ; 0643 ;  SL      # ( ‎ﻙ‎ → ‎ك‎ ) ARABIC LETTER KAF ISOLATED FORM → ARABIC LETTER KAF      # 
+06A9 ; 0643 ;  SL      # ( ‎ک‎ → ‎ك‎ ) ARABIC LETTER KEHEH → ARABIC LETTER KAF   # 
+FB90 ; 0643 ;  SL      # ( ‎ﮐ‎ → ‎ك‎ ) ARABIC LETTER KEHEH INITIAL FORM → ARABIC LETTER KAF     # →‎ﻜ‎→
+FB91 ; 0643 ;  SL      # ( ‎ﮑ‎ → ‎ك‎ ) ARABIC LETTER KEHEH MEDIAL FORM → ARABIC LETTER KAF      # →‎ﻜ‎→
+FB8F ; 0643 ;  SL      # ( ‎ﮏ‎ → ‎ك‎ ) ARABIC LETTER KEHEH FINAL FORM → ARABIC LETTER KAF       # →‎ﻚ‎→
+FB8E ; 0643 ;  SL      # ( ‎ﮎ‎ → ‎ك‎ ) ARABIC LETTER KEHEH ISOLATED FORM → ARABIC LETTER KAF    # →‎ک‎→
+
+FC80 ; 0643 0627 ;     SL      # ( ‎ﲀ‎ → ‎كا‎ ) ARABIC LIGATURE KAF WITH ALEF FINAL FORM → ARABIC LETTER KAF, ARABIC LETTER ALEF       # 
+FC37 ; 0643 0627 ;     SL      # ( ‎ﰷ‎ → ‎كا‎ ) ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM → ARABIC LETTER KAF, ARABIC LETTER ALEF    # 
+
+FCC4 ; 0643 062C ;     SL      # ( ‎ﳄ‎ → ‎كج‎ ) ARABIC LIGATURE KAF WITH JEEM INITIAL FORM → ARABIC LETTER KAF, ARABIC LETTER JEEM     # 
+FC38 ; 0643 062C ;     SL      # ( ‎ﰸ‎ → ‎كج‎ ) ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM → ARABIC LETTER KAF, ARABIC LETTER JEEM    # 
+FCC6 ; 0643 062C ;     SL      # ( ‎ﳆ‎ → ‎كج‎ ) ARABIC LIGATURE KAF WITH KHAH INITIAL FORM → ARABIC LETTER KAF, ARABIC LETTER JEEM     # →‎كخ‎→→‎ﰺ‎→→‎ﰸ‎→
+FC3A ; 0643 062C ;     SL      # ( ‎ﰺ‎ → ‎كج‎ ) ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM → ARABIC LETTER KAF, ARABIC LETTER JEEM    # →‎ﰸ‎→
+
+FCC5 ; 0643 062D ;     SL      # ( ‎ﳅ‎ → ‎كح‎ ) ARABIC LIGATURE KAF WITH HAH INITIAL FORM → ARABIC LETTER KAF, ARABIC LETTER HAH       # 
+FC39 ; 0643 062D ;     SL      # ( ‎ﰹ‎ → ‎كح‎ ) ARABIC LIGATURE KAF WITH HAH ISOLATED FORM → ARABIC LETTER KAF, ARABIC LETTER HAH      # 
+
+FCC7 ; 0643 0644 ;     SL      # ( ‎ﳇ‎ → ‎كل‎ ) ARABIC LIGATURE KAF WITH LAM INITIAL FORM → ARABIC LETTER KAF, ARABIC LETTER LAM       # 
+FCEB ; 0643 0644 ;     SL      # ( ‎ﳫ‎ → ‎كل‎ ) ARABIC LIGATURE KAF WITH LAM MEDIAL FORM → ARABIC LETTER KAF, ARABIC LETTER LAM        # 
+FC81 ; 0643 0644 ;     SL      # ( ‎ﲁ‎ → ‎كل‎ ) ARABIC LIGATURE KAF WITH LAM FINAL FORM → ARABIC LETTER KAF, ARABIC LETTER LAM # 
+FC3B ; 0643 0644 ;     SL      # ( ‎ﰻ‎ → ‎كل‎ ) ARABIC LIGATURE KAF WITH LAM ISOLATED FORM → ARABIC LETTER KAF, ARABIC LETTER LAM      # 
+
+FCC8 ; 0643 0645 ;     SL      # ( ‎ﳈ‎ → ‎كم‎ ) ARABIC LIGATURE KAF WITH MEEM INITIAL FORM → ARABIC LETTER KAF, ARABIC LETTER MEEM     # 
+FCEC ; 0643 0645 ;     SL      # ( ‎ﳬ‎ → ‎كم‎ ) ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM → ARABIC LETTER KAF, ARABIC LETTER MEEM      # 
+FC82 ; 0643 0645 ;     SL      # ( ‎ﲂ‎ → ‎كم‎ ) ARABIC LIGATURE KAF WITH MEEM FINAL FORM → ARABIC LETTER KAF, ARABIC LETTER MEEM       # 
+FC3C ; 0643 0645 ;     SL      # ( ‎ﰼ‎ → ‎كم‎ ) ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM → ARABIC LETTER KAF, ARABIC LETTER MEEM    # 
+
+FDC3 ; 0643 0645 0645 ;        SL      # ( ‎ﷃ‎ → ‎كمم‎ ) ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM → ARABIC LETTER KAF, ARABIC LETTER MEEM, ARABIC LETTER MEEM     # 
+FDBB ; 0643 0645 0645 ;        SL      # ( ‎ﶻ‎ → ‎كمم‎ ) ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM → ARABIC LETTER KAF, ARABIC LETTER MEEM, ARABIC LETTER MEEM       # 
+
+FDB7 ; 0643 0645 0649 ;        SL      # ( ‎ﶷ‎ → ‎كمى‎ ) ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER KAF, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA        # →‎كمي‎→
+
+FC83 ; 0643 0649 ;     SL      # ( ‎ﲃ‎ → ‎كى‎ ) ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER KAF, ARABIC LETTER ALEF MAKSURA       # 
+FC3D ; 0643 0649 ;     SL      # ( ‎ﰽ‎ → ‎كى‎ ) ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER KAF, ARABIC LETTER ALEF MAKSURA    # 
+FC84 ; 0643 0649 ;     SL      # ( ‎ﲄ‎ → ‎كى‎ ) ARABIC LIGATURE KAF WITH YEH FINAL FORM → ARABIC LETTER KAF, ARABIC LETTER ALEF MAKSURA        # →‎كي‎→
+FC3E ; 0643 0649 ;     SL      # ( ‎ﰾ‎ → ‎كى‎ ) ARABIC LIGATURE KAF WITH YEH ISOLATED FORM → ARABIC LETTER KAF, ARABIC LETTER ALEF MAKSURA     # →‎كي‎→
+
+FBD5 ; 06AD ;  SL      # ( ‎ﯕ‎ → ‎ڭ‎ ) ARABIC LETTER NG INITIAL FORM → ARABIC LETTER NG # 
+FBD6 ; 06AD ;  SL      # ( ‎ﯖ‎ → ‎ڭ‎ ) ARABIC LETTER NG MEDIAL FORM → ARABIC LETTER NG  # 
+FBD4 ; 06AD ;  SL      # ( ‎ﯔ‎ → ‎ڭ‎ ) ARABIC LETTER NG FINAL FORM → ARABIC LETTER NG   # 
+FBD3 ; 06AD ;  SL      # ( ‎ﯓ‎ → ‎ڭ‎ ) ARABIC LETTER NG ISOLATED FORM → ARABIC LETTER NG        # 
+
+FB94 ; 06AF ;  SL      # ( ‎ﮔ‎ → ‎گ‎ ) ARABIC LETTER GAF INITIAL FORM → ARABIC LETTER GAF       # 
+FB95 ; 06AF ;  SL      # ( ‎ﮕ‎ → ‎گ‎ ) ARABIC LETTER GAF MEDIAL FORM → ARABIC LETTER GAF        # 
+FB93 ; 06AF ;  SL      # ( ‎ﮓ‎ → ‎گ‎ ) ARABIC LETTER GAF FINAL FORM → ARABIC LETTER GAF # 
+FB92 ; 06AF ;  SL      # ( ‎ﮒ‎ → ‎گ‎ ) ARABIC LETTER GAF ISOLATED FORM → ARABIC LETTER GAF      # 
+
+FB9C ; 06B1 ;  SL      # ( ‎ﮜ‎ → ‎ڱ‎ ) ARABIC LETTER NGOEH INITIAL FORM → ARABIC LETTER NGOEH   # 
+FB9D ; 06B1 ;  SL      # ( ‎ﮝ‎ → ‎ڱ‎ ) ARABIC LETTER NGOEH MEDIAL FORM → ARABIC LETTER NGOEH    # 
+FB9B ; 06B1 ;  SL      # ( ‎ﮛ‎ → ‎ڱ‎ ) ARABIC LETTER NGOEH FINAL FORM → ARABIC LETTER NGOEH     # 
+FB9A ; 06B1 ;  SL      # ( ‎ﮚ‎ → ‎ڱ‎ ) ARABIC LETTER NGOEH ISOLATED FORM → ARABIC LETTER NGOEH  # 
+
+FB98 ; 06B3 ;  SL      # ( ‎ﮘ‎ → ‎ڳ‎ ) ARABIC LETTER GUEH INITIAL FORM → ARABIC LETTER GUEH     # 
+FB99 ; 06B3 ;  SL      # ( ‎ﮙ‎ → ‎ڳ‎ ) ARABIC LETTER GUEH MEDIAL FORM → ARABIC LETTER GUEH      # 
+FB97 ; 06B3 ;  SL      # ( ‎ﮗ‎ → ‎ڳ‎ ) ARABIC LETTER GUEH FINAL FORM → ARABIC LETTER GUEH       # 
+FB96 ; 06B3 ;  SL      # ( ‎ﮖ‎ → ‎ڳ‎ ) ARABIC LETTER GUEH ISOLATED FORM → ARABIC LETTER GUEH    # 
+
+FEDF ; 0644 ;  SL      # ( ‎ﻟ‎ → ‎ل‎ ) ARABIC LETTER LAM INITIAL FORM → ARABIC LETTER LAM       # 
+FEE0 ; 0644 ;  SL      # ( ‎ﻠ‎ → ‎ل‎ ) ARABIC LETTER LAM MEDIAL FORM → ARABIC LETTER LAM        # 
+FEDE ; 0644 ;  SL      # ( ‎ﻞ‎ → ‎ل‎ ) ARABIC LETTER LAM FINAL FORM → ARABIC LETTER LAM # 
+FEDD ; 0644 ;  SL      # ( ‎ﻝ‎ → ‎ل‎ ) ARABIC LETTER LAM ISOLATED FORM → ARABIC LETTER LAM      # 
+
+FEF6 ; 0644 0622 ;     SL      # ( ‎ﻶ‎ → ‎لآ‎ ) ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF WITH MADDA ABOVE     # 
+FEF5 ; 0644 0622 ;     SL      # ( ‎ﻵ‎ → ‎لآ‎ ) ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF WITH MADDA ABOVE  # 
+
+FEFA ; 0644 0625 ;     SL      # ( ‎ﻺ‎ → ‎لإ‎ ) ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF WITH HAMZA BELOW     # 
+FEF9 ; 0644 0625 ;     SL      # ( ‎ﻹ‎ → ‎لإ‎ ) ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF WITH HAMZA BELOW  # 
+
+FEFC ; 0644 0627 ;     SL      # ( ‎ﻼ‎ → ‎لا‎ ) ARABIC LIGATURE LAM WITH ALEF FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF       # 
+FEFB ; 0644 0627 ;     SL      # ( ‎ﻻ‎ → ‎لا‎ ) ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF    # 
+
+FEF8 ; 0644 0627 0674 ;        SL      # ( ‎ﻸ‎ → ‎لاٴ‎ ) ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF, ARABIC LETTER HIGH HAMZA  # →‎لأ‎→
+FEF7 ; 0644 0627 0674 ;        SL      # ( ‎ﻷ‎ → ‎لاٴ‎ ) ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF, ARABIC LETTER HIGH HAMZA       # →‎لأ‎→
+
+FCC9 ; 0644 062C ;     SL      # ( ‎ﳉ‎ → ‎لج‎ ) ARABIC LIGATURE LAM WITH JEEM INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM     # 
+FC3F ; 0644 062C ;     SL      # ( ‎ﰿ‎ → ‎لج‎ ) ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM    # 
+FCCB ; 0644 062C ;     SL      # ( ‎ﳋ‎ → ‎لج‎ ) ARABIC LIGATURE LAM WITH KHAH INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM     # →‎لخ‎→→‎ﱁ‎→→‎ﰿ‎→
+FC41 ; 0644 062C ;     SL      # ( ‎ﱁ‎ → ‎لج‎ ) ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM    # →‎ﰿ‎→
+
+FD83 ; 0644 062C 062C ;        SL      # ( ‎ﶃ‎ → ‎لجج‎ ) ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM, ARABIC LETTER JEEM     # 
+FD84 ; 0644 062C 062C ;        SL      # ( ‎ﶄ‎ → ‎لجج‎ ) ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM, ARABIC LETTER JEEM       # 
+
+FDBA ; 0644 062C 0645 ;        SL      # ( ‎ﶺ‎ → ‎لجم‎ ) ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM, ARABIC LETTER MEEM     # 
+FDBC ; 0644 062C 0645 ;        SL      # ( ‎ﶼ‎ → ‎لجم‎ ) ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM, ARABIC LETTER MEEM       # 
+FD86 ; 0644 062C 0645 ;        SL      # ( ‎ﶆ‎ → ‎لجم‎ ) ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM, ARABIC LETTER MEEM     # →‎لخم‎→
+FD85 ; 0644 062C 0645 ;        SL      # ( ‎ﶅ‎ → ‎لجم‎ ) ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM, ARABIC LETTER MEEM       # →‎لخم‎→
+
+FDAC ; 0644 062C 0649 ;        SL      # ( ‎ﶬ‎ → ‎لجى‎ ) ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA        # →‎لجي‎→
+
+FCCA ; 0644 062D ;     SL      # ( ‎ﳊ‎ → ‎لح‎ ) ARABIC LIGATURE LAM WITH HAH INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER HAH       # 
+FC40 ; 0644 062D ;     SL      # ( ‎ﱀ‎ → ‎لح‎ ) ARABIC LIGATURE LAM WITH HAH ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER HAH      # 
+
+FDB5 ; 0644 062D 0645 ;        SL      # ( ‎ﶵ‎ → ‎لحم‎ ) ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER HAH, ARABIC LETTER MEEM       # 
+FD80 ; 0644 062D 0645 ;        SL      # ( ‎ﶀ‎ → ‎لحم‎ ) ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER HAH, ARABIC LETTER MEEM # 
+
+FD82 ; 0644 062D 0649 ;        SL      # ( ‎ﶂ‎ → ‎لحى‎ ) ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA # 
+FD81 ; 0644 062D 0649 ;        SL      # ( ‎ﶁ‎ → ‎لحى‎ ) ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA  # →‎لحي‎→
+
+FCCC ; 0644 0645 ;     SL      # ( ‎ﳌ‎ → ‎لم‎ ) ARABIC LIGATURE LAM WITH MEEM INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER MEEM     # 
+FCED ; 0644 0645 ;     SL      # ( ‎ﳭ‎ → ‎لم‎ ) ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM → ARABIC LETTER LAM, ARABIC LETTER MEEM      # 
+FC85 ; 0644 0645 ;     SL      # ( ‎ﲅ‎ → ‎لم‎ ) ARABIC LIGATURE LAM WITH MEEM FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER MEEM       # 
+FC42 ; 0644 0645 ;     SL      # ( ‎ﱂ‎ → ‎لم‎ ) ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER MEEM    # 
+
+FD88 ; 0644 0645 062D ;        SL      # ( ‎ﶈ‎ → ‎لمح‎ ) ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER MEEM, ARABIC LETTER HAH       # 
+FD87 ; 0644 0645 062D ;        SL      # ( ‎ﶇ‎ → ‎لمح‎ ) ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER MEEM, ARABIC LETTER HAH # 
+
+FDAD ; 0644 0645 0649 ;        SL      # ( ‎ﶭ‎ → ‎لمى‎ ) ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA        # →‎لمي‎→
+
+FCCD ; 0644 0647 ;     SL      # ( ‎ﳍ‎ → ‎له‎ ) ARABIC LIGATURE LAM WITH HEH INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER HEH       # 
+
+FC86 ; 0644 0649 ;     SL      # ( ‎ﲆ‎ → ‎لى‎ ) ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA       # 
+FC43 ; 0644 0649 ;     SL      # ( ‎ﱃ‎ → ‎لى‎ ) ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA    # 
+FC87 ; 0644 0649 ;     SL      # ( ‎ﲇ‎ → ‎لى‎ ) ARABIC LIGATURE LAM WITH YEH FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA        # →‎لي‎→
+FC44 ; 0644 0649 ;     SL      # ( ‎ﱄ‎ → ‎لى‎ ) ARABIC LIGATURE LAM WITH YEH ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA     # →‎لي‎→
+
+FEE3 ; 0645 ;  SL      # ( ‎ﻣ‎ → ‎م‎ ) ARABIC LETTER MEEM INITIAL FORM → ARABIC LETTER MEEM     # 
+FEE4 ; 0645 ;  SL      # ( ‎ﻤ‎ → ‎م‎ ) ARABIC LETTER MEEM MEDIAL FORM → ARABIC LETTER MEEM      # 
+FEE2 ; 0645 ;  SL      # ( ‎ﻢ‎ → ‎م‎ ) ARABIC LETTER MEEM FINAL FORM → ARABIC LETTER MEEM       # 
+FEE1 ; 0645 ;  SL      # ( ‎ﻡ‎ → ‎م‎ ) ARABIC LETTER MEEM ISOLATED FORM → ARABIC LETTER MEEM    # 
+
+FC88 ; 0645 0627 ;     SL      # ( ‎ﲈ‎ → ‎ما‎ ) ARABIC LIGATURE MEEM WITH ALEF FINAL FORM → ARABIC LETTER MEEM, ARABIC LETTER ALEF     # 
+
+FCCE ; 0645 062C ;     SL      # ( ‎ﳎ‎ → ‎مج‎ ) ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM   # 
+FC45 ; 0645 062C ;     SL      # ( ‎ﱅ‎ → ‎مج‎ ) ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM  # 
+FCD0 ; 0645 062C ;     SL      # ( ‎ﳐ‎ → ‎مج‎ ) ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM   # →‎مخ‎→→‎ﱇ‎→→‎ﱅ‎→
+FC47 ; 0645 062C ;     SL      # ( ‎ﱇ‎ → ‎مج‎ ) ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM  # →‎ﱅ‎→
+
+FD92 ; 0645 062C 062C ;        SL      # ( ‎ﶒ‎ → ‎مجج‎ ) ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM, ARABIC LETTER JEEM   # →‎مجخ‎→
+FD8E ; 0645 062C 062C ;        SL      # ( ‎ﶎ‎ → ‎مجج‎ ) ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM, ARABIC LETTER JEEM   # →‎مخج‎→
+
+FD8C ; 0645 062C 062D ;        SL      # ( ‎ﶌ‎ → ‎مجح‎ ) ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM, ARABIC LETTER HAH     # 
+
+FD8D ; 0645 062C 0645 ;        SL      # ( ‎ﶍ‎ → ‎مجم‎ ) ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM, ARABIC LETTER MEEM   # 
+FD8F ; 0645 062C 0645 ;        SL      # ( ‎ﶏ‎ → ‎مجم‎ ) ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM, ARABIC LETTER MEEM   # →‎مخم‎→
+
+FDC0 ; 0645 062C 0649 ;        SL      # ( ‎ﷀ‎ → ‎مجى‎ ) ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA      # →‎مجي‎→
+FDB9 ; 0645 062C 0649 ;        SL      # ( ‎ﶹ‎ → ‎مجى‎ ) ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA      # →‎مخي‎→
+
+FCCF ; 0645 062D ;     SL      # ( ‎ﳏ‎ → ‎مح‎ ) ARABIC LIGATURE MEEM WITH HAH INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER HAH     # 
+FC46 ; 0645 062D ;     SL      # ( ‎ﱆ‎ → ‎مح‎ ) ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM → ARABIC LETTER MEEM, ARABIC LETTER HAH    # 
+
+FD89 ; 0645 062D 062C ;        SL      # ( ‎ﶉ‎ → ‎محج‎ ) ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER HAH, ARABIC LETTER JEEM     # 
+
+FD8A ; 0645 062D 0645 ;        SL      # ( ‎ﶊ‎ → ‎محم‎ ) ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER HAH, ARABIC LETTER MEEM     # 
+
+FDF4 ; 0645 062D 0645 062F ;   SL      # ( ‎ﷴ‎ → ‎محمد‎ ) ARABIC LIGATURE MOHAMMAD ISOLATED FORM → ARABIC LETTER MEEM, ARABIC LETTER HAH, ARABIC LETTER MEEM, ARABIC LETTER DAL      # 
+
+FD8B ; 0645 062D 0649 ;        SL      # ( ‎ﶋ‎ → ‎محى‎ ) ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM → ARABIC LETTER MEEM, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA        # →‎محي‎→
+
+FCD1 ; 0645 0645 ;     SL      # ( ‎ﳑ‎ → ‎مم‎ ) ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER MEEM   # 
+FC89 ; 0645 0645 ;     SL      # ( ‎ﲉ‎ → ‎مم‎ ) ARABIC LIGATURE MEEM WITH MEEM FINAL FORM → ARABIC LETTER MEEM, ARABIC LETTER MEEM     # 
+FC48 ; 0645 0645 ;     SL      # ( ‎ﱈ‎ → ‎مم‎ ) ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM → ARABIC LETTER MEEM, ARABIC LETTER MEEM  # 
+
+FDB1 ; 0645 0645 0649 ;        SL      # ( ‎ﶱ‎ → ‎ممى‎ ) ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER MEEM, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA      # →‎ممي‎→
+
+FC49 ; 0645 0649 ;     SL      # ( ‎ﱉ‎ → ‎مى‎ ) ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA  # 
+FC4A ; 0645 0649 ;     SL      # ( ‎ﱊ‎ → ‎مى‎ ) ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM → ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA   # →‎مي‎→
+
+FB9F ; 06BA ;  SL      # ( ‎ﮟ‎ → ‎ں‎ ) ARABIC LETTER NOON GHUNNA FINAL FORM → ARABIC LETTER NOON GHUNNA # 
+FB9E ; 06BA ;  SL      # ( ‎ﮞ‎ → ‎ں‎ ) ARABIC LETTER NOON GHUNNA ISOLATED FORM → ARABIC LETTER NOON GHUNNA      # 
+
+FEEB ; 0647 ;  SL      # ( ‎ﻫ‎ → ‎ه‎ ) ARABIC LETTER HEH INITIAL FORM → ARABIC LETTER HEH       # 
+FEEC ; 0647 ;  SL      # ( ‎ﻬ‎ → ‎ه‎ ) ARABIC LETTER HEH MEDIAL FORM → ARABIC LETTER HEH        # 
+FEEA ; 0647 ;  SL      # ( ‎ﻪ‎ → ‎ه‎ ) ARABIC LETTER HEH FINAL FORM → ARABIC LETTER HEH # 
+FEE9 ; 0647 ;  SL      # ( ‎ﻩ‎ → ‎ه‎ ) ARABIC LETTER HEH ISOLATED FORM → ARABIC LETTER HEH      # 
+06BE ; 0647 ;  SL      # ( ‎ھ‎ → ‎ه‎ ) ARABIC LETTER HEH DOACHASHMEE → ARABIC LETTER HEH # 
+FBAC ; 0647 ;  SL      # ( ‎ﮬ‎ → ‎ه‎ ) ARABIC LETTER HEH DOACHASHMEE INITIAL FORM → ARABIC LETTER HEH   # →‎ﻫ‎→
+FBAD ; 0647 ;  SL      # ( ‎ﮭ‎ → ‎ه‎ ) ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM → ARABIC LETTER HEH    # →‎ﻬ‎→
+FBAB ; 0647 ;  SL      # ( ‎ﮫ‎ → ‎ه‎ ) ARABIC LETTER HEH DOACHASHMEE FINAL FORM → ARABIC LETTER HEH     # →‎ﻬ‎→
+FBAA ; 0647 ;  SL      # ( ‎ﮪ‎ → ‎ه‎ ) ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM → ARABIC LETTER HEH  # 
+06C1 ; 0647 ;  SL      # ( ‎ہ‎ → ‎ه‎ ) ARABIC LETTER HEH GOAL → ARABIC LETTER HEH        # →‎ﮦ‎→
+FBA8 ; 0647 ;  SL      # ( ‎ﮨ‎ → ‎ه‎ ) ARABIC LETTER HEH GOAL INITIAL FORM → ARABIC LETTER HEH  # →‎ہ‎→→‎ﮦ‎→
+FBA9 ; 0647 ;  SL      # ( ‎ﮩ‎ → ‎ه‎ ) ARABIC LETTER HEH GOAL MEDIAL FORM → ARABIC LETTER HEH   # →‎ہ‎→→‎ﮦ‎→
+FBA7 ; 0647 ;  SL      # ( ‎ﮧ‎ → ‎ه‎ ) ARABIC LETTER HEH GOAL FINAL FORM → ARABIC LETTER HEH    # →‎ہ‎→→‎ﮦ‎→
+FBA6 ; 0647 ;  SL      # ( ‎ﮦ‎ → ‎ه‎ ) ARABIC LETTER HEH GOAL ISOLATED FORM → ARABIC LETTER HEH # 
+06D5 ; 0647 ;  SL      # ( ‎ە‎ → ‎ه‎ ) ARABIC LETTER AE → ARABIC LETTER HEH      # 
+
+FCD9 ; 0647 0670 ;     SL      # ( ‎ﳙ‎ → ‎هٰ‎ ) ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM → ARABIC LETTER HEH, ARABIC LETTER SUPERSCRIPT ALEF     # 
+
+FCD7 ; 0647 062C ;     SL      # ( ‎ﳗ‎ → ‎هج‎ ) ARABIC LIGATURE HEH WITH JEEM INITIAL FORM → ARABIC LETTER HEH, ARABIC LETTER JEEM     # 
+FC51 ; 0647 062C ;     SL      # ( ‎ﱑ‎ → ‎هج‎ ) ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM → ARABIC LETTER HEH, ARABIC LETTER JEEM    # 
+
+FCD8 ; 0647 0645 ;     SL      # ( ‎ﳘ‎ → ‎هم‎ ) ARABIC LIGATURE HEH WITH MEEM INITIAL FORM → ARABIC LETTER HEH, ARABIC LETTER MEEM     # 
+FC52 ; 0647 0645 ;     SL      # ( ‎ﱒ‎ → ‎هم‎ ) ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM → ARABIC LETTER HEH, ARABIC LETTER MEEM    # 
+
+FD93 ; 0647 0645 062C ;        SL      # ( ‎ﶓ‎ → ‎همج‎ ) ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM → ARABIC LETTER HEH, ARABIC LETTER MEEM, ARABIC LETTER JEEM     # 
+
+FD94 ; 0647 0645 0645 ;        SL      # ( ‎ﶔ‎ → ‎همم‎ ) ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM → ARABIC LETTER HEH, ARABIC LETTER MEEM, ARABIC LETTER MEEM     # 
+
+FC53 ; 0647 0649 ;     SL      # ( ‎ﱓ‎ → ‎هى‎ ) ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER HEH, ARABIC LETTER ALEF MAKSURA    # 
+FC54 ; 0647 0649 ;     SL      # ( ‎ﱔ‎ → ‎هى‎ ) ARABIC LIGATURE HEH WITH YEH ISOLATED FORM → ARABIC LETTER HEH, ARABIC LETTER ALEF MAKSURA     # →‎هي‎→
+
+06C2 ; 06C0 ;  SL      # ( ‎ۂ‎ → ‎ۀ‎ ) ARABIC LETTER HEH GOAL WITH HAMZA ABOVE → ARABIC LETTER HEH WITH YEH ABOVE        # →‎ﮤ‎→
+FBA5 ; 06C0 ;  SL      # ( ‎ﮥ‎ → ‎ۀ‎ ) ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM → ARABIC LETTER HEH WITH YEH ABOVE   # 
+FBA4 ; 06C0 ;  SL      # ( ‎ﮤ‎ → ‎ۀ‎ ) ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM → ARABIC LETTER HEH WITH YEH ABOVE        # 
+
+FEEE ; 0648 ;  SL      # ( ‎ﻮ‎ → ‎و‎ ) ARABIC LETTER WAW FINAL FORM → ARABIC LETTER WAW # 
+FEED ; 0648 ;  SL      # ( ‎ﻭ‎ → ‎و‎ ) ARABIC LETTER WAW ISOLATED FORM → ARABIC LETTER WAW      # 
+
+0624 ; 0648 0674 ;     SL      # ( ‎ؤ‎ → ‎وٴ‎ ) ARABIC LETTER WAW WITH HAMZA ABOVE → ARABIC LETTER WAW, ARABIC LETTER HIGH HAMZA        # →‎ٶ‎→
+FE86 ; 0648 0674 ;     SL      # ( ‎ﺆ‎ → ‎وٴ‎ ) ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM → ARABIC LETTER WAW, ARABIC LETTER HIGH HAMZA    # →‎ٶ‎→
+FE85 ; 0648 0674 ;     SL      # ( ‎ﺅ‎ → ‎وٴ‎ ) ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM → ARABIC LETTER WAW, ARABIC LETTER HIGH HAMZA # →‎ٶ‎→
+0676 ; 0648 0674 ;     SL      # ( ‎ٶ‎ → ‎وٴ‎ ) ARABIC LETTER HIGH HAMZA WAW → ARABIC LETTER WAW, ARABIC LETTER HIGH HAMZA      # 
+
+FDF8 ; 0648 0633 0644 0645 ;   SL      # ( ‎ﷸ‎ → ‎وسلم‎ ) ARABIC LIGATURE WASALLAM ISOLATED FORM → ARABIC LETTER WAW, ARABIC LETTER SEEN, ARABIC LETTER LAM, ARABIC LETTER MEEM      # 
+
+FBE1 ; 06C5 ;  SL      # ( ‎ﯡ‎ → ‎ۅ‎ ) ARABIC LETTER KIRGHIZ OE FINAL FORM → ARABIC LETTER KIRGHIZ OE   # 
+FBE0 ; 06C5 ;  SL      # ( ‎ﯠ‎ → ‎ۅ‎ ) ARABIC LETTER KIRGHIZ OE ISOLATED FORM → ARABIC LETTER KIRGHIZ OE        # 
+
+FBDA ; 06C6 ;  SL      # ( ‎ﯚ‎ → ‎ۆ‎ ) ARABIC LETTER OE FINAL FORM → ARABIC LETTER OE   # 
+FBD9 ; 06C6 ;  SL      # ( ‎ﯙ‎ → ‎ۆ‎ ) ARABIC LETTER OE ISOLATED FORM → ARABIC LETTER OE        # 
+
+FBD8 ; 06C7 ;  SL      # ( ‎ﯘ‎ → ‎ۇ‎ ) ARABIC LETTER U FINAL FORM → ARABIC LETTER U     # 
+FBD7 ; 06C7 ;  SL      # ( ‎ﯗ‎ → ‎ۇ‎ ) ARABIC LETTER U ISOLATED FORM → ARABIC LETTER U  # 
+
+0677 ; 06C7 0674 ;     SL      # ( ‎ٷ‎ → ‎ۇٴ‎ ) ARABIC LETTER U WITH HAMZA ABOVE → ARABIC LETTER U, ARABIC LETTER HIGH HAMZA    # 
+FBDD ; 06C7 0674 ;     SL      # ( ‎ﯝ‎ → ‎ۇٴ‎ ) ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM → ARABIC LETTER U, ARABIC LETTER HIGH HAMZA     # 
+
+FBDC ; 06C8 ;  SL      # ( ‎ﯜ‎ → ‎ۈ‎ ) ARABIC LETTER YU FINAL FORM → ARABIC LETTER YU   # 
+FBDB ; 06C8 ;  SL      # ( ‎ﯛ‎ → ‎ۈ‎ ) ARABIC LETTER YU ISOLATED FORM → ARABIC LETTER YU        # 
+
+FBE3 ; 06C9 ;  SL      # ( ‎ﯣ‎ → ‎ۉ‎ ) ARABIC LETTER KIRGHIZ YU FINAL FORM → ARABIC LETTER KIRGHIZ YU   # 
+FBE2 ; 06C9 ;  SL      # ( ‎ﯢ‎ → ‎ۉ‎ ) ARABIC LETTER KIRGHIZ YU ISOLATED FORM → ARABIC LETTER KIRGHIZ YU        # 
+
+FBDF ; 06CB ;  SL      # ( ‎ﯟ‎ → ‎ۋ‎ ) ARABIC LETTER VE FINAL FORM → ARABIC LETTER VE   # 
+FBDE ; 06CB ;  SL      # ( ‎ﯞ‎ → ‎ۋ‎ ) ARABIC LETTER VE ISOLATED FORM → ARABIC LETTER VE        # 
+
+FBE8 ; 0649 ;  SL      # ( ‎ﯨ‎ → ‎ى‎ ) ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM → ARABIC LETTER ALEF MAKSURA       # 
+FBE9 ; 0649 ;  SL      # ( ‎ﯩ‎ → ‎ى‎ ) ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM → ARABIC LETTER ALEF MAKSURA        # 
+FEF0 ; 0649 ;  SL      # ( ‎ﻰ‎ → ‎ى‎ ) ARABIC LETTER ALEF MAKSURA FINAL FORM → ARABIC LETTER ALEF MAKSURA       # 
+FEEF ; 0649 ;  SL      # ( ‎ﻯ‎ → ‎ى‎ ) ARABIC LETTER ALEF MAKSURA ISOLATED FORM → ARABIC LETTER ALEF MAKSURA    # 
+064A ; 0649 ;  SL      # ( ‎ي‎ → ‎ى‎ ) ARABIC LETTER YEH → ARABIC LETTER ALEF MAKSURA    # →‎ﻴ‎→→‎ﯿ‎→→‎ی‎→
+FEF3 ; 0649 ;  SL      # ( ‎ﻳ‎ → ‎ى‎ ) ARABIC LETTER YEH INITIAL FORM → ARABIC LETTER ALEF MAKSURA      # →‎ﯿ‎→→‎ی‎→
+FEF4 ; 0649 ;  SL      # ( ‎ﻴ‎ → ‎ى‎ ) ARABIC LETTER YEH MEDIAL FORM → ARABIC LETTER ALEF MAKSURA       # →‎ﯿ‎→→‎ی‎→
+FEF2 ; 0649 ;  SL      # ( ‎ﻲ‎ → ‎ى‎ ) ARABIC LETTER YEH FINAL FORM → ARABIC LETTER ALEF MAKSURA        # →‎ي‎→→‎ﻴ‎→→‎ﯿ‎→→‎ی‎→
+FEF1 ; 0649 ;  SL      # ( ‎ﻱ‎ → ‎ى‎ ) ARABIC LETTER YEH ISOLATED FORM → ARABIC LETTER ALEF MAKSURA     # →‎ي‎→→‎ﻴ‎→→‎ﯿ‎→→‎ی‎→
+06CC ; 0649 ;  SL      # ( ‎ی‎ → ‎ى‎ ) ARABIC LETTER FARSI YEH → ARABIC LETTER ALEF MAKSURA      # 
+FBFE ; 0649 ;  SL      # ( ‎ﯾ‎ → ‎ى‎ ) ARABIC LETTER FARSI YEH INITIAL FORM → ARABIC LETTER ALEF MAKSURA        # →‎ی‎→
+FBFF ; 0649 ;  SL      # ( ‎ﯿ‎ → ‎ى‎ ) ARABIC LETTER FARSI YEH MEDIAL FORM → ARABIC LETTER ALEF MAKSURA # →‎ی‎→
+FBFD ; 0649 ;  SL      # ( ‎ﯽ‎ → ‎ى‎ ) ARABIC LETTER FARSI YEH FINAL FORM → ARABIC LETTER ALEF MAKSURA  # →‎ی‎→
+FBFC ; 0649 ;  SL      # ( ‎ﯼ‎ → ‎ى‎ ) ARABIC LETTER FARSI YEH ISOLATED FORM → ARABIC LETTER ALEF MAKSURA       # 
+
+FC90 ; 0649 0670 ;     SL      # ( ‎ﲐ‎ → ‎ىٰ‎ ) ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER SUPERSCRIPT ALEF     # 
+FC5D ; 0649 0670 ;     SL      # ( ‎ﱝ‎ → ‎ىٰ‎ ) ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER SUPERSCRIPT ALEF  # 
+
+0626 ; 0649 0674 ;     SL      # ( ‎ئ‎ → ‎ىٴ‎ ) ARABIC LETTER YEH WITH HAMZA ABOVE → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA       # →‎ٸ‎→→‎يٴ‎→
+FE8B ; 0649 0674 ;     SL      # ( ‎ﺋ‎ → ‎ىٴ‎ ) ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA # →‎ئ‎→→‎ٸ‎→→‎يٴ‎→
+FE8C ; 0649 0674 ;     SL      # ( ‎ﺌ‎ → ‎ىٴ‎ ) ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA  # →‎ئ‎→→‎ٸ‎→→‎يٴ‎→
+FE8A ; 0649 0674 ;     SL      # ( ‎ﺊ‎ → ‎ىٴ‎ ) ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA   # →‎ئ‎→→‎ٸ‎→→‎يٴ‎→
+FE89 ; 0649 0674 ;     SL      # ( ‎ﺉ‎ → ‎ىٴ‎ ) ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA        # →‎ٸ‎→→‎يٴ‎→
+0678 ; 0649 0674 ;     SL      # ( ‎ٸ‎ → ‎ىٴ‎ ) ARABIC LETTER HIGH HAMZA YEH → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA     # →‎يٴ‎→
+
+FBEB ; 0649 0674 0627 ;        SL      # ( ‎ﯫ‎ → ‎ىٴا‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF # →‎ئا‎→
+FBEA ; 0649 0674 0627 ;        SL      # ( ‎ﯪ‎ → ‎ىٴا‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF      # →‎ئا‎→
+
+FC67 ; 0649 0674 0628 ;        SL      # ( ‎ﱧ‎ → ‎ىٴب‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER BEH  # →‎ئن‎→
+
+FBF8 ; 0649 0674 067A ;        SL      # ( ‎ﯸ‎ → ‎ىٴٺ‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER TTEHEH        # →‎ئې‎→
+FBF7 ; 0649 0674 067A ;        SL      # ( ‎ﯷ‎ → ‎ىٴٺ‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER TTEHEH  # →‎ئې‎→
+FBF6 ; 0649 0674 067A ;        SL      # ( ‎ﯶ‎ → ‎ىٴٺ‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER TTEHEH       # →‎ئې‎→
+
+FC97 ; 0649 0674 062C ;        SL      # ( ‎ﲗ‎ → ‎ىٴج‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER JEEM       # →‎ئج‎→
+FC00 ; 0649 0674 062C ;        SL      # ( ‎ﰀ‎ → ‎ىٴج‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER JEEM      # →‎ئج‎→
+FC99 ; 0649 0674 062C ;        SL      # ( ‎ﲙ‎ → ‎ىٴج‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER JEEM       # →‎ئخ‎→→‎يٴج‎→→‎ئج‎→
+
+FC98 ; 0649 0674 062D ;        SL      # ( ‎ﲘ‎ → ‎ىٴح‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER HAH # →‎ئح‎→
+FC01 ; 0649 0674 062D ;        SL      # ( ‎ﰁ‎ → ‎ىٴح‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER HAH        # →‎ئح‎→
+
+FC64 ; 0649 0674 0631 ;        SL      # ( ‎ﱤ‎ → ‎ىٴر‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER REH   # →‎ئر‎→
+
+FC65 ; 0649 0674 0632 ;        SL      # ( ‎ﱥ‎ → ‎ىٴز‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ZAIN # →‎ئز‎→
+
+FC9A ; 0649 0674 0645 ;        SL      # ( ‎ﲚ‎ → ‎ىٴم‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER MEEM       # →‎ئم‎→
+FCDF ; 0649 0674 0645 ;        SL      # ( ‎ﳟ‎ → ‎ىٴم‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER MEEM        # →‎ئم‎→
+FC66 ; 0649 0674 0645 ;        SL      # ( ‎ﱦ‎ → ‎ىٴم‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER MEEM # →‎ئم‎→
+FC02 ; 0649 0674 0645 ;        SL      # ( ‎ﰂ‎ → ‎ىٴم‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER MEEM      # →‎ئم‎→
+
+FC9B ; 0649 0674 0647 ;        SL      # ( ‎ﲛ‎ → ‎ىٴه‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER HEH # →‎ئه‎→
+FCE0 ; 0649 0674 0647 ;        SL      # ( ‎ﳠ‎ → ‎ىٴه‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER HEH  # →‎ئه‎→
+FBED ; 0649 0674 0647 ;        SL      # ( ‎ﯭ‎ → ‎ىٴه‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER HEH    # →‎ئە‎→→‎يٴه‎→→‎ئه‎→
+FBEC ; 0649 0674 0647 ;        SL      # ( ‎ﯬ‎ → ‎ىٴه‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER HEH # →‎ئە‎→→‎يٴه‎→→‎ئه‎→
+
+FBEF ; 0649 0674 0648 ;        SL      # ( ‎ﯯ‎ → ‎ىٴو‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER WAW   # →‎ئو‎→
+FBEE ; 0649 0674 0648 ;        SL      # ( ‎ﯮ‎ → ‎ىٴو‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER WAW        # →‎ئو‎→
+
+FBF3 ; 0649 0674 06C6 ;        SL      # ( ‎ﯳ‎ → ‎ىٴۆ‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER OE     # →‎ئۆ‎→
+FBF2 ; 0649 0674 06C6 ;        SL      # ( ‎ﯲ‎ → ‎ىٴۆ‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER OE  # →‎ئۆ‎→
+
+FBF1 ; 0649 0674 06C7 ;        SL      # ( ‎ﯱ‎ → ‎ىٴۇ‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER U       # →‎ئۇ‎→
+FBF0 ; 0649 0674 06C7 ;        SL      # ( ‎ﯰ‎ → ‎ىٴۇ‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER U    # →‎ئۇ‎→
+
+FBF5 ; 0649 0674 06C8 ;        SL      # ( ‎ﯵ‎ → ‎ىٴۈ‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER YU     # →‎ئۈ‎→
+FBF4 ; 0649 0674 06C8 ;        SL      # ( ‎ﯴ‎ → ‎ىٴۈ‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER YU  # →‎ئۈ‎→
+
+FBFB ; 0649 0674 0649 ;        SL      # ( ‎ﯻ‎ → ‎ىٴى‎ ) ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF MAKSURA        # →‎ئى‎→
+FBFA ; 0649 0674 0649 ;        SL      # ( ‎ﯺ‎ → ‎ىٴى‎ ) ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF MAKSURA  # →‎ئى‎→
+FC68 ; 0649 0674 0649 ;        SL      # ( ‎ﱨ‎ → ‎ىٴى‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF MAKSURA # →‎ئى‎→
+FBF9 ; 0649 0674 0649 ;        SL      # ( ‎ﯹ‎ → ‎ىٴى‎ ) ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF MAKSURA       # →‎ئى‎→
+FC03 ; 0649 0674 0649 ;        SL      # ( ‎ﰃ‎ → ‎ىٴى‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF MAKSURA      # →‎ئى‎→
+FC69 ; 0649 0674 0649 ;        SL      # ( ‎ﱩ‎ → ‎ىٴى‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF MAKSURA  # →‎ئي‎→→‎يٴى‎→→‎ئى‎→
+FC04 ; 0649 0674 0649 ;        SL      # ( ‎ﰄ‎ → ‎ىٴى‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF MAKSURA       # →‎ئي‎→→‎يٴى‎→→‎ئى‎→
+
+FC94 ; 0649 0628 ;     SL      # ( ‎ﲔ‎ → ‎ىب‎ ) ARABIC LIGATURE YEH WITH NOON FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER BEH       # →‎ين‎→
+
+FDAF ; 0649 062C 0649 ;        SL      # ( ‎ﶯ‎ → ‎ىجى‎ ) ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA       # →‎يجي‎→
+
+FDAE ; 0649 062D 0649 ;        SL      # ( ‎ﶮ‎ → ‎ىحى‎ ) ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA # →‎يحي‎→
+
+FC91 ; 0649 0631 ;     SL      # ( ‎ﲑ‎ → ‎ىر‎ ) ARABIC LIGATURE YEH WITH REH FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER REH        # →‎ير‎→
+
+FC92 ; 0649 0632 ;     SL      # ( ‎ﲒ‎ → ‎ىز‎ ) ARABIC LIGATURE YEH WITH ZAIN FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER ZAIN      # →‎يز‎→
+
+FCDD ; 0649 0645 ;     SL      # ( ‎ﳝ‎ → ‎ىم‎ ) ARABIC LIGATURE YEH WITH MEEM INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER MEEM    # →‎يم‎→
+FCF0 ; 0649 0645 ;     SL      # ( ‎ﳰ‎ → ‎ىم‎ ) ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER MEEM     # →‎يم‎→
+FC93 ; 0649 0645 ;     SL      # ( ‎ﲓ‎ → ‎ىم‎ ) ARABIC LIGATURE YEH WITH MEEM FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER MEEM      # →‎يم‎→
+FC58 ; 0649 0645 ;     SL      # ( ‎ﱘ‎ → ‎ىم‎ ) ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER MEEM   # →‎يم‎→
+
+FD9D ; 0649 0645 0645 ;        SL      # ( ‎ﶝ‎ → ‎ىمم‎ ) ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER MEEM, ARABIC LETTER MEEM    # →‎يمم‎→
+FD9C ; 0649 0645 0645 ;        SL      # ( ‎ﶜ‎ → ‎ىمم‎ ) ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER MEEM, ARABIC LETTER MEEM      # →‎يمم‎→
+
+FDB0 ; 0649 0645 0649 ;        SL      # ( ‎ﶰ‎ → ‎ىمى‎ ) ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA       # →‎يمي‎→
+
+FCDE ; 0649 0647 ;     SL      # ( ‎ﳞ‎ → ‎ىه‎ ) ARABIC LIGATURE YEH WITH HEH INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HEH      # →‎يه‎→
+FCF1 ; 0649 0647 ;     SL      # ( ‎ﳱ‎ → ‎ىه‎ ) ARABIC LIGATURE YEH WITH HEH MEDIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HEH       # →‎يه‎→
+
+FC95 ; 0649 0649 ;     SL      # ( ‎ﲕ‎ → ‎ىى‎ ) ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER ALEF MAKSURA      # →‎يى‎→
+FC59 ; 0649 0649 ;     SL      # ( ‎ﱙ‎ → ‎ىى‎ ) ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER ALEF MAKSURA   # →‎يى‎→
+FC96 ; 0649 0649 ;     SL      # ( ‎ﲖ‎ → ‎ىى‎ ) ARABIC LIGATURE YEH WITH YEH FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER ALEF MAKSURA       # →‎يي‎→
+FC5A ; 0649 0649 ;     SL      # ( ‎ﱚ‎ → ‎ىى‎ ) ARABIC LIGATURE YEH WITH YEH ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER ALEF MAKSURA    # →‎يي‎→
+
+FBAF ; 06D2 ;  SL      # ( ‎ﮯ‎ → ‎ے‎ ) ARABIC LETTER YEH BARREE FINAL FORM → ARABIC LETTER YEH BARREE   # 
+FBAE ; 06D2 ;  SL      # ( ‎ﮮ‎ → ‎ے‎ ) ARABIC LETTER YEH BARREE ISOLATED FORM → ARABIC LETTER YEH BARREE        # 
+
+FBB1 ; 06D3 ;  SL      # ( ‎ﮱ‎ → ‎ۓ‎ ) ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM → ARABIC LETTER YEH BARREE WITH HAMZA ABOVE # 
+FBB0 ; 06D3 ;  SL      # ( ‎ﮰ‎ → ‎ۓ‎ ) ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM → ARABIC LETTER YEH BARREE WITH HAMZA ABOVE      # 
+
+079A ; 0799 ;  SL      # ( ‎ޚ‎ → ‎ޙ‎ ) THAANA LETTER KHAA → THAANA LETTER HHAA   # 
+
+07A3 ; 07A2 ;  SL      # ( ‎ޣ‎ → ‎ޢ‎ ) THAANA LETTER GHAINU → THAANA LETTER AINU # 
+
+07A1 ; 07A0 ;  SL      # ( ‎ޡ‎ → ‎ޠ‎ ) THAANA LETTER ZO → THAANA LETTER TO       # 
+
+079F ; 079E ;  SL      # ( ‎ޟ‎ → ‎ޞ‎ ) THAANA LETTER DAADHU → THAANA LETTER SAADHU       # 
+
+22FF ; 2D39 ;  SL      #* ( ⋿ → ⴹ ) Z NOTATION BAG MEMBERSHIP → TIFINAGH LETTER YADD   # 
+2130 ; 2D39 ;  SL      # ( ℰ → ⴹ ) SCRIPT CAPITAL E → TIFINAGH LETTER YADD     # →E→
+1D404 ;        2D39 ;  SL      # ( 𝐄 → ⴹ ) MATHEMATICAL BOLD CAPITAL E → TIFINAGH LETTER YADD # →E→
+1D438 ;        2D39 ;  SL      # ( 𝐸 → ⴹ ) MATHEMATICAL ITALIC CAPITAL E → TIFINAGH LETTER YADD       # →E→
+1D46C ;        2D39 ;  SL      # ( 𝑬 → ⴹ ) MATHEMATICAL BOLD ITALIC CAPITAL E → TIFINAGH LETTER YADD  # →E→
+1D4D4 ;        2D39 ;  SL      # ( 𝓔 → ⴹ ) MATHEMATICAL BOLD SCRIPT CAPITAL E → TIFINAGH LETTER YADD  # →E→
+1D508 ;        2D39 ;  SL      # ( 𝔈 → ⴹ ) MATHEMATICAL FRAKTUR CAPITAL E → TIFINAGH LETTER YADD      # →E→
+1D53C ;        2D39 ;  SL      # ( 𝔼 → ⴹ ) MATHEMATICAL DOUBLE-STRUCK CAPITAL E → TIFINAGH LETTER YADD        # →E→
+1D570 ;        2D39 ;  SL      # ( 𝕰 → ⴹ ) MATHEMATICAL BOLD FRAKTUR CAPITAL E → TIFINAGH LETTER YADD # →E→
+1D5A4 ;        2D39 ;  SL      # ( 𝖤 → ⴹ ) MATHEMATICAL SANS-SERIF CAPITAL E → TIFINAGH LETTER YADD   # →E→
+1D5D8 ;        2D39 ;  SL      # ( 𝗘 → ⴹ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL E → TIFINAGH LETTER YADD      # →E→
+1D60C ;        2D39 ;  SL      # ( 𝘌 → ⴹ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL E → TIFINAGH LETTER YADD    # →E→
+1D640 ;        2D39 ;  SL      # ( 𝙀 → ⴹ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E → TIFINAGH LETTER YADD       # →E→
+1D674 ;        2D39 ;  SL      # ( 𝙴 → ⴹ ) MATHEMATICAL MONOSPACE CAPITAL E → TIFINAGH LETTER YADD    # →E→
+1D6AC ;        2D39 ;  SL      # ( 𝚬 → ⴹ ) MATHEMATICAL BOLD CAPITAL EPSILON → TIFINAGH LETTER YADD   # →Ε→
+1D6E6 ;        2D39 ;  SL      # ( 𝛦 → ⴹ ) MATHEMATICAL ITALIC CAPITAL EPSILON → TIFINAGH LETTER YADD # →Ε→
+1D720 ;        2D39 ;  SL      # ( 𝜠 → ⴹ ) MATHEMATICAL BOLD ITALIC CAPITAL EPSILON → TIFINAGH LETTER YADD    # →Ε→
+1D75A ;        2D39 ;  SL      # ( 𝝚 → ⴹ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON → TIFINAGH LETTER YADD        # →Ε→
+1D794 ;        2D39 ;  SL      # ( 𝞔 → ⴹ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON → TIFINAGH LETTER YADD # →Ε→
+
+2203 ; 2D3A ;  SL      #* ( ∃ → ⴺ ) THERE EXISTS → TIFINAGH LETTER YADDH       # 
+
+2211 ; 2D49 ;  SL      #* ( ∑ → ⵉ ) N-ARY SUMMATION → TIFINAGH LETTER YI       # →Ʃ→
+2140 ; 2D49 ;  SL      #* ( ⅀ → ⵉ ) DOUBLE-STRUCK N-ARY SUMMATION → TIFINAGH LETTER YI # →∑→→Ʃ→
+1D6BA ;        2D49 ;  SL      # ( 𝚺 → ⵉ ) MATHEMATICAL BOLD CAPITAL SIGMA → TIFINAGH LETTER YI       # →Σ→
+1D6F4 ;        2D49 ;  SL      # ( 𝛴 → ⵉ ) MATHEMATICAL ITALIC CAPITAL SIGMA → TIFINAGH LETTER YI     # →Σ→
+1D72E ;        2D49 ;  SL      # ( 𝜮 → ⵉ ) MATHEMATICAL BOLD ITALIC CAPITAL SIGMA → TIFINAGH LETTER YI        # →Σ→
+1D768 ;        2D49 ;  SL      # ( 𝝨 → ⵉ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA → TIFINAGH LETTER YI    # →Σ→
+1D7A2 ;        2D49 ;  SL      # ( 𝞢 → ⵉ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA → TIFINAGH LETTER YI     # →Σ→
+
+1D417 ;        2D5D ;  SL      # ( 𝐗 → ⵝ ) MATHEMATICAL BOLD CAPITAL X → TIFINAGH LETTER YATH # →X→
+1D44B ;        2D5D ;  SL      # ( 𝑋 → ⵝ ) MATHEMATICAL ITALIC CAPITAL X → TIFINAGH LETTER YATH       # →X→
+1D47F ;        2D5D ;  SL      # ( 𝑿 → ⵝ ) MATHEMATICAL BOLD ITALIC CAPITAL X → TIFINAGH LETTER YATH  # →X→
+1D4B3 ;        2D5D ;  SL      # ( 𝒳 → ⵝ ) MATHEMATICAL SCRIPT CAPITAL X → TIFINAGH LETTER YATH       # →X→
+1D4E7 ;        2D5D ;  SL      # ( 𝓧 → ⵝ ) MATHEMATICAL BOLD SCRIPT CAPITAL X → TIFINAGH LETTER YATH  # →X→
+1D51B ;        2D5D ;  SL      # ( 𝔛 → ⵝ ) MATHEMATICAL FRAKTUR CAPITAL X → TIFINAGH LETTER YATH      # →X→
+1D54F ;        2D5D ;  SL      # ( 𝕏 → ⵝ ) MATHEMATICAL DOUBLE-STRUCK CAPITAL X → TIFINAGH LETTER YATH        # →X→
+1D583 ;        2D5D ;  SL      # ( 𝖃 → ⵝ ) MATHEMATICAL BOLD FRAKTUR CAPITAL X → TIFINAGH LETTER YATH # →X→
+1D5B7 ;        2D5D ;  SL      # ( 𝖷 → ⵝ ) MATHEMATICAL SANS-SERIF CAPITAL X → TIFINAGH LETTER YATH   # →X→
+1D5EB ;        2D5D ;  SL      # ( 𝗫 → ⵝ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL X → TIFINAGH LETTER YATH      # →X→
+1D61F ;        2D5D ;  SL      # ( 𝘟 → ⵝ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL X → TIFINAGH LETTER YATH    # →X→
+1D653 ;        2D5D ;  SL      # ( 𝙓 → ⵝ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X → TIFINAGH LETTER YATH       # →X→
+1D687 ;        2D5D ;  SL      # ( 𝚇 → ⵝ ) MATHEMATICAL MONOSPACE CAPITAL X → TIFINAGH LETTER YATH    # →X→
+1D6BE ;        2D5D ;  SL      # ( 𝚾 → ⵝ ) MATHEMATICAL BOLD CAPITAL CHI → TIFINAGH LETTER YATH       # →Χ→
+1D6F8 ;        2D5D ;  SL      # ( 𝛸 → ⵝ ) MATHEMATICAL ITALIC CAPITAL CHI → TIFINAGH LETTER YATH     # →Χ→
+1D732 ;        2D5D ;  SL      # ( 𝜲 → ⵝ ) MATHEMATICAL BOLD ITALIC CAPITAL CHI → TIFINAGH LETTER YATH        # →Χ→
+1D76C ;        2D5D ;  SL      # ( 𝝬 → ⵝ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI → TIFINAGH LETTER YATH    # →Χ→
+1D7A6 ;        2D5D ;  SL      # ( 𝞦 → ⵝ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI → TIFINAGH LETTER YATH     # →Χ→
+
+0906 ; 0905 093E ;     SL      # ( आ → अा ) DEVANAGARI LETTER AA → DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN AA     # 
+
+0912 ; 0905 093E 0946 ;        SL      # ( ऒ → अाॆ ) DEVANAGARI LETTER SHORT O → DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN AA, DEVANAGARI VOWEL SIGN SHORT E      # →अॊ→→आॆ→
+
+0913 ; 0905 093E 0947 ;        SL      # ( ओ → अाे ) DEVANAGARI LETTER O → DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN AA, DEVANAGARI VOWEL SIGN E  # →अो→→आे→
+
+0914 ; 0905 093E 0948 ;        SL      # ( औ → अाै ) DEVANAGARI LETTER AU → DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN AA, DEVANAGARI VOWEL SIGN AI        # →अौ→→आै→
+
+0904 ; 0905 0946 ;     SL      # ( ऄ → अॆ ) DEVANAGARI LETTER SHORT A → DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN SHORT E   # 
+
+0911 ; 0905 0949 ;     SL      # ( ऑ → अॉ ) DEVANAGARI LETTER CANDRA O → DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN CANDRA O # 
+
+090D ; 090F 0945 ;     SL      # ( ऍ → एॅ ) DEVANAGARI LETTER CANDRA E → DEVANAGARI LETTER E, DEVANAGARI VOWEL SIGN CANDRA E # 
+
+090E ; 090F 0946 ;     SL      # ( ऎ → एॆ ) DEVANAGARI LETTER SHORT E → DEVANAGARI LETTER E, DEVANAGARI VOWEL SIGN SHORT E   # 
+
+0910 ; 090F 0947 ;     SL      # ( ऐ → एे ) DEVANAGARI LETTER AI → DEVANAGARI LETTER E, DEVANAGARI VOWEL SIGN E      # 
+
+0908 ; 0930 094D 0907 ;        SL      # ( ई → र्इ ) DEVANAGARI LETTER II → DEVANAGARI LETTER RA, DEVANAGARI SIGN VIRAMA, DEVANAGARI LETTER I      # 
+
+0986 ; 0985 09BE ;     SL      # ( আ → অা ) BENGALI LETTER AA → BENGALI LETTER A, BENGALI VOWEL SIGN AA      # 
+
+09E0 ; 098B 09C3 ;     SL      # ( ৠ → ঋৃ ) BENGALI LETTER VOCALIC RR → BENGALI LETTER VOCALIC R, BENGALI VOWEL SIGN VOCALIC R       # 
+09E1 ; 098B 09C3 ;     SL      # ( ৡ → ঋৃ ) BENGALI LETTER VOCALIC LL → BENGALI LETTER VOCALIC R, BENGALI VOWEL SIGN VOCALIC R       # →ঌৢ→→ৠ→
+
+0A09 ; 0A73 0A41 ;     SL      # ( ਉ → ੳੁ ) GURMUKHI LETTER U → GURMUKHI URA, GURMUKHI VOWEL SIGN U  # 
+
+0A0A ; 0A73 0A42 ;     SL      # ( ਊ → ੳੂ ) GURMUKHI LETTER UU → GURMUKHI URA, GURMUKHI VOWEL SIGN UU        # 
+
+0A06 ; 0A05 0A3E ;     SL      # ( ਆ → ਅਾ ) GURMUKHI LETTER AA → GURMUKHI LETTER A, GURMUKHI VOWEL SIGN AA   # 
+
+0A10 ; 0A05 0A48 ;     SL      # ( ਐ → ਅੈ ) GURMUKHI LETTER AI → GURMUKHI LETTER A, GURMUKHI VOWEL SIGN AI   # 
+
+0A14 ; 0A05 0A4C ;     SL      # ( ਔ → ਅੌ ) GURMUKHI LETTER AU → GURMUKHI LETTER A, GURMUKHI VOWEL SIGN AU   # 
+
+0A07 ; 0A72 0A3F ;     SL      # ( ਇ → ੲਿ ) GURMUKHI LETTER I → GURMUKHI IRI, GURMUKHI VOWEL SIGN I  # 
+
+0A08 ; 0A72 0A40 ;     SL      # ( ਈ → ੲੀ ) GURMUKHI LETTER II → GURMUKHI IRI, GURMUKHI VOWEL SIGN II        # 
+
+0A0F ; 0A72 0A47 ;     SL      # ( ਏ → ੲੇ ) GURMUKHI LETTER EE → GURMUKHI IRI, GURMUKHI VOWEL SIGN EE        # 
+
+0A86 ; 0A85 0ABE ;     SL      # ( આ → અા ) GUJARATI LETTER AA → GUJARATI LETTER A, GUJARATI VOWEL SIGN AA   # 
+
+0A91 ; 0A85 0ABE 0AC5 ;        SL      # ( ઑ → અાૅ ) GUJARATI VOWEL CANDRA O → GUJARATI LETTER A, GUJARATI VOWEL SIGN AA, GUJARATI VOWEL SIGN CANDRA E     # →અૉ→→આૅ→
+
+0A93 ; 0A85 0ABE 0AC7 ;        SL      # ( ઓ → અાે ) GUJARATI LETTER O → GUJARATI LETTER A, GUJARATI VOWEL SIGN AA, GUJARATI VOWEL SIGN E  # →અો→→આે→
+
+0A94 ; 0A85 0ABE 0AC8 ;        SL      # ( ઔ → અાૈ ) GUJARATI LETTER AU → GUJARATI LETTER A, GUJARATI VOWEL SIGN AA, GUJARATI VOWEL SIGN AI        # →અૌ→→આૈ→
+
+0A8D ; 0A85 0AC5 ;     SL      # ( ઍ → અૅ ) GUJARATI VOWEL CANDRA E → GUJARATI LETTER A, GUJARATI VOWEL SIGN CANDRA E        # 
+
+0A8F ; 0A85 0AC7 ;     SL      # ( એ → અે ) GUJARATI LETTER E → GUJARATI LETTER A, GUJARATI VOWEL SIGN E     # 
+
+0A90 ; 0A85 0AC8 ;     SL      # ( ઐ → અૈ ) GUJARATI LETTER AI → GUJARATI LETTER A, GUJARATI VOWEL SIGN AI   # 
+
+0B06 ; 0B05 0B3E ;     SL      # ( ଆ → ଅା ) ORIYA LETTER AA → ORIYA LETTER A, ORIYA VOWEL SIGN AA    # 
+
+2102 ; 0BD0 ;  SL      # ( ℂ → ௐ ) DOUBLE-STRUCK CAPITAL C → TAMIL OM  # →C→→С→
+212D ; 0BD0 ;  SL      # ( ℭ → ௐ ) BLACK-LETTER CAPITAL C → TAMIL OM   # →C→→С→
+1D402 ;        0BD0 ;  SL      # ( 𝐂 → ௐ ) MATHEMATICAL BOLD CAPITAL C → TAMIL OM     # →C→→С→
+1D436 ;        0BD0 ;  SL      # ( 𝐶 → ௐ ) MATHEMATICAL ITALIC CAPITAL C → TAMIL OM   # →C→→С→
+1D46A ;        0BD0 ;  SL      # ( 𝑪 → ௐ ) MATHEMATICAL BOLD ITALIC CAPITAL C → TAMIL OM      # →C→→С→
+1D49E ;        0BD0 ;  SL      # ( 𝒞 → ௐ ) MATHEMATICAL SCRIPT CAPITAL C → TAMIL OM   # →C→→С→
+1D4D2 ;        0BD0 ;  SL      # ( 𝓒 → ௐ ) MATHEMATICAL BOLD SCRIPT CAPITAL C → TAMIL OM      # →C→→С→
+1D56E ;        0BD0 ;  SL      # ( 𝕮 → ௐ ) MATHEMATICAL BOLD FRAKTUR CAPITAL C → TAMIL OM     # →C→→С→
+1D5A2 ;        0BD0 ;  SL      # ( 𝖢 → ௐ ) MATHEMATICAL SANS-SERIF CAPITAL C → TAMIL OM       # →C→→С→
+1D5D6 ;        0BD0 ;  SL      # ( 𝗖 → ௐ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL C → TAMIL OM  # →C→→С→
+1D60A ;        0BD0 ;  SL      # ( 𝘊 → ௐ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL C → TAMIL OM        # →C→→С→
+1D63E ;        0BD0 ;  SL      # ( 𝘾 → ௐ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C → TAMIL OM   # →C→→С→
+1D672 ;        0BD0 ;  SL      # ( 𝙲 → ௐ ) MATHEMATICAL MONOSPACE CAPITAL C → TAMIL OM        # →C→→С→
+
+0BEE ; 0B85 ;  SL      # ( ௮ → அ ) TAMIL DIGIT EIGHT → TAMIL LETTER A  # 
+
+0BB0 ; 0B88 ;  SL      # ( ர → ஈ ) TAMIL LETTER RA → TAMIL LETTER II   # →ா→
+0BBE ; 0B88 ;  SL      # ( ா → ஈ ) TAMIL VOWEL SIGN AA → TAMIL LETTER II       # 
+
+0BEB ; 0B88 0BC1 ;     SL      # ( ௫ → ஈு ) TAMIL DIGIT FIVE → TAMIL LETTER II, TAMIL VOWEL SIGN U   # →ரு→
+
+0BE8 ; 0B89 ;  SL      # ( ௨ → உ ) TAMIL DIGIT TWO → TAMIL LETTER U    # 
+
+0B8A ; 0B89 0BB3 ;     SL      # ( ஊ → உள ) TAMIL LETTER UU → TAMIL LETTER U, TAMIL LETTER LLA       # 
+
+0BED ; 0B8E ;  SL      # ( ௭ → எ ) TAMIL DIGIT SEVEN → TAMIL LETTER E  # 
+
+0BF7 ; 0B8E 0BB5 ;     SL      #* ( ௷ → எவ ) TAMIL CREDIT SIGN → TAMIL LETTER E, TAMIL LETTER VA     # 
+
+0B9C ; 0B90 ;  SL      # ( ஜ → ஐ ) TAMIL LETTER JA → TAMIL LETTER AI   # 
+
+0BE7 ; 0B95 ;  SL      # ( ௧ → க ) TAMIL DIGIT ONE → TAMIL LETTER KA   # 
+
+0BEA ; 0B9A ;  SL      # ( ௪ → ச ) TAMIL DIGIT FOUR → TAMIL LETTER CA  # 
+
+0BEC ; 0B9A 0BC1 ;     SL      # ( ௬ → சு ) TAMIL DIGIT SIX → TAMIL LETTER CA, TAMIL VOWEL SIGN U    # 
+
+0BF2 ; 0B9A 0BC2 ;     SL      #* ( ௲ → சூ ) TAMIL NUMBER ONE THOUSAND → TAMIL LETTER CA, TAMIL VOWEL SIGN UU        # 
+
+0BFA ; 0BA8 0BC0 ;     SL      #* ( ௺ → நீ ) TAMIL NUMBER SIGN → TAMIL LETTER NA, TAMIL VOWEL SIGN II        # 
+
+0BF4 ; 0BAE 0BC0 ;     SL      #* ( ௴ → மீ ) TAMIL MONTH SIGN → TAMIL LETTER MA, TAMIL VOWEL SIGN II # 
+
+0BF0 ; 0BAF ;  SL      #* ( ௰ → ய ) TAMIL NUMBER TEN → TAMIL LETTER YA # 
+
+0BD7 ; 0BB3 ;  SL      # ( ௗ → ள ) TAMIL AU LENGTH MARK → TAMIL LETTER LLA     # 
+
+0BC8 ; 0BA9 ;  SL      # ( ை → ன ) TAMIL VOWEL SIGN AI → TAMIL LETTER NNNA     # 
+
+0BF8 ; 0BB7 ;  SL      #* ( ௸ → ஷ ) TAMIL AS ABOVE SIGN → TAMIL LETTER SSA     # 
+
+0BCA ; 0BC6 0B88 ;     SL      # ( ொ → ெஈ ) TAMIL VOWEL SIGN O → TAMIL VOWEL SIGN E, TAMIL LETTER II # →ெர→
+
+0BCC ; 0BC6 0BB3 ;     SL      # ( ௌ → ெள ) TAMIL VOWEL SIGN AU → TAMIL VOWEL SIGN E, TAMIL LETTER LLA       # 
+
+0BCB ; 0BC7 0B88 ;     SL      # ( ோ → ேஈ ) TAMIL VOWEL SIGN OO → TAMIL VOWEL SIGN EE, TAMIL LETTER II       # →ேர→
+
+0C60 ; 0C0B 0C3E ;     SL      # ( ౠ → ఋా ) TELUGU LETTER VOCALIC RR → TELUGU LETTER VOCALIC R, TELUGU VOWEL SIGN AA # 
+
+0C61 ; 0C0C 0C3E ;     SL      # ( ౡ → ఌా ) TELUGU LETTER VOCALIC LL → TELUGU LETTER VOCALIC L, TELUGU VOWEL SIGN AA # 
+
+0C14 ; 0C12 0C4C ;     SL      # ( ఔ → ఒౌ ) TELUGU LETTER AU → TELUGU LETTER O, TELUGU VOWEL SIGN AU # 
+
+0C13 ; 0C12 0C55 ;     SL      # ( ఓ → ఒౕ ) TELUGU LETTER OO → TELUGU LETTER O, TELUGU LENGTH MARK   # 
+
+0C22 ; 0C21 0323 ;     SL      # ( ఢ → డ̣ ) TELUGU LETTER DDHA → TELUGU LETTER DDA, COMBINING DOT BELOW       # 
+
+0C2D ; 0C2C 0323 ;     SL      # ( భ → బ̣ ) TELUGU LETTER BHA → TELUGU LETTER BA, COMBINING DOT BELOW # 
+
+0C37 ; 0C35 0323 ;     SL      # ( ష → వ̣ ) TELUGU LETTER SSA → TELUGU LETTER VA, COMBINING DOT BELOW # 
+
+0C39 ; 0C35 0C3E ;     SL      # ( హ → వా ) TELUGU LETTER HA → TELUGU LETTER VA, TELUGU VOWEL SIGN AA        # 
+
+0C2E ; 0C35 0C41 ;     SL      # ( మ → వు ) TELUGU LETTER MA → TELUGU LETTER VA, TELUGU VOWEL SIGN U # 
+
+0C42 ; 0C41 0C3E ;     SL      # ( ూ → ుా ) TELUGU VOWEL SIGN UU → TELUGU VOWEL SIGN U, TELUGU VOWEL SIGN AA # 
+
+0C44 ; 0C43 0C3E ;     SL      # ( ౄ → ృా ) TELUGU VOWEL SIGN VOCALIC RR → TELUGU VOWEL SIGN VOCALIC R, TELUGU VOWEL SIGN AA # 
+
+0CE1 ; 0C8C 0CBE ;     SL      # ( ೡ → ಌಾ ) KANNADA LETTER VOCALIC LL → KANNADA LETTER VOCALIC L, KANNADA VOWEL SIGN AA      # 
+
+0C94 ; 0C92 0CCC ;     SL      # ( ಔ → ಒೌ ) KANNADA LETTER AU → KANNADA LETTER O, KANNADA VOWEL SIGN AU      # 
+
+0D08 ; 0D07 0D57 ;     SL      # ( ഈ → ഇൗ ) MALAYALAM LETTER II → MALAYALAM LETTER I, MALAYALAM AU LENGTH MARK       # 
+
+0D0A ; 0D09 0D57 ;     SL      # ( ഊ → ഉൗ ) MALAYALAM LETTER UU → MALAYALAM LETTER U, MALAYALAM AU LENGTH MARK       # 
+
+0D10 ; 0D0E 0D46 ;     SL      # ( ഐ → എെ ) MALAYALAM LETTER AI → MALAYALAM LETTER E, MALAYALAM VOWEL SIGN E # 
+
+0D13 ; 0D12 0D3E ;     SL      # ( ഓ → ഒാ ) MALAYALAM LETTER OO → MALAYALAM LETTER O, MALAYALAM VOWEL SIGN AA        # 
+
+0D14 ; 0D12 0D57 ;     SL      # ( ഔ → ഒൗ ) MALAYALAM LETTER AU → MALAYALAM LETTER O, MALAYALAM AU LENGTH MARK       # 
+
+0D61 ; 0D1E ;  SL      # ( ൡ → ഞ ) MALAYALAM LETTER VOCALIC LL → MALAYALAM LETTER NYA  # 
+
+0D6B ; 0D26 0D4D 0D30 ;        SL      # ( ൫ → ദ്ര ) MALAYALAM DIGIT FIVE → MALAYALAM LETTER DA, MALAYALAM SIGN VIRAMA, MALAYALAM LETTER RA        # 
+
+0D0C ; 0D28 0D41 ;     SL      # ( ഌ → നു ) MALAYALAM LETTER VOCALIC L → MALAYALAM LETTER NA, MALAYALAM VOWEL SIGN U # 
+0D19 ; 0D28 0D41 ;     SL      # ( ങ → നു ) MALAYALAM LETTER NGA → MALAYALAM LETTER NA, MALAYALAM VOWEL SIGN U       # →ഌ→
+
+0D6F ; 0D28 0D4D ;     SL      # ( ൯ → ന് ) MALAYALAM DIGIT NINE → MALAYALAM LETTER NA, MALAYALAM SIGN VIRAMA        # 
+
+0D31 ; 0D30 ;  SL      # ( റ → ര ) MALAYALAM LETTER RRA → MALAYALAM LETTER RA  # 
+
+0D6A ; 0D30 0D4D ;     SL      # ( ൪ → ര് ) MALAYALAM DIGIT FOUR → MALAYALAM LETTER RA, MALAYALAM SIGN VIRAMA        # 
+
+0D6E ; 0D35 0D4D ;     SL      # ( ൮ → വ് ) MALAYALAM DIGIT EIGHT → MALAYALAM LETTER VA, MALAYALAM SIGN VIRAMA       # 
+
+0D40 ; 0D3F ;  SL      # ( ീ → ി ) MALAYALAM VOWEL SIGN II → MALAYALAM VOWEL SIGN I    # 
+
+0D42 ; 0D41 ;  SL      # ( ൂ → ു ) MALAYALAM VOWEL SIGN UU → MALAYALAM VOWEL SIGN U    # 
+0D43 ; 0D41 ;  SL      # ( ൃ → ു ) MALAYALAM VOWEL SIGN VOCALIC R → MALAYALAM VOWEL SIGN U     # →ൂ→
+
+0D48 ; 0D46 0D46 ;     SL      # ( ൈ → െെ ) MALAYALAM VOWEL SIGN AI → MALAYALAM VOWEL SIGN E, MALAYALAM VOWEL SIGN E # 
+
+0E03 ; 0E02 ;  SL      # ( ฃ → ข ) THAI CHARACTER KHO KHUAT → THAI CHARACTER KHO KHAI  # 
+
+0E14 ; 0E04 ;  SL      # ( ด → ค ) THAI CHARACTER DO DEK → THAI CHARACTER KHO KHWAI    # 
+0E15 ; 0E04 ;  SL      # ( ต → ค ) THAI CHARACTER TO TAO → THAI CHARACTER KHO KHWAI    # →ด→
+
+0E21 ; 0E06 ;  SL      # ( ม → ฆ ) THAI CHARACTER MO MA → THAI CHARACTER KHO RAKHANG   # 
+
+0E0B ; 0E0A ;  SL      # ( ซ → ช ) THAI CHARACTER SO SO → THAI CHARACTER CHO CHANG     # 
+
+0E0F ; 0E0E ;  SL      # ( ฏ → ฎ ) THAI CHARACTER TO PATAK → THAI CHARACTER DO CHADA   # 
+
+0E17 ; 0E11 ;  SL      # ( ท → ฑ ) THAI CHARACTER THO THAHAN → THAI CHARACTER THO NANGMONTHO   # 
+
+0E26 ; 0E20 ;  SL      # ( ฦ → ภ ) THAI CHARACTER LU → THAI CHARACTER PHO SAMPHAO      # 
+
+0E45 ; 0E32 ;  SL      # ( ๅ → า ) THAI CHARACTER LAKKHANGYAO → THAI CHARACTER SARA AA # 
+
+0E33 ; 030A 0E32 ;     SL      # ( ำ → ̊า ) THAI CHARACTER SARA AM → COMBINING RING ABOVE, THAI CHARACTER SARA AA     # →ํา→
+
+0E41 ; 0E40 0E40 ;     SL      # ( แ → เเ ) THAI CHARACTER SARA AE → THAI CHARACTER SARA E, THAI CHARACTER SARA E    # 
+
+0EDC ; 0EAB 0E99 ;     SL      # ( ໜ → ຫນ ) LAO HO NO → LAO LETTER HO SUNG, LAO LETTER NO    # 
+
+0EDD ; 0EAB 0EA1 ;     SL      # ( ໝ → ຫມ ) LAO HO MO → LAO LETTER HO SUNG, LAO LETTER MO    # 
+
+0EB3 ; 030A 0EB2 ;     SL      # ( ຳ → ̊າ ) LAO VOWEL SIGN AM → COMBINING RING ABOVE, LAO VOWEL SIGN AA       # →ໍາ→
+
+0F6A ; 0F62 ;  SL      # ( ཪ → ར ) TIBETAN LETTER FIXED-FORM RA → TIBETAN LETTER RA    # 
+
+0F77 ; 0FB2 0F71 0F80 ;        SL      # ( ཷ → ྲཱྀ ) TIBETAN VOWEL SIGN VOCALIC RR → TIBETAN SUBJOINED LETTER RA, TIBETAN VOWEL SIGN AA, TIBETAN VOWEL SIGN REVERSED I     # 
+
+0F79 ; 0FB3 0F71 0F80 ;        SL      # ( ཹ → ླཱྀ ) TIBETAN VOWEL SIGN VOCALIC LL → TIBETAN SUBJOINED LETTER LA, TIBETAN VOWEL SIGN AA, TIBETAN VOWEL SIGN REVERSED I     # 
+
+17A3 ; 17A2 ;  SL      # ( ឣ → អ ) KHMER INDEPENDENT VOWEL QAQ → KHMER LETTER QA       # 
+
+19D0 ; 199E ;  SL      # ( ᧐ → ᦞ ) NEW TAI LUE DIGIT ZERO → NEW TAI LUE LETTER LOW VA  # 
+
+19D1 ; 19B1 ;  SL      # ( ᧑ → ᦱ ) NEW TAI LUE DIGIT ONE → NEW TAI LUE VOWEL SIGN AA   # 
+
+1A80 ; 1A45 ;  SL      # ( ᪀ → ᩅ ) TAI THAM HORA DIGIT ZERO → TAI THAM LETTER WA       # 
+1A90 ; 1A45 ;  SL      # ( ᪐ → ᩅ ) TAI THAM THAM DIGIT ZERO → TAI THAM LETTER WA       # 
+
+AA53 ; AA01 ;  SL      # ( ꩓ → ꨁ ) CHAM DIGIT THREE → CHAM LETTER I    # 
+
+AA56 ; AA23 ;  SL      # ( ꩖ → ꨣ ) CHAM DIGIT SIX → CHAM LETTER RA     # 
+
+1B52 ; 1B0D ;  SL      # ( ᭒ → ᬍ ) BALINESE DIGIT TWO → BALINESE LETTER LA LENGA       # 
+
+1B53 ; 1B11 ;  SL      # ( ᭓ → ᬑ ) BALINESE DIGIT THREE → BALINESE LETTER OKARA        # 
+
+1B58 ; 1B28 ;  SL      # ( ᭘ → ᬨ ) BALINESE DIGIT EIGHT → BALINESE LETTER PA KAPAL     # 
+
+1896 ; 185C ;  SL      # ( ᢖ → ᡜ ) MONGOLIAN LETTER ALI GALI ZA → MONGOLIAN LETTER TODO DZA    # 
+
+1855 ; 1835 ;  SL      # ( ᡕ → ᠵ ) MONGOLIAN LETTER TODO YA → MONGOLIAN LETTER JA      # 
+
+13D2 ; 13A1 ;  SL      # ( Ꮢ → Ꭱ ) CHEROKEE LETTER SV → CHEROKEE LETTER E      # 
+
+27D9 ; 13A2 ;  SL      #* ( ⟙ → Ꭲ ) LARGE DOWN TACK → CHEROKEE LETTER I        # →T→
+1D413 ;        13A2 ;  SL      # ( 𝐓 → Ꭲ ) MATHEMATICAL BOLD CAPITAL T → CHEROKEE LETTER I    # →T→
+1D447 ;        13A2 ;  SL      # ( 𝑇 → Ꭲ ) MATHEMATICAL ITALIC CAPITAL T → CHEROKEE LETTER I  # →T→
+1D47B ;        13A2 ;  SL      # ( 𝑻 → Ꭲ ) MATHEMATICAL BOLD ITALIC CAPITAL T → CHEROKEE LETTER I     # →T→
+1D4AF ;        13A2 ;  SL      # ( 𝒯 → Ꭲ ) MATHEMATICAL SCRIPT CAPITAL T → CHEROKEE LETTER I  # →T→
+1D4E3 ;        13A2 ;  SL      # ( 𝓣 → Ꭲ ) MATHEMATICAL BOLD SCRIPT CAPITAL T → CHEROKEE LETTER I     # →T→
+1D517 ;        13A2 ;  SL      # ( 𝔗 → Ꭲ ) MATHEMATICAL FRAKTUR CAPITAL T → CHEROKEE LETTER I # →T→
+1D54B ;        13A2 ;  SL      # ( 𝕋 → Ꭲ ) MATHEMATICAL DOUBLE-STRUCK CAPITAL T → CHEROKEE LETTER I   # →T→
+1D57F ;        13A2 ;  SL      # ( 𝕿 → Ꭲ ) MATHEMATICAL BOLD FRAKTUR CAPITAL T → CHEROKEE LETTER I    # →T→
+1D5B3 ;        13A2 ;  SL      # ( 𝖳 → Ꭲ ) MATHEMATICAL SANS-SERIF CAPITAL T → CHEROKEE LETTER I      # →T→
+1D5E7 ;        13A2 ;  SL      # ( 𝗧 → Ꭲ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL T → CHEROKEE LETTER I # →T→
+1D61B ;        13A2 ;  SL      # ( 𝘛 → Ꭲ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL T → CHEROKEE LETTER I       # →T→
+1D64F ;        13A2 ;  SL      # ( 𝙏 → Ꭲ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T → CHEROKEE LETTER I  # →T→
+1D683 ;        13A2 ;  SL      # ( 𝚃 → Ꭲ ) MATHEMATICAL MONOSPACE CAPITAL T → CHEROKEE LETTER I       # →T→
+1D6BB ;        13A2 ;  SL      # ( 𝚻 → Ꭲ ) MATHEMATICAL BOLD CAPITAL TAU → CHEROKEE LETTER I  # →Τ→
+1D6F5 ;        13A2 ;  SL      # ( 𝛵 → Ꭲ ) MATHEMATICAL ITALIC CAPITAL TAU → CHEROKEE LETTER I        # →Τ→
+1D72F ;        13A2 ;  SL      # ( 𝜯 → Ꭲ ) MATHEMATICAL BOLD ITALIC CAPITAL TAU → CHEROKEE LETTER I   # →Τ→
+1D769 ;        13A2 ;  SL      # ( 𝝩 → Ꭲ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU → CHEROKEE LETTER I       # →Τ→
+1D7A3 ;        13A2 ;  SL      # ( 𝞣 → Ꭲ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU → CHEROKEE LETTER I        # →Τ→
+
+1D418 ;        13A9 ;  SL      # ( 𝐘 → Ꭹ ) MATHEMATICAL BOLD CAPITAL Y → CHEROKEE LETTER GI   # →Y→
+1D44C ;        13A9 ;  SL      # ( 𝑌 → Ꭹ ) MATHEMATICAL ITALIC CAPITAL Y → CHEROKEE LETTER GI # →Y→
+1D480 ;        13A9 ;  SL      # ( 𝒀 → Ꭹ ) MATHEMATICAL BOLD ITALIC CAPITAL Y → CHEROKEE LETTER GI    # →Y→
+1D4B4 ;        13A9 ;  SL      # ( 𝒴 → Ꭹ ) MATHEMATICAL SCRIPT CAPITAL Y → CHEROKEE LETTER GI # →Y→
+1D4E8 ;        13A9 ;  SL      # ( 𝓨 → Ꭹ ) MATHEMATICAL BOLD SCRIPT CAPITAL Y → CHEROKEE LETTER GI    # →Y→
+1D51C ;        13A9 ;  SL      # ( 𝔜 → Ꭹ ) MATHEMATICAL FRAKTUR CAPITAL Y → CHEROKEE LETTER GI        # →Y→
+1D550 ;        13A9 ;  SL      # ( 𝕐 → Ꭹ ) MATHEMATICAL DOUBLE-STRUCK CAPITAL Y → CHEROKEE LETTER GI  # →Y→
+1D584 ;        13A9 ;  SL      # ( 𝖄 → Ꭹ ) MATHEMATICAL BOLD FRAKTUR CAPITAL Y → CHEROKEE LETTER GI   # →Y→
+1D5B8 ;        13A9 ;  SL      # ( 𝖸 → Ꭹ ) MATHEMATICAL SANS-SERIF CAPITAL Y → CHEROKEE LETTER GI     # →Y→
+1D5EC ;        13A9 ;  SL      # ( 𝗬 → Ꭹ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL Y → CHEROKEE LETTER GI        # →Y→
+1D620 ;        13A9 ;  SL      # ( 𝘠 → Ꭹ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y → CHEROKEE LETTER GI      # →Y→
+1D654 ;        13A9 ;  SL      # ( 𝙔 → Ꭹ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y → CHEROKEE LETTER GI # →Y→
+1D688 ;        13A9 ;  SL      # ( 𝚈 → Ꭹ ) MATHEMATICAL MONOSPACE CAPITAL Y → CHEROKEE LETTER GI      # →Y→
+1D6BC ;        13A9 ;  SL      # ( 𝚼 → Ꭹ ) MATHEMATICAL BOLD CAPITAL UPSILON → CHEROKEE LETTER GI     # →Υ→→Y→
+1D6F6 ;        13A9 ;  SL      # ( 𝛶 → Ꭹ ) MATHEMATICAL ITALIC CAPITAL UPSILON → CHEROKEE LETTER GI   # →Υ→→Y→
+1D730 ;        13A9 ;  SL      # ( 𝜰 → Ꭹ ) MATHEMATICAL BOLD ITALIC CAPITAL UPSILON → CHEROKEE LETTER GI      # →Υ→→Y→
+1D76A ;        13A9 ;  SL      # ( 𝝪 → Ꭹ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON → CHEROKEE LETTER GI  # →Υ→→Y→
+1D7A4 ;        13A9 ;  SL      # ( 𝞤 → Ꭹ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON → CHEROKEE LETTER GI   # →Υ→→Y→
+13BD ; 13A9 ;  SL      # ( Ꮍ → Ꭹ ) CHEROKEE LETTER MU → CHEROKEE LETTER GI     # 
+
+13E7 ; 13AB ;  SL      # ( Ꮷ → Ꭻ ) CHEROKEE LETTER TSU → CHEROKEE LETTER GU    # →J→
+
+1D416 ;        13B3 ;  SL      # ( 𝐖 → Ꮃ ) MATHEMATICAL BOLD CAPITAL W → CHEROKEE LETTER LA   # →W→
+1D44A ;        13B3 ;  SL      # ( 𝑊 → Ꮃ ) MATHEMATICAL ITALIC CAPITAL W → CHEROKEE LETTER LA # →W→
+1D47E ;        13B3 ;  SL      # ( 𝑾 → Ꮃ ) MATHEMATICAL BOLD ITALIC CAPITAL W → CHEROKEE LETTER LA    # →W→
+1D4B2 ;        13B3 ;  SL      # ( 𝒲 → Ꮃ ) MATHEMATICAL SCRIPT CAPITAL W → CHEROKEE LETTER LA # →W→
+1D4E6 ;        13B3 ;  SL      # ( 𝓦 → Ꮃ ) MATHEMATICAL BOLD SCRIPT CAPITAL W → CHEROKEE LETTER LA    # →W→
+1D51A ;        13B3 ;  SL      # ( 𝔚 → Ꮃ ) MATHEMATICAL FRAKTUR CAPITAL W → CHEROKEE LETTER LA        # →W→
+1D54E ;        13B3 ;  SL      # ( 𝕎 → Ꮃ ) MATHEMATICAL DOUBLE-STRUCK CAPITAL W → CHEROKEE LETTER LA  # →W→
+1D582 ;        13B3 ;  SL      # ( 𝖂 → Ꮃ ) MATHEMATICAL BOLD FRAKTUR CAPITAL W → CHEROKEE LETTER LA   # →W→
+1D5B6 ;        13B3 ;  SL      # ( 𝖶 → Ꮃ ) MATHEMATICAL SANS-SERIF CAPITAL W → CHEROKEE LETTER LA     # →W→
+1D5EA ;        13B3 ;  SL      # ( 𝗪 → Ꮃ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL W → CHEROKEE LETTER LA        # →W→
+1D61E ;        13B3 ;  SL      # ( 𝘞 → Ꮃ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL W → CHEROKEE LETTER LA      # →W→
+1D652 ;        13B3 ;  SL      # ( 𝙒 → Ꮃ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W → CHEROKEE LETTER LA # →W→
+1D686 ;        13B3 ;  SL      # ( 𝚆 → Ꮃ ) MATHEMATICAL MONOSPACE CAPITAL W → CHEROKEE LETTER LA      # →W→
+13D4 ; 13B3 ;  SL      # ( Ꮤ → Ꮃ ) CHEROKEE LETTER TA → CHEROKEE LETTER LA     # 
+
+1D406 ;        13C0 ;  SL      # ( 𝐆 → Ꮐ ) MATHEMATICAL BOLD CAPITAL G → CHEROKEE LETTER NAH  # →G→
+1D43A ;        13C0 ;  SL      # ( 𝐺 → Ꮐ ) MATHEMATICAL ITALIC CAPITAL G → CHEROKEE LETTER NAH        # →G→
+1D46E ;        13C0 ;  SL      # ( 𝑮 → Ꮐ ) MATHEMATICAL BOLD ITALIC CAPITAL G → CHEROKEE LETTER NAH   # →G→
+1D4A2 ;        13C0 ;  SL      # ( 𝒢 → Ꮐ ) MATHEMATICAL SCRIPT CAPITAL G → CHEROKEE LETTER NAH        # →G→
+1D4D6 ;        13C0 ;  SL      # ( 𝓖 → Ꮐ ) MATHEMATICAL BOLD SCRIPT CAPITAL G → CHEROKEE LETTER NAH   # →G→
+1D50A ;        13C0 ;  SL      # ( 𝔊 → Ꮐ ) MATHEMATICAL FRAKTUR CAPITAL G → CHEROKEE LETTER NAH       # →G→
+1D53E ;        13C0 ;  SL      # ( 𝔾 → Ꮐ ) MATHEMATICAL DOUBLE-STRUCK CAPITAL G → CHEROKEE LETTER NAH # →G→
+1D572 ;        13C0 ;  SL      # ( 𝕲 → Ꮐ ) MATHEMATICAL BOLD FRAKTUR CAPITAL G → CHEROKEE LETTER NAH  # →G→
+1D5A6 ;        13C0 ;  SL      # ( 𝖦 → Ꮐ ) MATHEMATICAL SANS-SERIF CAPITAL G → CHEROKEE LETTER NAH    # →G→
+1D5DA ;        13C0 ;  SL      # ( 𝗚 → Ꮐ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL G → CHEROKEE LETTER NAH       # →G→
+1D60E ;        13C0 ;  SL      # ( 𝘎 → Ꮐ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL G → CHEROKEE LETTER NAH     # →G→
+1D642 ;        13C0 ;  SL      # ( 𝙂 → Ꮐ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G → CHEROKEE LETTER NAH        # →G→
+1D676 ;        13C0 ;  SL      # ( 𝙶 → Ꮐ ) MATHEMATICAL MONOSPACE CAPITAL G → CHEROKEE LETTER NAH     # →G→
+13F3 ; 13C0 ;  SL      # ( Ᏻ → Ꮐ ) CHEROKEE LETTER YU → CHEROKEE LETTER NAH    # 
+
+2124 ; 13C3 ;  SL      # ( ℤ → Ꮓ ) DOUBLE-STRUCK CAPITAL Z → CHEROKEE LETTER NO        # →Z→
+2128 ; 13C3 ;  SL      # ( ℨ → Ꮓ ) BLACK-LETTER CAPITAL Z → CHEROKEE LETTER NO # →Z→
+1D419 ;        13C3 ;  SL      # ( 𝐙 → Ꮓ ) MATHEMATICAL BOLD CAPITAL Z → CHEROKEE LETTER NO   # →Z→
+1D44D ;        13C3 ;  SL      # ( 𝑍 → Ꮓ ) MATHEMATICAL ITALIC CAPITAL Z → CHEROKEE LETTER NO # →Z→
+1D481 ;        13C3 ;  SL      # ( 𝒁 → Ꮓ ) MATHEMATICAL BOLD ITALIC CAPITAL Z → CHEROKEE LETTER NO    # →Z→
+1D4B5 ;        13C3 ;  SL      # ( 𝒵 → Ꮓ ) MATHEMATICAL SCRIPT CAPITAL Z → CHEROKEE LETTER NO # →Z→
+1D4E9 ;        13C3 ;  SL      # ( 𝓩 → Ꮓ ) MATHEMATICAL BOLD SCRIPT CAPITAL Z → CHEROKEE LETTER NO    # →Z→
+1D585 ;        13C3 ;  SL      # ( 𝖅 → Ꮓ ) MATHEMATICAL BOLD FRAKTUR CAPITAL Z → CHEROKEE LETTER NO   # →Z→
+1D5B9 ;        13C3 ;  SL      # ( 𝖹 → Ꮓ ) MATHEMATICAL SANS-SERIF CAPITAL Z → CHEROKEE LETTER NO     # →Z→
+1D5ED ;        13C3 ;  SL      # ( 𝗭 → Ꮓ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL Z → CHEROKEE LETTER NO        # →Z→
+1D621 ;        13C3 ;  SL      # ( 𝘡 → Ꮓ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z → CHEROKEE LETTER NO      # →Z→
+1D655 ;        13C3 ;  SL      # ( 𝙕 → Ꮓ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z → CHEROKEE LETTER NO # →Z→
+1D689 ;        13C3 ;  SL      # ( 𝚉 → Ꮓ ) MATHEMATICAL MONOSPACE CAPITAL Z → CHEROKEE LETTER NO      # →Z→
+1D6AD ;        13C3 ;  SL      # ( 𝚭 → Ꮓ ) MATHEMATICAL BOLD CAPITAL ZETA → CHEROKEE LETTER NO        # →Ζ→
+1D6E7 ;        13C3 ;  SL      # ( 𝛧 → Ꮓ ) MATHEMATICAL ITALIC CAPITAL ZETA → CHEROKEE LETTER NO      # →Ζ→
+1D721 ;        13C3 ;  SL      # ( 𝜡 → Ꮓ ) MATHEMATICAL BOLD ITALIC CAPITAL ZETA → CHEROKEE LETTER NO # →Ζ→
+1D75B ;        13C3 ;  SL      # ( 𝝛 → Ꮓ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA → CHEROKEE LETTER NO     # →Ζ→
+1D795 ;        13C3 ;  SL      # ( 𝞕 → Ꮓ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA → CHEROKEE LETTER NO      # →Ζ→
+
+1D412 ;        13D5 ;  SL      # ( 𝐒 → Ꮥ ) MATHEMATICAL BOLD CAPITAL S → CHEROKEE LETTER DE   # →S→→Ꮪ→
+1D446 ;        13D5 ;  SL      # ( 𝑆 → Ꮥ ) MATHEMATICAL ITALIC CAPITAL S → CHEROKEE LETTER DE # →S→→Ꮪ→
+1D47A ;        13D5 ;  SL      # ( 𝑺 → Ꮥ ) MATHEMATICAL BOLD ITALIC CAPITAL S → CHEROKEE LETTER DE    # →S→→Ꮪ→
+1D4AE ;        13D5 ;  SL      # ( 𝒮 → Ꮥ ) MATHEMATICAL SCRIPT CAPITAL S → CHEROKEE LETTER DE # →S→→Ꮪ→
+1D4E2 ;        13D5 ;  SL      # ( 𝓢 → Ꮥ ) MATHEMATICAL BOLD SCRIPT CAPITAL S → CHEROKEE LETTER DE    # →S→→Ꮪ→
+1D516 ;        13D5 ;  SL      # ( 𝔖 → Ꮥ ) MATHEMATICAL FRAKTUR CAPITAL S → CHEROKEE LETTER DE        # →S→→Ꮪ→
+1D54A ;        13D5 ;  SL      # ( 𝕊 → Ꮥ ) MATHEMATICAL DOUBLE-STRUCK CAPITAL S → CHEROKEE LETTER DE  # →S→→Ꮪ→
+1D57E ;        13D5 ;  SL      # ( 𝕾 → Ꮥ ) MATHEMATICAL BOLD FRAKTUR CAPITAL S → CHEROKEE LETTER DE   # →S→→Ꮪ→
+1D5B2 ;        13D5 ;  SL      # ( 𝖲 → Ꮥ ) MATHEMATICAL SANS-SERIF CAPITAL S → CHEROKEE LETTER DE     # →S→→Ꮪ→
+1D5E6 ;        13D5 ;  SL      # ( 𝗦 → Ꮥ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL S → CHEROKEE LETTER DE        # →S→→Ꮪ→
+1D61A ;        13D5 ;  SL      # ( 𝘚 → Ꮥ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL S → CHEROKEE LETTER DE      # →S→→Ꮪ→
+1D64E ;        13D5 ;  SL      # ( 𝙎 → Ꮥ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S → CHEROKEE LETTER DE # →S→→Ꮪ→
+1D682 ;        13D5 ;  SL      # ( 𝚂 → Ꮥ ) MATHEMATICAL MONOSPACE CAPITAL S → CHEROKEE LETTER DE      # →S→→Ꮪ→
+13DA ; 13D5 ;  SL      # ( Ꮪ → Ꮥ ) CHEROKEE LETTER DU → CHEROKEE LETTER DE     # 
+
+1D40A ;        13E6 ;  SL      # ( 𝐊 → Ꮶ ) MATHEMATICAL BOLD CAPITAL K → CHEROKEE LETTER TSO  # →K→
+1D43E ;        13E6 ;  SL      # ( 𝐾 → Ꮶ ) MATHEMATICAL ITALIC CAPITAL K → CHEROKEE LETTER TSO        # →K→
+1D472 ;        13E6 ;  SL      # ( 𝑲 → Ꮶ ) MATHEMATICAL BOLD ITALIC CAPITAL K → CHEROKEE LETTER TSO   # →K→
+1D4A6 ;        13E6 ;  SL      # ( 𝒦 → Ꮶ ) MATHEMATICAL SCRIPT CAPITAL K → CHEROKEE LETTER TSO        # →K→
+1D4DA ;        13E6 ;  SL      # ( 𝓚 → Ꮶ ) MATHEMATICAL BOLD SCRIPT CAPITAL K → CHEROKEE LETTER TSO   # →K→
+1D50E ;        13E6 ;  SL      # ( 𝔎 → Ꮶ ) MATHEMATICAL FRAKTUR CAPITAL K → CHEROKEE LETTER TSO       # →K→
+1D542 ;        13E6 ;  SL      # ( 𝕂 → Ꮶ ) MATHEMATICAL DOUBLE-STRUCK CAPITAL K → CHEROKEE LETTER TSO # →K→
+1D576 ;        13E6 ;  SL      # ( 𝕶 → Ꮶ ) MATHEMATICAL BOLD FRAKTUR CAPITAL K → CHEROKEE LETTER TSO  # →K→
+1D5AA ;        13E6 ;  SL      # ( 𝖪 → Ꮶ ) MATHEMATICAL SANS-SERIF CAPITAL K → CHEROKEE LETTER TSO    # →K→
+1D5DE ;        13E6 ;  SL      # ( 𝗞 → Ꮶ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL K → CHEROKEE LETTER TSO       # →K→
+1D612 ;        13E6 ;  SL      # ( 𝘒 → Ꮶ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL K → CHEROKEE LETTER TSO     # →K→
+1D646 ;        13E6 ;  SL      # ( 𝙆 → Ꮶ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K → CHEROKEE LETTER TSO        # →K→
+1D67A ;        13E6 ;  SL      # ( 𝙺 → Ꮶ ) MATHEMATICAL MONOSPACE CAPITAL K → CHEROKEE LETTER TSO     # →K→
+1D6B1 ;        13E6 ;  SL      # ( 𝚱 → Ꮶ ) MATHEMATICAL BOLD CAPITAL KAPPA → CHEROKEE LETTER TSO      # →Κ→→K→
+1D6EB ;        13E6 ;  SL      # ( 𝛫 → Ꮶ ) MATHEMATICAL ITALIC CAPITAL KAPPA → CHEROKEE LETTER TSO    # →Κ→→K→
+1D725 ;        13E6 ;  SL      # ( 𝜥 → Ꮶ ) MATHEMATICAL BOLD ITALIC CAPITAL KAPPA → CHEROKEE LETTER TSO       # →Κ→→K→
+1D75F ;        13E6 ;  SL      # ( 𝝟 → Ꮶ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA → CHEROKEE LETTER TSO   # →Κ→→K→
+1D799 ;        13E6 ;  SL      # ( 𝞙 → Ꮶ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA → CHEROKEE LETTER TSO    # →Κ→→K→
+
+140D ; 1401 00B7 ;     SL      # ( ᐍ → ᐁ· ) CANADIAN SYLLABICS WEST-CREE WE → CANADIAN SYLLABICS E, MIDDLE DOT        # →ᐁᐧ→
+
+2206 ; 1403 ;  SL      #* ( ∆ → ᐃ ) INCREMENT → CANADIAN SYLLABICS I   # →Δ→
+1D6AB ;        1403 ;  SL      # ( 𝚫 → ᐃ ) MATHEMATICAL BOLD CAPITAL DELTA → CANADIAN SYLLABICS I     # →Δ→
+1D6E5 ;        1403 ;  SL      # ( 𝛥 → ᐃ ) MATHEMATICAL ITALIC CAPITAL DELTA → CANADIAN SYLLABICS I   # →Δ→
+1D71F ;        1403 ;  SL      # ( 𝜟 → ᐃ ) MATHEMATICAL BOLD ITALIC CAPITAL DELTA → CANADIAN SYLLABICS I      # →Δ→
+1D759 ;        1403 ;  SL      # ( 𝝙 → ᐃ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA → CANADIAN SYLLABICS I  # →Δ→
+1D793 ;        1403 ;  SL      # ( 𝞓 → ᐃ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA → CANADIAN SYLLABICS I   # →Δ→
+
+140F ; 1403 00B7 ;     SL      # ( ᐏ → ᐃ· ) CANADIAN SYLLABICS WEST-CREE WI → CANADIAN SYLLABICS I, MIDDLE DOT        # →ᐃᐧ→
+
+1411 ; 1404 00B7 ;     SL      # ( ᐑ → ᐄ· ) CANADIAN SYLLABICS WEST-CREE WII → CANADIAN SYLLABICS II, MIDDLE DOT      # →ᐄᐧ→
+
+1413 ; 1405 00B7 ;     SL      # ( ᐓ → ᐅ· ) CANADIAN SYLLABICS WEST-CREE WO → CANADIAN SYLLABICS O, MIDDLE DOT        # →ᐅᐧ→
+
+1415 ; 1406 00B7 ;     SL      # ( ᐕ → ᐆ· ) CANADIAN SYLLABICS WEST-CREE WOO → CANADIAN SYLLABICS OO, MIDDLE DOT      # →ᐆᐧ→
+
+1418 ; 140A 00B7 ;     SL      # ( ᐘ → ᐊ· ) CANADIAN SYLLABICS WEST-CREE WA → CANADIAN SYLLABICS A, MIDDLE DOT        # →ᐊᐧ→
+
+141A ; 140B 00B7 ;     SL      # ( ᐚ → ᐋ· ) CANADIAN SYLLABICS WEST-CREE WAA → CANADIAN SYLLABICS AA, MIDDLE DOT      # →ᐋᐧ→
+
+14D1 ; 1421 ;  SL      # ( ᓑ → ᐡ ) CANADIAN SYLLABICS CARRIER NG → CANADIAN SYLLABICS FINAL BOTTOM HALF RING   # 
+
+1476 ; 1427 146D ;     SL      # ( ᑶ → ᐧᑭ ) CANADIAN SYLLABICS KWI → CANADIAN SYLLABICS FINAL MIDDLE DOT, CANADIAN SYLLABICS KI      # 
+
+147A ; 1427 146F ;     SL      # ( ᑺ → ᐧᑯ ) CANADIAN SYLLABICS KWO → CANADIAN SYLLABICS FINAL MIDDLE DOT, CANADIAN SYLLABICS KO      # 
+
+1498 ; 1427 148D ;     SL      # ( ᒘ → ᐧᒍ ) CANADIAN SYLLABICS CWO → CANADIAN SYLLABICS FINAL MIDDLE DOT, CANADIAN SYLLABICS CO      # 
+
+1540 ; 1429 ;  SL      # ( ᕀ → ᐩ ) CANADIAN SYLLABICS WEST-CREE Y → CANADIAN SYLLABICS FINAL PLUS      # 
+
+1D415 ;        142F ;  SL      # ( 𝐕 → ᐯ ) MATHEMATICAL BOLD CAPITAL V → CANADIAN SYLLABICS PE        # →V→
+1D449 ;        142F ;  SL      # ( 𝑉 → ᐯ ) MATHEMATICAL ITALIC CAPITAL V → CANADIAN SYLLABICS PE      # →V→
+1D47D ;        142F ;  SL      # ( 𝑽 → ᐯ ) MATHEMATICAL BOLD ITALIC CAPITAL V → CANADIAN SYLLABICS PE # →V→
+1D4B1 ;        142F ;  SL      # ( 𝒱 → ᐯ ) MATHEMATICAL SCRIPT CAPITAL V → CANADIAN SYLLABICS PE      # →V→
+1D4E5 ;        142F ;  SL      # ( 𝓥 → ᐯ ) MATHEMATICAL BOLD SCRIPT CAPITAL V → CANADIAN SYLLABICS PE # →V→
+1D519 ;        142F ;  SL      # ( 𝔙 → ᐯ ) MATHEMATICAL FRAKTUR CAPITAL V → CANADIAN SYLLABICS PE     # →V→
+1D54D ;        142F ;  SL      # ( 𝕍 → ᐯ ) MATHEMATICAL DOUBLE-STRUCK CAPITAL V → CANADIAN SYLLABICS PE       # →V→
+1D581 ;        142F ;  SL      # ( 𝖁 → ᐯ ) MATHEMATICAL BOLD FRAKTUR CAPITAL V → CANADIAN SYLLABICS PE        # →V→
+1D5B5 ;        142F ;  SL      # ( 𝖵 → ᐯ ) MATHEMATICAL SANS-SERIF CAPITAL V → CANADIAN SYLLABICS PE  # →V→
+1D5E9 ;        142F ;  SL      # ( 𝗩 → ᐯ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL V → CANADIAN SYLLABICS PE     # →V→
+1D61D ;        142F ;  SL      # ( 𝘝 → ᐯ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL V → CANADIAN SYLLABICS PE   # →V→
+1D651 ;        142F ;  SL      # ( 𝙑 → ᐯ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V → CANADIAN SYLLABICS PE      # →V→
+1D685 ;        142F ;  SL      # ( 𝚅 → ᐯ ) MATHEMATICAL MONOSPACE CAPITAL V → CANADIAN SYLLABICS PE   # →V→
+
+1D6B2 ;        1431 ;  SL      # ( 𝚲 → ᐱ ) MATHEMATICAL BOLD CAPITAL LAMDA → CANADIAN SYLLABICS PI    # →Λ→
+1D6EC ;        1431 ;  SL      # ( 𝛬 → ᐱ ) MATHEMATICAL ITALIC CAPITAL LAMDA → CANADIAN SYLLABICS PI  # →Λ→
+1D726 ;        1431 ;  SL      # ( 𝜦 → ᐱ ) MATHEMATICAL BOLD ITALIC CAPITAL LAMDA → CANADIAN SYLLABICS PI     # →Λ→
+1D760 ;        1431 ;  SL      # ( 𝝠 → ᐱ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA → CANADIAN SYLLABICS PI # →Λ→
+1D79A ;        1431 ;  SL      # ( 𝞚 → ᐱ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA → CANADIAN SYLLABICS PI  # →Λ→
+
+1441 ; 1433 00B7 ;     SL      # ( ᑁ → ᐳ· ) CANADIAN SYLLABICS WEST-CREE PWO → CANADIAN SYLLABICS PO, MIDDLE DOT      # →ᐳᐧ→
+
+1443 ; 1434 00B7 ;     SL      # ( ᑃ → ᐴ· ) CANADIAN SYLLABICS WEST-CREE PWOO → CANADIAN SYLLABICS POO, MIDDLE DOT    # →ᐴᐧ→
+
+1445 ; 1438 00B7 ;     SL      # ( ᑅ → ᐸ· ) CANADIAN SYLLABICS WEST-CREE PWA → CANADIAN SYLLABICS PA, MIDDLE DOT      # →ᐸᐧ→
+
+1447 ; 1439 00B7 ;     SL      # ( ᑇ → ᐹ· ) CANADIAN SYLLABICS WEST-CREE PWAA → CANADIAN SYLLABICS PAA, MIDDLE DOT    # →ᐹᐧ→
+
+02C8 ; 144A ;  SL      # ( ˈ → ᑊ ) MODIFIER LETTER VERTICAL LINE → CANADIAN SYLLABICS WEST-CREE P       # 
+
+1D414 ;        144C ;  SL      # ( 𝐔 → ᑌ ) MATHEMATICAL BOLD CAPITAL U → CANADIAN SYLLABICS TE        # →U→
+1D448 ;        144C ;  SL      # ( 𝑈 → ᑌ ) MATHEMATICAL ITALIC CAPITAL U → CANADIAN SYLLABICS TE      # →U→
+1D47C ;        144C ;  SL      # ( 𝑼 → ᑌ ) MATHEMATICAL BOLD ITALIC CAPITAL U → CANADIAN SYLLABICS TE # →U→
+1D4B0 ;        144C ;  SL      # ( 𝒰 → ᑌ ) MATHEMATICAL SCRIPT CAPITAL U → CANADIAN SYLLABICS TE      # →U→
+1D4E4 ;        144C ;  SL      # ( 𝓤 → ᑌ ) MATHEMATICAL BOLD SCRIPT CAPITAL U → CANADIAN SYLLABICS TE # →U→
+1D518 ;        144C ;  SL      # ( 𝔘 → ᑌ ) MATHEMATICAL FRAKTUR CAPITAL U → CANADIAN SYLLABICS TE     # →U→
+1D54C ;        144C ;  SL      # ( 𝕌 → ᑌ ) MATHEMATICAL DOUBLE-STRUCK CAPITAL U → CANADIAN SYLLABICS TE       # →U→
+1D580 ;        144C ;  SL      # ( 𝖀 → ᑌ ) MATHEMATICAL BOLD FRAKTUR CAPITAL U → CANADIAN SYLLABICS TE        # →U→
+1D5B4 ;        144C ;  SL      # ( 𝖴 → ᑌ ) MATHEMATICAL SANS-SERIF CAPITAL U → CANADIAN SYLLABICS TE  # →U→
+1D5E8 ;        144C ;  SL      # ( 𝗨 → ᑌ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL U → CANADIAN SYLLABICS TE     # →U→
+1D61C ;        144C ;  SL      # ( 𝘜 → ᑌ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL U → CANADIAN SYLLABICS TE   # →U→
+1D650 ;        144C ;  SL      # ( 𝙐 → ᑌ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U → CANADIAN SYLLABICS TE      # →U→
+1D684 ;        144C ;  SL      # ( 𝚄 → ᑌ ) MATHEMATICAL MONOSPACE CAPITAL U → CANADIAN SYLLABICS TE   # →U→
+
+1458 ; 144C 00B7 ;     SL      # ( ᑘ → ᑌ· ) CANADIAN SYLLABICS WEST-CREE TWE → CANADIAN SYLLABICS TE, MIDDLE DOT      # →ᑌᐧ→
+
+1467 ; 144C 144A ;     SL      # ( ᑧ → ᑌᑊ ) CANADIAN SYLLABICS TTE → CANADIAN SYLLABICS TE, CANADIAN SYLLABICS WEST-CREE P   # 
+
+145A ; 144E 00B7 ;     SL      # ( ᑚ → ᑎ· ) CANADIAN SYLLABICS WEST-CREE TWI → CANADIAN SYLLABICS TI, MIDDLE DOT      # →ᑎᐧ→
+
+1468 ; 144E 144A ;     SL      # ( ᑨ → ᑎᑊ ) CANADIAN SYLLABICS TTI → CANADIAN SYLLABICS TI, CANADIAN SYLLABICS WEST-CREE P   # 
+
+145C ; 144F 00B7 ;     SL      # ( ᑜ → ᑏ· ) CANADIAN SYLLABICS WEST-CREE TWII → CANADIAN SYLLABICS TII, MIDDLE DOT    # →ᑏᐧ→
+
+145E ; 1450 00B7 ;     SL      # ( ᑞ → ᑐ· ) CANADIAN SYLLABICS WEST-CREE TWO → CANADIAN SYLLABICS TO, MIDDLE DOT      # →ᑐᐧ→
+
+1469 ; 1450 144A ;     SL      # ( ᑩ → ᑐᑊ ) CANADIAN SYLLABICS TTO → CANADIAN SYLLABICS TO, CANADIAN SYLLABICS WEST-CREE P   # 
+
+1460 ; 1451 00B7 ;     SL      # ( ᑠ → ᑑ· ) CANADIAN SYLLABICS WEST-CREE TWOO → CANADIAN SYLLABICS TOO, MIDDLE DOT    # →ᑑᐧ→
+
+1462 ; 1455 00B7 ;     SL      # ( ᑢ → ᑕ· ) CANADIAN SYLLABICS WEST-CREE TWA → CANADIAN SYLLABICS TA, MIDDLE DOT      # →ᑕᐧ→
+
+146A ; 1455 144A ;     SL      # ( ᑪ → ᑕᑊ ) CANADIAN SYLLABICS TTA → CANADIAN SYLLABICS TA, CANADIAN SYLLABICS WEST-CREE P   # 
+
+1464 ; 1456 00B7 ;     SL      # ( ᑤ → ᑖ· ) CANADIAN SYLLABICS WEST-CREE TWAA → CANADIAN SYLLABICS TAA, MIDDLE DOT    # →ᑖᐧ→
+
+1475 ; 146B 00B7 ;     SL      # ( ᑵ → ᑫ· ) CANADIAN SYLLABICS WEST-CREE KWE → CANADIAN SYLLABICS KE, MIDDLE DOT      # →ᑫᐧ→
+
+1485 ; 146B 144A ;     SL      # ( ᒅ → ᑫᑊ ) CANADIAN SYLLABICS SOUTH-SLAVEY KEH → CANADIAN SYLLABICS KE, CANADIAN SYLLABICS WEST-CREE P      # 
+
+2119 ; 146D ;  SL      # ( ℙ → ᑭ ) DOUBLE-STRUCK CAPITAL P → CANADIAN SYLLABICS KI     # →P→
+1D40F ;        146D ;  SL      # ( 𝐏 → ᑭ ) MATHEMATICAL BOLD CAPITAL P → CANADIAN SYLLABICS KI        # →P→
+1D443 ;        146D ;  SL      # ( 𝑃 → ᑭ ) MATHEMATICAL ITALIC CAPITAL P → CANADIAN SYLLABICS KI      # →P→
+1D477 ;        146D ;  SL      # ( 𝑷 → ᑭ ) MATHEMATICAL BOLD ITALIC CAPITAL P → CANADIAN SYLLABICS KI # →P→
+1D4AB ;        146D ;  SL      # ( 𝒫 → ᑭ ) MATHEMATICAL SCRIPT CAPITAL P → CANADIAN SYLLABICS KI      # →P→
+1D4DF ;        146D ;  SL      # ( 𝓟 → ᑭ ) MATHEMATICAL BOLD SCRIPT CAPITAL P → CANADIAN SYLLABICS KI # →P→
+1D513 ;        146D ;  SL      # ( 𝔓 → ᑭ ) MATHEMATICAL FRAKTUR CAPITAL P → CANADIAN SYLLABICS KI     # →P→
+1D57B ;        146D ;  SL      # ( 𝕻 → ᑭ ) MATHEMATICAL BOLD FRAKTUR CAPITAL P → CANADIAN SYLLABICS KI        # →P→
+1D5AF ;        146D ;  SL      # ( 𝖯 → ᑭ ) MATHEMATICAL SANS-SERIF CAPITAL P → CANADIAN SYLLABICS KI  # →P→
+1D5E3 ;        146D ;  SL      # ( 𝗣 → ᑭ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL P → CANADIAN SYLLABICS KI     # →P→
+1D617 ;        146D ;  SL      # ( 𝘗 → ᑭ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL P → CANADIAN SYLLABICS KI   # →P→
+1D64B ;        146D ;  SL      # ( 𝙋 → ᑭ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P → CANADIAN SYLLABICS KI      # →P→
+1D67F ;        146D ;  SL      # ( 𝙿 → ᑭ ) MATHEMATICAL MONOSPACE CAPITAL P → CANADIAN SYLLABICS KI   # →P→
+1D6B8 ;        146D ;  SL      # ( 𝚸 → ᑭ ) MATHEMATICAL BOLD CAPITAL RHO → CANADIAN SYLLABICS KI      # →𝐏→→P→
+1D6F2 ;        146D ;  SL      # ( 𝛲 → ᑭ ) MATHEMATICAL ITALIC CAPITAL RHO → CANADIAN SYLLABICS KI    # →𝑃→→P→
+1D72C ;        146D ;  SL      # ( 𝜬 → ᑭ ) MATHEMATICAL BOLD ITALIC CAPITAL RHO → CANADIAN SYLLABICS KI       # →𝑷→→P→
+1D766 ;        146D ;  SL      # ( 𝝦 → ᑭ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO → CANADIAN SYLLABICS KI   # →Ρ→→P→
+1D7A0 ;        146D ;  SL      # ( 𝞠 → ᑭ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO → CANADIAN SYLLABICS KI    # →Ρ→→P→
+
+1477 ; 146D 1427 ;     SL      # ( ᑷ → ᑭᐧ ) CANADIAN SYLLABICS WEST-CREE KWI → CANADIAN SYLLABICS KI, CANADIAN SYLLABICS FINAL MIDDLE DOT    # 
+
+1486 ; 146D 144A ;     SL      # ( ᒆ → ᑭᑊ ) CANADIAN SYLLABICS SOUTH-SLAVEY KIH → CANADIAN SYLLABICS KI, CANADIAN SYLLABICS WEST-CREE P      # 
+
+1479 ; 146E 00B7 ;     SL      # ( ᑹ → ᑮ· ) CANADIAN SYLLABICS WEST-CREE KWII → CANADIAN SYLLABICS KII, MIDDLE DOT    # →ᑮᐧ→
+
+147B ; 146F 1427 ;     SL      # ( ᑻ → ᑯᐧ ) CANADIAN SYLLABICS WEST-CREE KWO → CANADIAN SYLLABICS KO, CANADIAN SYLLABICS FINAL MIDDLE DOT    # 
+
+1487 ; 146F 144A ;     SL      # ( ᒇ → ᑯᑊ ) CANADIAN SYLLABICS SOUTH-SLAVEY KOH → CANADIAN SYLLABICS KO, CANADIAN SYLLABICS WEST-CREE P      # 
+
+147D ; 1470 00B7 ;     SL      # ( ᑽ → ᑰ· ) CANADIAN SYLLABICS WEST-CREE KWOO → CANADIAN SYLLABICS KOO, MIDDLE DOT    # →ᑰᐧ→
+
+147F ; 1472 00B7 ;     SL      # ( ᑿ → ᑲ· ) CANADIAN SYLLABICS WEST-CREE KWA → CANADIAN SYLLABICS KA, MIDDLE DOT      # →ᑲᐧ→
+
+1488 ; 1472 144A ;     SL      # ( ᒈ → ᑲᑊ ) CANADIAN SYLLABICS SOUTH-SLAVEY KAH → CANADIAN SYLLABICS KA, CANADIAN SYLLABICS WEST-CREE P      # 
+
+1481 ; 1473 00B7 ;     SL      # ( ᒁ → ᑳ· ) CANADIAN SYLLABICS WEST-CREE KWAA → CANADIAN SYLLABICS KAA, MIDDLE DOT    # →ᑳᐧ→
+
+1603 ; 1489 ;  SL      # ( ᘃ → ᒉ ) CANADIAN SYLLABICS CARRIER NO → CANADIAN SYLLABICS CE       # 
+
+1493 ; 1489 00B7 ;     SL      # ( ᒓ → ᒉ· ) CANADIAN SYLLABICS WEST-CREE CWE → CANADIAN SYLLABICS CE, MIDDLE DOT      # →ᒉᐧ→
+
+1495 ; 148B 00B7 ;     SL      # ( ᒕ → ᒋ· ) CANADIAN SYLLABICS WEST-CREE CWI → CANADIAN SYLLABICS CI, MIDDLE DOT      # →ᒋᐧ→
+
+1497 ; 148C 00B7 ;     SL      # ( ᒗ → ᒌ· ) CANADIAN SYLLABICS WEST-CREE CWII → CANADIAN SYLLABICS CII, MIDDLE DOT    # →ᒌᐧ→
+
+1D409 ;        148D ;  SL      # ( 𝐉 → ᒍ ) MATHEMATICAL BOLD CAPITAL J → CANADIAN SYLLABICS CO        # →J→
+1D43D ;        148D ;  SL      # ( 𝐽 → ᒍ ) MATHEMATICAL ITALIC CAPITAL J → CANADIAN SYLLABICS CO      # →J→
+1D471 ;        148D ;  SL      # ( 𝑱 → ᒍ ) MATHEMATICAL BOLD ITALIC CAPITAL J → CANADIAN SYLLABICS CO # →J→
+1D4A5 ;        148D ;  SL      # ( 𝒥 → ᒍ ) MATHEMATICAL SCRIPT CAPITAL J → CANADIAN SYLLABICS CO      # →J→
+1D4D9 ;        148D ;  SL      # ( 𝓙 → ᒍ ) MATHEMATICAL BOLD SCRIPT CAPITAL J → CANADIAN SYLLABICS CO # →J→
+1D50D ;        148D ;  SL      # ( 𝔍 → ᒍ ) MATHEMATICAL FRAKTUR CAPITAL J → CANADIAN SYLLABICS CO     # →J→
+1D541 ;        148D ;  SL      # ( 𝕁 → ᒍ ) MATHEMATICAL DOUBLE-STRUCK CAPITAL J → CANADIAN SYLLABICS CO       # →J→
+1D575 ;        148D ;  SL      # ( 𝕵 → ᒍ ) MATHEMATICAL BOLD FRAKTUR CAPITAL J → CANADIAN SYLLABICS CO        # →J→
+1D5A9 ;        148D ;  SL      # ( 𝖩 → ᒍ ) MATHEMATICAL SANS-SERIF CAPITAL J → CANADIAN SYLLABICS CO  # →J→
+1D5DD ;        148D ;  SL      # ( 𝗝 → ᒍ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL J → CANADIAN SYLLABICS CO     # →J→
+1D611 ;        148D ;  SL      # ( 𝘑 → ᒍ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL J → CANADIAN SYLLABICS CO   # →J→
+1D645 ;        148D ;  SL      # ( 𝙅 → ᒍ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J → CANADIAN SYLLABICS CO      # →J→
+1D679 ;        148D ;  SL      # ( 𝙹 → ᒍ ) MATHEMATICAL MONOSPACE CAPITAL J → CANADIAN SYLLABICS CO   # →J→
+
+1499 ; 148D 1427 ;     SL      # ( ᒙ → ᒍᐧ ) CANADIAN SYLLABICS WEST-CREE CWO → CANADIAN SYLLABICS CO, CANADIAN SYLLABICS FINAL MIDDLE DOT    # 
+
+149B ; 148E 00B7 ;     SL      # ( ᒛ → ᒎ· ) CANADIAN SYLLABICS WEST-CREE CWOO → CANADIAN SYLLABICS COO, MIDDLE DOT    # →ᒎᐧ→
+
+1602 ; 1490 ;  SL      # ( ᘂ → ᒐ ) CANADIAN SYLLABICS CARRIER NU → CANADIAN SYLLABICS CA       # 
+
+149D ; 1490 00B7 ;     SL      # ( ᒝ → ᒐ· ) CANADIAN SYLLABICS WEST-CREE CWA → CANADIAN SYLLABICS CA, MIDDLE DOT      # →ᒐᐧ→
+
+149F ; 1491 00B7 ;     SL      # ( ᒟ → ᒑ· ) CANADIAN SYLLABICS WEST-CREE CWAA → CANADIAN SYLLABICS CAA, MIDDLE DOT    # →ᒑᐧ→
+
+14AD ; 14A3 00B7 ;     SL      # ( ᒭ → ᒣ· ) CANADIAN SYLLABICS WEST-CREE MWE → CANADIAN SYLLABICS ME, MIDDLE DOT      # →ᒣᐧ→
+
+213E ; 14A5 ;  SL      # ( ℾ → ᒥ ) DOUBLE-STRUCK CAPITAL GAMMA → CANADIAN SYLLABICS MI # →Γ→
+1D6AA ;        14A5 ;  SL      # ( 𝚪 → ᒥ ) MATHEMATICAL BOLD CAPITAL GAMMA → CANADIAN SYLLABICS MI    # →Γ→
+1D6E4 ;        14A5 ;  SL      # ( 𝛤 → ᒥ ) MATHEMATICAL ITALIC CAPITAL GAMMA → CANADIAN SYLLABICS MI  # →Γ→
+1D71E ;        14A5 ;  SL      # ( 𝜞 → ᒥ ) MATHEMATICAL BOLD ITALIC CAPITAL GAMMA → CANADIAN SYLLABICS MI     # →Γ→
+1D758 ;        14A5 ;  SL      # ( 𝝘 → ᒥ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA → CANADIAN SYLLABICS MI # →Γ→
+1D792 ;        14A5 ;  SL      # ( 𝞒 → ᒥ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA → CANADIAN SYLLABICS MI  # →Γ→
+
+14AF ; 14A5 00B7 ;     SL      # ( ᒯ → ᒥ· ) CANADIAN SYLLABICS WEST-CREE MWI → CANADIAN SYLLABICS MI, MIDDLE DOT      # →ᒥᐧ→
+
+14B1 ; 14A6 00B7 ;     SL      # ( ᒱ → ᒦ· ) CANADIAN SYLLABICS WEST-CREE MWII → CANADIAN SYLLABICS MII, MIDDLE DOT    # →ᒦᐧ→
+
+14B3 ; 14A7 00B7 ;     SL      # ( ᒳ → ᒧ· ) CANADIAN SYLLABICS WEST-CREE MWO → CANADIAN SYLLABICS MO, MIDDLE DOT      # →ᒧᐧ→
+
+14B5 ; 14A8 00B7 ;     SL      # ( ᒵ → ᒨ· ) CANADIAN SYLLABICS WEST-CREE MWOO → CANADIAN SYLLABICS MOO, MIDDLE DOT    # →ᒨᐧ→
+
+2112 ; 14AA ;  SL      # ( ℒ → ᒪ ) SCRIPT CAPITAL L → CANADIAN SYLLABICS MA    # →L→
+1D40B ;        14AA ;  SL      # ( 𝐋 → ᒪ ) MATHEMATICAL BOLD CAPITAL L → CANADIAN SYLLABICS MA        # →L→
+1D43F ;        14AA ;  SL      # ( 𝐿 → ᒪ ) MATHEMATICAL ITALIC CAPITAL L → CANADIAN SYLLABICS MA      # →L→
+1D473 ;        14AA ;  SL      # ( 𝑳 → ᒪ ) MATHEMATICAL BOLD ITALIC CAPITAL L → CANADIAN SYLLABICS MA # →L→
+1D4DB ;        14AA ;  SL      # ( 𝓛 → ᒪ ) MATHEMATICAL BOLD SCRIPT CAPITAL L → CANADIAN SYLLABICS MA # →L→
+1D50F ;        14AA ;  SL      # ( 𝔏 → ᒪ ) MATHEMATICAL FRAKTUR CAPITAL L → CANADIAN SYLLABICS MA     # →L→
+1D543 ;        14AA ;  SL      # ( 𝕃 → ᒪ ) MATHEMATICAL DOUBLE-STRUCK CAPITAL L → CANADIAN SYLLABICS MA       # →L→
+1D577 ;        14AA ;  SL      # ( 𝕷 → ᒪ ) MATHEMATICAL BOLD FRAKTUR CAPITAL L → CANADIAN SYLLABICS MA        # →L→
+1D5AB ;        14AA ;  SL      # ( 𝖫 → ᒪ ) MATHEMATICAL SANS-SERIF CAPITAL L → CANADIAN SYLLABICS MA  # →L→
+1D5DF ;        14AA ;  SL      # ( 𝗟 → ᒪ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL L → CANADIAN SYLLABICS MA     # →L→
+1D613 ;        14AA ;  SL      # ( 𝘓 → ᒪ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL L → CANADIAN SYLLABICS MA   # →L→
+1D647 ;        14AA ;  SL      # ( 𝙇 → ᒪ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L → CANADIAN SYLLABICS MA      # →L→
+1D67B ;        14AA ;  SL      # ( 𝙻 → ᒪ ) MATHEMATICAL MONOSPACE CAPITAL L → CANADIAN SYLLABICS MA   # →L→
+
+14B9 ; 14AB 00B7 ;     SL      # ( ᒹ → ᒫ· ) CANADIAN SYLLABICS WEST-CREE MWAA → CANADIAN SYLLABICS MAA, MIDDLE DOT    # →ᒫᐧ→
+
+14CA ; 14C0 00B7 ;     SL      # ( ᓊ → ᓀ· ) CANADIAN SYLLABICS WEST-CREE NWE → CANADIAN SYLLABICS NE, MIDDLE DOT      # →ᓀᐧ→
+
+14CC ; 14C7 00B7 ;     SL      # ( ᓌ → ᓇ· ) CANADIAN SYLLABICS WEST-CREE NWA → CANADIAN SYLLABICS NA, MIDDLE DOT      # →ᓇᐧ→
+
+14CE ; 14C8 14AB ;     SL      # ( ᓎ → ᓈᒫ ) CANADIAN SYLLABICS WEST-CREE NWAA → CANADIAN SYLLABICS NAA, CANADIAN SYLLABICS MAA       # 
+
+1604 ; 14D3 ;  SL      # ( ᘄ → ᓓ ) CANADIAN SYLLABICS CARRIER NE → CANADIAN SYLLABICS LE       # 
+
+14DD ; 14D3 00B7 ;     SL      # ( ᓝ → ᓓ· ) CANADIAN SYLLABICS WEST-CREE LWE → CANADIAN SYLLABICS LE, MIDDLE DOT      # →ᓓᐧ→
+
+14DF ; 14D5 00B7 ;     SL      # ( ᓟ → ᓕ· ) CANADIAN SYLLABICS WEST-CREE LWI → CANADIAN SYLLABICS LI, MIDDLE DOT      # →ᓕᐧ→
+
+14E1 ; 14D6 00B7 ;     SL      # ( ᓡ → ᓖ· ) CANADIAN SYLLABICS WEST-CREE LWII → CANADIAN SYLLABICS LII, MIDDLE DOT    # →ᓖᐧ→
+
+14E3 ; 14D7 00B7 ;     SL      # ( ᓣ → ᓗ· ) CANADIAN SYLLABICS WEST-CREE LWO → CANADIAN SYLLABICS LO, MIDDLE DOT      # →ᓗᐧ→
+
+14E5 ; 14D8 00B7 ;     SL      # ( ᓥ → ᓘ· ) CANADIAN SYLLABICS WEST-CREE LWOO → CANADIAN SYLLABICS LOO, MIDDLE DOT    # →ᓘᐧ→
+
+1607 ; 14DA ;  SL      # ( ᘇ → ᓚ ) CANADIAN SYLLABICS CARRIER NA → CANADIAN SYLLABICS LA       # 
+
+14E7 ; 14DA 00B7 ;     SL      # ( ᓧ → ᓚ· ) CANADIAN SYLLABICS WEST-CREE LWA → CANADIAN SYLLABICS LA, MIDDLE DOT      # →ᓚᐧ→
+
+14E9 ; 14DB 00B7 ;     SL      # ( ᓩ → ᓛ· ) CANADIAN SYLLABICS WEST-CREE LWAA → CANADIAN SYLLABICS LAA, MIDDLE DOT    # →ᓛᐧ→
+
+14F7 ; 14ED 00B7 ;     SL      # ( ᓷ → ᓭ· ) CANADIAN SYLLABICS WEST-CREE SWE → CANADIAN SYLLABICS SE, MIDDLE DOT      # →ᓭᐧ→
+
+14F9 ; 14EF 00B7 ;     SL      # ( ᓹ → ᓯ· ) CANADIAN SYLLABICS WEST-CREE SWI → CANADIAN SYLLABICS SI, MIDDLE DOT      # →ᓯᐧ→
+
+14FB ; 14F0 00B7 ;     SL      # ( ᓻ → ᓰ· ) CANADIAN SYLLABICS WEST-CREE SWII → CANADIAN SYLLABICS SII, MIDDLE DOT    # →ᓰᐧ→
+
+14FD ; 14F1 00B7 ;     SL      # ( ᓽ → ᓱ· ) CANADIAN SYLLABICS WEST-CREE SWO → CANADIAN SYLLABICS SO, MIDDLE DOT      # →ᓱᐧ→
+
+14FF ; 14F2 00B7 ;     SL      # ( ᓿ → ᓲ· ) CANADIAN SYLLABICS WEST-CREE SWOO → CANADIAN SYLLABICS SOO, MIDDLE DOT    # →ᓲᐧ→
+
+1501 ; 14F4 00B7 ;     SL      # ( ᔁ → ᓴ· ) CANADIAN SYLLABICS WEST-CREE SWA → CANADIAN SYLLABICS SA, MIDDLE DOT      # →ᓴᐧ→
+
+1503 ; 14F5 00B7 ;     SL      # ( ᔃ → ᓵ· ) CANADIAN SYLLABICS WEST-CREE SWAA → CANADIAN SYLLABICS SAA, MIDDLE DOT    # →ᓵᐧ→
+
+150C ; 150B 1438 ;     SL      # ( ᔌ → ᔋᐸ ) CANADIAN SYLLABICS NASKAPI SPWA → CANADIAN SYLLABICS NASKAPI S-W, CANADIAN SYLLABICS PA  # 
+
+150D ; 150B 1455 ;     SL      # ( ᔍ → ᔋᑕ ) CANADIAN SYLLABICS NASKAPI STWA → CANADIAN SYLLABICS NASKAPI S-W, CANADIAN SYLLABICS TA  # 
+
+150E ; 150B 1472 ;     SL      # ( ᔎ → ᔋᑲ ) CANADIAN SYLLABICS NASKAPI SKWA → CANADIAN SYLLABICS NASKAPI S-W, CANADIAN SYLLABICS KA  # 
+
+150F ; 150B 1490 ;     SL      # ( ᔏ → ᔋᒐ ) CANADIAN SYLLABICS NASKAPI SCWA → CANADIAN SYLLABICS NASKAPI S-W, CANADIAN SYLLABICS CA  # 
+
+1518 ; 1510 00B7 ;     SL      # ( ᔘ → ᔐ· ) CANADIAN SYLLABICS WEST-CREE SHWE → CANADIAN SYLLABICS SHE, MIDDLE DOT    # →ᔐᐧ→
+
+151A ; 1511 00B7 ;     SL      # ( ᔚ → ᔑ· ) CANADIAN SYLLABICS WEST-CREE SHWI → CANADIAN SYLLABICS SHI, MIDDLE DOT    # →ᔑᐧ→
+
+151C ; 1512 00B7 ;     SL      # ( ᔜ → ᔒ· ) CANADIAN SYLLABICS WEST-CREE SHWII → CANADIAN SYLLABICS SHII, MIDDLE DOT  # →ᔒᐧ→
+
+151E ; 1513 00B7 ;     SL      # ( ᔞ → ᔓ· ) CANADIAN SYLLABICS WEST-CREE SHWO → CANADIAN SYLLABICS SHO, MIDDLE DOT    # →ᔓᐧ→
+
+1520 ; 1514 00B7 ;     SL      # ( ᔠ → ᔔ· ) CANADIAN SYLLABICS WEST-CREE SHWOO → CANADIAN SYLLABICS SHOO, MIDDLE DOT  # →ᔔᐧ→
+
+1522 ; 1515 00B7 ;     SL      # ( ᔢ → ᔕ· ) CANADIAN SYLLABICS WEST-CREE SHWA → CANADIAN SYLLABICS SHA, MIDDLE DOT    # →ᔕᐧ→
+
+1524 ; 1516 00B7 ;     SL      # ( ᔤ → ᔖ· ) CANADIAN SYLLABICS WEST-CREE SHWAA → CANADIAN SYLLABICS SHAA, MIDDLE DOT  # →ᔖᐧ→
+
+1532 ; 1528 00B7 ;     SL      # ( ᔲ → ᔨ· ) CANADIAN SYLLABICS WEST-CREE YWI → CANADIAN SYLLABICS YI, MIDDLE DOT      # →ᔨᐧ→
+
+1534 ; 1529 00B7 ;     SL      # ( ᔴ → ᔩ· ) CANADIAN SYLLABICS WEST-CREE YWII → CANADIAN SYLLABICS YII, MIDDLE DOT    # →ᔩᐧ→
+
+1536 ; 152A 00B7 ;     SL      # ( ᔶ → ᔪ· ) CANADIAN SYLLABICS WEST-CREE YWO → CANADIAN SYLLABICS YO, MIDDLE DOT      # →ᔪᐧ→
+
+1538 ; 152B 00B7 ;     SL      # ( ᔸ → ᔫ· ) CANADIAN SYLLABICS WEST-CREE YWOO → CANADIAN SYLLABICS YOO, MIDDLE DOT    # →ᔫᐧ→
+
+153A ; 152D 00B7 ;     SL      # ( ᔺ → ᔭ· ) CANADIAN SYLLABICS WEST-CREE YWA → CANADIAN SYLLABICS YA, MIDDLE DOT      # →ᔭᐧ→
+
+153C ; 152E 00B7 ;     SL      # ( ᔼ → ᔮ· ) CANADIAN SYLLABICS WEST-CREE YWAA → CANADIAN SYLLABICS YAA, MIDDLE DOT    # →ᔮᐧ→
+
+166E ; 1541 ;  SL      #* ( ᙮ → ᕁ ) CANADIAN SYLLABICS FULL STOP → CANADIAN SYLLABICS SAYISI YI        # 
+157D ; 1541 ;  SL      # ( ᕽ → ᕁ ) CANADIAN SYLLABICS HK → CANADIAN SYLLABICS SAYISI YI        # 
+
+1622 ; 1543 ;  SL      # ( ᘢ → ᕃ ) CANADIAN SYLLABICS CARRIER LU → CANADIAN SYLLABICS R-CREE RE        # 
+
+1623 ; 1546 ;  SL      # ( ᘣ → ᕆ ) CANADIAN SYLLABICS CARRIER LO → CANADIAN SYLLABICS RI       # 
+
+1624 ; 154A ;  SL      # ( ᘤ → ᕊ ) CANADIAN SYLLABICS CARRIER LE → CANADIAN SYLLABICS WEST-CREE LO     # 
+
+154F ; 154C 00B7 ;     SL      # ( ᕏ → ᕌ· ) CANADIAN SYLLABICS WEST-CREE RWAA → CANADIAN SYLLABICS RAA, MIDDLE DOT    # →ᕌᐧ→
+
+166F ; 1550 146B ;     SL      # ( ᙯ → ᕐᑫ ) CANADIAN SYLLABICS QAI → CANADIAN SYLLABICS R, CANADIAN SYLLABICS KE     # 
+
+157E ; 1550 146C ;     SL      # ( ᕾ → ᕐᑬ ) CANADIAN SYLLABICS QAAI → CANADIAN SYLLABICS R, CANADIAN SYLLABICS KAAI  # 
+
+157F ; 1550 146D ;     SL      # ( ᕿ → ᕐᑭ ) CANADIAN SYLLABICS QI → CANADIAN SYLLABICS R, CANADIAN SYLLABICS KI      # 
+
+1580 ; 1550 146E ;     SL      # ( ᖀ → ᕐᑮ ) CANADIAN SYLLABICS QII → CANADIAN SYLLABICS R, CANADIAN SYLLABICS KII    # 
+
+1581 ; 1550 146F ;     SL      # ( ᖁ → ᕐᑯ ) CANADIAN SYLLABICS QO → CANADIAN SYLLABICS R, CANADIAN SYLLABICS KO      # 
+
+1582 ; 1550 1470 ;     SL      # ( ᖂ → ᕐᑰ ) CANADIAN SYLLABICS QOO → CANADIAN SYLLABICS R, CANADIAN SYLLABICS KOO    # 
+
+1583 ; 1550 1472 ;     SL      # ( ᖃ → ᕐᑲ ) CANADIAN SYLLABICS QA → CANADIAN SYLLABICS R, CANADIAN SYLLABICS KA      # 
+
+1584 ; 1550 1473 ;     SL      # ( ᖄ → ᕐᑳ ) CANADIAN SYLLABICS QAA → CANADIAN SYLLABICS R, CANADIAN SYLLABICS KAA    # 
+
+1585 ; 1550 1483 ;     SL      # ( ᖅ → ᕐᒃ ) CANADIAN SYLLABICS Q → CANADIAN SYLLABICS R, CANADIAN SYLLABICS K        # 
+
+155C ; 155A 00B7 ;     SL      # ( ᕜ → ᕚ· ) CANADIAN SYLLABICS WEST-CREE FWAA → CANADIAN SYLLABICS FAA, MIDDLE DOT    # →ᕚᐧ→
+
+1569 ; 1567 00B7 ;     SL      # ( ᕩ → ᕧ· ) CANADIAN SYLLABICS WEST-CREE THWAA → CANADIAN SYLLABICS THAA, MIDDLE DOT  # →ᕧᐧ→
+
+211B ; 1587 ;  SL      # ( ℛ → ᖇ ) SCRIPT CAPITAL R → CANADIAN SYLLABICS TLHI  # →R→
+211C ; 1587 ;  SL      # ( ℜ → ᖇ ) BLACK-LETTER CAPITAL R → CANADIAN SYLLABICS TLHI    # →R→
+211D ; 1587 ;  SL      # ( ℝ → ᖇ ) DOUBLE-STRUCK CAPITAL R → CANADIAN SYLLABICS TLHI   # →R→
+1D411 ;        1587 ;  SL      # ( 𝐑 → ᖇ ) MATHEMATICAL BOLD CAPITAL R → CANADIAN SYLLABICS TLHI      # →R→
+1D445 ;        1587 ;  SL      # ( 𝑅 → ᖇ ) MATHEMATICAL ITALIC CAPITAL R → CANADIAN SYLLABICS TLHI    # →R→
+1D479 ;        1587 ;  SL      # ( 𝑹 → ᖇ ) MATHEMATICAL BOLD ITALIC CAPITAL R → CANADIAN SYLLABICS TLHI       # →R→
+1D4E1 ;        1587 ;  SL      # ( 𝓡 → ᖇ ) MATHEMATICAL BOLD SCRIPT CAPITAL R → CANADIAN SYLLABICS TLHI       # →R→
+1D57D ;        1587 ;  SL      # ( 𝕽 → ᖇ ) MATHEMATICAL BOLD FRAKTUR CAPITAL R → CANADIAN SYLLABICS TLHI      # →R→
+1D5B1 ;        1587 ;  SL      # ( 𝖱 → ᖇ ) MATHEMATICAL SANS-SERIF CAPITAL R → CANADIAN SYLLABICS TLHI        # →R→
+1D5E5 ;        1587 ;  SL      # ( 𝗥 → ᖇ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL R → CANADIAN SYLLABICS TLHI   # →R→
+1D619 ;        1587 ;  SL      # ( 𝘙 → ᖇ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL R → CANADIAN SYLLABICS TLHI # →R→
+1D64D ;        1587 ;  SL      # ( 𝙍 → ᖇ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R → CANADIAN SYLLABICS TLHI    # →R→
+1D681 ;        1587 ;  SL      # ( 𝚁 → ᖇ ) MATHEMATICAL MONOSPACE CAPITAL R → CANADIAN SYLLABICS TLHI # →R→
+
+1670 ; 1595 1489 ;     SL      # ( ᙰ → ᖕᒉ ) CANADIAN SYLLABICS NGAI → CANADIAN SYLLABICS NG, CANADIAN SYLLABICS CE   # 
+
+158E ; 1595 148A ;     SL      # ( ᖎ → ᖕᒊ ) CANADIAN SYLLABICS NGAAI → CANADIAN SYLLABICS NG, CANADIAN SYLLABICS CAAI        # 
+
+158F ; 1595 148B ;     SL      # ( ᖏ → ᖕᒋ ) CANADIAN SYLLABICS NGI → CANADIAN SYLLABICS NG, CANADIAN SYLLABICS CI    # 
+
+1590 ; 1595 148C ;     SL      # ( ᖐ → ᖕᒌ ) CANADIAN SYLLABICS NGII → CANADIAN SYLLABICS NG, CANADIAN SYLLABICS CII  # 
+
+1591 ; 1595 148D ;     SL      # ( ᖑ → ᖕᒍ ) CANADIAN SYLLABICS NGO → CANADIAN SYLLABICS NG, CANADIAN SYLLABICS CO    # 
+
+1592 ; 1595 148E ;     SL      # ( ᖒ → ᖕᒎ ) CANADIAN SYLLABICS NGOO → CANADIAN SYLLABICS NG, CANADIAN SYLLABICS COO  # 
+
+1593 ; 1595 1490 ;     SL      # ( ᖓ → ᖕᒐ ) CANADIAN SYLLABICS NGA → CANADIAN SYLLABICS NG, CANADIAN SYLLABICS CA    # 
+
+1594 ; 1595 1491 ;     SL      # ( ᖔ → ᖕᒑ ) CANADIAN SYLLABICS NGAA → CANADIAN SYLLABICS NG, CANADIAN SYLLABICS CAA  # 
+
+1671 ; 1596 148B ;     SL      # ( ᙱ → ᖖᒋ ) CANADIAN SYLLABICS NNGI → CANADIAN SYLLABICS NNG, CANADIAN SYLLABICS CI  # 
+
+1672 ; 1596 148C ;     SL      # ( ᙲ → ᖖᒌ ) CANADIAN SYLLABICS NNGII → CANADIAN SYLLABICS NNG, CANADIAN SYLLABICS CII        # 
+
+1673 ; 1596 148D ;     SL      # ( ᙳ → ᖖᒍ ) CANADIAN SYLLABICS NNGO → CANADIAN SYLLABICS NNG, CANADIAN SYLLABICS CO  # 
+
+1674 ; 1596 148E ;     SL      # ( ᙴ → ᖖᒎ ) CANADIAN SYLLABICS NNGOO → CANADIAN SYLLABICS NNG, CANADIAN SYLLABICS COO        # 
+
+1675 ; 1596 1490 ;     SL      # ( ᙵ → ᖖᒐ ) CANADIAN SYLLABICS NNGA → CANADIAN SYLLABICS NNG, CANADIAN SYLLABICS CA  # 
+
+1676 ; 1596 1491 ;     SL      # ( ᙶ → ᖖᒑ ) CANADIAN SYLLABICS NNGAA → CANADIAN SYLLABICS NNG, CANADIAN SYLLABICS CAA        # 
+
+210B ; 157C ;  SL      # ( ℋ → ᕼ ) SCRIPT CAPITAL H → CANADIAN SYLLABICS NUNAVUT H     # →H→
+210C ; 157C ;  SL      # ( ℌ → ᕼ ) BLACK-LETTER CAPITAL H → CANADIAN SYLLABICS NUNAVUT H       # →H→
+210D ; 157C ;  SL      # ( ℍ → ᕼ ) DOUBLE-STRUCK CAPITAL H → CANADIAN SYLLABICS NUNAVUT H      # →H→
+1D407 ;        157C ;  SL      # ( 𝐇 → ᕼ ) MATHEMATICAL BOLD CAPITAL H → CANADIAN SYLLABICS NUNAVUT H # →H→
+1D43B ;        157C ;  SL      # ( 𝐻 → ᕼ ) MATHEMATICAL ITALIC CAPITAL H → CANADIAN SYLLABICS NUNAVUT H       # →H→
+1D46F ;        157C ;  SL      # ( 𝑯 → ᕼ ) MATHEMATICAL BOLD ITALIC CAPITAL H → CANADIAN SYLLABICS NUNAVUT H  # →H→
+1D4D7 ;        157C ;  SL      # ( 𝓗 → ᕼ ) MATHEMATICAL BOLD SCRIPT CAPITAL H → CANADIAN SYLLABICS NUNAVUT H  # →H→
+1D573 ;        157C ;  SL      # ( 𝕳 → ᕼ ) MATHEMATICAL BOLD FRAKTUR CAPITAL H → CANADIAN SYLLABICS NUNAVUT H # →H→
+1D5A7 ;        157C ;  SL      # ( 𝖧 → ᕼ ) MATHEMATICAL SANS-SERIF CAPITAL H → CANADIAN SYLLABICS NUNAVUT H   # →H→
+1D5DB ;        157C ;  SL      # ( 𝗛 → ᕼ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL H → CANADIAN SYLLABICS NUNAVUT H      # →H→
+1D60F ;        157C ;  SL      # ( 𝘏 → ᕼ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL H → CANADIAN SYLLABICS NUNAVUT H    # →H→
+1D643 ;        157C ;  SL      # ( 𝙃 → ᕼ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H → CANADIAN SYLLABICS NUNAVUT H       # →H→
+1D677 ;        157C ;  SL      # ( 𝙷 → ᕼ ) MATHEMATICAL MONOSPACE CAPITAL H → CANADIAN SYLLABICS NUNAVUT H    # →H→
+1D6AE ;        157C ;  SL      # ( 𝚮 → ᕼ ) MATHEMATICAL BOLD CAPITAL ETA → CANADIAN SYLLABICS NUNAVUT H       # →Η→
+1D6E8 ;        157C ;  SL      # ( 𝛨 → ᕼ ) MATHEMATICAL ITALIC CAPITAL ETA → CANADIAN SYLLABICS NUNAVUT H     # →Η→
+1D722 ;        157C ;  SL      # ( 𝜢 → ᕼ ) MATHEMATICAL BOLD ITALIC CAPITAL ETA → CANADIAN SYLLABICS NUNAVUT H        # →Η→
+1D75C ;        157C ;  SL      # ( 𝝜 → ᕼ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA → CANADIAN SYLLABICS NUNAVUT H    # →Η→
+1D796 ;        157C ;  SL      # ( 𝞖 → ᕼ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA → CANADIAN SYLLABICS NUNAVUT H     # →Η→
+
+2131 ; 15B4 ;  SL      # ( ℱ → ᖴ ) SCRIPT CAPITAL F → CANADIAN SYLLABICS BLACKFOOT WE  # →F→
+1D405 ;        15B4 ;  SL      # ( 𝐅 → ᖴ ) MATHEMATICAL BOLD CAPITAL F → CANADIAN SYLLABICS BLACKFOOT WE      # →F→
+1D439 ;        15B4 ;  SL      # ( 𝐹 → ᖴ ) MATHEMATICAL ITALIC CAPITAL F → CANADIAN SYLLABICS BLACKFOOT WE    # →F→
+1D46D ;        15B4 ;  SL      # ( 𝑭 → ᖴ ) MATHEMATICAL BOLD ITALIC CAPITAL F → CANADIAN SYLLABICS BLACKFOOT WE       # →F→
+1D4D5 ;        15B4 ;  SL      # ( 𝓕 → ᖴ ) MATHEMATICAL BOLD SCRIPT CAPITAL F → CANADIAN SYLLABICS BLACKFOOT WE       # →F→
+1D509 ;        15B4 ;  SL      # ( 𝔉 → ᖴ ) MATHEMATICAL FRAKTUR CAPITAL F → CANADIAN SYLLABICS BLACKFOOT WE   # →F→
+1D53D ;        15B4 ;  SL      # ( 𝔽 → ᖴ ) MATHEMATICAL DOUBLE-STRUCK CAPITAL F → CANADIAN SYLLABICS BLACKFOOT WE     # →F→
+1D571 ;        15B4 ;  SL      # ( 𝕱 → ᖴ ) MATHEMATICAL BOLD FRAKTUR CAPITAL F → CANADIAN SYLLABICS BLACKFOOT WE      # →F→
+1D5A5 ;        15B4 ;  SL      # ( 𝖥 → ᖴ ) MATHEMATICAL SANS-SERIF CAPITAL F → CANADIAN SYLLABICS BLACKFOOT WE        # →F→
+1D5D9 ;        15B4 ;  SL      # ( 𝗙 → ᖴ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL F → CANADIAN SYLLABICS BLACKFOOT WE   # →F→
+1D60D ;        15B4 ;  SL      # ( 𝘍 → ᖴ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL F → CANADIAN SYLLABICS BLACKFOOT WE # →F→
+1D641 ;        15B4 ;  SL      # ( 𝙁 → ᖴ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F → CANADIAN SYLLABICS BLACKFOOT WE    # →F→
+1D675 ;        15B4 ;  SL      # ( 𝙵 → ᖴ ) MATHEMATICAL MONOSPACE CAPITAL F → CANADIAN SYLLABICS BLACKFOOT WE # →F→
+1D7CA ;        15B4 ;  SL      # ( 𝟊 → ᖴ ) MATHEMATICAL BOLD CAPITAL DIGAMMA → CANADIAN SYLLABICS BLACKFOOT WE        # →Ϝ→→F→
+
+1D400 ;        15C5 ;  SL      # ( 𝐀 → ᗅ ) MATHEMATICAL BOLD CAPITAL A → CANADIAN SYLLABICS CARRIER GHO       # →A→
+1D434 ;        15C5 ;  SL      # ( 𝐴 → ᗅ ) MATHEMATICAL ITALIC CAPITAL A → CANADIAN SYLLABICS CARRIER GHO     # →A→
+1D468 ;        15C5 ;  SL      # ( 𝑨 → ᗅ ) MATHEMATICAL BOLD ITALIC CAPITAL A → CANADIAN SYLLABICS CARRIER GHO        # →A→
+1D49C ;        15C5 ;  SL      # ( 𝒜 → ᗅ ) MATHEMATICAL SCRIPT CAPITAL A → CANADIAN SYLLABICS CARRIER GHO     # →A→
+1D4D0 ;        15C5 ;  SL      # ( 𝓐 → ᗅ ) MATHEMATICAL BOLD SCRIPT CAPITAL A → CANADIAN SYLLABICS CARRIER GHO        # →A→
+1D504 ;        15C5 ;  SL      # ( 𝔄 → ᗅ ) MATHEMATICAL FRAKTUR CAPITAL A → CANADIAN SYLLABICS CARRIER GHO    # →A→
+1D538 ;        15C5 ;  SL      # ( 𝔸 → ᗅ ) MATHEMATICAL DOUBLE-STRUCK CAPITAL A → CANADIAN SYLLABICS CARRIER GHO      # →A→
+1D56C ;        15C5 ;  SL      # ( 𝕬 → ᗅ ) MATHEMATICAL BOLD FRAKTUR CAPITAL A → CANADIAN SYLLABICS CARRIER GHO       # →A→
+1D5A0 ;        15C5 ;  SL      # ( 𝖠 → ᗅ ) MATHEMATICAL SANS-SERIF CAPITAL A → CANADIAN SYLLABICS CARRIER GHO # →A→
+1D5D4 ;        15C5 ;  SL      # ( 𝗔 → ᗅ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL A → CANADIAN SYLLABICS CARRIER GHO    # →A→
+1D608 ;        15C5 ;  SL      # ( 𝘈 → ᗅ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL A → CANADIAN SYLLABICS CARRIER GHO  # →A→
+1D63C ;        15C5 ;  SL      # ( 𝘼 → ᗅ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A → CANADIAN SYLLABICS CARRIER GHO     # →A→
+1D670 ;        15C5 ;  SL      # ( 𝙰 → ᗅ ) MATHEMATICAL MONOSPACE CAPITAL A → CANADIAN SYLLABICS CARRIER GHO  # →A→
+1D6A8 ;        15C5 ;  SL      # ( 𝚨 → ᗅ ) MATHEMATICAL BOLD CAPITAL ALPHA → CANADIAN SYLLABICS CARRIER GHO   # →𝐀→→A→
+1D6E2 ;        15C5 ;  SL      # ( 𝛢 → ᗅ ) MATHEMATICAL ITALIC CAPITAL ALPHA → CANADIAN SYLLABICS CARRIER GHO # →𝐴→→A→
+1D71C ;        15C5 ;  SL      # ( 𝜜 → ᗅ ) MATHEMATICAL BOLD ITALIC CAPITAL ALPHA → CANADIAN SYLLABICS CARRIER GHO    # →𝑨→→A→
+1D756 ;        15C5 ;  SL      # ( 𝝖 → ᗅ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA → CANADIAN SYLLABICS CARRIER GHO        # →Α→→A→
+1D790 ;        15C5 ;  SL      # ( 𝞐 → ᗅ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA → CANADIAN SYLLABICS CARRIER GHO # →Α→→A→
+
+2145 ; 15DE ;  SL      # ( ⅅ → ᗞ ) DOUBLE-STRUCK ITALIC CAPITAL D → CANADIAN SYLLABICS CARRIER THE     # →D→
+1D403 ;        15DE ;  SL      # ( 𝐃 → ᗞ ) MATHEMATICAL BOLD CAPITAL D → CANADIAN SYLLABICS CARRIER THE       # →D→
+1D437 ;        15DE ;  SL      # ( 𝐷 → ᗞ ) MATHEMATICAL ITALIC CAPITAL D → CANADIAN SYLLABICS CARRIER THE     # →D→
+1D46B ;        15DE ;  SL      # ( 𝑫 → ᗞ ) MATHEMATICAL BOLD ITALIC CAPITAL D → CANADIAN SYLLABICS CARRIER THE        # →D→
+1D49F ;        15DE ;  SL      # ( 𝒟 → ᗞ ) MATHEMATICAL SCRIPT CAPITAL D → CANADIAN SYLLABICS CARRIER THE     # →D→
+1D4D3 ;        15DE ;  SL      # ( 𝓓 → ᗞ ) MATHEMATICAL BOLD SCRIPT CAPITAL D → CANADIAN SYLLABICS CARRIER THE        # →D→
+1D507 ;        15DE ;  SL      # ( 𝔇 → ᗞ ) MATHEMATICAL FRAKTUR CAPITAL D → CANADIAN SYLLABICS CARRIER THE    # →D→
+1D53B ;        15DE ;  SL      # ( 𝔻 → ᗞ ) MATHEMATICAL DOUBLE-STRUCK CAPITAL D → CANADIAN SYLLABICS CARRIER THE      # →D→
+1D56F ;        15DE ;  SL      # ( 𝕯 → ᗞ ) MATHEMATICAL BOLD FRAKTUR CAPITAL D → CANADIAN SYLLABICS CARRIER THE       # →D→
+1D5A3 ;        15DE ;  SL      # ( 𝖣 → ᗞ ) MATHEMATICAL SANS-SERIF CAPITAL D → CANADIAN SYLLABICS CARRIER THE # →D→
+1D5D7 ;        15DE ;  SL      # ( 𝗗 → ᗞ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL D → CANADIAN SYLLABICS CARRIER THE    # →D→
+1D60B ;        15DE ;  SL      # ( 𝘋 → ᗞ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL D → CANADIAN SYLLABICS CARRIER THE  # →D→
+1D63F ;        15DE ;  SL      # ( 𝘿 → ᗞ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D → CANADIAN SYLLABICS CARRIER THE     # →D→
+1D673 ;        15DE ;  SL      # ( 𝙳 → ᗞ ) MATHEMATICAL MONOSPACE CAPITAL D → CANADIAN SYLLABICS CARRIER THE  # →D→
+15EA ; 15DE ;  SL      # ( ᗪ → ᗞ ) CANADIAN SYLLABICS CARRIER PE → CANADIAN SYLLABICS CARRIER THE      # 
+
+2133 ; 15F0 ;  SL      # ( ℳ → ᗰ ) SCRIPT CAPITAL M → CANADIAN SYLLABICS CARRIER GO    # →M→
+1D40C ;        15F0 ;  SL      # ( 𝐌 → ᗰ ) MATHEMATICAL BOLD CAPITAL M → CANADIAN SYLLABICS CARRIER GO        # →M→
+1D440 ;        15F0 ;  SL      # ( 𝑀 → ᗰ ) MATHEMATICAL ITALIC CAPITAL M → CANADIAN SYLLABICS CARRIER GO      # →M→
+1D474 ;        15F0 ;  SL      # ( 𝑴 → ᗰ ) MATHEMATICAL BOLD ITALIC CAPITAL M → CANADIAN SYLLABICS CARRIER GO # →M→
+1D4DC ;        15F0 ;  SL      # ( 𝓜 → ᗰ ) MATHEMATICAL BOLD SCRIPT CAPITAL M → CANADIAN SYLLABICS CARRIER GO # →M→
+1D510 ;        15F0 ;  SL      # ( 𝔐 → ᗰ ) MATHEMATICAL FRAKTUR CAPITAL M → CANADIAN SYLLABICS CARRIER GO     # →M→
+1D544 ;        15F0 ;  SL      # ( 𝕄 → ᗰ ) MATHEMATICAL DOUBLE-STRUCK CAPITAL M → CANADIAN SYLLABICS CARRIER GO       # →M→
+1D578 ;        15F0 ;  SL      # ( 𝕸 → ᗰ ) MATHEMATICAL BOLD FRAKTUR CAPITAL M → CANADIAN SYLLABICS CARRIER GO        # →M→
+1D5AC ;        15F0 ;  SL      # ( 𝖬 → ᗰ ) MATHEMATICAL SANS-SERIF CAPITAL M → CANADIAN SYLLABICS CARRIER GO  # →M→
+1D5E0 ;        15F0 ;  SL      # ( 𝗠 → ᗰ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL M → CANADIAN SYLLABICS CARRIER GO     # →M→
+1D614 ;        15F0 ;  SL      # ( 𝘔 → ᗰ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL M → CANADIAN SYLLABICS CARRIER GO   # →M→
+1D648 ;        15F0 ;  SL      # ( 𝙈 → ᗰ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M → CANADIAN SYLLABICS CARRIER GO      # →M→
+1D67C ;        15F0 ;  SL      # ( 𝙼 → ᗰ ) MATHEMATICAL MONOSPACE CAPITAL M → CANADIAN SYLLABICS CARRIER GO   # →M→
+1D6B3 ;        15F0 ;  SL      # ( 𝚳 → ᗰ ) MATHEMATICAL BOLD CAPITAL MU → CANADIAN SYLLABICS CARRIER GO       # →Μ→→M→
+1D6ED ;        15F0 ;  SL      # ( 𝛭 → ᗰ ) MATHEMATICAL ITALIC CAPITAL MU → CANADIAN SYLLABICS CARRIER GO     # →Μ→→M→
+1D727 ;        15F0 ;  SL      # ( 𝜧 → ᗰ ) MATHEMATICAL BOLD ITALIC CAPITAL MU → CANADIAN SYLLABICS CARRIER GO        # →Μ→→M→
+1D761 ;        15F0 ;  SL      # ( 𝝡 → ᗰ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL MU → CANADIAN SYLLABICS CARRIER GO    # →Μ→→M→
+1D79B ;        15F0 ;  SL      # ( 𝞛 → ᗰ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU → CANADIAN SYLLABICS CARRIER GO     # →Μ→→M→
+
+212C ; 15F7 ;  SL      # ( ℬ → ᗷ ) SCRIPT CAPITAL B → CANADIAN SYLLABICS CARRIER KHE   # →B→
+1D401 ;        15F7 ;  SL      # ( 𝐁 → ᗷ ) MATHEMATICAL BOLD CAPITAL B → CANADIAN SYLLABICS CARRIER KHE       # →B→
+1D435 ;        15F7 ;  SL      # ( 𝐵 → ᗷ ) MATHEMATICAL ITALIC CAPITAL B → CANADIAN SYLLABICS CARRIER KHE     # →B→
+1D469 ;        15F7 ;  SL      # ( 𝑩 → ᗷ ) MATHEMATICAL BOLD ITALIC CAPITAL B → CANADIAN SYLLABICS CARRIER KHE        # →B→
+1D4D1 ;        15F7 ;  SL      # ( 𝓑 → ᗷ ) MATHEMATICAL BOLD SCRIPT CAPITAL B → CANADIAN SYLLABICS CARRIER KHE        # →B→
+1D505 ;        15F7 ;  SL      # ( 𝔅 → ᗷ ) MATHEMATICAL FRAKTUR CAPITAL B → CANADIAN SYLLABICS CARRIER KHE    # →B→
+1D539 ;        15F7 ;  SL      # ( 𝔹 → ᗷ ) MATHEMATICAL DOUBLE-STRUCK CAPITAL B → CANADIAN SYLLABICS CARRIER KHE      # →B→
+1D56D ;        15F7 ;  SL      # ( 𝕭 → ᗷ ) MATHEMATICAL BOLD FRAKTUR CAPITAL B → CANADIAN SYLLABICS CARRIER KHE       # →B→
+1D5A1 ;        15F7 ;  SL      # ( 𝖡 → ᗷ ) MATHEMATICAL SANS-SERIF CAPITAL B → CANADIAN SYLLABICS CARRIER KHE # →B→
+1D5D5 ;        15F7 ;  SL      # ( 𝗕 → ᗷ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL B → CANADIAN SYLLABICS CARRIER KHE    # →B→
+1D609 ;        15F7 ;  SL      # ( 𝘉 → ᗷ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL B → CANADIAN SYLLABICS CARRIER KHE  # →B→
+1D63D ;        15F7 ;  SL      # ( 𝘽 → ᗷ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B → CANADIAN SYLLABICS CARRIER KHE     # →B→
+1D671 ;        15F7 ;  SL      # ( 𝙱 → ᗷ ) MATHEMATICAL MONOSPACE CAPITAL B → CANADIAN SYLLABICS CARRIER KHE  # →B→
+1D6A9 ;        15F7 ;  SL      # ( 𝚩 → ᗷ ) MATHEMATICAL BOLD CAPITAL BETA → CANADIAN SYLLABICS CARRIER KHE    # →𝐁→→B→
+1D6E3 ;        15F7 ;  SL      # ( 𝛣 → ᗷ ) MATHEMATICAL ITALIC CAPITAL BETA → CANADIAN SYLLABICS CARRIER KHE  # →𝐵→→B→
+1D71D ;        15F7 ;  SL      # ( 𝜝 → ᗷ ) MATHEMATICAL BOLD ITALIC CAPITAL BETA → CANADIAN SYLLABICS CARRIER KHE     # →𝑩→→B→
+1D757 ;        15F7 ;  SL      # ( 𝝗 → ᗷ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA → CANADIAN SYLLABICS CARRIER KHE # →Β→→B→
+1D791 ;        15F7 ;  SL      # ( 𝞑 → ᗷ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA → CANADIAN SYLLABICS CARRIER KHE  # →Β→→B→
+
+2127 ; 162E ;  SL      #* ( ℧ → ᘮ ) INVERTED OHM SIGN → CANADIAN SYLLABICS CARRIER LHU # 
+1634 ; 162E ;  SL      # ( ᘴ → ᘮ ) CANADIAN SYLLABICS CARRIER TLHU → CANADIAN SYLLABICS CARRIER LHU    # 
+
+1D6C0 ;        162F ;  SL      # ( 𝛀 → ᘯ ) MATHEMATICAL BOLD CAPITAL OMEGA → CANADIAN SYLLABICS CARRIER LHO   # →Ω→
+1D6FA ;        162F ;  SL      # ( 𝛺 → ᘯ ) MATHEMATICAL ITALIC CAPITAL OMEGA → CANADIAN SYLLABICS CARRIER LHO # →Ω→
+1D734 ;        162F ;  SL      # ( 𝜴 → ᘯ ) MATHEMATICAL BOLD ITALIC CAPITAL OMEGA → CANADIAN SYLLABICS CARRIER LHO    # →Ω→
+1D76E ;        162F ;  SL      # ( 𝝮 → ᘯ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA → CANADIAN SYLLABICS CARRIER LHO        # →Ω→
+1D7A8 ;        162F ;  SL      # ( 𝞨 → ᘯ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA → CANADIAN SYLLABICS CARRIER LHO # →Ω→
+1635 ; 162F ;  SL      # ( ᘵ → ᘯ ) CANADIAN SYLLABICS CARRIER TLHO → CANADIAN SYLLABICS CARRIER LHO    # 
+
+3131 ; 1100 ;  SL      # ( ㄱ → ᄀ ) HANGUL LETTER KIYEOK → HANGUL CHOSEONG KIYEOK       # 
+11A8 ; 1100 ;  SL      # ( ᆨ → ᄀ ) HANGUL JONGSEONG KIYEOK → HANGUL CHOSEONG KIYEOK    # 
+
+1101 ; 1100 1100 ;     SL      # ( ᄁ → ᄀᄀ ) HANGUL CHOSEONG SSANGKIYEOK → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG KIYEOK     # 
+3132 ; 1100 1100 ;     SL      # ( ㄲ → ᄀᄀ ) HANGUL LETTER SSANGKIYEOK → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG KIYEOK       # →ᄁ→
+11A9 ; 1100 1100 ;     SL      # ( ᆩ → ᄀᄀ ) HANGUL JONGSEONG SSANGKIYEOK → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG KIYEOK    # →ᄁ→
+
+11FA ; 1100 1102 ;     SL      # ( ᇺ → ᄀᄂ ) HANGUL JONGSEONG KIYEOK-NIEUN → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG NIEUN    # →ᆨᆫ→
+
+115A ; 1100 1103 ;     SL      # ( ᅚ → ᄀᄃ ) HANGUL CHOSEONG KIYEOK-TIKEUT → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG TIKEUT   # 
+
+11C3 ; 1100 1105 ;     SL      # ( ᇃ → ᄀᄅ ) HANGUL JONGSEONG KIYEOK-RIEUL → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG RIEUL    # →ᆨᆯ→
+
+11FB ; 1100 1107 ;     SL      # ( ᇻ → ᄀᄇ ) HANGUL JONGSEONG KIYEOK-PIEUP → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG PIEUP    # →ᆨᆸ→
+
+11AA ; 1100 1109 ;     SL      # ( ᆪ → ᄀᄉ ) HANGUL JONGSEONG KIYEOK-SIOS → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG SIOS      # →ᆨᆺ→
+3133 ; 1100 1109 ;     SL      # ( ㄳ → ᄀᄉ ) HANGUL LETTER KIYEOK-SIOS → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG SIOS # →ᆪ→→ᆨᆺ→
+
+11C4 ; 1100 1109 1100 ;        SL      # ( ᇄ → ᄀᄉᄀ ) HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK    # →ᆨᆺᆨ→
+
+11FC ; 1100 110E ;     SL      # ( ᇼ → ᄀᄎ ) HANGUL JONGSEONG KIYEOK-CHIEUCH → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG CHIEUCH        # →ᆨᆾ→
+
+11FD ; 1100 110F ;     SL      # ( ᇽ → ᄀᄏ ) HANGUL JONGSEONG KIYEOK-KHIEUKH → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG KHIEUKH        # →ᆨᆿ→
+
+11FE ; 1100 1112 ;     SL      # ( ᇾ → ᄀᄒ ) HANGUL JONGSEONG KIYEOK-HIEUH → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG HIEUH    # →ᆨᇂ→
+
+3134 ; 1102 ;  SL      # ( ㄴ → ᄂ ) HANGUL LETTER NIEUN → HANGUL CHOSEONG NIEUN # 
+11AB ; 1102 ;  SL      # ( ᆫ → ᄂ ) HANGUL JONGSEONG NIEUN → HANGUL CHOSEONG NIEUN      # 
+
+1113 ; 1102 1100 ;     SL      # ( ᄓ → ᄂᄀ ) HANGUL CHOSEONG NIEUN-KIYEOK → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG KIYEOK     # 
+11C5 ; 1102 1100 ;     SL      # ( ᇅ → ᄂᄀ ) HANGUL JONGSEONG NIEUN-KIYEOK → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG KIYEOK    # →ᄓ→
+
+1114 ; 1102 1102 ;     SL      # ( ᄔ → ᄂᄂ ) HANGUL CHOSEONG SSANGNIEUN → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG NIEUN        # 
+3165 ; 1102 1102 ;     SL      # ( ㅥ → ᄂᄂ ) HANGUL LETTER SSANGNIEUN → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG NIEUN  # →ᄔ→
+11FF ; 1102 1102 ;     SL      # ( ᇿ → ᄂᄂ ) HANGUL JONGSEONG SSANGNIEUN → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG NIEUN       # →ᆫᆫ→
+
+1115 ; 1102 1103 ;     SL      # ( ᄕ → ᄂᄃ ) HANGUL CHOSEONG NIEUN-TIKEUT → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG TIKEUT     # 
+3166 ; 1102 1103 ;     SL      # ( ㅦ → ᄂᄃ ) HANGUL LETTER NIEUN-TIKEUT → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG TIKEUT       # →ᄕ→
+11C6 ; 1102 1103 ;     SL      # ( ᇆ → ᄂᄃ ) HANGUL JONGSEONG NIEUN-TIKEUT → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG TIKEUT    # →ᄕ→
+
+D7CB ; 1102 1105 ;     SL      # ( ퟋ → ᄂᄅ ) HANGUL JONGSEONG NIEUN-RIEUL → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG RIEUL      # →ᆫᆯ→
+
+1116 ; 1102 1107 ;     SL      # ( ᄖ → ᄂᄇ ) HANGUL CHOSEONG NIEUN-PIEUP → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG PIEUP       # 
+
+115B ; 1102 1109 ;     SL      # ( ᅛ → ᄂᄉ ) HANGUL CHOSEONG NIEUN-SIOS → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG SIOS # 
+11C7 ; 1102 1109 ;     SL      # ( ᇇ → ᄂᄉ ) HANGUL JONGSEONG NIEUN-SIOS → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG SIOS        # →ᆫᆺ→
+3167 ; 1102 1109 ;     SL      # ( ㅧ → ᄂᄉ ) HANGUL LETTER NIEUN-SIOS → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG SIOS   # →ᇇ→→ᆫᆺ→
+
+115C ; 1102 110C ;     SL      # ( ᅜ → ᄂᄌ ) HANGUL CHOSEONG NIEUN-CIEUC → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG CIEUC       # 
+11AC ; 1102 110C ;     SL      # ( ᆬ → ᄂᄌ ) HANGUL JONGSEONG NIEUN-CIEUC → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG CIEUC      # →ᆫᆽ→
+3135 ; 1102 110C ;     SL      # ( ㄵ → ᄂᄌ ) HANGUL LETTER NIEUN-CIEUC → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG CIEUC # →ᆬ→→ᆫᆽ→
+
+D7CC ; 1102 110E ;     SL      # ( ퟌ → ᄂᄎ ) HANGUL JONGSEONG NIEUN-CHIEUCH → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG CHIEUCH  # →ᆫᆾ→
+
+11C9 ; 1102 1110 ;     SL      # ( ᇉ → ᄂᄐ ) HANGUL JONGSEONG NIEUN-THIEUTH → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG THIEUTH  # →ᆫᇀ→
+
+115D ; 1102 1112 ;     SL      # ( ᅝ → ᄂᄒ ) HANGUL CHOSEONG NIEUN-HIEUH → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG HIEUH       # 
+11AD ; 1102 1112 ;     SL      # ( ᆭ → ᄂᄒ ) HANGUL JONGSEONG NIEUN-HIEUH → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG HIEUH      # →ᆫᇂ→
+3136 ; 1102 1112 ;     SL      # ( ㄶ → ᄂᄒ ) HANGUL LETTER NIEUN-HIEUH → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG HIEUH # →ᆭ→→ᆫᇂ→
+
+11C8 ; 1102 1140 ;     SL      # ( ᇈ → ᄂᅀ ) HANGUL JONGSEONG NIEUN-PANSIOS → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG PANSIOS  # →ᆫᇫ→
+3168 ; 1102 1140 ;     SL      # ( ㅨ → ᄂᅀ ) HANGUL LETTER NIEUN-PANSIOS → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG PANSIOS     # →ᇈ→→ᆫᇫ→
+
+3137 ; 1103 ;  SL      # ( ㄷ → ᄃ ) HANGUL LETTER TIKEUT → HANGUL CHOSEONG TIKEUT       # 
+11AE ; 1103 ;  SL      # ( ᆮ → ᄃ ) HANGUL JONGSEONG TIKEUT → HANGUL CHOSEONG TIKEUT    # 
+
+1117 ; 1103 1100 ;     SL      # ( ᄗ → ᄃᄀ ) HANGUL CHOSEONG TIKEUT-KIYEOK → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG KIYEOK   # 
+11CA ; 1103 1100 ;     SL      # ( ᇊ → ᄃᄀ ) HANGUL JONGSEONG TIKEUT-KIYEOK → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG KIYEOK  # →ᄗ→
+
+1104 ; 1103 1103 ;     SL      # ( ᄄ → ᄃᄃ ) HANGUL CHOSEONG SSANGTIKEUT → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG TIKEUT     # 
+3138 ; 1103 1103 ;     SL      # ( ㄸ → ᄃᄃ ) HANGUL LETTER SSANGTIKEUT → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG TIKEUT       # →ᄄ→
+D7CD ; 1103 1103 ;     SL      # ( ퟍ → ᄃᄃ ) HANGUL JONGSEONG SSANGTIKEUT → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG TIKEUT    # →ᆮᆮ→
+
+D7CE ; 1103 1103 1107 ;        SL      # ( ퟎ → ᄃᄃᄇ ) HANGUL JONGSEONG SSANGTIKEUT-PIEUP → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG PIEUP    # →ᆮᆮᆸ→
+
+115E ; 1103 1105 ;     SL      # ( ᅞ → ᄃᄅ ) HANGUL CHOSEONG TIKEUT-RIEUL → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG RIEUL     # 
+11CB ; 1103 1105 ;     SL      # ( ᇋ → ᄃᄅ ) HANGUL JONGSEONG TIKEUT-RIEUL → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG RIEUL    # →ᆮᆯ→
+
+A960 ; 1103 1106 ;     SL      # ( ꥠ → ᄃᄆ ) HANGUL CHOSEONG TIKEUT-MIEUM → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG MIEUM     # 
+
+A961 ; 1103 1107 ;     SL      # ( ꥡ → ᄃᄇ ) HANGUL CHOSEONG TIKEUT-PIEUP → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG PIEUP     # 
+D7CF ; 1103 1107 ;     SL      # ( ퟏ → ᄃᄇ ) HANGUL JONGSEONG TIKEUT-PIEUP → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG PIEUP    # →ᆮᆸ→
+
+A962 ; 1103 1109 ;     SL      # ( ꥢ → ᄃᄉ ) HANGUL CHOSEONG TIKEUT-SIOS → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG SIOS       # 
+D7D0 ; 1103 1109 ;     SL      # ( ퟐ → ᄃᄉ ) HANGUL JONGSEONG TIKEUT-SIOS → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG SIOS      # →ᆮᆺ→
+
+D7D1 ; 1103 1109 1100 ;        SL      # ( ퟑ → ᄃᄉᄀ ) HANGUL JONGSEONG TIKEUT-SIOS-KIYEOK → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK    # →ᆮᆺᆨ→
+
+A963 ; 1103 110C ;     SL      # ( ꥣ → ᄃᄌ ) HANGUL CHOSEONG TIKEUT-CIEUC → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG CIEUC     # 
+D7D2 ; 1103 110C ;     SL      # ( ퟒ → ᄃᄌ ) HANGUL JONGSEONG TIKEUT-CIEUC → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG CIEUC    # →ᆮᆽ→
+
+D7D3 ; 1103 110E ;     SL      # ( ퟓ → ᄃᄎ ) HANGUL JONGSEONG TIKEUT-CHIEUCH → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG CHIEUCH        # →ᆮᆾ→
+
+D7D4 ; 1103 1110 ;     SL      # ( ퟔ → ᄃᄐ ) HANGUL JONGSEONG TIKEUT-THIEUTH → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG THIEUTH        # →ᆮᇀ→
+
+3139 ; 1105 ;  SL      # ( ㄹ → ᄅ ) HANGUL LETTER RIEUL → HANGUL CHOSEONG RIEUL # 
+11AF ; 1105 ;  SL      # ( ᆯ → ᄅ ) HANGUL JONGSEONG RIEUL → HANGUL CHOSEONG RIEUL      # 
+
+A964 ; 1105 1100 ;     SL      # ( ꥤ → ᄅᄀ ) HANGUL CHOSEONG RIEUL-KIYEOK → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK     # 
+11B0 ; 1105 1100 ;     SL      # ( ᆰ → ᄅᄀ ) HANGUL JONGSEONG RIEUL-KIYEOK → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK    # →ᆯᆨ→
+313A ; 1105 1100 ;     SL      # ( ㄺ → ᄅᄀ ) HANGUL LETTER RIEUL-KIYEOK → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK       # →ᆰ→→ᆯᆨ→
+
+A965 ; 1105 1100 1100 ;        SL      # ( ꥥ → ᄅᄀᄀ ) HANGUL CHOSEONG RIEUL-SSANGKIYEOK → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG KIYEOK     # 
+D7D5 ; 1105 1100 1100 ;        SL      # ( ퟕ → ᄅᄀᄀ ) HANGUL JONGSEONG RIEUL-SSANGKIYEOK → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG KIYEOK    # →ᆯᆨᆨ→
+
+11CC ; 1105 1100 1109 ;        SL      # ( ᇌ → ᄅᄀᄉ ) HANGUL JONGSEONG RIEUL-KIYEOK-SIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG SIOS      # →ᆯᆨᆺ→
+3169 ; 1105 1100 1109 ;        SL      # ( ㅩ → ᄅᄀᄉ ) HANGUL LETTER RIEUL-KIYEOK-SIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG SIOS # →ᇌ→→ᆯᆨᆺ→
+
+D7D6 ; 1105 1100 1112 ;        SL      # ( ퟖ → ᄅᄀᄒ ) HANGUL JONGSEONG RIEUL-KIYEOK-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG HIEUH    # →ᆯᆨᇂ→
+
+1118 ; 1105 1102 ;     SL      # ( ᄘ → ᄅᄂ ) HANGUL CHOSEONG RIEUL-NIEUN → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG NIEUN       # 
+11CD ; 1105 1102 ;     SL      # ( ᇍ → ᄅᄂ ) HANGUL JONGSEONG RIEUL-NIEUN → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG NIEUN      # →ᄘ→
+
+A966 ; 1105 1103 ;     SL      # ( ꥦ → ᄅᄃ ) HANGUL CHOSEONG RIEUL-TIKEUT → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG TIKEUT     # 
+11CE ; 1105 1103 ;     SL      # ( ᇎ → ᄅᄃ ) HANGUL JONGSEONG RIEUL-TIKEUT → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG TIKEUT    # →ᆯᆮ→
+316A ; 1105 1103 ;     SL      # ( ㅪ → ᄅᄃ ) HANGUL LETTER RIEUL-TIKEUT → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG TIKEUT       # →ᇎ→→ᆯᆮ→
+
+A967 ; 1105 1103 1103 ;        SL      # ( ꥧ → ᄅᄃᄃ ) HANGUL CHOSEONG RIEUL-SSANGTIKEUT → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG TIKEUT     # 
+
+11CF ; 1105 1103 1112 ;        SL      # ( ᇏ → ᄅᄃᄒ ) HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG HIEUH    # →ᆯᆮᇂ→
+
+1119 ; 1105 1105 ;     SL      # ( ᄙ → ᄅᄅ ) HANGUL CHOSEONG SSANGRIEUL → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG RIEUL        # 
+11D0 ; 1105 1105 ;     SL      # ( ᇐ → ᄅᄅ ) HANGUL JONGSEONG SSANGRIEUL → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG RIEUL       # →ᄙ→
+
+D7D7 ; 1105 1105 110F ;        SL      # ( ퟗ → ᄅᄅᄏ ) HANGUL JONGSEONG SSANGRIEUL-KHIEUKH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KHIEUKH   # →ᆯᆯᆿ→
+
+A968 ; 1105 1106 ;     SL      # ( ꥨ → ᄅᄆ ) HANGUL CHOSEONG RIEUL-MIEUM → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG MIEUM       # 
+11B1 ; 1105 1106 ;     SL      # ( ᆱ → ᄅᄆ ) HANGUL JONGSEONG RIEUL-MIEUM → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG MIEUM      # →ᆯᆷ→
+313B ; 1105 1106 ;     SL      # ( ㄻ → ᄅᄆ ) HANGUL LETTER RIEUL-MIEUM → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG MIEUM # →ᆱ→→ᆯᆷ→
+
+11D1 ; 1105 1106 1100 ;        SL      # ( ᇑ → ᄅᄆᄀ ) HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG KIYEOK    # →ᆯᆷᆨ→
+
+11D2 ; 1105 1106 1109 ;        SL      # ( ᇒ → ᄅᄆᄉ ) HANGUL JONGSEONG RIEUL-MIEUM-SIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG SIOS        # →ᆯᆷᆺ→
+
+D7D8 ; 1105 1106 1112 ;        SL      # ( ퟘ → ᄅᄆᄒ ) HANGUL JONGSEONG RIEUL-MIEUM-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG HIEUH      # →ᆯᆷᇂ→
+
+A969 ; 1105 1107 ;     SL      # ( ꥩ → ᄅᄇ ) HANGUL CHOSEONG RIEUL-PIEUP → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP       # 
+11B2 ; 1105 1107 ;     SL      # ( ᆲ → ᄅᄇ ) HANGUL JONGSEONG RIEUL-PIEUP → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP      # →ᆯᆸ→
+313C ; 1105 1107 ;     SL      # ( ㄼ → ᄅᄇ ) HANGUL LETTER RIEUL-PIEUP → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP # →ᆲ→→ᆯᆸ→
+
+D7D9 ; 1105 1107 1103 ;        SL      # ( ퟙ → ᄅᄇᄃ ) HANGUL JONGSEONG RIEUL-PIEUP-TIKEUT → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG TIKEUT    # →ᆯᆸᆮ→
+
+A96A ; 1105 1107 1107 ;        SL      # ( ꥪ → ᄅᄇᄇ ) HANGUL CHOSEONG RIEUL-SSANGPIEUP → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PIEUP        # 
+
+11D3 ; 1105 1107 1109 ;        SL      # ( ᇓ → ᄅᄇᄉ ) HANGUL JONGSEONG RIEUL-PIEUP-SIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS        # →ᆯᆸᆺ→
+316B ; 1105 1107 1109 ;        SL      # ( ㅫ → ᄅᄇᄉ ) HANGUL LETTER RIEUL-PIEUP-SIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS   # →ᇓ→→ᆯᆸᆺ→
+
+A96B ; 1105 1107 110B ;        SL      # ( ꥫ → ᄅᄇᄋ ) HANGUL CHOSEONG RIEUL-KAPYEOUNPIEUP → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG     # 
+11D5 ; 1105 1107 110B ;        SL      # ( ᇕ → ᄅᄇᄋ ) HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG    # →ᆯᆸᆼ→
+
+D7DA ; 1105 1107 1111 ;        SL      # ( ퟚ → ᄅᄇᄑ ) HANGUL JONGSEONG RIEUL-PIEUP-PHIEUPH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PHIEUPH  # →ᆯᆸᇁ→
+
+11D4 ; 1105 1107 1112 ;        SL      # ( ᇔ → ᄅᄇᄒ ) HANGUL JONGSEONG RIEUL-PIEUP-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG HIEUH      # →ᆯᆸᇂ→
+
+A96C ; 1105 1109 ;     SL      # ( ꥬ → ᄅᄉ ) HANGUL CHOSEONG RIEUL-SIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG SIOS # 
+11B3 ; 1105 1109 ;     SL      # ( ᆳ → ᄅᄉ ) HANGUL JONGSEONG RIEUL-SIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG SIOS        # →ᆯᆺ→
+313D ; 1105 1109 ;     SL      # ( ㄽ → ᄅᄉ ) HANGUL LETTER RIEUL-SIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG SIOS   # →ᆳ→→ᆯᆺ→
+
+11D6 ; 1105 1109 1109 ;        SL      # ( ᇖ → ᄅᄉᄉ ) HANGUL JONGSEONG RIEUL-SSANGSIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS  # →ᆯᆺᆺ→
+
+111B ; 1105 110B ;     SL      # ( ᄛ → ᄅᄋ ) HANGUL CHOSEONG KAPYEOUNRIEUL → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG IEUNG     # 
+D7DD ; 1105 110B ;     SL      # ( ퟝ → ᄅᄋ ) HANGUL JONGSEONG KAPYEOUNRIEUL → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG IEUNG    # →ᆯᆼ→
+
+A96D ; 1105 110C ;     SL      # ( ꥭ → ᄅᄌ ) HANGUL CHOSEONG RIEUL-CIEUC → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG CIEUC       # 
+
+A96E ; 1105 110F ;     SL      # ( ꥮ → ᄅᄏ ) HANGUL CHOSEONG RIEUL-KHIEUKH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KHIEUKH   # 
+11D8 ; 1105 110F ;     SL      # ( ᇘ → ᄅᄏ ) HANGUL JONGSEONG RIEUL-KHIEUKH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KHIEUKH  # →ᆯᆿ→
+
+11B4 ; 1105 1110 ;     SL      # ( ᆴ → ᄅᄐ ) HANGUL JONGSEONG RIEUL-THIEUTH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG THIEUTH  # →ᆯᇀ→
+313E ; 1105 1110 ;     SL      # ( ㄾ → ᄅᄐ ) HANGUL LETTER RIEUL-THIEUTH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG THIEUTH     # →ᆴ→→ᆯᇀ→
+
+11B5 ; 1105 1111 ;     SL      # ( ᆵ → ᄅᄑ ) HANGUL JONGSEONG RIEUL-PHIEUPH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PHIEUPH  # →ᆯᇁ→
+313F ; 1105 1111 ;     SL      # ( ㄿ → ᄅᄑ ) HANGUL LETTER RIEUL-PHIEUPH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PHIEUPH     # →ᆵ→→ᆯᇁ→
+
+111A ; 1105 1112 ;     SL      # ( ᄚ → ᄅᄒ ) HANGUL CHOSEONG RIEUL-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG HIEUH       # 
+3140 ; 1105 1112 ;     SL      # ( ㅀ → ᄅᄒ ) HANGUL LETTER RIEUL-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG HIEUH # →ᄚ→
+113B ; 1105 1112 ;     SL      # ( ᄻ → ᄅᄒ ) HANGUL CHOSEONG SIOS-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG HIEUH        # →ᄚ→
+11B6 ; 1105 1112 ;     SL      # ( ᆶ → ᄅᄒ ) HANGUL JONGSEONG RIEUL-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG HIEUH      # →ᄚ→
+D7F2 ; 1105 1112 ;     SL      # ( ퟲ → ᄅᄒ ) HANGUL JONGSEONG SIOS-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG HIEUH       # →ᆺᇂ→→ᄉᄒ→→ᄻ→→ᄚ→
+
+11D7 ; 1105 1140 ;     SL      # ( ᇗ → ᄅᅀ ) HANGUL JONGSEONG RIEUL-PANSIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PANSIOS  # →ᆯᇫ→
+316C ; 1105 1140 ;     SL      # ( ㅬ → ᄅᅀ ) HANGUL LETTER RIEUL-PANSIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PANSIOS     # →ᇗ→→ᆯᇫ→
+
+D7DB ; 1105 114C ;     SL      # ( ퟛ → ᄅᅌ ) HANGUL JONGSEONG RIEUL-YESIEUNG → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG YESIEUNG        # →ᆯᇰ→
+
+11D9 ; 1105 1159 ;     SL      # ( ᇙ → ᄅᅙ ) HANGUL JONGSEONG RIEUL-YEORINHIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG YEORINHIEUH  # →ᆯᇹ→
+316D ; 1105 1159 ;     SL      # ( ㅭ → ᄅᅙ ) HANGUL LETTER RIEUL-YEORINHIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG YEORINHIEUH     # →ᇙ→→ᆯᇹ→
+
+D7DC ; 1105 1159 1112 ;        SL      # ( ퟜ → ᄅᅙᄒ ) HANGUL JONGSEONG RIEUL-YEORINHIEUH-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG YEORINHIEUH, HANGUL CHOSEONG HIEUH  # →ᆯᇹᇂ→
+
+3141 ; 1106 ;  SL      # ( ㅁ → ᄆ ) HANGUL LETTER MIEUM → HANGUL CHOSEONG MIEUM # 
+11B7 ; 1106 ;  SL      # ( ᆷ → ᄆ ) HANGUL JONGSEONG MIEUM → HANGUL CHOSEONG MIEUM      # 
+
+A96F ; 1106 1100 ;     SL      # ( ꥯ → ᄆᄀ ) HANGUL CHOSEONG MIEUM-KIYEOK → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG KIYEOK     # 
+11DA ; 1106 1100 ;     SL      # ( ᇚ → ᄆᄀ ) HANGUL JONGSEONG MIEUM-KIYEOK → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG KIYEOK    # →ᆷᆨ→
+
+D7DE ; 1106 1102 ;     SL      # ( ퟞ → ᄆᄂ ) HANGUL JONGSEONG MIEUM-NIEUN → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG NIEUN      # →ᆷᆫ→
+
+D7DF ; 1106 1102 1102 ;        SL      # ( ퟟ → ᄆᄂᄂ ) HANGUL JONGSEONG MIEUM-SSANGNIEUN → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG NIEUN       # →ᆷᆫᆫ→
+
+A970 ; 1106 1103 ;     SL      # ( ꥰ → ᄆᄃ ) HANGUL CHOSEONG MIEUM-TIKEUT → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG TIKEUT     # 
+
+11DB ; 1106 1105 ;     SL      # ( ᇛ → ᄆᄅ ) HANGUL JONGSEONG MIEUM-RIEUL → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG RIEUL      # →ᆷᆯ→
+
+D7E0 ; 1106 1106 ;     SL      # ( ퟠ → ᄆᄆ ) HANGUL JONGSEONG SSANGMIEUM → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG MIEUM       # →ᆷᆷ→
+
+111C ; 1106 1107 ;     SL      # ( ᄜ → ᄆᄇ ) HANGUL CHOSEONG MIEUM-PIEUP → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG PIEUP       # 
+316E ; 1106 1107 ;     SL      # ( ㅮ → ᄆᄇ ) HANGUL LETTER MIEUM-PIEUP → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG PIEUP # →ᄜ→
+11DC ; 1106 1107 ;     SL      # ( ᇜ → ᄆᄇ ) HANGUL JONGSEONG MIEUM-PIEUP → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG PIEUP      # →ᄜ→
+
+D7E1 ; 1106 1107 1109 ;        SL      # ( ퟡ → ᄆᄇᄉ ) HANGUL JONGSEONG MIEUM-PIEUP-SIOS → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS        # →ᆷᆸᆺ→
+
+A971 ; 1106 1109 ;     SL      # ( ꥱ → ᄆᄉ ) HANGUL CHOSEONG MIEUM-SIOS → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG SIOS # 
+11DD ; 1106 1109 ;     SL      # ( ᇝ → ᄆᄉ ) HANGUL JONGSEONG MIEUM-SIOS → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG SIOS        # →ᆷᆺ→
+316F ; 1106 1109 ;     SL      # ( ㅯ → ᄆᄉ ) HANGUL LETTER MIEUM-SIOS → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG SIOS   # →ᇝ→→ᆷᆺ→
+
+11DE ; 1106 1109 1109 ;        SL      # ( ᇞ → ᄆᄉᄉ ) HANGUL JONGSEONG MIEUM-SSANGSIOS → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS  # →ᆷᆺᆺ→
+
+111D ; 1106 110B ;     SL      # ( ᄝ → ᄆᄋ ) HANGUL CHOSEONG KAPYEOUNMIEUM → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG IEUNG     # 
+3171 ; 1106 110B ;     SL      # ( ㅱ → ᄆᄋ ) HANGUL LETTER KAPYEOUNMIEUM → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG IEUNG       # →ᄝ→
+11E2 ; 1106 110B ;     SL      # ( ᇢ → ᄆᄋ ) HANGUL JONGSEONG KAPYEOUNMIEUM → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG IEUNG    # →ᄝ→
+
+D7E2 ; 1106 110C ;     SL      # ( ퟢ → ᄆᄌ ) HANGUL JONGSEONG MIEUM-CIEUC → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG CIEUC      # →ᆷᆽ→
+
+11E0 ; 1106 110E ;     SL      # ( ᇠ → ᄆᄎ ) HANGUL JONGSEONG MIEUM-CHIEUCH → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG CHIEUCH  # →ᆷᆾ→
+
+11E1 ; 1106 1112 ;     SL      # ( ᇡ → ᄆᄒ ) HANGUL JONGSEONG MIEUM-HIEUH → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG HIEUH      # →ᆷᇂ→
+
+11DF ; 1106 1140 ;     SL      # ( ᇟ → ᄆᅀ ) HANGUL JONGSEONG MIEUM-PANSIOS → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG PANSIOS  # →ᆷᇫ→
+3170 ; 1106 1140 ;     SL      # ( ㅰ → ᄆᅀ ) HANGUL LETTER MIEUM-PANSIOS → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG PANSIOS     # →ᇟ→→ᆷᇫ→
+
+3142 ; 1107 ;  SL      # ( ㅂ → ᄇ ) HANGUL LETTER PIEUP → HANGUL CHOSEONG PIEUP # 
+11B8 ; 1107 ;  SL      # ( ᆸ → ᄇ ) HANGUL JONGSEONG PIEUP → HANGUL CHOSEONG PIEUP      # 
+
+111E ; 1107 1100 ;     SL      # ( ᄞ → ᄇᄀ ) HANGUL CHOSEONG PIEUP-KIYEOK → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG KIYEOK     # 
+3172 ; 1107 1100 ;     SL      # ( ㅲ → ᄇᄀ ) HANGUL LETTER PIEUP-KIYEOK → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG KIYEOK       # →ᄞ→
+
+111F ; 1107 1102 ;     SL      # ( ᄟ → ᄇᄂ ) HANGUL CHOSEONG PIEUP-NIEUN → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG NIEUN       # 
+
+1120 ; 1107 1103 ;     SL      # ( ᄠ → ᄇᄃ ) HANGUL CHOSEONG PIEUP-TIKEUT → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG TIKEUT     # 
+3173 ; 1107 1103 ;     SL      # ( ㅳ → ᄇᄃ ) HANGUL LETTER PIEUP-TIKEUT → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG TIKEUT       # →ᄠ→
+D7E3 ; 1107 1103 ;     SL      # ( ퟣ → ᄇᄃ ) HANGUL JONGSEONG PIEUP-TIKEUT → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG TIKEUT    # →ᆸᆮ→
+
+11E3 ; 1107 1105 ;     SL      # ( ᇣ → ᄇᄅ ) HANGUL JONGSEONG PIEUP-RIEUL → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG RIEUL      # →ᆸᆯ→
+
+D7E4 ; 1107 1105 1111 ;        SL      # ( ퟤ → ᄇᄅᄑ ) HANGUL JONGSEONG PIEUP-RIEUL-PHIEUPH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PHIEUPH  # →ᆸᆯᇁ→
+
+D7E5 ; 1107 1106 ;     SL      # ( ퟥ → ᄇᄆ ) HANGUL JONGSEONG PIEUP-MIEUM → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG MIEUM      # →ᆸᆷ→
+
+1108 ; 1107 1107 ;     SL      # ( ᄈ → ᄇᄇ ) HANGUL CHOSEONG SSANGPIEUP → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PIEUP        # 
+3143 ; 1107 1107 ;     SL      # ( ㅃ → ᄇᄇ ) HANGUL LETTER SSANGPIEUP → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PIEUP  # →ᄈ→
+D7E6 ; 1107 1107 ;     SL      # ( ퟦ → ᄇᄇ ) HANGUL JONGSEONG SSANGPIEUP → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PIEUP       # →ᆸᆸ→
+
+112C ; 1107 1107 110B ;        SL      # ( ᄬ → ᄇᄇᄋ ) HANGUL CHOSEONG KAPYEOUNSSANGPIEUP → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG      # 
+3179 ; 1107 1107 110B ;        SL      # ( ㅹ → ᄇᄇᄋ ) HANGUL LETTER KAPYEOUNSSANGPIEUP → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG        # →ᄬ→
+
+1121 ; 1107 1109 ;     SL      # ( ᄡ → ᄇᄉ ) HANGUL CHOSEONG PIEUP-SIOS → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS # 
+3144 ; 1107 1109 ;     SL      # ( ㅄ → ᄇᄉ ) HANGUL LETTER PIEUP-SIOS → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS   # →ᄡ→
+11B9 ; 1107 1109 ;     SL      # ( ᆹ → ᄇᄉ ) HANGUL JONGSEONG PIEUP-SIOS → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS        # →ᄡ→
+
+1122 ; 1107 1109 1100 ;        SL      # ( ᄢ → ᄇᄉᄀ ) HANGUL CHOSEONG PIEUP-SIOS-KIYEOK → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK       # 
+3174 ; 1107 1109 1100 ;        SL      # ( ㅴ → ᄇᄉᄀ ) HANGUL LETTER PIEUP-SIOS-KIYEOK → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK # →ᄢ→
+
+1123 ; 1107 1109 1103 ;        SL      # ( ᄣ → ᄇᄉᄃ ) HANGUL CHOSEONG PIEUP-SIOS-TIKEUT → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG TIKEUT       # 
+3175 ; 1107 1109 1103 ;        SL      # ( ㅵ → ᄇᄉᄃ ) HANGUL LETTER PIEUP-SIOS-TIKEUT → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG TIKEUT # →ᄣ→
+D7E7 ; 1107 1109 1103 ;        SL      # ( ퟧ → ᄇᄉᄃ ) HANGUL JONGSEONG PIEUP-SIOS-TIKEUT → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG TIKEUT      # →ᆸᆺᆮ→
+
+1124 ; 1107 1109 1107 ;        SL      # ( ᄤ → ᄇᄉᄇ ) HANGUL CHOSEONG PIEUP-SIOS-PIEUP → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PIEUP # 
+
+1125 ; 1107 1109 1109 ;        SL      # ( ᄥ → ᄇᄉᄉ ) HANGUL CHOSEONG PIEUP-SSANGSIOS → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS   # 
+
+1126 ; 1107 1109 110C ;        SL      # ( ᄦ → ᄇᄉᄌ ) HANGUL CHOSEONG PIEUP-SIOS-CIEUC → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG CIEUC # 
+
+A972 ; 1107 1109 1110 ;        SL      # ( ꥲ → ᄇᄉᄐ ) HANGUL CHOSEONG PIEUP-SIOS-THIEUTH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG THIEUTH     # 
+
+112B ; 1107 110B ;     SL      # ( ᄫ → ᄇᄋ ) HANGUL CHOSEONG KAPYEOUNPIEUP → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG     # 
+3178 ; 1107 110B ;     SL      # ( ㅸ → ᄇᄋ ) HANGUL LETTER KAPYEOUNPIEUP → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG       # →ᄫ→
+11E6 ; 1107 110B ;     SL      # ( ᇦ → ᄇᄋ ) HANGUL JONGSEONG KAPYEOUNPIEUP → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG    # →ᄫ→
+
+1127 ; 1107 110C ;     SL      # ( ᄧ → ᄇᄌ ) HANGUL CHOSEONG PIEUP-CIEUC → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG CIEUC       # 
+3176 ; 1107 110C ;     SL      # ( ㅶ → ᄇᄌ ) HANGUL LETTER PIEUP-CIEUC → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG CIEUC # →ᄧ→
+D7E8 ; 1107 110C ;     SL      # ( ퟨ → ᄇᄌ ) HANGUL JONGSEONG PIEUP-CIEUC → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG CIEUC      # →ᆸᆽ→
+
+1128 ; 1107 110E ;     SL      # ( ᄨ → ᄇᄎ ) HANGUL CHOSEONG PIEUP-CHIEUCH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG CHIEUCH   # 
+D7E9 ; 1107 110E ;     SL      # ( ퟩ → ᄇᄎ ) HANGUL JONGSEONG PIEUP-CHIEUCH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG CHIEUCH  # →ᆸᆾ→
+
+A973 ; 1107 110F ;     SL      # ( ꥳ → ᄇᄏ ) HANGUL CHOSEONG PIEUP-KHIEUKH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG KHIEUKH   # 
+
+1129 ; 1107 1110 ;     SL      # ( ᄩ → ᄇᄐ ) HANGUL CHOSEONG PIEUP-THIEUTH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG THIEUTH   # 
+3177 ; 1107 1110 ;     SL      # ( ㅷ → ᄇᄐ ) HANGUL LETTER PIEUP-THIEUTH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG THIEUTH     # →ᄩ→
+
+112A ; 1107 1111 ;     SL      # ( ᄪ → ᄇᄑ ) HANGUL CHOSEONG PIEUP-PHIEUPH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PHIEUPH   # 
+11E4 ; 1107 1111 ;     SL      # ( ᇤ → ᄇᄑ ) HANGUL JONGSEONG PIEUP-PHIEUPH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PHIEUPH  # →ᆸᇁ→
+
+A974 ; 1107 1112 ;     SL      # ( ꥴ → ᄇᄒ ) HANGUL CHOSEONG PIEUP-HIEUH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG HIEUH       # 
+11E5 ; 1107 1112 ;     SL      # ( ᇥ → ᄇᄒ ) HANGUL JONGSEONG PIEUP-HIEUH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG HIEUH      # →ᆸᇂ→
+
+3145 ; 1109 ;  SL      # ( ㅅ → ᄉ ) HANGUL LETTER SIOS → HANGUL CHOSEONG SIOS   # 
+11BA ; 1109 ;  SL      # ( ᆺ → ᄉ ) HANGUL JONGSEONG SIOS → HANGUL CHOSEONG SIOS        # 
+
+112D ; 1109 1100 ;     SL      # ( ᄭ → ᄉᄀ ) HANGUL CHOSEONG SIOS-KIYEOK → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK       # 
+317A ; 1109 1100 ;     SL      # ( ㅺ → ᄉᄀ ) HANGUL LETTER SIOS-KIYEOK → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK # →ᄭ→
+11E7 ; 1109 1100 ;     SL      # ( ᇧ → ᄉᄀ ) HANGUL JONGSEONG SIOS-KIYEOK → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK      # →ᄭ→
+
+112E ; 1109 1102 ;     SL      # ( ᄮ → ᄉᄂ ) HANGUL CHOSEONG SIOS-NIEUN → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG NIEUN # 
+317B ; 1109 1102 ;     SL      # ( ㅻ → ᄉᄂ ) HANGUL LETTER SIOS-NIEUN → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG NIEUN   # →ᄮ→
+
+112F ; 1109 1103 ;     SL      # ( ᄯ → ᄉᄃ ) HANGUL CHOSEONG SIOS-TIKEUT → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG TIKEUT       # 
+317C ; 1109 1103 ;     SL      # ( ㅼ → ᄉᄃ ) HANGUL LETTER SIOS-TIKEUT → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG TIKEUT # →ᄯ→
+11E8 ; 1109 1103 ;     SL      # ( ᇨ → ᄉᄃ ) HANGUL JONGSEONG SIOS-TIKEUT → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG TIKEUT      # →ᄯ→
+
+1130 ; 1109 1105 ;     SL      # ( ᄰ → ᄉᄅ ) HANGUL CHOSEONG SIOS-RIEUL → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG RIEUL # 
+11E9 ; 1109 1105 ;     SL      # ( ᇩ → ᄉᄅ ) HANGUL JONGSEONG SIOS-RIEUL → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG RIEUL        # →ᄰ→
+
+1131 ; 1109 1106 ;     SL      # ( ᄱ → ᄉᄆ ) HANGUL CHOSEONG SIOS-MIEUM → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG MIEUM # 
+D7EA ; 1109 1106 ;     SL      # ( ퟪ → ᄉᄆ ) HANGUL JONGSEONG SIOS-MIEUM → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG MIEUM        # →ᆺᆷ→
+
+1132 ; 1109 1107 ;     SL      # ( ᄲ → ᄉᄇ ) HANGUL CHOSEONG SIOS-PIEUP → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PIEUP # 
+317D ; 1109 1107 ;     SL      # ( ㅽ → ᄉᄇ ) HANGUL LETTER SIOS-PIEUP → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PIEUP   # →ᄲ→
+11EA ; 1109 1107 ;     SL      # ( ᇪ → ᄉᄇ ) HANGUL JONGSEONG SIOS-PIEUP → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PIEUP        # →ᄲ→
+
+1133 ; 1109 1107 1100 ;        SL      # ( ᄳ → ᄉᄇᄀ ) HANGUL CHOSEONG SIOS-PIEUP-KIYEOK → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG KIYEOK       # 
+
+D7EB ; 1109 1107 110B ;        SL      # ( ퟫ → ᄉᄇᄋ ) HANGUL JONGSEONG SIOS-KAPYEOUNPIEUP → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG      # →ᆺᆸᆼ→
+
+110A ; 1109 1109 ;     SL      # ( ᄊ → ᄉᄉ ) HANGUL CHOSEONG SSANGSIOS → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS   # 
+3146 ; 1109 1109 ;     SL      # ( ㅆ → ᄉᄉ ) HANGUL LETTER SSANGSIOS → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS     # →ᄊ→
+11BB ; 1109 1109 ;     SL      # ( ᆻ → ᄉᄉ ) HANGUL JONGSEONG SSANGSIOS → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS  # →ᄊ→
+
+D7EC ; 1109 1109 1100 ;        SL      # ( ퟬ → ᄉᄉᄀ ) HANGUL JONGSEONG SSANGSIOS-KIYEOK → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK        # →ᆺᆺᆨ→
+
+D7ED ; 1109 1109 1103 ;        SL      # ( ퟭ → ᄉᄉᄃ ) HANGUL JONGSEONG SSANGSIOS-TIKEUT → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG TIKEUT        # →ᆺᆺᆮ→
+
+A975 ; 1109 1109 1107 ;        SL      # ( ꥵ → ᄉᄉᄇ ) HANGUL CHOSEONG SSANGSIOS-PIEUP → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PIEUP   # 
+
+1134 ; 1109 1109 1109 ;        SL      # ( ᄴ → ᄉᄉᄉ ) HANGUL CHOSEONG SIOS-SSANGSIOS → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS     # 
+
+1135 ; 1109 110B ;     SL      # ( ᄵ → ᄉᄋ ) HANGUL CHOSEONG SIOS-IEUNG → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG IEUNG # 
+
+1136 ; 1109 110C ;     SL      # ( ᄶ → ᄉᄌ ) HANGUL CHOSEONG SIOS-CIEUC → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG CIEUC # 
+317E ; 1109 110C ;     SL      # ( ㅾ → ᄉᄌ ) HANGUL LETTER SIOS-CIEUC → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG CIEUC   # →ᄶ→
+D7EF ; 1109 110C ;     SL      # ( ퟯ → ᄉᄌ ) HANGUL JONGSEONG SIOS-CIEUC → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG CIEUC        # →ᆺᆽ→
+
+1137 ; 1109 110E ;     SL      # ( ᄷ → ᄉᄎ ) HANGUL CHOSEONG SIOS-CHIEUCH → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG CHIEUCH     # 
+D7F0 ; 1109 110E ;     SL      # ( ퟰ → ᄉᄎ ) HANGUL JONGSEONG SIOS-CHIEUCH → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG CHIEUCH    # →ᆺᆾ→
+
+1138 ; 1109 110F ;     SL      # ( ᄸ → ᄉᄏ ) HANGUL CHOSEONG SIOS-KHIEUKH → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KHIEUKH     # 
+
+1139 ; 1109 1110 ;     SL      # ( ᄹ → ᄉᄐ ) HANGUL CHOSEONG SIOS-THIEUTH → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG THIEUTH     # 
+D7F1 ; 1109 1110 ;     SL      # ( ퟱ → ᄉᄐ ) HANGUL JONGSEONG SIOS-THIEUTH → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG THIEUTH    # →ᆺᇀ→
+
+113A ; 1109 1111 ;     SL      # ( ᄺ → ᄉᄑ ) HANGUL CHOSEONG SIOS-PHIEUPH → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PHIEUPH     # 
+
+D7EE ; 1109 1140 ;     SL      # ( ퟮ → ᄉᅀ ) HANGUL JONGSEONG SIOS-PANSIOS → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PANSIOS    # →ᆺᇫ→
+
+3147 ; 110B ;  SL      # ( ㅇ → ᄋ ) HANGUL LETTER IEUNG → HANGUL CHOSEONG IEUNG # 
+11BC ; 110B ;  SL      # ( ᆼ → ᄋ ) HANGUL JONGSEONG IEUNG → HANGUL CHOSEONG IEUNG      # 
+
+1141 ; 110B 1100 ;     SL      # ( ᅁ → ᄋᄀ ) HANGUL CHOSEONG IEUNG-KIYEOK → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG KIYEOK     # 
+11EC ; 110B 1100 ;     SL      # ( ᇬ → ᄋᄀ ) HANGUL JONGSEONG IEUNG-KIYEOK → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG KIYEOK    # →ᅁ→
+
+11ED ; 110B 1100 1100 ;        SL      # ( ᇭ → ᄋᄀᄀ ) HANGUL JONGSEONG IEUNG-SSANGKIYEOK → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG KIYEOK    # →ᆼᆨᆨ→
+
+1142 ; 110B 1103 ;     SL      # ( ᅂ → ᄋᄃ ) HANGUL CHOSEONG IEUNG-TIKEUT → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG TIKEUT     # 
+
+A976 ; 110B 1105 ;     SL      # ( ꥶ → ᄋᄅ ) HANGUL CHOSEONG IEUNG-RIEUL → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG RIEUL       # 
+
+1143 ; 110B 1106 ;     SL      # ( ᅃ → ᄋᄆ ) HANGUL CHOSEONG IEUNG-MIEUM → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG MIEUM       # 
+
+1144 ; 110B 1107 ;     SL      # ( ᅄ → ᄋᄇ ) HANGUL CHOSEONG IEUNG-PIEUP → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG PIEUP       # 
+
+1145 ; 110B 1109 ;     SL      # ( ᅅ → ᄋᄉ ) HANGUL CHOSEONG IEUNG-SIOS → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG SIOS # 
+11F1 ; 110B 1109 ;     SL      # ( ᇱ → ᄋᄉ ) HANGUL JONGSEONG YESIEUNG-SIOS → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG SIOS     # →ᅅ→
+3182 ; 110B 1109 ;     SL      # ( ㆂ → ᄋᄉ ) HANGUL LETTER YESIEUNG-SIOS → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG SIOS        # →ᇱ→→ᅅ→
+
+1147 ; 110B 110B ;     SL      # ( ᅇ → ᄋᄋ ) HANGUL CHOSEONG SSANGIEUNG → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG IEUNG        # 
+3180 ; 110B 110B ;     SL      # ( ㆀ → ᄋᄋ ) HANGUL LETTER SSANGIEUNG → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG IEUNG  # →ᅇ→
+11EE ; 110B 110B ;     SL      # ( ᇮ → ᄋᄋ ) HANGUL JONGSEONG SSANGIEUNG → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG IEUNG       # →ᅇ→
+
+1148 ; 110B 110C ;     SL      # ( ᅈ → ᄋᄌ ) HANGUL CHOSEONG IEUNG-CIEUC → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG CIEUC       # 
+
+1149 ; 110B 110E ;     SL      # ( ᅉ → ᄋᄎ ) HANGUL CHOSEONG IEUNG-CHIEUCH → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG CHIEUCH   # 
+
+11EF ; 110B 110F ;     SL      # ( ᇯ → ᄋᄏ ) HANGUL JONGSEONG IEUNG-KHIEUKH → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG KHIEUKH  # →ᆼᆿ→
+
+114A ; 110B 1110 ;     SL      # ( ᅊ → ᄋᄐ ) HANGUL CHOSEONG IEUNG-THIEUTH → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG THIEUTH   # 
+
+114B ; 110B 1111 ;     SL      # ( ᅋ → ᄋᄑ ) HANGUL CHOSEONG IEUNG-PHIEUPH → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG PHIEUPH   # 
+
+A977 ; 110B 1112 ;     SL      # ( ꥷ → ᄋᄒ ) HANGUL CHOSEONG IEUNG-HIEUH → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG HIEUH       # 
+
+1146 ; 110B 1140 ;     SL      # ( ᅆ → ᄋᅀ ) HANGUL CHOSEONG IEUNG-PANSIOS → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG PANSIOS   # 
+11F2 ; 110B 1140 ;     SL      # ( ᇲ → ᄋᅀ ) HANGUL JONGSEONG YESIEUNG-PANSIOS → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG PANSIOS       # →ᅆ→
+3183 ; 110B 1140 ;     SL      # ( ㆃ → ᄋᅀ ) HANGUL LETTER YESIEUNG-PANSIOS → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG PANSIOS  # →ᇲ→→ᅆ→
+
+3148 ; 110C ;  SL      # ( ㅈ → ᄌ ) HANGUL LETTER CIEUC → HANGUL CHOSEONG CIEUC # 
+11BD ; 110C ;  SL      # ( ᆽ → ᄌ ) HANGUL JONGSEONG CIEUC → HANGUL CHOSEONG CIEUC      # 
+
+D7F7 ; 110C 1107 ;     SL      # ( ퟷ → ᄌᄇ ) HANGUL JONGSEONG CIEUC-PIEUP → HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG PIEUP      # →ᆽᆸ→
+
+D7F8 ; 110C 1107 1107 ;        SL      # ( ퟸ → ᄌᄇᄇ ) HANGUL JONGSEONG CIEUC-SSANGPIEUP → HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PIEUP       # →ᆽᆸᆸ→
+
+114D ; 110C 110B ;     SL      # ( ᅍ → ᄌᄋ ) HANGUL CHOSEONG CIEUC-IEUNG → HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG IEUNG       # 
+
+110D ; 110C 110C ;     SL      # ( ᄍ → ᄌᄌ ) HANGUL CHOSEONG SSANGCIEUC → HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG CIEUC        # 
+3149 ; 110C 110C ;     SL      # ( ㅉ → ᄌᄌ ) HANGUL LETTER SSANGCIEUC → HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG CIEUC  # →ᄍ→
+D7F9 ; 110C 110C ;     SL      # ( ퟹ → ᄌᄌ ) HANGUL JONGSEONG SSANGCIEUC → HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG CIEUC       # →ᆽᆽ→
+
+A978 ; 110C 110C 1112 ;        SL      # ( ꥸ → ᄌᄌᄒ ) HANGUL CHOSEONG SSANGCIEUC-HIEUH → HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG HIEUH        # 
+
+314A ; 110E ;  SL      # ( ㅊ → ᄎ ) HANGUL LETTER CHIEUCH → HANGUL CHOSEONG CHIEUCH     # 
+11BE ; 110E ;  SL      # ( ᆾ → ᄎ ) HANGUL JONGSEONG CHIEUCH → HANGUL CHOSEONG CHIEUCH  # 
+
+1152 ; 110E 110F ;     SL      # ( ᅒ → ᄎᄏ ) HANGUL CHOSEONG CHIEUCH-KHIEUKH → HANGUL CHOSEONG CHIEUCH, HANGUL CHOSEONG KHIEUKH       # 
+
+1153 ; 110E 1112 ;     SL      # ( ᅓ → ᄎᄒ ) HANGUL CHOSEONG CHIEUCH-HIEUH → HANGUL CHOSEONG CHIEUCH, HANGUL CHOSEONG HIEUH   # 
+
+314B ; 110F ;  SL      # ( ㅋ → ᄏ ) HANGUL LETTER KHIEUKH → HANGUL CHOSEONG KHIEUKH     # 
+11BF ; 110F ;  SL      # ( ᆿ → ᄏ ) HANGUL JONGSEONG KHIEUKH → HANGUL CHOSEONG KHIEUKH  # 
+
+314C ; 1110 ;  SL      # ( ㅌ → ᄐ ) HANGUL LETTER THIEUTH → HANGUL CHOSEONG THIEUTH     # 
+11C0 ; 1110 ;  SL      # ( ᇀ → ᄐ ) HANGUL JONGSEONG THIEUTH → HANGUL CHOSEONG THIEUTH  # 
+
+A979 ; 1110 1110 ;     SL      # ( ꥹ → ᄐᄐ ) HANGUL CHOSEONG SSANGTHIEUTH → HANGUL CHOSEONG THIEUTH, HANGUL CHOSEONG THIEUTH  # 
+
+314D ; 1111 ;  SL      # ( ㅍ → ᄑ ) HANGUL LETTER PHIEUPH → HANGUL CHOSEONG PHIEUPH     # 
+11C1 ; 1111 ;  SL      # ( ᇁ → ᄑ ) HANGUL JONGSEONG PHIEUPH → HANGUL CHOSEONG PHIEUPH  # 
+
+1156 ; 1111 1107 ;     SL      # ( ᅖ → ᄑᄇ ) HANGUL CHOSEONG PHIEUPH-PIEUP → HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG PIEUP   # 
+11F3 ; 1111 1107 ;     SL      # ( ᇳ → ᄑᄇ ) HANGUL JONGSEONG PHIEUPH-PIEUP → HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG PIEUP  # →ᅖ→
+
+D7FA ; 1111 1109 ;     SL      # ( ퟺ → ᄑᄉ ) HANGUL JONGSEONG PHIEUPH-SIOS → HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG SIOS    # →ᇁᆺ→
+
+1157 ; 1111 110B ;     SL      # ( ᅗ → ᄑᄋ ) HANGUL CHOSEONG KAPYEOUNPHIEUPH → HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG IEUNG # 
+3184 ; 1111 110B ;     SL      # ( ㆄ → ᄑᄋ ) HANGUL LETTER KAPYEOUNPHIEUPH → HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG IEUNG   # →ᅗ→
+11F4 ; 1111 110B ;     SL      # ( ᇴ → ᄑᄋ ) HANGUL JONGSEONG KAPYEOUNPHIEUPH → HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG IEUNG        # →ᅗ→
+
+D7FB ; 1111 1110 ;     SL      # ( ퟻ → ᄑᄐ ) HANGUL JONGSEONG PHIEUPH-THIEUTH → HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG THIEUTH      # →ᇁᇀ→
+
+A97A ; 1111 1112 ;     SL      # ( ꥺ → ᄑᄒ ) HANGUL CHOSEONG PHIEUPH-HIEUH → HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG HIEUH   # 
+
+314E ; 1112 ;  SL      # ( ㅎ → ᄒ ) HANGUL LETTER HIEUH → HANGUL CHOSEONG HIEUH # 
+11C2 ; 1112 ;  SL      # ( ᇂ → ᄒ ) HANGUL JONGSEONG HIEUH → HANGUL CHOSEONG HIEUH      # 
+
+11F5 ; 1112 1102 ;     SL      # ( ᇵ → ᄒᄂ ) HANGUL JONGSEONG HIEUH-NIEUN → HANGUL CHOSEONG HIEUH, HANGUL CHOSEONG NIEUN      # →ᇂᆫ→
+
+11F6 ; 1112 1105 ;     SL      # ( ᇶ → ᄒᄅ ) HANGUL JONGSEONG HIEUH-RIEUL → HANGUL CHOSEONG HIEUH, HANGUL CHOSEONG RIEUL      # →ᇂᆯ→
+
+11F7 ; 1112 1106 ;     SL      # ( ᇷ → ᄒᄆ ) HANGUL JONGSEONG HIEUH-MIEUM → HANGUL CHOSEONG HIEUH, HANGUL CHOSEONG MIEUM      # →ᇂᆷ→
+
+11F8 ; 1112 1107 ;     SL      # ( ᇸ → ᄒᄇ ) HANGUL JONGSEONG HIEUH-PIEUP → HANGUL CHOSEONG HIEUH, HANGUL CHOSEONG PIEUP      # →ᇂᆸ→
+
+A97B ; 1112 1109 ;     SL      # ( ꥻ → ᄒᄉ ) HANGUL CHOSEONG HIEUH-SIOS → HANGUL CHOSEONG HIEUH, HANGUL CHOSEONG SIOS # 
+
+1158 ; 1112 1112 ;     SL      # ( ᅘ → ᄒᄒ ) HANGUL CHOSEONG SSANGHIEUH → HANGUL CHOSEONG HIEUH, HANGUL CHOSEONG HIEUH        # 
+3185 ; 1112 1112 ;     SL      # ( ㆅ → ᄒᄒ ) HANGUL LETTER SSANGHIEUH → HANGUL CHOSEONG HIEUH, HANGUL CHOSEONG HIEUH  # →ᅘ→
+
+113D ; 113C 113C ;     SL      # ( ᄽ → ᄼᄼ ) HANGUL CHOSEONG CHITUEUMSSANGSIOS → HANGUL CHOSEONG CHITUEUMSIOS, HANGUL CHOSEONG CHITUEUMSIOS   # 
+
+113F ; 113E 113E ;     SL      # ( ᄿ → ᄾᄾ ) HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS → HANGUL CHOSEONG CEONGCHIEUMSIOS, HANGUL CHOSEONG CEONGCHIEUMSIOS  # 
+
+317F ; 1140 ;  SL      # ( ㅿ → ᅀ ) HANGUL LETTER PANSIOS → HANGUL CHOSEONG PANSIOS     # 
+11EB ; 1140 ;  SL      # ( ᇫ → ᅀ ) HANGUL JONGSEONG PANSIOS → HANGUL CHOSEONG PANSIOS  # 
+
+D7F3 ; 1140 1107 ;     SL      # ( ퟳ → ᅀᄇ ) HANGUL JONGSEONG PANSIOS-PIEUP → HANGUL CHOSEONG PANSIOS, HANGUL CHOSEONG PIEUP  # →ᇫᆸ→
+
+D7F4 ; 1140 1107 110B ;        SL      # ( ퟴ → ᅀᄇᄋ ) HANGUL JONGSEONG PANSIOS-KAPYEOUNPIEUP → HANGUL CHOSEONG PANSIOS, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG        # →ᇫᆸᆼ→
+
+3181 ; 114C ;  SL      # ( ㆁ → ᅌ ) HANGUL LETTER YESIEUNG → HANGUL CHOSEONG YESIEUNG   # 
+11F0 ; 114C ;  SL      # ( ᇰ → ᅌ ) HANGUL JONGSEONG YESIEUNG → HANGUL CHOSEONG YESIEUNG        # 
+
+D7F5 ; 114C 1106 ;     SL      # ( ퟵ → ᅌᄆ ) HANGUL JONGSEONG YESIEUNG-MIEUM → HANGUL CHOSEONG YESIEUNG, HANGUL CHOSEONG MIEUM        # →ᇰᆷ→
+
+D7F6 ; 114C 1112 ;     SL      # ( ퟶ → ᅌᄒ ) HANGUL JONGSEONG YESIEUNG-HIEUH → HANGUL CHOSEONG YESIEUNG, HANGUL CHOSEONG HIEUH        # →ᇰᇂ→
+
+114F ; 114E 114E ;     SL      # ( ᅏ → ᅎᅎ ) HANGUL CHOSEONG CHITUEUMSSANGCIEUC → HANGUL CHOSEONG CHITUEUMCIEUC, HANGUL CHOSEONG CHITUEUMCIEUC        # 
+
+1151 ; 1150 1150 ;     SL      # ( ᅑ → ᅐᅐ ) HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC → HANGUL CHOSEONG CEONGCHIEUMCIEUC, HANGUL CHOSEONG CEONGCHIEUMCIEUC       # 
+
+3186 ; 1159 ;  SL      # ( ㆆ → ᅙ ) HANGUL LETTER YEORINHIEUH → HANGUL CHOSEONG YEORINHIEUH     # 
+11F9 ; 1159 ;  SL      # ( ᇹ → ᅙ ) HANGUL JONGSEONG YEORINHIEUH → HANGUL CHOSEONG YEORINHIEUH  # 
+
+A97C ; 1159 1159 ;     SL      # ( ꥼ → ᅙᅙ ) HANGUL CHOSEONG SSANGYEORINHIEUH → HANGUL CHOSEONG YEORINHIEUH, HANGUL CHOSEONG YEORINHIEUH      # 
+
+3164 ; 1160 ;  SL      # (  →  ) HANGUL FILLER → HANGUL JUNGSEONG FILLER   # 
+
+314F ; 1161 ;  SL      # ( ㅏ → ᅡ ) HANGUL LETTER A → HANGUL JUNGSEONG A        # 
+
+1176 ; 1161 1169 ;     SL      # ( ᅶ → ᅡᅩ ) HANGUL JUNGSEONG A-O → HANGUL JUNGSEONG A, HANGUL JUNGSEONG O    # 
+
+1177 ; 1161 116E ;     SL      # ( ᅷ → ᅡᅮ ) HANGUL JUNGSEONG A-U → HANGUL JUNGSEONG A, HANGUL JUNGSEONG U    # 
+
+11A3 ; 1161 1173 ;     SL      # ( ᆣ → ᅡᅳ ) HANGUL JUNGSEONG A-EU → HANGUL JUNGSEONG A, HANGUL JUNGSEONG EU  # 
+
+1162 ; 1161 1175 ;     SL      # ( ᅢ → ᅡᅵ ) HANGUL JUNGSEONG AE → HANGUL JUNGSEONG A, HANGUL JUNGSEONG I     # 
+3150 ; 1161 1175 ;     SL      # ( ㅐ → ᅡᅵ ) HANGUL LETTER AE → HANGUL JUNGSEONG A, HANGUL JUNGSEONG I        # →ᅢ→
+
+3151 ; 1163 ;  SL      # ( ㅑ → ᅣ ) HANGUL LETTER YA → HANGUL JUNGSEONG YA      # 
+
+1178 ; 1163 1169 ;     SL      # ( ᅸ → ᅣᅩ ) HANGUL JUNGSEONG YA-O → HANGUL JUNGSEONG YA, HANGUL JUNGSEONG O  # 
+
+1179 ; 1163 116D ;     SL      # ( ᅹ → ᅣᅭ ) HANGUL JUNGSEONG YA-YO → HANGUL JUNGSEONG YA, HANGUL JUNGSEONG YO        # 
+
+11A4 ; 1163 116E ;     SL      # ( ᆤ → ᅣᅮ ) HANGUL JUNGSEONG YA-U → HANGUL JUNGSEONG YA, HANGUL JUNGSEONG U  # 
+
+1164 ; 1163 1175 ;     SL      # ( ᅤ → ᅣᅵ ) HANGUL JUNGSEONG YAE → HANGUL JUNGSEONG YA, HANGUL JUNGSEONG I   # 
+3152 ; 1163 1175 ;     SL      # ( ㅒ → ᅣᅵ ) HANGUL LETTER YAE → HANGUL JUNGSEONG YA, HANGUL JUNGSEONG I      # →ᅤ→
+
+3153 ; 1165 ;  SL      # ( ㅓ → ᅥ ) HANGUL LETTER EO → HANGUL JUNGSEONG EO      # 
+
+117A ; 1165 1169 ;     SL      # ( ᅺ → ᅥᅩ ) HANGUL JUNGSEONG EO-O → HANGUL JUNGSEONG EO, HANGUL JUNGSEONG O  # 
+
+117B ; 1165 116E ;     SL      # ( ᅻ → ᅥᅮ ) HANGUL JUNGSEONG EO-U → HANGUL JUNGSEONG EO, HANGUL JUNGSEONG U  # 
+
+117C ; 1165 1173 ;     SL      # ( ᅼ → ᅥᅳ ) HANGUL JUNGSEONG EO-EU → HANGUL JUNGSEONG EO, HANGUL JUNGSEONG EU        # 
+
+1166 ; 1165 1175 ;     SL      # ( ᅦ → ᅥᅵ ) HANGUL JUNGSEONG E → HANGUL JUNGSEONG EO, HANGUL JUNGSEONG I     # 
+3154 ; 1165 1175 ;     SL      # ( ㅔ → ᅥᅵ ) HANGUL LETTER E → HANGUL JUNGSEONG EO, HANGUL JUNGSEONG I        # →ᅦ→
+
+3155 ; 1167 ;  SL      # ( ㅕ → ᅧ ) HANGUL LETTER YEO → HANGUL JUNGSEONG YEO    # 
+
+11A5 ; 1167 1163 ;     SL      # ( ᆥ → ᅧᅣ ) HANGUL JUNGSEONG YEO-YA → HANGUL JUNGSEONG YEO, HANGUL JUNGSEONG YA      # 
+
+117D ; 1167 1169 ;     SL      # ( ᅽ → ᅧᅩ ) HANGUL JUNGSEONG YEO-O → HANGUL JUNGSEONG YEO, HANGUL JUNGSEONG O        # 
+
+117E ; 1167 116E ;     SL      # ( ᅾ → ᅧᅮ ) HANGUL JUNGSEONG YEO-U → HANGUL JUNGSEONG YEO, HANGUL JUNGSEONG U        # 
+
+1168 ; 1167 1175 ;     SL      # ( ᅨ → ᅧᅵ ) HANGUL JUNGSEONG YE → HANGUL JUNGSEONG YEO, HANGUL JUNGSEONG I   # 
+3156 ; 1167 1175 ;     SL      # ( ㅖ → ᅧᅵ ) HANGUL LETTER YE → HANGUL JUNGSEONG YEO, HANGUL JUNGSEONG I      # →ᅨ→
+
+3157 ; 1169 ;  SL      # ( ㅗ → ᅩ ) HANGUL LETTER O → HANGUL JUNGSEONG O        # 
+
+116A ; 1169 1161 ;     SL      # ( ᅪ → ᅩᅡ ) HANGUL JUNGSEONG WA → HANGUL JUNGSEONG O, HANGUL JUNGSEONG A     # 
+3158 ; 1169 1161 ;     SL      # ( ㅘ → ᅩᅡ ) HANGUL LETTER WA → HANGUL JUNGSEONG O, HANGUL JUNGSEONG A        # →ᅪ→
+
+116B ; 1169 1161 1175 ;        SL      # ( ᅫ → ᅩᅡᅵ ) HANGUL JUNGSEONG WAE → HANGUL JUNGSEONG O, HANGUL JUNGSEONG A, HANGUL JUNGSEONG I     # 
+3159 ; 1169 1161 1175 ;        SL      # ( ㅙ → ᅩᅡᅵ ) HANGUL LETTER WAE → HANGUL JUNGSEONG O, HANGUL JUNGSEONG A, HANGUL JUNGSEONG I        # →ᅫ→
+
+11A6 ; 1169 1163 ;     SL      # ( ᆦ → ᅩᅣ ) HANGUL JUNGSEONG O-YA → HANGUL JUNGSEONG O, HANGUL JUNGSEONG YA  # 
+
+11A7 ; 1169 1163 1175 ;        SL      # ( ᆧ → ᅩᅣᅵ ) HANGUL JUNGSEONG O-YAE → HANGUL JUNGSEONG O, HANGUL JUNGSEONG YA, HANGUL JUNGSEONG I  # 
+
+117F ; 1169 1165 ;     SL      # ( ᅿ → ᅩᅥ ) HANGUL JUNGSEONG O-EO → HANGUL JUNGSEONG O, HANGUL JUNGSEONG EO  # 
+
+1180 ; 1169 1165 1175 ;        SL      # ( ᆀ → ᅩᅥᅵ ) HANGUL JUNGSEONG O-E → HANGUL JUNGSEONG O, HANGUL JUNGSEONG EO, HANGUL JUNGSEONG I    # 
+
+D7B0 ; 1169 1167 ;     SL      # ( ힰ → ᅩᅧ ) HANGUL JUNGSEONG O-YEO → HANGUL JUNGSEONG O, HANGUL JUNGSEONG YEO        # 
+
+1181 ; 1169 1167 1175 ;        SL      # ( ᆁ → ᅩᅧᅵ ) HANGUL JUNGSEONG O-YE → HANGUL JUNGSEONG O, HANGUL JUNGSEONG YEO, HANGUL JUNGSEONG I  # 
+
+1182 ; 1169 1169 ;     SL      # ( ᆂ → ᅩᅩ ) HANGUL JUNGSEONG O-O → HANGUL JUNGSEONG O, HANGUL JUNGSEONG O    # 
+
+D7B1 ; 1169 1169 1175 ;        SL      # ( ힱ → ᅩᅩᅵ ) HANGUL JUNGSEONG O-O-I → HANGUL JUNGSEONG O, HANGUL JUNGSEONG O, HANGUL JUNGSEONG I   # 
+
+1183 ; 1169 116E ;     SL      # ( ᆃ → ᅩᅮ ) HANGUL JUNGSEONG O-U → HANGUL JUNGSEONG O, HANGUL JUNGSEONG U    # 
+
+116C ; 1169 1175 ;     SL      # ( ᅬ → ᅩᅵ ) HANGUL JUNGSEONG OE → HANGUL JUNGSEONG O, HANGUL JUNGSEONG I     # 
+315A ; 1169 1175 ;     SL      # ( ㅚ → ᅩᅵ ) HANGUL LETTER OE → HANGUL JUNGSEONG O, HANGUL JUNGSEONG I        # →ᅬ→
+
+315B ; 116D ;  SL      # ( ㅛ → ᅭ ) HANGUL LETTER YO → HANGUL JUNGSEONG YO      # 
+
+D7B2 ; 116D 1161 ;     SL      # ( ힲ → ᅭᅡ ) HANGUL JUNGSEONG YO-A → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG A  # 
+
+D7B3 ; 116D 1161 1175 ;        SL      # ( ힳ → ᅭᅡᅵ ) HANGUL JUNGSEONG YO-AE → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG A, HANGUL JUNGSEONG I  # 
+
+1184 ; 116D 1163 ;     SL      # ( ᆄ → ᅭᅣ ) HANGUL JUNGSEONG YO-YA → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG YA        # 
+3187 ; 116D 1163 ;     SL      # ( ㆇ → ᅭᅣ ) HANGUL LETTER YO-YA → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG YA   # →ᆄ→
+1186 ; 116D 1163 ;     SL      # ( ᆆ → ᅭᅣ ) HANGUL JUNGSEONG YO-YEO → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG YA       # →ᆄ→
+
+1185 ; 116D 1163 1175 ;        SL      # ( ᆅ → ᅭᅣᅵ ) HANGUL JUNGSEONG YO-YAE → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG YA, HANGUL JUNGSEONG I        # 
+3188 ; 116D 1163 1175 ;        SL      # ( ㆈ → ᅭᅣᅵ ) HANGUL LETTER YO-YAE → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG YA, HANGUL JUNGSEONG I   # →ᆅ→
+
+D7B4 ; 116D 1165 ;     SL      # ( ힴ → ᅭᅥ ) HANGUL JUNGSEONG YO-EO → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG EO        # 
+
+1187 ; 116D 1169 ;     SL      # ( ᆇ → ᅭᅩ ) HANGUL JUNGSEONG YO-O → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG O  # 
+
+1188 ; 116D 1175 ;     SL      # ( ᆈ → ᅭᅵ ) HANGUL JUNGSEONG YO-I → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG I  # 
+3189 ; 116D 1175 ;     SL      # ( ㆉ → ᅭᅵ ) HANGUL LETTER YO-I → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG I     # →ᆈ→
+
+315C ; 116E ;  SL      # ( ㅜ → ᅮ ) HANGUL LETTER U → HANGUL JUNGSEONG U        # 
+
+1189 ; 116E 1161 ;     SL      # ( ᆉ → ᅮᅡ ) HANGUL JUNGSEONG U-A → HANGUL JUNGSEONG U, HANGUL JUNGSEONG A    # 
+
+118A ; 116E 1161 1175 ;        SL      # ( ᆊ → ᅮᅡᅵ ) HANGUL JUNGSEONG U-AE → HANGUL JUNGSEONG U, HANGUL JUNGSEONG A, HANGUL JUNGSEONG I    # 
+
+116F ; 116E 1165 ;     SL      # ( ᅯ → ᅮᅥ ) HANGUL JUNGSEONG WEO → HANGUL JUNGSEONG U, HANGUL JUNGSEONG EO   # 
+315D ; 116E 1165 ;     SL      # ( ㅝ → ᅮᅥ ) HANGUL LETTER WEO → HANGUL JUNGSEONG U, HANGUL JUNGSEONG EO      # →ᅯ→
+
+118B ; 116E 1165 1173 ;        SL      # ( ᆋ → ᅮᅥᅳ ) HANGUL JUNGSEONG U-EO-EU → HANGUL JUNGSEONG U, HANGUL JUNGSEONG EO, HANGUL JUNGSEONG EU       # 
+
+1170 ; 116E 1165 1175 ;        SL      # ( ᅰ → ᅮᅥᅵ ) HANGUL JUNGSEONG WE → HANGUL JUNGSEONG U, HANGUL JUNGSEONG EO, HANGUL JUNGSEONG I     # 
+315E ; 116E 1165 1175 ;        SL      # ( ㅞ → ᅮᅥᅵ ) HANGUL LETTER WE → HANGUL JUNGSEONG U, HANGUL JUNGSEONG EO, HANGUL JUNGSEONG I        # →ᅰ→
+
+D7B5 ; 116E 1167 ;     SL      # ( ힵ → ᅮᅧ ) HANGUL JUNGSEONG U-YEO → HANGUL JUNGSEONG U, HANGUL JUNGSEONG YEO        # 
+
+118C ; 116E 1167 1175 ;        SL      # ( ᆌ → ᅮᅧᅵ ) HANGUL JUNGSEONG U-YE → HANGUL JUNGSEONG U, HANGUL JUNGSEONG YEO, HANGUL JUNGSEONG I  # 
+
+118D ; 116E 116E ;     SL      # ( ᆍ → ᅮᅮ ) HANGUL JUNGSEONG U-U → HANGUL JUNGSEONG U, HANGUL JUNGSEONG U    # 
+
+1171 ; 116E 1175 ;     SL      # ( ᅱ → ᅮᅵ ) HANGUL JUNGSEONG WI → HANGUL JUNGSEONG U, HANGUL JUNGSEONG I     # 
+315F ; 116E 1175 ;     SL      # ( ㅟ → ᅮᅵ ) HANGUL LETTER WI → HANGUL JUNGSEONG U, HANGUL JUNGSEONG I        # →ᅱ→
+
+D7B6 ; 116E 1175 1175 ;        SL      # ( ힶ → ᅮᅵᅵ ) HANGUL JUNGSEONG U-I-I → HANGUL JUNGSEONG U, HANGUL JUNGSEONG I, HANGUL JUNGSEONG I   # 
+
+3160 ; 1172 ;  SL      # ( ㅠ → ᅲ ) HANGUL LETTER YU → HANGUL JUNGSEONG YU      # 
+
+118E ; 1172 1161 ;     SL      # ( ᆎ → ᅲᅡ ) HANGUL JUNGSEONG YU-A → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG A  # 
+
+D7B7 ; 1172 1161 1175 ;        SL      # ( ힷ → ᅲᅡᅵ ) HANGUL JUNGSEONG YU-AE → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG A, HANGUL JUNGSEONG I  # 
+
+118F ; 1172 1165 ;     SL      # ( ᆏ → ᅲᅥ ) HANGUL JUNGSEONG YU-EO → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG EO        # 
+
+1190 ; 1172 1165 1175 ;        SL      # ( ᆐ → ᅲᅥᅵ ) HANGUL JUNGSEONG YU-E → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG EO, HANGUL JUNGSEONG I  # 
+
+1191 ; 1172 1167 ;     SL      # ( ᆑ → ᅲᅧ ) HANGUL JUNGSEONG YU-YEO → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG YEO      # 
+318A ; 1172 1167 ;     SL      # ( ㆊ → ᅲᅧ ) HANGUL LETTER YU-YEO → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG YEO # →ᆑ→
+
+1192 ; 1172 1167 1175 ;        SL      # ( ᆒ → ᅲᅧᅵ ) HANGUL JUNGSEONG YU-YE → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG YEO, HANGUL JUNGSEONG I        # 
+318B ; 1172 1167 1175 ;        SL      # ( ㆋ → ᅲᅧᅵ ) HANGUL LETTER YU-YE → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG YEO, HANGUL JUNGSEONG I   # →ᆒ→
+
+D7B8 ; 1172 1169 ;     SL      # ( ힸ → ᅲᅩ ) HANGUL JUNGSEONG YU-O → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG O  # 
+
+1193 ; 1172 116E ;     SL      # ( ᆓ → ᅲᅮ ) HANGUL JUNGSEONG YU-U → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG U  # 
+
+1194 ; 1172 1175 ;     SL      # ( ᆔ → ᅲᅵ ) HANGUL JUNGSEONG YU-I → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG I  # 
+318C ; 1172 1175 ;     SL      # ( ㆌ → ᅲᅵ ) HANGUL LETTER YU-I → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG I     # →ᆔ→
+
+D7B9 ; 1173 1161 ;     SL      # ( ힹ → ᅳᅡ ) HANGUL JUNGSEONG EU-A → HANGUL JUNGSEONG EU, HANGUL JUNGSEONG A  # 
+
+D7BA ; 1173 1165 ;     SL      # ( ힺ → ᅳᅥ ) HANGUL JUNGSEONG EU-EO → HANGUL JUNGSEONG EU, HANGUL JUNGSEONG EO        # 
+
+D7BB ; 1173 1165 1175 ;        SL      # ( ힻ → ᅳᅥᅵ ) HANGUL JUNGSEONG EU-E → HANGUL JUNGSEONG EU, HANGUL JUNGSEONG EO, HANGUL JUNGSEONG I  # 
+
+D7BC ; 1173 1169 ;     SL      # ( ힼ → ᅳᅩ ) HANGUL JUNGSEONG EU-O → HANGUL JUNGSEONG EU, HANGUL JUNGSEONG O  # 
+
+1195 ; 1173 116E ;     SL      # ( ᆕ → ᅳᅮ ) HANGUL JUNGSEONG EU-U → HANGUL JUNGSEONG EU, HANGUL JUNGSEONG U  # 
+
+1174 ; 1173 1175 ;     SL      # ( ᅴ → ᅳᅵ ) HANGUL JUNGSEONG YI → HANGUL JUNGSEONG EU, HANGUL JUNGSEONG I    # 
+3162 ; 1173 1175 ;     SL      # ( ㅢ → ᅳᅵ ) HANGUL LETTER YI → HANGUL JUNGSEONG EU, HANGUL JUNGSEONG I       # →ᅴ→
+
+1197 ; 1173 1175 116E ;        SL      # ( ᆗ → ᅳᅵᅮ ) HANGUL JUNGSEONG YI-U → HANGUL JUNGSEONG EU, HANGUL JUNGSEONG I, HANGUL JUNGSEONG U   # 
+
+3163 ; 1175 ;  SL      # ( ㅣ → ᅵ ) HANGUL LETTER I → HANGUL JUNGSEONG I        # 
+
+1198 ; 1175 1161 ;     SL      # ( ᆘ → ᅵᅡ ) HANGUL JUNGSEONG I-A → HANGUL JUNGSEONG I, HANGUL JUNGSEONG A    # 
+
+1199 ; 1175 1163 ;     SL      # ( ᆙ → ᅵᅣ ) HANGUL JUNGSEONG I-YA → HANGUL JUNGSEONG I, HANGUL JUNGSEONG YA  # 
+
+D7BD ; 1175 1163 1169 ;        SL      # ( ힽ → ᅵᅣᅩ ) HANGUL JUNGSEONG I-YA-O → HANGUL JUNGSEONG I, HANGUL JUNGSEONG YA, HANGUL JUNGSEONG O # 
+
+D7BE ; 1175 1163 1175 ;        SL      # ( ힾ → ᅵᅣᅵ ) HANGUL JUNGSEONG I-YAE → HANGUL JUNGSEONG I, HANGUL JUNGSEONG YA, HANGUL JUNGSEONG I  # 
+
+D7BF ; 1175 1167 ;     SL      # ( ힿ → ᅵᅧ ) HANGUL JUNGSEONG I-YEO → HANGUL JUNGSEONG I, HANGUL JUNGSEONG YEO        # 
+
+D7C0 ; 1175 1167 1175 ;        SL      # ( ퟀ → ᅵᅧᅵ ) HANGUL JUNGSEONG I-YE → HANGUL JUNGSEONG I, HANGUL JUNGSEONG YEO, HANGUL JUNGSEONG I  # 
+
+119A ; 1175 1169 ;     SL      # ( ᆚ → ᅵᅩ ) HANGUL JUNGSEONG I-O → HANGUL JUNGSEONG I, HANGUL JUNGSEONG O    # 
+
+D7C1 ; 1175 1169 1175 ;        SL      # ( ퟁ → ᅵᅩᅵ ) HANGUL JUNGSEONG I-O-I → HANGUL JUNGSEONG I, HANGUL JUNGSEONG O, HANGUL JUNGSEONG I   # 
+
+D7C2 ; 1175 116D ;     SL      # ( ퟂ → ᅵᅭ ) HANGUL JUNGSEONG I-YO → HANGUL JUNGSEONG I, HANGUL JUNGSEONG YO  # 
+
+119B ; 1175 116E ;     SL      # ( ᆛ → ᅵᅮ ) HANGUL JUNGSEONG I-U → HANGUL JUNGSEONG I, HANGUL JUNGSEONG U    # 
+
+D7C3 ; 1175 1172 ;     SL      # ( ퟃ → ᅵᅲ ) HANGUL JUNGSEONG I-YU → HANGUL JUNGSEONG I, HANGUL JUNGSEONG YU  # 
+
+119C ; 1175 1173 ;     SL      # ( ᆜ → ᅵᅳ ) HANGUL JUNGSEONG I-EU → HANGUL JUNGSEONG I, HANGUL JUNGSEONG EU  # 
+
+D7C4 ; 1175 1175 ;     SL      # ( ퟄ → ᅵᅵ ) HANGUL JUNGSEONG I-I → HANGUL JUNGSEONG I, HANGUL JUNGSEONG I    # 
+
+119D ; 1175 119E ;     SL      # ( ᆝ → ᅵᆞ ) HANGUL JUNGSEONG I-ARAEA → HANGUL JUNGSEONG I, HANGUL JUNGSEONG ARAEA    # 
+
+318D ; 119E ;  SL      # ( ㆍ → ᆞ ) HANGUL LETTER ARAEA → HANGUL JUNGSEONG ARAEA        # 
+
+D7C5 ; 119E 1161 ;     SL      # ( ퟅ → ᆞᅡ ) HANGUL JUNGSEONG ARAEA-A → HANGUL JUNGSEONG ARAEA, HANGUL JUNGSEONG A    # 
+
+119F ; 119E 1165 ;     SL      # ( ᆟ → ᆞᅥ ) HANGUL JUNGSEONG ARAEA-EO → HANGUL JUNGSEONG ARAEA, HANGUL JUNGSEONG EO  # 
+
+D7C6 ; 119E 1165 1175 ;        SL      # ( ퟆ → ᆞᅥᅵ ) HANGUL JUNGSEONG ARAEA-E → HANGUL JUNGSEONG ARAEA, HANGUL JUNGSEONG EO, HANGUL JUNGSEONG I    # 
+
+11A0 ; 119E 116E ;     SL      # ( ᆠ → ᆞᅮ ) HANGUL JUNGSEONG ARAEA-U → HANGUL JUNGSEONG ARAEA, HANGUL JUNGSEONG U    # 
+
+11A1 ; 119E 1175 ;     SL      # ( ᆡ → ᆞᅵ ) HANGUL JUNGSEONG ARAEA-I → HANGUL JUNGSEONG ARAEA, HANGUL JUNGSEONG I    # 
+318E ; 119E 1175 ;     SL      # ( ㆎ → ᆞᅵ ) HANGUL LETTER ARAEAE → HANGUL JUNGSEONG ARAEA, HANGUL JUNGSEONG I        # →ᆡ→
+
+11A2 ; 119E 119E ;     SL      # ( ᆢ → ᆞᆞ ) HANGUL JUNGSEONG SSANGARAEA → HANGUL JUNGSEONG ARAEA, HANGUL JUNGSEONG ARAEA     # 
+
+29C4 ; 303C ;  SL      #* ( ⧄ → 〼 ) SQUARED RISING DIAGONAL SLASH → MASU MARK  # 
+
+A49E ; A04A ;  SL      #* ( ꒞ → ꁊ ) YI RADICAL PUT → YI SYLLABLE PUT   # 
+
+A4AC ; A050 ;  SL      #* ( ꒬ → ꁐ ) YI RADICAL PYT → YI SYLLABLE PYT   # 
+
+A49C ; A0C0 ;  SL      #* ( ꒜ → ꃀ ) YI RADICAL MOP → YI SYLLABLE MOP   # 
+
+A4A8 ; A132 ;  SL      #* ( ꒨ → ꄲ ) YI RADICAL TU → YI SYLLABLE TU     # 
+
+A4BF ; A259 ;  SL      #* ( ꒿ → ꉙ ) YI RADICAL HXOP → YI SYLLABLE HXOP # 
+
+A4BE ; A2B1 ;  SL      #* ( ꒾ → ꊱ ) YI RADICAL CIP → YI SYLLABLE CIP   # 
+
+A494 ; A2CD ;  SL      #* ( ꒔ → ꋍ ) YI RADICAL CYP → YI SYLLABLE CYP   # 
+
+A4C0 ; A3AB ;  SL      #* ( ꓀ → ꎫ ) YI RADICAL SHAT → YI SYLLABLE SHAT # 
+
+A4C2 ; A3B5 ;  SL      #* ( ꓂ → ꎵ ) YI RADICAL SHOP → YI SYLLABLE SHOP # 
+
+A4BA ; A3BF ;  SL      #* ( ꒺ → ꎿ ) YI RADICAL SHUR → YI SYLLABLE SHUR # 
+
+A4B0 ; A3C2 ;  SL      #* ( ꒰ → ꏂ ) YI RADICAL SHY → YI SYLLABLE SHY   # 
+
+A4A7 ; A458 ;  SL      #* ( ꒧ → ꑘ ) YI RADICAL NYOP → YI SYLLABLE NYOP # 
+
+22A5 ; A4D5 ;  SL      #* ( ⊥ → ꓕ ) UP TACK → LISU LETTER THA  # 
+27C2 ; A4D5 ;  SL      #* ( ⟂ → ꓕ ) PERPENDICULAR → LISU LETTER THA    # →⊥→
+
+2115 ; A4E0 ;  SL      # ( ℕ → ꓠ ) DOUBLE-STRUCK CAPITAL N → LISU LETTER NA    # →N→
+1D40D ;        A4E0 ;  SL      # ( 𝐍 → ꓠ ) MATHEMATICAL BOLD CAPITAL N → LISU LETTER NA       # →N→
+1D441 ;        A4E0 ;  SL      # ( 𝑁 → ꓠ ) MATHEMATICAL ITALIC CAPITAL N → LISU LETTER NA     # →N→
+1D475 ;        A4E0 ;  SL      # ( 𝑵 → ꓠ ) MATHEMATICAL BOLD ITALIC CAPITAL N → LISU LETTER NA        # →N→
+1D4A9 ;        A4E0 ;  SL      # ( 𝒩 → ꓠ ) MATHEMATICAL SCRIPT CAPITAL N → LISU LETTER NA     # →N→
+1D4DD ;        A4E0 ;  SL      # ( 𝓝 → ꓠ ) MATHEMATICAL BOLD SCRIPT CAPITAL N → LISU LETTER NA        # →N→
+1D511 ;        A4E0 ;  SL      # ( 𝔑 → ꓠ ) MATHEMATICAL FRAKTUR CAPITAL N → LISU LETTER NA    # →N→
+1D579 ;        A4E0 ;  SL      # ( 𝕹 → ꓠ ) MATHEMATICAL BOLD FRAKTUR CAPITAL N → LISU LETTER NA       # →N→
+1D5AD ;        A4E0 ;  SL      # ( 𝖭 → ꓠ ) MATHEMATICAL SANS-SERIF CAPITAL N → LISU LETTER NA # →N→
+1D5E1 ;        A4E0 ;  SL      # ( 𝗡 → ꓠ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL N → LISU LETTER NA    # →N→
+1D615 ;        A4E0 ;  SL      # ( 𝘕 → ꓠ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL N → LISU LETTER NA  # →N→
+1D649 ;        A4E0 ;  SL      # ( 𝙉 → ꓠ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N → LISU LETTER NA     # →N→
+1D67D ;        A4E0 ;  SL      # ( 𝙽 → ꓠ ) MATHEMATICAL MONOSPACE CAPITAL N → LISU LETTER NA  # →N→
+1D6B4 ;        A4E0 ;  SL      # ( 𝚴 → ꓠ ) MATHEMATICAL BOLD CAPITAL NU → LISU LETTER NA      # →𝐍→→N→
+1D6EE ;        A4E0 ;  SL      # ( 𝛮 → ꓠ ) MATHEMATICAL ITALIC CAPITAL NU → LISU LETTER NA    # →Ν→→N→
+1D728 ;        A4E0 ;  SL      # ( 𝜨 → ꓠ ) MATHEMATICAL BOLD ITALIC CAPITAL NU → LISU LETTER NA       # →𝑵→→N→
+1D762 ;        A4E0 ;  SL      # ( 𝝢 → ꓠ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL NU → LISU LETTER NA   # →Ν→→N→
+1D79C ;        A4E0 ;  SL      # ( 𝞜 → ꓠ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU → LISU LETTER NA    # →Ν→→N→
+
+2141 ; A4E8 ;  SL      #* ( ⅁ → ꓨ ) TURNED SANS-SERIF CAPITAL G → LISU LETTER HHA      # 
+
+2200 ; A4EF ;  SL      #* ( ∀ → ꓯ ) FOR ALL → LISU LETTER AE   # 
+
+2229 ; A4F5 ;  SL      #* ( ∩ → ꓵ ) INTERSECTION → LISU LETTER UE      # 
+22C2 ; A4F5 ;  SL      #* ( ⋂ → ꓵ ) N-ARY INTERSECTION → LISU LETTER UE        # →∩→
+
+2142 ; A4F6 ;  SL      #* ( ⅂ → ꓶ ) TURNED SANS-SERIF CAPITAL L → LISU LETTER UH       # 
+
+104A0 ;        10486 ; SL      # ( 𐒠 → 𐒆 ) OSMANYA DIGIT ZERO → OSMANYA LETTER DEEL  # 
+
+F967 ; 4E0D ;  SL      # ( 不 → 不 ) CJK COMPATIBILITY IDEOGRAPH-F967 → CJK UNIFIED IDEOGRAPH-4E0D       # 
+
+FA70 ; 4E26 ;  SL      # ( 並 → 並 ) CJK COMPATIBILITY IDEOGRAPH-FA70 → CJK UNIFIED IDEOGRAPH-4E26       # 
+
+239C ; 4E28 ;  SL      #* ( ⎜ → 丨 ) LEFT PARENTHESIS EXTENSION → CJK UNIFIED IDEOGRAPH-4E28    # →⎥→→⎮→
+239F ; 4E28 ;  SL      #* ( ⎟ → 丨 ) RIGHT PARENTHESIS EXTENSION → CJK UNIFIED IDEOGRAPH-4E28   # →⎥→→⎮→
+23A2 ; 4E28 ;  SL      #* ( ⎢ → 丨 ) LEFT SQUARE BRACKET EXTENSION → CJK UNIFIED IDEOGRAPH-4E28 # →⎥→→⎮→
+23A5 ; 4E28 ;  SL      #* ( ⎥ → 丨 ) RIGHT SQUARE BRACKET EXTENSION → CJK UNIFIED IDEOGRAPH-4E28        # →⎮→
+23AA ; 4E28 ;  SL      #* ( ⎪ → 丨 ) CURLY BRACKET EXTENSION → CJK UNIFIED IDEOGRAPH-4E28       # →⎥→→⎮→
+23AE ; 4E28 ;  SL      #* ( ⎮ → 丨 ) INTEGRAL EXTENSION → CJK UNIFIED IDEOGRAPH-4E28    # 
+31D1 ; 4E28 ;  SL      #* ( ㇑ → 丨 ) CJK STROKE S → CJK UNIFIED IDEOGRAPH-4E28  # 
+2F01 ; 4E28 ;  SL      #* ( ⼁ → 丨 ) KANGXI RADICAL LINE → CJK UNIFIED IDEOGRAPH-4E28   # 
+
+2EA6 ; 4E2C ;  SL      #* ( ⺦ → 丬 ) CJK RADICAL SIMPLIFIED HALF TREE TRUNK → CJK UNIFIED IDEOGRAPH-4E2C        # 
+
+F905 ; 4E32 ;  SL      # ( 串 → 串 ) CJK COMPATIBILITY IDEOGRAPH-F905 → CJK UNIFIED IDEOGRAPH-4E32       # 
+
+2F801 ;        4E38 ;  SL      # ( 丸 → 丸 ) CJK COMPATIBILITY IDEOGRAPH-2F801 → CJK UNIFIED IDEOGRAPH-4E38     # 
+
+F95E ; 4E39 ;  SL      # ( 丹 → 丹 ) CJK COMPATIBILITY IDEOGRAPH-F95E → CJK UNIFIED IDEOGRAPH-4E39       # 
+
+2F800 ;        4E3D ;  SL      # ( 丽 → 丽 ) CJK COMPATIBILITY IDEOGRAPH-2F800 → CJK UNIFIED IDEOGRAPH-4E3D     # 
+
+2F802 ;        4E41 ;  SL      # ( 乁 → 乁 ) CJK COMPATIBILITY IDEOGRAPH-2F802 → CJK UNIFIED IDEOGRAPH-4E41     # 
+
+31E0 ; 4E59 ;  SL      #* ( ㇠ → 乙 ) CJK STROKE HXWG → CJK UNIFIED IDEOGRAPH-4E59       # 
+2F04 ; 4E59 ;  SL      #* ( ⼄ → 乙 ) KANGXI RADICAL SECOND → CJK UNIFIED IDEOGRAPH-4E59 # 
+
+31DF ; 4E5A ;  SL      #* ( ㇟ → 乚 ) CJK STROKE SWG → CJK UNIFIED IDEOGRAPH-4E5A        # 
+2E83 ; 4E5A ;  SL      #* ( ⺃ → 乚 ) CJK RADICAL SECOND TWO → CJK UNIFIED IDEOGRAPH-4E5A        # 
+
+31D6 ; 4E5B ;  SL      #* ( ㇖ → 乛 ) CJK STROKE HG → CJK UNIFIED IDEOGRAPH-4E5B # 
+
+2EF2 ; 4E80 ;  SL      #* ( ⻲ → 亀 ) CJK RADICAL J-SIMPLIFIED TURTLE → CJK UNIFIED IDEOGRAPH-4E80       # 
+
+F91B ; 4E82 ;  SL      # ( 亂 → 亂 ) CJK COMPATIBILITY IDEOGRAPH-F91B → CJK UNIFIED IDEOGRAPH-4E82       # 
+
+31DA ; 4E85 ;  SL      #* ( ㇚ → 亅 ) CJK STROKE SG → CJK UNIFIED IDEOGRAPH-4E85 # 
+2F05 ; 4E85 ;  SL      #* ( ⼅ → 亅 ) KANGXI RADICAL HOOK → CJK UNIFIED IDEOGRAPH-4E85   # 
+
+F9BA ; 4E86 ;  SL      # ( 了 → 了 ) CJK COMPATIBILITY IDEOGRAPH-F9BA → CJK UNIFIED IDEOGRAPH-4E86       # 
+
+2F06 ; 4E8C ;  SL      #* ( ⼆ → 二 ) KANGXI RADICAL TWO → CJK UNIFIED IDEOGRAPH-4E8C    # 
+
+2F07 ; 4EA0 ;  SL      #* ( ⼇ → 亠 ) KANGXI RADICAL LID → CJK UNIFIED IDEOGRAPH-4EA0    # 
+
+F977 ; 4EAE ;  SL      # ( 亮 → 亮 ) CJK COMPATIBILITY IDEOGRAPH-F977 → CJK UNIFIED IDEOGRAPH-4EAE       # 
+
+2F08 ; 4EBA ;  SL      #* ( ⼈ → 人 ) KANGXI RADICAL MAN → CJK UNIFIED IDEOGRAPH-4EBA    # 
+
+2E85 ; 4EBB ;  SL      #* ( ⺅ → 亻 ) CJK RADICAL PERSON → CJK UNIFIED IDEOGRAPH-4EBB    # 
+
+F9FD ; 4EC0 ;  SL      # ( 什 → 什 ) CJK COMPATIBILITY IDEOGRAPH-F9FD → CJK UNIFIED IDEOGRAPH-4EC0       # 
+
+2F819 ;        4ECC ;  SL      # ( 仌 → 仌 ) CJK COMPATIBILITY IDEOGRAPH-2F819 → CJK UNIFIED IDEOGRAPH-4ECC     # 
+
+F9A8 ; 4EE4 ;  SL      # ( 令 → 令 ) CJK COMPATIBILITY IDEOGRAPH-F9A8 → CJK UNIFIED IDEOGRAPH-4EE4       # 
+
+2F804 ;        4F60 ;  SL      # ( 你 → 你 ) CJK COMPATIBILITY IDEOGRAPH-2F804 → CJK UNIFIED IDEOGRAPH-4F60     # 
+
+5002 ; 4F75 ;  SL      # ( 倂 → 併 ) CJK UNIFIED IDEOGRAPH-5002 → CJK UNIFIED IDEOGRAPH-4F75     # 
+2F807 ;        4F75 ;  SL      # ( 倂 → 併 ) CJK COMPATIBILITY IDEOGRAPH-2F807 → CJK UNIFIED IDEOGRAPH-4F75     # →倂→
+
+FA73 ; 4F80 ;  SL      # ( 侀 → 侀 ) CJK COMPATIBILITY IDEOGRAPH-FA73 → CJK UNIFIED IDEOGRAPH-4F80       # 
+
+F92D ; 4F86 ;  SL      # ( 來 → 來 ) CJK COMPATIBILITY IDEOGRAPH-F92D → CJK UNIFIED IDEOGRAPH-4F86       # 
+
+F9B5 ; 4F8B ;  SL      # ( 例 → 例 ) CJK COMPATIBILITY IDEOGRAPH-F9B5 → CJK UNIFIED IDEOGRAPH-4F8B       # 
+
+FA30 ; 4FAE ;  SL      # ( 侮 → 侮 ) CJK COMPATIBILITY IDEOGRAPH-FA30 → CJK UNIFIED IDEOGRAPH-4FAE       # 
+2F805 ;        4FAE ;  SL      # ( 侮 → 侮 ) CJK COMPATIBILITY IDEOGRAPH-2F805 → CJK UNIFIED IDEOGRAPH-4FAE     # 
+
+2F806 ;        4FBB ;  SL      # ( 侻 → 侻 ) CJK COMPATIBILITY IDEOGRAPH-2F806 → CJK UNIFIED IDEOGRAPH-4FBB     # 
+
+F965 ; 4FBF ;  SL      # ( 便 → 便 ) CJK COMPATIBILITY IDEOGRAPH-F965 → CJK UNIFIED IDEOGRAPH-4FBF       # 
+
+503C ; 5024 ;  SL      # ( 值 → 値 ) CJK UNIFIED IDEOGRAPH-503C → CJK UNIFIED IDEOGRAPH-5024     # 
+
+F9D4 ; 502B ;  SL      # ( 倫 → 倫 ) CJK COMPATIBILITY IDEOGRAPH-F9D4 → CJK UNIFIED IDEOGRAPH-502B       # 
+
+2F808 ;        507A ;  SL      # ( 偺 → 偺 ) CJK COMPATIBILITY IDEOGRAPH-2F808 → CJK UNIFIED IDEOGRAPH-507A     # 
+
+2F809 ;        5099 ;  SL      # ( 備 → 備 ) CJK COMPATIBILITY IDEOGRAPH-2F809 → CJK UNIFIED IDEOGRAPH-5099     # 
+
+2F80B ;        50CF ;  SL      # ( 像 → 像 ) CJK COMPATIBILITY IDEOGRAPH-2F80B → CJK UNIFIED IDEOGRAPH-50CF     # 
+
+F9BB ; 50DA ;  SL      # ( 僚 → 僚 ) CJK COMPATIBILITY IDEOGRAPH-F9BB → CJK UNIFIED IDEOGRAPH-50DA       # 
+
+FA31 ; 50E7 ;  SL      # ( 僧 → 僧 ) CJK COMPATIBILITY IDEOGRAPH-FA31 → CJK UNIFIED IDEOGRAPH-50E7       # 
+2F80A ;        50E7 ;  SL      # ( 僧 → 僧 ) CJK COMPATIBILITY IDEOGRAPH-2F80A → CJK UNIFIED IDEOGRAPH-50E7     # 
+
+2F09 ; 513F ;  SL      #* ( ⼉ → 儿 ) KANGXI RADICAL LEGS → CJK UNIFIED IDEOGRAPH-513F   # 
+
+FA0C ; 5140 ;  SL      # ( 兀 → 兀 ) CJK COMPATIBILITY IDEOGRAPH-FA0C → CJK UNIFIED IDEOGRAPH-5140       # 
+2E8E ; 5140 ;  SL      #* ( ⺎ → 兀 ) CJK RADICAL LAME ONE → CJK UNIFIED IDEOGRAPH-5140  # 
+
+FA74 ; 5145 ;  SL      # ( 充 → 充 ) CJK COMPATIBILITY IDEOGRAPH-FA74 → CJK UNIFIED IDEOGRAPH-5145       # 
+
+FA32 ; 514D ;  SL      # ( 免 → 免 ) CJK COMPATIBILITY IDEOGRAPH-FA32 → CJK UNIFIED IDEOGRAPH-514D       # 
+2F80E ;        514D ;  SL      # ( 免 → 免 ) CJK COMPATIBILITY IDEOGRAPH-2F80E → CJK UNIFIED IDEOGRAPH-514D     # 
+
+2F80F ;        5154 ;  SL      # ( 兔 → 兔 ) CJK COMPATIBILITY IDEOGRAPH-2F80F → CJK UNIFIED IDEOGRAPH-5154     # 
+
+2F810 ;        5164 ;  SL      # ( 兤 → 兤 ) CJK COMPATIBILITY IDEOGRAPH-2F810 → CJK UNIFIED IDEOGRAPH-5164     # 
+
+2F0A ; 5165 ;  SL      #* ( ⼊ → 入 ) KANGXI RADICAL ENTER → CJK UNIFIED IDEOGRAPH-5165  # 
+
+2F814 ;        5167 ;  SL      # ( 內 → 內 ) CJK COMPATIBILITY IDEOGRAPH-2F814 → CJK UNIFIED IDEOGRAPH-5167     # 
+
+FA72 ; 5168 ;  SL      # ( 全 → 全 ) CJK COMPATIBILITY IDEOGRAPH-FA72 → CJK UNIFIED IDEOGRAPH-5168       # 
+
+F978 ; 5169 ;  SL      # ( 兩 → 兩 ) CJK COMPATIBILITY IDEOGRAPH-F978 → CJK UNIFIED IDEOGRAPH-5169       # 
+
+2F0B ; 516B ;  SL      #* ( ⼋ → 八 ) KANGXI RADICAL EIGHT → CJK UNIFIED IDEOGRAPH-516B  # 
+
+F9D1 ; 516D ;  SL      # ( 六 → 六 ) CJK COMPATIBILITY IDEOGRAPH-F9D1 → CJK UNIFIED IDEOGRAPH-516D       # 
+
+2F811 ;        5177 ;  SL      # ( 具 → 具 ) CJK COMPATIBILITY IDEOGRAPH-2F811 → CJK UNIFIED IDEOGRAPH-5177     # 
+
+FA75 ; 5180 ;  SL      # ( 冀 → 冀 ) CJK COMPATIBILITY IDEOGRAPH-FA75 → CJK UNIFIED IDEOGRAPH-5180       # 
+
+2F0C ; 5182 ;  SL      #* ( ⼌ → 冂 ) KANGXI RADICAL DOWN BOX → CJK UNIFIED IDEOGRAPH-5182       # 
+
+2F815 ;        518D ;  SL      # ( 再 → 再 ) CJK COMPATIBILITY IDEOGRAPH-2F815 → CJK UNIFIED IDEOGRAPH-518D     # 
+
+2F8D2 ;        5192 ;  SL      # ( 冒 → 冒 ) CJK COMPATIBILITY IDEOGRAPH-2F8D2 → CJK UNIFIED IDEOGRAPH-5192     # 
+
+2F8D3 ;        5195 ;  SL      # ( 冕 → 冕 ) CJK COMPATIBILITY IDEOGRAPH-2F8D3 → CJK UNIFIED IDEOGRAPH-5195     # 
+
+2F0D ; 5196 ;  SL      #* ( ⼍ → 冖 ) KANGXI RADICAL COVER → CJK UNIFIED IDEOGRAPH-5196  # 
+
+2F817 ;        5197 ;  SL      # ( 冗 → 冗 ) CJK COMPATIBILITY IDEOGRAPH-2F817 → CJK UNIFIED IDEOGRAPH-5197     # 
+
+2F818 ;        51A4 ;  SL      # ( 冤 → 冤 ) CJK COMPATIBILITY IDEOGRAPH-2F818 → CJK UNIFIED IDEOGRAPH-51A4     # 
+
+2F0E ; 51AB ;  SL      #* ( ⼎ → 冫 ) KANGXI RADICAL ICE → CJK UNIFIED IDEOGRAPH-51AB    # 
+
+2F81A ;        51AC ;  SL      # ( 冬 → 冬 ) CJK COMPATIBILITY IDEOGRAPH-2F81A → CJK UNIFIED IDEOGRAPH-51AC     # 
+
+FA71 ; 51B5 ;  SL      # ( 况 → 况 ) CJK COMPATIBILITY IDEOGRAPH-FA71 → CJK UNIFIED IDEOGRAPH-51B5       # 
+2F81B ;        51B5 ;  SL      # ( 况 → 况 ) CJK COMPATIBILITY IDEOGRAPH-2F81B → CJK UNIFIED IDEOGRAPH-51B5     # 
+
+F92E ; 51B7 ;  SL      # ( 冷 → 冷 ) CJK COMPATIBILITY IDEOGRAPH-F92E → CJK UNIFIED IDEOGRAPH-51B7       # 
+
+F979 ; 51C9 ;  SL      # ( 凉 → 凉 ) CJK COMPATIBILITY IDEOGRAPH-F979 → CJK UNIFIED IDEOGRAPH-51C9       # 
+
+F955 ; 51CC ;  SL      # ( 凌 → 凌 ) CJK COMPATIBILITY IDEOGRAPH-F955 → CJK UNIFIED IDEOGRAPH-51CC       # 
+
+F954 ; 51DC ;  SL      # ( 凜 → 凜 ) CJK COMPATIBILITY IDEOGRAPH-F954 → CJK UNIFIED IDEOGRAPH-51DC       # 
+
+FA15 ; 51DE ;  SL      # ( 凞 → 凞 ) CJK COMPATIBILITY IDEOGRAPH-FA15 → CJK UNIFIED IDEOGRAPH-51DE       # 
+
+2F0F ; 51E0 ;  SL      #* ( ⼏ → 几 ) KANGXI RADICAL TABLE → CJK UNIFIED IDEOGRAPH-51E0  # 
+
+2F81D ;        51F5 ;  SL      # ( 凵 → 凵 ) CJK COMPATIBILITY IDEOGRAPH-2F81D → CJK UNIFIED IDEOGRAPH-51F5     # 
+2F10 ; 51F5 ;  SL      #* ( ⼐ → 凵 ) KANGXI RADICAL OPEN BOX → CJK UNIFIED IDEOGRAPH-51F5       # 
+
+2F11 ; 5200 ;  SL      #* ( ⼑ → 刀 ) KANGXI RADICAL KNIFE → CJK UNIFIED IDEOGRAPH-5200  # 
+
+2E89 ; 5202 ;  SL      #* ( ⺉ → 刂 ) CJK RADICAL KNIFE TWO → CJK UNIFIED IDEOGRAPH-5202 # 
+
+2F81E ;        5203 ;  SL      # ( 刃 → 刃 ) CJK COMPATIBILITY IDEOGRAPH-2F81E → CJK UNIFIED IDEOGRAPH-5203     # 
+
+FA00 ; 5207 ;  SL      # ( 切 → 切 ) CJK COMPATIBILITY IDEOGRAPH-FA00 → CJK UNIFIED IDEOGRAPH-5207       # 
+2F850 ;        5207 ;  SL      # ( 切 → 切 ) CJK COMPATIBILITY IDEOGRAPH-2F850 → CJK UNIFIED IDEOGRAPH-5207     # 
+
+F99C ; 5217 ;  SL      # ( 列 → 列 ) CJK COMPATIBILITY IDEOGRAPH-F99C → CJK UNIFIED IDEOGRAPH-5217       # 
+
+F9DD ; 5229 ;  SL      # ( 利 → 利 ) CJK COMPATIBILITY IDEOGRAPH-F9DD → CJK UNIFIED IDEOGRAPH-5229       # 
+
+F9FF ; 523A ;  SL      # ( 刺 → 刺 ) CJK COMPATIBILITY IDEOGRAPH-F9FF → CJK UNIFIED IDEOGRAPH-523A       # 
+
+2F820 ;        523B ;  SL      # ( 刻 → 刻 ) CJK COMPATIBILITY IDEOGRAPH-2F820 → CJK UNIFIED IDEOGRAPH-523B     # 
+
+2F821 ;        5246 ;  SL      # ( 剆 → 剆 ) CJK COMPATIBILITY IDEOGRAPH-2F821 → CJK UNIFIED IDEOGRAPH-5246     # 
+
+2F822 ;        5272 ;  SL      # ( 割 → 割 ) CJK COMPATIBILITY IDEOGRAPH-2F822 → CJK UNIFIED IDEOGRAPH-5272     # 
+
+2F823 ;        5277 ;  SL      # ( 剷 → 剷 ) CJK COMPATIBILITY IDEOGRAPH-2F823 → CJK UNIFIED IDEOGRAPH-5277     # 
+
+F9C7 ; 5289 ;  SL      # ( 劉 → 劉 ) CJK COMPATIBILITY IDEOGRAPH-F9C7 → CJK UNIFIED IDEOGRAPH-5289       # 
+
+F98A ; 529B ;  SL      # ( 力 → 力 ) CJK COMPATIBILITY IDEOGRAPH-F98A → CJK UNIFIED IDEOGRAPH-529B       # 
+2F12 ; 529B ;  SL      #* ( ⼒ → 力 ) KANGXI RADICAL POWER → CJK UNIFIED IDEOGRAPH-529B  # 
+
+F99D ; 52A3 ;  SL      # ( 劣 → 劣 ) CJK COMPATIBILITY IDEOGRAPH-F99D → CJK UNIFIED IDEOGRAPH-52A3       # 
+
+2F992 ;        52B3 ;  SL      # ( 劳 → 劳 ) CJK COMPATIBILITY IDEOGRAPH-2F992 → CJK UNIFIED IDEOGRAPH-52B3     # 
+
+FA76 ; 52C7 ;  SL      # ( 勇 → 勇 ) CJK COMPATIBILITY IDEOGRAPH-FA76 → CJK UNIFIED IDEOGRAPH-52C7       # 
+2F825 ;        52C7 ;  SL      # ( 勇 → 勇 ) CJK COMPATIBILITY IDEOGRAPH-2F825 → CJK UNIFIED IDEOGRAPH-52C7     # 
+
+FA33 ; 52C9 ;  SL      # ( 勉 → 勉 ) CJK COMPATIBILITY IDEOGRAPH-FA33 → CJK UNIFIED IDEOGRAPH-52C9       # 
+2F826 ;        52C9 ;  SL      # ( 勉 → 勉 ) CJK COMPATIBILITY IDEOGRAPH-2F826 → CJK UNIFIED IDEOGRAPH-52C9     # 
+
+F952 ; 52D2 ;  SL      # ( 勒 → 勒 ) CJK COMPATIBILITY IDEOGRAPH-F952 → CJK UNIFIED IDEOGRAPH-52D2       # 
+
+F92F ; 52DE ;  SL      # ( 勞 → 勞 ) CJK COMPATIBILITY IDEOGRAPH-F92F → CJK UNIFIED IDEOGRAPH-52DE       # 
+
+FA34 ; 52E4 ;  SL      # ( 勤 → 勤 ) CJK COMPATIBILITY IDEOGRAPH-FA34 → CJK UNIFIED IDEOGRAPH-52E4       # 
+2F827 ;        52E4 ;  SL      # ( 勤 → 勤 ) CJK COMPATIBILITY IDEOGRAPH-2F827 → CJK UNIFIED IDEOGRAPH-52E4     # 
+
+F97F ; 52F5 ;  SL      # ( 勵 → 勵 ) CJK COMPATIBILITY IDEOGRAPH-F97F → CJK UNIFIED IDEOGRAPH-52F5       # 
+
+2F13 ; 52F9 ;  SL      #* ( ⼓ → 勹 ) KANGXI RADICAL WRAP → CJK UNIFIED IDEOGRAPH-52F9   # 
+
+FA77 ; 52FA ;  SL      # ( 勺 → 勺 ) CJK COMPATIBILITY IDEOGRAPH-FA77 → CJK UNIFIED IDEOGRAPH-52FA       # 
+2F828 ;        52FA ;  SL      # ( 勺 → 勺 ) CJK COMPATIBILITY IDEOGRAPH-2F828 → CJK UNIFIED IDEOGRAPH-52FA     # 
+
+2F829 ;        5305 ;  SL      # ( 包 → 包 ) CJK COMPATIBILITY IDEOGRAPH-2F829 → CJK UNIFIED IDEOGRAPH-5305     # 
+
+2F82A ;        5306 ;  SL      # ( 匆 → 匆 ) CJK COMPATIBILITY IDEOGRAPH-2F82A → CJK UNIFIED IDEOGRAPH-5306     # 
+
+2F14 ; 5315 ;  SL      #* ( ⼔ → 匕 ) KANGXI RADICAL SPOON → CJK UNIFIED IDEOGRAPH-5315  # 
+
+F963 ; 5317 ;  SL      # ( 北 → 北 ) CJK COMPATIBILITY IDEOGRAPH-F963 → CJK UNIFIED IDEOGRAPH-5317       # 
+2F82B ;        5317 ;  SL      # ( 北 → 北 ) CJK COMPATIBILITY IDEOGRAPH-2F82B → CJK UNIFIED IDEOGRAPH-5317     # 
+
+2F15 ; 531A ;  SL      #* ( ⼕ → 匚 ) KANGXI RADICAL RIGHT OPEN BOX → CJK UNIFIED IDEOGRAPH-531A # 
+
+2F16 ; 5338 ;  SL      #* ( ⼖ → 匸 ) KANGXI RADICAL HIDING ENCLOSURE → CJK UNIFIED IDEOGRAPH-5338       # 
+
+F9EB ; 533F ;  SL      # ( 匿 → 匿 ) CJK COMPATIBILITY IDEOGRAPH-F9EB → CJK UNIFIED IDEOGRAPH-533F       # 
+
+2F17 ; 5341 ;  SL      #* ( ⼗ → 十 ) KANGXI RADICAL TEN → CJK UNIFIED IDEOGRAPH-5341    # 
+3038 ; 5341 ;  SL      # ( 〸 → 十 ) HANGZHOU NUMERAL TEN → CJK UNIFIED IDEOGRAPH-5341   # 
+
+3039 ; 5344 ;  SL      # ( 〹 → 卄 ) HANGZHOU NUMERAL TWENTY → CJK UNIFIED IDEOGRAPH-5344        # 
+
+303A ; 5345 ;  SL      # ( 〺 → 卅 ) HANGZHOU NUMERAL THIRTY → CJK UNIFIED IDEOGRAPH-5345        # 
+
+2F82C ;        5349 ;  SL      # ( 卉 → 卉 ) CJK COMPATIBILITY IDEOGRAPH-2F82C → CJK UNIFIED IDEOGRAPH-5349     # 
+
+FA35 ; 5351 ;  SL      # ( 卑 → 卑 ) CJK COMPATIBILITY IDEOGRAPH-FA35 → CJK UNIFIED IDEOGRAPH-5351       # 
+2F82D ;        5351 ;  SL      # ( 卑 → 卑 ) CJK COMPATIBILITY IDEOGRAPH-2F82D → CJK UNIFIED IDEOGRAPH-5351     # 
+
+2F82E ;        535A ;  SL      # ( 博 → 博 ) CJK COMPATIBILITY IDEOGRAPH-2F82E → CJK UNIFIED IDEOGRAPH-535A     # 
+
+2F18 ; 535C ;  SL      #* ( ⼘ → 卜 ) KANGXI RADICAL DIVINATION → CJK UNIFIED IDEOGRAPH-535C     # 
+
+2F19 ; 5369 ;  SL      #* ( ⼙ → 卩 ) KANGXI RADICAL SEAL → CJK UNIFIED IDEOGRAPH-5369   # 
+
+2F82F ;        5373 ;  SL      # ( 即 → 即 ) CJK COMPATIBILITY IDEOGRAPH-2F82F → CJK UNIFIED IDEOGRAPH-5373     # 
+
+F91C ; 5375 ;  SL      # ( 卵 → 卵 ) CJK COMPATIBILITY IDEOGRAPH-F91C → CJK UNIFIED IDEOGRAPH-5375       # 
+
+2F830 ;        537D ;  SL      # ( 卽 → 卽 ) CJK COMPATIBILITY IDEOGRAPH-2F830 → CJK UNIFIED IDEOGRAPH-537D     # 
+
+2F831 ;        537F ;  SL      # ( 卿 → 卿 ) CJK COMPATIBILITY IDEOGRAPH-2F831 → CJK UNIFIED IDEOGRAPH-537F     # 
+2F832 ;        537F ;  SL      # ( 卿 → 卿 ) CJK COMPATIBILITY IDEOGRAPH-2F832 → CJK UNIFIED IDEOGRAPH-537F     # 
+2F833 ;        537F ;  SL      # ( 卿 → 卿 ) CJK COMPATIBILITY IDEOGRAPH-2F833 → CJK UNIFIED IDEOGRAPH-537F     # 
+
+2F1A ; 5382 ;  SL      #* ( ⼚ → 厂 ) KANGXI RADICAL CLIFF → CJK UNIFIED IDEOGRAPH-5382  # 
+
+2F1B ; 53B6 ;  SL      #* ( ⼛ → 厶 ) KANGXI RADICAL PRIVATE → CJK UNIFIED IDEOGRAPH-53B6        # 
+
+F96B ; 53C3 ;  SL      # ( 參 → 參 ) CJK COMPATIBILITY IDEOGRAPH-F96B → CJK UNIFIED IDEOGRAPH-53C3       # 
+
+2F1C ; 53C8 ;  SL      #* ( ⼜ → 又 ) KANGXI RADICAL AGAIN → CJK UNIFIED IDEOGRAPH-53C8  # 
+
+2F836 ;        53CA ;  SL      # ( 及 → 及 ) CJK COMPATIBILITY IDEOGRAPH-2F836 → CJK UNIFIED IDEOGRAPH-53CA     # 
+
+2F837 ;        53DF ;  SL      # ( 叟 → 叟 ) CJK COMPATIBILITY IDEOGRAPH-2F837 → CJK UNIFIED IDEOGRAPH-53DF     # 
+
+2F1D ; 53E3 ;  SL      #* ( ⼝ → 口 ) KANGXI RADICAL MOUTH → CJK UNIFIED IDEOGRAPH-53E3  # 
+
+F906 ; 53E5 ;  SL      # ( 句 → 句 ) CJK COMPATIBILITY IDEOGRAPH-F906 → CJK UNIFIED IDEOGRAPH-53E5       # 
+
+2F839 ;        53EB ;  SL      # ( 叫 → 叫 ) CJK COMPATIBILITY IDEOGRAPH-2F839 → CJK UNIFIED IDEOGRAPH-53EB     # 
+
+2F83A ;        53F1 ;  SL      # ( 叱 → 叱 ) CJK COMPATIBILITY IDEOGRAPH-2F83A → CJK UNIFIED IDEOGRAPH-53F1     # 
+
+2F83B ;        5406 ;  SL      # ( 吆 → 吆 ) CJK COMPATIBILITY IDEOGRAPH-2F83B → CJK UNIFIED IDEOGRAPH-5406     # 
+
+F9DE ; 540F ;  SL      # ( 吏 → 吏 ) CJK COMPATIBILITY IDEOGRAPH-F9DE → CJK UNIFIED IDEOGRAPH-540F       # 
+
+F9ED ; 541D ;  SL      # ( 吝 → 吝 ) CJK COMPATIBILITY IDEOGRAPH-F9ED → CJK UNIFIED IDEOGRAPH-541D       # 
+
+2F83D ;        5438 ;  SL      # ( 吸 → 吸 ) CJK COMPATIBILITY IDEOGRAPH-2F83D → CJK UNIFIED IDEOGRAPH-5438     # 
+
+F980 ; 5442 ;  SL      # ( 呂 → 呂 ) CJK COMPATIBILITY IDEOGRAPH-F980 → CJK UNIFIED IDEOGRAPH-5442       # 
+
+2F83E ;        5448 ;  SL      # ( 呈 → 呈 ) CJK COMPATIBILITY IDEOGRAPH-2F83E → CJK UNIFIED IDEOGRAPH-5448     # 
+
+2F83F ;        5468 ;  SL      # ( 周 → 周 ) CJK COMPATIBILITY IDEOGRAPH-2F83F → CJK UNIFIED IDEOGRAPH-5468     # 
+
+2F83C ;        549E ;  SL      # ( 咞 → 咞 ) CJK COMPATIBILITY IDEOGRAPH-2F83C → CJK UNIFIED IDEOGRAPH-549E     # 
+
+2F840 ;        54A2 ;  SL      # ( 咢 → 咢 ) CJK COMPATIBILITY IDEOGRAPH-2F840 → CJK UNIFIED IDEOGRAPH-54A2     # 
+
+F99E ; 54BD ;  SL      # ( 咽 → 咽 ) CJK COMPATIBILITY IDEOGRAPH-F99E → CJK UNIFIED IDEOGRAPH-54BD       # 
+
+2F841 ;        54F6 ;  SL      # ( 哶 → 哶 ) CJK COMPATIBILITY IDEOGRAPH-2F841 → CJK UNIFIED IDEOGRAPH-54F6     # 
+
+2F842 ;        5510 ;  SL      # ( 唐 → 唐 ) CJK COMPATIBILITY IDEOGRAPH-2F842 → CJK UNIFIED IDEOGRAPH-5510     # 
+
+2F843 ;        5553 ;  SL      # ( 啓 → 啓 ) CJK COMPATIBILITY IDEOGRAPH-2F843 → CJK UNIFIED IDEOGRAPH-5553     # 
+555F ; 5553 ;  SL      # ( 啟 → 啓 ) CJK UNIFIED IDEOGRAPH-555F → CJK UNIFIED IDEOGRAPH-5553     # 
+
+FA79 ; 5555 ;  SL      # ( 啕 → 啕 ) CJK COMPATIBILITY IDEOGRAPH-FA79 → CJK UNIFIED IDEOGRAPH-5555       # 
+
+2F844 ;        5563 ;  SL      # ( 啣 → 啣 ) CJK COMPATIBILITY IDEOGRAPH-2F844 → CJK UNIFIED IDEOGRAPH-5563     # 
+
+2F845 ;        5584 ;  SL      # ( 善 → 善 ) CJK COMPATIBILITY IDEOGRAPH-2F845 → CJK UNIFIED IDEOGRAPH-5584     # 
+2F846 ;        5584 ;  SL      # ( 善 → 善 ) CJK COMPATIBILITY IDEOGRAPH-2F846 → CJK UNIFIED IDEOGRAPH-5584     # 
+
+F90B ; 5587 ;  SL      # ( 喇 → 喇 ) CJK COMPATIBILITY IDEOGRAPH-F90B → CJK UNIFIED IDEOGRAPH-5587       # 
+
+FA7A ; 5599 ;  SL      # ( 喙 → 喙 ) CJK COMPATIBILITY IDEOGRAPH-FA7A → CJK UNIFIED IDEOGRAPH-5599       # 
+2F847 ;        5599 ;  SL      # ( 喙 → 喙 ) CJK COMPATIBILITY IDEOGRAPH-2F847 → CJK UNIFIED IDEOGRAPH-5599     # 
+
+FA36 ; 559D ;  SL      # ( 喝 → 喝 ) CJK COMPATIBILITY IDEOGRAPH-FA36 → CJK UNIFIED IDEOGRAPH-559D       # 
+FA78 ; 559D ;  SL      # ( 喝 → 喝 ) CJK COMPATIBILITY IDEOGRAPH-FA78 → CJK UNIFIED IDEOGRAPH-559D       # 
+
+2F848 ;        55AB ;  SL      # ( 喫 → 喫 ) CJK COMPATIBILITY IDEOGRAPH-2F848 → CJK UNIFIED IDEOGRAPH-55AB     # 
+
+2F849 ;        55B3 ;  SL      # ( 喳 → 喳 ) CJK COMPATIBILITY IDEOGRAPH-2F849 → CJK UNIFIED IDEOGRAPH-55B3     # 
+
+FA0D ; 55C0 ;  SL      # ( 嗀 → 嗀 ) CJK COMPATIBILITY IDEOGRAPH-FA0D → CJK UNIFIED IDEOGRAPH-55C0       # 
+
+2F84A ;        55C2 ;  SL      # ( 嗂 → 嗂 ) CJK COMPATIBILITY IDEOGRAPH-2F84A → CJK UNIFIED IDEOGRAPH-55C2     # 
+
+FA7B ; 55E2 ;  SL      # ( 嗢 → 嗢 ) CJK COMPATIBILITY IDEOGRAPH-FA7B → CJK UNIFIED IDEOGRAPH-55E2       # 
+
+FA37 ; 5606 ;  SL      # ( 嘆 → 嘆 ) CJK COMPATIBILITY IDEOGRAPH-FA37 → CJK UNIFIED IDEOGRAPH-5606       # 
+2F84C ;        5606 ;  SL      # ( 嘆 → 嘆 ) CJK COMPATIBILITY IDEOGRAPH-2F84C → CJK UNIFIED IDEOGRAPH-5606     # 
+
+2F84E ;        5651 ;  SL      # ( 噑 → 噑 ) CJK COMPATIBILITY IDEOGRAPH-2F84E → CJK UNIFIED IDEOGRAPH-5651     # 
+
+FA38 ; 5668 ;  SL      # ( 器 → 器 ) CJK COMPATIBILITY IDEOGRAPH-FA38 → CJK UNIFIED IDEOGRAPH-5668       # 
+
+2F84F ;        5674 ;  SL      # ( 噴 → 噴 ) CJK COMPATIBILITY IDEOGRAPH-2F84F → CJK UNIFIED IDEOGRAPH-5674     # 
+
+2F1E ; 56D7 ;  SL      #* ( ⼞ → 囗 ) KANGXI RADICAL ENCLOSURE → CJK UNIFIED IDEOGRAPH-56D7      # 
+
+F9A9 ; 56F9 ;  SL      # ( 囹 → 囹 ) CJK COMPATIBILITY IDEOGRAPH-F9A9 → CJK UNIFIED IDEOGRAPH-56F9       # 
+
+2F84B ;        5716 ;  SL      # ( 圖 → 圖 ) CJK COMPATIBILITY IDEOGRAPH-2F84B → CJK UNIFIED IDEOGRAPH-5716     # 
+
+2F84D ;        5717 ;  SL      # ( 圗 → 圗 ) CJK COMPATIBILITY IDEOGRAPH-2F84D → CJK UNIFIED IDEOGRAPH-5717     # 
+
+2F1F ; 571F ;  SL      #* ( ⼟ → 土 ) KANGXI RADICAL EARTH → CJK UNIFIED IDEOGRAPH-571F  # 
+
+2F855 ;        578B ;  SL      # ( 型 → 型 ) CJK COMPATIBILITY IDEOGRAPH-2F855 → CJK UNIFIED IDEOGRAPH-578B     # 
+
+2F852 ;        57CE ;  SL      # ( 城 → 城 ) CJK COMPATIBILITY IDEOGRAPH-2F852 → CJK UNIFIED IDEOGRAPH-57CE     # 
+
+2F853 ;        57F4 ;  SL      # ( 埴 → 埴 ) CJK COMPATIBILITY IDEOGRAPH-2F853 → CJK UNIFIED IDEOGRAPH-57F4     # 
+
+2F854 ;        580D ;  SL      # ( 堍 → 堍 ) CJK COMPATIBILITY IDEOGRAPH-2F854 → CJK UNIFIED IDEOGRAPH-580D     # 
+
+2F857 ;        5831 ;  SL      # ( 報 → 報 ) CJK COMPATIBILITY IDEOGRAPH-2F857 → CJK UNIFIED IDEOGRAPH-5831     # 
+
+2F856 ;        5832 ;  SL      # ( 堲 → 堲 ) CJK COMPATIBILITY IDEOGRAPH-2F856 → CJK UNIFIED IDEOGRAPH-5832     # 
+
+FA39 ; 5840 ;  SL      # ( 塀 → 塀 ) CJK COMPATIBILITY IDEOGRAPH-FA39 → CJK UNIFIED IDEOGRAPH-5840       # 
+
+FA10 ; 585A ;  SL      # ( 塚 → 塚 ) CJK COMPATIBILITY IDEOGRAPH-FA10 → CJK UNIFIED IDEOGRAPH-585A       # 
+FA7C ; 585A ;  SL      # ( 塚 → 塚 ) CJK COMPATIBILITY IDEOGRAPH-FA7C → CJK UNIFIED IDEOGRAPH-585A       # 
+
+F96C ; 585E ;  SL      # ( 塞 → 塞 ) CJK COMPATIBILITY IDEOGRAPH-F96C → CJK UNIFIED IDEOGRAPH-585E       # 
+
+586B ; 5861 ;  SL      # ( 填 → 塡 ) CJK UNIFIED IDEOGRAPH-586B → CJK UNIFIED IDEOGRAPH-5861     # 
+
+FA3A ; 58A8 ;  SL      # ( 墨 → 墨 ) CJK COMPATIBILITY IDEOGRAPH-FA3A → CJK UNIFIED IDEOGRAPH-58A8       # 
+
+58FF ; 58AB ;  SL      # ( 壿 → 墫 ) CJK UNIFIED IDEOGRAPH-58FF → CJK UNIFIED IDEOGRAPH-58AB     # 
+
+2F858 ;        58AC ;  SL      # ( 墬 → 墬 ) CJK COMPATIBILITY IDEOGRAPH-2F858 → CJK UNIFIED IDEOGRAPH-58AC     # 
+
+FA7D ; 58B3 ;  SL      # ( 墳 → 墳 ) CJK COMPATIBILITY IDEOGRAPH-FA7D → CJK UNIFIED IDEOGRAPH-58B3       # 
+
+F94A ; 58D8 ;  SL      # ( 壘 → 壘 ) CJK COMPATIBILITY IDEOGRAPH-F94A → CJK UNIFIED IDEOGRAPH-58D8       # 
+
+F942 ; 58DF ;  SL      # ( 壟 → 壟 ) CJK COMPATIBILITY IDEOGRAPH-F942 → CJK UNIFIED IDEOGRAPH-58DF       # 
+
+2F20 ; 58EB ;  SL      #* ( ⼠ → 士 ) KANGXI RADICAL SCHOLAR → CJK UNIFIED IDEOGRAPH-58EB        # 
+
+2F851 ;        58EE ;  SL      # ( 壮 → 壮 ) CJK COMPATIBILITY IDEOGRAPH-2F851 → CJK UNIFIED IDEOGRAPH-58EE     # 
+
+2F85A ;        58F2 ;  SL      # ( 売 → 売 ) CJK COMPATIBILITY IDEOGRAPH-2F85A → CJK UNIFIED IDEOGRAPH-58F2     # 
+
+2F85B ;        58F7 ;  SL      # ( 壷 → 壷 ) CJK COMPATIBILITY IDEOGRAPH-2F85B → CJK UNIFIED IDEOGRAPH-58F7     # 
+
+2F21 ; 5902 ;  SL      #* ( ⼡ → 夂 ) KANGXI RADICAL GO → CJK UNIFIED IDEOGRAPH-5902     # 
+
+2F85C ;        5906 ;  SL      # ( 夆 → 夆 ) CJK COMPATIBILITY IDEOGRAPH-2F85C → CJK UNIFIED IDEOGRAPH-5906     # 
+
+2F22 ; 590A ;  SL      #* ( ⼢ → 夊 ) KANGXI RADICAL GO SLOWLY → CJK UNIFIED IDEOGRAPH-590A      # 
+
+2F23 ; 5915 ;  SL      #* ( ⼣ → 夕 ) KANGXI RADICAL EVENING → CJK UNIFIED IDEOGRAPH-5915        # 
+
+2F85D ;        591A ;  SL      # ( 多 → 多 ) CJK COMPATIBILITY IDEOGRAPH-2F85D → CJK UNIFIED IDEOGRAPH-591A     # 
+
+2F85E ;        5922 ;  SL      # ( 夢 → 夢 ) CJK COMPATIBILITY IDEOGRAPH-2F85E → CJK UNIFIED IDEOGRAPH-5922     # 
+
+2F24 ; 5927 ;  SL      #* ( ⼤ → 大 ) KANGXI RADICAL BIG → CJK UNIFIED IDEOGRAPH-5927    # 
+
+FA7E ; 5944 ;  SL      # ( 奄 → 奄 ) CJK COMPATIBILITY IDEOGRAPH-FA7E → CJK UNIFIED IDEOGRAPH-5944       # 
+
+F90C ; 5948 ;  SL      # ( 奈 → 奈 ) CJK COMPATIBILITY IDEOGRAPH-F90C → CJK UNIFIED IDEOGRAPH-5948       # 
+
+F909 ; 5951 ;  SL      # ( 契 → 契 ) CJK COMPATIBILITY IDEOGRAPH-F909 → CJK UNIFIED IDEOGRAPH-5951       # 
+
+FA7F ; 5954 ;  SL      # ( 奔 → 奔 ) CJK COMPATIBILITY IDEOGRAPH-FA7F → CJK UNIFIED IDEOGRAPH-5954       # 
+
+2F85F ;        5962 ;  SL      # ( 奢 → 奢 ) CJK COMPATIBILITY IDEOGRAPH-2F85F → CJK UNIFIED IDEOGRAPH-5962     # 
+
+F981 ; 5973 ;  SL      # ( 女 → 女 ) CJK COMPATIBILITY IDEOGRAPH-F981 → CJK UNIFIED IDEOGRAPH-5973       # 
+2F25 ; 5973 ;  SL      #* ( ⼥ → 女 ) KANGXI RADICAL WOMAN → CJK UNIFIED IDEOGRAPH-5973  # 
+
+2F865 ;        59D8 ;  SL      # ( 姘 → 姘 ) CJK COMPATIBILITY IDEOGRAPH-2F865 → CJK UNIFIED IDEOGRAPH-59D8     # 
+
+2F862 ;        59EC ;  SL      # ( 姬 → 姬 ) CJK COMPATIBILITY IDEOGRAPH-2F862 → CJK UNIFIED IDEOGRAPH-59EC     # 
+
+2F863 ;        5A1B ;  SL      # ( 娛 → 娛 ) CJK COMPATIBILITY IDEOGRAPH-2F863 → CJK UNIFIED IDEOGRAPH-5A1B     # 
+
+2F864 ;        5A27 ;  SL      # ( 娧 → 娧 ) CJK COMPATIBILITY IDEOGRAPH-2F864 → CJK UNIFIED IDEOGRAPH-5A27     # 
+
+FA80 ; 5A62 ;  SL      # ( 婢 → 婢 ) CJK COMPATIBILITY IDEOGRAPH-FA80 → CJK UNIFIED IDEOGRAPH-5A62       # 
+
+2F866 ;        5A66 ;  SL      # ( 婦 → 婦 ) CJK COMPATIBILITY IDEOGRAPH-2F866 → CJK UNIFIED IDEOGRAPH-5A66     # 
+
+5B00 ; 5AAF ;  SL      # ( 嬀 → 媯 ) CJK UNIFIED IDEOGRAPH-5B00 → CJK UNIFIED IDEOGRAPH-5AAF     # 
+
+2F986 ;        5AB5 ;  SL      # ( 媵 → 媵 ) CJK COMPATIBILITY IDEOGRAPH-2F986 → CJK UNIFIED IDEOGRAPH-5AB5     # 
+
+2F869 ;        5B08 ;  SL      # ( 嬈 → 嬈 ) CJK COMPATIBILITY IDEOGRAPH-2F869 → CJK UNIFIED IDEOGRAPH-5B08     # 
+
+FA81 ; 5B28 ;  SL      # ( 嬨 → 嬨 ) CJK COMPATIBILITY IDEOGRAPH-FA81 → CJK UNIFIED IDEOGRAPH-5B28       # 
+
+2F86A ;        5B3E ;  SL      # ( 嬾 → 嬾 ) CJK COMPATIBILITY IDEOGRAPH-2F86A → CJK UNIFIED IDEOGRAPH-5B3E     # 
+2F86B ;        5B3E ;  SL      # ( 嬾 → 嬾 ) CJK COMPATIBILITY IDEOGRAPH-2F86B → CJK UNIFIED IDEOGRAPH-5B3E     # 
+
+2F26 ; 5B50 ;  SL      #* ( ⼦ → 子 ) KANGXI RADICAL CHILD → CJK UNIFIED IDEOGRAPH-5B50  # 
+
+2F27 ; 5B80 ;  SL      #* ( ⼧ → 宀 ) KANGXI RADICAL ROOF → CJK UNIFIED IDEOGRAPH-5B80   # 
+
+FA04 ; 5B85 ;  SL      # ( 宅 → 宅 ) CJK COMPATIBILITY IDEOGRAPH-FA04 → CJK UNIFIED IDEOGRAPH-5B85       # 
+
+2F86D ;        5BC3 ;  SL      # ( 寃 → 寃 ) CJK COMPATIBILITY IDEOGRAPH-2F86D → CJK UNIFIED IDEOGRAPH-5BC3     # 
+
+2F86E ;        5BD8 ;  SL      # ( 寘 → 寘 ) CJK COMPATIBILITY IDEOGRAPH-2F86E → CJK UNIFIED IDEOGRAPH-5BD8     # 
+
+F95F ; 5BE7 ;  SL      # ( 寧 → 寧 ) CJK COMPATIBILITY IDEOGRAPH-F95F → CJK UNIFIED IDEOGRAPH-5BE7       # 
+F9AA ; 5BE7 ;  SL      # ( 寧 → 寧 ) CJK COMPATIBILITY IDEOGRAPH-F9AA → CJK UNIFIED IDEOGRAPH-5BE7       # 
+2F86F ;        5BE7 ;  SL      # ( 寧 → 寧 ) CJK COMPATIBILITY IDEOGRAPH-2F86F → CJK UNIFIED IDEOGRAPH-5BE7     # 
+
+F9BC ; 5BEE ;  SL      # ( 寮 → 寮 ) CJK COMPATIBILITY IDEOGRAPH-F9BC → CJK UNIFIED IDEOGRAPH-5BEE       # 
+
+2F870 ;        5BF3 ;  SL      # ( 寳 → 寳 ) CJK COMPATIBILITY IDEOGRAPH-2F870 → CJK UNIFIED IDEOGRAPH-5BF3     # 
+
+2F28 ; 5BF8 ;  SL      #* ( ⼨ → 寸 ) KANGXI RADICAL INCH → CJK UNIFIED IDEOGRAPH-5BF8   # 
+
+2F872 ;        5BFF ;  SL      # ( 寿 → 寿 ) CJK COMPATIBILITY IDEOGRAPH-2F872 → CJK UNIFIED IDEOGRAPH-5BFF     # 
+
+2F873 ;        5C06 ;  SL      # ( 将 → 将 ) CJK COMPATIBILITY IDEOGRAPH-2F873 → CJK UNIFIED IDEOGRAPH-5C06     # 
+
+2F29 ; 5C0F ;  SL      #* ( ⼩ → 小 ) KANGXI RADICAL SMALL → CJK UNIFIED IDEOGRAPH-5C0F  # 
+
+2F875 ;        5C22 ;  SL      # ( 尢 → 尢 ) CJK COMPATIBILITY IDEOGRAPH-2F875 → CJK UNIFIED IDEOGRAPH-5C22     # 
+2E90 ; 5C22 ;  SL      #* ( ⺐ → 尢 ) CJK RADICAL LAME THREE → CJK UNIFIED IDEOGRAPH-5C22        # 
+2F2A ; 5C22 ;  SL      #* ( ⼪ → 尢 ) KANGXI RADICAL LAME → CJK UNIFIED IDEOGRAPH-5C22   # 
+
+2E8F ; 5C23 ;  SL      #* ( ⺏ → 尣 ) CJK RADICAL LAME TWO → CJK UNIFIED IDEOGRAPH-5C23  # 
+
+2F2B ; 5C38 ;  SL      #* ( ⼫ → 尸 ) KANGXI RADICAL CORPSE → CJK UNIFIED IDEOGRAPH-5C38 # 
+
+F9BD ; 5C3F ;  SL      # ( 尿 → 尿 ) CJK COMPATIBILITY IDEOGRAPH-F9BD → CJK UNIFIED IDEOGRAPH-5C3F       # 
+
+2F877 ;        5C60 ;  SL      # ( 屠 → 屠 ) CJK COMPATIBILITY IDEOGRAPH-2F877 → CJK UNIFIED IDEOGRAPH-5C60     # 
+
+F94B ; 5C62 ;  SL      # ( 屢 → 屢 ) CJK COMPATIBILITY IDEOGRAPH-F94B → CJK UNIFIED IDEOGRAPH-5C62       # 
+
+FA3B ; 5C64 ;  SL      # ( 層 → 層 ) CJK COMPATIBILITY IDEOGRAPH-FA3B → CJK UNIFIED IDEOGRAPH-5C64       # 
+
+F9DF ; 5C65 ;  SL      # ( 履 → 履 ) CJK COMPATIBILITY IDEOGRAPH-F9DF → CJK UNIFIED IDEOGRAPH-5C65       # 
+
+FA3C ; 5C6E ;  SL      # ( 屮 → 屮 ) CJK COMPATIBILITY IDEOGRAPH-FA3C → CJK UNIFIED IDEOGRAPH-5C6E       # 
+2F878 ;        5C6E ;  SL      # ( 屮 → 屮 ) CJK COMPATIBILITY IDEOGRAPH-2F878 → CJK UNIFIED IDEOGRAPH-5C6E     # 
+2F2C ; 5C6E ;  SL      #* ( ⼬ → 屮 ) KANGXI RADICAL SPROUT → CJK UNIFIED IDEOGRAPH-5C6E # 
+
+2F2D ; 5C71 ;  SL      #* ( ⼭ → 山 ) KANGXI RADICAL MOUNTAIN → CJK UNIFIED IDEOGRAPH-5C71       # 
+
+2F87A ;        5C8D ;  SL      # ( 岍 → 岍 ) CJK COMPATIBILITY IDEOGRAPH-2F87A → CJK UNIFIED IDEOGRAPH-5C8D     # 
+
+2F879 ;        5CC0 ;  SL      # ( 峀 → 峀 ) CJK COMPATIBILITY IDEOGRAPH-2F879 → CJK UNIFIED IDEOGRAPH-5CC0     # 
+
+F9D5 ; 5D19 ;  SL      # ( 崙 → 崙 ) CJK COMPATIBILITY IDEOGRAPH-F9D5 → CJK UNIFIED IDEOGRAPH-5D19       # 
+
+2F87C ;        5D43 ;  SL      # ( 嵃 → 嵃 ) CJK COMPATIBILITY IDEOGRAPH-2F87C → CJK UNIFIED IDEOGRAPH-5D43     # 
+
+F921 ; 5D50 ;  SL      # ( 嵐 → 嵐 ) CJK COMPATIBILITY IDEOGRAPH-F921 → CJK UNIFIED IDEOGRAPH-5D50       # 
+
+2F87F ;        5D6B ;  SL      # ( 嵫 → 嵫 ) CJK COMPATIBILITY IDEOGRAPH-2F87F → CJK UNIFIED IDEOGRAPH-5D6B     # 
+
+2F87E ;        5D6E ;  SL      # ( 嵮 → 嵮 ) CJK COMPATIBILITY IDEOGRAPH-2F87E → CJK UNIFIED IDEOGRAPH-5D6E     # 
+
+2F880 ;        5D7C ;  SL      # ( 嵼 → 嵼 ) CJK COMPATIBILITY IDEOGRAPH-2F880 → CJK UNIFIED IDEOGRAPH-5D7C     # 
+
+2F9F4 ;        5DB2 ;  SL      # ( 嶲 → 嶲 ) CJK COMPATIBILITY IDEOGRAPH-2F9F4 → CJK UNIFIED IDEOGRAPH-5DB2     # 
+
+F9AB ; 5DBA ;  SL      # ( 嶺 → 嶺 ) CJK COMPATIBILITY IDEOGRAPH-F9AB → CJK UNIFIED IDEOGRAPH-5DBA       # 
+
+2F2E ; 5DDB ;  SL      #* ( ⼮ → 巛 ) KANGXI RADICAL RIVER → CJK UNIFIED IDEOGRAPH-5DDB  # 
+
+2F881 ;        5DE1 ;  SL      # ( 巡 → 巡 ) CJK COMPATIBILITY IDEOGRAPH-2F881 → CJK UNIFIED IDEOGRAPH-5DE1     # 
+
+2F882 ;        5DE2 ;  SL      # ( 巢 → 巢 ) CJK COMPATIBILITY IDEOGRAPH-2F882 → CJK UNIFIED IDEOGRAPH-5DE2     # 
+
+2F2F ; 5DE5 ;  SL      #* ( ⼯ → 工 ) KANGXI RADICAL WORK → CJK UNIFIED IDEOGRAPH-5DE5   # 
+
+2F30 ; 5DF1 ;  SL      #* ( ⼰ → 己 ) KANGXI RADICAL ONESELF → CJK UNIFIED IDEOGRAPH-5DF1        # 
+
+2E92 ; 5DF3 ;  SL      #* ( ⺒ → 巳 ) CJK RADICAL SNAKE → CJK UNIFIED IDEOGRAPH-5DF3     # 
+
+2F884 ;        5DFD ;  SL      # ( 巽 → 巽 ) CJK COMPATIBILITY IDEOGRAPH-2F884 → CJK UNIFIED IDEOGRAPH-5DFD     # 
+
+2F31 ; 5DFE ;  SL      #* ( ⼱ → 巾 ) KANGXI RADICAL TURBAN → CJK UNIFIED IDEOGRAPH-5DFE # 
+
+5E32 ; 5E21 ;  SL      # ( 帲 → 帡 ) CJK UNIFIED IDEOGRAPH-5E32 → CJK UNIFIED IDEOGRAPH-5E21     # 
+
+2F885 ;        5E28 ;  SL      # ( 帨 → 帨 ) CJK COMPATIBILITY IDEOGRAPH-2F885 → CJK UNIFIED IDEOGRAPH-5E28     # 
+
+2F886 ;        5E3D ;  SL      # ( 帽 → 帽 ) CJK COMPATIBILITY IDEOGRAPH-2F886 → CJK UNIFIED IDEOGRAPH-5E3D     # 
+
+2F887 ;        5E69 ;  SL      # ( 幩 → 幩 ) CJK COMPATIBILITY IDEOGRAPH-2F887 → CJK UNIFIED IDEOGRAPH-5E69     # 
+
+2F32 ; 5E72 ;  SL      #* ( ⼲ → 干 ) KANGXI RADICAL DRY → CJK UNIFIED IDEOGRAPH-5E72    # 
+
+F98E ; 5E74 ;  SL      # ( 年 → 年 ) CJK COMPATIBILITY IDEOGRAPH-F98E → CJK UNIFIED IDEOGRAPH-5E74       # 
+
+2E93 ; 5E7A ;  SL      #* ( ⺓ → 幺 ) CJK RADICAL THREAD → CJK UNIFIED IDEOGRAPH-5E7A    # 
+2F33 ; 5E7A ;  SL      #* ( ⼳ → 幺 ) KANGXI RADICAL SHORT THREAD → CJK UNIFIED IDEOGRAPH-5E7A   # 
+
+2F34 ; 5E7F ;  SL      #* ( ⼴ → 广 ) KANGXI RADICAL DOTTED CLIFF → CJK UNIFIED IDEOGRAPH-5E7F   # 
+
+FA01 ; 5EA6 ;  SL      # ( 度 → 度 ) CJK COMPATIBILITY IDEOGRAPH-FA01 → CJK UNIFIED IDEOGRAPH-5EA6       # 
+
+2F88B ;        5EB0 ;  SL      # ( 庰 → 庰 ) CJK COMPATIBILITY IDEOGRAPH-2F88B → CJK UNIFIED IDEOGRAPH-5EB0     # 
+
+2F88C ;        5EB3 ;  SL      # ( 庳 → 庳 ) CJK COMPATIBILITY IDEOGRAPH-2F88C → CJK UNIFIED IDEOGRAPH-5EB3     # 
+
+2F88D ;        5EB6 ;  SL      # ( 庶 → 庶 ) CJK COMPATIBILITY IDEOGRAPH-2F88D → CJK UNIFIED IDEOGRAPH-5EB6     # 
+
+F9A2 ; 5EC9 ;  SL      # ( 廉 → 廉 ) CJK COMPATIBILITY IDEOGRAPH-F9A2 → CJK UNIFIED IDEOGRAPH-5EC9       # 
+
+F928 ; 5ECA ;  SL      # ( 廊 → 廊 ) CJK COMPATIBILITY IDEOGRAPH-F928 → CJK UNIFIED IDEOGRAPH-5ECA       # 
+2F88E ;        5ECA ;  SL      # ( 廊 → 廊 ) CJK COMPATIBILITY IDEOGRAPH-2F88E → CJK UNIFIED IDEOGRAPH-5ECA     # 
+
+FA82 ; 5ED2 ;  SL      # ( 廒 → 廒 ) CJK COMPATIBILITY IDEOGRAPH-FA82 → CJK UNIFIED IDEOGRAPH-5ED2       # 
+
+FA0B ; 5ED3 ;  SL      # ( 廓 → 廓 ) CJK COMPATIBILITY IDEOGRAPH-FA0B → CJK UNIFIED IDEOGRAPH-5ED3       # 
+
+FA83 ; 5ED9 ;  SL      # ( 廙 → 廙 ) CJK COMPATIBILITY IDEOGRAPH-FA83 → CJK UNIFIED IDEOGRAPH-5ED9       # 
+
+F982 ; 5EEC ;  SL      # ( 廬 → 廬 ) CJK COMPATIBILITY IDEOGRAPH-F982 → CJK UNIFIED IDEOGRAPH-5EEC       # 
+
+2F35 ; 5EF4 ;  SL      #* ( ⼵ → 廴 ) KANGXI RADICAL LONG STRIDE → CJK UNIFIED IDEOGRAPH-5EF4    # 
+
+2F890 ;        5EFE ;  SL      # ( 廾 → 廾 ) CJK COMPATIBILITY IDEOGRAPH-2F890 → CJK UNIFIED IDEOGRAPH-5EFE     # 
+2F36 ; 5EFE ;  SL      #* ( ⼶ → 廾 ) KANGXI RADICAL TWO HANDS → CJK UNIFIED IDEOGRAPH-5EFE      # 
+
+F943 ; 5F04 ;  SL      # ( 弄 → 弄 ) CJK COMPATIBILITY IDEOGRAPH-F943 → CJK UNIFIED IDEOGRAPH-5F04       # 
+
+2F37 ; 5F0B ;  SL      #* ( ⼷ → 弋 ) KANGXI RADICAL SHOOT → CJK UNIFIED IDEOGRAPH-5F0B  # 
+
+2F38 ; 5F13 ;  SL      #* ( ⼸ → 弓 ) KANGXI RADICAL BOW → CJK UNIFIED IDEOGRAPH-5F13    # 
+
+2F894 ;        5F22 ;  SL      # ( 弢 → 弢 ) CJK COMPATIBILITY IDEOGRAPH-2F894 → CJK UNIFIED IDEOGRAPH-5F22     # 
+2F895 ;        5F22 ;  SL      # ( 弢 → 弢 ) CJK COMPATIBILITY IDEOGRAPH-2F895 → CJK UNIFIED IDEOGRAPH-5F22     # 
+
+2F39 ; 5F50 ;  SL      #* ( ⼹ → 彐 ) KANGXI RADICAL SNOUT → CJK UNIFIED IDEOGRAPH-5F50  # 
+
+2E94 ; 5F51 ;  SL      #* ( ⺔ → 彑 ) CJK RADICAL SNOUT ONE → CJK UNIFIED IDEOGRAPH-5F51 # 
+
+2F874 ;        5F53 ;  SL      # ( 当 → 当 ) CJK COMPATIBILITY IDEOGRAPH-2F874 → CJK UNIFIED IDEOGRAPH-5F53     # 
+
+2F3A ; 5F61 ;  SL      #* ( ⼺ → 彡 ) KANGXI RADICAL BRISTLE → CJK UNIFIED IDEOGRAPH-5F61        # 
+
+2F899 ;        5F62 ;  SL      # ( 形 → 形 ) CJK COMPATIBILITY IDEOGRAPH-2F899 → CJK UNIFIED IDEOGRAPH-5F62     # 
+
+FA84 ; 5F69 ;  SL      # ( 彩 → 彩 ) CJK COMPATIBILITY IDEOGRAPH-FA84 → CJK UNIFIED IDEOGRAPH-5F69       # 
+
+2F89A ;        5F6B ;  SL      # ( 彫 → 彫 ) CJK COMPATIBILITY IDEOGRAPH-2F89A → CJK UNIFIED IDEOGRAPH-5F6B     # 
+
+2F3B ; 5F73 ;  SL      #* ( ⼻ → 彳 ) KANGXI RADICAL STEP → CJK UNIFIED IDEOGRAPH-5F73   # 
+
+F9D8 ; 5F8B ;  SL      # ( 律 → 律 ) CJK COMPATIBILITY IDEOGRAPH-F9D8 → CJK UNIFIED IDEOGRAPH-5F8B       # 
+
+2F89C ;        5F9A ;  SL      # ( 徚 → 徚 ) CJK COMPATIBILITY IDEOGRAPH-2F89C → CJK UNIFIED IDEOGRAPH-5F9A     # 
+
+F966 ; 5FA9 ;  SL      # ( 復 → 復 ) CJK COMPATIBILITY IDEOGRAPH-F966 → CJK UNIFIED IDEOGRAPH-5FA9       # 
+
+FA85 ; 5FAD ;  SL      # ( 徭 → 徭 ) CJK COMPATIBILITY IDEOGRAPH-FA85 → CJK UNIFIED IDEOGRAPH-5FAD       # 
+
+2F3C ; 5FC3 ;  SL      #* ( ⼼ → 心 ) KANGXI RADICAL HEART → CJK UNIFIED IDEOGRAPH-5FC3  # 
+
+2E96 ; 5FC4 ;  SL      #* ( ⺖ → 忄 ) CJK RADICAL HEART ONE → CJK UNIFIED IDEOGRAPH-5FC4 # 
+
+2F89D ;        5FCD ;  SL      # ( 忍 → 忍 ) CJK COMPATIBILITY IDEOGRAPH-2F89D → CJK UNIFIED IDEOGRAPH-5FCD     # 
+
+2F89E ;        5FD7 ;  SL      # ( 志 → 志 ) CJK COMPATIBILITY IDEOGRAPH-2F89E → CJK UNIFIED IDEOGRAPH-5FD7     # 
+
+F9A3 ; 5FF5 ;  SL      # ( 念 → 念 ) CJK COMPATIBILITY IDEOGRAPH-F9A3 → CJK UNIFIED IDEOGRAPH-5FF5       # 
+
+2F89F ;        5FF9 ;  SL      # ( 忹 → 忹 ) CJK COMPATIBILITY IDEOGRAPH-2F89F → CJK UNIFIED IDEOGRAPH-5FF9     # 
+
+F960 ; 6012 ;  SL      # ( 怒 → 怒 ) CJK COMPATIBILITY IDEOGRAPH-F960 → CJK UNIFIED IDEOGRAPH-6012       # 
+
+F9AC ; 601C ;  SL      # ( 怜 → 怜 ) CJK COMPATIBILITY IDEOGRAPH-F9AC → CJK UNIFIED IDEOGRAPH-601C       # 
+
+FA6B ; 6075 ;  SL      # ( 恵 → 恵 ) CJK COMPATIBILITY IDEOGRAPH-FA6B → CJK UNIFIED IDEOGRAPH-6075       # 
+
+2F8A0 ;        6081 ;  SL      # ( 悁 → 悁 ) CJK COMPATIBILITY IDEOGRAPH-2F8A0 → CJK UNIFIED IDEOGRAPH-6081     # 
+
+FA3D ; 6094 ;  SL      # ( 悔 → 悔 ) CJK COMPATIBILITY IDEOGRAPH-FA3D → CJK UNIFIED IDEOGRAPH-6094       # 
+2F8A3 ;        6094 ;  SL      # ( 悔 → 悔 ) CJK COMPATIBILITY IDEOGRAPH-2F8A3 → CJK UNIFIED IDEOGRAPH-6094     # 
+
+2F8A5 ;        60C7 ;  SL      # ( 惇 → 惇 ) CJK COMPATIBILITY IDEOGRAPH-2F8A5 → CJK UNIFIED IDEOGRAPH-60C7     # 
+
+FA86 ; 60D8 ;  SL      # ( 惘 → 惘 ) CJK COMPATIBILITY IDEOGRAPH-FA86 → CJK UNIFIED IDEOGRAPH-60D8       # 
+
+F9B9 ; 60E1 ;  SL      # ( 惡 → 惡 ) CJK COMPATIBILITY IDEOGRAPH-F9B9 → CJK UNIFIED IDEOGRAPH-60E1       # 
+
+FA88 ; 6108 ;  SL      # ( 愈 → 愈 ) CJK COMPATIBILITY IDEOGRAPH-FA88 → CJK UNIFIED IDEOGRAPH-6108       # 
+
+F9D9 ; 6144 ;  SL      # ( 慄 → 慄 ) CJK COMPATIBILITY IDEOGRAPH-F9D9 → CJK UNIFIED IDEOGRAPH-6144       # 
+
+2F8A6 ;        6148 ;  SL      # ( 慈 → 慈 ) CJK COMPATIBILITY IDEOGRAPH-2F8A6 → CJK UNIFIED IDEOGRAPH-6148     # 
+
+2F8A7 ;        614C ;  SL      # ( 慌 → 慌 ) CJK COMPATIBILITY IDEOGRAPH-2F8A7 → CJK UNIFIED IDEOGRAPH-614C     # 
+2F8A9 ;        614C ;  SL      # ( 慌 → 慌 ) CJK COMPATIBILITY IDEOGRAPH-2F8A9 → CJK UNIFIED IDEOGRAPH-614C     # 
+
+FA87 ; 614E ;  SL      # ( 慎 → 慎 ) CJK COMPATIBILITY IDEOGRAPH-FA87 → CJK UNIFIED IDEOGRAPH-614E       # 
+2F8A8 ;        614E ;  SL      # ( 慎 → 慎 ) CJK COMPATIBILITY IDEOGRAPH-2F8A8 → CJK UNIFIED IDEOGRAPH-614E     # 
+
+FA8A ; 6160 ;  SL      # ( 慠 → 慠 ) CJK COMPATIBILITY IDEOGRAPH-FA8A → CJK UNIFIED IDEOGRAPH-6160       # 
+
+FA3E ; 6168 ;  SL      # ( 慨 → 慨 ) CJK COMPATIBILITY IDEOGRAPH-FA3E → CJK UNIFIED IDEOGRAPH-6168       # 
+
+2F8AA ;        617A ;  SL      # ( 慺 → 慺 ) CJK COMPATIBILITY IDEOGRAPH-2F8AA → CJK UNIFIED IDEOGRAPH-617A     # 
+
+FA3F ; 618E ;  SL      # ( 憎 → 憎 ) CJK COMPATIBILITY IDEOGRAPH-FA3F → CJK UNIFIED IDEOGRAPH-618E       # 
+FA89 ; 618E ;  SL      # ( 憎 → 憎 ) CJK COMPATIBILITY IDEOGRAPH-FA89 → CJK UNIFIED IDEOGRAPH-618E       # 
+2F8AB ;        618E ;  SL      # ( 憎 → 憎 ) CJK COMPATIBILITY IDEOGRAPH-2F8AB → CJK UNIFIED IDEOGRAPH-618E     # 
+
+F98F ; 6190 ;  SL      # ( 憐 → 憐 ) CJK COMPATIBILITY IDEOGRAPH-F98F → CJK UNIFIED IDEOGRAPH-6190       # 
+
+2F8AD ;        61A4 ;  SL      # ( 憤 → 憤 ) CJK COMPATIBILITY IDEOGRAPH-2F8AD → CJK UNIFIED IDEOGRAPH-61A4     # 
+
+2F8AE ;        61AF ;  SL      # ( 憯 → 憯 ) CJK COMPATIBILITY IDEOGRAPH-2F8AE → CJK UNIFIED IDEOGRAPH-61AF     # 
+
+2F8AC ;        61B2 ;  SL      # ( 憲 → 憲 ) CJK COMPATIBILITY IDEOGRAPH-2F8AC → CJK UNIFIED IDEOGRAPH-61B2     # 
+
+2F8AF ;        61DE ;  SL      # ( 懞 → 懞 ) CJK COMPATIBILITY IDEOGRAPH-2F8AF → CJK UNIFIED IDEOGRAPH-61DE     # 
+
+FA40 ; 61F2 ;  SL      # ( 懲 → 懲 ) CJK COMPATIBILITY IDEOGRAPH-FA40 → CJK UNIFIED IDEOGRAPH-61F2       # 
+FA8B ; 61F2 ;  SL      # ( 懲 → 懲 ) CJK COMPATIBILITY IDEOGRAPH-FA8B → CJK UNIFIED IDEOGRAPH-61F2       # 
+2F8B0 ;        61F2 ;  SL      # ( 懲 → 懲 ) CJK COMPATIBILITY IDEOGRAPH-2F8B0 → CJK UNIFIED IDEOGRAPH-61F2     # 
+
+F90D ; 61F6 ;  SL      # ( 懶 → 懶 ) CJK COMPATIBILITY IDEOGRAPH-F90D → CJK UNIFIED IDEOGRAPH-61F6       # 
+2F8B1 ;        61F6 ;  SL      # ( 懶 → 懶 ) CJK COMPATIBILITY IDEOGRAPH-2F8B1 → CJK UNIFIED IDEOGRAPH-61F6     # 
+
+F990 ; 6200 ;  SL      # ( 戀 → 戀 ) CJK COMPATIBILITY IDEOGRAPH-F990 → CJK UNIFIED IDEOGRAPH-6200       # 
+
+2F3D ; 6208 ;  SL      #* ( ⼽ → 戈 ) KANGXI RADICAL HALBERD → CJK UNIFIED IDEOGRAPH-6208        # 
+
+2F8B2 ;        6210 ;  SL      # ( 成 → 成 ) CJK COMPATIBILITY IDEOGRAPH-2F8B2 → CJK UNIFIED IDEOGRAPH-6210     # 
+
+2F8B3 ;        621B ;  SL      # ( 戛 → 戛 ) CJK COMPATIBILITY IDEOGRAPH-2F8B3 → CJK UNIFIED IDEOGRAPH-621B     # 
+
+F9D2 ; 622E ;  SL      # ( 戮 → 戮 ) CJK COMPATIBILITY IDEOGRAPH-F9D2 → CJK UNIFIED IDEOGRAPH-622E       # 
+
+FA8C ; 6234 ;  SL      # ( 戴 → 戴 ) CJK COMPATIBILITY IDEOGRAPH-FA8C → CJK UNIFIED IDEOGRAPH-6234       # 
+
+2F3E ; 6236 ;  SL      #* ( ⼾ → 戶 ) KANGXI RADICAL DOOR → CJK UNIFIED IDEOGRAPH-6236   # 
+6238 ; 6236 ;  SL      # ( 戸 → 戶 ) CJK UNIFIED IDEOGRAPH-6238 → CJK UNIFIED IDEOGRAPH-6236     # →⼾→
+
+2F3F ; 624B ;  SL      #* ( ⼿ → 手 ) KANGXI RADICAL HAND → CJK UNIFIED IDEOGRAPH-624B   # 
+
+2E98 ; 624C ;  SL      #* ( ⺘ → 扌 ) CJK RADICAL HAND → CJK UNIFIED IDEOGRAPH-624C      # 
+
+2F8B4 ;        625D ;  SL      # ( 扝 → 扝 ) CJK COMPATIBILITY IDEOGRAPH-2F8B4 → CJK UNIFIED IDEOGRAPH-625D     # 
+
+2F8B5 ;        62B1 ;  SL      # ( 抱 → 抱 ) CJK COMPATIBILITY IDEOGRAPH-2F8B5 → CJK UNIFIED IDEOGRAPH-62B1     # 
+
+F925 ; 62C9 ;  SL      # ( 拉 → 拉 ) CJK COMPATIBILITY IDEOGRAPH-F925 → CJK UNIFIED IDEOGRAPH-62C9       # 
+
+F95B ; 62CF ;  SL      # ( 拏 → 拏 ) CJK COMPATIBILITY IDEOGRAPH-F95B → CJK UNIFIED IDEOGRAPH-62CF       # 
+
+FA02 ; 62D3 ;  SL      # ( 拓 → 拓 ) CJK COMPATIBILITY IDEOGRAPH-FA02 → CJK UNIFIED IDEOGRAPH-62D3       # 
+
+2F8B6 ;        62D4 ;  SL      # ( 拔 → 拔 ) CJK COMPATIBILITY IDEOGRAPH-2F8B6 → CJK UNIFIED IDEOGRAPH-62D4     # 
+
+2F8BA ;        62FC ;  SL      # ( 拼 → 拼 ) CJK COMPATIBILITY IDEOGRAPH-2F8BA → CJK UNIFIED IDEOGRAPH-62FC     # 
+
+F973 ; 62FE ;  SL      # ( 拾 → 拾 ) CJK COMPATIBILITY IDEOGRAPH-F973 → CJK UNIFIED IDEOGRAPH-62FE       # 
+
+2F8B9 ;        633D ;  SL      # ( 挽 → 挽 ) CJK COMPATIBILITY IDEOGRAPH-2F8B9 → CJK UNIFIED IDEOGRAPH-633D     # 
+
+2F8B7 ;        6350 ;  SL      # ( 捐 → 捐 ) CJK COMPATIBILITY IDEOGRAPH-2F8B7 → CJK UNIFIED IDEOGRAPH-6350     # 
+
+2F8BB ;        6368 ;  SL      # ( 捨 → 捨 ) CJK COMPATIBILITY IDEOGRAPH-2F8BB → CJK UNIFIED IDEOGRAPH-6368     # 
+
+F9A4 ; 637B ;  SL      # ( 捻 → 捻 ) CJK COMPATIBILITY IDEOGRAPH-F9A4 → CJK UNIFIED IDEOGRAPH-637B       # 
+
+2F8BC ;        6383 ;  SL      # ( 掃 → 掃 ) CJK COMPATIBILITY IDEOGRAPH-2F8BC → CJK UNIFIED IDEOGRAPH-6383     # 
+
+F975 ; 63A0 ;  SL      # ( 掠 → 掠 ) CJK COMPATIBILITY IDEOGRAPH-F975 → CJK UNIFIED IDEOGRAPH-63A0       # 
+
+2F8C1 ;        63A9 ;  SL      # ( 掩 → 掩 ) CJK COMPATIBILITY IDEOGRAPH-2F8C1 → CJK UNIFIED IDEOGRAPH-63A9     # 
+
+FA8D ; 63C4 ;  SL      # ( 揄 → 揄 ) CJK COMPATIBILITY IDEOGRAPH-FA8D → CJK UNIFIED IDEOGRAPH-63C4       # 
+
+2F8C0 ;        63C5 ;  SL      # ( 揅 → 揅 ) CJK COMPATIBILITY IDEOGRAPH-2F8C0 → CJK UNIFIED IDEOGRAPH-63C5     # 
+
+2F8BD ;        63E4 ;  SL      # ( 揤 → 揤 ) CJK COMPATIBILITY IDEOGRAPH-2F8BD → CJK UNIFIED IDEOGRAPH-63E4     # 
+
+FA8E ; 641C ;  SL      # ( 搜 → 搜 ) CJK COMPATIBILITY IDEOGRAPH-FA8E → CJK UNIFIED IDEOGRAPH-641C       # 
+
+2F8BF ;        6422 ;  SL      # ( 搢 → 搢 ) CJK COMPATIBILITY IDEOGRAPH-2F8BF → CJK UNIFIED IDEOGRAPH-6422     # 
+
+FA8F ; 6452 ;  SL      # ( 摒 → 摒 ) CJK COMPATIBILITY IDEOGRAPH-FA8F → CJK UNIFIED IDEOGRAPH-6452       # 
+
+2F8C3 ;        6469 ;  SL      # ( 摩 → 摩 ) CJK COMPATIBILITY IDEOGRAPH-2F8C3 → CJK UNIFIED IDEOGRAPH-6469     # 
+
+2F8C6 ;        6477 ;  SL      # ( 摷 → 摷 ) CJK COMPATIBILITY IDEOGRAPH-2F8C6 → CJK UNIFIED IDEOGRAPH-6477     # 
+
+2F8C4 ;        647E ;  SL      # ( 摾 → 摾 ) CJK COMPATIBILITY IDEOGRAPH-2F8C4 → CJK UNIFIED IDEOGRAPH-647E     # 
+
+F991 ; 649A ;  SL      # ( 撚 → 撚 ) CJK COMPATIBILITY IDEOGRAPH-F991 → CJK UNIFIED IDEOGRAPH-649A       # 
+
+2F8C5 ;        649D ;  SL      # ( 撝 → 撝 ) CJK COMPATIBILITY IDEOGRAPH-2F8C5 → CJK UNIFIED IDEOGRAPH-649D     # 
+
+F930 ; 64C4 ;  SL      # ( 擄 → 擄 ) CJK COMPATIBILITY IDEOGRAPH-F930 → CJK UNIFIED IDEOGRAPH-64C4       # 
+
+2F40 ; 652F ;  SL      #* ( ⽀ → 支 ) KANGXI RADICAL BRANCH → CJK UNIFIED IDEOGRAPH-652F # 
+
+2F41 ; 6534 ;  SL      #* ( ⽁ → 攴 ) KANGXI RADICAL RAP → CJK UNIFIED IDEOGRAPH-6534    # 
+
+2E99 ; 6535 ;  SL      #* ( ⺙ → 攵 ) CJK RADICAL RAP → CJK UNIFIED IDEOGRAPH-6535       # 
+
+FA41 ; 654F ;  SL      # ( 敏 → 敏 ) CJK COMPATIBILITY IDEOGRAPH-FA41 → CJK UNIFIED IDEOGRAPH-654F       # 
+2F8C8 ;        654F ;  SL      # ( 敏 → 敏 ) CJK COMPATIBILITY IDEOGRAPH-2F8C8 → CJK UNIFIED IDEOGRAPH-654F     # 
+
+FA90 ; 6556 ;  SL      # ( 敖 → 敖 ) CJK COMPATIBILITY IDEOGRAPH-FA90 → CJK UNIFIED IDEOGRAPH-6556       # 
+
+2F8C9 ;        656C ;  SL      # ( 敬 → 敬 ) CJK COMPATIBILITY IDEOGRAPH-2F8C9 → CJK UNIFIED IDEOGRAPH-656C     # 
+
+F969 ; 6578 ;  SL      # ( 數 → 數 ) CJK COMPATIBILITY IDEOGRAPH-F969 → CJK UNIFIED IDEOGRAPH-6578       # 
+
+2F42 ; 6587 ;  SL      #* ( ⽂ → 文 ) KANGXI RADICAL SCRIPT → CJK UNIFIED IDEOGRAPH-6587 # 
+
+2EEB ; 6589 ;  SL      #* ( ⻫ → 斉 ) CJK RADICAL J-SIMPLIFIED EVEN → CJK UNIFIED IDEOGRAPH-6589 # 
+
+2F43 ; 6597 ;  SL      #* ( ⽃ → 斗 ) KANGXI RADICAL DIPPER → CJK UNIFIED IDEOGRAPH-6597 # 
+
+F9BE ; 6599 ;  SL      # ( 料 → 料 ) CJK COMPATIBILITY IDEOGRAPH-F9BE → CJK UNIFIED IDEOGRAPH-6599       # 
+
+2F44 ; 65A4 ;  SL      #* ( ⽄ → 斤 ) KANGXI RADICAL AXE → CJK UNIFIED IDEOGRAPH-65A4    # 
+
+2F45 ; 65B9 ;  SL      #* ( ⽅ → 方 ) KANGXI RADICAL SQUARE → CJK UNIFIED IDEOGRAPH-65B9 # 
+
+F983 ; 65C5 ;  SL      # ( 旅 → 旅 ) CJK COMPATIBILITY IDEOGRAPH-F983 → CJK UNIFIED IDEOGRAPH-65C5       # 
+
+2F46 ; 65E0 ;  SL      #* ( ⽆ → 无 ) KANGXI RADICAL NOT → CJK UNIFIED IDEOGRAPH-65E0    # 
+
+2E9B ; 65E1 ;  SL      #* ( ⺛ → 旡 ) CJK RADICAL CHOKE → CJK UNIFIED IDEOGRAPH-65E1     # 
+
+FA42 ; 65E2 ;  SL      # ( 既 → 既 ) CJK COMPATIBILITY IDEOGRAPH-FA42 → CJK UNIFIED IDEOGRAPH-65E2       # 
+
+2F8CB ;        65E3 ;  SL      # ( 旣 → 旣 ) CJK COMPATIBILITY IDEOGRAPH-2F8CB → CJK UNIFIED IDEOGRAPH-65E3     # 
+
+2F47 ; 65E5 ;  SL      #* ( ⽇ → 日 ) KANGXI RADICAL SUN → CJK UNIFIED IDEOGRAPH-65E5    # 
+
+F9E0 ; 6613 ;  SL      # ( 易 → 易 ) CJK COMPATIBILITY IDEOGRAPH-F9E0 → CJK UNIFIED IDEOGRAPH-6613       # 
+
+2F8CD ;        6649 ;  SL      # ( 晉 → 晉 ) CJK COMPATIBILITY IDEOGRAPH-2F8CD → CJK UNIFIED IDEOGRAPH-6649     # 
+
+6669 ; 665A ;  SL      # ( 晩 → 晚 ) CJK UNIFIED IDEOGRAPH-6669 → CJK UNIFIED IDEOGRAPH-665A     # 
+
+FA12 ; 6674 ;  SL      # ( 晴 → 晴 ) CJK COMPATIBILITY IDEOGRAPH-FA12 → CJK UNIFIED IDEOGRAPH-6674       # 
+FA91 ; 6674 ;  SL      # ( 晴 → 晴 ) CJK COMPATIBILITY IDEOGRAPH-FA91 → CJK UNIFIED IDEOGRAPH-6674       # 
+
+F9C5 ; 6688 ;  SL      # ( 暈 → 暈 ) CJK COMPATIBILITY IDEOGRAPH-F9C5 → CJK UNIFIED IDEOGRAPH-6688       # 
+
+FA43 ; 6691 ;  SL      # ( 暑 → 暑 ) CJK COMPATIBILITY IDEOGRAPH-FA43 → CJK UNIFIED IDEOGRAPH-6691       # 
+2F8CF ;        6691 ;  SL      # ( 暑 → 暑 ) CJK COMPATIBILITY IDEOGRAPH-2F8CF → CJK UNIFIED IDEOGRAPH-6691     # 
+
+2F8D5 ;        669C ;  SL      # ( 暜 → 暜 ) CJK COMPATIBILITY IDEOGRAPH-2F8D5 → CJK UNIFIED IDEOGRAPH-669C     # 
+
+FA06 ; 66B4 ;  SL      # ( 暴 → 暴 ) CJK COMPATIBILITY IDEOGRAPH-FA06 → CJK UNIFIED IDEOGRAPH-66B4       # 
+
+F98B ; 66C6 ;  SL      # ( 曆 → 曆 ) CJK COMPATIBILITY IDEOGRAPH-F98B → CJK UNIFIED IDEOGRAPH-66C6       # 
+
+2F48 ; 66F0 ;  SL      #* ( ⽈ → 曰 ) KANGXI RADICAL SAY → CJK UNIFIED IDEOGRAPH-66F0    # 
+
+F901 ; 66F4 ;  SL      # ( 更 → 更 ) CJK COMPATIBILITY IDEOGRAPH-F901 → CJK UNIFIED IDEOGRAPH-66F4       # 
+
+2F8CC ;        66F8 ;  SL      # ( 書 → 書 ) CJK COMPATIBILITY IDEOGRAPH-2F8CC → CJK UNIFIED IDEOGRAPH-66F8     # 
+
+2F8D4 ;        6700 ;  SL      # ( 最 → 最 ) CJK COMPATIBILITY IDEOGRAPH-2F8D4 → CJK UNIFIED IDEOGRAPH-6700     # 
+
+2F49 ; 6708 ;  SL      #* ( ⽉ → 月 ) KANGXI RADICAL MOON → CJK UNIFIED IDEOGRAPH-6708   # 
+
+80A6 ; 670C ;  SL      # ( 肦 → 朌 ) CJK UNIFIED IDEOGRAPH-80A6 → CJK UNIFIED IDEOGRAPH-670C     # 
+
+80D0 ; 670F ;  SL      # ( 胐 → 朏 ) CJK UNIFIED IDEOGRAPH-80D0 → CJK UNIFIED IDEOGRAPH-670F     # 
+
+80CA ; 6710 ;  SL      # ( 胊 → 朐 ) CJK UNIFIED IDEOGRAPH-80CA → CJK UNIFIED IDEOGRAPH-6710     # 
+
+8101 ; 6713 ;  SL      # ( 脁 → 朓 ) CJK UNIFIED IDEOGRAPH-8101 → CJK UNIFIED IDEOGRAPH-6713     # 
+
+F929 ; 6717 ;  SL      # ( 朗 → 朗 ) CJK COMPATIBILITY IDEOGRAPH-F929 → CJK UNIFIED IDEOGRAPH-6717       # 
+FA92 ; 6717 ;  SL      # ( 朗 → 朗 ) CJK COMPATIBILITY IDEOGRAPH-FA92 → CJK UNIFIED IDEOGRAPH-6717       # 
+2F8D8 ;        6717 ;  SL      # ( 朗 → 朗 ) CJK COMPATIBILITY IDEOGRAPH-2F8D8 → CJK UNIFIED IDEOGRAPH-6717     # 
+
+8127 ; 6718 ;  SL      # ( 脧 → 朘 ) CJK UNIFIED IDEOGRAPH-8127 → CJK UNIFIED IDEOGRAPH-6718     # 
+
+FA93 ; 671B ;  SL      # ( 望 → 望 ) CJK COMPATIBILITY IDEOGRAPH-FA93 → CJK UNIFIED IDEOGRAPH-671B       # 
+2F8D9 ;        671B ;  SL      # ( 望 → 望 ) CJK COMPATIBILITY IDEOGRAPH-2F8D9 → CJK UNIFIED IDEOGRAPH-671B     # 
+
+2F8DA ;        6721 ;  SL      # ( 朡 → 朡 ) CJK COMPATIBILITY IDEOGRAPH-2F8DA → CJK UNIFIED IDEOGRAPH-6721     # 
+
+81A7 ; 6723 ;  SL      # ( 膧 → 朣 ) CJK UNIFIED IDEOGRAPH-81A7 → CJK UNIFIED IDEOGRAPH-6723     # 
+
+2F4A ; 6728 ;  SL      #* ( ⽊ → 木 ) KANGXI RADICAL TREE → CJK UNIFIED IDEOGRAPH-6728   # 
+
+F9E1 ; 674E ;  SL      # ( 李 → 李 ) CJK COMPATIBILITY IDEOGRAPH-F9E1 → CJK UNIFIED IDEOGRAPH-674E       # 
+
+2F8DC ;        6753 ;  SL      # ( 杓 → 杓 ) CJK COMPATIBILITY IDEOGRAPH-2F8DC → CJK UNIFIED IDEOGRAPH-6753     # 
+
+FA94 ; 6756 ;  SL      # ( 杖 → 杖 ) CJK COMPATIBILITY IDEOGRAPH-FA94 → CJK UNIFIED IDEOGRAPH-6756       # 
+
+2F8DB ;        675E ;  SL      # ( 杞 → 杞 ) CJK COMPATIBILITY IDEOGRAPH-2F8DB → CJK UNIFIED IDEOGRAPH-675E     # 
+
+67FF ; 676E ;  SL      # ( 柿 → 杮 ) CJK UNIFIED IDEOGRAPH-67FF → CJK UNIFIED IDEOGRAPH-676E     # 
+
+F9C8 ; 677B ;  SL      # ( 杻 → 杻 ) CJK COMPATIBILITY IDEOGRAPH-F9C8 → CJK UNIFIED IDEOGRAPH-677B       # 
+
+2F8E0 ;        6785 ;  SL      # ( 枅 → 枅 ) CJK COMPATIBILITY IDEOGRAPH-2F8E0 → CJK UNIFIED IDEOGRAPH-6785     # 
+
+F9F4 ; 6797 ;  SL      # ( 林 → 林 ) CJK COMPATIBILITY IDEOGRAPH-F9F4 → CJK UNIFIED IDEOGRAPH-6797       # 
+
+F9C9 ; 67F3 ;  SL      # ( 柳 → 柳 ) CJK COMPATIBILITY IDEOGRAPH-F9C9 → CJK UNIFIED IDEOGRAPH-67F3       # 
+
+2F8DF ;        67FA ;  SL      # ( 柺 → 柺 ) CJK COMPATIBILITY IDEOGRAPH-2F8DF → CJK UNIFIED IDEOGRAPH-67FA     # 
+
+F9DA ; 6817 ;  SL      # ( 栗 → 栗 ) CJK COMPATIBILITY IDEOGRAPH-F9DA → CJK UNIFIED IDEOGRAPH-6817       # 
+
+2F8E5 ;        681F ;  SL      # ( 栟 → 栟 ) CJK COMPATIBILITY IDEOGRAPH-2F8E5 → CJK UNIFIED IDEOGRAPH-681F     # 
+
+2F8E1 ;        6852 ;  SL      # ( 桒 → 桒 ) CJK COMPATIBILITY IDEOGRAPH-2F8E1 → CJK UNIFIED IDEOGRAPH-6852     # 
+
+F97A ; 6881 ;  SL      # ( 梁 → 梁 ) CJK COMPATIBILITY IDEOGRAPH-F97A → CJK UNIFIED IDEOGRAPH-6881       # 
+
+FA44 ; 6885 ;  SL      # ( 梅 → 梅 ) CJK COMPATIBILITY IDEOGRAPH-FA44 → CJK UNIFIED IDEOGRAPH-6885       # 
+2F8E2 ;        6885 ;  SL      # ( 梅 → 梅 ) CJK COMPATIBILITY IDEOGRAPH-2F8E2 → CJK UNIFIED IDEOGRAPH-6885     # 
+
+2F8E4 ;        688E ;  SL      # ( 梎 → 梎 ) CJK COMPATIBILITY IDEOGRAPH-2F8E4 → CJK UNIFIED IDEOGRAPH-688E     # 
+
+F9E2 ; 68A8 ;  SL      # ( 梨 → 梨 ) CJK COMPATIBILITY IDEOGRAPH-F9E2 → CJK UNIFIED IDEOGRAPH-68A8       # 
+
+2F8E6 ;        6914 ;  SL      # ( 椔 → 椔 ) CJK COMPATIBILITY IDEOGRAPH-2F8E6 → CJK UNIFIED IDEOGRAPH-6914     # 
+
+2F8E8 ;        6942 ;  SL      # ( 楂 → 楂 ) CJK COMPATIBILITY IDEOGRAPH-2F8E8 → CJK UNIFIED IDEOGRAPH-6942     # 
+
+6A27 ; 699D ;  SL      # ( 樧 → 榝 ) CJK UNIFIED IDEOGRAPH-6A27 → CJK UNIFIED IDEOGRAPH-699D     # 
+
+2F8E9 ;        69A3 ;  SL      # ( 榣 → 榣 ) CJK COMPATIBILITY IDEOGRAPH-2F8E9 → CJK UNIFIED IDEOGRAPH-69A3     # 
+
+2F8EA ;        69EA ;  SL      # ( 槪 → 槪 ) CJK COMPATIBILITY IDEOGRAPH-2F8EA → CJK UNIFIED IDEOGRAPH-69EA     # 
+
+F914 ; 6A02 ;  SL      # ( 樂 → 樂 ) CJK COMPATIBILITY IDEOGRAPH-F914 → CJK UNIFIED IDEOGRAPH-6A02       # 
+F95C ; 6A02 ;  SL      # ( 樂 → 樂 ) CJK COMPATIBILITY IDEOGRAPH-F95C → CJK UNIFIED IDEOGRAPH-6A02       # 
+F9BF ; 6A02 ;  SL      # ( 樂 → 樂 ) CJK COMPATIBILITY IDEOGRAPH-F9BF → CJK UNIFIED IDEOGRAPH-6A02       # 
+
+F94C ; 6A13 ;  SL      # ( 樓 → 樓 ) CJK COMPATIBILITY IDEOGRAPH-F94C → CJK UNIFIED IDEOGRAPH-6A13       # 
+
+2F8EB ;        6AA8 ;  SL      # ( 檨 → 檨 ) CJK COMPATIBILITY IDEOGRAPH-2F8EB → CJK UNIFIED IDEOGRAPH-6AA8     # 
+
+F931 ; 6AD3 ;  SL      # ( 櫓 → 櫓 ) CJK COMPATIBILITY IDEOGRAPH-F931 → CJK UNIFIED IDEOGRAPH-6AD3       # 
+
+2F8ED ;        6ADB ;  SL      # ( 櫛 → 櫛 ) CJK COMPATIBILITY IDEOGRAPH-2F8ED → CJK UNIFIED IDEOGRAPH-6ADB     # 
+
+F91D ; 6B04 ;  SL      # ( 欄 → 欄 ) CJK COMPATIBILITY IDEOGRAPH-F91D → CJK UNIFIED IDEOGRAPH-6B04       # 
+
+2F4B ; 6B20 ;  SL      #* ( ⽋ → 欠 ) KANGXI RADICAL LACK → CJK UNIFIED IDEOGRAPH-6B20   # 
+
+2F8EF ;        6B21 ;  SL      # ( 次 → 次 ) CJK COMPATIBILITY IDEOGRAPH-2F8EF → CJK UNIFIED IDEOGRAPH-6B21     # 
+
+2F8F1 ;        6B54 ;  SL      # ( 歔 → 歔 ) CJK COMPATIBILITY IDEOGRAPH-2F8F1 → CJK UNIFIED IDEOGRAPH-6B54     # 
+
+2F4C ; 6B62 ;  SL      #* ( ⽌ → 止 ) KANGXI RADICAL STOP → CJK UNIFIED IDEOGRAPH-6B62   # 
+
+2EED ; 6B6F ;  SL      #* ( ⻭ → 歯 ) CJK RADICAL J-SIMPLIFIED TOOTH → CJK UNIFIED IDEOGRAPH-6B6F        # 
+
+2F8F3 ;        6B72 ;  SL      # ( 歲 → 歲 ) CJK COMPATIBILITY IDEOGRAPH-2F8F3 → CJK UNIFIED IDEOGRAPH-6B72     # 
+
+F98C ; 6B77 ;  SL      # ( 歷 → 歷 ) CJK COMPATIBILITY IDEOGRAPH-F98C → CJK UNIFIED IDEOGRAPH-6B77       # 
+
+FA95 ; 6B79 ;  SL      # ( 歹 → 歹 ) CJK COMPATIBILITY IDEOGRAPH-FA95 → CJK UNIFIED IDEOGRAPH-6B79       # 
+2F4D ; 6B79 ;  SL      #* ( ⽍ → 歹 ) KANGXI RADICAL DEATH → CJK UNIFIED IDEOGRAPH-6B79  # 
+
+2E9E ; 6B7A ;  SL      #* ( ⺞ → 歺 ) CJK RADICAL DEATH → CJK UNIFIED IDEOGRAPH-6B7A     # 
+
+2F8F4 ;        6B9F ;  SL      # ( 殟 → 殟 ) CJK COMPATIBILITY IDEOGRAPH-2F8F4 → CJK UNIFIED IDEOGRAPH-6B9F     # 
+
+F9A5 ; 6BAE ;  SL      # ( 殮 → 殮 ) CJK COMPATIBILITY IDEOGRAPH-F9A5 → CJK UNIFIED IDEOGRAPH-6BAE       # 
+
+2F4E ; 6BB3 ;  SL      #* ( ⽎ → 殳 ) KANGXI RADICAL WEAPON → CJK UNIFIED IDEOGRAPH-6BB3 # 
+
+F970 ; 6BBA ;  SL      # ( 殺 → 殺 ) CJK COMPATIBILITY IDEOGRAPH-F970 → CJK UNIFIED IDEOGRAPH-6BBA       # 
+FA96 ; 6BBA ;  SL      # ( 殺 → 殺 ) CJK COMPATIBILITY IDEOGRAPH-FA96 → CJK UNIFIED IDEOGRAPH-6BBA       # 
+2F8F5 ;        6BBA ;  SL      # ( 殺 → 殺 ) CJK COMPATIBILITY IDEOGRAPH-2F8F5 → CJK UNIFIED IDEOGRAPH-6BBA     # 
+
+2F8F6 ;        6BBB ;  SL      # ( 殻 → 殻 ) CJK COMPATIBILITY IDEOGRAPH-2F8F6 → CJK UNIFIED IDEOGRAPH-6BBB     # 
+
+2F4F ; 6BCB ;  SL      #* ( ⽏ → 毋 ) KANGXI RADICAL DO NOT → CJK UNIFIED IDEOGRAPH-6BCB # 
+
+2E9F ; 6BCD ;  SL      #* ( ⺟ → 母 ) CJK RADICAL MOTHER → CJK UNIFIED IDEOGRAPH-6BCD    # 
+
+2F50 ; 6BD4 ;  SL      #* ( ⽐ → 比 ) KANGXI RADICAL COMPARE → CJK UNIFIED IDEOGRAPH-6BD4        # 
+
+2F51 ; 6BDB ;  SL      #* ( ⽑ → 毛 ) KANGXI RADICAL FUR → CJK UNIFIED IDEOGRAPH-6BDB    # 
+
+2F52 ; 6C0F ;  SL      #* ( ⽒ → 氏 ) KANGXI RADICAL CLAN → CJK UNIFIED IDEOGRAPH-6C0F   # 
+
+2EA0 ; 6C11 ;  SL      #* ( ⺠ → 民 ) CJK RADICAL CIVILIAN → CJK UNIFIED IDEOGRAPH-6C11  # 
+
+2F53 ; 6C14 ;  SL      #* ( ⽓ → 气 ) KANGXI RADICAL STEAM → CJK UNIFIED IDEOGRAPH-6C14  # 
+
+2F54 ; 6C34 ;  SL      #* ( ⽔ → 水 ) KANGXI RADICAL WATER → CJK UNIFIED IDEOGRAPH-6C34  # 
+
+2EA1 ; 6C35 ;  SL      #* ( ⺡ → 氵 ) CJK RADICAL WATER ONE → CJK UNIFIED IDEOGRAPH-6C35 # 
+
+2EA2 ; 6C3A ;  SL      #* ( ⺢ → 氺 ) CJK RADICAL WATER TWO → CJK UNIFIED IDEOGRAPH-6C3A # 
+
+2F8FA ;        6C4E ;  SL      # ( 汎 → 汎 ) CJK COMPATIBILITY IDEOGRAPH-2F8FA → CJK UNIFIED IDEOGRAPH-6C4E     # 
+
+2F8FE ;        6C67 ;  SL      # ( 汧 → 汧 ) CJK COMPATIBILITY IDEOGRAPH-2F8FE → CJK UNIFIED IDEOGRAPH-6C67     # 
+
+F972 ; 6C88 ;  SL      # ( 沈 → 沈 ) CJK COMPATIBILITY IDEOGRAPH-F972 → CJK UNIFIED IDEOGRAPH-6C88       # 
+
+2F8FC ;        6CBF ;  SL      # ( 沿 → 沿 ) CJK COMPATIBILITY IDEOGRAPH-2F8FC → CJK UNIFIED IDEOGRAPH-6CBF     # 
+
+F968 ; 6CCC ;  SL      # ( 泌 → 泌 ) CJK COMPATIBILITY IDEOGRAPH-F968 → CJK UNIFIED IDEOGRAPH-6CCC       # 
+
+2F8FD ;        6CCD ;  SL      # ( 泍 → 泍 ) CJK COMPATIBILITY IDEOGRAPH-2F8FD → CJK UNIFIED IDEOGRAPH-6CCD     # 
+
+F9E3 ; 6CE5 ;  SL      # ( 泥 → 泥 ) CJK COMPATIBILITY IDEOGRAPH-F9E3 → CJK UNIFIED IDEOGRAPH-6CE5       # 
+
+2F8FF ;        6D16 ;  SL      # ( 洖 → 洖 ) CJK COMPATIBILITY IDEOGRAPH-2F8FF → CJK UNIFIED IDEOGRAPH-6D16     # 
+
+F915 ; 6D1B ;  SL      # ( 洛 → 洛 ) CJK COMPATIBILITY IDEOGRAPH-F915 → CJK UNIFIED IDEOGRAPH-6D1B       # 
+
+FA05 ; 6D1E ;  SL      # ( 洞 → 洞 ) CJK COMPATIBILITY IDEOGRAPH-FA05 → CJK UNIFIED IDEOGRAPH-6D1E       # 
+
+2F907 ;        6D34 ;  SL      # ( 洴 → 洴 ) CJK COMPATIBILITY IDEOGRAPH-2F907 → CJK UNIFIED IDEOGRAPH-6D34     # 
+
+2F900 ;        6D3E ;  SL      # ( 派 → 派 ) CJK COMPATIBILITY IDEOGRAPH-2F900 → CJK UNIFIED IDEOGRAPH-6D3E     # 
+
+F9CA ; 6D41 ;  SL      # ( 流 → 流 ) CJK COMPATIBILITY IDEOGRAPH-F9CA → CJK UNIFIED IDEOGRAPH-6D41       # 
+FA97 ; 6D41 ;  SL      # ( 流 → 流 ) CJK COMPATIBILITY IDEOGRAPH-FA97 → CJK UNIFIED IDEOGRAPH-6D41       # 
+2F902 ;        6D41 ;  SL      # ( 流 → 流 ) CJK COMPATIBILITY IDEOGRAPH-2F902 → CJK UNIFIED IDEOGRAPH-6D41     # 
+
+2F903 ;        6D69 ;  SL      # ( 浩 → 浩 ) CJK COMPATIBILITY IDEOGRAPH-2F903 → CJK UNIFIED IDEOGRAPH-6D69     # 
+
+F92A ; 6D6A ;  SL      # ( 浪 → 浪 ) CJK COMPATIBILITY IDEOGRAPH-F92A → CJK UNIFIED IDEOGRAPH-6D6A       # 
+
+FA45 ; 6D77 ;  SL      # ( 海 → 海 ) CJK COMPATIBILITY IDEOGRAPH-FA45 → CJK UNIFIED IDEOGRAPH-6D77       # 
+2F901 ;        6D77 ;  SL      # ( 海 → 海 ) CJK COMPATIBILITY IDEOGRAPH-2F901 → CJK UNIFIED IDEOGRAPH-6D77     # 
+
+2F904 ;        6D78 ;  SL      # ( 浸 → 浸 ) CJK COMPATIBILITY IDEOGRAPH-2F904 → CJK UNIFIED IDEOGRAPH-6D78     # 
+
+2F905 ;        6D85 ;  SL      # ( 涅 → 涅 ) CJK COMPATIBILITY IDEOGRAPH-2F905 → CJK UNIFIED IDEOGRAPH-6D85     # 
+
+F9F5 ; 6DCB ;  SL      # ( 淋 → 淋 ) CJK COMPATIBILITY IDEOGRAPH-F9F5 → CJK UNIFIED IDEOGRAPH-6DCB       # 
+
+F94D ; 6DDA ;  SL      # ( 淚 → 淚 ) CJK COMPATIBILITY IDEOGRAPH-F94D → CJK UNIFIED IDEOGRAPH-6DDA       # 
+
+F9D6 ; 6DEA ;  SL      # ( 淪 → 淪 ) CJK COMPATIBILITY IDEOGRAPH-F9D6 → CJK UNIFIED IDEOGRAPH-6DEA       # 
+
+2F90E ;        6DF9 ;  SL      # ( 淹 → 淹 ) CJK COMPATIBILITY IDEOGRAPH-2F90E → CJK UNIFIED IDEOGRAPH-6DF9     # 
+
+FA46 ; 6E1A ;  SL      # ( 渚 → 渚 ) CJK COMPATIBILITY IDEOGRAPH-FA46 → CJK UNIFIED IDEOGRAPH-6E1A       # 
+
+2F908 ;        6E2F ;  SL      # ( 港 → 港 ) CJK COMPATIBILITY IDEOGRAPH-2F908 → CJK UNIFIED IDEOGRAPH-6E2F     # 
+
+2F909 ;        6E6E ;  SL      # ( 湮 → 湮 ) CJK COMPATIBILITY IDEOGRAPH-2F909 → CJK UNIFIED IDEOGRAPH-6E6E     # 
+
+6F59 ; 6E88 ;  SL      # ( 潙 → 溈 ) CJK UNIFIED IDEOGRAPH-6F59 → CJK UNIFIED IDEOGRAPH-6E88     # 
+
+F9CB ; 6E9C ;  SL      # ( 溜 → 溜 ) CJK COMPATIBILITY IDEOGRAPH-F9CB → CJK UNIFIED IDEOGRAPH-6E9C       # 
+
+F9EC ; 6EBA ;  SL      # ( 溺 → 溺 ) CJK COMPATIBILITY IDEOGRAPH-F9EC → CJK UNIFIED IDEOGRAPH-6EBA       # 
+
+2F90C ;        6EC7 ;  SL      # ( 滇 → 滇 ) CJK COMPATIBILITY IDEOGRAPH-2F90C → CJK UNIFIED IDEOGRAPH-6EC7     # 
+
+FA99 ; 6ECB ;  SL      # ( 滋 → 滋 ) CJK COMPATIBILITY IDEOGRAPH-FA99 → CJK UNIFIED IDEOGRAPH-6ECB       # 
+2F90B ;        6ECB ;  SL      # ( 滋 → 滋 ) CJK COMPATIBILITY IDEOGRAPH-2F90B → CJK UNIFIED IDEOGRAPH-6ECB     # 
+
+F904 ; 6ED1 ;  SL      # ( 滑 → 滑 ) CJK COMPATIBILITY IDEOGRAPH-F904 → CJK UNIFIED IDEOGRAPH-6ED1       # 
+
+FA98 ; 6EDB ;  SL      # ( 滛 → 滛 ) CJK COMPATIBILITY IDEOGRAPH-FA98 → CJK UNIFIED IDEOGRAPH-6EDB       # 
+
+F94E ; 6F0F ;  SL      # ( 漏 → 漏 ) CJK COMPATIBILITY IDEOGRAPH-F94E → CJK UNIFIED IDEOGRAPH-6F0F       # 
+
+FA47 ; 6F22 ;  SL      # ( 漢 → 漢 ) CJK COMPATIBILITY IDEOGRAPH-FA47 → CJK UNIFIED IDEOGRAPH-6F22       # 
+FA9A ; 6F22 ;  SL      # ( 漢 → 漢 ) CJK COMPATIBILITY IDEOGRAPH-FA9A → CJK UNIFIED IDEOGRAPH-6F22       # 
+
+F992 ; 6F23 ;  SL      # ( 漣 → 漣 ) CJK COMPATIBILITY IDEOGRAPH-F992 → CJK UNIFIED IDEOGRAPH-6F23       # 
+
+2F90F ;        6F6E ;  SL      # ( 潮 → 潮 ) CJK COMPATIBILITY IDEOGRAPH-2F90F → CJK UNIFIED IDEOGRAPH-6F6E     # 
+
+2F912 ;        6FC6 ;  SL      # ( 濆 → 濆 ) CJK COMPATIBILITY IDEOGRAPH-2F912 → CJK UNIFIED IDEOGRAPH-6FC6     # 
+
+F922 ; 6FEB ;  SL      # ( 濫 → 濫 ) CJK COMPATIBILITY IDEOGRAPH-F922 → CJK UNIFIED IDEOGRAPH-6FEB       # 
+
+F984 ; 6FFE ;  SL      # ( 濾 → 濾 ) CJK COMPATIBILITY IDEOGRAPH-F984 → CJK UNIFIED IDEOGRAPH-6FFE       # 
+
+2F915 ;        701B ;  SL      # ( 瀛 → 瀛 ) CJK COMPATIBILITY IDEOGRAPH-2F915 → CJK UNIFIED IDEOGRAPH-701B     # 
+
+FA9B ; 701E ;  SL      # ( 瀞 → 瀞 ) CJK COMPATIBILITY IDEOGRAPH-FA9B → CJK UNIFIED IDEOGRAPH-701E       # 
+2F914 ;        701E ;  SL      # ( 瀞 → 瀞 ) CJK COMPATIBILITY IDEOGRAPH-2F914 → CJK UNIFIED IDEOGRAPH-701E     # 
+
+2F913 ;        7039 ;  SL      # ( 瀹 → 瀹 ) CJK COMPATIBILITY IDEOGRAPH-2F913 → CJK UNIFIED IDEOGRAPH-7039     # 
+
+2F917 ;        704A ;  SL      # ( 灊 → 灊 ) CJK COMPATIBILITY IDEOGRAPH-2F917 → CJK UNIFIED IDEOGRAPH-704A     # 
+
+2F55 ; 706B ;  SL      #* ( ⽕ → 火 ) KANGXI RADICAL FIRE → CJK UNIFIED IDEOGRAPH-706B   # 
+
+2EA3 ; 706C ;  SL      #* ( ⺣ → 灬 ) CJK RADICAL FIRE → CJK UNIFIED IDEOGRAPH-706C      # 
+
+2F835 ;        7070 ;  SL      # ( 灰 → 灰 ) CJK COMPATIBILITY IDEOGRAPH-2F835 → CJK UNIFIED IDEOGRAPH-7070     # 
+
+2F919 ;        7077 ;  SL      # ( 灷 → 灷 ) CJK COMPATIBILITY IDEOGRAPH-2F919 → CJK UNIFIED IDEOGRAPH-7077     # 
+
+2F918 ;        707D ;  SL      # ( 災 → 災 ) CJK COMPATIBILITY IDEOGRAPH-2F918 → CJK UNIFIED IDEOGRAPH-707D     # 
+
+F9FB ; 7099 ;  SL      # ( 炙 → 炙 ) CJK COMPATIBILITY IDEOGRAPH-F9FB → CJK UNIFIED IDEOGRAPH-7099       # 
+
+2F91A ;        70AD ;  SL      # ( 炭 → 炭 ) CJK COMPATIBILITY IDEOGRAPH-2F91A → CJK UNIFIED IDEOGRAPH-70AD     # 
+
+F99F ; 70C8 ;  SL      # ( 烈 → 烈 ) CJK COMPATIBILITY IDEOGRAPH-F99F → CJK UNIFIED IDEOGRAPH-70C8       # 
+
+F916 ; 70D9 ;  SL      # ( 烙 → 烙 ) CJK COMPATIBILITY IDEOGRAPH-F916 → CJK UNIFIED IDEOGRAPH-70D9       # 
+
+2F91C ;        7145 ;  SL      # ( 煅 → 煅 ) CJK COMPATIBILITY IDEOGRAPH-2F91C → CJK UNIFIED IDEOGRAPH-7145     # 
+
+F993 ; 7149 ;  SL      # ( 煉 → 煉 ) CJK COMPATIBILITY IDEOGRAPH-F993 → CJK UNIFIED IDEOGRAPH-7149       # 
+
+FA48 ; 716E ;  SL      # ( 煮 → 煮 ) CJK COMPATIBILITY IDEOGRAPH-FA48 → CJK UNIFIED IDEOGRAPH-716E       # 
+FA9C ; 716E ;  SL      # ( 煮 → 煮 ) CJK COMPATIBILITY IDEOGRAPH-FA9C → CJK UNIFIED IDEOGRAPH-716E       # 
+
+2F91E ;        719C ;  SL      # ( 熜 → 熜 ) CJK COMPATIBILITY IDEOGRAPH-2F91E → CJK UNIFIED IDEOGRAPH-719C     # 
+
+F9C0 ; 71CE ;  SL      # ( 燎 → 燎 ) CJK COMPATIBILITY IDEOGRAPH-F9C0 → CJK UNIFIED IDEOGRAPH-71CE       # 
+
+F9EE ; 71D0 ;  SL      # ( 燐 → 燐 ) CJK COMPATIBILITY IDEOGRAPH-F9EE → CJK UNIFIED IDEOGRAPH-71D0       # 
+
+F932 ; 7210 ;  SL      # ( 爐 → 爐 ) CJK COMPATIBILITY IDEOGRAPH-F932 → CJK UNIFIED IDEOGRAPH-7210       # 
+
+F91E ; 721B ;  SL      # ( 爛 → 爛 ) CJK COMPATIBILITY IDEOGRAPH-F91E → CJK UNIFIED IDEOGRAPH-721B       # 
+
+2F920 ;        7228 ;  SL      # ( 爨 → 爨 ) CJK COMPATIBILITY IDEOGRAPH-2F920 → CJK UNIFIED IDEOGRAPH-7228     # 
+
+2F56 ; 722A ;  SL      #* ( ⽖ → 爪 ) KANGXI RADICAL CLAW → CJK UNIFIED IDEOGRAPH-722A   # 
+
+FA49 ; 722B ;  SL      # ( 爫 → 爫 ) CJK COMPATIBILITY IDEOGRAPH-FA49 → CJK UNIFIED IDEOGRAPH-722B       # 
+2EA4 ; 722B ;  SL      #* ( ⺤ → 爫 ) CJK RADICAL PAW ONE → CJK UNIFIED IDEOGRAPH-722B   # 
+
+FA9E ; 7235 ;  SL      # ( 爵 → 爵 ) CJK COMPATIBILITY IDEOGRAPH-FA9E → CJK UNIFIED IDEOGRAPH-7235       # 
+2F921 ;        7235 ;  SL      # ( 爵 → 爵 ) CJK COMPATIBILITY IDEOGRAPH-2F921 → CJK UNIFIED IDEOGRAPH-7235     # 
+
+2F57 ; 7236 ;  SL      #* ( ⽗ → 父 ) KANGXI RADICAL FATHER → CJK UNIFIED IDEOGRAPH-7236 # 
+
+2F58 ; 723B ;  SL      #* ( ⽘ → 爻 ) KANGXI RADICAL DOUBLE X → CJK UNIFIED IDEOGRAPH-723B       # 
+
+2F59 ; 723F ;  SL      #* ( ⽙ → 爿 ) KANGXI RADICAL HALF TREE TRUNK → CJK UNIFIED IDEOGRAPH-723F        # 
+
+2F5A ; 7247 ;  SL      #* ( ⽚ → 片 ) KANGXI RADICAL SLICE → CJK UNIFIED IDEOGRAPH-7247  # 
+
+2F922 ;        7250 ;  SL      # ( 牐 → 牐 ) CJK COMPATIBILITY IDEOGRAPH-2F922 → CJK UNIFIED IDEOGRAPH-7250     # 
+
+2F5B ; 7259 ;  SL      #* ( ⽛ → 牙 ) KANGXI RADICAL FANG → CJK UNIFIED IDEOGRAPH-7259   # 
+
+2F5C ; 725B ;  SL      #* ( ⽜ → 牛 ) KANGXI RADICAL COW → CJK UNIFIED IDEOGRAPH-725B    # 
+
+F946 ; 7262 ;  SL      # ( 牢 → 牢 ) CJK COMPATIBILITY IDEOGRAPH-F946 → CJK UNIFIED IDEOGRAPH-7262       # 
+
+2F924 ;        7280 ;  SL      # ( 犀 → 犀 ) CJK COMPATIBILITY IDEOGRAPH-2F924 → CJK UNIFIED IDEOGRAPH-7280     # 
+
+2F925 ;        7295 ;  SL      # ( 犕 → 犕 ) CJK COMPATIBILITY IDEOGRAPH-2F925 → CJK UNIFIED IDEOGRAPH-7295     # 
+
+2F5D ; 72AC ;  SL      #* ( ⽝ → 犬 ) KANGXI RADICAL DOG → CJK UNIFIED IDEOGRAPH-72AC    # 
+
+2EA8 ; 72AD ;  SL      #* ( ⺨ → 犭 ) CJK RADICAL DOG → CJK UNIFIED IDEOGRAPH-72AD       # 
+
+FA9F ; 72AF ;  SL      # ( 犯 → 犯 ) CJK COMPATIBILITY IDEOGRAPH-FA9F → CJK UNIFIED IDEOGRAPH-72AF       # 
+
+F9FA ; 72C0 ;  SL      # ( 狀 → 狀 ) CJK COMPATIBILITY IDEOGRAPH-F9FA → CJK UNIFIED IDEOGRAPH-72C0       # 
+
+F92B ; 72FC ;  SL      # ( 狼 → 狼 ) CJK COMPATIBILITY IDEOGRAPH-F92B → CJK UNIFIED IDEOGRAPH-72FC       # 
+
+FA16 ; 732A ;  SL      # ( 猪 → 猪 ) CJK COMPATIBILITY IDEOGRAPH-FA16 → CJK UNIFIED IDEOGRAPH-732A       # 
+FAA0 ; 732A ;  SL      # ( 猪 → 猪 ) CJK COMPATIBILITY IDEOGRAPH-FAA0 → CJK UNIFIED IDEOGRAPH-732A       # 
+
+F9A7 ; 7375 ;  SL      # ( 獵 → 獵 ) CJK COMPATIBILITY IDEOGRAPH-F9A7 → CJK UNIFIED IDEOGRAPH-7375       # 
+
+2F928 ;        737A ;  SL      # ( 獺 → 獺 ) CJK COMPATIBILITY IDEOGRAPH-2F928 → CJK UNIFIED IDEOGRAPH-737A     # 
+
+2F5E ; 7384 ;  SL      #* ( ⽞ → 玄 ) KANGXI RADICAL PROFOUND → CJK UNIFIED IDEOGRAPH-7384       # 
+
+F961 ; 7387 ;  SL      # ( 率 → 率 ) CJK COMPATIBILITY IDEOGRAPH-F961 → CJK UNIFIED IDEOGRAPH-7387       # 
+F9DB ; 7387 ;  SL      # ( 率 → 率 ) CJK COMPATIBILITY IDEOGRAPH-F9DB → CJK UNIFIED IDEOGRAPH-7387       # 
+
+2F5F ; 7389 ;  SL      #* ( ⽟ → 玉 ) KANGXI RADICAL JADE → CJK UNIFIED IDEOGRAPH-7389   # 
+
+2F929 ;        738B ;  SL      # ( 王 → 王 ) CJK COMPATIBILITY IDEOGRAPH-2F929 → CJK UNIFIED IDEOGRAPH-738B     # 
+
+2F92B ;        73A5 ;  SL      # ( 玥 → 玥 ) CJK COMPATIBILITY IDEOGRAPH-2F92B → CJK UNIFIED IDEOGRAPH-73A5     # 
+
+F9AD ; 73B2 ;  SL      # ( 玲 → 玲 ) CJK COMPATIBILITY IDEOGRAPH-F9AD → CJK UNIFIED IDEOGRAPH-73B2       # 
+
+F917 ; 73DE ;  SL      # ( 珞 → 珞 ) CJK COMPATIBILITY IDEOGRAPH-F917 → CJK UNIFIED IDEOGRAPH-73DE       # 
+
+F9E4 ; 7406 ;  SL      # ( 理 → 理 ) CJK COMPATIBILITY IDEOGRAPH-F9E4 → CJK UNIFIED IDEOGRAPH-7406       # 
+
+F9CC ; 7409 ;  SL      # ( 琉 → 琉 ) CJK COMPATIBILITY IDEOGRAPH-F9CC → CJK UNIFIED IDEOGRAPH-7409       # 
+
+FA4A ; 7422 ;  SL      # ( 琢 → 琢 ) CJK COMPATIBILITY IDEOGRAPH-FA4A → CJK UNIFIED IDEOGRAPH-7422       # 
+
+2F92E ;        7447 ;  SL      # ( 瑇 → 瑇 ) CJK COMPATIBILITY IDEOGRAPH-2F92E → CJK UNIFIED IDEOGRAPH-7447     # 
+
+2F92F ;        745C ;  SL      # ( 瑜 → 瑜 ) CJK COMPATIBILITY IDEOGRAPH-2F92F → CJK UNIFIED IDEOGRAPH-745C     # 
+
+F9AE ; 7469 ;  SL      # ( 瑩 → 瑩 ) CJK COMPATIBILITY IDEOGRAPH-F9AE → CJK UNIFIED IDEOGRAPH-7469       # 
+
+FAA1 ; 7471 ;  SL      # ( 瑱 → 瑱 ) CJK COMPATIBILITY IDEOGRAPH-FAA1 → CJK UNIFIED IDEOGRAPH-7471       # 
+2F930 ;        7471 ;  SL      # ( 瑱 → 瑱 ) CJK COMPATIBILITY IDEOGRAPH-2F930 → CJK UNIFIED IDEOGRAPH-7471     # 
+
+2F931 ;        7485 ;  SL      # ( 璅 → 璅 ) CJK COMPATIBILITY IDEOGRAPH-2F931 → CJK UNIFIED IDEOGRAPH-7485     # 
+
+F994 ; 7489 ;  SL      # ( 璉 → 璉 ) CJK COMPATIBILITY IDEOGRAPH-F994 → CJK UNIFIED IDEOGRAPH-7489       # 
+
+F9EF ; 7498 ;  SL      # ( 璘 → 璘 ) CJK COMPATIBILITY IDEOGRAPH-F9EF → CJK UNIFIED IDEOGRAPH-7498       # 
+
+2F932 ;        74CA ;  SL      # ( 瓊 → 瓊 ) CJK COMPATIBILITY IDEOGRAPH-2F932 → CJK UNIFIED IDEOGRAPH-74CA     # 
+
+2F60 ; 74DC ;  SL      #* ( ⽠ → 瓜 ) KANGXI RADICAL MELON → CJK UNIFIED IDEOGRAPH-74DC  # 
+
+2F61 ; 74E6 ;  SL      #* ( ⽡ → 瓦 ) KANGXI RADICAL TILE → CJK UNIFIED IDEOGRAPH-74E6   # 
+
+FAA2 ; 7506 ;  SL      # ( 甆 → 甆 ) CJK COMPATIBILITY IDEOGRAPH-FAA2 → CJK UNIFIED IDEOGRAPH-7506       # 
+
+2F62 ; 7518 ;  SL      #* ( ⽢ → 甘 ) KANGXI RADICAL SWEET → CJK UNIFIED IDEOGRAPH-7518  # 
+
+2F63 ; 751F ;  SL      #* ( ⽣ → 生 ) KANGXI RADICAL LIFE → CJK UNIFIED IDEOGRAPH-751F   # 
+
+2F934 ;        7524 ;  SL      # ( 甤 → 甤 ) CJK COMPATIBILITY IDEOGRAPH-2F934 → CJK UNIFIED IDEOGRAPH-7524     # 
+
+2F64 ; 7528 ;  SL      #* ( ⽤ → 用 ) KANGXI RADICAL USE → CJK UNIFIED IDEOGRAPH-7528    # 
+
+2F65 ; 7530 ;  SL      #* ( ⽥ → 田 ) KANGXI RADICAL FIELD → CJK UNIFIED IDEOGRAPH-7530  # 
+
+FAA3 ; 753B ;  SL      # ( 画 → 画 ) CJK COMPATIBILITY IDEOGRAPH-FAA3 → CJK UNIFIED IDEOGRAPH-753B       # 
+
+2F936 ;        753E ;  SL      # ( 甾 → 甾 ) CJK COMPATIBILITY IDEOGRAPH-2F936 → CJK UNIFIED IDEOGRAPH-753E     # 
+
+F9CD ; 7559 ;  SL      # ( 留 → 留 ) CJK COMPATIBILITY IDEOGRAPH-F9CD → CJK UNIFIED IDEOGRAPH-7559       # 
+
+F976 ; 7565 ;  SL      # ( 略 → 略 ) CJK COMPATIBILITY IDEOGRAPH-F976 → CJK UNIFIED IDEOGRAPH-7565       # 
+
+F962 ; 7570 ;  SL      # ( 異 → 異 ) CJK COMPATIBILITY IDEOGRAPH-F962 → CJK UNIFIED IDEOGRAPH-7570       # 
+2F938 ;        7570 ;  SL      # ( 異 → 異 ) CJK COMPATIBILITY IDEOGRAPH-2F938 → CJK UNIFIED IDEOGRAPH-7570     # 
+
+2F66 ; 758B ;  SL      #* ( ⽦ → 疋 ) KANGXI RADICAL BOLT OF CLOTH → CJK UNIFIED IDEOGRAPH-758B  # 
+
+2F67 ; 7592 ;  SL      #* ( ⽧ → 疒 ) KANGXI RADICAL SICKNESS → CJK UNIFIED IDEOGRAPH-7592       # 
+
+F9E5 ; 75E2 ;  SL      # ( 痢 → 痢 ) CJK COMPATIBILITY IDEOGRAPH-F9E5 → CJK UNIFIED IDEOGRAPH-75E2       # 
+
+2F93A ;        7610 ;  SL      # ( 瘐 → 瘐 ) CJK COMPATIBILITY IDEOGRAPH-2F93A → CJK UNIFIED IDEOGRAPH-7610     # 
+
+FAA4 ; 761D ;  SL      # ( 瘝 → 瘝 ) CJK COMPATIBILITY IDEOGRAPH-FAA4 → CJK UNIFIED IDEOGRAPH-761D       # 
+
+FAA5 ; 761F ;  SL      # ( 瘟 → 瘟 ) CJK COMPATIBILITY IDEOGRAPH-FAA5 → CJK UNIFIED IDEOGRAPH-761F       # 
+
+F9C1 ; 7642 ;  SL      # ( 療 → 療 ) CJK COMPATIBILITY IDEOGRAPH-F9C1 → CJK UNIFIED IDEOGRAPH-7642       # 
+
+F90E ; 7669 ;  SL      # ( 癩 → 癩 ) CJK COMPATIBILITY IDEOGRAPH-F90E → CJK UNIFIED IDEOGRAPH-7669       # 
+
+2F68 ; 7676 ;  SL      #* ( ⽨ → 癶 ) KANGXI RADICAL DOTTED TENT → CJK UNIFIED IDEOGRAPH-7676    # 
+
+2F69 ; 767D ;  SL      #* ( ⽩ → 白 ) KANGXI RADICAL WHITE → CJK UNIFIED IDEOGRAPH-767D  # 
+
+2F6A ; 76AE ;  SL      #* ( ⽪ → 皮 ) KANGXI RADICAL SKIN → CJK UNIFIED IDEOGRAPH-76AE   # 
+
+2F6B ; 76BF ;  SL      #* ( ⽫ → 皿 ) KANGXI RADICAL DISH → CJK UNIFIED IDEOGRAPH-76BF   # 
+
+FA17 ; 76CA ;  SL      # ( 益 → 益 ) CJK COMPATIBILITY IDEOGRAPH-FA17 → CJK UNIFIED IDEOGRAPH-76CA       # 
+FAA6 ; 76CA ;  SL      # ( 益 → 益 ) CJK COMPATIBILITY IDEOGRAPH-FAA6 → CJK UNIFIED IDEOGRAPH-76CA       # 
+
+FAA7 ; 76DB ;  SL      # ( 盛 → 盛 ) CJK COMPATIBILITY IDEOGRAPH-FAA7 → CJK UNIFIED IDEOGRAPH-76DB       # 
+
+F933 ; 76E7 ;  SL      # ( 盧 → 盧 ) CJK COMPATIBILITY IDEOGRAPH-F933 → CJK UNIFIED IDEOGRAPH-76E7       # 
+
+2F6C ; 76EE ;  SL      #* ( ⽬ → 目 ) KANGXI RADICAL EYE → CJK UNIFIED IDEOGRAPH-76EE    # 
+
+FAA8 ; 76F4 ;  SL      # ( 直 → 直 ) CJK COMPATIBILITY IDEOGRAPH-FAA8 → CJK UNIFIED IDEOGRAPH-76F4       # 
+2F940 ;        76F4 ;  SL      # ( 直 → 直 ) CJK COMPATIBILITY IDEOGRAPH-2F940 → CJK UNIFIED IDEOGRAPH-76F4     # 
+
+F96D ; 7701 ;  SL      # ( 省 → 省 ) CJK COMPATIBILITY IDEOGRAPH-F96D → CJK UNIFIED IDEOGRAPH-7701       # 
+
+2F945 ;        771E ;  SL      # ( 眞 → 眞 ) CJK COMPATIBILITY IDEOGRAPH-2F945 → CJK UNIFIED IDEOGRAPH-771E     # 
+
+2F946 ;        771F ;  SL      # ( 真 → 真 ) CJK COMPATIBILITY IDEOGRAPH-2F946 → CJK UNIFIED IDEOGRAPH-771F     # 
+2F947 ;        771F ;  SL      # ( 真 → 真 ) CJK COMPATIBILITY IDEOGRAPH-2F947 → CJK UNIFIED IDEOGRAPH-771F     # 
+
+FAAA ; 7740 ;  SL      # ( 着 → 着 ) CJK COMPATIBILITY IDEOGRAPH-FAAA → CJK UNIFIED IDEOGRAPH-7740       # 
+
+FAA9 ; 774A ;  SL      # ( 睊 → 睊 ) CJK COMPATIBILITY IDEOGRAPH-FAA9 → CJK UNIFIED IDEOGRAPH-774A       # 
+2F948 ;        774A ;  SL      # ( 睊 → 睊 ) CJK COMPATIBILITY IDEOGRAPH-2F948 → CJK UNIFIED IDEOGRAPH-774A     # 
+
+2F94A ;        778B ;  SL      # ( 瞋 → 瞋 ) CJK COMPATIBILITY IDEOGRAPH-2F94A → CJK UNIFIED IDEOGRAPH-778B     # 
+
+FA9D ; 77A7 ;  SL      # ( 瞧 → 瞧 ) CJK COMPATIBILITY IDEOGRAPH-FA9D → CJK UNIFIED IDEOGRAPH-77A7       # 
+
+2F6D ; 77DB ;  SL      #* ( ⽭ → 矛 ) KANGXI RADICAL SPEAR → CJK UNIFIED IDEOGRAPH-77DB  # 
+
+2F6E ; 77E2 ;  SL      #* ( ⽮ → 矢 ) KANGXI RADICAL ARROW → CJK UNIFIED IDEOGRAPH-77E2  # 
+
+2F6F ; 77F3 ;  SL      #* ( ⽯ → 石 ) KANGXI RADICAL STONE → CJK UNIFIED IDEOGRAPH-77F3  # 
+
+784F ; 7814 ;  SL      # ( 硏 → 研 ) CJK UNIFIED IDEOGRAPH-784F → CJK UNIFIED IDEOGRAPH-7814     # 
+
+2F94E ;        784E ;  SL      # ( 硎 → 硎 ) CJK COMPATIBILITY IDEOGRAPH-2F94E → CJK UNIFIED IDEOGRAPH-784E     # 
+
+F9CE ; 786B ;  SL      # ( 硫 → 硫 ) CJK COMPATIBILITY IDEOGRAPH-F9CE → CJK UNIFIED IDEOGRAPH-786B       # 
+
+F93B ; 788C ;  SL      # ( 碌 → 碌 ) CJK COMPATIBILITY IDEOGRAPH-F93B → CJK UNIFIED IDEOGRAPH-788C       # 
+2F94F ;        788C ;  SL      # ( 碌 → 碌 ) CJK COMPATIBILITY IDEOGRAPH-2F94F → CJK UNIFIED IDEOGRAPH-788C     # 
+
+FA4B ; 7891 ;  SL      # ( 碑 → 碑 ) CJK COMPATIBILITY IDEOGRAPH-FA4B → CJK UNIFIED IDEOGRAPH-7891       # 
+
+F947 ; 78CA ;  SL      # ( 磊 → 磊 ) CJK COMPATIBILITY IDEOGRAPH-F947 → CJK UNIFIED IDEOGRAPH-78CA       # 
+
+FAAB ; 78CC ;  SL      # ( 磌 → 磌 ) CJK COMPATIBILITY IDEOGRAPH-FAAB → CJK UNIFIED IDEOGRAPH-78CC       # 
+2F950 ;        78CC ;  SL      # ( 磌 → 磌 ) CJK COMPATIBILITY IDEOGRAPH-2F950 → CJK UNIFIED IDEOGRAPH-78CC     # 
+
+F964 ; 78FB ;  SL      # ( 磻 → 磻 ) CJK COMPATIBILITY IDEOGRAPH-F964 → CJK UNIFIED IDEOGRAPH-78FB       # 
+
+F985 ; 792A ;  SL      # ( 礪 → 礪 ) CJK COMPATIBILITY IDEOGRAPH-F985 → CJK UNIFIED IDEOGRAPH-792A       # 
+
+2F70 ; 793A ;  SL      #* ( ⽰ → 示 ) KANGXI RADICAL SPIRIT → CJK UNIFIED IDEOGRAPH-793A # 
+
+2EAD ; 793B ;  SL      #* ( ⺭ → 礻 ) CJK RADICAL SPIRIT TWO → CJK UNIFIED IDEOGRAPH-793B        # 
+
+FA18 ; 793C ;  SL      # ( 礼 → 礼 ) CJK COMPATIBILITY IDEOGRAPH-FA18 → CJK UNIFIED IDEOGRAPH-793C       # 
+
+FA4C ; 793E ;  SL      # ( 社 → 社 ) CJK COMPATIBILITY IDEOGRAPH-FA4C → CJK UNIFIED IDEOGRAPH-793E       # 
+
+FA4E ; 7948 ;  SL      # ( 祈 → 祈 ) CJK COMPATIBILITY IDEOGRAPH-FA4E → CJK UNIFIED IDEOGRAPH-7948       # 
+
+FA4D ; 7949 ;  SL      # ( 祉 → 祉 ) CJK COMPATIBILITY IDEOGRAPH-FA4D → CJK UNIFIED IDEOGRAPH-7949       # 
+
+FA4F ; 7950 ;  SL      # ( 祐 → 祐 ) CJK COMPATIBILITY IDEOGRAPH-FA4F → CJK UNIFIED IDEOGRAPH-7950       # 
+
+FA50 ; 7956 ;  SL      # ( 祖 → 祖 ) CJK COMPATIBILITY IDEOGRAPH-FA50 → CJK UNIFIED IDEOGRAPH-7956       # 
+2F953 ;        7956 ;  SL      # ( 祖 → 祖 ) CJK COMPATIBILITY IDEOGRAPH-2F953 → CJK UNIFIED IDEOGRAPH-7956     # 
+
+FA51 ; 795D ;  SL      # ( 祝 → 祝 ) CJK COMPATIBILITY IDEOGRAPH-FA51 → CJK UNIFIED IDEOGRAPH-795D       # 
+
+FA19 ; 795E ;  SL      # ( 神 → 神 ) CJK COMPATIBILITY IDEOGRAPH-FA19 → CJK UNIFIED IDEOGRAPH-795E       # 
+
+FA1A ; 7965 ;  SL      # ( 祥 → 祥 ) CJK COMPATIBILITY IDEOGRAPH-FA1A → CJK UNIFIED IDEOGRAPH-7965       # 
+
+F93C ; 797F ;  SL      # ( 祿 → 祿 ) CJK COMPATIBILITY IDEOGRAPH-F93C → CJK UNIFIED IDEOGRAPH-797F       # 
+
+FA52 ; 798D ;  SL      # ( 禍 → 禍 ) CJK COMPATIBILITY IDEOGRAPH-FA52 → CJK UNIFIED IDEOGRAPH-798D       # 
+
+FA53 ; 798E ;  SL      # ( 禎 → 禎 ) CJK COMPATIBILITY IDEOGRAPH-FA53 → CJK UNIFIED IDEOGRAPH-798E       # 
+
+FA1B ; 798F ;  SL      # ( 福 → 福 ) CJK COMPATIBILITY IDEOGRAPH-FA1B → CJK UNIFIED IDEOGRAPH-798F       # 
+2F956 ;        798F ;  SL      # ( 福 → 福 ) CJK COMPATIBILITY IDEOGRAPH-2F956 → CJK UNIFIED IDEOGRAPH-798F     # 
+
+F9B6 ; 79AE ;  SL      # ( 禮 → 禮 ) CJK COMPATIBILITY IDEOGRAPH-F9B6 → CJK UNIFIED IDEOGRAPH-79AE       # 
+
+2F71 ; 79B8 ;  SL      #* ( ⽱ → 禸 ) KANGXI RADICAL TRACK → CJK UNIFIED IDEOGRAPH-79B8  # 
+
+2F72 ; 79BE ;  SL      #* ( ⽲ → 禾 ) KANGXI RADICAL GRAIN → CJK UNIFIED IDEOGRAPH-79BE  # 
+
+F995 ; 79CA ;  SL      # ( 秊 → 秊 ) CJK COMPATIBILITY IDEOGRAPH-F995 → CJK UNIFIED IDEOGRAPH-79CA       # 
+
+2F957 ;        79EB ;  SL      # ( 秫 → 秫 ) CJK COMPATIBILITY IDEOGRAPH-2F957 → CJK UNIFIED IDEOGRAPH-79EB     # 
+
+F956 ; 7A1C ;  SL      # ( 稜 → 稜 ) CJK COMPATIBILITY IDEOGRAPH-F956 → CJK UNIFIED IDEOGRAPH-7A1C       # 
+
+FA54 ; 7A40 ;  SL      # ( 穀 → 穀 ) CJK COMPATIBILITY IDEOGRAPH-FA54 → CJK UNIFIED IDEOGRAPH-7A40       # 
+2F959 ;        7A40 ;  SL      # ( 穀 → 穀 ) CJK COMPATIBILITY IDEOGRAPH-2F959 → CJK UNIFIED IDEOGRAPH-7A40     # 
+
+2F95A ;        7A4A ;  SL      # ( 穊 → 穊 ) CJK COMPATIBILITY IDEOGRAPH-2F95A → CJK UNIFIED IDEOGRAPH-7A4A     # 
+
+2F95B ;        7A4F ;  SL      # ( 穏 → 穏 ) CJK COMPATIBILITY IDEOGRAPH-2F95B → CJK UNIFIED IDEOGRAPH-7A4F     # 
+
+2F73 ; 7A74 ;  SL      #* ( ⽳ → 穴 ) KANGXI RADICAL CAVE → CJK UNIFIED IDEOGRAPH-7A74   # 
+
+FA55 ; 7A81 ;  SL      # ( 突 → 突 ) CJK COMPATIBILITY IDEOGRAPH-FA55 → CJK UNIFIED IDEOGRAPH-7A81       # 
+
+FAAC ; 7AB1 ;  SL      # ( 窱 → 窱 ) CJK COMPATIBILITY IDEOGRAPH-FAAC → CJK UNIFIED IDEOGRAPH-7AB1       # 
+
+F9F7 ; 7ACB ;  SL      # ( 立 → 立 ) CJK COMPATIBILITY IDEOGRAPH-F9F7 → CJK UNIFIED IDEOGRAPH-7ACB       # 
+2F74 ; 7ACB ;  SL      #* ( ⽴ → 立 ) KANGXI RADICAL STAND → CJK UNIFIED IDEOGRAPH-7ACB  # 
+
+2EEF ; 7ADC ;  SL      #* ( ⻯ → 竜 ) CJK RADICAL J-SIMPLIFIED DRAGON → CJK UNIFIED IDEOGRAPH-7ADC       # 
+
+2F95F ;        7AEE ;  SL      # ( 竮 → 竮 ) CJK COMPATIBILITY IDEOGRAPH-2F95F → CJK UNIFIED IDEOGRAPH-7AEE     # 
+
+2F75 ; 7AF9 ;  SL      #* ( ⽵ → 竹 ) KANGXI RADICAL BAMBOO → CJK UNIFIED IDEOGRAPH-7AF9 # 
+
+F9F8 ; 7B20 ;  SL      # ( 笠 → 笠 ) CJK COMPATIBILITY IDEOGRAPH-F9F8 → CJK UNIFIED IDEOGRAPH-7B20       # 
+
+FA56 ; 7BC0 ;  SL      # ( 節 → 節 ) CJK COMPATIBILITY IDEOGRAPH-FA56 → CJK UNIFIED IDEOGRAPH-7BC0       # 
+FAAD ; 7BC0 ;  SL      # ( 節 → 節 ) CJK COMPATIBILITY IDEOGRAPH-FAAD → CJK UNIFIED IDEOGRAPH-7BC0       # 
+
+2F962 ;        7BC6 ;  SL      # ( 篆 → 篆 ) CJK COMPATIBILITY IDEOGRAPH-2F962 → CJK UNIFIED IDEOGRAPH-7BC6     # 
+
+2F963 ;        7BC9 ;  SL      # ( 築 → 築 ) CJK COMPATIBILITY IDEOGRAPH-2F963 → CJK UNIFIED IDEOGRAPH-7BC9     # 
+
+F9A6 ; 7C3E ;  SL      # ( 簾 → 簾 ) CJK COMPATIBILITY IDEOGRAPH-F9A6 → CJK UNIFIED IDEOGRAPH-7C3E       # 
+
+F944 ; 7C60 ;  SL      # ( 籠 → 籠 ) CJK COMPATIBILITY IDEOGRAPH-F944 → CJK UNIFIED IDEOGRAPH-7C60       # 
+
+2F76 ; 7C73 ;  SL      #* ( ⽶ → 米 ) KANGXI RADICAL RICE → CJK UNIFIED IDEOGRAPH-7C73   # 
+
+FAAE ; 7C7B ;  SL      # ( 类 → 类 ) CJK COMPATIBILITY IDEOGRAPH-FAAE → CJK UNIFIED IDEOGRAPH-7C7B       # 
+
+F9F9 ; 7C92 ;  SL      # ( 粒 → 粒 ) CJK COMPATIBILITY IDEOGRAPH-F9F9 → CJK UNIFIED IDEOGRAPH-7C92       # 
+
+FA1D ; 7CBE ;  SL      # ( 精 → 精 ) CJK COMPATIBILITY IDEOGRAPH-FA1D → CJK UNIFIED IDEOGRAPH-7CBE       # 
+
+2F966 ;        7CD2 ;  SL      # ( 糒 → 糒 ) CJK COMPATIBILITY IDEOGRAPH-2F966 → CJK UNIFIED IDEOGRAPH-7CD2     # 
+
+FA03 ; 7CD6 ;  SL      # ( 糖 → 糖 ) CJK COMPATIBILITY IDEOGRAPH-FA03 → CJK UNIFIED IDEOGRAPH-7CD6       # 
+
+2F969 ;        7CE3 ;  SL      # ( 糣 → 糣 ) CJK COMPATIBILITY IDEOGRAPH-2F969 → CJK UNIFIED IDEOGRAPH-7CE3     # 
+
+F97B ; 7CE7 ;  SL      # ( 糧 → 糧 ) CJK COMPATIBILITY IDEOGRAPH-F97B → CJK UNIFIED IDEOGRAPH-7CE7       # 
+
+2F968 ;        7CE8 ;  SL      # ( 糨 → 糨 ) CJK COMPATIBILITY IDEOGRAPH-2F968 → CJK UNIFIED IDEOGRAPH-7CE8     # 
+
+2F77 ; 7CF8 ;  SL      #* ( ⽷ → 糸 ) KANGXI RADICAL SILK → CJK UNIFIED IDEOGRAPH-7CF8   # 
+
+2EAF ; 7CF9 ;  SL      #* ( ⺯ → 糹 ) CJK RADICAL SILK → CJK UNIFIED IDEOGRAPH-7CF9      # 
+
+2F96A ;        7D00 ;  SL      # ( 紀 → 紀 ) CJK COMPATIBILITY IDEOGRAPH-2F96A → CJK UNIFIED IDEOGRAPH-7D00     # 
+
+F9CF ; 7D10 ;  SL      # ( 紐 → 紐 ) CJK COMPATIBILITY IDEOGRAPH-F9CF → CJK UNIFIED IDEOGRAPH-7D10       # 
+
+F96A ; 7D22 ;  SL      # ( 索 → 索 ) CJK COMPATIBILITY IDEOGRAPH-F96A → CJK UNIFIED IDEOGRAPH-7D22       # 
+
+F94F ; 7D2F ;  SL      # ( 累 → 累 ) CJK COMPATIBILITY IDEOGRAPH-F94F → CJK UNIFIED IDEOGRAPH-7D2F       # 
+
+7D76 ; 7D55 ;  SL      # ( 絶 → 絕 ) CJK UNIFIED IDEOGRAPH-7D76 → CJK UNIFIED IDEOGRAPH-7D55     # 
+
+FAAF ; 7D5B ;  SL      # ( 絛 → 絛 ) CJK COMPATIBILITY IDEOGRAPH-FAAF → CJK UNIFIED IDEOGRAPH-7D5B       # 
+
+2F96C ;        7D63 ;  SL      # ( 絣 → 絣 ) CJK COMPATIBILITY IDEOGRAPH-2F96C → CJK UNIFIED IDEOGRAPH-7D63     # 
+
+F93D ; 7DA0 ;  SL      # ( 綠 → 綠 ) CJK COMPATIBILITY IDEOGRAPH-F93D → CJK UNIFIED IDEOGRAPH-7DA0       # 
+
+F957 ; 7DBE ;  SL      # ( 綾 → 綾 ) CJK COMPATIBILITY IDEOGRAPH-F957 → CJK UNIFIED IDEOGRAPH-7DBE       # 
+
+2F96E ;        7DC7 ;  SL      # ( 緇 → 緇 ) CJK COMPATIBILITY IDEOGRAPH-2F96E → CJK UNIFIED IDEOGRAPH-7DC7     # 
+
+F996 ; 7DF4 ;  SL      # ( 練 → 練 ) CJK COMPATIBILITY IDEOGRAPH-F996 → CJK UNIFIED IDEOGRAPH-7DF4       # 
+FA57 ; 7DF4 ;  SL      # ( 練 → 練 ) CJK COMPATIBILITY IDEOGRAPH-FA57 → CJK UNIFIED IDEOGRAPH-7DF4       # 
+FAB0 ; 7DF4 ;  SL      # ( 練 → 練 ) CJK COMPATIBILITY IDEOGRAPH-FAB0 → CJK UNIFIED IDEOGRAPH-7DF4       # 
+
+2F96F ;        7E02 ;  SL      # ( 縂 → 縂 ) CJK COMPATIBILITY IDEOGRAPH-2F96F → CJK UNIFIED IDEOGRAPH-7E02     # 
+
+FA58 ; 7E09 ;  SL      # ( 縉 → 縉 ) CJK COMPATIBILITY IDEOGRAPH-FA58 → CJK UNIFIED IDEOGRAPH-7E09       # 
+
+F950 ; 7E37 ;  SL      # ( 縷 → 縷 ) CJK COMPATIBILITY IDEOGRAPH-F950 → CJK UNIFIED IDEOGRAPH-7E37       # 
+
+FA59 ; 7E41 ;  SL      # ( 繁 → 繁 ) CJK COMPATIBILITY IDEOGRAPH-FA59 → CJK UNIFIED IDEOGRAPH-7E41       # 
+
+2F970 ;        7E45 ;  SL      # ( 繅 → 繅 ) CJK COMPATIBILITY IDEOGRAPH-2F970 → CJK UNIFIED IDEOGRAPH-7E45     # 
+
+2F78 ; 7F36 ;  SL      #* ( ⽸ → 缶 ) KANGXI RADICAL JAR → CJK UNIFIED IDEOGRAPH-7F36    # 
+
+FAB1 ; 7F3E ;  SL      # ( 缾 → 缾 ) CJK COMPATIBILITY IDEOGRAPH-FAB1 → CJK UNIFIED IDEOGRAPH-7F3E       # 
+
+2F79 ; 7F51 ;  SL      #* ( ⽹ → 网 ) KANGXI RADICAL NET → CJK UNIFIED IDEOGRAPH-7F51    # 
+
+2EAB ; 7F52 ;  SL      #* ( ⺫ → 罒 ) CJK RADICAL EYE → CJK UNIFIED IDEOGRAPH-7F52       # 
+2EB2 ; 7F52 ;  SL      #* ( ⺲ → 罒 ) CJK RADICAL NET TWO → CJK UNIFIED IDEOGRAPH-7F52   # 
+
+2EB1 ; 7F53 ;  SL      #* ( ⺱ → 罓 ) CJK RADICAL NET ONE → CJK UNIFIED IDEOGRAPH-7F53   # 
+
+FA5A ; 7F72 ;  SL      # ( 署 → 署 ) CJK COMPATIBILITY IDEOGRAPH-FA5A → CJK UNIFIED IDEOGRAPH-7F72       # 
+
+F9E6 ; 7F79 ;  SL      # ( 罹 → 罹 ) CJK COMPATIBILITY IDEOGRAPH-F9E6 → CJK UNIFIED IDEOGRAPH-7F79       # 
+
+2F976 ;        7F7A ;  SL      # ( 罺 → 罺 ) CJK COMPATIBILITY IDEOGRAPH-2F976 → CJK UNIFIED IDEOGRAPH-7F7A     # 
+
+F90F ; 7F85 ;  SL      # ( 羅 → 羅 ) CJK COMPATIBILITY IDEOGRAPH-F90F → CJK UNIFIED IDEOGRAPH-7F85       # 
+
+2F7A ; 7F8A ;  SL      #* ( ⽺ → 羊 ) KANGXI RADICAL SHEEP → CJK UNIFIED IDEOGRAPH-7F8A  # 
+
+2F978 ;        7F95 ;  SL      # ( 羕 → 羕 ) CJK COMPATIBILITY IDEOGRAPH-2F978 → CJK UNIFIED IDEOGRAPH-7F95     # 
+
+F9AF ; 7F9A ;  SL      # ( 羚 → 羚 ) CJK COMPATIBILITY IDEOGRAPH-F9AF → CJK UNIFIED IDEOGRAPH-7F9A       # 
+
+FA1E ; 7FBD ;  SL      # ( 羽 → 羽 ) CJK COMPATIBILITY IDEOGRAPH-FA1E → CJK UNIFIED IDEOGRAPH-7FBD       # 
+2F7B ; 7FBD ;  SL      #* ( ⽻ → 羽 ) KANGXI RADICAL FEATHER → CJK UNIFIED IDEOGRAPH-7FBD        # 
+
+2F979 ;        7FFA ;  SL      # ( 翺 → 翺 ) CJK COMPATIBILITY IDEOGRAPH-2F979 → CJK UNIFIED IDEOGRAPH-7FFA     # 
+
+F934 ; 8001 ;  SL      # ( 老 → 老 ) CJK COMPATIBILITY IDEOGRAPH-F934 → CJK UNIFIED IDEOGRAPH-8001       # 
+2F7C ; 8001 ;  SL      #* ( ⽼ → 老 ) KANGXI RADICAL OLD → CJK UNIFIED IDEOGRAPH-8001    # 
+
+2EB9 ; 8002 ;  SL      #* ( ⺹ → 耂 ) CJK RADICAL OLD → CJK UNIFIED IDEOGRAPH-8002       # 
+
+FA5B ; 8005 ;  SL      # ( 者 → 者 ) CJK COMPATIBILITY IDEOGRAPH-FA5B → CJK UNIFIED IDEOGRAPH-8005       # 
+FAB2 ; 8005 ;  SL      # ( 者 → 者 ) CJK COMPATIBILITY IDEOGRAPH-FAB2 → CJK UNIFIED IDEOGRAPH-8005       # 
+2F97A ;        8005 ;  SL      # ( 者 → 者 ) CJK COMPATIBILITY IDEOGRAPH-2F97A → CJK UNIFIED IDEOGRAPH-8005     # 
+
+2F7D ; 800C ;  SL      #* ( ⽽ → 而 ) KANGXI RADICAL AND → CJK UNIFIED IDEOGRAPH-800C    # 
+
+2F7E ; 8012 ;  SL      #* ( ⽾ → 耒 ) KANGXI RADICAL PLOW → CJK UNIFIED IDEOGRAPH-8012   # 
+
+2F7F ; 8033 ;  SL      #* ( ⽿ → 耳 ) KANGXI RADICAL EAR → CJK UNIFIED IDEOGRAPH-8033    # 
+
+F9B0 ; 8046 ;  SL      # ( 聆 → 聆 ) CJK COMPATIBILITY IDEOGRAPH-F9B0 → CJK UNIFIED IDEOGRAPH-8046       # 
+
+2F97D ;        8060 ;  SL      # ( 聠 → 聠 ) CJK COMPATIBILITY IDEOGRAPH-2F97D → CJK UNIFIED IDEOGRAPH-8060     # 
+
+F997 ; 806F ;  SL      # ( 聯 → 聯 ) CJK COMPATIBILITY IDEOGRAPH-F997 → CJK UNIFIED IDEOGRAPH-806F       # 
+
+2F97F ;        8070 ;  SL      # ( 聰 → 聰 ) CJK COMPATIBILITY IDEOGRAPH-2F97F → CJK UNIFIED IDEOGRAPH-8070     # 
+
+F945 ; 807E ;  SL      # ( 聾 → 聾 ) CJK COMPATIBILITY IDEOGRAPH-F945 → CJK UNIFIED IDEOGRAPH-807E       # 
+
+2F80 ; 807F ;  SL      #* ( ⾀ → 聿 ) KANGXI RADICAL BRUSH → CJK UNIFIED IDEOGRAPH-807F  # 
+
+2EBA ; 8080 ;  SL      #* ( ⺺ → 肀 ) CJK RADICAL BRUSH ONE → CJK UNIFIED IDEOGRAPH-8080 # 
+
+2F81 ; 8089 ;  SL      #* ( ⾁ → 肉 ) KANGXI RADICAL MEAT → CJK UNIFIED IDEOGRAPH-8089   # 
+
+F953 ; 808B ;  SL      # ( 肋 → 肋 ) CJK COMPATIBILITY IDEOGRAPH-F953 → CJK UNIFIED IDEOGRAPH-808B       # 
+
+2F8D6 ;        80AD ;  SL      # ( 肭 → 肭 ) CJK COMPATIBILITY IDEOGRAPH-2F8D6 → CJK UNIFIED IDEOGRAPH-80AD     # 
+
+2F982 ;        80B2 ;  SL      # ( 育 → 育 ) CJK COMPATIBILITY IDEOGRAPH-2F982 → CJK UNIFIED IDEOGRAPH-80B2     # 
+
+8141 ; 80FC ;  SL      # ( 腁 → 胼 ) CJK UNIFIED IDEOGRAPH-8141 → CJK UNIFIED IDEOGRAPH-80FC     # 
+
+2F983 ;        8103 ;  SL      # ( 脃 → 脃 ) CJK COMPATIBILITY IDEOGRAPH-2F983 → CJK UNIFIED IDEOGRAPH-8103     # 
+
+2F985 ;        813E ;  SL      # ( 脾 → 脾 ) CJK COMPATIBILITY IDEOGRAPH-2F985 → CJK UNIFIED IDEOGRAPH-813E     # 
+
+F926 ; 81D8 ;  SL      # ( 臘 → 臘 ) CJK COMPATIBILITY IDEOGRAPH-F926 → CJK UNIFIED IDEOGRAPH-81D8       # 
+
+2F82 ; 81E3 ;  SL      #* ( ⾂ → 臣 ) KANGXI RADICAL MINISTER → CJK UNIFIED IDEOGRAPH-81E3       # 
+
+F9F6 ; 81E8 ;  SL      # ( 臨 → 臨 ) CJK COMPATIBILITY IDEOGRAPH-F9F6 → CJK UNIFIED IDEOGRAPH-81E8       # 
+
+2F83 ; 81EA ;  SL      #* ( ⾃ → 自 ) KANGXI RADICAL SELF → CJK UNIFIED IDEOGRAPH-81EA   # 
+
+FA5C ; 81ED ;  SL      # ( 臭 → 臭 ) CJK COMPATIBILITY IDEOGRAPH-FA5C → CJK UNIFIED IDEOGRAPH-81ED       # 
+
+2F84 ; 81F3 ;  SL      #* ( ⾄ → 至 ) KANGXI RADICAL ARRIVE → CJK UNIFIED IDEOGRAPH-81F3 # 
+
+2F85 ; 81FC ;  SL      #* ( ⾅ → 臼 ) KANGXI RADICAL MORTAR → CJK UNIFIED IDEOGRAPH-81FC # 
+
+2F893 ;        8201 ;  SL      # ( 舁 → 舁 ) CJK COMPATIBILITY IDEOGRAPH-2F893 → CJK UNIFIED IDEOGRAPH-8201     # 
+2F98B ;        8201 ;  SL      # ( 舁 → 舁 ) CJK COMPATIBILITY IDEOGRAPH-2F98B → CJK UNIFIED IDEOGRAPH-8201     # 
+
+2F98C ;        8204 ;  SL      # ( 舄 → 舄 ) CJK COMPATIBILITY IDEOGRAPH-2F98C → CJK UNIFIED IDEOGRAPH-8204     # 
+
+2F86 ; 820C ;  SL      #* ( ⾆ → 舌 ) KANGXI RADICAL TONGUE → CJK UNIFIED IDEOGRAPH-820C # 
+
+FA6D ; 8218 ;  SL      # ( 舘 → 舘 ) CJK COMPATIBILITY IDEOGRAPH-FA6D → CJK UNIFIED IDEOGRAPH-8218       # 
+
+2F87 ; 821B ;  SL      #* ( ⾇ → 舛 ) KANGXI RADICAL OPPOSE → CJK UNIFIED IDEOGRAPH-821B # 
+
+2F88 ; 821F ;  SL      #* ( ⾈ → 舟 ) KANGXI RADICAL BOAT → CJK UNIFIED IDEOGRAPH-821F   # 
+
+2F89 ; 826E ;  SL      #* ( ⾉ → 艮 ) KANGXI RADICAL STOPPING → CJK UNIFIED IDEOGRAPH-826E       # 
+
+F97C ; 826F ;  SL      # ( 良 → 良 ) CJK COMPATIBILITY IDEOGRAPH-F97C → CJK UNIFIED IDEOGRAPH-826F       # 
+
+2F8A ; 8272 ;  SL      #* ( ⾊ → 色 ) KANGXI RADICAL COLOR → CJK UNIFIED IDEOGRAPH-8272  # 
+
+2F8B ; 8278 ;  SL      #* ( ⾋ → 艸 ) KANGXI RADICAL GRASS → CJK UNIFIED IDEOGRAPH-8278  # 
+
+FA5D ; 8279 ;  SL      # ( 艹 → 艹 ) CJK COMPATIBILITY IDEOGRAPH-FA5D → CJK UNIFIED IDEOGRAPH-8279       # 
+FA5E ; 8279 ;  SL      # ( 艹 → 艹 ) CJK COMPATIBILITY IDEOGRAPH-FA5E → CJK UNIFIED IDEOGRAPH-8279       # 
+2EBE ; 8279 ;  SL      #* ( ⺾ → 艹 ) CJK RADICAL GRASS ONE → CJK UNIFIED IDEOGRAPH-8279 # 
+2EBF ; 8279 ;  SL      #* ( ⺿ → 艹 ) CJK RADICAL GRASS TWO → CJK UNIFIED IDEOGRAPH-8279 # →艹→
+2EC0 ; 8279 ;  SL      #* ( ⻀ → 艹 ) CJK RADICAL GRASS THREE → CJK UNIFIED IDEOGRAPH-8279       # →艹→
+
+2F990 ;        828B ;  SL      # ( 芋 → 芋 ) CJK COMPATIBILITY IDEOGRAPH-2F990 → CJK UNIFIED IDEOGRAPH-828B     # 
+
+2F98F ;        8291 ;  SL      # ( 芑 → 芑 ) CJK COMPATIBILITY IDEOGRAPH-2F98F → CJK UNIFIED IDEOGRAPH-8291     # 
+
+2F991 ;        829D ;  SL      # ( 芝 → 芝 ) CJK COMPATIBILITY IDEOGRAPH-2F991 → CJK UNIFIED IDEOGRAPH-829D     # 
+
+2F993 ;        82B1 ;  SL      # ( 花 → 花 ) CJK COMPATIBILITY IDEOGRAPH-2F993 → CJK UNIFIED IDEOGRAPH-82B1     # 
+
+2F994 ;        82B3 ;  SL      # ( 芳 → 芳 ) CJK COMPATIBILITY IDEOGRAPH-2F994 → CJK UNIFIED IDEOGRAPH-82B3     # 
+
+2F995 ;        82BD ;  SL      # ( 芽 → 芽 ) CJK COMPATIBILITY IDEOGRAPH-2F995 → CJK UNIFIED IDEOGRAPH-82BD     # 
+
+F974 ; 82E5 ;  SL      # ( 若 → 若 ) CJK COMPATIBILITY IDEOGRAPH-F974 → CJK UNIFIED IDEOGRAPH-82E5       # 
+2F998 ;        82E5 ;  SL      # ( 若 → 若 ) CJK COMPATIBILITY IDEOGRAPH-2F998 → CJK UNIFIED IDEOGRAPH-82E5     # 
+
+2F996 ;        82E6 ;  SL      # ( 苦 → 苦 ) CJK COMPATIBILITY IDEOGRAPH-2F996 → CJK UNIFIED IDEOGRAPH-82E6     # 
+
+2F999 ;        831D ;  SL      # ( 茝 → 茝 ) CJK COMPATIBILITY IDEOGRAPH-2F999 → CJK UNIFIED IDEOGRAPH-831D     # 
+
+2F99C ;        8323 ;  SL      # ( 茣 → 茣 ) CJK COMPATIBILITY IDEOGRAPH-2F99C → CJK UNIFIED IDEOGRAPH-8323     # 
+
+F9FE ; 8336 ;  SL      # ( 茶 → 茶 ) CJK COMPATIBILITY IDEOGRAPH-F9FE → CJK UNIFIED IDEOGRAPH-8336       # 
+
+FAB3 ; 8352 ;  SL      # ( 荒 → 荒 ) CJK COMPATIBILITY IDEOGRAPH-FAB3 → CJK UNIFIED IDEOGRAPH-8352       # 
+
+2F9A0 ;        8353 ;  SL      # ( 荓 → 荓 ) CJK COMPATIBILITY IDEOGRAPH-2F9A0 → CJK UNIFIED IDEOGRAPH-8353     # 
+
+2F99A ;        8363 ;  SL      # ( 荣 → 荣 ) CJK COMPATIBILITY IDEOGRAPH-2F99A → CJK UNIFIED IDEOGRAPH-8363     # 
+
+2F99B ;        83AD ;  SL      # ( 莭 → 莭 ) CJK COMPATIBILITY IDEOGRAPH-2F99B → CJK UNIFIED IDEOGRAPH-83AD     # 
+
+2F99D ;        83BD ;  SL      # ( 莽 → 莽 ) CJK COMPATIBILITY IDEOGRAPH-2F99D → CJK UNIFIED IDEOGRAPH-83BD     # 
+
+F93E ; 83C9 ;  SL      # ( 菉 → 菉 ) CJK COMPATIBILITY IDEOGRAPH-F93E → CJK UNIFIED IDEOGRAPH-83C9       # 
+
+2F9A1 ;        83CA ;  SL      # ( 菊 → 菊 ) CJK COMPATIBILITY IDEOGRAPH-2F9A1 → CJK UNIFIED IDEOGRAPH-83CA     # 
+
+2F9A2 ;        83CC ;  SL      # ( 菌 → 菌 ) CJK COMPATIBILITY IDEOGRAPH-2F9A2 → CJK UNIFIED IDEOGRAPH-83CC     # 
+
+2F9A3 ;        83DC ;  SL      # ( 菜 → 菜 ) CJK COMPATIBILITY IDEOGRAPH-2F9A3 → CJK UNIFIED IDEOGRAPH-83DC     # 
+
+2F99E ;        83E7 ;  SL      # ( 菧 → 菧 ) CJK COMPATIBILITY IDEOGRAPH-2F99E → CJK UNIFIED IDEOGRAPH-83E7     # 
+
+FAB4 ; 83EF ;  SL      # ( 華 → 華 ) CJK COMPATIBILITY IDEOGRAPH-FAB4 → CJK UNIFIED IDEOGRAPH-83EF       # 
+
+F958 ; 83F1 ;  SL      # ( 菱 → 菱 ) CJK COMPATIBILITY IDEOGRAPH-F958 → CJK UNIFIED IDEOGRAPH-83F1       # 
+
+F918 ; 843D ;  SL      # ( 落 → 落 ) CJK COMPATIBILITY IDEOGRAPH-F918 → CJK UNIFIED IDEOGRAPH-843D       # 
+
+F96E ; 8449 ;  SL      # ( 葉 → 葉 ) CJK COMPATIBILITY IDEOGRAPH-F96E → CJK UNIFIED IDEOGRAPH-8449       # 
+
+FA5F ; 8457 ;  SL      # ( 著 → 著 ) CJK COMPATIBILITY IDEOGRAPH-FA5F → CJK UNIFIED IDEOGRAPH-8457       # 
+2F99F ;        8457 ;  SL      # ( 著 → 著 ) CJK COMPATIBILITY IDEOGRAPH-2F99F → CJK UNIFIED IDEOGRAPH-8457     # 
+
+853F ; 848D ;  SL      # ( 蔿 → 蒍 ) CJK UNIFIED IDEOGRAPH-853F → CJK UNIFIED IDEOGRAPH-848D     # 
+
+F999 ; 84EE ;  SL      # ( 蓮 → 蓮 ) CJK COMPATIBILITY IDEOGRAPH-F999 → CJK UNIFIED IDEOGRAPH-84EE       # 
+
+2F9A8 ;        84F1 ;  SL      # ( 蓱 → 蓱 ) CJK COMPATIBILITY IDEOGRAPH-2F9A8 → CJK UNIFIED IDEOGRAPH-84F1     # 
+
+2F9A9 ;        84F3 ;  SL      # ( 蓳 → 蓳 ) CJK COMPATIBILITY IDEOGRAPH-2F9A9 → CJK UNIFIED IDEOGRAPH-84F3     # 
+
+F9C2 ; 84FC ;  SL      # ( 蓼 → 蓼 ) CJK COMPATIBILITY IDEOGRAPH-F9C2 → CJK UNIFIED IDEOGRAPH-84FC       # 
+
+2F9AA ;        8516 ;  SL      # ( 蔖 → 蔖 ) CJK COMPATIBILITY IDEOGRAPH-2F9AA → CJK UNIFIED IDEOGRAPH-8516     # 
+
+2F9AC ;        8564 ;  SL      # ( 蕤 → 蕤 ) CJK COMPATIBILITY IDEOGRAPH-2F9AC → CJK UNIFIED IDEOGRAPH-8564     # 
+
+F923 ; 85CD ;  SL      # ( 藍 → 藍 ) CJK COMPATIBILITY IDEOGRAPH-F923 → CJK UNIFIED IDEOGRAPH-85CD       # 
+
+F9F0 ; 85FA ;  SL      # ( 藺 → 藺 ) CJK COMPATIBILITY IDEOGRAPH-F9F0 → CJK UNIFIED IDEOGRAPH-85FA       # 
+
+F935 ; 8606 ;  SL      # ( 蘆 → 蘆 ) CJK COMPATIBILITY IDEOGRAPH-F935 → CJK UNIFIED IDEOGRAPH-8606       # 
+
+FA20 ; 8612 ;  SL      # ( 蘒 → 蘒 ) CJK COMPATIBILITY IDEOGRAPH-FA20 → CJK UNIFIED IDEOGRAPH-8612       # 
+
+F91F ; 862D ;  SL      # ( 蘭 → 蘭 ) CJK COMPATIBILITY IDEOGRAPH-F91F → CJK UNIFIED IDEOGRAPH-862D       # 
+
+8641 ; 8637 ;  SL      # ( 虁 → 蘷 ) CJK UNIFIED IDEOGRAPH-8641 → CJK UNIFIED IDEOGRAPH-8637     # 
+
+F910 ; 863F ;  SL      # ( 蘿 → 蘿 ) CJK COMPATIBILITY IDEOGRAPH-F910 → CJK UNIFIED IDEOGRAPH-863F       # 
+
+2F8C ; 864D ;  SL      #* ( ⾌ → 虍 ) KANGXI RADICAL TIGER → CJK UNIFIED IDEOGRAPH-864D  # 
+
+2EC1 ; 864E ;  SL      #* ( ⻁ → 虎 ) CJK RADICAL TIGER → CJK UNIFIED IDEOGRAPH-864E     # 
+
+2F9B3 ;        8650 ;  SL      # ( 虐 → 虐 ) CJK COMPATIBILITY IDEOGRAPH-2F9B3 → CJK UNIFIED IDEOGRAPH-8650     # 
+
+F936 ; 865C ;  SL      # ( 虜 → 虜 ) CJK COMPATIBILITY IDEOGRAPH-F936 → CJK UNIFIED IDEOGRAPH-865C       # 
+2F9B4 ;        865C ;  SL      # ( 虜 → 虜 ) CJK COMPATIBILITY IDEOGRAPH-2F9B4 → CJK UNIFIED IDEOGRAPH-865C     # 
+
+2F9B5 ;        8667 ;  SL      # ( 虧 → 虧 ) CJK COMPATIBILITY IDEOGRAPH-2F9B5 → CJK UNIFIED IDEOGRAPH-8667     # 
+
+2F9B6 ;        8669 ;  SL      # ( 虩 → 虩 ) CJK COMPATIBILITY IDEOGRAPH-2F9B6 → CJK UNIFIED IDEOGRAPH-8669     # 
+
+2F8D ; 866B ;  SL      #* ( ⾍ → 虫 ) KANGXI RADICAL INSECT → CJK UNIFIED IDEOGRAPH-866B # 
+
+2F9B8 ;        8688 ;  SL      # ( 蚈 → 蚈 ) CJK COMPATIBILITY IDEOGRAPH-2F9B8 → CJK UNIFIED IDEOGRAPH-8688     # 
+
+2F9B7 ;        86A9 ;  SL      # ( 蚩 → 蚩 ) CJK COMPATIBILITY IDEOGRAPH-2F9B7 → CJK UNIFIED IDEOGRAPH-86A9     # 
+
+2F9BA ;        86E2 ;  SL      # ( 蛢 → 蛢 ) CJK COMPATIBILITY IDEOGRAPH-2F9BA → CJK UNIFIED IDEOGRAPH-86E2     # 
+
+2F9B9 ;        870E ;  SL      # ( 蜎 → 蜎 ) CJK COMPATIBILITY IDEOGRAPH-2F9B9 → CJK UNIFIED IDEOGRAPH-870E     # 
+
+2F9BC ;        8728 ;  SL      # ( 蜨 → 蜨 ) CJK COMPATIBILITY IDEOGRAPH-2F9BC → CJK UNIFIED IDEOGRAPH-8728     # 
+
+2F9BD ;        876B ;  SL      # ( 蝫 → 蝫 ) CJK COMPATIBILITY IDEOGRAPH-2F9BD → CJK UNIFIED IDEOGRAPH-876B     # 
+
+FAB5 ; 8779 ;  SL      # ( 蝹 → 蝹 ) CJK COMPATIBILITY IDEOGRAPH-FAB5 → CJK UNIFIED IDEOGRAPH-8779       # 
+2F9BB ;        8779 ;  SL      # ( 蝹 → 蝹 ) CJK COMPATIBILITY IDEOGRAPH-2F9BB → CJK UNIFIED IDEOGRAPH-8779     # 
+
+2F9BE ;        8786 ;  SL      # ( 螆 → 螆 ) CJK COMPATIBILITY IDEOGRAPH-2F9BE → CJK UNIFIED IDEOGRAPH-8786     # 
+
+F911 ; 87BA ;  SL      # ( 螺 → 螺 ) CJK COMPATIBILITY IDEOGRAPH-F911 → CJK UNIFIED IDEOGRAPH-87BA       # 
+
+2F9C0 ;        87E1 ;  SL      # ( 蟡 → 蟡 ) CJK COMPATIBILITY IDEOGRAPH-2F9C0 → CJK UNIFIED IDEOGRAPH-87E1     # 
+
+2F9C1 ;        8801 ;  SL      # ( 蠁 → 蠁 ) CJK COMPATIBILITY IDEOGRAPH-2F9C1 → CJK UNIFIED IDEOGRAPH-8801     # 
+
+F927 ; 881F ;  SL      # ( 蠟 → 蠟 ) CJK COMPATIBILITY IDEOGRAPH-F927 → CJK UNIFIED IDEOGRAPH-881F       # 
+
+2F8E ; 8840 ;  SL      #* ( ⾎ → 血 ) KANGXI RADICAL BLOOD → CJK UNIFIED IDEOGRAPH-8840  # 
+
+FA08 ; 884C ;  SL      # ( 行 → 行 ) CJK COMPATIBILITY IDEOGRAPH-FA08 → CJK UNIFIED IDEOGRAPH-884C       # 
+2F8F ; 884C ;  SL      #* ( ⾏ → 行 ) KANGXI RADICAL WALK ENCLOSURE → CJK UNIFIED IDEOGRAPH-884C # 
+
+2F9C3 ;        8860 ;  SL      # ( 衠 → 衠 ) CJK COMPATIBILITY IDEOGRAPH-2F9C3 → CJK UNIFIED IDEOGRAPH-8860     # 
+
+2F9C4 ;        8863 ;  SL      # ( 衣 → 衣 ) CJK COMPATIBILITY IDEOGRAPH-2F9C4 → CJK UNIFIED IDEOGRAPH-8863     # 
+2F90 ; 8863 ;  SL      #* ( ⾐ → 衣 ) KANGXI RADICAL CLOTHES → CJK UNIFIED IDEOGRAPH-8863        # 
+
+2EC2 ; 8864 ;  SL      #* ( ⻂ → 衤 ) CJK RADICAL CLOTHES → CJK UNIFIED IDEOGRAPH-8864   # 
+
+F9A0 ; 88C2 ;  SL      # ( 裂 → 裂 ) CJK COMPATIBILITY IDEOGRAPH-F9A0 → CJK UNIFIED IDEOGRAPH-88C2       # 
+
+F9E7 ; 88CF ;  SL      # ( 裏 → 裏 ) CJK COMPATIBILITY IDEOGRAPH-F9E7 → CJK UNIFIED IDEOGRAPH-88CF       # 
+
+2F9C6 ;        88D7 ;  SL      # ( 裗 → 裗 ) CJK COMPATIBILITY IDEOGRAPH-2F9C6 → CJK UNIFIED IDEOGRAPH-88D7     # 
+
+2F9C7 ;        88DE ;  SL      # ( 裞 → 裞 ) CJK COMPATIBILITY IDEOGRAPH-2F9C7 → CJK UNIFIED IDEOGRAPH-88DE     # 
+
+F9E8 ; 88E1 ;  SL      # ( 裡 → 裡 ) CJK COMPATIBILITY IDEOGRAPH-F9E8 → CJK UNIFIED IDEOGRAPH-88E1       # 
+
+F912 ; 88F8 ;  SL      # ( 裸 → 裸 ) CJK COMPATIBILITY IDEOGRAPH-F912 → CJK UNIFIED IDEOGRAPH-88F8       # 
+
+2F9C9 ;        88FA ;  SL      # ( 裺 → 裺 ) CJK COMPATIBILITY IDEOGRAPH-2F9C9 → CJK UNIFIED IDEOGRAPH-88FA     # 
+
+FA60 ; 8910 ;  SL      # ( 褐 → 褐 ) CJK COMPATIBILITY IDEOGRAPH-FA60 → CJK UNIFIED IDEOGRAPH-8910       # 
+
+FAB6 ; 8941 ;  SL      # ( 襁 → 襁 ) CJK COMPATIBILITY IDEOGRAPH-FAB6 → CJK UNIFIED IDEOGRAPH-8941       # 
+
+F924 ; 8964 ;  SL      # ( 襤 → 襤 ) CJK COMPATIBILITY IDEOGRAPH-F924 → CJK UNIFIED IDEOGRAPH-8964       # 
+
+2F91 ; 897E ;  SL      #* ( ⾑ → 襾 ) KANGXI RADICAL WEST → CJK UNIFIED IDEOGRAPH-897E   # 
+
+2EC4 ; 897F ;  SL      #* ( ⻄ → 西 ) CJK RADICAL WEST TWO → CJK UNIFIED IDEOGRAPH-897F  # 
+
+2EC3 ; 8980 ;  SL      #* ( ⻃ → 覀 ) CJK RADICAL WEST ONE → CJK UNIFIED IDEOGRAPH-8980  # 
+
+FAB7 ; 8986 ;  SL      # ( 覆 → 覆 ) CJK COMPATIBILITY IDEOGRAPH-FAB7 → CJK UNIFIED IDEOGRAPH-8986       # 
+
+FA0A ; 898B ;  SL      # ( 見 → 見 ) CJK COMPATIBILITY IDEOGRAPH-FA0A → CJK UNIFIED IDEOGRAPH-898B       # 
+2F92 ; 898B ;  SL      #* ( ⾒ → 見 ) KANGXI RADICAL SEE → CJK UNIFIED IDEOGRAPH-898B    # 
+
+FA61 ; 8996 ;  SL      # ( 視 → 視 ) CJK COMPATIBILITY IDEOGRAPH-FA61 → CJK UNIFIED IDEOGRAPH-8996       # 
+FAB8 ; 8996 ;  SL      # ( 視 → 視 ) CJK COMPATIBILITY IDEOGRAPH-FAB8 → CJK UNIFIED IDEOGRAPH-8996       # 
+
+2EC5 ; 89C1 ;  SL      #* ( ⻅ → 见 ) CJK RADICAL C-SIMPLIFIED SEE → CJK UNIFIED IDEOGRAPH-89C1  # 
+
+2F93 ; 89D2 ;  SL      #* ( ⾓ → 角 ) KANGXI RADICAL HORN → CJK UNIFIED IDEOGRAPH-89D2   # 
+
+2F94 ; 8A00 ;  SL      #* ( ⾔ → 言 ) KANGXI RADICAL SPEECH → CJK UNIFIED IDEOGRAPH-8A00 # 
+
+8A7D ; 8A2E ;  SL      # ( 詽 → 訮 ) CJK UNIFIED IDEOGRAPH-8A7D → CJK UNIFIED IDEOGRAPH-8A2E     # 
+
+2F9CF ;        8AA0 ;  SL      # ( 誠 → 誠 ) CJK COMPATIBILITY IDEOGRAPH-2F9CF → CJK UNIFIED IDEOGRAPH-8AA0     # 
+
+F96F ; 8AAA ;  SL      # ( 說 → 說 ) CJK COMPATIBILITY IDEOGRAPH-F96F → CJK UNIFIED IDEOGRAPH-8AAA       # 
+F9A1 ; 8AAA ;  SL      # ( 說 → 說 ) CJK COMPATIBILITY IDEOGRAPH-F9A1 → CJK UNIFIED IDEOGRAPH-8AAA       # 
+
+FAB9 ; 8ABF ;  SL      # ( 調 → 調 ) CJK COMPATIBILITY IDEOGRAPH-FAB9 → CJK UNIFIED IDEOGRAPH-8ABF       # 
+
+FABB ; 8ACB ;  SL      # ( 請 → 請 ) CJK COMPATIBILITY IDEOGRAPH-FABB → CJK UNIFIED IDEOGRAPH-8ACB       # 
+
+F97D ; 8AD2 ;  SL      # ( 諒 → 諒 ) CJK COMPATIBILITY IDEOGRAPH-F97D → CJK UNIFIED IDEOGRAPH-8AD2       # 
+
+F941 ; 8AD6 ;  SL      # ( 論 → 論 ) CJK COMPATIBILITY IDEOGRAPH-F941 → CJK UNIFIED IDEOGRAPH-8AD6       # 
+
+FABE ; 8AED ;  SL      # ( 諭 → 諭 ) CJK COMPATIBILITY IDEOGRAPH-FABE → CJK UNIFIED IDEOGRAPH-8AED       # 
+2F9D0 ;        8AED ;  SL      # ( 諭 → 諭 ) CJK COMPATIBILITY IDEOGRAPH-2F9D0 → CJK UNIFIED IDEOGRAPH-8AED     # 
+
+FA22 ; 8AF8 ;  SL      # ( 諸 → 諸 ) CJK COMPATIBILITY IDEOGRAPH-FA22 → CJK UNIFIED IDEOGRAPH-8AF8       # 
+FABA ; 8AF8 ;  SL      # ( 諸 → 諸 ) CJK COMPATIBILITY IDEOGRAPH-FABA → CJK UNIFIED IDEOGRAPH-8AF8       # 
+
+F95D ; 8AFE ;  SL      # ( 諾 → 諾 ) CJK COMPATIBILITY IDEOGRAPH-F95D → CJK UNIFIED IDEOGRAPH-8AFE       # 
+FABD ; 8AFE ;  SL      # ( 諾 → 諾 ) CJK COMPATIBILITY IDEOGRAPH-FABD → CJK UNIFIED IDEOGRAPH-8AFE       # 
+
+FA62 ; 8B01 ;  SL      # ( 謁 → 謁 ) CJK COMPATIBILITY IDEOGRAPH-FA62 → CJK UNIFIED IDEOGRAPH-8B01       # 
+FABC ; 8B01 ;  SL      # ( 謁 → 謁 ) CJK COMPATIBILITY IDEOGRAPH-FABC → CJK UNIFIED IDEOGRAPH-8B01       # 
+
+FA63 ; 8B39 ;  SL      # ( 謹 → 謹 ) CJK COMPATIBILITY IDEOGRAPH-FA63 → CJK UNIFIED IDEOGRAPH-8B39       # 
+FABF ; 8B39 ;  SL      # ( 謹 → 謹 ) CJK COMPATIBILITY IDEOGRAPH-FABF → CJK UNIFIED IDEOGRAPH-8B39       # 
+
+F9FC ; 8B58 ;  SL      # ( 識 → 識 ) CJK COMPATIBILITY IDEOGRAPH-F9FC → CJK UNIFIED IDEOGRAPH-8B58       # 
+
+F95A ; 8B80 ;  SL      # ( 讀 → 讀 ) CJK COMPATIBILITY IDEOGRAPH-F95A → CJK UNIFIED IDEOGRAPH-8B80       # 
+
+8B8F ; 8B86 ;  SL      # ( 讏 → 讆 ) CJK UNIFIED IDEOGRAPH-8B8F → CJK UNIFIED IDEOGRAPH-8B86     # 
+
+FAC0 ; 8B8A ;  SL      # ( 變 → 變 ) CJK COMPATIBILITY IDEOGRAPH-FAC0 → CJK UNIFIED IDEOGRAPH-8B8A       # 
+2F9D1 ;        8B8A ;  SL      # ( 變 → 變 ) CJK COMPATIBILITY IDEOGRAPH-2F9D1 → CJK UNIFIED IDEOGRAPH-8B8A     # 
+
+2EC8 ; 8BA0 ;  SL      #* ( ⻈ → 讠 ) CJK RADICAL C-SIMPLIFIED SPEECH → CJK UNIFIED IDEOGRAPH-8BA0       # 
+
+2F95 ; 8C37 ;  SL      #* ( ⾕ → 谷 ) KANGXI RADICAL VALLEY → CJK UNIFIED IDEOGRAPH-8C37 # 
+
+2F96 ; 8C46 ;  SL      #* ( ⾖ → 豆 ) KANGXI RADICAL BEAN → CJK UNIFIED IDEOGRAPH-8C46   # 
+
+F900 ; 8C48 ;  SL      # ( 豈 → 豈 ) CJK COMPATIBILITY IDEOGRAPH-F900 → CJK UNIFIED IDEOGRAPH-8C48       # 
+
+2F9D2 ;        8C55 ;  SL      # ( 豕 → 豕 ) CJK COMPATIBILITY IDEOGRAPH-2F9D2 → CJK UNIFIED IDEOGRAPH-8C55     # 
+2F97 ; 8C55 ;  SL      #* ( ⾗ → 豕 ) KANGXI RADICAL PIG → CJK UNIFIED IDEOGRAPH-8C55    # 
+
+8C63 ; 8C5C ;  SL      # ( 豣 → 豜 ) CJK UNIFIED IDEOGRAPH-8C63 → CJK UNIFIED IDEOGRAPH-8C5C     # 
+
+2F98 ; 8C78 ;  SL      #* ( ⾘ → 豸 ) KANGXI RADICAL BADGER → CJK UNIFIED IDEOGRAPH-8C78 # 
+
+2F99 ; 8C9D ;  SL      #* ( ⾙ → 貝 ) KANGXI RADICAL SHELL → CJK UNIFIED IDEOGRAPH-8C9D  # 
+
+2F9D4 ;        8CAB ;  SL      # ( 貫 → 貫 ) CJK COMPATIBILITY IDEOGRAPH-2F9D4 → CJK UNIFIED IDEOGRAPH-8CAB     # 
+
+2F9D5 ;        8CC1 ;  SL      # ( 賁 → 賁 ) CJK COMPATIBILITY IDEOGRAPH-2F9D5 → CJK UNIFIED IDEOGRAPH-8CC1     # 
+
+F948 ; 8CC2 ;  SL      # ( 賂 → 賂 ) CJK COMPATIBILITY IDEOGRAPH-F948 → CJK UNIFIED IDEOGRAPH-8CC2       # 
+
+F903 ; 8CC8 ;  SL      # ( 賈 → 賈 ) CJK COMPATIBILITY IDEOGRAPH-F903 → CJK UNIFIED IDEOGRAPH-8CC8       # 
+
+FA64 ; 8CD3 ;  SL      # ( 賓 → 賓 ) CJK COMPATIBILITY IDEOGRAPH-FA64 → CJK UNIFIED IDEOGRAPH-8CD3       # 
+
+FA65 ; 8D08 ;  SL      # ( 贈 → 贈 ) CJK COMPATIBILITY IDEOGRAPH-FA65 → CJK UNIFIED IDEOGRAPH-8D08       # 
+FAC1 ; 8D08 ;  SL      # ( 贈 → 贈 ) CJK COMPATIBILITY IDEOGRAPH-FAC1 → CJK UNIFIED IDEOGRAPH-8D08       # 
+
+2F9D6 ;        8D1B ;  SL      # ( 贛 → 贛 ) CJK COMPATIBILITY IDEOGRAPH-2F9D6 → CJK UNIFIED IDEOGRAPH-8D1B     # 
+
+2EC9 ; 8D1D ;  SL      #* ( ⻉ → 贝 ) CJK RADICAL C-SIMPLIFIED SHELL → CJK UNIFIED IDEOGRAPH-8D1D        # 
+
+2F9A ; 8D64 ;  SL      #* ( ⾚ → 赤 ) KANGXI RADICAL RED → CJK UNIFIED IDEOGRAPH-8D64    # 
+
+2F9B ; 8D70 ;  SL      #* ( ⾛ → 走 ) KANGXI RADICAL RUN → CJK UNIFIED IDEOGRAPH-8D70    # 
+
+2F9D7 ;        8D77 ;  SL      # ( 起 → 起 ) CJK COMPATIBILITY IDEOGRAPH-2F9D7 → CJK UNIFIED IDEOGRAPH-8D77     # 
+
+8D86 ; 8D7F ;  SL      # ( 趆 → 赿 ) CJK UNIFIED IDEOGRAPH-8D86 → CJK UNIFIED IDEOGRAPH-8D7F     # 
+
+2F9C ; 8DB3 ;  SL      #* ( ⾜ → 足 ) KANGXI RADICAL FOOT → CJK UNIFIED IDEOGRAPH-8DB3   # 
+
+2F9DB ;        8DBC ;  SL      # ( 趼 → 趼 ) CJK COMPATIBILITY IDEOGRAPH-2F9DB → CJK UNIFIED IDEOGRAPH-8DBC     # 
+
+2F9DA ;        8DCB ;  SL      # ( 跋 → 跋 ) CJK COMPATIBILITY IDEOGRAPH-2F9DA → CJK UNIFIED IDEOGRAPH-8DCB     # 
+
+8DFA ; 8DE5 ;  SL      # ( 跺 → 跥 ) CJK UNIFIED IDEOGRAPH-8DFA → CJK UNIFIED IDEOGRAPH-8DE5     # 
+
+F937 ; 8DEF ;  SL      # ( 路 → 路 ) CJK COMPATIBILITY IDEOGRAPH-F937 → CJK UNIFIED IDEOGRAPH-8DEF       # 
+
+2F9DC ;        8DF0 ;  SL      # ( 跰 → 跰 ) CJK COMPATIBILITY IDEOGRAPH-2F9DC → CJK UNIFIED IDEOGRAPH-8DF0     # 
+
+8E9B ; 8E97 ;  SL      # ( 躛 → 躗 ) CJK UNIFIED IDEOGRAPH-8E9B → CJK UNIFIED IDEOGRAPH-8E97     # 
+
+2F9D ; 8EAB ;  SL      #* ( ⾝ → 身 ) KANGXI RADICAL BODY → CJK UNIFIED IDEOGRAPH-8EAB   # 
+
+F902 ; 8ECA ;  SL      # ( 車 → 車 ) CJK COMPATIBILITY IDEOGRAPH-F902 → CJK UNIFIED IDEOGRAPH-8ECA       # 
+2F9E ; 8ECA ;  SL      #* ( ⾞ → 車 ) KANGXI RADICAL CART → CJK UNIFIED IDEOGRAPH-8ECA   # 
+
+2F9DE ;        8ED4 ;  SL      # ( 軔 → 軔 ) CJK COMPATIBILITY IDEOGRAPH-2F9DE → CJK UNIFIED IDEOGRAPH-8ED4     # 
+
+8F27 ; 8EFF ;  SL      # ( 輧 → 軿 ) CJK UNIFIED IDEOGRAPH-8F27 → CJK UNIFIED IDEOGRAPH-8EFF     # 
+
+F998 ; 8F26 ;  SL      # ( 輦 → 輦 ) CJK COMPATIBILITY IDEOGRAPH-F998 → CJK UNIFIED IDEOGRAPH-8F26       # 
+
+F9D7 ; 8F2A ;  SL      # ( 輪 → 輪 ) CJK COMPATIBILITY IDEOGRAPH-F9D7 → CJK UNIFIED IDEOGRAPH-8F2A       # 
+
+FAC2 ; 8F38 ;  SL      # ( 輸 → 輸 ) CJK COMPATIBILITY IDEOGRAPH-FAC2 → CJK UNIFIED IDEOGRAPH-8F38       # 
+2F9DF ;        8F38 ;  SL      # ( 輸 → 輸 ) CJK COMPATIBILITY IDEOGRAPH-2F9DF → CJK UNIFIED IDEOGRAPH-8F38     # 
+
+FA07 ; 8F3B ;  SL      # ( 輻 → 輻 ) CJK COMPATIBILITY IDEOGRAPH-FA07 → CJK UNIFIED IDEOGRAPH-8F3B       # 
+
+F98D ; 8F62 ;  SL      # ( 轢 → 轢 ) CJK COMPATIBILITY IDEOGRAPH-F98D → CJK UNIFIED IDEOGRAPH-8F62       # 
+
+2ECB ; 8F66 ;  SL      #* ( ⻋ → 车 ) CJK RADICAL C-SIMPLIFIED CART → CJK UNIFIED IDEOGRAPH-8F66 # 
+
+2F9F ; 8F9B ;  SL      #* ( ⾟ → 辛 ) KANGXI RADICAL BITTER → CJK UNIFIED IDEOGRAPH-8F9B # 
+
+2F98D ;        8F9E ;  SL      # ( 辞 → 辞 ) CJK COMPATIBILITY IDEOGRAPH-2F98D → CJK UNIFIED IDEOGRAPH-8F9E     # 
+
+F971 ; 8FB0 ;  SL      # ( 辰 → 辰 ) CJK COMPATIBILITY IDEOGRAPH-F971 → CJK UNIFIED IDEOGRAPH-8FB0       # 
+2FA0 ; 8FB0 ;  SL      #* ( ⾠ → 辰 ) KANGXI RADICAL MORNING → CJK UNIFIED IDEOGRAPH-8FB0        # 
+
+2FA1 ; 8FB5 ;  SL      #* ( ⾡ → 辵 ) KANGXI RADICAL WALK → CJK UNIFIED IDEOGRAPH-8FB5   # 
+
+FA66 ; 8FB6 ;  SL      # ( 辶 → 辶 ) CJK COMPATIBILITY IDEOGRAPH-FA66 → CJK UNIFIED IDEOGRAPH-8FB6       # 
+2ECC ; 8FB6 ;  SL      #* ( ⻌ → 辶 ) CJK RADICAL SIMPLIFIED WALK → CJK UNIFIED IDEOGRAPH-8FB6   # 
+2ECD ; 8FB6 ;  SL      #* ( ⻍ → 辶 ) CJK RADICAL WALK ONE → CJK UNIFIED IDEOGRAPH-8FB6  # 
+
+F99A ; 9023 ;  SL      # ( 連 → 連 ) CJK COMPATIBILITY IDEOGRAPH-F99A → CJK UNIFIED IDEOGRAPH-9023       # 
+
+FA25 ; 9038 ;  SL      # ( 逸 → 逸 ) CJK COMPATIBILITY IDEOGRAPH-FA25 → CJK UNIFIED IDEOGRAPH-9038       # 
+FA67 ; 9038 ;  SL      # ( 逸 → 逸 ) CJK COMPATIBILITY IDEOGRAPH-FA67 → CJK UNIFIED IDEOGRAPH-9038       # 
+
+FAC3 ; 9072 ;  SL      # ( 遲 → 遲 ) CJK COMPATIBILITY IDEOGRAPH-FAC3 → CJK UNIFIED IDEOGRAPH-9072       # 
+
+F9C3 ; 907C ;  SL      # ( 遼 → 遼 ) CJK COMPATIBILITY IDEOGRAPH-F9C3 → CJK UNIFIED IDEOGRAPH-907C       # 
+
+F913 ; 908F ;  SL      # ( 邏 → 邏 ) CJK COMPATIBILITY IDEOGRAPH-F913 → CJK UNIFIED IDEOGRAPH-908F       # 
+
+2FA2 ; 9091 ;  SL      #* ( ⾢ → 邑 ) KANGXI RADICAL CITY → CJK UNIFIED IDEOGRAPH-9091   # 
+
+2F9E2 ;        9094 ;  SL      # ( 邔 → 邔 ) CJK COMPATIBILITY IDEOGRAPH-2F9E2 → CJK UNIFIED IDEOGRAPH-9094     # 
+
+F92C ; 90CE ;  SL      # ( 郎 → 郎 ) CJK COMPATIBILITY IDEOGRAPH-F92C → CJK UNIFIED IDEOGRAPH-90CE       # 
+90DE ; 90CE ;  SL      # ( 郞 → 郎 ) CJK UNIFIED IDEOGRAPH-90DE → CJK UNIFIED IDEOGRAPH-90CE     # →郎→
+
+2F9E3 ;        90F1 ;  SL      # ( 郱 → 郱 ) CJK COMPATIBILITY IDEOGRAPH-2F9E3 → CJK UNIFIED IDEOGRAPH-90F1     # 
+
+FA26 ; 90FD ;  SL      # ( 都 → 都 ) CJK COMPATIBILITY IDEOGRAPH-FA26 → CJK UNIFIED IDEOGRAPH-90FD       # 
+
+2F9E4 ;        9111 ;  SL      # ( 鄑 → 鄑 ) CJK COMPATIBILITY IDEOGRAPH-2F9E4 → CJK UNIFIED IDEOGRAPH-9111     # 
+
+2F9E6 ;        911B ;  SL      # ( 鄛 → 鄛 ) CJK COMPATIBILITY IDEOGRAPH-2F9E6 → CJK UNIFIED IDEOGRAPH-911B     # 
+
+2FA3 ; 9149 ;  SL      #* ( ⾣ → 酉 ) KANGXI RADICAL WINE → CJK UNIFIED IDEOGRAPH-9149   # 
+
+F919 ; 916A ;  SL      # ( 酪 → 酪 ) CJK COMPATIBILITY IDEOGRAPH-F919 → CJK UNIFIED IDEOGRAPH-916A       # 
+
+FAC4 ; 9199 ;  SL      # ( 醙 → 醙 ) CJK COMPATIBILITY IDEOGRAPH-FAC4 → CJK UNIFIED IDEOGRAPH-9199       # 
+
+F9B7 ; 91B4 ;  SL      # ( 醴 → 醴 ) CJK COMPATIBILITY IDEOGRAPH-F9B7 → CJK UNIFIED IDEOGRAPH-91B4       # 
+
+2FA4 ; 91C6 ;  SL      #* ( ⾤ → 釆 ) KANGXI RADICAL DISTINGUISH → CJK UNIFIED IDEOGRAPH-91C6    # 
+
+F9E9 ; 91CC ;  SL      # ( 里 → 里 ) CJK COMPATIBILITY IDEOGRAPH-F9E9 → CJK UNIFIED IDEOGRAPH-91CC       # 
+2FA5 ; 91CC ;  SL      #* ( ⾥ → 里 ) KANGXI RADICAL VILLAGE → CJK UNIFIED IDEOGRAPH-91CC        # 
+
+F97E ; 91CF ;  SL      # ( 量 → 量 ) CJK COMPATIBILITY IDEOGRAPH-F97E → CJK UNIFIED IDEOGRAPH-91CF       # 
+
+F90A ; 91D1 ;  SL      # ( 金 → 金 ) CJK COMPATIBILITY IDEOGRAPH-F90A → CJK UNIFIED IDEOGRAPH-91D1       # 
+2FA6 ; 91D1 ;  SL      #* ( ⾦ → 金 ) KANGXI RADICAL GOLD → CJK UNIFIED IDEOGRAPH-91D1   # 
+
+F9B1 ; 9234 ;  SL      # ( 鈴 → 鈴 ) CJK COMPATIBILITY IDEOGRAPH-F9B1 → CJK UNIFIED IDEOGRAPH-9234       # 
+
+2F9E7 ;        9238 ;  SL      # ( 鈸 → 鈸 ) CJK COMPATIBILITY IDEOGRAPH-2F9E7 → CJK UNIFIED IDEOGRAPH-9238     # 
+
+FAC5 ; 9276 ;  SL      # ( 鉶 → 鉶 ) CJK COMPATIBILITY IDEOGRAPH-FAC5 → CJK UNIFIED IDEOGRAPH-9276       # 
+
+2F9EA ;        927C ;  SL      # ( 鉼 → 鉼 ) CJK COMPATIBILITY IDEOGRAPH-2F9EA → CJK UNIFIED IDEOGRAPH-927C     # 
+
+2F9E8 ;        92D7 ;  SL      # ( 鋗 → 鋗 ) CJK COMPATIBILITY IDEOGRAPH-2F9E8 → CJK UNIFIED IDEOGRAPH-92D7     # 
+
+2F9E9 ;        92D8 ;  SL      # ( 鋘 → 鋘 ) CJK COMPATIBILITY IDEOGRAPH-2F9E9 → CJK UNIFIED IDEOGRAPH-92D8     # 
+
+F93F ; 9304 ;  SL      # ( 錄 → 錄 ) CJK COMPATIBILITY IDEOGRAPH-F93F → CJK UNIFIED IDEOGRAPH-9304       # 
+
+F99B ; 934A ;  SL      # ( 鍊 → 鍊 ) CJK COMPATIBILITY IDEOGRAPH-F99B → CJK UNIFIED IDEOGRAPH-934A       # 
+
+93AE ; 93AD ;  SL      # ( 鎮 → 鎭 ) CJK UNIFIED IDEOGRAPH-93AE → CJK UNIFIED IDEOGRAPH-93AD     # 
+
+2F9EB ;        93F9 ;  SL      # ( 鏹 → 鏹 ) CJK COMPATIBILITY IDEOGRAPH-2F9EB → CJK UNIFIED IDEOGRAPH-93F9     # 
+
+2F9EC ;        9415 ;  SL      # ( 鐕 → 鐕 ) CJK COMPATIBILITY IDEOGRAPH-2F9EC → CJK UNIFIED IDEOGRAPH-9415     # 
+
+2ED0 ; 9485 ;  SL      #* ( ⻐ → 钅 ) CJK RADICAL C-SIMPLIFIED GOLD → CJK UNIFIED IDEOGRAPH-9485 # 
+
+2ED1 ; 9577 ;  SL      #* ( ⻑ → 長 ) CJK RADICAL LONG ONE → CJK UNIFIED IDEOGRAPH-9577  # 
+2FA7 ; 9577 ;  SL      #* ( ⾧ → 長 ) KANGXI RADICAL LONG → CJK UNIFIED IDEOGRAPH-9577   # 
+
+2ED2 ; 9578 ;  SL      #* ( ⻒ → 镸 ) CJK RADICAL LONG TWO → CJK UNIFIED IDEOGRAPH-9578  # 
+
+2ED3 ; 957F ;  SL      #* ( ⻓ → 长 ) CJK RADICAL C-SIMPLIFIED LONG → CJK UNIFIED IDEOGRAPH-957F # 
+
+2FA8 ; 9580 ;  SL      #* ( ⾨ → 門 ) KANGXI RADICAL GATE → CJK UNIFIED IDEOGRAPH-9580   # 
+
+2F9EE ;        958B ;  SL      # ( 開 → 開 ) CJK COMPATIBILITY IDEOGRAPH-2F9EE → CJK UNIFIED IDEOGRAPH-958B     # 
+
+F986 ; 95AD ;  SL      # ( 閭 → 閭 ) CJK COMPATIBILITY IDEOGRAPH-F986 → CJK UNIFIED IDEOGRAPH-95AD       # 
+
+2F9F0 ;        95B7 ;  SL      # ( 閷 → 閷 ) CJK COMPATIBILITY IDEOGRAPH-2F9F0 → CJK UNIFIED IDEOGRAPH-95B7     # 
+
+2ED4 ; 95E8 ;  SL      #* ( ⻔ → 门 ) CJK RADICAL C-SIMPLIFIED GATE → CJK UNIFIED IDEOGRAPH-95E8 # 
+
+2FA9 ; 961C ;  SL      #* ( ⾩ → 阜 ) KANGXI RADICAL MOUND → CJK UNIFIED IDEOGRAPH-961C  # 
+
+2ECF ; 961D ;  SL      #* ( ⻏ → 阝 ) CJK RADICAL CITY → CJK UNIFIED IDEOGRAPH-961D      # 
+2ED6 ; 961D ;  SL      #* ( ⻖ → 阝 ) CJK RADICAL MOUND TWO → CJK UNIFIED IDEOGRAPH-961D # 
+
+F9C6 ; 962E ;  SL      # ( 阮 → 阮 ) CJK COMPATIBILITY IDEOGRAPH-F9C6 → CJK UNIFIED IDEOGRAPH-962E       # 
+
+F951 ; 964B ;  SL      # ( 陋 → 陋 ) CJK COMPATIBILITY IDEOGRAPH-F951 → CJK UNIFIED IDEOGRAPH-964B       # 
+
+FA09 ; 964D ;  SL      # ( 降 → 降 ) CJK COMPATIBILITY IDEOGRAPH-FA09 → CJK UNIFIED IDEOGRAPH-964D       # 
+
+F959 ; 9675 ;  SL      # ( 陵 → 陵 ) CJK COMPATIBILITY IDEOGRAPH-F959 → CJK UNIFIED IDEOGRAPH-9675       # 
+
+F9D3 ; 9678 ;  SL      # ( 陸 → 陸 ) CJK COMPATIBILITY IDEOGRAPH-F9D3 → CJK UNIFIED IDEOGRAPH-9678       # 
+
+FAC6 ; 967C ;  SL      # ( 陼 → 陼 ) CJK COMPATIBILITY IDEOGRAPH-FAC6 → CJK UNIFIED IDEOGRAPH-967C       # 
+
+F9DC ; 9686 ;  SL      # ( 隆 → 隆 ) CJK COMPATIBILITY IDEOGRAPH-F9DC → CJK UNIFIED IDEOGRAPH-9686       # 
+
+F9F1 ; 96A3 ;  SL      # ( 隣 → 隣 ) CJK COMPATIBILITY IDEOGRAPH-F9F1 → CJK UNIFIED IDEOGRAPH-96A3       # 
+
+2FAA ; 96B6 ;  SL      #* ( ⾪ → 隶 ) KANGXI RADICAL SLAVE → CJK UNIFIED IDEOGRAPH-96B6  # 
+
+96B8 ; 96B7 ;  SL      # ( 隸 → 隷 ) CJK UNIFIED IDEOGRAPH-96B8 → CJK UNIFIED IDEOGRAPH-96B7     # →隸→
+F9B8 ; 96B7 ;  SL      # ( 隸 → 隷 ) CJK COMPATIBILITY IDEOGRAPH-F9B8 → CJK UNIFIED IDEOGRAPH-96B7       # 
+
+2FAB ; 96B9 ;  SL      #* ( ⾫ → 隹 ) KANGXI RADICAL SHORT TAILED BIRD → CJK UNIFIED IDEOGRAPH-96B9      # 
+
+2F9F3 ;        96C3 ;  SL      # ( 雃 → 雃 ) CJK COMPATIBILITY IDEOGRAPH-2F9F3 → CJK UNIFIED IDEOGRAPH-96C3     # 
+
+F9EA ; 96E2 ;  SL      # ( 離 → 離 ) CJK COMPATIBILITY IDEOGRAPH-F9EA → CJK UNIFIED IDEOGRAPH-96E2       # 
+
+FA68 ; 96E3 ;  SL      # ( 難 → 難 ) CJK COMPATIBILITY IDEOGRAPH-FA68 → CJK UNIFIED IDEOGRAPH-96E3       # 
+FAC7 ; 96E3 ;  SL      # ( 難 → 難 ) CJK COMPATIBILITY IDEOGRAPH-FAC7 → CJK UNIFIED IDEOGRAPH-96E3       # 
+
+2FAC ; 96E8 ;  SL      #* ( ⾬ → 雨 ) KANGXI RADICAL RAIN → CJK UNIFIED IDEOGRAPH-96E8   # 
+
+F9B2 ; 96F6 ;  SL      # ( 零 → 零 ) CJK COMPATIBILITY IDEOGRAPH-F9B2 → CJK UNIFIED IDEOGRAPH-96F6       # 
+
+F949 ; 96F7 ;  SL      # ( 雷 → 雷 ) CJK COMPATIBILITY IDEOGRAPH-F949 → CJK UNIFIED IDEOGRAPH-96F7       # 
+
+2F9F5 ;        9723 ;  SL      # ( 霣 → 霣 ) CJK COMPATIBILITY IDEOGRAPH-2F9F5 → CJK UNIFIED IDEOGRAPH-9723     # 
+
+F938 ; 9732 ;  SL      # ( 露 → 露 ) CJK COMPATIBILITY IDEOGRAPH-F938 → CJK UNIFIED IDEOGRAPH-9732       # 
+
+F9B3 ; 9748 ;  SL      # ( 靈 → 靈 ) CJK COMPATIBILITY IDEOGRAPH-F9B3 → CJK UNIFIED IDEOGRAPH-9748       # 
+
+2FAD ; 9751 ;  SL      #* ( ⾭ → 靑 ) KANGXI RADICAL BLUE → CJK UNIFIED IDEOGRAPH-9751   # 
+
+2ED8 ; 9752 ;  SL      #* ( ⻘ → 青 ) CJK RADICAL BLUE → CJK UNIFIED IDEOGRAPH-9752      # 
+
+FA1C ; 9756 ;  SL      # ( 靖 → 靖 ) CJK COMPATIBILITY IDEOGRAPH-FA1C → CJK UNIFIED IDEOGRAPH-9756       # 
+FAC8 ; 9756 ;  SL      # ( 靖 → 靖 ) CJK COMPATIBILITY IDEOGRAPH-FAC8 → CJK UNIFIED IDEOGRAPH-9756       # 
+
+2FAE ; 975E ;  SL      #* ( ⾮ → 非 ) KANGXI RADICAL WRONG → CJK UNIFIED IDEOGRAPH-975E  # 
+
+2FAF ; 9762 ;  SL      #* ( ⾯ → 面 ) KANGXI RADICAL FACE → CJK UNIFIED IDEOGRAPH-9762   # 
+
+2FB0 ; 9769 ;  SL      #* ( ⾰ → 革 ) KANGXI RADICAL LEATHER → CJK UNIFIED IDEOGRAPH-9769        # 
+
+2FB1 ; 97CB ;  SL      #* ( ⾱ → 韋 ) KANGXI RADICAL TANNED LEATHER → CJK UNIFIED IDEOGRAPH-97CB # 
+
+FAC9 ; 97DB ;  SL      # ( 韛 → 韛 ) CJK COMPATIBILITY IDEOGRAPH-FAC9 → CJK UNIFIED IDEOGRAPH-97DB       # 
+
+2F9FA ;        97E0 ;  SL      # ( 韠 → 韠 ) CJK COMPATIBILITY IDEOGRAPH-2F9FA → CJK UNIFIED IDEOGRAPH-97E0     # 
+
+2ED9 ; 97E6 ;  SL      #* ( ⻙ → 韦 ) CJK RADICAL C-SIMPLIFIED TANNED LEATHER → CJK UNIFIED IDEOGRAPH-97E6       # 
+
+2FB2 ; 97ED ;  SL      #* ( ⾲ → 韭 ) KANGXI RADICAL LEEK → CJK UNIFIED IDEOGRAPH-97ED   # 
+
+2FB3 ; 97F3 ;  SL      #* ( ⾳ → 音 ) KANGXI RADICAL SOUND → CJK UNIFIED IDEOGRAPH-97F3  # 
+
+FA69 ; 97FF ;  SL      # ( 響 → 響 ) CJK COMPATIBILITY IDEOGRAPH-FA69 → CJK UNIFIED IDEOGRAPH-97FF       # 
+FACA ; 97FF ;  SL      # ( 響 → 響 ) CJK COMPATIBILITY IDEOGRAPH-FACA → CJK UNIFIED IDEOGRAPH-97FF       # 
+
+2FB4 ; 9801 ;  SL      #* ( ⾴ → 頁 ) KANGXI RADICAL LEAF → CJK UNIFIED IDEOGRAPH-9801   # 
+
+FACB ; 980B ;  SL      # ( 頋 → 頋 ) CJK COMPATIBILITY IDEOGRAPH-FACB → CJK UNIFIED IDEOGRAPH-980B       # 
+2F9FE ;        980B ;  SL      # ( 頋 → 頋 ) CJK COMPATIBILITY IDEOGRAPH-2F9FE → CJK UNIFIED IDEOGRAPH-980B     # 
+2F9FF ;        980B ;  SL      # ( 頋 → 頋 ) CJK COMPATIBILITY IDEOGRAPH-2F9FF → CJK UNIFIED IDEOGRAPH-980B     # 
+
+F9B4 ; 9818 ;  SL      # ( 領 → 領 ) CJK COMPATIBILITY IDEOGRAPH-F9B4 → CJK UNIFIED IDEOGRAPH-9818       # 
+
+2FA00 ;        9829 ;  SL      # ( 頩 → 頩 ) CJK COMPATIBILITY IDEOGRAPH-2FA00 → CJK UNIFIED IDEOGRAPH-9829     # 
+
+FA6A ; 983B ;  SL      # ( 頻 → 頻 ) CJK COMPATIBILITY IDEOGRAPH-FA6A → CJK UNIFIED IDEOGRAPH-983B       # 
+FACC ; 983B ;  SL      # ( 頻 → 頻 ) CJK COMPATIBILITY IDEOGRAPH-FACC → CJK UNIFIED IDEOGRAPH-983B       # 
+
+F9D0 ; 985E ;  SL      # ( 類 → 類 ) CJK COMPATIBILITY IDEOGRAPH-F9D0 → CJK UNIFIED IDEOGRAPH-985E       # 
+
+2EDA ; 9875 ;  SL      #* ( ⻚ → 页 ) CJK RADICAL C-SIMPLIFIED LEAF → CJK UNIFIED IDEOGRAPH-9875 # 
+
+2FB5 ; 98A8 ;  SL      #* ( ⾵ → 風 ) KANGXI RADICAL WIND → CJK UNIFIED IDEOGRAPH-98A8   # 
+
+2EDB ; 98CE ;  SL      #* ( ⻛ → 风 ) CJK RADICAL C-SIMPLIFIED WIND → CJK UNIFIED IDEOGRAPH-98CE # 
+
+2FB6 ; 98DB ;  SL      #* ( ⾶ → 飛 ) KANGXI RADICAL FLY → CJK UNIFIED IDEOGRAPH-98DB    # 
+
+2EDC ; 98DE ;  SL      #* ( ⻜ → 飞 ) CJK RADICAL C-SIMPLIFIED FLY → CJK UNIFIED IDEOGRAPH-98DE  # 
+
+2EDD ; 98DF ;  SL      #* ( ⻝ → 食 ) CJK RADICAL EAT ONE → CJK UNIFIED IDEOGRAPH-98DF   # 
+2FB7 ; 98DF ;  SL      #* ( ⾷ → 食 ) KANGXI RADICAL EAT → CJK UNIFIED IDEOGRAPH-98DF    # 
+
+2EDF ; 98E0 ;  SL      #* ( ⻟ → 飠 ) CJK RADICAL EAT THREE → CJK UNIFIED IDEOGRAPH-98E0 # 
+
+2FA02 ;        98E2 ;  SL      # ( 飢 → 飢 ) CJK COMPATIBILITY IDEOGRAPH-2FA02 → CJK UNIFIED IDEOGRAPH-98E2     # 
+
+FA2A ; 98EF ;  SL      # ( 飯 → 飯 ) CJK COMPATIBILITY IDEOGRAPH-FA2A → CJK UNIFIED IDEOGRAPH-98EF       # 
+
+FA2B ; 98FC ;  SL      # ( 飼 → 飼 ) CJK COMPATIBILITY IDEOGRAPH-FA2B → CJK UNIFIED IDEOGRAPH-98FC       # 
+
+FA2C ; 9928 ;  SL      # ( 館 → 館 ) CJK COMPATIBILITY IDEOGRAPH-FA2C → CJK UNIFIED IDEOGRAPH-9928       # 
+
+2FA04 ;        9929 ;  SL      # ( 餩 → 餩 ) CJK COMPATIBILITY IDEOGRAPH-2FA04 → CJK UNIFIED IDEOGRAPH-9929     # 
+
+2EE0 ; 9963 ;  SL      #* ( ⻠ → 饣 ) CJK RADICAL C-SIMPLIFIED EAT → CJK UNIFIED IDEOGRAPH-9963  # 
+
+2FB8 ; 9996 ;  SL      #* ( ⾸ → 首 ) KANGXI RADICAL HEAD → CJK UNIFIED IDEOGRAPH-9996   # 
+
+2FB9 ; 9999 ;  SL      #* ( ⾹ → 香 ) KANGXI RADICAL FRAGRANT → CJK UNIFIED IDEOGRAPH-9999       # 
+
+2FA05 ;        99A7 ;  SL      # ( 馧 → 馧 ) CJK COMPATIBILITY IDEOGRAPH-2FA05 → CJK UNIFIED IDEOGRAPH-99A7     # 
+
+2FBA ; 99AC ;  SL      #* ( ⾺ → 馬 ) KANGXI RADICAL HORSE → CJK UNIFIED IDEOGRAPH-99AC  # 
+
+2FA06 ;        99C2 ;  SL      # ( 駂 → 駂 ) CJK COMPATIBILITY IDEOGRAPH-2FA06 → CJK UNIFIED IDEOGRAPH-99C2     # 
+
+F91A ; 99F1 ;  SL      # ( 駱 → 駱 ) CJK COMPATIBILITY IDEOGRAPH-F91A → CJK UNIFIED IDEOGRAPH-99F1       # 
+
+2FA07 ;        99FE ;  SL      # ( 駾 → 駾 ) CJK COMPATIBILITY IDEOGRAPH-2FA07 → CJK UNIFIED IDEOGRAPH-99FE     # 
+
+F987 ; 9A6A ;  SL      # ( 驪 → 驪 ) CJK COMPATIBILITY IDEOGRAPH-F987 → CJK UNIFIED IDEOGRAPH-9A6A       # 
+
+2EE2 ; 9A6C ;  SL      #* ( ⻢ → 马 ) CJK RADICAL C-SIMPLIFIED HORSE → CJK UNIFIED IDEOGRAPH-9A6C        # 
+
+2FBB ; 9AA8 ;  SL      #* ( ⾻ → 骨 ) KANGXI RADICAL BONE → CJK UNIFIED IDEOGRAPH-9AA8   # 
+
+2FBC ; 9AD8 ;  SL      #* ( ⾼ → 高 ) KANGXI RADICAL TALL → CJK UNIFIED IDEOGRAPH-9AD8   # 
+
+2FBD ; 9ADF ;  SL      #* ( ⾽ → 髟 ) KANGXI RADICAL HAIR → CJK UNIFIED IDEOGRAPH-9ADF   # 
+
+FACD ; 9B12 ;  SL      # ( 鬒 → 鬒 ) CJK COMPATIBILITY IDEOGRAPH-FACD → CJK UNIFIED IDEOGRAPH-9B12       # 
+2FA0A ;        9B12 ;  SL      # ( 鬒 → 鬒 ) CJK COMPATIBILITY IDEOGRAPH-2FA0A → CJK UNIFIED IDEOGRAPH-9B12     # 
+
+2FBE ; 9B25 ;  SL      #* ( ⾾ → 鬥 ) KANGXI RADICAL FIGHT → CJK UNIFIED IDEOGRAPH-9B25  # 
+
+2FBF ; 9B2F ;  SL      #* ( ⾿ → 鬯 ) KANGXI RADICAL SACRIFICIAL WINE → CJK UNIFIED IDEOGRAPH-9B2F       # 
+
+2FC0 ; 9B32 ;  SL      #* ( ⿀ → 鬲 ) KANGXI RADICAL CAULDRON → CJK UNIFIED IDEOGRAPH-9B32       # 
+
+2FC1 ; 9B3C ;  SL      #* ( ⿁ → 鬼 ) KANGXI RADICAL GHOST → CJK UNIFIED IDEOGRAPH-9B3C  # 
+2EE4 ; 9B3C ;  SL      #* ( ⻤ → 鬼 ) CJK RADICAL GHOST → CJK UNIFIED IDEOGRAPH-9B3C     # 
+
+2FC2 ; 9B5A ;  SL      #* ( ⿂ → 魚 ) KANGXI RADICAL FISH → CJK UNIFIED IDEOGRAPH-9B5A   # 
+
+F939 ; 9B6F ;  SL      # ( 魯 → 魯 ) CJK COMPATIBILITY IDEOGRAPH-F939 → CJK UNIFIED IDEOGRAPH-9B6F       # 
+
+2FA0B ;        9C40 ;  SL      # ( 鱀 → 鱀 ) CJK COMPATIBILITY IDEOGRAPH-2FA0B → CJK UNIFIED IDEOGRAPH-9C40     # 
+
+F9F2 ; 9C57 ;  SL      # ( 鱗 → 鱗 ) CJK COMPATIBILITY IDEOGRAPH-F9F2 → CJK UNIFIED IDEOGRAPH-9C57       # 
+
+2EE5 ; 9C7C ;  SL      #* ( ⻥ → 鱼 ) CJK RADICAL C-SIMPLIFIED FISH → CJK UNIFIED IDEOGRAPH-9C7C # 
+
+2FC3 ; 9CE5 ;  SL      #* ( ⿃ → 鳥 ) KANGXI RADICAL BIRD → CJK UNIFIED IDEOGRAPH-9CE5   # 
+
+2FA0C ;        9CFD ;  SL      # ( 鳽 → 鳽 ) CJK COMPATIBILITY IDEOGRAPH-2FA0C → CJK UNIFIED IDEOGRAPH-9CFD     # 
+
+2FA0F ;        9D67 ;  SL      # ( 鵧 → 鵧 ) CJK COMPATIBILITY IDEOGRAPH-2FA0F → CJK UNIFIED IDEOGRAPH-9D67     # 
+
+FA2D ; 9DB4 ;  SL      # ( 鶴 → 鶴 ) CJK COMPATIBILITY IDEOGRAPH-FA2D → CJK UNIFIED IDEOGRAPH-9DB4       # 
+
+F93A ; 9DFA ;  SL      # ( 鷺 → 鷺 ) CJK COMPATIBILITY IDEOGRAPH-F93A → CJK UNIFIED IDEOGRAPH-9DFA       # 
+
+F920 ; 9E1E ;  SL      # ( 鸞 → 鸞 ) CJK COMPATIBILITY IDEOGRAPH-F920 → CJK UNIFIED IDEOGRAPH-9E1E       # 
+
+9E43 ; 9E42 ;  SL      # ( 鹃 → 鹂 ) CJK UNIFIED IDEOGRAPH-9E43 → CJK UNIFIED IDEOGRAPH-9E42     # 
+
+2FC4 ; 9E75 ;  SL      #* ( ⿄ → 鹵 ) KANGXI RADICAL SALT → CJK UNIFIED IDEOGRAPH-9E75   # 
+
+F940 ; 9E7F ;  SL      # ( 鹿 → 鹿 ) CJK COMPATIBILITY IDEOGRAPH-F940 → CJK UNIFIED IDEOGRAPH-9E7F       # 
+2FC5 ; 9E7F ;  SL      #* ( ⿅ → 鹿 ) KANGXI RADICAL DEER → CJK UNIFIED IDEOGRAPH-9E7F   # 
+
+F988 ; 9E97 ;  SL      # ( 麗 → 麗 ) CJK COMPATIBILITY IDEOGRAPH-F988 → CJK UNIFIED IDEOGRAPH-9E97       # 
+
+F9F3 ; 9E9F ;  SL      # ( 麟 → 麟 ) CJK COMPATIBILITY IDEOGRAPH-F9F3 → CJK UNIFIED IDEOGRAPH-9E9F       # 
+
+2FC6 ; 9EA5 ;  SL      #* ( ⿆ → 麥 ) KANGXI RADICAL WHEAT → CJK UNIFIED IDEOGRAPH-9EA5  # 
+
+2EE8 ; 9EA6 ;  SL      #* ( ⻨ → 麦 ) CJK RADICAL SIMPLIFIED WHEAT → CJK UNIFIED IDEOGRAPH-9EA6  # 
+
+2FA15 ;        9EBB ;  SL      # ( 麻 → 麻 ) CJK COMPATIBILITY IDEOGRAPH-2FA15 → CJK UNIFIED IDEOGRAPH-9EBB     # 
+2FC7 ; 9EBB ;  SL      #* ( ⿇ → 麻 ) KANGXI RADICAL HEMP → CJK UNIFIED IDEOGRAPH-9EBB   # 
+
+2FC8 ; 9EC3 ;  SL      #* ( ⿈ → 黃 ) KANGXI RADICAL YELLOW → CJK UNIFIED IDEOGRAPH-9EC3 # 
+
+2EE9 ; 9EC4 ;  SL      #* ( ⻩ → 黄 ) CJK RADICAL SIMPLIFIED YELLOW → CJK UNIFIED IDEOGRAPH-9EC4 # 
+
+2FC9 ; 9ECD ;  SL      #* ( ⿉ → 黍 ) KANGXI RADICAL MILLET → CJK UNIFIED IDEOGRAPH-9ECD # 
+
+F989 ; 9ECE ;  SL      # ( 黎 → 黎 ) CJK COMPATIBILITY IDEOGRAPH-F989 → CJK UNIFIED IDEOGRAPH-9ECE       # 
+
+2FCA ; 9ED1 ;  SL      #* ( ⿊ → 黑 ) KANGXI RADICAL BLACK → CJK UNIFIED IDEOGRAPH-9ED1  # 
+9ED2 ; 9ED1 ;  SL      # ( 黒 → 黑 ) CJK UNIFIED IDEOGRAPH-9ED2 → CJK UNIFIED IDEOGRAPH-9ED1     # →⿊→
+
+2FA17 ;        9EF9 ;  SL      # ( 黹 → 黹 ) CJK COMPATIBILITY IDEOGRAPH-2FA17 → CJK UNIFIED IDEOGRAPH-9EF9     # 
+2FCB ; 9EF9 ;  SL      #* ( ⿋ → 黹 ) KANGXI RADICAL EMBROIDERY → CJK UNIFIED IDEOGRAPH-9EF9     # 
+
+2FCC ; 9EFD ;  SL      #* ( ⿌ → 黽 ) KANGXI RADICAL FROG → CJK UNIFIED IDEOGRAPH-9EFD   # 
+
+2FA18 ;        9EFE ;  SL      # ( 黾 → 黾 ) CJK COMPATIBILITY IDEOGRAPH-2FA18 → CJK UNIFIED IDEOGRAPH-9EFE     # 
+
+2FA19 ;        9F05 ;  SL      # ( 鼅 → 鼅 ) CJK COMPATIBILITY IDEOGRAPH-2FA19 → CJK UNIFIED IDEOGRAPH-9F05     # 
+
+2FCD ; 9F0E ;  SL      #* ( ⿍ → 鼎 ) KANGXI RADICAL TRIPOD → CJK UNIFIED IDEOGRAPH-9F0E # 
+
+2FA1A ;        9F0F ;  SL      # ( 鼏 → 鼏 ) CJK COMPATIBILITY IDEOGRAPH-2FA1A → CJK UNIFIED IDEOGRAPH-9F0F     # 
+
+2FCE ; 9F13 ;  SL      #* ( ⿎ → 鼓 ) KANGXI RADICAL DRUM → CJK UNIFIED IDEOGRAPH-9F13   # 
+
+2FA1B ;        9F16 ;  SL      # ( 鼖 → 鼖 ) CJK COMPATIBILITY IDEOGRAPH-2FA1B → CJK UNIFIED IDEOGRAPH-9F16     # 
+
+2FCF ; 9F20 ;  SL      #* ( ⿏ → 鼠 ) KANGXI RADICAL RAT → CJK UNIFIED IDEOGRAPH-9F20    # 
+
+2FA1C ;        9F3B ;  SL      # ( 鼻 → 鼻 ) CJK COMPATIBILITY IDEOGRAPH-2FA1C → CJK UNIFIED IDEOGRAPH-9F3B     # 
+2FD0 ; 9F3B ;  SL      #* ( ⿐ → 鼻 ) KANGXI RADICAL NOSE → CJK UNIFIED IDEOGRAPH-9F3B   # 
+
+FAD8 ; 9F43 ;  SL      # ( 齃 → 齃 ) CJK COMPATIBILITY IDEOGRAPH-FAD8 → CJK UNIFIED IDEOGRAPH-9F43       # 
+
+2FD1 ; 9F4A ;  SL      #* ( ⿑ → 齊 ) KANGXI RADICAL EVEN → CJK UNIFIED IDEOGRAPH-9F4A   # 
+
+2EEC ; 9F50 ;  SL      #* ( ⻬ → 齐 ) CJK RADICAL C-SIMPLIFIED EVEN → CJK UNIFIED IDEOGRAPH-9F50 # 
+
+2FD2 ; 9F52 ;  SL      #* ( ⿒ → 齒 ) KANGXI RADICAL TOOTH → CJK UNIFIED IDEOGRAPH-9F52  # 
+
+2EEE ; 9F7F ;  SL      #* ( ⻮ → 齿 ) CJK RADICAL C-SIMPLIFIED TOOTH → CJK UNIFIED IDEOGRAPH-9F7F        # 
+
+F9C4 ; 9F8D ;  SL      # ( 龍 → 龍 ) CJK COMPATIBILITY IDEOGRAPH-F9C4 → CJK UNIFIED IDEOGRAPH-9F8D       # 
+2FD3 ; 9F8D ;  SL      #* ( ⿓ → 龍 ) KANGXI RADICAL DRAGON → CJK UNIFIED IDEOGRAPH-9F8D # 
+
+FAD9 ; 9F8E ;  SL      # ( 龎 → 龎 ) CJK COMPATIBILITY IDEOGRAPH-FAD9 → CJK UNIFIED IDEOGRAPH-9F8E       # 
+
+2EF0 ; 9F99 ;  SL      #* ( ⻰ → 龙 ) CJK RADICAL C-SIMPLIFIED DRAGON → CJK UNIFIED IDEOGRAPH-9F99       # 
+
+F907 ; 9F9C ;  SL      # ( 龜 → 龜 ) CJK COMPATIBILITY IDEOGRAPH-F907 → CJK UNIFIED IDEOGRAPH-9F9C       # 
+F908 ; 9F9C ;  SL      # ( 龜 → 龜 ) CJK COMPATIBILITY IDEOGRAPH-F908 → CJK UNIFIED IDEOGRAPH-9F9C       # 
+FACE ; 9F9C ;  SL      # ( 龜 → 龜 ) CJK COMPATIBILITY IDEOGRAPH-FACE → CJK UNIFIED IDEOGRAPH-9F9C       # 
+2FD4 ; 9F9C ;  SL      #* ( ⿔ → 龜 ) KANGXI RADICAL TURTLE → CJK UNIFIED IDEOGRAPH-9F9C # 
+
+2EF3 ; 9F9F ;  SL      #* ( ⻳ → 龟 ) CJK RADICAL C-SIMPLIFIED TURTLE → CJK UNIFIED IDEOGRAPH-9F9F       # 
+
+2FD5 ; 9FA0 ;  SL      #* ( ⿕ → 龠 ) KANGXI RADICAL FLUTE → CJK UNIFIED IDEOGRAPH-9FA0  # 
+
+2F80C ;        349E ;  SL      # ( 㒞 → 㒞 ) CJK COMPATIBILITY IDEOGRAPH-2F80C → CJK UNIFIED IDEOGRAPH-349E     # 
+
+2F813 ;        34B9 ;  SL      # ( 㒹 → 㒹 ) CJK COMPATIBILITY IDEOGRAPH-2F813 → CJK UNIFIED IDEOGRAPH-34B9     # 
+
+2F9CA ;        34BB ;  SL      # ( 㒻 → 㒻 ) CJK COMPATIBILITY IDEOGRAPH-2F9CA → CJK UNIFIED IDEOGRAPH-34BB     # 
+
+2F81F ;        34DF ;  SL      # ( 㓟 → 㓟 ) CJK COMPATIBILITY IDEOGRAPH-2F81F → CJK UNIFIED IDEOGRAPH-34DF     # 
+
+2F824 ;        3515 ;  SL      # ( 㔕 → 㔕 ) CJK COMPATIBILITY IDEOGRAPH-2F824 → CJK UNIFIED IDEOGRAPH-3515     # 
+
+2E8B ; 353E ;  SL      #* ( ⺋ → 㔾 ) CJK RADICAL SEAL → CJK UNIFIED IDEOGRAPH-353E      # 
+
+439B ; 3588 ;  SL      # ( 䎛 → 㖈 ) CJK UNIFIED IDEOGRAPH-439B → CJK UNIFIED IDEOGRAPH-3588     # 
+
+39B3 ; 363D ;  SL      # ( 㦳 → 㘽 ) CJK UNIFIED IDEOGRAPH-39B3 → CJK UNIFIED IDEOGRAPH-363D     # 
+
+2F867 ;        36EE ;  SL      # ( 㛮 → 㛮 ) CJK COMPATIBILITY IDEOGRAPH-2F867 → CJK UNIFIED IDEOGRAPH-36EE     # 
+
+2F868 ;        36FC ;  SL      # ( 㛼 → 㛼 ) CJK COMPATIBILITY IDEOGRAPH-2F868 → CJK UNIFIED IDEOGRAPH-36FC     # 
+
+2F876 ;        3781 ;  SL      # ( 㞁 → 㞁 ) CJK COMPATIBILITY IDEOGRAPH-2F876 → CJK UNIFIED IDEOGRAPH-3781     # 
+
+2F883 ;        382F ;  SL      # ( 㠯 → 㠯 ) CJK COMPATIBILITY IDEOGRAPH-2F883 → CJK UNIFIED IDEOGRAPH-382F     # 
+
+2F888 ;        3862 ;  SL      # ( 㡢 → 㡢 ) CJK COMPATIBILITY IDEOGRAPH-2F888 → CJK UNIFIED IDEOGRAPH-3862     # 
+
+2F88A ;        387C ;  SL      # ( 㡼 → 㡼 ) CJK COMPATIBILITY IDEOGRAPH-2F88A → CJK UNIFIED IDEOGRAPH-387C     # 
+
+2F896 ;        38C7 ;  SL      # ( 㣇 → 㣇 ) CJK COMPATIBILITY IDEOGRAPH-2F896 → CJK UNIFIED IDEOGRAPH-38C7     # 
+
+2F89B ;        38E3 ;  SL      # ( 㣣 → 㣣 ) CJK COMPATIBILITY IDEOGRAPH-2F89B → CJK UNIFIED IDEOGRAPH-38E3     # 
+
+2E97 ; 38FA ;  SL      #* ( ⺗ → 㣺 ) CJK RADICAL HEART TWO → CJK UNIFIED IDEOGRAPH-38FA # 
+
+2F8A2 ;        391C ;  SL      # ( 㤜 → 㤜 ) CJK COMPATIBILITY IDEOGRAPH-2F8A2 → CJK UNIFIED IDEOGRAPH-391C     # 
+
+2F8A1 ;        393A ;  SL      # ( 㤺 → 㤺 ) CJK COMPATIBILITY IDEOGRAPH-2F8A1 → CJK UNIFIED IDEOGRAPH-393A     # 
+
+2F8C2 ;        3A2E ;  SL      # ( 㨮 → 㨮 ) CJK COMPATIBILITY IDEOGRAPH-2F8C2 → CJK UNIFIED IDEOGRAPH-3A2E     # 
+
+6409 ; 3A41 ;  SL      # ( 搉 → 㩁 ) CJK UNIFIED IDEOGRAPH-6409 → CJK UNIFIED IDEOGRAPH-3A41     # 
+
+2F8C7 ;        3A6C ;  SL      # ( 㩬 → 㩬 ) CJK COMPATIBILITY IDEOGRAPH-2F8C7 → CJK UNIFIED IDEOGRAPH-3A6C     # 
+
+66F6 ; 3ADA ;  SL      # ( 曶 → 㫚 ) CJK UNIFIED IDEOGRAPH-66F6 → CJK UNIFIED IDEOGRAPH-3ADA     # 
+
+2F8D1 ;        3AE4 ;  SL      # ( 㫤 → 㫤 ) CJK COMPATIBILITY IDEOGRAPH-2F8D1 → CJK UNIFIED IDEOGRAPH-3AE4     # 
+
+2F8D0 ;        3B08 ;  SL      # ( 㬈 → 㬈 ) CJK COMPATIBILITY IDEOGRAPH-2F8D0 → CJK UNIFIED IDEOGRAPH-3B08     # 
+
+2F8CE ;        3B19 ;  SL      # ( 㬙 → 㬙 ) CJK COMPATIBILITY IDEOGRAPH-2F8CE → CJK UNIFIED IDEOGRAPH-3B19     # 
+
+80F6 ; 3B35 ;  SL      # ( 胶 → 㬵 ) CJK UNIFIED IDEOGRAPH-80F6 → CJK UNIFIED IDEOGRAPH-3B35     # 
+
+5E50 ; 3B3A ;  SL      # ( 幐 → 㬺 ) CJK UNIFIED IDEOGRAPH-5E50 → CJK UNIFIED IDEOGRAPH-3B3A     # 
+
+4420 ; 3B3B ;  SL      # ( 䐠 → 㬻 ) CJK UNIFIED IDEOGRAPH-4420 → CJK UNIFIED IDEOGRAPH-3B3B     # 
+
+2F8DE ;        3B49 ;  SL      # ( 㭉 → 㭉 ) CJK COMPATIBILITY IDEOGRAPH-2F8DE → CJK UNIFIED IDEOGRAPH-3B49     # 
+
+FAD2 ; 3B9D ;  SL      # ( 㮝 → 㮝 ) CJK COMPATIBILITY IDEOGRAPH-FAD2 → CJK UNIFIED IDEOGRAPH-3B9D       # 
+2F8E7 ;        3B9D ;  SL      # ( 㮝 → 㮝 ) CJK COMPATIBILITY IDEOGRAPH-2F8E7 → CJK UNIFIED IDEOGRAPH-3B9D     # 
+
+69E9 ; 3BA3 ;  SL      # ( 槩 → 㮣 ) CJK UNIFIED IDEOGRAPH-69E9 → CJK UNIFIED IDEOGRAPH-3BA3     # 
+
+2F8EE ;        3C18 ;  SL      # ( 㰘 → 㰘 ) CJK COMPATIBILITY IDEOGRAPH-2F8EE → CJK UNIFIED IDEOGRAPH-3C18     # 
+
+2F8F2 ;        3C4E ;  SL      # ( 㱎 → 㱎 ) CJK COMPATIBILITY IDEOGRAPH-2F8F2 → CJK UNIFIED IDEOGRAPH-3C4E     # 
+
+2F90A ;        3D33 ;  SL      # ( 㴳 → 㴳 ) CJK COMPATIBILITY IDEOGRAPH-2F90A → CJK UNIFIED IDEOGRAPH-3D33     # 
+
+2F916 ;        3D96 ;  SL      # ( 㶖 → 㶖 ) CJK COMPATIBILITY IDEOGRAPH-2F916 → CJK UNIFIED IDEOGRAPH-3D96     # 
+
+2F92A ;        3EAC ;  SL      # ( 㺬 → 㺬 ) CJK COMPATIBILITY IDEOGRAPH-2F92A → CJK UNIFIED IDEOGRAPH-3EAC     # 
+
+2F92C ;        3EB8 ;  SL      # ( 㺸 → 㺸 ) CJK COMPATIBILITY IDEOGRAPH-2F92C → CJK UNIFIED IDEOGRAPH-3EB8     # 
+2F92D ;        3EB8 ;  SL      # ( 㺸 → 㺸 ) CJK COMPATIBILITY IDEOGRAPH-2F92D → CJK UNIFIED IDEOGRAPH-3EB8     # 
+
+2F933 ;        3F1B ;  SL      # ( 㼛 → 㼛 ) CJK COMPATIBILITY IDEOGRAPH-2F933 → CJK UNIFIED IDEOGRAPH-3F1B     # 
+
+2F93E ;        3FFC ;  SL      # ( 㿼 → 㿼 ) CJK COMPATIBILITY IDEOGRAPH-2F93E → CJK UNIFIED IDEOGRAPH-3FFC     # 
+
+2F93F ;        4008 ;  SL      # ( 䀈 → 䀈 ) CJK COMPATIBILITY IDEOGRAPH-2F93F → CJK UNIFIED IDEOGRAPH-4008     # 
+
+FAD3 ; 4018 ;  SL      # ( 䀘 → 䀘 ) CJK COMPATIBILITY IDEOGRAPH-FAD3 → CJK UNIFIED IDEOGRAPH-4018       # 
+
+9FC3 ; 4039 ;  SL      # ( 鿃 → 䀹 ) CJK UNIFIED IDEOGRAPH-9FC3 → CJK UNIFIED IDEOGRAPH-4039     # →䀹→
+FAD4 ; 4039 ;  SL      # ( 䀹 → 䀹 ) CJK COMPATIBILITY IDEOGRAPH-FAD4 → CJK UNIFIED IDEOGRAPH-4039       # 
+2F949 ;        4039 ;  SL      # ( 䀹 → 䀹 ) CJK COMPATIBILITY IDEOGRAPH-2F949 → CJK UNIFIED IDEOGRAPH-4039     # 
+
+6663 ; 403F ;  SL      # ( 晣 → 䀿 ) CJK UNIFIED IDEOGRAPH-6663 → CJK UNIFIED IDEOGRAPH-403F     # 
+
+2F94B ;        4046 ;  SL      # ( 䁆 → 䁆 ) CJK COMPATIBILITY IDEOGRAPH-2F94B → CJK UNIFIED IDEOGRAPH-4046     # 
+
+2F94C ;        4096 ;  SL      # ( 䂖 → 䂖 ) CJK COMPATIBILITY IDEOGRAPH-2F94C → CJK UNIFIED IDEOGRAPH-4096     # 
+
+2F951 ;        40E3 ;  SL      # ( 䃣 → 䃣 ) CJK COMPATIBILITY IDEOGRAPH-2F951 → CJK UNIFIED IDEOGRAPH-40E3     # 
+
+2F958 ;        412F ;  SL      # ( 䄯 → 䄯 ) CJK COMPATIBILITY IDEOGRAPH-2F958 → CJK UNIFIED IDEOGRAPH-412F     # 
+
+2F960 ;        4202 ;  SL      # ( 䈂 → 䈂 ) CJK COMPATIBILITY IDEOGRAPH-2F960 → CJK UNIFIED IDEOGRAPH-4202     # 
+
+2F964 ;        4227 ;  SL      # ( 䈧 → 䈧 ) CJK COMPATIBILITY IDEOGRAPH-2F964 → CJK UNIFIED IDEOGRAPH-4227     # 
+
+2F967 ;        42A0 ;  SL      # ( 䊠 → 䊠 ) CJK COMPATIBILITY IDEOGRAPH-2F967 → CJK UNIFIED IDEOGRAPH-42A0     # 
+
+2F96D ;        4301 ;  SL      # ( 䌁 → 䌁 ) CJK COMPATIBILITY IDEOGRAPH-2F96D → CJK UNIFIED IDEOGRAPH-4301     # 
+
+2F971 ;        4334 ;  SL      # ( 䌴 → 䌴 ) CJK COMPATIBILITY IDEOGRAPH-2F971 → CJK UNIFIED IDEOGRAPH-4334     # 
+
+2F974 ;        4359 ;  SL      # ( 䍙 → 䍙 ) CJK COMPATIBILITY IDEOGRAPH-2F974 → CJK UNIFIED IDEOGRAPH-4359     # 
+
+2F981 ;        43D5 ;  SL      # ( 䏕 → 䏕 ) CJK COMPATIBILITY IDEOGRAPH-2F981 → CJK UNIFIED IDEOGRAPH-43D5     # 
+
+2F8D7 ;        43D9 ;  SL      # ( 䏙 → 䏙 ) CJK COMPATIBILITY IDEOGRAPH-2F8D7 → CJK UNIFIED IDEOGRAPH-43D9     # 
+
+2F984 ;        440B ;  SL      # ( 䐋 → 䐋 ) CJK COMPATIBILITY IDEOGRAPH-2F984 → CJK UNIFIED IDEOGRAPH-440B     # 
+
+6726 ; 4443 ;  SL      # ( 朦 → 䑃 ) CJK UNIFIED IDEOGRAPH-6726 → CJK UNIFIED IDEOGRAPH-4443     # 
+
+2F98E ;        446B ;  SL      # ( 䑫 → 䑫 ) CJK COMPATIBILITY IDEOGRAPH-2F98E → CJK UNIFIED IDEOGRAPH-446B     # 
+
+2F9A7 ;        452B ;  SL      # ( 䔫 → 䔫 ) CJK COMPATIBILITY IDEOGRAPH-2F9A7 → CJK UNIFIED IDEOGRAPH-452B     # 
+
+2F9AE ;        455D ;  SL      # ( 䕝 → 䕝 ) CJK COMPATIBILITY IDEOGRAPH-2F9AE → CJK UNIFIED IDEOGRAPH-455D     # 
+
+2F9AF ;        4561 ;  SL      # ( 䕡 → 䕡 ) CJK COMPATIBILITY IDEOGRAPH-2F9AF → CJK UNIFIED IDEOGRAPH-4561     # 
+
+2F9B2 ;        456B ;  SL      # ( 䕫 → 䕫 ) CJK COMPATIBILITY IDEOGRAPH-2F9B2 → CJK UNIFIED IDEOGRAPH-456B     # 
+
+2F9BF ;        45D7 ;  SL      # ( 䗗 → 䗗 ) CJK COMPATIBILITY IDEOGRAPH-2F9BF → CJK UNIFIED IDEOGRAPH-45D7     # 
+
+2F9C2 ;        45F9 ;  SL      # ( 䗹 → 䗹 ) CJK COMPATIBILITY IDEOGRAPH-2F9C2 → CJK UNIFIED IDEOGRAPH-45F9     # 
+
+2F9C8 ;        4635 ;  SL      # ( 䘵 → 䘵 ) CJK COMPATIBILITY IDEOGRAPH-2F9C8 → CJK UNIFIED IDEOGRAPH-4635     # 
+
+8A1E ; 46B6 ;  SL      # ( 訞 → 䚶 ) CJK UNIFIED IDEOGRAPH-8A1E → CJK UNIFIED IDEOGRAPH-46B6     # 
+
+2F9CD ;        46BE ;  SL      # ( 䚾 → 䚾 ) CJK COMPATIBILITY IDEOGRAPH-2F9CD → CJK UNIFIED IDEOGRAPH-46BE     # 
+
+2F9CE ;        46C7 ;  SL      # ( 䛇 → 䛇 ) CJK COMPATIBILITY IDEOGRAPH-2F9CE → CJK UNIFIED IDEOGRAPH-46C7     # 
+
+2F9EF ;        4995 ;  SL      # ( 䦕 → 䦕 ) CJK COMPATIBILITY IDEOGRAPH-2F9EF → CJK UNIFIED IDEOGRAPH-4995     # 
+
+2F9F2 ;        49E6 ;  SL      # ( 䧦 → 䧦 ) CJK COMPATIBILITY IDEOGRAPH-2F9F2 → CJK UNIFIED IDEOGRAPH-49E6     # 
+
+2F9F8 ;        4A6E ;  SL      # ( 䩮 → 䩮 ) CJK COMPATIBILITY IDEOGRAPH-2F9F8 → CJK UNIFIED IDEOGRAPH-4A6E     # 
+
+2F9F9 ;        4A76 ;  SL      # ( 䩶 → 䩶 ) CJK COMPATIBILITY IDEOGRAPH-2F9F9 → CJK UNIFIED IDEOGRAPH-4A76     # 
+
+2F9FC ;        4AB2 ;  SL      # ( 䪲 → 䪲 ) CJK COMPATIBILITY IDEOGRAPH-2F9FC → CJK UNIFIED IDEOGRAPH-4AB2     # 
+
+2FA03 ;        4B33 ;  SL      # ( 䬳 → 䬳 ) CJK COMPATIBILITY IDEOGRAPH-2FA03 → CJK UNIFIED IDEOGRAPH-4B33     # 
+
+2FA08 ;        4BCE ;  SL      # ( 䯎 → 䯎 ) CJK COMPATIBILITY IDEOGRAPH-2FA08 → CJK UNIFIED IDEOGRAPH-4BCE     # 
+
+2FA0D ;        4CCE ;  SL      # ( 䳎 → 䳎 ) CJK COMPATIBILITY IDEOGRAPH-2FA0D → CJK UNIFIED IDEOGRAPH-4CCE     # 
+
+2FA0E ;        4CED ;  SL      # ( 䳭 → 䳭 ) CJK COMPATIBILITY IDEOGRAPH-2FA0E → CJK UNIFIED IDEOGRAPH-4CED     # 
+
+2FA11 ;        4CF8 ;  SL      # ( 䳸 → 䳸 ) CJK COMPATIBILITY IDEOGRAPH-2FA11 → CJK UNIFIED IDEOGRAPH-4CF8     # 
+
+2FA16 ;        4D56 ;  SL      # ( 䵖 → 䵖 ) CJK COMPATIBILITY IDEOGRAPH-2FA16 → CJK UNIFIED IDEOGRAPH-4D56     # 
+
+2F803 ;        20122 ; SL      # ( 𠄢 → 𠄢 ) CJK COMPATIBILITY IDEOGRAPH-2F803 → CJK UNIFIED IDEOGRAPH-20122   # 
+
+2F812 ;        2051C ; SL      # ( 𠔜 → 𠔜 ) CJK COMPATIBILITY IDEOGRAPH-2F812 → CJK UNIFIED IDEOGRAPH-2051C   # 
+
+2F91B ;        20525 ; SL      # ( 𠔥 → 𠔥 ) CJK COMPATIBILITY IDEOGRAPH-2F91B → CJK UNIFIED IDEOGRAPH-20525   # 
+
+2F816 ;        2054B ; SL      # ( 𠕋 → 𠕋 ) CJK COMPATIBILITY IDEOGRAPH-2F816 → CJK UNIFIED IDEOGRAPH-2054B   # 
+
+2F80D ;        2063A ; SL      # ( 𠘺 → 𠘺 ) CJK COMPATIBILITY IDEOGRAPH-2F80D → CJK UNIFIED IDEOGRAPH-2063A   # 
+
+2F9D9 ;        20804 ; SL      # ( 𠠄 → 𠠄 ) CJK COMPATIBILITY IDEOGRAPH-2F9D9 → CJK UNIFIED IDEOGRAPH-20804   # 
+
+2F9DD ;        208DE ; SL      # ( 𠣞 → 𠣞 ) CJK COMPATIBILITY IDEOGRAPH-2F9DD → CJK UNIFIED IDEOGRAPH-208DE   # 
+
+2F834 ;        20A2C ; SL      # ( 𠨬 → 𠨬 ) CJK COMPATIBILITY IDEOGRAPH-2F834 → CJK UNIFIED IDEOGRAPH-20A2C   # 
+
+2F838 ;        20B63 ; SL      # ( 𠭣 → 𠭣 ) CJK COMPATIBILITY IDEOGRAPH-2F838 → CJK UNIFIED IDEOGRAPH-20B63   # 
+
+2F859 ;        214E4 ; SL      # ( 𡓤 → 𡓤 ) CJK COMPATIBILITY IDEOGRAPH-2F859 → CJK UNIFIED IDEOGRAPH-214E4   # 
+
+2F860 ;        216A8 ; SL      # ( 𡚨 → 𡚨 ) CJK COMPATIBILITY IDEOGRAPH-2F860 → CJK UNIFIED IDEOGRAPH-216A8   # 
+
+2F861 ;        216EA ; SL      # ( 𡛪 → 𡛪 ) CJK COMPATIBILITY IDEOGRAPH-2F861 → CJK UNIFIED IDEOGRAPH-216EA   # 
+
+2F86C ;        219C8 ; SL      # ( 𡧈 → 𡧈 ) CJK COMPATIBILITY IDEOGRAPH-2F86C → CJK UNIFIED IDEOGRAPH-219C8   # 
+
+2F871 ;        21B18 ; SL      # ( 𡬘 → 𡬘 ) CJK COMPATIBILITY IDEOGRAPH-2F871 → CJK UNIFIED IDEOGRAPH-21B18   # 
+
+2F8F8 ;        21D0B ; SL      # ( 𡴋 → 𡴋 ) CJK COMPATIBILITY IDEOGRAPH-2F8F8 → CJK UNIFIED IDEOGRAPH-21D0B   # 
+
+2F87B ;        21DE4 ; SL      # ( 𡷤 → 𡷤 ) CJK COMPATIBILITY IDEOGRAPH-2F87B → CJK UNIFIED IDEOGRAPH-21DE4   # 
+
+2F87D ;        21DE6 ; SL      # ( 𡷦 → 𡷦 ) CJK COMPATIBILITY IDEOGRAPH-2F87D → CJK UNIFIED IDEOGRAPH-21DE6   # 
+
+2F889 ;        22183 ; SL      # ( 𢆃 → 𢆃 ) CJK COMPATIBILITY IDEOGRAPH-2F889 → CJK UNIFIED IDEOGRAPH-22183   # 
+
+2F939 ;        2219F ; SL      # ( 𢆟 → 𢆟 ) CJK COMPATIBILITY IDEOGRAPH-2F939 → CJK UNIFIED IDEOGRAPH-2219F   # 
+
+2F891 ;        22331 ; SL      # ( 𢌱 → 𢌱 ) CJK COMPATIBILITY IDEOGRAPH-2F891 → CJK UNIFIED IDEOGRAPH-22331   # 
+2F892 ;        22331 ; SL      # ( 𢌱 → 𢌱 ) CJK COMPATIBILITY IDEOGRAPH-2F892 → CJK UNIFIED IDEOGRAPH-22331   # 
+
+2F8A4 ;        226D4 ; SL      # ( 𢛔 → 𢛔 ) CJK COMPATIBILITY IDEOGRAPH-2F8A4 → CJK UNIFIED IDEOGRAPH-226D4   # 
+
+FAD0 ; 22844 ; SL      # ( 𢡄 → 𢡄 ) CJK COMPATIBILITY IDEOGRAPH-FAD0 → CJK UNIFIED IDEOGRAPH-22844     # 
+
+FACF ; 2284A ; SL      # ( 𢡊 → 𢡊 ) CJK COMPATIBILITY IDEOGRAPH-FACF → CJK UNIFIED IDEOGRAPH-2284A     # 
+
+2F8B8 ;        22B0C ; SL      # ( 𢬌 → 𢬌 ) CJK COMPATIBILITY IDEOGRAPH-2F8B8 → CJK UNIFIED IDEOGRAPH-22B0C   # 
+
+2F8BE ;        22BF1 ; SL      # ( 𢯱 → 𢯱 ) CJK COMPATIBILITY IDEOGRAPH-2F8BE → CJK UNIFIED IDEOGRAPH-22BF1   # 
+
+2F8CA ;        2300A ; SL      # ( 𣀊 → 𣀊 ) CJK COMPATIBILITY IDEOGRAPH-2F8CA → CJK UNIFIED IDEOGRAPH-2300A   # 
+
+2F897 ;        232B8 ; SL      # ( 𣊸 → 𣊸 ) CJK COMPATIBILITY IDEOGRAPH-2F897 → CJK UNIFIED IDEOGRAPH-232B8   # 
+
+2F980 ;        2335F ; SL      # ( 𣍟 → 𣍟 ) CJK COMPATIBILITY IDEOGRAPH-2F980 → CJK UNIFIED IDEOGRAPH-2335F   # 
+
+2F989 ;        23393 ; SL      # ( 𣎓 → 𣎓 ) CJK COMPATIBILITY IDEOGRAPH-2F989 → CJK UNIFIED IDEOGRAPH-23393   # 
+
+2F98A ;        2339C ; SL      # ( 𣎜 → 𣎜 ) CJK COMPATIBILITY IDEOGRAPH-2F98A → CJK UNIFIED IDEOGRAPH-2339C   # 
+
+2F8DD ;        233C3 ; SL      # ( 𣏃 → 𣏃 ) CJK COMPATIBILITY IDEOGRAPH-2F8DD → CJK UNIFIED IDEOGRAPH-233C3   # 
+
+FAD1 ; 233D5 ; SL      # ( 𣏕 → 𣏕 ) CJK COMPATIBILITY IDEOGRAPH-FAD1 → CJK UNIFIED IDEOGRAPH-233D5     # 
+
+2F8E3 ;        2346D ; SL      # ( 𣑭 → 𣑭 ) CJK COMPATIBILITY IDEOGRAPH-2F8E3 → CJK UNIFIED IDEOGRAPH-2346D   # 
+
+2F8EC ;        236A3 ; SL      # ( 𣚣 → 𣚣 ) CJK COMPATIBILITY IDEOGRAPH-2F8EC → CJK UNIFIED IDEOGRAPH-236A3   # 
+
+2F8F0 ;        238A7 ; SL      # ( 𣢧 → 𣢧 ) CJK COMPATIBILITY IDEOGRAPH-2F8F0 → CJK UNIFIED IDEOGRAPH-238A7   # 
+
+2F8F7 ;        23A8D ; SL      # ( 𣪍 → 𣪍 ) CJK COMPATIBILITY IDEOGRAPH-2F8F7 → CJK UNIFIED IDEOGRAPH-23A8D   # 
+
+2F8F9 ;        23AFA ; SL      # ( 𣫺 → 𣫺 ) CJK COMPATIBILITY IDEOGRAPH-2F8F9 → CJK UNIFIED IDEOGRAPH-23AFA   # 
+
+2F8FB ;        23CBC ; SL      # ( 𣲼 → 𣲼 ) CJK COMPATIBILITY IDEOGRAPH-2F8FB → CJK UNIFIED IDEOGRAPH-23CBC   # 
+
+2F906 ;        23D1E ; SL      # ( 𣴞 → 𣴞 ) CJK COMPATIBILITY IDEOGRAPH-2F906 → CJK UNIFIED IDEOGRAPH-23D1E   # 
+
+2F90D ;        23ED1 ; SL      # ( 𣻑 → 𣻑 ) CJK COMPATIBILITY IDEOGRAPH-2F90D → CJK UNIFIED IDEOGRAPH-23ED1   # 
+
+2F910 ;        23F5E ; SL      # ( 𣽞 → 𣽞 ) CJK COMPATIBILITY IDEOGRAPH-2F910 → CJK UNIFIED IDEOGRAPH-23F5E   # 
+
+2F911 ;        23F8E ; SL      # ( 𣾎 → 𣾎 ) CJK COMPATIBILITY IDEOGRAPH-2F911 → CJK UNIFIED IDEOGRAPH-23F8E   # 
+
+2F91D ;        24263 ; SL      # ( 𤉣 → 𤉣 ) CJK COMPATIBILITY IDEOGRAPH-2F91D → CJK UNIFIED IDEOGRAPH-24263   # 
+
+FA6C ; 242EE ; SL      # ( 𤋮 → 𤋮 ) CJK COMPATIBILITY IDEOGRAPH-FA6C → CJK UNIFIED IDEOGRAPH-242EE     # 
+
+2F91F ;        243AB ; SL      # ( 𤎫 → 𤎫 ) CJK COMPATIBILITY IDEOGRAPH-2F91F → CJK UNIFIED IDEOGRAPH-243AB   # 
+
+2F923 ;        24608 ; SL      # ( 𤘈 → 𤘈 ) CJK COMPATIBILITY IDEOGRAPH-2F923 → CJK UNIFIED IDEOGRAPH-24608   # 
+
+2F926 ;        24735 ; SL      # ( 𤜵 → 𤜵 ) CJK COMPATIBILITY IDEOGRAPH-2F926 → CJK UNIFIED IDEOGRAPH-24735   # 
+
+2F927 ;        24814 ; SL      # ( 𤠔 → 𤠔 ) CJK COMPATIBILITY IDEOGRAPH-2F927 → CJK UNIFIED IDEOGRAPH-24814   # 
+
+2F935 ;        24C36 ; SL      # ( 𤰶 → 𤰶 ) CJK COMPATIBILITY IDEOGRAPH-2F935 → CJK UNIFIED IDEOGRAPH-24C36   # 
+
+2F937 ;        24C92 ; SL      # ( 𤲒 → 𤲒 ) CJK COMPATIBILITY IDEOGRAPH-2F937 → CJK UNIFIED IDEOGRAPH-24C92   # 
+
+2F93B ;        24FA1 ; SL      # ( 𤾡 → 𤾡 ) CJK COMPATIBILITY IDEOGRAPH-2F93B → CJK UNIFIED IDEOGRAPH-24FA1   # 
+
+2F93C ;        24FB8 ; SL      # ( 𤾸 → 𤾸 ) CJK COMPATIBILITY IDEOGRAPH-2F93C → CJK UNIFIED IDEOGRAPH-24FB8   # 
+
+2F93D ;        25044 ; SL      # ( 𥁄 → 𥁄 ) CJK COMPATIBILITY IDEOGRAPH-2F93D → CJK UNIFIED IDEOGRAPH-25044   # 
+
+2F942 ;        250F2 ; SL      # ( 𥃲 → 𥃲 ) CJK COMPATIBILITY IDEOGRAPH-2F942 → CJK UNIFIED IDEOGRAPH-250F2   # 
+
+2F941 ;        250F3 ; SL      # ( 𥃳 → 𥃳 ) CJK COMPATIBILITY IDEOGRAPH-2F941 → CJK UNIFIED IDEOGRAPH-250F3   # 
+
+2F943 ;        25119 ; SL      # ( 𥄙 → 𥄙 ) CJK COMPATIBILITY IDEOGRAPH-2F943 → CJK UNIFIED IDEOGRAPH-25119   # 
+
+2F944 ;        25133 ; SL      # ( 𥄳 → 𥄳 ) CJK COMPATIBILITY IDEOGRAPH-2F944 → CJK UNIFIED IDEOGRAPH-25133   # 
+
+FAD5 ; 25249 ; SL      # ( 𥉉 → 𥉉 ) CJK COMPATIBILITY IDEOGRAPH-FAD5 → CJK UNIFIED IDEOGRAPH-25249     # 
+
+2F94D ;        2541D ; SL      # ( 𥐝 → 𥐝 ) CJK COMPATIBILITY IDEOGRAPH-2F94D → CJK UNIFIED IDEOGRAPH-2541D   # 
+
+2F952 ;        25626 ; SL      # ( 𥘦 → 𥘦 ) CJK COMPATIBILITY IDEOGRAPH-2F952 → CJK UNIFIED IDEOGRAPH-25626   # 
+
+2F954 ;        2569A ; SL      # ( 𥚚 → 𥚚 ) CJK COMPATIBILITY IDEOGRAPH-2F954 → CJK UNIFIED IDEOGRAPH-2569A   # 
+
+2F955 ;        256C5 ; SL      # ( 𥛅 → 𥛅 ) CJK COMPATIBILITY IDEOGRAPH-2F955 → CJK UNIFIED IDEOGRAPH-256C5   # 
+
+2F95C ;        2597C ; SL      # ( 𥥼 → 𥥼 ) CJK COMPATIBILITY IDEOGRAPH-2F95C → CJK UNIFIED IDEOGRAPH-2597C   # 
+
+2F95D ;        25AA7 ; SL      # ( 𥪧 → 𥪧 ) CJK COMPATIBILITY IDEOGRAPH-2F95D → CJK UNIFIED IDEOGRAPH-25AA7   # 
+2F95E ;        25AA7 ; SL      # ( 𥪧 → 𥪧 ) CJK COMPATIBILITY IDEOGRAPH-2F95E → CJK UNIFIED IDEOGRAPH-25AA7   # 
+
+2F961 ;        25BAB ; SL      # ( 𥮫 → 𥮫 ) CJK COMPATIBILITY IDEOGRAPH-2F961 → CJK UNIFIED IDEOGRAPH-25BAB   # 
+
+2F965 ;        25C80 ; SL      # ( 𥲀 → 𥲀 ) CJK COMPATIBILITY IDEOGRAPH-2F965 → CJK UNIFIED IDEOGRAPH-25C80   # 
+
+FAD6 ; 25CD0 ; SL      # ( 𥳐 → 𥳐 ) CJK COMPATIBILITY IDEOGRAPH-FAD6 → CJK UNIFIED IDEOGRAPH-25CD0     # 
+
+2F96B ;        25F86 ; SL      # ( 𥾆 → 𥾆 ) CJK COMPATIBILITY IDEOGRAPH-2F96B → CJK UNIFIED IDEOGRAPH-25F86   # 
+
+2F898 ;        261DA ; SL      # ( 𦇚 → 𦇚 ) CJK COMPATIBILITY IDEOGRAPH-2F898 → CJK UNIFIED IDEOGRAPH-261DA   # 
+
+2F972 ;        26228 ; SL      # ( 𦈨 → 𦈨 ) CJK COMPATIBILITY IDEOGRAPH-2F972 → CJK UNIFIED IDEOGRAPH-26228   # 
+
+2F973 ;        26247 ; SL      # ( 𦉇 → 𦉇 ) CJK COMPATIBILITY IDEOGRAPH-2F973 → CJK UNIFIED IDEOGRAPH-26247   # 
+
+2F975 ;        262D9 ; SL      # ( 𦋙 → 𦋙 ) CJK COMPATIBILITY IDEOGRAPH-2F975 → CJK UNIFIED IDEOGRAPH-262D9   # 
+
+2F977 ;        2633E ; SL      # ( 𦌾 → 𦌾 ) CJK COMPATIBILITY IDEOGRAPH-2F977 → CJK UNIFIED IDEOGRAPH-2633E   # 
+
+2F97B ;        264DA ; SL      # ( 𦓚 → 𦓚 ) CJK COMPATIBILITY IDEOGRAPH-2F97B → CJK UNIFIED IDEOGRAPH-264DA   # 
+
+2F97C ;        26523 ; SL      # ( 𦔣 → 𦔣 ) CJK COMPATIBILITY IDEOGRAPH-2F97C → CJK UNIFIED IDEOGRAPH-26523   # 
+
+2F97E ;        265A8 ; SL      # ( 𦖨 → 𦖨 ) CJK COMPATIBILITY IDEOGRAPH-2F97E → CJK UNIFIED IDEOGRAPH-265A8   # 
+
+2F987 ;        267A7 ; SL      # ( 𦞧 → 𦞧 ) CJK COMPATIBILITY IDEOGRAPH-2F987 → CJK UNIFIED IDEOGRAPH-267A7   # 
+
+2F988 ;        267B5 ; SL      # ( 𦞵 → 𦞵 ) CJK COMPATIBILITY IDEOGRAPH-2F988 → CJK UNIFIED IDEOGRAPH-267B5   # 
+
+2F997 ;        26B3C ; SL      # ( 𦬼 → 𦬼 ) CJK COMPATIBILITY IDEOGRAPH-2F997 → CJK UNIFIED IDEOGRAPH-26B3C   # 
+
+2F9A4 ;        26C36 ; SL      # ( 𦰶 → 𦰶 ) CJK COMPATIBILITY IDEOGRAPH-2F9A4 → CJK UNIFIED IDEOGRAPH-26C36   # 
+
+2F9A6 ;        26CD5 ; SL      # ( 𦳕 → 𦳕 ) CJK COMPATIBILITY IDEOGRAPH-2F9A6 → CJK UNIFIED IDEOGRAPH-26CD5   # 
+
+2F9A5 ;        26D6B ; SL      # ( 𦵫 → 𦵫 ) CJK COMPATIBILITY IDEOGRAPH-2F9A5 → CJK UNIFIED IDEOGRAPH-26D6B   # 
+
+2F9AD ;        26F2C ; SL      # ( 𦼬 → 𦼬 ) CJK COMPATIBILITY IDEOGRAPH-2F9AD → CJK UNIFIED IDEOGRAPH-26F2C   # 
+
+2F9B0 ;        26FB1 ; SL      # ( 𦾱 → 𦾱 ) CJK COMPATIBILITY IDEOGRAPH-2F9B0 → CJK UNIFIED IDEOGRAPH-26FB1   # 
+
+2F9B1 ;        270D2 ; SL      # ( 𧃒 → 𧃒 ) CJK COMPATIBILITY IDEOGRAPH-2F9B1 → CJK UNIFIED IDEOGRAPH-270D2   # 
+
+2F9AB ;        273CA ; SL      # ( 𧏊 → 𧏊 ) CJK COMPATIBILITY IDEOGRAPH-2F9AB → CJK UNIFIED IDEOGRAPH-273CA   # 
+
+2F9C5 ;        27667 ; SL      # ( 𧙧 → 𧙧 ) CJK COMPATIBILITY IDEOGRAPH-2F9C5 → CJK UNIFIED IDEOGRAPH-27667   # 
+
+2F9CB ;        278AE ; SL      # ( 𧢮 → 𧢮 ) CJK COMPATIBILITY IDEOGRAPH-2F9CB → CJK UNIFIED IDEOGRAPH-278AE   # 
+
+2F9CC ;        27966 ; SL      # ( 𧥦 → 𧥦 ) CJK COMPATIBILITY IDEOGRAPH-2F9CC → CJK UNIFIED IDEOGRAPH-27966   # 
+
+2F9D3 ;        27CA8 ; SL      # ( 𧲨 → 𧲨 ) CJK COMPATIBILITY IDEOGRAPH-2F9D3 → CJK UNIFIED IDEOGRAPH-27CA8   # 
+
+FAD7 ; 27ED3 ; SL      # ( 𧻓 → 𧻓 ) CJK COMPATIBILITY IDEOGRAPH-FAD7 → CJK UNIFIED IDEOGRAPH-27ED3     # 
+
+2F9D8 ;        27F2F ; SL      # ( 𧼯 → 𧼯 ) CJK COMPATIBILITY IDEOGRAPH-2F9D8 → CJK UNIFIED IDEOGRAPH-27F2F   # 
+
+2F9E0 ;        285D2 ; SL      # ( 𨗒 → 𨗒 ) CJK COMPATIBILITY IDEOGRAPH-2F9E0 → CJK UNIFIED IDEOGRAPH-285D2   # 
+
+2F9E1 ;        285ED ; SL      # ( 𨗭 → 𨗭 ) CJK COMPATIBILITY IDEOGRAPH-2F9E1 → CJK UNIFIED IDEOGRAPH-285ED   # 
+
+2F9E5 ;        2872E ; SL      # ( 𨜮 → 𨜮 ) CJK COMPATIBILITY IDEOGRAPH-2F9E5 → CJK UNIFIED IDEOGRAPH-2872E   # 
+
+2F9ED ;        28BFA ; SL      # ( 𨯺 → 𨯺 ) CJK COMPATIBILITY IDEOGRAPH-2F9ED → CJK UNIFIED IDEOGRAPH-28BFA   # 
+
+2F9F1 ;        28D77 ; SL      # ( 𨵷 → 𨵷 ) CJK COMPATIBILITY IDEOGRAPH-2F9F1 → CJK UNIFIED IDEOGRAPH-28D77   # 
+
+2F9F6 ;        29145 ; SL      # ( 𩅅 → 𩅅 ) CJK COMPATIBILITY IDEOGRAPH-2F9F6 → CJK UNIFIED IDEOGRAPH-29145   # 
+
+2F81C ;        291DF ; SL      # ( 𩇟 → 𩇟 ) CJK COMPATIBILITY IDEOGRAPH-2F81C → CJK UNIFIED IDEOGRAPH-291DF   # 
+
+2F9F7 ;        2921A ; SL      # ( 𩈚 → 𩈚 ) CJK COMPATIBILITY IDEOGRAPH-2F9F7 → CJK UNIFIED IDEOGRAPH-2921A   # 
+
+2F9FB ;        2940A ; SL      # ( 𩐊 → 𩐊 ) CJK COMPATIBILITY IDEOGRAPH-2F9FB → CJK UNIFIED IDEOGRAPH-2940A   # 
+
+2F9FD ;        29496 ; SL      # ( 𩒖 → 𩒖 ) CJK COMPATIBILITY IDEOGRAPH-2F9FD → CJK UNIFIED IDEOGRAPH-29496   # 
+
+2FA01 ;        295B6 ; SL      # ( 𩖶 → 𩖶 ) CJK COMPATIBILITY IDEOGRAPH-2FA01 → CJK UNIFIED IDEOGRAPH-295B6   # 
+
+2FA09 ;        29B30 ; SL      # ( 𩬰 → 𩬰 ) CJK COMPATIBILITY IDEOGRAPH-2FA09 → CJK UNIFIED IDEOGRAPH-29B30   # 
+
+2FA10 ;        2A0CE ; SL      # ( 𪃎 → 𪃎 ) CJK COMPATIBILITY IDEOGRAPH-2FA10 → CJK UNIFIED IDEOGRAPH-2A0CE   # 
+
+2FA12 ;        2A105 ; SL      # ( 𪄅 → 𪄅 ) CJK COMPATIBILITY IDEOGRAPH-2FA12 → CJK UNIFIED IDEOGRAPH-2A105   # 
+
+2FA13 ;        2A20E ; SL      # ( 𪈎 → 𪈎 ) CJK COMPATIBILITY IDEOGRAPH-2FA13 → CJK UNIFIED IDEOGRAPH-2A20E   # 
+
+2FA14 ;        2A291 ; SL      # ( 𪊑 → 𪊑 ) CJK COMPATIBILITY IDEOGRAPH-2FA14 → CJK UNIFIED IDEOGRAPH-2A291   # 
+
+2F88F ;        2A392 ; SL      # ( 𪎒 → 𪎒 ) CJK COMPATIBILITY IDEOGRAPH-2F88F → CJK UNIFIED IDEOGRAPH-2A392   # 
+
+2FA1D ;        2A600 ; SL      # ( 𪘀 → 𪘀 ) CJK COMPATIBILITY IDEOGRAPH-2FA1D → CJK UNIFIED IDEOGRAPH-2A600   # 
+
+# total for (SL): 4770
+
+
+# Single-Script, Anycase Confusables
+
+05AD ; 0596 ;  SA      # ( ֭ → ֖ ) HEBREW ACCENT DEHI → HEBREW ACCENT TIPEHA     # 
+
+05AE ; 0598 ;  SA      # ( ֮ → ֘ ) HEBREW ACCENT ZINOR → HEBREW ACCENT ZARQA     # 
+
+05A8 ; 0599 ;  SA      # ( ֨ → ֙ ) HEBREW ACCENT QADMA → HEBREW ACCENT PASHTA    # 
+
+05A4 ; 059A ;  SA      # ( ֤ → ֚ ) HEBREW ACCENT MAHAPAKH → HEBREW ACCENT YETIV  # 
+
+06EC ; 06DF ;  SA      # ( ۬ → ۟ ) ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE → ARABIC SMALL HIGH ROUNDED ZERO  # 
+
+0619 ; 0313 ;  SA      # ( ؙ → ̓ ) ARABIC SMALL DAMMA → COMBINING COMMA ABOVE    # →ُ→
+0343 ; 0313 ;  SA      # ( ̓ → ̓ ) COMBINING GREEK KORONIS → COMBINING COMMA ABOVE       # 
+0315 ; 0313 ;  SA      # ( ̕ → ̓ ) COMBINING COMMA ABOVE RIGHT → COMBINING COMMA ABOVE   # 
+064F ; 0313 ;  SA      # ( ُ → ̓ ) ARABIC DAMMA → COMBINING COMMA ABOVE  # 
+
+059C ; 0301 ;  SA      # ( ֜ → ́ ) HEBREW ACCENT GERESH → COMBINING ACUTE ACCENT # 
+059D ; 0301 ;  SA      # ( ֝ → ́ ) HEBREW ACCENT GERESH MUQDAM → COMBINING ACUTE ACCENT  # →֜→
+0747 ; 0301 ;  SA      # ( ݇ → ́ ) SYRIAC OBLIQUE LINE ABOVE → COMBINING ACUTE ACCENT    # 
+0341 ; 0301 ;  SA      # ( ́ → ́ ) COMBINING ACUTE TONE MARK → COMBINING ACUTE ACCENT    # 
+0954 ; 0301 ;  SA      # ( ॔ → ́ ) DEVANAGARI ACUTE ACCENT → COMBINING ACUTE ACCENT     # 
+
+0340 ; 0300 ;  SA      # ( ̀ → ̀ ) COMBINING GRAVE TONE MARK → COMBINING GRAVE ACCENT    # 
+0953 ; 0300 ;  SA      # ( ॓ → ̀ ) DEVANAGARI GRAVE ACCENT → COMBINING GRAVE ACCENT     # 
+
+030C ; 0306 ;  SA      # ( ̌ → ̆ ) COMBINING CARON → COMBINING BREVE     # 
+036E ; 0306 ;  SA      # ( ͮ → ̆ ) COMBINING LATIN SMALL LETTER V → COMBINING BREVE      # →̌→
+
+0310 ; 0306 0307 ;     SA      # ( ̐ → ̆̇ ) COMBINING CANDRABINDU → COMBINING BREVE, COMBINING DOT ABOVE        # 
+0901 ; 0306 0307 ;     SA      # ( ँ → ̆̇ ) DEVANAGARI SIGN CANDRABINDU → COMBINING BREVE, COMBINING DOT ABOVE # →̐→
+0981 ; 0306 0307 ;     SA      # ( ঁ → ̆̇ ) BENGALI SIGN CANDRABINDU → COMBINING BREVE, COMBINING DOT ABOVE    # →̐→
+0A81 ; 0306 0307 ;     SA      # ( ઁ → ̆̇ ) GUJARATI SIGN CANDRABINDU → COMBINING BREVE, COMBINING DOT ABOVE   # →̐→
+0B01 ; 0306 0307 ;     SA      # ( ଁ → ̆̇ ) ORIYA SIGN CANDRABINDU → COMBINING BREVE, COMBINING DOT ABOVE      # →̐→
+
+0311 ; 0302 ;  SA      # ( ̑ → ̂ ) COMBINING INVERTED BREVE → COMBINING CIRCUMFLEX ACCENT        # 
+07EE ; 0302 ;  SA      # ( ߮ → ̂ ) NKO COMBINING LONG DESCENDING TONE → COMBINING CIRCUMFLEX ACCENT      # 
+
+05AF ; 030A ;  SA      # ( ֯ → ̊ ) HEBREW MARK MASORA CIRCLE → COMBINING RING ABOVE      # 
+17D3 ; 030A ;  SA      # ( ៓ → ̊ ) KHMER SIGN BATHAMASAT → COMBINING RING ABOVE # 
+0B82 ; 030A ;  SA      # ( ஂ → ̊ ) TAMIL SIGN ANUSVARA → COMBINING RING ABOVE   # 
+0E4D ; 030A ;  SA      # ( ํ → ̊ ) THAI CHARACTER NIKHAHIT → COMBINING RING ABOVE       # 
+0ECD ; 030A ;  SA      # ( ໍ → ̊ ) LAO NIGGAHITA → COMBINING RING ABOVE # 
+1036 ; 030A ;  SA      # ( ံ → ̊ ) MYANMAR SIGN ANUSVARA → COMBINING RING ABOVE # 
+17C6 ; 030A ;  SA      # ( ំ → ̊ ) KHMER SIGN NIKAHIT → COMBINING RING ABOVE    # 
+309A ; 030A ;  SA      # ( ゚ → ̊ ) COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK → COMBINING RING ABOVE    # 
+0366 ; 030A ;  SA      # ( ͦ → ̊ ) COMBINING LATIN SMALL LETTER O → COMBINING RING ABOVE # 
+
+07F3 ; 0308 ;  SA      # ( ߳ → ̈ ) NKO COMBINING DOUBLE DOT ABOVE → COMBINING DIAERESIS  # 
+
+0342 ; 0303 ;  SA      # ( ͂ → ̃ ) COMBINING GREEK PERISPOMENI → COMBINING TILDE # 
+
+05C4 ; 0307 ;  SA      # ( ׄ → ̇ ) HEBREW MARK UPPER DOT → COMBINING DOT ABOVE   # 
+0740 ; 0307 ;  SA      # ( ݀ → ̇ ) SYRIAC FEMININE DOT → COMBINING DOT ABOVE     # →݁→
+0741 ; 0307 ;  SA      # ( ݁ → ̇ ) SYRIAC QUSHSHAYA → COMBINING DOT ABOVE        # 
+0358 ; 0307 ;  SA      # ( ͘ → ̇ ) COMBINING DOT ABOVE RIGHT → COMBINING DOT ABOVE       # 
+05B9 ; 0307 ;  SA      # ( ֹ → ̇ ) HEBREW POINT HOLAM → COMBINING DOT ABOVE      # 
+05BA ; 0307 ;  SA      # ( ֺ → ̇ ) HEBREW POINT HOLAM HASER FOR VAV → COMBINING DOT ABOVE        # →ׁ→
+05C2 ; 0307 ;  SA      # ( ׂ → ̇ ) HEBREW POINT SIN DOT → COMBINING DOT ABOVE    # 
+05C1 ; 0307 ;  SA      # ( ׁ → ̇ ) HEBREW POINT SHIN DOT → COMBINING DOT ABOVE   # 
+07ED ; 0307 ;  SA      # ( ߭ → ̇ ) NKO COMBINING SHORT RISING TONE → COMBINING DOT ABOVE # 
+0902 ; 0307 ;  SA      # ( ं → ̇ ) DEVANAGARI SIGN ANUSVARA → COMBINING DOT ABOVE       # 
+0A02 ; 0307 ;  SA      # ( ਂ → ̇ ) GURMUKHI SIGN BINDI → COMBINING DOT ABOVE    # 
+0A82 ; 0307 ;  SA      # ( ં → ̇ ) GUJARATI SIGN ANUSVARA → COMBINING DOT ABOVE # 
+0BCD ; 0307 ;  SA      # ( ் → ̇ ) TAMIL SIGN VIRAMA → COMBINING DOT ABOVE      # 
+
+0337 ; 0338 ;  SA      # ( ̷ → ̸ ) COMBINING SHORT SOLIDUS OVERLAY → COMBINING LONG SOLIDUS OVERLAY      # 
+
+0322 ; 0328 ;  SA      # ( ̢ → ̨ ) COMBINING RETROFLEX HOOK BELOW → COMBINING OGONEK     # 
+0345 ; 0328 ;  SA      # ( ͅ → ̨ ) COMBINING GREEK YPOGEGRAMMENI → COMBINING OGONEK      # 
+
+0305 ; 0304 ;  SA      # ( ̅ → ̄ ) COMBINING OVERLINE → COMBINING MACRON # 
+07EB ; 0304 ;  SA      # ( ߫ → ̄ ) NKO COMBINING SHORT HIGH TONE → COMBINING MACRON      # 
+
+0347 ; 0333 ;  SA      # ( ͇ → ̳ ) COMBINING EQUALS SIGN BELOW → COMBINING DOUBLE LOW LINE       # 
+
+302C ; 0309 ;  SA      # ( 〬 → ̉ ) IDEOGRAPHIC DEPARTING TONE MARK → COMBINING HOOK ABOVE       # 
+
+05C5 ; 0323 ;  SA      # ( ׅ → ̣ ) HEBREW MARK LOWER DOT → COMBINING DOT BELOW   # 
+05B4 ; 0323 ;  SA      # ( ִ → ̣ ) HEBREW POINT HIRIQ → COMBINING DOT BELOW      # 
+093C ; 0323 ;  SA      # ( ़ → ̣ ) DEVANAGARI SIGN NUKTA → COMBINING DOT BELOW  # 
+09BC ; 0323 ;  SA      # ( ় → ̣ ) BENGALI SIGN NUKTA → COMBINING DOT BELOW     # 
+0A3C ; 0323 ;  SA      # ( ਼ → ̣ ) GURMUKHI SIGN NUKTA → COMBINING DOT BELOW    # 
+0ABC ; 0323 ;  SA      # ( ઼ → ̣ ) GUJARATI SIGN NUKTA → COMBINING DOT BELOW    # 
+0B3C ; 0323 ;  SA      # ( ଼ → ̣ ) ORIYA SIGN NUKTA → COMBINING DOT BELOW       # 
+10A3A ;        0323 ;  SA      # ( 𐨺 → ̣ ) KHAROSHTHI SIGN DOT BELOW → COMBINING DOT BELOW     # 
+
+302D ; 0325 ;  SA      # ( 〭 → ̥ ) IDEOGRAPHIC ENTERING TONE MARK → COMBINING RING BELOW        # 
+
+0327 ; 0326 ;  SA      # ( ̧ → ̦ ) COMBINING CEDILLA → COMBINING COMMA BELOW     # →̡→
+0321 ; 0326 ;  SA      # ( ̡ → ̦ ) COMBINING PALATALIZED HOOK BELOW → COMBINING COMMA BELOW      # 
+0339 ; 0326 ;  SA      # ( ̹ → ̦ ) COMBINING RIGHT HALF RING BELOW → COMBINING COMMA BELOW       # →̧→→̡→
+
+0952 ; 0331 ;  SA      # ( ॒ → ̱ ) DEVANAGARI STRESS SIGN ANUDATTA → COMBINING MACRON BELOW     # 
+0320 ; 0331 ;  SA      # ( ̠ → ̱ ) COMBINING MINUS SIGN BELOW → COMBINING MACRON BELOW   # 
+
+0336 ; 0335 ;  SA      # ( ̶ → ̵ ) COMBINING LONG STROKE OVERLAY → COMBINING SHORT STROKE OVERLAY        # 
+
+FC5E ; FE72 0651 ;     SA      #* ( ‎ﱞ‎ → ‎ﹲّ‎ ) ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM → ARABIC DAMMATAN ISOLATED FORM, ARABIC SHADDA    # 
+
+FC5F ; FE74 0651 ;     SA      #* ( ‎ﱟ‎ → ‎ﹴّ‎ ) ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM → ARABIC KASRATAN ISOLATED FORM, ARABIC SHADDA    # 
+
+0618 ; 064E ;  SA      # ( ؘ → َ ) ARABIC SMALL FATHA → ARABIC FATHA     # 
+
+FCF2 ; FE77 0651 ;     SA      # ( ‎ﳲ‎ → ‎ﹷّ‎ ) ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM → ARABIC FATHA MEDIAL FORM, ARABIC SHADDA       # 
+
+FC60 ; FE76 0651 ;     SA      #* ( ‎ﱠ‎ → ‎ﹶّ‎ ) ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM → ARABIC FATHA ISOLATED FORM, ARABIC SHADDA  # 
+FC62 ; FE76 0651 ;     SA      #* ( ‎ﱢ‎ → ‎ﹶّ‎ ) ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM → ARABIC FATHA ISOLATED FORM, ARABIC SHADDA  # →‎ﱠ‎→
+
+FCF3 ; FE79 0651 ;     SA      # ( ‎ﳳ‎ → ‎ﹹّ‎ ) ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM → ARABIC DAMMA MEDIAL FORM, ARABIC SHADDA       # 
+
+FC61 ; FE78 0651 ;     SA      #* ( ‎ﱡ‎ → ‎ﹸّ‎ ) ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM → ARABIC DAMMA ISOLATED FORM, ARABIC SHADDA  # 
+
+061A ; 0650 ;  SA      # ( ؚ → ِ ) ARABIC SMALL KASRA → ARABIC KASRA     # 
+
+FCF4 ; FE7B 0651 ;     SA      # ( ‎ﳴ‎ → ‎ﹻّ‎ ) ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM → ARABIC KASRA MEDIAL FORM, ARABIC SHADDA       # 
+
+FC63 ; FE7C 0670 ;     SA      #* ( ‎ﱣ‎ → ‎ﹼٰ‎ ) ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM → ARABIC SHADDA ISOLATED FORM, ARABIC LETTER SUPERSCRIPT ALEF     # 
+
+0742 ; 073C ;  SA      # ( ݂ → ܼ ) SYRIAC RUKKAKHA → SYRIAC HBASA-ESASA DOTTED   # 
+
+309B ; FF9E ;  SA      #* ( ゛ → ゙ ) KATAKANA-HIRAGANA VOICED SOUND MARK → HALFWIDTH KATAKANA VOICED SOUND MARK # 
+
+309C ; FF9F ;  SA      #* ( ゜ → ゚ ) KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK → HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK       # 
+
+180E ; 0020 ;  SA      #* ( ᠎ →   ) MONGOLIAN VOWEL SEPARATOR → SPACE    # 
+2028 ; 0020 ;  SA      #* (  →   ) LINE SEPARATOR → SPACE  # 
+2029 ; 0020 ;  SA      #* (  →   ) PARAGRAPH SEPARATOR → SPACE     # 
+2000 ; 0020 ;  SA      #* (   →   ) EN QUAD → SPACE      # 
+2001 ; 0020 ;  SA      #* (   →   ) EM QUAD → SPACE      # 
+2002 ; 0020 ;  SA      #* (   →   ) EN SPACE → SPACE     # 
+2003 ; 0020 ;  SA      #* (   →   ) EM SPACE → SPACE     # 
+2004 ; 0020 ;  SA      #* (   →   ) THREE-PER-EM SPACE → SPACE   # 
+2005 ; 0020 ;  SA      #* (   →   ) FOUR-PER-EM SPACE → SPACE    # 
+2006 ; 0020 ;  SA      #* (   →   ) SIX-PER-EM SPACE → SPACE     # 
+2008 ; 0020 ;  SA      #* (   →   ) PUNCTUATION SPACE → SPACE    # 
+2009 ; 0020 ;  SA      #* (   →   ) THIN SPACE → SPACE   # 
+200A ; 0020 ;  SA      #* (   →   ) HAIR SPACE → SPACE   # 
+205F ; 0020 ;  SA      #* (   →   ) MEDIUM MATHEMATICAL SPACE → SPACE    # 
+00A0 ; 0020 ;  SA      #* (   →   ) NO-BREAK SPACE → SPACE        # 
+2007 ; 0020 ;  SA      #* (   →   ) FIGURE SPACE → SPACE # 
+202F ; 0020 ;  SA      #* (   →   ) NARROW NO-BREAK SPACE → SPACE        # 
+1680 ; 0020 ;  SA      #* (   →   ) OGHAM SPACE MARK → SPACE     # 
+
+02C4 ; 005E ;  SA      #* ( ˄ → ^ ) MODIFIER LETTER UP ARROWHEAD → CIRCUMFLEX ACCENT      # 
+02C6 ; 005E ;  SA      # ( ˆ → ^ ) MODIFIER LETTER CIRCUMFLEX ACCENT → CIRCUMFLEX ACCENT  # 
+
+07FA ; 005F ;  SA      # ( ‎ߺ‎ → _ ) NKO LAJANYALAN → LOW LINE        # 
+FE4D ; 005F ;  SA      # ( ﹍ → _ ) DASHED LOW LINE → LOW LINE    # 
+FE4E ; 005F ;  SA      # ( ﹎ → _ ) CENTRELINE LOW LINE → LOW LINE        # 
+FE4F ; 005F ;  SA      # ( ﹏ → _ ) WAVY LOW LINE → LOW LINE      # 
+
+2307 ; FE34 ;  SA      #* ( ⌇ → ︴ ) WAVY LINE → PRESENTATION FORM FOR VERTICAL WAVY LOW LINE   # 
+
+2010 ; 002D ;  SA      #* ( ‐ → - ) HYPHEN → HYPHEN-MINUS        # 
+2011 ; 002D ;  SA      #* ( ‑ → - ) NON-BREAKING HYPHEN → HYPHEN-MINUS   # 
+2012 ; 002D ;  SA      #* ( ‒ → - ) FIGURE DASH → HYPHEN-MINUS   # 
+2013 ; 002D ;  SA      #* ( – → - ) EN DASH → HYPHEN-MINUS       # 
+FE58 ; 002D ;  SA      #* ( ﹘ → - ) SMALL EM DASH → HYPHEN-MINUS # 
+2043 ; 002D ;  SA      #* ( ⁃ → - ) HYPHEN BULLET → HYPHEN-MINUS # →‒→
+02D7 ; 002D ;  SA      #* ( ˗ → - ) MODIFIER LETTER MINUS SIGN → HYPHEN-MINUS     # 
+2212 ; 002D ;  SA      #* ( − → - ) MINUS SIGN → HYPHEN-MINUS    # 
+2CBA ; 002D ;  SA      # ( Ⲻ → - ) COPTIC CAPITAL LETTER DIALECT-P NI → HYPHEN-MINUS     # →‒→
+
+A4FE ; 002D 002E ;     SA      #* ( ꓾ → -. ) LISU PUNCTUATION COMMA → HYPHEN-MINUS, FULL STOP    # 
+
+FF5E ; 301C ;  SA      #* ( ~ → 〜 ) FULLWIDTH TILDE → WAVE DASH        # 
+
+00B8 ; 002C ;  SA      #* ( ¸ → , ) CEDILLA → COMMA       # 
+066B ; 002C ;  SA      #* ( ‎٫‎ → , ) ARABIC DECIMAL SEPARATOR → COMMA        # 
+201A ; 002C ;  SA      #* ( ‚ → , ) SINGLE LOW-9 QUOTATION MARK → COMMA  # 
+
+066C ; 060C ;  SA      #* ( ‎٬‎ → ، ) ARABIC THOUSANDS SEPARATOR → ARABIC COMMA      # 
+
+037E ; 003B ;  SA      #* ( ; → ; ) GREEK QUESTION MARK → SEMICOLON       # 
+
+0903 ; 003A ;  SA      # ( ः → : ) DEVANAGARI SIGN VISARGA → COLON       # 
+0A83 ; 003A ;  SA      # ( ઃ → : ) GUJARATI SIGN VISARGA → COLON # 
+FF1A ; 003A ;  SA      #* ( : → : ) FULLWIDTH COLON → COLON      # →︰→
+0589 ; 003A ;  SA      #* ( ։ → : ) ARMENIAN FULL STOP → COLON    # 
+0703 ; 003A ;  SA      #* ( ‎܃‎ → : ) SYRIAC SUPRALINEAR COLON → COLON        # 
+0704 ; 003A ;  SA      #* ( ‎܄‎ → : ) SYRIAC SUBLINEAR COLON → COLON  # 
+FE30 ; 003A ;  SA      #* ( ︰ → : ) PRESENTATION FORM FOR VERTICAL TWO DOT LEADER → COLON        # 
+1803 ; 003A ;  SA      #* ( ᠃ → : ) MONGOLIAN FULL STOP → COLON  # 
+1809 ; 003A ;  SA      #* ( ᠉ → : ) MONGOLIAN MANCHU FULL STOP → COLON   # 
+205A ; 003A ;  SA      #* ( ⁚ → : ) TWO DOT PUNCTUATION → COLON  # 
+05C3 ; 003A ;  SA      #* ( ‎׃‎ → : ) HEBREW PUNCTUATION SOF PASUQ → COLON    # 
+02F8 ; 003A ;  SA      #* ( ˸ → : ) MODIFIER LETTER RAISED COLON → COLON  # 
+A789 ; 003A ;  SA      #* ( ꞉ → : ) MODIFIER LETTER COLON → COLON        # 
+2236 ; 003A ;  SA      #* ( ∶ → : ) RATIO → COLON        # 
+02D0 ; 003A ;  SA      # ( ː → : ) MODIFIER LETTER TRIANGULAR COLON → COLON       # 
+A4FD ; 003A ;  SA      # ( ꓽ → : ) LISU LETTER TONE MYA JEU → COLON      # 
+
+2A74 ; 003A 003A 003D ;        SA      #* ( ⩴ → ::= ) DOUBLE COLON EQUAL → COLON, COLON, EQUALS SIGN     # 
+
+FF01 ; 0021 ;  SA      #* ( ! → ! ) FULLWIDTH EXCLAMATION MARK → EXCLAMATION MARK        # →ǃ→
+01C3 ; 0021 ;  SA      # ( ǃ → ! ) LATIN LETTER RETROFLEX CLICK → EXCLAMATION MARK        # 
+
+203C ; 0021 0021 ;     SA      #* ( ‼ → !! ) DOUBLE EXCLAMATION MARK → EXCLAMATION MARK, EXCLAMATION MARK        # 
+
+2049 ; 0021 003F ;     SA      #* ( ⁉ → !? ) EXCLAMATION QUESTION MARK → EXCLAMATION MARK, QUESTION MARK # 
+
+0294 ; 003F ;  SA      # ( ʔ → ? ) LATIN LETTER GLOTTAL STOP → QUESTION MARK      # 
+0241 ; 003F ;  SA      # ( Ɂ → ? ) LATIN CAPITAL LETTER GLOTTAL STOP → QUESTION MARK      # →ʔ→
+097D ; 003F ;  SA      # ( ॽ → ? ) DEVANAGARI LETTER GLOTTAL STOP → QUESTION MARK        # 
+
+2048 ; 003F 0021 ;     SA      #* ( ⁈ → ?! ) QUESTION EXCLAMATION MARK → QUESTION MARK, EXCLAMATION MARK # 
+
+2047 ; 003F 003F ;     SA      #* ( ⁇ → ?? ) DOUBLE QUESTION MARK → QUESTION MARK, QUESTION MARK # 
+
+1D16D ;        002E ;  SA      # ( 𝅭 → . ) MUSICAL SYMBOL COMBINING AUGMENTATION DOT → FULL STOP        # 
+2024 ; 002E ;  SA      #* ( ․ → . ) ONE DOT LEADER → FULL STOP   # 
+06D4 ; 002E ;  SA      #* ( ‎۔‎ → . ) ARABIC FULL STOP → FULL STOP    # 
+0701 ; 002E ;  SA      #* ( ‎܁‎ → . ) SYRIAC SUPRALINEAR FULL STOP → FULL STOP        # 
+0702 ; 002E ;  SA      #* ( ‎܂‎ → . ) SYRIAC SUBLINEAR FULL STOP → FULL STOP  # 
+A60E ; 002E ;  SA      #* ( ꘎ → . ) VAI FULL STOP → FULL STOP    # 
+10A50 ;        002E ;  SA      #* ( ‎𐩐‎ → . ) KHAROSHTHI PUNCTUATION DOT → FULL STOP        # 
+0660 ; 002E ;  SA      # ( ‎٠‎ → . ) ARABIC-INDIC DIGIT ZERO → FULL STOP      # 
+06F0 ; 002E ;  SA      # ( ۰ → . ) EXTENDED ARABIC-INDIC DIGIT ZERO → FULL STOP   # →‎٠‎→
+A4F8 ; 002E ;  SA      # ( ꓸ → . ) LISU LETTER TONE MYA TI → FULL STOP   # 
+A4FB ; 002E ;  SA      # ( ꓻ → . ) LISU LETTER TONE MYA BO → FULL STOP   # 
+
+2025 ; 002E 002E ;     SA      #* ( ‥ → .. ) TWO DOT LEADER → FULL STOP, FULL STOP       # 
+A4FA ; 002E 002E ;     SA      # ( ꓺ → .. ) LISU LETTER TONE MYA CYA → FULL STOP, FULL STOP      # 
+
+2026 ; 002E 002E 002E ;        SA      #* ( … → ... ) HORIZONTAL ELLIPSIS → FULL STOP, FULL STOP, FULL STOP      # 
+
+30FB ; 00B7 ;  SA      #* ( ・ → · ) KATAKANA MIDDLE DOT → MIDDLE DOT    # →•→
+FF65 ; 00B7 ;  SA      #* ( ・ → · ) HALFWIDTH KATAKANA MIDDLE DOT → MIDDLE DOT  # →•→
+0387 ; 00B7 ;  SA      # ( · → · ) GREEK ANO TELEIA → MIDDLE DOT # 
+10101 ;        00B7 ;  SA      #* ( 𐄁 → · ) AEGEAN WORD SEPARATOR DOT → MIDDLE DOT     # 
+2022 ; 00B7 ;  SA      #* ( • → · ) BULLET → MIDDLE DOT # 
+2027 ; 00B7 ;  SA      #* ( ‧ → · ) HYPHENATION POINT → MIDDLE DOT      # 
+2219 ; 00B7 ;  SA      #* ( ∙ → · ) BULLET OPERATOR → MIDDLE DOT        # 
+22C5 ; 00B7 ;  SA      #* ( ⋅ → · ) DOT OPERATOR → MIDDLE DOT   # 
+1427 ; 00B7 ;  SA      # ( ᐧ → · ) CANADIAN SYLLABICS FINAL MIDDLE DOT → MIDDLE DOT     # 
+
+22EF ; 00B7 00B7 00B7 ;        SA      #* ( ⋯ → ··· ) MIDLINE HORIZONTAL ELLIPSIS → MIDDLE DOT, MIDDLE DOT, MIDDLE DOT        # 
+
+152F ; 00B7 0034 ;     SA      # ( ᔯ → ·4 ) CANADIAN SYLLABICS YWE → MIDDLE DOT, DIGIT FOUR     # →ᐧ4→
+
+140C ; 00B7 1401 ;     SA      # ( ᐌ → ·ᐁ ) CANADIAN SYLLABICS WE → MIDDLE DOT, CANADIAN SYLLABICS E  # →ᐧᐁ→
+
+140E ; 00B7 1403 ;     SA      # ( ᐎ → ·ᐃ ) CANADIAN SYLLABICS WI → MIDDLE DOT, CANADIAN SYLLABICS I  # →ᐧᐃ→
+
+1410 ; 00B7 1404 ;     SA      # ( ᐐ → ·ᐄ ) CANADIAN SYLLABICS WII → MIDDLE DOT, CANADIAN SYLLABICS II        # →ᐧᐄ→
+
+1412 ; 00B7 1405 ;     SA      # ( ᐒ → ·ᐅ ) CANADIAN SYLLABICS WO → MIDDLE DOT, CANADIAN SYLLABICS O  # →ᐧᐅ→
+
+1414 ; 00B7 1406 ;     SA      # ( ᐔ → ·ᐆ ) CANADIAN SYLLABICS WOO → MIDDLE DOT, CANADIAN SYLLABICS OO        # →ᐧᐆ→
+
+1417 ; 00B7 140A ;     SA      # ( ᐗ → ·ᐊ ) CANADIAN SYLLABICS WA → MIDDLE DOT, CANADIAN SYLLABICS A  # →ᐧᐊ→
+
+1419 ; 00B7 140B ;     SA      # ( ᐙ → ·ᐋ ) CANADIAN SYLLABICS WAA → MIDDLE DOT, CANADIAN SYLLABICS AA        # →ᐧᐋ→
+
+1437 ; 00B7 1433 ;     SA      # ( ᐷ → ·ᐳ ) CANADIAN SYLLABICS CARRIER HI → MIDDLE DOT, CANADIAN SYLLABICS PO # →ᑀ→→ᐧᐳ→
+1440 ; 00B7 1433 ;     SA      # ( ᑀ → ·ᐳ ) CANADIAN SYLLABICS PWO → MIDDLE DOT, CANADIAN SYLLABICS PO        # →ᐧᐳ→
+
+1442 ; 00B7 1434 ;     SA      # ( ᑂ → ·ᐴ ) CANADIAN SYLLABICS PWOO → MIDDLE DOT, CANADIAN SYLLABICS POO      # →ᐧᐴ→
+
+1444 ; 00B7 1438 ;     SA      # ( ᑄ → ·ᐸ ) CANADIAN SYLLABICS PWA → MIDDLE DOT, CANADIAN SYLLABICS PA        # →ᐧᐸ→
+
+1446 ; 00B7 1439 ;     SA      # ( ᑆ → ·ᐹ ) CANADIAN SYLLABICS PWAA → MIDDLE DOT, CANADIAN SYLLABICS PAA      # →ᐧᐹ→
+
+1457 ; 00B7 144C ;     SA      # ( ᑗ → ·ᑌ ) CANADIAN SYLLABICS TWE → MIDDLE DOT, CANADIAN SYLLABICS TE        # →ᐧᑌ→
+
+1459 ; 00B7 144E ;     SA      # ( ᑙ → ·ᑎ ) CANADIAN SYLLABICS TWI → MIDDLE DOT, CANADIAN SYLLABICS TI        # →ᐧᑎ→
+
+145B ; 00B7 144F ;     SA      # ( ᑛ → ·ᑏ ) CANADIAN SYLLABICS TWII → MIDDLE DOT, CANADIAN SYLLABICS TII      # →ᐧᑏ→
+
+1454 ; 00B7 1450 ;     SA      # ( ᑔ → ·ᑐ ) CANADIAN SYLLABICS CARRIER DI → MIDDLE DOT, CANADIAN SYLLABICS TO # →ᑝ→→ᐧᑐ→
+145D ; 00B7 1450 ;     SA      # ( ᑝ → ·ᑐ ) CANADIAN SYLLABICS TWO → MIDDLE DOT, CANADIAN SYLLABICS TO        # →ᐧᑐ→
+
+145F ; 00B7 1451 ;     SA      # ( ᑟ → ·ᑑ ) CANADIAN SYLLABICS TWOO → MIDDLE DOT, CANADIAN SYLLABICS TOO      # →ᐧᑑ→
+
+1461 ; 00B7 1455 ;     SA      # ( ᑡ → ·ᑕ ) CANADIAN SYLLABICS TWA → MIDDLE DOT, CANADIAN SYLLABICS TA        # →ᐧᑕ→
+
+1463 ; 00B7 1456 ;     SA      # ( ᑣ → ·ᑖ ) CANADIAN SYLLABICS TWAA → MIDDLE DOT, CANADIAN SYLLABICS TAA      # →ᐧᑖ→
+
+1474 ; 00B7 146B ;     SA      # ( ᑴ → ·ᑫ ) CANADIAN SYLLABICS KWE → MIDDLE DOT, CANADIAN SYLLABICS KE        # →ᐧᑫ→
+
+1478 ; 00B7 146E ;     SA      # ( ᑸ → ·ᑮ ) CANADIAN SYLLABICS KWII → MIDDLE DOT, CANADIAN SYLLABICS KII      # →ᐧᑮ→
+
+147C ; 00B7 1470 ;     SA      # ( ᑼ → ·ᑰ ) CANADIAN SYLLABICS KWOO → MIDDLE DOT, CANADIAN SYLLABICS KOO      # →ᐧᑰ→
+
+147E ; 00B7 1472 ;     SA      # ( ᑾ → ·ᑲ ) CANADIAN SYLLABICS KWA → MIDDLE DOT, CANADIAN SYLLABICS KA        # →ᐧᑲ→
+
+1480 ; 00B7 1473 ;     SA      # ( ᒀ → ·ᑳ ) CANADIAN SYLLABICS KWAA → MIDDLE DOT, CANADIAN SYLLABICS KAA      # →ᐧᑳ→
+
+1492 ; 00B7 1489 ;     SA      # ( ᒒ → ·ᒉ ) CANADIAN SYLLABICS CWE → MIDDLE DOT, CANADIAN SYLLABICS CE        # →ᐧᒉ→
+
+1494 ; 00B7 148B ;     SA      # ( ᒔ → ·ᒋ ) CANADIAN SYLLABICS CWI → MIDDLE DOT, CANADIAN SYLLABICS CI        # →ᐧᒋ→
+
+1496 ; 00B7 148C ;     SA      # ( ᒖ → ·ᒌ ) CANADIAN SYLLABICS CWII → MIDDLE DOT, CANADIAN SYLLABICS CII      # →ᐧᒌ→
+
+149A ; 00B7 148E ;     SA      # ( ᒚ → ·ᒎ ) CANADIAN SYLLABICS CWOO → MIDDLE DOT, CANADIAN SYLLABICS COO      # →ᐧᒎ→
+
+149C ; 00B7 1490 ;     SA      # ( ᒜ → ·ᒐ ) CANADIAN SYLLABICS CWA → MIDDLE DOT, CANADIAN SYLLABICS CA        # →ᐧᒐ→
+
+149E ; 00B7 1491 ;     SA      # ( ᒞ → ·ᒑ ) CANADIAN SYLLABICS CWAA → MIDDLE DOT, CANADIAN SYLLABICS CAA      # →ᐧᒑ→
+
+14AC ; 00B7 14A3 ;     SA      # ( ᒬ → ·ᒣ ) CANADIAN SYLLABICS MWE → MIDDLE DOT, CANADIAN SYLLABICS ME        # →ᐧᒣ→
+
+14AE ; 00B7 14A5 ;     SA      # ( ᒮ → ·ᒥ ) CANADIAN SYLLABICS MWI → MIDDLE DOT, CANADIAN SYLLABICS MI        # →ᐧᒥ→
+
+14B0 ; 00B7 14A6 ;     SA      # ( ᒰ → ·ᒦ ) CANADIAN SYLLABICS MWII → MIDDLE DOT, CANADIAN SYLLABICS MII      # →ᐧᒦ→
+
+14B2 ; 00B7 14A7 ;     SA      # ( ᒲ → ·ᒧ ) CANADIAN SYLLABICS MWO → MIDDLE DOT, CANADIAN SYLLABICS MO        # →ᐧᒧ→
+
+14B4 ; 00B7 14A8 ;     SA      # ( ᒴ → ·ᒨ ) CANADIAN SYLLABICS MWOO → MIDDLE DOT, CANADIAN SYLLABICS MOO      # →ᐧᒨ→
+
+14B6 ; 00B7 14AA ;     SA      # ( ᒶ → ·ᒪ ) CANADIAN SYLLABICS MWA → MIDDLE DOT, CANADIAN SYLLABICS MA        # →ᐧᒪ→
+
+14B8 ; 00B7 14AB ;     SA      # ( ᒸ → ·ᒫ ) CANADIAN SYLLABICS MWAA → MIDDLE DOT, CANADIAN SYLLABICS MAA      # →ᐧᒫ→
+
+14C9 ; 00B7 14C0 ;     SA      # ( ᓉ → ·ᓀ ) CANADIAN SYLLABICS NWE → MIDDLE DOT, CANADIAN SYLLABICS NE        # →ᐧᓀ→
+
+14CB ; 00B7 14C7 ;     SA      # ( ᓋ → ·ᓇ ) CANADIAN SYLLABICS NWA → MIDDLE DOT, CANADIAN SYLLABICS NA        # →ᐧᓇ→
+
+14CD ; 00B7 14C8 ;     SA      # ( ᓍ → ·ᓈ ) CANADIAN SYLLABICS NWAA → MIDDLE DOT, CANADIAN SYLLABICS NAA      # →ᐧᓈ→
+
+14DC ; 00B7 14D3 ;     SA      # ( ᓜ → ·ᓓ ) CANADIAN SYLLABICS LWE → MIDDLE DOT, CANADIAN SYLLABICS LE        # →ᐧᓓ→
+
+14DE ; 00B7 14D5 ;     SA      # ( ᓞ → ·ᓕ ) CANADIAN SYLLABICS LWI → MIDDLE DOT, CANADIAN SYLLABICS LI        # →ᐧᓕ→
+
+14E0 ; 00B7 14D6 ;     SA      # ( ᓠ → ·ᓖ ) CANADIAN SYLLABICS LWII → MIDDLE DOT, CANADIAN SYLLABICS LII      # →ᐧᓖ→
+
+14E2 ; 00B7 14D7 ;     SA      # ( ᓢ → ·ᓗ ) CANADIAN SYLLABICS LWO → MIDDLE DOT, CANADIAN SYLLABICS LO        # →ᐧᓗ→
+
+14E4 ; 00B7 14D8 ;     SA      # ( ᓤ → ·ᓘ ) CANADIAN SYLLABICS LWOO → MIDDLE DOT, CANADIAN SYLLABICS LOO      # →ᐧᓘ→
+
+14E6 ; 00B7 14DA ;     SA      # ( ᓦ → ·ᓚ ) CANADIAN SYLLABICS LWA → MIDDLE DOT, CANADIAN SYLLABICS LA        # →ᐧᓚ→
+
+14E8 ; 00B7 14DB ;     SA      # ( ᓨ → ·ᓛ ) CANADIAN SYLLABICS LWAA → MIDDLE DOT, CANADIAN SYLLABICS LAA      # →ᐧᓛ→
+
+14F6 ; 00B7 14ED ;     SA      # ( ᓶ → ·ᓭ ) CANADIAN SYLLABICS SWE → MIDDLE DOT, CANADIAN SYLLABICS SE        # →ᐧᓭ→
+
+14F8 ; 00B7 14EF ;     SA      # ( ᓸ → ·ᓯ ) CANADIAN SYLLABICS SWI → MIDDLE DOT, CANADIAN SYLLABICS SI        # →ᐧᓯ→
+
+14FA ; 00B7 14F0 ;     SA      # ( ᓺ → ·ᓰ ) CANADIAN SYLLABICS SWII → MIDDLE DOT, CANADIAN SYLLABICS SII      # →ᐧᓰ→
+
+14FC ; 00B7 14F1 ;     SA      # ( ᓼ → ·ᓱ ) CANADIAN SYLLABICS SWO → MIDDLE DOT, CANADIAN SYLLABICS SO        # →ᐧᓱ→
+
+14FE ; 00B7 14F2 ;     SA      # ( ᓾ → ·ᓲ ) CANADIAN SYLLABICS SWOO → MIDDLE DOT, CANADIAN SYLLABICS SOO      # →ᐧᓲ→
+
+1500 ; 00B7 14F4 ;     SA      # ( ᔀ → ·ᓴ ) CANADIAN SYLLABICS SWA → MIDDLE DOT, CANADIAN SYLLABICS SA        # →ᐧᓴ→
+
+1502 ; 00B7 14F5 ;     SA      # ( ᔂ → ·ᓵ ) CANADIAN SYLLABICS SWAA → MIDDLE DOT, CANADIAN SYLLABICS SAA      # →ᐧᓵ→
+
+1517 ; 00B7 1510 ;     SA      # ( ᔗ → ·ᔐ ) CANADIAN SYLLABICS SHWE → MIDDLE DOT, CANADIAN SYLLABICS SHE      # →ᐧᔐ→
+
+1519 ; 00B7 1511 ;     SA      # ( ᔙ → ·ᔑ ) CANADIAN SYLLABICS SHWI → MIDDLE DOT, CANADIAN SYLLABICS SHI      # →ᐧᔑ→
+
+151B ; 00B7 1512 ;     SA      # ( ᔛ → ·ᔒ ) CANADIAN SYLLABICS SHWII → MIDDLE DOT, CANADIAN SYLLABICS SHII    # →ᐧᔒ→
+
+151D ; 00B7 1513 ;     SA      # ( ᔝ → ·ᔓ ) CANADIAN SYLLABICS SHWO → MIDDLE DOT, CANADIAN SYLLABICS SHO      # →ᐧᔓ→
+
+151F ; 00B7 1514 ;     SA      # ( ᔟ → ·ᔔ ) CANADIAN SYLLABICS SHWOO → MIDDLE DOT, CANADIAN SYLLABICS SHOO    # →ᐧᔔ→
+
+1521 ; 00B7 1515 ;     SA      # ( ᔡ → ·ᔕ ) CANADIAN SYLLABICS SHWA → MIDDLE DOT, CANADIAN SYLLABICS SHA      # →ᐧᔕ→
+
+1523 ; 00B7 1516 ;     SA      # ( ᔣ → ·ᔖ ) CANADIAN SYLLABICS SHWAA → MIDDLE DOT, CANADIAN SYLLABICS SHAA    # →ᐧᔖ→
+
+1531 ; 00B7 1528 ;     SA      # ( ᔱ → ·ᔨ ) CANADIAN SYLLABICS YWI → MIDDLE DOT, CANADIAN SYLLABICS YI        # →ᐧᔨ→
+
+1533 ; 00B7 1529 ;     SA      # ( ᔳ → ·ᔩ ) CANADIAN SYLLABICS YWII → MIDDLE DOT, CANADIAN SYLLABICS YII      # →ᐧᔩ→
+
+1535 ; 00B7 152A ;     SA      # ( ᔵ → ·ᔪ ) CANADIAN SYLLABICS YWO → MIDDLE DOT, CANADIAN SYLLABICS YO        # →ᐧᔪ→
+
+1537 ; 00B7 152B ;     SA      # ( ᔷ → ·ᔫ ) CANADIAN SYLLABICS YWOO → MIDDLE DOT, CANADIAN SYLLABICS YOO      # →ᐧᔫ→
+
+1539 ; 00B7 152D ;     SA      # ( ᔹ → ·ᔭ ) CANADIAN SYLLABICS YWA → MIDDLE DOT, CANADIAN SYLLABICS YA        # →ᐧᔭ→
+
+153B ; 00B7 152E ;     SA      # ( ᔻ → ·ᔮ ) CANADIAN SYLLABICS YWAA → MIDDLE DOT, CANADIAN SYLLABICS YAA      # →ᐧᔮ→
+
+154E ; 00B7 154C ;     SA      # ( ᕎ → ·ᕌ ) CANADIAN SYLLABICS RWAA → MIDDLE DOT, CANADIAN SYLLABICS RAA      # →ᐧᕌ→
+
+155B ; 00B7 155A ;     SA      # ( ᕛ → ·ᕚ ) CANADIAN SYLLABICS FWAA → MIDDLE DOT, CANADIAN SYLLABICS FAA      # →ᐧᕚ→
+
+1568 ; 00B7 1567 ;     SA      # ( ᕨ → ·ᕧ ) CANADIAN SYLLABICS THWAA → MIDDLE DOT, CANADIAN SYLLABICS THAA    # →ᐧᕧ→
+
+FE19 ; 205D ;  SA      #* ( ︙ → ⁝ ) PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS → TRICOLON      # 
+22EE ; 205D ;  SA      #* ( ⋮ → ⁝ ) VERTICAL ELLIPSIS → TRICOLON       # →︙→
+
+0060 ; 0027 ;  SA      #* ( ` → ' ) GRAVE ACCENT → APOSTROPHE      # →ˋ→→`→→‘→
+1FEF ; 0027 ;  SA      #* ( ` → ' ) GREEK VARIA → APOSTROPHE     # →ˋ→→`→→‘→
+FF40 ; 0027 ;  SA      #* ( ` → ' ) FULLWIDTH GRAVE ACCENT → APOSTROPHE  # →‘→
+00B4 ; 0027 ;  SA      #* ( ´ → ' ) ACUTE ACCENT → APOSTROPHE     # →΄→→ʹ→
+0384 ; 0027 ;  SA      #* ( ΄ → ' ) GREEK TONOS → APOSTROPHE      # →ʹ→
+1FFD ; 0027 ;  SA      #* ( ´ → ' ) GREEK OXIA → APOSTROPHE      # →ˊ→→ʹ→→′→
+1FBD ; 0027 ;  SA      #* ( ᾽ → ' ) GREEK KORONIS → APOSTROPHE   # →’→
+1FBF ; 0027 ;  SA      #* ( ᾿ → ' ) GREEK PSILI → APOSTROPHE     # →’→
+1FFE ; 0027 ;  SA      #* ( ῾ → ' ) GREEK DASIA → APOSTROPHE     # →‛→→′→
+055D ; 0027 ;  SA      #* ( ՝ → ' ) ARMENIAN COMMA → APOSTROPHE   # →ˋ→→`→→‘→
+FF07 ; 0027 ;  SA      #* ( ' → ' ) FULLWIDTH APOSTROPHE → APOSTROPHE    # →’→
+2018 ; 0027 ;  SA      #* ( ‘ → ' ) LEFT SINGLE QUOTATION MARK → APOSTROPHE      # 
+2019 ; 0027 ;  SA      #* ( ’ → ' ) RIGHT SINGLE QUOTATION MARK → APOSTROPHE     # 
+201B ; 0027 ;  SA      #* ( ‛ → ' ) SINGLE HIGH-REVERSED-9 QUOTATION MARK → APOSTROPHE   # →′→
+2032 ; 0027 ;  SA      #* ( ′ → ' ) PRIME → APOSTROPHE   # 
+2035 ; 0027 ;  SA      #* ( ‵ → ' ) REVERSED PRIME → APOSTROPHE  # →ʽ→→‘→
+055A ; 0027 ;  SA      #* ( ՚ → ' ) ARMENIAN APOSTROPHE → APOSTROPHE      # →’→
+05F3 ; 0027 ;  SA      #* ( ‎׳‎ → ' ) HEBREW PUNCTUATION GERESH → APOSTROPHE  # 
+02B9 ; 0027 ;  SA      # ( ʹ → ' ) MODIFIER LETTER PRIME → APOSTROPHE     # 
+0374 ; 0027 ;  SA      # ( ʹ → ' ) GREEK NUMERAL SIGN → APOSTROPHE        # →′→
+02CA ; 0027 ;  SA      # ( ˊ → ' ) MODIFIER LETTER ACUTE ACCENT → APOSTROPHE      # →ʹ→→′→
+02CB ; 0027 ;  SA      # ( ˋ → ' ) MODIFIER LETTER GRAVE ACCENT → APOSTROPHE      # →`→→‘→
+02F4 ; 0027 ;  SA      #* ( ˴ → ' ) MODIFIER LETTER MIDDLE GRAVE ACCENT → APOSTROPHE      # →ˋ→→`→→‘→
+02BB ; 0027 ;  SA      # ( ʻ → ' ) MODIFIER LETTER TURNED COMMA → APOSTROPHE      # →‘→
+02BD ; 0027 ;  SA      # ( ʽ → ' ) MODIFIER LETTER REVERSED COMMA → APOSTROPHE    # →‘→
+02BC ; 0027 ;  SA      # ( ʼ → ' ) MODIFIER LETTER APOSTROPHE → APOSTROPHE        # →′→
+02BE ; 0027 ;  SA      # ( ʾ → ' ) MODIFIER LETTER RIGHT HALF RING → APOSTROPHE   # →ʼ→→′→
+A78C ; 0027 ;  SA      # ( ꞌ → ' ) LATIN SMALL LETTER SALTILLO → APOSTROPHE      # 
+05D9 ; 0027 ;  SA      # ( ‎י‎ → ' ) HEBREW LETTER YOD → APOSTROPHE   # 
+07F4 ; 0027 ;  SA      # ( ‎ߴ‎ → ' ) NKO HIGH TONE APOSTROPHE → APOSTROPHE    # →’→
+07F5 ; 0027 ;  SA      # ( ‎ߵ‎ → ' ) NKO LOW TONE APOSTROPHE → APOSTROPHE     # →‘→
+
+02DD ; 0027 0027 ;     SA      #* ( ˝ → '' ) DOUBLE ACUTE ACCENT → APOSTROPHE, APOSTROPHE # →"→
+0022 ; 0027 0027 ;     SA      #* ( " → '' ) QUOTATION MARK → APOSTROPHE, APOSTROPHE       # 
+FF02 ; 0027 0027 ;     SA      #* ( " → '' ) FULLWIDTH QUOTATION MARK → APOSTROPHE, APOSTROPHE   # →”→→"→
+201C ; 0027 0027 ;     SA      #* ( “ → '' ) LEFT DOUBLE QUOTATION MARK → APOSTROPHE, APOSTROPHE # →"→
+201D ; 0027 0027 ;     SA      #* ( ” → '' ) RIGHT DOUBLE QUOTATION MARK → APOSTROPHE, APOSTROPHE        # →"→
+201F ; 0027 0027 ;     SA      #* ( ‟ → '' ) DOUBLE HIGH-REVERSED-9 QUOTATION MARK → APOSTROPHE, APOSTROPHE      # →”→→"→
+2033 ; 0027 0027 ;     SA      #* ( ″ → '' ) DOUBLE PRIME → APOSTROPHE, APOSTROPHE       # →"→
+2036 ; 0027 0027 ;     SA      #* ( ‶ → '' ) REVERSED DOUBLE PRIME → APOSTROPHE, APOSTROPHE      # →‵‵→
+3003 ; 0027 0027 ;     SA      #* ( 〃 → '' ) DITTO MARK → APOSTROPHE, APOSTROPHE # →″→→"→
+05F4 ; 0027 0027 ;     SA      #* ( ‎״‎ → '' ) HEBREW PUNCTUATION GERSHAYIM → APOSTROPHE, APOSTROPHE  # →"→
+02BA ; 0027 0027 ;     SA      # ( ʺ → '' ) MODIFIER LETTER DOUBLE PRIME → APOSTROPHE, APOSTROPHE # →"→
+02F6 ; 0027 0027 ;     SA      #* ( ˶ → '' ) MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT → APOSTROPHE, APOSTROPHE  # →˝→→"→
+02EE ; 0027 0027 ;     SA      # ( ˮ → '' ) MODIFIER LETTER DOUBLE APOSTROPHE → APOSTROPHE, APOSTROPHE    # →″→→"→
+05F2 ; 0027 0027 ;     SA      # ( ‎ײ‎ → '' ) HEBREW LIGATURE YIDDISH DOUBLE YOD → APOSTROPHE, APOSTROPHE     # →‎יי‎→
+
+2034 ; 0027 0027 0027 ;        SA      #* ( ‴ → ''' ) TRIPLE PRIME → APOSTROPHE, APOSTROPHE, APOSTROPHE  # →′′′→
+2037 ; 0027 0027 0027 ;        SA      #* ( ‷ → ''' ) REVERSED TRIPLE PRIME → APOSTROPHE, APOSTROPHE, APOSTROPHE # →‵‵‵→
+
+2057 ; 0027 0027 0027 0027 ;   SA      #* ( ⁗ → '''' ) QUADRUPLE PRIME → APOSTROPHE, APOSTROPHE, APOSTROPHE, APOSTROPHE  # →′′′′→
+
+0181 ; 0027 0042 ;     SA      # ( Ɓ → 'B ) LATIN CAPITAL LETTER B WITH HOOK → APOSTROPHE, LATIN CAPITAL LETTER B # →ʽB→
+
+018A ; 0027 0044 ;     SA      # ( Ɗ → 'D ) LATIN CAPITAL LETTER D WITH HOOK → APOSTROPHE, LATIN CAPITAL LETTER D # →ʽD→
+
+0149 ; 0027 006E ;     SA      # ( ʼn → 'n ) LATIN SMALL LETTER N PRECEDED BY APOSTROPHE → APOSTROPHE, LATIN SMALL LETTER N        # →ʼn→
+
+01A4 ; 0027 0050 ;     SA      # ( Ƥ → 'P ) LATIN CAPITAL LETTER P WITH HOOK → APOSTROPHE, LATIN CAPITAL LETTER P # →ʽP→
+
+01AC ; 0027 0054 ;     SA      # ( Ƭ → 'T ) LATIN CAPITAL LETTER T WITH HOOK → APOSTROPHE, LATIN CAPITAL LETTER T # →ʽT→
+
+01B3 ; 0027 0059 ;     SA      # ( Ƴ → 'Y ) LATIN CAPITAL LETTER Y WITH HOOK → APOSTROPHE, LATIN CAPITAL LETTER Y # →ʽY→
+
+FF3B ; 0028 ;  SA      #* ( [ → ( ) FULLWIDTH LEFT SQUARE BRACKET → LEFT PARENTHESIS     # →〔→
+3014 ; 0028 ;  SA      #* ( 〔 → ( ) LEFT TORTOISE SHELL BRACKET → LEFT PARENTHESIS       # 
+FD3E ; 0028 ;  SA      #* ( ﴾ → ( ) ORNATE LEFT PARENTHESIS → LEFT PARENTHESIS   # 
+2768 ; 0028 ;  SA      #* ( ❨ → ( ) MEDIUM LEFT PARENTHESIS ORNAMENT → LEFT PARENTHESIS  # 
+2772 ; 0028 ;  SA      #* ( ❲ → ( ) LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT → LEFT PARENTHESIS        # →〔→
+
+3220 ; 0028 30FC 0029 ;        SA      #* ( ㈠ → (ー) ) PARENTHESIZED IDEOGRAPH ONE → LEFT PARENTHESIS, KATAKANA-HIRAGANA PROLONGED SOUND MARK, RIGHT PARENTHESIS        # →(一)→
+
+2475 ; 0028 0032 0029 ;        SA      #* ( ⑵ → (2) ) PARENTHESIZED DIGIT TWO → LEFT PARENTHESIS, DIGIT TWO, RIGHT PARENTHESIS   # 
+
+2487 ; 0028 0032 004F 0029 ;   SA      #* ( ⒇ → (2O) ) PARENTHESIZED NUMBER TWENTY → LEFT PARENTHESIS, DIGIT TWO, LATIN CAPITAL LETTER O, RIGHT PARENTHESIS      # →(20)→
+
+2476 ; 0028 0033 0029 ;        SA      #* ( ⑶ → (3) ) PARENTHESIZED DIGIT THREE → LEFT PARENTHESIS, DIGIT THREE, RIGHT PARENTHESIS       # 
+
+2477 ; 0028 0034 0029 ;        SA      #* ( ⑷ → (4) ) PARENTHESIZED DIGIT FOUR → LEFT PARENTHESIS, DIGIT FOUR, RIGHT PARENTHESIS # 
+
+2478 ; 0028 0035 0029 ;        SA      #* ( ⑸ → (5) ) PARENTHESIZED DIGIT FIVE → LEFT PARENTHESIS, DIGIT FIVE, RIGHT PARENTHESIS # 
+
+2479 ; 0028 0036 0029 ;        SA      #* ( ⑹ → (6) ) PARENTHESIZED DIGIT SIX → LEFT PARENTHESIS, DIGIT SIX, RIGHT PARENTHESIS   # 
+
+247A ; 0028 0037 0029 ;        SA      #* ( ⑺ → (7) ) PARENTHESIZED DIGIT SEVEN → LEFT PARENTHESIS, DIGIT SEVEN, RIGHT PARENTHESIS       # 
+
+247B ; 0028 0038 0029 ;        SA      #* ( ⑻ → (8) ) PARENTHESIZED DIGIT EIGHT → LEFT PARENTHESIS, DIGIT EIGHT, RIGHT PARENTHESIS       # 
+
+247C ; 0028 0039 0029 ;        SA      #* ( ⑼ → (9) ) PARENTHESIZED DIGIT NINE → LEFT PARENTHESIS, DIGIT NINE, RIGHT PARENTHESIS # 
+
+249C ; 0028 0061 0029 ;        SA      #* ( ⒜ → (a) ) PARENTHESIZED LATIN SMALL LETTER A → LEFT PARENTHESIS, LATIN SMALL LETTER A, RIGHT PARENTHESIS     # 
+
+1F110 ;        0028 0041 0029 ;        SA      #* ( 🄐 → (A) ) PARENTHESIZED LATIN CAPITAL LETTER A → LEFT PARENTHESIS, LATIN CAPITAL LETTER A, RIGHT PARENTHESIS        # 
+
+249D ; 0028 0062 0029 ;        SA      #* ( ⒝ → (b) ) PARENTHESIZED LATIN SMALL LETTER B → LEFT PARENTHESIS, LATIN SMALL LETTER B, RIGHT PARENTHESIS     # 
+
+1F111 ;        0028 0042 0029 ;        SA      #* ( 🄑 → (B) ) PARENTHESIZED LATIN CAPITAL LETTER B → LEFT PARENTHESIS, LATIN CAPITAL LETTER B, RIGHT PARENTHESIS        # 
+
+249E ; 0028 0063 0029 ;        SA      #* ( ⒞ → (c) ) PARENTHESIZED LATIN SMALL LETTER C → LEFT PARENTHESIS, LATIN SMALL LETTER C, RIGHT PARENTHESIS     # 
+
+1F112 ;        0028 0043 0029 ;        SA      #* ( 🄒 → (C) ) PARENTHESIZED LATIN CAPITAL LETTER C → LEFT PARENTHESIS, LATIN CAPITAL LETTER C, RIGHT PARENTHESIS        # 
+
+249F ; 0028 0064 0029 ;        SA      #* ( ⒟ → (d) ) PARENTHESIZED LATIN SMALL LETTER D → LEFT PARENTHESIS, LATIN SMALL LETTER D, RIGHT PARENTHESIS     # 
+
+1F113 ;        0028 0044 0029 ;        SA      #* ( 🄓 → (D) ) PARENTHESIZED LATIN CAPITAL LETTER D → LEFT PARENTHESIS, LATIN CAPITAL LETTER D, RIGHT PARENTHESIS        # 
+
+24A0 ; 0028 0065 0029 ;        SA      #* ( ⒠ → (e) ) PARENTHESIZED LATIN SMALL LETTER E → LEFT PARENTHESIS, LATIN SMALL LETTER E, RIGHT PARENTHESIS     # 
+
+1F114 ;        0028 0045 0029 ;        SA      #* ( 🄔 → (E) ) PARENTHESIZED LATIN CAPITAL LETTER E → LEFT PARENTHESIS, LATIN CAPITAL LETTER E, RIGHT PARENTHESIS        # 
+
+24A1 ; 0028 0066 0029 ;        SA      #* ( ⒡ → (f) ) PARENTHESIZED LATIN SMALL LETTER F → LEFT PARENTHESIS, LATIN SMALL LETTER F, RIGHT PARENTHESIS     # 
+
+1F115 ;        0028 0046 0029 ;        SA      #* ( 🄕 → (F) ) PARENTHESIZED LATIN CAPITAL LETTER F → LEFT PARENTHESIS, LATIN CAPITAL LETTER F, RIGHT PARENTHESIS        # 
+
+24A2 ; 0028 0067 0029 ;        SA      #* ( ⒢ → (g) ) PARENTHESIZED LATIN SMALL LETTER G → LEFT PARENTHESIS, LATIN SMALL LETTER G, RIGHT PARENTHESIS     # 
+
+1F116 ;        0028 0047 0029 ;        SA      #* ( 🄖 → (G) ) PARENTHESIZED LATIN CAPITAL LETTER G → LEFT PARENTHESIS, LATIN CAPITAL LETTER G, RIGHT PARENTHESIS        # 
+
+24A3 ; 0028 0068 0029 ;        SA      #* ( ⒣ → (h) ) PARENTHESIZED LATIN SMALL LETTER H → LEFT PARENTHESIS, LATIN SMALL LETTER H, RIGHT PARENTHESIS     # 
+
+1F117 ;        0028 0048 0029 ;        SA      #* ( 🄗 → (H) ) PARENTHESIZED LATIN CAPITAL LETTER H → LEFT PARENTHESIS, LATIN CAPITAL LETTER H, RIGHT PARENTHESIS        # 
+
+24A4 ; 0028 0069 0029 ;        SA      #* ( ⒤ → (i) ) PARENTHESIZED LATIN SMALL LETTER I → LEFT PARENTHESIS, LATIN SMALL LETTER I, RIGHT PARENTHESIS     # 
+
+2474 ; 0028 0049 0029 ;        SA      #* ( ⑴ → (I) ) PARENTHESIZED DIGIT ONE → LEFT PARENTHESIS, LATIN CAPITAL LETTER I, RIGHT PARENTHESIS      # →(1)→→(l)→
+1F118 ;        0028 0049 0029 ;        SA      #* ( 🄘 → (I) ) PARENTHESIZED LATIN CAPITAL LETTER I → LEFT PARENTHESIS, LATIN CAPITAL LETTER I, RIGHT PARENTHESIS        # 
+24A7 ; 0028 0049 0029 ;        SA      #* ( ⒧ → (I) ) PARENTHESIZED LATIN SMALL LETTER L → LEFT PARENTHESIS, LATIN CAPITAL LETTER I, RIGHT PARENTHESIS   # →(l)→
+
+24A5 ; 0028 006A 0029 ;        SA      #* ( ⒥ → (j) ) PARENTHESIZED LATIN SMALL LETTER J → LEFT PARENTHESIS, LATIN SMALL LETTER J, RIGHT PARENTHESIS     # 
+
+1F119 ;        0028 004A 0029 ;        SA      #* ( 🄙 → (J) ) PARENTHESIZED LATIN CAPITAL LETTER J → LEFT PARENTHESIS, LATIN CAPITAL LETTER J, RIGHT PARENTHESIS        # 
+
+24A6 ; 0028 006B 0029 ;        SA      #* ( ⒦ → (k) ) PARENTHESIZED LATIN SMALL LETTER K → LEFT PARENTHESIS, LATIN SMALL LETTER K, RIGHT PARENTHESIS     # 
+
+1F11A ;        0028 004B 0029 ;        SA      #* ( 🄚 → (K) ) PARENTHESIZED LATIN CAPITAL LETTER K → LEFT PARENTHESIS, LATIN CAPITAL LETTER K, RIGHT PARENTHESIS        # 
+
+1F11B ;        0028 004C 0029 ;        SA      #* ( 🄛 → (L) ) PARENTHESIZED LATIN CAPITAL LETTER L → LEFT PARENTHESIS, LATIN CAPITAL LETTER L, RIGHT PARENTHESIS        # 
+
+247F ; 0028 006C 0032 0029 ;   SA      #* ( ⑿ → (l2) ) PARENTHESIZED NUMBER TWELVE → LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT TWO, RIGHT PARENTHESIS        # →(12)→
+
+2480 ; 0028 006C 0033 0029 ;   SA      #* ( ⒀ → (l3) ) PARENTHESIZED NUMBER THIRTEEN → LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT THREE, RIGHT PARENTHESIS    # →(13)→
+
+2481 ; 0028 006C 0034 0029 ;   SA      #* ( ⒁ → (l4) ) PARENTHESIZED NUMBER FOURTEEN → LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT FOUR, RIGHT PARENTHESIS     # →(14)→
+
+2482 ; 0028 006C 0035 0029 ;   SA      #* ( ⒂ → (l5) ) PARENTHESIZED NUMBER FIFTEEN → LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT FIVE, RIGHT PARENTHESIS      # →(15)→
+
+2483 ; 0028 006C 0036 0029 ;   SA      #* ( ⒃ → (l6) ) PARENTHESIZED NUMBER SIXTEEN → LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT SIX, RIGHT PARENTHESIS       # →(16)→
+
+2484 ; 0028 006C 0037 0029 ;   SA      #* ( ⒄ → (l7) ) PARENTHESIZED NUMBER SEVENTEEN → LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT SEVEN, RIGHT PARENTHESIS   # →(17)→
+
+2485 ; 0028 006C 0038 0029 ;   SA      #* ( ⒅ → (l8) ) PARENTHESIZED NUMBER EIGHTEEN → LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT EIGHT, RIGHT PARENTHESIS    # →(18)→
+
+2486 ; 0028 006C 0039 0029 ;   SA      #* ( ⒆ → (l9) ) PARENTHESIZED NUMBER NINETEEN → LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT NINE, RIGHT PARENTHESIS     # →(19)→
+
+247E ; 0028 006C 006C 0029 ;   SA      #* ( ⑾ → (ll) ) PARENTHESIZED NUMBER ELEVEN → LEFT PARENTHESIS, LATIN SMALL LETTER L, LATIN SMALL LETTER L, RIGHT PARENTHESIS     # →(11)→
+
+247D ; 0028 006C 004F 0029 ;   SA      #* ( ⑽ → (lO) ) PARENTHESIZED NUMBER TEN → LEFT PARENTHESIS, LATIN SMALL LETTER L, LATIN CAPITAL LETTER O, RIGHT PARENTHESIS      # →(10)→
+
+1F11C ;        0028 004D 0029 ;        SA      #* ( 🄜 → (M) ) PARENTHESIZED LATIN CAPITAL LETTER M → LEFT PARENTHESIS, LATIN CAPITAL LETTER M, RIGHT PARENTHESIS        # 
+
+24A9 ; 0028 006E 0029 ;        SA      #* ( ⒩ → (n) ) PARENTHESIZED LATIN SMALL LETTER N → LEFT PARENTHESIS, LATIN SMALL LETTER N, RIGHT PARENTHESIS     # 
+
+1F11D ;        0028 004E 0029 ;        SA      #* ( 🄝 → (N) ) PARENTHESIZED LATIN CAPITAL LETTER N → LEFT PARENTHESIS, LATIN CAPITAL LETTER N, RIGHT PARENTHESIS        # 
+
+24AA ; 0028 006F 0029 ;        SA      #* ( ⒪ → (o) ) PARENTHESIZED LATIN SMALL LETTER O → LEFT PARENTHESIS, LATIN SMALL LETTER O, RIGHT PARENTHESIS     # 
+
+1F11E ;        0028 004F 0029 ;        SA      #* ( 🄞 → (O) ) PARENTHESIZED LATIN CAPITAL LETTER O → LEFT PARENTHESIS, LATIN CAPITAL LETTER O, RIGHT PARENTHESIS        # 
+
+24AB ; 0028 0070 0029 ;        SA      #* ( ⒫ → (p) ) PARENTHESIZED LATIN SMALL LETTER P → LEFT PARENTHESIS, LATIN SMALL LETTER P, RIGHT PARENTHESIS     # 
+
+1F11F ;        0028 0050 0029 ;        SA      #* ( 🄟 → (P) ) PARENTHESIZED LATIN CAPITAL LETTER P → LEFT PARENTHESIS, LATIN CAPITAL LETTER P, RIGHT PARENTHESIS        # 
+
+24AC ; 0028 0071 0029 ;        SA      #* ( ⒬ → (q) ) PARENTHESIZED LATIN SMALL LETTER Q → LEFT PARENTHESIS, LATIN SMALL LETTER Q, RIGHT PARENTHESIS     # 
+
+1F120 ;        0028 0051 0029 ;        SA      #* ( 🄠 → (Q) ) PARENTHESIZED LATIN CAPITAL LETTER Q → LEFT PARENTHESIS, LATIN CAPITAL LETTER Q, RIGHT PARENTHESIS        # 
+
+24AD ; 0028 0072 0029 ;        SA      #* ( ⒭ → (r) ) PARENTHESIZED LATIN SMALL LETTER R → LEFT PARENTHESIS, LATIN SMALL LETTER R, RIGHT PARENTHESIS     # 
+
+1F121 ;        0028 0052 0029 ;        SA      #* ( 🄡 → (R) ) PARENTHESIZED LATIN CAPITAL LETTER R → LEFT PARENTHESIS, LATIN CAPITAL LETTER R, RIGHT PARENTHESIS        # 
+
+24A8 ; 0028 0072 006E 0029 ;   SA      #* ( ⒨ → (rn) ) PARENTHESIZED LATIN SMALL LETTER M → LEFT PARENTHESIS, LATIN SMALL LETTER R, LATIN SMALL LETTER N, RIGHT PARENTHESIS      # →(m)→
+
+24AE ; 0028 0073 0029 ;        SA      #* ( ⒮ → (s) ) PARENTHESIZED LATIN SMALL LETTER S → LEFT PARENTHESIS, LATIN SMALL LETTER S, RIGHT PARENTHESIS     # 
+
+1F122 ;        0028 0053 0029 ;        SA      #* ( 🄢 → (S) ) PARENTHESIZED LATIN CAPITAL LETTER S → LEFT PARENTHESIS, LATIN CAPITAL LETTER S, RIGHT PARENTHESIS        # 
+1F12A ;        0028 0053 0029 ;        SA      #* ( 🄪 → (S) ) TORTOISE SHELL BRACKETED LATIN CAPITAL LETTER S → LEFT PARENTHESIS, LATIN CAPITAL LETTER S, RIGHT PARENTHESIS     # →〔S〕→
+
+24AF ; 0028 0074 0029 ;        SA      #* ( ⒯ → (t) ) PARENTHESIZED LATIN SMALL LETTER T → LEFT PARENTHESIS, LATIN SMALL LETTER T, RIGHT PARENTHESIS     # 
+
+1F123 ;        0028 0054 0029 ;        SA      #* ( 🄣 → (T) ) PARENTHESIZED LATIN CAPITAL LETTER T → LEFT PARENTHESIS, LATIN CAPITAL LETTER T, RIGHT PARENTHESIS        # 
+
+24B0 ; 0028 0075 0029 ;        SA      #* ( ⒰ → (u) ) PARENTHESIZED LATIN SMALL LETTER U → LEFT PARENTHESIS, LATIN SMALL LETTER U, RIGHT PARENTHESIS     # 
+
+1F124 ;        0028 0055 0029 ;        SA      #* ( 🄤 → (U) ) PARENTHESIZED LATIN CAPITAL LETTER U → LEFT PARENTHESIS, LATIN CAPITAL LETTER U, RIGHT PARENTHESIS        # 
+
+24B1 ; 0028 0076 0029 ;        SA      #* ( ⒱ → (v) ) PARENTHESIZED LATIN SMALL LETTER V → LEFT PARENTHESIS, LATIN SMALL LETTER V, RIGHT PARENTHESIS     # 
+
+1F125 ;        0028 0056 0029 ;        SA      #* ( 🄥 → (V) ) PARENTHESIZED LATIN CAPITAL LETTER V → LEFT PARENTHESIS, LATIN CAPITAL LETTER V, RIGHT PARENTHESIS        # 
+
+24B2 ; 0028 0076 0076 0029 ;   SA      #* ( ⒲ → (vv) ) PARENTHESIZED LATIN SMALL LETTER W → LEFT PARENTHESIS, LATIN SMALL LETTER V, LATIN SMALL LETTER V, RIGHT PARENTHESIS      # →(w)→
+
+1F126 ;        0028 0057 0029 ;        SA      #* ( 🄦 → (W) ) PARENTHESIZED LATIN CAPITAL LETTER W → LEFT PARENTHESIS, LATIN CAPITAL LETTER W, RIGHT PARENTHESIS        # 
+
+24B3 ; 0028 0078 0029 ;        SA      #* ( ⒳ → (x) ) PARENTHESIZED LATIN SMALL LETTER X → LEFT PARENTHESIS, LATIN SMALL LETTER X, RIGHT PARENTHESIS     # 
+
+1F127 ;        0028 0058 0029 ;        SA      #* ( 🄧 → (X) ) PARENTHESIZED LATIN CAPITAL LETTER X → LEFT PARENTHESIS, LATIN CAPITAL LETTER X, RIGHT PARENTHESIS        # 
+
+24B4 ; 0028 0079 0029 ;        SA      #* ( ⒴ → (y) ) PARENTHESIZED LATIN SMALL LETTER Y → LEFT PARENTHESIS, LATIN SMALL LETTER Y, RIGHT PARENTHESIS     # 
+
+1F128 ;        0028 0059 0029 ;        SA      #* ( 🄨 → (Y) ) PARENTHESIZED LATIN CAPITAL LETTER Y → LEFT PARENTHESIS, LATIN CAPITAL LETTER Y, RIGHT PARENTHESIS        # 
+
+24B5 ; 0028 007A 0029 ;        SA      #* ( ⒵ → (z) ) PARENTHESIZED LATIN SMALL LETTER Z → LEFT PARENTHESIS, LATIN SMALL LETTER Z, RIGHT PARENTHESIS     # 
+
+1F129 ;        0028 005A 0029 ;        SA      #* ( 🄩 → (Z) ) PARENTHESIZED LATIN CAPITAL LETTER Z → LEFT PARENTHESIS, LATIN CAPITAL LETTER Z, RIGHT PARENTHESIS        # 
+
+3200 ; 0028 1100 0029 ;        SA      #* ( ㈀ → (ᄀ) ) PARENTHESIZED HANGUL KIYEOK → LEFT PARENTHESIS, HANGUL CHOSEONG KIYEOK, RIGHT PARENTHESIS        # 
+
+320E ; 0028 AC00 0029 ;        SA      #* ( ㈎ → (가) ) PARENTHESIZED HANGUL KIYEOK A → LEFT PARENTHESIS, HANGUL SYLLABLE GA, RIGHT PARENTHESIS  # 
+
+3201 ; 0028 1102 0029 ;        SA      #* ( ㈁ → (ᄂ) ) PARENTHESIZED HANGUL NIEUN → LEFT PARENTHESIS, HANGUL CHOSEONG NIEUN, RIGHT PARENTHESIS  # 
+
+320F ; 0028 B098 0029 ;        SA      #* ( ㈏ → (나) ) PARENTHESIZED HANGUL NIEUN A → LEFT PARENTHESIS, HANGUL SYLLABLE NA, RIGHT PARENTHESIS   # 
+
+3202 ; 0028 1103 0029 ;        SA      #* ( ㈂ → (ᄃ) ) PARENTHESIZED HANGUL TIKEUT → LEFT PARENTHESIS, HANGUL CHOSEONG TIKEUT, RIGHT PARENTHESIS        # 
+
+3210 ; 0028 B2E4 0029 ;        SA      #* ( ㈐ → (다) ) PARENTHESIZED HANGUL TIKEUT A → LEFT PARENTHESIS, HANGUL SYLLABLE DA, RIGHT PARENTHESIS  # 
+
+3203 ; 0028 1105 0029 ;        SA      #* ( ㈃ → (ᄅ) ) PARENTHESIZED HANGUL RIEUL → LEFT PARENTHESIS, HANGUL CHOSEONG RIEUL, RIGHT PARENTHESIS  # 
+
+3211 ; 0028 B77C 0029 ;        SA      #* ( ㈑ → (라) ) PARENTHESIZED HANGUL RIEUL A → LEFT PARENTHESIS, HANGUL SYLLABLE RA, RIGHT PARENTHESIS   # 
+
+3204 ; 0028 1106 0029 ;        SA      #* ( ㈄ → (ᄆ) ) PARENTHESIZED HANGUL MIEUM → LEFT PARENTHESIS, HANGUL CHOSEONG MIEUM, RIGHT PARENTHESIS  # 
+
+3212 ; 0028 B9C8 0029 ;        SA      #* ( ㈒ → (마) ) PARENTHESIZED HANGUL MIEUM A → LEFT PARENTHESIS, HANGUL SYLLABLE MA, RIGHT PARENTHESIS   # 
+
+3205 ; 0028 1107 0029 ;        SA      #* ( ㈅ → (ᄇ) ) PARENTHESIZED HANGUL PIEUP → LEFT PARENTHESIS, HANGUL CHOSEONG PIEUP, RIGHT PARENTHESIS  # 
+
+3213 ; 0028 BC14 0029 ;        SA      #* ( ㈓ → (바) ) PARENTHESIZED HANGUL PIEUP A → LEFT PARENTHESIS, HANGUL SYLLABLE BA, RIGHT PARENTHESIS   # 
+
+3206 ; 0028 1109 0029 ;        SA      #* ( ㈆ → (ᄉ) ) PARENTHESIZED HANGUL SIOS → LEFT PARENTHESIS, HANGUL CHOSEONG SIOS, RIGHT PARENTHESIS    # 
+
+3214 ; 0028 C0AC 0029 ;        SA      #* ( ㈔ → (사) ) PARENTHESIZED HANGUL SIOS A → LEFT PARENTHESIS, HANGUL SYLLABLE SA, RIGHT PARENTHESIS    # 
+
+3207 ; 0028 110B 0029 ;        SA      #* ( ㈇ → (ᄋ) ) PARENTHESIZED HANGUL IEUNG → LEFT PARENTHESIS, HANGUL CHOSEONG IEUNG, RIGHT PARENTHESIS  # 
+
+3215 ; 0028 C544 0029 ;        SA      #* ( ㈕ → (아) ) PARENTHESIZED HANGUL IEUNG A → LEFT PARENTHESIS, HANGUL SYLLABLE A, RIGHT PARENTHESIS    # 
+
+321D ; 0028 C624 C804 0029 ;   SA      #* ( ㈝ → (오전) ) PARENTHESIZED KOREAN CHARACTER OJEON → LEFT PARENTHESIS, HANGUL SYLLABLE O, HANGUL SYLLABLE JEON, RIGHT PARENTHESIS   # 
+
+321E ; 0028 C624 D6C4 0029 ;   SA      #* ( ㈞ → (오후) ) PARENTHESIZED KOREAN CHARACTER O HU → LEFT PARENTHESIS, HANGUL SYLLABLE O, HANGUL SYLLABLE HU, RIGHT PARENTHESIS      # 
+
+3208 ; 0028 110C 0029 ;        SA      #* ( ㈈ → (ᄌ) ) PARENTHESIZED HANGUL CIEUC → LEFT PARENTHESIS, HANGUL CHOSEONG CIEUC, RIGHT PARENTHESIS  # 
+
+3216 ; 0028 C790 0029 ;        SA      #* ( ㈖ → (자) ) PARENTHESIZED HANGUL CIEUC A → LEFT PARENTHESIS, HANGUL SYLLABLE JA, RIGHT PARENTHESIS   # 
+
+321C ; 0028 C8FC 0029 ;        SA      #* ( ㈜ → (주) ) PARENTHESIZED HANGUL CIEUC U → LEFT PARENTHESIS, HANGUL SYLLABLE JU, RIGHT PARENTHESIS   # 
+
+3209 ; 0028 110E 0029 ;        SA      #* ( ㈉ → (ᄎ) ) PARENTHESIZED HANGUL CHIEUCH → LEFT PARENTHESIS, HANGUL CHOSEONG CHIEUCH, RIGHT PARENTHESIS      # 
+
+3217 ; 0028 CC28 0029 ;        SA      #* ( ㈗ → (차) ) PARENTHESIZED HANGUL CHIEUCH A → LEFT PARENTHESIS, HANGUL SYLLABLE CA, RIGHT PARENTHESIS # 
+
+320A ; 0028 110F 0029 ;        SA      #* ( ㈊ → (ᄏ) ) PARENTHESIZED HANGUL KHIEUKH → LEFT PARENTHESIS, HANGUL CHOSEONG KHIEUKH, RIGHT PARENTHESIS      # 
+
+3218 ; 0028 CE74 0029 ;        SA      #* ( ㈘ → (카) ) PARENTHESIZED HANGUL KHIEUKH A → LEFT PARENTHESIS, HANGUL SYLLABLE KA, RIGHT PARENTHESIS # 
+
+320B ; 0028 1110 0029 ;        SA      #* ( ㈋ → (ᄐ) ) PARENTHESIZED HANGUL THIEUTH → LEFT PARENTHESIS, HANGUL CHOSEONG THIEUTH, RIGHT PARENTHESIS      # 
+
+3219 ; 0028 D0C0 0029 ;        SA      #* ( ㈙ → (타) ) PARENTHESIZED HANGUL THIEUTH A → LEFT PARENTHESIS, HANGUL SYLLABLE TA, RIGHT PARENTHESIS # 
+
+320C ; 0028 1111 0029 ;        SA      #* ( ㈌ → (ᄑ) ) PARENTHESIZED HANGUL PHIEUPH → LEFT PARENTHESIS, HANGUL CHOSEONG PHIEUPH, RIGHT PARENTHESIS      # 
+
+321A ; 0028 D30C 0029 ;        SA      #* ( ㈚ → (파) ) PARENTHESIZED HANGUL PHIEUPH A → LEFT PARENTHESIS, HANGUL SYLLABLE PA, RIGHT PARENTHESIS # 
+
+320D ; 0028 1112 0029 ;        SA      #* ( ㈍ → (ᄒ) ) PARENTHESIZED HANGUL HIEUH → LEFT PARENTHESIS, HANGUL CHOSEONG HIEUH, RIGHT PARENTHESIS  # 
+
+321B ; 0028 D558 0029 ;        SA      #* ( ㈛ → (하) ) PARENTHESIZED HANGUL HIEUH A → LEFT PARENTHESIS, HANGUL SYLLABLE HA, RIGHT PARENTHESIS   # 
+
+3226 ; 0028 4E03 0029 ;        SA      #* ( ㈦ → (七) ) PARENTHESIZED IDEOGRAPH SEVEN → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4E03, RIGHT PARENTHESIS  # 
+
+3222 ; 0028 4E09 0029 ;        SA      #* ( ㈢ → (三) ) PARENTHESIZED IDEOGRAPH THREE → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4E09, RIGHT PARENTHESIS  # 
+1F241 ;        0028 4E09 0029 ;        SA      #* ( 🉁 → (三) ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E09 → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4E09, RIGHT PARENTHESIS   # →〔三〕→
+
+3228 ; 0028 4E5D 0029 ;        SA      #* ( ㈨ → (九) ) PARENTHESIZED IDEOGRAPH NINE → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4E5D, RIGHT PARENTHESIS   # 
+
+3221 ; 0028 4E8C 0029 ;        SA      #* ( ㈡ → (二) ) PARENTHESIZED IDEOGRAPH TWO → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4E8C, RIGHT PARENTHESIS    # 
+1F242 ;        0028 4E8C 0029 ;        SA      #* ( 🉂 → (二) ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E8C → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4E8C, RIGHT PARENTHESIS   # →〔二〕→
+
+3224 ; 0028 4E94 0029 ;        SA      #* ( ㈤ → (五) ) PARENTHESIZED IDEOGRAPH FIVE → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4E94, RIGHT PARENTHESIS   # 
+
+3239 ; 0028 4EE3 0029 ;        SA      #* ( ㈹ → (代) ) PARENTHESIZED IDEOGRAPH REPRESENT → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4EE3, RIGHT PARENTHESIS      # 
+
+323D ; 0028 4F01 0029 ;        SA      #* ( ㈽ → (企) ) PARENTHESIZED IDEOGRAPH ENTERPRISE → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4F01, RIGHT PARENTHESIS     # 
+
+3241 ; 0028 4F11 0029 ;        SA      #* ( ㉁ → (休) ) PARENTHESIZED IDEOGRAPH REST → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4F11, RIGHT PARENTHESIS   # 
+
+3227 ; 0028 516B 0029 ;        SA      #* ( ㈧ → (八) ) PARENTHESIZED IDEOGRAPH EIGHT → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-516B, RIGHT PARENTHESIS  # 
+
+3225 ; 0028 516D 0029 ;        SA      #* ( ㈥ → (六) ) PARENTHESIZED IDEOGRAPH SIX → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-516D, RIGHT PARENTHESIS    # 
+
+3238 ; 0028 52B4 0029 ;        SA      #* ( ㈸ → (労) ) PARENTHESIZED IDEOGRAPH LABOR → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-52B4, RIGHT PARENTHESIS  # 
+
+1F247 ;        0028 52DD 0029 ;        SA      #* ( 🉇 → (勝) ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-52DD → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-52DD, RIGHT PARENTHESIS   # →〔勝〕→
+
+3229 ; 0028 5341 0029 ;        SA      #* ( ㈩ → (十) ) PARENTHESIZED IDEOGRAPH TEN → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-5341, RIGHT PARENTHESIS    # 
+
+323F ; 0028 5354 0029 ;        SA      #* ( ㈿ → (協) ) PARENTHESIZED IDEOGRAPH ALLIANCE → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-5354, RIGHT PARENTHESIS       # 
+
+3234 ; 0028 540D 0029 ;        SA      #* ( ㈴ → (名) ) PARENTHESIZED IDEOGRAPH NAME → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-540D, RIGHT PARENTHESIS   # 
+
+323A ; 0028 547C 0029 ;        SA      #* ( ㈺ → (呼) ) PARENTHESIZED IDEOGRAPH CALL → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-547C, RIGHT PARENTHESIS   # 
+
+3223 ; 0028 56DB 0029 ;        SA      #* ( ㈣ → (四) ) PARENTHESIZED IDEOGRAPH FOUR → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-56DB, RIGHT PARENTHESIS   # 
+
+322F ; 0028 571F 0029 ;        SA      #* ( ㈯ → (土) ) PARENTHESIZED IDEOGRAPH EARTH → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-571F, RIGHT PARENTHESIS  # 
+
+323B ; 0028 5B66 0029 ;        SA      #* ( ㈻ → (学) ) PARENTHESIZED IDEOGRAPH STUDY → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-5B66, RIGHT PARENTHESIS  # 
+
+1F243 ;        0028 5B89 0029 ;        SA      #* ( 🉃 → (安) ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-5B89 → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-5B89, RIGHT PARENTHESIS   # →〔安〕→
+
+1F245 ;        0028 6253 0029 ;        SA      #* ( 🉅 → (打) ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6253 → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-6253, RIGHT PARENTHESIS   # →〔打〕→
+
+1F248 ;        0028 6557 0029 ;        SA      #* ( 🉈 → (敗) ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557 → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-6557, RIGHT PARENTHESIS   # →〔敗〕→
+
+3230 ; 0028 65E5 0029 ;        SA      #* ( ㈰ → (日) ) PARENTHESIZED IDEOGRAPH SUN → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-65E5, RIGHT PARENTHESIS    # 
+
+322A ; 0028 6708 0029 ;        SA      #* ( ㈪ → (月) ) PARENTHESIZED IDEOGRAPH MOON → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-6708, RIGHT PARENTHESIS   # 
+
+3232 ; 0028 6709 0029 ;        SA      #* ( ㈲ → (有) ) PARENTHESIZED IDEOGRAPH HAVE → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-6709, RIGHT PARENTHESIS   # 
+
+322D ; 0028 6728 0029 ;        SA      #* ( ㈭ → (木) ) PARENTHESIZED IDEOGRAPH WOOD → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-6728, RIGHT PARENTHESIS   # 
+
+1F240 ;        0028 672C 0029 ;        SA      #* ( 🉀 → (本) ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-672C, RIGHT PARENTHESIS   # →〔本〕→
+
+3231 ; 0028 682A 0029 ;        SA      #* ( ㈱ → (株) ) PARENTHESIZED IDEOGRAPH STOCK → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-682A, RIGHT PARENTHESIS  # 
+
+322C ; 0028 6C34 0029 ;        SA      #* ( ㈬ → (水) ) PARENTHESIZED IDEOGRAPH WATER → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-6C34, RIGHT PARENTHESIS  # 
+
+322B ; 0028 706B 0029 ;        SA      #* ( ㈫ → (火) ) PARENTHESIZED IDEOGRAPH FIRE → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-706B, RIGHT PARENTHESIS   # 
+
+1F244 ;        0028 70B9 0029 ;        SA      #* ( 🉄 → (点) ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-70B9 → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-70B9, RIGHT PARENTHESIS   # →〔点〕→
+
+3235 ; 0028 7279 0029 ;        SA      #* ( ㈵ → (特) ) PARENTHESIZED IDEOGRAPH SPECIAL → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-7279, RIGHT PARENTHESIS        # 
+
+1F246 ;        0028 76D7 0029 ;        SA      #* ( 🉆 → (盗) ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-76D7 → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-76D7, RIGHT PARENTHESIS   # →〔盗〕→
+
+323C ; 0028 76E3 0029 ;        SA      #* ( ㈼ → (監) ) PARENTHESIZED IDEOGRAPH SUPERVISE → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-76E3, RIGHT PARENTHESIS      # 
+
+3233 ; 0028 793E 0029 ;        SA      #* ( ㈳ → (社) ) PARENTHESIZED IDEOGRAPH SOCIETY → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-793E, RIGHT PARENTHESIS        # 
+
+3237 ; 0028 795D 0029 ;        SA      #* ( ㈷ → (祝) ) PARENTHESIZED IDEOGRAPH CONGRATULATION → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-795D, RIGHT PARENTHESIS # 
+
+3240 ; 0028 796D 0029 ;        SA      #* ( ㉀ → (祭) ) PARENTHESIZED IDEOGRAPH FESTIVAL → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-796D, RIGHT PARENTHESIS       # 
+
+3242 ; 0028 81EA 0029 ;        SA      #* ( ㉂ → (自) ) PARENTHESIZED IDEOGRAPH SELF → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-81EA, RIGHT PARENTHESIS   # 
+
+3243 ; 0028 81F3 0029 ;        SA      #* ( ㉃ → (至) ) PARENTHESIZED IDEOGRAPH REACH → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-81F3, RIGHT PARENTHESIS  # 
+
+3236 ; 0028 8CA1 0029 ;        SA      #* ( ㈶ → (財) ) PARENTHESIZED IDEOGRAPH FINANCIAL → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-8CA1, RIGHT PARENTHESIS      # 
+
+323E ; 0028 8CC7 0029 ;        SA      #* ( ㈾ → (資) ) PARENTHESIZED IDEOGRAPH RESOURCE → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-8CC7, RIGHT PARENTHESIS       # 
+
+322E ; 0028 91D1 0029 ;        SA      #* ( ㈮ → (金) ) PARENTHESIZED IDEOGRAPH METAL → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-91D1, RIGHT PARENTHESIS  # 
+
+FF3D ; 0029 ;  SA      #* ( ] → ) ) FULLWIDTH RIGHT SQUARE BRACKET → RIGHT PARENTHESIS   # →〕→
+3015 ; 0029 ;  SA      #* ( 〕 → ) ) RIGHT TORTOISE SHELL BRACKET → RIGHT PARENTHESIS     # 
+FD3F ; 0029 ;  SA      #* ( ﴿ → ) ) ORNATE RIGHT PARENTHESIS → RIGHT PARENTHESIS # 
+2769 ; 0029 ;  SA      #* ( ❩ → ) ) MEDIUM RIGHT PARENTHESIS ORNAMENT → RIGHT PARENTHESIS        # 
+2773 ; 0029 ;  SA      #* ( ❳ → ) ) LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT → RIGHT PARENTHESIS      # →〕→
+
+2774 ; 007B ;  SA      #* ( ❴ → { ) MEDIUM LEFT CURLY BRACKET ORNAMENT → LEFT CURLY BRACKET      # 
+
+2775 ; 007D ;  SA      #* ( ❵ → } ) MEDIUM RIGHT CURLY BRACKET ORNAMENT → RIGHT CURLY BRACKET    # 
+
+FF3E ; FE3F ;  SA      #* ( ^ → ︿ ) FULLWIDTH CIRCUMFLEX ACCENT → PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET    # 
+
+204E ; 002A ;  SA      #* ( ⁎ → * ) LOW ASTERISK → ASTERISK      # 
+066D ; 002A ;  SA      #* ( ‎٭‎ → * ) ARABIC FIVE POINTED STAR → ASTERISK     # 
+2217 ; 002A ;  SA      #* ( ∗ → * ) ASTERISK OPERATOR → ASTERISK # 
+
+1735 ; 002F ;  SA      #* ( ᜵ → / ) PHILIPPINE SINGLE PUNCTUATION → SOLIDUS      # 
+2044 ; 002F ;  SA      #* ( ⁄ → / ) FRACTION SLASH → SOLIDUS     # 
+2041 ; 002F ;  SA      #* ( ⁁ → / ) CARET INSERTION POINT → SOLIDUS      # 
+2215 ; 002F ;  SA      #* ( ∕ → / ) DIVISION SLASH → SOLIDUS     # 
+2571 ; 002F ;  SA      #* ( ╱ → / ) BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT → SOLIDUS      # 
+29F8 ; 002F ;  SA      #* ( ⧸ → / ) BIG SOLIDUS → SOLIDUS        # 
+31D3 ; 002F ;  SA      #* ( ㇓ → / ) CJK STROKE SP → SOLIDUS      # →⼃→
+3033 ; 002F ;  SA      # ( 〳 → / ) VERTICAL KANA REPEAT MARK UPPER HALF → SOLIDUS        # 
+2CC6 ; 002F ;  SA      # ( Ⳇ → / ) COPTIC CAPITAL LETTER OLD COPTIC ESH → SOLIDUS        # 
+4E3F ; 002F ;  SA      # ( 丿 → / ) CJK UNIFIED IDEOGRAPH-4E3F → SOLIDUS  # →⼃→
+2F03 ; 002F ;  SA      #* ( ⼃ → / ) KANGXI RADICAL SLASH → SOLIDUS       # 
+
+29F6 ; 002F 0304 ;     SA      #* ( ⧶ → /̄ ) SOLIDUS WITH OVERBAR → SOLIDUS, COMBINING MACRON   # 
+
+2AFD ; 002F 002F ;     SA      #* ( ⫽ → // ) DOUBLE SOLIDUS OPERATOR → SOLIDUS, SOLIDUS  # 
+
+2AFB ; 002F 002F 002F ;        SA      #* ( ⫻ → /// ) TRIPLE SOLIDUS BINARY RELATION → SOLIDUS, SOLIDUS, SOLIDUS # 
+
+FF3C ; 005C ;  SA      #* ( \ → \ ) FULLWIDTH REVERSE SOLIDUS → REVERSE SOLIDUS  # →∖→
+FE68 ; 005C ;  SA      #* ( ﹨ → \ ) SMALL REVERSE SOLIDUS → REVERSE SOLIDUS      # →∖→
+2216 ; 005C ;  SA      #* ( ∖ → \ ) SET MINUS → REVERSE SOLIDUS  # 
+29F5 ; 005C ;  SA      #* ( ⧵ → \ ) REVERSE SOLIDUS OPERATOR → REVERSE SOLIDUS   # 
+29F9 ; 005C ;  SA      #* ( ⧹ → \ ) BIG REVERSE SOLIDUS → REVERSE SOLIDUS        # 
+31D4 ; 005C ;  SA      #* ( ㇔ → \ ) CJK STROKE D → REVERSE SOLIDUS       # →⼂→
+4E36 ; 005C ;  SA      # ( 丶 → \ ) CJK UNIFIED IDEOGRAPH-4E36 → REVERSE SOLIDUS  # →⼂→
+2F02 ; 005C ;  SA      #* ( ⼂ → \ ) KANGXI RADICAL DOT → REVERSE SOLIDUS # 
+
+2CF9 ; 005C 005C ;     SA      #* ( ⳹ → \\ ) COPTIC OLD NUBIAN FULL STOP → REVERSE SOLIDUS, REVERSE SOLIDUS      # 
+244A ; 005C 005C ;     SA      #* ( ⑊ → \\ ) OCR DOUBLE BACKSLASH → REVERSE SOLIDUS, REVERSE SOLIDUS     # 
+
+A778 ; 0026 ;  SA      # ( ꝸ → & ) LATIN SMALL LETTER UM → AMPERSAND     # 
+
+110BB ;        0970 ;  SA      #* ( 𑂻 → ॰ ) KAITHI ABBREVIATION SIGN → DEVANAGARI ABBREVIATION SIGN   # 
+26AC ; 0970 ;  SA      #* ( ⚬ → ॰ ) MEDIUM SMALL WHITE CIRCLE → DEVANAGARI ABBREVIATION SIGN   # 
+
+0F0C ; 0F0B ;  SA      #* ( ༌ → ་ ) TIBETAN MARK DELIMITER TSHEG BSTAR → TIBETAN MARK INTERSYLLABIC TSHEG      # 
+
+02D8 ; 02C7 ;  SA      #* ( ˘ → ˇ ) BREVE → CARON        # 
+A67E ; 02C7 ;  SA      #* ( ꙾ → ˇ ) CYRILLIC KAVYKA → CARON     # →˘→
+
+00AF ; 02C9 ;  SA      #* ( ¯ → ˉ ) MACRON → MODIFIER LETTER MACRON      # 
+FFE3 ; 02C9 ;  SA      #* (  ̄ → ˉ ) FULLWIDTH MACRON → MODIFIER LETTER MACRON   # →‾→
+203E ; 02C9 ;  SA      #* ( ‾ → ˉ ) OVERLINE → MODIFIER LETTER MACRON   # 
+FE49 ; 02C9 ;  SA      #* ( ﹉ → ˉ ) DASHED OVERLINE → MODIFIER LETTER MACRON    # →‾→
+FE4A ; 02C9 ;  SA      #* ( ﹊ → ˉ ) CENTRELINE OVERLINE → MODIFIER LETTER MACRON        # →‾→
+FE4B ; 02C9 ;  SA      #* ( ﹋ → ˉ ) WAVY OVERLINE → MODIFIER LETTER MACRON      # →‾→
+FE4C ; 02C9 ;  SA      #* ( ﹌ → ˉ ) DOUBLE WAVY OVERLINE → MODIFIER LETTER MACRON       # →‾→
+2594 ; 02C9 ;  SA      #* ( ▔ → ˉ ) UPPER ONE EIGHTH BLOCK → MODIFIER LETTER MACRON     # →¯→
+
+0375 ; 02CF ;  SA      #* ( ͵ → ˏ ) GREEK LOWER NUMERAL SIGN → MODIFIER LETTER LOW ACUTE ACCENT  # 
+
+02FB ; 02EA ;  SA      #* ( ˻ → ˪ ) MODIFIER LETTER BEGIN LOW TONE → MODIFIER LETTER YIN DEPARTING TONE MARK     # 
+A716 ; 02EA ;  SA      #* ( ꜖ → ˪ ) MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR → MODIFIER LETTER YIN DEPARTING TONE MARK      # 
+
+A714 ; 02EB ;  SA      #* ( ꜔ → ˫ ) MODIFIER LETTER MID LEFT-STEM TONE BAR → MODIFIER LETTER YANG DEPARTING TONE MARK   # 
+
+2E30 ; 02F3 ;  SA      #* ( ⸰ → ˳ ) RING POINT → MODIFIER LETTER LOW RING       # 
+3002 ; 02F3 ;  SA      #* ( 。 → ˳ ) IDEOGRAPHIC FULL STOP → MODIFIER LETTER LOW RING    # 
+
+02DA ; 00B0 ;  SA      #* ( ˚ → ° ) RING ABOVE → DEGREE SIGN     # 
+2218 ; 00B0 ;  SA      #* ( ∘ → ° ) RING OPERATOR → DEGREE SIGN # 
+25CB ; 00B0 ;  SA      #* ( ○ → ° ) WHITE CIRCLE → DEGREE SIGN  # →◦→→∘→
+25E6 ; 00B0 ;  SA      #* ( ◦ → ° ) WHITE BULLET → DEGREE SIGN  # →∘→
+
+2103 ; 00B0 0043 ;     SA      #* ( ℃ → °C ) DEGREE CELSIUS → DEGREE SIGN, LATIN CAPITAL LETTER C       # 
+
+2109 ; 00B0 0046 ;     SA      #* ( ℉ → °F ) DEGREE FAHRENHEIT → DEGREE SIGN, LATIN CAPITAL LETTER F    # 
+
+0BF5 ; 0BF3 ;  SA      #* ( ௵ → ௳ ) TAMIL YEAR SIGN → TAMIL DAY SIGN   # 
+
+24C5 ; 2117 ;  SA      #* ( Ⓟ → ℗ ) CIRCLED LATIN CAPITAL LETTER P → SOUND RECORDING COPYRIGHT # 
+
+21B5 ; 21B2 ;  SA      #* ( ↵ → ↲ ) DOWNWARDS ARROW WITH CORNER LEFTWARDS → DOWNWARDS ARROW WITH TIP LEFTWARDS # 
+
+2A21 ; 21BE ;  SA      #* ( ⨡ → ↾ ) Z NOTATION SCHEMA PROJECTION → UPWARDS HARPOON WITH BARB RIGHTWARDS        # 
+
+1D6DB ;        2202 ;  SA      #* ( 𝛛 → ∂ ) MATHEMATICAL BOLD PARTIAL DIFFERENTIAL → PARTIAL DIFFERENTIAL     # 
+1D715 ;        2202 ;  SA      #* ( 𝜕 → ∂ ) MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL → PARTIAL DIFFERENTIAL   # 
+1D74F ;        2202 ;  SA      #* ( 𝝏 → ∂ ) MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL → PARTIAL DIFFERENTIAL      # 
+1D789 ;        2202 ;  SA      #* ( 𝞉 → ∂ ) MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL → PARTIAL DIFFERENTIAL  # 
+1D7C3 ;        2202 ;  SA      #* ( 𝟃 → ∂ ) MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL → PARTIAL DIFFERENTIAL   # 
+
+00F0 ; 2202 0335 ;     SA      # ( ð → ∂̵ ) LATIN SMALL LETTER ETH → PARTIAL DIFFERENTIAL, COMBINING SHORT STROKE OVERLAY      # 
+
+2300 ; 2205 ;  SA      #* ( ⌀ → ∅ ) DIAMETER SIGN → EMPTY SET  # 
+
+1D6C1 ;        2207 ;  SA      #* ( 𝛁 → ∇ ) MATHEMATICAL BOLD NABLA → NABLA   # 
+1D6FB ;        2207 ;  SA      #* ( 𝛻 → ∇ ) MATHEMATICAL ITALIC NABLA → NABLA # 
+1D735 ;        2207 ;  SA      #* ( 𝜵 → ∇ ) MATHEMATICAL BOLD ITALIC NABLA → NABLA    # 
+1D76F ;        2207 ;  SA      #* ( 𝝯 → ∇ ) MATHEMATICAL SANS-SERIF BOLD NABLA → NABLA        # 
+1D7A9 ;        2207 ;  SA      #* ( 𝞩 → ∇ ) MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA → NABLA # 
+
+2588 ; 220E ;  SA      #* ( █ → ∎ ) FULL BLOCK → END OF PROOF  # →■→
+25A0 ; 220E ;  SA      #* ( ■ → ∎ ) BLACK SQUARE → END OF PROOF        # 
+
+2A3F ; 2210 ;  SA      #* ( ⨿ → ∐ ) AMALGAMATION OR COPRODUCT → N-ARY COPRODUCT        # 
+
+FB29 ; 002B ;  SA      #* ( ﬩ → + ) HEBREW LETTER ALTERNATIVE PLUS SIGN → PLUS SIGN      # 
+
+2039 ; 003C ;  SA      #* ( ‹ → < ) SINGLE LEFT-POINTING ANGLE QUOTATION MARK → LESS-THAN SIGN   # 
+02C2 ; 003C ;  SA      #* ( ˂ → < ) MODIFIER LETTER LEFT ARROWHEAD → LESS-THAN SIGN       # 
+276E ; 003C ;  SA      #* ( ❮ → < ) HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT → LESS-THAN SIGN   # →‹→
+
+A4FF ; 003D ;  SA      #* ( ꓿ → = ) LISU PUNCTUATION FULL STOP → EQUALS SIGN     # 
+
+2A75 ; 003D 003D ;     SA      #* ( ⩵ → == ) TWO CONSECUTIVE EQUALS SIGNS → EQUALS SIGN, EQUALS SIGN     # 
+
+2A76 ; 003D 003D 003D ;        SA      #* ( ⩶ → === ) THREE CONSECUTIVE EQUALS SIGNS → EQUALS SIGN, EQUALS SIGN, EQUALS SIGN     # 
+
+203A ; 003E ;  SA      #* ( › → > ) SINGLE RIGHT-POINTING ANGLE QUOTATION MARK → GREATER-THAN SIGN       # 
+02C3 ; 003E ;  SA      #* ( ˃ → > ) MODIFIER LETTER RIGHT ARROWHEAD → GREATER-THAN SIGN   # 
+276F ; 003E ;  SA      #* ( ❯ → > ) HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT → GREATER-THAN SIGN       # →›→
+
+05F0 ; 007C 007C ;     SA      # ( ‎װ‎ → || ) HEBREW LIGATURE YIDDISH DOUBLE VAV → VERTICAL LINE, VERTICAL LINE       # →‎וו‎→→ll→
+
+02DC ; 007E ;  SA      #* ( ˜ → ~ ) SMALL TILDE → TILDE   # 
+1FC0 ; 007E ;  SA      #* ( ῀ → ~ ) GREEK PERISPOMENI → TILDE    # →˜→
+2053 ; 007E ;  SA      #* ( ⁓ → ~ ) SWUNG DASH → TILDE   # 
+223C ; 007E ;  SA      #* ( ∼ → ~ ) TILDE OPERATOR → TILDE       # 
+
+22C0 ; 2227 ;  SA      #* ( ⋀ → ∧ ) N-ARY LOGICAL AND → LOGICAL AND    # 
+
+22C3 ; 222A ;  SA      #* ( ⋃ → ∪ ) N-ARY UNION → UNION        # 
+
+222F ; 222E 222E ;     SA      #* ( ∯ → ∮∮ ) SURFACE INTEGRAL → CONTOUR INTEGRAL, CONTOUR INTEGRAL   # 
+
+2230 ; 222E 222E 222E ;        SA      #* ( ∰ → ∮∮∮ ) VOLUME INTEGRAL → CONTOUR INTEGRAL, CONTOUR INTEGRAL, CONTOUR INTEGRAL       # 
+
+2263 ; 2261 ;  SA      #* ( ≣ → ≡ ) STRICTLY EQUIVALENT TO → IDENTICAL TO      # 
+
+2A20 ; 226B ;  SA      #* ( ⨠ → ≫ ) Z NOTATION SCHEMA PIPING → MUCH GREATER-THAN       # 
+
+2A03 ; 228D ;  SA      #* ( ⨃ → ⊍ ) N-ARY UNION OPERATOR WITH DOT → MULTISET MULTIPLICATION    # 
+
+2A04 ; 228E ;  SA      #* ( ⨄ → ⊎ ) N-ARY UNION OPERATOR WITH PLUS → MULTISET UNION    # 
+
+2A05 ; 2293 ;  SA      #* ( ⨅ → ⊓ ) N-ARY SQUARE INTERSECTION OPERATOR → SQUARE CAP    # 
+
+2A06 ; 2294 ;  SA      #* ( ⨆ → ⊔ ) N-ARY SQUARE UNION OPERATOR → SQUARE CUP   # 
+
+2641 ; 2295 ;  SA      #* ( ♁ → ⊕ ) EARTH → CIRCLED PLUS       # 
+2A01 ; 2295 ;  SA      #* ( ⨁ → ⊕ ) N-ARY CIRCLED PLUS OPERATOR → CIRCLED PLUS # 
+
+2A02 ; 2297 ;  SA      #* ( ⨂ → ⊗ ) N-ARY CIRCLED TIMES OPERATOR → CIRCLED TIMES       # 
+
+2609 ; 2299 ;  SA      #* ( ☉ → ⊙ ) SUN → CIRCLED DOT OPERATOR # 
+2A00 ; 2299 ;  SA      #* ( ⨀ → ⊙ ) N-ARY CIRCLED DOT OPERATOR → CIRCLED DOT OPERATOR  # 
+
+25B7 ; 22B2 ;  SA      #* ( ▷ → ⊲ ) WHITE RIGHT-POINTING TRIANGLE → NORMAL SUBGROUP OF # 
+
+25C7 ; 22C4 ;  SA      #* ( ◇ → ⋄ ) WHITE DIAMOND → DIAMOND OPERATOR   # 
+25CA ; 22C4 ;  SA      #* ( ◊ → ⋄ ) LOZENGE → DIAMOND OPERATOR # 
+2662 ; 22C4 ;  SA      #* ( ♢ → ⋄ ) WHITE DIAMOND SUIT → DIAMOND OPERATOR      # →◊→
+
+2A1D ; 22C8 ;  SA      #* ( ⨝ → ⋈ ) JOIN → BOWTIE      # 
+
+25E0 ; 2312 ;  SA      #* ( ◠ → ⌒ ) UPPER HALF CIRCLE → ARC    # 
+
+2A3D ; 2319 ;  SA      #* ( ⨽ → ⌙ ) RIGHTHAND INTERIOR PRODUCT → TURNED NOT SIGN       # 
+
+2325 ; 2324 ;  SA      #* ( ⌥ → ⌤ ) OPTION KEY → UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS      # 
+
+2638 ; 2388 ;  SA      #* ( ☸ → ⎈ ) WHEEL OF DHARMA → HELM SYMBOL      # 
+
+FE35 ; 23DC ;  SA      #* ( ︵ → ⏜ ) PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS → TOP PARENTHESIS  # 
+
+FE36 ; 23DD ;  SA      #* ( ︶ → ⏝ ) PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS → BOTTOM PARENTHESIS      # 
+
+FE37 ; 23DE ;  SA      #* ( ︷ → ⏞ ) PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET → TOP CURLY BRACKET      # 
+
+FE38 ; 23DF ;  SA      #* ( ︸ → ⏟ ) PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET → BOTTOM CURLY BRACKET  # 
+
+FE39 ; 23E0 ;  SA      #* ( ︹ → ⏠ ) PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET → TOP TORTOISE SHELL BRACKET    # 
+
+FE3A ; 23E1 ;  SA      #* ( ︺ → ⏡ ) PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET → BOTTOM TORTOISE SHELL BRACKET        # 
+
+25B1 ; 23E5 ;  SA      #* ( ▱ → ⏥ ) WHITE PARALLELOGRAM → FLATNESS     # 
+
+FE31 ; 2502 ;  SA      #* ( ︱ → │ ) PRESENTATION FORM FOR VERTICAL EM DASH → BOX DRAWINGS LIGHT VERTICAL       # →|→
+FF5C ; 2502 ;  SA      #* ( | → │ ) FULLWIDTH VERTICAL LINE → BOX DRAWINGS LIGHT VERTICAL      # 
+2503 ; 2502 ;  SA      #* ( ┃ → │ ) BOX DRAWINGS HEAVY VERTICAL → BOX DRAWINGS LIGHT VERTICAL  # 
+
+250F ; 250C ;  SA      #* ( ┏ → ┌ ) BOX DRAWINGS HEAVY DOWN AND RIGHT → BOX DRAWINGS LIGHT DOWN AND RIGHT      # 
+
+2523 ; 251C ;  SA      #* ( ┣ → ├ ) BOX DRAWINGS HEAVY VERTICAL AND RIGHT → BOX DRAWINGS LIGHT VERTICAL AND RIGHT      # 
+
+2590 ; 258C ;  SA      #* ( ▐ → ▌ ) RIGHT HALF BLOCK → LEFT HALF BLOCK # 
+
+2597 ; 2596 ;  SA      #* ( ▗ → ▖ ) QUADRANT LOWER RIGHT → QUADRANT LOWER LEFT # 
+
+259D ; 2598 ;  SA      #* ( ▝ → ▘ ) QUADRANT UPPER RIGHT → QUADRANT UPPER LEFT # 
+
+2610 ; 25A1 ;  SA      #* ( ☐ → □ ) BALLOT BOX → WHITE SQUARE  # 
+
+FFED ; 25AA ;  SA      #* ( ■ → ▪ ) HALFWIDTH BLACK SQUARE → BLACK SMALL SQUARE        # 
+
+25B8 ; 25B6 ;  SA      #* ( ▸ → ▶ ) BLACK RIGHT-POINTING SMALL TRIANGLE → BLACK RIGHT-POINTING TRIANGLE        # →►→
+25BA ; 25B6 ;  SA      #* ( ► → ▶ ) BLACK RIGHT-POINTING POINTER → BLACK RIGHT-POINTING TRIANGLE       # 
+
+29BE ; 25CE ;  SA      #* ( ⦾ → ◎ ) CIRCLED WHITE BULLET → BULLSEYE    # 
+
+2CE9 ; 2627 ;  SA      #* ( ⳩ → ☧ ) COPTIC SYMBOL KHI RO → CHI RHO     # 
+
+2329 ; 276C ;  SA      #* ( 〈 → ❬ ) LEFT-POINTING ANGLE BRACKET → MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT  # →〈→
+3008 ; 276C ;  SA      #* ( 〈 → ❬ ) LEFT ANGLE BRACKET → MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT   # 
+27E8 ; 276C ;  SA      #* ( ⟨ → ❬ ) MATHEMATICAL LEFT ANGLE BRACKET → MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT      # →〈→
+
+232A ; 276D ;  SA      #* ( 〉 → ❭ ) RIGHT-POINTING ANGLE BRACKET → MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT        # →〉→
+3009 ; 276D ;  SA      #* ( 〉 → ❭ ) RIGHT ANGLE BRACKET → MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT # 
+27E9 ; 276D ;  SA      #* ( ⟩ → ❭ ) MATHEMATICAL RIGHT ANGLE BRACKET → MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT    # →〉→
+
+301B ; 27E7 ;  SA      #* ( 〛 → ⟧ ) RIGHT WHITE SQUARE BRACKET → MATHEMATICAL RIGHT WHITE SQUARE BRACKET       # 
+
+29D9 ; 299A ;  SA      #* ( ⧙ → ⦚ ) RIGHT WIGGLY FENCE → VERTICAL ZIGZAG LINE  # 
+
+2A3E ; 2A1F ;  SA      #* ( ⨾ → ⨟ ) Z NOTATION RELATIONAL COMPOSITION → Z NOTATION SCHEMA COMPOSITION  # 
+
+3036 ; 3012 ;  SA      #* ( 〶 → 〒 ) CIRCLED POSTAL MARK → POSTAL MARK  # 
+
+02D9 ; 0971 ;  SA      #* ( ˙ → ॱ ) DOT ABOVE → DEVANAGARI SIGN HIGH SPACING DOT        # 
+
+FF0D ; 30FC ;  SA      #* ( - → ー ) FULLWIDTH HYPHEN-MINUS → KATAKANA-HIRAGANA PROLONGED SOUND MARK    # 
+2014 ; 30FC ;  SA      #* ( — → ー ) EM DASH → KATAKANA-HIRAGANA PROLONGED SOUND MARK   # →一→
+2015 ; 30FC ;  SA      #* ( ― → ー ) HORIZONTAL BAR → KATAKANA-HIRAGANA PROLONGED SOUND MARK    # →—→→一→
+2500 ; 30FC ;  SA      #* ( ─ → ー ) BOX DRAWINGS LIGHT HORIZONTAL → KATAKANA-HIRAGANA PROLONGED SOUND MARK     # →―→→—→→一→
+2501 ; 30FC ;  SA      #* ( ━ → ー ) BOX DRAWINGS HEAVY HORIZONTAL → KATAKANA-HIRAGANA PROLONGED SOUND MARK     # →—→→一→
+31D0 ; 30FC ;  SA      #* ( ㇐ → ー ) CJK STROKE H → KATAKANA-HIRAGANA PROLONGED SOUND MARK      # →一→
+1173 ; 30FC ;  SA      # ( ᅳ → ー ) HANGUL JUNGSEONG EU → KATAKANA-HIRAGANA PROLONGED SOUND MARK        # →ㅡ→→—→→一→
+3161 ; 30FC ;  SA      # ( ㅡ → ー ) HANGUL LETTER EU → KATAKANA-HIRAGANA PROLONGED SOUND MARK   # →—→→一→
+4E00 ; 30FC ;  SA      # ( 一 → ー ) CJK UNIFIED IDEOGRAPH-4E00 → KATAKANA-HIRAGANA PROLONGED SOUND MARK # 
+2F00 ; 30FC ;  SA      #* ( ⼀ → ー ) KANGXI RADICAL ONE → KATAKANA-HIRAGANA PROLONGED SOUND MARK        # →一→
+
+1196 ; 30FC 30FC ;     SA      # ( ᆖ → ーー ) HANGUL JUNGSEONG EU-EU → KATAKANA-HIRAGANA PROLONGED SOUND MARK, KATAKANA-HIRAGANA PROLONGED SOUND MARK  # →ᅳᅳ→
+
+20A4 ; 00A3 ;  SA      #* ( ₤ → £ ) LIRA SIGN → POUND SIGN      # 
+
+07C0 ; 0030 ;  SA      # ( ‎߀‎ → 0 ) NKO DIGIT ZERO → DIGIT ZERO      # 
+09E6 ; 0030 ;  SA      # ( ০ → 0 ) BENGALI DIGIT ZERO → DIGIT ZERO       # 
+0B66 ; 0030 ;  SA      # ( ୦ → 0 ) ORIYA DIGIT ZERO → DIGIT ZERO # 
+3007 ; 0030 ;  SA      # ( 〇 → 0 ) IDEOGRAPHIC NUMBER ZERO → DIGIT ZERO  # →O→
+039F ; 0030 ;  SA      # ( Ο → 0 ) GREEK CAPITAL LETTER OMICRON → DIGIT ZERO      # 
+2C9E ; 0030 ;  SA      # ( Ⲟ → 0 ) COPTIC CAPITAL LETTER O → DIGIT ZERO  # →Ο→
+041E ; 0030 ;  SA      # ( О → 0 ) CYRILLIC CAPITAL LETTER O → DIGIT ZERO # 
+0555 ; 0030 ;  SA      # ( Օ → 0 ) ARMENIAN CAPITAL LETTER OH → DIGIT ZERO        # →Ο→
+2D54 ; 0030 ;  SA      # ( ⵔ → 0 ) TIFINAGH LETTER YAR → DIGIT ZERO      # →Ο→
+0B20 ; 0030 ;  SA      # ( ଠ → 0 ) ORIYA LETTER TTHA → DIGIT ZERO        # →୦→
+0D20 ; 0030 ;  SA      # ( ഠ → 0 ) MALAYALAM LETTER TTHA → DIGIT ZERO    # 
+A4F3 ; 0030 ;  SA      # ( ꓳ → 0 ) LISU LETTER O → DIGIT ZERO    # →O→
+
+1B5C ; 1B50 ;  SA      #* ( ᭜ → ᭐ ) BALINESE WINDU → BALINESE DIGIT ZERO       # 
+
+A9C6 ; A9D0 ;  SA      #* ( ꧆ → ꧐ ) JAVANESE PADA WINDU → JAVANESE DIGIT ZERO  # 
+
+066A ; 2070 002F 2080 2080 ;   SA      #* ( ٪ → ⁰/₀₀ ) ARABIC PERCENT SIGN → SUPERSCRIPT ZERO, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO      # →%→→‰→
+0609 ; 2070 002F 2080 2080 ;   SA      #* ( ؉ → ⁰/₀₀ ) ARABIC-INDIC PER MILLE SIGN → SUPERSCRIPT ZERO, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO      # →%→→‰→
+060A ; 2070 002F 2080 2080 ;   SA      #* ( ؊ → ⁰/₀₀ ) ARABIC-INDIC PER TEN THOUSAND SIGN → SUPERSCRIPT ZERO, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO       # →%→→‰→
+
+3358 ; 0030 70B9 ;     SA      #* ( ㍘ → 0点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO → DIGIT ZERO, CJK UNIFIED IDEOGRAPH-70B9       # 
+
+0399 ; 0031 ;  SA      # ( Ι → 1 ) GREEK CAPITAL LETTER IOTA → DIGIT ONE  # →l→
+2C92 ; 0031 ;  SA      # ( Ⲓ → 1 ) COPTIC CAPITAL LETTER IAUDA → DIGIT ONE       # →I→
+0406 ; 0031 ;  SA      # ( І → 1 ) CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I → DIGIT ONE   # →l→
+04C0 ; 0031 ;  SA      # ( Ӏ → 1 ) CYRILLIC LETTER PALOCHKA → DIGIT ONE   # →l→
+05D5 ; 0031 ;  SA      # ( ‎ו‎ → 1 ) HEBREW LETTER VAV → DIGIT ONE    # →l→
+05DF ; 0031 ;  SA      # ( ‎ן‎ → 1 ) HEBREW LETTER FINAL NUN → DIGIT ONE      # →l→
+07CA ; 0031 ;  SA      # ( ‎ߊ‎ → 1 ) NKO LETTER A → DIGIT ONE # →∣→→|→→l→
+2D4F ; 0031 ;  SA      # ( ⵏ → 1 ) TIFINAGH LETTER YAN → DIGIT ONE       # →I→
+A4F2 ; 0031 ;  SA      # ( ꓲ → 1 ) LISU LETTER I → DIGIT ONE     # →I→
+
+2460 ; 2780 ;  SA      #* ( ① → ➀ ) CIRCLED DIGIT ONE → DINGBAT CIRCLED SANS-SERIF DIGIT ONE   # 
+
+06F1 ; 0661 ;  SA      # ( ۱ → ‎١‎ ) EXTENDED ARABIC-INDIC DIGIT ONE → ARABIC-INDIC DIGIT ONE        # 
+
+1065 ; 1041 ;  SA      # ( ၥ → ၁ ) MYANMAR LETTER WESTERN PWO KAREN THA → MYANMAR DIGIT ONE    # 
+
+2469 ; 2789 ;  SA      #* ( ⑩ → ➉ ) CIRCLED NUMBER TEN → DINGBAT CIRCLED SANS-SERIF NUMBER TEN # 
+
+33E9 ; 0031 0030 65E5 ;        SA      #* ( ㏩ → 10日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN → DIGIT ONE, DIGIT ZERO, CJK UNIFIED IDEOGRAPH-65E5     # 
+
+32C9 ; 0031 0030 6708 ;        SA      #* ( ㋉ → 10月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER → DIGIT ONE, DIGIT ZERO, CJK UNIFIED IDEOGRAPH-6708     # 
+
+3362 ; 0031 0030 70B9 ;        SA      #* ( ㍢ → 10点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN → DIGIT ONE, DIGIT ZERO, CJK UNIFIED IDEOGRAPH-70B9    # 
+
+33EA ; 0031 0031 65E5 ;        SA      #* ( ㏪ → 11日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN → DIGIT ONE, DIGIT ONE, CJK UNIFIED IDEOGRAPH-65E5   # 
+
+32CA ; 0031 0031 6708 ;        SA      #* ( ㋊ → 11月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER → DIGIT ONE, DIGIT ONE, CJK UNIFIED IDEOGRAPH-6708     # 
+
+3363 ; 0031 0031 70B9 ;        SA      #* ( ㍣ → 11点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN → DIGIT ONE, DIGIT ONE, CJK UNIFIED IDEOGRAPH-70B9  # 
+
+33EB ; 0031 0032 65E5 ;        SA      #* ( ㏫ → 12日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE → DIGIT ONE, DIGIT TWO, CJK UNIFIED IDEOGRAPH-65E5   # 
+
+32CB ; 0031 0032 6708 ;        SA      #* ( ㋋ → 12月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER → DIGIT ONE, DIGIT TWO, CJK UNIFIED IDEOGRAPH-6708     # 
+
+3364 ; 0031 0032 70B9 ;        SA      #* ( ㍤ → 12点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE → DIGIT ONE, DIGIT TWO, CJK UNIFIED IDEOGRAPH-70B9  # 
+
+33EC ; 0031 0033 65E5 ;        SA      #* ( ㏬ → 13日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN → DIGIT ONE, DIGIT THREE, CJK UNIFIED IDEOGRAPH-65E5       # 
+
+3365 ; 0031 0033 70B9 ;        SA      #* ( ㍥ → 13点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN → DIGIT ONE, DIGIT THREE, CJK UNIFIED IDEOGRAPH-70B9      # 
+
+33ED ; 0031 0034 65E5 ;        SA      #* ( ㏭ → 14日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN → DIGIT ONE, DIGIT FOUR, CJK UNIFIED IDEOGRAPH-65E5        # 
+
+3366 ; 0031 0034 70B9 ;        SA      #* ( ㍦ → 14点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN → DIGIT ONE, DIGIT FOUR, CJK UNIFIED IDEOGRAPH-70B9       # 
+
+33EE ; 0031 0035 65E5 ;        SA      #* ( ㏮ → 15日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN → DIGIT ONE, DIGIT FIVE, CJK UNIFIED IDEOGRAPH-65E5 # 
+
+3367 ; 0031 0035 70B9 ;        SA      #* ( ㍧ → 15点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN → DIGIT ONE, DIGIT FIVE, CJK UNIFIED IDEOGRAPH-70B9        # 
+
+33EF ; 0031 0036 65E5 ;        SA      #* ( ㏯ → 16日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN → DIGIT ONE, DIGIT SIX, CJK UNIFIED IDEOGRAPH-65E5  # 
+
+3368 ; 0031 0036 70B9 ;        SA      #* ( ㍨ → 16点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN → DIGIT ONE, DIGIT SIX, CJK UNIFIED IDEOGRAPH-70B9 # 
+
+33F0 ; 0031 0037 65E5 ;        SA      #* ( ㏰ → 17日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN → DIGIT ONE, DIGIT SEVEN, CJK UNIFIED IDEOGRAPH-65E5      # 
+
+3369 ; 0031 0037 70B9 ;        SA      #* ( ㍩ → 17点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN → DIGIT ONE, DIGIT SEVEN, CJK UNIFIED IDEOGRAPH-70B9     # 
+
+33F1 ; 0031 0038 65E5 ;        SA      #* ( ㏱ → 18日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN → DIGIT ONE, DIGIT EIGHT, CJK UNIFIED IDEOGRAPH-65E5       # 
+
+336A ; 0031 0038 70B9 ;        SA      #* ( ㍪ → 18点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN → DIGIT ONE, DIGIT EIGHT, CJK UNIFIED IDEOGRAPH-70B9      # 
+
+33F2 ; 0031 0039 65E5 ;        SA      #* ( ㏲ → 19日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN → DIGIT ONE, DIGIT NINE, CJK UNIFIED IDEOGRAPH-65E5        # 
+
+336B ; 0031 0039 70B9 ;        SA      #* ( ㍫ → 19点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN → DIGIT ONE, DIGIT NINE, CJK UNIFIED IDEOGRAPH-70B9       # 
+
+14B7 ; 0031 1427 ;     SA      # ( ᒷ → 1ᐧ ) CANADIAN SYLLABICS WEST-CREE MWA → DIGIT ONE, CANADIAN SYLLABICS FINAL MIDDLE DOT  # 
+
+33E0 ; 0031 65E5 ;     SA      #* ( ㏠ → 1日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE → DIGIT ONE, CJK UNIFIED IDEOGRAPH-65E5  # 
+
+32C0 ; 0031 6708 ;     SA      #* ( ㋀ → 1月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY → DIGIT ONE, CJK UNIFIED IDEOGRAPH-6708  # 
+
+3359 ; 0031 70B9 ;     SA      #* ( ㍙ → 1点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE → DIGIT ONE, CJK UNIFIED IDEOGRAPH-70B9 # 
+
+1D7D0 ;        0032 ;  SA      # ( 𝟐 → 2 ) MATHEMATICAL BOLD DIGIT TWO → DIGIT TWO      # 
+1D7DA ;        0032 ;  SA      # ( 𝟚 → 2 ) MATHEMATICAL DOUBLE-STRUCK DIGIT TWO → DIGIT TWO     # 
+1D7E4 ;        0032 ;  SA      # ( 𝟤 → 2 ) MATHEMATICAL SANS-SERIF DIGIT TWO → DIGIT TWO        # 
+1D7EE ;        0032 ;  SA      # ( 𝟮 → 2 ) MATHEMATICAL SANS-SERIF BOLD DIGIT TWO → DIGIT TWO   # 
+1D7F8 ;        0032 ;  SA      # ( 𝟸 → 2 ) MATHEMATICAL MONOSPACE DIGIT TWO → DIGIT TWO # 
+A75A ; 0032 ;  SA      # ( Ꝛ → 2 ) LATIN CAPITAL LETTER R ROTUNDA → DIGIT TWO    # 
+01A7 ; 0032 ;  SA      # ( Ƨ → 2 ) LATIN CAPITAL LETTER TONE TWO → DIGIT TWO      # 
+03E8 ; 0032 ;  SA      # ( Ϩ → 2 ) COPTIC CAPITAL LETTER HORI → DIGIT TWO # →Ƨ→
+A644 ; 0032 ;  SA      # ( Ꙅ → 2 ) CYRILLIC CAPITAL LETTER REVERSED DZE → DIGIT TWO      # →Ƨ→
+14BF ; 0032 ;  SA      # ( ᒿ → 2 ) CANADIAN SYLLABICS SAYISI M → DIGIT TWO       # 
+
+2461 ; 2781 ;  SA      #* ( ② → ➁ ) CIRCLED DIGIT TWO → DINGBAT CIRCLED SANS-SERIF DIGIT TWO   # 
+
+06F2 ; 0662 ;  SA      # ( ۲ → ‎٢‎ ) EXTENDED ARABIC-INDIC DIGIT TWO → ARABIC-INDIC DIGIT TWO        # 
+
+1F103 ;        0032 002C ;     SA      #* ( 🄃 → 2, ) DIGIT TWO COMMA → DIGIT TWO, COMMA # 
+
+2489 ; 0032 002E ;     SA      #* ( ⒉ → 2. ) DIGIT TWO FULL STOP → DIGIT TWO, FULL STOP  # 
+
+33F3 ; 0032 0030 65E5 ;        SA      #* ( ㏳ → 20日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY → DIGIT TWO, DIGIT ZERO, CJK UNIFIED IDEOGRAPH-65E5  # 
+
+336C ; 0032 0030 70B9 ;        SA      #* ( ㍬ → 20点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY → DIGIT TWO, DIGIT ZERO, CJK UNIFIED IDEOGRAPH-70B9 # 
+
+33F4 ; 0032 0031 65E5 ;        SA      #* ( ㏴ → 21日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE → DIGIT TWO, DIGIT ONE, CJK UNIFIED IDEOGRAPH-65E5       # 
+
+336D ; 0032 0031 70B9 ;        SA      #* ( ㍭ → 21点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE → DIGIT TWO, DIGIT ONE, CJK UNIFIED IDEOGRAPH-70B9      # 
+
+33F5 ; 0032 0032 65E5 ;        SA      #* ( ㏵ → 22日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO → DIGIT TWO, DIGIT TWO, CJK UNIFIED IDEOGRAPH-65E5       # 
+
+336E ; 0032 0032 70B9 ;        SA      #* ( ㍮ → 22点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO → DIGIT TWO, DIGIT TWO, CJK UNIFIED IDEOGRAPH-70B9      # 
+
+33F6 ; 0032 0033 65E5 ;        SA      #* ( ㏶ → 23日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE → DIGIT TWO, DIGIT THREE, CJK UNIFIED IDEOGRAPH-65E5   # 
+
+336F ; 0032 0033 70B9 ;        SA      #* ( ㍯ → 23点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE → DIGIT TWO, DIGIT THREE, CJK UNIFIED IDEOGRAPH-70B9  # 
+
+33F7 ; 0032 0034 65E5 ;        SA      #* ( ㏷ → 24日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR → DIGIT TWO, DIGIT FOUR, CJK UNIFIED IDEOGRAPH-65E5     # 
+
+3370 ; 0032 0034 70B9 ;        SA      #* ( ㍰ → 24点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR → DIGIT TWO, DIGIT FOUR, CJK UNIFIED IDEOGRAPH-70B9    # 
+
+33F8 ; 0032 0035 65E5 ;        SA      #* ( ㏸ → 25日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE → DIGIT TWO, DIGIT FIVE, CJK UNIFIED IDEOGRAPH-65E5     # 
+
+33F9 ; 0032 0036 65E5 ;        SA      #* ( ㏹ → 26日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX → DIGIT TWO, DIGIT SIX, CJK UNIFIED IDEOGRAPH-65E5       # 
+
+33FA ; 0032 0037 65E5 ;        SA      #* ( ㏺ → 27日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN → DIGIT TWO, DIGIT SEVEN, CJK UNIFIED IDEOGRAPH-65E5   # 
+
+33FB ; 0032 0038 65E5 ;        SA      #* ( ㏻ → 28日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT → DIGIT TWO, DIGIT EIGHT, CJK UNIFIED IDEOGRAPH-65E5   # 
+
+33FC ; 0032 0039 65E5 ;        SA      #* ( ㏼ → 29日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE → DIGIT TWO, DIGIT NINE, CJK UNIFIED IDEOGRAPH-65E5     # 
+
+249B ; 0032 004F 002E ;        SA      #* ( ⒛ → 2O. ) NUMBER TWENTY FULL STOP → DIGIT TWO, LATIN CAPITAL LETTER O, FULL STOP     # →20.→
+
+33E1 ; 0032 65E5 ;     SA      #* ( ㏡ → 2日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO → DIGIT TWO, CJK UNIFIED IDEOGRAPH-65E5  # 
+
+32C1 ; 0032 6708 ;     SA      #* ( ㋁ → 2月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY → DIGIT TWO, CJK UNIFIED IDEOGRAPH-6708 # 
+
+335A ; 0032 70B9 ;     SA      #* ( ㍚ → 2点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO → DIGIT TWO, CJK UNIFIED IDEOGRAPH-70B9 # 
+
+1D7D1 ;        0033 ;  SA      # ( 𝟑 → 3 ) MATHEMATICAL BOLD DIGIT THREE → DIGIT THREE  # 
+1D7DB ;        0033 ;  SA      # ( 𝟛 → 3 ) MATHEMATICAL DOUBLE-STRUCK DIGIT THREE → DIGIT THREE # 
+1D7E5 ;        0033 ;  SA      # ( 𝟥 → 3 ) MATHEMATICAL SANS-SERIF DIGIT THREE → DIGIT THREE    # 
+1D7EF ;        0033 ;  SA      # ( 𝟯 → 3 ) MATHEMATICAL SANS-SERIF BOLD DIGIT THREE → DIGIT THREE       # 
+1D7F9 ;        0033 ;  SA      # ( 𝟹 → 3 ) MATHEMATICAL MONOSPACE DIGIT THREE → DIGIT THREE     # 
+01B7 ; 0033 ;  SA      # ( Ʒ → 3 ) LATIN CAPITAL LETTER EZH → DIGIT THREE # 
+021C ; 0033 ;  SA      # ( Ȝ → 3 ) LATIN CAPITAL LETTER YOGH → DIGIT THREE        # →Ʒ→
+A76A ; 0033 ;  SA      # ( Ꝫ → 3 ) LATIN CAPITAL LETTER ET → DIGIT THREE # 
+2CCC ; 0033 ;  SA      # ( Ⳍ → 3 ) COPTIC CAPITAL LETTER OLD COPTIC HORI → DIGIT THREE   # →Ȝ→→Ʒ→
+0417 ; 0033 ;  SA      # ( З → 3 ) CYRILLIC CAPITAL LETTER ZE → DIGIT THREE       # 
+04E0 ; 0033 ;  SA      # ( Ӡ → 3 ) CYRILLIC CAPITAL LETTER ABKHASIAN DZE → DIGIT THREE    # →Ʒ→
+0545 ; 0033 ;  SA      # ( Յ → 3 ) ARMENIAN CAPITAL LETTER YI → DIGIT THREE       # 
+
+2462 ; 2782 ;  SA      #* ( ③ → ➂ ) CIRCLED DIGIT THREE → DINGBAT CIRCLED SANS-SERIF DIGIT THREE       # 
+
+0498 ; 0033 0326 ;     SA      # ( Ҙ → 3̦ ) CYRILLIC CAPITAL LETTER ZE WITH DESCENDER → DIGIT THREE, COMBINING COMMA BELOW       # →З̧→
+
+06F3 ; 0663 ;  SA      # ( ۳ → ‎٣‎ ) EXTENDED ARABIC-INDIC DIGIT THREE → ARABIC-INDIC DIGIT THREE    # 
+
+1F104 ;        0033 002C ;     SA      #* ( 🄄 → 3, ) DIGIT THREE COMMA → DIGIT THREE, COMMA     # 
+
+248A ; 0033 002E ;     SA      #* ( ⒊ → 3. ) DIGIT THREE FULL STOP → DIGIT THREE, FULL STOP      # 
+
+33FD ; 0033 0030 65E5 ;        SA      #* ( ㏽ → 30日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY → DIGIT THREE, DIGIT ZERO, CJK UNIFIED IDEOGRAPH-65E5        # 
+
+33FE ; 0033 0031 65E5 ;        SA      #* ( ㏾ → 31日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE → DIGIT THREE, DIGIT ONE, CJK UNIFIED IDEOGRAPH-65E5     # 
+
+33E2 ; 0033 65E5 ;     SA      #* ( ㏢ → 3日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE → DIGIT THREE, CJK UNIFIED IDEOGRAPH-65E5      # 
+
+32C2 ; 0033 6708 ;     SA      #* ( ㋂ → 3月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH → DIGIT THREE, CJK UNIFIED IDEOGRAPH-6708  # 
+
+335B ; 0033 70B9 ;     SA      #* ( ㍛ → 3点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE → DIGIT THREE, CJK UNIFIED IDEOGRAPH-70B9     # 
+
+1D7D2 ;        0034 ;  SA      # ( 𝟒 → 4 ) MATHEMATICAL BOLD DIGIT FOUR → DIGIT FOUR    # 
+1D7DC ;        0034 ;  SA      # ( 𝟜 → 4 ) MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR → DIGIT FOUR   # 
+1D7E6 ;        0034 ;  SA      # ( 𝟦 → 4 ) MATHEMATICAL SANS-SERIF DIGIT FOUR → DIGIT FOUR      # 
+1D7F0 ;        0034 ;  SA      # ( 𝟰 → 4 ) MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR → DIGIT FOUR # 
+1D7FA ;        0034 ;  SA      # ( 𝟺 → 4 ) MATHEMATICAL MONOSPACE DIGIT FOUR → DIGIT FOUR       # 
+13CE ; 0034 ;  SA      # ( Ꮞ → 4 ) CHEROKEE LETTER SE → DIGIT FOUR       # 
+
+2463 ; 2783 ;  SA      #* ( ④ → ➃ ) CIRCLED DIGIT FOUR → DINGBAT CIRCLED SANS-SERIF DIGIT FOUR # 
+
+1F105 ;        0034 002C ;     SA      #* ( 🄅 → 4, ) DIGIT FOUR COMMA → DIGIT FOUR, COMMA       # 
+
+248B ; 0034 002E ;     SA      #* ( ⒋ → 4. ) DIGIT FOUR FULL STOP → DIGIT FOUR, FULL STOP        # 
+
+1530 ; 0034 00B7 ;     SA      # ( ᔰ → 4· ) CANADIAN SYLLABICS WEST-CREE YWE → DIGIT FOUR, MIDDLE DOT   # →4ᐧ→
+
+33E3 ; 0034 65E5 ;     SA      #* ( ㏣ → 4日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR → DIGIT FOUR, CJK UNIFIED IDEOGRAPH-65E5        # 
+
+32C3 ; 0034 6708 ;     SA      #* ( ㋃ → 4月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL → DIGIT FOUR, CJK UNIFIED IDEOGRAPH-6708   # 
+
+335C ; 0034 70B9 ;     SA      #* ( ㍜ → 4点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR → DIGIT FOUR, CJK UNIFIED IDEOGRAPH-70B9       # 
+
+1D7D3 ;        0035 ;  SA      # ( 𝟓 → 5 ) MATHEMATICAL BOLD DIGIT FIVE → DIGIT FIVE    # 
+1D7DD ;        0035 ;  SA      # ( 𝟝 → 5 ) MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE → DIGIT FIVE   # 
+1D7E7 ;        0035 ;  SA      # ( 𝟧 → 5 ) MATHEMATICAL SANS-SERIF DIGIT FIVE → DIGIT FIVE      # 
+1D7F1 ;        0035 ;  SA      # ( 𝟱 → 5 ) MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE → DIGIT FIVE # 
+1D7FB ;        0035 ;  SA      # ( 𝟻 → 5 ) MATHEMATICAL MONOSPACE DIGIT FIVE → DIGIT FIVE       # 
+01BC ; 0035 ;  SA      # ( Ƽ → 5 ) LATIN CAPITAL LETTER TONE FIVE → DIGIT FIVE    # 
+
+2464 ; 2784 ;  SA      #* ( ⑤ → ➄ ) CIRCLED DIGIT FIVE → DINGBAT CIRCLED SANS-SERIF DIGIT FIVE # 
+
+0C02 ; 0665 ;  SA      # ( ం → ‎٥‎ ) TELUGU SIGN ANUSVARA → ARABIC-INDIC DIGIT FIVE # →o→
+0C82 ; 0665 ;  SA      # ( ಂ → ‎٥‎ ) KANNADA SIGN ANUSVARA → ARABIC-INDIC DIGIT FIVE        # →o→
+0D02 ; 0665 ;  SA      # ( ം → ‎٥‎ ) MALAYALAM SIGN ANUSVARA → ARABIC-INDIC DIGIT FIVE      # →o→
+0D82 ; 0665 ;  SA      # ( ං → ‎٥‎ ) SINHALA SIGN ANUSVARAYA → ARABIC-INDIC DIGIT FIVE      # →o→
+0966 ; 0665 ;  SA      # ( ० → ‎٥‎ ) DEVANAGARI DIGIT ZERO → ARABIC-INDIC DIGIT FIVE        # →o→
+0A66 ; 0665 ;  SA      # ( ੦ → ‎٥‎ ) GURMUKHI DIGIT ZERO → ARABIC-INDIC DIGIT FIVE  # →o→
+0AE6 ; 0665 ;  SA      # ( ૦ → ‎٥‎ ) GUJARATI DIGIT ZERO → ARABIC-INDIC DIGIT FIVE  # →o→
+0BE6 ; 0665 ;  SA      # ( ௦ → ‎٥‎ ) TAMIL DIGIT ZERO → ARABIC-INDIC DIGIT FIVE     # →o→
+0C66 ; 0665 ;  SA      # ( ౦ → ‎٥‎ ) TELUGU DIGIT ZERO → ARABIC-INDIC DIGIT FIVE    # →o→
+0CE6 ; 0665 ;  SA      # ( ೦ → ‎٥‎ ) KANNADA DIGIT ZERO → ARABIC-INDIC DIGIT FIVE   # →౦→→o→
+0D66 ; 0665 ;  SA      # ( ൦ → ‎٥‎ ) MALAYALAM DIGIT ZERO → ARABIC-INDIC DIGIT FIVE # →o→
+0E50 ; 0665 ;  SA      # ( ๐ → ‎٥‎ ) THAI DIGIT ZERO → ARABIC-INDIC DIGIT FIVE      # →o→
+0ED0 ; 0665 ;  SA      # ( ໐ → ‎٥‎ ) LAO DIGIT ZERO → ARABIC-INDIC DIGIT FIVE       # →o→
+1040 ; 0665 ;  SA      # ( ၀ → ‎٥‎ ) MYANMAR DIGIT ZERO → ARABIC-INDIC DIGIT FIVE   # →o→
+2C9F ; 0665 ;  SA      # ( ⲟ → ‎٥‎ ) COPTIC SMALL LETTER O → ARABIC-INDIC DIGIT FIVE        # →o→
+101D ; 0665 ;  SA      # ( ဝ → ‎٥‎ ) MYANMAR LETTER WA → ARABIC-INDIC DIGIT FIVE    # →o→
+
+1F106 ;        0035 002C ;     SA      #* ( 🄆 → 5, ) DIGIT FIVE COMMA → DIGIT FIVE, COMMA       # 
+
+248C ; 0035 002E ;     SA      #* ( ⒌ → 5. ) DIGIT FIVE FULL STOP → DIGIT FIVE, FULL STOP        # 
+
+33E4 ; 0035 65E5 ;     SA      #* ( ㏤ → 5日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE → DIGIT FIVE, CJK UNIFIED IDEOGRAPH-65E5        # 
+
+32C4 ; 0035 6708 ;     SA      #* ( ㋄ → 5月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY → DIGIT FIVE, CJK UNIFIED IDEOGRAPH-6708     # 
+
+335D ; 0035 70B9 ;     SA      #* ( ㍝ → 5点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE → DIGIT FIVE, CJK UNIFIED IDEOGRAPH-70B9       # 
+
+1D7D4 ;        0036 ;  SA      # ( 𝟔 → 6 ) MATHEMATICAL BOLD DIGIT SIX → DIGIT SIX      # 
+1D7DE ;        0036 ;  SA      # ( 𝟞 → 6 ) MATHEMATICAL DOUBLE-STRUCK DIGIT SIX → DIGIT SIX     # 
+1D7E8 ;        0036 ;  SA      # ( 𝟨 → 6 ) MATHEMATICAL SANS-SERIF DIGIT SIX → DIGIT SIX        # 
+1D7F2 ;        0036 ;  SA      # ( 𝟲 → 6 ) MATHEMATICAL SANS-SERIF BOLD DIGIT SIX → DIGIT SIX   # 
+1D7FC ;        0036 ;  SA      # ( 𝟼 → 6 ) MATHEMATICAL MONOSPACE DIGIT SIX → DIGIT SIX # 
+2CD2 ; 0036 ;  SA      # ( Ⳓ → 6 ) COPTIC CAPITAL LETTER OLD COPTIC HEI → DIGIT SIX      # 
+0431 ; 0036 ;  SA      # ( б → 6 ) CYRILLIC SMALL LETTER BE → DIGIT SIX   # 
+
+2465 ; 2785 ;  SA      #* ( ⑥ → ➅ ) CIRCLED DIGIT SIX → DINGBAT CIRCLED SANS-SERIF DIGIT SIX   # 
+
+1F107 ;        0036 002C ;     SA      #* ( 🄇 → 6, ) DIGIT SIX COMMA → DIGIT SIX, COMMA # 
+
+248D ; 0036 002E ;     SA      #* ( ⒍ → 6. ) DIGIT SIX FULL STOP → DIGIT SIX, FULL STOP  # 
+
+33E5 ; 0036 65E5 ;     SA      #* ( ㏥ → 6日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX → DIGIT SIX, CJK UNIFIED IDEOGRAPH-65E5  # 
+
+32C5 ; 0036 6708 ;     SA      #* ( ㋅ → 6月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE → DIGIT SIX, CJK UNIFIED IDEOGRAPH-6708     # 
+
+335E ; 0036 70B9 ;     SA      #* ( ㍞ → 6点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX → DIGIT SIX, CJK UNIFIED IDEOGRAPH-70B9 # 
+
+1D7D5 ;        0037 ;  SA      # ( 𝟕 → 7 ) MATHEMATICAL BOLD DIGIT SEVEN → DIGIT SEVEN  # 
+1D7DF ;        0037 ;  SA      # ( 𝟟 → 7 ) MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN → DIGIT SEVEN # 
+1D7E9 ;        0037 ;  SA      # ( 𝟩 → 7 ) MATHEMATICAL SANS-SERIF DIGIT SEVEN → DIGIT SEVEN    # 
+1D7F3 ;        0037 ;  SA      # ( 𝟳 → 7 ) MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN → DIGIT SEVEN       # 
+1D7FD ;        0037 ;  SA      # ( 𝟽 → 7 ) MATHEMATICAL MONOSPACE DIGIT SEVEN → DIGIT SEVEN     # 
+
+2466 ; 2786 ;  SA      #* ( ⑦ → ➆ ) CIRCLED DIGIT SEVEN → DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN       # 
+
+06F7 ; 0667 ;  SA      # ( ۷ → ‎٧‎ ) EXTENDED ARABIC-INDIC DIGIT SEVEN → ARABIC-INDIC DIGIT SEVEN    # 
+
+1F108 ;        0037 002C ;     SA      #* ( 🄈 → 7, ) DIGIT SEVEN COMMA → DIGIT SEVEN, COMMA     # 
+
+248E ; 0037 002E ;     SA      #* ( ⒎ → 7. ) DIGIT SEVEN FULL STOP → DIGIT SEVEN, FULL STOP      # 
+
+33E6 ; 0037 65E5 ;     SA      #* ( ㏦ → 7日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN → DIGIT SEVEN, CJK UNIFIED IDEOGRAPH-65E5      # 
+
+32C6 ; 0037 6708 ;     SA      #* ( ㋆ → 7月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY → DIGIT SEVEN, CJK UNIFIED IDEOGRAPH-6708   # 
+
+335F ; 0037 70B9 ;     SA      #* ( ㍟ → 7点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN → DIGIT SEVEN, CJK UNIFIED IDEOGRAPH-70B9     # 
+
+0B03 ; 0038 ;  SA      # ( ଃ → 8 ) ORIYA SIGN VISARGA → DIGIT EIGHT      # 
+09EA ; 0038 ;  SA      # ( ৪ → 8 ) BENGALI DIGIT FOUR → DIGIT EIGHT      # 
+0A6A ; 0038 ;  SA      # ( ੪ → 8 ) GURMUKHI DIGIT FOUR → DIGIT EIGHT     # 
+1D7D6 ;        0038 ;  SA      # ( 𝟖 → 8 ) MATHEMATICAL BOLD DIGIT EIGHT → DIGIT EIGHT  # 
+1D7E0 ;        0038 ;  SA      # ( 𝟠 → 8 ) MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT → DIGIT EIGHT # 
+1D7EA ;        0038 ;  SA      # ( 𝟪 → 8 ) MATHEMATICAL SANS-SERIF DIGIT EIGHT → DIGIT EIGHT    # 
+1D7F4 ;        0038 ;  SA      # ( 𝟴 → 8 ) MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT → DIGIT EIGHT       # 
+1D7FE ;        0038 ;  SA      # ( 𝟾 → 8 ) MATHEMATICAL MONOSPACE DIGIT EIGHT → DIGIT EIGHT     # 
+0223 ; 0038 ;  SA      # ( ȣ → 8 ) LATIN SMALL LETTER OU → DIGIT EIGHT    # 
+0222 ; 0038 ;  SA      # ( Ȣ → 8 ) LATIN CAPITAL LETTER OU → DIGIT EIGHT  # 
+
+2467 ; 2787 ;  SA      #* ( ⑧ → ➇ ) CIRCLED DIGIT EIGHT → DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT       # 
+
+06F8 ; 0668 ;  SA      # ( ۸ → ‎٨‎ ) EXTENDED ARABIC-INDIC DIGIT EIGHT → ARABIC-INDIC DIGIT EIGHT    # 
+
+1F109 ;        0038 002C ;     SA      #* ( 🄉 → 8, ) DIGIT EIGHT COMMA → DIGIT EIGHT, COMMA     # 
+
+248F ; 0038 002E ;     SA      #* ( ⒏ → 8. ) DIGIT EIGHT FULL STOP → DIGIT EIGHT, FULL STOP      # 
+
+33E7 ; 0038 65E5 ;     SA      #* ( ㏧ → 8日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT → DIGIT EIGHT, CJK UNIFIED IDEOGRAPH-65E5      # 
+
+32C7 ; 0038 6708 ;     SA      #* ( ㋇ → 8月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST → DIGIT EIGHT, CJK UNIFIED IDEOGRAPH-6708 # 
+
+3360 ; 0038 70B9 ;     SA      #* ( ㍠ → 8点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT → DIGIT EIGHT, CJK UNIFIED IDEOGRAPH-70B9     # 
+
+0A67 ; 0039 ;  SA      # ( ੧ → 9 ) GURMUKHI DIGIT ONE → DIGIT NINE       # 
+0B68 ; 0039 ;  SA      # ( ୨ → 9 ) ORIYA DIGIT TWO → DIGIT NINE  # 
+09ED ; 0039 ;  SA      # ( ৭ → 9 ) BENGALI DIGIT SEVEN → DIGIT NINE      # 
+1D7D7 ;        0039 ;  SA      # ( 𝟗 → 9 ) MATHEMATICAL BOLD DIGIT NINE → DIGIT NINE    # 
+1D7E1 ;        0039 ;  SA      # ( 𝟡 → 9 ) MATHEMATICAL DOUBLE-STRUCK DIGIT NINE → DIGIT NINE   # 
+1D7EB ;        0039 ;  SA      # ( 𝟫 → 9 ) MATHEMATICAL SANS-SERIF DIGIT NINE → DIGIT NINE      # 
+1D7F5 ;        0039 ;  SA      # ( 𝟵 → 9 ) MATHEMATICAL SANS-SERIF BOLD DIGIT NINE → DIGIT NINE # 
+1D7FF ;        0039 ;  SA      # ( 𝟿 → 9 ) MATHEMATICAL MONOSPACE DIGIT NINE → DIGIT NINE       # 
+A76E ; 0039 ;  SA      # ( Ꝯ → 9 ) LATIN CAPITAL LETTER CON → DIGIT NINE # 
+2CCA ; 0039 ;  SA      # ( Ⳋ → 9 ) COPTIC CAPITAL LETTER DIALECT-P HORI → DIGIT NINE     # 
+
+2468 ; 2788 ;  SA      #* ( ⑨ → ➈ ) CIRCLED DIGIT NINE → DINGBAT CIRCLED SANS-SERIF DIGIT NINE # 
+
+06F9 ; 0669 ;  SA      # ( ۹ → ‎٩‎ ) EXTENDED ARABIC-INDIC DIGIT NINE → ARABIC-INDIC DIGIT NINE      # 
+
+1F10A ;        0039 002C ;     SA      #* ( 🄊 → 9, ) DIGIT NINE COMMA → DIGIT NINE, COMMA       # 
+
+2490 ; 0039 002E ;     SA      #* ( ⒐ → 9. ) DIGIT NINE FULL STOP → DIGIT NINE, FULL STOP        # 
+
+33E8 ; 0039 65E5 ;     SA      #* ( ㏨ → 9日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE → DIGIT NINE, CJK UNIFIED IDEOGRAPH-65E5        # 
+
+32C8 ; 0039 6708 ;     SA      #* ( ㋈ → 9月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER → DIGIT NINE, CJK UNIFIED IDEOGRAPH-6708       # 
+
+3361 ; 0039 70B9 ;     SA      #* ( ㍡ → 9点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE → DIGIT NINE, CJK UNIFIED IDEOGRAPH-70B9       # 
+
+237A ; 0061 ;  SA      #* ( ⍺ → a ) APL FUNCTIONAL SYMBOL ALPHA → LATIN SMALL LETTER A   # →α→
+FF41 ; 0061 ;  SA      # ( a → a ) FULLWIDTH LATIN SMALL LETTER A → LATIN SMALL LETTER A # →а→
+1D41A ;        0061 ;  SA      # ( 𝐚 → a ) MATHEMATICAL BOLD SMALL A → LATIN SMALL LETTER A     # 
+1D44E ;        0061 ;  SA      # ( 𝑎 → a ) MATHEMATICAL ITALIC SMALL A → LATIN SMALL LETTER A   # 
+1D482 ;        0061 ;  SA      # ( 𝒂 → a ) MATHEMATICAL BOLD ITALIC SMALL A → LATIN SMALL LETTER A      # 
+1D4B6 ;        0061 ;  SA      # ( 𝒶 → a ) MATHEMATICAL SCRIPT SMALL A → LATIN SMALL LETTER A   # 
+1D4EA ;        0061 ;  SA      # ( 𝓪 → a ) MATHEMATICAL BOLD SCRIPT SMALL A → LATIN SMALL LETTER A      # 
+1D51E ;        0061 ;  SA      # ( 𝔞 → a ) MATHEMATICAL FRAKTUR SMALL A → LATIN SMALL LETTER A  # 
+1D552 ;        0061 ;  SA      # ( 𝕒 → a ) MATHEMATICAL DOUBLE-STRUCK SMALL A → LATIN SMALL LETTER A    # 
+1D586 ;        0061 ;  SA      # ( 𝖆 → a ) MATHEMATICAL BOLD FRAKTUR SMALL A → LATIN SMALL LETTER A     # 
+1D5BA ;        0061 ;  SA      # ( 𝖺 → a ) MATHEMATICAL SANS-SERIF SMALL A → LATIN SMALL LETTER A       # 
+1D5EE ;        0061 ;  SA      # ( 𝗮 → a ) MATHEMATICAL SANS-SERIF BOLD SMALL A → LATIN SMALL LETTER A  # 
+1D622 ;        0061 ;  SA      # ( 𝘢 → a ) MATHEMATICAL SANS-SERIF ITALIC SMALL A → LATIN SMALL LETTER A        # 
+1D656 ;        0061 ;  SA      # ( 𝙖 → a ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A → LATIN SMALL LETTER A   # 
+1D68A ;        0061 ;  SA      # ( 𝚊 → a ) MATHEMATICAL MONOSPACE SMALL A → LATIN SMALL LETTER A        # 
+0251 ; 0061 ;  SA      # ( ɑ → a ) LATIN SMALL LETTER ALPHA → LATIN SMALL LETTER A        # 
+1D6C2 ;        0061 ;  SA      # ( 𝛂 → a ) MATHEMATICAL BOLD SMALL ALPHA → LATIN SMALL LETTER A # →α→
+1D6FC ;        0061 ;  SA      # ( 𝛼 → a ) MATHEMATICAL ITALIC SMALL ALPHA → LATIN SMALL LETTER A       # →α→
+1D736 ;        0061 ;  SA      # ( 𝜶 → a ) MATHEMATICAL BOLD ITALIC SMALL ALPHA → LATIN SMALL LETTER A  # →α→
+1D770 ;        0061 ;  SA      # ( 𝝰 → a ) MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA → LATIN SMALL LETTER A      # →α→
+1D7AA ;        0061 ;  SA      # ( 𝞪 → a ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA → LATIN SMALL LETTER A       # →α→
+
+FF21 ; 0041 ;  SA      # ( A → A ) FULLWIDTH LATIN CAPITAL LETTER A → LATIN CAPITAL LETTER A     # →А→
+1D400 ;        0041 ;  SA      # ( 𝐀 → A ) MATHEMATICAL BOLD CAPITAL A → LATIN CAPITAL LETTER A # 
+1D434 ;        0041 ;  SA      # ( 𝐴 → A ) MATHEMATICAL ITALIC CAPITAL A → LATIN CAPITAL LETTER A       # 
+1D468 ;        0041 ;  SA      # ( 𝑨 → A ) MATHEMATICAL BOLD ITALIC CAPITAL A → LATIN CAPITAL LETTER A  # 
+1D49C ;        0041 ;  SA      # ( 𝒜 → A ) MATHEMATICAL SCRIPT CAPITAL A → LATIN CAPITAL LETTER A       # 
+1D4D0 ;        0041 ;  SA      # ( 𝓐 → A ) MATHEMATICAL BOLD SCRIPT CAPITAL A → LATIN CAPITAL LETTER A  # 
+1D504 ;        0041 ;  SA      # ( 𝔄 → A ) MATHEMATICAL FRAKTUR CAPITAL A → LATIN CAPITAL LETTER A      # 
+1D538 ;        0041 ;  SA      # ( 𝔸 → A ) MATHEMATICAL DOUBLE-STRUCK CAPITAL A → LATIN CAPITAL LETTER A        # 
+1D56C ;        0041 ;  SA      # ( 𝕬 → A ) MATHEMATICAL BOLD FRAKTUR CAPITAL A → LATIN CAPITAL LETTER A # 
+1D5A0 ;        0041 ;  SA      # ( 𝖠 → A ) MATHEMATICAL SANS-SERIF CAPITAL A → LATIN CAPITAL LETTER A   # 
+1D5D4 ;        0041 ;  SA      # ( 𝗔 → A ) MATHEMATICAL SANS-SERIF BOLD CAPITAL A → LATIN CAPITAL LETTER A      # 
+1D608 ;        0041 ;  SA      # ( 𝘈 → A ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL A → LATIN CAPITAL LETTER A    # 
+1D63C ;        0041 ;  SA      # ( 𝘼 → A ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A → LATIN CAPITAL LETTER A       # 
+1D670 ;        0041 ;  SA      # ( 𝙰 → A ) MATHEMATICAL MONOSPACE CAPITAL A → LATIN CAPITAL LETTER A    # 
+1D6A8 ;        0041 ;  SA      # ( 𝚨 → A ) MATHEMATICAL BOLD CAPITAL ALPHA → LATIN CAPITAL LETTER A     # →𝐀→
+1D6E2 ;        0041 ;  SA      # ( 𝛢 → A ) MATHEMATICAL ITALIC CAPITAL ALPHA → LATIN CAPITAL LETTER A   # →𝐴→
+1D71C ;        0041 ;  SA      # ( 𝜜 → A ) MATHEMATICAL BOLD ITALIC CAPITAL ALPHA → LATIN CAPITAL LETTER A      # →𝑨→
+1D756 ;        0041 ;  SA      # ( 𝝖 → A ) MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA → LATIN CAPITAL LETTER A  # →Α→
+1D790 ;        0041 ;  SA      # ( 𝞐 → A ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA → LATIN CAPITAL LETTER A   # →Α→
+
+01CE ; 0103 ;  SA      # ( ǎ → ă ) LATIN SMALL LETTER A WITH CARON → LATIN SMALL LETTER A WITH BREVE     # 
+
+01CD ; 0102 ;  SA      # ( Ǎ → Ă ) LATIN CAPITAL LETTER A WITH CARON → LATIN CAPITAL LETTER A WITH BREVE # 
+
+0227 ; 00E5 ;  SA      # ( ȧ → å ) LATIN SMALL LETTER A WITH DOT ABOVE → LATIN SMALL LETTER A WITH RING ABOVE    # 
+
+0226 ; 00C5 ;  SA      # ( Ȧ → Å ) LATIN CAPITAL LETTER A WITH DOT ABOVE → LATIN CAPITAL LETTER A WITH RING ABOVE        # 
+
+1E9A ; 1EA3 ;  SA      # ( ẚ → ả ) LATIN SMALL LETTER A WITH RIGHT HALF RING → LATIN SMALL LETTER A WITH HOOK ABOVE    # 
+
+A733 ; 0061 0061 ;     SA      # ( ꜳ → aa ) LATIN SMALL LETTER AA → LATIN SMALL LETTER A, LATIN SMALL LETTER A   # 
+
+A732 ; 0041 0041 ;     SA      # ( Ꜳ → AA ) LATIN CAPITAL LETTER AA → LATIN CAPITAL LETTER A, LATIN CAPITAL LETTER A     # 
+
+00E6 ; 0061 0065 ;     SA      # ( æ → ae ) LATIN SMALL LETTER AE → LATIN SMALL LETTER A, LATIN SMALL LETTER E    # 
+
+00C6 ; 0041 0045 ;     SA      # ( Æ → AE ) LATIN CAPITAL LETTER AE → LATIN CAPITAL LETTER A, LATIN CAPITAL LETTER E      # 
+
+A735 ; 0061 006F ;     SA      # ( ꜵ → ao ) LATIN SMALL LETTER AO → LATIN SMALL LETTER A, LATIN SMALL LETTER O   # 
+
+A734 ; 0041 004F ;     SA      # ( Ꜵ → AO ) LATIN CAPITAL LETTER AO → LATIN CAPITAL LETTER A, LATIN CAPITAL LETTER O     # 
+
+A737 ; 0061 0075 ;     SA      # ( ꜷ → au ) LATIN SMALL LETTER AU → LATIN SMALL LETTER A, LATIN SMALL LETTER U   # 
+
+A736 ; 0041 0055 ;     SA      # ( Ꜷ → AU ) LATIN CAPITAL LETTER AU → LATIN CAPITAL LETTER A, LATIN CAPITAL LETTER U     # 
+
+A739 ; 0061 0076 ;     SA      # ( ꜹ → av ) LATIN SMALL LETTER AV → LATIN SMALL LETTER A, LATIN SMALL LETTER V   # 
+A73B ; 0061 0076 ;     SA      # ( ꜻ → av ) LATIN SMALL LETTER AV WITH HORIZONTAL BAR → LATIN SMALL LETTER A, LATIN SMALL LETTER V       # 
+
+A738 ; 0041 0056 ;     SA      # ( Ꜹ → AV ) LATIN CAPITAL LETTER AV → LATIN CAPITAL LETTER A, LATIN CAPITAL LETTER V     # 
+A73A ; 0041 0056 ;     SA      # ( Ꜻ → AV ) LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR → LATIN CAPITAL LETTER A, LATIN CAPITAL LETTER V # 
+
+A73D ; 0061 0079 ;     SA      # ( ꜽ → ay ) LATIN SMALL LETTER AY → LATIN SMALL LETTER A, LATIN SMALL LETTER Y   # 
+
+A73C ; 0041 0059 ;     SA      # ( Ꜽ → AY ) LATIN CAPITAL LETTER AY → LATIN CAPITAL LETTER A, LATIN CAPITAL LETTER Y     # 
+
+1D41B ;        0062 ;  SA      # ( 𝐛 → b ) MATHEMATICAL BOLD SMALL B → LATIN SMALL LETTER B     # 
+1D44F ;        0062 ;  SA      # ( 𝑏 → b ) MATHEMATICAL ITALIC SMALL B → LATIN SMALL LETTER B   # 
+1D483 ;        0062 ;  SA      # ( 𝒃 → b ) MATHEMATICAL BOLD ITALIC SMALL B → LATIN SMALL LETTER B      # 
+1D4B7 ;        0062 ;  SA      # ( 𝒷 → b ) MATHEMATICAL SCRIPT SMALL B → LATIN SMALL LETTER B   # 
+1D4EB ;        0062 ;  SA      # ( 𝓫 → b ) MATHEMATICAL BOLD SCRIPT SMALL B → LATIN SMALL LETTER B      # 
+1D51F ;        0062 ;  SA      # ( 𝔟 → b ) MATHEMATICAL FRAKTUR SMALL B → LATIN SMALL LETTER B  # 
+1D553 ;        0062 ;  SA      # ( 𝕓 → b ) MATHEMATICAL DOUBLE-STRUCK SMALL B → LATIN SMALL LETTER B    # 
+1D587 ;        0062 ;  SA      # ( 𝖇 → b ) MATHEMATICAL BOLD FRAKTUR SMALL B → LATIN SMALL LETTER B     # 
+1D5BB ;        0062 ;  SA      # ( 𝖻 → b ) MATHEMATICAL SANS-SERIF SMALL B → LATIN SMALL LETTER B       # 
+1D5EF ;        0062 ;  SA      # ( 𝗯 → b ) MATHEMATICAL SANS-SERIF BOLD SMALL B → LATIN SMALL LETTER B  # 
+1D623 ;        0062 ;  SA      # ( 𝘣 → b ) MATHEMATICAL SANS-SERIF ITALIC SMALL B → LATIN SMALL LETTER B        # 
+1D657 ;        0062 ;  SA      # ( 𝙗 → b ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B → LATIN SMALL LETTER B   # 
+1D68B ;        0062 ;  SA      # ( 𝚋 → b ) MATHEMATICAL MONOSPACE SMALL B → LATIN SMALL LETTER B        # 
+0184 ; 0062 ;  SA      # ( Ƅ → b ) LATIN CAPITAL LETTER TONE SIX → LATIN SMALL LETTER B   # 
+
+FF22 ; 0042 ;  SA      # ( B → B ) FULLWIDTH LATIN CAPITAL LETTER B → LATIN CAPITAL LETTER B     # →В→
+212C ; 0042 ;  SA      # ( ℬ → B ) SCRIPT CAPITAL B → LATIN CAPITAL LETTER B     # 
+1D401 ;        0042 ;  SA      # ( 𝐁 → B ) MATHEMATICAL BOLD CAPITAL B → LATIN CAPITAL LETTER B # 
+1D435 ;        0042 ;  SA      # ( 𝐵 → B ) MATHEMATICAL ITALIC CAPITAL B → LATIN CAPITAL LETTER B       # 
+1D469 ;        0042 ;  SA      # ( 𝑩 → B ) MATHEMATICAL BOLD ITALIC CAPITAL B → LATIN CAPITAL LETTER B  # 
+1D4D1 ;        0042 ;  SA      # ( 𝓑 → B ) MATHEMATICAL BOLD SCRIPT CAPITAL B → LATIN CAPITAL LETTER B  # 
+1D505 ;        0042 ;  SA      # ( 𝔅 → B ) MATHEMATICAL FRAKTUR CAPITAL B → LATIN CAPITAL LETTER B      # 
+1D539 ;        0042 ;  SA      # ( 𝔹 → B ) MATHEMATICAL DOUBLE-STRUCK CAPITAL B → LATIN CAPITAL LETTER B        # 
+1D56D ;        0042 ;  SA      # ( 𝕭 → B ) MATHEMATICAL BOLD FRAKTUR CAPITAL B → LATIN CAPITAL LETTER B # 
+1D5A1 ;        0042 ;  SA      # ( 𝖡 → B ) MATHEMATICAL SANS-SERIF CAPITAL B → LATIN CAPITAL LETTER B   # 
+1D5D5 ;        0042 ;  SA      # ( 𝗕 → B ) MATHEMATICAL SANS-SERIF BOLD CAPITAL B → LATIN CAPITAL LETTER B      # 
+1D609 ;        0042 ;  SA      # ( 𝘉 → B ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL B → LATIN CAPITAL LETTER B    # 
+1D63D ;        0042 ;  SA      # ( 𝘽 → B ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B → LATIN CAPITAL LETTER B       # 
+1D671 ;        0042 ;  SA      # ( 𝙱 → B ) MATHEMATICAL MONOSPACE CAPITAL B → LATIN CAPITAL LETTER B    # 
+1D6A9 ;        0042 ;  SA      # ( 𝚩 → B ) MATHEMATICAL BOLD CAPITAL BETA → LATIN CAPITAL LETTER B      # →𝐁→
+1D6E3 ;        0042 ;  SA      # ( 𝛣 → B ) MATHEMATICAL ITALIC CAPITAL BETA → LATIN CAPITAL LETTER B    # →𝐵→
+1D71D ;        0042 ;  SA      # ( 𝜝 → B ) MATHEMATICAL BOLD ITALIC CAPITAL BETA → LATIN CAPITAL LETTER B       # →𝑩→
+1D757 ;        0042 ;  SA      # ( 𝝗 → B ) MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA → LATIN CAPITAL LETTER B   # →Β→
+1D791 ;        0042 ;  SA      # ( 𝞑 → B ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA → LATIN CAPITAL LETTER B    # →Β→
+
+0253 ; 0062 0314 ;     SA      # ( ɓ → b̔ ) LATIN SMALL LETTER B WITH HOOK → LATIN SMALL LETTER B, COMBINING REVERSED COMMA ABOVE        # 
+
+0183 ; 0062 0304 ;     SA      # ( ƃ → b̄ ) LATIN SMALL LETTER B WITH TOPBAR → LATIN SMALL LETTER B, COMBINING MACRON    # 
+0182 ; 0062 0304 ;     SA      # ( Ƃ → b̄ ) LATIN CAPITAL LETTER B WITH TOPBAR → LATIN SMALL LETTER B, COMBINING MACRON  # 
+
+0180 ; 0062 0335 ;     SA      # ( ƀ → b̵ ) LATIN SMALL LETTER B WITH STROKE → LATIN SMALL LETTER B, COMBINING SHORT STROKE OVERLAY      # 
+
+FF43 ; 0063 ;  SA      # ( c → c ) FULLWIDTH LATIN SMALL LETTER C → LATIN SMALL LETTER C # →ϲ→
+217D ; 0063 ;  SA      # ( ⅽ → c ) SMALL ROMAN NUMERAL ONE HUNDRED → LATIN SMALL LETTER C        # 
+1D41C ;        0063 ;  SA      # ( 𝐜 → c ) MATHEMATICAL BOLD SMALL C → LATIN SMALL LETTER C     # 
+1D450 ;        0063 ;  SA      # ( 𝑐 → c ) MATHEMATICAL ITALIC SMALL C → LATIN SMALL LETTER C   # 
+1D484 ;        0063 ;  SA      # ( 𝒄 → c ) MATHEMATICAL BOLD ITALIC SMALL C → LATIN SMALL LETTER C      # 
+1D4B8 ;        0063 ;  SA      # ( 𝒸 → c ) MATHEMATICAL SCRIPT SMALL C → LATIN SMALL LETTER C   # 
+1D4EC ;        0063 ;  SA      # ( 𝓬 → c ) MATHEMATICAL BOLD SCRIPT SMALL C → LATIN SMALL LETTER C      # 
+1D520 ;        0063 ;  SA      # ( 𝔠 → c ) MATHEMATICAL FRAKTUR SMALL C → LATIN SMALL LETTER C  # 
+1D554 ;        0063 ;  SA      # ( 𝕔 → c ) MATHEMATICAL DOUBLE-STRUCK SMALL C → LATIN SMALL LETTER C    # 
+1D588 ;        0063 ;  SA      # ( 𝖈 → c ) MATHEMATICAL BOLD FRAKTUR SMALL C → LATIN SMALL LETTER C     # 
+1D5BC ;        0063 ;  SA      # ( 𝖼 → c ) MATHEMATICAL SANS-SERIF SMALL C → LATIN SMALL LETTER C       # 
+1D5F0 ;        0063 ;  SA      # ( 𝗰 → c ) MATHEMATICAL SANS-SERIF BOLD SMALL C → LATIN SMALL LETTER C  # 
+1D624 ;        0063 ;  SA      # ( 𝘤 → c ) MATHEMATICAL SANS-SERIF ITALIC SMALL C → LATIN SMALL LETTER C        # 
+1D658 ;        0063 ;  SA      # ( 𝙘 → c ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C → LATIN SMALL LETTER C   # 
+1D68C ;        0063 ;  SA      # ( 𝚌 → c ) MATHEMATICAL MONOSPACE SMALL C → LATIN SMALL LETTER C        # 
+1D04 ; 0063 ;  SA      # ( ᴄ → c ) LATIN LETTER SMALL CAPITAL C → LATIN SMALL LETTER C   # 
+
+FF23 ; 0043 ;  SA      # ( C → C ) FULLWIDTH LATIN CAPITAL LETTER C → LATIN CAPITAL LETTER C     # →С→
+216D ; 0043 ;  SA      # ( Ⅽ → C ) ROMAN NUMERAL ONE HUNDRED → LATIN CAPITAL LETTER C    # 
+2102 ; 0043 ;  SA      # ( ℂ → C ) DOUBLE-STRUCK CAPITAL C → LATIN CAPITAL LETTER C      # 
+212D ; 0043 ;  SA      # ( ℭ → C ) BLACK-LETTER CAPITAL C → LATIN CAPITAL LETTER C       # 
+1D402 ;        0043 ;  SA      # ( 𝐂 → C ) MATHEMATICAL BOLD CAPITAL C → LATIN CAPITAL LETTER C # 
+1D436 ;        0043 ;  SA      # ( 𝐶 → C ) MATHEMATICAL ITALIC CAPITAL C → LATIN CAPITAL LETTER C       # 
+1D46A ;        0043 ;  SA      # ( 𝑪 → C ) MATHEMATICAL BOLD ITALIC CAPITAL C → LATIN CAPITAL LETTER C  # 
+1D49E ;        0043 ;  SA      # ( 𝒞 → C ) MATHEMATICAL SCRIPT CAPITAL C → LATIN CAPITAL LETTER C       # 
+1D4D2 ;        0043 ;  SA      # ( 𝓒 → C ) MATHEMATICAL BOLD SCRIPT CAPITAL C → LATIN CAPITAL LETTER C  # 
+1D56E ;        0043 ;  SA      # ( 𝕮 → C ) MATHEMATICAL BOLD FRAKTUR CAPITAL C → LATIN CAPITAL LETTER C # 
+1D5A2 ;        0043 ;  SA      # ( 𝖢 → C ) MATHEMATICAL SANS-SERIF CAPITAL C → LATIN CAPITAL LETTER C   # 
+1D5D6 ;        0043 ;  SA      # ( 𝗖 → C ) MATHEMATICAL SANS-SERIF BOLD CAPITAL C → LATIN CAPITAL LETTER C      # 
+1D60A ;        0043 ;  SA      # ( 𝘊 → C ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL C → LATIN CAPITAL LETTER C    # 
+1D63E ;        0043 ;  SA      # ( 𝘾 → C ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C → LATIN CAPITAL LETTER C       # 
+1D672 ;        0043 ;  SA      # ( 𝙲 → C ) MATHEMATICAL MONOSPACE CAPITAL C → LATIN CAPITAL LETTER C    # 
+
+00A2 ; 0063 0338 ;     SA      #* ( ¢ → c̸ ) CENT SIGN → LATIN SMALL LETTER C, COMBINING LONG SOLIDUS OVERLAY    # 
+
+00E7 ; 0063 0326 ;     SA      # ( ç → c̦ ) LATIN SMALL LETTER C WITH CEDILLA → LATIN SMALL LETTER C, COMBINING COMMA BELOW      # →ҫ→→с̡→
+
+00C7 ; 0043 0326 ;     SA      # ( Ç → C̦ ) LATIN CAPITAL LETTER C WITH CEDILLA → LATIN CAPITAL LETTER C, COMBINING COMMA BELOW  # →Ҫ→→С̡→
+
+0187 ; 0043 0027 ;     SA      # ( Ƈ → C' ) LATIN CAPITAL LETTER C WITH HOOK → LATIN CAPITAL LETTER C, APOSTROPHE # →Cʽ→
+
+217E ; 0064 ;  SA      # ( ⅾ → d ) SMALL ROMAN NUMERAL FIVE HUNDRED → LATIN SMALL LETTER D       # 
+2146 ; 0064 ;  SA      # ( ⅆ → d ) DOUBLE-STRUCK ITALIC SMALL D → LATIN SMALL LETTER D   # 
+1D41D ;        0064 ;  SA      # ( 𝐝 → d ) MATHEMATICAL BOLD SMALL D → LATIN SMALL LETTER D     # 
+1D451 ;        0064 ;  SA      # ( 𝑑 → d ) MATHEMATICAL ITALIC SMALL D → LATIN SMALL LETTER D   # 
+1D485 ;        0064 ;  SA      # ( 𝒅 → d ) MATHEMATICAL BOLD ITALIC SMALL D → LATIN SMALL LETTER D      # 
+1D4B9 ;        0064 ;  SA      # ( 𝒹 → d ) MATHEMATICAL SCRIPT SMALL D → LATIN SMALL LETTER D   # 
+1D4ED ;        0064 ;  SA      # ( 𝓭 → d ) MATHEMATICAL BOLD SCRIPT SMALL D → LATIN SMALL LETTER D      # 
+1D521 ;        0064 ;  SA      # ( 𝔡 → d ) MATHEMATICAL FRAKTUR SMALL D → LATIN SMALL LETTER D  # 
+1D555 ;        0064 ;  SA      # ( 𝕕 → d ) MATHEMATICAL DOUBLE-STRUCK SMALL D → LATIN SMALL LETTER D    # 
+1D589 ;        0064 ;  SA      # ( 𝖉 → d ) MATHEMATICAL BOLD FRAKTUR SMALL D → LATIN SMALL LETTER D     # 
+1D5BD ;        0064 ;  SA      # ( 𝖽 → d ) MATHEMATICAL SANS-SERIF SMALL D → LATIN SMALL LETTER D       # 
+1D5F1 ;        0064 ;  SA      # ( 𝗱 → d ) MATHEMATICAL SANS-SERIF BOLD SMALL D → LATIN SMALL LETTER D  # 
+1D625 ;        0064 ;  SA      # ( 𝘥 → d ) MATHEMATICAL SANS-SERIF ITALIC SMALL D → LATIN SMALL LETTER D        # 
+1D659 ;        0064 ;  SA      # ( 𝙙 → d ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D → LATIN SMALL LETTER D   # 
+1D68D ;        0064 ;  SA      # ( 𝚍 → d ) MATHEMATICAL MONOSPACE SMALL D → LATIN SMALL LETTER D        # 
+
+216E ; 0044 ;  SA      # ( Ⅾ → D ) ROMAN NUMERAL FIVE HUNDRED → LATIN CAPITAL LETTER D   # 
+2145 ; 0044 ;  SA      # ( ⅅ → D ) DOUBLE-STRUCK ITALIC CAPITAL D → LATIN CAPITAL LETTER D       # 
+1D403 ;        0044 ;  SA      # ( 𝐃 → D ) MATHEMATICAL BOLD CAPITAL D → LATIN CAPITAL LETTER D # 
+1D437 ;        0044 ;  SA      # ( 𝐷 → D ) MATHEMATICAL ITALIC CAPITAL D → LATIN CAPITAL LETTER D       # 
+1D46B ;        0044 ;  SA      # ( 𝑫 → D ) MATHEMATICAL BOLD ITALIC CAPITAL D → LATIN CAPITAL LETTER D  # 
+1D49F ;        0044 ;  SA      # ( 𝒟 → D ) MATHEMATICAL SCRIPT CAPITAL D → LATIN CAPITAL LETTER D       # 
+1D4D3 ;        0044 ;  SA      # ( 𝓓 → D ) MATHEMATICAL BOLD SCRIPT CAPITAL D → LATIN CAPITAL LETTER D  # 
+1D507 ;        0044 ;  SA      # ( 𝔇 → D ) MATHEMATICAL FRAKTUR CAPITAL D → LATIN CAPITAL LETTER D      # 
+1D53B ;        0044 ;  SA      # ( 𝔻 → D ) MATHEMATICAL DOUBLE-STRUCK CAPITAL D → LATIN CAPITAL LETTER D        # 
+1D56F ;        0044 ;  SA      # ( 𝕯 → D ) MATHEMATICAL BOLD FRAKTUR CAPITAL D → LATIN CAPITAL LETTER D # 
+1D5A3 ;        0044 ;  SA      # ( 𝖣 → D ) MATHEMATICAL SANS-SERIF CAPITAL D → LATIN CAPITAL LETTER D   # 
+1D5D7 ;        0044 ;  SA      # ( 𝗗 → D ) MATHEMATICAL SANS-SERIF BOLD CAPITAL D → LATIN CAPITAL LETTER D      # 
+1D60B ;        0044 ;  SA      # ( 𝘋 → D ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL D → LATIN CAPITAL LETTER D    # 
+1D63F ;        0044 ;  SA      # ( 𝘿 → D ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D → LATIN CAPITAL LETTER D       # 
+1D673 ;        0044 ;  SA      # ( 𝙳 → D ) MATHEMATICAL MONOSPACE CAPITAL D → LATIN CAPITAL LETTER D    # 
+
+0257 ; 0064 0314 ;     SA      # ( ɗ → d̔ ) LATIN SMALL LETTER D WITH HOOK → LATIN SMALL LETTER D, COMBINING REVERSED COMMA ABOVE        # 
+
+0256 ; 0064 0328 ;     SA      # ( ɖ → d̨ ) LATIN SMALL LETTER D WITH TAIL → LATIN SMALL LETTER D, COMBINING OGONEK      # →d̢→
+
+018C ; 0064 0304 ;     SA      # ( ƌ → d̄ ) LATIN SMALL LETTER D WITH TOPBAR → LATIN SMALL LETTER D, COMBINING MACRON    # 
+
+0111 ; 0064 0335 ;     SA      # ( đ → d̵ ) LATIN SMALL LETTER D WITH STROKE → LATIN SMALL LETTER D, COMBINING SHORT STROKE OVERLAY      # 
+
+0110 ; 0044 0335 ;     SA      # ( Đ → D̵ ) LATIN CAPITAL LETTER D WITH STROKE → LATIN CAPITAL LETTER D, COMBINING SHORT STROKE OVERLAY  # 
+00D0 ; 0044 0335 ;     SA      # ( Ð → D̵ ) LATIN CAPITAL LETTER ETH → LATIN CAPITAL LETTER D, COMBINING SHORT STROKE OVERLAY    # →Đ→
+0189 ; 0044 0335 ;     SA      # ( Ɖ → D̵ ) LATIN CAPITAL LETTER AFRICAN D → LATIN CAPITAL LETTER D, COMBINING SHORT STROKE OVERLAY      # →Đ→
+
+20AB ; 0064 0335 0331 ;        SA      #* ( ₫ → ḏ̵ ) DONG SIGN → LATIN SMALL LETTER D, COMBINING SHORT STROKE OVERLAY, COMBINING MACRON BELOW # →đ̱→
+
+A77A ; A779 ;  SA      # ( ꝺ → Ꝺ ) LATIN SMALL LETTER INSULAR D → LATIN CAPITAL LETTER INSULAR D       # 
+
+01F3 ; 0064 007A ;     SA      # ( dz → dz ) LATIN SMALL LETTER DZ → LATIN SMALL LETTER D, LATIN SMALL LETTER Z    # 
+02A3 ; 0064 007A ;     SA      # ( ʣ → dz ) LATIN SMALL LETTER DZ DIGRAPH → LATIN SMALL LETTER D, LATIN SMALL LETTER Z    # 
+
+01F2 ; 0044 007A ;     SA      # ( Dz → Dz ) LATIN CAPITAL LETTER D WITH SMALL LETTER Z → LATIN CAPITAL LETTER D, LATIN SMALL LETTER Z     # 
+
+01F1 ; 0044 005A ;     SA      # ( DZ → DZ ) LATIN CAPITAL LETTER DZ → LATIN CAPITAL LETTER D, LATIN CAPITAL LETTER Z      # 
+
+01C6 ; 0064 017E ;     SA      # ( dž → dž ) LATIN SMALL LETTER DZ WITH CARON → LATIN SMALL LETTER D, LATIN SMALL LETTER Z WITH CARON     # 
+
+01C5 ; 0044 017E ;     SA      # ( Dž → Dž ) LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON → LATIN CAPITAL LETTER D, LATIN SMALL LETTER Z WITH CARON      # 
+
+01C4 ; 0044 017D ;     SA      # ( DŽ → DŽ ) LATIN CAPITAL LETTER DZ WITH CARON → LATIN CAPITAL LETTER D, LATIN CAPITAL LETTER Z WITH CARON       # 
+
+02A5 ; 0064 0291 ;     SA      # ( ʥ → dʑ ) LATIN SMALL LETTER DZ DIGRAPH WITH CURL → LATIN SMALL LETTER D, LATIN SMALL LETTER Z WITH CURL       # 
+
+02A4 ; 0064 021D ;     SA      # ( ʤ → dȝ ) LATIN SMALL LETTER DEZH DIGRAPH → LATIN SMALL LETTER D, LATIN SMALL LETTER YOGH      # →dʒ→
+
+1D6C5 ;        1E9F ;  SA      # ( 𝛅 → ẟ ) MATHEMATICAL BOLD SMALL DELTA → LATIN SMALL LETTER DELTA   # →δ→
+1D6FF ;        1E9F ;  SA      # ( 𝛿 → ẟ ) MATHEMATICAL ITALIC SMALL DELTA → LATIN SMALL LETTER DELTA # →δ→
+1D739 ;        1E9F ;  SA      # ( 𝜹 → ẟ ) MATHEMATICAL BOLD ITALIC SMALL DELTA → LATIN SMALL LETTER DELTA    # →δ→
+1D773 ;        1E9F ;  SA      # ( 𝝳 → ẟ ) MATHEMATICAL SANS-SERIF BOLD SMALL DELTA → LATIN SMALL LETTER DELTA        # →δ→
+1D7AD ;        1E9F ;  SA      # ( 𝞭 → ẟ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA → LATIN SMALL LETTER DELTA # →δ→
+
+212E ; 0065 ;  SA      # ( ℮ → e ) ESTIMATED SYMBOL → LATIN SMALL LETTER E       # 
+FF45 ; 0065 ;  SA      # ( e → e ) FULLWIDTH LATIN SMALL LETTER E → LATIN SMALL LETTER E # →е→
+212F ; 0065 ;  SA      # ( ℯ → e ) SCRIPT SMALL E → LATIN SMALL LETTER E # 
+2147 ; 0065 ;  SA      # ( ⅇ → e ) DOUBLE-STRUCK ITALIC SMALL E → LATIN SMALL LETTER E   # 
+1D41E ;        0065 ;  SA      # ( 𝐞 → e ) MATHEMATICAL BOLD SMALL E → LATIN SMALL LETTER E     # 
+1D452 ;        0065 ;  SA      # ( 𝑒 → e ) MATHEMATICAL ITALIC SMALL E → LATIN SMALL LETTER E   # 
+1D486 ;        0065 ;  SA      # ( 𝒆 → e ) MATHEMATICAL BOLD ITALIC SMALL E → LATIN SMALL LETTER E      # 
+1D4EE ;        0065 ;  SA      # ( 𝓮 → e ) MATHEMATICAL BOLD SCRIPT SMALL E → LATIN SMALL LETTER E      # 
+1D522 ;        0065 ;  SA      # ( 𝔢 → e ) MATHEMATICAL FRAKTUR SMALL E → LATIN SMALL LETTER E  # 
+1D556 ;        0065 ;  SA      # ( 𝕖 → e ) MATHEMATICAL DOUBLE-STRUCK SMALL E → LATIN SMALL LETTER E    # 
+1D58A ;        0065 ;  SA      # ( 𝖊 → e ) MATHEMATICAL BOLD FRAKTUR SMALL E → LATIN SMALL LETTER E     # 
+1D5BE ;        0065 ;  SA      # ( 𝖾 → e ) MATHEMATICAL SANS-SERIF SMALL E → LATIN SMALL LETTER E       # 
+1D5F2 ;        0065 ;  SA      # ( 𝗲 → e ) MATHEMATICAL SANS-SERIF BOLD SMALL E → LATIN SMALL LETTER E  # 
+1D626 ;        0065 ;  SA      # ( 𝘦 → e ) MATHEMATICAL SANS-SERIF ITALIC SMALL E → LATIN SMALL LETTER E        # 
+1D65A ;        0065 ;  SA      # ( 𝙚 → e ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E → LATIN SMALL LETTER E   # 
+1D68E ;        0065 ;  SA      # ( 𝚎 → e ) MATHEMATICAL MONOSPACE SMALL E → LATIN SMALL LETTER E        # 
+
+22FF ; 0045 ;  SA      #* ( ⋿ → E ) Z NOTATION BAG MEMBERSHIP → LATIN CAPITAL LETTER E   # 
+FF25 ; 0045 ;  SA      # ( E → E ) FULLWIDTH LATIN CAPITAL LETTER E → LATIN CAPITAL LETTER E     # →Ε→
+2130 ; 0045 ;  SA      # ( ℰ → E ) SCRIPT CAPITAL E → LATIN CAPITAL LETTER E     # 
+1D404 ;        0045 ;  SA      # ( 𝐄 → E ) MATHEMATICAL BOLD CAPITAL E → LATIN CAPITAL LETTER E # 
+1D438 ;        0045 ;  SA      # ( 𝐸 → E ) MATHEMATICAL ITALIC CAPITAL E → LATIN CAPITAL LETTER E       # 
+1D46C ;        0045 ;  SA      # ( 𝑬 → E ) MATHEMATICAL BOLD ITALIC CAPITAL E → LATIN CAPITAL LETTER E  # 
+1D4D4 ;        0045 ;  SA      # ( 𝓔 → E ) MATHEMATICAL BOLD SCRIPT CAPITAL E → LATIN CAPITAL LETTER E  # 
+1D508 ;        0045 ;  SA      # ( 𝔈 → E ) MATHEMATICAL FRAKTUR CAPITAL E → LATIN CAPITAL LETTER E      # 
+1D53C ;        0045 ;  SA      # ( 𝔼 → E ) MATHEMATICAL DOUBLE-STRUCK CAPITAL E → LATIN CAPITAL LETTER E        # 
+1D570 ;        0045 ;  SA      # ( 𝕰 → E ) MATHEMATICAL BOLD FRAKTUR CAPITAL E → LATIN CAPITAL LETTER E # 
+1D5A4 ;        0045 ;  SA      # ( 𝖤 → E ) MATHEMATICAL SANS-SERIF CAPITAL E → LATIN CAPITAL LETTER E   # 
+1D5D8 ;        0045 ;  SA      # ( 𝗘 → E ) MATHEMATICAL SANS-SERIF BOLD CAPITAL E → LATIN CAPITAL LETTER E      # 
+1D60C ;        0045 ;  SA      # ( 𝘌 → E ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL E → LATIN CAPITAL LETTER E    # 
+1D640 ;        0045 ;  SA      # ( 𝙀 → E ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E → LATIN CAPITAL LETTER E       # 
+1D674 ;        0045 ;  SA      # ( 𝙴 → E ) MATHEMATICAL MONOSPACE CAPITAL E → LATIN CAPITAL LETTER E    # 
+1D6AC ;        0045 ;  SA      # ( 𝚬 → E ) MATHEMATICAL BOLD CAPITAL EPSILON → LATIN CAPITAL LETTER E   # →𝐄→
+1D6E6 ;        0045 ;  SA      # ( 𝛦 → E ) MATHEMATICAL ITALIC CAPITAL EPSILON → LATIN CAPITAL LETTER E # →𝐸→
+1D720 ;        0045 ;  SA      # ( 𝜠 → E ) MATHEMATICAL BOLD ITALIC CAPITAL EPSILON → LATIN CAPITAL LETTER E    # →𝑬→
+1D75A ;        0045 ;  SA      # ( 𝝚 → E ) MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON → LATIN CAPITAL LETTER E        # →Ε→
+1D794 ;        0045 ;  SA      # ( 𝞔 → E ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON → LATIN CAPITAL LETTER E # →Ε→
+
+011B ; 0115 ;  SA      # ( ě → ĕ ) LATIN SMALL LETTER E WITH CARON → LATIN SMALL LETTER E WITH BREVE     # 
+
+011A ; 0114 ;  SA      # ( Ě → Ĕ ) LATIN CAPITAL LETTER E WITH CARON → LATIN CAPITAL LETTER E WITH BREVE # 
+
+0259 ; 01DD ;  SA      # ( ə → ǝ ) LATIN SMALL LETTER SCHWA → LATIN SMALL LETTER TURNED E        # 
+
+2203 ; 018E ;  SA      #* ( ∃ → Ǝ ) THERE EXISTS → LATIN CAPITAL LETTER REVERSED E      # 
+
+025A ; 01DD 02DE ;     SA      # ( ɚ → ǝ˞ ) LATIN SMALL LETTER SCHWA WITH HOOK → LATIN SMALL LETTER TURNED E, MODIFIER LETTER RHOTIC HOOK       # →ə˞→
+
+1D14 ; 01DD 006F ;     SA      # ( ᴔ → ǝo ) LATIN SMALL LETTER TURNED OE → LATIN SMALL LETTER TURNED E, LATIN SMALL LETTER O    # →əo→
+
+22F4 ; 025B ;  SA      #* ( ⋴ → ɛ ) SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE → LATIN SMALL LETTER OPEN E  # 
+1D6C6 ;        025B ;  SA      # ( 𝛆 → ɛ ) MATHEMATICAL BOLD SMALL EPSILON → LATIN SMALL LETTER OPEN E # →ε→
+1D6DC ;        025B ;  SA      # ( 𝛜 → ɛ ) MATHEMATICAL BOLD EPSILON SYMBOL → LATIN SMALL LETTER OPEN E        # →ε→
+1D700 ;        025B ;  SA      # ( 𝜀 → ɛ ) MATHEMATICAL ITALIC SMALL EPSILON → LATIN SMALL LETTER OPEN E       # →ε→
+1D716 ;        025B ;  SA      # ( 𝜖 → ɛ ) MATHEMATICAL ITALIC EPSILON SYMBOL → LATIN SMALL LETTER OPEN E      # →ε→
+1D73A ;        025B ;  SA      # ( 𝜺 → ɛ ) MATHEMATICAL BOLD ITALIC SMALL EPSILON → LATIN SMALL LETTER OPEN E  # →ε→
+1D750 ;        025B ;  SA      # ( 𝝐 → ɛ ) MATHEMATICAL BOLD ITALIC EPSILON SYMBOL → LATIN SMALL LETTER OPEN E # →ε→
+1D774 ;        025B ;  SA      # ( 𝝴 → ɛ ) MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON → LATIN SMALL LETTER OPEN E      # →ε→
+1D78A ;        025B ;  SA      # ( 𝞊 → ɛ ) MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL → LATIN SMALL LETTER OPEN E     # →ε→
+1D7AE ;        025B ;  SA      # ( 𝞮 → ɛ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON → LATIN SMALL LETTER OPEN E       # →ε→
+1D7C4 ;        025B ;  SA      # ( 𝟄 → ɛ ) MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL → LATIN SMALL LETTER OPEN E      # →ε→
+
+20AC ; 0190 ;  SA      #* ( € → Ɛ ) EURO SIGN → LATIN CAPITAL LETTER OPEN E     # →Є→
+2107 ; 0190 ;  SA      # ( ℇ → Ɛ ) EULER CONSTANT → LATIN CAPITAL LETTER OPEN E # 
+
+1D9F ; 1D4B ;  SA      # ( ᶟ → ᵋ ) MODIFIER LETTER SMALL REVERSED OPEN E → MODIFIER LETTER SMALL OPEN E        # 
+
+1D08 ; 025C ;  SA      # ( ᴈ → ɜ ) LATIN SMALL LETTER TURNED OPEN E → LATIN SMALL LETTER REVERSED OPEN E        # 
+
+1D41F ;        0066 ;  SA      # ( 𝐟 → f ) MATHEMATICAL BOLD SMALL F → LATIN SMALL LETTER F     # 
+1D453 ;        0066 ;  SA      # ( 𝑓 → f ) MATHEMATICAL ITALIC SMALL F → LATIN SMALL LETTER F   # 
+1D487 ;        0066 ;  SA      # ( 𝒇 → f ) MATHEMATICAL BOLD ITALIC SMALL F → LATIN SMALL LETTER F      # 
+1D4BB ;        0066 ;  SA      # ( 𝒻 → f ) MATHEMATICAL SCRIPT SMALL F → LATIN SMALL LETTER F   # 
+1D4EF ;        0066 ;  SA      # ( 𝓯 → f ) MATHEMATICAL BOLD SCRIPT SMALL F → LATIN SMALL LETTER F      # 
+1D523 ;        0066 ;  SA      # ( 𝔣 → f ) MATHEMATICAL FRAKTUR SMALL F → LATIN SMALL LETTER F  # 
+1D557 ;        0066 ;  SA      # ( 𝕗 → f ) MATHEMATICAL DOUBLE-STRUCK SMALL F → LATIN SMALL LETTER F    # 
+1D58B ;        0066 ;  SA      # ( 𝖋 → f ) MATHEMATICAL BOLD FRAKTUR SMALL F → LATIN SMALL LETTER F     # 
+1D5BF ;        0066 ;  SA      # ( 𝖿 → f ) MATHEMATICAL SANS-SERIF SMALL F → LATIN SMALL LETTER F       # 
+1D5F3 ;        0066 ;  SA      # ( 𝗳 → f ) MATHEMATICAL SANS-SERIF BOLD SMALL F → LATIN SMALL LETTER F  # 
+1D627 ;        0066 ;  SA      # ( 𝘧 → f ) MATHEMATICAL SANS-SERIF ITALIC SMALL F → LATIN SMALL LETTER F        # 
+1D65B ;        0066 ;  SA      # ( 𝙛 → f ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F → LATIN SMALL LETTER F   # 
+1D68F ;        0066 ;  SA      # ( 𝚏 → f ) MATHEMATICAL MONOSPACE SMALL F → LATIN SMALL LETTER F        # 
+017F ; 0066 ;  SA      # ( ſ → f ) LATIN SMALL LETTER LONG S → LATIN SMALL LETTER F       # 
+1E9D ; 0066 ;  SA      # ( ẝ → f ) LATIN SMALL LETTER LONG S WITH HIGH STROKE → LATIN SMALL LETTER F     # 
+
+2131 ; 0046 ;  SA      # ( ℱ → F ) SCRIPT CAPITAL F → LATIN CAPITAL LETTER F     # 
+1D405 ;        0046 ;  SA      # ( 𝐅 → F ) MATHEMATICAL BOLD CAPITAL F → LATIN CAPITAL LETTER F # 
+1D439 ;        0046 ;  SA      # ( 𝐹 → F ) MATHEMATICAL ITALIC CAPITAL F → LATIN CAPITAL LETTER F       # 
+1D46D ;        0046 ;  SA      # ( 𝑭 → F ) MATHEMATICAL BOLD ITALIC CAPITAL F → LATIN CAPITAL LETTER F  # 
+1D4D5 ;        0046 ;  SA      # ( 𝓕 → F ) MATHEMATICAL BOLD SCRIPT CAPITAL F → LATIN CAPITAL LETTER F  # 
+1D509 ;        0046 ;  SA      # ( 𝔉 → F ) MATHEMATICAL FRAKTUR CAPITAL F → LATIN CAPITAL LETTER F      # 
+1D53D ;        0046 ;  SA      # ( 𝔽 → F ) MATHEMATICAL DOUBLE-STRUCK CAPITAL F → LATIN CAPITAL LETTER F        # 
+1D571 ;        0046 ;  SA      # ( 𝕱 → F ) MATHEMATICAL BOLD FRAKTUR CAPITAL F → LATIN CAPITAL LETTER F # 
+1D5A5 ;        0046 ;  SA      # ( 𝖥 → F ) MATHEMATICAL SANS-SERIF CAPITAL F → LATIN CAPITAL LETTER F   # 
+1D5D9 ;        0046 ;  SA      # ( 𝗙 → F ) MATHEMATICAL SANS-SERIF BOLD CAPITAL F → LATIN CAPITAL LETTER F      # 
+1D60D ;        0046 ;  SA      # ( 𝘍 → F ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL F → LATIN CAPITAL LETTER F    # 
+1D641 ;        0046 ;  SA      # ( 𝙁 → F ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F → LATIN CAPITAL LETTER F       # 
+1D675 ;        0046 ;  SA      # ( 𝙵 → F ) MATHEMATICAL MONOSPACE CAPITAL F → LATIN CAPITAL LETTER F    # 
+1D7CA ;        0046 ;  SA      # ( 𝟊 → F ) MATHEMATICAL BOLD CAPITAL DIGAMMA → LATIN CAPITAL LETTER F   # →Ϝ→
+
+0192 ; 0066 0326 ;     SA      # ( ƒ → f̦ ) LATIN SMALL LETTER F WITH HOOK → LATIN SMALL LETTER F, COMBINING COMMA BELOW # →f̡→
+
+0191 ; 0046 0326 ;     SA      # ( Ƒ → F̦ ) LATIN CAPITAL LETTER F WITH HOOK → LATIN CAPITAL LETTER F, COMBINING COMMA BELOW     # →F̡→
+
+213B ; 0046 0041 0058 ;        SA      #* ( ℻ → FAX ) FACSIMILE SIGN → LATIN CAPITAL LETTER F, LATIN CAPITAL LETTER A, LATIN CAPITAL LETTER X    # 
+
+FB00 ; 0066 0066 ;     SA      # ( ff → ff ) LATIN SMALL LIGATURE FF → LATIN SMALL LETTER F, LATIN SMALL LETTER F # 
+
+FB03 ; 0066 0066 0069 ;        SA      # ( ffi → ffi ) LATIN SMALL LIGATURE FFI → LATIN SMALL LETTER F, LATIN SMALL LETTER F, LATIN SMALL LETTER I # 
+
+FB04 ; 0066 0066 006C ;        SA      # ( ffl → ffl ) LATIN SMALL LIGATURE FFL → LATIN SMALL LETTER F, LATIN SMALL LETTER F, LATIN SMALL LETTER L # 
+
+FB01 ; 0066 0069 ;     SA      # ( fi → fi ) LATIN SMALL LIGATURE FI → LATIN SMALL LETTER F, LATIN SMALL LETTER I # 
+
+FB02 ; 0066 006C ;     SA      # ( fl → fl ) LATIN SMALL LIGATURE FL → LATIN SMALL LETTER F, LATIN SMALL LETTER L # 
+
+02A9 ; 0066 014B ;     SA      # ( ʩ → fŋ ) LATIN SMALL LETTER FENG DIGRAPH → LATIN SMALL LETTER F, LATIN SMALL LETTER ENG       # 
+
+FF47 ; 0067 ;  SA      # ( g → g ) FULLWIDTH LATIN SMALL LETTER G → LATIN SMALL LETTER G # →ɡ→
+210A ; 0067 ;  SA      # ( ℊ → g ) SCRIPT SMALL G → LATIN SMALL LETTER G # 
+1D420 ;        0067 ;  SA      # ( 𝐠 → g ) MATHEMATICAL BOLD SMALL G → LATIN SMALL LETTER G     # 
+1D454 ;        0067 ;  SA      # ( 𝑔 → g ) MATHEMATICAL ITALIC SMALL G → LATIN SMALL LETTER G   # 
+1D488 ;        0067 ;  SA      # ( 𝒈 → g ) MATHEMATICAL BOLD ITALIC SMALL G → LATIN SMALL LETTER G      # 
+1D4F0 ;        0067 ;  SA      # ( 𝓰 → g ) MATHEMATICAL BOLD SCRIPT SMALL G → LATIN SMALL LETTER G      # 
+1D524 ;        0067 ;  SA      # ( 𝔤 → g ) MATHEMATICAL FRAKTUR SMALL G → LATIN SMALL LETTER G  # 
+1D558 ;        0067 ;  SA      # ( 𝕘 → g ) MATHEMATICAL DOUBLE-STRUCK SMALL G → LATIN SMALL LETTER G    # 
+1D58C ;        0067 ;  SA      # ( 𝖌 → g ) MATHEMATICAL BOLD FRAKTUR SMALL G → LATIN SMALL LETTER G     # 
+1D5C0 ;        0067 ;  SA      # ( 𝗀 → g ) MATHEMATICAL SANS-SERIF SMALL G → LATIN SMALL LETTER G       # 
+1D5F4 ;        0067 ;  SA      # ( 𝗴 → g ) MATHEMATICAL SANS-SERIF BOLD SMALL G → LATIN SMALL LETTER G  # 
+1D628 ;        0067 ;  SA      # ( 𝘨 → g ) MATHEMATICAL SANS-SERIF ITALIC SMALL G → LATIN SMALL LETTER G        # 
+1D65C ;        0067 ;  SA      # ( 𝙜 → g ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G → LATIN SMALL LETTER G   # 
+1D690 ;        0067 ;  SA      # ( 𝚐 → g ) MATHEMATICAL MONOSPACE SMALL G → LATIN SMALL LETTER G        # 
+0261 ; 0067 ;  SA      # ( ɡ → g ) LATIN SMALL LETTER SCRIPT G → LATIN SMALL LETTER G     # 
+1D83 ; 0067 ;  SA      # ( ᶃ → g ) LATIN SMALL LETTER G WITH PALATAL HOOK → LATIN SMALL LETTER G # 
+018D ; 0067 ;  SA      # ( ƍ → g ) LATIN SMALL LETTER TURNED DELTA → LATIN SMALL LETTER G # 
+
+1D406 ;        0047 ;  SA      # ( 𝐆 → G ) MATHEMATICAL BOLD CAPITAL G → LATIN CAPITAL LETTER G # 
+1D43A ;        0047 ;  SA      # ( 𝐺 → G ) MATHEMATICAL ITALIC CAPITAL G → LATIN CAPITAL LETTER G       # 
+1D46E ;        0047 ;  SA      # ( 𝑮 → G ) MATHEMATICAL BOLD ITALIC CAPITAL G → LATIN CAPITAL LETTER G  # 
+1D4A2 ;        0047 ;  SA      # ( 𝒢 → G ) MATHEMATICAL SCRIPT CAPITAL G → LATIN CAPITAL LETTER G       # 
+1D4D6 ;        0047 ;  SA      # ( 𝓖 → G ) MATHEMATICAL BOLD SCRIPT CAPITAL G → LATIN CAPITAL LETTER G  # 
+1D50A ;        0047 ;  SA      # ( 𝔊 → G ) MATHEMATICAL FRAKTUR CAPITAL G → LATIN CAPITAL LETTER G      # 
+1D53E ;        0047 ;  SA      # ( 𝔾 → G ) MATHEMATICAL DOUBLE-STRUCK CAPITAL G → LATIN CAPITAL LETTER G        # 
+1D572 ;        0047 ;  SA      # ( 𝕲 → G ) MATHEMATICAL BOLD FRAKTUR CAPITAL G → LATIN CAPITAL LETTER G # 
+1D5A6 ;        0047 ;  SA      # ( 𝖦 → G ) MATHEMATICAL SANS-SERIF CAPITAL G → LATIN CAPITAL LETTER G   # 
+1D5DA ;        0047 ;  SA      # ( 𝗚 → G ) MATHEMATICAL SANS-SERIF BOLD CAPITAL G → LATIN CAPITAL LETTER G      # 
+1D60E ;        0047 ;  SA      # ( 𝘎 → G ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL G → LATIN CAPITAL LETTER G    # 
+1D642 ;        0047 ;  SA      # ( 𝙂 → G ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G → LATIN CAPITAL LETTER G       # 
+1D676 ;        0047 ;  SA      # ( 𝙶 → G ) MATHEMATICAL MONOSPACE CAPITAL G → LATIN CAPITAL LETTER G    # 
+
+1DA2 ; 1D4D ;  SA      # ( ᶢ → ᵍ ) MODIFIER LETTER SMALL SCRIPT G → MODIFIER LETTER SMALL G    # 
+
+0260 ; 0067 0314 ;     SA      # ( ɠ → g̔ ) LATIN SMALL LETTER G WITH HOOK → LATIN SMALL LETTER G, COMBINING REVERSED COMMA ABOVE        # 
+
+01E7 ; 011F ;  SA      # ( ǧ → ğ ) LATIN SMALL LETTER G WITH CARON → LATIN SMALL LETTER G WITH BREVE     # 
+
+01E6 ; 011E ;  SA      # ( Ǧ → Ğ ) LATIN CAPITAL LETTER G WITH CARON → LATIN CAPITAL LETTER G WITH BREVE # 
+
+01F5 ; 0123 ;  SA      # ( ǵ → ģ ) LATIN SMALL LETTER G WITH ACUTE → LATIN SMALL LETTER G WITH CEDILLA   # 
+
+01E5 ; 0067 0335 ;     SA      # ( ǥ → g̵ ) LATIN SMALL LETTER G WITH STROKE → LATIN SMALL LETTER G, COMBINING SHORT STROKE OVERLAY      # 
+
+01E4 ; 0047 0335 ;     SA      # ( Ǥ → G̵ ) LATIN CAPITAL LETTER G WITH STROKE → LATIN CAPITAL LETTER G, COMBINING SHORT STROKE OVERLAY  # 
+
+0193 ; 0047 0027 ;     SA      # ( Ɠ → G' ) LATIN CAPITAL LETTER G WITH HOOK → LATIN CAPITAL LETTER G, APOSTROPHE # →Gʽ→
+
+FF48 ; 0068 ;  SA      # ( h → h ) FULLWIDTH LATIN SMALL LETTER H → LATIN SMALL LETTER H # →һ→
+210E ; 0068 ;  SA      # ( ℎ → h ) PLANCK CONSTANT → LATIN SMALL LETTER H        # 
+1D421 ;        0068 ;  SA      # ( 𝐡 → h ) MATHEMATICAL BOLD SMALL H → LATIN SMALL LETTER H     # 
+1D489 ;        0068 ;  SA      # ( 𝒉 → h ) MATHEMATICAL BOLD ITALIC SMALL H → LATIN SMALL LETTER H      # 
+1D4BD ;        0068 ;  SA      # ( 𝒽 → h ) MATHEMATICAL SCRIPT SMALL H → LATIN SMALL LETTER H   # 
+1D4F1 ;        0068 ;  SA      # ( 𝓱 → h ) MATHEMATICAL BOLD SCRIPT SMALL H → LATIN SMALL LETTER H      # 
+1D525 ;        0068 ;  SA      # ( 𝔥 → h ) MATHEMATICAL FRAKTUR SMALL H → LATIN SMALL LETTER H  # 
+1D559 ;        0068 ;  SA      # ( 𝕙 → h ) MATHEMATICAL DOUBLE-STRUCK SMALL H → LATIN SMALL LETTER H    # 
+1D58D ;        0068 ;  SA      # ( 𝖍 → h ) MATHEMATICAL BOLD FRAKTUR SMALL H → LATIN SMALL LETTER H     # 
+1D5C1 ;        0068 ;  SA      # ( 𝗁 → h ) MATHEMATICAL SANS-SERIF SMALL H → LATIN SMALL LETTER H       # 
+1D5F5 ;        0068 ;  SA      # ( 𝗵 → h ) MATHEMATICAL SANS-SERIF BOLD SMALL H → LATIN SMALL LETTER H  # 
+1D629 ;        0068 ;  SA      # ( 𝘩 → h ) MATHEMATICAL SANS-SERIF ITALIC SMALL H → LATIN SMALL LETTER H        # 
+1D65D ;        0068 ;  SA      # ( 𝙝 → h ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H → LATIN SMALL LETTER H   # 
+1D691 ;        0068 ;  SA      # ( 𝚑 → h ) MATHEMATICAL MONOSPACE SMALL H → LATIN SMALL LETTER H        # 
+
+FF28 ; 0048 ;  SA      # ( H → H ) FULLWIDTH LATIN CAPITAL LETTER H → LATIN CAPITAL LETTER H     # →Н→
+210B ; 0048 ;  SA      # ( ℋ → H ) SCRIPT CAPITAL H → LATIN CAPITAL LETTER H     # 
+210C ; 0048 ;  SA      # ( ℌ → H ) BLACK-LETTER CAPITAL H → LATIN CAPITAL LETTER H       # 
+210D ; 0048 ;  SA      # ( ℍ → H ) DOUBLE-STRUCK CAPITAL H → LATIN CAPITAL LETTER H      # 
+1D407 ;        0048 ;  SA      # ( 𝐇 → H ) MATHEMATICAL BOLD CAPITAL H → LATIN CAPITAL LETTER H # 
+1D43B ;        0048 ;  SA      # ( 𝐻 → H ) MATHEMATICAL ITALIC CAPITAL H → LATIN CAPITAL LETTER H       # 
+1D46F ;        0048 ;  SA      # ( 𝑯 → H ) MATHEMATICAL BOLD ITALIC CAPITAL H → LATIN CAPITAL LETTER H  # 
+1D4D7 ;        0048 ;  SA      # ( 𝓗 → H ) MATHEMATICAL BOLD SCRIPT CAPITAL H → LATIN CAPITAL LETTER H  # 
+1D573 ;        0048 ;  SA      # ( 𝕳 → H ) MATHEMATICAL BOLD FRAKTUR CAPITAL H → LATIN CAPITAL LETTER H # 
+1D5A7 ;        0048 ;  SA      # ( 𝖧 → H ) MATHEMATICAL SANS-SERIF CAPITAL H → LATIN CAPITAL LETTER H   # 
+1D5DB ;        0048 ;  SA      # ( 𝗛 → H ) MATHEMATICAL SANS-SERIF BOLD CAPITAL H → LATIN CAPITAL LETTER H      # 
+1D60F ;        0048 ;  SA      # ( 𝘏 → H ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL H → LATIN CAPITAL LETTER H    # 
+1D643 ;        0048 ;  SA      # ( 𝙃 → H ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H → LATIN CAPITAL LETTER H       # 
+1D677 ;        0048 ;  SA      # ( 𝙷 → H ) MATHEMATICAL MONOSPACE CAPITAL H → LATIN CAPITAL LETTER H    # 
+1D6AE ;        0048 ;  SA      # ( 𝚮 → H ) MATHEMATICAL BOLD CAPITAL ETA → LATIN CAPITAL LETTER H       # →𝐇→
+1D6E8 ;        0048 ;  SA      # ( 𝛨 → H ) MATHEMATICAL ITALIC CAPITAL ETA → LATIN CAPITAL LETTER H     # →𝐻→
+1D722 ;        0048 ;  SA      # ( 𝜢 → H ) MATHEMATICAL BOLD ITALIC CAPITAL ETA → LATIN CAPITAL LETTER H        # →Η→
+1D75C ;        0048 ;  SA      # ( 𝝜 → H ) MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA → LATIN CAPITAL LETTER H    # →Η→
+1D796 ;        0048 ;  SA      # ( 𝞖 → H ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA → LATIN CAPITAL LETTER H     # →Η→
+
+0266 ; 0068 0314 ;     SA      # ( ɦ → h̔ ) LATIN SMALL LETTER H WITH HOOK → LATIN SMALL LETTER H, COMBINING REVERSED COMMA ABOVE        # 
+
+2C67 ; 0048 0329 ;     SA      # ( Ⱨ → H̩ ) LATIN CAPITAL LETTER H WITH DESCENDER → LATIN CAPITAL LETTER H, COMBINING VERTICAL LINE BELOW       # →Ң→→Н̩→
+
+0127 ; 0068 0335 ;     SA      # ( ħ → h̵ ) LATIN SMALL LETTER H WITH STROKE → LATIN SMALL LETTER H, COMBINING SHORT STROKE OVERLAY      # 
+210F ; 0068 0335 ;     SA      # ( ℏ → h̵ ) PLANCK CONSTANT OVER TWO PI → LATIN SMALL LETTER H, COMBINING SHORT STROKE OVERLAY  # →ħ→
+
+0126 ; 0048 0335 ;     SA      # ( Ħ → H̵ ) LATIN CAPITAL LETTER H WITH STROKE → LATIN CAPITAL LETTER H, COMBINING SHORT STROKE OVERLAY  # 
+
+02DB ; 0069 ;  SA      #* ( ˛ → i ) OGONEK → LATIN SMALL LETTER I # →ͺ→→ι→→ι→
+2373 ; 0069 ;  SA      #* ( ⍳ → i ) APL FUNCTIONAL SYMBOL IOTA → LATIN SMALL LETTER I    # →ι→
+FF49 ; 0069 ;  SA      # ( i → i ) FULLWIDTH LATIN SMALL LETTER I → LATIN SMALL LETTER I # →і→
+2170 ; 0069 ;  SA      # ( ⅰ → i ) SMALL ROMAN NUMERAL ONE → LATIN SMALL LETTER I        # 
+2139 ; 0069 ;  SA      # ( ℹ → i ) INFORMATION SOURCE → LATIN SMALL LETTER I     # 
+2148 ; 0069 ;  SA      # ( ⅈ → i ) DOUBLE-STRUCK ITALIC SMALL I → LATIN SMALL LETTER I   # 
+1D422 ;        0069 ;  SA      # ( 𝐢 → i ) MATHEMATICAL BOLD SMALL I → LATIN SMALL LETTER I     # 
+1D456 ;        0069 ;  SA      # ( 𝑖 → i ) MATHEMATICAL ITALIC SMALL I → LATIN SMALL LETTER I   # 
+1D48A ;        0069 ;  SA      # ( 𝒊 → i ) MATHEMATICAL BOLD ITALIC SMALL I → LATIN SMALL LETTER I      # 
+1D4BE ;        0069 ;  SA      # ( 𝒾 → i ) MATHEMATICAL SCRIPT SMALL I → LATIN SMALL LETTER I   # 
+1D4F2 ;        0069 ;  SA      # ( 𝓲 → i ) MATHEMATICAL BOLD SCRIPT SMALL I → LATIN SMALL LETTER I      # 
+1D526 ;        0069 ;  SA      # ( 𝔦 → i ) MATHEMATICAL FRAKTUR SMALL I → LATIN SMALL LETTER I  # 
+1D55A ;        0069 ;  SA      # ( 𝕚 → i ) MATHEMATICAL DOUBLE-STRUCK SMALL I → LATIN SMALL LETTER I    # 
+1D58E ;        0069 ;  SA      # ( 𝖎 → i ) MATHEMATICAL BOLD FRAKTUR SMALL I → LATIN SMALL LETTER I     # 
+1D5C2 ;        0069 ;  SA      # ( 𝗂 → i ) MATHEMATICAL SANS-SERIF SMALL I → LATIN SMALL LETTER I       # 
+1D5F6 ;        0069 ;  SA      # ( 𝗶 → i ) MATHEMATICAL SANS-SERIF BOLD SMALL I → LATIN SMALL LETTER I  # 
+1D62A ;        0069 ;  SA      # ( 𝘪 → i ) MATHEMATICAL SANS-SERIF ITALIC SMALL I → LATIN SMALL LETTER I        # 
+1D65E ;        0069 ;  SA      # ( 𝙞 → i ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I → LATIN SMALL LETTER I   # 
+1D692 ;        0069 ;  SA      # ( 𝚒 → i ) MATHEMATICAL MONOSPACE SMALL I → LATIN SMALL LETTER I        # 
+0131 ; 0069 ;  SA      # ( ı → i ) LATIN SMALL LETTER DOTLESS I → LATIN SMALL LETTER I    # 
+1D6A4 ;        0069 ;  SA      # ( 𝚤 → i ) MATHEMATICAL ITALIC SMALL DOTLESS I → LATIN SMALL LETTER I   # →ı→
+026A ; 0069 ;  SA      # ( ɪ → i ) LATIN LETTER SMALL CAPITAL I → LATIN SMALL LETTER I    # →ı→
+0269 ; 0069 ;  SA      # ( ɩ → i ) LATIN SMALL LETTER IOTA → LATIN SMALL LETTER I # 
+1D6CA ;        0069 ;  SA      # ( 𝛊 → i ) MATHEMATICAL BOLD SMALL IOTA → LATIN SMALL LETTER I  # →ι→
+1D704 ;        0069 ;  SA      # ( 𝜄 → i ) MATHEMATICAL ITALIC SMALL IOTA → LATIN SMALL LETTER I        # →ι→
+1D73E ;        0069 ;  SA      # ( 𝜾 → i ) MATHEMATICAL BOLD ITALIC SMALL IOTA → LATIN SMALL LETTER I   # →ι→
+1D778 ;        0069 ;  SA      # ( 𝝸 → i ) MATHEMATICAL SANS-SERIF BOLD SMALL IOTA → LATIN SMALL LETTER I       # →ι→
+1D7B2 ;        0069 ;  SA      # ( 𝞲 → i ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA → LATIN SMALL LETTER I        # →ι→
+
+24DB ; 24BE ;  SA      #* ( ⓛ → Ⓘ ) CIRCLED LATIN SMALL LETTER L → CIRCLED LATIN CAPITAL LETTER I      # 
+
+01D0 ; 012D ;  SA      # ( ǐ → ĭ ) LATIN SMALL LETTER I WITH CARON → LATIN SMALL LETTER I WITH BREVE     # 
+
+01CF ; 012C ;  SA      # ( Ǐ → Ĭ ) LATIN CAPITAL LETTER I WITH CARON → LATIN CAPITAL LETTER I WITH BREVE # 
+
+0268 ; 0069 0335 ;     SA      # ( ɨ → i̵ ) LATIN SMALL LETTER I WITH STROKE → LATIN SMALL LETTER I, COMBINING SHORT STROKE OVERLAY      # 
+
+2171 ; 0069 0069 ;     SA      # ( ⅱ → ii ) SMALL ROMAN NUMERAL TWO → LATIN SMALL LETTER I, LATIN SMALL LETTER I # 
+
+2172 ; 0069 0069 0069 ;        SA      # ( ⅲ → iii ) SMALL ROMAN NUMERAL THREE → LATIN SMALL LETTER I, LATIN SMALL LETTER I, LATIN SMALL LETTER I        # 
+
+0133 ; 0069 006A ;     SA      # ( ij → ij ) LATIN SMALL LIGATURE IJ → LATIN SMALL LETTER I, LATIN SMALL LETTER J  # 
+
+0132 ; 0049 004A ;     SA      # ( IJ → IJ ) LATIN CAPITAL LIGATURE IJ → LATIN CAPITAL LETTER I, LATIN CAPITAL LETTER J    # 
+
+2173 ; 0069 0076 ;     SA      # ( ⅳ → iv ) SMALL ROMAN NUMERAL FOUR → LATIN SMALL LETTER I, LATIN SMALL LETTER V        # 
+
+2163 ; 0049 0056 ;     SA      # ( Ⅳ → IV ) ROMAN NUMERAL FOUR → LATIN CAPITAL LETTER I, LATIN CAPITAL LETTER V  # 
+
+2178 ; 0069 0078 ;     SA      # ( ⅸ → ix ) SMALL ROMAN NUMERAL NINE → LATIN SMALL LETTER I, LATIN SMALL LETTER X        # 
+
+2168 ; 0049 0058 ;     SA      # ( Ⅸ → IX ) ROMAN NUMERAL NINE → LATIN CAPITAL LETTER I, LATIN CAPITAL LETTER X  # 
+
+FF4A ; 006A ;  SA      # ( j → j ) FULLWIDTH LATIN SMALL LETTER J → LATIN SMALL LETTER J # →ј→
+2149 ; 006A ;  SA      # ( ⅉ → j ) DOUBLE-STRUCK ITALIC SMALL J → LATIN SMALL LETTER J   # 
+1D423 ;        006A ;  SA      # ( 𝐣 → j ) MATHEMATICAL BOLD SMALL J → LATIN SMALL LETTER J     # 
+1D457 ;        006A ;  SA      # ( 𝑗 → j ) MATHEMATICAL ITALIC SMALL J → LATIN SMALL LETTER J   # 
+1D48B ;        006A ;  SA      # ( 𝒋 → j ) MATHEMATICAL BOLD ITALIC SMALL J → LATIN SMALL LETTER J      # 
+1D4BF ;        006A ;  SA      # ( 𝒿 → j ) MATHEMATICAL SCRIPT SMALL J → LATIN SMALL LETTER J   # 
+1D4F3 ;        006A ;  SA      # ( 𝓳 → j ) MATHEMATICAL BOLD SCRIPT SMALL J → LATIN SMALL LETTER J      # 
+1D527 ;        006A ;  SA      # ( 𝔧 → j ) MATHEMATICAL FRAKTUR SMALL J → LATIN SMALL LETTER J  # 
+1D55B ;        006A ;  SA      # ( 𝕛 → j ) MATHEMATICAL DOUBLE-STRUCK SMALL J → LATIN SMALL LETTER J    # 
+1D58F ;        006A ;  SA      # ( 𝖏 → j ) MATHEMATICAL BOLD FRAKTUR SMALL J → LATIN SMALL LETTER J     # 
+1D5C3 ;        006A ;  SA      # ( 𝗃 → j ) MATHEMATICAL SANS-SERIF SMALL J → LATIN SMALL LETTER J       # 
+1D5F7 ;        006A ;  SA      # ( 𝗷 → j ) MATHEMATICAL SANS-SERIF BOLD SMALL J → LATIN SMALL LETTER J  # 
+1D62B ;        006A ;  SA      # ( 𝘫 → j ) MATHEMATICAL SANS-SERIF ITALIC SMALL J → LATIN SMALL LETTER J        # 
+1D65F ;        006A ;  SA      # ( 𝙟 → j ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J → LATIN SMALL LETTER J   # 
+1D693 ;        006A ;  SA      # ( 𝚓 → j ) MATHEMATICAL MONOSPACE SMALL J → LATIN SMALL LETTER J        # 
+0237 ; 006A ;  SA      # ( ȷ → j ) LATIN SMALL LETTER DOTLESS J → LATIN SMALL LETTER J    # →յ→
+1D6A5 ;        006A ;  SA      # ( 𝚥 → j ) MATHEMATICAL ITALIC SMALL DOTLESS J → LATIN SMALL LETTER J   # →ȷ→→յ→
+
+FF2A ; 004A ;  SA      # ( J → J ) FULLWIDTH LATIN CAPITAL LETTER J → LATIN CAPITAL LETTER J     # →Ј→
+1D409 ;        004A ;  SA      # ( 𝐉 → J ) MATHEMATICAL BOLD CAPITAL J → LATIN CAPITAL LETTER J # 
+1D43D ;        004A ;  SA      # ( 𝐽 → J ) MATHEMATICAL ITALIC CAPITAL J → LATIN CAPITAL LETTER J       # 
+1D471 ;        004A ;  SA      # ( 𝑱 → J ) MATHEMATICAL BOLD ITALIC CAPITAL J → LATIN CAPITAL LETTER J  # 
+1D4A5 ;        004A ;  SA      # ( 𝒥 → J ) MATHEMATICAL SCRIPT CAPITAL J → LATIN CAPITAL LETTER J       # 
+1D4D9 ;        004A ;  SA      # ( 𝓙 → J ) MATHEMATICAL BOLD SCRIPT CAPITAL J → LATIN CAPITAL LETTER J  # 
+1D50D ;        004A ;  SA      # ( 𝔍 → J ) MATHEMATICAL FRAKTUR CAPITAL J → LATIN CAPITAL LETTER J      # 
+1D541 ;        004A ;  SA      # ( 𝕁 → J ) MATHEMATICAL DOUBLE-STRUCK CAPITAL J → LATIN CAPITAL LETTER J        # 
+1D575 ;        004A ;  SA      # ( 𝕵 → J ) MATHEMATICAL BOLD FRAKTUR CAPITAL J → LATIN CAPITAL LETTER J # 
+1D5A9 ;        004A ;  SA      # ( 𝖩 → J ) MATHEMATICAL SANS-SERIF CAPITAL J → LATIN CAPITAL LETTER J   # 
+1D5DD ;        004A ;  SA      # ( 𝗝 → J ) MATHEMATICAL SANS-SERIF BOLD CAPITAL J → LATIN CAPITAL LETTER J      # 
+1D611 ;        004A ;  SA      # ( 𝘑 → J ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL J → LATIN CAPITAL LETTER J    # 
+1D645 ;        004A ;  SA      # ( 𝙅 → J ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J → LATIN CAPITAL LETTER J       # 
+1D679 ;        004A ;  SA      # ( 𝙹 → J ) MATHEMATICAL MONOSPACE CAPITAL J → LATIN CAPITAL LETTER J    # 
+
+1D424 ;        006B ;  SA      # ( 𝐤 → k ) MATHEMATICAL BOLD SMALL K → LATIN SMALL LETTER K     # 
+1D458 ;        006B ;  SA      # ( 𝑘 → k ) MATHEMATICAL ITALIC SMALL K → LATIN SMALL LETTER K   # 
+1D48C ;        006B ;  SA      # ( 𝒌 → k ) MATHEMATICAL BOLD ITALIC SMALL K → LATIN SMALL LETTER K      # 
+1D4C0 ;        006B ;  SA      # ( 𝓀 → k ) MATHEMATICAL SCRIPT SMALL K → LATIN SMALL LETTER K   # 
+1D4F4 ;        006B ;  SA      # ( 𝓴 → k ) MATHEMATICAL BOLD SCRIPT SMALL K → LATIN SMALL LETTER K      # 
+1D528 ;        006B ;  SA      # ( 𝔨 → k ) MATHEMATICAL FRAKTUR SMALL K → LATIN SMALL LETTER K  # 
+1D55C ;        006B ;  SA      # ( 𝕜 → k ) MATHEMATICAL DOUBLE-STRUCK SMALL K → LATIN SMALL LETTER K    # 
+1D590 ;        006B ;  SA      # ( 𝖐 → k ) MATHEMATICAL BOLD FRAKTUR SMALL K → LATIN SMALL LETTER K     # 
+1D5C4 ;        006B ;  SA      # ( 𝗄 → k ) MATHEMATICAL SANS-SERIF SMALL K → LATIN SMALL LETTER K       # 
+1D5F8 ;        006B ;  SA      # ( 𝗸 → k ) MATHEMATICAL SANS-SERIF BOLD SMALL K → LATIN SMALL LETTER K  # 
+1D62C ;        006B ;  SA      # ( 𝘬 → k ) MATHEMATICAL SANS-SERIF ITALIC SMALL K → LATIN SMALL LETTER K        # 
+1D660 ;        006B ;  SA      # ( 𝙠 → k ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K → LATIN SMALL LETTER K   # 
+1D694 ;        006B ;  SA      # ( 𝚔 → k ) MATHEMATICAL MONOSPACE SMALL K → LATIN SMALL LETTER K        # 
+1D0B ; 006B ;  SA      # ( ᴋ → k ) LATIN LETTER SMALL CAPITAL K → LATIN SMALL LETTER K   # →к→
+0138 ; 006B ;  SA      # ( ĸ → k ) LATIN SMALL LETTER KRA → LATIN SMALL LETTER K  # →к→
+1D6CB ;        006B ;  SA      # ( 𝛋 → k ) MATHEMATICAL BOLD SMALL KAPPA → LATIN SMALL LETTER K # →κ→→к→
+1D6DE ;        006B ;  SA      # ( 𝛞 → k ) MATHEMATICAL BOLD KAPPA SYMBOL → LATIN SMALL LETTER K        # →κ→→к→
+1D705 ;        006B ;  SA      # ( 𝜅 → k ) MATHEMATICAL ITALIC SMALL KAPPA → LATIN SMALL LETTER K       # →κ→→к→
+1D718 ;        006B ;  SA      # ( 𝜘 → k ) MATHEMATICAL ITALIC KAPPA SYMBOL → LATIN SMALL LETTER K      # →κ→→к→
+1D73F ;        006B ;  SA      # ( 𝜿 → k ) MATHEMATICAL BOLD ITALIC SMALL KAPPA → LATIN SMALL LETTER K  # →κ→→к→
+1D752 ;        006B ;  SA      # ( 𝝒 → k ) MATHEMATICAL BOLD ITALIC KAPPA SYMBOL → LATIN SMALL LETTER K # →κ→→к→
+1D779 ;        006B ;  SA      # ( 𝝹 → k ) MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA → LATIN SMALL LETTER K      # →κ→→к→
+1D78C ;        006B ;  SA      # ( 𝞌 → k ) MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL → LATIN SMALL LETTER K     # →κ→→к→
+1D7B3 ;        006B ;  SA      # ( 𝞳 → k ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA → LATIN SMALL LETTER K       # →κ→→к→
+1D7C6 ;        006B ;  SA      # ( 𝟆 → k ) MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL → LATIN SMALL LETTER K      # →κ→→к→
+
+212A ; 004B ;  SA      # ( K → K ) KELVIN SIGN → LATIN CAPITAL LETTER K  # 
+FF2B ; 004B ;  SA      # ( K → K ) FULLWIDTH LATIN CAPITAL LETTER K → LATIN CAPITAL LETTER K     # →Κ→
+1D40A ;        004B ;  SA      # ( 𝐊 → K ) MATHEMATICAL BOLD CAPITAL K → LATIN CAPITAL LETTER K # 
+1D43E ;        004B ;  SA      # ( 𝐾 → K ) MATHEMATICAL ITALIC CAPITAL K → LATIN CAPITAL LETTER K       # 
+1D472 ;        004B ;  SA      # ( 𝑲 → K ) MATHEMATICAL BOLD ITALIC CAPITAL K → LATIN CAPITAL LETTER K  # 
+1D4A6 ;        004B ;  SA      # ( 𝒦 → K ) MATHEMATICAL SCRIPT CAPITAL K → LATIN CAPITAL LETTER K       # 
+1D4DA ;        004B ;  SA      # ( 𝓚 → K ) MATHEMATICAL BOLD SCRIPT CAPITAL K → LATIN CAPITAL LETTER K  # 
+1D50E ;        004B ;  SA      # ( 𝔎 → K ) MATHEMATICAL FRAKTUR CAPITAL K → LATIN CAPITAL LETTER K      # 
+1D542 ;        004B ;  SA      # ( 𝕂 → K ) MATHEMATICAL DOUBLE-STRUCK CAPITAL K → LATIN CAPITAL LETTER K        # 
+1D576 ;        004B ;  SA      # ( 𝕶 → K ) MATHEMATICAL BOLD FRAKTUR CAPITAL K → LATIN CAPITAL LETTER K # 
+1D5AA ;        004B ;  SA      # ( 𝖪 → K ) MATHEMATICAL SANS-SERIF CAPITAL K → LATIN CAPITAL LETTER K   # 
+1D5DE ;        004B ;  SA      # ( 𝗞 → K ) MATHEMATICAL SANS-SERIF BOLD CAPITAL K → LATIN CAPITAL LETTER K      # 
+1D612 ;        004B ;  SA      # ( 𝘒 → K ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL K → LATIN CAPITAL LETTER K    # 
+1D646 ;        004B ;  SA      # ( 𝙆 → K ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K → LATIN CAPITAL LETTER K       # 
+1D67A ;        004B ;  SA      # ( 𝙺 → K ) MATHEMATICAL MONOSPACE CAPITAL K → LATIN CAPITAL LETTER K    # 
+1D6B1 ;        004B ;  SA      # ( 𝚱 → K ) MATHEMATICAL BOLD CAPITAL KAPPA → LATIN CAPITAL LETTER K     # →Κ→
+1D6EB ;        004B ;  SA      # ( 𝛫 → K ) MATHEMATICAL ITALIC CAPITAL KAPPA → LATIN CAPITAL LETTER K   # →Κ→
+1D725 ;        004B ;  SA      # ( 𝜥 → K ) MATHEMATICAL BOLD ITALIC CAPITAL KAPPA → LATIN CAPITAL LETTER K      # →Κ→
+1D75F ;        004B ;  SA      # ( 𝝟 → K ) MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA → LATIN CAPITAL LETTER K  # →Κ→
+1D799 ;        004B ;  SA      # ( 𝞙 → K ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA → LATIN CAPITAL LETTER K   # →Κ→
+
+0199 ; 006B 0314 ;     SA      # ( ƙ → k̔ ) LATIN SMALL LETTER K WITH HOOK → LATIN SMALL LETTER K, COMBINING REVERSED COMMA ABOVE        # 
+
+2C69 ; 004B 0329 ;     SA      # ( Ⱪ → K̩ ) LATIN CAPITAL LETTER K WITH DESCENDER → LATIN CAPITAL LETTER K, COMBINING VERTICAL LINE BELOW       # →Қ→→К̩→
+
+0198 ; 004B 0027 ;     SA      # ( Ƙ → K' ) LATIN CAPITAL LETTER K WITH HOOK → LATIN CAPITAL LETTER K, APOSTROPHE # →Kʽ→
+
+007C ; 006C ;  SA      #* ( | → l ) VERTICAL LINE → LATIN SMALL LETTER L   # 
+2223 ; 006C ;  SA      #* ( ∣ → l ) DIVIDES → LATIN SMALL LETTER L       # →|→
+FFE8 ; 006C ;  SA      #* ( │ → l ) HALFWIDTH FORMS LIGHT VERTICAL → LATIN SMALL LETTER L        # →|→
+0031 ; 006C ;  SA      # ( 1 → l ) DIGIT ONE → LATIN SMALL LETTER L        # 
+1D7CF ;        006C ;  SA      # ( 𝟏 → l ) MATHEMATICAL BOLD DIGIT ONE → LATIN SMALL LETTER L   # →1→
+1D7D9 ;        006C ;  SA      # ( 𝟙 → l ) MATHEMATICAL DOUBLE-STRUCK DIGIT ONE → LATIN SMALL LETTER L  # →1→
+1D7E3 ;        006C ;  SA      # ( 𝟣 → l ) MATHEMATICAL SANS-SERIF DIGIT ONE → LATIN SMALL LETTER L     # →1→
+1D7ED ;        006C ;  SA      # ( 𝟭 → l ) MATHEMATICAL SANS-SERIF BOLD DIGIT ONE → LATIN SMALL LETTER L        # →1→
+1D7F7 ;        006C ;  SA      # ( 𝟷 → l ) MATHEMATICAL MONOSPACE DIGIT ONE → LATIN SMALL LETTER L      # →1→
+0049 ; 006C ;  SA      # ( I → l ) LATIN CAPITAL LETTER I → LATIN SMALL LETTER L   # 
+FF29 ; 006C ;  SA      # ( I → l ) FULLWIDTH LATIN CAPITAL LETTER I → LATIN SMALL LETTER L       # →Ӏ→
+2160 ; 006C ;  SA      # ( Ⅰ → l ) ROMAN NUMERAL ONE → LATIN SMALL LETTER L      # →Ӏ→
+2110 ; 006C ;  SA      # ( ℐ → l ) SCRIPT CAPITAL I → LATIN SMALL LETTER L       # →I→
+2111 ; 006C ;  SA      # ( ℑ → l ) BLACK-LETTER CAPITAL I → LATIN SMALL LETTER L # →I→
+1D408 ;        006C ;  SA      # ( 𝐈 → l ) MATHEMATICAL BOLD CAPITAL I → LATIN SMALL LETTER L   # →I→
+1D43C ;        006C ;  SA      # ( 𝐼 → l ) MATHEMATICAL ITALIC CAPITAL I → LATIN SMALL LETTER L # →I→
+1D470 ;        006C ;  SA      # ( 𝑰 → l ) MATHEMATICAL BOLD ITALIC CAPITAL I → LATIN SMALL LETTER L    # →I→
+1D4D8 ;        006C ;  SA      # ( 𝓘 → l ) MATHEMATICAL BOLD SCRIPT CAPITAL I → LATIN SMALL LETTER L    # →I→
+1D540 ;        006C ;  SA      # ( 𝕀 → l ) MATHEMATICAL DOUBLE-STRUCK CAPITAL I → LATIN SMALL LETTER L  # →I→
+1D574 ;        006C ;  SA      # ( 𝕴 → l ) MATHEMATICAL BOLD FRAKTUR CAPITAL I → LATIN SMALL LETTER L   # →I→
+1D5A8 ;        006C ;  SA      # ( 𝖨 → l ) MATHEMATICAL SANS-SERIF CAPITAL I → LATIN SMALL LETTER L     # →I→
+1D5DC ;        006C ;  SA      # ( 𝗜 → l ) MATHEMATICAL SANS-SERIF BOLD CAPITAL I → LATIN SMALL LETTER L        # →I→
+1D610 ;        006C ;  SA      # ( 𝘐 → l ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL I → LATIN SMALL LETTER L      # →I→
+1D644 ;        006C ;  SA      # ( 𝙄 → l ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I → LATIN SMALL LETTER L # →I→
+1D678 ;        006C ;  SA      # ( 𝙸 → l ) MATHEMATICAL MONOSPACE CAPITAL I → LATIN SMALL LETTER L      # →I→
+0196 ; 006C ;  SA      # ( Ɩ → l ) LATIN CAPITAL LETTER IOTA → LATIN SMALL LETTER L       # 
+FF4C ; 006C ;  SA      # ( l → l ) FULLWIDTH LATIN SMALL LETTER L → LATIN SMALL LETTER L # →Ⅰ→→Ӏ→
+217C ; 006C ;  SA      # ( ⅼ → l ) SMALL ROMAN NUMERAL FIFTY → LATIN SMALL LETTER L      # 
+2113 ; 006C ;  SA      # ( ℓ → l ) SCRIPT SMALL L → LATIN SMALL LETTER L # 
+1D425 ;        006C ;  SA      # ( 𝐥 → l ) MATHEMATICAL BOLD SMALL L → LATIN SMALL LETTER L     # 
+1D459 ;        006C ;  SA      # ( 𝑙 → l ) MATHEMATICAL ITALIC SMALL L → LATIN SMALL LETTER L   # 
+1D48D ;        006C ;  SA      # ( 𝒍 → l ) MATHEMATICAL BOLD ITALIC SMALL L → LATIN SMALL LETTER L      # 
+1D4C1 ;        006C ;  SA      # ( 𝓁 → l ) MATHEMATICAL SCRIPT SMALL L → LATIN SMALL LETTER L   # 
+1D4F5 ;        006C ;  SA      # ( 𝓵 → l ) MATHEMATICAL BOLD SCRIPT SMALL L → LATIN SMALL LETTER L      # 
+1D529 ;        006C ;  SA      # ( 𝔩 → l ) MATHEMATICAL FRAKTUR SMALL L → LATIN SMALL LETTER L  # 
+1D55D ;        006C ;  SA      # ( 𝕝 → l ) MATHEMATICAL DOUBLE-STRUCK SMALL L → LATIN SMALL LETTER L    # 
+1D591 ;        006C ;  SA      # ( 𝖑 → l ) MATHEMATICAL BOLD FRAKTUR SMALL L → LATIN SMALL LETTER L     # 
+1D5C5 ;        006C ;  SA      # ( 𝗅 → l ) MATHEMATICAL SANS-SERIF SMALL L → LATIN SMALL LETTER L       # 
+1D5F9 ;        006C ;  SA      # ( 𝗹 → l ) MATHEMATICAL SANS-SERIF BOLD SMALL L → LATIN SMALL LETTER L  # 
+1D62D ;        006C ;  SA      # ( 𝘭 → l ) MATHEMATICAL SANS-SERIF ITALIC SMALL L → LATIN SMALL LETTER L        # 
+1D661 ;        006C ;  SA      # ( 𝙡 → l ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L → LATIN SMALL LETTER L   # 
+1D695 ;        006C ;  SA      # ( 𝚕 → l ) MATHEMATICAL MONOSPACE SMALL L → LATIN SMALL LETTER L        # 
+01C0 ; 006C ;  SA      # ( ǀ → l ) LATIN LETTER DENTAL CLICK → LATIN SMALL LETTER L       # 
+1D6B0 ;        006C ;  SA      # ( 𝚰 → l ) MATHEMATICAL BOLD CAPITAL IOTA → LATIN SMALL LETTER L        # →Ι→
+1D6EA ;        006C ;  SA      # ( 𝛪 → l ) MATHEMATICAL ITALIC CAPITAL IOTA → LATIN SMALL LETTER L      # →Ι→
+1D724 ;        006C ;  SA      # ( 𝜤 → l ) MATHEMATICAL BOLD ITALIC CAPITAL IOTA → LATIN SMALL LETTER L # →Ι→
+1D75E ;        006C ;  SA      # ( 𝝞 → l ) MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA → LATIN SMALL LETTER L     # →Ι→
+1D798 ;        006C ;  SA      # ( 𝞘 → l ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA → LATIN SMALL LETTER L      # →Ι→
+
+216C ; 004C ;  SA      # ( Ⅼ → L ) ROMAN NUMERAL FIFTY → LATIN CAPITAL LETTER L  # 
+2112 ; 004C ;  SA      # ( ℒ → L ) SCRIPT CAPITAL L → LATIN CAPITAL LETTER L     # 
+1D40B ;        004C ;  SA      # ( 𝐋 → L ) MATHEMATICAL BOLD CAPITAL L → LATIN CAPITAL LETTER L # 
+1D43F ;        004C ;  SA      # ( 𝐿 → L ) MATHEMATICAL ITALIC CAPITAL L → LATIN CAPITAL LETTER L       # 
+1D473 ;        004C ;  SA      # ( 𝑳 → L ) MATHEMATICAL BOLD ITALIC CAPITAL L → LATIN CAPITAL LETTER L  # 
+1D4DB ;        004C ;  SA      # ( 𝓛 → L ) MATHEMATICAL BOLD SCRIPT CAPITAL L → LATIN CAPITAL LETTER L  # 
+1D50F ;        004C ;  SA      # ( 𝔏 → L ) MATHEMATICAL FRAKTUR CAPITAL L → LATIN CAPITAL LETTER L      # 
+1D543 ;        004C ;  SA      # ( 𝕃 → L ) MATHEMATICAL DOUBLE-STRUCK CAPITAL L → LATIN CAPITAL LETTER L        # 
+1D577 ;        004C ;  SA      # ( 𝕷 → L ) MATHEMATICAL BOLD FRAKTUR CAPITAL L → LATIN CAPITAL LETTER L # 
+1D5AB ;        004C ;  SA      # ( 𝖫 → L ) MATHEMATICAL SANS-SERIF CAPITAL L → LATIN CAPITAL LETTER L   # 
+1D5DF ;        004C ;  SA      # ( 𝗟 → L ) MATHEMATICAL SANS-SERIF BOLD CAPITAL L → LATIN CAPITAL LETTER L      # 
+1D613 ;        004C ;  SA      # ( 𝘓 → L ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL L → LATIN CAPITAL LETTER L    # 
+1D647 ;        004C ;  SA      # ( 𝙇 → L ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L → LATIN CAPITAL LETTER L       # 
+1D67B ;        004C ;  SA      # ( 𝙻 → L ) MATHEMATICAL MONOSPACE CAPITAL L → LATIN CAPITAL LETTER L    # 
+
+0142 ; 006C 0338 ;     SA      # ( ł → l̸ ) LATIN SMALL LETTER L WITH STROKE → LATIN SMALL LETTER L, COMBINING LONG SOLIDUS OVERLAY      # →l̷→
+
+0141 ; 004C 0338 ;     SA      # ( Ł → L̸ ) LATIN CAPITAL LETTER L WITH STROKE → LATIN CAPITAL LETTER L, COMBINING LONG SOLIDUS OVERLAY  # →L̷→
+
+026D ; 006C 0328 ;     SA      # ( ɭ → l̨ ) LATIN SMALL LETTER L WITH RETROFLEX HOOK → LATIN SMALL LETTER L, COMBINING OGONEK    # →l̢→
+
+026B ; 006C 0334 ;     SA      # ( ɫ → l̴ ) LATIN SMALL LETTER L WITH MIDDLE TILDE → LATIN SMALL LETTER L, COMBINING TILDE OVERLAY       # 
+
+0197 ; 006C 0335 ;     SA      # ( Ɨ → l̵ ) LATIN CAPITAL LETTER I WITH STROKE → LATIN SMALL LETTER L, COMBINING SHORT STROKE OVERLAY    # →ƚ→
+019A ; 006C 0335 ;     SA      # ( ƚ → l̵ ) LATIN SMALL LETTER L WITH BAR → LATIN SMALL LETTER L, COMBINING SHORT STROKE OVERLAY # 
+
+0140 ; 006C 00B7 ;     SA      # ( ŀ → l· ) LATIN SMALL LETTER L WITH MIDDLE DOT → LATIN SMALL LETTER L, MIDDLE DOT      # 
+013F ; 006C 00B7 ;     SA      # ( Ŀ → l· ) LATIN CAPITAL LETTER L WITH MIDDLE DOT → LATIN SMALL LETTER L, MIDDLE DOT    # →L·→→ᒪ·→→ᒪᐧ→→ᒷ→→1ᐧ→
+
+1F102 ;        006C 002C ;     SA      #* ( 🄂 → l, ) DIGIT ONE COMMA → LATIN SMALL LETTER L, COMMA      # →1,→
+
+2488 ; 006C 002E ;     SA      #* ( ⒈ → l. ) DIGIT ONE FULL STOP → LATIN SMALL LETTER L, FULL STOP       # →1.→
+
+2493 ; 006C 0032 002E ;        SA      #* ( ⒓ → l2. ) NUMBER TWELVE FULL STOP → LATIN SMALL LETTER L, DIGIT TWO, FULL STOP       # →12.→
+
+2494 ; 006C 0033 002E ;        SA      #* ( ⒔ → l3. ) NUMBER THIRTEEN FULL STOP → LATIN SMALL LETTER L, DIGIT THREE, FULL STOP   # →13.→
+
+2495 ; 006C 0034 002E ;        SA      #* ( ⒕ → l4. ) NUMBER FOURTEEN FULL STOP → LATIN SMALL LETTER L, DIGIT FOUR, FULL STOP    # →14.→
+
+2496 ; 006C 0035 002E ;        SA      #* ( ⒖ → l5. ) NUMBER FIFTEEN FULL STOP → LATIN SMALL LETTER L, DIGIT FIVE, FULL STOP     # →15.→
+
+2497 ; 006C 0036 002E ;        SA      #* ( ⒗ → l6. ) NUMBER SIXTEEN FULL STOP → LATIN SMALL LETTER L, DIGIT SIX, FULL STOP      # →16.→
+
+2498 ; 006C 0037 002E ;        SA      #* ( ⒘ → l7. ) NUMBER SEVENTEEN FULL STOP → LATIN SMALL LETTER L, DIGIT SEVEN, FULL STOP  # →17.→
+
+2499 ; 006C 0038 002E ;        SA      #* ( ⒙ → l8. ) NUMBER EIGHTEEN FULL STOP → LATIN SMALL LETTER L, DIGIT EIGHT, FULL STOP   # →18.→
+
+249A ; 006C 0039 002E ;        SA      #* ( ⒚ → l9. ) NUMBER NINETEEN FULL STOP → LATIN SMALL LETTER L, DIGIT NINE, FULL STOP    # →19.→
+
+01C9 ; 006C 006A ;     SA      # ( lj → lj ) LATIN SMALL LETTER LJ → LATIN SMALL LETTER L, LATIN SMALL LETTER J    # 
+
+01C8 ; 004C 006A ;     SA      # ( Lj → Lj ) LATIN CAPITAL LETTER L WITH SMALL LETTER J → LATIN CAPITAL LETTER L, LATIN SMALL LETTER J     # 
+
+01C7 ; 004C 004A ;     SA      # ( LJ → LJ ) LATIN CAPITAL LETTER LJ → LATIN CAPITAL LETTER L, LATIN CAPITAL LETTER J      # 
+
+2016 ; 006C 006C ;     SA      #* ( ‖ → ll ) DOUBLE VERTICAL LINE → LATIN SMALL LETTER L, LATIN SMALL LETTER L   # →∥→→||→
+2225 ; 006C 006C ;     SA      #* ( ∥ → ll ) PARALLEL TO → LATIN SMALL LETTER L, LATIN SMALL LETTER L    # →||→
+2161 ; 006C 006C ;     SA      # ( Ⅱ → ll ) ROMAN NUMERAL TWO → LATIN SMALL LETTER L, LATIN SMALL LETTER L       # →II→
+01C1 ; 006C 006C ;     SA      # ( ǁ → ll ) LATIN LETTER LATERAL CLICK → LATIN SMALL LETTER L, LATIN SMALL LETTER L       # →‖→→∥→→||→
+
+2492 ; 006C 006C 002E ;        SA      #* ( ⒒ → ll. ) NUMBER ELEVEN FULL STOP → LATIN SMALL LETTER L, LATIN SMALL LETTER L, FULL STOP    # →11.→
+
+2162 ; 006C 006C 006C ;        SA      # ( Ⅲ → lll ) ROMAN NUMERAL THREE → LATIN SMALL LETTER L, LATIN SMALL LETTER L, LATIN SMALL LETTER L      # →III→
+
+2491 ; 006C 004F 002E ;        SA      #* ( ⒑ → lO. ) NUMBER TEN FULL STOP → LATIN SMALL LETTER L, LATIN CAPITAL LETTER O, FULL STOP     # →10.→
+
+FF2D ; 004D ;  SA      # ( M → M ) FULLWIDTH LATIN CAPITAL LETTER M → LATIN CAPITAL LETTER M     # →Μ→
+216F ; 004D ;  SA      # ( Ⅿ → M ) ROMAN NUMERAL ONE THOUSAND → LATIN CAPITAL LETTER M   # 
+2133 ; 004D ;  SA      # ( ℳ → M ) SCRIPT CAPITAL M → LATIN CAPITAL LETTER M     # 
+1D40C ;        004D ;  SA      # ( 𝐌 → M ) MATHEMATICAL BOLD CAPITAL M → LATIN CAPITAL LETTER M # 
+1D440 ;        004D ;  SA      # ( 𝑀 → M ) MATHEMATICAL ITALIC CAPITAL M → LATIN CAPITAL LETTER M       # 
+1D474 ;        004D ;  SA      # ( 𝑴 → M ) MATHEMATICAL BOLD ITALIC CAPITAL M → LATIN CAPITAL LETTER M  # 
+1D4DC ;        004D ;  SA      # ( 𝓜 → M ) MATHEMATICAL BOLD SCRIPT CAPITAL M → LATIN CAPITAL LETTER M  # 
+1D510 ;        004D ;  SA      # ( 𝔐 → M ) MATHEMATICAL FRAKTUR CAPITAL M → LATIN CAPITAL LETTER M      # 
+1D544 ;        004D ;  SA      # ( 𝕄 → M ) MATHEMATICAL DOUBLE-STRUCK CAPITAL M → LATIN CAPITAL LETTER M        # 
+1D578 ;        004D ;  SA      # ( 𝕸 → M ) MATHEMATICAL BOLD FRAKTUR CAPITAL M → LATIN CAPITAL LETTER M # 
+1D5AC ;        004D ;  SA      # ( 𝖬 → M ) MATHEMATICAL SANS-SERIF CAPITAL M → LATIN CAPITAL LETTER M   # 
+1D5E0 ;        004D ;  SA      # ( 𝗠 → M ) MATHEMATICAL SANS-SERIF BOLD CAPITAL M → LATIN CAPITAL LETTER M      # 
+1D614 ;        004D ;  SA      # ( 𝘔 → M ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL M → LATIN CAPITAL LETTER M    # 
+1D648 ;        004D ;  SA      # ( 𝙈 → M ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M → LATIN CAPITAL LETTER M       # 
+1D67C ;        004D ;  SA      # ( 𝙼 → M ) MATHEMATICAL MONOSPACE CAPITAL M → LATIN CAPITAL LETTER M    # 
+1D6B3 ;        004D ;  SA      # ( 𝚳 → M ) MATHEMATICAL BOLD CAPITAL MU → LATIN CAPITAL LETTER M        # →Μ→
+1D6ED ;        004D ;  SA      # ( 𝛭 → M ) MATHEMATICAL ITALIC CAPITAL MU → LATIN CAPITAL LETTER M      # →Μ→
+1D727 ;        004D ;  SA      # ( 𝜧 → M ) MATHEMATICAL BOLD ITALIC CAPITAL MU → LATIN CAPITAL LETTER M # →Μ→
+1D761 ;        004D ;  SA      # ( 𝝡 → M ) MATHEMATICAL SANS-SERIF BOLD CAPITAL MU → LATIN CAPITAL LETTER M     # →Μ→
+1D79B ;        004D ;  SA      # ( 𝞛 → M ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU → LATIN CAPITAL LETTER M      # →Μ→
+
+1D427 ;        006E ;  SA      # ( 𝐧 → n ) MATHEMATICAL BOLD SMALL N → LATIN SMALL LETTER N     # 
+1D45B ;        006E ;  SA      # ( 𝑛 → n ) MATHEMATICAL ITALIC SMALL N → LATIN SMALL LETTER N   # 
+1D48F ;        006E ;  SA      # ( 𝒏 → n ) MATHEMATICAL BOLD ITALIC SMALL N → LATIN SMALL LETTER N      # 
+1D4C3 ;        006E ;  SA      # ( 𝓃 → n ) MATHEMATICAL SCRIPT SMALL N → LATIN SMALL LETTER N   # 
+1D4F7 ;        006E ;  SA      # ( 𝓷 → n ) MATHEMATICAL BOLD SCRIPT SMALL N → LATIN SMALL LETTER N      # 
+1D52B ;        006E ;  SA      # ( 𝔫 → n ) MATHEMATICAL FRAKTUR SMALL N → LATIN SMALL LETTER N  # 
+1D55F ;        006E ;  SA      # ( 𝕟 → n ) MATHEMATICAL DOUBLE-STRUCK SMALL N → LATIN SMALL LETTER N    # 
+1D593 ;        006E ;  SA      # ( 𝖓 → n ) MATHEMATICAL BOLD FRAKTUR SMALL N → LATIN SMALL LETTER N     # 
+1D5C7 ;        006E ;  SA      # ( 𝗇 → n ) MATHEMATICAL SANS-SERIF SMALL N → LATIN SMALL LETTER N       # 
+1D5FB ;        006E ;  SA      # ( 𝗻 → n ) MATHEMATICAL SANS-SERIF BOLD SMALL N → LATIN SMALL LETTER N  # 
+1D62F ;        006E ;  SA      # ( 𝘯 → n ) MATHEMATICAL SANS-SERIF ITALIC SMALL N → LATIN SMALL LETTER N        # 
+1D663 ;        006E ;  SA      # ( 𝙣 → n ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N → LATIN SMALL LETTER N   # 
+1D697 ;        006E ;  SA      # ( 𝚗 → n ) MATHEMATICAL MONOSPACE SMALL N → LATIN SMALL LETTER N        # 
+213C ; 006E ;  SA      # ( ℼ → n ) DOUBLE-STRUCK SMALL PI → LATIN SMALL LETTER N # →π→
+1D6D1 ;        006E ;  SA      # ( 𝛑 → n ) MATHEMATICAL BOLD SMALL PI → LATIN SMALL LETTER N    # →π→
+1D6E1 ;        006E ;  SA      # ( 𝛡 → n ) MATHEMATICAL BOLD PI SYMBOL → LATIN SMALL LETTER N   # →π→
+1D70B ;        006E ;  SA      # ( 𝜋 → n ) MATHEMATICAL ITALIC SMALL PI → LATIN SMALL LETTER N  # →π→
+1D71B ;        006E ;  SA      # ( 𝜛 → n ) MATHEMATICAL ITALIC PI SYMBOL → LATIN SMALL LETTER N # →π→
+1D745 ;        006E ;  SA      # ( 𝝅 → n ) MATHEMATICAL BOLD ITALIC SMALL PI → LATIN SMALL LETTER N     # →π→
+1D755 ;        006E ;  SA      # ( 𝝕 → n ) MATHEMATICAL BOLD ITALIC PI SYMBOL → LATIN SMALL LETTER N    # →π→
+1D77F ;        006E ;  SA      # ( 𝝿 → n ) MATHEMATICAL SANS-SERIF BOLD SMALL PI → LATIN SMALL LETTER N # →π→
+1D78F ;        006E ;  SA      # ( 𝞏 → n ) MATHEMATICAL SANS-SERIF BOLD PI SYMBOL → LATIN SMALL LETTER N        # →π→
+1D7B9 ;        006E ;  SA      # ( 𝞹 → n ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI → LATIN SMALL LETTER N  # →π→
+1D7C9 ;        006E ;  SA      # ( 𝟉 → n ) MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL → LATIN SMALL LETTER N # →π→
+
+FF2E ; 004E ;  SA      # ( N → N ) FULLWIDTH LATIN CAPITAL LETTER N → LATIN CAPITAL LETTER N     # →Ν→
+2115 ; 004E ;  SA      # ( ℕ → N ) DOUBLE-STRUCK CAPITAL N → LATIN CAPITAL LETTER N      # 
+1D40D ;        004E ;  SA      # ( 𝐍 → N ) MATHEMATICAL BOLD CAPITAL N → LATIN CAPITAL LETTER N # 
+1D441 ;        004E ;  SA      # ( 𝑁 → N ) MATHEMATICAL ITALIC CAPITAL N → LATIN CAPITAL LETTER N       # 
+1D475 ;        004E ;  SA      # ( 𝑵 → N ) MATHEMATICAL BOLD ITALIC CAPITAL N → LATIN CAPITAL LETTER N  # 
+1D4A9 ;        004E ;  SA      # ( 𝒩 → N ) MATHEMATICAL SCRIPT CAPITAL N → LATIN CAPITAL LETTER N       # 
+1D4DD ;        004E ;  SA      # ( 𝓝 → N ) MATHEMATICAL BOLD SCRIPT CAPITAL N → LATIN CAPITAL LETTER N  # 
+1D511 ;        004E ;  SA      # ( 𝔑 → N ) MATHEMATICAL FRAKTUR CAPITAL N → LATIN CAPITAL LETTER N      # 
+1D579 ;        004E ;  SA      # ( 𝕹 → N ) MATHEMATICAL BOLD FRAKTUR CAPITAL N → LATIN CAPITAL LETTER N # 
+1D5AD ;        004E ;  SA      # ( 𝖭 → N ) MATHEMATICAL SANS-SERIF CAPITAL N → LATIN CAPITAL LETTER N   # 
+1D5E1 ;        004E ;  SA      # ( 𝗡 → N ) MATHEMATICAL SANS-SERIF BOLD CAPITAL N → LATIN CAPITAL LETTER N      # 
+1D615 ;        004E ;  SA      # ( 𝘕 → N ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL N → LATIN CAPITAL LETTER N    # 
+1D649 ;        004E ;  SA      # ( 𝙉 → N ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N → LATIN CAPITAL LETTER N       # 
+1D67D ;        004E ;  SA      # ( 𝙽 → N ) MATHEMATICAL MONOSPACE CAPITAL N → LATIN CAPITAL LETTER N    # 
+1D6B4 ;        004E ;  SA      # ( 𝚴 → N ) MATHEMATICAL BOLD CAPITAL NU → LATIN CAPITAL LETTER N        # →𝐍→
+1D6EE ;        004E ;  SA      # ( 𝛮 → N ) MATHEMATICAL ITALIC CAPITAL NU → LATIN CAPITAL LETTER N      # →Ν→
+1D728 ;        004E ;  SA      # ( 𝜨 → N ) MATHEMATICAL BOLD ITALIC CAPITAL NU → LATIN CAPITAL LETTER N # →𝑵→
+1D762 ;        004E ;  SA      # ( 𝝢 → N ) MATHEMATICAL SANS-SERIF BOLD CAPITAL NU → LATIN CAPITAL LETTER N     # →Ν→
+1D79C ;        004E ;  SA      # ( 𝞜 → N ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU → LATIN CAPITAL LETTER N      # →Ν→
+
+0272 ; 0146 ;  SA      # ( ɲ → ņ ) LATIN SMALL LETTER N WITH LEFT HOOK → LATIN SMALL LETTER N WITH CEDILLA       # 
+
+0273 ; 006E 0328 ;     SA      # ( ɳ → n̨ ) LATIN SMALL LETTER N WITH RETROFLEX HOOK → LATIN SMALL LETTER N, COMBINING OGONEK    # →n̢→
+
+019E ; 006E 0329 ;     SA      # ( ƞ → n̩ ) LATIN SMALL LETTER N WITH LONG RIGHT LEG → LATIN SMALL LETTER N, COMBINING VERTICAL LINE BELOW       # 
+1D6C8 ;        006E 0329 ;     SA      # ( 𝛈 → n̩ ) MATHEMATICAL BOLD SMALL ETA → LATIN SMALL LETTER N, COMBINING VERTICAL LINE BELOW  # →η→→ƞ→
+1D702 ;        006E 0329 ;     SA      # ( 𝜂 → n̩ ) MATHEMATICAL ITALIC SMALL ETA → LATIN SMALL LETTER N, COMBINING VERTICAL LINE BELOW        # →η→→ƞ→
+1D73C ;        006E 0329 ;     SA      # ( 𝜼 → n̩ ) MATHEMATICAL BOLD ITALIC SMALL ETA → LATIN SMALL LETTER N, COMBINING VERTICAL LINE BELOW   # →η→→ƞ→
+1D776 ;        006E 0329 ;     SA      # ( 𝝶 → n̩ ) MATHEMATICAL SANS-SERIF BOLD SMALL ETA → LATIN SMALL LETTER N, COMBINING VERTICAL LINE BELOW       # →η→→ƞ→
+1D7B0 ;        006E 0329 ;     SA      # ( 𝞰 → n̩ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA → LATIN SMALL LETTER N, COMBINING VERTICAL LINE BELOW        # →η→→ƞ→
+
+019D ; 004E 0326 ;     SA      # ( Ɲ → N̦ ) LATIN CAPITAL LETTER N WITH LEFT HOOK → LATIN CAPITAL LETTER N, COMBINING COMMA BELOW        # →N̡→
+
+01CC ; 006E 006A ;     SA      # ( nj → nj ) LATIN SMALL LETTER NJ → LATIN SMALL LETTER N, LATIN SMALL LETTER J    # 
+
+01CB ; 004E 006A ;     SA      # ( Nj → Nj ) LATIN CAPITAL LETTER N WITH SMALL LETTER J → LATIN CAPITAL LETTER N, LATIN SMALL LETTER J     # 
+
+01CA ; 004E 004A ;     SA      # ( NJ → NJ ) LATIN CAPITAL LETTER NJ → LATIN CAPITAL LETTER N, LATIN CAPITAL LETTER J      # 
+
+2116 ; 004E 006F ;     SA      #* ( № → No ) NUMERO SIGN → LATIN CAPITAL LETTER N, LATIN SMALL LETTER O  # 
+
+0665 ; 006F ;  SA      # ( ‎٥‎ → o ) ARABIC-INDIC DIGIT FIVE → LATIN SMALL LETTER O   # 
+FF4F ; 006F ;  SA      # ( o → o ) FULLWIDTH LATIN SMALL LETTER O → LATIN SMALL LETTER O # →ο→
+2134 ; 006F ;  SA      # ( ℴ → o ) SCRIPT SMALL O → LATIN SMALL LETTER O # 
+1D428 ;        006F ;  SA      # ( 𝐨 → o ) MATHEMATICAL BOLD SMALL O → LATIN SMALL LETTER O     # 
+1D45C ;        006F ;  SA      # ( 𝑜 → o ) MATHEMATICAL ITALIC SMALL O → LATIN SMALL LETTER O   # 
+1D490 ;        006F ;  SA      # ( 𝒐 → o ) MATHEMATICAL BOLD ITALIC SMALL O → LATIN SMALL LETTER O      # 
+1D4F8 ;        006F ;  SA      # ( 𝓸 → o ) MATHEMATICAL BOLD SCRIPT SMALL O → LATIN SMALL LETTER O      # 
+1D52C ;        006F ;  SA      # ( 𝔬 → o ) MATHEMATICAL FRAKTUR SMALL O → LATIN SMALL LETTER O  # 
+1D560 ;        006F ;  SA      # ( 𝕠 → o ) MATHEMATICAL DOUBLE-STRUCK SMALL O → LATIN SMALL LETTER O    # 
+1D594 ;        006F ;  SA      # ( 𝖔 → o ) MATHEMATICAL BOLD FRAKTUR SMALL O → LATIN SMALL LETTER O     # 
+1D5C8 ;        006F ;  SA      # ( 𝗈 → o ) MATHEMATICAL SANS-SERIF SMALL O → LATIN SMALL LETTER O       # 
+1D5FC ;        006F ;  SA      # ( 𝗼 → o ) MATHEMATICAL SANS-SERIF BOLD SMALL O → LATIN SMALL LETTER O  # 
+1D630 ;        006F ;  SA      # ( 𝘰 → o ) MATHEMATICAL SANS-SERIF ITALIC SMALL O → LATIN SMALL LETTER O        # 
+1D664 ;        006F ;  SA      # ( 𝙤 → o ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O → LATIN SMALL LETTER O   # 
+1D698 ;        006F ;  SA      # ( 𝚘 → o ) MATHEMATICAL MONOSPACE SMALL O → LATIN SMALL LETTER O        # 
+1D0F ; 006F ;  SA      # ( ᴏ → o ) LATIN LETTER SMALL CAPITAL O → LATIN SMALL LETTER O   # 
+1D11 ; 006F ;  SA      # ( ᴑ → o ) LATIN SMALL LETTER SIDEWAYS O → LATIN SMALL LETTER O  # 
+1D6D0 ;        006F ;  SA      # ( 𝛐 → o ) MATHEMATICAL BOLD SMALL OMICRON → LATIN SMALL LETTER O       # →ο→
+1D70A ;        006F ;  SA      # ( 𝜊 → o ) MATHEMATICAL ITALIC SMALL OMICRON → LATIN SMALL LETTER O     # →ο→
+1D744 ;        006F ;  SA      # ( 𝝄 → o ) MATHEMATICAL BOLD ITALIC SMALL OMICRON → LATIN SMALL LETTER O        # →ο→
+1D77E ;        006F ;  SA      # ( 𝝾 → o ) MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON → LATIN SMALL LETTER O    # →ο→
+1D7B8 ;        006F ;  SA      # ( 𝞸 → o ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON → LATIN SMALL LETTER O     # →ο→
+1D6D4 ;        006F ;  SA      # ( 𝛔 → o ) MATHEMATICAL BOLD SMALL SIGMA → LATIN SMALL LETTER O # →σ→
+1D70E ;        006F ;  SA      # ( 𝜎 → o ) MATHEMATICAL ITALIC SMALL SIGMA → LATIN SMALL LETTER O       # →σ→
+1D748 ;        006F ;  SA      # ( 𝝈 → o ) MATHEMATICAL BOLD ITALIC SMALL SIGMA → LATIN SMALL LETTER O  # →σ→
+1D782 ;        006F ;  SA      # ( 𝞂 → o ) MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA → LATIN SMALL LETTER O      # →σ→
+1D7BC ;        006F ;  SA      # ( 𝞼 → o ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA → LATIN SMALL LETTER O       # →σ→
+
+0030 ; 004F ;  SA      # ( 0 → O ) DIGIT ZERO → LATIN CAPITAL LETTER O     # 
+1D7CE ;        004F ;  SA      # ( 𝟎 → O ) MATHEMATICAL BOLD DIGIT ZERO → LATIN CAPITAL LETTER O        # →0→
+1D7D8 ;        004F ;  SA      # ( 𝟘 → O ) MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO → LATIN CAPITAL LETTER O       # →0→
+1D7E2 ;        004F ;  SA      # ( 𝟢 → O ) MATHEMATICAL SANS-SERIF DIGIT ZERO → LATIN CAPITAL LETTER O  # →0→
+1D7EC ;        004F ;  SA      # ( 𝟬 → O ) MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO → LATIN CAPITAL LETTER O     # →0→
+1D7F6 ;        004F ;  SA      # ( 𝟶 → O ) MATHEMATICAL MONOSPACE DIGIT ZERO → LATIN CAPITAL LETTER O   # →0→
+FF2F ; 004F ;  SA      # ( O → O ) FULLWIDTH LATIN CAPITAL LETTER O → LATIN CAPITAL LETTER O     # →Ο→
+1D40E ;        004F ;  SA      # ( 𝐎 → O ) MATHEMATICAL BOLD CAPITAL O → LATIN CAPITAL LETTER O # 
+1D442 ;        004F ;  SA      # ( 𝑂 → O ) MATHEMATICAL ITALIC CAPITAL O → LATIN CAPITAL LETTER O       # 
+1D476 ;        004F ;  SA      # ( 𝑶 → O ) MATHEMATICAL BOLD ITALIC CAPITAL O → LATIN CAPITAL LETTER O  # 
+1D4AA ;        004F ;  SA      # ( 𝒪 → O ) MATHEMATICAL SCRIPT CAPITAL O → LATIN CAPITAL LETTER O       # 
+1D4DE ;        004F ;  SA      # ( 𝓞 → O ) MATHEMATICAL BOLD SCRIPT CAPITAL O → LATIN CAPITAL LETTER O  # 
+1D512 ;        004F ;  SA      # ( 𝔒 → O ) MATHEMATICAL FRAKTUR CAPITAL O → LATIN CAPITAL LETTER O      # 
+1D546 ;        004F ;  SA      # ( 𝕆 → O ) MATHEMATICAL DOUBLE-STRUCK CAPITAL O → LATIN CAPITAL LETTER O        # 
+1D57A ;        004F ;  SA      # ( 𝕺 → O ) MATHEMATICAL BOLD FRAKTUR CAPITAL O → LATIN CAPITAL LETTER O # 
+1D5AE ;        004F ;  SA      # ( 𝖮 → O ) MATHEMATICAL SANS-SERIF CAPITAL O → LATIN CAPITAL LETTER O   # 
+1D5E2 ;        004F ;  SA      # ( 𝗢 → O ) MATHEMATICAL SANS-SERIF BOLD CAPITAL O → LATIN CAPITAL LETTER O      # 
+1D616 ;        004F ;  SA      # ( 𝘖 → O ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL O → LATIN CAPITAL LETTER O    # 
+1D64A ;        004F ;  SA      # ( 𝙊 → O ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O → LATIN CAPITAL LETTER O       # 
+1D67E ;        004F ;  SA      # ( 𝙾 → O ) MATHEMATICAL MONOSPACE CAPITAL O → LATIN CAPITAL LETTER O    # 
+1D6B6 ;        004F ;  SA      # ( 𝚶 → O ) MATHEMATICAL BOLD CAPITAL OMICRON → LATIN CAPITAL LETTER O   # →Ο→
+1D6F0 ;        004F ;  SA      # ( 𝛰 → O ) MATHEMATICAL ITALIC CAPITAL OMICRON → LATIN CAPITAL LETTER O # →Ο→
+1D72A ;        004F ;  SA      # ( 𝜪 → O ) MATHEMATICAL BOLD ITALIC CAPITAL OMICRON → LATIN CAPITAL LETTER O    # →Ο→
+1D764 ;        004F ;  SA      # ( 𝝤 → O ) MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON → LATIN CAPITAL LETTER O        # →Ο→
+1D79E ;        004F ;  SA      # ( 𝞞 → O ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON → LATIN CAPITAL LETTER O # →Ο→
+
+2070 ; 00BA ;  SA      #* ( ⁰ → º ) SUPERSCRIPT ZERO → MASCULINE ORDINAL INDICATOR      # 
+1D52 ; 00BA ;  SA      # ( ᵒ → º ) MODIFIER LETTER SMALL O → MASCULINE ORDINAL INDICATOR        # →⁰→
+
+01D2 ; 014F ;  SA      # ( ǒ → ŏ ) LATIN SMALL LETTER O WITH CARON → LATIN SMALL LETTER O WITH BREVE     # 
+
+01D1 ; 014E ;  SA      # ( Ǒ → Ŏ ) LATIN CAPITAL LETTER O WITH CARON → LATIN CAPITAL LETTER O WITH BREVE # 
+
+0150 ; 00D6 ;  SA      # ( Ő → Ö ) LATIN CAPITAL LETTER O WITH DOUBLE ACUTE → LATIN CAPITAL LETTER O WITH DIAERESIS      # 
+
+00F8 ; 006F 0338 ;     SA      # ( ø → o̸ ) LATIN SMALL LETTER O WITH STROKE → LATIN SMALL LETTER O, COMBINING LONG SOLIDUS OVERLAY      # →o̷→
+
+00D8 ; 004F 0338 ;     SA      # ( Ø → O̸ ) LATIN CAPITAL LETTER O WITH STROKE → LATIN CAPITAL LETTER O, COMBINING LONG SOLIDUS OVERLAY  # 
+
+01FE ; 004F 0338 0301 ;        SA      # ( Ǿ → Ó̸ ) LATIN CAPITAL LETTER O WITH STROKE AND ACUTE → LATIN CAPITAL LETTER O, COMBINING LONG SOLIDUS OVERLAY, COMBINING ACUTE ACCENT      # 
+
+0275 ; 006F 0335 ;     SA      # ( ɵ → o̵ ) LATIN SMALL LETTER BARRED O → LATIN SMALL LETTER O, COMBINING SHORT STROKE OVERLAY   # 
+
+2296 ; 004F 0335 ;     SA      #* ( ⊖ → O̵ ) CIRCLED MINUS → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY     # →Θ→→Ɵ→→O̶→
+229D ; 004F 0335 ;     SA      #* ( ⊝ → O̵ ) CIRCLED DASH → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY      # →⊖→→Θ→→Ɵ→→O̶→
+236C ; 004F 0335 ;     SA      #* ( ⍬ → O̵ ) APL FUNCTIONAL SYMBOL ZILDE → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY       # →θ→→⊖→→Θ→→Ɵ→→O̶→
+019F ; 004F 0335 ;     SA      # ( Ɵ → O̵ ) LATIN CAPITAL LETTER O WITH MIDDLE TILDE → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY    # →O̶→
+1D6C9 ;        004F 0335 ;     SA      # ( 𝛉 → O̵ ) MATHEMATICAL BOLD SMALL THETA → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY     # →θ→→⊖→→Θ→→Ɵ→→O̶→
+1D6DD ;        004F 0335 ;     SA      # ( 𝛝 → O̵ ) MATHEMATICAL BOLD THETA SYMBOL → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY    # →θ→→⊖→→Θ→→Ɵ→→O̶→
+1D703 ;        004F 0335 ;     SA      # ( 𝜃 → O̵ ) MATHEMATICAL ITALIC SMALL THETA → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY   # →θ→→⊖→→Θ→→Ɵ→→O̶→
+1D717 ;        004F 0335 ;     SA      # ( 𝜗 → O̵ ) MATHEMATICAL ITALIC THETA SYMBOL → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY  # →θ→→⊖→→Θ→→Ɵ→→O̶→
+1D73D ;        004F 0335 ;     SA      # ( 𝜽 → O̵ ) MATHEMATICAL BOLD ITALIC SMALL THETA → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY      # →θ→→⊖→→Θ→→Ɵ→→O̶→
+1D751 ;        004F 0335 ;     SA      # ( 𝝑 → O̵ ) MATHEMATICAL BOLD ITALIC THETA SYMBOL → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY     # →θ→→⊖→→Θ→→Ɵ→→O̶→
+1D777 ;        004F 0335 ;     SA      # ( 𝝷 → O̵ ) MATHEMATICAL SANS-SERIF BOLD SMALL THETA → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY  # →θ→→⊖→→Θ→→Ɵ→→O̶→
+1D78B ;        004F 0335 ;     SA      # ( 𝞋 → O̵ ) MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # →θ→→⊖→→Θ→→Ɵ→→O̶→
+1D7B1 ;        004F 0335 ;     SA      # ( 𝞱 → O̵ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY   # →θ→→⊖→→Θ→→Ɵ→→O̶→
+1D7C5 ;        004F 0335 ;     SA      # ( 𝟅 → O̵ ) MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY  # →θ→→⊖→→Θ→→Ɵ→→O̶→
+1D6AF ;        004F 0335 ;     SA      # ( 𝚯 → O̵ ) MATHEMATICAL BOLD CAPITAL THETA → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY   # →Θ→→Ɵ→→O̶→
+1D6B9 ;        004F 0335 ;     SA      # ( 𝚹 → O̵ ) MATHEMATICAL BOLD CAPITAL THETA SYMBOL → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY    # →Θ→→Ɵ→→O̶→
+1D6E9 ;        004F 0335 ;     SA      # ( 𝛩 → O̵ ) MATHEMATICAL ITALIC CAPITAL THETA → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # →Θ→→Ɵ→→O̶→
+1D6F3 ;        004F 0335 ;     SA      # ( 𝛳 → O̵ ) MATHEMATICAL ITALIC CAPITAL THETA SYMBOL → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY  # →Θ→→Ɵ→→O̶→
+1D723 ;        004F 0335 ;     SA      # ( 𝜣 → O̵ ) MATHEMATICAL BOLD ITALIC CAPITAL THETA → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY    # →Θ→→Ɵ→→O̶→
+1D72D ;        004F 0335 ;     SA      # ( 𝜭 → O̵ ) MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY     # →Θ→→Ɵ→→O̶→
+1D75D ;        004F 0335 ;     SA      # ( 𝝝 → O̵ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY        # →Θ→→Ɵ→→O̶→
+1D767 ;        004F 0335 ;     SA      # ( 𝝧 → O̵ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # →Θ→→Ɵ→→O̶→
+1D797 ;        004F 0335 ;     SA      # ( 𝞗 → O̵ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # →Θ→→Ɵ→→O̶→
+1D7A1 ;        004F 0335 ;     SA      # ( 𝞡 → O̵ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY  # →Θ→→Ɵ→→O̶→
+
+1F101 ;        004F 002C ;     SA      #* ( 🄁 → O, ) DIGIT ZERO COMMA → LATIN CAPITAL LETTER O, COMMA   # →0,→
+
+1F100 ;        004F 002E ;     SA      #* ( 🄀 → O. ) DIGIT ZERO FULL STOP → LATIN CAPITAL LETTER O, FULL STOP   # →0.→
+
+01A1 ; 006F 0027 ;     SA      # ( ơ → o' ) LATIN SMALL LETTER O WITH HORN → LATIN SMALL LETTER O, APOSTROPHE     # →oʼ→
+
+01A0 ; 004F 0027 ;     SA      # ( Ơ → O' ) LATIN CAPITAL LETTER O WITH HORN → LATIN CAPITAL LETTER O, APOSTROPHE # →Oʼ→
+
+0025 ; 00BA 002F 2080 2080 ;   SA      #* ( % → º/₀₀ ) PERCENT SIGN → MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO    # →‰→→⁰/₀₀→
+2030 ; 00BA 002F 2080 2080 ;   SA      #* ( ‰ → º/₀₀ ) PER MILLE SIGN → MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO        # →⁰/₀₀→
+2052 ; 00BA 002F 2080 2080 ;   SA      #* ( ⁒ → º/₀₀ ) COMMERCIAL MINUS SIGN → MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO # →%→→‰→→⁰/₀₀→
+2100 ; 00BA 002F 2080 2080 ;   SA      #* ( ℀ → º/₀₀ ) ACCOUNT OF → MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO    # →%→→‰→→⁰/₀₀→
+2101 ; 00BA 002F 2080 2080 ;   SA      #* ( ℁ → º/₀₀ ) ADDRESSED TO THE SUBJECT → MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO      # →%→→‰→→⁰/₀₀→
+2105 ; 00BA 002F 2080 2080 ;   SA      #* ( ℅ → º/₀₀ ) CARE OF → MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO       # →%→→‰→→⁰/₀₀→
+2106 ; 00BA 002F 2080 2080 ;   SA      #* ( ℆ → º/₀₀ ) CADA UNA → MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO      # →%→→‰→→⁰/₀₀→
+
+2031 ; 00BA 002F 2080 2080 2080 ;      SA      #* ( ‱ → º/₀₀₀ ) PER TEN THOUSAND SIGN → MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO, SUBSCRIPT ZERO      # →⁰/₀₀₀→
+
+0153 ; 006F 0065 ;     SA      # ( œ → oe ) LATIN SMALL LIGATURE OE → LATIN SMALL LETTER O, LATIN SMALL LETTER E  # 
+
+0152 ; 004F 0045 ;     SA      # ( Œ → OE ) LATIN CAPITAL LIGATURE OE → LATIN CAPITAL LETTER O, LATIN CAPITAL LETTER E    # 
+
+0276 ; 006F 1D07 ;     SA      # ( ɶ → oᴇ ) LATIN LETTER SMALL CAPITAL OE → LATIN SMALL LETTER O, LATIN LETTER SMALL CAPITAL E  # 
+
+A74F ; 006F 006F ;     SA      # ( ꝏ → oo ) LATIN SMALL LETTER OO → LATIN SMALL LETTER O, LATIN SMALL LETTER O   # 
+
+A74E ; 004F 004F ;     SA      # ( Ꝏ → OO ) LATIN CAPITAL LETTER OO → LATIN CAPITAL LETTER O, LATIN CAPITAL LETTER O     # 
+
+2184 ; 0254 ;  SA      # ( ↄ → ɔ ) LATIN SMALL LETTER REVERSED C → LATIN SMALL LETTER OPEN O    # 
+1D10 ; 0254 ;  SA      # ( ᴐ → ɔ ) LATIN LETTER SMALL CAPITAL OPEN O → LATIN SMALL LETTER OPEN O        # 
+
+2183 ; 0186 ;  SA      # ( Ↄ → Ɔ ) ROMAN NUMERAL REVERSED ONE HUNDRED → LATIN CAPITAL LETTER OPEN O     # 
+
+2374 ; 0070 ;  SA      #* ( ⍴ → p ) APL FUNCTIONAL SYMBOL RHO → LATIN SMALL LETTER P     # →ρ→
+FF50 ; 0070 ;  SA      # ( p → p ) FULLWIDTH LATIN SMALL LETTER P → LATIN SMALL LETTER P # →р→
+1D429 ;        0070 ;  SA      # ( 𝐩 → p ) MATHEMATICAL BOLD SMALL P → LATIN SMALL LETTER P     # 
+1D45D ;        0070 ;  SA      # ( 𝑝 → p ) MATHEMATICAL ITALIC SMALL P → LATIN SMALL LETTER P   # 
+1D491 ;        0070 ;  SA      # ( 𝒑 → p ) MATHEMATICAL BOLD ITALIC SMALL P → LATIN SMALL LETTER P      # 
+1D4C5 ;        0070 ;  SA      # ( 𝓅 → p ) MATHEMATICAL SCRIPT SMALL P → LATIN SMALL LETTER P   # 
+1D4F9 ;        0070 ;  SA      # ( 𝓹 → p ) MATHEMATICAL BOLD SCRIPT SMALL P → LATIN SMALL LETTER P      # 
+1D52D ;        0070 ;  SA      # ( 𝔭 → p ) MATHEMATICAL FRAKTUR SMALL P → LATIN SMALL LETTER P  # 
+1D561 ;        0070 ;  SA      # ( 𝕡 → p ) MATHEMATICAL DOUBLE-STRUCK SMALL P → LATIN SMALL LETTER P    # 
+1D595 ;        0070 ;  SA      # ( 𝖕 → p ) MATHEMATICAL BOLD FRAKTUR SMALL P → LATIN SMALL LETTER P     # 
+1D5C9 ;        0070 ;  SA      # ( 𝗉 → p ) MATHEMATICAL SANS-SERIF SMALL P → LATIN SMALL LETTER P       # 
+1D5FD ;        0070 ;  SA      # ( 𝗽 → p ) MATHEMATICAL SANS-SERIF BOLD SMALL P → LATIN SMALL LETTER P  # 
+1D631 ;        0070 ;  SA      # ( 𝘱 → p ) MATHEMATICAL SANS-SERIF ITALIC SMALL P → LATIN SMALL LETTER P        # 
+1D665 ;        0070 ;  SA      # ( 𝙥 → p ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P → LATIN SMALL LETTER P   # 
+1D699 ;        0070 ;  SA      # ( 𝚙 → p ) MATHEMATICAL MONOSPACE SMALL P → LATIN SMALL LETTER P        # 
+1D6D2 ;        0070 ;  SA      # ( 𝛒 → p ) MATHEMATICAL BOLD SMALL RHO → LATIN SMALL LETTER P   # →ρ→
+1D6E0 ;        0070 ;  SA      # ( 𝛠 → p ) MATHEMATICAL BOLD RHO SYMBOL → LATIN SMALL LETTER P  # →ρ→
+1D70C ;        0070 ;  SA      # ( 𝜌 → p ) MATHEMATICAL ITALIC SMALL RHO → LATIN SMALL LETTER P # →ρ→
+1D71A ;        0070 ;  SA      # ( 𝜚 → p ) MATHEMATICAL ITALIC RHO SYMBOL → LATIN SMALL LETTER P        # →ρ→
+1D746 ;        0070 ;  SA      # ( 𝝆 → p ) MATHEMATICAL BOLD ITALIC SMALL RHO → LATIN SMALL LETTER P    # →ρ→
+1D754 ;        0070 ;  SA      # ( 𝝔 → p ) MATHEMATICAL BOLD ITALIC RHO SYMBOL → LATIN SMALL LETTER P   # →ρ→
+1D780 ;        0070 ;  SA      # ( 𝞀 → p ) MATHEMATICAL SANS-SERIF BOLD SMALL RHO → LATIN SMALL LETTER P        # →ρ→
+1D78E ;        0070 ;  SA      # ( 𝞎 → p ) MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL → LATIN SMALL LETTER P       # →ρ→
+1D7BA ;        0070 ;  SA      # ( 𝞺 → p ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO → LATIN SMALL LETTER P # →ρ→
+1D7C8 ;        0070 ;  SA      # ( 𝟈 → p ) MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL → LATIN SMALL LETTER P        # →ρ→
+
+FF30 ; 0050 ;  SA      # ( P → P ) FULLWIDTH LATIN CAPITAL LETTER P → LATIN CAPITAL LETTER P     # →Р→
+2119 ; 0050 ;  SA      # ( ℙ → P ) DOUBLE-STRUCK CAPITAL P → LATIN CAPITAL LETTER P      # 
+1D40F ;        0050 ;  SA      # ( 𝐏 → P ) MATHEMATICAL BOLD CAPITAL P → LATIN CAPITAL LETTER P # 
+1D443 ;        0050 ;  SA      # ( 𝑃 → P ) MATHEMATICAL ITALIC CAPITAL P → LATIN CAPITAL LETTER P       # 
+1D477 ;        0050 ;  SA      # ( 𝑷 → P ) MATHEMATICAL BOLD ITALIC CAPITAL P → LATIN CAPITAL LETTER P  # 
+1D4AB ;        0050 ;  SA      # ( 𝒫 → P ) MATHEMATICAL SCRIPT CAPITAL P → LATIN CAPITAL LETTER P       # 
+1D4DF ;        0050 ;  SA      # ( 𝓟 → P ) MATHEMATICAL BOLD SCRIPT CAPITAL P → LATIN CAPITAL LETTER P  # 
+1D513 ;        0050 ;  SA      # ( 𝔓 → P ) MATHEMATICAL FRAKTUR CAPITAL P → LATIN CAPITAL LETTER P      # 
+1D57B ;        0050 ;  SA      # ( 𝕻 → P ) MATHEMATICAL BOLD FRAKTUR CAPITAL P → LATIN CAPITAL LETTER P # 
+1D5AF ;        0050 ;  SA      # ( 𝖯 → P ) MATHEMATICAL SANS-SERIF CAPITAL P → LATIN CAPITAL LETTER P   # 
+1D5E3 ;        0050 ;  SA      # ( 𝗣 → P ) MATHEMATICAL SANS-SERIF BOLD CAPITAL P → LATIN CAPITAL LETTER P      # 
+1D617 ;        0050 ;  SA      # ( 𝘗 → P ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL P → LATIN CAPITAL LETTER P    # 
+1D64B ;        0050 ;  SA      # ( 𝙋 → P ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P → LATIN CAPITAL LETTER P       # 
+1D67F ;        0050 ;  SA      # ( 𝙿 → P ) MATHEMATICAL MONOSPACE CAPITAL P → LATIN CAPITAL LETTER P    # 
+1D6B8 ;        0050 ;  SA      # ( 𝚸 → P ) MATHEMATICAL BOLD CAPITAL RHO → LATIN CAPITAL LETTER P       # →𝐏→
+1D6F2 ;        0050 ;  SA      # ( 𝛲 → P ) MATHEMATICAL ITALIC CAPITAL RHO → LATIN CAPITAL LETTER P     # →𝑃→
+1D72C ;        0050 ;  SA      # ( 𝜬 → P ) MATHEMATICAL BOLD ITALIC CAPITAL RHO → LATIN CAPITAL LETTER P        # →𝑷→
+1D766 ;        0050 ;  SA      # ( 𝝦 → P ) MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO → LATIN CAPITAL LETTER P    # →Ρ→
+1D7A0 ;        0050 ;  SA      # ( 𝞠 → P ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO → LATIN CAPITAL LETTER P     # →Ρ→
+
+01A5 ; 0070 0314 ;     SA      # ( ƥ → p̔ ) LATIN SMALL LETTER P WITH HOOK → LATIN SMALL LETTER P, COMBINING REVERSED COMMA ABOVE        # 
+
+1D6D7 ;        0278 ;  SA      # ( 𝛗 → ɸ ) MATHEMATICAL BOLD SMALL PHI → LATIN SMALL LETTER PHI        # →φ→
+1D6DF ;        0278 ;  SA      # ( 𝛟 → ɸ ) MATHEMATICAL BOLD PHI SYMBOL → LATIN SMALL LETTER PHI       # →φ→
+1D711 ;        0278 ;  SA      # ( 𝜑 → ɸ ) MATHEMATICAL ITALIC SMALL PHI → LATIN SMALL LETTER PHI      # →φ→
+1D719 ;        0278 ;  SA      # ( 𝜙 → ɸ ) MATHEMATICAL ITALIC PHI SYMBOL → LATIN SMALL LETTER PHI     # →φ→
+1D74B ;        0278 ;  SA      # ( 𝝋 → ɸ ) MATHEMATICAL BOLD ITALIC SMALL PHI → LATIN SMALL LETTER PHI # →φ→
+1D753 ;        0278 ;  SA      # ( 𝝓 → ɸ ) MATHEMATICAL BOLD ITALIC PHI SYMBOL → LATIN SMALL LETTER PHI        # →φ→
+1D785 ;        0278 ;  SA      # ( 𝞅 → ɸ ) MATHEMATICAL SANS-SERIF BOLD SMALL PHI → LATIN SMALL LETTER PHI     # →φ→
+1D78D ;        0278 ;  SA      # ( 𝞍 → ɸ ) MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL → LATIN SMALL LETTER PHI    # →φ→
+1D7BF ;        0278 ;  SA      # ( 𝞿 → ɸ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI → LATIN SMALL LETTER PHI      # →φ→
+1D7C7 ;        0278 ;  SA      # ( 𝟇 → ɸ ) MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL → LATIN SMALL LETTER PHI     # →φ→
+
+1D42A ;        0071 ;  SA      # ( 𝐪 → q ) MATHEMATICAL BOLD SMALL Q → LATIN SMALL LETTER Q     # 
+1D45E ;        0071 ;  SA      # ( 𝑞 → q ) MATHEMATICAL ITALIC SMALL Q → LATIN SMALL LETTER Q   # 
+1D492 ;        0071 ;  SA      # ( 𝒒 → q ) MATHEMATICAL BOLD ITALIC SMALL Q → LATIN SMALL LETTER Q      # 
+1D4C6 ;        0071 ;  SA      # ( 𝓆 → q ) MATHEMATICAL SCRIPT SMALL Q → LATIN SMALL LETTER Q   # 
+1D4FA ;        0071 ;  SA      # ( 𝓺 → q ) MATHEMATICAL BOLD SCRIPT SMALL Q → LATIN SMALL LETTER Q      # 
+1D52E ;        0071 ;  SA      # ( 𝔮 → q ) MATHEMATICAL FRAKTUR SMALL Q → LATIN SMALL LETTER Q  # 
+1D562 ;        0071 ;  SA      # ( 𝕢 → q ) MATHEMATICAL DOUBLE-STRUCK SMALL Q → LATIN SMALL LETTER Q    # 
+1D596 ;        0071 ;  SA      # ( 𝖖 → q ) MATHEMATICAL BOLD FRAKTUR SMALL Q → LATIN SMALL LETTER Q     # 
+1D5CA ;        0071 ;  SA      # ( 𝗊 → q ) MATHEMATICAL SANS-SERIF SMALL Q → LATIN SMALL LETTER Q       # 
+1D5FE ;        0071 ;  SA      # ( 𝗾 → q ) MATHEMATICAL SANS-SERIF BOLD SMALL Q → LATIN SMALL LETTER Q  # 
+1D632 ;        0071 ;  SA      # ( 𝘲 → q ) MATHEMATICAL SANS-SERIF ITALIC SMALL Q → LATIN SMALL LETTER Q        # 
+1D666 ;        0071 ;  SA      # ( 𝙦 → q ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q → LATIN SMALL LETTER Q   # 
+1D69A ;        0071 ;  SA      # ( 𝚚 → q ) MATHEMATICAL MONOSPACE SMALL Q → LATIN SMALL LETTER Q        # 
+
+211A ; 0051 ;  SA      # ( ℚ → Q ) DOUBLE-STRUCK CAPITAL Q → LATIN CAPITAL LETTER Q      # 
+1D410 ;        0051 ;  SA      # ( 𝐐 → Q ) MATHEMATICAL BOLD CAPITAL Q → LATIN CAPITAL LETTER Q # 
+1D444 ;        0051 ;  SA      # ( 𝑄 → Q ) MATHEMATICAL ITALIC CAPITAL Q → LATIN CAPITAL LETTER Q       # 
+1D478 ;        0051 ;  SA      # ( 𝑸 → Q ) MATHEMATICAL BOLD ITALIC CAPITAL Q → LATIN CAPITAL LETTER Q  # 
+1D4AC ;        0051 ;  SA      # ( 𝒬 → Q ) MATHEMATICAL SCRIPT CAPITAL Q → LATIN CAPITAL LETTER Q       # 
+1D4E0 ;        0051 ;  SA      # ( 𝓠 → Q ) MATHEMATICAL BOLD SCRIPT CAPITAL Q → LATIN CAPITAL LETTER Q  # 
+1D514 ;        0051 ;  SA      # ( 𝔔 → Q ) MATHEMATICAL FRAKTUR CAPITAL Q → LATIN CAPITAL LETTER Q      # 
+1D57C ;        0051 ;  SA      # ( 𝕼 → Q ) MATHEMATICAL BOLD FRAKTUR CAPITAL Q → LATIN CAPITAL LETTER Q # 
+1D5B0 ;        0051 ;  SA      # ( 𝖰 → Q ) MATHEMATICAL SANS-SERIF CAPITAL Q → LATIN CAPITAL LETTER Q   # 
+1D5E4 ;        0051 ;  SA      # ( 𝗤 → Q ) MATHEMATICAL SANS-SERIF BOLD CAPITAL Q → LATIN CAPITAL LETTER Q      # 
+1D618 ;        0051 ;  SA      # ( 𝘘 → Q ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q → LATIN CAPITAL LETTER Q    # 
+1D64C ;        0051 ;  SA      # ( 𝙌 → Q ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q → LATIN CAPITAL LETTER Q       # 
+1D680 ;        0051 ;  SA      # ( 𝚀 → Q ) MATHEMATICAL MONOSPACE CAPITAL Q → LATIN CAPITAL LETTER Q    # 
+
+02A0 ; 0071 0314 ;     SA      # ( ʠ → q̔ ) LATIN SMALL LETTER Q WITH HOOK → LATIN SMALL LETTER Q, COMBINING REVERSED COMMA ABOVE        # 
+
+1D42B ;        0072 ;  SA      # ( 𝐫 → r ) MATHEMATICAL BOLD SMALL R → LATIN SMALL LETTER R     # 
+1D45F ;        0072 ;  SA      # ( 𝑟 → r ) MATHEMATICAL ITALIC SMALL R → LATIN SMALL LETTER R   # 
+1D493 ;        0072 ;  SA      # ( 𝒓 → r ) MATHEMATICAL BOLD ITALIC SMALL R → LATIN SMALL LETTER R      # 
+1D4C7 ;        0072 ;  SA      # ( 𝓇 → r ) MATHEMATICAL SCRIPT SMALL R → LATIN SMALL LETTER R   # 
+1D4FB ;        0072 ;  SA      # ( 𝓻 → r ) MATHEMATICAL BOLD SCRIPT SMALL R → LATIN SMALL LETTER R      # 
+1D52F ;        0072 ;  SA      # ( 𝔯 → r ) MATHEMATICAL FRAKTUR SMALL R → LATIN SMALL LETTER R  # 
+1D563 ;        0072 ;  SA      # ( 𝕣 → r ) MATHEMATICAL DOUBLE-STRUCK SMALL R → LATIN SMALL LETTER R    # 
+1D597 ;        0072 ;  SA      # ( 𝖗 → r ) MATHEMATICAL BOLD FRAKTUR SMALL R → LATIN SMALL LETTER R     # 
+1D5CB ;        0072 ;  SA      # ( 𝗋 → r ) MATHEMATICAL SANS-SERIF SMALL R → LATIN SMALL LETTER R       # 
+1D5FF ;        0072 ;  SA      # ( 𝗿 → r ) MATHEMATICAL SANS-SERIF BOLD SMALL R → LATIN SMALL LETTER R  # 
+1D633 ;        0072 ;  SA      # ( 𝘳 → r ) MATHEMATICAL SANS-SERIF ITALIC SMALL R → LATIN SMALL LETTER R        # 
+1D667 ;        0072 ;  SA      # ( 𝙧 → r ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R → LATIN SMALL LETTER R   # 
+1D69B ;        0072 ;  SA      # ( 𝚛 → r ) MATHEMATICAL MONOSPACE SMALL R → LATIN SMALL LETTER R        # 
+
+211B ; 0052 ;  SA      # ( ℛ → R ) SCRIPT CAPITAL R → LATIN CAPITAL LETTER R     # 
+211C ; 0052 ;  SA      # ( ℜ → R ) BLACK-LETTER CAPITAL R → LATIN CAPITAL LETTER R       # 
+211D ; 0052 ;  SA      # ( ℝ → R ) DOUBLE-STRUCK CAPITAL R → LATIN CAPITAL LETTER R      # 
+1D411 ;        0052 ;  SA      # ( 𝐑 → R ) MATHEMATICAL BOLD CAPITAL R → LATIN CAPITAL LETTER R # 
+1D445 ;        0052 ;  SA      # ( 𝑅 → R ) MATHEMATICAL ITALIC CAPITAL R → LATIN CAPITAL LETTER R       # 
+1D479 ;        0052 ;  SA      # ( 𝑹 → R ) MATHEMATICAL BOLD ITALIC CAPITAL R → LATIN CAPITAL LETTER R  # 
+1D4E1 ;        0052 ;  SA      # ( 𝓡 → R ) MATHEMATICAL BOLD SCRIPT CAPITAL R → LATIN CAPITAL LETTER R  # 
+1D57D ;        0052 ;  SA      # ( 𝕽 → R ) MATHEMATICAL BOLD FRAKTUR CAPITAL R → LATIN CAPITAL LETTER R # 
+1D5B1 ;        0052 ;  SA      # ( 𝖱 → R ) MATHEMATICAL SANS-SERIF CAPITAL R → LATIN CAPITAL LETTER R   # 
+1D5E5 ;        0052 ;  SA      # ( 𝗥 → R ) MATHEMATICAL SANS-SERIF BOLD CAPITAL R → LATIN CAPITAL LETTER R      # 
+1D619 ;        0052 ;  SA      # ( 𝘙 → R ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL R → LATIN CAPITAL LETTER R    # 
+1D64D ;        0052 ;  SA      # ( 𝙍 → R ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R → LATIN CAPITAL LETTER R       # 
+1D681 ;        0052 ;  SA      # ( 𝚁 → R ) MATHEMATICAL MONOSPACE CAPITAL R → LATIN CAPITAL LETTER R    # 
+01A6 ; 0052 ;  SA      # ( Ʀ → R ) LATIN LETTER YR → LATIN CAPITAL LETTER R       # 
+
+027D ; 0072 0328 ;     SA      # ( ɽ → r̨ ) LATIN SMALL LETTER R WITH TAIL → LATIN SMALL LETTER R, COMBINING OGONEK      # 
+
+027C ; 0072 0329 ;     SA      # ( ɼ → r̩ ) LATIN SMALL LETTER R WITH LONG LEG → LATIN SMALL LETTER R, COMBINING VERTICAL LINE BELOW     # 
+
+006D ; 0072 006E ;     SA      # ( m → rn ) LATIN SMALL LETTER M → LATIN SMALL LETTER R, LATIN SMALL LETTER N      # 
+217F ; 0072 006E ;     SA      # ( ⅿ → rn ) SMALL ROMAN NUMERAL ONE THOUSAND → LATIN SMALL LETTER R, LATIN SMALL LETTER N        # →m→
+1D426 ;        0072 006E ;     SA      # ( 𝐦 → rn ) MATHEMATICAL BOLD SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N      # →m→
+1D45A ;        0072 006E ;     SA      # ( 𝑚 → rn ) MATHEMATICAL ITALIC SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N    # →m→
+1D48E ;        0072 006E ;     SA      # ( 𝒎 → rn ) MATHEMATICAL BOLD ITALIC SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N       # →m→
+1D4C2 ;        0072 006E ;     SA      # ( 𝓂 → rn ) MATHEMATICAL SCRIPT SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N    # →m→
+1D4F6 ;        0072 006E ;     SA      # ( 𝓶 → rn ) MATHEMATICAL BOLD SCRIPT SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N       # →m→
+1D52A ;        0072 006E ;     SA      # ( 𝔪 → rn ) MATHEMATICAL FRAKTUR SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N   # →m→
+1D55E ;        0072 006E ;     SA      # ( 𝕞 → rn ) MATHEMATICAL DOUBLE-STRUCK SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N     # →m→
+1D592 ;        0072 006E ;     SA      # ( 𝖒 → rn ) MATHEMATICAL BOLD FRAKTUR SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N      # →m→
+1D5C6 ;        0072 006E ;     SA      # ( 𝗆 → rn ) MATHEMATICAL SANS-SERIF SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N        # →m→
+1D5FA ;        0072 006E ;     SA      # ( 𝗺 → rn ) MATHEMATICAL SANS-SERIF BOLD SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N   # →m→
+1D62E ;        0072 006E ;     SA      # ( 𝘮 → rn ) MATHEMATICAL SANS-SERIF ITALIC SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N # →m→
+1D662 ;        0072 006E ;     SA      # ( 𝙢 → rn ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N    # →m→
+1D696 ;        0072 006E ;     SA      # ( 𝚖 → rn ) MATHEMATICAL MONOSPACE SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N # →m→
+028D ; 0072 006E ;     SA      # ( ʍ → rn ) LATIN SMALL LETTER TURNED W → LATIN SMALL LETTER R, LATIN SMALL LETTER N      # →m→
+
+0271 ; 0072 006E 0326 ;        SA      # ( ɱ → rn̦ ) LATIN SMALL LETTER M WITH HOOK → LATIN SMALL LETTER R, LATIN SMALL LETTER N, COMBINING COMMA BELOW  # →m̡→
+
+20A8 ; 0052 0073 ;     SA      #* ( ₨ → Rs ) RUPEE SIGN → LATIN CAPITAL LETTER R, LATIN SMALL LETTER S   # 
+
+2129 ; 027F ;  SA      #* ( ℩ → ɿ ) TURNED GREEK SMALL LETTER IOTA → LATIN SMALL LETTER REVERSED R WITH FISHHOOK        # 
+
+FF53 ; 0073 ;  SA      # ( s → s ) FULLWIDTH LATIN SMALL LETTER S → LATIN SMALL LETTER S # →ѕ→
+1D42C ;        0073 ;  SA      # ( 𝐬 → s ) MATHEMATICAL BOLD SMALL S → LATIN SMALL LETTER S     # 
+1D460 ;        0073 ;  SA      # ( 𝑠 → s ) MATHEMATICAL ITALIC SMALL S → LATIN SMALL LETTER S   # 
+1D494 ;        0073 ;  SA      # ( 𝒔 → s ) MATHEMATICAL BOLD ITALIC SMALL S → LATIN SMALL LETTER S      # 
+1D4C8 ;        0073 ;  SA      # ( 𝓈 → s ) MATHEMATICAL SCRIPT SMALL S → LATIN SMALL LETTER S   # 
+1D4FC ;        0073 ;  SA      # ( 𝓼 → s ) MATHEMATICAL BOLD SCRIPT SMALL S → LATIN SMALL LETTER S      # 
+1D530 ;        0073 ;  SA      # ( 𝔰 → s ) MATHEMATICAL FRAKTUR SMALL S → LATIN SMALL LETTER S  # 
+1D564 ;        0073 ;  SA      # ( 𝕤 → s ) MATHEMATICAL DOUBLE-STRUCK SMALL S → LATIN SMALL LETTER S    # 
+1D598 ;        0073 ;  SA      # ( 𝖘 → s ) MATHEMATICAL BOLD FRAKTUR SMALL S → LATIN SMALL LETTER S     # 
+1D5CC ;        0073 ;  SA      # ( 𝗌 → s ) MATHEMATICAL SANS-SERIF SMALL S → LATIN SMALL LETTER S       # 
+1D600 ;        0073 ;  SA      # ( 𝘀 → s ) MATHEMATICAL SANS-SERIF BOLD SMALL S → LATIN SMALL LETTER S  # 
+1D634 ;        0073 ;  SA      # ( 𝘴 → s ) MATHEMATICAL SANS-SERIF ITALIC SMALL S → LATIN SMALL LETTER S        # 
+1D668 ;        0073 ;  SA      # ( 𝙨 → s ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S → LATIN SMALL LETTER S   # 
+1D69C ;        0073 ;  SA      # ( 𝚜 → s ) MATHEMATICAL MONOSPACE SMALL S → LATIN SMALL LETTER S        # 
+A731 ; 0073 ;  SA      # ( ꜱ → s ) LATIN LETTER SMALL CAPITAL S → LATIN SMALL LETTER S   # 
+01BD ; 0073 ;  SA      # ( ƽ → s ) LATIN SMALL LETTER TONE FIVE → LATIN SMALL LETTER S    # 
+
+FF33 ; 0053 ;  SA      # ( S → S ) FULLWIDTH LATIN CAPITAL LETTER S → LATIN CAPITAL LETTER S     # →Ѕ→
+1D412 ;        0053 ;  SA      # ( 𝐒 → S ) MATHEMATICAL BOLD CAPITAL S → LATIN CAPITAL LETTER S # 
+1D446 ;        0053 ;  SA      # ( 𝑆 → S ) MATHEMATICAL ITALIC CAPITAL S → LATIN CAPITAL LETTER S       # 
+1D47A ;        0053 ;  SA      # ( 𝑺 → S ) MATHEMATICAL BOLD ITALIC CAPITAL S → LATIN CAPITAL LETTER S  # 
+1D4AE ;        0053 ;  SA      # ( 𝒮 → S ) MATHEMATICAL SCRIPT CAPITAL S → LATIN CAPITAL LETTER S       # 
+1D4E2 ;        0053 ;  SA      # ( 𝓢 → S ) MATHEMATICAL BOLD SCRIPT CAPITAL S → LATIN CAPITAL LETTER S  # 
+1D516 ;        0053 ;  SA      # ( 𝔖 → S ) MATHEMATICAL FRAKTUR CAPITAL S → LATIN CAPITAL LETTER S      # 
+1D54A ;        0053 ;  SA      # ( 𝕊 → S ) MATHEMATICAL DOUBLE-STRUCK CAPITAL S → LATIN CAPITAL LETTER S        # 
+1D57E ;        0053 ;  SA      # ( 𝕾 → S ) MATHEMATICAL BOLD FRAKTUR CAPITAL S → LATIN CAPITAL LETTER S # 
+1D5B2 ;        0053 ;  SA      # ( 𝖲 → S ) MATHEMATICAL SANS-SERIF CAPITAL S → LATIN CAPITAL LETTER S   # 
+1D5E6 ;        0053 ;  SA      # ( 𝗦 → S ) MATHEMATICAL SANS-SERIF BOLD CAPITAL S → LATIN CAPITAL LETTER S      # 
+1D61A ;        0053 ;  SA      # ( 𝘚 → S ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL S → LATIN CAPITAL LETTER S    # 
+1D64E ;        0053 ;  SA      # ( 𝙎 → S ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S → LATIN CAPITAL LETTER S       # 
+1D682 ;        0053 ;  SA      # ( 𝚂 → S ) MATHEMATICAL MONOSPACE CAPITAL S → LATIN CAPITAL LETTER S    # 
+
+0282 ; 0073 0328 ;     SA      # ( ʂ → s̨ ) LATIN SMALL LETTER S WITH HOOK → LATIN SMALL LETTER S, COMBINING OGONEK      # 
+
+1D6C3 ;        00DF ;  SA      # ( 𝛃 → ß ) MATHEMATICAL BOLD SMALL BETA → LATIN SMALL LETTER SHARP S   # →β→
+1D6FD ;        00DF ;  SA      # ( 𝛽 → ß ) MATHEMATICAL ITALIC SMALL BETA → LATIN SMALL LETTER SHARP S # →β→
+1D737 ;        00DF ;  SA      # ( 𝜷 → ß ) MATHEMATICAL BOLD ITALIC SMALL BETA → LATIN SMALL LETTER SHARP S    # →β→
+1D771 ;        00DF ;  SA      # ( 𝝱 → ß ) MATHEMATICAL SANS-SERIF BOLD SMALL BETA → LATIN SMALL LETTER SHARP S        # →β→
+1D7AB ;        00DF ;  SA      # ( 𝞫 → ß ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA → LATIN SMALL LETTER SHARP S # →β→
+
+FB06 ; 0073 0074 ;     SA      # ( st → st ) LATIN SMALL LIGATURE ST → LATIN SMALL LETTER S, LATIN SMALL LETTER T # 
+
+222B ; 0283 ;  SA      #* ( ∫ → ʃ ) INTEGRAL → LATIN SMALL LETTER ESH   # 
+
+2211 ; 01A9 ;  SA      #* ( ∑ → Ʃ ) N-ARY SUMMATION → LATIN CAPITAL LETTER ESH  # 
+2140 ; 01A9 ;  SA      #* ( ⅀ → Ʃ ) DOUBLE-STRUCK N-ARY SUMMATION → LATIN CAPITAL LETTER ESH    # →∑→
+1D6BA ;        01A9 ;  SA      # ( 𝚺 → Ʃ ) MATHEMATICAL BOLD CAPITAL SIGMA → LATIN CAPITAL LETTER ESH  # →Σ→
+1D6F4 ;        01A9 ;  SA      # ( 𝛴 → Ʃ ) MATHEMATICAL ITALIC CAPITAL SIGMA → LATIN CAPITAL LETTER ESH        # →Σ→
+1D72E ;        01A9 ;  SA      # ( 𝜮 → Ʃ ) MATHEMATICAL BOLD ITALIC CAPITAL SIGMA → LATIN CAPITAL LETTER ESH   # →Σ→
+1D768 ;        01A9 ;  SA      # ( 𝝨 → Ʃ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA → LATIN CAPITAL LETTER ESH       # →Σ→
+1D7A2 ;        01A9 ;  SA      # ( 𝞢 → Ʃ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA → LATIN CAPITAL LETTER ESH        # →Σ→
+
+222C ; 0283 0283 ;     SA      #* ( ∬ → ʃʃ ) DOUBLE INTEGRAL → LATIN SMALL LETTER ESH, LATIN SMALL LETTER ESH  # →∫∫→
+
+222D ; 0283 0283 0283 ;        SA      #* ( ∭ → ʃʃʃ ) TRIPLE INTEGRAL → LATIN SMALL LETTER ESH, LATIN SMALL LETTER ESH, LATIN SMALL LETTER ESH        # →∫∫∫→
+
+2A0C ; 0283 0283 0283 0283 ;   SA      #* ( ⨌ → ʃʃʃʃ ) QUADRUPLE INTEGRAL OPERATOR → LATIN SMALL LETTER ESH, LATIN SMALL LETTER ESH, LATIN SMALL LETTER ESH, LATIN SMALL LETTER ESH  # →∫∫∫∫→
+
+1D42D ;        0074 ;  SA      # ( 𝐭 → t ) MATHEMATICAL BOLD SMALL T → LATIN SMALL LETTER T     # 
+1D461 ;        0074 ;  SA      # ( 𝑡 → t ) MATHEMATICAL ITALIC SMALL T → LATIN SMALL LETTER T   # 
+1D495 ;        0074 ;  SA      # ( 𝒕 → t ) MATHEMATICAL BOLD ITALIC SMALL T → LATIN SMALL LETTER T      # 
+1D4C9 ;        0074 ;  SA      # ( 𝓉 → t ) MATHEMATICAL SCRIPT SMALL T → LATIN SMALL LETTER T   # 
+1D4FD ;        0074 ;  SA      # ( 𝓽 → t ) MATHEMATICAL BOLD SCRIPT SMALL T → LATIN SMALL LETTER T      # 
+1D531 ;        0074 ;  SA      # ( 𝔱 → t ) MATHEMATICAL FRAKTUR SMALL T → LATIN SMALL LETTER T  # 
+1D565 ;        0074 ;  SA      # ( 𝕥 → t ) MATHEMATICAL DOUBLE-STRUCK SMALL T → LATIN SMALL LETTER T    # 
+1D599 ;        0074 ;  SA      # ( 𝖙 → t ) MATHEMATICAL BOLD FRAKTUR SMALL T → LATIN SMALL LETTER T     # 
+1D5CD ;        0074 ;  SA      # ( 𝗍 → t ) MATHEMATICAL SANS-SERIF SMALL T → LATIN SMALL LETTER T       # 
+1D601 ;        0074 ;  SA      # ( 𝘁 → t ) MATHEMATICAL SANS-SERIF BOLD SMALL T → LATIN SMALL LETTER T  # 
+1D635 ;        0074 ;  SA      # ( 𝘵 → t ) MATHEMATICAL SANS-SERIF ITALIC SMALL T → LATIN SMALL LETTER T        # 
+1D669 ;        0074 ;  SA      # ( 𝙩 → t ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T → LATIN SMALL LETTER T   # 
+1D69D ;        0074 ;  SA      # ( 𝚝 → t ) MATHEMATICAL MONOSPACE SMALL T → LATIN SMALL LETTER T        # 
+1D1B ; 0074 ;  SA      # ( ᴛ → t ) LATIN LETTER SMALL CAPITAL T → LATIN SMALL LETTER T   # →т→→τ→
+1D6D5 ;        0074 ;  SA      # ( 𝛕 → t ) MATHEMATICAL BOLD SMALL TAU → LATIN SMALL LETTER T   # →τ→
+1D70F ;        0074 ;  SA      # ( 𝜏 → t ) MATHEMATICAL ITALIC SMALL TAU → LATIN SMALL LETTER T # →τ→
+1D749 ;        0074 ;  SA      # ( 𝝉 → t ) MATHEMATICAL BOLD ITALIC SMALL TAU → LATIN SMALL LETTER T    # →τ→
+1D783 ;        0074 ;  SA      # ( 𝞃 → t ) MATHEMATICAL SANS-SERIF BOLD SMALL TAU → LATIN SMALL LETTER T        # →τ→
+1D7BD ;        0074 ;  SA      # ( 𝞽 → t ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU → LATIN SMALL LETTER T # →τ→
+
+27D9 ; 0054 ;  SA      #* ( ⟙ → T ) LARGE DOWN TACK → LATIN CAPITAL LETTER T     # 
+FF34 ; 0054 ;  SA      # ( T → T ) FULLWIDTH LATIN CAPITAL LETTER T → LATIN CAPITAL LETTER T     # →Т→
+1D413 ;        0054 ;  SA      # ( 𝐓 → T ) MATHEMATICAL BOLD CAPITAL T → LATIN CAPITAL LETTER T # 
+1D447 ;        0054 ;  SA      # ( 𝑇 → T ) MATHEMATICAL ITALIC CAPITAL T → LATIN CAPITAL LETTER T       # 
+1D47B ;        0054 ;  SA      # ( 𝑻 → T ) MATHEMATICAL BOLD ITALIC CAPITAL T → LATIN CAPITAL LETTER T  # 
+1D4AF ;        0054 ;  SA      # ( 𝒯 → T ) MATHEMATICAL SCRIPT CAPITAL T → LATIN CAPITAL LETTER T       # 
+1D4E3 ;        0054 ;  SA      # ( 𝓣 → T ) MATHEMATICAL BOLD SCRIPT CAPITAL T → LATIN CAPITAL LETTER T  # 
+1D517 ;        0054 ;  SA      # ( 𝔗 → T ) MATHEMATICAL FRAKTUR CAPITAL T → LATIN CAPITAL LETTER T      # 
+1D54B ;        0054 ;  SA      # ( 𝕋 → T ) MATHEMATICAL DOUBLE-STRUCK CAPITAL T → LATIN CAPITAL LETTER T        # 
+1D57F ;        0054 ;  SA      # ( 𝕿 → T ) MATHEMATICAL BOLD FRAKTUR CAPITAL T → LATIN CAPITAL LETTER T # 
+1D5B3 ;        0054 ;  SA      # ( 𝖳 → T ) MATHEMATICAL SANS-SERIF CAPITAL T → LATIN CAPITAL LETTER T   # 
+1D5E7 ;        0054 ;  SA      # ( 𝗧 → T ) MATHEMATICAL SANS-SERIF BOLD CAPITAL T → LATIN CAPITAL LETTER T      # 
+1D61B ;        0054 ;  SA      # ( 𝘛 → T ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL T → LATIN CAPITAL LETTER T    # 
+1D64F ;        0054 ;  SA      # ( 𝙏 → T ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T → LATIN CAPITAL LETTER T       # 
+1D683 ;        0054 ;  SA      # ( 𝚃 → T ) MATHEMATICAL MONOSPACE CAPITAL T → LATIN CAPITAL LETTER T    # 
+1D6BB ;        0054 ;  SA      # ( 𝚻 → T ) MATHEMATICAL BOLD CAPITAL TAU → LATIN CAPITAL LETTER T       # →𝐓→
+1D6F5 ;        0054 ;  SA      # ( 𝛵 → T ) MATHEMATICAL ITALIC CAPITAL TAU → LATIN CAPITAL LETTER T     # →𝑇→
+1D72F ;        0054 ;  SA      # ( 𝜯 → T ) MATHEMATICAL BOLD ITALIC CAPITAL TAU → LATIN CAPITAL LETTER T        # →𝑻→
+1D769 ;        0054 ;  SA      # ( 𝝩 → T ) MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU → LATIN CAPITAL LETTER T    # →Τ→
+1D7A3 ;        0054 ;  SA      # ( 𝞣 → T ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU → LATIN CAPITAL LETTER T     # →Τ→
+
+01AD ; 0074 0314 ;     SA      # ( ƭ → t̔ ) LATIN SMALL LETTER T WITH HOOK → LATIN SMALL LETTER T, COMBINING REVERSED COMMA ABOVE        # 
+
+021B ; 0163 ;  SA      # ( ț → ţ ) LATIN SMALL LETTER T WITH COMMA BELOW → LATIN SMALL LETTER T WITH CEDILLA     # 
+01AB ; 0163 ;  SA      # ( ƫ → ţ ) LATIN SMALL LETTER T WITH PALATAL HOOK → LATIN SMALL LETTER T WITH CEDILLA    # 
+
+021A ; 0162 ;  SA      # ( Ț → Ţ ) LATIN CAPITAL LETTER T WITH COMMA BELOW → LATIN CAPITAL LETTER T WITH CEDILLA # 
+
+01AE ; 0054 0328 ;     SA      # ( Ʈ → T̨ ) LATIN CAPITAL LETTER T WITH RETROFLEX HOOK → LATIN CAPITAL LETTER T, COMBINING OGONEK        # 
+
+0167 ; 0074 0335 ;     SA      # ( ŧ → t̵ ) LATIN SMALL LETTER T WITH STROKE → LATIN SMALL LETTER T, COMBINING SHORT STROKE OVERLAY      # 
+
+0166 ; 0054 0335 ;     SA      # ( Ŧ → T̵ ) LATIN CAPITAL LETTER T WITH STROKE → LATIN CAPITAL LETTER T, COMBINING SHORT STROKE OVERLAY  # 
+
+A728 ; 0054 0033 ;     SA      # ( Ꜩ → T3 ) LATIN CAPITAL LETTER TZ → LATIN CAPITAL LETTER T, DIGIT THREE        # →TƷ→
+
+02A8 ; 0074 0255 ;     SA      # ( ʨ → tɕ ) LATIN SMALL LETTER TC DIGRAPH WITH CURL → LATIN SMALL LETTER T, LATIN SMALL LETTER C WITH CURL       # 
+
+2121 ; 0054 0045 004C ;        SA      #* ( ℡ → TEL ) TELEPHONE SIGN → LATIN CAPITAL LETTER T, LATIN CAPITAL LETTER E, LATIN CAPITAL LETTER L    # 
+
+A777 ; 0074 0066 ;     SA      # ( ꝷ → tf ) LATIN SMALL LETTER TUM → LATIN SMALL LETTER T, LATIN SMALL LETTER F  # 
+
+02A6 ; 0074 0073 ;     SA      # ( ʦ → ts ) LATIN SMALL LETTER TS DIGRAPH → LATIN SMALL LETTER T, LATIN SMALL LETTER S    # 
+
+02A7 ; 0074 0283 ;     SA      # ( ʧ → tʃ ) LATIN SMALL LETTER TESH DIGRAPH → LATIN SMALL LETTER T, LATIN SMALL LETTER ESH       # 
+
+A729 ; 0074 021D ;     SA      # ( ꜩ → tȝ ) LATIN SMALL LETTER TZ → LATIN SMALL LETTER T, LATIN SMALL LETTER YOGH       # 
+
+1D42E ;        0075 ;  SA      # ( 𝐮 → u ) MATHEMATICAL BOLD SMALL U → LATIN SMALL LETTER U     # 
+1D462 ;        0075 ;  SA      # ( 𝑢 → u ) MATHEMATICAL ITALIC SMALL U → LATIN SMALL LETTER U   # 
+1D496 ;        0075 ;  SA      # ( 𝒖 → u ) MATHEMATICAL BOLD ITALIC SMALL U → LATIN SMALL LETTER U      # 
+1D4CA ;        0075 ;  SA      # ( 𝓊 → u ) MATHEMATICAL SCRIPT SMALL U → LATIN SMALL LETTER U   # 
+1D4FE ;        0075 ;  SA      # ( 𝓾 → u ) MATHEMATICAL BOLD SCRIPT SMALL U → LATIN SMALL LETTER U      # 
+1D532 ;        0075 ;  SA      # ( 𝔲 → u ) MATHEMATICAL FRAKTUR SMALL U → LATIN SMALL LETTER U  # 
+1D566 ;        0075 ;  SA      # ( 𝕦 → u ) MATHEMATICAL DOUBLE-STRUCK SMALL U → LATIN SMALL LETTER U    # 
+1D59A ;        0075 ;  SA      # ( 𝖚 → u ) MATHEMATICAL BOLD FRAKTUR SMALL U → LATIN SMALL LETTER U     # 
+1D5CE ;        0075 ;  SA      # ( 𝗎 → u ) MATHEMATICAL SANS-SERIF SMALL U → LATIN SMALL LETTER U       # 
+1D602 ;        0075 ;  SA      # ( 𝘂 → u ) MATHEMATICAL SANS-SERIF BOLD SMALL U → LATIN SMALL LETTER U  # 
+1D636 ;        0075 ;  SA      # ( 𝘶 → u ) MATHEMATICAL SANS-SERIF ITALIC SMALL U → LATIN SMALL LETTER U        # 
+1D66A ;        0075 ;  SA      # ( 𝙪 → u ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U → LATIN SMALL LETTER U   # 
+1D69E ;        0075 ;  SA      # ( 𝚞 → u ) MATHEMATICAL MONOSPACE SMALL U → LATIN SMALL LETTER U        # 
+1D1C ; 0075 ;  SA      # ( ᴜ → u ) LATIN LETTER SMALL CAPITAL U → LATIN SMALL LETTER U   # 
+028B ; 0075 ;  SA      # ( ʋ → u ) LATIN SMALL LETTER V WITH HOOK → LATIN SMALL LETTER U  # 
+1D6D6 ;        0075 ;  SA      # ( 𝛖 → u ) MATHEMATICAL BOLD SMALL UPSILON → LATIN SMALL LETTER U       # →υ→→ʋ→
+1D710 ;        0075 ;  SA      # ( 𝜐 → u ) MATHEMATICAL ITALIC SMALL UPSILON → LATIN SMALL LETTER U     # →υ→→ʋ→
+1D74A ;        0075 ;  SA      # ( 𝝊 → u ) MATHEMATICAL BOLD ITALIC SMALL UPSILON → LATIN SMALL LETTER U        # →υ→→ʋ→
+1D784 ;        0075 ;  SA      # ( 𝞄 → u ) MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON → LATIN SMALL LETTER U    # →υ→→ʋ→
+1D7BE ;        0075 ;  SA      # ( 𝞾 → u ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON → LATIN SMALL LETTER U     # →υ→→ʋ→
+
+1D414 ;        0055 ;  SA      # ( 𝐔 → U ) MATHEMATICAL BOLD CAPITAL U → LATIN CAPITAL LETTER U # 
+1D448 ;        0055 ;  SA      # ( 𝑈 → U ) MATHEMATICAL ITALIC CAPITAL U → LATIN CAPITAL LETTER U       # 
+1D47C ;        0055 ;  SA      # ( 𝑼 → U ) MATHEMATICAL BOLD ITALIC CAPITAL U → LATIN CAPITAL LETTER U  # 
+1D4B0 ;        0055 ;  SA      # ( 𝒰 → U ) MATHEMATICAL SCRIPT CAPITAL U → LATIN CAPITAL LETTER U       # 
+1D4E4 ;        0055 ;  SA      # ( 𝓤 → U ) MATHEMATICAL BOLD SCRIPT CAPITAL U → LATIN CAPITAL LETTER U  # 
+1D518 ;        0055 ;  SA      # ( 𝔘 → U ) MATHEMATICAL FRAKTUR CAPITAL U → LATIN CAPITAL LETTER U      # 
+1D54C ;        0055 ;  SA      # ( 𝕌 → U ) MATHEMATICAL DOUBLE-STRUCK CAPITAL U → LATIN CAPITAL LETTER U        # 
+1D580 ;        0055 ;  SA      # ( 𝖀 → U ) MATHEMATICAL BOLD FRAKTUR CAPITAL U → LATIN CAPITAL LETTER U # 
+1D5B4 ;        0055 ;  SA      # ( 𝖴 → U ) MATHEMATICAL SANS-SERIF CAPITAL U → LATIN CAPITAL LETTER U   # 
+1D5E8 ;        0055 ;  SA      # ( 𝗨 → U ) MATHEMATICAL SANS-SERIF BOLD CAPITAL U → LATIN CAPITAL LETTER U      # 
+1D61C ;        0055 ;  SA      # ( 𝘜 → U ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL U → LATIN CAPITAL LETTER U    # 
+1D650 ;        0055 ;  SA      # ( 𝙐 → U ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U → LATIN CAPITAL LETTER U       # 
+1D684 ;        0055 ;  SA      # ( 𝚄 → U ) MATHEMATICAL MONOSPACE CAPITAL U → LATIN CAPITAL LETTER U    # 
+
+01D4 ; 016D ;  SA      # ( ǔ → ŭ ) LATIN SMALL LETTER U WITH CARON → LATIN SMALL LETTER U WITH BREVE     # 
+
+01D3 ; 016C ;  SA      # ( Ǔ → Ŭ ) LATIN CAPITAL LETTER U WITH CARON → LATIN CAPITAL LETTER U WITH BREVE # 
+
+2127 ; 01B1 ;  SA      #* ( ℧ → Ʊ ) INVERTED OHM SIGN → LATIN CAPITAL LETTER UPSILON    # 
+
+2228 ; 0076 ;  SA      #* ( ∨ → v ) LOGICAL OR → LATIN SMALL LETTER V    # 
+22C1 ; 0076 ;  SA      #* ( ⋁ → v ) N-ARY LOGICAL OR → LATIN SMALL LETTER V      # →∨→
+FF56 ; 0076 ;  SA      # ( v → v ) FULLWIDTH LATIN SMALL LETTER V → LATIN SMALL LETTER V # →ν→
+2174 ; 0076 ;  SA      # ( ⅴ → v ) SMALL ROMAN NUMERAL FIVE → LATIN SMALL LETTER V       # 
+1D42F ;        0076 ;  SA      # ( 𝐯 → v ) MATHEMATICAL BOLD SMALL V → LATIN SMALL LETTER V     # 
+1D463 ;        0076 ;  SA      # ( 𝑣 → v ) MATHEMATICAL ITALIC SMALL V → LATIN SMALL LETTER V   # 
+1D497 ;        0076 ;  SA      # ( 𝒗 → v ) MATHEMATICAL BOLD ITALIC SMALL V → LATIN SMALL LETTER V      # 
+1D4CB ;        0076 ;  SA      # ( 𝓋 → v ) MATHEMATICAL SCRIPT SMALL V → LATIN SMALL LETTER V   # 
+1D4FF ;        0076 ;  SA      # ( 𝓿 → v ) MATHEMATICAL BOLD SCRIPT SMALL V → LATIN SMALL LETTER V      # 
+1D533 ;        0076 ;  SA      # ( 𝔳 → v ) MATHEMATICAL FRAKTUR SMALL V → LATIN SMALL LETTER V  # 
+1D567 ;        0076 ;  SA      # ( 𝕧 → v ) MATHEMATICAL DOUBLE-STRUCK SMALL V → LATIN SMALL LETTER V    # 
+1D59B ;        0076 ;  SA      # ( 𝖛 → v ) MATHEMATICAL BOLD FRAKTUR SMALL V → LATIN SMALL LETTER V     # 
+1D5CF ;        0076 ;  SA      # ( 𝗏 → v ) MATHEMATICAL SANS-SERIF SMALL V → LATIN SMALL LETTER V       # 
+1D603 ;        0076 ;  SA      # ( 𝘃 → v ) MATHEMATICAL SANS-SERIF BOLD SMALL V → LATIN SMALL LETTER V  # 
+1D637 ;        0076 ;  SA      # ( 𝘷 → v ) MATHEMATICAL SANS-SERIF ITALIC SMALL V → LATIN SMALL LETTER V        # 
+1D66B ;        0076 ;  SA      # ( 𝙫 → v ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V → LATIN SMALL LETTER V   # 
+1D69F ;        0076 ;  SA      # ( 𝚟 → v ) MATHEMATICAL MONOSPACE SMALL V → LATIN SMALL LETTER V        # 
+1D20 ; 0076 ;  SA      # ( ᴠ → v ) LATIN LETTER SMALL CAPITAL V → LATIN SMALL LETTER V   # 
+1D6CE ;        0076 ;  SA      # ( 𝛎 → v ) MATHEMATICAL BOLD SMALL NU → LATIN SMALL LETTER V    # →ν→
+1D708 ;        0076 ;  SA      # ( 𝜈 → v ) MATHEMATICAL ITALIC SMALL NU → LATIN SMALL LETTER V  # →ν→
+1D742 ;        0076 ;  SA      # ( 𝝂 → v ) MATHEMATICAL BOLD ITALIC SMALL NU → LATIN SMALL LETTER V     # →ν→
+1D77C ;        0076 ;  SA      # ( 𝝼 → v ) MATHEMATICAL SANS-SERIF BOLD SMALL NU → LATIN SMALL LETTER V # →ν→
+1D7B6 ;        0076 ;  SA      # ( 𝞶 → v ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU → LATIN SMALL LETTER V  # →ν→
+
+2164 ; 0056 ;  SA      # ( Ⅴ → V ) ROMAN NUMERAL FIVE → LATIN CAPITAL LETTER V   # 
+1D415 ;        0056 ;  SA      # ( 𝐕 → V ) MATHEMATICAL BOLD CAPITAL V → LATIN CAPITAL LETTER V # 
+1D449 ;        0056 ;  SA      # ( 𝑉 → V ) MATHEMATICAL ITALIC CAPITAL V → LATIN CAPITAL LETTER V       # 
+1D47D ;        0056 ;  SA      # ( 𝑽 → V ) MATHEMATICAL BOLD ITALIC CAPITAL V → LATIN CAPITAL LETTER V  # 
+1D4B1 ;        0056 ;  SA      # ( 𝒱 → V ) MATHEMATICAL SCRIPT CAPITAL V → LATIN CAPITAL LETTER V       # 
+1D4E5 ;        0056 ;  SA      # ( 𝓥 → V ) MATHEMATICAL BOLD SCRIPT CAPITAL V → LATIN CAPITAL LETTER V  # 
+1D519 ;        0056 ;  SA      # ( 𝔙 → V ) MATHEMATICAL FRAKTUR CAPITAL V → LATIN CAPITAL LETTER V      # 
+1D54D ;        0056 ;  SA      # ( 𝕍 → V ) MATHEMATICAL DOUBLE-STRUCK CAPITAL V → LATIN CAPITAL LETTER V        # 
+1D581 ;        0056 ;  SA      # ( 𝖁 → V ) MATHEMATICAL BOLD FRAKTUR CAPITAL V → LATIN CAPITAL LETTER V # 
+1D5B5 ;        0056 ;  SA      # ( 𝖵 → V ) MATHEMATICAL SANS-SERIF CAPITAL V → LATIN CAPITAL LETTER V   # 
+1D5E9 ;        0056 ;  SA      # ( 𝗩 → V ) MATHEMATICAL SANS-SERIF BOLD CAPITAL V → LATIN CAPITAL LETTER V      # 
+1D61D ;        0056 ;  SA      # ( 𝘝 → V ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL V → LATIN CAPITAL LETTER V    # 
+1D651 ;        0056 ;  SA      # ( 𝙑 → V ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V → LATIN CAPITAL LETTER V       # 
+1D685 ;        0056 ;  SA      # ( 𝚅 → V ) MATHEMATICAL MONOSPACE CAPITAL V → LATIN CAPITAL LETTER V    # 
+
+2175 ; 0076 0069 ;     SA      # ( ⅵ → vi ) SMALL ROMAN NUMERAL SIX → LATIN SMALL LETTER V, LATIN SMALL LETTER I # 
+
+2165 ; 0056 0049 ;     SA      # ( Ⅵ → VI ) ROMAN NUMERAL SIX → LATIN CAPITAL LETTER V, LATIN CAPITAL LETTER I   # 
+
+2176 ; 0076 0069 0069 ;        SA      # ( ⅶ → vii ) SMALL ROMAN NUMERAL SEVEN → LATIN SMALL LETTER V, LATIN SMALL LETTER I, LATIN SMALL LETTER I        # 
+
+2166 ; 0056 0049 0049 ;        SA      # ( Ⅶ → VII ) ROMAN NUMERAL SEVEN → LATIN CAPITAL LETTER V, LATIN CAPITAL LETTER I, LATIN CAPITAL LETTER I        # 
+
+2177 ; 0076 0069 0069 0069 ;   SA      # ( ⅷ → viii ) SMALL ROMAN NUMERAL EIGHT → LATIN SMALL LETTER V, LATIN SMALL LETTER I, LATIN SMALL LETTER I, LATIN SMALL LETTER I # 
+
+2167 ; 0056 0049 0049 0049 ;   SA      # ( Ⅷ → VIII ) ROMAN NUMERAL EIGHT → LATIN CAPITAL LETTER V, LATIN CAPITAL LETTER I, LATIN CAPITAL LETTER I, LATIN CAPITAL LETTER I       # 
+
+026F ; 0076 0076 ;     SA      # ( ɯ → vv ) LATIN SMALL LETTER TURNED M → LATIN SMALL LETTER V, LATIN SMALL LETTER V      # →w→
+0077 ; 0076 0076 ;     SA      # ( w → vv ) LATIN SMALL LETTER W → LATIN SMALL LETTER V, LATIN SMALL LETTER V      # 
+1D430 ;        0076 0076 ;     SA      # ( 𝐰 → vv ) MATHEMATICAL BOLD SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V      # →w→
+1D464 ;        0076 0076 ;     SA      # ( 𝑤 → vv ) MATHEMATICAL ITALIC SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V    # →w→
+1D498 ;        0076 0076 ;     SA      # ( 𝒘 → vv ) MATHEMATICAL BOLD ITALIC SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V       # →w→
+1D4CC ;        0076 0076 ;     SA      # ( 𝓌 → vv ) MATHEMATICAL SCRIPT SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V    # →w→
+1D500 ;        0076 0076 ;     SA      # ( 𝔀 → vv ) MATHEMATICAL BOLD SCRIPT SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V       # →w→
+1D534 ;        0076 0076 ;     SA      # ( 𝔴 → vv ) MATHEMATICAL FRAKTUR SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V   # →w→
+1D568 ;        0076 0076 ;     SA      # ( 𝕨 → vv ) MATHEMATICAL DOUBLE-STRUCK SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V     # →w→
+1D59C ;        0076 0076 ;     SA      # ( 𝖜 → vv ) MATHEMATICAL BOLD FRAKTUR SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V      # →w→
+1D5D0 ;        0076 0076 ;     SA      # ( 𝗐 → vv ) MATHEMATICAL SANS-SERIF SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V        # →w→
+1D604 ;        0076 0076 ;     SA      # ( 𝘄 → vv ) MATHEMATICAL SANS-SERIF BOLD SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V   # →w→
+1D638 ;        0076 0076 ;     SA      # ( 𝘸 → vv ) MATHEMATICAL SANS-SERIF ITALIC SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→
+1D66C ;        0076 0076 ;     SA      # ( 𝙬 → vv ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V    # →w→
+1D6A0 ;        0076 0076 ;     SA      # ( 𝚠 → vv ) MATHEMATICAL MONOSPACE SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→
+1D21 ; 0076 0076 ;     SA      # ( ᴡ → vv ) LATIN LETTER SMALL CAPITAL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V    # →w→
+
+A761 ; 0076 0079 ;     SA      # ( ꝡ → vy ) LATIN SMALL LETTER VY → LATIN SMALL LETTER V, LATIN SMALL LETTER Y   # 
+
+1D6B2 ;        0245 ;  SA      # ( 𝚲 → Ʌ ) MATHEMATICAL BOLD CAPITAL LAMDA → LATIN CAPITAL LETTER TURNED V     # →Λ→
+1D6EC ;        0245 ;  SA      # ( 𝛬 → Ʌ ) MATHEMATICAL ITALIC CAPITAL LAMDA → LATIN CAPITAL LETTER TURNED V   # →Λ→
+1D726 ;        0245 ;  SA      # ( 𝜦 → Ʌ ) MATHEMATICAL BOLD ITALIC CAPITAL LAMDA → LATIN CAPITAL LETTER TURNED V      # →Λ→
+1D760 ;        0245 ;  SA      # ( 𝝠 → Ʌ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA → LATIN CAPITAL LETTER TURNED V  # →Λ→
+1D79A ;        0245 ;  SA      # ( 𝞚 → Ʌ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA → LATIN CAPITAL LETTER TURNED V   # →Λ→
+
+1D416 ;        0057 ;  SA      # ( 𝐖 → W ) MATHEMATICAL BOLD CAPITAL W → LATIN CAPITAL LETTER W # 
+1D44A ;        0057 ;  SA      # ( 𝑊 → W ) MATHEMATICAL ITALIC CAPITAL W → LATIN CAPITAL LETTER W       # 
+1D47E ;        0057 ;  SA      # ( 𝑾 → W ) MATHEMATICAL BOLD ITALIC CAPITAL W → LATIN CAPITAL LETTER W  # 
+1D4B2 ;        0057 ;  SA      # ( 𝒲 → W ) MATHEMATICAL SCRIPT CAPITAL W → LATIN CAPITAL LETTER W       # 
+1D4E6 ;        0057 ;  SA      # ( 𝓦 → W ) MATHEMATICAL BOLD SCRIPT CAPITAL W → LATIN CAPITAL LETTER W  # 
+1D51A ;        0057 ;  SA      # ( 𝔚 → W ) MATHEMATICAL FRAKTUR CAPITAL W → LATIN CAPITAL LETTER W      # 
+1D54E ;        0057 ;  SA      # ( 𝕎 → W ) MATHEMATICAL DOUBLE-STRUCK CAPITAL W → LATIN CAPITAL LETTER W        # 
+1D582 ;        0057 ;  SA      # ( 𝖂 → W ) MATHEMATICAL BOLD FRAKTUR CAPITAL W → LATIN CAPITAL LETTER W # 
+1D5B6 ;        0057 ;  SA      # ( 𝖶 → W ) MATHEMATICAL SANS-SERIF CAPITAL W → LATIN CAPITAL LETTER W   # 
+1D5EA ;        0057 ;  SA      # ( 𝗪 → W ) MATHEMATICAL SANS-SERIF BOLD CAPITAL W → LATIN CAPITAL LETTER W      # 
+1D61E ;        0057 ;  SA      # ( 𝘞 → W ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL W → LATIN CAPITAL LETTER W    # 
+1D652 ;        0057 ;  SA      # ( 𝙒 → W ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W → LATIN CAPITAL LETTER W       # 
+1D686 ;        0057 ;  SA      # ( 𝚆 → W ) MATHEMATICAL MONOSPACE CAPITAL W → LATIN CAPITAL LETTER W    # 
+
+20A9 ; 0057 0335 ;     SA      #* ( ₩ → W̵ ) WON SIGN → LATIN CAPITAL LETTER W, COMBINING SHORT STROKE OVERLAY  # 
+
+00D7 ; 0078 ;  SA      #* ( × → x ) MULTIPLICATION SIGN → LATIN SMALL LETTER X    # 
+2573 ; 0078 ;  SA      #* ( ╳ → x ) BOX DRAWINGS LIGHT DIAGONAL CROSS → LATIN SMALL LETTER X     # 
+292B ; 0078 ;  SA      #* ( ⤫ → x ) RISING DIAGONAL CROSSING FALLING DIAGONAL → LATIN SMALL LETTER X     # 
+292C ; 0078 ;  SA      #* ( ⤬ → x ) FALLING DIAGONAL CROSSING RISING DIAGONAL → LATIN SMALL LETTER X     # 
+2A2F ; 0078 ;  SA      #* ( ⨯ → x ) VECTOR OR CROSS PRODUCT → LATIN SMALL LETTER X       # →×→
+FF58 ; 0078 ;  SA      # ( x → x ) FULLWIDTH LATIN SMALL LETTER X → LATIN SMALL LETTER X # →х→
+2179 ; 0078 ;  SA      # ( ⅹ → x ) SMALL ROMAN NUMERAL TEN → LATIN SMALL LETTER X        # 
+1D431 ;        0078 ;  SA      # ( 𝐱 → x ) MATHEMATICAL BOLD SMALL X → LATIN SMALL LETTER X     # 
+1D465 ;        0078 ;  SA      # ( 𝑥 → x ) MATHEMATICAL ITALIC SMALL X → LATIN SMALL LETTER X   # 
+1D499 ;        0078 ;  SA      # ( 𝒙 → x ) MATHEMATICAL BOLD ITALIC SMALL X → LATIN SMALL LETTER X      # 
+1D4CD ;        0078 ;  SA      # ( 𝓍 → x ) MATHEMATICAL SCRIPT SMALL X → LATIN SMALL LETTER X   # 
+1D501 ;        0078 ;  SA      # ( 𝔁 → x ) MATHEMATICAL BOLD SCRIPT SMALL X → LATIN SMALL LETTER X      # 
+1D535 ;        0078 ;  SA      # ( 𝔵 → x ) MATHEMATICAL FRAKTUR SMALL X → LATIN SMALL LETTER X  # 
+1D569 ;        0078 ;  SA      # ( 𝕩 → x ) MATHEMATICAL DOUBLE-STRUCK SMALL X → LATIN SMALL LETTER X    # 
+1D59D ;        0078 ;  SA      # ( 𝖝 → x ) MATHEMATICAL BOLD FRAKTUR SMALL X → LATIN SMALL LETTER X     # 
+1D5D1 ;        0078 ;  SA      # ( 𝗑 → x ) MATHEMATICAL SANS-SERIF SMALL X → LATIN SMALL LETTER X       # 
+1D605 ;        0078 ;  SA      # ( 𝘅 → x ) MATHEMATICAL SANS-SERIF BOLD SMALL X → LATIN SMALL LETTER X  # 
+1D639 ;        0078 ;  SA      # ( 𝘹 → x ) MATHEMATICAL SANS-SERIF ITALIC SMALL X → LATIN SMALL LETTER X        # 
+1D66D ;        0078 ;  SA      # ( 𝙭 → x ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X → LATIN SMALL LETTER X   # 
+1D6A1 ;        0078 ;  SA      # ( 𝚡 → x ) MATHEMATICAL MONOSPACE SMALL X → LATIN SMALL LETTER X        # 
+
+FF38 ; 0058 ;  SA      # ( X → X ) FULLWIDTH LATIN CAPITAL LETTER X → LATIN CAPITAL LETTER X     # →Χ→
+2169 ; 0058 ;  SA      # ( Ⅹ → X ) ROMAN NUMERAL TEN → LATIN CAPITAL LETTER X    # 
+1D417 ;        0058 ;  SA      # ( 𝐗 → X ) MATHEMATICAL BOLD CAPITAL X → LATIN CAPITAL LETTER X # 
+1D44B ;        0058 ;  SA      # ( 𝑋 → X ) MATHEMATICAL ITALIC CAPITAL X → LATIN CAPITAL LETTER X       # 
+1D47F ;        0058 ;  SA      # ( 𝑿 → X ) MATHEMATICAL BOLD ITALIC CAPITAL X → LATIN CAPITAL LETTER X  # 
+1D4B3 ;        0058 ;  SA      # ( 𝒳 → X ) MATHEMATICAL SCRIPT CAPITAL X → LATIN CAPITAL LETTER X       # 
+1D4E7 ;        0058 ;  SA      # ( 𝓧 → X ) MATHEMATICAL BOLD SCRIPT CAPITAL X → LATIN CAPITAL LETTER X  # 
+1D51B ;        0058 ;  SA      # ( 𝔛 → X ) MATHEMATICAL FRAKTUR CAPITAL X → LATIN CAPITAL LETTER X      # 
+1D54F ;        0058 ;  SA      # ( 𝕏 → X ) MATHEMATICAL DOUBLE-STRUCK CAPITAL X → LATIN CAPITAL LETTER X        # 
+1D583 ;        0058 ;  SA      # ( 𝖃 → X ) MATHEMATICAL BOLD FRAKTUR CAPITAL X → LATIN CAPITAL LETTER X # 
+1D5B7 ;        0058 ;  SA      # ( 𝖷 → X ) MATHEMATICAL SANS-SERIF CAPITAL X → LATIN CAPITAL LETTER X   # 
+1D5EB ;        0058 ;  SA      # ( 𝗫 → X ) MATHEMATICAL SANS-SERIF BOLD CAPITAL X → LATIN CAPITAL LETTER X      # 
+1D61F ;        0058 ;  SA      # ( 𝘟 → X ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL X → LATIN CAPITAL LETTER X    # 
+1D653 ;        0058 ;  SA      # ( 𝙓 → X ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X → LATIN CAPITAL LETTER X       # 
+1D687 ;        0058 ;  SA      # ( 𝚇 → X ) MATHEMATICAL MONOSPACE CAPITAL X → LATIN CAPITAL LETTER X    # 
+1D6BE ;        0058 ;  SA      # ( 𝚾 → X ) MATHEMATICAL BOLD CAPITAL CHI → LATIN CAPITAL LETTER X       # →𝐗→
+1D6F8 ;        0058 ;  SA      # ( 𝛸 → X ) MATHEMATICAL ITALIC CAPITAL CHI → LATIN CAPITAL LETTER X     # →𝑋→
+1D732 ;        0058 ;  SA      # ( 𝜲 → X ) MATHEMATICAL BOLD ITALIC CAPITAL CHI → LATIN CAPITAL LETTER X        # →𝑿→
+1D76C ;        0058 ;  SA      # ( 𝝬 → X ) MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI → LATIN CAPITAL LETTER X    # →Χ→
+1D7A6 ;        0058 ;  SA      # ( 𝞦 → X ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI → LATIN CAPITAL LETTER X     # →Χ→
+
+166D ; 1D417 ; SA      #* ( ᙭ → 𝐗 ) CANADIAN SYLLABICS CHI SIGN → MATHEMATICAL BOLD CAPITAL X # →X→
+
+2A30 ; 0078 0307 ;     SA      #* ( ⨰ → ẋ ) MULTIPLICATION SIGN WITH DOT ABOVE → LATIN SMALL LETTER X, COMBINING DOT ABOVE     # →×̇→
+
+217A ; 0078 0069 ;     SA      # ( ⅺ → xi ) SMALL ROMAN NUMERAL ELEVEN → LATIN SMALL LETTER X, LATIN SMALL LETTER I      # 
+
+216A ; 0058 0049 ;     SA      # ( Ⅺ → XI ) ROMAN NUMERAL ELEVEN → LATIN CAPITAL LETTER X, LATIN CAPITAL LETTER I        # 
+
+217B ; 0078 0069 0069 ;        SA      # ( ⅻ → xii ) SMALL ROMAN NUMERAL TWELVE → LATIN SMALL LETTER X, LATIN SMALL LETTER I, LATIN SMALL LETTER I       # 
+
+216B ; 0058 0049 0049 ;        SA      # ( Ⅻ → XII ) ROMAN NUMERAL TWELVE → LATIN CAPITAL LETTER X, LATIN CAPITAL LETTER I, LATIN CAPITAL LETTER I       # 
+
+1D8C ; 0079 ;  SA      # ( ᶌ → y ) LATIN SMALL LETTER V WITH PALATAL HOOK → LATIN SMALL LETTER Y # 
+FF59 ; 0079 ;  SA      # ( y → y ) FULLWIDTH LATIN SMALL LETTER Y → LATIN SMALL LETTER Y # →у→
+1D432 ;        0079 ;  SA      # ( 𝐲 → y ) MATHEMATICAL BOLD SMALL Y → LATIN SMALL LETTER Y     # 
+1D466 ;        0079 ;  SA      # ( 𝑦 → y ) MATHEMATICAL ITALIC SMALL Y → LATIN SMALL LETTER Y   # 
+1D49A ;        0079 ;  SA      # ( 𝒚 → y ) MATHEMATICAL BOLD ITALIC SMALL Y → LATIN SMALL LETTER Y      # 
+1D4CE ;        0079 ;  SA      # ( 𝓎 → y ) MATHEMATICAL SCRIPT SMALL Y → LATIN SMALL LETTER Y   # 
+1D502 ;        0079 ;  SA      # ( 𝔂 → y ) MATHEMATICAL BOLD SCRIPT SMALL Y → LATIN SMALL LETTER Y      # 
+1D536 ;        0079 ;  SA      # ( 𝔶 → y ) MATHEMATICAL FRAKTUR SMALL Y → LATIN SMALL LETTER Y  # 
+1D56A ;        0079 ;  SA      # ( 𝕪 → y ) MATHEMATICAL DOUBLE-STRUCK SMALL Y → LATIN SMALL LETTER Y    # 
+1D59E ;        0079 ;  SA      # ( 𝖞 → y ) MATHEMATICAL BOLD FRAKTUR SMALL Y → LATIN SMALL LETTER Y     # 
+1D5D2 ;        0079 ;  SA      # ( 𝗒 → y ) MATHEMATICAL SANS-SERIF SMALL Y → LATIN SMALL LETTER Y       # 
+1D606 ;        0079 ;  SA      # ( 𝘆 → y ) MATHEMATICAL SANS-SERIF BOLD SMALL Y → LATIN SMALL LETTER Y  # 
+1D63A ;        0079 ;  SA      # ( 𝘺 → y ) MATHEMATICAL SANS-SERIF ITALIC SMALL Y → LATIN SMALL LETTER Y        # 
+1D66E ;        0079 ;  SA      # ( 𝙮 → y ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y → LATIN SMALL LETTER Y   # 
+1D6A2 ;        0079 ;  SA      # ( 𝚢 → y ) MATHEMATICAL MONOSPACE SMALL Y → LATIN SMALL LETTER Y        # 
+028F ; 0079 ;  SA      # ( ʏ → y ) LATIN LETTER SMALL CAPITAL Y → LATIN SMALL LETTER Y    # →ү→→у→
+1EFF ; 0079 ;  SA      # ( ỿ → y ) LATIN SMALL LETTER Y WITH LOOP → LATIN SMALL LETTER Y # 
+213D ; 0079 ;  SA      # ( ℽ → y ) DOUBLE-STRUCK SMALL GAMMA → LATIN SMALL LETTER Y      # →γ→
+1D6C4 ;        0079 ;  SA      # ( 𝛄 → y ) MATHEMATICAL BOLD SMALL GAMMA → LATIN SMALL LETTER Y # →γ→
+1D6FE ;        0079 ;  SA      # ( 𝛾 → y ) MATHEMATICAL ITALIC SMALL GAMMA → LATIN SMALL LETTER Y       # →γ→
+1D738 ;        0079 ;  SA      # ( 𝜸 → y ) MATHEMATICAL BOLD ITALIC SMALL GAMMA → LATIN SMALL LETTER Y  # →γ→
+1D772 ;        0079 ;  SA      # ( 𝝲 → y ) MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA → LATIN SMALL LETTER Y      # →γ→
+1D7AC ;        0079 ;  SA      # ( 𝞬 → y ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA → LATIN SMALL LETTER Y       # →γ→
+
+FF39 ; 0059 ;  SA      # ( Y → Y ) FULLWIDTH LATIN CAPITAL LETTER Y → LATIN CAPITAL LETTER Y     # →Υ→
+1D418 ;        0059 ;  SA      # ( 𝐘 → Y ) MATHEMATICAL BOLD CAPITAL Y → LATIN CAPITAL LETTER Y # 
+1D44C ;        0059 ;  SA      # ( 𝑌 → Y ) MATHEMATICAL ITALIC CAPITAL Y → LATIN CAPITAL LETTER Y       # 
+1D480 ;        0059 ;  SA      # ( 𝒀 → Y ) MATHEMATICAL BOLD ITALIC CAPITAL Y → LATIN CAPITAL LETTER Y  # 
+1D4B4 ;        0059 ;  SA      # ( 𝒴 → Y ) MATHEMATICAL SCRIPT CAPITAL Y → LATIN CAPITAL LETTER Y       # 
+1D4E8 ;        0059 ;  SA      # ( 𝓨 → Y ) MATHEMATICAL BOLD SCRIPT CAPITAL Y → LATIN CAPITAL LETTER Y  # 
+1D51C ;        0059 ;  SA      # ( 𝔜 → Y ) MATHEMATICAL FRAKTUR CAPITAL Y → LATIN CAPITAL LETTER Y      # 
+1D550 ;        0059 ;  SA      # ( 𝕐 → Y ) MATHEMATICAL DOUBLE-STRUCK CAPITAL Y → LATIN CAPITAL LETTER Y        # 
+1D584 ;        0059 ;  SA      # ( 𝖄 → Y ) MATHEMATICAL BOLD FRAKTUR CAPITAL Y → LATIN CAPITAL LETTER Y # 
+1D5B8 ;        0059 ;  SA      # ( 𝖸 → Y ) MATHEMATICAL SANS-SERIF CAPITAL Y → LATIN CAPITAL LETTER Y   # 
+1D5EC ;        0059 ;  SA      # ( 𝗬 → Y ) MATHEMATICAL SANS-SERIF BOLD CAPITAL Y → LATIN CAPITAL LETTER Y      # 
+1D620 ;        0059 ;  SA      # ( 𝘠 → Y ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y → LATIN CAPITAL LETTER Y    # 
+1D654 ;        0059 ;  SA      # ( 𝙔 → Y ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y → LATIN CAPITAL LETTER Y       # 
+1D688 ;        0059 ;  SA      # ( 𝚈 → Y ) MATHEMATICAL MONOSPACE CAPITAL Y → LATIN CAPITAL LETTER Y    # 
+1D6BC ;        0059 ;  SA      # ( 𝚼 → Y ) MATHEMATICAL BOLD CAPITAL UPSILON → LATIN CAPITAL LETTER Y   # →Υ→
+1D6F6 ;        0059 ;  SA      # ( 𝛶 → Y ) MATHEMATICAL ITALIC CAPITAL UPSILON → LATIN CAPITAL LETTER Y # →Υ→
+1D730 ;        0059 ;  SA      # ( 𝜰 → Y ) MATHEMATICAL BOLD ITALIC CAPITAL UPSILON → LATIN CAPITAL LETTER Y    # →Υ→
+1D76A ;        0059 ;  SA      # ( 𝝪 → Y ) MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON → LATIN CAPITAL LETTER Y        # →Υ→
+1D7A4 ;        0059 ;  SA      # ( 𝞤 → Y ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON → LATIN CAPITAL LETTER Y # →Υ→
+
+01B4 ; 0079 0314 ;     SA      # ( ƴ → y̔ ) LATIN SMALL LETTER Y WITH HOOK → LATIN SMALL LETTER Y, COMBINING REVERSED COMMA ABOVE        # 
+
+00A5 ; 0059 0335 ;     SA      #* ( ¥ → Y̵ ) YEN SIGN → LATIN CAPITAL LETTER Y, COMBINING SHORT STROKE OVERLAY   # 
+
+1D433 ;        007A ;  SA      # ( 𝐳 → z ) MATHEMATICAL BOLD SMALL Z → LATIN SMALL LETTER Z     # 
+1D467 ;        007A ;  SA      # ( 𝑧 → z ) MATHEMATICAL ITALIC SMALL Z → LATIN SMALL LETTER Z   # 
+1D49B ;        007A ;  SA      # ( 𝒛 → z ) MATHEMATICAL BOLD ITALIC SMALL Z → LATIN SMALL LETTER Z      # 
+1D4CF ;        007A ;  SA      # ( 𝓏 → z ) MATHEMATICAL SCRIPT SMALL Z → LATIN SMALL LETTER Z   # 
+1D503 ;        007A ;  SA      # ( 𝔃 → z ) MATHEMATICAL BOLD SCRIPT SMALL Z → LATIN SMALL LETTER Z      # 
+1D537 ;        007A ;  SA      # ( 𝔷 → z ) MATHEMATICAL FRAKTUR SMALL Z → LATIN SMALL LETTER Z  # 
+1D56B ;        007A ;  SA      # ( 𝕫 → z ) MATHEMATICAL DOUBLE-STRUCK SMALL Z → LATIN SMALL LETTER Z    # 
+1D59F ;        007A ;  SA      # ( 𝖟 → z ) MATHEMATICAL BOLD FRAKTUR SMALL Z → LATIN SMALL LETTER Z     # 
+1D5D3 ;        007A ;  SA      # ( 𝗓 → z ) MATHEMATICAL SANS-SERIF SMALL Z → LATIN SMALL LETTER Z       # 
+1D607 ;        007A ;  SA      # ( 𝘇 → z ) MATHEMATICAL SANS-SERIF BOLD SMALL Z → LATIN SMALL LETTER Z  # 
+1D63B ;        007A ;  SA      # ( 𝘻 → z ) MATHEMATICAL SANS-SERIF ITALIC SMALL Z → LATIN SMALL LETTER Z        # 
+1D66F ;        007A ;  SA      # ( 𝙯 → z ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z → LATIN SMALL LETTER Z   # 
+1D6A3 ;        007A ;  SA      # ( 𝚣 → z ) MATHEMATICAL MONOSPACE SMALL Z → LATIN SMALL LETTER Z        # 
+1D22 ; 007A ;  SA      # ( ᴢ → z ) LATIN LETTER SMALL CAPITAL Z → LATIN SMALL LETTER Z   # 
+
+FF3A ; 005A ;  SA      # ( Z → Z ) FULLWIDTH LATIN CAPITAL LETTER Z → LATIN CAPITAL LETTER Z     # →Ζ→
+2124 ; 005A ;  SA      # ( ℤ → Z ) DOUBLE-STRUCK CAPITAL Z → LATIN CAPITAL LETTER Z      # 
+2128 ; 005A ;  SA      # ( ℨ → Z ) BLACK-LETTER CAPITAL Z → LATIN CAPITAL LETTER Z       # 
+1D419 ;        005A ;  SA      # ( 𝐙 → Z ) MATHEMATICAL BOLD CAPITAL Z → LATIN CAPITAL LETTER Z # 
+1D44D ;        005A ;  SA      # ( 𝑍 → Z ) MATHEMATICAL ITALIC CAPITAL Z → LATIN CAPITAL LETTER Z       # 
+1D481 ;        005A ;  SA      # ( 𝒁 → Z ) MATHEMATICAL BOLD ITALIC CAPITAL Z → LATIN CAPITAL LETTER Z  # 
+1D4B5 ;        005A ;  SA      # ( 𝒵 → Z ) MATHEMATICAL SCRIPT CAPITAL Z → LATIN CAPITAL LETTER Z       # 
+1D4E9 ;        005A ;  SA      # ( 𝓩 → Z ) MATHEMATICAL BOLD SCRIPT CAPITAL Z → LATIN CAPITAL LETTER Z  # 
+1D585 ;        005A ;  SA      # ( 𝖅 → Z ) MATHEMATICAL BOLD FRAKTUR CAPITAL Z → LATIN CAPITAL LETTER Z # 
+1D5B9 ;        005A ;  SA      # ( 𝖹 → Z ) MATHEMATICAL SANS-SERIF CAPITAL Z → LATIN CAPITAL LETTER Z   # 
+1D5ED ;        005A ;  SA      # ( 𝗭 → Z ) MATHEMATICAL SANS-SERIF BOLD CAPITAL Z → LATIN CAPITAL LETTER Z      # 
+1D621 ;        005A ;  SA      # ( 𝘡 → Z ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z → LATIN CAPITAL LETTER Z    # 
+1D655 ;        005A ;  SA      # ( 𝙕 → Z ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z → LATIN CAPITAL LETTER Z       # 
+1D689 ;        005A ;  SA      # ( 𝚉 → Z ) MATHEMATICAL MONOSPACE CAPITAL Z → LATIN CAPITAL LETTER Z    # 
+1D6AD ;        005A ;  SA      # ( 𝚭 → Z ) MATHEMATICAL BOLD CAPITAL ZETA → LATIN CAPITAL LETTER Z      # →𝐙→
+1D6E7 ;        005A ;  SA      # ( 𝛧 → Z ) MATHEMATICAL ITALIC CAPITAL ZETA → LATIN CAPITAL LETTER Z    # →Ζ→
+1D721 ;        005A ;  SA      # ( 𝜡 → Z ) MATHEMATICAL BOLD ITALIC CAPITAL ZETA → LATIN CAPITAL LETTER Z       # →Ζ→
+1D75B ;        005A ;  SA      # ( 𝝛 → Z ) MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA → LATIN CAPITAL LETTER Z   # →Ζ→
+1D795 ;        005A ;  SA      # ( 𝞕 → Z ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA → LATIN CAPITAL LETTER Z    # →Ζ→
+
+0290 ; 007A 0328 ;     SA      # ( ʐ → z̨ ) LATIN SMALL LETTER Z WITH RETROFLEX HOOK → LATIN SMALL LETTER Z, COMBINING OGONEK    # →z̢→
+
+0225 ; 007A 0326 ;     SA      # ( ȥ → z̦ ) LATIN SMALL LETTER Z WITH HOOK → LATIN SMALL LETTER Z, COMBINING COMMA BELOW # →z̡→
+
+0224 ; 005A 0326 ;     SA      # ( Ȥ → Z̦ ) LATIN CAPITAL LETTER Z WITH HOOK → LATIN CAPITAL LETTER Z, COMBINING COMMA BELOW     # →Z̧→
+
+01B6 ; 007A 0335 ;     SA      # ( ƶ → z̵ ) LATIN SMALL LETTER Z WITH STROKE → LATIN SMALL LETTER Z, COMBINING SHORT STROKE OVERLAY      # 
+
+01B5 ; 005A 0335 ;     SA      # ( Ƶ → Z̵ ) LATIN CAPITAL LETTER Z WITH STROKE → LATIN CAPITAL LETTER Z, COMBINING SHORT STROKE OVERLAY  # 
+
+0292 ; 021D ;  SA      # ( ʒ → ȝ ) LATIN SMALL LETTER EZH → LATIN SMALL LETTER YOGH      # 
+A76B ; 021D ;  SA      # ( ꝫ → ȝ ) LATIN SMALL LETTER ET → LATIN SMALL LETTER YOGH      # 
+
+01BF ; 00FE ;  SA      # ( ƿ → þ ) LATIN LETTER WYNN → LATIN SMALL LETTER THORN  # 
+
+1D24 ; 01A8 ;  SA      # ( ᴤ → ƨ ) LATIN LETTER VOICED LARYNGEAL SPIRANT → LATIN SMALL LETTER TONE TWO  # 
+
+02C1 ; 02E4 ;  SA      # ( ˁ → ˤ ) MODIFIER LETTER REVERSED GLOTTAL STOP → MODIFIER LETTER SMALL REVERSED GLOTTAL STOP   # 
+
+03D0 ; 03B2 ;  SA      # ( ϐ → β ) GREEK BETA SYMBOL → GREEK SMALL LETTER BETA   # 
+
+03F5 ; 03B5 ;  SA      # ( ϵ → ε ) GREEK LUNATE EPSILON SYMBOL → GREEK SMALL LETTER EPSILON      # 
+
+1D7CB ;        03DD ;  SA      # ( 𝟋 → ϝ ) MATHEMATICAL BOLD SMALL DIGAMMA → GREEK SMALL LETTER DIGAMMA        # 
+
+1D6C7 ;        03B6 ;  SA      # ( 𝛇 → ζ ) MATHEMATICAL BOLD SMALL ZETA → GREEK SMALL LETTER ZETA      # 
+1D701 ;        03B6 ;  SA      # ( 𝜁 → ζ ) MATHEMATICAL ITALIC SMALL ZETA → GREEK SMALL LETTER ZETA    # 
+1D73B ;        03B6 ;  SA      # ( 𝜻 → ζ ) MATHEMATICAL BOLD ITALIC SMALL ZETA → GREEK SMALL LETTER ZETA       # 
+1D775 ;        03B6 ;  SA      # ( 𝝵 → ζ ) MATHEMATICAL SANS-SERIF BOLD SMALL ZETA → GREEK SMALL LETTER ZETA   # 
+1D7AF ;        03B6 ;  SA      # ( 𝞯 → ζ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA → GREEK SMALL LETTER ZETA    # 
+
+03D1 ; 03B8 ;  SA      # ( ϑ → θ ) GREEK THETA SYMBOL → GREEK SMALL LETTER THETA # 
+0398 ; 03B8 ;  SA      # ( Θ → θ ) GREEK CAPITAL LETTER THETA → GREEK SMALL LETTER THETA # →⊖→
+03F4 ; 03B8 ;  SA      # ( ϴ → θ ) GREEK CAPITAL THETA SYMBOL → GREEK SMALL LETTER THETA # →Θ→→⊖→
+
+1FBE ; 03B9 ;  SA      # ( ι → ι ) GREEK PROSGEGRAMMENI → GREEK SMALL LETTER IOTA       # 
+037A ; 03B9 ;  SA      #* ( ͺ → ι ) GREEK YPOGEGRAMMENI → GREEK SMALL LETTER IOTA        # →ι→
+
+03F0 ; 03BA ;  SA      # ( ϰ → κ ) GREEK KAPPA SYMBOL → GREEK SMALL LETTER KAPPA # 
+
+1D6CC ;        03BB ;  SA      # ( 𝛌 → λ ) MATHEMATICAL BOLD SMALL LAMDA → GREEK SMALL LETTER LAMDA    # 
+1D706 ;        03BB ;  SA      # ( 𝜆 → λ ) MATHEMATICAL ITALIC SMALL LAMDA → GREEK SMALL LETTER LAMDA  # 
+1D740 ;        03BB ;  SA      # ( 𝝀 → λ ) MATHEMATICAL BOLD ITALIC SMALL LAMDA → GREEK SMALL LETTER LAMDA     # 
+1D77A ;        03BB ;  SA      # ( 𝝺 → λ ) MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA → GREEK SMALL LETTER LAMDA # 
+1D7B4 ;        03BB ;  SA      # ( 𝞴 → λ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA → GREEK SMALL LETTER LAMDA  # 
+
+00B5 ; 03BC ;  SA      # ( µ → μ ) MICRO SIGN → GREEK SMALL LETTER MU    # 
+1D6CD ;        03BC ;  SA      # ( 𝛍 → μ ) MATHEMATICAL BOLD SMALL MU → GREEK SMALL LETTER MU  # 
+1D707 ;        03BC ;  SA      # ( 𝜇 → μ ) MATHEMATICAL ITALIC SMALL MU → GREEK SMALL LETTER MU        # 
+1D741 ;        03BC ;  SA      # ( 𝝁 → μ ) MATHEMATICAL BOLD ITALIC SMALL MU → GREEK SMALL LETTER MU   # 
+1D77B ;        03BC ;  SA      # ( 𝝻 → μ ) MATHEMATICAL SANS-SERIF BOLD SMALL MU → GREEK SMALL LETTER MU       # 
+1D7B5 ;        03BC ;  SA      # ( 𝞵 → μ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU → GREEK SMALL LETTER MU        # 
+
+03FA ; 039C ;  SA      # ( Ϻ → Μ ) GREEK CAPITAL LETTER SAN → GREEK CAPITAL LETTER MU    # 
+
+1D6CF ;        03BE ;  SA      # ( 𝛏 → ξ ) MATHEMATICAL BOLD SMALL XI → GREEK SMALL LETTER XI  # 
+1D709 ;        03BE ;  SA      # ( 𝜉 → ξ ) MATHEMATICAL ITALIC SMALL XI → GREEK SMALL LETTER XI        # 
+1D743 ;        03BE ;  SA      # ( 𝝃 → ξ ) MATHEMATICAL BOLD ITALIC SMALL XI → GREEK SMALL LETTER XI   # 
+1D77D ;        03BE ;  SA      # ( 𝝽 → ξ ) MATHEMATICAL SANS-SERIF BOLD SMALL XI → GREEK SMALL LETTER XI       # 
+1D7B7 ;        03BE ;  SA      # ( 𝞷 → ξ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI → GREEK SMALL LETTER XI        # 
+
+1D6B5 ;        039E ;  SA      # ( 𝚵 → Ξ ) MATHEMATICAL BOLD CAPITAL XI → GREEK CAPITAL LETTER XI      # 
+1D6EF ;        039E ;  SA      # ( 𝛯 → Ξ ) MATHEMATICAL ITALIC CAPITAL XI → GREEK CAPITAL LETTER XI    # 
+1D729 ;        039E ;  SA      # ( 𝜩 → Ξ ) MATHEMATICAL BOLD ITALIC CAPITAL XI → GREEK CAPITAL LETTER XI       # 
+1D763 ;        039E ;  SA      # ( 𝝣 → Ξ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL XI → GREEK CAPITAL LETTER XI   # 
+1D79D ;        039E ;  SA      # ( 𝞝 → Ξ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI → GREEK CAPITAL LETTER XI    # 
+
+03C3 ; 03BF ;  SA      # ( σ → ο ) GREEK SMALL LETTER SIGMA → GREEK SMALL LETTER OMICRON # →o→
+
+03D6 ; 03C0 ;  SA      # ( ϖ → π ) GREEK PI SYMBOL → GREEK SMALL LETTER PI       # 
+1D28 ; 03C0 ;  SA      # ( ᴨ → π ) GREEK LETTER SMALL CAPITAL PI → GREEK SMALL LETTER PI        # →п→
+
+220F ; 03A0 ;  SA      #* ( ∏ → Π ) N-ARY PRODUCT → GREEK CAPITAL LETTER PI     # 
+213F ; 03A0 ;  SA      # ( ℿ → Π ) DOUBLE-STRUCK CAPITAL PI → GREEK CAPITAL LETTER PI   # 
+1D6B7 ;        03A0 ;  SA      # ( 𝚷 → Π ) MATHEMATICAL BOLD CAPITAL PI → GREEK CAPITAL LETTER PI      # 
+1D6F1 ;        03A0 ;  SA      # ( 𝛱 → Π ) MATHEMATICAL ITALIC CAPITAL PI → GREEK CAPITAL LETTER PI    # 
+1D72B ;        03A0 ;  SA      # ( 𝜫 → Π ) MATHEMATICAL BOLD ITALIC CAPITAL PI → GREEK CAPITAL LETTER PI       # 
+1D765 ;        03A0 ;  SA      # ( 𝝥 → Π ) MATHEMATICAL SANS-SERIF BOLD CAPITAL PI → GREEK CAPITAL LETTER PI   # 
+1D79F ;        03A0 ;  SA      # ( 𝞟 → Π ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI → GREEK CAPITAL LETTER PI    # 
+
+03F1 ; 03C1 ;  SA      # ( ϱ → ρ ) GREEK RHO SYMBOL → GREEK SMALL LETTER RHO     # 
+
+1D6D3 ;        03C2 ;  SA      # ( 𝛓 → ς ) MATHEMATICAL BOLD SMALL FINAL SIGMA → GREEK SMALL LETTER FINAL SIGMA        # 
+1D70D ;        03C2 ;  SA      # ( 𝜍 → ς ) MATHEMATICAL ITALIC SMALL FINAL SIGMA → GREEK SMALL LETTER FINAL SIGMA      # 
+1D747 ;        03C2 ;  SA      # ( 𝝇 → ς ) MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA → GREEK SMALL LETTER FINAL SIGMA # 
+1D781 ;        03C2 ;  SA      # ( 𝞁 → ς ) MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA → GREEK SMALL LETTER FINAL SIGMA     # 
+1D7BB ;        03C2 ;  SA      # ( 𝞻 → ς ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA → GREEK SMALL LETTER FINAL SIGMA      # 
+
+03D2 ; 03A5 ;  SA      # ( ϒ → Υ ) GREEK UPSILON WITH HOOK SYMBOL → GREEK CAPITAL LETTER UPSILON # 
+
+03D5 ; 03C6 ;  SA      # ( ϕ → φ ) GREEK PHI SYMBOL → GREEK SMALL LETTER PHI     # 
+
+1D6BD ;        03A6 ;  SA      # ( 𝚽 → Φ ) MATHEMATICAL BOLD CAPITAL PHI → GREEK CAPITAL LETTER PHI    # 
+1D6F7 ;        03A6 ;  SA      # ( 𝛷 → Φ ) MATHEMATICAL ITALIC CAPITAL PHI → GREEK CAPITAL LETTER PHI  # 
+1D731 ;        03A6 ;  SA      # ( 𝜱 → Φ ) MATHEMATICAL BOLD ITALIC CAPITAL PHI → GREEK CAPITAL LETTER PHI     # 
+1D76B ;        03A6 ;  SA      # ( 𝝫 → Φ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI → GREEK CAPITAL LETTER PHI # 
+1D7A5 ;        03A6 ;  SA      # ( 𝞥 → Φ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI → GREEK CAPITAL LETTER PHI  # 
+
+1D6D8 ;        03C7 ;  SA      # ( 𝛘 → χ ) MATHEMATICAL BOLD SMALL CHI → GREEK SMALL LETTER CHI        # 
+1D712 ;        03C7 ;  SA      # ( 𝜒 → χ ) MATHEMATICAL ITALIC SMALL CHI → GREEK SMALL LETTER CHI      # 
+1D74C ;        03C7 ;  SA      # ( 𝝌 → χ ) MATHEMATICAL BOLD ITALIC SMALL CHI → GREEK SMALL LETTER CHI # 
+1D786 ;        03C7 ;  SA      # ( 𝞆 → χ ) MATHEMATICAL SANS-SERIF BOLD SMALL CHI → GREEK SMALL LETTER CHI     # 
+1D7C0 ;        03C7 ;  SA      # ( 𝟀 → χ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI → GREEK SMALL LETTER CHI      # 
+
+1D6D9 ;        03C8 ;  SA      # ( 𝛙 → ψ ) MATHEMATICAL BOLD SMALL PSI → GREEK SMALL LETTER PSI        # 
+1D713 ;        03C8 ;  SA      # ( 𝜓 → ψ ) MATHEMATICAL ITALIC SMALL PSI → GREEK SMALL LETTER PSI      # 
+1D74D ;        03C8 ;  SA      # ( 𝝍 → ψ ) MATHEMATICAL BOLD ITALIC SMALL PSI → GREEK SMALL LETTER PSI # 
+1D787 ;        03C8 ;  SA      # ( 𝞇 → ψ ) MATHEMATICAL SANS-SERIF BOLD SMALL PSI → GREEK SMALL LETTER PSI     # 
+1D7C1 ;        03C8 ;  SA      # ( 𝟁 → ψ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI → GREEK SMALL LETTER PSI      # 
+
+1D6BF ;        03A8 ;  SA      # ( 𝚿 → Ψ ) MATHEMATICAL BOLD CAPITAL PSI → GREEK CAPITAL LETTER PSI    # 
+1D6F9 ;        03A8 ;  SA      # ( 𝛹 → Ψ ) MATHEMATICAL ITALIC CAPITAL PSI → GREEK CAPITAL LETTER PSI  # 
+1D733 ;        03A8 ;  SA      # ( 𝜳 → Ψ ) MATHEMATICAL BOLD ITALIC CAPITAL PSI → GREEK CAPITAL LETTER PSI     # 
+1D76D ;        03A8 ;  SA      # ( 𝝭 → Ψ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI → GREEK CAPITAL LETTER PSI # 
+1D7A7 ;        03A8 ;  SA      # ( 𝞧 → Ψ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI → GREEK CAPITAL LETTER PSI  # 
+
+2375 ; 03C9 ;  SA      #* ( ⍵ → ω ) APL FUNCTIONAL SYMBOL OMEGA → GREEK SMALL LETTER OMEGA      # 
+1D6DA ;        03C9 ;  SA      # ( 𝛚 → ω ) MATHEMATICAL BOLD SMALL OMEGA → GREEK SMALL LETTER OMEGA    # 
+1D714 ;        03C9 ;  SA      # ( 𝜔 → ω ) MATHEMATICAL ITALIC SMALL OMEGA → GREEK SMALL LETTER OMEGA  # 
+1D74E ;        03C9 ;  SA      # ( 𝝎 → ω ) MATHEMATICAL BOLD ITALIC SMALL OMEGA → GREEK SMALL LETTER OMEGA     # 
+1D788 ;        03C9 ;  SA      # ( 𝞈 → ω ) MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA → GREEK SMALL LETTER OMEGA # 
+1D7C2 ;        03C9 ;  SA      # ( 𝟂 → ω ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA → GREEK SMALL LETTER OMEGA  # 
+
+2126 ; 03A9 ;  SA      # ( Ω → Ω ) OHM SIGN → GREEK CAPITAL LETTER OMEGA        # 
+
+1F7D ; 1FF4 ;  SA      # ( ώ → ῴ ) GREEK SMALL LETTER OMEGA WITH OXIA → GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI   # 
+
+2630 ; 2CB6 ;  SA      #* ( ☰ → Ⲷ ) TRIGRAM FOR HEAVEN → COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE       # 
+
+2CDC ; 03EC ;  SA      # ( Ⳝ → Ϭ ) COPTIC CAPITAL LETTER OLD NUBIAN SHIMA → COPTIC CAPITAL LETTER SHIMA # 
+
+04D5 ; 0430 0435 ;     SA      # ( ӕ → ае ) CYRILLIC SMALL LIGATURE A IE → CYRILLIC SMALL LETTER A, CYRILLIC SMALL LETTER IE    # 
+
+0493 ; 0433 0335 ;     SA      # ( ғ → г̵ ) CYRILLIC SMALL LETTER GHE WITH STROKE → CYRILLIC SMALL LETTER GHE, COMBINING SHORT STROKE OVERLAY   # 
+
+0492 ; 0413 0335 ;     SA      # ( Ғ → Г̵ ) CYRILLIC CAPITAL LETTER GHE WITH STROKE → CYRILLIC CAPITAL LETTER GHE, COMBINING SHORT STROKE OVERLAY       # 
+
+0491 ; 0433 02C8 ;     SA      # ( ґ → гˈ ) CYRILLIC SMALL LETTER GHE WITH UPTURN → CYRILLIC SMALL LETTER GHE, MODIFIER LETTER VERTICAL LINE    # 
+
+0490 ; 0413 02C8 ;     SA      # ( Ґ → Гˈ ) CYRILLIC CAPITAL LETTER GHE WITH UPTURN → CYRILLIC CAPITAL LETTER GHE, MODIFIER LETTER VERTICAL LINE        # 
+
+0511 ; 0454 ;  SA      # ( ԑ → є ) CYRILLIC SMALL LETTER REVERSED ZE → CYRILLIC SMALL LETTER UKRAINIAN IE        # →ε→
+
+0510 ; 0404 ;  SA      # ( Ԑ → Є ) CYRILLIC CAPITAL LETTER REVERSED ZE → CYRILLIC CAPITAL LETTER UKRAINIAN IE    # →ℇ→
+
+0497 ; 0436 0329 ;     SA      # ( җ → ж̩ ) CYRILLIC SMALL LETTER ZHE WITH DESCENDER → CYRILLIC SMALL LETTER ZHE, COMBINING VERTICAL LINE BELOW # 
+
+0496 ; 0416 0329 ;     SA      # ( Җ → Ж̩ ) CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER → CYRILLIC CAPITAL LETTER ZHE, COMBINING VERTICAL LINE BELOW     # 
+
+0499 ; 0437 0321 ;     SA      # ( ҙ → з̡ ) CYRILLIC SMALL LETTER ZE WITH DESCENDER → CYRILLIC SMALL LETTER ZE, COMBINING PALATALIZED HOOK BELOW        # 
+
+0419 ; 040D ;  SA      # ( Й → Ѝ ) CYRILLIC CAPITAL LETTER SHORT I → CYRILLIC CAPITAL LETTER I WITH GRAVE        # 
+
+048A ; 040D 0326 ;     SA      # ( Ҋ → Ѝ̦ ) CYRILLIC CAPITAL LETTER SHORT I WITH TAIL → CYRILLIC CAPITAL LETTER I WITH GRAVE, COMBINING COMMA BELOW     # →Й̡→
+
+04CF ; 0456 ;  SA      # ( ӏ → і ) CYRILLIC SMALL LETTER PALOCHKA → CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I       # →ı→→ι→
+
+045D ; 0439 ;  SA      # ( ѝ → й ) CYRILLIC SMALL LETTER I WITH GRAVE → CYRILLIC SMALL LETTER SHORT I    # 
+
+048B ; 0439 0326 ;     SA      # ( ҋ → й̦ ) CYRILLIC SMALL LETTER SHORT I WITH TAIL → CYRILLIC SMALL LETTER SHORT I, COMBINING COMMA BELOW      # →й̡→
+
+049B ; 043A 0329 ;     SA      # ( қ → к̩ ) CYRILLIC SMALL LETTER KA WITH DESCENDER → CYRILLIC SMALL LETTER KA, COMBINING VERTICAL LINE BELOW   # 
+
+049A ; 041A 0329 ;     SA      # ( Қ → К̩ ) CYRILLIC CAPITAL LETTER KA WITH DESCENDER → CYRILLIC CAPITAL LETTER KA, COMBINING VERTICAL LINE BELOW       # 
+
+049F ; 043A 0335 ;     SA      # ( ҟ → к̵ ) CYRILLIC SMALL LETTER KA WITH STROKE → CYRILLIC SMALL LETTER KA, COMBINING SHORT STROKE OVERLAY     # 
+
+049E ; 041A 0335 ;     SA      # ( Ҟ → К̵ ) CYRILLIC CAPITAL LETTER KA WITH STROKE → CYRILLIC CAPITAL LETTER KA, COMBINING SHORT STROKE OVERLAY # 
+
+1D2B ; 043B ;  SA      # ( ᴫ → л ) CYRILLIC LETTER SMALL CAPITAL EL → CYRILLIC SMALL LETTER EL  # 
+
+04C6 ; 043B 0326 ;     SA      # ( ӆ → л̦ ) CYRILLIC SMALL LETTER EL WITH TAIL → CYRILLIC SMALL LETTER EL, COMBINING COMMA BELOW        # →л̡→
+
+04C5 ; 041B 0326 ;     SA      # ( Ӆ → Л̦ ) CYRILLIC CAPITAL LETTER EL WITH TAIL → CYRILLIC CAPITAL LETTER EL, COMBINING COMMA BELOW    # →Л̡→
+
+04CE ; 043C 0321 ;     SA      # ( ӎ → м̡ ) CYRILLIC SMALL LETTER EM WITH TAIL → CYRILLIC SMALL LETTER EM, COMBINING PALATALIZED HOOK BELOW     # 
+
+04CD ; 041C 0321 ;     SA      # ( Ӎ → М̡ ) CYRILLIC CAPITAL LETTER EM WITH TAIL → CYRILLIC CAPITAL LETTER EM, COMBINING PALATALIZED HOOK BELOW # 
+
+04A3 ; 043D 0329 ;     SA      # ( ң → н̩ ) CYRILLIC SMALL LETTER EN WITH DESCENDER → CYRILLIC SMALL LETTER EN, COMBINING VERTICAL LINE BELOW   # 
+
+04A2 ; 041D 0329 ;     SA      # ( Ң → Н̩ ) CYRILLIC CAPITAL LETTER EN WITH DESCENDER → CYRILLIC CAPITAL LETTER EN, COMBINING VERTICAL LINE BELOW       # 
+
+04CA ; 043D 0321 ;     SA      # ( ӊ → н̡ ) CYRILLIC SMALL LETTER EN WITH TAIL → CYRILLIC SMALL LETTER EN, COMBINING PALATALIZED HOOK BELOW     # 
+04C8 ; 043D 0321 ;     SA      # ( ӈ → н̡ ) CYRILLIC SMALL LETTER EN WITH HOOK → CYRILLIC SMALL LETTER EN, COMBINING PALATALIZED HOOK BELOW     # 
+
+04C9 ; 041D 0321 ;     SA      # ( Ӊ → Н̡ ) CYRILLIC CAPITAL LETTER EN WITH TAIL → CYRILLIC CAPITAL LETTER EN, COMBINING PALATALIZED HOOK BELOW # 
+04C7 ; 041D 0321 ;     SA      # ( Ӈ → Н̡ ) CYRILLIC CAPITAL LETTER EN WITH HOOK → CYRILLIC CAPITAL LETTER EN, COMBINING PALATALIZED HOOK BELOW # 
+
+04E9 ; 043E 0335 ;     SA      # ( ө → о̵ ) CYRILLIC SMALL LETTER BARRED O → CYRILLIC SMALL LETTER O, COMBINING SHORT STROKE OVERLAY    # 
+0473 ; 043E 0335 ;     SA      # ( ѳ → о̵ ) CYRILLIC SMALL LETTER FITA → CYRILLIC SMALL LETTER O, COMBINING SHORT STROKE OVERLAY        # 
+
+04E8 ; 041E 0335 ;     SA      # ( Ө → О̵ ) CYRILLIC CAPITAL LETTER BARRED O → CYRILLIC CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY        # →Ѳ→
+0472 ; 041E 0335 ;     SA      # ( Ѳ → О̵ ) CYRILLIC CAPITAL LETTER FITA → CYRILLIC CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY    # 
+
+04AB ; 0441 0321 ;     SA      # ( ҫ → с̡ ) CYRILLIC SMALL LETTER ES WITH DESCENDER → CYRILLIC SMALL LETTER ES, COMBINING PALATALIZED HOOK BELOW        # 
+
+04AA ; 0421 0321 ;     SA      # ( Ҫ → С̡ ) CYRILLIC CAPITAL LETTER ES WITH DESCENDER → CYRILLIC CAPITAL LETTER ES, COMBINING PALATALIZED HOOK BELOW    # 
+
+04AD ; 0442 0329 ;     SA      # ( ҭ → т̩ ) CYRILLIC SMALL LETTER TE WITH DESCENDER → CYRILLIC SMALL LETTER TE, COMBINING VERTICAL LINE BELOW   # 
+
+04AC ; 0422 0329 ;     SA      # ( Ҭ → Т̩ ) CYRILLIC CAPITAL LETTER TE WITH DESCENDER → CYRILLIC CAPITAL LETTER TE, COMBINING VERTICAL LINE BELOW       # 
+
+04AF ; 0443 ;  SA      # ( ү → у ) CYRILLIC SMALL LETTER STRAIGHT U → CYRILLIC SMALL LETTER U    # 
+
+04B1 ; 04AF 0335 ;     SA      # ( ұ → ү̵ ) CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE → CYRILLIC SMALL LETTER STRAIGHT U, COMBINING SHORT STROKE OVERLAY     # 
+
+04B0 ; 04AE 0335 ;     SA      # ( Ұ → Ү̵ ) CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE → CYRILLIC CAPITAL LETTER STRAIGHT U, COMBINING SHORT STROKE OVERLAY # 
+
+04B2 ; 0425 0329 ;     SA      # ( Ҳ → Х̩ ) CYRILLIC CAPITAL LETTER HA WITH DESCENDER → CYRILLIC CAPITAL LETTER HA, COMBINING VERTICAL LINE BELOW       # 
+
+045B ; 04BB 0335 ;     SA      # ( ћ → һ̵ ) CYRILLIC SMALL LETTER TSHE → CYRILLIC SMALL LETTER SHHA, COMBINING SHORT STROKE OVERLAY     # 
+
+047D ; 0461 0483 ;     SA      # ( ѽ → ѡ҃ ) CYRILLIC SMALL LETTER OMEGA WITH TITLO → CYRILLIC SMALL LETTER OMEGA, COMBINING CYRILLIC TITLO      # 
+
+047C ; 0460 0483 ;     SA      # ( Ѽ → Ѡ҃ ) CYRILLIC CAPITAL LETTER OMEGA WITH TITLO → CYRILLIC CAPITAL LETTER OMEGA, COMBINING CYRILLIC TITLO  # 
+
+04CC ; 04B7 ;  SA      # ( ӌ → ҷ ) CYRILLIC SMALL LETTER KHAKASSIAN CHE → CYRILLIC SMALL LETTER CHE WITH DESCENDER       # 
+
+04CB ; 04B6 ;  SA      # ( Ӌ → Ҷ ) CYRILLIC CAPITAL LETTER KHAKASSIAN CHE → CYRILLIC CAPITAL LETTER CHE WITH DESCENDER   # 
+
+04BF ; 04BD 0328 ;     SA      # ( ҿ → ҽ̨ ) CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER → CYRILLIC SMALL LETTER ABKHASIAN CHE, COMBINING OGONEK  # →ҽ̢→
+
+04BE ; 04BC 0328 ;     SA      # ( Ҿ → Ҽ̨ ) CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER → CYRILLIC CAPITAL LETTER ABKHASIAN CHE, COMBINING OGONEK      # 
+
+048D ; 042C 0335 ;     SA      # ( ҍ → Ь̵ ) CYRILLIC SMALL LETTER SEMISOFT SIGN → CYRILLIC CAPITAL LETTER SOFT SIGN, COMBINING SHORT STROKE OVERLAY     # →ѣ→
+048C ; 042C 0335 ;     SA      # ( Ҍ → Ь̵ ) CYRILLIC CAPITAL LETTER SEMISOFT SIGN → CYRILLIC CAPITAL LETTER SOFT SIGN, COMBINING SHORT STROKE OVERLAY   # →Ѣ→
+0463 ; 042C 0335 ;     SA      # ( ѣ → Ь̵ ) CYRILLIC SMALL LETTER YAT → CYRILLIC CAPITAL LETTER SOFT SIGN, COMBINING SHORT STROKE OVERLAY       # 
+0462 ; 042C 0335 ;     SA      # ( Ѣ → Ь̵ ) CYRILLIC CAPITAL LETTER YAT → CYRILLIC CAPITAL LETTER SOFT SIGN, COMBINING SHORT STROKE OVERLAY     # 
+
+042B ; 042C 0406 ;     SA      # ( Ы → ЬІ ) CYRILLIC CAPITAL LETTER YERU → CYRILLIC CAPITAL LETTER SOFT SIGN, CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I  # 
+
+2108 ; 042D ;  SA      #* ( ℈ → Э ) SCRUPLE → CYRILLIC CAPITAL LETTER E # 
+
+0461 ; 051D ;  SA      # ( ѡ → ԝ ) CYRILLIC SMALL LETTER OMEGA → CYRILLIC SMALL LETTER WE        # →w→
+
+0566 ; 0563 ;  SA      # ( զ → գ ) ARMENIAN SMALL LETTER ZA → ARMENIAN SMALL LETTER GIM  # 
+
+0587 ; 0565 0582 ;     SA      # ( և → եւ ) ARMENIAN SMALL LIGATURE ECH YIWN → ARMENIAN SMALL LETTER ECH, ARMENIAN SMALL LETTER YIWN    # 
+
+FB14 ; 0574 0565 ;     SA      # ( ﬔ → մե ) ARMENIAN SMALL LIGATURE MEN ECH → ARMENIAN SMALL LETTER MEN, ARMENIAN SMALL LETTER ECH     # 
+
+FB15 ; 0574 056B ;     SA      # ( ﬕ → մի ) ARMENIAN SMALL LIGATURE MEN INI → ARMENIAN SMALL LETTER MEN, ARMENIAN SMALL LETTER INI     # 
+
+FB17 ; 0574 056D ;     SA      # ( ﬗ → մխ ) ARMENIAN SMALL LIGATURE MEN XEH → ARMENIAN SMALL LETTER MEN, ARMENIAN SMALL LETTER XEH     # 
+
+FB13 ; 0574 0576 ;     SA      # ( ﬓ → մն ) ARMENIAN SMALL LIGATURE MEN NOW → ARMENIAN SMALL LETTER MEN, ARMENIAN SMALL LETTER NOW     # 
+
+057C ; 0578 ;  SA      # ( ռ → ո ) ARMENIAN SMALL LETTER RA → ARMENIAN SMALL LETTER VO   # →n→
+
+FB16 ; 057E 0576 ;     SA      # ( ﬖ → վն ) ARMENIAN SMALL LIGATURE VEW NOW → ARMENIAN SMALL LETTER VEW, ARMENIAN SMALL LETTER NOW     # 
+
+02D3 ; 0559 ;  SA      #* ( ˓ → ՙ ) MODIFIER LETTER CENTRED LEFT HALF RING → ARMENIAN MODIFIER LETTER LEFT HALF RING     # 
+02BF ; 0559 ;  SA      # ( ʿ → ՙ ) MODIFIER LETTER LEFT HALF RING → ARMENIAN MODIFIER LETTER LEFT HALF RING      # 
+
+2135 ; 05D0 ;  SA      # ( ℵ → ‎א‎ ) ALEF SYMBOL → HEBREW LETTER ALEF       # 
+FB21 ; 05D0 ;  SA      # ( ‎ﬡ‎ → ‎א‎ ) HEBREW LETTER WIDE ALEF → HEBREW LETTER ALEF     # 
+
+FB2F ; FB2E ;  SA      # ( ‎אָ‎ → ‎אַ‎ ) HEBREW LETTER ALEF WITH QAMATS → HEBREW LETTER ALEF WITH PATAH  # 
+FB30 ; FB2E ;  SA      # ( ‎אּ‎ → ‎אַ‎ ) HEBREW LETTER ALEF WITH MAPIQ → HEBREW LETTER ALEF WITH PATAH   # 
+
+FB4F ; 05D0 05DC ;     SA      # ( ‎ﭏ‎ → ‎אל‎ ) HEBREW LIGATURE ALEF LAMED → HEBREW LETTER ALEF, HEBREW LETTER LAMED   # 
+
+2136 ; 05D1 ;  SA      # ( ℶ → ‎ב‎ ) BET SYMBOL → HEBREW LETTER BET # 
+
+2137 ; 05D2 ;  SA      # ( ℷ → ‎ג‎ ) GIMEL SYMBOL → HEBREW LETTER GIMEL     # 
+
+2138 ; 05D3 ;  SA      # ( ℸ → ‎ד‎ ) DALET SYMBOL → HEBREW LETTER DALET     # 
+FB22 ; 05D3 ;  SA      # ( ‎ﬢ‎ → ‎ד‎ ) HEBREW LETTER WIDE DALET → HEBREW LETTER DALET   # 
+
+FB23 ; 05D4 ;  SA      # ( ‎ﬣ‎ → ‎ה‎ ) HEBREW LETTER WIDE HE → HEBREW LETTER HE # 
+
+05F1 ; 05D5 05D9 ;     SA      # ( ‎ױ‎ → ‎וי‎ ) HEBREW LIGATURE YIDDISH VAV YOD → HEBREW LETTER VAV, HEBREW LETTER YOD  # 
+
+FB39 ; FB1D ;  SA      # ( ‎יּ‎ → ‎יִ‎ ) HEBREW LETTER YOD WITH DAGESH → HEBREW LETTER YOD WITH HIRIQ    # 
+
+FB24 ; 05DB ;  SA      # ( ‎ﬤ‎ → ‎כ‎ ) HEBREW LETTER WIDE KAF → HEBREW LETTER KAF       # 
+
+FB25 ; 05DC ;  SA      # ( ‎ﬥ‎ → ‎ל‎ ) HEBREW LETTER WIDE LAMED → HEBREW LETTER LAMED   # 
+
+FB26 ; 05DD ;  SA      # ( ‎ﬦ‎ → ‎ם‎ ) HEBREW LETTER WIDE FINAL MEM → HEBREW LETTER FINAL MEM   # 
+
+FB20 ; 05E2 ;  SA      # ( ‎ﬠ‎ → ‎ע‎ ) HEBREW LETTER ALTERNATIVE AYIN → HEBREW LETTER AYIN      # 
+
+FB27 ; 05E8 ;  SA      # ( ‎ﬧ‎ → ‎ר‎ ) HEBREW LETTER WIDE RESH → HEBREW LETTER RESH     # 
+
+FB2B ; FB2A ;  SA      # ( ‎שׂ‎ → ‎שׁ‎ ) HEBREW LETTER SHIN WITH SIN DOT → HEBREW LETTER SHIN WITH SHIN DOT      # 
+FB49 ; FB2A ;  SA      # ( ‎שּ‎ → ‎שׁ‎ ) HEBREW LETTER SHIN WITH DAGESH → HEBREW LETTER SHIN WITH SHIN DOT       # 
+
+FB2D ; FB2C ;  SA      # ( ‎שּׂ‎ → ‎שּׁ‎ ) HEBREW LETTER SHIN WITH DAGESH AND SIN DOT → HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT        # 
+
+FB28 ; 05EA ;  SA      # ( ‎ﬨ‎ → ‎ת‎ ) HEBREW LETTER WIDE TAV → HEBREW LETTER TAV       # 
+
+FE80 ; 0621 ;  SA      # ( ‎ﺀ‎ → ‎ء‎ ) ARABIC LETTER HAMZA ISOLATED FORM → ARABIC LETTER HAMZA  # 
+
+FE82 ; 0622 ;  SA      # ( ‎ﺂ‎ → ‎آ‎ ) ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM → ARABIC LETTER ALEF WITH MADDA ABOVE     # 
+FE81 ; 0622 ;  SA      # ( ‎ﺁ‎ → ‎آ‎ ) ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM → ARABIC LETTER ALEF WITH MADDA ABOVE  # 
+
+FB51 ; 0671 ;  SA      # ( ‎ﭑ‎ → ‎ٱ‎ ) ARABIC LETTER ALEF WASLA FINAL FORM → ARABIC LETTER ALEF WASLA   # 
+FB50 ; 0671 ;  SA      # ( ‎ﭐ‎ → ‎ٱ‎ ) ARABIC LETTER ALEF WASLA ISOLATED FORM → ARABIC LETTER ALEF WASLA        # 
+
+FE88 ; 0625 ;  SA      # ( ‎ﺈ‎ → ‎إ‎ ) ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM → ARABIC LETTER ALEF WITH HAMZA BELOW     # 
+FE87 ; 0625 ;  SA      # ( ‎ﺇ‎ → ‎إ‎ ) ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM → ARABIC LETTER ALEF WITH HAMZA BELOW  # 
+
+FE8E ; 0627 ;  SA      # ( ‎ﺎ‎ → ‎ا‎ ) ARABIC LETTER ALEF FINAL FORM → ARABIC LETTER ALEF       # 
+FE8D ; 0627 ;  SA      # ( ‎ﺍ‎ → ‎ا‎ ) ARABIC LETTER ALEF ISOLATED FORM → ARABIC LETTER ALEF    # 
+
+FD3C ; 0627 064B ;     SA      # ( ‎ﴼ‎ → ‎اً‎ ) ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM → ARABIC LETTER ALEF, ARABIC FATHATAN    # 
+FD3D ; 0627 064B ;     SA      # ( ‎ﴽ‎ → ‎اً‎ ) ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM → ARABIC LETTER ALEF, ARABIC FATHATAN # 
+
+0623 ; 0627 0674 ;     SA      # ( ‎أ‎ → ‎اٴ‎ ) ARABIC LETTER ALEF WITH HAMZA ABOVE → ARABIC LETTER ALEF, ARABIC LETTER HIGH HAMZA      # →‎ٵ‎→
+FE84 ; 0627 0674 ;     SA      # ( ‎ﺄ‎ → ‎اٴ‎ ) ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM → ARABIC LETTER ALEF, ARABIC LETTER HIGH HAMZA  # →‎أ‎→→‎ٵ‎→
+FE83 ; 0627 0674 ;     SA      # ( ‎ﺃ‎ → ‎اٴ‎ ) ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM → ARABIC LETTER ALEF, ARABIC LETTER HIGH HAMZA       # →‎ٵ‎→
+0675 ; 0627 0674 ;     SA      # ( ‎ٵ‎ → ‎اٴ‎ ) ARABIC LETTER HIGH HAMZA ALEF → ARABIC LETTER ALEF, ARABIC LETTER HIGH HAMZA    # 
+
+FDF3 ; 0627 0643 0628 0631 ;   SA      # ( ‎ﷳ‎ → ‎اكبر‎ ) ARABIC LIGATURE AKBAR ISOLATED FORM → ARABIC LETTER ALEF, ARABIC LETTER KAF, ARABIC LETTER BEH, ARABIC LETTER REH  # 
+
+FDF2 ; 0627 0644 0644 0647 ;   SA      # ( ‎ﷲ‎ → ‎الله‎ ) ARABIC LIGATURE ALLAH ISOLATED FORM → ARABIC LETTER ALEF, ARABIC LETTER LAM, ARABIC LETTER LAM, ARABIC LETTER HEH  # 
+
+FE91 ; 0628 ;  SA      # ( ‎ﺑ‎ → ‎ب‎ ) ARABIC LETTER BEH INITIAL FORM → ARABIC LETTER BEH       # 
+FE92 ; 0628 ;  SA      # ( ‎ﺒ‎ → ‎ب‎ ) ARABIC LETTER BEH MEDIAL FORM → ARABIC LETTER BEH        # 
+FE90 ; 0628 ;  SA      # ( ‎ﺐ‎ → ‎ب‎ ) ARABIC LETTER BEH FINAL FORM → ARABIC LETTER BEH # 
+FE8F ; 0628 ;  SA      # ( ‎ﺏ‎ → ‎ب‎ ) ARABIC LETTER BEH ISOLATED FORM → ARABIC LETTER BEH      # 
+0646 ; 0628 ;  SA      # ( ‎ن‎ → ‎ب‎ ) ARABIC LETTER NOON → ARABIC LETTER BEH    # →‎ﻨ‎→→‎ﺒ‎→
+FEE7 ; 0628 ;  SA      # ( ‎ﻧ‎ → ‎ب‎ ) ARABIC LETTER NOON INITIAL FORM → ARABIC LETTER BEH      # →‎ﺒ‎→
+FEE8 ; 0628 ;  SA      # ( ‎ﻨ‎ → ‎ب‎ ) ARABIC LETTER NOON MEDIAL FORM → ARABIC LETTER BEH       # →‎ﺒ‎→
+FEE6 ; 0628 ;  SA      # ( ‎ﻦ‎ → ‎ب‎ ) ARABIC LETTER NOON FINAL FORM → ARABIC LETTER BEH        # →‎ن‎→→‎ﻨ‎→→‎ﺒ‎→
+FEE5 ; 0628 ;  SA      # ( ‎ﻥ‎ → ‎ب‎ ) ARABIC LETTER NOON ISOLATED FORM → ARABIC LETTER BEH     # →‎ن‎→→‎ﻨ‎→→‎ﺒ‎→
+
+FC6D ; 0628 0628 ;     SA      # ( ‎ﱭ‎ → ‎بب‎ ) ARABIC LIGATURE BEH WITH NOON FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER BEH        # →‎بن‎→
+FC8D ; 0628 0628 ;     SA      # ( ‎ﲍ‎ → ‎بب‎ ) ARABIC LIGATURE NOON WITH NOON FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER BEH       # →‎نن‎→
+
+FC9C ; 0628 062C ;     SA      # ( ‎ﲜ‎ → ‎بج‎ ) ARABIC LIGATURE BEH WITH JEEM INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM     # 
+FC05 ; 0628 062C ;     SA      # ( ‎ﰅ‎ → ‎بج‎ ) ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM    # 
+FC9E ; 0628 062C ;     SA      # ( ‎ﲞ‎ → ‎بج‎ ) ARABIC LIGATURE BEH WITH KHAH INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM     # →‎بخ‎→→‎ﰇ‎→→‎ﰅ‎→
+FC07 ; 0628 062C ;     SA      # ( ‎ﰇ‎ → ‎بج‎ ) ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM    # →‎ﰅ‎→
+FCD2 ; 0628 062C ;     SA      # ( ‎ﳒ‎ → ‎بج‎ ) ARABIC LIGATURE NOON WITH JEEM INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM    # →‎ﲞ‎→→‎بخ‎→→‎ﰇ‎→→‎ﰅ‎→
+FC4B ; 0628 062C ;     SA      # ( ‎ﱋ‎ → ‎بج‎ ) ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM   # →‎نج‎→→‎ﳒ‎→→‎ﲞ‎→→‎بخ‎→→‎ﰇ‎→→‎ﰅ‎→
+FCD4 ; 0628 062C ;     SA      # ( ‎ﳔ‎ → ‎بج‎ ) ARABIC LIGATURE NOON WITH KHAH INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM    # →‎نخ‎→→‎ﱍ‎→→‎ﱋ‎→→‎نج‎→→‎ﳒ‎→→‎ﲞ‎→→‎بخ‎→→‎ﰇ‎→→‎ﰅ‎→
+FC4D ; 0628 062C ;     SA      # ( ‎ﱍ‎ → ‎بج‎ ) ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM   # →‎ﱋ‎→→‎نج‎→→‎ﳒ‎→→‎ﲞ‎→→‎بخ‎→→‎ﰇ‎→→‎ﰅ‎→
+
+FDB8 ; 0628 062C 062D ;        SA      # ( ‎ﶸ‎ → ‎بجح‎ ) ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM, ARABIC LETTER HAH      # →‎نجح‎→
+FDBD ; 0628 062C 062D ;        SA      # ( ‎ﶽ‎ → ‎بجح‎ ) ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM, ARABIC LETTER HAH        # →‎نجح‎→
+
+FD98 ; 0628 062C 0645 ;        SA      # ( ‎ﶘ‎ → ‎بجم‎ ) ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM, ARABIC LETTER MEEM    # →‎نجم‎→
+FD97 ; 0628 062C 0645 ;        SA      # ( ‎ﶗ‎ → ‎بجم‎ ) ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM, ARABIC LETTER MEEM      # →‎نجم‎→
+
+FD9E ; 0628 062C 0649 ;        SA      # ( ‎ﶞ‎ → ‎بجى‎ ) ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA        # →‎بخي‎→
+FD99 ; 0628 062C 0649 ;        SA      # ( ‎ﶙ‎ → ‎بجى‎ ) ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA      # →‎نجى‎→
+FDC7 ; 0628 062C 0649 ;        SA      # ( ‎ﷇ‎ → ‎بجى‎ ) ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA       # →‎نجي‎→
+
+FC9D ; 0628 062D ;     SA      # ( ‎ﲝ‎ → ‎بح‎ ) ARABIC LIGATURE BEH WITH HAH INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER HAH       # 
+FC06 ; 0628 062D ;     SA      # ( ‎ﰆ‎ → ‎بح‎ ) ARABIC LIGATURE BEH WITH HAH ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER HAH      # 
+FCD3 ; 0628 062D ;     SA      # ( ‎ﳓ‎ → ‎بح‎ ) ARABIC LIGATURE NOON WITH HAH INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER HAH      # →‎نح‎→
+FC4C ; 0628 062D ;     SA      # ( ‎ﱌ‎ → ‎بح‎ ) ARABIC LIGATURE NOON WITH HAH ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER HAH     # →‎نح‎→
+
+FD95 ; 0628 062D 0645 ;        SA      # ( ‎ﶕ‎ → ‎بحم‎ ) ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER HAH, ARABIC LETTER MEEM      # →‎نحم‎→
+
+FDC2 ; 0628 062D 0649 ;        SA      # ( ‎ﷂ‎ → ‎بحى‎ ) ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA  # →‎بحي‎→
+FD96 ; 0628 062D 0649 ;        SA      # ( ‎ﶖ‎ → ‎بحى‎ ) ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA        # →‎نحى‎→
+FDB3 ; 0628 062D 0649 ;        SA      # ( ‎ﶳ‎ → ‎بحى‎ ) ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA # →‎نحي‎→
+
+FC6A ; 0628 0631 ;     SA      # ( ‎ﱪ‎ → ‎بر‎ ) ARABIC LIGATURE BEH WITH REH FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER REH # 
+FC8A ; 0628 0631 ;     SA      # ( ‎ﲊ‎ → ‎بر‎ ) ARABIC LIGATURE NOON WITH REH FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER REH        # →‎نر‎→
+
+FC6B ; 0628 0632 ;     SA      # ( ‎ﱫ‎ → ‎بز‎ ) ARABIC LIGATURE BEH WITH ZAIN FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER ZAIN       # 
+FC8B ; 0628 0632 ;     SA      # ( ‎ﲋ‎ → ‎بز‎ ) ARABIC LIGATURE NOON WITH ZAIN FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER ZAIN      # →‎نز‎→
+
+FC9F ; 0628 0645 ;     SA      # ( ‎ﲟ‎ → ‎بم‎ ) ARABIC LIGATURE BEH WITH MEEM INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER MEEM     # 
+FCE1 ; 0628 0645 ;     SA      # ( ‎ﳡ‎ → ‎بم‎ ) ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM → ARABIC LETTER BEH, ARABIC LETTER MEEM      # 
+FC6C ; 0628 0645 ;     SA      # ( ‎ﱬ‎ → ‎بم‎ ) ARABIC LIGATURE BEH WITH MEEM FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER MEEM       # 
+FC08 ; 0628 0645 ;     SA      # ( ‎ﰈ‎ → ‎بم‎ ) ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER MEEM    # 
+FCD5 ; 0628 0645 ;     SA      # ( ‎ﳕ‎ → ‎بم‎ ) ARABIC LIGATURE NOON WITH MEEM INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER MEEM    # →‎نم‎→
+FCEE ; 0628 0645 ;     SA      # ( ‎ﳮ‎ → ‎بم‎ ) ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM → ARABIC LETTER BEH, ARABIC LETTER MEEM     # →‎نم‎→
+FC8C ; 0628 0645 ;     SA      # ( ‎ﲌ‎ → ‎بم‎ ) ARABIC LIGATURE NOON WITH MEEM FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER MEEM      # →‎نم‎→
+FC4E ; 0628 0645 ;     SA      # ( ‎ﱎ‎ → ‎بم‎ ) ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER MEEM   # →‎نم‎→
+
+FD9B ; 0628 0645 0649 ;        SA      # ( ‎ﶛ‎ → ‎بمى‎ ) ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA      # →‎نمى‎→
+FD9A ; 0628 0645 0649 ;        SA      # ( ‎ﶚ‎ → ‎بمى‎ ) ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA       # →‎نمي‎→
+
+FCA0 ; 0628 0647 ;     SA      # ( ‎ﲠ‎ → ‎به‎ ) ARABIC LIGATURE BEH WITH HEH INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER HEH       # 
+FCE2 ; 0628 0647 ;     SA      # ( ‎ﳢ‎ → ‎به‎ ) ARABIC LIGATURE BEH WITH HEH MEDIAL FORM → ARABIC LETTER BEH, ARABIC LETTER HEH        # 
+FCD6 ; 0628 0647 ;     SA      # ( ‎ﳖ‎ → ‎به‎ ) ARABIC LIGATURE NOON WITH HEH INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER HEH      # →‎نه‎→
+FCEF ; 0628 0647 ;     SA      # ( ‎ﳯ‎ → ‎به‎ ) ARABIC LIGATURE NOON WITH HEH MEDIAL FORM → ARABIC LETTER BEH, ARABIC LETTER HEH       # →‎نه‎→
+
+FC6E ; 0628 0649 ;     SA      # ( ‎ﱮ‎ → ‎بى‎ ) ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER ALEF MAKSURA       # 
+FC09 ; 0628 0649 ;     SA      # ( ‎ﰉ‎ → ‎بى‎ ) ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER ALEF MAKSURA    # 
+FC6F ; 0628 0649 ;     SA      # ( ‎ﱯ‎ → ‎بى‎ ) ARABIC LIGATURE BEH WITH YEH FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER ALEF MAKSURA        # →‎بي‎→
+FC0A ; 0628 0649 ;     SA      # ( ‎ﰊ‎ → ‎بى‎ ) ARABIC LIGATURE BEH WITH YEH ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER ALEF MAKSURA     # →‎بي‎→
+FC8E ; 0628 0649 ;     SA      # ( ‎ﲎ‎ → ‎بى‎ ) ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER ALEF MAKSURA      # →‎نى‎→
+FC4F ; 0628 0649 ;     SA      # ( ‎ﱏ‎ → ‎بى‎ ) ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER ALEF MAKSURA   # →‎نى‎→
+FC8F ; 0628 0649 ;     SA      # ( ‎ﲏ‎ → ‎بى‎ ) ARABIC LIGATURE NOON WITH YEH FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER ALEF MAKSURA       # →‎ني‎→
+FC50 ; 0628 0649 ;     SA      # ( ‎ﱐ‎ → ‎بى‎ ) ARABIC LIGATURE NOON WITH YEH ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER ALEF MAKSURA    # →‎ني‎→
+
+FB58 ; 067E ;  SA      # ( ‎ﭘ‎ → ‎پ‎ ) ARABIC LETTER PEH INITIAL FORM → ARABIC LETTER PEH       # 
+FB59 ; 067E ;  SA      # ( ‎ﭙ‎ → ‎پ‎ ) ARABIC LETTER PEH MEDIAL FORM → ARABIC LETTER PEH        # 
+FB57 ; 067E ;  SA      # ( ‎ﭗ‎ → ‎پ‎ ) ARABIC LETTER PEH FINAL FORM → ARABIC LETTER PEH # 
+FB56 ; 067E ;  SA      # ( ‎ﭖ‎ → ‎پ‎ ) ARABIC LETTER PEH ISOLATED FORM → ARABIC LETTER PEH      # 
+
+FE94 ; 0629 ;  SA      # ( ‎ﺔ‎ → ‎ة‎ ) ARABIC LETTER TEH MARBUTA FINAL FORM → ARABIC LETTER TEH MARBUTA # 
+FE93 ; 0629 ;  SA      # ( ‎ﺓ‎ → ‎ة‎ ) ARABIC LETTER TEH MARBUTA ISOLATED FORM → ARABIC LETTER TEH MARBUTA      # 
+06C3 ; 0629 ;  SA      # ( ‎ۃ‎ → ‎ة‎ ) ARABIC LETTER TEH MARBUTA GOAL → ARABIC LETTER TEH MARBUTA        # →ö→
+
+FE97 ; 062A ;  SA      # ( ‎ﺗ‎ → ‎ت‎ ) ARABIC LETTER TEH INITIAL FORM → ARABIC LETTER TEH       # 
+FE98 ; 062A ;  SA      # ( ‎ﺘ‎ → ‎ت‎ ) ARABIC LETTER TEH MEDIAL FORM → ARABIC LETTER TEH        # 
+FE96 ; 062A ;  SA      # ( ‎ﺖ‎ → ‎ت‎ ) ARABIC LETTER TEH FINAL FORM → ARABIC LETTER TEH # 
+FE95 ; 062A ;  SA      # ( ‎ﺕ‎ → ‎ت‎ ) ARABIC LETTER TEH ISOLATED FORM → ARABIC LETTER TEH      # 
+
+FC73 ; 062A 0628 ;     SA      # ( ‎ﱳ‎ → ‎تب‎ ) ARABIC LIGATURE TEH WITH NOON FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER BEH        # →‎تن‎→
+
+FCA1 ; 062A 062C ;     SA      # ( ‎ﲡ‎ → ‎تج‎ ) ARABIC LIGATURE TEH WITH JEEM INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM     # 
+FC0B ; 062A 062C ;     SA      # ( ‎ﰋ‎ → ‎تج‎ ) ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM    # 
+FCA3 ; 062A 062C ;     SA      # ( ‎ﲣ‎ → ‎تج‎ ) ARABIC LIGATURE TEH WITH KHAH INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM     # →‎تخ‎→→‎ﰍ‎→→‎ﰋ‎→
+FC0D ; 062A 062C ;     SA      # ( ‎ﰍ‎ → ‎تج‎ ) ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM    # →‎ﰋ‎→
+FCDA ; 062A 062C ;     SA      # ( ‎ﳚ‎ → ‎تج‎ ) ARABIC LIGATURE YEH WITH JEEM INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM     # →‎ﲡ‎→
+FC55 ; 062A 062C ;     SA      # ( ‎ﱕ‎ → ‎تج‎ ) ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM    # →‎يج‎→→‎ﳚ‎→→‎ﲡ‎→
+FCDC ; 062A 062C ;     SA      # ( ‎ﳜ‎ → ‎تج‎ ) ARABIC LIGATURE YEH WITH KHAH INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM     # →‎ﲣ‎→→‎تخ‎→→‎ﰍ‎→→‎ﰋ‎→
+FC57 ; 062A 062C ;     SA      # ( ‎ﱗ‎ → ‎تج‎ ) ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM    # →‎ﱕ‎→→‎يج‎→→‎ﳚ‎→→‎ﲡ‎→
+
+FD50 ; 062A 062C 0645 ;        SA      # ( ‎ﵐ‎ → ‎تجم‎ ) ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM, ARABIC LETTER MEEM     # 
+FD54 ; 062A 062C 0645 ;        SA      # ( ‎ﵔ‎ → ‎تجم‎ ) ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM, ARABIC LETTER MEEM     # →‎تخم‎→
+
+FDA0 ; 062A 062C 0649 ;        SA      # ( ‎ﶠ‎ → ‎تجى‎ ) ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA       # 
+FD9F ; 062A 062C 0649 ;        SA      # ( ‎ﶟ‎ → ‎تجى‎ ) ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA        # →‎تجي‎→
+FDA2 ; 062A 062C 0649 ;        SA      # ( ‎ﶢ‎ → ‎تجى‎ ) ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA       # →‎تخى‎→
+FDA1 ; 062A 062C 0649 ;        SA      # ( ‎ﶡ‎ → ‎تجى‎ ) ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA        # →‎تخي‎→
+
+FCA2 ; 062A 062D ;     SA      # ( ‎ﲢ‎ → ‎تح‎ ) ARABIC LIGATURE TEH WITH HAH INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER HAH       # 
+FC0C ; 062A 062D ;     SA      # ( ‎ﰌ‎ → ‎تح‎ ) ARABIC LIGATURE TEH WITH HAH ISOLATED FORM → ARABIC LETTER TEH, ARABIC LETTER HAH      # 
+FCDB ; 062A 062D ;     SA      # ( ‎ﳛ‎ → ‎تح‎ ) ARABIC LIGATURE YEH WITH HAH INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER HAH       # →‎ﲢ‎→
+FC56 ; 062A 062D ;     SA      # ( ‎ﱖ‎ → ‎تح‎ ) ARABIC LIGATURE YEH WITH HAH ISOLATED FORM → ARABIC LETTER TEH, ARABIC LETTER HAH      # →‎يح‎→→‎ﳛ‎→→‎ﲢ‎→
+
+FD52 ; 062A 062D 062C ;        SA      # ( ‎ﵒ‎ → ‎تحج‎ ) ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER HAH, ARABIC LETTER JEEM       # 
+FD51 ; 062A 062D 062C ;        SA      # ( ‎ﵑ‎ → ‎تحج‎ ) ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER HAH, ARABIC LETTER JEEM # 
+
+FD53 ; 062A 062D 0645 ;        SA      # ( ‎ﵓ‎ → ‎تحم‎ ) ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER HAH, ARABIC LETTER MEEM       # 
+
+FC70 ; 062A 0631 ;     SA      # ( ‎ﱰ‎ → ‎تر‎ ) ARABIC LIGATURE TEH WITH REH FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER REH # 
+
+FC71 ; 062A 0632 ;     SA      # ( ‎ﱱ‎ → ‎تز‎ ) ARABIC LIGATURE TEH WITH ZAIN FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER ZAIN       # 
+
+FCA4 ; 062A 0645 ;     SA      # ( ‎ﲤ‎ → ‎تم‎ ) ARABIC LIGATURE TEH WITH MEEM INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER MEEM     # 
+FCE3 ; 062A 0645 ;     SA      # ( ‎ﳣ‎ → ‎تم‎ ) ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM → ARABIC LETTER TEH, ARABIC LETTER MEEM      # 
+FC72 ; 062A 0645 ;     SA      # ( ‎ﱲ‎ → ‎تم‎ ) ARABIC LIGATURE TEH WITH MEEM FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER MEEM       # 
+FC0E ; 062A 0645 ;     SA      # ( ‎ﰎ‎ → ‎تم‎ ) ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM → ARABIC LETTER TEH, ARABIC LETTER MEEM    # 
+
+FD55 ; 062A 0645 062C ;        SA      # ( ‎ﵕ‎ → ‎تمج‎ ) ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER MEEM, ARABIC LETTER JEEM     # 
+FD57 ; 062A 0645 062C ;        SA      # ( ‎ﵗ‎ → ‎تمج‎ ) ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER MEEM, ARABIC LETTER JEEM     # →‎تمخ‎→
+
+FD56 ; 062A 0645 062D ;        SA      # ( ‎ﵖ‎ → ‎تمح‎ ) ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER MEEM, ARABIC LETTER HAH       # 
+
+FDA4 ; 062A 0645 0649 ;        SA      # ( ‎ﶤ‎ → ‎تمى‎ ) ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA       # 
+FDA3 ; 062A 0645 0649 ;        SA      # ( ‎ﶣ‎ → ‎تمى‎ ) ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA        # →‎تمي‎→
+
+FCA5 ; 062A 0647 ;     SA      # ( ‎ﲥ‎ → ‎ته‎ ) ARABIC LIGATURE TEH WITH HEH INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER HEH       # 
+FCE4 ; 062A 0647 ;     SA      # ( ‎ﳤ‎ → ‎ته‎ ) ARABIC LIGATURE TEH WITH HEH MEDIAL FORM → ARABIC LETTER TEH, ARABIC LETTER HEH        # 
+
+FC74 ; 062A 0649 ;     SA      # ( ‎ﱴ‎ → ‎تى‎ ) ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER ALEF MAKSURA       # 
+FC0F ; 062A 0649 ;     SA      # ( ‎ﰏ‎ → ‎تى‎ ) ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER TEH, ARABIC LETTER ALEF MAKSURA    # 
+FC75 ; 062A 0649 ;     SA      # ( ‎ﱵ‎ → ‎تى‎ ) ARABIC LIGATURE TEH WITH YEH FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER ALEF MAKSURA        # →‎تي‎→
+FC10 ; 062A 0649 ;     SA      # ( ‎ﰐ‎ → ‎تى‎ ) ARABIC LIGATURE TEH WITH YEH ISOLATED FORM → ARABIC LETTER TEH, ARABIC LETTER ALEF MAKSURA     # →‎تي‎→
+
+FE9B ; 062B ;  SA      # ( ‎ﺛ‎ → ‎ث‎ ) ARABIC LETTER THEH INITIAL FORM → ARABIC LETTER THEH     # 
+FE9C ; 062B ;  SA      # ( ‎ﺜ‎ → ‎ث‎ ) ARABIC LETTER THEH MEDIAL FORM → ARABIC LETTER THEH      # 
+FE9A ; 062B ;  SA      # ( ‎ﺚ‎ → ‎ث‎ ) ARABIC LETTER THEH FINAL FORM → ARABIC LETTER THEH       # 
+FE99 ; 062B ;  SA      # ( ‎ﺙ‎ → ‎ث‎ ) ARABIC LETTER THEH ISOLATED FORM → ARABIC LETTER THEH    # 
+
+FC79 ; 062B 0628 ;     SA      # ( ‎ﱹ‎ → ‎ثب‎ ) ARABIC LIGATURE THEH WITH NOON FINAL FORM → ARABIC LETTER THEH, ARABIC LETTER BEH      # →‎ثن‎→
+
+FC11 ; 062B 062C ;     SA      # ( ‎ﰑ‎ → ‎ثج‎ ) ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM → ARABIC LETTER THEH, ARABIC LETTER JEEM  # 
+
+FC76 ; 062B 0631 ;     SA      # ( ‎ﱶ‎ → ‎ثر‎ ) ARABIC LIGATURE THEH WITH REH FINAL FORM → ARABIC LETTER THEH, ARABIC LETTER REH       # 
+
+FC77 ; 062B 0632 ;     SA      # ( ‎ﱷ‎ → ‎ثز‎ ) ARABIC LIGATURE THEH WITH ZAIN FINAL FORM → ARABIC LETTER THEH, ARABIC LETTER ZAIN     # 
+
+FCA6 ; 062B 0645 ;     SA      # ( ‎ﲦ‎ → ‎ثم‎ ) ARABIC LIGATURE THEH WITH MEEM INITIAL FORM → ARABIC LETTER THEH, ARABIC LETTER MEEM   # 
+FCE5 ; 062B 0645 ;     SA      # ( ‎ﳥ‎ → ‎ثم‎ ) ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM → ARABIC LETTER THEH, ARABIC LETTER MEEM    # 
+FC78 ; 062B 0645 ;     SA      # ( ‎ﱸ‎ → ‎ثم‎ ) ARABIC LIGATURE THEH WITH MEEM FINAL FORM → ARABIC LETTER THEH, ARABIC LETTER MEEM     # 
+FC12 ; 062B 0645 ;     SA      # ( ‎ﰒ‎ → ‎ثم‎ ) ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM → ARABIC LETTER THEH, ARABIC LETTER MEEM  # 
+
+FCE6 ; 062B 0647 ;     SA      # ( ‎ﳦ‎ → ‎ثه‎ ) ARABIC LIGATURE THEH WITH HEH MEDIAL FORM → ARABIC LETTER THEH, ARABIC LETTER HEH      # 
+
+FC7A ; 062B 0649 ;     SA      # ( ‎ﱺ‎ → ‎ثى‎ ) ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER THEH, ARABIC LETTER ALEF MAKSURA     # 
+FC13 ; 062B 0649 ;     SA      # ( ‎ﰓ‎ → ‎ثى‎ ) ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER THEH, ARABIC LETTER ALEF MAKSURA  # 
+FC7B ; 062B 0649 ;     SA      # ( ‎ﱻ‎ → ‎ثى‎ ) ARABIC LIGATURE THEH WITH YEH FINAL FORM → ARABIC LETTER THEH, ARABIC LETTER ALEF MAKSURA      # →‎ثي‎→
+FC14 ; 062B 0649 ;     SA      # ( ‎ﰔ‎ → ‎ثى‎ ) ARABIC LIGATURE THEH WITH YEH ISOLATED FORM → ARABIC LETTER THEH, ARABIC LETTER ALEF MAKSURA   # →‎ثي‎→
+
+FB68 ; 0679 ;  SA      # ( ‎ﭨ‎ → ‎ٹ‎ ) ARABIC LETTER TTEH INITIAL FORM → ARABIC LETTER TTEH     # 
+FB69 ; 0679 ;  SA      # ( ‎ﭩ‎ → ‎ٹ‎ ) ARABIC LETTER TTEH MEDIAL FORM → ARABIC LETTER TTEH      # 
+FB67 ; 0679 ;  SA      # ( ‎ﭧ‎ → ‎ٹ‎ ) ARABIC LETTER TTEH FINAL FORM → ARABIC LETTER TTEH       # 
+FB66 ; 0679 ;  SA      # ( ‎ﭦ‎ → ‎ٹ‎ ) ARABIC LETTER TTEH ISOLATED FORM → ARABIC LETTER TTEH    # 
+06BB ; 0679 ;  SA      # ( ‎ڻ‎ → ‎ٹ‎ ) ARABIC LETTER RNOON → ARABIC LETTER TTEH  # →‎ﮢ‎→→‎ﭩ‎→
+FBA2 ; 0679 ;  SA      # ( ‎ﮢ‎ → ‎ٹ‎ ) ARABIC LETTER RNOON INITIAL FORM → ARABIC LETTER TTEH    # →‎ﭩ‎→
+FBA3 ; 0679 ;  SA      # ( ‎ﮣ‎ → ‎ٹ‎ ) ARABIC LETTER RNOON MEDIAL FORM → ARABIC LETTER TTEH     # →‎ﭩ‎→
+FBA1 ; 0679 ;  SA      # ( ‎ﮡ‎ → ‎ٹ‎ ) ARABIC LETTER RNOON FINAL FORM → ARABIC LETTER TTEH      # →‎ڻ‎→→‎ﮢ‎→→‎ﭩ‎→
+FBA0 ; 0679 ;  SA      # ( ‎ﮠ‎ → ‎ٹ‎ ) ARABIC LETTER RNOON ISOLATED FORM → ARABIC LETTER TTEH   # →‎ڻ‎→→‎ﮢ‎→→‎ﭩ‎→
+
+067B ; 067A ;  SA      # ( ‎ٻ‎ → ‎ٺ‎ ) ARABIC LETTER BEEH → ARABIC LETTER TTEHEH # →‎ﭞ‎→
+FB54 ; 067A ;  SA      # ( ‎ﭔ‎ → ‎ٺ‎ ) ARABIC LETTER BEEH INITIAL FORM → ARABIC LETTER TTEHEH   # →‎ﭡ‎→
+FB55 ; 067A ;  SA      # ( ‎ﭕ‎ → ‎ٺ‎ ) ARABIC LETTER BEEH MEDIAL FORM → ARABIC LETTER TTEHEH    # →‎ﭡ‎→
+FB53 ; 067A ;  SA      # ( ‎ﭓ‎ → ‎ٺ‎ ) ARABIC LETTER BEEH FINAL FORM → ARABIC LETTER TTEHEH     # 
+FB52 ; 067A ;  SA      # ( ‎ﭒ‎ → ‎ٺ‎ ) ARABIC LETTER BEEH ISOLATED FORM → ARABIC LETTER TTEHEH  # 
+FB60 ; 067A ;  SA      # ( ‎ﭠ‎ → ‎ٺ‎ ) ARABIC LETTER TTEHEH INITIAL FORM → ARABIC LETTER TTEHEH # 
+FB61 ; 067A ;  SA      # ( ‎ﭡ‎ → ‎ٺ‎ ) ARABIC LETTER TTEHEH MEDIAL FORM → ARABIC LETTER TTEHEH  # 
+FB5F ; 067A ;  SA      # ( ‎ﭟ‎ → ‎ٺ‎ ) ARABIC LETTER TTEHEH FINAL FORM → ARABIC LETTER TTEHEH   # 
+FB5E ; 067A ;  SA      # ( ‎ﭞ‎ → ‎ٺ‎ ) ARABIC LETTER TTEHEH ISOLATED FORM → ARABIC LETTER TTEHEH        # 
+06D0 ; 067A ;  SA      # ( ‎ې‎ → ‎ٺ‎ ) ARABIC LETTER E → ARABIC LETTER TTEHEH    # →‎ﯦ‎→→‎ﭡ‎→
+FBE6 ; 067A ;  SA      # ( ‎ﯦ‎ → ‎ٺ‎ ) ARABIC LETTER E INITIAL FORM → ARABIC LETTER TTEHEH      # →‎ﭡ‎→
+FBE7 ; 067A ;  SA      # ( ‎ﯧ‎ → ‎ٺ‎ ) ARABIC LETTER E MEDIAL FORM → ARABIC LETTER TTEHEH       # →‎ﭡ‎→
+FBE5 ; 067A ;  SA      # ( ‎ﯥ‎ → ‎ٺ‎ ) ARABIC LETTER E FINAL FORM → ARABIC LETTER TTEHEH        # →‎ې‎→→‎ﯦ‎→→‎ﭡ‎→
+FBE4 ; 067A ;  SA      # ( ‎ﯤ‎ → ‎ٺ‎ ) ARABIC LETTER E ISOLATED FORM → ARABIC LETTER TTEHEH     # →‎ې‎→→‎ﯦ‎→→‎ﭡ‎→
+
+0680 ; 067F ;  SA      # ( ‎ڀ‎ → ‎ٿ‎ ) ARABIC LETTER BEHEH → ARABIC LETTER TEHEH # →‎ﭚ‎→
+FB5C ; 067F ;  SA      # ( ‎ﭜ‎ → ‎ٿ‎ ) ARABIC LETTER BEHEH INITIAL FORM → ARABIC LETTER TEHEH   # →‎ﭥ‎→
+FB5D ; 067F ;  SA      # ( ‎ﭝ‎ → ‎ٿ‎ ) ARABIC LETTER BEHEH MEDIAL FORM → ARABIC LETTER TEHEH    # →‎ﭥ‎→
+FB5B ; 067F ;  SA      # ( ‎ﭛ‎ → ‎ٿ‎ ) ARABIC LETTER BEHEH FINAL FORM → ARABIC LETTER TEHEH     # 
+FB5A ; 067F ;  SA      # ( ‎ﭚ‎ → ‎ٿ‎ ) ARABIC LETTER BEHEH ISOLATED FORM → ARABIC LETTER TEHEH  # 
+FB64 ; 067F ;  SA      # ( ‎ﭤ‎ → ‎ٿ‎ ) ARABIC LETTER TEHEH INITIAL FORM → ARABIC LETTER TEHEH   # 
+FB65 ; 067F ;  SA      # ( ‎ﭥ‎ → ‎ٿ‎ ) ARABIC LETTER TEHEH MEDIAL FORM → ARABIC LETTER TEHEH    # 
+FB63 ; 067F ;  SA      # ( ‎ﭣ‎ → ‎ٿ‎ ) ARABIC LETTER TEHEH FINAL FORM → ARABIC LETTER TEHEH     # 
+FB62 ; 067F ;  SA      # ( ‎ﭢ‎ → ‎ٿ‎ ) ARABIC LETTER TEHEH ISOLATED FORM → ARABIC LETTER TEHEH  # 
+
+FE9F ; 062C ;  SA      # ( ‎ﺟ‎ → ‎ج‎ ) ARABIC LETTER JEEM INITIAL FORM → ARABIC LETTER JEEM     # 
+FEA0 ; 062C ;  SA      # ( ‎ﺠ‎ → ‎ج‎ ) ARABIC LETTER JEEM MEDIAL FORM → ARABIC LETTER JEEM      # 
+FE9E ; 062C ;  SA      # ( ‎ﺞ‎ → ‎ج‎ ) ARABIC LETTER JEEM FINAL FORM → ARABIC LETTER JEEM       # 
+FE9D ; 062C ;  SA      # ( ‎ﺝ‎ → ‎ج‎ ) ARABIC LETTER JEEM ISOLATED FORM → ARABIC LETTER JEEM    # 
+062E ; 062C ;  SA      # ( ‎خ‎ → ‎ج‎ ) ARABIC LETTER KHAH → ARABIC LETTER JEEM   # 
+FEA7 ; 062C ;  SA      # ( ‎ﺧ‎ → ‎ج‎ ) ARABIC LETTER KHAH INITIAL FORM → ARABIC LETTER JEEM     # →‎خ‎→
+FEA8 ; 062C ;  SA      # ( ‎ﺨ‎ → ‎ج‎ ) ARABIC LETTER KHAH MEDIAL FORM → ARABIC LETTER JEEM      # →‎خ‎→
+FEA6 ; 062C ;  SA      # ( ‎ﺦ‎ → ‎ج‎ ) ARABIC LETTER KHAH FINAL FORM → ARABIC LETTER JEEM       # →‎خ‎→
+FEA5 ; 062C ;  SA      # ( ‎ﺥ‎ → ‎ج‎ ) ARABIC LETTER KHAH ISOLATED FORM → ARABIC LETTER JEEM    # 
+
+FCAB ; 062C 062C ;     SA      # ( ‎ﲫ‎ → ‎جج‎ ) ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM → ARABIC LETTER JEEM, ARABIC LETTER JEEM   # →‎خج‎→
+FC19 ; 062C 062C ;     SA      # ( ‎ﰙ‎ → ‎جج‎ ) ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM → ARABIC LETTER JEEM, ARABIC LETTER JEEM  # →‎خج‎→
+
+FCA7 ; 062C 062D ;     SA      # ( ‎ﲧ‎ → ‎جح‎ ) ARABIC LIGATURE JEEM WITH HAH INITIAL FORM → ARABIC LETTER JEEM, ARABIC LETTER HAH     # 
+FC15 ; 062C 062D ;     SA      # ( ‎ﰕ‎ → ‎جح‎ ) ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM → ARABIC LETTER JEEM, ARABIC LETTER HAH    # 
+FC1A ; 062C 062D ;     SA      # ( ‎ﰚ‎ → ‎جح‎ ) ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM → ARABIC LETTER JEEM, ARABIC LETTER HAH    # →‎ﰕ‎→
+
+FDA6 ; 062C 062D 0649 ;        SA      # ( ‎ﶦ‎ → ‎جحى‎ ) ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER JEEM, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA       # 
+FDBE ; 062C 062D 0649 ;        SA      # ( ‎ﶾ‎ → ‎جحى‎ ) ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM → ARABIC LETTER JEEM, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA        # →‎جحي‎→
+
+FDFB ; 062C 0644 0020 062C 0644 0627 0644 0647 ;       SA      #* ( ‎ﷻ‎ → ‎جل جلاله‎ ) ARABIC LIGATURE JALLAJALALOUHOU → ARABIC LETTER JEEM, ARABIC LETTER LAM, SPACE, ARABIC LETTER JEEM, ARABIC LETTER LAM, ARABIC LETTER ALEF, ARABIC LETTER LAM, ARABIC LETTER HEH    # 
+
+FCA8 ; 062C 0645 ;     SA      # ( ‎ﲨ‎ → ‎جم‎ ) ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM → ARABIC LETTER JEEM, ARABIC LETTER MEEM   # 
+FC16 ; 062C 0645 ;     SA      # ( ‎ﰖ‎ → ‎جم‎ ) ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM → ARABIC LETTER JEEM, ARABIC LETTER MEEM  # 
+FCAC ; 062C 0645 ;     SA      # ( ‎ﲬ‎ → ‎جم‎ ) ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM → ARABIC LETTER JEEM, ARABIC LETTER MEEM   # →‎ﲨ‎→
+FC1B ; 062C 0645 ;     SA      # ( ‎ﰛ‎ → ‎جم‎ ) ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM → ARABIC LETTER JEEM, ARABIC LETTER MEEM  # →‎ﰖ‎→
+
+FD59 ; 062C 0645 062D ;        SA      # ( ‎ﵙ‎ → ‎جمح‎ ) ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM → ARABIC LETTER JEEM, ARABIC LETTER MEEM, ARABIC LETTER HAH     # 
+FD58 ; 062C 0645 062D ;        SA      # ( ‎ﵘ‎ → ‎جمح‎ ) ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM → ARABIC LETTER JEEM, ARABIC LETTER MEEM, ARABIC LETTER HAH       # 
+
+FDA7 ; 062C 0645 0649 ;        SA      # ( ‎ﶧ‎ → ‎جمى‎ ) ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER JEEM, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA     # 
+FDA5 ; 062C 0645 0649 ;        SA      # ( ‎ﶥ‎ → ‎جمى‎ ) ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER JEEM, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA      # →‎جمي‎→
+
+FD1D ; 062C 0649 ;     SA      # ( ‎ﴝ‎ → ‎جى‎ ) ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA     # 
+FD01 ; 062C 0649 ;     SA      # ( ‎ﴁ‎ → ‎جى‎ ) ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA  # 
+FD1E ; 062C 0649 ;     SA      # ( ‎ﴞ‎ → ‎جى‎ ) ARABIC LIGATURE JEEM WITH YEH FINAL FORM → ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA      # →‎جي‎→
+FD02 ; 062C 0649 ;     SA      # ( ‎ﴂ‎ → ‎جى‎ ) ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM → ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA   # →‎جي‎→
+FD1F ; 062C 0649 ;     SA      # ( ‎ﴟ‎ → ‎جى‎ ) ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA     # →‎خى‎→→‎ﴃ‎→→‎ﴁ‎→
+FD03 ; 062C 0649 ;     SA      # ( ‎ﴃ‎ → ‎جى‎ ) ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA  # →‎ﴁ‎→
+FD20 ; 062C 0649 ;     SA      # ( ‎ﴠ‎ → ‎جى‎ ) ARABIC LIGATURE KHAH WITH YEH FINAL FORM → ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA      # →‎خي‎→→‎ﴄ‎→→‎ﴂ‎→→‎جي‎→
+FD04 ; 062C 0649 ;     SA      # ( ‎ﴄ‎ → ‎جى‎ ) ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM → ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA   # →‎ﴂ‎→→‎جي‎→
+
+FB78 ; 0683 ;  SA      # ( ‎ﭸ‎ → ‎ڃ‎ ) ARABIC LETTER NYEH INITIAL FORM → ARABIC LETTER NYEH     # 
+FB79 ; 0683 ;  SA      # ( ‎ﭹ‎ → ‎ڃ‎ ) ARABIC LETTER NYEH MEDIAL FORM → ARABIC LETTER NYEH      # 
+FB77 ; 0683 ;  SA      # ( ‎ﭷ‎ → ‎ڃ‎ ) ARABIC LETTER NYEH FINAL FORM → ARABIC LETTER NYEH       # 
+FB76 ; 0683 ;  SA      # ( ‎ﭶ‎ → ‎ڃ‎ ) ARABIC LETTER NYEH ISOLATED FORM → ARABIC LETTER NYEH    # 
+
+FB7C ; 0686 ;  SA      # ( ‎ﭼ‎ → ‎چ‎ ) ARABIC LETTER TCHEH INITIAL FORM → ARABIC LETTER TCHEH   # 
+FB7D ; 0686 ;  SA      # ( ‎ﭽ‎ → ‎چ‎ ) ARABIC LETTER TCHEH MEDIAL FORM → ARABIC LETTER TCHEH    # 
+FB7B ; 0686 ;  SA      # ( ‎ﭻ‎ → ‎چ‎ ) ARABIC LETTER TCHEH FINAL FORM → ARABIC LETTER TCHEH     # 
+FB7A ; 0686 ;  SA      # ( ‎ﭺ‎ → ‎چ‎ ) ARABIC LETTER TCHEH ISOLATED FORM → ARABIC LETTER TCHEH  # 
+
+FB80 ; 0687 ;  SA      # ( ‎ﮀ‎ → ‎ڇ‎ ) ARABIC LETTER TCHEHEH INITIAL FORM → ARABIC LETTER TCHEHEH       # 
+FB81 ; 0687 ;  SA      # ( ‎ﮁ‎ → ‎ڇ‎ ) ARABIC LETTER TCHEHEH MEDIAL FORM → ARABIC LETTER TCHEHEH        # 
+FB7F ; 0687 ;  SA      # ( ‎ﭿ‎ → ‎ڇ‎ ) ARABIC LETTER TCHEHEH FINAL FORM → ARABIC LETTER TCHEHEH # 
+FB7E ; 0687 ;  SA      # ( ‎ﭾ‎ → ‎ڇ‎ ) ARABIC LETTER TCHEHEH ISOLATED FORM → ARABIC LETTER TCHEHEH      # 
+
+FEA3 ; 062D ;  SA      # ( ‎ﺣ‎ → ‎ح‎ ) ARABIC LETTER HAH INITIAL FORM → ARABIC LETTER HAH       # 
+FEA4 ; 062D ;  SA      # ( ‎ﺤ‎ → ‎ح‎ ) ARABIC LETTER HAH MEDIAL FORM → ARABIC LETTER HAH        # 
+FEA2 ; 062D ;  SA      # ( ‎ﺢ‎ → ‎ح‎ ) ARABIC LETTER HAH FINAL FORM → ARABIC LETTER HAH # 
+FEA1 ; 062D ;  SA      # ( ‎ﺡ‎ → ‎ح‎ ) ARABIC LETTER HAH ISOLATED FORM → ARABIC LETTER HAH      # 
+
+FCA9 ; 062D 062C ;     SA      # ( ‎ﲩ‎ → ‎حج‎ ) ARABIC LIGATURE HAH WITH JEEM INITIAL FORM → ARABIC LETTER HAH, ARABIC LETTER JEEM     # 
+FC17 ; 062D 062C ;     SA      # ( ‎ﰗ‎ → ‎حج‎ ) ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM → ARABIC LETTER HAH, ARABIC LETTER JEEM    # 
+
+FDBF ; 062D 062C 0649 ;        SA      # ( ‎ﶿ‎ → ‎حجى‎ ) ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM → ARABIC LETTER HAH, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA        # →‎حجي‎→
+
+FCAA ; 062D 0645 ;     SA      # ( ‎ﲪ‎ → ‎حم‎ ) ARABIC LIGATURE HAH WITH MEEM INITIAL FORM → ARABIC LETTER HAH, ARABIC LETTER MEEM     # 
+FC18 ; 062D 0645 ;     SA      # ( ‎ﰘ‎ → ‎حم‎ ) ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM → ARABIC LETTER HAH, ARABIC LETTER MEEM    # 
+
+FD5B ; 062D 0645 0649 ;        SA      # ( ‎ﵛ‎ → ‎حمى‎ ) ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER HAH, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA       # 
+FD5A ; 062D 0645 0649 ;        SA      # ( ‎ﵚ‎ → ‎حمى‎ ) ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER HAH, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA        # →‎حمي‎→
+
+FD1B ; 062D 0649 ;     SA      # ( ‎ﴛ‎ → ‎حى‎ ) ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA       # 
+FCFF ; 062D 0649 ;     SA      # ( ‎ﳿ‎ → ‎حى‎ ) ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA    # 
+FD1C ; 062D 0649 ;     SA      # ( ‎ﴜ‎ → ‎حى‎ ) ARABIC LIGATURE HAH WITH YEH FINAL FORM → ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA        # →‎حي‎→
+FD00 ; 062D 0649 ;     SA      # ( ‎ﴀ‎ → ‎حى‎ ) ARABIC LIGATURE HAH WITH YEH ISOLATED FORM → ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA     # →‎حي‎→
+
+0684 ; 0682 ;  SA      # ( ‎ڄ‎ → ‎ڂ‎ ) ARABIC LETTER DYEH → ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE       # 
+FB74 ; 0682 ;  SA      # ( ‎ﭴ‎ → ‎ڂ‎ ) ARABIC LETTER DYEH INITIAL FORM → ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE # →‎ڄ‎→
+FB75 ; 0682 ;  SA      # ( ‎ﭵ‎ → ‎ڂ‎ ) ARABIC LETTER DYEH MEDIAL FORM → ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE  # →‎ڄ‎→
+FB73 ; 0682 ;  SA      # ( ‎ﭳ‎ → ‎ڂ‎ ) ARABIC LETTER DYEH FINAL FORM → ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE   # →‎ڄ‎→
+FB72 ; 0682 ;  SA      # ( ‎ﭲ‎ → ‎ڂ‎ ) ARABIC LETTER DYEH ISOLATED FORM → ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE        # 
+
+FEAA ; 062F ;  SA      # ( ‎ﺪ‎ → ‎د‎ ) ARABIC LETTER DAL FINAL FORM → ARABIC LETTER DAL # 
+FEA9 ; 062F ;  SA      # ( ‎ﺩ‎ → ‎د‎ ) ARABIC LETTER DAL ISOLATED FORM → ARABIC LETTER DAL      # 
+
+FEAC ; 0630 ;  SA      # ( ‎ﺬ‎ → ‎ذ‎ ) ARABIC LETTER THAL FINAL FORM → ARABIC LETTER THAL       # 
+FEAB ; 0630 ;  SA      # ( ‎ﺫ‎ → ‎ذ‎ ) ARABIC LETTER THAL ISOLATED FORM → ARABIC LETTER THAL    # 
+
+FC5B ; 0630 0670 ;     SA      # ( ‎ﱛ‎ → ‎ذٰ‎ ) ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM → ARABIC LETTER THAL, ARABIC LETTER SUPERSCRIPT ALEF  # 
+
+FB89 ; 0688 ;  SA      # ( ‎ﮉ‎ → ‎ڈ‎ ) ARABIC LETTER DDAL FINAL FORM → ARABIC LETTER DDAL       # 
+FB88 ; 0688 ;  SA      # ( ‎ﮈ‎ → ‎ڈ‎ ) ARABIC LETTER DDAL ISOLATED FORM → ARABIC LETTER DDAL    # 
+
+FB85 ; 068C ;  SA      # ( ‎ﮅ‎ → ‎ڌ‎ ) ARABIC LETTER DAHAL FINAL FORM → ARABIC LETTER DAHAL     # 
+FB84 ; 068C ;  SA      # ( ‎ﮄ‎ → ‎ڌ‎ ) ARABIC LETTER DAHAL ISOLATED FORM → ARABIC LETTER DAHAL  # 
+
+FB83 ; 068D ;  SA      # ( ‎ﮃ‎ → ‎ڍ‎ ) ARABIC LETTER DDAHAL FINAL FORM → ARABIC LETTER DDAHAL   # 
+FB82 ; 068D ;  SA      # ( ‎ﮂ‎ → ‎ڍ‎ ) ARABIC LETTER DDAHAL ISOLATED FORM → ARABIC LETTER DDAHAL        # 
+
+FB87 ; 068E ;  SA      # ( ‎ﮇ‎ → ‎ڎ‎ ) ARABIC LETTER DUL FINAL FORM → ARABIC LETTER DUL # 
+FB86 ; 068E ;  SA      # ( ‎ﮆ‎ → ‎ڎ‎ ) ARABIC LETTER DUL ISOLATED FORM → ARABIC LETTER DUL      # 
+
+FEAE ; 0631 ;  SA      # ( ‎ﺮ‎ → ‎ر‎ ) ARABIC LETTER REH FINAL FORM → ARABIC LETTER REH # 
+FEAD ; 0631 ;  SA      # ( ‎ﺭ‎ → ‎ر‎ ) ARABIC LETTER REH ISOLATED FORM → ARABIC LETTER REH      # 
+
+FC5C ; 0631 0670 ;     SA      # ( ‎ﱜ‎ → ‎رٰ‎ ) ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM → ARABIC LETTER REH, ARABIC LETTER SUPERSCRIPT ALEF    # 
+
+FDF6 ; 0631 0633 0648 0644 ;   SA      # ( ‎ﷶ‎ → ‎رسول‎ ) ARABIC LIGATURE RASOUL ISOLATED FORM → ARABIC LETTER REH, ARABIC LETTER SEEN, ARABIC LETTER WAW, ARABIC LETTER LAM # 
+
+FDFC ; 0631 0649 0627 0644 ;   SA      #* ( ‎﷼‎ → ‎رىال‎ ) RIAL SIGN → ARABIC LETTER REH, ARABIC LETTER ALEF MAKSURA, ARABIC LETTER ALEF, ARABIC LETTER LAM  # →‎ریال‎→
+
+FEB0 ; 0632 ;  SA      # ( ‎ﺰ‎ → ‎ز‎ ) ARABIC LETTER ZAIN FINAL FORM → ARABIC LETTER ZAIN       # 
+FEAF ; 0632 ;  SA      # ( ‎ﺯ‎ → ‎ز‎ ) ARABIC LETTER ZAIN ISOLATED FORM → ARABIC LETTER ZAIN    # 
+0694 ; 0632 ;  SA      # ( ‎ڔ‎ → ‎ز‎ ) ARABIC LETTER REH WITH DOT BELOW → ARABIC LETTER ZAIN     # 
+
+FB8D ; 0691 ;  SA      # ( ‎ﮍ‎ → ‎ڑ‎ ) ARABIC LETTER RREH FINAL FORM → ARABIC LETTER RREH       # 
+FB8C ; 0691 ;  SA      # ( ‎ﮌ‎ → ‎ڑ‎ ) ARABIC LETTER RREH ISOLATED FORM → ARABIC LETTER RREH    # 
+
+FB8B ; 0698 ;  SA      # ( ‎ﮋ‎ → ‎ژ‎ ) ARABIC LETTER JEH FINAL FORM → ARABIC LETTER JEH # 
+FB8A ; 0698 ;  SA      # ( ‎ﮊ‎ → ‎ژ‎ ) ARABIC LETTER JEH ISOLATED FORM → ARABIC LETTER JEH      # 
+
+FEB3 ; 0633 ;  SA      # ( ‎ﺳ‎ → ‎س‎ ) ARABIC LETTER SEEN INITIAL FORM → ARABIC LETTER SEEN     # 
+FEB4 ; 0633 ;  SA      # ( ‎ﺴ‎ → ‎س‎ ) ARABIC LETTER SEEN MEDIAL FORM → ARABIC LETTER SEEN      # 
+FEB2 ; 0633 ;  SA      # ( ‎ﺲ‎ → ‎س‎ ) ARABIC LETTER SEEN FINAL FORM → ARABIC LETTER SEEN       # 
+FEB1 ; 0633 ;  SA      # ( ‎ﺱ‎ → ‎س‎ ) ARABIC LETTER SEEN ISOLATED FORM → ARABIC LETTER SEEN    # 
+
+FCAD ; 0633 062C ;     SA      # ( ‎ﲭ‎ → ‎سج‎ ) ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER JEEM   # 
+FD34 ; 0633 062C ;     SA      # ( ‎ﴴ‎ → ‎سج‎ ) ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER JEEM    # 
+FC1C ; 0633 062C ;     SA      # ( ‎ﰜ‎ → ‎سج‎ ) ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM → ARABIC LETTER SEEN, ARABIC LETTER JEEM  # 
+FCAF ; 0633 062C ;     SA      # ( ‎ﲯ‎ → ‎سج‎ ) ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER JEEM   # →‎سخ‎→→‎ﰞ‎→→‎ﰜ‎→
+FD36 ; 0633 062C ;     SA      # ( ‎ﴶ‎ → ‎سج‎ ) ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER JEEM    # →‎سخ‎→→‎ﰞ‎→→‎ﰜ‎→
+FC1E ; 0633 062C ;     SA      # ( ‎ﰞ‎ → ‎سج‎ ) ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM → ARABIC LETTER SEEN, ARABIC LETTER JEEM  # →‎ﰜ‎→
+
+FD5D ; 0633 062C 062D ;        SA      # ( ‎ﵝ‎ → ‎سجح‎ ) ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER JEEM, ARABIC LETTER HAH     # 
+
+FD5E ; 0633 062C 0649 ;        SA      # ( ‎ﵞ‎ → ‎سجى‎ ) ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER SEEN, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA     # 
+FDA8 ; 0633 062C 0649 ;        SA      # ( ‎ﶨ‎ → ‎سجى‎ ) ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER SEEN, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA     # →‎سخى‎→
+FDC6 ; 0633 062C 0649 ;        SA      # ( ‎ﷆ‎ → ‎سجى‎ ) ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM → ARABIC LETTER SEEN, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA      # →‎سخي‎→
+
+FCAE ; 0633 062D ;     SA      # ( ‎ﲮ‎ → ‎سح‎ ) ARABIC LIGATURE SEEN WITH HAH INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER HAH     # 
+FD35 ; 0633 062D ;     SA      # ( ‎ﴵ‎ → ‎سح‎ ) ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER HAH      # 
+FC1D ; 0633 062D ;     SA      # ( ‎ﰝ‎ → ‎سح‎ ) ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM → ARABIC LETTER SEEN, ARABIC LETTER HAH    # 
+
+FD5C ; 0633 062D 062C ;        SA      # ( ‎ﵜ‎ → ‎سحج‎ ) ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER HAH, ARABIC LETTER JEEM     # 
+
+FD2A ; 0633 0631 ;     SA      # ( ‎ﴪ‎ → ‎سر‎ ) ARABIC LIGATURE SEEN WITH REH FINAL FORM → ARABIC LETTER SEEN, ARABIC LETTER REH       # 
+FD0E ; 0633 0631 ;     SA      # ( ‎ﴎ‎ → ‎سر‎ ) ARABIC LIGATURE SEEN WITH REH ISOLATED FORM → ARABIC LETTER SEEN, ARABIC LETTER REH    # 
+
+FCB0 ; 0633 0645 ;     SA      # ( ‎ﲰ‎ → ‎سم‎ ) ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER MEEM   # 
+FCE7 ; 0633 0645 ;     SA      # ( ‎ﳧ‎ → ‎سم‎ ) ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER MEEM    # 
+FC1F ; 0633 0645 ;     SA      # ( ‎ﰟ‎ → ‎سم‎ ) ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM → ARABIC LETTER SEEN, ARABIC LETTER MEEM  # 
+
+FD61 ; 0633 0645 062C ;        SA      # ( ‎ﵡ‎ → ‎سمج‎ ) ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER MEEM, ARABIC LETTER JEEM   # 
+
+FD60 ; 0633 0645 062D ;        SA      # ( ‎ﵠ‎ → ‎سمح‎ ) ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER MEEM, ARABIC LETTER HAH     # 
+FD5F ; 0633 0645 062D ;        SA      # ( ‎ﵟ‎ → ‎سمح‎ ) ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM → ARABIC LETTER SEEN, ARABIC LETTER MEEM, ARABIC LETTER HAH       # 
+
+FD63 ; 0633 0645 0645 ;        SA      # ( ‎ﵣ‎ → ‎سمم‎ ) ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER MEEM, ARABIC LETTER MEEM   # 
+FD62 ; 0633 0645 0645 ;        SA      # ( ‎ﵢ‎ → ‎سمم‎ ) ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM → ARABIC LETTER SEEN, ARABIC LETTER MEEM, ARABIC LETTER MEEM     # 
+
+FD31 ; 0633 0647 ;     SA      # ( ‎ﴱ‎ → ‎سه‎ ) ARABIC LIGATURE SEEN WITH HEH INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER HEH     # 
+FCE8 ; 0633 0647 ;     SA      # ( ‎ﳨ‎ → ‎سه‎ ) ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER HEH      # 
+
+FD17 ; 0633 0649 ;     SA      # ( ‎ﴗ‎ → ‎سى‎ ) ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER SEEN, ARABIC LETTER ALEF MAKSURA     # 
+FCFB ; 0633 0649 ;     SA      # ( ‎ﳻ‎ → ‎سى‎ ) ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER SEEN, ARABIC LETTER ALEF MAKSURA  # 
+FD18 ; 0633 0649 ;     SA      # ( ‎ﴘ‎ → ‎سى‎ ) ARABIC LIGATURE SEEN WITH YEH FINAL FORM → ARABIC LETTER SEEN, ARABIC LETTER ALEF MAKSURA      # →‎سي‎→
+FCFC ; 0633 0649 ;     SA      # ( ‎ﳼ‎ → ‎سى‎ ) ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM → ARABIC LETTER SEEN, ARABIC LETTER ALEF MAKSURA   # →‎سي‎→
+
+FEB7 ; 0634 ;  SA      # ( ‎ﺷ‎ → ‎ش‎ ) ARABIC LETTER SHEEN INITIAL FORM → ARABIC LETTER SHEEN   # 
+FEB8 ; 0634 ;  SA      # ( ‎ﺸ‎ → ‎ش‎ ) ARABIC LETTER SHEEN MEDIAL FORM → ARABIC LETTER SHEEN    # 
+FEB6 ; 0634 ;  SA      # ( ‎ﺶ‎ → ‎ش‎ ) ARABIC LETTER SHEEN FINAL FORM → ARABIC LETTER SHEEN     # 
+FEB5 ; 0634 ;  SA      # ( ‎ﺵ‎ → ‎ش‎ ) ARABIC LETTER SHEEN ISOLATED FORM → ARABIC LETTER SHEEN  # 
+
+FD2D ; 0634 062C ;     SA      # ( ‎ﴭ‎ → ‎شج‎ ) ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER JEEM # 
+FD37 ; 0634 062C ;     SA      # ( ‎ﴷ‎ → ‎شج‎ ) ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER JEEM  # 
+FD25 ; 0634 062C ;     SA      # ( ‎ﴥ‎ → ‎شج‎ ) ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER JEEM   # 
+FD09 ; 0634 062C ;     SA      # ( ‎ﴉ‎ → ‎شج‎ ) ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM → ARABIC LETTER SHEEN, ARABIC LETTER JEEM        # 
+FD2F ; 0634 062C ;     SA      # ( ‎ﴯ‎ → ‎شج‎ ) ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER JEEM # →‎شخ‎→→‎ﴧ‎→→‎ﴥ‎→
+FD39 ; 0634 062C ;     SA      # ( ‎ﴹ‎ → ‎شج‎ ) ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER JEEM  # →‎شخ‎→→‎ﴧ‎→→‎ﴥ‎→
+FD27 ; 0634 062C ;     SA      # ( ‎ﴧ‎ → ‎شج‎ ) ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER JEEM   # →‎ﴥ‎→
+FD0B ; 0634 062C ;     SA      # ( ‎ﴋ‎ → ‎شج‎ ) ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM → ARABIC LETTER SHEEN, ARABIC LETTER JEEM        # →‎ﴉ‎→
+
+FD69 ; 0634 062C 0649 ;        SA      # ( ‎ﵩ‎ → ‎شجى‎ ) ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA    # →‎شجي‎→
+
+FD2E ; 0634 062D ;     SA      # ( ‎ﴮ‎ → ‎شح‎ ) ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER HAH   # 
+FD38 ; 0634 062D ;     SA      # ( ‎ﴸ‎ → ‎شح‎ ) ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER HAH    # 
+FD26 ; 0634 062D ;     SA      # ( ‎ﴦ‎ → ‎شح‎ ) ARABIC LIGATURE SHEEN WITH HAH FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER HAH     # 
+FD0A ; 0634 062D ;     SA      # ( ‎ﴊ‎ → ‎شح‎ ) ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM → ARABIC LETTER SHEEN, ARABIC LETTER HAH  # 
+
+FD68 ; 0634 062D 0645 ;        SA      # ( ‎ﵨ‎ → ‎شحم‎ ) ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER HAH, ARABIC LETTER MEEM   # 
+FD67 ; 0634 062D 0645 ;        SA      # ( ‎ﵧ‎ → ‎شحم‎ ) ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER HAH, ARABIC LETTER MEEM     # 
+
+FDAA ; 0634 062D 0649 ;        SA      # ( ‎ﶪ‎ → ‎شحى‎ ) ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA      # →‎شحي‎→
+
+FD29 ; 0634 0631 ;     SA      # ( ‎ﴩ‎ → ‎شر‎ ) ARABIC LIGATURE SHEEN WITH REH FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER REH     # 
+FD0D ; 0634 0631 ;     SA      # ( ‎ﴍ‎ → ‎شر‎ ) ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM → ARABIC LETTER SHEEN, ARABIC LETTER REH  # 
+
+FD30 ; 0634 0645 ;     SA      # ( ‎ﴰ‎ → ‎شم‎ ) ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER MEEM # 
+FCE9 ; 0634 0645 ;     SA      # ( ‎ﳩ‎ → ‎شم‎ ) ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER MEEM  # 
+FD28 ; 0634 0645 ;     SA      # ( ‎ﴨ‎ → ‎شم‎ ) ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER MEEM   # 
+FD0C ; 0634 0645 ;     SA      # ( ‎ﴌ‎ → ‎شم‎ ) ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM → ARABIC LETTER SHEEN, ARABIC LETTER MEEM        # 
+
+FD6B ; 0634 0645 062C ;        SA      # ( ‎ﵫ‎ → ‎شمج‎ ) ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER MEEM, ARABIC LETTER JEEM # →‎شمخ‎→
+FD6A ; 0634 0645 062C ;        SA      # ( ‎ﵪ‎ → ‎شمج‎ ) ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER MEEM, ARABIC LETTER JEEM   # →‎شمخ‎→
+
+FD6D ; 0634 0645 0645 ;        SA      # ( ‎ﵭ‎ → ‎شمم‎ ) ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER MEEM, ARABIC LETTER MEEM # 
+FD6C ; 0634 0645 0645 ;        SA      # ( ‎ﵬ‎ → ‎شمم‎ ) ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER MEEM, ARABIC LETTER MEEM   # 
+
+FD32 ; 0634 0647 ;     SA      # ( ‎ﴲ‎ → ‎شه‎ ) ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER HEH   # 
+FCEA ; 0634 0647 ;     SA      # ( ‎ﳪ‎ → ‎شه‎ ) ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER HEH    # 
+
+FD19 ; 0634 0649 ;     SA      # ( ‎ﴙ‎ → ‎شى‎ ) ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER ALEF MAKSURA   # 
+FCFD ; 0634 0649 ;     SA      # ( ‎ﳽ‎ → ‎شى‎ ) ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER SHEEN, ARABIC LETTER ALEF MAKSURA        # 
+FD1A ; 0634 0649 ;     SA      # ( ‎ﴚ‎ → ‎شى‎ ) ARABIC LIGATURE SHEEN WITH YEH FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER ALEF MAKSURA    # →‎شي‎→
+FCFE ; 0634 0649 ;     SA      # ( ‎ﳾ‎ → ‎شى‎ ) ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM → ARABIC LETTER SHEEN, ARABIC LETTER ALEF MAKSURA # →‎شي‎→
+
+FEBB ; 0635 ;  SA      # ( ‎ﺻ‎ → ‎ص‎ ) ARABIC LETTER SAD INITIAL FORM → ARABIC LETTER SAD       # 
+FEBC ; 0635 ;  SA      # ( ‎ﺼ‎ → ‎ص‎ ) ARABIC LETTER SAD MEDIAL FORM → ARABIC LETTER SAD        # 
+FEBA ; 0635 ;  SA      # ( ‎ﺺ‎ → ‎ص‎ ) ARABIC LETTER SAD FINAL FORM → ARABIC LETTER SAD # 
+FEB9 ; 0635 ;  SA      # ( ‎ﺹ‎ → ‎ص‎ ) ARABIC LETTER SAD ISOLATED FORM → ARABIC LETTER SAD      # 
+
+FCB2 ; 0635 062C ;     SA      # ( ‎ﲲ‎ → ‎صج‎ ) ARABIC LIGATURE SAD WITH KHAH INITIAL FORM → ARABIC LETTER SAD, ARABIC LETTER JEEM     # →‎صخ‎→
+
+FCB1 ; 0635 062D ;     SA      # ( ‎ﲱ‎ → ‎صح‎ ) ARABIC LIGATURE SAD WITH HAH INITIAL FORM → ARABIC LETTER SAD, ARABIC LETTER HAH       # 
+FC20 ; 0635 062D ;     SA      # ( ‎ﰠ‎ → ‎صح‎ ) ARABIC LIGATURE SAD WITH HAH ISOLATED FORM → ARABIC LETTER SAD, ARABIC LETTER HAH      # 
+
+FD65 ; 0635 062D 062D ;        SA      # ( ‎ﵥ‎ → ‎صحح‎ ) ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM → ARABIC LETTER SAD, ARABIC LETTER HAH, ARABIC LETTER HAH # 
+FD64 ; 0635 062D 062D ;        SA      # ( ‎ﵤ‎ → ‎صحح‎ ) ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM → ARABIC LETTER SAD, ARABIC LETTER HAH, ARABIC LETTER HAH   # 
+
+FDA9 ; 0635 062D 0649 ;        SA      # ( ‎ﶩ‎ → ‎صحى‎ ) ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM → ARABIC LETTER SAD, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA  # →‎صحي‎→
+
+FD2B ; 0635 0631 ;     SA      # ( ‎ﴫ‎ → ‎صر‎ ) ARABIC LIGATURE SAD WITH REH FINAL FORM → ARABIC LETTER SAD, ARABIC LETTER REH # 
+FD0F ; 0635 0631 ;     SA      # ( ‎ﴏ‎ → ‎صر‎ ) ARABIC LIGATURE SAD WITH REH ISOLATED FORM → ARABIC LETTER SAD, ARABIC LETTER REH      # 
+
+FDF5 ; 0635 0644 0639 0645 ;   SA      # ( ‎ﷵ‎ → ‎صلعم‎ ) ARABIC LIGATURE SALAM ISOLATED FORM → ARABIC LETTER SAD, ARABIC LETTER LAM, ARABIC LETTER AIN, ARABIC LETTER MEEM  # 
+
+FDF9 ; 0635 0644 0649 ;        SA      # ( ‎ﷹ‎ → ‎صلى‎ ) ARABIC LIGATURE SALLA ISOLATED FORM → ARABIC LETTER SAD, ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA       # 
+
+FDFA ; 0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 0649 0647 0020 0648 0633 0644 0645 ;     SA      #* ( ‎ﷺ‎ → ‎صلى الله علىه وسلم‎ ) ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM → ARABIC LETTER SAD, ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA, SPACE, ARABIC LETTER ALEF, ARABIC LETTER LAM, ARABIC LETTER LAM, ARABIC LETTER HEH, SPACE, ARABIC LETTER AIN, ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HEH, SPACE, ARABIC LETTER WAW, ARABIC LETTER SEEN, ARABIC LETTER LAM, ARABIC LETTER MEEM      # →‎صلى الله عليه وسلم‎→
+
+FDF0 ; 0635 0644 06D2 ;        SA      # ( ‎ﷰ‎ → ‎صلے‎ ) ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM → ARABIC LETTER SAD, ARABIC LETTER LAM, ARABIC LETTER YEH BARREE       # 
+
+FCB3 ; 0635 0645 ;     SA      # ( ‎ﲳ‎ → ‎صم‎ ) ARABIC LIGATURE SAD WITH MEEM INITIAL FORM → ARABIC LETTER SAD, ARABIC LETTER MEEM     # 
+FC21 ; 0635 0645 ;     SA      # ( ‎ﰡ‎ → ‎صم‎ ) ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM → ARABIC LETTER SAD, ARABIC LETTER MEEM    # 
+
+FDC5 ; 0635 0645 0645 ;        SA      # ( ‎ﷅ‎ → ‎صمم‎ ) ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM → ARABIC LETTER SAD, ARABIC LETTER MEEM, ARABIC LETTER MEEM     # 
+FD66 ; 0635 0645 0645 ;        SA      # ( ‎ﵦ‎ → ‎صمم‎ ) ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM → ARABIC LETTER SAD, ARABIC LETTER MEEM, ARABIC LETTER MEEM       # 
+
+FD21 ; 0635 0649 ;     SA      # ( ‎ﴡ‎ → ‎صى‎ ) ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER SAD, ARABIC LETTER ALEF MAKSURA       # 
+FD05 ; 0635 0649 ;     SA      # ( ‎ﴅ‎ → ‎صى‎ ) ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER SAD, ARABIC LETTER ALEF MAKSURA    # 
+FD22 ; 0635 0649 ;     SA      # ( ‎ﴢ‎ → ‎صى‎ ) ARABIC LIGATURE SAD WITH YEH FINAL FORM → ARABIC LETTER SAD, ARABIC LETTER ALEF MAKSURA        # →‎صي‎→
+FD06 ; 0635 0649 ;     SA      # ( ‎ﴆ‎ → ‎صى‎ ) ARABIC LIGATURE SAD WITH YEH ISOLATED FORM → ARABIC LETTER SAD, ARABIC LETTER ALEF MAKSURA     # →‎صي‎→
+
+FEBF ; 0636 ;  SA      # ( ‎ﺿ‎ → ‎ض‎ ) ARABIC LETTER DAD INITIAL FORM → ARABIC LETTER DAD       # 
+FEC0 ; 0636 ;  SA      # ( ‎ﻀ‎ → ‎ض‎ ) ARABIC LETTER DAD MEDIAL FORM → ARABIC LETTER DAD        # 
+FEBE ; 0636 ;  SA      # ( ‎ﺾ‎ → ‎ض‎ ) ARABIC LETTER DAD FINAL FORM → ARABIC LETTER DAD # 
+FEBD ; 0636 ;  SA      # ( ‎ﺽ‎ → ‎ض‎ ) ARABIC LETTER DAD ISOLATED FORM → ARABIC LETTER DAD      # 
+
+FCB4 ; 0636 062C ;     SA      # ( ‎ﲴ‎ → ‎ضج‎ ) ARABIC LIGATURE DAD WITH JEEM INITIAL FORM → ARABIC LETTER DAD, ARABIC LETTER JEEM     # 
+FC22 ; 0636 062C ;     SA      # ( ‎ﰢ‎ → ‎ضج‎ ) ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM → ARABIC LETTER DAD, ARABIC LETTER JEEM    # 
+FCB6 ; 0636 062C ;     SA      # ( ‎ﲶ‎ → ‎ضج‎ ) ARABIC LIGATURE DAD WITH KHAH INITIAL FORM → ARABIC LETTER DAD, ARABIC LETTER JEEM     # →‎ضخ‎→→‎ﰤ‎→→‎ﰢ‎→
+FC24 ; 0636 062C ;     SA      # ( ‎ﰤ‎ → ‎ضج‎ ) ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM → ARABIC LETTER DAD, ARABIC LETTER JEEM    # →‎ﰢ‎→
+
+FD70 ; 0636 062C 0645 ;        SA      # ( ‎ﵰ‎ → ‎ضجم‎ ) ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM → ARABIC LETTER DAD, ARABIC LETTER JEEM, ARABIC LETTER MEEM     # →‎ضخم‎→
+FD6F ; 0636 062C 0645 ;        SA      # ( ‎ﵯ‎ → ‎ضجم‎ ) ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM → ARABIC LETTER DAD, ARABIC LETTER JEEM, ARABIC LETTER MEEM       # →‎ضخم‎→
+
+FCB5 ; 0636 062D ;     SA      # ( ‎ﲵ‎ → ‎ضح‎ ) ARABIC LIGATURE DAD WITH HAH INITIAL FORM → ARABIC LETTER DAD, ARABIC LETTER HAH       # 
+FC23 ; 0636 062D ;     SA      # ( ‎ﰣ‎ → ‎ضح‎ ) ARABIC LIGATURE DAD WITH HAH ISOLATED FORM → ARABIC LETTER DAD, ARABIC LETTER HAH      # 
+
+FD6E ; 0636 062D 0649 ;        SA      # ( ‎ﵮ‎ → ‎ضحى‎ ) ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER DAD, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA # 
+FDAB ; 0636 062D 0649 ;        SA      # ( ‎ﶫ‎ → ‎ضحى‎ ) ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM → ARABIC LETTER DAD, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA  # →‎ضحي‎→
+
+FD2C ; 0636 0631 ;     SA      # ( ‎ﴬ‎ → ‎ضر‎ ) ARABIC LIGATURE DAD WITH REH FINAL FORM → ARABIC LETTER DAD, ARABIC LETTER REH # 
+FD10 ; 0636 0631 ;     SA      # ( ‎ﴐ‎ → ‎ضر‎ ) ARABIC LIGATURE DAD WITH REH ISOLATED FORM → ARABIC LETTER DAD, ARABIC LETTER REH      # 
+
+FCB7 ; 0636 0645 ;     SA      # ( ‎ﲷ‎ → ‎ضم‎ ) ARABIC LIGATURE DAD WITH MEEM INITIAL FORM → ARABIC LETTER DAD, ARABIC LETTER MEEM     # 
+FC25 ; 0636 0645 ;     SA      # ( ‎ﰥ‎ → ‎ضم‎ ) ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM → ARABIC LETTER DAD, ARABIC LETTER MEEM    # 
+
+FD23 ; 0636 0649 ;     SA      # ( ‎ﴣ‎ → ‎ضى‎ ) ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER DAD, ARABIC LETTER ALEF MAKSURA       # 
+FD07 ; 0636 0649 ;     SA      # ( ‎ﴇ‎ → ‎ضى‎ ) ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER DAD, ARABIC LETTER ALEF MAKSURA    # 
+FD24 ; 0636 0649 ;     SA      # ( ‎ﴤ‎ → ‎ضى‎ ) ARABIC LIGATURE DAD WITH YEH FINAL FORM → ARABIC LETTER DAD, ARABIC LETTER ALEF MAKSURA        # →‎ضي‎→
+FD08 ; 0636 0649 ;     SA      # ( ‎ﴈ‎ → ‎ضى‎ ) ARABIC LIGATURE DAD WITH YEH ISOLATED FORM → ARABIC LETTER DAD, ARABIC LETTER ALEF MAKSURA     # →‎ضي‎→
+
+FEC3 ; 0637 ;  SA      # ( ‎ﻃ‎ → ‎ط‎ ) ARABIC LETTER TAH INITIAL FORM → ARABIC LETTER TAH       # 
+FEC4 ; 0637 ;  SA      # ( ‎ﻄ‎ → ‎ط‎ ) ARABIC LETTER TAH MEDIAL FORM → ARABIC LETTER TAH        # 
+FEC2 ; 0637 ;  SA      # ( ‎ﻂ‎ → ‎ط‎ ) ARABIC LETTER TAH FINAL FORM → ARABIC LETTER TAH # 
+FEC1 ; 0637 ;  SA      # ( ‎ﻁ‎ → ‎ط‎ ) ARABIC LETTER TAH ISOLATED FORM → ARABIC LETTER TAH      # 
+
+FCB8 ; 0637 062D ;     SA      # ( ‎ﲸ‎ → ‎طح‎ ) ARABIC LIGATURE TAH WITH HAH INITIAL FORM → ARABIC LETTER TAH, ARABIC LETTER HAH       # 
+FC26 ; 0637 062D ;     SA      # ( ‎ﰦ‎ → ‎طح‎ ) ARABIC LIGATURE TAH WITH HAH ISOLATED FORM → ARABIC LETTER TAH, ARABIC LETTER HAH      # 
+
+FD33 ; 0637 0645 ;     SA      # ( ‎ﴳ‎ → ‎طم‎ ) ARABIC LIGATURE TAH WITH MEEM INITIAL FORM → ARABIC LETTER TAH, ARABIC LETTER MEEM     # 
+FD3A ; 0637 0645 ;     SA      # ( ‎ﴺ‎ → ‎طم‎ ) ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM → ARABIC LETTER TAH, ARABIC LETTER MEEM      # 
+FC27 ; 0637 0645 ;     SA      # ( ‎ﰧ‎ → ‎طم‎ ) ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM → ARABIC LETTER TAH, ARABIC LETTER MEEM    # 
+
+FD72 ; 0637 0645 062D ;        SA      # ( ‎ﵲ‎ → ‎طمح‎ ) ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM → ARABIC LETTER TAH, ARABIC LETTER MEEM, ARABIC LETTER HAH       # 
+FD71 ; 0637 0645 062D ;        SA      # ( ‎ﵱ‎ → ‎طمح‎ ) ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM → ARABIC LETTER TAH, ARABIC LETTER MEEM, ARABIC LETTER HAH # 
+
+FD73 ; 0637 0645 0645 ;        SA      # ( ‎ﵳ‎ → ‎طمم‎ ) ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM → ARABIC LETTER TAH, ARABIC LETTER MEEM, ARABIC LETTER MEEM     # 
+
+FD74 ; 0637 0645 0649 ;        SA      # ( ‎ﵴ‎ → ‎طمى‎ ) ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER TAH, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA        # →‎طمي‎→
+
+FD11 ; 0637 0649 ;     SA      # ( ‎ﴑ‎ → ‎طى‎ ) ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER TAH, ARABIC LETTER ALEF MAKSURA       # 
+FCF5 ; 0637 0649 ;     SA      # ( ‎ﳵ‎ → ‎طى‎ ) ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER TAH, ARABIC LETTER ALEF MAKSURA    # 
+FD12 ; 0637 0649 ;     SA      # ( ‎ﴒ‎ → ‎طى‎ ) ARABIC LIGATURE TAH WITH YEH FINAL FORM → ARABIC LETTER TAH, ARABIC LETTER ALEF MAKSURA        # →‎طي‎→
+FCF6 ; 0637 0649 ;     SA      # ( ‎ﳶ‎ → ‎طى‎ ) ARABIC LIGATURE TAH WITH YEH ISOLATED FORM → ARABIC LETTER TAH, ARABIC LETTER ALEF MAKSURA     # →‎طي‎→
+
+FEC7 ; 0638 ;  SA      # ( ‎ﻇ‎ → ‎ظ‎ ) ARABIC LETTER ZAH INITIAL FORM → ARABIC LETTER ZAH       # 
+FEC8 ; 0638 ;  SA      # ( ‎ﻈ‎ → ‎ظ‎ ) ARABIC LETTER ZAH MEDIAL FORM → ARABIC LETTER ZAH        # 
+FEC6 ; 0638 ;  SA      # ( ‎ﻆ‎ → ‎ظ‎ ) ARABIC LETTER ZAH FINAL FORM → ARABIC LETTER ZAH # 
+FEC5 ; 0638 ;  SA      # ( ‎ﻅ‎ → ‎ظ‎ ) ARABIC LETTER ZAH ISOLATED FORM → ARABIC LETTER ZAH      # 
+
+FCB9 ; 0638 0645 ;     SA      # ( ‎ﲹ‎ → ‎ظم‎ ) ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM → ARABIC LETTER ZAH, ARABIC LETTER MEEM     # 
+FD3B ; 0638 0645 ;     SA      # ( ‎ﴻ‎ → ‎ظم‎ ) ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM → ARABIC LETTER ZAH, ARABIC LETTER MEEM      # 
+FC28 ; 0638 0645 ;     SA      # ( ‎ﰨ‎ → ‎ظم‎ ) ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM → ARABIC LETTER ZAH, ARABIC LETTER MEEM    # 
+
+FECB ; 0639 ;  SA      # ( ‎ﻋ‎ → ‎ع‎ ) ARABIC LETTER AIN INITIAL FORM → ARABIC LETTER AIN       # 
+FECC ; 0639 ;  SA      # ( ‎ﻌ‎ → ‎ع‎ ) ARABIC LETTER AIN MEDIAL FORM → ARABIC LETTER AIN        # 
+FECA ; 0639 ;  SA      # ( ‎ﻊ‎ → ‎ع‎ ) ARABIC LETTER AIN FINAL FORM → ARABIC LETTER AIN # 
+FEC9 ; 0639 ;  SA      # ( ‎ﻉ‎ → ‎ع‎ ) ARABIC LETTER AIN ISOLATED FORM → ARABIC LETTER AIN      # 
+
+FCBA ; 0639 062C ;     SA      # ( ‎ﲺ‎ → ‎عج‎ ) ARABIC LIGATURE AIN WITH JEEM INITIAL FORM → ARABIC LETTER AIN, ARABIC LETTER JEEM     # 
+FC29 ; 0639 062C ;     SA      # ( ‎ﰩ‎ → ‎عج‎ ) ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM → ARABIC LETTER AIN, ARABIC LETTER JEEM    # 
+
+FDC4 ; 0639 062C 0645 ;        SA      # ( ‎ﷄ‎ → ‎عجم‎ ) ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM → ARABIC LETTER AIN, ARABIC LETTER JEEM, ARABIC LETTER MEEM     # 
+FD75 ; 0639 062C 0645 ;        SA      # ( ‎ﵵ‎ → ‎عجم‎ ) ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM → ARABIC LETTER AIN, ARABIC LETTER JEEM, ARABIC LETTER MEEM       # 
+
+FDF7 ; 0639 0644 0649 0647 ;   SA      # ( ‎ﷷ‎ → ‎علىه‎ ) ARABIC LIGATURE ALAYHE ISOLATED FORM → ARABIC LETTER AIN, ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HEH # →‎عليه‎→
+
+FCBB ; 0639 0645 ;     SA      # ( ‎ﲻ‎ → ‎عم‎ ) ARABIC LIGATURE AIN WITH MEEM INITIAL FORM → ARABIC LETTER AIN, ARABIC LETTER MEEM     # 
+FC2A ; 0639 0645 ;     SA      # ( ‎ﰪ‎ → ‎عم‎ ) ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM → ARABIC LETTER AIN, ARABIC LETTER MEEM    # 
+
+FD77 ; 0639 0645 0645 ;        SA      # ( ‎ﵷ‎ → ‎عمم‎ ) ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM → ARABIC LETTER AIN, ARABIC LETTER MEEM, ARABIC LETTER MEEM     # 
+FD76 ; 0639 0645 0645 ;        SA      # ( ‎ﵶ‎ → ‎عمم‎ ) ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM → ARABIC LETTER AIN, ARABIC LETTER MEEM, ARABIC LETTER MEEM       # 
+
+FD78 ; 0639 0645 0649 ;        SA      # ( ‎ﵸ‎ → ‎عمى‎ ) ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER AIN, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA       # 
+FDB6 ; 0639 0645 0649 ;        SA      # ( ‎ﶶ‎ → ‎عمى‎ ) ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER AIN, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA        # →‎عمي‎→
+
+FD13 ; 0639 0649 ;     SA      # ( ‎ﴓ‎ → ‎عى‎ ) ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER AIN, ARABIC LETTER ALEF MAKSURA       # 
+FCF7 ; 0639 0649 ;     SA      # ( ‎ﳷ‎ → ‎عى‎ ) ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER AIN, ARABIC LETTER ALEF MAKSURA    # 
+FD14 ; 0639 0649 ;     SA      # ( ‎ﴔ‎ → ‎عى‎ ) ARABIC LIGATURE AIN WITH YEH FINAL FORM → ARABIC LETTER AIN, ARABIC LETTER ALEF MAKSURA        # →‎عي‎→
+FCF8 ; 0639 0649 ;     SA      # ( ‎ﳸ‎ → ‎عى‎ ) ARABIC LIGATURE AIN WITH YEH ISOLATED FORM → ARABIC LETTER AIN, ARABIC LETTER ALEF MAKSURA     # →‎عي‎→
+
+FECF ; 063A ;  SA      # ( ‎ﻏ‎ → ‎غ‎ ) ARABIC LETTER GHAIN INITIAL FORM → ARABIC LETTER GHAIN   # 
+FED0 ; 063A ;  SA      # ( ‎ﻐ‎ → ‎غ‎ ) ARABIC LETTER GHAIN MEDIAL FORM → ARABIC LETTER GHAIN    # 
+FECE ; 063A ;  SA      # ( ‎ﻎ‎ → ‎غ‎ ) ARABIC LETTER GHAIN FINAL FORM → ARABIC LETTER GHAIN     # 
+FECD ; 063A ;  SA      # ( ‎ﻍ‎ → ‎غ‎ ) ARABIC LETTER GHAIN ISOLATED FORM → ARABIC LETTER GHAIN  # 
+
+FCBC ; 063A 062C ;     SA      # ( ‎ﲼ‎ → ‎غج‎ ) ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM → ARABIC LETTER GHAIN, ARABIC LETTER JEEM # 
+FC2B ; 063A 062C ;     SA      # ( ‎ﰫ‎ → ‎غج‎ ) ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM → ARABIC LETTER GHAIN, ARABIC LETTER JEEM        # 
+
+FCBD ; 063A 0645 ;     SA      # ( ‎ﲽ‎ → ‎غم‎ ) ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM → ARABIC LETTER GHAIN, ARABIC LETTER MEEM # 
+FC2C ; 063A 0645 ;     SA      # ( ‎ﰬ‎ → ‎غم‎ ) ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM → ARABIC LETTER GHAIN, ARABIC LETTER MEEM        # 
+
+FD79 ; 063A 0645 0645 ;        SA      # ( ‎ﵹ‎ → ‎غمم‎ ) ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM → ARABIC LETTER GHAIN, ARABIC LETTER MEEM, ARABIC LETTER MEEM   # 
+
+FD7B ; 063A 0645 0649 ;        SA      # ( ‎ﵻ‎ → ‎غمى‎ ) ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER GHAIN, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA   # 
+FD7A ; 063A 0645 0649 ;        SA      # ( ‎ﵺ‎ → ‎غمى‎ ) ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER GHAIN, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA    # →‎غمي‎→
+
+FD15 ; 063A 0649 ;     SA      # ( ‎ﴕ‎ → ‎غى‎ ) ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER GHAIN, ARABIC LETTER ALEF MAKSURA   # 
+FCF9 ; 063A 0649 ;     SA      # ( ‎ﳹ‎ → ‎غى‎ ) ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER GHAIN, ARABIC LETTER ALEF MAKSURA        # 
+FD16 ; 063A 0649 ;     SA      # ( ‎ﴖ‎ → ‎غى‎ ) ARABIC LIGATURE GHAIN WITH YEH FINAL FORM → ARABIC LETTER GHAIN, ARABIC LETTER ALEF MAKSURA    # →‎غي‎→
+FCFA ; 063A 0649 ;     SA      # ( ‎ﳺ‎ → ‎غى‎ ) ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM → ARABIC LETTER GHAIN, ARABIC LETTER ALEF MAKSURA # →‎غي‎→
+
+FED3 ; 0641 ;  SA      # ( ‎ﻓ‎ → ‎ف‎ ) ARABIC LETTER FEH INITIAL FORM → ARABIC LETTER FEH       # 
+FED4 ; 0641 ;  SA      # ( ‎ﻔ‎ → ‎ف‎ ) ARABIC LETTER FEH MEDIAL FORM → ARABIC LETTER FEH        # 
+FED2 ; 0641 ;  SA      # ( ‎ﻒ‎ → ‎ف‎ ) ARABIC LETTER FEH FINAL FORM → ARABIC LETTER FEH # 
+FED1 ; 0641 ;  SA      # ( ‎ﻑ‎ → ‎ف‎ ) ARABIC LETTER FEH ISOLATED FORM → ARABIC LETTER FEH      # 
+
+FCBE ; 0641 062C ;     SA      # ( ‎ﲾ‎ → ‎فج‎ ) ARABIC LIGATURE FEH WITH JEEM INITIAL FORM → ARABIC LETTER FEH, ARABIC LETTER JEEM     # 
+FC2D ; 0641 062C ;     SA      # ( ‎ﰭ‎ → ‎فج‎ ) ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM → ARABIC LETTER FEH, ARABIC LETTER JEEM    # 
+FCC0 ; 0641 062C ;     SA      # ( ‎ﳀ‎ → ‎فج‎ ) ARABIC LIGATURE FEH WITH KHAH INITIAL FORM → ARABIC LETTER FEH, ARABIC LETTER JEEM     # →‎فخ‎→→‎ﰯ‎→→‎ﰭ‎→
+FC2F ; 0641 062C ;     SA      # ( ‎ﰯ‎ → ‎فج‎ ) ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM → ARABIC LETTER FEH, ARABIC LETTER JEEM    # →‎ﰭ‎→
+
+FD7D ; 0641 062C 0645 ;        SA      # ( ‎ﵽ‎ → ‎فجم‎ ) ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM → ARABIC LETTER FEH, ARABIC LETTER JEEM, ARABIC LETTER MEEM     # →‎فخم‎→
+FD7C ; 0641 062C 0645 ;        SA      # ( ‎ﵼ‎ → ‎فجم‎ ) ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM → ARABIC LETTER FEH, ARABIC LETTER JEEM, ARABIC LETTER MEEM       # →‎فخم‎→
+
+FCBF ; 0641 062D ;     SA      # ( ‎ﲿ‎ → ‎فح‎ ) ARABIC LIGATURE FEH WITH HAH INITIAL FORM → ARABIC LETTER FEH, ARABIC LETTER HAH       # 
+FC2E ; 0641 062D ;     SA      # ( ‎ﰮ‎ → ‎فح‎ ) ARABIC LIGATURE FEH WITH HAH ISOLATED FORM → ARABIC LETTER FEH, ARABIC LETTER HAH      # 
+
+FCC1 ; 0641 0645 ;     SA      # ( ‎ﳁ‎ → ‎فم‎ ) ARABIC LIGATURE FEH WITH MEEM INITIAL FORM → ARABIC LETTER FEH, ARABIC LETTER MEEM     # 
+FC30 ; 0641 0645 ;     SA      # ( ‎ﰰ‎ → ‎فم‎ ) ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM → ARABIC LETTER FEH, ARABIC LETTER MEEM    # 
+
+FDC1 ; 0641 0645 0649 ;        SA      # ( ‎ﷁ‎ → ‎فمى‎ ) ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER FEH, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA        # →‎فمي‎→
+
+FC7C ; 0641 0649 ;     SA      # ( ‎ﱼ‎ → ‎فى‎ ) ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER FEH, ARABIC LETTER ALEF MAKSURA       # 
+FC31 ; 0641 0649 ;     SA      # ( ‎ﰱ‎ → ‎فى‎ ) ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER FEH, ARABIC LETTER ALEF MAKSURA    # 
+FC7D ; 0641 0649 ;     SA      # ( ‎ﱽ‎ → ‎فى‎ ) ARABIC LIGATURE FEH WITH YEH FINAL FORM → ARABIC LETTER FEH, ARABIC LETTER ALEF MAKSURA        # →‎في‎→
+FC32 ; 0641 0649 ;     SA      # ( ‎ﰲ‎ → ‎فى‎ ) ARABIC LIGATURE FEH WITH YEH ISOLATED FORM → ARABIC LETTER FEH, ARABIC LETTER ALEF MAKSURA     # →‎في‎→
+
+FB6C ; 06A4 ;  SA      # ( ‎ﭬ‎ → ‎ڤ‎ ) ARABIC LETTER VEH INITIAL FORM → ARABIC LETTER VEH       # 
+FB6D ; 06A4 ;  SA      # ( ‎ﭭ‎ → ‎ڤ‎ ) ARABIC LETTER VEH MEDIAL FORM → ARABIC LETTER VEH        # 
+FB6B ; 06A4 ;  SA      # ( ‎ﭫ‎ → ‎ڤ‎ ) ARABIC LETTER VEH FINAL FORM → ARABIC LETTER VEH # 
+FB6A ; 06A4 ;  SA      # ( ‎ﭪ‎ → ‎ڤ‎ ) ARABIC LETTER VEH ISOLATED FORM → ARABIC LETTER VEH      # 
+
+FB70 ; 06A6 ;  SA      # ( ‎ﭰ‎ → ‎ڦ‎ ) ARABIC LETTER PEHEH INITIAL FORM → ARABIC LETTER PEHEH   # 
+FB71 ; 06A6 ;  SA      # ( ‎ﭱ‎ → ‎ڦ‎ ) ARABIC LETTER PEHEH MEDIAL FORM → ARABIC LETTER PEHEH    # 
+FB6F ; 06A6 ;  SA      # ( ‎ﭯ‎ → ‎ڦ‎ ) ARABIC LETTER PEHEH FINAL FORM → ARABIC LETTER PEHEH     # 
+FB6E ; 06A6 ;  SA      # ( ‎ﭮ‎ → ‎ڦ‎ ) ARABIC LETTER PEHEH ISOLATED FORM → ARABIC LETTER PEHEH  # 
+
+FED7 ; 0642 ;  SA      # ( ‎ﻗ‎ → ‎ق‎ ) ARABIC LETTER QAF INITIAL FORM → ARABIC LETTER QAF       # 
+FED8 ; 0642 ;  SA      # ( ‎ﻘ‎ → ‎ق‎ ) ARABIC LETTER QAF MEDIAL FORM → ARABIC LETTER QAF        # 
+FED6 ; 0642 ;  SA      # ( ‎ﻖ‎ → ‎ق‎ ) ARABIC LETTER QAF FINAL FORM → ARABIC LETTER QAF # 
+FED5 ; 0642 ;  SA      # ( ‎ﻕ‎ → ‎ق‎ ) ARABIC LETTER QAF ISOLATED FORM → ARABIC LETTER QAF      # 
+
+FCC2 ; 0642 062D ;     SA      # ( ‎ﳂ‎ → ‎قح‎ ) ARABIC LIGATURE QAF WITH HAH INITIAL FORM → ARABIC LETTER QAF, ARABIC LETTER HAH       # 
+FC33 ; 0642 062D ;     SA      # ( ‎ﰳ‎ → ‎قح‎ ) ARABIC LIGATURE QAF WITH HAH ISOLATED FORM → ARABIC LETTER QAF, ARABIC LETTER HAH      # 
+
+FDF1 ; 0642 0644 06D2 ;        SA      # ( ‎ﷱ‎ → ‎قلے‎ ) ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM → ARABIC LETTER QAF, ARABIC LETTER LAM, ARABIC LETTER YEH BARREE        # 
+
+FCC3 ; 0642 0645 ;     SA      # ( ‎ﳃ‎ → ‎قم‎ ) ARABIC LIGATURE QAF WITH MEEM INITIAL FORM → ARABIC LETTER QAF, ARABIC LETTER MEEM     # 
+FC34 ; 0642 0645 ;     SA      # ( ‎ﰴ‎ → ‎قم‎ ) ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM → ARABIC LETTER QAF, ARABIC LETTER MEEM    # 
+
+FDB4 ; 0642 0645 062D ;        SA      # ( ‎ﶴ‎ → ‎قمح‎ ) ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM → ARABIC LETTER QAF, ARABIC LETTER MEEM, ARABIC LETTER HAH       # 
+FD7E ; 0642 0645 062D ;        SA      # ( ‎ﵾ‎ → ‎قمح‎ ) ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM → ARABIC LETTER QAF, ARABIC LETTER MEEM, ARABIC LETTER HAH # 
+
+FD7F ; 0642 0645 0645 ;        SA      # ( ‎ﵿ‎ → ‎قمم‎ ) ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM → ARABIC LETTER QAF, ARABIC LETTER MEEM, ARABIC LETTER MEEM       # 
+
+FDB2 ; 0642 0645 0649 ;        SA      # ( ‎ﶲ‎ → ‎قمى‎ ) ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER QAF, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA        # →‎قمي‎→
+
+FC7E ; 0642 0649 ;     SA      # ( ‎ﱾ‎ → ‎قى‎ ) ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER QAF, ARABIC LETTER ALEF MAKSURA       # 
+FC35 ; 0642 0649 ;     SA      # ( ‎ﰵ‎ → ‎قى‎ ) ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER QAF, ARABIC LETTER ALEF MAKSURA    # 
+FC7F ; 0642 0649 ;     SA      # ( ‎ﱿ‎ → ‎قى‎ ) ARABIC LIGATURE QAF WITH YEH FINAL FORM → ARABIC LETTER QAF, ARABIC LETTER ALEF MAKSURA        # →‎قي‎→
+FC36 ; 0642 0649 ;     SA      # ( ‎ﰶ‎ → ‎قى‎ ) ARABIC LIGATURE QAF WITH YEH ISOLATED FORM → ARABIC LETTER QAF, ARABIC LETTER ALEF MAKSURA     # →‎قي‎→
+
+FEDB ; 0643 ;  SA      # ( ‎ﻛ‎ → ‎ك‎ ) ARABIC LETTER KAF INITIAL FORM → ARABIC LETTER KAF       # 
+FEDC ; 0643 ;  SA      # ( ‎ﻜ‎ → ‎ك‎ ) ARABIC LETTER KAF MEDIAL FORM → ARABIC LETTER KAF        # 
+FEDA ; 0643 ;  SA      # ( ‎ﻚ‎ → ‎ك‎ ) ARABIC LETTER KAF FINAL FORM → ARABIC LETTER KAF # 
+FED9 ; 0643 ;  SA      # ( ‎ﻙ‎ → ‎ك‎ ) ARABIC LETTER KAF ISOLATED FORM → ARABIC LETTER KAF      # 
+06A9 ; 0643 ;  SA      # ( ‎ک‎ → ‎ك‎ ) ARABIC LETTER KEHEH → ARABIC LETTER KAF   # 
+FB90 ; 0643 ;  SA      # ( ‎ﮐ‎ → ‎ك‎ ) ARABIC LETTER KEHEH INITIAL FORM → ARABIC LETTER KAF     # →‎ﻜ‎→
+FB91 ; 0643 ;  SA      # ( ‎ﮑ‎ → ‎ك‎ ) ARABIC LETTER KEHEH MEDIAL FORM → ARABIC LETTER KAF      # →‎ﻜ‎→
+FB8F ; 0643 ;  SA      # ( ‎ﮏ‎ → ‎ك‎ ) ARABIC LETTER KEHEH FINAL FORM → ARABIC LETTER KAF       # →‎ﻚ‎→
+FB8E ; 0643 ;  SA      # ( ‎ﮎ‎ → ‎ك‎ ) ARABIC LETTER KEHEH ISOLATED FORM → ARABIC LETTER KAF    # →‎ک‎→
+
+FC80 ; 0643 0627 ;     SA      # ( ‎ﲀ‎ → ‎كا‎ ) ARABIC LIGATURE KAF WITH ALEF FINAL FORM → ARABIC LETTER KAF, ARABIC LETTER ALEF       # 
+FC37 ; 0643 0627 ;     SA      # ( ‎ﰷ‎ → ‎كا‎ ) ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM → ARABIC LETTER KAF, ARABIC LETTER ALEF    # 
+
+FCC4 ; 0643 062C ;     SA      # ( ‎ﳄ‎ → ‎كج‎ ) ARABIC LIGATURE KAF WITH JEEM INITIAL FORM → ARABIC LETTER KAF, ARABIC LETTER JEEM     # 
+FC38 ; 0643 062C ;     SA      # ( ‎ﰸ‎ → ‎كج‎ ) ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM → ARABIC LETTER KAF, ARABIC LETTER JEEM    # 
+FCC6 ; 0643 062C ;     SA      # ( ‎ﳆ‎ → ‎كج‎ ) ARABIC LIGATURE KAF WITH KHAH INITIAL FORM → ARABIC LETTER KAF, ARABIC LETTER JEEM     # →‎كخ‎→→‎ﰺ‎→→‎ﰸ‎→
+FC3A ; 0643 062C ;     SA      # ( ‎ﰺ‎ → ‎كج‎ ) ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM → ARABIC LETTER KAF, ARABIC LETTER JEEM    # →‎ﰸ‎→
+
+FCC5 ; 0643 062D ;     SA      # ( ‎ﳅ‎ → ‎كح‎ ) ARABIC LIGATURE KAF WITH HAH INITIAL FORM → ARABIC LETTER KAF, ARABIC LETTER HAH       # 
+FC39 ; 0643 062D ;     SA      # ( ‎ﰹ‎ → ‎كح‎ ) ARABIC LIGATURE KAF WITH HAH ISOLATED FORM → ARABIC LETTER KAF, ARABIC LETTER HAH      # 
+
+FCC7 ; 0643 0644 ;     SA      # ( ‎ﳇ‎ → ‎كل‎ ) ARABIC LIGATURE KAF WITH LAM INITIAL FORM → ARABIC LETTER KAF, ARABIC LETTER LAM       # 
+FCEB ; 0643 0644 ;     SA      # ( ‎ﳫ‎ → ‎كل‎ ) ARABIC LIGATURE KAF WITH LAM MEDIAL FORM → ARABIC LETTER KAF, ARABIC LETTER LAM        # 
+FC81 ; 0643 0644 ;     SA      # ( ‎ﲁ‎ → ‎كل‎ ) ARABIC LIGATURE KAF WITH LAM FINAL FORM → ARABIC LETTER KAF, ARABIC LETTER LAM # 
+FC3B ; 0643 0644 ;     SA      # ( ‎ﰻ‎ → ‎كل‎ ) ARABIC LIGATURE KAF WITH LAM ISOLATED FORM → ARABIC LETTER KAF, ARABIC LETTER LAM      # 
+
+FCC8 ; 0643 0645 ;     SA      # ( ‎ﳈ‎ → ‎كم‎ ) ARABIC LIGATURE KAF WITH MEEM INITIAL FORM → ARABIC LETTER KAF, ARABIC LETTER MEEM     # 
+FCEC ; 0643 0645 ;     SA      # ( ‎ﳬ‎ → ‎كم‎ ) ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM → ARABIC LETTER KAF, ARABIC LETTER MEEM      # 
+FC82 ; 0643 0645 ;     SA      # ( ‎ﲂ‎ → ‎كم‎ ) ARABIC LIGATURE KAF WITH MEEM FINAL FORM → ARABIC LETTER KAF, ARABIC LETTER MEEM       # 
+FC3C ; 0643 0645 ;     SA      # ( ‎ﰼ‎ → ‎كم‎ ) ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM → ARABIC LETTER KAF, ARABIC LETTER MEEM    # 
+
+FDC3 ; 0643 0645 0645 ;        SA      # ( ‎ﷃ‎ → ‎كمم‎ ) ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM → ARABIC LETTER KAF, ARABIC LETTER MEEM, ARABIC LETTER MEEM     # 
+FDBB ; 0643 0645 0645 ;        SA      # ( ‎ﶻ‎ → ‎كمم‎ ) ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM → ARABIC LETTER KAF, ARABIC LETTER MEEM, ARABIC LETTER MEEM       # 
+
+FDB7 ; 0643 0645 0649 ;        SA      # ( ‎ﶷ‎ → ‎كمى‎ ) ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER KAF, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA        # →‎كمي‎→
+
+FC83 ; 0643 0649 ;     SA      # ( ‎ﲃ‎ → ‎كى‎ ) ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER KAF, ARABIC LETTER ALEF MAKSURA       # 
+FC3D ; 0643 0649 ;     SA      # ( ‎ﰽ‎ → ‎كى‎ ) ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER KAF, ARABIC LETTER ALEF MAKSURA    # 
+FC84 ; 0643 0649 ;     SA      # ( ‎ﲄ‎ → ‎كى‎ ) ARABIC LIGATURE KAF WITH YEH FINAL FORM → ARABIC LETTER KAF, ARABIC LETTER ALEF MAKSURA        # →‎كي‎→
+FC3E ; 0643 0649 ;     SA      # ( ‎ﰾ‎ → ‎كى‎ ) ARABIC LIGATURE KAF WITH YEH ISOLATED FORM → ARABIC LETTER KAF, ARABIC LETTER ALEF MAKSURA     # →‎كي‎→
+
+FBD5 ; 06AD ;  SA      # ( ‎ﯕ‎ → ‎ڭ‎ ) ARABIC LETTER NG INITIAL FORM → ARABIC LETTER NG # 
+FBD6 ; 06AD ;  SA      # ( ‎ﯖ‎ → ‎ڭ‎ ) ARABIC LETTER NG MEDIAL FORM → ARABIC LETTER NG  # 
+FBD4 ; 06AD ;  SA      # ( ‎ﯔ‎ → ‎ڭ‎ ) ARABIC LETTER NG FINAL FORM → ARABIC LETTER NG   # 
+FBD3 ; 06AD ;  SA      # ( ‎ﯓ‎ → ‎ڭ‎ ) ARABIC LETTER NG ISOLATED FORM → ARABIC LETTER NG        # 
+
+FB94 ; 06AF ;  SA      # ( ‎ﮔ‎ → ‎گ‎ ) ARABIC LETTER GAF INITIAL FORM → ARABIC LETTER GAF       # 
+FB95 ; 06AF ;  SA      # ( ‎ﮕ‎ → ‎گ‎ ) ARABIC LETTER GAF MEDIAL FORM → ARABIC LETTER GAF        # 
+FB93 ; 06AF ;  SA      # ( ‎ﮓ‎ → ‎گ‎ ) ARABIC LETTER GAF FINAL FORM → ARABIC LETTER GAF # 
+FB92 ; 06AF ;  SA      # ( ‎ﮒ‎ → ‎گ‎ ) ARABIC LETTER GAF ISOLATED FORM → ARABIC LETTER GAF      # 
+
+FB9C ; 06B1 ;  SA      # ( ‎ﮜ‎ → ‎ڱ‎ ) ARABIC LETTER NGOEH INITIAL FORM → ARABIC LETTER NGOEH   # 
+FB9D ; 06B1 ;  SA      # ( ‎ﮝ‎ → ‎ڱ‎ ) ARABIC LETTER NGOEH MEDIAL FORM → ARABIC LETTER NGOEH    # 
+FB9B ; 06B1 ;  SA      # ( ‎ﮛ‎ → ‎ڱ‎ ) ARABIC LETTER NGOEH FINAL FORM → ARABIC LETTER NGOEH     # 
+FB9A ; 06B1 ;  SA      # ( ‎ﮚ‎ → ‎ڱ‎ ) ARABIC LETTER NGOEH ISOLATED FORM → ARABIC LETTER NGOEH  # 
+
+FB98 ; 06B3 ;  SA      # ( ‎ﮘ‎ → ‎ڳ‎ ) ARABIC LETTER GUEH INITIAL FORM → ARABIC LETTER GUEH     # 
+FB99 ; 06B3 ;  SA      # ( ‎ﮙ‎ → ‎ڳ‎ ) ARABIC LETTER GUEH MEDIAL FORM → ARABIC LETTER GUEH      # 
+FB97 ; 06B3 ;  SA      # ( ‎ﮗ‎ → ‎ڳ‎ ) ARABIC LETTER GUEH FINAL FORM → ARABIC LETTER GUEH       # 
+FB96 ; 06B3 ;  SA      # ( ‎ﮖ‎ → ‎ڳ‎ ) ARABIC LETTER GUEH ISOLATED FORM → ARABIC LETTER GUEH    # 
+
+FEDF ; 0644 ;  SA      # ( ‎ﻟ‎ → ‎ل‎ ) ARABIC LETTER LAM INITIAL FORM → ARABIC LETTER LAM       # 
+FEE0 ; 0644 ;  SA      # ( ‎ﻠ‎ → ‎ل‎ ) ARABIC LETTER LAM MEDIAL FORM → ARABIC LETTER LAM        # 
+FEDE ; 0644 ;  SA      # ( ‎ﻞ‎ → ‎ل‎ ) ARABIC LETTER LAM FINAL FORM → ARABIC LETTER LAM # 
+FEDD ; 0644 ;  SA      # ( ‎ﻝ‎ → ‎ل‎ ) ARABIC LETTER LAM ISOLATED FORM → ARABIC LETTER LAM      # 
+
+FEF6 ; 0644 0622 ;     SA      # ( ‎ﻶ‎ → ‎لآ‎ ) ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF WITH MADDA ABOVE     # 
+FEF5 ; 0644 0622 ;     SA      # ( ‎ﻵ‎ → ‎لآ‎ ) ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF WITH MADDA ABOVE  # 
+
+FEFA ; 0644 0625 ;     SA      # ( ‎ﻺ‎ → ‎لإ‎ ) ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF WITH HAMZA BELOW     # 
+FEF9 ; 0644 0625 ;     SA      # ( ‎ﻹ‎ → ‎لإ‎ ) ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF WITH HAMZA BELOW  # 
+
+FEFC ; 0644 0627 ;     SA      # ( ‎ﻼ‎ → ‎لا‎ ) ARABIC LIGATURE LAM WITH ALEF FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF       # 
+FEFB ; 0644 0627 ;     SA      # ( ‎ﻻ‎ → ‎لا‎ ) ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF    # 
+
+FEF8 ; 0644 0627 0674 ;        SA      # ( ‎ﻸ‎ → ‎لاٴ‎ ) ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF, ARABIC LETTER HIGH HAMZA  # →‎لأ‎→
+FEF7 ; 0644 0627 0674 ;        SA      # ( ‎ﻷ‎ → ‎لاٴ‎ ) ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF, ARABIC LETTER HIGH HAMZA       # →‎لأ‎→
+
+FCC9 ; 0644 062C ;     SA      # ( ‎ﳉ‎ → ‎لج‎ ) ARABIC LIGATURE LAM WITH JEEM INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM     # 
+FC3F ; 0644 062C ;     SA      # ( ‎ﰿ‎ → ‎لج‎ ) ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM    # 
+FCCB ; 0644 062C ;     SA      # ( ‎ﳋ‎ → ‎لج‎ ) ARABIC LIGATURE LAM WITH KHAH INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM     # →‎لخ‎→→‎ﱁ‎→→‎ﰿ‎→
+FC41 ; 0644 062C ;     SA      # ( ‎ﱁ‎ → ‎لج‎ ) ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM    # →‎ﰿ‎→
+
+FD83 ; 0644 062C 062C ;        SA      # ( ‎ﶃ‎ → ‎لجج‎ ) ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM, ARABIC LETTER JEEM     # 
+FD84 ; 0644 062C 062C ;        SA      # ( ‎ﶄ‎ → ‎لجج‎ ) ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM, ARABIC LETTER JEEM       # 
+
+FDBA ; 0644 062C 0645 ;        SA      # ( ‎ﶺ‎ → ‎لجم‎ ) ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM, ARABIC LETTER MEEM     # 
+FDBC ; 0644 062C 0645 ;        SA      # ( ‎ﶼ‎ → ‎لجم‎ ) ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM, ARABIC LETTER MEEM       # 
+FD86 ; 0644 062C 0645 ;        SA      # ( ‎ﶆ‎ → ‎لجم‎ ) ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM, ARABIC LETTER MEEM     # →‎لخم‎→
+FD85 ; 0644 062C 0645 ;        SA      # ( ‎ﶅ‎ → ‎لجم‎ ) ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM, ARABIC LETTER MEEM       # →‎لخم‎→
+
+FDAC ; 0644 062C 0649 ;        SA      # ( ‎ﶬ‎ → ‎لجى‎ ) ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA        # →‎لجي‎→
+
+FCCA ; 0644 062D ;     SA      # ( ‎ﳊ‎ → ‎لح‎ ) ARABIC LIGATURE LAM WITH HAH INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER HAH       # 
+FC40 ; 0644 062D ;     SA      # ( ‎ﱀ‎ → ‎لح‎ ) ARABIC LIGATURE LAM WITH HAH ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER HAH      # 
+
+FDB5 ; 0644 062D 0645 ;        SA      # ( ‎ﶵ‎ → ‎لحم‎ ) ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER HAH, ARABIC LETTER MEEM       # 
+FD80 ; 0644 062D 0645 ;        SA      # ( ‎ﶀ‎ → ‎لحم‎ ) ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER HAH, ARABIC LETTER MEEM # 
+
+FD82 ; 0644 062D 0649 ;        SA      # ( ‎ﶂ‎ → ‎لحى‎ ) ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA # 
+FD81 ; 0644 062D 0649 ;        SA      # ( ‎ﶁ‎ → ‎لحى‎ ) ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA  # →‎لحي‎→
+
+FCCC ; 0644 0645 ;     SA      # ( ‎ﳌ‎ → ‎لم‎ ) ARABIC LIGATURE LAM WITH MEEM INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER MEEM     # 
+FCED ; 0644 0645 ;     SA      # ( ‎ﳭ‎ → ‎لم‎ ) ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM → ARABIC LETTER LAM, ARABIC LETTER MEEM      # 
+FC85 ; 0644 0645 ;     SA      # ( ‎ﲅ‎ → ‎لم‎ ) ARABIC LIGATURE LAM WITH MEEM FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER MEEM       # 
+FC42 ; 0644 0645 ;     SA      # ( ‎ﱂ‎ → ‎لم‎ ) ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER MEEM    # 
+
+FD88 ; 0644 0645 062D ;        SA      # ( ‎ﶈ‎ → ‎لمح‎ ) ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER MEEM, ARABIC LETTER HAH       # 
+FD87 ; 0644 0645 062D ;        SA      # ( ‎ﶇ‎ → ‎لمح‎ ) ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER MEEM, ARABIC LETTER HAH # 
+
+FDAD ; 0644 0645 0649 ;        SA      # ( ‎ﶭ‎ → ‎لمى‎ ) ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA        # →‎لمي‎→
+
+FCCD ; 0644 0647 ;     SA      # ( ‎ﳍ‎ → ‎له‎ ) ARABIC LIGATURE LAM WITH HEH INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER HEH       # 
+
+FC86 ; 0644 0649 ;     SA      # ( ‎ﲆ‎ → ‎لى‎ ) ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA       # 
+FC43 ; 0644 0649 ;     SA      # ( ‎ﱃ‎ → ‎لى‎ ) ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA    # 
+FC87 ; 0644 0649 ;     SA      # ( ‎ﲇ‎ → ‎لى‎ ) ARABIC LIGATURE LAM WITH YEH FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA        # →‎لي‎→
+FC44 ; 0644 0649 ;     SA      # ( ‎ﱄ‎ → ‎لى‎ ) ARABIC LIGATURE LAM WITH YEH ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA     # →‎لي‎→
+
+FEE3 ; 0645 ;  SA      # ( ‎ﻣ‎ → ‎م‎ ) ARABIC LETTER MEEM INITIAL FORM → ARABIC LETTER MEEM     # 
+FEE4 ; 0645 ;  SA      # ( ‎ﻤ‎ → ‎م‎ ) ARABIC LETTER MEEM MEDIAL FORM → ARABIC LETTER MEEM      # 
+FEE2 ; 0645 ;  SA      # ( ‎ﻢ‎ → ‎م‎ ) ARABIC LETTER MEEM FINAL FORM → ARABIC LETTER MEEM       # 
+FEE1 ; 0645 ;  SA      # ( ‎ﻡ‎ → ‎م‎ ) ARABIC LETTER MEEM ISOLATED FORM → ARABIC LETTER MEEM    # 
+
+FC88 ; 0645 0627 ;     SA      # ( ‎ﲈ‎ → ‎ما‎ ) ARABIC LIGATURE MEEM WITH ALEF FINAL FORM → ARABIC LETTER MEEM, ARABIC LETTER ALEF     # 
+
+FCCE ; 0645 062C ;     SA      # ( ‎ﳎ‎ → ‎مج‎ ) ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM   # 
+FC45 ; 0645 062C ;     SA      # ( ‎ﱅ‎ → ‎مج‎ ) ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM  # 
+FCD0 ; 0645 062C ;     SA      # ( ‎ﳐ‎ → ‎مج‎ ) ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM   # →‎مخ‎→→‎ﱇ‎→→‎ﱅ‎→
+FC47 ; 0645 062C ;     SA      # ( ‎ﱇ‎ → ‎مج‎ ) ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM  # →‎ﱅ‎→
+
+FD92 ; 0645 062C 062C ;        SA      # ( ‎ﶒ‎ → ‎مجج‎ ) ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM, ARABIC LETTER JEEM   # →‎مجخ‎→
+FD8E ; 0645 062C 062C ;        SA      # ( ‎ﶎ‎ → ‎مجج‎ ) ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM, ARABIC LETTER JEEM   # →‎مخج‎→
+
+FD8C ; 0645 062C 062D ;        SA      # ( ‎ﶌ‎ → ‎مجح‎ ) ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM, ARABIC LETTER HAH     # 
+
+FD8D ; 0645 062C 0645 ;        SA      # ( ‎ﶍ‎ → ‎مجم‎ ) ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM, ARABIC LETTER MEEM   # 
+FD8F ; 0645 062C 0645 ;        SA      # ( ‎ﶏ‎ → ‎مجم‎ ) ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM, ARABIC LETTER MEEM   # →‎مخم‎→
+
+FDC0 ; 0645 062C 0649 ;        SA      # ( ‎ﷀ‎ → ‎مجى‎ ) ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA      # →‎مجي‎→
+FDB9 ; 0645 062C 0649 ;        SA      # ( ‎ﶹ‎ → ‎مجى‎ ) ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA      # →‎مخي‎→
+
+FCCF ; 0645 062D ;     SA      # ( ‎ﳏ‎ → ‎مح‎ ) ARABIC LIGATURE MEEM WITH HAH INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER HAH     # 
+FC46 ; 0645 062D ;     SA      # ( ‎ﱆ‎ → ‎مح‎ ) ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM → ARABIC LETTER MEEM, ARABIC LETTER HAH    # 
+
+FD89 ; 0645 062D 062C ;        SA      # ( ‎ﶉ‎ → ‎محج‎ ) ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER HAH, ARABIC LETTER JEEM     # 
+
+FD8A ; 0645 062D 0645 ;        SA      # ( ‎ﶊ‎ → ‎محم‎ ) ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER HAH, ARABIC LETTER MEEM     # 
+
+FDF4 ; 0645 062D 0645 062F ;   SA      # ( ‎ﷴ‎ → ‎محمد‎ ) ARABIC LIGATURE MOHAMMAD ISOLATED FORM → ARABIC LETTER MEEM, ARABIC LETTER HAH, ARABIC LETTER MEEM, ARABIC LETTER DAL      # 
+
+FD8B ; 0645 062D 0649 ;        SA      # ( ‎ﶋ‎ → ‎محى‎ ) ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM → ARABIC LETTER MEEM, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA        # →‎محي‎→
+
+FCD1 ; 0645 0645 ;     SA      # ( ‎ﳑ‎ → ‎مم‎ ) ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER MEEM   # 
+FC89 ; 0645 0645 ;     SA      # ( ‎ﲉ‎ → ‎مم‎ ) ARABIC LIGATURE MEEM WITH MEEM FINAL FORM → ARABIC LETTER MEEM, ARABIC LETTER MEEM     # 
+FC48 ; 0645 0645 ;     SA      # ( ‎ﱈ‎ → ‎مم‎ ) ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM → ARABIC LETTER MEEM, ARABIC LETTER MEEM  # 
+
+FDB1 ; 0645 0645 0649 ;        SA      # ( ‎ﶱ‎ → ‎ممى‎ ) ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER MEEM, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA      # →‎ممي‎→
+
+FC49 ; 0645 0649 ;     SA      # ( ‎ﱉ‎ → ‎مى‎ ) ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA  # 
+FC4A ; 0645 0649 ;     SA      # ( ‎ﱊ‎ → ‎مى‎ ) ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM → ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA   # →‎مي‎→
+
+FB9F ; 06BA ;  SA      # ( ‎ﮟ‎ → ‎ں‎ ) ARABIC LETTER NOON GHUNNA FINAL FORM → ARABIC LETTER NOON GHUNNA # 
+FB9E ; 06BA ;  SA      # ( ‎ﮞ‎ → ‎ں‎ ) ARABIC LETTER NOON GHUNNA ISOLATED FORM → ARABIC LETTER NOON GHUNNA      # 
+
+FEEB ; 0647 ;  SA      # ( ‎ﻫ‎ → ‎ه‎ ) ARABIC LETTER HEH INITIAL FORM → ARABIC LETTER HEH       # 
+FEEC ; 0647 ;  SA      # ( ‎ﻬ‎ → ‎ه‎ ) ARABIC LETTER HEH MEDIAL FORM → ARABIC LETTER HEH        # 
+FEEA ; 0647 ;  SA      # ( ‎ﻪ‎ → ‎ه‎ ) ARABIC LETTER HEH FINAL FORM → ARABIC LETTER HEH # 
+FEE9 ; 0647 ;  SA      # ( ‎ﻩ‎ → ‎ه‎ ) ARABIC LETTER HEH ISOLATED FORM → ARABIC LETTER HEH      # 
+06BE ; 0647 ;  SA      # ( ‎ھ‎ → ‎ه‎ ) ARABIC LETTER HEH DOACHASHMEE → ARABIC LETTER HEH # 
+FBAC ; 0647 ;  SA      # ( ‎ﮬ‎ → ‎ه‎ ) ARABIC LETTER HEH DOACHASHMEE INITIAL FORM → ARABIC LETTER HEH   # →‎ﻫ‎→
+FBAD ; 0647 ;  SA      # ( ‎ﮭ‎ → ‎ه‎ ) ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM → ARABIC LETTER HEH    # →‎ﻬ‎→
+FBAB ; 0647 ;  SA      # ( ‎ﮫ‎ → ‎ه‎ ) ARABIC LETTER HEH DOACHASHMEE FINAL FORM → ARABIC LETTER HEH     # →‎ﻬ‎→
+FBAA ; 0647 ;  SA      # ( ‎ﮪ‎ → ‎ه‎ ) ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM → ARABIC LETTER HEH  # 
+06C1 ; 0647 ;  SA      # ( ‎ہ‎ → ‎ه‎ ) ARABIC LETTER HEH GOAL → ARABIC LETTER HEH        # →‎ﮦ‎→
+FBA8 ; 0647 ;  SA      # ( ‎ﮨ‎ → ‎ه‎ ) ARABIC LETTER HEH GOAL INITIAL FORM → ARABIC LETTER HEH  # →‎ہ‎→→‎ﮦ‎→
+FBA9 ; 0647 ;  SA      # ( ‎ﮩ‎ → ‎ه‎ ) ARABIC LETTER HEH GOAL MEDIAL FORM → ARABIC LETTER HEH   # →‎ہ‎→→‎ﮦ‎→
+FBA7 ; 0647 ;  SA      # ( ‎ﮧ‎ → ‎ه‎ ) ARABIC LETTER HEH GOAL FINAL FORM → ARABIC LETTER HEH    # →‎ہ‎→→‎ﮦ‎→
+FBA6 ; 0647 ;  SA      # ( ‎ﮦ‎ → ‎ه‎ ) ARABIC LETTER HEH GOAL ISOLATED FORM → ARABIC LETTER HEH # 
+06D5 ; 0647 ;  SA      # ( ‎ە‎ → ‎ه‎ ) ARABIC LETTER AE → ARABIC LETTER HEH      # 
+
+FCD9 ; 0647 0670 ;     SA      # ( ‎ﳙ‎ → ‎هٰ‎ ) ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM → ARABIC LETTER HEH, ARABIC LETTER SUPERSCRIPT ALEF     # 
+
+FCD7 ; 0647 062C ;     SA      # ( ‎ﳗ‎ → ‎هج‎ ) ARABIC LIGATURE HEH WITH JEEM INITIAL FORM → ARABIC LETTER HEH, ARABIC LETTER JEEM     # 
+FC51 ; 0647 062C ;     SA      # ( ‎ﱑ‎ → ‎هج‎ ) ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM → ARABIC LETTER HEH, ARABIC LETTER JEEM    # 
+
+FCD8 ; 0647 0645 ;     SA      # ( ‎ﳘ‎ → ‎هم‎ ) ARABIC LIGATURE HEH WITH MEEM INITIAL FORM → ARABIC LETTER HEH, ARABIC LETTER MEEM     # 
+FC52 ; 0647 0645 ;     SA      # ( ‎ﱒ‎ → ‎هم‎ ) ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM → ARABIC LETTER HEH, ARABIC LETTER MEEM    # 
+
+FD93 ; 0647 0645 062C ;        SA      # ( ‎ﶓ‎ → ‎همج‎ ) ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM → ARABIC LETTER HEH, ARABIC LETTER MEEM, ARABIC LETTER JEEM     # 
+
+FD94 ; 0647 0645 0645 ;        SA      # ( ‎ﶔ‎ → ‎همم‎ ) ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM → ARABIC LETTER HEH, ARABIC LETTER MEEM, ARABIC LETTER MEEM     # 
+
+FC53 ; 0647 0649 ;     SA      # ( ‎ﱓ‎ → ‎هى‎ ) ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER HEH, ARABIC LETTER ALEF MAKSURA    # 
+FC54 ; 0647 0649 ;     SA      # ( ‎ﱔ‎ → ‎هى‎ ) ARABIC LIGATURE HEH WITH YEH ISOLATED FORM → ARABIC LETTER HEH, ARABIC LETTER ALEF MAKSURA     # →‎هي‎→
+
+06C2 ; 06C0 ;  SA      # ( ‎ۂ‎ → ‎ۀ‎ ) ARABIC LETTER HEH GOAL WITH HAMZA ABOVE → ARABIC LETTER HEH WITH YEH ABOVE        # →‎ﮤ‎→
+FBA5 ; 06C0 ;  SA      # ( ‎ﮥ‎ → ‎ۀ‎ ) ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM → ARABIC LETTER HEH WITH YEH ABOVE   # 
+FBA4 ; 06C0 ;  SA      # ( ‎ﮤ‎ → ‎ۀ‎ ) ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM → ARABIC LETTER HEH WITH YEH ABOVE        # 
+
+FEEE ; 0648 ;  SA      # ( ‎ﻮ‎ → ‎و‎ ) ARABIC LETTER WAW FINAL FORM → ARABIC LETTER WAW # 
+FEED ; 0648 ;  SA      # ( ‎ﻭ‎ → ‎و‎ ) ARABIC LETTER WAW ISOLATED FORM → ARABIC LETTER WAW      # 
+
+0624 ; 0648 0674 ;     SA      # ( ‎ؤ‎ → ‎وٴ‎ ) ARABIC LETTER WAW WITH HAMZA ABOVE → ARABIC LETTER WAW, ARABIC LETTER HIGH HAMZA        # →‎ٶ‎→
+FE86 ; 0648 0674 ;     SA      # ( ‎ﺆ‎ → ‎وٴ‎ ) ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM → ARABIC LETTER WAW, ARABIC LETTER HIGH HAMZA    # →‎ٶ‎→
+FE85 ; 0648 0674 ;     SA      # ( ‎ﺅ‎ → ‎وٴ‎ ) ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM → ARABIC LETTER WAW, ARABIC LETTER HIGH HAMZA # →‎ٶ‎→
+0676 ; 0648 0674 ;     SA      # ( ‎ٶ‎ → ‎وٴ‎ ) ARABIC LETTER HIGH HAMZA WAW → ARABIC LETTER WAW, ARABIC LETTER HIGH HAMZA      # 
+
+FDF8 ; 0648 0633 0644 0645 ;   SA      # ( ‎ﷸ‎ → ‎وسلم‎ ) ARABIC LIGATURE WASALLAM ISOLATED FORM → ARABIC LETTER WAW, ARABIC LETTER SEEN, ARABIC LETTER LAM, ARABIC LETTER MEEM      # 
+
+FBE1 ; 06C5 ;  SA      # ( ‎ﯡ‎ → ‎ۅ‎ ) ARABIC LETTER KIRGHIZ OE FINAL FORM → ARABIC LETTER KIRGHIZ OE   # 
+FBE0 ; 06C5 ;  SA      # ( ‎ﯠ‎ → ‎ۅ‎ ) ARABIC LETTER KIRGHIZ OE ISOLATED FORM → ARABIC LETTER KIRGHIZ OE        # 
+
+FBDA ; 06C6 ;  SA      # ( ‎ﯚ‎ → ‎ۆ‎ ) ARABIC LETTER OE FINAL FORM → ARABIC LETTER OE   # 
+FBD9 ; 06C6 ;  SA      # ( ‎ﯙ‎ → ‎ۆ‎ ) ARABIC LETTER OE ISOLATED FORM → ARABIC LETTER OE        # 
+
+FBD8 ; 06C7 ;  SA      # ( ‎ﯘ‎ → ‎ۇ‎ ) ARABIC LETTER U FINAL FORM → ARABIC LETTER U     # 
+FBD7 ; 06C7 ;  SA      # ( ‎ﯗ‎ → ‎ۇ‎ ) ARABIC LETTER U ISOLATED FORM → ARABIC LETTER U  # 
+
+0677 ; 06C7 0674 ;     SA      # ( ‎ٷ‎ → ‎ۇٴ‎ ) ARABIC LETTER U WITH HAMZA ABOVE → ARABIC LETTER U, ARABIC LETTER HIGH HAMZA    # 
+FBDD ; 06C7 0674 ;     SA      # ( ‎ﯝ‎ → ‎ۇٴ‎ ) ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM → ARABIC LETTER U, ARABIC LETTER HIGH HAMZA     # 
+
+FBDC ; 06C8 ;  SA      # ( ‎ﯜ‎ → ‎ۈ‎ ) ARABIC LETTER YU FINAL FORM → ARABIC LETTER YU   # 
+FBDB ; 06C8 ;  SA      # ( ‎ﯛ‎ → ‎ۈ‎ ) ARABIC LETTER YU ISOLATED FORM → ARABIC LETTER YU        # 
+
+FBE3 ; 06C9 ;  SA      # ( ‎ﯣ‎ → ‎ۉ‎ ) ARABIC LETTER KIRGHIZ YU FINAL FORM → ARABIC LETTER KIRGHIZ YU   # 
+FBE2 ; 06C9 ;  SA      # ( ‎ﯢ‎ → ‎ۉ‎ ) ARABIC LETTER KIRGHIZ YU ISOLATED FORM → ARABIC LETTER KIRGHIZ YU        # 
+
+FBDF ; 06CB ;  SA      # ( ‎ﯟ‎ → ‎ۋ‎ ) ARABIC LETTER VE FINAL FORM → ARABIC LETTER VE   # 
+FBDE ; 06CB ;  SA      # ( ‎ﯞ‎ → ‎ۋ‎ ) ARABIC LETTER VE ISOLATED FORM → ARABIC LETTER VE        # 
+
+FBE8 ; 0649 ;  SA      # ( ‎ﯨ‎ → ‎ى‎ ) ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM → ARABIC LETTER ALEF MAKSURA       # 
+FBE9 ; 0649 ;  SA      # ( ‎ﯩ‎ → ‎ى‎ ) ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM → ARABIC LETTER ALEF MAKSURA        # 
+FEF0 ; 0649 ;  SA      # ( ‎ﻰ‎ → ‎ى‎ ) ARABIC LETTER ALEF MAKSURA FINAL FORM → ARABIC LETTER ALEF MAKSURA       # 
+FEEF ; 0649 ;  SA      # ( ‎ﻯ‎ → ‎ى‎ ) ARABIC LETTER ALEF MAKSURA ISOLATED FORM → ARABIC LETTER ALEF MAKSURA    # 
+064A ; 0649 ;  SA      # ( ‎ي‎ → ‎ى‎ ) ARABIC LETTER YEH → ARABIC LETTER ALEF MAKSURA    # →‎ﻴ‎→→‎ﯿ‎→→‎ی‎→
+FEF3 ; 0649 ;  SA      # ( ‎ﻳ‎ → ‎ى‎ ) ARABIC LETTER YEH INITIAL FORM → ARABIC LETTER ALEF MAKSURA      # →‎ﯿ‎→→‎ی‎→
+FEF4 ; 0649 ;  SA      # ( ‎ﻴ‎ → ‎ى‎ ) ARABIC LETTER YEH MEDIAL FORM → ARABIC LETTER ALEF MAKSURA       # →‎ﯿ‎→→‎ی‎→
+FEF2 ; 0649 ;  SA      # ( ‎ﻲ‎ → ‎ى‎ ) ARABIC LETTER YEH FINAL FORM → ARABIC LETTER ALEF MAKSURA        # →‎ي‎→→‎ﻴ‎→→‎ﯿ‎→→‎ی‎→
+FEF1 ; 0649 ;  SA      # ( ‎ﻱ‎ → ‎ى‎ ) ARABIC LETTER YEH ISOLATED FORM → ARABIC LETTER ALEF MAKSURA     # →‎ي‎→→‎ﻴ‎→→‎ﯿ‎→→‎ی‎→
+06CC ; 0649 ;  SA      # ( ‎ی‎ → ‎ى‎ ) ARABIC LETTER FARSI YEH → ARABIC LETTER ALEF MAKSURA      # 
+FBFE ; 0649 ;  SA      # ( ‎ﯾ‎ → ‎ى‎ ) ARABIC LETTER FARSI YEH INITIAL FORM → ARABIC LETTER ALEF MAKSURA        # →‎ی‎→
+FBFF ; 0649 ;  SA      # ( ‎ﯿ‎ → ‎ى‎ ) ARABIC LETTER FARSI YEH MEDIAL FORM → ARABIC LETTER ALEF MAKSURA # →‎ی‎→
+FBFD ; 0649 ;  SA      # ( ‎ﯽ‎ → ‎ى‎ ) ARABIC LETTER FARSI YEH FINAL FORM → ARABIC LETTER ALEF MAKSURA  # →‎ی‎→
+FBFC ; 0649 ;  SA      # ( ‎ﯼ‎ → ‎ى‎ ) ARABIC LETTER FARSI YEH ISOLATED FORM → ARABIC LETTER ALEF MAKSURA       # 
+
+FC90 ; 0649 0670 ;     SA      # ( ‎ﲐ‎ → ‎ىٰ‎ ) ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER SUPERSCRIPT ALEF     # 
+FC5D ; 0649 0670 ;     SA      # ( ‎ﱝ‎ → ‎ىٰ‎ ) ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER SUPERSCRIPT ALEF  # 
+
+0626 ; 0649 0674 ;     SA      # ( ‎ئ‎ → ‎ىٴ‎ ) ARABIC LETTER YEH WITH HAMZA ABOVE → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA       # →‎ٸ‎→→‎يٴ‎→
+FE8B ; 0649 0674 ;     SA      # ( ‎ﺋ‎ → ‎ىٴ‎ ) ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA # →‎ئ‎→→‎ٸ‎→→‎يٴ‎→
+FE8C ; 0649 0674 ;     SA      # ( ‎ﺌ‎ → ‎ىٴ‎ ) ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA  # →‎ئ‎→→‎ٸ‎→→‎يٴ‎→
+FE8A ; 0649 0674 ;     SA      # ( ‎ﺊ‎ → ‎ىٴ‎ ) ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA   # →‎ئ‎→→‎ٸ‎→→‎يٴ‎→
+FE89 ; 0649 0674 ;     SA      # ( ‎ﺉ‎ → ‎ىٴ‎ ) ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA        # →‎ٸ‎→→‎يٴ‎→
+0678 ; 0649 0674 ;     SA      # ( ‎ٸ‎ → ‎ىٴ‎ ) ARABIC LETTER HIGH HAMZA YEH → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA     # →‎يٴ‎→
+
+FBEB ; 0649 0674 0627 ;        SA      # ( ‎ﯫ‎ → ‎ىٴا‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF # →‎ئا‎→
+FBEA ; 0649 0674 0627 ;        SA      # ( ‎ﯪ‎ → ‎ىٴا‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF      # →‎ئا‎→
+
+FC67 ; 0649 0674 0628 ;        SA      # ( ‎ﱧ‎ → ‎ىٴب‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER BEH  # →‎ئن‎→
+
+FBF8 ; 0649 0674 067A ;        SA      # ( ‎ﯸ‎ → ‎ىٴٺ‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER TTEHEH        # →‎ئې‎→
+FBF7 ; 0649 0674 067A ;        SA      # ( ‎ﯷ‎ → ‎ىٴٺ‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER TTEHEH  # →‎ئې‎→
+FBF6 ; 0649 0674 067A ;        SA      # ( ‎ﯶ‎ → ‎ىٴٺ‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER TTEHEH       # →‎ئې‎→
+
+FC97 ; 0649 0674 062C ;        SA      # ( ‎ﲗ‎ → ‎ىٴج‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER JEEM       # →‎ئج‎→
+FC00 ; 0649 0674 062C ;        SA      # ( ‎ﰀ‎ → ‎ىٴج‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER JEEM      # →‎ئج‎→
+FC99 ; 0649 0674 062C ;        SA      # ( ‎ﲙ‎ → ‎ىٴج‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER JEEM       # →‎ئخ‎→→‎يٴج‎→→‎ئج‎→
+
+FC98 ; 0649 0674 062D ;        SA      # ( ‎ﲘ‎ → ‎ىٴح‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER HAH # →‎ئح‎→
+FC01 ; 0649 0674 062D ;        SA      # ( ‎ﰁ‎ → ‎ىٴح‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER HAH        # →‎ئح‎→
+
+FC64 ; 0649 0674 0631 ;        SA      # ( ‎ﱤ‎ → ‎ىٴر‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER REH   # →‎ئر‎→
+
+FC65 ; 0649 0674 0632 ;        SA      # ( ‎ﱥ‎ → ‎ىٴز‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ZAIN # →‎ئز‎→
+
+FC9A ; 0649 0674 0645 ;        SA      # ( ‎ﲚ‎ → ‎ىٴم‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER MEEM       # →‎ئم‎→
+FCDF ; 0649 0674 0645 ;        SA      # ( ‎ﳟ‎ → ‎ىٴم‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER MEEM        # →‎ئم‎→
+FC66 ; 0649 0674 0645 ;        SA      # ( ‎ﱦ‎ → ‎ىٴم‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER MEEM # →‎ئم‎→
+FC02 ; 0649 0674 0645 ;        SA      # ( ‎ﰂ‎ → ‎ىٴم‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER MEEM      # →‎ئم‎→
+
+FC9B ; 0649 0674 0647 ;        SA      # ( ‎ﲛ‎ → ‎ىٴه‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER HEH # →‎ئه‎→
+FCE0 ; 0649 0674 0647 ;        SA      # ( ‎ﳠ‎ → ‎ىٴه‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER HEH  # →‎ئه‎→
+FBED ; 0649 0674 0647 ;        SA      # ( ‎ﯭ‎ → ‎ىٴه‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER HEH    # →‎ئە‎→→‎يٴه‎→→‎ئه‎→
+FBEC ; 0649 0674 0647 ;        SA      # ( ‎ﯬ‎ → ‎ىٴه‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER HEH # →‎ئە‎→→‎يٴه‎→→‎ئه‎→
+
+FBEF ; 0649 0674 0648 ;        SA      # ( ‎ﯯ‎ → ‎ىٴو‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER WAW   # →‎ئو‎→
+FBEE ; 0649 0674 0648 ;        SA      # ( ‎ﯮ‎ → ‎ىٴو‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER WAW        # →‎ئو‎→
+
+FBF3 ; 0649 0674 06C6 ;        SA      # ( ‎ﯳ‎ → ‎ىٴۆ‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER OE     # →‎ئۆ‎→
+FBF2 ; 0649 0674 06C6 ;        SA      # ( ‎ﯲ‎ → ‎ىٴۆ‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER OE  # →‎ئۆ‎→
+
+FBF1 ; 0649 0674 06C7 ;        SA      # ( ‎ﯱ‎ → ‎ىٴۇ‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER U       # →‎ئۇ‎→
+FBF0 ; 0649 0674 06C7 ;        SA      # ( ‎ﯰ‎ → ‎ىٴۇ‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER U    # →‎ئۇ‎→
+
+FBF5 ; 0649 0674 06C8 ;        SA      # ( ‎ﯵ‎ → ‎ىٴۈ‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER YU     # →‎ئۈ‎→
+FBF4 ; 0649 0674 06C8 ;        SA      # ( ‎ﯴ‎ → ‎ىٴۈ‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER YU  # →‎ئۈ‎→
+
+FBFB ; 0649 0674 0649 ;        SA      # ( ‎ﯻ‎ → ‎ىٴى‎ ) ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF MAKSURA        # →‎ئى‎→
+FBFA ; 0649 0674 0649 ;        SA      # ( ‎ﯺ‎ → ‎ىٴى‎ ) ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF MAKSURA  # →‎ئى‎→
+FC68 ; 0649 0674 0649 ;        SA      # ( ‎ﱨ‎ → ‎ىٴى‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF MAKSURA # →‎ئى‎→
+FBF9 ; 0649 0674 0649 ;        SA      # ( ‎ﯹ‎ → ‎ىٴى‎ ) ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF MAKSURA       # →‎ئى‎→
+FC03 ; 0649 0674 0649 ;        SA      # ( ‎ﰃ‎ → ‎ىٴى‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF MAKSURA      # →‎ئى‎→
+FC69 ; 0649 0674 0649 ;        SA      # ( ‎ﱩ‎ → ‎ىٴى‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF MAKSURA  # →‎ئي‎→→‎يٴى‎→→‎ئى‎→
+FC04 ; 0649 0674 0649 ;        SA      # ( ‎ﰄ‎ → ‎ىٴى‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF MAKSURA       # →‎ئي‎→→‎يٴى‎→→‎ئى‎→
+
+FC94 ; 0649 0628 ;     SA      # ( ‎ﲔ‎ → ‎ىب‎ ) ARABIC LIGATURE YEH WITH NOON FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER BEH       # →‎ين‎→
+
+FDAF ; 0649 062C 0649 ;        SA      # ( ‎ﶯ‎ → ‎ىجى‎ ) ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA       # →‎يجي‎→
+
+FDAE ; 0649 062D 0649 ;        SA      # ( ‎ﶮ‎ → ‎ىحى‎ ) ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA # →‎يحي‎→
+
+FC91 ; 0649 0631 ;     SA      # ( ‎ﲑ‎ → ‎ىر‎ ) ARABIC LIGATURE YEH WITH REH FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER REH        # →‎ير‎→
+
+FC92 ; 0649 0632 ;     SA      # ( ‎ﲒ‎ → ‎ىز‎ ) ARABIC LIGATURE YEH WITH ZAIN FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER ZAIN      # →‎يز‎→
+
+FCDD ; 0649 0645 ;     SA      # ( ‎ﳝ‎ → ‎ىم‎ ) ARABIC LIGATURE YEH WITH MEEM INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER MEEM    # →‎يم‎→
+FCF0 ; 0649 0645 ;     SA      # ( ‎ﳰ‎ → ‎ىم‎ ) ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER MEEM     # →‎يم‎→
+FC93 ; 0649 0645 ;     SA      # ( ‎ﲓ‎ → ‎ىم‎ ) ARABIC LIGATURE YEH WITH MEEM FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER MEEM      # →‎يم‎→
+FC58 ; 0649 0645 ;     SA      # ( ‎ﱘ‎ → ‎ىم‎ ) ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER MEEM   # →‎يم‎→
+
+FD9D ; 0649 0645 0645 ;        SA      # ( ‎ﶝ‎ → ‎ىمم‎ ) ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER MEEM, ARABIC LETTER MEEM    # →‎يمم‎→
+FD9C ; 0649 0645 0645 ;        SA      # ( ‎ﶜ‎ → ‎ىمم‎ ) ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER MEEM, ARABIC LETTER MEEM      # →‎يمم‎→
+
+FDB0 ; 0649 0645 0649 ;        SA      # ( ‎ﶰ‎ → ‎ىمى‎ ) ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA       # →‎يمي‎→
+
+FCDE ; 0649 0647 ;     SA      # ( ‎ﳞ‎ → ‎ىه‎ ) ARABIC LIGATURE YEH WITH HEH INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HEH      # →‎يه‎→
+FCF1 ; 0649 0647 ;     SA      # ( ‎ﳱ‎ → ‎ىه‎ ) ARABIC LIGATURE YEH WITH HEH MEDIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HEH       # →‎يه‎→
+
+FC95 ; 0649 0649 ;     SA      # ( ‎ﲕ‎ → ‎ىى‎ ) ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER ALEF MAKSURA      # →‎يى‎→
+FC59 ; 0649 0649 ;     SA      # ( ‎ﱙ‎ → ‎ىى‎ ) ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER ALEF MAKSURA   # →‎يى‎→
+FC96 ; 0649 0649 ;     SA      # ( ‎ﲖ‎ → ‎ىى‎ ) ARABIC LIGATURE YEH WITH YEH FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER ALEF MAKSURA       # →‎يي‎→
+FC5A ; 0649 0649 ;     SA      # ( ‎ﱚ‎ → ‎ىى‎ ) ARABIC LIGATURE YEH WITH YEH ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER ALEF MAKSURA    # →‎يي‎→
+
+FBAF ; 06D2 ;  SA      # ( ‎ﮯ‎ → ‎ے‎ ) ARABIC LETTER YEH BARREE FINAL FORM → ARABIC LETTER YEH BARREE   # 
+FBAE ; 06D2 ;  SA      # ( ‎ﮮ‎ → ‎ے‎ ) ARABIC LETTER YEH BARREE ISOLATED FORM → ARABIC LETTER YEH BARREE        # 
+
+FBB1 ; 06D3 ;  SA      # ( ‎ﮱ‎ → ‎ۓ‎ ) ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM → ARABIC LETTER YEH BARREE WITH HAMZA ABOVE # 
+FBB0 ; 06D3 ;  SA      # ( ‎ﮰ‎ → ‎ۓ‎ ) ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM → ARABIC LETTER YEH BARREE WITH HAMZA ABOVE      # 
+
+079A ; 0799 ;  SA      # ( ‎ޚ‎ → ‎ޙ‎ ) THAANA LETTER KHAA → THAANA LETTER HHAA   # 
+
+07A3 ; 07A2 ;  SA      # ( ‎ޣ‎ → ‎ޢ‎ ) THAANA LETTER GHAINU → THAANA LETTER AINU # 
+
+07A1 ; 07A0 ;  SA      # ( ‎ޡ‎ → ‎ޠ‎ ) THAANA LETTER ZO → THAANA LETTER TO       # 
+
+079F ; 079E ;  SA      # ( ‎ޟ‎ → ‎ޞ‎ ) THAANA LETTER DAADHU → THAANA LETTER SAADHU       # 
+
+0906 ; 0905 093E ;     SA      # ( आ → अा ) DEVANAGARI LETTER AA → DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN AA     # 
+
+0912 ; 0905 093E 0946 ;        SA      # ( ऒ → अाॆ ) DEVANAGARI LETTER SHORT O → DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN AA, DEVANAGARI VOWEL SIGN SHORT E      # →अॊ→→आॆ→
+
+0913 ; 0905 093E 0947 ;        SA      # ( ओ → अाे ) DEVANAGARI LETTER O → DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN AA, DEVANAGARI VOWEL SIGN E  # →अो→→आे→
+
+0914 ; 0905 093E 0948 ;        SA      # ( औ → अाै ) DEVANAGARI LETTER AU → DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN AA, DEVANAGARI VOWEL SIGN AI        # →अौ→→आै→
+
+0904 ; 0905 0946 ;     SA      # ( ऄ → अॆ ) DEVANAGARI LETTER SHORT A → DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN SHORT E   # 
+
+0911 ; 0905 0949 ;     SA      # ( ऑ → अॉ ) DEVANAGARI LETTER CANDRA O → DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN CANDRA O # 
+
+090D ; 090F 0945 ;     SA      # ( ऍ → एॅ ) DEVANAGARI LETTER CANDRA E → DEVANAGARI LETTER E, DEVANAGARI VOWEL SIGN CANDRA E # 
+
+090E ; 090F 0946 ;     SA      # ( ऎ → एॆ ) DEVANAGARI LETTER SHORT E → DEVANAGARI LETTER E, DEVANAGARI VOWEL SIGN SHORT E   # 
+
+0910 ; 090F 0947 ;     SA      # ( ऐ → एे ) DEVANAGARI LETTER AI → DEVANAGARI LETTER E, DEVANAGARI VOWEL SIGN E      # 
+
+0908 ; 0930 094D 0907 ;        SA      # ( ई → र्इ ) DEVANAGARI LETTER II → DEVANAGARI LETTER RA, DEVANAGARI SIGN VIRAMA, DEVANAGARI LETTER I      # 
+
+0986 ; 0985 09BE ;     SA      # ( আ → অা ) BENGALI LETTER AA → BENGALI LETTER A, BENGALI VOWEL SIGN AA      # 
+
+09E0 ; 098B 09C3 ;     SA      # ( ৠ → ঋৃ ) BENGALI LETTER VOCALIC RR → BENGALI LETTER VOCALIC R, BENGALI VOWEL SIGN VOCALIC R       # 
+09E1 ; 098B 09C3 ;     SA      # ( ৡ → ঋৃ ) BENGALI LETTER VOCALIC LL → BENGALI LETTER VOCALIC R, BENGALI VOWEL SIGN VOCALIC R       # →ঌৢ→→ৠ→
+
+0A09 ; 0A73 0A41 ;     SA      # ( ਉ → ੳੁ ) GURMUKHI LETTER U → GURMUKHI URA, GURMUKHI VOWEL SIGN U  # 
+
+0A0A ; 0A73 0A42 ;     SA      # ( ਊ → ੳੂ ) GURMUKHI LETTER UU → GURMUKHI URA, GURMUKHI VOWEL SIGN UU        # 
+
+0A06 ; 0A05 0A3E ;     SA      # ( ਆ → ਅਾ ) GURMUKHI LETTER AA → GURMUKHI LETTER A, GURMUKHI VOWEL SIGN AA   # 
+
+0A10 ; 0A05 0A48 ;     SA      # ( ਐ → ਅੈ ) GURMUKHI LETTER AI → GURMUKHI LETTER A, GURMUKHI VOWEL SIGN AI   # 
+
+0A14 ; 0A05 0A4C ;     SA      # ( ਔ → ਅੌ ) GURMUKHI LETTER AU → GURMUKHI LETTER A, GURMUKHI VOWEL SIGN AU   # 
+
+0A07 ; 0A72 0A3F ;     SA      # ( ਇ → ੲਿ ) GURMUKHI LETTER I → GURMUKHI IRI, GURMUKHI VOWEL SIGN I  # 
+
+0A08 ; 0A72 0A40 ;     SA      # ( ਈ → ੲੀ ) GURMUKHI LETTER II → GURMUKHI IRI, GURMUKHI VOWEL SIGN II        # 
+
+0A0F ; 0A72 0A47 ;     SA      # ( ਏ → ੲੇ ) GURMUKHI LETTER EE → GURMUKHI IRI, GURMUKHI VOWEL SIGN EE        # 
+
+0A86 ; 0A85 0ABE ;     SA      # ( આ → અા ) GUJARATI LETTER AA → GUJARATI LETTER A, GUJARATI VOWEL SIGN AA   # 
+
+0A91 ; 0A85 0ABE 0AC5 ;        SA      # ( ઑ → અાૅ ) GUJARATI VOWEL CANDRA O → GUJARATI LETTER A, GUJARATI VOWEL SIGN AA, GUJARATI VOWEL SIGN CANDRA E     # →અૉ→→આૅ→
+
+0A93 ; 0A85 0ABE 0AC7 ;        SA      # ( ઓ → અાે ) GUJARATI LETTER O → GUJARATI LETTER A, GUJARATI VOWEL SIGN AA, GUJARATI VOWEL SIGN E  # →અો→→આે→
+
+0A94 ; 0A85 0ABE 0AC8 ;        SA      # ( ઔ → અાૈ ) GUJARATI LETTER AU → GUJARATI LETTER A, GUJARATI VOWEL SIGN AA, GUJARATI VOWEL SIGN AI        # →અૌ→→આૈ→
+
+0A8D ; 0A85 0AC5 ;     SA      # ( ઍ → અૅ ) GUJARATI VOWEL CANDRA E → GUJARATI LETTER A, GUJARATI VOWEL SIGN CANDRA E        # 
+
+0A8F ; 0A85 0AC7 ;     SA      # ( એ → અે ) GUJARATI LETTER E → GUJARATI LETTER A, GUJARATI VOWEL SIGN E     # 
+
+0A90 ; 0A85 0AC8 ;     SA      # ( ઐ → અૈ ) GUJARATI LETTER AI → GUJARATI LETTER A, GUJARATI VOWEL SIGN AI   # 
+
+0B06 ; 0B05 0B3E ;     SA      # ( ଆ → ଅା ) ORIYA LETTER AA → ORIYA LETTER A, ORIYA VOWEL SIGN AA    # 
+
+0BEE ; 0B85 ;  SA      # ( ௮ → அ ) TAMIL DIGIT EIGHT → TAMIL LETTER A  # 
+
+0BB0 ; 0B88 ;  SA      # ( ர → ஈ ) TAMIL LETTER RA → TAMIL LETTER II   # →ா→
+0BBE ; 0B88 ;  SA      # ( ா → ஈ ) TAMIL VOWEL SIGN AA → TAMIL LETTER II       # 
+
+0BEB ; 0B88 0BC1 ;     SA      # ( ௫ → ஈு ) TAMIL DIGIT FIVE → TAMIL LETTER II, TAMIL VOWEL SIGN U   # →ரு→
+
+0BE8 ; 0B89 ;  SA      # ( ௨ → உ ) TAMIL DIGIT TWO → TAMIL LETTER U    # 
+
+0B8A ; 0B89 0BB3 ;     SA      # ( ஊ → உள ) TAMIL LETTER UU → TAMIL LETTER U, TAMIL LETTER LLA       # 
+
+0BED ; 0B8E ;  SA      # ( ௭ → எ ) TAMIL DIGIT SEVEN → TAMIL LETTER E  # 
+
+0BF7 ; 0B8E 0BB5 ;     SA      #* ( ௷ → எவ ) TAMIL CREDIT SIGN → TAMIL LETTER E, TAMIL LETTER VA     # 
+
+0B9C ; 0B90 ;  SA      # ( ஜ → ஐ ) TAMIL LETTER JA → TAMIL LETTER AI   # 
+
+0BE7 ; 0B95 ;  SA      # ( ௧ → க ) TAMIL DIGIT ONE → TAMIL LETTER KA   # 
+
+0BEA ; 0B9A ;  SA      # ( ௪ → ச ) TAMIL DIGIT FOUR → TAMIL LETTER CA  # 
+
+0BEC ; 0B9A 0BC1 ;     SA      # ( ௬ → சு ) TAMIL DIGIT SIX → TAMIL LETTER CA, TAMIL VOWEL SIGN U    # 
+
+0BF2 ; 0B9A 0BC2 ;     SA      #* ( ௲ → சூ ) TAMIL NUMBER ONE THOUSAND → TAMIL LETTER CA, TAMIL VOWEL SIGN UU        # 
+
+0BFA ; 0BA8 0BC0 ;     SA      #* ( ௺ → நீ ) TAMIL NUMBER SIGN → TAMIL LETTER NA, TAMIL VOWEL SIGN II        # 
+
+0BF4 ; 0BAE 0BC0 ;     SA      #* ( ௴ → மீ ) TAMIL MONTH SIGN → TAMIL LETTER MA, TAMIL VOWEL SIGN II # 
+
+0BF0 ; 0BAF ;  SA      #* ( ௰ → ய ) TAMIL NUMBER TEN → TAMIL LETTER YA # 
+
+0BD7 ; 0BB3 ;  SA      # ( ௗ → ள ) TAMIL AU LENGTH MARK → TAMIL LETTER LLA     # 
+
+0BC8 ; 0BA9 ;  SA      # ( ை → ன ) TAMIL VOWEL SIGN AI → TAMIL LETTER NNNA     # 
+
+0BF8 ; 0BB7 ;  SA      #* ( ௸ → ஷ ) TAMIL AS ABOVE SIGN → TAMIL LETTER SSA     # 
+
+0BCA ; 0BC6 0B88 ;     SA      # ( ொ → ெஈ ) TAMIL VOWEL SIGN O → TAMIL VOWEL SIGN E, TAMIL LETTER II # →ெர→
+
+0BCC ; 0BC6 0BB3 ;     SA      # ( ௌ → ெள ) TAMIL VOWEL SIGN AU → TAMIL VOWEL SIGN E, TAMIL LETTER LLA       # 
+
+0BCB ; 0BC7 0B88 ;     SA      # ( ோ → ேஈ ) TAMIL VOWEL SIGN OO → TAMIL VOWEL SIGN EE, TAMIL LETTER II       # →ேர→
+
+0C60 ; 0C0B 0C3E ;     SA      # ( ౠ → ఋా ) TELUGU LETTER VOCALIC RR → TELUGU LETTER VOCALIC R, TELUGU VOWEL SIGN AA # 
+
+0C61 ; 0C0C 0C3E ;     SA      # ( ౡ → ఌా ) TELUGU LETTER VOCALIC LL → TELUGU LETTER VOCALIC L, TELUGU VOWEL SIGN AA # 
+
+0C14 ; 0C12 0C4C ;     SA      # ( ఔ → ఒౌ ) TELUGU LETTER AU → TELUGU LETTER O, TELUGU VOWEL SIGN AU # 
+
+0C13 ; 0C12 0C55 ;     SA      # ( ఓ → ఒౕ ) TELUGU LETTER OO → TELUGU LETTER O, TELUGU LENGTH MARK   # 
+
+0C22 ; 0C21 0323 ;     SA      # ( ఢ → డ̣ ) TELUGU LETTER DDHA → TELUGU LETTER DDA, COMBINING DOT BELOW       # 
+
+0C2D ; 0C2C 0323 ;     SA      # ( భ → బ̣ ) TELUGU LETTER BHA → TELUGU LETTER BA, COMBINING DOT BELOW # 
+
+0C37 ; 0C35 0323 ;     SA      # ( ష → వ̣ ) TELUGU LETTER SSA → TELUGU LETTER VA, COMBINING DOT BELOW # 
+
+0C39 ; 0C35 0C3E ;     SA      # ( హ → వా ) TELUGU LETTER HA → TELUGU LETTER VA, TELUGU VOWEL SIGN AA        # 
+
+0C2E ; 0C35 0C41 ;     SA      # ( మ → వు ) TELUGU LETTER MA → TELUGU LETTER VA, TELUGU VOWEL SIGN U # 
+
+0C42 ; 0C41 0C3E ;     SA      # ( ూ → ుా ) TELUGU VOWEL SIGN UU → TELUGU VOWEL SIGN U, TELUGU VOWEL SIGN AA # 
+
+0C44 ; 0C43 0C3E ;     SA      # ( ౄ → ృా ) TELUGU VOWEL SIGN VOCALIC RR → TELUGU VOWEL SIGN VOCALIC R, TELUGU VOWEL SIGN AA # 
+
+0CE1 ; 0C8C 0CBE ;     SA      # ( ೡ → ಌಾ ) KANNADA LETTER VOCALIC LL → KANNADA LETTER VOCALIC L, KANNADA VOWEL SIGN AA      # 
+
+0C94 ; 0C92 0CCC ;     SA      # ( ಔ → ಒೌ ) KANNADA LETTER AU → KANNADA LETTER O, KANNADA VOWEL SIGN AU      # 
+
+0D08 ; 0D07 0D57 ;     SA      # ( ഈ → ഇൗ ) MALAYALAM LETTER II → MALAYALAM LETTER I, MALAYALAM AU LENGTH MARK       # 
+
+0D0A ; 0D09 0D57 ;     SA      # ( ഊ → ഉൗ ) MALAYALAM LETTER UU → MALAYALAM LETTER U, MALAYALAM AU LENGTH MARK       # 
+
+0D10 ; 0D0E 0D46 ;     SA      # ( ഐ → എെ ) MALAYALAM LETTER AI → MALAYALAM LETTER E, MALAYALAM VOWEL SIGN E # 
+
+0D13 ; 0D12 0D3E ;     SA      # ( ഓ → ഒാ ) MALAYALAM LETTER OO → MALAYALAM LETTER O, MALAYALAM VOWEL SIGN AA        # 
+
+0D14 ; 0D12 0D57 ;     SA      # ( ഔ → ഒൗ ) MALAYALAM LETTER AU → MALAYALAM LETTER O, MALAYALAM AU LENGTH MARK       # 
+
+0D61 ; 0D1E ;  SA      # ( ൡ → ഞ ) MALAYALAM LETTER VOCALIC LL → MALAYALAM LETTER NYA  # 
+
+0D6B ; 0D26 0D4D 0D30 ;        SA      # ( ൫ → ദ്ര ) MALAYALAM DIGIT FIVE → MALAYALAM LETTER DA, MALAYALAM SIGN VIRAMA, MALAYALAM LETTER RA        # 
+
+0D0C ; 0D28 0D41 ;     SA      # ( ഌ → നു ) MALAYALAM LETTER VOCALIC L → MALAYALAM LETTER NA, MALAYALAM VOWEL SIGN U # 
+0D19 ; 0D28 0D41 ;     SA      # ( ങ → നു ) MALAYALAM LETTER NGA → MALAYALAM LETTER NA, MALAYALAM VOWEL SIGN U       # →ഌ→
+
+0D6F ; 0D28 0D4D ;     SA      # ( ൯ → ന് ) MALAYALAM DIGIT NINE → MALAYALAM LETTER NA, MALAYALAM SIGN VIRAMA        # 
+
+0D31 ; 0D30 ;  SA      # ( റ → ര ) MALAYALAM LETTER RRA → MALAYALAM LETTER RA  # 
+
+0D6A ; 0D30 0D4D ;     SA      # ( ൪ → ര് ) MALAYALAM DIGIT FOUR → MALAYALAM LETTER RA, MALAYALAM SIGN VIRAMA        # 
+
+0D6E ; 0D35 0D4D ;     SA      # ( ൮ → വ് ) MALAYALAM DIGIT EIGHT → MALAYALAM LETTER VA, MALAYALAM SIGN VIRAMA       # 
+
+0D40 ; 0D3F ;  SA      # ( ീ → ി ) MALAYALAM VOWEL SIGN II → MALAYALAM VOWEL SIGN I    # 
+
+0D42 ; 0D41 ;  SA      # ( ൂ → ു ) MALAYALAM VOWEL SIGN UU → MALAYALAM VOWEL SIGN U    # 
+0D43 ; 0D41 ;  SA      # ( ൃ → ു ) MALAYALAM VOWEL SIGN VOCALIC R → MALAYALAM VOWEL SIGN U     # →ൂ→
+
+0D48 ; 0D46 0D46 ;     SA      # ( ൈ → െെ ) MALAYALAM VOWEL SIGN AI → MALAYALAM VOWEL SIGN E, MALAYALAM VOWEL SIGN E # 
+
+0E03 ; 0E02 ;  SA      # ( ฃ → ข ) THAI CHARACTER KHO KHUAT → THAI CHARACTER KHO KHAI  # 
+
+0E14 ; 0E04 ;  SA      # ( ด → ค ) THAI CHARACTER DO DEK → THAI CHARACTER KHO KHWAI    # 
+0E15 ; 0E04 ;  SA      # ( ต → ค ) THAI CHARACTER TO TAO → THAI CHARACTER KHO KHWAI    # →ด→
+
+0E21 ; 0E06 ;  SA      # ( ม → ฆ ) THAI CHARACTER MO MA → THAI CHARACTER KHO RAKHANG   # 
+
+0E0B ; 0E0A ;  SA      # ( ซ → ช ) THAI CHARACTER SO SO → THAI CHARACTER CHO CHANG     # 
+
+0E0F ; 0E0E ;  SA      # ( ฏ → ฎ ) THAI CHARACTER TO PATAK → THAI CHARACTER DO CHADA   # 
+
+0E17 ; 0E11 ;  SA      # ( ท → ฑ ) THAI CHARACTER THO THAHAN → THAI CHARACTER THO NANGMONTHO   # 
+
+0E26 ; 0E20 ;  SA      # ( ฦ → ภ ) THAI CHARACTER LU → THAI CHARACTER PHO SAMPHAO      # 
+
+0E45 ; 0E32 ;  SA      # ( ๅ → า ) THAI CHARACTER LAKKHANGYAO → THAI CHARACTER SARA AA # 
+
+0E33 ; 030A 0E32 ;     SA      # ( ำ → ̊า ) THAI CHARACTER SARA AM → COMBINING RING ABOVE, THAI CHARACTER SARA AA     # →ํา→
+
+0E41 ; 0E40 0E40 ;     SA      # ( แ → เเ ) THAI CHARACTER SARA AE → THAI CHARACTER SARA E, THAI CHARACTER SARA E    # 
+
+0EDC ; 0EAB 0E99 ;     SA      # ( ໜ → ຫນ ) LAO HO NO → LAO LETTER HO SUNG, LAO LETTER NO    # 
+
+0EDD ; 0EAB 0EA1 ;     SA      # ( ໝ → ຫມ ) LAO HO MO → LAO LETTER HO SUNG, LAO LETTER MO    # 
+
+0EB3 ; 030A 0EB2 ;     SA      # ( ຳ → ̊າ ) LAO VOWEL SIGN AM → COMBINING RING ABOVE, LAO VOWEL SIGN AA       # →ໍາ→
+
+0F6A ; 0F62 ;  SA      # ( ཪ → ར ) TIBETAN LETTER FIXED-FORM RA → TIBETAN LETTER RA    # 
+
+0F77 ; 0FB2 0F71 0F80 ;        SA      # ( ཷ → ྲཱྀ ) TIBETAN VOWEL SIGN VOCALIC RR → TIBETAN SUBJOINED LETTER RA, TIBETAN VOWEL SIGN AA, TIBETAN VOWEL SIGN REVERSED I     # 
+
+0F79 ; 0FB3 0F71 0F80 ;        SA      # ( ཹ → ླཱྀ ) TIBETAN VOWEL SIGN VOCALIC LL → TIBETAN SUBJOINED LETTER LA, TIBETAN VOWEL SIGN AA, TIBETAN VOWEL SIGN REVERSED I     # 
+
+17A3 ; 17A2 ;  SA      # ( ឣ → អ ) KHMER INDEPENDENT VOWEL QAQ → KHMER LETTER QA       # 
+
+19D0 ; 199E ;  SA      # ( ᧐ → ᦞ ) NEW TAI LUE DIGIT ZERO → NEW TAI LUE LETTER LOW VA  # 
+
+19D1 ; 19B1 ;  SA      # ( ᧑ → ᦱ ) NEW TAI LUE DIGIT ONE → NEW TAI LUE VOWEL SIGN AA   # 
+
+1A80 ; 1A45 ;  SA      # ( ᪀ → ᩅ ) TAI THAM HORA DIGIT ZERO → TAI THAM LETTER WA       # 
+1A90 ; 1A45 ;  SA      # ( ᪐ → ᩅ ) TAI THAM THAM DIGIT ZERO → TAI THAM LETTER WA       # 
+
+AA53 ; AA01 ;  SA      # ( ꩓ → ꨁ ) CHAM DIGIT THREE → CHAM LETTER I    # 
+
+AA56 ; AA23 ;  SA      # ( ꩖ → ꨣ ) CHAM DIGIT SIX → CHAM LETTER RA     # 
+
+1B52 ; 1B0D ;  SA      # ( ᭒ → ᬍ ) BALINESE DIGIT TWO → BALINESE LETTER LA LENGA       # 
+
+1B53 ; 1B11 ;  SA      # ( ᭓ → ᬑ ) BALINESE DIGIT THREE → BALINESE LETTER OKARA        # 
+
+1B58 ; 1B28 ;  SA      # ( ᭘ → ᬨ ) BALINESE DIGIT EIGHT → BALINESE LETTER PA KAPAL     # 
+
+1896 ; 185C ;  SA      # ( ᢖ → ᡜ ) MONGOLIAN LETTER ALI GALI ZA → MONGOLIAN LETTER TODO DZA    # 
+
+1855 ; 1835 ;  SA      # ( ᡕ → ᠵ ) MONGOLIAN LETTER TODO YA → MONGOLIAN LETTER JA      # 
+
+13D2 ; 13A1 ;  SA      # ( Ꮢ → Ꭱ ) CHEROKEE LETTER SV → CHEROKEE LETTER E      # 
+
+13BD ; 13A9 ;  SA      # ( Ꮍ → Ꭹ ) CHEROKEE LETTER MU → CHEROKEE LETTER GI     # 
+
+13E7 ; 13AB ;  SA      # ( Ꮷ → Ꭻ ) CHEROKEE LETTER TSU → CHEROKEE LETTER GU    # →J→
+
+13D4 ; 13B3 ;  SA      # ( Ꮤ → Ꮃ ) CHEROKEE LETTER TA → CHEROKEE LETTER LA     # 
+
+13F3 ; 13C0 ;  SA      # ( Ᏻ → Ꮐ ) CHEROKEE LETTER YU → CHEROKEE LETTER NAH    # 
+
+13DA ; 13D5 ;  SA      # ( Ꮪ → Ꮥ ) CHEROKEE LETTER DU → CHEROKEE LETTER DE     # 
+
+140D ; 1401 00B7 ;     SA      # ( ᐍ → ᐁ· ) CANADIAN SYLLABICS WEST-CREE WE → CANADIAN SYLLABICS E, MIDDLE DOT        # →ᐁᐧ→
+
+2206 ; 1403 ;  SA      #* ( ∆ → ᐃ ) INCREMENT → CANADIAN SYLLABICS I   # →Δ→
+1D6AB ;        1403 ;  SA      # ( 𝚫 → ᐃ ) MATHEMATICAL BOLD CAPITAL DELTA → CANADIAN SYLLABICS I     # →Δ→
+1D6E5 ;        1403 ;  SA      # ( 𝛥 → ᐃ ) MATHEMATICAL ITALIC CAPITAL DELTA → CANADIAN SYLLABICS I   # →Δ→
+1D71F ;        1403 ;  SA      # ( 𝜟 → ᐃ ) MATHEMATICAL BOLD ITALIC CAPITAL DELTA → CANADIAN SYLLABICS I      # →Δ→
+1D759 ;        1403 ;  SA      # ( 𝝙 → ᐃ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA → CANADIAN SYLLABICS I  # →Δ→
+1D793 ;        1403 ;  SA      # ( 𝞓 → ᐃ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA → CANADIAN SYLLABICS I   # →Δ→
+
+140F ; 1403 00B7 ;     SA      # ( ᐏ → ᐃ· ) CANADIAN SYLLABICS WEST-CREE WI → CANADIAN SYLLABICS I, MIDDLE DOT        # →ᐃᐧ→
+
+1411 ; 1404 00B7 ;     SA      # ( ᐑ → ᐄ· ) CANADIAN SYLLABICS WEST-CREE WII → CANADIAN SYLLABICS II, MIDDLE DOT      # →ᐄᐧ→
+
+1413 ; 1405 00B7 ;     SA      # ( ᐓ → ᐅ· ) CANADIAN SYLLABICS WEST-CREE WO → CANADIAN SYLLABICS O, MIDDLE DOT        # →ᐅᐧ→
+
+1415 ; 1406 00B7 ;     SA      # ( ᐕ → ᐆ· ) CANADIAN SYLLABICS WEST-CREE WOO → CANADIAN SYLLABICS OO, MIDDLE DOT      # →ᐆᐧ→
+
+1418 ; 140A 00B7 ;     SA      # ( ᐘ → ᐊ· ) CANADIAN SYLLABICS WEST-CREE WA → CANADIAN SYLLABICS A, MIDDLE DOT        # →ᐊᐧ→
+
+141A ; 140B 00B7 ;     SA      # ( ᐚ → ᐋ· ) CANADIAN SYLLABICS WEST-CREE WAA → CANADIAN SYLLABICS AA, MIDDLE DOT      # →ᐋᐧ→
+
+14D1 ; 1421 ;  SA      # ( ᓑ → ᐡ ) CANADIAN SYLLABICS CARRIER NG → CANADIAN SYLLABICS FINAL BOTTOM HALF RING   # 
+
+1476 ; 1427 146D ;     SA      # ( ᑶ → ᐧᑭ ) CANADIAN SYLLABICS KWI → CANADIAN SYLLABICS FINAL MIDDLE DOT, CANADIAN SYLLABICS KI      # 
+
+147A ; 1427 146F ;     SA      # ( ᑺ → ᐧᑯ ) CANADIAN SYLLABICS KWO → CANADIAN SYLLABICS FINAL MIDDLE DOT, CANADIAN SYLLABICS KO      # 
+
+1498 ; 1427 148D ;     SA      # ( ᒘ → ᐧᒍ ) CANADIAN SYLLABICS CWO → CANADIAN SYLLABICS FINAL MIDDLE DOT, CANADIAN SYLLABICS CO      # 
+
+1540 ; 1429 ;  SA      # ( ᕀ → ᐩ ) CANADIAN SYLLABICS WEST-CREE Y → CANADIAN SYLLABICS FINAL PLUS      # 
+
+1441 ; 1433 00B7 ;     SA      # ( ᑁ → ᐳ· ) CANADIAN SYLLABICS WEST-CREE PWO → CANADIAN SYLLABICS PO, MIDDLE DOT      # →ᐳᐧ→
+
+1443 ; 1434 00B7 ;     SA      # ( ᑃ → ᐴ· ) CANADIAN SYLLABICS WEST-CREE PWOO → CANADIAN SYLLABICS POO, MIDDLE DOT    # →ᐴᐧ→
+
+1445 ; 1438 00B7 ;     SA      # ( ᑅ → ᐸ· ) CANADIAN SYLLABICS WEST-CREE PWA → CANADIAN SYLLABICS PA, MIDDLE DOT      # →ᐸᐧ→
+
+1447 ; 1439 00B7 ;     SA      # ( ᑇ → ᐹ· ) CANADIAN SYLLABICS WEST-CREE PWAA → CANADIAN SYLLABICS PAA, MIDDLE DOT    # →ᐹᐧ→
+
+02C8 ; 144A ;  SA      # ( ˈ → ᑊ ) MODIFIER LETTER VERTICAL LINE → CANADIAN SYLLABICS WEST-CREE P       # 
+
+1458 ; 144C 00B7 ;     SA      # ( ᑘ → ᑌ· ) CANADIAN SYLLABICS WEST-CREE TWE → CANADIAN SYLLABICS TE, MIDDLE DOT      # →ᑌᐧ→
+
+1467 ; 144C 144A ;     SA      # ( ᑧ → ᑌᑊ ) CANADIAN SYLLABICS TTE → CANADIAN SYLLABICS TE, CANADIAN SYLLABICS WEST-CREE P   # 
+
+145A ; 144E 00B7 ;     SA      # ( ᑚ → ᑎ· ) CANADIAN SYLLABICS WEST-CREE TWI → CANADIAN SYLLABICS TI, MIDDLE DOT      # →ᑎᐧ→
+
+1468 ; 144E 144A ;     SA      # ( ᑨ → ᑎᑊ ) CANADIAN SYLLABICS TTI → CANADIAN SYLLABICS TI, CANADIAN SYLLABICS WEST-CREE P   # 
+
+145C ; 144F 00B7 ;     SA      # ( ᑜ → ᑏ· ) CANADIAN SYLLABICS WEST-CREE TWII → CANADIAN SYLLABICS TII, MIDDLE DOT    # →ᑏᐧ→
+
+145E ; 1450 00B7 ;     SA      # ( ᑞ → ᑐ· ) CANADIAN SYLLABICS WEST-CREE TWO → CANADIAN SYLLABICS TO, MIDDLE DOT      # →ᑐᐧ→
+
+1469 ; 1450 144A ;     SA      # ( ᑩ → ᑐᑊ ) CANADIAN SYLLABICS TTO → CANADIAN SYLLABICS TO, CANADIAN SYLLABICS WEST-CREE P   # 
+
+1460 ; 1451 00B7 ;     SA      # ( ᑠ → ᑑ· ) CANADIAN SYLLABICS WEST-CREE TWOO → CANADIAN SYLLABICS TOO, MIDDLE DOT    # →ᑑᐧ→
+
+1462 ; 1455 00B7 ;     SA      # ( ᑢ → ᑕ· ) CANADIAN SYLLABICS WEST-CREE TWA → CANADIAN SYLLABICS TA, MIDDLE DOT      # →ᑕᐧ→
+
+146A ; 1455 144A ;     SA      # ( ᑪ → ᑕᑊ ) CANADIAN SYLLABICS TTA → CANADIAN SYLLABICS TA, CANADIAN SYLLABICS WEST-CREE P   # 
+
+1464 ; 1456 00B7 ;     SA      # ( ᑤ → ᑖ· ) CANADIAN SYLLABICS WEST-CREE TWAA → CANADIAN SYLLABICS TAA, MIDDLE DOT    # →ᑖᐧ→
+
+1475 ; 146B 00B7 ;     SA      # ( ᑵ → ᑫ· ) CANADIAN SYLLABICS WEST-CREE KWE → CANADIAN SYLLABICS KE, MIDDLE DOT      # →ᑫᐧ→
+
+1485 ; 146B 144A ;     SA      # ( ᒅ → ᑫᑊ ) CANADIAN SYLLABICS SOUTH-SLAVEY KEH → CANADIAN SYLLABICS KE, CANADIAN SYLLABICS WEST-CREE P      # 
+
+1477 ; 146D 1427 ;     SA      # ( ᑷ → ᑭᐧ ) CANADIAN SYLLABICS WEST-CREE KWI → CANADIAN SYLLABICS KI, CANADIAN SYLLABICS FINAL MIDDLE DOT    # 
+
+1486 ; 146D 144A ;     SA      # ( ᒆ → ᑭᑊ ) CANADIAN SYLLABICS SOUTH-SLAVEY KIH → CANADIAN SYLLABICS KI, CANADIAN SYLLABICS WEST-CREE P      # 
+
+1479 ; 146E 00B7 ;     SA      # ( ᑹ → ᑮ· ) CANADIAN SYLLABICS WEST-CREE KWII → CANADIAN SYLLABICS KII, MIDDLE DOT    # →ᑮᐧ→
+
+147B ; 146F 1427 ;     SA      # ( ᑻ → ᑯᐧ ) CANADIAN SYLLABICS WEST-CREE KWO → CANADIAN SYLLABICS KO, CANADIAN SYLLABICS FINAL MIDDLE DOT    # 
+
+1487 ; 146F 144A ;     SA      # ( ᒇ → ᑯᑊ ) CANADIAN SYLLABICS SOUTH-SLAVEY KOH → CANADIAN SYLLABICS KO, CANADIAN SYLLABICS WEST-CREE P      # 
+
+147D ; 1470 00B7 ;     SA      # ( ᑽ → ᑰ· ) CANADIAN SYLLABICS WEST-CREE KWOO → CANADIAN SYLLABICS KOO, MIDDLE DOT    # →ᑰᐧ→
+
+147F ; 1472 00B7 ;     SA      # ( ᑿ → ᑲ· ) CANADIAN SYLLABICS WEST-CREE KWA → CANADIAN SYLLABICS KA, MIDDLE DOT      # →ᑲᐧ→
+
+1488 ; 1472 144A ;     SA      # ( ᒈ → ᑲᑊ ) CANADIAN SYLLABICS SOUTH-SLAVEY KAH → CANADIAN SYLLABICS KA, CANADIAN SYLLABICS WEST-CREE P      # 
+
+1481 ; 1473 00B7 ;     SA      # ( ᒁ → ᑳ· ) CANADIAN SYLLABICS WEST-CREE KWAA → CANADIAN SYLLABICS KAA, MIDDLE DOT    # →ᑳᐧ→
+
+1603 ; 1489 ;  SA      # ( ᘃ → ᒉ ) CANADIAN SYLLABICS CARRIER NO → CANADIAN SYLLABICS CE       # 
+
+1493 ; 1489 00B7 ;     SA      # ( ᒓ → ᒉ· ) CANADIAN SYLLABICS WEST-CREE CWE → CANADIAN SYLLABICS CE, MIDDLE DOT      # →ᒉᐧ→
+
+1495 ; 148B 00B7 ;     SA      # ( ᒕ → ᒋ· ) CANADIAN SYLLABICS WEST-CREE CWI → CANADIAN SYLLABICS CI, MIDDLE DOT      # →ᒋᐧ→
+
+1497 ; 148C 00B7 ;     SA      # ( ᒗ → ᒌ· ) CANADIAN SYLLABICS WEST-CREE CWII → CANADIAN SYLLABICS CII, MIDDLE DOT    # →ᒌᐧ→
+
+1499 ; 148D 1427 ;     SA      # ( ᒙ → ᒍᐧ ) CANADIAN SYLLABICS WEST-CREE CWO → CANADIAN SYLLABICS CO, CANADIAN SYLLABICS FINAL MIDDLE DOT    # 
+
+149B ; 148E 00B7 ;     SA      # ( ᒛ → ᒎ· ) CANADIAN SYLLABICS WEST-CREE CWOO → CANADIAN SYLLABICS COO, MIDDLE DOT    # →ᒎᐧ→
+
+1602 ; 1490 ;  SA      # ( ᘂ → ᒐ ) CANADIAN SYLLABICS CARRIER NU → CANADIAN SYLLABICS CA       # 
+
+149D ; 1490 00B7 ;     SA      # ( ᒝ → ᒐ· ) CANADIAN SYLLABICS WEST-CREE CWA → CANADIAN SYLLABICS CA, MIDDLE DOT      # →ᒐᐧ→
+
+149F ; 1491 00B7 ;     SA      # ( ᒟ → ᒑ· ) CANADIAN SYLLABICS WEST-CREE CWAA → CANADIAN SYLLABICS CAA, MIDDLE DOT    # →ᒑᐧ→
+
+14AD ; 14A3 00B7 ;     SA      # ( ᒭ → ᒣ· ) CANADIAN SYLLABICS WEST-CREE MWE → CANADIAN SYLLABICS ME, MIDDLE DOT      # →ᒣᐧ→
+
+213E ; 14A5 ;  SA      # ( ℾ → ᒥ ) DOUBLE-STRUCK CAPITAL GAMMA → CANADIAN SYLLABICS MI # →Γ→
+1D6AA ;        14A5 ;  SA      # ( 𝚪 → ᒥ ) MATHEMATICAL BOLD CAPITAL GAMMA → CANADIAN SYLLABICS MI    # →Γ→
+1D6E4 ;        14A5 ;  SA      # ( 𝛤 → ᒥ ) MATHEMATICAL ITALIC CAPITAL GAMMA → CANADIAN SYLLABICS MI  # →Γ→
+1D71E ;        14A5 ;  SA      # ( 𝜞 → ᒥ ) MATHEMATICAL BOLD ITALIC CAPITAL GAMMA → CANADIAN SYLLABICS MI     # →Γ→
+1D758 ;        14A5 ;  SA      # ( 𝝘 → ᒥ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA → CANADIAN SYLLABICS MI # →Γ→
+1D792 ;        14A5 ;  SA      # ( 𝞒 → ᒥ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA → CANADIAN SYLLABICS MI  # →Γ→
+
+14AF ; 14A5 00B7 ;     SA      # ( ᒯ → ᒥ· ) CANADIAN SYLLABICS WEST-CREE MWI → CANADIAN SYLLABICS MI, MIDDLE DOT      # →ᒥᐧ→
+
+14B1 ; 14A6 00B7 ;     SA      # ( ᒱ → ᒦ· ) CANADIAN SYLLABICS WEST-CREE MWII → CANADIAN SYLLABICS MII, MIDDLE DOT    # →ᒦᐧ→
+
+14B3 ; 14A7 00B7 ;     SA      # ( ᒳ → ᒧ· ) CANADIAN SYLLABICS WEST-CREE MWO → CANADIAN SYLLABICS MO, MIDDLE DOT      # →ᒧᐧ→
+
+14B5 ; 14A8 00B7 ;     SA      # ( ᒵ → ᒨ· ) CANADIAN SYLLABICS WEST-CREE MWOO → CANADIAN SYLLABICS MOO, MIDDLE DOT    # →ᒨᐧ→
+
+14B9 ; 14AB 00B7 ;     SA      # ( ᒹ → ᒫ· ) CANADIAN SYLLABICS WEST-CREE MWAA → CANADIAN SYLLABICS MAA, MIDDLE DOT    # →ᒫᐧ→
+
+14CA ; 14C0 00B7 ;     SA      # ( ᓊ → ᓀ· ) CANADIAN SYLLABICS WEST-CREE NWE → CANADIAN SYLLABICS NE, MIDDLE DOT      # →ᓀᐧ→
+
+14CC ; 14C7 00B7 ;     SA      # ( ᓌ → ᓇ· ) CANADIAN SYLLABICS WEST-CREE NWA → CANADIAN SYLLABICS NA, MIDDLE DOT      # →ᓇᐧ→
+
+14CE ; 14C8 14AB ;     SA      # ( ᓎ → ᓈᒫ ) CANADIAN SYLLABICS WEST-CREE NWAA → CANADIAN SYLLABICS NAA, CANADIAN SYLLABICS MAA       # 
+
+1604 ; 14D3 ;  SA      # ( ᘄ → ᓓ ) CANADIAN SYLLABICS CARRIER NE → CANADIAN SYLLABICS LE       # 
+
+14DD ; 14D3 00B7 ;     SA      # ( ᓝ → ᓓ· ) CANADIAN SYLLABICS WEST-CREE LWE → CANADIAN SYLLABICS LE, MIDDLE DOT      # →ᓓᐧ→
+
+14DF ; 14D5 00B7 ;     SA      # ( ᓟ → ᓕ· ) CANADIAN SYLLABICS WEST-CREE LWI → CANADIAN SYLLABICS LI, MIDDLE DOT      # →ᓕᐧ→
+
+14E1 ; 14D6 00B7 ;     SA      # ( ᓡ → ᓖ· ) CANADIAN SYLLABICS WEST-CREE LWII → CANADIAN SYLLABICS LII, MIDDLE DOT    # →ᓖᐧ→
+
+14E3 ; 14D7 00B7 ;     SA      # ( ᓣ → ᓗ· ) CANADIAN SYLLABICS WEST-CREE LWO → CANADIAN SYLLABICS LO, MIDDLE DOT      # →ᓗᐧ→
+
+14E5 ; 14D8 00B7 ;     SA      # ( ᓥ → ᓘ· ) CANADIAN SYLLABICS WEST-CREE LWOO → CANADIAN SYLLABICS LOO, MIDDLE DOT    # →ᓘᐧ→
+
+1607 ; 14DA ;  SA      # ( ᘇ → ᓚ ) CANADIAN SYLLABICS CARRIER NA → CANADIAN SYLLABICS LA       # 
+
+14E7 ; 14DA 00B7 ;     SA      # ( ᓧ → ᓚ· ) CANADIAN SYLLABICS WEST-CREE LWA → CANADIAN SYLLABICS LA, MIDDLE DOT      # →ᓚᐧ→
+
+14E9 ; 14DB 00B7 ;     SA      # ( ᓩ → ᓛ· ) CANADIAN SYLLABICS WEST-CREE LWAA → CANADIAN SYLLABICS LAA, MIDDLE DOT    # →ᓛᐧ→
+
+14F7 ; 14ED 00B7 ;     SA      # ( ᓷ → ᓭ· ) CANADIAN SYLLABICS WEST-CREE SWE → CANADIAN SYLLABICS SE, MIDDLE DOT      # →ᓭᐧ→
+
+14F9 ; 14EF 00B7 ;     SA      # ( ᓹ → ᓯ· ) CANADIAN SYLLABICS WEST-CREE SWI → CANADIAN SYLLABICS SI, MIDDLE DOT      # →ᓯᐧ→
+
+14FB ; 14F0 00B7 ;     SA      # ( ᓻ → ᓰ· ) CANADIAN SYLLABICS WEST-CREE SWII → CANADIAN SYLLABICS SII, MIDDLE DOT    # →ᓰᐧ→
+
+14FD ; 14F1 00B7 ;     SA      # ( ᓽ → ᓱ· ) CANADIAN SYLLABICS WEST-CREE SWO → CANADIAN SYLLABICS SO, MIDDLE DOT      # →ᓱᐧ→
+
+14FF ; 14F2 00B7 ;     SA      # ( ᓿ → ᓲ· ) CANADIAN SYLLABICS WEST-CREE SWOO → CANADIAN SYLLABICS SOO, MIDDLE DOT    # →ᓲᐧ→
+
+1501 ; 14F4 00B7 ;     SA      # ( ᔁ → ᓴ· ) CANADIAN SYLLABICS WEST-CREE SWA → CANADIAN SYLLABICS SA, MIDDLE DOT      # →ᓴᐧ→
+
+1503 ; 14F5 00B7 ;     SA      # ( ᔃ → ᓵ· ) CANADIAN SYLLABICS WEST-CREE SWAA → CANADIAN SYLLABICS SAA, MIDDLE DOT    # →ᓵᐧ→
+
+150C ; 150B 1438 ;     SA      # ( ᔌ → ᔋᐸ ) CANADIAN SYLLABICS NASKAPI SPWA → CANADIAN SYLLABICS NASKAPI S-W, CANADIAN SYLLABICS PA  # 
+
+150D ; 150B 1455 ;     SA      # ( ᔍ → ᔋᑕ ) CANADIAN SYLLABICS NASKAPI STWA → CANADIAN SYLLABICS NASKAPI S-W, CANADIAN SYLLABICS TA  # 
+
+150E ; 150B 1472 ;     SA      # ( ᔎ → ᔋᑲ ) CANADIAN SYLLABICS NASKAPI SKWA → CANADIAN SYLLABICS NASKAPI S-W, CANADIAN SYLLABICS KA  # 
+
+150F ; 150B 1490 ;     SA      # ( ᔏ → ᔋᒐ ) CANADIAN SYLLABICS NASKAPI SCWA → CANADIAN SYLLABICS NASKAPI S-W, CANADIAN SYLLABICS CA  # 
+
+1518 ; 1510 00B7 ;     SA      # ( ᔘ → ᔐ· ) CANADIAN SYLLABICS WEST-CREE SHWE → CANADIAN SYLLABICS SHE, MIDDLE DOT    # →ᔐᐧ→
+
+151A ; 1511 00B7 ;     SA      # ( ᔚ → ᔑ· ) CANADIAN SYLLABICS WEST-CREE SHWI → CANADIAN SYLLABICS SHI, MIDDLE DOT    # →ᔑᐧ→
+
+151C ; 1512 00B7 ;     SA      # ( ᔜ → ᔒ· ) CANADIAN SYLLABICS WEST-CREE SHWII → CANADIAN SYLLABICS SHII, MIDDLE DOT  # →ᔒᐧ→
+
+151E ; 1513 00B7 ;     SA      # ( ᔞ → ᔓ· ) CANADIAN SYLLABICS WEST-CREE SHWO → CANADIAN SYLLABICS SHO, MIDDLE DOT    # →ᔓᐧ→
+
+1520 ; 1514 00B7 ;     SA      # ( ᔠ → ᔔ· ) CANADIAN SYLLABICS WEST-CREE SHWOO → CANADIAN SYLLABICS SHOO, MIDDLE DOT  # →ᔔᐧ→
+
+1522 ; 1515 00B7 ;     SA      # ( ᔢ → ᔕ· ) CANADIAN SYLLABICS WEST-CREE SHWA → CANADIAN SYLLABICS SHA, MIDDLE DOT    # →ᔕᐧ→
+
+1524 ; 1516 00B7 ;     SA      # ( ᔤ → ᔖ· ) CANADIAN SYLLABICS WEST-CREE SHWAA → CANADIAN SYLLABICS SHAA, MIDDLE DOT  # →ᔖᐧ→
+
+1532 ; 1528 00B7 ;     SA      # ( ᔲ → ᔨ· ) CANADIAN SYLLABICS WEST-CREE YWI → CANADIAN SYLLABICS YI, MIDDLE DOT      # →ᔨᐧ→
+
+1534 ; 1529 00B7 ;     SA      # ( ᔴ → ᔩ· ) CANADIAN SYLLABICS WEST-CREE YWII → CANADIAN SYLLABICS YII, MIDDLE DOT    # →ᔩᐧ→
+
+1536 ; 152A 00B7 ;     SA      # ( ᔶ → ᔪ· ) CANADIAN SYLLABICS WEST-CREE YWO → CANADIAN SYLLABICS YO, MIDDLE DOT      # →ᔪᐧ→
+
+1538 ; 152B 00B7 ;     SA      # ( ᔸ → ᔫ· ) CANADIAN SYLLABICS WEST-CREE YWOO → CANADIAN SYLLABICS YOO, MIDDLE DOT    # →ᔫᐧ→
+
+153A ; 152D 00B7 ;     SA      # ( ᔺ → ᔭ· ) CANADIAN SYLLABICS WEST-CREE YWA → CANADIAN SYLLABICS YA, MIDDLE DOT      # →ᔭᐧ→
+
+153C ; 152E 00B7 ;     SA      # ( ᔼ → ᔮ· ) CANADIAN SYLLABICS WEST-CREE YWAA → CANADIAN SYLLABICS YAA, MIDDLE DOT    # →ᔮᐧ→
+
+166E ; 1541 ;  SA      #* ( ᙮ → ᕁ ) CANADIAN SYLLABICS FULL STOP → CANADIAN SYLLABICS SAYISI YI        # 
+157D ; 1541 ;  SA      # ( ᕽ → ᕁ ) CANADIAN SYLLABICS HK → CANADIAN SYLLABICS SAYISI YI        # 
+
+1622 ; 1543 ;  SA      # ( ᘢ → ᕃ ) CANADIAN SYLLABICS CARRIER LU → CANADIAN SYLLABICS R-CREE RE        # 
+
+1623 ; 1546 ;  SA      # ( ᘣ → ᕆ ) CANADIAN SYLLABICS CARRIER LO → CANADIAN SYLLABICS RI       # 
+
+1624 ; 154A ;  SA      # ( ᘤ → ᕊ ) CANADIAN SYLLABICS CARRIER LE → CANADIAN SYLLABICS WEST-CREE LO     # 
+
+154F ; 154C 00B7 ;     SA      # ( ᕏ → ᕌ· ) CANADIAN SYLLABICS WEST-CREE RWAA → CANADIAN SYLLABICS RAA, MIDDLE DOT    # →ᕌᐧ→
+
+166F ; 1550 146B ;     SA      # ( ᙯ → ᕐᑫ ) CANADIAN SYLLABICS QAI → CANADIAN SYLLABICS R, CANADIAN SYLLABICS KE     # 
+
+157E ; 1550 146C ;     SA      # ( ᕾ → ᕐᑬ ) CANADIAN SYLLABICS QAAI → CANADIAN SYLLABICS R, CANADIAN SYLLABICS KAAI  # 
+
+157F ; 1550 146D ;     SA      # ( ᕿ → ᕐᑭ ) CANADIAN SYLLABICS QI → CANADIAN SYLLABICS R, CANADIAN SYLLABICS KI      # 
+
+1580 ; 1550 146E ;     SA      # ( ᖀ → ᕐᑮ ) CANADIAN SYLLABICS QII → CANADIAN SYLLABICS R, CANADIAN SYLLABICS KII    # 
+
+1581 ; 1550 146F ;     SA      # ( ᖁ → ᕐᑯ ) CANADIAN SYLLABICS QO → CANADIAN SYLLABICS R, CANADIAN SYLLABICS KO      # 
+
+1582 ; 1550 1470 ;     SA      # ( ᖂ → ᕐᑰ ) CANADIAN SYLLABICS QOO → CANADIAN SYLLABICS R, CANADIAN SYLLABICS KOO    # 
+
+1583 ; 1550 1472 ;     SA      # ( ᖃ → ᕐᑲ ) CANADIAN SYLLABICS QA → CANADIAN SYLLABICS R, CANADIAN SYLLABICS KA      # 
+
+1584 ; 1550 1473 ;     SA      # ( ᖄ → ᕐᑳ ) CANADIAN SYLLABICS QAA → CANADIAN SYLLABICS R, CANADIAN SYLLABICS KAA    # 
+
+1585 ; 1550 1483 ;     SA      # ( ᖅ → ᕐᒃ ) CANADIAN SYLLABICS Q → CANADIAN SYLLABICS R, CANADIAN SYLLABICS K        # 
+
+155C ; 155A 00B7 ;     SA      # ( ᕜ → ᕚ· ) CANADIAN SYLLABICS WEST-CREE FWAA → CANADIAN SYLLABICS FAA, MIDDLE DOT    # →ᕚᐧ→
+
+1569 ; 1567 00B7 ;     SA      # ( ᕩ → ᕧ· ) CANADIAN SYLLABICS WEST-CREE THWAA → CANADIAN SYLLABICS THAA, MIDDLE DOT  # →ᕧᐧ→
+
+1670 ; 1595 1489 ;     SA      # ( ᙰ → ᖕᒉ ) CANADIAN SYLLABICS NGAI → CANADIAN SYLLABICS NG, CANADIAN SYLLABICS CE   # 
+
+158E ; 1595 148A ;     SA      # ( ᖎ → ᖕᒊ ) CANADIAN SYLLABICS NGAAI → CANADIAN SYLLABICS NG, CANADIAN SYLLABICS CAAI        # 
+
+158F ; 1595 148B ;     SA      # ( ᖏ → ᖕᒋ ) CANADIAN SYLLABICS NGI → CANADIAN SYLLABICS NG, CANADIAN SYLLABICS CI    # 
+
+1590 ; 1595 148C ;     SA      # ( ᖐ → ᖕᒌ ) CANADIAN SYLLABICS NGII → CANADIAN SYLLABICS NG, CANADIAN SYLLABICS CII  # 
+
+1591 ; 1595 148D ;     SA      # ( ᖑ → ᖕᒍ ) CANADIAN SYLLABICS NGO → CANADIAN SYLLABICS NG, CANADIAN SYLLABICS CO    # 
+
+1592 ; 1595 148E ;     SA      # ( ᖒ → ᖕᒎ ) CANADIAN SYLLABICS NGOO → CANADIAN SYLLABICS NG, CANADIAN SYLLABICS COO  # 
+
+1593 ; 1595 1490 ;     SA      # ( ᖓ → ᖕᒐ ) CANADIAN SYLLABICS NGA → CANADIAN SYLLABICS NG, CANADIAN SYLLABICS CA    # 
+
+1594 ; 1595 1491 ;     SA      # ( ᖔ → ᖕᒑ ) CANADIAN SYLLABICS NGAA → CANADIAN SYLLABICS NG, CANADIAN SYLLABICS CAA  # 
+
+1671 ; 1596 148B ;     SA      # ( ᙱ → ᖖᒋ ) CANADIAN SYLLABICS NNGI → CANADIAN SYLLABICS NNG, CANADIAN SYLLABICS CI  # 
+
+1672 ; 1596 148C ;     SA      # ( ᙲ → ᖖᒌ ) CANADIAN SYLLABICS NNGII → CANADIAN SYLLABICS NNG, CANADIAN SYLLABICS CII        # 
+
+1673 ; 1596 148D ;     SA      # ( ᙳ → ᖖᒍ ) CANADIAN SYLLABICS NNGO → CANADIAN SYLLABICS NNG, CANADIAN SYLLABICS CO  # 
+
+1674 ; 1596 148E ;     SA      # ( ᙴ → ᖖᒎ ) CANADIAN SYLLABICS NNGOO → CANADIAN SYLLABICS NNG, CANADIAN SYLLABICS COO        # 
+
+1675 ; 1596 1490 ;     SA      # ( ᙵ → ᖖᒐ ) CANADIAN SYLLABICS NNGA → CANADIAN SYLLABICS NNG, CANADIAN SYLLABICS CA  # 
+
+1676 ; 1596 1491 ;     SA      # ( ᙶ → ᖖᒑ ) CANADIAN SYLLABICS NNGAA → CANADIAN SYLLABICS NNG, CANADIAN SYLLABICS CAA        # 
+
+15EA ; 15DE ;  SA      # ( ᗪ → ᗞ ) CANADIAN SYLLABICS CARRIER PE → CANADIAN SYLLABICS CARRIER THE      # 
+
+1634 ; 162E ;  SA      # ( ᘴ → ᘮ ) CANADIAN SYLLABICS CARRIER TLHU → CANADIAN SYLLABICS CARRIER LHU    # 
+
+1D6C0 ;        162F ;  SA      # ( 𝛀 → ᘯ ) MATHEMATICAL BOLD CAPITAL OMEGA → CANADIAN SYLLABICS CARRIER LHO   # →Ω→
+1D6FA ;        162F ;  SA      # ( 𝛺 → ᘯ ) MATHEMATICAL ITALIC CAPITAL OMEGA → CANADIAN SYLLABICS CARRIER LHO # →Ω→
+1D734 ;        162F ;  SA      # ( 𝜴 → ᘯ ) MATHEMATICAL BOLD ITALIC CAPITAL OMEGA → CANADIAN SYLLABICS CARRIER LHO    # →Ω→
+1D76E ;        162F ;  SA      # ( 𝝮 → ᘯ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA → CANADIAN SYLLABICS CARRIER LHO        # →Ω→
+1D7A8 ;        162F ;  SA      # ( 𝞨 → ᘯ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA → CANADIAN SYLLABICS CARRIER LHO # →Ω→
+1635 ; 162F ;  SA      # ( ᘵ → ᘯ ) CANADIAN SYLLABICS CARRIER TLHO → CANADIAN SYLLABICS CARRIER LHO    # 
+
+3131 ; 1100 ;  SA      # ( ㄱ → ᄀ ) HANGUL LETTER KIYEOK → HANGUL CHOSEONG KIYEOK       # 
+11A8 ; 1100 ;  SA      # ( ᆨ → ᄀ ) HANGUL JONGSEONG KIYEOK → HANGUL CHOSEONG KIYEOK    # 
+
+1101 ; 1100 1100 ;     SA      # ( ᄁ → ᄀᄀ ) HANGUL CHOSEONG SSANGKIYEOK → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG KIYEOK     # 
+3132 ; 1100 1100 ;     SA      # ( ㄲ → ᄀᄀ ) HANGUL LETTER SSANGKIYEOK → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG KIYEOK       # →ᄁ→
+11A9 ; 1100 1100 ;     SA      # ( ᆩ → ᄀᄀ ) HANGUL JONGSEONG SSANGKIYEOK → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG KIYEOK    # →ᄁ→
+
+11FA ; 1100 1102 ;     SA      # ( ᇺ → ᄀᄂ ) HANGUL JONGSEONG KIYEOK-NIEUN → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG NIEUN    # →ᆨᆫ→
+
+115A ; 1100 1103 ;     SA      # ( ᅚ → ᄀᄃ ) HANGUL CHOSEONG KIYEOK-TIKEUT → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG TIKEUT   # 
+
+11C3 ; 1100 1105 ;     SA      # ( ᇃ → ᄀᄅ ) HANGUL JONGSEONG KIYEOK-RIEUL → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG RIEUL    # →ᆨᆯ→
+
+11FB ; 1100 1107 ;     SA      # ( ᇻ → ᄀᄇ ) HANGUL JONGSEONG KIYEOK-PIEUP → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG PIEUP    # →ᆨᆸ→
+
+11AA ; 1100 1109 ;     SA      # ( ᆪ → ᄀᄉ ) HANGUL JONGSEONG KIYEOK-SIOS → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG SIOS      # →ᆨᆺ→
+3133 ; 1100 1109 ;     SA      # ( ㄳ → ᄀᄉ ) HANGUL LETTER KIYEOK-SIOS → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG SIOS # →ᆪ→→ᆨᆺ→
+
+11C4 ; 1100 1109 1100 ;        SA      # ( ᇄ → ᄀᄉᄀ ) HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK    # →ᆨᆺᆨ→
+
+11FC ; 1100 110E ;     SA      # ( ᇼ → ᄀᄎ ) HANGUL JONGSEONG KIYEOK-CHIEUCH → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG CHIEUCH        # →ᆨᆾ→
+
+11FD ; 1100 110F ;     SA      # ( ᇽ → ᄀᄏ ) HANGUL JONGSEONG KIYEOK-KHIEUKH → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG KHIEUKH        # →ᆨᆿ→
+
+11FE ; 1100 1112 ;     SA      # ( ᇾ → ᄀᄒ ) HANGUL JONGSEONG KIYEOK-HIEUH → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG HIEUH    # →ᆨᇂ→
+
+3134 ; 1102 ;  SA      # ( ㄴ → ᄂ ) HANGUL LETTER NIEUN → HANGUL CHOSEONG NIEUN # 
+11AB ; 1102 ;  SA      # ( ᆫ → ᄂ ) HANGUL JONGSEONG NIEUN → HANGUL CHOSEONG NIEUN      # 
+
+1113 ; 1102 1100 ;     SA      # ( ᄓ → ᄂᄀ ) HANGUL CHOSEONG NIEUN-KIYEOK → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG KIYEOK     # 
+11C5 ; 1102 1100 ;     SA      # ( ᇅ → ᄂᄀ ) HANGUL JONGSEONG NIEUN-KIYEOK → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG KIYEOK    # →ᄓ→
+
+1114 ; 1102 1102 ;     SA      # ( ᄔ → ᄂᄂ ) HANGUL CHOSEONG SSANGNIEUN → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG NIEUN        # 
+3165 ; 1102 1102 ;     SA      # ( ㅥ → ᄂᄂ ) HANGUL LETTER SSANGNIEUN → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG NIEUN  # →ᄔ→
+11FF ; 1102 1102 ;     SA      # ( ᇿ → ᄂᄂ ) HANGUL JONGSEONG SSANGNIEUN → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG NIEUN       # →ᆫᆫ→
+
+1115 ; 1102 1103 ;     SA      # ( ᄕ → ᄂᄃ ) HANGUL CHOSEONG NIEUN-TIKEUT → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG TIKEUT     # 
+3166 ; 1102 1103 ;     SA      # ( ㅦ → ᄂᄃ ) HANGUL LETTER NIEUN-TIKEUT → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG TIKEUT       # →ᄕ→
+11C6 ; 1102 1103 ;     SA      # ( ᇆ → ᄂᄃ ) HANGUL JONGSEONG NIEUN-TIKEUT → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG TIKEUT    # →ᄕ→
+
+D7CB ; 1102 1105 ;     SA      # ( ퟋ → ᄂᄅ ) HANGUL JONGSEONG NIEUN-RIEUL → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG RIEUL      # →ᆫᆯ→
+
+1116 ; 1102 1107 ;     SA      # ( ᄖ → ᄂᄇ ) HANGUL CHOSEONG NIEUN-PIEUP → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG PIEUP       # 
+
+115B ; 1102 1109 ;     SA      # ( ᅛ → ᄂᄉ ) HANGUL CHOSEONG NIEUN-SIOS → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG SIOS # 
+11C7 ; 1102 1109 ;     SA      # ( ᇇ → ᄂᄉ ) HANGUL JONGSEONG NIEUN-SIOS → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG SIOS        # →ᆫᆺ→
+3167 ; 1102 1109 ;     SA      # ( ㅧ → ᄂᄉ ) HANGUL LETTER NIEUN-SIOS → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG SIOS   # →ᇇ→→ᆫᆺ→
+
+115C ; 1102 110C ;     SA      # ( ᅜ → ᄂᄌ ) HANGUL CHOSEONG NIEUN-CIEUC → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG CIEUC       # 
+11AC ; 1102 110C ;     SA      # ( ᆬ → ᄂᄌ ) HANGUL JONGSEONG NIEUN-CIEUC → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG CIEUC      # →ᆫᆽ→
+3135 ; 1102 110C ;     SA      # ( ㄵ → ᄂᄌ ) HANGUL LETTER NIEUN-CIEUC → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG CIEUC # →ᆬ→→ᆫᆽ→
+
+D7CC ; 1102 110E ;     SA      # ( ퟌ → ᄂᄎ ) HANGUL JONGSEONG NIEUN-CHIEUCH → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG CHIEUCH  # →ᆫᆾ→
+
+11C9 ; 1102 1110 ;     SA      # ( ᇉ → ᄂᄐ ) HANGUL JONGSEONG NIEUN-THIEUTH → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG THIEUTH  # →ᆫᇀ→
+
+115D ; 1102 1112 ;     SA      # ( ᅝ → ᄂᄒ ) HANGUL CHOSEONG NIEUN-HIEUH → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG HIEUH       # 
+11AD ; 1102 1112 ;     SA      # ( ᆭ → ᄂᄒ ) HANGUL JONGSEONG NIEUN-HIEUH → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG HIEUH      # →ᆫᇂ→
+3136 ; 1102 1112 ;     SA      # ( ㄶ → ᄂᄒ ) HANGUL LETTER NIEUN-HIEUH → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG HIEUH # →ᆭ→→ᆫᇂ→
+
+11C8 ; 1102 1140 ;     SA      # ( ᇈ → ᄂᅀ ) HANGUL JONGSEONG NIEUN-PANSIOS → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG PANSIOS  # →ᆫᇫ→
+3168 ; 1102 1140 ;     SA      # ( ㅨ → ᄂᅀ ) HANGUL LETTER NIEUN-PANSIOS → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG PANSIOS     # →ᇈ→→ᆫᇫ→
+
+3137 ; 1103 ;  SA      # ( ㄷ → ᄃ ) HANGUL LETTER TIKEUT → HANGUL CHOSEONG TIKEUT       # 
+11AE ; 1103 ;  SA      # ( ᆮ → ᄃ ) HANGUL JONGSEONG TIKEUT → HANGUL CHOSEONG TIKEUT    # 
+
+1117 ; 1103 1100 ;     SA      # ( ᄗ → ᄃᄀ ) HANGUL CHOSEONG TIKEUT-KIYEOK → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG KIYEOK   # 
+11CA ; 1103 1100 ;     SA      # ( ᇊ → ᄃᄀ ) HANGUL JONGSEONG TIKEUT-KIYEOK → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG KIYEOK  # →ᄗ→
+
+1104 ; 1103 1103 ;     SA      # ( ᄄ → ᄃᄃ ) HANGUL CHOSEONG SSANGTIKEUT → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG TIKEUT     # 
+3138 ; 1103 1103 ;     SA      # ( ㄸ → ᄃᄃ ) HANGUL LETTER SSANGTIKEUT → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG TIKEUT       # →ᄄ→
+D7CD ; 1103 1103 ;     SA      # ( ퟍ → ᄃᄃ ) HANGUL JONGSEONG SSANGTIKEUT → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG TIKEUT    # →ᆮᆮ→
+
+D7CE ; 1103 1103 1107 ;        SA      # ( ퟎ → ᄃᄃᄇ ) HANGUL JONGSEONG SSANGTIKEUT-PIEUP → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG PIEUP    # →ᆮᆮᆸ→
+
+115E ; 1103 1105 ;     SA      # ( ᅞ → ᄃᄅ ) HANGUL CHOSEONG TIKEUT-RIEUL → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG RIEUL     # 
+11CB ; 1103 1105 ;     SA      # ( ᇋ → ᄃᄅ ) HANGUL JONGSEONG TIKEUT-RIEUL → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG RIEUL    # →ᆮᆯ→
+
+A960 ; 1103 1106 ;     SA      # ( ꥠ → ᄃᄆ ) HANGUL CHOSEONG TIKEUT-MIEUM → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG MIEUM     # 
+
+A961 ; 1103 1107 ;     SA      # ( ꥡ → ᄃᄇ ) HANGUL CHOSEONG TIKEUT-PIEUP → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG PIEUP     # 
+D7CF ; 1103 1107 ;     SA      # ( ퟏ → ᄃᄇ ) HANGUL JONGSEONG TIKEUT-PIEUP → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG PIEUP    # →ᆮᆸ→
+
+A962 ; 1103 1109 ;     SA      # ( ꥢ → ᄃᄉ ) HANGUL CHOSEONG TIKEUT-SIOS → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG SIOS       # 
+D7D0 ; 1103 1109 ;     SA      # ( ퟐ → ᄃᄉ ) HANGUL JONGSEONG TIKEUT-SIOS → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG SIOS      # →ᆮᆺ→
+
+D7D1 ; 1103 1109 1100 ;        SA      # ( ퟑ → ᄃᄉᄀ ) HANGUL JONGSEONG TIKEUT-SIOS-KIYEOK → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK    # →ᆮᆺᆨ→
+
+A963 ; 1103 110C ;     SA      # ( ꥣ → ᄃᄌ ) HANGUL CHOSEONG TIKEUT-CIEUC → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG CIEUC     # 
+D7D2 ; 1103 110C ;     SA      # ( ퟒ → ᄃᄌ ) HANGUL JONGSEONG TIKEUT-CIEUC → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG CIEUC    # →ᆮᆽ→
+
+D7D3 ; 1103 110E ;     SA      # ( ퟓ → ᄃᄎ ) HANGUL JONGSEONG TIKEUT-CHIEUCH → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG CHIEUCH        # →ᆮᆾ→
+
+D7D4 ; 1103 1110 ;     SA      # ( ퟔ → ᄃᄐ ) HANGUL JONGSEONG TIKEUT-THIEUTH → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG THIEUTH        # →ᆮᇀ→
+
+3139 ; 1105 ;  SA      # ( ㄹ → ᄅ ) HANGUL LETTER RIEUL → HANGUL CHOSEONG RIEUL # 
+11AF ; 1105 ;  SA      # ( ᆯ → ᄅ ) HANGUL JONGSEONG RIEUL → HANGUL CHOSEONG RIEUL      # 
+
+A964 ; 1105 1100 ;     SA      # ( ꥤ → ᄅᄀ ) HANGUL CHOSEONG RIEUL-KIYEOK → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK     # 
+11B0 ; 1105 1100 ;     SA      # ( ᆰ → ᄅᄀ ) HANGUL JONGSEONG RIEUL-KIYEOK → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK    # →ᆯᆨ→
+313A ; 1105 1100 ;     SA      # ( ㄺ → ᄅᄀ ) HANGUL LETTER RIEUL-KIYEOK → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK       # →ᆰ→→ᆯᆨ→
+
+A965 ; 1105 1100 1100 ;        SA      # ( ꥥ → ᄅᄀᄀ ) HANGUL CHOSEONG RIEUL-SSANGKIYEOK → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG KIYEOK     # 
+D7D5 ; 1105 1100 1100 ;        SA      # ( ퟕ → ᄅᄀᄀ ) HANGUL JONGSEONG RIEUL-SSANGKIYEOK → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG KIYEOK    # →ᆯᆨᆨ→
+
+11CC ; 1105 1100 1109 ;        SA      # ( ᇌ → ᄅᄀᄉ ) HANGUL JONGSEONG RIEUL-KIYEOK-SIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG SIOS      # →ᆯᆨᆺ→
+3169 ; 1105 1100 1109 ;        SA      # ( ㅩ → ᄅᄀᄉ ) HANGUL LETTER RIEUL-KIYEOK-SIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG SIOS # →ᇌ→→ᆯᆨᆺ→
+
+D7D6 ; 1105 1100 1112 ;        SA      # ( ퟖ → ᄅᄀᄒ ) HANGUL JONGSEONG RIEUL-KIYEOK-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG HIEUH    # →ᆯᆨᇂ→
+
+1118 ; 1105 1102 ;     SA      # ( ᄘ → ᄅᄂ ) HANGUL CHOSEONG RIEUL-NIEUN → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG NIEUN       # 
+11CD ; 1105 1102 ;     SA      # ( ᇍ → ᄅᄂ ) HANGUL JONGSEONG RIEUL-NIEUN → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG NIEUN      # →ᄘ→
+
+A966 ; 1105 1103 ;     SA      # ( ꥦ → ᄅᄃ ) HANGUL CHOSEONG RIEUL-TIKEUT → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG TIKEUT     # 
+11CE ; 1105 1103 ;     SA      # ( ᇎ → ᄅᄃ ) HANGUL JONGSEONG RIEUL-TIKEUT → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG TIKEUT    # →ᆯᆮ→
+316A ; 1105 1103 ;     SA      # ( ㅪ → ᄅᄃ ) HANGUL LETTER RIEUL-TIKEUT → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG TIKEUT       # →ᇎ→→ᆯᆮ→
+
+A967 ; 1105 1103 1103 ;        SA      # ( ꥧ → ᄅᄃᄃ ) HANGUL CHOSEONG RIEUL-SSANGTIKEUT → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG TIKEUT     # 
+
+11CF ; 1105 1103 1112 ;        SA      # ( ᇏ → ᄅᄃᄒ ) HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG HIEUH    # →ᆯᆮᇂ→
+
+1119 ; 1105 1105 ;     SA      # ( ᄙ → ᄅᄅ ) HANGUL CHOSEONG SSANGRIEUL → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG RIEUL        # 
+11D0 ; 1105 1105 ;     SA      # ( ᇐ → ᄅᄅ ) HANGUL JONGSEONG SSANGRIEUL → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG RIEUL       # →ᄙ→
+
+D7D7 ; 1105 1105 110F ;        SA      # ( ퟗ → ᄅᄅᄏ ) HANGUL JONGSEONG SSANGRIEUL-KHIEUKH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KHIEUKH   # →ᆯᆯᆿ→
+
+A968 ; 1105 1106 ;     SA      # ( ꥨ → ᄅᄆ ) HANGUL CHOSEONG RIEUL-MIEUM → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG MIEUM       # 
+11B1 ; 1105 1106 ;     SA      # ( ᆱ → ᄅᄆ ) HANGUL JONGSEONG RIEUL-MIEUM → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG MIEUM      # →ᆯᆷ→
+313B ; 1105 1106 ;     SA      # ( ㄻ → ᄅᄆ ) HANGUL LETTER RIEUL-MIEUM → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG MIEUM # →ᆱ→→ᆯᆷ→
+
+11D1 ; 1105 1106 1100 ;        SA      # ( ᇑ → ᄅᄆᄀ ) HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG KIYEOK    # →ᆯᆷᆨ→
+
+11D2 ; 1105 1106 1109 ;        SA      # ( ᇒ → ᄅᄆᄉ ) HANGUL JONGSEONG RIEUL-MIEUM-SIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG SIOS        # →ᆯᆷᆺ→
+
+D7D8 ; 1105 1106 1112 ;        SA      # ( ퟘ → ᄅᄆᄒ ) HANGUL JONGSEONG RIEUL-MIEUM-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG HIEUH      # →ᆯᆷᇂ→
+
+A969 ; 1105 1107 ;     SA      # ( ꥩ → ᄅᄇ ) HANGUL CHOSEONG RIEUL-PIEUP → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP       # 
+11B2 ; 1105 1107 ;     SA      # ( ᆲ → ᄅᄇ ) HANGUL JONGSEONG RIEUL-PIEUP → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP      # →ᆯᆸ→
+313C ; 1105 1107 ;     SA      # ( ㄼ → ᄅᄇ ) HANGUL LETTER RIEUL-PIEUP → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP # →ᆲ→→ᆯᆸ→
+
+D7D9 ; 1105 1107 1103 ;        SA      # ( ퟙ → ᄅᄇᄃ ) HANGUL JONGSEONG RIEUL-PIEUP-TIKEUT → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG TIKEUT    # →ᆯᆸᆮ→
+
+A96A ; 1105 1107 1107 ;        SA      # ( ꥪ → ᄅᄇᄇ ) HANGUL CHOSEONG RIEUL-SSANGPIEUP → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PIEUP        # 
+
+11D3 ; 1105 1107 1109 ;        SA      # ( ᇓ → ᄅᄇᄉ ) HANGUL JONGSEONG RIEUL-PIEUP-SIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS        # →ᆯᆸᆺ→
+316B ; 1105 1107 1109 ;        SA      # ( ㅫ → ᄅᄇᄉ ) HANGUL LETTER RIEUL-PIEUP-SIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS   # →ᇓ→→ᆯᆸᆺ→
+
+A96B ; 1105 1107 110B ;        SA      # ( ꥫ → ᄅᄇᄋ ) HANGUL CHOSEONG RIEUL-KAPYEOUNPIEUP → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG     # 
+11D5 ; 1105 1107 110B ;        SA      # ( ᇕ → ᄅᄇᄋ ) HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG    # →ᆯᆸᆼ→
+
+D7DA ; 1105 1107 1111 ;        SA      # ( ퟚ → ᄅᄇᄑ ) HANGUL JONGSEONG RIEUL-PIEUP-PHIEUPH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PHIEUPH  # →ᆯᆸᇁ→
+
+11D4 ; 1105 1107 1112 ;        SA      # ( ᇔ → ᄅᄇᄒ ) HANGUL JONGSEONG RIEUL-PIEUP-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG HIEUH      # →ᆯᆸᇂ→
+
+A96C ; 1105 1109 ;     SA      # ( ꥬ → ᄅᄉ ) HANGUL CHOSEONG RIEUL-SIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG SIOS # 
+11B3 ; 1105 1109 ;     SA      # ( ᆳ → ᄅᄉ ) HANGUL JONGSEONG RIEUL-SIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG SIOS        # →ᆯᆺ→
+313D ; 1105 1109 ;     SA      # ( ㄽ → ᄅᄉ ) HANGUL LETTER RIEUL-SIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG SIOS   # →ᆳ→→ᆯᆺ→
+
+11D6 ; 1105 1109 1109 ;        SA      # ( ᇖ → ᄅᄉᄉ ) HANGUL JONGSEONG RIEUL-SSANGSIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS  # →ᆯᆺᆺ→
+
+111B ; 1105 110B ;     SA      # ( ᄛ → ᄅᄋ ) HANGUL CHOSEONG KAPYEOUNRIEUL → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG IEUNG     # 
+D7DD ; 1105 110B ;     SA      # ( ퟝ → ᄅᄋ ) HANGUL JONGSEONG KAPYEOUNRIEUL → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG IEUNG    # →ᆯᆼ→
+
+A96D ; 1105 110C ;     SA      # ( ꥭ → ᄅᄌ ) HANGUL CHOSEONG RIEUL-CIEUC → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG CIEUC       # 
+
+A96E ; 1105 110F ;     SA      # ( ꥮ → ᄅᄏ ) HANGUL CHOSEONG RIEUL-KHIEUKH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KHIEUKH   # 
+11D8 ; 1105 110F ;     SA      # ( ᇘ → ᄅᄏ ) HANGUL JONGSEONG RIEUL-KHIEUKH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KHIEUKH  # →ᆯᆿ→
+
+11B4 ; 1105 1110 ;     SA      # ( ᆴ → ᄅᄐ ) HANGUL JONGSEONG RIEUL-THIEUTH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG THIEUTH  # →ᆯᇀ→
+313E ; 1105 1110 ;     SA      # ( ㄾ → ᄅᄐ ) HANGUL LETTER RIEUL-THIEUTH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG THIEUTH     # →ᆴ→→ᆯᇀ→
+
+11B5 ; 1105 1111 ;     SA      # ( ᆵ → ᄅᄑ ) HANGUL JONGSEONG RIEUL-PHIEUPH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PHIEUPH  # →ᆯᇁ→
+313F ; 1105 1111 ;     SA      # ( ㄿ → ᄅᄑ ) HANGUL LETTER RIEUL-PHIEUPH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PHIEUPH     # →ᆵ→→ᆯᇁ→
+
+111A ; 1105 1112 ;     SA      # ( ᄚ → ᄅᄒ ) HANGUL CHOSEONG RIEUL-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG HIEUH       # 
+3140 ; 1105 1112 ;     SA      # ( ㅀ → ᄅᄒ ) HANGUL LETTER RIEUL-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG HIEUH # →ᄚ→
+113B ; 1105 1112 ;     SA      # ( ᄻ → ᄅᄒ ) HANGUL CHOSEONG SIOS-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG HIEUH        # →ᄚ→
+11B6 ; 1105 1112 ;     SA      # ( ᆶ → ᄅᄒ ) HANGUL JONGSEONG RIEUL-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG HIEUH      # →ᄚ→
+D7F2 ; 1105 1112 ;     SA      # ( ퟲ → ᄅᄒ ) HANGUL JONGSEONG SIOS-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG HIEUH       # →ᆺᇂ→→ᄉᄒ→→ᄻ→→ᄚ→
+
+11D7 ; 1105 1140 ;     SA      # ( ᇗ → ᄅᅀ ) HANGUL JONGSEONG RIEUL-PANSIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PANSIOS  # →ᆯᇫ→
+316C ; 1105 1140 ;     SA      # ( ㅬ → ᄅᅀ ) HANGUL LETTER RIEUL-PANSIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PANSIOS     # →ᇗ→→ᆯᇫ→
+
+D7DB ; 1105 114C ;     SA      # ( ퟛ → ᄅᅌ ) HANGUL JONGSEONG RIEUL-YESIEUNG → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG YESIEUNG        # →ᆯᇰ→
+
+11D9 ; 1105 1159 ;     SA      # ( ᇙ → ᄅᅙ ) HANGUL JONGSEONG RIEUL-YEORINHIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG YEORINHIEUH  # →ᆯᇹ→
+316D ; 1105 1159 ;     SA      # ( ㅭ → ᄅᅙ ) HANGUL LETTER RIEUL-YEORINHIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG YEORINHIEUH     # →ᇙ→→ᆯᇹ→
+
+D7DC ; 1105 1159 1112 ;        SA      # ( ퟜ → ᄅᅙᄒ ) HANGUL JONGSEONG RIEUL-YEORINHIEUH-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG YEORINHIEUH, HANGUL CHOSEONG HIEUH  # →ᆯᇹᇂ→
+
+3141 ; 1106 ;  SA      # ( ㅁ → ᄆ ) HANGUL LETTER MIEUM → HANGUL CHOSEONG MIEUM # 
+11B7 ; 1106 ;  SA      # ( ᆷ → ᄆ ) HANGUL JONGSEONG MIEUM → HANGUL CHOSEONG MIEUM      # 
+
+A96F ; 1106 1100 ;     SA      # ( ꥯ → ᄆᄀ ) HANGUL CHOSEONG MIEUM-KIYEOK → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG KIYEOK     # 
+11DA ; 1106 1100 ;     SA      # ( ᇚ → ᄆᄀ ) HANGUL JONGSEONG MIEUM-KIYEOK → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG KIYEOK    # →ᆷᆨ→
+
+D7DE ; 1106 1102 ;     SA      # ( ퟞ → ᄆᄂ ) HANGUL JONGSEONG MIEUM-NIEUN → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG NIEUN      # →ᆷᆫ→
+
+D7DF ; 1106 1102 1102 ;        SA      # ( ퟟ → ᄆᄂᄂ ) HANGUL JONGSEONG MIEUM-SSANGNIEUN → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG NIEUN       # →ᆷᆫᆫ→
+
+A970 ; 1106 1103 ;     SA      # ( ꥰ → ᄆᄃ ) HANGUL CHOSEONG MIEUM-TIKEUT → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG TIKEUT     # 
+
+11DB ; 1106 1105 ;     SA      # ( ᇛ → ᄆᄅ ) HANGUL JONGSEONG MIEUM-RIEUL → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG RIEUL      # →ᆷᆯ→
+
+D7E0 ; 1106 1106 ;     SA      # ( ퟠ → ᄆᄆ ) HANGUL JONGSEONG SSANGMIEUM → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG MIEUM       # →ᆷᆷ→
+
+111C ; 1106 1107 ;     SA      # ( ᄜ → ᄆᄇ ) HANGUL CHOSEONG MIEUM-PIEUP → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG PIEUP       # 
+316E ; 1106 1107 ;     SA      # ( ㅮ → ᄆᄇ ) HANGUL LETTER MIEUM-PIEUP → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG PIEUP # →ᄜ→
+11DC ; 1106 1107 ;     SA      # ( ᇜ → ᄆᄇ ) HANGUL JONGSEONG MIEUM-PIEUP → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG PIEUP      # →ᄜ→
+
+D7E1 ; 1106 1107 1109 ;        SA      # ( ퟡ → ᄆᄇᄉ ) HANGUL JONGSEONG MIEUM-PIEUP-SIOS → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS        # →ᆷᆸᆺ→
+
+A971 ; 1106 1109 ;     SA      # ( ꥱ → ᄆᄉ ) HANGUL CHOSEONG MIEUM-SIOS → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG SIOS # 
+11DD ; 1106 1109 ;     SA      # ( ᇝ → ᄆᄉ ) HANGUL JONGSEONG MIEUM-SIOS → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG SIOS        # →ᆷᆺ→
+316F ; 1106 1109 ;     SA      # ( ㅯ → ᄆᄉ ) HANGUL LETTER MIEUM-SIOS → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG SIOS   # →ᇝ→→ᆷᆺ→
+
+11DE ; 1106 1109 1109 ;        SA      # ( ᇞ → ᄆᄉᄉ ) HANGUL JONGSEONG MIEUM-SSANGSIOS → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS  # →ᆷᆺᆺ→
+
+111D ; 1106 110B ;     SA      # ( ᄝ → ᄆᄋ ) HANGUL CHOSEONG KAPYEOUNMIEUM → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG IEUNG     # 
+3171 ; 1106 110B ;     SA      # ( ㅱ → ᄆᄋ ) HANGUL LETTER KAPYEOUNMIEUM → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG IEUNG       # →ᄝ→
+11E2 ; 1106 110B ;     SA      # ( ᇢ → ᄆᄋ ) HANGUL JONGSEONG KAPYEOUNMIEUM → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG IEUNG    # →ᄝ→
+
+D7E2 ; 1106 110C ;     SA      # ( ퟢ → ᄆᄌ ) HANGUL JONGSEONG MIEUM-CIEUC → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG CIEUC      # →ᆷᆽ→
+
+11E0 ; 1106 110E ;     SA      # ( ᇠ → ᄆᄎ ) HANGUL JONGSEONG MIEUM-CHIEUCH → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG CHIEUCH  # →ᆷᆾ→
+
+11E1 ; 1106 1112 ;     SA      # ( ᇡ → ᄆᄒ ) HANGUL JONGSEONG MIEUM-HIEUH → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG HIEUH      # →ᆷᇂ→
+
+11DF ; 1106 1140 ;     SA      # ( ᇟ → ᄆᅀ ) HANGUL JONGSEONG MIEUM-PANSIOS → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG PANSIOS  # →ᆷᇫ→
+3170 ; 1106 1140 ;     SA      # ( ㅰ → ᄆᅀ ) HANGUL LETTER MIEUM-PANSIOS → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG PANSIOS     # →ᇟ→→ᆷᇫ→
+
+3142 ; 1107 ;  SA      # ( ㅂ → ᄇ ) HANGUL LETTER PIEUP → HANGUL CHOSEONG PIEUP # 
+11B8 ; 1107 ;  SA      # ( ᆸ → ᄇ ) HANGUL JONGSEONG PIEUP → HANGUL CHOSEONG PIEUP      # 
+
+111E ; 1107 1100 ;     SA      # ( ᄞ → ᄇᄀ ) HANGUL CHOSEONG PIEUP-KIYEOK → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG KIYEOK     # 
+3172 ; 1107 1100 ;     SA      # ( ㅲ → ᄇᄀ ) HANGUL LETTER PIEUP-KIYEOK → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG KIYEOK       # →ᄞ→
+
+111F ; 1107 1102 ;     SA      # ( ᄟ → ᄇᄂ ) HANGUL CHOSEONG PIEUP-NIEUN → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG NIEUN       # 
+
+1120 ; 1107 1103 ;     SA      # ( ᄠ → ᄇᄃ ) HANGUL CHOSEONG PIEUP-TIKEUT → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG TIKEUT     # 
+3173 ; 1107 1103 ;     SA      # ( ㅳ → ᄇᄃ ) HANGUL LETTER PIEUP-TIKEUT → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG TIKEUT       # →ᄠ→
+D7E3 ; 1107 1103 ;     SA      # ( ퟣ → ᄇᄃ ) HANGUL JONGSEONG PIEUP-TIKEUT → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG TIKEUT    # →ᆸᆮ→
+
+11E3 ; 1107 1105 ;     SA      # ( ᇣ → ᄇᄅ ) HANGUL JONGSEONG PIEUP-RIEUL → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG RIEUL      # →ᆸᆯ→
+
+D7E4 ; 1107 1105 1111 ;        SA      # ( ퟤ → ᄇᄅᄑ ) HANGUL JONGSEONG PIEUP-RIEUL-PHIEUPH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PHIEUPH  # →ᆸᆯᇁ→
+
+D7E5 ; 1107 1106 ;     SA      # ( ퟥ → ᄇᄆ ) HANGUL JONGSEONG PIEUP-MIEUM → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG MIEUM      # →ᆸᆷ→
+
+1108 ; 1107 1107 ;     SA      # ( ᄈ → ᄇᄇ ) HANGUL CHOSEONG SSANGPIEUP → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PIEUP        # 
+3143 ; 1107 1107 ;     SA      # ( ㅃ → ᄇᄇ ) HANGUL LETTER SSANGPIEUP → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PIEUP  # →ᄈ→
+D7E6 ; 1107 1107 ;     SA      # ( ퟦ → ᄇᄇ ) HANGUL JONGSEONG SSANGPIEUP → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PIEUP       # →ᆸᆸ→
+
+112C ; 1107 1107 110B ;        SA      # ( ᄬ → ᄇᄇᄋ ) HANGUL CHOSEONG KAPYEOUNSSANGPIEUP → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG      # 
+3179 ; 1107 1107 110B ;        SA      # ( ㅹ → ᄇᄇᄋ ) HANGUL LETTER KAPYEOUNSSANGPIEUP → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG        # →ᄬ→
+
+1121 ; 1107 1109 ;     SA      # ( ᄡ → ᄇᄉ ) HANGUL CHOSEONG PIEUP-SIOS → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS # 
+3144 ; 1107 1109 ;     SA      # ( ㅄ → ᄇᄉ ) HANGUL LETTER PIEUP-SIOS → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS   # →ᄡ→
+11B9 ; 1107 1109 ;     SA      # ( ᆹ → ᄇᄉ ) HANGUL JONGSEONG PIEUP-SIOS → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS        # →ᄡ→
+
+1122 ; 1107 1109 1100 ;        SA      # ( ᄢ → ᄇᄉᄀ ) HANGUL CHOSEONG PIEUP-SIOS-KIYEOK → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK       # 
+3174 ; 1107 1109 1100 ;        SA      # ( ㅴ → ᄇᄉᄀ ) HANGUL LETTER PIEUP-SIOS-KIYEOK → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK # →ᄢ→
+
+1123 ; 1107 1109 1103 ;        SA      # ( ᄣ → ᄇᄉᄃ ) HANGUL CHOSEONG PIEUP-SIOS-TIKEUT → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG TIKEUT       # 
+3175 ; 1107 1109 1103 ;        SA      # ( ㅵ → ᄇᄉᄃ ) HANGUL LETTER PIEUP-SIOS-TIKEUT → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG TIKEUT # →ᄣ→
+D7E7 ; 1107 1109 1103 ;        SA      # ( ퟧ → ᄇᄉᄃ ) HANGUL JONGSEONG PIEUP-SIOS-TIKEUT → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG TIKEUT      # →ᆸᆺᆮ→
+
+1124 ; 1107 1109 1107 ;        SA      # ( ᄤ → ᄇᄉᄇ ) HANGUL CHOSEONG PIEUP-SIOS-PIEUP → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PIEUP # 
+
+1125 ; 1107 1109 1109 ;        SA      # ( ᄥ → ᄇᄉᄉ ) HANGUL CHOSEONG PIEUP-SSANGSIOS → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS   # 
+
+1126 ; 1107 1109 110C ;        SA      # ( ᄦ → ᄇᄉᄌ ) HANGUL CHOSEONG PIEUP-SIOS-CIEUC → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG CIEUC # 
+
+A972 ; 1107 1109 1110 ;        SA      # ( ꥲ → ᄇᄉᄐ ) HANGUL CHOSEONG PIEUP-SIOS-THIEUTH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG THIEUTH     # 
+
+112B ; 1107 110B ;     SA      # ( ᄫ → ᄇᄋ ) HANGUL CHOSEONG KAPYEOUNPIEUP → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG     # 
+3178 ; 1107 110B ;     SA      # ( ㅸ → ᄇᄋ ) HANGUL LETTER KAPYEOUNPIEUP → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG       # →ᄫ→
+11E6 ; 1107 110B ;     SA      # ( ᇦ → ᄇᄋ ) HANGUL JONGSEONG KAPYEOUNPIEUP → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG    # →ᄫ→
+
+1127 ; 1107 110C ;     SA      # ( ᄧ → ᄇᄌ ) HANGUL CHOSEONG PIEUP-CIEUC → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG CIEUC       # 
+3176 ; 1107 110C ;     SA      # ( ㅶ → ᄇᄌ ) HANGUL LETTER PIEUP-CIEUC → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG CIEUC # →ᄧ→
+D7E8 ; 1107 110C ;     SA      # ( ퟨ → ᄇᄌ ) HANGUL JONGSEONG PIEUP-CIEUC → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG CIEUC      # →ᆸᆽ→
+
+1128 ; 1107 110E ;     SA      # ( ᄨ → ᄇᄎ ) HANGUL CHOSEONG PIEUP-CHIEUCH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG CHIEUCH   # 
+D7E9 ; 1107 110E ;     SA      # ( ퟩ → ᄇᄎ ) HANGUL JONGSEONG PIEUP-CHIEUCH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG CHIEUCH  # →ᆸᆾ→
+
+A973 ; 1107 110F ;     SA      # ( ꥳ → ᄇᄏ ) HANGUL CHOSEONG PIEUP-KHIEUKH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG KHIEUKH   # 
+
+1129 ; 1107 1110 ;     SA      # ( ᄩ → ᄇᄐ ) HANGUL CHOSEONG PIEUP-THIEUTH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG THIEUTH   # 
+3177 ; 1107 1110 ;     SA      # ( ㅷ → ᄇᄐ ) HANGUL LETTER PIEUP-THIEUTH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG THIEUTH     # →ᄩ→
+
+112A ; 1107 1111 ;     SA      # ( ᄪ → ᄇᄑ ) HANGUL CHOSEONG PIEUP-PHIEUPH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PHIEUPH   # 
+11E4 ; 1107 1111 ;     SA      # ( ᇤ → ᄇᄑ ) HANGUL JONGSEONG PIEUP-PHIEUPH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PHIEUPH  # →ᆸᇁ→
+
+A974 ; 1107 1112 ;     SA      # ( ꥴ → ᄇᄒ ) HANGUL CHOSEONG PIEUP-HIEUH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG HIEUH       # 
+11E5 ; 1107 1112 ;     SA      # ( ᇥ → ᄇᄒ ) HANGUL JONGSEONG PIEUP-HIEUH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG HIEUH      # →ᆸᇂ→
+
+3145 ; 1109 ;  SA      # ( ㅅ → ᄉ ) HANGUL LETTER SIOS → HANGUL CHOSEONG SIOS   # 
+11BA ; 1109 ;  SA      # ( ᆺ → ᄉ ) HANGUL JONGSEONG SIOS → HANGUL CHOSEONG SIOS        # 
+
+112D ; 1109 1100 ;     SA      # ( ᄭ → ᄉᄀ ) HANGUL CHOSEONG SIOS-KIYEOK → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK       # 
+317A ; 1109 1100 ;     SA      # ( ㅺ → ᄉᄀ ) HANGUL LETTER SIOS-KIYEOK → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK # →ᄭ→
+11E7 ; 1109 1100 ;     SA      # ( ᇧ → ᄉᄀ ) HANGUL JONGSEONG SIOS-KIYEOK → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK      # →ᄭ→
+
+112E ; 1109 1102 ;     SA      # ( ᄮ → ᄉᄂ ) HANGUL CHOSEONG SIOS-NIEUN → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG NIEUN # 
+317B ; 1109 1102 ;     SA      # ( ㅻ → ᄉᄂ ) HANGUL LETTER SIOS-NIEUN → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG NIEUN   # →ᄮ→
+
+112F ; 1109 1103 ;     SA      # ( ᄯ → ᄉᄃ ) HANGUL CHOSEONG SIOS-TIKEUT → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG TIKEUT       # 
+317C ; 1109 1103 ;     SA      # ( ㅼ → ᄉᄃ ) HANGUL LETTER SIOS-TIKEUT → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG TIKEUT # →ᄯ→
+11E8 ; 1109 1103 ;     SA      # ( ᇨ → ᄉᄃ ) HANGUL JONGSEONG SIOS-TIKEUT → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG TIKEUT      # →ᄯ→
+
+1130 ; 1109 1105 ;     SA      # ( ᄰ → ᄉᄅ ) HANGUL CHOSEONG SIOS-RIEUL → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG RIEUL # 
+11E9 ; 1109 1105 ;     SA      # ( ᇩ → ᄉᄅ ) HANGUL JONGSEONG SIOS-RIEUL → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG RIEUL        # →ᄰ→
+
+1131 ; 1109 1106 ;     SA      # ( ᄱ → ᄉᄆ ) HANGUL CHOSEONG SIOS-MIEUM → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG MIEUM # 
+D7EA ; 1109 1106 ;     SA      # ( ퟪ → ᄉᄆ ) HANGUL JONGSEONG SIOS-MIEUM → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG MIEUM        # →ᆺᆷ→
+
+1132 ; 1109 1107 ;     SA      # ( ᄲ → ᄉᄇ ) HANGUL CHOSEONG SIOS-PIEUP → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PIEUP # 
+317D ; 1109 1107 ;     SA      # ( ㅽ → ᄉᄇ ) HANGUL LETTER SIOS-PIEUP → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PIEUP   # →ᄲ→
+11EA ; 1109 1107 ;     SA      # ( ᇪ → ᄉᄇ ) HANGUL JONGSEONG SIOS-PIEUP → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PIEUP        # →ᄲ→
+
+1133 ; 1109 1107 1100 ;        SA      # ( ᄳ → ᄉᄇᄀ ) HANGUL CHOSEONG SIOS-PIEUP-KIYEOK → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG KIYEOK       # 
+
+D7EB ; 1109 1107 110B ;        SA      # ( ퟫ → ᄉᄇᄋ ) HANGUL JONGSEONG SIOS-KAPYEOUNPIEUP → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG      # →ᆺᆸᆼ→
+
+110A ; 1109 1109 ;     SA      # ( ᄊ → ᄉᄉ ) HANGUL CHOSEONG SSANGSIOS → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS   # 
+3146 ; 1109 1109 ;     SA      # ( ㅆ → ᄉᄉ ) HANGUL LETTER SSANGSIOS → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS     # →ᄊ→
+11BB ; 1109 1109 ;     SA      # ( ᆻ → ᄉᄉ ) HANGUL JONGSEONG SSANGSIOS → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS  # →ᄊ→
+
+D7EC ; 1109 1109 1100 ;        SA      # ( ퟬ → ᄉᄉᄀ ) HANGUL JONGSEONG SSANGSIOS-KIYEOK → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK        # →ᆺᆺᆨ→
+
+D7ED ; 1109 1109 1103 ;        SA      # ( ퟭ → ᄉᄉᄃ ) HANGUL JONGSEONG SSANGSIOS-TIKEUT → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG TIKEUT        # →ᆺᆺᆮ→
+
+A975 ; 1109 1109 1107 ;        SA      # ( ꥵ → ᄉᄉᄇ ) HANGUL CHOSEONG SSANGSIOS-PIEUP → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PIEUP   # 
+
+1134 ; 1109 1109 1109 ;        SA      # ( ᄴ → ᄉᄉᄉ ) HANGUL CHOSEONG SIOS-SSANGSIOS → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS     # 
+
+1135 ; 1109 110B ;     SA      # ( ᄵ → ᄉᄋ ) HANGUL CHOSEONG SIOS-IEUNG → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG IEUNG # 
+
+1136 ; 1109 110C ;     SA      # ( ᄶ → ᄉᄌ ) HANGUL CHOSEONG SIOS-CIEUC → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG CIEUC # 
+317E ; 1109 110C ;     SA      # ( ㅾ → ᄉᄌ ) HANGUL LETTER SIOS-CIEUC → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG CIEUC   # →ᄶ→
+D7EF ; 1109 110C ;     SA      # ( ퟯ → ᄉᄌ ) HANGUL JONGSEONG SIOS-CIEUC → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG CIEUC        # →ᆺᆽ→
+
+1137 ; 1109 110E ;     SA      # ( ᄷ → ᄉᄎ ) HANGUL CHOSEONG SIOS-CHIEUCH → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG CHIEUCH     # 
+D7F0 ; 1109 110E ;     SA      # ( ퟰ → ᄉᄎ ) HANGUL JONGSEONG SIOS-CHIEUCH → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG CHIEUCH    # →ᆺᆾ→
+
+1138 ; 1109 110F ;     SA      # ( ᄸ → ᄉᄏ ) HANGUL CHOSEONG SIOS-KHIEUKH → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KHIEUKH     # 
+
+1139 ; 1109 1110 ;     SA      # ( ᄹ → ᄉᄐ ) HANGUL CHOSEONG SIOS-THIEUTH → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG THIEUTH     # 
+D7F1 ; 1109 1110 ;     SA      # ( ퟱ → ᄉᄐ ) HANGUL JONGSEONG SIOS-THIEUTH → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG THIEUTH    # →ᆺᇀ→
+
+113A ; 1109 1111 ;     SA      # ( ᄺ → ᄉᄑ ) HANGUL CHOSEONG SIOS-PHIEUPH → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PHIEUPH     # 
+
+D7EE ; 1109 1140 ;     SA      # ( ퟮ → ᄉᅀ ) HANGUL JONGSEONG SIOS-PANSIOS → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PANSIOS    # →ᆺᇫ→
+
+3147 ; 110B ;  SA      # ( ㅇ → ᄋ ) HANGUL LETTER IEUNG → HANGUL CHOSEONG IEUNG # 
+11BC ; 110B ;  SA      # ( ᆼ → ᄋ ) HANGUL JONGSEONG IEUNG → HANGUL CHOSEONG IEUNG      # 
+
+1141 ; 110B 1100 ;     SA      # ( ᅁ → ᄋᄀ ) HANGUL CHOSEONG IEUNG-KIYEOK → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG KIYEOK     # 
+11EC ; 110B 1100 ;     SA      # ( ᇬ → ᄋᄀ ) HANGUL JONGSEONG IEUNG-KIYEOK → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG KIYEOK    # →ᅁ→
+
+11ED ; 110B 1100 1100 ;        SA      # ( ᇭ → ᄋᄀᄀ ) HANGUL JONGSEONG IEUNG-SSANGKIYEOK → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG KIYEOK    # →ᆼᆨᆨ→
+
+1142 ; 110B 1103 ;     SA      # ( ᅂ → ᄋᄃ ) HANGUL CHOSEONG IEUNG-TIKEUT → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG TIKEUT     # 
+
+A976 ; 110B 1105 ;     SA      # ( ꥶ → ᄋᄅ ) HANGUL CHOSEONG IEUNG-RIEUL → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG RIEUL       # 
+
+1143 ; 110B 1106 ;     SA      # ( ᅃ → ᄋᄆ ) HANGUL CHOSEONG IEUNG-MIEUM → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG MIEUM       # 
+
+1144 ; 110B 1107 ;     SA      # ( ᅄ → ᄋᄇ ) HANGUL CHOSEONG IEUNG-PIEUP → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG PIEUP       # 
+
+1145 ; 110B 1109 ;     SA      # ( ᅅ → ᄋᄉ ) HANGUL CHOSEONG IEUNG-SIOS → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG SIOS # 
+11F1 ; 110B 1109 ;     SA      # ( ᇱ → ᄋᄉ ) HANGUL JONGSEONG YESIEUNG-SIOS → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG SIOS     # →ᅅ→
+3182 ; 110B 1109 ;     SA      # ( ㆂ → ᄋᄉ ) HANGUL LETTER YESIEUNG-SIOS → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG SIOS        # →ᇱ→→ᅅ→
+
+1147 ; 110B 110B ;     SA      # ( ᅇ → ᄋᄋ ) HANGUL CHOSEONG SSANGIEUNG → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG IEUNG        # 
+3180 ; 110B 110B ;     SA      # ( ㆀ → ᄋᄋ ) HANGUL LETTER SSANGIEUNG → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG IEUNG  # →ᅇ→
+11EE ; 110B 110B ;     SA      # ( ᇮ → ᄋᄋ ) HANGUL JONGSEONG SSANGIEUNG → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG IEUNG       # →ᅇ→
+
+1148 ; 110B 110C ;     SA      # ( ᅈ → ᄋᄌ ) HANGUL CHOSEONG IEUNG-CIEUC → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG CIEUC       # 
+
+1149 ; 110B 110E ;     SA      # ( ᅉ → ᄋᄎ ) HANGUL CHOSEONG IEUNG-CHIEUCH → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG CHIEUCH   # 
+
+11EF ; 110B 110F ;     SA      # ( ᇯ → ᄋᄏ ) HANGUL JONGSEONG IEUNG-KHIEUKH → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG KHIEUKH  # →ᆼᆿ→
+
+114A ; 110B 1110 ;     SA      # ( ᅊ → ᄋᄐ ) HANGUL CHOSEONG IEUNG-THIEUTH → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG THIEUTH   # 
+
+114B ; 110B 1111 ;     SA      # ( ᅋ → ᄋᄑ ) HANGUL CHOSEONG IEUNG-PHIEUPH → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG PHIEUPH   # 
+
+A977 ; 110B 1112 ;     SA      # ( ꥷ → ᄋᄒ ) HANGUL CHOSEONG IEUNG-HIEUH → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG HIEUH       # 
+
+1146 ; 110B 1140 ;     SA      # ( ᅆ → ᄋᅀ ) HANGUL CHOSEONG IEUNG-PANSIOS → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG PANSIOS   # 
+11F2 ; 110B 1140 ;     SA      # ( ᇲ → ᄋᅀ ) HANGUL JONGSEONG YESIEUNG-PANSIOS → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG PANSIOS       # →ᅆ→
+3183 ; 110B 1140 ;     SA      # ( ㆃ → ᄋᅀ ) HANGUL LETTER YESIEUNG-PANSIOS → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG PANSIOS  # →ᇲ→→ᅆ→
+
+3148 ; 110C ;  SA      # ( ㅈ → ᄌ ) HANGUL LETTER CIEUC → HANGUL CHOSEONG CIEUC # 
+11BD ; 110C ;  SA      # ( ᆽ → ᄌ ) HANGUL JONGSEONG CIEUC → HANGUL CHOSEONG CIEUC      # 
+
+D7F7 ; 110C 1107 ;     SA      # ( ퟷ → ᄌᄇ ) HANGUL JONGSEONG CIEUC-PIEUP → HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG PIEUP      # →ᆽᆸ→
+
+D7F8 ; 110C 1107 1107 ;        SA      # ( ퟸ → ᄌᄇᄇ ) HANGUL JONGSEONG CIEUC-SSANGPIEUP → HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PIEUP       # →ᆽᆸᆸ→
+
+114D ; 110C 110B ;     SA      # ( ᅍ → ᄌᄋ ) HANGUL CHOSEONG CIEUC-IEUNG → HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG IEUNG       # 
+
+110D ; 110C 110C ;     SA      # ( ᄍ → ᄌᄌ ) HANGUL CHOSEONG SSANGCIEUC → HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG CIEUC        # 
+3149 ; 110C 110C ;     SA      # ( ㅉ → ᄌᄌ ) HANGUL LETTER SSANGCIEUC → HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG CIEUC  # →ᄍ→
+D7F9 ; 110C 110C ;     SA      # ( ퟹ → ᄌᄌ ) HANGUL JONGSEONG SSANGCIEUC → HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG CIEUC       # →ᆽᆽ→
+
+A978 ; 110C 110C 1112 ;        SA      # ( ꥸ → ᄌᄌᄒ ) HANGUL CHOSEONG SSANGCIEUC-HIEUH → HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG HIEUH        # 
+
+314A ; 110E ;  SA      # ( ㅊ → ᄎ ) HANGUL LETTER CHIEUCH → HANGUL CHOSEONG CHIEUCH     # 
+11BE ; 110E ;  SA      # ( ᆾ → ᄎ ) HANGUL JONGSEONG CHIEUCH → HANGUL CHOSEONG CHIEUCH  # 
+
+1152 ; 110E 110F ;     SA      # ( ᅒ → ᄎᄏ ) HANGUL CHOSEONG CHIEUCH-KHIEUKH → HANGUL CHOSEONG CHIEUCH, HANGUL CHOSEONG KHIEUKH       # 
+
+1153 ; 110E 1112 ;     SA      # ( ᅓ → ᄎᄒ ) HANGUL CHOSEONG CHIEUCH-HIEUH → HANGUL CHOSEONG CHIEUCH, HANGUL CHOSEONG HIEUH   # 
+
+314B ; 110F ;  SA      # ( ㅋ → ᄏ ) HANGUL LETTER KHIEUKH → HANGUL CHOSEONG KHIEUKH     # 
+11BF ; 110F ;  SA      # ( ᆿ → ᄏ ) HANGUL JONGSEONG KHIEUKH → HANGUL CHOSEONG KHIEUKH  # 
+
+314C ; 1110 ;  SA      # ( ㅌ → ᄐ ) HANGUL LETTER THIEUTH → HANGUL CHOSEONG THIEUTH     # 
+11C0 ; 1110 ;  SA      # ( ᇀ → ᄐ ) HANGUL JONGSEONG THIEUTH → HANGUL CHOSEONG THIEUTH  # 
+
+A979 ; 1110 1110 ;     SA      # ( ꥹ → ᄐᄐ ) HANGUL CHOSEONG SSANGTHIEUTH → HANGUL CHOSEONG THIEUTH, HANGUL CHOSEONG THIEUTH  # 
+
+314D ; 1111 ;  SA      # ( ㅍ → ᄑ ) HANGUL LETTER PHIEUPH → HANGUL CHOSEONG PHIEUPH     # 
+11C1 ; 1111 ;  SA      # ( ᇁ → ᄑ ) HANGUL JONGSEONG PHIEUPH → HANGUL CHOSEONG PHIEUPH  # 
+
+1156 ; 1111 1107 ;     SA      # ( ᅖ → ᄑᄇ ) HANGUL CHOSEONG PHIEUPH-PIEUP → HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG PIEUP   # 
+11F3 ; 1111 1107 ;     SA      # ( ᇳ → ᄑᄇ ) HANGUL JONGSEONG PHIEUPH-PIEUP → HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG PIEUP  # →ᅖ→
+
+D7FA ; 1111 1109 ;     SA      # ( ퟺ → ᄑᄉ ) HANGUL JONGSEONG PHIEUPH-SIOS → HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG SIOS    # →ᇁᆺ→
+
+1157 ; 1111 110B ;     SA      # ( ᅗ → ᄑᄋ ) HANGUL CHOSEONG KAPYEOUNPHIEUPH → HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG IEUNG # 
+3184 ; 1111 110B ;     SA      # ( ㆄ → ᄑᄋ ) HANGUL LETTER KAPYEOUNPHIEUPH → HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG IEUNG   # →ᅗ→
+11F4 ; 1111 110B ;     SA      # ( ᇴ → ᄑᄋ ) HANGUL JONGSEONG KAPYEOUNPHIEUPH → HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG IEUNG        # →ᅗ→
+
+D7FB ; 1111 1110 ;     SA      # ( ퟻ → ᄑᄐ ) HANGUL JONGSEONG PHIEUPH-THIEUTH → HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG THIEUTH      # →ᇁᇀ→
+
+A97A ; 1111 1112 ;     SA      # ( ꥺ → ᄑᄒ ) HANGUL CHOSEONG PHIEUPH-HIEUH → HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG HIEUH   # 
+
+314E ; 1112 ;  SA      # ( ㅎ → ᄒ ) HANGUL LETTER HIEUH → HANGUL CHOSEONG HIEUH # 
+11C2 ; 1112 ;  SA      # ( ᇂ → ᄒ ) HANGUL JONGSEONG HIEUH → HANGUL CHOSEONG HIEUH      # 
+
+11F5 ; 1112 1102 ;     SA      # ( ᇵ → ᄒᄂ ) HANGUL JONGSEONG HIEUH-NIEUN → HANGUL CHOSEONG HIEUH, HANGUL CHOSEONG NIEUN      # →ᇂᆫ→
+
+11F6 ; 1112 1105 ;     SA      # ( ᇶ → ᄒᄅ ) HANGUL JONGSEONG HIEUH-RIEUL → HANGUL CHOSEONG HIEUH, HANGUL CHOSEONG RIEUL      # →ᇂᆯ→
+
+11F7 ; 1112 1106 ;     SA      # ( ᇷ → ᄒᄆ ) HANGUL JONGSEONG HIEUH-MIEUM → HANGUL CHOSEONG HIEUH, HANGUL CHOSEONG MIEUM      # →ᇂᆷ→
+
+11F8 ; 1112 1107 ;     SA      # ( ᇸ → ᄒᄇ ) HANGUL JONGSEONG HIEUH-PIEUP → HANGUL CHOSEONG HIEUH, HANGUL CHOSEONG PIEUP      # →ᇂᆸ→
+
+A97B ; 1112 1109 ;     SA      # ( ꥻ → ᄒᄉ ) HANGUL CHOSEONG HIEUH-SIOS → HANGUL CHOSEONG HIEUH, HANGUL CHOSEONG SIOS # 
+
+1158 ; 1112 1112 ;     SA      # ( ᅘ → ᄒᄒ ) HANGUL CHOSEONG SSANGHIEUH → HANGUL CHOSEONG HIEUH, HANGUL CHOSEONG HIEUH        # 
+3185 ; 1112 1112 ;     SA      # ( ㆅ → ᄒᄒ ) HANGUL LETTER SSANGHIEUH → HANGUL CHOSEONG HIEUH, HANGUL CHOSEONG HIEUH  # →ᅘ→
+
+113D ; 113C 113C ;     SA      # ( ᄽ → ᄼᄼ ) HANGUL CHOSEONG CHITUEUMSSANGSIOS → HANGUL CHOSEONG CHITUEUMSIOS, HANGUL CHOSEONG CHITUEUMSIOS   # 
+
+113F ; 113E 113E ;     SA      # ( ᄿ → ᄾᄾ ) HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS → HANGUL CHOSEONG CEONGCHIEUMSIOS, HANGUL CHOSEONG CEONGCHIEUMSIOS  # 
+
+317F ; 1140 ;  SA      # ( ㅿ → ᅀ ) HANGUL LETTER PANSIOS → HANGUL CHOSEONG PANSIOS     # 
+11EB ; 1140 ;  SA      # ( ᇫ → ᅀ ) HANGUL JONGSEONG PANSIOS → HANGUL CHOSEONG PANSIOS  # 
+
+D7F3 ; 1140 1107 ;     SA      # ( ퟳ → ᅀᄇ ) HANGUL JONGSEONG PANSIOS-PIEUP → HANGUL CHOSEONG PANSIOS, HANGUL CHOSEONG PIEUP  # →ᇫᆸ→
+
+D7F4 ; 1140 1107 110B ;        SA      # ( ퟴ → ᅀᄇᄋ ) HANGUL JONGSEONG PANSIOS-KAPYEOUNPIEUP → HANGUL CHOSEONG PANSIOS, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG        # →ᇫᆸᆼ→
+
+3181 ; 114C ;  SA      # ( ㆁ → ᅌ ) HANGUL LETTER YESIEUNG → HANGUL CHOSEONG YESIEUNG   # 
+11F0 ; 114C ;  SA      # ( ᇰ → ᅌ ) HANGUL JONGSEONG YESIEUNG → HANGUL CHOSEONG YESIEUNG        # 
+
+D7F5 ; 114C 1106 ;     SA      # ( ퟵ → ᅌᄆ ) HANGUL JONGSEONG YESIEUNG-MIEUM → HANGUL CHOSEONG YESIEUNG, HANGUL CHOSEONG MIEUM        # →ᇰᆷ→
+
+D7F6 ; 114C 1112 ;     SA      # ( ퟶ → ᅌᄒ ) HANGUL JONGSEONG YESIEUNG-HIEUH → HANGUL CHOSEONG YESIEUNG, HANGUL CHOSEONG HIEUH        # →ᇰᇂ→
+
+114F ; 114E 114E ;     SA      # ( ᅏ → ᅎᅎ ) HANGUL CHOSEONG CHITUEUMSSANGCIEUC → HANGUL CHOSEONG CHITUEUMCIEUC, HANGUL CHOSEONG CHITUEUMCIEUC        # 
+
+1151 ; 1150 1150 ;     SA      # ( ᅑ → ᅐᅐ ) HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC → HANGUL CHOSEONG CEONGCHIEUMCIEUC, HANGUL CHOSEONG CEONGCHIEUMCIEUC       # 
+
+3186 ; 1159 ;  SA      # ( ㆆ → ᅙ ) HANGUL LETTER YEORINHIEUH → HANGUL CHOSEONG YEORINHIEUH     # 
+11F9 ; 1159 ;  SA      # ( ᇹ → ᅙ ) HANGUL JONGSEONG YEORINHIEUH → HANGUL CHOSEONG YEORINHIEUH  # 
+
+A97C ; 1159 1159 ;     SA      # ( ꥼ → ᅙᅙ ) HANGUL CHOSEONG SSANGYEORINHIEUH → HANGUL CHOSEONG YEORINHIEUH, HANGUL CHOSEONG YEORINHIEUH      # 
+
+3164 ; 1160 ;  SA      # (  →  ) HANGUL FILLER → HANGUL JUNGSEONG FILLER   # 
+
+314F ; 1161 ;  SA      # ( ㅏ → ᅡ ) HANGUL LETTER A → HANGUL JUNGSEONG A        # 
+
+1176 ; 1161 1169 ;     SA      # ( ᅶ → ᅡᅩ ) HANGUL JUNGSEONG A-O → HANGUL JUNGSEONG A, HANGUL JUNGSEONG O    # 
+
+1177 ; 1161 116E ;     SA      # ( ᅷ → ᅡᅮ ) HANGUL JUNGSEONG A-U → HANGUL JUNGSEONG A, HANGUL JUNGSEONG U    # 
+
+11A3 ; 1161 1173 ;     SA      # ( ᆣ → ᅡᅳ ) HANGUL JUNGSEONG A-EU → HANGUL JUNGSEONG A, HANGUL JUNGSEONG EU  # 
+
+1162 ; 1161 1175 ;     SA      # ( ᅢ → ᅡᅵ ) HANGUL JUNGSEONG AE → HANGUL JUNGSEONG A, HANGUL JUNGSEONG I     # 
+3150 ; 1161 1175 ;     SA      # ( ㅐ → ᅡᅵ ) HANGUL LETTER AE → HANGUL JUNGSEONG A, HANGUL JUNGSEONG I        # →ᅢ→
+
+3151 ; 1163 ;  SA      # ( ㅑ → ᅣ ) HANGUL LETTER YA → HANGUL JUNGSEONG YA      # 
+
+1178 ; 1163 1169 ;     SA      # ( ᅸ → ᅣᅩ ) HANGUL JUNGSEONG YA-O → HANGUL JUNGSEONG YA, HANGUL JUNGSEONG O  # 
+
+1179 ; 1163 116D ;     SA      # ( ᅹ → ᅣᅭ ) HANGUL JUNGSEONG YA-YO → HANGUL JUNGSEONG YA, HANGUL JUNGSEONG YO        # 
+
+11A4 ; 1163 116E ;     SA      # ( ᆤ → ᅣᅮ ) HANGUL JUNGSEONG YA-U → HANGUL JUNGSEONG YA, HANGUL JUNGSEONG U  # 
+
+1164 ; 1163 1175 ;     SA      # ( ᅤ → ᅣᅵ ) HANGUL JUNGSEONG YAE → HANGUL JUNGSEONG YA, HANGUL JUNGSEONG I   # 
+3152 ; 1163 1175 ;     SA      # ( ㅒ → ᅣᅵ ) HANGUL LETTER YAE → HANGUL JUNGSEONG YA, HANGUL JUNGSEONG I      # →ᅤ→
+
+3153 ; 1165 ;  SA      # ( ㅓ → ᅥ ) HANGUL LETTER EO → HANGUL JUNGSEONG EO      # 
+
+117A ; 1165 1169 ;     SA      # ( ᅺ → ᅥᅩ ) HANGUL JUNGSEONG EO-O → HANGUL JUNGSEONG EO, HANGUL JUNGSEONG O  # 
+
+117B ; 1165 116E ;     SA      # ( ᅻ → ᅥᅮ ) HANGUL JUNGSEONG EO-U → HANGUL JUNGSEONG EO, HANGUL JUNGSEONG U  # 
+
+117C ; 1165 1173 ;     SA      # ( ᅼ → ᅥᅳ ) HANGUL JUNGSEONG EO-EU → HANGUL JUNGSEONG EO, HANGUL JUNGSEONG EU        # 
+
+1166 ; 1165 1175 ;     SA      # ( ᅦ → ᅥᅵ ) HANGUL JUNGSEONG E → HANGUL JUNGSEONG EO, HANGUL JUNGSEONG I     # 
+3154 ; 1165 1175 ;     SA      # ( ㅔ → ᅥᅵ ) HANGUL LETTER E → HANGUL JUNGSEONG EO, HANGUL JUNGSEONG I        # →ᅦ→
+
+3155 ; 1167 ;  SA      # ( ㅕ → ᅧ ) HANGUL LETTER YEO → HANGUL JUNGSEONG YEO    # 
+
+11A5 ; 1167 1163 ;     SA      # ( ᆥ → ᅧᅣ ) HANGUL JUNGSEONG YEO-YA → HANGUL JUNGSEONG YEO, HANGUL JUNGSEONG YA      # 
+
+117D ; 1167 1169 ;     SA      # ( ᅽ → ᅧᅩ ) HANGUL JUNGSEONG YEO-O → HANGUL JUNGSEONG YEO, HANGUL JUNGSEONG O        # 
+
+117E ; 1167 116E ;     SA      # ( ᅾ → ᅧᅮ ) HANGUL JUNGSEONG YEO-U → HANGUL JUNGSEONG YEO, HANGUL JUNGSEONG U        # 
+
+1168 ; 1167 1175 ;     SA      # ( ᅨ → ᅧᅵ ) HANGUL JUNGSEONG YE → HANGUL JUNGSEONG YEO, HANGUL JUNGSEONG I   # 
+3156 ; 1167 1175 ;     SA      # ( ㅖ → ᅧᅵ ) HANGUL LETTER YE → HANGUL JUNGSEONG YEO, HANGUL JUNGSEONG I      # →ᅨ→
+
+3157 ; 1169 ;  SA      # ( ㅗ → ᅩ ) HANGUL LETTER O → HANGUL JUNGSEONG O        # 
+
+116A ; 1169 1161 ;     SA      # ( ᅪ → ᅩᅡ ) HANGUL JUNGSEONG WA → HANGUL JUNGSEONG O, HANGUL JUNGSEONG A     # 
+3158 ; 1169 1161 ;     SA      # ( ㅘ → ᅩᅡ ) HANGUL LETTER WA → HANGUL JUNGSEONG O, HANGUL JUNGSEONG A        # →ᅪ→
+
+116B ; 1169 1161 1175 ;        SA      # ( ᅫ → ᅩᅡᅵ ) HANGUL JUNGSEONG WAE → HANGUL JUNGSEONG O, HANGUL JUNGSEONG A, HANGUL JUNGSEONG I     # 
+3159 ; 1169 1161 1175 ;        SA      # ( ㅙ → ᅩᅡᅵ ) HANGUL LETTER WAE → HANGUL JUNGSEONG O, HANGUL JUNGSEONG A, HANGUL JUNGSEONG I        # →ᅫ→
+
+11A6 ; 1169 1163 ;     SA      # ( ᆦ → ᅩᅣ ) HANGUL JUNGSEONG O-YA → HANGUL JUNGSEONG O, HANGUL JUNGSEONG YA  # 
+
+11A7 ; 1169 1163 1175 ;        SA      # ( ᆧ → ᅩᅣᅵ ) HANGUL JUNGSEONG O-YAE → HANGUL JUNGSEONG O, HANGUL JUNGSEONG YA, HANGUL JUNGSEONG I  # 
+
+117F ; 1169 1165 ;     SA      # ( ᅿ → ᅩᅥ ) HANGUL JUNGSEONG O-EO → HANGUL JUNGSEONG O, HANGUL JUNGSEONG EO  # 
+
+1180 ; 1169 1165 1175 ;        SA      # ( ᆀ → ᅩᅥᅵ ) HANGUL JUNGSEONG O-E → HANGUL JUNGSEONG O, HANGUL JUNGSEONG EO, HANGUL JUNGSEONG I    # 
+
+D7B0 ; 1169 1167 ;     SA      # ( ힰ → ᅩᅧ ) HANGUL JUNGSEONG O-YEO → HANGUL JUNGSEONG O, HANGUL JUNGSEONG YEO        # 
+
+1181 ; 1169 1167 1175 ;        SA      # ( ᆁ → ᅩᅧᅵ ) HANGUL JUNGSEONG O-YE → HANGUL JUNGSEONG O, HANGUL JUNGSEONG YEO, HANGUL JUNGSEONG I  # 
+
+1182 ; 1169 1169 ;     SA      # ( ᆂ → ᅩᅩ ) HANGUL JUNGSEONG O-O → HANGUL JUNGSEONG O, HANGUL JUNGSEONG O    # 
+
+D7B1 ; 1169 1169 1175 ;        SA      # ( ힱ → ᅩᅩᅵ ) HANGUL JUNGSEONG O-O-I → HANGUL JUNGSEONG O, HANGUL JUNGSEONG O, HANGUL JUNGSEONG I   # 
+
+1183 ; 1169 116E ;     SA      # ( ᆃ → ᅩᅮ ) HANGUL JUNGSEONG O-U → HANGUL JUNGSEONG O, HANGUL JUNGSEONG U    # 
+
+116C ; 1169 1175 ;     SA      # ( ᅬ → ᅩᅵ ) HANGUL JUNGSEONG OE → HANGUL JUNGSEONG O, HANGUL JUNGSEONG I     # 
+315A ; 1169 1175 ;     SA      # ( ㅚ → ᅩᅵ ) HANGUL LETTER OE → HANGUL JUNGSEONG O, HANGUL JUNGSEONG I        # →ᅬ→
+
+315B ; 116D ;  SA      # ( ㅛ → ᅭ ) HANGUL LETTER YO → HANGUL JUNGSEONG YO      # 
+
+D7B2 ; 116D 1161 ;     SA      # ( ힲ → ᅭᅡ ) HANGUL JUNGSEONG YO-A → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG A  # 
+
+D7B3 ; 116D 1161 1175 ;        SA      # ( ힳ → ᅭᅡᅵ ) HANGUL JUNGSEONG YO-AE → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG A, HANGUL JUNGSEONG I  # 
+
+1184 ; 116D 1163 ;     SA      # ( ᆄ → ᅭᅣ ) HANGUL JUNGSEONG YO-YA → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG YA        # 
+3187 ; 116D 1163 ;     SA      # ( ㆇ → ᅭᅣ ) HANGUL LETTER YO-YA → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG YA   # →ᆄ→
+1186 ; 116D 1163 ;     SA      # ( ᆆ → ᅭᅣ ) HANGUL JUNGSEONG YO-YEO → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG YA       # →ᆄ→
+
+1185 ; 116D 1163 1175 ;        SA      # ( ᆅ → ᅭᅣᅵ ) HANGUL JUNGSEONG YO-YAE → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG YA, HANGUL JUNGSEONG I        # 
+3188 ; 116D 1163 1175 ;        SA      # ( ㆈ → ᅭᅣᅵ ) HANGUL LETTER YO-YAE → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG YA, HANGUL JUNGSEONG I   # →ᆅ→
+
+D7B4 ; 116D 1165 ;     SA      # ( ힴ → ᅭᅥ ) HANGUL JUNGSEONG YO-EO → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG EO        # 
+
+1187 ; 116D 1169 ;     SA      # ( ᆇ → ᅭᅩ ) HANGUL JUNGSEONG YO-O → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG O  # 
+
+1188 ; 116D 1175 ;     SA      # ( ᆈ → ᅭᅵ ) HANGUL JUNGSEONG YO-I → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG I  # 
+3189 ; 116D 1175 ;     SA      # ( ㆉ → ᅭᅵ ) HANGUL LETTER YO-I → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG I     # →ᆈ→
+
+315C ; 116E ;  SA      # ( ㅜ → ᅮ ) HANGUL LETTER U → HANGUL JUNGSEONG U        # 
+
+1189 ; 116E 1161 ;     SA      # ( ᆉ → ᅮᅡ ) HANGUL JUNGSEONG U-A → HANGUL JUNGSEONG U, HANGUL JUNGSEONG A    # 
+
+118A ; 116E 1161 1175 ;        SA      # ( ᆊ → ᅮᅡᅵ ) HANGUL JUNGSEONG U-AE → HANGUL JUNGSEONG U, HANGUL JUNGSEONG A, HANGUL JUNGSEONG I    # 
+
+116F ; 116E 1165 ;     SA      # ( ᅯ → ᅮᅥ ) HANGUL JUNGSEONG WEO → HANGUL JUNGSEONG U, HANGUL JUNGSEONG EO   # 
+315D ; 116E 1165 ;     SA      # ( ㅝ → ᅮᅥ ) HANGUL LETTER WEO → HANGUL JUNGSEONG U, HANGUL JUNGSEONG EO      # →ᅯ→
+
+118B ; 116E 1165 1173 ;        SA      # ( ᆋ → ᅮᅥᅳ ) HANGUL JUNGSEONG U-EO-EU → HANGUL JUNGSEONG U, HANGUL JUNGSEONG EO, HANGUL JUNGSEONG EU       # 
+
+1170 ; 116E 1165 1175 ;        SA      # ( ᅰ → ᅮᅥᅵ ) HANGUL JUNGSEONG WE → HANGUL JUNGSEONG U, HANGUL JUNGSEONG EO, HANGUL JUNGSEONG I     # 
+315E ; 116E 1165 1175 ;        SA      # ( ㅞ → ᅮᅥᅵ ) HANGUL LETTER WE → HANGUL JUNGSEONG U, HANGUL JUNGSEONG EO, HANGUL JUNGSEONG I        # →ᅰ→
+
+D7B5 ; 116E 1167 ;     SA      # ( ힵ → ᅮᅧ ) HANGUL JUNGSEONG U-YEO → HANGUL JUNGSEONG U, HANGUL JUNGSEONG YEO        # 
+
+118C ; 116E 1167 1175 ;        SA      # ( ᆌ → ᅮᅧᅵ ) HANGUL JUNGSEONG U-YE → HANGUL JUNGSEONG U, HANGUL JUNGSEONG YEO, HANGUL JUNGSEONG I  # 
+
+118D ; 116E 116E ;     SA      # ( ᆍ → ᅮᅮ ) HANGUL JUNGSEONG U-U → HANGUL JUNGSEONG U, HANGUL JUNGSEONG U    # 
+
+1171 ; 116E 1175 ;     SA      # ( ᅱ → ᅮᅵ ) HANGUL JUNGSEONG WI → HANGUL JUNGSEONG U, HANGUL JUNGSEONG I     # 
+315F ; 116E 1175 ;     SA      # ( ㅟ → ᅮᅵ ) HANGUL LETTER WI → HANGUL JUNGSEONG U, HANGUL JUNGSEONG I        # →ᅱ→
+
+D7B6 ; 116E 1175 1175 ;        SA      # ( ힶ → ᅮᅵᅵ ) HANGUL JUNGSEONG U-I-I → HANGUL JUNGSEONG U, HANGUL JUNGSEONG I, HANGUL JUNGSEONG I   # 
+
+3160 ; 1172 ;  SA      # ( ㅠ → ᅲ ) HANGUL LETTER YU → HANGUL JUNGSEONG YU      # 
+
+118E ; 1172 1161 ;     SA      # ( ᆎ → ᅲᅡ ) HANGUL JUNGSEONG YU-A → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG A  # 
+
+D7B7 ; 1172 1161 1175 ;        SA      # ( ힷ → ᅲᅡᅵ ) HANGUL JUNGSEONG YU-AE → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG A, HANGUL JUNGSEONG I  # 
+
+118F ; 1172 1165 ;     SA      # ( ᆏ → ᅲᅥ ) HANGUL JUNGSEONG YU-EO → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG EO        # 
+
+1190 ; 1172 1165 1175 ;        SA      # ( ᆐ → ᅲᅥᅵ ) HANGUL JUNGSEONG YU-E → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG EO, HANGUL JUNGSEONG I  # 
+
+1191 ; 1172 1167 ;     SA      # ( ᆑ → ᅲᅧ ) HANGUL JUNGSEONG YU-YEO → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG YEO      # 
+318A ; 1172 1167 ;     SA      # ( ㆊ → ᅲᅧ ) HANGUL LETTER YU-YEO → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG YEO # →ᆑ→
+
+1192 ; 1172 1167 1175 ;        SA      # ( ᆒ → ᅲᅧᅵ ) HANGUL JUNGSEONG YU-YE → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG YEO, HANGUL JUNGSEONG I        # 
+318B ; 1172 1167 1175 ;        SA      # ( ㆋ → ᅲᅧᅵ ) HANGUL LETTER YU-YE → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG YEO, HANGUL JUNGSEONG I   # →ᆒ→
+
+D7B8 ; 1172 1169 ;     SA      # ( ힸ → ᅲᅩ ) HANGUL JUNGSEONG YU-O → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG O  # 
+
+1193 ; 1172 116E ;     SA      # ( ᆓ → ᅲᅮ ) HANGUL JUNGSEONG YU-U → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG U  # 
+
+1194 ; 1172 1175 ;     SA      # ( ᆔ → ᅲᅵ ) HANGUL JUNGSEONG YU-I → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG I  # 
+318C ; 1172 1175 ;     SA      # ( ㆌ → ᅲᅵ ) HANGUL LETTER YU-I → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG I     # →ᆔ→
+
+D7B9 ; 1173 1161 ;     SA      # ( ힹ → ᅳᅡ ) HANGUL JUNGSEONG EU-A → HANGUL JUNGSEONG EU, HANGUL JUNGSEONG A  # 
+
+D7BA ; 1173 1165 ;     SA      # ( ힺ → ᅳᅥ ) HANGUL JUNGSEONG EU-EO → HANGUL JUNGSEONG EU, HANGUL JUNGSEONG EO        # 
+
+D7BB ; 1173 1165 1175 ;        SA      # ( ힻ → ᅳᅥᅵ ) HANGUL JUNGSEONG EU-E → HANGUL JUNGSEONG EU, HANGUL JUNGSEONG EO, HANGUL JUNGSEONG I  # 
+
+D7BC ; 1173 1169 ;     SA      # ( ힼ → ᅳᅩ ) HANGUL JUNGSEONG EU-O → HANGUL JUNGSEONG EU, HANGUL JUNGSEONG O  # 
+
+1195 ; 1173 116E ;     SA      # ( ᆕ → ᅳᅮ ) HANGUL JUNGSEONG EU-U → HANGUL JUNGSEONG EU, HANGUL JUNGSEONG U  # 
+
+1174 ; 1173 1175 ;     SA      # ( ᅴ → ᅳᅵ ) HANGUL JUNGSEONG YI → HANGUL JUNGSEONG EU, HANGUL JUNGSEONG I    # 
+3162 ; 1173 1175 ;     SA      # ( ㅢ → ᅳᅵ ) HANGUL LETTER YI → HANGUL JUNGSEONG EU, HANGUL JUNGSEONG I       # →ᅴ→
+
+1197 ; 1173 1175 116E ;        SA      # ( ᆗ → ᅳᅵᅮ ) HANGUL JUNGSEONG YI-U → HANGUL JUNGSEONG EU, HANGUL JUNGSEONG I, HANGUL JUNGSEONG U   # 
+
+3163 ; 1175 ;  SA      # ( ㅣ → ᅵ ) HANGUL LETTER I → HANGUL JUNGSEONG I        # 
+
+1198 ; 1175 1161 ;     SA      # ( ᆘ → ᅵᅡ ) HANGUL JUNGSEONG I-A → HANGUL JUNGSEONG I, HANGUL JUNGSEONG A    # 
+
+1199 ; 1175 1163 ;     SA      # ( ᆙ → ᅵᅣ ) HANGUL JUNGSEONG I-YA → HANGUL JUNGSEONG I, HANGUL JUNGSEONG YA  # 
+
+D7BD ; 1175 1163 1169 ;        SA      # ( ힽ → ᅵᅣᅩ ) HANGUL JUNGSEONG I-YA-O → HANGUL JUNGSEONG I, HANGUL JUNGSEONG YA, HANGUL JUNGSEONG O # 
+
+D7BE ; 1175 1163 1175 ;        SA      # ( ힾ → ᅵᅣᅵ ) HANGUL JUNGSEONG I-YAE → HANGUL JUNGSEONG I, HANGUL JUNGSEONG YA, HANGUL JUNGSEONG I  # 
+
+D7BF ; 1175 1167 ;     SA      # ( ힿ → ᅵᅧ ) HANGUL JUNGSEONG I-YEO → HANGUL JUNGSEONG I, HANGUL JUNGSEONG YEO        # 
+
+D7C0 ; 1175 1167 1175 ;        SA      # ( ퟀ → ᅵᅧᅵ ) HANGUL JUNGSEONG I-YE → HANGUL JUNGSEONG I, HANGUL JUNGSEONG YEO, HANGUL JUNGSEONG I  # 
+
+119A ; 1175 1169 ;     SA      # ( ᆚ → ᅵᅩ ) HANGUL JUNGSEONG I-O → HANGUL JUNGSEONG I, HANGUL JUNGSEONG O    # 
+
+D7C1 ; 1175 1169 1175 ;        SA      # ( ퟁ → ᅵᅩᅵ ) HANGUL JUNGSEONG I-O-I → HANGUL JUNGSEONG I, HANGUL JUNGSEONG O, HANGUL JUNGSEONG I   # 
+
+D7C2 ; 1175 116D ;     SA      # ( ퟂ → ᅵᅭ ) HANGUL JUNGSEONG I-YO → HANGUL JUNGSEONG I, HANGUL JUNGSEONG YO  # 
+
+119B ; 1175 116E ;     SA      # ( ᆛ → ᅵᅮ ) HANGUL JUNGSEONG I-U → HANGUL JUNGSEONG I, HANGUL JUNGSEONG U    # 
+
+D7C3 ; 1175 1172 ;     SA      # ( ퟃ → ᅵᅲ ) HANGUL JUNGSEONG I-YU → HANGUL JUNGSEONG I, HANGUL JUNGSEONG YU  # 
+
+119C ; 1175 1173 ;     SA      # ( ᆜ → ᅵᅳ ) HANGUL JUNGSEONG I-EU → HANGUL JUNGSEONG I, HANGUL JUNGSEONG EU  # 
+
+D7C4 ; 1175 1175 ;     SA      # ( ퟄ → ᅵᅵ ) HANGUL JUNGSEONG I-I → HANGUL JUNGSEONG I, HANGUL JUNGSEONG I    # 
+
+119D ; 1175 119E ;     SA      # ( ᆝ → ᅵᆞ ) HANGUL JUNGSEONG I-ARAEA → HANGUL JUNGSEONG I, HANGUL JUNGSEONG ARAEA    # 
+
+318D ; 119E ;  SA      # ( ㆍ → ᆞ ) HANGUL LETTER ARAEA → HANGUL JUNGSEONG ARAEA        # 
+
+D7C5 ; 119E 1161 ;     SA      # ( ퟅ → ᆞᅡ ) HANGUL JUNGSEONG ARAEA-A → HANGUL JUNGSEONG ARAEA, HANGUL JUNGSEONG A    # 
+
+119F ; 119E 1165 ;     SA      # ( ᆟ → ᆞᅥ ) HANGUL JUNGSEONG ARAEA-EO → HANGUL JUNGSEONG ARAEA, HANGUL JUNGSEONG EO  # 
+
+D7C6 ; 119E 1165 1175 ;        SA      # ( ퟆ → ᆞᅥᅵ ) HANGUL JUNGSEONG ARAEA-E → HANGUL JUNGSEONG ARAEA, HANGUL JUNGSEONG EO, HANGUL JUNGSEONG I    # 
+
+11A0 ; 119E 116E ;     SA      # ( ᆠ → ᆞᅮ ) HANGUL JUNGSEONG ARAEA-U → HANGUL JUNGSEONG ARAEA, HANGUL JUNGSEONG U    # 
+
+11A1 ; 119E 1175 ;     SA      # ( ᆡ → ᆞᅵ ) HANGUL JUNGSEONG ARAEA-I → HANGUL JUNGSEONG ARAEA, HANGUL JUNGSEONG I    # 
+318E ; 119E 1175 ;     SA      # ( ㆎ → ᆞᅵ ) HANGUL LETTER ARAEAE → HANGUL JUNGSEONG ARAEA, HANGUL JUNGSEONG I        # →ᆡ→
+
+11A2 ; 119E 119E ;     SA      # ( ᆢ → ᆞᆞ ) HANGUL JUNGSEONG SSANGARAEA → HANGUL JUNGSEONG ARAEA, HANGUL JUNGSEONG ARAEA     # 
+
+29C4 ; 303C ;  SA      #* ( ⧄ → 〼 ) SQUARED RISING DIAGONAL SLASH → MASU MARK  # 
+
+A49E ; A04A ;  SA      #* ( ꒞ → ꁊ ) YI RADICAL PUT → YI SYLLABLE PUT   # 
+
+A4AC ; A050 ;  SA      #* ( ꒬ → ꁐ ) YI RADICAL PYT → YI SYLLABLE PYT   # 
+
+A49C ; A0C0 ;  SA      #* ( ꒜ → ꃀ ) YI RADICAL MOP → YI SYLLABLE MOP   # 
+
+A4A8 ; A132 ;  SA      #* ( ꒨ → ꄲ ) YI RADICAL TU → YI SYLLABLE TU     # 
+
+A4BF ; A259 ;  SA      #* ( ꒿ → ꉙ ) YI RADICAL HXOP → YI SYLLABLE HXOP # 
+
+A4BE ; A2B1 ;  SA      #* ( ꒾ → ꊱ ) YI RADICAL CIP → YI SYLLABLE CIP   # 
+
+A494 ; A2CD ;  SA      #* ( ꒔ → ꋍ ) YI RADICAL CYP → YI SYLLABLE CYP   # 
+
+A4C0 ; A3AB ;  SA      #* ( ꓀ → ꎫ ) YI RADICAL SHAT → YI SYLLABLE SHAT # 
+
+A4C2 ; A3B5 ;  SA      #* ( ꓂ → ꎵ ) YI RADICAL SHOP → YI SYLLABLE SHOP # 
+
+A4BA ; A3BF ;  SA      #* ( ꒺ → ꎿ ) YI RADICAL SHUR → YI SYLLABLE SHUR # 
+
+A4B0 ; A3C2 ;  SA      #* ( ꒰ → ꏂ ) YI RADICAL SHY → YI SYLLABLE SHY   # 
+
+A4A7 ; A458 ;  SA      #* ( ꒧ → ꑘ ) YI RADICAL NYOP → YI SYLLABLE NYOP # 
+
+22A5 ; A4D5 ;  SA      #* ( ⊥ → ꓕ ) UP TACK → LISU LETTER THA  # 
+27C2 ; A4D5 ;  SA      #* ( ⟂ → ꓕ ) PERPENDICULAR → LISU LETTER THA    # →⊥→
+
+2141 ; A4E8 ;  SA      #* ( ⅁ → ꓨ ) TURNED SANS-SERIF CAPITAL G → LISU LETTER HHA      # 
+
+2200 ; A4EF ;  SA      #* ( ∀ → ꓯ ) FOR ALL → LISU LETTER AE   # 
+
+2229 ; A4F5 ;  SA      #* ( ∩ → ꓵ ) INTERSECTION → LISU LETTER UE      # 
+22C2 ; A4F5 ;  SA      #* ( ⋂ → ꓵ ) N-ARY INTERSECTION → LISU LETTER UE        # →∩→
+
+2142 ; A4F6 ;  SA      #* ( ⅂ → ꓶ ) TURNED SANS-SERIF CAPITAL L → LISU LETTER UH       # 
+
+104A0 ;        10486 ; SA      # ( 𐒠 → 𐒆 ) OSMANYA DIGIT ZERO → OSMANYA LETTER DEEL  # 
+
+F967 ; 4E0D ;  SA      # ( 不 → 不 ) CJK COMPATIBILITY IDEOGRAPH-F967 → CJK UNIFIED IDEOGRAPH-4E0D       # 
+
+FA70 ; 4E26 ;  SA      # ( 並 → 並 ) CJK COMPATIBILITY IDEOGRAPH-FA70 → CJK UNIFIED IDEOGRAPH-4E26       # 
+
+239C ; 4E28 ;  SA      #* ( ⎜ → 丨 ) LEFT PARENTHESIS EXTENSION → CJK UNIFIED IDEOGRAPH-4E28    # →⎥→→⎮→
+239F ; 4E28 ;  SA      #* ( ⎟ → 丨 ) RIGHT PARENTHESIS EXTENSION → CJK UNIFIED IDEOGRAPH-4E28   # →⎥→→⎮→
+23A2 ; 4E28 ;  SA      #* ( ⎢ → 丨 ) LEFT SQUARE BRACKET EXTENSION → CJK UNIFIED IDEOGRAPH-4E28 # →⎥→→⎮→
+23A5 ; 4E28 ;  SA      #* ( ⎥ → 丨 ) RIGHT SQUARE BRACKET EXTENSION → CJK UNIFIED IDEOGRAPH-4E28        # →⎮→
+23AA ; 4E28 ;  SA      #* ( ⎪ → 丨 ) CURLY BRACKET EXTENSION → CJK UNIFIED IDEOGRAPH-4E28       # →⎥→→⎮→
+23AE ; 4E28 ;  SA      #* ( ⎮ → 丨 ) INTEGRAL EXTENSION → CJK UNIFIED IDEOGRAPH-4E28    # 
+31D1 ; 4E28 ;  SA      #* ( ㇑ → 丨 ) CJK STROKE S → CJK UNIFIED IDEOGRAPH-4E28  # 
+2F01 ; 4E28 ;  SA      #* ( ⼁ → 丨 ) KANGXI RADICAL LINE → CJK UNIFIED IDEOGRAPH-4E28   # 
+
+2EA6 ; 4E2C ;  SA      #* ( ⺦ → 丬 ) CJK RADICAL SIMPLIFIED HALF TREE TRUNK → CJK UNIFIED IDEOGRAPH-4E2C        # 
+
+F905 ; 4E32 ;  SA      # ( 串 → 串 ) CJK COMPATIBILITY IDEOGRAPH-F905 → CJK UNIFIED IDEOGRAPH-4E32       # 
+
+2F801 ;        4E38 ;  SA      # ( 丸 → 丸 ) CJK COMPATIBILITY IDEOGRAPH-2F801 → CJK UNIFIED IDEOGRAPH-4E38     # 
+
+F95E ; 4E39 ;  SA      # ( 丹 → 丹 ) CJK COMPATIBILITY IDEOGRAPH-F95E → CJK UNIFIED IDEOGRAPH-4E39       # 
+
+2F800 ;        4E3D ;  SA      # ( 丽 → 丽 ) CJK COMPATIBILITY IDEOGRAPH-2F800 → CJK UNIFIED IDEOGRAPH-4E3D     # 
+
+2F802 ;        4E41 ;  SA      # ( 乁 → 乁 ) CJK COMPATIBILITY IDEOGRAPH-2F802 → CJK UNIFIED IDEOGRAPH-4E41     # 
+
+31E0 ; 4E59 ;  SA      #* ( ㇠ → 乙 ) CJK STROKE HXWG → CJK UNIFIED IDEOGRAPH-4E59       # 
+2F04 ; 4E59 ;  SA      #* ( ⼄ → 乙 ) KANGXI RADICAL SECOND → CJK UNIFIED IDEOGRAPH-4E59 # 
+
+31DF ; 4E5A ;  SA      #* ( ㇟ → 乚 ) CJK STROKE SWG → CJK UNIFIED IDEOGRAPH-4E5A        # 
+2E83 ; 4E5A ;  SA      #* ( ⺃ → 乚 ) CJK RADICAL SECOND TWO → CJK UNIFIED IDEOGRAPH-4E5A        # 
+
+31D6 ; 4E5B ;  SA      #* ( ㇖ → 乛 ) CJK STROKE HG → CJK UNIFIED IDEOGRAPH-4E5B # 
+
+2EF2 ; 4E80 ;  SA      #* ( ⻲ → 亀 ) CJK RADICAL J-SIMPLIFIED TURTLE → CJK UNIFIED IDEOGRAPH-4E80       # 
+
+F91B ; 4E82 ;  SA      # ( 亂 → 亂 ) CJK COMPATIBILITY IDEOGRAPH-F91B → CJK UNIFIED IDEOGRAPH-4E82       # 
+
+31DA ; 4E85 ;  SA      #* ( ㇚ → 亅 ) CJK STROKE SG → CJK UNIFIED IDEOGRAPH-4E85 # 
+2F05 ; 4E85 ;  SA      #* ( ⼅ → 亅 ) KANGXI RADICAL HOOK → CJK UNIFIED IDEOGRAPH-4E85   # 
+
+F9BA ; 4E86 ;  SA      # ( 了 → 了 ) CJK COMPATIBILITY IDEOGRAPH-F9BA → CJK UNIFIED IDEOGRAPH-4E86       # 
+
+2F06 ; 4E8C ;  SA      #* ( ⼆ → 二 ) KANGXI RADICAL TWO → CJK UNIFIED IDEOGRAPH-4E8C    # 
+
+2F07 ; 4EA0 ;  SA      #* ( ⼇ → 亠 ) KANGXI RADICAL LID → CJK UNIFIED IDEOGRAPH-4EA0    # 
+
+F977 ; 4EAE ;  SA      # ( 亮 → 亮 ) CJK COMPATIBILITY IDEOGRAPH-F977 → CJK UNIFIED IDEOGRAPH-4EAE       # 
+
+2F08 ; 4EBA ;  SA      #* ( ⼈ → 人 ) KANGXI RADICAL MAN → CJK UNIFIED IDEOGRAPH-4EBA    # 
+
+2E85 ; 4EBB ;  SA      #* ( ⺅ → 亻 ) CJK RADICAL PERSON → CJK UNIFIED IDEOGRAPH-4EBB    # 
+
+F9FD ; 4EC0 ;  SA      # ( 什 → 什 ) CJK COMPATIBILITY IDEOGRAPH-F9FD → CJK UNIFIED IDEOGRAPH-4EC0       # 
+
+2F819 ;        4ECC ;  SA      # ( 仌 → 仌 ) CJK COMPATIBILITY IDEOGRAPH-2F819 → CJK UNIFIED IDEOGRAPH-4ECC     # 
+
+F9A8 ; 4EE4 ;  SA      # ( 令 → 令 ) CJK COMPATIBILITY IDEOGRAPH-F9A8 → CJK UNIFIED IDEOGRAPH-4EE4       # 
+
+2F804 ;        4F60 ;  SA      # ( 你 → 你 ) CJK COMPATIBILITY IDEOGRAPH-2F804 → CJK UNIFIED IDEOGRAPH-4F60     # 
+
+5002 ; 4F75 ;  SA      # ( 倂 → 併 ) CJK UNIFIED IDEOGRAPH-5002 → CJK UNIFIED IDEOGRAPH-4F75     # 
+2F807 ;        4F75 ;  SA      # ( 倂 → 併 ) CJK COMPATIBILITY IDEOGRAPH-2F807 → CJK UNIFIED IDEOGRAPH-4F75     # →倂→
+
+FA73 ; 4F80 ;  SA      # ( 侀 → 侀 ) CJK COMPATIBILITY IDEOGRAPH-FA73 → CJK UNIFIED IDEOGRAPH-4F80       # 
+
+F92D ; 4F86 ;  SA      # ( 來 → 來 ) CJK COMPATIBILITY IDEOGRAPH-F92D → CJK UNIFIED IDEOGRAPH-4F86       # 
+
+F9B5 ; 4F8B ;  SA      # ( 例 → 例 ) CJK COMPATIBILITY IDEOGRAPH-F9B5 → CJK UNIFIED IDEOGRAPH-4F8B       # 
+
+FA30 ; 4FAE ;  SA      # ( 侮 → 侮 ) CJK COMPATIBILITY IDEOGRAPH-FA30 → CJK UNIFIED IDEOGRAPH-4FAE       # 
+2F805 ;        4FAE ;  SA      # ( 侮 → 侮 ) CJK COMPATIBILITY IDEOGRAPH-2F805 → CJK UNIFIED IDEOGRAPH-4FAE     # 
+
+2F806 ;        4FBB ;  SA      # ( 侻 → 侻 ) CJK COMPATIBILITY IDEOGRAPH-2F806 → CJK UNIFIED IDEOGRAPH-4FBB     # 
+
+F965 ; 4FBF ;  SA      # ( 便 → 便 ) CJK COMPATIBILITY IDEOGRAPH-F965 → CJK UNIFIED IDEOGRAPH-4FBF       # 
+
+503C ; 5024 ;  SA      # ( 值 → 値 ) CJK UNIFIED IDEOGRAPH-503C → CJK UNIFIED IDEOGRAPH-5024     # 
+
+F9D4 ; 502B ;  SA      # ( 倫 → 倫 ) CJK COMPATIBILITY IDEOGRAPH-F9D4 → CJK UNIFIED IDEOGRAPH-502B       # 
+
+2F808 ;        507A ;  SA      # ( 偺 → 偺 ) CJK COMPATIBILITY IDEOGRAPH-2F808 → CJK UNIFIED IDEOGRAPH-507A     # 
+
+2F809 ;        5099 ;  SA      # ( 備 → 備 ) CJK COMPATIBILITY IDEOGRAPH-2F809 → CJK UNIFIED IDEOGRAPH-5099     # 
+
+2F80B ;        50CF ;  SA      # ( 像 → 像 ) CJK COMPATIBILITY IDEOGRAPH-2F80B → CJK UNIFIED IDEOGRAPH-50CF     # 
+
+F9BB ; 50DA ;  SA      # ( 僚 → 僚 ) CJK COMPATIBILITY IDEOGRAPH-F9BB → CJK UNIFIED IDEOGRAPH-50DA       # 
+
+FA31 ; 50E7 ;  SA      # ( 僧 → 僧 ) CJK COMPATIBILITY IDEOGRAPH-FA31 → CJK UNIFIED IDEOGRAPH-50E7       # 
+2F80A ;        50E7 ;  SA      # ( 僧 → 僧 ) CJK COMPATIBILITY IDEOGRAPH-2F80A → CJK UNIFIED IDEOGRAPH-50E7     # 
+
+2F09 ; 513F ;  SA      #* ( ⼉ → 儿 ) KANGXI RADICAL LEGS → CJK UNIFIED IDEOGRAPH-513F   # 
+
+FA0C ; 5140 ;  SA      # ( 兀 → 兀 ) CJK COMPATIBILITY IDEOGRAPH-FA0C → CJK UNIFIED IDEOGRAPH-5140       # 
+2E8E ; 5140 ;  SA      #* ( ⺎ → 兀 ) CJK RADICAL LAME ONE → CJK UNIFIED IDEOGRAPH-5140  # 
+
+FA74 ; 5145 ;  SA      # ( 充 → 充 ) CJK COMPATIBILITY IDEOGRAPH-FA74 → CJK UNIFIED IDEOGRAPH-5145       # 
+
+FA32 ; 514D ;  SA      # ( 免 → 免 ) CJK COMPATIBILITY IDEOGRAPH-FA32 → CJK UNIFIED IDEOGRAPH-514D       # 
+2F80E ;        514D ;  SA      # ( 免 → 免 ) CJK COMPATIBILITY IDEOGRAPH-2F80E → CJK UNIFIED IDEOGRAPH-514D     # 
+
+2F80F ;        5154 ;  SA      # ( 兔 → 兔 ) CJK COMPATIBILITY IDEOGRAPH-2F80F → CJK UNIFIED IDEOGRAPH-5154     # 
+
+2F810 ;        5164 ;  SA      # ( 兤 → 兤 ) CJK COMPATIBILITY IDEOGRAPH-2F810 → CJK UNIFIED IDEOGRAPH-5164     # 
+
+2F0A ; 5165 ;  SA      #* ( ⼊ → 入 ) KANGXI RADICAL ENTER → CJK UNIFIED IDEOGRAPH-5165  # 
+
+2F814 ;        5167 ;  SA      # ( 內 → 內 ) CJK COMPATIBILITY IDEOGRAPH-2F814 → CJK UNIFIED IDEOGRAPH-5167     # 
+
+FA72 ; 5168 ;  SA      # ( 全 → 全 ) CJK COMPATIBILITY IDEOGRAPH-FA72 → CJK UNIFIED IDEOGRAPH-5168       # 
+
+F978 ; 5169 ;  SA      # ( 兩 → 兩 ) CJK COMPATIBILITY IDEOGRAPH-F978 → CJK UNIFIED IDEOGRAPH-5169       # 
+
+2F0B ; 516B ;  SA      #* ( ⼋ → 八 ) KANGXI RADICAL EIGHT → CJK UNIFIED IDEOGRAPH-516B  # 
+
+F9D1 ; 516D ;  SA      # ( 六 → 六 ) CJK COMPATIBILITY IDEOGRAPH-F9D1 → CJK UNIFIED IDEOGRAPH-516D       # 
+
+2F811 ;        5177 ;  SA      # ( 具 → 具 ) CJK COMPATIBILITY IDEOGRAPH-2F811 → CJK UNIFIED IDEOGRAPH-5177     # 
+
+FA75 ; 5180 ;  SA      # ( 冀 → 冀 ) CJK COMPATIBILITY IDEOGRAPH-FA75 → CJK UNIFIED IDEOGRAPH-5180       # 
+
+2F0C ; 5182 ;  SA      #* ( ⼌ → 冂 ) KANGXI RADICAL DOWN BOX → CJK UNIFIED IDEOGRAPH-5182       # 
+
+2F815 ;        518D ;  SA      # ( 再 → 再 ) CJK COMPATIBILITY IDEOGRAPH-2F815 → CJK UNIFIED IDEOGRAPH-518D     # 
+
+2F8D2 ;        5192 ;  SA      # ( 冒 → 冒 ) CJK COMPATIBILITY IDEOGRAPH-2F8D2 → CJK UNIFIED IDEOGRAPH-5192     # 
+
+2F8D3 ;        5195 ;  SA      # ( 冕 → 冕 ) CJK COMPATIBILITY IDEOGRAPH-2F8D3 → CJK UNIFIED IDEOGRAPH-5195     # 
+
+2F0D ; 5196 ;  SA      #* ( ⼍ → 冖 ) KANGXI RADICAL COVER → CJK UNIFIED IDEOGRAPH-5196  # 
+
+2F817 ;        5197 ;  SA      # ( 冗 → 冗 ) CJK COMPATIBILITY IDEOGRAPH-2F817 → CJK UNIFIED IDEOGRAPH-5197     # 
+
+2F818 ;        51A4 ;  SA      # ( 冤 → 冤 ) CJK COMPATIBILITY IDEOGRAPH-2F818 → CJK UNIFIED IDEOGRAPH-51A4     # 
+
+2F0E ; 51AB ;  SA      #* ( ⼎ → 冫 ) KANGXI RADICAL ICE → CJK UNIFIED IDEOGRAPH-51AB    # 
+
+2F81A ;        51AC ;  SA      # ( 冬 → 冬 ) CJK COMPATIBILITY IDEOGRAPH-2F81A → CJK UNIFIED IDEOGRAPH-51AC     # 
+
+FA71 ; 51B5 ;  SA      # ( 况 → 况 ) CJK COMPATIBILITY IDEOGRAPH-FA71 → CJK UNIFIED IDEOGRAPH-51B5       # 
+2F81B ;        51B5 ;  SA      # ( 况 → 况 ) CJK COMPATIBILITY IDEOGRAPH-2F81B → CJK UNIFIED IDEOGRAPH-51B5     # 
+
+F92E ; 51B7 ;  SA      # ( 冷 → 冷 ) CJK COMPATIBILITY IDEOGRAPH-F92E → CJK UNIFIED IDEOGRAPH-51B7       # 
+
+F979 ; 51C9 ;  SA      # ( 凉 → 凉 ) CJK COMPATIBILITY IDEOGRAPH-F979 → CJK UNIFIED IDEOGRAPH-51C9       # 
+
+F955 ; 51CC ;  SA      # ( 凌 → 凌 ) CJK COMPATIBILITY IDEOGRAPH-F955 → CJK UNIFIED IDEOGRAPH-51CC       # 
+
+F954 ; 51DC ;  SA      # ( 凜 → 凜 ) CJK COMPATIBILITY IDEOGRAPH-F954 → CJK UNIFIED IDEOGRAPH-51DC       # 
+
+FA15 ; 51DE ;  SA      # ( 凞 → 凞 ) CJK COMPATIBILITY IDEOGRAPH-FA15 → CJK UNIFIED IDEOGRAPH-51DE       # 
+
+2F0F ; 51E0 ;  SA      #* ( ⼏ → 几 ) KANGXI RADICAL TABLE → CJK UNIFIED IDEOGRAPH-51E0  # 
+
+2F81D ;        51F5 ;  SA      # ( 凵 → 凵 ) CJK COMPATIBILITY IDEOGRAPH-2F81D → CJK UNIFIED IDEOGRAPH-51F5     # 
+2F10 ; 51F5 ;  SA      #* ( ⼐ → 凵 ) KANGXI RADICAL OPEN BOX → CJK UNIFIED IDEOGRAPH-51F5       # 
+
+2F11 ; 5200 ;  SA      #* ( ⼑ → 刀 ) KANGXI RADICAL KNIFE → CJK UNIFIED IDEOGRAPH-5200  # 
+
+2E89 ; 5202 ;  SA      #* ( ⺉ → 刂 ) CJK RADICAL KNIFE TWO → CJK UNIFIED IDEOGRAPH-5202 # 
+
+2F81E ;        5203 ;  SA      # ( 刃 → 刃 ) CJK COMPATIBILITY IDEOGRAPH-2F81E → CJK UNIFIED IDEOGRAPH-5203     # 
+
+FA00 ; 5207 ;  SA      # ( 切 → 切 ) CJK COMPATIBILITY IDEOGRAPH-FA00 → CJK UNIFIED IDEOGRAPH-5207       # 
+2F850 ;        5207 ;  SA      # ( 切 → 切 ) CJK COMPATIBILITY IDEOGRAPH-2F850 → CJK UNIFIED IDEOGRAPH-5207     # 
+
+F99C ; 5217 ;  SA      # ( 列 → 列 ) CJK COMPATIBILITY IDEOGRAPH-F99C → CJK UNIFIED IDEOGRAPH-5217       # 
+
+F9DD ; 5229 ;  SA      # ( 利 → 利 ) CJK COMPATIBILITY IDEOGRAPH-F9DD → CJK UNIFIED IDEOGRAPH-5229       # 
+
+F9FF ; 523A ;  SA      # ( 刺 → 刺 ) CJK COMPATIBILITY IDEOGRAPH-F9FF → CJK UNIFIED IDEOGRAPH-523A       # 
+
+2F820 ;        523B ;  SA      # ( 刻 → 刻 ) CJK COMPATIBILITY IDEOGRAPH-2F820 → CJK UNIFIED IDEOGRAPH-523B     # 
+
+2F821 ;        5246 ;  SA      # ( 剆 → 剆 ) CJK COMPATIBILITY IDEOGRAPH-2F821 → CJK UNIFIED IDEOGRAPH-5246     # 
+
+2F822 ;        5272 ;  SA      # ( 割 → 割 ) CJK COMPATIBILITY IDEOGRAPH-2F822 → CJK UNIFIED IDEOGRAPH-5272     # 
+
+2F823 ;        5277 ;  SA      # ( 剷 → 剷 ) CJK COMPATIBILITY IDEOGRAPH-2F823 → CJK UNIFIED IDEOGRAPH-5277     # 
+
+F9C7 ; 5289 ;  SA      # ( 劉 → 劉 ) CJK COMPATIBILITY IDEOGRAPH-F9C7 → CJK UNIFIED IDEOGRAPH-5289       # 
+
+F98A ; 529B ;  SA      # ( 力 → 力 ) CJK COMPATIBILITY IDEOGRAPH-F98A → CJK UNIFIED IDEOGRAPH-529B       # 
+2F12 ; 529B ;  SA      #* ( ⼒ → 力 ) KANGXI RADICAL POWER → CJK UNIFIED IDEOGRAPH-529B  # 
+
+F99D ; 52A3 ;  SA      # ( 劣 → 劣 ) CJK COMPATIBILITY IDEOGRAPH-F99D → CJK UNIFIED IDEOGRAPH-52A3       # 
+
+2F992 ;        52B3 ;  SA      # ( 劳 → 劳 ) CJK COMPATIBILITY IDEOGRAPH-2F992 → CJK UNIFIED IDEOGRAPH-52B3     # 
+
+FA76 ; 52C7 ;  SA      # ( 勇 → 勇 ) CJK COMPATIBILITY IDEOGRAPH-FA76 → CJK UNIFIED IDEOGRAPH-52C7       # 
+2F825 ;        52C7 ;  SA      # ( 勇 → 勇 ) CJK COMPATIBILITY IDEOGRAPH-2F825 → CJK UNIFIED IDEOGRAPH-52C7     # 
+
+FA33 ; 52C9 ;  SA      # ( 勉 → 勉 ) CJK COMPATIBILITY IDEOGRAPH-FA33 → CJK UNIFIED IDEOGRAPH-52C9       # 
+2F826 ;        52C9 ;  SA      # ( 勉 → 勉 ) CJK COMPATIBILITY IDEOGRAPH-2F826 → CJK UNIFIED IDEOGRAPH-52C9     # 
+
+F952 ; 52D2 ;  SA      # ( 勒 → 勒 ) CJK COMPATIBILITY IDEOGRAPH-F952 → CJK UNIFIED IDEOGRAPH-52D2       # 
+
+F92F ; 52DE ;  SA      # ( 勞 → 勞 ) CJK COMPATIBILITY IDEOGRAPH-F92F → CJK UNIFIED IDEOGRAPH-52DE       # 
+
+FA34 ; 52E4 ;  SA      # ( 勤 → 勤 ) CJK COMPATIBILITY IDEOGRAPH-FA34 → CJK UNIFIED IDEOGRAPH-52E4       # 
+2F827 ;        52E4 ;  SA      # ( 勤 → 勤 ) CJK COMPATIBILITY IDEOGRAPH-2F827 → CJK UNIFIED IDEOGRAPH-52E4     # 
+
+F97F ; 52F5 ;  SA      # ( 勵 → 勵 ) CJK COMPATIBILITY IDEOGRAPH-F97F → CJK UNIFIED IDEOGRAPH-52F5       # 
+
+2F13 ; 52F9 ;  SA      #* ( ⼓ → 勹 ) KANGXI RADICAL WRAP → CJK UNIFIED IDEOGRAPH-52F9   # 
+
+FA77 ; 52FA ;  SA      # ( 勺 → 勺 ) CJK COMPATIBILITY IDEOGRAPH-FA77 → CJK UNIFIED IDEOGRAPH-52FA       # 
+2F828 ;        52FA ;  SA      # ( 勺 → 勺 ) CJK COMPATIBILITY IDEOGRAPH-2F828 → CJK UNIFIED IDEOGRAPH-52FA     # 
+
+2F829 ;        5305 ;  SA      # ( 包 → 包 ) CJK COMPATIBILITY IDEOGRAPH-2F829 → CJK UNIFIED IDEOGRAPH-5305     # 
+
+2F82A ;        5306 ;  SA      # ( 匆 → 匆 ) CJK COMPATIBILITY IDEOGRAPH-2F82A → CJK UNIFIED IDEOGRAPH-5306     # 
+
+2F14 ; 5315 ;  SA      #* ( ⼔ → 匕 ) KANGXI RADICAL SPOON → CJK UNIFIED IDEOGRAPH-5315  # 
+
+F963 ; 5317 ;  SA      # ( 北 → 北 ) CJK COMPATIBILITY IDEOGRAPH-F963 → CJK UNIFIED IDEOGRAPH-5317       # 
+2F82B ;        5317 ;  SA      # ( 北 → 北 ) CJK COMPATIBILITY IDEOGRAPH-2F82B → CJK UNIFIED IDEOGRAPH-5317     # 
+
+2F15 ; 531A ;  SA      #* ( ⼕ → 匚 ) KANGXI RADICAL RIGHT OPEN BOX → CJK UNIFIED IDEOGRAPH-531A # 
+
+2F16 ; 5338 ;  SA      #* ( ⼖ → 匸 ) KANGXI RADICAL HIDING ENCLOSURE → CJK UNIFIED IDEOGRAPH-5338       # 
+
+F9EB ; 533F ;  SA      # ( 匿 → 匿 ) CJK COMPATIBILITY IDEOGRAPH-F9EB → CJK UNIFIED IDEOGRAPH-533F       # 
+
+2F17 ; 5341 ;  SA      #* ( ⼗ → 十 ) KANGXI RADICAL TEN → CJK UNIFIED IDEOGRAPH-5341    # 
+3038 ; 5341 ;  SA      # ( 〸 → 十 ) HANGZHOU NUMERAL TEN → CJK UNIFIED IDEOGRAPH-5341   # 
+
+3039 ; 5344 ;  SA      # ( 〹 → 卄 ) HANGZHOU NUMERAL TWENTY → CJK UNIFIED IDEOGRAPH-5344        # 
+
+303A ; 5345 ;  SA      # ( 〺 → 卅 ) HANGZHOU NUMERAL THIRTY → CJK UNIFIED IDEOGRAPH-5345        # 
+
+2F82C ;        5349 ;  SA      # ( 卉 → 卉 ) CJK COMPATIBILITY IDEOGRAPH-2F82C → CJK UNIFIED IDEOGRAPH-5349     # 
+
+FA35 ; 5351 ;  SA      # ( 卑 → 卑 ) CJK COMPATIBILITY IDEOGRAPH-FA35 → CJK UNIFIED IDEOGRAPH-5351       # 
+2F82D ;        5351 ;  SA      # ( 卑 → 卑 ) CJK COMPATIBILITY IDEOGRAPH-2F82D → CJK UNIFIED IDEOGRAPH-5351     # 
+
+2F82E ;        535A ;  SA      # ( 博 → 博 ) CJK COMPATIBILITY IDEOGRAPH-2F82E → CJK UNIFIED IDEOGRAPH-535A     # 
+
+2F18 ; 535C ;  SA      #* ( ⼘ → 卜 ) KANGXI RADICAL DIVINATION → CJK UNIFIED IDEOGRAPH-535C     # 
+
+2F19 ; 5369 ;  SA      #* ( ⼙ → 卩 ) KANGXI RADICAL SEAL → CJK UNIFIED IDEOGRAPH-5369   # 
+
+2F82F ;        5373 ;  SA      # ( 即 → 即 ) CJK COMPATIBILITY IDEOGRAPH-2F82F → CJK UNIFIED IDEOGRAPH-5373     # 
+
+F91C ; 5375 ;  SA      # ( 卵 → 卵 ) CJK COMPATIBILITY IDEOGRAPH-F91C → CJK UNIFIED IDEOGRAPH-5375       # 
+
+2F830 ;        537D ;  SA      # ( 卽 → 卽 ) CJK COMPATIBILITY IDEOGRAPH-2F830 → CJK UNIFIED IDEOGRAPH-537D     # 
+
+2F831 ;        537F ;  SA      # ( 卿 → 卿 ) CJK COMPATIBILITY IDEOGRAPH-2F831 → CJK UNIFIED IDEOGRAPH-537F     # 
+2F832 ;        537F ;  SA      # ( 卿 → 卿 ) CJK COMPATIBILITY IDEOGRAPH-2F832 → CJK UNIFIED IDEOGRAPH-537F     # 
+2F833 ;        537F ;  SA      # ( 卿 → 卿 ) CJK COMPATIBILITY IDEOGRAPH-2F833 → CJK UNIFIED IDEOGRAPH-537F     # 
+
+2F1A ; 5382 ;  SA      #* ( ⼚ → 厂 ) KANGXI RADICAL CLIFF → CJK UNIFIED IDEOGRAPH-5382  # 
+
+2F1B ; 53B6 ;  SA      #* ( ⼛ → 厶 ) KANGXI RADICAL PRIVATE → CJK UNIFIED IDEOGRAPH-53B6        # 
+
+F96B ; 53C3 ;  SA      # ( 參 → 參 ) CJK COMPATIBILITY IDEOGRAPH-F96B → CJK UNIFIED IDEOGRAPH-53C3       # 
+
+2F1C ; 53C8 ;  SA      #* ( ⼜ → 又 ) KANGXI RADICAL AGAIN → CJK UNIFIED IDEOGRAPH-53C8  # 
+
+2F836 ;        53CA ;  SA      # ( 及 → 及 ) CJK COMPATIBILITY IDEOGRAPH-2F836 → CJK UNIFIED IDEOGRAPH-53CA     # 
+
+2F837 ;        53DF ;  SA      # ( 叟 → 叟 ) CJK COMPATIBILITY IDEOGRAPH-2F837 → CJK UNIFIED IDEOGRAPH-53DF     # 
+
+2F1D ; 53E3 ;  SA      #* ( ⼝ → 口 ) KANGXI RADICAL MOUTH → CJK UNIFIED IDEOGRAPH-53E3  # 
+
+F906 ; 53E5 ;  SA      # ( 句 → 句 ) CJK COMPATIBILITY IDEOGRAPH-F906 → CJK UNIFIED IDEOGRAPH-53E5       # 
+
+2F839 ;        53EB ;  SA      # ( 叫 → 叫 ) CJK COMPATIBILITY IDEOGRAPH-2F839 → CJK UNIFIED IDEOGRAPH-53EB     # 
+
+2F83A ;        53F1 ;  SA      # ( 叱 → 叱 ) CJK COMPATIBILITY IDEOGRAPH-2F83A → CJK UNIFIED IDEOGRAPH-53F1     # 
+
+2F83B ;        5406 ;  SA      # ( 吆 → 吆 ) CJK COMPATIBILITY IDEOGRAPH-2F83B → CJK UNIFIED IDEOGRAPH-5406     # 
+
+F9DE ; 540F ;  SA      # ( 吏 → 吏 ) CJK COMPATIBILITY IDEOGRAPH-F9DE → CJK UNIFIED IDEOGRAPH-540F       # 
+
+F9ED ; 541D ;  SA      # ( 吝 → 吝 ) CJK COMPATIBILITY IDEOGRAPH-F9ED → CJK UNIFIED IDEOGRAPH-541D       # 
+
+2F83D ;        5438 ;  SA      # ( 吸 → 吸 ) CJK COMPATIBILITY IDEOGRAPH-2F83D → CJK UNIFIED IDEOGRAPH-5438     # 
+
+F980 ; 5442 ;  SA      # ( 呂 → 呂 ) CJK COMPATIBILITY IDEOGRAPH-F980 → CJK UNIFIED IDEOGRAPH-5442       # 
+
+2F83E ;        5448 ;  SA      # ( 呈 → 呈 ) CJK COMPATIBILITY IDEOGRAPH-2F83E → CJK UNIFIED IDEOGRAPH-5448     # 
+
+2F83F ;        5468 ;  SA      # ( 周 → 周 ) CJK COMPATIBILITY IDEOGRAPH-2F83F → CJK UNIFIED IDEOGRAPH-5468     # 
+
+2F83C ;        549E ;  SA      # ( 咞 → 咞 ) CJK COMPATIBILITY IDEOGRAPH-2F83C → CJK UNIFIED IDEOGRAPH-549E     # 
+
+2F840 ;        54A2 ;  SA      # ( 咢 → 咢 ) CJK COMPATIBILITY IDEOGRAPH-2F840 → CJK UNIFIED IDEOGRAPH-54A2     # 
+
+F99E ; 54BD ;  SA      # ( 咽 → 咽 ) CJK COMPATIBILITY IDEOGRAPH-F99E → CJK UNIFIED IDEOGRAPH-54BD       # 
+
+2F841 ;        54F6 ;  SA      # ( 哶 → 哶 ) CJK COMPATIBILITY IDEOGRAPH-2F841 → CJK UNIFIED IDEOGRAPH-54F6     # 
+
+2F842 ;        5510 ;  SA      # ( 唐 → 唐 ) CJK COMPATIBILITY IDEOGRAPH-2F842 → CJK UNIFIED IDEOGRAPH-5510     # 
+
+2F843 ;        5553 ;  SA      # ( 啓 → 啓 ) CJK COMPATIBILITY IDEOGRAPH-2F843 → CJK UNIFIED IDEOGRAPH-5553     # 
+555F ; 5553 ;  SA      # ( 啟 → 啓 ) CJK UNIFIED IDEOGRAPH-555F → CJK UNIFIED IDEOGRAPH-5553     # 
+
+FA79 ; 5555 ;  SA      # ( 啕 → 啕 ) CJK COMPATIBILITY IDEOGRAPH-FA79 → CJK UNIFIED IDEOGRAPH-5555       # 
+
+2F844 ;        5563 ;  SA      # ( 啣 → 啣 ) CJK COMPATIBILITY IDEOGRAPH-2F844 → CJK UNIFIED IDEOGRAPH-5563     # 
+
+2F845 ;        5584 ;  SA      # ( 善 → 善 ) CJK COMPATIBILITY IDEOGRAPH-2F845 → CJK UNIFIED IDEOGRAPH-5584     # 
+2F846 ;        5584 ;  SA      # ( 善 → 善 ) CJK COMPATIBILITY IDEOGRAPH-2F846 → CJK UNIFIED IDEOGRAPH-5584     # 
+
+F90B ; 5587 ;  SA      # ( 喇 → 喇 ) CJK COMPATIBILITY IDEOGRAPH-F90B → CJK UNIFIED IDEOGRAPH-5587       # 
+
+FA7A ; 5599 ;  SA      # ( 喙 → 喙 ) CJK COMPATIBILITY IDEOGRAPH-FA7A → CJK UNIFIED IDEOGRAPH-5599       # 
+2F847 ;        5599 ;  SA      # ( 喙 → 喙 ) CJK COMPATIBILITY IDEOGRAPH-2F847 → CJK UNIFIED IDEOGRAPH-5599     # 
+
+FA36 ; 559D ;  SA      # ( 喝 → 喝 ) CJK COMPATIBILITY IDEOGRAPH-FA36 → CJK UNIFIED IDEOGRAPH-559D       # 
+FA78 ; 559D ;  SA      # ( 喝 → 喝 ) CJK COMPATIBILITY IDEOGRAPH-FA78 → CJK UNIFIED IDEOGRAPH-559D       # 
+
+2F848 ;        55AB ;  SA      # ( 喫 → 喫 ) CJK COMPATIBILITY IDEOGRAPH-2F848 → CJK UNIFIED IDEOGRAPH-55AB     # 
+
+2F849 ;        55B3 ;  SA      # ( 喳 → 喳 ) CJK COMPATIBILITY IDEOGRAPH-2F849 → CJK UNIFIED IDEOGRAPH-55B3     # 
+
+FA0D ; 55C0 ;  SA      # ( 嗀 → 嗀 ) CJK COMPATIBILITY IDEOGRAPH-FA0D → CJK UNIFIED IDEOGRAPH-55C0       # 
+
+2F84A ;        55C2 ;  SA      # ( 嗂 → 嗂 ) CJK COMPATIBILITY IDEOGRAPH-2F84A → CJK UNIFIED IDEOGRAPH-55C2     # 
+
+FA7B ; 55E2 ;  SA      # ( 嗢 → 嗢 ) CJK COMPATIBILITY IDEOGRAPH-FA7B → CJK UNIFIED IDEOGRAPH-55E2       # 
+
+FA37 ; 5606 ;  SA      # ( 嘆 → 嘆 ) CJK COMPATIBILITY IDEOGRAPH-FA37 → CJK UNIFIED IDEOGRAPH-5606       # 
+2F84C ;        5606 ;  SA      # ( 嘆 → 嘆 ) CJK COMPATIBILITY IDEOGRAPH-2F84C → CJK UNIFIED IDEOGRAPH-5606     # 
+
+2F84E ;        5651 ;  SA      # ( 噑 → 噑 ) CJK COMPATIBILITY IDEOGRAPH-2F84E → CJK UNIFIED IDEOGRAPH-5651     # 
+
+FA38 ; 5668 ;  SA      # ( 器 → 器 ) CJK COMPATIBILITY IDEOGRAPH-FA38 → CJK UNIFIED IDEOGRAPH-5668       # 
+
+2F84F ;        5674 ;  SA      # ( 噴 → 噴 ) CJK COMPATIBILITY IDEOGRAPH-2F84F → CJK UNIFIED IDEOGRAPH-5674     # 
+
+2F1E ; 56D7 ;  SA      #* ( ⼞ → 囗 ) KANGXI RADICAL ENCLOSURE → CJK UNIFIED IDEOGRAPH-56D7      # 
+
+F9A9 ; 56F9 ;  SA      # ( 囹 → 囹 ) CJK COMPATIBILITY IDEOGRAPH-F9A9 → CJK UNIFIED IDEOGRAPH-56F9       # 
+
+2F84B ;        5716 ;  SA      # ( 圖 → 圖 ) CJK COMPATIBILITY IDEOGRAPH-2F84B → CJK UNIFIED IDEOGRAPH-5716     # 
+
+2F84D ;        5717 ;  SA      # ( 圗 → 圗 ) CJK COMPATIBILITY IDEOGRAPH-2F84D → CJK UNIFIED IDEOGRAPH-5717     # 
+
+2F1F ; 571F ;  SA      #* ( ⼟ → 土 ) KANGXI RADICAL EARTH → CJK UNIFIED IDEOGRAPH-571F  # 
+
+2F855 ;        578B ;  SA      # ( 型 → 型 ) CJK COMPATIBILITY IDEOGRAPH-2F855 → CJK UNIFIED IDEOGRAPH-578B     # 
+
+2F852 ;        57CE ;  SA      # ( 城 → 城 ) CJK COMPATIBILITY IDEOGRAPH-2F852 → CJK UNIFIED IDEOGRAPH-57CE     # 
+
+2F853 ;        57F4 ;  SA      # ( 埴 → 埴 ) CJK COMPATIBILITY IDEOGRAPH-2F853 → CJK UNIFIED IDEOGRAPH-57F4     # 
+
+2F854 ;        580D ;  SA      # ( 堍 → 堍 ) CJK COMPATIBILITY IDEOGRAPH-2F854 → CJK UNIFIED IDEOGRAPH-580D     # 
+
+2F857 ;        5831 ;  SA      # ( 報 → 報 ) CJK COMPATIBILITY IDEOGRAPH-2F857 → CJK UNIFIED IDEOGRAPH-5831     # 
+
+2F856 ;        5832 ;  SA      # ( 堲 → 堲 ) CJK COMPATIBILITY IDEOGRAPH-2F856 → CJK UNIFIED IDEOGRAPH-5832     # 
+
+FA39 ; 5840 ;  SA      # ( 塀 → 塀 ) CJK COMPATIBILITY IDEOGRAPH-FA39 → CJK UNIFIED IDEOGRAPH-5840       # 
+
+FA10 ; 585A ;  SA      # ( 塚 → 塚 ) CJK COMPATIBILITY IDEOGRAPH-FA10 → CJK UNIFIED IDEOGRAPH-585A       # 
+FA7C ; 585A ;  SA      # ( 塚 → 塚 ) CJK COMPATIBILITY IDEOGRAPH-FA7C → CJK UNIFIED IDEOGRAPH-585A       # 
+
+F96C ; 585E ;  SA      # ( 塞 → 塞 ) CJK COMPATIBILITY IDEOGRAPH-F96C → CJK UNIFIED IDEOGRAPH-585E       # 
+
+586B ; 5861 ;  SA      # ( 填 → 塡 ) CJK UNIFIED IDEOGRAPH-586B → CJK UNIFIED IDEOGRAPH-5861     # 
+
+FA3A ; 58A8 ;  SA      # ( 墨 → 墨 ) CJK COMPATIBILITY IDEOGRAPH-FA3A → CJK UNIFIED IDEOGRAPH-58A8       # 
+
+58FF ; 58AB ;  SA      # ( 壿 → 墫 ) CJK UNIFIED IDEOGRAPH-58FF → CJK UNIFIED IDEOGRAPH-58AB     # 
+
+2F858 ;        58AC ;  SA      # ( 墬 → 墬 ) CJK COMPATIBILITY IDEOGRAPH-2F858 → CJK UNIFIED IDEOGRAPH-58AC     # 
+
+FA7D ; 58B3 ;  SA      # ( 墳 → 墳 ) CJK COMPATIBILITY IDEOGRAPH-FA7D → CJK UNIFIED IDEOGRAPH-58B3       # 
+
+F94A ; 58D8 ;  SA      # ( 壘 → 壘 ) CJK COMPATIBILITY IDEOGRAPH-F94A → CJK UNIFIED IDEOGRAPH-58D8       # 
+
+F942 ; 58DF ;  SA      # ( 壟 → 壟 ) CJK COMPATIBILITY IDEOGRAPH-F942 → CJK UNIFIED IDEOGRAPH-58DF       # 
+
+2F20 ; 58EB ;  SA      #* ( ⼠ → 士 ) KANGXI RADICAL SCHOLAR → CJK UNIFIED IDEOGRAPH-58EB        # 
+
+2F851 ;        58EE ;  SA      # ( 壮 → 壮 ) CJK COMPATIBILITY IDEOGRAPH-2F851 → CJK UNIFIED IDEOGRAPH-58EE     # 
+
+2F85A ;        58F2 ;  SA      # ( 売 → 売 ) CJK COMPATIBILITY IDEOGRAPH-2F85A → CJK UNIFIED IDEOGRAPH-58F2     # 
+
+2F85B ;        58F7 ;  SA      # ( 壷 → 壷 ) CJK COMPATIBILITY IDEOGRAPH-2F85B → CJK UNIFIED IDEOGRAPH-58F7     # 
+
+2F21 ; 5902 ;  SA      #* ( ⼡ → 夂 ) KANGXI RADICAL GO → CJK UNIFIED IDEOGRAPH-5902     # 
+
+2F85C ;        5906 ;  SA      # ( 夆 → 夆 ) CJK COMPATIBILITY IDEOGRAPH-2F85C → CJK UNIFIED IDEOGRAPH-5906     # 
+
+2F22 ; 590A ;  SA      #* ( ⼢ → 夊 ) KANGXI RADICAL GO SLOWLY → CJK UNIFIED IDEOGRAPH-590A      # 
+
+2F23 ; 5915 ;  SA      #* ( ⼣ → 夕 ) KANGXI RADICAL EVENING → CJK UNIFIED IDEOGRAPH-5915        # 
+
+2F85D ;        591A ;  SA      # ( 多 → 多 ) CJK COMPATIBILITY IDEOGRAPH-2F85D → CJK UNIFIED IDEOGRAPH-591A     # 
+
+2F85E ;        5922 ;  SA      # ( 夢 → 夢 ) CJK COMPATIBILITY IDEOGRAPH-2F85E → CJK UNIFIED IDEOGRAPH-5922     # 
+
+2F24 ; 5927 ;  SA      #* ( ⼤ → 大 ) KANGXI RADICAL BIG → CJK UNIFIED IDEOGRAPH-5927    # 
+
+FA7E ; 5944 ;  SA      # ( 奄 → 奄 ) CJK COMPATIBILITY IDEOGRAPH-FA7E → CJK UNIFIED IDEOGRAPH-5944       # 
+
+F90C ; 5948 ;  SA      # ( 奈 → 奈 ) CJK COMPATIBILITY IDEOGRAPH-F90C → CJK UNIFIED IDEOGRAPH-5948       # 
+
+F909 ; 5951 ;  SA      # ( 契 → 契 ) CJK COMPATIBILITY IDEOGRAPH-F909 → CJK UNIFIED IDEOGRAPH-5951       # 
+
+FA7F ; 5954 ;  SA      # ( 奔 → 奔 ) CJK COMPATIBILITY IDEOGRAPH-FA7F → CJK UNIFIED IDEOGRAPH-5954       # 
+
+2F85F ;        5962 ;  SA      # ( 奢 → 奢 ) CJK COMPATIBILITY IDEOGRAPH-2F85F → CJK UNIFIED IDEOGRAPH-5962     # 
+
+F981 ; 5973 ;  SA      # ( 女 → 女 ) CJK COMPATIBILITY IDEOGRAPH-F981 → CJK UNIFIED IDEOGRAPH-5973       # 
+2F25 ; 5973 ;  SA      #* ( ⼥ → 女 ) KANGXI RADICAL WOMAN → CJK UNIFIED IDEOGRAPH-5973  # 
+
+2F865 ;        59D8 ;  SA      # ( 姘 → 姘 ) CJK COMPATIBILITY IDEOGRAPH-2F865 → CJK UNIFIED IDEOGRAPH-59D8     # 
+
+2F862 ;        59EC ;  SA      # ( 姬 → 姬 ) CJK COMPATIBILITY IDEOGRAPH-2F862 → CJK UNIFIED IDEOGRAPH-59EC     # 
+
+2F863 ;        5A1B ;  SA      # ( 娛 → 娛 ) CJK COMPATIBILITY IDEOGRAPH-2F863 → CJK UNIFIED IDEOGRAPH-5A1B     # 
+
+2F864 ;        5A27 ;  SA      # ( 娧 → 娧 ) CJK COMPATIBILITY IDEOGRAPH-2F864 → CJK UNIFIED IDEOGRAPH-5A27     # 
+
+FA80 ; 5A62 ;  SA      # ( 婢 → 婢 ) CJK COMPATIBILITY IDEOGRAPH-FA80 → CJK UNIFIED IDEOGRAPH-5A62       # 
+
+2F866 ;        5A66 ;  SA      # ( 婦 → 婦 ) CJK COMPATIBILITY IDEOGRAPH-2F866 → CJK UNIFIED IDEOGRAPH-5A66     # 
+
+5B00 ; 5AAF ;  SA      # ( 嬀 → 媯 ) CJK UNIFIED IDEOGRAPH-5B00 → CJK UNIFIED IDEOGRAPH-5AAF     # 
+
+2F986 ;        5AB5 ;  SA      # ( 媵 → 媵 ) CJK COMPATIBILITY IDEOGRAPH-2F986 → CJK UNIFIED IDEOGRAPH-5AB5     # 
+
+2F869 ;        5B08 ;  SA      # ( 嬈 → 嬈 ) CJK COMPATIBILITY IDEOGRAPH-2F869 → CJK UNIFIED IDEOGRAPH-5B08     # 
+
+FA81 ; 5B28 ;  SA      # ( 嬨 → 嬨 ) CJK COMPATIBILITY IDEOGRAPH-FA81 → CJK UNIFIED IDEOGRAPH-5B28       # 
+
+2F86A ;        5B3E ;  SA      # ( 嬾 → 嬾 ) CJK COMPATIBILITY IDEOGRAPH-2F86A → CJK UNIFIED IDEOGRAPH-5B3E     # 
+2F86B ;        5B3E ;  SA      # ( 嬾 → 嬾 ) CJK COMPATIBILITY IDEOGRAPH-2F86B → CJK UNIFIED IDEOGRAPH-5B3E     # 
+
+2F26 ; 5B50 ;  SA      #* ( ⼦ → 子 ) KANGXI RADICAL CHILD → CJK UNIFIED IDEOGRAPH-5B50  # 
+
+2F27 ; 5B80 ;  SA      #* ( ⼧ → 宀 ) KANGXI RADICAL ROOF → CJK UNIFIED IDEOGRAPH-5B80   # 
+
+FA04 ; 5B85 ;  SA      # ( 宅 → 宅 ) CJK COMPATIBILITY IDEOGRAPH-FA04 → CJK UNIFIED IDEOGRAPH-5B85       # 
+
+2F86D ;        5BC3 ;  SA      # ( 寃 → 寃 ) CJK COMPATIBILITY IDEOGRAPH-2F86D → CJK UNIFIED IDEOGRAPH-5BC3     # 
+
+2F86E ;        5BD8 ;  SA      # ( 寘 → 寘 ) CJK COMPATIBILITY IDEOGRAPH-2F86E → CJK UNIFIED IDEOGRAPH-5BD8     # 
+
+F95F ; 5BE7 ;  SA      # ( 寧 → 寧 ) CJK COMPATIBILITY IDEOGRAPH-F95F → CJK UNIFIED IDEOGRAPH-5BE7       # 
+F9AA ; 5BE7 ;  SA      # ( 寧 → 寧 ) CJK COMPATIBILITY IDEOGRAPH-F9AA → CJK UNIFIED IDEOGRAPH-5BE7       # 
+2F86F ;        5BE7 ;  SA      # ( 寧 → 寧 ) CJK COMPATIBILITY IDEOGRAPH-2F86F → CJK UNIFIED IDEOGRAPH-5BE7     # 
+
+F9BC ; 5BEE ;  SA      # ( 寮 → 寮 ) CJK COMPATIBILITY IDEOGRAPH-F9BC → CJK UNIFIED IDEOGRAPH-5BEE       # 
+
+2F870 ;        5BF3 ;  SA      # ( 寳 → 寳 ) CJK COMPATIBILITY IDEOGRAPH-2F870 → CJK UNIFIED IDEOGRAPH-5BF3     # 
+
+2F28 ; 5BF8 ;  SA      #* ( ⼨ → 寸 ) KANGXI RADICAL INCH → CJK UNIFIED IDEOGRAPH-5BF8   # 
+
+2F872 ;        5BFF ;  SA      # ( 寿 → 寿 ) CJK COMPATIBILITY IDEOGRAPH-2F872 → CJK UNIFIED IDEOGRAPH-5BFF     # 
+
+2F873 ;        5C06 ;  SA      # ( 将 → 将 ) CJK COMPATIBILITY IDEOGRAPH-2F873 → CJK UNIFIED IDEOGRAPH-5C06     # 
+
+2F29 ; 5C0F ;  SA      #* ( ⼩ → 小 ) KANGXI RADICAL SMALL → CJK UNIFIED IDEOGRAPH-5C0F  # 
+
+2F875 ;        5C22 ;  SA      # ( 尢 → 尢 ) CJK COMPATIBILITY IDEOGRAPH-2F875 → CJK UNIFIED IDEOGRAPH-5C22     # 
+2E90 ; 5C22 ;  SA      #* ( ⺐ → 尢 ) CJK RADICAL LAME THREE → CJK UNIFIED IDEOGRAPH-5C22        # 
+2F2A ; 5C22 ;  SA      #* ( ⼪ → 尢 ) KANGXI RADICAL LAME → CJK UNIFIED IDEOGRAPH-5C22   # 
+
+2E8F ; 5C23 ;  SA      #* ( ⺏ → 尣 ) CJK RADICAL LAME TWO → CJK UNIFIED IDEOGRAPH-5C23  # 
+
+2F2B ; 5C38 ;  SA      #* ( ⼫ → 尸 ) KANGXI RADICAL CORPSE → CJK UNIFIED IDEOGRAPH-5C38 # 
+
+F9BD ; 5C3F ;  SA      # ( 尿 → 尿 ) CJK COMPATIBILITY IDEOGRAPH-F9BD → CJK UNIFIED IDEOGRAPH-5C3F       # 
+
+2F877 ;        5C60 ;  SA      # ( 屠 → 屠 ) CJK COMPATIBILITY IDEOGRAPH-2F877 → CJK UNIFIED IDEOGRAPH-5C60     # 
+
+F94B ; 5C62 ;  SA      # ( 屢 → 屢 ) CJK COMPATIBILITY IDEOGRAPH-F94B → CJK UNIFIED IDEOGRAPH-5C62       # 
+
+FA3B ; 5C64 ;  SA      # ( 層 → 層 ) CJK COMPATIBILITY IDEOGRAPH-FA3B → CJK UNIFIED IDEOGRAPH-5C64       # 
+
+F9DF ; 5C65 ;  SA      # ( 履 → 履 ) CJK COMPATIBILITY IDEOGRAPH-F9DF → CJK UNIFIED IDEOGRAPH-5C65       # 
+
+FA3C ; 5C6E ;  SA      # ( 屮 → 屮 ) CJK COMPATIBILITY IDEOGRAPH-FA3C → CJK UNIFIED IDEOGRAPH-5C6E       # 
+2F878 ;        5C6E ;  SA      # ( 屮 → 屮 ) CJK COMPATIBILITY IDEOGRAPH-2F878 → CJK UNIFIED IDEOGRAPH-5C6E     # 
+2F2C ; 5C6E ;  SA      #* ( ⼬ → 屮 ) KANGXI RADICAL SPROUT → CJK UNIFIED IDEOGRAPH-5C6E # 
+
+2F2D ; 5C71 ;  SA      #* ( ⼭ → 山 ) KANGXI RADICAL MOUNTAIN → CJK UNIFIED IDEOGRAPH-5C71       # 
+
+2F87A ;        5C8D ;  SA      # ( 岍 → 岍 ) CJK COMPATIBILITY IDEOGRAPH-2F87A → CJK UNIFIED IDEOGRAPH-5C8D     # 
+
+2F879 ;        5CC0 ;  SA      # ( 峀 → 峀 ) CJK COMPATIBILITY IDEOGRAPH-2F879 → CJK UNIFIED IDEOGRAPH-5CC0     # 
+
+F9D5 ; 5D19 ;  SA      # ( 崙 → 崙 ) CJK COMPATIBILITY IDEOGRAPH-F9D5 → CJK UNIFIED IDEOGRAPH-5D19       # 
+
+2F87C ;        5D43 ;  SA      # ( 嵃 → 嵃 ) CJK COMPATIBILITY IDEOGRAPH-2F87C → CJK UNIFIED IDEOGRAPH-5D43     # 
+
+F921 ; 5D50 ;  SA      # ( 嵐 → 嵐 ) CJK COMPATIBILITY IDEOGRAPH-F921 → CJK UNIFIED IDEOGRAPH-5D50       # 
+
+2F87F ;        5D6B ;  SA      # ( 嵫 → 嵫 ) CJK COMPATIBILITY IDEOGRAPH-2F87F → CJK UNIFIED IDEOGRAPH-5D6B     # 
+
+2F87E ;        5D6E ;  SA      # ( 嵮 → 嵮 ) CJK COMPATIBILITY IDEOGRAPH-2F87E → CJK UNIFIED IDEOGRAPH-5D6E     # 
+
+2F880 ;        5D7C ;  SA      # ( 嵼 → 嵼 ) CJK COMPATIBILITY IDEOGRAPH-2F880 → CJK UNIFIED IDEOGRAPH-5D7C     # 
+
+2F9F4 ;        5DB2 ;  SA      # ( 嶲 → 嶲 ) CJK COMPATIBILITY IDEOGRAPH-2F9F4 → CJK UNIFIED IDEOGRAPH-5DB2     # 
+
+F9AB ; 5DBA ;  SA      # ( 嶺 → 嶺 ) CJK COMPATIBILITY IDEOGRAPH-F9AB → CJK UNIFIED IDEOGRAPH-5DBA       # 
+
+2F2E ; 5DDB ;  SA      #* ( ⼮ → 巛 ) KANGXI RADICAL RIVER → CJK UNIFIED IDEOGRAPH-5DDB  # 
+
+2F881 ;        5DE1 ;  SA      # ( 巡 → 巡 ) CJK COMPATIBILITY IDEOGRAPH-2F881 → CJK UNIFIED IDEOGRAPH-5DE1     # 
+
+2F882 ;        5DE2 ;  SA      # ( 巢 → 巢 ) CJK COMPATIBILITY IDEOGRAPH-2F882 → CJK UNIFIED IDEOGRAPH-5DE2     # 
+
+2F2F ; 5DE5 ;  SA      #* ( ⼯ → 工 ) KANGXI RADICAL WORK → CJK UNIFIED IDEOGRAPH-5DE5   # 
+
+2F30 ; 5DF1 ;  SA      #* ( ⼰ → 己 ) KANGXI RADICAL ONESELF → CJK UNIFIED IDEOGRAPH-5DF1        # 
+
+2E92 ; 5DF3 ;  SA      #* ( ⺒ → 巳 ) CJK RADICAL SNAKE → CJK UNIFIED IDEOGRAPH-5DF3     # 
+
+2F884 ;        5DFD ;  SA      # ( 巽 → 巽 ) CJK COMPATIBILITY IDEOGRAPH-2F884 → CJK UNIFIED IDEOGRAPH-5DFD     # 
+
+2F31 ; 5DFE ;  SA      #* ( ⼱ → 巾 ) KANGXI RADICAL TURBAN → CJK UNIFIED IDEOGRAPH-5DFE # 
+
+5E32 ; 5E21 ;  SA      # ( 帲 → 帡 ) CJK UNIFIED IDEOGRAPH-5E32 → CJK UNIFIED IDEOGRAPH-5E21     # 
+
+2F885 ;        5E28 ;  SA      # ( 帨 → 帨 ) CJK COMPATIBILITY IDEOGRAPH-2F885 → CJK UNIFIED IDEOGRAPH-5E28     # 
+
+2F886 ;        5E3D ;  SA      # ( 帽 → 帽 ) CJK COMPATIBILITY IDEOGRAPH-2F886 → CJK UNIFIED IDEOGRAPH-5E3D     # 
+
+2F887 ;        5E69 ;  SA      # ( 幩 → 幩 ) CJK COMPATIBILITY IDEOGRAPH-2F887 → CJK UNIFIED IDEOGRAPH-5E69     # 
+
+2F32 ; 5E72 ;  SA      #* ( ⼲ → 干 ) KANGXI RADICAL DRY → CJK UNIFIED IDEOGRAPH-5E72    # 
+
+F98E ; 5E74 ;  SA      # ( 年 → 年 ) CJK COMPATIBILITY IDEOGRAPH-F98E → CJK UNIFIED IDEOGRAPH-5E74       # 
+
+2E93 ; 5E7A ;  SA      #* ( ⺓ → 幺 ) CJK RADICAL THREAD → CJK UNIFIED IDEOGRAPH-5E7A    # 
+2F33 ; 5E7A ;  SA      #* ( ⼳ → 幺 ) KANGXI RADICAL SHORT THREAD → CJK UNIFIED IDEOGRAPH-5E7A   # 
+
+2F34 ; 5E7F ;  SA      #* ( ⼴ → 广 ) KANGXI RADICAL DOTTED CLIFF → CJK UNIFIED IDEOGRAPH-5E7F   # 
+
+FA01 ; 5EA6 ;  SA      # ( 度 → 度 ) CJK COMPATIBILITY IDEOGRAPH-FA01 → CJK UNIFIED IDEOGRAPH-5EA6       # 
+
+2F88B ;        5EB0 ;  SA      # ( 庰 → 庰 ) CJK COMPATIBILITY IDEOGRAPH-2F88B → CJK UNIFIED IDEOGRAPH-5EB0     # 
+
+2F88C ;        5EB3 ;  SA      # ( 庳 → 庳 ) CJK COMPATIBILITY IDEOGRAPH-2F88C → CJK UNIFIED IDEOGRAPH-5EB3     # 
+
+2F88D ;        5EB6 ;  SA      # ( 庶 → 庶 ) CJK COMPATIBILITY IDEOGRAPH-2F88D → CJK UNIFIED IDEOGRAPH-5EB6     # 
+
+F9A2 ; 5EC9 ;  SA      # ( 廉 → 廉 ) CJK COMPATIBILITY IDEOGRAPH-F9A2 → CJK UNIFIED IDEOGRAPH-5EC9       # 
+
+F928 ; 5ECA ;  SA      # ( 廊 → 廊 ) CJK COMPATIBILITY IDEOGRAPH-F928 → CJK UNIFIED IDEOGRAPH-5ECA       # 
+2F88E ;        5ECA ;  SA      # ( 廊 → 廊 ) CJK COMPATIBILITY IDEOGRAPH-2F88E → CJK UNIFIED IDEOGRAPH-5ECA     # 
+
+FA82 ; 5ED2 ;  SA      # ( 廒 → 廒 ) CJK COMPATIBILITY IDEOGRAPH-FA82 → CJK UNIFIED IDEOGRAPH-5ED2       # 
+
+FA0B ; 5ED3 ;  SA      # ( 廓 → 廓 ) CJK COMPATIBILITY IDEOGRAPH-FA0B → CJK UNIFIED IDEOGRAPH-5ED3       # 
+
+FA83 ; 5ED9 ;  SA      # ( 廙 → 廙 ) CJK COMPATIBILITY IDEOGRAPH-FA83 → CJK UNIFIED IDEOGRAPH-5ED9       # 
+
+F982 ; 5EEC ;  SA      # ( 廬 → 廬 ) CJK COMPATIBILITY IDEOGRAPH-F982 → CJK UNIFIED IDEOGRAPH-5EEC       # 
+
+2F35 ; 5EF4 ;  SA      #* ( ⼵ → 廴 ) KANGXI RADICAL LONG STRIDE → CJK UNIFIED IDEOGRAPH-5EF4    # 
+
+2F890 ;        5EFE ;  SA      # ( 廾 → 廾 ) CJK COMPATIBILITY IDEOGRAPH-2F890 → CJK UNIFIED IDEOGRAPH-5EFE     # 
+2F36 ; 5EFE ;  SA      #* ( ⼶ → 廾 ) KANGXI RADICAL TWO HANDS → CJK UNIFIED IDEOGRAPH-5EFE      # 
+
+F943 ; 5F04 ;  SA      # ( 弄 → 弄 ) CJK COMPATIBILITY IDEOGRAPH-F943 → CJK UNIFIED IDEOGRAPH-5F04       # 
+
+2F37 ; 5F0B ;  SA      #* ( ⼷ → 弋 ) KANGXI RADICAL SHOOT → CJK UNIFIED IDEOGRAPH-5F0B  # 
+
+2F38 ; 5F13 ;  SA      #* ( ⼸ → 弓 ) KANGXI RADICAL BOW → CJK UNIFIED IDEOGRAPH-5F13    # 
+
+2F894 ;        5F22 ;  SA      # ( 弢 → 弢 ) CJK COMPATIBILITY IDEOGRAPH-2F894 → CJK UNIFIED IDEOGRAPH-5F22     # 
+2F895 ;        5F22 ;  SA      # ( 弢 → 弢 ) CJK COMPATIBILITY IDEOGRAPH-2F895 → CJK UNIFIED IDEOGRAPH-5F22     # 
+
+2F39 ; 5F50 ;  SA      #* ( ⼹ → 彐 ) KANGXI RADICAL SNOUT → CJK UNIFIED IDEOGRAPH-5F50  # 
+
+2E94 ; 5F51 ;  SA      #* ( ⺔ → 彑 ) CJK RADICAL SNOUT ONE → CJK UNIFIED IDEOGRAPH-5F51 # 
+
+2F874 ;        5F53 ;  SA      # ( 当 → 当 ) CJK COMPATIBILITY IDEOGRAPH-2F874 → CJK UNIFIED IDEOGRAPH-5F53     # 
+
+2F3A ; 5F61 ;  SA      #* ( ⼺ → 彡 ) KANGXI RADICAL BRISTLE → CJK UNIFIED IDEOGRAPH-5F61        # 
+
+2F899 ;        5F62 ;  SA      # ( 形 → 形 ) CJK COMPATIBILITY IDEOGRAPH-2F899 → CJK UNIFIED IDEOGRAPH-5F62     # 
+
+FA84 ; 5F69 ;  SA      # ( 彩 → 彩 ) CJK COMPATIBILITY IDEOGRAPH-FA84 → CJK UNIFIED IDEOGRAPH-5F69       # 
+
+2F89A ;        5F6B ;  SA      # ( 彫 → 彫 ) CJK COMPATIBILITY IDEOGRAPH-2F89A → CJK UNIFIED IDEOGRAPH-5F6B     # 
+
+2F3B ; 5F73 ;  SA      #* ( ⼻ → 彳 ) KANGXI RADICAL STEP → CJK UNIFIED IDEOGRAPH-5F73   # 
+
+F9D8 ; 5F8B ;  SA      # ( 律 → 律 ) CJK COMPATIBILITY IDEOGRAPH-F9D8 → CJK UNIFIED IDEOGRAPH-5F8B       # 
+
+2F89C ;        5F9A ;  SA      # ( 徚 → 徚 ) CJK COMPATIBILITY IDEOGRAPH-2F89C → CJK UNIFIED IDEOGRAPH-5F9A     # 
+
+F966 ; 5FA9 ;  SA      # ( 復 → 復 ) CJK COMPATIBILITY IDEOGRAPH-F966 → CJK UNIFIED IDEOGRAPH-5FA9       # 
+
+FA85 ; 5FAD ;  SA      # ( 徭 → 徭 ) CJK COMPATIBILITY IDEOGRAPH-FA85 → CJK UNIFIED IDEOGRAPH-5FAD       # 
+
+2F3C ; 5FC3 ;  SA      #* ( ⼼ → 心 ) KANGXI RADICAL HEART → CJK UNIFIED IDEOGRAPH-5FC3  # 
+
+2E96 ; 5FC4 ;  SA      #* ( ⺖ → 忄 ) CJK RADICAL HEART ONE → CJK UNIFIED IDEOGRAPH-5FC4 # 
+
+2F89D ;        5FCD ;  SA      # ( 忍 → 忍 ) CJK COMPATIBILITY IDEOGRAPH-2F89D → CJK UNIFIED IDEOGRAPH-5FCD     # 
+
+2F89E ;        5FD7 ;  SA      # ( 志 → 志 ) CJK COMPATIBILITY IDEOGRAPH-2F89E → CJK UNIFIED IDEOGRAPH-5FD7     # 
+
+F9A3 ; 5FF5 ;  SA      # ( 念 → 念 ) CJK COMPATIBILITY IDEOGRAPH-F9A3 → CJK UNIFIED IDEOGRAPH-5FF5       # 
+
+2F89F ;        5FF9 ;  SA      # ( 忹 → 忹 ) CJK COMPATIBILITY IDEOGRAPH-2F89F → CJK UNIFIED IDEOGRAPH-5FF9     # 
+
+F960 ; 6012 ;  SA      # ( 怒 → 怒 ) CJK COMPATIBILITY IDEOGRAPH-F960 → CJK UNIFIED IDEOGRAPH-6012       # 
+
+F9AC ; 601C ;  SA      # ( 怜 → 怜 ) CJK COMPATIBILITY IDEOGRAPH-F9AC → CJK UNIFIED IDEOGRAPH-601C       # 
+
+FA6B ; 6075 ;  SA      # ( 恵 → 恵 ) CJK COMPATIBILITY IDEOGRAPH-FA6B → CJK UNIFIED IDEOGRAPH-6075       # 
+
+2F8A0 ;        6081 ;  SA      # ( 悁 → 悁 ) CJK COMPATIBILITY IDEOGRAPH-2F8A0 → CJK UNIFIED IDEOGRAPH-6081     # 
+
+FA3D ; 6094 ;  SA      # ( 悔 → 悔 ) CJK COMPATIBILITY IDEOGRAPH-FA3D → CJK UNIFIED IDEOGRAPH-6094       # 
+2F8A3 ;        6094 ;  SA      # ( 悔 → 悔 ) CJK COMPATIBILITY IDEOGRAPH-2F8A3 → CJK UNIFIED IDEOGRAPH-6094     # 
+
+2F8A5 ;        60C7 ;  SA      # ( 惇 → 惇 ) CJK COMPATIBILITY IDEOGRAPH-2F8A5 → CJK UNIFIED IDEOGRAPH-60C7     # 
+
+FA86 ; 60D8 ;  SA      # ( 惘 → 惘 ) CJK COMPATIBILITY IDEOGRAPH-FA86 → CJK UNIFIED IDEOGRAPH-60D8       # 
+
+F9B9 ; 60E1 ;  SA      # ( 惡 → 惡 ) CJK COMPATIBILITY IDEOGRAPH-F9B9 → CJK UNIFIED IDEOGRAPH-60E1       # 
+
+FA88 ; 6108 ;  SA      # ( 愈 → 愈 ) CJK COMPATIBILITY IDEOGRAPH-FA88 → CJK UNIFIED IDEOGRAPH-6108       # 
+
+F9D9 ; 6144 ;  SA      # ( 慄 → 慄 ) CJK COMPATIBILITY IDEOGRAPH-F9D9 → CJK UNIFIED IDEOGRAPH-6144       # 
+
+2F8A6 ;        6148 ;  SA      # ( 慈 → 慈 ) CJK COMPATIBILITY IDEOGRAPH-2F8A6 → CJK UNIFIED IDEOGRAPH-6148     # 
+
+2F8A7 ;        614C ;  SA      # ( 慌 → 慌 ) CJK COMPATIBILITY IDEOGRAPH-2F8A7 → CJK UNIFIED IDEOGRAPH-614C     # 
+2F8A9 ;        614C ;  SA      # ( 慌 → 慌 ) CJK COMPATIBILITY IDEOGRAPH-2F8A9 → CJK UNIFIED IDEOGRAPH-614C     # 
+
+FA87 ; 614E ;  SA      # ( 慎 → 慎 ) CJK COMPATIBILITY IDEOGRAPH-FA87 → CJK UNIFIED IDEOGRAPH-614E       # 
+2F8A8 ;        614E ;  SA      # ( 慎 → 慎 ) CJK COMPATIBILITY IDEOGRAPH-2F8A8 → CJK UNIFIED IDEOGRAPH-614E     # 
+
+FA8A ; 6160 ;  SA      # ( 慠 → 慠 ) CJK COMPATIBILITY IDEOGRAPH-FA8A → CJK UNIFIED IDEOGRAPH-6160       # 
+
+FA3E ; 6168 ;  SA      # ( 慨 → 慨 ) CJK COMPATIBILITY IDEOGRAPH-FA3E → CJK UNIFIED IDEOGRAPH-6168       # 
+
+2F8AA ;        617A ;  SA      # ( 慺 → 慺 ) CJK COMPATIBILITY IDEOGRAPH-2F8AA → CJK UNIFIED IDEOGRAPH-617A     # 
+
+FA3F ; 618E ;  SA      # ( 憎 → 憎 ) CJK COMPATIBILITY IDEOGRAPH-FA3F → CJK UNIFIED IDEOGRAPH-618E       # 
+FA89 ; 618E ;  SA      # ( 憎 → 憎 ) CJK COMPATIBILITY IDEOGRAPH-FA89 → CJK UNIFIED IDEOGRAPH-618E       # 
+2F8AB ;        618E ;  SA      # ( 憎 → 憎 ) CJK COMPATIBILITY IDEOGRAPH-2F8AB → CJK UNIFIED IDEOGRAPH-618E     # 
+
+F98F ; 6190 ;  SA      # ( 憐 → 憐 ) CJK COMPATIBILITY IDEOGRAPH-F98F → CJK UNIFIED IDEOGRAPH-6190       # 
+
+2F8AD ;        61A4 ;  SA      # ( 憤 → 憤 ) CJK COMPATIBILITY IDEOGRAPH-2F8AD → CJK UNIFIED IDEOGRAPH-61A4     # 
+
+2F8AE ;        61AF ;  SA      # ( 憯 → 憯 ) CJK COMPATIBILITY IDEOGRAPH-2F8AE → CJK UNIFIED IDEOGRAPH-61AF     # 
+
+2F8AC ;        61B2 ;  SA      # ( 憲 → 憲 ) CJK COMPATIBILITY IDEOGRAPH-2F8AC → CJK UNIFIED IDEOGRAPH-61B2     # 
+
+2F8AF ;        61DE ;  SA      # ( 懞 → 懞 ) CJK COMPATIBILITY IDEOGRAPH-2F8AF → CJK UNIFIED IDEOGRAPH-61DE     # 
+
+FA40 ; 61F2 ;  SA      # ( 懲 → 懲 ) CJK COMPATIBILITY IDEOGRAPH-FA40 → CJK UNIFIED IDEOGRAPH-61F2       # 
+FA8B ; 61F2 ;  SA      # ( 懲 → 懲 ) CJK COMPATIBILITY IDEOGRAPH-FA8B → CJK UNIFIED IDEOGRAPH-61F2       # 
+2F8B0 ;        61F2 ;  SA      # ( 懲 → 懲 ) CJK COMPATIBILITY IDEOGRAPH-2F8B0 → CJK UNIFIED IDEOGRAPH-61F2     # 
+
+F90D ; 61F6 ;  SA      # ( 懶 → 懶 ) CJK COMPATIBILITY IDEOGRAPH-F90D → CJK UNIFIED IDEOGRAPH-61F6       # 
+2F8B1 ;        61F6 ;  SA      # ( 懶 → 懶 ) CJK COMPATIBILITY IDEOGRAPH-2F8B1 → CJK UNIFIED IDEOGRAPH-61F6     # 
+
+F990 ; 6200 ;  SA      # ( 戀 → 戀 ) CJK COMPATIBILITY IDEOGRAPH-F990 → CJK UNIFIED IDEOGRAPH-6200       # 
+
+2F3D ; 6208 ;  SA      #* ( ⼽ → 戈 ) KANGXI RADICAL HALBERD → CJK UNIFIED IDEOGRAPH-6208        # 
+
+2F8B2 ;        6210 ;  SA      # ( 成 → 成 ) CJK COMPATIBILITY IDEOGRAPH-2F8B2 → CJK UNIFIED IDEOGRAPH-6210     # 
+
+2F8B3 ;        621B ;  SA      # ( 戛 → 戛 ) CJK COMPATIBILITY IDEOGRAPH-2F8B3 → CJK UNIFIED IDEOGRAPH-621B     # 
+
+F9D2 ; 622E ;  SA      # ( 戮 → 戮 ) CJK COMPATIBILITY IDEOGRAPH-F9D2 → CJK UNIFIED IDEOGRAPH-622E       # 
+
+FA8C ; 6234 ;  SA      # ( 戴 → 戴 ) CJK COMPATIBILITY IDEOGRAPH-FA8C → CJK UNIFIED IDEOGRAPH-6234       # 
+
+2F3E ; 6236 ;  SA      #* ( ⼾ → 戶 ) KANGXI RADICAL DOOR → CJK UNIFIED IDEOGRAPH-6236   # 
+6238 ; 6236 ;  SA      # ( 戸 → 戶 ) CJK UNIFIED IDEOGRAPH-6238 → CJK UNIFIED IDEOGRAPH-6236     # →⼾→
+
+2F3F ; 624B ;  SA      #* ( ⼿ → 手 ) KANGXI RADICAL HAND → CJK UNIFIED IDEOGRAPH-624B   # 
+
+2E98 ; 624C ;  SA      #* ( ⺘ → 扌 ) CJK RADICAL HAND → CJK UNIFIED IDEOGRAPH-624C      # 
+
+2F8B4 ;        625D ;  SA      # ( 扝 → 扝 ) CJK COMPATIBILITY IDEOGRAPH-2F8B4 → CJK UNIFIED IDEOGRAPH-625D     # 
+
+2F8B5 ;        62B1 ;  SA      # ( 抱 → 抱 ) CJK COMPATIBILITY IDEOGRAPH-2F8B5 → CJK UNIFIED IDEOGRAPH-62B1     # 
+
+F925 ; 62C9 ;  SA      # ( 拉 → 拉 ) CJK COMPATIBILITY IDEOGRAPH-F925 → CJK UNIFIED IDEOGRAPH-62C9       # 
+
+F95B ; 62CF ;  SA      # ( 拏 → 拏 ) CJK COMPATIBILITY IDEOGRAPH-F95B → CJK UNIFIED IDEOGRAPH-62CF       # 
+
+FA02 ; 62D3 ;  SA      # ( 拓 → 拓 ) CJK COMPATIBILITY IDEOGRAPH-FA02 → CJK UNIFIED IDEOGRAPH-62D3       # 
+
+2F8B6 ;        62D4 ;  SA      # ( 拔 → 拔 ) CJK COMPATIBILITY IDEOGRAPH-2F8B6 → CJK UNIFIED IDEOGRAPH-62D4     # 
+
+2F8BA ;        62FC ;  SA      # ( 拼 → 拼 ) CJK COMPATIBILITY IDEOGRAPH-2F8BA → CJK UNIFIED IDEOGRAPH-62FC     # 
+
+F973 ; 62FE ;  SA      # ( 拾 → 拾 ) CJK COMPATIBILITY IDEOGRAPH-F973 → CJK UNIFIED IDEOGRAPH-62FE       # 
+
+2F8B9 ;        633D ;  SA      # ( 挽 → 挽 ) CJK COMPATIBILITY IDEOGRAPH-2F8B9 → CJK UNIFIED IDEOGRAPH-633D     # 
+
+2F8B7 ;        6350 ;  SA      # ( 捐 → 捐 ) CJK COMPATIBILITY IDEOGRAPH-2F8B7 → CJK UNIFIED IDEOGRAPH-6350     # 
+
+2F8BB ;        6368 ;  SA      # ( 捨 → 捨 ) CJK COMPATIBILITY IDEOGRAPH-2F8BB → CJK UNIFIED IDEOGRAPH-6368     # 
+
+F9A4 ; 637B ;  SA      # ( 捻 → 捻 ) CJK COMPATIBILITY IDEOGRAPH-F9A4 → CJK UNIFIED IDEOGRAPH-637B       # 
+
+2F8BC ;        6383 ;  SA      # ( 掃 → 掃 ) CJK COMPATIBILITY IDEOGRAPH-2F8BC → CJK UNIFIED IDEOGRAPH-6383     # 
+
+F975 ; 63A0 ;  SA      # ( 掠 → 掠 ) CJK COMPATIBILITY IDEOGRAPH-F975 → CJK UNIFIED IDEOGRAPH-63A0       # 
+
+2F8C1 ;        63A9 ;  SA      # ( 掩 → 掩 ) CJK COMPATIBILITY IDEOGRAPH-2F8C1 → CJK UNIFIED IDEOGRAPH-63A9     # 
+
+FA8D ; 63C4 ;  SA      # ( 揄 → 揄 ) CJK COMPATIBILITY IDEOGRAPH-FA8D → CJK UNIFIED IDEOGRAPH-63C4       # 
+
+2F8C0 ;        63C5 ;  SA      # ( 揅 → 揅 ) CJK COMPATIBILITY IDEOGRAPH-2F8C0 → CJK UNIFIED IDEOGRAPH-63C5     # 
+
+2F8BD ;        63E4 ;  SA      # ( 揤 → 揤 ) CJK COMPATIBILITY IDEOGRAPH-2F8BD → CJK UNIFIED IDEOGRAPH-63E4     # 
+
+FA8E ; 641C ;  SA      # ( 搜 → 搜 ) CJK COMPATIBILITY IDEOGRAPH-FA8E → CJK UNIFIED IDEOGRAPH-641C       # 
+
+2F8BF ;        6422 ;  SA      # ( 搢 → 搢 ) CJK COMPATIBILITY IDEOGRAPH-2F8BF → CJK UNIFIED IDEOGRAPH-6422     # 
+
+FA8F ; 6452 ;  SA      # ( 摒 → 摒 ) CJK COMPATIBILITY IDEOGRAPH-FA8F → CJK UNIFIED IDEOGRAPH-6452       # 
+
+2F8C3 ;        6469 ;  SA      # ( 摩 → 摩 ) CJK COMPATIBILITY IDEOGRAPH-2F8C3 → CJK UNIFIED IDEOGRAPH-6469     # 
+
+2F8C6 ;        6477 ;  SA      # ( 摷 → 摷 ) CJK COMPATIBILITY IDEOGRAPH-2F8C6 → CJK UNIFIED IDEOGRAPH-6477     # 
+
+2F8C4 ;        647E ;  SA      # ( 摾 → 摾 ) CJK COMPATIBILITY IDEOGRAPH-2F8C4 → CJK UNIFIED IDEOGRAPH-647E     # 
+
+F991 ; 649A ;  SA      # ( 撚 → 撚 ) CJK COMPATIBILITY IDEOGRAPH-F991 → CJK UNIFIED IDEOGRAPH-649A       # 
+
+2F8C5 ;        649D ;  SA      # ( 撝 → 撝 ) CJK COMPATIBILITY IDEOGRAPH-2F8C5 → CJK UNIFIED IDEOGRAPH-649D     # 
+
+F930 ; 64C4 ;  SA      # ( 擄 → 擄 ) CJK COMPATIBILITY IDEOGRAPH-F930 → CJK UNIFIED IDEOGRAPH-64C4       # 
+
+2F40 ; 652F ;  SA      #* ( ⽀ → 支 ) KANGXI RADICAL BRANCH → CJK UNIFIED IDEOGRAPH-652F # 
+
+2F41 ; 6534 ;  SA      #* ( ⽁ → 攴 ) KANGXI RADICAL RAP → CJK UNIFIED IDEOGRAPH-6534    # 
+
+2E99 ; 6535 ;  SA      #* ( ⺙ → 攵 ) CJK RADICAL RAP → CJK UNIFIED IDEOGRAPH-6535       # 
+
+FA41 ; 654F ;  SA      # ( 敏 → 敏 ) CJK COMPATIBILITY IDEOGRAPH-FA41 → CJK UNIFIED IDEOGRAPH-654F       # 
+2F8C8 ;        654F ;  SA      # ( 敏 → 敏 ) CJK COMPATIBILITY IDEOGRAPH-2F8C8 → CJK UNIFIED IDEOGRAPH-654F     # 
+
+FA90 ; 6556 ;  SA      # ( 敖 → 敖 ) CJK COMPATIBILITY IDEOGRAPH-FA90 → CJK UNIFIED IDEOGRAPH-6556       # 
+
+2F8C9 ;        656C ;  SA      # ( 敬 → 敬 ) CJK COMPATIBILITY IDEOGRAPH-2F8C9 → CJK UNIFIED IDEOGRAPH-656C     # 
+
+F969 ; 6578 ;  SA      # ( 數 → 數 ) CJK COMPATIBILITY IDEOGRAPH-F969 → CJK UNIFIED IDEOGRAPH-6578       # 
+
+2F42 ; 6587 ;  SA      #* ( ⽂ → 文 ) KANGXI RADICAL SCRIPT → CJK UNIFIED IDEOGRAPH-6587 # 
+
+2EEB ; 6589 ;  SA      #* ( ⻫ → 斉 ) CJK RADICAL J-SIMPLIFIED EVEN → CJK UNIFIED IDEOGRAPH-6589 # 
+
+2F43 ; 6597 ;  SA      #* ( ⽃ → 斗 ) KANGXI RADICAL DIPPER → CJK UNIFIED IDEOGRAPH-6597 # 
+
+F9BE ; 6599 ;  SA      # ( 料 → 料 ) CJK COMPATIBILITY IDEOGRAPH-F9BE → CJK UNIFIED IDEOGRAPH-6599       # 
+
+2F44 ; 65A4 ;  SA      #* ( ⽄ → 斤 ) KANGXI RADICAL AXE → CJK UNIFIED IDEOGRAPH-65A4    # 
+
+2F45 ; 65B9 ;  SA      #* ( ⽅ → 方 ) KANGXI RADICAL SQUARE → CJK UNIFIED IDEOGRAPH-65B9 # 
+
+F983 ; 65C5 ;  SA      # ( 旅 → 旅 ) CJK COMPATIBILITY IDEOGRAPH-F983 → CJK UNIFIED IDEOGRAPH-65C5       # 
+
+2F46 ; 65E0 ;  SA      #* ( ⽆ → 无 ) KANGXI RADICAL NOT → CJK UNIFIED IDEOGRAPH-65E0    # 
+
+2E9B ; 65E1 ;  SA      #* ( ⺛ → 旡 ) CJK RADICAL CHOKE → CJK UNIFIED IDEOGRAPH-65E1     # 
+
+FA42 ; 65E2 ;  SA      # ( 既 → 既 ) CJK COMPATIBILITY IDEOGRAPH-FA42 → CJK UNIFIED IDEOGRAPH-65E2       # 
+
+2F8CB ;        65E3 ;  SA      # ( 旣 → 旣 ) CJK COMPATIBILITY IDEOGRAPH-2F8CB → CJK UNIFIED IDEOGRAPH-65E3     # 
+
+2F47 ; 65E5 ;  SA      #* ( ⽇ → 日 ) KANGXI RADICAL SUN → CJK UNIFIED IDEOGRAPH-65E5    # 
+
+F9E0 ; 6613 ;  SA      # ( 易 → 易 ) CJK COMPATIBILITY IDEOGRAPH-F9E0 → CJK UNIFIED IDEOGRAPH-6613       # 
+
+2F8CD ;        6649 ;  SA      # ( 晉 → 晉 ) CJK COMPATIBILITY IDEOGRAPH-2F8CD → CJK UNIFIED IDEOGRAPH-6649     # 
+
+6669 ; 665A ;  SA      # ( 晩 → 晚 ) CJK UNIFIED IDEOGRAPH-6669 → CJK UNIFIED IDEOGRAPH-665A     # 
+
+FA12 ; 6674 ;  SA      # ( 晴 → 晴 ) CJK COMPATIBILITY IDEOGRAPH-FA12 → CJK UNIFIED IDEOGRAPH-6674       # 
+FA91 ; 6674 ;  SA      # ( 晴 → 晴 ) CJK COMPATIBILITY IDEOGRAPH-FA91 → CJK UNIFIED IDEOGRAPH-6674       # 
+
+F9C5 ; 6688 ;  SA      # ( 暈 → 暈 ) CJK COMPATIBILITY IDEOGRAPH-F9C5 → CJK UNIFIED IDEOGRAPH-6688       # 
+
+FA43 ; 6691 ;  SA      # ( 暑 → 暑 ) CJK COMPATIBILITY IDEOGRAPH-FA43 → CJK UNIFIED IDEOGRAPH-6691       # 
+2F8CF ;        6691 ;  SA      # ( 暑 → 暑 ) CJK COMPATIBILITY IDEOGRAPH-2F8CF → CJK UNIFIED IDEOGRAPH-6691     # 
+
+2F8D5 ;        669C ;  SA      # ( 暜 → 暜 ) CJK COMPATIBILITY IDEOGRAPH-2F8D5 → CJK UNIFIED IDEOGRAPH-669C     # 
+
+FA06 ; 66B4 ;  SA      # ( 暴 → 暴 ) CJK COMPATIBILITY IDEOGRAPH-FA06 → CJK UNIFIED IDEOGRAPH-66B4       # 
+
+F98B ; 66C6 ;  SA      # ( 曆 → 曆 ) CJK COMPATIBILITY IDEOGRAPH-F98B → CJK UNIFIED IDEOGRAPH-66C6       # 
+
+2F48 ; 66F0 ;  SA      #* ( ⽈ → 曰 ) KANGXI RADICAL SAY → CJK UNIFIED IDEOGRAPH-66F0    # 
+
+F901 ; 66F4 ;  SA      # ( 更 → 更 ) CJK COMPATIBILITY IDEOGRAPH-F901 → CJK UNIFIED IDEOGRAPH-66F4       # 
+
+2F8CC ;        66F8 ;  SA      # ( 書 → 書 ) CJK COMPATIBILITY IDEOGRAPH-2F8CC → CJK UNIFIED IDEOGRAPH-66F8     # 
+
+2F8D4 ;        6700 ;  SA      # ( 最 → 最 ) CJK COMPATIBILITY IDEOGRAPH-2F8D4 → CJK UNIFIED IDEOGRAPH-6700     # 
+
+2F49 ; 6708 ;  SA      #* ( ⽉ → 月 ) KANGXI RADICAL MOON → CJK UNIFIED IDEOGRAPH-6708   # 
+
+80A6 ; 670C ;  SA      # ( 肦 → 朌 ) CJK UNIFIED IDEOGRAPH-80A6 → CJK UNIFIED IDEOGRAPH-670C     # 
+
+80D0 ; 670F ;  SA      # ( 胐 → 朏 ) CJK UNIFIED IDEOGRAPH-80D0 → CJK UNIFIED IDEOGRAPH-670F     # 
+
+80CA ; 6710 ;  SA      # ( 胊 → 朐 ) CJK UNIFIED IDEOGRAPH-80CA → CJK UNIFIED IDEOGRAPH-6710     # 
+
+8101 ; 6713 ;  SA      # ( 脁 → 朓 ) CJK UNIFIED IDEOGRAPH-8101 → CJK UNIFIED IDEOGRAPH-6713     # 
+
+F929 ; 6717 ;  SA      # ( 朗 → 朗 ) CJK COMPATIBILITY IDEOGRAPH-F929 → CJK UNIFIED IDEOGRAPH-6717       # 
+FA92 ; 6717 ;  SA      # ( 朗 → 朗 ) CJK COMPATIBILITY IDEOGRAPH-FA92 → CJK UNIFIED IDEOGRAPH-6717       # 
+2F8D8 ;        6717 ;  SA      # ( 朗 → 朗 ) CJK COMPATIBILITY IDEOGRAPH-2F8D8 → CJK UNIFIED IDEOGRAPH-6717     # 
+
+8127 ; 6718 ;  SA      # ( 脧 → 朘 ) CJK UNIFIED IDEOGRAPH-8127 → CJK UNIFIED IDEOGRAPH-6718     # 
+
+FA93 ; 671B ;  SA      # ( 望 → 望 ) CJK COMPATIBILITY IDEOGRAPH-FA93 → CJK UNIFIED IDEOGRAPH-671B       # 
+2F8D9 ;        671B ;  SA      # ( 望 → 望 ) CJK COMPATIBILITY IDEOGRAPH-2F8D9 → CJK UNIFIED IDEOGRAPH-671B     # 
+
+2F8DA ;        6721 ;  SA      # ( 朡 → 朡 ) CJK COMPATIBILITY IDEOGRAPH-2F8DA → CJK UNIFIED IDEOGRAPH-6721     # 
+
+81A7 ; 6723 ;  SA      # ( 膧 → 朣 ) CJK UNIFIED IDEOGRAPH-81A7 → CJK UNIFIED IDEOGRAPH-6723     # 
+
+2F4A ; 6728 ;  SA      #* ( ⽊ → 木 ) KANGXI RADICAL TREE → CJK UNIFIED IDEOGRAPH-6728   # 
+
+F9E1 ; 674E ;  SA      # ( 李 → 李 ) CJK COMPATIBILITY IDEOGRAPH-F9E1 → CJK UNIFIED IDEOGRAPH-674E       # 
+
+2F8DC ;        6753 ;  SA      # ( 杓 → 杓 ) CJK COMPATIBILITY IDEOGRAPH-2F8DC → CJK UNIFIED IDEOGRAPH-6753     # 
+
+FA94 ; 6756 ;  SA      # ( 杖 → 杖 ) CJK COMPATIBILITY IDEOGRAPH-FA94 → CJK UNIFIED IDEOGRAPH-6756       # 
+
+2F8DB ;        675E ;  SA      # ( 杞 → 杞 ) CJK COMPATIBILITY IDEOGRAPH-2F8DB → CJK UNIFIED IDEOGRAPH-675E     # 
+
+67FF ; 676E ;  SA      # ( 柿 → 杮 ) CJK UNIFIED IDEOGRAPH-67FF → CJK UNIFIED IDEOGRAPH-676E     # 
+
+F9C8 ; 677B ;  SA      # ( 杻 → 杻 ) CJK COMPATIBILITY IDEOGRAPH-F9C8 → CJK UNIFIED IDEOGRAPH-677B       # 
+
+2F8E0 ;        6785 ;  SA      # ( 枅 → 枅 ) CJK COMPATIBILITY IDEOGRAPH-2F8E0 → CJK UNIFIED IDEOGRAPH-6785     # 
+
+F9F4 ; 6797 ;  SA      # ( 林 → 林 ) CJK COMPATIBILITY IDEOGRAPH-F9F4 → CJK UNIFIED IDEOGRAPH-6797       # 
+
+F9C9 ; 67F3 ;  SA      # ( 柳 → 柳 ) CJK COMPATIBILITY IDEOGRAPH-F9C9 → CJK UNIFIED IDEOGRAPH-67F3       # 
+
+2F8DF ;        67FA ;  SA      # ( 柺 → 柺 ) CJK COMPATIBILITY IDEOGRAPH-2F8DF → CJK UNIFIED IDEOGRAPH-67FA     # 
+
+F9DA ; 6817 ;  SA      # ( 栗 → 栗 ) CJK COMPATIBILITY IDEOGRAPH-F9DA → CJK UNIFIED IDEOGRAPH-6817       # 
+
+2F8E5 ;        681F ;  SA      # ( 栟 → 栟 ) CJK COMPATIBILITY IDEOGRAPH-2F8E5 → CJK UNIFIED IDEOGRAPH-681F     # 
+
+2F8E1 ;        6852 ;  SA      # ( 桒 → 桒 ) CJK COMPATIBILITY IDEOGRAPH-2F8E1 → CJK UNIFIED IDEOGRAPH-6852     # 
+
+F97A ; 6881 ;  SA      # ( 梁 → 梁 ) CJK COMPATIBILITY IDEOGRAPH-F97A → CJK UNIFIED IDEOGRAPH-6881       # 
+
+FA44 ; 6885 ;  SA      # ( 梅 → 梅 ) CJK COMPATIBILITY IDEOGRAPH-FA44 → CJK UNIFIED IDEOGRAPH-6885       # 
+2F8E2 ;        6885 ;  SA      # ( 梅 → 梅 ) CJK COMPATIBILITY IDEOGRAPH-2F8E2 → CJK UNIFIED IDEOGRAPH-6885     # 
+
+2F8E4 ;        688E ;  SA      # ( 梎 → 梎 ) CJK COMPATIBILITY IDEOGRAPH-2F8E4 → CJK UNIFIED IDEOGRAPH-688E     # 
+
+F9E2 ; 68A8 ;  SA      # ( 梨 → 梨 ) CJK COMPATIBILITY IDEOGRAPH-F9E2 → CJK UNIFIED IDEOGRAPH-68A8       # 
+
+2F8E6 ;        6914 ;  SA      # ( 椔 → 椔 ) CJK COMPATIBILITY IDEOGRAPH-2F8E6 → CJK UNIFIED IDEOGRAPH-6914     # 
+
+2F8E8 ;        6942 ;  SA      # ( 楂 → 楂 ) CJK COMPATIBILITY IDEOGRAPH-2F8E8 → CJK UNIFIED IDEOGRAPH-6942     # 
+
+6A27 ; 699D ;  SA      # ( 樧 → 榝 ) CJK UNIFIED IDEOGRAPH-6A27 → CJK UNIFIED IDEOGRAPH-699D     # 
+
+2F8E9 ;        69A3 ;  SA      # ( 榣 → 榣 ) CJK COMPATIBILITY IDEOGRAPH-2F8E9 → CJK UNIFIED IDEOGRAPH-69A3     # 
+
+2F8EA ;        69EA ;  SA      # ( 槪 → 槪 ) CJK COMPATIBILITY IDEOGRAPH-2F8EA → CJK UNIFIED IDEOGRAPH-69EA     # 
+
+F914 ; 6A02 ;  SA      # ( 樂 → 樂 ) CJK COMPATIBILITY IDEOGRAPH-F914 → CJK UNIFIED IDEOGRAPH-6A02       # 
+F95C ; 6A02 ;  SA      # ( 樂 → 樂 ) CJK COMPATIBILITY IDEOGRAPH-F95C → CJK UNIFIED IDEOGRAPH-6A02       # 
+F9BF ; 6A02 ;  SA      # ( 樂 → 樂 ) CJK COMPATIBILITY IDEOGRAPH-F9BF → CJK UNIFIED IDEOGRAPH-6A02       # 
+
+F94C ; 6A13 ;  SA      # ( 樓 → 樓 ) CJK COMPATIBILITY IDEOGRAPH-F94C → CJK UNIFIED IDEOGRAPH-6A13       # 
+
+2F8EB ;        6AA8 ;  SA      # ( 檨 → 檨 ) CJK COMPATIBILITY IDEOGRAPH-2F8EB → CJK UNIFIED IDEOGRAPH-6AA8     # 
+
+F931 ; 6AD3 ;  SA      # ( 櫓 → 櫓 ) CJK COMPATIBILITY IDEOGRAPH-F931 → CJK UNIFIED IDEOGRAPH-6AD3       # 
+
+2F8ED ;        6ADB ;  SA      # ( 櫛 → 櫛 ) CJK COMPATIBILITY IDEOGRAPH-2F8ED → CJK UNIFIED IDEOGRAPH-6ADB     # 
+
+F91D ; 6B04 ;  SA      # ( 欄 → 欄 ) CJK COMPATIBILITY IDEOGRAPH-F91D → CJK UNIFIED IDEOGRAPH-6B04       # 
+
+2F4B ; 6B20 ;  SA      #* ( ⽋ → 欠 ) KANGXI RADICAL LACK → CJK UNIFIED IDEOGRAPH-6B20   # 
+
+2F8EF ;        6B21 ;  SA      # ( 次 → 次 ) CJK COMPATIBILITY IDEOGRAPH-2F8EF → CJK UNIFIED IDEOGRAPH-6B21     # 
+
+2F8F1 ;        6B54 ;  SA      # ( 歔 → 歔 ) CJK COMPATIBILITY IDEOGRAPH-2F8F1 → CJK UNIFIED IDEOGRAPH-6B54     # 
+
+2F4C ; 6B62 ;  SA      #* ( ⽌ → 止 ) KANGXI RADICAL STOP → CJK UNIFIED IDEOGRAPH-6B62   # 
+
+2EED ; 6B6F ;  SA      #* ( ⻭ → 歯 ) CJK RADICAL J-SIMPLIFIED TOOTH → CJK UNIFIED IDEOGRAPH-6B6F        # 
+
+2F8F3 ;        6B72 ;  SA      # ( 歲 → 歲 ) CJK COMPATIBILITY IDEOGRAPH-2F8F3 → CJK UNIFIED IDEOGRAPH-6B72     # 
+
+F98C ; 6B77 ;  SA      # ( 歷 → 歷 ) CJK COMPATIBILITY IDEOGRAPH-F98C → CJK UNIFIED IDEOGRAPH-6B77       # 
+
+FA95 ; 6B79 ;  SA      # ( 歹 → 歹 ) CJK COMPATIBILITY IDEOGRAPH-FA95 → CJK UNIFIED IDEOGRAPH-6B79       # 
+2F4D ; 6B79 ;  SA      #* ( ⽍ → 歹 ) KANGXI RADICAL DEATH → CJK UNIFIED IDEOGRAPH-6B79  # 
+
+2E9E ; 6B7A ;  SA      #* ( ⺞ → 歺 ) CJK RADICAL DEATH → CJK UNIFIED IDEOGRAPH-6B7A     # 
+
+2F8F4 ;        6B9F ;  SA      # ( 殟 → 殟 ) CJK COMPATIBILITY IDEOGRAPH-2F8F4 → CJK UNIFIED IDEOGRAPH-6B9F     # 
+
+F9A5 ; 6BAE ;  SA      # ( 殮 → 殮 ) CJK COMPATIBILITY IDEOGRAPH-F9A5 → CJK UNIFIED IDEOGRAPH-6BAE       # 
+
+2F4E ; 6BB3 ;  SA      #* ( ⽎ → 殳 ) KANGXI RADICAL WEAPON → CJK UNIFIED IDEOGRAPH-6BB3 # 
+
+F970 ; 6BBA ;  SA      # ( 殺 → 殺 ) CJK COMPATIBILITY IDEOGRAPH-F970 → CJK UNIFIED IDEOGRAPH-6BBA       # 
+FA96 ; 6BBA ;  SA      # ( 殺 → 殺 ) CJK COMPATIBILITY IDEOGRAPH-FA96 → CJK UNIFIED IDEOGRAPH-6BBA       # 
+2F8F5 ;        6BBA ;  SA      # ( 殺 → 殺 ) CJK COMPATIBILITY IDEOGRAPH-2F8F5 → CJK UNIFIED IDEOGRAPH-6BBA     # 
+
+2F8F6 ;        6BBB ;  SA      # ( 殻 → 殻 ) CJK COMPATIBILITY IDEOGRAPH-2F8F6 → CJK UNIFIED IDEOGRAPH-6BBB     # 
+
+2F4F ; 6BCB ;  SA      #* ( ⽏ → 毋 ) KANGXI RADICAL DO NOT → CJK UNIFIED IDEOGRAPH-6BCB # 
+
+2E9F ; 6BCD ;  SA      #* ( ⺟ → 母 ) CJK RADICAL MOTHER → CJK UNIFIED IDEOGRAPH-6BCD    # 
+
+2F50 ; 6BD4 ;  SA      #* ( ⽐ → 比 ) KANGXI RADICAL COMPARE → CJK UNIFIED IDEOGRAPH-6BD4        # 
+
+2F51 ; 6BDB ;  SA      #* ( ⽑ → 毛 ) KANGXI RADICAL FUR → CJK UNIFIED IDEOGRAPH-6BDB    # 
+
+2F52 ; 6C0F ;  SA      #* ( ⽒ → 氏 ) KANGXI RADICAL CLAN → CJK UNIFIED IDEOGRAPH-6C0F   # 
+
+2EA0 ; 6C11 ;  SA      #* ( ⺠ → 民 ) CJK RADICAL CIVILIAN → CJK UNIFIED IDEOGRAPH-6C11  # 
+
+2F53 ; 6C14 ;  SA      #* ( ⽓ → 气 ) KANGXI RADICAL STEAM → CJK UNIFIED IDEOGRAPH-6C14  # 
+
+2F54 ; 6C34 ;  SA      #* ( ⽔ → 水 ) KANGXI RADICAL WATER → CJK UNIFIED IDEOGRAPH-6C34  # 
+
+2EA1 ; 6C35 ;  SA      #* ( ⺡ → 氵 ) CJK RADICAL WATER ONE → CJK UNIFIED IDEOGRAPH-6C35 # 
+
+2EA2 ; 6C3A ;  SA      #* ( ⺢ → 氺 ) CJK RADICAL WATER TWO → CJK UNIFIED IDEOGRAPH-6C3A # 
+
+2F8FA ;        6C4E ;  SA      # ( 汎 → 汎 ) CJK COMPATIBILITY IDEOGRAPH-2F8FA → CJK UNIFIED IDEOGRAPH-6C4E     # 
+
+2F8FE ;        6C67 ;  SA      # ( 汧 → 汧 ) CJK COMPATIBILITY IDEOGRAPH-2F8FE → CJK UNIFIED IDEOGRAPH-6C67     # 
+
+F972 ; 6C88 ;  SA      # ( 沈 → 沈 ) CJK COMPATIBILITY IDEOGRAPH-F972 → CJK UNIFIED IDEOGRAPH-6C88       # 
+
+2F8FC ;        6CBF ;  SA      # ( 沿 → 沿 ) CJK COMPATIBILITY IDEOGRAPH-2F8FC → CJK UNIFIED IDEOGRAPH-6CBF     # 
+
+F968 ; 6CCC ;  SA      # ( 泌 → 泌 ) CJK COMPATIBILITY IDEOGRAPH-F968 → CJK UNIFIED IDEOGRAPH-6CCC       # 
+
+2F8FD ;        6CCD ;  SA      # ( 泍 → 泍 ) CJK COMPATIBILITY IDEOGRAPH-2F8FD → CJK UNIFIED IDEOGRAPH-6CCD     # 
+
+F9E3 ; 6CE5 ;  SA      # ( 泥 → 泥 ) CJK COMPATIBILITY IDEOGRAPH-F9E3 → CJK UNIFIED IDEOGRAPH-6CE5       # 
+
+2F8FF ;        6D16 ;  SA      # ( 洖 → 洖 ) CJK COMPATIBILITY IDEOGRAPH-2F8FF → CJK UNIFIED IDEOGRAPH-6D16     # 
+
+F915 ; 6D1B ;  SA      # ( 洛 → 洛 ) CJK COMPATIBILITY IDEOGRAPH-F915 → CJK UNIFIED IDEOGRAPH-6D1B       # 
+
+FA05 ; 6D1E ;  SA      # ( 洞 → 洞 ) CJK COMPATIBILITY IDEOGRAPH-FA05 → CJK UNIFIED IDEOGRAPH-6D1E       # 
+
+2F907 ;        6D34 ;  SA      # ( 洴 → 洴 ) CJK COMPATIBILITY IDEOGRAPH-2F907 → CJK UNIFIED IDEOGRAPH-6D34     # 
+
+2F900 ;        6D3E ;  SA      # ( 派 → 派 ) CJK COMPATIBILITY IDEOGRAPH-2F900 → CJK UNIFIED IDEOGRAPH-6D3E     # 
+
+F9CA ; 6D41 ;  SA      # ( 流 → 流 ) CJK COMPATIBILITY IDEOGRAPH-F9CA → CJK UNIFIED IDEOGRAPH-6D41       # 
+FA97 ; 6D41 ;  SA      # ( 流 → 流 ) CJK COMPATIBILITY IDEOGRAPH-FA97 → CJK UNIFIED IDEOGRAPH-6D41       # 
+2F902 ;        6D41 ;  SA      # ( 流 → 流 ) CJK COMPATIBILITY IDEOGRAPH-2F902 → CJK UNIFIED IDEOGRAPH-6D41     # 
+
+2F903 ;        6D69 ;  SA      # ( 浩 → 浩 ) CJK COMPATIBILITY IDEOGRAPH-2F903 → CJK UNIFIED IDEOGRAPH-6D69     # 
+
+F92A ; 6D6A ;  SA      # ( 浪 → 浪 ) CJK COMPATIBILITY IDEOGRAPH-F92A → CJK UNIFIED IDEOGRAPH-6D6A       # 
+
+FA45 ; 6D77 ;  SA      # ( 海 → 海 ) CJK COMPATIBILITY IDEOGRAPH-FA45 → CJK UNIFIED IDEOGRAPH-6D77       # 
+2F901 ;        6D77 ;  SA      # ( 海 → 海 ) CJK COMPATIBILITY IDEOGRAPH-2F901 → CJK UNIFIED IDEOGRAPH-6D77     # 
+
+2F904 ;        6D78 ;  SA      # ( 浸 → 浸 ) CJK COMPATIBILITY IDEOGRAPH-2F904 → CJK UNIFIED IDEOGRAPH-6D78     # 
+
+2F905 ;        6D85 ;  SA      # ( 涅 → 涅 ) CJK COMPATIBILITY IDEOGRAPH-2F905 → CJK UNIFIED IDEOGRAPH-6D85     # 
+
+F9F5 ; 6DCB ;  SA      # ( 淋 → 淋 ) CJK COMPATIBILITY IDEOGRAPH-F9F5 → CJK UNIFIED IDEOGRAPH-6DCB       # 
+
+F94D ; 6DDA ;  SA      # ( 淚 → 淚 ) CJK COMPATIBILITY IDEOGRAPH-F94D → CJK UNIFIED IDEOGRAPH-6DDA       # 
+
+F9D6 ; 6DEA ;  SA      # ( 淪 → 淪 ) CJK COMPATIBILITY IDEOGRAPH-F9D6 → CJK UNIFIED IDEOGRAPH-6DEA       # 
+
+2F90E ;        6DF9 ;  SA      # ( 淹 → 淹 ) CJK COMPATIBILITY IDEOGRAPH-2F90E → CJK UNIFIED IDEOGRAPH-6DF9     # 
+
+FA46 ; 6E1A ;  SA      # ( 渚 → 渚 ) CJK COMPATIBILITY IDEOGRAPH-FA46 → CJK UNIFIED IDEOGRAPH-6E1A       # 
+
+2F908 ;        6E2F ;  SA      # ( 港 → 港 ) CJK COMPATIBILITY IDEOGRAPH-2F908 → CJK UNIFIED IDEOGRAPH-6E2F     # 
+
+2F909 ;        6E6E ;  SA      # ( 湮 → 湮 ) CJK COMPATIBILITY IDEOGRAPH-2F909 → CJK UNIFIED IDEOGRAPH-6E6E     # 
+
+6F59 ; 6E88 ;  SA      # ( 潙 → 溈 ) CJK UNIFIED IDEOGRAPH-6F59 → CJK UNIFIED IDEOGRAPH-6E88     # 
+
+F9CB ; 6E9C ;  SA      # ( 溜 → 溜 ) CJK COMPATIBILITY IDEOGRAPH-F9CB → CJK UNIFIED IDEOGRAPH-6E9C       # 
+
+F9EC ; 6EBA ;  SA      # ( 溺 → 溺 ) CJK COMPATIBILITY IDEOGRAPH-F9EC → CJK UNIFIED IDEOGRAPH-6EBA       # 
+
+2F90C ;        6EC7 ;  SA      # ( 滇 → 滇 ) CJK COMPATIBILITY IDEOGRAPH-2F90C → CJK UNIFIED IDEOGRAPH-6EC7     # 
+
+FA99 ; 6ECB ;  SA      # ( 滋 → 滋 ) CJK COMPATIBILITY IDEOGRAPH-FA99 → CJK UNIFIED IDEOGRAPH-6ECB       # 
+2F90B ;        6ECB ;  SA      # ( 滋 → 滋 ) CJK COMPATIBILITY IDEOGRAPH-2F90B → CJK UNIFIED IDEOGRAPH-6ECB     # 
+
+F904 ; 6ED1 ;  SA      # ( 滑 → 滑 ) CJK COMPATIBILITY IDEOGRAPH-F904 → CJK UNIFIED IDEOGRAPH-6ED1       # 
+
+FA98 ; 6EDB ;  SA      # ( 滛 → 滛 ) CJK COMPATIBILITY IDEOGRAPH-FA98 → CJK UNIFIED IDEOGRAPH-6EDB       # 
+
+F94E ; 6F0F ;  SA      # ( 漏 → 漏 ) CJK COMPATIBILITY IDEOGRAPH-F94E → CJK UNIFIED IDEOGRAPH-6F0F       # 
+
+FA47 ; 6F22 ;  SA      # ( 漢 → 漢 ) CJK COMPATIBILITY IDEOGRAPH-FA47 → CJK UNIFIED IDEOGRAPH-6F22       # 
+FA9A ; 6F22 ;  SA      # ( 漢 → 漢 ) CJK COMPATIBILITY IDEOGRAPH-FA9A → CJK UNIFIED IDEOGRAPH-6F22       # 
+
+F992 ; 6F23 ;  SA      # ( 漣 → 漣 ) CJK COMPATIBILITY IDEOGRAPH-F992 → CJK UNIFIED IDEOGRAPH-6F23       # 
+
+2F90F ;        6F6E ;  SA      # ( 潮 → 潮 ) CJK COMPATIBILITY IDEOGRAPH-2F90F → CJK UNIFIED IDEOGRAPH-6F6E     # 
+
+2F912 ;        6FC6 ;  SA      # ( 濆 → 濆 ) CJK COMPATIBILITY IDEOGRAPH-2F912 → CJK UNIFIED IDEOGRAPH-6FC6     # 
+
+F922 ; 6FEB ;  SA      # ( 濫 → 濫 ) CJK COMPATIBILITY IDEOGRAPH-F922 → CJK UNIFIED IDEOGRAPH-6FEB       # 
+
+F984 ; 6FFE ;  SA      # ( 濾 → 濾 ) CJK COMPATIBILITY IDEOGRAPH-F984 → CJK UNIFIED IDEOGRAPH-6FFE       # 
+
+2F915 ;        701B ;  SA      # ( 瀛 → 瀛 ) CJK COMPATIBILITY IDEOGRAPH-2F915 → CJK UNIFIED IDEOGRAPH-701B     # 
+
+FA9B ; 701E ;  SA      # ( 瀞 → 瀞 ) CJK COMPATIBILITY IDEOGRAPH-FA9B → CJK UNIFIED IDEOGRAPH-701E       # 
+2F914 ;        701E ;  SA      # ( 瀞 → 瀞 ) CJK COMPATIBILITY IDEOGRAPH-2F914 → CJK UNIFIED IDEOGRAPH-701E     # 
+
+2F913 ;        7039 ;  SA      # ( 瀹 → 瀹 ) CJK COMPATIBILITY IDEOGRAPH-2F913 → CJK UNIFIED IDEOGRAPH-7039     # 
+
+2F917 ;        704A ;  SA      # ( 灊 → 灊 ) CJK COMPATIBILITY IDEOGRAPH-2F917 → CJK UNIFIED IDEOGRAPH-704A     # 
+
+2F55 ; 706B ;  SA      #* ( ⽕ → 火 ) KANGXI RADICAL FIRE → CJK UNIFIED IDEOGRAPH-706B   # 
+
+2EA3 ; 706C ;  SA      #* ( ⺣ → 灬 ) CJK RADICAL FIRE → CJK UNIFIED IDEOGRAPH-706C      # 
+
+2F835 ;        7070 ;  SA      # ( 灰 → 灰 ) CJK COMPATIBILITY IDEOGRAPH-2F835 → CJK UNIFIED IDEOGRAPH-7070     # 
+
+2F919 ;        7077 ;  SA      # ( 灷 → 灷 ) CJK COMPATIBILITY IDEOGRAPH-2F919 → CJK UNIFIED IDEOGRAPH-7077     # 
+
+2F918 ;        707D ;  SA      # ( 災 → 災 ) CJK COMPATIBILITY IDEOGRAPH-2F918 → CJK UNIFIED IDEOGRAPH-707D     # 
+
+F9FB ; 7099 ;  SA      # ( 炙 → 炙 ) CJK COMPATIBILITY IDEOGRAPH-F9FB → CJK UNIFIED IDEOGRAPH-7099       # 
+
+2F91A ;        70AD ;  SA      # ( 炭 → 炭 ) CJK COMPATIBILITY IDEOGRAPH-2F91A → CJK UNIFIED IDEOGRAPH-70AD     # 
+
+F99F ; 70C8 ;  SA      # ( 烈 → 烈 ) CJK COMPATIBILITY IDEOGRAPH-F99F → CJK UNIFIED IDEOGRAPH-70C8       # 
+
+F916 ; 70D9 ;  SA      # ( 烙 → 烙 ) CJK COMPATIBILITY IDEOGRAPH-F916 → CJK UNIFIED IDEOGRAPH-70D9       # 
+
+2F91C ;        7145 ;  SA      # ( 煅 → 煅 ) CJK COMPATIBILITY IDEOGRAPH-2F91C → CJK UNIFIED IDEOGRAPH-7145     # 
+
+F993 ; 7149 ;  SA      # ( 煉 → 煉 ) CJK COMPATIBILITY IDEOGRAPH-F993 → CJK UNIFIED IDEOGRAPH-7149       # 
+
+FA48 ; 716E ;  SA      # ( 煮 → 煮 ) CJK COMPATIBILITY IDEOGRAPH-FA48 → CJK UNIFIED IDEOGRAPH-716E       # 
+FA9C ; 716E ;  SA      # ( 煮 → 煮 ) CJK COMPATIBILITY IDEOGRAPH-FA9C → CJK UNIFIED IDEOGRAPH-716E       # 
+
+2F91E ;        719C ;  SA      # ( 熜 → 熜 ) CJK COMPATIBILITY IDEOGRAPH-2F91E → CJK UNIFIED IDEOGRAPH-719C     # 
+
+F9C0 ; 71CE ;  SA      # ( 燎 → 燎 ) CJK COMPATIBILITY IDEOGRAPH-F9C0 → CJK UNIFIED IDEOGRAPH-71CE       # 
+
+F9EE ; 71D0 ;  SA      # ( 燐 → 燐 ) CJK COMPATIBILITY IDEOGRAPH-F9EE → CJK UNIFIED IDEOGRAPH-71D0       # 
+
+F932 ; 7210 ;  SA      # ( 爐 → 爐 ) CJK COMPATIBILITY IDEOGRAPH-F932 → CJK UNIFIED IDEOGRAPH-7210       # 
+
+F91E ; 721B ;  SA      # ( 爛 → 爛 ) CJK COMPATIBILITY IDEOGRAPH-F91E → CJK UNIFIED IDEOGRAPH-721B       # 
+
+2F920 ;        7228 ;  SA      # ( 爨 → 爨 ) CJK COMPATIBILITY IDEOGRAPH-2F920 → CJK UNIFIED IDEOGRAPH-7228     # 
+
+2F56 ; 722A ;  SA      #* ( ⽖ → 爪 ) KANGXI RADICAL CLAW → CJK UNIFIED IDEOGRAPH-722A   # 
+
+FA49 ; 722B ;  SA      # ( 爫 → 爫 ) CJK COMPATIBILITY IDEOGRAPH-FA49 → CJK UNIFIED IDEOGRAPH-722B       # 
+2EA4 ; 722B ;  SA      #* ( ⺤ → 爫 ) CJK RADICAL PAW ONE → CJK UNIFIED IDEOGRAPH-722B   # 
+
+FA9E ; 7235 ;  SA      # ( 爵 → 爵 ) CJK COMPATIBILITY IDEOGRAPH-FA9E → CJK UNIFIED IDEOGRAPH-7235       # 
+2F921 ;        7235 ;  SA      # ( 爵 → 爵 ) CJK COMPATIBILITY IDEOGRAPH-2F921 → CJK UNIFIED IDEOGRAPH-7235     # 
+
+2F57 ; 7236 ;  SA      #* ( ⽗ → 父 ) KANGXI RADICAL FATHER → CJK UNIFIED IDEOGRAPH-7236 # 
+
+2F58 ; 723B ;  SA      #* ( ⽘ → 爻 ) KANGXI RADICAL DOUBLE X → CJK UNIFIED IDEOGRAPH-723B       # 
+
+2F59 ; 723F ;  SA      #* ( ⽙ → 爿 ) KANGXI RADICAL HALF TREE TRUNK → CJK UNIFIED IDEOGRAPH-723F        # 
+
+2F5A ; 7247 ;  SA      #* ( ⽚ → 片 ) KANGXI RADICAL SLICE → CJK UNIFIED IDEOGRAPH-7247  # 
+
+2F922 ;        7250 ;  SA      # ( 牐 → 牐 ) CJK COMPATIBILITY IDEOGRAPH-2F922 → CJK UNIFIED IDEOGRAPH-7250     # 
+
+2F5B ; 7259 ;  SA      #* ( ⽛ → 牙 ) KANGXI RADICAL FANG → CJK UNIFIED IDEOGRAPH-7259   # 
+
+2F5C ; 725B ;  SA      #* ( ⽜ → 牛 ) KANGXI RADICAL COW → CJK UNIFIED IDEOGRAPH-725B    # 
+
+F946 ; 7262 ;  SA      # ( 牢 → 牢 ) CJK COMPATIBILITY IDEOGRAPH-F946 → CJK UNIFIED IDEOGRAPH-7262       # 
+
+2F924 ;        7280 ;  SA      # ( 犀 → 犀 ) CJK COMPATIBILITY IDEOGRAPH-2F924 → CJK UNIFIED IDEOGRAPH-7280     # 
+
+2F925 ;        7295 ;  SA      # ( 犕 → 犕 ) CJK COMPATIBILITY IDEOGRAPH-2F925 → CJK UNIFIED IDEOGRAPH-7295     # 
+
+2F5D ; 72AC ;  SA      #* ( ⽝ → 犬 ) KANGXI RADICAL DOG → CJK UNIFIED IDEOGRAPH-72AC    # 
+
+2EA8 ; 72AD ;  SA      #* ( ⺨ → 犭 ) CJK RADICAL DOG → CJK UNIFIED IDEOGRAPH-72AD       # 
+
+FA9F ; 72AF ;  SA      # ( 犯 → 犯 ) CJK COMPATIBILITY IDEOGRAPH-FA9F → CJK UNIFIED IDEOGRAPH-72AF       # 
+
+F9FA ; 72C0 ;  SA      # ( 狀 → 狀 ) CJK COMPATIBILITY IDEOGRAPH-F9FA → CJK UNIFIED IDEOGRAPH-72C0       # 
+
+F92B ; 72FC ;  SA      # ( 狼 → 狼 ) CJK COMPATIBILITY IDEOGRAPH-F92B → CJK UNIFIED IDEOGRAPH-72FC       # 
+
+FA16 ; 732A ;  SA      # ( 猪 → 猪 ) CJK COMPATIBILITY IDEOGRAPH-FA16 → CJK UNIFIED IDEOGRAPH-732A       # 
+FAA0 ; 732A ;  SA      # ( 猪 → 猪 ) CJK COMPATIBILITY IDEOGRAPH-FAA0 → CJK UNIFIED IDEOGRAPH-732A       # 
+
+F9A7 ; 7375 ;  SA      # ( 獵 → 獵 ) CJK COMPATIBILITY IDEOGRAPH-F9A7 → CJK UNIFIED IDEOGRAPH-7375       # 
+
+2F928 ;        737A ;  SA      # ( 獺 → 獺 ) CJK COMPATIBILITY IDEOGRAPH-2F928 → CJK UNIFIED IDEOGRAPH-737A     # 
+
+2F5E ; 7384 ;  SA      #* ( ⽞ → 玄 ) KANGXI RADICAL PROFOUND → CJK UNIFIED IDEOGRAPH-7384       # 
+
+F961 ; 7387 ;  SA      # ( 率 → 率 ) CJK COMPATIBILITY IDEOGRAPH-F961 → CJK UNIFIED IDEOGRAPH-7387       # 
+F9DB ; 7387 ;  SA      # ( 率 → 率 ) CJK COMPATIBILITY IDEOGRAPH-F9DB → CJK UNIFIED IDEOGRAPH-7387       # 
+
+2F5F ; 7389 ;  SA      #* ( ⽟ → 玉 ) KANGXI RADICAL JADE → CJK UNIFIED IDEOGRAPH-7389   # 
+
+2F929 ;        738B ;  SA      # ( 王 → 王 ) CJK COMPATIBILITY IDEOGRAPH-2F929 → CJK UNIFIED IDEOGRAPH-738B     # 
+
+2F92B ;        73A5 ;  SA      # ( 玥 → 玥 ) CJK COMPATIBILITY IDEOGRAPH-2F92B → CJK UNIFIED IDEOGRAPH-73A5     # 
+
+F9AD ; 73B2 ;  SA      # ( 玲 → 玲 ) CJK COMPATIBILITY IDEOGRAPH-F9AD → CJK UNIFIED IDEOGRAPH-73B2       # 
+
+F917 ; 73DE ;  SA      # ( 珞 → 珞 ) CJK COMPATIBILITY IDEOGRAPH-F917 → CJK UNIFIED IDEOGRAPH-73DE       # 
+
+F9E4 ; 7406 ;  SA      # ( 理 → 理 ) CJK COMPATIBILITY IDEOGRAPH-F9E4 → CJK UNIFIED IDEOGRAPH-7406       # 
+
+F9CC ; 7409 ;  SA      # ( 琉 → 琉 ) CJK COMPATIBILITY IDEOGRAPH-F9CC → CJK UNIFIED IDEOGRAPH-7409       # 
+
+FA4A ; 7422 ;  SA      # ( 琢 → 琢 ) CJK COMPATIBILITY IDEOGRAPH-FA4A → CJK UNIFIED IDEOGRAPH-7422       # 
+
+2F92E ;        7447 ;  SA      # ( 瑇 → 瑇 ) CJK COMPATIBILITY IDEOGRAPH-2F92E → CJK UNIFIED IDEOGRAPH-7447     # 
+
+2F92F ;        745C ;  SA      # ( 瑜 → 瑜 ) CJK COMPATIBILITY IDEOGRAPH-2F92F → CJK UNIFIED IDEOGRAPH-745C     # 
+
+F9AE ; 7469 ;  SA      # ( 瑩 → 瑩 ) CJK COMPATIBILITY IDEOGRAPH-F9AE → CJK UNIFIED IDEOGRAPH-7469       # 
+
+FAA1 ; 7471 ;  SA      # ( 瑱 → 瑱 ) CJK COMPATIBILITY IDEOGRAPH-FAA1 → CJK UNIFIED IDEOGRAPH-7471       # 
+2F930 ;        7471 ;  SA      # ( 瑱 → 瑱 ) CJK COMPATIBILITY IDEOGRAPH-2F930 → CJK UNIFIED IDEOGRAPH-7471     # 
+
+2F931 ;        7485 ;  SA      # ( 璅 → 璅 ) CJK COMPATIBILITY IDEOGRAPH-2F931 → CJK UNIFIED IDEOGRAPH-7485     # 
+
+F994 ; 7489 ;  SA      # ( 璉 → 璉 ) CJK COMPATIBILITY IDEOGRAPH-F994 → CJK UNIFIED IDEOGRAPH-7489       # 
+
+F9EF ; 7498 ;  SA      # ( 璘 → 璘 ) CJK COMPATIBILITY IDEOGRAPH-F9EF → CJK UNIFIED IDEOGRAPH-7498       # 
+
+2F932 ;        74CA ;  SA      # ( 瓊 → 瓊 ) CJK COMPATIBILITY IDEOGRAPH-2F932 → CJK UNIFIED IDEOGRAPH-74CA     # 
+
+2F60 ; 74DC ;  SA      #* ( ⽠ → 瓜 ) KANGXI RADICAL MELON → CJK UNIFIED IDEOGRAPH-74DC  # 
+
+2F61 ; 74E6 ;  SA      #* ( ⽡ → 瓦 ) KANGXI RADICAL TILE → CJK UNIFIED IDEOGRAPH-74E6   # 
+
+FAA2 ; 7506 ;  SA      # ( 甆 → 甆 ) CJK COMPATIBILITY IDEOGRAPH-FAA2 → CJK UNIFIED IDEOGRAPH-7506       # 
+
+2F62 ; 7518 ;  SA      #* ( ⽢ → 甘 ) KANGXI RADICAL SWEET → CJK UNIFIED IDEOGRAPH-7518  # 
+
+2F63 ; 751F ;  SA      #* ( ⽣ → 生 ) KANGXI RADICAL LIFE → CJK UNIFIED IDEOGRAPH-751F   # 
+
+2F934 ;        7524 ;  SA      # ( 甤 → 甤 ) CJK COMPATIBILITY IDEOGRAPH-2F934 → CJK UNIFIED IDEOGRAPH-7524     # 
+
+2F64 ; 7528 ;  SA      #* ( ⽤ → 用 ) KANGXI RADICAL USE → CJK UNIFIED IDEOGRAPH-7528    # 
+
+2F65 ; 7530 ;  SA      #* ( ⽥ → 田 ) KANGXI RADICAL FIELD → CJK UNIFIED IDEOGRAPH-7530  # 
+
+FAA3 ; 753B ;  SA      # ( 画 → 画 ) CJK COMPATIBILITY IDEOGRAPH-FAA3 → CJK UNIFIED IDEOGRAPH-753B       # 
+
+2F936 ;        753E ;  SA      # ( 甾 → 甾 ) CJK COMPATIBILITY IDEOGRAPH-2F936 → CJK UNIFIED IDEOGRAPH-753E     # 
+
+F9CD ; 7559 ;  SA      # ( 留 → 留 ) CJK COMPATIBILITY IDEOGRAPH-F9CD → CJK UNIFIED IDEOGRAPH-7559       # 
+
+F976 ; 7565 ;  SA      # ( 略 → 略 ) CJK COMPATIBILITY IDEOGRAPH-F976 → CJK UNIFIED IDEOGRAPH-7565       # 
+
+F962 ; 7570 ;  SA      # ( 異 → 異 ) CJK COMPATIBILITY IDEOGRAPH-F962 → CJK UNIFIED IDEOGRAPH-7570       # 
+2F938 ;        7570 ;  SA      # ( 異 → 異 ) CJK COMPATIBILITY IDEOGRAPH-2F938 → CJK UNIFIED IDEOGRAPH-7570     # 
+
+2F66 ; 758B ;  SA      #* ( ⽦ → 疋 ) KANGXI RADICAL BOLT OF CLOTH → CJK UNIFIED IDEOGRAPH-758B  # 
+
+2F67 ; 7592 ;  SA      #* ( ⽧ → 疒 ) KANGXI RADICAL SICKNESS → CJK UNIFIED IDEOGRAPH-7592       # 
+
+F9E5 ; 75E2 ;  SA      # ( 痢 → 痢 ) CJK COMPATIBILITY IDEOGRAPH-F9E5 → CJK UNIFIED IDEOGRAPH-75E2       # 
+
+2F93A ;        7610 ;  SA      # ( 瘐 → 瘐 ) CJK COMPATIBILITY IDEOGRAPH-2F93A → CJK UNIFIED IDEOGRAPH-7610     # 
+
+FAA4 ; 761D ;  SA      # ( 瘝 → 瘝 ) CJK COMPATIBILITY IDEOGRAPH-FAA4 → CJK UNIFIED IDEOGRAPH-761D       # 
+
+FAA5 ; 761F ;  SA      # ( 瘟 → 瘟 ) CJK COMPATIBILITY IDEOGRAPH-FAA5 → CJK UNIFIED IDEOGRAPH-761F       # 
+
+F9C1 ; 7642 ;  SA      # ( 療 → 療 ) CJK COMPATIBILITY IDEOGRAPH-F9C1 → CJK UNIFIED IDEOGRAPH-7642       # 
+
+F90E ; 7669 ;  SA      # ( 癩 → 癩 ) CJK COMPATIBILITY IDEOGRAPH-F90E → CJK UNIFIED IDEOGRAPH-7669       # 
+
+2F68 ; 7676 ;  SA      #* ( ⽨ → 癶 ) KANGXI RADICAL DOTTED TENT → CJK UNIFIED IDEOGRAPH-7676    # 
+
+2F69 ; 767D ;  SA      #* ( ⽩ → 白 ) KANGXI RADICAL WHITE → CJK UNIFIED IDEOGRAPH-767D  # 
+
+2F6A ; 76AE ;  SA      #* ( ⽪ → 皮 ) KANGXI RADICAL SKIN → CJK UNIFIED IDEOGRAPH-76AE   # 
+
+2F6B ; 76BF ;  SA      #* ( ⽫ → 皿 ) KANGXI RADICAL DISH → CJK UNIFIED IDEOGRAPH-76BF   # 
+
+FA17 ; 76CA ;  SA      # ( 益 → 益 ) CJK COMPATIBILITY IDEOGRAPH-FA17 → CJK UNIFIED IDEOGRAPH-76CA       # 
+FAA6 ; 76CA ;  SA      # ( 益 → 益 ) CJK COMPATIBILITY IDEOGRAPH-FAA6 → CJK UNIFIED IDEOGRAPH-76CA       # 
+
+FAA7 ; 76DB ;  SA      # ( 盛 → 盛 ) CJK COMPATIBILITY IDEOGRAPH-FAA7 → CJK UNIFIED IDEOGRAPH-76DB       # 
+
+F933 ; 76E7 ;  SA      # ( 盧 → 盧 ) CJK COMPATIBILITY IDEOGRAPH-F933 → CJK UNIFIED IDEOGRAPH-76E7       # 
+
+2F6C ; 76EE ;  SA      #* ( ⽬ → 目 ) KANGXI RADICAL EYE → CJK UNIFIED IDEOGRAPH-76EE    # 
+
+FAA8 ; 76F4 ;  SA      # ( 直 → 直 ) CJK COMPATIBILITY IDEOGRAPH-FAA8 → CJK UNIFIED IDEOGRAPH-76F4       # 
+2F940 ;        76F4 ;  SA      # ( 直 → 直 ) CJK COMPATIBILITY IDEOGRAPH-2F940 → CJK UNIFIED IDEOGRAPH-76F4     # 
+
+F96D ; 7701 ;  SA      # ( 省 → 省 ) CJK COMPATIBILITY IDEOGRAPH-F96D → CJK UNIFIED IDEOGRAPH-7701       # 
+
+2F945 ;        771E ;  SA      # ( 眞 → 眞 ) CJK COMPATIBILITY IDEOGRAPH-2F945 → CJK UNIFIED IDEOGRAPH-771E     # 
+
+2F946 ;        771F ;  SA      # ( 真 → 真 ) CJK COMPATIBILITY IDEOGRAPH-2F946 → CJK UNIFIED IDEOGRAPH-771F     # 
+2F947 ;        771F ;  SA      # ( 真 → 真 ) CJK COMPATIBILITY IDEOGRAPH-2F947 → CJK UNIFIED IDEOGRAPH-771F     # 
+
+FAAA ; 7740 ;  SA      # ( 着 → 着 ) CJK COMPATIBILITY IDEOGRAPH-FAAA → CJK UNIFIED IDEOGRAPH-7740       # 
+
+FAA9 ; 774A ;  SA      # ( 睊 → 睊 ) CJK COMPATIBILITY IDEOGRAPH-FAA9 → CJK UNIFIED IDEOGRAPH-774A       # 
+2F948 ;        774A ;  SA      # ( 睊 → 睊 ) CJK COMPATIBILITY IDEOGRAPH-2F948 → CJK UNIFIED IDEOGRAPH-774A     # 
+
+2F94A ;        778B ;  SA      # ( 瞋 → 瞋 ) CJK COMPATIBILITY IDEOGRAPH-2F94A → CJK UNIFIED IDEOGRAPH-778B     # 
+
+FA9D ; 77A7 ;  SA      # ( 瞧 → 瞧 ) CJK COMPATIBILITY IDEOGRAPH-FA9D → CJK UNIFIED IDEOGRAPH-77A7       # 
+
+2F6D ; 77DB ;  SA      #* ( ⽭ → 矛 ) KANGXI RADICAL SPEAR → CJK UNIFIED IDEOGRAPH-77DB  # 
+
+2F6E ; 77E2 ;  SA      #* ( ⽮ → 矢 ) KANGXI RADICAL ARROW → CJK UNIFIED IDEOGRAPH-77E2  # 
+
+2F6F ; 77F3 ;  SA      #* ( ⽯ → 石 ) KANGXI RADICAL STONE → CJK UNIFIED IDEOGRAPH-77F3  # 
+
+784F ; 7814 ;  SA      # ( 硏 → 研 ) CJK UNIFIED IDEOGRAPH-784F → CJK UNIFIED IDEOGRAPH-7814     # 
+
+2F94E ;        784E ;  SA      # ( 硎 → 硎 ) CJK COMPATIBILITY IDEOGRAPH-2F94E → CJK UNIFIED IDEOGRAPH-784E     # 
+
+F9CE ; 786B ;  SA      # ( 硫 → 硫 ) CJK COMPATIBILITY IDEOGRAPH-F9CE → CJK UNIFIED IDEOGRAPH-786B       # 
+
+F93B ; 788C ;  SA      # ( 碌 → 碌 ) CJK COMPATIBILITY IDEOGRAPH-F93B → CJK UNIFIED IDEOGRAPH-788C       # 
+2F94F ;        788C ;  SA      # ( 碌 → 碌 ) CJK COMPATIBILITY IDEOGRAPH-2F94F → CJK UNIFIED IDEOGRAPH-788C     # 
+
+FA4B ; 7891 ;  SA      # ( 碑 → 碑 ) CJK COMPATIBILITY IDEOGRAPH-FA4B → CJK UNIFIED IDEOGRAPH-7891       # 
+
+F947 ; 78CA ;  SA      # ( 磊 → 磊 ) CJK COMPATIBILITY IDEOGRAPH-F947 → CJK UNIFIED IDEOGRAPH-78CA       # 
+
+FAAB ; 78CC ;  SA      # ( 磌 → 磌 ) CJK COMPATIBILITY IDEOGRAPH-FAAB → CJK UNIFIED IDEOGRAPH-78CC       # 
+2F950 ;        78CC ;  SA      # ( 磌 → 磌 ) CJK COMPATIBILITY IDEOGRAPH-2F950 → CJK UNIFIED IDEOGRAPH-78CC     # 
+
+F964 ; 78FB ;  SA      # ( 磻 → 磻 ) CJK COMPATIBILITY IDEOGRAPH-F964 → CJK UNIFIED IDEOGRAPH-78FB       # 
+
+F985 ; 792A ;  SA      # ( 礪 → 礪 ) CJK COMPATIBILITY IDEOGRAPH-F985 → CJK UNIFIED IDEOGRAPH-792A       # 
+
+2F70 ; 793A ;  SA      #* ( ⽰ → 示 ) KANGXI RADICAL SPIRIT → CJK UNIFIED IDEOGRAPH-793A # 
+
+2EAD ; 793B ;  SA      #* ( ⺭ → 礻 ) CJK RADICAL SPIRIT TWO → CJK UNIFIED IDEOGRAPH-793B        # 
+
+FA18 ; 793C ;  SA      # ( 礼 → 礼 ) CJK COMPATIBILITY IDEOGRAPH-FA18 → CJK UNIFIED IDEOGRAPH-793C       # 
+
+FA4C ; 793E ;  SA      # ( 社 → 社 ) CJK COMPATIBILITY IDEOGRAPH-FA4C → CJK UNIFIED IDEOGRAPH-793E       # 
+
+FA4E ; 7948 ;  SA      # ( 祈 → 祈 ) CJK COMPATIBILITY IDEOGRAPH-FA4E → CJK UNIFIED IDEOGRAPH-7948       # 
+
+FA4D ; 7949 ;  SA      # ( 祉 → 祉 ) CJK COMPATIBILITY IDEOGRAPH-FA4D → CJK UNIFIED IDEOGRAPH-7949       # 
+
+FA4F ; 7950 ;  SA      # ( 祐 → 祐 ) CJK COMPATIBILITY IDEOGRAPH-FA4F → CJK UNIFIED IDEOGRAPH-7950       # 
+
+FA50 ; 7956 ;  SA      # ( 祖 → 祖 ) CJK COMPATIBILITY IDEOGRAPH-FA50 → CJK UNIFIED IDEOGRAPH-7956       # 
+2F953 ;        7956 ;  SA      # ( 祖 → 祖 ) CJK COMPATIBILITY IDEOGRAPH-2F953 → CJK UNIFIED IDEOGRAPH-7956     # 
+
+FA51 ; 795D ;  SA      # ( 祝 → 祝 ) CJK COMPATIBILITY IDEOGRAPH-FA51 → CJK UNIFIED IDEOGRAPH-795D       # 
+
+FA19 ; 795E ;  SA      # ( 神 → 神 ) CJK COMPATIBILITY IDEOGRAPH-FA19 → CJK UNIFIED IDEOGRAPH-795E       # 
+
+FA1A ; 7965 ;  SA      # ( 祥 → 祥 ) CJK COMPATIBILITY IDEOGRAPH-FA1A → CJK UNIFIED IDEOGRAPH-7965       # 
+
+F93C ; 797F ;  SA      # ( 祿 → 祿 ) CJK COMPATIBILITY IDEOGRAPH-F93C → CJK UNIFIED IDEOGRAPH-797F       # 
+
+FA52 ; 798D ;  SA      # ( 禍 → 禍 ) CJK COMPATIBILITY IDEOGRAPH-FA52 → CJK UNIFIED IDEOGRAPH-798D       # 
+
+FA53 ; 798E ;  SA      # ( 禎 → 禎 ) CJK COMPATIBILITY IDEOGRAPH-FA53 → CJK UNIFIED IDEOGRAPH-798E       # 
+
+FA1B ; 798F ;  SA      # ( 福 → 福 ) CJK COMPATIBILITY IDEOGRAPH-FA1B → CJK UNIFIED IDEOGRAPH-798F       # 
+2F956 ;        798F ;  SA      # ( 福 → 福 ) CJK COMPATIBILITY IDEOGRAPH-2F956 → CJK UNIFIED IDEOGRAPH-798F     # 
+
+F9B6 ; 79AE ;  SA      # ( 禮 → 禮 ) CJK COMPATIBILITY IDEOGRAPH-F9B6 → CJK UNIFIED IDEOGRAPH-79AE       # 
+
+2F71 ; 79B8 ;  SA      #* ( ⽱ → 禸 ) KANGXI RADICAL TRACK → CJK UNIFIED IDEOGRAPH-79B8  # 
+
+2F72 ; 79BE ;  SA      #* ( ⽲ → 禾 ) KANGXI RADICAL GRAIN → CJK UNIFIED IDEOGRAPH-79BE  # 
+
+F995 ; 79CA ;  SA      # ( 秊 → 秊 ) CJK COMPATIBILITY IDEOGRAPH-F995 → CJK UNIFIED IDEOGRAPH-79CA       # 
+
+2F957 ;        79EB ;  SA      # ( 秫 → 秫 ) CJK COMPATIBILITY IDEOGRAPH-2F957 → CJK UNIFIED IDEOGRAPH-79EB     # 
+
+F956 ; 7A1C ;  SA      # ( 稜 → 稜 ) CJK COMPATIBILITY IDEOGRAPH-F956 → CJK UNIFIED IDEOGRAPH-7A1C       # 
+
+FA54 ; 7A40 ;  SA      # ( 穀 → 穀 ) CJK COMPATIBILITY IDEOGRAPH-FA54 → CJK UNIFIED IDEOGRAPH-7A40       # 
+2F959 ;        7A40 ;  SA      # ( 穀 → 穀 ) CJK COMPATIBILITY IDEOGRAPH-2F959 → CJK UNIFIED IDEOGRAPH-7A40     # 
+
+2F95A ;        7A4A ;  SA      # ( 穊 → 穊 ) CJK COMPATIBILITY IDEOGRAPH-2F95A → CJK UNIFIED IDEOGRAPH-7A4A     # 
+
+2F95B ;        7A4F ;  SA      # ( 穏 → 穏 ) CJK COMPATIBILITY IDEOGRAPH-2F95B → CJK UNIFIED IDEOGRAPH-7A4F     # 
+
+2F73 ; 7A74 ;  SA      #* ( ⽳ → 穴 ) KANGXI RADICAL CAVE → CJK UNIFIED IDEOGRAPH-7A74   # 
+
+FA55 ; 7A81 ;  SA      # ( 突 → 突 ) CJK COMPATIBILITY IDEOGRAPH-FA55 → CJK UNIFIED IDEOGRAPH-7A81       # 
+
+FAAC ; 7AB1 ;  SA      # ( 窱 → 窱 ) CJK COMPATIBILITY IDEOGRAPH-FAAC → CJK UNIFIED IDEOGRAPH-7AB1       # 
+
+F9F7 ; 7ACB ;  SA      # ( 立 → 立 ) CJK COMPATIBILITY IDEOGRAPH-F9F7 → CJK UNIFIED IDEOGRAPH-7ACB       # 
+2F74 ; 7ACB ;  SA      #* ( ⽴ → 立 ) KANGXI RADICAL STAND → CJK UNIFIED IDEOGRAPH-7ACB  # 
+
+2EEF ; 7ADC ;  SA      #* ( ⻯ → 竜 ) CJK RADICAL J-SIMPLIFIED DRAGON → CJK UNIFIED IDEOGRAPH-7ADC       # 
+
+2F95F ;        7AEE ;  SA      # ( 竮 → 竮 ) CJK COMPATIBILITY IDEOGRAPH-2F95F → CJK UNIFIED IDEOGRAPH-7AEE     # 
+
+2F75 ; 7AF9 ;  SA      #* ( ⽵ → 竹 ) KANGXI RADICAL BAMBOO → CJK UNIFIED IDEOGRAPH-7AF9 # 
+
+F9F8 ; 7B20 ;  SA      # ( 笠 → 笠 ) CJK COMPATIBILITY IDEOGRAPH-F9F8 → CJK UNIFIED IDEOGRAPH-7B20       # 
+
+FA56 ; 7BC0 ;  SA      # ( 節 → 節 ) CJK COMPATIBILITY IDEOGRAPH-FA56 → CJK UNIFIED IDEOGRAPH-7BC0       # 
+FAAD ; 7BC0 ;  SA      # ( 節 → 節 ) CJK COMPATIBILITY IDEOGRAPH-FAAD → CJK UNIFIED IDEOGRAPH-7BC0       # 
+
+2F962 ;        7BC6 ;  SA      # ( 篆 → 篆 ) CJK COMPATIBILITY IDEOGRAPH-2F962 → CJK UNIFIED IDEOGRAPH-7BC6     # 
+
+2F963 ;        7BC9 ;  SA      # ( 築 → 築 ) CJK COMPATIBILITY IDEOGRAPH-2F963 → CJK UNIFIED IDEOGRAPH-7BC9     # 
+
+F9A6 ; 7C3E ;  SA      # ( 簾 → 簾 ) CJK COMPATIBILITY IDEOGRAPH-F9A6 → CJK UNIFIED IDEOGRAPH-7C3E       # 
+
+F944 ; 7C60 ;  SA      # ( 籠 → 籠 ) CJK COMPATIBILITY IDEOGRAPH-F944 → CJK UNIFIED IDEOGRAPH-7C60       # 
+
+2F76 ; 7C73 ;  SA      #* ( ⽶ → 米 ) KANGXI RADICAL RICE → CJK UNIFIED IDEOGRAPH-7C73   # 
+
+FAAE ; 7C7B ;  SA      # ( 类 → 类 ) CJK COMPATIBILITY IDEOGRAPH-FAAE → CJK UNIFIED IDEOGRAPH-7C7B       # 
+
+F9F9 ; 7C92 ;  SA      # ( 粒 → 粒 ) CJK COMPATIBILITY IDEOGRAPH-F9F9 → CJK UNIFIED IDEOGRAPH-7C92       # 
+
+FA1D ; 7CBE ;  SA      # ( 精 → 精 ) CJK COMPATIBILITY IDEOGRAPH-FA1D → CJK UNIFIED IDEOGRAPH-7CBE       # 
+
+2F966 ;        7CD2 ;  SA      # ( 糒 → 糒 ) CJK COMPATIBILITY IDEOGRAPH-2F966 → CJK UNIFIED IDEOGRAPH-7CD2     # 
+
+FA03 ; 7CD6 ;  SA      # ( 糖 → 糖 ) CJK COMPATIBILITY IDEOGRAPH-FA03 → CJK UNIFIED IDEOGRAPH-7CD6       # 
+
+2F969 ;        7CE3 ;  SA      # ( 糣 → 糣 ) CJK COMPATIBILITY IDEOGRAPH-2F969 → CJK UNIFIED IDEOGRAPH-7CE3     # 
+
+F97B ; 7CE7 ;  SA      # ( 糧 → 糧 ) CJK COMPATIBILITY IDEOGRAPH-F97B → CJK UNIFIED IDEOGRAPH-7CE7       # 
+
+2F968 ;        7CE8 ;  SA      # ( 糨 → 糨 ) CJK COMPATIBILITY IDEOGRAPH-2F968 → CJK UNIFIED IDEOGRAPH-7CE8     # 
+
+2F77 ; 7CF8 ;  SA      #* ( ⽷ → 糸 ) KANGXI RADICAL SILK → CJK UNIFIED IDEOGRAPH-7CF8   # 
+
+2EAF ; 7CF9 ;  SA      #* ( ⺯ → 糹 ) CJK RADICAL SILK → CJK UNIFIED IDEOGRAPH-7CF9      # 
+
+2F96A ;        7D00 ;  SA      # ( 紀 → 紀 ) CJK COMPATIBILITY IDEOGRAPH-2F96A → CJK UNIFIED IDEOGRAPH-7D00     # 
+
+F9CF ; 7D10 ;  SA      # ( 紐 → 紐 ) CJK COMPATIBILITY IDEOGRAPH-F9CF → CJK UNIFIED IDEOGRAPH-7D10       # 
+
+F96A ; 7D22 ;  SA      # ( 索 → 索 ) CJK COMPATIBILITY IDEOGRAPH-F96A → CJK UNIFIED IDEOGRAPH-7D22       # 
+
+F94F ; 7D2F ;  SA      # ( 累 → 累 ) CJK COMPATIBILITY IDEOGRAPH-F94F → CJK UNIFIED IDEOGRAPH-7D2F       # 
+
+7D76 ; 7D55 ;  SA      # ( 絶 → 絕 ) CJK UNIFIED IDEOGRAPH-7D76 → CJK UNIFIED IDEOGRAPH-7D55     # 
+
+FAAF ; 7D5B ;  SA      # ( 絛 → 絛 ) CJK COMPATIBILITY IDEOGRAPH-FAAF → CJK UNIFIED IDEOGRAPH-7D5B       # 
+
+2F96C ;        7D63 ;  SA      # ( 絣 → 絣 ) CJK COMPATIBILITY IDEOGRAPH-2F96C → CJK UNIFIED IDEOGRAPH-7D63     # 
+
+F93D ; 7DA0 ;  SA      # ( 綠 → 綠 ) CJK COMPATIBILITY IDEOGRAPH-F93D → CJK UNIFIED IDEOGRAPH-7DA0       # 
+
+F957 ; 7DBE ;  SA      # ( 綾 → 綾 ) CJK COMPATIBILITY IDEOGRAPH-F957 → CJK UNIFIED IDEOGRAPH-7DBE       # 
+
+2F96E ;        7DC7 ;  SA      # ( 緇 → 緇 ) CJK COMPATIBILITY IDEOGRAPH-2F96E → CJK UNIFIED IDEOGRAPH-7DC7     # 
+
+F996 ; 7DF4 ;  SA      # ( 練 → 練 ) CJK COMPATIBILITY IDEOGRAPH-F996 → CJK UNIFIED IDEOGRAPH-7DF4       # 
+FA57 ; 7DF4 ;  SA      # ( 練 → 練 ) CJK COMPATIBILITY IDEOGRAPH-FA57 → CJK UNIFIED IDEOGRAPH-7DF4       # 
+FAB0 ; 7DF4 ;  SA      # ( 練 → 練 ) CJK COMPATIBILITY IDEOGRAPH-FAB0 → CJK UNIFIED IDEOGRAPH-7DF4       # 
+
+2F96F ;        7E02 ;  SA      # ( 縂 → 縂 ) CJK COMPATIBILITY IDEOGRAPH-2F96F → CJK UNIFIED IDEOGRAPH-7E02     # 
+
+FA58 ; 7E09 ;  SA      # ( 縉 → 縉 ) CJK COMPATIBILITY IDEOGRAPH-FA58 → CJK UNIFIED IDEOGRAPH-7E09       # 
+
+F950 ; 7E37 ;  SA      # ( 縷 → 縷 ) CJK COMPATIBILITY IDEOGRAPH-F950 → CJK UNIFIED IDEOGRAPH-7E37       # 
+
+FA59 ; 7E41 ;  SA      # ( 繁 → 繁 ) CJK COMPATIBILITY IDEOGRAPH-FA59 → CJK UNIFIED IDEOGRAPH-7E41       # 
+
+2F970 ;        7E45 ;  SA      # ( 繅 → 繅 ) CJK COMPATIBILITY IDEOGRAPH-2F970 → CJK UNIFIED IDEOGRAPH-7E45     # 
+
+2F78 ; 7F36 ;  SA      #* ( ⽸ → 缶 ) KANGXI RADICAL JAR → CJK UNIFIED IDEOGRAPH-7F36    # 
+
+FAB1 ; 7F3E ;  SA      # ( 缾 → 缾 ) CJK COMPATIBILITY IDEOGRAPH-FAB1 → CJK UNIFIED IDEOGRAPH-7F3E       # 
+
+2F79 ; 7F51 ;  SA      #* ( ⽹ → 网 ) KANGXI RADICAL NET → CJK UNIFIED IDEOGRAPH-7F51    # 
+
+2EAB ; 7F52 ;  SA      #* ( ⺫ → 罒 ) CJK RADICAL EYE → CJK UNIFIED IDEOGRAPH-7F52       # 
+2EB2 ; 7F52 ;  SA      #* ( ⺲ → 罒 ) CJK RADICAL NET TWO → CJK UNIFIED IDEOGRAPH-7F52   # 
+
+2EB1 ; 7F53 ;  SA      #* ( ⺱ → 罓 ) CJK RADICAL NET ONE → CJK UNIFIED IDEOGRAPH-7F53   # 
+
+FA5A ; 7F72 ;  SA      # ( 署 → 署 ) CJK COMPATIBILITY IDEOGRAPH-FA5A → CJK UNIFIED IDEOGRAPH-7F72       # 
+
+F9E6 ; 7F79 ;  SA      # ( 罹 → 罹 ) CJK COMPATIBILITY IDEOGRAPH-F9E6 → CJK UNIFIED IDEOGRAPH-7F79       # 
+
+2F976 ;        7F7A ;  SA      # ( 罺 → 罺 ) CJK COMPATIBILITY IDEOGRAPH-2F976 → CJK UNIFIED IDEOGRAPH-7F7A     # 
+
+F90F ; 7F85 ;  SA      # ( 羅 → 羅 ) CJK COMPATIBILITY IDEOGRAPH-F90F → CJK UNIFIED IDEOGRAPH-7F85       # 
+
+2F7A ; 7F8A ;  SA      #* ( ⽺ → 羊 ) KANGXI RADICAL SHEEP → CJK UNIFIED IDEOGRAPH-7F8A  # 
+
+2F978 ;        7F95 ;  SA      # ( 羕 → 羕 ) CJK COMPATIBILITY IDEOGRAPH-2F978 → CJK UNIFIED IDEOGRAPH-7F95     # 
+
+F9AF ; 7F9A ;  SA      # ( 羚 → 羚 ) CJK COMPATIBILITY IDEOGRAPH-F9AF → CJK UNIFIED IDEOGRAPH-7F9A       # 
+
+FA1E ; 7FBD ;  SA      # ( 羽 → 羽 ) CJK COMPATIBILITY IDEOGRAPH-FA1E → CJK UNIFIED IDEOGRAPH-7FBD       # 
+2F7B ; 7FBD ;  SA      #* ( ⽻ → 羽 ) KANGXI RADICAL FEATHER → CJK UNIFIED IDEOGRAPH-7FBD        # 
+
+2F979 ;        7FFA ;  SA      # ( 翺 → 翺 ) CJK COMPATIBILITY IDEOGRAPH-2F979 → CJK UNIFIED IDEOGRAPH-7FFA     # 
+
+F934 ; 8001 ;  SA      # ( 老 → 老 ) CJK COMPATIBILITY IDEOGRAPH-F934 → CJK UNIFIED IDEOGRAPH-8001       # 
+2F7C ; 8001 ;  SA      #* ( ⽼ → 老 ) KANGXI RADICAL OLD → CJK UNIFIED IDEOGRAPH-8001    # 
+
+2EB9 ; 8002 ;  SA      #* ( ⺹ → 耂 ) CJK RADICAL OLD → CJK UNIFIED IDEOGRAPH-8002       # 
+
+FA5B ; 8005 ;  SA      # ( 者 → 者 ) CJK COMPATIBILITY IDEOGRAPH-FA5B → CJK UNIFIED IDEOGRAPH-8005       # 
+FAB2 ; 8005 ;  SA      # ( 者 → 者 ) CJK COMPATIBILITY IDEOGRAPH-FAB2 → CJK UNIFIED IDEOGRAPH-8005       # 
+2F97A ;        8005 ;  SA      # ( 者 → 者 ) CJK COMPATIBILITY IDEOGRAPH-2F97A → CJK UNIFIED IDEOGRAPH-8005     # 
+
+2F7D ; 800C ;  SA      #* ( ⽽ → 而 ) KANGXI RADICAL AND → CJK UNIFIED IDEOGRAPH-800C    # 
+
+2F7E ; 8012 ;  SA      #* ( ⽾ → 耒 ) KANGXI RADICAL PLOW → CJK UNIFIED IDEOGRAPH-8012   # 
+
+2F7F ; 8033 ;  SA      #* ( ⽿ → 耳 ) KANGXI RADICAL EAR → CJK UNIFIED IDEOGRAPH-8033    # 
+
+F9B0 ; 8046 ;  SA      # ( 聆 → 聆 ) CJK COMPATIBILITY IDEOGRAPH-F9B0 → CJK UNIFIED IDEOGRAPH-8046       # 
+
+2F97D ;        8060 ;  SA      # ( 聠 → 聠 ) CJK COMPATIBILITY IDEOGRAPH-2F97D → CJK UNIFIED IDEOGRAPH-8060     # 
+
+F997 ; 806F ;  SA      # ( 聯 → 聯 ) CJK COMPATIBILITY IDEOGRAPH-F997 → CJK UNIFIED IDEOGRAPH-806F       # 
+
+2F97F ;        8070 ;  SA      # ( 聰 → 聰 ) CJK COMPATIBILITY IDEOGRAPH-2F97F → CJK UNIFIED IDEOGRAPH-8070     # 
+
+F945 ; 807E ;  SA      # ( 聾 → 聾 ) CJK COMPATIBILITY IDEOGRAPH-F945 → CJK UNIFIED IDEOGRAPH-807E       # 
+
+2F80 ; 807F ;  SA      #* ( ⾀ → 聿 ) KANGXI RADICAL BRUSH → CJK UNIFIED IDEOGRAPH-807F  # 
+
+2EBA ; 8080 ;  SA      #* ( ⺺ → 肀 ) CJK RADICAL BRUSH ONE → CJK UNIFIED IDEOGRAPH-8080 # 
+
+2F81 ; 8089 ;  SA      #* ( ⾁ → 肉 ) KANGXI RADICAL MEAT → CJK UNIFIED IDEOGRAPH-8089   # 
+
+F953 ; 808B ;  SA      # ( 肋 → 肋 ) CJK COMPATIBILITY IDEOGRAPH-F953 → CJK UNIFIED IDEOGRAPH-808B       # 
+
+2F8D6 ;        80AD ;  SA      # ( 肭 → 肭 ) CJK COMPATIBILITY IDEOGRAPH-2F8D6 → CJK UNIFIED IDEOGRAPH-80AD     # 
+
+2F982 ;        80B2 ;  SA      # ( 育 → 育 ) CJK COMPATIBILITY IDEOGRAPH-2F982 → CJK UNIFIED IDEOGRAPH-80B2     # 
+
+8141 ; 80FC ;  SA      # ( 腁 → 胼 ) CJK UNIFIED IDEOGRAPH-8141 → CJK UNIFIED IDEOGRAPH-80FC     # 
+
+2F983 ;        8103 ;  SA      # ( 脃 → 脃 ) CJK COMPATIBILITY IDEOGRAPH-2F983 → CJK UNIFIED IDEOGRAPH-8103     # 
+
+2F985 ;        813E ;  SA      # ( 脾 → 脾 ) CJK COMPATIBILITY IDEOGRAPH-2F985 → CJK UNIFIED IDEOGRAPH-813E     # 
+
+F926 ; 81D8 ;  SA      # ( 臘 → 臘 ) CJK COMPATIBILITY IDEOGRAPH-F926 → CJK UNIFIED IDEOGRAPH-81D8       # 
+
+2F82 ; 81E3 ;  SA      #* ( ⾂ → 臣 ) KANGXI RADICAL MINISTER → CJK UNIFIED IDEOGRAPH-81E3       # 
+
+F9F6 ; 81E8 ;  SA      # ( 臨 → 臨 ) CJK COMPATIBILITY IDEOGRAPH-F9F6 → CJK UNIFIED IDEOGRAPH-81E8       # 
+
+2F83 ; 81EA ;  SA      #* ( ⾃ → 自 ) KANGXI RADICAL SELF → CJK UNIFIED IDEOGRAPH-81EA   # 
+
+FA5C ; 81ED ;  SA      # ( 臭 → 臭 ) CJK COMPATIBILITY IDEOGRAPH-FA5C → CJK UNIFIED IDEOGRAPH-81ED       # 
+
+2F84 ; 81F3 ;  SA      #* ( ⾄ → 至 ) KANGXI RADICAL ARRIVE → CJK UNIFIED IDEOGRAPH-81F3 # 
+
+2F85 ; 81FC ;  SA      #* ( ⾅ → 臼 ) KANGXI RADICAL MORTAR → CJK UNIFIED IDEOGRAPH-81FC # 
+
+2F893 ;        8201 ;  SA      # ( 舁 → 舁 ) CJK COMPATIBILITY IDEOGRAPH-2F893 → CJK UNIFIED IDEOGRAPH-8201     # 
+2F98B ;        8201 ;  SA      # ( 舁 → 舁 ) CJK COMPATIBILITY IDEOGRAPH-2F98B → CJK UNIFIED IDEOGRAPH-8201     # 
+
+2F98C ;        8204 ;  SA      # ( 舄 → 舄 ) CJK COMPATIBILITY IDEOGRAPH-2F98C → CJK UNIFIED IDEOGRAPH-8204     # 
+
+2F86 ; 820C ;  SA      #* ( ⾆ → 舌 ) KANGXI RADICAL TONGUE → CJK UNIFIED IDEOGRAPH-820C # 
+
+FA6D ; 8218 ;  SA      # ( 舘 → 舘 ) CJK COMPATIBILITY IDEOGRAPH-FA6D → CJK UNIFIED IDEOGRAPH-8218       # 
+
+2F87 ; 821B ;  SA      #* ( ⾇ → 舛 ) KANGXI RADICAL OPPOSE → CJK UNIFIED IDEOGRAPH-821B # 
+
+2F88 ; 821F ;  SA      #* ( ⾈ → 舟 ) KANGXI RADICAL BOAT → CJK UNIFIED IDEOGRAPH-821F   # 
+
+2F89 ; 826E ;  SA      #* ( ⾉ → 艮 ) KANGXI RADICAL STOPPING → CJK UNIFIED IDEOGRAPH-826E       # 
+
+F97C ; 826F ;  SA      # ( 良 → 良 ) CJK COMPATIBILITY IDEOGRAPH-F97C → CJK UNIFIED IDEOGRAPH-826F       # 
+
+2F8A ; 8272 ;  SA      #* ( ⾊ → 色 ) KANGXI RADICAL COLOR → CJK UNIFIED IDEOGRAPH-8272  # 
+
+2F8B ; 8278 ;  SA      #* ( ⾋ → 艸 ) KANGXI RADICAL GRASS → CJK UNIFIED IDEOGRAPH-8278  # 
+
+FA5D ; 8279 ;  SA      # ( 艹 → 艹 ) CJK COMPATIBILITY IDEOGRAPH-FA5D → CJK UNIFIED IDEOGRAPH-8279       # 
+FA5E ; 8279 ;  SA      # ( 艹 → 艹 ) CJK COMPATIBILITY IDEOGRAPH-FA5E → CJK UNIFIED IDEOGRAPH-8279       # 
+2EBE ; 8279 ;  SA      #* ( ⺾ → 艹 ) CJK RADICAL GRASS ONE → CJK UNIFIED IDEOGRAPH-8279 # 
+2EBF ; 8279 ;  SA      #* ( ⺿ → 艹 ) CJK RADICAL GRASS TWO → CJK UNIFIED IDEOGRAPH-8279 # →艹→
+2EC0 ; 8279 ;  SA      #* ( ⻀ → 艹 ) CJK RADICAL GRASS THREE → CJK UNIFIED IDEOGRAPH-8279       # →艹→
+
+2F990 ;        828B ;  SA      # ( 芋 → 芋 ) CJK COMPATIBILITY IDEOGRAPH-2F990 → CJK UNIFIED IDEOGRAPH-828B     # 
+
+2F98F ;        8291 ;  SA      # ( 芑 → 芑 ) CJK COMPATIBILITY IDEOGRAPH-2F98F → CJK UNIFIED IDEOGRAPH-8291     # 
+
+2F991 ;        829D ;  SA      # ( 芝 → 芝 ) CJK COMPATIBILITY IDEOGRAPH-2F991 → CJK UNIFIED IDEOGRAPH-829D     # 
+
+2F993 ;        82B1 ;  SA      # ( 花 → 花 ) CJK COMPATIBILITY IDEOGRAPH-2F993 → CJK UNIFIED IDEOGRAPH-82B1     # 
+
+2F994 ;        82B3 ;  SA      # ( 芳 → 芳 ) CJK COMPATIBILITY IDEOGRAPH-2F994 → CJK UNIFIED IDEOGRAPH-82B3     # 
+
+2F995 ;        82BD ;  SA      # ( 芽 → 芽 ) CJK COMPATIBILITY IDEOGRAPH-2F995 → CJK UNIFIED IDEOGRAPH-82BD     # 
+
+F974 ; 82E5 ;  SA      # ( 若 → 若 ) CJK COMPATIBILITY IDEOGRAPH-F974 → CJK UNIFIED IDEOGRAPH-82E5       # 
+2F998 ;        82E5 ;  SA      # ( 若 → 若 ) CJK COMPATIBILITY IDEOGRAPH-2F998 → CJK UNIFIED IDEOGRAPH-82E5     # 
+
+2F996 ;        82E6 ;  SA      # ( 苦 → 苦 ) CJK COMPATIBILITY IDEOGRAPH-2F996 → CJK UNIFIED IDEOGRAPH-82E6     # 
+
+2F999 ;        831D ;  SA      # ( 茝 → 茝 ) CJK COMPATIBILITY IDEOGRAPH-2F999 → CJK UNIFIED IDEOGRAPH-831D     # 
+
+2F99C ;        8323 ;  SA      # ( 茣 → 茣 ) CJK COMPATIBILITY IDEOGRAPH-2F99C → CJK UNIFIED IDEOGRAPH-8323     # 
+
+F9FE ; 8336 ;  SA      # ( 茶 → 茶 ) CJK COMPATIBILITY IDEOGRAPH-F9FE → CJK UNIFIED IDEOGRAPH-8336       # 
+
+FAB3 ; 8352 ;  SA      # ( 荒 → 荒 ) CJK COMPATIBILITY IDEOGRAPH-FAB3 → CJK UNIFIED IDEOGRAPH-8352       # 
+
+2F9A0 ;        8353 ;  SA      # ( 荓 → 荓 ) CJK COMPATIBILITY IDEOGRAPH-2F9A0 → CJK UNIFIED IDEOGRAPH-8353     # 
+
+2F99A ;        8363 ;  SA      # ( 荣 → 荣 ) CJK COMPATIBILITY IDEOGRAPH-2F99A → CJK UNIFIED IDEOGRAPH-8363     # 
+
+2F99B ;        83AD ;  SA      # ( 莭 → 莭 ) CJK COMPATIBILITY IDEOGRAPH-2F99B → CJK UNIFIED IDEOGRAPH-83AD     # 
+
+2F99D ;        83BD ;  SA      # ( 莽 → 莽 ) CJK COMPATIBILITY IDEOGRAPH-2F99D → CJK UNIFIED IDEOGRAPH-83BD     # 
+
+F93E ; 83C9 ;  SA      # ( 菉 → 菉 ) CJK COMPATIBILITY IDEOGRAPH-F93E → CJK UNIFIED IDEOGRAPH-83C9       # 
+
+2F9A1 ;        83CA ;  SA      # ( 菊 → 菊 ) CJK COMPATIBILITY IDEOGRAPH-2F9A1 → CJK UNIFIED IDEOGRAPH-83CA     # 
+
+2F9A2 ;        83CC ;  SA      # ( 菌 → 菌 ) CJK COMPATIBILITY IDEOGRAPH-2F9A2 → CJK UNIFIED IDEOGRAPH-83CC     # 
+
+2F9A3 ;        83DC ;  SA      # ( 菜 → 菜 ) CJK COMPATIBILITY IDEOGRAPH-2F9A3 → CJK UNIFIED IDEOGRAPH-83DC     # 
+
+2F99E ;        83E7 ;  SA      # ( 菧 → 菧 ) CJK COMPATIBILITY IDEOGRAPH-2F99E → CJK UNIFIED IDEOGRAPH-83E7     # 
+
+FAB4 ; 83EF ;  SA      # ( 華 → 華 ) CJK COMPATIBILITY IDEOGRAPH-FAB4 → CJK UNIFIED IDEOGRAPH-83EF       # 
+
+F958 ; 83F1 ;  SA      # ( 菱 → 菱 ) CJK COMPATIBILITY IDEOGRAPH-F958 → CJK UNIFIED IDEOGRAPH-83F1       # 
+
+F918 ; 843D ;  SA      # ( 落 → 落 ) CJK COMPATIBILITY IDEOGRAPH-F918 → CJK UNIFIED IDEOGRAPH-843D       # 
+
+F96E ; 8449 ;  SA      # ( 葉 → 葉 ) CJK COMPATIBILITY IDEOGRAPH-F96E → CJK UNIFIED IDEOGRAPH-8449       # 
+
+FA5F ; 8457 ;  SA      # ( 著 → 著 ) CJK COMPATIBILITY IDEOGRAPH-FA5F → CJK UNIFIED IDEOGRAPH-8457       # 
+2F99F ;        8457 ;  SA      # ( 著 → 著 ) CJK COMPATIBILITY IDEOGRAPH-2F99F → CJK UNIFIED IDEOGRAPH-8457     # 
+
+853F ; 848D ;  SA      # ( 蔿 → 蒍 ) CJK UNIFIED IDEOGRAPH-853F → CJK UNIFIED IDEOGRAPH-848D     # 
+
+F999 ; 84EE ;  SA      # ( 蓮 → 蓮 ) CJK COMPATIBILITY IDEOGRAPH-F999 → CJK UNIFIED IDEOGRAPH-84EE       # 
+
+2F9A8 ;        84F1 ;  SA      # ( 蓱 → 蓱 ) CJK COMPATIBILITY IDEOGRAPH-2F9A8 → CJK UNIFIED IDEOGRAPH-84F1     # 
+
+2F9A9 ;        84F3 ;  SA      # ( 蓳 → 蓳 ) CJK COMPATIBILITY IDEOGRAPH-2F9A9 → CJK UNIFIED IDEOGRAPH-84F3     # 
+
+F9C2 ; 84FC ;  SA      # ( 蓼 → 蓼 ) CJK COMPATIBILITY IDEOGRAPH-F9C2 → CJK UNIFIED IDEOGRAPH-84FC       # 
+
+2F9AA ;        8516 ;  SA      # ( 蔖 → 蔖 ) CJK COMPATIBILITY IDEOGRAPH-2F9AA → CJK UNIFIED IDEOGRAPH-8516     # 
+
+2F9AC ;        8564 ;  SA      # ( 蕤 → 蕤 ) CJK COMPATIBILITY IDEOGRAPH-2F9AC → CJK UNIFIED IDEOGRAPH-8564     # 
+
+F923 ; 85CD ;  SA      # ( 藍 → 藍 ) CJK COMPATIBILITY IDEOGRAPH-F923 → CJK UNIFIED IDEOGRAPH-85CD       # 
+
+F9F0 ; 85FA ;  SA      # ( 藺 → 藺 ) CJK COMPATIBILITY IDEOGRAPH-F9F0 → CJK UNIFIED IDEOGRAPH-85FA       # 
+
+F935 ; 8606 ;  SA      # ( 蘆 → 蘆 ) CJK COMPATIBILITY IDEOGRAPH-F935 → CJK UNIFIED IDEOGRAPH-8606       # 
+
+FA20 ; 8612 ;  SA      # ( 蘒 → 蘒 ) CJK COMPATIBILITY IDEOGRAPH-FA20 → CJK UNIFIED IDEOGRAPH-8612       # 
+
+F91F ; 862D ;  SA      # ( 蘭 → 蘭 ) CJK COMPATIBILITY IDEOGRAPH-F91F → CJK UNIFIED IDEOGRAPH-862D       # 
+
+8641 ; 8637 ;  SA      # ( 虁 → 蘷 ) CJK UNIFIED IDEOGRAPH-8641 → CJK UNIFIED IDEOGRAPH-8637     # 
+
+F910 ; 863F ;  SA      # ( 蘿 → 蘿 ) CJK COMPATIBILITY IDEOGRAPH-F910 → CJK UNIFIED IDEOGRAPH-863F       # 
+
+2F8C ; 864D ;  SA      #* ( ⾌ → 虍 ) KANGXI RADICAL TIGER → CJK UNIFIED IDEOGRAPH-864D  # 
+
+2EC1 ; 864E ;  SA      #* ( ⻁ → 虎 ) CJK RADICAL TIGER → CJK UNIFIED IDEOGRAPH-864E     # 
+
+2F9B3 ;        8650 ;  SA      # ( 虐 → 虐 ) CJK COMPATIBILITY IDEOGRAPH-2F9B3 → CJK UNIFIED IDEOGRAPH-8650     # 
+
+F936 ; 865C ;  SA      # ( 虜 → 虜 ) CJK COMPATIBILITY IDEOGRAPH-F936 → CJK UNIFIED IDEOGRAPH-865C       # 
+2F9B4 ;        865C ;  SA      # ( 虜 → 虜 ) CJK COMPATIBILITY IDEOGRAPH-2F9B4 → CJK UNIFIED IDEOGRAPH-865C     # 
+
+2F9B5 ;        8667 ;  SA      # ( 虧 → 虧 ) CJK COMPATIBILITY IDEOGRAPH-2F9B5 → CJK UNIFIED IDEOGRAPH-8667     # 
+
+2F9B6 ;        8669 ;  SA      # ( 虩 → 虩 ) CJK COMPATIBILITY IDEOGRAPH-2F9B6 → CJK UNIFIED IDEOGRAPH-8669     # 
+
+2F8D ; 866B ;  SA      #* ( ⾍ → 虫 ) KANGXI RADICAL INSECT → CJK UNIFIED IDEOGRAPH-866B # 
+
+2F9B8 ;        8688 ;  SA      # ( 蚈 → 蚈 ) CJK COMPATIBILITY IDEOGRAPH-2F9B8 → CJK UNIFIED IDEOGRAPH-8688     # 
+
+2F9B7 ;        86A9 ;  SA      # ( 蚩 → 蚩 ) CJK COMPATIBILITY IDEOGRAPH-2F9B7 → CJK UNIFIED IDEOGRAPH-86A9     # 
+
+2F9BA ;        86E2 ;  SA      # ( 蛢 → 蛢 ) CJK COMPATIBILITY IDEOGRAPH-2F9BA → CJK UNIFIED IDEOGRAPH-86E2     # 
+
+2F9B9 ;        870E ;  SA      # ( 蜎 → 蜎 ) CJK COMPATIBILITY IDEOGRAPH-2F9B9 → CJK UNIFIED IDEOGRAPH-870E     # 
+
+2F9BC ;        8728 ;  SA      # ( 蜨 → 蜨 ) CJK COMPATIBILITY IDEOGRAPH-2F9BC → CJK UNIFIED IDEOGRAPH-8728     # 
+
+2F9BD ;        876B ;  SA      # ( 蝫 → 蝫 ) CJK COMPATIBILITY IDEOGRAPH-2F9BD → CJK UNIFIED IDEOGRAPH-876B     # 
+
+FAB5 ; 8779 ;  SA      # ( 蝹 → 蝹 ) CJK COMPATIBILITY IDEOGRAPH-FAB5 → CJK UNIFIED IDEOGRAPH-8779       # 
+2F9BB ;        8779 ;  SA      # ( 蝹 → 蝹 ) CJK COMPATIBILITY IDEOGRAPH-2F9BB → CJK UNIFIED IDEOGRAPH-8779     # 
+
+2F9BE ;        8786 ;  SA      # ( 螆 → 螆 ) CJK COMPATIBILITY IDEOGRAPH-2F9BE → CJK UNIFIED IDEOGRAPH-8786     # 
+
+F911 ; 87BA ;  SA      # ( 螺 → 螺 ) CJK COMPATIBILITY IDEOGRAPH-F911 → CJK UNIFIED IDEOGRAPH-87BA       # 
+
+2F9C0 ;        87E1 ;  SA      # ( 蟡 → 蟡 ) CJK COMPATIBILITY IDEOGRAPH-2F9C0 → CJK UNIFIED IDEOGRAPH-87E1     # 
+
+2F9C1 ;        8801 ;  SA      # ( 蠁 → 蠁 ) CJK COMPATIBILITY IDEOGRAPH-2F9C1 → CJK UNIFIED IDEOGRAPH-8801     # 
+
+F927 ; 881F ;  SA      # ( 蠟 → 蠟 ) CJK COMPATIBILITY IDEOGRAPH-F927 → CJK UNIFIED IDEOGRAPH-881F       # 
+
+2F8E ; 8840 ;  SA      #* ( ⾎ → 血 ) KANGXI RADICAL BLOOD → CJK UNIFIED IDEOGRAPH-8840  # 
+
+FA08 ; 884C ;  SA      # ( 行 → 行 ) CJK COMPATIBILITY IDEOGRAPH-FA08 → CJK UNIFIED IDEOGRAPH-884C       # 
+2F8F ; 884C ;  SA      #* ( ⾏ → 行 ) KANGXI RADICAL WALK ENCLOSURE → CJK UNIFIED IDEOGRAPH-884C # 
+
+2F9C3 ;        8860 ;  SA      # ( 衠 → 衠 ) CJK COMPATIBILITY IDEOGRAPH-2F9C3 → CJK UNIFIED IDEOGRAPH-8860     # 
+
+2F9C4 ;        8863 ;  SA      # ( 衣 → 衣 ) CJK COMPATIBILITY IDEOGRAPH-2F9C4 → CJK UNIFIED IDEOGRAPH-8863     # 
+2F90 ; 8863 ;  SA      #* ( ⾐ → 衣 ) KANGXI RADICAL CLOTHES → CJK UNIFIED IDEOGRAPH-8863        # 
+
+2EC2 ; 8864 ;  SA      #* ( ⻂ → 衤 ) CJK RADICAL CLOTHES → CJK UNIFIED IDEOGRAPH-8864   # 
+
+F9A0 ; 88C2 ;  SA      # ( 裂 → 裂 ) CJK COMPATIBILITY IDEOGRAPH-F9A0 → CJK UNIFIED IDEOGRAPH-88C2       # 
+
+F9E7 ; 88CF ;  SA      # ( 裏 → 裏 ) CJK COMPATIBILITY IDEOGRAPH-F9E7 → CJK UNIFIED IDEOGRAPH-88CF       # 
+
+2F9C6 ;        88D7 ;  SA      # ( 裗 → 裗 ) CJK COMPATIBILITY IDEOGRAPH-2F9C6 → CJK UNIFIED IDEOGRAPH-88D7     # 
+
+2F9C7 ;        88DE ;  SA      # ( 裞 → 裞 ) CJK COMPATIBILITY IDEOGRAPH-2F9C7 → CJK UNIFIED IDEOGRAPH-88DE     # 
+
+F9E8 ; 88E1 ;  SA      # ( 裡 → 裡 ) CJK COMPATIBILITY IDEOGRAPH-F9E8 → CJK UNIFIED IDEOGRAPH-88E1       # 
+
+F912 ; 88F8 ;  SA      # ( 裸 → 裸 ) CJK COMPATIBILITY IDEOGRAPH-F912 → CJK UNIFIED IDEOGRAPH-88F8       # 
+
+2F9C9 ;        88FA ;  SA      # ( 裺 → 裺 ) CJK COMPATIBILITY IDEOGRAPH-2F9C9 → CJK UNIFIED IDEOGRAPH-88FA     # 
+
+FA60 ; 8910 ;  SA      # ( 褐 → 褐 ) CJK COMPATIBILITY IDEOGRAPH-FA60 → CJK UNIFIED IDEOGRAPH-8910       # 
+
+FAB6 ; 8941 ;  SA      # ( 襁 → 襁 ) CJK COMPATIBILITY IDEOGRAPH-FAB6 → CJK UNIFIED IDEOGRAPH-8941       # 
+
+F924 ; 8964 ;  SA      # ( 襤 → 襤 ) CJK COMPATIBILITY IDEOGRAPH-F924 → CJK UNIFIED IDEOGRAPH-8964       # 
+
+2F91 ; 897E ;  SA      #* ( ⾑ → 襾 ) KANGXI RADICAL WEST → CJK UNIFIED IDEOGRAPH-897E   # 
+
+2EC4 ; 897F ;  SA      #* ( ⻄ → 西 ) CJK RADICAL WEST TWO → CJK UNIFIED IDEOGRAPH-897F  # 
+
+2EC3 ; 8980 ;  SA      #* ( ⻃ → 覀 ) CJK RADICAL WEST ONE → CJK UNIFIED IDEOGRAPH-8980  # 
+
+FAB7 ; 8986 ;  SA      # ( 覆 → 覆 ) CJK COMPATIBILITY IDEOGRAPH-FAB7 → CJK UNIFIED IDEOGRAPH-8986       # 
+
+FA0A ; 898B ;  SA      # ( 見 → 見 ) CJK COMPATIBILITY IDEOGRAPH-FA0A → CJK UNIFIED IDEOGRAPH-898B       # 
+2F92 ; 898B ;  SA      #* ( ⾒ → 見 ) KANGXI RADICAL SEE → CJK UNIFIED IDEOGRAPH-898B    # 
+
+FA61 ; 8996 ;  SA      # ( 視 → 視 ) CJK COMPATIBILITY IDEOGRAPH-FA61 → CJK UNIFIED IDEOGRAPH-8996       # 
+FAB8 ; 8996 ;  SA      # ( 視 → 視 ) CJK COMPATIBILITY IDEOGRAPH-FAB8 → CJK UNIFIED IDEOGRAPH-8996       # 
+
+2EC5 ; 89C1 ;  SA      #* ( ⻅ → 见 ) CJK RADICAL C-SIMPLIFIED SEE → CJK UNIFIED IDEOGRAPH-89C1  # 
+
+2F93 ; 89D2 ;  SA      #* ( ⾓ → 角 ) KANGXI RADICAL HORN → CJK UNIFIED IDEOGRAPH-89D2   # 
+
+2F94 ; 8A00 ;  SA      #* ( ⾔ → 言 ) KANGXI RADICAL SPEECH → CJK UNIFIED IDEOGRAPH-8A00 # 
+
+8A7D ; 8A2E ;  SA      # ( 詽 → 訮 ) CJK UNIFIED IDEOGRAPH-8A7D → CJK UNIFIED IDEOGRAPH-8A2E     # 
+
+2F9CF ;        8AA0 ;  SA      # ( 誠 → 誠 ) CJK COMPATIBILITY IDEOGRAPH-2F9CF → CJK UNIFIED IDEOGRAPH-8AA0     # 
+
+F96F ; 8AAA ;  SA      # ( 說 → 說 ) CJK COMPATIBILITY IDEOGRAPH-F96F → CJK UNIFIED IDEOGRAPH-8AAA       # 
+F9A1 ; 8AAA ;  SA      # ( 說 → 說 ) CJK COMPATIBILITY IDEOGRAPH-F9A1 → CJK UNIFIED IDEOGRAPH-8AAA       # 
+
+FAB9 ; 8ABF ;  SA      # ( 調 → 調 ) CJK COMPATIBILITY IDEOGRAPH-FAB9 → CJK UNIFIED IDEOGRAPH-8ABF       # 
+
+FABB ; 8ACB ;  SA      # ( 請 → 請 ) CJK COMPATIBILITY IDEOGRAPH-FABB → CJK UNIFIED IDEOGRAPH-8ACB       # 
+
+F97D ; 8AD2 ;  SA      # ( 諒 → 諒 ) CJK COMPATIBILITY IDEOGRAPH-F97D → CJK UNIFIED IDEOGRAPH-8AD2       # 
+
+F941 ; 8AD6 ;  SA      # ( 論 → 論 ) CJK COMPATIBILITY IDEOGRAPH-F941 → CJK UNIFIED IDEOGRAPH-8AD6       # 
+
+FABE ; 8AED ;  SA      # ( 諭 → 諭 ) CJK COMPATIBILITY IDEOGRAPH-FABE → CJK UNIFIED IDEOGRAPH-8AED       # 
+2F9D0 ;        8AED ;  SA      # ( 諭 → 諭 ) CJK COMPATIBILITY IDEOGRAPH-2F9D0 → CJK UNIFIED IDEOGRAPH-8AED     # 
+
+FA22 ; 8AF8 ;  SA      # ( 諸 → 諸 ) CJK COMPATIBILITY IDEOGRAPH-FA22 → CJK UNIFIED IDEOGRAPH-8AF8       # 
+FABA ; 8AF8 ;  SA      # ( 諸 → 諸 ) CJK COMPATIBILITY IDEOGRAPH-FABA → CJK UNIFIED IDEOGRAPH-8AF8       # 
+
+F95D ; 8AFE ;  SA      # ( 諾 → 諾 ) CJK COMPATIBILITY IDEOGRAPH-F95D → CJK UNIFIED IDEOGRAPH-8AFE       # 
+FABD ; 8AFE ;  SA      # ( 諾 → 諾 ) CJK COMPATIBILITY IDEOGRAPH-FABD → CJK UNIFIED IDEOGRAPH-8AFE       # 
+
+FA62 ; 8B01 ;  SA      # ( 謁 → 謁 ) CJK COMPATIBILITY IDEOGRAPH-FA62 → CJK UNIFIED IDEOGRAPH-8B01       # 
+FABC ; 8B01 ;  SA      # ( 謁 → 謁 ) CJK COMPATIBILITY IDEOGRAPH-FABC → CJK UNIFIED IDEOGRAPH-8B01       # 
+
+FA63 ; 8B39 ;  SA      # ( 謹 → 謹 ) CJK COMPATIBILITY IDEOGRAPH-FA63 → CJK UNIFIED IDEOGRAPH-8B39       # 
+FABF ; 8B39 ;  SA      # ( 謹 → 謹 ) CJK COMPATIBILITY IDEOGRAPH-FABF → CJK UNIFIED IDEOGRAPH-8B39       # 
+
+F9FC ; 8B58 ;  SA      # ( 識 → 識 ) CJK COMPATIBILITY IDEOGRAPH-F9FC → CJK UNIFIED IDEOGRAPH-8B58       # 
+
+F95A ; 8B80 ;  SA      # ( 讀 → 讀 ) CJK COMPATIBILITY IDEOGRAPH-F95A → CJK UNIFIED IDEOGRAPH-8B80       # 
+
+8B8F ; 8B86 ;  SA      # ( 讏 → 讆 ) CJK UNIFIED IDEOGRAPH-8B8F → CJK UNIFIED IDEOGRAPH-8B86     # 
+
+FAC0 ; 8B8A ;  SA      # ( 變 → 變 ) CJK COMPATIBILITY IDEOGRAPH-FAC0 → CJK UNIFIED IDEOGRAPH-8B8A       # 
+2F9D1 ;        8B8A ;  SA      # ( 變 → 變 ) CJK COMPATIBILITY IDEOGRAPH-2F9D1 → CJK UNIFIED IDEOGRAPH-8B8A     # 
+
+2EC8 ; 8BA0 ;  SA      #* ( ⻈ → 讠 ) CJK RADICAL C-SIMPLIFIED SPEECH → CJK UNIFIED IDEOGRAPH-8BA0       # 
+
+2F95 ; 8C37 ;  SA      #* ( ⾕ → 谷 ) KANGXI RADICAL VALLEY → CJK UNIFIED IDEOGRAPH-8C37 # 
+
+2F96 ; 8C46 ;  SA      #* ( ⾖ → 豆 ) KANGXI RADICAL BEAN → CJK UNIFIED IDEOGRAPH-8C46   # 
+
+F900 ; 8C48 ;  SA      # ( 豈 → 豈 ) CJK COMPATIBILITY IDEOGRAPH-F900 → CJK UNIFIED IDEOGRAPH-8C48       # 
+
+2F9D2 ;        8C55 ;  SA      # ( 豕 → 豕 ) CJK COMPATIBILITY IDEOGRAPH-2F9D2 → CJK UNIFIED IDEOGRAPH-8C55     # 
+2F97 ; 8C55 ;  SA      #* ( ⾗ → 豕 ) KANGXI RADICAL PIG → CJK UNIFIED IDEOGRAPH-8C55    # 
+
+8C63 ; 8C5C ;  SA      # ( 豣 → 豜 ) CJK UNIFIED IDEOGRAPH-8C63 → CJK UNIFIED IDEOGRAPH-8C5C     # 
+
+2F98 ; 8C78 ;  SA      #* ( ⾘ → 豸 ) KANGXI RADICAL BADGER → CJK UNIFIED IDEOGRAPH-8C78 # 
+
+2F99 ; 8C9D ;  SA      #* ( ⾙ → 貝 ) KANGXI RADICAL SHELL → CJK UNIFIED IDEOGRAPH-8C9D  # 
+
+2F9D4 ;        8CAB ;  SA      # ( 貫 → 貫 ) CJK COMPATIBILITY IDEOGRAPH-2F9D4 → CJK UNIFIED IDEOGRAPH-8CAB     # 
+
+2F9D5 ;        8CC1 ;  SA      # ( 賁 → 賁 ) CJK COMPATIBILITY IDEOGRAPH-2F9D5 → CJK UNIFIED IDEOGRAPH-8CC1     # 
+
+F948 ; 8CC2 ;  SA      # ( 賂 → 賂 ) CJK COMPATIBILITY IDEOGRAPH-F948 → CJK UNIFIED IDEOGRAPH-8CC2       # 
+
+F903 ; 8CC8 ;  SA      # ( 賈 → 賈 ) CJK COMPATIBILITY IDEOGRAPH-F903 → CJK UNIFIED IDEOGRAPH-8CC8       # 
+
+FA64 ; 8CD3 ;  SA      # ( 賓 → 賓 ) CJK COMPATIBILITY IDEOGRAPH-FA64 → CJK UNIFIED IDEOGRAPH-8CD3       # 
+
+FA65 ; 8D08 ;  SA      # ( 贈 → 贈 ) CJK COMPATIBILITY IDEOGRAPH-FA65 → CJK UNIFIED IDEOGRAPH-8D08       # 
+FAC1 ; 8D08 ;  SA      # ( 贈 → 贈 ) CJK COMPATIBILITY IDEOGRAPH-FAC1 → CJK UNIFIED IDEOGRAPH-8D08       # 
+
+2F9D6 ;        8D1B ;  SA      # ( 贛 → 贛 ) CJK COMPATIBILITY IDEOGRAPH-2F9D6 → CJK UNIFIED IDEOGRAPH-8D1B     # 
+
+2EC9 ; 8D1D ;  SA      #* ( ⻉ → 贝 ) CJK RADICAL C-SIMPLIFIED SHELL → CJK UNIFIED IDEOGRAPH-8D1D        # 
+
+2F9A ; 8D64 ;  SA      #* ( ⾚ → 赤 ) KANGXI RADICAL RED → CJK UNIFIED IDEOGRAPH-8D64    # 
+
+2F9B ; 8D70 ;  SA      #* ( ⾛ → 走 ) KANGXI RADICAL RUN → CJK UNIFIED IDEOGRAPH-8D70    # 
+
+2F9D7 ;        8D77 ;  SA      # ( 起 → 起 ) CJK COMPATIBILITY IDEOGRAPH-2F9D7 → CJK UNIFIED IDEOGRAPH-8D77     # 
+
+8D86 ; 8D7F ;  SA      # ( 趆 → 赿 ) CJK UNIFIED IDEOGRAPH-8D86 → CJK UNIFIED IDEOGRAPH-8D7F     # 
+
+2F9C ; 8DB3 ;  SA      #* ( ⾜ → 足 ) KANGXI RADICAL FOOT → CJK UNIFIED IDEOGRAPH-8DB3   # 
+
+2F9DB ;        8DBC ;  SA      # ( 趼 → 趼 ) CJK COMPATIBILITY IDEOGRAPH-2F9DB → CJK UNIFIED IDEOGRAPH-8DBC     # 
+
+2F9DA ;        8DCB ;  SA      # ( 跋 → 跋 ) CJK COMPATIBILITY IDEOGRAPH-2F9DA → CJK UNIFIED IDEOGRAPH-8DCB     # 
+
+8DFA ; 8DE5 ;  SA      # ( 跺 → 跥 ) CJK UNIFIED IDEOGRAPH-8DFA → CJK UNIFIED IDEOGRAPH-8DE5     # 
+
+F937 ; 8DEF ;  SA      # ( 路 → 路 ) CJK COMPATIBILITY IDEOGRAPH-F937 → CJK UNIFIED IDEOGRAPH-8DEF       # 
+
+2F9DC ;        8DF0 ;  SA      # ( 跰 → 跰 ) CJK COMPATIBILITY IDEOGRAPH-2F9DC → CJK UNIFIED IDEOGRAPH-8DF0     # 
+
+8E9B ; 8E97 ;  SA      # ( 躛 → 躗 ) CJK UNIFIED IDEOGRAPH-8E9B → CJK UNIFIED IDEOGRAPH-8E97     # 
+
+2F9D ; 8EAB ;  SA      #* ( ⾝ → 身 ) KANGXI RADICAL BODY → CJK UNIFIED IDEOGRAPH-8EAB   # 
+
+F902 ; 8ECA ;  SA      # ( 車 → 車 ) CJK COMPATIBILITY IDEOGRAPH-F902 → CJK UNIFIED IDEOGRAPH-8ECA       # 
+2F9E ; 8ECA ;  SA      #* ( ⾞ → 車 ) KANGXI RADICAL CART → CJK UNIFIED IDEOGRAPH-8ECA   # 
+
+2F9DE ;        8ED4 ;  SA      # ( 軔 → 軔 ) CJK COMPATIBILITY IDEOGRAPH-2F9DE → CJK UNIFIED IDEOGRAPH-8ED4     # 
+
+8F27 ; 8EFF ;  SA      # ( 輧 → 軿 ) CJK UNIFIED IDEOGRAPH-8F27 → CJK UNIFIED IDEOGRAPH-8EFF     # 
+
+F998 ; 8F26 ;  SA      # ( 輦 → 輦 ) CJK COMPATIBILITY IDEOGRAPH-F998 → CJK UNIFIED IDEOGRAPH-8F26       # 
+
+F9D7 ; 8F2A ;  SA      # ( 輪 → 輪 ) CJK COMPATIBILITY IDEOGRAPH-F9D7 → CJK UNIFIED IDEOGRAPH-8F2A       # 
+
+FAC2 ; 8F38 ;  SA      # ( 輸 → 輸 ) CJK COMPATIBILITY IDEOGRAPH-FAC2 → CJK UNIFIED IDEOGRAPH-8F38       # 
+2F9DF ;        8F38 ;  SA      # ( 輸 → 輸 ) CJK COMPATIBILITY IDEOGRAPH-2F9DF → CJK UNIFIED IDEOGRAPH-8F38     # 
+
+FA07 ; 8F3B ;  SA      # ( 輻 → 輻 ) CJK COMPATIBILITY IDEOGRAPH-FA07 → CJK UNIFIED IDEOGRAPH-8F3B       # 
+
+F98D ; 8F62 ;  SA      # ( 轢 → 轢 ) CJK COMPATIBILITY IDEOGRAPH-F98D → CJK UNIFIED IDEOGRAPH-8F62       # 
+
+2ECB ; 8F66 ;  SA      #* ( ⻋ → 车 ) CJK RADICAL C-SIMPLIFIED CART → CJK UNIFIED IDEOGRAPH-8F66 # 
+
+2F9F ; 8F9B ;  SA      #* ( ⾟ → 辛 ) KANGXI RADICAL BITTER → CJK UNIFIED IDEOGRAPH-8F9B # 
+
+2F98D ;        8F9E ;  SA      # ( 辞 → 辞 ) CJK COMPATIBILITY IDEOGRAPH-2F98D → CJK UNIFIED IDEOGRAPH-8F9E     # 
+
+F971 ; 8FB0 ;  SA      # ( 辰 → 辰 ) CJK COMPATIBILITY IDEOGRAPH-F971 → CJK UNIFIED IDEOGRAPH-8FB0       # 
+2FA0 ; 8FB0 ;  SA      #* ( ⾠ → 辰 ) KANGXI RADICAL MORNING → CJK UNIFIED IDEOGRAPH-8FB0        # 
+
+2FA1 ; 8FB5 ;  SA      #* ( ⾡ → 辵 ) KANGXI RADICAL WALK → CJK UNIFIED IDEOGRAPH-8FB5   # 
+
+FA66 ; 8FB6 ;  SA      # ( 辶 → 辶 ) CJK COMPATIBILITY IDEOGRAPH-FA66 → CJK UNIFIED IDEOGRAPH-8FB6       # 
+2ECC ; 8FB6 ;  SA      #* ( ⻌ → 辶 ) CJK RADICAL SIMPLIFIED WALK → CJK UNIFIED IDEOGRAPH-8FB6   # 
+2ECD ; 8FB6 ;  SA      #* ( ⻍ → 辶 ) CJK RADICAL WALK ONE → CJK UNIFIED IDEOGRAPH-8FB6  # 
+
+F99A ; 9023 ;  SA      # ( 連 → 連 ) CJK COMPATIBILITY IDEOGRAPH-F99A → CJK UNIFIED IDEOGRAPH-9023       # 
+
+FA25 ; 9038 ;  SA      # ( 逸 → 逸 ) CJK COMPATIBILITY IDEOGRAPH-FA25 → CJK UNIFIED IDEOGRAPH-9038       # 
+FA67 ; 9038 ;  SA      # ( 逸 → 逸 ) CJK COMPATIBILITY IDEOGRAPH-FA67 → CJK UNIFIED IDEOGRAPH-9038       # 
+
+FAC3 ; 9072 ;  SA      # ( 遲 → 遲 ) CJK COMPATIBILITY IDEOGRAPH-FAC3 → CJK UNIFIED IDEOGRAPH-9072       # 
+
+F9C3 ; 907C ;  SA      # ( 遼 → 遼 ) CJK COMPATIBILITY IDEOGRAPH-F9C3 → CJK UNIFIED IDEOGRAPH-907C       # 
+
+F913 ; 908F ;  SA      # ( 邏 → 邏 ) CJK COMPATIBILITY IDEOGRAPH-F913 → CJK UNIFIED IDEOGRAPH-908F       # 
+
+2FA2 ; 9091 ;  SA      #* ( ⾢ → 邑 ) KANGXI RADICAL CITY → CJK UNIFIED IDEOGRAPH-9091   # 
+
+2F9E2 ;        9094 ;  SA      # ( 邔 → 邔 ) CJK COMPATIBILITY IDEOGRAPH-2F9E2 → CJK UNIFIED IDEOGRAPH-9094     # 
+
+F92C ; 90CE ;  SA      # ( 郎 → 郎 ) CJK COMPATIBILITY IDEOGRAPH-F92C → CJK UNIFIED IDEOGRAPH-90CE       # 
+90DE ; 90CE ;  SA      # ( 郞 → 郎 ) CJK UNIFIED IDEOGRAPH-90DE → CJK UNIFIED IDEOGRAPH-90CE     # →郎→
+
+2F9E3 ;        90F1 ;  SA      # ( 郱 → 郱 ) CJK COMPATIBILITY IDEOGRAPH-2F9E3 → CJK UNIFIED IDEOGRAPH-90F1     # 
+
+FA26 ; 90FD ;  SA      # ( 都 → 都 ) CJK COMPATIBILITY IDEOGRAPH-FA26 → CJK UNIFIED IDEOGRAPH-90FD       # 
+
+2F9E4 ;        9111 ;  SA      # ( 鄑 → 鄑 ) CJK COMPATIBILITY IDEOGRAPH-2F9E4 → CJK UNIFIED IDEOGRAPH-9111     # 
+
+2F9E6 ;        911B ;  SA      # ( 鄛 → 鄛 ) CJK COMPATIBILITY IDEOGRAPH-2F9E6 → CJK UNIFIED IDEOGRAPH-911B     # 
+
+2FA3 ; 9149 ;  SA      #* ( ⾣ → 酉 ) KANGXI RADICAL WINE → CJK UNIFIED IDEOGRAPH-9149   # 
+
+F919 ; 916A ;  SA      # ( 酪 → 酪 ) CJK COMPATIBILITY IDEOGRAPH-F919 → CJK UNIFIED IDEOGRAPH-916A       # 
+
+FAC4 ; 9199 ;  SA      # ( 醙 → 醙 ) CJK COMPATIBILITY IDEOGRAPH-FAC4 → CJK UNIFIED IDEOGRAPH-9199       # 
+
+F9B7 ; 91B4 ;  SA      # ( 醴 → 醴 ) CJK COMPATIBILITY IDEOGRAPH-F9B7 → CJK UNIFIED IDEOGRAPH-91B4       # 
+
+2FA4 ; 91C6 ;  SA      #* ( ⾤ → 釆 ) KANGXI RADICAL DISTINGUISH → CJK UNIFIED IDEOGRAPH-91C6    # 
+
+F9E9 ; 91CC ;  SA      # ( 里 → 里 ) CJK COMPATIBILITY IDEOGRAPH-F9E9 → CJK UNIFIED IDEOGRAPH-91CC       # 
+2FA5 ; 91CC ;  SA      #* ( ⾥ → 里 ) KANGXI RADICAL VILLAGE → CJK UNIFIED IDEOGRAPH-91CC        # 
+
+F97E ; 91CF ;  SA      # ( 量 → 量 ) CJK COMPATIBILITY IDEOGRAPH-F97E → CJK UNIFIED IDEOGRAPH-91CF       # 
+
+F90A ; 91D1 ;  SA      # ( 金 → 金 ) CJK COMPATIBILITY IDEOGRAPH-F90A → CJK UNIFIED IDEOGRAPH-91D1       # 
+2FA6 ; 91D1 ;  SA      #* ( ⾦ → 金 ) KANGXI RADICAL GOLD → CJK UNIFIED IDEOGRAPH-91D1   # 
+
+F9B1 ; 9234 ;  SA      # ( 鈴 → 鈴 ) CJK COMPATIBILITY IDEOGRAPH-F9B1 → CJK UNIFIED IDEOGRAPH-9234       # 
+
+2F9E7 ;        9238 ;  SA      # ( 鈸 → 鈸 ) CJK COMPATIBILITY IDEOGRAPH-2F9E7 → CJK UNIFIED IDEOGRAPH-9238     # 
+
+FAC5 ; 9276 ;  SA      # ( 鉶 → 鉶 ) CJK COMPATIBILITY IDEOGRAPH-FAC5 → CJK UNIFIED IDEOGRAPH-9276       # 
+
+2F9EA ;        927C ;  SA      # ( 鉼 → 鉼 ) CJK COMPATIBILITY IDEOGRAPH-2F9EA → CJK UNIFIED IDEOGRAPH-927C     # 
+
+2F9E8 ;        92D7 ;  SA      # ( 鋗 → 鋗 ) CJK COMPATIBILITY IDEOGRAPH-2F9E8 → CJK UNIFIED IDEOGRAPH-92D7     # 
+
+2F9E9 ;        92D8 ;  SA      # ( 鋘 → 鋘 ) CJK COMPATIBILITY IDEOGRAPH-2F9E9 → CJK UNIFIED IDEOGRAPH-92D8     # 
+
+F93F ; 9304 ;  SA      # ( 錄 → 錄 ) CJK COMPATIBILITY IDEOGRAPH-F93F → CJK UNIFIED IDEOGRAPH-9304       # 
+
+F99B ; 934A ;  SA      # ( 鍊 → 鍊 ) CJK COMPATIBILITY IDEOGRAPH-F99B → CJK UNIFIED IDEOGRAPH-934A       # 
+
+93AE ; 93AD ;  SA      # ( 鎮 → 鎭 ) CJK UNIFIED IDEOGRAPH-93AE → CJK UNIFIED IDEOGRAPH-93AD     # 
+
+2F9EB ;        93F9 ;  SA      # ( 鏹 → 鏹 ) CJK COMPATIBILITY IDEOGRAPH-2F9EB → CJK UNIFIED IDEOGRAPH-93F9     # 
+
+2F9EC ;        9415 ;  SA      # ( 鐕 → 鐕 ) CJK COMPATIBILITY IDEOGRAPH-2F9EC → CJK UNIFIED IDEOGRAPH-9415     # 
+
+2ED0 ; 9485 ;  SA      #* ( ⻐ → 钅 ) CJK RADICAL C-SIMPLIFIED GOLD → CJK UNIFIED IDEOGRAPH-9485 # 
+
+2ED1 ; 9577 ;  SA      #* ( ⻑ → 長 ) CJK RADICAL LONG ONE → CJK UNIFIED IDEOGRAPH-9577  # 
+2FA7 ; 9577 ;  SA      #* ( ⾧ → 長 ) KANGXI RADICAL LONG → CJK UNIFIED IDEOGRAPH-9577   # 
+
+2ED2 ; 9578 ;  SA      #* ( ⻒ → 镸 ) CJK RADICAL LONG TWO → CJK UNIFIED IDEOGRAPH-9578  # 
+
+2ED3 ; 957F ;  SA      #* ( ⻓ → 长 ) CJK RADICAL C-SIMPLIFIED LONG → CJK UNIFIED IDEOGRAPH-957F # 
+
+2FA8 ; 9580 ;  SA      #* ( ⾨ → 門 ) KANGXI RADICAL GATE → CJK UNIFIED IDEOGRAPH-9580   # 
+
+2F9EE ;        958B ;  SA      # ( 開 → 開 ) CJK COMPATIBILITY IDEOGRAPH-2F9EE → CJK UNIFIED IDEOGRAPH-958B     # 
+
+F986 ; 95AD ;  SA      # ( 閭 → 閭 ) CJK COMPATIBILITY IDEOGRAPH-F986 → CJK UNIFIED IDEOGRAPH-95AD       # 
+
+2F9F0 ;        95B7 ;  SA      # ( 閷 → 閷 ) CJK COMPATIBILITY IDEOGRAPH-2F9F0 → CJK UNIFIED IDEOGRAPH-95B7     # 
+
+2ED4 ; 95E8 ;  SA      #* ( ⻔ → 门 ) CJK RADICAL C-SIMPLIFIED GATE → CJK UNIFIED IDEOGRAPH-95E8 # 
+
+2FA9 ; 961C ;  SA      #* ( ⾩ → 阜 ) KANGXI RADICAL MOUND → CJK UNIFIED IDEOGRAPH-961C  # 
+
+2ECF ; 961D ;  SA      #* ( ⻏ → 阝 ) CJK RADICAL CITY → CJK UNIFIED IDEOGRAPH-961D      # 
+2ED6 ; 961D ;  SA      #* ( ⻖ → 阝 ) CJK RADICAL MOUND TWO → CJK UNIFIED IDEOGRAPH-961D # 
+
+F9C6 ; 962E ;  SA      # ( 阮 → 阮 ) CJK COMPATIBILITY IDEOGRAPH-F9C6 → CJK UNIFIED IDEOGRAPH-962E       # 
+
+F951 ; 964B ;  SA      # ( 陋 → 陋 ) CJK COMPATIBILITY IDEOGRAPH-F951 → CJK UNIFIED IDEOGRAPH-964B       # 
+
+FA09 ; 964D ;  SA      # ( 降 → 降 ) CJK COMPATIBILITY IDEOGRAPH-FA09 → CJK UNIFIED IDEOGRAPH-964D       # 
+
+F959 ; 9675 ;  SA      # ( 陵 → 陵 ) CJK COMPATIBILITY IDEOGRAPH-F959 → CJK UNIFIED IDEOGRAPH-9675       # 
+
+F9D3 ; 9678 ;  SA      # ( 陸 → 陸 ) CJK COMPATIBILITY IDEOGRAPH-F9D3 → CJK UNIFIED IDEOGRAPH-9678       # 
+
+FAC6 ; 967C ;  SA      # ( 陼 → 陼 ) CJK COMPATIBILITY IDEOGRAPH-FAC6 → CJK UNIFIED IDEOGRAPH-967C       # 
+
+F9DC ; 9686 ;  SA      # ( 隆 → 隆 ) CJK COMPATIBILITY IDEOGRAPH-F9DC → CJK UNIFIED IDEOGRAPH-9686       # 
+
+F9F1 ; 96A3 ;  SA      # ( 隣 → 隣 ) CJK COMPATIBILITY IDEOGRAPH-F9F1 → CJK UNIFIED IDEOGRAPH-96A3       # 
+
+2FAA ; 96B6 ;  SA      #* ( ⾪ → 隶 ) KANGXI RADICAL SLAVE → CJK UNIFIED IDEOGRAPH-96B6  # 
+
+96B8 ; 96B7 ;  SA      # ( 隸 → 隷 ) CJK UNIFIED IDEOGRAPH-96B8 → CJK UNIFIED IDEOGRAPH-96B7     # →隸→
+F9B8 ; 96B7 ;  SA      # ( 隸 → 隷 ) CJK COMPATIBILITY IDEOGRAPH-F9B8 → CJK UNIFIED IDEOGRAPH-96B7       # 
+
+2FAB ; 96B9 ;  SA      #* ( ⾫ → 隹 ) KANGXI RADICAL SHORT TAILED BIRD → CJK UNIFIED IDEOGRAPH-96B9      # 
+
+2F9F3 ;        96C3 ;  SA      # ( 雃 → 雃 ) CJK COMPATIBILITY IDEOGRAPH-2F9F3 → CJK UNIFIED IDEOGRAPH-96C3     # 
+
+F9EA ; 96E2 ;  SA      # ( 離 → 離 ) CJK COMPATIBILITY IDEOGRAPH-F9EA → CJK UNIFIED IDEOGRAPH-96E2       # 
+
+FA68 ; 96E3 ;  SA      # ( 難 → 難 ) CJK COMPATIBILITY IDEOGRAPH-FA68 → CJK UNIFIED IDEOGRAPH-96E3       # 
+FAC7 ; 96E3 ;  SA      # ( 難 → 難 ) CJK COMPATIBILITY IDEOGRAPH-FAC7 → CJK UNIFIED IDEOGRAPH-96E3       # 
+
+2FAC ; 96E8 ;  SA      #* ( ⾬ → 雨 ) KANGXI RADICAL RAIN → CJK UNIFIED IDEOGRAPH-96E8   # 
+
+F9B2 ; 96F6 ;  SA      # ( 零 → 零 ) CJK COMPATIBILITY IDEOGRAPH-F9B2 → CJK UNIFIED IDEOGRAPH-96F6       # 
+
+F949 ; 96F7 ;  SA      # ( 雷 → 雷 ) CJK COMPATIBILITY IDEOGRAPH-F949 → CJK UNIFIED IDEOGRAPH-96F7       # 
+
+2F9F5 ;        9723 ;  SA      # ( 霣 → 霣 ) CJK COMPATIBILITY IDEOGRAPH-2F9F5 → CJK UNIFIED IDEOGRAPH-9723     # 
+
+F938 ; 9732 ;  SA      # ( 露 → 露 ) CJK COMPATIBILITY IDEOGRAPH-F938 → CJK UNIFIED IDEOGRAPH-9732       # 
+
+F9B3 ; 9748 ;  SA      # ( 靈 → 靈 ) CJK COMPATIBILITY IDEOGRAPH-F9B3 → CJK UNIFIED IDEOGRAPH-9748       # 
+
+2FAD ; 9751 ;  SA      #* ( ⾭ → 靑 ) KANGXI RADICAL BLUE → CJK UNIFIED IDEOGRAPH-9751   # 
+
+2ED8 ; 9752 ;  SA      #* ( ⻘ → 青 ) CJK RADICAL BLUE → CJK UNIFIED IDEOGRAPH-9752      # 
+
+FA1C ; 9756 ;  SA      # ( 靖 → 靖 ) CJK COMPATIBILITY IDEOGRAPH-FA1C → CJK UNIFIED IDEOGRAPH-9756       # 
+FAC8 ; 9756 ;  SA      # ( 靖 → 靖 ) CJK COMPATIBILITY IDEOGRAPH-FAC8 → CJK UNIFIED IDEOGRAPH-9756       # 
+
+2FAE ; 975E ;  SA      #* ( ⾮ → 非 ) KANGXI RADICAL WRONG → CJK UNIFIED IDEOGRAPH-975E  # 
+
+2FAF ; 9762 ;  SA      #* ( ⾯ → 面 ) KANGXI RADICAL FACE → CJK UNIFIED IDEOGRAPH-9762   # 
+
+2FB0 ; 9769 ;  SA      #* ( ⾰ → 革 ) KANGXI RADICAL LEATHER → CJK UNIFIED IDEOGRAPH-9769        # 
+
+2FB1 ; 97CB ;  SA      #* ( ⾱ → 韋 ) KANGXI RADICAL TANNED LEATHER → CJK UNIFIED IDEOGRAPH-97CB # 
+
+FAC9 ; 97DB ;  SA      # ( 韛 → 韛 ) CJK COMPATIBILITY IDEOGRAPH-FAC9 → CJK UNIFIED IDEOGRAPH-97DB       # 
+
+2F9FA ;        97E0 ;  SA      # ( 韠 → 韠 ) CJK COMPATIBILITY IDEOGRAPH-2F9FA → CJK UNIFIED IDEOGRAPH-97E0     # 
+
+2ED9 ; 97E6 ;  SA      #* ( ⻙ → 韦 ) CJK RADICAL C-SIMPLIFIED TANNED LEATHER → CJK UNIFIED IDEOGRAPH-97E6       # 
+
+2FB2 ; 97ED ;  SA      #* ( ⾲ → 韭 ) KANGXI RADICAL LEEK → CJK UNIFIED IDEOGRAPH-97ED   # 
+
+2FB3 ; 97F3 ;  SA      #* ( ⾳ → 音 ) KANGXI RADICAL SOUND → CJK UNIFIED IDEOGRAPH-97F3  # 
+
+FA69 ; 97FF ;  SA      # ( 響 → 響 ) CJK COMPATIBILITY IDEOGRAPH-FA69 → CJK UNIFIED IDEOGRAPH-97FF       # 
+FACA ; 97FF ;  SA      # ( 響 → 響 ) CJK COMPATIBILITY IDEOGRAPH-FACA → CJK UNIFIED IDEOGRAPH-97FF       # 
+
+2FB4 ; 9801 ;  SA      #* ( ⾴ → 頁 ) KANGXI RADICAL LEAF → CJK UNIFIED IDEOGRAPH-9801   # 
+
+FACB ; 980B ;  SA      # ( 頋 → 頋 ) CJK COMPATIBILITY IDEOGRAPH-FACB → CJK UNIFIED IDEOGRAPH-980B       # 
+2F9FE ;        980B ;  SA      # ( 頋 → 頋 ) CJK COMPATIBILITY IDEOGRAPH-2F9FE → CJK UNIFIED IDEOGRAPH-980B     # 
+2F9FF ;        980B ;  SA      # ( 頋 → 頋 ) CJK COMPATIBILITY IDEOGRAPH-2F9FF → CJK UNIFIED IDEOGRAPH-980B     # 
+
+F9B4 ; 9818 ;  SA      # ( 領 → 領 ) CJK COMPATIBILITY IDEOGRAPH-F9B4 → CJK UNIFIED IDEOGRAPH-9818       # 
+
+2FA00 ;        9829 ;  SA      # ( 頩 → 頩 ) CJK COMPATIBILITY IDEOGRAPH-2FA00 → CJK UNIFIED IDEOGRAPH-9829     # 
+
+FA6A ; 983B ;  SA      # ( 頻 → 頻 ) CJK COMPATIBILITY IDEOGRAPH-FA6A → CJK UNIFIED IDEOGRAPH-983B       # 
+FACC ; 983B ;  SA      # ( 頻 → 頻 ) CJK COMPATIBILITY IDEOGRAPH-FACC → CJK UNIFIED IDEOGRAPH-983B       # 
+
+F9D0 ; 985E ;  SA      # ( 類 → 類 ) CJK COMPATIBILITY IDEOGRAPH-F9D0 → CJK UNIFIED IDEOGRAPH-985E       # 
+
+2EDA ; 9875 ;  SA      #* ( ⻚ → 页 ) CJK RADICAL C-SIMPLIFIED LEAF → CJK UNIFIED IDEOGRAPH-9875 # 
+
+2FB5 ; 98A8 ;  SA      #* ( ⾵ → 風 ) KANGXI RADICAL WIND → CJK UNIFIED IDEOGRAPH-98A8   # 
+
+2EDB ; 98CE ;  SA      #* ( ⻛ → 风 ) CJK RADICAL C-SIMPLIFIED WIND → CJK UNIFIED IDEOGRAPH-98CE # 
+
+2FB6 ; 98DB ;  SA      #* ( ⾶ → 飛 ) KANGXI RADICAL FLY → CJK UNIFIED IDEOGRAPH-98DB    # 
+
+2EDC ; 98DE ;  SA      #* ( ⻜ → 飞 ) CJK RADICAL C-SIMPLIFIED FLY → CJK UNIFIED IDEOGRAPH-98DE  # 
+
+2EDD ; 98DF ;  SA      #* ( ⻝ → 食 ) CJK RADICAL EAT ONE → CJK UNIFIED IDEOGRAPH-98DF   # 
+2FB7 ; 98DF ;  SA      #* ( ⾷ → 食 ) KANGXI RADICAL EAT → CJK UNIFIED IDEOGRAPH-98DF    # 
+
+2EDF ; 98E0 ;  SA      #* ( ⻟ → 飠 ) CJK RADICAL EAT THREE → CJK UNIFIED IDEOGRAPH-98E0 # 
+
+2FA02 ;        98E2 ;  SA      # ( 飢 → 飢 ) CJK COMPATIBILITY IDEOGRAPH-2FA02 → CJK UNIFIED IDEOGRAPH-98E2     # 
+
+FA2A ; 98EF ;  SA      # ( 飯 → 飯 ) CJK COMPATIBILITY IDEOGRAPH-FA2A → CJK UNIFIED IDEOGRAPH-98EF       # 
+
+FA2B ; 98FC ;  SA      # ( 飼 → 飼 ) CJK COMPATIBILITY IDEOGRAPH-FA2B → CJK UNIFIED IDEOGRAPH-98FC       # 
+
+FA2C ; 9928 ;  SA      # ( 館 → 館 ) CJK COMPATIBILITY IDEOGRAPH-FA2C → CJK UNIFIED IDEOGRAPH-9928       # 
+
+2FA04 ;        9929 ;  SA      # ( 餩 → 餩 ) CJK COMPATIBILITY IDEOGRAPH-2FA04 → CJK UNIFIED IDEOGRAPH-9929     # 
+
+2EE0 ; 9963 ;  SA      #* ( ⻠ → 饣 ) CJK RADICAL C-SIMPLIFIED EAT → CJK UNIFIED IDEOGRAPH-9963  # 
+
+2FB8 ; 9996 ;  SA      #* ( ⾸ → 首 ) KANGXI RADICAL HEAD → CJK UNIFIED IDEOGRAPH-9996   # 
+
+2FB9 ; 9999 ;  SA      #* ( ⾹ → 香 ) KANGXI RADICAL FRAGRANT → CJK UNIFIED IDEOGRAPH-9999       # 
+
+2FA05 ;        99A7 ;  SA      # ( 馧 → 馧 ) CJK COMPATIBILITY IDEOGRAPH-2FA05 → CJK UNIFIED IDEOGRAPH-99A7     # 
+
+2FBA ; 99AC ;  SA      #* ( ⾺ → 馬 ) KANGXI RADICAL HORSE → CJK UNIFIED IDEOGRAPH-99AC  # 
+
+2FA06 ;        99C2 ;  SA      # ( 駂 → 駂 ) CJK COMPATIBILITY IDEOGRAPH-2FA06 → CJK UNIFIED IDEOGRAPH-99C2     # 
+
+F91A ; 99F1 ;  SA      # ( 駱 → 駱 ) CJK COMPATIBILITY IDEOGRAPH-F91A → CJK UNIFIED IDEOGRAPH-99F1       # 
+
+2FA07 ;        99FE ;  SA      # ( 駾 → 駾 ) CJK COMPATIBILITY IDEOGRAPH-2FA07 → CJK UNIFIED IDEOGRAPH-99FE     # 
+
+F987 ; 9A6A ;  SA      # ( 驪 → 驪 ) CJK COMPATIBILITY IDEOGRAPH-F987 → CJK UNIFIED IDEOGRAPH-9A6A       # 
+
+2EE2 ; 9A6C ;  SA      #* ( ⻢ → 马 ) CJK RADICAL C-SIMPLIFIED HORSE → CJK UNIFIED IDEOGRAPH-9A6C        # 
+
+2FBB ; 9AA8 ;  SA      #* ( ⾻ → 骨 ) KANGXI RADICAL BONE → CJK UNIFIED IDEOGRAPH-9AA8   # 
+
+2FBC ; 9AD8 ;  SA      #* ( ⾼ → 高 ) KANGXI RADICAL TALL → CJK UNIFIED IDEOGRAPH-9AD8   # 
+
+2FBD ; 9ADF ;  SA      #* ( ⾽ → 髟 ) KANGXI RADICAL HAIR → CJK UNIFIED IDEOGRAPH-9ADF   # 
+
+FACD ; 9B12 ;  SA      # ( 鬒 → 鬒 ) CJK COMPATIBILITY IDEOGRAPH-FACD → CJK UNIFIED IDEOGRAPH-9B12       # 
+2FA0A ;        9B12 ;  SA      # ( 鬒 → 鬒 ) CJK COMPATIBILITY IDEOGRAPH-2FA0A → CJK UNIFIED IDEOGRAPH-9B12     # 
+
+2FBE ; 9B25 ;  SA      #* ( ⾾ → 鬥 ) KANGXI RADICAL FIGHT → CJK UNIFIED IDEOGRAPH-9B25  # 
+
+2FBF ; 9B2F ;  SA      #* ( ⾿ → 鬯 ) KANGXI RADICAL SACRIFICIAL WINE → CJK UNIFIED IDEOGRAPH-9B2F       # 
+
+2FC0 ; 9B32 ;  SA      #* ( ⿀ → 鬲 ) KANGXI RADICAL CAULDRON → CJK UNIFIED IDEOGRAPH-9B32       # 
+
+2FC1 ; 9B3C ;  SA      #* ( ⿁ → 鬼 ) KANGXI RADICAL GHOST → CJK UNIFIED IDEOGRAPH-9B3C  # 
+2EE4 ; 9B3C ;  SA      #* ( ⻤ → 鬼 ) CJK RADICAL GHOST → CJK UNIFIED IDEOGRAPH-9B3C     # 
+
+2FC2 ; 9B5A ;  SA      #* ( ⿂ → 魚 ) KANGXI RADICAL FISH → CJK UNIFIED IDEOGRAPH-9B5A   # 
+
+F939 ; 9B6F ;  SA      # ( 魯 → 魯 ) CJK COMPATIBILITY IDEOGRAPH-F939 → CJK UNIFIED IDEOGRAPH-9B6F       # 
+
+2FA0B ;        9C40 ;  SA      # ( 鱀 → 鱀 ) CJK COMPATIBILITY IDEOGRAPH-2FA0B → CJK UNIFIED IDEOGRAPH-9C40     # 
+
+F9F2 ; 9C57 ;  SA      # ( 鱗 → 鱗 ) CJK COMPATIBILITY IDEOGRAPH-F9F2 → CJK UNIFIED IDEOGRAPH-9C57       # 
+
+2EE5 ; 9C7C ;  SA      #* ( ⻥ → 鱼 ) CJK RADICAL C-SIMPLIFIED FISH → CJK UNIFIED IDEOGRAPH-9C7C # 
+
+2FC3 ; 9CE5 ;  SA      #* ( ⿃ → 鳥 ) KANGXI RADICAL BIRD → CJK UNIFIED IDEOGRAPH-9CE5   # 
+
+2FA0C ;        9CFD ;  SA      # ( 鳽 → 鳽 ) CJK COMPATIBILITY IDEOGRAPH-2FA0C → CJK UNIFIED IDEOGRAPH-9CFD     # 
+
+2FA0F ;        9D67 ;  SA      # ( 鵧 → 鵧 ) CJK COMPATIBILITY IDEOGRAPH-2FA0F → CJK UNIFIED IDEOGRAPH-9D67     # 
+
+FA2D ; 9DB4 ;  SA      # ( 鶴 → 鶴 ) CJK COMPATIBILITY IDEOGRAPH-FA2D → CJK UNIFIED IDEOGRAPH-9DB4       # 
+
+F93A ; 9DFA ;  SA      # ( 鷺 → 鷺 ) CJK COMPATIBILITY IDEOGRAPH-F93A → CJK UNIFIED IDEOGRAPH-9DFA       # 
+
+F920 ; 9E1E ;  SA      # ( 鸞 → 鸞 ) CJK COMPATIBILITY IDEOGRAPH-F920 → CJK UNIFIED IDEOGRAPH-9E1E       # 
+
+9E43 ; 9E42 ;  SA      # ( 鹃 → 鹂 ) CJK UNIFIED IDEOGRAPH-9E43 → CJK UNIFIED IDEOGRAPH-9E42     # 
+
+2FC4 ; 9E75 ;  SA      #* ( ⿄ → 鹵 ) KANGXI RADICAL SALT → CJK UNIFIED IDEOGRAPH-9E75   # 
+
+F940 ; 9E7F ;  SA      # ( 鹿 → 鹿 ) CJK COMPATIBILITY IDEOGRAPH-F940 → CJK UNIFIED IDEOGRAPH-9E7F       # 
+2FC5 ; 9E7F ;  SA      #* ( ⿅ → 鹿 ) KANGXI RADICAL DEER → CJK UNIFIED IDEOGRAPH-9E7F   # 
+
+F988 ; 9E97 ;  SA      # ( 麗 → 麗 ) CJK COMPATIBILITY IDEOGRAPH-F988 → CJK UNIFIED IDEOGRAPH-9E97       # 
+
+F9F3 ; 9E9F ;  SA      # ( 麟 → 麟 ) CJK COMPATIBILITY IDEOGRAPH-F9F3 → CJK UNIFIED IDEOGRAPH-9E9F       # 
+
+2FC6 ; 9EA5 ;  SA      #* ( ⿆ → 麥 ) KANGXI RADICAL WHEAT → CJK UNIFIED IDEOGRAPH-9EA5  # 
+
+2EE8 ; 9EA6 ;  SA      #* ( ⻨ → 麦 ) CJK RADICAL SIMPLIFIED WHEAT → CJK UNIFIED IDEOGRAPH-9EA6  # 
+
+2FA15 ;        9EBB ;  SA      # ( 麻 → 麻 ) CJK COMPATIBILITY IDEOGRAPH-2FA15 → CJK UNIFIED IDEOGRAPH-9EBB     # 
+2FC7 ; 9EBB ;  SA      #* ( ⿇ → 麻 ) KANGXI RADICAL HEMP → CJK UNIFIED IDEOGRAPH-9EBB   # 
+
+2FC8 ; 9EC3 ;  SA      #* ( ⿈ → 黃 ) KANGXI RADICAL YELLOW → CJK UNIFIED IDEOGRAPH-9EC3 # 
+
+2EE9 ; 9EC4 ;  SA      #* ( ⻩ → 黄 ) CJK RADICAL SIMPLIFIED YELLOW → CJK UNIFIED IDEOGRAPH-9EC4 # 
+
+2FC9 ; 9ECD ;  SA      #* ( ⿉ → 黍 ) KANGXI RADICAL MILLET → CJK UNIFIED IDEOGRAPH-9ECD # 
+
+F989 ; 9ECE ;  SA      # ( 黎 → 黎 ) CJK COMPATIBILITY IDEOGRAPH-F989 → CJK UNIFIED IDEOGRAPH-9ECE       # 
+
+2FCA ; 9ED1 ;  SA      #* ( ⿊ → 黑 ) KANGXI RADICAL BLACK → CJK UNIFIED IDEOGRAPH-9ED1  # 
+9ED2 ; 9ED1 ;  SA      # ( 黒 → 黑 ) CJK UNIFIED IDEOGRAPH-9ED2 → CJK UNIFIED IDEOGRAPH-9ED1     # →⿊→
+
+2FA17 ;        9EF9 ;  SA      # ( 黹 → 黹 ) CJK COMPATIBILITY IDEOGRAPH-2FA17 → CJK UNIFIED IDEOGRAPH-9EF9     # 
+2FCB ; 9EF9 ;  SA      #* ( ⿋ → 黹 ) KANGXI RADICAL EMBROIDERY → CJK UNIFIED IDEOGRAPH-9EF9     # 
+
+2FCC ; 9EFD ;  SA      #* ( ⿌ → 黽 ) KANGXI RADICAL FROG → CJK UNIFIED IDEOGRAPH-9EFD   # 
+
+2FA18 ;        9EFE ;  SA      # ( 黾 → 黾 ) CJK COMPATIBILITY IDEOGRAPH-2FA18 → CJK UNIFIED IDEOGRAPH-9EFE     # 
+
+2FA19 ;        9F05 ;  SA      # ( 鼅 → 鼅 ) CJK COMPATIBILITY IDEOGRAPH-2FA19 → CJK UNIFIED IDEOGRAPH-9F05     # 
+
+2FCD ; 9F0E ;  SA      #* ( ⿍ → 鼎 ) KANGXI RADICAL TRIPOD → CJK UNIFIED IDEOGRAPH-9F0E # 
+
+2FA1A ;        9F0F ;  SA      # ( 鼏 → 鼏 ) CJK COMPATIBILITY IDEOGRAPH-2FA1A → CJK UNIFIED IDEOGRAPH-9F0F     # 
+
+2FCE ; 9F13 ;  SA      #* ( ⿎ → 鼓 ) KANGXI RADICAL DRUM → CJK UNIFIED IDEOGRAPH-9F13   # 
+
+2FA1B ;        9F16 ;  SA      # ( 鼖 → 鼖 ) CJK COMPATIBILITY IDEOGRAPH-2FA1B → CJK UNIFIED IDEOGRAPH-9F16     # 
+
+2FCF ; 9F20 ;  SA      #* ( ⿏ → 鼠 ) KANGXI RADICAL RAT → CJK UNIFIED IDEOGRAPH-9F20    # 
+
+2FA1C ;        9F3B ;  SA      # ( 鼻 → 鼻 ) CJK COMPATIBILITY IDEOGRAPH-2FA1C → CJK UNIFIED IDEOGRAPH-9F3B     # 
+2FD0 ; 9F3B ;  SA      #* ( ⿐ → 鼻 ) KANGXI RADICAL NOSE → CJK UNIFIED IDEOGRAPH-9F3B   # 
+
+FAD8 ; 9F43 ;  SA      # ( 齃 → 齃 ) CJK COMPATIBILITY IDEOGRAPH-FAD8 → CJK UNIFIED IDEOGRAPH-9F43       # 
+
+2FD1 ; 9F4A ;  SA      #* ( ⿑ → 齊 ) KANGXI RADICAL EVEN → CJK UNIFIED IDEOGRAPH-9F4A   # 
+
+2EEC ; 9F50 ;  SA      #* ( ⻬ → 齐 ) CJK RADICAL C-SIMPLIFIED EVEN → CJK UNIFIED IDEOGRAPH-9F50 # 
+
+2FD2 ; 9F52 ;  SA      #* ( ⿒ → 齒 ) KANGXI RADICAL TOOTH → CJK UNIFIED IDEOGRAPH-9F52  # 
+
+2EEE ; 9F7F ;  SA      #* ( ⻮ → 齿 ) CJK RADICAL C-SIMPLIFIED TOOTH → CJK UNIFIED IDEOGRAPH-9F7F        # 
+
+F9C4 ; 9F8D ;  SA      # ( 龍 → 龍 ) CJK COMPATIBILITY IDEOGRAPH-F9C4 → CJK UNIFIED IDEOGRAPH-9F8D       # 
+2FD3 ; 9F8D ;  SA      #* ( ⿓ → 龍 ) KANGXI RADICAL DRAGON → CJK UNIFIED IDEOGRAPH-9F8D # 
+
+FAD9 ; 9F8E ;  SA      # ( 龎 → 龎 ) CJK COMPATIBILITY IDEOGRAPH-FAD9 → CJK UNIFIED IDEOGRAPH-9F8E       # 
+
+2EF0 ; 9F99 ;  SA      #* ( ⻰ → 龙 ) CJK RADICAL C-SIMPLIFIED DRAGON → CJK UNIFIED IDEOGRAPH-9F99       # 
+
+F907 ; 9F9C ;  SA      # ( 龜 → 龜 ) CJK COMPATIBILITY IDEOGRAPH-F907 → CJK UNIFIED IDEOGRAPH-9F9C       # 
+F908 ; 9F9C ;  SA      # ( 龜 → 龜 ) CJK COMPATIBILITY IDEOGRAPH-F908 → CJK UNIFIED IDEOGRAPH-9F9C       # 
+FACE ; 9F9C ;  SA      # ( 龜 → 龜 ) CJK COMPATIBILITY IDEOGRAPH-FACE → CJK UNIFIED IDEOGRAPH-9F9C       # 
+2FD4 ; 9F9C ;  SA      #* ( ⿔ → 龜 ) KANGXI RADICAL TURTLE → CJK UNIFIED IDEOGRAPH-9F9C # 
+
+2EF3 ; 9F9F ;  SA      #* ( ⻳ → 龟 ) CJK RADICAL C-SIMPLIFIED TURTLE → CJK UNIFIED IDEOGRAPH-9F9F       # 
+
+2FD5 ; 9FA0 ;  SA      #* ( ⿕ → 龠 ) KANGXI RADICAL FLUTE → CJK UNIFIED IDEOGRAPH-9FA0  # 
+
+2F80C ;        349E ;  SA      # ( 㒞 → 㒞 ) CJK COMPATIBILITY IDEOGRAPH-2F80C → CJK UNIFIED IDEOGRAPH-349E     # 
+
+2F813 ;        34B9 ;  SA      # ( 㒹 → 㒹 ) CJK COMPATIBILITY IDEOGRAPH-2F813 → CJK UNIFIED IDEOGRAPH-34B9     # 
+
+2F9CA ;        34BB ;  SA      # ( 㒻 → 㒻 ) CJK COMPATIBILITY IDEOGRAPH-2F9CA → CJK UNIFIED IDEOGRAPH-34BB     # 
+
+2F81F ;        34DF ;  SA      # ( 㓟 → 㓟 ) CJK COMPATIBILITY IDEOGRAPH-2F81F → CJK UNIFIED IDEOGRAPH-34DF     # 
+
+2F824 ;        3515 ;  SA      # ( 㔕 → 㔕 ) CJK COMPATIBILITY IDEOGRAPH-2F824 → CJK UNIFIED IDEOGRAPH-3515     # 
+
+2E8B ; 353E ;  SA      #* ( ⺋ → 㔾 ) CJK RADICAL SEAL → CJK UNIFIED IDEOGRAPH-353E      # 
+
+439B ; 3588 ;  SA      # ( 䎛 → 㖈 ) CJK UNIFIED IDEOGRAPH-439B → CJK UNIFIED IDEOGRAPH-3588     # 
+
+39B3 ; 363D ;  SA      # ( 㦳 → 㘽 ) CJK UNIFIED IDEOGRAPH-39B3 → CJK UNIFIED IDEOGRAPH-363D     # 
+
+2F867 ;        36EE ;  SA      # ( 㛮 → 㛮 ) CJK COMPATIBILITY IDEOGRAPH-2F867 → CJK UNIFIED IDEOGRAPH-36EE     # 
+
+2F868 ;        36FC ;  SA      # ( 㛼 → 㛼 ) CJK COMPATIBILITY IDEOGRAPH-2F868 → CJK UNIFIED IDEOGRAPH-36FC     # 
+
+2F876 ;        3781 ;  SA      # ( 㞁 → 㞁 ) CJK COMPATIBILITY IDEOGRAPH-2F876 → CJK UNIFIED IDEOGRAPH-3781     # 
+
+2F883 ;        382F ;  SA      # ( 㠯 → 㠯 ) CJK COMPATIBILITY IDEOGRAPH-2F883 → CJK UNIFIED IDEOGRAPH-382F     # 
+
+2F888 ;        3862 ;  SA      # ( 㡢 → 㡢 ) CJK COMPATIBILITY IDEOGRAPH-2F888 → CJK UNIFIED IDEOGRAPH-3862     # 
+
+2F88A ;        387C ;  SA      # ( 㡼 → 㡼 ) CJK COMPATIBILITY IDEOGRAPH-2F88A → CJK UNIFIED IDEOGRAPH-387C     # 
+
+2F896 ;        38C7 ;  SA      # ( 㣇 → 㣇 ) CJK COMPATIBILITY IDEOGRAPH-2F896 → CJK UNIFIED IDEOGRAPH-38C7     # 
+
+2F89B ;        38E3 ;  SA      # ( 㣣 → 㣣 ) CJK COMPATIBILITY IDEOGRAPH-2F89B → CJK UNIFIED IDEOGRAPH-38E3     # 
+
+2E97 ; 38FA ;  SA      #* ( ⺗ → 㣺 ) CJK RADICAL HEART TWO → CJK UNIFIED IDEOGRAPH-38FA # 
+
+2F8A2 ;        391C ;  SA      # ( 㤜 → 㤜 ) CJK COMPATIBILITY IDEOGRAPH-2F8A2 → CJK UNIFIED IDEOGRAPH-391C     # 
+
+2F8A1 ;        393A ;  SA      # ( 㤺 → 㤺 ) CJK COMPATIBILITY IDEOGRAPH-2F8A1 → CJK UNIFIED IDEOGRAPH-393A     # 
+
+2F8C2 ;        3A2E ;  SA      # ( 㨮 → 㨮 ) CJK COMPATIBILITY IDEOGRAPH-2F8C2 → CJK UNIFIED IDEOGRAPH-3A2E     # 
+
+6409 ; 3A41 ;  SA      # ( 搉 → 㩁 ) CJK UNIFIED IDEOGRAPH-6409 → CJK UNIFIED IDEOGRAPH-3A41     # 
+
+2F8C7 ;        3A6C ;  SA      # ( 㩬 → 㩬 ) CJK COMPATIBILITY IDEOGRAPH-2F8C7 → CJK UNIFIED IDEOGRAPH-3A6C     # 
+
+66F6 ; 3ADA ;  SA      # ( 曶 → 㫚 ) CJK UNIFIED IDEOGRAPH-66F6 → CJK UNIFIED IDEOGRAPH-3ADA     # 
+
+2F8D1 ;        3AE4 ;  SA      # ( 㫤 → 㫤 ) CJK COMPATIBILITY IDEOGRAPH-2F8D1 → CJK UNIFIED IDEOGRAPH-3AE4     # 
+
+2F8D0 ;        3B08 ;  SA      # ( 㬈 → 㬈 ) CJK COMPATIBILITY IDEOGRAPH-2F8D0 → CJK UNIFIED IDEOGRAPH-3B08     # 
+
+2F8CE ;        3B19 ;  SA      # ( 㬙 → 㬙 ) CJK COMPATIBILITY IDEOGRAPH-2F8CE → CJK UNIFIED IDEOGRAPH-3B19     # 
+
+80F6 ; 3B35 ;  SA      # ( 胶 → 㬵 ) CJK UNIFIED IDEOGRAPH-80F6 → CJK UNIFIED IDEOGRAPH-3B35     # 
+
+5E50 ; 3B3A ;  SA      # ( 幐 → 㬺 ) CJK UNIFIED IDEOGRAPH-5E50 → CJK UNIFIED IDEOGRAPH-3B3A     # 
+
+4420 ; 3B3B ;  SA      # ( 䐠 → 㬻 ) CJK UNIFIED IDEOGRAPH-4420 → CJK UNIFIED IDEOGRAPH-3B3B     # 
+
+2F8DE ;        3B49 ;  SA      # ( 㭉 → 㭉 ) CJK COMPATIBILITY IDEOGRAPH-2F8DE → CJK UNIFIED IDEOGRAPH-3B49     # 
+
+FAD2 ; 3B9D ;  SA      # ( 㮝 → 㮝 ) CJK COMPATIBILITY IDEOGRAPH-FAD2 → CJK UNIFIED IDEOGRAPH-3B9D       # 
+2F8E7 ;        3B9D ;  SA      # ( 㮝 → 㮝 ) CJK COMPATIBILITY IDEOGRAPH-2F8E7 → CJK UNIFIED IDEOGRAPH-3B9D     # 
+
+69E9 ; 3BA3 ;  SA      # ( 槩 → 㮣 ) CJK UNIFIED IDEOGRAPH-69E9 → CJK UNIFIED IDEOGRAPH-3BA3     # 
+
+2F8EE ;        3C18 ;  SA      # ( 㰘 → 㰘 ) CJK COMPATIBILITY IDEOGRAPH-2F8EE → CJK UNIFIED IDEOGRAPH-3C18     # 
+
+2F8F2 ;        3C4E ;  SA      # ( 㱎 → 㱎 ) CJK COMPATIBILITY IDEOGRAPH-2F8F2 → CJK UNIFIED IDEOGRAPH-3C4E     # 
+
+2F90A ;        3D33 ;  SA      # ( 㴳 → 㴳 ) CJK COMPATIBILITY IDEOGRAPH-2F90A → CJK UNIFIED IDEOGRAPH-3D33     # 
+
+2F916 ;        3D96 ;  SA      # ( 㶖 → 㶖 ) CJK COMPATIBILITY IDEOGRAPH-2F916 → CJK UNIFIED IDEOGRAPH-3D96     # 
+
+2F92A ;        3EAC ;  SA      # ( 㺬 → 㺬 ) CJK COMPATIBILITY IDEOGRAPH-2F92A → CJK UNIFIED IDEOGRAPH-3EAC     # 
+
+2F92C ;        3EB8 ;  SA      # ( 㺸 → 㺸 ) CJK COMPATIBILITY IDEOGRAPH-2F92C → CJK UNIFIED IDEOGRAPH-3EB8     # 
+2F92D ;        3EB8 ;  SA      # ( 㺸 → 㺸 ) CJK COMPATIBILITY IDEOGRAPH-2F92D → CJK UNIFIED IDEOGRAPH-3EB8     # 
+
+2F933 ;        3F1B ;  SA      # ( 㼛 → 㼛 ) CJK COMPATIBILITY IDEOGRAPH-2F933 → CJK UNIFIED IDEOGRAPH-3F1B     # 
+
+2F93E ;        3FFC ;  SA      # ( 㿼 → 㿼 ) CJK COMPATIBILITY IDEOGRAPH-2F93E → CJK UNIFIED IDEOGRAPH-3FFC     # 
+
+2F93F ;        4008 ;  SA      # ( 䀈 → 䀈 ) CJK COMPATIBILITY IDEOGRAPH-2F93F → CJK UNIFIED IDEOGRAPH-4008     # 
+
+FAD3 ; 4018 ;  SA      # ( 䀘 → 䀘 ) CJK COMPATIBILITY IDEOGRAPH-FAD3 → CJK UNIFIED IDEOGRAPH-4018       # 
+
+9FC3 ; 4039 ;  SA      # ( 鿃 → 䀹 ) CJK UNIFIED IDEOGRAPH-9FC3 → CJK UNIFIED IDEOGRAPH-4039     # →䀹→
+FAD4 ; 4039 ;  SA      # ( 䀹 → 䀹 ) CJK COMPATIBILITY IDEOGRAPH-FAD4 → CJK UNIFIED IDEOGRAPH-4039       # 
+2F949 ;        4039 ;  SA      # ( 䀹 → 䀹 ) CJK COMPATIBILITY IDEOGRAPH-2F949 → CJK UNIFIED IDEOGRAPH-4039     # 
+
+6663 ; 403F ;  SA      # ( 晣 → 䀿 ) CJK UNIFIED IDEOGRAPH-6663 → CJK UNIFIED IDEOGRAPH-403F     # 
+
+2F94B ;        4046 ;  SA      # ( 䁆 → 䁆 ) CJK COMPATIBILITY IDEOGRAPH-2F94B → CJK UNIFIED IDEOGRAPH-4046     # 
+
+2F94C ;        4096 ;  SA      # ( 䂖 → 䂖 ) CJK COMPATIBILITY IDEOGRAPH-2F94C → CJK UNIFIED IDEOGRAPH-4096     # 
+
+2F951 ;        40E3 ;  SA      # ( 䃣 → 䃣 ) CJK COMPATIBILITY IDEOGRAPH-2F951 → CJK UNIFIED IDEOGRAPH-40E3     # 
+
+2F958 ;        412F ;  SA      # ( 䄯 → 䄯 ) CJK COMPATIBILITY IDEOGRAPH-2F958 → CJK UNIFIED IDEOGRAPH-412F     # 
+
+2F960 ;        4202 ;  SA      # ( 䈂 → 䈂 ) CJK COMPATIBILITY IDEOGRAPH-2F960 → CJK UNIFIED IDEOGRAPH-4202     # 
+
+2F964 ;        4227 ;  SA      # ( 䈧 → 䈧 ) CJK COMPATIBILITY IDEOGRAPH-2F964 → CJK UNIFIED IDEOGRAPH-4227     # 
+
+2F967 ;        42A0 ;  SA      # ( 䊠 → 䊠 ) CJK COMPATIBILITY IDEOGRAPH-2F967 → CJK UNIFIED IDEOGRAPH-42A0     # 
+
+2F96D ;        4301 ;  SA      # ( 䌁 → 䌁 ) CJK COMPATIBILITY IDEOGRAPH-2F96D → CJK UNIFIED IDEOGRAPH-4301     # 
+
+2F971 ;        4334 ;  SA      # ( 䌴 → 䌴 ) CJK COMPATIBILITY IDEOGRAPH-2F971 → CJK UNIFIED IDEOGRAPH-4334     # 
+
+2F974 ;        4359 ;  SA      # ( 䍙 → 䍙 ) CJK COMPATIBILITY IDEOGRAPH-2F974 → CJK UNIFIED IDEOGRAPH-4359     # 
+
+2F981 ;        43D5 ;  SA      # ( 䏕 → 䏕 ) CJK COMPATIBILITY IDEOGRAPH-2F981 → CJK UNIFIED IDEOGRAPH-43D5     # 
+
+2F8D7 ;        43D9 ;  SA      # ( 䏙 → 䏙 ) CJK COMPATIBILITY IDEOGRAPH-2F8D7 → CJK UNIFIED IDEOGRAPH-43D9     # 
+
+2F984 ;        440B ;  SA      # ( 䐋 → 䐋 ) CJK COMPATIBILITY IDEOGRAPH-2F984 → CJK UNIFIED IDEOGRAPH-440B     # 
+
+6726 ; 4443 ;  SA      # ( 朦 → 䑃 ) CJK UNIFIED IDEOGRAPH-6726 → CJK UNIFIED IDEOGRAPH-4443     # 
+
+2F98E ;        446B ;  SA      # ( 䑫 → 䑫 ) CJK COMPATIBILITY IDEOGRAPH-2F98E → CJK UNIFIED IDEOGRAPH-446B     # 
+
+2F9A7 ;        452B ;  SA      # ( 䔫 → 䔫 ) CJK COMPATIBILITY IDEOGRAPH-2F9A7 → CJK UNIFIED IDEOGRAPH-452B     # 
+
+2F9AE ;        455D ;  SA      # ( 䕝 → 䕝 ) CJK COMPATIBILITY IDEOGRAPH-2F9AE → CJK UNIFIED IDEOGRAPH-455D     # 
+
+2F9AF ;        4561 ;  SA      # ( 䕡 → 䕡 ) CJK COMPATIBILITY IDEOGRAPH-2F9AF → CJK UNIFIED IDEOGRAPH-4561     # 
+
+2F9B2 ;        456B ;  SA      # ( 䕫 → 䕫 ) CJK COMPATIBILITY IDEOGRAPH-2F9B2 → CJK UNIFIED IDEOGRAPH-456B     # 
+
+2F9BF ;        45D7 ;  SA      # ( 䗗 → 䗗 ) CJK COMPATIBILITY IDEOGRAPH-2F9BF → CJK UNIFIED IDEOGRAPH-45D7     # 
+
+2F9C2 ;        45F9 ;  SA      # ( 䗹 → 䗹 ) CJK COMPATIBILITY IDEOGRAPH-2F9C2 → CJK UNIFIED IDEOGRAPH-45F9     # 
+
+2F9C8 ;        4635 ;  SA      # ( 䘵 → 䘵 ) CJK COMPATIBILITY IDEOGRAPH-2F9C8 → CJK UNIFIED IDEOGRAPH-4635     # 
+
+8A1E ; 46B6 ;  SA      # ( 訞 → 䚶 ) CJK UNIFIED IDEOGRAPH-8A1E → CJK UNIFIED IDEOGRAPH-46B6     # 
+
+2F9CD ;        46BE ;  SA      # ( 䚾 → 䚾 ) CJK COMPATIBILITY IDEOGRAPH-2F9CD → CJK UNIFIED IDEOGRAPH-46BE     # 
+
+2F9CE ;        46C7 ;  SA      # ( 䛇 → 䛇 ) CJK COMPATIBILITY IDEOGRAPH-2F9CE → CJK UNIFIED IDEOGRAPH-46C7     # 
+
+2F9EF ;        4995 ;  SA      # ( 䦕 → 䦕 ) CJK COMPATIBILITY IDEOGRAPH-2F9EF → CJK UNIFIED IDEOGRAPH-4995     # 
+
+2F9F2 ;        49E6 ;  SA      # ( 䧦 → 䧦 ) CJK COMPATIBILITY IDEOGRAPH-2F9F2 → CJK UNIFIED IDEOGRAPH-49E6     # 
+
+2F9F8 ;        4A6E ;  SA      # ( 䩮 → 䩮 ) CJK COMPATIBILITY IDEOGRAPH-2F9F8 → CJK UNIFIED IDEOGRAPH-4A6E     # 
+
+2F9F9 ;        4A76 ;  SA      # ( 䩶 → 䩶 ) CJK COMPATIBILITY IDEOGRAPH-2F9F9 → CJK UNIFIED IDEOGRAPH-4A76     # 
+
+2F9FC ;        4AB2 ;  SA      # ( 䪲 → 䪲 ) CJK COMPATIBILITY IDEOGRAPH-2F9FC → CJK UNIFIED IDEOGRAPH-4AB2     # 
+
+2FA03 ;        4B33 ;  SA      # ( 䬳 → 䬳 ) CJK COMPATIBILITY IDEOGRAPH-2FA03 → CJK UNIFIED IDEOGRAPH-4B33     # 
+
+2FA08 ;        4BCE ;  SA      # ( 䯎 → 䯎 ) CJK COMPATIBILITY IDEOGRAPH-2FA08 → CJK UNIFIED IDEOGRAPH-4BCE     # 
+
+2FA0D ;        4CCE ;  SA      # ( 䳎 → 䳎 ) CJK COMPATIBILITY IDEOGRAPH-2FA0D → CJK UNIFIED IDEOGRAPH-4CCE     # 
+
+2FA0E ;        4CED ;  SA      # ( 䳭 → 䳭 ) CJK COMPATIBILITY IDEOGRAPH-2FA0E → CJK UNIFIED IDEOGRAPH-4CED     # 
+
+2FA11 ;        4CF8 ;  SA      # ( 䳸 → 䳸 ) CJK COMPATIBILITY IDEOGRAPH-2FA11 → CJK UNIFIED IDEOGRAPH-4CF8     # 
+
+2FA16 ;        4D56 ;  SA      # ( 䵖 → 䵖 ) CJK COMPATIBILITY IDEOGRAPH-2FA16 → CJK UNIFIED IDEOGRAPH-4D56     # 
+
+2F803 ;        20122 ; SA      # ( 𠄢 → 𠄢 ) CJK COMPATIBILITY IDEOGRAPH-2F803 → CJK UNIFIED IDEOGRAPH-20122   # 
+
+2F812 ;        2051C ; SA      # ( 𠔜 → 𠔜 ) CJK COMPATIBILITY IDEOGRAPH-2F812 → CJK UNIFIED IDEOGRAPH-2051C   # 
+
+2F91B ;        20525 ; SA      # ( 𠔥 → 𠔥 ) CJK COMPATIBILITY IDEOGRAPH-2F91B → CJK UNIFIED IDEOGRAPH-20525   # 
+
+2F816 ;        2054B ; SA      # ( 𠕋 → 𠕋 ) CJK COMPATIBILITY IDEOGRAPH-2F816 → CJK UNIFIED IDEOGRAPH-2054B   # 
+
+2F80D ;        2063A ; SA      # ( 𠘺 → 𠘺 ) CJK COMPATIBILITY IDEOGRAPH-2F80D → CJK UNIFIED IDEOGRAPH-2063A   # 
+
+2F9D9 ;        20804 ; SA      # ( 𠠄 → 𠠄 ) CJK COMPATIBILITY IDEOGRAPH-2F9D9 → CJK UNIFIED IDEOGRAPH-20804   # 
+
+2F9DD ;        208DE ; SA      # ( 𠣞 → 𠣞 ) CJK COMPATIBILITY IDEOGRAPH-2F9DD → CJK UNIFIED IDEOGRAPH-208DE   # 
+
+2F834 ;        20A2C ; SA      # ( 𠨬 → 𠨬 ) CJK COMPATIBILITY IDEOGRAPH-2F834 → CJK UNIFIED IDEOGRAPH-20A2C   # 
+
+2F838 ;        20B63 ; SA      # ( 𠭣 → 𠭣 ) CJK COMPATIBILITY IDEOGRAPH-2F838 → CJK UNIFIED IDEOGRAPH-20B63   # 
+
+2F859 ;        214E4 ; SA      # ( 𡓤 → 𡓤 ) CJK COMPATIBILITY IDEOGRAPH-2F859 → CJK UNIFIED IDEOGRAPH-214E4   # 
+
+2F860 ;        216A8 ; SA      # ( 𡚨 → 𡚨 ) CJK COMPATIBILITY IDEOGRAPH-2F860 → CJK UNIFIED IDEOGRAPH-216A8   # 
+
+2F861 ;        216EA ; SA      # ( 𡛪 → 𡛪 ) CJK COMPATIBILITY IDEOGRAPH-2F861 → CJK UNIFIED IDEOGRAPH-216EA   # 
+
+2F86C ;        219C8 ; SA      # ( 𡧈 → 𡧈 ) CJK COMPATIBILITY IDEOGRAPH-2F86C → CJK UNIFIED IDEOGRAPH-219C8   # 
+
+2F871 ;        21B18 ; SA      # ( 𡬘 → 𡬘 ) CJK COMPATIBILITY IDEOGRAPH-2F871 → CJK UNIFIED IDEOGRAPH-21B18   # 
+
+2F8F8 ;        21D0B ; SA      # ( 𡴋 → 𡴋 ) CJK COMPATIBILITY IDEOGRAPH-2F8F8 → CJK UNIFIED IDEOGRAPH-21D0B   # 
+
+2F87B ;        21DE4 ; SA      # ( 𡷤 → 𡷤 ) CJK COMPATIBILITY IDEOGRAPH-2F87B → CJK UNIFIED IDEOGRAPH-21DE4   # 
+
+2F87D ;        21DE6 ; SA      # ( 𡷦 → 𡷦 ) CJK COMPATIBILITY IDEOGRAPH-2F87D → CJK UNIFIED IDEOGRAPH-21DE6   # 
+
+2F889 ;        22183 ; SA      # ( 𢆃 → 𢆃 ) CJK COMPATIBILITY IDEOGRAPH-2F889 → CJK UNIFIED IDEOGRAPH-22183   # 
+
+2F939 ;        2219F ; SA      # ( 𢆟 → 𢆟 ) CJK COMPATIBILITY IDEOGRAPH-2F939 → CJK UNIFIED IDEOGRAPH-2219F   # 
+
+2F891 ;        22331 ; SA      # ( 𢌱 → 𢌱 ) CJK COMPATIBILITY IDEOGRAPH-2F891 → CJK UNIFIED IDEOGRAPH-22331   # 
+2F892 ;        22331 ; SA      # ( 𢌱 → 𢌱 ) CJK COMPATIBILITY IDEOGRAPH-2F892 → CJK UNIFIED IDEOGRAPH-22331   # 
+
+2F8A4 ;        226D4 ; SA      # ( 𢛔 → 𢛔 ) CJK COMPATIBILITY IDEOGRAPH-2F8A4 → CJK UNIFIED IDEOGRAPH-226D4   # 
+
+FAD0 ; 22844 ; SA      # ( 𢡄 → 𢡄 ) CJK COMPATIBILITY IDEOGRAPH-FAD0 → CJK UNIFIED IDEOGRAPH-22844     # 
+
+FACF ; 2284A ; SA      # ( 𢡊 → 𢡊 ) CJK COMPATIBILITY IDEOGRAPH-FACF → CJK UNIFIED IDEOGRAPH-2284A     # 
+
+2F8B8 ;        22B0C ; SA      # ( 𢬌 → 𢬌 ) CJK COMPATIBILITY IDEOGRAPH-2F8B8 → CJK UNIFIED IDEOGRAPH-22B0C   # 
+
+2F8BE ;        22BF1 ; SA      # ( 𢯱 → 𢯱 ) CJK COMPATIBILITY IDEOGRAPH-2F8BE → CJK UNIFIED IDEOGRAPH-22BF1   # 
+
+2F8CA ;        2300A ; SA      # ( 𣀊 → 𣀊 ) CJK COMPATIBILITY IDEOGRAPH-2F8CA → CJK UNIFIED IDEOGRAPH-2300A   # 
+
+2F897 ;        232B8 ; SA      # ( 𣊸 → 𣊸 ) CJK COMPATIBILITY IDEOGRAPH-2F897 → CJK UNIFIED IDEOGRAPH-232B8   # 
+
+2F980 ;        2335F ; SA      # ( 𣍟 → 𣍟 ) CJK COMPATIBILITY IDEOGRAPH-2F980 → CJK UNIFIED IDEOGRAPH-2335F   # 
+
+2F989 ;        23393 ; SA      # ( 𣎓 → 𣎓 ) CJK COMPATIBILITY IDEOGRAPH-2F989 → CJK UNIFIED IDEOGRAPH-23393   # 
+
+2F98A ;        2339C ; SA      # ( 𣎜 → 𣎜 ) CJK COMPATIBILITY IDEOGRAPH-2F98A → CJK UNIFIED IDEOGRAPH-2339C   # 
+
+2F8DD ;        233C3 ; SA      # ( 𣏃 → 𣏃 ) CJK COMPATIBILITY IDEOGRAPH-2F8DD → CJK UNIFIED IDEOGRAPH-233C3   # 
+
+FAD1 ; 233D5 ; SA      # ( 𣏕 → 𣏕 ) CJK COMPATIBILITY IDEOGRAPH-FAD1 → CJK UNIFIED IDEOGRAPH-233D5     # 
+
+2F8E3 ;        2346D ; SA      # ( 𣑭 → 𣑭 ) CJK COMPATIBILITY IDEOGRAPH-2F8E3 → CJK UNIFIED IDEOGRAPH-2346D   # 
+
+2F8EC ;        236A3 ; SA      # ( 𣚣 → 𣚣 ) CJK COMPATIBILITY IDEOGRAPH-2F8EC → CJK UNIFIED IDEOGRAPH-236A3   # 
+
+2F8F0 ;        238A7 ; SA      # ( 𣢧 → 𣢧 ) CJK COMPATIBILITY IDEOGRAPH-2F8F0 → CJK UNIFIED IDEOGRAPH-238A7   # 
+
+2F8F7 ;        23A8D ; SA      # ( 𣪍 → 𣪍 ) CJK COMPATIBILITY IDEOGRAPH-2F8F7 → CJK UNIFIED IDEOGRAPH-23A8D   # 
+
+2F8F9 ;        23AFA ; SA      # ( 𣫺 → 𣫺 ) CJK COMPATIBILITY IDEOGRAPH-2F8F9 → CJK UNIFIED IDEOGRAPH-23AFA   # 
+
+2F8FB ;        23CBC ; SA      # ( 𣲼 → 𣲼 ) CJK COMPATIBILITY IDEOGRAPH-2F8FB → CJK UNIFIED IDEOGRAPH-23CBC   # 
+
+2F906 ;        23D1E ; SA      # ( 𣴞 → 𣴞 ) CJK COMPATIBILITY IDEOGRAPH-2F906 → CJK UNIFIED IDEOGRAPH-23D1E   # 
+
+2F90D ;        23ED1 ; SA      # ( 𣻑 → 𣻑 ) CJK COMPATIBILITY IDEOGRAPH-2F90D → CJK UNIFIED IDEOGRAPH-23ED1   # 
+
+2F910 ;        23F5E ; SA      # ( 𣽞 → 𣽞 ) CJK COMPATIBILITY IDEOGRAPH-2F910 → CJK UNIFIED IDEOGRAPH-23F5E   # 
+
+2F911 ;        23F8E ; SA      # ( 𣾎 → 𣾎 ) CJK COMPATIBILITY IDEOGRAPH-2F911 → CJK UNIFIED IDEOGRAPH-23F8E   # 
+
+2F91D ;        24263 ; SA      # ( 𤉣 → 𤉣 ) CJK COMPATIBILITY IDEOGRAPH-2F91D → CJK UNIFIED IDEOGRAPH-24263   # 
+
+FA6C ; 242EE ; SA      # ( 𤋮 → 𤋮 ) CJK COMPATIBILITY IDEOGRAPH-FA6C → CJK UNIFIED IDEOGRAPH-242EE     # 
+
+2F91F ;        243AB ; SA      # ( 𤎫 → 𤎫 ) CJK COMPATIBILITY IDEOGRAPH-2F91F → CJK UNIFIED IDEOGRAPH-243AB   # 
+
+2F923 ;        24608 ; SA      # ( 𤘈 → 𤘈 ) CJK COMPATIBILITY IDEOGRAPH-2F923 → CJK UNIFIED IDEOGRAPH-24608   # 
+
+2F926 ;        24735 ; SA      # ( 𤜵 → 𤜵 ) CJK COMPATIBILITY IDEOGRAPH-2F926 → CJK UNIFIED IDEOGRAPH-24735   # 
+
+2F927 ;        24814 ; SA      # ( 𤠔 → 𤠔 ) CJK COMPATIBILITY IDEOGRAPH-2F927 → CJK UNIFIED IDEOGRAPH-24814   # 
+
+2F935 ;        24C36 ; SA      # ( 𤰶 → 𤰶 ) CJK COMPATIBILITY IDEOGRAPH-2F935 → CJK UNIFIED IDEOGRAPH-24C36   # 
+
+2F937 ;        24C92 ; SA      # ( 𤲒 → 𤲒 ) CJK COMPATIBILITY IDEOGRAPH-2F937 → CJK UNIFIED IDEOGRAPH-24C92   # 
+
+2F93B ;        24FA1 ; SA      # ( 𤾡 → 𤾡 ) CJK COMPATIBILITY IDEOGRAPH-2F93B → CJK UNIFIED IDEOGRAPH-24FA1   # 
+
+2F93C ;        24FB8 ; SA      # ( 𤾸 → 𤾸 ) CJK COMPATIBILITY IDEOGRAPH-2F93C → CJK UNIFIED IDEOGRAPH-24FB8   # 
+
+2F93D ;        25044 ; SA      # ( 𥁄 → 𥁄 ) CJK COMPATIBILITY IDEOGRAPH-2F93D → CJK UNIFIED IDEOGRAPH-25044   # 
+
+2F942 ;        250F2 ; SA      # ( 𥃲 → 𥃲 ) CJK COMPATIBILITY IDEOGRAPH-2F942 → CJK UNIFIED IDEOGRAPH-250F2   # 
+
+2F941 ;        250F3 ; SA      # ( 𥃳 → 𥃳 ) CJK COMPATIBILITY IDEOGRAPH-2F941 → CJK UNIFIED IDEOGRAPH-250F3   # 
+
+2F943 ;        25119 ; SA      # ( 𥄙 → 𥄙 ) CJK COMPATIBILITY IDEOGRAPH-2F943 → CJK UNIFIED IDEOGRAPH-25119   # 
+
+2F944 ;        25133 ; SA      # ( 𥄳 → 𥄳 ) CJK COMPATIBILITY IDEOGRAPH-2F944 → CJK UNIFIED IDEOGRAPH-25133   # 
+
+FAD5 ; 25249 ; SA      # ( 𥉉 → 𥉉 ) CJK COMPATIBILITY IDEOGRAPH-FAD5 → CJK UNIFIED IDEOGRAPH-25249     # 
+
+2F94D ;        2541D ; SA      # ( 𥐝 → 𥐝 ) CJK COMPATIBILITY IDEOGRAPH-2F94D → CJK UNIFIED IDEOGRAPH-2541D   # 
+
+2F952 ;        25626 ; SA      # ( 𥘦 → 𥘦 ) CJK COMPATIBILITY IDEOGRAPH-2F952 → CJK UNIFIED IDEOGRAPH-25626   # 
+
+2F954 ;        2569A ; SA      # ( 𥚚 → 𥚚 ) CJK COMPATIBILITY IDEOGRAPH-2F954 → CJK UNIFIED IDEOGRAPH-2569A   # 
+
+2F955 ;        256C5 ; SA      # ( 𥛅 → 𥛅 ) CJK COMPATIBILITY IDEOGRAPH-2F955 → CJK UNIFIED IDEOGRAPH-256C5   # 
+
+2F95C ;        2597C ; SA      # ( 𥥼 → 𥥼 ) CJK COMPATIBILITY IDEOGRAPH-2F95C → CJK UNIFIED IDEOGRAPH-2597C   # 
+
+2F95D ;        25AA7 ; SA      # ( 𥪧 → 𥪧 ) CJK COMPATIBILITY IDEOGRAPH-2F95D → CJK UNIFIED IDEOGRAPH-25AA7   # 
+2F95E ;        25AA7 ; SA      # ( 𥪧 → 𥪧 ) CJK COMPATIBILITY IDEOGRAPH-2F95E → CJK UNIFIED IDEOGRAPH-25AA7   # 
+
+2F961 ;        25BAB ; SA      # ( 𥮫 → 𥮫 ) CJK COMPATIBILITY IDEOGRAPH-2F961 → CJK UNIFIED IDEOGRAPH-25BAB   # 
+
+2F965 ;        25C80 ; SA      # ( 𥲀 → 𥲀 ) CJK COMPATIBILITY IDEOGRAPH-2F965 → CJK UNIFIED IDEOGRAPH-25C80   # 
+
+FAD6 ; 25CD0 ; SA      # ( 𥳐 → 𥳐 ) CJK COMPATIBILITY IDEOGRAPH-FAD6 → CJK UNIFIED IDEOGRAPH-25CD0     # 
+
+2F96B ;        25F86 ; SA      # ( 𥾆 → 𥾆 ) CJK COMPATIBILITY IDEOGRAPH-2F96B → CJK UNIFIED IDEOGRAPH-25F86   # 
+
+2F898 ;        261DA ; SA      # ( 𦇚 → 𦇚 ) CJK COMPATIBILITY IDEOGRAPH-2F898 → CJK UNIFIED IDEOGRAPH-261DA   # 
+
+2F972 ;        26228 ; SA      # ( 𦈨 → 𦈨 ) CJK COMPATIBILITY IDEOGRAPH-2F972 → CJK UNIFIED IDEOGRAPH-26228   # 
+
+2F973 ;        26247 ; SA      # ( 𦉇 → 𦉇 ) CJK COMPATIBILITY IDEOGRAPH-2F973 → CJK UNIFIED IDEOGRAPH-26247   # 
+
+2F975 ;        262D9 ; SA      # ( 𦋙 → 𦋙 ) CJK COMPATIBILITY IDEOGRAPH-2F975 → CJK UNIFIED IDEOGRAPH-262D9   # 
+
+2F977 ;        2633E ; SA      # ( 𦌾 → 𦌾 ) CJK COMPATIBILITY IDEOGRAPH-2F977 → CJK UNIFIED IDEOGRAPH-2633E   # 
+
+2F97B ;        264DA ; SA      # ( 𦓚 → 𦓚 ) CJK COMPATIBILITY IDEOGRAPH-2F97B → CJK UNIFIED IDEOGRAPH-264DA   # 
+
+2F97C ;        26523 ; SA      # ( 𦔣 → 𦔣 ) CJK COMPATIBILITY IDEOGRAPH-2F97C → CJK UNIFIED IDEOGRAPH-26523   # 
+
+2F97E ;        265A8 ; SA      # ( 𦖨 → 𦖨 ) CJK COMPATIBILITY IDEOGRAPH-2F97E → CJK UNIFIED IDEOGRAPH-265A8   # 
+
+2F987 ;        267A7 ; SA      # ( 𦞧 → 𦞧 ) CJK COMPATIBILITY IDEOGRAPH-2F987 → CJK UNIFIED IDEOGRAPH-267A7   # 
+
+2F988 ;        267B5 ; SA      # ( 𦞵 → 𦞵 ) CJK COMPATIBILITY IDEOGRAPH-2F988 → CJK UNIFIED IDEOGRAPH-267B5   # 
+
+2F997 ;        26B3C ; SA      # ( 𦬼 → 𦬼 ) CJK COMPATIBILITY IDEOGRAPH-2F997 → CJK UNIFIED IDEOGRAPH-26B3C   # 
+
+2F9A4 ;        26C36 ; SA      # ( 𦰶 → 𦰶 ) CJK COMPATIBILITY IDEOGRAPH-2F9A4 → CJK UNIFIED IDEOGRAPH-26C36   # 
+
+2F9A6 ;        26CD5 ; SA      # ( 𦳕 → 𦳕 ) CJK COMPATIBILITY IDEOGRAPH-2F9A6 → CJK UNIFIED IDEOGRAPH-26CD5   # 
+
+2F9A5 ;        26D6B ; SA      # ( 𦵫 → 𦵫 ) CJK COMPATIBILITY IDEOGRAPH-2F9A5 → CJK UNIFIED IDEOGRAPH-26D6B   # 
+
+2F9AD ;        26F2C ; SA      # ( 𦼬 → 𦼬 ) CJK COMPATIBILITY IDEOGRAPH-2F9AD → CJK UNIFIED IDEOGRAPH-26F2C   # 
+
+2F9B0 ;        26FB1 ; SA      # ( 𦾱 → 𦾱 ) CJK COMPATIBILITY IDEOGRAPH-2F9B0 → CJK UNIFIED IDEOGRAPH-26FB1   # 
+
+2F9B1 ;        270D2 ; SA      # ( 𧃒 → 𧃒 ) CJK COMPATIBILITY IDEOGRAPH-2F9B1 → CJK UNIFIED IDEOGRAPH-270D2   # 
+
+2F9AB ;        273CA ; SA      # ( 𧏊 → 𧏊 ) CJK COMPATIBILITY IDEOGRAPH-2F9AB → CJK UNIFIED IDEOGRAPH-273CA   # 
+
+2F9C5 ;        27667 ; SA      # ( 𧙧 → 𧙧 ) CJK COMPATIBILITY IDEOGRAPH-2F9C5 → CJK UNIFIED IDEOGRAPH-27667   # 
+
+2F9CB ;        278AE ; SA      # ( 𧢮 → 𧢮 ) CJK COMPATIBILITY IDEOGRAPH-2F9CB → CJK UNIFIED IDEOGRAPH-278AE   # 
+
+2F9CC ;        27966 ; SA      # ( 𧥦 → 𧥦 ) CJK COMPATIBILITY IDEOGRAPH-2F9CC → CJK UNIFIED IDEOGRAPH-27966   # 
+
+2F9D3 ;        27CA8 ; SA      # ( 𧲨 → 𧲨 ) CJK COMPATIBILITY IDEOGRAPH-2F9D3 → CJK UNIFIED IDEOGRAPH-27CA8   # 
+
+FAD7 ; 27ED3 ; SA      # ( 𧻓 → 𧻓 ) CJK COMPATIBILITY IDEOGRAPH-FAD7 → CJK UNIFIED IDEOGRAPH-27ED3     # 
+
+2F9D8 ;        27F2F ; SA      # ( 𧼯 → 𧼯 ) CJK COMPATIBILITY IDEOGRAPH-2F9D8 → CJK UNIFIED IDEOGRAPH-27F2F   # 
+
+2F9E0 ;        285D2 ; SA      # ( 𨗒 → 𨗒 ) CJK COMPATIBILITY IDEOGRAPH-2F9E0 → CJK UNIFIED IDEOGRAPH-285D2   # 
+
+2F9E1 ;        285ED ; SA      # ( 𨗭 → 𨗭 ) CJK COMPATIBILITY IDEOGRAPH-2F9E1 → CJK UNIFIED IDEOGRAPH-285ED   # 
+
+2F9E5 ;        2872E ; SA      # ( 𨜮 → 𨜮 ) CJK COMPATIBILITY IDEOGRAPH-2F9E5 → CJK UNIFIED IDEOGRAPH-2872E   # 
+
+2F9ED ;        28BFA ; SA      # ( 𨯺 → 𨯺 ) CJK COMPATIBILITY IDEOGRAPH-2F9ED → CJK UNIFIED IDEOGRAPH-28BFA   # 
+
+2F9F1 ;        28D77 ; SA      # ( 𨵷 → 𨵷 ) CJK COMPATIBILITY IDEOGRAPH-2F9F1 → CJK UNIFIED IDEOGRAPH-28D77   # 
+
+2F9F6 ;        29145 ; SA      # ( 𩅅 → 𩅅 ) CJK COMPATIBILITY IDEOGRAPH-2F9F6 → CJK UNIFIED IDEOGRAPH-29145   # 
+
+2F81C ;        291DF ; SA      # ( 𩇟 → 𩇟 ) CJK COMPATIBILITY IDEOGRAPH-2F81C → CJK UNIFIED IDEOGRAPH-291DF   # 
+
+2F9F7 ;        2921A ; SA      # ( 𩈚 → 𩈚 ) CJK COMPATIBILITY IDEOGRAPH-2F9F7 → CJK UNIFIED IDEOGRAPH-2921A   # 
+
+2F9FB ;        2940A ; SA      # ( 𩐊 → 𩐊 ) CJK COMPATIBILITY IDEOGRAPH-2F9FB → CJK UNIFIED IDEOGRAPH-2940A   # 
+
+2F9FD ;        29496 ; SA      # ( 𩒖 → 𩒖 ) CJK COMPATIBILITY IDEOGRAPH-2F9FD → CJK UNIFIED IDEOGRAPH-29496   # 
+
+2FA01 ;        295B6 ; SA      # ( 𩖶 → 𩖶 ) CJK COMPATIBILITY IDEOGRAPH-2FA01 → CJK UNIFIED IDEOGRAPH-295B6   # 
+
+2FA09 ;        29B30 ; SA      # ( 𩬰 → 𩬰 ) CJK COMPATIBILITY IDEOGRAPH-2FA09 → CJK UNIFIED IDEOGRAPH-29B30   # 
+
+2FA10 ;        2A0CE ; SA      # ( 𪃎 → 𪃎 ) CJK COMPATIBILITY IDEOGRAPH-2FA10 → CJK UNIFIED IDEOGRAPH-2A0CE   # 
+
+2FA12 ;        2A105 ; SA      # ( 𪄅 → 𪄅 ) CJK COMPATIBILITY IDEOGRAPH-2FA12 → CJK UNIFIED IDEOGRAPH-2A105   # 
+
+2FA13 ;        2A20E ; SA      # ( 𪈎 → 𪈎 ) CJK COMPATIBILITY IDEOGRAPH-2FA13 → CJK UNIFIED IDEOGRAPH-2A20E   # 
+
+2FA14 ;        2A291 ; SA      # ( 𪊑 → 𪊑 ) CJK COMPATIBILITY IDEOGRAPH-2FA14 → CJK UNIFIED IDEOGRAPH-2A291   # 
+
+2F88F ;        2A392 ; SA      # ( 𪎒 → 𪎒 ) CJK COMPATIBILITY IDEOGRAPH-2F88F → CJK UNIFIED IDEOGRAPH-2A392   # 
+
+2FA1D ;        2A600 ; SA      # ( 𪘀 → 𪘀 ) CJK COMPATIBILITY IDEOGRAPH-2FA1D → CJK UNIFIED IDEOGRAPH-2A600   # 
+
+# total for (SA): 4999
+
+
+# Mixed-Script, Lowercase Confusables
+
+05AD ; 0596 ;  ML      # ( ֭ → ֖ ) HEBREW ACCENT DEHI → HEBREW ACCENT TIPEHA     # 
+
+05AE ; 0598 ;  ML      # ( ֮ → ֘ ) HEBREW ACCENT ZINOR → HEBREW ACCENT ZARQA     # 
+
+05A8 ; 0599 ;  ML      # ( ֨ → ֙ ) HEBREW ACCENT QADMA → HEBREW ACCENT PASHTA    # 
+
+05A4 ; 059A ;  ML      # ( ֤ → ֚ ) HEBREW ACCENT MAHAPAKH → HEBREW ACCENT YETIV  # 
+
+06EC ; 06DF ;  ML      # ( ۬ → ۟ ) ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE → ARABIC SMALL HIGH ROUNDED ZERO  # 
+
+0619 ; 0313 ;  ML      # ( ؙ → ̓ ) ARABIC SMALL DAMMA → COMBINING COMMA ABOVE    # →ُ→
+0343 ; 0313 ;  ML      # ( ̓ → ̓ ) COMBINING GREEK KORONIS → COMBINING COMMA ABOVE       # 
+0315 ; 0313 ;  ML      # ( ̕ → ̓ ) COMBINING COMMA ABOVE RIGHT → COMBINING COMMA ABOVE   # 
+064F ; 0313 ;  ML      # ( ُ → ̓ ) ARABIC DAMMA → COMBINING COMMA ABOVE  # 
+
+059C ; 0301 ;  ML      # ( ֜ → ́ ) HEBREW ACCENT GERESH → COMBINING ACUTE ACCENT # 
+059D ; 0301 ;  ML      # ( ֝ → ́ ) HEBREW ACCENT GERESH MUQDAM → COMBINING ACUTE ACCENT  # →֜→
+0747 ; 0301 ;  ML      # ( ݇ → ́ ) SYRIAC OBLIQUE LINE ABOVE → COMBINING ACUTE ACCENT    # 
+0341 ; 0301 ;  ML      # ( ́ → ́ ) COMBINING ACUTE TONE MARK → COMBINING ACUTE ACCENT    # 
+0954 ; 0301 ;  ML      # ( ॔ → ́ ) DEVANAGARI ACUTE ACCENT → COMBINING ACUTE ACCENT     # 
+
+0340 ; 0300 ;  ML      # ( ̀ → ̀ ) COMBINING GRAVE TONE MARK → COMBINING GRAVE ACCENT    # 
+0953 ; 0300 ;  ML      # ( ॓ → ̀ ) DEVANAGARI GRAVE ACCENT → COMBINING GRAVE ACCENT     # 
+
+030C ; 0306 ;  ML      # ( ̌ → ̆ ) COMBINING CARON → COMBINING BREVE     # 
+036E ; 0306 ;  ML      # ( ͮ → ̆ ) COMBINING LATIN SMALL LETTER V → COMBINING BREVE      # →̌→
+
+0310 ; 0306 0307 ;     ML      # ( ̐ → ̆̇ ) COMBINING CANDRABINDU → COMBINING BREVE, COMBINING DOT ABOVE        # 
+0901 ; 0306 0307 ;     ML      # ( ँ → ̆̇ ) DEVANAGARI SIGN CANDRABINDU → COMBINING BREVE, COMBINING DOT ABOVE # →̐→
+0981 ; 0306 0307 ;     ML      # ( ঁ → ̆̇ ) BENGALI SIGN CANDRABINDU → COMBINING BREVE, COMBINING DOT ABOVE    # →̐→
+0A81 ; 0306 0307 ;     ML      # ( ઁ → ̆̇ ) GUJARATI SIGN CANDRABINDU → COMBINING BREVE, COMBINING DOT ABOVE   # →̐→
+0B01 ; 0306 0307 ;     ML      # ( ଁ → ̆̇ ) ORIYA SIGN CANDRABINDU → COMBINING BREVE, COMBINING DOT ABOVE      # →̐→
+
+0311 ; 0302 ;  ML      # ( ̑ → ̂ ) COMBINING INVERTED BREVE → COMBINING CIRCUMFLEX ACCENT        # 
+07EE ; 0302 ;  ML      # ( ߮ → ̂ ) NKO COMBINING LONG DESCENDING TONE → COMBINING CIRCUMFLEX ACCENT      # 
+
+05AF ; 030A ;  ML      # ( ֯ → ̊ ) HEBREW MARK MASORA CIRCLE → COMBINING RING ABOVE      # 
+17D3 ; 030A ;  ML      # ( ៓ → ̊ ) KHMER SIGN BATHAMASAT → COMBINING RING ABOVE # 
+0B82 ; 030A ;  ML      # ( ஂ → ̊ ) TAMIL SIGN ANUSVARA → COMBINING RING ABOVE   # 
+0E4D ; 030A ;  ML      # ( ํ → ̊ ) THAI CHARACTER NIKHAHIT → COMBINING RING ABOVE       # 
+0ECD ; 030A ;  ML      # ( ໍ → ̊ ) LAO NIGGAHITA → COMBINING RING ABOVE # 
+1036 ; 030A ;  ML      # ( ံ → ̊ ) MYANMAR SIGN ANUSVARA → COMBINING RING ABOVE # 
+17C6 ; 030A ;  ML      # ( ំ → ̊ ) KHMER SIGN NIKAHIT → COMBINING RING ABOVE    # 
+309A ; 030A ;  ML      # ( ゚ → ̊ ) COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK → COMBINING RING ABOVE    # 
+0366 ; 030A ;  ML      # ( ͦ → ̊ ) COMBINING LATIN SMALL LETTER O → COMBINING RING ABOVE # 
+
+07F3 ; 0308 ;  ML      # ( ߳ → ̈ ) NKO COMBINING DOUBLE DOT ABOVE → COMBINING DIAERESIS  # 
+
+0342 ; 0303 ;  ML      # ( ͂ → ̃ ) COMBINING GREEK PERISPOMENI → COMBINING TILDE # 
+
+05C4 ; 0307 ;  ML      # ( ׄ → ̇ ) HEBREW MARK UPPER DOT → COMBINING DOT ABOVE   # 
+0740 ; 0307 ;  ML      # ( ݀ → ̇ ) SYRIAC FEMININE DOT → COMBINING DOT ABOVE     # →݁→
+0741 ; 0307 ;  ML      # ( ݁ → ̇ ) SYRIAC QUSHSHAYA → COMBINING DOT ABOVE        # 
+0358 ; 0307 ;  ML      # ( ͘ → ̇ ) COMBINING DOT ABOVE RIGHT → COMBINING DOT ABOVE       # 
+05B9 ; 0307 ;  ML      # ( ֹ → ̇ ) HEBREW POINT HOLAM → COMBINING DOT ABOVE      # 
+05BA ; 0307 ;  ML      # ( ֺ → ̇ ) HEBREW POINT HOLAM HASER FOR VAV → COMBINING DOT ABOVE        # →ׁ→
+05C2 ; 0307 ;  ML      # ( ׂ → ̇ ) HEBREW POINT SIN DOT → COMBINING DOT ABOVE    # 
+05C1 ; 0307 ;  ML      # ( ׁ → ̇ ) HEBREW POINT SHIN DOT → COMBINING DOT ABOVE   # 
+07ED ; 0307 ;  ML      # ( ߭ → ̇ ) NKO COMBINING SHORT RISING TONE → COMBINING DOT ABOVE # 
+0902 ; 0307 ;  ML      # ( ं → ̇ ) DEVANAGARI SIGN ANUSVARA → COMBINING DOT ABOVE       # 
+0A02 ; 0307 ;  ML      # ( ਂ → ̇ ) GURMUKHI SIGN BINDI → COMBINING DOT ABOVE    # 
+0A82 ; 0307 ;  ML      # ( ં → ̇ ) GUJARATI SIGN ANUSVARA → COMBINING DOT ABOVE # 
+0BCD ; 0307 ;  ML      # ( ் → ̇ ) TAMIL SIGN VIRAMA → COMBINING DOT ABOVE      # 
+
+0337 ; 0338 ;  ML      # ( ̷ → ̸ ) COMBINING SHORT SOLIDUS OVERLAY → COMBINING LONG SOLIDUS OVERLAY      # 
+
+0322 ; 0328 ;  ML      # ( ̢ → ̨ ) COMBINING RETROFLEX HOOK BELOW → COMBINING OGONEK     # 
+
+0305 ; 0304 ;  ML      # ( ̅ → ̄ ) COMBINING OVERLINE → COMBINING MACRON # 
+07EB ; 0304 ;  ML      # ( ߫ → ̄ ) NKO COMBINING SHORT HIGH TONE → COMBINING MACRON      # 
+
+0347 ; 0333 ;  ML      # ( ͇ → ̳ ) COMBINING EQUALS SIGN BELOW → COMBINING DOUBLE LOW LINE       # 
+
+302C ; 0309 ;  ML      # ( 〬 → ̉ ) IDEOGRAPHIC DEPARTING TONE MARK → COMBINING HOOK ABOVE       # 
+
+05C5 ; 0323 ;  ML      # ( ׅ → ̣ ) HEBREW MARK LOWER DOT → COMBINING DOT BELOW   # 
+05B4 ; 0323 ;  ML      # ( ִ → ̣ ) HEBREW POINT HIRIQ → COMBINING DOT BELOW      # 
+093C ; 0323 ;  ML      # ( ़ → ̣ ) DEVANAGARI SIGN NUKTA → COMBINING DOT BELOW  # 
+09BC ; 0323 ;  ML      # ( ় → ̣ ) BENGALI SIGN NUKTA → COMBINING DOT BELOW     # 
+0A3C ; 0323 ;  ML      # ( ਼ → ̣ ) GURMUKHI SIGN NUKTA → COMBINING DOT BELOW    # 
+0ABC ; 0323 ;  ML      # ( ઼ → ̣ ) GUJARATI SIGN NUKTA → COMBINING DOT BELOW    # 
+0B3C ; 0323 ;  ML      # ( ଼ → ̣ ) ORIYA SIGN NUKTA → COMBINING DOT BELOW       # 
+10A3A ;        0323 ;  ML      # ( 𐨺 → ̣ ) KHAROSHTHI SIGN DOT BELOW → COMBINING DOT BELOW     # 
+
+302D ; 0325 ;  ML      # ( 〭 → ̥ ) IDEOGRAPHIC ENTERING TONE MARK → COMBINING RING BELOW        # 
+
+0327 ; 0326 ;  ML      # ( ̧ → ̦ ) COMBINING CEDILLA → COMBINING COMMA BELOW     # →̡→
+0321 ; 0326 ;  ML      # ( ̡ → ̦ ) COMBINING PALATALIZED HOOK BELOW → COMBINING COMMA BELOW      # 
+0339 ; 0326 ;  ML      # ( ̹ → ̦ ) COMBINING RIGHT HALF RING BELOW → COMBINING COMMA BELOW       # →̧→→̡→
+
+0952 ; 0331 ;  ML      # ( ॒ → ̱ ) DEVANAGARI STRESS SIGN ANUDATTA → COMBINING MACRON BELOW     # 
+0320 ; 0331 ;  ML      # ( ̠ → ̱ ) COMBINING MINUS SIGN BELOW → COMBINING MACRON BELOW   # 
+
+0336 ; 0335 ;  ML      # ( ̶ → ̵ ) COMBINING LONG STROKE OVERLAY → COMBINING SHORT STROKE OVERLAY        # 
+
+FC5E ; FE72 0651 ;     ML      #* ( ‎ﱞ‎ → ‎ﹲّ‎ ) ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM → ARABIC DAMMATAN ISOLATED FORM, ARABIC SHADDA    # 
+
+FC5F ; FE74 0651 ;     ML      #* ( ‎ﱟ‎ → ‎ﹴّ‎ ) ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM → ARABIC KASRATAN ISOLATED FORM, ARABIC SHADDA    # 
+
+0618 ; 064E ;  ML      # ( ؘ → َ ) ARABIC SMALL FATHA → ARABIC FATHA     # 
+
+FCF2 ; FE77 0651 ;     ML      # ( ‎ﳲ‎ → ‎ﹷّ‎ ) ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM → ARABIC FATHA MEDIAL FORM, ARABIC SHADDA       # 
+
+FC60 ; FE76 0651 ;     ML      #* ( ‎ﱠ‎ → ‎ﹶّ‎ ) ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM → ARABIC FATHA ISOLATED FORM, ARABIC SHADDA  # 
+FC62 ; FE76 0651 ;     ML      #* ( ‎ﱢ‎ → ‎ﹶّ‎ ) ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM → ARABIC FATHA ISOLATED FORM, ARABIC SHADDA  # →‎ﱠ‎→
+
+FCF3 ; FE79 0651 ;     ML      # ( ‎ﳳ‎ → ‎ﹹّ‎ ) ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM → ARABIC DAMMA MEDIAL FORM, ARABIC SHADDA       # 
+
+FC61 ; FE78 0651 ;     ML      #* ( ‎ﱡ‎ → ‎ﹸّ‎ ) ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM → ARABIC DAMMA ISOLATED FORM, ARABIC SHADDA  # 
+
+061A ; 0650 ;  ML      # ( ؚ → ِ ) ARABIC SMALL KASRA → ARABIC KASRA     # 
+
+FCF4 ; FE7B 0651 ;     ML      # ( ‎ﳴ‎ → ‎ﹻّ‎ ) ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM → ARABIC KASRA MEDIAL FORM, ARABIC SHADDA       # 
+
+FC63 ; FE7C 0670 ;     ML      #* ( ‎ﱣ‎ → ‎ﹼٰ‎ ) ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM → ARABIC SHADDA ISOLATED FORM, ARABIC LETTER SUPERSCRIPT ALEF     # 
+
+0742 ; 073C ;  ML      # ( ݂ → ܼ ) SYRIAC RUKKAKHA → SYRIAC HBASA-ESASA DOTTED   # 
+
+0A03 ; 0983 ;  ML      # ( ਃ → ঃ ) GURMUKHI SIGN VISARGA → BENGALI SIGN VISARGA        # 
+0C03 ; 0983 ;  ML      # ( ః → ঃ ) TELUGU SIGN VISARGA → BENGALI SIGN VISARGA  # →ਃ→
+0C83 ; 0983 ;  ML      # ( ಃ → ঃ ) KANNADA SIGN VISARGA → BENGALI SIGN VISARGA # →ః→→ਃ→
+0D03 ; 0983 ;  ML      # ( ഃ → ঃ ) MALAYALAM SIGN VISARGA → BENGALI SIGN VISARGA       # →ಃ→→ః→→ਃ→
+0D83 ; 0983 ;  ML      # ( ඃ → ঃ ) SINHALA SIGN VISARGAYA → BENGALI SIGN VISARGA       # →ഃ→→ಃ→→ః→→ਃ→
+1038 ; 0983 ;  ML      # ( း → ঃ ) MYANMAR SIGN VISARGA → BENGALI SIGN VISARGA # →ඃ→→ഃ→→ಃ→→ః→→ਃ→
+
+17CB ; 0E48 ;  ML      # ( ់ → ่ ) KHMER SIGN BANTOC → THAI CHARACTER MAI EK   # 
+0EC8 ; 0E48 ;  ML      # ( ່ → ่ ) LAO TONE MAI EK → THAI CHARACTER MAI EK     # 
+
+0EC9 ; 0E49 ;  ML      # ( ້ → ้ ) LAO TONE MAI THO → THAI CHARACTER MAI THO   # 
+
+0ECA ; 0E4A ;  ML      # ( ໊ → ๊ ) LAO TONE MAI TI → THAI CHARACTER MAI TRI    # 
+
+0ECB ; 0E4B ;  ML      # ( ໋ → ๋ ) LAO TONE MAI CATAWA → THAI CHARACTER MAI CHATTAWA   # 
+
+309B ; FF9E ;  ML      #* ( ゛ → ゙ ) KATAKANA-HIRAGANA VOICED SOUND MARK → HALFWIDTH KATAKANA VOICED SOUND MARK # 
+
+309C ; FF9F ;  ML      #* ( ゜ → ゚ ) KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK → HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK       # 
+
+180E ; 0020 ;  ML      #* ( ᠎ →   ) MONGOLIAN VOWEL SEPARATOR → SPACE    # 
+2028 ; 0020 ;  ML      #* (  →   ) LINE SEPARATOR → SPACE  # 
+2029 ; 0020 ;  ML      #* (  →   ) PARAGRAPH SEPARATOR → SPACE     # 
+2000 ; 0020 ;  ML      #* (   →   ) EN QUAD → SPACE      # 
+2001 ; 0020 ;  ML      #* (   →   ) EM QUAD → SPACE      # 
+2002 ; 0020 ;  ML      #* (   →   ) EN SPACE → SPACE     # 
+2003 ; 0020 ;  ML      #* (   →   ) EM SPACE → SPACE     # 
+2004 ; 0020 ;  ML      #* (   →   ) THREE-PER-EM SPACE → SPACE   # 
+2005 ; 0020 ;  ML      #* (   →   ) FOUR-PER-EM SPACE → SPACE    # 
+2006 ; 0020 ;  ML      #* (   →   ) SIX-PER-EM SPACE → SPACE     # 
+2008 ; 0020 ;  ML      #* (   →   ) PUNCTUATION SPACE → SPACE    # 
+2009 ; 0020 ;  ML      #* (   →   ) THIN SPACE → SPACE   # 
+200A ; 0020 ;  ML      #* (   →   ) HAIR SPACE → SPACE   # 
+205F ; 0020 ;  ML      #* (   →   ) MEDIUM MATHEMATICAL SPACE → SPACE    # 
+00A0 ; 0020 ;  ML      #* (   →   ) NO-BREAK SPACE → SPACE        # 
+2007 ; 0020 ;  ML      #* (   →   ) FIGURE SPACE → SPACE # 
+202F ; 0020 ;  ML      #* (   →   ) NARROW NO-BREAK SPACE → SPACE        # 
+1680 ; 0020 ;  ML      #* (   →   ) OGHAM SPACE MARK → SPACE     # 
+
+02C4 ; 005E ;  ML      #* ( ˄ → ^ ) MODIFIER LETTER UP ARROWHEAD → CIRCUMFLEX ACCENT      # 
+02C6 ; 005E ;  ML      # ( ˆ → ^ ) MODIFIER LETTER CIRCUMFLEX ACCENT → CIRCUMFLEX ACCENT  # 
+
+07FA ; 005F ;  ML      # ( ‎ߺ‎ → _ ) NKO LAJANYALAN → LOW LINE        # 
+FE4D ; 005F ;  ML      # ( ﹍ → _ ) DASHED LOW LINE → LOW LINE    # 
+FE4E ; 005F ;  ML      # ( ﹎ → _ ) CENTRELINE LOW LINE → LOW LINE        # 
+FE4F ; 005F ;  ML      # ( ﹏ → _ ) WAVY LOW LINE → LOW LINE      # 
+
+2307 ; FE34 ;  ML      #* ( ⌇ → ︴ ) WAVY LINE → PRESENTATION FORM FOR VERTICAL WAVY LOW LINE   # 
+
+2010 ; 002D ;  ML      #* ( ‐ → - ) HYPHEN → HYPHEN-MINUS        # 
+2011 ; 002D ;  ML      #* ( ‑ → - ) NON-BREAKING HYPHEN → HYPHEN-MINUS   # 
+2012 ; 002D ;  ML      #* ( ‒ → - ) FIGURE DASH → HYPHEN-MINUS   # 
+2013 ; 002D ;  ML      #* ( – → - ) EN DASH → HYPHEN-MINUS       # 
+FE58 ; 002D ;  ML      #* ( ﹘ → - ) SMALL EM DASH → HYPHEN-MINUS # 
+2043 ; 002D ;  ML      #* ( ⁃ → - ) HYPHEN BULLET → HYPHEN-MINUS # →‒→
+02D7 ; 002D ;  ML      #* ( ˗ → - ) MODIFIER LETTER MINUS SIGN → HYPHEN-MINUS     # 
+2212 ; 002D ;  ML      #* ( − → - ) MINUS SIGN → HYPHEN-MINUS    # 
+
+A4FE ; 002D 002E ;     ML      #* ( ꓾ → -. ) LISU PUNCTUATION COMMA → HYPHEN-MINUS, FULL STOP    # 
+
+FF5E ; 301C ;  ML      #* ( ~ → 〜 ) FULLWIDTH TILDE → WAVE DASH        # 
+
+00B8 ; 002C ;  ML      #* ( ¸ → , ) CEDILLA → COMMA       # 
+066B ; 002C ;  ML      #* ( ‎٫‎ → , ) ARABIC DECIMAL SEPARATOR → COMMA        # 
+201A ; 002C ;  ML      #* ( ‚ → , ) SINGLE LOW-9 QUOTATION MARK → COMMA  # 
+
+066C ; 060C ;  ML      #* ( ‎٬‎ → ، ) ARABIC THOUSANDS SEPARATOR → ARABIC COMMA      # 
+
+037E ; 003B ;  ML      #* ( ; → ; ) GREEK QUESTION MARK → SEMICOLON       # 
+
+0903 ; 003A ;  ML      # ( ः → : ) DEVANAGARI SIGN VISARGA → COLON       # 
+0A83 ; 003A ;  ML      # ( ઃ → : ) GUJARATI SIGN VISARGA → COLON # 
+FF1A ; 003A ;  ML      #* ( : → : ) FULLWIDTH COLON → COLON      # →︰→
+0589 ; 003A ;  ML      #* ( ։ → : ) ARMENIAN FULL STOP → COLON    # 
+0703 ; 003A ;  ML      #* ( ‎܃‎ → : ) SYRIAC SUPRALINEAR COLON → COLON        # 
+0704 ; 003A ;  ML      #* ( ‎܄‎ → : ) SYRIAC SUBLINEAR COLON → COLON  # 
+FE30 ; 003A ;  ML      #* ( ︰ → : ) PRESENTATION FORM FOR VERTICAL TWO DOT LEADER → COLON        # 
+1803 ; 003A ;  ML      #* ( ᠃ → : ) MONGOLIAN FULL STOP → COLON  # 
+1809 ; 003A ;  ML      #* ( ᠉ → : ) MONGOLIAN MANCHU FULL STOP → COLON   # 
+205A ; 003A ;  ML      #* ( ⁚ → : ) TWO DOT PUNCTUATION → COLON  # 
+05C3 ; 003A ;  ML      #* ( ‎׃‎ → : ) HEBREW PUNCTUATION SOF PASUQ → COLON    # 
+02F8 ; 003A ;  ML      #* ( ˸ → : ) MODIFIER LETTER RAISED COLON → COLON  # 
+A789 ; 003A ;  ML      #* ( ꞉ → : ) MODIFIER LETTER COLON → COLON        # 
+2236 ; 003A ;  ML      #* ( ∶ → : ) RATIO → COLON        # 
+02D0 ; 003A ;  ML      # ( ː → : ) MODIFIER LETTER TRIANGULAR COLON → COLON       # 
+A4FD ; 003A ;  ML      # ( ꓽ → : ) LISU LETTER TONE MYA JEU → COLON      # 
+
+2A74 ; 003A 003A 003D ;        ML      #* ( ⩴ → ::= ) DOUBLE COLON EQUAL → COLON, COLON, EQUALS SIGN     # 
+
+FF01 ; 0021 ;  ML      #* ( ! → ! ) FULLWIDTH EXCLAMATION MARK → EXCLAMATION MARK        # →ǃ→
+01C3 ; 0021 ;  ML      # ( ǃ → ! ) LATIN LETTER RETROFLEX CLICK → EXCLAMATION MARK        # 
+
+203C ; 0021 0021 ;     ML      #* ( ‼ → !! ) DOUBLE EXCLAMATION MARK → EXCLAMATION MARK, EXCLAMATION MARK        # 
+
+2049 ; 0021 003F ;     ML      #* ( ⁉ → !? ) EXCLAMATION QUESTION MARK → EXCLAMATION MARK, QUESTION MARK # 
+
+0294 ; 003F ;  ML      # ( ʔ → ? ) LATIN LETTER GLOTTAL STOP → QUESTION MARK      # 
+097D ; 003F ;  ML      # ( ॽ → ? ) DEVANAGARI LETTER GLOTTAL STOP → QUESTION MARK        # 
+
+2048 ; 003F 0021 ;     ML      #* ( ⁈ → ?! ) QUESTION EXCLAMATION MARK → QUESTION MARK, EXCLAMATION MARK # 
+
+2047 ; 003F 003F ;     ML      #* ( ⁇ → ?? ) DOUBLE QUESTION MARK → QUESTION MARK, QUESTION MARK # 
+
+1D16D ;        002E ;  ML      # ( 𝅭 → . ) MUSICAL SYMBOL COMBINING AUGMENTATION DOT → FULL STOP        # 
+2024 ; 002E ;  ML      #* ( ․ → . ) ONE DOT LEADER → FULL STOP   # 
+06D4 ; 002E ;  ML      #* ( ‎۔‎ → . ) ARABIC FULL STOP → FULL STOP    # 
+0701 ; 002E ;  ML      #* ( ‎܁‎ → . ) SYRIAC SUPRALINEAR FULL STOP → FULL STOP        # 
+0702 ; 002E ;  ML      #* ( ‎܂‎ → . ) SYRIAC SUBLINEAR FULL STOP → FULL STOP  # 
+A60E ; 002E ;  ML      #* ( ꘎ → . ) VAI FULL STOP → FULL STOP    # 
+10A50 ;        002E ;  ML      #* ( ‎𐩐‎ → . ) KHAROSHTHI PUNCTUATION DOT → FULL STOP        # 
+0660 ; 002E ;  ML      # ( ‎٠‎ → . ) ARABIC-INDIC DIGIT ZERO → FULL STOP      # 
+06F0 ; 002E ;  ML      # ( ۰ → . ) EXTENDED ARABIC-INDIC DIGIT ZERO → FULL STOP   # →‎٠‎→
+A4F8 ; 002E ;  ML      # ( ꓸ → . ) LISU LETTER TONE MYA TI → FULL STOP   # 
+A4FB ; 002E ;  ML      # ( ꓻ → . ) LISU LETTER TONE MYA BO → FULL STOP   # 
+
+2025 ; 002E 002E ;     ML      #* ( ‥ → .. ) TWO DOT LEADER → FULL STOP, FULL STOP       # 
+A4FA ; 002E 002E ;     ML      # ( ꓺ → .. ) LISU LETTER TONE MYA CYA → FULL STOP, FULL STOP      # 
+
+2026 ; 002E 002E 002E ;        ML      #* ( … → ... ) HORIZONTAL ELLIPSIS → FULL STOP, FULL STOP, FULL STOP      # 
+
+30FB ; 00B7 ;  ML      #* ( ・ → · ) KATAKANA MIDDLE DOT → MIDDLE DOT    # →•→
+FF65 ; 00B7 ;  ML      #* ( ・ → · ) HALFWIDTH KATAKANA MIDDLE DOT → MIDDLE DOT  # →•→
+0387 ; 00B7 ;  ML      # ( · → · ) GREEK ANO TELEIA → MIDDLE DOT # 
+10101 ;        00B7 ;  ML      #* ( 𐄁 → · ) AEGEAN WORD SEPARATOR DOT → MIDDLE DOT     # 
+2022 ; 00B7 ;  ML      #* ( • → · ) BULLET → MIDDLE DOT # 
+2027 ; 00B7 ;  ML      #* ( ‧ → · ) HYPHENATION POINT → MIDDLE DOT      # 
+2219 ; 00B7 ;  ML      #* ( ∙ → · ) BULLET OPERATOR → MIDDLE DOT        # 
+22C5 ; 00B7 ;  ML      #* ( ⋅ → · ) DOT OPERATOR → MIDDLE DOT   # 
+1427 ; 00B7 ;  ML      # ( ᐧ → · ) CANADIAN SYLLABICS FINAL MIDDLE DOT → MIDDLE DOT     # 
+
+22EF ; 00B7 00B7 00B7 ;        ML      #* ( ⋯ → ··· ) MIDLINE HORIZONTAL ELLIPSIS → MIDDLE DOT, MIDDLE DOT, MIDDLE DOT        # 
+
+152F ; 00B7 0034 ;     ML      # ( ᔯ → ·4 ) CANADIAN SYLLABICS YWE → MIDDLE DOT, DIGIT FOUR     # →ᐧ4→
+
+147A ; 00B7 0064 ;     ML      # ( ᑺ → ·d ) CANADIAN SYLLABICS KWO → MIDDLE DOT, LATIN SMALL LETTER D   # →ᐧᑯ→
+
+140C ; 00B7 1401 ;     ML      # ( ᐌ → ·ᐁ ) CANADIAN SYLLABICS WE → MIDDLE DOT, CANADIAN SYLLABICS E  # →ᐧᐁ→
+
+140E ; 00B7 1403 ;     ML      # ( ᐎ → ·ᐃ ) CANADIAN SYLLABICS WI → MIDDLE DOT, CANADIAN SYLLABICS I  # →ᐧᐃ→
+
+1410 ; 00B7 1404 ;     ML      # ( ᐐ → ·ᐄ ) CANADIAN SYLLABICS WII → MIDDLE DOT, CANADIAN SYLLABICS II        # →ᐧᐄ→
+
+1412 ; 00B7 1405 ;     ML      # ( ᐒ → ·ᐅ ) CANADIAN SYLLABICS WO → MIDDLE DOT, CANADIAN SYLLABICS O  # →ᐧᐅ→
+
+1414 ; 00B7 1406 ;     ML      # ( ᐔ → ·ᐆ ) CANADIAN SYLLABICS WOO → MIDDLE DOT, CANADIAN SYLLABICS OO        # →ᐧᐆ→
+
+1417 ; 00B7 140A ;     ML      # ( ᐗ → ·ᐊ ) CANADIAN SYLLABICS WA → MIDDLE DOT, CANADIAN SYLLABICS A  # →ᐧᐊ→
+
+1419 ; 00B7 140B ;     ML      # ( ᐙ → ·ᐋ ) CANADIAN SYLLABICS WAA → MIDDLE DOT, CANADIAN SYLLABICS AA        # →ᐧᐋ→
+
+2CFE ; 00B7 1433 ;     ML      #* ( ⳾ → ·ᐳ ) COPTIC FULL STOP → MIDDLE DOT, CANADIAN SYLLABICS PO     # →ᑀ→→ᐧᐳ→
+1437 ; 00B7 1433 ;     ML      # ( ᐷ → ·ᐳ ) CANADIAN SYLLABICS CARRIER HI → MIDDLE DOT, CANADIAN SYLLABICS PO # →ᑀ→→ᐧᐳ→
+1440 ; 00B7 1433 ;     ML      # ( ᑀ → ·ᐳ ) CANADIAN SYLLABICS PWO → MIDDLE DOT, CANADIAN SYLLABICS PO        # →ᐧᐳ→
+
+1442 ; 00B7 1434 ;     ML      # ( ᑂ → ·ᐴ ) CANADIAN SYLLABICS PWOO → MIDDLE DOT, CANADIAN SYLLABICS POO      # →ᐧᐴ→
+
+1444 ; 00B7 1438 ;     ML      # ( ᑄ → ·ᐸ ) CANADIAN SYLLABICS PWA → MIDDLE DOT, CANADIAN SYLLABICS PA        # →ᐧᐸ→
+
+1446 ; 00B7 1439 ;     ML      # ( ᑆ → ·ᐹ ) CANADIAN SYLLABICS PWAA → MIDDLE DOT, CANADIAN SYLLABICS PAA      # →ᐧᐹ→
+
+1457 ; 00B7 144C ;     ML      # ( ᑗ → ·ᑌ ) CANADIAN SYLLABICS TWE → MIDDLE DOT, CANADIAN SYLLABICS TE        # →ᐧᑌ→
+
+1459 ; 00B7 144E ;     ML      # ( ᑙ → ·ᑎ ) CANADIAN SYLLABICS TWI → MIDDLE DOT, CANADIAN SYLLABICS TI        # →ᐧᑎ→
+
+145B ; 00B7 144F ;     ML      # ( ᑛ → ·ᑏ ) CANADIAN SYLLABICS TWII → MIDDLE DOT, CANADIAN SYLLABICS TII      # →ᐧᑏ→
+
+1454 ; 00B7 1450 ;     ML      # ( ᑔ → ·ᑐ ) CANADIAN SYLLABICS CARRIER DI → MIDDLE DOT, CANADIAN SYLLABICS TO # →ᑝ→→ᐧᑐ→
+145D ; 00B7 1450 ;     ML      # ( ᑝ → ·ᑐ ) CANADIAN SYLLABICS TWO → MIDDLE DOT, CANADIAN SYLLABICS TO        # →ᐧᑐ→
+
+145F ; 00B7 1451 ;     ML      # ( ᑟ → ·ᑑ ) CANADIAN SYLLABICS TWOO → MIDDLE DOT, CANADIAN SYLLABICS TOO      # →ᐧᑑ→
+
+1461 ; 00B7 1455 ;     ML      # ( ᑡ → ·ᑕ ) CANADIAN SYLLABICS TWA → MIDDLE DOT, CANADIAN SYLLABICS TA        # →ᐧᑕ→
+
+1463 ; 00B7 1456 ;     ML      # ( ᑣ → ·ᑖ ) CANADIAN SYLLABICS TWAA → MIDDLE DOT, CANADIAN SYLLABICS TAA      # →ᐧᑖ→
+
+1474 ; 00B7 146B ;     ML      # ( ᑴ → ·ᑫ ) CANADIAN SYLLABICS KWE → MIDDLE DOT, CANADIAN SYLLABICS KE        # →ᐧᑫ→
+
+1478 ; 00B7 146E ;     ML      # ( ᑸ → ·ᑮ ) CANADIAN SYLLABICS KWII → MIDDLE DOT, CANADIAN SYLLABICS KII      # →ᐧᑮ→
+
+147C ; 00B7 1470 ;     ML      # ( ᑼ → ·ᑰ ) CANADIAN SYLLABICS KWOO → MIDDLE DOT, CANADIAN SYLLABICS KOO      # →ᐧᑰ→
+
+147E ; 00B7 1472 ;     ML      # ( ᑾ → ·ᑲ ) CANADIAN SYLLABICS KWA → MIDDLE DOT, CANADIAN SYLLABICS KA        # →ᐧᑲ→
+
+1480 ; 00B7 1473 ;     ML      # ( ᒀ → ·ᑳ ) CANADIAN SYLLABICS KWAA → MIDDLE DOT, CANADIAN SYLLABICS KAA      # →ᐧᑳ→
+
+1492 ; 00B7 1489 ;     ML      # ( ᒒ → ·ᒉ ) CANADIAN SYLLABICS CWE → MIDDLE DOT, CANADIAN SYLLABICS CE        # →ᐧᒉ→
+
+1494 ; 00B7 148B ;     ML      # ( ᒔ → ·ᒋ ) CANADIAN SYLLABICS CWI → MIDDLE DOT, CANADIAN SYLLABICS CI        # →ᐧᒋ→
+
+1496 ; 00B7 148C ;     ML      # ( ᒖ → ·ᒌ ) CANADIAN SYLLABICS CWII → MIDDLE DOT, CANADIAN SYLLABICS CII      # →ᐧᒌ→
+
+149A ; 00B7 148E ;     ML      # ( ᒚ → ·ᒎ ) CANADIAN SYLLABICS CWOO → MIDDLE DOT, CANADIAN SYLLABICS COO      # →ᐧᒎ→
+
+149C ; 00B7 1490 ;     ML      # ( ᒜ → ·ᒐ ) CANADIAN SYLLABICS CWA → MIDDLE DOT, CANADIAN SYLLABICS CA        # →ᐧᒐ→
+
+149E ; 00B7 1491 ;     ML      # ( ᒞ → ·ᒑ ) CANADIAN SYLLABICS CWAA → MIDDLE DOT, CANADIAN SYLLABICS CAA      # →ᐧᒑ→
+
+14AC ; 00B7 14A3 ;     ML      # ( ᒬ → ·ᒣ ) CANADIAN SYLLABICS MWE → MIDDLE DOT, CANADIAN SYLLABICS ME        # →ᐧᒣ→
+
+14AE ; 00B7 14A5 ;     ML      # ( ᒮ → ·ᒥ ) CANADIAN SYLLABICS MWI → MIDDLE DOT, CANADIAN SYLLABICS MI        # →ᐧᒥ→
+
+14B0 ; 00B7 14A6 ;     ML      # ( ᒰ → ·ᒦ ) CANADIAN SYLLABICS MWII → MIDDLE DOT, CANADIAN SYLLABICS MII      # →ᐧᒦ→
+
+14B2 ; 00B7 14A7 ;     ML      # ( ᒲ → ·ᒧ ) CANADIAN SYLLABICS MWO → MIDDLE DOT, CANADIAN SYLLABICS MO        # →ᐧᒧ→
+
+14B4 ; 00B7 14A8 ;     ML      # ( ᒴ → ·ᒨ ) CANADIAN SYLLABICS MWOO → MIDDLE DOT, CANADIAN SYLLABICS MOO      # →ᐧᒨ→
+
+14B6 ; 00B7 14AA ;     ML      # ( ᒶ → ·ᒪ ) CANADIAN SYLLABICS MWA → MIDDLE DOT, CANADIAN SYLLABICS MA        # →ᐧᒪ→
+
+14B8 ; 00B7 14AB ;     ML      # ( ᒸ → ·ᒫ ) CANADIAN SYLLABICS MWAA → MIDDLE DOT, CANADIAN SYLLABICS MAA      # →ᐧᒫ→
+
+14C9 ; 00B7 14C0 ;     ML      # ( ᓉ → ·ᓀ ) CANADIAN SYLLABICS NWE → MIDDLE DOT, CANADIAN SYLLABICS NE        # →ᐧᓀ→
+
+14CB ; 00B7 14C7 ;     ML      # ( ᓋ → ·ᓇ ) CANADIAN SYLLABICS NWA → MIDDLE DOT, CANADIAN SYLLABICS NA        # →ᐧᓇ→
+
+14CD ; 00B7 14C8 ;     ML      # ( ᓍ → ·ᓈ ) CANADIAN SYLLABICS NWAA → MIDDLE DOT, CANADIAN SYLLABICS NAA      # →ᐧᓈ→
+
+14DC ; 00B7 14D3 ;     ML      # ( ᓜ → ·ᓓ ) CANADIAN SYLLABICS LWE → MIDDLE DOT, CANADIAN SYLLABICS LE        # →ᐧᓓ→
+
+14DE ; 00B7 14D5 ;     ML      # ( ᓞ → ·ᓕ ) CANADIAN SYLLABICS LWI → MIDDLE DOT, CANADIAN SYLLABICS LI        # →ᐧᓕ→
+
+14E0 ; 00B7 14D6 ;     ML      # ( ᓠ → ·ᓖ ) CANADIAN SYLLABICS LWII → MIDDLE DOT, CANADIAN SYLLABICS LII      # →ᐧᓖ→
+
+14E2 ; 00B7 14D7 ;     ML      # ( ᓢ → ·ᓗ ) CANADIAN SYLLABICS LWO → MIDDLE DOT, CANADIAN SYLLABICS LO        # →ᐧᓗ→
+
+14E4 ; 00B7 14D8 ;     ML      # ( ᓤ → ·ᓘ ) CANADIAN SYLLABICS LWOO → MIDDLE DOT, CANADIAN SYLLABICS LOO      # →ᐧᓘ→
+
+14E6 ; 00B7 14DA ;     ML      # ( ᓦ → ·ᓚ ) CANADIAN SYLLABICS LWA → MIDDLE DOT, CANADIAN SYLLABICS LA        # →ᐧᓚ→
+
+14E8 ; 00B7 14DB ;     ML      # ( ᓨ → ·ᓛ ) CANADIAN SYLLABICS LWAA → MIDDLE DOT, CANADIAN SYLLABICS LAA      # →ᐧᓛ→
+
+14F6 ; 00B7 14ED ;     ML      # ( ᓶ → ·ᓭ ) CANADIAN SYLLABICS SWE → MIDDLE DOT, CANADIAN SYLLABICS SE        # →ᐧᓭ→
+
+14F8 ; 00B7 14EF ;     ML      # ( ᓸ → ·ᓯ ) CANADIAN SYLLABICS SWI → MIDDLE DOT, CANADIAN SYLLABICS SI        # →ᐧᓯ→
+
+14FA ; 00B7 14F0 ;     ML      # ( ᓺ → ·ᓰ ) CANADIAN SYLLABICS SWII → MIDDLE DOT, CANADIAN SYLLABICS SII      # →ᐧᓰ→
+
+14FC ; 00B7 14F1 ;     ML      # ( ᓼ → ·ᓱ ) CANADIAN SYLLABICS SWO → MIDDLE DOT, CANADIAN SYLLABICS SO        # →ᐧᓱ→
+
+14FE ; 00B7 14F2 ;     ML      # ( ᓾ → ·ᓲ ) CANADIAN SYLLABICS SWOO → MIDDLE DOT, CANADIAN SYLLABICS SOO      # →ᐧᓲ→
+
+1500 ; 00B7 14F4 ;     ML      # ( ᔀ → ·ᓴ ) CANADIAN SYLLABICS SWA → MIDDLE DOT, CANADIAN SYLLABICS SA        # →ᐧᓴ→
+
+1502 ; 00B7 14F5 ;     ML      # ( ᔂ → ·ᓵ ) CANADIAN SYLLABICS SWAA → MIDDLE DOT, CANADIAN SYLLABICS SAA      # →ᐧᓵ→
+
+1517 ; 00B7 1510 ;     ML      # ( ᔗ → ·ᔐ ) CANADIAN SYLLABICS SHWE → MIDDLE DOT, CANADIAN SYLLABICS SHE      # →ᐧᔐ→
+
+1519 ; 00B7 1511 ;     ML      # ( ᔙ → ·ᔑ ) CANADIAN SYLLABICS SHWI → MIDDLE DOT, CANADIAN SYLLABICS SHI      # →ᐧᔑ→
+
+151B ; 00B7 1512 ;     ML      # ( ᔛ → ·ᔒ ) CANADIAN SYLLABICS SHWII → MIDDLE DOT, CANADIAN SYLLABICS SHII    # →ᐧᔒ→
+
+151D ; 00B7 1513 ;     ML      # ( ᔝ → ·ᔓ ) CANADIAN SYLLABICS SHWO → MIDDLE DOT, CANADIAN SYLLABICS SHO      # →ᐧᔓ→
+
+151F ; 00B7 1514 ;     ML      # ( ᔟ → ·ᔔ ) CANADIAN SYLLABICS SHWOO → MIDDLE DOT, CANADIAN SYLLABICS SHOO    # →ᐧᔔ→
+
+1521 ; 00B7 1515 ;     ML      # ( ᔡ → ·ᔕ ) CANADIAN SYLLABICS SHWA → MIDDLE DOT, CANADIAN SYLLABICS SHA      # →ᐧᔕ→
+
+1523 ; 00B7 1516 ;     ML      # ( ᔣ → ·ᔖ ) CANADIAN SYLLABICS SHWAA → MIDDLE DOT, CANADIAN SYLLABICS SHAA    # →ᐧᔖ→
+
+1531 ; 00B7 1528 ;     ML      # ( ᔱ → ·ᔨ ) CANADIAN SYLLABICS YWI → MIDDLE DOT, CANADIAN SYLLABICS YI        # →ᐧᔨ→
+
+1533 ; 00B7 1529 ;     ML      # ( ᔳ → ·ᔩ ) CANADIAN SYLLABICS YWII → MIDDLE DOT, CANADIAN SYLLABICS YII      # →ᐧᔩ→
+
+1535 ; 00B7 152A ;     ML      # ( ᔵ → ·ᔪ ) CANADIAN SYLLABICS YWO → MIDDLE DOT, CANADIAN SYLLABICS YO        # →ᐧᔪ→
+
+1537 ; 00B7 152B ;     ML      # ( ᔷ → ·ᔫ ) CANADIAN SYLLABICS YWOO → MIDDLE DOT, CANADIAN SYLLABICS YOO      # →ᐧᔫ→
+
+1539 ; 00B7 152D ;     ML      # ( ᔹ → ·ᔭ ) CANADIAN SYLLABICS YWA → MIDDLE DOT, CANADIAN SYLLABICS YA        # →ᐧᔭ→
+
+153B ; 00B7 152E ;     ML      # ( ᔻ → ·ᔮ ) CANADIAN SYLLABICS YWAA → MIDDLE DOT, CANADIAN SYLLABICS YAA      # →ᐧᔮ→
+
+154E ; 00B7 154C ;     ML      # ( ᕎ → ·ᕌ ) CANADIAN SYLLABICS RWAA → MIDDLE DOT, CANADIAN SYLLABICS RAA      # →ᐧᕌ→
+
+155B ; 00B7 155A ;     ML      # ( ᕛ → ·ᕚ ) CANADIAN SYLLABICS FWAA → MIDDLE DOT, CANADIAN SYLLABICS FAA      # →ᐧᕚ→
+
+1568 ; 00B7 1567 ;     ML      # ( ᕨ → ·ᕧ ) CANADIAN SYLLABICS THWAA → MIDDLE DOT, CANADIAN SYLLABICS THAA    # →ᐧᕧ→
+
+FE19 ; 205D ;  ML      #* ( ︙ → ⁝ ) PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS → TRICOLON      # 
+22EE ; 205D ;  ML      #* ( ⋮ → ⁝ ) VERTICAL ELLIPSIS → TRICOLON       # →︙→
+
+0060 ; 0027 ;  ML      #* ( ` → ' ) GRAVE ACCENT → APOSTROPHE      # →ˋ→→`→→‘→
+1FEF ; 0027 ;  ML      #* ( ` → ' ) GREEK VARIA → APOSTROPHE     # →ˋ→→`→→‘→
+FF40 ; 0027 ;  ML      #* ( ` → ' ) FULLWIDTH GRAVE ACCENT → APOSTROPHE  # →‘→
+00B4 ; 0027 ;  ML      #* ( ´ → ' ) ACUTE ACCENT → APOSTROPHE     # →΄→→ʹ→
+0384 ; 0027 ;  ML      #* ( ΄ → ' ) GREEK TONOS → APOSTROPHE      # →ʹ→
+1FFD ; 0027 ;  ML      #* ( ´ → ' ) GREEK OXIA → APOSTROPHE      # →ˊ→→ʹ→→′→
+1FBD ; 0027 ;  ML      #* ( ᾽ → ' ) GREEK KORONIS → APOSTROPHE   # →’→
+1FBF ; 0027 ;  ML      #* ( ᾿ → ' ) GREEK PSILI → APOSTROPHE     # →’→
+1FFE ; 0027 ;  ML      #* ( ῾ → ' ) GREEK DASIA → APOSTROPHE     # →‛→→′→
+055D ; 0027 ;  ML      #* ( ՝ → ' ) ARMENIAN COMMA → APOSTROPHE   # →ˋ→→`→→‘→
+FF07 ; 0027 ;  ML      #* ( ' → ' ) FULLWIDTH APOSTROPHE → APOSTROPHE    # →’→
+2018 ; 0027 ;  ML      #* ( ‘ → ' ) LEFT SINGLE QUOTATION MARK → APOSTROPHE      # 
+2019 ; 0027 ;  ML      #* ( ’ → ' ) RIGHT SINGLE QUOTATION MARK → APOSTROPHE     # 
+201B ; 0027 ;  ML      #* ( ‛ → ' ) SINGLE HIGH-REVERSED-9 QUOTATION MARK → APOSTROPHE   # →′→
+2032 ; 0027 ;  ML      #* ( ′ → ' ) PRIME → APOSTROPHE   # 
+2035 ; 0027 ;  ML      #* ( ‵ → ' ) REVERSED PRIME → APOSTROPHE  # →ʽ→→‘→
+055A ; 0027 ;  ML      #* ( ՚ → ' ) ARMENIAN APOSTROPHE → APOSTROPHE      # →’→
+05F3 ; 0027 ;  ML      #* ( ‎׳‎ → ' ) HEBREW PUNCTUATION GERESH → APOSTROPHE  # 
+02B9 ; 0027 ;  ML      # ( ʹ → ' ) MODIFIER LETTER PRIME → APOSTROPHE     # 
+0374 ; 0027 ;  ML      # ( ʹ → ' ) GREEK NUMERAL SIGN → APOSTROPHE        # →′→
+02CA ; 0027 ;  ML      # ( ˊ → ' ) MODIFIER LETTER ACUTE ACCENT → APOSTROPHE      # →ʹ→→′→
+02CB ; 0027 ;  ML      # ( ˋ → ' ) MODIFIER LETTER GRAVE ACCENT → APOSTROPHE      # →`→→‘→
+02F4 ; 0027 ;  ML      #* ( ˴ → ' ) MODIFIER LETTER MIDDLE GRAVE ACCENT → APOSTROPHE      # →ˋ→→`→→‘→
+02BB ; 0027 ;  ML      # ( ʻ → ' ) MODIFIER LETTER TURNED COMMA → APOSTROPHE      # →‘→
+02BD ; 0027 ;  ML      # ( ʽ → ' ) MODIFIER LETTER REVERSED COMMA → APOSTROPHE    # →‘→
+02BC ; 0027 ;  ML      # ( ʼ → ' ) MODIFIER LETTER APOSTROPHE → APOSTROPHE        # →′→
+02BE ; 0027 ;  ML      # ( ʾ → ' ) MODIFIER LETTER RIGHT HALF RING → APOSTROPHE   # →ʼ→→′→
+A78C ; 0027 ;  ML      # ( ꞌ → ' ) LATIN SMALL LETTER SALTILLO → APOSTROPHE      # 
+05D9 ; 0027 ;  ML      # ( ‎י‎ → ' ) HEBREW LETTER YOD → APOSTROPHE   # 
+07F4 ; 0027 ;  ML      # ( ‎ߴ‎ → ' ) NKO HIGH TONE APOSTROPHE → APOSTROPHE    # →’→
+07F5 ; 0027 ;  ML      # ( ‎ߵ‎ → ' ) NKO LOW TONE APOSTROPHE → APOSTROPHE     # →‘→
+
+02DD ; 0027 0027 ;     ML      #* ( ˝ → '' ) DOUBLE ACUTE ACCENT → APOSTROPHE, APOSTROPHE # →"→
+0022 ; 0027 0027 ;     ML      #* ( " → '' ) QUOTATION MARK → APOSTROPHE, APOSTROPHE       # 
+FF02 ; 0027 0027 ;     ML      #* ( " → '' ) FULLWIDTH QUOTATION MARK → APOSTROPHE, APOSTROPHE   # →”→→"→
+201C ; 0027 0027 ;     ML      #* ( “ → '' ) LEFT DOUBLE QUOTATION MARK → APOSTROPHE, APOSTROPHE # →"→
+201D ; 0027 0027 ;     ML      #* ( ” → '' ) RIGHT DOUBLE QUOTATION MARK → APOSTROPHE, APOSTROPHE        # →"→
+201F ; 0027 0027 ;     ML      #* ( ‟ → '' ) DOUBLE HIGH-REVERSED-9 QUOTATION MARK → APOSTROPHE, APOSTROPHE      # →”→→"→
+2033 ; 0027 0027 ;     ML      #* ( ″ → '' ) DOUBLE PRIME → APOSTROPHE, APOSTROPHE       # →"→
+2036 ; 0027 0027 ;     ML      #* ( ‶ → '' ) REVERSED DOUBLE PRIME → APOSTROPHE, APOSTROPHE      # →‵‵→
+3003 ; 0027 0027 ;     ML      #* ( 〃 → '' ) DITTO MARK → APOSTROPHE, APOSTROPHE # →″→→"→
+05F4 ; 0027 0027 ;     ML      #* ( ‎״‎ → '' ) HEBREW PUNCTUATION GERSHAYIM → APOSTROPHE, APOSTROPHE  # →"→
+02BA ; 0027 0027 ;     ML      # ( ʺ → '' ) MODIFIER LETTER DOUBLE PRIME → APOSTROPHE, APOSTROPHE # →"→
+02F6 ; 0027 0027 ;     ML      #* ( ˶ → '' ) MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT → APOSTROPHE, APOSTROPHE  # →˝→→"→
+02EE ; 0027 0027 ;     ML      # ( ˮ → '' ) MODIFIER LETTER DOUBLE APOSTROPHE → APOSTROPHE, APOSTROPHE    # →″→→"→
+05F2 ; 0027 0027 ;     ML      # ( ‎ײ‎ → '' ) HEBREW LIGATURE YIDDISH DOUBLE YOD → APOSTROPHE, APOSTROPHE     # →‎יי‎→
+
+2034 ; 0027 0027 0027 ;        ML      #* ( ‴ → ''' ) TRIPLE PRIME → APOSTROPHE, APOSTROPHE, APOSTROPHE  # →′′′→
+2037 ; 0027 0027 0027 ;        ML      #* ( ‷ → ''' ) REVERSED TRIPLE PRIME → APOSTROPHE, APOSTROPHE, APOSTROPHE # →‵‵‵→
+
+2057 ; 0027 0027 0027 0027 ;   ML      #* ( ⁗ → '''' ) QUADRUPLE PRIME → APOSTROPHE, APOSTROPHE, APOSTROPHE, APOSTROPHE  # →′′′′→
+
+FF3B ; 0028 ;  ML      #* ( [ → ( ) FULLWIDTH LEFT SQUARE BRACKET → LEFT PARENTHESIS     # →〔→
+3014 ; 0028 ;  ML      #* ( 〔 → ( ) LEFT TORTOISE SHELL BRACKET → LEFT PARENTHESIS       # 
+FD3E ; 0028 ;  ML      #* ( ﴾ → ( ) ORNATE LEFT PARENTHESIS → LEFT PARENTHESIS   # 
+2768 ; 0028 ;  ML      #* ( ❨ → ( ) MEDIUM LEFT PARENTHESIS ORNAMENT → LEFT PARENTHESIS  # 
+2772 ; 0028 ;  ML      #* ( ❲ → ( ) LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT → LEFT PARENTHESIS        # →〔→
+
+3220 ; 0028 30FC 0029 ;        ML      #* ( ㈠ → (ー) ) PARENTHESIZED IDEOGRAPH ONE → LEFT PARENTHESIS, KATAKANA-HIRAGANA PROLONGED SOUND MARK, RIGHT PARENTHESIS        # →(一)→
+
+247D ; 0028 0031 0030 0029 ;   ML      #* ( ⑽ → (10) ) PARENTHESIZED NUMBER TEN → LEFT PARENTHESIS, DIGIT ONE, DIGIT ZERO, RIGHT PARENTHESIS     # 
+
+2475 ; 0028 0032 0029 ;        ML      #* ( ⑵ → (2) ) PARENTHESIZED DIGIT TWO → LEFT PARENTHESIS, DIGIT TWO, RIGHT PARENTHESIS   # 
+
+2487 ; 0028 0032 0030 0029 ;   ML      #* ( ⒇ → (20) ) PARENTHESIZED NUMBER TWENTY → LEFT PARENTHESIS, DIGIT TWO, DIGIT ZERO, RIGHT PARENTHESIS  # 
+
+2476 ; 0028 0033 0029 ;        ML      #* ( ⑶ → (3) ) PARENTHESIZED DIGIT THREE → LEFT PARENTHESIS, DIGIT THREE, RIGHT PARENTHESIS       # 
+
+2477 ; 0028 0034 0029 ;        ML      #* ( ⑷ → (4) ) PARENTHESIZED DIGIT FOUR → LEFT PARENTHESIS, DIGIT FOUR, RIGHT PARENTHESIS # 
+
+2478 ; 0028 0035 0029 ;        ML      #* ( ⑸ → (5) ) PARENTHESIZED DIGIT FIVE → LEFT PARENTHESIS, DIGIT FIVE, RIGHT PARENTHESIS # 
+
+2479 ; 0028 0036 0029 ;        ML      #* ( ⑹ → (6) ) PARENTHESIZED DIGIT SIX → LEFT PARENTHESIS, DIGIT SIX, RIGHT PARENTHESIS   # 
+
+247A ; 0028 0037 0029 ;        ML      #* ( ⑺ → (7) ) PARENTHESIZED DIGIT SEVEN → LEFT PARENTHESIS, DIGIT SEVEN, RIGHT PARENTHESIS       # 
+
+247B ; 0028 0038 0029 ;        ML      #* ( ⑻ → (8) ) PARENTHESIZED DIGIT EIGHT → LEFT PARENTHESIS, DIGIT EIGHT, RIGHT PARENTHESIS       # 
+
+247C ; 0028 0039 0029 ;        ML      #* ( ⑼ → (9) ) PARENTHESIZED DIGIT NINE → LEFT PARENTHESIS, DIGIT NINE, RIGHT PARENTHESIS # 
+
+249C ; 0028 0061 0029 ;        ML      #* ( ⒜ → (a) ) PARENTHESIZED LATIN SMALL LETTER A → LEFT PARENTHESIS, LATIN SMALL LETTER A, RIGHT PARENTHESIS     # 
+
+249D ; 0028 0062 0029 ;        ML      #* ( ⒝ → (b) ) PARENTHESIZED LATIN SMALL LETTER B → LEFT PARENTHESIS, LATIN SMALL LETTER B, RIGHT PARENTHESIS     # 
+
+249E ; 0028 0063 0029 ;        ML      #* ( ⒞ → (c) ) PARENTHESIZED LATIN SMALL LETTER C → LEFT PARENTHESIS, LATIN SMALL LETTER C, RIGHT PARENTHESIS     # 
+
+249F ; 0028 0064 0029 ;        ML      #* ( ⒟ → (d) ) PARENTHESIZED LATIN SMALL LETTER D → LEFT PARENTHESIS, LATIN SMALL LETTER D, RIGHT PARENTHESIS     # 
+
+24A0 ; 0028 0065 0029 ;        ML      #* ( ⒠ → (e) ) PARENTHESIZED LATIN SMALL LETTER E → LEFT PARENTHESIS, LATIN SMALL LETTER E, RIGHT PARENTHESIS     # 
+
+24A1 ; 0028 0066 0029 ;        ML      #* ( ⒡ → (f) ) PARENTHESIZED LATIN SMALL LETTER F → LEFT PARENTHESIS, LATIN SMALL LETTER F, RIGHT PARENTHESIS     # 
+
+24A2 ; 0028 0067 0029 ;        ML      #* ( ⒢ → (g) ) PARENTHESIZED LATIN SMALL LETTER G → LEFT PARENTHESIS, LATIN SMALL LETTER G, RIGHT PARENTHESIS     # 
+
+24A3 ; 0028 0068 0029 ;        ML      #* ( ⒣ → (h) ) PARENTHESIZED LATIN SMALL LETTER H → LEFT PARENTHESIS, LATIN SMALL LETTER H, RIGHT PARENTHESIS     # 
+
+24A4 ; 0028 0069 0029 ;        ML      #* ( ⒤ → (i) ) PARENTHESIZED LATIN SMALL LETTER I → LEFT PARENTHESIS, LATIN SMALL LETTER I, RIGHT PARENTHESIS     # 
+
+24A5 ; 0028 006A 0029 ;        ML      #* ( ⒥ → (j) ) PARENTHESIZED LATIN SMALL LETTER J → LEFT PARENTHESIS, LATIN SMALL LETTER J, RIGHT PARENTHESIS     # 
+
+24A6 ; 0028 006B 0029 ;        ML      #* ( ⒦ → (k) ) PARENTHESIZED LATIN SMALL LETTER K → LEFT PARENTHESIS, LATIN SMALL LETTER K, RIGHT PARENTHESIS     # 
+
+2474 ; 0028 006C 0029 ;        ML      #* ( ⑴ → (l) ) PARENTHESIZED DIGIT ONE → LEFT PARENTHESIS, LATIN SMALL LETTER L, RIGHT PARENTHESIS        # →(1)→
+1F118 ;        0028 006C 0029 ;        ML      #* ( 🄘 → (l) ) PARENTHESIZED LATIN CAPITAL LETTER I → LEFT PARENTHESIS, LATIN SMALL LETTER L, RIGHT PARENTHESIS  # →(I)→
+24A7 ; 0028 006C 0029 ;        ML      #* ( ⒧ → (l) ) PARENTHESIZED LATIN SMALL LETTER L → LEFT PARENTHESIS, LATIN SMALL LETTER L, RIGHT PARENTHESIS     # 
+
+247F ; 0028 006C 0032 0029 ;   ML      #* ( ⑿ → (l2) ) PARENTHESIZED NUMBER TWELVE → LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT TWO, RIGHT PARENTHESIS        # →(12)→
+
+2480 ; 0028 006C 0033 0029 ;   ML      #* ( ⒀ → (l3) ) PARENTHESIZED NUMBER THIRTEEN → LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT THREE, RIGHT PARENTHESIS    # →(13)→
+
+2481 ; 0028 006C 0034 0029 ;   ML      #* ( ⒁ → (l4) ) PARENTHESIZED NUMBER FOURTEEN → LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT FOUR, RIGHT PARENTHESIS     # →(14)→
+
+2482 ; 0028 006C 0035 0029 ;   ML      #* ( ⒂ → (l5) ) PARENTHESIZED NUMBER FIFTEEN → LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT FIVE, RIGHT PARENTHESIS      # →(15)→
+
+2483 ; 0028 006C 0036 0029 ;   ML      #* ( ⒃ → (l6) ) PARENTHESIZED NUMBER SIXTEEN → LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT SIX, RIGHT PARENTHESIS       # →(16)→
+
+2484 ; 0028 006C 0037 0029 ;   ML      #* ( ⒄ → (l7) ) PARENTHESIZED NUMBER SEVENTEEN → LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT SEVEN, RIGHT PARENTHESIS   # →(17)→
+
+2485 ; 0028 006C 0038 0029 ;   ML      #* ( ⒅ → (l8) ) PARENTHESIZED NUMBER EIGHTEEN → LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT EIGHT, RIGHT PARENTHESIS    # →(18)→
+
+2486 ; 0028 006C 0039 0029 ;   ML      #* ( ⒆ → (l9) ) PARENTHESIZED NUMBER NINETEEN → LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT NINE, RIGHT PARENTHESIS     # →(19)→
+
+247E ; 0028 006C 006C 0029 ;   ML      #* ( ⑾ → (ll) ) PARENTHESIZED NUMBER ELEVEN → LEFT PARENTHESIS, LATIN SMALL LETTER L, LATIN SMALL LETTER L, RIGHT PARENTHESIS     # →(11)→
+
+24A9 ; 0028 006E 0029 ;        ML      #* ( ⒩ → (n) ) PARENTHESIZED LATIN SMALL LETTER N → LEFT PARENTHESIS, LATIN SMALL LETTER N, RIGHT PARENTHESIS     # 
+
+24AA ; 0028 006F 0029 ;        ML      #* ( ⒪ → (o) ) PARENTHESIZED LATIN SMALL LETTER O → LEFT PARENTHESIS, LATIN SMALL LETTER O, RIGHT PARENTHESIS     # 
+
+24AB ; 0028 0070 0029 ;        ML      #* ( ⒫ → (p) ) PARENTHESIZED LATIN SMALL LETTER P → LEFT PARENTHESIS, LATIN SMALL LETTER P, RIGHT PARENTHESIS     # 
+
+24AC ; 0028 0071 0029 ;        ML      #* ( ⒬ → (q) ) PARENTHESIZED LATIN SMALL LETTER Q → LEFT PARENTHESIS, LATIN SMALL LETTER Q, RIGHT PARENTHESIS     # 
+
+24AD ; 0028 0072 0029 ;        ML      #* ( ⒭ → (r) ) PARENTHESIZED LATIN SMALL LETTER R → LEFT PARENTHESIS, LATIN SMALL LETTER R, RIGHT PARENTHESIS     # 
+
+24A8 ; 0028 0072 006E 0029 ;   ML      #* ( ⒨ → (rn) ) PARENTHESIZED LATIN SMALL LETTER M → LEFT PARENTHESIS, LATIN SMALL LETTER R, LATIN SMALL LETTER N, RIGHT PARENTHESIS      # →(m)→
+
+24AE ; 0028 0073 0029 ;        ML      #* ( ⒮ → (s) ) PARENTHESIZED LATIN SMALL LETTER S → LEFT PARENTHESIS, LATIN SMALL LETTER S, RIGHT PARENTHESIS     # 
+
+1F12A ;        1F122 ; ML      #* ( 🄪 → 🄢 ) TORTOISE SHELL BRACKETED LATIN CAPITAL LETTER S → PARENTHESIZED LATIN CAPITAL LETTER S   # →〔S〕→→(S)→
+
+24AF ; 0028 0074 0029 ;        ML      #* ( ⒯ → (t) ) PARENTHESIZED LATIN SMALL LETTER T → LEFT PARENTHESIS, LATIN SMALL LETTER T, RIGHT PARENTHESIS     # 
+
+24B0 ; 0028 0075 0029 ;        ML      #* ( ⒰ → (u) ) PARENTHESIZED LATIN SMALL LETTER U → LEFT PARENTHESIS, LATIN SMALL LETTER U, RIGHT PARENTHESIS     # 
+
+24B1 ; 0028 0076 0029 ;        ML      #* ( ⒱ → (v) ) PARENTHESIZED LATIN SMALL LETTER V → LEFT PARENTHESIS, LATIN SMALL LETTER V, RIGHT PARENTHESIS     # 
+
+24B2 ; 0028 0076 0076 0029 ;   ML      #* ( ⒲ → (vv) ) PARENTHESIZED LATIN SMALL LETTER W → LEFT PARENTHESIS, LATIN SMALL LETTER V, LATIN SMALL LETTER V, RIGHT PARENTHESIS      # →(w)→
+
+24B3 ; 0028 0078 0029 ;        ML      #* ( ⒳ → (x) ) PARENTHESIZED LATIN SMALL LETTER X → LEFT PARENTHESIS, LATIN SMALL LETTER X, RIGHT PARENTHESIS     # 
+
+24B4 ; 0028 0079 0029 ;        ML      #* ( ⒴ → (y) ) PARENTHESIZED LATIN SMALL LETTER Y → LEFT PARENTHESIS, LATIN SMALL LETTER Y, RIGHT PARENTHESIS     # 
+
+24B5 ; 0028 007A 0029 ;        ML      #* ( ⒵ → (z) ) PARENTHESIZED LATIN SMALL LETTER Z → LEFT PARENTHESIS, LATIN SMALL LETTER Z, RIGHT PARENTHESIS     # 
+
+3200 ; 0028 1100 0029 ;        ML      #* ( ㈀ → (ᄀ) ) PARENTHESIZED HANGUL KIYEOK → LEFT PARENTHESIS, HANGUL CHOSEONG KIYEOK, RIGHT PARENTHESIS        # 
+
+320E ; 0028 AC00 0029 ;        ML      #* ( ㈎ → (가) ) PARENTHESIZED HANGUL KIYEOK A → LEFT PARENTHESIS, HANGUL SYLLABLE GA, RIGHT PARENTHESIS  # 
+
+3201 ; 0028 1102 0029 ;        ML      #* ( ㈁ → (ᄂ) ) PARENTHESIZED HANGUL NIEUN → LEFT PARENTHESIS, HANGUL CHOSEONG NIEUN, RIGHT PARENTHESIS  # 
+
+320F ; 0028 B098 0029 ;        ML      #* ( ㈏ → (나) ) PARENTHESIZED HANGUL NIEUN A → LEFT PARENTHESIS, HANGUL SYLLABLE NA, RIGHT PARENTHESIS   # 
+
+3202 ; 0028 1103 0029 ;        ML      #* ( ㈂ → (ᄃ) ) PARENTHESIZED HANGUL TIKEUT → LEFT PARENTHESIS, HANGUL CHOSEONG TIKEUT, RIGHT PARENTHESIS        # 
+
+3210 ; 0028 B2E4 0029 ;        ML      #* ( ㈐ → (다) ) PARENTHESIZED HANGUL TIKEUT A → LEFT PARENTHESIS, HANGUL SYLLABLE DA, RIGHT PARENTHESIS  # 
+
+3203 ; 0028 1105 0029 ;        ML      #* ( ㈃ → (ᄅ) ) PARENTHESIZED HANGUL RIEUL → LEFT PARENTHESIS, HANGUL CHOSEONG RIEUL, RIGHT PARENTHESIS  # 
+
+3211 ; 0028 B77C 0029 ;        ML      #* ( ㈑ → (라) ) PARENTHESIZED HANGUL RIEUL A → LEFT PARENTHESIS, HANGUL SYLLABLE RA, RIGHT PARENTHESIS   # 
+
+3204 ; 0028 1106 0029 ;        ML      #* ( ㈄ → (ᄆ) ) PARENTHESIZED HANGUL MIEUM → LEFT PARENTHESIS, HANGUL CHOSEONG MIEUM, RIGHT PARENTHESIS  # 
+
+3212 ; 0028 B9C8 0029 ;        ML      #* ( ㈒ → (마) ) PARENTHESIZED HANGUL MIEUM A → LEFT PARENTHESIS, HANGUL SYLLABLE MA, RIGHT PARENTHESIS   # 
+
+3205 ; 0028 1107 0029 ;        ML      #* ( ㈅ → (ᄇ) ) PARENTHESIZED HANGUL PIEUP → LEFT PARENTHESIS, HANGUL CHOSEONG PIEUP, RIGHT PARENTHESIS  # 
+
+3213 ; 0028 BC14 0029 ;        ML      #* ( ㈓ → (바) ) PARENTHESIZED HANGUL PIEUP A → LEFT PARENTHESIS, HANGUL SYLLABLE BA, RIGHT PARENTHESIS   # 
+
+3206 ; 0028 1109 0029 ;        ML      #* ( ㈆ → (ᄉ) ) PARENTHESIZED HANGUL SIOS → LEFT PARENTHESIS, HANGUL CHOSEONG SIOS, RIGHT PARENTHESIS    # 
+
+3214 ; 0028 C0AC 0029 ;        ML      #* ( ㈔ → (사) ) PARENTHESIZED HANGUL SIOS A → LEFT PARENTHESIS, HANGUL SYLLABLE SA, RIGHT PARENTHESIS    # 
+
+3207 ; 0028 110B 0029 ;        ML      #* ( ㈇ → (ᄋ) ) PARENTHESIZED HANGUL IEUNG → LEFT PARENTHESIS, HANGUL CHOSEONG IEUNG, RIGHT PARENTHESIS  # 
+
+3215 ; 0028 C544 0029 ;        ML      #* ( ㈕ → (아) ) PARENTHESIZED HANGUL IEUNG A → LEFT PARENTHESIS, HANGUL SYLLABLE A, RIGHT PARENTHESIS    # 
+
+321D ; 0028 C624 C804 0029 ;   ML      #* ( ㈝ → (오전) ) PARENTHESIZED KOREAN CHARACTER OJEON → LEFT PARENTHESIS, HANGUL SYLLABLE O, HANGUL SYLLABLE JEON, RIGHT PARENTHESIS   # 
+
+321E ; 0028 C624 D6C4 0029 ;   ML      #* ( ㈞ → (오후) ) PARENTHESIZED KOREAN CHARACTER O HU → LEFT PARENTHESIS, HANGUL SYLLABLE O, HANGUL SYLLABLE HU, RIGHT PARENTHESIS      # 
+
+3208 ; 0028 110C 0029 ;        ML      #* ( ㈈ → (ᄌ) ) PARENTHESIZED HANGUL CIEUC → LEFT PARENTHESIS, HANGUL CHOSEONG CIEUC, RIGHT PARENTHESIS  # 
+
+3216 ; 0028 C790 0029 ;        ML      #* ( ㈖ → (자) ) PARENTHESIZED HANGUL CIEUC A → LEFT PARENTHESIS, HANGUL SYLLABLE JA, RIGHT PARENTHESIS   # 
+
+321C ; 0028 C8FC 0029 ;        ML      #* ( ㈜ → (주) ) PARENTHESIZED HANGUL CIEUC U → LEFT PARENTHESIS, HANGUL SYLLABLE JU, RIGHT PARENTHESIS   # 
+
+3209 ; 0028 110E 0029 ;        ML      #* ( ㈉ → (ᄎ) ) PARENTHESIZED HANGUL CHIEUCH → LEFT PARENTHESIS, HANGUL CHOSEONG CHIEUCH, RIGHT PARENTHESIS      # 
+
+3217 ; 0028 CC28 0029 ;        ML      #* ( ㈗ → (차) ) PARENTHESIZED HANGUL CHIEUCH A → LEFT PARENTHESIS, HANGUL SYLLABLE CA, RIGHT PARENTHESIS # 
+
+320A ; 0028 110F 0029 ;        ML      #* ( ㈊ → (ᄏ) ) PARENTHESIZED HANGUL KHIEUKH → LEFT PARENTHESIS, HANGUL CHOSEONG KHIEUKH, RIGHT PARENTHESIS      # 
+
+3218 ; 0028 CE74 0029 ;        ML      #* ( ㈘ → (카) ) PARENTHESIZED HANGUL KHIEUKH A → LEFT PARENTHESIS, HANGUL SYLLABLE KA, RIGHT PARENTHESIS # 
+
+320B ; 0028 1110 0029 ;        ML      #* ( ㈋ → (ᄐ) ) PARENTHESIZED HANGUL THIEUTH → LEFT PARENTHESIS, HANGUL CHOSEONG THIEUTH, RIGHT PARENTHESIS      # 
+
+3219 ; 0028 D0C0 0029 ;        ML      #* ( ㈙ → (타) ) PARENTHESIZED HANGUL THIEUTH A → LEFT PARENTHESIS, HANGUL SYLLABLE TA, RIGHT PARENTHESIS # 
+
+320C ; 0028 1111 0029 ;        ML      #* ( ㈌ → (ᄑ) ) PARENTHESIZED HANGUL PHIEUPH → LEFT PARENTHESIS, HANGUL CHOSEONG PHIEUPH, RIGHT PARENTHESIS      # 
+
+321A ; 0028 D30C 0029 ;        ML      #* ( ㈚ → (파) ) PARENTHESIZED HANGUL PHIEUPH A → LEFT PARENTHESIS, HANGUL SYLLABLE PA, RIGHT PARENTHESIS # 
+
+320D ; 0028 1112 0029 ;        ML      #* ( ㈍ → (ᄒ) ) PARENTHESIZED HANGUL HIEUH → LEFT PARENTHESIS, HANGUL CHOSEONG HIEUH, RIGHT PARENTHESIS  # 
+
+321B ; 0028 D558 0029 ;        ML      #* ( ㈛ → (하) ) PARENTHESIZED HANGUL HIEUH A → LEFT PARENTHESIS, HANGUL SYLLABLE HA, RIGHT PARENTHESIS   # 
+
+3226 ; 0028 4E03 0029 ;        ML      #* ( ㈦ → (七) ) PARENTHESIZED IDEOGRAPH SEVEN → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4E03, RIGHT PARENTHESIS  # 
+
+3222 ; 0028 4E09 0029 ;        ML      #* ( ㈢ → (三) ) PARENTHESIZED IDEOGRAPH THREE → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4E09, RIGHT PARENTHESIS  # 
+1F241 ;        0028 4E09 0029 ;        ML      #* ( 🉁 → (三) ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E09 → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4E09, RIGHT PARENTHESIS   # →〔三〕→
+
+3228 ; 0028 4E5D 0029 ;        ML      #* ( ㈨ → (九) ) PARENTHESIZED IDEOGRAPH NINE → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4E5D, RIGHT PARENTHESIS   # 
+
+3221 ; 0028 4E8C 0029 ;        ML      #* ( ㈡ → (二) ) PARENTHESIZED IDEOGRAPH TWO → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4E8C, RIGHT PARENTHESIS    # 
+1F242 ;        0028 4E8C 0029 ;        ML      #* ( 🉂 → (二) ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E8C → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4E8C, RIGHT PARENTHESIS   # →〔二〕→
+
+3224 ; 0028 4E94 0029 ;        ML      #* ( ㈤ → (五) ) PARENTHESIZED IDEOGRAPH FIVE → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4E94, RIGHT PARENTHESIS   # 
+
+3239 ; 0028 4EE3 0029 ;        ML      #* ( ㈹ → (代) ) PARENTHESIZED IDEOGRAPH REPRESENT → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4EE3, RIGHT PARENTHESIS      # 
+
+323D ; 0028 4F01 0029 ;        ML      #* ( ㈽ → (企) ) PARENTHESIZED IDEOGRAPH ENTERPRISE → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4F01, RIGHT PARENTHESIS     # 
+
+3241 ; 0028 4F11 0029 ;        ML      #* ( ㉁ → (休) ) PARENTHESIZED IDEOGRAPH REST → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4F11, RIGHT PARENTHESIS   # 
+
+3227 ; 0028 516B 0029 ;        ML      #* ( ㈧ → (八) ) PARENTHESIZED IDEOGRAPH EIGHT → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-516B, RIGHT PARENTHESIS  # 
+
+3225 ; 0028 516D 0029 ;        ML      #* ( ㈥ → (六) ) PARENTHESIZED IDEOGRAPH SIX → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-516D, RIGHT PARENTHESIS    # 
+
+3238 ; 0028 52B4 0029 ;        ML      #* ( ㈸ → (労) ) PARENTHESIZED IDEOGRAPH LABOR → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-52B4, RIGHT PARENTHESIS  # 
+
+1F247 ;        0028 52DD 0029 ;        ML      #* ( 🉇 → (勝) ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-52DD → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-52DD, RIGHT PARENTHESIS   # →〔勝〕→
+
+3229 ; 0028 5341 0029 ;        ML      #* ( ㈩ → (十) ) PARENTHESIZED IDEOGRAPH TEN → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-5341, RIGHT PARENTHESIS    # 
+
+323F ; 0028 5354 0029 ;        ML      #* ( ㈿ → (協) ) PARENTHESIZED IDEOGRAPH ALLIANCE → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-5354, RIGHT PARENTHESIS       # 
+
+3234 ; 0028 540D 0029 ;        ML      #* ( ㈴ → (名) ) PARENTHESIZED IDEOGRAPH NAME → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-540D, RIGHT PARENTHESIS   # 
+
+323A ; 0028 547C 0029 ;        ML      #* ( ㈺ → (呼) ) PARENTHESIZED IDEOGRAPH CALL → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-547C, RIGHT PARENTHESIS   # 
+
+3223 ; 0028 56DB 0029 ;        ML      #* ( ㈣ → (四) ) PARENTHESIZED IDEOGRAPH FOUR → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-56DB, RIGHT PARENTHESIS   # 
+
+322F ; 0028 571F 0029 ;        ML      #* ( ㈯ → (土) ) PARENTHESIZED IDEOGRAPH EARTH → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-571F, RIGHT PARENTHESIS  # 
+
+323B ; 0028 5B66 0029 ;        ML      #* ( ㈻ → (学) ) PARENTHESIZED IDEOGRAPH STUDY → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-5B66, RIGHT PARENTHESIS  # 
+
+1F243 ;        0028 5B89 0029 ;        ML      #* ( 🉃 → (安) ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-5B89 → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-5B89, RIGHT PARENTHESIS   # →〔安〕→
+
+1F245 ;        0028 6253 0029 ;        ML      #* ( 🉅 → (打) ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6253 → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-6253, RIGHT PARENTHESIS   # →〔打〕→
+
+1F248 ;        0028 6557 0029 ;        ML      #* ( 🉈 → (敗) ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557 → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-6557, RIGHT PARENTHESIS   # →〔敗〕→
+
+3230 ; 0028 65E5 0029 ;        ML      #* ( ㈰ → (日) ) PARENTHESIZED IDEOGRAPH SUN → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-65E5, RIGHT PARENTHESIS    # 
+
+322A ; 0028 6708 0029 ;        ML      #* ( ㈪ → (月) ) PARENTHESIZED IDEOGRAPH MOON → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-6708, RIGHT PARENTHESIS   # 
+
+3232 ; 0028 6709 0029 ;        ML      #* ( ㈲ → (有) ) PARENTHESIZED IDEOGRAPH HAVE → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-6709, RIGHT PARENTHESIS   # 
+
+322D ; 0028 6728 0029 ;        ML      #* ( ㈭ → (木) ) PARENTHESIZED IDEOGRAPH WOOD → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-6728, RIGHT PARENTHESIS   # 
+
+1F240 ;        0028 672C 0029 ;        ML      #* ( 🉀 → (本) ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-672C, RIGHT PARENTHESIS   # →〔本〕→
+
+3231 ; 0028 682A 0029 ;        ML      #* ( ㈱ → (株) ) PARENTHESIZED IDEOGRAPH STOCK → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-682A, RIGHT PARENTHESIS  # 
+
+322C ; 0028 6C34 0029 ;        ML      #* ( ㈬ → (水) ) PARENTHESIZED IDEOGRAPH WATER → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-6C34, RIGHT PARENTHESIS  # 
+
+322B ; 0028 706B 0029 ;        ML      #* ( ㈫ → (火) ) PARENTHESIZED IDEOGRAPH FIRE → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-706B, RIGHT PARENTHESIS   # 
+
+1F244 ;        0028 70B9 0029 ;        ML      #* ( 🉄 → (点) ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-70B9 → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-70B9, RIGHT PARENTHESIS   # →〔点〕→
+
+3235 ; 0028 7279 0029 ;        ML      #* ( ㈵ → (特) ) PARENTHESIZED IDEOGRAPH SPECIAL → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-7279, RIGHT PARENTHESIS        # 
+
+1F246 ;        0028 76D7 0029 ;        ML      #* ( 🉆 → (盗) ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-76D7 → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-76D7, RIGHT PARENTHESIS   # →〔盗〕→
+
+323C ; 0028 76E3 0029 ;        ML      #* ( ㈼ → (監) ) PARENTHESIZED IDEOGRAPH SUPERVISE → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-76E3, RIGHT PARENTHESIS      # 
+
+3233 ; 0028 793E 0029 ;        ML      #* ( ㈳ → (社) ) PARENTHESIZED IDEOGRAPH SOCIETY → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-793E, RIGHT PARENTHESIS        # 
+
+3237 ; 0028 795D 0029 ;        ML      #* ( ㈷ → (祝) ) PARENTHESIZED IDEOGRAPH CONGRATULATION → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-795D, RIGHT PARENTHESIS # 
+
+3240 ; 0028 796D 0029 ;        ML      #* ( ㉀ → (祭) ) PARENTHESIZED IDEOGRAPH FESTIVAL → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-796D, RIGHT PARENTHESIS       # 
+
+3242 ; 0028 81EA 0029 ;        ML      #* ( ㉂ → (自) ) PARENTHESIZED IDEOGRAPH SELF → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-81EA, RIGHT PARENTHESIS   # 
+
+3243 ; 0028 81F3 0029 ;        ML      #* ( ㉃ → (至) ) PARENTHESIZED IDEOGRAPH REACH → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-81F3, RIGHT PARENTHESIS  # 
+
+3236 ; 0028 8CA1 0029 ;        ML      #* ( ㈶ → (財) ) PARENTHESIZED IDEOGRAPH FINANCIAL → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-8CA1, RIGHT PARENTHESIS      # 
+
+323E ; 0028 8CC7 0029 ;        ML      #* ( ㈾ → (資) ) PARENTHESIZED IDEOGRAPH RESOURCE → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-8CC7, RIGHT PARENTHESIS       # 
+
+322E ; 0028 91D1 0029 ;        ML      #* ( ㈮ → (金) ) PARENTHESIZED IDEOGRAPH METAL → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-91D1, RIGHT PARENTHESIS  # 
+
+FF3D ; 0029 ;  ML      #* ( ] → ) ) FULLWIDTH RIGHT SQUARE BRACKET → RIGHT PARENTHESIS   # →〕→
+3015 ; 0029 ;  ML      #* ( 〕 → ) ) RIGHT TORTOISE SHELL BRACKET → RIGHT PARENTHESIS     # 
+FD3F ; 0029 ;  ML      #* ( ﴿ → ) ) ORNATE RIGHT PARENTHESIS → RIGHT PARENTHESIS # 
+2769 ; 0029 ;  ML      #* ( ❩ → ) ) MEDIUM RIGHT PARENTHESIS ORNAMENT → RIGHT PARENTHESIS        # 
+2773 ; 0029 ;  ML      #* ( ❳ → ) ) LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT → RIGHT PARENTHESIS      # →〕→
+
+2774 ; 007B ;  ML      #* ( ❴ → { ) MEDIUM LEFT CURLY BRACKET ORNAMENT → LEFT CURLY BRACKET      # 
+
+2775 ; 007D ;  ML      #* ( ❵ → } ) MEDIUM RIGHT CURLY BRACKET ORNAMENT → RIGHT CURLY BRACKET    # 
+
+FF3E ; FE3F ;  ML      #* ( ^ → ︿ ) FULLWIDTH CIRCUMFLEX ACCENT → PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET    # 
+
+204E ; 002A ;  ML      #* ( ⁎ → * ) LOW ASTERISK → ASTERISK      # 
+066D ; 002A ;  ML      #* ( ‎٭‎ → * ) ARABIC FIVE POINTED STAR → ASTERISK     # 
+2217 ; 002A ;  ML      #* ( ∗ → * ) ASTERISK OPERATOR → ASTERISK # 
+
+1735 ; 002F ;  ML      #* ( ᜵ → / ) PHILIPPINE SINGLE PUNCTUATION → SOLIDUS      # 
+2044 ; 002F ;  ML      #* ( ⁄ → / ) FRACTION SLASH → SOLIDUS     # 
+2041 ; 002F ;  ML      #* ( ⁁ → / ) CARET INSERTION POINT → SOLIDUS      # 
+2215 ; 002F ;  ML      #* ( ∕ → / ) DIVISION SLASH → SOLIDUS     # 
+2571 ; 002F ;  ML      #* ( ╱ → / ) BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT → SOLIDUS      # 
+29F8 ; 002F ;  ML      #* ( ⧸ → / ) BIG SOLIDUS → SOLIDUS        # 
+31D3 ; 002F ;  ML      #* ( ㇓ → / ) CJK STROKE SP → SOLIDUS      # →⼃→
+3033 ; 002F ;  ML      # ( 〳 → / ) VERTICAL KANA REPEAT MARK UPPER HALF → SOLIDUS        # 
+4E3F ; 002F ;  ML      # ( 丿 → / ) CJK UNIFIED IDEOGRAPH-4E3F → SOLIDUS  # →⼃→
+2F03 ; 002F ;  ML      #* ( ⼃ → / ) KANGXI RADICAL SLASH → SOLIDUS       # 
+
+29F6 ; 002F 0304 ;     ML      #* ( ⧶ → /̄ ) SOLIDUS WITH OVERBAR → SOLIDUS, COMBINING MACRON   # 
+
+2AFD ; 002F 002F ;     ML      #* ( ⫽ → // ) DOUBLE SOLIDUS OPERATOR → SOLIDUS, SOLIDUS  # 
+
+2AFB ; 002F 002F 002F ;        ML      #* ( ⫻ → /// ) TRIPLE SOLIDUS BINARY RELATION → SOLIDUS, SOLIDUS, SOLIDUS # 
+
+FF3C ; 005C ;  ML      #* ( \ → \ ) FULLWIDTH REVERSE SOLIDUS → REVERSE SOLIDUS  # →∖→
+FE68 ; 005C ;  ML      #* ( ﹨ → \ ) SMALL REVERSE SOLIDUS → REVERSE SOLIDUS      # →∖→
+2216 ; 005C ;  ML      #* ( ∖ → \ ) SET MINUS → REVERSE SOLIDUS  # 
+29F5 ; 005C ;  ML      #* ( ⧵ → \ ) REVERSE SOLIDUS OPERATOR → REVERSE SOLIDUS   # 
+29F9 ; 005C ;  ML      #* ( ⧹ → \ ) BIG REVERSE SOLIDUS → REVERSE SOLIDUS        # 
+31D4 ; 005C ;  ML      #* ( ㇔ → \ ) CJK STROKE D → REVERSE SOLIDUS       # →⼂→
+4E36 ; 005C ;  ML      # ( 丶 → \ ) CJK UNIFIED IDEOGRAPH-4E36 → REVERSE SOLIDUS  # →⼂→
+2F02 ; 005C ;  ML      #* ( ⼂ → \ ) KANGXI RADICAL DOT → REVERSE SOLIDUS # 
+
+2CF9 ; 005C 005C ;     ML      #* ( ⳹ → \\ ) COPTIC OLD NUBIAN FULL STOP → REVERSE SOLIDUS, REVERSE SOLIDUS      # 
+244A ; 005C 005C ;     ML      #* ( ⑊ → \\ ) OCR DOUBLE BACKSLASH → REVERSE SOLIDUS, REVERSE SOLIDUS     # 
+
+A778 ; 0026 ;  ML      # ( ꝸ → & ) LATIN SMALL LETTER UM → AMPERSAND     # 
+
+110BB ;        0970 ;  ML      #* ( 𑂻 → ॰ ) KAITHI ABBREVIATION SIGN → DEVANAGARI ABBREVIATION SIGN   # 
+26AC ; 0970 ;  ML      #* ( ⚬ → ॰ ) MEDIUM SMALL WHITE CIRCLE → DEVANAGARI ABBREVIATION SIGN   # 
+
+17D5 ; 0E5A ;  ML      #* ( ៕ → ๚ ) KHMER SIGN BARIYOOSAN → THAI CHARACTER ANGKHANKHU  # 
+
+17DA ; 0E5B ;  ML      #* ( ៚ → ๛ ) KHMER SIGN KOOMUUT → THAI CHARACTER KHOMUT # 
+
+0F0C ; 0F0B ;  ML      #* ( ༌ → ་ ) TIBETAN MARK DELIMITER TSHEG BSTAR → TIBETAN MARK INTERSYLLABIC TSHEG      # 
+
+02D8 ; 02C7 ;  ML      #* ( ˘ → ˇ ) BREVE → CARON        # 
+A67E ; 02C7 ;  ML      #* ( ꙾ → ˇ ) CYRILLIC KAVYKA → CARON     # →˘→
+
+00AF ; 02C9 ;  ML      #* ( ¯ → ˉ ) MACRON → MODIFIER LETTER MACRON      # 
+FFE3 ; 02C9 ;  ML      #* (  ̄ → ˉ ) FULLWIDTH MACRON → MODIFIER LETTER MACRON   # →‾→
+203E ; 02C9 ;  ML      #* ( ‾ → ˉ ) OVERLINE → MODIFIER LETTER MACRON   # 
+FE49 ; 02C9 ;  ML      #* ( ﹉ → ˉ ) DASHED OVERLINE → MODIFIER LETTER MACRON    # →‾→
+FE4A ; 02C9 ;  ML      #* ( ﹊ → ˉ ) CENTRELINE OVERLINE → MODIFIER LETTER MACRON        # →‾→
+FE4B ; 02C9 ;  ML      #* ( ﹋ → ˉ ) WAVY OVERLINE → MODIFIER LETTER MACRON      # →‾→
+FE4C ; 02C9 ;  ML      #* ( ﹌ → ˉ ) DOUBLE WAVY OVERLINE → MODIFIER LETTER MACRON       # →‾→
+2594 ; 02C9 ;  ML      #* ( ▔ → ˉ ) UPPER ONE EIGHTH BLOCK → MODIFIER LETTER MACRON     # →¯→
+
+044A ; 02C9 0062 ;     ML      # ( ъ → ˉb ) CYRILLIC SMALL LETTER HARD SIGN → MODIFIER LETTER MACRON, LATIN SMALL LETTER B       # →¯b→
+
+0375 ; 02CF ;  ML      #* ( ͵ → ˏ ) GREEK LOWER NUMERAL SIGN → MODIFIER LETTER LOW ACUTE ACCENT  # 
+
+02FB ; 02EA ;  ML      #* ( ˻ → ˪ ) MODIFIER LETTER BEGIN LOW TONE → MODIFIER LETTER YIN DEPARTING TONE MARK     # 
+A716 ; 02EA ;  ML      #* ( ꜖ → ˪ ) MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR → MODIFIER LETTER YIN DEPARTING TONE MARK      # 
+
+A714 ; 02EB ;  ML      #* ( ꜔ → ˫ ) MODIFIER LETTER MID LEFT-STEM TONE BAR → MODIFIER LETTER YANG DEPARTING TONE MARK   # 
+
+2E30 ; 02F3 ;  ML      #* ( ⸰ → ˳ ) RING POINT → MODIFIER LETTER LOW RING       # 
+3002 ; 02F3 ;  ML      #* ( 。 → ˳ ) IDEOGRAPHIC FULL STOP → MODIFIER LETTER LOW RING    # 
+
+02DA ; 00B0 ;  ML      #* ( ˚ → ° ) RING ABOVE → DEGREE SIGN     # 
+2218 ; 00B0 ;  ML      #* ( ∘ → ° ) RING OPERATOR → DEGREE SIGN # 
+25CB ; 00B0 ;  ML      #* ( ○ → ° ) WHITE CIRCLE → DEGREE SIGN  # →◦→→∘→
+25E6 ; 00B0 ;  ML      #* ( ◦ → ° ) WHITE BULLET → DEGREE SIGN  # →∘→
+
+0BF5 ; 0BF3 ;  ML      #* ( ௵ → ௳ ) TAMIL YEAR SIGN → TAMIL DAY SIGN   # 
+
+17D9 ; 0E4F ;  ML      #* ( ៙ → ๏ ) KHMER SIGN PHNAEK MUAN → THAI CHARACTER FONGMAN    # 
+
+21B5 ; 21B2 ;  ML      #* ( ↵ → ↲ ) DOWNWARDS ARROW WITH CORNER LEFTWARDS → DOWNWARDS ARROW WITH TIP LEFTWARDS # 
+
+2A21 ; 21BE ;  ML      #* ( ⨡ → ↾ ) Z NOTATION SCHEMA PROJECTION → UPWARDS HARPOON WITH BARB RIGHTWARDS        # 
+
+1D6DB ;        2202 ;  ML      #* ( 𝛛 → ∂ ) MATHEMATICAL BOLD PARTIAL DIFFERENTIAL → PARTIAL DIFFERENTIAL     # 
+1D715 ;        2202 ;  ML      #* ( 𝜕 → ∂ ) MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL → PARTIAL DIFFERENTIAL   # 
+1D74F ;        2202 ;  ML      #* ( 𝝏 → ∂ ) MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL → PARTIAL DIFFERENTIAL      # 
+1D789 ;        2202 ;  ML      #* ( 𝞉 → ∂ ) MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL → PARTIAL DIFFERENTIAL  # 
+1D7C3 ;        2202 ;  ML      #* ( 𝟃 → ∂ ) MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL → PARTIAL DIFFERENTIAL   # 
+
+00F0 ; 2202 0335 ;     ML      # ( ð → ∂̵ ) LATIN SMALL LETTER ETH → PARTIAL DIFFERENTIAL, COMBINING SHORT STROKE OVERLAY      # 
+
+2300 ; 2205 ;  ML      #* ( ⌀ → ∅ ) DIAMETER SIGN → EMPTY SET  # 
+
+1D6C1 ;        2207 ;  ML      #* ( 𝛁 → ∇ ) MATHEMATICAL BOLD NABLA → NABLA   # 
+1D6FB ;        2207 ;  ML      #* ( 𝛻 → ∇ ) MATHEMATICAL ITALIC NABLA → NABLA # 
+1D735 ;        2207 ;  ML      #* ( 𝜵 → ∇ ) MATHEMATICAL BOLD ITALIC NABLA → NABLA    # 
+1D76F ;        2207 ;  ML      #* ( 𝝯 → ∇ ) MATHEMATICAL SANS-SERIF BOLD NABLA → NABLA        # 
+1D7A9 ;        2207 ;  ML      #* ( 𝞩 → ∇ ) MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA → NABLA # 
+
+2588 ; 220E ;  ML      #* ( █ → ∎ ) FULL BLOCK → END OF PROOF  # →■→
+25A0 ; 220E ;  ML      #* ( ■ → ∎ ) BLACK SQUARE → END OF PROOF        # 
+
+2A3F ; 2210 ;  ML      #* ( ⨿ → ∐ ) AMALGAMATION OR COPRODUCT → N-ARY COPRODUCT        # 
+
+FB29 ; 002B ;  ML      #* ( ﬩ → + ) HEBREW LETTER ALTERNATIVE PLUS SIGN → PLUS SIGN      # 
+
+2039 ; 003C ;  ML      #* ( ‹ → < ) SINGLE LEFT-POINTING ANGLE QUOTATION MARK → LESS-THAN SIGN   # 
+02C2 ; 003C ;  ML      #* ( ˂ → < ) MODIFIER LETTER LEFT ARROWHEAD → LESS-THAN SIGN       # 
+276E ; 003C ;  ML      #* ( ❮ → < ) HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT → LESS-THAN SIGN   # →‹→
+
+A4FF ; 003D ;  ML      #* ( ꓿ → = ) LISU PUNCTUATION FULL STOP → EQUALS SIGN     # 
+
+2A75 ; 003D 003D ;     ML      #* ( ⩵ → == ) TWO CONSECUTIVE EQUALS SIGNS → EQUALS SIGN, EQUALS SIGN     # 
+
+2A76 ; 003D 003D 003D ;        ML      #* ( ⩶ → === ) THREE CONSECUTIVE EQUALS SIGNS → EQUALS SIGN, EQUALS SIGN, EQUALS SIGN     # 
+
+203A ; 003E ;  ML      #* ( › → > ) SINGLE RIGHT-POINTING ANGLE QUOTATION MARK → GREATER-THAN SIGN       # 
+02C3 ; 003E ;  ML      #* ( ˃ → > ) MODIFIER LETTER RIGHT ARROWHEAD → GREATER-THAN SIGN   # 
+276F ; 003E ;  ML      #* ( ❯ → > ) HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT → GREATER-THAN SIGN       # →›→
+
+02DC ; 007E ;  ML      #* ( ˜ → ~ ) SMALL TILDE → TILDE   # 
+1FC0 ; 007E ;  ML      #* ( ῀ → ~ ) GREEK PERISPOMENI → TILDE    # →˜→
+2053 ; 007E ;  ML      #* ( ⁓ → ~ ) SWUNG DASH → TILDE   # 
+223C ; 007E ;  ML      #* ( ∼ → ~ ) TILDE OPERATOR → TILDE       # 
+
+22C0 ; 2227 ;  ML      #* ( ⋀ → ∧ ) N-ARY LOGICAL AND → LOGICAL AND    # 
+
+22C3 ; 222A ;  ML      #* ( ⋃ → ∪ ) N-ARY UNION → UNION        # 
+
+222F ; 222E 222E ;     ML      #* ( ∯ → ∮∮ ) SURFACE INTEGRAL → CONTOUR INTEGRAL, CONTOUR INTEGRAL   # 
+
+2230 ; 222E 222E 222E ;        ML      #* ( ∰ → ∮∮∮ ) VOLUME INTEGRAL → CONTOUR INTEGRAL, CONTOUR INTEGRAL, CONTOUR INTEGRAL       # 
+
+2263 ; 2261 ;  ML      #* ( ≣ → ≡ ) STRICTLY EQUIVALENT TO → IDENTICAL TO      # 
+
+2A20 ; 226B ;  ML      #* ( ⨠ → ≫ ) Z NOTATION SCHEMA PIPING → MUCH GREATER-THAN       # 
+
+2A03 ; 228D ;  ML      #* ( ⨃ → ⊍ ) N-ARY UNION OPERATOR WITH DOT → MULTISET MULTIPLICATION    # 
+
+2A04 ; 228E ;  ML      #* ( ⨄ → ⊎ ) N-ARY UNION OPERATOR WITH PLUS → MULTISET UNION    # 
+
+2A05 ; 2293 ;  ML      #* ( ⨅ → ⊓ ) N-ARY SQUARE INTERSECTION OPERATOR → SQUARE CAP    # 
+
+2A06 ; 2294 ;  ML      #* ( ⨆ → ⊔ ) N-ARY SQUARE UNION OPERATOR → SQUARE CUP   # 
+
+2641 ; 2295 ;  ML      #* ( ♁ → ⊕ ) EARTH → CIRCLED PLUS       # 
+2A01 ; 2295 ;  ML      #* ( ⨁ → ⊕ ) N-ARY CIRCLED PLUS OPERATOR → CIRCLED PLUS # 
+
+2A02 ; 2297 ;  ML      #* ( ⨂ → ⊗ ) N-ARY CIRCLED TIMES OPERATOR → CIRCLED TIMES       # 
+
+2609 ; 2299 ;  ML      #* ( ☉ → ⊙ ) SUN → CIRCLED DOT OPERATOR # 
+2A00 ; 2299 ;  ML      #* ( ⨀ → ⊙ ) N-ARY CIRCLED DOT OPERATOR → CIRCLED DOT OPERATOR  # 
+
+25B7 ; 22B2 ;  ML      #* ( ▷ → ⊲ ) WHITE RIGHT-POINTING TRIANGLE → NORMAL SUBGROUP OF # 
+
+25C7 ; 22C4 ;  ML      #* ( ◇ → ⋄ ) WHITE DIAMOND → DIAMOND OPERATOR   # 
+25CA ; 22C4 ;  ML      #* ( ◊ → ⋄ ) LOZENGE → DIAMOND OPERATOR # 
+2662 ; 22C4 ;  ML      #* ( ♢ → ⋄ ) WHITE DIAMOND SUIT → DIAMOND OPERATOR      # →◊→
+
+2A1D ; 22C8 ;  ML      #* ( ⨝ → ⋈ ) JOIN → BOWTIE      # 
+
+25E0 ; 2312 ;  ML      #* ( ◠ → ⌒ ) UPPER HALF CIRCLE → ARC    # 
+
+2A3D ; 2319 ;  ML      #* ( ⨽ → ⌙ ) RIGHTHAND INTERIOR PRODUCT → TURNED NOT SIGN       # 
+
+2325 ; 2324 ;  ML      #* ( ⌥ → ⌤ ) OPTION KEY → UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS      # 
+
+2638 ; 2388 ;  ML      #* ( ☸ → ⎈ ) WHEEL OF DHARMA → HELM SYMBOL      # 
+
+FE35 ; 23DC ;  ML      #* ( ︵ → ⏜ ) PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS → TOP PARENTHESIS  # 
+
+FE36 ; 23DD ;  ML      #* ( ︶ → ⏝ ) PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS → BOTTOM PARENTHESIS      # 
+
+FE37 ; 23DE ;  ML      #* ( ︷ → ⏞ ) PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET → TOP CURLY BRACKET      # 
+
+FE38 ; 23DF ;  ML      #* ( ︸ → ⏟ ) PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET → BOTTOM CURLY BRACKET  # 
+
+FE39 ; 23E0 ;  ML      #* ( ︹ → ⏠ ) PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET → TOP TORTOISE SHELL BRACKET    # 
+
+FE3A ; 23E1 ;  ML      #* ( ︺ → ⏡ ) PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET → BOTTOM TORTOISE SHELL BRACKET        # 
+
+25B1 ; 23E5 ;  ML      #* ( ▱ → ⏥ ) WHITE PARALLELOGRAM → FLATNESS     # 
+
+FE31 ; 2502 ;  ML      #* ( ︱ → │ ) PRESENTATION FORM FOR VERTICAL EM DASH → BOX DRAWINGS LIGHT VERTICAL       # →|→
+FF5C ; 2502 ;  ML      #* ( | → │ ) FULLWIDTH VERTICAL LINE → BOX DRAWINGS LIGHT VERTICAL      # 
+2503 ; 2502 ;  ML      #* ( ┃ → │ ) BOX DRAWINGS HEAVY VERTICAL → BOX DRAWINGS LIGHT VERTICAL  # 
+
+250F ; 250C ;  ML      #* ( ┏ → ┌ ) BOX DRAWINGS HEAVY DOWN AND RIGHT → BOX DRAWINGS LIGHT DOWN AND RIGHT      # 
+
+2523 ; 251C ;  ML      #* ( ┣ → ├ ) BOX DRAWINGS HEAVY VERTICAL AND RIGHT → BOX DRAWINGS LIGHT VERTICAL AND RIGHT      # 
+
+2590 ; 258C ;  ML      #* ( ▐ → ▌ ) RIGHT HALF BLOCK → LEFT HALF BLOCK # 
+
+2597 ; 2596 ;  ML      #* ( ▗ → ▖ ) QUADRANT LOWER RIGHT → QUADRANT LOWER LEFT # 
+
+259D ; 2598 ;  ML      #* ( ▝ → ▘ ) QUADRANT UPPER RIGHT → QUADRANT UPPER LEFT # 
+
+2610 ; 25A1 ;  ML      #* ( ☐ → □ ) BALLOT BOX → WHITE SQUARE  # 
+
+FFED ; 25AA ;  ML      #* ( ■ → ▪ ) HALFWIDTH BLACK SQUARE → BLACK SMALL SQUARE        # 
+
+25B8 ; 25B6 ;  ML      #* ( ▸ → ▶ ) BLACK RIGHT-POINTING SMALL TRIANGLE → BLACK RIGHT-POINTING TRIANGLE        # →►→
+25BA ; 25B6 ;  ML      #* ( ► → ▶ ) BLACK RIGHT-POINTING POINTER → BLACK RIGHT-POINTING TRIANGLE       # 
+
+29BE ; 25CE ;  ML      #* ( ⦾ → ◎ ) CIRCLED WHITE BULLET → BULLSEYE    # 
+
+2CE9 ; 2627 ;  ML      #* ( ⳩ → ☧ ) COPTIC SYMBOL KHI RO → CHI RHO     # 
+
+2329 ; 276C ;  ML      #* ( 〈 → ❬ ) LEFT-POINTING ANGLE BRACKET → MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT  # →〈→
+3008 ; 276C ;  ML      #* ( 〈 → ❬ ) LEFT ANGLE BRACKET → MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT   # 
+27E8 ; 276C ;  ML      #* ( ⟨ → ❬ ) MATHEMATICAL LEFT ANGLE BRACKET → MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT      # →〈→
+
+232A ; 276D ;  ML      #* ( 〉 → ❭ ) RIGHT-POINTING ANGLE BRACKET → MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT        # →〉→
+3009 ; 276D ;  ML      #* ( 〉 → ❭ ) RIGHT ANGLE BRACKET → MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT # 
+27E9 ; 276D ;  ML      #* ( ⟩ → ❭ ) MATHEMATICAL RIGHT ANGLE BRACKET → MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT    # →〉→
+
+301B ; 27E7 ;  ML      #* ( 〛 → ⟧ ) RIGHT WHITE SQUARE BRACKET → MATHEMATICAL RIGHT WHITE SQUARE BRACKET       # 
+
+29D9 ; 299A ;  ML      #* ( ⧙ → ⦚ ) RIGHT WIGGLY FENCE → VERTICAL ZIGZAG LINE  # 
+
+2A3E ; 2A1F ;  ML      #* ( ⨾ → ⨟ ) Z NOTATION RELATIONAL COMPOSITION → Z NOTATION SCHEMA COMPOSITION  # 
+
+3036 ; 3012 ;  ML      #* ( 〶 → 〒 ) CIRCLED POSTAL MARK → POSTAL MARK  # 
+
+02D9 ; 0971 ;  ML      #* ( ˙ → ॱ ) DOT ABOVE → DEVANAGARI SIGN HIGH SPACING DOT        # 
+
+FF0D ; 30FC ;  ML      #* ( - → ー ) FULLWIDTH HYPHEN-MINUS → KATAKANA-HIRAGANA PROLONGED SOUND MARK    # 
+2014 ; 30FC ;  ML      #* ( — → ー ) EM DASH → KATAKANA-HIRAGANA PROLONGED SOUND MARK   # →一→
+2015 ; 30FC ;  ML      #* ( ― → ー ) HORIZONTAL BAR → KATAKANA-HIRAGANA PROLONGED SOUND MARK    # →—→→一→
+2500 ; 30FC ;  ML      #* ( ─ → ー ) BOX DRAWINGS LIGHT HORIZONTAL → KATAKANA-HIRAGANA PROLONGED SOUND MARK     # →―→→—→→一→
+2501 ; 30FC ;  ML      #* ( ━ → ー ) BOX DRAWINGS HEAVY HORIZONTAL → KATAKANA-HIRAGANA PROLONGED SOUND MARK     # →—→→一→
+31D0 ; 30FC ;  ML      #* ( ㇐ → ー ) CJK STROKE H → KATAKANA-HIRAGANA PROLONGED SOUND MARK      # →一→
+1173 ; 30FC ;  ML      # ( ᅳ → ー ) HANGUL JUNGSEONG EU → KATAKANA-HIRAGANA PROLONGED SOUND MARK        # →ㅡ→→—→→一→
+3161 ; 30FC ;  ML      # ( ㅡ → ー ) HANGUL LETTER EU → KATAKANA-HIRAGANA PROLONGED SOUND MARK   # →—→→一→
+4E00 ; 30FC ;  ML      # ( 一 → ー ) CJK UNIFIED IDEOGRAPH-4E00 → KATAKANA-HIRAGANA PROLONGED SOUND MARK # 
+2F00 ; 30FC ;  ML      #* ( ⼀ → ー ) KANGXI RADICAL ONE → KATAKANA-HIRAGANA PROLONGED SOUND MARK        # →一→
+
+1196 ; 30FC 30FC ;     ML      # ( ᆖ → ーー ) HANGUL JUNGSEONG EU-EU → KATAKANA-HIRAGANA PROLONGED SOUND MARK, KATAKANA-HIRAGANA PROLONGED SOUND MARK  # →ᅳᅳ→
+
+1174 ; 30FC 4E28 ;     ML      # ( ᅴ → ー丨 ) HANGUL JUNGSEONG YI → KATAKANA-HIRAGANA PROLONGED SOUND MARK, CJK UNIFIED IDEOGRAPH-4E28 # →ᅳᅵ→
+3162 ; 30FC 4E28 ;     ML      # ( ㅢ → ー丨 ) HANGUL LETTER YI → KATAKANA-HIRAGANA PROLONGED SOUND MARK, CJK UNIFIED IDEOGRAPH-4E28    # →ᅴ→→ᅳᅵ→
+
+20A4 ; 00A3 ;  ML      #* ( ₤ → £ ) LIRA SIGN → POUND SIGN      # 
+
+1D7CE ;        0030 ;  ML      # ( 𝟎 → 0 ) MATHEMATICAL BOLD DIGIT ZERO → DIGIT ZERO    # 
+1D7D8 ;        0030 ;  ML      # ( 𝟘 → 0 ) MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO → DIGIT ZERO   # 
+1D7E2 ;        0030 ;  ML      # ( 𝟢 → 0 ) MATHEMATICAL SANS-SERIF DIGIT ZERO → DIGIT ZERO      # 
+1D7EC ;        0030 ;  ML      # ( 𝟬 → 0 ) MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO → DIGIT ZERO # 
+1D7F6 ;        0030 ;  ML      # ( 𝟶 → 0 ) MATHEMATICAL MONOSPACE DIGIT ZERO → DIGIT ZERO       # 
+07C0 ; 0030 ;  ML      # ( ‎߀‎ → 0 ) NKO DIGIT ZERO → DIGIT ZERO      # 
+09E6 ; 0030 ;  ML      # ( ০ → 0 ) BENGALI DIGIT ZERO → DIGIT ZERO       # 
+0B66 ; 0030 ;  ML      # ( ୦ → 0 ) ORIYA DIGIT ZERO → DIGIT ZERO # 
+3007 ; 0030 ;  ML      # ( 〇 → 0 ) IDEOGRAPHIC NUMBER ZERO → DIGIT ZERO  # →O→
+1D40E ;        0030 ;  ML      # ( 𝐎 → 0 ) MATHEMATICAL BOLD CAPITAL O → DIGIT ZERO     # →O→
+1D442 ;        0030 ;  ML      # ( 𝑂 → 0 ) MATHEMATICAL ITALIC CAPITAL O → DIGIT ZERO   # →O→
+1D476 ;        0030 ;  ML      # ( 𝑶 → 0 ) MATHEMATICAL BOLD ITALIC CAPITAL O → DIGIT ZERO      # →O→
+1D4AA ;        0030 ;  ML      # ( 𝒪 → 0 ) MATHEMATICAL SCRIPT CAPITAL O → DIGIT ZERO   # →O→
+1D4DE ;        0030 ;  ML      # ( 𝓞 → 0 ) MATHEMATICAL BOLD SCRIPT CAPITAL O → DIGIT ZERO      # →O→
+1D512 ;        0030 ;  ML      # ( 𝔒 → 0 ) MATHEMATICAL FRAKTUR CAPITAL O → DIGIT ZERO  # →O→
+1D546 ;        0030 ;  ML      # ( 𝕆 → 0 ) MATHEMATICAL DOUBLE-STRUCK CAPITAL O → DIGIT ZERO    # →O→
+1D57A ;        0030 ;  ML      # ( 𝕺 → 0 ) MATHEMATICAL BOLD FRAKTUR CAPITAL O → DIGIT ZERO     # →O→
+1D5AE ;        0030 ;  ML      # ( 𝖮 → 0 ) MATHEMATICAL SANS-SERIF CAPITAL O → DIGIT ZERO       # →O→
+1D5E2 ;        0030 ;  ML      # ( 𝗢 → 0 ) MATHEMATICAL SANS-SERIF BOLD CAPITAL O → DIGIT ZERO  # →O→
+1D616 ;        0030 ;  ML      # ( 𝘖 → 0 ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL O → DIGIT ZERO        # →O→
+1D64A ;        0030 ;  ML      # ( 𝙊 → 0 ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O → DIGIT ZERO   # →O→
+1D67E ;        0030 ;  ML      # ( 𝙾 → 0 ) MATHEMATICAL MONOSPACE CAPITAL O → DIGIT ZERO        # →O→
+1D6B6 ;        0030 ;  ML      # ( 𝚶 → 0 ) MATHEMATICAL BOLD CAPITAL OMICRON → DIGIT ZERO       # →Ο→
+1D6F0 ;        0030 ;  ML      # ( 𝛰 → 0 ) MATHEMATICAL ITALIC CAPITAL OMICRON → DIGIT ZERO     # →Ο→
+1D72A ;        0030 ;  ML      # ( 𝜪 → 0 ) MATHEMATICAL BOLD ITALIC CAPITAL OMICRON → DIGIT ZERO        # →Ο→
+1D764 ;        0030 ;  ML      # ( 𝝤 → 0 ) MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON → DIGIT ZERO    # →Ο→
+1D79E ;        0030 ;  ML      # ( 𝞞 → 0 ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON → DIGIT ZERO     # →Ο→
+2D54 ; 0030 ;  ML      # ( ⵔ → 0 ) TIFINAGH LETTER YAR → DIGIT ZERO      # →Ο→
+0B20 ; 0030 ;  ML      # ( ଠ → 0 ) ORIYA LETTER TTHA → DIGIT ZERO        # →୦→
+0D20 ; 0030 ;  ML      # ( ഠ → 0 ) MALAYALAM LETTER TTHA → DIGIT ZERO    # 
+A4F3 ; 0030 ;  ML      # ( ꓳ → 0 ) LISU LETTER O → DIGIT ZERO    # →O→
+
+1B5C ; 1B50 ;  ML      #* ( ᭜ → ᭐ ) BALINESE WINDU → BALINESE DIGIT ZERO       # 
+
+A9C6 ; A9D0 ;  ML      #* ( ꧆ → ꧐ ) JAVANESE PADA WINDU → JAVANESE DIGIT ZERO  # 
+
+1F101 ;        0030 002C ;     ML      #* ( 🄁 → 0, ) DIGIT ZERO COMMA → DIGIT ZERO, COMMA       # 
+
+1F100 ;        0030 002E ;     ML      #* ( 🄀 → 0. ) DIGIT ZERO FULL STOP → DIGIT ZERO, FULL STOP       # 
+
+3358 ; 0030 70B9 ;     ML      #* ( ㍘ → 0点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO → DIGIT ZERO, CJK UNIFIED IDEOGRAPH-70B9       # 
+
+2460 ; 2780 ;  ML      #* ( ① → ➀ ) CIRCLED DIGIT ONE → DINGBAT CIRCLED SANS-SERIF DIGIT ONE   # 
+
+06F1 ; 0661 ;  ML      # ( ۱ → ‎١‎ ) EXTENDED ARABIC-INDIC DIGIT ONE → ARABIC-INDIC DIGIT ONE        # 
+
+0CE7 ; 0C67 ;  ML      # ( ೧ → ౧ ) KANNADA DIGIT ONE → TELUGU DIGIT ONE        # 
+
+1065 ; 1041 ;  ML      # ( ၥ → ၁ ) MYANMAR LETTER WESTERN PWO KAREN THA → MYANMAR DIGIT ONE    # 
+
+2469 ; 2789 ;  ML      #* ( ⑩ → ➉ ) CIRCLED NUMBER TEN → DINGBAT CIRCLED SANS-SERIF NUMBER TEN # 
+
+2491 ; 0031 0030 002E ;        ML      #* ( ⒑ → 10. ) NUMBER TEN FULL STOP → DIGIT ONE, DIGIT ZERO, FULL STOP    # 
+
+33E9 ; 0031 0030 65E5 ;        ML      #* ( ㏩ → 10日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN → DIGIT ONE, DIGIT ZERO, CJK UNIFIED IDEOGRAPH-65E5     # 
+
+32C9 ; 0031 0030 6708 ;        ML      #* ( ㋉ → 10月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER → DIGIT ONE, DIGIT ZERO, CJK UNIFIED IDEOGRAPH-6708     # 
+
+3362 ; 0031 0030 70B9 ;        ML      #* ( ㍢ → 10点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN → DIGIT ONE, DIGIT ZERO, CJK UNIFIED IDEOGRAPH-70B9    # 
+
+1D7D0 ;        0032 ;  ML      # ( 𝟐 → 2 ) MATHEMATICAL BOLD DIGIT TWO → DIGIT TWO      # 
+1D7DA ;        0032 ;  ML      # ( 𝟚 → 2 ) MATHEMATICAL DOUBLE-STRUCK DIGIT TWO → DIGIT TWO     # 
+1D7E4 ;        0032 ;  ML      # ( 𝟤 → 2 ) MATHEMATICAL SANS-SERIF DIGIT TWO → DIGIT TWO        # 
+1D7EE ;        0032 ;  ML      # ( 𝟮 → 2 ) MATHEMATICAL SANS-SERIF BOLD DIGIT TWO → DIGIT TWO   # 
+1D7F8 ;        0032 ;  ML      # ( 𝟸 → 2 ) MATHEMATICAL MONOSPACE DIGIT TWO → DIGIT TWO # 
+14BF ; 0032 ;  ML      # ( ᒿ → 2 ) CANADIAN SYLLABICS SAYISI M → DIGIT TWO       # 
+
+2461 ; 2781 ;  ML      #* ( ② → ➁ ) CIRCLED DIGIT TWO → DINGBAT CIRCLED SANS-SERIF DIGIT TWO   # 
+
+06F2 ; 0662 ;  ML      # ( ۲ → ‎٢‎ ) EXTENDED ARABIC-INDIC DIGIT TWO → ARABIC-INDIC DIGIT TWO        # 
+
+0AE8 ; 0968 ;  ML      # ( ૨ → २ ) GUJARATI DIGIT TWO → DEVANAGARI DIGIT TWO   # 
+
+0CE8 ; 0C68 ;  ML      # ( ೨ → ౨ ) KANNADA DIGIT TWO → TELUGU DIGIT TWO        # 
+
+1F103 ;        0032 002C ;     ML      #* ( 🄃 → 2, ) DIGIT TWO COMMA → DIGIT TWO, COMMA # 
+
+2489 ; 0032 002E ;     ML      #* ( ⒉ → 2. ) DIGIT TWO FULL STOP → DIGIT TWO, FULL STOP  # 
+
+249B ; 0032 0030 002E ;        ML      #* ( ⒛ → 20. ) NUMBER TWENTY FULL STOP → DIGIT TWO, DIGIT ZERO, FULL STOP # 
+
+33F3 ; 0032 0030 65E5 ;        ML      #* ( ㏳ → 20日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY → DIGIT TWO, DIGIT ZERO, CJK UNIFIED IDEOGRAPH-65E5  # 
+
+336C ; 0032 0030 70B9 ;        ML      #* ( ㍬ → 20点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY → DIGIT TWO, DIGIT ZERO, CJK UNIFIED IDEOGRAPH-70B9 # 
+
+33F5 ; 0032 0032 65E5 ;        ML      #* ( ㏵ → 22日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO → DIGIT TWO, DIGIT TWO, CJK UNIFIED IDEOGRAPH-65E5       # 
+
+336E ; 0032 0032 70B9 ;        ML      #* ( ㍮ → 22点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO → DIGIT TWO, DIGIT TWO, CJK UNIFIED IDEOGRAPH-70B9      # 
+
+33F6 ; 0032 0033 65E5 ;        ML      #* ( ㏶ → 23日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE → DIGIT TWO, DIGIT THREE, CJK UNIFIED IDEOGRAPH-65E5   # 
+
+336F ; 0032 0033 70B9 ;        ML      #* ( ㍯ → 23点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE → DIGIT TWO, DIGIT THREE, CJK UNIFIED IDEOGRAPH-70B9  # 
+
+33F7 ; 0032 0034 65E5 ;        ML      #* ( ㏷ → 24日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR → DIGIT TWO, DIGIT FOUR, CJK UNIFIED IDEOGRAPH-65E5     # 
+
+3370 ; 0032 0034 70B9 ;        ML      #* ( ㍰ → 24点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR → DIGIT TWO, DIGIT FOUR, CJK UNIFIED IDEOGRAPH-70B9    # 
+
+33F8 ; 0032 0035 65E5 ;        ML      #* ( ㏸ → 25日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE → DIGIT TWO, DIGIT FIVE, CJK UNIFIED IDEOGRAPH-65E5     # 
+
+33F9 ; 0032 0036 65E5 ;        ML      #* ( ㏹ → 26日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX → DIGIT TWO, DIGIT SIX, CJK UNIFIED IDEOGRAPH-65E5       # 
+
+33FA ; 0032 0037 65E5 ;        ML      #* ( ㏺ → 27日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN → DIGIT TWO, DIGIT SEVEN, CJK UNIFIED IDEOGRAPH-65E5   # 
+
+33FB ; 0032 0038 65E5 ;        ML      #* ( ㏻ → 28日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT → DIGIT TWO, DIGIT EIGHT, CJK UNIFIED IDEOGRAPH-65E5   # 
+
+33FC ; 0032 0039 65E5 ;        ML      #* ( ㏼ → 29日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE → DIGIT TWO, DIGIT NINE, CJK UNIFIED IDEOGRAPH-65E5     # 
+
+33F4 ; 0032 006C 65E5 ;        ML      #* ( ㏴ → 2l日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE → DIGIT TWO, LATIN SMALL LETTER L, CJK UNIFIED IDEOGRAPH-65E5    # →21日→
+
+336D ; 0032 006C 70B9 ;        ML      #* ( ㍭ → 2l点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE → DIGIT TWO, LATIN SMALL LETTER L, CJK UNIFIED IDEOGRAPH-70B9   # →21点→
+
+33E1 ; 0032 65E5 ;     ML      #* ( ㏡ → 2日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO → DIGIT TWO, CJK UNIFIED IDEOGRAPH-65E5  # 
+
+32C1 ; 0032 6708 ;     ML      #* ( ㋁ → 2月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY → DIGIT TWO, CJK UNIFIED IDEOGRAPH-6708 # 
+
+335A ; 0032 70B9 ;     ML      #* ( ㍚ → 2点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO → DIGIT TWO, CJK UNIFIED IDEOGRAPH-70B9 # 
+
+1D7D1 ;        0033 ;  ML      # ( 𝟑 → 3 ) MATHEMATICAL BOLD DIGIT THREE → DIGIT THREE  # 
+1D7DB ;        0033 ;  ML      # ( 𝟛 → 3 ) MATHEMATICAL DOUBLE-STRUCK DIGIT THREE → DIGIT THREE # 
+1D7E5 ;        0033 ;  ML      # ( 𝟥 → 3 ) MATHEMATICAL SANS-SERIF DIGIT THREE → DIGIT THREE    # 
+1D7EF ;        0033 ;  ML      # ( 𝟯 → 3 ) MATHEMATICAL SANS-SERIF BOLD DIGIT THREE → DIGIT THREE       # 
+1D7F9 ;        0033 ;  ML      # ( 𝟹 → 3 ) MATHEMATICAL MONOSPACE DIGIT THREE → DIGIT THREE     # 
+
+2462 ; 2782 ;  ML      #* ( ③ → ➂ ) CIRCLED DIGIT THREE → DINGBAT CIRCLED SANS-SERIF DIGIT THREE       # 
+
+06F3 ; 0663 ;  ML      # ( ۳ → ‎٣‎ ) EXTENDED ARABIC-INDIC DIGIT THREE → ARABIC-INDIC DIGIT THREE    # 
+
+0AE9 ; 0969 ;  ML      # ( ૩ → ३ ) GUJARATI DIGIT THREE → DEVANAGARI DIGIT THREE       # 
+
+1F104 ;        0033 002C ;     ML      #* ( 🄄 → 3, ) DIGIT THREE COMMA → DIGIT THREE, COMMA     # 
+
+248A ; 0033 002E ;     ML      #* ( ⒊ → 3. ) DIGIT THREE FULL STOP → DIGIT THREE, FULL STOP      # 
+
+33FD ; 0033 0030 65E5 ;        ML      #* ( ㏽ → 30日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY → DIGIT THREE, DIGIT ZERO, CJK UNIFIED IDEOGRAPH-65E5        # 
+
+33FE ; 0033 006C 65E5 ;        ML      #* ( ㏾ → 3l日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE → DIGIT THREE, LATIN SMALL LETTER L, CJK UNIFIED IDEOGRAPH-65E5  # →31日→
+
+33E2 ; 0033 65E5 ;     ML      #* ( ㏢ → 3日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE → DIGIT THREE, CJK UNIFIED IDEOGRAPH-65E5      # 
+
+32C2 ; 0033 6708 ;     ML      #* ( ㋂ → 3月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH → DIGIT THREE, CJK UNIFIED IDEOGRAPH-6708  # 
+
+335B ; 0033 70B9 ;     ML      #* ( ㍛ → 3点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE → DIGIT THREE, CJK UNIFIED IDEOGRAPH-70B9     # 
+
+1D7D2 ;        0034 ;  ML      # ( 𝟒 → 4 ) MATHEMATICAL BOLD DIGIT FOUR → DIGIT FOUR    # 
+1D7DC ;        0034 ;  ML      # ( 𝟜 → 4 ) MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR → DIGIT FOUR   # 
+1D7E6 ;        0034 ;  ML      # ( 𝟦 → 4 ) MATHEMATICAL SANS-SERIF DIGIT FOUR → DIGIT FOUR      # 
+1D7F0 ;        0034 ;  ML      # ( 𝟰 → 4 ) MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR → DIGIT FOUR # 
+1D7FA ;        0034 ;  ML      # ( 𝟺 → 4 ) MATHEMATICAL MONOSPACE DIGIT FOUR → DIGIT FOUR       # 
+13CE ; 0034 ;  ML      # ( Ꮞ → 4 ) CHEROKEE LETTER SE → DIGIT FOUR       # 
+
+2463 ; 2783 ;  ML      #* ( ④ → ➃ ) CIRCLED DIGIT FOUR → DINGBAT CIRCLED SANS-SERIF DIGIT FOUR # 
+
+0AEA ; 096A ;  ML      # ( ૪ → ४ ) GUJARATI DIGIT FOUR → DEVANAGARI DIGIT FOUR # 
+
+1F105 ;        0034 002C ;     ML      #* ( 🄅 → 4, ) DIGIT FOUR COMMA → DIGIT FOUR, COMMA       # 
+
+248B ; 0034 002E ;     ML      #* ( ⒋ → 4. ) DIGIT FOUR FULL STOP → DIGIT FOUR, FULL STOP        # 
+
+1530 ; 0034 00B7 ;     ML      # ( ᔰ → 4· ) CANADIAN SYLLABICS WEST-CREE YWE → DIGIT FOUR, MIDDLE DOT   # →4ᐧ→
+
+33E3 ; 0034 65E5 ;     ML      #* ( ㏣ → 4日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR → DIGIT FOUR, CJK UNIFIED IDEOGRAPH-65E5        # 
+
+32C3 ; 0034 6708 ;     ML      #* ( ㋃ → 4月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL → DIGIT FOUR, CJK UNIFIED IDEOGRAPH-6708   # 
+
+335C ; 0034 70B9 ;     ML      #* ( ㍜ → 4点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR → DIGIT FOUR, CJK UNIFIED IDEOGRAPH-70B9       # 
+
+1D7D3 ;        0035 ;  ML      # ( 𝟓 → 5 ) MATHEMATICAL BOLD DIGIT FIVE → DIGIT FIVE    # 
+1D7DD ;        0035 ;  ML      # ( 𝟝 → 5 ) MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE → DIGIT FIVE   # 
+1D7E7 ;        0035 ;  ML      # ( 𝟧 → 5 ) MATHEMATICAL SANS-SERIF DIGIT FIVE → DIGIT FIVE      # 
+1D7F1 ;        0035 ;  ML      # ( 𝟱 → 5 ) MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE → DIGIT FIVE # 
+1D7FB ;        0035 ;  ML      # ( 𝟻 → 5 ) MATHEMATICAL MONOSPACE DIGIT FIVE → DIGIT FIVE       # 
+
+2464 ; 2784 ;  ML      #* ( ⑤ → ➄ ) CIRCLED DIGIT FIVE → DINGBAT CIRCLED SANS-SERIF DIGIT FIVE # 
+
+1F106 ;        0035 002C ;     ML      #* ( 🄆 → 5, ) DIGIT FIVE COMMA → DIGIT FIVE, COMMA       # 
+
+248C ; 0035 002E ;     ML      #* ( ⒌ → 5. ) DIGIT FIVE FULL STOP → DIGIT FIVE, FULL STOP        # 
+
+33E4 ; 0035 65E5 ;     ML      #* ( ㏤ → 5日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE → DIGIT FIVE, CJK UNIFIED IDEOGRAPH-65E5        # 
+
+32C4 ; 0035 6708 ;     ML      #* ( ㋄ → 5月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY → DIGIT FIVE, CJK UNIFIED IDEOGRAPH-6708     # 
+
+335D ; 0035 70B9 ;     ML      #* ( ㍝ → 5点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE → DIGIT FIVE, CJK UNIFIED IDEOGRAPH-70B9       # 
+
+1D7D4 ;        0036 ;  ML      # ( 𝟔 → 6 ) MATHEMATICAL BOLD DIGIT SIX → DIGIT SIX      # 
+1D7DE ;        0036 ;  ML      # ( 𝟞 → 6 ) MATHEMATICAL DOUBLE-STRUCK DIGIT SIX → DIGIT SIX     # 
+1D7E8 ;        0036 ;  ML      # ( 𝟨 → 6 ) MATHEMATICAL SANS-SERIF DIGIT SIX → DIGIT SIX        # 
+1D7F2 ;        0036 ;  ML      # ( 𝟲 → 6 ) MATHEMATICAL SANS-SERIF BOLD DIGIT SIX → DIGIT SIX   # 
+1D7FC ;        0036 ;  ML      # ( 𝟼 → 6 ) MATHEMATICAL MONOSPACE DIGIT SIX → DIGIT SIX # 
+0431 ; 0036 ;  ML      # ( б → 6 ) CYRILLIC SMALL LETTER BE → DIGIT SIX   # 
+
+2465 ; 2785 ;  ML      #* ( ⑥ → ➅ ) CIRCLED DIGIT SIX → DINGBAT CIRCLED SANS-SERIF DIGIT SIX   # 
+
+1F107 ;        0036 002C ;     ML      #* ( 🄇 → 6, ) DIGIT SIX COMMA → DIGIT SIX, COMMA # 
+
+248D ; 0036 002E ;     ML      #* ( ⒍ → 6. ) DIGIT SIX FULL STOP → DIGIT SIX, FULL STOP  # 
+
+33E5 ; 0036 65E5 ;     ML      #* ( ㏥ → 6日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX → DIGIT SIX, CJK UNIFIED IDEOGRAPH-65E5  # 
+
+32C5 ; 0036 6708 ;     ML      #* ( ㋅ → 6月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE → DIGIT SIX, CJK UNIFIED IDEOGRAPH-6708     # 
+
+335E ; 0036 70B9 ;     ML      #* ( ㍞ → 6点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX → DIGIT SIX, CJK UNIFIED IDEOGRAPH-70B9 # 
+
+1D7D5 ;        0037 ;  ML      # ( 𝟕 → 7 ) MATHEMATICAL BOLD DIGIT SEVEN → DIGIT SEVEN  # 
+1D7DF ;        0037 ;  ML      # ( 𝟟 → 7 ) MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN → DIGIT SEVEN # 
+1D7E9 ;        0037 ;  ML      # ( 𝟩 → 7 ) MATHEMATICAL SANS-SERIF DIGIT SEVEN → DIGIT SEVEN    # 
+1D7F3 ;        0037 ;  ML      # ( 𝟳 → 7 ) MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN → DIGIT SEVEN       # 
+1D7FD ;        0037 ;  ML      # ( 𝟽 → 7 ) MATHEMATICAL MONOSPACE DIGIT SEVEN → DIGIT SEVEN     # 
+
+2466 ; 2786 ;  ML      #* ( ⑦ → ➆ ) CIRCLED DIGIT SEVEN → DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN       # 
+
+06F7 ; 0667 ;  ML      # ( ۷ → ‎٧‎ ) EXTENDED ARABIC-INDIC DIGIT SEVEN → ARABIC-INDIC DIGIT SEVEN    # 
+
+1F108 ;        0037 002C ;     ML      #* ( 🄈 → 7, ) DIGIT SEVEN COMMA → DIGIT SEVEN, COMMA     # 
+
+248E ; 0037 002E ;     ML      #* ( ⒎ → 7. ) DIGIT SEVEN FULL STOP → DIGIT SEVEN, FULL STOP      # 
+
+33E6 ; 0037 65E5 ;     ML      #* ( ㏦ → 7日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN → DIGIT SEVEN, CJK UNIFIED IDEOGRAPH-65E5      # 
+
+32C6 ; 0037 6708 ;     ML      #* ( ㋆ → 7月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY → DIGIT SEVEN, CJK UNIFIED IDEOGRAPH-6708   # 
+
+335F ; 0037 70B9 ;     ML      #* ( ㍟ → 7点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN → DIGIT SEVEN, CJK UNIFIED IDEOGRAPH-70B9     # 
+
+0B03 ; 0038 ;  ML      # ( ଃ → 8 ) ORIYA SIGN VISARGA → DIGIT EIGHT      # 
+09EA ; 0038 ;  ML      # ( ৪ → 8 ) BENGALI DIGIT FOUR → DIGIT EIGHT      # 
+0A6A ; 0038 ;  ML      # ( ੪ → 8 ) GURMUKHI DIGIT FOUR → DIGIT EIGHT     # 
+1D7D6 ;        0038 ;  ML      # ( 𝟖 → 8 ) MATHEMATICAL BOLD DIGIT EIGHT → DIGIT EIGHT  # 
+1D7E0 ;        0038 ;  ML      # ( 𝟠 → 8 ) MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT → DIGIT EIGHT # 
+1D7EA ;        0038 ;  ML      # ( 𝟪 → 8 ) MATHEMATICAL SANS-SERIF DIGIT EIGHT → DIGIT EIGHT    # 
+1D7F4 ;        0038 ;  ML      # ( 𝟴 → 8 ) MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT → DIGIT EIGHT       # 
+1D7FE ;        0038 ;  ML      # ( 𝟾 → 8 ) MATHEMATICAL MONOSPACE DIGIT EIGHT → DIGIT EIGHT     # 
+0223 ; 0038 ;  ML      # ( ȣ → 8 ) LATIN SMALL LETTER OU → DIGIT EIGHT    # 
+
+2467 ; 2787 ;  ML      #* ( ⑧ → ➇ ) CIRCLED DIGIT EIGHT → DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT       # 
+
+06F8 ; 0668 ;  ML      # ( ۸ → ‎٨‎ ) EXTENDED ARABIC-INDIC DIGIT EIGHT → ARABIC-INDIC DIGIT EIGHT    # 
+
+0AEE ; 096E ;  ML      # ( ૮ → ८ ) GUJARATI DIGIT EIGHT → DEVANAGARI DIGIT EIGHT       # 
+
+1F109 ;        0038 002C ;     ML      #* ( 🄉 → 8, ) DIGIT EIGHT COMMA → DIGIT EIGHT, COMMA     # 
+
+248F ; 0038 002E ;     ML      #* ( ⒏ → 8. ) DIGIT EIGHT FULL STOP → DIGIT EIGHT, FULL STOP      # 
+
+33E7 ; 0038 65E5 ;     ML      #* ( ㏧ → 8日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT → DIGIT EIGHT, CJK UNIFIED IDEOGRAPH-65E5      # 
+
+32C7 ; 0038 6708 ;     ML      #* ( ㋇ → 8月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST → DIGIT EIGHT, CJK UNIFIED IDEOGRAPH-6708 # 
+
+3360 ; 0038 70B9 ;     ML      #* ( ㍠ → 8点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT → DIGIT EIGHT, CJK UNIFIED IDEOGRAPH-70B9     # 
+
+0A67 ; 0039 ;  ML      # ( ੧ → 9 ) GURMUKHI DIGIT ONE → DIGIT NINE       # 
+0B68 ; 0039 ;  ML      # ( ୨ → 9 ) ORIYA DIGIT TWO → DIGIT NINE  # 
+09ED ; 0039 ;  ML      # ( ৭ → 9 ) BENGALI DIGIT SEVEN → DIGIT NINE      # 
+1D7D7 ;        0039 ;  ML      # ( 𝟗 → 9 ) MATHEMATICAL BOLD DIGIT NINE → DIGIT NINE    # 
+1D7E1 ;        0039 ;  ML      # ( 𝟡 → 9 ) MATHEMATICAL DOUBLE-STRUCK DIGIT NINE → DIGIT NINE   # 
+1D7EB ;        0039 ;  ML      # ( 𝟫 → 9 ) MATHEMATICAL SANS-SERIF DIGIT NINE → DIGIT NINE      # 
+1D7F5 ;        0039 ;  ML      # ( 𝟵 → 9 ) MATHEMATICAL SANS-SERIF BOLD DIGIT NINE → DIGIT NINE # 
+1D7FF ;        0039 ;  ML      # ( 𝟿 → 9 ) MATHEMATICAL MONOSPACE DIGIT NINE → DIGIT NINE       # 
+
+2468 ; 2788 ;  ML      #* ( ⑨ → ➈ ) CIRCLED DIGIT NINE → DINGBAT CIRCLED SANS-SERIF DIGIT NINE # 
+
+06F9 ; 0669 ;  ML      # ( ۹ → ‎٩‎ ) EXTENDED ARABIC-INDIC DIGIT NINE → ARABIC-INDIC DIGIT NINE      # 
+
+0CEF ; 0C6F ;  ML      # ( ೯ → ౯ ) KANNADA DIGIT NINE → TELUGU DIGIT NINE      # 
+
+1F10A ;        0039 002C ;     ML      #* ( 🄊 → 9, ) DIGIT NINE COMMA → DIGIT NINE, COMMA       # 
+
+2490 ; 0039 002E ;     ML      #* ( ⒐ → 9. ) DIGIT NINE FULL STOP → DIGIT NINE, FULL STOP        # 
+
+33E8 ; 0039 65E5 ;     ML      #* ( ㏨ → 9日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE → DIGIT NINE, CJK UNIFIED IDEOGRAPH-65E5        # 
+
+32C8 ; 0039 6708 ;     ML      #* ( ㋈ → 9月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER → DIGIT NINE, CJK UNIFIED IDEOGRAPH-6708       # 
+
+3361 ; 0039 70B9 ;     ML      #* ( ㍡ → 9点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE → DIGIT NINE, CJK UNIFIED IDEOGRAPH-70B9       # 
+
+237A ; 0061 ;  ML      #* ( ⍺ → a ) APL FUNCTIONAL SYMBOL ALPHA → LATIN SMALL LETTER A   # →α→
+FF41 ; 0061 ;  ML      # ( a → a ) FULLWIDTH LATIN SMALL LETTER A → LATIN SMALL LETTER A # →а→
+1D41A ;        0061 ;  ML      # ( 𝐚 → a ) MATHEMATICAL BOLD SMALL A → LATIN SMALL LETTER A     # 
+1D44E ;        0061 ;  ML      # ( 𝑎 → a ) MATHEMATICAL ITALIC SMALL A → LATIN SMALL LETTER A   # 
+1D482 ;        0061 ;  ML      # ( 𝒂 → a ) MATHEMATICAL BOLD ITALIC SMALL A → LATIN SMALL LETTER A      # 
+1D4B6 ;        0061 ;  ML      # ( 𝒶 → a ) MATHEMATICAL SCRIPT SMALL A → LATIN SMALL LETTER A   # 
+1D4EA ;        0061 ;  ML      # ( 𝓪 → a ) MATHEMATICAL BOLD SCRIPT SMALL A → LATIN SMALL LETTER A      # 
+1D51E ;        0061 ;  ML      # ( 𝔞 → a ) MATHEMATICAL FRAKTUR SMALL A → LATIN SMALL LETTER A  # 
+1D552 ;        0061 ;  ML      # ( 𝕒 → a ) MATHEMATICAL DOUBLE-STRUCK SMALL A → LATIN SMALL LETTER A    # 
+1D586 ;        0061 ;  ML      # ( 𝖆 → a ) MATHEMATICAL BOLD FRAKTUR SMALL A → LATIN SMALL LETTER A     # 
+1D5BA ;        0061 ;  ML      # ( 𝖺 → a ) MATHEMATICAL SANS-SERIF SMALL A → LATIN SMALL LETTER A       # 
+1D5EE ;        0061 ;  ML      # ( 𝗮 → a ) MATHEMATICAL SANS-SERIF BOLD SMALL A → LATIN SMALL LETTER A  # 
+1D622 ;        0061 ;  ML      # ( 𝘢 → a ) MATHEMATICAL SANS-SERIF ITALIC SMALL A → LATIN SMALL LETTER A        # 
+1D656 ;        0061 ;  ML      # ( 𝙖 → a ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A → LATIN SMALL LETTER A   # 
+1D68A ;        0061 ;  ML      # ( 𝚊 → a ) MATHEMATICAL MONOSPACE SMALL A → LATIN SMALL LETTER A        # 
+0251 ; 0061 ;  ML      # ( ɑ → a ) LATIN SMALL LETTER ALPHA → LATIN SMALL LETTER A        # 
+03B1 ; 0061 ;  ML      # ( α → a ) GREEK SMALL LETTER ALPHA → LATIN SMALL LETTER A        # 
+1D6C2 ;        0061 ;  ML      # ( 𝛂 → a ) MATHEMATICAL BOLD SMALL ALPHA → LATIN SMALL LETTER A # →α→
+1D6FC ;        0061 ;  ML      # ( 𝛼 → a ) MATHEMATICAL ITALIC SMALL ALPHA → LATIN SMALL LETTER A       # →α→
+1D736 ;        0061 ;  ML      # ( 𝜶 → a ) MATHEMATICAL BOLD ITALIC SMALL ALPHA → LATIN SMALL LETTER A  # →α→
+1D770 ;        0061 ;  ML      # ( 𝝰 → a ) MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA → LATIN SMALL LETTER A      # →α→
+1D7AA ;        0061 ;  ML      # ( 𝞪 → a ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA → LATIN SMALL LETTER A       # →α→
+0430 ; 0061 ;  ML      # ( а → a ) CYRILLIC SMALL LETTER A → LATIN SMALL LETTER A # 
+
+01CE ; 0103 ;  ML      # ( ǎ → ă ) LATIN SMALL LETTER A WITH CARON → LATIN SMALL LETTER A WITH BREVE     # 
+
+0227 ; 00E5 ;  ML      # ( ȧ → å ) LATIN SMALL LETTER A WITH DOT ABOVE → LATIN SMALL LETTER A WITH RING ABOVE    # 
+
+A733 ; 0061 0061 ;     ML      # ( ꜳ → aa ) LATIN SMALL LETTER AA → LATIN SMALL LETTER A, LATIN SMALL LETTER A   # 
+
+00E6 ; 0061 0065 ;     ML      # ( æ → ae ) LATIN SMALL LETTER AE → LATIN SMALL LETTER A, LATIN SMALL LETTER E    # 
+04D5 ; 0061 0065 ;     ML      # ( ӕ → ae ) CYRILLIC SMALL LIGATURE A IE → LATIN SMALL LETTER A, LATIN SMALL LETTER E     # →ае→
+
+A735 ; 0061 006F ;     ML      # ( ꜵ → ao ) LATIN SMALL LETTER AO → LATIN SMALL LETTER A, LATIN SMALL LETTER O   # 
+
+A737 ; 0061 0075 ;     ML      # ( ꜷ → au ) LATIN SMALL LETTER AU → LATIN SMALL LETTER A, LATIN SMALL LETTER U   # 
+
+A739 ; 0061 0076 ;     ML      # ( ꜹ → av ) LATIN SMALL LETTER AV → LATIN SMALL LETTER A, LATIN SMALL LETTER V   # 
+A73B ; 0061 0076 ;     ML      # ( ꜻ → av ) LATIN SMALL LETTER AV WITH HORIZONTAL BAR → LATIN SMALL LETTER A, LATIN SMALL LETTER V       # 
+
+A73D ; 0061 0079 ;     ML      # ( ꜽ → ay ) LATIN SMALL LETTER AY → LATIN SMALL LETTER A, LATIN SMALL LETTER Y   # 
+
+1D41B ;        0062 ;  ML      # ( 𝐛 → b ) MATHEMATICAL BOLD SMALL B → LATIN SMALL LETTER B     # 
+1D44F ;        0062 ;  ML      # ( 𝑏 → b ) MATHEMATICAL ITALIC SMALL B → LATIN SMALL LETTER B   # 
+1D483 ;        0062 ;  ML      # ( 𝒃 → b ) MATHEMATICAL BOLD ITALIC SMALL B → LATIN SMALL LETTER B      # 
+1D4B7 ;        0062 ;  ML      # ( 𝒷 → b ) MATHEMATICAL SCRIPT SMALL B → LATIN SMALL LETTER B   # 
+1D4EB ;        0062 ;  ML      # ( 𝓫 → b ) MATHEMATICAL BOLD SCRIPT SMALL B → LATIN SMALL LETTER B      # 
+1D51F ;        0062 ;  ML      # ( 𝔟 → b ) MATHEMATICAL FRAKTUR SMALL B → LATIN SMALL LETTER B  # 
+1D553 ;        0062 ;  ML      # ( 𝕓 → b ) MATHEMATICAL DOUBLE-STRUCK SMALL B → LATIN SMALL LETTER B    # 
+1D587 ;        0062 ;  ML      # ( 𝖇 → b ) MATHEMATICAL BOLD FRAKTUR SMALL B → LATIN SMALL LETTER B     # 
+1D5BB ;        0062 ;  ML      # ( 𝖻 → b ) MATHEMATICAL SANS-SERIF SMALL B → LATIN SMALL LETTER B       # 
+1D5EF ;        0062 ;  ML      # ( 𝗯 → b ) MATHEMATICAL SANS-SERIF BOLD SMALL B → LATIN SMALL LETTER B  # 
+1D623 ;        0062 ;  ML      # ( 𝘣 → b ) MATHEMATICAL SANS-SERIF ITALIC SMALL B → LATIN SMALL LETTER B        # 
+1D657 ;        0062 ;  ML      # ( 𝙗 → b ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B → LATIN SMALL LETTER B   # 
+1D68B ;        0062 ;  ML      # ( 𝚋 → b ) MATHEMATICAL MONOSPACE SMALL B → LATIN SMALL LETTER B        # 
+13CF ; 0062 ;  ML      # ( Ꮟ → b ) CHEROKEE LETTER SI → LATIN SMALL LETTER B     # 
+15AF ; 0062 ;  ML      # ( ᖯ → b ) CANADIAN SYLLABICS AIVILIK B → LATIN SMALL LETTER B   # 
+
+0253 ; 0062 0314 ;     ML      # ( ɓ → b̔ ) LATIN SMALL LETTER B WITH HOOK → LATIN SMALL LETTER B, COMBINING REVERSED COMMA ABOVE        # 
+
+0183 ; 0062 0304 ;     ML      # ( ƃ → b̄ ) LATIN SMALL LETTER B WITH TOPBAR → LATIN SMALL LETTER B, COMBINING MACRON    # 
+
+0180 ; 0062 0335 ;     ML      # ( ƀ → b̵ ) LATIN SMALL LETTER B WITH STROKE → LATIN SMALL LETTER B, COMBINING SHORT STROKE OVERLAY      # 
+048D ; 0062 0335 ;     ML      # ( ҍ → b̵ ) CYRILLIC SMALL LETTER SEMISOFT SIGN → LATIN SMALL LETTER B, COMBINING SHORT STROKE OVERLAY   # →ѣ→→Ь̵→
+0463 ; 0062 0335 ;     ML      # ( ѣ → b̵ ) CYRILLIC SMALL LETTER YAT → LATIN SMALL LETTER B, COMBINING SHORT STROKE OVERLAY     # →Ь̵→
+
+0432 ; 0299 ;  ML      # ( в → ʙ ) CYRILLIC SMALL LETTER VE → LATIN LETTER SMALL CAPITAL B       # 
+
+FF43 ; 0063 ;  ML      # ( c → c ) FULLWIDTH LATIN SMALL LETTER C → LATIN SMALL LETTER C # →ϲ→
+217D ; 0063 ;  ML      # ( ⅽ → c ) SMALL ROMAN NUMERAL ONE HUNDRED → LATIN SMALL LETTER C        # 
+1D41C ;        0063 ;  ML      # ( 𝐜 → c ) MATHEMATICAL BOLD SMALL C → LATIN SMALL LETTER C     # 
+1D450 ;        0063 ;  ML      # ( 𝑐 → c ) MATHEMATICAL ITALIC SMALL C → LATIN SMALL LETTER C   # 
+1D484 ;        0063 ;  ML      # ( 𝒄 → c ) MATHEMATICAL BOLD ITALIC SMALL C → LATIN SMALL LETTER C      # 
+1D4B8 ;        0063 ;  ML      # ( 𝒸 → c ) MATHEMATICAL SCRIPT SMALL C → LATIN SMALL LETTER C   # 
+1D4EC ;        0063 ;  ML      # ( 𝓬 → c ) MATHEMATICAL BOLD SCRIPT SMALL C → LATIN SMALL LETTER C      # 
+1D520 ;        0063 ;  ML      # ( 𝔠 → c ) MATHEMATICAL FRAKTUR SMALL C → LATIN SMALL LETTER C  # 
+1D554 ;        0063 ;  ML      # ( 𝕔 → c ) MATHEMATICAL DOUBLE-STRUCK SMALL C → LATIN SMALL LETTER C    # 
+1D588 ;        0063 ;  ML      # ( 𝖈 → c ) MATHEMATICAL BOLD FRAKTUR SMALL C → LATIN SMALL LETTER C     # 
+1D5BC ;        0063 ;  ML      # ( 𝖼 → c ) MATHEMATICAL SANS-SERIF SMALL C → LATIN SMALL LETTER C       # 
+1D5F0 ;        0063 ;  ML      # ( 𝗰 → c ) MATHEMATICAL SANS-SERIF BOLD SMALL C → LATIN SMALL LETTER C  # 
+1D624 ;        0063 ;  ML      # ( 𝘤 → c ) MATHEMATICAL SANS-SERIF ITALIC SMALL C → LATIN SMALL LETTER C        # 
+1D658 ;        0063 ;  ML      # ( 𝙘 → c ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C → LATIN SMALL LETTER C   # 
+1D68C ;        0063 ;  ML      # ( 𝚌 → c ) MATHEMATICAL MONOSPACE SMALL C → LATIN SMALL LETTER C        # 
+1D04 ; 0063 ;  ML      # ( ᴄ → c ) LATIN LETTER SMALL CAPITAL C → LATIN SMALL LETTER C   # 
+03F2 ; 0063 ;  ML      # ( ϲ → c ) GREEK LUNATE SIGMA SYMBOL → LATIN SMALL LETTER C       # 
+2CA5 ; 0063 ;  ML      # ( ⲥ → c ) COPTIC SMALL LETTER SIMA → LATIN SMALL LETTER C       # →ϲ→
+0441 ; 0063 ;  ML      # ( с → c ) CYRILLIC SMALL LETTER ES → LATIN SMALL LETTER C        # 
+
+00A2 ; 0063 0338 ;     ML      #* ( ¢ → c̸ ) CENT SIGN → LATIN SMALL LETTER C, COMBINING LONG SOLIDUS OVERLAY    # 
+
+00E7 ; 0063 0326 ;     ML      # ( ç → c̦ ) LATIN SMALL LETTER C WITH CEDILLA → LATIN SMALL LETTER C, COMBINING COMMA BELOW      # →ҫ→→с̡→
+04AB ; 0063 0326 ;     ML      # ( ҫ → c̦ ) CYRILLIC SMALL LETTER ES WITH DESCENDER → LATIN SMALL LETTER C, COMBINING COMMA BELOW        # →с̡→
+
+217E ; 0064 ;  ML      # ( ⅾ → d ) SMALL ROMAN NUMERAL FIVE HUNDRED → LATIN SMALL LETTER D       # 
+2146 ; 0064 ;  ML      # ( ⅆ → d ) DOUBLE-STRUCK ITALIC SMALL D → LATIN SMALL LETTER D   # 
+1D41D ;        0064 ;  ML      # ( 𝐝 → d ) MATHEMATICAL BOLD SMALL D → LATIN SMALL LETTER D     # 
+1D451 ;        0064 ;  ML      # ( 𝑑 → d ) MATHEMATICAL ITALIC SMALL D → LATIN SMALL LETTER D   # 
+1D485 ;        0064 ;  ML      # ( 𝒅 → d ) MATHEMATICAL BOLD ITALIC SMALL D → LATIN SMALL LETTER D      # 
+1D4B9 ;        0064 ;  ML      # ( 𝒹 → d ) MATHEMATICAL SCRIPT SMALL D → LATIN SMALL LETTER D   # 
+1D4ED ;        0064 ;  ML      # ( 𝓭 → d ) MATHEMATICAL BOLD SCRIPT SMALL D → LATIN SMALL LETTER D      # 
+1D521 ;        0064 ;  ML      # ( 𝔡 → d ) MATHEMATICAL FRAKTUR SMALL D → LATIN SMALL LETTER D  # 
+1D555 ;        0064 ;  ML      # ( 𝕕 → d ) MATHEMATICAL DOUBLE-STRUCK SMALL D → LATIN SMALL LETTER D    # 
+1D589 ;        0064 ;  ML      # ( 𝖉 → d ) MATHEMATICAL BOLD FRAKTUR SMALL D → LATIN SMALL LETTER D     # 
+1D5BD ;        0064 ;  ML      # ( 𝖽 → d ) MATHEMATICAL SANS-SERIF SMALL D → LATIN SMALL LETTER D       # 
+1D5F1 ;        0064 ;  ML      # ( 𝗱 → d ) MATHEMATICAL SANS-SERIF BOLD SMALL D → LATIN SMALL LETTER D  # 
+1D625 ;        0064 ;  ML      # ( 𝘥 → d ) MATHEMATICAL SANS-SERIF ITALIC SMALL D → LATIN SMALL LETTER D        # 
+1D659 ;        0064 ;  ML      # ( 𝙙 → d ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D → LATIN SMALL LETTER D   # 
+1D68D ;        0064 ;  ML      # ( 𝚍 → d ) MATHEMATICAL MONOSPACE SMALL D → LATIN SMALL LETTER D        # 
+0501 ; 0064 ;  ML      # ( ԁ → d ) CYRILLIC SMALL LETTER KOMI DE → LATIN SMALL LETTER D   # 
+146F ; 0064 ;  ML      # ( ᑯ → d ) CANADIAN SYLLABICS KO → LATIN SMALL LETTER D  # 
+A4D2 ; 0064 ;  ML      # ( ꓒ → d ) LISU LETTER PHA → LATIN SMALL LETTER D        # 
+
+0257 ; 0064 0314 ;     ML      # ( ɗ → d̔ ) LATIN SMALL LETTER D WITH HOOK → LATIN SMALL LETTER D, COMBINING REVERSED COMMA ABOVE        # 
+
+0256 ; 0064 0328 ;     ML      # ( ɖ → d̨ ) LATIN SMALL LETTER D WITH TAIL → LATIN SMALL LETTER D, COMBINING OGONEK      # →d̢→
+
+018C ; 0064 0304 ;     ML      # ( ƌ → d̄ ) LATIN SMALL LETTER D WITH TOPBAR → LATIN SMALL LETTER D, COMBINING MACRON    # 
+
+0111 ; 0064 0335 ;     ML      # ( đ → d̵ ) LATIN SMALL LETTER D WITH STROKE → LATIN SMALL LETTER D, COMBINING SHORT STROKE OVERLAY      # 
+
+20AB ; 0064 0335 0331 ;        ML      #* ( ₫ → ḏ̵ ) DONG SIGN → LATIN SMALL LETTER D, COMBINING SHORT STROKE OVERLAY, COMBINING MACRON BELOW # →đ̱→
+
+147B ; 0064 00B7 ;     ML      # ( ᑻ → d· ) CANADIAN SYLLABICS WEST-CREE KWO → LATIN SMALL LETTER D, MIDDLE DOT # →ᑯᐧ→
+
+01F3 ; 0064 007A ;     ML      # ( dz → dz ) LATIN SMALL LETTER DZ → LATIN SMALL LETTER D, LATIN SMALL LETTER Z    # 
+02A3 ; 0064 007A ;     ML      # ( ʣ → dz ) LATIN SMALL LETTER DZ DIGRAPH → LATIN SMALL LETTER D, LATIN SMALL LETTER Z    # 
+
+01C6 ; 0064 017E ;     ML      # ( dž → dž ) LATIN SMALL LETTER DZ WITH CARON → LATIN SMALL LETTER D, LATIN SMALL LETTER Z WITH CARON     # 
+
+02A5 ; 0064 0291 ;     ML      # ( ʥ → dʑ ) LATIN SMALL LETTER DZ DIGRAPH WITH CURL → LATIN SMALL LETTER D, LATIN SMALL LETTER Z WITH CURL       # 
+
+02A4 ; 0064 021D ;     ML      # ( ʤ → dȝ ) LATIN SMALL LETTER DEZH DIGRAPH → LATIN SMALL LETTER D, LATIN SMALL LETTER YOGH      # →dʒ→
+
+1487 ; 0064 144A ;     ML      # ( ᒇ → dᑊ ) CANADIAN SYLLABICS SOUTH-SLAVEY KOH → LATIN SMALL LETTER D, CANADIAN SYLLABICS WEST-CREE P # →ᑯᑊ→
+
+03B4 ; 1E9F ;  ML      # ( δ → ẟ ) GREEK SMALL LETTER DELTA → LATIN SMALL LETTER DELTA  # 
+1D6C5 ;        1E9F ;  ML      # ( 𝛅 → ẟ ) MATHEMATICAL BOLD SMALL DELTA → LATIN SMALL LETTER DELTA   # →δ→
+1D6FF ;        1E9F ;  ML      # ( 𝛿 → ẟ ) MATHEMATICAL ITALIC SMALL DELTA → LATIN SMALL LETTER DELTA # →δ→
+1D739 ;        1E9F ;  ML      # ( 𝜹 → ẟ ) MATHEMATICAL BOLD ITALIC SMALL DELTA → LATIN SMALL LETTER DELTA    # →δ→
+1D773 ;        1E9F ;  ML      # ( 𝝳 → ẟ ) MATHEMATICAL SANS-SERIF BOLD SMALL DELTA → LATIN SMALL LETTER DELTA        # →δ→
+1D7AD ;        1E9F ;  ML      # ( 𝞭 → ẟ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA → LATIN SMALL LETTER DELTA # →δ→
+056E ; 1E9F ;  ML      # ( ծ → ẟ ) ARMENIAN SMALL LETTER CA → LATIN SMALL LETTER DELTA  # →δ→
+1577 ; 1E9F ;  ML      # ( ᕷ → ẟ ) CANADIAN SYLLABICS NUNAVIK HO → LATIN SMALL LETTER DELTA    # →δ→
+
+212E ; 0065 ;  ML      # ( ℮ → e ) ESTIMATED SYMBOL → LATIN SMALL LETTER E       # 
+FF45 ; 0065 ;  ML      # ( e → e ) FULLWIDTH LATIN SMALL LETTER E → LATIN SMALL LETTER E # →е→
+212F ; 0065 ;  ML      # ( ℯ → e ) SCRIPT SMALL E → LATIN SMALL LETTER E # 
+2147 ; 0065 ;  ML      # ( ⅇ → e ) DOUBLE-STRUCK ITALIC SMALL E → LATIN SMALL LETTER E   # 
+1D41E ;        0065 ;  ML      # ( 𝐞 → e ) MATHEMATICAL BOLD SMALL E → LATIN SMALL LETTER E     # 
+1D452 ;        0065 ;  ML      # ( 𝑒 → e ) MATHEMATICAL ITALIC SMALL E → LATIN SMALL LETTER E   # 
+1D486 ;        0065 ;  ML      # ( 𝒆 → e ) MATHEMATICAL BOLD ITALIC SMALL E → LATIN SMALL LETTER E      # 
+1D4EE ;        0065 ;  ML      # ( 𝓮 → e ) MATHEMATICAL BOLD SCRIPT SMALL E → LATIN SMALL LETTER E      # 
+1D522 ;        0065 ;  ML      # ( 𝔢 → e ) MATHEMATICAL FRAKTUR SMALL E → LATIN SMALL LETTER E  # 
+1D556 ;        0065 ;  ML      # ( 𝕖 → e ) MATHEMATICAL DOUBLE-STRUCK SMALL E → LATIN SMALL LETTER E    # 
+1D58A ;        0065 ;  ML      # ( 𝖊 → e ) MATHEMATICAL BOLD FRAKTUR SMALL E → LATIN SMALL LETTER E     # 
+1D5BE ;        0065 ;  ML      # ( 𝖾 → e ) MATHEMATICAL SANS-SERIF SMALL E → LATIN SMALL LETTER E       # 
+1D5F2 ;        0065 ;  ML      # ( 𝗲 → e ) MATHEMATICAL SANS-SERIF BOLD SMALL E → LATIN SMALL LETTER E  # 
+1D626 ;        0065 ;  ML      # ( 𝘦 → e ) MATHEMATICAL SANS-SERIF ITALIC SMALL E → LATIN SMALL LETTER E        # 
+1D65A ;        0065 ;  ML      # ( 𝙚 → e ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E → LATIN SMALL LETTER E   # 
+1D68E ;        0065 ;  ML      # ( 𝚎 → e ) MATHEMATICAL MONOSPACE SMALL E → LATIN SMALL LETTER E        # 
+0435 ; 0065 ;  ML      # ( е → e ) CYRILLIC SMALL LETTER IE → LATIN SMALL LETTER E        # 
+
+011B ; 0115 ;  ML      # ( ě → ĕ ) LATIN SMALL LETTER E WITH CARON → LATIN SMALL LETTER E WITH BREVE     # 
+
+0259 ; 01DD ;  ML      # ( ə → ǝ ) LATIN SMALL LETTER SCHWA → LATIN SMALL LETTER TURNED E        # 
+04D9 ; 01DD ;  ML      # ( ә → ǝ ) CYRILLIC SMALL LETTER SCHWA → LATIN SMALL LETTER TURNED E     # 
+
+025A ; 01DD 02DE ;     ML      # ( ɚ → ǝ˞ ) LATIN SMALL LETTER SCHWA WITH HOOK → LATIN SMALL LETTER TURNED E, MODIFIER LETTER RHOTIC HOOK       # →ə˞→
+
+1D14 ; 01DD 006F ;     ML      # ( ᴔ → ǝo ) LATIN SMALL LETTER TURNED OE → LATIN SMALL LETTER TURNED E, LATIN SMALL LETTER O    # →əo→
+
+22F4 ; 025B ;  ML      #* ( ⋴ → ɛ ) SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE → LATIN SMALL LETTER OPEN E  # 
+03B5 ; 025B ;  ML      # ( ε → ɛ ) GREEK SMALL LETTER EPSILON → LATIN SMALL LETTER OPEN E        # 
+1D6C6 ;        025B ;  ML      # ( 𝛆 → ɛ ) MATHEMATICAL BOLD SMALL EPSILON → LATIN SMALL LETTER OPEN E # →ε→
+1D6DC ;        025B ;  ML      # ( 𝛜 → ɛ ) MATHEMATICAL BOLD EPSILON SYMBOL → LATIN SMALL LETTER OPEN E        # →ε→
+1D700 ;        025B ;  ML      # ( 𝜀 → ɛ ) MATHEMATICAL ITALIC SMALL EPSILON → LATIN SMALL LETTER OPEN E       # →ε→
+1D716 ;        025B ;  ML      # ( 𝜖 → ɛ ) MATHEMATICAL ITALIC EPSILON SYMBOL → LATIN SMALL LETTER OPEN E      # →ε→
+1D73A ;        025B ;  ML      # ( 𝜺 → ɛ ) MATHEMATICAL BOLD ITALIC SMALL EPSILON → LATIN SMALL LETTER OPEN E  # →ε→
+1D750 ;        025B ;  ML      # ( 𝝐 → ɛ ) MATHEMATICAL BOLD ITALIC EPSILON SYMBOL → LATIN SMALL LETTER OPEN E # →ε→
+1D774 ;        025B ;  ML      # ( 𝝴 → ɛ ) MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON → LATIN SMALL LETTER OPEN E      # →ε→
+1D78A ;        025B ;  ML      # ( 𝞊 → ɛ ) MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL → LATIN SMALL LETTER OPEN E     # →ε→
+1D7AE ;        025B ;  ML      # ( 𝞮 → ɛ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON → LATIN SMALL LETTER OPEN E       # →ε→
+1D7C4 ;        025B ;  ML      # ( 𝟄 → ɛ ) MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL → LATIN SMALL LETTER OPEN E      # →ε→
+2C89 ; 025B ;  ML      # ( ⲉ → ɛ ) COPTIC SMALL LETTER EIE → LATIN SMALL LETTER OPEN E  # →є→
+0454 ; 025B ;  ML      # ( є → ɛ ) CYRILLIC SMALL LETTER UKRAINIAN IE → LATIN SMALL LETTER OPEN E        # 
+0511 ; 025B ;  ML      # ( ԑ → ɛ ) CYRILLIC SMALL LETTER REVERSED ZE → LATIN SMALL LETTER OPEN E # 
+
+20AC ; 2107 ;  ML      #* ( € → ℇ ) EURO SIGN → EULER CONSTANT # →Є→
+
+1D9F ; 1D4B ;  ML      # ( ᶟ → ᵋ ) MODIFIER LETTER SMALL REVERSED OPEN E → MODIFIER LETTER SMALL OPEN E        # 
+
+1D08 ; 025C ;  ML      # ( ᴈ → ɜ ) LATIN SMALL LETTER TURNED OPEN E → LATIN SMALL LETTER REVERSED OPEN E        # 
+0437 ; 025C ;  ML      # ( з → ɜ ) CYRILLIC SMALL LETTER ZE → LATIN SMALL LETTER REVERSED OPEN E # 
+
+0499 ; 025C 0326 ;     ML      # ( ҙ → ɜ̦ ) CYRILLIC SMALL LETTER ZE WITH DESCENDER → LATIN SMALL LETTER REVERSED OPEN E, COMBINING COMMA BELOW # →з̡→
+
+1D41F ;        0066 ;  ML      # ( 𝐟 → f ) MATHEMATICAL BOLD SMALL F → LATIN SMALL LETTER F     # 
+1D453 ;        0066 ;  ML      # ( 𝑓 → f ) MATHEMATICAL ITALIC SMALL F → LATIN SMALL LETTER F   # 
+1D487 ;        0066 ;  ML      # ( 𝒇 → f ) MATHEMATICAL BOLD ITALIC SMALL F → LATIN SMALL LETTER F      # 
+1D4BB ;        0066 ;  ML      # ( 𝒻 → f ) MATHEMATICAL SCRIPT SMALL F → LATIN SMALL LETTER F   # 
+1D4EF ;        0066 ;  ML      # ( 𝓯 → f ) MATHEMATICAL BOLD SCRIPT SMALL F → LATIN SMALL LETTER F      # 
+1D523 ;        0066 ;  ML      # ( 𝔣 → f ) MATHEMATICAL FRAKTUR SMALL F → LATIN SMALL LETTER F  # 
+1D557 ;        0066 ;  ML      # ( 𝕗 → f ) MATHEMATICAL DOUBLE-STRUCK SMALL F → LATIN SMALL LETTER F    # 
+1D58B ;        0066 ;  ML      # ( 𝖋 → f ) MATHEMATICAL BOLD FRAKTUR SMALL F → LATIN SMALL LETTER F     # 
+1D5BF ;        0066 ;  ML      # ( 𝖿 → f ) MATHEMATICAL SANS-SERIF SMALL F → LATIN SMALL LETTER F       # 
+1D5F3 ;        0066 ;  ML      # ( 𝗳 → f ) MATHEMATICAL SANS-SERIF BOLD SMALL F → LATIN SMALL LETTER F  # 
+1D627 ;        0066 ;  ML      # ( 𝘧 → f ) MATHEMATICAL SANS-SERIF ITALIC SMALL F → LATIN SMALL LETTER F        # 
+1D65B ;        0066 ;  ML      # ( 𝙛 → f ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F → LATIN SMALL LETTER F   # 
+1D68F ;        0066 ;  ML      # ( 𝚏 → f ) MATHEMATICAL MONOSPACE SMALL F → LATIN SMALL LETTER F        # 
+1E9D ; 0066 ;  ML      # ( ẝ → f ) LATIN SMALL LETTER LONG S WITH HIGH STROKE → LATIN SMALL LETTER F     # 
+0584 ; 0066 ;  ML      # ( ք → f ) ARMENIAN SMALL LETTER KEH → LATIN SMALL LETTER F       # 
+
+0192 ; 0066 0326 ;     ML      # ( ƒ → f̦ ) LATIN SMALL LETTER F WITH HOOK → LATIN SMALL LETTER F, COMBINING COMMA BELOW # →f̡→
+
+02A9 ; 0066 014B ;     ML      # ( ʩ → fŋ ) LATIN SMALL LETTER FENG DIGRAPH → LATIN SMALL LETTER F, LATIN SMALL LETTER ENG       # 
+
+FF47 ; 0067 ;  ML      # ( g → g ) FULLWIDTH LATIN SMALL LETTER G → LATIN SMALL LETTER G # →ɡ→
+210A ; 0067 ;  ML      # ( ℊ → g ) SCRIPT SMALL G → LATIN SMALL LETTER G # 
+1D420 ;        0067 ;  ML      # ( 𝐠 → g ) MATHEMATICAL BOLD SMALL G → LATIN SMALL LETTER G     # 
+1D454 ;        0067 ;  ML      # ( 𝑔 → g ) MATHEMATICAL ITALIC SMALL G → LATIN SMALL LETTER G   # 
+1D488 ;        0067 ;  ML      # ( 𝒈 → g ) MATHEMATICAL BOLD ITALIC SMALL G → LATIN SMALL LETTER G      # 
+1D4F0 ;        0067 ;  ML      # ( 𝓰 → g ) MATHEMATICAL BOLD SCRIPT SMALL G → LATIN SMALL LETTER G      # 
+1D524 ;        0067 ;  ML      # ( 𝔤 → g ) MATHEMATICAL FRAKTUR SMALL G → LATIN SMALL LETTER G  # 
+1D558 ;        0067 ;  ML      # ( 𝕘 → g ) MATHEMATICAL DOUBLE-STRUCK SMALL G → LATIN SMALL LETTER G    # 
+1D58C ;        0067 ;  ML      # ( 𝖌 → g ) MATHEMATICAL BOLD FRAKTUR SMALL G → LATIN SMALL LETTER G     # 
+1D5C0 ;        0067 ;  ML      # ( 𝗀 → g ) MATHEMATICAL SANS-SERIF SMALL G → LATIN SMALL LETTER G       # 
+1D5F4 ;        0067 ;  ML      # ( 𝗴 → g ) MATHEMATICAL SANS-SERIF BOLD SMALL G → LATIN SMALL LETTER G  # 
+1D628 ;        0067 ;  ML      # ( 𝘨 → g ) MATHEMATICAL SANS-SERIF ITALIC SMALL G → LATIN SMALL LETTER G        # 
+1D65C ;        0067 ;  ML      # ( 𝙜 → g ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G → LATIN SMALL LETTER G   # 
+1D690 ;        0067 ;  ML      # ( 𝚐 → g ) MATHEMATICAL MONOSPACE SMALL G → LATIN SMALL LETTER G        # 
+0261 ; 0067 ;  ML      # ( ɡ → g ) LATIN SMALL LETTER SCRIPT G → LATIN SMALL LETTER G     # 
+1D83 ; 0067 ;  ML      # ( ᶃ → g ) LATIN SMALL LETTER G WITH PALATAL HOOK → LATIN SMALL LETTER G # 
+018D ; 0067 ;  ML      # ( ƍ → g ) LATIN SMALL LETTER TURNED DELTA → LATIN SMALL LETTER G # 
+0581 ; 0067 ;  ML      # ( ց → g ) ARMENIAN SMALL LETTER CO → LATIN SMALL LETTER G        # 
+
+1DA2 ; 1D4D ;  ML      # ( ᶢ → ᵍ ) MODIFIER LETTER SMALL SCRIPT G → MODIFIER LETTER SMALL G    # 
+
+0260 ; 0067 0314 ;     ML      # ( ɠ → g̔ ) LATIN SMALL LETTER G WITH HOOK → LATIN SMALL LETTER G, COMBINING REVERSED COMMA ABOVE        # 
+
+01E7 ; 011F ;  ML      # ( ǧ → ğ ) LATIN SMALL LETTER G WITH CARON → LATIN SMALL LETTER G WITH BREVE     # 
+
+01F5 ; 0123 ;  ML      # ( ǵ → ģ ) LATIN SMALL LETTER G WITH ACUTE → LATIN SMALL LETTER G WITH CEDILLA   # 
+
+01E5 ; 0067 0335 ;     ML      # ( ǥ → g̵ ) LATIN SMALL LETTER G WITH STROKE → LATIN SMALL LETTER G, COMBINING SHORT STROKE OVERLAY      # 
+
+050D ; 0262 ;  ML      # ( ԍ → ɢ ) CYRILLIC SMALL LETTER KOMI SJE → LATIN LETTER SMALL CAPITAL G # 
+
+FF48 ; 0068 ;  ML      # ( h → h ) FULLWIDTH LATIN SMALL LETTER H → LATIN SMALL LETTER H # →һ→
+210E ; 0068 ;  ML      # ( ℎ → h ) PLANCK CONSTANT → LATIN SMALL LETTER H        # 
+1D421 ;        0068 ;  ML      # ( 𝐡 → h ) MATHEMATICAL BOLD SMALL H → LATIN SMALL LETTER H     # 
+1D489 ;        0068 ;  ML      # ( 𝒉 → h ) MATHEMATICAL BOLD ITALIC SMALL H → LATIN SMALL LETTER H      # 
+1D4BD ;        0068 ;  ML      # ( 𝒽 → h ) MATHEMATICAL SCRIPT SMALL H → LATIN SMALL LETTER H   # 
+1D4F1 ;        0068 ;  ML      # ( 𝓱 → h ) MATHEMATICAL BOLD SCRIPT SMALL H → LATIN SMALL LETTER H      # 
+1D525 ;        0068 ;  ML      # ( 𝔥 → h ) MATHEMATICAL FRAKTUR SMALL H → LATIN SMALL LETTER H  # 
+1D559 ;        0068 ;  ML      # ( 𝕙 → h ) MATHEMATICAL DOUBLE-STRUCK SMALL H → LATIN SMALL LETTER H    # 
+1D58D ;        0068 ;  ML      # ( 𝖍 → h ) MATHEMATICAL BOLD FRAKTUR SMALL H → LATIN SMALL LETTER H     # 
+1D5C1 ;        0068 ;  ML      # ( 𝗁 → h ) MATHEMATICAL SANS-SERIF SMALL H → LATIN SMALL LETTER H       # 
+1D5F5 ;        0068 ;  ML      # ( 𝗵 → h ) MATHEMATICAL SANS-SERIF BOLD SMALL H → LATIN SMALL LETTER H  # 
+1D629 ;        0068 ;  ML      # ( 𝘩 → h ) MATHEMATICAL SANS-SERIF ITALIC SMALL H → LATIN SMALL LETTER H        # 
+1D65D ;        0068 ;  ML      # ( 𝙝 → h ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H → LATIN SMALL LETTER H   # 
+1D691 ;        0068 ;  ML      # ( 𝚑 → h ) MATHEMATICAL MONOSPACE SMALL H → LATIN SMALL LETTER H        # 
+04BB ; 0068 ;  ML      # ( һ → h ) CYRILLIC SMALL LETTER SHHA → LATIN SMALL LETTER H      # 
+0570 ; 0068 ;  ML      # ( հ → h ) ARMENIAN SMALL LETTER HO → LATIN SMALL LETTER H        # 
+13C2 ; 0068 ;  ML      # ( Ꮒ → h ) CHEROKEE LETTER NI → LATIN SMALL LETTER H     # 
+
+1D78 ; 1D34 ;  ML      # ( ᵸ → ᴴ ) MODIFIER LETTER CYRILLIC EN → MODIFIER LETTER CAPITAL H     # 
+
+0266 ; 0068 0314 ;     ML      # ( ɦ → h̔ ) LATIN SMALL LETTER H WITH HOOK → LATIN SMALL LETTER H, COMBINING REVERSED COMMA ABOVE        # 
+13F2 ; 0068 0314 ;     ML      # ( Ᏺ → h̔ ) CHEROKEE LETTER YO → LATIN SMALL LETTER H, COMBINING REVERSED COMMA ABOVE   # →ɦ→
+
+0127 ; 0068 0335 ;     ML      # ( ħ → h̵ ) LATIN SMALL LETTER H WITH STROKE → LATIN SMALL LETTER H, COMBINING SHORT STROKE OVERLAY      # 
+210F ; 0068 0335 ;     ML      # ( ℏ → h̵ ) PLANCK CONSTANT OVER TWO PI → LATIN SMALL LETTER H, COMBINING SHORT STROKE OVERLAY  # →ħ→
+045B ; 0068 0335 ;     ML      # ( ћ → h̵ ) CYRILLIC SMALL LETTER TSHE → LATIN SMALL LETTER H, COMBINING SHORT STROKE OVERLAY    # →ħ→
+
+043D ; 029C ;  ML      # ( н → ʜ ) CYRILLIC SMALL LETTER EN → LATIN LETTER SMALL CAPITAL H       # 
+
+04A3 ; 029C 0329 ;     ML      # ( ң → ʜ̩ ) CYRILLIC SMALL LETTER EN WITH DESCENDER → LATIN LETTER SMALL CAPITAL H, COMBINING VERTICAL LINE BELOW       # →н̩→
+
+04CA ; 029C 0326 ;     ML      # ( ӊ → ʜ̦ ) CYRILLIC SMALL LETTER EN WITH TAIL → LATIN LETTER SMALL CAPITAL H, COMBINING COMMA BELOW    # →н̡→
+04C8 ; 029C 0326 ;     ML      # ( ӈ → ʜ̦ ) CYRILLIC SMALL LETTER EN WITH HOOK → LATIN LETTER SMALL CAPITAL H, COMBINING COMMA BELOW    # →н̡→
+
+02DB ; 0069 ;  ML      #* ( ˛ → i ) OGONEK → LATIN SMALL LETTER I # →ͺ→→ι→→ι→
+2373 ; 0069 ;  ML      #* ( ⍳ → i ) APL FUNCTIONAL SYMBOL IOTA → LATIN SMALL LETTER I    # →ι→
+FF49 ; 0069 ;  ML      # ( i → i ) FULLWIDTH LATIN SMALL LETTER I → LATIN SMALL LETTER I # →і→
+2170 ; 0069 ;  ML      # ( ⅰ → i ) SMALL ROMAN NUMERAL ONE → LATIN SMALL LETTER I        # 
+2139 ; 0069 ;  ML      # ( ℹ → i ) INFORMATION SOURCE → LATIN SMALL LETTER I     # 
+2148 ; 0069 ;  ML      # ( ⅈ → i ) DOUBLE-STRUCK ITALIC SMALL I → LATIN SMALL LETTER I   # 
+1D422 ;        0069 ;  ML      # ( 𝐢 → i ) MATHEMATICAL BOLD SMALL I → LATIN SMALL LETTER I     # 
+1D456 ;        0069 ;  ML      # ( 𝑖 → i ) MATHEMATICAL ITALIC SMALL I → LATIN SMALL LETTER I   # 
+1D48A ;        0069 ;  ML      # ( 𝒊 → i ) MATHEMATICAL BOLD ITALIC SMALL I → LATIN SMALL LETTER I      # 
+1D4BE ;        0069 ;  ML      # ( 𝒾 → i ) MATHEMATICAL SCRIPT SMALL I → LATIN SMALL LETTER I   # 
+1D4F2 ;        0069 ;  ML      # ( 𝓲 → i ) MATHEMATICAL BOLD SCRIPT SMALL I → LATIN SMALL LETTER I      # 
+1D526 ;        0069 ;  ML      # ( 𝔦 → i ) MATHEMATICAL FRAKTUR SMALL I → LATIN SMALL LETTER I  # 
+1D55A ;        0069 ;  ML      # ( 𝕚 → i ) MATHEMATICAL DOUBLE-STRUCK SMALL I → LATIN SMALL LETTER I    # 
+1D58E ;        0069 ;  ML      # ( 𝖎 → i ) MATHEMATICAL BOLD FRAKTUR SMALL I → LATIN SMALL LETTER I     # 
+1D5C2 ;        0069 ;  ML      # ( 𝗂 → i ) MATHEMATICAL SANS-SERIF SMALL I → LATIN SMALL LETTER I       # 
+1D5F6 ;        0069 ;  ML      # ( 𝗶 → i ) MATHEMATICAL SANS-SERIF BOLD SMALL I → LATIN SMALL LETTER I  # 
+1D62A ;        0069 ;  ML      # ( 𝘪 → i ) MATHEMATICAL SANS-SERIF ITALIC SMALL I → LATIN SMALL LETTER I        # 
+1D65E ;        0069 ;  ML      # ( 𝙞 → i ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I → LATIN SMALL LETTER I   # 
+1D692 ;        0069 ;  ML      # ( 𝚒 → i ) MATHEMATICAL MONOSPACE SMALL I → LATIN SMALL LETTER I        # 
+0131 ; 0069 ;  ML      # ( ı → i ) LATIN SMALL LETTER DOTLESS I → LATIN SMALL LETTER I    # 
+1D6A4 ;        0069 ;  ML      # ( 𝚤 → i ) MATHEMATICAL ITALIC SMALL DOTLESS I → LATIN SMALL LETTER I   # →ı→
+026A ; 0069 ;  ML      # ( ɪ → i ) LATIN LETTER SMALL CAPITAL I → LATIN SMALL LETTER I    # →ı→
+0269 ; 0069 ;  ML      # ( ɩ → i ) LATIN SMALL LETTER IOTA → LATIN SMALL LETTER I # 
+03B9 ; 0069 ;  ML      # ( ι → i ) GREEK SMALL LETTER IOTA → LATIN SMALL LETTER I # 
+037A ; 0069 ;  ML      #* ( ͺ → i ) GREEK YPOGEGRAMMENI → LATIN SMALL LETTER I    # →ι→→ι→
+1D6CA ;        0069 ;  ML      # ( 𝛊 → i ) MATHEMATICAL BOLD SMALL IOTA → LATIN SMALL LETTER I  # →ι→
+1D704 ;        0069 ;  ML      # ( 𝜄 → i ) MATHEMATICAL ITALIC SMALL IOTA → LATIN SMALL LETTER I        # →ι→
+1D73E ;        0069 ;  ML      # ( 𝜾 → i ) MATHEMATICAL BOLD ITALIC SMALL IOTA → LATIN SMALL LETTER I   # →ι→
+1D778 ;        0069 ;  ML      # ( 𝝸 → i ) MATHEMATICAL SANS-SERIF BOLD SMALL IOTA → LATIN SMALL LETTER I       # →ι→
+1D7B2 ;        0069 ;  ML      # ( 𝞲 → i ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA → LATIN SMALL LETTER I        # →ι→
+0456 ; 0069 ;  ML      # ( і → i ) CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I → LATIN SMALL LETTER I  # 
+04CF ; 0069 ;  ML      # ( ӏ → i ) CYRILLIC SMALL LETTER PALOCHKA → LATIN SMALL LETTER I  # →ı→
+13A5 ; 0069 ;  ML      # ( Ꭵ → i ) CHEROKEE LETTER V → LATIN SMALL LETTER I      # 
+
+01D0 ; 012D ;  ML      # ( ǐ → ĭ ) LATIN SMALL LETTER I WITH CARON → LATIN SMALL LETTER I WITH BREVE     # 
+
+0268 ; 0069 0335 ;     ML      # ( ɨ → i̵ ) LATIN SMALL LETTER I WITH STROKE → LATIN SMALL LETTER I, COMBINING SHORT STROKE OVERLAY      # 
+
+2171 ; 0069 0069 ;     ML      # ( ⅱ → ii ) SMALL ROMAN NUMERAL TWO → LATIN SMALL LETTER I, LATIN SMALL LETTER I # 
+
+2172 ; 0069 0069 0069 ;        ML      # ( ⅲ → iii ) SMALL ROMAN NUMERAL THREE → LATIN SMALL LETTER I, LATIN SMALL LETTER I, LATIN SMALL LETTER I        # 
+
+0133 ; 0069 006A ;     ML      # ( ij → ij ) LATIN SMALL LIGATURE IJ → LATIN SMALL LETTER I, LATIN SMALL LETTER J  # 
+
+2173 ; 0069 0076 ;     ML      # ( ⅳ → iv ) SMALL ROMAN NUMERAL FOUR → LATIN SMALL LETTER I, LATIN SMALL LETTER V        # 
+
+2178 ; 0069 0078 ;     ML      # ( ⅸ → ix ) SMALL ROMAN NUMERAL NINE → LATIN SMALL LETTER I, LATIN SMALL LETTER X        # 
+
+FF4A ; 006A ;  ML      # ( j → j ) FULLWIDTH LATIN SMALL LETTER J → LATIN SMALL LETTER J # →ј→
+2149 ; 006A ;  ML      # ( ⅉ → j ) DOUBLE-STRUCK ITALIC SMALL J → LATIN SMALL LETTER J   # 
+1D423 ;        006A ;  ML      # ( 𝐣 → j ) MATHEMATICAL BOLD SMALL J → LATIN SMALL LETTER J     # 
+1D457 ;        006A ;  ML      # ( 𝑗 → j ) MATHEMATICAL ITALIC SMALL J → LATIN SMALL LETTER J   # 
+1D48B ;        006A ;  ML      # ( 𝒋 → j ) MATHEMATICAL BOLD ITALIC SMALL J → LATIN SMALL LETTER J      # 
+1D4BF ;        006A ;  ML      # ( 𝒿 → j ) MATHEMATICAL SCRIPT SMALL J → LATIN SMALL LETTER J   # 
+1D4F3 ;        006A ;  ML      # ( 𝓳 → j ) MATHEMATICAL BOLD SCRIPT SMALL J → LATIN SMALL LETTER J      # 
+1D527 ;        006A ;  ML      # ( 𝔧 → j ) MATHEMATICAL FRAKTUR SMALL J → LATIN SMALL LETTER J  # 
+1D55B ;        006A ;  ML      # ( 𝕛 → j ) MATHEMATICAL DOUBLE-STRUCK SMALL J → LATIN SMALL LETTER J    # 
+1D58F ;        006A ;  ML      # ( 𝖏 → j ) MATHEMATICAL BOLD FRAKTUR SMALL J → LATIN SMALL LETTER J     # 
+1D5C3 ;        006A ;  ML      # ( 𝗃 → j ) MATHEMATICAL SANS-SERIF SMALL J → LATIN SMALL LETTER J       # 
+1D5F7 ;        006A ;  ML      # ( 𝗷 → j ) MATHEMATICAL SANS-SERIF BOLD SMALL J → LATIN SMALL LETTER J  # 
+1D62B ;        006A ;  ML      # ( 𝘫 → j ) MATHEMATICAL SANS-SERIF ITALIC SMALL J → LATIN SMALL LETTER J        # 
+1D65F ;        006A ;  ML      # ( 𝙟 → j ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J → LATIN SMALL LETTER J   # 
+1D693 ;        006A ;  ML      # ( 𝚓 → j ) MATHEMATICAL MONOSPACE SMALL J → LATIN SMALL LETTER J        # 
+0237 ; 006A ;  ML      # ( ȷ → j ) LATIN SMALL LETTER DOTLESS J → LATIN SMALL LETTER J    # →յ→
+1D6A5 ;        006A ;  ML      # ( 𝚥 → j ) MATHEMATICAL ITALIC SMALL DOTLESS J → LATIN SMALL LETTER J   # →ȷ→→յ→
+03F3 ; 006A ;  ML      # ( ϳ → j ) GREEK LETTER YOT → LATIN SMALL LETTER J        # 
+0458 ; 006A ;  ML      # ( ј → j ) CYRILLIC SMALL LETTER JE → LATIN SMALL LETTER J        # 
+0575 ; 006A ;  ML      # ( յ → j ) ARMENIAN SMALL LETTER YI → LATIN SMALL LETTER J        # 
+
+1D424 ;        006B ;  ML      # ( 𝐤 → k ) MATHEMATICAL BOLD SMALL K → LATIN SMALL LETTER K     # 
+1D458 ;        006B ;  ML      # ( 𝑘 → k ) MATHEMATICAL ITALIC SMALL K → LATIN SMALL LETTER K   # 
+1D48C ;        006B ;  ML      # ( 𝒌 → k ) MATHEMATICAL BOLD ITALIC SMALL K → LATIN SMALL LETTER K      # 
+1D4C0 ;        006B ;  ML      # ( 𝓀 → k ) MATHEMATICAL SCRIPT SMALL K → LATIN SMALL LETTER K   # 
+1D4F4 ;        006B ;  ML      # ( 𝓴 → k ) MATHEMATICAL BOLD SCRIPT SMALL K → LATIN SMALL LETTER K      # 
+1D528 ;        006B ;  ML      # ( 𝔨 → k ) MATHEMATICAL FRAKTUR SMALL K → LATIN SMALL LETTER K  # 
+1D55C ;        006B ;  ML      # ( 𝕜 → k ) MATHEMATICAL DOUBLE-STRUCK SMALL K → LATIN SMALL LETTER K    # 
+1D590 ;        006B ;  ML      # ( 𝖐 → k ) MATHEMATICAL BOLD FRAKTUR SMALL K → LATIN SMALL LETTER K     # 
+1D5C4 ;        006B ;  ML      # ( 𝗄 → k ) MATHEMATICAL SANS-SERIF SMALL K → LATIN SMALL LETTER K       # 
+1D5F8 ;        006B ;  ML      # ( 𝗸 → k ) MATHEMATICAL SANS-SERIF BOLD SMALL K → LATIN SMALL LETTER K  # 
+1D62C ;        006B ;  ML      # ( 𝘬 → k ) MATHEMATICAL SANS-SERIF ITALIC SMALL K → LATIN SMALL LETTER K        # 
+1D660 ;        006B ;  ML      # ( 𝙠 → k ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K → LATIN SMALL LETTER K   # 
+1D694 ;        006B ;  ML      # ( 𝚔 → k ) MATHEMATICAL MONOSPACE SMALL K → LATIN SMALL LETTER K        # 
+1D0B ; 006B ;  ML      # ( ᴋ → k ) LATIN LETTER SMALL CAPITAL K → LATIN SMALL LETTER K   # →к→
+0138 ; 006B ;  ML      # ( ĸ → k ) LATIN SMALL LETTER KRA → LATIN SMALL LETTER K  # →к→
+03BA ; 006B ;  ML      # ( κ → k ) GREEK SMALL LETTER KAPPA → LATIN SMALL LETTER K        # →к→
+1D6CB ;        006B ;  ML      # ( 𝛋 → k ) MATHEMATICAL BOLD SMALL KAPPA → LATIN SMALL LETTER K # →κ→→к→
+1D6DE ;        006B ;  ML      # ( 𝛞 → k ) MATHEMATICAL BOLD KAPPA SYMBOL → LATIN SMALL LETTER K        # →κ→→к→
+1D705 ;        006B ;  ML      # ( 𝜅 → k ) MATHEMATICAL ITALIC SMALL KAPPA → LATIN SMALL LETTER K       # →κ→→к→
+1D718 ;        006B ;  ML      # ( 𝜘 → k ) MATHEMATICAL ITALIC KAPPA SYMBOL → LATIN SMALL LETTER K      # →κ→→к→
+1D73F ;        006B ;  ML      # ( 𝜿 → k ) MATHEMATICAL BOLD ITALIC SMALL KAPPA → LATIN SMALL LETTER K  # →κ→→к→
+1D752 ;        006B ;  ML      # ( 𝝒 → k ) MATHEMATICAL BOLD ITALIC KAPPA SYMBOL → LATIN SMALL LETTER K # →κ→→к→
+1D779 ;        006B ;  ML      # ( 𝝹 → k ) MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA → LATIN SMALL LETTER K      # →κ→→к→
+1D78C ;        006B ;  ML      # ( 𝞌 → k ) MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL → LATIN SMALL LETTER K     # →κ→→к→
+1D7B3 ;        006B ;  ML      # ( 𝞳 → k ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA → LATIN SMALL LETTER K       # →κ→→к→
+1D7C6 ;        006B ;  ML      # ( 𝟆 → k ) MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL → LATIN SMALL LETTER K      # →κ→→к→
+2C95 ; 006B ;  ML      # ( ⲕ → k ) COPTIC SMALL LETTER KAPA → LATIN SMALL LETTER K       # →κ→→к→
+043A ; 006B ;  ML      # ( к → k ) CYRILLIC SMALL LETTER KA → LATIN SMALL LETTER K        # 
+
+0199 ; 006B 0314 ;     ML      # ( ƙ → k̔ ) LATIN SMALL LETTER K WITH HOOK → LATIN SMALL LETTER K, COMBINING REVERSED COMMA ABOVE        # 
+
+049B ; 006B 0329 ;     ML      # ( қ → k̩ ) CYRILLIC SMALL LETTER KA WITH DESCENDER → LATIN SMALL LETTER K, COMBINING VERTICAL LINE BELOW        # →к̩→
+
+049F ; 006B 0335 ;     ML      # ( ҟ → k̵ ) CYRILLIC SMALL LETTER KA WITH STROKE → LATIN SMALL LETTER K, COMBINING SHORT STROKE OVERLAY  # →к̵→
+
+007C ; 006C ;  ML      #* ( | → l ) VERTICAL LINE → LATIN SMALL LETTER L   # 
+2223 ; 006C ;  ML      #* ( ∣ → l ) DIVIDES → LATIN SMALL LETTER L       # →|→
+FFE8 ; 006C ;  ML      #* ( │ → l ) HALFWIDTH FORMS LIGHT VERTICAL → LATIN SMALL LETTER L        # →|→
+0031 ; 006C ;  ML      # ( 1 → l ) DIGIT ONE → LATIN SMALL LETTER L        # 
+1D7CF ;        006C ;  ML      # ( 𝟏 → l ) MATHEMATICAL BOLD DIGIT ONE → LATIN SMALL LETTER L   # →1→
+1D7D9 ;        006C ;  ML      # ( 𝟙 → l ) MATHEMATICAL DOUBLE-STRUCK DIGIT ONE → LATIN SMALL LETTER L  # →1→
+1D7E3 ;        006C ;  ML      # ( 𝟣 → l ) MATHEMATICAL SANS-SERIF DIGIT ONE → LATIN SMALL LETTER L     # →1→
+1D7ED ;        006C ;  ML      # ( 𝟭 → l ) MATHEMATICAL SANS-SERIF BOLD DIGIT ONE → LATIN SMALL LETTER L        # →1→
+1D7F7 ;        006C ;  ML      # ( 𝟷 → l ) MATHEMATICAL MONOSPACE DIGIT ONE → LATIN SMALL LETTER L      # →1→
+2110 ; 006C ;  ML      # ( ℐ → l ) SCRIPT CAPITAL I → LATIN SMALL LETTER L       # →I→
+2111 ; 006C ;  ML      # ( ℑ → l ) BLACK-LETTER CAPITAL I → LATIN SMALL LETTER L # →I→
+1D408 ;        006C ;  ML      # ( 𝐈 → l ) MATHEMATICAL BOLD CAPITAL I → LATIN SMALL LETTER L   # →I→
+1D43C ;        006C ;  ML      # ( 𝐼 → l ) MATHEMATICAL ITALIC CAPITAL I → LATIN SMALL LETTER L # →I→
+1D470 ;        006C ;  ML      # ( 𝑰 → l ) MATHEMATICAL BOLD ITALIC CAPITAL I → LATIN SMALL LETTER L    # →I→
+1D4D8 ;        006C ;  ML      # ( 𝓘 → l ) MATHEMATICAL BOLD SCRIPT CAPITAL I → LATIN SMALL LETTER L    # →I→
+1D540 ;        006C ;  ML      # ( 𝕀 → l ) MATHEMATICAL DOUBLE-STRUCK CAPITAL I → LATIN SMALL LETTER L  # →I→
+1D574 ;        006C ;  ML      # ( 𝕴 → l ) MATHEMATICAL BOLD FRAKTUR CAPITAL I → LATIN SMALL LETTER L   # →I→
+1D5A8 ;        006C ;  ML      # ( 𝖨 → l ) MATHEMATICAL SANS-SERIF CAPITAL I → LATIN SMALL LETTER L     # →I→
+1D5DC ;        006C ;  ML      # ( 𝗜 → l ) MATHEMATICAL SANS-SERIF BOLD CAPITAL I → LATIN SMALL LETTER L        # →I→
+1D610 ;        006C ;  ML      # ( 𝘐 → l ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL I → LATIN SMALL LETTER L      # →I→
+1D644 ;        006C ;  ML      # ( 𝙄 → l ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I → LATIN SMALL LETTER L # →I→
+1D678 ;        006C ;  ML      # ( 𝙸 → l ) MATHEMATICAL MONOSPACE CAPITAL I → LATIN SMALL LETTER L      # →I→
+FF4C ; 006C ;  ML      # ( l → l ) FULLWIDTH LATIN SMALL LETTER L → LATIN SMALL LETTER L # →Ⅰ→→Ӏ→
+217C ; 006C ;  ML      # ( ⅼ → l ) SMALL ROMAN NUMERAL FIFTY → LATIN SMALL LETTER L      # 
+2113 ; 006C ;  ML      # ( ℓ → l ) SCRIPT SMALL L → LATIN SMALL LETTER L # 
+1D425 ;        006C ;  ML      # ( 𝐥 → l ) MATHEMATICAL BOLD SMALL L → LATIN SMALL LETTER L     # 
+1D459 ;        006C ;  ML      # ( 𝑙 → l ) MATHEMATICAL ITALIC SMALL L → LATIN SMALL LETTER L   # 
+1D48D ;        006C ;  ML      # ( 𝒍 → l ) MATHEMATICAL BOLD ITALIC SMALL L → LATIN SMALL LETTER L      # 
+1D4C1 ;        006C ;  ML      # ( 𝓁 → l ) MATHEMATICAL SCRIPT SMALL L → LATIN SMALL LETTER L   # 
+1D4F5 ;        006C ;  ML      # ( 𝓵 → l ) MATHEMATICAL BOLD SCRIPT SMALL L → LATIN SMALL LETTER L      # 
+1D529 ;        006C ;  ML      # ( 𝔩 → l ) MATHEMATICAL FRAKTUR SMALL L → LATIN SMALL LETTER L  # 
+1D55D ;        006C ;  ML      # ( 𝕝 → l ) MATHEMATICAL DOUBLE-STRUCK SMALL L → LATIN SMALL LETTER L    # 
+1D591 ;        006C ;  ML      # ( 𝖑 → l ) MATHEMATICAL BOLD FRAKTUR SMALL L → LATIN SMALL LETTER L     # 
+1D5C5 ;        006C ;  ML      # ( 𝗅 → l ) MATHEMATICAL SANS-SERIF SMALL L → LATIN SMALL LETTER L       # 
+1D5F9 ;        006C ;  ML      # ( 𝗹 → l ) MATHEMATICAL SANS-SERIF BOLD SMALL L → LATIN SMALL LETTER L  # 
+1D62D ;        006C ;  ML      # ( 𝘭 → l ) MATHEMATICAL SANS-SERIF ITALIC SMALL L → LATIN SMALL LETTER L        # 
+1D661 ;        006C ;  ML      # ( 𝙡 → l ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L → LATIN SMALL LETTER L   # 
+1D695 ;        006C ;  ML      # ( 𝚕 → l ) MATHEMATICAL MONOSPACE SMALL L → LATIN SMALL LETTER L        # 
+01C0 ; 006C ;  ML      # ( ǀ → l ) LATIN LETTER DENTAL CLICK → LATIN SMALL LETTER L       # 
+1D6B0 ;        006C ;  ML      # ( 𝚰 → l ) MATHEMATICAL BOLD CAPITAL IOTA → LATIN SMALL LETTER L        # →Ι→
+1D6EA ;        006C ;  ML      # ( 𝛪 → l ) MATHEMATICAL ITALIC CAPITAL IOTA → LATIN SMALL LETTER L      # →Ι→
+1D724 ;        006C ;  ML      # ( 𝜤 → l ) MATHEMATICAL BOLD ITALIC CAPITAL IOTA → LATIN SMALL LETTER L # →Ι→
+1D75E ;        006C ;  ML      # ( 𝝞 → l ) MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA → LATIN SMALL LETTER L     # →Ι→
+1D798 ;        006C ;  ML      # ( 𝞘 → l ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA → LATIN SMALL LETTER L      # →Ι→
+05D5 ; 006C ;  ML      # ( ‎ו‎ → l ) HEBREW LETTER VAV → LATIN SMALL LETTER L # 
+05DF ; 006C ;  ML      # ( ‎ן‎ → l ) HEBREW LETTER FINAL NUN → LATIN SMALL LETTER L   # 
+07CA ; 006C ;  ML      # ( ‎ߊ‎ → l ) NKO LETTER A → LATIN SMALL LETTER L      # →∣→→|→
+2D4F ; 006C ;  ML      # ( ⵏ → l ) TIFINAGH LETTER YAN → LATIN SMALL LETTER L    # →Ӏ→
+A4F2 ; 006C ;  ML      # ( ꓲ → l ) LISU LETTER I → LATIN SMALL LETTER L  # →I→
+
+0142 ; 006C 0338 ;     ML      # ( ł → l̸ ) LATIN SMALL LETTER L WITH STROKE → LATIN SMALL LETTER L, COMBINING LONG SOLIDUS OVERLAY      # →l̷→
+
+026D ; 006C 0328 ;     ML      # ( ɭ → l̨ ) LATIN SMALL LETTER L WITH RETROFLEX HOOK → LATIN SMALL LETTER L, COMBINING OGONEK    # →l̢→
+
+026B ; 006C 0334 ;     ML      # ( ɫ → l̴ ) LATIN SMALL LETTER L WITH MIDDLE TILDE → LATIN SMALL LETTER L, COMBINING TILDE OVERLAY       # 
+
+019A ; 006C 0335 ;     ML      # ( ƚ → l̵ ) LATIN SMALL LETTER L WITH BAR → LATIN SMALL LETTER L, COMBINING SHORT STROKE OVERLAY # 
+
+0140 ; 006C 00B7 ;     ML      # ( ŀ → l· ) LATIN SMALL LETTER L WITH MIDDLE DOT → LATIN SMALL LETTER L, MIDDLE DOT      # 
+14B7 ; 006C 00B7 ;     ML      # ( ᒷ → l· ) CANADIAN SYLLABICS WEST-CREE MWA → LATIN SMALL LETTER L, MIDDLE DOT # →1ᐧ→
+
+1F102 ;        006C 002C ;     ML      #* ( 🄂 → l, ) DIGIT ONE COMMA → LATIN SMALL LETTER L, COMMA      # →1,→
+
+2488 ; 006C 002E ;     ML      #* ( ⒈ → l. ) DIGIT ONE FULL STOP → LATIN SMALL LETTER L, FULL STOP       # →1.→
+
+05F1 ; 006C 0027 ;     ML      # ( ‎ױ‎ → l' ) HEBREW LIGATURE YIDDISH VAV YOD → LATIN SMALL LETTER L, APOSTROPHE      # →‎וי‎→
+
+2493 ; 006C 0032 002E ;        ML      #* ( ⒓ → l2. ) NUMBER TWELVE FULL STOP → LATIN SMALL LETTER L, DIGIT TWO, FULL STOP       # →12.→
+
+33EB ; 006C 0032 65E5 ;        ML      #* ( ㏫ → l2日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE → LATIN SMALL LETTER L, DIGIT TWO, CJK UNIFIED IDEOGRAPH-65E5        # →12日→
+
+32CB ; 006C 0032 6708 ;        ML      #* ( ㋋ → l2月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER → LATIN SMALL LETTER L, DIGIT TWO, CJK UNIFIED IDEOGRAPH-6708  # →12月→
+
+3364 ; 006C 0032 70B9 ;        ML      #* ( ㍤ → l2点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE → LATIN SMALL LETTER L, DIGIT TWO, CJK UNIFIED IDEOGRAPH-70B9       # →12点→
+
+2494 ; 006C 0033 002E ;        ML      #* ( ⒔ → l3. ) NUMBER THIRTEEN FULL STOP → LATIN SMALL LETTER L, DIGIT THREE, FULL STOP   # →13.→
+
+33EC ; 006C 0033 65E5 ;        ML      #* ( ㏬ → l3日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN → LATIN SMALL LETTER L, DIGIT THREE, CJK UNIFIED IDEOGRAPH-65E5    # →13日→
+
+3365 ; 006C 0033 70B9 ;        ML      #* ( ㍥ → l3点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN → LATIN SMALL LETTER L, DIGIT THREE, CJK UNIFIED IDEOGRAPH-70B9   # →13点→
+
+2495 ; 006C 0034 002E ;        ML      #* ( ⒕ → l4. ) NUMBER FOURTEEN FULL STOP → LATIN SMALL LETTER L, DIGIT FOUR, FULL STOP    # →14.→
+
+33ED ; 006C 0034 65E5 ;        ML      #* ( ㏭ → l4日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN → LATIN SMALL LETTER L, DIGIT FOUR, CJK UNIFIED IDEOGRAPH-65E5     # →14日→
+
+3366 ; 006C 0034 70B9 ;        ML      #* ( ㍦ → l4点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN → LATIN SMALL LETTER L, DIGIT FOUR, CJK UNIFIED IDEOGRAPH-70B9    # →14点→
+
+2496 ; 006C 0035 002E ;        ML      #* ( ⒖ → l5. ) NUMBER FIFTEEN FULL STOP → LATIN SMALL LETTER L, DIGIT FIVE, FULL STOP     # →15.→
+
+33EE ; 006C 0035 65E5 ;        ML      #* ( ㏮ → l5日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN → LATIN SMALL LETTER L, DIGIT FIVE, CJK UNIFIED IDEOGRAPH-65E5      # →15日→
+
+3367 ; 006C 0035 70B9 ;        ML      #* ( ㍧ → l5点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN → LATIN SMALL LETTER L, DIGIT FIVE, CJK UNIFIED IDEOGRAPH-70B9     # →15点→
+
+2497 ; 006C 0036 002E ;        ML      #* ( ⒗ → l6. ) NUMBER SIXTEEN FULL STOP → LATIN SMALL LETTER L, DIGIT SIX, FULL STOP      # →16.→
+
+33EF ; 006C 0036 65E5 ;        ML      #* ( ㏯ → l6日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN → LATIN SMALL LETTER L, DIGIT SIX, CJK UNIFIED IDEOGRAPH-65E5       # →16日→
+
+3368 ; 006C 0036 70B9 ;        ML      #* ( ㍨ → l6点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN → LATIN SMALL LETTER L, DIGIT SIX, CJK UNIFIED IDEOGRAPH-70B9      # →16点→
+
+2498 ; 006C 0037 002E ;        ML      #* ( ⒘ → l7. ) NUMBER SEVENTEEN FULL STOP → LATIN SMALL LETTER L, DIGIT SEVEN, FULL STOP  # →17.→
+
+33F0 ; 006C 0037 65E5 ;        ML      #* ( ㏰ → l7日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN → LATIN SMALL LETTER L, DIGIT SEVEN, CJK UNIFIED IDEOGRAPH-65E5   # →17日→
+
+3369 ; 006C 0037 70B9 ;        ML      #* ( ㍩ → l7点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN → LATIN SMALL LETTER L, DIGIT SEVEN, CJK UNIFIED IDEOGRAPH-70B9  # →17点→
+
+2499 ; 006C 0038 002E ;        ML      #* ( ⒙ → l8. ) NUMBER EIGHTEEN FULL STOP → LATIN SMALL LETTER L, DIGIT EIGHT, FULL STOP   # →18.→
+
+33F1 ; 006C 0038 65E5 ;        ML      #* ( ㏱ → l8日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN → LATIN SMALL LETTER L, DIGIT EIGHT, CJK UNIFIED IDEOGRAPH-65E5    # →18日→
+
+336A ; 006C 0038 70B9 ;        ML      #* ( ㍪ → l8点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN → LATIN SMALL LETTER L, DIGIT EIGHT, CJK UNIFIED IDEOGRAPH-70B9   # →18点→
+
+249A ; 006C 0039 002E ;        ML      #* ( ⒚ → l9. ) NUMBER NINETEEN FULL STOP → LATIN SMALL LETTER L, DIGIT NINE, FULL STOP    # →19.→
+
+33F2 ; 006C 0039 65E5 ;        ML      #* ( ㏲ → l9日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN → LATIN SMALL LETTER L, DIGIT NINE, CJK UNIFIED IDEOGRAPH-65E5     # →19日→
+
+336B ; 006C 0039 70B9 ;        ML      #* ( ㍫ → l9点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN → LATIN SMALL LETTER L, DIGIT NINE, CJK UNIFIED IDEOGRAPH-70B9    # →19点→
+
+01C9 ; 006C 006A ;     ML      # ( lj → lj ) LATIN SMALL LETTER LJ → LATIN SMALL LETTER L, LATIN SMALL LETTER J    # 
+
+2016 ; 006C 006C ;     ML      #* ( ‖ → ll ) DOUBLE VERTICAL LINE → LATIN SMALL LETTER L, LATIN SMALL LETTER L   # →∥→→||→
+2225 ; 006C 006C ;     ML      #* ( ∥ → ll ) PARALLEL TO → LATIN SMALL LETTER L, LATIN SMALL LETTER L    # →||→
+01C1 ; 006C 006C ;     ML      # ( ǁ → ll ) LATIN LETTER LATERAL CLICK → LATIN SMALL LETTER L, LATIN SMALL LETTER L       # →‖→→∥→→||→
+05F0 ; 006C 006C ;     ML      # ( ‎װ‎ → ll ) HEBREW LIGATURE YIDDISH DOUBLE VAV → LATIN SMALL LETTER L, LATIN SMALL LETTER L # →‎וו‎→
+
+2492 ; 006C 006C 002E ;        ML      #* ( ⒒ → ll. ) NUMBER ELEVEN FULL STOP → LATIN SMALL LETTER L, LATIN SMALL LETTER L, FULL STOP    # →11.→
+
+33EA ; 006C 006C 65E5 ;        ML      #* ( ㏪ → ll日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN → LATIN SMALL LETTER L, LATIN SMALL LETTER L, CJK UNIFIED IDEOGRAPH-65E5     # →11日→
+
+32CA ; 006C 006C 6708 ;        ML      #* ( ㋊ → ll月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER → LATIN SMALL LETTER L, LATIN SMALL LETTER L, CJK UNIFIED IDEOGRAPH-6708       # →11月→
+
+3363 ; 006C 006C 70B9 ;        ML      #* ( ㍣ → ll点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN → LATIN SMALL LETTER L, LATIN SMALL LETTER L, CJK UNIFIED IDEOGRAPH-70B9    # →11点→
+
+33E0 ; 006C 65E5 ;     ML      #* ( ㏠ → l日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE → LATIN SMALL LETTER L, CJK UNIFIED IDEOGRAPH-65E5       # →1日→
+
+32C0 ; 006C 6708 ;     ML      #* ( ㋀ → l月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY → LATIN SMALL LETTER L, CJK UNIFIED IDEOGRAPH-6708       # →1月→
+
+3359 ; 006C 70B9 ;     ML      #* ( ㍙ → l点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE → LATIN SMALL LETTER L, CJK UNIFIED IDEOGRAPH-70B9      # →1点→
+
+2CD1 ; 029F ;  ML      # ( ⳑ → ʟ ) COPTIC SMALL LETTER L-SHAPED HA → LATIN LETTER SMALL CAPITAL L       # 
+
+043C ; 1D0D ;  ML      # ( м → ᴍ ) CYRILLIC SMALL LETTER EM → LATIN LETTER SMALL CAPITAL M      # 
+
+04CE ; 1D0D 0326 ;     ML      # ( ӎ → ᴍ̦ ) CYRILLIC SMALL LETTER EM WITH TAIL → LATIN LETTER SMALL CAPITAL M, COMBINING COMMA BELOW   # →м̡→
+
+1D427 ;        006E ;  ML      # ( 𝐧 → n ) MATHEMATICAL BOLD SMALL N → LATIN SMALL LETTER N     # 
+1D45B ;        006E ;  ML      # ( 𝑛 → n ) MATHEMATICAL ITALIC SMALL N → LATIN SMALL LETTER N   # 
+1D48F ;        006E ;  ML      # ( 𝒏 → n ) MATHEMATICAL BOLD ITALIC SMALL N → LATIN SMALL LETTER N      # 
+1D4C3 ;        006E ;  ML      # ( 𝓃 → n ) MATHEMATICAL SCRIPT SMALL N → LATIN SMALL LETTER N   # 
+1D4F7 ;        006E ;  ML      # ( 𝓷 → n ) MATHEMATICAL BOLD SCRIPT SMALL N → LATIN SMALL LETTER N      # 
+1D52B ;        006E ;  ML      # ( 𝔫 → n ) MATHEMATICAL FRAKTUR SMALL N → LATIN SMALL LETTER N  # 
+1D55F ;        006E ;  ML      # ( 𝕟 → n ) MATHEMATICAL DOUBLE-STRUCK SMALL N → LATIN SMALL LETTER N    # 
+1D593 ;        006E ;  ML      # ( 𝖓 → n ) MATHEMATICAL BOLD FRAKTUR SMALL N → LATIN SMALL LETTER N     # 
+1D5C7 ;        006E ;  ML      # ( 𝗇 → n ) MATHEMATICAL SANS-SERIF SMALL N → LATIN SMALL LETTER N       # 
+1D5FB ;        006E ;  ML      # ( 𝗻 → n ) MATHEMATICAL SANS-SERIF BOLD SMALL N → LATIN SMALL LETTER N  # 
+1D62F ;        006E ;  ML      # ( 𝘯 → n ) MATHEMATICAL SANS-SERIF ITALIC SMALL N → LATIN SMALL LETTER N        # 
+1D663 ;        006E ;  ML      # ( 𝙣 → n ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N → LATIN SMALL LETTER N   # 
+1D697 ;        006E ;  ML      # ( 𝚗 → n ) MATHEMATICAL MONOSPACE SMALL N → LATIN SMALL LETTER N        # 
+03C0 ; 006E ;  ML      # ( π → n ) GREEK SMALL LETTER PI → LATIN SMALL LETTER N   # 
+213C ; 006E ;  ML      # ( ℼ → n ) DOUBLE-STRUCK SMALL PI → LATIN SMALL LETTER N # →π→
+1D6D1 ;        006E ;  ML      # ( 𝛑 → n ) MATHEMATICAL BOLD SMALL PI → LATIN SMALL LETTER N    # →π→
+1D6E1 ;        006E ;  ML      # ( 𝛡 → n ) MATHEMATICAL BOLD PI SYMBOL → LATIN SMALL LETTER N   # →π→
+1D70B ;        006E ;  ML      # ( 𝜋 → n ) MATHEMATICAL ITALIC SMALL PI → LATIN SMALL LETTER N  # →π→
+1D71B ;        006E ;  ML      # ( 𝜛 → n ) MATHEMATICAL ITALIC PI SYMBOL → LATIN SMALL LETTER N # →π→
+1D745 ;        006E ;  ML      # ( 𝝅 → n ) MATHEMATICAL BOLD ITALIC SMALL PI → LATIN SMALL LETTER N     # →π→
+1D755 ;        006E ;  ML      # ( 𝝕 → n ) MATHEMATICAL BOLD ITALIC PI SYMBOL → LATIN SMALL LETTER N    # →π→
+1D77F ;        006E ;  ML      # ( 𝝿 → n ) MATHEMATICAL SANS-SERIF BOLD SMALL PI → LATIN SMALL LETTER N # →π→
+1D78F ;        006E ;  ML      # ( 𝞏 → n ) MATHEMATICAL SANS-SERIF BOLD PI SYMBOL → LATIN SMALL LETTER N        # →π→
+1D7B9 ;        006E ;  ML      # ( 𝞹 → n ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI → LATIN SMALL LETTER N  # →π→
+1D7C9 ;        006E ;  ML      # ( 𝟉 → n ) MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL → LATIN SMALL LETTER N # →π→
+1D28 ; 006E ;  ML      # ( ᴨ → n ) GREEK LETTER SMALL CAPITAL PI → LATIN SMALL LETTER N  # →п→
+043F ; 006E ;  ML      # ( п → n ) CYRILLIC SMALL LETTER PE → LATIN SMALL LETTER N        # 
+0578 ; 006E ;  ML      # ( ո → n ) ARMENIAN SMALL LETTER VO → LATIN SMALL LETTER N        # 
+057C ; 006E ;  ML      # ( ռ → n ) ARMENIAN SMALL LETTER RA → LATIN SMALL LETTER N        # 
+
+0272 ; 0146 ;  ML      # ( ɲ → ņ ) LATIN SMALL LETTER N WITH LEFT HOOK → LATIN SMALL LETTER N WITH CEDILLA       # 
+
+0273 ; 006E 0328 ;     ML      # ( ɳ → n̨ ) LATIN SMALL LETTER N WITH RETROFLEX HOOK → LATIN SMALL LETTER N, COMBINING OGONEK    # →n̢→
+
+019E ; 006E 0329 ;     ML      # ( ƞ → n̩ ) LATIN SMALL LETTER N WITH LONG RIGHT LEG → LATIN SMALL LETTER N, COMBINING VERTICAL LINE BELOW       # 
+03B7 ; 006E 0329 ;     ML      # ( η → n̩ ) GREEK SMALL LETTER ETA → LATIN SMALL LETTER N, COMBINING VERTICAL LINE BELOW # →ƞ→
+1D6C8 ;        006E 0329 ;     ML      # ( 𝛈 → n̩ ) MATHEMATICAL BOLD SMALL ETA → LATIN SMALL LETTER N, COMBINING VERTICAL LINE BELOW  # →η→→ƞ→
+1D702 ;        006E 0329 ;     ML      # ( 𝜂 → n̩ ) MATHEMATICAL ITALIC SMALL ETA → LATIN SMALL LETTER N, COMBINING VERTICAL LINE BELOW        # →η→→ƞ→
+1D73C ;        006E 0329 ;     ML      # ( 𝜼 → n̩ ) MATHEMATICAL BOLD ITALIC SMALL ETA → LATIN SMALL LETTER N, COMBINING VERTICAL LINE BELOW   # →η→→ƞ→
+1D776 ;        006E 0329 ;     ML      # ( 𝝶 → n̩ ) MATHEMATICAL SANS-SERIF BOLD SMALL ETA → LATIN SMALL LETTER N, COMBINING VERTICAL LINE BELOW       # →η→→ƞ→
+1D7B0 ;        006E 0329 ;     ML      # ( 𝞰 → n̩ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA → LATIN SMALL LETTER N, COMBINING VERTICAL LINE BELOW        # →η→→ƞ→
+
+01CC ; 006E 006A ;     ML      # ( nj → nj ) LATIN SMALL LETTER NJ → LATIN SMALL LETTER N, LATIN SMALL LETTER J    # 
+
+0438 ; 1D0E ;  ML      # ( и → ᴎ ) CYRILLIC SMALL LETTER I → LATIN LETTER SMALL CAPITAL REVERSED N      # 
+
+0C02 ; 006F ;  ML      # ( ం → o ) TELUGU SIGN ANUSVARA → LATIN SMALL LETTER O   # 
+0C82 ; 006F ;  ML      # ( ಂ → o ) KANNADA SIGN ANUSVARA → LATIN SMALL LETTER O  # 
+0D02 ; 006F ;  ML      # ( ം → o ) MALAYALAM SIGN ANUSVARA → LATIN SMALL LETTER O        # 
+0D82 ; 006F ;  ML      # ( ං → o ) SINHALA SIGN ANUSVARAYA → LATIN SMALL LETTER O        # 
+0966 ; 006F ;  ML      # ( ० → o ) DEVANAGARI DIGIT ZERO → LATIN SMALL LETTER O  # 
+0A66 ; 006F ;  ML      # ( ੦ → o ) GURMUKHI DIGIT ZERO → LATIN SMALL LETTER O    # 
+0AE6 ; 006F ;  ML      # ( ૦ → o ) GUJARATI DIGIT ZERO → LATIN SMALL LETTER O    # 
+0BE6 ; 006F ;  ML      # ( ௦ → o ) TAMIL DIGIT ZERO → LATIN SMALL LETTER O       # 
+0C66 ; 006F ;  ML      # ( ౦ → o ) TELUGU DIGIT ZERO → LATIN SMALL LETTER O      # 
+0CE6 ; 006F ;  ML      # ( ೦ → o ) KANNADA DIGIT ZERO → LATIN SMALL LETTER O     # →౦→
+0D66 ; 006F ;  ML      # ( ൦ → o ) MALAYALAM DIGIT ZERO → LATIN SMALL LETTER O   # 
+0E50 ; 006F ;  ML      # ( ๐ → o ) THAI DIGIT ZERO → LATIN SMALL LETTER O        # 
+0ED0 ; 006F ;  ML      # ( ໐ → o ) LAO DIGIT ZERO → LATIN SMALL LETTER O # 
+1040 ; 006F ;  ML      # ( ၀ → o ) MYANMAR DIGIT ZERO → LATIN SMALL LETTER O     # 
+0665 ; 006F ;  ML      # ( ‎٥‎ → o ) ARABIC-INDIC DIGIT FIVE → LATIN SMALL LETTER O   # 
+FF4F ; 006F ;  ML      # ( o → o ) FULLWIDTH LATIN SMALL LETTER O → LATIN SMALL LETTER O # →ο→
+2134 ; 006F ;  ML      # ( ℴ → o ) SCRIPT SMALL O → LATIN SMALL LETTER O # 
+1D428 ;        006F ;  ML      # ( 𝐨 → o ) MATHEMATICAL BOLD SMALL O → LATIN SMALL LETTER O     # 
+1D45C ;        006F ;  ML      # ( 𝑜 → o ) MATHEMATICAL ITALIC SMALL O → LATIN SMALL LETTER O   # 
+1D490 ;        006F ;  ML      # ( 𝒐 → o ) MATHEMATICAL BOLD ITALIC SMALL O → LATIN SMALL LETTER O      # 
+1D4F8 ;        006F ;  ML      # ( 𝓸 → o ) MATHEMATICAL BOLD SCRIPT SMALL O → LATIN SMALL LETTER O      # 
+1D52C ;        006F ;  ML      # ( 𝔬 → o ) MATHEMATICAL FRAKTUR SMALL O → LATIN SMALL LETTER O  # 
+1D560 ;        006F ;  ML      # ( 𝕠 → o ) MATHEMATICAL DOUBLE-STRUCK SMALL O → LATIN SMALL LETTER O    # 
+1D594 ;        006F ;  ML      # ( 𝖔 → o ) MATHEMATICAL BOLD FRAKTUR SMALL O → LATIN SMALL LETTER O     # 
+1D5C8 ;        006F ;  ML      # ( 𝗈 → o ) MATHEMATICAL SANS-SERIF SMALL O → LATIN SMALL LETTER O       # 
+1D5FC ;        006F ;  ML      # ( 𝗼 → o ) MATHEMATICAL SANS-SERIF BOLD SMALL O → LATIN SMALL LETTER O  # 
+1D630 ;        006F ;  ML      # ( 𝘰 → o ) MATHEMATICAL SANS-SERIF ITALIC SMALL O → LATIN SMALL LETTER O        # 
+1D664 ;        006F ;  ML      # ( 𝙤 → o ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O → LATIN SMALL LETTER O   # 
+1D698 ;        006F ;  ML      # ( 𝚘 → o ) MATHEMATICAL MONOSPACE SMALL O → LATIN SMALL LETTER O        # 
+1D0F ; 006F ;  ML      # ( ᴏ → o ) LATIN LETTER SMALL CAPITAL O → LATIN SMALL LETTER O   # 
+1D11 ; 006F ;  ML      # ( ᴑ → o ) LATIN SMALL LETTER SIDEWAYS O → LATIN SMALL LETTER O  # 
+03BF ; 006F ;  ML      # ( ο → o ) GREEK SMALL LETTER OMICRON → LATIN SMALL LETTER O      # 
+1D6D0 ;        006F ;  ML      # ( 𝛐 → o ) MATHEMATICAL BOLD SMALL OMICRON → LATIN SMALL LETTER O       # →ο→
+1D70A ;        006F ;  ML      # ( 𝜊 → o ) MATHEMATICAL ITALIC SMALL OMICRON → LATIN SMALL LETTER O     # →ο→
+1D744 ;        006F ;  ML      # ( 𝝄 → o ) MATHEMATICAL BOLD ITALIC SMALL OMICRON → LATIN SMALL LETTER O        # →ο→
+1D77E ;        006F ;  ML      # ( 𝝾 → o ) MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON → LATIN SMALL LETTER O    # →ο→
+1D7B8 ;        006F ;  ML      # ( 𝞸 → o ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON → LATIN SMALL LETTER O     # →ο→
+03C3 ; 006F ;  ML      # ( σ → o ) GREEK SMALL LETTER SIGMA → LATIN SMALL LETTER O        # 
+1D6D4 ;        006F ;  ML      # ( 𝛔 → o ) MATHEMATICAL BOLD SMALL SIGMA → LATIN SMALL LETTER O # →σ→
+1D70E ;        006F ;  ML      # ( 𝜎 → o ) MATHEMATICAL ITALIC SMALL SIGMA → LATIN SMALL LETTER O       # →σ→
+1D748 ;        006F ;  ML      # ( 𝝈 → o ) MATHEMATICAL BOLD ITALIC SMALL SIGMA → LATIN SMALL LETTER O  # →σ→
+1D782 ;        006F ;  ML      # ( 𝞂 → o ) MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA → LATIN SMALL LETTER O      # →σ→
+1D7BC ;        006F ;  ML      # ( 𝞼 → o ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA → LATIN SMALL LETTER O       # →σ→
+2C9F ; 006F ;  ML      # ( ⲟ → o ) COPTIC SMALL LETTER O → LATIN SMALL LETTER O  # 
+043E ; 006F ;  ML      # ( о → o ) CYRILLIC SMALL LETTER O → LATIN SMALL LETTER O # 
+0585 ; 006F ;  ML      # ( օ → o ) ARMENIAN SMALL LETTER OH → LATIN SMALL LETTER O        # 
+05E1 ; 006F ;  ML      # ( ‎ס‎ → o ) HEBREW LETTER SAMEKH → LATIN SMALL LETTER O      # 
+101D ; 006F ;  ML      # ( ဝ → o ) MYANMAR LETTER WA → LATIN SMALL LETTER O      # 
+
+2070 ; 00BA ;  ML      #* ( ⁰ → º ) SUPERSCRIPT ZERO → MASCULINE ORDINAL INDICATOR      # 
+1D52 ; 00BA ;  ML      # ( ᵒ → º ) MODIFIER LETTER SMALL O → MASCULINE ORDINAL INDICATOR        # →⁰→
+
+01D2 ; 014F ;  ML      # ( ǒ → ŏ ) LATIN SMALL LETTER O WITH CARON → LATIN SMALL LETTER O WITH BREVE     # 
+
+0629 ; 00F6 ;  ML      # ( ‎ة‎ → ö ) ARABIC LETTER TEH MARBUTA → LATIN SMALL LETTER O WITH DIAERESIS # 
+FE94 ; 00F6 ;  ML      # ( ‎ﺔ‎ → ö ) ARABIC LETTER TEH MARBUTA FINAL FORM → LATIN SMALL LETTER O WITH DIAERESIS     # →‎ة‎→
+FE93 ; 00F6 ;  ML      # ( ‎ﺓ‎ → ö ) ARABIC LETTER TEH MARBUTA ISOLATED FORM → LATIN SMALL LETTER O WITH DIAERESIS  # →‎ة‎→
+06C3 ; 00F6 ;  ML      # ( ‎ۃ‎ → ö ) ARABIC LETTER TEH MARBUTA GOAL → LATIN SMALL LETTER O WITH DIAERESIS    # 
+
+00F8 ; 006F 0338 ;     ML      # ( ø → o̸ ) LATIN SMALL LETTER O WITH STROKE → LATIN SMALL LETTER O, COMBINING LONG SOLIDUS OVERLAY      # →o̷→
+
+0275 ; 006F 0335 ;     ML      # ( ɵ → o̵ ) LATIN SMALL LETTER BARRED O → LATIN SMALL LETTER O, COMBINING SHORT STROKE OVERLAY   # 
+04E9 ; 006F 0335 ;     ML      # ( ө → o̵ ) CYRILLIC SMALL LETTER BARRED O → LATIN SMALL LETTER O, COMBINING SHORT STROKE OVERLAY        # →ɵ→
+0473 ; 006F 0335 ;     ML      # ( ѳ → o̵ ) CYRILLIC SMALL LETTER FITA → LATIN SMALL LETTER O, COMBINING SHORT STROKE OVERLAY    # 
+
+01A1 ; 006F 0027 ;     ML      # ( ơ → o' ) LATIN SMALL LETTER O WITH HORN → LATIN SMALL LETTER O, APOSTROPHE     # →oʼ→
+
+0025 ; 00BA 002F 2080 2080 ;   ML      #* ( % → º/₀₀ ) PERCENT SIGN → MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO    # →‰→→⁰/₀₀→
+066A ; 00BA 002F 2080 2080 ;   ML      #* ( ٪ → º/₀₀ ) ARABIC PERCENT SIGN → MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO    # →%→→‰→→⁰/₀₀→
+2030 ; 00BA 002F 2080 2080 ;   ML      #* ( ‰ → º/₀₀ ) PER MILLE SIGN → MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO        # →⁰/₀₀→
+0609 ; 00BA 002F 2080 2080 ;   ML      #* ( ؉ → º/₀₀ ) ARABIC-INDIC PER MILLE SIGN → MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO    # →%→→‰→→⁰/₀₀→
+060A ; 00BA 002F 2080 2080 ;   ML      #* ( ؊ → º/₀₀ ) ARABIC-INDIC PER TEN THOUSAND SIGN → MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO     # →%→→‰→→⁰/₀₀→
+2052 ; 00BA 002F 2080 2080 ;   ML      #* ( ⁒ → º/₀₀ ) COMMERCIAL MINUS SIGN → MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO # →%→→‰→→⁰/₀₀→
+2100 ; 00BA 002F 2080 2080 ;   ML      #* ( ℀ → º/₀₀ ) ACCOUNT OF → MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO    # →%→→‰→→⁰/₀₀→
+2101 ; 00BA 002F 2080 2080 ;   ML      #* ( ℁ → º/₀₀ ) ADDRESSED TO THE SUBJECT → MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO      # →%→→‰→→⁰/₀₀→
+2105 ; 00BA 002F 2080 2080 ;   ML      #* ( ℅ → º/₀₀ ) CARE OF → MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO       # →%→→‰→→⁰/₀₀→
+2106 ; 00BA 002F 2080 2080 ;   ML      #* ( ℆ → º/₀₀ ) CADA UNA → MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO      # →%→→‰→→⁰/₀₀→
+
+2031 ; 00BA 002F 2080 2080 2080 ;      ML      #* ( ‱ → º/₀₀₀ ) PER TEN THOUSAND SIGN → MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO, SUBSCRIPT ZERO      # →⁰/₀₀₀→
+
+0153 ; 006F 0065 ;     ML      # ( œ → oe ) LATIN SMALL LIGATURE OE → LATIN SMALL LETTER O, LATIN SMALL LETTER E  # 
+
+0276 ; 006F 1D07 ;     ML      # ( ɶ → oᴇ ) LATIN LETTER SMALL CAPITAL OE → LATIN SMALL LETTER O, LATIN LETTER SMALL CAPITAL E  # 
+
+A74F ; 006F 006F ;     ML      # ( ꝏ → oo ) LATIN SMALL LETTER OO → LATIN SMALL LETTER O, LATIN SMALL LETTER O   # 
+
+2184 ; 0254 ;  ML      # ( ↄ → ɔ ) LATIN SMALL LETTER REVERSED C → LATIN SMALL LETTER OPEN O    # 
+1D10 ; 0254 ;  ML      # ( ᴐ → ɔ ) LATIN LETTER SMALL CAPITAL OPEN O → LATIN SMALL LETTER OPEN O        # 
+037B ; 0254 ;  ML      # ( ͻ → ɔ ) GREEK SMALL REVERSED LUNATE SIGMA SYMBOL → LATIN SMALL LETTER OPEN O  # 
+
+2374 ; 0070 ;  ML      #* ( ⍴ → p ) APL FUNCTIONAL SYMBOL RHO → LATIN SMALL LETTER P     # →ρ→
+FF50 ; 0070 ;  ML      # ( p → p ) FULLWIDTH LATIN SMALL LETTER P → LATIN SMALL LETTER P # →р→
+1D429 ;        0070 ;  ML      # ( 𝐩 → p ) MATHEMATICAL BOLD SMALL P → LATIN SMALL LETTER P     # 
+1D45D ;        0070 ;  ML      # ( 𝑝 → p ) MATHEMATICAL ITALIC SMALL P → LATIN SMALL LETTER P   # 
+1D491 ;        0070 ;  ML      # ( 𝒑 → p ) MATHEMATICAL BOLD ITALIC SMALL P → LATIN SMALL LETTER P      # 
+1D4C5 ;        0070 ;  ML      # ( 𝓅 → p ) MATHEMATICAL SCRIPT SMALL P → LATIN SMALL LETTER P   # 
+1D4F9 ;        0070 ;  ML      # ( 𝓹 → p ) MATHEMATICAL BOLD SCRIPT SMALL P → LATIN SMALL LETTER P      # 
+1D52D ;        0070 ;  ML      # ( 𝔭 → p ) MATHEMATICAL FRAKTUR SMALL P → LATIN SMALL LETTER P  # 
+1D561 ;        0070 ;  ML      # ( 𝕡 → p ) MATHEMATICAL DOUBLE-STRUCK SMALL P → LATIN SMALL LETTER P    # 
+1D595 ;        0070 ;  ML      # ( 𝖕 → p ) MATHEMATICAL BOLD FRAKTUR SMALL P → LATIN SMALL LETTER P     # 
+1D5C9 ;        0070 ;  ML      # ( 𝗉 → p ) MATHEMATICAL SANS-SERIF SMALL P → LATIN SMALL LETTER P       # 
+1D5FD ;        0070 ;  ML      # ( 𝗽 → p ) MATHEMATICAL SANS-SERIF BOLD SMALL P → LATIN SMALL LETTER P  # 
+1D631 ;        0070 ;  ML      # ( 𝘱 → p ) MATHEMATICAL SANS-SERIF ITALIC SMALL P → LATIN SMALL LETTER P        # 
+1D665 ;        0070 ;  ML      # ( 𝙥 → p ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P → LATIN SMALL LETTER P   # 
+1D699 ;        0070 ;  ML      # ( 𝚙 → p ) MATHEMATICAL MONOSPACE SMALL P → LATIN SMALL LETTER P        # 
+03C1 ; 0070 ;  ML      # ( ρ → p ) GREEK SMALL LETTER RHO → LATIN SMALL LETTER P  # 
+1D6D2 ;        0070 ;  ML      # ( 𝛒 → p ) MATHEMATICAL BOLD SMALL RHO → LATIN SMALL LETTER P   # →ρ→
+1D6E0 ;        0070 ;  ML      # ( 𝛠 → p ) MATHEMATICAL BOLD RHO SYMBOL → LATIN SMALL LETTER P  # →ρ→
+1D70C ;        0070 ;  ML      # ( 𝜌 → p ) MATHEMATICAL ITALIC SMALL RHO → LATIN SMALL LETTER P # →ρ→
+1D71A ;        0070 ;  ML      # ( 𝜚 → p ) MATHEMATICAL ITALIC RHO SYMBOL → LATIN SMALL LETTER P        # →ρ→
+1D746 ;        0070 ;  ML      # ( 𝝆 → p ) MATHEMATICAL BOLD ITALIC SMALL RHO → LATIN SMALL LETTER P    # →ρ→
+1D754 ;        0070 ;  ML      # ( 𝝔 → p ) MATHEMATICAL BOLD ITALIC RHO SYMBOL → LATIN SMALL LETTER P   # →ρ→
+1D780 ;        0070 ;  ML      # ( 𝞀 → p ) MATHEMATICAL SANS-SERIF BOLD SMALL RHO → LATIN SMALL LETTER P        # →ρ→
+1D78E ;        0070 ;  ML      # ( 𝞎 → p ) MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL → LATIN SMALL LETTER P       # →ρ→
+1D7BA ;        0070 ;  ML      # ( 𝞺 → p ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO → LATIN SMALL LETTER P # →ρ→
+1D7C8 ;        0070 ;  ML      # ( 𝟈 → p ) MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL → LATIN SMALL LETTER P        # →ρ→
+2CA3 ; 0070 ;  ML      # ( ⲣ → p ) COPTIC SMALL LETTER RO → LATIN SMALL LETTER P # →ρ→
+0440 ; 0070 ;  ML      # ( р → p ) CYRILLIC SMALL LETTER ER → LATIN SMALL LETTER P        # 
+
+01A5 ; 0070 0314 ;     ML      # ( ƥ → p̔ ) LATIN SMALL LETTER P WITH HOOK → LATIN SMALL LETTER P, COMBINING REVERSED COMMA ABOVE        # 
+
+1477 ; 0070 00B7 ;     ML      # ( ᑷ → p· ) CANADIAN SYLLABICS WEST-CREE KWI → LATIN SMALL LETTER P, MIDDLE DOT # →pᐧ→
+
+1D29 ; 1D18 ;  ML      # ( ᴩ → ᴘ ) GREEK LETTER SMALL CAPITAL RHO → LATIN LETTER SMALL CAPITAL P       # 
+
+03C6 ; 0278 ;  ML      # ( φ → ɸ ) GREEK SMALL LETTER PHI → LATIN SMALL LETTER PHI       # 
+1D6D7 ;        0278 ;  ML      # ( 𝛗 → ɸ ) MATHEMATICAL BOLD SMALL PHI → LATIN SMALL LETTER PHI        # →φ→
+1D6DF ;        0278 ;  ML      # ( 𝛟 → ɸ ) MATHEMATICAL BOLD PHI SYMBOL → LATIN SMALL LETTER PHI       # →φ→
+1D711 ;        0278 ;  ML      # ( 𝜑 → ɸ ) MATHEMATICAL ITALIC SMALL PHI → LATIN SMALL LETTER PHI      # →φ→
+1D719 ;        0278 ;  ML      # ( 𝜙 → ɸ ) MATHEMATICAL ITALIC PHI SYMBOL → LATIN SMALL LETTER PHI     # →φ→
+1D74B ;        0278 ;  ML      # ( 𝝋 → ɸ ) MATHEMATICAL BOLD ITALIC SMALL PHI → LATIN SMALL LETTER PHI # →φ→
+1D753 ;        0278 ;  ML      # ( 𝝓 → ɸ ) MATHEMATICAL BOLD ITALIC PHI SYMBOL → LATIN SMALL LETTER PHI        # →φ→
+1D785 ;        0278 ;  ML      # ( 𝞅 → ɸ ) MATHEMATICAL SANS-SERIF BOLD SMALL PHI → LATIN SMALL LETTER PHI     # →φ→
+1D78D ;        0278 ;  ML      # ( 𝞍 → ɸ ) MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL → LATIN SMALL LETTER PHI    # →φ→
+1D7BF ;        0278 ;  ML      # ( 𝞿 → ɸ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI → LATIN SMALL LETTER PHI      # →φ→
+1D7C7 ;        0278 ;  ML      # ( 𝟇 → ɸ ) MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL → LATIN SMALL LETTER PHI     # →φ→
+2CAB ; 0278 ;  ML      # ( ⲫ → ɸ ) COPTIC SMALL LETTER FI → LATIN SMALL LETTER PHI      # →ϕ→
+0444 ; 0278 ;  ML      # ( ф → ɸ ) CYRILLIC SMALL LETTER EF → LATIN SMALL LETTER PHI     # 
+
+1D42A ;        0071 ;  ML      # ( 𝐪 → q ) MATHEMATICAL BOLD SMALL Q → LATIN SMALL LETTER Q     # 
+1D45E ;        0071 ;  ML      # ( 𝑞 → q ) MATHEMATICAL ITALIC SMALL Q → LATIN SMALL LETTER Q   # 
+1D492 ;        0071 ;  ML      # ( 𝒒 → q ) MATHEMATICAL BOLD ITALIC SMALL Q → LATIN SMALL LETTER Q      # 
+1D4C6 ;        0071 ;  ML      # ( 𝓆 → q ) MATHEMATICAL SCRIPT SMALL Q → LATIN SMALL LETTER Q   # 
+1D4FA ;        0071 ;  ML      # ( 𝓺 → q ) MATHEMATICAL BOLD SCRIPT SMALL Q → LATIN SMALL LETTER Q      # 
+1D52E ;        0071 ;  ML      # ( 𝔮 → q ) MATHEMATICAL FRAKTUR SMALL Q → LATIN SMALL LETTER Q  # 
+1D562 ;        0071 ;  ML      # ( 𝕢 → q ) MATHEMATICAL DOUBLE-STRUCK SMALL Q → LATIN SMALL LETTER Q    # 
+1D596 ;        0071 ;  ML      # ( 𝖖 → q ) MATHEMATICAL BOLD FRAKTUR SMALL Q → LATIN SMALL LETTER Q     # 
+1D5CA ;        0071 ;  ML      # ( 𝗊 → q ) MATHEMATICAL SANS-SERIF SMALL Q → LATIN SMALL LETTER Q       # 
+1D5FE ;        0071 ;  ML      # ( 𝗾 → q ) MATHEMATICAL SANS-SERIF BOLD SMALL Q → LATIN SMALL LETTER Q  # 
+1D632 ;        0071 ;  ML      # ( 𝘲 → q ) MATHEMATICAL SANS-SERIF ITALIC SMALL Q → LATIN SMALL LETTER Q        # 
+1D666 ;        0071 ;  ML      # ( 𝙦 → q ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q → LATIN SMALL LETTER Q   # 
+1D69A ;        0071 ;  ML      # ( 𝚚 → q ) MATHEMATICAL MONOSPACE SMALL Q → LATIN SMALL LETTER Q        # 
+051B ; 0071 ;  ML      # ( ԛ → q ) CYRILLIC SMALL LETTER QA → LATIN SMALL LETTER Q        # 
+0563 ; 0071 ;  ML      # ( գ → q ) ARMENIAN SMALL LETTER GIM → LATIN SMALL LETTER Q       # 
+0566 ; 0071 ;  ML      # ( զ → q ) ARMENIAN SMALL LETTER ZA → LATIN SMALL LETTER Q        # 
+
+1D410 ;        211A ;  ML      # ( 𝐐 → ℚ ) MATHEMATICAL BOLD CAPITAL Q → DOUBLE-STRUCK CAPITAL Q      # →Q→
+1D444 ;        211A ;  ML      # ( 𝑄 → ℚ ) MATHEMATICAL ITALIC CAPITAL Q → DOUBLE-STRUCK CAPITAL Q    # →Q→
+1D478 ;        211A ;  ML      # ( 𝑸 → ℚ ) MATHEMATICAL BOLD ITALIC CAPITAL Q → DOUBLE-STRUCK CAPITAL Q       # →Q→
+1D4AC ;        211A ;  ML      # ( 𝒬 → ℚ ) MATHEMATICAL SCRIPT CAPITAL Q → DOUBLE-STRUCK CAPITAL Q    # →Q→
+1D4E0 ;        211A ;  ML      # ( 𝓠 → ℚ ) MATHEMATICAL BOLD SCRIPT CAPITAL Q → DOUBLE-STRUCK CAPITAL Q       # →Q→
+1D514 ;        211A ;  ML      # ( 𝔔 → ℚ ) MATHEMATICAL FRAKTUR CAPITAL Q → DOUBLE-STRUCK CAPITAL Q   # →Q→
+1D57C ;        211A ;  ML      # ( 𝕼 → ℚ ) MATHEMATICAL BOLD FRAKTUR CAPITAL Q → DOUBLE-STRUCK CAPITAL Q      # →Q→
+1D5B0 ;        211A ;  ML      # ( 𝖰 → ℚ ) MATHEMATICAL SANS-SERIF CAPITAL Q → DOUBLE-STRUCK CAPITAL Q        # →Q→
+1D5E4 ;        211A ;  ML      # ( 𝗤 → ℚ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL Q → DOUBLE-STRUCK CAPITAL Q   # →Q→
+1D618 ;        211A ;  ML      # ( 𝘘 → ℚ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q → DOUBLE-STRUCK CAPITAL Q # →Q→
+1D64C ;        211A ;  ML      # ( 𝙌 → ℚ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q → DOUBLE-STRUCK CAPITAL Q    # →Q→
+1D680 ;        211A ;  ML      # ( 𝚀 → ℚ ) MATHEMATICAL MONOSPACE CAPITAL Q → DOUBLE-STRUCK CAPITAL Q # →Q→
+
+02A0 ; 0071 0314 ;     ML      # ( ʠ → q̔ ) LATIN SMALL LETTER Q WITH HOOK → LATIN SMALL LETTER Q, COMBINING REVERSED COMMA ABOVE        # 
+
+1D42B ;        0072 ;  ML      # ( 𝐫 → r ) MATHEMATICAL BOLD SMALL R → LATIN SMALL LETTER R     # 
+1D45F ;        0072 ;  ML      # ( 𝑟 → r ) MATHEMATICAL ITALIC SMALL R → LATIN SMALL LETTER R   # 
+1D493 ;        0072 ;  ML      # ( 𝒓 → r ) MATHEMATICAL BOLD ITALIC SMALL R → LATIN SMALL LETTER R      # 
+1D4C7 ;        0072 ;  ML      # ( 𝓇 → r ) MATHEMATICAL SCRIPT SMALL R → LATIN SMALL LETTER R   # 
+1D4FB ;        0072 ;  ML      # ( 𝓻 → r ) MATHEMATICAL BOLD SCRIPT SMALL R → LATIN SMALL LETTER R      # 
+1D52F ;        0072 ;  ML      # ( 𝔯 → r ) MATHEMATICAL FRAKTUR SMALL R → LATIN SMALL LETTER R  # 
+1D563 ;        0072 ;  ML      # ( 𝕣 → r ) MATHEMATICAL DOUBLE-STRUCK SMALL R → LATIN SMALL LETTER R    # 
+1D597 ;        0072 ;  ML      # ( 𝖗 → r ) MATHEMATICAL BOLD FRAKTUR SMALL R → LATIN SMALL LETTER R     # 
+1D5CB ;        0072 ;  ML      # ( 𝗋 → r ) MATHEMATICAL SANS-SERIF SMALL R → LATIN SMALL LETTER R       # 
+1D5FF ;        0072 ;  ML      # ( 𝗿 → r ) MATHEMATICAL SANS-SERIF BOLD SMALL R → LATIN SMALL LETTER R  # 
+1D633 ;        0072 ;  ML      # ( 𝘳 → r ) MATHEMATICAL SANS-SERIF ITALIC SMALL R → LATIN SMALL LETTER R        # 
+1D667 ;        0072 ;  ML      # ( 𝙧 → r ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R → LATIN SMALL LETTER R   # 
+1D69B ;        0072 ;  ML      # ( 𝚛 → r ) MATHEMATICAL MONOSPACE SMALL R → LATIN SMALL LETTER R        # 
+1D26 ; 0072 ;  ML      # ( ᴦ → r ) GREEK LETTER SMALL CAPITAL GAMMA → LATIN SMALL LETTER R       # →г→
+2C85 ; 0072 ;  ML      # ( ⲅ → r ) COPTIC SMALL LETTER GAMMA → LATIN SMALL LETTER R      # →г→
+0433 ; 0072 ;  ML      # ( г → r ) CYRILLIC SMALL LETTER GHE → LATIN SMALL LETTER R       # 
+
+027D ; 0072 0328 ;     ML      # ( ɽ → r̨ ) LATIN SMALL LETTER R WITH TAIL → LATIN SMALL LETTER R, COMBINING OGONEK      # 
+
+027C ; 0072 0329 ;     ML      # ( ɼ → r̩ ) LATIN SMALL LETTER R WITH LONG LEG → LATIN SMALL LETTER R, COMBINING VERTICAL LINE BELOW     # 
+
+0493 ; 0072 0335 ;     ML      # ( ғ → r̵ ) CYRILLIC SMALL LETTER GHE WITH STROKE → LATIN SMALL LETTER R, COMBINING SHORT STROKE OVERLAY # →г̵→
+
+006D ; 0072 006E ;     ML      # ( m → rn ) LATIN SMALL LETTER M → LATIN SMALL LETTER R, LATIN SMALL LETTER N      # 
+217F ; 0072 006E ;     ML      # ( ⅿ → rn ) SMALL ROMAN NUMERAL ONE THOUSAND → LATIN SMALL LETTER R, LATIN SMALL LETTER N        # →m→
+1D426 ;        0072 006E ;     ML      # ( 𝐦 → rn ) MATHEMATICAL BOLD SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N      # →m→
+1D45A ;        0072 006E ;     ML      # ( 𝑚 → rn ) MATHEMATICAL ITALIC SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N    # →m→
+1D48E ;        0072 006E ;     ML      # ( 𝒎 → rn ) MATHEMATICAL BOLD ITALIC SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N       # →m→
+1D4C2 ;        0072 006E ;     ML      # ( 𝓂 → rn ) MATHEMATICAL SCRIPT SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N    # →m→
+1D4F6 ;        0072 006E ;     ML      # ( 𝓶 → rn ) MATHEMATICAL BOLD SCRIPT SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N       # →m→
+1D52A ;        0072 006E ;     ML      # ( 𝔪 → rn ) MATHEMATICAL FRAKTUR SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N   # →m→
+1D55E ;        0072 006E ;     ML      # ( 𝕞 → rn ) MATHEMATICAL DOUBLE-STRUCK SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N     # →m→
+1D592 ;        0072 006E ;     ML      # ( 𝖒 → rn ) MATHEMATICAL BOLD FRAKTUR SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N      # →m→
+1D5C6 ;        0072 006E ;     ML      # ( 𝗆 → rn ) MATHEMATICAL SANS-SERIF SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N        # →m→
+1D5FA ;        0072 006E ;     ML      # ( 𝗺 → rn ) MATHEMATICAL SANS-SERIF BOLD SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N   # →m→
+1D62E ;        0072 006E ;     ML      # ( 𝘮 → rn ) MATHEMATICAL SANS-SERIF ITALIC SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N # →m→
+1D662 ;        0072 006E ;     ML      # ( 𝙢 → rn ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N    # →m→
+1D696 ;        0072 006E ;     ML      # ( 𝚖 → rn ) MATHEMATICAL MONOSPACE SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N # →m→
+028D ; 0072 006E ;     ML      # ( ʍ → rn ) LATIN SMALL LETTER TURNED W → LATIN SMALL LETTER R, LATIN SMALL LETTER N      # →m→
+
+0271 ; 0072 006E 0326 ;        ML      # ( ɱ → rn̦ ) LATIN SMALL LETTER M WITH HOOK → LATIN SMALL LETTER R, LATIN SMALL LETTER N, COMBINING COMMA BELOW  # →m̡→
+
+0491 ; 0072 144A ;     ML      # ( ґ → rᑊ ) CYRILLIC SMALL LETTER GHE WITH UPTURN → LATIN SMALL LETTER R, CANADIAN SYLLABICS WEST-CREE P        # →гˈ→
+
+044F ; 1D19 ;  ML      # ( я → ᴙ ) CYRILLIC SMALL LETTER YA → LATIN LETTER SMALL CAPITAL REVERSED R     # 
+
+A4E4 ; 1D1A ;  ML      # ( ꓤ → ᴚ ) LISU LETTER ZA → LATIN LETTER SMALL CAPITAL TURNED R        # 
+
+2129 ; 027F ;  ML      #* ( ℩ → ɿ ) TURNED GREEK SMALL LETTER IOTA → LATIN SMALL LETTER REVERSED R WITH FISHHOOK        # 
+
+FF53 ; 0073 ;  ML      # ( s → s ) FULLWIDTH LATIN SMALL LETTER S → LATIN SMALL LETTER S # →ѕ→
+1D42C ;        0073 ;  ML      # ( 𝐬 → s ) MATHEMATICAL BOLD SMALL S → LATIN SMALL LETTER S     # 
+1D460 ;        0073 ;  ML      # ( 𝑠 → s ) MATHEMATICAL ITALIC SMALL S → LATIN SMALL LETTER S   # 
+1D494 ;        0073 ;  ML      # ( 𝒔 → s ) MATHEMATICAL BOLD ITALIC SMALL S → LATIN SMALL LETTER S      # 
+1D4C8 ;        0073 ;  ML      # ( 𝓈 → s ) MATHEMATICAL SCRIPT SMALL S → LATIN SMALL LETTER S   # 
+1D4FC ;        0073 ;  ML      # ( 𝓼 → s ) MATHEMATICAL BOLD SCRIPT SMALL S → LATIN SMALL LETTER S      # 
+1D530 ;        0073 ;  ML      # ( 𝔰 → s ) MATHEMATICAL FRAKTUR SMALL S → LATIN SMALL LETTER S  # 
+1D564 ;        0073 ;  ML      # ( 𝕤 → s ) MATHEMATICAL DOUBLE-STRUCK SMALL S → LATIN SMALL LETTER S    # 
+1D598 ;        0073 ;  ML      # ( 𝖘 → s ) MATHEMATICAL BOLD FRAKTUR SMALL S → LATIN SMALL LETTER S     # 
+1D5CC ;        0073 ;  ML      # ( 𝗌 → s ) MATHEMATICAL SANS-SERIF SMALL S → LATIN SMALL LETTER S       # 
+1D600 ;        0073 ;  ML      # ( 𝘀 → s ) MATHEMATICAL SANS-SERIF BOLD SMALL S → LATIN SMALL LETTER S  # 
+1D634 ;        0073 ;  ML      # ( 𝘴 → s ) MATHEMATICAL SANS-SERIF ITALIC SMALL S → LATIN SMALL LETTER S        # 
+1D668 ;        0073 ;  ML      # ( 𝙨 → s ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S → LATIN SMALL LETTER S   # 
+1D69C ;        0073 ;  ML      # ( 𝚜 → s ) MATHEMATICAL MONOSPACE SMALL S → LATIN SMALL LETTER S        # 
+A731 ; 0073 ;  ML      # ( ꜱ → s ) LATIN LETTER SMALL CAPITAL S → LATIN SMALL LETTER S   # 
+01BD ; 0073 ;  ML      # ( ƽ → s ) LATIN SMALL LETTER TONE FIVE → LATIN SMALL LETTER S    # 
+0455 ; 0073 ;  ML      # ( ѕ → s ) CYRILLIC SMALL LETTER DZE → LATIN SMALL LETTER S       # 
+
+0282 ; 0073 0328 ;     ML      # ( ʂ → s̨ ) LATIN SMALL LETTER S WITH HOOK → LATIN SMALL LETTER S, COMBINING OGONEK      # 
+
+222B ; 0283 ;  ML      #* ( ∫ → ʃ ) INTEGRAL → LATIN SMALL LETTER ESH   # 
+
+222C ; 0283 0283 ;     ML      #* ( ∬ → ʃʃ ) DOUBLE INTEGRAL → LATIN SMALL LETTER ESH, LATIN SMALL LETTER ESH  # →∫∫→
+
+222D ; 0283 0283 0283 ;        ML      #* ( ∭ → ʃʃʃ ) TRIPLE INTEGRAL → LATIN SMALL LETTER ESH, LATIN SMALL LETTER ESH, LATIN SMALL LETTER ESH        # →∫∫∫→
+
+2A0C ; 0283 0283 0283 0283 ;   ML      #* ( ⨌ → ʃʃʃʃ ) QUADRUPLE INTEGRAL OPERATOR → LATIN SMALL LETTER ESH, LATIN SMALL LETTER ESH, LATIN SMALL LETTER ESH, LATIN SMALL LETTER ESH  # →∫∫∫∫→
+
+1D42D ;        0074 ;  ML      # ( 𝐭 → t ) MATHEMATICAL BOLD SMALL T → LATIN SMALL LETTER T     # 
+1D461 ;        0074 ;  ML      # ( 𝑡 → t ) MATHEMATICAL ITALIC SMALL T → LATIN SMALL LETTER T   # 
+1D495 ;        0074 ;  ML      # ( 𝒕 → t ) MATHEMATICAL BOLD ITALIC SMALL T → LATIN SMALL LETTER T      # 
+1D4C9 ;        0074 ;  ML      # ( 𝓉 → t ) MATHEMATICAL SCRIPT SMALL T → LATIN SMALL LETTER T   # 
+1D4FD ;        0074 ;  ML      # ( 𝓽 → t ) MATHEMATICAL BOLD SCRIPT SMALL T → LATIN SMALL LETTER T      # 
+1D531 ;        0074 ;  ML      # ( 𝔱 → t ) MATHEMATICAL FRAKTUR SMALL T → LATIN SMALL LETTER T  # 
+1D565 ;        0074 ;  ML      # ( 𝕥 → t ) MATHEMATICAL DOUBLE-STRUCK SMALL T → LATIN SMALL LETTER T    # 
+1D599 ;        0074 ;  ML      # ( 𝖙 → t ) MATHEMATICAL BOLD FRAKTUR SMALL T → LATIN SMALL LETTER T     # 
+1D5CD ;        0074 ;  ML      # ( 𝗍 → t ) MATHEMATICAL SANS-SERIF SMALL T → LATIN SMALL LETTER T       # 
+1D601 ;        0074 ;  ML      # ( 𝘁 → t ) MATHEMATICAL SANS-SERIF BOLD SMALL T → LATIN SMALL LETTER T  # 
+1D635 ;        0074 ;  ML      # ( 𝘵 → t ) MATHEMATICAL SANS-SERIF ITALIC SMALL T → LATIN SMALL LETTER T        # 
+1D669 ;        0074 ;  ML      # ( 𝙩 → t ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T → LATIN SMALL LETTER T   # 
+1D69D ;        0074 ;  ML      # ( 𝚝 → t ) MATHEMATICAL MONOSPACE SMALL T → LATIN SMALL LETTER T        # 
+1D1B ; 0074 ;  ML      # ( ᴛ → t ) LATIN LETTER SMALL CAPITAL T → LATIN SMALL LETTER T   # →т→→τ→
+03C4 ; 0074 ;  ML      # ( τ → t ) GREEK SMALL LETTER TAU → LATIN SMALL LETTER T  # 
+1D6D5 ;        0074 ;  ML      # ( 𝛕 → t ) MATHEMATICAL BOLD SMALL TAU → LATIN SMALL LETTER T   # →τ→
+1D70F ;        0074 ;  ML      # ( 𝜏 → t ) MATHEMATICAL ITALIC SMALL TAU → LATIN SMALL LETTER T # →τ→
+1D749 ;        0074 ;  ML      # ( 𝝉 → t ) MATHEMATICAL BOLD ITALIC SMALL TAU → LATIN SMALL LETTER T    # →τ→
+1D783 ;        0074 ;  ML      # ( 𝞃 → t ) MATHEMATICAL SANS-SERIF BOLD SMALL TAU → LATIN SMALL LETTER T        # →τ→
+1D7BD ;        0074 ;  ML      # ( 𝞽 → t ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU → LATIN SMALL LETTER T # →τ→
+0442 ; 0074 ;  ML      # ( т → t ) CYRILLIC SMALL LETTER TE → LATIN SMALL LETTER T        # →τ→
+
+01AD ; 0074 0314 ;     ML      # ( ƭ → t̔ ) LATIN SMALL LETTER T WITH HOOK → LATIN SMALL LETTER T, COMBINING REVERSED COMMA ABOVE        # 
+
+021B ; 0163 ;  ML      # ( ț → ţ ) LATIN SMALL LETTER T WITH COMMA BELOW → LATIN SMALL LETTER T WITH CEDILLA     # 
+01AB ; 0163 ;  ML      # ( ƫ → ţ ) LATIN SMALL LETTER T WITH PALATAL HOOK → LATIN SMALL LETTER T WITH CEDILLA    # 
+
+04AD ; 0074 0329 ;     ML      # ( ҭ → t̩ ) CYRILLIC SMALL LETTER TE WITH DESCENDER → LATIN SMALL LETTER T, COMBINING VERTICAL LINE BELOW        # →т̩→
+
+0167 ; 0074 0335 ;     ML      # ( ŧ → t̵ ) LATIN SMALL LETTER T WITH STROKE → LATIN SMALL LETTER T, COMBINING SHORT STROKE OVERLAY      # 
+
+02A8 ; 0074 0255 ;     ML      # ( ʨ → tɕ ) LATIN SMALL LETTER TC DIGRAPH WITH CURL → LATIN SMALL LETTER T, LATIN SMALL LETTER C WITH CURL       # 
+
+A777 ; 0074 0066 ;     ML      # ( ꝷ → tf ) LATIN SMALL LETTER TUM → LATIN SMALL LETTER T, LATIN SMALL LETTER F  # 
+
+02A6 ; 0074 0073 ;     ML      # ( ʦ → ts ) LATIN SMALL LETTER TS DIGRAPH → LATIN SMALL LETTER T, LATIN SMALL LETTER S    # 
+
+02A7 ; 0074 0283 ;     ML      # ( ʧ → tʃ ) LATIN SMALL LETTER TESH DIGRAPH → LATIN SMALL LETTER T, LATIN SMALL LETTER ESH       # 
+
+A729 ; 0074 021D ;     ML      # ( ꜩ → tȝ ) LATIN SMALL LETTER TZ → LATIN SMALL LETTER T, LATIN SMALL LETTER YOGH       # 
+
+1D42E ;        0075 ;  ML      # ( 𝐮 → u ) MATHEMATICAL BOLD SMALL U → LATIN SMALL LETTER U     # 
+1D462 ;        0075 ;  ML      # ( 𝑢 → u ) MATHEMATICAL ITALIC SMALL U → LATIN SMALL LETTER U   # 
+1D496 ;        0075 ;  ML      # ( 𝒖 → u ) MATHEMATICAL BOLD ITALIC SMALL U → LATIN SMALL LETTER U      # 
+1D4CA ;        0075 ;  ML      # ( 𝓊 → u ) MATHEMATICAL SCRIPT SMALL U → LATIN SMALL LETTER U   # 
+1D4FE ;        0075 ;  ML      # ( 𝓾 → u ) MATHEMATICAL BOLD SCRIPT SMALL U → LATIN SMALL LETTER U      # 
+1D532 ;        0075 ;  ML      # ( 𝔲 → u ) MATHEMATICAL FRAKTUR SMALL U → LATIN SMALL LETTER U  # 
+1D566 ;        0075 ;  ML      # ( 𝕦 → u ) MATHEMATICAL DOUBLE-STRUCK SMALL U → LATIN SMALL LETTER U    # 
+1D59A ;        0075 ;  ML      # ( 𝖚 → u ) MATHEMATICAL BOLD FRAKTUR SMALL U → LATIN SMALL LETTER U     # 
+1D5CE ;        0075 ;  ML      # ( 𝗎 → u ) MATHEMATICAL SANS-SERIF SMALL U → LATIN SMALL LETTER U       # 
+1D602 ;        0075 ;  ML      # ( 𝘂 → u ) MATHEMATICAL SANS-SERIF BOLD SMALL U → LATIN SMALL LETTER U  # 
+1D636 ;        0075 ;  ML      # ( 𝘶 → u ) MATHEMATICAL SANS-SERIF ITALIC SMALL U → LATIN SMALL LETTER U        # 
+1D66A ;        0075 ;  ML      # ( 𝙪 → u ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U → LATIN SMALL LETTER U   # 
+1D69E ;        0075 ;  ML      # ( 𝚞 → u ) MATHEMATICAL MONOSPACE SMALL U → LATIN SMALL LETTER U        # 
+1D1C ; 0075 ;  ML      # ( ᴜ → u ) LATIN LETTER SMALL CAPITAL U → LATIN SMALL LETTER U   # 
+028B ; 0075 ;  ML      # ( ʋ → u ) LATIN SMALL LETTER V WITH HOOK → LATIN SMALL LETTER U  # 
+03C5 ; 0075 ;  ML      # ( υ → u ) GREEK SMALL LETTER UPSILON → LATIN SMALL LETTER U      # →ʋ→
+1D6D6 ;        0075 ;  ML      # ( 𝛖 → u ) MATHEMATICAL BOLD SMALL UPSILON → LATIN SMALL LETTER U       # →υ→→ʋ→
+1D710 ;        0075 ;  ML      # ( 𝜐 → u ) MATHEMATICAL ITALIC SMALL UPSILON → LATIN SMALL LETTER U     # →υ→→ʋ→
+1D74A ;        0075 ;  ML      # ( 𝝊 → u ) MATHEMATICAL BOLD ITALIC SMALL UPSILON → LATIN SMALL LETTER U        # →υ→→ʋ→
+1D784 ;        0075 ;  ML      # ( 𝞄 → u ) MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON → LATIN SMALL LETTER U    # →υ→→ʋ→
+1D7BE ;        0075 ;  ML      # ( 𝞾 → u ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON → LATIN SMALL LETTER U     # →υ→→ʋ→
+0446 ; 0075 ;  ML      # ( ц → u ) CYRILLIC SMALL LETTER TSE → LATIN SMALL LETTER U       # 
+057D ; 0075 ;  ML      # ( ս → u ) ARMENIAN SMALL LETTER SEH → LATIN SMALL LETTER U       # 
+
+01D4 ; 016D ;  ML      # ( ǔ → ŭ ) LATIN SMALL LETTER U WITH CARON → LATIN SMALL LETTER U WITH BREVE     # 
+
+057A ; 0270 ;  ML      # ( պ → ɰ ) ARMENIAN SMALL LETTER PEH → LATIN SMALL LETTER TURNED M WITH LONG LEG # 
+
+2228 ; 0076 ;  ML      #* ( ∨ → v ) LOGICAL OR → LATIN SMALL LETTER V    # 
+22C1 ; 0076 ;  ML      #* ( ⋁ → v ) N-ARY LOGICAL OR → LATIN SMALL LETTER V      # →∨→
+FF56 ; 0076 ;  ML      # ( v → v ) FULLWIDTH LATIN SMALL LETTER V → LATIN SMALL LETTER V # →ν→
+2174 ; 0076 ;  ML      # ( ⅴ → v ) SMALL ROMAN NUMERAL FIVE → LATIN SMALL LETTER V       # 
+1D42F ;        0076 ;  ML      # ( 𝐯 → v ) MATHEMATICAL BOLD SMALL V → LATIN SMALL LETTER V     # 
+1D463 ;        0076 ;  ML      # ( 𝑣 → v ) MATHEMATICAL ITALIC SMALL V → LATIN SMALL LETTER V   # 
+1D497 ;        0076 ;  ML      # ( 𝒗 → v ) MATHEMATICAL BOLD ITALIC SMALL V → LATIN SMALL LETTER V      # 
+1D4CB ;        0076 ;  ML      # ( 𝓋 → v ) MATHEMATICAL SCRIPT SMALL V → LATIN SMALL LETTER V   # 
+1D4FF ;        0076 ;  ML      # ( 𝓿 → v ) MATHEMATICAL BOLD SCRIPT SMALL V → LATIN SMALL LETTER V      # 
+1D533 ;        0076 ;  ML      # ( 𝔳 → v ) MATHEMATICAL FRAKTUR SMALL V → LATIN SMALL LETTER V  # 
+1D567 ;        0076 ;  ML      # ( 𝕧 → v ) MATHEMATICAL DOUBLE-STRUCK SMALL V → LATIN SMALL LETTER V    # 
+1D59B ;        0076 ;  ML      # ( 𝖛 → v ) MATHEMATICAL BOLD FRAKTUR SMALL V → LATIN SMALL LETTER V     # 
+1D5CF ;        0076 ;  ML      # ( 𝗏 → v ) MATHEMATICAL SANS-SERIF SMALL V → LATIN SMALL LETTER V       # 
+1D603 ;        0076 ;  ML      # ( 𝘃 → v ) MATHEMATICAL SANS-SERIF BOLD SMALL V → LATIN SMALL LETTER V  # 
+1D637 ;        0076 ;  ML      # ( 𝘷 → v ) MATHEMATICAL SANS-SERIF ITALIC SMALL V → LATIN SMALL LETTER V        # 
+1D66B ;        0076 ;  ML      # ( 𝙫 → v ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V → LATIN SMALL LETTER V   # 
+1D69F ;        0076 ;  ML      # ( 𝚟 → v ) MATHEMATICAL MONOSPACE SMALL V → LATIN SMALL LETTER V        # 
+1D20 ; 0076 ;  ML      # ( ᴠ → v ) LATIN LETTER SMALL CAPITAL V → LATIN SMALL LETTER V   # 
+03BD ; 0076 ;  ML      # ( ν → v ) GREEK SMALL LETTER NU → LATIN SMALL LETTER V   # 
+1D6CE ;        0076 ;  ML      # ( 𝛎 → v ) MATHEMATICAL BOLD SMALL NU → LATIN SMALL LETTER V    # →ν→
+1D708 ;        0076 ;  ML      # ( 𝜈 → v ) MATHEMATICAL ITALIC SMALL NU → LATIN SMALL LETTER V  # →ν→
+1D742 ;        0076 ;  ML      # ( 𝝂 → v ) MATHEMATICAL BOLD ITALIC SMALL NU → LATIN SMALL LETTER V     # →ν→
+1D77C ;        0076 ;  ML      # ( 𝝼 → v ) MATHEMATICAL SANS-SERIF BOLD SMALL NU → LATIN SMALL LETTER V # →ν→
+1D7B6 ;        0076 ;  ML      # ( 𝞶 → v ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU → LATIN SMALL LETTER V  # →ν→
+0475 ; 0076 ;  ML      # ( ѵ → v ) CYRILLIC SMALL LETTER IZHITSA → LATIN SMALL LETTER V   # 
+05D8 ; 0076 ;  ML      # ( ‎ט‎ → v ) HEBREW LETTER TET → LATIN SMALL LETTER V # 
+
+2175 ; 0076 0069 ;     ML      # ( ⅵ → vi ) SMALL ROMAN NUMERAL SIX → LATIN SMALL LETTER V, LATIN SMALL LETTER I # 
+
+2176 ; 0076 0069 0069 ;        ML      # ( ⅶ → vii ) SMALL ROMAN NUMERAL SEVEN → LATIN SMALL LETTER V, LATIN SMALL LETTER I, LATIN SMALL LETTER I        # 
+
+2177 ; 0076 0069 0069 0069 ;   ML      # ( ⅷ → viii ) SMALL ROMAN NUMERAL EIGHT → LATIN SMALL LETTER V, LATIN SMALL LETTER I, LATIN SMALL LETTER I, LATIN SMALL LETTER I # 
+
+026F ; 0076 0076 ;     ML      # ( ɯ → vv ) LATIN SMALL LETTER TURNED M → LATIN SMALL LETTER V, LATIN SMALL LETTER V      # →w→
+0077 ; 0076 0076 ;     ML      # ( w → vv ) LATIN SMALL LETTER W → LATIN SMALL LETTER V, LATIN SMALL LETTER V      # 
+1D430 ;        0076 0076 ;     ML      # ( 𝐰 → vv ) MATHEMATICAL BOLD SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V      # →w→
+1D464 ;        0076 0076 ;     ML      # ( 𝑤 → vv ) MATHEMATICAL ITALIC SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V    # →w→
+1D498 ;        0076 0076 ;     ML      # ( 𝒘 → vv ) MATHEMATICAL BOLD ITALIC SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V       # →w→
+1D4CC ;        0076 0076 ;     ML      # ( 𝓌 → vv ) MATHEMATICAL SCRIPT SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V    # →w→
+1D500 ;        0076 0076 ;     ML      # ( 𝔀 → vv ) MATHEMATICAL BOLD SCRIPT SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V       # →w→
+1D534 ;        0076 0076 ;     ML      # ( 𝔴 → vv ) MATHEMATICAL FRAKTUR SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V   # →w→
+1D568 ;        0076 0076 ;     ML      # ( 𝕨 → vv ) MATHEMATICAL DOUBLE-STRUCK SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V     # →w→
+1D59C ;        0076 0076 ;     ML      # ( 𝖜 → vv ) MATHEMATICAL BOLD FRAKTUR SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V      # →w→
+1D5D0 ;        0076 0076 ;     ML      # ( 𝗐 → vv ) MATHEMATICAL SANS-SERIF SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V        # →w→
+1D604 ;        0076 0076 ;     ML      # ( 𝘄 → vv ) MATHEMATICAL SANS-SERIF BOLD SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V   # →w→
+1D638 ;        0076 0076 ;     ML      # ( 𝘸 → vv ) MATHEMATICAL SANS-SERIF ITALIC SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→
+1D66C ;        0076 0076 ;     ML      # ( 𝙬 → vv ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V    # →w→
+1D6A0 ;        0076 0076 ;     ML      # ( 𝚠 → vv ) MATHEMATICAL MONOSPACE SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→
+1D21 ; 0076 0076 ;     ML      # ( ᴡ → vv ) LATIN LETTER SMALL CAPITAL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V    # →w→
+0461 ; 0076 0076 ;     ML      # ( ѡ → vv ) CYRILLIC SMALL LETTER OMEGA → LATIN SMALL LETTER V, LATIN SMALL LETTER V      # →w→
+051D ; 0076 0076 ;     ML      # ( ԝ → vv ) CYRILLIC SMALL LETTER WE → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→
+0561 ; 0076 0076 ;     ML      # ( ա → vv ) ARMENIAN SMALL LETTER AYB → LATIN SMALL LETTER V, LATIN SMALL LETTER V        # →ɯ→→w→
+
+047D ; 0076 0076 0483 ;        ML      # ( ѽ → vv҃ ) CYRILLIC SMALL LETTER OMEGA WITH TITLO → LATIN SMALL LETTER V, LATIN SMALL LETTER V, COMBINING CYRILLIC TITLO       # →ѡ҃→
+
+A761 ; 0076 0079 ;     ML      # ( ꝡ → vy ) LATIN SMALL LETTER VY → LATIN SMALL LETTER V, LATIN SMALL LETTER Y   # 
+
+1D27 ; 028C ;  ML      # ( ᴧ → ʌ ) GREEK LETTER SMALL CAPITAL LAMDA → LATIN SMALL LETTER TURNED V       # 
+
+166E ; 0078 ;  ML      #* ( ᙮ → x ) CANADIAN SYLLABICS FULL STOP → LATIN SMALL LETTER X  # 
+00D7 ; 0078 ;  ML      #* ( × → x ) MULTIPLICATION SIGN → LATIN SMALL LETTER X    # 
+2573 ; 0078 ;  ML      #* ( ╳ → x ) BOX DRAWINGS LIGHT DIAGONAL CROSS → LATIN SMALL LETTER X     # 
+292B ; 0078 ;  ML      #* ( ⤫ → x ) RISING DIAGONAL CROSSING FALLING DIAGONAL → LATIN SMALL LETTER X     # 
+292C ; 0078 ;  ML      #* ( ⤬ → x ) FALLING DIAGONAL CROSSING RISING DIAGONAL → LATIN SMALL LETTER X     # 
+2A2F ; 0078 ;  ML      #* ( ⨯ → x ) VECTOR OR CROSS PRODUCT → LATIN SMALL LETTER X       # →×→
+FF58 ; 0078 ;  ML      # ( x → x ) FULLWIDTH LATIN SMALL LETTER X → LATIN SMALL LETTER X # →х→
+2179 ; 0078 ;  ML      # ( ⅹ → x ) SMALL ROMAN NUMERAL TEN → LATIN SMALL LETTER X        # 
+1D431 ;        0078 ;  ML      # ( 𝐱 → x ) MATHEMATICAL BOLD SMALL X → LATIN SMALL LETTER X     # 
+1D465 ;        0078 ;  ML      # ( 𝑥 → x ) MATHEMATICAL ITALIC SMALL X → LATIN SMALL LETTER X   # 
+1D499 ;        0078 ;  ML      # ( 𝒙 → x ) MATHEMATICAL BOLD ITALIC SMALL X → LATIN SMALL LETTER X      # 
+1D4CD ;        0078 ;  ML      # ( 𝓍 → x ) MATHEMATICAL SCRIPT SMALL X → LATIN SMALL LETTER X   # 
+1D501 ;        0078 ;  ML      # ( 𝔁 → x ) MATHEMATICAL BOLD SCRIPT SMALL X → LATIN SMALL LETTER X      # 
+1D535 ;        0078 ;  ML      # ( 𝔵 → x ) MATHEMATICAL FRAKTUR SMALL X → LATIN SMALL LETTER X  # 
+1D569 ;        0078 ;  ML      # ( 𝕩 → x ) MATHEMATICAL DOUBLE-STRUCK SMALL X → LATIN SMALL LETTER X    # 
+1D59D ;        0078 ;  ML      # ( 𝖝 → x ) MATHEMATICAL BOLD FRAKTUR SMALL X → LATIN SMALL LETTER X     # 
+1D5D1 ;        0078 ;  ML      # ( 𝗑 → x ) MATHEMATICAL SANS-SERIF SMALL X → LATIN SMALL LETTER X       # 
+1D605 ;        0078 ;  ML      # ( 𝘅 → x ) MATHEMATICAL SANS-SERIF BOLD SMALL X → LATIN SMALL LETTER X  # 
+1D639 ;        0078 ;  ML      # ( 𝘹 → x ) MATHEMATICAL SANS-SERIF ITALIC SMALL X → LATIN SMALL LETTER X        # 
+1D66D ;        0078 ;  ML      # ( 𝙭 → x ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X → LATIN SMALL LETTER X   # 
+1D6A1 ;        0078 ;  ML      # ( 𝚡 → x ) MATHEMATICAL MONOSPACE SMALL X → LATIN SMALL LETTER X        # 
+0445 ; 0078 ;  ML      # ( х → x ) CYRILLIC SMALL LETTER HA → LATIN SMALL LETTER X        # 
+1541 ; 0078 ;  ML      # ( ᕁ → x ) CANADIAN SYLLABICS SAYISI YI → LATIN SMALL LETTER X   # →᙮→
+157D ; 0078 ;  ML      # ( ᕽ → x ) CANADIAN SYLLABICS HK → LATIN SMALL LETTER X  # →ᕁ→→᙮→
+
+2A30 ; 0078 0307 ;     ML      #* ( ⨰ → ẋ ) MULTIPLICATION SIGN WITH DOT ABOVE → LATIN SMALL LETTER X, COMBINING DOT ABOVE     # →×̇→
+
+217A ; 0078 0069 ;     ML      # ( ⅺ → xi ) SMALL ROMAN NUMERAL ELEVEN → LATIN SMALL LETTER X, LATIN SMALL LETTER I      # 
+
+217B ; 0078 0069 0069 ;        ML      # ( ⅻ → xii ) SMALL ROMAN NUMERAL TWELVE → LATIN SMALL LETTER X, LATIN SMALL LETTER I, LATIN SMALL LETTER I       # 
+
+1D8C ; 0079 ;  ML      # ( ᶌ → y ) LATIN SMALL LETTER V WITH PALATAL HOOK → LATIN SMALL LETTER Y # 
+FF59 ; 0079 ;  ML      # ( y → y ) FULLWIDTH LATIN SMALL LETTER Y → LATIN SMALL LETTER Y # →у→
+1D432 ;        0079 ;  ML      # ( 𝐲 → y ) MATHEMATICAL BOLD SMALL Y → LATIN SMALL LETTER Y     # 
+1D466 ;        0079 ;  ML      # ( 𝑦 → y ) MATHEMATICAL ITALIC SMALL Y → LATIN SMALL LETTER Y   # 
+1D49A ;        0079 ;  ML      # ( 𝒚 → y ) MATHEMATICAL BOLD ITALIC SMALL Y → LATIN SMALL LETTER Y      # 
+1D4CE ;        0079 ;  ML      # ( 𝓎 → y ) MATHEMATICAL SCRIPT SMALL Y → LATIN SMALL LETTER Y   # 
+1D502 ;        0079 ;  ML      # ( 𝔂 → y ) MATHEMATICAL BOLD SCRIPT SMALL Y → LATIN SMALL LETTER Y      # 
+1D536 ;        0079 ;  ML      # ( 𝔶 → y ) MATHEMATICAL FRAKTUR SMALL Y → LATIN SMALL LETTER Y  # 
+1D56A ;        0079 ;  ML      # ( 𝕪 → y ) MATHEMATICAL DOUBLE-STRUCK SMALL Y → LATIN SMALL LETTER Y    # 
+1D59E ;        0079 ;  ML      # ( 𝖞 → y ) MATHEMATICAL BOLD FRAKTUR SMALL Y → LATIN SMALL LETTER Y     # 
+1D5D2 ;        0079 ;  ML      # ( 𝗒 → y ) MATHEMATICAL SANS-SERIF SMALL Y → LATIN SMALL LETTER Y       # 
+1D606 ;        0079 ;  ML      # ( 𝘆 → y ) MATHEMATICAL SANS-SERIF BOLD SMALL Y → LATIN SMALL LETTER Y  # 
+1D63A ;        0079 ;  ML      # ( 𝘺 → y ) MATHEMATICAL SANS-SERIF ITALIC SMALL Y → LATIN SMALL LETTER Y        # 
+1D66E ;        0079 ;  ML      # ( 𝙮 → y ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y → LATIN SMALL LETTER Y   # 
+1D6A2 ;        0079 ;  ML      # ( 𝚢 → y ) MATHEMATICAL MONOSPACE SMALL Y → LATIN SMALL LETTER Y        # 
+028F ; 0079 ;  ML      # ( ʏ → y ) LATIN LETTER SMALL CAPITAL Y → LATIN SMALL LETTER Y    # →ү→→у→
+1EFF ; 0079 ;  ML      # ( ỿ → y ) LATIN SMALL LETTER Y WITH LOOP → LATIN SMALL LETTER Y # 
+03B3 ; 0079 ;  ML      # ( γ → y ) GREEK SMALL LETTER GAMMA → LATIN SMALL LETTER Y        # 
+213D ; 0079 ;  ML      # ( ℽ → y ) DOUBLE-STRUCK SMALL GAMMA → LATIN SMALL LETTER Y      # →γ→
+1D6C4 ;        0079 ;  ML      # ( 𝛄 → y ) MATHEMATICAL BOLD SMALL GAMMA → LATIN SMALL LETTER Y # →γ→
+1D6FE ;        0079 ;  ML      # ( 𝛾 → y ) MATHEMATICAL ITALIC SMALL GAMMA → LATIN SMALL LETTER Y       # →γ→
+1D738 ;        0079 ;  ML      # ( 𝜸 → y ) MATHEMATICAL BOLD ITALIC SMALL GAMMA → LATIN SMALL LETTER Y  # →γ→
+1D772 ;        0079 ;  ML      # ( 𝝲 → y ) MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA → LATIN SMALL LETTER Y      # →γ→
+1D7AC ;        0079 ;  ML      # ( 𝞬 → y ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA → LATIN SMALL LETTER Y       # →γ→
+0443 ; 0079 ;  ML      # ( у → y ) CYRILLIC SMALL LETTER U → LATIN SMALL LETTER Y # 
+04AF ; 0079 ;  ML      # ( ү → y ) CYRILLIC SMALL LETTER STRAIGHT U → LATIN SMALL LETTER Y        # →у→
+10E7 ; 0079 ;  ML      # ( ყ → y ) GEORGIAN LETTER QAR → LATIN SMALL LETTER Y    # 
+
+01B4 ; 0079 0314 ;     ML      # ( ƴ → y̔ ) LATIN SMALL LETTER Y WITH HOOK → LATIN SMALL LETTER Y, COMBINING REVERSED COMMA ABOVE        # 
+
+04B1 ; 0079 0335 ;     ML      # ( ұ → y̵ ) CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE → LATIN SMALL LETTER Y, COMBINING SHORT STROKE OVERLAY  # →ү̵→
+
+1D433 ;        007A ;  ML      # ( 𝐳 → z ) MATHEMATICAL BOLD SMALL Z → LATIN SMALL LETTER Z     # 
+1D467 ;        007A ;  ML      # ( 𝑧 → z ) MATHEMATICAL ITALIC SMALL Z → LATIN SMALL LETTER Z   # 
+1D49B ;        007A ;  ML      # ( 𝒛 → z ) MATHEMATICAL BOLD ITALIC SMALL Z → LATIN SMALL LETTER Z      # 
+1D4CF ;        007A ;  ML      # ( 𝓏 → z ) MATHEMATICAL SCRIPT SMALL Z → LATIN SMALL LETTER Z   # 
+1D503 ;        007A ;  ML      # ( 𝔃 → z ) MATHEMATICAL BOLD SCRIPT SMALL Z → LATIN SMALL LETTER Z      # 
+1D537 ;        007A ;  ML      # ( 𝔷 → z ) MATHEMATICAL FRAKTUR SMALL Z → LATIN SMALL LETTER Z  # 
+1D56B ;        007A ;  ML      # ( 𝕫 → z ) MATHEMATICAL DOUBLE-STRUCK SMALL Z → LATIN SMALL LETTER Z    # 
+1D59F ;        007A ;  ML      # ( 𝖟 → z ) MATHEMATICAL BOLD FRAKTUR SMALL Z → LATIN SMALL LETTER Z     # 
+1D5D3 ;        007A ;  ML      # ( 𝗓 → z ) MATHEMATICAL SANS-SERIF SMALL Z → LATIN SMALL LETTER Z       # 
+1D607 ;        007A ;  ML      # ( 𝘇 → z ) MATHEMATICAL SANS-SERIF BOLD SMALL Z → LATIN SMALL LETTER Z  # 
+1D63B ;        007A ;  ML      # ( 𝘻 → z ) MATHEMATICAL SANS-SERIF ITALIC SMALL Z → LATIN SMALL LETTER Z        # 
+1D66F ;        007A ;  ML      # ( 𝙯 → z ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z → LATIN SMALL LETTER Z   # 
+1D6A3 ;        007A ;  ML      # ( 𝚣 → z ) MATHEMATICAL MONOSPACE SMALL Z → LATIN SMALL LETTER Z        # 
+1D22 ; 007A ;  ML      # ( ᴢ → z ) LATIN LETTER SMALL CAPITAL Z → LATIN SMALL LETTER Z   # 
+
+0290 ; 007A 0328 ;     ML      # ( ʐ → z̨ ) LATIN SMALL LETTER Z WITH RETROFLEX HOOK → LATIN SMALL LETTER Z, COMBINING OGONEK    # →z̢→
+
+0225 ; 007A 0326 ;     ML      # ( ȥ → z̦ ) LATIN SMALL LETTER Z WITH HOOK → LATIN SMALL LETTER Z, COMBINING COMMA BELOW # →z̡→
+
+01B6 ; 007A 0335 ;     ML      # ( ƶ → z̵ ) LATIN SMALL LETTER Z WITH STROKE → LATIN SMALL LETTER Z, COMBINING SHORT STROKE OVERLAY      # 
+
+0292 ; 021D ;  ML      # ( ʒ → ȝ ) LATIN SMALL LETTER EZH → LATIN SMALL LETTER YOGH      # 
+A76B ; 021D ;  ML      # ( ꝫ → ȝ ) LATIN SMALL LETTER ET → LATIN SMALL LETTER YOGH      # 
+2CCD ; 021D ;  ML      # ( ⳍ → ȝ ) COPTIC SMALL LETTER OLD COPTIC HORI → LATIN SMALL LETTER YOGH        # 
+04E1 ; 021D ;  ML      # ( ӡ → ȝ ) CYRILLIC SMALL LETTER ABKHASIAN DZE → LATIN SMALL LETTER YOGH # →ʒ→
+10F3 ; 021D ;  ML      # ( ჳ → ȝ ) GEORGIAN LETTER WE → LATIN SMALL LETTER YOGH # →ʒ→
+
+01BF ; 00FE ;  ML      # ( ƿ → þ ) LATIN LETTER WYNN → LATIN SMALL LETTER THORN  # 
+03F8 ; 00FE ;  ML      # ( ϸ → þ ) GREEK SMALL LETTER SHO → LATIN SMALL LETTER THORN     # 
+
+1D24 ; 01A8 ;  ML      # ( ᴤ → ƨ ) LATIN LETTER VOICED LARYNGEAL SPIRANT → LATIN SMALL LETTER TONE TWO  # 
+03E9 ; 01A8 ;  ML      # ( ϩ → ƨ ) COPTIC SMALL LETTER HORI → LATIN SMALL LETTER TONE TWO        # 
+A645 ; 01A8 ;  ML      # ( ꙅ → ƨ ) CYRILLIC SMALL LETTER REVERSED DZE → LATIN SMALL LETTER TONE TWO     # 
+
+044C ; 0185 ;  ML      # ( ь → ƅ ) CYRILLIC SMALL LETTER SOFT SIGN → LATIN SMALL LETTER TONE SIX # 
+
+02C1 ; 02E4 ;  ML      # ( ˁ → ˤ ) MODIFIER LETTER REVERSED GLOTTAL STOP → MODIFIER LETTER SMALL REVERSED GLOTTAL STOP   # 
+
+1D6C3 ;        03B2 ;  ML      # ( 𝛃 → β ) MATHEMATICAL BOLD SMALL BETA → GREEK SMALL LETTER BETA      # 
+1D6FD ;        03B2 ;  ML      # ( 𝛽 → β ) MATHEMATICAL ITALIC SMALL BETA → GREEK SMALL LETTER BETA    # 
+1D737 ;        03B2 ;  ML      # ( 𝜷 → β ) MATHEMATICAL BOLD ITALIC SMALL BETA → GREEK SMALL LETTER BETA       # 
+1D771 ;        03B2 ;  ML      # ( 𝝱 → β ) MATHEMATICAL SANS-SERIF BOLD SMALL BETA → GREEK SMALL LETTER BETA   # 
+1D7AB ;        03B2 ;  ML      # ( 𝞫 → β ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA → GREEK SMALL LETTER BETA    # 
+
+1D7CB ;        03DD ;  ML      # ( 𝟋 → ϝ ) MATHEMATICAL BOLD SMALL DIGAMMA → GREEK SMALL LETTER DIGAMMA        # 
+
+1D6C7 ;        03B6 ;  ML      # ( 𝛇 → ζ ) MATHEMATICAL BOLD SMALL ZETA → GREEK SMALL LETTER ZETA      # 
+1D701 ;        03B6 ;  ML      # ( 𝜁 → ζ ) MATHEMATICAL ITALIC SMALL ZETA → GREEK SMALL LETTER ZETA    # 
+1D73B ;        03B6 ;  ML      # ( 𝜻 → ζ ) MATHEMATICAL BOLD ITALIC SMALL ZETA → GREEK SMALL LETTER ZETA       # 
+1D775 ;        03B6 ;  ML      # ( 𝝵 → ζ ) MATHEMATICAL SANS-SERIF BOLD SMALL ZETA → GREEK SMALL LETTER ZETA   # 
+1D7AF ;        03B6 ;  ML      # ( 𝞯 → ζ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA → GREEK SMALL LETTER ZETA    # 
+
+2296 ; 03B8 ;  ML      #* ( ⊖ → θ ) CIRCLED MINUS → GREEK SMALL LETTER THETA    # 
+229D ; 03B8 ;  ML      #* ( ⊝ → θ ) CIRCLED DASH → GREEK SMALL LETTER THETA     # →⊖→
+236C ; 03B8 ;  ML      #* ( ⍬ → θ ) APL FUNCTIONAL SYMBOL ZILDE → GREEK SMALL LETTER THETA      # 
+1D6C9 ;        03B8 ;  ML      # ( 𝛉 → θ ) MATHEMATICAL BOLD SMALL THETA → GREEK SMALL LETTER THETA    # 
+1D6DD ;        03B8 ;  ML      # ( 𝛝 → θ ) MATHEMATICAL BOLD THETA SYMBOL → GREEK SMALL LETTER THETA   # 
+1D703 ;        03B8 ;  ML      # ( 𝜃 → θ ) MATHEMATICAL ITALIC SMALL THETA → GREEK SMALL LETTER THETA  # 
+1D717 ;        03B8 ;  ML      # ( 𝜗 → θ ) MATHEMATICAL ITALIC THETA SYMBOL → GREEK SMALL LETTER THETA # 
+1D73D ;        03B8 ;  ML      # ( 𝜽 → θ ) MATHEMATICAL BOLD ITALIC SMALL THETA → GREEK SMALL LETTER THETA     # 
+1D751 ;        03B8 ;  ML      # ( 𝝑 → θ ) MATHEMATICAL BOLD ITALIC THETA SYMBOL → GREEK SMALL LETTER THETA    # 
+1D777 ;        03B8 ;  ML      # ( 𝝷 → θ ) MATHEMATICAL SANS-SERIF BOLD SMALL THETA → GREEK SMALL LETTER THETA # 
+1D78B ;        03B8 ;  ML      # ( 𝞋 → θ ) MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL → GREEK SMALL LETTER THETA        # 
+1D7B1 ;        03B8 ;  ML      # ( 𝞱 → θ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA → GREEK SMALL LETTER THETA  # 
+1D7C5 ;        03B8 ;  ML      # ( 𝟅 → θ ) MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL → GREEK SMALL LETTER THETA # 
+1D6AF ;        03B8 ;  ML      # ( 𝚯 → θ ) MATHEMATICAL BOLD CAPITAL THETA → GREEK SMALL LETTER THETA  # →Θ→→⊖→
+1D6B9 ;        03B8 ;  ML      # ( 𝚹 → θ ) MATHEMATICAL BOLD CAPITAL THETA SYMBOL → GREEK SMALL LETTER THETA   # →Θ→→⊖→
+1D6E9 ;        03B8 ;  ML      # ( 𝛩 → θ ) MATHEMATICAL ITALIC CAPITAL THETA → GREEK SMALL LETTER THETA        # →Θ→→⊖→
+1D6F3 ;        03B8 ;  ML      # ( 𝛳 → θ ) MATHEMATICAL ITALIC CAPITAL THETA SYMBOL → GREEK SMALL LETTER THETA # →Θ→→⊖→
+1D723 ;        03B8 ;  ML      # ( 𝜣 → θ ) MATHEMATICAL BOLD ITALIC CAPITAL THETA → GREEK SMALL LETTER THETA   # →Θ→→⊖→
+1D72D ;        03B8 ;  ML      # ( 𝜭 → θ ) MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL → GREEK SMALL LETTER THETA    # →Θ→→⊖→
+1D75D ;        03B8 ;  ML      # ( 𝝝 → θ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA → GREEK SMALL LETTER THETA       # →Θ→→⊖→
+1D767 ;        03B8 ;  ML      # ( 𝝧 → θ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL → GREEK SMALL LETTER THETA        # →Θ→→⊖→
+1D797 ;        03B8 ;  ML      # ( 𝞗 → θ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA → GREEK SMALL LETTER THETA        # →Θ→→⊖→
+1D7A1 ;        03B8 ;  ML      # ( 𝞡 → θ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL → GREEK SMALL LETTER THETA # →Θ→→⊖→
+2D31 ; 03B8 ;  ML      # ( ⴱ → θ ) TIFINAGH LETTER YAB → GREEK SMALL LETTER THETA       # →Ɵ→→Θ→→⊖→
+13BE ; 03B8 ;  ML      # ( Ꮎ → θ ) CHEROKEE LETTER NA → GREEK SMALL LETTER THETA        # →O̵→→O̶→→Ɵ→→Θ→→⊖→
+
+2CE4 ; 03D7 ;  ML      # ( ⳤ → ϗ ) COPTIC SYMBOL KAI → GREEK KAI SYMBOL # 
+
+1D6CC ;        03BB ;  ML      # ( 𝛌 → λ ) MATHEMATICAL BOLD SMALL LAMDA → GREEK SMALL LETTER LAMDA    # 
+1D706 ;        03BB ;  ML      # ( 𝜆 → λ ) MATHEMATICAL ITALIC SMALL LAMDA → GREEK SMALL LETTER LAMDA  # 
+1D740 ;        03BB ;  ML      # ( 𝝀 → λ ) MATHEMATICAL BOLD ITALIC SMALL LAMDA → GREEK SMALL LETTER LAMDA     # 
+1D77A ;        03BB ;  ML      # ( 𝝺 → λ ) MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA → GREEK SMALL LETTER LAMDA # 
+1D7B4 ;        03BB ;  ML      # ( 𝞴 → λ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA → GREEK SMALL LETTER LAMDA  # 
+
+1D6CD ;        03BC ;  ML      # ( 𝛍 → μ ) MATHEMATICAL BOLD SMALL MU → GREEK SMALL LETTER MU  # 
+1D707 ;        03BC ;  ML      # ( 𝜇 → μ ) MATHEMATICAL ITALIC SMALL MU → GREEK SMALL LETTER MU        # 
+1D741 ;        03BC ;  ML      # ( 𝝁 → μ ) MATHEMATICAL BOLD ITALIC SMALL MU → GREEK SMALL LETTER MU   # 
+1D77B ;        03BC ;  ML      # ( 𝝻 → μ ) MATHEMATICAL SANS-SERIF BOLD SMALL MU → GREEK SMALL LETTER MU       # 
+1D7B5 ;        03BC ;  ML      # ( 𝞵 → μ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU → GREEK SMALL LETTER MU        # 
+
+1D6CF ;        03BE ;  ML      # ( 𝛏 → ξ ) MATHEMATICAL BOLD SMALL XI → GREEK SMALL LETTER XI  # 
+1D709 ;        03BE ;  ML      # ( 𝜉 → ξ ) MATHEMATICAL ITALIC SMALL XI → GREEK SMALL LETTER XI        # 
+1D743 ;        03BE ;  ML      # ( 𝝃 → ξ ) MATHEMATICAL BOLD ITALIC SMALL XI → GREEK SMALL LETTER XI   # 
+1D77D ;        03BE ;  ML      # ( 𝝽 → ξ ) MATHEMATICAL SANS-SERIF BOLD SMALL XI → GREEK SMALL LETTER XI       # 
+1D7B7 ;        03BE ;  ML      # ( 𝞷 → ξ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI → GREEK SMALL LETTER XI        # 
+
+1D6EF ;        1D6B5 ; ML      # ( 𝛯 → 𝚵 ) MATHEMATICAL ITALIC CAPITAL XI → MATHEMATICAL BOLD CAPITAL XI     # →Ξ→
+1D729 ;        1D6B5 ; ML      # ( 𝜩 → 𝚵 ) MATHEMATICAL BOLD ITALIC CAPITAL XI → MATHEMATICAL BOLD CAPITAL XI        # →Ξ→
+1D763 ;        1D6B5 ; ML      # ( 𝝣 → 𝚵 ) MATHEMATICAL SANS-SERIF BOLD CAPITAL XI → MATHEMATICAL BOLD CAPITAL XI    # →Ξ→
+1D79D ;        1D6B5 ; ML      # ( 𝞝 → 𝚵 ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI → MATHEMATICAL BOLD CAPITAL XI     # →Ξ→
+
+220F ; 213F ;  ML      #* ( ∏ → ℿ ) N-ARY PRODUCT → DOUBLE-STRUCK CAPITAL PI   # →Π→
+1D6B7 ;        213F ;  ML      # ( 𝚷 → ℿ ) MATHEMATICAL BOLD CAPITAL PI → DOUBLE-STRUCK CAPITAL PI    # →Π→
+1D6F1 ;        213F ;  ML      # ( 𝛱 → ℿ ) MATHEMATICAL ITALIC CAPITAL PI → DOUBLE-STRUCK CAPITAL PI  # →Π→
+1D72B ;        213F ;  ML      # ( 𝜫 → ℿ ) MATHEMATICAL BOLD ITALIC CAPITAL PI → DOUBLE-STRUCK CAPITAL PI     # →Π→
+1D765 ;        213F ;  ML      # ( 𝝥 → ℿ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL PI → DOUBLE-STRUCK CAPITAL PI # →Π→
+1D79F ;        213F ;  ML      # ( 𝞟 → ℿ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI → DOUBLE-STRUCK CAPITAL PI  # →Π→
+
+1D70D ;        1D6D3 ; ML      # ( 𝜍 → 𝛓 ) MATHEMATICAL ITALIC SMALL FINAL SIGMA → MATHEMATICAL BOLD SMALL FINAL SIGMA       # →ς→
+1D747 ;        1D6D3 ; ML      # ( 𝝇 → 𝛓 ) MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA → MATHEMATICAL BOLD SMALL FINAL SIGMA  # →ς→
+1D781 ;        1D6D3 ; ML      # ( 𝞁 → 𝛓 ) MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA → MATHEMATICAL BOLD SMALL FINAL SIGMA      # →ς→
+1D7BB ;        1D6D3 ; ML      # ( 𝞻 → 𝛓 ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA → MATHEMATICAL BOLD SMALL FINAL SIGMA       # →ς→
+
+1D6F7 ;        1D6BD ; ML      # ( 𝛷 → 𝚽 ) MATHEMATICAL ITALIC CAPITAL PHI → MATHEMATICAL BOLD CAPITAL PHI   # →Φ→
+1D731 ;        1D6BD ; ML      # ( 𝜱 → 𝚽 ) MATHEMATICAL BOLD ITALIC CAPITAL PHI → MATHEMATICAL BOLD CAPITAL PHI      # →Φ→
+1D76B ;        1D6BD ; ML      # ( 𝝫 → 𝚽 ) MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI → MATHEMATICAL BOLD CAPITAL PHI  # →Φ→
+1D7A5 ;        1D6BD ; ML      # ( 𝞥 → 𝚽 ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI → MATHEMATICAL BOLD CAPITAL PHI   # →Φ→
+
+1D6D8 ;        03C7 ;  ML      # ( 𝛘 → χ ) MATHEMATICAL BOLD SMALL CHI → GREEK SMALL LETTER CHI        # 
+1D712 ;        03C7 ;  ML      # ( 𝜒 → χ ) MATHEMATICAL ITALIC SMALL CHI → GREEK SMALL LETTER CHI      # 
+1D74C ;        03C7 ;  ML      # ( 𝝌 → χ ) MATHEMATICAL BOLD ITALIC SMALL CHI → GREEK SMALL LETTER CHI # 
+1D786 ;        03C7 ;  ML      # ( 𝞆 → χ ) MATHEMATICAL SANS-SERIF BOLD SMALL CHI → GREEK SMALL LETTER CHI     # 
+1D7C0 ;        03C7 ;  ML      # ( 𝟀 → χ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI → GREEK SMALL LETTER CHI      # 
+2CAD ; 03C7 ;  ML      # ( ⲭ → χ ) COPTIC SMALL LETTER KHI → GREEK SMALL LETTER CHI     # 
+
+1D6D9 ;        03C8 ;  ML      # ( 𝛙 → ψ ) MATHEMATICAL BOLD SMALL PSI → GREEK SMALL LETTER PSI        # 
+1D713 ;        03C8 ;  ML      # ( 𝜓 → ψ ) MATHEMATICAL ITALIC SMALL PSI → GREEK SMALL LETTER PSI      # 
+1D74D ;        03C8 ;  ML      # ( 𝝍 → ψ ) MATHEMATICAL BOLD ITALIC SMALL PSI → GREEK SMALL LETTER PSI # 
+1D787 ;        03C8 ;  ML      # ( 𝞇 → ψ ) MATHEMATICAL SANS-SERIF BOLD SMALL PSI → GREEK SMALL LETTER PSI     # 
+1D7C1 ;        03C8 ;  ML      # ( 𝟁 → ψ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI → GREEK SMALL LETTER PSI      # 
+0471 ; 03C8 ;  ML      # ( ѱ → ψ ) CYRILLIC SMALL LETTER PSI → GREEK SMALL LETTER PSI    # 
+
+1D6F9 ;        1D6BF ; ML      # ( 𝛹 → 𝚿 ) MATHEMATICAL ITALIC CAPITAL PSI → MATHEMATICAL BOLD CAPITAL PSI   # →Ψ→
+1D733 ;        1D6BF ; ML      # ( 𝜳 → 𝚿 ) MATHEMATICAL BOLD ITALIC CAPITAL PSI → MATHEMATICAL BOLD CAPITAL PSI      # →Ψ→
+1D76D ;        1D6BF ; ML      # ( 𝝭 → 𝚿 ) MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI → MATHEMATICAL BOLD CAPITAL PSI  # →Ψ→
+1D7A7 ;        1D6BF ; ML      # ( 𝞧 → 𝚿 ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI → MATHEMATICAL BOLD CAPITAL PSI   # →Ψ→
+
+2375 ; 03C9 ;  ML      #* ( ⍵ → ω ) APL FUNCTIONAL SYMBOL OMEGA → GREEK SMALL LETTER OMEGA      # 
+1D6DA ;        03C9 ;  ML      # ( 𝛚 → ω ) MATHEMATICAL BOLD SMALL OMEGA → GREEK SMALL LETTER OMEGA    # 
+1D714 ;        03C9 ;  ML      # ( 𝜔 → ω ) MATHEMATICAL ITALIC SMALL OMEGA → GREEK SMALL LETTER OMEGA  # 
+1D74E ;        03C9 ;  ML      # ( 𝝎 → ω ) MATHEMATICAL BOLD ITALIC SMALL OMEGA → GREEK SMALL LETTER OMEGA     # 
+1D788 ;        03C9 ;  ML      # ( 𝞈 → ω ) MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA → GREEK SMALL LETTER OMEGA # 
+1D7C2 ;        03C9 ;  ML      # ( 𝟂 → ω ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA → GREEK SMALL LETTER OMEGA  # 
+2CB1 ; 03C9 ;  ML      # ( ⲱ → ω ) COPTIC SMALL LETTER OOU → GREEK SMALL LETTER OMEGA   # 
+
+0497 ; 0436 0329 ;     ML      # ( җ → ж̩ ) CYRILLIC SMALL LETTER ZHE WITH DESCENDER → CYRILLIC SMALL LETTER ZHE, COMBINING VERTICAL LINE BELOW # 
+
+045D ; 0439 ;  ML      # ( ѝ → й ) CYRILLIC SMALL LETTER I WITH GRAVE → CYRILLIC SMALL LETTER SHORT I    # 
+
+048B ; 0439 0326 ;     ML      # ( ҋ → й̦ ) CYRILLIC SMALL LETTER SHORT I WITH TAIL → CYRILLIC SMALL LETTER SHORT I, COMBINING COMMA BELOW      # →й̡→
+
+1D2B ; 043B ;  ML      # ( ᴫ → л ) CYRILLIC LETTER SMALL CAPITAL EL → CYRILLIC SMALL LETTER EL  # 
+
+04C6 ; 043B 0326 ;     ML      # ( ӆ → л̦ ) CYRILLIC SMALL LETTER EL WITH TAIL → CYRILLIC SMALL LETTER EL, COMBINING COMMA BELOW        # →л̡→
+
+04CC ; 04B7 ;  ML      # ( ӌ → ҷ ) CYRILLIC SMALL LETTER KHAKASSIAN CHE → CYRILLIC SMALL LETTER CHE WITH DESCENDER       # 
+
+04BF ; 04BD 0328 ;     ML      # ( ҿ → ҽ̨ ) CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER → CYRILLIC SMALL LETTER ABKHASIAN CHE, COMBINING OGONEK  # →ҽ̢→
+
+2CBD ; 0448 ;  ML      # ( ⲽ → ш ) COPTIC SMALL LETTER CRYPTOGRAMMIC NI → CYRILLIC SMALL LETTER SHA     # 
+
+044B ; 044C 0131 ;     ML      # ( ы → ьı ) CYRILLIC SMALL LETTER YERU → CYRILLIC SMALL LETTER SOFT SIGN, LATIN SMALL LETTER DOTLESS I  # 
+
+02D3 ; 0559 ;  ML      #* ( ˓ → ՙ ) MODIFIER LETTER CENTRED LEFT HALF RING → ARMENIAN MODIFIER LETTER LEFT HALF RING     # 
+02BF ; 0559 ;  ML      # ( ʿ → ՙ ) MODIFIER LETTER LEFT HALF RING → ARMENIAN MODIFIER LETTER LEFT HALF RING      # 
+
+2135 ; 05D0 ;  ML      # ( ℵ → ‎א‎ ) ALEF SYMBOL → HEBREW LETTER ALEF       # 
+FB21 ; 05D0 ;  ML      # ( ‎ﬡ‎ → ‎א‎ ) HEBREW LETTER WIDE ALEF → HEBREW LETTER ALEF     # 
+
+FB2F ; FB2E ;  ML      # ( ‎אָ‎ → ‎אַ‎ ) HEBREW LETTER ALEF WITH QAMATS → HEBREW LETTER ALEF WITH PATAH  # 
+FB30 ; FB2E ;  ML      # ( ‎אּ‎ → ‎אַ‎ ) HEBREW LETTER ALEF WITH MAPIQ → HEBREW LETTER ALEF WITH PATAH   # 
+
+FB4F ; 05D0 05DC ;     ML      # ( ‎ﭏ‎ → ‎אל‎ ) HEBREW LIGATURE ALEF LAMED → HEBREW LETTER ALEF, HEBREW LETTER LAMED   # 
+
+2136 ; 05D1 ;  ML      # ( ℶ → ‎ב‎ ) BET SYMBOL → HEBREW LETTER BET # 
+
+2137 ; 05D2 ;  ML      # ( ℷ → ‎ג‎ ) GIMEL SYMBOL → HEBREW LETTER GIMEL     # 
+
+2138 ; 05D3 ;  ML      # ( ℸ → ‎ד‎ ) DALET SYMBOL → HEBREW LETTER DALET     # 
+FB22 ; 05D3 ;  ML      # ( ‎ﬢ‎ → ‎ד‎ ) HEBREW LETTER WIDE DALET → HEBREW LETTER DALET   # 
+
+FB23 ; 05D4 ;  ML      # ( ‎ﬣ‎ → ‎ה‎ ) HEBREW LETTER WIDE HE → HEBREW LETTER HE # 
+
+FB39 ; FB1D ;  ML      # ( ‎יּ‎ → ‎יִ‎ ) HEBREW LETTER YOD WITH DAGESH → HEBREW LETTER YOD WITH HIRIQ    # 
+
+FB24 ; 05DB ;  ML      # ( ‎ﬤ‎ → ‎כ‎ ) HEBREW LETTER WIDE KAF → HEBREW LETTER KAF       # 
+
+FB25 ; 05DC ;  ML      # ( ‎ﬥ‎ → ‎ל‎ ) HEBREW LETTER WIDE LAMED → HEBREW LETTER LAMED   # 
+
+FB26 ; 05DD ;  ML      # ( ‎ﬦ‎ → ‎ם‎ ) HEBREW LETTER WIDE FINAL MEM → HEBREW LETTER FINAL MEM   # 
+
+FB20 ; 05E2 ;  ML      # ( ‎ﬠ‎ → ‎ע‎ ) HEBREW LETTER ALTERNATIVE AYIN → HEBREW LETTER AYIN      # 
+
+FB27 ; 05E8 ;  ML      # ( ‎ﬧ‎ → ‎ר‎ ) HEBREW LETTER WIDE RESH → HEBREW LETTER RESH     # 
+
+FB2B ; FB2A ;  ML      # ( ‎שׂ‎ → ‎שׁ‎ ) HEBREW LETTER SHIN WITH SIN DOT → HEBREW LETTER SHIN WITH SHIN DOT      # 
+FB49 ; FB2A ;  ML      # ( ‎שּ‎ → ‎שׁ‎ ) HEBREW LETTER SHIN WITH DAGESH → HEBREW LETTER SHIN WITH SHIN DOT       # 
+
+FB2D ; FB2C ;  ML      # ( ‎שּׂ‎ → ‎שּׁ‎ ) HEBREW LETTER SHIN WITH DAGESH AND SIN DOT → HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT        # 
+
+FB28 ; 05EA ;  ML      # ( ‎ﬨ‎ → ‎ת‎ ) HEBREW LETTER WIDE TAV → HEBREW LETTER TAV       # 
+
+FE80 ; 0621 ;  ML      # ( ‎ﺀ‎ → ‎ء‎ ) ARABIC LETTER HAMZA ISOLATED FORM → ARABIC LETTER HAMZA  # 
+
+FE82 ; 0622 ;  ML      # ( ‎ﺂ‎ → ‎آ‎ ) ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM → ARABIC LETTER ALEF WITH MADDA ABOVE     # 
+FE81 ; 0622 ;  ML      # ( ‎ﺁ‎ → ‎آ‎ ) ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM → ARABIC LETTER ALEF WITH MADDA ABOVE  # 
+
+FB51 ; 0671 ;  ML      # ( ‎ﭑ‎ → ‎ٱ‎ ) ARABIC LETTER ALEF WASLA FINAL FORM → ARABIC LETTER ALEF WASLA   # 
+FB50 ; 0671 ;  ML      # ( ‎ﭐ‎ → ‎ٱ‎ ) ARABIC LETTER ALEF WASLA ISOLATED FORM → ARABIC LETTER ALEF WASLA        # 
+
+FE88 ; 0625 ;  ML      # ( ‎ﺈ‎ → ‎إ‎ ) ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM → ARABIC LETTER ALEF WITH HAMZA BELOW     # 
+FE87 ; 0625 ;  ML      # ( ‎ﺇ‎ → ‎إ‎ ) ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM → ARABIC LETTER ALEF WITH HAMZA BELOW  # 
+
+FE8E ; 0627 ;  ML      # ( ‎ﺎ‎ → ‎ا‎ ) ARABIC LETTER ALEF FINAL FORM → ARABIC LETTER ALEF       # 
+FE8D ; 0627 ;  ML      # ( ‎ﺍ‎ → ‎ا‎ ) ARABIC LETTER ALEF ISOLATED FORM → ARABIC LETTER ALEF    # 
+
+FD3C ; 0627 064B ;     ML      # ( ‎ﴼ‎ → ‎اً‎ ) ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM → ARABIC LETTER ALEF, ARABIC FATHATAN    # 
+FD3D ; 0627 064B ;     ML      # ( ‎ﴽ‎ → ‎اً‎ ) ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM → ARABIC LETTER ALEF, ARABIC FATHATAN # 
+
+0623 ; 0627 0674 ;     ML      # ( ‎أ‎ → ‎اٴ‎ ) ARABIC LETTER ALEF WITH HAMZA ABOVE → ARABIC LETTER ALEF, ARABIC LETTER HIGH HAMZA      # →‎ٵ‎→
+FE84 ; 0627 0674 ;     ML      # ( ‎ﺄ‎ → ‎اٴ‎ ) ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM → ARABIC LETTER ALEF, ARABIC LETTER HIGH HAMZA  # →‎أ‎→→‎ٵ‎→
+FE83 ; 0627 0674 ;     ML      # ( ‎ﺃ‎ → ‎اٴ‎ ) ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM → ARABIC LETTER ALEF, ARABIC LETTER HIGH HAMZA       # →‎ٵ‎→
+0675 ; 0627 0674 ;     ML      # ( ‎ٵ‎ → ‎اٴ‎ ) ARABIC LETTER HIGH HAMZA ALEF → ARABIC LETTER ALEF, ARABIC LETTER HIGH HAMZA    # 
+
+FDF3 ; 0627 0643 0628 0631 ;   ML      # ( ‎ﷳ‎ → ‎اكبر‎ ) ARABIC LIGATURE AKBAR ISOLATED FORM → ARABIC LETTER ALEF, ARABIC LETTER KAF, ARABIC LETTER BEH, ARABIC LETTER REH  # 
+
+FDF2 ; 0627 0644 0644 0647 ;   ML      # ( ‎ﷲ‎ → ‎الله‎ ) ARABIC LIGATURE ALLAH ISOLATED FORM → ARABIC LETTER ALEF, ARABIC LETTER LAM, ARABIC LETTER LAM, ARABIC LETTER HEH  # 
+
+FE91 ; 0628 ;  ML      # ( ‎ﺑ‎ → ‎ب‎ ) ARABIC LETTER BEH INITIAL FORM → ARABIC LETTER BEH       # 
+FE92 ; 0628 ;  ML      # ( ‎ﺒ‎ → ‎ب‎ ) ARABIC LETTER BEH MEDIAL FORM → ARABIC LETTER BEH        # 
+FE90 ; 0628 ;  ML      # ( ‎ﺐ‎ → ‎ب‎ ) ARABIC LETTER BEH FINAL FORM → ARABIC LETTER BEH # 
+FE8F ; 0628 ;  ML      # ( ‎ﺏ‎ → ‎ب‎ ) ARABIC LETTER BEH ISOLATED FORM → ARABIC LETTER BEH      # 
+0646 ; 0628 ;  ML      # ( ‎ن‎ → ‎ب‎ ) ARABIC LETTER NOON → ARABIC LETTER BEH    # →‎ﻨ‎→→‎ﺒ‎→
+FEE7 ; 0628 ;  ML      # ( ‎ﻧ‎ → ‎ب‎ ) ARABIC LETTER NOON INITIAL FORM → ARABIC LETTER BEH      # →‎ﺒ‎→
+FEE8 ; 0628 ;  ML      # ( ‎ﻨ‎ → ‎ب‎ ) ARABIC LETTER NOON MEDIAL FORM → ARABIC LETTER BEH       # →‎ﺒ‎→
+FEE6 ; 0628 ;  ML      # ( ‎ﻦ‎ → ‎ب‎ ) ARABIC LETTER NOON FINAL FORM → ARABIC LETTER BEH        # →‎ن‎→→‎ﻨ‎→→‎ﺒ‎→
+FEE5 ; 0628 ;  ML      # ( ‎ﻥ‎ → ‎ب‎ ) ARABIC LETTER NOON ISOLATED FORM → ARABIC LETTER BEH     # →‎ن‎→→‎ﻨ‎→→‎ﺒ‎→
+
+FC6D ; 0628 0628 ;     ML      # ( ‎ﱭ‎ → ‎بب‎ ) ARABIC LIGATURE BEH WITH NOON FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER BEH        # →‎بن‎→
+FC8D ; 0628 0628 ;     ML      # ( ‎ﲍ‎ → ‎بب‎ ) ARABIC LIGATURE NOON WITH NOON FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER BEH       # →‎نن‎→
+
+FC9C ; 0628 062C ;     ML      # ( ‎ﲜ‎ → ‎بج‎ ) ARABIC LIGATURE BEH WITH JEEM INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM     # 
+FC05 ; 0628 062C ;     ML      # ( ‎ﰅ‎ → ‎بج‎ ) ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM    # 
+FC9E ; 0628 062C ;     ML      # ( ‎ﲞ‎ → ‎بج‎ ) ARABIC LIGATURE BEH WITH KHAH INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM     # →‎بخ‎→→‎ﰇ‎→→‎ﰅ‎→
+FC07 ; 0628 062C ;     ML      # ( ‎ﰇ‎ → ‎بج‎ ) ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM    # →‎ﰅ‎→
+FCD2 ; 0628 062C ;     ML      # ( ‎ﳒ‎ → ‎بج‎ ) ARABIC LIGATURE NOON WITH JEEM INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM    # →‎ﲞ‎→→‎بخ‎→→‎ﰇ‎→→‎ﰅ‎→
+FC4B ; 0628 062C ;     ML      # ( ‎ﱋ‎ → ‎بج‎ ) ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM   # →‎نج‎→→‎ﳒ‎→→‎ﲞ‎→→‎بخ‎→→‎ﰇ‎→→‎ﰅ‎→
+FCD4 ; 0628 062C ;     ML      # ( ‎ﳔ‎ → ‎بج‎ ) ARABIC LIGATURE NOON WITH KHAH INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM    # →‎نخ‎→→‎ﱍ‎→→‎ﱋ‎→→‎نج‎→→‎ﳒ‎→→‎ﲞ‎→→‎بخ‎→→‎ﰇ‎→→‎ﰅ‎→
+FC4D ; 0628 062C ;     ML      # ( ‎ﱍ‎ → ‎بج‎ ) ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM   # →‎ﱋ‎→→‎نج‎→→‎ﳒ‎→→‎ﲞ‎→→‎بخ‎→→‎ﰇ‎→→‎ﰅ‎→
+
+FDB8 ; 0628 062C 062D ;        ML      # ( ‎ﶸ‎ → ‎بجح‎ ) ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM, ARABIC LETTER HAH      # →‎نجح‎→
+FDBD ; 0628 062C 062D ;        ML      # ( ‎ﶽ‎ → ‎بجح‎ ) ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM, ARABIC LETTER HAH        # →‎نجح‎→
+
+FD98 ; 0628 062C 0645 ;        ML      # ( ‎ﶘ‎ → ‎بجم‎ ) ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM, ARABIC LETTER MEEM    # →‎نجم‎→
+FD97 ; 0628 062C 0645 ;        ML      # ( ‎ﶗ‎ → ‎بجم‎ ) ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM, ARABIC LETTER MEEM      # →‎نجم‎→
+
+FD9E ; 0628 062C 0649 ;        ML      # ( ‎ﶞ‎ → ‎بجى‎ ) ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA        # →‎بخي‎→
+FD99 ; 0628 062C 0649 ;        ML      # ( ‎ﶙ‎ → ‎بجى‎ ) ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA      # →‎نجى‎→
+FDC7 ; 0628 062C 0649 ;        ML      # ( ‎ﷇ‎ → ‎بجى‎ ) ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA       # →‎نجي‎→
+
+FC9D ; 0628 062D ;     ML      # ( ‎ﲝ‎ → ‎بح‎ ) ARABIC LIGATURE BEH WITH HAH INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER HAH       # 
+FC06 ; 0628 062D ;     ML      # ( ‎ﰆ‎ → ‎بح‎ ) ARABIC LIGATURE BEH WITH HAH ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER HAH      # 
+FCD3 ; 0628 062D ;     ML      # ( ‎ﳓ‎ → ‎بح‎ ) ARABIC LIGATURE NOON WITH HAH INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER HAH      # →‎نح‎→
+FC4C ; 0628 062D ;     ML      # ( ‎ﱌ‎ → ‎بح‎ ) ARABIC LIGATURE NOON WITH HAH ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER HAH     # →‎نح‎→
+
+FD95 ; 0628 062D 0645 ;        ML      # ( ‎ﶕ‎ → ‎بحم‎ ) ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER HAH, ARABIC LETTER MEEM      # →‎نحم‎→
+
+FDC2 ; 0628 062D 0649 ;        ML      # ( ‎ﷂ‎ → ‎بحى‎ ) ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA  # →‎بحي‎→
+FD96 ; 0628 062D 0649 ;        ML      # ( ‎ﶖ‎ → ‎بحى‎ ) ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA        # →‎نحى‎→
+FDB3 ; 0628 062D 0649 ;        ML      # ( ‎ﶳ‎ → ‎بحى‎ ) ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA # →‎نحي‎→
+
+FC6A ; 0628 0631 ;     ML      # ( ‎ﱪ‎ → ‎بر‎ ) ARABIC LIGATURE BEH WITH REH FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER REH # 
+FC8A ; 0628 0631 ;     ML      # ( ‎ﲊ‎ → ‎بر‎ ) ARABIC LIGATURE NOON WITH REH FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER REH        # →‎نر‎→
+
+FC6B ; 0628 0632 ;     ML      # ( ‎ﱫ‎ → ‎بز‎ ) ARABIC LIGATURE BEH WITH ZAIN FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER ZAIN       # 
+FC8B ; 0628 0632 ;     ML      # ( ‎ﲋ‎ → ‎بز‎ ) ARABIC LIGATURE NOON WITH ZAIN FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER ZAIN      # →‎نز‎→
+
+FC9F ; 0628 0645 ;     ML      # ( ‎ﲟ‎ → ‎بم‎ ) ARABIC LIGATURE BEH WITH MEEM INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER MEEM     # 
+FCE1 ; 0628 0645 ;     ML      # ( ‎ﳡ‎ → ‎بم‎ ) ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM → ARABIC LETTER BEH, ARABIC LETTER MEEM      # 
+FC6C ; 0628 0645 ;     ML      # ( ‎ﱬ‎ → ‎بم‎ ) ARABIC LIGATURE BEH WITH MEEM FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER MEEM       # 
+FC08 ; 0628 0645 ;     ML      # ( ‎ﰈ‎ → ‎بم‎ ) ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER MEEM    # 
+FCD5 ; 0628 0645 ;     ML      # ( ‎ﳕ‎ → ‎بم‎ ) ARABIC LIGATURE NOON WITH MEEM INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER MEEM    # →‎نم‎→
+FCEE ; 0628 0645 ;     ML      # ( ‎ﳮ‎ → ‎بم‎ ) ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM → ARABIC LETTER BEH, ARABIC LETTER MEEM     # →‎نم‎→
+FC8C ; 0628 0645 ;     ML      # ( ‎ﲌ‎ → ‎بم‎ ) ARABIC LIGATURE NOON WITH MEEM FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER MEEM      # →‎نم‎→
+FC4E ; 0628 0645 ;     ML      # ( ‎ﱎ‎ → ‎بم‎ ) ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER MEEM   # →‎نم‎→
+
+FD9B ; 0628 0645 0649 ;        ML      # ( ‎ﶛ‎ → ‎بمى‎ ) ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA      # →‎نمى‎→
+FD9A ; 0628 0645 0649 ;        ML      # ( ‎ﶚ‎ → ‎بمى‎ ) ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA       # →‎نمي‎→
+
+FCA0 ; 0628 0647 ;     ML      # ( ‎ﲠ‎ → ‎به‎ ) ARABIC LIGATURE BEH WITH HEH INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER HEH       # 
+FCE2 ; 0628 0647 ;     ML      # ( ‎ﳢ‎ → ‎به‎ ) ARABIC LIGATURE BEH WITH HEH MEDIAL FORM → ARABIC LETTER BEH, ARABIC LETTER HEH        # 
+FCD6 ; 0628 0647 ;     ML      # ( ‎ﳖ‎ → ‎به‎ ) ARABIC LIGATURE NOON WITH HEH INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER HEH      # →‎نه‎→
+FCEF ; 0628 0647 ;     ML      # ( ‎ﳯ‎ → ‎به‎ ) ARABIC LIGATURE NOON WITH HEH MEDIAL FORM → ARABIC LETTER BEH, ARABIC LETTER HEH       # →‎نه‎→
+
+FC6E ; 0628 0649 ;     ML      # ( ‎ﱮ‎ → ‎بى‎ ) ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER ALEF MAKSURA       # 
+FC09 ; 0628 0649 ;     ML      # ( ‎ﰉ‎ → ‎بى‎ ) ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER ALEF MAKSURA    # 
+FC6F ; 0628 0649 ;     ML      # ( ‎ﱯ‎ → ‎بى‎ ) ARABIC LIGATURE BEH WITH YEH FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER ALEF MAKSURA        # →‎بي‎→
+FC0A ; 0628 0649 ;     ML      # ( ‎ﰊ‎ → ‎بى‎ ) ARABIC LIGATURE BEH WITH YEH ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER ALEF MAKSURA     # →‎بي‎→
+FC8E ; 0628 0649 ;     ML      # ( ‎ﲎ‎ → ‎بى‎ ) ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER ALEF MAKSURA      # →‎نى‎→
+FC4F ; 0628 0649 ;     ML      # ( ‎ﱏ‎ → ‎بى‎ ) ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER ALEF MAKSURA   # →‎نى‎→
+FC8F ; 0628 0649 ;     ML      # ( ‎ﲏ‎ → ‎بى‎ ) ARABIC LIGATURE NOON WITH YEH FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER ALEF MAKSURA       # →‎ني‎→
+FC50 ; 0628 0649 ;     ML      # ( ‎ﱐ‎ → ‎بى‎ ) ARABIC LIGATURE NOON WITH YEH ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER ALEF MAKSURA    # →‎ني‎→
+
+FB58 ; 067E ;  ML      # ( ‎ﭘ‎ → ‎پ‎ ) ARABIC LETTER PEH INITIAL FORM → ARABIC LETTER PEH       # 
+FB59 ; 067E ;  ML      # ( ‎ﭙ‎ → ‎پ‎ ) ARABIC LETTER PEH MEDIAL FORM → ARABIC LETTER PEH        # 
+FB57 ; 067E ;  ML      # ( ‎ﭗ‎ → ‎پ‎ ) ARABIC LETTER PEH FINAL FORM → ARABIC LETTER PEH # 
+FB56 ; 067E ;  ML      # ( ‎ﭖ‎ → ‎پ‎ ) ARABIC LETTER PEH ISOLATED FORM → ARABIC LETTER PEH      # 
+
+FE97 ; 062A ;  ML      # ( ‎ﺗ‎ → ‎ت‎ ) ARABIC LETTER TEH INITIAL FORM → ARABIC LETTER TEH       # 
+FE98 ; 062A ;  ML      # ( ‎ﺘ‎ → ‎ت‎ ) ARABIC LETTER TEH MEDIAL FORM → ARABIC LETTER TEH        # 
+FE96 ; 062A ;  ML      # ( ‎ﺖ‎ → ‎ت‎ ) ARABIC LETTER TEH FINAL FORM → ARABIC LETTER TEH # 
+FE95 ; 062A ;  ML      # ( ‎ﺕ‎ → ‎ت‎ ) ARABIC LETTER TEH ISOLATED FORM → ARABIC LETTER TEH      # 
+
+FC73 ; 062A 0628 ;     ML      # ( ‎ﱳ‎ → ‎تب‎ ) ARABIC LIGATURE TEH WITH NOON FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER BEH        # →‎تن‎→
+
+FCA1 ; 062A 062C ;     ML      # ( ‎ﲡ‎ → ‎تج‎ ) ARABIC LIGATURE TEH WITH JEEM INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM     # 
+FC0B ; 062A 062C ;     ML      # ( ‎ﰋ‎ → ‎تج‎ ) ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM    # 
+FCA3 ; 062A 062C ;     ML      # ( ‎ﲣ‎ → ‎تج‎ ) ARABIC LIGATURE TEH WITH KHAH INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM     # →‎تخ‎→→‎ﰍ‎→→‎ﰋ‎→
+FC0D ; 062A 062C ;     ML      # ( ‎ﰍ‎ → ‎تج‎ ) ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM    # →‎ﰋ‎→
+FCDA ; 062A 062C ;     ML      # ( ‎ﳚ‎ → ‎تج‎ ) ARABIC LIGATURE YEH WITH JEEM INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM     # →‎ﲡ‎→
+FC55 ; 062A 062C ;     ML      # ( ‎ﱕ‎ → ‎تج‎ ) ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM    # →‎يج‎→→‎ﳚ‎→→‎ﲡ‎→
+FCDC ; 062A 062C ;     ML      # ( ‎ﳜ‎ → ‎تج‎ ) ARABIC LIGATURE YEH WITH KHAH INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM     # →‎ﲣ‎→→‎تخ‎→→‎ﰍ‎→→‎ﰋ‎→
+FC57 ; 062A 062C ;     ML      # ( ‎ﱗ‎ → ‎تج‎ ) ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM    # →‎ﱕ‎→→‎يج‎→→‎ﳚ‎→→‎ﲡ‎→
+
+FD50 ; 062A 062C 0645 ;        ML      # ( ‎ﵐ‎ → ‎تجم‎ ) ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM, ARABIC LETTER MEEM     # 
+FD54 ; 062A 062C 0645 ;        ML      # ( ‎ﵔ‎ → ‎تجم‎ ) ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM, ARABIC LETTER MEEM     # →‎تخم‎→
+
+FDA0 ; 062A 062C 0649 ;        ML      # ( ‎ﶠ‎ → ‎تجى‎ ) ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA       # 
+FD9F ; 062A 062C 0649 ;        ML      # ( ‎ﶟ‎ → ‎تجى‎ ) ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA        # →‎تجي‎→
+FDA2 ; 062A 062C 0649 ;        ML      # ( ‎ﶢ‎ → ‎تجى‎ ) ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA       # →‎تخى‎→
+FDA1 ; 062A 062C 0649 ;        ML      # ( ‎ﶡ‎ → ‎تجى‎ ) ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA        # →‎تخي‎→
+
+FCA2 ; 062A 062D ;     ML      # ( ‎ﲢ‎ → ‎تح‎ ) ARABIC LIGATURE TEH WITH HAH INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER HAH       # 
+FC0C ; 062A 062D ;     ML      # ( ‎ﰌ‎ → ‎تح‎ ) ARABIC LIGATURE TEH WITH HAH ISOLATED FORM → ARABIC LETTER TEH, ARABIC LETTER HAH      # 
+FCDB ; 062A 062D ;     ML      # ( ‎ﳛ‎ → ‎تح‎ ) ARABIC LIGATURE YEH WITH HAH INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER HAH       # →‎ﲢ‎→
+FC56 ; 062A 062D ;     ML      # ( ‎ﱖ‎ → ‎تح‎ ) ARABIC LIGATURE YEH WITH HAH ISOLATED FORM → ARABIC LETTER TEH, ARABIC LETTER HAH      # →‎يح‎→→‎ﳛ‎→→‎ﲢ‎→
+
+FD52 ; 062A 062D 062C ;        ML      # ( ‎ﵒ‎ → ‎تحج‎ ) ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER HAH, ARABIC LETTER JEEM       # 
+FD51 ; 062A 062D 062C ;        ML      # ( ‎ﵑ‎ → ‎تحج‎ ) ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER HAH, ARABIC LETTER JEEM # 
+
+FD53 ; 062A 062D 0645 ;        ML      # ( ‎ﵓ‎ → ‎تحم‎ ) ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER HAH, ARABIC LETTER MEEM       # 
+
+FC70 ; 062A 0631 ;     ML      # ( ‎ﱰ‎ → ‎تر‎ ) ARABIC LIGATURE TEH WITH REH FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER REH # 
+
+FC71 ; 062A 0632 ;     ML      # ( ‎ﱱ‎ → ‎تز‎ ) ARABIC LIGATURE TEH WITH ZAIN FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER ZAIN       # 
+
+FCA4 ; 062A 0645 ;     ML      # ( ‎ﲤ‎ → ‎تم‎ ) ARABIC LIGATURE TEH WITH MEEM INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER MEEM     # 
+FCE3 ; 062A 0645 ;     ML      # ( ‎ﳣ‎ → ‎تم‎ ) ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM → ARABIC LETTER TEH, ARABIC LETTER MEEM      # 
+FC72 ; 062A 0645 ;     ML      # ( ‎ﱲ‎ → ‎تم‎ ) ARABIC LIGATURE TEH WITH MEEM FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER MEEM       # 
+FC0E ; 062A 0645 ;     ML      # ( ‎ﰎ‎ → ‎تم‎ ) ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM → ARABIC LETTER TEH, ARABIC LETTER MEEM    # 
+
+FD55 ; 062A 0645 062C ;        ML      # ( ‎ﵕ‎ → ‎تمج‎ ) ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER MEEM, ARABIC LETTER JEEM     # 
+FD57 ; 062A 0645 062C ;        ML      # ( ‎ﵗ‎ → ‎تمج‎ ) ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER MEEM, ARABIC LETTER JEEM     # →‎تمخ‎→
+
+FD56 ; 062A 0645 062D ;        ML      # ( ‎ﵖ‎ → ‎تمح‎ ) ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER MEEM, ARABIC LETTER HAH       # 
+
+FDA4 ; 062A 0645 0649 ;        ML      # ( ‎ﶤ‎ → ‎تمى‎ ) ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA       # 
+FDA3 ; 062A 0645 0649 ;        ML      # ( ‎ﶣ‎ → ‎تمى‎ ) ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA        # →‎تمي‎→
+
+FCA5 ; 062A 0647 ;     ML      # ( ‎ﲥ‎ → ‎ته‎ ) ARABIC LIGATURE TEH WITH HEH INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER HEH       # 
+FCE4 ; 062A 0647 ;     ML      # ( ‎ﳤ‎ → ‎ته‎ ) ARABIC LIGATURE TEH WITH HEH MEDIAL FORM → ARABIC LETTER TEH, ARABIC LETTER HEH        # 
+
+FC74 ; 062A 0649 ;     ML      # ( ‎ﱴ‎ → ‎تى‎ ) ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER ALEF MAKSURA       # 
+FC0F ; 062A 0649 ;     ML      # ( ‎ﰏ‎ → ‎تى‎ ) ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER TEH, ARABIC LETTER ALEF MAKSURA    # 
+FC75 ; 062A 0649 ;     ML      # ( ‎ﱵ‎ → ‎تى‎ ) ARABIC LIGATURE TEH WITH YEH FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER ALEF MAKSURA        # →‎تي‎→
+FC10 ; 062A 0649 ;     ML      # ( ‎ﰐ‎ → ‎تى‎ ) ARABIC LIGATURE TEH WITH YEH ISOLATED FORM → ARABIC LETTER TEH, ARABIC LETTER ALEF MAKSURA     # →‎تي‎→
+
+FE9B ; 062B ;  ML      # ( ‎ﺛ‎ → ‎ث‎ ) ARABIC LETTER THEH INITIAL FORM → ARABIC LETTER THEH     # 
+FE9C ; 062B ;  ML      # ( ‎ﺜ‎ → ‎ث‎ ) ARABIC LETTER THEH MEDIAL FORM → ARABIC LETTER THEH      # 
+FE9A ; 062B ;  ML      # ( ‎ﺚ‎ → ‎ث‎ ) ARABIC LETTER THEH FINAL FORM → ARABIC LETTER THEH       # 
+FE99 ; 062B ;  ML      # ( ‎ﺙ‎ → ‎ث‎ ) ARABIC LETTER THEH ISOLATED FORM → ARABIC LETTER THEH    # 
+
+FC79 ; 062B 0628 ;     ML      # ( ‎ﱹ‎ → ‎ثب‎ ) ARABIC LIGATURE THEH WITH NOON FINAL FORM → ARABIC LETTER THEH, ARABIC LETTER BEH      # →‎ثن‎→
+
+FC11 ; 062B 062C ;     ML      # ( ‎ﰑ‎ → ‎ثج‎ ) ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM → ARABIC LETTER THEH, ARABIC LETTER JEEM  # 
+
+FC76 ; 062B 0631 ;     ML      # ( ‎ﱶ‎ → ‎ثر‎ ) ARABIC LIGATURE THEH WITH REH FINAL FORM → ARABIC LETTER THEH, ARABIC LETTER REH       # 
+
+FC77 ; 062B 0632 ;     ML      # ( ‎ﱷ‎ → ‎ثز‎ ) ARABIC LIGATURE THEH WITH ZAIN FINAL FORM → ARABIC LETTER THEH, ARABIC LETTER ZAIN     # 
+
+FCA6 ; 062B 0645 ;     ML      # ( ‎ﲦ‎ → ‎ثم‎ ) ARABIC LIGATURE THEH WITH MEEM INITIAL FORM → ARABIC LETTER THEH, ARABIC LETTER MEEM   # 
+FCE5 ; 062B 0645 ;     ML      # ( ‎ﳥ‎ → ‎ثم‎ ) ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM → ARABIC LETTER THEH, ARABIC LETTER MEEM    # 
+FC78 ; 062B 0645 ;     ML      # ( ‎ﱸ‎ → ‎ثم‎ ) ARABIC LIGATURE THEH WITH MEEM FINAL FORM → ARABIC LETTER THEH, ARABIC LETTER MEEM     # 
+FC12 ; 062B 0645 ;     ML      # ( ‎ﰒ‎ → ‎ثم‎ ) ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM → ARABIC LETTER THEH, ARABIC LETTER MEEM  # 
+
+FCE6 ; 062B 0647 ;     ML      # ( ‎ﳦ‎ → ‎ثه‎ ) ARABIC LIGATURE THEH WITH HEH MEDIAL FORM → ARABIC LETTER THEH, ARABIC LETTER HEH      # 
+
+FC7A ; 062B 0649 ;     ML      # ( ‎ﱺ‎ → ‎ثى‎ ) ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER THEH, ARABIC LETTER ALEF MAKSURA     # 
+FC13 ; 062B 0649 ;     ML      # ( ‎ﰓ‎ → ‎ثى‎ ) ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER THEH, ARABIC LETTER ALEF MAKSURA  # 
+FC7B ; 062B 0649 ;     ML      # ( ‎ﱻ‎ → ‎ثى‎ ) ARABIC LIGATURE THEH WITH YEH FINAL FORM → ARABIC LETTER THEH, ARABIC LETTER ALEF MAKSURA      # →‎ثي‎→
+FC14 ; 062B 0649 ;     ML      # ( ‎ﰔ‎ → ‎ثى‎ ) ARABIC LIGATURE THEH WITH YEH ISOLATED FORM → ARABIC LETTER THEH, ARABIC LETTER ALEF MAKSURA   # →‎ثي‎→
+
+FB68 ; 0679 ;  ML      # ( ‎ﭨ‎ → ‎ٹ‎ ) ARABIC LETTER TTEH INITIAL FORM → ARABIC LETTER TTEH     # 
+FB69 ; 0679 ;  ML      # ( ‎ﭩ‎ → ‎ٹ‎ ) ARABIC LETTER TTEH MEDIAL FORM → ARABIC LETTER TTEH      # 
+FB67 ; 0679 ;  ML      # ( ‎ﭧ‎ → ‎ٹ‎ ) ARABIC LETTER TTEH FINAL FORM → ARABIC LETTER TTEH       # 
+FB66 ; 0679 ;  ML      # ( ‎ﭦ‎ → ‎ٹ‎ ) ARABIC LETTER TTEH ISOLATED FORM → ARABIC LETTER TTEH    # 
+06BB ; 0679 ;  ML      # ( ‎ڻ‎ → ‎ٹ‎ ) ARABIC LETTER RNOON → ARABIC LETTER TTEH  # →‎ﮢ‎→→‎ﭩ‎→
+FBA2 ; 0679 ;  ML      # ( ‎ﮢ‎ → ‎ٹ‎ ) ARABIC LETTER RNOON INITIAL FORM → ARABIC LETTER TTEH    # →‎ﭩ‎→
+FBA3 ; 0679 ;  ML      # ( ‎ﮣ‎ → ‎ٹ‎ ) ARABIC LETTER RNOON MEDIAL FORM → ARABIC LETTER TTEH     # →‎ﭩ‎→
+FBA1 ; 0679 ;  ML      # ( ‎ﮡ‎ → ‎ٹ‎ ) ARABIC LETTER RNOON FINAL FORM → ARABIC LETTER TTEH      # →‎ڻ‎→→‎ﮢ‎→→‎ﭩ‎→
+FBA0 ; 0679 ;  ML      # ( ‎ﮠ‎ → ‎ٹ‎ ) ARABIC LETTER RNOON ISOLATED FORM → ARABIC LETTER TTEH   # →‎ڻ‎→→‎ﮢ‎→→‎ﭩ‎→
+
+067B ; 067A ;  ML      # ( ‎ٻ‎ → ‎ٺ‎ ) ARABIC LETTER BEEH → ARABIC LETTER TTEHEH # →‎ﭞ‎→
+FB54 ; 067A ;  ML      # ( ‎ﭔ‎ → ‎ٺ‎ ) ARABIC LETTER BEEH INITIAL FORM → ARABIC LETTER TTEHEH   # →‎ﭡ‎→
+FB55 ; 067A ;  ML      # ( ‎ﭕ‎ → ‎ٺ‎ ) ARABIC LETTER BEEH MEDIAL FORM → ARABIC LETTER TTEHEH    # →‎ﭡ‎→
+FB53 ; 067A ;  ML      # ( ‎ﭓ‎ → ‎ٺ‎ ) ARABIC LETTER BEEH FINAL FORM → ARABIC LETTER TTEHEH     # 
+FB52 ; 067A ;  ML      # ( ‎ﭒ‎ → ‎ٺ‎ ) ARABIC LETTER BEEH ISOLATED FORM → ARABIC LETTER TTEHEH  # 
+FB60 ; 067A ;  ML      # ( ‎ﭠ‎ → ‎ٺ‎ ) ARABIC LETTER TTEHEH INITIAL FORM → ARABIC LETTER TTEHEH # 
+FB61 ; 067A ;  ML      # ( ‎ﭡ‎ → ‎ٺ‎ ) ARABIC LETTER TTEHEH MEDIAL FORM → ARABIC LETTER TTEHEH  # 
+FB5F ; 067A ;  ML      # ( ‎ﭟ‎ → ‎ٺ‎ ) ARABIC LETTER TTEHEH FINAL FORM → ARABIC LETTER TTEHEH   # 
+FB5E ; 067A ;  ML      # ( ‎ﭞ‎ → ‎ٺ‎ ) ARABIC LETTER TTEHEH ISOLATED FORM → ARABIC LETTER TTEHEH        # 
+06D0 ; 067A ;  ML      # ( ‎ې‎ → ‎ٺ‎ ) ARABIC LETTER E → ARABIC LETTER TTEHEH    # →‎ﯦ‎→→‎ﭡ‎→
+FBE6 ; 067A ;  ML      # ( ‎ﯦ‎ → ‎ٺ‎ ) ARABIC LETTER E INITIAL FORM → ARABIC LETTER TTEHEH      # →‎ﭡ‎→
+FBE7 ; 067A ;  ML      # ( ‎ﯧ‎ → ‎ٺ‎ ) ARABIC LETTER E MEDIAL FORM → ARABIC LETTER TTEHEH       # →‎ﭡ‎→
+FBE5 ; 067A ;  ML      # ( ‎ﯥ‎ → ‎ٺ‎ ) ARABIC LETTER E FINAL FORM → ARABIC LETTER TTEHEH        # →‎ې‎→→‎ﯦ‎→→‎ﭡ‎→
+FBE4 ; 067A ;  ML      # ( ‎ﯤ‎ → ‎ٺ‎ ) ARABIC LETTER E ISOLATED FORM → ARABIC LETTER TTEHEH     # →‎ې‎→→‎ﯦ‎→→‎ﭡ‎→
+
+0680 ; 067F ;  ML      # ( ‎ڀ‎ → ‎ٿ‎ ) ARABIC LETTER BEHEH → ARABIC LETTER TEHEH # →‎ﭚ‎→
+FB5C ; 067F ;  ML      # ( ‎ﭜ‎ → ‎ٿ‎ ) ARABIC LETTER BEHEH INITIAL FORM → ARABIC LETTER TEHEH   # →‎ﭥ‎→
+FB5D ; 067F ;  ML      # ( ‎ﭝ‎ → ‎ٿ‎ ) ARABIC LETTER BEHEH MEDIAL FORM → ARABIC LETTER TEHEH    # →‎ﭥ‎→
+FB5B ; 067F ;  ML      # ( ‎ﭛ‎ → ‎ٿ‎ ) ARABIC LETTER BEHEH FINAL FORM → ARABIC LETTER TEHEH     # 
+FB5A ; 067F ;  ML      # ( ‎ﭚ‎ → ‎ٿ‎ ) ARABIC LETTER BEHEH ISOLATED FORM → ARABIC LETTER TEHEH  # 
+FB64 ; 067F ;  ML      # ( ‎ﭤ‎ → ‎ٿ‎ ) ARABIC LETTER TEHEH INITIAL FORM → ARABIC LETTER TEHEH   # 
+FB65 ; 067F ;  ML      # ( ‎ﭥ‎ → ‎ٿ‎ ) ARABIC LETTER TEHEH MEDIAL FORM → ARABIC LETTER TEHEH    # 
+FB63 ; 067F ;  ML      # ( ‎ﭣ‎ → ‎ٿ‎ ) ARABIC LETTER TEHEH FINAL FORM → ARABIC LETTER TEHEH     # 
+FB62 ; 067F ;  ML      # ( ‎ﭢ‎ → ‎ٿ‎ ) ARABIC LETTER TEHEH ISOLATED FORM → ARABIC LETTER TEHEH  # 
+
+FE9F ; 062C ;  ML      # ( ‎ﺟ‎ → ‎ج‎ ) ARABIC LETTER JEEM INITIAL FORM → ARABIC LETTER JEEM     # 
+FEA0 ; 062C ;  ML      # ( ‎ﺠ‎ → ‎ج‎ ) ARABIC LETTER JEEM MEDIAL FORM → ARABIC LETTER JEEM      # 
+FE9E ; 062C ;  ML      # ( ‎ﺞ‎ → ‎ج‎ ) ARABIC LETTER JEEM FINAL FORM → ARABIC LETTER JEEM       # 
+FE9D ; 062C ;  ML      # ( ‎ﺝ‎ → ‎ج‎ ) ARABIC LETTER JEEM ISOLATED FORM → ARABIC LETTER JEEM    # 
+062E ; 062C ;  ML      # ( ‎خ‎ → ‎ج‎ ) ARABIC LETTER KHAH → ARABIC LETTER JEEM   # 
+FEA7 ; 062C ;  ML      # ( ‎ﺧ‎ → ‎ج‎ ) ARABIC LETTER KHAH INITIAL FORM → ARABIC LETTER JEEM     # →‎خ‎→
+FEA8 ; 062C ;  ML      # ( ‎ﺨ‎ → ‎ج‎ ) ARABIC LETTER KHAH MEDIAL FORM → ARABIC LETTER JEEM      # →‎خ‎→
+FEA6 ; 062C ;  ML      # ( ‎ﺦ‎ → ‎ج‎ ) ARABIC LETTER KHAH FINAL FORM → ARABIC LETTER JEEM       # →‎خ‎→
+FEA5 ; 062C ;  ML      # ( ‎ﺥ‎ → ‎ج‎ ) ARABIC LETTER KHAH ISOLATED FORM → ARABIC LETTER JEEM    # 
+
+FCAB ; 062C 062C ;     ML      # ( ‎ﲫ‎ → ‎جج‎ ) ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM → ARABIC LETTER JEEM, ARABIC LETTER JEEM   # →‎خج‎→
+FC19 ; 062C 062C ;     ML      # ( ‎ﰙ‎ → ‎جج‎ ) ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM → ARABIC LETTER JEEM, ARABIC LETTER JEEM  # →‎خج‎→
+
+FCA7 ; 062C 062D ;     ML      # ( ‎ﲧ‎ → ‎جح‎ ) ARABIC LIGATURE JEEM WITH HAH INITIAL FORM → ARABIC LETTER JEEM, ARABIC LETTER HAH     # 
+FC15 ; 062C 062D ;     ML      # ( ‎ﰕ‎ → ‎جح‎ ) ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM → ARABIC LETTER JEEM, ARABIC LETTER HAH    # 
+FC1A ; 062C 062D ;     ML      # ( ‎ﰚ‎ → ‎جح‎ ) ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM → ARABIC LETTER JEEM, ARABIC LETTER HAH    # →‎ﰕ‎→
+
+FDA6 ; 062C 062D 0649 ;        ML      # ( ‎ﶦ‎ → ‎جحى‎ ) ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER JEEM, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA       # 
+FDBE ; 062C 062D 0649 ;        ML      # ( ‎ﶾ‎ → ‎جحى‎ ) ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM → ARABIC LETTER JEEM, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA        # →‎جحي‎→
+
+FDFB ; 062C 0644 0020 062C 0644 0627 0644 0647 ;       ML      #* ( ‎ﷻ‎ → ‎جل جلاله‎ ) ARABIC LIGATURE JALLAJALALOUHOU → ARABIC LETTER JEEM, ARABIC LETTER LAM, SPACE, ARABIC LETTER JEEM, ARABIC LETTER LAM, ARABIC LETTER ALEF, ARABIC LETTER LAM, ARABIC LETTER HEH    # 
+
+FCA8 ; 062C 0645 ;     ML      # ( ‎ﲨ‎ → ‎جم‎ ) ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM → ARABIC LETTER JEEM, ARABIC LETTER MEEM   # 
+FC16 ; 062C 0645 ;     ML      # ( ‎ﰖ‎ → ‎جم‎ ) ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM → ARABIC LETTER JEEM, ARABIC LETTER MEEM  # 
+FCAC ; 062C 0645 ;     ML      # ( ‎ﲬ‎ → ‎جم‎ ) ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM → ARABIC LETTER JEEM, ARABIC LETTER MEEM   # →‎ﲨ‎→
+FC1B ; 062C 0645 ;     ML      # ( ‎ﰛ‎ → ‎جم‎ ) ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM → ARABIC LETTER JEEM, ARABIC LETTER MEEM  # →‎ﰖ‎→
+
+FD59 ; 062C 0645 062D ;        ML      # ( ‎ﵙ‎ → ‎جمح‎ ) ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM → ARABIC LETTER JEEM, ARABIC LETTER MEEM, ARABIC LETTER HAH     # 
+FD58 ; 062C 0645 062D ;        ML      # ( ‎ﵘ‎ → ‎جمح‎ ) ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM → ARABIC LETTER JEEM, ARABIC LETTER MEEM, ARABIC LETTER HAH       # 
+
+FDA7 ; 062C 0645 0649 ;        ML      # ( ‎ﶧ‎ → ‎جمى‎ ) ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER JEEM, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA     # 
+FDA5 ; 062C 0645 0649 ;        ML      # ( ‎ﶥ‎ → ‎جمى‎ ) ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER JEEM, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA      # →‎جمي‎→
+
+FD1D ; 062C 0649 ;     ML      # ( ‎ﴝ‎ → ‎جى‎ ) ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA     # 
+FD01 ; 062C 0649 ;     ML      # ( ‎ﴁ‎ → ‎جى‎ ) ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA  # 
+FD1E ; 062C 0649 ;     ML      # ( ‎ﴞ‎ → ‎جى‎ ) ARABIC LIGATURE JEEM WITH YEH FINAL FORM → ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA      # →‎جي‎→
+FD02 ; 062C 0649 ;     ML      # ( ‎ﴂ‎ → ‎جى‎ ) ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM → ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA   # →‎جي‎→
+FD1F ; 062C 0649 ;     ML      # ( ‎ﴟ‎ → ‎جى‎ ) ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA     # →‎خى‎→→‎ﴃ‎→→‎ﴁ‎→
+FD03 ; 062C 0649 ;     ML      # ( ‎ﴃ‎ → ‎جى‎ ) ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA  # →‎ﴁ‎→
+FD20 ; 062C 0649 ;     ML      # ( ‎ﴠ‎ → ‎جى‎ ) ARABIC LIGATURE KHAH WITH YEH FINAL FORM → ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA      # →‎خي‎→→‎ﴄ‎→→‎ﴂ‎→→‎جي‎→
+FD04 ; 062C 0649 ;     ML      # ( ‎ﴄ‎ → ‎جى‎ ) ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM → ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA   # →‎ﴂ‎→→‎جي‎→
+
+FB78 ; 0683 ;  ML      # ( ‎ﭸ‎ → ‎ڃ‎ ) ARABIC LETTER NYEH INITIAL FORM → ARABIC LETTER NYEH     # 
+FB79 ; 0683 ;  ML      # ( ‎ﭹ‎ → ‎ڃ‎ ) ARABIC LETTER NYEH MEDIAL FORM → ARABIC LETTER NYEH      # 
+FB77 ; 0683 ;  ML      # ( ‎ﭷ‎ → ‎ڃ‎ ) ARABIC LETTER NYEH FINAL FORM → ARABIC LETTER NYEH       # 
+FB76 ; 0683 ;  ML      # ( ‎ﭶ‎ → ‎ڃ‎ ) ARABIC LETTER NYEH ISOLATED FORM → ARABIC LETTER NYEH    # 
+
+FB7C ; 0686 ;  ML      # ( ‎ﭼ‎ → ‎چ‎ ) ARABIC LETTER TCHEH INITIAL FORM → ARABIC LETTER TCHEH   # 
+FB7D ; 0686 ;  ML      # ( ‎ﭽ‎ → ‎چ‎ ) ARABIC LETTER TCHEH MEDIAL FORM → ARABIC LETTER TCHEH    # 
+FB7B ; 0686 ;  ML      # ( ‎ﭻ‎ → ‎چ‎ ) ARABIC LETTER TCHEH FINAL FORM → ARABIC LETTER TCHEH     # 
+FB7A ; 0686 ;  ML      # ( ‎ﭺ‎ → ‎چ‎ ) ARABIC LETTER TCHEH ISOLATED FORM → ARABIC LETTER TCHEH  # 
+
+FB80 ; 0687 ;  ML      # ( ‎ﮀ‎ → ‎ڇ‎ ) ARABIC LETTER TCHEHEH INITIAL FORM → ARABIC LETTER TCHEHEH       # 
+FB81 ; 0687 ;  ML      # ( ‎ﮁ‎ → ‎ڇ‎ ) ARABIC LETTER TCHEHEH MEDIAL FORM → ARABIC LETTER TCHEHEH        # 
+FB7F ; 0687 ;  ML      # ( ‎ﭿ‎ → ‎ڇ‎ ) ARABIC LETTER TCHEHEH FINAL FORM → ARABIC LETTER TCHEHEH # 
+FB7E ; 0687 ;  ML      # ( ‎ﭾ‎ → ‎ڇ‎ ) ARABIC LETTER TCHEHEH ISOLATED FORM → ARABIC LETTER TCHEHEH      # 
+
+FEA3 ; 062D ;  ML      # ( ‎ﺣ‎ → ‎ح‎ ) ARABIC LETTER HAH INITIAL FORM → ARABIC LETTER HAH       # 
+FEA4 ; 062D ;  ML      # ( ‎ﺤ‎ → ‎ح‎ ) ARABIC LETTER HAH MEDIAL FORM → ARABIC LETTER HAH        # 
+FEA2 ; 062D ;  ML      # ( ‎ﺢ‎ → ‎ح‎ ) ARABIC LETTER HAH FINAL FORM → ARABIC LETTER HAH # 
+FEA1 ; 062D ;  ML      # ( ‎ﺡ‎ → ‎ح‎ ) ARABIC LETTER HAH ISOLATED FORM → ARABIC LETTER HAH      # 
+
+FCA9 ; 062D 062C ;     ML      # ( ‎ﲩ‎ → ‎حج‎ ) ARABIC LIGATURE HAH WITH JEEM INITIAL FORM → ARABIC LETTER HAH, ARABIC LETTER JEEM     # 
+FC17 ; 062D 062C ;     ML      # ( ‎ﰗ‎ → ‎حج‎ ) ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM → ARABIC LETTER HAH, ARABIC LETTER JEEM    # 
+
+FDBF ; 062D 062C 0649 ;        ML      # ( ‎ﶿ‎ → ‎حجى‎ ) ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM → ARABIC LETTER HAH, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA        # →‎حجي‎→
+
+FCAA ; 062D 0645 ;     ML      # ( ‎ﲪ‎ → ‎حم‎ ) ARABIC LIGATURE HAH WITH MEEM INITIAL FORM → ARABIC LETTER HAH, ARABIC LETTER MEEM     # 
+FC18 ; 062D 0645 ;     ML      # ( ‎ﰘ‎ → ‎حم‎ ) ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM → ARABIC LETTER HAH, ARABIC LETTER MEEM    # 
+
+FD5B ; 062D 0645 0649 ;        ML      # ( ‎ﵛ‎ → ‎حمى‎ ) ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER HAH, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA       # 
+FD5A ; 062D 0645 0649 ;        ML      # ( ‎ﵚ‎ → ‎حمى‎ ) ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER HAH, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA        # →‎حمي‎→
+
+FD1B ; 062D 0649 ;     ML      # ( ‎ﴛ‎ → ‎حى‎ ) ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA       # 
+FCFF ; 062D 0649 ;     ML      # ( ‎ﳿ‎ → ‎حى‎ ) ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA    # 
+FD1C ; 062D 0649 ;     ML      # ( ‎ﴜ‎ → ‎حى‎ ) ARABIC LIGATURE HAH WITH YEH FINAL FORM → ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA        # →‎حي‎→
+FD00 ; 062D 0649 ;     ML      # ( ‎ﴀ‎ → ‎حى‎ ) ARABIC LIGATURE HAH WITH YEH ISOLATED FORM → ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA     # →‎حي‎→
+
+0684 ; 0682 ;  ML      # ( ‎ڄ‎ → ‎ڂ‎ ) ARABIC LETTER DYEH → ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE       # 
+FB74 ; 0682 ;  ML      # ( ‎ﭴ‎ → ‎ڂ‎ ) ARABIC LETTER DYEH INITIAL FORM → ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE # →‎ڄ‎→
+FB75 ; 0682 ;  ML      # ( ‎ﭵ‎ → ‎ڂ‎ ) ARABIC LETTER DYEH MEDIAL FORM → ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE  # →‎ڄ‎→
+FB73 ; 0682 ;  ML      # ( ‎ﭳ‎ → ‎ڂ‎ ) ARABIC LETTER DYEH FINAL FORM → ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE   # →‎ڄ‎→
+FB72 ; 0682 ;  ML      # ( ‎ﭲ‎ → ‎ڂ‎ ) ARABIC LETTER DYEH ISOLATED FORM → ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE        # 
+
+FEAA ; 062F ;  ML      # ( ‎ﺪ‎ → ‎د‎ ) ARABIC LETTER DAL FINAL FORM → ARABIC LETTER DAL # 
+FEA9 ; 062F ;  ML      # ( ‎ﺩ‎ → ‎د‎ ) ARABIC LETTER DAL ISOLATED FORM → ARABIC LETTER DAL      # 
+
+FEAC ; 0630 ;  ML      # ( ‎ﺬ‎ → ‎ذ‎ ) ARABIC LETTER THAL FINAL FORM → ARABIC LETTER THAL       # 
+FEAB ; 0630 ;  ML      # ( ‎ﺫ‎ → ‎ذ‎ ) ARABIC LETTER THAL ISOLATED FORM → ARABIC LETTER THAL    # 
+
+FC5B ; 0630 0670 ;     ML      # ( ‎ﱛ‎ → ‎ذٰ‎ ) ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM → ARABIC LETTER THAL, ARABIC LETTER SUPERSCRIPT ALEF  # 
+
+FB89 ; 0688 ;  ML      # ( ‎ﮉ‎ → ‎ڈ‎ ) ARABIC LETTER DDAL FINAL FORM → ARABIC LETTER DDAL       # 
+FB88 ; 0688 ;  ML      # ( ‎ﮈ‎ → ‎ڈ‎ ) ARABIC LETTER DDAL ISOLATED FORM → ARABIC LETTER DDAL    # 
+
+FB85 ; 068C ;  ML      # ( ‎ﮅ‎ → ‎ڌ‎ ) ARABIC LETTER DAHAL FINAL FORM → ARABIC LETTER DAHAL     # 
+FB84 ; 068C ;  ML      # ( ‎ﮄ‎ → ‎ڌ‎ ) ARABIC LETTER DAHAL ISOLATED FORM → ARABIC LETTER DAHAL  # 
+
+FB83 ; 068D ;  ML      # ( ‎ﮃ‎ → ‎ڍ‎ ) ARABIC LETTER DDAHAL FINAL FORM → ARABIC LETTER DDAHAL   # 
+FB82 ; 068D ;  ML      # ( ‎ﮂ‎ → ‎ڍ‎ ) ARABIC LETTER DDAHAL ISOLATED FORM → ARABIC LETTER DDAHAL        # 
+
+FB87 ; 068E ;  ML      # ( ‎ﮇ‎ → ‎ڎ‎ ) ARABIC LETTER DUL FINAL FORM → ARABIC LETTER DUL # 
+FB86 ; 068E ;  ML      # ( ‎ﮆ‎ → ‎ڎ‎ ) ARABIC LETTER DUL ISOLATED FORM → ARABIC LETTER DUL      # 
+
+FEAE ; 0631 ;  ML      # ( ‎ﺮ‎ → ‎ر‎ ) ARABIC LETTER REH FINAL FORM → ARABIC LETTER REH # 
+FEAD ; 0631 ;  ML      # ( ‎ﺭ‎ → ‎ر‎ ) ARABIC LETTER REH ISOLATED FORM → ARABIC LETTER REH      # 
+
+FC5C ; 0631 0670 ;     ML      # ( ‎ﱜ‎ → ‎رٰ‎ ) ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM → ARABIC LETTER REH, ARABIC LETTER SUPERSCRIPT ALEF    # 
+
+FDF6 ; 0631 0633 0648 0644 ;   ML      # ( ‎ﷶ‎ → ‎رسول‎ ) ARABIC LIGATURE RASOUL ISOLATED FORM → ARABIC LETTER REH, ARABIC LETTER SEEN, ARABIC LETTER WAW, ARABIC LETTER LAM # 
+
+FDFC ; 0631 0649 0627 0644 ;   ML      #* ( ‎﷼‎ → ‎رىال‎ ) RIAL SIGN → ARABIC LETTER REH, ARABIC LETTER ALEF MAKSURA, ARABIC LETTER ALEF, ARABIC LETTER LAM  # →‎ریال‎→
+
+FEB0 ; 0632 ;  ML      # ( ‎ﺰ‎ → ‎ز‎ ) ARABIC LETTER ZAIN FINAL FORM → ARABIC LETTER ZAIN       # 
+FEAF ; 0632 ;  ML      # ( ‎ﺯ‎ → ‎ز‎ ) ARABIC LETTER ZAIN ISOLATED FORM → ARABIC LETTER ZAIN    # 
+0694 ; 0632 ;  ML      # ( ‎ڔ‎ → ‎ز‎ ) ARABIC LETTER REH WITH DOT BELOW → ARABIC LETTER ZAIN     # 
+
+FB8D ; 0691 ;  ML      # ( ‎ﮍ‎ → ‎ڑ‎ ) ARABIC LETTER RREH FINAL FORM → ARABIC LETTER RREH       # 
+FB8C ; 0691 ;  ML      # ( ‎ﮌ‎ → ‎ڑ‎ ) ARABIC LETTER RREH ISOLATED FORM → ARABIC LETTER RREH    # 
+
+FB8B ; 0698 ;  ML      # ( ‎ﮋ‎ → ‎ژ‎ ) ARABIC LETTER JEH FINAL FORM → ARABIC LETTER JEH # 
+FB8A ; 0698 ;  ML      # ( ‎ﮊ‎ → ‎ژ‎ ) ARABIC LETTER JEH ISOLATED FORM → ARABIC LETTER JEH      # 
+
+FEB3 ; 0633 ;  ML      # ( ‎ﺳ‎ → ‎س‎ ) ARABIC LETTER SEEN INITIAL FORM → ARABIC LETTER SEEN     # 
+FEB4 ; 0633 ;  ML      # ( ‎ﺴ‎ → ‎س‎ ) ARABIC LETTER SEEN MEDIAL FORM → ARABIC LETTER SEEN      # 
+FEB2 ; 0633 ;  ML      # ( ‎ﺲ‎ → ‎س‎ ) ARABIC LETTER SEEN FINAL FORM → ARABIC LETTER SEEN       # 
+FEB1 ; 0633 ;  ML      # ( ‎ﺱ‎ → ‎س‎ ) ARABIC LETTER SEEN ISOLATED FORM → ARABIC LETTER SEEN    # 
+
+FCAD ; 0633 062C ;     ML      # ( ‎ﲭ‎ → ‎سج‎ ) ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER JEEM   # 
+FD34 ; 0633 062C ;     ML      # ( ‎ﴴ‎ → ‎سج‎ ) ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER JEEM    # 
+FC1C ; 0633 062C ;     ML      # ( ‎ﰜ‎ → ‎سج‎ ) ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM → ARABIC LETTER SEEN, ARABIC LETTER JEEM  # 
+FCAF ; 0633 062C ;     ML      # ( ‎ﲯ‎ → ‎سج‎ ) ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER JEEM   # →‎سخ‎→→‎ﰞ‎→→‎ﰜ‎→
+FD36 ; 0633 062C ;     ML      # ( ‎ﴶ‎ → ‎سج‎ ) ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER JEEM    # →‎سخ‎→→‎ﰞ‎→→‎ﰜ‎→
+FC1E ; 0633 062C ;     ML      # ( ‎ﰞ‎ → ‎سج‎ ) ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM → ARABIC LETTER SEEN, ARABIC LETTER JEEM  # →‎ﰜ‎→
+
+FD5D ; 0633 062C 062D ;        ML      # ( ‎ﵝ‎ → ‎سجح‎ ) ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER JEEM, ARABIC LETTER HAH     # 
+
+FD5E ; 0633 062C 0649 ;        ML      # ( ‎ﵞ‎ → ‎سجى‎ ) ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER SEEN, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA     # 
+FDA8 ; 0633 062C 0649 ;        ML      # ( ‎ﶨ‎ → ‎سجى‎ ) ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER SEEN, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA     # →‎سخى‎→
+FDC6 ; 0633 062C 0649 ;        ML      # ( ‎ﷆ‎ → ‎سجى‎ ) ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM → ARABIC LETTER SEEN, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA      # →‎سخي‎→
+
+FCAE ; 0633 062D ;     ML      # ( ‎ﲮ‎ → ‎سح‎ ) ARABIC LIGATURE SEEN WITH HAH INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER HAH     # 
+FD35 ; 0633 062D ;     ML      # ( ‎ﴵ‎ → ‎سح‎ ) ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER HAH      # 
+FC1D ; 0633 062D ;     ML      # ( ‎ﰝ‎ → ‎سح‎ ) ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM → ARABIC LETTER SEEN, ARABIC LETTER HAH    # 
+
+FD5C ; 0633 062D 062C ;        ML      # ( ‎ﵜ‎ → ‎سحج‎ ) ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER HAH, ARABIC LETTER JEEM     # 
+
+FD2A ; 0633 0631 ;     ML      # ( ‎ﴪ‎ → ‎سر‎ ) ARABIC LIGATURE SEEN WITH REH FINAL FORM → ARABIC LETTER SEEN, ARABIC LETTER REH       # 
+FD0E ; 0633 0631 ;     ML      # ( ‎ﴎ‎ → ‎سر‎ ) ARABIC LIGATURE SEEN WITH REH ISOLATED FORM → ARABIC LETTER SEEN, ARABIC LETTER REH    # 
+
+FCB0 ; 0633 0645 ;     ML      # ( ‎ﲰ‎ → ‎سم‎ ) ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER MEEM   # 
+FCE7 ; 0633 0645 ;     ML      # ( ‎ﳧ‎ → ‎سم‎ ) ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER MEEM    # 
+FC1F ; 0633 0645 ;     ML      # ( ‎ﰟ‎ → ‎سم‎ ) ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM → ARABIC LETTER SEEN, ARABIC LETTER MEEM  # 
+
+FD61 ; 0633 0645 062C ;        ML      # ( ‎ﵡ‎ → ‎سمج‎ ) ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER MEEM, ARABIC LETTER JEEM   # 
+
+FD60 ; 0633 0645 062D ;        ML      # ( ‎ﵠ‎ → ‎سمح‎ ) ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER MEEM, ARABIC LETTER HAH     # 
+FD5F ; 0633 0645 062D ;        ML      # ( ‎ﵟ‎ → ‎سمح‎ ) ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM → ARABIC LETTER SEEN, ARABIC LETTER MEEM, ARABIC LETTER HAH       # 
+
+FD63 ; 0633 0645 0645 ;        ML      # ( ‎ﵣ‎ → ‎سمم‎ ) ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER MEEM, ARABIC LETTER MEEM   # 
+FD62 ; 0633 0645 0645 ;        ML      # ( ‎ﵢ‎ → ‎سمم‎ ) ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM → ARABIC LETTER SEEN, ARABIC LETTER MEEM, ARABIC LETTER MEEM     # 
+
+FD31 ; 0633 0647 ;     ML      # ( ‎ﴱ‎ → ‎سه‎ ) ARABIC LIGATURE SEEN WITH HEH INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER HEH     # 
+FCE8 ; 0633 0647 ;     ML      # ( ‎ﳨ‎ → ‎سه‎ ) ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER HEH      # 
+
+FD17 ; 0633 0649 ;     ML      # ( ‎ﴗ‎ → ‎سى‎ ) ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER SEEN, ARABIC LETTER ALEF MAKSURA     # 
+FCFB ; 0633 0649 ;     ML      # ( ‎ﳻ‎ → ‎سى‎ ) ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER SEEN, ARABIC LETTER ALEF MAKSURA  # 
+FD18 ; 0633 0649 ;     ML      # ( ‎ﴘ‎ → ‎سى‎ ) ARABIC LIGATURE SEEN WITH YEH FINAL FORM → ARABIC LETTER SEEN, ARABIC LETTER ALEF MAKSURA      # →‎سي‎→
+FCFC ; 0633 0649 ;     ML      # ( ‎ﳼ‎ → ‎سى‎ ) ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM → ARABIC LETTER SEEN, ARABIC LETTER ALEF MAKSURA   # →‎سي‎→
+
+FEB7 ; 0634 ;  ML      # ( ‎ﺷ‎ → ‎ش‎ ) ARABIC LETTER SHEEN INITIAL FORM → ARABIC LETTER SHEEN   # 
+FEB8 ; 0634 ;  ML      # ( ‎ﺸ‎ → ‎ش‎ ) ARABIC LETTER SHEEN MEDIAL FORM → ARABIC LETTER SHEEN    # 
+FEB6 ; 0634 ;  ML      # ( ‎ﺶ‎ → ‎ش‎ ) ARABIC LETTER SHEEN FINAL FORM → ARABIC LETTER SHEEN     # 
+FEB5 ; 0634 ;  ML      # ( ‎ﺵ‎ → ‎ش‎ ) ARABIC LETTER SHEEN ISOLATED FORM → ARABIC LETTER SHEEN  # 
+
+FD2D ; 0634 062C ;     ML      # ( ‎ﴭ‎ → ‎شج‎ ) ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER JEEM # 
+FD37 ; 0634 062C ;     ML      # ( ‎ﴷ‎ → ‎شج‎ ) ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER JEEM  # 
+FD25 ; 0634 062C ;     ML      # ( ‎ﴥ‎ → ‎شج‎ ) ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER JEEM   # 
+FD09 ; 0634 062C ;     ML      # ( ‎ﴉ‎ → ‎شج‎ ) ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM → ARABIC LETTER SHEEN, ARABIC LETTER JEEM        # 
+FD2F ; 0634 062C ;     ML      # ( ‎ﴯ‎ → ‎شج‎ ) ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER JEEM # →‎شخ‎→→‎ﴧ‎→→‎ﴥ‎→
+FD39 ; 0634 062C ;     ML      # ( ‎ﴹ‎ → ‎شج‎ ) ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER JEEM  # →‎شخ‎→→‎ﴧ‎→→‎ﴥ‎→
+FD27 ; 0634 062C ;     ML      # ( ‎ﴧ‎ → ‎شج‎ ) ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER JEEM   # →‎ﴥ‎→
+FD0B ; 0634 062C ;     ML      # ( ‎ﴋ‎ → ‎شج‎ ) ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM → ARABIC LETTER SHEEN, ARABIC LETTER JEEM        # →‎ﴉ‎→
+
+FD69 ; 0634 062C 0649 ;        ML      # ( ‎ﵩ‎ → ‎شجى‎ ) ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA    # →‎شجي‎→
+
+FD2E ; 0634 062D ;     ML      # ( ‎ﴮ‎ → ‎شح‎ ) ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER HAH   # 
+FD38 ; 0634 062D ;     ML      # ( ‎ﴸ‎ → ‎شح‎ ) ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER HAH    # 
+FD26 ; 0634 062D ;     ML      # ( ‎ﴦ‎ → ‎شح‎ ) ARABIC LIGATURE SHEEN WITH HAH FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER HAH     # 
+FD0A ; 0634 062D ;     ML      # ( ‎ﴊ‎ → ‎شح‎ ) ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM → ARABIC LETTER SHEEN, ARABIC LETTER HAH  # 
+
+FD68 ; 0634 062D 0645 ;        ML      # ( ‎ﵨ‎ → ‎شحم‎ ) ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER HAH, ARABIC LETTER MEEM   # 
+FD67 ; 0634 062D 0645 ;        ML      # ( ‎ﵧ‎ → ‎شحم‎ ) ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER HAH, ARABIC LETTER MEEM     # 
+
+FDAA ; 0634 062D 0649 ;        ML      # ( ‎ﶪ‎ → ‎شحى‎ ) ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA      # →‎شحي‎→
+
+FD29 ; 0634 0631 ;     ML      # ( ‎ﴩ‎ → ‎شر‎ ) ARABIC LIGATURE SHEEN WITH REH FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER REH     # 
+FD0D ; 0634 0631 ;     ML      # ( ‎ﴍ‎ → ‎شر‎ ) ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM → ARABIC LETTER SHEEN, ARABIC LETTER REH  # 
+
+FD30 ; 0634 0645 ;     ML      # ( ‎ﴰ‎ → ‎شم‎ ) ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER MEEM # 
+FCE9 ; 0634 0645 ;     ML      # ( ‎ﳩ‎ → ‎شم‎ ) ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER MEEM  # 
+FD28 ; 0634 0645 ;     ML      # ( ‎ﴨ‎ → ‎شم‎ ) ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER MEEM   # 
+FD0C ; 0634 0645 ;     ML      # ( ‎ﴌ‎ → ‎شم‎ ) ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM → ARABIC LETTER SHEEN, ARABIC LETTER MEEM        # 
+
+FD6B ; 0634 0645 062C ;        ML      # ( ‎ﵫ‎ → ‎شمج‎ ) ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER MEEM, ARABIC LETTER JEEM # →‎شمخ‎→
+FD6A ; 0634 0645 062C ;        ML      # ( ‎ﵪ‎ → ‎شمج‎ ) ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER MEEM, ARABIC LETTER JEEM   # →‎شمخ‎→
+
+FD6D ; 0634 0645 0645 ;        ML      # ( ‎ﵭ‎ → ‎شمم‎ ) ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER MEEM, ARABIC LETTER MEEM # 
+FD6C ; 0634 0645 0645 ;        ML      # ( ‎ﵬ‎ → ‎شمم‎ ) ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER MEEM, ARABIC LETTER MEEM   # 
+
+FD32 ; 0634 0647 ;     ML      # ( ‎ﴲ‎ → ‎شه‎ ) ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER HEH   # 
+FCEA ; 0634 0647 ;     ML      # ( ‎ﳪ‎ → ‎شه‎ ) ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER HEH    # 
+
+FD19 ; 0634 0649 ;     ML      # ( ‎ﴙ‎ → ‎شى‎ ) ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER ALEF MAKSURA   # 
+FCFD ; 0634 0649 ;     ML      # ( ‎ﳽ‎ → ‎شى‎ ) ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER SHEEN, ARABIC LETTER ALEF MAKSURA        # 
+FD1A ; 0634 0649 ;     ML      # ( ‎ﴚ‎ → ‎شى‎ ) ARABIC LIGATURE SHEEN WITH YEH FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER ALEF MAKSURA    # →‎شي‎→
+FCFE ; 0634 0649 ;     ML      # ( ‎ﳾ‎ → ‎شى‎ ) ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM → ARABIC LETTER SHEEN, ARABIC LETTER ALEF MAKSURA # →‎شي‎→
+
+FEBB ; 0635 ;  ML      # ( ‎ﺻ‎ → ‎ص‎ ) ARABIC LETTER SAD INITIAL FORM → ARABIC LETTER SAD       # 
+FEBC ; 0635 ;  ML      # ( ‎ﺼ‎ → ‎ص‎ ) ARABIC LETTER SAD MEDIAL FORM → ARABIC LETTER SAD        # 
+FEBA ; 0635 ;  ML      # ( ‎ﺺ‎ → ‎ص‎ ) ARABIC LETTER SAD FINAL FORM → ARABIC LETTER SAD # 
+FEB9 ; 0635 ;  ML      # ( ‎ﺹ‎ → ‎ص‎ ) ARABIC LETTER SAD ISOLATED FORM → ARABIC LETTER SAD      # 
+
+FCB2 ; 0635 062C ;     ML      # ( ‎ﲲ‎ → ‎صج‎ ) ARABIC LIGATURE SAD WITH KHAH INITIAL FORM → ARABIC LETTER SAD, ARABIC LETTER JEEM     # →‎صخ‎→
+
+FCB1 ; 0635 062D ;     ML      # ( ‎ﲱ‎ → ‎صح‎ ) ARABIC LIGATURE SAD WITH HAH INITIAL FORM → ARABIC LETTER SAD, ARABIC LETTER HAH       # 
+FC20 ; 0635 062D ;     ML      # ( ‎ﰠ‎ → ‎صح‎ ) ARABIC LIGATURE SAD WITH HAH ISOLATED FORM → ARABIC LETTER SAD, ARABIC LETTER HAH      # 
+
+FD65 ; 0635 062D 062D ;        ML      # ( ‎ﵥ‎ → ‎صحح‎ ) ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM → ARABIC LETTER SAD, ARABIC LETTER HAH, ARABIC LETTER HAH # 
+FD64 ; 0635 062D 062D ;        ML      # ( ‎ﵤ‎ → ‎صحح‎ ) ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM → ARABIC LETTER SAD, ARABIC LETTER HAH, ARABIC LETTER HAH   # 
+
+FDA9 ; 0635 062D 0649 ;        ML      # ( ‎ﶩ‎ → ‎صحى‎ ) ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM → ARABIC LETTER SAD, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA  # →‎صحي‎→
+
+FD2B ; 0635 0631 ;     ML      # ( ‎ﴫ‎ → ‎صر‎ ) ARABIC LIGATURE SAD WITH REH FINAL FORM → ARABIC LETTER SAD, ARABIC LETTER REH # 
+FD0F ; 0635 0631 ;     ML      # ( ‎ﴏ‎ → ‎صر‎ ) ARABIC LIGATURE SAD WITH REH ISOLATED FORM → ARABIC LETTER SAD, ARABIC LETTER REH      # 
+
+FDF5 ; 0635 0644 0639 0645 ;   ML      # ( ‎ﷵ‎ → ‎صلعم‎ ) ARABIC LIGATURE SALAM ISOLATED FORM → ARABIC LETTER SAD, ARABIC LETTER LAM, ARABIC LETTER AIN, ARABIC LETTER MEEM  # 
+
+FDF9 ; 0635 0644 0649 ;        ML      # ( ‎ﷹ‎ → ‎صلى‎ ) ARABIC LIGATURE SALLA ISOLATED FORM → ARABIC LETTER SAD, ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA       # 
+
+FDFA ; 0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 0649 0647 0020 0648 0633 0644 0645 ;     ML      #* ( ‎ﷺ‎ → ‎صلى الله علىه وسلم‎ ) ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM → ARABIC LETTER SAD, ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA, SPACE, ARABIC LETTER ALEF, ARABIC LETTER LAM, ARABIC LETTER LAM, ARABIC LETTER HEH, SPACE, ARABIC LETTER AIN, ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HEH, SPACE, ARABIC LETTER WAW, ARABIC LETTER SEEN, ARABIC LETTER LAM, ARABIC LETTER MEEM      # →‎صلى الله عليه وسلم‎→
+
+FDF0 ; 0635 0644 06D2 ;        ML      # ( ‎ﷰ‎ → ‎صلے‎ ) ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM → ARABIC LETTER SAD, ARABIC LETTER LAM, ARABIC LETTER YEH BARREE       # 
+
+FCB3 ; 0635 0645 ;     ML      # ( ‎ﲳ‎ → ‎صم‎ ) ARABIC LIGATURE SAD WITH MEEM INITIAL FORM → ARABIC LETTER SAD, ARABIC LETTER MEEM     # 
+FC21 ; 0635 0645 ;     ML      # ( ‎ﰡ‎ → ‎صم‎ ) ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM → ARABIC LETTER SAD, ARABIC LETTER MEEM    # 
+
+FDC5 ; 0635 0645 0645 ;        ML      # ( ‎ﷅ‎ → ‎صمم‎ ) ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM → ARABIC LETTER SAD, ARABIC LETTER MEEM, ARABIC LETTER MEEM     # 
+FD66 ; 0635 0645 0645 ;        ML      # ( ‎ﵦ‎ → ‎صمم‎ ) ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM → ARABIC LETTER SAD, ARABIC LETTER MEEM, ARABIC LETTER MEEM       # 
+
+FD21 ; 0635 0649 ;     ML      # ( ‎ﴡ‎ → ‎صى‎ ) ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER SAD, ARABIC LETTER ALEF MAKSURA       # 
+FD05 ; 0635 0649 ;     ML      # ( ‎ﴅ‎ → ‎صى‎ ) ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER SAD, ARABIC LETTER ALEF MAKSURA    # 
+FD22 ; 0635 0649 ;     ML      # ( ‎ﴢ‎ → ‎صى‎ ) ARABIC LIGATURE SAD WITH YEH FINAL FORM → ARABIC LETTER SAD, ARABIC LETTER ALEF MAKSURA        # →‎صي‎→
+FD06 ; 0635 0649 ;     ML      # ( ‎ﴆ‎ → ‎صى‎ ) ARABIC LIGATURE SAD WITH YEH ISOLATED FORM → ARABIC LETTER SAD, ARABIC LETTER ALEF MAKSURA     # →‎صي‎→
+
+FEBF ; 0636 ;  ML      # ( ‎ﺿ‎ → ‎ض‎ ) ARABIC LETTER DAD INITIAL FORM → ARABIC LETTER DAD       # 
+FEC0 ; 0636 ;  ML      # ( ‎ﻀ‎ → ‎ض‎ ) ARABIC LETTER DAD MEDIAL FORM → ARABIC LETTER DAD        # 
+FEBE ; 0636 ;  ML      # ( ‎ﺾ‎ → ‎ض‎ ) ARABIC LETTER DAD FINAL FORM → ARABIC LETTER DAD # 
+FEBD ; 0636 ;  ML      # ( ‎ﺽ‎ → ‎ض‎ ) ARABIC LETTER DAD ISOLATED FORM → ARABIC LETTER DAD      # 
+
+FCB4 ; 0636 062C ;     ML      # ( ‎ﲴ‎ → ‎ضج‎ ) ARABIC LIGATURE DAD WITH JEEM INITIAL FORM → ARABIC LETTER DAD, ARABIC LETTER JEEM     # 
+FC22 ; 0636 062C ;     ML      # ( ‎ﰢ‎ → ‎ضج‎ ) ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM → ARABIC LETTER DAD, ARABIC LETTER JEEM    # 
+FCB6 ; 0636 062C ;     ML      # ( ‎ﲶ‎ → ‎ضج‎ ) ARABIC LIGATURE DAD WITH KHAH INITIAL FORM → ARABIC LETTER DAD, ARABIC LETTER JEEM     # →‎ضخ‎→→‎ﰤ‎→→‎ﰢ‎→
+FC24 ; 0636 062C ;     ML      # ( ‎ﰤ‎ → ‎ضج‎ ) ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM → ARABIC LETTER DAD, ARABIC LETTER JEEM    # →‎ﰢ‎→
+
+FD70 ; 0636 062C 0645 ;        ML      # ( ‎ﵰ‎ → ‎ضجم‎ ) ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM → ARABIC LETTER DAD, ARABIC LETTER JEEM, ARABIC LETTER MEEM     # →‎ضخم‎→
+FD6F ; 0636 062C 0645 ;        ML      # ( ‎ﵯ‎ → ‎ضجم‎ ) ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM → ARABIC LETTER DAD, ARABIC LETTER JEEM, ARABIC LETTER MEEM       # →‎ضخم‎→
+
+FCB5 ; 0636 062D ;     ML      # ( ‎ﲵ‎ → ‎ضح‎ ) ARABIC LIGATURE DAD WITH HAH INITIAL FORM → ARABIC LETTER DAD, ARABIC LETTER HAH       # 
+FC23 ; 0636 062D ;     ML      # ( ‎ﰣ‎ → ‎ضح‎ ) ARABIC LIGATURE DAD WITH HAH ISOLATED FORM → ARABIC LETTER DAD, ARABIC LETTER HAH      # 
+
+FD6E ; 0636 062D 0649 ;        ML      # ( ‎ﵮ‎ → ‎ضحى‎ ) ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER DAD, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA # 
+FDAB ; 0636 062D 0649 ;        ML      # ( ‎ﶫ‎ → ‎ضحى‎ ) ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM → ARABIC LETTER DAD, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA  # →‎ضحي‎→
+
+FD2C ; 0636 0631 ;     ML      # ( ‎ﴬ‎ → ‎ضر‎ ) ARABIC LIGATURE DAD WITH REH FINAL FORM → ARABIC LETTER DAD, ARABIC LETTER REH # 
+FD10 ; 0636 0631 ;     ML      # ( ‎ﴐ‎ → ‎ضر‎ ) ARABIC LIGATURE DAD WITH REH ISOLATED FORM → ARABIC LETTER DAD, ARABIC LETTER REH      # 
+
+FCB7 ; 0636 0645 ;     ML      # ( ‎ﲷ‎ → ‎ضم‎ ) ARABIC LIGATURE DAD WITH MEEM INITIAL FORM → ARABIC LETTER DAD, ARABIC LETTER MEEM     # 
+FC25 ; 0636 0645 ;     ML      # ( ‎ﰥ‎ → ‎ضم‎ ) ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM → ARABIC LETTER DAD, ARABIC LETTER MEEM    # 
+
+FD23 ; 0636 0649 ;     ML      # ( ‎ﴣ‎ → ‎ضى‎ ) ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER DAD, ARABIC LETTER ALEF MAKSURA       # 
+FD07 ; 0636 0649 ;     ML      # ( ‎ﴇ‎ → ‎ضى‎ ) ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER DAD, ARABIC LETTER ALEF MAKSURA    # 
+FD24 ; 0636 0649 ;     ML      # ( ‎ﴤ‎ → ‎ضى‎ ) ARABIC LIGATURE DAD WITH YEH FINAL FORM → ARABIC LETTER DAD, ARABIC LETTER ALEF MAKSURA        # →‎ضي‎→
+FD08 ; 0636 0649 ;     ML      # ( ‎ﴈ‎ → ‎ضى‎ ) ARABIC LIGATURE DAD WITH YEH ISOLATED FORM → ARABIC LETTER DAD, ARABIC LETTER ALEF MAKSURA     # →‎ضي‎→
+
+FEC3 ; 0637 ;  ML      # ( ‎ﻃ‎ → ‎ط‎ ) ARABIC LETTER TAH INITIAL FORM → ARABIC LETTER TAH       # 
+FEC4 ; 0637 ;  ML      # ( ‎ﻄ‎ → ‎ط‎ ) ARABIC LETTER TAH MEDIAL FORM → ARABIC LETTER TAH        # 
+FEC2 ; 0637 ;  ML      # ( ‎ﻂ‎ → ‎ط‎ ) ARABIC LETTER TAH FINAL FORM → ARABIC LETTER TAH # 
+FEC1 ; 0637 ;  ML      # ( ‎ﻁ‎ → ‎ط‎ ) ARABIC LETTER TAH ISOLATED FORM → ARABIC LETTER TAH      # 
+
+FCB8 ; 0637 062D ;     ML      # ( ‎ﲸ‎ → ‎طح‎ ) ARABIC LIGATURE TAH WITH HAH INITIAL FORM → ARABIC LETTER TAH, ARABIC LETTER HAH       # 
+FC26 ; 0637 062D ;     ML      # ( ‎ﰦ‎ → ‎طح‎ ) ARABIC LIGATURE TAH WITH HAH ISOLATED FORM → ARABIC LETTER TAH, ARABIC LETTER HAH      # 
+
+FD33 ; 0637 0645 ;     ML      # ( ‎ﴳ‎ → ‎طم‎ ) ARABIC LIGATURE TAH WITH MEEM INITIAL FORM → ARABIC LETTER TAH, ARABIC LETTER MEEM     # 
+FD3A ; 0637 0645 ;     ML      # ( ‎ﴺ‎ → ‎طم‎ ) ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM → ARABIC LETTER TAH, ARABIC LETTER MEEM      # 
+FC27 ; 0637 0645 ;     ML      # ( ‎ﰧ‎ → ‎طم‎ ) ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM → ARABIC LETTER TAH, ARABIC LETTER MEEM    # 
+
+FD72 ; 0637 0645 062D ;        ML      # ( ‎ﵲ‎ → ‎طمح‎ ) ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM → ARABIC LETTER TAH, ARABIC LETTER MEEM, ARABIC LETTER HAH       # 
+FD71 ; 0637 0645 062D ;        ML      # ( ‎ﵱ‎ → ‎طمح‎ ) ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM → ARABIC LETTER TAH, ARABIC LETTER MEEM, ARABIC LETTER HAH # 
+
+FD73 ; 0637 0645 0645 ;        ML      # ( ‎ﵳ‎ → ‎طمم‎ ) ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM → ARABIC LETTER TAH, ARABIC LETTER MEEM, ARABIC LETTER MEEM     # 
+
+FD74 ; 0637 0645 0649 ;        ML      # ( ‎ﵴ‎ → ‎طمى‎ ) ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER TAH, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA        # →‎طمي‎→
+
+FD11 ; 0637 0649 ;     ML      # ( ‎ﴑ‎ → ‎طى‎ ) ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER TAH, ARABIC LETTER ALEF MAKSURA       # 
+FCF5 ; 0637 0649 ;     ML      # ( ‎ﳵ‎ → ‎طى‎ ) ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER TAH, ARABIC LETTER ALEF MAKSURA    # 
+FD12 ; 0637 0649 ;     ML      # ( ‎ﴒ‎ → ‎طى‎ ) ARABIC LIGATURE TAH WITH YEH FINAL FORM → ARABIC LETTER TAH, ARABIC LETTER ALEF MAKSURA        # →‎طي‎→
+FCF6 ; 0637 0649 ;     ML      # ( ‎ﳶ‎ → ‎طى‎ ) ARABIC LIGATURE TAH WITH YEH ISOLATED FORM → ARABIC LETTER TAH, ARABIC LETTER ALEF MAKSURA     # →‎طي‎→
+
+FEC7 ; 0638 ;  ML      # ( ‎ﻇ‎ → ‎ظ‎ ) ARABIC LETTER ZAH INITIAL FORM → ARABIC LETTER ZAH       # 
+FEC8 ; 0638 ;  ML      # ( ‎ﻈ‎ → ‎ظ‎ ) ARABIC LETTER ZAH MEDIAL FORM → ARABIC LETTER ZAH        # 
+FEC6 ; 0638 ;  ML      # ( ‎ﻆ‎ → ‎ظ‎ ) ARABIC LETTER ZAH FINAL FORM → ARABIC LETTER ZAH # 
+FEC5 ; 0638 ;  ML      # ( ‎ﻅ‎ → ‎ظ‎ ) ARABIC LETTER ZAH ISOLATED FORM → ARABIC LETTER ZAH      # 
+
+FCB9 ; 0638 0645 ;     ML      # ( ‎ﲹ‎ → ‎ظم‎ ) ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM → ARABIC LETTER ZAH, ARABIC LETTER MEEM     # 
+FD3B ; 0638 0645 ;     ML      # ( ‎ﴻ‎ → ‎ظم‎ ) ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM → ARABIC LETTER ZAH, ARABIC LETTER MEEM      # 
+FC28 ; 0638 0645 ;     ML      # ( ‎ﰨ‎ → ‎ظم‎ ) ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM → ARABIC LETTER ZAH, ARABIC LETTER MEEM    # 
+
+FECB ; 0639 ;  ML      # ( ‎ﻋ‎ → ‎ع‎ ) ARABIC LETTER AIN INITIAL FORM → ARABIC LETTER AIN       # 
+FECC ; 0639 ;  ML      # ( ‎ﻌ‎ → ‎ع‎ ) ARABIC LETTER AIN MEDIAL FORM → ARABIC LETTER AIN        # 
+FECA ; 0639 ;  ML      # ( ‎ﻊ‎ → ‎ع‎ ) ARABIC LETTER AIN FINAL FORM → ARABIC LETTER AIN # 
+FEC9 ; 0639 ;  ML      # ( ‎ﻉ‎ → ‎ع‎ ) ARABIC LETTER AIN ISOLATED FORM → ARABIC LETTER AIN      # 
+
+FCBA ; 0639 062C ;     ML      # ( ‎ﲺ‎ → ‎عج‎ ) ARABIC LIGATURE AIN WITH JEEM INITIAL FORM → ARABIC LETTER AIN, ARABIC LETTER JEEM     # 
+FC29 ; 0639 062C ;     ML      # ( ‎ﰩ‎ → ‎عج‎ ) ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM → ARABIC LETTER AIN, ARABIC LETTER JEEM    # 
+
+FDC4 ; 0639 062C 0645 ;        ML      # ( ‎ﷄ‎ → ‎عجم‎ ) ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM → ARABIC LETTER AIN, ARABIC LETTER JEEM, ARABIC LETTER MEEM     # 
+FD75 ; 0639 062C 0645 ;        ML      # ( ‎ﵵ‎ → ‎عجم‎ ) ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM → ARABIC LETTER AIN, ARABIC LETTER JEEM, ARABIC LETTER MEEM       # 
+
+FDF7 ; 0639 0644 0649 0647 ;   ML      # ( ‎ﷷ‎ → ‎علىه‎ ) ARABIC LIGATURE ALAYHE ISOLATED FORM → ARABIC LETTER AIN, ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HEH # →‎عليه‎→
+
+FCBB ; 0639 0645 ;     ML      # ( ‎ﲻ‎ → ‎عم‎ ) ARABIC LIGATURE AIN WITH MEEM INITIAL FORM → ARABIC LETTER AIN, ARABIC LETTER MEEM     # 
+FC2A ; 0639 0645 ;     ML      # ( ‎ﰪ‎ → ‎عم‎ ) ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM → ARABIC LETTER AIN, ARABIC LETTER MEEM    # 
+
+FD77 ; 0639 0645 0645 ;        ML      # ( ‎ﵷ‎ → ‎عمم‎ ) ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM → ARABIC LETTER AIN, ARABIC LETTER MEEM, ARABIC LETTER MEEM     # 
+FD76 ; 0639 0645 0645 ;        ML      # ( ‎ﵶ‎ → ‎عمم‎ ) ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM → ARABIC LETTER AIN, ARABIC LETTER MEEM, ARABIC LETTER MEEM       # 
+
+FD78 ; 0639 0645 0649 ;        ML      # ( ‎ﵸ‎ → ‎عمى‎ ) ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER AIN, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA       # 
+FDB6 ; 0639 0645 0649 ;        ML      # ( ‎ﶶ‎ → ‎عمى‎ ) ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER AIN, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA        # →‎عمي‎→
+
+FD13 ; 0639 0649 ;     ML      # ( ‎ﴓ‎ → ‎عى‎ ) ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER AIN, ARABIC LETTER ALEF MAKSURA       # 
+FCF7 ; 0639 0649 ;     ML      # ( ‎ﳷ‎ → ‎عى‎ ) ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER AIN, ARABIC LETTER ALEF MAKSURA    # 
+FD14 ; 0639 0649 ;     ML      # ( ‎ﴔ‎ → ‎عى‎ ) ARABIC LIGATURE AIN WITH YEH FINAL FORM → ARABIC LETTER AIN, ARABIC LETTER ALEF MAKSURA        # →‎عي‎→
+FCF8 ; 0639 0649 ;     ML      # ( ‎ﳸ‎ → ‎عى‎ ) ARABIC LIGATURE AIN WITH YEH ISOLATED FORM → ARABIC LETTER AIN, ARABIC LETTER ALEF MAKSURA     # →‎عي‎→
+
+FECF ; 063A ;  ML      # ( ‎ﻏ‎ → ‎غ‎ ) ARABIC LETTER GHAIN INITIAL FORM → ARABIC LETTER GHAIN   # 
+FED0 ; 063A ;  ML      # ( ‎ﻐ‎ → ‎غ‎ ) ARABIC LETTER GHAIN MEDIAL FORM → ARABIC LETTER GHAIN    # 
+FECE ; 063A ;  ML      # ( ‎ﻎ‎ → ‎غ‎ ) ARABIC LETTER GHAIN FINAL FORM → ARABIC LETTER GHAIN     # 
+FECD ; 063A ;  ML      # ( ‎ﻍ‎ → ‎غ‎ ) ARABIC LETTER GHAIN ISOLATED FORM → ARABIC LETTER GHAIN  # 
+
+FCBC ; 063A 062C ;     ML      # ( ‎ﲼ‎ → ‎غج‎ ) ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM → ARABIC LETTER GHAIN, ARABIC LETTER JEEM # 
+FC2B ; 063A 062C ;     ML      # ( ‎ﰫ‎ → ‎غج‎ ) ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM → ARABIC LETTER GHAIN, ARABIC LETTER JEEM        # 
+
+FCBD ; 063A 0645 ;     ML      # ( ‎ﲽ‎ → ‎غم‎ ) ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM → ARABIC LETTER GHAIN, ARABIC LETTER MEEM # 
+FC2C ; 063A 0645 ;     ML      # ( ‎ﰬ‎ → ‎غم‎ ) ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM → ARABIC LETTER GHAIN, ARABIC LETTER MEEM        # 
+
+FD79 ; 063A 0645 0645 ;        ML      # ( ‎ﵹ‎ → ‎غمم‎ ) ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM → ARABIC LETTER GHAIN, ARABIC LETTER MEEM, ARABIC LETTER MEEM   # 
+
+FD7B ; 063A 0645 0649 ;        ML      # ( ‎ﵻ‎ → ‎غمى‎ ) ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER GHAIN, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA   # 
+FD7A ; 063A 0645 0649 ;        ML      # ( ‎ﵺ‎ → ‎غمى‎ ) ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER GHAIN, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA    # →‎غمي‎→
+
+FD15 ; 063A 0649 ;     ML      # ( ‎ﴕ‎ → ‎غى‎ ) ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER GHAIN, ARABIC LETTER ALEF MAKSURA   # 
+FCF9 ; 063A 0649 ;     ML      # ( ‎ﳹ‎ → ‎غى‎ ) ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER GHAIN, ARABIC LETTER ALEF MAKSURA        # 
+FD16 ; 063A 0649 ;     ML      # ( ‎ﴖ‎ → ‎غى‎ ) ARABIC LIGATURE GHAIN WITH YEH FINAL FORM → ARABIC LETTER GHAIN, ARABIC LETTER ALEF MAKSURA    # →‎غي‎→
+FCFA ; 063A 0649 ;     ML      # ( ‎ﳺ‎ → ‎غى‎ ) ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM → ARABIC LETTER GHAIN, ARABIC LETTER ALEF MAKSURA # →‎غي‎→
+
+FED3 ; 0641 ;  ML      # ( ‎ﻓ‎ → ‎ف‎ ) ARABIC LETTER FEH INITIAL FORM → ARABIC LETTER FEH       # 
+FED4 ; 0641 ;  ML      # ( ‎ﻔ‎ → ‎ف‎ ) ARABIC LETTER FEH MEDIAL FORM → ARABIC LETTER FEH        # 
+FED2 ; 0641 ;  ML      # ( ‎ﻒ‎ → ‎ف‎ ) ARABIC LETTER FEH FINAL FORM → ARABIC LETTER FEH # 
+FED1 ; 0641 ;  ML      # ( ‎ﻑ‎ → ‎ف‎ ) ARABIC LETTER FEH ISOLATED FORM → ARABIC LETTER FEH      # 
+
+FCBE ; 0641 062C ;     ML      # ( ‎ﲾ‎ → ‎فج‎ ) ARABIC LIGATURE FEH WITH JEEM INITIAL FORM → ARABIC LETTER FEH, ARABIC LETTER JEEM     # 
+FC2D ; 0641 062C ;     ML      # ( ‎ﰭ‎ → ‎فج‎ ) ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM → ARABIC LETTER FEH, ARABIC LETTER JEEM    # 
+FCC0 ; 0641 062C ;     ML      # ( ‎ﳀ‎ → ‎فج‎ ) ARABIC LIGATURE FEH WITH KHAH INITIAL FORM → ARABIC LETTER FEH, ARABIC LETTER JEEM     # →‎فخ‎→→‎ﰯ‎→→‎ﰭ‎→
+FC2F ; 0641 062C ;     ML      # ( ‎ﰯ‎ → ‎فج‎ ) ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM → ARABIC LETTER FEH, ARABIC LETTER JEEM    # →‎ﰭ‎→
+
+FD7D ; 0641 062C 0645 ;        ML      # ( ‎ﵽ‎ → ‎فجم‎ ) ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM → ARABIC LETTER FEH, ARABIC LETTER JEEM, ARABIC LETTER MEEM     # →‎فخم‎→
+FD7C ; 0641 062C 0645 ;        ML      # ( ‎ﵼ‎ → ‎فجم‎ ) ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM → ARABIC LETTER FEH, ARABIC LETTER JEEM, ARABIC LETTER MEEM       # →‎فخم‎→
+
+FCBF ; 0641 062D ;     ML      # ( ‎ﲿ‎ → ‎فح‎ ) ARABIC LIGATURE FEH WITH HAH INITIAL FORM → ARABIC LETTER FEH, ARABIC LETTER HAH       # 
+FC2E ; 0641 062D ;     ML      # ( ‎ﰮ‎ → ‎فح‎ ) ARABIC LIGATURE FEH WITH HAH ISOLATED FORM → ARABIC LETTER FEH, ARABIC LETTER HAH      # 
+
+FCC1 ; 0641 0645 ;     ML      # ( ‎ﳁ‎ → ‎فم‎ ) ARABIC LIGATURE FEH WITH MEEM INITIAL FORM → ARABIC LETTER FEH, ARABIC LETTER MEEM     # 
+FC30 ; 0641 0645 ;     ML      # ( ‎ﰰ‎ → ‎فم‎ ) ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM → ARABIC LETTER FEH, ARABIC LETTER MEEM    # 
+
+FDC1 ; 0641 0645 0649 ;        ML      # ( ‎ﷁ‎ → ‎فمى‎ ) ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER FEH, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA        # →‎فمي‎→
+
+FC7C ; 0641 0649 ;     ML      # ( ‎ﱼ‎ → ‎فى‎ ) ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER FEH, ARABIC LETTER ALEF MAKSURA       # 
+FC31 ; 0641 0649 ;     ML      # ( ‎ﰱ‎ → ‎فى‎ ) ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER FEH, ARABIC LETTER ALEF MAKSURA    # 
+FC7D ; 0641 0649 ;     ML      # ( ‎ﱽ‎ → ‎فى‎ ) ARABIC LIGATURE FEH WITH YEH FINAL FORM → ARABIC LETTER FEH, ARABIC LETTER ALEF MAKSURA        # →‎في‎→
+FC32 ; 0641 0649 ;     ML      # ( ‎ﰲ‎ → ‎فى‎ ) ARABIC LIGATURE FEH WITH YEH ISOLATED FORM → ARABIC LETTER FEH, ARABIC LETTER ALEF MAKSURA     # →‎في‎→
+
+FB6C ; 06A4 ;  ML      # ( ‎ﭬ‎ → ‎ڤ‎ ) ARABIC LETTER VEH INITIAL FORM → ARABIC LETTER VEH       # 
+FB6D ; 06A4 ;  ML      # ( ‎ﭭ‎ → ‎ڤ‎ ) ARABIC LETTER VEH MEDIAL FORM → ARABIC LETTER VEH        # 
+FB6B ; 06A4 ;  ML      # ( ‎ﭫ‎ → ‎ڤ‎ ) ARABIC LETTER VEH FINAL FORM → ARABIC LETTER VEH # 
+FB6A ; 06A4 ;  ML      # ( ‎ﭪ‎ → ‎ڤ‎ ) ARABIC LETTER VEH ISOLATED FORM → ARABIC LETTER VEH      # 
+
+FB70 ; 06A6 ;  ML      # ( ‎ﭰ‎ → ‎ڦ‎ ) ARABIC LETTER PEHEH INITIAL FORM → ARABIC LETTER PEHEH   # 
+FB71 ; 06A6 ;  ML      # ( ‎ﭱ‎ → ‎ڦ‎ ) ARABIC LETTER PEHEH MEDIAL FORM → ARABIC LETTER PEHEH    # 
+FB6F ; 06A6 ;  ML      # ( ‎ﭯ‎ → ‎ڦ‎ ) ARABIC LETTER PEHEH FINAL FORM → ARABIC LETTER PEHEH     # 
+FB6E ; 06A6 ;  ML      # ( ‎ﭮ‎ → ‎ڦ‎ ) ARABIC LETTER PEHEH ISOLATED FORM → ARABIC LETTER PEHEH  # 
+
+FED7 ; 0642 ;  ML      # ( ‎ﻗ‎ → ‎ق‎ ) ARABIC LETTER QAF INITIAL FORM → ARABIC LETTER QAF       # 
+FED8 ; 0642 ;  ML      # ( ‎ﻘ‎ → ‎ق‎ ) ARABIC LETTER QAF MEDIAL FORM → ARABIC LETTER QAF        # 
+FED6 ; 0642 ;  ML      # ( ‎ﻖ‎ → ‎ق‎ ) ARABIC LETTER QAF FINAL FORM → ARABIC LETTER QAF # 
+FED5 ; 0642 ;  ML      # ( ‎ﻕ‎ → ‎ق‎ ) ARABIC LETTER QAF ISOLATED FORM → ARABIC LETTER QAF      # 
+
+FCC2 ; 0642 062D ;     ML      # ( ‎ﳂ‎ → ‎قح‎ ) ARABIC LIGATURE QAF WITH HAH INITIAL FORM → ARABIC LETTER QAF, ARABIC LETTER HAH       # 
+FC33 ; 0642 062D ;     ML      # ( ‎ﰳ‎ → ‎قح‎ ) ARABIC LIGATURE QAF WITH HAH ISOLATED FORM → ARABIC LETTER QAF, ARABIC LETTER HAH      # 
+
+FDF1 ; 0642 0644 06D2 ;        ML      # ( ‎ﷱ‎ → ‎قلے‎ ) ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM → ARABIC LETTER QAF, ARABIC LETTER LAM, ARABIC LETTER YEH BARREE        # 
+
+FCC3 ; 0642 0645 ;     ML      # ( ‎ﳃ‎ → ‎قم‎ ) ARABIC LIGATURE QAF WITH MEEM INITIAL FORM → ARABIC LETTER QAF, ARABIC LETTER MEEM     # 
+FC34 ; 0642 0645 ;     ML      # ( ‎ﰴ‎ → ‎قم‎ ) ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM → ARABIC LETTER QAF, ARABIC LETTER MEEM    # 
+
+FDB4 ; 0642 0645 062D ;        ML      # ( ‎ﶴ‎ → ‎قمح‎ ) ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM → ARABIC LETTER QAF, ARABIC LETTER MEEM, ARABIC LETTER HAH       # 
+FD7E ; 0642 0645 062D ;        ML      # ( ‎ﵾ‎ → ‎قمح‎ ) ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM → ARABIC LETTER QAF, ARABIC LETTER MEEM, ARABIC LETTER HAH # 
+
+FD7F ; 0642 0645 0645 ;        ML      # ( ‎ﵿ‎ → ‎قمم‎ ) ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM → ARABIC LETTER QAF, ARABIC LETTER MEEM, ARABIC LETTER MEEM       # 
+
+FDB2 ; 0642 0645 0649 ;        ML      # ( ‎ﶲ‎ → ‎قمى‎ ) ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER QAF, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA        # →‎قمي‎→
+
+FC7E ; 0642 0649 ;     ML      # ( ‎ﱾ‎ → ‎قى‎ ) ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER QAF, ARABIC LETTER ALEF MAKSURA       # 
+FC35 ; 0642 0649 ;     ML      # ( ‎ﰵ‎ → ‎قى‎ ) ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER QAF, ARABIC LETTER ALEF MAKSURA    # 
+FC7F ; 0642 0649 ;     ML      # ( ‎ﱿ‎ → ‎قى‎ ) ARABIC LIGATURE QAF WITH YEH FINAL FORM → ARABIC LETTER QAF, ARABIC LETTER ALEF MAKSURA        # →‎قي‎→
+FC36 ; 0642 0649 ;     ML      # ( ‎ﰶ‎ → ‎قى‎ ) ARABIC LIGATURE QAF WITH YEH ISOLATED FORM → ARABIC LETTER QAF, ARABIC LETTER ALEF MAKSURA     # →‎قي‎→
+
+FEDB ; 0643 ;  ML      # ( ‎ﻛ‎ → ‎ك‎ ) ARABIC LETTER KAF INITIAL FORM → ARABIC LETTER KAF       # 
+FEDC ; 0643 ;  ML      # ( ‎ﻜ‎ → ‎ك‎ ) ARABIC LETTER KAF MEDIAL FORM → ARABIC LETTER KAF        # 
+FEDA ; 0643 ;  ML      # ( ‎ﻚ‎ → ‎ك‎ ) ARABIC LETTER KAF FINAL FORM → ARABIC LETTER KAF # 
+FED9 ; 0643 ;  ML      # ( ‎ﻙ‎ → ‎ك‎ ) ARABIC LETTER KAF ISOLATED FORM → ARABIC LETTER KAF      # 
+06A9 ; 0643 ;  ML      # ( ‎ک‎ → ‎ك‎ ) ARABIC LETTER KEHEH → ARABIC LETTER KAF   # 
+FB90 ; 0643 ;  ML      # ( ‎ﮐ‎ → ‎ك‎ ) ARABIC LETTER KEHEH INITIAL FORM → ARABIC LETTER KAF     # →‎ﻜ‎→
+FB91 ; 0643 ;  ML      # ( ‎ﮑ‎ → ‎ك‎ ) ARABIC LETTER KEHEH MEDIAL FORM → ARABIC LETTER KAF      # →‎ﻜ‎→
+FB8F ; 0643 ;  ML      # ( ‎ﮏ‎ → ‎ك‎ ) ARABIC LETTER KEHEH FINAL FORM → ARABIC LETTER KAF       # →‎ﻚ‎→
+FB8E ; 0643 ;  ML      # ( ‎ﮎ‎ → ‎ك‎ ) ARABIC LETTER KEHEH ISOLATED FORM → ARABIC LETTER KAF    # →‎ک‎→
+
+FC80 ; 0643 0627 ;     ML      # ( ‎ﲀ‎ → ‎كا‎ ) ARABIC LIGATURE KAF WITH ALEF FINAL FORM → ARABIC LETTER KAF, ARABIC LETTER ALEF       # 
+FC37 ; 0643 0627 ;     ML      # ( ‎ﰷ‎ → ‎كا‎ ) ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM → ARABIC LETTER KAF, ARABIC LETTER ALEF    # 
+
+FCC4 ; 0643 062C ;     ML      # ( ‎ﳄ‎ → ‎كج‎ ) ARABIC LIGATURE KAF WITH JEEM INITIAL FORM → ARABIC LETTER KAF, ARABIC LETTER JEEM     # 
+FC38 ; 0643 062C ;     ML      # ( ‎ﰸ‎ → ‎كج‎ ) ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM → ARABIC LETTER KAF, ARABIC LETTER JEEM    # 
+FCC6 ; 0643 062C ;     ML      # ( ‎ﳆ‎ → ‎كج‎ ) ARABIC LIGATURE KAF WITH KHAH INITIAL FORM → ARABIC LETTER KAF, ARABIC LETTER JEEM     # →‎كخ‎→→‎ﰺ‎→→‎ﰸ‎→
+FC3A ; 0643 062C ;     ML      # ( ‎ﰺ‎ → ‎كج‎ ) ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM → ARABIC LETTER KAF, ARABIC LETTER JEEM    # →‎ﰸ‎→
+
+FCC5 ; 0643 062D ;     ML      # ( ‎ﳅ‎ → ‎كح‎ ) ARABIC LIGATURE KAF WITH HAH INITIAL FORM → ARABIC LETTER KAF, ARABIC LETTER HAH       # 
+FC39 ; 0643 062D ;     ML      # ( ‎ﰹ‎ → ‎كح‎ ) ARABIC LIGATURE KAF WITH HAH ISOLATED FORM → ARABIC LETTER KAF, ARABIC LETTER HAH      # 
+
+FCC7 ; 0643 0644 ;     ML      # ( ‎ﳇ‎ → ‎كل‎ ) ARABIC LIGATURE KAF WITH LAM INITIAL FORM → ARABIC LETTER KAF, ARABIC LETTER LAM       # 
+FCEB ; 0643 0644 ;     ML      # ( ‎ﳫ‎ → ‎كل‎ ) ARABIC LIGATURE KAF WITH LAM MEDIAL FORM → ARABIC LETTER KAF, ARABIC LETTER LAM        # 
+FC81 ; 0643 0644 ;     ML      # ( ‎ﲁ‎ → ‎كل‎ ) ARABIC LIGATURE KAF WITH LAM FINAL FORM → ARABIC LETTER KAF, ARABIC LETTER LAM # 
+FC3B ; 0643 0644 ;     ML      # ( ‎ﰻ‎ → ‎كل‎ ) ARABIC LIGATURE KAF WITH LAM ISOLATED FORM → ARABIC LETTER KAF, ARABIC LETTER LAM      # 
+
+FCC8 ; 0643 0645 ;     ML      # ( ‎ﳈ‎ → ‎كم‎ ) ARABIC LIGATURE KAF WITH MEEM INITIAL FORM → ARABIC LETTER KAF, ARABIC LETTER MEEM     # 
+FCEC ; 0643 0645 ;     ML      # ( ‎ﳬ‎ → ‎كم‎ ) ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM → ARABIC LETTER KAF, ARABIC LETTER MEEM      # 
+FC82 ; 0643 0645 ;     ML      # ( ‎ﲂ‎ → ‎كم‎ ) ARABIC LIGATURE KAF WITH MEEM FINAL FORM → ARABIC LETTER KAF, ARABIC LETTER MEEM       # 
+FC3C ; 0643 0645 ;     ML      # ( ‎ﰼ‎ → ‎كم‎ ) ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM → ARABIC LETTER KAF, ARABIC LETTER MEEM    # 
+
+FDC3 ; 0643 0645 0645 ;        ML      # ( ‎ﷃ‎ → ‎كمم‎ ) ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM → ARABIC LETTER KAF, ARABIC LETTER MEEM, ARABIC LETTER MEEM     # 
+FDBB ; 0643 0645 0645 ;        ML      # ( ‎ﶻ‎ → ‎كمم‎ ) ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM → ARABIC LETTER KAF, ARABIC LETTER MEEM, ARABIC LETTER MEEM       # 
+
+FDB7 ; 0643 0645 0649 ;        ML      # ( ‎ﶷ‎ → ‎كمى‎ ) ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER KAF, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA        # →‎كمي‎→
+
+FC83 ; 0643 0649 ;     ML      # ( ‎ﲃ‎ → ‎كى‎ ) ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER KAF, ARABIC LETTER ALEF MAKSURA       # 
+FC3D ; 0643 0649 ;     ML      # ( ‎ﰽ‎ → ‎كى‎ ) ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER KAF, ARABIC LETTER ALEF MAKSURA    # 
+FC84 ; 0643 0649 ;     ML      # ( ‎ﲄ‎ → ‎كى‎ ) ARABIC LIGATURE KAF WITH YEH FINAL FORM → ARABIC LETTER KAF, ARABIC LETTER ALEF MAKSURA        # →‎كي‎→
+FC3E ; 0643 0649 ;     ML      # ( ‎ﰾ‎ → ‎كى‎ ) ARABIC LIGATURE KAF WITH YEH ISOLATED FORM → ARABIC LETTER KAF, ARABIC LETTER ALEF MAKSURA     # →‎كي‎→
+
+FBD5 ; 06AD ;  ML      # ( ‎ﯕ‎ → ‎ڭ‎ ) ARABIC LETTER NG INITIAL FORM → ARABIC LETTER NG # 
+FBD6 ; 06AD ;  ML      # ( ‎ﯖ‎ → ‎ڭ‎ ) ARABIC LETTER NG MEDIAL FORM → ARABIC LETTER NG  # 
+FBD4 ; 06AD ;  ML      # ( ‎ﯔ‎ → ‎ڭ‎ ) ARABIC LETTER NG FINAL FORM → ARABIC LETTER NG   # 
+FBD3 ; 06AD ;  ML      # ( ‎ﯓ‎ → ‎ڭ‎ ) ARABIC LETTER NG ISOLATED FORM → ARABIC LETTER NG        # 
+
+FB94 ; 06AF ;  ML      # ( ‎ﮔ‎ → ‎گ‎ ) ARABIC LETTER GAF INITIAL FORM → ARABIC LETTER GAF       # 
+FB95 ; 06AF ;  ML      # ( ‎ﮕ‎ → ‎گ‎ ) ARABIC LETTER GAF MEDIAL FORM → ARABIC LETTER GAF        # 
+FB93 ; 06AF ;  ML      # ( ‎ﮓ‎ → ‎گ‎ ) ARABIC LETTER GAF FINAL FORM → ARABIC LETTER GAF # 
+FB92 ; 06AF ;  ML      # ( ‎ﮒ‎ → ‎گ‎ ) ARABIC LETTER GAF ISOLATED FORM → ARABIC LETTER GAF      # 
+
+FB9C ; 06B1 ;  ML      # ( ‎ﮜ‎ → ‎ڱ‎ ) ARABIC LETTER NGOEH INITIAL FORM → ARABIC LETTER NGOEH   # 
+FB9D ; 06B1 ;  ML      # ( ‎ﮝ‎ → ‎ڱ‎ ) ARABIC LETTER NGOEH MEDIAL FORM → ARABIC LETTER NGOEH    # 
+FB9B ; 06B1 ;  ML      # ( ‎ﮛ‎ → ‎ڱ‎ ) ARABIC LETTER NGOEH FINAL FORM → ARABIC LETTER NGOEH     # 
+FB9A ; 06B1 ;  ML      # ( ‎ﮚ‎ → ‎ڱ‎ ) ARABIC LETTER NGOEH ISOLATED FORM → ARABIC LETTER NGOEH  # 
+
+FB98 ; 06B3 ;  ML      # ( ‎ﮘ‎ → ‎ڳ‎ ) ARABIC LETTER GUEH INITIAL FORM → ARABIC LETTER GUEH     # 
+FB99 ; 06B3 ;  ML      # ( ‎ﮙ‎ → ‎ڳ‎ ) ARABIC LETTER GUEH MEDIAL FORM → ARABIC LETTER GUEH      # 
+FB97 ; 06B3 ;  ML      # ( ‎ﮗ‎ → ‎ڳ‎ ) ARABIC LETTER GUEH FINAL FORM → ARABIC LETTER GUEH       # 
+FB96 ; 06B3 ;  ML      # ( ‎ﮖ‎ → ‎ڳ‎ ) ARABIC LETTER GUEH ISOLATED FORM → ARABIC LETTER GUEH    # 
+
+FEDF ; 0644 ;  ML      # ( ‎ﻟ‎ → ‎ل‎ ) ARABIC LETTER LAM INITIAL FORM → ARABIC LETTER LAM       # 
+FEE0 ; 0644 ;  ML      # ( ‎ﻠ‎ → ‎ل‎ ) ARABIC LETTER LAM MEDIAL FORM → ARABIC LETTER LAM        # 
+FEDE ; 0644 ;  ML      # ( ‎ﻞ‎ → ‎ل‎ ) ARABIC LETTER LAM FINAL FORM → ARABIC LETTER LAM # 
+FEDD ; 0644 ;  ML      # ( ‎ﻝ‎ → ‎ل‎ ) ARABIC LETTER LAM ISOLATED FORM → ARABIC LETTER LAM      # 
+
+FEF6 ; 0644 0622 ;     ML      # ( ‎ﻶ‎ → ‎لآ‎ ) ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF WITH MADDA ABOVE     # 
+FEF5 ; 0644 0622 ;     ML      # ( ‎ﻵ‎ → ‎لآ‎ ) ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF WITH MADDA ABOVE  # 
+
+FEFA ; 0644 0625 ;     ML      # ( ‎ﻺ‎ → ‎لإ‎ ) ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF WITH HAMZA BELOW     # 
+FEF9 ; 0644 0625 ;     ML      # ( ‎ﻹ‎ → ‎لإ‎ ) ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF WITH HAMZA BELOW  # 
+
+FEFC ; 0644 0627 ;     ML      # ( ‎ﻼ‎ → ‎لا‎ ) ARABIC LIGATURE LAM WITH ALEF FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF       # 
+FEFB ; 0644 0627 ;     ML      # ( ‎ﻻ‎ → ‎لا‎ ) ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF    # 
+
+FEF8 ; 0644 0627 0674 ;        ML      # ( ‎ﻸ‎ → ‎لاٴ‎ ) ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF, ARABIC LETTER HIGH HAMZA  # →‎لأ‎→
+FEF7 ; 0644 0627 0674 ;        ML      # ( ‎ﻷ‎ → ‎لاٴ‎ ) ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF, ARABIC LETTER HIGH HAMZA       # →‎لأ‎→
+
+FCC9 ; 0644 062C ;     ML      # ( ‎ﳉ‎ → ‎لج‎ ) ARABIC LIGATURE LAM WITH JEEM INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM     # 
+FC3F ; 0644 062C ;     ML      # ( ‎ﰿ‎ → ‎لج‎ ) ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM    # 
+FCCB ; 0644 062C ;     ML      # ( ‎ﳋ‎ → ‎لج‎ ) ARABIC LIGATURE LAM WITH KHAH INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM     # →‎لخ‎→→‎ﱁ‎→→‎ﰿ‎→
+FC41 ; 0644 062C ;     ML      # ( ‎ﱁ‎ → ‎لج‎ ) ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM    # →‎ﰿ‎→
+
+FD83 ; 0644 062C 062C ;        ML      # ( ‎ﶃ‎ → ‎لجج‎ ) ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM, ARABIC LETTER JEEM     # 
+FD84 ; 0644 062C 062C ;        ML      # ( ‎ﶄ‎ → ‎لجج‎ ) ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM, ARABIC LETTER JEEM       # 
+
+FDBA ; 0644 062C 0645 ;        ML      # ( ‎ﶺ‎ → ‎لجم‎ ) ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM, ARABIC LETTER MEEM     # 
+FDBC ; 0644 062C 0645 ;        ML      # ( ‎ﶼ‎ → ‎لجم‎ ) ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM, ARABIC LETTER MEEM       # 
+FD86 ; 0644 062C 0645 ;        ML      # ( ‎ﶆ‎ → ‎لجم‎ ) ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM, ARABIC LETTER MEEM     # →‎لخم‎→
+FD85 ; 0644 062C 0645 ;        ML      # ( ‎ﶅ‎ → ‎لجم‎ ) ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM, ARABIC LETTER MEEM       # →‎لخم‎→
+
+FDAC ; 0644 062C 0649 ;        ML      # ( ‎ﶬ‎ → ‎لجى‎ ) ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA        # →‎لجي‎→
+
+FCCA ; 0644 062D ;     ML      # ( ‎ﳊ‎ → ‎لح‎ ) ARABIC LIGATURE LAM WITH HAH INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER HAH       # 
+FC40 ; 0644 062D ;     ML      # ( ‎ﱀ‎ → ‎لح‎ ) ARABIC LIGATURE LAM WITH HAH ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER HAH      # 
+
+FDB5 ; 0644 062D 0645 ;        ML      # ( ‎ﶵ‎ → ‎لحم‎ ) ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER HAH, ARABIC LETTER MEEM       # 
+FD80 ; 0644 062D 0645 ;        ML      # ( ‎ﶀ‎ → ‎لحم‎ ) ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER HAH, ARABIC LETTER MEEM # 
+
+FD82 ; 0644 062D 0649 ;        ML      # ( ‎ﶂ‎ → ‎لحى‎ ) ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA # 
+FD81 ; 0644 062D 0649 ;        ML      # ( ‎ﶁ‎ → ‎لحى‎ ) ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA  # →‎لحي‎→
+
+FCCC ; 0644 0645 ;     ML      # ( ‎ﳌ‎ → ‎لم‎ ) ARABIC LIGATURE LAM WITH MEEM INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER MEEM     # 
+FCED ; 0644 0645 ;     ML      # ( ‎ﳭ‎ → ‎لم‎ ) ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM → ARABIC LETTER LAM, ARABIC LETTER MEEM      # 
+FC85 ; 0644 0645 ;     ML      # ( ‎ﲅ‎ → ‎لم‎ ) ARABIC LIGATURE LAM WITH MEEM FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER MEEM       # 
+FC42 ; 0644 0645 ;     ML      # ( ‎ﱂ‎ → ‎لم‎ ) ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER MEEM    # 
+
+FD88 ; 0644 0645 062D ;        ML      # ( ‎ﶈ‎ → ‎لمح‎ ) ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER MEEM, ARABIC LETTER HAH       # 
+FD87 ; 0644 0645 062D ;        ML      # ( ‎ﶇ‎ → ‎لمح‎ ) ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER MEEM, ARABIC LETTER HAH # 
+
+FDAD ; 0644 0645 0649 ;        ML      # ( ‎ﶭ‎ → ‎لمى‎ ) ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA        # →‎لمي‎→
+
+FCCD ; 0644 0647 ;     ML      # ( ‎ﳍ‎ → ‎له‎ ) ARABIC LIGATURE LAM WITH HEH INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER HEH       # 
+
+FC86 ; 0644 0649 ;     ML      # ( ‎ﲆ‎ → ‎لى‎ ) ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA       # 
+FC43 ; 0644 0649 ;     ML      # ( ‎ﱃ‎ → ‎لى‎ ) ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA    # 
+FC87 ; 0644 0649 ;     ML      # ( ‎ﲇ‎ → ‎لى‎ ) ARABIC LIGATURE LAM WITH YEH FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA        # →‎لي‎→
+FC44 ; 0644 0649 ;     ML      # ( ‎ﱄ‎ → ‎لى‎ ) ARABIC LIGATURE LAM WITH YEH ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA     # →‎لي‎→
+
+FEE3 ; 0645 ;  ML      # ( ‎ﻣ‎ → ‎م‎ ) ARABIC LETTER MEEM INITIAL FORM → ARABIC LETTER MEEM     # 
+FEE4 ; 0645 ;  ML      # ( ‎ﻤ‎ → ‎م‎ ) ARABIC LETTER MEEM MEDIAL FORM → ARABIC LETTER MEEM      # 
+FEE2 ; 0645 ;  ML      # ( ‎ﻢ‎ → ‎م‎ ) ARABIC LETTER MEEM FINAL FORM → ARABIC LETTER MEEM       # 
+FEE1 ; 0645 ;  ML      # ( ‎ﻡ‎ → ‎م‎ ) ARABIC LETTER MEEM ISOLATED FORM → ARABIC LETTER MEEM    # 
+
+FC88 ; 0645 0627 ;     ML      # ( ‎ﲈ‎ → ‎ما‎ ) ARABIC LIGATURE MEEM WITH ALEF FINAL FORM → ARABIC LETTER MEEM, ARABIC LETTER ALEF     # 
+
+FCCE ; 0645 062C ;     ML      # ( ‎ﳎ‎ → ‎مج‎ ) ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM   # 
+FC45 ; 0645 062C ;     ML      # ( ‎ﱅ‎ → ‎مج‎ ) ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM  # 
+FCD0 ; 0645 062C ;     ML      # ( ‎ﳐ‎ → ‎مج‎ ) ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM   # →‎مخ‎→→‎ﱇ‎→→‎ﱅ‎→
+FC47 ; 0645 062C ;     ML      # ( ‎ﱇ‎ → ‎مج‎ ) ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM  # →‎ﱅ‎→
+
+FD92 ; 0645 062C 062C ;        ML      # ( ‎ﶒ‎ → ‎مجج‎ ) ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM, ARABIC LETTER JEEM   # →‎مجخ‎→
+FD8E ; 0645 062C 062C ;        ML      # ( ‎ﶎ‎ → ‎مجج‎ ) ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM, ARABIC LETTER JEEM   # →‎مخج‎→
+
+FD8C ; 0645 062C 062D ;        ML      # ( ‎ﶌ‎ → ‎مجح‎ ) ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM, ARABIC LETTER HAH     # 
+
+FD8D ; 0645 062C 0645 ;        ML      # ( ‎ﶍ‎ → ‎مجم‎ ) ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM, ARABIC LETTER MEEM   # 
+FD8F ; 0645 062C 0645 ;        ML      # ( ‎ﶏ‎ → ‎مجم‎ ) ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM, ARABIC LETTER MEEM   # →‎مخم‎→
+
+FDC0 ; 0645 062C 0649 ;        ML      # ( ‎ﷀ‎ → ‎مجى‎ ) ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA      # →‎مجي‎→
+FDB9 ; 0645 062C 0649 ;        ML      # ( ‎ﶹ‎ → ‎مجى‎ ) ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA      # →‎مخي‎→
+
+FCCF ; 0645 062D ;     ML      # ( ‎ﳏ‎ → ‎مح‎ ) ARABIC LIGATURE MEEM WITH HAH INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER HAH     # 
+FC46 ; 0645 062D ;     ML      # ( ‎ﱆ‎ → ‎مح‎ ) ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM → ARABIC LETTER MEEM, ARABIC LETTER HAH    # 
+
+FD89 ; 0645 062D 062C ;        ML      # ( ‎ﶉ‎ → ‎محج‎ ) ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER HAH, ARABIC LETTER JEEM     # 
+
+FD8A ; 0645 062D 0645 ;        ML      # ( ‎ﶊ‎ → ‎محم‎ ) ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER HAH, ARABIC LETTER MEEM     # 
+
+FDF4 ; 0645 062D 0645 062F ;   ML      # ( ‎ﷴ‎ → ‎محمد‎ ) ARABIC LIGATURE MOHAMMAD ISOLATED FORM → ARABIC LETTER MEEM, ARABIC LETTER HAH, ARABIC LETTER MEEM, ARABIC LETTER DAL      # 
+
+FD8B ; 0645 062D 0649 ;        ML      # ( ‎ﶋ‎ → ‎محى‎ ) ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM → ARABIC LETTER MEEM, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA        # →‎محي‎→
+
+FCD1 ; 0645 0645 ;     ML      # ( ‎ﳑ‎ → ‎مم‎ ) ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER MEEM   # 
+FC89 ; 0645 0645 ;     ML      # ( ‎ﲉ‎ → ‎مم‎ ) ARABIC LIGATURE MEEM WITH MEEM FINAL FORM → ARABIC LETTER MEEM, ARABIC LETTER MEEM     # 
+FC48 ; 0645 0645 ;     ML      # ( ‎ﱈ‎ → ‎مم‎ ) ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM → ARABIC LETTER MEEM, ARABIC LETTER MEEM  # 
+
+FDB1 ; 0645 0645 0649 ;        ML      # ( ‎ﶱ‎ → ‎ممى‎ ) ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER MEEM, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA      # →‎ممي‎→
+
+FC49 ; 0645 0649 ;     ML      # ( ‎ﱉ‎ → ‎مى‎ ) ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA  # 
+FC4A ; 0645 0649 ;     ML      # ( ‎ﱊ‎ → ‎مى‎ ) ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM → ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA   # →‎مي‎→
+
+FB9F ; 06BA ;  ML      # ( ‎ﮟ‎ → ‎ں‎ ) ARABIC LETTER NOON GHUNNA FINAL FORM → ARABIC LETTER NOON GHUNNA # 
+FB9E ; 06BA ;  ML      # ( ‎ﮞ‎ → ‎ں‎ ) ARABIC LETTER NOON GHUNNA ISOLATED FORM → ARABIC LETTER NOON GHUNNA      # 
+
+FEEB ; 0647 ;  ML      # ( ‎ﻫ‎ → ‎ه‎ ) ARABIC LETTER HEH INITIAL FORM → ARABIC LETTER HEH       # 
+FEEC ; 0647 ;  ML      # ( ‎ﻬ‎ → ‎ه‎ ) ARABIC LETTER HEH MEDIAL FORM → ARABIC LETTER HEH        # 
+FEEA ; 0647 ;  ML      # ( ‎ﻪ‎ → ‎ه‎ ) ARABIC LETTER HEH FINAL FORM → ARABIC LETTER HEH # 
+FEE9 ; 0647 ;  ML      # ( ‎ﻩ‎ → ‎ه‎ ) ARABIC LETTER HEH ISOLATED FORM → ARABIC LETTER HEH      # 
+06BE ; 0647 ;  ML      # ( ‎ھ‎ → ‎ه‎ ) ARABIC LETTER HEH DOACHASHMEE → ARABIC LETTER HEH # 
+FBAC ; 0647 ;  ML      # ( ‎ﮬ‎ → ‎ه‎ ) ARABIC LETTER HEH DOACHASHMEE INITIAL FORM → ARABIC LETTER HEH   # →‎ﻫ‎→
+FBAD ; 0647 ;  ML      # ( ‎ﮭ‎ → ‎ه‎ ) ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM → ARABIC LETTER HEH    # →‎ﻬ‎→
+FBAB ; 0647 ;  ML      # ( ‎ﮫ‎ → ‎ه‎ ) ARABIC LETTER HEH DOACHASHMEE FINAL FORM → ARABIC LETTER HEH     # →‎ﻬ‎→
+FBAA ; 0647 ;  ML      # ( ‎ﮪ‎ → ‎ه‎ ) ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM → ARABIC LETTER HEH  # 
+06C1 ; 0647 ;  ML      # ( ‎ہ‎ → ‎ه‎ ) ARABIC LETTER HEH GOAL → ARABIC LETTER HEH        # →‎ﮦ‎→
+FBA8 ; 0647 ;  ML      # ( ‎ﮨ‎ → ‎ه‎ ) ARABIC LETTER HEH GOAL INITIAL FORM → ARABIC LETTER HEH  # →‎ہ‎→→‎ﮦ‎→
+FBA9 ; 0647 ;  ML      # ( ‎ﮩ‎ → ‎ه‎ ) ARABIC LETTER HEH GOAL MEDIAL FORM → ARABIC LETTER HEH   # →‎ہ‎→→‎ﮦ‎→
+FBA7 ; 0647 ;  ML      # ( ‎ﮧ‎ → ‎ه‎ ) ARABIC LETTER HEH GOAL FINAL FORM → ARABIC LETTER HEH    # →‎ہ‎→→‎ﮦ‎→
+FBA6 ; 0647 ;  ML      # ( ‎ﮦ‎ → ‎ه‎ ) ARABIC LETTER HEH GOAL ISOLATED FORM → ARABIC LETTER HEH # 
+06D5 ; 0647 ;  ML      # ( ‎ە‎ → ‎ه‎ ) ARABIC LETTER AE → ARABIC LETTER HEH      # 
+
+FCD9 ; 0647 0670 ;     ML      # ( ‎ﳙ‎ → ‎هٰ‎ ) ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM → ARABIC LETTER HEH, ARABIC LETTER SUPERSCRIPT ALEF     # 
+
+FCD7 ; 0647 062C ;     ML      # ( ‎ﳗ‎ → ‎هج‎ ) ARABIC LIGATURE HEH WITH JEEM INITIAL FORM → ARABIC LETTER HEH, ARABIC LETTER JEEM     # 
+FC51 ; 0647 062C ;     ML      # ( ‎ﱑ‎ → ‎هج‎ ) ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM → ARABIC LETTER HEH, ARABIC LETTER JEEM    # 
+
+FCD8 ; 0647 0645 ;     ML      # ( ‎ﳘ‎ → ‎هم‎ ) ARABIC LIGATURE HEH WITH MEEM INITIAL FORM → ARABIC LETTER HEH, ARABIC LETTER MEEM     # 
+FC52 ; 0647 0645 ;     ML      # ( ‎ﱒ‎ → ‎هم‎ ) ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM → ARABIC LETTER HEH, ARABIC LETTER MEEM    # 
+
+FD93 ; 0647 0645 062C ;        ML      # ( ‎ﶓ‎ → ‎همج‎ ) ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM → ARABIC LETTER HEH, ARABIC LETTER MEEM, ARABIC LETTER JEEM     # 
+
+FD94 ; 0647 0645 0645 ;        ML      # ( ‎ﶔ‎ → ‎همم‎ ) ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM → ARABIC LETTER HEH, ARABIC LETTER MEEM, ARABIC LETTER MEEM     # 
+
+FC53 ; 0647 0649 ;     ML      # ( ‎ﱓ‎ → ‎هى‎ ) ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER HEH, ARABIC LETTER ALEF MAKSURA    # 
+FC54 ; 0647 0649 ;     ML      # ( ‎ﱔ‎ → ‎هى‎ ) ARABIC LIGATURE HEH WITH YEH ISOLATED FORM → ARABIC LETTER HEH, ARABIC LETTER ALEF MAKSURA     # →‎هي‎→
+
+06C2 ; 06C0 ;  ML      # ( ‎ۂ‎ → ‎ۀ‎ ) ARABIC LETTER HEH GOAL WITH HAMZA ABOVE → ARABIC LETTER HEH WITH YEH ABOVE        # →‎ﮤ‎→
+FBA5 ; 06C0 ;  ML      # ( ‎ﮥ‎ → ‎ۀ‎ ) ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM → ARABIC LETTER HEH WITH YEH ABOVE   # 
+FBA4 ; 06C0 ;  ML      # ( ‎ﮤ‎ → ‎ۀ‎ ) ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM → ARABIC LETTER HEH WITH YEH ABOVE        # 
+
+FEEE ; 0648 ;  ML      # ( ‎ﻮ‎ → ‎و‎ ) ARABIC LETTER WAW FINAL FORM → ARABIC LETTER WAW # 
+FEED ; 0648 ;  ML      # ( ‎ﻭ‎ → ‎و‎ ) ARABIC LETTER WAW ISOLATED FORM → ARABIC LETTER WAW      # 
+
+0624 ; 0648 0674 ;     ML      # ( ‎ؤ‎ → ‎وٴ‎ ) ARABIC LETTER WAW WITH HAMZA ABOVE → ARABIC LETTER WAW, ARABIC LETTER HIGH HAMZA        # →‎ٶ‎→
+FE86 ; 0648 0674 ;     ML      # ( ‎ﺆ‎ → ‎وٴ‎ ) ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM → ARABIC LETTER WAW, ARABIC LETTER HIGH HAMZA    # →‎ٶ‎→
+FE85 ; 0648 0674 ;     ML      # ( ‎ﺅ‎ → ‎وٴ‎ ) ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM → ARABIC LETTER WAW, ARABIC LETTER HIGH HAMZA # →‎ٶ‎→
+0676 ; 0648 0674 ;     ML      # ( ‎ٶ‎ → ‎وٴ‎ ) ARABIC LETTER HIGH HAMZA WAW → ARABIC LETTER WAW, ARABIC LETTER HIGH HAMZA      # 
+
+FDF8 ; 0648 0633 0644 0645 ;   ML      # ( ‎ﷸ‎ → ‎وسلم‎ ) ARABIC LIGATURE WASALLAM ISOLATED FORM → ARABIC LETTER WAW, ARABIC LETTER SEEN, ARABIC LETTER LAM, ARABIC LETTER MEEM      # 
+
+FBE1 ; 06C5 ;  ML      # ( ‎ﯡ‎ → ‎ۅ‎ ) ARABIC LETTER KIRGHIZ OE FINAL FORM → ARABIC LETTER KIRGHIZ OE   # 
+FBE0 ; 06C5 ;  ML      # ( ‎ﯠ‎ → ‎ۅ‎ ) ARABIC LETTER KIRGHIZ OE ISOLATED FORM → ARABIC LETTER KIRGHIZ OE        # 
+
+FBDA ; 06C6 ;  ML      # ( ‎ﯚ‎ → ‎ۆ‎ ) ARABIC LETTER OE FINAL FORM → ARABIC LETTER OE   # 
+FBD9 ; 06C6 ;  ML      # ( ‎ﯙ‎ → ‎ۆ‎ ) ARABIC LETTER OE ISOLATED FORM → ARABIC LETTER OE        # 
+
+FBD8 ; 06C7 ;  ML      # ( ‎ﯘ‎ → ‎ۇ‎ ) ARABIC LETTER U FINAL FORM → ARABIC LETTER U     # 
+FBD7 ; 06C7 ;  ML      # ( ‎ﯗ‎ → ‎ۇ‎ ) ARABIC LETTER U ISOLATED FORM → ARABIC LETTER U  # 
+
+0677 ; 06C7 0674 ;     ML      # ( ‎ٷ‎ → ‎ۇٴ‎ ) ARABIC LETTER U WITH HAMZA ABOVE → ARABIC LETTER U, ARABIC LETTER HIGH HAMZA    # 
+FBDD ; 06C7 0674 ;     ML      # ( ‎ﯝ‎ → ‎ۇٴ‎ ) ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM → ARABIC LETTER U, ARABIC LETTER HIGH HAMZA     # 
+
+FBDC ; 06C8 ;  ML      # ( ‎ﯜ‎ → ‎ۈ‎ ) ARABIC LETTER YU FINAL FORM → ARABIC LETTER YU   # 
+FBDB ; 06C8 ;  ML      # ( ‎ﯛ‎ → ‎ۈ‎ ) ARABIC LETTER YU ISOLATED FORM → ARABIC LETTER YU        # 
+
+FBE3 ; 06C9 ;  ML      # ( ‎ﯣ‎ → ‎ۉ‎ ) ARABIC LETTER KIRGHIZ YU FINAL FORM → ARABIC LETTER KIRGHIZ YU   # 
+FBE2 ; 06C9 ;  ML      # ( ‎ﯢ‎ → ‎ۉ‎ ) ARABIC LETTER KIRGHIZ YU ISOLATED FORM → ARABIC LETTER KIRGHIZ YU        # 
+
+FBDF ; 06CB ;  ML      # ( ‎ﯟ‎ → ‎ۋ‎ ) ARABIC LETTER VE FINAL FORM → ARABIC LETTER VE   # 
+FBDE ; 06CB ;  ML      # ( ‎ﯞ‎ → ‎ۋ‎ ) ARABIC LETTER VE ISOLATED FORM → ARABIC LETTER VE        # 
+
+FBE8 ; 0649 ;  ML      # ( ‎ﯨ‎ → ‎ى‎ ) ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM → ARABIC LETTER ALEF MAKSURA       # 
+FBE9 ; 0649 ;  ML      # ( ‎ﯩ‎ → ‎ى‎ ) ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM → ARABIC LETTER ALEF MAKSURA        # 
+FEF0 ; 0649 ;  ML      # ( ‎ﻰ‎ → ‎ى‎ ) ARABIC LETTER ALEF MAKSURA FINAL FORM → ARABIC LETTER ALEF MAKSURA       # 
+FEEF ; 0649 ;  ML      # ( ‎ﻯ‎ → ‎ى‎ ) ARABIC LETTER ALEF MAKSURA ISOLATED FORM → ARABIC LETTER ALEF MAKSURA    # 
+064A ; 0649 ;  ML      # ( ‎ي‎ → ‎ى‎ ) ARABIC LETTER YEH → ARABIC LETTER ALEF MAKSURA    # →‎ﻴ‎→→‎ﯿ‎→→‎ی‎→
+FEF3 ; 0649 ;  ML      # ( ‎ﻳ‎ → ‎ى‎ ) ARABIC LETTER YEH INITIAL FORM → ARABIC LETTER ALEF MAKSURA      # →‎ﯿ‎→→‎ی‎→
+FEF4 ; 0649 ;  ML      # ( ‎ﻴ‎ → ‎ى‎ ) ARABIC LETTER YEH MEDIAL FORM → ARABIC LETTER ALEF MAKSURA       # →‎ﯿ‎→→‎ی‎→
+FEF2 ; 0649 ;  ML      # ( ‎ﻲ‎ → ‎ى‎ ) ARABIC LETTER YEH FINAL FORM → ARABIC LETTER ALEF MAKSURA        # →‎ي‎→→‎ﻴ‎→→‎ﯿ‎→→‎ی‎→
+FEF1 ; 0649 ;  ML      # ( ‎ﻱ‎ → ‎ى‎ ) ARABIC LETTER YEH ISOLATED FORM → ARABIC LETTER ALEF MAKSURA     # →‎ي‎→→‎ﻴ‎→→‎ﯿ‎→→‎ی‎→
+06CC ; 0649 ;  ML      # ( ‎ی‎ → ‎ى‎ ) ARABIC LETTER FARSI YEH → ARABIC LETTER ALEF MAKSURA      # 
+FBFE ; 0649 ;  ML      # ( ‎ﯾ‎ → ‎ى‎ ) ARABIC LETTER FARSI YEH INITIAL FORM → ARABIC LETTER ALEF MAKSURA        # →‎ی‎→
+FBFF ; 0649 ;  ML      # ( ‎ﯿ‎ → ‎ى‎ ) ARABIC LETTER FARSI YEH MEDIAL FORM → ARABIC LETTER ALEF MAKSURA # →‎ی‎→
+FBFD ; 0649 ;  ML      # ( ‎ﯽ‎ → ‎ى‎ ) ARABIC LETTER FARSI YEH FINAL FORM → ARABIC LETTER ALEF MAKSURA  # →‎ی‎→
+FBFC ; 0649 ;  ML      # ( ‎ﯼ‎ → ‎ى‎ ) ARABIC LETTER FARSI YEH ISOLATED FORM → ARABIC LETTER ALEF MAKSURA       # 
+
+FC90 ; 0649 0670 ;     ML      # ( ‎ﲐ‎ → ‎ىٰ‎ ) ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER SUPERSCRIPT ALEF     # 
+FC5D ; 0649 0670 ;     ML      # ( ‎ﱝ‎ → ‎ىٰ‎ ) ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER SUPERSCRIPT ALEF  # 
+
+0626 ; 0649 0674 ;     ML      # ( ‎ئ‎ → ‎ىٴ‎ ) ARABIC LETTER YEH WITH HAMZA ABOVE → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA       # →‎ٸ‎→→‎يٴ‎→
+FE8B ; 0649 0674 ;     ML      # ( ‎ﺋ‎ → ‎ىٴ‎ ) ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA # →‎ئ‎→→‎ٸ‎→→‎يٴ‎→
+FE8C ; 0649 0674 ;     ML      # ( ‎ﺌ‎ → ‎ىٴ‎ ) ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA  # →‎ئ‎→→‎ٸ‎→→‎يٴ‎→
+FE8A ; 0649 0674 ;     ML      # ( ‎ﺊ‎ → ‎ىٴ‎ ) ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA   # →‎ئ‎→→‎ٸ‎→→‎يٴ‎→
+FE89 ; 0649 0674 ;     ML      # ( ‎ﺉ‎ → ‎ىٴ‎ ) ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA        # →‎ٸ‎→→‎يٴ‎→
+0678 ; 0649 0674 ;     ML      # ( ‎ٸ‎ → ‎ىٴ‎ ) ARABIC LETTER HIGH HAMZA YEH → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA     # →‎يٴ‎→
+
+FBEB ; 0649 0674 0627 ;        ML      # ( ‎ﯫ‎ → ‎ىٴا‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF # →‎ئا‎→
+FBEA ; 0649 0674 0627 ;        ML      # ( ‎ﯪ‎ → ‎ىٴا‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF      # →‎ئا‎→
+
+FC67 ; 0649 0674 0628 ;        ML      # ( ‎ﱧ‎ → ‎ىٴب‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER BEH  # →‎ئن‎→
+
+FBF8 ; 0649 0674 067A ;        ML      # ( ‎ﯸ‎ → ‎ىٴٺ‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER TTEHEH        # →‎ئې‎→
+FBF7 ; 0649 0674 067A ;        ML      # ( ‎ﯷ‎ → ‎ىٴٺ‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER TTEHEH  # →‎ئې‎→
+FBF6 ; 0649 0674 067A ;        ML      # ( ‎ﯶ‎ → ‎ىٴٺ‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER TTEHEH       # →‎ئې‎→
+
+FC97 ; 0649 0674 062C ;        ML      # ( ‎ﲗ‎ → ‎ىٴج‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER JEEM       # →‎ئج‎→
+FC00 ; 0649 0674 062C ;        ML      # ( ‎ﰀ‎ → ‎ىٴج‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER JEEM      # →‎ئج‎→
+FC99 ; 0649 0674 062C ;        ML      # ( ‎ﲙ‎ → ‎ىٴج‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER JEEM       # →‎ئخ‎→→‎يٴج‎→→‎ئج‎→
+
+FC98 ; 0649 0674 062D ;        ML      # ( ‎ﲘ‎ → ‎ىٴح‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER HAH # →‎ئح‎→
+FC01 ; 0649 0674 062D ;        ML      # ( ‎ﰁ‎ → ‎ىٴح‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER HAH        # →‎ئح‎→
+
+FC64 ; 0649 0674 0631 ;        ML      # ( ‎ﱤ‎ → ‎ىٴر‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER REH   # →‎ئر‎→
+
+FC65 ; 0649 0674 0632 ;        ML      # ( ‎ﱥ‎ → ‎ىٴز‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ZAIN # →‎ئز‎→
+
+FC9A ; 0649 0674 0645 ;        ML      # ( ‎ﲚ‎ → ‎ىٴم‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER MEEM       # →‎ئم‎→
+FCDF ; 0649 0674 0645 ;        ML      # ( ‎ﳟ‎ → ‎ىٴم‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER MEEM        # →‎ئم‎→
+FC66 ; 0649 0674 0645 ;        ML      # ( ‎ﱦ‎ → ‎ىٴم‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER MEEM # →‎ئم‎→
+FC02 ; 0649 0674 0645 ;        ML      # ( ‎ﰂ‎ → ‎ىٴم‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER MEEM      # →‎ئم‎→
+
+FC9B ; 0649 0674 0647 ;        ML      # ( ‎ﲛ‎ → ‎ىٴه‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER HEH # →‎ئه‎→
+FCE0 ; 0649 0674 0647 ;        ML      # ( ‎ﳠ‎ → ‎ىٴه‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER HEH  # →‎ئه‎→
+FBED ; 0649 0674 0647 ;        ML      # ( ‎ﯭ‎ → ‎ىٴه‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER HEH    # →‎ئە‎→→‎يٴه‎→→‎ئه‎→
+FBEC ; 0649 0674 0647 ;        ML      # ( ‎ﯬ‎ → ‎ىٴه‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER HEH # →‎ئە‎→→‎يٴه‎→→‎ئه‎→
+
+FBEF ; 0649 0674 0648 ;        ML      # ( ‎ﯯ‎ → ‎ىٴو‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER WAW   # →‎ئو‎→
+FBEE ; 0649 0674 0648 ;        ML      # ( ‎ﯮ‎ → ‎ىٴو‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER WAW        # →‎ئو‎→
+
+FBF3 ; 0649 0674 06C6 ;        ML      # ( ‎ﯳ‎ → ‎ىٴۆ‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER OE     # →‎ئۆ‎→
+FBF2 ; 0649 0674 06C6 ;        ML      # ( ‎ﯲ‎ → ‎ىٴۆ‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER OE  # →‎ئۆ‎→
+
+FBF1 ; 0649 0674 06C7 ;        ML      # ( ‎ﯱ‎ → ‎ىٴۇ‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER U       # →‎ئۇ‎→
+FBF0 ; 0649 0674 06C7 ;        ML      # ( ‎ﯰ‎ → ‎ىٴۇ‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER U    # →‎ئۇ‎→
+
+FBF5 ; 0649 0674 06C8 ;        ML      # ( ‎ﯵ‎ → ‎ىٴۈ‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER YU     # →‎ئۈ‎→
+FBF4 ; 0649 0674 06C8 ;        ML      # ( ‎ﯴ‎ → ‎ىٴۈ‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER YU  # →‎ئۈ‎→
+
+FBFB ; 0649 0674 0649 ;        ML      # ( ‎ﯻ‎ → ‎ىٴى‎ ) ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF MAKSURA        # →‎ئى‎→
+FBFA ; 0649 0674 0649 ;        ML      # ( ‎ﯺ‎ → ‎ىٴى‎ ) ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF MAKSURA  # →‎ئى‎→
+FC68 ; 0649 0674 0649 ;        ML      # ( ‎ﱨ‎ → ‎ىٴى‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF MAKSURA # →‎ئى‎→
+FBF9 ; 0649 0674 0649 ;        ML      # ( ‎ﯹ‎ → ‎ىٴى‎ ) ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF MAKSURA       # →‎ئى‎→
+FC03 ; 0649 0674 0649 ;        ML      # ( ‎ﰃ‎ → ‎ىٴى‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF MAKSURA      # →‎ئى‎→
+FC69 ; 0649 0674 0649 ;        ML      # ( ‎ﱩ‎ → ‎ىٴى‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF MAKSURA  # →‎ئي‎→→‎يٴى‎→→‎ئى‎→
+FC04 ; 0649 0674 0649 ;        ML      # ( ‎ﰄ‎ → ‎ىٴى‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF MAKSURA       # →‎ئي‎→→‎يٴى‎→→‎ئى‎→
+
+FC94 ; 0649 0628 ;     ML      # ( ‎ﲔ‎ → ‎ىب‎ ) ARABIC LIGATURE YEH WITH NOON FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER BEH       # →‎ين‎→
+
+FDAF ; 0649 062C 0649 ;        ML      # ( ‎ﶯ‎ → ‎ىجى‎ ) ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA       # →‎يجي‎→
+
+FDAE ; 0649 062D 0649 ;        ML      # ( ‎ﶮ‎ → ‎ىحى‎ ) ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA # →‎يحي‎→
+
+FC91 ; 0649 0631 ;     ML      # ( ‎ﲑ‎ → ‎ىر‎ ) ARABIC LIGATURE YEH WITH REH FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER REH        # →‎ير‎→
+
+FC92 ; 0649 0632 ;     ML      # ( ‎ﲒ‎ → ‎ىز‎ ) ARABIC LIGATURE YEH WITH ZAIN FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER ZAIN      # →‎يز‎→
+
+FCDD ; 0649 0645 ;     ML      # ( ‎ﳝ‎ → ‎ىم‎ ) ARABIC LIGATURE YEH WITH MEEM INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER MEEM    # →‎يم‎→
+FCF0 ; 0649 0645 ;     ML      # ( ‎ﳰ‎ → ‎ىم‎ ) ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER MEEM     # →‎يم‎→
+FC93 ; 0649 0645 ;     ML      # ( ‎ﲓ‎ → ‎ىم‎ ) ARABIC LIGATURE YEH WITH MEEM FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER MEEM      # →‎يم‎→
+FC58 ; 0649 0645 ;     ML      # ( ‎ﱘ‎ → ‎ىم‎ ) ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER MEEM   # →‎يم‎→
+
+FD9D ; 0649 0645 0645 ;        ML      # ( ‎ﶝ‎ → ‎ىمم‎ ) ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER MEEM, ARABIC LETTER MEEM    # →‎يمم‎→
+FD9C ; 0649 0645 0645 ;        ML      # ( ‎ﶜ‎ → ‎ىمم‎ ) ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER MEEM, ARABIC LETTER MEEM      # →‎يمم‎→
+
+FDB0 ; 0649 0645 0649 ;        ML      # ( ‎ﶰ‎ → ‎ىمى‎ ) ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA       # →‎يمي‎→
+
+FCDE ; 0649 0647 ;     ML      # ( ‎ﳞ‎ → ‎ىه‎ ) ARABIC LIGATURE YEH WITH HEH INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HEH      # →‎يه‎→
+FCF1 ; 0649 0647 ;     ML      # ( ‎ﳱ‎ → ‎ىه‎ ) ARABIC LIGATURE YEH WITH HEH MEDIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HEH       # →‎يه‎→
+
+FC95 ; 0649 0649 ;     ML      # ( ‎ﲕ‎ → ‎ىى‎ ) ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER ALEF MAKSURA      # →‎يى‎→
+FC59 ; 0649 0649 ;     ML      # ( ‎ﱙ‎ → ‎ىى‎ ) ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER ALEF MAKSURA   # →‎يى‎→
+FC96 ; 0649 0649 ;     ML      # ( ‎ﲖ‎ → ‎ىى‎ ) ARABIC LIGATURE YEH WITH YEH FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER ALEF MAKSURA       # →‎يي‎→
+FC5A ; 0649 0649 ;     ML      # ( ‎ﱚ‎ → ‎ىى‎ ) ARABIC LIGATURE YEH WITH YEH ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER ALEF MAKSURA    # →‎يي‎→
+
+FBAF ; 06D2 ;  ML      # ( ‎ﮯ‎ → ‎ے‎ ) ARABIC LETTER YEH BARREE FINAL FORM → ARABIC LETTER YEH BARREE   # 
+FBAE ; 06D2 ;  ML      # ( ‎ﮮ‎ → ‎ے‎ ) ARABIC LETTER YEH BARREE ISOLATED FORM → ARABIC LETTER YEH BARREE        # 
+
+FBB1 ; 06D3 ;  ML      # ( ‎ﮱ‎ → ‎ۓ‎ ) ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM → ARABIC LETTER YEH BARREE WITH HAMZA ABOVE # 
+FBB0 ; 06D3 ;  ML      # ( ‎ﮰ‎ → ‎ۓ‎ ) ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM → ARABIC LETTER YEH BARREE WITH HAMZA ABOVE      # 
+
+079A ; 0799 ;  ML      # ( ‎ޚ‎ → ‎ޙ‎ ) THAANA LETTER KHAA → THAANA LETTER HHAA   # 
+
+07A3 ; 07A2 ;  ML      # ( ‎ޣ‎ → ‎ޢ‎ ) THAANA LETTER GHAINU → THAANA LETTER AINU # 
+
+07A1 ; 07A0 ;  ML      # ( ‎ޡ‎ → ‎ޠ‎ ) THAANA LETTER ZO → THAANA LETTER TO       # 
+
+079F ; 079E ;  ML      # ( ‎ޟ‎ → ‎ޞ‎ ) THAANA LETTER DAADHU → THAANA LETTER SAADHU       # 
+
+22FF ; 2D39 ;  ML      #* ( ⋿ → ⴹ ) Z NOTATION BAG MEMBERSHIP → TIFINAGH LETTER YADD   # 
+2130 ; 2D39 ;  ML      # ( ℰ → ⴹ ) SCRIPT CAPITAL E → TIFINAGH LETTER YADD     # →E→
+1D404 ;        2D39 ;  ML      # ( 𝐄 → ⴹ ) MATHEMATICAL BOLD CAPITAL E → TIFINAGH LETTER YADD # →E→
+1D438 ;        2D39 ;  ML      # ( 𝐸 → ⴹ ) MATHEMATICAL ITALIC CAPITAL E → TIFINAGH LETTER YADD       # →E→
+1D46C ;        2D39 ;  ML      # ( 𝑬 → ⴹ ) MATHEMATICAL BOLD ITALIC CAPITAL E → TIFINAGH LETTER YADD  # →E→
+1D4D4 ;        2D39 ;  ML      # ( 𝓔 → ⴹ ) MATHEMATICAL BOLD SCRIPT CAPITAL E → TIFINAGH LETTER YADD  # →E→
+1D508 ;        2D39 ;  ML      # ( 𝔈 → ⴹ ) MATHEMATICAL FRAKTUR CAPITAL E → TIFINAGH LETTER YADD      # →E→
+1D53C ;        2D39 ;  ML      # ( 𝔼 → ⴹ ) MATHEMATICAL DOUBLE-STRUCK CAPITAL E → TIFINAGH LETTER YADD        # →E→
+1D570 ;        2D39 ;  ML      # ( 𝕰 → ⴹ ) MATHEMATICAL BOLD FRAKTUR CAPITAL E → TIFINAGH LETTER YADD # →E→
+1D5A4 ;        2D39 ;  ML      # ( 𝖤 → ⴹ ) MATHEMATICAL SANS-SERIF CAPITAL E → TIFINAGH LETTER YADD   # →E→
+1D5D8 ;        2D39 ;  ML      # ( 𝗘 → ⴹ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL E → TIFINAGH LETTER YADD      # →E→
+1D60C ;        2D39 ;  ML      # ( 𝘌 → ⴹ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL E → TIFINAGH LETTER YADD    # →E→
+1D640 ;        2D39 ;  ML      # ( 𝙀 → ⴹ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E → TIFINAGH LETTER YADD       # →E→
+1D674 ;        2D39 ;  ML      # ( 𝙴 → ⴹ ) MATHEMATICAL MONOSPACE CAPITAL E → TIFINAGH LETTER YADD    # →E→
+1D6AC ;        2D39 ;  ML      # ( 𝚬 → ⴹ ) MATHEMATICAL BOLD CAPITAL EPSILON → TIFINAGH LETTER YADD   # →Ε→
+1D6E6 ;        2D39 ;  ML      # ( 𝛦 → ⴹ ) MATHEMATICAL ITALIC CAPITAL EPSILON → TIFINAGH LETTER YADD # →Ε→
+1D720 ;        2D39 ;  ML      # ( 𝜠 → ⴹ ) MATHEMATICAL BOLD ITALIC CAPITAL EPSILON → TIFINAGH LETTER YADD    # →Ε→
+1D75A ;        2D39 ;  ML      # ( 𝝚 → ⴹ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON → TIFINAGH LETTER YADD        # →Ε→
+1D794 ;        2D39 ;  ML      # ( 𝞔 → ⴹ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON → TIFINAGH LETTER YADD # →Ε→
+13AC ; 2D39 ;  ML      # ( Ꭼ → ⴹ ) CHEROKEE LETTER GV → TIFINAGH LETTER YADD   # →E→
+A4F0 ; 2D39 ;  ML      # ( ꓰ → ⴹ ) LISU LETTER E → TIFINAGH LETTER YADD        # →E→
+
+2203 ; 2D3A ;  ML      #* ( ∃ → ⴺ ) THERE EXISTS → TIFINAGH LETTER YADDH       # 
+A4F1 ; 2D3A ;  ML      # ( ꓱ → ⴺ ) LISU LETTER EU → TIFINAGH LETTER YADDH      # →Ǝ→
+
+2211 ; 2D49 ;  ML      #* ( ∑ → ⵉ ) N-ARY SUMMATION → TIFINAGH LETTER YI       # →Ʃ→
+2140 ; 2D49 ;  ML      #* ( ⅀ → ⵉ ) DOUBLE-STRUCK N-ARY SUMMATION → TIFINAGH LETTER YI # →∑→→Ʃ→
+1D6BA ;        2D49 ;  ML      # ( 𝚺 → ⵉ ) MATHEMATICAL BOLD CAPITAL SIGMA → TIFINAGH LETTER YI       # →Σ→
+1D6F4 ;        2D49 ;  ML      # ( 𝛴 → ⵉ ) MATHEMATICAL ITALIC CAPITAL SIGMA → TIFINAGH LETTER YI     # →Σ→
+1D72E ;        2D49 ;  ML      # ( 𝜮 → ⵉ ) MATHEMATICAL BOLD ITALIC CAPITAL SIGMA → TIFINAGH LETTER YI        # →Σ→
+1D768 ;        2D49 ;  ML      # ( 𝝨 → ⵉ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA → TIFINAGH LETTER YI    # →Σ→
+1D7A2 ;        2D49 ;  ML      # ( 𝞢 → ⵉ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA → TIFINAGH LETTER YI     # →Σ→
+
+166D ; 2D5D ;  ML      #* ( ᙭ → ⵝ ) CANADIAN SYLLABICS CHI SIGN → TIFINAGH LETTER YATH # →X→
+1D417 ;        2D5D ;  ML      # ( 𝐗 → ⵝ ) MATHEMATICAL BOLD CAPITAL X → TIFINAGH LETTER YATH # →X→
+1D44B ;        2D5D ;  ML      # ( 𝑋 → ⵝ ) MATHEMATICAL ITALIC CAPITAL X → TIFINAGH LETTER YATH       # →X→
+1D47F ;        2D5D ;  ML      # ( 𝑿 → ⵝ ) MATHEMATICAL BOLD ITALIC CAPITAL X → TIFINAGH LETTER YATH  # →X→
+1D4B3 ;        2D5D ;  ML      # ( 𝒳 → ⵝ ) MATHEMATICAL SCRIPT CAPITAL X → TIFINAGH LETTER YATH       # →X→
+1D4E7 ;        2D5D ;  ML      # ( 𝓧 → ⵝ ) MATHEMATICAL BOLD SCRIPT CAPITAL X → TIFINAGH LETTER YATH  # →X→
+1D51B ;        2D5D ;  ML      # ( 𝔛 → ⵝ ) MATHEMATICAL FRAKTUR CAPITAL X → TIFINAGH LETTER YATH      # →X→
+1D54F ;        2D5D ;  ML      # ( 𝕏 → ⵝ ) MATHEMATICAL DOUBLE-STRUCK CAPITAL X → TIFINAGH LETTER YATH        # →X→
+1D583 ;        2D5D ;  ML      # ( 𝖃 → ⵝ ) MATHEMATICAL BOLD FRAKTUR CAPITAL X → TIFINAGH LETTER YATH # →X→
+1D5B7 ;        2D5D ;  ML      # ( 𝖷 → ⵝ ) MATHEMATICAL SANS-SERIF CAPITAL X → TIFINAGH LETTER YATH   # →X→
+1D5EB ;        2D5D ;  ML      # ( 𝗫 → ⵝ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL X → TIFINAGH LETTER YATH      # →X→
+1D61F ;        2D5D ;  ML      # ( 𝘟 → ⵝ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL X → TIFINAGH LETTER YATH    # →X→
+1D653 ;        2D5D ;  ML      # ( 𝙓 → ⵝ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X → TIFINAGH LETTER YATH       # →X→
+1D687 ;        2D5D ;  ML      # ( 𝚇 → ⵝ ) MATHEMATICAL MONOSPACE CAPITAL X → TIFINAGH LETTER YATH    # →X→
+1D6BE ;        2D5D ;  ML      # ( 𝚾 → ⵝ ) MATHEMATICAL BOLD CAPITAL CHI → TIFINAGH LETTER YATH       # →Χ→
+1D6F8 ;        2D5D ;  ML      # ( 𝛸 → ⵝ ) MATHEMATICAL ITALIC CAPITAL CHI → TIFINAGH LETTER YATH     # →Χ→
+1D732 ;        2D5D ;  ML      # ( 𝜲 → ⵝ ) MATHEMATICAL BOLD ITALIC CAPITAL CHI → TIFINAGH LETTER YATH        # →Χ→
+1D76C ;        2D5D ;  ML      # ( 𝝬 → ⵝ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI → TIFINAGH LETTER YATH    # →Χ→
+1D7A6 ;        2D5D ;  ML      # ( 𝞦 → ⵝ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI → TIFINAGH LETTER YATH     # →Χ→
+A4EB ; 2D5D ;  ML      # ( ꓫ → ⵝ ) LISU LETTER SHA → TIFINAGH LETTER YATH      # →X→
+
+0906 ; 0905 093E ;     ML      # ( आ → अा ) DEVANAGARI LETTER AA → DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN AA     # 
+
+0912 ; 0905 093E 0946 ;        ML      # ( ऒ → अाॆ ) DEVANAGARI LETTER SHORT O → DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN AA, DEVANAGARI VOWEL SIGN SHORT E      # →अॊ→→आॆ→
+
+0913 ; 0905 093E 0947 ;        ML      # ( ओ → अाे ) DEVANAGARI LETTER O → DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN AA, DEVANAGARI VOWEL SIGN E  # →अो→→आे→
+
+0914 ; 0905 093E 0948 ;        ML      # ( औ → अाै ) DEVANAGARI LETTER AU → DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN AA, DEVANAGARI VOWEL SIGN AI        # →अौ→→आै→
+
+0904 ; 0905 0946 ;     ML      # ( ऄ → अॆ ) DEVANAGARI LETTER SHORT A → DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN SHORT E   # 
+
+0911 ; 0905 0949 ;     ML      # ( ऑ → अॉ ) DEVANAGARI LETTER CANDRA O → DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN CANDRA O # 
+
+090D ; 090F 0945 ;     ML      # ( ऍ → एॅ ) DEVANAGARI LETTER CANDRA E → DEVANAGARI LETTER E, DEVANAGARI VOWEL SIGN CANDRA E # 
+
+090E ; 090F 0946 ;     ML      # ( ऎ → एॆ ) DEVANAGARI LETTER SHORT E → DEVANAGARI LETTER E, DEVANAGARI VOWEL SIGN SHORT E   # 
+
+0910 ; 090F 0947 ;     ML      # ( ऐ → एे ) DEVANAGARI LETTER AI → DEVANAGARI LETTER E, DEVANAGARI VOWEL SIGN E      # 
+
+0908 ; 0930 094D 0907 ;        ML      # ( ई → र्इ ) DEVANAGARI LETTER II → DEVANAGARI LETTER RA, DEVANAGARI SIGN VIRAMA, DEVANAGARI LETTER I      # 
+
+0ABD ; 093D ;  ML      # ( ઽ → ऽ ) GUJARATI SIGN AVAGRAHA → DEVANAGARI SIGN AVAGRAHA   # 
+
+0AC1 ; 0941 ;  ML      # ( ુ → ु ) GUJARATI VOWEL SIGN U → DEVANAGARI VOWEL SIGN U     # 
+
+0AC2 ; 0942 ;  ML      # ( ૂ → ू ) GUJARATI VOWEL SIGN UU → DEVANAGARI VOWEL SIGN UU   # 
+
+0A4B ; 0946 ;  ML      # ( ੋ → ॆ ) GURMUKHI VOWEL SIGN OO → DEVANAGARI VOWEL SIGN SHORT E      # 
+
+0A4D ; 094D ;  ML      # ( ੍ → ् ) GURMUKHI SIGN VIRAMA → DEVANAGARI SIGN VIRAMA       # 
+0ACD ; 094D ;  ML      # ( ્ → ् ) GUJARATI SIGN VIRAMA → DEVANAGARI SIGN VIRAMA       # 
+
+0986 ; 0985 09BE ;     ML      # ( আ → অা ) BENGALI LETTER AA → BENGALI LETTER A, BENGALI VOWEL SIGN AA      # 
+
+09E0 ; 098B 09C3 ;     ML      # ( ৠ → ঋৃ ) BENGALI LETTER VOCALIC RR → BENGALI LETTER VOCALIC R, BENGALI VOWEL SIGN VOCALIC R       # 
+09E1 ; 098B 09C3 ;     ML      # ( ৡ → ঋৃ ) BENGALI LETTER VOCALIC LL → BENGALI LETTER VOCALIC R, BENGALI VOWEL SIGN VOCALIC R       # →ঌৢ→→ৠ→
+
+0A09 ; 0A73 0A41 ;     ML      # ( ਉ → ੳੁ ) GURMUKHI LETTER U → GURMUKHI URA, GURMUKHI VOWEL SIGN U  # 
+
+0A0A ; 0A73 0A42 ;     ML      # ( ਊ → ੳੂ ) GURMUKHI LETTER UU → GURMUKHI URA, GURMUKHI VOWEL SIGN UU        # 
+
+0A06 ; 0A05 0A3E ;     ML      # ( ਆ → ਅਾ ) GURMUKHI LETTER AA → GURMUKHI LETTER A, GURMUKHI VOWEL SIGN AA   # 
+
+0A10 ; 0A05 0A48 ;     ML      # ( ਐ → ਅੈ ) GURMUKHI LETTER AI → GURMUKHI LETTER A, GURMUKHI VOWEL SIGN AI   # 
+
+0A14 ; 0A05 0A4C ;     ML      # ( ਔ → ਅੌ ) GURMUKHI LETTER AU → GURMUKHI LETTER A, GURMUKHI VOWEL SIGN AU   # 
+
+0A07 ; 0A72 0A3F ;     ML      # ( ਇ → ੲਿ ) GURMUKHI LETTER I → GURMUKHI IRI, GURMUKHI VOWEL SIGN I  # 
+
+0A08 ; 0A72 0A40 ;     ML      # ( ਈ → ੲੀ ) GURMUKHI LETTER II → GURMUKHI IRI, GURMUKHI VOWEL SIGN II        # 
+
+0A0F ; 0A72 0A47 ;     ML      # ( ਏ → ੲੇ ) GURMUKHI LETTER EE → GURMUKHI IRI, GURMUKHI VOWEL SIGN EE        # 
+
+0A86 ; 0A85 0ABE ;     ML      # ( આ → અા ) GUJARATI LETTER AA → GUJARATI LETTER A, GUJARATI VOWEL SIGN AA   # 
+
+0A91 ; 0A85 0ABE 0AC5 ;        ML      # ( ઑ → અાૅ ) GUJARATI VOWEL CANDRA O → GUJARATI LETTER A, GUJARATI VOWEL SIGN AA, GUJARATI VOWEL SIGN CANDRA E     # →અૉ→→આૅ→
+
+0A93 ; 0A85 0ABE 0AC7 ;        ML      # ( ઓ → અાે ) GUJARATI LETTER O → GUJARATI LETTER A, GUJARATI VOWEL SIGN AA, GUJARATI VOWEL SIGN E  # →અો→→આે→
+
+0A94 ; 0A85 0ABE 0AC8 ;        ML      # ( ઔ → અાૈ ) GUJARATI LETTER AU → GUJARATI LETTER A, GUJARATI VOWEL SIGN AA, GUJARATI VOWEL SIGN AI        # →અૌ→→આૈ→
+
+0A8D ; 0A85 0AC5 ;     ML      # ( ઍ → અૅ ) GUJARATI VOWEL CANDRA E → GUJARATI LETTER A, GUJARATI VOWEL SIGN CANDRA E        # 
+
+0A8F ; 0A85 0AC7 ;     ML      # ( એ → અે ) GUJARATI LETTER E → GUJARATI LETTER A, GUJARATI VOWEL SIGN E     # 
+
+0A90 ; 0A85 0AC8 ;     ML      # ( ઐ → અૈ ) GUJARATI LETTER AI → GUJARATI LETTER A, GUJARATI VOWEL SIGN AI   # 
+
+0B06 ; 0B05 0B3E ;     ML      # ( ଆ → ଅା ) ORIYA LETTER AA → ORIYA LETTER A, ORIYA VOWEL SIGN AA    # 
+
+2102 ; 0BD0 ;  ML      # ( ℂ → ௐ ) DOUBLE-STRUCK CAPITAL C → TAMIL OM  # →C→→С→
+212D ; 0BD0 ;  ML      # ( ℭ → ௐ ) BLACK-LETTER CAPITAL C → TAMIL OM   # →C→→С→
+1D402 ;        0BD0 ;  ML      # ( 𝐂 → ௐ ) MATHEMATICAL BOLD CAPITAL C → TAMIL OM     # →C→→С→
+1D436 ;        0BD0 ;  ML      # ( 𝐶 → ௐ ) MATHEMATICAL ITALIC CAPITAL C → TAMIL OM   # →C→→С→
+1D46A ;        0BD0 ;  ML      # ( 𝑪 → ௐ ) MATHEMATICAL BOLD ITALIC CAPITAL C → TAMIL OM      # →C→→С→
+1D49E ;        0BD0 ;  ML      # ( 𝒞 → ௐ ) MATHEMATICAL SCRIPT CAPITAL C → TAMIL OM   # →C→→С→
+1D4D2 ;        0BD0 ;  ML      # ( 𝓒 → ௐ ) MATHEMATICAL BOLD SCRIPT CAPITAL C → TAMIL OM      # →C→→С→
+1D56E ;        0BD0 ;  ML      # ( 𝕮 → ௐ ) MATHEMATICAL BOLD FRAKTUR CAPITAL C → TAMIL OM     # →C→→С→
+1D5A2 ;        0BD0 ;  ML      # ( 𝖢 → ௐ ) MATHEMATICAL SANS-SERIF CAPITAL C → TAMIL OM       # →C→→С→
+1D5D6 ;        0BD0 ;  ML      # ( 𝗖 → ௐ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL C → TAMIL OM  # →C→→С→
+1D60A ;        0BD0 ;  ML      # ( 𝘊 → ௐ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL C → TAMIL OM        # →C→→С→
+1D63E ;        0BD0 ;  ML      # ( 𝘾 → ௐ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C → TAMIL OM   # →C→→С→
+1D672 ;        0BD0 ;  ML      # ( 𝙲 → ௐ ) MATHEMATICAL MONOSPACE CAPITAL C → TAMIL OM        # →C→→С→
+13DF ; 0BD0 ;  ML      # ( Ꮯ → ௐ ) CHEROKEE LETTER TLI → TAMIL OM      # →C→→С→
+A4DA ; 0BD0 ;  ML      # ( ꓚ → ௐ ) LISU LETTER CA → TAMIL OM   # →C→→С→
+
+0BEE ; 0B85 ;  ML      # ( ௮ → அ ) TAMIL DIGIT EIGHT → TAMIL LETTER A  # 
+
+0BB0 ; 0B88 ;  ML      # ( ர → ஈ ) TAMIL LETTER RA → TAMIL LETTER II   # →ா→
+0BBE ; 0B88 ;  ML      # ( ா → ஈ ) TAMIL VOWEL SIGN AA → TAMIL LETTER II       # 
+
+0BEB ; 0B88 0BC1 ;     ML      # ( ௫ → ஈு ) TAMIL DIGIT FIVE → TAMIL LETTER II, TAMIL VOWEL SIGN U   # →ரு→
+
+0BE8 ; 0B89 ;  ML      # ( ௨ → உ ) TAMIL DIGIT TWO → TAMIL LETTER U    # 
+0D09 ; 0B89 ;  ML      # ( ഉ → உ ) MALAYALAM LETTER U → TAMIL LETTER U # 
+
+0B8A ; 0B89 0BB3 ;     ML      # ( ஊ → உள ) TAMIL LETTER UU → TAMIL LETTER U, TAMIL LETTER LLA       # 
+
+0D0A ; 0B89 0D57 ;     ML      # ( ഊ → உൗ ) MALAYALAM LETTER UU → TAMIL LETTER U, MALAYALAM AU LENGTH MARK   # →ഉൗ→
+
+0BED ; 0B8E ;  ML      # ( ௭ → எ ) TAMIL DIGIT SEVEN → TAMIL LETTER E  # 
+
+0BF7 ; 0B8E 0BB5 ;     ML      #* ( ௷ → எவ ) TAMIL CREDIT SIGN → TAMIL LETTER E, TAMIL LETTER VA     # 
+
+0B9C ; 0B90 ;  ML      # ( ஜ → ஐ ) TAMIL LETTER JA → TAMIL LETTER AI   # 
+0D1C ; 0B90 ;  ML      # ( ജ → ஐ ) MALAYALAM LETTER JA → TAMIL LETTER AI       # →ஜ→
+
+0BE7 ; 0B95 ;  ML      # ( ௧ → க ) TAMIL DIGIT ONE → TAMIL LETTER KA   # 
+
+0BEA ; 0B9A ;  ML      # ( ௪ → ச ) TAMIL DIGIT FOUR → TAMIL LETTER CA  # 
+
+0BEC ; 0B9A 0BC1 ;     ML      # ( ௬ → சு ) TAMIL DIGIT SIX → TAMIL LETTER CA, TAMIL VOWEL SIGN U    # 
+
+0BF2 ; 0B9A 0BC2 ;     ML      #* ( ௲ → சூ ) TAMIL NUMBER ONE THOUSAND → TAMIL LETTER CA, TAMIL VOWEL SIGN UU        # 
+
+0D23 ; 0BA3 ;  ML      # ( ണ → ண ) MALAYALAM LETTER NNA → TAMIL LETTER NNA     # 
+
+0BFA ; 0BA8 0BC0 ;     ML      #* ( ௺ → நீ ) TAMIL NUMBER SIGN → TAMIL LETTER NA, TAMIL VOWEL SIGN II        # 
+
+0BF4 ; 0BAE 0BC0 ;     ML      #* ( ௴ → மீ ) TAMIL MONTH SIGN → TAMIL LETTER MA, TAMIL VOWEL SIGN II # 
+
+0BF0 ; 0BAF ;  ML      #* ( ௰ → ய ) TAMIL NUMBER TEN → TAMIL LETTER YA # 
+
+0D34 ; 0BB4 ;  ML      # ( ഴ → ழ ) MALAYALAM LETTER LLLA → TAMIL LETTER LLLA   # 
+
+0BD7 ; 0BB3 ;  ML      # ( ௗ → ள ) TAMIL AU LENGTH MARK → TAMIL LETTER LLA     # 
+
+0BC8 ; 0BA9 ;  ML      # ( ை → ன ) TAMIL VOWEL SIGN AI → TAMIL LETTER NNNA     # 
+
+0D36 ; 0BB6 ;  ML      # ( ശ → ஶ ) MALAYALAM LETTER SHA → TAMIL LETTER SHA     # 
+
+0BF8 ; 0BB7 ;  ML      #* ( ௸ → ஷ ) TAMIL AS ABOVE SIGN → TAMIL LETTER SSA     # 
+
+0D3F ; 0BBF ;  ML      # ( ി → ி ) MALAYALAM VOWEL SIGN I → TAMIL VOWEL SIGN I # 
+0D40 ; 0BBF ;  ML      # ( ീ → ி ) MALAYALAM VOWEL SIGN II → TAMIL VOWEL SIGN I        # 
+
+0BCA ; 0BC6 0B88 ;     ML      # ( ொ → ெஈ ) TAMIL VOWEL SIGN O → TAMIL VOWEL SIGN E, TAMIL LETTER II # →ெர→
+
+0BCC ; 0BC6 0BB3 ;     ML      # ( ௌ → ெள ) TAMIL VOWEL SIGN AU → TAMIL VOWEL SIGN E, TAMIL LETTER LLA       # 
+
+0BCB ; 0BC7 0B88 ;     ML      # ( ோ → ேஈ ) TAMIL VOWEL SIGN OO → TAMIL VOWEL SIGN EE, TAMIL LETTER II       # →ேர→
+
+0C85 ; 0C05 ;  ML      # ( ಅ → అ ) KANNADA LETTER A → TELUGU LETTER A  # 
+
+0C86 ; 0C06 ;  ML      # ( ಆ → ఆ ) KANNADA LETTER AA → TELUGU LETTER AA        # 
+
+0C87 ; 0C07 ;  ML      # ( ಇ → ఇ ) KANNADA LETTER I → TELUGU LETTER I  # 
+
+0C60 ; 0C0B 0C3E ;     ML      # ( ౠ → ఋా ) TELUGU LETTER VOCALIC RR → TELUGU LETTER VOCALIC R, TELUGU VOWEL SIGN AA # 
+
+0C61 ; 0C0C 0C3E ;     ML      # ( ౡ → ఌా ) TELUGU LETTER VOCALIC LL → TELUGU LETTER VOCALIC L, TELUGU VOWEL SIGN AA # 
+
+0C92 ; 0C12 ;  ML      # ( ಒ → ఒ ) KANNADA LETTER O → TELUGU LETTER O  # 
+
+0C14 ; 0C12 0C4C ;     ML      # ( ఔ → ఒౌ ) TELUGU LETTER AU → TELUGU LETTER O, TELUGU VOWEL SIGN AU # 
+0C94 ; 0C12 0C4C ;     ML      # ( ಔ → ఒౌ ) KANNADA LETTER AU → TELUGU LETTER O, TELUGU VOWEL SIGN AU        # →ఔ→
+
+0C13 ; 0C12 0C55 ;     ML      # ( ఓ → ఒౕ ) TELUGU LETTER OO → TELUGU LETTER O, TELUGU LENGTH MARK   # 
+0C93 ; 0C12 0C55 ;     ML      # ( ಓ → ఒౕ ) KANNADA LETTER OO → TELUGU LETTER O, TELUGU LENGTH MARK  # →ఓ→
+
+0C9C ; 0C1C ;  ML      # ( ಜ → జ ) KANNADA LETTER JA → TELUGU LETTER JA        # 
+
+0C9E ; 0C1E ;  ML      # ( ಞ → ఞ ) KANNADA LETTER NYA → TELUGU LETTER NYA      # 
+
+0C22 ; 0C21 0323 ;     ML      # ( ఢ → డ̣ ) TELUGU LETTER DDHA → TELUGU LETTER DDA, COMBINING DOT BELOW       # 
+
+0CA3 ; 0C23 ;  ML      # ( ಣ → ణ ) KANNADA LETTER NNA → TELUGU LETTER NNA      # 
+
+0C25 ; 0C27 05BC ;     ML      # ( థ → ధּ ) TELUGU LETTER THA → TELUGU LETTER DHA, HEBREW POINT DAGESH OR MAPIQ       # 
+
+0C2D ; 0C2C 0323 ;     ML      # ( భ → బ̣ ) TELUGU LETTER BHA → TELUGU LETTER BA, COMBINING DOT BELOW # 
+
+0CAF ; 0C2F ;  ML      # ( ಯ → య ) KANNADA LETTER YA → TELUGU LETTER YA        # 
+
+0C20 ; 0C30 05BC ;     ML      # ( ఠ → రּ ) TELUGU LETTER TTHA → TELUGU LETTER RA, HEBREW POINT DAGESH OR MAPIQ       # 
+
+0CB1 ; 0C31 ;  ML      # ( ಱ → ఱ ) KANNADA LETTER RRA → TELUGU LETTER RRA      # 
+
+0CB2 ; 0C32 ;  ML      # ( ಲ → ల ) KANNADA LETTER LA → TELUGU LETTER LA        # 
+
+0C37 ; 0C35 0323 ;     ML      # ( ష → వ̣ ) TELUGU LETTER SSA → TELUGU LETTER VA, COMBINING DOT BELOW # 
+
+0C39 ; 0C35 0C3E ;     ML      # ( హ → వా ) TELUGU LETTER HA → TELUGU LETTER VA, TELUGU VOWEL SIGN AA        # 
+
+0C2E ; 0C35 0C41 ;     ML      # ( మ → వు ) TELUGU LETTER MA → TELUGU LETTER VA, TELUGU VOWEL SIGN U # 
+
+0C42 ; 0C41 0C3E ;     ML      # ( ూ → ుా ) TELUGU VOWEL SIGN UU → TELUGU VOWEL SIGN U, TELUGU VOWEL SIGN AA # 
+
+0C44 ; 0C43 0C3E ;     ML      # ( ౄ → ృా ) TELUGU VOWEL SIGN VOCALIC RR → TELUGU VOWEL SIGN VOCALIC R, TELUGU VOWEL SIGN AA # 
+
+0CE1 ; 0C8C 0CBE ;     ML      # ( ೡ → ಌಾ ) KANNADA LETTER VOCALIC LL → KANNADA LETTER VOCALIC L, KANNADA VOWEL SIGN AA      # 
+
+0D08 ; 0D07 0D57 ;     ML      # ( ഈ → ഇൗ ) MALAYALAM LETTER II → MALAYALAM LETTER I, MALAYALAM AU LENGTH MARK       # 
+
+0D10 ; 0D0E 0D46 ;     ML      # ( ഐ → എെ ) MALAYALAM LETTER AI → MALAYALAM LETTER E, MALAYALAM VOWEL SIGN E # 
+
+0D13 ; 0D12 0D3E ;     ML      # ( ഓ → ഒാ ) MALAYALAM LETTER OO → MALAYALAM LETTER O, MALAYALAM VOWEL SIGN AA        # 
+
+0D14 ; 0D12 0D57 ;     ML      # ( ഔ → ഒൗ ) MALAYALAM LETTER AU → MALAYALAM LETTER O, MALAYALAM AU LENGTH MARK       # 
+
+0D61 ; 0D1E ;  ML      # ( ൡ → ഞ ) MALAYALAM LETTER VOCALIC LL → MALAYALAM LETTER NYA  # 
+
+0D6B ; 0D26 0D4D 0D30 ;        ML      # ( ൫ → ദ്ര ) MALAYALAM DIGIT FIVE → MALAYALAM LETTER DA, MALAYALAM SIGN VIRAMA, MALAYALAM LETTER RA        # 
+
+0D0C ; 0D28 0D41 ;     ML      # ( ഌ → നു ) MALAYALAM LETTER VOCALIC L → MALAYALAM LETTER NA, MALAYALAM VOWEL SIGN U # 
+0D19 ; 0D28 0D41 ;     ML      # ( ങ → നു ) MALAYALAM LETTER NGA → MALAYALAM LETTER NA, MALAYALAM VOWEL SIGN U       # →ഌ→
+
+0D6F ; 0D28 0D4D ;     ML      # ( ൯ → ന് ) MALAYALAM DIGIT NINE → MALAYALAM LETTER NA, MALAYALAM SIGN VIRAMA        # 
+
+0D8C ; 0D28 0D4D 0D28 ;        ML      # ( ඌ → ന്ന ) SINHALA LETTER UUYANNA → MALAYALAM LETTER NA, MALAYALAM SIGN VIRAMA, MALAYALAM LETTER NA      # 
+
+0D31 ; 0D30 ;  ML      # ( റ → ര ) MALAYALAM LETTER RRA → MALAYALAM LETTER RA  # 
+
+0D6A ; 0D30 0D4D ;     ML      # ( ൪ → ര് ) MALAYALAM DIGIT FOUR → MALAYALAM LETTER RA, MALAYALAM SIGN VIRAMA        # 
+
+0D6E ; 0D35 0D4D ;     ML      # ( ൮ → വ് ) MALAYALAM DIGIT EIGHT → MALAYALAM LETTER VA, MALAYALAM SIGN VIRAMA       # 
+
+0D42 ; 0D41 ;  ML      # ( ൂ → ു ) MALAYALAM VOWEL SIGN UU → MALAYALAM VOWEL SIGN U    # 
+0D43 ; 0D41 ;  ML      # ( ൃ → ു ) MALAYALAM VOWEL SIGN VOCALIC R → MALAYALAM VOWEL SIGN U     # →ൂ→
+
+0D48 ; 0D46 0D46 ;     ML      # ( ൈ → െെ ) MALAYALAM VOWEL SIGN AI → MALAYALAM VOWEL SIGN E, MALAYALAM VOWEL SIGN E # 
+
+0E03 ; 0E02 ;  ML      # ( ฃ → ข ) THAI CHARACTER KHO KHUAT → THAI CHARACTER KHO KHAI  # 
+
+0E14 ; 0E04 ;  ML      # ( ด → ค ) THAI CHARACTER DO DEK → THAI CHARACTER KHO KHWAI    # 
+0E15 ; 0E04 ;  ML      # ( ต → ค ) THAI CHARACTER TO TAO → THAI CHARACTER KHO KHWAI    # →ด→
+
+0E21 ; 0E06 ;  ML      # ( ม → ฆ ) THAI CHARACTER MO MA → THAI CHARACTER KHO RAKHANG   # 
+
+0E88 ; 0E08 ;  ML      # ( ຈ → จ ) LAO LETTER CO → THAI CHARACTER CHO CHAN     # 
+
+0E0B ; 0E0A ;  ML      # ( ซ → ช ) THAI CHARACTER SO SO → THAI CHARACTER CHO CHANG     # 
+
+0E0F ; 0E0E ;  ML      # ( ฏ → ฎ ) THAI CHARACTER TO PATAK → THAI CHARACTER DO CHADA   # 
+
+0E17 ; 0E11 ;  ML      # ( ท → ฑ ) THAI CHARACTER THO THAHAN → THAI CHARACTER THO NANGMONTHO   # 
+
+0E9A ; 0E1A ;  ML      # ( ບ → บ ) LAO LETTER BO → THAI CHARACTER BO BAIMAI    # 
+
+0E9B ; 0E1B ;  ML      # ( ປ → ป ) LAO LETTER PO → THAI CHARACTER PO PLA       # 
+
+0E9D ; 0E1D ;  ML      # ( ຝ → ฝ ) LAO LETTER FO TAM → THAI CHARACTER FO FA    # 
+
+0E9E ; 0E1E ;  ML      # ( ພ → พ ) LAO LETTER PHO TAM → THAI CHARACTER PHO PHAN        # 
+
+0E9F ; 0E1F ;  ML      # ( ຟ → ฟ ) LAO LETTER FO SUNG → THAI CHARACTER FO FAN  # 
+
+0E26 ; 0E20 ;  ML      # ( ฦ → ภ ) THAI CHARACTER LU → THAI CHARACTER PHO SAMPHAO      # 
+
+0E8D ; 0E22 ;  ML      # ( ຍ → ย ) LAO LETTER NYO → THAI CHARACTER YO YAK      # 
+
+17D4 ; 0E2F ;  ML      #* ( ។ → ฯ ) KHMER SIGN KHAN → THAI CHARACTER PAIYANNOI # 
+
+0E45 ; 0E32 ;  ML      # ( ๅ → า ) THAI CHARACTER LAKKHANGYAO → THAI CHARACTER SARA AA # 
+
+0E33 ; 030A 0E32 ;     ML      # ( ำ → ̊า ) THAI CHARACTER SARA AM → COMBINING RING ABOVE, THAI CHARACTER SARA AA     # →ํา→
+
+17B7 ; 0E34 ;  ML      # ( ិ → ิ ) KHMER VOWEL SIGN I → THAI CHARACTER SARA I  # 
+
+17B8 ; 0E35 ;  ML      # ( ី → ี ) KHMER VOWEL SIGN II → THAI CHARACTER SARA II        # 
+
+17B9 ; 0E36 ;  ML      # ( ឹ → ึ ) KHMER VOWEL SIGN Y → THAI CHARACTER SARA UE # 
+
+17BA ; 0E37 ;  ML      # ( ឺ → ื ) KHMER VOWEL SIGN YY → THAI CHARACTER SARA UEE       # 
+
+0EB8 ; 0E38 ;  ML      # ( ຸ → ุ ) LAO VOWEL SIGN U → THAI CHARACTER SARA U    # 
+
+0EB9 ; 0E39 ;  ML      # ( ູ → ู ) LAO VOWEL SIGN UU → THAI CHARACTER SARA UU  # 
+
+0E41 ; 0E40 0E40 ;     ML      # ( แ → เเ ) THAI CHARACTER SARA AE → THAI CHARACTER SARA E, THAI CHARACTER SARA E    # 
+
+0EDC ; 0EAB 0E99 ;     ML      # ( ໜ → ຫນ ) LAO HO NO → LAO LETTER HO SUNG, LAO LETTER NO    # 
+
+0EDD ; 0EAB 0EA1 ;     ML      # ( ໝ → ຫມ ) LAO HO MO → LAO LETTER HO SUNG, LAO LETTER MO    # 
+
+0EB3 ; 030A 0EB2 ;     ML      # ( ຳ → ̊າ ) LAO VOWEL SIGN AM → COMBINING RING ABOVE, LAO VOWEL SIGN AA       # →ໍາ→
+
+0F6A ; 0F62 ;  ML      # ( ཪ → ར ) TIBETAN LETTER FIXED-FORM RA → TIBETAN LETTER RA    # 
+
+0F77 ; 0FB2 0F71 0F80 ;        ML      # ( ཷ → ྲཱྀ ) TIBETAN VOWEL SIGN VOCALIC RR → TIBETAN SUBJOINED LETTER RA, TIBETAN VOWEL SIGN AA, TIBETAN VOWEL SIGN REVERSED I     # 
+
+0F79 ; 0FB3 0F71 0F80 ;        ML      # ( ཹ → ླཱྀ ) TIBETAN VOWEL SIGN VOCALIC LL → TIBETAN SUBJOINED LETTER LA, TIBETAN VOWEL SIGN AA, TIBETAN VOWEL SIGN REVERSED I     # 
+
+17A3 ; 17A2 ;  ML      # ( ឣ → អ ) KHMER INDEPENDENT VOWEL QAQ → KHMER LETTER QA       # 
+
+19D0 ; 199E ;  ML      # ( ᧐ → ᦞ ) NEW TAI LUE DIGIT ZERO → NEW TAI LUE LETTER LOW VA  # 
+
+19D1 ; 19B1 ;  ML      # ( ᧑ → ᦱ ) NEW TAI LUE DIGIT ONE → NEW TAI LUE VOWEL SIGN AA   # 
+
+1A80 ; 1A45 ;  ML      # ( ᪀ → ᩅ ) TAI THAM HORA DIGIT ZERO → TAI THAM LETTER WA       # 
+1A90 ; 1A45 ;  ML      # ( ᪐ → ᩅ ) TAI THAM THAM DIGIT ZERO → TAI THAM LETTER WA       # 
+
+AA53 ; AA01 ;  ML      # ( ꩓ → ꨁ ) CHAM DIGIT THREE → CHAM LETTER I    # 
+
+AA56 ; AA23 ;  ML      # ( ꩖ → ꨣ ) CHAM DIGIT SIX → CHAM LETTER RA     # 
+
+1B52 ; 1B0D ;  ML      # ( ᭒ → ᬍ ) BALINESE DIGIT TWO → BALINESE LETTER LA LENGA       # 
+
+1B53 ; 1B11 ;  ML      # ( ᭓ → ᬑ ) BALINESE DIGIT THREE → BALINESE LETTER OKARA        # 
+
+1B58 ; 1B28 ;  ML      # ( ᭘ → ᬨ ) BALINESE DIGIT EIGHT → BALINESE LETTER PA KAPAL     # 
+
+1896 ; 185C ;  ML      # ( ᢖ → ᡜ ) MONGOLIAN LETTER ALI GALI ZA → MONGOLIAN LETTER TODO DZA    # 
+
+1855 ; 1835 ;  ML      # ( ᡕ → ᠵ ) MONGOLIAN LETTER TODO YA → MONGOLIAN LETTER JA      # 
+
+27D9 ; 13A2 ;  ML      #* ( ⟙ → Ꭲ ) LARGE DOWN TACK → CHEROKEE LETTER I        # →T→
+1D413 ;        13A2 ;  ML      # ( 𝐓 → Ꭲ ) MATHEMATICAL BOLD CAPITAL T → CHEROKEE LETTER I    # →T→
+1D447 ;        13A2 ;  ML      # ( 𝑇 → Ꭲ ) MATHEMATICAL ITALIC CAPITAL T → CHEROKEE LETTER I  # →T→
+1D47B ;        13A2 ;  ML      # ( 𝑻 → Ꭲ ) MATHEMATICAL BOLD ITALIC CAPITAL T → CHEROKEE LETTER I     # →T→
+1D4AF ;        13A2 ;  ML      # ( 𝒯 → Ꭲ ) MATHEMATICAL SCRIPT CAPITAL T → CHEROKEE LETTER I  # →T→
+1D4E3 ;        13A2 ;  ML      # ( 𝓣 → Ꭲ ) MATHEMATICAL BOLD SCRIPT CAPITAL T → CHEROKEE LETTER I     # →T→
+1D517 ;        13A2 ;  ML      # ( 𝔗 → Ꭲ ) MATHEMATICAL FRAKTUR CAPITAL T → CHEROKEE LETTER I # →T→
+1D54B ;        13A2 ;  ML      # ( 𝕋 → Ꭲ ) MATHEMATICAL DOUBLE-STRUCK CAPITAL T → CHEROKEE LETTER I   # →T→
+1D57F ;        13A2 ;  ML      # ( 𝕿 → Ꭲ ) MATHEMATICAL BOLD FRAKTUR CAPITAL T → CHEROKEE LETTER I    # →T→
+1D5B3 ;        13A2 ;  ML      # ( 𝖳 → Ꭲ ) MATHEMATICAL SANS-SERIF CAPITAL T → CHEROKEE LETTER I      # →T→
+1D5E7 ;        13A2 ;  ML      # ( 𝗧 → Ꭲ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL T → CHEROKEE LETTER I # →T→
+1D61B ;        13A2 ;  ML      # ( 𝘛 → Ꭲ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL T → CHEROKEE LETTER I       # →T→
+1D64F ;        13A2 ;  ML      # ( 𝙏 → Ꭲ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T → CHEROKEE LETTER I  # →T→
+1D683 ;        13A2 ;  ML      # ( 𝚃 → Ꭲ ) MATHEMATICAL MONOSPACE CAPITAL T → CHEROKEE LETTER I       # →T→
+1D6BB ;        13A2 ;  ML      # ( 𝚻 → Ꭲ ) MATHEMATICAL BOLD CAPITAL TAU → CHEROKEE LETTER I  # →Τ→
+1D6F5 ;        13A2 ;  ML      # ( 𝛵 → Ꭲ ) MATHEMATICAL ITALIC CAPITAL TAU → CHEROKEE LETTER I        # →Τ→
+1D72F ;        13A2 ;  ML      # ( 𝜯 → Ꭲ ) MATHEMATICAL BOLD ITALIC CAPITAL TAU → CHEROKEE LETTER I   # →Τ→
+1D769 ;        13A2 ;  ML      # ( 𝝩 → Ꭲ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU → CHEROKEE LETTER I       # →Τ→
+1D7A3 ;        13A2 ;  ML      # ( 𝞣 → Ꭲ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU → CHEROKEE LETTER I        # →Τ→
+A4D4 ; 13A2 ;  ML      # ( ꓔ → Ꭲ ) LISU LETTER TA → CHEROKEE LETTER I  # →T→
+
+1D418 ;        13A9 ;  ML      # ( 𝐘 → Ꭹ ) MATHEMATICAL BOLD CAPITAL Y → CHEROKEE LETTER GI   # →Y→
+1D44C ;        13A9 ;  ML      # ( 𝑌 → Ꭹ ) MATHEMATICAL ITALIC CAPITAL Y → CHEROKEE LETTER GI # →Y→
+1D480 ;        13A9 ;  ML      # ( 𝒀 → Ꭹ ) MATHEMATICAL BOLD ITALIC CAPITAL Y → CHEROKEE LETTER GI    # →Y→
+1D4B4 ;        13A9 ;  ML      # ( 𝒴 → Ꭹ ) MATHEMATICAL SCRIPT CAPITAL Y → CHEROKEE LETTER GI # →Y→
+1D4E8 ;        13A9 ;  ML      # ( 𝓨 → Ꭹ ) MATHEMATICAL BOLD SCRIPT CAPITAL Y → CHEROKEE LETTER GI    # →Y→
+1D51C ;        13A9 ;  ML      # ( 𝔜 → Ꭹ ) MATHEMATICAL FRAKTUR CAPITAL Y → CHEROKEE LETTER GI        # →Y→
+1D550 ;        13A9 ;  ML      # ( 𝕐 → Ꭹ ) MATHEMATICAL DOUBLE-STRUCK CAPITAL Y → CHEROKEE LETTER GI  # →Y→
+1D584 ;        13A9 ;  ML      # ( 𝖄 → Ꭹ ) MATHEMATICAL BOLD FRAKTUR CAPITAL Y → CHEROKEE LETTER GI   # →Y→
+1D5B8 ;        13A9 ;  ML      # ( 𝖸 → Ꭹ ) MATHEMATICAL SANS-SERIF CAPITAL Y → CHEROKEE LETTER GI     # →Y→
+1D5EC ;        13A9 ;  ML      # ( 𝗬 → Ꭹ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL Y → CHEROKEE LETTER GI        # →Y→
+1D620 ;        13A9 ;  ML      # ( 𝘠 → Ꭹ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y → CHEROKEE LETTER GI      # →Y→
+1D654 ;        13A9 ;  ML      # ( 𝙔 → Ꭹ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y → CHEROKEE LETTER GI # →Y→
+1D688 ;        13A9 ;  ML      # ( 𝚈 → Ꭹ ) MATHEMATICAL MONOSPACE CAPITAL Y → CHEROKEE LETTER GI      # →Y→
+03D2 ; 13A9 ;  ML      # ( ϒ → Ꭹ ) GREEK UPSILON WITH HOOK SYMBOL → CHEROKEE LETTER GI  # →Y→
+1D6BC ;        13A9 ;  ML      # ( 𝚼 → Ꭹ ) MATHEMATICAL BOLD CAPITAL UPSILON → CHEROKEE LETTER GI     # →Υ→→Y→
+1D6F6 ;        13A9 ;  ML      # ( 𝛶 → Ꭹ ) MATHEMATICAL ITALIC CAPITAL UPSILON → CHEROKEE LETTER GI   # →Υ→→Y→
+1D730 ;        13A9 ;  ML      # ( 𝜰 → Ꭹ ) MATHEMATICAL BOLD ITALIC CAPITAL UPSILON → CHEROKEE LETTER GI      # →Υ→→Y→
+1D76A ;        13A9 ;  ML      # ( 𝝪 → Ꭹ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON → CHEROKEE LETTER GI  # →Υ→→Y→
+1D7A4 ;        13A9 ;  ML      # ( 𝞤 → Ꭹ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON → CHEROKEE LETTER GI   # →Υ→→Y→
+13BD ; 13A9 ;  ML      # ( Ꮍ → Ꭹ ) CHEROKEE LETTER MU → CHEROKEE LETTER GI     # 
+A4EC ; 13A9 ;  ML      # ( ꓬ → Ꭹ ) LISU LETTER YA → CHEROKEE LETTER GI # →Y→
+
+1D416 ;        13B3 ;  ML      # ( 𝐖 → Ꮃ ) MATHEMATICAL BOLD CAPITAL W → CHEROKEE LETTER LA   # →W→
+1D44A ;        13B3 ;  ML      # ( 𝑊 → Ꮃ ) MATHEMATICAL ITALIC CAPITAL W → CHEROKEE LETTER LA # →W→
+1D47E ;        13B3 ;  ML      # ( 𝑾 → Ꮃ ) MATHEMATICAL BOLD ITALIC CAPITAL W → CHEROKEE LETTER LA    # →W→
+1D4B2 ;        13B3 ;  ML      # ( 𝒲 → Ꮃ ) MATHEMATICAL SCRIPT CAPITAL W → CHEROKEE LETTER LA # →W→
+1D4E6 ;        13B3 ;  ML      # ( 𝓦 → Ꮃ ) MATHEMATICAL BOLD SCRIPT CAPITAL W → CHEROKEE LETTER LA    # →W→
+1D51A ;        13B3 ;  ML      # ( 𝔚 → Ꮃ ) MATHEMATICAL FRAKTUR CAPITAL W → CHEROKEE LETTER LA        # →W→
+1D54E ;        13B3 ;  ML      # ( 𝕎 → Ꮃ ) MATHEMATICAL DOUBLE-STRUCK CAPITAL W → CHEROKEE LETTER LA  # →W→
+1D582 ;        13B3 ;  ML      # ( 𝖂 → Ꮃ ) MATHEMATICAL BOLD FRAKTUR CAPITAL W → CHEROKEE LETTER LA   # →W→
+1D5B6 ;        13B3 ;  ML      # ( 𝖶 → Ꮃ ) MATHEMATICAL SANS-SERIF CAPITAL W → CHEROKEE LETTER LA     # →W→
+1D5EA ;        13B3 ;  ML      # ( 𝗪 → Ꮃ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL W → CHEROKEE LETTER LA        # →W→
+1D61E ;        13B3 ;  ML      # ( 𝘞 → Ꮃ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL W → CHEROKEE LETTER LA      # →W→
+1D652 ;        13B3 ;  ML      # ( 𝙒 → Ꮃ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W → CHEROKEE LETTER LA # →W→
+1D686 ;        13B3 ;  ML      # ( 𝚆 → Ꮃ ) MATHEMATICAL MONOSPACE CAPITAL W → CHEROKEE LETTER LA      # →W→
+13D4 ; 13B3 ;  ML      # ( Ꮤ → Ꮃ ) CHEROKEE LETTER TA → CHEROKEE LETTER LA     # 
+A4EA ; 13B3 ;  ML      # ( ꓪ → Ꮃ ) LISU LETTER WA → CHEROKEE LETTER LA # →W→
+
+1D406 ;        13C0 ;  ML      # ( 𝐆 → Ꮐ ) MATHEMATICAL BOLD CAPITAL G → CHEROKEE LETTER NAH  # →G→
+1D43A ;        13C0 ;  ML      # ( 𝐺 → Ꮐ ) MATHEMATICAL ITALIC CAPITAL G → CHEROKEE LETTER NAH        # →G→
+1D46E ;        13C0 ;  ML      # ( 𝑮 → Ꮐ ) MATHEMATICAL BOLD ITALIC CAPITAL G → CHEROKEE LETTER NAH   # →G→
+1D4A2 ;        13C0 ;  ML      # ( 𝒢 → Ꮐ ) MATHEMATICAL SCRIPT CAPITAL G → CHEROKEE LETTER NAH        # →G→
+1D4D6 ;        13C0 ;  ML      # ( 𝓖 → Ꮐ ) MATHEMATICAL BOLD SCRIPT CAPITAL G → CHEROKEE LETTER NAH   # →G→
+1D50A ;        13C0 ;  ML      # ( 𝔊 → Ꮐ ) MATHEMATICAL FRAKTUR CAPITAL G → CHEROKEE LETTER NAH       # →G→
+1D53E ;        13C0 ;  ML      # ( 𝔾 → Ꮐ ) MATHEMATICAL DOUBLE-STRUCK CAPITAL G → CHEROKEE LETTER NAH # →G→
+1D572 ;        13C0 ;  ML      # ( 𝕲 → Ꮐ ) MATHEMATICAL BOLD FRAKTUR CAPITAL G → CHEROKEE LETTER NAH  # →G→
+1D5A6 ;        13C0 ;  ML      # ( 𝖦 → Ꮐ ) MATHEMATICAL SANS-SERIF CAPITAL G → CHEROKEE LETTER NAH    # →G→
+1D5DA ;        13C0 ;  ML      # ( 𝗚 → Ꮐ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL G → CHEROKEE LETTER NAH       # →G→
+1D60E ;        13C0 ;  ML      # ( 𝘎 → Ꮐ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL G → CHEROKEE LETTER NAH     # →G→
+1D642 ;        13C0 ;  ML      # ( 𝙂 → Ꮐ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G → CHEROKEE LETTER NAH        # →G→
+1D676 ;        13C0 ;  ML      # ( 𝙶 → Ꮐ ) MATHEMATICAL MONOSPACE CAPITAL G → CHEROKEE LETTER NAH     # →G→
+13F3 ; 13C0 ;  ML      # ( Ᏻ → Ꮐ ) CHEROKEE LETTER YU → CHEROKEE LETTER NAH    # 
+A4D6 ; 13C0 ;  ML      # ( ꓖ → Ꮐ ) LISU LETTER GA → CHEROKEE LETTER NAH        # →G→
+
+2124 ; 13C3 ;  ML      # ( ℤ → Ꮓ ) DOUBLE-STRUCK CAPITAL Z → CHEROKEE LETTER NO        # →Z→
+2128 ; 13C3 ;  ML      # ( ℨ → Ꮓ ) BLACK-LETTER CAPITAL Z → CHEROKEE LETTER NO # →Z→
+1D419 ;        13C3 ;  ML      # ( 𝐙 → Ꮓ ) MATHEMATICAL BOLD CAPITAL Z → CHEROKEE LETTER NO   # →Z→
+1D44D ;        13C3 ;  ML      # ( 𝑍 → Ꮓ ) MATHEMATICAL ITALIC CAPITAL Z → CHEROKEE LETTER NO # →Z→
+1D481 ;        13C3 ;  ML      # ( 𝒁 → Ꮓ ) MATHEMATICAL BOLD ITALIC CAPITAL Z → CHEROKEE LETTER NO    # →Z→
+1D4B5 ;        13C3 ;  ML      # ( 𝒵 → Ꮓ ) MATHEMATICAL SCRIPT CAPITAL Z → CHEROKEE LETTER NO # →Z→
+1D4E9 ;        13C3 ;  ML      # ( 𝓩 → Ꮓ ) MATHEMATICAL BOLD SCRIPT CAPITAL Z → CHEROKEE LETTER NO    # →Z→
+1D585 ;        13C3 ;  ML      # ( 𝖅 → Ꮓ ) MATHEMATICAL BOLD FRAKTUR CAPITAL Z → CHEROKEE LETTER NO   # →Z→
+1D5B9 ;        13C3 ;  ML      # ( 𝖹 → Ꮓ ) MATHEMATICAL SANS-SERIF CAPITAL Z → CHEROKEE LETTER NO     # →Z→
+1D5ED ;        13C3 ;  ML      # ( 𝗭 → Ꮓ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL Z → CHEROKEE LETTER NO        # →Z→
+1D621 ;        13C3 ;  ML      # ( 𝘡 → Ꮓ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z → CHEROKEE LETTER NO      # →Z→
+1D655 ;        13C3 ;  ML      # ( 𝙕 → Ꮓ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z → CHEROKEE LETTER NO # →Z→
+1D689 ;        13C3 ;  ML      # ( 𝚉 → Ꮓ ) MATHEMATICAL MONOSPACE CAPITAL Z → CHEROKEE LETTER NO      # →Z→
+1D6AD ;        13C3 ;  ML      # ( 𝚭 → Ꮓ ) MATHEMATICAL BOLD CAPITAL ZETA → CHEROKEE LETTER NO        # →Ζ→
+1D6E7 ;        13C3 ;  ML      # ( 𝛧 → Ꮓ ) MATHEMATICAL ITALIC CAPITAL ZETA → CHEROKEE LETTER NO      # →Ζ→
+1D721 ;        13C3 ;  ML      # ( 𝜡 → Ꮓ ) MATHEMATICAL BOLD ITALIC CAPITAL ZETA → CHEROKEE LETTER NO # →Ζ→
+1D75B ;        13C3 ;  ML      # ( 𝝛 → Ꮓ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA → CHEROKEE LETTER NO     # →Ζ→
+1D795 ;        13C3 ;  ML      # ( 𝞕 → Ꮓ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA → CHEROKEE LETTER NO      # →Ζ→
+A4DC ; 13C3 ;  ML      # ( ꓜ → Ꮓ ) LISU LETTER DZA → CHEROKEE LETTER NO        # →Z→
+
+1D412 ;        13D5 ;  ML      # ( 𝐒 → Ꮥ ) MATHEMATICAL BOLD CAPITAL S → CHEROKEE LETTER DE   # →S→→Ꮪ→
+1D446 ;        13D5 ;  ML      # ( 𝑆 → Ꮥ ) MATHEMATICAL ITALIC CAPITAL S → CHEROKEE LETTER DE # →S→→Ꮪ→
+1D47A ;        13D5 ;  ML      # ( 𝑺 → Ꮥ ) MATHEMATICAL BOLD ITALIC CAPITAL S → CHEROKEE LETTER DE    # →S→→Ꮪ→
+1D4AE ;        13D5 ;  ML      # ( 𝒮 → Ꮥ ) MATHEMATICAL SCRIPT CAPITAL S → CHEROKEE LETTER DE # →S→→Ꮪ→
+1D4E2 ;        13D5 ;  ML      # ( 𝓢 → Ꮥ ) MATHEMATICAL BOLD SCRIPT CAPITAL S → CHEROKEE LETTER DE    # →S→→Ꮪ→
+1D516 ;        13D5 ;  ML      # ( 𝔖 → Ꮥ ) MATHEMATICAL FRAKTUR CAPITAL S → CHEROKEE LETTER DE        # →S→→Ꮪ→
+1D54A ;        13D5 ;  ML      # ( 𝕊 → Ꮥ ) MATHEMATICAL DOUBLE-STRUCK CAPITAL S → CHEROKEE LETTER DE  # →S→→Ꮪ→
+1D57E ;        13D5 ;  ML      # ( 𝕾 → Ꮥ ) MATHEMATICAL BOLD FRAKTUR CAPITAL S → CHEROKEE LETTER DE   # →S→→Ꮪ→
+1D5B2 ;        13D5 ;  ML      # ( 𝖲 → Ꮥ ) MATHEMATICAL SANS-SERIF CAPITAL S → CHEROKEE LETTER DE     # →S→→Ꮪ→
+1D5E6 ;        13D5 ;  ML      # ( 𝗦 → Ꮥ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL S → CHEROKEE LETTER DE        # →S→→Ꮪ→
+1D61A ;        13D5 ;  ML      # ( 𝘚 → Ꮥ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL S → CHEROKEE LETTER DE      # →S→→Ꮪ→
+1D64E ;        13D5 ;  ML      # ( 𝙎 → Ꮥ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S → CHEROKEE LETTER DE # →S→→Ꮪ→
+1D682 ;        13D5 ;  ML      # ( 𝚂 → Ꮥ ) MATHEMATICAL MONOSPACE CAPITAL S → CHEROKEE LETTER DE      # →S→→Ꮪ→
+13DA ; 13D5 ;  ML      # ( Ꮪ → Ꮥ ) CHEROKEE LETTER DU → CHEROKEE LETTER DE     # 
+A4E2 ; 13D5 ;  ML      # ( ꓢ → Ꮥ ) LISU LETTER SA → CHEROKEE LETTER DE # →S→→Ꮪ→
+
+1D40A ;        13E6 ;  ML      # ( 𝐊 → Ꮶ ) MATHEMATICAL BOLD CAPITAL K → CHEROKEE LETTER TSO  # →K→
+1D43E ;        13E6 ;  ML      # ( 𝐾 → Ꮶ ) MATHEMATICAL ITALIC CAPITAL K → CHEROKEE LETTER TSO        # →K→
+1D472 ;        13E6 ;  ML      # ( 𝑲 → Ꮶ ) MATHEMATICAL BOLD ITALIC CAPITAL K → CHEROKEE LETTER TSO   # →K→
+1D4A6 ;        13E6 ;  ML      # ( 𝒦 → Ꮶ ) MATHEMATICAL SCRIPT CAPITAL K → CHEROKEE LETTER TSO        # →K→
+1D4DA ;        13E6 ;  ML      # ( 𝓚 → Ꮶ ) MATHEMATICAL BOLD SCRIPT CAPITAL K → CHEROKEE LETTER TSO   # →K→
+1D50E ;        13E6 ;  ML      # ( 𝔎 → Ꮶ ) MATHEMATICAL FRAKTUR CAPITAL K → CHEROKEE LETTER TSO       # →K→
+1D542 ;        13E6 ;  ML      # ( 𝕂 → Ꮶ ) MATHEMATICAL DOUBLE-STRUCK CAPITAL K → CHEROKEE LETTER TSO # →K→
+1D576 ;        13E6 ;  ML      # ( 𝕶 → Ꮶ ) MATHEMATICAL BOLD FRAKTUR CAPITAL K → CHEROKEE LETTER TSO  # →K→
+1D5AA ;        13E6 ;  ML      # ( 𝖪 → Ꮶ ) MATHEMATICAL SANS-SERIF CAPITAL K → CHEROKEE LETTER TSO    # →K→
+1D5DE ;        13E6 ;  ML      # ( 𝗞 → Ꮶ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL K → CHEROKEE LETTER TSO       # →K→
+1D612 ;        13E6 ;  ML      # ( 𝘒 → Ꮶ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL K → CHEROKEE LETTER TSO     # →K→
+1D646 ;        13E6 ;  ML      # ( 𝙆 → Ꮶ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K → CHEROKEE LETTER TSO        # →K→
+1D67A ;        13E6 ;  ML      # ( 𝙺 → Ꮶ ) MATHEMATICAL MONOSPACE CAPITAL K → CHEROKEE LETTER TSO     # →K→
+1D6B1 ;        13E6 ;  ML      # ( 𝚱 → Ꮶ ) MATHEMATICAL BOLD CAPITAL KAPPA → CHEROKEE LETTER TSO      # →Κ→→K→
+1D6EB ;        13E6 ;  ML      # ( 𝛫 → Ꮶ ) MATHEMATICAL ITALIC CAPITAL KAPPA → CHEROKEE LETTER TSO    # →Κ→→K→
+1D725 ;        13E6 ;  ML      # ( 𝜥 → Ꮶ ) MATHEMATICAL BOLD ITALIC CAPITAL KAPPA → CHEROKEE LETTER TSO       # →Κ→→K→
+1D75F ;        13E6 ;  ML      # ( 𝝟 → Ꮶ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA → CHEROKEE LETTER TSO   # →Κ→→K→
+1D799 ;        13E6 ;  ML      # ( 𝞙 → Ꮶ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA → CHEROKEE LETTER TSO    # →Κ→→K→
+A4D7 ; 13E6 ;  ML      # ( ꓗ → Ꮶ ) LISU LETTER KA → CHEROKEE LETTER TSO        # →K→
+
+140D ; 1401 00B7 ;     ML      # ( ᐍ → ᐁ· ) CANADIAN SYLLABICS WEST-CREE WE → CANADIAN SYLLABICS E, MIDDLE DOT        # →ᐁᐧ→
+
+2206 ; 1403 ;  ML      #* ( ∆ → ᐃ ) INCREMENT → CANADIAN SYLLABICS I   # →Δ→
+1D6AB ;        1403 ;  ML      # ( 𝚫 → ᐃ ) MATHEMATICAL BOLD CAPITAL DELTA → CANADIAN SYLLABICS I     # →Δ→
+1D6E5 ;        1403 ;  ML      # ( 𝛥 → ᐃ ) MATHEMATICAL ITALIC CAPITAL DELTA → CANADIAN SYLLABICS I   # →Δ→
+1D71F ;        1403 ;  ML      # ( 𝜟 → ᐃ ) MATHEMATICAL BOLD ITALIC CAPITAL DELTA → CANADIAN SYLLABICS I      # →Δ→
+1D759 ;        1403 ;  ML      # ( 𝝙 → ᐃ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA → CANADIAN SYLLABICS I  # →Δ→
+1D793 ;        1403 ;  ML      # ( 𝞓 → ᐃ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA → CANADIAN SYLLABICS I   # →Δ→
+2D60 ; 1403 ;  ML      # ( ⵠ → ᐃ ) TIFINAGH LETTER YAV → CANADIAN SYLLABICS I  # 
+
+140F ; 1403 00B7 ;     ML      # ( ᐏ → ᐃ· ) CANADIAN SYLLABICS WEST-CREE WI → CANADIAN SYLLABICS I, MIDDLE DOT        # →ᐃᐧ→
+
+1411 ; 1404 00B7 ;     ML      # ( ᐑ → ᐄ· ) CANADIAN SYLLABICS WEST-CREE WII → CANADIAN SYLLABICS II, MIDDLE DOT      # →ᐄᐧ→
+
+1413 ; 1405 00B7 ;     ML      # ( ᐓ → ᐅ· ) CANADIAN SYLLABICS WEST-CREE WO → CANADIAN SYLLABICS O, MIDDLE DOT        # →ᐅᐧ→
+
+1415 ; 1406 00B7 ;     ML      # ( ᐕ → ᐆ· ) CANADIAN SYLLABICS WEST-CREE WOO → CANADIAN SYLLABICS OO, MIDDLE DOT      # →ᐆᐧ→
+
+1418 ; 140A 00B7 ;     ML      # ( ᐘ → ᐊ· ) CANADIAN SYLLABICS WEST-CREE WA → CANADIAN SYLLABICS A, MIDDLE DOT        # →ᐊᐧ→
+
+141A ; 140B 00B7 ;     ML      # ( ᐚ → ᐋ· ) CANADIAN SYLLABICS WEST-CREE WAA → CANADIAN SYLLABICS AA, MIDDLE DOT      # →ᐋᐧ→
+
+14D1 ; 1421 ;  ML      # ( ᓑ → ᐡ ) CANADIAN SYLLABICS CARRIER NG → CANADIAN SYLLABICS FINAL BOTTOM HALF RING   # 
+
+1476 ; 1427 146D ;     ML      # ( ᑶ → ᐧᑭ ) CANADIAN SYLLABICS KWI → CANADIAN SYLLABICS FINAL MIDDLE DOT, CANADIAN SYLLABICS KI      # 
+
+1498 ; 1427 148D ;     ML      # ( ᒘ → ᐧᒍ ) CANADIAN SYLLABICS CWO → CANADIAN SYLLABICS FINAL MIDDLE DOT, CANADIAN SYLLABICS CO      # 
+
+1540 ; 1429 ;  ML      # ( ᕀ → ᐩ ) CANADIAN SYLLABICS WEST-CREE Y → CANADIAN SYLLABICS FINAL PLUS      # 
+
+1D415 ;        142F ;  ML      # ( 𝐕 → ᐯ ) MATHEMATICAL BOLD CAPITAL V → CANADIAN SYLLABICS PE        # →V→
+1D449 ;        142F ;  ML      # ( 𝑉 → ᐯ ) MATHEMATICAL ITALIC CAPITAL V → CANADIAN SYLLABICS PE      # →V→
+1D47D ;        142F ;  ML      # ( 𝑽 → ᐯ ) MATHEMATICAL BOLD ITALIC CAPITAL V → CANADIAN SYLLABICS PE # →V→
+1D4B1 ;        142F ;  ML      # ( 𝒱 → ᐯ ) MATHEMATICAL SCRIPT CAPITAL V → CANADIAN SYLLABICS PE      # →V→
+1D4E5 ;        142F ;  ML      # ( 𝓥 → ᐯ ) MATHEMATICAL BOLD SCRIPT CAPITAL V → CANADIAN SYLLABICS PE # →V→
+1D519 ;        142F ;  ML      # ( 𝔙 → ᐯ ) MATHEMATICAL FRAKTUR CAPITAL V → CANADIAN SYLLABICS PE     # →V→
+1D54D ;        142F ;  ML      # ( 𝕍 → ᐯ ) MATHEMATICAL DOUBLE-STRUCK CAPITAL V → CANADIAN SYLLABICS PE       # →V→
+1D581 ;        142F ;  ML      # ( 𝖁 → ᐯ ) MATHEMATICAL BOLD FRAKTUR CAPITAL V → CANADIAN SYLLABICS PE        # →V→
+1D5B5 ;        142F ;  ML      # ( 𝖵 → ᐯ ) MATHEMATICAL SANS-SERIF CAPITAL V → CANADIAN SYLLABICS PE  # →V→
+1D5E9 ;        142F ;  ML      # ( 𝗩 → ᐯ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL V → CANADIAN SYLLABICS PE     # →V→
+1D61D ;        142F ;  ML      # ( 𝘝 → ᐯ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL V → CANADIAN SYLLABICS PE   # →V→
+1D651 ;        142F ;  ML      # ( 𝙑 → ᐯ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V → CANADIAN SYLLABICS PE      # →V→
+1D685 ;        142F ;  ML      # ( 𝚅 → ᐯ ) MATHEMATICAL MONOSPACE CAPITAL V → CANADIAN SYLLABICS PE   # →V→
+2D38 ; 142F ;  ML      # ( ⴸ → ᐯ ) TIFINAGH LETTER YADH → CANADIAN SYLLABICS PE        # 
+13D9 ; 142F ;  ML      # ( Ꮩ → ᐯ ) CHEROKEE LETTER DO → CANADIAN SYLLABICS PE  # →V→
+A4E6 ; 142F ;  ML      # ( ꓦ → ᐯ ) LISU LETTER HA → CANADIAN SYLLABICS PE      # →V→
+
+1D6B2 ;        1431 ;  ML      # ( 𝚲 → ᐱ ) MATHEMATICAL BOLD CAPITAL LAMDA → CANADIAN SYLLABICS PI    # →Λ→
+1D6EC ;        1431 ;  ML      # ( 𝛬 → ᐱ ) MATHEMATICAL ITALIC CAPITAL LAMDA → CANADIAN SYLLABICS PI  # →Λ→
+1D726 ;        1431 ;  ML      # ( 𝜦 → ᐱ ) MATHEMATICAL BOLD ITALIC CAPITAL LAMDA → CANADIAN SYLLABICS PI     # →Λ→
+1D760 ;        1431 ;  ML      # ( 𝝠 → ᐱ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA → CANADIAN SYLLABICS PI # →Λ→
+1D79A ;        1431 ;  ML      # ( 𝞚 → ᐱ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA → CANADIAN SYLLABICS PI  # →Λ→
+2D37 ; 1431 ;  ML      # ( ⴷ → ᐱ ) TIFINAGH LETTER YAD → CANADIAN SYLLABICS PI # 
+A4E5 ; 1431 ;  ML      # ( ꓥ → ᐱ ) LISU LETTER NGA → CANADIAN SYLLABICS PI     # →Ʌ→
+
+1441 ; 1433 00B7 ;     ML      # ( ᑁ → ᐳ· ) CANADIAN SYLLABICS WEST-CREE PWO → CANADIAN SYLLABICS PO, MIDDLE DOT      # →ᐳᐧ→
+
+1443 ; 1434 00B7 ;     ML      # ( ᑃ → ᐴ· ) CANADIAN SYLLABICS WEST-CREE PWOO → CANADIAN SYLLABICS POO, MIDDLE DOT    # →ᐴᐧ→
+
+1445 ; 1438 00B7 ;     ML      # ( ᑅ → ᐸ· ) CANADIAN SYLLABICS WEST-CREE PWA → CANADIAN SYLLABICS PA, MIDDLE DOT      # →ᐸᐧ→
+
+1447 ; 1439 00B7 ;     ML      # ( ᑇ → ᐹ· ) CANADIAN SYLLABICS WEST-CREE PWAA → CANADIAN SYLLABICS PAA, MIDDLE DOT    # →ᐹᐧ→
+
+02C8 ; 144A ;  ML      # ( ˈ → ᑊ ) MODIFIER LETTER VERTICAL LINE → CANADIAN SYLLABICS WEST-CREE P       # 
+
+1D414 ;        144C ;  ML      # ( 𝐔 → ᑌ ) MATHEMATICAL BOLD CAPITAL U → CANADIAN SYLLABICS TE        # →U→
+1D448 ;        144C ;  ML      # ( 𝑈 → ᑌ ) MATHEMATICAL ITALIC CAPITAL U → CANADIAN SYLLABICS TE      # →U→
+1D47C ;        144C ;  ML      # ( 𝑼 → ᑌ ) MATHEMATICAL BOLD ITALIC CAPITAL U → CANADIAN SYLLABICS TE # →U→
+1D4B0 ;        144C ;  ML      # ( 𝒰 → ᑌ ) MATHEMATICAL SCRIPT CAPITAL U → CANADIAN SYLLABICS TE      # →U→
+1D4E4 ;        144C ;  ML      # ( 𝓤 → ᑌ ) MATHEMATICAL BOLD SCRIPT CAPITAL U → CANADIAN SYLLABICS TE # →U→
+1D518 ;        144C ;  ML      # ( 𝔘 → ᑌ ) MATHEMATICAL FRAKTUR CAPITAL U → CANADIAN SYLLABICS TE     # →U→
+1D54C ;        144C ;  ML      # ( 𝕌 → ᑌ ) MATHEMATICAL DOUBLE-STRUCK CAPITAL U → CANADIAN SYLLABICS TE       # →U→
+1D580 ;        144C ;  ML      # ( 𝖀 → ᑌ ) MATHEMATICAL BOLD FRAKTUR CAPITAL U → CANADIAN SYLLABICS TE        # →U→
+1D5B4 ;        144C ;  ML      # ( 𝖴 → ᑌ ) MATHEMATICAL SANS-SERIF CAPITAL U → CANADIAN SYLLABICS TE  # →U→
+1D5E8 ;        144C ;  ML      # ( 𝗨 → ᑌ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL U → CANADIAN SYLLABICS TE     # →U→
+1D61C ;        144C ;  ML      # ( 𝘜 → ᑌ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL U → CANADIAN SYLLABICS TE   # →U→
+1D650 ;        144C ;  ML      # ( 𝙐 → ᑌ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U → CANADIAN SYLLABICS TE      # →U→
+1D684 ;        144C ;  ML      # ( 𝚄 → ᑌ ) MATHEMATICAL MONOSPACE CAPITAL U → CANADIAN SYLLABICS TE   # →U→
+A4F4 ; 144C ;  ML      # ( ꓴ → ᑌ ) LISU LETTER U → CANADIAN SYLLABICS TE       # →U→
+
+1458 ; 144C 00B7 ;     ML      # ( ᑘ → ᑌ· ) CANADIAN SYLLABICS WEST-CREE TWE → CANADIAN SYLLABICS TE, MIDDLE DOT      # →ᑌᐧ→
+
+1467 ; 144C 144A ;     ML      # ( ᑧ → ᑌᑊ ) CANADIAN SYLLABICS TTE → CANADIAN SYLLABICS TE, CANADIAN SYLLABICS WEST-CREE P   # 
+
+145A ; 144E 00B7 ;     ML      # ( ᑚ → ᑎ· ) CANADIAN SYLLABICS WEST-CREE TWI → CANADIAN SYLLABICS TI, MIDDLE DOT      # →ᑎᐧ→
+
+1468 ; 144E 144A ;     ML      # ( ᑨ → ᑎᑊ ) CANADIAN SYLLABICS TTI → CANADIAN SYLLABICS TI, CANADIAN SYLLABICS WEST-CREE P   # 
+
+145C ; 144F 00B7 ;     ML      # ( ᑜ → ᑏ· ) CANADIAN SYLLABICS WEST-CREE TWII → CANADIAN SYLLABICS TII, MIDDLE DOT    # →ᑏᐧ→
+
+145E ; 1450 00B7 ;     ML      # ( ᑞ → ᑐ· ) CANADIAN SYLLABICS WEST-CREE TWO → CANADIAN SYLLABICS TO, MIDDLE DOT      # →ᑐᐧ→
+
+1469 ; 1450 144A ;     ML      # ( ᑩ → ᑐᑊ ) CANADIAN SYLLABICS TTO → CANADIAN SYLLABICS TO, CANADIAN SYLLABICS WEST-CREE P   # 
+
+1460 ; 1451 00B7 ;     ML      # ( ᑠ → ᑑ· ) CANADIAN SYLLABICS WEST-CREE TWOO → CANADIAN SYLLABICS TOO, MIDDLE DOT    # →ᑑᐧ→
+
+1462 ; 1455 00B7 ;     ML      # ( ᑢ → ᑕ· ) CANADIAN SYLLABICS WEST-CREE TWA → CANADIAN SYLLABICS TA, MIDDLE DOT      # →ᑕᐧ→
+
+146A ; 1455 144A ;     ML      # ( ᑪ → ᑕᑊ ) CANADIAN SYLLABICS TTA → CANADIAN SYLLABICS TA, CANADIAN SYLLABICS WEST-CREE P   # 
+
+1464 ; 1456 00B7 ;     ML      # ( ᑤ → ᑖ· ) CANADIAN SYLLABICS WEST-CREE TWAA → CANADIAN SYLLABICS TAA, MIDDLE DOT    # →ᑖᐧ→
+
+1475 ; 146B 00B7 ;     ML      # ( ᑵ → ᑫ· ) CANADIAN SYLLABICS WEST-CREE KWE → CANADIAN SYLLABICS KE, MIDDLE DOT      # →ᑫᐧ→
+
+1485 ; 146B 144A ;     ML      # ( ᒅ → ᑫᑊ ) CANADIAN SYLLABICS SOUTH-SLAVEY KEH → CANADIAN SYLLABICS KE, CANADIAN SYLLABICS WEST-CREE P      # 
+
+2119 ; 146D ;  ML      # ( ℙ → ᑭ ) DOUBLE-STRUCK CAPITAL P → CANADIAN SYLLABICS KI     # →P→
+1D40F ;        146D ;  ML      # ( 𝐏 → ᑭ ) MATHEMATICAL BOLD CAPITAL P → CANADIAN SYLLABICS KI        # →P→
+1D443 ;        146D ;  ML      # ( 𝑃 → ᑭ ) MATHEMATICAL ITALIC CAPITAL P → CANADIAN SYLLABICS KI      # →P→
+1D477 ;        146D ;  ML      # ( 𝑷 → ᑭ ) MATHEMATICAL BOLD ITALIC CAPITAL P → CANADIAN SYLLABICS KI # →P→
+1D4AB ;        146D ;  ML      # ( 𝒫 → ᑭ ) MATHEMATICAL SCRIPT CAPITAL P → CANADIAN SYLLABICS KI      # →P→
+1D4DF ;        146D ;  ML      # ( 𝓟 → ᑭ ) MATHEMATICAL BOLD SCRIPT CAPITAL P → CANADIAN SYLLABICS KI # →P→
+1D513 ;        146D ;  ML      # ( 𝔓 → ᑭ ) MATHEMATICAL FRAKTUR CAPITAL P → CANADIAN SYLLABICS KI     # →P→
+1D57B ;        146D ;  ML      # ( 𝕻 → ᑭ ) MATHEMATICAL BOLD FRAKTUR CAPITAL P → CANADIAN SYLLABICS KI        # →P→
+1D5AF ;        146D ;  ML      # ( 𝖯 → ᑭ ) MATHEMATICAL SANS-SERIF CAPITAL P → CANADIAN SYLLABICS KI  # →P→
+1D5E3 ;        146D ;  ML      # ( 𝗣 → ᑭ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL P → CANADIAN SYLLABICS KI     # →P→
+1D617 ;        146D ;  ML      # ( 𝘗 → ᑭ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL P → CANADIAN SYLLABICS KI   # →P→
+1D64B ;        146D ;  ML      # ( 𝙋 → ᑭ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P → CANADIAN SYLLABICS KI      # →P→
+1D67F ;        146D ;  ML      # ( 𝙿 → ᑭ ) MATHEMATICAL MONOSPACE CAPITAL P → CANADIAN SYLLABICS KI   # →P→
+1D6B8 ;        146D ;  ML      # ( 𝚸 → ᑭ ) MATHEMATICAL BOLD CAPITAL RHO → CANADIAN SYLLABICS KI      # →𝐏→→P→
+1D6F2 ;        146D ;  ML      # ( 𝛲 → ᑭ ) MATHEMATICAL ITALIC CAPITAL RHO → CANADIAN SYLLABICS KI    # →𝑃→→P→
+1D72C ;        146D ;  ML      # ( 𝜬 → ᑭ ) MATHEMATICAL BOLD ITALIC CAPITAL RHO → CANADIAN SYLLABICS KI       # →𝑷→→P→
+1D766 ;        146D ;  ML      # ( 𝝦 → ᑭ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO → CANADIAN SYLLABICS KI   # →Ρ→→P→
+1D7A0 ;        146D ;  ML      # ( 𝞠 → ᑭ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO → CANADIAN SYLLABICS KI    # →Ρ→→P→
+13E2 ; 146D ;  ML      # ( Ꮲ → ᑭ ) CHEROKEE LETTER TLV → CANADIAN SYLLABICS KI # →P→
+A4D1 ; 146D ;  ML      # ( ꓑ → ᑭ ) LISU LETTER PA → CANADIAN SYLLABICS KI      # →P→
+
+1486 ; 146D 144A ;     ML      # ( ᒆ → ᑭᑊ ) CANADIAN SYLLABICS SOUTH-SLAVEY KIH → CANADIAN SYLLABICS KI, CANADIAN SYLLABICS WEST-CREE P      # 
+
+1479 ; 146E 00B7 ;     ML      # ( ᑹ → ᑮ· ) CANADIAN SYLLABICS WEST-CREE KWII → CANADIAN SYLLABICS KII, MIDDLE DOT    # →ᑮᐧ→
+
+147D ; 1470 00B7 ;     ML      # ( ᑽ → ᑰ· ) CANADIAN SYLLABICS WEST-CREE KWOO → CANADIAN SYLLABICS KOO, MIDDLE DOT    # →ᑰᐧ→
+
+147F ; 1472 00B7 ;     ML      # ( ᑿ → ᑲ· ) CANADIAN SYLLABICS WEST-CREE KWA → CANADIAN SYLLABICS KA, MIDDLE DOT      # →ᑲᐧ→
+
+1488 ; 1472 144A ;     ML      # ( ᒈ → ᑲᑊ ) CANADIAN SYLLABICS SOUTH-SLAVEY KAH → CANADIAN SYLLABICS KA, CANADIAN SYLLABICS WEST-CREE P      # 
+
+1481 ; 1473 00B7 ;     ML      # ( ᒁ → ᑳ· ) CANADIAN SYLLABICS WEST-CREE KWAA → CANADIAN SYLLABICS KAA, MIDDLE DOT    # →ᑳᐧ→
+
+1603 ; 1489 ;  ML      # ( ᘃ → ᒉ ) CANADIAN SYLLABICS CARRIER NO → CANADIAN SYLLABICS CE       # 
+
+1493 ; 1489 00B7 ;     ML      # ( ᒓ → ᒉ· ) CANADIAN SYLLABICS WEST-CREE CWE → CANADIAN SYLLABICS CE, MIDDLE DOT      # →ᒉᐧ→
+
+1495 ; 148B 00B7 ;     ML      # ( ᒕ → ᒋ· ) CANADIAN SYLLABICS WEST-CREE CWI → CANADIAN SYLLABICS CI, MIDDLE DOT      # →ᒋᐧ→
+
+1497 ; 148C 00B7 ;     ML      # ( ᒗ → ᒌ· ) CANADIAN SYLLABICS WEST-CREE CWII → CANADIAN SYLLABICS CII, MIDDLE DOT    # →ᒌᐧ→
+
+1D409 ;        148D ;  ML      # ( 𝐉 → ᒍ ) MATHEMATICAL BOLD CAPITAL J → CANADIAN SYLLABICS CO        # →J→
+1D43D ;        148D ;  ML      # ( 𝐽 → ᒍ ) MATHEMATICAL ITALIC CAPITAL J → CANADIAN SYLLABICS CO      # →J→
+1D471 ;        148D ;  ML      # ( 𝑱 → ᒍ ) MATHEMATICAL BOLD ITALIC CAPITAL J → CANADIAN SYLLABICS CO # →J→
+1D4A5 ;        148D ;  ML      # ( 𝒥 → ᒍ ) MATHEMATICAL SCRIPT CAPITAL J → CANADIAN SYLLABICS CO      # →J→
+1D4D9 ;        148D ;  ML      # ( 𝓙 → ᒍ ) MATHEMATICAL BOLD SCRIPT CAPITAL J → CANADIAN SYLLABICS CO # →J→
+1D50D ;        148D ;  ML      # ( 𝔍 → ᒍ ) MATHEMATICAL FRAKTUR CAPITAL J → CANADIAN SYLLABICS CO     # →J→
+1D541 ;        148D ;  ML      # ( 𝕁 → ᒍ ) MATHEMATICAL DOUBLE-STRUCK CAPITAL J → CANADIAN SYLLABICS CO       # →J→
+1D575 ;        148D ;  ML      # ( 𝕵 → ᒍ ) MATHEMATICAL BOLD FRAKTUR CAPITAL J → CANADIAN SYLLABICS CO        # →J→
+1D5A9 ;        148D ;  ML      # ( 𝖩 → ᒍ ) MATHEMATICAL SANS-SERIF CAPITAL J → CANADIAN SYLLABICS CO  # →J→
+1D5DD ;        148D ;  ML      # ( 𝗝 → ᒍ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL J → CANADIAN SYLLABICS CO     # →J→
+1D611 ;        148D ;  ML      # ( 𝘑 → ᒍ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL J → CANADIAN SYLLABICS CO   # →J→
+1D645 ;        148D ;  ML      # ( 𝙅 → ᒍ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J → CANADIAN SYLLABICS CO      # →J→
+1D679 ;        148D ;  ML      # ( 𝙹 → ᒍ ) MATHEMATICAL MONOSPACE CAPITAL J → CANADIAN SYLLABICS CO   # →J→
+13AB ; 148D ;  ML      # ( Ꭻ → ᒍ ) CHEROKEE LETTER GU → CANADIAN SYLLABICS CO  # →J→
+13E7 ; 148D ;  ML      # ( Ꮷ → ᒍ ) CHEROKEE LETTER TSU → CANADIAN SYLLABICS CO # →J→
+A4D9 ; 148D ;  ML      # ( ꓙ → ᒍ ) LISU LETTER JA → CANADIAN SYLLABICS CO      # →J→
+
+1499 ; 148D 1427 ;     ML      # ( ᒙ → ᒍᐧ ) CANADIAN SYLLABICS WEST-CREE CWO → CANADIAN SYLLABICS CO, CANADIAN SYLLABICS FINAL MIDDLE DOT    # 
+
+149B ; 148E 00B7 ;     ML      # ( ᒛ → ᒎ· ) CANADIAN SYLLABICS WEST-CREE CWOO → CANADIAN SYLLABICS COO, MIDDLE DOT    # →ᒎᐧ→
+
+1602 ; 1490 ;  ML      # ( ᘂ → ᒐ ) CANADIAN SYLLABICS CARRIER NU → CANADIAN SYLLABICS CA       # 
+
+149D ; 1490 00B7 ;     ML      # ( ᒝ → ᒐ· ) CANADIAN SYLLABICS WEST-CREE CWA → CANADIAN SYLLABICS CA, MIDDLE DOT      # →ᒐᐧ→
+
+149F ; 1491 00B7 ;     ML      # ( ᒟ → ᒑ· ) CANADIAN SYLLABICS WEST-CREE CWAA → CANADIAN SYLLABICS CAA, MIDDLE DOT    # →ᒑᐧ→
+
+14AD ; 14A3 00B7 ;     ML      # ( ᒭ → ᒣ· ) CANADIAN SYLLABICS WEST-CREE MWE → CANADIAN SYLLABICS ME, MIDDLE DOT      # →ᒣᐧ→
+
+213E ; 14A5 ;  ML      # ( ℾ → ᒥ ) DOUBLE-STRUCK CAPITAL GAMMA → CANADIAN SYLLABICS MI # →Γ→
+1D6AA ;        14A5 ;  ML      # ( 𝚪 → ᒥ ) MATHEMATICAL BOLD CAPITAL GAMMA → CANADIAN SYLLABICS MI    # →Γ→
+1D6E4 ;        14A5 ;  ML      # ( 𝛤 → ᒥ ) MATHEMATICAL ITALIC CAPITAL GAMMA → CANADIAN SYLLABICS MI  # →Γ→
+1D71E ;        14A5 ;  ML      # ( 𝜞 → ᒥ ) MATHEMATICAL BOLD ITALIC CAPITAL GAMMA → CANADIAN SYLLABICS MI     # →Γ→
+1D758 ;        14A5 ;  ML      # ( 𝝘 → ᒥ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA → CANADIAN SYLLABICS MI # →Γ→
+1D792 ;        14A5 ;  ML      # ( 𝞒 → ᒥ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA → CANADIAN SYLLABICS MI  # →Γ→
+13B1 ; 14A5 ;  ML      # ( Ꮁ → ᒥ ) CHEROKEE LETTER HU → CANADIAN SYLLABICS MI  # →Γ→
+
+14AF ; 14A5 00B7 ;     ML      # ( ᒯ → ᒥ· ) CANADIAN SYLLABICS WEST-CREE MWI → CANADIAN SYLLABICS MI, MIDDLE DOT      # →ᒥᐧ→
+
+14B1 ; 14A6 00B7 ;     ML      # ( ᒱ → ᒦ· ) CANADIAN SYLLABICS WEST-CREE MWII → CANADIAN SYLLABICS MII, MIDDLE DOT    # →ᒦᐧ→
+
+14B3 ; 14A7 00B7 ;     ML      # ( ᒳ → ᒧ· ) CANADIAN SYLLABICS WEST-CREE MWO → CANADIAN SYLLABICS MO, MIDDLE DOT      # →ᒧᐧ→
+
+14B5 ; 14A8 00B7 ;     ML      # ( ᒵ → ᒨ· ) CANADIAN SYLLABICS WEST-CREE MWOO → CANADIAN SYLLABICS MOO, MIDDLE DOT    # →ᒨᐧ→
+
+2112 ; 14AA ;  ML      # ( ℒ → ᒪ ) SCRIPT CAPITAL L → CANADIAN SYLLABICS MA    # →L→
+1D40B ;        14AA ;  ML      # ( 𝐋 → ᒪ ) MATHEMATICAL BOLD CAPITAL L → CANADIAN SYLLABICS MA        # →L→
+1D43F ;        14AA ;  ML      # ( 𝐿 → ᒪ ) MATHEMATICAL ITALIC CAPITAL L → CANADIAN SYLLABICS MA      # →L→
+1D473 ;        14AA ;  ML      # ( 𝑳 → ᒪ ) MATHEMATICAL BOLD ITALIC CAPITAL L → CANADIAN SYLLABICS MA # →L→
+1D4DB ;        14AA ;  ML      # ( 𝓛 → ᒪ ) MATHEMATICAL BOLD SCRIPT CAPITAL L → CANADIAN SYLLABICS MA # →L→
+1D50F ;        14AA ;  ML      # ( 𝔏 → ᒪ ) MATHEMATICAL FRAKTUR CAPITAL L → CANADIAN SYLLABICS MA     # →L→
+1D543 ;        14AA ;  ML      # ( 𝕃 → ᒪ ) MATHEMATICAL DOUBLE-STRUCK CAPITAL L → CANADIAN SYLLABICS MA       # →L→
+1D577 ;        14AA ;  ML      # ( 𝕷 → ᒪ ) MATHEMATICAL BOLD FRAKTUR CAPITAL L → CANADIAN SYLLABICS MA        # →L→
+1D5AB ;        14AA ;  ML      # ( 𝖫 → ᒪ ) MATHEMATICAL SANS-SERIF CAPITAL L → CANADIAN SYLLABICS MA  # →L→
+1D5DF ;        14AA ;  ML      # ( 𝗟 → ᒪ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL L → CANADIAN SYLLABICS MA     # →L→
+1D613 ;        14AA ;  ML      # ( 𝘓 → ᒪ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL L → CANADIAN SYLLABICS MA   # →L→
+1D647 ;        14AA ;  ML      # ( 𝙇 → ᒪ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L → CANADIAN SYLLABICS MA      # →L→
+1D67B ;        14AA ;  ML      # ( 𝙻 → ᒪ ) MATHEMATICAL MONOSPACE CAPITAL L → CANADIAN SYLLABICS MA   # →L→
+13DE ; 14AA ;  ML      # ( Ꮮ → ᒪ ) CHEROKEE LETTER TLE → CANADIAN SYLLABICS MA # →L→
+A4E1 ; 14AA ;  ML      # ( ꓡ → ᒪ ) LISU LETTER LA → CANADIAN SYLLABICS MA      # →L→
+
+14B9 ; 14AB 00B7 ;     ML      # ( ᒹ → ᒫ· ) CANADIAN SYLLABICS WEST-CREE MWAA → CANADIAN SYLLABICS MAA, MIDDLE DOT    # →ᒫᐧ→
+
+14CA ; 14C0 00B7 ;     ML      # ( ᓊ → ᓀ· ) CANADIAN SYLLABICS WEST-CREE NWE → CANADIAN SYLLABICS NE, MIDDLE DOT      # →ᓀᐧ→
+
+14CC ; 14C7 00B7 ;     ML      # ( ᓌ → ᓇ· ) CANADIAN SYLLABICS WEST-CREE NWA → CANADIAN SYLLABICS NA, MIDDLE DOT      # →ᓇᐧ→
+
+14CE ; 14C8 14AB ;     ML      # ( ᓎ → ᓈᒫ ) CANADIAN SYLLABICS WEST-CREE NWAA → CANADIAN SYLLABICS NAA, CANADIAN SYLLABICS MAA       # 
+
+1604 ; 14D3 ;  ML      # ( ᘄ → ᓓ ) CANADIAN SYLLABICS CARRIER NE → CANADIAN SYLLABICS LE       # 
+
+14DD ; 14D3 00B7 ;     ML      # ( ᓝ → ᓓ· ) CANADIAN SYLLABICS WEST-CREE LWE → CANADIAN SYLLABICS LE, MIDDLE DOT      # →ᓓᐧ→
+
+14DF ; 14D5 00B7 ;     ML      # ( ᓟ → ᓕ· ) CANADIAN SYLLABICS WEST-CREE LWI → CANADIAN SYLLABICS LI, MIDDLE DOT      # →ᓕᐧ→
+
+14E1 ; 14D6 00B7 ;     ML      # ( ᓡ → ᓖ· ) CANADIAN SYLLABICS WEST-CREE LWII → CANADIAN SYLLABICS LII, MIDDLE DOT    # →ᓖᐧ→
+
+14E3 ; 14D7 00B7 ;     ML      # ( ᓣ → ᓗ· ) CANADIAN SYLLABICS WEST-CREE LWO → CANADIAN SYLLABICS LO, MIDDLE DOT      # →ᓗᐧ→
+
+14E5 ; 14D8 00B7 ;     ML      # ( ᓥ → ᓘ· ) CANADIAN SYLLABICS WEST-CREE LWOO → CANADIAN SYLLABICS LOO, MIDDLE DOT    # →ᓘᐧ→
+
+1607 ; 14DA ;  ML      # ( ᘇ → ᓚ ) CANADIAN SYLLABICS CARRIER NA → CANADIAN SYLLABICS LA       # 
+
+14E7 ; 14DA 00B7 ;     ML      # ( ᓧ → ᓚ· ) CANADIAN SYLLABICS WEST-CREE LWA → CANADIAN SYLLABICS LA, MIDDLE DOT      # →ᓚᐧ→
+
+14E9 ; 14DB 00B7 ;     ML      # ( ᓩ → ᓛ· ) CANADIAN SYLLABICS WEST-CREE LWAA → CANADIAN SYLLABICS LAA, MIDDLE DOT    # →ᓛᐧ→
+
+14F7 ; 14ED 00B7 ;     ML      # ( ᓷ → ᓭ· ) CANADIAN SYLLABICS WEST-CREE SWE → CANADIAN SYLLABICS SE, MIDDLE DOT      # →ᓭᐧ→
+
+14F9 ; 14EF 00B7 ;     ML      # ( ᓹ → ᓯ· ) CANADIAN SYLLABICS WEST-CREE SWI → CANADIAN SYLLABICS SI, MIDDLE DOT      # →ᓯᐧ→
+
+14FB ; 14F0 00B7 ;     ML      # ( ᓻ → ᓰ· ) CANADIAN SYLLABICS WEST-CREE SWII → CANADIAN SYLLABICS SII, MIDDLE DOT    # →ᓰᐧ→
+
+14FD ; 14F1 00B7 ;     ML      # ( ᓽ → ᓱ· ) CANADIAN SYLLABICS WEST-CREE SWO → CANADIAN SYLLABICS SO, MIDDLE DOT      # →ᓱᐧ→
+
+14FF ; 14F2 00B7 ;     ML      # ( ᓿ → ᓲ· ) CANADIAN SYLLABICS WEST-CREE SWOO → CANADIAN SYLLABICS SOO, MIDDLE DOT    # →ᓲᐧ→
+
+1501 ; 14F4 00B7 ;     ML      # ( ᔁ → ᓴ· ) CANADIAN SYLLABICS WEST-CREE SWA → CANADIAN SYLLABICS SA, MIDDLE DOT      # →ᓴᐧ→
+
+1503 ; 14F5 00B7 ;     ML      # ( ᔃ → ᓵ· ) CANADIAN SYLLABICS WEST-CREE SWAA → CANADIAN SYLLABICS SAA, MIDDLE DOT    # →ᓵᐧ→
+
+150C ; 150B 1438 ;     ML      # ( ᔌ → ᔋᐸ ) CANADIAN SYLLABICS NASKAPI SPWA → CANADIAN SYLLABICS NASKAPI S-W, CANADIAN SYLLABICS PA  # 
+
+150D ; 150B 1455 ;     ML      # ( ᔍ → ᔋᑕ ) CANADIAN SYLLABICS NASKAPI STWA → CANADIAN SYLLABICS NASKAPI S-W, CANADIAN SYLLABICS TA  # 
+
+150E ; 150B 1472 ;     ML      # ( ᔎ → ᔋᑲ ) CANADIAN SYLLABICS NASKAPI SKWA → CANADIAN SYLLABICS NASKAPI S-W, CANADIAN SYLLABICS KA  # 
+
+150F ; 150B 1490 ;     ML      # ( ᔏ → ᔋᒐ ) CANADIAN SYLLABICS NASKAPI SCWA → CANADIAN SYLLABICS NASKAPI S-W, CANADIAN SYLLABICS CA  # 
+
+1518 ; 1510 00B7 ;     ML      # ( ᔘ → ᔐ· ) CANADIAN SYLLABICS WEST-CREE SHWE → CANADIAN SYLLABICS SHE, MIDDLE DOT    # →ᔐᐧ→
+
+151A ; 1511 00B7 ;     ML      # ( ᔚ → ᔑ· ) CANADIAN SYLLABICS WEST-CREE SHWI → CANADIAN SYLLABICS SHI, MIDDLE DOT    # →ᔑᐧ→
+
+151C ; 1512 00B7 ;     ML      # ( ᔜ → ᔒ· ) CANADIAN SYLLABICS WEST-CREE SHWII → CANADIAN SYLLABICS SHII, MIDDLE DOT  # →ᔒᐧ→
+
+151E ; 1513 00B7 ;     ML      # ( ᔞ → ᔓ· ) CANADIAN SYLLABICS WEST-CREE SHWO → CANADIAN SYLLABICS SHO, MIDDLE DOT    # →ᔓᐧ→
+
+1520 ; 1514 00B7 ;     ML      # ( ᔠ → ᔔ· ) CANADIAN SYLLABICS WEST-CREE SHWOO → CANADIAN SYLLABICS SHOO, MIDDLE DOT  # →ᔔᐧ→
+
+1522 ; 1515 00B7 ;     ML      # ( ᔢ → ᔕ· ) CANADIAN SYLLABICS WEST-CREE SHWA → CANADIAN SYLLABICS SHA, MIDDLE DOT    # →ᔕᐧ→
+
+1524 ; 1516 00B7 ;     ML      # ( ᔤ → ᔖ· ) CANADIAN SYLLABICS WEST-CREE SHWAA → CANADIAN SYLLABICS SHAA, MIDDLE DOT  # →ᔖᐧ→
+
+1532 ; 1528 00B7 ;     ML      # ( ᔲ → ᔨ· ) CANADIAN SYLLABICS WEST-CREE YWI → CANADIAN SYLLABICS YI, MIDDLE DOT      # →ᔨᐧ→
+
+1534 ; 1529 00B7 ;     ML      # ( ᔴ → ᔩ· ) CANADIAN SYLLABICS WEST-CREE YWII → CANADIAN SYLLABICS YII, MIDDLE DOT    # →ᔩᐧ→
+
+1536 ; 152A 00B7 ;     ML      # ( ᔶ → ᔪ· ) CANADIAN SYLLABICS WEST-CREE YWO → CANADIAN SYLLABICS YO, MIDDLE DOT      # →ᔪᐧ→
+
+1538 ; 152B 00B7 ;     ML      # ( ᔸ → ᔫ· ) CANADIAN SYLLABICS WEST-CREE YWOO → CANADIAN SYLLABICS YOO, MIDDLE DOT    # →ᔫᐧ→
+
+153A ; 152D 00B7 ;     ML      # ( ᔺ → ᔭ· ) CANADIAN SYLLABICS WEST-CREE YWA → CANADIAN SYLLABICS YA, MIDDLE DOT      # →ᔭᐧ→
+
+153C ; 152E 00B7 ;     ML      # ( ᔼ → ᔮ· ) CANADIAN SYLLABICS WEST-CREE YWAA → CANADIAN SYLLABICS YAA, MIDDLE DOT    # →ᔮᐧ→
+
+1622 ; 1543 ;  ML      # ( ᘢ → ᕃ ) CANADIAN SYLLABICS CARRIER LU → CANADIAN SYLLABICS R-CREE RE        # 
+
+1623 ; 1546 ;  ML      # ( ᘣ → ᕆ ) CANADIAN SYLLABICS CARRIER LO → CANADIAN SYLLABICS RI       # 
+
+1624 ; 154A ;  ML      # ( ᘤ → ᕊ ) CANADIAN SYLLABICS CARRIER LE → CANADIAN SYLLABICS WEST-CREE LO     # 
+
+154F ; 154C 00B7 ;     ML      # ( ᕏ → ᕌ· ) CANADIAN SYLLABICS WEST-CREE RWAA → CANADIAN SYLLABICS RAA, MIDDLE DOT    # →ᕌᐧ→
+
+1581 ; 1550 0064 ;     ML      # ( ᖁ → ᕐd ) CANADIAN SYLLABICS QO → CANADIAN SYLLABICS R, LATIN SMALL LETTER D # →ᕐᑯ→
+
+166F ; 1550 146B ;     ML      # ( ᙯ → ᕐᑫ ) CANADIAN SYLLABICS QAI → CANADIAN SYLLABICS R, CANADIAN SYLLABICS KE     # 
+
+157E ; 1550 146C ;     ML      # ( ᕾ → ᕐᑬ ) CANADIAN SYLLABICS QAAI → CANADIAN SYLLABICS R, CANADIAN SYLLABICS KAAI  # 
+
+157F ; 1550 146D ;     ML      # ( ᕿ → ᕐᑭ ) CANADIAN SYLLABICS QI → CANADIAN SYLLABICS R, CANADIAN SYLLABICS KI      # 
+
+1580 ; 1550 146E ;     ML      # ( ᖀ → ᕐᑮ ) CANADIAN SYLLABICS QII → CANADIAN SYLLABICS R, CANADIAN SYLLABICS KII    # 
+
+1582 ; 1550 1470 ;     ML      # ( ᖂ → ᕐᑰ ) CANADIAN SYLLABICS QOO → CANADIAN SYLLABICS R, CANADIAN SYLLABICS KOO    # 
+
+1583 ; 1550 1472 ;     ML      # ( ᖃ → ᕐᑲ ) CANADIAN SYLLABICS QA → CANADIAN SYLLABICS R, CANADIAN SYLLABICS KA      # 
+
+1584 ; 1550 1473 ;     ML      # ( ᖄ → ᕐᑳ ) CANADIAN SYLLABICS QAA → CANADIAN SYLLABICS R, CANADIAN SYLLABICS KAA    # 
+
+1585 ; 1550 1483 ;     ML      # ( ᖅ → ᕐᒃ ) CANADIAN SYLLABICS Q → CANADIAN SYLLABICS R, CANADIAN SYLLABICS K        # 
+
+155C ; 155A 00B7 ;     ML      # ( ᕜ → ᕚ· ) CANADIAN SYLLABICS WEST-CREE FWAA → CANADIAN SYLLABICS FAA, MIDDLE DOT    # →ᕚᐧ→
+
+1569 ; 1567 00B7 ;     ML      # ( ᕩ → ᕧ· ) CANADIAN SYLLABICS WEST-CREE THWAA → CANADIAN SYLLABICS THAA, MIDDLE DOT  # →ᕧᐧ→
+
+211B ; 1587 ;  ML      # ( ℛ → ᖇ ) SCRIPT CAPITAL R → CANADIAN SYLLABICS TLHI  # →R→
+211C ; 1587 ;  ML      # ( ℜ → ᖇ ) BLACK-LETTER CAPITAL R → CANADIAN SYLLABICS TLHI    # →R→
+211D ; 1587 ;  ML      # ( ℝ → ᖇ ) DOUBLE-STRUCK CAPITAL R → CANADIAN SYLLABICS TLHI   # →R→
+1D411 ;        1587 ;  ML      # ( 𝐑 → ᖇ ) MATHEMATICAL BOLD CAPITAL R → CANADIAN SYLLABICS TLHI      # →R→
+1D445 ;        1587 ;  ML      # ( 𝑅 → ᖇ ) MATHEMATICAL ITALIC CAPITAL R → CANADIAN SYLLABICS TLHI    # →R→
+1D479 ;        1587 ;  ML      # ( 𝑹 → ᖇ ) MATHEMATICAL BOLD ITALIC CAPITAL R → CANADIAN SYLLABICS TLHI       # →R→
+1D4E1 ;        1587 ;  ML      # ( 𝓡 → ᖇ ) MATHEMATICAL BOLD SCRIPT CAPITAL R → CANADIAN SYLLABICS TLHI       # →R→
+1D57D ;        1587 ;  ML      # ( 𝕽 → ᖇ ) MATHEMATICAL BOLD FRAKTUR CAPITAL R → CANADIAN SYLLABICS TLHI      # →R→
+1D5B1 ;        1587 ;  ML      # ( 𝖱 → ᖇ ) MATHEMATICAL SANS-SERIF CAPITAL R → CANADIAN SYLLABICS TLHI        # →R→
+1D5E5 ;        1587 ;  ML      # ( 𝗥 → ᖇ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL R → CANADIAN SYLLABICS TLHI   # →R→
+1D619 ;        1587 ;  ML      # ( 𝘙 → ᖇ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL R → CANADIAN SYLLABICS TLHI # →R→
+1D64D ;        1587 ;  ML      # ( 𝙍 → ᖇ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R → CANADIAN SYLLABICS TLHI    # →R→
+1D681 ;        1587 ;  ML      # ( 𝚁 → ᖇ ) MATHEMATICAL MONOSPACE CAPITAL R → CANADIAN SYLLABICS TLHI # →R→
+13A1 ; 1587 ;  ML      # ( Ꭱ → ᖇ ) CHEROKEE LETTER E → CANADIAN SYLLABICS TLHI # →R→
+13D2 ; 1587 ;  ML      # ( Ꮢ → ᖇ ) CHEROKEE LETTER SV → CANADIAN SYLLABICS TLHI        # →Ꭱ→→R→
+A4E3 ; 1587 ;  ML      # ( ꓣ → ᖇ ) LISU LETTER ZHA → CANADIAN SYLLABICS TLHI   # →R→
+
+1670 ; 1595 1489 ;     ML      # ( ᙰ → ᖕᒉ ) CANADIAN SYLLABICS NGAI → CANADIAN SYLLABICS NG, CANADIAN SYLLABICS CE   # 
+
+158E ; 1595 148A ;     ML      # ( ᖎ → ᖕᒊ ) CANADIAN SYLLABICS NGAAI → CANADIAN SYLLABICS NG, CANADIAN SYLLABICS CAAI        # 
+
+158F ; 1595 148B ;     ML      # ( ᖏ → ᖕᒋ ) CANADIAN SYLLABICS NGI → CANADIAN SYLLABICS NG, CANADIAN SYLLABICS CI    # 
+
+1590 ; 1595 148C ;     ML      # ( ᖐ → ᖕᒌ ) CANADIAN SYLLABICS NGII → CANADIAN SYLLABICS NG, CANADIAN SYLLABICS CII  # 
+
+1591 ; 1595 148D ;     ML      # ( ᖑ → ᖕᒍ ) CANADIAN SYLLABICS NGO → CANADIAN SYLLABICS NG, CANADIAN SYLLABICS CO    # 
+
+1592 ; 1595 148E ;     ML      # ( ᖒ → ᖕᒎ ) CANADIAN SYLLABICS NGOO → CANADIAN SYLLABICS NG, CANADIAN SYLLABICS COO  # 
+
+1593 ; 1595 1490 ;     ML      # ( ᖓ → ᖕᒐ ) CANADIAN SYLLABICS NGA → CANADIAN SYLLABICS NG, CANADIAN SYLLABICS CA    # 
+
+1594 ; 1595 1491 ;     ML      # ( ᖔ → ᖕᒑ ) CANADIAN SYLLABICS NGAA → CANADIAN SYLLABICS NG, CANADIAN SYLLABICS CAA  # 
+
+1671 ; 1596 148B ;     ML      # ( ᙱ → ᖖᒋ ) CANADIAN SYLLABICS NNGI → CANADIAN SYLLABICS NNG, CANADIAN SYLLABICS CI  # 
+
+1672 ; 1596 148C ;     ML      # ( ᙲ → ᖖᒌ ) CANADIAN SYLLABICS NNGII → CANADIAN SYLLABICS NNG, CANADIAN SYLLABICS CII        # 
+
+1673 ; 1596 148D ;     ML      # ( ᙳ → ᖖᒍ ) CANADIAN SYLLABICS NNGO → CANADIAN SYLLABICS NNG, CANADIAN SYLLABICS CO  # 
+
+1674 ; 1596 148E ;     ML      # ( ᙴ → ᖖᒎ ) CANADIAN SYLLABICS NNGOO → CANADIAN SYLLABICS NNG, CANADIAN SYLLABICS COO        # 
+
+1675 ; 1596 1490 ;     ML      # ( ᙵ → ᖖᒐ ) CANADIAN SYLLABICS NNGA → CANADIAN SYLLABICS NNG, CANADIAN SYLLABICS CA  # 
+
+1676 ; 1596 1491 ;     ML      # ( ᙶ → ᖖᒑ ) CANADIAN SYLLABICS NNGAA → CANADIAN SYLLABICS NNG, CANADIAN SYLLABICS CAA        # 
+
+210B ; 157C ;  ML      # ( ℋ → ᕼ ) SCRIPT CAPITAL H → CANADIAN SYLLABICS NUNAVUT H     # →H→
+210C ; 157C ;  ML      # ( ℌ → ᕼ ) BLACK-LETTER CAPITAL H → CANADIAN SYLLABICS NUNAVUT H       # →H→
+210D ; 157C ;  ML      # ( ℍ → ᕼ ) DOUBLE-STRUCK CAPITAL H → CANADIAN SYLLABICS NUNAVUT H      # →H→
+1D407 ;        157C ;  ML      # ( 𝐇 → ᕼ ) MATHEMATICAL BOLD CAPITAL H → CANADIAN SYLLABICS NUNAVUT H # →H→
+1D43B ;        157C ;  ML      # ( 𝐻 → ᕼ ) MATHEMATICAL ITALIC CAPITAL H → CANADIAN SYLLABICS NUNAVUT H       # →H→
+1D46F ;        157C ;  ML      # ( 𝑯 → ᕼ ) MATHEMATICAL BOLD ITALIC CAPITAL H → CANADIAN SYLLABICS NUNAVUT H  # →H→
+1D4D7 ;        157C ;  ML      # ( 𝓗 → ᕼ ) MATHEMATICAL BOLD SCRIPT CAPITAL H → CANADIAN SYLLABICS NUNAVUT H  # →H→
+1D573 ;        157C ;  ML      # ( 𝕳 → ᕼ ) MATHEMATICAL BOLD FRAKTUR CAPITAL H → CANADIAN SYLLABICS NUNAVUT H # →H→
+1D5A7 ;        157C ;  ML      # ( 𝖧 → ᕼ ) MATHEMATICAL SANS-SERIF CAPITAL H → CANADIAN SYLLABICS NUNAVUT H   # →H→
+1D5DB ;        157C ;  ML      # ( 𝗛 → ᕼ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL H → CANADIAN SYLLABICS NUNAVUT H      # →H→
+1D60F ;        157C ;  ML      # ( 𝘏 → ᕼ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL H → CANADIAN SYLLABICS NUNAVUT H    # →H→
+1D643 ;        157C ;  ML      # ( 𝙃 → ᕼ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H → CANADIAN SYLLABICS NUNAVUT H       # →H→
+1D677 ;        157C ;  ML      # ( 𝙷 → ᕼ ) MATHEMATICAL MONOSPACE CAPITAL H → CANADIAN SYLLABICS NUNAVUT H    # →H→
+1D6AE ;        157C ;  ML      # ( 𝚮 → ᕼ ) MATHEMATICAL BOLD CAPITAL ETA → CANADIAN SYLLABICS NUNAVUT H       # →Η→
+1D6E8 ;        157C ;  ML      # ( 𝛨 → ᕼ ) MATHEMATICAL ITALIC CAPITAL ETA → CANADIAN SYLLABICS NUNAVUT H     # →Η→
+1D722 ;        157C ;  ML      # ( 𝜢 → ᕼ ) MATHEMATICAL BOLD ITALIC CAPITAL ETA → CANADIAN SYLLABICS NUNAVUT H        # →Η→
+1D75C ;        157C ;  ML      # ( 𝝜 → ᕼ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA → CANADIAN SYLLABICS NUNAVUT H    # →Η→
+1D796 ;        157C ;  ML      # ( 𝞖 → ᕼ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA → CANADIAN SYLLABICS NUNAVUT H     # →Η→
+13BB ; 157C ;  ML      # ( Ꮋ → ᕼ ) CHEROKEE LETTER MI → CANADIAN SYLLABICS NUNAVUT H   # →H→
+A4E7 ; 157C ;  ML      # ( ꓧ → ᕼ ) LISU LETTER XA → CANADIAN SYLLABICS NUNAVUT H       # →H→
+
+2131 ; 15B4 ;  ML      # ( ℱ → ᖴ ) SCRIPT CAPITAL F → CANADIAN SYLLABICS BLACKFOOT WE  # →F→
+1D405 ;        15B4 ;  ML      # ( 𝐅 → ᖴ ) MATHEMATICAL BOLD CAPITAL F → CANADIAN SYLLABICS BLACKFOOT WE      # →F→
+1D439 ;        15B4 ;  ML      # ( 𝐹 → ᖴ ) MATHEMATICAL ITALIC CAPITAL F → CANADIAN SYLLABICS BLACKFOOT WE    # →F→
+1D46D ;        15B4 ;  ML      # ( 𝑭 → ᖴ ) MATHEMATICAL BOLD ITALIC CAPITAL F → CANADIAN SYLLABICS BLACKFOOT WE       # →F→
+1D4D5 ;        15B4 ;  ML      # ( 𝓕 → ᖴ ) MATHEMATICAL BOLD SCRIPT CAPITAL F → CANADIAN SYLLABICS BLACKFOOT WE       # →F→
+1D509 ;        15B4 ;  ML      # ( 𝔉 → ᖴ ) MATHEMATICAL FRAKTUR CAPITAL F → CANADIAN SYLLABICS BLACKFOOT WE   # →F→
+1D53D ;        15B4 ;  ML      # ( 𝔽 → ᖴ ) MATHEMATICAL DOUBLE-STRUCK CAPITAL F → CANADIAN SYLLABICS BLACKFOOT WE     # →F→
+1D571 ;        15B4 ;  ML      # ( 𝕱 → ᖴ ) MATHEMATICAL BOLD FRAKTUR CAPITAL F → CANADIAN SYLLABICS BLACKFOOT WE      # →F→
+1D5A5 ;        15B4 ;  ML      # ( 𝖥 → ᖴ ) MATHEMATICAL SANS-SERIF CAPITAL F → CANADIAN SYLLABICS BLACKFOOT WE        # →F→
+1D5D9 ;        15B4 ;  ML      # ( 𝗙 → ᖴ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL F → CANADIAN SYLLABICS BLACKFOOT WE   # →F→
+1D60D ;        15B4 ;  ML      # ( 𝘍 → ᖴ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL F → CANADIAN SYLLABICS BLACKFOOT WE # →F→
+1D641 ;        15B4 ;  ML      # ( 𝙁 → ᖴ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F → CANADIAN SYLLABICS BLACKFOOT WE    # →F→
+1D675 ;        15B4 ;  ML      # ( 𝙵 → ᖴ ) MATHEMATICAL MONOSPACE CAPITAL F → CANADIAN SYLLABICS BLACKFOOT WE # →F→
+1D7CA ;        15B4 ;  ML      # ( 𝟊 → ᖴ ) MATHEMATICAL BOLD CAPITAL DIGAMMA → CANADIAN SYLLABICS BLACKFOOT WE        # →Ϝ→→F→
+A4DD ; 15B4 ;  ML      # ( ꓝ → ᖴ ) LISU LETTER TSA → CANADIAN SYLLABICS BLACKFOOT WE   # →F→
+
+1D400 ;        15C5 ;  ML      # ( 𝐀 → ᗅ ) MATHEMATICAL BOLD CAPITAL A → CANADIAN SYLLABICS CARRIER GHO       # →A→
+1D434 ;        15C5 ;  ML      # ( 𝐴 → ᗅ ) MATHEMATICAL ITALIC CAPITAL A → CANADIAN SYLLABICS CARRIER GHO     # →A→
+1D468 ;        15C5 ;  ML      # ( 𝑨 → ᗅ ) MATHEMATICAL BOLD ITALIC CAPITAL A → CANADIAN SYLLABICS CARRIER GHO        # →A→
+1D49C ;        15C5 ;  ML      # ( 𝒜 → ᗅ ) MATHEMATICAL SCRIPT CAPITAL A → CANADIAN SYLLABICS CARRIER GHO     # →A→
+1D4D0 ;        15C5 ;  ML      # ( 𝓐 → ᗅ ) MATHEMATICAL BOLD SCRIPT CAPITAL A → CANADIAN SYLLABICS CARRIER GHO        # →A→
+1D504 ;        15C5 ;  ML      # ( 𝔄 → ᗅ ) MATHEMATICAL FRAKTUR CAPITAL A → CANADIAN SYLLABICS CARRIER GHO    # →A→
+1D538 ;        15C5 ;  ML      # ( 𝔸 → ᗅ ) MATHEMATICAL DOUBLE-STRUCK CAPITAL A → CANADIAN SYLLABICS CARRIER GHO      # →A→
+1D56C ;        15C5 ;  ML      # ( 𝕬 → ᗅ ) MATHEMATICAL BOLD FRAKTUR CAPITAL A → CANADIAN SYLLABICS CARRIER GHO       # →A→
+1D5A0 ;        15C5 ;  ML      # ( 𝖠 → ᗅ ) MATHEMATICAL SANS-SERIF CAPITAL A → CANADIAN SYLLABICS CARRIER GHO # →A→
+1D5D4 ;        15C5 ;  ML      # ( 𝗔 → ᗅ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL A → CANADIAN SYLLABICS CARRIER GHO    # →A→
+1D608 ;        15C5 ;  ML      # ( 𝘈 → ᗅ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL A → CANADIAN SYLLABICS CARRIER GHO  # →A→
+1D63C ;        15C5 ;  ML      # ( 𝘼 → ᗅ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A → CANADIAN SYLLABICS CARRIER GHO     # →A→
+1D670 ;        15C5 ;  ML      # ( 𝙰 → ᗅ ) MATHEMATICAL MONOSPACE CAPITAL A → CANADIAN SYLLABICS CARRIER GHO  # →A→
+1D6A8 ;        15C5 ;  ML      # ( 𝚨 → ᗅ ) MATHEMATICAL BOLD CAPITAL ALPHA → CANADIAN SYLLABICS CARRIER GHO   # →𝐀→→A→
+1D6E2 ;        15C5 ;  ML      # ( 𝛢 → ᗅ ) MATHEMATICAL ITALIC CAPITAL ALPHA → CANADIAN SYLLABICS CARRIER GHO # →𝐴→→A→
+1D71C ;        15C5 ;  ML      # ( 𝜜 → ᗅ ) MATHEMATICAL BOLD ITALIC CAPITAL ALPHA → CANADIAN SYLLABICS CARRIER GHO    # →𝑨→→A→
+1D756 ;        15C5 ;  ML      # ( 𝝖 → ᗅ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA → CANADIAN SYLLABICS CARRIER GHO        # →Α→→A→
+1D790 ;        15C5 ;  ML      # ( 𝞐 → ᗅ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA → CANADIAN SYLLABICS CARRIER GHO # →Α→→A→
+13AA ; 15C5 ;  ML      # ( Ꭺ → ᗅ ) CHEROKEE LETTER GO → CANADIAN SYLLABICS CARRIER GHO # →A→
+A4EE ; 15C5 ;  ML      # ( ꓮ → ᗅ ) LISU LETTER A → CANADIAN SYLLABICS CARRIER GHO      # →A→
+
+2145 ; 15DE ;  ML      # ( ⅅ → ᗞ ) DOUBLE-STRUCK ITALIC CAPITAL D → CANADIAN SYLLABICS CARRIER THE     # →D→
+1D403 ;        15DE ;  ML      # ( 𝐃 → ᗞ ) MATHEMATICAL BOLD CAPITAL D → CANADIAN SYLLABICS CARRIER THE       # →D→
+1D437 ;        15DE ;  ML      # ( 𝐷 → ᗞ ) MATHEMATICAL ITALIC CAPITAL D → CANADIAN SYLLABICS CARRIER THE     # →D→
+1D46B ;        15DE ;  ML      # ( 𝑫 → ᗞ ) MATHEMATICAL BOLD ITALIC CAPITAL D → CANADIAN SYLLABICS CARRIER THE        # →D→
+1D49F ;        15DE ;  ML      # ( 𝒟 → ᗞ ) MATHEMATICAL SCRIPT CAPITAL D → CANADIAN SYLLABICS CARRIER THE     # →D→
+1D4D3 ;        15DE ;  ML      # ( 𝓓 → ᗞ ) MATHEMATICAL BOLD SCRIPT CAPITAL D → CANADIAN SYLLABICS CARRIER THE        # →D→
+1D507 ;        15DE ;  ML      # ( 𝔇 → ᗞ ) MATHEMATICAL FRAKTUR CAPITAL D → CANADIAN SYLLABICS CARRIER THE    # →D→
+1D53B ;        15DE ;  ML      # ( 𝔻 → ᗞ ) MATHEMATICAL DOUBLE-STRUCK CAPITAL D → CANADIAN SYLLABICS CARRIER THE      # →D→
+1D56F ;        15DE ;  ML      # ( 𝕯 → ᗞ ) MATHEMATICAL BOLD FRAKTUR CAPITAL D → CANADIAN SYLLABICS CARRIER THE       # →D→
+1D5A3 ;        15DE ;  ML      # ( 𝖣 → ᗞ ) MATHEMATICAL SANS-SERIF CAPITAL D → CANADIAN SYLLABICS CARRIER THE # →D→
+1D5D7 ;        15DE ;  ML      # ( 𝗗 → ᗞ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL D → CANADIAN SYLLABICS CARRIER THE    # →D→
+1D60B ;        15DE ;  ML      # ( 𝘋 → ᗞ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL D → CANADIAN SYLLABICS CARRIER THE  # →D→
+1D63F ;        15DE ;  ML      # ( 𝘿 → ᗞ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D → CANADIAN SYLLABICS CARRIER THE     # →D→
+1D673 ;        15DE ;  ML      # ( 𝙳 → ᗞ ) MATHEMATICAL MONOSPACE CAPITAL D → CANADIAN SYLLABICS CARRIER THE  # →D→
+13A0 ; 15DE ;  ML      # ( Ꭰ → ᗞ ) CHEROKEE LETTER A → CANADIAN SYLLABICS CARRIER THE  # →D→
+15EA ; 15DE ;  ML      # ( ᗪ → ᗞ ) CANADIAN SYLLABICS CARRIER PE → CANADIAN SYLLABICS CARRIER THE      # 
+A4D3 ; 15DE ;  ML      # ( ꓓ → ᗞ ) LISU LETTER DA → CANADIAN SYLLABICS CARRIER THE     # →D→
+
+A4F7 ; 15E1 ;  ML      # ( ꓷ → ᗡ ) LISU LETTER OE → CANADIAN SYLLABICS CARRIER THA     # 
+
+2133 ; 15F0 ;  ML      # ( ℳ → ᗰ ) SCRIPT CAPITAL M → CANADIAN SYLLABICS CARRIER GO    # →M→
+1D40C ;        15F0 ;  ML      # ( 𝐌 → ᗰ ) MATHEMATICAL BOLD CAPITAL M → CANADIAN SYLLABICS CARRIER GO        # →M→
+1D440 ;        15F0 ;  ML      # ( 𝑀 → ᗰ ) MATHEMATICAL ITALIC CAPITAL M → CANADIAN SYLLABICS CARRIER GO      # →M→
+1D474 ;        15F0 ;  ML      # ( 𝑴 → ᗰ ) MATHEMATICAL BOLD ITALIC CAPITAL M → CANADIAN SYLLABICS CARRIER GO # →M→
+1D4DC ;        15F0 ;  ML      # ( 𝓜 → ᗰ ) MATHEMATICAL BOLD SCRIPT CAPITAL M → CANADIAN SYLLABICS CARRIER GO # →M→
+1D510 ;        15F0 ;  ML      # ( 𝔐 → ᗰ ) MATHEMATICAL FRAKTUR CAPITAL M → CANADIAN SYLLABICS CARRIER GO     # →M→
+1D544 ;        15F0 ;  ML      # ( 𝕄 → ᗰ ) MATHEMATICAL DOUBLE-STRUCK CAPITAL M → CANADIAN SYLLABICS CARRIER GO       # →M→
+1D578 ;        15F0 ;  ML      # ( 𝕸 → ᗰ ) MATHEMATICAL BOLD FRAKTUR CAPITAL M → CANADIAN SYLLABICS CARRIER GO        # →M→
+1D5AC ;        15F0 ;  ML      # ( 𝖬 → ᗰ ) MATHEMATICAL SANS-SERIF CAPITAL M → CANADIAN SYLLABICS CARRIER GO  # →M→
+1D5E0 ;        15F0 ;  ML      # ( 𝗠 → ᗰ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL M → CANADIAN SYLLABICS CARRIER GO     # →M→
+1D614 ;        15F0 ;  ML      # ( 𝘔 → ᗰ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL M → CANADIAN SYLLABICS CARRIER GO   # →M→
+1D648 ;        15F0 ;  ML      # ( 𝙈 → ᗰ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M → CANADIAN SYLLABICS CARRIER GO      # →M→
+1D67C ;        15F0 ;  ML      # ( 𝙼 → ᗰ ) MATHEMATICAL MONOSPACE CAPITAL M → CANADIAN SYLLABICS CARRIER GO   # →M→
+1D6B3 ;        15F0 ;  ML      # ( 𝚳 → ᗰ ) MATHEMATICAL BOLD CAPITAL MU → CANADIAN SYLLABICS CARRIER GO       # →Μ→→M→
+1D6ED ;        15F0 ;  ML      # ( 𝛭 → ᗰ ) MATHEMATICAL ITALIC CAPITAL MU → CANADIAN SYLLABICS CARRIER GO     # →Μ→→M→
+1D727 ;        15F0 ;  ML      # ( 𝜧 → ᗰ ) MATHEMATICAL BOLD ITALIC CAPITAL MU → CANADIAN SYLLABICS CARRIER GO        # →Μ→→M→
+1D761 ;        15F0 ;  ML      # ( 𝝡 → ᗰ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL MU → CANADIAN SYLLABICS CARRIER GO    # →Μ→→M→
+1D79B ;        15F0 ;  ML      # ( 𝞛 → ᗰ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU → CANADIAN SYLLABICS CARRIER GO     # →Μ→→M→
+13B7 ; 15F0 ;  ML      # ( Ꮇ → ᗰ ) CHEROKEE LETTER LU → CANADIAN SYLLABICS CARRIER GO  # →M→
+A4DF ; 15F0 ;  ML      # ( ꓟ → ᗰ ) LISU LETTER MA → CANADIAN SYLLABICS CARRIER GO      # →M→
+
+212C ; 15F7 ;  ML      # ( ℬ → ᗷ ) SCRIPT CAPITAL B → CANADIAN SYLLABICS CARRIER KHE   # →B→
+1D401 ;        15F7 ;  ML      # ( 𝐁 → ᗷ ) MATHEMATICAL BOLD CAPITAL B → CANADIAN SYLLABICS CARRIER KHE       # →B→
+1D435 ;        15F7 ;  ML      # ( 𝐵 → ᗷ ) MATHEMATICAL ITALIC CAPITAL B → CANADIAN SYLLABICS CARRIER KHE     # →B→
+1D469 ;        15F7 ;  ML      # ( 𝑩 → ᗷ ) MATHEMATICAL BOLD ITALIC CAPITAL B → CANADIAN SYLLABICS CARRIER KHE        # →B→
+1D4D1 ;        15F7 ;  ML      # ( 𝓑 → ᗷ ) MATHEMATICAL BOLD SCRIPT CAPITAL B → CANADIAN SYLLABICS CARRIER KHE        # →B→
+1D505 ;        15F7 ;  ML      # ( 𝔅 → ᗷ ) MATHEMATICAL FRAKTUR CAPITAL B → CANADIAN SYLLABICS CARRIER KHE    # →B→
+1D539 ;        15F7 ;  ML      # ( 𝔹 → ᗷ ) MATHEMATICAL DOUBLE-STRUCK CAPITAL B → CANADIAN SYLLABICS CARRIER KHE      # →B→
+1D56D ;        15F7 ;  ML      # ( 𝕭 → ᗷ ) MATHEMATICAL BOLD FRAKTUR CAPITAL B → CANADIAN SYLLABICS CARRIER KHE       # →B→
+1D5A1 ;        15F7 ;  ML      # ( 𝖡 → ᗷ ) MATHEMATICAL SANS-SERIF CAPITAL B → CANADIAN SYLLABICS CARRIER KHE # →B→
+1D5D5 ;        15F7 ;  ML      # ( 𝗕 → ᗷ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL B → CANADIAN SYLLABICS CARRIER KHE    # →B→
+1D609 ;        15F7 ;  ML      # ( 𝘉 → ᗷ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL B → CANADIAN SYLLABICS CARRIER KHE  # →B→
+1D63D ;        15F7 ;  ML      # ( 𝘽 → ᗷ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B → CANADIAN SYLLABICS CARRIER KHE     # →B→
+1D671 ;        15F7 ;  ML      # ( 𝙱 → ᗷ ) MATHEMATICAL MONOSPACE CAPITAL B → CANADIAN SYLLABICS CARRIER KHE  # →B→
+1D6A9 ;        15F7 ;  ML      # ( 𝚩 → ᗷ ) MATHEMATICAL BOLD CAPITAL BETA → CANADIAN SYLLABICS CARRIER KHE    # →𝐁→→B→
+1D6E3 ;        15F7 ;  ML      # ( 𝛣 → ᗷ ) MATHEMATICAL ITALIC CAPITAL BETA → CANADIAN SYLLABICS CARRIER KHE  # →𝐵→→B→
+1D71D ;        15F7 ;  ML      # ( 𝜝 → ᗷ ) MATHEMATICAL BOLD ITALIC CAPITAL BETA → CANADIAN SYLLABICS CARRIER KHE     # →𝑩→→B→
+1D757 ;        15F7 ;  ML      # ( 𝝗 → ᗷ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA → CANADIAN SYLLABICS CARRIER KHE # →Β→→B→
+1D791 ;        15F7 ;  ML      # ( 𝞑 → ᗷ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA → CANADIAN SYLLABICS CARRIER KHE  # →Β→→B→
+13F4 ; 15F7 ;  ML      # ( Ᏼ → ᗷ ) CHEROKEE LETTER YV → CANADIAN SYLLABICS CARRIER KHE # →B→
+A4D0 ; 15F7 ;  ML      # ( ꓐ → ᗷ ) LISU LETTER BA → CANADIAN SYLLABICS CARRIER KHE     # →B→
+
+2127 ; 162E ;  ML      #* ( ℧ → ᘮ ) INVERTED OHM SIGN → CANADIAN SYLLABICS CARRIER LHU # 
+1634 ; 162E ;  ML      # ( ᘴ → ᘮ ) CANADIAN SYLLABICS CARRIER TLHU → CANADIAN SYLLABICS CARRIER LHU    # 
+
+1D6C0 ;        162F ;  ML      # ( 𝛀 → ᘯ ) MATHEMATICAL BOLD CAPITAL OMEGA → CANADIAN SYLLABICS CARRIER LHO   # →Ω→
+1D6FA ;        162F ;  ML      # ( 𝛺 → ᘯ ) MATHEMATICAL ITALIC CAPITAL OMEGA → CANADIAN SYLLABICS CARRIER LHO # →Ω→
+1D734 ;        162F ;  ML      # ( 𝜴 → ᘯ ) MATHEMATICAL BOLD ITALIC CAPITAL OMEGA → CANADIAN SYLLABICS CARRIER LHO    # →Ω→
+1D76E ;        162F ;  ML      # ( 𝝮 → ᘯ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA → CANADIAN SYLLABICS CARRIER LHO        # →Ω→
+1D7A8 ;        162F ;  ML      # ( 𝞨 → ᘯ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA → CANADIAN SYLLABICS CARRIER LHO # →Ω→
+1635 ; 162F ;  ML      # ( ᘵ → ᘯ ) CANADIAN SYLLABICS CARRIER TLHO → CANADIAN SYLLABICS CARRIER LHO    # 
+
+A4ED ; 1660 ;  ML      # ( ꓭ → ᙠ ) LISU LETTER GHA → CANADIAN SYLLABICS CARRIER TSA    # 
+
+3131 ; 1100 ;  ML      # ( ㄱ → ᄀ ) HANGUL LETTER KIYEOK → HANGUL CHOSEONG KIYEOK       # 
+11A8 ; 1100 ;  ML      # ( ᆨ → ᄀ ) HANGUL JONGSEONG KIYEOK → HANGUL CHOSEONG KIYEOK    # 
+
+1101 ; 1100 1100 ;     ML      # ( ᄁ → ᄀᄀ ) HANGUL CHOSEONG SSANGKIYEOK → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG KIYEOK     # 
+3132 ; 1100 1100 ;     ML      # ( ㄲ → ᄀᄀ ) HANGUL LETTER SSANGKIYEOK → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG KIYEOK       # →ᄁ→
+11A9 ; 1100 1100 ;     ML      # ( ᆩ → ᄀᄀ ) HANGUL JONGSEONG SSANGKIYEOK → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG KIYEOK    # →ᄁ→
+
+11FA ; 1100 1102 ;     ML      # ( ᇺ → ᄀᄂ ) HANGUL JONGSEONG KIYEOK-NIEUN → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG NIEUN    # →ᆨᆫ→
+
+115A ; 1100 1103 ;     ML      # ( ᅚ → ᄀᄃ ) HANGUL CHOSEONG KIYEOK-TIKEUT → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG TIKEUT   # 
+
+11C3 ; 1100 1105 ;     ML      # ( ᇃ → ᄀᄅ ) HANGUL JONGSEONG KIYEOK-RIEUL → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG RIEUL    # →ᆨᆯ→
+
+11FB ; 1100 1107 ;     ML      # ( ᇻ → ᄀᄇ ) HANGUL JONGSEONG KIYEOK-PIEUP → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG PIEUP    # →ᆨᆸ→
+
+11AA ; 1100 1109 ;     ML      # ( ᆪ → ᄀᄉ ) HANGUL JONGSEONG KIYEOK-SIOS → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG SIOS      # →ᆨᆺ→
+3133 ; 1100 1109 ;     ML      # ( ㄳ → ᄀᄉ ) HANGUL LETTER KIYEOK-SIOS → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG SIOS # →ᆪ→→ᆨᆺ→
+
+11C4 ; 1100 1109 1100 ;        ML      # ( ᇄ → ᄀᄉᄀ ) HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK    # →ᆨᆺᆨ→
+
+11FC ; 1100 110E ;     ML      # ( ᇼ → ᄀᄎ ) HANGUL JONGSEONG KIYEOK-CHIEUCH → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG CHIEUCH        # →ᆨᆾ→
+
+11FD ; 1100 110F ;     ML      # ( ᇽ → ᄀᄏ ) HANGUL JONGSEONG KIYEOK-KHIEUKH → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG KHIEUKH        # →ᆨᆿ→
+
+11FE ; 1100 1112 ;     ML      # ( ᇾ → ᄀᄒ ) HANGUL JONGSEONG KIYEOK-HIEUH → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG HIEUH    # →ᆨᇂ→
+
+3134 ; 1102 ;  ML      # ( ㄴ → ᄂ ) HANGUL LETTER NIEUN → HANGUL CHOSEONG NIEUN # 
+11AB ; 1102 ;  ML      # ( ᆫ → ᄂ ) HANGUL JONGSEONG NIEUN → HANGUL CHOSEONG NIEUN      # 
+
+1113 ; 1102 1100 ;     ML      # ( ᄓ → ᄂᄀ ) HANGUL CHOSEONG NIEUN-KIYEOK → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG KIYEOK     # 
+11C5 ; 1102 1100 ;     ML      # ( ᇅ → ᄂᄀ ) HANGUL JONGSEONG NIEUN-KIYEOK → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG KIYEOK    # →ᄓ→
+
+1114 ; 1102 1102 ;     ML      # ( ᄔ → ᄂᄂ ) HANGUL CHOSEONG SSANGNIEUN → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG NIEUN        # 
+3165 ; 1102 1102 ;     ML      # ( ㅥ → ᄂᄂ ) HANGUL LETTER SSANGNIEUN → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG NIEUN  # →ᄔ→
+11FF ; 1102 1102 ;     ML      # ( ᇿ → ᄂᄂ ) HANGUL JONGSEONG SSANGNIEUN → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG NIEUN       # →ᆫᆫ→
+
+1115 ; 1102 1103 ;     ML      # ( ᄕ → ᄂᄃ ) HANGUL CHOSEONG NIEUN-TIKEUT → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG TIKEUT     # 
+3166 ; 1102 1103 ;     ML      # ( ㅦ → ᄂᄃ ) HANGUL LETTER NIEUN-TIKEUT → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG TIKEUT       # →ᄕ→
+11C6 ; 1102 1103 ;     ML      # ( ᇆ → ᄂᄃ ) HANGUL JONGSEONG NIEUN-TIKEUT → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG TIKEUT    # →ᄕ→
+
+D7CB ; 1102 1105 ;     ML      # ( ퟋ → ᄂᄅ ) HANGUL JONGSEONG NIEUN-RIEUL → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG RIEUL      # →ᆫᆯ→
+
+1116 ; 1102 1107 ;     ML      # ( ᄖ → ᄂᄇ ) HANGUL CHOSEONG NIEUN-PIEUP → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG PIEUP       # 
+
+115B ; 1102 1109 ;     ML      # ( ᅛ → ᄂᄉ ) HANGUL CHOSEONG NIEUN-SIOS → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG SIOS # 
+11C7 ; 1102 1109 ;     ML      # ( ᇇ → ᄂᄉ ) HANGUL JONGSEONG NIEUN-SIOS → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG SIOS        # →ᆫᆺ→
+3167 ; 1102 1109 ;     ML      # ( ㅧ → ᄂᄉ ) HANGUL LETTER NIEUN-SIOS → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG SIOS   # →ᇇ→→ᆫᆺ→
+
+115C ; 1102 110C ;     ML      # ( ᅜ → ᄂᄌ ) HANGUL CHOSEONG NIEUN-CIEUC → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG CIEUC       # 
+11AC ; 1102 110C ;     ML      # ( ᆬ → ᄂᄌ ) HANGUL JONGSEONG NIEUN-CIEUC → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG CIEUC      # →ᆫᆽ→
+3135 ; 1102 110C ;     ML      # ( ㄵ → ᄂᄌ ) HANGUL LETTER NIEUN-CIEUC → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG CIEUC # →ᆬ→→ᆫᆽ→
+
+D7CC ; 1102 110E ;     ML      # ( ퟌ → ᄂᄎ ) HANGUL JONGSEONG NIEUN-CHIEUCH → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG CHIEUCH  # →ᆫᆾ→
+
+11C9 ; 1102 1110 ;     ML      # ( ᇉ → ᄂᄐ ) HANGUL JONGSEONG NIEUN-THIEUTH → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG THIEUTH  # →ᆫᇀ→
+
+115D ; 1102 1112 ;     ML      # ( ᅝ → ᄂᄒ ) HANGUL CHOSEONG NIEUN-HIEUH → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG HIEUH       # 
+11AD ; 1102 1112 ;     ML      # ( ᆭ → ᄂᄒ ) HANGUL JONGSEONG NIEUN-HIEUH → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG HIEUH      # →ᆫᇂ→
+3136 ; 1102 1112 ;     ML      # ( ㄶ → ᄂᄒ ) HANGUL LETTER NIEUN-HIEUH → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG HIEUH # →ᆭ→→ᆫᇂ→
+
+11C8 ; 1102 1140 ;     ML      # ( ᇈ → ᄂᅀ ) HANGUL JONGSEONG NIEUN-PANSIOS → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG PANSIOS  # →ᆫᇫ→
+3168 ; 1102 1140 ;     ML      # ( ㅨ → ᄂᅀ ) HANGUL LETTER NIEUN-PANSIOS → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG PANSIOS     # →ᇈ→→ᆫᇫ→
+
+3137 ; 1103 ;  ML      # ( ㄷ → ᄃ ) HANGUL LETTER TIKEUT → HANGUL CHOSEONG TIKEUT       # 
+11AE ; 1103 ;  ML      # ( ᆮ → ᄃ ) HANGUL JONGSEONG TIKEUT → HANGUL CHOSEONG TIKEUT    # 
+
+1117 ; 1103 1100 ;     ML      # ( ᄗ → ᄃᄀ ) HANGUL CHOSEONG TIKEUT-KIYEOK → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG KIYEOK   # 
+11CA ; 1103 1100 ;     ML      # ( ᇊ → ᄃᄀ ) HANGUL JONGSEONG TIKEUT-KIYEOK → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG KIYEOK  # →ᄗ→
+
+1104 ; 1103 1103 ;     ML      # ( ᄄ → ᄃᄃ ) HANGUL CHOSEONG SSANGTIKEUT → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG TIKEUT     # 
+3138 ; 1103 1103 ;     ML      # ( ㄸ → ᄃᄃ ) HANGUL LETTER SSANGTIKEUT → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG TIKEUT       # →ᄄ→
+D7CD ; 1103 1103 ;     ML      # ( ퟍ → ᄃᄃ ) HANGUL JONGSEONG SSANGTIKEUT → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG TIKEUT    # →ᆮᆮ→
+
+D7CE ; 1103 1103 1107 ;        ML      # ( ퟎ → ᄃᄃᄇ ) HANGUL JONGSEONG SSANGTIKEUT-PIEUP → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG PIEUP    # →ᆮᆮᆸ→
+
+115E ; 1103 1105 ;     ML      # ( ᅞ → ᄃᄅ ) HANGUL CHOSEONG TIKEUT-RIEUL → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG RIEUL     # 
+11CB ; 1103 1105 ;     ML      # ( ᇋ → ᄃᄅ ) HANGUL JONGSEONG TIKEUT-RIEUL → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG RIEUL    # →ᆮᆯ→
+
+A960 ; 1103 1106 ;     ML      # ( ꥠ → ᄃᄆ ) HANGUL CHOSEONG TIKEUT-MIEUM → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG MIEUM     # 
+
+A961 ; 1103 1107 ;     ML      # ( ꥡ → ᄃᄇ ) HANGUL CHOSEONG TIKEUT-PIEUP → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG PIEUP     # 
+D7CF ; 1103 1107 ;     ML      # ( ퟏ → ᄃᄇ ) HANGUL JONGSEONG TIKEUT-PIEUP → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG PIEUP    # →ᆮᆸ→
+
+A962 ; 1103 1109 ;     ML      # ( ꥢ → ᄃᄉ ) HANGUL CHOSEONG TIKEUT-SIOS → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG SIOS       # 
+D7D0 ; 1103 1109 ;     ML      # ( ퟐ → ᄃᄉ ) HANGUL JONGSEONG TIKEUT-SIOS → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG SIOS      # →ᆮᆺ→
+
+D7D1 ; 1103 1109 1100 ;        ML      # ( ퟑ → ᄃᄉᄀ ) HANGUL JONGSEONG TIKEUT-SIOS-KIYEOK → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK    # →ᆮᆺᆨ→
+
+A963 ; 1103 110C ;     ML      # ( ꥣ → ᄃᄌ ) HANGUL CHOSEONG TIKEUT-CIEUC → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG CIEUC     # 
+D7D2 ; 1103 110C ;     ML      # ( ퟒ → ᄃᄌ ) HANGUL JONGSEONG TIKEUT-CIEUC → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG CIEUC    # →ᆮᆽ→
+
+D7D3 ; 1103 110E ;     ML      # ( ퟓ → ᄃᄎ ) HANGUL JONGSEONG TIKEUT-CHIEUCH → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG CHIEUCH        # →ᆮᆾ→
+
+D7D4 ; 1103 1110 ;     ML      # ( ퟔ → ᄃᄐ ) HANGUL JONGSEONG TIKEUT-THIEUTH → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG THIEUTH        # →ᆮᇀ→
+
+3139 ; 1105 ;  ML      # ( ㄹ → ᄅ ) HANGUL LETTER RIEUL → HANGUL CHOSEONG RIEUL # 
+11AF ; 1105 ;  ML      # ( ᆯ → ᄅ ) HANGUL JONGSEONG RIEUL → HANGUL CHOSEONG RIEUL      # 
+
+A964 ; 1105 1100 ;     ML      # ( ꥤ → ᄅᄀ ) HANGUL CHOSEONG RIEUL-KIYEOK → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK     # 
+11B0 ; 1105 1100 ;     ML      # ( ᆰ → ᄅᄀ ) HANGUL JONGSEONG RIEUL-KIYEOK → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK    # →ᆯᆨ→
+313A ; 1105 1100 ;     ML      # ( ㄺ → ᄅᄀ ) HANGUL LETTER RIEUL-KIYEOK → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK       # →ᆰ→→ᆯᆨ→
+
+A965 ; 1105 1100 1100 ;        ML      # ( ꥥ → ᄅᄀᄀ ) HANGUL CHOSEONG RIEUL-SSANGKIYEOK → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG KIYEOK     # 
+D7D5 ; 1105 1100 1100 ;        ML      # ( ퟕ → ᄅᄀᄀ ) HANGUL JONGSEONG RIEUL-SSANGKIYEOK → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG KIYEOK    # →ᆯᆨᆨ→
+
+11CC ; 1105 1100 1109 ;        ML      # ( ᇌ → ᄅᄀᄉ ) HANGUL JONGSEONG RIEUL-KIYEOK-SIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG SIOS      # →ᆯᆨᆺ→
+3169 ; 1105 1100 1109 ;        ML      # ( ㅩ → ᄅᄀᄉ ) HANGUL LETTER RIEUL-KIYEOK-SIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG SIOS # →ᇌ→→ᆯᆨᆺ→
+
+D7D6 ; 1105 1100 1112 ;        ML      # ( ퟖ → ᄅᄀᄒ ) HANGUL JONGSEONG RIEUL-KIYEOK-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG HIEUH    # →ᆯᆨᇂ→
+
+1118 ; 1105 1102 ;     ML      # ( ᄘ → ᄅᄂ ) HANGUL CHOSEONG RIEUL-NIEUN → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG NIEUN       # 
+11CD ; 1105 1102 ;     ML      # ( ᇍ → ᄅᄂ ) HANGUL JONGSEONG RIEUL-NIEUN → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG NIEUN      # →ᄘ→
+
+A966 ; 1105 1103 ;     ML      # ( ꥦ → ᄅᄃ ) HANGUL CHOSEONG RIEUL-TIKEUT → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG TIKEUT     # 
+11CE ; 1105 1103 ;     ML      # ( ᇎ → ᄅᄃ ) HANGUL JONGSEONG RIEUL-TIKEUT → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG TIKEUT    # →ᆯᆮ→
+316A ; 1105 1103 ;     ML      # ( ㅪ → ᄅᄃ ) HANGUL LETTER RIEUL-TIKEUT → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG TIKEUT       # →ᇎ→→ᆯᆮ→
+
+A967 ; 1105 1103 1103 ;        ML      # ( ꥧ → ᄅᄃᄃ ) HANGUL CHOSEONG RIEUL-SSANGTIKEUT → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG TIKEUT     # 
+
+11CF ; 1105 1103 1112 ;        ML      # ( ᇏ → ᄅᄃᄒ ) HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG HIEUH    # →ᆯᆮᇂ→
+
+1119 ; 1105 1105 ;     ML      # ( ᄙ → ᄅᄅ ) HANGUL CHOSEONG SSANGRIEUL → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG RIEUL        # 
+11D0 ; 1105 1105 ;     ML      # ( ᇐ → ᄅᄅ ) HANGUL JONGSEONG SSANGRIEUL → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG RIEUL       # →ᄙ→
+
+D7D7 ; 1105 1105 110F ;        ML      # ( ퟗ → ᄅᄅᄏ ) HANGUL JONGSEONG SSANGRIEUL-KHIEUKH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KHIEUKH   # →ᆯᆯᆿ→
+
+A968 ; 1105 1106 ;     ML      # ( ꥨ → ᄅᄆ ) HANGUL CHOSEONG RIEUL-MIEUM → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG MIEUM       # 
+11B1 ; 1105 1106 ;     ML      # ( ᆱ → ᄅᄆ ) HANGUL JONGSEONG RIEUL-MIEUM → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG MIEUM      # →ᆯᆷ→
+313B ; 1105 1106 ;     ML      # ( ㄻ → ᄅᄆ ) HANGUL LETTER RIEUL-MIEUM → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG MIEUM # →ᆱ→→ᆯᆷ→
+
+11D1 ; 1105 1106 1100 ;        ML      # ( ᇑ → ᄅᄆᄀ ) HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG KIYEOK    # →ᆯᆷᆨ→
+
+11D2 ; 1105 1106 1109 ;        ML      # ( ᇒ → ᄅᄆᄉ ) HANGUL JONGSEONG RIEUL-MIEUM-SIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG SIOS        # →ᆯᆷᆺ→
+
+D7D8 ; 1105 1106 1112 ;        ML      # ( ퟘ → ᄅᄆᄒ ) HANGUL JONGSEONG RIEUL-MIEUM-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG HIEUH      # →ᆯᆷᇂ→
+
+A969 ; 1105 1107 ;     ML      # ( ꥩ → ᄅᄇ ) HANGUL CHOSEONG RIEUL-PIEUP → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP       # 
+11B2 ; 1105 1107 ;     ML      # ( ᆲ → ᄅᄇ ) HANGUL JONGSEONG RIEUL-PIEUP → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP      # →ᆯᆸ→
+313C ; 1105 1107 ;     ML      # ( ㄼ → ᄅᄇ ) HANGUL LETTER RIEUL-PIEUP → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP # →ᆲ→→ᆯᆸ→
+
+D7D9 ; 1105 1107 1103 ;        ML      # ( ퟙ → ᄅᄇᄃ ) HANGUL JONGSEONG RIEUL-PIEUP-TIKEUT → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG TIKEUT    # →ᆯᆸᆮ→
+
+A96A ; 1105 1107 1107 ;        ML      # ( ꥪ → ᄅᄇᄇ ) HANGUL CHOSEONG RIEUL-SSANGPIEUP → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PIEUP        # 
+
+11D3 ; 1105 1107 1109 ;        ML      # ( ᇓ → ᄅᄇᄉ ) HANGUL JONGSEONG RIEUL-PIEUP-SIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS        # →ᆯᆸᆺ→
+316B ; 1105 1107 1109 ;        ML      # ( ㅫ → ᄅᄇᄉ ) HANGUL LETTER RIEUL-PIEUP-SIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS   # →ᇓ→→ᆯᆸᆺ→
+
+A96B ; 1105 1107 110B ;        ML      # ( ꥫ → ᄅᄇᄋ ) HANGUL CHOSEONG RIEUL-KAPYEOUNPIEUP → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG     # 
+11D5 ; 1105 1107 110B ;        ML      # ( ᇕ → ᄅᄇᄋ ) HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG    # →ᆯᆸᆼ→
+
+D7DA ; 1105 1107 1111 ;        ML      # ( ퟚ → ᄅᄇᄑ ) HANGUL JONGSEONG RIEUL-PIEUP-PHIEUPH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PHIEUPH  # →ᆯᆸᇁ→
+
+11D4 ; 1105 1107 1112 ;        ML      # ( ᇔ → ᄅᄇᄒ ) HANGUL JONGSEONG RIEUL-PIEUP-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG HIEUH      # →ᆯᆸᇂ→
+
+A96C ; 1105 1109 ;     ML      # ( ꥬ → ᄅᄉ ) HANGUL CHOSEONG RIEUL-SIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG SIOS # 
+11B3 ; 1105 1109 ;     ML      # ( ᆳ → ᄅᄉ ) HANGUL JONGSEONG RIEUL-SIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG SIOS        # →ᆯᆺ→
+313D ; 1105 1109 ;     ML      # ( ㄽ → ᄅᄉ ) HANGUL LETTER RIEUL-SIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG SIOS   # →ᆳ→→ᆯᆺ→
+
+11D6 ; 1105 1109 1109 ;        ML      # ( ᇖ → ᄅᄉᄉ ) HANGUL JONGSEONG RIEUL-SSANGSIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS  # →ᆯᆺᆺ→
+
+111B ; 1105 110B ;     ML      # ( ᄛ → ᄅᄋ ) HANGUL CHOSEONG KAPYEOUNRIEUL → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG IEUNG     # 
+D7DD ; 1105 110B ;     ML      # ( ퟝ → ᄅᄋ ) HANGUL JONGSEONG KAPYEOUNRIEUL → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG IEUNG    # →ᆯᆼ→
+
+A96D ; 1105 110C ;     ML      # ( ꥭ → ᄅᄌ ) HANGUL CHOSEONG RIEUL-CIEUC → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG CIEUC       # 
+
+A96E ; 1105 110F ;     ML      # ( ꥮ → ᄅᄏ ) HANGUL CHOSEONG RIEUL-KHIEUKH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KHIEUKH   # 
+11D8 ; 1105 110F ;     ML      # ( ᇘ → ᄅᄏ ) HANGUL JONGSEONG RIEUL-KHIEUKH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KHIEUKH  # →ᆯᆿ→
+
+11B4 ; 1105 1110 ;     ML      # ( ᆴ → ᄅᄐ ) HANGUL JONGSEONG RIEUL-THIEUTH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG THIEUTH  # →ᆯᇀ→
+313E ; 1105 1110 ;     ML      # ( ㄾ → ᄅᄐ ) HANGUL LETTER RIEUL-THIEUTH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG THIEUTH     # →ᆴ→→ᆯᇀ→
+
+11B5 ; 1105 1111 ;     ML      # ( ᆵ → ᄅᄑ ) HANGUL JONGSEONG RIEUL-PHIEUPH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PHIEUPH  # →ᆯᇁ→
+313F ; 1105 1111 ;     ML      # ( ㄿ → ᄅᄑ ) HANGUL LETTER RIEUL-PHIEUPH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PHIEUPH     # →ᆵ→→ᆯᇁ→
+
+111A ; 1105 1112 ;     ML      # ( ᄚ → ᄅᄒ ) HANGUL CHOSEONG RIEUL-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG HIEUH       # 
+3140 ; 1105 1112 ;     ML      # ( ㅀ → ᄅᄒ ) HANGUL LETTER RIEUL-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG HIEUH # →ᄚ→
+113B ; 1105 1112 ;     ML      # ( ᄻ → ᄅᄒ ) HANGUL CHOSEONG SIOS-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG HIEUH        # →ᄚ→
+11B6 ; 1105 1112 ;     ML      # ( ᆶ → ᄅᄒ ) HANGUL JONGSEONG RIEUL-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG HIEUH      # →ᄚ→
+D7F2 ; 1105 1112 ;     ML      # ( ퟲ → ᄅᄒ ) HANGUL JONGSEONG SIOS-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG HIEUH       # →ᆺᇂ→→ᄉᄒ→→ᄻ→→ᄚ→
+
+11D7 ; 1105 1140 ;     ML      # ( ᇗ → ᄅᅀ ) HANGUL JONGSEONG RIEUL-PANSIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PANSIOS  # →ᆯᇫ→
+316C ; 1105 1140 ;     ML      # ( ㅬ → ᄅᅀ ) HANGUL LETTER RIEUL-PANSIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PANSIOS     # →ᇗ→→ᆯᇫ→
+
+D7DB ; 1105 114C ;     ML      # ( ퟛ → ᄅᅌ ) HANGUL JONGSEONG RIEUL-YESIEUNG → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG YESIEUNG        # →ᆯᇰ→
+
+11D9 ; 1105 1159 ;     ML      # ( ᇙ → ᄅᅙ ) HANGUL JONGSEONG RIEUL-YEORINHIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG YEORINHIEUH  # →ᆯᇹ→
+316D ; 1105 1159 ;     ML      # ( ㅭ → ᄅᅙ ) HANGUL LETTER RIEUL-YEORINHIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG YEORINHIEUH     # →ᇙ→→ᆯᇹ→
+
+D7DC ; 1105 1159 1112 ;        ML      # ( ퟜ → ᄅᅙᄒ ) HANGUL JONGSEONG RIEUL-YEORINHIEUH-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG YEORINHIEUH, HANGUL CHOSEONG HIEUH  # →ᆯᇹᇂ→
+
+3141 ; 1106 ;  ML      # ( ㅁ → ᄆ ) HANGUL LETTER MIEUM → HANGUL CHOSEONG MIEUM # 
+11B7 ; 1106 ;  ML      # ( ᆷ → ᄆ ) HANGUL JONGSEONG MIEUM → HANGUL CHOSEONG MIEUM      # 
+
+A96F ; 1106 1100 ;     ML      # ( ꥯ → ᄆᄀ ) HANGUL CHOSEONG MIEUM-KIYEOK → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG KIYEOK     # 
+11DA ; 1106 1100 ;     ML      # ( ᇚ → ᄆᄀ ) HANGUL JONGSEONG MIEUM-KIYEOK → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG KIYEOK    # →ᆷᆨ→
+
+D7DE ; 1106 1102 ;     ML      # ( ퟞ → ᄆᄂ ) HANGUL JONGSEONG MIEUM-NIEUN → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG NIEUN      # →ᆷᆫ→
+
+D7DF ; 1106 1102 1102 ;        ML      # ( ퟟ → ᄆᄂᄂ ) HANGUL JONGSEONG MIEUM-SSANGNIEUN → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG NIEUN       # →ᆷᆫᆫ→
+
+A970 ; 1106 1103 ;     ML      # ( ꥰ → ᄆᄃ ) HANGUL CHOSEONG MIEUM-TIKEUT → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG TIKEUT     # 
+
+11DB ; 1106 1105 ;     ML      # ( ᇛ → ᄆᄅ ) HANGUL JONGSEONG MIEUM-RIEUL → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG RIEUL      # →ᆷᆯ→
+
+D7E0 ; 1106 1106 ;     ML      # ( ퟠ → ᄆᄆ ) HANGUL JONGSEONG SSANGMIEUM → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG MIEUM       # →ᆷᆷ→
+
+111C ; 1106 1107 ;     ML      # ( ᄜ → ᄆᄇ ) HANGUL CHOSEONG MIEUM-PIEUP → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG PIEUP       # 
+316E ; 1106 1107 ;     ML      # ( ㅮ → ᄆᄇ ) HANGUL LETTER MIEUM-PIEUP → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG PIEUP # →ᄜ→
+11DC ; 1106 1107 ;     ML      # ( ᇜ → ᄆᄇ ) HANGUL JONGSEONG MIEUM-PIEUP → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG PIEUP      # →ᄜ→
+
+D7E1 ; 1106 1107 1109 ;        ML      # ( ퟡ → ᄆᄇᄉ ) HANGUL JONGSEONG MIEUM-PIEUP-SIOS → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS        # →ᆷᆸᆺ→
+
+A971 ; 1106 1109 ;     ML      # ( ꥱ → ᄆᄉ ) HANGUL CHOSEONG MIEUM-SIOS → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG SIOS # 
+11DD ; 1106 1109 ;     ML      # ( ᇝ → ᄆᄉ ) HANGUL JONGSEONG MIEUM-SIOS → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG SIOS        # →ᆷᆺ→
+316F ; 1106 1109 ;     ML      # ( ㅯ → ᄆᄉ ) HANGUL LETTER MIEUM-SIOS → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG SIOS   # →ᇝ→→ᆷᆺ→
+
+11DE ; 1106 1109 1109 ;        ML      # ( ᇞ → ᄆᄉᄉ ) HANGUL JONGSEONG MIEUM-SSANGSIOS → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS  # →ᆷᆺᆺ→
+
+111D ; 1106 110B ;     ML      # ( ᄝ → ᄆᄋ ) HANGUL CHOSEONG KAPYEOUNMIEUM → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG IEUNG     # 
+3171 ; 1106 110B ;     ML      # ( ㅱ → ᄆᄋ ) HANGUL LETTER KAPYEOUNMIEUM → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG IEUNG       # →ᄝ→
+11E2 ; 1106 110B ;     ML      # ( ᇢ → ᄆᄋ ) HANGUL JONGSEONG KAPYEOUNMIEUM → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG IEUNG    # →ᄝ→
+
+D7E2 ; 1106 110C ;     ML      # ( ퟢ → ᄆᄌ ) HANGUL JONGSEONG MIEUM-CIEUC → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG CIEUC      # →ᆷᆽ→
+
+11E0 ; 1106 110E ;     ML      # ( ᇠ → ᄆᄎ ) HANGUL JONGSEONG MIEUM-CHIEUCH → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG CHIEUCH  # →ᆷᆾ→
+
+11E1 ; 1106 1112 ;     ML      # ( ᇡ → ᄆᄒ ) HANGUL JONGSEONG MIEUM-HIEUH → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG HIEUH      # →ᆷᇂ→
+
+11DF ; 1106 1140 ;     ML      # ( ᇟ → ᄆᅀ ) HANGUL JONGSEONG MIEUM-PANSIOS → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG PANSIOS  # →ᆷᇫ→
+3170 ; 1106 1140 ;     ML      # ( ㅰ → ᄆᅀ ) HANGUL LETTER MIEUM-PANSIOS → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG PANSIOS     # →ᇟ→→ᆷᇫ→
+
+3142 ; 1107 ;  ML      # ( ㅂ → ᄇ ) HANGUL LETTER PIEUP → HANGUL CHOSEONG PIEUP # 
+11B8 ; 1107 ;  ML      # ( ᆸ → ᄇ ) HANGUL JONGSEONG PIEUP → HANGUL CHOSEONG PIEUP      # 
+
+111E ; 1107 1100 ;     ML      # ( ᄞ → ᄇᄀ ) HANGUL CHOSEONG PIEUP-KIYEOK → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG KIYEOK     # 
+3172 ; 1107 1100 ;     ML      # ( ㅲ → ᄇᄀ ) HANGUL LETTER PIEUP-KIYEOK → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG KIYEOK       # →ᄞ→
+
+111F ; 1107 1102 ;     ML      # ( ᄟ → ᄇᄂ ) HANGUL CHOSEONG PIEUP-NIEUN → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG NIEUN       # 
+
+1120 ; 1107 1103 ;     ML      # ( ᄠ → ᄇᄃ ) HANGUL CHOSEONG PIEUP-TIKEUT → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG TIKEUT     # 
+3173 ; 1107 1103 ;     ML      # ( ㅳ → ᄇᄃ ) HANGUL LETTER PIEUP-TIKEUT → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG TIKEUT       # →ᄠ→
+D7E3 ; 1107 1103 ;     ML      # ( ퟣ → ᄇᄃ ) HANGUL JONGSEONG PIEUP-TIKEUT → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG TIKEUT    # →ᆸᆮ→
+
+11E3 ; 1107 1105 ;     ML      # ( ᇣ → ᄇᄅ ) HANGUL JONGSEONG PIEUP-RIEUL → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG RIEUL      # →ᆸᆯ→
+
+D7E4 ; 1107 1105 1111 ;        ML      # ( ퟤ → ᄇᄅᄑ ) HANGUL JONGSEONG PIEUP-RIEUL-PHIEUPH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PHIEUPH  # →ᆸᆯᇁ→
+
+D7E5 ; 1107 1106 ;     ML      # ( ퟥ → ᄇᄆ ) HANGUL JONGSEONG PIEUP-MIEUM → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG MIEUM      # →ᆸᆷ→
+
+1108 ; 1107 1107 ;     ML      # ( ᄈ → ᄇᄇ ) HANGUL CHOSEONG SSANGPIEUP → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PIEUP        # 
+3143 ; 1107 1107 ;     ML      # ( ㅃ → ᄇᄇ ) HANGUL LETTER SSANGPIEUP → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PIEUP  # →ᄈ→
+D7E6 ; 1107 1107 ;     ML      # ( ퟦ → ᄇᄇ ) HANGUL JONGSEONG SSANGPIEUP → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PIEUP       # →ᆸᆸ→
+
+112C ; 1107 1107 110B ;        ML      # ( ᄬ → ᄇᄇᄋ ) HANGUL CHOSEONG KAPYEOUNSSANGPIEUP → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG      # 
+3179 ; 1107 1107 110B ;        ML      # ( ㅹ → ᄇᄇᄋ ) HANGUL LETTER KAPYEOUNSSANGPIEUP → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG        # →ᄬ→
+
+1121 ; 1107 1109 ;     ML      # ( ᄡ → ᄇᄉ ) HANGUL CHOSEONG PIEUP-SIOS → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS # 
+3144 ; 1107 1109 ;     ML      # ( ㅄ → ᄇᄉ ) HANGUL LETTER PIEUP-SIOS → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS   # →ᄡ→
+11B9 ; 1107 1109 ;     ML      # ( ᆹ → ᄇᄉ ) HANGUL JONGSEONG PIEUP-SIOS → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS        # →ᄡ→
+
+1122 ; 1107 1109 1100 ;        ML      # ( ᄢ → ᄇᄉᄀ ) HANGUL CHOSEONG PIEUP-SIOS-KIYEOK → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK       # 
+3174 ; 1107 1109 1100 ;        ML      # ( ㅴ → ᄇᄉᄀ ) HANGUL LETTER PIEUP-SIOS-KIYEOK → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK # →ᄢ→
+
+1123 ; 1107 1109 1103 ;        ML      # ( ᄣ → ᄇᄉᄃ ) HANGUL CHOSEONG PIEUP-SIOS-TIKEUT → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG TIKEUT       # 
+3175 ; 1107 1109 1103 ;        ML      # ( ㅵ → ᄇᄉᄃ ) HANGUL LETTER PIEUP-SIOS-TIKEUT → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG TIKEUT # →ᄣ→
+D7E7 ; 1107 1109 1103 ;        ML      # ( ퟧ → ᄇᄉᄃ ) HANGUL JONGSEONG PIEUP-SIOS-TIKEUT → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG TIKEUT      # →ᆸᆺᆮ→
+
+1124 ; 1107 1109 1107 ;        ML      # ( ᄤ → ᄇᄉᄇ ) HANGUL CHOSEONG PIEUP-SIOS-PIEUP → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PIEUP # 
+
+1125 ; 1107 1109 1109 ;        ML      # ( ᄥ → ᄇᄉᄉ ) HANGUL CHOSEONG PIEUP-SSANGSIOS → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS   # 
+
+1126 ; 1107 1109 110C ;        ML      # ( ᄦ → ᄇᄉᄌ ) HANGUL CHOSEONG PIEUP-SIOS-CIEUC → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG CIEUC # 
+
+A972 ; 1107 1109 1110 ;        ML      # ( ꥲ → ᄇᄉᄐ ) HANGUL CHOSEONG PIEUP-SIOS-THIEUTH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG THIEUTH     # 
+
+112B ; 1107 110B ;     ML      # ( ᄫ → ᄇᄋ ) HANGUL CHOSEONG KAPYEOUNPIEUP → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG     # 
+3178 ; 1107 110B ;     ML      # ( ㅸ → ᄇᄋ ) HANGUL LETTER KAPYEOUNPIEUP → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG       # →ᄫ→
+11E6 ; 1107 110B ;     ML      # ( ᇦ → ᄇᄋ ) HANGUL JONGSEONG KAPYEOUNPIEUP → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG    # →ᄫ→
+
+1127 ; 1107 110C ;     ML      # ( ᄧ → ᄇᄌ ) HANGUL CHOSEONG PIEUP-CIEUC → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG CIEUC       # 
+3176 ; 1107 110C ;     ML      # ( ㅶ → ᄇᄌ ) HANGUL LETTER PIEUP-CIEUC → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG CIEUC # →ᄧ→
+D7E8 ; 1107 110C ;     ML      # ( ퟨ → ᄇᄌ ) HANGUL JONGSEONG PIEUP-CIEUC → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG CIEUC      # →ᆸᆽ→
+
+1128 ; 1107 110E ;     ML      # ( ᄨ → ᄇᄎ ) HANGUL CHOSEONG PIEUP-CHIEUCH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG CHIEUCH   # 
+D7E9 ; 1107 110E ;     ML      # ( ퟩ → ᄇᄎ ) HANGUL JONGSEONG PIEUP-CHIEUCH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG CHIEUCH  # →ᆸᆾ→
+
+A973 ; 1107 110F ;     ML      # ( ꥳ → ᄇᄏ ) HANGUL CHOSEONG PIEUP-KHIEUKH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG KHIEUKH   # 
+
+1129 ; 1107 1110 ;     ML      # ( ᄩ → ᄇᄐ ) HANGUL CHOSEONG PIEUP-THIEUTH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG THIEUTH   # 
+3177 ; 1107 1110 ;     ML      # ( ㅷ → ᄇᄐ ) HANGUL LETTER PIEUP-THIEUTH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG THIEUTH     # →ᄩ→
+
+112A ; 1107 1111 ;     ML      # ( ᄪ → ᄇᄑ ) HANGUL CHOSEONG PIEUP-PHIEUPH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PHIEUPH   # 
+11E4 ; 1107 1111 ;     ML      # ( ᇤ → ᄇᄑ ) HANGUL JONGSEONG PIEUP-PHIEUPH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PHIEUPH  # →ᆸᇁ→
+
+A974 ; 1107 1112 ;     ML      # ( ꥴ → ᄇᄒ ) HANGUL CHOSEONG PIEUP-HIEUH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG HIEUH       # 
+11E5 ; 1107 1112 ;     ML      # ( ᇥ → ᄇᄒ ) HANGUL JONGSEONG PIEUP-HIEUH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG HIEUH      # →ᆸᇂ→
+
+3145 ; 1109 ;  ML      # ( ㅅ → ᄉ ) HANGUL LETTER SIOS → HANGUL CHOSEONG SIOS   # 
+11BA ; 1109 ;  ML      # ( ᆺ → ᄉ ) HANGUL JONGSEONG SIOS → HANGUL CHOSEONG SIOS        # 
+
+112D ; 1109 1100 ;     ML      # ( ᄭ → ᄉᄀ ) HANGUL CHOSEONG SIOS-KIYEOK → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK       # 
+317A ; 1109 1100 ;     ML      # ( ㅺ → ᄉᄀ ) HANGUL LETTER SIOS-KIYEOK → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK # →ᄭ→
+11E7 ; 1109 1100 ;     ML      # ( ᇧ → ᄉᄀ ) HANGUL JONGSEONG SIOS-KIYEOK → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK      # →ᄭ→
+
+112E ; 1109 1102 ;     ML      # ( ᄮ → ᄉᄂ ) HANGUL CHOSEONG SIOS-NIEUN → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG NIEUN # 
+317B ; 1109 1102 ;     ML      # ( ㅻ → ᄉᄂ ) HANGUL LETTER SIOS-NIEUN → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG NIEUN   # →ᄮ→
+
+112F ; 1109 1103 ;     ML      # ( ᄯ → ᄉᄃ ) HANGUL CHOSEONG SIOS-TIKEUT → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG TIKEUT       # 
+317C ; 1109 1103 ;     ML      # ( ㅼ → ᄉᄃ ) HANGUL LETTER SIOS-TIKEUT → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG TIKEUT # →ᄯ→
+11E8 ; 1109 1103 ;     ML      # ( ᇨ → ᄉᄃ ) HANGUL JONGSEONG SIOS-TIKEUT → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG TIKEUT      # →ᄯ→
+
+1130 ; 1109 1105 ;     ML      # ( ᄰ → ᄉᄅ ) HANGUL CHOSEONG SIOS-RIEUL → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG RIEUL # 
+11E9 ; 1109 1105 ;     ML      # ( ᇩ → ᄉᄅ ) HANGUL JONGSEONG SIOS-RIEUL → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG RIEUL        # →ᄰ→
+
+1131 ; 1109 1106 ;     ML      # ( ᄱ → ᄉᄆ ) HANGUL CHOSEONG SIOS-MIEUM → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG MIEUM # 
+D7EA ; 1109 1106 ;     ML      # ( ퟪ → ᄉᄆ ) HANGUL JONGSEONG SIOS-MIEUM → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG MIEUM        # →ᆺᆷ→
+
+1132 ; 1109 1107 ;     ML      # ( ᄲ → ᄉᄇ ) HANGUL CHOSEONG SIOS-PIEUP → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PIEUP # 
+317D ; 1109 1107 ;     ML      # ( ㅽ → ᄉᄇ ) HANGUL LETTER SIOS-PIEUP → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PIEUP   # →ᄲ→
+11EA ; 1109 1107 ;     ML      # ( ᇪ → ᄉᄇ ) HANGUL JONGSEONG SIOS-PIEUP → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PIEUP        # →ᄲ→
+
+1133 ; 1109 1107 1100 ;        ML      # ( ᄳ → ᄉᄇᄀ ) HANGUL CHOSEONG SIOS-PIEUP-KIYEOK → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG KIYEOK       # 
+
+D7EB ; 1109 1107 110B ;        ML      # ( ퟫ → ᄉᄇᄋ ) HANGUL JONGSEONG SIOS-KAPYEOUNPIEUP → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG      # →ᆺᆸᆼ→
+
+110A ; 1109 1109 ;     ML      # ( ᄊ → ᄉᄉ ) HANGUL CHOSEONG SSANGSIOS → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS   # 
+3146 ; 1109 1109 ;     ML      # ( ㅆ → ᄉᄉ ) HANGUL LETTER SSANGSIOS → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS     # →ᄊ→
+11BB ; 1109 1109 ;     ML      # ( ᆻ → ᄉᄉ ) HANGUL JONGSEONG SSANGSIOS → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS  # →ᄊ→
+
+D7EC ; 1109 1109 1100 ;        ML      # ( ퟬ → ᄉᄉᄀ ) HANGUL JONGSEONG SSANGSIOS-KIYEOK → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK        # →ᆺᆺᆨ→
+
+D7ED ; 1109 1109 1103 ;        ML      # ( ퟭ → ᄉᄉᄃ ) HANGUL JONGSEONG SSANGSIOS-TIKEUT → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG TIKEUT        # →ᆺᆺᆮ→
+
+A975 ; 1109 1109 1107 ;        ML      # ( ꥵ → ᄉᄉᄇ ) HANGUL CHOSEONG SSANGSIOS-PIEUP → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PIEUP   # 
+
+1134 ; 1109 1109 1109 ;        ML      # ( ᄴ → ᄉᄉᄉ ) HANGUL CHOSEONG SIOS-SSANGSIOS → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS     # 
+
+1135 ; 1109 110B ;     ML      # ( ᄵ → ᄉᄋ ) HANGUL CHOSEONG SIOS-IEUNG → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG IEUNG # 
+
+1136 ; 1109 110C ;     ML      # ( ᄶ → ᄉᄌ ) HANGUL CHOSEONG SIOS-CIEUC → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG CIEUC # 
+317E ; 1109 110C ;     ML      # ( ㅾ → ᄉᄌ ) HANGUL LETTER SIOS-CIEUC → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG CIEUC   # →ᄶ→
+D7EF ; 1109 110C ;     ML      # ( ퟯ → ᄉᄌ ) HANGUL JONGSEONG SIOS-CIEUC → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG CIEUC        # →ᆺᆽ→
+
+1137 ; 1109 110E ;     ML      # ( ᄷ → ᄉᄎ ) HANGUL CHOSEONG SIOS-CHIEUCH → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG CHIEUCH     # 
+D7F0 ; 1109 110E ;     ML      # ( ퟰ → ᄉᄎ ) HANGUL JONGSEONG SIOS-CHIEUCH → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG CHIEUCH    # →ᆺᆾ→
+
+1138 ; 1109 110F ;     ML      # ( ᄸ → ᄉᄏ ) HANGUL CHOSEONG SIOS-KHIEUKH → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KHIEUKH     # 
+
+1139 ; 1109 1110 ;     ML      # ( ᄹ → ᄉᄐ ) HANGUL CHOSEONG SIOS-THIEUTH → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG THIEUTH     # 
+D7F1 ; 1109 1110 ;     ML      # ( ퟱ → ᄉᄐ ) HANGUL JONGSEONG SIOS-THIEUTH → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG THIEUTH    # →ᆺᇀ→
+
+113A ; 1109 1111 ;     ML      # ( ᄺ → ᄉᄑ ) HANGUL CHOSEONG SIOS-PHIEUPH → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PHIEUPH     # 
+
+D7EE ; 1109 1140 ;     ML      # ( ퟮ → ᄉᅀ ) HANGUL JONGSEONG SIOS-PANSIOS → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PANSIOS    # →ᆺᇫ→
+
+3147 ; 110B ;  ML      # ( ㅇ → ᄋ ) HANGUL LETTER IEUNG → HANGUL CHOSEONG IEUNG # 
+11BC ; 110B ;  ML      # ( ᆼ → ᄋ ) HANGUL JONGSEONG IEUNG → HANGUL CHOSEONG IEUNG      # 
+
+1141 ; 110B 1100 ;     ML      # ( ᅁ → ᄋᄀ ) HANGUL CHOSEONG IEUNG-KIYEOK → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG KIYEOK     # 
+11EC ; 110B 1100 ;     ML      # ( ᇬ → ᄋᄀ ) HANGUL JONGSEONG IEUNG-KIYEOK → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG KIYEOK    # →ᅁ→
+
+11ED ; 110B 1100 1100 ;        ML      # ( ᇭ → ᄋᄀᄀ ) HANGUL JONGSEONG IEUNG-SSANGKIYEOK → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG KIYEOK    # →ᆼᆨᆨ→
+
+1142 ; 110B 1103 ;     ML      # ( ᅂ → ᄋᄃ ) HANGUL CHOSEONG IEUNG-TIKEUT → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG TIKEUT     # 
+
+A976 ; 110B 1105 ;     ML      # ( ꥶ → ᄋᄅ ) HANGUL CHOSEONG IEUNG-RIEUL → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG RIEUL       # 
+
+1143 ; 110B 1106 ;     ML      # ( ᅃ → ᄋᄆ ) HANGUL CHOSEONG IEUNG-MIEUM → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG MIEUM       # 
+
+1144 ; 110B 1107 ;     ML      # ( ᅄ → ᄋᄇ ) HANGUL CHOSEONG IEUNG-PIEUP → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG PIEUP       # 
+
+1145 ; 110B 1109 ;     ML      # ( ᅅ → ᄋᄉ ) HANGUL CHOSEONG IEUNG-SIOS → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG SIOS # 
+11F1 ; 110B 1109 ;     ML      # ( ᇱ → ᄋᄉ ) HANGUL JONGSEONG YESIEUNG-SIOS → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG SIOS     # →ᅅ→
+3182 ; 110B 1109 ;     ML      # ( ㆂ → ᄋᄉ ) HANGUL LETTER YESIEUNG-SIOS → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG SIOS        # →ᇱ→→ᅅ→
+
+1147 ; 110B 110B ;     ML      # ( ᅇ → ᄋᄋ ) HANGUL CHOSEONG SSANGIEUNG → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG IEUNG        # 
+3180 ; 110B 110B ;     ML      # ( ㆀ → ᄋᄋ ) HANGUL LETTER SSANGIEUNG → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG IEUNG  # →ᅇ→
+11EE ; 110B 110B ;     ML      # ( ᇮ → ᄋᄋ ) HANGUL JONGSEONG SSANGIEUNG → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG IEUNG       # →ᅇ→
+
+1148 ; 110B 110C ;     ML      # ( ᅈ → ᄋᄌ ) HANGUL CHOSEONG IEUNG-CIEUC → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG CIEUC       # 
+
+1149 ; 110B 110E ;     ML      # ( ᅉ → ᄋᄎ ) HANGUL CHOSEONG IEUNG-CHIEUCH → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG CHIEUCH   # 
+
+11EF ; 110B 110F ;     ML      # ( ᇯ → ᄋᄏ ) HANGUL JONGSEONG IEUNG-KHIEUKH → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG KHIEUKH  # →ᆼᆿ→
+
+114A ; 110B 1110 ;     ML      # ( ᅊ → ᄋᄐ ) HANGUL CHOSEONG IEUNG-THIEUTH → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG THIEUTH   # 
+
+114B ; 110B 1111 ;     ML      # ( ᅋ → ᄋᄑ ) HANGUL CHOSEONG IEUNG-PHIEUPH → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG PHIEUPH   # 
+
+A977 ; 110B 1112 ;     ML      # ( ꥷ → ᄋᄒ ) HANGUL CHOSEONG IEUNG-HIEUH → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG HIEUH       # 
+
+1146 ; 110B 1140 ;     ML      # ( ᅆ → ᄋᅀ ) HANGUL CHOSEONG IEUNG-PANSIOS → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG PANSIOS   # 
+11F2 ; 110B 1140 ;     ML      # ( ᇲ → ᄋᅀ ) HANGUL JONGSEONG YESIEUNG-PANSIOS → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG PANSIOS       # →ᅆ→
+3183 ; 110B 1140 ;     ML      # ( ㆃ → ᄋᅀ ) HANGUL LETTER YESIEUNG-PANSIOS → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG PANSIOS  # →ᇲ→→ᅆ→
+
+3148 ; 110C ;  ML      # ( ㅈ → ᄌ ) HANGUL LETTER CIEUC → HANGUL CHOSEONG CIEUC # 
+11BD ; 110C ;  ML      # ( ᆽ → ᄌ ) HANGUL JONGSEONG CIEUC → HANGUL CHOSEONG CIEUC      # 
+
+D7F7 ; 110C 1107 ;     ML      # ( ퟷ → ᄌᄇ ) HANGUL JONGSEONG CIEUC-PIEUP → HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG PIEUP      # →ᆽᆸ→
+
+D7F8 ; 110C 1107 1107 ;        ML      # ( ퟸ → ᄌᄇᄇ ) HANGUL JONGSEONG CIEUC-SSANGPIEUP → HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PIEUP       # →ᆽᆸᆸ→
+
+114D ; 110C 110B ;     ML      # ( ᅍ → ᄌᄋ ) HANGUL CHOSEONG CIEUC-IEUNG → HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG IEUNG       # 
+
+110D ; 110C 110C ;     ML      # ( ᄍ → ᄌᄌ ) HANGUL CHOSEONG SSANGCIEUC → HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG CIEUC        # 
+3149 ; 110C 110C ;     ML      # ( ㅉ → ᄌᄌ ) HANGUL LETTER SSANGCIEUC → HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG CIEUC  # →ᄍ→
+D7F9 ; 110C 110C ;     ML      # ( ퟹ → ᄌᄌ ) HANGUL JONGSEONG SSANGCIEUC → HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG CIEUC       # →ᆽᆽ→
+
+A978 ; 110C 110C 1112 ;        ML      # ( ꥸ → ᄌᄌᄒ ) HANGUL CHOSEONG SSANGCIEUC-HIEUH → HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG HIEUH        # 
+
+314A ; 110E ;  ML      # ( ㅊ → ᄎ ) HANGUL LETTER CHIEUCH → HANGUL CHOSEONG CHIEUCH     # 
+11BE ; 110E ;  ML      # ( ᆾ → ᄎ ) HANGUL JONGSEONG CHIEUCH → HANGUL CHOSEONG CHIEUCH  # 
+
+1152 ; 110E 110F ;     ML      # ( ᅒ → ᄎᄏ ) HANGUL CHOSEONG CHIEUCH-KHIEUKH → HANGUL CHOSEONG CHIEUCH, HANGUL CHOSEONG KHIEUKH       # 
+
+1153 ; 110E 1112 ;     ML      # ( ᅓ → ᄎᄒ ) HANGUL CHOSEONG CHIEUCH-HIEUH → HANGUL CHOSEONG CHIEUCH, HANGUL CHOSEONG HIEUH   # 
+
+314B ; 110F ;  ML      # ( ㅋ → ᄏ ) HANGUL LETTER KHIEUKH → HANGUL CHOSEONG KHIEUKH     # 
+11BF ; 110F ;  ML      # ( ᆿ → ᄏ ) HANGUL JONGSEONG KHIEUKH → HANGUL CHOSEONG KHIEUKH  # 
+
+314C ; 1110 ;  ML      # ( ㅌ → ᄐ ) HANGUL LETTER THIEUTH → HANGUL CHOSEONG THIEUTH     # 
+11C0 ; 1110 ;  ML      # ( ᇀ → ᄐ ) HANGUL JONGSEONG THIEUTH → HANGUL CHOSEONG THIEUTH  # 
+
+A979 ; 1110 1110 ;     ML      # ( ꥹ → ᄐᄐ ) HANGUL CHOSEONG SSANGTHIEUTH → HANGUL CHOSEONG THIEUTH, HANGUL CHOSEONG THIEUTH  # 
+
+314D ; 1111 ;  ML      # ( ㅍ → ᄑ ) HANGUL LETTER PHIEUPH → HANGUL CHOSEONG PHIEUPH     # 
+11C1 ; 1111 ;  ML      # ( ᇁ → ᄑ ) HANGUL JONGSEONG PHIEUPH → HANGUL CHOSEONG PHIEUPH  # 
+
+1156 ; 1111 1107 ;     ML      # ( ᅖ → ᄑᄇ ) HANGUL CHOSEONG PHIEUPH-PIEUP → HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG PIEUP   # 
+11F3 ; 1111 1107 ;     ML      # ( ᇳ → ᄑᄇ ) HANGUL JONGSEONG PHIEUPH-PIEUP → HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG PIEUP  # →ᅖ→
+
+D7FA ; 1111 1109 ;     ML      # ( ퟺ → ᄑᄉ ) HANGUL JONGSEONG PHIEUPH-SIOS → HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG SIOS    # →ᇁᆺ→
+
+1157 ; 1111 110B ;     ML      # ( ᅗ → ᄑᄋ ) HANGUL CHOSEONG KAPYEOUNPHIEUPH → HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG IEUNG # 
+3184 ; 1111 110B ;     ML      # ( ㆄ → ᄑᄋ ) HANGUL LETTER KAPYEOUNPHIEUPH → HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG IEUNG   # →ᅗ→
+11F4 ; 1111 110B ;     ML      # ( ᇴ → ᄑᄋ ) HANGUL JONGSEONG KAPYEOUNPHIEUPH → HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG IEUNG        # →ᅗ→
+
+D7FB ; 1111 1110 ;     ML      # ( ퟻ → ᄑᄐ ) HANGUL JONGSEONG PHIEUPH-THIEUTH → HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG THIEUTH      # →ᇁᇀ→
+
+A97A ; 1111 1112 ;     ML      # ( ꥺ → ᄑᄒ ) HANGUL CHOSEONG PHIEUPH-HIEUH → HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG HIEUH   # 
+
+314E ; 1112 ;  ML      # ( ㅎ → ᄒ ) HANGUL LETTER HIEUH → HANGUL CHOSEONG HIEUH # 
+11C2 ; 1112 ;  ML      # ( ᇂ → ᄒ ) HANGUL JONGSEONG HIEUH → HANGUL CHOSEONG HIEUH      # 
+
+11F5 ; 1112 1102 ;     ML      # ( ᇵ → ᄒᄂ ) HANGUL JONGSEONG HIEUH-NIEUN → HANGUL CHOSEONG HIEUH, HANGUL CHOSEONG NIEUN      # →ᇂᆫ→
+
+11F6 ; 1112 1105 ;     ML      # ( ᇶ → ᄒᄅ ) HANGUL JONGSEONG HIEUH-RIEUL → HANGUL CHOSEONG HIEUH, HANGUL CHOSEONG RIEUL      # →ᇂᆯ→
+
+11F7 ; 1112 1106 ;     ML      # ( ᇷ → ᄒᄆ ) HANGUL JONGSEONG HIEUH-MIEUM → HANGUL CHOSEONG HIEUH, HANGUL CHOSEONG MIEUM      # →ᇂᆷ→
+
+11F8 ; 1112 1107 ;     ML      # ( ᇸ → ᄒᄇ ) HANGUL JONGSEONG HIEUH-PIEUP → HANGUL CHOSEONG HIEUH, HANGUL CHOSEONG PIEUP      # →ᇂᆸ→
+
+A97B ; 1112 1109 ;     ML      # ( ꥻ → ᄒᄉ ) HANGUL CHOSEONG HIEUH-SIOS → HANGUL CHOSEONG HIEUH, HANGUL CHOSEONG SIOS # 
+
+1158 ; 1112 1112 ;     ML      # ( ᅘ → ᄒᄒ ) HANGUL CHOSEONG SSANGHIEUH → HANGUL CHOSEONG HIEUH, HANGUL CHOSEONG HIEUH        # 
+3185 ; 1112 1112 ;     ML      # ( ㆅ → ᄒᄒ ) HANGUL LETTER SSANGHIEUH → HANGUL CHOSEONG HIEUH, HANGUL CHOSEONG HIEUH  # →ᅘ→
+
+113D ; 113C 113C ;     ML      # ( ᄽ → ᄼᄼ ) HANGUL CHOSEONG CHITUEUMSSANGSIOS → HANGUL CHOSEONG CHITUEUMSIOS, HANGUL CHOSEONG CHITUEUMSIOS   # 
+
+113F ; 113E 113E ;     ML      # ( ᄿ → ᄾᄾ ) HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS → HANGUL CHOSEONG CEONGCHIEUMSIOS, HANGUL CHOSEONG CEONGCHIEUMSIOS  # 
+
+317F ; 1140 ;  ML      # ( ㅿ → ᅀ ) HANGUL LETTER PANSIOS → HANGUL CHOSEONG PANSIOS     # 
+11EB ; 1140 ;  ML      # ( ᇫ → ᅀ ) HANGUL JONGSEONG PANSIOS → HANGUL CHOSEONG PANSIOS  # 
+
+D7F3 ; 1140 1107 ;     ML      # ( ퟳ → ᅀᄇ ) HANGUL JONGSEONG PANSIOS-PIEUP → HANGUL CHOSEONG PANSIOS, HANGUL CHOSEONG PIEUP  # →ᇫᆸ→
+
+D7F4 ; 1140 1107 110B ;        ML      # ( ퟴ → ᅀᄇᄋ ) HANGUL JONGSEONG PANSIOS-KAPYEOUNPIEUP → HANGUL CHOSEONG PANSIOS, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG        # →ᇫᆸᆼ→
+
+3181 ; 114C ;  ML      # ( ㆁ → ᅌ ) HANGUL LETTER YESIEUNG → HANGUL CHOSEONG YESIEUNG   # 
+11F0 ; 114C ;  ML      # ( ᇰ → ᅌ ) HANGUL JONGSEONG YESIEUNG → HANGUL CHOSEONG YESIEUNG        # 
+
+D7F5 ; 114C 1106 ;     ML      # ( ퟵ → ᅌᄆ ) HANGUL JONGSEONG YESIEUNG-MIEUM → HANGUL CHOSEONG YESIEUNG, HANGUL CHOSEONG MIEUM        # →ᇰᆷ→
+
+D7F6 ; 114C 1112 ;     ML      # ( ퟶ → ᅌᄒ ) HANGUL JONGSEONG YESIEUNG-HIEUH → HANGUL CHOSEONG YESIEUNG, HANGUL CHOSEONG HIEUH        # →ᇰᇂ→
+
+114F ; 114E 114E ;     ML      # ( ᅏ → ᅎᅎ ) HANGUL CHOSEONG CHITUEUMSSANGCIEUC → HANGUL CHOSEONG CHITUEUMCIEUC, HANGUL CHOSEONG CHITUEUMCIEUC        # 
+
+1151 ; 1150 1150 ;     ML      # ( ᅑ → ᅐᅐ ) HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC → HANGUL CHOSEONG CEONGCHIEUMCIEUC, HANGUL CHOSEONG CEONGCHIEUMCIEUC       # 
+
+3186 ; 1159 ;  ML      # ( ㆆ → ᅙ ) HANGUL LETTER YEORINHIEUH → HANGUL CHOSEONG YEORINHIEUH     # 
+11F9 ; 1159 ;  ML      # ( ᇹ → ᅙ ) HANGUL JONGSEONG YEORINHIEUH → HANGUL CHOSEONG YEORINHIEUH  # 
+
+A97C ; 1159 1159 ;     ML      # ( ꥼ → ᅙᅙ ) HANGUL CHOSEONG SSANGYEORINHIEUH → HANGUL CHOSEONG YEORINHIEUH, HANGUL CHOSEONG YEORINHIEUH      # 
+
+3164 ; 1160 ;  ML      # (  →  ) HANGUL FILLER → HANGUL JUNGSEONG FILLER   # 
+
+314F ; 1161 ;  ML      # ( ㅏ → ᅡ ) HANGUL LETTER A → HANGUL JUNGSEONG A        # 
+
+1176 ; 1161 1169 ;     ML      # ( ᅶ → ᅡᅩ ) HANGUL JUNGSEONG A-O → HANGUL JUNGSEONG A, HANGUL JUNGSEONG O    # 
+
+1177 ; 1161 116E ;     ML      # ( ᅷ → ᅡᅮ ) HANGUL JUNGSEONG A-U → HANGUL JUNGSEONG A, HANGUL JUNGSEONG U    # 
+
+11A3 ; 1161 1173 ;     ML      # ( ᆣ → ᅡᅳ ) HANGUL JUNGSEONG A-EU → HANGUL JUNGSEONG A, HANGUL JUNGSEONG EU  # 
+
+1162 ; 1161 1175 ;     ML      # ( ᅢ → ᅡᅵ ) HANGUL JUNGSEONG AE → HANGUL JUNGSEONG A, HANGUL JUNGSEONG I     # 
+3150 ; 1161 1175 ;     ML      # ( ㅐ → ᅡᅵ ) HANGUL LETTER AE → HANGUL JUNGSEONG A, HANGUL JUNGSEONG I        # →ᅢ→
+
+3151 ; 1163 ;  ML      # ( ㅑ → ᅣ ) HANGUL LETTER YA → HANGUL JUNGSEONG YA      # 
+
+1178 ; 1163 1169 ;     ML      # ( ᅸ → ᅣᅩ ) HANGUL JUNGSEONG YA-O → HANGUL JUNGSEONG YA, HANGUL JUNGSEONG O  # 
+
+1179 ; 1163 116D ;     ML      # ( ᅹ → ᅣᅭ ) HANGUL JUNGSEONG YA-YO → HANGUL JUNGSEONG YA, HANGUL JUNGSEONG YO        # 
+
+11A4 ; 1163 116E ;     ML      # ( ᆤ → ᅣᅮ ) HANGUL JUNGSEONG YA-U → HANGUL JUNGSEONG YA, HANGUL JUNGSEONG U  # 
+
+1164 ; 1163 1175 ;     ML      # ( ᅤ → ᅣᅵ ) HANGUL JUNGSEONG YAE → HANGUL JUNGSEONG YA, HANGUL JUNGSEONG I   # 
+3152 ; 1163 1175 ;     ML      # ( ㅒ → ᅣᅵ ) HANGUL LETTER YAE → HANGUL JUNGSEONG YA, HANGUL JUNGSEONG I      # →ᅤ→
+
+3153 ; 1165 ;  ML      # ( ㅓ → ᅥ ) HANGUL LETTER EO → HANGUL JUNGSEONG EO      # 
+
+117A ; 1165 1169 ;     ML      # ( ᅺ → ᅥᅩ ) HANGUL JUNGSEONG EO-O → HANGUL JUNGSEONG EO, HANGUL JUNGSEONG O  # 
+
+117B ; 1165 116E ;     ML      # ( ᅻ → ᅥᅮ ) HANGUL JUNGSEONG EO-U → HANGUL JUNGSEONG EO, HANGUL JUNGSEONG U  # 
+
+117C ; 1165 1173 ;     ML      # ( ᅼ → ᅥᅳ ) HANGUL JUNGSEONG EO-EU → HANGUL JUNGSEONG EO, HANGUL JUNGSEONG EU        # 
+
+1166 ; 1165 1175 ;     ML      # ( ᅦ → ᅥᅵ ) HANGUL JUNGSEONG E → HANGUL JUNGSEONG EO, HANGUL JUNGSEONG I     # 
+3154 ; 1165 1175 ;     ML      # ( ㅔ → ᅥᅵ ) HANGUL LETTER E → HANGUL JUNGSEONG EO, HANGUL JUNGSEONG I        # →ᅦ→
+
+3155 ; 1167 ;  ML      # ( ㅕ → ᅧ ) HANGUL LETTER YEO → HANGUL JUNGSEONG YEO    # 
+
+11A5 ; 1167 1163 ;     ML      # ( ᆥ → ᅧᅣ ) HANGUL JUNGSEONG YEO-YA → HANGUL JUNGSEONG YEO, HANGUL JUNGSEONG YA      # 
+
+117D ; 1167 1169 ;     ML      # ( ᅽ → ᅧᅩ ) HANGUL JUNGSEONG YEO-O → HANGUL JUNGSEONG YEO, HANGUL JUNGSEONG O        # 
+
+117E ; 1167 116E ;     ML      # ( ᅾ → ᅧᅮ ) HANGUL JUNGSEONG YEO-U → HANGUL JUNGSEONG YEO, HANGUL JUNGSEONG U        # 
+
+1168 ; 1167 1175 ;     ML      # ( ᅨ → ᅧᅵ ) HANGUL JUNGSEONG YE → HANGUL JUNGSEONG YEO, HANGUL JUNGSEONG I   # 
+3156 ; 1167 1175 ;     ML      # ( ㅖ → ᅧᅵ ) HANGUL LETTER YE → HANGUL JUNGSEONG YEO, HANGUL JUNGSEONG I      # →ᅨ→
+
+3157 ; 1169 ;  ML      # ( ㅗ → ᅩ ) HANGUL LETTER O → HANGUL JUNGSEONG O        # 
+
+116A ; 1169 1161 ;     ML      # ( ᅪ → ᅩᅡ ) HANGUL JUNGSEONG WA → HANGUL JUNGSEONG O, HANGUL JUNGSEONG A     # 
+3158 ; 1169 1161 ;     ML      # ( ㅘ → ᅩᅡ ) HANGUL LETTER WA → HANGUL JUNGSEONG O, HANGUL JUNGSEONG A        # →ᅪ→
+
+116B ; 1169 1161 1175 ;        ML      # ( ᅫ → ᅩᅡᅵ ) HANGUL JUNGSEONG WAE → HANGUL JUNGSEONG O, HANGUL JUNGSEONG A, HANGUL JUNGSEONG I     # 
+3159 ; 1169 1161 1175 ;        ML      # ( ㅙ → ᅩᅡᅵ ) HANGUL LETTER WAE → HANGUL JUNGSEONG O, HANGUL JUNGSEONG A, HANGUL JUNGSEONG I        # →ᅫ→
+
+11A6 ; 1169 1163 ;     ML      # ( ᆦ → ᅩᅣ ) HANGUL JUNGSEONG O-YA → HANGUL JUNGSEONG O, HANGUL JUNGSEONG YA  # 
+
+11A7 ; 1169 1163 1175 ;        ML      # ( ᆧ → ᅩᅣᅵ ) HANGUL JUNGSEONG O-YAE → HANGUL JUNGSEONG O, HANGUL JUNGSEONG YA, HANGUL JUNGSEONG I  # 
+
+117F ; 1169 1165 ;     ML      # ( ᅿ → ᅩᅥ ) HANGUL JUNGSEONG O-EO → HANGUL JUNGSEONG O, HANGUL JUNGSEONG EO  # 
+
+1180 ; 1169 1165 1175 ;        ML      # ( ᆀ → ᅩᅥᅵ ) HANGUL JUNGSEONG O-E → HANGUL JUNGSEONG O, HANGUL JUNGSEONG EO, HANGUL JUNGSEONG I    # 
+
+D7B0 ; 1169 1167 ;     ML      # ( ힰ → ᅩᅧ ) HANGUL JUNGSEONG O-YEO → HANGUL JUNGSEONG O, HANGUL JUNGSEONG YEO        # 
+
+1181 ; 1169 1167 1175 ;        ML      # ( ᆁ → ᅩᅧᅵ ) HANGUL JUNGSEONG O-YE → HANGUL JUNGSEONG O, HANGUL JUNGSEONG YEO, HANGUL JUNGSEONG I  # 
+
+1182 ; 1169 1169 ;     ML      # ( ᆂ → ᅩᅩ ) HANGUL JUNGSEONG O-O → HANGUL JUNGSEONG O, HANGUL JUNGSEONG O    # 
+
+D7B1 ; 1169 1169 1175 ;        ML      # ( ힱ → ᅩᅩᅵ ) HANGUL JUNGSEONG O-O-I → HANGUL JUNGSEONG O, HANGUL JUNGSEONG O, HANGUL JUNGSEONG I   # 
+
+1183 ; 1169 116E ;     ML      # ( ᆃ → ᅩᅮ ) HANGUL JUNGSEONG O-U → HANGUL JUNGSEONG O, HANGUL JUNGSEONG U    # 
+
+116C ; 1169 1175 ;     ML      # ( ᅬ → ᅩᅵ ) HANGUL JUNGSEONG OE → HANGUL JUNGSEONG O, HANGUL JUNGSEONG I     # 
+315A ; 1169 1175 ;     ML      # ( ㅚ → ᅩᅵ ) HANGUL LETTER OE → HANGUL JUNGSEONG O, HANGUL JUNGSEONG I        # →ᅬ→
+
+315B ; 116D ;  ML      # ( ㅛ → ᅭ ) HANGUL LETTER YO → HANGUL JUNGSEONG YO      # 
+
+D7B2 ; 116D 1161 ;     ML      # ( ힲ → ᅭᅡ ) HANGUL JUNGSEONG YO-A → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG A  # 
+
+D7B3 ; 116D 1161 1175 ;        ML      # ( ힳ → ᅭᅡᅵ ) HANGUL JUNGSEONG YO-AE → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG A, HANGUL JUNGSEONG I  # 
+
+1184 ; 116D 1163 ;     ML      # ( ᆄ → ᅭᅣ ) HANGUL JUNGSEONG YO-YA → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG YA        # 
+3187 ; 116D 1163 ;     ML      # ( ㆇ → ᅭᅣ ) HANGUL LETTER YO-YA → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG YA   # →ᆄ→
+1186 ; 116D 1163 ;     ML      # ( ᆆ → ᅭᅣ ) HANGUL JUNGSEONG YO-YEO → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG YA       # →ᆄ→
+
+1185 ; 116D 1163 1175 ;        ML      # ( ᆅ → ᅭᅣᅵ ) HANGUL JUNGSEONG YO-YAE → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG YA, HANGUL JUNGSEONG I        # 
+3188 ; 116D 1163 1175 ;        ML      # ( ㆈ → ᅭᅣᅵ ) HANGUL LETTER YO-YAE → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG YA, HANGUL JUNGSEONG I   # →ᆅ→
+
+D7B4 ; 116D 1165 ;     ML      # ( ힴ → ᅭᅥ ) HANGUL JUNGSEONG YO-EO → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG EO        # 
+
+1187 ; 116D 1169 ;     ML      # ( ᆇ → ᅭᅩ ) HANGUL JUNGSEONG YO-O → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG O  # 
+
+1188 ; 116D 1175 ;     ML      # ( ᆈ → ᅭᅵ ) HANGUL JUNGSEONG YO-I → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG I  # 
+3189 ; 116D 1175 ;     ML      # ( ㆉ → ᅭᅵ ) HANGUL LETTER YO-I → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG I     # →ᆈ→
+
+315C ; 116E ;  ML      # ( ㅜ → ᅮ ) HANGUL LETTER U → HANGUL JUNGSEONG U        # 
+
+1189 ; 116E 1161 ;     ML      # ( ᆉ → ᅮᅡ ) HANGUL JUNGSEONG U-A → HANGUL JUNGSEONG U, HANGUL JUNGSEONG A    # 
+
+118A ; 116E 1161 1175 ;        ML      # ( ᆊ → ᅮᅡᅵ ) HANGUL JUNGSEONG U-AE → HANGUL JUNGSEONG U, HANGUL JUNGSEONG A, HANGUL JUNGSEONG I    # 
+
+116F ; 116E 1165 ;     ML      # ( ᅯ → ᅮᅥ ) HANGUL JUNGSEONG WEO → HANGUL JUNGSEONG U, HANGUL JUNGSEONG EO   # 
+315D ; 116E 1165 ;     ML      # ( ㅝ → ᅮᅥ ) HANGUL LETTER WEO → HANGUL JUNGSEONG U, HANGUL JUNGSEONG EO      # →ᅯ→
+
+118B ; 116E 1165 1173 ;        ML      # ( ᆋ → ᅮᅥᅳ ) HANGUL JUNGSEONG U-EO-EU → HANGUL JUNGSEONG U, HANGUL JUNGSEONG EO, HANGUL JUNGSEONG EU       # 
+
+1170 ; 116E 1165 1175 ;        ML      # ( ᅰ → ᅮᅥᅵ ) HANGUL JUNGSEONG WE → HANGUL JUNGSEONG U, HANGUL JUNGSEONG EO, HANGUL JUNGSEONG I     # 
+315E ; 116E 1165 1175 ;        ML      # ( ㅞ → ᅮᅥᅵ ) HANGUL LETTER WE → HANGUL JUNGSEONG U, HANGUL JUNGSEONG EO, HANGUL JUNGSEONG I        # →ᅰ→
+
+D7B5 ; 116E 1167 ;     ML      # ( ힵ → ᅮᅧ ) HANGUL JUNGSEONG U-YEO → HANGUL JUNGSEONG U, HANGUL JUNGSEONG YEO        # 
+
+118C ; 116E 1167 1175 ;        ML      # ( ᆌ → ᅮᅧᅵ ) HANGUL JUNGSEONG U-YE → HANGUL JUNGSEONG U, HANGUL JUNGSEONG YEO, HANGUL JUNGSEONG I  # 
+
+118D ; 116E 116E ;     ML      # ( ᆍ → ᅮᅮ ) HANGUL JUNGSEONG U-U → HANGUL JUNGSEONG U, HANGUL JUNGSEONG U    # 
+
+1171 ; 116E 1175 ;     ML      # ( ᅱ → ᅮᅵ ) HANGUL JUNGSEONG WI → HANGUL JUNGSEONG U, HANGUL JUNGSEONG I     # 
+315F ; 116E 1175 ;     ML      # ( ㅟ → ᅮᅵ ) HANGUL LETTER WI → HANGUL JUNGSEONG U, HANGUL JUNGSEONG I        # →ᅱ→
+
+D7B6 ; 116E 1175 1175 ;        ML      # ( ힶ → ᅮᅵᅵ ) HANGUL JUNGSEONG U-I-I → HANGUL JUNGSEONG U, HANGUL JUNGSEONG I, HANGUL JUNGSEONG I   # 
+
+3160 ; 1172 ;  ML      # ( ㅠ → ᅲ ) HANGUL LETTER YU → HANGUL JUNGSEONG YU      # 
+
+118E ; 1172 1161 ;     ML      # ( ᆎ → ᅲᅡ ) HANGUL JUNGSEONG YU-A → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG A  # 
+
+D7B7 ; 1172 1161 1175 ;        ML      # ( ힷ → ᅲᅡᅵ ) HANGUL JUNGSEONG YU-AE → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG A, HANGUL JUNGSEONG I  # 
+
+118F ; 1172 1165 ;     ML      # ( ᆏ → ᅲᅥ ) HANGUL JUNGSEONG YU-EO → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG EO        # 
+
+1190 ; 1172 1165 1175 ;        ML      # ( ᆐ → ᅲᅥᅵ ) HANGUL JUNGSEONG YU-E → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG EO, HANGUL JUNGSEONG I  # 
+
+1191 ; 1172 1167 ;     ML      # ( ᆑ → ᅲᅧ ) HANGUL JUNGSEONG YU-YEO → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG YEO      # 
+318A ; 1172 1167 ;     ML      # ( ㆊ → ᅲᅧ ) HANGUL LETTER YU-YEO → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG YEO # →ᆑ→
+
+1192 ; 1172 1167 1175 ;        ML      # ( ᆒ → ᅲᅧᅵ ) HANGUL JUNGSEONG YU-YE → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG YEO, HANGUL JUNGSEONG I        # 
+318B ; 1172 1167 1175 ;        ML      # ( ㆋ → ᅲᅧᅵ ) HANGUL LETTER YU-YE → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG YEO, HANGUL JUNGSEONG I   # →ᆒ→
+
+D7B8 ; 1172 1169 ;     ML      # ( ힸ → ᅲᅩ ) HANGUL JUNGSEONG YU-O → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG O  # 
+
+1193 ; 1172 116E ;     ML      # ( ᆓ → ᅲᅮ ) HANGUL JUNGSEONG YU-U → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG U  # 
+
+1194 ; 1172 1175 ;     ML      # ( ᆔ → ᅲᅵ ) HANGUL JUNGSEONG YU-I → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG I  # 
+318C ; 1172 1175 ;     ML      # ( ㆌ → ᅲᅵ ) HANGUL LETTER YU-I → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG I     # →ᆔ→
+
+D7B9 ; 1173 1161 ;     ML      # ( ힹ → ᅳᅡ ) HANGUL JUNGSEONG EU-A → HANGUL JUNGSEONG EU, HANGUL JUNGSEONG A  # 
+
+D7BA ; 1173 1165 ;     ML      # ( ힺ → ᅳᅥ ) HANGUL JUNGSEONG EU-EO → HANGUL JUNGSEONG EU, HANGUL JUNGSEONG EO        # 
+
+D7BB ; 1173 1165 1175 ;        ML      # ( ힻ → ᅳᅥᅵ ) HANGUL JUNGSEONG EU-E → HANGUL JUNGSEONG EU, HANGUL JUNGSEONG EO, HANGUL JUNGSEONG I  # 
+
+D7BC ; 1173 1169 ;     ML      # ( ힼ → ᅳᅩ ) HANGUL JUNGSEONG EU-O → HANGUL JUNGSEONG EU, HANGUL JUNGSEONG O  # 
+
+1195 ; 1173 116E ;     ML      # ( ᆕ → ᅳᅮ ) HANGUL JUNGSEONG EU-U → HANGUL JUNGSEONG EU, HANGUL JUNGSEONG U  # 
+
+1197 ; 1173 1175 116E ;        ML      # ( ᆗ → ᅳᅵᅮ ) HANGUL JUNGSEONG YI-U → HANGUL JUNGSEONG EU, HANGUL JUNGSEONG I, HANGUL JUNGSEONG U   # 
+
+1198 ; 1175 1161 ;     ML      # ( ᆘ → ᅵᅡ ) HANGUL JUNGSEONG I-A → HANGUL JUNGSEONG I, HANGUL JUNGSEONG A    # 
+
+1199 ; 1175 1163 ;     ML      # ( ᆙ → ᅵᅣ ) HANGUL JUNGSEONG I-YA → HANGUL JUNGSEONG I, HANGUL JUNGSEONG YA  # 
+
+D7BD ; 1175 1163 1169 ;        ML      # ( ힽ → ᅵᅣᅩ ) HANGUL JUNGSEONG I-YA-O → HANGUL JUNGSEONG I, HANGUL JUNGSEONG YA, HANGUL JUNGSEONG O # 
+
+D7BE ; 1175 1163 1175 ;        ML      # ( ힾ → ᅵᅣᅵ ) HANGUL JUNGSEONG I-YAE → HANGUL JUNGSEONG I, HANGUL JUNGSEONG YA, HANGUL JUNGSEONG I  # 
+
+D7BF ; 1175 1167 ;     ML      # ( ힿ → ᅵᅧ ) HANGUL JUNGSEONG I-YEO → HANGUL JUNGSEONG I, HANGUL JUNGSEONG YEO        # 
+
+D7C0 ; 1175 1167 1175 ;        ML      # ( ퟀ → ᅵᅧᅵ ) HANGUL JUNGSEONG I-YE → HANGUL JUNGSEONG I, HANGUL JUNGSEONG YEO, HANGUL JUNGSEONG I  # 
+
+119A ; 1175 1169 ;     ML      # ( ᆚ → ᅵᅩ ) HANGUL JUNGSEONG I-O → HANGUL JUNGSEONG I, HANGUL JUNGSEONG O    # 
+
+D7C1 ; 1175 1169 1175 ;        ML      # ( ퟁ → ᅵᅩᅵ ) HANGUL JUNGSEONG I-O-I → HANGUL JUNGSEONG I, HANGUL JUNGSEONG O, HANGUL JUNGSEONG I   # 
+
+D7C2 ; 1175 116D ;     ML      # ( ퟂ → ᅵᅭ ) HANGUL JUNGSEONG I-YO → HANGUL JUNGSEONG I, HANGUL JUNGSEONG YO  # 
+
+119B ; 1175 116E ;     ML      # ( ᆛ → ᅵᅮ ) HANGUL JUNGSEONG I-U → HANGUL JUNGSEONG I, HANGUL JUNGSEONG U    # 
+
+D7C3 ; 1175 1172 ;     ML      # ( ퟃ → ᅵᅲ ) HANGUL JUNGSEONG I-YU → HANGUL JUNGSEONG I, HANGUL JUNGSEONG YU  # 
+
+119D ; 1175 119E ;     ML      # ( ᆝ → ᅵᆞ ) HANGUL JUNGSEONG I-ARAEA → HANGUL JUNGSEONG I, HANGUL JUNGSEONG ARAEA    # 
+
+318D ; 119E ;  ML      # ( ㆍ → ᆞ ) HANGUL LETTER ARAEA → HANGUL JUNGSEONG ARAEA        # 
+
+D7C5 ; 119E 1161 ;     ML      # ( ퟅ → ᆞᅡ ) HANGUL JUNGSEONG ARAEA-A → HANGUL JUNGSEONG ARAEA, HANGUL JUNGSEONG A    # 
+
+119F ; 119E 1165 ;     ML      # ( ᆟ → ᆞᅥ ) HANGUL JUNGSEONG ARAEA-EO → HANGUL JUNGSEONG ARAEA, HANGUL JUNGSEONG EO  # 
+
+D7C6 ; 119E 1165 1175 ;        ML      # ( ퟆ → ᆞᅥᅵ ) HANGUL JUNGSEONG ARAEA-E → HANGUL JUNGSEONG ARAEA, HANGUL JUNGSEONG EO, HANGUL JUNGSEONG I    # 
+
+11A0 ; 119E 116E ;     ML      # ( ᆠ → ᆞᅮ ) HANGUL JUNGSEONG ARAEA-U → HANGUL JUNGSEONG ARAEA, HANGUL JUNGSEONG U    # 
+
+11A1 ; 119E 1175 ;     ML      # ( ᆡ → ᆞᅵ ) HANGUL JUNGSEONG ARAEA-I → HANGUL JUNGSEONG ARAEA, HANGUL JUNGSEONG I    # 
+318E ; 119E 1175 ;     ML      # ( ㆎ → ᆞᅵ ) HANGUL LETTER ARAEAE → HANGUL JUNGSEONG ARAEA, HANGUL JUNGSEONG I        # →ᆡ→
+
+11A2 ; 119E 119E ;     ML      # ( ᆢ → ᆞᆞ ) HANGUL JUNGSEONG SSANGARAEA → HANGUL JUNGSEONG ARAEA, HANGUL JUNGSEONG ARAEA     # 
+
+30D8 ; 3078 ;  ML      # ( ヘ → へ ) KATAKANA LETTER HE → HIRAGANA LETTER HE     # 
+
+29C4 ; 303C ;  ML      #* ( ⧄ → 〼 ) SQUARED RISING DIAGONAL SLASH → MASU MARK  # 
+
+A49E ; A04A ;  ML      #* ( ꒞ → ꁊ ) YI RADICAL PUT → YI SYLLABLE PUT   # 
+
+A4AC ; A050 ;  ML      #* ( ꒬ → ꁐ ) YI RADICAL PYT → YI SYLLABLE PYT   # 
+
+A49C ; A0C0 ;  ML      #* ( ꒜ → ꃀ ) YI RADICAL MOP → YI SYLLABLE MOP   # 
+
+A4A8 ; A132 ;  ML      #* ( ꒨ → ꄲ ) YI RADICAL TU → YI SYLLABLE TU     # 
+
+A4BF ; A259 ;  ML      #* ( ꒿ → ꉙ ) YI RADICAL HXOP → YI SYLLABLE HXOP # 
+
+A4BE ; A2B1 ;  ML      #* ( ꒾ → ꊱ ) YI RADICAL CIP → YI SYLLABLE CIP   # 
+
+A494 ; A2CD ;  ML      #* ( ꒔ → ꋍ ) YI RADICAL CYP → YI SYLLABLE CYP   # 
+
+A4C0 ; A3AB ;  ML      #* ( ꓀ → ꎫ ) YI RADICAL SHAT → YI SYLLABLE SHAT # 
+
+A4C2 ; A3B5 ;  ML      #* ( ꓂ → ꎵ ) YI RADICAL SHOP → YI SYLLABLE SHOP # 
+
+A4BA ; A3BF ;  ML      #* ( ꒺ → ꎿ ) YI RADICAL SHUR → YI SYLLABLE SHUR # 
+
+A4B0 ; A3C2 ;  ML      #* ( ꒰ → ꏂ ) YI RADICAL SHY → YI SYLLABLE SHY   # 
+
+A4A7 ; A458 ;  ML      #* ( ꒧ → ꑘ ) YI RADICAL NYOP → YI SYLLABLE NYOP # 
+
+22A5 ; A4D5 ;  ML      #* ( ⊥ → ꓕ ) UP TACK → LISU LETTER THA  # 
+27C2 ; A4D5 ;  ML      #* ( ⟂ → ꓕ ) PERPENDICULAR → LISU LETTER THA    # →⊥→
+
+2115 ; A4E0 ;  ML      # ( ℕ → ꓠ ) DOUBLE-STRUCK CAPITAL N → LISU LETTER NA    # →N→
+1D40D ;        A4E0 ;  ML      # ( 𝐍 → ꓠ ) MATHEMATICAL BOLD CAPITAL N → LISU LETTER NA       # →N→
+1D441 ;        A4E0 ;  ML      # ( 𝑁 → ꓠ ) MATHEMATICAL ITALIC CAPITAL N → LISU LETTER NA     # →N→
+1D475 ;        A4E0 ;  ML      # ( 𝑵 → ꓠ ) MATHEMATICAL BOLD ITALIC CAPITAL N → LISU LETTER NA        # →N→
+1D4A9 ;        A4E0 ;  ML      # ( 𝒩 → ꓠ ) MATHEMATICAL SCRIPT CAPITAL N → LISU LETTER NA     # →N→
+1D4DD ;        A4E0 ;  ML      # ( 𝓝 → ꓠ ) MATHEMATICAL BOLD SCRIPT CAPITAL N → LISU LETTER NA        # →N→
+1D511 ;        A4E0 ;  ML      # ( 𝔑 → ꓠ ) MATHEMATICAL FRAKTUR CAPITAL N → LISU LETTER NA    # →N→
+1D579 ;        A4E0 ;  ML      # ( 𝕹 → ꓠ ) MATHEMATICAL BOLD FRAKTUR CAPITAL N → LISU LETTER NA       # →N→
+1D5AD ;        A4E0 ;  ML      # ( 𝖭 → ꓠ ) MATHEMATICAL SANS-SERIF CAPITAL N → LISU LETTER NA # →N→
+1D5E1 ;        A4E0 ;  ML      # ( 𝗡 → ꓠ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL N → LISU LETTER NA    # →N→
+1D615 ;        A4E0 ;  ML      # ( 𝘕 → ꓠ ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL N → LISU LETTER NA  # →N→
+1D649 ;        A4E0 ;  ML      # ( 𝙉 → ꓠ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N → LISU LETTER NA     # →N→
+1D67D ;        A4E0 ;  ML      # ( 𝙽 → ꓠ ) MATHEMATICAL MONOSPACE CAPITAL N → LISU LETTER NA  # →N→
+1D6B4 ;        A4E0 ;  ML      # ( 𝚴 → ꓠ ) MATHEMATICAL BOLD CAPITAL NU → LISU LETTER NA      # →𝐍→→N→
+1D6EE ;        A4E0 ;  ML      # ( 𝛮 → ꓠ ) MATHEMATICAL ITALIC CAPITAL NU → LISU LETTER NA    # →Ν→→N→
+1D728 ;        A4E0 ;  ML      # ( 𝜨 → ꓠ ) MATHEMATICAL BOLD ITALIC CAPITAL NU → LISU LETTER NA       # →𝑵→→N→
+1D762 ;        A4E0 ;  ML      # ( 𝝢 → ꓠ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL NU → LISU LETTER NA   # →Ν→→N→
+1D79C ;        A4E0 ;  ML      # ( 𝞜 → ꓠ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU → LISU LETTER NA    # →Ν→→N→
+
+2141 ; A4E8 ;  ML      #* ( ⅁ → ꓨ ) TURNED SANS-SERIF CAPITAL G → LISU LETTER HHA      # 
+
+2200 ; A4EF ;  ML      #* ( ∀ → ꓯ ) FOR ALL → LISU LETTER AE   # 
+
+2229 ; A4F5 ;  ML      #* ( ∩ → ꓵ ) INTERSECTION → LISU LETTER UE      # 
+22C2 ; A4F5 ;  ML      #* ( ⋂ → ꓵ ) N-ARY INTERSECTION → LISU LETTER UE        # →∩→
+
+2142 ; A4F6 ;  ML      #* ( ⅂ → ꓶ ) TURNED SANS-SERIF CAPITAL L → LISU LETTER UH       # 
+
+104A0 ;        10486 ; ML      # ( 𐒠 → 𐒆 ) OSMANYA DIGIT ZERO → OSMANYA LETTER DEEL  # 
+
+103D1 ;        10382 ; ML      # ( 𐏑 → 𐎂 ) OLD PERSIAN NUMBER ONE → UGARITIC LETTER GAMLA    # 
+
+103D3 ;        10393 ; ML      # ( 𐏓 → 𐎓 ) OLD PERSIAN NUMBER TEN → UGARITIC LETTER AIN      # 
+
+12038 ;        1039A ; ML      # ( 𒀸 → 𐎚 ) CUNEIFORM SIGN ASH → UGARITIC LETTER TO   # 
+
+F967 ; 4E0D ;  ML      # ( 不 → 不 ) CJK COMPATIBILITY IDEOGRAPH-F967 → CJK UNIFIED IDEOGRAPH-4E0D       # 
+
+FA70 ; 4E26 ;  ML      # ( 並 → 並 ) CJK COMPATIBILITY IDEOGRAPH-FA70 → CJK UNIFIED IDEOGRAPH-4E26       # 
+
+239C ; 4E28 ;  ML      #* ( ⎜ → 丨 ) LEFT PARENTHESIS EXTENSION → CJK UNIFIED IDEOGRAPH-4E28    # →⎥→→⎮→
+239F ; 4E28 ;  ML      #* ( ⎟ → 丨 ) RIGHT PARENTHESIS EXTENSION → CJK UNIFIED IDEOGRAPH-4E28   # →⎥→→⎮→
+23A2 ; 4E28 ;  ML      #* ( ⎢ → 丨 ) LEFT SQUARE BRACKET EXTENSION → CJK UNIFIED IDEOGRAPH-4E28 # →⎥→→⎮→
+23A5 ; 4E28 ;  ML      #* ( ⎥ → 丨 ) RIGHT SQUARE BRACKET EXTENSION → CJK UNIFIED IDEOGRAPH-4E28        # →⎮→
+23AA ; 4E28 ;  ML      #* ( ⎪ → 丨 ) CURLY BRACKET EXTENSION → CJK UNIFIED IDEOGRAPH-4E28       # →⎥→→⎮→
+23AE ; 4E28 ;  ML      #* ( ⎮ → 丨 ) INTEGRAL EXTENSION → CJK UNIFIED IDEOGRAPH-4E28    # 
+31D1 ; 4E28 ;  ML      #* ( ㇑ → 丨 ) CJK STROKE S → CJK UNIFIED IDEOGRAPH-4E28  # 
+1175 ; 4E28 ;  ML      # ( ᅵ → 丨 ) HANGUL JUNGSEONG I → CJK UNIFIED IDEOGRAPH-4E28     # →ㅣ→
+3163 ; 4E28 ;  ML      # ( ㅣ → 丨 ) HANGUL LETTER I → CJK UNIFIED IDEOGRAPH-4E28        # 
+2F01 ; 4E28 ;  ML      #* ( ⼁ → 丨 ) KANGXI RADICAL LINE → CJK UNIFIED IDEOGRAPH-4E28   # 
+
+119C ; 4E28 30FC ;     ML      # ( ᆜ → 丨ー ) HANGUL JUNGSEONG I-EU → CJK UNIFIED IDEOGRAPH-4E28, KATAKANA-HIRAGANA PROLONGED SOUND MARK       # →ᅵᅳ→
+
+D7C4 ; 4E28 4E28 ;     ML      # ( ퟄ → 丨丨 ) HANGUL JUNGSEONG I-I → CJK UNIFIED IDEOGRAPH-4E28, CJK UNIFIED IDEOGRAPH-4E28    # →ᅵᅵ→
+
+2EA6 ; 4E2C ;  ML      #* ( ⺦ → 丬 ) CJK RADICAL SIMPLIFIED HALF TREE TRUNK → CJK UNIFIED IDEOGRAPH-4E2C        # 
+
+F905 ; 4E32 ;  ML      # ( 串 → 串 ) CJK COMPATIBILITY IDEOGRAPH-F905 → CJK UNIFIED IDEOGRAPH-4E32       # 
+
+2F801 ;        4E38 ;  ML      # ( 丸 → 丸 ) CJK COMPATIBILITY IDEOGRAPH-2F801 → CJK UNIFIED IDEOGRAPH-4E38     # 
+
+F95E ; 4E39 ;  ML      # ( 丹 → 丹 ) CJK COMPATIBILITY IDEOGRAPH-F95E → CJK UNIFIED IDEOGRAPH-4E39       # 
+
+2F800 ;        4E3D ;  ML      # ( 丽 → 丽 ) CJK COMPATIBILITY IDEOGRAPH-2F800 → CJK UNIFIED IDEOGRAPH-4E3D     # 
+
+2F802 ;        4E41 ;  ML      # ( 乁 → 乁 ) CJK COMPATIBILITY IDEOGRAPH-2F802 → CJK UNIFIED IDEOGRAPH-4E41     # 
+
+31E0 ; 4E59 ;  ML      #* ( ㇠ → 乙 ) CJK STROKE HXWG → CJK UNIFIED IDEOGRAPH-4E59       # 
+2F04 ; 4E59 ;  ML      #* ( ⼄ → 乙 ) KANGXI RADICAL SECOND → CJK UNIFIED IDEOGRAPH-4E59 # 
+
+31DF ; 4E5A ;  ML      #* ( ㇟ → 乚 ) CJK STROKE SWG → CJK UNIFIED IDEOGRAPH-4E5A        # 
+2E83 ; 4E5A ;  ML      #* ( ⺃ → 乚 ) CJK RADICAL SECOND TWO → CJK UNIFIED IDEOGRAPH-4E5A        # 
+
+31D6 ; 4E5B ;  ML      #* ( ㇖ → 乛 ) CJK STROKE HG → CJK UNIFIED IDEOGRAPH-4E5B # 
+
+2EF2 ; 4E80 ;  ML      #* ( ⻲ → 亀 ) CJK RADICAL J-SIMPLIFIED TURTLE → CJK UNIFIED IDEOGRAPH-4E80       # 
+
+F91B ; 4E82 ;  ML      # ( 亂 → 亂 ) CJK COMPATIBILITY IDEOGRAPH-F91B → CJK UNIFIED IDEOGRAPH-4E82       # 
+
+31DA ; 4E85 ;  ML      #* ( ㇚ → 亅 ) CJK STROKE SG → CJK UNIFIED IDEOGRAPH-4E85 # 
+2F05 ; 4E85 ;  ML      #* ( ⼅ → 亅 ) KANGXI RADICAL HOOK → CJK UNIFIED IDEOGRAPH-4E85   # 
+
+F9BA ; 4E86 ;  ML      # ( 了 → 了 ) CJK COMPATIBILITY IDEOGRAPH-F9BA → CJK UNIFIED IDEOGRAPH-4E86       # 
+
+2F06 ; 4E8C ;  ML      #* ( ⼆ → 二 ) KANGXI RADICAL TWO → CJK UNIFIED IDEOGRAPH-4E8C    # 
+
+2F07 ; 4EA0 ;  ML      #* ( ⼇ → 亠 ) KANGXI RADICAL LID → CJK UNIFIED IDEOGRAPH-4EA0    # 
+
+F977 ; 4EAE ;  ML      # ( 亮 → 亮 ) CJK COMPATIBILITY IDEOGRAPH-F977 → CJK UNIFIED IDEOGRAPH-4EAE       # 
+
+2F08 ; 4EBA ;  ML      #* ( ⼈ → 人 ) KANGXI RADICAL MAN → CJK UNIFIED IDEOGRAPH-4EBA    # 
+
+2E85 ; 4EBB ;  ML      #* ( ⺅ → 亻 ) CJK RADICAL PERSON → CJK UNIFIED IDEOGRAPH-4EBB    # 
+
+F9FD ; 4EC0 ;  ML      # ( 什 → 什 ) CJK COMPATIBILITY IDEOGRAPH-F9FD → CJK UNIFIED IDEOGRAPH-4EC0       # 
+
+2F819 ;        4ECC ;  ML      # ( 仌 → 仌 ) CJK COMPATIBILITY IDEOGRAPH-2F819 → CJK UNIFIED IDEOGRAPH-4ECC     # 
+
+F9A8 ; 4EE4 ;  ML      # ( 令 → 令 ) CJK COMPATIBILITY IDEOGRAPH-F9A8 → CJK UNIFIED IDEOGRAPH-4EE4       # 
+
+2F804 ;        4F60 ;  ML      # ( 你 → 你 ) CJK COMPATIBILITY IDEOGRAPH-2F804 → CJK UNIFIED IDEOGRAPH-4F60     # 
+
+5002 ; 4F75 ;  ML      # ( 倂 → 併 ) CJK UNIFIED IDEOGRAPH-5002 → CJK UNIFIED IDEOGRAPH-4F75     # 
+2F807 ;        4F75 ;  ML      # ( 倂 → 併 ) CJK COMPATIBILITY IDEOGRAPH-2F807 → CJK UNIFIED IDEOGRAPH-4F75     # →倂→
+
+FA73 ; 4F80 ;  ML      # ( 侀 → 侀 ) CJK COMPATIBILITY IDEOGRAPH-FA73 → CJK UNIFIED IDEOGRAPH-4F80       # 
+
+F92D ; 4F86 ;  ML      # ( 來 → 來 ) CJK COMPATIBILITY IDEOGRAPH-F92D → CJK UNIFIED IDEOGRAPH-4F86       # 
+
+F9B5 ; 4F8B ;  ML      # ( 例 → 例 ) CJK COMPATIBILITY IDEOGRAPH-F9B5 → CJK UNIFIED IDEOGRAPH-4F8B       # 
+
+FA30 ; 4FAE ;  ML      # ( 侮 → 侮 ) CJK COMPATIBILITY IDEOGRAPH-FA30 → CJK UNIFIED IDEOGRAPH-4FAE       # 
+2F805 ;        4FAE ;  ML      # ( 侮 → 侮 ) CJK COMPATIBILITY IDEOGRAPH-2F805 → CJK UNIFIED IDEOGRAPH-4FAE     # 
+
+2F806 ;        4FBB ;  ML      # ( 侻 → 侻 ) CJK COMPATIBILITY IDEOGRAPH-2F806 → CJK UNIFIED IDEOGRAPH-4FBB     # 
+
+F965 ; 4FBF ;  ML      # ( 便 → 便 ) CJK COMPATIBILITY IDEOGRAPH-F965 → CJK UNIFIED IDEOGRAPH-4FBF       # 
+
+503C ; 5024 ;  ML      # ( 值 → 値 ) CJK UNIFIED IDEOGRAPH-503C → CJK UNIFIED IDEOGRAPH-5024     # 
+
+F9D4 ; 502B ;  ML      # ( 倫 → 倫 ) CJK COMPATIBILITY IDEOGRAPH-F9D4 → CJK UNIFIED IDEOGRAPH-502B       # 
+
+2F808 ;        507A ;  ML      # ( 偺 → 偺 ) CJK COMPATIBILITY IDEOGRAPH-2F808 → CJK UNIFIED IDEOGRAPH-507A     # 
+
+2F809 ;        5099 ;  ML      # ( 備 → 備 ) CJK COMPATIBILITY IDEOGRAPH-2F809 → CJK UNIFIED IDEOGRAPH-5099     # 
+
+2F80B ;        50CF ;  ML      # ( 像 → 像 ) CJK COMPATIBILITY IDEOGRAPH-2F80B → CJK UNIFIED IDEOGRAPH-50CF     # 
+
+F9BB ; 50DA ;  ML      # ( 僚 → 僚 ) CJK COMPATIBILITY IDEOGRAPH-F9BB → CJK UNIFIED IDEOGRAPH-50DA       # 
+
+FA31 ; 50E7 ;  ML      # ( 僧 → 僧 ) CJK COMPATIBILITY IDEOGRAPH-FA31 → CJK UNIFIED IDEOGRAPH-50E7       # 
+2F80A ;        50E7 ;  ML      # ( 僧 → 僧 ) CJK COMPATIBILITY IDEOGRAPH-2F80A → CJK UNIFIED IDEOGRAPH-50E7     # 
+
+2F09 ; 513F ;  ML      #* ( ⼉ → 儿 ) KANGXI RADICAL LEGS → CJK UNIFIED IDEOGRAPH-513F   # 
+
+FA0C ; 5140 ;  ML      # ( 兀 → 兀 ) CJK COMPATIBILITY IDEOGRAPH-FA0C → CJK UNIFIED IDEOGRAPH-5140       # 
+2E8E ; 5140 ;  ML      #* ( ⺎ → 兀 ) CJK RADICAL LAME ONE → CJK UNIFIED IDEOGRAPH-5140  # 
+
+FA74 ; 5145 ;  ML      # ( 充 → 充 ) CJK COMPATIBILITY IDEOGRAPH-FA74 → CJK UNIFIED IDEOGRAPH-5145       # 
+
+FA32 ; 514D ;  ML      # ( 免 → 免 ) CJK COMPATIBILITY IDEOGRAPH-FA32 → CJK UNIFIED IDEOGRAPH-514D       # 
+2F80E ;        514D ;  ML      # ( 免 → 免 ) CJK COMPATIBILITY IDEOGRAPH-2F80E → CJK UNIFIED IDEOGRAPH-514D     # 
+
+2F80F ;        5154 ;  ML      # ( 兔 → 兔 ) CJK COMPATIBILITY IDEOGRAPH-2F80F → CJK UNIFIED IDEOGRAPH-5154     # 
+
+2F810 ;        5164 ;  ML      # ( 兤 → 兤 ) CJK COMPATIBILITY IDEOGRAPH-2F810 → CJK UNIFIED IDEOGRAPH-5164     # 
+
+2F0A ; 5165 ;  ML      #* ( ⼊ → 入 ) KANGXI RADICAL ENTER → CJK UNIFIED IDEOGRAPH-5165  # 
+
+2F814 ;        5167 ;  ML      # ( 內 → 內 ) CJK COMPATIBILITY IDEOGRAPH-2F814 → CJK UNIFIED IDEOGRAPH-5167     # 
+
+FA72 ; 5168 ;  ML      # ( 全 → 全 ) CJK COMPATIBILITY IDEOGRAPH-FA72 → CJK UNIFIED IDEOGRAPH-5168       # 
+
+F978 ; 5169 ;  ML      # ( 兩 → 兩 ) CJK COMPATIBILITY IDEOGRAPH-F978 → CJK UNIFIED IDEOGRAPH-5169       # 
+
+2F0B ; 516B ;  ML      #* ( ⼋ → 八 ) KANGXI RADICAL EIGHT → CJK UNIFIED IDEOGRAPH-516B  # 
+
+F9D1 ; 516D ;  ML      # ( 六 → 六 ) CJK COMPATIBILITY IDEOGRAPH-F9D1 → CJK UNIFIED IDEOGRAPH-516D       # 
+
+2F811 ;        5177 ;  ML      # ( 具 → 具 ) CJK COMPATIBILITY IDEOGRAPH-2F811 → CJK UNIFIED IDEOGRAPH-5177     # 
+
+FA75 ; 5180 ;  ML      # ( 冀 → 冀 ) CJK COMPATIBILITY IDEOGRAPH-FA75 → CJK UNIFIED IDEOGRAPH-5180       # 
+
+2F0C ; 5182 ;  ML      #* ( ⼌ → 冂 ) KANGXI RADICAL DOWN BOX → CJK UNIFIED IDEOGRAPH-5182       # 
+
+2F815 ;        518D ;  ML      # ( 再 → 再 ) CJK COMPATIBILITY IDEOGRAPH-2F815 → CJK UNIFIED IDEOGRAPH-518D     # 
+
+2F8D2 ;        5192 ;  ML      # ( 冒 → 冒 ) CJK COMPATIBILITY IDEOGRAPH-2F8D2 → CJK UNIFIED IDEOGRAPH-5192     # 
+
+2F8D3 ;        5195 ;  ML      # ( 冕 → 冕 ) CJK COMPATIBILITY IDEOGRAPH-2F8D3 → CJK UNIFIED IDEOGRAPH-5195     # 
+
+2F0D ; 5196 ;  ML      #* ( ⼍ → 冖 ) KANGXI RADICAL COVER → CJK UNIFIED IDEOGRAPH-5196  # 
+
+2F817 ;        5197 ;  ML      # ( 冗 → 冗 ) CJK COMPATIBILITY IDEOGRAPH-2F817 → CJK UNIFIED IDEOGRAPH-5197     # 
+
+2F818 ;        51A4 ;  ML      # ( 冤 → 冤 ) CJK COMPATIBILITY IDEOGRAPH-2F818 → CJK UNIFIED IDEOGRAPH-51A4     # 
+
+2F0E ; 51AB ;  ML      #* ( ⼎ → 冫 ) KANGXI RADICAL ICE → CJK UNIFIED IDEOGRAPH-51AB    # 
+
+2F81A ;        51AC ;  ML      # ( 冬 → 冬 ) CJK COMPATIBILITY IDEOGRAPH-2F81A → CJK UNIFIED IDEOGRAPH-51AC     # 
+
+FA71 ; 51B5 ;  ML      # ( 况 → 况 ) CJK COMPATIBILITY IDEOGRAPH-FA71 → CJK UNIFIED IDEOGRAPH-51B5       # 
+2F81B ;        51B5 ;  ML      # ( 况 → 况 ) CJK COMPATIBILITY IDEOGRAPH-2F81B → CJK UNIFIED IDEOGRAPH-51B5     # 
+
+F92E ; 51B7 ;  ML      # ( 冷 → 冷 ) CJK COMPATIBILITY IDEOGRAPH-F92E → CJK UNIFIED IDEOGRAPH-51B7       # 
+
+F979 ; 51C9 ;  ML      # ( 凉 → 凉 ) CJK COMPATIBILITY IDEOGRAPH-F979 → CJK UNIFIED IDEOGRAPH-51C9       # 
+
+F955 ; 51CC ;  ML      # ( 凌 → 凌 ) CJK COMPATIBILITY IDEOGRAPH-F955 → CJK UNIFIED IDEOGRAPH-51CC       # 
+
+F954 ; 51DC ;  ML      # ( 凜 → 凜 ) CJK COMPATIBILITY IDEOGRAPH-F954 → CJK UNIFIED IDEOGRAPH-51DC       # 
+
+FA15 ; 51DE ;  ML      # ( 凞 → 凞 ) CJK COMPATIBILITY IDEOGRAPH-FA15 → CJK UNIFIED IDEOGRAPH-51DE       # 
+
+2F0F ; 51E0 ;  ML      #* ( ⼏ → 几 ) KANGXI RADICAL TABLE → CJK UNIFIED IDEOGRAPH-51E0  # 
+
+2F81D ;        51F5 ;  ML      # ( 凵 → 凵 ) CJK COMPATIBILITY IDEOGRAPH-2F81D → CJK UNIFIED IDEOGRAPH-51F5     # 
+2F10 ; 51F5 ;  ML      #* ( ⼐ → 凵 ) KANGXI RADICAL OPEN BOX → CJK UNIFIED IDEOGRAPH-51F5       # 
+
+2F11 ; 5200 ;  ML      #* ( ⼑ → 刀 ) KANGXI RADICAL KNIFE → CJK UNIFIED IDEOGRAPH-5200  # 
+
+2E89 ; 5202 ;  ML      #* ( ⺉ → 刂 ) CJK RADICAL KNIFE TWO → CJK UNIFIED IDEOGRAPH-5202 # 
+
+2F81E ;        5203 ;  ML      # ( 刃 → 刃 ) CJK COMPATIBILITY IDEOGRAPH-2F81E → CJK UNIFIED IDEOGRAPH-5203     # 
+
+FA00 ; 5207 ;  ML      # ( 切 → 切 ) CJK COMPATIBILITY IDEOGRAPH-FA00 → CJK UNIFIED IDEOGRAPH-5207       # 
+2F850 ;        5207 ;  ML      # ( 切 → 切 ) CJK COMPATIBILITY IDEOGRAPH-2F850 → CJK UNIFIED IDEOGRAPH-5207     # 
+
+F99C ; 5217 ;  ML      # ( 列 → 列 ) CJK COMPATIBILITY IDEOGRAPH-F99C → CJK UNIFIED IDEOGRAPH-5217       # 
+
+F9DD ; 5229 ;  ML      # ( 利 → 利 ) CJK COMPATIBILITY IDEOGRAPH-F9DD → CJK UNIFIED IDEOGRAPH-5229       # 
+
+F9FF ; 523A ;  ML      # ( 刺 → 刺 ) CJK COMPATIBILITY IDEOGRAPH-F9FF → CJK UNIFIED IDEOGRAPH-523A       # 
+
+2F820 ;        523B ;  ML      # ( 刻 → 刻 ) CJK COMPATIBILITY IDEOGRAPH-2F820 → CJK UNIFIED IDEOGRAPH-523B     # 
+
+2F821 ;        5246 ;  ML      # ( 剆 → 剆 ) CJK COMPATIBILITY IDEOGRAPH-2F821 → CJK UNIFIED IDEOGRAPH-5246     # 
+
+2F822 ;        5272 ;  ML      # ( 割 → 割 ) CJK COMPATIBILITY IDEOGRAPH-2F822 → CJK UNIFIED IDEOGRAPH-5272     # 
+
+2F823 ;        5277 ;  ML      # ( 剷 → 剷 ) CJK COMPATIBILITY IDEOGRAPH-2F823 → CJK UNIFIED IDEOGRAPH-5277     # 
+
+F9C7 ; 5289 ;  ML      # ( 劉 → 劉 ) CJK COMPATIBILITY IDEOGRAPH-F9C7 → CJK UNIFIED IDEOGRAPH-5289       # 
+
+F98A ; 529B ;  ML      # ( 力 → 力 ) CJK COMPATIBILITY IDEOGRAPH-F98A → CJK UNIFIED IDEOGRAPH-529B       # 
+2F12 ; 529B ;  ML      #* ( ⼒ → 力 ) KANGXI RADICAL POWER → CJK UNIFIED IDEOGRAPH-529B  # 
+
+F99D ; 52A3 ;  ML      # ( 劣 → 劣 ) CJK COMPATIBILITY IDEOGRAPH-F99D → CJK UNIFIED IDEOGRAPH-52A3       # 
+
+2F992 ;        52B3 ;  ML      # ( 劳 → 劳 ) CJK COMPATIBILITY IDEOGRAPH-2F992 → CJK UNIFIED IDEOGRAPH-52B3     # 
+
+FA76 ; 52C7 ;  ML      # ( 勇 → 勇 ) CJK COMPATIBILITY IDEOGRAPH-FA76 → CJK UNIFIED IDEOGRAPH-52C7       # 
+2F825 ;        52C7 ;  ML      # ( 勇 → 勇 ) CJK COMPATIBILITY IDEOGRAPH-2F825 → CJK UNIFIED IDEOGRAPH-52C7     # 
+
+FA33 ; 52C9 ;  ML      # ( 勉 → 勉 ) CJK COMPATIBILITY IDEOGRAPH-FA33 → CJK UNIFIED IDEOGRAPH-52C9       # 
+2F826 ;        52C9 ;  ML      # ( 勉 → 勉 ) CJK COMPATIBILITY IDEOGRAPH-2F826 → CJK UNIFIED IDEOGRAPH-52C9     # 
+
+F952 ; 52D2 ;  ML      # ( 勒 → 勒 ) CJK COMPATIBILITY IDEOGRAPH-F952 → CJK UNIFIED IDEOGRAPH-52D2       # 
+
+F92F ; 52DE ;  ML      # ( 勞 → 勞 ) CJK COMPATIBILITY IDEOGRAPH-F92F → CJK UNIFIED IDEOGRAPH-52DE       # 
+
+FA34 ; 52E4 ;  ML      # ( 勤 → 勤 ) CJK COMPATIBILITY IDEOGRAPH-FA34 → CJK UNIFIED IDEOGRAPH-52E4       # 
+2F827 ;        52E4 ;  ML      # ( 勤 → 勤 ) CJK COMPATIBILITY IDEOGRAPH-2F827 → CJK UNIFIED IDEOGRAPH-52E4     # 
+
+F97F ; 52F5 ;  ML      # ( 勵 → 勵 ) CJK COMPATIBILITY IDEOGRAPH-F97F → CJK UNIFIED IDEOGRAPH-52F5       # 
+
+2F13 ; 52F9 ;  ML      #* ( ⼓ → 勹 ) KANGXI RADICAL WRAP → CJK UNIFIED IDEOGRAPH-52F9   # 
+
+FA77 ; 52FA ;  ML      # ( 勺 → 勺 ) CJK COMPATIBILITY IDEOGRAPH-FA77 → CJK UNIFIED IDEOGRAPH-52FA       # 
+2F828 ;        52FA ;  ML      # ( 勺 → 勺 ) CJK COMPATIBILITY IDEOGRAPH-2F828 → CJK UNIFIED IDEOGRAPH-52FA     # 
+
+2F829 ;        5305 ;  ML      # ( 包 → 包 ) CJK COMPATIBILITY IDEOGRAPH-2F829 → CJK UNIFIED IDEOGRAPH-5305     # 
+
+2F82A ;        5306 ;  ML      # ( 匆 → 匆 ) CJK COMPATIBILITY IDEOGRAPH-2F82A → CJK UNIFIED IDEOGRAPH-5306     # 
+
+2F14 ; 5315 ;  ML      #* ( ⼔ → 匕 ) KANGXI RADICAL SPOON → CJK UNIFIED IDEOGRAPH-5315  # 
+
+F963 ; 5317 ;  ML      # ( 北 → 北 ) CJK COMPATIBILITY IDEOGRAPH-F963 → CJK UNIFIED IDEOGRAPH-5317       # 
+2F82B ;        5317 ;  ML      # ( 北 → 北 ) CJK COMPATIBILITY IDEOGRAPH-2F82B → CJK UNIFIED IDEOGRAPH-5317     # 
+
+2F15 ; 531A ;  ML      #* ( ⼕ → 匚 ) KANGXI RADICAL RIGHT OPEN BOX → CJK UNIFIED IDEOGRAPH-531A # 
+
+2F16 ; 5338 ;  ML      #* ( ⼖ → 匸 ) KANGXI RADICAL HIDING ENCLOSURE → CJK UNIFIED IDEOGRAPH-5338       # 
+
+F9EB ; 533F ;  ML      # ( 匿 → 匿 ) CJK COMPATIBILITY IDEOGRAPH-F9EB → CJK UNIFIED IDEOGRAPH-533F       # 
+
+2F17 ; 5341 ;  ML      #* ( ⼗ → 十 ) KANGXI RADICAL TEN → CJK UNIFIED IDEOGRAPH-5341    # 
+3038 ; 5341 ;  ML      # ( 〸 → 十 ) HANGZHOU NUMERAL TEN → CJK UNIFIED IDEOGRAPH-5341   # 
+
+3039 ; 5344 ;  ML      # ( 〹 → 卄 ) HANGZHOU NUMERAL TWENTY → CJK UNIFIED IDEOGRAPH-5344        # 
+
+303A ; 5345 ;  ML      # ( 〺 → 卅 ) HANGZHOU NUMERAL THIRTY → CJK UNIFIED IDEOGRAPH-5345        # 
+
+2F82C ;        5349 ;  ML      # ( 卉 → 卉 ) CJK COMPATIBILITY IDEOGRAPH-2F82C → CJK UNIFIED IDEOGRAPH-5349     # 
+
+FA35 ; 5351 ;  ML      # ( 卑 → 卑 ) CJK COMPATIBILITY IDEOGRAPH-FA35 → CJK UNIFIED IDEOGRAPH-5351       # 
+2F82D ;        5351 ;  ML      # ( 卑 → 卑 ) CJK COMPATIBILITY IDEOGRAPH-2F82D → CJK UNIFIED IDEOGRAPH-5351     # 
+
+2F82E ;        535A ;  ML      # ( 博 → 博 ) CJK COMPATIBILITY IDEOGRAPH-2F82E → CJK UNIFIED IDEOGRAPH-535A     # 
+
+2F18 ; 535C ;  ML      #* ( ⼘ → 卜 ) KANGXI RADICAL DIVINATION → CJK UNIFIED IDEOGRAPH-535C     # 
+
+2F19 ; 5369 ;  ML      #* ( ⼙ → 卩 ) KANGXI RADICAL SEAL → CJK UNIFIED IDEOGRAPH-5369   # 
+
+2F82F ;        5373 ;  ML      # ( 即 → 即 ) CJK COMPATIBILITY IDEOGRAPH-2F82F → CJK UNIFIED IDEOGRAPH-5373     # 
+
+F91C ; 5375 ;  ML      # ( 卵 → 卵 ) CJK COMPATIBILITY IDEOGRAPH-F91C → CJK UNIFIED IDEOGRAPH-5375       # 
+
+2F830 ;        537D ;  ML      # ( 卽 → 卽 ) CJK COMPATIBILITY IDEOGRAPH-2F830 → CJK UNIFIED IDEOGRAPH-537D     # 
+
+2F831 ;        537F ;  ML      # ( 卿 → 卿 ) CJK COMPATIBILITY IDEOGRAPH-2F831 → CJK UNIFIED IDEOGRAPH-537F     # 
+2F832 ;        537F ;  ML      # ( 卿 → 卿 ) CJK COMPATIBILITY IDEOGRAPH-2F832 → CJK UNIFIED IDEOGRAPH-537F     # 
+2F833 ;        537F ;  ML      # ( 卿 → 卿 ) CJK COMPATIBILITY IDEOGRAPH-2F833 → CJK UNIFIED IDEOGRAPH-537F     # 
+
+2F1A ; 5382 ;  ML      #* ( ⼚ → 厂 ) KANGXI RADICAL CLIFF → CJK UNIFIED IDEOGRAPH-5382  # 
+
+2F1B ; 53B6 ;  ML      #* ( ⼛ → 厶 ) KANGXI RADICAL PRIVATE → CJK UNIFIED IDEOGRAPH-53B6        # 
+
+F96B ; 53C3 ;  ML      # ( 參 → 參 ) CJK COMPATIBILITY IDEOGRAPH-F96B → CJK UNIFIED IDEOGRAPH-53C3       # 
+
+2F1C ; 53C8 ;  ML      #* ( ⼜ → 又 ) KANGXI RADICAL AGAIN → CJK UNIFIED IDEOGRAPH-53C8  # 
+
+2F836 ;        53CA ;  ML      # ( 及 → 及 ) CJK COMPATIBILITY IDEOGRAPH-2F836 → CJK UNIFIED IDEOGRAPH-53CA     # 
+
+2F837 ;        53DF ;  ML      # ( 叟 → 叟 ) CJK COMPATIBILITY IDEOGRAPH-2F837 → CJK UNIFIED IDEOGRAPH-53DF     # 
+
+2F1D ; 53E3 ;  ML      #* ( ⼝ → 口 ) KANGXI RADICAL MOUTH → CJK UNIFIED IDEOGRAPH-53E3  # 
+
+F906 ; 53E5 ;  ML      # ( 句 → 句 ) CJK COMPATIBILITY IDEOGRAPH-F906 → CJK UNIFIED IDEOGRAPH-53E5       # 
+
+2F839 ;        53EB ;  ML      # ( 叫 → 叫 ) CJK COMPATIBILITY IDEOGRAPH-2F839 → CJK UNIFIED IDEOGRAPH-53EB     # 
+
+2F83A ;        53F1 ;  ML      # ( 叱 → 叱 ) CJK COMPATIBILITY IDEOGRAPH-2F83A → CJK UNIFIED IDEOGRAPH-53F1     # 
+
+2F83B ;        5406 ;  ML      # ( 吆 → 吆 ) CJK COMPATIBILITY IDEOGRAPH-2F83B → CJK UNIFIED IDEOGRAPH-5406     # 
+
+F9DE ; 540F ;  ML      # ( 吏 → 吏 ) CJK COMPATIBILITY IDEOGRAPH-F9DE → CJK UNIFIED IDEOGRAPH-540F       # 
+
+F9ED ; 541D ;  ML      # ( 吝 → 吝 ) CJK COMPATIBILITY IDEOGRAPH-F9ED → CJK UNIFIED IDEOGRAPH-541D       # 
+
+2F83D ;        5438 ;  ML      # ( 吸 → 吸 ) CJK COMPATIBILITY IDEOGRAPH-2F83D → CJK UNIFIED IDEOGRAPH-5438     # 
+
+F980 ; 5442 ;  ML      # ( 呂 → 呂 ) CJK COMPATIBILITY IDEOGRAPH-F980 → CJK UNIFIED IDEOGRAPH-5442       # 
+
+2F83E ;        5448 ;  ML      # ( 呈 → 呈 ) CJK COMPATIBILITY IDEOGRAPH-2F83E → CJK UNIFIED IDEOGRAPH-5448     # 
+
+2F83F ;        5468 ;  ML      # ( 周 → 周 ) CJK COMPATIBILITY IDEOGRAPH-2F83F → CJK UNIFIED IDEOGRAPH-5468     # 
+
+2F83C ;        549E ;  ML      # ( 咞 → 咞 ) CJK COMPATIBILITY IDEOGRAPH-2F83C → CJK UNIFIED IDEOGRAPH-549E     # 
+
+2F840 ;        54A2 ;  ML      # ( 咢 → 咢 ) CJK COMPATIBILITY IDEOGRAPH-2F840 → CJK UNIFIED IDEOGRAPH-54A2     # 
+
+F99E ; 54BD ;  ML      # ( 咽 → 咽 ) CJK COMPATIBILITY IDEOGRAPH-F99E → CJK UNIFIED IDEOGRAPH-54BD       # 
+
+2F841 ;        54F6 ;  ML      # ( 哶 → 哶 ) CJK COMPATIBILITY IDEOGRAPH-2F841 → CJK UNIFIED IDEOGRAPH-54F6     # 
+
+2F842 ;        5510 ;  ML      # ( 唐 → 唐 ) CJK COMPATIBILITY IDEOGRAPH-2F842 → CJK UNIFIED IDEOGRAPH-5510     # 
+
+2F843 ;        5553 ;  ML      # ( 啓 → 啓 ) CJK COMPATIBILITY IDEOGRAPH-2F843 → CJK UNIFIED IDEOGRAPH-5553     # 
+555F ; 5553 ;  ML      # ( 啟 → 啓 ) CJK UNIFIED IDEOGRAPH-555F → CJK UNIFIED IDEOGRAPH-5553     # 
+
+FA79 ; 5555 ;  ML      # ( 啕 → 啕 ) CJK COMPATIBILITY IDEOGRAPH-FA79 → CJK UNIFIED IDEOGRAPH-5555       # 
+
+2F844 ;        5563 ;  ML      # ( 啣 → 啣 ) CJK COMPATIBILITY IDEOGRAPH-2F844 → CJK UNIFIED IDEOGRAPH-5563     # 
+
+2F845 ;        5584 ;  ML      # ( 善 → 善 ) CJK COMPATIBILITY IDEOGRAPH-2F845 → CJK UNIFIED IDEOGRAPH-5584     # 
+2F846 ;        5584 ;  ML      # ( 善 → 善 ) CJK COMPATIBILITY IDEOGRAPH-2F846 → CJK UNIFIED IDEOGRAPH-5584     # 
+
+F90B ; 5587 ;  ML      # ( 喇 → 喇 ) CJK COMPATIBILITY IDEOGRAPH-F90B → CJK UNIFIED IDEOGRAPH-5587       # 
+
+FA7A ; 5599 ;  ML      # ( 喙 → 喙 ) CJK COMPATIBILITY IDEOGRAPH-FA7A → CJK UNIFIED IDEOGRAPH-5599       # 
+2F847 ;        5599 ;  ML      # ( 喙 → 喙 ) CJK COMPATIBILITY IDEOGRAPH-2F847 → CJK UNIFIED IDEOGRAPH-5599     # 
+
+FA36 ; 559D ;  ML      # ( 喝 → 喝 ) CJK COMPATIBILITY IDEOGRAPH-FA36 → CJK UNIFIED IDEOGRAPH-559D       # 
+FA78 ; 559D ;  ML      # ( 喝 → 喝 ) CJK COMPATIBILITY IDEOGRAPH-FA78 → CJK UNIFIED IDEOGRAPH-559D       # 
+
+2F848 ;        55AB ;  ML      # ( 喫 → 喫 ) CJK COMPATIBILITY IDEOGRAPH-2F848 → CJK UNIFIED IDEOGRAPH-55AB     # 
+
+2F849 ;        55B3 ;  ML      # ( 喳 → 喳 ) CJK COMPATIBILITY IDEOGRAPH-2F849 → CJK UNIFIED IDEOGRAPH-55B3     # 
+
+FA0D ; 55C0 ;  ML      # ( 嗀 → 嗀 ) CJK COMPATIBILITY IDEOGRAPH-FA0D → CJK UNIFIED IDEOGRAPH-55C0       # 
+
+2F84A ;        55C2 ;  ML      # ( 嗂 → 嗂 ) CJK COMPATIBILITY IDEOGRAPH-2F84A → CJK UNIFIED IDEOGRAPH-55C2     # 
+
+FA7B ; 55E2 ;  ML      # ( 嗢 → 嗢 ) CJK COMPATIBILITY IDEOGRAPH-FA7B → CJK UNIFIED IDEOGRAPH-55E2       # 
+
+FA37 ; 5606 ;  ML      # ( 嘆 → 嘆 ) CJK COMPATIBILITY IDEOGRAPH-FA37 → CJK UNIFIED IDEOGRAPH-5606       # 
+2F84C ;        5606 ;  ML      # ( 嘆 → 嘆 ) CJK COMPATIBILITY IDEOGRAPH-2F84C → CJK UNIFIED IDEOGRAPH-5606     # 
+
+2F84E ;        5651 ;  ML      # ( 噑 → 噑 ) CJK COMPATIBILITY IDEOGRAPH-2F84E → CJK UNIFIED IDEOGRAPH-5651     # 
+
+FA38 ; 5668 ;  ML      # ( 器 → 器 ) CJK COMPATIBILITY IDEOGRAPH-FA38 → CJK UNIFIED IDEOGRAPH-5668       # 
+
+2F84F ;        5674 ;  ML      # ( 噴 → 噴 ) CJK COMPATIBILITY IDEOGRAPH-2F84F → CJK UNIFIED IDEOGRAPH-5674     # 
+
+2F1E ; 56D7 ;  ML      #* ( ⼞ → 囗 ) KANGXI RADICAL ENCLOSURE → CJK UNIFIED IDEOGRAPH-56D7      # 
+
+F9A9 ; 56F9 ;  ML      # ( 囹 → 囹 ) CJK COMPATIBILITY IDEOGRAPH-F9A9 → CJK UNIFIED IDEOGRAPH-56F9       # 
+
+2F84B ;        5716 ;  ML      # ( 圖 → 圖 ) CJK COMPATIBILITY IDEOGRAPH-2F84B → CJK UNIFIED IDEOGRAPH-5716     # 
+
+2F84D ;        5717 ;  ML      # ( 圗 → 圗 ) CJK COMPATIBILITY IDEOGRAPH-2F84D → CJK UNIFIED IDEOGRAPH-5717     # 
+
+2F1F ; 571F ;  ML      #* ( ⼟ → 土 ) KANGXI RADICAL EARTH → CJK UNIFIED IDEOGRAPH-571F  # 
+
+2F855 ;        578B ;  ML      # ( 型 → 型 ) CJK COMPATIBILITY IDEOGRAPH-2F855 → CJK UNIFIED IDEOGRAPH-578B     # 
+
+2F852 ;        57CE ;  ML      # ( 城 → 城 ) CJK COMPATIBILITY IDEOGRAPH-2F852 → CJK UNIFIED IDEOGRAPH-57CE     # 
+
+2F853 ;        57F4 ;  ML      # ( 埴 → 埴 ) CJK COMPATIBILITY IDEOGRAPH-2F853 → CJK UNIFIED IDEOGRAPH-57F4     # 
+
+2F854 ;        580D ;  ML      # ( 堍 → 堍 ) CJK COMPATIBILITY IDEOGRAPH-2F854 → CJK UNIFIED IDEOGRAPH-580D     # 
+
+2F857 ;        5831 ;  ML      # ( 報 → 報 ) CJK COMPATIBILITY IDEOGRAPH-2F857 → CJK UNIFIED IDEOGRAPH-5831     # 
+
+2F856 ;        5832 ;  ML      # ( 堲 → 堲 ) CJK COMPATIBILITY IDEOGRAPH-2F856 → CJK UNIFIED IDEOGRAPH-5832     # 
+
+FA39 ; 5840 ;  ML      # ( 塀 → 塀 ) CJK COMPATIBILITY IDEOGRAPH-FA39 → CJK UNIFIED IDEOGRAPH-5840       # 
+
+FA10 ; 585A ;  ML      # ( 塚 → 塚 ) CJK COMPATIBILITY IDEOGRAPH-FA10 → CJK UNIFIED IDEOGRAPH-585A       # 
+FA7C ; 585A ;  ML      # ( 塚 → 塚 ) CJK COMPATIBILITY IDEOGRAPH-FA7C → CJK UNIFIED IDEOGRAPH-585A       # 
+
+F96C ; 585E ;  ML      # ( 塞 → 塞 ) CJK COMPATIBILITY IDEOGRAPH-F96C → CJK UNIFIED IDEOGRAPH-585E       # 
+
+586B ; 5861 ;  ML      # ( 填 → 塡 ) CJK UNIFIED IDEOGRAPH-586B → CJK UNIFIED IDEOGRAPH-5861     # 
+
+FA3A ; 58A8 ;  ML      # ( 墨 → 墨 ) CJK COMPATIBILITY IDEOGRAPH-FA3A → CJK UNIFIED IDEOGRAPH-58A8       # 
+
+58FF ; 58AB ;  ML      # ( 壿 → 墫 ) CJK UNIFIED IDEOGRAPH-58FF → CJK UNIFIED IDEOGRAPH-58AB     # 
+
+2F858 ;        58AC ;  ML      # ( 墬 → 墬 ) CJK COMPATIBILITY IDEOGRAPH-2F858 → CJK UNIFIED IDEOGRAPH-58AC     # 
+
+FA7D ; 58B3 ;  ML      # ( 墳 → 墳 ) CJK COMPATIBILITY IDEOGRAPH-FA7D → CJK UNIFIED IDEOGRAPH-58B3       # 
+
+F94A ; 58D8 ;  ML      # ( 壘 → 壘 ) CJK COMPATIBILITY IDEOGRAPH-F94A → CJK UNIFIED IDEOGRAPH-58D8       # 
+
+F942 ; 58DF ;  ML      # ( 壟 → 壟 ) CJK COMPATIBILITY IDEOGRAPH-F942 → CJK UNIFIED IDEOGRAPH-58DF       # 
+
+2F20 ; 58EB ;  ML      #* ( ⼠ → 士 ) KANGXI RADICAL SCHOLAR → CJK UNIFIED IDEOGRAPH-58EB        # 
+
+2F851 ;        58EE ;  ML      # ( 壮 → 壮 ) CJK COMPATIBILITY IDEOGRAPH-2F851 → CJK UNIFIED IDEOGRAPH-58EE     # 
+
+2F85A ;        58F2 ;  ML      # ( 売 → 売 ) CJK COMPATIBILITY IDEOGRAPH-2F85A → CJK UNIFIED IDEOGRAPH-58F2     # 
+
+2F85B ;        58F7 ;  ML      # ( 壷 → 壷 ) CJK COMPATIBILITY IDEOGRAPH-2F85B → CJK UNIFIED IDEOGRAPH-58F7     # 
+
+2F21 ; 5902 ;  ML      #* ( ⼡ → 夂 ) KANGXI RADICAL GO → CJK UNIFIED IDEOGRAPH-5902     # 
+
+2F85C ;        5906 ;  ML      # ( 夆 → 夆 ) CJK COMPATIBILITY IDEOGRAPH-2F85C → CJK UNIFIED IDEOGRAPH-5906     # 
+
+2F22 ; 590A ;  ML      #* ( ⼢ → 夊 ) KANGXI RADICAL GO SLOWLY → CJK UNIFIED IDEOGRAPH-590A      # 
+
+2F23 ; 5915 ;  ML      #* ( ⼣ → 夕 ) KANGXI RADICAL EVENING → CJK UNIFIED IDEOGRAPH-5915        # 
+
+2F85D ;        591A ;  ML      # ( 多 → 多 ) CJK COMPATIBILITY IDEOGRAPH-2F85D → CJK UNIFIED IDEOGRAPH-591A     # 
+
+2F85E ;        5922 ;  ML      # ( 夢 → 夢 ) CJK COMPATIBILITY IDEOGRAPH-2F85E → CJK UNIFIED IDEOGRAPH-5922     # 
+
+2F24 ; 5927 ;  ML      #* ( ⼤ → 大 ) KANGXI RADICAL BIG → CJK UNIFIED IDEOGRAPH-5927    # 
+
+FA7E ; 5944 ;  ML      # ( 奄 → 奄 ) CJK COMPATIBILITY IDEOGRAPH-FA7E → CJK UNIFIED IDEOGRAPH-5944       # 
+
+F90C ; 5948 ;  ML      # ( 奈 → 奈 ) CJK COMPATIBILITY IDEOGRAPH-F90C → CJK UNIFIED IDEOGRAPH-5948       # 
+
+F909 ; 5951 ;  ML      # ( 契 → 契 ) CJK COMPATIBILITY IDEOGRAPH-F909 → CJK UNIFIED IDEOGRAPH-5951       # 
+
+FA7F ; 5954 ;  ML      # ( 奔 → 奔 ) CJK COMPATIBILITY IDEOGRAPH-FA7F → CJK UNIFIED IDEOGRAPH-5954       # 
+
+2F85F ;        5962 ;  ML      # ( 奢 → 奢 ) CJK COMPATIBILITY IDEOGRAPH-2F85F → CJK UNIFIED IDEOGRAPH-5962     # 
+
+F981 ; 5973 ;  ML      # ( 女 → 女 ) CJK COMPATIBILITY IDEOGRAPH-F981 → CJK UNIFIED IDEOGRAPH-5973       # 
+2F25 ; 5973 ;  ML      #* ( ⼥ → 女 ) KANGXI RADICAL WOMAN → CJK UNIFIED IDEOGRAPH-5973  # 
+
+2F865 ;        59D8 ;  ML      # ( 姘 → 姘 ) CJK COMPATIBILITY IDEOGRAPH-2F865 → CJK UNIFIED IDEOGRAPH-59D8     # 
+
+2F862 ;        59EC ;  ML      # ( 姬 → 姬 ) CJK COMPATIBILITY IDEOGRAPH-2F862 → CJK UNIFIED IDEOGRAPH-59EC     # 
+
+2F863 ;        5A1B ;  ML      # ( 娛 → 娛 ) CJK COMPATIBILITY IDEOGRAPH-2F863 → CJK UNIFIED IDEOGRAPH-5A1B     # 
+
+2F864 ;        5A27 ;  ML      # ( 娧 → 娧 ) CJK COMPATIBILITY IDEOGRAPH-2F864 → CJK UNIFIED IDEOGRAPH-5A27     # 
+
+FA80 ; 5A62 ;  ML      # ( 婢 → 婢 ) CJK COMPATIBILITY IDEOGRAPH-FA80 → CJK UNIFIED IDEOGRAPH-5A62       # 
+
+2F866 ;        5A66 ;  ML      # ( 婦 → 婦 ) CJK COMPATIBILITY IDEOGRAPH-2F866 → CJK UNIFIED IDEOGRAPH-5A66     # 
+
+5B00 ; 5AAF ;  ML      # ( 嬀 → 媯 ) CJK UNIFIED IDEOGRAPH-5B00 → CJK UNIFIED IDEOGRAPH-5AAF     # 
+
+2F986 ;        5AB5 ;  ML      # ( 媵 → 媵 ) CJK COMPATIBILITY IDEOGRAPH-2F986 → CJK UNIFIED IDEOGRAPH-5AB5     # 
+
+2F869 ;        5B08 ;  ML      # ( 嬈 → 嬈 ) CJK COMPATIBILITY IDEOGRAPH-2F869 → CJK UNIFIED IDEOGRAPH-5B08     # 
+
+FA81 ; 5B28 ;  ML      # ( 嬨 → 嬨 ) CJK COMPATIBILITY IDEOGRAPH-FA81 → CJK UNIFIED IDEOGRAPH-5B28       # 
+
+2F86A ;        5B3E ;  ML      # ( 嬾 → 嬾 ) CJK COMPATIBILITY IDEOGRAPH-2F86A → CJK UNIFIED IDEOGRAPH-5B3E     # 
+2F86B ;        5B3E ;  ML      # ( 嬾 → 嬾 ) CJK COMPATIBILITY IDEOGRAPH-2F86B → CJK UNIFIED IDEOGRAPH-5B3E     # 
+
+2F26 ; 5B50 ;  ML      #* ( ⼦ → 子 ) KANGXI RADICAL CHILD → CJK UNIFIED IDEOGRAPH-5B50  # 
+
+2F27 ; 5B80 ;  ML      #* ( ⼧ → 宀 ) KANGXI RADICAL ROOF → CJK UNIFIED IDEOGRAPH-5B80   # 
+
+FA04 ; 5B85 ;  ML      # ( 宅 → 宅 ) CJK COMPATIBILITY IDEOGRAPH-FA04 → CJK UNIFIED IDEOGRAPH-5B85       # 
+
+2F86D ;        5BC3 ;  ML      # ( 寃 → 寃 ) CJK COMPATIBILITY IDEOGRAPH-2F86D → CJK UNIFIED IDEOGRAPH-5BC3     # 
+
+2F86E ;        5BD8 ;  ML      # ( 寘 → 寘 ) CJK COMPATIBILITY IDEOGRAPH-2F86E → CJK UNIFIED IDEOGRAPH-5BD8     # 
+
+F95F ; 5BE7 ;  ML      # ( 寧 → 寧 ) CJK COMPATIBILITY IDEOGRAPH-F95F → CJK UNIFIED IDEOGRAPH-5BE7       # 
+F9AA ; 5BE7 ;  ML      # ( 寧 → 寧 ) CJK COMPATIBILITY IDEOGRAPH-F9AA → CJK UNIFIED IDEOGRAPH-5BE7       # 
+2F86F ;        5BE7 ;  ML      # ( 寧 → 寧 ) CJK COMPATIBILITY IDEOGRAPH-2F86F → CJK UNIFIED IDEOGRAPH-5BE7     # 
+
+F9BC ; 5BEE ;  ML      # ( 寮 → 寮 ) CJK COMPATIBILITY IDEOGRAPH-F9BC → CJK UNIFIED IDEOGRAPH-5BEE       # 
+
+2F870 ;        5BF3 ;  ML      # ( 寳 → 寳 ) CJK COMPATIBILITY IDEOGRAPH-2F870 → CJK UNIFIED IDEOGRAPH-5BF3     # 
+
+2F28 ; 5BF8 ;  ML      #* ( ⼨ → 寸 ) KANGXI RADICAL INCH → CJK UNIFIED IDEOGRAPH-5BF8   # 
+
+2F872 ;        5BFF ;  ML      # ( 寿 → 寿 ) CJK COMPATIBILITY IDEOGRAPH-2F872 → CJK UNIFIED IDEOGRAPH-5BFF     # 
+
+2F873 ;        5C06 ;  ML      # ( 将 → 将 ) CJK COMPATIBILITY IDEOGRAPH-2F873 → CJK UNIFIED IDEOGRAPH-5C06     # 
+
+2F29 ; 5C0F ;  ML      #* ( ⼩ → 小 ) KANGXI RADICAL SMALL → CJK UNIFIED IDEOGRAPH-5C0F  # 
+
+2F875 ;        5C22 ;  ML      # ( 尢 → 尢 ) CJK COMPATIBILITY IDEOGRAPH-2F875 → CJK UNIFIED IDEOGRAPH-5C22     # 
+2E90 ; 5C22 ;  ML      #* ( ⺐ → 尢 ) CJK RADICAL LAME THREE → CJK UNIFIED IDEOGRAPH-5C22        # 
+2F2A ; 5C22 ;  ML      #* ( ⼪ → 尢 ) KANGXI RADICAL LAME → CJK UNIFIED IDEOGRAPH-5C22   # 
+
+2E8F ; 5C23 ;  ML      #* ( ⺏ → 尣 ) CJK RADICAL LAME TWO → CJK UNIFIED IDEOGRAPH-5C23  # 
+
+2F2B ; 5C38 ;  ML      #* ( ⼫ → 尸 ) KANGXI RADICAL CORPSE → CJK UNIFIED IDEOGRAPH-5C38 # 
+
+F9BD ; 5C3F ;  ML      # ( 尿 → 尿 ) CJK COMPATIBILITY IDEOGRAPH-F9BD → CJK UNIFIED IDEOGRAPH-5C3F       # 
+
+2F877 ;        5C60 ;  ML      # ( 屠 → 屠 ) CJK COMPATIBILITY IDEOGRAPH-2F877 → CJK UNIFIED IDEOGRAPH-5C60     # 
+
+F94B ; 5C62 ;  ML      # ( 屢 → 屢 ) CJK COMPATIBILITY IDEOGRAPH-F94B → CJK UNIFIED IDEOGRAPH-5C62       # 
+
+FA3B ; 5C64 ;  ML      # ( 層 → 層 ) CJK COMPATIBILITY IDEOGRAPH-FA3B → CJK UNIFIED IDEOGRAPH-5C64       # 
+
+F9DF ; 5C65 ;  ML      # ( 履 → 履 ) CJK COMPATIBILITY IDEOGRAPH-F9DF → CJK UNIFIED IDEOGRAPH-5C65       # 
+
+FA3C ; 5C6E ;  ML      # ( 屮 → 屮 ) CJK COMPATIBILITY IDEOGRAPH-FA3C → CJK UNIFIED IDEOGRAPH-5C6E       # 
+2F878 ;        5C6E ;  ML      # ( 屮 → 屮 ) CJK COMPATIBILITY IDEOGRAPH-2F878 → CJK UNIFIED IDEOGRAPH-5C6E     # 
+2F2C ; 5C6E ;  ML      #* ( ⼬ → 屮 ) KANGXI RADICAL SPROUT → CJK UNIFIED IDEOGRAPH-5C6E # 
+
+2F2D ; 5C71 ;  ML      #* ( ⼭ → 山 ) KANGXI RADICAL MOUNTAIN → CJK UNIFIED IDEOGRAPH-5C71       # 
+
+2F87A ;        5C8D ;  ML      # ( 岍 → 岍 ) CJK COMPATIBILITY IDEOGRAPH-2F87A → CJK UNIFIED IDEOGRAPH-5C8D     # 
+
+2F879 ;        5CC0 ;  ML      # ( 峀 → 峀 ) CJK COMPATIBILITY IDEOGRAPH-2F879 → CJK UNIFIED IDEOGRAPH-5CC0     # 
+
+F9D5 ; 5D19 ;  ML      # ( 崙 → 崙 ) CJK COMPATIBILITY IDEOGRAPH-F9D5 → CJK UNIFIED IDEOGRAPH-5D19       # 
+
+2F87C ;        5D43 ;  ML      # ( 嵃 → 嵃 ) CJK COMPATIBILITY IDEOGRAPH-2F87C → CJK UNIFIED IDEOGRAPH-5D43     # 
+
+F921 ; 5D50 ;  ML      # ( 嵐 → 嵐 ) CJK COMPATIBILITY IDEOGRAPH-F921 → CJK UNIFIED IDEOGRAPH-5D50       # 
+
+2F87F ;        5D6B ;  ML      # ( 嵫 → 嵫 ) CJK COMPATIBILITY IDEOGRAPH-2F87F → CJK UNIFIED IDEOGRAPH-5D6B     # 
+
+2F87E ;        5D6E ;  ML      # ( 嵮 → 嵮 ) CJK COMPATIBILITY IDEOGRAPH-2F87E → CJK UNIFIED IDEOGRAPH-5D6E     # 
+
+2F880 ;        5D7C ;  ML      # ( 嵼 → 嵼 ) CJK COMPATIBILITY IDEOGRAPH-2F880 → CJK UNIFIED IDEOGRAPH-5D7C     # 
+
+2F9F4 ;        5DB2 ;  ML      # ( 嶲 → 嶲 ) CJK COMPATIBILITY IDEOGRAPH-2F9F4 → CJK UNIFIED IDEOGRAPH-5DB2     # 
+
+F9AB ; 5DBA ;  ML      # ( 嶺 → 嶺 ) CJK COMPATIBILITY IDEOGRAPH-F9AB → CJK UNIFIED IDEOGRAPH-5DBA       # 
+
+2F2E ; 5DDB ;  ML      #* ( ⼮ → 巛 ) KANGXI RADICAL RIVER → CJK UNIFIED IDEOGRAPH-5DDB  # 
+
+2F881 ;        5DE1 ;  ML      # ( 巡 → 巡 ) CJK COMPATIBILITY IDEOGRAPH-2F881 → CJK UNIFIED IDEOGRAPH-5DE1     # 
+
+2F882 ;        5DE2 ;  ML      # ( 巢 → 巢 ) CJK COMPATIBILITY IDEOGRAPH-2F882 → CJK UNIFIED IDEOGRAPH-5DE2     # 
+
+2F2F ; 5DE5 ;  ML      #* ( ⼯ → 工 ) KANGXI RADICAL WORK → CJK UNIFIED IDEOGRAPH-5DE5   # 
+
+2F30 ; 5DF1 ;  ML      #* ( ⼰ → 己 ) KANGXI RADICAL ONESELF → CJK UNIFIED IDEOGRAPH-5DF1        # 
+
+2E92 ; 5DF3 ;  ML      #* ( ⺒ → 巳 ) CJK RADICAL SNAKE → CJK UNIFIED IDEOGRAPH-5DF3     # 
+
+2F884 ;        5DFD ;  ML      # ( 巽 → 巽 ) CJK COMPATIBILITY IDEOGRAPH-2F884 → CJK UNIFIED IDEOGRAPH-5DFD     # 
+
+2F31 ; 5DFE ;  ML      #* ( ⼱ → 巾 ) KANGXI RADICAL TURBAN → CJK UNIFIED IDEOGRAPH-5DFE # 
+
+5E32 ; 5E21 ;  ML      # ( 帲 → 帡 ) CJK UNIFIED IDEOGRAPH-5E32 → CJK UNIFIED IDEOGRAPH-5E21     # 
+
+2F885 ;        5E28 ;  ML      # ( 帨 → 帨 ) CJK COMPATIBILITY IDEOGRAPH-2F885 → CJK UNIFIED IDEOGRAPH-5E28     # 
+
+2F886 ;        5E3D ;  ML      # ( 帽 → 帽 ) CJK COMPATIBILITY IDEOGRAPH-2F886 → CJK UNIFIED IDEOGRAPH-5E3D     # 
+
+2F887 ;        5E69 ;  ML      # ( 幩 → 幩 ) CJK COMPATIBILITY IDEOGRAPH-2F887 → CJK UNIFIED IDEOGRAPH-5E69     # 
+
+2F32 ; 5E72 ;  ML      #* ( ⼲ → 干 ) KANGXI RADICAL DRY → CJK UNIFIED IDEOGRAPH-5E72    # 
+
+F98E ; 5E74 ;  ML      # ( 年 → 年 ) CJK COMPATIBILITY IDEOGRAPH-F98E → CJK UNIFIED IDEOGRAPH-5E74       # 
+
+2E93 ; 5E7A ;  ML      #* ( ⺓ → 幺 ) CJK RADICAL THREAD → CJK UNIFIED IDEOGRAPH-5E7A    # 
+2F33 ; 5E7A ;  ML      #* ( ⼳ → 幺 ) KANGXI RADICAL SHORT THREAD → CJK UNIFIED IDEOGRAPH-5E7A   # 
+
+2F34 ; 5E7F ;  ML      #* ( ⼴ → 广 ) KANGXI RADICAL DOTTED CLIFF → CJK UNIFIED IDEOGRAPH-5E7F   # 
+
+FA01 ; 5EA6 ;  ML      # ( 度 → 度 ) CJK COMPATIBILITY IDEOGRAPH-FA01 → CJK UNIFIED IDEOGRAPH-5EA6       # 
+
+2F88B ;        5EB0 ;  ML      # ( 庰 → 庰 ) CJK COMPATIBILITY IDEOGRAPH-2F88B → CJK UNIFIED IDEOGRAPH-5EB0     # 
+
+2F88C ;        5EB3 ;  ML      # ( 庳 → 庳 ) CJK COMPATIBILITY IDEOGRAPH-2F88C → CJK UNIFIED IDEOGRAPH-5EB3     # 
+
+2F88D ;        5EB6 ;  ML      # ( 庶 → 庶 ) CJK COMPATIBILITY IDEOGRAPH-2F88D → CJK UNIFIED IDEOGRAPH-5EB6     # 
+
+F9A2 ; 5EC9 ;  ML      # ( 廉 → 廉 ) CJK COMPATIBILITY IDEOGRAPH-F9A2 → CJK UNIFIED IDEOGRAPH-5EC9       # 
+
+F928 ; 5ECA ;  ML      # ( 廊 → 廊 ) CJK COMPATIBILITY IDEOGRAPH-F928 → CJK UNIFIED IDEOGRAPH-5ECA       # 
+2F88E ;        5ECA ;  ML      # ( 廊 → 廊 ) CJK COMPATIBILITY IDEOGRAPH-2F88E → CJK UNIFIED IDEOGRAPH-5ECA     # 
+
+FA82 ; 5ED2 ;  ML      # ( 廒 → 廒 ) CJK COMPATIBILITY IDEOGRAPH-FA82 → CJK UNIFIED IDEOGRAPH-5ED2       # 
+
+FA0B ; 5ED3 ;  ML      # ( 廓 → 廓 ) CJK COMPATIBILITY IDEOGRAPH-FA0B → CJK UNIFIED IDEOGRAPH-5ED3       # 
+
+FA83 ; 5ED9 ;  ML      # ( 廙 → 廙 ) CJK COMPATIBILITY IDEOGRAPH-FA83 → CJK UNIFIED IDEOGRAPH-5ED9       # 
+
+F982 ; 5EEC ;  ML      # ( 廬 → 廬 ) CJK COMPATIBILITY IDEOGRAPH-F982 → CJK UNIFIED IDEOGRAPH-5EEC       # 
+
+2F35 ; 5EF4 ;  ML      #* ( ⼵ → 廴 ) KANGXI RADICAL LONG STRIDE → CJK UNIFIED IDEOGRAPH-5EF4    # 
+
+2F890 ;        5EFE ;  ML      # ( 廾 → 廾 ) CJK COMPATIBILITY IDEOGRAPH-2F890 → CJK UNIFIED IDEOGRAPH-5EFE     # 
+2F36 ; 5EFE ;  ML      #* ( ⼶ → 廾 ) KANGXI RADICAL TWO HANDS → CJK UNIFIED IDEOGRAPH-5EFE      # 
+
+F943 ; 5F04 ;  ML      # ( 弄 → 弄 ) CJK COMPATIBILITY IDEOGRAPH-F943 → CJK UNIFIED IDEOGRAPH-5F04       # 
+
+2F37 ; 5F0B ;  ML      #* ( ⼷ → 弋 ) KANGXI RADICAL SHOOT → CJK UNIFIED IDEOGRAPH-5F0B  # 
+
+2F38 ; 5F13 ;  ML      #* ( ⼸ → 弓 ) KANGXI RADICAL BOW → CJK UNIFIED IDEOGRAPH-5F13    # 
+
+2F894 ;        5F22 ;  ML      # ( 弢 → 弢 ) CJK COMPATIBILITY IDEOGRAPH-2F894 → CJK UNIFIED IDEOGRAPH-5F22     # 
+2F895 ;        5F22 ;  ML      # ( 弢 → 弢 ) CJK COMPATIBILITY IDEOGRAPH-2F895 → CJK UNIFIED IDEOGRAPH-5F22     # 
+
+2F39 ; 5F50 ;  ML      #* ( ⼹ → 彐 ) KANGXI RADICAL SNOUT → CJK UNIFIED IDEOGRAPH-5F50  # 
+
+2E94 ; 5F51 ;  ML      #* ( ⺔ → 彑 ) CJK RADICAL SNOUT ONE → CJK UNIFIED IDEOGRAPH-5F51 # 
+
+2F874 ;        5F53 ;  ML      # ( 当 → 当 ) CJK COMPATIBILITY IDEOGRAPH-2F874 → CJK UNIFIED IDEOGRAPH-5F53     # 
+
+2F3A ; 5F61 ;  ML      #* ( ⼺ → 彡 ) KANGXI RADICAL BRISTLE → CJK UNIFIED IDEOGRAPH-5F61        # 
+
+2F899 ;        5F62 ;  ML      # ( 形 → 形 ) CJK COMPATIBILITY IDEOGRAPH-2F899 → CJK UNIFIED IDEOGRAPH-5F62     # 
+
+FA84 ; 5F69 ;  ML      # ( 彩 → 彩 ) CJK COMPATIBILITY IDEOGRAPH-FA84 → CJK UNIFIED IDEOGRAPH-5F69       # 
+
+2F89A ;        5F6B ;  ML      # ( 彫 → 彫 ) CJK COMPATIBILITY IDEOGRAPH-2F89A → CJK UNIFIED IDEOGRAPH-5F6B     # 
+
+2F3B ; 5F73 ;  ML      #* ( ⼻ → 彳 ) KANGXI RADICAL STEP → CJK UNIFIED IDEOGRAPH-5F73   # 
+
+F9D8 ; 5F8B ;  ML      # ( 律 → 律 ) CJK COMPATIBILITY IDEOGRAPH-F9D8 → CJK UNIFIED IDEOGRAPH-5F8B       # 
+
+2F89C ;        5F9A ;  ML      # ( 徚 → 徚 ) CJK COMPATIBILITY IDEOGRAPH-2F89C → CJK UNIFIED IDEOGRAPH-5F9A     # 
+
+F966 ; 5FA9 ;  ML      # ( 復 → 復 ) CJK COMPATIBILITY IDEOGRAPH-F966 → CJK UNIFIED IDEOGRAPH-5FA9       # 
+
+FA85 ; 5FAD ;  ML      # ( 徭 → 徭 ) CJK COMPATIBILITY IDEOGRAPH-FA85 → CJK UNIFIED IDEOGRAPH-5FAD       # 
+
+2F3C ; 5FC3 ;  ML      #* ( ⼼ → 心 ) KANGXI RADICAL HEART → CJK UNIFIED IDEOGRAPH-5FC3  # 
+
+2E96 ; 5FC4 ;  ML      #* ( ⺖ → 忄 ) CJK RADICAL HEART ONE → CJK UNIFIED IDEOGRAPH-5FC4 # 
+
+2F89D ;        5FCD ;  ML      # ( 忍 → 忍 ) CJK COMPATIBILITY IDEOGRAPH-2F89D → CJK UNIFIED IDEOGRAPH-5FCD     # 
+
+2F89E ;        5FD7 ;  ML      # ( 志 → 志 ) CJK COMPATIBILITY IDEOGRAPH-2F89E → CJK UNIFIED IDEOGRAPH-5FD7     # 
+
+F9A3 ; 5FF5 ;  ML      # ( 念 → 念 ) CJK COMPATIBILITY IDEOGRAPH-F9A3 → CJK UNIFIED IDEOGRAPH-5FF5       # 
+
+2F89F ;        5FF9 ;  ML      # ( 忹 → 忹 ) CJK COMPATIBILITY IDEOGRAPH-2F89F → CJK UNIFIED IDEOGRAPH-5FF9     # 
+
+F960 ; 6012 ;  ML      # ( 怒 → 怒 ) CJK COMPATIBILITY IDEOGRAPH-F960 → CJK UNIFIED IDEOGRAPH-6012       # 
+
+F9AC ; 601C ;  ML      # ( 怜 → 怜 ) CJK COMPATIBILITY IDEOGRAPH-F9AC → CJK UNIFIED IDEOGRAPH-601C       # 
+
+FA6B ; 6075 ;  ML      # ( 恵 → 恵 ) CJK COMPATIBILITY IDEOGRAPH-FA6B → CJK UNIFIED IDEOGRAPH-6075       # 
+
+2F8A0 ;        6081 ;  ML      # ( 悁 → 悁 ) CJK COMPATIBILITY IDEOGRAPH-2F8A0 → CJK UNIFIED IDEOGRAPH-6081     # 
+
+FA3D ; 6094 ;  ML      # ( 悔 → 悔 ) CJK COMPATIBILITY IDEOGRAPH-FA3D → CJK UNIFIED IDEOGRAPH-6094       # 
+2F8A3 ;        6094 ;  ML      # ( 悔 → 悔 ) CJK COMPATIBILITY IDEOGRAPH-2F8A3 → CJK UNIFIED IDEOGRAPH-6094     # 
+
+2F8A5 ;        60C7 ;  ML      # ( 惇 → 惇 ) CJK COMPATIBILITY IDEOGRAPH-2F8A5 → CJK UNIFIED IDEOGRAPH-60C7     # 
+
+FA86 ; 60D8 ;  ML      # ( 惘 → 惘 ) CJK COMPATIBILITY IDEOGRAPH-FA86 → CJK UNIFIED IDEOGRAPH-60D8       # 
+
+F9B9 ; 60E1 ;  ML      # ( 惡 → 惡 ) CJK COMPATIBILITY IDEOGRAPH-F9B9 → CJK UNIFIED IDEOGRAPH-60E1       # 
+
+FA88 ; 6108 ;  ML      # ( 愈 → 愈 ) CJK COMPATIBILITY IDEOGRAPH-FA88 → CJK UNIFIED IDEOGRAPH-6108       # 
+
+F9D9 ; 6144 ;  ML      # ( 慄 → 慄 ) CJK COMPATIBILITY IDEOGRAPH-F9D9 → CJK UNIFIED IDEOGRAPH-6144       # 
+
+2F8A6 ;        6148 ;  ML      # ( 慈 → 慈 ) CJK COMPATIBILITY IDEOGRAPH-2F8A6 → CJK UNIFIED IDEOGRAPH-6148     # 
+
+2F8A7 ;        614C ;  ML      # ( 慌 → 慌 ) CJK COMPATIBILITY IDEOGRAPH-2F8A7 → CJK UNIFIED IDEOGRAPH-614C     # 
+2F8A9 ;        614C ;  ML      # ( 慌 → 慌 ) CJK COMPATIBILITY IDEOGRAPH-2F8A9 → CJK UNIFIED IDEOGRAPH-614C     # 
+
+FA87 ; 614E ;  ML      # ( 慎 → 慎 ) CJK COMPATIBILITY IDEOGRAPH-FA87 → CJK UNIFIED IDEOGRAPH-614E       # 
+2F8A8 ;        614E ;  ML      # ( 慎 → 慎 ) CJK COMPATIBILITY IDEOGRAPH-2F8A8 → CJK UNIFIED IDEOGRAPH-614E     # 
+
+FA8A ; 6160 ;  ML      # ( 慠 → 慠 ) CJK COMPATIBILITY IDEOGRAPH-FA8A → CJK UNIFIED IDEOGRAPH-6160       # 
+
+FA3E ; 6168 ;  ML      # ( 慨 → 慨 ) CJK COMPATIBILITY IDEOGRAPH-FA3E → CJK UNIFIED IDEOGRAPH-6168       # 
+
+2F8AA ;        617A ;  ML      # ( 慺 → 慺 ) CJK COMPATIBILITY IDEOGRAPH-2F8AA → CJK UNIFIED IDEOGRAPH-617A     # 
+
+FA3F ; 618E ;  ML      # ( 憎 → 憎 ) CJK COMPATIBILITY IDEOGRAPH-FA3F → CJK UNIFIED IDEOGRAPH-618E       # 
+FA89 ; 618E ;  ML      # ( 憎 → 憎 ) CJK COMPATIBILITY IDEOGRAPH-FA89 → CJK UNIFIED IDEOGRAPH-618E       # 
+2F8AB ;        618E ;  ML      # ( 憎 → 憎 ) CJK COMPATIBILITY IDEOGRAPH-2F8AB → CJK UNIFIED IDEOGRAPH-618E     # 
+
+F98F ; 6190 ;  ML      # ( 憐 → 憐 ) CJK COMPATIBILITY IDEOGRAPH-F98F → CJK UNIFIED IDEOGRAPH-6190       # 
+
+2F8AD ;        61A4 ;  ML      # ( 憤 → 憤 ) CJK COMPATIBILITY IDEOGRAPH-2F8AD → CJK UNIFIED IDEOGRAPH-61A4     # 
+
+2F8AE ;        61AF ;  ML      # ( 憯 → 憯 ) CJK COMPATIBILITY IDEOGRAPH-2F8AE → CJK UNIFIED IDEOGRAPH-61AF     # 
+
+2F8AC ;        61B2 ;  ML      # ( 憲 → 憲 ) CJK COMPATIBILITY IDEOGRAPH-2F8AC → CJK UNIFIED IDEOGRAPH-61B2     # 
+
+2F8AF ;        61DE ;  ML      # ( 懞 → 懞 ) CJK COMPATIBILITY IDEOGRAPH-2F8AF → CJK UNIFIED IDEOGRAPH-61DE     # 
+
+FA40 ; 61F2 ;  ML      # ( 懲 → 懲 ) CJK COMPATIBILITY IDEOGRAPH-FA40 → CJK UNIFIED IDEOGRAPH-61F2       # 
+FA8B ; 61F2 ;  ML      # ( 懲 → 懲 ) CJK COMPATIBILITY IDEOGRAPH-FA8B → CJK UNIFIED IDEOGRAPH-61F2       # 
+2F8B0 ;        61F2 ;  ML      # ( 懲 → 懲 ) CJK COMPATIBILITY IDEOGRAPH-2F8B0 → CJK UNIFIED IDEOGRAPH-61F2     # 
+
+F90D ; 61F6 ;  ML      # ( 懶 → 懶 ) CJK COMPATIBILITY IDEOGRAPH-F90D → CJK UNIFIED IDEOGRAPH-61F6       # 
+2F8B1 ;        61F6 ;  ML      # ( 懶 → 懶 ) CJK COMPATIBILITY IDEOGRAPH-2F8B1 → CJK UNIFIED IDEOGRAPH-61F6     # 
+
+F990 ; 6200 ;  ML      # ( 戀 → 戀 ) CJK COMPATIBILITY IDEOGRAPH-F990 → CJK UNIFIED IDEOGRAPH-6200       # 
+
+2F3D ; 6208 ;  ML      #* ( ⼽ → 戈 ) KANGXI RADICAL HALBERD → CJK UNIFIED IDEOGRAPH-6208        # 
+
+2F8B2 ;        6210 ;  ML      # ( 成 → 成 ) CJK COMPATIBILITY IDEOGRAPH-2F8B2 → CJK UNIFIED IDEOGRAPH-6210     # 
+
+2F8B3 ;        621B ;  ML      # ( 戛 → 戛 ) CJK COMPATIBILITY IDEOGRAPH-2F8B3 → CJK UNIFIED IDEOGRAPH-621B     # 
+
+F9D2 ; 622E ;  ML      # ( 戮 → 戮 ) CJK COMPATIBILITY IDEOGRAPH-F9D2 → CJK UNIFIED IDEOGRAPH-622E       # 
+
+FA8C ; 6234 ;  ML      # ( 戴 → 戴 ) CJK COMPATIBILITY IDEOGRAPH-FA8C → CJK UNIFIED IDEOGRAPH-6234       # 
+
+2F3E ; 6236 ;  ML      #* ( ⼾ → 戶 ) KANGXI RADICAL DOOR → CJK UNIFIED IDEOGRAPH-6236   # 
+6238 ; 6236 ;  ML      # ( 戸 → 戶 ) CJK UNIFIED IDEOGRAPH-6238 → CJK UNIFIED IDEOGRAPH-6236     # →⼾→
+
+2F3F ; 624B ;  ML      #* ( ⼿ → 手 ) KANGXI RADICAL HAND → CJK UNIFIED IDEOGRAPH-624B   # 
+
+2E98 ; 624C ;  ML      #* ( ⺘ → 扌 ) CJK RADICAL HAND → CJK UNIFIED IDEOGRAPH-624C      # 
+
+2F8B4 ;        625D ;  ML      # ( 扝 → 扝 ) CJK COMPATIBILITY IDEOGRAPH-2F8B4 → CJK UNIFIED IDEOGRAPH-625D     # 
+
+2F8B5 ;        62B1 ;  ML      # ( 抱 → 抱 ) CJK COMPATIBILITY IDEOGRAPH-2F8B5 → CJK UNIFIED IDEOGRAPH-62B1     # 
+
+F925 ; 62C9 ;  ML      # ( 拉 → 拉 ) CJK COMPATIBILITY IDEOGRAPH-F925 → CJK UNIFIED IDEOGRAPH-62C9       # 
+
+F95B ; 62CF ;  ML      # ( 拏 → 拏 ) CJK COMPATIBILITY IDEOGRAPH-F95B → CJK UNIFIED IDEOGRAPH-62CF       # 
+
+FA02 ; 62D3 ;  ML      # ( 拓 → 拓 ) CJK COMPATIBILITY IDEOGRAPH-FA02 → CJK UNIFIED IDEOGRAPH-62D3       # 
+
+2F8B6 ;        62D4 ;  ML      # ( 拔 → 拔 ) CJK COMPATIBILITY IDEOGRAPH-2F8B6 → CJK UNIFIED IDEOGRAPH-62D4     # 
+
+2F8BA ;        62FC ;  ML      # ( 拼 → 拼 ) CJK COMPATIBILITY IDEOGRAPH-2F8BA → CJK UNIFIED IDEOGRAPH-62FC     # 
+
+F973 ; 62FE ;  ML      # ( 拾 → 拾 ) CJK COMPATIBILITY IDEOGRAPH-F973 → CJK UNIFIED IDEOGRAPH-62FE       # 
+
+2F8B9 ;        633D ;  ML      # ( 挽 → 挽 ) CJK COMPATIBILITY IDEOGRAPH-2F8B9 → CJK UNIFIED IDEOGRAPH-633D     # 
+
+2F8B7 ;        6350 ;  ML      # ( 捐 → 捐 ) CJK COMPATIBILITY IDEOGRAPH-2F8B7 → CJK UNIFIED IDEOGRAPH-6350     # 
+
+2F8BB ;        6368 ;  ML      # ( 捨 → 捨 ) CJK COMPATIBILITY IDEOGRAPH-2F8BB → CJK UNIFIED IDEOGRAPH-6368     # 
+
+F9A4 ; 637B ;  ML      # ( 捻 → 捻 ) CJK COMPATIBILITY IDEOGRAPH-F9A4 → CJK UNIFIED IDEOGRAPH-637B       # 
+
+2F8BC ;        6383 ;  ML      # ( 掃 → 掃 ) CJK COMPATIBILITY IDEOGRAPH-2F8BC → CJK UNIFIED IDEOGRAPH-6383     # 
+
+F975 ; 63A0 ;  ML      # ( 掠 → 掠 ) CJK COMPATIBILITY IDEOGRAPH-F975 → CJK UNIFIED IDEOGRAPH-63A0       # 
+
+2F8C1 ;        63A9 ;  ML      # ( 掩 → 掩 ) CJK COMPATIBILITY IDEOGRAPH-2F8C1 → CJK UNIFIED IDEOGRAPH-63A9     # 
+
+FA8D ; 63C4 ;  ML      # ( 揄 → 揄 ) CJK COMPATIBILITY IDEOGRAPH-FA8D → CJK UNIFIED IDEOGRAPH-63C4       # 
+
+2F8C0 ;        63C5 ;  ML      # ( 揅 → 揅 ) CJK COMPATIBILITY IDEOGRAPH-2F8C0 → CJK UNIFIED IDEOGRAPH-63C5     # 
+
+2F8BD ;        63E4 ;  ML      # ( 揤 → 揤 ) CJK COMPATIBILITY IDEOGRAPH-2F8BD → CJK UNIFIED IDEOGRAPH-63E4     # 
+
+FA8E ; 641C ;  ML      # ( 搜 → 搜 ) CJK COMPATIBILITY IDEOGRAPH-FA8E → CJK UNIFIED IDEOGRAPH-641C       # 
+
+2F8BF ;        6422 ;  ML      # ( 搢 → 搢 ) CJK COMPATIBILITY IDEOGRAPH-2F8BF → CJK UNIFIED IDEOGRAPH-6422     # 
+
+FA8F ; 6452 ;  ML      # ( 摒 → 摒 ) CJK COMPATIBILITY IDEOGRAPH-FA8F → CJK UNIFIED IDEOGRAPH-6452       # 
+
+2F8C3 ;        6469 ;  ML      # ( 摩 → 摩 ) CJK COMPATIBILITY IDEOGRAPH-2F8C3 → CJK UNIFIED IDEOGRAPH-6469     # 
+
+2F8C6 ;        6477 ;  ML      # ( 摷 → 摷 ) CJK COMPATIBILITY IDEOGRAPH-2F8C6 → CJK UNIFIED IDEOGRAPH-6477     # 
+
+2F8C4 ;        647E ;  ML      # ( 摾 → 摾 ) CJK COMPATIBILITY IDEOGRAPH-2F8C4 → CJK UNIFIED IDEOGRAPH-647E     # 
+
+F991 ; 649A ;  ML      # ( 撚 → 撚 ) CJK COMPATIBILITY IDEOGRAPH-F991 → CJK UNIFIED IDEOGRAPH-649A       # 
+
+2F8C5 ;        649D ;  ML      # ( 撝 → 撝 ) CJK COMPATIBILITY IDEOGRAPH-2F8C5 → CJK UNIFIED IDEOGRAPH-649D     # 
+
+F930 ; 64C4 ;  ML      # ( 擄 → 擄 ) CJK COMPATIBILITY IDEOGRAPH-F930 → CJK UNIFIED IDEOGRAPH-64C4       # 
+
+2F40 ; 652F ;  ML      #* ( ⽀ → 支 ) KANGXI RADICAL BRANCH → CJK UNIFIED IDEOGRAPH-652F # 
+
+2F41 ; 6534 ;  ML      #* ( ⽁ → 攴 ) KANGXI RADICAL RAP → CJK UNIFIED IDEOGRAPH-6534    # 
+
+2E99 ; 6535 ;  ML      #* ( ⺙ → 攵 ) CJK RADICAL RAP → CJK UNIFIED IDEOGRAPH-6535       # 
+
+FA41 ; 654F ;  ML      # ( 敏 → 敏 ) CJK COMPATIBILITY IDEOGRAPH-FA41 → CJK UNIFIED IDEOGRAPH-654F       # 
+2F8C8 ;        654F ;  ML      # ( 敏 → 敏 ) CJK COMPATIBILITY IDEOGRAPH-2F8C8 → CJK UNIFIED IDEOGRAPH-654F     # 
+
+FA90 ; 6556 ;  ML      # ( 敖 → 敖 ) CJK COMPATIBILITY IDEOGRAPH-FA90 → CJK UNIFIED IDEOGRAPH-6556       # 
+
+2F8C9 ;        656C ;  ML      # ( 敬 → 敬 ) CJK COMPATIBILITY IDEOGRAPH-2F8C9 → CJK UNIFIED IDEOGRAPH-656C     # 
+
+F969 ; 6578 ;  ML      # ( 數 → 數 ) CJK COMPATIBILITY IDEOGRAPH-F969 → CJK UNIFIED IDEOGRAPH-6578       # 
+
+2F42 ; 6587 ;  ML      #* ( ⽂ → 文 ) KANGXI RADICAL SCRIPT → CJK UNIFIED IDEOGRAPH-6587 # 
+
+2EEB ; 6589 ;  ML      #* ( ⻫ → 斉 ) CJK RADICAL J-SIMPLIFIED EVEN → CJK UNIFIED IDEOGRAPH-6589 # 
+
+2F43 ; 6597 ;  ML      #* ( ⽃ → 斗 ) KANGXI RADICAL DIPPER → CJK UNIFIED IDEOGRAPH-6597 # 
+
+F9BE ; 6599 ;  ML      # ( 料 → 料 ) CJK COMPATIBILITY IDEOGRAPH-F9BE → CJK UNIFIED IDEOGRAPH-6599       # 
+
+2F44 ; 65A4 ;  ML      #* ( ⽄ → 斤 ) KANGXI RADICAL AXE → CJK UNIFIED IDEOGRAPH-65A4    # 
+
+2F45 ; 65B9 ;  ML      #* ( ⽅ → 方 ) KANGXI RADICAL SQUARE → CJK UNIFIED IDEOGRAPH-65B9 # 
+
+F983 ; 65C5 ;  ML      # ( 旅 → 旅 ) CJK COMPATIBILITY IDEOGRAPH-F983 → CJK UNIFIED IDEOGRAPH-65C5       # 
+
+2F46 ; 65E0 ;  ML      #* ( ⽆ → 无 ) KANGXI RADICAL NOT → CJK UNIFIED IDEOGRAPH-65E0    # 
+
+2E9B ; 65E1 ;  ML      #* ( ⺛ → 旡 ) CJK RADICAL CHOKE → CJK UNIFIED IDEOGRAPH-65E1     # 
+
+FA42 ; 65E2 ;  ML      # ( 既 → 既 ) CJK COMPATIBILITY IDEOGRAPH-FA42 → CJK UNIFIED IDEOGRAPH-65E2       # 
+
+2F8CB ;        65E3 ;  ML      # ( 旣 → 旣 ) CJK COMPATIBILITY IDEOGRAPH-2F8CB → CJK UNIFIED IDEOGRAPH-65E3     # 
+
+2F47 ; 65E5 ;  ML      #* ( ⽇ → 日 ) KANGXI RADICAL SUN → CJK UNIFIED IDEOGRAPH-65E5    # 
+
+F9E0 ; 6613 ;  ML      # ( 易 → 易 ) CJK COMPATIBILITY IDEOGRAPH-F9E0 → CJK UNIFIED IDEOGRAPH-6613       # 
+
+2F8CD ;        6649 ;  ML      # ( 晉 → 晉 ) CJK COMPATIBILITY IDEOGRAPH-2F8CD → CJK UNIFIED IDEOGRAPH-6649     # 
+
+6669 ; 665A ;  ML      # ( 晩 → 晚 ) CJK UNIFIED IDEOGRAPH-6669 → CJK UNIFIED IDEOGRAPH-665A     # 
+
+FA12 ; 6674 ;  ML      # ( 晴 → 晴 ) CJK COMPATIBILITY IDEOGRAPH-FA12 → CJK UNIFIED IDEOGRAPH-6674       # 
+FA91 ; 6674 ;  ML      # ( 晴 → 晴 ) CJK COMPATIBILITY IDEOGRAPH-FA91 → CJK UNIFIED IDEOGRAPH-6674       # 
+
+F9C5 ; 6688 ;  ML      # ( 暈 → 暈 ) CJK COMPATIBILITY IDEOGRAPH-F9C5 → CJK UNIFIED IDEOGRAPH-6688       # 
+
+FA43 ; 6691 ;  ML      # ( 暑 → 暑 ) CJK COMPATIBILITY IDEOGRAPH-FA43 → CJK UNIFIED IDEOGRAPH-6691       # 
+2F8CF ;        6691 ;  ML      # ( 暑 → 暑 ) CJK COMPATIBILITY IDEOGRAPH-2F8CF → CJK UNIFIED IDEOGRAPH-6691     # 
+
+2F8D5 ;        669C ;  ML      # ( 暜 → 暜 ) CJK COMPATIBILITY IDEOGRAPH-2F8D5 → CJK UNIFIED IDEOGRAPH-669C     # 
+
+FA06 ; 66B4 ;  ML      # ( 暴 → 暴 ) CJK COMPATIBILITY IDEOGRAPH-FA06 → CJK UNIFIED IDEOGRAPH-66B4       # 
+
+F98B ; 66C6 ;  ML      # ( 曆 → 曆 ) CJK COMPATIBILITY IDEOGRAPH-F98B → CJK UNIFIED IDEOGRAPH-66C6       # 
+
+2F48 ; 66F0 ;  ML      #* ( ⽈ → 曰 ) KANGXI RADICAL SAY → CJK UNIFIED IDEOGRAPH-66F0    # 
+
+F901 ; 66F4 ;  ML      # ( 更 → 更 ) CJK COMPATIBILITY IDEOGRAPH-F901 → CJK UNIFIED IDEOGRAPH-66F4       # 
+
+2F8CC ;        66F8 ;  ML      # ( 書 → 書 ) CJK COMPATIBILITY IDEOGRAPH-2F8CC → CJK UNIFIED IDEOGRAPH-66F8     # 
+
+2F8D4 ;        6700 ;  ML      # ( 最 → 最 ) CJK COMPATIBILITY IDEOGRAPH-2F8D4 → CJK UNIFIED IDEOGRAPH-6700     # 
+
+2F49 ; 6708 ;  ML      #* ( ⽉ → 月 ) KANGXI RADICAL MOON → CJK UNIFIED IDEOGRAPH-6708   # 
+
+80A6 ; 670C ;  ML      # ( 肦 → 朌 ) CJK UNIFIED IDEOGRAPH-80A6 → CJK UNIFIED IDEOGRAPH-670C     # 
+
+80D0 ; 670F ;  ML      # ( 胐 → 朏 ) CJK UNIFIED IDEOGRAPH-80D0 → CJK UNIFIED IDEOGRAPH-670F     # 
+
+80CA ; 6710 ;  ML      # ( 胊 → 朐 ) CJK UNIFIED IDEOGRAPH-80CA → CJK UNIFIED IDEOGRAPH-6710     # 
+
+8101 ; 6713 ;  ML      # ( 脁 → 朓 ) CJK UNIFIED IDEOGRAPH-8101 → CJK UNIFIED IDEOGRAPH-6713     # 
+
+F929 ; 6717 ;  ML      # ( 朗 → 朗 ) CJK COMPATIBILITY IDEOGRAPH-F929 → CJK UNIFIED IDEOGRAPH-6717       # 
+FA92 ; 6717 ;  ML      # ( 朗 → 朗 ) CJK COMPATIBILITY IDEOGRAPH-FA92 → CJK UNIFIED IDEOGRAPH-6717       # 
+2F8D8 ;        6717 ;  ML      # ( 朗 → 朗 ) CJK COMPATIBILITY IDEOGRAPH-2F8D8 → CJK UNIFIED IDEOGRAPH-6717     # 
+
+8127 ; 6718 ;  ML      # ( 脧 → 朘 ) CJK UNIFIED IDEOGRAPH-8127 → CJK UNIFIED IDEOGRAPH-6718     # 
+
+FA93 ; 671B ;  ML      # ( 望 → 望 ) CJK COMPATIBILITY IDEOGRAPH-FA93 → CJK UNIFIED IDEOGRAPH-671B       # 
+2F8D9 ;        671B ;  ML      # ( 望 → 望 ) CJK COMPATIBILITY IDEOGRAPH-2F8D9 → CJK UNIFIED IDEOGRAPH-671B     # 
+
+2F8DA ;        6721 ;  ML      # ( 朡 → 朡 ) CJK COMPATIBILITY IDEOGRAPH-2F8DA → CJK UNIFIED IDEOGRAPH-6721     # 
+
+81A7 ; 6723 ;  ML      # ( 膧 → 朣 ) CJK UNIFIED IDEOGRAPH-81A7 → CJK UNIFIED IDEOGRAPH-6723     # 
+
+2F4A ; 6728 ;  ML      #* ( ⽊ → 木 ) KANGXI RADICAL TREE → CJK UNIFIED IDEOGRAPH-6728   # 
+
+F9E1 ; 674E ;  ML      # ( 李 → 李 ) CJK COMPATIBILITY IDEOGRAPH-F9E1 → CJK UNIFIED IDEOGRAPH-674E       # 
+
+2F8DC ;        6753 ;  ML      # ( 杓 → 杓 ) CJK COMPATIBILITY IDEOGRAPH-2F8DC → CJK UNIFIED IDEOGRAPH-6753     # 
+
+FA94 ; 6756 ;  ML      # ( 杖 → 杖 ) CJK COMPATIBILITY IDEOGRAPH-FA94 → CJK UNIFIED IDEOGRAPH-6756       # 
+
+2F8DB ;        675E ;  ML      # ( 杞 → 杞 ) CJK COMPATIBILITY IDEOGRAPH-2F8DB → CJK UNIFIED IDEOGRAPH-675E     # 
+
+67FF ; 676E ;  ML      # ( 柿 → 杮 ) CJK UNIFIED IDEOGRAPH-67FF → CJK UNIFIED IDEOGRAPH-676E     # 
+
+F9C8 ; 677B ;  ML      # ( 杻 → 杻 ) CJK COMPATIBILITY IDEOGRAPH-F9C8 → CJK UNIFIED IDEOGRAPH-677B       # 
+
+2F8E0 ;        6785 ;  ML      # ( 枅 → 枅 ) CJK COMPATIBILITY IDEOGRAPH-2F8E0 → CJK UNIFIED IDEOGRAPH-6785     # 
+
+F9F4 ; 6797 ;  ML      # ( 林 → 林 ) CJK COMPATIBILITY IDEOGRAPH-F9F4 → CJK UNIFIED IDEOGRAPH-6797       # 
+
+F9C9 ; 67F3 ;  ML      # ( 柳 → 柳 ) CJK COMPATIBILITY IDEOGRAPH-F9C9 → CJK UNIFIED IDEOGRAPH-67F3       # 
+
+2F8DF ;        67FA ;  ML      # ( 柺 → 柺 ) CJK COMPATIBILITY IDEOGRAPH-2F8DF → CJK UNIFIED IDEOGRAPH-67FA     # 
+
+F9DA ; 6817 ;  ML      # ( 栗 → 栗 ) CJK COMPATIBILITY IDEOGRAPH-F9DA → CJK UNIFIED IDEOGRAPH-6817       # 
+
+2F8E5 ;        681F ;  ML      # ( 栟 → 栟 ) CJK COMPATIBILITY IDEOGRAPH-2F8E5 → CJK UNIFIED IDEOGRAPH-681F     # 
+
+2F8E1 ;        6852 ;  ML      # ( 桒 → 桒 ) CJK COMPATIBILITY IDEOGRAPH-2F8E1 → CJK UNIFIED IDEOGRAPH-6852     # 
+
+F97A ; 6881 ;  ML      # ( 梁 → 梁 ) CJK COMPATIBILITY IDEOGRAPH-F97A → CJK UNIFIED IDEOGRAPH-6881       # 
+
+FA44 ; 6885 ;  ML      # ( 梅 → 梅 ) CJK COMPATIBILITY IDEOGRAPH-FA44 → CJK UNIFIED IDEOGRAPH-6885       # 
+2F8E2 ;        6885 ;  ML      # ( 梅 → 梅 ) CJK COMPATIBILITY IDEOGRAPH-2F8E2 → CJK UNIFIED IDEOGRAPH-6885     # 
+
+2F8E4 ;        688E ;  ML      # ( 梎 → 梎 ) CJK COMPATIBILITY IDEOGRAPH-2F8E4 → CJK UNIFIED IDEOGRAPH-688E     # 
+
+F9E2 ; 68A8 ;  ML      # ( 梨 → 梨 ) CJK COMPATIBILITY IDEOGRAPH-F9E2 → CJK UNIFIED IDEOGRAPH-68A8       # 
+
+2F8E6 ;        6914 ;  ML      # ( 椔 → 椔 ) CJK COMPATIBILITY IDEOGRAPH-2F8E6 → CJK UNIFIED IDEOGRAPH-6914     # 
+
+2F8E8 ;        6942 ;  ML      # ( 楂 → 楂 ) CJK COMPATIBILITY IDEOGRAPH-2F8E8 → CJK UNIFIED IDEOGRAPH-6942     # 
+
+6A27 ; 699D ;  ML      # ( 樧 → 榝 ) CJK UNIFIED IDEOGRAPH-6A27 → CJK UNIFIED IDEOGRAPH-699D     # 
+
+2F8E9 ;        69A3 ;  ML      # ( 榣 → 榣 ) CJK COMPATIBILITY IDEOGRAPH-2F8E9 → CJK UNIFIED IDEOGRAPH-69A3     # 
+
+2F8EA ;        69EA ;  ML      # ( 槪 → 槪 ) CJK COMPATIBILITY IDEOGRAPH-2F8EA → CJK UNIFIED IDEOGRAPH-69EA     # 
+
+F914 ; 6A02 ;  ML      # ( 樂 → 樂 ) CJK COMPATIBILITY IDEOGRAPH-F914 → CJK UNIFIED IDEOGRAPH-6A02       # 
+F95C ; 6A02 ;  ML      # ( 樂 → 樂 ) CJK COMPATIBILITY IDEOGRAPH-F95C → CJK UNIFIED IDEOGRAPH-6A02       # 
+F9BF ; 6A02 ;  ML      # ( 樂 → 樂 ) CJK COMPATIBILITY IDEOGRAPH-F9BF → CJK UNIFIED IDEOGRAPH-6A02       # 
+
+F94C ; 6A13 ;  ML      # ( 樓 → 樓 ) CJK COMPATIBILITY IDEOGRAPH-F94C → CJK UNIFIED IDEOGRAPH-6A13       # 
+
+2F8EB ;        6AA8 ;  ML      # ( 檨 → 檨 ) CJK COMPATIBILITY IDEOGRAPH-2F8EB → CJK UNIFIED IDEOGRAPH-6AA8     # 
+
+F931 ; 6AD3 ;  ML      # ( 櫓 → 櫓 ) CJK COMPATIBILITY IDEOGRAPH-F931 → CJK UNIFIED IDEOGRAPH-6AD3       # 
+
+2F8ED ;        6ADB ;  ML      # ( 櫛 → 櫛 ) CJK COMPATIBILITY IDEOGRAPH-2F8ED → CJK UNIFIED IDEOGRAPH-6ADB     # 
+
+F91D ; 6B04 ;  ML      # ( 欄 → 欄 ) CJK COMPATIBILITY IDEOGRAPH-F91D → CJK UNIFIED IDEOGRAPH-6B04       # 
+
+2F4B ; 6B20 ;  ML      #* ( ⽋ → 欠 ) KANGXI RADICAL LACK → CJK UNIFIED IDEOGRAPH-6B20   # 
+
+2F8EF ;        6B21 ;  ML      # ( 次 → 次 ) CJK COMPATIBILITY IDEOGRAPH-2F8EF → CJK UNIFIED IDEOGRAPH-6B21     # 
+
+2F8F1 ;        6B54 ;  ML      # ( 歔 → 歔 ) CJK COMPATIBILITY IDEOGRAPH-2F8F1 → CJK UNIFIED IDEOGRAPH-6B54     # 
+
+2F4C ; 6B62 ;  ML      #* ( ⽌ → 止 ) KANGXI RADICAL STOP → CJK UNIFIED IDEOGRAPH-6B62   # 
+
+2EED ; 6B6F ;  ML      #* ( ⻭ → 歯 ) CJK RADICAL J-SIMPLIFIED TOOTH → CJK UNIFIED IDEOGRAPH-6B6F        # 
+
+2F8F3 ;        6B72 ;  ML      # ( 歲 → 歲 ) CJK COMPATIBILITY IDEOGRAPH-2F8F3 → CJK UNIFIED IDEOGRAPH-6B72     # 
+
+F98C ; 6B77 ;  ML      # ( 歷 → 歷 ) CJK COMPATIBILITY IDEOGRAPH-F98C → CJK UNIFIED IDEOGRAPH-6B77       # 
+
+FA95 ; 6B79 ;  ML      # ( 歹 → 歹 ) CJK COMPATIBILITY IDEOGRAPH-FA95 → CJK UNIFIED IDEOGRAPH-6B79       # 
+2F4D ; 6B79 ;  ML      #* ( ⽍ → 歹 ) KANGXI RADICAL DEATH → CJK UNIFIED IDEOGRAPH-6B79  # 
+
+2E9E ; 6B7A ;  ML      #* ( ⺞ → 歺 ) CJK RADICAL DEATH → CJK UNIFIED IDEOGRAPH-6B7A     # 
+
+2F8F4 ;        6B9F ;  ML      # ( 殟 → 殟 ) CJK COMPATIBILITY IDEOGRAPH-2F8F4 → CJK UNIFIED IDEOGRAPH-6B9F     # 
+
+F9A5 ; 6BAE ;  ML      # ( 殮 → 殮 ) CJK COMPATIBILITY IDEOGRAPH-F9A5 → CJK UNIFIED IDEOGRAPH-6BAE       # 
+
+2F4E ; 6BB3 ;  ML      #* ( ⽎ → 殳 ) KANGXI RADICAL WEAPON → CJK UNIFIED IDEOGRAPH-6BB3 # 
+
+F970 ; 6BBA ;  ML      # ( 殺 → 殺 ) CJK COMPATIBILITY IDEOGRAPH-F970 → CJK UNIFIED IDEOGRAPH-6BBA       # 
+FA96 ; 6BBA ;  ML      # ( 殺 → 殺 ) CJK COMPATIBILITY IDEOGRAPH-FA96 → CJK UNIFIED IDEOGRAPH-6BBA       # 
+2F8F5 ;        6BBA ;  ML      # ( 殺 → 殺 ) CJK COMPATIBILITY IDEOGRAPH-2F8F5 → CJK UNIFIED IDEOGRAPH-6BBA     # 
+
+2F8F6 ;        6BBB ;  ML      # ( 殻 → 殻 ) CJK COMPATIBILITY IDEOGRAPH-2F8F6 → CJK UNIFIED IDEOGRAPH-6BBB     # 
+
+2F4F ; 6BCB ;  ML      #* ( ⽏ → 毋 ) KANGXI RADICAL DO NOT → CJK UNIFIED IDEOGRAPH-6BCB # 
+
+2E9F ; 6BCD ;  ML      #* ( ⺟ → 母 ) CJK RADICAL MOTHER → CJK UNIFIED IDEOGRAPH-6BCD    # 
+
+2F50 ; 6BD4 ;  ML      #* ( ⽐ → 比 ) KANGXI RADICAL COMPARE → CJK UNIFIED IDEOGRAPH-6BD4        # 
+
+2F51 ; 6BDB ;  ML      #* ( ⽑ → 毛 ) KANGXI RADICAL FUR → CJK UNIFIED IDEOGRAPH-6BDB    # 
+
+2F52 ; 6C0F ;  ML      #* ( ⽒ → 氏 ) KANGXI RADICAL CLAN → CJK UNIFIED IDEOGRAPH-6C0F   # 
+
+2EA0 ; 6C11 ;  ML      #* ( ⺠ → 民 ) CJK RADICAL CIVILIAN → CJK UNIFIED IDEOGRAPH-6C11  # 
+
+2F53 ; 6C14 ;  ML      #* ( ⽓ → 气 ) KANGXI RADICAL STEAM → CJK UNIFIED IDEOGRAPH-6C14  # 
+
+2F54 ; 6C34 ;  ML      #* ( ⽔ → 水 ) KANGXI RADICAL WATER → CJK UNIFIED IDEOGRAPH-6C34  # 
+
+2EA1 ; 6C35 ;  ML      #* ( ⺡ → 氵 ) CJK RADICAL WATER ONE → CJK UNIFIED IDEOGRAPH-6C35 # 
+
+2EA2 ; 6C3A ;  ML      #* ( ⺢ → 氺 ) CJK RADICAL WATER TWO → CJK UNIFIED IDEOGRAPH-6C3A # 
+
+2F8FA ;        6C4E ;  ML      # ( 汎 → 汎 ) CJK COMPATIBILITY IDEOGRAPH-2F8FA → CJK UNIFIED IDEOGRAPH-6C4E     # 
+
+2F8FE ;        6C67 ;  ML      # ( 汧 → 汧 ) CJK COMPATIBILITY IDEOGRAPH-2F8FE → CJK UNIFIED IDEOGRAPH-6C67     # 
+
+F972 ; 6C88 ;  ML      # ( 沈 → 沈 ) CJK COMPATIBILITY IDEOGRAPH-F972 → CJK UNIFIED IDEOGRAPH-6C88       # 
+
+2F8FC ;        6CBF ;  ML      # ( 沿 → 沿 ) CJK COMPATIBILITY IDEOGRAPH-2F8FC → CJK UNIFIED IDEOGRAPH-6CBF     # 
+
+F968 ; 6CCC ;  ML      # ( 泌 → 泌 ) CJK COMPATIBILITY IDEOGRAPH-F968 → CJK UNIFIED IDEOGRAPH-6CCC       # 
+
+2F8FD ;        6CCD ;  ML      # ( 泍 → 泍 ) CJK COMPATIBILITY IDEOGRAPH-2F8FD → CJK UNIFIED IDEOGRAPH-6CCD     # 
+
+F9E3 ; 6CE5 ;  ML      # ( 泥 → 泥 ) CJK COMPATIBILITY IDEOGRAPH-F9E3 → CJK UNIFIED IDEOGRAPH-6CE5       # 
+
+2F8FF ;        6D16 ;  ML      # ( 洖 → 洖 ) CJK COMPATIBILITY IDEOGRAPH-2F8FF → CJK UNIFIED IDEOGRAPH-6D16     # 
+
+F915 ; 6D1B ;  ML      # ( 洛 → 洛 ) CJK COMPATIBILITY IDEOGRAPH-F915 → CJK UNIFIED IDEOGRAPH-6D1B       # 
+
+FA05 ; 6D1E ;  ML      # ( 洞 → 洞 ) CJK COMPATIBILITY IDEOGRAPH-FA05 → CJK UNIFIED IDEOGRAPH-6D1E       # 
+
+2F907 ;        6D34 ;  ML      # ( 洴 → 洴 ) CJK COMPATIBILITY IDEOGRAPH-2F907 → CJK UNIFIED IDEOGRAPH-6D34     # 
+
+2F900 ;        6D3E ;  ML      # ( 派 → 派 ) CJK COMPATIBILITY IDEOGRAPH-2F900 → CJK UNIFIED IDEOGRAPH-6D3E     # 
+
+F9CA ; 6D41 ;  ML      # ( 流 → 流 ) CJK COMPATIBILITY IDEOGRAPH-F9CA → CJK UNIFIED IDEOGRAPH-6D41       # 
+FA97 ; 6D41 ;  ML      # ( 流 → 流 ) CJK COMPATIBILITY IDEOGRAPH-FA97 → CJK UNIFIED IDEOGRAPH-6D41       # 
+2F902 ;        6D41 ;  ML      # ( 流 → 流 ) CJK COMPATIBILITY IDEOGRAPH-2F902 → CJK UNIFIED IDEOGRAPH-6D41     # 
+
+2F903 ;        6D69 ;  ML      # ( 浩 → 浩 ) CJK COMPATIBILITY IDEOGRAPH-2F903 → CJK UNIFIED IDEOGRAPH-6D69     # 
+
+F92A ; 6D6A ;  ML      # ( 浪 → 浪 ) CJK COMPATIBILITY IDEOGRAPH-F92A → CJK UNIFIED IDEOGRAPH-6D6A       # 
+
+FA45 ; 6D77 ;  ML      # ( 海 → 海 ) CJK COMPATIBILITY IDEOGRAPH-FA45 → CJK UNIFIED IDEOGRAPH-6D77       # 
+2F901 ;        6D77 ;  ML      # ( 海 → 海 ) CJK COMPATIBILITY IDEOGRAPH-2F901 → CJK UNIFIED IDEOGRAPH-6D77     # 
+
+2F904 ;        6D78 ;  ML      # ( 浸 → 浸 ) CJK COMPATIBILITY IDEOGRAPH-2F904 → CJK UNIFIED IDEOGRAPH-6D78     # 
+
+2F905 ;        6D85 ;  ML      # ( 涅 → 涅 ) CJK COMPATIBILITY IDEOGRAPH-2F905 → CJK UNIFIED IDEOGRAPH-6D85     # 
+
+F9F5 ; 6DCB ;  ML      # ( 淋 → 淋 ) CJK COMPATIBILITY IDEOGRAPH-F9F5 → CJK UNIFIED IDEOGRAPH-6DCB       # 
+
+F94D ; 6DDA ;  ML      # ( 淚 → 淚 ) CJK COMPATIBILITY IDEOGRAPH-F94D → CJK UNIFIED IDEOGRAPH-6DDA       # 
+
+F9D6 ; 6DEA ;  ML      # ( 淪 → 淪 ) CJK COMPATIBILITY IDEOGRAPH-F9D6 → CJK UNIFIED IDEOGRAPH-6DEA       # 
+
+2F90E ;        6DF9 ;  ML      # ( 淹 → 淹 ) CJK COMPATIBILITY IDEOGRAPH-2F90E → CJK UNIFIED IDEOGRAPH-6DF9     # 
+
+FA46 ; 6E1A ;  ML      # ( 渚 → 渚 ) CJK COMPATIBILITY IDEOGRAPH-FA46 → CJK UNIFIED IDEOGRAPH-6E1A       # 
+
+2F908 ;        6E2F ;  ML      # ( 港 → 港 ) CJK COMPATIBILITY IDEOGRAPH-2F908 → CJK UNIFIED IDEOGRAPH-6E2F     # 
+
+2F909 ;        6E6E ;  ML      # ( 湮 → 湮 ) CJK COMPATIBILITY IDEOGRAPH-2F909 → CJK UNIFIED IDEOGRAPH-6E6E     # 
+
+6F59 ; 6E88 ;  ML      # ( 潙 → 溈 ) CJK UNIFIED IDEOGRAPH-6F59 → CJK UNIFIED IDEOGRAPH-6E88     # 
+
+F9CB ; 6E9C ;  ML      # ( 溜 → 溜 ) CJK COMPATIBILITY IDEOGRAPH-F9CB → CJK UNIFIED IDEOGRAPH-6E9C       # 
+
+F9EC ; 6EBA ;  ML      # ( 溺 → 溺 ) CJK COMPATIBILITY IDEOGRAPH-F9EC → CJK UNIFIED IDEOGRAPH-6EBA       # 
+
+2F90C ;        6EC7 ;  ML      # ( 滇 → 滇 ) CJK COMPATIBILITY IDEOGRAPH-2F90C → CJK UNIFIED IDEOGRAPH-6EC7     # 
+
+FA99 ; 6ECB ;  ML      # ( 滋 → 滋 ) CJK COMPATIBILITY IDEOGRAPH-FA99 → CJK UNIFIED IDEOGRAPH-6ECB       # 
+2F90B ;        6ECB ;  ML      # ( 滋 → 滋 ) CJK COMPATIBILITY IDEOGRAPH-2F90B → CJK UNIFIED IDEOGRAPH-6ECB     # 
+
+F904 ; 6ED1 ;  ML      # ( 滑 → 滑 ) CJK COMPATIBILITY IDEOGRAPH-F904 → CJK UNIFIED IDEOGRAPH-6ED1       # 
+
+FA98 ; 6EDB ;  ML      # ( 滛 → 滛 ) CJK COMPATIBILITY IDEOGRAPH-FA98 → CJK UNIFIED IDEOGRAPH-6EDB       # 
+
+F94E ; 6F0F ;  ML      # ( 漏 → 漏 ) CJK COMPATIBILITY IDEOGRAPH-F94E → CJK UNIFIED IDEOGRAPH-6F0F       # 
+
+FA47 ; 6F22 ;  ML      # ( 漢 → 漢 ) CJK COMPATIBILITY IDEOGRAPH-FA47 → CJK UNIFIED IDEOGRAPH-6F22       # 
+FA9A ; 6F22 ;  ML      # ( 漢 → 漢 ) CJK COMPATIBILITY IDEOGRAPH-FA9A → CJK UNIFIED IDEOGRAPH-6F22       # 
+
+F992 ; 6F23 ;  ML      # ( 漣 → 漣 ) CJK COMPATIBILITY IDEOGRAPH-F992 → CJK UNIFIED IDEOGRAPH-6F23       # 
+
+2F90F ;        6F6E ;  ML      # ( 潮 → 潮 ) CJK COMPATIBILITY IDEOGRAPH-2F90F → CJK UNIFIED IDEOGRAPH-6F6E     # 
+
+2F912 ;        6FC6 ;  ML      # ( 濆 → 濆 ) CJK COMPATIBILITY IDEOGRAPH-2F912 → CJK UNIFIED IDEOGRAPH-6FC6     # 
+
+F922 ; 6FEB ;  ML      # ( 濫 → 濫 ) CJK COMPATIBILITY IDEOGRAPH-F922 → CJK UNIFIED IDEOGRAPH-6FEB       # 
+
+F984 ; 6FFE ;  ML      # ( 濾 → 濾 ) CJK COMPATIBILITY IDEOGRAPH-F984 → CJK UNIFIED IDEOGRAPH-6FFE       # 
+
+2F915 ;        701B ;  ML      # ( 瀛 → 瀛 ) CJK COMPATIBILITY IDEOGRAPH-2F915 → CJK UNIFIED IDEOGRAPH-701B     # 
+
+FA9B ; 701E ;  ML      # ( 瀞 → 瀞 ) CJK COMPATIBILITY IDEOGRAPH-FA9B → CJK UNIFIED IDEOGRAPH-701E       # 
+2F914 ;        701E ;  ML      # ( 瀞 → 瀞 ) CJK COMPATIBILITY IDEOGRAPH-2F914 → CJK UNIFIED IDEOGRAPH-701E     # 
+
+2F913 ;        7039 ;  ML      # ( 瀹 → 瀹 ) CJK COMPATIBILITY IDEOGRAPH-2F913 → CJK UNIFIED IDEOGRAPH-7039     # 
+
+2F917 ;        704A ;  ML      # ( 灊 → 灊 ) CJK COMPATIBILITY IDEOGRAPH-2F917 → CJK UNIFIED IDEOGRAPH-704A     # 
+
+2F55 ; 706B ;  ML      #* ( ⽕ → 火 ) KANGXI RADICAL FIRE → CJK UNIFIED IDEOGRAPH-706B   # 
+
+2EA3 ; 706C ;  ML      #* ( ⺣ → 灬 ) CJK RADICAL FIRE → CJK UNIFIED IDEOGRAPH-706C      # 
+
+2F835 ;        7070 ;  ML      # ( 灰 → 灰 ) CJK COMPATIBILITY IDEOGRAPH-2F835 → CJK UNIFIED IDEOGRAPH-7070     # 
+
+2F919 ;        7077 ;  ML      # ( 灷 → 灷 ) CJK COMPATIBILITY IDEOGRAPH-2F919 → CJK UNIFIED IDEOGRAPH-7077     # 
+
+2F918 ;        707D ;  ML      # ( 災 → 災 ) CJK COMPATIBILITY IDEOGRAPH-2F918 → CJK UNIFIED IDEOGRAPH-707D     # 
+
+F9FB ; 7099 ;  ML      # ( 炙 → 炙 ) CJK COMPATIBILITY IDEOGRAPH-F9FB → CJK UNIFIED IDEOGRAPH-7099       # 
+
+2F91A ;        70AD ;  ML      # ( 炭 → 炭 ) CJK COMPATIBILITY IDEOGRAPH-2F91A → CJK UNIFIED IDEOGRAPH-70AD     # 
+
+F99F ; 70C8 ;  ML      # ( 烈 → 烈 ) CJK COMPATIBILITY IDEOGRAPH-F99F → CJK UNIFIED IDEOGRAPH-70C8       # 
+
+F916 ; 70D9 ;  ML      # ( 烙 → 烙 ) CJK COMPATIBILITY IDEOGRAPH-F916 → CJK UNIFIED IDEOGRAPH-70D9       # 
+
+2F91C ;        7145 ;  ML      # ( 煅 → 煅 ) CJK COMPATIBILITY IDEOGRAPH-2F91C → CJK UNIFIED IDEOGRAPH-7145     # 
+
+F993 ; 7149 ;  ML      # ( 煉 → 煉 ) CJK COMPATIBILITY IDEOGRAPH-F993 → CJK UNIFIED IDEOGRAPH-7149       # 
+
+FA48 ; 716E ;  ML      # ( 煮 → 煮 ) CJK COMPATIBILITY IDEOGRAPH-FA48 → CJK UNIFIED IDEOGRAPH-716E       # 
+FA9C ; 716E ;  ML      # ( 煮 → 煮 ) CJK COMPATIBILITY IDEOGRAPH-FA9C → CJK UNIFIED IDEOGRAPH-716E       # 
+
+2F91E ;        719C ;  ML      # ( 熜 → 熜 ) CJK COMPATIBILITY IDEOGRAPH-2F91E → CJK UNIFIED IDEOGRAPH-719C     # 
+
+F9C0 ; 71CE ;  ML      # ( 燎 → 燎 ) CJK COMPATIBILITY IDEOGRAPH-F9C0 → CJK UNIFIED IDEOGRAPH-71CE       # 
+
+F9EE ; 71D0 ;  ML      # ( 燐 → 燐 ) CJK COMPATIBILITY IDEOGRAPH-F9EE → CJK UNIFIED IDEOGRAPH-71D0       # 
+
+F932 ; 7210 ;  ML      # ( 爐 → 爐 ) CJK COMPATIBILITY IDEOGRAPH-F932 → CJK UNIFIED IDEOGRAPH-7210       # 
+
+F91E ; 721B ;  ML      # ( 爛 → 爛 ) CJK COMPATIBILITY IDEOGRAPH-F91E → CJK UNIFIED IDEOGRAPH-721B       # 
+
+2F920 ;        7228 ;  ML      # ( 爨 → 爨 ) CJK COMPATIBILITY IDEOGRAPH-2F920 → CJK UNIFIED IDEOGRAPH-7228     # 
+
+2F56 ; 722A ;  ML      #* ( ⽖ → 爪 ) KANGXI RADICAL CLAW → CJK UNIFIED IDEOGRAPH-722A   # 
+
+FA49 ; 722B ;  ML      # ( 爫 → 爫 ) CJK COMPATIBILITY IDEOGRAPH-FA49 → CJK UNIFIED IDEOGRAPH-722B       # 
+2EA4 ; 722B ;  ML      #* ( ⺤ → 爫 ) CJK RADICAL PAW ONE → CJK UNIFIED IDEOGRAPH-722B   # 
+
+FA9E ; 7235 ;  ML      # ( 爵 → 爵 ) CJK COMPATIBILITY IDEOGRAPH-FA9E → CJK UNIFIED IDEOGRAPH-7235       # 
+2F921 ;        7235 ;  ML      # ( 爵 → 爵 ) CJK COMPATIBILITY IDEOGRAPH-2F921 → CJK UNIFIED IDEOGRAPH-7235     # 
+
+2F57 ; 7236 ;  ML      #* ( ⽗ → 父 ) KANGXI RADICAL FATHER → CJK UNIFIED IDEOGRAPH-7236 # 
+
+2F58 ; 723B ;  ML      #* ( ⽘ → 爻 ) KANGXI RADICAL DOUBLE X → CJK UNIFIED IDEOGRAPH-723B       # 
+
+2F59 ; 723F ;  ML      #* ( ⽙ → 爿 ) KANGXI RADICAL HALF TREE TRUNK → CJK UNIFIED IDEOGRAPH-723F        # 
+
+2F5A ; 7247 ;  ML      #* ( ⽚ → 片 ) KANGXI RADICAL SLICE → CJK UNIFIED IDEOGRAPH-7247  # 
+
+2F922 ;        7250 ;  ML      # ( 牐 → 牐 ) CJK COMPATIBILITY IDEOGRAPH-2F922 → CJK UNIFIED IDEOGRAPH-7250     # 
+
+2F5B ; 7259 ;  ML      #* ( ⽛ → 牙 ) KANGXI RADICAL FANG → CJK UNIFIED IDEOGRAPH-7259   # 
+
+2F5C ; 725B ;  ML      #* ( ⽜ → 牛 ) KANGXI RADICAL COW → CJK UNIFIED IDEOGRAPH-725B    # 
+
+F946 ; 7262 ;  ML      # ( 牢 → 牢 ) CJK COMPATIBILITY IDEOGRAPH-F946 → CJK UNIFIED IDEOGRAPH-7262       # 
+
+2F924 ;        7280 ;  ML      # ( 犀 → 犀 ) CJK COMPATIBILITY IDEOGRAPH-2F924 → CJK UNIFIED IDEOGRAPH-7280     # 
+
+2F925 ;        7295 ;  ML      # ( 犕 → 犕 ) CJK COMPATIBILITY IDEOGRAPH-2F925 → CJK UNIFIED IDEOGRAPH-7295     # 
+
+2F5D ; 72AC ;  ML      #* ( ⽝ → 犬 ) KANGXI RADICAL DOG → CJK UNIFIED IDEOGRAPH-72AC    # 
+
+2EA8 ; 72AD ;  ML      #* ( ⺨ → 犭 ) CJK RADICAL DOG → CJK UNIFIED IDEOGRAPH-72AD       # 
+
+FA9F ; 72AF ;  ML      # ( 犯 → 犯 ) CJK COMPATIBILITY IDEOGRAPH-FA9F → CJK UNIFIED IDEOGRAPH-72AF       # 
+
+F9FA ; 72C0 ;  ML      # ( 狀 → 狀 ) CJK COMPATIBILITY IDEOGRAPH-F9FA → CJK UNIFIED IDEOGRAPH-72C0       # 
+
+F92B ; 72FC ;  ML      # ( 狼 → 狼 ) CJK COMPATIBILITY IDEOGRAPH-F92B → CJK UNIFIED IDEOGRAPH-72FC       # 
+
+FA16 ; 732A ;  ML      # ( 猪 → 猪 ) CJK COMPATIBILITY IDEOGRAPH-FA16 → CJK UNIFIED IDEOGRAPH-732A       # 
+FAA0 ; 732A ;  ML      # ( 猪 → 猪 ) CJK COMPATIBILITY IDEOGRAPH-FAA0 → CJK UNIFIED IDEOGRAPH-732A       # 
+
+F9A7 ; 7375 ;  ML      # ( 獵 → 獵 ) CJK COMPATIBILITY IDEOGRAPH-F9A7 → CJK UNIFIED IDEOGRAPH-7375       # 
+
+2F928 ;        737A ;  ML      # ( 獺 → 獺 ) CJK COMPATIBILITY IDEOGRAPH-2F928 → CJK UNIFIED IDEOGRAPH-737A     # 
+
+2F5E ; 7384 ;  ML      #* ( ⽞ → 玄 ) KANGXI RADICAL PROFOUND → CJK UNIFIED IDEOGRAPH-7384       # 
+
+F961 ; 7387 ;  ML      # ( 率 → 率 ) CJK COMPATIBILITY IDEOGRAPH-F961 → CJK UNIFIED IDEOGRAPH-7387       # 
+F9DB ; 7387 ;  ML      # ( 率 → 率 ) CJK COMPATIBILITY IDEOGRAPH-F9DB → CJK UNIFIED IDEOGRAPH-7387       # 
+
+2F5F ; 7389 ;  ML      #* ( ⽟ → 玉 ) KANGXI RADICAL JADE → CJK UNIFIED IDEOGRAPH-7389   # 
+
+2F929 ;        738B ;  ML      # ( 王 → 王 ) CJK COMPATIBILITY IDEOGRAPH-2F929 → CJK UNIFIED IDEOGRAPH-738B     # 
+
+2F92B ;        73A5 ;  ML      # ( 玥 → 玥 ) CJK COMPATIBILITY IDEOGRAPH-2F92B → CJK UNIFIED IDEOGRAPH-73A5     # 
+
+F9AD ; 73B2 ;  ML      # ( 玲 → 玲 ) CJK COMPATIBILITY IDEOGRAPH-F9AD → CJK UNIFIED IDEOGRAPH-73B2       # 
+
+F917 ; 73DE ;  ML      # ( 珞 → 珞 ) CJK COMPATIBILITY IDEOGRAPH-F917 → CJK UNIFIED IDEOGRAPH-73DE       # 
+
+F9E4 ; 7406 ;  ML      # ( 理 → 理 ) CJK COMPATIBILITY IDEOGRAPH-F9E4 → CJK UNIFIED IDEOGRAPH-7406       # 
+
+F9CC ; 7409 ;  ML      # ( 琉 → 琉 ) CJK COMPATIBILITY IDEOGRAPH-F9CC → CJK UNIFIED IDEOGRAPH-7409       # 
+
+FA4A ; 7422 ;  ML      # ( 琢 → 琢 ) CJK COMPATIBILITY IDEOGRAPH-FA4A → CJK UNIFIED IDEOGRAPH-7422       # 
+
+2F92E ;        7447 ;  ML      # ( 瑇 → 瑇 ) CJK COMPATIBILITY IDEOGRAPH-2F92E → CJK UNIFIED IDEOGRAPH-7447     # 
+
+2F92F ;        745C ;  ML      # ( 瑜 → 瑜 ) CJK COMPATIBILITY IDEOGRAPH-2F92F → CJK UNIFIED IDEOGRAPH-745C     # 
+
+F9AE ; 7469 ;  ML      # ( 瑩 → 瑩 ) CJK COMPATIBILITY IDEOGRAPH-F9AE → CJK UNIFIED IDEOGRAPH-7469       # 
+
+FAA1 ; 7471 ;  ML      # ( 瑱 → 瑱 ) CJK COMPATIBILITY IDEOGRAPH-FAA1 → CJK UNIFIED IDEOGRAPH-7471       # 
+2F930 ;        7471 ;  ML      # ( 瑱 → 瑱 ) CJK COMPATIBILITY IDEOGRAPH-2F930 → CJK UNIFIED IDEOGRAPH-7471     # 
+
+2F931 ;        7485 ;  ML      # ( 璅 → 璅 ) CJK COMPATIBILITY IDEOGRAPH-2F931 → CJK UNIFIED IDEOGRAPH-7485     # 
+
+F994 ; 7489 ;  ML      # ( 璉 → 璉 ) CJK COMPATIBILITY IDEOGRAPH-F994 → CJK UNIFIED IDEOGRAPH-7489       # 
+
+F9EF ; 7498 ;  ML      # ( 璘 → 璘 ) CJK COMPATIBILITY IDEOGRAPH-F9EF → CJK UNIFIED IDEOGRAPH-7498       # 
+
+2F932 ;        74CA ;  ML      # ( 瓊 → 瓊 ) CJK COMPATIBILITY IDEOGRAPH-2F932 → CJK UNIFIED IDEOGRAPH-74CA     # 
+
+2F60 ; 74DC ;  ML      #* ( ⽠ → 瓜 ) KANGXI RADICAL MELON → CJK UNIFIED IDEOGRAPH-74DC  # 
+
+2F61 ; 74E6 ;  ML      #* ( ⽡ → 瓦 ) KANGXI RADICAL TILE → CJK UNIFIED IDEOGRAPH-74E6   # 
+
+FAA2 ; 7506 ;  ML      # ( 甆 → 甆 ) CJK COMPATIBILITY IDEOGRAPH-FAA2 → CJK UNIFIED IDEOGRAPH-7506       # 
+
+2F62 ; 7518 ;  ML      #* ( ⽢ → 甘 ) KANGXI RADICAL SWEET → CJK UNIFIED IDEOGRAPH-7518  # 
+
+2F63 ; 751F ;  ML      #* ( ⽣ → 生 ) KANGXI RADICAL LIFE → CJK UNIFIED IDEOGRAPH-751F   # 
+
+2F934 ;        7524 ;  ML      # ( 甤 → 甤 ) CJK COMPATIBILITY IDEOGRAPH-2F934 → CJK UNIFIED IDEOGRAPH-7524     # 
+
+2F64 ; 7528 ;  ML      #* ( ⽤ → 用 ) KANGXI RADICAL USE → CJK UNIFIED IDEOGRAPH-7528    # 
+
+2F65 ; 7530 ;  ML      #* ( ⽥ → 田 ) KANGXI RADICAL FIELD → CJK UNIFIED IDEOGRAPH-7530  # 
+
+FAA3 ; 753B ;  ML      # ( 画 → 画 ) CJK COMPATIBILITY IDEOGRAPH-FAA3 → CJK UNIFIED IDEOGRAPH-753B       # 
+
+2F936 ;        753E ;  ML      # ( 甾 → 甾 ) CJK COMPATIBILITY IDEOGRAPH-2F936 → CJK UNIFIED IDEOGRAPH-753E     # 
+
+F9CD ; 7559 ;  ML      # ( 留 → 留 ) CJK COMPATIBILITY IDEOGRAPH-F9CD → CJK UNIFIED IDEOGRAPH-7559       # 
+
+F976 ; 7565 ;  ML      # ( 略 → 略 ) CJK COMPATIBILITY IDEOGRAPH-F976 → CJK UNIFIED IDEOGRAPH-7565       # 
+
+F962 ; 7570 ;  ML      # ( 異 → 異 ) CJK COMPATIBILITY IDEOGRAPH-F962 → CJK UNIFIED IDEOGRAPH-7570       # 
+2F938 ;        7570 ;  ML      # ( 異 → 異 ) CJK COMPATIBILITY IDEOGRAPH-2F938 → CJK UNIFIED IDEOGRAPH-7570     # 
+
+2F66 ; 758B ;  ML      #* ( ⽦ → 疋 ) KANGXI RADICAL BOLT OF CLOTH → CJK UNIFIED IDEOGRAPH-758B  # 
+
+2F67 ; 7592 ;  ML      #* ( ⽧ → 疒 ) KANGXI RADICAL SICKNESS → CJK UNIFIED IDEOGRAPH-7592       # 
+
+F9E5 ; 75E2 ;  ML      # ( 痢 → 痢 ) CJK COMPATIBILITY IDEOGRAPH-F9E5 → CJK UNIFIED IDEOGRAPH-75E2       # 
+
+2F93A ;        7610 ;  ML      # ( 瘐 → 瘐 ) CJK COMPATIBILITY IDEOGRAPH-2F93A → CJK UNIFIED IDEOGRAPH-7610     # 
+
+FAA4 ; 761D ;  ML      # ( 瘝 → 瘝 ) CJK COMPATIBILITY IDEOGRAPH-FAA4 → CJK UNIFIED IDEOGRAPH-761D       # 
+
+FAA5 ; 761F ;  ML      # ( 瘟 → 瘟 ) CJK COMPATIBILITY IDEOGRAPH-FAA5 → CJK UNIFIED IDEOGRAPH-761F       # 
+
+F9C1 ; 7642 ;  ML      # ( 療 → 療 ) CJK COMPATIBILITY IDEOGRAPH-F9C1 → CJK UNIFIED IDEOGRAPH-7642       # 
+
+F90E ; 7669 ;  ML      # ( 癩 → 癩 ) CJK COMPATIBILITY IDEOGRAPH-F90E → CJK UNIFIED IDEOGRAPH-7669       # 
+
+2F68 ; 7676 ;  ML      #* ( ⽨ → 癶 ) KANGXI RADICAL DOTTED TENT → CJK UNIFIED IDEOGRAPH-7676    # 
+
+2F69 ; 767D ;  ML      #* ( ⽩ → 白 ) KANGXI RADICAL WHITE → CJK UNIFIED IDEOGRAPH-767D  # 
+
+2F6A ; 76AE ;  ML      #* ( ⽪ → 皮 ) KANGXI RADICAL SKIN → CJK UNIFIED IDEOGRAPH-76AE   # 
+
+2F6B ; 76BF ;  ML      #* ( ⽫ → 皿 ) KANGXI RADICAL DISH → CJK UNIFIED IDEOGRAPH-76BF   # 
+
+FA17 ; 76CA ;  ML      # ( 益 → 益 ) CJK COMPATIBILITY IDEOGRAPH-FA17 → CJK UNIFIED IDEOGRAPH-76CA       # 
+FAA6 ; 76CA ;  ML      # ( 益 → 益 ) CJK COMPATIBILITY IDEOGRAPH-FAA6 → CJK UNIFIED IDEOGRAPH-76CA       # 
+
+FAA7 ; 76DB ;  ML      # ( 盛 → 盛 ) CJK COMPATIBILITY IDEOGRAPH-FAA7 → CJK UNIFIED IDEOGRAPH-76DB       # 
+
+F933 ; 76E7 ;  ML      # ( 盧 → 盧 ) CJK COMPATIBILITY IDEOGRAPH-F933 → CJK UNIFIED IDEOGRAPH-76E7       # 
+
+2F6C ; 76EE ;  ML      #* ( ⽬ → 目 ) KANGXI RADICAL EYE → CJK UNIFIED IDEOGRAPH-76EE    # 
+
+FAA8 ; 76F4 ;  ML      # ( 直 → 直 ) CJK COMPATIBILITY IDEOGRAPH-FAA8 → CJK UNIFIED IDEOGRAPH-76F4       # 
+2F940 ;        76F4 ;  ML      # ( 直 → 直 ) CJK COMPATIBILITY IDEOGRAPH-2F940 → CJK UNIFIED IDEOGRAPH-76F4     # 
+
+F96D ; 7701 ;  ML      # ( 省 → 省 ) CJK COMPATIBILITY IDEOGRAPH-F96D → CJK UNIFIED IDEOGRAPH-7701       # 
+
+2F945 ;        771E ;  ML      # ( 眞 → 眞 ) CJK COMPATIBILITY IDEOGRAPH-2F945 → CJK UNIFIED IDEOGRAPH-771E     # 
+
+2F946 ;        771F ;  ML      # ( 真 → 真 ) CJK COMPATIBILITY IDEOGRAPH-2F946 → CJK UNIFIED IDEOGRAPH-771F     # 
+2F947 ;        771F ;  ML      # ( 真 → 真 ) CJK COMPATIBILITY IDEOGRAPH-2F947 → CJK UNIFIED IDEOGRAPH-771F     # 
+
+FAAA ; 7740 ;  ML      # ( 着 → 着 ) CJK COMPATIBILITY IDEOGRAPH-FAAA → CJK UNIFIED IDEOGRAPH-7740       # 
+
+FAA9 ; 774A ;  ML      # ( 睊 → 睊 ) CJK COMPATIBILITY IDEOGRAPH-FAA9 → CJK UNIFIED IDEOGRAPH-774A       # 
+2F948 ;        774A ;  ML      # ( 睊 → 睊 ) CJK COMPATIBILITY IDEOGRAPH-2F948 → CJK UNIFIED IDEOGRAPH-774A     # 
+
+2F94A ;        778B ;  ML      # ( 瞋 → 瞋 ) CJK COMPATIBILITY IDEOGRAPH-2F94A → CJK UNIFIED IDEOGRAPH-778B     # 
+
+FA9D ; 77A7 ;  ML      # ( 瞧 → 瞧 ) CJK COMPATIBILITY IDEOGRAPH-FA9D → CJK UNIFIED IDEOGRAPH-77A7       # 
+
+2F6D ; 77DB ;  ML      #* ( ⽭ → 矛 ) KANGXI RADICAL SPEAR → CJK UNIFIED IDEOGRAPH-77DB  # 
+
+2F6E ; 77E2 ;  ML      #* ( ⽮ → 矢 ) KANGXI RADICAL ARROW → CJK UNIFIED IDEOGRAPH-77E2  # 
+
+2F6F ; 77F3 ;  ML      #* ( ⽯ → 石 ) KANGXI RADICAL STONE → CJK UNIFIED IDEOGRAPH-77F3  # 
+
+784F ; 7814 ;  ML      # ( 硏 → 研 ) CJK UNIFIED IDEOGRAPH-784F → CJK UNIFIED IDEOGRAPH-7814     # 
+
+2F94E ;        784E ;  ML      # ( 硎 → 硎 ) CJK COMPATIBILITY IDEOGRAPH-2F94E → CJK UNIFIED IDEOGRAPH-784E     # 
+
+F9CE ; 786B ;  ML      # ( 硫 → 硫 ) CJK COMPATIBILITY IDEOGRAPH-F9CE → CJK UNIFIED IDEOGRAPH-786B       # 
+
+F93B ; 788C ;  ML      # ( 碌 → 碌 ) CJK COMPATIBILITY IDEOGRAPH-F93B → CJK UNIFIED IDEOGRAPH-788C       # 
+2F94F ;        788C ;  ML      # ( 碌 → 碌 ) CJK COMPATIBILITY IDEOGRAPH-2F94F → CJK UNIFIED IDEOGRAPH-788C     # 
+
+FA4B ; 7891 ;  ML      # ( 碑 → 碑 ) CJK COMPATIBILITY IDEOGRAPH-FA4B → CJK UNIFIED IDEOGRAPH-7891       # 
+
+F947 ; 78CA ;  ML      # ( 磊 → 磊 ) CJK COMPATIBILITY IDEOGRAPH-F947 → CJK UNIFIED IDEOGRAPH-78CA       # 
+
+FAAB ; 78CC ;  ML      # ( 磌 → 磌 ) CJK COMPATIBILITY IDEOGRAPH-FAAB → CJK UNIFIED IDEOGRAPH-78CC       # 
+2F950 ;        78CC ;  ML      # ( 磌 → 磌 ) CJK COMPATIBILITY IDEOGRAPH-2F950 → CJK UNIFIED IDEOGRAPH-78CC     # 
+
+F964 ; 78FB ;  ML      # ( 磻 → 磻 ) CJK COMPATIBILITY IDEOGRAPH-F964 → CJK UNIFIED IDEOGRAPH-78FB       # 
+
+F985 ; 792A ;  ML      # ( 礪 → 礪 ) CJK COMPATIBILITY IDEOGRAPH-F985 → CJK UNIFIED IDEOGRAPH-792A       # 
+
+2F70 ; 793A ;  ML      #* ( ⽰ → 示 ) KANGXI RADICAL SPIRIT → CJK UNIFIED IDEOGRAPH-793A # 
+
+2EAD ; 793B ;  ML      #* ( ⺭ → 礻 ) CJK RADICAL SPIRIT TWO → CJK UNIFIED IDEOGRAPH-793B        # 
+
+FA18 ; 793C ;  ML      # ( 礼 → 礼 ) CJK COMPATIBILITY IDEOGRAPH-FA18 → CJK UNIFIED IDEOGRAPH-793C       # 
+
+FA4C ; 793E ;  ML      # ( 社 → 社 ) CJK COMPATIBILITY IDEOGRAPH-FA4C → CJK UNIFIED IDEOGRAPH-793E       # 
+
+FA4E ; 7948 ;  ML      # ( 祈 → 祈 ) CJK COMPATIBILITY IDEOGRAPH-FA4E → CJK UNIFIED IDEOGRAPH-7948       # 
+
+FA4D ; 7949 ;  ML      # ( 祉 → 祉 ) CJK COMPATIBILITY IDEOGRAPH-FA4D → CJK UNIFIED IDEOGRAPH-7949       # 
+
+FA4F ; 7950 ;  ML      # ( 祐 → 祐 ) CJK COMPATIBILITY IDEOGRAPH-FA4F → CJK UNIFIED IDEOGRAPH-7950       # 
+
+FA50 ; 7956 ;  ML      # ( 祖 → 祖 ) CJK COMPATIBILITY IDEOGRAPH-FA50 → CJK UNIFIED IDEOGRAPH-7956       # 
+2F953 ;        7956 ;  ML      # ( 祖 → 祖 ) CJK COMPATIBILITY IDEOGRAPH-2F953 → CJK UNIFIED IDEOGRAPH-7956     # 
+
+FA51 ; 795D ;  ML      # ( 祝 → 祝 ) CJK COMPATIBILITY IDEOGRAPH-FA51 → CJK UNIFIED IDEOGRAPH-795D       # 
+
+FA19 ; 795E ;  ML      # ( 神 → 神 ) CJK COMPATIBILITY IDEOGRAPH-FA19 → CJK UNIFIED IDEOGRAPH-795E       # 
+
+FA1A ; 7965 ;  ML      # ( 祥 → 祥 ) CJK COMPATIBILITY IDEOGRAPH-FA1A → CJK UNIFIED IDEOGRAPH-7965       # 
+
+F93C ; 797F ;  ML      # ( 祿 → 祿 ) CJK COMPATIBILITY IDEOGRAPH-F93C → CJK UNIFIED IDEOGRAPH-797F       # 
+
+FA52 ; 798D ;  ML      # ( 禍 → 禍 ) CJK COMPATIBILITY IDEOGRAPH-FA52 → CJK UNIFIED IDEOGRAPH-798D       # 
+
+FA53 ; 798E ;  ML      # ( 禎 → 禎 ) CJK COMPATIBILITY IDEOGRAPH-FA53 → CJK UNIFIED IDEOGRAPH-798E       # 
+
+FA1B ; 798F ;  ML      # ( 福 → 福 ) CJK COMPATIBILITY IDEOGRAPH-FA1B → CJK UNIFIED IDEOGRAPH-798F       # 
+2F956 ;        798F ;  ML      # ( 福 → 福 ) CJK COMPATIBILITY IDEOGRAPH-2F956 → CJK UNIFIED IDEOGRAPH-798F     # 
+
+F9B6 ; 79AE ;  ML      # ( 禮 → 禮 ) CJK COMPATIBILITY IDEOGRAPH-F9B6 → CJK UNIFIED IDEOGRAPH-79AE       # 
+
+2F71 ; 79B8 ;  ML      #* ( ⽱ → 禸 ) KANGXI RADICAL TRACK → CJK UNIFIED IDEOGRAPH-79B8  # 
+
+2F72 ; 79BE ;  ML      #* ( ⽲ → 禾 ) KANGXI RADICAL GRAIN → CJK UNIFIED IDEOGRAPH-79BE  # 
+
+F995 ; 79CA ;  ML      # ( 秊 → 秊 ) CJK COMPATIBILITY IDEOGRAPH-F995 → CJK UNIFIED IDEOGRAPH-79CA       # 
+
+2F957 ;        79EB ;  ML      # ( 秫 → 秫 ) CJK COMPATIBILITY IDEOGRAPH-2F957 → CJK UNIFIED IDEOGRAPH-79EB     # 
+
+F956 ; 7A1C ;  ML      # ( 稜 → 稜 ) CJK COMPATIBILITY IDEOGRAPH-F956 → CJK UNIFIED IDEOGRAPH-7A1C       # 
+
+FA54 ; 7A40 ;  ML      # ( 穀 → 穀 ) CJK COMPATIBILITY IDEOGRAPH-FA54 → CJK UNIFIED IDEOGRAPH-7A40       # 
+2F959 ;        7A40 ;  ML      # ( 穀 → 穀 ) CJK COMPATIBILITY IDEOGRAPH-2F959 → CJK UNIFIED IDEOGRAPH-7A40     # 
+
+2F95A ;        7A4A ;  ML      # ( 穊 → 穊 ) CJK COMPATIBILITY IDEOGRAPH-2F95A → CJK UNIFIED IDEOGRAPH-7A4A     # 
+
+2F95B ;        7A4F ;  ML      # ( 穏 → 穏 ) CJK COMPATIBILITY IDEOGRAPH-2F95B → CJK UNIFIED IDEOGRAPH-7A4F     # 
+
+2F73 ; 7A74 ;  ML      #* ( ⽳ → 穴 ) KANGXI RADICAL CAVE → CJK UNIFIED IDEOGRAPH-7A74   # 
+
+FA55 ; 7A81 ;  ML      # ( 突 → 突 ) CJK COMPATIBILITY IDEOGRAPH-FA55 → CJK UNIFIED IDEOGRAPH-7A81       # 
+
+FAAC ; 7AB1 ;  ML      # ( 窱 → 窱 ) CJK COMPATIBILITY IDEOGRAPH-FAAC → CJK UNIFIED IDEOGRAPH-7AB1       # 
+
+F9F7 ; 7ACB ;  ML      # ( 立 → 立 ) CJK COMPATIBILITY IDEOGRAPH-F9F7 → CJK UNIFIED IDEOGRAPH-7ACB       # 
+2F74 ; 7ACB ;  ML      #* ( ⽴ → 立 ) KANGXI RADICAL STAND → CJK UNIFIED IDEOGRAPH-7ACB  # 
+
+2EEF ; 7ADC ;  ML      #* ( ⻯ → 竜 ) CJK RADICAL J-SIMPLIFIED DRAGON → CJK UNIFIED IDEOGRAPH-7ADC       # 
+
+2F95F ;        7AEE ;  ML      # ( 竮 → 竮 ) CJK COMPATIBILITY IDEOGRAPH-2F95F → CJK UNIFIED IDEOGRAPH-7AEE     # 
+
+2F75 ; 7AF9 ;  ML      #* ( ⽵ → 竹 ) KANGXI RADICAL BAMBOO → CJK UNIFIED IDEOGRAPH-7AF9 # 
+
+F9F8 ; 7B20 ;  ML      # ( 笠 → 笠 ) CJK COMPATIBILITY IDEOGRAPH-F9F8 → CJK UNIFIED IDEOGRAPH-7B20       # 
+
+FA56 ; 7BC0 ;  ML      # ( 節 → 節 ) CJK COMPATIBILITY IDEOGRAPH-FA56 → CJK UNIFIED IDEOGRAPH-7BC0       # 
+FAAD ; 7BC0 ;  ML      # ( 節 → 節 ) CJK COMPATIBILITY IDEOGRAPH-FAAD → CJK UNIFIED IDEOGRAPH-7BC0       # 
+
+2F962 ;        7BC6 ;  ML      # ( 篆 → 篆 ) CJK COMPATIBILITY IDEOGRAPH-2F962 → CJK UNIFIED IDEOGRAPH-7BC6     # 
+
+2F963 ;        7BC9 ;  ML      # ( 築 → 築 ) CJK COMPATIBILITY IDEOGRAPH-2F963 → CJK UNIFIED IDEOGRAPH-7BC9     # 
+
+F9A6 ; 7C3E ;  ML      # ( 簾 → 簾 ) CJK COMPATIBILITY IDEOGRAPH-F9A6 → CJK UNIFIED IDEOGRAPH-7C3E       # 
+
+F944 ; 7C60 ;  ML      # ( 籠 → 籠 ) CJK COMPATIBILITY IDEOGRAPH-F944 → CJK UNIFIED IDEOGRAPH-7C60       # 
+
+2F76 ; 7C73 ;  ML      #* ( ⽶ → 米 ) KANGXI RADICAL RICE → CJK UNIFIED IDEOGRAPH-7C73   # 
+
+FAAE ; 7C7B ;  ML      # ( 类 → 类 ) CJK COMPATIBILITY IDEOGRAPH-FAAE → CJK UNIFIED IDEOGRAPH-7C7B       # 
+
+F9F9 ; 7C92 ;  ML      # ( 粒 → 粒 ) CJK COMPATIBILITY IDEOGRAPH-F9F9 → CJK UNIFIED IDEOGRAPH-7C92       # 
+
+FA1D ; 7CBE ;  ML      # ( 精 → 精 ) CJK COMPATIBILITY IDEOGRAPH-FA1D → CJK UNIFIED IDEOGRAPH-7CBE       # 
+
+2F966 ;        7CD2 ;  ML      # ( 糒 → 糒 ) CJK COMPATIBILITY IDEOGRAPH-2F966 → CJK UNIFIED IDEOGRAPH-7CD2     # 
+
+FA03 ; 7CD6 ;  ML      # ( 糖 → 糖 ) CJK COMPATIBILITY IDEOGRAPH-FA03 → CJK UNIFIED IDEOGRAPH-7CD6       # 
+
+2F969 ;        7CE3 ;  ML      # ( 糣 → 糣 ) CJK COMPATIBILITY IDEOGRAPH-2F969 → CJK UNIFIED IDEOGRAPH-7CE3     # 
+
+F97B ; 7CE7 ;  ML      # ( 糧 → 糧 ) CJK COMPATIBILITY IDEOGRAPH-F97B → CJK UNIFIED IDEOGRAPH-7CE7       # 
+
+2F968 ;        7CE8 ;  ML      # ( 糨 → 糨 ) CJK COMPATIBILITY IDEOGRAPH-2F968 → CJK UNIFIED IDEOGRAPH-7CE8     # 
+
+2F77 ; 7CF8 ;  ML      #* ( ⽷ → 糸 ) KANGXI RADICAL SILK → CJK UNIFIED IDEOGRAPH-7CF8   # 
+
+2EAF ; 7CF9 ;  ML      #* ( ⺯ → 糹 ) CJK RADICAL SILK → CJK UNIFIED IDEOGRAPH-7CF9      # 
+
+2F96A ;        7D00 ;  ML      # ( 紀 → 紀 ) CJK COMPATIBILITY IDEOGRAPH-2F96A → CJK UNIFIED IDEOGRAPH-7D00     # 
+
+F9CF ; 7D10 ;  ML      # ( 紐 → 紐 ) CJK COMPATIBILITY IDEOGRAPH-F9CF → CJK UNIFIED IDEOGRAPH-7D10       # 
+
+F96A ; 7D22 ;  ML      # ( 索 → 索 ) CJK COMPATIBILITY IDEOGRAPH-F96A → CJK UNIFIED IDEOGRAPH-7D22       # 
+
+F94F ; 7D2F ;  ML      # ( 累 → 累 ) CJK COMPATIBILITY IDEOGRAPH-F94F → CJK UNIFIED IDEOGRAPH-7D2F       # 
+
+7D76 ; 7D55 ;  ML      # ( 絶 → 絕 ) CJK UNIFIED IDEOGRAPH-7D76 → CJK UNIFIED IDEOGRAPH-7D55     # 
+
+FAAF ; 7D5B ;  ML      # ( 絛 → 絛 ) CJK COMPATIBILITY IDEOGRAPH-FAAF → CJK UNIFIED IDEOGRAPH-7D5B       # 
+
+2F96C ;        7D63 ;  ML      # ( 絣 → 絣 ) CJK COMPATIBILITY IDEOGRAPH-2F96C → CJK UNIFIED IDEOGRAPH-7D63     # 
+
+F93D ; 7DA0 ;  ML      # ( 綠 → 綠 ) CJK COMPATIBILITY IDEOGRAPH-F93D → CJK UNIFIED IDEOGRAPH-7DA0       # 
+
+F957 ; 7DBE ;  ML      # ( 綾 → 綾 ) CJK COMPATIBILITY IDEOGRAPH-F957 → CJK UNIFIED IDEOGRAPH-7DBE       # 
+
+2F96E ;        7DC7 ;  ML      # ( 緇 → 緇 ) CJK COMPATIBILITY IDEOGRAPH-2F96E → CJK UNIFIED IDEOGRAPH-7DC7     # 
+
+F996 ; 7DF4 ;  ML      # ( 練 → 練 ) CJK COMPATIBILITY IDEOGRAPH-F996 → CJK UNIFIED IDEOGRAPH-7DF4       # 
+FA57 ; 7DF4 ;  ML      # ( 練 → 練 ) CJK COMPATIBILITY IDEOGRAPH-FA57 → CJK UNIFIED IDEOGRAPH-7DF4       # 
+FAB0 ; 7DF4 ;  ML      # ( 練 → 練 ) CJK COMPATIBILITY IDEOGRAPH-FAB0 → CJK UNIFIED IDEOGRAPH-7DF4       # 
+
+2F96F ;        7E02 ;  ML      # ( 縂 → 縂 ) CJK COMPATIBILITY IDEOGRAPH-2F96F → CJK UNIFIED IDEOGRAPH-7E02     # 
+
+FA58 ; 7E09 ;  ML      # ( 縉 → 縉 ) CJK COMPATIBILITY IDEOGRAPH-FA58 → CJK UNIFIED IDEOGRAPH-7E09       # 
+
+F950 ; 7E37 ;  ML      # ( 縷 → 縷 ) CJK COMPATIBILITY IDEOGRAPH-F950 → CJK UNIFIED IDEOGRAPH-7E37       # 
+
+FA59 ; 7E41 ;  ML      # ( 繁 → 繁 ) CJK COMPATIBILITY IDEOGRAPH-FA59 → CJK UNIFIED IDEOGRAPH-7E41       # 
+
+2F970 ;        7E45 ;  ML      # ( 繅 → 繅 ) CJK COMPATIBILITY IDEOGRAPH-2F970 → CJK UNIFIED IDEOGRAPH-7E45     # 
+
+2F78 ; 7F36 ;  ML      #* ( ⽸ → 缶 ) KANGXI RADICAL JAR → CJK UNIFIED IDEOGRAPH-7F36    # 
+
+FAB1 ; 7F3E ;  ML      # ( 缾 → 缾 ) CJK COMPATIBILITY IDEOGRAPH-FAB1 → CJK UNIFIED IDEOGRAPH-7F3E       # 
+
+2F79 ; 7F51 ;  ML      #* ( ⽹ → 网 ) KANGXI RADICAL NET → CJK UNIFIED IDEOGRAPH-7F51    # 
+
+2EAB ; 7F52 ;  ML      #* ( ⺫ → 罒 ) CJK RADICAL EYE → CJK UNIFIED IDEOGRAPH-7F52       # 
+2EB2 ; 7F52 ;  ML      #* ( ⺲ → 罒 ) CJK RADICAL NET TWO → CJK UNIFIED IDEOGRAPH-7F52   # 
+
+2EB1 ; 7F53 ;  ML      #* ( ⺱ → 罓 ) CJK RADICAL NET ONE → CJK UNIFIED IDEOGRAPH-7F53   # 
+
+FA5A ; 7F72 ;  ML      # ( 署 → 署 ) CJK COMPATIBILITY IDEOGRAPH-FA5A → CJK UNIFIED IDEOGRAPH-7F72       # 
+
+F9E6 ; 7F79 ;  ML      # ( 罹 → 罹 ) CJK COMPATIBILITY IDEOGRAPH-F9E6 → CJK UNIFIED IDEOGRAPH-7F79       # 
+
+2F976 ;        7F7A ;  ML      # ( 罺 → 罺 ) CJK COMPATIBILITY IDEOGRAPH-2F976 → CJK UNIFIED IDEOGRAPH-7F7A     # 
+
+F90F ; 7F85 ;  ML      # ( 羅 → 羅 ) CJK COMPATIBILITY IDEOGRAPH-F90F → CJK UNIFIED IDEOGRAPH-7F85       # 
+
+2F7A ; 7F8A ;  ML      #* ( ⽺ → 羊 ) KANGXI RADICAL SHEEP → CJK UNIFIED IDEOGRAPH-7F8A  # 
+
+2F978 ;        7F95 ;  ML      # ( 羕 → 羕 ) CJK COMPATIBILITY IDEOGRAPH-2F978 → CJK UNIFIED IDEOGRAPH-7F95     # 
+
+F9AF ; 7F9A ;  ML      # ( 羚 → 羚 ) CJK COMPATIBILITY IDEOGRAPH-F9AF → CJK UNIFIED IDEOGRAPH-7F9A       # 
+
+FA1E ; 7FBD ;  ML      # ( 羽 → 羽 ) CJK COMPATIBILITY IDEOGRAPH-FA1E → CJK UNIFIED IDEOGRAPH-7FBD       # 
+2F7B ; 7FBD ;  ML      #* ( ⽻ → 羽 ) KANGXI RADICAL FEATHER → CJK UNIFIED IDEOGRAPH-7FBD        # 
+
+2F979 ;        7FFA ;  ML      # ( 翺 → 翺 ) CJK COMPATIBILITY IDEOGRAPH-2F979 → CJK UNIFIED IDEOGRAPH-7FFA     # 
+
+F934 ; 8001 ;  ML      # ( 老 → 老 ) CJK COMPATIBILITY IDEOGRAPH-F934 → CJK UNIFIED IDEOGRAPH-8001       # 
+2F7C ; 8001 ;  ML      #* ( ⽼ → 老 ) KANGXI RADICAL OLD → CJK UNIFIED IDEOGRAPH-8001    # 
+
+2EB9 ; 8002 ;  ML      #* ( ⺹ → 耂 ) CJK RADICAL OLD → CJK UNIFIED IDEOGRAPH-8002       # 
+
+FA5B ; 8005 ;  ML      # ( 者 → 者 ) CJK COMPATIBILITY IDEOGRAPH-FA5B → CJK UNIFIED IDEOGRAPH-8005       # 
+FAB2 ; 8005 ;  ML      # ( 者 → 者 ) CJK COMPATIBILITY IDEOGRAPH-FAB2 → CJK UNIFIED IDEOGRAPH-8005       # 
+2F97A ;        8005 ;  ML      # ( 者 → 者 ) CJK COMPATIBILITY IDEOGRAPH-2F97A → CJK UNIFIED IDEOGRAPH-8005     # 
+
+2F7D ; 800C ;  ML      #* ( ⽽ → 而 ) KANGXI RADICAL AND → CJK UNIFIED IDEOGRAPH-800C    # 
+
+2F7E ; 8012 ;  ML      #* ( ⽾ → 耒 ) KANGXI RADICAL PLOW → CJK UNIFIED IDEOGRAPH-8012   # 
+
+2F7F ; 8033 ;  ML      #* ( ⽿ → 耳 ) KANGXI RADICAL EAR → CJK UNIFIED IDEOGRAPH-8033    # 
+
+F9B0 ; 8046 ;  ML      # ( 聆 → 聆 ) CJK COMPATIBILITY IDEOGRAPH-F9B0 → CJK UNIFIED IDEOGRAPH-8046       # 
+
+2F97D ;        8060 ;  ML      # ( 聠 → 聠 ) CJK COMPATIBILITY IDEOGRAPH-2F97D → CJK UNIFIED IDEOGRAPH-8060     # 
+
+F997 ; 806F ;  ML      # ( 聯 → 聯 ) CJK COMPATIBILITY IDEOGRAPH-F997 → CJK UNIFIED IDEOGRAPH-806F       # 
+
+2F97F ;        8070 ;  ML      # ( 聰 → 聰 ) CJK COMPATIBILITY IDEOGRAPH-2F97F → CJK UNIFIED IDEOGRAPH-8070     # 
+
+F945 ; 807E ;  ML      # ( 聾 → 聾 ) CJK COMPATIBILITY IDEOGRAPH-F945 → CJK UNIFIED IDEOGRAPH-807E       # 
+
+2F80 ; 807F ;  ML      #* ( ⾀ → 聿 ) KANGXI RADICAL BRUSH → CJK UNIFIED IDEOGRAPH-807F  # 
+
+2EBA ; 8080 ;  ML      #* ( ⺺ → 肀 ) CJK RADICAL BRUSH ONE → CJK UNIFIED IDEOGRAPH-8080 # 
+
+2F81 ; 8089 ;  ML      #* ( ⾁ → 肉 ) KANGXI RADICAL MEAT → CJK UNIFIED IDEOGRAPH-8089   # 
+
+F953 ; 808B ;  ML      # ( 肋 → 肋 ) CJK COMPATIBILITY IDEOGRAPH-F953 → CJK UNIFIED IDEOGRAPH-808B       # 
+
+2F8D6 ;        80AD ;  ML      # ( 肭 → 肭 ) CJK COMPATIBILITY IDEOGRAPH-2F8D6 → CJK UNIFIED IDEOGRAPH-80AD     # 
+
+2F982 ;        80B2 ;  ML      # ( 育 → 育 ) CJK COMPATIBILITY IDEOGRAPH-2F982 → CJK UNIFIED IDEOGRAPH-80B2     # 
+
+8141 ; 80FC ;  ML      # ( 腁 → 胼 ) CJK UNIFIED IDEOGRAPH-8141 → CJK UNIFIED IDEOGRAPH-80FC     # 
+
+2F983 ;        8103 ;  ML      # ( 脃 → 脃 ) CJK COMPATIBILITY IDEOGRAPH-2F983 → CJK UNIFIED IDEOGRAPH-8103     # 
+
+2F985 ;        813E ;  ML      # ( 脾 → 脾 ) CJK COMPATIBILITY IDEOGRAPH-2F985 → CJK UNIFIED IDEOGRAPH-813E     # 
+
+F926 ; 81D8 ;  ML      # ( 臘 → 臘 ) CJK COMPATIBILITY IDEOGRAPH-F926 → CJK UNIFIED IDEOGRAPH-81D8       # 
+
+2F82 ; 81E3 ;  ML      #* ( ⾂ → 臣 ) KANGXI RADICAL MINISTER → CJK UNIFIED IDEOGRAPH-81E3       # 
+
+F9F6 ; 81E8 ;  ML      # ( 臨 → 臨 ) CJK COMPATIBILITY IDEOGRAPH-F9F6 → CJK UNIFIED IDEOGRAPH-81E8       # 
+
+2F83 ; 81EA ;  ML      #* ( ⾃ → 自 ) KANGXI RADICAL SELF → CJK UNIFIED IDEOGRAPH-81EA   # 
+
+FA5C ; 81ED ;  ML      # ( 臭 → 臭 ) CJK COMPATIBILITY IDEOGRAPH-FA5C → CJK UNIFIED IDEOGRAPH-81ED       # 
+
+2F84 ; 81F3 ;  ML      #* ( ⾄ → 至 ) KANGXI RADICAL ARRIVE → CJK UNIFIED IDEOGRAPH-81F3 # 
+
+2F85 ; 81FC ;  ML      #* ( ⾅ → 臼 ) KANGXI RADICAL MORTAR → CJK UNIFIED IDEOGRAPH-81FC # 
+
+2F893 ;        8201 ;  ML      # ( 舁 → 舁 ) CJK COMPATIBILITY IDEOGRAPH-2F893 → CJK UNIFIED IDEOGRAPH-8201     # 
+2F98B ;        8201 ;  ML      # ( 舁 → 舁 ) CJK COMPATIBILITY IDEOGRAPH-2F98B → CJK UNIFIED IDEOGRAPH-8201     # 
+
+2F98C ;        8204 ;  ML      # ( 舄 → 舄 ) CJK COMPATIBILITY IDEOGRAPH-2F98C → CJK UNIFIED IDEOGRAPH-8204     # 
+
+2F86 ; 820C ;  ML      #* ( ⾆ → 舌 ) KANGXI RADICAL TONGUE → CJK UNIFIED IDEOGRAPH-820C # 
+
+FA6D ; 8218 ;  ML      # ( 舘 → 舘 ) CJK COMPATIBILITY IDEOGRAPH-FA6D → CJK UNIFIED IDEOGRAPH-8218       # 
+
+2F87 ; 821B ;  ML      #* ( ⾇ → 舛 ) KANGXI RADICAL OPPOSE → CJK UNIFIED IDEOGRAPH-821B # 
+
+2F88 ; 821F ;  ML      #* ( ⾈ → 舟 ) KANGXI RADICAL BOAT → CJK UNIFIED IDEOGRAPH-821F   # 
+
+2F89 ; 826E ;  ML      #* ( ⾉ → 艮 ) KANGXI RADICAL STOPPING → CJK UNIFIED IDEOGRAPH-826E       # 
+
+F97C ; 826F ;  ML      # ( 良 → 良 ) CJK COMPATIBILITY IDEOGRAPH-F97C → CJK UNIFIED IDEOGRAPH-826F       # 
+
+2F8A ; 8272 ;  ML      #* ( ⾊ → 色 ) KANGXI RADICAL COLOR → CJK UNIFIED IDEOGRAPH-8272  # 
+
+2F8B ; 8278 ;  ML      #* ( ⾋ → 艸 ) KANGXI RADICAL GRASS → CJK UNIFIED IDEOGRAPH-8278  # 
+
+FA5D ; 8279 ;  ML      # ( 艹 → 艹 ) CJK COMPATIBILITY IDEOGRAPH-FA5D → CJK UNIFIED IDEOGRAPH-8279       # 
+FA5E ; 8279 ;  ML      # ( 艹 → 艹 ) CJK COMPATIBILITY IDEOGRAPH-FA5E → CJK UNIFIED IDEOGRAPH-8279       # 
+2EBE ; 8279 ;  ML      #* ( ⺾ → 艹 ) CJK RADICAL GRASS ONE → CJK UNIFIED IDEOGRAPH-8279 # 
+2EBF ; 8279 ;  ML      #* ( ⺿ → 艹 ) CJK RADICAL GRASS TWO → CJK UNIFIED IDEOGRAPH-8279 # →艹→
+2EC0 ; 8279 ;  ML      #* ( ⻀ → 艹 ) CJK RADICAL GRASS THREE → CJK UNIFIED IDEOGRAPH-8279       # →艹→
+
+2F990 ;        828B ;  ML      # ( 芋 → 芋 ) CJK COMPATIBILITY IDEOGRAPH-2F990 → CJK UNIFIED IDEOGRAPH-828B     # 
+
+2F98F ;        8291 ;  ML      # ( 芑 → 芑 ) CJK COMPATIBILITY IDEOGRAPH-2F98F → CJK UNIFIED IDEOGRAPH-8291     # 
+
+2F991 ;        829D ;  ML      # ( 芝 → 芝 ) CJK COMPATIBILITY IDEOGRAPH-2F991 → CJK UNIFIED IDEOGRAPH-829D     # 
+
+2F993 ;        82B1 ;  ML      # ( 花 → 花 ) CJK COMPATIBILITY IDEOGRAPH-2F993 → CJK UNIFIED IDEOGRAPH-82B1     # 
+
+2F994 ;        82B3 ;  ML      # ( 芳 → 芳 ) CJK COMPATIBILITY IDEOGRAPH-2F994 → CJK UNIFIED IDEOGRAPH-82B3     # 
+
+2F995 ;        82BD ;  ML      # ( 芽 → 芽 ) CJK COMPATIBILITY IDEOGRAPH-2F995 → CJK UNIFIED IDEOGRAPH-82BD     # 
+
+F974 ; 82E5 ;  ML      # ( 若 → 若 ) CJK COMPATIBILITY IDEOGRAPH-F974 → CJK UNIFIED IDEOGRAPH-82E5       # 
+2F998 ;        82E5 ;  ML      # ( 若 → 若 ) CJK COMPATIBILITY IDEOGRAPH-2F998 → CJK UNIFIED IDEOGRAPH-82E5     # 
+
+2F996 ;        82E6 ;  ML      # ( 苦 → 苦 ) CJK COMPATIBILITY IDEOGRAPH-2F996 → CJK UNIFIED IDEOGRAPH-82E6     # 
+
+2F999 ;        831D ;  ML      # ( 茝 → 茝 ) CJK COMPATIBILITY IDEOGRAPH-2F999 → CJK UNIFIED IDEOGRAPH-831D     # 
+
+2F99C ;        8323 ;  ML      # ( 茣 → 茣 ) CJK COMPATIBILITY IDEOGRAPH-2F99C → CJK UNIFIED IDEOGRAPH-8323     # 
+
+F9FE ; 8336 ;  ML      # ( 茶 → 茶 ) CJK COMPATIBILITY IDEOGRAPH-F9FE → CJK UNIFIED IDEOGRAPH-8336       # 
+
+FAB3 ; 8352 ;  ML      # ( 荒 → 荒 ) CJK COMPATIBILITY IDEOGRAPH-FAB3 → CJK UNIFIED IDEOGRAPH-8352       # 
+
+2F9A0 ;        8353 ;  ML      # ( 荓 → 荓 ) CJK COMPATIBILITY IDEOGRAPH-2F9A0 → CJK UNIFIED IDEOGRAPH-8353     # 
+
+2F99A ;        8363 ;  ML      # ( 荣 → 荣 ) CJK COMPATIBILITY IDEOGRAPH-2F99A → CJK UNIFIED IDEOGRAPH-8363     # 
+
+2F99B ;        83AD ;  ML      # ( 莭 → 莭 ) CJK COMPATIBILITY IDEOGRAPH-2F99B → CJK UNIFIED IDEOGRAPH-83AD     # 
+
+2F99D ;        83BD ;  ML      # ( 莽 → 莽 ) CJK COMPATIBILITY IDEOGRAPH-2F99D → CJK UNIFIED IDEOGRAPH-83BD     # 
+
+F93E ; 83C9 ;  ML      # ( 菉 → 菉 ) CJK COMPATIBILITY IDEOGRAPH-F93E → CJK UNIFIED IDEOGRAPH-83C9       # 
+
+2F9A1 ;        83CA ;  ML      # ( 菊 → 菊 ) CJK COMPATIBILITY IDEOGRAPH-2F9A1 → CJK UNIFIED IDEOGRAPH-83CA     # 
+
+2F9A2 ;        83CC ;  ML      # ( 菌 → 菌 ) CJK COMPATIBILITY IDEOGRAPH-2F9A2 → CJK UNIFIED IDEOGRAPH-83CC     # 
+
+2F9A3 ;        83DC ;  ML      # ( 菜 → 菜 ) CJK COMPATIBILITY IDEOGRAPH-2F9A3 → CJK UNIFIED IDEOGRAPH-83DC     # 
+
+2F99E ;        83E7 ;  ML      # ( 菧 → 菧 ) CJK COMPATIBILITY IDEOGRAPH-2F99E → CJK UNIFIED IDEOGRAPH-83E7     # 
+
+FAB4 ; 83EF ;  ML      # ( 華 → 華 ) CJK COMPATIBILITY IDEOGRAPH-FAB4 → CJK UNIFIED IDEOGRAPH-83EF       # 
+
+F958 ; 83F1 ;  ML      # ( 菱 → 菱 ) CJK COMPATIBILITY IDEOGRAPH-F958 → CJK UNIFIED IDEOGRAPH-83F1       # 
+
+F918 ; 843D ;  ML      # ( 落 → 落 ) CJK COMPATIBILITY IDEOGRAPH-F918 → CJK UNIFIED IDEOGRAPH-843D       # 
+
+F96E ; 8449 ;  ML      # ( 葉 → 葉 ) CJK COMPATIBILITY IDEOGRAPH-F96E → CJK UNIFIED IDEOGRAPH-8449       # 
+
+FA5F ; 8457 ;  ML      # ( 著 → 著 ) CJK COMPATIBILITY IDEOGRAPH-FA5F → CJK UNIFIED IDEOGRAPH-8457       # 
+2F99F ;        8457 ;  ML      # ( 著 → 著 ) CJK COMPATIBILITY IDEOGRAPH-2F99F → CJK UNIFIED IDEOGRAPH-8457     # 
+
+853F ; 848D ;  ML      # ( 蔿 → 蒍 ) CJK UNIFIED IDEOGRAPH-853F → CJK UNIFIED IDEOGRAPH-848D     # 
+
+F999 ; 84EE ;  ML      # ( 蓮 → 蓮 ) CJK COMPATIBILITY IDEOGRAPH-F999 → CJK UNIFIED IDEOGRAPH-84EE       # 
+
+2F9A8 ;        84F1 ;  ML      # ( 蓱 → 蓱 ) CJK COMPATIBILITY IDEOGRAPH-2F9A8 → CJK UNIFIED IDEOGRAPH-84F1     # 
+
+2F9A9 ;        84F3 ;  ML      # ( 蓳 → 蓳 ) CJK COMPATIBILITY IDEOGRAPH-2F9A9 → CJK UNIFIED IDEOGRAPH-84F3     # 
+
+F9C2 ; 84FC ;  ML      # ( 蓼 → 蓼 ) CJK COMPATIBILITY IDEOGRAPH-F9C2 → CJK UNIFIED IDEOGRAPH-84FC       # 
+
+2F9AA ;        8516 ;  ML      # ( 蔖 → 蔖 ) CJK COMPATIBILITY IDEOGRAPH-2F9AA → CJK UNIFIED IDEOGRAPH-8516     # 
+
+2F9AC ;        8564 ;  ML      # ( 蕤 → 蕤 ) CJK COMPATIBILITY IDEOGRAPH-2F9AC → CJK UNIFIED IDEOGRAPH-8564     # 
+
+F923 ; 85CD ;  ML      # ( 藍 → 藍 ) CJK COMPATIBILITY IDEOGRAPH-F923 → CJK UNIFIED IDEOGRAPH-85CD       # 
+
+F9F0 ; 85FA ;  ML      # ( 藺 → 藺 ) CJK COMPATIBILITY IDEOGRAPH-F9F0 → CJK UNIFIED IDEOGRAPH-85FA       # 
+
+F935 ; 8606 ;  ML      # ( 蘆 → 蘆 ) CJK COMPATIBILITY IDEOGRAPH-F935 → CJK UNIFIED IDEOGRAPH-8606       # 
+
+FA20 ; 8612 ;  ML      # ( 蘒 → 蘒 ) CJK COMPATIBILITY IDEOGRAPH-FA20 → CJK UNIFIED IDEOGRAPH-8612       # 
+
+F91F ; 862D ;  ML      # ( 蘭 → 蘭 ) CJK COMPATIBILITY IDEOGRAPH-F91F → CJK UNIFIED IDEOGRAPH-862D       # 
+
+8641 ; 8637 ;  ML      # ( 虁 → 蘷 ) CJK UNIFIED IDEOGRAPH-8641 → CJK UNIFIED IDEOGRAPH-8637     # 
+
+F910 ; 863F ;  ML      # ( 蘿 → 蘿 ) CJK COMPATIBILITY IDEOGRAPH-F910 → CJK UNIFIED IDEOGRAPH-863F       # 
+
+2F8C ; 864D ;  ML      #* ( ⾌ → 虍 ) KANGXI RADICAL TIGER → CJK UNIFIED IDEOGRAPH-864D  # 
+
+2EC1 ; 864E ;  ML      #* ( ⻁ → 虎 ) CJK RADICAL TIGER → CJK UNIFIED IDEOGRAPH-864E     # 
+
+2F9B3 ;        8650 ;  ML      # ( 虐 → 虐 ) CJK COMPATIBILITY IDEOGRAPH-2F9B3 → CJK UNIFIED IDEOGRAPH-8650     # 
+
+F936 ; 865C ;  ML      # ( 虜 → 虜 ) CJK COMPATIBILITY IDEOGRAPH-F936 → CJK UNIFIED IDEOGRAPH-865C       # 
+2F9B4 ;        865C ;  ML      # ( 虜 → 虜 ) CJK COMPATIBILITY IDEOGRAPH-2F9B4 → CJK UNIFIED IDEOGRAPH-865C     # 
+
+2F9B5 ;        8667 ;  ML      # ( 虧 → 虧 ) CJK COMPATIBILITY IDEOGRAPH-2F9B5 → CJK UNIFIED IDEOGRAPH-8667     # 
+
+2F9B6 ;        8669 ;  ML      # ( 虩 → 虩 ) CJK COMPATIBILITY IDEOGRAPH-2F9B6 → CJK UNIFIED IDEOGRAPH-8669     # 
+
+2F8D ; 866B ;  ML      #* ( ⾍ → 虫 ) KANGXI RADICAL INSECT → CJK UNIFIED IDEOGRAPH-866B # 
+
+2F9B8 ;        8688 ;  ML      # ( 蚈 → 蚈 ) CJK COMPATIBILITY IDEOGRAPH-2F9B8 → CJK UNIFIED IDEOGRAPH-8688     # 
+
+2F9B7 ;        86A9 ;  ML      # ( 蚩 → 蚩 ) CJK COMPATIBILITY IDEOGRAPH-2F9B7 → CJK UNIFIED IDEOGRAPH-86A9     # 
+
+2F9BA ;        86E2 ;  ML      # ( 蛢 → 蛢 ) CJK COMPATIBILITY IDEOGRAPH-2F9BA → CJK UNIFIED IDEOGRAPH-86E2     # 
+
+2F9B9 ;        870E ;  ML      # ( 蜎 → 蜎 ) CJK COMPATIBILITY IDEOGRAPH-2F9B9 → CJK UNIFIED IDEOGRAPH-870E     # 
+
+2F9BC ;        8728 ;  ML      # ( 蜨 → 蜨 ) CJK COMPATIBILITY IDEOGRAPH-2F9BC → CJK UNIFIED IDEOGRAPH-8728     # 
+
+2F9BD ;        876B ;  ML      # ( 蝫 → 蝫 ) CJK COMPATIBILITY IDEOGRAPH-2F9BD → CJK UNIFIED IDEOGRAPH-876B     # 
+
+FAB5 ; 8779 ;  ML      # ( 蝹 → 蝹 ) CJK COMPATIBILITY IDEOGRAPH-FAB5 → CJK UNIFIED IDEOGRAPH-8779       # 
+2F9BB ;        8779 ;  ML      # ( 蝹 → 蝹 ) CJK COMPATIBILITY IDEOGRAPH-2F9BB → CJK UNIFIED IDEOGRAPH-8779     # 
+
+2F9BE ;        8786 ;  ML      # ( 螆 → 螆 ) CJK COMPATIBILITY IDEOGRAPH-2F9BE → CJK UNIFIED IDEOGRAPH-8786     # 
+
+F911 ; 87BA ;  ML      # ( 螺 → 螺 ) CJK COMPATIBILITY IDEOGRAPH-F911 → CJK UNIFIED IDEOGRAPH-87BA       # 
+
+2F9C0 ;        87E1 ;  ML      # ( 蟡 → 蟡 ) CJK COMPATIBILITY IDEOGRAPH-2F9C0 → CJK UNIFIED IDEOGRAPH-87E1     # 
+
+2F9C1 ;        8801 ;  ML      # ( 蠁 → 蠁 ) CJK COMPATIBILITY IDEOGRAPH-2F9C1 → CJK UNIFIED IDEOGRAPH-8801     # 
+
+F927 ; 881F ;  ML      # ( 蠟 → 蠟 ) CJK COMPATIBILITY IDEOGRAPH-F927 → CJK UNIFIED IDEOGRAPH-881F       # 
+
+2F8E ; 8840 ;  ML      #* ( ⾎ → 血 ) KANGXI RADICAL BLOOD → CJK UNIFIED IDEOGRAPH-8840  # 
+
+FA08 ; 884C ;  ML      # ( 行 → 行 ) CJK COMPATIBILITY IDEOGRAPH-FA08 → CJK UNIFIED IDEOGRAPH-884C       # 
+2F8F ; 884C ;  ML      #* ( ⾏ → 行 ) KANGXI RADICAL WALK ENCLOSURE → CJK UNIFIED IDEOGRAPH-884C # 
+
+2F9C3 ;        8860 ;  ML      # ( 衠 → 衠 ) CJK COMPATIBILITY IDEOGRAPH-2F9C3 → CJK UNIFIED IDEOGRAPH-8860     # 
+
+2F9C4 ;        8863 ;  ML      # ( 衣 → 衣 ) CJK COMPATIBILITY IDEOGRAPH-2F9C4 → CJK UNIFIED IDEOGRAPH-8863     # 
+2F90 ; 8863 ;  ML      #* ( ⾐ → 衣 ) KANGXI RADICAL CLOTHES → CJK UNIFIED IDEOGRAPH-8863        # 
+
+2EC2 ; 8864 ;  ML      #* ( ⻂ → 衤 ) CJK RADICAL CLOTHES → CJK UNIFIED IDEOGRAPH-8864   # 
+
+F9A0 ; 88C2 ;  ML      # ( 裂 → 裂 ) CJK COMPATIBILITY IDEOGRAPH-F9A0 → CJK UNIFIED IDEOGRAPH-88C2       # 
+
+F9E7 ; 88CF ;  ML      # ( 裏 → 裏 ) CJK COMPATIBILITY IDEOGRAPH-F9E7 → CJK UNIFIED IDEOGRAPH-88CF       # 
+
+2F9C6 ;        88D7 ;  ML      # ( 裗 → 裗 ) CJK COMPATIBILITY IDEOGRAPH-2F9C6 → CJK UNIFIED IDEOGRAPH-88D7     # 
+
+2F9C7 ;        88DE ;  ML      # ( 裞 → 裞 ) CJK COMPATIBILITY IDEOGRAPH-2F9C7 → CJK UNIFIED IDEOGRAPH-88DE     # 
+
+F9E8 ; 88E1 ;  ML      # ( 裡 → 裡 ) CJK COMPATIBILITY IDEOGRAPH-F9E8 → CJK UNIFIED IDEOGRAPH-88E1       # 
+
+F912 ; 88F8 ;  ML      # ( 裸 → 裸 ) CJK COMPATIBILITY IDEOGRAPH-F912 → CJK UNIFIED IDEOGRAPH-88F8       # 
+
+2F9C9 ;        88FA ;  ML      # ( 裺 → 裺 ) CJK COMPATIBILITY IDEOGRAPH-2F9C9 → CJK UNIFIED IDEOGRAPH-88FA     # 
+
+FA60 ; 8910 ;  ML      # ( 褐 → 褐 ) CJK COMPATIBILITY IDEOGRAPH-FA60 → CJK UNIFIED IDEOGRAPH-8910       # 
+
+FAB6 ; 8941 ;  ML      # ( 襁 → 襁 ) CJK COMPATIBILITY IDEOGRAPH-FAB6 → CJK UNIFIED IDEOGRAPH-8941       # 
+
+F924 ; 8964 ;  ML      # ( 襤 → 襤 ) CJK COMPATIBILITY IDEOGRAPH-F924 → CJK UNIFIED IDEOGRAPH-8964       # 
+
+2F91 ; 897E ;  ML      #* ( ⾑ → 襾 ) KANGXI RADICAL WEST → CJK UNIFIED IDEOGRAPH-897E   # 
+
+2EC4 ; 897F ;  ML      #* ( ⻄ → 西 ) CJK RADICAL WEST TWO → CJK UNIFIED IDEOGRAPH-897F  # 
+
+2EC3 ; 8980 ;  ML      #* ( ⻃ → 覀 ) CJK RADICAL WEST ONE → CJK UNIFIED IDEOGRAPH-8980  # 
+
+FAB7 ; 8986 ;  ML      # ( 覆 → 覆 ) CJK COMPATIBILITY IDEOGRAPH-FAB7 → CJK UNIFIED IDEOGRAPH-8986       # 
+
+FA0A ; 898B ;  ML      # ( 見 → 見 ) CJK COMPATIBILITY IDEOGRAPH-FA0A → CJK UNIFIED IDEOGRAPH-898B       # 
+2F92 ; 898B ;  ML      #* ( ⾒ → 見 ) KANGXI RADICAL SEE → CJK UNIFIED IDEOGRAPH-898B    # 
+
+FA61 ; 8996 ;  ML      # ( 視 → 視 ) CJK COMPATIBILITY IDEOGRAPH-FA61 → CJK UNIFIED IDEOGRAPH-8996       # 
+FAB8 ; 8996 ;  ML      # ( 視 → 視 ) CJK COMPATIBILITY IDEOGRAPH-FAB8 → CJK UNIFIED IDEOGRAPH-8996       # 
+
+2EC5 ; 89C1 ;  ML      #* ( ⻅ → 见 ) CJK RADICAL C-SIMPLIFIED SEE → CJK UNIFIED IDEOGRAPH-89C1  # 
+
+2F93 ; 89D2 ;  ML      #* ( ⾓ → 角 ) KANGXI RADICAL HORN → CJK UNIFIED IDEOGRAPH-89D2   # 
+
+2F94 ; 8A00 ;  ML      #* ( ⾔ → 言 ) KANGXI RADICAL SPEECH → CJK UNIFIED IDEOGRAPH-8A00 # 
+
+8A7D ; 8A2E ;  ML      # ( 詽 → 訮 ) CJK UNIFIED IDEOGRAPH-8A7D → CJK UNIFIED IDEOGRAPH-8A2E     # 
+
+2F9CF ;        8AA0 ;  ML      # ( 誠 → 誠 ) CJK COMPATIBILITY IDEOGRAPH-2F9CF → CJK UNIFIED IDEOGRAPH-8AA0     # 
+
+F96F ; 8AAA ;  ML      # ( 說 → 說 ) CJK COMPATIBILITY IDEOGRAPH-F96F → CJK UNIFIED IDEOGRAPH-8AAA       # 
+F9A1 ; 8AAA ;  ML      # ( 說 → 說 ) CJK COMPATIBILITY IDEOGRAPH-F9A1 → CJK UNIFIED IDEOGRAPH-8AAA       # 
+
+FAB9 ; 8ABF ;  ML      # ( 調 → 調 ) CJK COMPATIBILITY IDEOGRAPH-FAB9 → CJK UNIFIED IDEOGRAPH-8ABF       # 
+
+FABB ; 8ACB ;  ML      # ( 請 → 請 ) CJK COMPATIBILITY IDEOGRAPH-FABB → CJK UNIFIED IDEOGRAPH-8ACB       # 
+
+F97D ; 8AD2 ;  ML      # ( 諒 → 諒 ) CJK COMPATIBILITY IDEOGRAPH-F97D → CJK UNIFIED IDEOGRAPH-8AD2       # 
+
+F941 ; 8AD6 ;  ML      # ( 論 → 論 ) CJK COMPATIBILITY IDEOGRAPH-F941 → CJK UNIFIED IDEOGRAPH-8AD6       # 
+
+FABE ; 8AED ;  ML      # ( 諭 → 諭 ) CJK COMPATIBILITY IDEOGRAPH-FABE → CJK UNIFIED IDEOGRAPH-8AED       # 
+2F9D0 ;        8AED ;  ML      # ( 諭 → 諭 ) CJK COMPATIBILITY IDEOGRAPH-2F9D0 → CJK UNIFIED IDEOGRAPH-8AED     # 
+
+FA22 ; 8AF8 ;  ML      # ( 諸 → 諸 ) CJK COMPATIBILITY IDEOGRAPH-FA22 → CJK UNIFIED IDEOGRAPH-8AF8       # 
+FABA ; 8AF8 ;  ML      # ( 諸 → 諸 ) CJK COMPATIBILITY IDEOGRAPH-FABA → CJK UNIFIED IDEOGRAPH-8AF8       # 
+
+F95D ; 8AFE ;  ML      # ( 諾 → 諾 ) CJK COMPATIBILITY IDEOGRAPH-F95D → CJK UNIFIED IDEOGRAPH-8AFE       # 
+FABD ; 8AFE ;  ML      # ( 諾 → 諾 ) CJK COMPATIBILITY IDEOGRAPH-FABD → CJK UNIFIED IDEOGRAPH-8AFE       # 
+
+FA62 ; 8B01 ;  ML      # ( 謁 → 謁 ) CJK COMPATIBILITY IDEOGRAPH-FA62 → CJK UNIFIED IDEOGRAPH-8B01       # 
+FABC ; 8B01 ;  ML      # ( 謁 → 謁 ) CJK COMPATIBILITY IDEOGRAPH-FABC → CJK UNIFIED IDEOGRAPH-8B01       # 
+
+FA63 ; 8B39 ;  ML      # ( 謹 → 謹 ) CJK COMPATIBILITY IDEOGRAPH-FA63 → CJK UNIFIED IDEOGRAPH-8B39       # 
+FABF ; 8B39 ;  ML      # ( 謹 → 謹 ) CJK COMPATIBILITY IDEOGRAPH-FABF → CJK UNIFIED IDEOGRAPH-8B39       # 
+
+F9FC ; 8B58 ;  ML      # ( 識 → 識 ) CJK COMPATIBILITY IDEOGRAPH-F9FC → CJK UNIFIED IDEOGRAPH-8B58       # 
+
+F95A ; 8B80 ;  ML      # ( 讀 → 讀 ) CJK COMPATIBILITY IDEOGRAPH-F95A → CJK UNIFIED IDEOGRAPH-8B80       # 
+
+8B8F ; 8B86 ;  ML      # ( 讏 → 讆 ) CJK UNIFIED IDEOGRAPH-8B8F → CJK UNIFIED IDEOGRAPH-8B86     # 
+
+FAC0 ; 8B8A ;  ML      # ( 變 → 變 ) CJK COMPATIBILITY IDEOGRAPH-FAC0 → CJK UNIFIED IDEOGRAPH-8B8A       # 
+2F9D1 ;        8B8A ;  ML      # ( 變 → 變 ) CJK COMPATIBILITY IDEOGRAPH-2F9D1 → CJK UNIFIED IDEOGRAPH-8B8A     # 
+
+2EC8 ; 8BA0 ;  ML      #* ( ⻈ → 讠 ) CJK RADICAL C-SIMPLIFIED SPEECH → CJK UNIFIED IDEOGRAPH-8BA0       # 
+
+2F95 ; 8C37 ;  ML      #* ( ⾕ → 谷 ) KANGXI RADICAL VALLEY → CJK UNIFIED IDEOGRAPH-8C37 # 
+
+2F96 ; 8C46 ;  ML      #* ( ⾖ → 豆 ) KANGXI RADICAL BEAN → CJK UNIFIED IDEOGRAPH-8C46   # 
+
+F900 ; 8C48 ;  ML      # ( 豈 → 豈 ) CJK COMPATIBILITY IDEOGRAPH-F900 → CJK UNIFIED IDEOGRAPH-8C48       # 
+
+2F9D2 ;        8C55 ;  ML      # ( 豕 → 豕 ) CJK COMPATIBILITY IDEOGRAPH-2F9D2 → CJK UNIFIED IDEOGRAPH-8C55     # 
+2F97 ; 8C55 ;  ML      #* ( ⾗ → 豕 ) KANGXI RADICAL PIG → CJK UNIFIED IDEOGRAPH-8C55    # 
+
+8C63 ; 8C5C ;  ML      # ( 豣 → 豜 ) CJK UNIFIED IDEOGRAPH-8C63 → CJK UNIFIED IDEOGRAPH-8C5C     # 
+
+2F98 ; 8C78 ;  ML      #* ( ⾘ → 豸 ) KANGXI RADICAL BADGER → CJK UNIFIED IDEOGRAPH-8C78 # 
+
+2F99 ; 8C9D ;  ML      #* ( ⾙ → 貝 ) KANGXI RADICAL SHELL → CJK UNIFIED IDEOGRAPH-8C9D  # 
+
+2F9D4 ;        8CAB ;  ML      # ( 貫 → 貫 ) CJK COMPATIBILITY IDEOGRAPH-2F9D4 → CJK UNIFIED IDEOGRAPH-8CAB     # 
+
+2F9D5 ;        8CC1 ;  ML      # ( 賁 → 賁 ) CJK COMPATIBILITY IDEOGRAPH-2F9D5 → CJK UNIFIED IDEOGRAPH-8CC1     # 
+
+F948 ; 8CC2 ;  ML      # ( 賂 → 賂 ) CJK COMPATIBILITY IDEOGRAPH-F948 → CJK UNIFIED IDEOGRAPH-8CC2       # 
+
+F903 ; 8CC8 ;  ML      # ( 賈 → 賈 ) CJK COMPATIBILITY IDEOGRAPH-F903 → CJK UNIFIED IDEOGRAPH-8CC8       # 
+
+FA64 ; 8CD3 ;  ML      # ( 賓 → 賓 ) CJK COMPATIBILITY IDEOGRAPH-FA64 → CJK UNIFIED IDEOGRAPH-8CD3       # 
+
+FA65 ; 8D08 ;  ML      # ( 贈 → 贈 ) CJK COMPATIBILITY IDEOGRAPH-FA65 → CJK UNIFIED IDEOGRAPH-8D08       # 
+FAC1 ; 8D08 ;  ML      # ( 贈 → 贈 ) CJK COMPATIBILITY IDEOGRAPH-FAC1 → CJK UNIFIED IDEOGRAPH-8D08       # 
+
+2F9D6 ;        8D1B ;  ML      # ( 贛 → 贛 ) CJK COMPATIBILITY IDEOGRAPH-2F9D6 → CJK UNIFIED IDEOGRAPH-8D1B     # 
+
+2EC9 ; 8D1D ;  ML      #* ( ⻉ → 贝 ) CJK RADICAL C-SIMPLIFIED SHELL → CJK UNIFIED IDEOGRAPH-8D1D        # 
+
+2F9A ; 8D64 ;  ML      #* ( ⾚ → 赤 ) KANGXI RADICAL RED → CJK UNIFIED IDEOGRAPH-8D64    # 
+
+2F9B ; 8D70 ;  ML      #* ( ⾛ → 走 ) KANGXI RADICAL RUN → CJK UNIFIED IDEOGRAPH-8D70    # 
+
+2F9D7 ;        8D77 ;  ML      # ( 起 → 起 ) CJK COMPATIBILITY IDEOGRAPH-2F9D7 → CJK UNIFIED IDEOGRAPH-8D77     # 
+
+8D86 ; 8D7F ;  ML      # ( 趆 → 赿 ) CJK UNIFIED IDEOGRAPH-8D86 → CJK UNIFIED IDEOGRAPH-8D7F     # 
+
+2F9C ; 8DB3 ;  ML      #* ( ⾜ → 足 ) KANGXI RADICAL FOOT → CJK UNIFIED IDEOGRAPH-8DB3   # 
+
+2F9DB ;        8DBC ;  ML      # ( 趼 → 趼 ) CJK COMPATIBILITY IDEOGRAPH-2F9DB → CJK UNIFIED IDEOGRAPH-8DBC     # 
+
+2F9DA ;        8DCB ;  ML      # ( 跋 → 跋 ) CJK COMPATIBILITY IDEOGRAPH-2F9DA → CJK UNIFIED IDEOGRAPH-8DCB     # 
+
+8DFA ; 8DE5 ;  ML      # ( 跺 → 跥 ) CJK UNIFIED IDEOGRAPH-8DFA → CJK UNIFIED IDEOGRAPH-8DE5     # 
+
+F937 ; 8DEF ;  ML      # ( 路 → 路 ) CJK COMPATIBILITY IDEOGRAPH-F937 → CJK UNIFIED IDEOGRAPH-8DEF       # 
+
+2F9DC ;        8DF0 ;  ML      # ( 跰 → 跰 ) CJK COMPATIBILITY IDEOGRAPH-2F9DC → CJK UNIFIED IDEOGRAPH-8DF0     # 
+
+8E9B ; 8E97 ;  ML      # ( 躛 → 躗 ) CJK UNIFIED IDEOGRAPH-8E9B → CJK UNIFIED IDEOGRAPH-8E97     # 
+
+2F9D ; 8EAB ;  ML      #* ( ⾝ → 身 ) KANGXI RADICAL BODY → CJK UNIFIED IDEOGRAPH-8EAB   # 
+
+F902 ; 8ECA ;  ML      # ( 車 → 車 ) CJK COMPATIBILITY IDEOGRAPH-F902 → CJK UNIFIED IDEOGRAPH-8ECA       # 
+2F9E ; 8ECA ;  ML      #* ( ⾞ → 車 ) KANGXI RADICAL CART → CJK UNIFIED IDEOGRAPH-8ECA   # 
+
+2F9DE ;        8ED4 ;  ML      # ( 軔 → 軔 ) CJK COMPATIBILITY IDEOGRAPH-2F9DE → CJK UNIFIED IDEOGRAPH-8ED4     # 
+
+8F27 ; 8EFF ;  ML      # ( 輧 → 軿 ) CJK UNIFIED IDEOGRAPH-8F27 → CJK UNIFIED IDEOGRAPH-8EFF     # 
+
+F998 ; 8F26 ;  ML      # ( 輦 → 輦 ) CJK COMPATIBILITY IDEOGRAPH-F998 → CJK UNIFIED IDEOGRAPH-8F26       # 
+
+F9D7 ; 8F2A ;  ML      # ( 輪 → 輪 ) CJK COMPATIBILITY IDEOGRAPH-F9D7 → CJK UNIFIED IDEOGRAPH-8F2A       # 
+
+FAC2 ; 8F38 ;  ML      # ( 輸 → 輸 ) CJK COMPATIBILITY IDEOGRAPH-FAC2 → CJK UNIFIED IDEOGRAPH-8F38       # 
+2F9DF ;        8F38 ;  ML      # ( 輸 → 輸 ) CJK COMPATIBILITY IDEOGRAPH-2F9DF → CJK UNIFIED IDEOGRAPH-8F38     # 
+
+FA07 ; 8F3B ;  ML      # ( 輻 → 輻 ) CJK COMPATIBILITY IDEOGRAPH-FA07 → CJK UNIFIED IDEOGRAPH-8F3B       # 
+
+F98D ; 8F62 ;  ML      # ( 轢 → 轢 ) CJK COMPATIBILITY IDEOGRAPH-F98D → CJK UNIFIED IDEOGRAPH-8F62       # 
+
+2ECB ; 8F66 ;  ML      #* ( ⻋ → 车 ) CJK RADICAL C-SIMPLIFIED CART → CJK UNIFIED IDEOGRAPH-8F66 # 
+
+2F9F ; 8F9B ;  ML      #* ( ⾟ → 辛 ) KANGXI RADICAL BITTER → CJK UNIFIED IDEOGRAPH-8F9B # 
+
+2F98D ;        8F9E ;  ML      # ( 辞 → 辞 ) CJK COMPATIBILITY IDEOGRAPH-2F98D → CJK UNIFIED IDEOGRAPH-8F9E     # 
+
+F971 ; 8FB0 ;  ML      # ( 辰 → 辰 ) CJK COMPATIBILITY IDEOGRAPH-F971 → CJK UNIFIED IDEOGRAPH-8FB0       # 
+2FA0 ; 8FB0 ;  ML      #* ( ⾠ → 辰 ) KANGXI RADICAL MORNING → CJK UNIFIED IDEOGRAPH-8FB0        # 
+
+2FA1 ; 8FB5 ;  ML      #* ( ⾡ → 辵 ) KANGXI RADICAL WALK → CJK UNIFIED IDEOGRAPH-8FB5   # 
+
+FA66 ; 8FB6 ;  ML      # ( 辶 → 辶 ) CJK COMPATIBILITY IDEOGRAPH-FA66 → CJK UNIFIED IDEOGRAPH-8FB6       # 
+2ECC ; 8FB6 ;  ML      #* ( ⻌ → 辶 ) CJK RADICAL SIMPLIFIED WALK → CJK UNIFIED IDEOGRAPH-8FB6   # 
+2ECD ; 8FB6 ;  ML      #* ( ⻍ → 辶 ) CJK RADICAL WALK ONE → CJK UNIFIED IDEOGRAPH-8FB6  # 
+
+F99A ; 9023 ;  ML      # ( 連 → 連 ) CJK COMPATIBILITY IDEOGRAPH-F99A → CJK UNIFIED IDEOGRAPH-9023       # 
+
+FA25 ; 9038 ;  ML      # ( 逸 → 逸 ) CJK COMPATIBILITY IDEOGRAPH-FA25 → CJK UNIFIED IDEOGRAPH-9038       # 
+FA67 ; 9038 ;  ML      # ( 逸 → 逸 ) CJK COMPATIBILITY IDEOGRAPH-FA67 → CJK UNIFIED IDEOGRAPH-9038       # 
+
+FAC3 ; 9072 ;  ML      # ( 遲 → 遲 ) CJK COMPATIBILITY IDEOGRAPH-FAC3 → CJK UNIFIED IDEOGRAPH-9072       # 
+
+F9C3 ; 907C ;  ML      # ( 遼 → 遼 ) CJK COMPATIBILITY IDEOGRAPH-F9C3 → CJK UNIFIED IDEOGRAPH-907C       # 
+
+F913 ; 908F ;  ML      # ( 邏 → 邏 ) CJK COMPATIBILITY IDEOGRAPH-F913 → CJK UNIFIED IDEOGRAPH-908F       # 
+
+2FA2 ; 9091 ;  ML      #* ( ⾢ → 邑 ) KANGXI RADICAL CITY → CJK UNIFIED IDEOGRAPH-9091   # 
+
+2F9E2 ;        9094 ;  ML      # ( 邔 → 邔 ) CJK COMPATIBILITY IDEOGRAPH-2F9E2 → CJK UNIFIED IDEOGRAPH-9094     # 
+
+F92C ; 90CE ;  ML      # ( 郎 → 郎 ) CJK COMPATIBILITY IDEOGRAPH-F92C → CJK UNIFIED IDEOGRAPH-90CE       # 
+90DE ; 90CE ;  ML      # ( 郞 → 郎 ) CJK UNIFIED IDEOGRAPH-90DE → CJK UNIFIED IDEOGRAPH-90CE     # →郎→
+
+2F9E3 ;        90F1 ;  ML      # ( 郱 → 郱 ) CJK COMPATIBILITY IDEOGRAPH-2F9E3 → CJK UNIFIED IDEOGRAPH-90F1     # 
+
+FA26 ; 90FD ;  ML      # ( 都 → 都 ) CJK COMPATIBILITY IDEOGRAPH-FA26 → CJK UNIFIED IDEOGRAPH-90FD       # 
+
+2F9E4 ;        9111 ;  ML      # ( 鄑 → 鄑 ) CJK COMPATIBILITY IDEOGRAPH-2F9E4 → CJK UNIFIED IDEOGRAPH-9111     # 
+
+2F9E6 ;        911B ;  ML      # ( 鄛 → 鄛 ) CJK COMPATIBILITY IDEOGRAPH-2F9E6 → CJK UNIFIED IDEOGRAPH-911B     # 
+
+2FA3 ; 9149 ;  ML      #* ( ⾣ → 酉 ) KANGXI RADICAL WINE → CJK UNIFIED IDEOGRAPH-9149   # 
+
+F919 ; 916A ;  ML      # ( 酪 → 酪 ) CJK COMPATIBILITY IDEOGRAPH-F919 → CJK UNIFIED IDEOGRAPH-916A       # 
+
+FAC4 ; 9199 ;  ML      # ( 醙 → 醙 ) CJK COMPATIBILITY IDEOGRAPH-FAC4 → CJK UNIFIED IDEOGRAPH-9199       # 
+
+F9B7 ; 91B4 ;  ML      # ( 醴 → 醴 ) CJK COMPATIBILITY IDEOGRAPH-F9B7 → CJK UNIFIED IDEOGRAPH-91B4       # 
+
+2FA4 ; 91C6 ;  ML      #* ( ⾤ → 釆 ) KANGXI RADICAL DISTINGUISH → CJK UNIFIED IDEOGRAPH-91C6    # 
+
+F9E9 ; 91CC ;  ML      # ( 里 → 里 ) CJK COMPATIBILITY IDEOGRAPH-F9E9 → CJK UNIFIED IDEOGRAPH-91CC       # 
+2FA5 ; 91CC ;  ML      #* ( ⾥ → 里 ) KANGXI RADICAL VILLAGE → CJK UNIFIED IDEOGRAPH-91CC        # 
+
+F97E ; 91CF ;  ML      # ( 量 → 量 ) CJK COMPATIBILITY IDEOGRAPH-F97E → CJK UNIFIED IDEOGRAPH-91CF       # 
+
+F90A ; 91D1 ;  ML      # ( 金 → 金 ) CJK COMPATIBILITY IDEOGRAPH-F90A → CJK UNIFIED IDEOGRAPH-91D1       # 
+2FA6 ; 91D1 ;  ML      #* ( ⾦ → 金 ) KANGXI RADICAL GOLD → CJK UNIFIED IDEOGRAPH-91D1   # 
+
+F9B1 ; 9234 ;  ML      # ( 鈴 → 鈴 ) CJK COMPATIBILITY IDEOGRAPH-F9B1 → CJK UNIFIED IDEOGRAPH-9234       # 
+
+2F9E7 ;        9238 ;  ML      # ( 鈸 → 鈸 ) CJK COMPATIBILITY IDEOGRAPH-2F9E7 → CJK UNIFIED IDEOGRAPH-9238     # 
+
+FAC5 ; 9276 ;  ML      # ( 鉶 → 鉶 ) CJK COMPATIBILITY IDEOGRAPH-FAC5 → CJK UNIFIED IDEOGRAPH-9276       # 
+
+2F9EA ;        927C ;  ML      # ( 鉼 → 鉼 ) CJK COMPATIBILITY IDEOGRAPH-2F9EA → CJK UNIFIED IDEOGRAPH-927C     # 
+
+2F9E8 ;        92D7 ;  ML      # ( 鋗 → 鋗 ) CJK COMPATIBILITY IDEOGRAPH-2F9E8 → CJK UNIFIED IDEOGRAPH-92D7     # 
+
+2F9E9 ;        92D8 ;  ML      # ( 鋘 → 鋘 ) CJK COMPATIBILITY IDEOGRAPH-2F9E9 → CJK UNIFIED IDEOGRAPH-92D8     # 
+
+F93F ; 9304 ;  ML      # ( 錄 → 錄 ) CJK COMPATIBILITY IDEOGRAPH-F93F → CJK UNIFIED IDEOGRAPH-9304       # 
+
+F99B ; 934A ;  ML      # ( 鍊 → 鍊 ) CJK COMPATIBILITY IDEOGRAPH-F99B → CJK UNIFIED IDEOGRAPH-934A       # 
+
+93AE ; 93AD ;  ML      # ( 鎮 → 鎭 ) CJK UNIFIED IDEOGRAPH-93AE → CJK UNIFIED IDEOGRAPH-93AD     # 
+
+2F9EB ;        93F9 ;  ML      # ( 鏹 → 鏹 ) CJK COMPATIBILITY IDEOGRAPH-2F9EB → CJK UNIFIED IDEOGRAPH-93F9     # 
+
+2F9EC ;        9415 ;  ML      # ( 鐕 → 鐕 ) CJK COMPATIBILITY IDEOGRAPH-2F9EC → CJK UNIFIED IDEOGRAPH-9415     # 
+
+2ED0 ; 9485 ;  ML      #* ( ⻐ → 钅 ) CJK RADICAL C-SIMPLIFIED GOLD → CJK UNIFIED IDEOGRAPH-9485 # 
+
+2ED1 ; 9577 ;  ML      #* ( ⻑ → 長 ) CJK RADICAL LONG ONE → CJK UNIFIED IDEOGRAPH-9577  # 
+2FA7 ; 9577 ;  ML      #* ( ⾧ → 長 ) KANGXI RADICAL LONG → CJK UNIFIED IDEOGRAPH-9577   # 
+
+2ED2 ; 9578 ;  ML      #* ( ⻒ → 镸 ) CJK RADICAL LONG TWO → CJK UNIFIED IDEOGRAPH-9578  # 
+
+2ED3 ; 957F ;  ML      #* ( ⻓ → 长 ) CJK RADICAL C-SIMPLIFIED LONG → CJK UNIFIED IDEOGRAPH-957F # 
+
+2FA8 ; 9580 ;  ML      #* ( ⾨ → 門 ) KANGXI RADICAL GATE → CJK UNIFIED IDEOGRAPH-9580   # 
+
+2F9EE ;        958B ;  ML      # ( 開 → 開 ) CJK COMPATIBILITY IDEOGRAPH-2F9EE → CJK UNIFIED IDEOGRAPH-958B     # 
+
+F986 ; 95AD ;  ML      # ( 閭 → 閭 ) CJK COMPATIBILITY IDEOGRAPH-F986 → CJK UNIFIED IDEOGRAPH-95AD       # 
+
+2F9F0 ;        95B7 ;  ML      # ( 閷 → 閷 ) CJK COMPATIBILITY IDEOGRAPH-2F9F0 → CJK UNIFIED IDEOGRAPH-95B7     # 
+
+2ED4 ; 95E8 ;  ML      #* ( ⻔ → 门 ) CJK RADICAL C-SIMPLIFIED GATE → CJK UNIFIED IDEOGRAPH-95E8 # 
+
+2FA9 ; 961C ;  ML      #* ( ⾩ → 阜 ) KANGXI RADICAL MOUND → CJK UNIFIED IDEOGRAPH-961C  # 
+
+2ECF ; 961D ;  ML      #* ( ⻏ → 阝 ) CJK RADICAL CITY → CJK UNIFIED IDEOGRAPH-961D      # 
+2ED6 ; 961D ;  ML      #* ( ⻖ → 阝 ) CJK RADICAL MOUND TWO → CJK UNIFIED IDEOGRAPH-961D # 
+
+F9C6 ; 962E ;  ML      # ( 阮 → 阮 ) CJK COMPATIBILITY IDEOGRAPH-F9C6 → CJK UNIFIED IDEOGRAPH-962E       # 
+
+F951 ; 964B ;  ML      # ( 陋 → 陋 ) CJK COMPATIBILITY IDEOGRAPH-F951 → CJK UNIFIED IDEOGRAPH-964B       # 
+
+FA09 ; 964D ;  ML      # ( 降 → 降 ) CJK COMPATIBILITY IDEOGRAPH-FA09 → CJK UNIFIED IDEOGRAPH-964D       # 
+
+F959 ; 9675 ;  ML      # ( 陵 → 陵 ) CJK COMPATIBILITY IDEOGRAPH-F959 → CJK UNIFIED IDEOGRAPH-9675       # 
+
+F9D3 ; 9678 ;  ML      # ( 陸 → 陸 ) CJK COMPATIBILITY IDEOGRAPH-F9D3 → CJK UNIFIED IDEOGRAPH-9678       # 
+
+FAC6 ; 967C ;  ML      # ( 陼 → 陼 ) CJK COMPATIBILITY IDEOGRAPH-FAC6 → CJK UNIFIED IDEOGRAPH-967C       # 
+
+F9DC ; 9686 ;  ML      # ( 隆 → 隆 ) CJK COMPATIBILITY IDEOGRAPH-F9DC → CJK UNIFIED IDEOGRAPH-9686       # 
+
+F9F1 ; 96A3 ;  ML      # ( 隣 → 隣 ) CJK COMPATIBILITY IDEOGRAPH-F9F1 → CJK UNIFIED IDEOGRAPH-96A3       # 
+
+2FAA ; 96B6 ;  ML      #* ( ⾪ → 隶 ) KANGXI RADICAL SLAVE → CJK UNIFIED IDEOGRAPH-96B6  # 
+
+96B8 ; 96B7 ;  ML      # ( 隸 → 隷 ) CJK UNIFIED IDEOGRAPH-96B8 → CJK UNIFIED IDEOGRAPH-96B7     # →隸→
+F9B8 ; 96B7 ;  ML      # ( 隸 → 隷 ) CJK COMPATIBILITY IDEOGRAPH-F9B8 → CJK UNIFIED IDEOGRAPH-96B7       # 
+
+2FAB ; 96B9 ;  ML      #* ( ⾫ → 隹 ) KANGXI RADICAL SHORT TAILED BIRD → CJK UNIFIED IDEOGRAPH-96B9      # 
+
+2F9F3 ;        96C3 ;  ML      # ( 雃 → 雃 ) CJK COMPATIBILITY IDEOGRAPH-2F9F3 → CJK UNIFIED IDEOGRAPH-96C3     # 
+
+F9EA ; 96E2 ;  ML      # ( 離 → 離 ) CJK COMPATIBILITY IDEOGRAPH-F9EA → CJK UNIFIED IDEOGRAPH-96E2       # 
+
+FA68 ; 96E3 ;  ML      # ( 難 → 難 ) CJK COMPATIBILITY IDEOGRAPH-FA68 → CJK UNIFIED IDEOGRAPH-96E3       # 
+FAC7 ; 96E3 ;  ML      # ( 難 → 難 ) CJK COMPATIBILITY IDEOGRAPH-FAC7 → CJK UNIFIED IDEOGRAPH-96E3       # 
+
+2FAC ; 96E8 ;  ML      #* ( ⾬ → 雨 ) KANGXI RADICAL RAIN → CJK UNIFIED IDEOGRAPH-96E8   # 
+
+F9B2 ; 96F6 ;  ML      # ( 零 → 零 ) CJK COMPATIBILITY IDEOGRAPH-F9B2 → CJK UNIFIED IDEOGRAPH-96F6       # 
+
+F949 ; 96F7 ;  ML      # ( 雷 → 雷 ) CJK COMPATIBILITY IDEOGRAPH-F949 → CJK UNIFIED IDEOGRAPH-96F7       # 
+
+2F9F5 ;        9723 ;  ML      # ( 霣 → 霣 ) CJK COMPATIBILITY IDEOGRAPH-2F9F5 → CJK UNIFIED IDEOGRAPH-9723     # 
+
+F938 ; 9732 ;  ML      # ( 露 → 露 ) CJK COMPATIBILITY IDEOGRAPH-F938 → CJK UNIFIED IDEOGRAPH-9732       # 
+
+F9B3 ; 9748 ;  ML      # ( 靈 → 靈 ) CJK COMPATIBILITY IDEOGRAPH-F9B3 → CJK UNIFIED IDEOGRAPH-9748       # 
+
+2FAD ; 9751 ;  ML      #* ( ⾭ → 靑 ) KANGXI RADICAL BLUE → CJK UNIFIED IDEOGRAPH-9751   # 
+
+2ED8 ; 9752 ;  ML      #* ( ⻘ → 青 ) CJK RADICAL BLUE → CJK UNIFIED IDEOGRAPH-9752      # 
+
+FA1C ; 9756 ;  ML      # ( 靖 → 靖 ) CJK COMPATIBILITY IDEOGRAPH-FA1C → CJK UNIFIED IDEOGRAPH-9756       # 
+FAC8 ; 9756 ;  ML      # ( 靖 → 靖 ) CJK COMPATIBILITY IDEOGRAPH-FAC8 → CJK UNIFIED IDEOGRAPH-9756       # 
+
+2FAE ; 975E ;  ML      #* ( ⾮ → 非 ) KANGXI RADICAL WRONG → CJK UNIFIED IDEOGRAPH-975E  # 
+
+2FAF ; 9762 ;  ML      #* ( ⾯ → 面 ) KANGXI RADICAL FACE → CJK UNIFIED IDEOGRAPH-9762   # 
+
+2FB0 ; 9769 ;  ML      #* ( ⾰ → 革 ) KANGXI RADICAL LEATHER → CJK UNIFIED IDEOGRAPH-9769        # 
+
+2FB1 ; 97CB ;  ML      #* ( ⾱ → 韋 ) KANGXI RADICAL TANNED LEATHER → CJK UNIFIED IDEOGRAPH-97CB # 
+
+FAC9 ; 97DB ;  ML      # ( 韛 → 韛 ) CJK COMPATIBILITY IDEOGRAPH-FAC9 → CJK UNIFIED IDEOGRAPH-97DB       # 
+
+2F9FA ;        97E0 ;  ML      # ( 韠 → 韠 ) CJK COMPATIBILITY IDEOGRAPH-2F9FA → CJK UNIFIED IDEOGRAPH-97E0     # 
+
+2ED9 ; 97E6 ;  ML      #* ( ⻙ → 韦 ) CJK RADICAL C-SIMPLIFIED TANNED LEATHER → CJK UNIFIED IDEOGRAPH-97E6       # 
+
+2FB2 ; 97ED ;  ML      #* ( ⾲ → 韭 ) KANGXI RADICAL LEEK → CJK UNIFIED IDEOGRAPH-97ED   # 
+
+2FB3 ; 97F3 ;  ML      #* ( ⾳ → 音 ) KANGXI RADICAL SOUND → CJK UNIFIED IDEOGRAPH-97F3  # 
+
+FA69 ; 97FF ;  ML      # ( 響 → 響 ) CJK COMPATIBILITY IDEOGRAPH-FA69 → CJK UNIFIED IDEOGRAPH-97FF       # 
+FACA ; 97FF ;  ML      # ( 響 → 響 ) CJK COMPATIBILITY IDEOGRAPH-FACA → CJK UNIFIED IDEOGRAPH-97FF       # 
+
+2FB4 ; 9801 ;  ML      #* ( ⾴ → 頁 ) KANGXI RADICAL LEAF → CJK UNIFIED IDEOGRAPH-9801   # 
+
+FACB ; 980B ;  ML      # ( 頋 → 頋 ) CJK COMPATIBILITY IDEOGRAPH-FACB → CJK UNIFIED IDEOGRAPH-980B       # 
+2F9FE ;        980B ;  ML      # ( 頋 → 頋 ) CJK COMPATIBILITY IDEOGRAPH-2F9FE → CJK UNIFIED IDEOGRAPH-980B     # 
+2F9FF ;        980B ;  ML      # ( 頋 → 頋 ) CJK COMPATIBILITY IDEOGRAPH-2F9FF → CJK UNIFIED IDEOGRAPH-980B     # 
+
+F9B4 ; 9818 ;  ML      # ( 領 → 領 ) CJK COMPATIBILITY IDEOGRAPH-F9B4 → CJK UNIFIED IDEOGRAPH-9818       # 
+
+2FA00 ;        9829 ;  ML      # ( 頩 → 頩 ) CJK COMPATIBILITY IDEOGRAPH-2FA00 → CJK UNIFIED IDEOGRAPH-9829     # 
+
+FA6A ; 983B ;  ML      # ( 頻 → 頻 ) CJK COMPATIBILITY IDEOGRAPH-FA6A → CJK UNIFIED IDEOGRAPH-983B       # 
+FACC ; 983B ;  ML      # ( 頻 → 頻 ) CJK COMPATIBILITY IDEOGRAPH-FACC → CJK UNIFIED IDEOGRAPH-983B       # 
+
+F9D0 ; 985E ;  ML      # ( 類 → 類 ) CJK COMPATIBILITY IDEOGRAPH-F9D0 → CJK UNIFIED IDEOGRAPH-985E       # 
+
+2EDA ; 9875 ;  ML      #* ( ⻚ → 页 ) CJK RADICAL C-SIMPLIFIED LEAF → CJK UNIFIED IDEOGRAPH-9875 # 
+
+2FB5 ; 98A8 ;  ML      #* ( ⾵ → 風 ) KANGXI RADICAL WIND → CJK UNIFIED IDEOGRAPH-98A8   # 
+
+2EDB ; 98CE ;  ML      #* ( ⻛ → 风 ) CJK RADICAL C-SIMPLIFIED WIND → CJK UNIFIED IDEOGRAPH-98CE # 
+
+2FB6 ; 98DB ;  ML      #* ( ⾶ → 飛 ) KANGXI RADICAL FLY → CJK UNIFIED IDEOGRAPH-98DB    # 
+
+2EDC ; 98DE ;  ML      #* ( ⻜ → 飞 ) CJK RADICAL C-SIMPLIFIED FLY → CJK UNIFIED IDEOGRAPH-98DE  # 
+
+2EDD ; 98DF ;  ML      #* ( ⻝ → 食 ) CJK RADICAL EAT ONE → CJK UNIFIED IDEOGRAPH-98DF   # 
+2FB7 ; 98DF ;  ML      #* ( ⾷ → 食 ) KANGXI RADICAL EAT → CJK UNIFIED IDEOGRAPH-98DF    # 
+
+2EDF ; 98E0 ;  ML      #* ( ⻟ → 飠 ) CJK RADICAL EAT THREE → CJK UNIFIED IDEOGRAPH-98E0 # 
+
+2FA02 ;        98E2 ;  ML      # ( 飢 → 飢 ) CJK COMPATIBILITY IDEOGRAPH-2FA02 → CJK UNIFIED IDEOGRAPH-98E2     # 
+
+FA2A ; 98EF ;  ML      # ( 飯 → 飯 ) CJK COMPATIBILITY IDEOGRAPH-FA2A → CJK UNIFIED IDEOGRAPH-98EF       # 
+
+FA2B ; 98FC ;  ML      # ( 飼 → 飼 ) CJK COMPATIBILITY IDEOGRAPH-FA2B → CJK UNIFIED IDEOGRAPH-98FC       # 
+
+FA2C ; 9928 ;  ML      # ( 館 → 館 ) CJK COMPATIBILITY IDEOGRAPH-FA2C → CJK UNIFIED IDEOGRAPH-9928       # 
+
+2FA04 ;        9929 ;  ML      # ( 餩 → 餩 ) CJK COMPATIBILITY IDEOGRAPH-2FA04 → CJK UNIFIED IDEOGRAPH-9929     # 
+
+2EE0 ; 9963 ;  ML      #* ( ⻠ → 饣 ) CJK RADICAL C-SIMPLIFIED EAT → CJK UNIFIED IDEOGRAPH-9963  # 
+
+2FB8 ; 9996 ;  ML      #* ( ⾸ → 首 ) KANGXI RADICAL HEAD → CJK UNIFIED IDEOGRAPH-9996   # 
+
+2FB9 ; 9999 ;  ML      #* ( ⾹ → 香 ) KANGXI RADICAL FRAGRANT → CJK UNIFIED IDEOGRAPH-9999       # 
+
+2FA05 ;        99A7 ;  ML      # ( 馧 → 馧 ) CJK COMPATIBILITY IDEOGRAPH-2FA05 → CJK UNIFIED IDEOGRAPH-99A7     # 
+
+2FBA ; 99AC ;  ML      #* ( ⾺ → 馬 ) KANGXI RADICAL HORSE → CJK UNIFIED IDEOGRAPH-99AC  # 
+
+2FA06 ;        99C2 ;  ML      # ( 駂 → 駂 ) CJK COMPATIBILITY IDEOGRAPH-2FA06 → CJK UNIFIED IDEOGRAPH-99C2     # 
+
+F91A ; 99F1 ;  ML      # ( 駱 → 駱 ) CJK COMPATIBILITY IDEOGRAPH-F91A → CJK UNIFIED IDEOGRAPH-99F1       # 
+
+2FA07 ;        99FE ;  ML      # ( 駾 → 駾 ) CJK COMPATIBILITY IDEOGRAPH-2FA07 → CJK UNIFIED IDEOGRAPH-99FE     # 
+
+F987 ; 9A6A ;  ML      # ( 驪 → 驪 ) CJK COMPATIBILITY IDEOGRAPH-F987 → CJK UNIFIED IDEOGRAPH-9A6A       # 
+
+2EE2 ; 9A6C ;  ML      #* ( ⻢ → 马 ) CJK RADICAL C-SIMPLIFIED HORSE → CJK UNIFIED IDEOGRAPH-9A6C        # 
+
+2FBB ; 9AA8 ;  ML      #* ( ⾻ → 骨 ) KANGXI RADICAL BONE → CJK UNIFIED IDEOGRAPH-9AA8   # 
+
+2FBC ; 9AD8 ;  ML      #* ( ⾼ → 高 ) KANGXI RADICAL TALL → CJK UNIFIED IDEOGRAPH-9AD8   # 
+
+2FBD ; 9ADF ;  ML      #* ( ⾽ → 髟 ) KANGXI RADICAL HAIR → CJK UNIFIED IDEOGRAPH-9ADF   # 
+
+FACD ; 9B12 ;  ML      # ( 鬒 → 鬒 ) CJK COMPATIBILITY IDEOGRAPH-FACD → CJK UNIFIED IDEOGRAPH-9B12       # 
+2FA0A ;        9B12 ;  ML      # ( 鬒 → 鬒 ) CJK COMPATIBILITY IDEOGRAPH-2FA0A → CJK UNIFIED IDEOGRAPH-9B12     # 
+
+2FBE ; 9B25 ;  ML      #* ( ⾾ → 鬥 ) KANGXI RADICAL FIGHT → CJK UNIFIED IDEOGRAPH-9B25  # 
+
+2FBF ; 9B2F ;  ML      #* ( ⾿ → 鬯 ) KANGXI RADICAL SACRIFICIAL WINE → CJK UNIFIED IDEOGRAPH-9B2F       # 
+
+2FC0 ; 9B32 ;  ML      #* ( ⿀ → 鬲 ) KANGXI RADICAL CAULDRON → CJK UNIFIED IDEOGRAPH-9B32       # 
+
+2FC1 ; 9B3C ;  ML      #* ( ⿁ → 鬼 ) KANGXI RADICAL GHOST → CJK UNIFIED IDEOGRAPH-9B3C  # 
+2EE4 ; 9B3C ;  ML      #* ( ⻤ → 鬼 ) CJK RADICAL GHOST → CJK UNIFIED IDEOGRAPH-9B3C     # 
+
+2FC2 ; 9B5A ;  ML      #* ( ⿂ → 魚 ) KANGXI RADICAL FISH → CJK UNIFIED IDEOGRAPH-9B5A   # 
+
+F939 ; 9B6F ;  ML      # ( 魯 → 魯 ) CJK COMPATIBILITY IDEOGRAPH-F939 → CJK UNIFIED IDEOGRAPH-9B6F       # 
+
+2FA0B ;        9C40 ;  ML      # ( 鱀 → 鱀 ) CJK COMPATIBILITY IDEOGRAPH-2FA0B → CJK UNIFIED IDEOGRAPH-9C40     # 
+
+F9F2 ; 9C57 ;  ML      # ( 鱗 → 鱗 ) CJK COMPATIBILITY IDEOGRAPH-F9F2 → CJK UNIFIED IDEOGRAPH-9C57       # 
+
+2EE5 ; 9C7C ;  ML      #* ( ⻥ → 鱼 ) CJK RADICAL C-SIMPLIFIED FISH → CJK UNIFIED IDEOGRAPH-9C7C # 
+
+2FC3 ; 9CE5 ;  ML      #* ( ⿃ → 鳥 ) KANGXI RADICAL BIRD → CJK UNIFIED IDEOGRAPH-9CE5   # 
+
+2FA0C ;        9CFD ;  ML      # ( 鳽 → 鳽 ) CJK COMPATIBILITY IDEOGRAPH-2FA0C → CJK UNIFIED IDEOGRAPH-9CFD     # 
+
+2FA0F ;        9D67 ;  ML      # ( 鵧 → 鵧 ) CJK COMPATIBILITY IDEOGRAPH-2FA0F → CJK UNIFIED IDEOGRAPH-9D67     # 
+
+FA2D ; 9DB4 ;  ML      # ( 鶴 → 鶴 ) CJK COMPATIBILITY IDEOGRAPH-FA2D → CJK UNIFIED IDEOGRAPH-9DB4       # 
+
+F93A ; 9DFA ;  ML      # ( 鷺 → 鷺 ) CJK COMPATIBILITY IDEOGRAPH-F93A → CJK UNIFIED IDEOGRAPH-9DFA       # 
+
+F920 ; 9E1E ;  ML      # ( 鸞 → 鸞 ) CJK COMPATIBILITY IDEOGRAPH-F920 → CJK UNIFIED IDEOGRAPH-9E1E       # 
+
+9E43 ; 9E42 ;  ML      # ( 鹃 → 鹂 ) CJK UNIFIED IDEOGRAPH-9E43 → CJK UNIFIED IDEOGRAPH-9E42     # 
+
+2FC4 ; 9E75 ;  ML      #* ( ⿄ → 鹵 ) KANGXI RADICAL SALT → CJK UNIFIED IDEOGRAPH-9E75   # 
+
+F940 ; 9E7F ;  ML      # ( 鹿 → 鹿 ) CJK COMPATIBILITY IDEOGRAPH-F940 → CJK UNIFIED IDEOGRAPH-9E7F       # 
+2FC5 ; 9E7F ;  ML      #* ( ⿅ → 鹿 ) KANGXI RADICAL DEER → CJK UNIFIED IDEOGRAPH-9E7F   # 
+
+F988 ; 9E97 ;  ML      # ( 麗 → 麗 ) CJK COMPATIBILITY IDEOGRAPH-F988 → CJK UNIFIED IDEOGRAPH-9E97       # 
+
+F9F3 ; 9E9F ;  ML      # ( 麟 → 麟 ) CJK COMPATIBILITY IDEOGRAPH-F9F3 → CJK UNIFIED IDEOGRAPH-9E9F       # 
+
+2FC6 ; 9EA5 ;  ML      #* ( ⿆ → 麥 ) KANGXI RADICAL WHEAT → CJK UNIFIED IDEOGRAPH-9EA5  # 
+
+2EE8 ; 9EA6 ;  ML      #* ( ⻨ → 麦 ) CJK RADICAL SIMPLIFIED WHEAT → CJK UNIFIED IDEOGRAPH-9EA6  # 
+
+2FA15 ;        9EBB ;  ML      # ( 麻 → 麻 ) CJK COMPATIBILITY IDEOGRAPH-2FA15 → CJK UNIFIED IDEOGRAPH-9EBB     # 
+2FC7 ; 9EBB ;  ML      #* ( ⿇ → 麻 ) KANGXI RADICAL HEMP → CJK UNIFIED IDEOGRAPH-9EBB   # 
+
+2FC8 ; 9EC3 ;  ML      #* ( ⿈ → 黃 ) KANGXI RADICAL YELLOW → CJK UNIFIED IDEOGRAPH-9EC3 # 
+
+2EE9 ; 9EC4 ;  ML      #* ( ⻩ → 黄 ) CJK RADICAL SIMPLIFIED YELLOW → CJK UNIFIED IDEOGRAPH-9EC4 # 
+
+2FC9 ; 9ECD ;  ML      #* ( ⿉ → 黍 ) KANGXI RADICAL MILLET → CJK UNIFIED IDEOGRAPH-9ECD # 
+
+F989 ; 9ECE ;  ML      # ( 黎 → 黎 ) CJK COMPATIBILITY IDEOGRAPH-F989 → CJK UNIFIED IDEOGRAPH-9ECE       # 
+
+2FCA ; 9ED1 ;  ML      #* ( ⿊ → 黑 ) KANGXI RADICAL BLACK → CJK UNIFIED IDEOGRAPH-9ED1  # 
+9ED2 ; 9ED1 ;  ML      # ( 黒 → 黑 ) CJK UNIFIED IDEOGRAPH-9ED2 → CJK UNIFIED IDEOGRAPH-9ED1     # →⿊→
+
+2FA17 ;        9EF9 ;  ML      # ( 黹 → 黹 ) CJK COMPATIBILITY IDEOGRAPH-2FA17 → CJK UNIFIED IDEOGRAPH-9EF9     # 
+2FCB ; 9EF9 ;  ML      #* ( ⿋ → 黹 ) KANGXI RADICAL EMBROIDERY → CJK UNIFIED IDEOGRAPH-9EF9     # 
+
+2FCC ; 9EFD ;  ML      #* ( ⿌ → 黽 ) KANGXI RADICAL FROG → CJK UNIFIED IDEOGRAPH-9EFD   # 
+
+2FA18 ;        9EFE ;  ML      # ( 黾 → 黾 ) CJK COMPATIBILITY IDEOGRAPH-2FA18 → CJK UNIFIED IDEOGRAPH-9EFE     # 
+
+2FA19 ;        9F05 ;  ML      # ( 鼅 → 鼅 ) CJK COMPATIBILITY IDEOGRAPH-2FA19 → CJK UNIFIED IDEOGRAPH-9F05     # 
+
+2FCD ; 9F0E ;  ML      #* ( ⿍ → 鼎 ) KANGXI RADICAL TRIPOD → CJK UNIFIED IDEOGRAPH-9F0E # 
+
+2FA1A ;        9F0F ;  ML      # ( 鼏 → 鼏 ) CJK COMPATIBILITY IDEOGRAPH-2FA1A → CJK UNIFIED IDEOGRAPH-9F0F     # 
+
+2FCE ; 9F13 ;  ML      #* ( ⿎ → 鼓 ) KANGXI RADICAL DRUM → CJK UNIFIED IDEOGRAPH-9F13   # 
+
+2FA1B ;        9F16 ;  ML      # ( 鼖 → 鼖 ) CJK COMPATIBILITY IDEOGRAPH-2FA1B → CJK UNIFIED IDEOGRAPH-9F16     # 
+
+2FCF ; 9F20 ;  ML      #* ( ⿏ → 鼠 ) KANGXI RADICAL RAT → CJK UNIFIED IDEOGRAPH-9F20    # 
+
+2FA1C ;        9F3B ;  ML      # ( 鼻 → 鼻 ) CJK COMPATIBILITY IDEOGRAPH-2FA1C → CJK UNIFIED IDEOGRAPH-9F3B     # 
+2FD0 ; 9F3B ;  ML      #* ( ⿐ → 鼻 ) KANGXI RADICAL NOSE → CJK UNIFIED IDEOGRAPH-9F3B   # 
+
+FAD8 ; 9F43 ;  ML      # ( 齃 → 齃 ) CJK COMPATIBILITY IDEOGRAPH-FAD8 → CJK UNIFIED IDEOGRAPH-9F43       # 
+
+2FD1 ; 9F4A ;  ML      #* ( ⿑ → 齊 ) KANGXI RADICAL EVEN → CJK UNIFIED IDEOGRAPH-9F4A   # 
+
+2EEC ; 9F50 ;  ML      #* ( ⻬ → 齐 ) CJK RADICAL C-SIMPLIFIED EVEN → CJK UNIFIED IDEOGRAPH-9F50 # 
+
+2FD2 ; 9F52 ;  ML      #* ( ⿒ → 齒 ) KANGXI RADICAL TOOTH → CJK UNIFIED IDEOGRAPH-9F52  # 
+
+2EEE ; 9F7F ;  ML      #* ( ⻮ → 齿 ) CJK RADICAL C-SIMPLIFIED TOOTH → CJK UNIFIED IDEOGRAPH-9F7F        # 
+
+F9C4 ; 9F8D ;  ML      # ( 龍 → 龍 ) CJK COMPATIBILITY IDEOGRAPH-F9C4 → CJK UNIFIED IDEOGRAPH-9F8D       # 
+2FD3 ; 9F8D ;  ML      #* ( ⿓ → 龍 ) KANGXI RADICAL DRAGON → CJK UNIFIED IDEOGRAPH-9F8D # 
+
+FAD9 ; 9F8E ;  ML      # ( 龎 → 龎 ) CJK COMPATIBILITY IDEOGRAPH-FAD9 → CJK UNIFIED IDEOGRAPH-9F8E       # 
+
+2EF0 ; 9F99 ;  ML      #* ( ⻰ → 龙 ) CJK RADICAL C-SIMPLIFIED DRAGON → CJK UNIFIED IDEOGRAPH-9F99       # 
+
+F907 ; 9F9C ;  ML      # ( 龜 → 龜 ) CJK COMPATIBILITY IDEOGRAPH-F907 → CJK UNIFIED IDEOGRAPH-9F9C       # 
+F908 ; 9F9C ;  ML      # ( 龜 → 龜 ) CJK COMPATIBILITY IDEOGRAPH-F908 → CJK UNIFIED IDEOGRAPH-9F9C       # 
+FACE ; 9F9C ;  ML      # ( 龜 → 龜 ) CJK COMPATIBILITY IDEOGRAPH-FACE → CJK UNIFIED IDEOGRAPH-9F9C       # 
+2FD4 ; 9F9C ;  ML      #* ( ⿔ → 龜 ) KANGXI RADICAL TURTLE → CJK UNIFIED IDEOGRAPH-9F9C # 
+
+2EF3 ; 9F9F ;  ML      #* ( ⻳ → 龟 ) CJK RADICAL C-SIMPLIFIED TURTLE → CJK UNIFIED IDEOGRAPH-9F9F       # 
+
+2FD5 ; 9FA0 ;  ML      #* ( ⿕ → 龠 ) KANGXI RADICAL FLUTE → CJK UNIFIED IDEOGRAPH-9FA0  # 
+
+2F80C ;        349E ;  ML      # ( 㒞 → 㒞 ) CJK COMPATIBILITY IDEOGRAPH-2F80C → CJK UNIFIED IDEOGRAPH-349E     # 
+
+2F813 ;        34B9 ;  ML      # ( 㒹 → 㒹 ) CJK COMPATIBILITY IDEOGRAPH-2F813 → CJK UNIFIED IDEOGRAPH-34B9     # 
+
+2F9CA ;        34BB ;  ML      # ( 㒻 → 㒻 ) CJK COMPATIBILITY IDEOGRAPH-2F9CA → CJK UNIFIED IDEOGRAPH-34BB     # 
+
+2F81F ;        34DF ;  ML      # ( 㓟 → 㓟 ) CJK COMPATIBILITY IDEOGRAPH-2F81F → CJK UNIFIED IDEOGRAPH-34DF     # 
+
+2F824 ;        3515 ;  ML      # ( 㔕 → 㔕 ) CJK COMPATIBILITY IDEOGRAPH-2F824 → CJK UNIFIED IDEOGRAPH-3515     # 
+
+2E8B ; 353E ;  ML      #* ( ⺋ → 㔾 ) CJK RADICAL SEAL → CJK UNIFIED IDEOGRAPH-353E      # 
+
+439B ; 3588 ;  ML      # ( 䎛 → 㖈 ) CJK UNIFIED IDEOGRAPH-439B → CJK UNIFIED IDEOGRAPH-3588     # 
+
+39B3 ; 363D ;  ML      # ( 㦳 → 㘽 ) CJK UNIFIED IDEOGRAPH-39B3 → CJK UNIFIED IDEOGRAPH-363D     # 
+
+2F867 ;        36EE ;  ML      # ( 㛮 → 㛮 ) CJK COMPATIBILITY IDEOGRAPH-2F867 → CJK UNIFIED IDEOGRAPH-36EE     # 
+
+2F868 ;        36FC ;  ML      # ( 㛼 → 㛼 ) CJK COMPATIBILITY IDEOGRAPH-2F868 → CJK UNIFIED IDEOGRAPH-36FC     # 
+
+2F876 ;        3781 ;  ML      # ( 㞁 → 㞁 ) CJK COMPATIBILITY IDEOGRAPH-2F876 → CJK UNIFIED IDEOGRAPH-3781     # 
+
+2F883 ;        382F ;  ML      # ( 㠯 → 㠯 ) CJK COMPATIBILITY IDEOGRAPH-2F883 → CJK UNIFIED IDEOGRAPH-382F     # 
+
+2F888 ;        3862 ;  ML      # ( 㡢 → 㡢 ) CJK COMPATIBILITY IDEOGRAPH-2F888 → CJK UNIFIED IDEOGRAPH-3862     # 
+
+2F88A ;        387C ;  ML      # ( 㡼 → 㡼 ) CJK COMPATIBILITY IDEOGRAPH-2F88A → CJK UNIFIED IDEOGRAPH-387C     # 
+
+2F896 ;        38C7 ;  ML      # ( 㣇 → 㣇 ) CJK COMPATIBILITY IDEOGRAPH-2F896 → CJK UNIFIED IDEOGRAPH-38C7     # 
+
+2F89B ;        38E3 ;  ML      # ( 㣣 → 㣣 ) CJK COMPATIBILITY IDEOGRAPH-2F89B → CJK UNIFIED IDEOGRAPH-38E3     # 
+
+2E97 ; 38FA ;  ML      #* ( ⺗ → 㣺 ) CJK RADICAL HEART TWO → CJK UNIFIED IDEOGRAPH-38FA # 
+
+2F8A2 ;        391C ;  ML      # ( 㤜 → 㤜 ) CJK COMPATIBILITY IDEOGRAPH-2F8A2 → CJK UNIFIED IDEOGRAPH-391C     # 
+
+2F8A1 ;        393A ;  ML      # ( 㤺 → 㤺 ) CJK COMPATIBILITY IDEOGRAPH-2F8A1 → CJK UNIFIED IDEOGRAPH-393A     # 
+
+2F8C2 ;        3A2E ;  ML      # ( 㨮 → 㨮 ) CJK COMPATIBILITY IDEOGRAPH-2F8C2 → CJK UNIFIED IDEOGRAPH-3A2E     # 
+
+6409 ; 3A41 ;  ML      # ( 搉 → 㩁 ) CJK UNIFIED IDEOGRAPH-6409 → CJK UNIFIED IDEOGRAPH-3A41     # 
+
+2F8C7 ;        3A6C ;  ML      # ( 㩬 → 㩬 ) CJK COMPATIBILITY IDEOGRAPH-2F8C7 → CJK UNIFIED IDEOGRAPH-3A6C     # 
+
+66F6 ; 3ADA ;  ML      # ( 曶 → 㫚 ) CJK UNIFIED IDEOGRAPH-66F6 → CJK UNIFIED IDEOGRAPH-3ADA     # 
+
+2F8D1 ;        3AE4 ;  ML      # ( 㫤 → 㫤 ) CJK COMPATIBILITY IDEOGRAPH-2F8D1 → CJK UNIFIED IDEOGRAPH-3AE4     # 
+
+2F8D0 ;        3B08 ;  ML      # ( 㬈 → 㬈 ) CJK COMPATIBILITY IDEOGRAPH-2F8D0 → CJK UNIFIED IDEOGRAPH-3B08     # 
+
+2F8CE ;        3B19 ;  ML      # ( 㬙 → 㬙 ) CJK COMPATIBILITY IDEOGRAPH-2F8CE → CJK UNIFIED IDEOGRAPH-3B19     # 
+
+80F6 ; 3B35 ;  ML      # ( 胶 → 㬵 ) CJK UNIFIED IDEOGRAPH-80F6 → CJK UNIFIED IDEOGRAPH-3B35     # 
+
+5E50 ; 3B3A ;  ML      # ( 幐 → 㬺 ) CJK UNIFIED IDEOGRAPH-5E50 → CJK UNIFIED IDEOGRAPH-3B3A     # 
+
+4420 ; 3B3B ;  ML      # ( 䐠 → 㬻 ) CJK UNIFIED IDEOGRAPH-4420 → CJK UNIFIED IDEOGRAPH-3B3B     # 
+
+2F8DE ;        3B49 ;  ML      # ( 㭉 → 㭉 ) CJK COMPATIBILITY IDEOGRAPH-2F8DE → CJK UNIFIED IDEOGRAPH-3B49     # 
+
+FAD2 ; 3B9D ;  ML      # ( 㮝 → 㮝 ) CJK COMPATIBILITY IDEOGRAPH-FAD2 → CJK UNIFIED IDEOGRAPH-3B9D       # 
+2F8E7 ;        3B9D ;  ML      # ( 㮝 → 㮝 ) CJK COMPATIBILITY IDEOGRAPH-2F8E7 → CJK UNIFIED IDEOGRAPH-3B9D     # 
+
+69E9 ; 3BA3 ;  ML      # ( 槩 → 㮣 ) CJK UNIFIED IDEOGRAPH-69E9 → CJK UNIFIED IDEOGRAPH-3BA3     # 
+
+2F8EE ;        3C18 ;  ML      # ( 㰘 → 㰘 ) CJK COMPATIBILITY IDEOGRAPH-2F8EE → CJK UNIFIED IDEOGRAPH-3C18     # 
+
+2F8F2 ;        3C4E ;  ML      # ( 㱎 → 㱎 ) CJK COMPATIBILITY IDEOGRAPH-2F8F2 → CJK UNIFIED IDEOGRAPH-3C4E     # 
+
+2F90A ;        3D33 ;  ML      # ( 㴳 → 㴳 ) CJK COMPATIBILITY IDEOGRAPH-2F90A → CJK UNIFIED IDEOGRAPH-3D33     # 
+
+2F916 ;        3D96 ;  ML      # ( 㶖 → 㶖 ) CJK COMPATIBILITY IDEOGRAPH-2F916 → CJK UNIFIED IDEOGRAPH-3D96     # 
+
+2F92A ;        3EAC ;  ML      # ( 㺬 → 㺬 ) CJK COMPATIBILITY IDEOGRAPH-2F92A → CJK UNIFIED IDEOGRAPH-3EAC     # 
+
+2F92C ;        3EB8 ;  ML      # ( 㺸 → 㺸 ) CJK COMPATIBILITY IDEOGRAPH-2F92C → CJK UNIFIED IDEOGRAPH-3EB8     # 
+2F92D ;        3EB8 ;  ML      # ( 㺸 → 㺸 ) CJK COMPATIBILITY IDEOGRAPH-2F92D → CJK UNIFIED IDEOGRAPH-3EB8     # 
+
+2F933 ;        3F1B ;  ML      # ( 㼛 → 㼛 ) CJK COMPATIBILITY IDEOGRAPH-2F933 → CJK UNIFIED IDEOGRAPH-3F1B     # 
+
+2F93E ;        3FFC ;  ML      # ( 㿼 → 㿼 ) CJK COMPATIBILITY IDEOGRAPH-2F93E → CJK UNIFIED IDEOGRAPH-3FFC     # 
+
+2F93F ;        4008 ;  ML      # ( 䀈 → 䀈 ) CJK COMPATIBILITY IDEOGRAPH-2F93F → CJK UNIFIED IDEOGRAPH-4008     # 
+
+FAD3 ; 4018 ;  ML      # ( 䀘 → 䀘 ) CJK COMPATIBILITY IDEOGRAPH-FAD3 → CJK UNIFIED IDEOGRAPH-4018       # 
+
+9FC3 ; 4039 ;  ML      # ( 鿃 → 䀹 ) CJK UNIFIED IDEOGRAPH-9FC3 → CJK UNIFIED IDEOGRAPH-4039     # →䀹→
+FAD4 ; 4039 ;  ML      # ( 䀹 → 䀹 ) CJK COMPATIBILITY IDEOGRAPH-FAD4 → CJK UNIFIED IDEOGRAPH-4039       # 
+2F949 ;        4039 ;  ML      # ( 䀹 → 䀹 ) CJK COMPATIBILITY IDEOGRAPH-2F949 → CJK UNIFIED IDEOGRAPH-4039     # 
+
+6663 ; 403F ;  ML      # ( 晣 → 䀿 ) CJK UNIFIED IDEOGRAPH-6663 → CJK UNIFIED IDEOGRAPH-403F     # 
+
+2F94B ;        4046 ;  ML      # ( 䁆 → 䁆 ) CJK COMPATIBILITY IDEOGRAPH-2F94B → CJK UNIFIED IDEOGRAPH-4046     # 
+
+2F94C ;        4096 ;  ML      # ( 䂖 → 䂖 ) CJK COMPATIBILITY IDEOGRAPH-2F94C → CJK UNIFIED IDEOGRAPH-4096     # 
+
+2F951 ;        40E3 ;  ML      # ( 䃣 → 䃣 ) CJK COMPATIBILITY IDEOGRAPH-2F951 → CJK UNIFIED IDEOGRAPH-40E3     # 
+
+2F958 ;        412F ;  ML      # ( 䄯 → 䄯 ) CJK COMPATIBILITY IDEOGRAPH-2F958 → CJK UNIFIED IDEOGRAPH-412F     # 
+
+2F960 ;        4202 ;  ML      # ( 䈂 → 䈂 ) CJK COMPATIBILITY IDEOGRAPH-2F960 → CJK UNIFIED IDEOGRAPH-4202     # 
+
+2F964 ;        4227 ;  ML      # ( 䈧 → 䈧 ) CJK COMPATIBILITY IDEOGRAPH-2F964 → CJK UNIFIED IDEOGRAPH-4227     # 
+
+2F967 ;        42A0 ;  ML      # ( 䊠 → 䊠 ) CJK COMPATIBILITY IDEOGRAPH-2F967 → CJK UNIFIED IDEOGRAPH-42A0     # 
+
+2F96D ;        4301 ;  ML      # ( 䌁 → 䌁 ) CJK COMPATIBILITY IDEOGRAPH-2F96D → CJK UNIFIED IDEOGRAPH-4301     # 
+
+2F971 ;        4334 ;  ML      # ( 䌴 → 䌴 ) CJK COMPATIBILITY IDEOGRAPH-2F971 → CJK UNIFIED IDEOGRAPH-4334     # 
+
+2F974 ;        4359 ;  ML      # ( 䍙 → 䍙 ) CJK COMPATIBILITY IDEOGRAPH-2F974 → CJK UNIFIED IDEOGRAPH-4359     # 
+
+2F981 ;        43D5 ;  ML      # ( 䏕 → 䏕 ) CJK COMPATIBILITY IDEOGRAPH-2F981 → CJK UNIFIED IDEOGRAPH-43D5     # 
+
+2F8D7 ;        43D9 ;  ML      # ( 䏙 → 䏙 ) CJK COMPATIBILITY IDEOGRAPH-2F8D7 → CJK UNIFIED IDEOGRAPH-43D9     # 
+
+2F984 ;        440B ;  ML      # ( 䐋 → 䐋 ) CJK COMPATIBILITY IDEOGRAPH-2F984 → CJK UNIFIED IDEOGRAPH-440B     # 
+
+6726 ; 4443 ;  ML      # ( 朦 → 䑃 ) CJK UNIFIED IDEOGRAPH-6726 → CJK UNIFIED IDEOGRAPH-4443     # 
+
+2F98E ;        446B ;  ML      # ( 䑫 → 䑫 ) CJK COMPATIBILITY IDEOGRAPH-2F98E → CJK UNIFIED IDEOGRAPH-446B     # 
+
+2F9A7 ;        452B ;  ML      # ( 䔫 → 䔫 ) CJK COMPATIBILITY IDEOGRAPH-2F9A7 → CJK UNIFIED IDEOGRAPH-452B     # 
+
+2F9AE ;        455D ;  ML      # ( 䕝 → 䕝 ) CJK COMPATIBILITY IDEOGRAPH-2F9AE → CJK UNIFIED IDEOGRAPH-455D     # 
+
+2F9AF ;        4561 ;  ML      # ( 䕡 → 䕡 ) CJK COMPATIBILITY IDEOGRAPH-2F9AF → CJK UNIFIED IDEOGRAPH-4561     # 
+
+2F9B2 ;        456B ;  ML      # ( 䕫 → 䕫 ) CJK COMPATIBILITY IDEOGRAPH-2F9B2 → CJK UNIFIED IDEOGRAPH-456B     # 
+
+2F9BF ;        45D7 ;  ML      # ( 䗗 → 䗗 ) CJK COMPATIBILITY IDEOGRAPH-2F9BF → CJK UNIFIED IDEOGRAPH-45D7     # 
+
+2F9C2 ;        45F9 ;  ML      # ( 䗹 → 䗹 ) CJK COMPATIBILITY IDEOGRAPH-2F9C2 → CJK UNIFIED IDEOGRAPH-45F9     # 
+
+2F9C8 ;        4635 ;  ML      # ( 䘵 → 䘵 ) CJK COMPATIBILITY IDEOGRAPH-2F9C8 → CJK UNIFIED IDEOGRAPH-4635     # 
+
+8A1E ; 46B6 ;  ML      # ( 訞 → 䚶 ) CJK UNIFIED IDEOGRAPH-8A1E → CJK UNIFIED IDEOGRAPH-46B6     # 
+
+2F9CD ;        46BE ;  ML      # ( 䚾 → 䚾 ) CJK COMPATIBILITY IDEOGRAPH-2F9CD → CJK UNIFIED IDEOGRAPH-46BE     # 
+
+2F9CE ;        46C7 ;  ML      # ( 䛇 → 䛇 ) CJK COMPATIBILITY IDEOGRAPH-2F9CE → CJK UNIFIED IDEOGRAPH-46C7     # 
+
+2F9EF ;        4995 ;  ML      # ( 䦕 → 䦕 ) CJK COMPATIBILITY IDEOGRAPH-2F9EF → CJK UNIFIED IDEOGRAPH-4995     # 
+
+2F9F2 ;        49E6 ;  ML      # ( 䧦 → 䧦 ) CJK COMPATIBILITY IDEOGRAPH-2F9F2 → CJK UNIFIED IDEOGRAPH-49E6     # 
+
+2F9F8 ;        4A6E ;  ML      # ( 䩮 → 䩮 ) CJK COMPATIBILITY IDEOGRAPH-2F9F8 → CJK UNIFIED IDEOGRAPH-4A6E     # 
+
+2F9F9 ;        4A76 ;  ML      # ( 䩶 → 䩶 ) CJK COMPATIBILITY IDEOGRAPH-2F9F9 → CJK UNIFIED IDEOGRAPH-4A76     # 
+
+2F9FC ;        4AB2 ;  ML      # ( 䪲 → 䪲 ) CJK COMPATIBILITY IDEOGRAPH-2F9FC → CJK UNIFIED IDEOGRAPH-4AB2     # 
+
+2FA03 ;        4B33 ;  ML      # ( 䬳 → 䬳 ) CJK COMPATIBILITY IDEOGRAPH-2FA03 → CJK UNIFIED IDEOGRAPH-4B33     # 
+
+2FA08 ;        4BCE ;  ML      # ( 䯎 → 䯎 ) CJK COMPATIBILITY IDEOGRAPH-2FA08 → CJK UNIFIED IDEOGRAPH-4BCE     # 
+
+2FA0D ;        4CCE ;  ML      # ( 䳎 → 䳎 ) CJK COMPATIBILITY IDEOGRAPH-2FA0D → CJK UNIFIED IDEOGRAPH-4CCE     # 
+
+2FA0E ;        4CED ;  ML      # ( 䳭 → 䳭 ) CJK COMPATIBILITY IDEOGRAPH-2FA0E → CJK UNIFIED IDEOGRAPH-4CED     # 
+
+2FA11 ;        4CF8 ;  ML      # ( 䳸 → 䳸 ) CJK COMPATIBILITY IDEOGRAPH-2FA11 → CJK UNIFIED IDEOGRAPH-4CF8     # 
+
+2FA16 ;        4D56 ;  ML      # ( 䵖 → 䵖 ) CJK COMPATIBILITY IDEOGRAPH-2FA16 → CJK UNIFIED IDEOGRAPH-4D56     # 
+
+2F803 ;        20122 ; ML      # ( 𠄢 → 𠄢 ) CJK COMPATIBILITY IDEOGRAPH-2F803 → CJK UNIFIED IDEOGRAPH-20122   # 
+
+2F812 ;        2051C ; ML      # ( 𠔜 → 𠔜 ) CJK COMPATIBILITY IDEOGRAPH-2F812 → CJK UNIFIED IDEOGRAPH-2051C   # 
+
+2F91B ;        20525 ; ML      # ( 𠔥 → 𠔥 ) CJK COMPATIBILITY IDEOGRAPH-2F91B → CJK UNIFIED IDEOGRAPH-20525   # 
+
+2F816 ;        2054B ; ML      # ( 𠕋 → 𠕋 ) CJK COMPATIBILITY IDEOGRAPH-2F816 → CJK UNIFIED IDEOGRAPH-2054B   # 
+
+2F80D ;        2063A ; ML      # ( 𠘺 → 𠘺 ) CJK COMPATIBILITY IDEOGRAPH-2F80D → CJK UNIFIED IDEOGRAPH-2063A   # 
+
+2F9D9 ;        20804 ; ML      # ( 𠠄 → 𠠄 ) CJK COMPATIBILITY IDEOGRAPH-2F9D9 → CJK UNIFIED IDEOGRAPH-20804   # 
+
+2F9DD ;        208DE ; ML      # ( 𠣞 → 𠣞 ) CJK COMPATIBILITY IDEOGRAPH-2F9DD → CJK UNIFIED IDEOGRAPH-208DE   # 
+
+2F834 ;        20A2C ; ML      # ( 𠨬 → 𠨬 ) CJK COMPATIBILITY IDEOGRAPH-2F834 → CJK UNIFIED IDEOGRAPH-20A2C   # 
+
+2F838 ;        20B63 ; ML      # ( 𠭣 → 𠭣 ) CJK COMPATIBILITY IDEOGRAPH-2F838 → CJK UNIFIED IDEOGRAPH-20B63   # 
+
+2F859 ;        214E4 ; ML      # ( 𡓤 → 𡓤 ) CJK COMPATIBILITY IDEOGRAPH-2F859 → CJK UNIFIED IDEOGRAPH-214E4   # 
+
+2F860 ;        216A8 ; ML      # ( 𡚨 → 𡚨 ) CJK COMPATIBILITY IDEOGRAPH-2F860 → CJK UNIFIED IDEOGRAPH-216A8   # 
+
+2F861 ;        216EA ; ML      # ( 𡛪 → 𡛪 ) CJK COMPATIBILITY IDEOGRAPH-2F861 → CJK UNIFIED IDEOGRAPH-216EA   # 
+
+2F86C ;        219C8 ; ML      # ( 𡧈 → 𡧈 ) CJK COMPATIBILITY IDEOGRAPH-2F86C → CJK UNIFIED IDEOGRAPH-219C8   # 
+
+2F871 ;        21B18 ; ML      # ( 𡬘 → 𡬘 ) CJK COMPATIBILITY IDEOGRAPH-2F871 → CJK UNIFIED IDEOGRAPH-21B18   # 
+
+2F8F8 ;        21D0B ; ML      # ( 𡴋 → 𡴋 ) CJK COMPATIBILITY IDEOGRAPH-2F8F8 → CJK UNIFIED IDEOGRAPH-21D0B   # 
+
+2F87B ;        21DE4 ; ML      # ( 𡷤 → 𡷤 ) CJK COMPATIBILITY IDEOGRAPH-2F87B → CJK UNIFIED IDEOGRAPH-21DE4   # 
+
+2F87D ;        21DE6 ; ML      # ( 𡷦 → 𡷦 ) CJK COMPATIBILITY IDEOGRAPH-2F87D → CJK UNIFIED IDEOGRAPH-21DE6   # 
+
+2F889 ;        22183 ; ML      # ( 𢆃 → 𢆃 ) CJK COMPATIBILITY IDEOGRAPH-2F889 → CJK UNIFIED IDEOGRAPH-22183   # 
+
+2F939 ;        2219F ; ML      # ( 𢆟 → 𢆟 ) CJK COMPATIBILITY IDEOGRAPH-2F939 → CJK UNIFIED IDEOGRAPH-2219F   # 
+
+2F891 ;        22331 ; ML      # ( 𢌱 → 𢌱 ) CJK COMPATIBILITY IDEOGRAPH-2F891 → CJK UNIFIED IDEOGRAPH-22331   # 
+2F892 ;        22331 ; ML      # ( 𢌱 → 𢌱 ) CJK COMPATIBILITY IDEOGRAPH-2F892 → CJK UNIFIED IDEOGRAPH-22331   # 
+
+2F8A4 ;        226D4 ; ML      # ( 𢛔 → 𢛔 ) CJK COMPATIBILITY IDEOGRAPH-2F8A4 → CJK UNIFIED IDEOGRAPH-226D4   # 
+
+FAD0 ; 22844 ; ML      # ( 𢡄 → 𢡄 ) CJK COMPATIBILITY IDEOGRAPH-FAD0 → CJK UNIFIED IDEOGRAPH-22844     # 
+
+FACF ; 2284A ; ML      # ( 𢡊 → 𢡊 ) CJK COMPATIBILITY IDEOGRAPH-FACF → CJK UNIFIED IDEOGRAPH-2284A     # 
+
+2F8B8 ;        22B0C ; ML      # ( 𢬌 → 𢬌 ) CJK COMPATIBILITY IDEOGRAPH-2F8B8 → CJK UNIFIED IDEOGRAPH-22B0C   # 
+
+2F8BE ;        22BF1 ; ML      # ( 𢯱 → 𢯱 ) CJK COMPATIBILITY IDEOGRAPH-2F8BE → CJK UNIFIED IDEOGRAPH-22BF1   # 
+
+2F8CA ;        2300A ; ML      # ( 𣀊 → 𣀊 ) CJK COMPATIBILITY IDEOGRAPH-2F8CA → CJK UNIFIED IDEOGRAPH-2300A   # 
+
+2F897 ;        232B8 ; ML      # ( 𣊸 → 𣊸 ) CJK COMPATIBILITY IDEOGRAPH-2F897 → CJK UNIFIED IDEOGRAPH-232B8   # 
+
+2F980 ;        2335F ; ML      # ( 𣍟 → 𣍟 ) CJK COMPATIBILITY IDEOGRAPH-2F980 → CJK UNIFIED IDEOGRAPH-2335F   # 
+
+2F989 ;        23393 ; ML      # ( 𣎓 → 𣎓 ) CJK COMPATIBILITY IDEOGRAPH-2F989 → CJK UNIFIED IDEOGRAPH-23393   # 
+
+2F98A ;        2339C ; ML      # ( 𣎜 → 𣎜 ) CJK COMPATIBILITY IDEOGRAPH-2F98A → CJK UNIFIED IDEOGRAPH-2339C   # 
+
+2F8DD ;        233C3 ; ML      # ( 𣏃 → 𣏃 ) CJK COMPATIBILITY IDEOGRAPH-2F8DD → CJK UNIFIED IDEOGRAPH-233C3   # 
+
+FAD1 ; 233D5 ; ML      # ( 𣏕 → 𣏕 ) CJK COMPATIBILITY IDEOGRAPH-FAD1 → CJK UNIFIED IDEOGRAPH-233D5     # 
+
+2F8E3 ;        2346D ; ML      # ( 𣑭 → 𣑭 ) CJK COMPATIBILITY IDEOGRAPH-2F8E3 → CJK UNIFIED IDEOGRAPH-2346D   # 
+
+2F8EC ;        236A3 ; ML      # ( 𣚣 → 𣚣 ) CJK COMPATIBILITY IDEOGRAPH-2F8EC → CJK UNIFIED IDEOGRAPH-236A3   # 
+
+2F8F0 ;        238A7 ; ML      # ( 𣢧 → 𣢧 ) CJK COMPATIBILITY IDEOGRAPH-2F8F0 → CJK UNIFIED IDEOGRAPH-238A7   # 
+
+2F8F7 ;        23A8D ; ML      # ( 𣪍 → 𣪍 ) CJK COMPATIBILITY IDEOGRAPH-2F8F7 → CJK UNIFIED IDEOGRAPH-23A8D   # 
+
+2F8F9 ;        23AFA ; ML      # ( 𣫺 → 𣫺 ) CJK COMPATIBILITY IDEOGRAPH-2F8F9 → CJK UNIFIED IDEOGRAPH-23AFA   # 
+
+2F8FB ;        23CBC ; ML      # ( 𣲼 → 𣲼 ) CJK COMPATIBILITY IDEOGRAPH-2F8FB → CJK UNIFIED IDEOGRAPH-23CBC   # 
+
+2F906 ;        23D1E ; ML      # ( 𣴞 → 𣴞 ) CJK COMPATIBILITY IDEOGRAPH-2F906 → CJK UNIFIED IDEOGRAPH-23D1E   # 
+
+2F90D ;        23ED1 ; ML      # ( 𣻑 → 𣻑 ) CJK COMPATIBILITY IDEOGRAPH-2F90D → CJK UNIFIED IDEOGRAPH-23ED1   # 
+
+2F910 ;        23F5E ; ML      # ( 𣽞 → 𣽞 ) CJK COMPATIBILITY IDEOGRAPH-2F910 → CJK UNIFIED IDEOGRAPH-23F5E   # 
+
+2F911 ;        23F8E ; ML      # ( 𣾎 → 𣾎 ) CJK COMPATIBILITY IDEOGRAPH-2F911 → CJK UNIFIED IDEOGRAPH-23F8E   # 
+
+2F91D ;        24263 ; ML      # ( 𤉣 → 𤉣 ) CJK COMPATIBILITY IDEOGRAPH-2F91D → CJK UNIFIED IDEOGRAPH-24263   # 
+
+FA6C ; 242EE ; ML      # ( 𤋮 → 𤋮 ) CJK COMPATIBILITY IDEOGRAPH-FA6C → CJK UNIFIED IDEOGRAPH-242EE     # 
+
+2F91F ;        243AB ; ML      # ( 𤎫 → 𤎫 ) CJK COMPATIBILITY IDEOGRAPH-2F91F → CJK UNIFIED IDEOGRAPH-243AB   # 
+
+2F923 ;        24608 ; ML      # ( 𤘈 → 𤘈 ) CJK COMPATIBILITY IDEOGRAPH-2F923 → CJK UNIFIED IDEOGRAPH-24608   # 
+
+2F926 ;        24735 ; ML      # ( 𤜵 → 𤜵 ) CJK COMPATIBILITY IDEOGRAPH-2F926 → CJK UNIFIED IDEOGRAPH-24735   # 
+
+2F927 ;        24814 ; ML      # ( 𤠔 → 𤠔 ) CJK COMPATIBILITY IDEOGRAPH-2F927 → CJK UNIFIED IDEOGRAPH-24814   # 
+
+2F935 ;        24C36 ; ML      # ( 𤰶 → 𤰶 ) CJK COMPATIBILITY IDEOGRAPH-2F935 → CJK UNIFIED IDEOGRAPH-24C36   # 
+
+2F937 ;        24C92 ; ML      # ( 𤲒 → 𤲒 ) CJK COMPATIBILITY IDEOGRAPH-2F937 → CJK UNIFIED IDEOGRAPH-24C92   # 
+
+2F93B ;        24FA1 ; ML      # ( 𤾡 → 𤾡 ) CJK COMPATIBILITY IDEOGRAPH-2F93B → CJK UNIFIED IDEOGRAPH-24FA1   # 
+
+2F93C ;        24FB8 ; ML      # ( 𤾸 → 𤾸 ) CJK COMPATIBILITY IDEOGRAPH-2F93C → CJK UNIFIED IDEOGRAPH-24FB8   # 
+
+2F93D ;        25044 ; ML      # ( 𥁄 → 𥁄 ) CJK COMPATIBILITY IDEOGRAPH-2F93D → CJK UNIFIED IDEOGRAPH-25044   # 
+
+2F942 ;        250F2 ; ML      # ( 𥃲 → 𥃲 ) CJK COMPATIBILITY IDEOGRAPH-2F942 → CJK UNIFIED IDEOGRAPH-250F2   # 
+
+2F941 ;        250F3 ; ML      # ( 𥃳 → 𥃳 ) CJK COMPATIBILITY IDEOGRAPH-2F941 → CJK UNIFIED IDEOGRAPH-250F3   # 
+
+2F943 ;        25119 ; ML      # ( 𥄙 → 𥄙 ) CJK COMPATIBILITY IDEOGRAPH-2F943 → CJK UNIFIED IDEOGRAPH-25119   # 
+
+2F944 ;        25133 ; ML      # ( 𥄳 → 𥄳 ) CJK COMPATIBILITY IDEOGRAPH-2F944 → CJK UNIFIED IDEOGRAPH-25133   # 
+
+FAD5 ; 25249 ; ML      # ( 𥉉 → 𥉉 ) CJK COMPATIBILITY IDEOGRAPH-FAD5 → CJK UNIFIED IDEOGRAPH-25249     # 
+
+2F94D ;        2541D ; ML      # ( 𥐝 → 𥐝 ) CJK COMPATIBILITY IDEOGRAPH-2F94D → CJK UNIFIED IDEOGRAPH-2541D   # 
+
+2F952 ;        25626 ; ML      # ( 𥘦 → 𥘦 ) CJK COMPATIBILITY IDEOGRAPH-2F952 → CJK UNIFIED IDEOGRAPH-25626   # 
+
+2F954 ;        2569A ; ML      # ( 𥚚 → 𥚚 ) CJK COMPATIBILITY IDEOGRAPH-2F954 → CJK UNIFIED IDEOGRAPH-2569A   # 
+
+2F955 ;        256C5 ; ML      # ( 𥛅 → 𥛅 ) CJK COMPATIBILITY IDEOGRAPH-2F955 → CJK UNIFIED IDEOGRAPH-256C5   # 
+
+2F95C ;        2597C ; ML      # ( 𥥼 → 𥥼 ) CJK COMPATIBILITY IDEOGRAPH-2F95C → CJK UNIFIED IDEOGRAPH-2597C   # 
+
+2F95D ;        25AA7 ; ML      # ( 𥪧 → 𥪧 ) CJK COMPATIBILITY IDEOGRAPH-2F95D → CJK UNIFIED IDEOGRAPH-25AA7   # 
+2F95E ;        25AA7 ; ML      # ( 𥪧 → 𥪧 ) CJK COMPATIBILITY IDEOGRAPH-2F95E → CJK UNIFIED IDEOGRAPH-25AA7   # 
+
+2F961 ;        25BAB ; ML      # ( 𥮫 → 𥮫 ) CJK COMPATIBILITY IDEOGRAPH-2F961 → CJK UNIFIED IDEOGRAPH-25BAB   # 
+
+2F965 ;        25C80 ; ML      # ( 𥲀 → 𥲀 ) CJK COMPATIBILITY IDEOGRAPH-2F965 → CJK UNIFIED IDEOGRAPH-25C80   # 
+
+FAD6 ; 25CD0 ; ML      # ( 𥳐 → 𥳐 ) CJK COMPATIBILITY IDEOGRAPH-FAD6 → CJK UNIFIED IDEOGRAPH-25CD0     # 
+
+2F96B ;        25F86 ; ML      # ( 𥾆 → 𥾆 ) CJK COMPATIBILITY IDEOGRAPH-2F96B → CJK UNIFIED IDEOGRAPH-25F86   # 
+
+2F898 ;        261DA ; ML      # ( 𦇚 → 𦇚 ) CJK COMPATIBILITY IDEOGRAPH-2F898 → CJK UNIFIED IDEOGRAPH-261DA   # 
+
+2F972 ;        26228 ; ML      # ( 𦈨 → 𦈨 ) CJK COMPATIBILITY IDEOGRAPH-2F972 → CJK UNIFIED IDEOGRAPH-26228   # 
+
+2F973 ;        26247 ; ML      # ( 𦉇 → 𦉇 ) CJK COMPATIBILITY IDEOGRAPH-2F973 → CJK UNIFIED IDEOGRAPH-26247   # 
+
+2F975 ;        262D9 ; ML      # ( 𦋙 → 𦋙 ) CJK COMPATIBILITY IDEOGRAPH-2F975 → CJK UNIFIED IDEOGRAPH-262D9   # 
+
+2F977 ;        2633E ; ML      # ( 𦌾 → 𦌾 ) CJK COMPATIBILITY IDEOGRAPH-2F977 → CJK UNIFIED IDEOGRAPH-2633E   # 
+
+2F97B ;        264DA ; ML      # ( 𦓚 → 𦓚 ) CJK COMPATIBILITY IDEOGRAPH-2F97B → CJK UNIFIED IDEOGRAPH-264DA   # 
+
+2F97C ;        26523 ; ML      # ( 𦔣 → 𦔣 ) CJK COMPATIBILITY IDEOGRAPH-2F97C → CJK UNIFIED IDEOGRAPH-26523   # 
+
+2F97E ;        265A8 ; ML      # ( 𦖨 → 𦖨 ) CJK COMPATIBILITY IDEOGRAPH-2F97E → CJK UNIFIED IDEOGRAPH-265A8   # 
+
+2F987 ;        267A7 ; ML      # ( 𦞧 → 𦞧 ) CJK COMPATIBILITY IDEOGRAPH-2F987 → CJK UNIFIED IDEOGRAPH-267A7   # 
+
+2F988 ;        267B5 ; ML      # ( 𦞵 → 𦞵 ) CJK COMPATIBILITY IDEOGRAPH-2F988 → CJK UNIFIED IDEOGRAPH-267B5   # 
+
+2F997 ;        26B3C ; ML      # ( 𦬼 → 𦬼 ) CJK COMPATIBILITY IDEOGRAPH-2F997 → CJK UNIFIED IDEOGRAPH-26B3C   # 
+
+2F9A4 ;        26C36 ; ML      # ( 𦰶 → 𦰶 ) CJK COMPATIBILITY IDEOGRAPH-2F9A4 → CJK UNIFIED IDEOGRAPH-26C36   # 
+
+2F9A6 ;        26CD5 ; ML      # ( 𦳕 → 𦳕 ) CJK COMPATIBILITY IDEOGRAPH-2F9A6 → CJK UNIFIED IDEOGRAPH-26CD5   # 
+
+2F9A5 ;        26D6B ; ML      # ( 𦵫 → 𦵫 ) CJK COMPATIBILITY IDEOGRAPH-2F9A5 → CJK UNIFIED IDEOGRAPH-26D6B   # 
+
+2F9AD ;        26F2C ; ML      # ( 𦼬 → 𦼬 ) CJK COMPATIBILITY IDEOGRAPH-2F9AD → CJK UNIFIED IDEOGRAPH-26F2C   # 
+
+2F9B0 ;        26FB1 ; ML      # ( 𦾱 → 𦾱 ) CJK COMPATIBILITY IDEOGRAPH-2F9B0 → CJK UNIFIED IDEOGRAPH-26FB1   # 
+
+2F9B1 ;        270D2 ; ML      # ( 𧃒 → 𧃒 ) CJK COMPATIBILITY IDEOGRAPH-2F9B1 → CJK UNIFIED IDEOGRAPH-270D2   # 
+
+2F9AB ;        273CA ; ML      # ( 𧏊 → 𧏊 ) CJK COMPATIBILITY IDEOGRAPH-2F9AB → CJK UNIFIED IDEOGRAPH-273CA   # 
+
+2F9C5 ;        27667 ; ML      # ( 𧙧 → 𧙧 ) CJK COMPATIBILITY IDEOGRAPH-2F9C5 → CJK UNIFIED IDEOGRAPH-27667   # 
+
+2F9CB ;        278AE ; ML      # ( 𧢮 → 𧢮 ) CJK COMPATIBILITY IDEOGRAPH-2F9CB → CJK UNIFIED IDEOGRAPH-278AE   # 
+
+2F9CC ;        27966 ; ML      # ( 𧥦 → 𧥦 ) CJK COMPATIBILITY IDEOGRAPH-2F9CC → CJK UNIFIED IDEOGRAPH-27966   # 
+
+2F9D3 ;        27CA8 ; ML      # ( 𧲨 → 𧲨 ) CJK COMPATIBILITY IDEOGRAPH-2F9D3 → CJK UNIFIED IDEOGRAPH-27CA8   # 
+
+FAD7 ; 27ED3 ; ML      # ( 𧻓 → 𧻓 ) CJK COMPATIBILITY IDEOGRAPH-FAD7 → CJK UNIFIED IDEOGRAPH-27ED3     # 
+
+2F9D8 ;        27F2F ; ML      # ( 𧼯 → 𧼯 ) CJK COMPATIBILITY IDEOGRAPH-2F9D8 → CJK UNIFIED IDEOGRAPH-27F2F   # 
+
+2F9E0 ;        285D2 ; ML      # ( 𨗒 → 𨗒 ) CJK COMPATIBILITY IDEOGRAPH-2F9E0 → CJK UNIFIED IDEOGRAPH-285D2   # 
+
+2F9E1 ;        285ED ; ML      # ( 𨗭 → 𨗭 ) CJK COMPATIBILITY IDEOGRAPH-2F9E1 → CJK UNIFIED IDEOGRAPH-285ED   # 
+
+2F9E5 ;        2872E ; ML      # ( 𨜮 → 𨜮 ) CJK COMPATIBILITY IDEOGRAPH-2F9E5 → CJK UNIFIED IDEOGRAPH-2872E   # 
+
+2F9ED ;        28BFA ; ML      # ( 𨯺 → 𨯺 ) CJK COMPATIBILITY IDEOGRAPH-2F9ED → CJK UNIFIED IDEOGRAPH-28BFA   # 
+
+2F9F1 ;        28D77 ; ML      # ( 𨵷 → 𨵷 ) CJK COMPATIBILITY IDEOGRAPH-2F9F1 → CJK UNIFIED IDEOGRAPH-28D77   # 
+
+2F9F6 ;        29145 ; ML      # ( 𩅅 → 𩅅 ) CJK COMPATIBILITY IDEOGRAPH-2F9F6 → CJK UNIFIED IDEOGRAPH-29145   # 
+
+2F81C ;        291DF ; ML      # ( 𩇟 → 𩇟 ) CJK COMPATIBILITY IDEOGRAPH-2F81C → CJK UNIFIED IDEOGRAPH-291DF   # 
+
+2F9F7 ;        2921A ; ML      # ( 𩈚 → 𩈚 ) CJK COMPATIBILITY IDEOGRAPH-2F9F7 → CJK UNIFIED IDEOGRAPH-2921A   # 
+
+2F9FB ;        2940A ; ML      # ( 𩐊 → 𩐊 ) CJK COMPATIBILITY IDEOGRAPH-2F9FB → CJK UNIFIED IDEOGRAPH-2940A   # 
+
+2F9FD ;        29496 ; ML      # ( 𩒖 → 𩒖 ) CJK COMPATIBILITY IDEOGRAPH-2F9FD → CJK UNIFIED IDEOGRAPH-29496   # 
+
+2FA01 ;        295B6 ; ML      # ( 𩖶 → 𩖶 ) CJK COMPATIBILITY IDEOGRAPH-2FA01 → CJK UNIFIED IDEOGRAPH-295B6   # 
+
+2FA09 ;        29B30 ; ML      # ( 𩬰 → 𩬰 ) CJK COMPATIBILITY IDEOGRAPH-2FA09 → CJK UNIFIED IDEOGRAPH-29B30   # 
+
+2FA10 ;        2A0CE ; ML      # ( 𪃎 → 𪃎 ) CJK COMPATIBILITY IDEOGRAPH-2FA10 → CJK UNIFIED IDEOGRAPH-2A0CE   # 
+
+2FA12 ;        2A105 ; ML      # ( 𪄅 → 𪄅 ) CJK COMPATIBILITY IDEOGRAPH-2FA12 → CJK UNIFIED IDEOGRAPH-2A105   # 
+
+2FA13 ;        2A20E ; ML      # ( 𪈎 → 𪈎 ) CJK COMPATIBILITY IDEOGRAPH-2FA13 → CJK UNIFIED IDEOGRAPH-2A20E   # 
+
+2FA14 ;        2A291 ; ML      # ( 𪊑 → 𪊑 ) CJK COMPATIBILITY IDEOGRAPH-2FA14 → CJK UNIFIED IDEOGRAPH-2A291   # 
+
+2F88F ;        2A392 ; ML      # ( 𪎒 → 𪎒 ) CJK COMPATIBILITY IDEOGRAPH-2F88F → CJK UNIFIED IDEOGRAPH-2A392   # 
+
+2FA1D ;        2A600 ; ML      # ( 𪘀 → 𪘀 ) CJK COMPATIBILITY IDEOGRAPH-2FA1D → CJK UNIFIED IDEOGRAPH-2A600   # 
+
+# total for (ML): 4980
+
+
+# Mixed-Script, Anycase Confusables
+
+05AD ; 0596 ;  MA      # ( ֭ → ֖ ) HEBREW ACCENT DEHI → HEBREW ACCENT TIPEHA     # 
+
+05AE ; 0598 ;  MA      # ( ֮ → ֘ ) HEBREW ACCENT ZINOR → HEBREW ACCENT ZARQA     # 
+
+05A8 ; 0599 ;  MA      # ( ֨ → ֙ ) HEBREW ACCENT QADMA → HEBREW ACCENT PASHTA    # 
+
+05A4 ; 059A ;  MA      # ( ֤ → ֚ ) HEBREW ACCENT MAHAPAKH → HEBREW ACCENT YETIV  # 
+
+06EC ; 06DF ;  MA      # ( ۬ → ۟ ) ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE → ARABIC SMALL HIGH ROUNDED ZERO  # 
+
+0619 ; 0313 ;  MA      # ( ؙ → ̓ ) ARABIC SMALL DAMMA → COMBINING COMMA ABOVE    # →ُ→
+0343 ; 0313 ;  MA      # ( ̓ → ̓ ) COMBINING GREEK KORONIS → COMBINING COMMA ABOVE       # 
+0315 ; 0313 ;  MA      # ( ̕ → ̓ ) COMBINING COMMA ABOVE RIGHT → COMBINING COMMA ABOVE   # 
+064F ; 0313 ;  MA      # ( ُ → ̓ ) ARABIC DAMMA → COMBINING COMMA ABOVE  # 
+
+059C ; 0301 ;  MA      # ( ֜ → ́ ) HEBREW ACCENT GERESH → COMBINING ACUTE ACCENT # 
+059D ; 0301 ;  MA      # ( ֝ → ́ ) HEBREW ACCENT GERESH MUQDAM → COMBINING ACUTE ACCENT  # →֜→
+0747 ; 0301 ;  MA      # ( ݇ → ́ ) SYRIAC OBLIQUE LINE ABOVE → COMBINING ACUTE ACCENT    # 
+0341 ; 0301 ;  MA      # ( ́ → ́ ) COMBINING ACUTE TONE MARK → COMBINING ACUTE ACCENT    # 
+0954 ; 0301 ;  MA      # ( ॔ → ́ ) DEVANAGARI ACUTE ACCENT → COMBINING ACUTE ACCENT     # 
+
+0340 ; 0300 ;  MA      # ( ̀ → ̀ ) COMBINING GRAVE TONE MARK → COMBINING GRAVE ACCENT    # 
+0953 ; 0300 ;  MA      # ( ॓ → ̀ ) DEVANAGARI GRAVE ACCENT → COMBINING GRAVE ACCENT     # 
+
+030C ; 0306 ;  MA      # ( ̌ → ̆ ) COMBINING CARON → COMBINING BREVE     # 
+036E ; 0306 ;  MA      # ( ͮ → ̆ ) COMBINING LATIN SMALL LETTER V → COMBINING BREVE      # →̌→
+
+0310 ; 0306 0307 ;     MA      # ( ̐ → ̆̇ ) COMBINING CANDRABINDU → COMBINING BREVE, COMBINING DOT ABOVE        # 
+0901 ; 0306 0307 ;     MA      # ( ँ → ̆̇ ) DEVANAGARI SIGN CANDRABINDU → COMBINING BREVE, COMBINING DOT ABOVE # →̐→
+0981 ; 0306 0307 ;     MA      # ( ঁ → ̆̇ ) BENGALI SIGN CANDRABINDU → COMBINING BREVE, COMBINING DOT ABOVE    # →̐→
+0A81 ; 0306 0307 ;     MA      # ( ઁ → ̆̇ ) GUJARATI SIGN CANDRABINDU → COMBINING BREVE, COMBINING DOT ABOVE   # →̐→
+0B01 ; 0306 0307 ;     MA      # ( ଁ → ̆̇ ) ORIYA SIGN CANDRABINDU → COMBINING BREVE, COMBINING DOT ABOVE      # →̐→
+
+0311 ; 0302 ;  MA      # ( ̑ → ̂ ) COMBINING INVERTED BREVE → COMBINING CIRCUMFLEX ACCENT        # 
+07EE ; 0302 ;  MA      # ( ߮ → ̂ ) NKO COMBINING LONG DESCENDING TONE → COMBINING CIRCUMFLEX ACCENT      # 
+
+05AF ; 030A ;  MA      # ( ֯ → ̊ ) HEBREW MARK MASORA CIRCLE → COMBINING RING ABOVE      # 
+17D3 ; 030A ;  MA      # ( ៓ → ̊ ) KHMER SIGN BATHAMASAT → COMBINING RING ABOVE # 
+0B82 ; 030A ;  MA      # ( ஂ → ̊ ) TAMIL SIGN ANUSVARA → COMBINING RING ABOVE   # 
+0E4D ; 030A ;  MA      # ( ํ → ̊ ) THAI CHARACTER NIKHAHIT → COMBINING RING ABOVE       # 
+0ECD ; 030A ;  MA      # ( ໍ → ̊ ) LAO NIGGAHITA → COMBINING RING ABOVE # 
+1036 ; 030A ;  MA      # ( ံ → ̊ ) MYANMAR SIGN ANUSVARA → COMBINING RING ABOVE # 
+17C6 ; 030A ;  MA      # ( ំ → ̊ ) KHMER SIGN NIKAHIT → COMBINING RING ABOVE    # 
+309A ; 030A ;  MA      # ( ゚ → ̊ ) COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK → COMBINING RING ABOVE    # 
+0366 ; 030A ;  MA      # ( ͦ → ̊ ) COMBINING LATIN SMALL LETTER O → COMBINING RING ABOVE # 
+
+07F3 ; 0308 ;  MA      # ( ߳ → ̈ ) NKO COMBINING DOUBLE DOT ABOVE → COMBINING DIAERESIS  # 
+
+0342 ; 0303 ;  MA      # ( ͂ → ̃ ) COMBINING GREEK PERISPOMENI → COMBINING TILDE # 
+
+05C4 ; 0307 ;  MA      # ( ׄ → ̇ ) HEBREW MARK UPPER DOT → COMBINING DOT ABOVE   # 
+0740 ; 0307 ;  MA      # ( ݀ → ̇ ) SYRIAC FEMININE DOT → COMBINING DOT ABOVE     # →݁→
+0741 ; 0307 ;  MA      # ( ݁ → ̇ ) SYRIAC QUSHSHAYA → COMBINING DOT ABOVE        # 
+0358 ; 0307 ;  MA      # ( ͘ → ̇ ) COMBINING DOT ABOVE RIGHT → COMBINING DOT ABOVE       # 
+05B9 ; 0307 ;  MA      # ( ֹ → ̇ ) HEBREW POINT HOLAM → COMBINING DOT ABOVE      # 
+05BA ; 0307 ;  MA      # ( ֺ → ̇ ) HEBREW POINT HOLAM HASER FOR VAV → COMBINING DOT ABOVE        # →ׁ→
+05C2 ; 0307 ;  MA      # ( ׂ → ̇ ) HEBREW POINT SIN DOT → COMBINING DOT ABOVE    # 
+05C1 ; 0307 ;  MA      # ( ׁ → ̇ ) HEBREW POINT SHIN DOT → COMBINING DOT ABOVE   # 
+07ED ; 0307 ;  MA      # ( ߭ → ̇ ) NKO COMBINING SHORT RISING TONE → COMBINING DOT ABOVE # 
+0902 ; 0307 ;  MA      # ( ं → ̇ ) DEVANAGARI SIGN ANUSVARA → COMBINING DOT ABOVE       # 
+0A02 ; 0307 ;  MA      # ( ਂ → ̇ ) GURMUKHI SIGN BINDI → COMBINING DOT ABOVE    # 
+0A82 ; 0307 ;  MA      # ( ં → ̇ ) GUJARATI SIGN ANUSVARA → COMBINING DOT ABOVE # 
+0BCD ; 0307 ;  MA      # ( ் → ̇ ) TAMIL SIGN VIRAMA → COMBINING DOT ABOVE      # 
+
+0337 ; 0338 ;  MA      # ( ̷ → ̸ ) COMBINING SHORT SOLIDUS OVERLAY → COMBINING LONG SOLIDUS OVERLAY      # 
+
+0322 ; 0328 ;  MA      # ( ̢ → ̨ ) COMBINING RETROFLEX HOOK BELOW → COMBINING OGONEK     # 
+0345 ; 0328 ;  MA      # ( ͅ → ̨ ) COMBINING GREEK YPOGEGRAMMENI → COMBINING OGONEK      # 
+
+0305 ; 0304 ;  MA      # ( ̅ → ̄ ) COMBINING OVERLINE → COMBINING MACRON # 
+07EB ; 0304 ;  MA      # ( ߫ → ̄ ) NKO COMBINING SHORT HIGH TONE → COMBINING MACRON      # 
+
+0347 ; 0333 ;  MA      # ( ͇ → ̳ ) COMBINING EQUALS SIGN BELOW → COMBINING DOUBLE LOW LINE       # 
+
+302C ; 0309 ;  MA      # ( 〬 → ̉ ) IDEOGRAPHIC DEPARTING TONE MARK → COMBINING HOOK ABOVE       # 
+
+05C5 ; 0323 ;  MA      # ( ׅ → ̣ ) HEBREW MARK LOWER DOT → COMBINING DOT BELOW   # 
+05B4 ; 0323 ;  MA      # ( ִ → ̣ ) HEBREW POINT HIRIQ → COMBINING DOT BELOW      # 
+093C ; 0323 ;  MA      # ( ़ → ̣ ) DEVANAGARI SIGN NUKTA → COMBINING DOT BELOW  # 
+09BC ; 0323 ;  MA      # ( ় → ̣ ) BENGALI SIGN NUKTA → COMBINING DOT BELOW     # 
+0A3C ; 0323 ;  MA      # ( ਼ → ̣ ) GURMUKHI SIGN NUKTA → COMBINING DOT BELOW    # 
+0ABC ; 0323 ;  MA      # ( ઼ → ̣ ) GUJARATI SIGN NUKTA → COMBINING DOT BELOW    # 
+0B3C ; 0323 ;  MA      # ( ଼ → ̣ ) ORIYA SIGN NUKTA → COMBINING DOT BELOW       # 
+10A3A ;        0323 ;  MA      # ( 𐨺 → ̣ ) KHAROSHTHI SIGN DOT BELOW → COMBINING DOT BELOW     # 
+
+302D ; 0325 ;  MA      # ( 〭 → ̥ ) IDEOGRAPHIC ENTERING TONE MARK → COMBINING RING BELOW        # 
+
+0327 ; 0326 ;  MA      # ( ̧ → ̦ ) COMBINING CEDILLA → COMBINING COMMA BELOW     # →̡→
+0321 ; 0326 ;  MA      # ( ̡ → ̦ ) COMBINING PALATALIZED HOOK BELOW → COMBINING COMMA BELOW      # 
+0339 ; 0326 ;  MA      # ( ̹ → ̦ ) COMBINING RIGHT HALF RING BELOW → COMBINING COMMA BELOW       # →̧→→̡→
+
+0952 ; 0331 ;  MA      # ( ॒ → ̱ ) DEVANAGARI STRESS SIGN ANUDATTA → COMBINING MACRON BELOW     # 
+0320 ; 0331 ;  MA      # ( ̠ → ̱ ) COMBINING MINUS SIGN BELOW → COMBINING MACRON BELOW   # 
+
+0336 ; 0335 ;  MA      # ( ̶ → ̵ ) COMBINING LONG STROKE OVERLAY → COMBINING SHORT STROKE OVERLAY        # 
+
+FC5E ; FE72 0651 ;     MA      #* ( ‎ﱞ‎ → ‎ﹲّ‎ ) ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM → ARABIC DAMMATAN ISOLATED FORM, ARABIC SHADDA    # 
+
+FC5F ; FE74 0651 ;     MA      #* ( ‎ﱟ‎ → ‎ﹴّ‎ ) ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM → ARABIC KASRATAN ISOLATED FORM, ARABIC SHADDA    # 
+
+0618 ; 064E ;  MA      # ( ؘ → َ ) ARABIC SMALL FATHA → ARABIC FATHA     # 
+
+FCF2 ; FE77 0651 ;     MA      # ( ‎ﳲ‎ → ‎ﹷّ‎ ) ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM → ARABIC FATHA MEDIAL FORM, ARABIC SHADDA       # 
+
+FC60 ; FE76 0651 ;     MA      #* ( ‎ﱠ‎ → ‎ﹶّ‎ ) ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM → ARABIC FATHA ISOLATED FORM, ARABIC SHADDA  # 
+FC62 ; FE76 0651 ;     MA      #* ( ‎ﱢ‎ → ‎ﹶّ‎ ) ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM → ARABIC FATHA ISOLATED FORM, ARABIC SHADDA  # →‎ﱠ‎→
+
+FCF3 ; FE79 0651 ;     MA      # ( ‎ﳳ‎ → ‎ﹹّ‎ ) ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM → ARABIC DAMMA MEDIAL FORM, ARABIC SHADDA       # 
+
+FC61 ; FE78 0651 ;     MA      #* ( ‎ﱡ‎ → ‎ﹸّ‎ ) ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM → ARABIC DAMMA ISOLATED FORM, ARABIC SHADDA  # 
+
+061A ; 0650 ;  MA      # ( ؚ → ِ ) ARABIC SMALL KASRA → ARABIC KASRA     # 
+
+FCF4 ; FE7B 0651 ;     MA      # ( ‎ﳴ‎ → ‎ﹻّ‎ ) ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM → ARABIC KASRA MEDIAL FORM, ARABIC SHADDA       # 
+
+FC63 ; FE7C 0670 ;     MA      #* ( ‎ﱣ‎ → ‎ﹼٰ‎ ) ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM → ARABIC SHADDA ISOLATED FORM, ARABIC LETTER SUPERSCRIPT ALEF     # 
+
+0742 ; 073C ;  MA      # ( ݂ → ܼ ) SYRIAC RUKKAKHA → SYRIAC HBASA-ESASA DOTTED   # 
+
+0A03 ; 0983 ;  MA      # ( ਃ → ঃ ) GURMUKHI SIGN VISARGA → BENGALI SIGN VISARGA        # 
+0C03 ; 0983 ;  MA      # ( ః → ঃ ) TELUGU SIGN VISARGA → BENGALI SIGN VISARGA  # →ਃ→
+0C83 ; 0983 ;  MA      # ( ಃ → ঃ ) KANNADA SIGN VISARGA → BENGALI SIGN VISARGA # →ః→→ਃ→
+0D03 ; 0983 ;  MA      # ( ഃ → ঃ ) MALAYALAM SIGN VISARGA → BENGALI SIGN VISARGA       # →ಃ→→ః→→ਃ→
+0D83 ; 0983 ;  MA      # ( ඃ → ঃ ) SINHALA SIGN VISARGAYA → BENGALI SIGN VISARGA       # →ഃ→→ಃ→→ః→→ਃ→
+1038 ; 0983 ;  MA      # ( း → ঃ ) MYANMAR SIGN VISARGA → BENGALI SIGN VISARGA # →ඃ→→ഃ→→ಃ→→ః→→ਃ→
+
+17CB ; 0E48 ;  MA      # ( ់ → ่ ) KHMER SIGN BANTOC → THAI CHARACTER MAI EK   # 
+0EC8 ; 0E48 ;  MA      # ( ່ → ่ ) LAO TONE MAI EK → THAI CHARACTER MAI EK     # 
+
+0EC9 ; 0E49 ;  MA      # ( ້ → ้ ) LAO TONE MAI THO → THAI CHARACTER MAI THO   # 
+
+0ECA ; 0E4A ;  MA      # ( ໊ → ๊ ) LAO TONE MAI TI → THAI CHARACTER MAI TRI    # 
+
+0ECB ; 0E4B ;  MA      # ( ໋ → ๋ ) LAO TONE MAI CATAWA → THAI CHARACTER MAI CHATTAWA   # 
+
+309B ; FF9E ;  MA      #* ( ゛ → ゙ ) KATAKANA-HIRAGANA VOICED SOUND MARK → HALFWIDTH KATAKANA VOICED SOUND MARK # 
+
+309C ; FF9F ;  MA      #* ( ゜ → ゚ ) KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK → HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK       # 
+
+180E ; 0020 ;  MA      #* ( ᠎ →   ) MONGOLIAN VOWEL SEPARATOR → SPACE    # 
+2028 ; 0020 ;  MA      #* (  →   ) LINE SEPARATOR → SPACE  # 
+2029 ; 0020 ;  MA      #* (  →   ) PARAGRAPH SEPARATOR → SPACE     # 
+2000 ; 0020 ;  MA      #* (   →   ) EN QUAD → SPACE      # 
+2001 ; 0020 ;  MA      #* (   →   ) EM QUAD → SPACE      # 
+2002 ; 0020 ;  MA      #* (   →   ) EN SPACE → SPACE     # 
+2003 ; 0020 ;  MA      #* (   →   ) EM SPACE → SPACE     # 
+2004 ; 0020 ;  MA      #* (   →   ) THREE-PER-EM SPACE → SPACE   # 
+2005 ; 0020 ;  MA      #* (   →   ) FOUR-PER-EM SPACE → SPACE    # 
+2006 ; 0020 ;  MA      #* (   →   ) SIX-PER-EM SPACE → SPACE     # 
+2008 ; 0020 ;  MA      #* (   →   ) PUNCTUATION SPACE → SPACE    # 
+2009 ; 0020 ;  MA      #* (   →   ) THIN SPACE → SPACE   # 
+200A ; 0020 ;  MA      #* (   →   ) HAIR SPACE → SPACE   # 
+205F ; 0020 ;  MA      #* (   →   ) MEDIUM MATHEMATICAL SPACE → SPACE    # 
+00A0 ; 0020 ;  MA      #* (   →   ) NO-BREAK SPACE → SPACE        # 
+2007 ; 0020 ;  MA      #* (   →   ) FIGURE SPACE → SPACE # 
+202F ; 0020 ;  MA      #* (   →   ) NARROW NO-BREAK SPACE → SPACE        # 
+1680 ; 0020 ;  MA      #* (   →   ) OGHAM SPACE MARK → SPACE     # 
+
+02C4 ; 005E ;  MA      #* ( ˄ → ^ ) MODIFIER LETTER UP ARROWHEAD → CIRCUMFLEX ACCENT      # 
+02C6 ; 005E ;  MA      # ( ˆ → ^ ) MODIFIER LETTER CIRCUMFLEX ACCENT → CIRCUMFLEX ACCENT  # 
+
+07FA ; 005F ;  MA      # ( ‎ߺ‎ → _ ) NKO LAJANYALAN → LOW LINE        # 
+FE4D ; 005F ;  MA      # ( ﹍ → _ ) DASHED LOW LINE → LOW LINE    # 
+FE4E ; 005F ;  MA      # ( ﹎ → _ ) CENTRELINE LOW LINE → LOW LINE        # 
+FE4F ; 005F ;  MA      # ( ﹏ → _ ) WAVY LOW LINE → LOW LINE      # 
+
+2307 ; FE34 ;  MA      #* ( ⌇ → ︴ ) WAVY LINE → PRESENTATION FORM FOR VERTICAL WAVY LOW LINE   # 
+
+2010 ; 002D ;  MA      #* ( ‐ → - ) HYPHEN → HYPHEN-MINUS        # 
+2011 ; 002D ;  MA      #* ( ‑ → - ) NON-BREAKING HYPHEN → HYPHEN-MINUS   # 
+2012 ; 002D ;  MA      #* ( ‒ → - ) FIGURE DASH → HYPHEN-MINUS   # 
+2013 ; 002D ;  MA      #* ( – → - ) EN DASH → HYPHEN-MINUS       # 
+FE58 ; 002D ;  MA      #* ( ﹘ → - ) SMALL EM DASH → HYPHEN-MINUS # 
+2043 ; 002D ;  MA      #* ( ⁃ → - ) HYPHEN BULLET → HYPHEN-MINUS # →‒→
+02D7 ; 002D ;  MA      #* ( ˗ → - ) MODIFIER LETTER MINUS SIGN → HYPHEN-MINUS     # 
+2212 ; 002D ;  MA      #* ( − → - ) MINUS SIGN → HYPHEN-MINUS    # 
+2CBA ; 002D ;  MA      # ( Ⲻ → - ) COPTIC CAPITAL LETTER DIALECT-P NI → HYPHEN-MINUS     # →‒→
+
+A4FE ; 002D 002E ;     MA      #* ( ꓾ → -. ) LISU PUNCTUATION COMMA → HYPHEN-MINUS, FULL STOP    # 
+
+FF5E ; 301C ;  MA      #* ( ~ → 〜 ) FULLWIDTH TILDE → WAVE DASH        # 
+
+00B8 ; 002C ;  MA      #* ( ¸ → , ) CEDILLA → COMMA       # 
+066B ; 002C ;  MA      #* ( ‎٫‎ → , ) ARABIC DECIMAL SEPARATOR → COMMA        # 
+201A ; 002C ;  MA      #* ( ‚ → , ) SINGLE LOW-9 QUOTATION MARK → COMMA  # 
+
+066C ; 060C ;  MA      #* ( ‎٬‎ → ، ) ARABIC THOUSANDS SEPARATOR → ARABIC COMMA      # 
+
+037E ; 003B ;  MA      #* ( ; → ; ) GREEK QUESTION MARK → SEMICOLON       # 
+
+0903 ; 003A ;  MA      # ( ः → : ) DEVANAGARI SIGN VISARGA → COLON       # 
+0A83 ; 003A ;  MA      # ( ઃ → : ) GUJARATI SIGN VISARGA → COLON # 
+FF1A ; 003A ;  MA      #* ( : → : ) FULLWIDTH COLON → COLON      # →︰→
+0589 ; 003A ;  MA      #* ( ։ → : ) ARMENIAN FULL STOP → COLON    # 
+0703 ; 003A ;  MA      #* ( ‎܃‎ → : ) SYRIAC SUPRALINEAR COLON → COLON        # 
+0704 ; 003A ;  MA      #* ( ‎܄‎ → : ) SYRIAC SUBLINEAR COLON → COLON  # 
+FE30 ; 003A ;  MA      #* ( ︰ → : ) PRESENTATION FORM FOR VERTICAL TWO DOT LEADER → COLON        # 
+1803 ; 003A ;  MA      #* ( ᠃ → : ) MONGOLIAN FULL STOP → COLON  # 
+1809 ; 003A ;  MA      #* ( ᠉ → : ) MONGOLIAN MANCHU FULL STOP → COLON   # 
+205A ; 003A ;  MA      #* ( ⁚ → : ) TWO DOT PUNCTUATION → COLON  # 
+05C3 ; 003A ;  MA      #* ( ‎׃‎ → : ) HEBREW PUNCTUATION SOF PASUQ → COLON    # 
+02F8 ; 003A ;  MA      #* ( ˸ → : ) MODIFIER LETTER RAISED COLON → COLON  # 
+A789 ; 003A ;  MA      #* ( ꞉ → : ) MODIFIER LETTER COLON → COLON        # 
+2236 ; 003A ;  MA      #* ( ∶ → : ) RATIO → COLON        # 
+02D0 ; 003A ;  MA      # ( ː → : ) MODIFIER LETTER TRIANGULAR COLON → COLON       # 
+A4FD ; 003A ;  MA      # ( ꓽ → : ) LISU LETTER TONE MYA JEU → COLON      # 
+
+2A74 ; 003A 003A 003D ;        MA      #* ( ⩴ → ::= ) DOUBLE COLON EQUAL → COLON, COLON, EQUALS SIGN     # 
+
+FF01 ; 0021 ;  MA      #* ( ! → ! ) FULLWIDTH EXCLAMATION MARK → EXCLAMATION MARK        # →ǃ→
+01C3 ; 0021 ;  MA      # ( ǃ → ! ) LATIN LETTER RETROFLEX CLICK → EXCLAMATION MARK        # 
+
+203C ; 0021 0021 ;     MA      #* ( ‼ → !! ) DOUBLE EXCLAMATION MARK → EXCLAMATION MARK, EXCLAMATION MARK        # 
+
+2049 ; 0021 003F ;     MA      #* ( ⁉ → !? ) EXCLAMATION QUESTION MARK → EXCLAMATION MARK, QUESTION MARK # 
+
+0294 ; 003F ;  MA      # ( ʔ → ? ) LATIN LETTER GLOTTAL STOP → QUESTION MARK      # 
+0241 ; 003F ;  MA      # ( Ɂ → ? ) LATIN CAPITAL LETTER GLOTTAL STOP → QUESTION MARK      # →ʔ→
+097D ; 003F ;  MA      # ( ॽ → ? ) DEVANAGARI LETTER GLOTTAL STOP → QUESTION MARK        # 
+
+2048 ; 003F 0021 ;     MA      #* ( ⁈ → ?! ) QUESTION EXCLAMATION MARK → QUESTION MARK, EXCLAMATION MARK # 
+
+2047 ; 003F 003F ;     MA      #* ( ⁇ → ?? ) DOUBLE QUESTION MARK → QUESTION MARK, QUESTION MARK # 
+
+1D16D ;        002E ;  MA      # ( 𝅭 → . ) MUSICAL SYMBOL COMBINING AUGMENTATION DOT → FULL STOP        # 
+2024 ; 002E ;  MA      #* ( ․ → . ) ONE DOT LEADER → FULL STOP   # 
+06D4 ; 002E ;  MA      #* ( ‎۔‎ → . ) ARABIC FULL STOP → FULL STOP    # 
+0701 ; 002E ;  MA      #* ( ‎܁‎ → . ) SYRIAC SUPRALINEAR FULL STOP → FULL STOP        # 
+0702 ; 002E ;  MA      #* ( ‎܂‎ → . ) SYRIAC SUBLINEAR FULL STOP → FULL STOP  # 
+A60E ; 002E ;  MA      #* ( ꘎ → . ) VAI FULL STOP → FULL STOP    # 
+10A50 ;        002E ;  MA      #* ( ‎𐩐‎ → . ) KHAROSHTHI PUNCTUATION DOT → FULL STOP        # 
+0660 ; 002E ;  MA      # ( ‎٠‎ → . ) ARABIC-INDIC DIGIT ZERO → FULL STOP      # 
+06F0 ; 002E ;  MA      # ( ۰ → . ) EXTENDED ARABIC-INDIC DIGIT ZERO → FULL STOP   # →‎٠‎→
+A4F8 ; 002E ;  MA      # ( ꓸ → . ) LISU LETTER TONE MYA TI → FULL STOP   # 
+A4FB ; 002E ;  MA      # ( ꓻ → . ) LISU LETTER TONE MYA BO → FULL STOP   # 
+
+2025 ; 002E 002E ;     MA      #* ( ‥ → .. ) TWO DOT LEADER → FULL STOP, FULL STOP       # 
+A4FA ; 002E 002E ;     MA      # ( ꓺ → .. ) LISU LETTER TONE MYA CYA → FULL STOP, FULL STOP      # 
+
+2026 ; 002E 002E 002E ;        MA      #* ( … → ... ) HORIZONTAL ELLIPSIS → FULL STOP, FULL STOP, FULL STOP      # 
+
+30FB ; 00B7 ;  MA      #* ( ・ → · ) KATAKANA MIDDLE DOT → MIDDLE DOT    # →•→
+FF65 ; 00B7 ;  MA      #* ( ・ → · ) HALFWIDTH KATAKANA MIDDLE DOT → MIDDLE DOT  # →•→
+0387 ; 00B7 ;  MA      # ( · → · ) GREEK ANO TELEIA → MIDDLE DOT # 
+10101 ;        00B7 ;  MA      #* ( 𐄁 → · ) AEGEAN WORD SEPARATOR DOT → MIDDLE DOT     # 
+2022 ; 00B7 ;  MA      #* ( • → · ) BULLET → MIDDLE DOT # 
+2027 ; 00B7 ;  MA      #* ( ‧ → · ) HYPHENATION POINT → MIDDLE DOT      # 
+2219 ; 00B7 ;  MA      #* ( ∙ → · ) BULLET OPERATOR → MIDDLE DOT        # 
+22C5 ; 00B7 ;  MA      #* ( ⋅ → · ) DOT OPERATOR → MIDDLE DOT   # 
+1427 ; 00B7 ;  MA      # ( ᐧ → · ) CANADIAN SYLLABICS FINAL MIDDLE DOT → MIDDLE DOT     # 
+
+22EF ; 00B7 00B7 00B7 ;        MA      #* ( ⋯ → ··· ) MIDLINE HORIZONTAL ELLIPSIS → MIDDLE DOT, MIDDLE DOT, MIDDLE DOT        # 
+
+152F ; 00B7 0034 ;     MA      # ( ᔯ → ·4 ) CANADIAN SYLLABICS YWE → MIDDLE DOT, DIGIT FOUR     # →ᐧ4→
+
+147A ; 00B7 0064 ;     MA      # ( ᑺ → ·d ) CANADIAN SYLLABICS KWO → MIDDLE DOT, LATIN SMALL LETTER D   # →ᐧᑯ→
+
+1498 ; 00B7 004A ;     MA      # ( ᒘ → ·J ) CANADIAN SYLLABICS CWO → MIDDLE DOT, LATIN CAPITAL LETTER J # →ᐧᒍ→
+
+14B6 ; 00B7 004C ;     MA      # ( ᒶ → ·L ) CANADIAN SYLLABICS MWA → MIDDLE DOT, LATIN CAPITAL LETTER L # →ᐧL→
+
+1476 ; 00B7 0050 ;     MA      # ( ᑶ → ·P ) CANADIAN SYLLABICS KWI → MIDDLE DOT, LATIN CAPITAL LETTER P # →ᐧᑭ→
+
+1457 ; 00B7 0055 ;     MA      # ( ᑗ → ·U ) CANADIAN SYLLABICS TWE → MIDDLE DOT, LATIN CAPITAL LETTER U # →ᐧᑌ→→·ᑌ→
+
+140C ; 00B7 1401 ;     MA      # ( ᐌ → ·ᐁ ) CANADIAN SYLLABICS WE → MIDDLE DOT, CANADIAN SYLLABICS E  # →ᐧᐁ→
+
+140E ; 00B7 1403 ;     MA      # ( ᐎ → ·ᐃ ) CANADIAN SYLLABICS WI → MIDDLE DOT, CANADIAN SYLLABICS I  # →ᐧᐃ→
+
+1410 ; 00B7 1404 ;     MA      # ( ᐐ → ·ᐄ ) CANADIAN SYLLABICS WII → MIDDLE DOT, CANADIAN SYLLABICS II        # →ᐧᐄ→
+
+1412 ; 00B7 1405 ;     MA      # ( ᐒ → ·ᐅ ) CANADIAN SYLLABICS WO → MIDDLE DOT, CANADIAN SYLLABICS O  # →ᐧᐅ→
+
+1414 ; 00B7 1406 ;     MA      # ( ᐔ → ·ᐆ ) CANADIAN SYLLABICS WOO → MIDDLE DOT, CANADIAN SYLLABICS OO        # →ᐧᐆ→
+
+1417 ; 00B7 140A ;     MA      # ( ᐗ → ·ᐊ ) CANADIAN SYLLABICS WA → MIDDLE DOT, CANADIAN SYLLABICS A  # →ᐧᐊ→
+
+1419 ; 00B7 140B ;     MA      # ( ᐙ → ·ᐋ ) CANADIAN SYLLABICS WAA → MIDDLE DOT, CANADIAN SYLLABICS AA        # →ᐧᐋ→
+
+2CFE ; 00B7 1433 ;     MA      #* ( ⳾ → ·ᐳ ) COPTIC FULL STOP → MIDDLE DOT, CANADIAN SYLLABICS PO     # →ᑀ→→ᐧᐳ→
+1437 ; 00B7 1433 ;     MA      # ( ᐷ → ·ᐳ ) CANADIAN SYLLABICS CARRIER HI → MIDDLE DOT, CANADIAN SYLLABICS PO # →ᑀ→→ᐧᐳ→
+1440 ; 00B7 1433 ;     MA      # ( ᑀ → ·ᐳ ) CANADIAN SYLLABICS PWO → MIDDLE DOT, CANADIAN SYLLABICS PO        # →ᐧᐳ→
+
+1442 ; 00B7 1434 ;     MA      # ( ᑂ → ·ᐴ ) CANADIAN SYLLABICS PWOO → MIDDLE DOT, CANADIAN SYLLABICS POO      # →ᐧᐴ→
+
+1444 ; 00B7 1438 ;     MA      # ( ᑄ → ·ᐸ ) CANADIAN SYLLABICS PWA → MIDDLE DOT, CANADIAN SYLLABICS PA        # →ᐧᐸ→
+
+1446 ; 00B7 1439 ;     MA      # ( ᑆ → ·ᐹ ) CANADIAN SYLLABICS PWAA → MIDDLE DOT, CANADIAN SYLLABICS PAA      # →ᐧᐹ→
+
+1459 ; 00B7 144E ;     MA      # ( ᑙ → ·ᑎ ) CANADIAN SYLLABICS TWI → MIDDLE DOT, CANADIAN SYLLABICS TI        # →ᐧᑎ→
+
+145B ; 00B7 144F ;     MA      # ( ᑛ → ·ᑏ ) CANADIAN SYLLABICS TWII → MIDDLE DOT, CANADIAN SYLLABICS TII      # →ᐧᑏ→
+
+1454 ; 00B7 1450 ;     MA      # ( ᑔ → ·ᑐ ) CANADIAN SYLLABICS CARRIER DI → MIDDLE DOT, CANADIAN SYLLABICS TO # →ᑝ→→ᐧᑐ→
+145D ; 00B7 1450 ;     MA      # ( ᑝ → ·ᑐ ) CANADIAN SYLLABICS TWO → MIDDLE DOT, CANADIAN SYLLABICS TO        # →ᐧᑐ→
+
+145F ; 00B7 1451 ;     MA      # ( ᑟ → ·ᑑ ) CANADIAN SYLLABICS TWOO → MIDDLE DOT, CANADIAN SYLLABICS TOO      # →ᐧᑑ→
+
+1461 ; 00B7 1455 ;     MA      # ( ᑡ → ·ᑕ ) CANADIAN SYLLABICS TWA → MIDDLE DOT, CANADIAN SYLLABICS TA        # →ᐧᑕ→
+
+1463 ; 00B7 1456 ;     MA      # ( ᑣ → ·ᑖ ) CANADIAN SYLLABICS TWAA → MIDDLE DOT, CANADIAN SYLLABICS TAA      # →ᐧᑖ→
+
+1474 ; 00B7 146B ;     MA      # ( ᑴ → ·ᑫ ) CANADIAN SYLLABICS KWE → MIDDLE DOT, CANADIAN SYLLABICS KE        # →ᐧᑫ→
+
+1478 ; 00B7 146E ;     MA      # ( ᑸ → ·ᑮ ) CANADIAN SYLLABICS KWII → MIDDLE DOT, CANADIAN SYLLABICS KII      # →ᐧᑮ→
+
+147C ; 00B7 1470 ;     MA      # ( ᑼ → ·ᑰ ) CANADIAN SYLLABICS KWOO → MIDDLE DOT, CANADIAN SYLLABICS KOO      # →ᐧᑰ→
+
+147E ; 00B7 1472 ;     MA      # ( ᑾ → ·ᑲ ) CANADIAN SYLLABICS KWA → MIDDLE DOT, CANADIAN SYLLABICS KA        # →ᐧᑲ→
+
+1480 ; 00B7 1473 ;     MA      # ( ᒀ → ·ᑳ ) CANADIAN SYLLABICS KWAA → MIDDLE DOT, CANADIAN SYLLABICS KAA      # →ᐧᑳ→
+
+1492 ; 00B7 1489 ;     MA      # ( ᒒ → ·ᒉ ) CANADIAN SYLLABICS CWE → MIDDLE DOT, CANADIAN SYLLABICS CE        # →ᐧᒉ→
+
+1494 ; 00B7 148B ;     MA      # ( ᒔ → ·ᒋ ) CANADIAN SYLLABICS CWI → MIDDLE DOT, CANADIAN SYLLABICS CI        # →ᐧᒋ→
+
+1496 ; 00B7 148C ;     MA      # ( ᒖ → ·ᒌ ) CANADIAN SYLLABICS CWII → MIDDLE DOT, CANADIAN SYLLABICS CII      # →ᐧᒌ→
+
+149A ; 00B7 148E ;     MA      # ( ᒚ → ·ᒎ ) CANADIAN SYLLABICS CWOO → MIDDLE DOT, CANADIAN SYLLABICS COO      # →ᐧᒎ→
+
+149C ; 00B7 1490 ;     MA      # ( ᒜ → ·ᒐ ) CANADIAN SYLLABICS CWA → MIDDLE DOT, CANADIAN SYLLABICS CA        # →ᐧᒐ→
+
+149E ; 00B7 1491 ;     MA      # ( ᒞ → ·ᒑ ) CANADIAN SYLLABICS CWAA → MIDDLE DOT, CANADIAN SYLLABICS CAA      # →ᐧᒑ→
+
+14AC ; 00B7 14A3 ;     MA      # ( ᒬ → ·ᒣ ) CANADIAN SYLLABICS MWE → MIDDLE DOT, CANADIAN SYLLABICS ME        # →ᐧᒣ→
+
+14AE ; 00B7 14A5 ;     MA      # ( ᒮ → ·ᒥ ) CANADIAN SYLLABICS MWI → MIDDLE DOT, CANADIAN SYLLABICS MI        # →ᐧᒥ→
+
+14B0 ; 00B7 14A6 ;     MA      # ( ᒰ → ·ᒦ ) CANADIAN SYLLABICS MWII → MIDDLE DOT, CANADIAN SYLLABICS MII      # →ᐧᒦ→
+
+14B2 ; 00B7 14A7 ;     MA      # ( ᒲ → ·ᒧ ) CANADIAN SYLLABICS MWO → MIDDLE DOT, CANADIAN SYLLABICS MO        # →ᐧᒧ→
+
+14B4 ; 00B7 14A8 ;     MA      # ( ᒴ → ·ᒨ ) CANADIAN SYLLABICS MWOO → MIDDLE DOT, CANADIAN SYLLABICS MOO      # →ᐧᒨ→
+
+14B8 ; 00B7 14AB ;     MA      # ( ᒸ → ·ᒫ ) CANADIAN SYLLABICS MWAA → MIDDLE DOT, CANADIAN SYLLABICS MAA      # →ᐧᒫ→
+
+14C9 ; 00B7 14C0 ;     MA      # ( ᓉ → ·ᓀ ) CANADIAN SYLLABICS NWE → MIDDLE DOT, CANADIAN SYLLABICS NE        # →ᐧᓀ→
+
+14CB ; 00B7 14C7 ;     MA      # ( ᓋ → ·ᓇ ) CANADIAN SYLLABICS NWA → MIDDLE DOT, CANADIAN SYLLABICS NA        # →ᐧᓇ→
+
+14CD ; 00B7 14C8 ;     MA      # ( ᓍ → ·ᓈ ) CANADIAN SYLLABICS NWAA → MIDDLE DOT, CANADIAN SYLLABICS NAA      # →ᐧᓈ→
+
+14DC ; 00B7 14D3 ;     MA      # ( ᓜ → ·ᓓ ) CANADIAN SYLLABICS LWE → MIDDLE DOT, CANADIAN SYLLABICS LE        # →ᐧᓓ→
+
+14DE ; 00B7 14D5 ;     MA      # ( ᓞ → ·ᓕ ) CANADIAN SYLLABICS LWI → MIDDLE DOT, CANADIAN SYLLABICS LI        # →ᐧᓕ→
+
+14E0 ; 00B7 14D6 ;     MA      # ( ᓠ → ·ᓖ ) CANADIAN SYLLABICS LWII → MIDDLE DOT, CANADIAN SYLLABICS LII      # →ᐧᓖ→
+
+14E2 ; 00B7 14D7 ;     MA      # ( ᓢ → ·ᓗ ) CANADIAN SYLLABICS LWO → MIDDLE DOT, CANADIAN SYLLABICS LO        # →ᐧᓗ→
+
+14E4 ; 00B7 14D8 ;     MA      # ( ᓤ → ·ᓘ ) CANADIAN SYLLABICS LWOO → MIDDLE DOT, CANADIAN SYLLABICS LOO      # →ᐧᓘ→
+
+14E6 ; 00B7 14DA ;     MA      # ( ᓦ → ·ᓚ ) CANADIAN SYLLABICS LWA → MIDDLE DOT, CANADIAN SYLLABICS LA        # →ᐧᓚ→
+
+14E8 ; 00B7 14DB ;     MA      # ( ᓨ → ·ᓛ ) CANADIAN SYLLABICS LWAA → MIDDLE DOT, CANADIAN SYLLABICS LAA      # →ᐧᓛ→
+
+14F6 ; 00B7 14ED ;     MA      # ( ᓶ → ·ᓭ ) CANADIAN SYLLABICS SWE → MIDDLE DOT, CANADIAN SYLLABICS SE        # →ᐧᓭ→
+
+14F8 ; 00B7 14EF ;     MA      # ( ᓸ → ·ᓯ ) CANADIAN SYLLABICS SWI → MIDDLE DOT, CANADIAN SYLLABICS SI        # →ᐧᓯ→
+
+14FA ; 00B7 14F0 ;     MA      # ( ᓺ → ·ᓰ ) CANADIAN SYLLABICS SWII → MIDDLE DOT, CANADIAN SYLLABICS SII      # →ᐧᓰ→
+
+14FC ; 00B7 14F1 ;     MA      # ( ᓼ → ·ᓱ ) CANADIAN SYLLABICS SWO → MIDDLE DOT, CANADIAN SYLLABICS SO        # →ᐧᓱ→
+
+14FE ; 00B7 14F2 ;     MA      # ( ᓾ → ·ᓲ ) CANADIAN SYLLABICS SWOO → MIDDLE DOT, CANADIAN SYLLABICS SOO      # →ᐧᓲ→
+
+1500 ; 00B7 14F4 ;     MA      # ( ᔀ → ·ᓴ ) CANADIAN SYLLABICS SWA → MIDDLE DOT, CANADIAN SYLLABICS SA        # →ᐧᓴ→
+
+1502 ; 00B7 14F5 ;     MA      # ( ᔂ → ·ᓵ ) CANADIAN SYLLABICS SWAA → MIDDLE DOT, CANADIAN SYLLABICS SAA      # →ᐧᓵ→
+
+1517 ; 00B7 1510 ;     MA      # ( ᔗ → ·ᔐ ) CANADIAN SYLLABICS SHWE → MIDDLE DOT, CANADIAN SYLLABICS SHE      # →ᐧᔐ→
+
+1519 ; 00B7 1511 ;     MA      # ( ᔙ → ·ᔑ ) CANADIAN SYLLABICS SHWI → MIDDLE DOT, CANADIAN SYLLABICS SHI      # →ᐧᔑ→
+
+151B ; 00B7 1512 ;     MA      # ( ᔛ → ·ᔒ ) CANADIAN SYLLABICS SHWII → MIDDLE DOT, CANADIAN SYLLABICS SHII    # →ᐧᔒ→
+
+151D ; 00B7 1513 ;     MA      # ( ᔝ → ·ᔓ ) CANADIAN SYLLABICS SHWO → MIDDLE DOT, CANADIAN SYLLABICS SHO      # →ᐧᔓ→
+
+151F ; 00B7 1514 ;     MA      # ( ᔟ → ·ᔔ ) CANADIAN SYLLABICS SHWOO → MIDDLE DOT, CANADIAN SYLLABICS SHOO    # →ᐧᔔ→
+
+1521 ; 00B7 1515 ;     MA      # ( ᔡ → ·ᔕ ) CANADIAN SYLLABICS SHWA → MIDDLE DOT, CANADIAN SYLLABICS SHA      # →ᐧᔕ→
+
+1523 ; 00B7 1516 ;     MA      # ( ᔣ → ·ᔖ ) CANADIAN SYLLABICS SHWAA → MIDDLE DOT, CANADIAN SYLLABICS SHAA    # →ᐧᔖ→
+
+1531 ; 00B7 1528 ;     MA      # ( ᔱ → ·ᔨ ) CANADIAN SYLLABICS YWI → MIDDLE DOT, CANADIAN SYLLABICS YI        # →ᐧᔨ→
+
+1533 ; 00B7 1529 ;     MA      # ( ᔳ → ·ᔩ ) CANADIAN SYLLABICS YWII → MIDDLE DOT, CANADIAN SYLLABICS YII      # →ᐧᔩ→
+
+1535 ; 00B7 152A ;     MA      # ( ᔵ → ·ᔪ ) CANADIAN SYLLABICS YWO → MIDDLE DOT, CANADIAN SYLLABICS YO        # →ᐧᔪ→
+
+1537 ; 00B7 152B ;     MA      # ( ᔷ → ·ᔫ ) CANADIAN SYLLABICS YWOO → MIDDLE DOT, CANADIAN SYLLABICS YOO      # →ᐧᔫ→
+
+1539 ; 00B7 152D ;     MA      # ( ᔹ → ·ᔭ ) CANADIAN SYLLABICS YWA → MIDDLE DOT, CANADIAN SYLLABICS YA        # →ᐧᔭ→
+
+153B ; 00B7 152E ;     MA      # ( ᔻ → ·ᔮ ) CANADIAN SYLLABICS YWAA → MIDDLE DOT, CANADIAN SYLLABICS YAA      # →ᐧᔮ→
+
+154E ; 00B7 154C ;     MA      # ( ᕎ → ·ᕌ ) CANADIAN SYLLABICS RWAA → MIDDLE DOT, CANADIAN SYLLABICS RAA      # →ᐧᕌ→
+
+155B ; 00B7 155A ;     MA      # ( ᕛ → ·ᕚ ) CANADIAN SYLLABICS FWAA → MIDDLE DOT, CANADIAN SYLLABICS FAA      # →ᐧᕚ→
+
+1568 ; 00B7 1567 ;     MA      # ( ᕨ → ·ᕧ ) CANADIAN SYLLABICS THWAA → MIDDLE DOT, CANADIAN SYLLABICS THAA    # →ᐧᕧ→
+
+FE19 ; 205D ;  MA      #* ( ︙ → ⁝ ) PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS → TRICOLON      # 
+22EE ; 205D ;  MA      #* ( ⋮ → ⁝ ) VERTICAL ELLIPSIS → TRICOLON       # →︙→
+
+0060 ; 0027 ;  MA      #* ( ` → ' ) GRAVE ACCENT → APOSTROPHE      # →ˋ→→`→→‘→
+1FEF ; 0027 ;  MA      #* ( ` → ' ) GREEK VARIA → APOSTROPHE     # →ˋ→→`→→‘→
+FF40 ; 0027 ;  MA      #* ( ` → ' ) FULLWIDTH GRAVE ACCENT → APOSTROPHE  # →‘→
+00B4 ; 0027 ;  MA      #* ( ´ → ' ) ACUTE ACCENT → APOSTROPHE     # →΄→→ʹ→
+0384 ; 0027 ;  MA      #* ( ΄ → ' ) GREEK TONOS → APOSTROPHE      # →ʹ→
+1FFD ; 0027 ;  MA      #* ( ´ → ' ) GREEK OXIA → APOSTROPHE      # →ˊ→→ʹ→→′→
+1FBD ; 0027 ;  MA      #* ( ᾽ → ' ) GREEK KORONIS → APOSTROPHE   # →’→
+1FBF ; 0027 ;  MA      #* ( ᾿ → ' ) GREEK PSILI → APOSTROPHE     # →’→
+1FFE ; 0027 ;  MA      #* ( ῾ → ' ) GREEK DASIA → APOSTROPHE     # →‛→→′→
+055D ; 0027 ;  MA      #* ( ՝ → ' ) ARMENIAN COMMA → APOSTROPHE   # →ˋ→→`→→‘→
+FF07 ; 0027 ;  MA      #* ( ' → ' ) FULLWIDTH APOSTROPHE → APOSTROPHE    # →’→
+2018 ; 0027 ;  MA      #* ( ‘ → ' ) LEFT SINGLE QUOTATION MARK → APOSTROPHE      # 
+2019 ; 0027 ;  MA      #* ( ’ → ' ) RIGHT SINGLE QUOTATION MARK → APOSTROPHE     # 
+201B ; 0027 ;  MA      #* ( ‛ → ' ) SINGLE HIGH-REVERSED-9 QUOTATION MARK → APOSTROPHE   # →′→
+2032 ; 0027 ;  MA      #* ( ′ → ' ) PRIME → APOSTROPHE   # 
+2035 ; 0027 ;  MA      #* ( ‵ → ' ) REVERSED PRIME → APOSTROPHE  # →ʽ→→‘→
+055A ; 0027 ;  MA      #* ( ՚ → ' ) ARMENIAN APOSTROPHE → APOSTROPHE      # →’→
+05F3 ; 0027 ;  MA      #* ( ‎׳‎ → ' ) HEBREW PUNCTUATION GERESH → APOSTROPHE  # 
+02B9 ; 0027 ;  MA      # ( ʹ → ' ) MODIFIER LETTER PRIME → APOSTROPHE     # 
+0374 ; 0027 ;  MA      # ( ʹ → ' ) GREEK NUMERAL SIGN → APOSTROPHE        # →′→
+02CA ; 0027 ;  MA      # ( ˊ → ' ) MODIFIER LETTER ACUTE ACCENT → APOSTROPHE      # →ʹ→→′→
+02CB ; 0027 ;  MA      # ( ˋ → ' ) MODIFIER LETTER GRAVE ACCENT → APOSTROPHE      # →`→→‘→
+02F4 ; 0027 ;  MA      #* ( ˴ → ' ) MODIFIER LETTER MIDDLE GRAVE ACCENT → APOSTROPHE      # →ˋ→→`→→‘→
+02BB ; 0027 ;  MA      # ( ʻ → ' ) MODIFIER LETTER TURNED COMMA → APOSTROPHE      # →‘→
+02BD ; 0027 ;  MA      # ( ʽ → ' ) MODIFIER LETTER REVERSED COMMA → APOSTROPHE    # →‘→
+02BC ; 0027 ;  MA      # ( ʼ → ' ) MODIFIER LETTER APOSTROPHE → APOSTROPHE        # →′→
+02BE ; 0027 ;  MA      # ( ʾ → ' ) MODIFIER LETTER RIGHT HALF RING → APOSTROPHE   # →ʼ→→′→
+A78C ; 0027 ;  MA      # ( ꞌ → ' ) LATIN SMALL LETTER SALTILLO → APOSTROPHE      # 
+05D9 ; 0027 ;  MA      # ( ‎י‎ → ' ) HEBREW LETTER YOD → APOSTROPHE   # 
+07F4 ; 0027 ;  MA      # ( ‎ߴ‎ → ' ) NKO HIGH TONE APOSTROPHE → APOSTROPHE    # →’→
+07F5 ; 0027 ;  MA      # ( ‎ߵ‎ → ' ) NKO LOW TONE APOSTROPHE → APOSTROPHE     # →‘→
+
+02DD ; 0027 0027 ;     MA      #* ( ˝ → '' ) DOUBLE ACUTE ACCENT → APOSTROPHE, APOSTROPHE # →"→
+0022 ; 0027 0027 ;     MA      #* ( " → '' ) QUOTATION MARK → APOSTROPHE, APOSTROPHE       # 
+FF02 ; 0027 0027 ;     MA      #* ( " → '' ) FULLWIDTH QUOTATION MARK → APOSTROPHE, APOSTROPHE   # →”→→"→
+201C ; 0027 0027 ;     MA      #* ( “ → '' ) LEFT DOUBLE QUOTATION MARK → APOSTROPHE, APOSTROPHE # →"→
+201D ; 0027 0027 ;     MA      #* ( ” → '' ) RIGHT DOUBLE QUOTATION MARK → APOSTROPHE, APOSTROPHE        # →"→
+201F ; 0027 0027 ;     MA      #* ( ‟ → '' ) DOUBLE HIGH-REVERSED-9 QUOTATION MARK → APOSTROPHE, APOSTROPHE      # →”→→"→
+2033 ; 0027 0027 ;     MA      #* ( ″ → '' ) DOUBLE PRIME → APOSTROPHE, APOSTROPHE       # →"→
+2036 ; 0027 0027 ;     MA      #* ( ‶ → '' ) REVERSED DOUBLE PRIME → APOSTROPHE, APOSTROPHE      # →‵‵→
+3003 ; 0027 0027 ;     MA      #* ( 〃 → '' ) DITTO MARK → APOSTROPHE, APOSTROPHE # →″→→"→
+05F4 ; 0027 0027 ;     MA      #* ( ‎״‎ → '' ) HEBREW PUNCTUATION GERSHAYIM → APOSTROPHE, APOSTROPHE  # →"→
+02BA ; 0027 0027 ;     MA      # ( ʺ → '' ) MODIFIER LETTER DOUBLE PRIME → APOSTROPHE, APOSTROPHE # →"→
+02F6 ; 0027 0027 ;     MA      #* ( ˶ → '' ) MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT → APOSTROPHE, APOSTROPHE  # →˝→→"→
+02EE ; 0027 0027 ;     MA      # ( ˮ → '' ) MODIFIER LETTER DOUBLE APOSTROPHE → APOSTROPHE, APOSTROPHE    # →″→→"→
+05F2 ; 0027 0027 ;     MA      # ( ‎ײ‎ → '' ) HEBREW LIGATURE YIDDISH DOUBLE YOD → APOSTROPHE, APOSTROPHE     # →‎יי‎→
+
+2034 ; 0027 0027 0027 ;        MA      #* ( ‴ → ''' ) TRIPLE PRIME → APOSTROPHE, APOSTROPHE, APOSTROPHE  # →′′′→
+2037 ; 0027 0027 0027 ;        MA      #* ( ‷ → ''' ) REVERSED TRIPLE PRIME → APOSTROPHE, APOSTROPHE, APOSTROPHE # →‵‵‵→
+
+2057 ; 0027 0027 0027 0027 ;   MA      #* ( ⁗ → '''' ) QUADRUPLE PRIME → APOSTROPHE, APOSTROPHE, APOSTROPHE, APOSTROPHE  # →′′′′→
+
+0181 ; 0027 0042 ;     MA      # ( Ɓ → 'B ) LATIN CAPITAL LETTER B WITH HOOK → APOSTROPHE, LATIN CAPITAL LETTER B # →ʽB→
+
+018A ; 0027 0044 ;     MA      # ( Ɗ → 'D ) LATIN CAPITAL LETTER D WITH HOOK → APOSTROPHE, LATIN CAPITAL LETTER D # →ʽD→
+
+0149 ; 0027 006E ;     MA      # ( ʼn → 'n ) LATIN SMALL LETTER N PRECEDED BY APOSTROPHE → APOSTROPHE, LATIN SMALL LETTER N        # →ʼn→
+
+01A4 ; 0027 0050 ;     MA      # ( Ƥ → 'P ) LATIN CAPITAL LETTER P WITH HOOK → APOSTROPHE, LATIN CAPITAL LETTER P # →ʽP→
+
+01AC ; 0027 0054 ;     MA      # ( Ƭ → 'T ) LATIN CAPITAL LETTER T WITH HOOK → APOSTROPHE, LATIN CAPITAL LETTER T # →ʽT→
+
+01B3 ; 0027 0059 ;     MA      # ( Ƴ → 'Y ) LATIN CAPITAL LETTER Y WITH HOOK → APOSTROPHE, LATIN CAPITAL LETTER Y # →ʽY→
+
+FF3B ; 0028 ;  MA      #* ( [ → ( ) FULLWIDTH LEFT SQUARE BRACKET → LEFT PARENTHESIS     # →〔→
+3014 ; 0028 ;  MA      #* ( 〔 → ( ) LEFT TORTOISE SHELL BRACKET → LEFT PARENTHESIS       # 
+FD3E ; 0028 ;  MA      #* ( ﴾ → ( ) ORNATE LEFT PARENTHESIS → LEFT PARENTHESIS   # 
+2768 ; 0028 ;  MA      #* ( ❨ → ( ) MEDIUM LEFT PARENTHESIS ORNAMENT → LEFT PARENTHESIS  # 
+2772 ; 0028 ;  MA      #* ( ❲ → ( ) LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT → LEFT PARENTHESIS        # →〔→
+
+3220 ; 0028 30FC 0029 ;        MA      #* ( ㈠ → (ー) ) PARENTHESIZED IDEOGRAPH ONE → LEFT PARENTHESIS, KATAKANA-HIRAGANA PROLONGED SOUND MARK, RIGHT PARENTHESIS        # →(一)→
+
+2475 ; 0028 0032 0029 ;        MA      #* ( ⑵ → (2) ) PARENTHESIZED DIGIT TWO → LEFT PARENTHESIS, DIGIT TWO, RIGHT PARENTHESIS   # 
+
+2487 ; 0028 0032 004F 0029 ;   MA      #* ( ⒇ → (2O) ) PARENTHESIZED NUMBER TWENTY → LEFT PARENTHESIS, DIGIT TWO, LATIN CAPITAL LETTER O, RIGHT PARENTHESIS      # →(20)→
+
+2476 ; 0028 0033 0029 ;        MA      #* ( ⑶ → (3) ) PARENTHESIZED DIGIT THREE → LEFT PARENTHESIS, DIGIT THREE, RIGHT PARENTHESIS       # 
+
+2477 ; 0028 0034 0029 ;        MA      #* ( ⑷ → (4) ) PARENTHESIZED DIGIT FOUR → LEFT PARENTHESIS, DIGIT FOUR, RIGHT PARENTHESIS # 
+
+2478 ; 0028 0035 0029 ;        MA      #* ( ⑸ → (5) ) PARENTHESIZED DIGIT FIVE → LEFT PARENTHESIS, DIGIT FIVE, RIGHT PARENTHESIS # 
+
+2479 ; 0028 0036 0029 ;        MA      #* ( ⑹ → (6) ) PARENTHESIZED DIGIT SIX → LEFT PARENTHESIS, DIGIT SIX, RIGHT PARENTHESIS   # 
+
+247A ; 0028 0037 0029 ;        MA      #* ( ⑺ → (7) ) PARENTHESIZED DIGIT SEVEN → LEFT PARENTHESIS, DIGIT SEVEN, RIGHT PARENTHESIS       # 
+
+247B ; 0028 0038 0029 ;        MA      #* ( ⑻ → (8) ) PARENTHESIZED DIGIT EIGHT → LEFT PARENTHESIS, DIGIT EIGHT, RIGHT PARENTHESIS       # 
+
+247C ; 0028 0039 0029 ;        MA      #* ( ⑼ → (9) ) PARENTHESIZED DIGIT NINE → LEFT PARENTHESIS, DIGIT NINE, RIGHT PARENTHESIS # 
+
+249C ; 0028 0061 0029 ;        MA      #* ( ⒜ → (a) ) PARENTHESIZED LATIN SMALL LETTER A → LEFT PARENTHESIS, LATIN SMALL LETTER A, RIGHT PARENTHESIS     # 
+
+1F110 ;        0028 0041 0029 ;        MA      #* ( 🄐 → (A) ) PARENTHESIZED LATIN CAPITAL LETTER A → LEFT PARENTHESIS, LATIN CAPITAL LETTER A, RIGHT PARENTHESIS        # 
+
+249D ; 0028 0062 0029 ;        MA      #* ( ⒝ → (b) ) PARENTHESIZED LATIN SMALL LETTER B → LEFT PARENTHESIS, LATIN SMALL LETTER B, RIGHT PARENTHESIS     # 
+
+1F111 ;        0028 0042 0029 ;        MA      #* ( 🄑 → (B) ) PARENTHESIZED LATIN CAPITAL LETTER B → LEFT PARENTHESIS, LATIN CAPITAL LETTER B, RIGHT PARENTHESIS        # 
+
+249E ; 0028 0063 0029 ;        MA      #* ( ⒞ → (c) ) PARENTHESIZED LATIN SMALL LETTER C → LEFT PARENTHESIS, LATIN SMALL LETTER C, RIGHT PARENTHESIS     # 
+
+1F112 ;        0028 0043 0029 ;        MA      #* ( 🄒 → (C) ) PARENTHESIZED LATIN CAPITAL LETTER C → LEFT PARENTHESIS, LATIN CAPITAL LETTER C, RIGHT PARENTHESIS        # 
+
+249F ; 0028 0064 0029 ;        MA      #* ( ⒟ → (d) ) PARENTHESIZED LATIN SMALL LETTER D → LEFT PARENTHESIS, LATIN SMALL LETTER D, RIGHT PARENTHESIS     # 
+
+1F113 ;        0028 0044 0029 ;        MA      #* ( 🄓 → (D) ) PARENTHESIZED LATIN CAPITAL LETTER D → LEFT PARENTHESIS, LATIN CAPITAL LETTER D, RIGHT PARENTHESIS        # 
+
+24A0 ; 0028 0065 0029 ;        MA      #* ( ⒠ → (e) ) PARENTHESIZED LATIN SMALL LETTER E → LEFT PARENTHESIS, LATIN SMALL LETTER E, RIGHT PARENTHESIS     # 
+
+1F114 ;        0028 0045 0029 ;        MA      #* ( 🄔 → (E) ) PARENTHESIZED LATIN CAPITAL LETTER E → LEFT PARENTHESIS, LATIN CAPITAL LETTER E, RIGHT PARENTHESIS        # 
+
+24A1 ; 0028 0066 0029 ;        MA      #* ( ⒡ → (f) ) PARENTHESIZED LATIN SMALL LETTER F → LEFT PARENTHESIS, LATIN SMALL LETTER F, RIGHT PARENTHESIS     # 
+
+1F115 ;        0028 0046 0029 ;        MA      #* ( 🄕 → (F) ) PARENTHESIZED LATIN CAPITAL LETTER F → LEFT PARENTHESIS, LATIN CAPITAL LETTER F, RIGHT PARENTHESIS        # 
+
+24A2 ; 0028 0067 0029 ;        MA      #* ( ⒢ → (g) ) PARENTHESIZED LATIN SMALL LETTER G → LEFT PARENTHESIS, LATIN SMALL LETTER G, RIGHT PARENTHESIS     # 
+
+1F116 ;        0028 0047 0029 ;        MA      #* ( 🄖 → (G) ) PARENTHESIZED LATIN CAPITAL LETTER G → LEFT PARENTHESIS, LATIN CAPITAL LETTER G, RIGHT PARENTHESIS        # 
+
+24A3 ; 0028 0068 0029 ;        MA      #* ( ⒣ → (h) ) PARENTHESIZED LATIN SMALL LETTER H → LEFT PARENTHESIS, LATIN SMALL LETTER H, RIGHT PARENTHESIS     # 
+
+1F117 ;        0028 0048 0029 ;        MA      #* ( 🄗 → (H) ) PARENTHESIZED LATIN CAPITAL LETTER H → LEFT PARENTHESIS, LATIN CAPITAL LETTER H, RIGHT PARENTHESIS        # 
+
+24A4 ; 0028 0069 0029 ;        MA      #* ( ⒤ → (i) ) PARENTHESIZED LATIN SMALL LETTER I → LEFT PARENTHESIS, LATIN SMALL LETTER I, RIGHT PARENTHESIS     # 
+
+2474 ; 0028 0049 0029 ;        MA      #* ( ⑴ → (I) ) PARENTHESIZED DIGIT ONE → LEFT PARENTHESIS, LATIN CAPITAL LETTER I, RIGHT PARENTHESIS      # →(1)→→(l)→
+1F118 ;        0028 0049 0029 ;        MA      #* ( 🄘 → (I) ) PARENTHESIZED LATIN CAPITAL LETTER I → LEFT PARENTHESIS, LATIN CAPITAL LETTER I, RIGHT PARENTHESIS        # 
+24A7 ; 0028 0049 0029 ;        MA      #* ( ⒧ → (I) ) PARENTHESIZED LATIN SMALL LETTER L → LEFT PARENTHESIS, LATIN CAPITAL LETTER I, RIGHT PARENTHESIS   # →(l)→
+
+24A5 ; 0028 006A 0029 ;        MA      #* ( ⒥ → (j) ) PARENTHESIZED LATIN SMALL LETTER J → LEFT PARENTHESIS, LATIN SMALL LETTER J, RIGHT PARENTHESIS     # 
+
+1F119 ;        0028 004A 0029 ;        MA      #* ( 🄙 → (J) ) PARENTHESIZED LATIN CAPITAL LETTER J → LEFT PARENTHESIS, LATIN CAPITAL LETTER J, RIGHT PARENTHESIS        # 
+
+24A6 ; 0028 006B 0029 ;        MA      #* ( ⒦ → (k) ) PARENTHESIZED LATIN SMALL LETTER K → LEFT PARENTHESIS, LATIN SMALL LETTER K, RIGHT PARENTHESIS     # 
+
+1F11A ;        0028 004B 0029 ;        MA      #* ( 🄚 → (K) ) PARENTHESIZED LATIN CAPITAL LETTER K → LEFT PARENTHESIS, LATIN CAPITAL LETTER K, RIGHT PARENTHESIS        # 
+
+1F11B ;        0028 004C 0029 ;        MA      #* ( 🄛 → (L) ) PARENTHESIZED LATIN CAPITAL LETTER L → LEFT PARENTHESIS, LATIN CAPITAL LETTER L, RIGHT PARENTHESIS        # 
+
+247F ; 0028 006C 0032 0029 ;   MA      #* ( ⑿ → (l2) ) PARENTHESIZED NUMBER TWELVE → LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT TWO, RIGHT PARENTHESIS        # →(12)→
+
+2480 ; 0028 006C 0033 0029 ;   MA      #* ( ⒀ → (l3) ) PARENTHESIZED NUMBER THIRTEEN → LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT THREE, RIGHT PARENTHESIS    # →(13)→
+
+2481 ; 0028 006C 0034 0029 ;   MA      #* ( ⒁ → (l4) ) PARENTHESIZED NUMBER FOURTEEN → LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT FOUR, RIGHT PARENTHESIS     # →(14)→
+
+2482 ; 0028 006C 0035 0029 ;   MA      #* ( ⒂ → (l5) ) PARENTHESIZED NUMBER FIFTEEN → LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT FIVE, RIGHT PARENTHESIS      # →(15)→
+
+2483 ; 0028 006C 0036 0029 ;   MA      #* ( ⒃ → (l6) ) PARENTHESIZED NUMBER SIXTEEN → LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT SIX, RIGHT PARENTHESIS       # →(16)→
+
+2484 ; 0028 006C 0037 0029 ;   MA      #* ( ⒄ → (l7) ) PARENTHESIZED NUMBER SEVENTEEN → LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT SEVEN, RIGHT PARENTHESIS   # →(17)→
+
+2485 ; 0028 006C 0038 0029 ;   MA      #* ( ⒅ → (l8) ) PARENTHESIZED NUMBER EIGHTEEN → LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT EIGHT, RIGHT PARENTHESIS    # →(18)→
+
+2486 ; 0028 006C 0039 0029 ;   MA      #* ( ⒆ → (l9) ) PARENTHESIZED NUMBER NINETEEN → LEFT PARENTHESIS, LATIN SMALL LETTER L, DIGIT NINE, RIGHT PARENTHESIS     # →(19)→
+
+247E ; 0028 006C 006C 0029 ;   MA      #* ( ⑾ → (ll) ) PARENTHESIZED NUMBER ELEVEN → LEFT PARENTHESIS, LATIN SMALL LETTER L, LATIN SMALL LETTER L, RIGHT PARENTHESIS     # →(11)→
+
+247D ; 0028 006C 004F 0029 ;   MA      #* ( ⑽ → (lO) ) PARENTHESIZED NUMBER TEN → LEFT PARENTHESIS, LATIN SMALL LETTER L, LATIN CAPITAL LETTER O, RIGHT PARENTHESIS      # →(10)→
+
+1F11C ;        0028 004D 0029 ;        MA      #* ( 🄜 → (M) ) PARENTHESIZED LATIN CAPITAL LETTER M → LEFT PARENTHESIS, LATIN CAPITAL LETTER M, RIGHT PARENTHESIS        # 
+
+24A9 ; 0028 006E 0029 ;        MA      #* ( ⒩ → (n) ) PARENTHESIZED LATIN SMALL LETTER N → LEFT PARENTHESIS, LATIN SMALL LETTER N, RIGHT PARENTHESIS     # 
+
+1F11D ;        0028 004E 0029 ;        MA      #* ( 🄝 → (N) ) PARENTHESIZED LATIN CAPITAL LETTER N → LEFT PARENTHESIS, LATIN CAPITAL LETTER N, RIGHT PARENTHESIS        # 
+
+24AA ; 0028 006F 0029 ;        MA      #* ( ⒪ → (o) ) PARENTHESIZED LATIN SMALL LETTER O → LEFT PARENTHESIS, LATIN SMALL LETTER O, RIGHT PARENTHESIS     # 
+
+1F11E ;        0028 004F 0029 ;        MA      #* ( 🄞 → (O) ) PARENTHESIZED LATIN CAPITAL LETTER O → LEFT PARENTHESIS, LATIN CAPITAL LETTER O, RIGHT PARENTHESIS        # 
+
+24AB ; 0028 0070 0029 ;        MA      #* ( ⒫ → (p) ) PARENTHESIZED LATIN SMALL LETTER P → LEFT PARENTHESIS, LATIN SMALL LETTER P, RIGHT PARENTHESIS     # 
+
+1F11F ;        0028 0050 0029 ;        MA      #* ( 🄟 → (P) ) PARENTHESIZED LATIN CAPITAL LETTER P → LEFT PARENTHESIS, LATIN CAPITAL LETTER P, RIGHT PARENTHESIS        # 
+
+24AC ; 0028 0071 0029 ;        MA      #* ( ⒬ → (q) ) PARENTHESIZED LATIN SMALL LETTER Q → LEFT PARENTHESIS, LATIN SMALL LETTER Q, RIGHT PARENTHESIS     # 
+
+1F120 ;        0028 0051 0029 ;        MA      #* ( 🄠 → (Q) ) PARENTHESIZED LATIN CAPITAL LETTER Q → LEFT PARENTHESIS, LATIN CAPITAL LETTER Q, RIGHT PARENTHESIS        # 
+
+24AD ; 0028 0072 0029 ;        MA      #* ( ⒭ → (r) ) PARENTHESIZED LATIN SMALL LETTER R → LEFT PARENTHESIS, LATIN SMALL LETTER R, RIGHT PARENTHESIS     # 
+
+1F121 ;        0028 0052 0029 ;        MA      #* ( 🄡 → (R) ) PARENTHESIZED LATIN CAPITAL LETTER R → LEFT PARENTHESIS, LATIN CAPITAL LETTER R, RIGHT PARENTHESIS        # 
+
+24A8 ; 0028 0072 006E 0029 ;   MA      #* ( ⒨ → (rn) ) PARENTHESIZED LATIN SMALL LETTER M → LEFT PARENTHESIS, LATIN SMALL LETTER R, LATIN SMALL LETTER N, RIGHT PARENTHESIS      # →(m)→
+
+24AE ; 0028 0073 0029 ;        MA      #* ( ⒮ → (s) ) PARENTHESIZED LATIN SMALL LETTER S → LEFT PARENTHESIS, LATIN SMALL LETTER S, RIGHT PARENTHESIS     # 
+
+1F122 ;        0028 0053 0029 ;        MA      #* ( 🄢 → (S) ) PARENTHESIZED LATIN CAPITAL LETTER S → LEFT PARENTHESIS, LATIN CAPITAL LETTER S, RIGHT PARENTHESIS        # 
+1F12A ;        0028 0053 0029 ;        MA      #* ( 🄪 → (S) ) TORTOISE SHELL BRACKETED LATIN CAPITAL LETTER S → LEFT PARENTHESIS, LATIN CAPITAL LETTER S, RIGHT PARENTHESIS     # →〔S〕→
+
+24AF ; 0028 0074 0029 ;        MA      #* ( ⒯ → (t) ) PARENTHESIZED LATIN SMALL LETTER T → LEFT PARENTHESIS, LATIN SMALL LETTER T, RIGHT PARENTHESIS     # 
+
+1F123 ;        0028 0054 0029 ;        MA      #* ( 🄣 → (T) ) PARENTHESIZED LATIN CAPITAL LETTER T → LEFT PARENTHESIS, LATIN CAPITAL LETTER T, RIGHT PARENTHESIS        # 
+
+24B0 ; 0028 0075 0029 ;        MA      #* ( ⒰ → (u) ) PARENTHESIZED LATIN SMALL LETTER U → LEFT PARENTHESIS, LATIN SMALL LETTER U, RIGHT PARENTHESIS     # 
+
+1F124 ;        0028 0055 0029 ;        MA      #* ( 🄤 → (U) ) PARENTHESIZED LATIN CAPITAL LETTER U → LEFT PARENTHESIS, LATIN CAPITAL LETTER U, RIGHT PARENTHESIS        # 
+
+24B1 ; 0028 0076 0029 ;        MA      #* ( ⒱ → (v) ) PARENTHESIZED LATIN SMALL LETTER V → LEFT PARENTHESIS, LATIN SMALL LETTER V, RIGHT PARENTHESIS     # 
+
+1F125 ;        0028 0056 0029 ;        MA      #* ( 🄥 → (V) ) PARENTHESIZED LATIN CAPITAL LETTER V → LEFT PARENTHESIS, LATIN CAPITAL LETTER V, RIGHT PARENTHESIS        # 
+
+24B2 ; 0028 0076 0076 0029 ;   MA      #* ( ⒲ → (vv) ) PARENTHESIZED LATIN SMALL LETTER W → LEFT PARENTHESIS, LATIN SMALL LETTER V, LATIN SMALL LETTER V, RIGHT PARENTHESIS      # →(w)→
+
+1F126 ;        0028 0057 0029 ;        MA      #* ( 🄦 → (W) ) PARENTHESIZED LATIN CAPITAL LETTER W → LEFT PARENTHESIS, LATIN CAPITAL LETTER W, RIGHT PARENTHESIS        # 
+
+24B3 ; 0028 0078 0029 ;        MA      #* ( ⒳ → (x) ) PARENTHESIZED LATIN SMALL LETTER X → LEFT PARENTHESIS, LATIN SMALL LETTER X, RIGHT PARENTHESIS     # 
+
+1F127 ;        0028 0058 0029 ;        MA      #* ( 🄧 → (X) ) PARENTHESIZED LATIN CAPITAL LETTER X → LEFT PARENTHESIS, LATIN CAPITAL LETTER X, RIGHT PARENTHESIS        # 
+
+24B4 ; 0028 0079 0029 ;        MA      #* ( ⒴ → (y) ) PARENTHESIZED LATIN SMALL LETTER Y → LEFT PARENTHESIS, LATIN SMALL LETTER Y, RIGHT PARENTHESIS     # 
+
+1F128 ;        0028 0059 0029 ;        MA      #* ( 🄨 → (Y) ) PARENTHESIZED LATIN CAPITAL LETTER Y → LEFT PARENTHESIS, LATIN CAPITAL LETTER Y, RIGHT PARENTHESIS        # 
+
+24B5 ; 0028 007A 0029 ;        MA      #* ( ⒵ → (z) ) PARENTHESIZED LATIN SMALL LETTER Z → LEFT PARENTHESIS, LATIN SMALL LETTER Z, RIGHT PARENTHESIS     # 
+
+1F129 ;        0028 005A 0029 ;        MA      #* ( 🄩 → (Z) ) PARENTHESIZED LATIN CAPITAL LETTER Z → LEFT PARENTHESIS, LATIN CAPITAL LETTER Z, RIGHT PARENTHESIS        # 
+
+3200 ; 0028 1100 0029 ;        MA      #* ( ㈀ → (ᄀ) ) PARENTHESIZED HANGUL KIYEOK → LEFT PARENTHESIS, HANGUL CHOSEONG KIYEOK, RIGHT PARENTHESIS        # 
+
+320E ; 0028 AC00 0029 ;        MA      #* ( ㈎ → (가) ) PARENTHESIZED HANGUL KIYEOK A → LEFT PARENTHESIS, HANGUL SYLLABLE GA, RIGHT PARENTHESIS  # 
+
+3201 ; 0028 1102 0029 ;        MA      #* ( ㈁ → (ᄂ) ) PARENTHESIZED HANGUL NIEUN → LEFT PARENTHESIS, HANGUL CHOSEONG NIEUN, RIGHT PARENTHESIS  # 
+
+320F ; 0028 B098 0029 ;        MA      #* ( ㈏ → (나) ) PARENTHESIZED HANGUL NIEUN A → LEFT PARENTHESIS, HANGUL SYLLABLE NA, RIGHT PARENTHESIS   # 
+
+3202 ; 0028 1103 0029 ;        MA      #* ( ㈂ → (ᄃ) ) PARENTHESIZED HANGUL TIKEUT → LEFT PARENTHESIS, HANGUL CHOSEONG TIKEUT, RIGHT PARENTHESIS        # 
+
+3210 ; 0028 B2E4 0029 ;        MA      #* ( ㈐ → (다) ) PARENTHESIZED HANGUL TIKEUT A → LEFT PARENTHESIS, HANGUL SYLLABLE DA, RIGHT PARENTHESIS  # 
+
+3203 ; 0028 1105 0029 ;        MA      #* ( ㈃ → (ᄅ) ) PARENTHESIZED HANGUL RIEUL → LEFT PARENTHESIS, HANGUL CHOSEONG RIEUL, RIGHT PARENTHESIS  # 
+
+3211 ; 0028 B77C 0029 ;        MA      #* ( ㈑ → (라) ) PARENTHESIZED HANGUL RIEUL A → LEFT PARENTHESIS, HANGUL SYLLABLE RA, RIGHT PARENTHESIS   # 
+
+3204 ; 0028 1106 0029 ;        MA      #* ( ㈄ → (ᄆ) ) PARENTHESIZED HANGUL MIEUM → LEFT PARENTHESIS, HANGUL CHOSEONG MIEUM, RIGHT PARENTHESIS  # 
+
+3212 ; 0028 B9C8 0029 ;        MA      #* ( ㈒ → (마) ) PARENTHESIZED HANGUL MIEUM A → LEFT PARENTHESIS, HANGUL SYLLABLE MA, RIGHT PARENTHESIS   # 
+
+3205 ; 0028 1107 0029 ;        MA      #* ( ㈅ → (ᄇ) ) PARENTHESIZED HANGUL PIEUP → LEFT PARENTHESIS, HANGUL CHOSEONG PIEUP, RIGHT PARENTHESIS  # 
+
+3213 ; 0028 BC14 0029 ;        MA      #* ( ㈓ → (바) ) PARENTHESIZED HANGUL PIEUP A → LEFT PARENTHESIS, HANGUL SYLLABLE BA, RIGHT PARENTHESIS   # 
+
+3206 ; 0028 1109 0029 ;        MA      #* ( ㈆ → (ᄉ) ) PARENTHESIZED HANGUL SIOS → LEFT PARENTHESIS, HANGUL CHOSEONG SIOS, RIGHT PARENTHESIS    # 
+
+3214 ; 0028 C0AC 0029 ;        MA      #* ( ㈔ → (사) ) PARENTHESIZED HANGUL SIOS A → LEFT PARENTHESIS, HANGUL SYLLABLE SA, RIGHT PARENTHESIS    # 
+
+3207 ; 0028 110B 0029 ;        MA      #* ( ㈇ → (ᄋ) ) PARENTHESIZED HANGUL IEUNG → LEFT PARENTHESIS, HANGUL CHOSEONG IEUNG, RIGHT PARENTHESIS  # 
+
+3215 ; 0028 C544 0029 ;        MA      #* ( ㈕ → (아) ) PARENTHESIZED HANGUL IEUNG A → LEFT PARENTHESIS, HANGUL SYLLABLE A, RIGHT PARENTHESIS    # 
+
+321D ; 0028 C624 C804 0029 ;   MA      #* ( ㈝ → (오전) ) PARENTHESIZED KOREAN CHARACTER OJEON → LEFT PARENTHESIS, HANGUL SYLLABLE O, HANGUL SYLLABLE JEON, RIGHT PARENTHESIS   # 
+
+321E ; 0028 C624 D6C4 0029 ;   MA      #* ( ㈞ → (오후) ) PARENTHESIZED KOREAN CHARACTER O HU → LEFT PARENTHESIS, HANGUL SYLLABLE O, HANGUL SYLLABLE HU, RIGHT PARENTHESIS      # 
+
+3208 ; 0028 110C 0029 ;        MA      #* ( ㈈ → (ᄌ) ) PARENTHESIZED HANGUL CIEUC → LEFT PARENTHESIS, HANGUL CHOSEONG CIEUC, RIGHT PARENTHESIS  # 
+
+3216 ; 0028 C790 0029 ;        MA      #* ( ㈖ → (자) ) PARENTHESIZED HANGUL CIEUC A → LEFT PARENTHESIS, HANGUL SYLLABLE JA, RIGHT PARENTHESIS   # 
+
+321C ; 0028 C8FC 0029 ;        MA      #* ( ㈜ → (주) ) PARENTHESIZED HANGUL CIEUC U → LEFT PARENTHESIS, HANGUL SYLLABLE JU, RIGHT PARENTHESIS   # 
+
+3209 ; 0028 110E 0029 ;        MA      #* ( ㈉ → (ᄎ) ) PARENTHESIZED HANGUL CHIEUCH → LEFT PARENTHESIS, HANGUL CHOSEONG CHIEUCH, RIGHT PARENTHESIS      # 
+
+3217 ; 0028 CC28 0029 ;        MA      #* ( ㈗ → (차) ) PARENTHESIZED HANGUL CHIEUCH A → LEFT PARENTHESIS, HANGUL SYLLABLE CA, RIGHT PARENTHESIS # 
+
+320A ; 0028 110F 0029 ;        MA      #* ( ㈊ → (ᄏ) ) PARENTHESIZED HANGUL KHIEUKH → LEFT PARENTHESIS, HANGUL CHOSEONG KHIEUKH, RIGHT PARENTHESIS      # 
+
+3218 ; 0028 CE74 0029 ;        MA      #* ( ㈘ → (카) ) PARENTHESIZED HANGUL KHIEUKH A → LEFT PARENTHESIS, HANGUL SYLLABLE KA, RIGHT PARENTHESIS # 
+
+320B ; 0028 1110 0029 ;        MA      #* ( ㈋ → (ᄐ) ) PARENTHESIZED HANGUL THIEUTH → LEFT PARENTHESIS, HANGUL CHOSEONG THIEUTH, RIGHT PARENTHESIS      # 
+
+3219 ; 0028 D0C0 0029 ;        MA      #* ( ㈙ → (타) ) PARENTHESIZED HANGUL THIEUTH A → LEFT PARENTHESIS, HANGUL SYLLABLE TA, RIGHT PARENTHESIS # 
+
+320C ; 0028 1111 0029 ;        MA      #* ( ㈌ → (ᄑ) ) PARENTHESIZED HANGUL PHIEUPH → LEFT PARENTHESIS, HANGUL CHOSEONG PHIEUPH, RIGHT PARENTHESIS      # 
+
+321A ; 0028 D30C 0029 ;        MA      #* ( ㈚ → (파) ) PARENTHESIZED HANGUL PHIEUPH A → LEFT PARENTHESIS, HANGUL SYLLABLE PA, RIGHT PARENTHESIS # 
+
+320D ; 0028 1112 0029 ;        MA      #* ( ㈍ → (ᄒ) ) PARENTHESIZED HANGUL HIEUH → LEFT PARENTHESIS, HANGUL CHOSEONG HIEUH, RIGHT PARENTHESIS  # 
+
+321B ; 0028 D558 0029 ;        MA      #* ( ㈛ → (하) ) PARENTHESIZED HANGUL HIEUH A → LEFT PARENTHESIS, HANGUL SYLLABLE HA, RIGHT PARENTHESIS   # 
+
+3226 ; 0028 4E03 0029 ;        MA      #* ( ㈦ → (七) ) PARENTHESIZED IDEOGRAPH SEVEN → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4E03, RIGHT PARENTHESIS  # 
+
+3222 ; 0028 4E09 0029 ;        MA      #* ( ㈢ → (三) ) PARENTHESIZED IDEOGRAPH THREE → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4E09, RIGHT PARENTHESIS  # 
+1F241 ;        0028 4E09 0029 ;        MA      #* ( 🉁 → (三) ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E09 → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4E09, RIGHT PARENTHESIS   # →〔三〕→
+
+3228 ; 0028 4E5D 0029 ;        MA      #* ( ㈨ → (九) ) PARENTHESIZED IDEOGRAPH NINE → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4E5D, RIGHT PARENTHESIS   # 
+
+3221 ; 0028 4E8C 0029 ;        MA      #* ( ㈡ → (二) ) PARENTHESIZED IDEOGRAPH TWO → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4E8C, RIGHT PARENTHESIS    # 
+1F242 ;        0028 4E8C 0029 ;        MA      #* ( 🉂 → (二) ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E8C → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4E8C, RIGHT PARENTHESIS   # →〔二〕→
+
+3224 ; 0028 4E94 0029 ;        MA      #* ( ㈤ → (五) ) PARENTHESIZED IDEOGRAPH FIVE → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4E94, RIGHT PARENTHESIS   # 
+
+3239 ; 0028 4EE3 0029 ;        MA      #* ( ㈹ → (代) ) PARENTHESIZED IDEOGRAPH REPRESENT → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4EE3, RIGHT PARENTHESIS      # 
+
+323D ; 0028 4F01 0029 ;        MA      #* ( ㈽ → (企) ) PARENTHESIZED IDEOGRAPH ENTERPRISE → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4F01, RIGHT PARENTHESIS     # 
+
+3241 ; 0028 4F11 0029 ;        MA      #* ( ㉁ → (休) ) PARENTHESIZED IDEOGRAPH REST → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-4F11, RIGHT PARENTHESIS   # 
+
+3227 ; 0028 516B 0029 ;        MA      #* ( ㈧ → (八) ) PARENTHESIZED IDEOGRAPH EIGHT → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-516B, RIGHT PARENTHESIS  # 
+
+3225 ; 0028 516D 0029 ;        MA      #* ( ㈥ → (六) ) PARENTHESIZED IDEOGRAPH SIX → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-516D, RIGHT PARENTHESIS    # 
+
+3238 ; 0028 52B4 0029 ;        MA      #* ( ㈸ → (労) ) PARENTHESIZED IDEOGRAPH LABOR → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-52B4, RIGHT PARENTHESIS  # 
+
+1F247 ;        0028 52DD 0029 ;        MA      #* ( 🉇 → (勝) ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-52DD → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-52DD, RIGHT PARENTHESIS   # →〔勝〕→
+
+3229 ; 0028 5341 0029 ;        MA      #* ( ㈩ → (十) ) PARENTHESIZED IDEOGRAPH TEN → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-5341, RIGHT PARENTHESIS    # 
+
+323F ; 0028 5354 0029 ;        MA      #* ( ㈿ → (協) ) PARENTHESIZED IDEOGRAPH ALLIANCE → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-5354, RIGHT PARENTHESIS       # 
+
+3234 ; 0028 540D 0029 ;        MA      #* ( ㈴ → (名) ) PARENTHESIZED IDEOGRAPH NAME → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-540D, RIGHT PARENTHESIS   # 
+
+323A ; 0028 547C 0029 ;        MA      #* ( ㈺ → (呼) ) PARENTHESIZED IDEOGRAPH CALL → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-547C, RIGHT PARENTHESIS   # 
+
+3223 ; 0028 56DB 0029 ;        MA      #* ( ㈣ → (四) ) PARENTHESIZED IDEOGRAPH FOUR → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-56DB, RIGHT PARENTHESIS   # 
+
+322F ; 0028 571F 0029 ;        MA      #* ( ㈯ → (土) ) PARENTHESIZED IDEOGRAPH EARTH → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-571F, RIGHT PARENTHESIS  # 
+
+323B ; 0028 5B66 0029 ;        MA      #* ( ㈻ → (学) ) PARENTHESIZED IDEOGRAPH STUDY → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-5B66, RIGHT PARENTHESIS  # 
+
+1F243 ;        0028 5B89 0029 ;        MA      #* ( 🉃 → (安) ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-5B89 → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-5B89, RIGHT PARENTHESIS   # →〔安〕→
+
+1F245 ;        0028 6253 0029 ;        MA      #* ( 🉅 → (打) ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6253 → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-6253, RIGHT PARENTHESIS   # →〔打〕→
+
+1F248 ;        0028 6557 0029 ;        MA      #* ( 🉈 → (敗) ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557 → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-6557, RIGHT PARENTHESIS   # →〔敗〕→
+
+3230 ; 0028 65E5 0029 ;        MA      #* ( ㈰ → (日) ) PARENTHESIZED IDEOGRAPH SUN → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-65E5, RIGHT PARENTHESIS    # 
+
+322A ; 0028 6708 0029 ;        MA      #* ( ㈪ → (月) ) PARENTHESIZED IDEOGRAPH MOON → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-6708, RIGHT PARENTHESIS   # 
+
+3232 ; 0028 6709 0029 ;        MA      #* ( ㈲ → (有) ) PARENTHESIZED IDEOGRAPH HAVE → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-6709, RIGHT PARENTHESIS   # 
+
+322D ; 0028 6728 0029 ;        MA      #* ( ㈭ → (木) ) PARENTHESIZED IDEOGRAPH WOOD → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-6728, RIGHT PARENTHESIS   # 
+
+1F240 ;        0028 672C 0029 ;        MA      #* ( 🉀 → (本) ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-672C, RIGHT PARENTHESIS   # →〔本〕→
+
+3231 ; 0028 682A 0029 ;        MA      #* ( ㈱ → (株) ) PARENTHESIZED IDEOGRAPH STOCK → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-682A, RIGHT PARENTHESIS  # 
+
+322C ; 0028 6C34 0029 ;        MA      #* ( ㈬ → (水) ) PARENTHESIZED IDEOGRAPH WATER → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-6C34, RIGHT PARENTHESIS  # 
+
+322B ; 0028 706B 0029 ;        MA      #* ( ㈫ → (火) ) PARENTHESIZED IDEOGRAPH FIRE → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-706B, RIGHT PARENTHESIS   # 
+
+1F244 ;        0028 70B9 0029 ;        MA      #* ( 🉄 → (点) ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-70B9 → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-70B9, RIGHT PARENTHESIS   # →〔点〕→
+
+3235 ; 0028 7279 0029 ;        MA      #* ( ㈵ → (特) ) PARENTHESIZED IDEOGRAPH SPECIAL → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-7279, RIGHT PARENTHESIS        # 
+
+1F246 ;        0028 76D7 0029 ;        MA      #* ( 🉆 → (盗) ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-76D7 → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-76D7, RIGHT PARENTHESIS   # →〔盗〕→
+
+323C ; 0028 76E3 0029 ;        MA      #* ( ㈼ → (監) ) PARENTHESIZED IDEOGRAPH SUPERVISE → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-76E3, RIGHT PARENTHESIS      # 
+
+3233 ; 0028 793E 0029 ;        MA      #* ( ㈳ → (社) ) PARENTHESIZED IDEOGRAPH SOCIETY → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-793E, RIGHT PARENTHESIS        # 
+
+3237 ; 0028 795D 0029 ;        MA      #* ( ㈷ → (祝) ) PARENTHESIZED IDEOGRAPH CONGRATULATION → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-795D, RIGHT PARENTHESIS # 
+
+3240 ; 0028 796D 0029 ;        MA      #* ( ㉀ → (祭) ) PARENTHESIZED IDEOGRAPH FESTIVAL → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-796D, RIGHT PARENTHESIS       # 
+
+3242 ; 0028 81EA 0029 ;        MA      #* ( ㉂ → (自) ) PARENTHESIZED IDEOGRAPH SELF → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-81EA, RIGHT PARENTHESIS   # 
+
+3243 ; 0028 81F3 0029 ;        MA      #* ( ㉃ → (至) ) PARENTHESIZED IDEOGRAPH REACH → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-81F3, RIGHT PARENTHESIS  # 
+
+3236 ; 0028 8CA1 0029 ;        MA      #* ( ㈶ → (財) ) PARENTHESIZED IDEOGRAPH FINANCIAL → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-8CA1, RIGHT PARENTHESIS      # 
+
+323E ; 0028 8CC7 0029 ;        MA      #* ( ㈾ → (資) ) PARENTHESIZED IDEOGRAPH RESOURCE → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-8CC7, RIGHT PARENTHESIS       # 
+
+322E ; 0028 91D1 0029 ;        MA      #* ( ㈮ → (金) ) PARENTHESIZED IDEOGRAPH METAL → LEFT PARENTHESIS, CJK UNIFIED IDEOGRAPH-91D1, RIGHT PARENTHESIS  # 
+
+FF3D ; 0029 ;  MA      #* ( ] → ) ) FULLWIDTH RIGHT SQUARE BRACKET → RIGHT PARENTHESIS   # →〕→
+3015 ; 0029 ;  MA      #* ( 〕 → ) ) RIGHT TORTOISE SHELL BRACKET → RIGHT PARENTHESIS     # 
+FD3F ; 0029 ;  MA      #* ( ﴿ → ) ) ORNATE RIGHT PARENTHESIS → RIGHT PARENTHESIS # 
+2769 ; 0029 ;  MA      #* ( ❩ → ) ) MEDIUM RIGHT PARENTHESIS ORNAMENT → RIGHT PARENTHESIS        # 
+2773 ; 0029 ;  MA      #* ( ❳ → ) ) LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT → RIGHT PARENTHESIS      # →〕→
+
+2774 ; 007B ;  MA      #* ( ❴ → { ) MEDIUM LEFT CURLY BRACKET ORNAMENT → LEFT CURLY BRACKET      # 
+
+2775 ; 007D ;  MA      #* ( ❵ → } ) MEDIUM RIGHT CURLY BRACKET ORNAMENT → RIGHT CURLY BRACKET    # 
+
+FF3E ; FE3F ;  MA      #* ( ^ → ︿ ) FULLWIDTH CIRCUMFLEX ACCENT → PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET    # 
+
+204E ; 002A ;  MA      #* ( ⁎ → * ) LOW ASTERISK → ASTERISK      # 
+066D ; 002A ;  MA      #* ( ‎٭‎ → * ) ARABIC FIVE POINTED STAR → ASTERISK     # 
+2217 ; 002A ;  MA      #* ( ∗ → * ) ASTERISK OPERATOR → ASTERISK # 
+
+1735 ; 002F ;  MA      #* ( ᜵ → / ) PHILIPPINE SINGLE PUNCTUATION → SOLIDUS      # 
+2044 ; 002F ;  MA      #* ( ⁄ → / ) FRACTION SLASH → SOLIDUS     # 
+2041 ; 002F ;  MA      #* ( ⁁ → / ) CARET INSERTION POINT → SOLIDUS      # 
+2215 ; 002F ;  MA      #* ( ∕ → / ) DIVISION SLASH → SOLIDUS     # 
+2571 ; 002F ;  MA      #* ( ╱ → / ) BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT → SOLIDUS      # 
+29F8 ; 002F ;  MA      #* ( ⧸ → / ) BIG SOLIDUS → SOLIDUS        # 
+31D3 ; 002F ;  MA      #* ( ㇓ → / ) CJK STROKE SP → SOLIDUS      # →⼃→
+3033 ; 002F ;  MA      # ( 〳 → / ) VERTICAL KANA REPEAT MARK UPPER HALF → SOLIDUS        # 
+2CC6 ; 002F ;  MA      # ( Ⳇ → / ) COPTIC CAPITAL LETTER OLD COPTIC ESH → SOLIDUS        # 
+4E3F ; 002F ;  MA      # ( 丿 → / ) CJK UNIFIED IDEOGRAPH-4E3F → SOLIDUS  # →⼃→
+2F03 ; 002F ;  MA      #* ( ⼃ → / ) KANGXI RADICAL SLASH → SOLIDUS       # 
+
+29F6 ; 002F 0304 ;     MA      #* ( ⧶ → /̄ ) SOLIDUS WITH OVERBAR → SOLIDUS, COMBINING MACRON   # 
+
+2AFD ; 002F 002F ;     MA      #* ( ⫽ → // ) DOUBLE SOLIDUS OPERATOR → SOLIDUS, SOLIDUS  # 
+
+2AFB ; 002F 002F 002F ;        MA      #* ( ⫻ → /// ) TRIPLE SOLIDUS BINARY RELATION → SOLIDUS, SOLIDUS, SOLIDUS # 
+
+FF3C ; 005C ;  MA      #* ( \ → \ ) FULLWIDTH REVERSE SOLIDUS → REVERSE SOLIDUS  # →∖→
+FE68 ; 005C ;  MA      #* ( ﹨ → \ ) SMALL REVERSE SOLIDUS → REVERSE SOLIDUS      # →∖→
+2216 ; 005C ;  MA      #* ( ∖ → \ ) SET MINUS → REVERSE SOLIDUS  # 
+29F5 ; 005C ;  MA      #* ( ⧵ → \ ) REVERSE SOLIDUS OPERATOR → REVERSE SOLIDUS   # 
+29F9 ; 005C ;  MA      #* ( ⧹ → \ ) BIG REVERSE SOLIDUS → REVERSE SOLIDUS        # 
+31D4 ; 005C ;  MA      #* ( ㇔ → \ ) CJK STROKE D → REVERSE SOLIDUS       # →⼂→
+4E36 ; 005C ;  MA      # ( 丶 → \ ) CJK UNIFIED IDEOGRAPH-4E36 → REVERSE SOLIDUS  # →⼂→
+2F02 ; 005C ;  MA      #* ( ⼂ → \ ) KANGXI RADICAL DOT → REVERSE SOLIDUS # 
+
+2CF9 ; 005C 005C ;     MA      #* ( ⳹ → \\ ) COPTIC OLD NUBIAN FULL STOP → REVERSE SOLIDUS, REVERSE SOLIDUS      # 
+244A ; 005C 005C ;     MA      #* ( ⑊ → \\ ) OCR DOUBLE BACKSLASH → REVERSE SOLIDUS, REVERSE SOLIDUS     # 
+
+A778 ; 0026 ;  MA      # ( ꝸ → & ) LATIN SMALL LETTER UM → AMPERSAND     # 
+
+110BB ;        0970 ;  MA      #* ( 𑂻 → ॰ ) KAITHI ABBREVIATION SIGN → DEVANAGARI ABBREVIATION SIGN   # 
+26AC ; 0970 ;  MA      #* ( ⚬ → ॰ ) MEDIUM SMALL WHITE CIRCLE → DEVANAGARI ABBREVIATION SIGN   # 
+
+17D5 ; 0E5A ;  MA      #* ( ៕ → ๚ ) KHMER SIGN BARIYOOSAN → THAI CHARACTER ANGKHANKHU  # 
+
+17DA ; 0E5B ;  MA      #* ( ៚ → ๛ ) KHMER SIGN KOOMUUT → THAI CHARACTER KHOMUT # 
+
+0F0C ; 0F0B ;  MA      #* ( ༌ → ་ ) TIBETAN MARK DELIMITER TSHEG BSTAR → TIBETAN MARK INTERSYLLABIC TSHEG      # 
+
+02D8 ; 02C7 ;  MA      #* ( ˘ → ˇ ) BREVE → CARON        # 
+A67E ; 02C7 ;  MA      #* ( ꙾ → ˇ ) CYRILLIC KAVYKA → CARON     # →˘→
+
+00AF ; 02C9 ;  MA      #* ( ¯ → ˉ ) MACRON → MODIFIER LETTER MACRON      # 
+FFE3 ; 02C9 ;  MA      #* (  ̄ → ˉ ) FULLWIDTH MACRON → MODIFIER LETTER MACRON   # →‾→
+203E ; 02C9 ;  MA      #* ( ‾ → ˉ ) OVERLINE → MODIFIER LETTER MACRON   # 
+FE49 ; 02C9 ;  MA      #* ( ﹉ → ˉ ) DASHED OVERLINE → MODIFIER LETTER MACRON    # →‾→
+FE4A ; 02C9 ;  MA      #* ( ﹊ → ˉ ) CENTRELINE OVERLINE → MODIFIER LETTER MACRON        # →‾→
+FE4B ; 02C9 ;  MA      #* ( ﹋ → ˉ ) WAVY OVERLINE → MODIFIER LETTER MACRON      # →‾→
+FE4C ; 02C9 ;  MA      #* ( ﹌ → ˉ ) DOUBLE WAVY OVERLINE → MODIFIER LETTER MACRON       # →‾→
+2594 ; 02C9 ;  MA      #* ( ▔ → ˉ ) UPPER ONE EIGHTH BLOCK → MODIFIER LETTER MACRON     # →¯→
+
+044A ; 02C9 0062 ;     MA      # ( ъ → ˉb ) CYRILLIC SMALL LETTER HARD SIGN → MODIFIER LETTER MACRON, LATIN SMALL LETTER B       # →¯b→
+
+0375 ; 02CF ;  MA      #* ( ͵ → ˏ ) GREEK LOWER NUMERAL SIGN → MODIFIER LETTER LOW ACUTE ACCENT  # 
+
+02FB ; 02EA ;  MA      #* ( ˻ → ˪ ) MODIFIER LETTER BEGIN LOW TONE → MODIFIER LETTER YIN DEPARTING TONE MARK     # 
+A716 ; 02EA ;  MA      #* ( ꜖ → ˪ ) MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR → MODIFIER LETTER YIN DEPARTING TONE MARK      # 
+
+A714 ; 02EB ;  MA      #* ( ꜔ → ˫ ) MODIFIER LETTER MID LEFT-STEM TONE BAR → MODIFIER LETTER YANG DEPARTING TONE MARK   # 
+
+2E30 ; 02F3 ;  MA      #* ( ⸰ → ˳ ) RING POINT → MODIFIER LETTER LOW RING       # 
+3002 ; 02F3 ;  MA      #* ( 。 → ˳ ) IDEOGRAPHIC FULL STOP → MODIFIER LETTER LOW RING    # 
+
+02DA ; 00B0 ;  MA      #* ( ˚ → ° ) RING ABOVE → DEGREE SIGN     # 
+2218 ; 00B0 ;  MA      #* ( ∘ → ° ) RING OPERATOR → DEGREE SIGN # 
+25CB ; 00B0 ;  MA      #* ( ○ → ° ) WHITE CIRCLE → DEGREE SIGN  # →◦→→∘→
+25E6 ; 00B0 ;  MA      #* ( ◦ → ° ) WHITE BULLET → DEGREE SIGN  # →∘→
+
+2103 ; 00B0 0043 ;     MA      #* ( ℃ → °C ) DEGREE CELSIUS → DEGREE SIGN, LATIN CAPITAL LETTER C       # 
+
+2109 ; 00B0 0046 ;     MA      #* ( ℉ → °F ) DEGREE FAHRENHEIT → DEGREE SIGN, LATIN CAPITAL LETTER F    # 
+
+0BF5 ; 0BF3 ;  MA      #* ( ௵ → ௳ ) TAMIL YEAR SIGN → TAMIL DAY SIGN   # 
+
+17D9 ; 0E4F ;  MA      #* ( ៙ → ๏ ) KHMER SIGN PHNAEK MUAN → THAI CHARACTER FONGMAN    # 
+
+24C5 ; 2117 ;  MA      #* ( Ⓟ → ℗ ) CIRCLED LATIN CAPITAL LETTER P → SOUND RECORDING COPYRIGHT # 
+
+21B5 ; 21B2 ;  MA      #* ( ↵ → ↲ ) DOWNWARDS ARROW WITH CORNER LEFTWARDS → DOWNWARDS ARROW WITH TIP LEFTWARDS # 
+
+2A21 ; 21BE ;  MA      #* ( ⨡ → ↾ ) Z NOTATION SCHEMA PROJECTION → UPWARDS HARPOON WITH BARB RIGHTWARDS        # 
+
+1D6DB ;        2202 ;  MA      #* ( 𝛛 → ∂ ) MATHEMATICAL BOLD PARTIAL DIFFERENTIAL → PARTIAL DIFFERENTIAL     # 
+1D715 ;        2202 ;  MA      #* ( 𝜕 → ∂ ) MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL → PARTIAL DIFFERENTIAL   # 
+1D74F ;        2202 ;  MA      #* ( 𝝏 → ∂ ) MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL → PARTIAL DIFFERENTIAL      # 
+1D789 ;        2202 ;  MA      #* ( 𝞉 → ∂ ) MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL → PARTIAL DIFFERENTIAL  # 
+1D7C3 ;        2202 ;  MA      #* ( 𝟃 → ∂ ) MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL → PARTIAL DIFFERENTIAL   # 
+
+00F0 ; 2202 0335 ;     MA      # ( ð → ∂̵ ) LATIN SMALL LETTER ETH → PARTIAL DIFFERENTIAL, COMBINING SHORT STROKE OVERLAY      # 
+
+2300 ; 2205 ;  MA      #* ( ⌀ → ∅ ) DIAMETER SIGN → EMPTY SET  # 
+
+1D6C1 ;        2207 ;  MA      #* ( 𝛁 → ∇ ) MATHEMATICAL BOLD NABLA → NABLA   # 
+1D6FB ;        2207 ;  MA      #* ( 𝛻 → ∇ ) MATHEMATICAL ITALIC NABLA → NABLA # 
+1D735 ;        2207 ;  MA      #* ( 𝜵 → ∇ ) MATHEMATICAL BOLD ITALIC NABLA → NABLA    # 
+1D76F ;        2207 ;  MA      #* ( 𝝯 → ∇ ) MATHEMATICAL SANS-SERIF BOLD NABLA → NABLA        # 
+1D7A9 ;        2207 ;  MA      #* ( 𝞩 → ∇ ) MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA → NABLA # 
+
+2588 ; 220E ;  MA      #* ( █ → ∎ ) FULL BLOCK → END OF PROOF  # →■→
+25A0 ; 220E ;  MA      #* ( ■ → ∎ ) BLACK SQUARE → END OF PROOF        # 
+
+2A3F ; 2210 ;  MA      #* ( ⨿ → ∐ ) AMALGAMATION OR COPRODUCT → N-ARY COPRODUCT        # 
+
+FB29 ; 002B ;  MA      #* ( ﬩ → + ) HEBREW LETTER ALTERNATIVE PLUS SIGN → PLUS SIGN      # 
+
+2039 ; 003C ;  MA      #* ( ‹ → < ) SINGLE LEFT-POINTING ANGLE QUOTATION MARK → LESS-THAN SIGN   # 
+02C2 ; 003C ;  MA      #* ( ˂ → < ) MODIFIER LETTER LEFT ARROWHEAD → LESS-THAN SIGN       # 
+276E ; 003C ;  MA      #* ( ❮ → < ) HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT → LESS-THAN SIGN   # →‹→
+
+A4FF ; 003D ;  MA      #* ( ꓿ → = ) LISU PUNCTUATION FULL STOP → EQUALS SIGN     # 
+
+2A75 ; 003D 003D ;     MA      #* ( ⩵ → == ) TWO CONSECUTIVE EQUALS SIGNS → EQUALS SIGN, EQUALS SIGN     # 
+
+2A76 ; 003D 003D 003D ;        MA      #* ( ⩶ → === ) THREE CONSECUTIVE EQUALS SIGNS → EQUALS SIGN, EQUALS SIGN, EQUALS SIGN     # 
+
+203A ; 003E ;  MA      #* ( › → > ) SINGLE RIGHT-POINTING ANGLE QUOTATION MARK → GREATER-THAN SIGN       # 
+02C3 ; 003E ;  MA      #* ( ˃ → > ) MODIFIER LETTER RIGHT ARROWHEAD → GREATER-THAN SIGN   # 
+276F ; 003E ;  MA      #* ( ❯ → > ) HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT → GREATER-THAN SIGN       # →›→
+
+02DC ; 007E ;  MA      #* ( ˜ → ~ ) SMALL TILDE → TILDE   # 
+1FC0 ; 007E ;  MA      #* ( ῀ → ~ ) GREEK PERISPOMENI → TILDE    # →˜→
+2053 ; 007E ;  MA      #* ( ⁓ → ~ ) SWUNG DASH → TILDE   # 
+223C ; 007E ;  MA      #* ( ∼ → ~ ) TILDE OPERATOR → TILDE       # 
+
+22C0 ; 2227 ;  MA      #* ( ⋀ → ∧ ) N-ARY LOGICAL AND → LOGICAL AND    # 
+
+22C3 ; 222A ;  MA      #* ( ⋃ → ∪ ) N-ARY UNION → UNION        # 
+
+222F ; 222E 222E ;     MA      #* ( ∯ → ∮∮ ) SURFACE INTEGRAL → CONTOUR INTEGRAL, CONTOUR INTEGRAL   # 
+
+2230 ; 222E 222E 222E ;        MA      #* ( ∰ → ∮∮∮ ) VOLUME INTEGRAL → CONTOUR INTEGRAL, CONTOUR INTEGRAL, CONTOUR INTEGRAL       # 
+
+2263 ; 2261 ;  MA      #* ( ≣ → ≡ ) STRICTLY EQUIVALENT TO → IDENTICAL TO      # 
+
+2A20 ; 226B ;  MA      #* ( ⨠ → ≫ ) Z NOTATION SCHEMA PIPING → MUCH GREATER-THAN       # 
+
+2A03 ; 228D ;  MA      #* ( ⨃ → ⊍ ) N-ARY UNION OPERATOR WITH DOT → MULTISET MULTIPLICATION    # 
+
+2A04 ; 228E ;  MA      #* ( ⨄ → ⊎ ) N-ARY UNION OPERATOR WITH PLUS → MULTISET UNION    # 
+
+2A05 ; 2293 ;  MA      #* ( ⨅ → ⊓ ) N-ARY SQUARE INTERSECTION OPERATOR → SQUARE CAP    # 
+
+2A06 ; 2294 ;  MA      #* ( ⨆ → ⊔ ) N-ARY SQUARE UNION OPERATOR → SQUARE CUP   # 
+
+2641 ; 2295 ;  MA      #* ( ♁ → ⊕ ) EARTH → CIRCLED PLUS       # 
+2A01 ; 2295 ;  MA      #* ( ⨁ → ⊕ ) N-ARY CIRCLED PLUS OPERATOR → CIRCLED PLUS # 
+
+2A02 ; 2297 ;  MA      #* ( ⨂ → ⊗ ) N-ARY CIRCLED TIMES OPERATOR → CIRCLED TIMES       # 
+
+2609 ; 2299 ;  MA      #* ( ☉ → ⊙ ) SUN → CIRCLED DOT OPERATOR # 
+2A00 ; 2299 ;  MA      #* ( ⨀ → ⊙ ) N-ARY CIRCLED DOT OPERATOR → CIRCLED DOT OPERATOR  # 
+
+25B7 ; 22B2 ;  MA      #* ( ▷ → ⊲ ) WHITE RIGHT-POINTING TRIANGLE → NORMAL SUBGROUP OF # 
+
+25C7 ; 22C4 ;  MA      #* ( ◇ → ⋄ ) WHITE DIAMOND → DIAMOND OPERATOR   # 
+25CA ; 22C4 ;  MA      #* ( ◊ → ⋄ ) LOZENGE → DIAMOND OPERATOR # 
+2662 ; 22C4 ;  MA      #* ( ♢ → ⋄ ) WHITE DIAMOND SUIT → DIAMOND OPERATOR      # →◊→
+
+2A1D ; 22C8 ;  MA      #* ( ⨝ → ⋈ ) JOIN → BOWTIE      # 
+
+25E0 ; 2312 ;  MA      #* ( ◠ → ⌒ ) UPPER HALF CIRCLE → ARC    # 
+
+2A3D ; 2319 ;  MA      #* ( ⨽ → ⌙ ) RIGHTHAND INTERIOR PRODUCT → TURNED NOT SIGN       # 
+
+2325 ; 2324 ;  MA      #* ( ⌥ → ⌤ ) OPTION KEY → UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS      # 
+
+2638 ; 2388 ;  MA      #* ( ☸ → ⎈ ) WHEEL OF DHARMA → HELM SYMBOL      # 
+
+FE35 ; 23DC ;  MA      #* ( ︵ → ⏜ ) PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS → TOP PARENTHESIS  # 
+
+FE36 ; 23DD ;  MA      #* ( ︶ → ⏝ ) PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS → BOTTOM PARENTHESIS      # 
+
+FE37 ; 23DE ;  MA      #* ( ︷ → ⏞ ) PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET → TOP CURLY BRACKET      # 
+
+FE38 ; 23DF ;  MA      #* ( ︸ → ⏟ ) PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET → BOTTOM CURLY BRACKET  # 
+
+FE39 ; 23E0 ;  MA      #* ( ︹ → ⏠ ) PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET → TOP TORTOISE SHELL BRACKET    # 
+
+FE3A ; 23E1 ;  MA      #* ( ︺ → ⏡ ) PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET → BOTTOM TORTOISE SHELL BRACKET        # 
+
+25B1 ; 23E5 ;  MA      #* ( ▱ → ⏥ ) WHITE PARALLELOGRAM → FLATNESS     # 
+
+FE31 ; 2502 ;  MA      #* ( ︱ → │ ) PRESENTATION FORM FOR VERTICAL EM DASH → BOX DRAWINGS LIGHT VERTICAL       # →|→
+FF5C ; 2502 ;  MA      #* ( | → │ ) FULLWIDTH VERTICAL LINE → BOX DRAWINGS LIGHT VERTICAL      # 
+2503 ; 2502 ;  MA      #* ( ┃ → │ ) BOX DRAWINGS HEAVY VERTICAL → BOX DRAWINGS LIGHT VERTICAL  # 
+
+250F ; 250C ;  MA      #* ( ┏ → ┌ ) BOX DRAWINGS HEAVY DOWN AND RIGHT → BOX DRAWINGS LIGHT DOWN AND RIGHT      # 
+
+2523 ; 251C ;  MA      #* ( ┣ → ├ ) BOX DRAWINGS HEAVY VERTICAL AND RIGHT → BOX DRAWINGS LIGHT VERTICAL AND RIGHT      # 
+
+2590 ; 258C ;  MA      #* ( ▐ → ▌ ) RIGHT HALF BLOCK → LEFT HALF BLOCK # 
+
+2597 ; 2596 ;  MA      #* ( ▗ → ▖ ) QUADRANT LOWER RIGHT → QUADRANT LOWER LEFT # 
+
+259D ; 2598 ;  MA      #* ( ▝ → ▘ ) QUADRANT UPPER RIGHT → QUADRANT UPPER LEFT # 
+
+2610 ; 25A1 ;  MA      #* ( ☐ → □ ) BALLOT BOX → WHITE SQUARE  # 
+
+FFED ; 25AA ;  MA      #* ( ■ → ▪ ) HALFWIDTH BLACK SQUARE → BLACK SMALL SQUARE        # 
+
+25B8 ; 25B6 ;  MA      #* ( ▸ → ▶ ) BLACK RIGHT-POINTING SMALL TRIANGLE → BLACK RIGHT-POINTING TRIANGLE        # →►→
+25BA ; 25B6 ;  MA      #* ( ► → ▶ ) BLACK RIGHT-POINTING POINTER → BLACK RIGHT-POINTING TRIANGLE       # 
+
+29BE ; 25CE ;  MA      #* ( ⦾ → ◎ ) CIRCLED WHITE BULLET → BULLSEYE    # 
+
+2CE9 ; 2627 ;  MA      #* ( ⳩ → ☧ ) COPTIC SYMBOL KHI RO → CHI RHO     # 
+
+2329 ; 276C ;  MA      #* ( 〈 → ❬ ) LEFT-POINTING ANGLE BRACKET → MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT  # →〈→
+3008 ; 276C ;  MA      #* ( 〈 → ❬ ) LEFT ANGLE BRACKET → MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT   # 
+27E8 ; 276C ;  MA      #* ( ⟨ → ❬ ) MATHEMATICAL LEFT ANGLE BRACKET → MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT      # →〈→
+
+232A ; 276D ;  MA      #* ( 〉 → ❭ ) RIGHT-POINTING ANGLE BRACKET → MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT        # →〉→
+3009 ; 276D ;  MA      #* ( 〉 → ❭ ) RIGHT ANGLE BRACKET → MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT # 
+27E9 ; 276D ;  MA      #* ( ⟩ → ❭ ) MATHEMATICAL RIGHT ANGLE BRACKET → MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT    # →〉→
+
+301B ; 27E7 ;  MA      #* ( 〛 → ⟧ ) RIGHT WHITE SQUARE BRACKET → MATHEMATICAL RIGHT WHITE SQUARE BRACKET       # 
+
+29D9 ; 299A ;  MA      #* ( ⧙ → ⦚ ) RIGHT WIGGLY FENCE → VERTICAL ZIGZAG LINE  # 
+
+2A3E ; 2A1F ;  MA      #* ( ⨾ → ⨟ ) Z NOTATION RELATIONAL COMPOSITION → Z NOTATION SCHEMA COMPOSITION  # 
+
+3036 ; 3012 ;  MA      #* ( 〶 → 〒 ) CIRCLED POSTAL MARK → POSTAL MARK  # 
+
+02D9 ; 0971 ;  MA      #* ( ˙ → ॱ ) DOT ABOVE → DEVANAGARI SIGN HIGH SPACING DOT        # 
+
+FF0D ; 30FC ;  MA      #* ( - → ー ) FULLWIDTH HYPHEN-MINUS → KATAKANA-HIRAGANA PROLONGED SOUND MARK    # 
+2014 ; 30FC ;  MA      #* ( — → ー ) EM DASH → KATAKANA-HIRAGANA PROLONGED SOUND MARK   # →一→
+2015 ; 30FC ;  MA      #* ( ― → ー ) HORIZONTAL BAR → KATAKANA-HIRAGANA PROLONGED SOUND MARK    # →—→→一→
+2500 ; 30FC ;  MA      #* ( ─ → ー ) BOX DRAWINGS LIGHT HORIZONTAL → KATAKANA-HIRAGANA PROLONGED SOUND MARK     # →―→→—→→一→
+2501 ; 30FC ;  MA      #* ( ━ → ー ) BOX DRAWINGS HEAVY HORIZONTAL → KATAKANA-HIRAGANA PROLONGED SOUND MARK     # →—→→一→
+31D0 ; 30FC ;  MA      #* ( ㇐ → ー ) CJK STROKE H → KATAKANA-HIRAGANA PROLONGED SOUND MARK      # →一→
+1173 ; 30FC ;  MA      # ( ᅳ → ー ) HANGUL JUNGSEONG EU → KATAKANA-HIRAGANA PROLONGED SOUND MARK        # →ㅡ→→—→→一→
+3161 ; 30FC ;  MA      # ( ㅡ → ー ) HANGUL LETTER EU → KATAKANA-HIRAGANA PROLONGED SOUND MARK   # →—→→一→
+4E00 ; 30FC ;  MA      # ( 一 → ー ) CJK UNIFIED IDEOGRAPH-4E00 → KATAKANA-HIRAGANA PROLONGED SOUND MARK # 
+2F00 ; 30FC ;  MA      #* ( ⼀ → ー ) KANGXI RADICAL ONE → KATAKANA-HIRAGANA PROLONGED SOUND MARK        # →一→
+
+1196 ; 30FC 30FC ;     MA      # ( ᆖ → ーー ) HANGUL JUNGSEONG EU-EU → KATAKANA-HIRAGANA PROLONGED SOUND MARK, KATAKANA-HIRAGANA PROLONGED SOUND MARK  # →ᅳᅳ→
+
+1174 ; 30FC 4E28 ;     MA      # ( ᅴ → ー丨 ) HANGUL JUNGSEONG YI → KATAKANA-HIRAGANA PROLONGED SOUND MARK, CJK UNIFIED IDEOGRAPH-4E28 # →ᅳᅵ→
+3162 ; 30FC 4E28 ;     MA      # ( ㅢ → ー丨 ) HANGUL LETTER YI → KATAKANA-HIRAGANA PROLONGED SOUND MARK, CJK UNIFIED IDEOGRAPH-4E28    # →ᅴ→→ᅳᅵ→
+
+20A4 ; 00A3 ;  MA      #* ( ₤ → £ ) LIRA SIGN → POUND SIGN      # 
+
+1B5C ; 1B50 ;  MA      #* ( ᭜ → ᭐ ) BALINESE WINDU → BALINESE DIGIT ZERO       # 
+
+A9C6 ; A9D0 ;  MA      #* ( ꧆ → ꧐ ) JAVANESE PADA WINDU → JAVANESE DIGIT ZERO  # 
+
+2460 ; 2780 ;  MA      #* ( ① → ➀ ) CIRCLED DIGIT ONE → DINGBAT CIRCLED SANS-SERIF DIGIT ONE   # 
+
+06F1 ; 0661 ;  MA      # ( ۱ → ‎١‎ ) EXTENDED ARABIC-INDIC DIGIT ONE → ARABIC-INDIC DIGIT ONE        # 
+
+0CE7 ; 0C67 ;  MA      # ( ೧ → ౧ ) KANNADA DIGIT ONE → TELUGU DIGIT ONE        # 
+
+1065 ; 1041 ;  MA      # ( ၥ → ၁ ) MYANMAR LETTER WESTERN PWO KAREN THA → MYANMAR DIGIT ONE    # 
+
+2469 ; 2789 ;  MA      #* ( ⑩ → ➉ ) CIRCLED NUMBER TEN → DINGBAT CIRCLED SANS-SERIF NUMBER TEN # 
+
+1D7D0 ;        0032 ;  MA      # ( 𝟐 → 2 ) MATHEMATICAL BOLD DIGIT TWO → DIGIT TWO      # 
+1D7DA ;        0032 ;  MA      # ( 𝟚 → 2 ) MATHEMATICAL DOUBLE-STRUCK DIGIT TWO → DIGIT TWO     # 
+1D7E4 ;        0032 ;  MA      # ( 𝟤 → 2 ) MATHEMATICAL SANS-SERIF DIGIT TWO → DIGIT TWO        # 
+1D7EE ;        0032 ;  MA      # ( 𝟮 → 2 ) MATHEMATICAL SANS-SERIF BOLD DIGIT TWO → DIGIT TWO   # 
+1D7F8 ;        0032 ;  MA      # ( 𝟸 → 2 ) MATHEMATICAL MONOSPACE DIGIT TWO → DIGIT TWO # 
+A75A ; 0032 ;  MA      # ( Ꝛ → 2 ) LATIN CAPITAL LETTER R ROTUNDA → DIGIT TWO    # 
+01A7 ; 0032 ;  MA      # ( Ƨ → 2 ) LATIN CAPITAL LETTER TONE TWO → DIGIT TWO      # 
+03E8 ; 0032 ;  MA      # ( Ϩ → 2 ) COPTIC CAPITAL LETTER HORI → DIGIT TWO # →Ƨ→
+A644 ; 0032 ;  MA      # ( Ꙅ → 2 ) CYRILLIC CAPITAL LETTER REVERSED DZE → DIGIT TWO      # →Ƨ→
+14BF ; 0032 ;  MA      # ( ᒿ → 2 ) CANADIAN SYLLABICS SAYISI M → DIGIT TWO       # 
+
+2461 ; 2781 ;  MA      #* ( ② → ➁ ) CIRCLED DIGIT TWO → DINGBAT CIRCLED SANS-SERIF DIGIT TWO   # 
+
+06F2 ; 0662 ;  MA      # ( ۲ → ‎٢‎ ) EXTENDED ARABIC-INDIC DIGIT TWO → ARABIC-INDIC DIGIT TWO        # 
+
+0AE8 ; 0968 ;  MA      # ( ૨ → २ ) GUJARATI DIGIT TWO → DEVANAGARI DIGIT TWO   # 
+
+0CE8 ; 0C68 ;  MA      # ( ೨ → ౨ ) KANNADA DIGIT TWO → TELUGU DIGIT TWO        # 
+
+1F103 ;        0032 002C ;     MA      #* ( 🄃 → 2, ) DIGIT TWO COMMA → DIGIT TWO, COMMA # 
+
+2489 ; 0032 002E ;     MA      #* ( ⒉ → 2. ) DIGIT TWO FULL STOP → DIGIT TWO, FULL STOP  # 
+
+33F5 ; 0032 0032 65E5 ;        MA      #* ( ㏵ → 22日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO → DIGIT TWO, DIGIT TWO, CJK UNIFIED IDEOGRAPH-65E5       # 
+
+336E ; 0032 0032 70B9 ;        MA      #* ( ㍮ → 22点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO → DIGIT TWO, DIGIT TWO, CJK UNIFIED IDEOGRAPH-70B9      # 
+
+33F6 ; 0032 0033 65E5 ;        MA      #* ( ㏶ → 23日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE → DIGIT TWO, DIGIT THREE, CJK UNIFIED IDEOGRAPH-65E5   # 
+
+336F ; 0032 0033 70B9 ;        MA      #* ( ㍯ → 23点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE → DIGIT TWO, DIGIT THREE, CJK UNIFIED IDEOGRAPH-70B9  # 
+
+33F7 ; 0032 0034 65E5 ;        MA      #* ( ㏷ → 24日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR → DIGIT TWO, DIGIT FOUR, CJK UNIFIED IDEOGRAPH-65E5     # 
+
+3370 ; 0032 0034 70B9 ;        MA      #* ( ㍰ → 24点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR → DIGIT TWO, DIGIT FOUR, CJK UNIFIED IDEOGRAPH-70B9    # 
+
+33F8 ; 0032 0035 65E5 ;        MA      #* ( ㏸ → 25日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE → DIGIT TWO, DIGIT FIVE, CJK UNIFIED IDEOGRAPH-65E5     # 
+
+33F9 ; 0032 0036 65E5 ;        MA      #* ( ㏹ → 26日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX → DIGIT TWO, DIGIT SIX, CJK UNIFIED IDEOGRAPH-65E5       # 
+
+33FA ; 0032 0037 65E5 ;        MA      #* ( ㏺ → 27日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN → DIGIT TWO, DIGIT SEVEN, CJK UNIFIED IDEOGRAPH-65E5   # 
+
+33FB ; 0032 0038 65E5 ;        MA      #* ( ㏻ → 28日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT → DIGIT TWO, DIGIT EIGHT, CJK UNIFIED IDEOGRAPH-65E5   # 
+
+33FC ; 0032 0039 65E5 ;        MA      #* ( ㏼ → 29日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE → DIGIT TWO, DIGIT NINE, CJK UNIFIED IDEOGRAPH-65E5     # 
+
+33F4 ; 0032 006C 65E5 ;        MA      #* ( ㏴ → 2l日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE → DIGIT TWO, LATIN SMALL LETTER L, CJK UNIFIED IDEOGRAPH-65E5    # →21日→
+
+336D ; 0032 006C 70B9 ;        MA      #* ( ㍭ → 2l点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE → DIGIT TWO, LATIN SMALL LETTER L, CJK UNIFIED IDEOGRAPH-70B9   # →21点→
+
+249B ; 0032 004F 002E ;        MA      #* ( ⒛ → 2O. ) NUMBER TWENTY FULL STOP → DIGIT TWO, LATIN CAPITAL LETTER O, FULL STOP     # →20.→
+
+33F3 ; 0032 004F 65E5 ;        MA      #* ( ㏳ → 2O日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY → DIGIT TWO, LATIN CAPITAL LETTER O, CJK UNIFIED IDEOGRAPH-65E5      # →20日→
+
+336C ; 0032 004F 70B9 ;        MA      #* ( ㍬ → 2O点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY → DIGIT TWO, LATIN CAPITAL LETTER O, CJK UNIFIED IDEOGRAPH-70B9     # →20点→
+
+33E1 ; 0032 65E5 ;     MA      #* ( ㏡ → 2日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO → DIGIT TWO, CJK UNIFIED IDEOGRAPH-65E5  # 
+
+32C1 ; 0032 6708 ;     MA      #* ( ㋁ → 2月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY → DIGIT TWO, CJK UNIFIED IDEOGRAPH-6708 # 
+
+335A ; 0032 70B9 ;     MA      #* ( ㍚ → 2点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO → DIGIT TWO, CJK UNIFIED IDEOGRAPH-70B9 # 
+
+1D7D1 ;        0033 ;  MA      # ( 𝟑 → 3 ) MATHEMATICAL BOLD DIGIT THREE → DIGIT THREE  # 
+1D7DB ;        0033 ;  MA      # ( 𝟛 → 3 ) MATHEMATICAL DOUBLE-STRUCK DIGIT THREE → DIGIT THREE # 
+1D7E5 ;        0033 ;  MA      # ( 𝟥 → 3 ) MATHEMATICAL SANS-SERIF DIGIT THREE → DIGIT THREE    # 
+1D7EF ;        0033 ;  MA      # ( 𝟯 → 3 ) MATHEMATICAL SANS-SERIF BOLD DIGIT THREE → DIGIT THREE       # 
+1D7F9 ;        0033 ;  MA      # ( 𝟹 → 3 ) MATHEMATICAL MONOSPACE DIGIT THREE → DIGIT THREE     # 
+01B7 ; 0033 ;  MA      # ( Ʒ → 3 ) LATIN CAPITAL LETTER EZH → DIGIT THREE # 
+021C ; 0033 ;  MA      # ( Ȝ → 3 ) LATIN CAPITAL LETTER YOGH → DIGIT THREE        # →Ʒ→
+A76A ; 0033 ;  MA      # ( Ꝫ → 3 ) LATIN CAPITAL LETTER ET → DIGIT THREE # 
+2CCC ; 0033 ;  MA      # ( Ⳍ → 3 ) COPTIC CAPITAL LETTER OLD COPTIC HORI → DIGIT THREE   # →Ȝ→→Ʒ→
+0417 ; 0033 ;  MA      # ( З → 3 ) CYRILLIC CAPITAL LETTER ZE → DIGIT THREE       # 
+04E0 ; 0033 ;  MA      # ( Ӡ → 3 ) CYRILLIC CAPITAL LETTER ABKHASIAN DZE → DIGIT THREE    # →Ʒ→
+0545 ; 0033 ;  MA      # ( Յ → 3 ) ARMENIAN CAPITAL LETTER YI → DIGIT THREE       # 
+
+2462 ; 2782 ;  MA      #* ( ③ → ➂ ) CIRCLED DIGIT THREE → DINGBAT CIRCLED SANS-SERIF DIGIT THREE       # 
+
+0498 ; 0033 0326 ;     MA      # ( Ҙ → 3̦ ) CYRILLIC CAPITAL LETTER ZE WITH DESCENDER → DIGIT THREE, COMBINING COMMA BELOW       # →З̧→
+
+06F3 ; 0663 ;  MA      # ( ۳ → ‎٣‎ ) EXTENDED ARABIC-INDIC DIGIT THREE → ARABIC-INDIC DIGIT THREE    # 
+
+0AE9 ; 0969 ;  MA      # ( ૩ → ३ ) GUJARATI DIGIT THREE → DEVANAGARI DIGIT THREE       # 
+
+1F104 ;        0033 002C ;     MA      #* ( 🄄 → 3, ) DIGIT THREE COMMA → DIGIT THREE, COMMA     # 
+
+248A ; 0033 002E ;     MA      #* ( ⒊ → 3. ) DIGIT THREE FULL STOP → DIGIT THREE, FULL STOP      # 
+
+33FE ; 0033 006C 65E5 ;        MA      #* ( ㏾ → 3l日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE → DIGIT THREE, LATIN SMALL LETTER L, CJK UNIFIED IDEOGRAPH-65E5  # →31日→
+
+33FD ; 0033 004F 65E5 ;        MA      #* ( ㏽ → 3O日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY → DIGIT THREE, LATIN CAPITAL LETTER O, CJK UNIFIED IDEOGRAPH-65E5    # →30日→
+
+33E2 ; 0033 65E5 ;     MA      #* ( ㏢ → 3日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE → DIGIT THREE, CJK UNIFIED IDEOGRAPH-65E5      # 
+
+32C2 ; 0033 6708 ;     MA      #* ( ㋂ → 3月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH → DIGIT THREE, CJK UNIFIED IDEOGRAPH-6708  # 
+
+335B ; 0033 70B9 ;     MA      #* ( ㍛ → 3点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE → DIGIT THREE, CJK UNIFIED IDEOGRAPH-70B9     # 
+
+1D7D2 ;        0034 ;  MA      # ( 𝟒 → 4 ) MATHEMATICAL BOLD DIGIT FOUR → DIGIT FOUR    # 
+1D7DC ;        0034 ;  MA      # ( 𝟜 → 4 ) MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR → DIGIT FOUR   # 
+1D7E6 ;        0034 ;  MA      # ( 𝟦 → 4 ) MATHEMATICAL SANS-SERIF DIGIT FOUR → DIGIT FOUR      # 
+1D7F0 ;        0034 ;  MA      # ( 𝟰 → 4 ) MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR → DIGIT FOUR # 
+1D7FA ;        0034 ;  MA      # ( 𝟺 → 4 ) MATHEMATICAL MONOSPACE DIGIT FOUR → DIGIT FOUR       # 
+13CE ; 0034 ;  MA      # ( Ꮞ → 4 ) CHEROKEE LETTER SE → DIGIT FOUR       # 
+
+2463 ; 2783 ;  MA      #* ( ④ → ➃ ) CIRCLED DIGIT FOUR → DINGBAT CIRCLED SANS-SERIF DIGIT FOUR # 
+
+0AEA ; 096A ;  MA      # ( ૪ → ४ ) GUJARATI DIGIT FOUR → DEVANAGARI DIGIT FOUR # 
+
+1F105 ;        0034 002C ;     MA      #* ( 🄅 → 4, ) DIGIT FOUR COMMA → DIGIT FOUR, COMMA       # 
+
+248B ; 0034 002E ;     MA      #* ( ⒋ → 4. ) DIGIT FOUR FULL STOP → DIGIT FOUR, FULL STOP        # 
+
+1530 ; 0034 00B7 ;     MA      # ( ᔰ → 4· ) CANADIAN SYLLABICS WEST-CREE YWE → DIGIT FOUR, MIDDLE DOT   # →4ᐧ→
+
+33E3 ; 0034 65E5 ;     MA      #* ( ㏣ → 4日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR → DIGIT FOUR, CJK UNIFIED IDEOGRAPH-65E5        # 
+
+32C3 ; 0034 6708 ;     MA      #* ( ㋃ → 4月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL → DIGIT FOUR, CJK UNIFIED IDEOGRAPH-6708   # 
+
+335C ; 0034 70B9 ;     MA      #* ( ㍜ → 4点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR → DIGIT FOUR, CJK UNIFIED IDEOGRAPH-70B9       # 
+
+1D7D3 ;        0035 ;  MA      # ( 𝟓 → 5 ) MATHEMATICAL BOLD DIGIT FIVE → DIGIT FIVE    # 
+1D7DD ;        0035 ;  MA      # ( 𝟝 → 5 ) MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE → DIGIT FIVE   # 
+1D7E7 ;        0035 ;  MA      # ( 𝟧 → 5 ) MATHEMATICAL SANS-SERIF DIGIT FIVE → DIGIT FIVE      # 
+1D7F1 ;        0035 ;  MA      # ( 𝟱 → 5 ) MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE → DIGIT FIVE # 
+1D7FB ;        0035 ;  MA      # ( 𝟻 → 5 ) MATHEMATICAL MONOSPACE DIGIT FIVE → DIGIT FIVE       # 
+01BC ; 0035 ;  MA      # ( Ƽ → 5 ) LATIN CAPITAL LETTER TONE FIVE → DIGIT FIVE    # 
+
+2464 ; 2784 ;  MA      #* ( ⑤ → ➄ ) CIRCLED DIGIT FIVE → DINGBAT CIRCLED SANS-SERIF DIGIT FIVE # 
+
+1F106 ;        0035 002C ;     MA      #* ( 🄆 → 5, ) DIGIT FIVE COMMA → DIGIT FIVE, COMMA       # 
+
+248C ; 0035 002E ;     MA      #* ( ⒌ → 5. ) DIGIT FIVE FULL STOP → DIGIT FIVE, FULL STOP        # 
+
+33E4 ; 0035 65E5 ;     MA      #* ( ㏤ → 5日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE → DIGIT FIVE, CJK UNIFIED IDEOGRAPH-65E5        # 
+
+32C4 ; 0035 6708 ;     MA      #* ( ㋄ → 5月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY → DIGIT FIVE, CJK UNIFIED IDEOGRAPH-6708     # 
+
+335D ; 0035 70B9 ;     MA      #* ( ㍝ → 5点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE → DIGIT FIVE, CJK UNIFIED IDEOGRAPH-70B9       # 
+
+1D7D4 ;        0036 ;  MA      # ( 𝟔 → 6 ) MATHEMATICAL BOLD DIGIT SIX → DIGIT SIX      # 
+1D7DE ;        0036 ;  MA      # ( 𝟞 → 6 ) MATHEMATICAL DOUBLE-STRUCK DIGIT SIX → DIGIT SIX     # 
+1D7E8 ;        0036 ;  MA      # ( 𝟨 → 6 ) MATHEMATICAL SANS-SERIF DIGIT SIX → DIGIT SIX        # 
+1D7F2 ;        0036 ;  MA      # ( 𝟲 → 6 ) MATHEMATICAL SANS-SERIF BOLD DIGIT SIX → DIGIT SIX   # 
+1D7FC ;        0036 ;  MA      # ( 𝟼 → 6 ) MATHEMATICAL MONOSPACE DIGIT SIX → DIGIT SIX # 
+2CD2 ; 0036 ;  MA      # ( Ⳓ → 6 ) COPTIC CAPITAL LETTER OLD COPTIC HEI → DIGIT SIX      # 
+0431 ; 0036 ;  MA      # ( б → 6 ) CYRILLIC SMALL LETTER BE → DIGIT SIX   # 
+
+2465 ; 2785 ;  MA      #* ( ⑥ → ➅ ) CIRCLED DIGIT SIX → DINGBAT CIRCLED SANS-SERIF DIGIT SIX   # 
+
+1F107 ;        0036 002C ;     MA      #* ( 🄇 → 6, ) DIGIT SIX COMMA → DIGIT SIX, COMMA # 
+
+248D ; 0036 002E ;     MA      #* ( ⒍ → 6. ) DIGIT SIX FULL STOP → DIGIT SIX, FULL STOP  # 
+
+33E5 ; 0036 65E5 ;     MA      #* ( ㏥ → 6日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX → DIGIT SIX, CJK UNIFIED IDEOGRAPH-65E5  # 
+
+32C5 ; 0036 6708 ;     MA      #* ( ㋅ → 6月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE → DIGIT SIX, CJK UNIFIED IDEOGRAPH-6708     # 
+
+335E ; 0036 70B9 ;     MA      #* ( ㍞ → 6点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX → DIGIT SIX, CJK UNIFIED IDEOGRAPH-70B9 # 
+
+1D7D5 ;        0037 ;  MA      # ( 𝟕 → 7 ) MATHEMATICAL BOLD DIGIT SEVEN → DIGIT SEVEN  # 
+1D7DF ;        0037 ;  MA      # ( 𝟟 → 7 ) MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN → DIGIT SEVEN # 
+1D7E9 ;        0037 ;  MA      # ( 𝟩 → 7 ) MATHEMATICAL SANS-SERIF DIGIT SEVEN → DIGIT SEVEN    # 
+1D7F3 ;        0037 ;  MA      # ( 𝟳 → 7 ) MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN → DIGIT SEVEN       # 
+1D7FD ;        0037 ;  MA      # ( 𝟽 → 7 ) MATHEMATICAL MONOSPACE DIGIT SEVEN → DIGIT SEVEN     # 
+
+2466 ; 2786 ;  MA      #* ( ⑦ → ➆ ) CIRCLED DIGIT SEVEN → DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN       # 
+
+06F7 ; 0667 ;  MA      # ( ۷ → ‎٧‎ ) EXTENDED ARABIC-INDIC DIGIT SEVEN → ARABIC-INDIC DIGIT SEVEN    # 
+
+1F108 ;        0037 002C ;     MA      #* ( 🄈 → 7, ) DIGIT SEVEN COMMA → DIGIT SEVEN, COMMA     # 
+
+248E ; 0037 002E ;     MA      #* ( ⒎ → 7. ) DIGIT SEVEN FULL STOP → DIGIT SEVEN, FULL STOP      # 
+
+33E6 ; 0037 65E5 ;     MA      #* ( ㏦ → 7日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN → DIGIT SEVEN, CJK UNIFIED IDEOGRAPH-65E5      # 
+
+32C6 ; 0037 6708 ;     MA      #* ( ㋆ → 7月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY → DIGIT SEVEN, CJK UNIFIED IDEOGRAPH-6708   # 
+
+335F ; 0037 70B9 ;     MA      #* ( ㍟ → 7点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN → DIGIT SEVEN, CJK UNIFIED IDEOGRAPH-70B9     # 
+
+0B03 ; 0038 ;  MA      # ( ଃ → 8 ) ORIYA SIGN VISARGA → DIGIT EIGHT      # 
+09EA ; 0038 ;  MA      # ( ৪ → 8 ) BENGALI DIGIT FOUR → DIGIT EIGHT      # 
+0A6A ; 0038 ;  MA      # ( ੪ → 8 ) GURMUKHI DIGIT FOUR → DIGIT EIGHT     # 
+1D7D6 ;        0038 ;  MA      # ( 𝟖 → 8 ) MATHEMATICAL BOLD DIGIT EIGHT → DIGIT EIGHT  # 
+1D7E0 ;        0038 ;  MA      # ( 𝟠 → 8 ) MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT → DIGIT EIGHT # 
+1D7EA ;        0038 ;  MA      # ( 𝟪 → 8 ) MATHEMATICAL SANS-SERIF DIGIT EIGHT → DIGIT EIGHT    # 
+1D7F4 ;        0038 ;  MA      # ( 𝟴 → 8 ) MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT → DIGIT EIGHT       # 
+1D7FE ;        0038 ;  MA      # ( 𝟾 → 8 ) MATHEMATICAL MONOSPACE DIGIT EIGHT → DIGIT EIGHT     # 
+0223 ; 0038 ;  MA      # ( ȣ → 8 ) LATIN SMALL LETTER OU → DIGIT EIGHT    # 
+0222 ; 0038 ;  MA      # ( Ȣ → 8 ) LATIN CAPITAL LETTER OU → DIGIT EIGHT  # 
+
+2467 ; 2787 ;  MA      #* ( ⑧ → ➇ ) CIRCLED DIGIT EIGHT → DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT       # 
+
+06F8 ; 0668 ;  MA      # ( ۸ → ‎٨‎ ) EXTENDED ARABIC-INDIC DIGIT EIGHT → ARABIC-INDIC DIGIT EIGHT    # 
+
+0AEE ; 096E ;  MA      # ( ૮ → ८ ) GUJARATI DIGIT EIGHT → DEVANAGARI DIGIT EIGHT       # 
+
+1F109 ;        0038 002C ;     MA      #* ( 🄉 → 8, ) DIGIT EIGHT COMMA → DIGIT EIGHT, COMMA     # 
+
+248F ; 0038 002E ;     MA      #* ( ⒏ → 8. ) DIGIT EIGHT FULL STOP → DIGIT EIGHT, FULL STOP      # 
+
+33E7 ; 0038 65E5 ;     MA      #* ( ㏧ → 8日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT → DIGIT EIGHT, CJK UNIFIED IDEOGRAPH-65E5      # 
+
+32C7 ; 0038 6708 ;     MA      #* ( ㋇ → 8月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST → DIGIT EIGHT, CJK UNIFIED IDEOGRAPH-6708 # 
+
+3360 ; 0038 70B9 ;     MA      #* ( ㍠ → 8点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT → DIGIT EIGHT, CJK UNIFIED IDEOGRAPH-70B9     # 
+
+0A67 ; 0039 ;  MA      # ( ੧ → 9 ) GURMUKHI DIGIT ONE → DIGIT NINE       # 
+0B68 ; 0039 ;  MA      # ( ୨ → 9 ) ORIYA DIGIT TWO → DIGIT NINE  # 
+09ED ; 0039 ;  MA      # ( ৭ → 9 ) BENGALI DIGIT SEVEN → DIGIT NINE      # 
+1D7D7 ;        0039 ;  MA      # ( 𝟗 → 9 ) MATHEMATICAL BOLD DIGIT NINE → DIGIT NINE    # 
+1D7E1 ;        0039 ;  MA      # ( 𝟡 → 9 ) MATHEMATICAL DOUBLE-STRUCK DIGIT NINE → DIGIT NINE   # 
+1D7EB ;        0039 ;  MA      # ( 𝟫 → 9 ) MATHEMATICAL SANS-SERIF DIGIT NINE → DIGIT NINE      # 
+1D7F5 ;        0039 ;  MA      # ( 𝟵 → 9 ) MATHEMATICAL SANS-SERIF BOLD DIGIT NINE → DIGIT NINE # 
+1D7FF ;        0039 ;  MA      # ( 𝟿 → 9 ) MATHEMATICAL MONOSPACE DIGIT NINE → DIGIT NINE       # 
+A76E ; 0039 ;  MA      # ( Ꝯ → 9 ) LATIN CAPITAL LETTER CON → DIGIT NINE # 
+2CCA ; 0039 ;  MA      # ( Ⳋ → 9 ) COPTIC CAPITAL LETTER DIALECT-P HORI → DIGIT NINE     # 
+
+2468 ; 2788 ;  MA      #* ( ⑨ → ➈ ) CIRCLED DIGIT NINE → DINGBAT CIRCLED SANS-SERIF DIGIT NINE # 
+
+06F9 ; 0669 ;  MA      # ( ۹ → ‎٩‎ ) EXTENDED ARABIC-INDIC DIGIT NINE → ARABIC-INDIC DIGIT NINE      # 
+
+0CEF ; 0C6F ;  MA      # ( ೯ → ౯ ) KANNADA DIGIT NINE → TELUGU DIGIT NINE      # 
+
+1F10A ;        0039 002C ;     MA      #* ( 🄊 → 9, ) DIGIT NINE COMMA → DIGIT NINE, COMMA       # 
+
+2490 ; 0039 002E ;     MA      #* ( ⒐ → 9. ) DIGIT NINE FULL STOP → DIGIT NINE, FULL STOP        # 
+
+33E8 ; 0039 65E5 ;     MA      #* ( ㏨ → 9日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE → DIGIT NINE, CJK UNIFIED IDEOGRAPH-65E5        # 
+
+32C8 ; 0039 6708 ;     MA      #* ( ㋈ → 9月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER → DIGIT NINE, CJK UNIFIED IDEOGRAPH-6708       # 
+
+3361 ; 0039 70B9 ;     MA      #* ( ㍡ → 9点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE → DIGIT NINE, CJK UNIFIED IDEOGRAPH-70B9       # 
+
+237A ; 0061 ;  MA      #* ( ⍺ → a ) APL FUNCTIONAL SYMBOL ALPHA → LATIN SMALL LETTER A   # →α→
+FF41 ; 0061 ;  MA      # ( a → a ) FULLWIDTH LATIN SMALL LETTER A → LATIN SMALL LETTER A # →а→
+1D41A ;        0061 ;  MA      # ( 𝐚 → a ) MATHEMATICAL BOLD SMALL A → LATIN SMALL LETTER A     # 
+1D44E ;        0061 ;  MA      # ( 𝑎 → a ) MATHEMATICAL ITALIC SMALL A → LATIN SMALL LETTER A   # 
+1D482 ;        0061 ;  MA      # ( 𝒂 → a ) MATHEMATICAL BOLD ITALIC SMALL A → LATIN SMALL LETTER A      # 
+1D4B6 ;        0061 ;  MA      # ( 𝒶 → a ) MATHEMATICAL SCRIPT SMALL A → LATIN SMALL LETTER A   # 
+1D4EA ;        0061 ;  MA      # ( 𝓪 → a ) MATHEMATICAL BOLD SCRIPT SMALL A → LATIN SMALL LETTER A      # 
+1D51E ;        0061 ;  MA      # ( 𝔞 → a ) MATHEMATICAL FRAKTUR SMALL A → LATIN SMALL LETTER A  # 
+1D552 ;        0061 ;  MA      # ( 𝕒 → a ) MATHEMATICAL DOUBLE-STRUCK SMALL A → LATIN SMALL LETTER A    # 
+1D586 ;        0061 ;  MA      # ( 𝖆 → a ) MATHEMATICAL BOLD FRAKTUR SMALL A → LATIN SMALL LETTER A     # 
+1D5BA ;        0061 ;  MA      # ( 𝖺 → a ) MATHEMATICAL SANS-SERIF SMALL A → LATIN SMALL LETTER A       # 
+1D5EE ;        0061 ;  MA      # ( 𝗮 → a ) MATHEMATICAL SANS-SERIF BOLD SMALL A → LATIN SMALL LETTER A  # 
+1D622 ;        0061 ;  MA      # ( 𝘢 → a ) MATHEMATICAL SANS-SERIF ITALIC SMALL A → LATIN SMALL LETTER A        # 
+1D656 ;        0061 ;  MA      # ( 𝙖 → a ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A → LATIN SMALL LETTER A   # 
+1D68A ;        0061 ;  MA      # ( 𝚊 → a ) MATHEMATICAL MONOSPACE SMALL A → LATIN SMALL LETTER A        # 
+0251 ; 0061 ;  MA      # ( ɑ → a ) LATIN SMALL LETTER ALPHA → LATIN SMALL LETTER A        # 
+03B1 ; 0061 ;  MA      # ( α → a ) GREEK SMALL LETTER ALPHA → LATIN SMALL LETTER A        # 
+1D6C2 ;        0061 ;  MA      # ( 𝛂 → a ) MATHEMATICAL BOLD SMALL ALPHA → LATIN SMALL LETTER A # →α→
+1D6FC ;        0061 ;  MA      # ( 𝛼 → a ) MATHEMATICAL ITALIC SMALL ALPHA → LATIN SMALL LETTER A       # →α→
+1D736 ;        0061 ;  MA      # ( 𝜶 → a ) MATHEMATICAL BOLD ITALIC SMALL ALPHA → LATIN SMALL LETTER A  # →α→
+1D770 ;        0061 ;  MA      # ( 𝝰 → a ) MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA → LATIN SMALL LETTER A      # →α→
+1D7AA ;        0061 ;  MA      # ( 𝞪 → a ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA → LATIN SMALL LETTER A       # →α→
+0430 ; 0061 ;  MA      # ( а → a ) CYRILLIC SMALL LETTER A → LATIN SMALL LETTER A # 
+
+FF21 ; 0041 ;  MA      # ( A → A ) FULLWIDTH LATIN CAPITAL LETTER A → LATIN CAPITAL LETTER A     # →А→
+1D400 ;        0041 ;  MA      # ( 𝐀 → A ) MATHEMATICAL BOLD CAPITAL A → LATIN CAPITAL LETTER A # 
+1D434 ;        0041 ;  MA      # ( 𝐴 → A ) MATHEMATICAL ITALIC CAPITAL A → LATIN CAPITAL LETTER A       # 
+1D468 ;        0041 ;  MA      # ( 𝑨 → A ) MATHEMATICAL BOLD ITALIC CAPITAL A → LATIN CAPITAL LETTER A  # 
+1D49C ;        0041 ;  MA      # ( 𝒜 → A ) MATHEMATICAL SCRIPT CAPITAL A → LATIN CAPITAL LETTER A       # 
+1D4D0 ;        0041 ;  MA      # ( 𝓐 → A ) MATHEMATICAL BOLD SCRIPT CAPITAL A → LATIN CAPITAL LETTER A  # 
+1D504 ;        0041 ;  MA      # ( 𝔄 → A ) MATHEMATICAL FRAKTUR CAPITAL A → LATIN CAPITAL LETTER A      # 
+1D538 ;        0041 ;  MA      # ( 𝔸 → A ) MATHEMATICAL DOUBLE-STRUCK CAPITAL A → LATIN CAPITAL LETTER A        # 
+1D56C ;        0041 ;  MA      # ( 𝕬 → A ) MATHEMATICAL BOLD FRAKTUR CAPITAL A → LATIN CAPITAL LETTER A # 
+1D5A0 ;        0041 ;  MA      # ( 𝖠 → A ) MATHEMATICAL SANS-SERIF CAPITAL A → LATIN CAPITAL LETTER A   # 
+1D5D4 ;        0041 ;  MA      # ( 𝗔 → A ) MATHEMATICAL SANS-SERIF BOLD CAPITAL A → LATIN CAPITAL LETTER A      # 
+1D608 ;        0041 ;  MA      # ( 𝘈 → A ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL A → LATIN CAPITAL LETTER A    # 
+1D63C ;        0041 ;  MA      # ( 𝘼 → A ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A → LATIN CAPITAL LETTER A       # 
+1D670 ;        0041 ;  MA      # ( 𝙰 → A ) MATHEMATICAL MONOSPACE CAPITAL A → LATIN CAPITAL LETTER A    # 
+0391 ; 0041 ;  MA      # ( Α → A ) GREEK CAPITAL LETTER ALPHA → LATIN CAPITAL LETTER A    # 
+1D6A8 ;        0041 ;  MA      # ( 𝚨 → A ) MATHEMATICAL BOLD CAPITAL ALPHA → LATIN CAPITAL LETTER A     # →𝐀→
+1D6E2 ;        0041 ;  MA      # ( 𝛢 → A ) MATHEMATICAL ITALIC CAPITAL ALPHA → LATIN CAPITAL LETTER A   # →𝐴→
+1D71C ;        0041 ;  MA      # ( 𝜜 → A ) MATHEMATICAL BOLD ITALIC CAPITAL ALPHA → LATIN CAPITAL LETTER A      # →𝑨→
+1D756 ;        0041 ;  MA      # ( 𝝖 → A ) MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA → LATIN CAPITAL LETTER A  # →Α→
+1D790 ;        0041 ;  MA      # ( 𝞐 → A ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA → LATIN CAPITAL LETTER A   # →Α→
+0410 ; 0041 ;  MA      # ( А → A ) CYRILLIC CAPITAL LETTER A → LATIN CAPITAL LETTER A     # 
+13AA ; 0041 ;  MA      # ( Ꭺ → A ) CHEROKEE LETTER GO → LATIN CAPITAL LETTER A   # 
+15C5 ; 0041 ;  MA      # ( ᗅ → A ) CANADIAN SYLLABICS CARRIER GHO → LATIN CAPITAL LETTER A       # 
+A4EE ; 0041 ;  MA      # ( ꓮ → A ) LISU LETTER A → LATIN CAPITAL LETTER A        # 
+
+01CE ; 0103 ;  MA      # ( ǎ → ă ) LATIN SMALL LETTER A WITH CARON → LATIN SMALL LETTER A WITH BREVE     # 
+
+01CD ; 0102 ;  MA      # ( Ǎ → Ă ) LATIN CAPITAL LETTER A WITH CARON → LATIN CAPITAL LETTER A WITH BREVE # 
+
+0227 ; 00E5 ;  MA      # ( ȧ → å ) LATIN SMALL LETTER A WITH DOT ABOVE → LATIN SMALL LETTER A WITH RING ABOVE    # 
+
+0226 ; 00C5 ;  MA      # ( Ȧ → Å ) LATIN CAPITAL LETTER A WITH DOT ABOVE → LATIN CAPITAL LETTER A WITH RING ABOVE        # 
+
+1E9A ; 1EA3 ;  MA      # ( ẚ → ả ) LATIN SMALL LETTER A WITH RIGHT HALF RING → LATIN SMALL LETTER A WITH HOOK ABOVE    # 
+
+A733 ; 0061 0061 ;     MA      # ( ꜳ → aa ) LATIN SMALL LETTER AA → LATIN SMALL LETTER A, LATIN SMALL LETTER A   # 
+
+A732 ; 0041 0041 ;     MA      # ( Ꜳ → AA ) LATIN CAPITAL LETTER AA → LATIN CAPITAL LETTER A, LATIN CAPITAL LETTER A     # 
+
+00E6 ; 0061 0065 ;     MA      # ( æ → ae ) LATIN SMALL LETTER AE → LATIN SMALL LETTER A, LATIN SMALL LETTER E    # 
+04D5 ; 0061 0065 ;     MA      # ( ӕ → ae ) CYRILLIC SMALL LIGATURE A IE → LATIN SMALL LETTER A, LATIN SMALL LETTER E     # →ае→
+
+00C6 ; 0041 0045 ;     MA      # ( Æ → AE ) LATIN CAPITAL LETTER AE → LATIN CAPITAL LETTER A, LATIN CAPITAL LETTER E      # 
+04D4 ; 0041 0045 ;     MA      # ( Ӕ → AE ) CYRILLIC CAPITAL LIGATURE A IE → LATIN CAPITAL LETTER A, LATIN CAPITAL LETTER E       # →Æ→
+
+A735 ; 0061 006F ;     MA      # ( ꜵ → ao ) LATIN SMALL LETTER AO → LATIN SMALL LETTER A, LATIN SMALL LETTER O   # 
+
+A734 ; 0041 004F ;     MA      # ( Ꜵ → AO ) LATIN CAPITAL LETTER AO → LATIN CAPITAL LETTER A, LATIN CAPITAL LETTER O     # 
+
+A737 ; 0061 0075 ;     MA      # ( ꜷ → au ) LATIN SMALL LETTER AU → LATIN SMALL LETTER A, LATIN SMALL LETTER U   # 
+
+A736 ; 0041 0055 ;     MA      # ( Ꜷ → AU ) LATIN CAPITAL LETTER AU → LATIN CAPITAL LETTER A, LATIN CAPITAL LETTER U     # 
+
+A739 ; 0061 0076 ;     MA      # ( ꜹ → av ) LATIN SMALL LETTER AV → LATIN SMALL LETTER A, LATIN SMALL LETTER V   # 
+A73B ; 0061 0076 ;     MA      # ( ꜻ → av ) LATIN SMALL LETTER AV WITH HORIZONTAL BAR → LATIN SMALL LETTER A, LATIN SMALL LETTER V       # 
+
+A738 ; 0041 0056 ;     MA      # ( Ꜹ → AV ) LATIN CAPITAL LETTER AV → LATIN CAPITAL LETTER A, LATIN CAPITAL LETTER V     # 
+A73A ; 0041 0056 ;     MA      # ( Ꜻ → AV ) LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR → LATIN CAPITAL LETTER A, LATIN CAPITAL LETTER V # 
+
+A73D ; 0061 0079 ;     MA      # ( ꜽ → ay ) LATIN SMALL LETTER AY → LATIN SMALL LETTER A, LATIN SMALL LETTER Y   # 
+
+A73C ; 0041 0059 ;     MA      # ( Ꜽ → AY ) LATIN CAPITAL LETTER AY → LATIN CAPITAL LETTER A, LATIN CAPITAL LETTER Y     # 
+
+1D41B ;        0062 ;  MA      # ( 𝐛 → b ) MATHEMATICAL BOLD SMALL B → LATIN SMALL LETTER B     # 
+1D44F ;        0062 ;  MA      # ( 𝑏 → b ) MATHEMATICAL ITALIC SMALL B → LATIN SMALL LETTER B   # 
+1D483 ;        0062 ;  MA      # ( 𝒃 → b ) MATHEMATICAL BOLD ITALIC SMALL B → LATIN SMALL LETTER B      # 
+1D4B7 ;        0062 ;  MA      # ( 𝒷 → b ) MATHEMATICAL SCRIPT SMALL B → LATIN SMALL LETTER B   # 
+1D4EB ;        0062 ;  MA      # ( 𝓫 → b ) MATHEMATICAL BOLD SCRIPT SMALL B → LATIN SMALL LETTER B      # 
+1D51F ;        0062 ;  MA      # ( 𝔟 → b ) MATHEMATICAL FRAKTUR SMALL B → LATIN SMALL LETTER B  # 
+1D553 ;        0062 ;  MA      # ( 𝕓 → b ) MATHEMATICAL DOUBLE-STRUCK SMALL B → LATIN SMALL LETTER B    # 
+1D587 ;        0062 ;  MA      # ( 𝖇 → b ) MATHEMATICAL BOLD FRAKTUR SMALL B → LATIN SMALL LETTER B     # 
+1D5BB ;        0062 ;  MA      # ( 𝖻 → b ) MATHEMATICAL SANS-SERIF SMALL B → LATIN SMALL LETTER B       # 
+1D5EF ;        0062 ;  MA      # ( 𝗯 → b ) MATHEMATICAL SANS-SERIF BOLD SMALL B → LATIN SMALL LETTER B  # 
+1D623 ;        0062 ;  MA      # ( 𝘣 → b ) MATHEMATICAL SANS-SERIF ITALIC SMALL B → LATIN SMALL LETTER B        # 
+1D657 ;        0062 ;  MA      # ( 𝙗 → b ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B → LATIN SMALL LETTER B   # 
+1D68B ;        0062 ;  MA      # ( 𝚋 → b ) MATHEMATICAL MONOSPACE SMALL B → LATIN SMALL LETTER B        # 
+0184 ; 0062 ;  MA      # ( Ƅ → b ) LATIN CAPITAL LETTER TONE SIX → LATIN SMALL LETTER B   # 
+042C ; 0062 ;  MA      # ( Ь → b ) CYRILLIC CAPITAL LETTER SOFT SIGN → LATIN SMALL LETTER B       # →Ƅ→
+13CF ; 0062 ;  MA      # ( Ꮟ → b ) CHEROKEE LETTER SI → LATIN SMALL LETTER B     # 
+15AF ; 0062 ;  MA      # ( ᖯ → b ) CANADIAN SYLLABICS AIVILIK B → LATIN SMALL LETTER B   # 
+
+FF22 ; 0042 ;  MA      # ( B → B ) FULLWIDTH LATIN CAPITAL LETTER B → LATIN CAPITAL LETTER B     # →В→
+212C ; 0042 ;  MA      # ( ℬ → B ) SCRIPT CAPITAL B → LATIN CAPITAL LETTER B     # 
+1D401 ;        0042 ;  MA      # ( 𝐁 → B ) MATHEMATICAL BOLD CAPITAL B → LATIN CAPITAL LETTER B # 
+1D435 ;        0042 ;  MA      # ( 𝐵 → B ) MATHEMATICAL ITALIC CAPITAL B → LATIN CAPITAL LETTER B       # 
+1D469 ;        0042 ;  MA      # ( 𝑩 → B ) MATHEMATICAL BOLD ITALIC CAPITAL B → LATIN CAPITAL LETTER B  # 
+1D4D1 ;        0042 ;  MA      # ( 𝓑 → B ) MATHEMATICAL BOLD SCRIPT CAPITAL B → LATIN CAPITAL LETTER B  # 
+1D505 ;        0042 ;  MA      # ( 𝔅 → B ) MATHEMATICAL FRAKTUR CAPITAL B → LATIN CAPITAL LETTER B      # 
+1D539 ;        0042 ;  MA      # ( 𝔹 → B ) MATHEMATICAL DOUBLE-STRUCK CAPITAL B → LATIN CAPITAL LETTER B        # 
+1D56D ;        0042 ;  MA      # ( 𝕭 → B ) MATHEMATICAL BOLD FRAKTUR CAPITAL B → LATIN CAPITAL LETTER B # 
+1D5A1 ;        0042 ;  MA      # ( 𝖡 → B ) MATHEMATICAL SANS-SERIF CAPITAL B → LATIN CAPITAL LETTER B   # 
+1D5D5 ;        0042 ;  MA      # ( 𝗕 → B ) MATHEMATICAL SANS-SERIF BOLD CAPITAL B → LATIN CAPITAL LETTER B      # 
+1D609 ;        0042 ;  MA      # ( 𝘉 → B ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL B → LATIN CAPITAL LETTER B    # 
+1D63D ;        0042 ;  MA      # ( 𝘽 → B ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B → LATIN CAPITAL LETTER B       # 
+1D671 ;        0042 ;  MA      # ( 𝙱 → B ) MATHEMATICAL MONOSPACE CAPITAL B → LATIN CAPITAL LETTER B    # 
+0392 ; 0042 ;  MA      # ( Β → B ) GREEK CAPITAL LETTER BETA → LATIN CAPITAL LETTER B     # 
+1D6A9 ;        0042 ;  MA      # ( 𝚩 → B ) MATHEMATICAL BOLD CAPITAL BETA → LATIN CAPITAL LETTER B      # →𝐁→
+1D6E3 ;        0042 ;  MA      # ( 𝛣 → B ) MATHEMATICAL ITALIC CAPITAL BETA → LATIN CAPITAL LETTER B    # →𝐵→
+1D71D ;        0042 ;  MA      # ( 𝜝 → B ) MATHEMATICAL BOLD ITALIC CAPITAL BETA → LATIN CAPITAL LETTER B       # →𝑩→
+1D757 ;        0042 ;  MA      # ( 𝝗 → B ) MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA → LATIN CAPITAL LETTER B   # →Β→
+1D791 ;        0042 ;  MA      # ( 𝞑 → B ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA → LATIN CAPITAL LETTER B    # →Β→
+0412 ; 0042 ;  MA      # ( В → B ) CYRILLIC CAPITAL LETTER VE → LATIN CAPITAL LETTER B    # 
+13F4 ; 0042 ;  MA      # ( Ᏼ → B ) CHEROKEE LETTER YV → LATIN CAPITAL LETTER B   # 
+15F7 ; 0042 ;  MA      # ( ᗷ → B ) CANADIAN SYLLABICS CARRIER KHE → LATIN CAPITAL LETTER B       # 
+A4D0 ; 0042 ;  MA      # ( ꓐ → B ) LISU LETTER BA → LATIN CAPITAL LETTER B       # 
+
+0253 ; 0062 0314 ;     MA      # ( ɓ → b̔ ) LATIN SMALL LETTER B WITH HOOK → LATIN SMALL LETTER B, COMBINING REVERSED COMMA ABOVE        # 
+
+0183 ; 0062 0304 ;     MA      # ( ƃ → b̄ ) LATIN SMALL LETTER B WITH TOPBAR → LATIN SMALL LETTER B, COMBINING MACRON    # 
+0182 ; 0062 0304 ;     MA      # ( Ƃ → b̄ ) LATIN CAPITAL LETTER B WITH TOPBAR → LATIN SMALL LETTER B, COMBINING MACRON  # 
+0411 ; 0062 0304 ;     MA      # ( Б → b̄ ) CYRILLIC CAPITAL LETTER BE → LATIN SMALL LETTER B, COMBINING MACRON  # →Ƃ→
+
+0180 ; 0062 0335 ;     MA      # ( ƀ → b̵ ) LATIN SMALL LETTER B WITH STROKE → LATIN SMALL LETTER B, COMBINING SHORT STROKE OVERLAY      # 
+048D ; 0062 0335 ;     MA      # ( ҍ → b̵ ) CYRILLIC SMALL LETTER SEMISOFT SIGN → LATIN SMALL LETTER B, COMBINING SHORT STROKE OVERLAY   # →ѣ→→Ь̵→
+048C ; 0062 0335 ;     MA      # ( Ҍ → b̵ ) CYRILLIC CAPITAL LETTER SEMISOFT SIGN → LATIN SMALL LETTER B, COMBINING SHORT STROKE OVERLAY # →Ѣ→→Ь̵→
+0463 ; 0062 0335 ;     MA      # ( ѣ → b̵ ) CYRILLIC SMALL LETTER YAT → LATIN SMALL LETTER B, COMBINING SHORT STROKE OVERLAY     # →Ь̵→
+0462 ; 0062 0335 ;     MA      # ( Ѣ → b̵ ) CYRILLIC CAPITAL LETTER YAT → LATIN SMALL LETTER B, COMBINING SHORT STROKE OVERLAY   # →Ь̵→
+
+042B ; 0062 006C ;     MA      # ( Ы → bl ) CYRILLIC CAPITAL LETTER YERU → LATIN SMALL LETTER B, LATIN SMALL LETTER L     # →ЬІ→→Ьl→
+
+0432 ; 0299 ;  MA      # ( в → ʙ ) CYRILLIC SMALL LETTER VE → LATIN LETTER SMALL CAPITAL B       # 
+
+FF43 ; 0063 ;  MA      # ( c → c ) FULLWIDTH LATIN SMALL LETTER C → LATIN SMALL LETTER C # →ϲ→
+217D ; 0063 ;  MA      # ( ⅽ → c ) SMALL ROMAN NUMERAL ONE HUNDRED → LATIN SMALL LETTER C        # 
+1D41C ;        0063 ;  MA      # ( 𝐜 → c ) MATHEMATICAL BOLD SMALL C → LATIN SMALL LETTER C     # 
+1D450 ;        0063 ;  MA      # ( 𝑐 → c ) MATHEMATICAL ITALIC SMALL C → LATIN SMALL LETTER C   # 
+1D484 ;        0063 ;  MA      # ( 𝒄 → c ) MATHEMATICAL BOLD ITALIC SMALL C → LATIN SMALL LETTER C      # 
+1D4B8 ;        0063 ;  MA      # ( 𝒸 → c ) MATHEMATICAL SCRIPT SMALL C → LATIN SMALL LETTER C   # 
+1D4EC ;        0063 ;  MA      # ( 𝓬 → c ) MATHEMATICAL BOLD SCRIPT SMALL C → LATIN SMALL LETTER C      # 
+1D520 ;        0063 ;  MA      # ( 𝔠 → c ) MATHEMATICAL FRAKTUR SMALL C → LATIN SMALL LETTER C  # 
+1D554 ;        0063 ;  MA      # ( 𝕔 → c ) MATHEMATICAL DOUBLE-STRUCK SMALL C → LATIN SMALL LETTER C    # 
+1D588 ;        0063 ;  MA      # ( 𝖈 → c ) MATHEMATICAL BOLD FRAKTUR SMALL C → LATIN SMALL LETTER C     # 
+1D5BC ;        0063 ;  MA      # ( 𝖼 → c ) MATHEMATICAL SANS-SERIF SMALL C → LATIN SMALL LETTER C       # 
+1D5F0 ;        0063 ;  MA      # ( 𝗰 → c ) MATHEMATICAL SANS-SERIF BOLD SMALL C → LATIN SMALL LETTER C  # 
+1D624 ;        0063 ;  MA      # ( 𝘤 → c ) MATHEMATICAL SANS-SERIF ITALIC SMALL C → LATIN SMALL LETTER C        # 
+1D658 ;        0063 ;  MA      # ( 𝙘 → c ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C → LATIN SMALL LETTER C   # 
+1D68C ;        0063 ;  MA      # ( 𝚌 → c ) MATHEMATICAL MONOSPACE SMALL C → LATIN SMALL LETTER C        # 
+1D04 ; 0063 ;  MA      # ( ᴄ → c ) LATIN LETTER SMALL CAPITAL C → LATIN SMALL LETTER C   # 
+03F2 ; 0063 ;  MA      # ( ϲ → c ) GREEK LUNATE SIGMA SYMBOL → LATIN SMALL LETTER C       # 
+2CA5 ; 0063 ;  MA      # ( ⲥ → c ) COPTIC SMALL LETTER SIMA → LATIN SMALL LETTER C       # →ϲ→
+0441 ; 0063 ;  MA      # ( с → c ) CYRILLIC SMALL LETTER ES → LATIN SMALL LETTER C        # 
+
+FF23 ; 0043 ;  MA      # ( C → C ) FULLWIDTH LATIN CAPITAL LETTER C → LATIN CAPITAL LETTER C     # →С→
+216D ; 0043 ;  MA      # ( Ⅽ → C ) ROMAN NUMERAL ONE HUNDRED → LATIN CAPITAL LETTER C    # 
+2102 ; 0043 ;  MA      # ( ℂ → C ) DOUBLE-STRUCK CAPITAL C → LATIN CAPITAL LETTER C      # 
+212D ; 0043 ;  MA      # ( ℭ → C ) BLACK-LETTER CAPITAL C → LATIN CAPITAL LETTER C       # 
+1D402 ;        0043 ;  MA      # ( 𝐂 → C ) MATHEMATICAL BOLD CAPITAL C → LATIN CAPITAL LETTER C # 
+1D436 ;        0043 ;  MA      # ( 𝐶 → C ) MATHEMATICAL ITALIC CAPITAL C → LATIN CAPITAL LETTER C       # 
+1D46A ;        0043 ;  MA      # ( 𝑪 → C ) MATHEMATICAL BOLD ITALIC CAPITAL C → LATIN CAPITAL LETTER C  # 
+1D49E ;        0043 ;  MA      # ( 𝒞 → C ) MATHEMATICAL SCRIPT CAPITAL C → LATIN CAPITAL LETTER C       # 
+1D4D2 ;        0043 ;  MA      # ( 𝓒 → C ) MATHEMATICAL BOLD SCRIPT CAPITAL C → LATIN CAPITAL LETTER C  # 
+1D56E ;        0043 ;  MA      # ( 𝕮 → C ) MATHEMATICAL BOLD FRAKTUR CAPITAL C → LATIN CAPITAL LETTER C # 
+1D5A2 ;        0043 ;  MA      # ( 𝖢 → C ) MATHEMATICAL SANS-SERIF CAPITAL C → LATIN CAPITAL LETTER C   # 
+1D5D6 ;        0043 ;  MA      # ( 𝗖 → C ) MATHEMATICAL SANS-SERIF BOLD CAPITAL C → LATIN CAPITAL LETTER C      # 
+1D60A ;        0043 ;  MA      # ( 𝘊 → C ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL C → LATIN CAPITAL LETTER C    # 
+1D63E ;        0043 ;  MA      # ( 𝘾 → C ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C → LATIN CAPITAL LETTER C       # 
+1D672 ;        0043 ;  MA      # ( 𝙲 → C ) MATHEMATICAL MONOSPACE CAPITAL C → LATIN CAPITAL LETTER C    # 
+03F9 ; 0043 ;  MA      # ( Ϲ → C ) GREEK CAPITAL LUNATE SIGMA SYMBOL → LATIN CAPITAL LETTER C     # 
+2CA4 ; 0043 ;  MA      # ( Ⲥ → C ) COPTIC CAPITAL LETTER SIMA → LATIN CAPITAL LETTER C   # →Ϲ→
+0421 ; 0043 ;  MA      # ( С → C ) CYRILLIC CAPITAL LETTER ES → LATIN CAPITAL LETTER C    # 
+0BD0 ; 0043 ;  MA      # ( ௐ → C ) TAMIL OM → LATIN CAPITAL LETTER C     # →С→
+13DF ; 0043 ;  MA      # ( Ꮯ → C ) CHEROKEE LETTER TLI → LATIN CAPITAL LETTER C  # 
+A4DA ; 0043 ;  MA      # ( ꓚ → C ) LISU LETTER CA → LATIN CAPITAL LETTER C       # 
+
+00A2 ; 0063 0338 ;     MA      #* ( ¢ → c̸ ) CENT SIGN → LATIN SMALL LETTER C, COMBINING LONG SOLIDUS OVERLAY    # 
+
+00E7 ; 0063 0326 ;     MA      # ( ç → c̦ ) LATIN SMALL LETTER C WITH CEDILLA → LATIN SMALL LETTER C, COMBINING COMMA BELOW      # →ҫ→→с̡→
+04AB ; 0063 0326 ;     MA      # ( ҫ → c̦ ) CYRILLIC SMALL LETTER ES WITH DESCENDER → LATIN SMALL LETTER C, COMBINING COMMA BELOW        # →с̡→
+
+00C7 ; 0043 0326 ;     MA      # ( Ç → C̦ ) LATIN CAPITAL LETTER C WITH CEDILLA → LATIN CAPITAL LETTER C, COMBINING COMMA BELOW  # →Ҫ→→С̡→
+04AA ; 0043 0326 ;     MA      # ( Ҫ → C̦ ) CYRILLIC CAPITAL LETTER ES WITH DESCENDER → LATIN CAPITAL LETTER C, COMBINING COMMA BELOW    # →С̡→
+
+0187 ; 0043 0027 ;     MA      # ( Ƈ → C' ) LATIN CAPITAL LETTER C WITH HOOK → LATIN CAPITAL LETTER C, APOSTROPHE # →Cʽ→
+
+217E ; 0064 ;  MA      # ( ⅾ → d ) SMALL ROMAN NUMERAL FIVE HUNDRED → LATIN SMALL LETTER D       # 
+2146 ; 0064 ;  MA      # ( ⅆ → d ) DOUBLE-STRUCK ITALIC SMALL D → LATIN SMALL LETTER D   # 
+1D41D ;        0064 ;  MA      # ( 𝐝 → d ) MATHEMATICAL BOLD SMALL D → LATIN SMALL LETTER D     # 
+1D451 ;        0064 ;  MA      # ( 𝑑 → d ) MATHEMATICAL ITALIC SMALL D → LATIN SMALL LETTER D   # 
+1D485 ;        0064 ;  MA      # ( 𝒅 → d ) MATHEMATICAL BOLD ITALIC SMALL D → LATIN SMALL LETTER D      # 
+1D4B9 ;        0064 ;  MA      # ( 𝒹 → d ) MATHEMATICAL SCRIPT SMALL D → LATIN SMALL LETTER D   # 
+1D4ED ;        0064 ;  MA      # ( 𝓭 → d ) MATHEMATICAL BOLD SCRIPT SMALL D → LATIN SMALL LETTER D      # 
+1D521 ;        0064 ;  MA      # ( 𝔡 → d ) MATHEMATICAL FRAKTUR SMALL D → LATIN SMALL LETTER D  # 
+1D555 ;        0064 ;  MA      # ( 𝕕 → d ) MATHEMATICAL DOUBLE-STRUCK SMALL D → LATIN SMALL LETTER D    # 
+1D589 ;        0064 ;  MA      # ( 𝖉 → d ) MATHEMATICAL BOLD FRAKTUR SMALL D → LATIN SMALL LETTER D     # 
+1D5BD ;        0064 ;  MA      # ( 𝖽 → d ) MATHEMATICAL SANS-SERIF SMALL D → LATIN SMALL LETTER D       # 
+1D5F1 ;        0064 ;  MA      # ( 𝗱 → d ) MATHEMATICAL SANS-SERIF BOLD SMALL D → LATIN SMALL LETTER D  # 
+1D625 ;        0064 ;  MA      # ( 𝘥 → d ) MATHEMATICAL SANS-SERIF ITALIC SMALL D → LATIN SMALL LETTER D        # 
+1D659 ;        0064 ;  MA      # ( 𝙙 → d ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D → LATIN SMALL LETTER D   # 
+1D68D ;        0064 ;  MA      # ( 𝚍 → d ) MATHEMATICAL MONOSPACE SMALL D → LATIN SMALL LETTER D        # 
+0501 ; 0064 ;  MA      # ( ԁ → d ) CYRILLIC SMALL LETTER KOMI DE → LATIN SMALL LETTER D   # 
+146F ; 0064 ;  MA      # ( ᑯ → d ) CANADIAN SYLLABICS KO → LATIN SMALL LETTER D  # 
+A4D2 ; 0064 ;  MA      # ( ꓒ → d ) LISU LETTER PHA → LATIN SMALL LETTER D        # 
+
+216E ; 0044 ;  MA      # ( Ⅾ → D ) ROMAN NUMERAL FIVE HUNDRED → LATIN CAPITAL LETTER D   # 
+2145 ; 0044 ;  MA      # ( ⅅ → D ) DOUBLE-STRUCK ITALIC CAPITAL D → LATIN CAPITAL LETTER D       # 
+1D403 ;        0044 ;  MA      # ( 𝐃 → D ) MATHEMATICAL BOLD CAPITAL D → LATIN CAPITAL LETTER D # 
+1D437 ;        0044 ;  MA      # ( 𝐷 → D ) MATHEMATICAL ITALIC CAPITAL D → LATIN CAPITAL LETTER D       # 
+1D46B ;        0044 ;  MA      # ( 𝑫 → D ) MATHEMATICAL BOLD ITALIC CAPITAL D → LATIN CAPITAL LETTER D  # 
+1D49F ;        0044 ;  MA      # ( 𝒟 → D ) MATHEMATICAL SCRIPT CAPITAL D → LATIN CAPITAL LETTER D       # 
+1D4D3 ;        0044 ;  MA      # ( 𝓓 → D ) MATHEMATICAL BOLD SCRIPT CAPITAL D → LATIN CAPITAL LETTER D  # 
+1D507 ;        0044 ;  MA      # ( 𝔇 → D ) MATHEMATICAL FRAKTUR CAPITAL D → LATIN CAPITAL LETTER D      # 
+1D53B ;        0044 ;  MA      # ( 𝔻 → D ) MATHEMATICAL DOUBLE-STRUCK CAPITAL D → LATIN CAPITAL LETTER D        # 
+1D56F ;        0044 ;  MA      # ( 𝕯 → D ) MATHEMATICAL BOLD FRAKTUR CAPITAL D → LATIN CAPITAL LETTER D # 
+1D5A3 ;        0044 ;  MA      # ( 𝖣 → D ) MATHEMATICAL SANS-SERIF CAPITAL D → LATIN CAPITAL LETTER D   # 
+1D5D7 ;        0044 ;  MA      # ( 𝗗 → D ) MATHEMATICAL SANS-SERIF BOLD CAPITAL D → LATIN CAPITAL LETTER D      # 
+1D60B ;        0044 ;  MA      # ( 𝘋 → D ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL D → LATIN CAPITAL LETTER D    # 
+1D63F ;        0044 ;  MA      # ( 𝘿 → D ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D → LATIN CAPITAL LETTER D       # 
+1D673 ;        0044 ;  MA      # ( 𝙳 → D ) MATHEMATICAL MONOSPACE CAPITAL D → LATIN CAPITAL LETTER D    # 
+13A0 ; 0044 ;  MA      # ( Ꭰ → D ) CHEROKEE LETTER A → LATIN CAPITAL LETTER D    # 
+15DE ; 0044 ;  MA      # ( ᗞ → D ) CANADIAN SYLLABICS CARRIER THE → LATIN CAPITAL LETTER D       # 
+15EA ; 0044 ;  MA      # ( ᗪ → D ) CANADIAN SYLLABICS CARRIER PE → LATIN CAPITAL LETTER D        # →ᗞ→
+A4D3 ; 0044 ;  MA      # ( ꓓ → D ) LISU LETTER DA → LATIN CAPITAL LETTER D       # 
+
+0257 ; 0064 0314 ;     MA      # ( ɗ → d̔ ) LATIN SMALL LETTER D WITH HOOK → LATIN SMALL LETTER D, COMBINING REVERSED COMMA ABOVE        # 
+
+0256 ; 0064 0328 ;     MA      # ( ɖ → d̨ ) LATIN SMALL LETTER D WITH TAIL → LATIN SMALL LETTER D, COMBINING OGONEK      # →d̢→
+
+018C ; 0064 0304 ;     MA      # ( ƌ → d̄ ) LATIN SMALL LETTER D WITH TOPBAR → LATIN SMALL LETTER D, COMBINING MACRON    # 
+
+0111 ; 0064 0335 ;     MA      # ( đ → d̵ ) LATIN SMALL LETTER D WITH STROKE → LATIN SMALL LETTER D, COMBINING SHORT STROKE OVERLAY      # 
+
+0110 ; 0044 0335 ;     MA      # ( Đ → D̵ ) LATIN CAPITAL LETTER D WITH STROKE → LATIN CAPITAL LETTER D, COMBINING SHORT STROKE OVERLAY  # 
+00D0 ; 0044 0335 ;     MA      # ( Ð → D̵ ) LATIN CAPITAL LETTER ETH → LATIN CAPITAL LETTER D, COMBINING SHORT STROKE OVERLAY    # →Đ→
+0189 ; 0044 0335 ;     MA      # ( Ɖ → D̵ ) LATIN CAPITAL LETTER AFRICAN D → LATIN CAPITAL LETTER D, COMBINING SHORT STROKE OVERLAY      # →Đ→
+
+20AB ; 0064 0335 0331 ;        MA      #* ( ₫ → ḏ̵ ) DONG SIGN → LATIN SMALL LETTER D, COMBINING SHORT STROKE OVERLAY, COMBINING MACRON BELOW # →đ̱→
+
+A77A ; A779 ;  MA      # ( ꝺ → Ꝺ ) LATIN SMALL LETTER INSULAR D → LATIN CAPITAL LETTER INSULAR D       # 
+
+147B ; 0064 00B7 ;     MA      # ( ᑻ → d· ) CANADIAN SYLLABICS WEST-CREE KWO → LATIN SMALL LETTER D, MIDDLE DOT # →ᑯᐧ→
+
+01F3 ; 0064 007A ;     MA      # ( dz → dz ) LATIN SMALL LETTER DZ → LATIN SMALL LETTER D, LATIN SMALL LETTER Z    # 
+02A3 ; 0064 007A ;     MA      # ( ʣ → dz ) LATIN SMALL LETTER DZ DIGRAPH → LATIN SMALL LETTER D, LATIN SMALL LETTER Z    # 
+
+01F2 ; 0044 007A ;     MA      # ( Dz → Dz ) LATIN CAPITAL LETTER D WITH SMALL LETTER Z → LATIN CAPITAL LETTER D, LATIN SMALL LETTER Z     # 
+
+01F1 ; 0044 005A ;     MA      # ( DZ → DZ ) LATIN CAPITAL LETTER DZ → LATIN CAPITAL LETTER D, LATIN CAPITAL LETTER Z      # 
+
+01C6 ; 0064 017E ;     MA      # ( dž → dž ) LATIN SMALL LETTER DZ WITH CARON → LATIN SMALL LETTER D, LATIN SMALL LETTER Z WITH CARON     # 
+
+01C5 ; 0044 017E ;     MA      # ( Dž → Dž ) LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON → LATIN CAPITAL LETTER D, LATIN SMALL LETTER Z WITH CARON      # 
+
+01C4 ; 0044 017D ;     MA      # ( DŽ → DŽ ) LATIN CAPITAL LETTER DZ WITH CARON → LATIN CAPITAL LETTER D, LATIN CAPITAL LETTER Z WITH CARON       # 
+
+02A5 ; 0064 0291 ;     MA      # ( ʥ → dʑ ) LATIN SMALL LETTER DZ DIGRAPH WITH CURL → LATIN SMALL LETTER D, LATIN SMALL LETTER Z WITH CURL       # 
+
+02A4 ; 0064 021D ;     MA      # ( ʤ → dȝ ) LATIN SMALL LETTER DEZH DIGRAPH → LATIN SMALL LETTER D, LATIN SMALL LETTER YOGH      # →dʒ→
+
+1487 ; 0064 144A ;     MA      # ( ᒇ → dᑊ ) CANADIAN SYLLABICS SOUTH-SLAVEY KOH → LATIN SMALL LETTER D, CANADIAN SYLLABICS WEST-CREE P # →ᑯᑊ→
+
+03B4 ; 1E9F ;  MA      # ( δ → ẟ ) GREEK SMALL LETTER DELTA → LATIN SMALL LETTER DELTA  # 
+1D6C5 ;        1E9F ;  MA      # ( 𝛅 → ẟ ) MATHEMATICAL BOLD SMALL DELTA → LATIN SMALL LETTER DELTA   # →δ→
+1D6FF ;        1E9F ;  MA      # ( 𝛿 → ẟ ) MATHEMATICAL ITALIC SMALL DELTA → LATIN SMALL LETTER DELTA # →δ→
+1D739 ;        1E9F ;  MA      # ( 𝜹 → ẟ ) MATHEMATICAL BOLD ITALIC SMALL DELTA → LATIN SMALL LETTER DELTA    # →δ→
+1D773 ;        1E9F ;  MA      # ( 𝝳 → ẟ ) MATHEMATICAL SANS-SERIF BOLD SMALL DELTA → LATIN SMALL LETTER DELTA        # →δ→
+1D7AD ;        1E9F ;  MA      # ( 𝞭 → ẟ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA → LATIN SMALL LETTER DELTA # →δ→
+056E ; 1E9F ;  MA      # ( ծ → ẟ ) ARMENIAN SMALL LETTER CA → LATIN SMALL LETTER DELTA  # →δ→
+1577 ; 1E9F ;  MA      # ( ᕷ → ẟ ) CANADIAN SYLLABICS NUNAVIK HO → LATIN SMALL LETTER DELTA    # →δ→
+
+212E ; 0065 ;  MA      # ( ℮ → e ) ESTIMATED SYMBOL → LATIN SMALL LETTER E       # 
+FF45 ; 0065 ;  MA      # ( e → e ) FULLWIDTH LATIN SMALL LETTER E → LATIN SMALL LETTER E # →е→
+212F ; 0065 ;  MA      # ( ℯ → e ) SCRIPT SMALL E → LATIN SMALL LETTER E # 
+2147 ; 0065 ;  MA      # ( ⅇ → e ) DOUBLE-STRUCK ITALIC SMALL E → LATIN SMALL LETTER E   # 
+1D41E ;        0065 ;  MA      # ( 𝐞 → e ) MATHEMATICAL BOLD SMALL E → LATIN SMALL LETTER E     # 
+1D452 ;        0065 ;  MA      # ( 𝑒 → e ) MATHEMATICAL ITALIC SMALL E → LATIN SMALL LETTER E   # 
+1D486 ;        0065 ;  MA      # ( 𝒆 → e ) MATHEMATICAL BOLD ITALIC SMALL E → LATIN SMALL LETTER E      # 
+1D4EE ;        0065 ;  MA      # ( 𝓮 → e ) MATHEMATICAL BOLD SCRIPT SMALL E → LATIN SMALL LETTER E      # 
+1D522 ;        0065 ;  MA      # ( 𝔢 → e ) MATHEMATICAL FRAKTUR SMALL E → LATIN SMALL LETTER E  # 
+1D556 ;        0065 ;  MA      # ( 𝕖 → e ) MATHEMATICAL DOUBLE-STRUCK SMALL E → LATIN SMALL LETTER E    # 
+1D58A ;        0065 ;  MA      # ( 𝖊 → e ) MATHEMATICAL BOLD FRAKTUR SMALL E → LATIN SMALL LETTER E     # 
+1D5BE ;        0065 ;  MA      # ( 𝖾 → e ) MATHEMATICAL SANS-SERIF SMALL E → LATIN SMALL LETTER E       # 
+1D5F2 ;        0065 ;  MA      # ( 𝗲 → e ) MATHEMATICAL SANS-SERIF BOLD SMALL E → LATIN SMALL LETTER E  # 
+1D626 ;        0065 ;  MA      # ( 𝘦 → e ) MATHEMATICAL SANS-SERIF ITALIC SMALL E → LATIN SMALL LETTER E        # 
+1D65A ;        0065 ;  MA      # ( 𝙚 → e ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E → LATIN SMALL LETTER E   # 
+1D68E ;        0065 ;  MA      # ( 𝚎 → e ) MATHEMATICAL MONOSPACE SMALL E → LATIN SMALL LETTER E        # 
+0435 ; 0065 ;  MA      # ( е → e ) CYRILLIC SMALL LETTER IE → LATIN SMALL LETTER E        # 
+
+22FF ; 0045 ;  MA      #* ( ⋿ → E ) Z NOTATION BAG MEMBERSHIP → LATIN CAPITAL LETTER E   # 
+FF25 ; 0045 ;  MA      # ( E → E ) FULLWIDTH LATIN CAPITAL LETTER E → LATIN CAPITAL LETTER E     # →Ε→
+2130 ; 0045 ;  MA      # ( ℰ → E ) SCRIPT CAPITAL E → LATIN CAPITAL LETTER E     # 
+1D404 ;        0045 ;  MA      # ( 𝐄 → E ) MATHEMATICAL BOLD CAPITAL E → LATIN CAPITAL LETTER E # 
+1D438 ;        0045 ;  MA      # ( 𝐸 → E ) MATHEMATICAL ITALIC CAPITAL E → LATIN CAPITAL LETTER E       # 
+1D46C ;        0045 ;  MA      # ( 𝑬 → E ) MATHEMATICAL BOLD ITALIC CAPITAL E → LATIN CAPITAL LETTER E  # 
+1D4D4 ;        0045 ;  MA      # ( 𝓔 → E ) MATHEMATICAL BOLD SCRIPT CAPITAL E → LATIN CAPITAL LETTER E  # 
+1D508 ;        0045 ;  MA      # ( 𝔈 → E ) MATHEMATICAL FRAKTUR CAPITAL E → LATIN CAPITAL LETTER E      # 
+1D53C ;        0045 ;  MA      # ( 𝔼 → E ) MATHEMATICAL DOUBLE-STRUCK CAPITAL E → LATIN CAPITAL LETTER E        # 
+1D570 ;        0045 ;  MA      # ( 𝕰 → E ) MATHEMATICAL BOLD FRAKTUR CAPITAL E → LATIN CAPITAL LETTER E # 
+1D5A4 ;        0045 ;  MA      # ( 𝖤 → E ) MATHEMATICAL SANS-SERIF CAPITAL E → LATIN CAPITAL LETTER E   # 
+1D5D8 ;        0045 ;  MA      # ( 𝗘 → E ) MATHEMATICAL SANS-SERIF BOLD CAPITAL E → LATIN CAPITAL LETTER E      # 
+1D60C ;        0045 ;  MA      # ( 𝘌 → E ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL E → LATIN CAPITAL LETTER E    # 
+1D640 ;        0045 ;  MA      # ( 𝙀 → E ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E → LATIN CAPITAL LETTER E       # 
+1D674 ;        0045 ;  MA      # ( 𝙴 → E ) MATHEMATICAL MONOSPACE CAPITAL E → LATIN CAPITAL LETTER E    # 
+0395 ; 0045 ;  MA      # ( Ε → E ) GREEK CAPITAL LETTER EPSILON → LATIN CAPITAL LETTER E  # 
+1D6AC ;        0045 ;  MA      # ( 𝚬 → E ) MATHEMATICAL BOLD CAPITAL EPSILON → LATIN CAPITAL LETTER E   # →𝐄→
+1D6E6 ;        0045 ;  MA      # ( 𝛦 → E ) MATHEMATICAL ITALIC CAPITAL EPSILON → LATIN CAPITAL LETTER E # →𝐸→
+1D720 ;        0045 ;  MA      # ( 𝜠 → E ) MATHEMATICAL BOLD ITALIC CAPITAL EPSILON → LATIN CAPITAL LETTER E    # →𝑬→
+1D75A ;        0045 ;  MA      # ( 𝝚 → E ) MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON → LATIN CAPITAL LETTER E        # →Ε→
+1D794 ;        0045 ;  MA      # ( 𝞔 → E ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON → LATIN CAPITAL LETTER E # →Ε→
+0415 ; 0045 ;  MA      # ( Е → E ) CYRILLIC CAPITAL LETTER IE → LATIN CAPITAL LETTER E    # 
+2D39 ; 0045 ;  MA      # ( ⴹ → E ) TIFINAGH LETTER YADD → LATIN CAPITAL LETTER E # 
+13AC ; 0045 ;  MA      # ( Ꭼ → E ) CHEROKEE LETTER GV → LATIN CAPITAL LETTER E   # 
+A4F0 ; 0045 ;  MA      # ( ꓰ → E ) LISU LETTER E → LATIN CAPITAL LETTER E        # 
+
+011B ; 0115 ;  MA      # ( ě → ĕ ) LATIN SMALL LETTER E WITH CARON → LATIN SMALL LETTER E WITH BREVE     # 
+
+011A ; 0114 ;  MA      # ( Ě → Ĕ ) LATIN CAPITAL LETTER E WITH CARON → LATIN CAPITAL LETTER E WITH BREVE # 
+
+0259 ; 01DD ;  MA      # ( ə → ǝ ) LATIN SMALL LETTER SCHWA → LATIN SMALL LETTER TURNED E        # 
+04D9 ; 01DD ;  MA      # ( ә → ǝ ) CYRILLIC SMALL LETTER SCHWA → LATIN SMALL LETTER TURNED E     # 
+
+2203 ; 018E ;  MA      #* ( ∃ → Ǝ ) THERE EXISTS → LATIN CAPITAL LETTER REVERSED E      # 
+2D3A ; 018E ;  MA      # ( ⴺ → Ǝ ) TIFINAGH LETTER YADDH → LATIN CAPITAL LETTER REVERSED E      # 
+A4F1 ; 018E ;  MA      # ( ꓱ → Ǝ ) LISU LETTER EU → LATIN CAPITAL LETTER REVERSED E     # 
+
+025A ; 01DD 02DE ;     MA      # ( ɚ → ǝ˞ ) LATIN SMALL LETTER SCHWA WITH HOOK → LATIN SMALL LETTER TURNED E, MODIFIER LETTER RHOTIC HOOK       # →ə˞→
+
+1D14 ; 01DD 006F ;     MA      # ( ᴔ → ǝo ) LATIN SMALL LETTER TURNED OE → LATIN SMALL LETTER TURNED E, LATIN SMALL LETTER O    # →əo→
+
+04D8 ; 018F ;  MA      # ( Ә → Ə ) CYRILLIC CAPITAL LETTER SCHWA → LATIN CAPITAL LETTER SCHWA    # 
+
+22F4 ; 025B ;  MA      #* ( ⋴ → ɛ ) SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE → LATIN SMALL LETTER OPEN E  # 
+03B5 ; 025B ;  MA      # ( ε → ɛ ) GREEK SMALL LETTER EPSILON → LATIN SMALL LETTER OPEN E        # 
+03F5 ; 025B ;  MA      # ( ϵ → ɛ ) GREEK LUNATE EPSILON SYMBOL → LATIN SMALL LETTER OPEN E       # →ε→
+1D6C6 ;        025B ;  MA      # ( 𝛆 → ɛ ) MATHEMATICAL BOLD SMALL EPSILON → LATIN SMALL LETTER OPEN E # →ε→
+1D6DC ;        025B ;  MA      # ( 𝛜 → ɛ ) MATHEMATICAL BOLD EPSILON SYMBOL → LATIN SMALL LETTER OPEN E        # →ε→
+1D700 ;        025B ;  MA      # ( 𝜀 → ɛ ) MATHEMATICAL ITALIC SMALL EPSILON → LATIN SMALL LETTER OPEN E       # →ε→
+1D716 ;        025B ;  MA      # ( 𝜖 → ɛ ) MATHEMATICAL ITALIC EPSILON SYMBOL → LATIN SMALL LETTER OPEN E      # →ε→
+1D73A ;        025B ;  MA      # ( 𝜺 → ɛ ) MATHEMATICAL BOLD ITALIC SMALL EPSILON → LATIN SMALL LETTER OPEN E  # →ε→
+1D750 ;        025B ;  MA      # ( 𝝐 → ɛ ) MATHEMATICAL BOLD ITALIC EPSILON SYMBOL → LATIN SMALL LETTER OPEN E # →ε→
+1D774 ;        025B ;  MA      # ( 𝝴 → ɛ ) MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON → LATIN SMALL LETTER OPEN E      # →ε→
+1D78A ;        025B ;  MA      # ( 𝞊 → ɛ ) MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL → LATIN SMALL LETTER OPEN E     # →ε→
+1D7AE ;        025B ;  MA      # ( 𝞮 → ɛ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON → LATIN SMALL LETTER OPEN E       # →ε→
+1D7C4 ;        025B ;  MA      # ( 𝟄 → ɛ ) MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL → LATIN SMALL LETTER OPEN E      # →ε→
+2C89 ; 025B ;  MA      # ( ⲉ → ɛ ) COPTIC SMALL LETTER EIE → LATIN SMALL LETTER OPEN E  # →є→
+0454 ; 025B ;  MA      # ( є → ɛ ) CYRILLIC SMALL LETTER UKRAINIAN IE → LATIN SMALL LETTER OPEN E        # 
+0511 ; 025B ;  MA      # ( ԑ → ɛ ) CYRILLIC SMALL LETTER REVERSED ZE → LATIN SMALL LETTER OPEN E # 
+
+20AC ; 0190 ;  MA      #* ( € → Ɛ ) EURO SIGN → LATIN CAPITAL LETTER OPEN E     # →Є→
+2107 ; 0190 ;  MA      # ( ℇ → Ɛ ) EULER CONSTANT → LATIN CAPITAL LETTER OPEN E # 
+2C88 ; 0190 ;  MA      # ( Ⲉ → Ɛ ) COPTIC CAPITAL LETTER EIE → LATIN CAPITAL LETTER OPEN E      # →Є→
+0404 ; 0190 ;  MA      # ( Є → Ɛ ) CYRILLIC CAPITAL LETTER UKRAINIAN IE → LATIN CAPITAL LETTER OPEN E    # 
+0510 ; 0190 ;  MA      # ( Ԑ → Ɛ ) CYRILLIC CAPITAL LETTER REVERSED ZE → LATIN CAPITAL LETTER OPEN E     # 
+
+1D9F ; 1D4B ;  MA      # ( ᶟ → ᵋ ) MODIFIER LETTER SMALL REVERSED OPEN E → MODIFIER LETTER SMALL OPEN E        # 
+
+1D08 ; 025C ;  MA      # ( ᴈ → ɜ ) LATIN SMALL LETTER TURNED OPEN E → LATIN SMALL LETTER REVERSED OPEN E        # 
+0437 ; 025C ;  MA      # ( з → ɜ ) CYRILLIC SMALL LETTER ZE → LATIN SMALL LETTER REVERSED OPEN E # 
+
+0499 ; 025C 0326 ;     MA      # ( ҙ → ɜ̦ ) CYRILLIC SMALL LETTER ZE WITH DESCENDER → LATIN SMALL LETTER REVERSED OPEN E, COMBINING COMMA BELOW # →з̡→
+
+1D41F ;        0066 ;  MA      # ( 𝐟 → f ) MATHEMATICAL BOLD SMALL F → LATIN SMALL LETTER F     # 
+1D453 ;        0066 ;  MA      # ( 𝑓 → f ) MATHEMATICAL ITALIC SMALL F → LATIN SMALL LETTER F   # 
+1D487 ;        0066 ;  MA      # ( 𝒇 → f ) MATHEMATICAL BOLD ITALIC SMALL F → LATIN SMALL LETTER F      # 
+1D4BB ;        0066 ;  MA      # ( 𝒻 → f ) MATHEMATICAL SCRIPT SMALL F → LATIN SMALL LETTER F   # 
+1D4EF ;        0066 ;  MA      # ( 𝓯 → f ) MATHEMATICAL BOLD SCRIPT SMALL F → LATIN SMALL LETTER F      # 
+1D523 ;        0066 ;  MA      # ( 𝔣 → f ) MATHEMATICAL FRAKTUR SMALL F → LATIN SMALL LETTER F  # 
+1D557 ;        0066 ;  MA      # ( 𝕗 → f ) MATHEMATICAL DOUBLE-STRUCK SMALL F → LATIN SMALL LETTER F    # 
+1D58B ;        0066 ;  MA      # ( 𝖋 → f ) MATHEMATICAL BOLD FRAKTUR SMALL F → LATIN SMALL LETTER F     # 
+1D5BF ;        0066 ;  MA      # ( 𝖿 → f ) MATHEMATICAL SANS-SERIF SMALL F → LATIN SMALL LETTER F       # 
+1D5F3 ;        0066 ;  MA      # ( 𝗳 → f ) MATHEMATICAL SANS-SERIF BOLD SMALL F → LATIN SMALL LETTER F  # 
+1D627 ;        0066 ;  MA      # ( 𝘧 → f ) MATHEMATICAL SANS-SERIF ITALIC SMALL F → LATIN SMALL LETTER F        # 
+1D65B ;        0066 ;  MA      # ( 𝙛 → f ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F → LATIN SMALL LETTER F   # 
+1D68F ;        0066 ;  MA      # ( 𝚏 → f ) MATHEMATICAL MONOSPACE SMALL F → LATIN SMALL LETTER F        # 
+017F ; 0066 ;  MA      # ( ſ → f ) LATIN SMALL LETTER LONG S → LATIN SMALL LETTER F       # 
+1E9D ; 0066 ;  MA      # ( ẝ → f ) LATIN SMALL LETTER LONG S WITH HIGH STROKE → LATIN SMALL LETTER F     # 
+0584 ; 0066 ;  MA      # ( ք → f ) ARMENIAN SMALL LETTER KEH → LATIN SMALL LETTER F       # 
+
+2131 ; 0046 ;  MA      # ( ℱ → F ) SCRIPT CAPITAL F → LATIN CAPITAL LETTER F     # 
+1D405 ;        0046 ;  MA      # ( 𝐅 → F ) MATHEMATICAL BOLD CAPITAL F → LATIN CAPITAL LETTER F # 
+1D439 ;        0046 ;  MA      # ( 𝐹 → F ) MATHEMATICAL ITALIC CAPITAL F → LATIN CAPITAL LETTER F       # 
+1D46D ;        0046 ;  MA      # ( 𝑭 → F ) MATHEMATICAL BOLD ITALIC CAPITAL F → LATIN CAPITAL LETTER F  # 
+1D4D5 ;        0046 ;  MA      # ( 𝓕 → F ) MATHEMATICAL BOLD SCRIPT CAPITAL F → LATIN CAPITAL LETTER F  # 
+1D509 ;        0046 ;  MA      # ( 𝔉 → F ) MATHEMATICAL FRAKTUR CAPITAL F → LATIN CAPITAL LETTER F      # 
+1D53D ;        0046 ;  MA      # ( 𝔽 → F ) MATHEMATICAL DOUBLE-STRUCK CAPITAL F → LATIN CAPITAL LETTER F        # 
+1D571 ;        0046 ;  MA      # ( 𝕱 → F ) MATHEMATICAL BOLD FRAKTUR CAPITAL F → LATIN CAPITAL LETTER F # 
+1D5A5 ;        0046 ;  MA      # ( 𝖥 → F ) MATHEMATICAL SANS-SERIF CAPITAL F → LATIN CAPITAL LETTER F   # 
+1D5D9 ;        0046 ;  MA      # ( 𝗙 → F ) MATHEMATICAL SANS-SERIF BOLD CAPITAL F → LATIN CAPITAL LETTER F      # 
+1D60D ;        0046 ;  MA      # ( 𝘍 → F ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL F → LATIN CAPITAL LETTER F    # 
+1D641 ;        0046 ;  MA      # ( 𝙁 → F ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F → LATIN CAPITAL LETTER F       # 
+1D675 ;        0046 ;  MA      # ( 𝙵 → F ) MATHEMATICAL MONOSPACE CAPITAL F → LATIN CAPITAL LETTER F    # 
+03DC ; 0046 ;  MA      # ( Ϝ → F ) GREEK LETTER DIGAMMA → LATIN CAPITAL LETTER F  # 
+1D7CA ;        0046 ;  MA      # ( 𝟊 → F ) MATHEMATICAL BOLD CAPITAL DIGAMMA → LATIN CAPITAL LETTER F   # →Ϝ→
+15B4 ; 0046 ;  MA      # ( ᖴ → F ) CANADIAN SYLLABICS BLACKFOOT WE → LATIN CAPITAL LETTER F      # 
+A4DD ; 0046 ;  MA      # ( ꓝ → F ) LISU LETTER TSA → LATIN CAPITAL LETTER F      # 
+
+0192 ; 0066 0326 ;     MA      # ( ƒ → f̦ ) LATIN SMALL LETTER F WITH HOOK → LATIN SMALL LETTER F, COMBINING COMMA BELOW # →f̡→
+
+0191 ; 0046 0326 ;     MA      # ( Ƒ → F̦ ) LATIN CAPITAL LETTER F WITH HOOK → LATIN CAPITAL LETTER F, COMBINING COMMA BELOW     # →F̡→
+
+213B ; 0046 0041 0058 ;        MA      #* ( ℻ → FAX ) FACSIMILE SIGN → LATIN CAPITAL LETTER F, LATIN CAPITAL LETTER A, LATIN CAPITAL LETTER X    # 
+
+FB00 ; 0066 0066 ;     MA      # ( ff → ff ) LATIN SMALL LIGATURE FF → LATIN SMALL LETTER F, LATIN SMALL LETTER F # 
+
+FB03 ; 0066 0066 0069 ;        MA      # ( ffi → ffi ) LATIN SMALL LIGATURE FFI → LATIN SMALL LETTER F, LATIN SMALL LETTER F, LATIN SMALL LETTER I # 
+
+FB04 ; 0066 0066 006C ;        MA      # ( ffl → ffl ) LATIN SMALL LIGATURE FFL → LATIN SMALL LETTER F, LATIN SMALL LETTER F, LATIN SMALL LETTER L # 
+
+FB01 ; 0066 0069 ;     MA      # ( fi → fi ) LATIN SMALL LIGATURE FI → LATIN SMALL LETTER F, LATIN SMALL LETTER I # 
+
+FB02 ; 0066 006C ;     MA      # ( fl → fl ) LATIN SMALL LIGATURE FL → LATIN SMALL LETTER F, LATIN SMALL LETTER L # 
+
+02A9 ; 0066 014B ;     MA      # ( ʩ → fŋ ) LATIN SMALL LETTER FENG DIGRAPH → LATIN SMALL LETTER F, LATIN SMALL LETTER ENG       # 
+
+A4DE ; 2132 ;  MA      # ( ꓞ → Ⅎ ) LISU LETTER TSHA → TURNED CAPITAL F # 
+
+FF47 ; 0067 ;  MA      # ( g → g ) FULLWIDTH LATIN SMALL LETTER G → LATIN SMALL LETTER G # →ɡ→
+210A ; 0067 ;  MA      # ( ℊ → g ) SCRIPT SMALL G → LATIN SMALL LETTER G # 
+1D420 ;        0067 ;  MA      # ( 𝐠 → g ) MATHEMATICAL BOLD SMALL G → LATIN SMALL LETTER G     # 
+1D454 ;        0067 ;  MA      # ( 𝑔 → g ) MATHEMATICAL ITALIC SMALL G → LATIN SMALL LETTER G   # 
+1D488 ;        0067 ;  MA      # ( 𝒈 → g ) MATHEMATICAL BOLD ITALIC SMALL G → LATIN SMALL LETTER G      # 
+1D4F0 ;        0067 ;  MA      # ( 𝓰 → g ) MATHEMATICAL BOLD SCRIPT SMALL G → LATIN SMALL LETTER G      # 
+1D524 ;        0067 ;  MA      # ( 𝔤 → g ) MATHEMATICAL FRAKTUR SMALL G → LATIN SMALL LETTER G  # 
+1D558 ;        0067 ;  MA      # ( 𝕘 → g ) MATHEMATICAL DOUBLE-STRUCK SMALL G → LATIN SMALL LETTER G    # 
+1D58C ;        0067 ;  MA      # ( 𝖌 → g ) MATHEMATICAL BOLD FRAKTUR SMALL G → LATIN SMALL LETTER G     # 
+1D5C0 ;        0067 ;  MA      # ( 𝗀 → g ) MATHEMATICAL SANS-SERIF SMALL G → LATIN SMALL LETTER G       # 
+1D5F4 ;        0067 ;  MA      # ( 𝗴 → g ) MATHEMATICAL SANS-SERIF BOLD SMALL G → LATIN SMALL LETTER G  # 
+1D628 ;        0067 ;  MA      # ( 𝘨 → g ) MATHEMATICAL SANS-SERIF ITALIC SMALL G → LATIN SMALL LETTER G        # 
+1D65C ;        0067 ;  MA      # ( 𝙜 → g ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G → LATIN SMALL LETTER G   # 
+1D690 ;        0067 ;  MA      # ( 𝚐 → g ) MATHEMATICAL MONOSPACE SMALL G → LATIN SMALL LETTER G        # 
+0261 ; 0067 ;  MA      # ( ɡ → g ) LATIN SMALL LETTER SCRIPT G → LATIN SMALL LETTER G     # 
+1D83 ; 0067 ;  MA      # ( ᶃ → g ) LATIN SMALL LETTER G WITH PALATAL HOOK → LATIN SMALL LETTER G # 
+018D ; 0067 ;  MA      # ( ƍ → g ) LATIN SMALL LETTER TURNED DELTA → LATIN SMALL LETTER G # 
+0581 ; 0067 ;  MA      # ( ց → g ) ARMENIAN SMALL LETTER CO → LATIN SMALL LETTER G        # 
+
+1D406 ;        0047 ;  MA      # ( 𝐆 → G ) MATHEMATICAL BOLD CAPITAL G → LATIN CAPITAL LETTER G # 
+1D43A ;        0047 ;  MA      # ( 𝐺 → G ) MATHEMATICAL ITALIC CAPITAL G → LATIN CAPITAL LETTER G       # 
+1D46E ;        0047 ;  MA      # ( 𝑮 → G ) MATHEMATICAL BOLD ITALIC CAPITAL G → LATIN CAPITAL LETTER G  # 
+1D4A2 ;        0047 ;  MA      # ( 𝒢 → G ) MATHEMATICAL SCRIPT CAPITAL G → LATIN CAPITAL LETTER G       # 
+1D4D6 ;        0047 ;  MA      # ( 𝓖 → G ) MATHEMATICAL BOLD SCRIPT CAPITAL G → LATIN CAPITAL LETTER G  # 
+1D50A ;        0047 ;  MA      # ( 𝔊 → G ) MATHEMATICAL FRAKTUR CAPITAL G → LATIN CAPITAL LETTER G      # 
+1D53E ;        0047 ;  MA      # ( 𝔾 → G ) MATHEMATICAL DOUBLE-STRUCK CAPITAL G → LATIN CAPITAL LETTER G        # 
+1D572 ;        0047 ;  MA      # ( 𝕲 → G ) MATHEMATICAL BOLD FRAKTUR CAPITAL G → LATIN CAPITAL LETTER G # 
+1D5A6 ;        0047 ;  MA      # ( 𝖦 → G ) MATHEMATICAL SANS-SERIF CAPITAL G → LATIN CAPITAL LETTER G   # 
+1D5DA ;        0047 ;  MA      # ( 𝗚 → G ) MATHEMATICAL SANS-SERIF BOLD CAPITAL G → LATIN CAPITAL LETTER G      # 
+1D60E ;        0047 ;  MA      # ( 𝘎 → G ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL G → LATIN CAPITAL LETTER G    # 
+1D642 ;        0047 ;  MA      # ( 𝙂 → G ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G → LATIN CAPITAL LETTER G       # 
+1D676 ;        0047 ;  MA      # ( 𝙶 → G ) MATHEMATICAL MONOSPACE CAPITAL G → LATIN CAPITAL LETTER G    # 
+050C ; 0047 ;  MA      # ( Ԍ → G ) CYRILLIC CAPITAL LETTER KOMI SJE → LATIN CAPITAL LETTER G      # 
+13C0 ; 0047 ;  MA      # ( Ꮐ → G ) CHEROKEE LETTER NAH → LATIN CAPITAL LETTER G  # 
+13F3 ; 0047 ;  MA      # ( Ᏻ → G ) CHEROKEE LETTER YU → LATIN CAPITAL LETTER G   # →Ꮐ→
+A4D6 ; 0047 ;  MA      # ( ꓖ → G ) LISU LETTER GA → LATIN CAPITAL LETTER G       # 
+
+1DA2 ; 1D4D ;  MA      # ( ᶢ → ᵍ ) MODIFIER LETTER SMALL SCRIPT G → MODIFIER LETTER SMALL G    # 
+
+0260 ; 0067 0314 ;     MA      # ( ɠ → g̔ ) LATIN SMALL LETTER G WITH HOOK → LATIN SMALL LETTER G, COMBINING REVERSED COMMA ABOVE        # 
+
+01E7 ; 011F ;  MA      # ( ǧ → ğ ) LATIN SMALL LETTER G WITH CARON → LATIN SMALL LETTER G WITH BREVE     # 
+
+01E6 ; 011E ;  MA      # ( Ǧ → Ğ ) LATIN CAPITAL LETTER G WITH CARON → LATIN CAPITAL LETTER G WITH BREVE # 
+
+01F5 ; 0123 ;  MA      # ( ǵ → ģ ) LATIN SMALL LETTER G WITH ACUTE → LATIN SMALL LETTER G WITH CEDILLA   # 
+
+01E5 ; 0067 0335 ;     MA      # ( ǥ → g̵ ) LATIN SMALL LETTER G WITH STROKE → LATIN SMALL LETTER G, COMBINING SHORT STROKE OVERLAY      # 
+
+01E4 ; 0047 0335 ;     MA      # ( Ǥ → G̵ ) LATIN CAPITAL LETTER G WITH STROKE → LATIN CAPITAL LETTER G, COMBINING SHORT STROKE OVERLAY  # 
+
+0193 ; 0047 0027 ;     MA      # ( Ɠ → G' ) LATIN CAPITAL LETTER G WITH HOOK → LATIN CAPITAL LETTER G, APOSTROPHE # →Gʽ→
+
+050D ; 0262 ;  MA      # ( ԍ → ɢ ) CYRILLIC SMALL LETTER KOMI SJE → LATIN LETTER SMALL CAPITAL G # 
+
+FF48 ; 0068 ;  MA      # ( h → h ) FULLWIDTH LATIN SMALL LETTER H → LATIN SMALL LETTER H # →һ→
+210E ; 0068 ;  MA      # ( ℎ → h ) PLANCK CONSTANT → LATIN SMALL LETTER H        # 
+1D421 ;        0068 ;  MA      # ( 𝐡 → h ) MATHEMATICAL BOLD SMALL H → LATIN SMALL LETTER H     # 
+1D489 ;        0068 ;  MA      # ( 𝒉 → h ) MATHEMATICAL BOLD ITALIC SMALL H → LATIN SMALL LETTER H      # 
+1D4BD ;        0068 ;  MA      # ( 𝒽 → h ) MATHEMATICAL SCRIPT SMALL H → LATIN SMALL LETTER H   # 
+1D4F1 ;        0068 ;  MA      # ( 𝓱 → h ) MATHEMATICAL BOLD SCRIPT SMALL H → LATIN SMALL LETTER H      # 
+1D525 ;        0068 ;  MA      # ( 𝔥 → h ) MATHEMATICAL FRAKTUR SMALL H → LATIN SMALL LETTER H  # 
+1D559 ;        0068 ;  MA      # ( 𝕙 → h ) MATHEMATICAL DOUBLE-STRUCK SMALL H → LATIN SMALL LETTER H    # 
+1D58D ;        0068 ;  MA      # ( 𝖍 → h ) MATHEMATICAL BOLD FRAKTUR SMALL H → LATIN SMALL LETTER H     # 
+1D5C1 ;        0068 ;  MA      # ( 𝗁 → h ) MATHEMATICAL SANS-SERIF SMALL H → LATIN SMALL LETTER H       # 
+1D5F5 ;        0068 ;  MA      # ( 𝗵 → h ) MATHEMATICAL SANS-SERIF BOLD SMALL H → LATIN SMALL LETTER H  # 
+1D629 ;        0068 ;  MA      # ( 𝘩 → h ) MATHEMATICAL SANS-SERIF ITALIC SMALL H → LATIN SMALL LETTER H        # 
+1D65D ;        0068 ;  MA      # ( 𝙝 → h ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H → LATIN SMALL LETTER H   # 
+1D691 ;        0068 ;  MA      # ( 𝚑 → h ) MATHEMATICAL MONOSPACE SMALL H → LATIN SMALL LETTER H        # 
+04BB ; 0068 ;  MA      # ( һ → h ) CYRILLIC SMALL LETTER SHHA → LATIN SMALL LETTER H      # 
+0570 ; 0068 ;  MA      # ( հ → h ) ARMENIAN SMALL LETTER HO → LATIN SMALL LETTER H        # 
+13C2 ; 0068 ;  MA      # ( Ꮒ → h ) CHEROKEE LETTER NI → LATIN SMALL LETTER H     # 
+
+FF28 ; 0048 ;  MA      # ( H → H ) FULLWIDTH LATIN CAPITAL LETTER H → LATIN CAPITAL LETTER H     # →Н→
+210B ; 0048 ;  MA      # ( ℋ → H ) SCRIPT CAPITAL H → LATIN CAPITAL LETTER H     # 
+210C ; 0048 ;  MA      # ( ℌ → H ) BLACK-LETTER CAPITAL H → LATIN CAPITAL LETTER H       # 
+210D ; 0048 ;  MA      # ( ℍ → H ) DOUBLE-STRUCK CAPITAL H → LATIN CAPITAL LETTER H      # 
+1D407 ;        0048 ;  MA      # ( 𝐇 → H ) MATHEMATICAL BOLD CAPITAL H → LATIN CAPITAL LETTER H # 
+1D43B ;        0048 ;  MA      # ( 𝐻 → H ) MATHEMATICAL ITALIC CAPITAL H → LATIN CAPITAL LETTER H       # 
+1D46F ;        0048 ;  MA      # ( 𝑯 → H ) MATHEMATICAL BOLD ITALIC CAPITAL H → LATIN CAPITAL LETTER H  # 
+1D4D7 ;        0048 ;  MA      # ( 𝓗 → H ) MATHEMATICAL BOLD SCRIPT CAPITAL H → LATIN CAPITAL LETTER H  # 
+1D573 ;        0048 ;  MA      # ( 𝕳 → H ) MATHEMATICAL BOLD FRAKTUR CAPITAL H → LATIN CAPITAL LETTER H # 
+1D5A7 ;        0048 ;  MA      # ( 𝖧 → H ) MATHEMATICAL SANS-SERIF CAPITAL H → LATIN CAPITAL LETTER H   # 
+1D5DB ;        0048 ;  MA      # ( 𝗛 → H ) MATHEMATICAL SANS-SERIF BOLD CAPITAL H → LATIN CAPITAL LETTER H      # 
+1D60F ;        0048 ;  MA      # ( 𝘏 → H ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL H → LATIN CAPITAL LETTER H    # 
+1D643 ;        0048 ;  MA      # ( 𝙃 → H ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H → LATIN CAPITAL LETTER H       # 
+1D677 ;        0048 ;  MA      # ( 𝙷 → H ) MATHEMATICAL MONOSPACE CAPITAL H → LATIN CAPITAL LETTER H    # 
+0397 ; 0048 ;  MA      # ( Η → H ) GREEK CAPITAL LETTER ETA → LATIN CAPITAL LETTER H      # 
+1D6AE ;        0048 ;  MA      # ( 𝚮 → H ) MATHEMATICAL BOLD CAPITAL ETA → LATIN CAPITAL LETTER H       # →𝐇→
+1D6E8 ;        0048 ;  MA      # ( 𝛨 → H ) MATHEMATICAL ITALIC CAPITAL ETA → LATIN CAPITAL LETTER H     # →𝐻→
+1D722 ;        0048 ;  MA      # ( 𝜢 → H ) MATHEMATICAL BOLD ITALIC CAPITAL ETA → LATIN CAPITAL LETTER H        # →Η→
+1D75C ;        0048 ;  MA      # ( 𝝜 → H ) MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA → LATIN CAPITAL LETTER H    # →Η→
+1D796 ;        0048 ;  MA      # ( 𝞖 → H ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA → LATIN CAPITAL LETTER H     # →Η→
+2C8E ; 0048 ;  MA      # ( Ⲏ → H ) COPTIC CAPITAL LETTER HATE → LATIN CAPITAL LETTER H   # →Η→
+041D ; 0048 ;  MA      # ( Н → H ) CYRILLIC CAPITAL LETTER EN → LATIN CAPITAL LETTER H    # 
+13BB ; 0048 ;  MA      # ( Ꮋ → H ) CHEROKEE LETTER MI → LATIN CAPITAL LETTER H   # 
+157C ; 0048 ;  MA      # ( ᕼ → H ) CANADIAN SYLLABICS NUNAVUT H → LATIN CAPITAL LETTER H # 
+A4E7 ; 0048 ;  MA      # ( ꓧ → H ) LISU LETTER XA → LATIN CAPITAL LETTER H       # 
+
+1D78 ; 1D34 ;  MA      # ( ᵸ → ᴴ ) MODIFIER LETTER CYRILLIC EN → MODIFIER LETTER CAPITAL H     # 
+
+0266 ; 0068 0314 ;     MA      # ( ɦ → h̔ ) LATIN SMALL LETTER H WITH HOOK → LATIN SMALL LETTER H, COMBINING REVERSED COMMA ABOVE        # 
+13F2 ; 0068 0314 ;     MA      # ( Ᏺ → h̔ ) CHEROKEE LETTER YO → LATIN SMALL LETTER H, COMBINING REVERSED COMMA ABOVE   # →ɦ→
+
+2C67 ; 0048 0329 ;     MA      # ( Ⱨ → H̩ ) LATIN CAPITAL LETTER H WITH DESCENDER → LATIN CAPITAL LETTER H, COMBINING VERTICAL LINE BELOW       # →Ң→→Н̩→
+04A2 ; 0048 0329 ;     MA      # ( Ң → H̩ ) CYRILLIC CAPITAL LETTER EN WITH DESCENDER → LATIN CAPITAL LETTER H, COMBINING VERTICAL LINE BELOW    # →Н̩→
+
+04C9 ; 0048 0326 ;     MA      # ( Ӊ → H̦ ) CYRILLIC CAPITAL LETTER EN WITH TAIL → LATIN CAPITAL LETTER H, COMBINING COMMA BELOW # →Н̡→
+04C7 ; 0048 0326 ;     MA      # ( Ӈ → H̦ ) CYRILLIC CAPITAL LETTER EN WITH HOOK → LATIN CAPITAL LETTER H, COMBINING COMMA BELOW # →Н̡→
+
+0127 ; 0068 0335 ;     MA      # ( ħ → h̵ ) LATIN SMALL LETTER H WITH STROKE → LATIN SMALL LETTER H, COMBINING SHORT STROKE OVERLAY      # 
+210F ; 0068 0335 ;     MA      # ( ℏ → h̵ ) PLANCK CONSTANT OVER TWO PI → LATIN SMALL LETTER H, COMBINING SHORT STROKE OVERLAY  # →ħ→
+045B ; 0068 0335 ;     MA      # ( ћ → h̵ ) CYRILLIC SMALL LETTER TSHE → LATIN SMALL LETTER H, COMBINING SHORT STROKE OVERLAY    # →ħ→
+
+0126 ; 0048 0335 ;     MA      # ( Ħ → H̵ ) LATIN CAPITAL LETTER H WITH STROKE → LATIN CAPITAL LETTER H, COMBINING SHORT STROKE OVERLAY  # 
+
+043D ; 029C ;  MA      # ( н → ʜ ) CYRILLIC SMALL LETTER EN → LATIN LETTER SMALL CAPITAL H       # 
+
+04A3 ; 029C 0329 ;     MA      # ( ң → ʜ̩ ) CYRILLIC SMALL LETTER EN WITH DESCENDER → LATIN LETTER SMALL CAPITAL H, COMBINING VERTICAL LINE BELOW       # →н̩→
+
+04CA ; 029C 0326 ;     MA      # ( ӊ → ʜ̦ ) CYRILLIC SMALL LETTER EN WITH TAIL → LATIN LETTER SMALL CAPITAL H, COMBINING COMMA BELOW    # →н̡→
+04C8 ; 029C 0326 ;     MA      # ( ӈ → ʜ̦ ) CYRILLIC SMALL LETTER EN WITH HOOK → LATIN LETTER SMALL CAPITAL H, COMBINING COMMA BELOW    # →н̡→
+
+050A ; 01F6 ;  MA      # ( Ԋ → Ƕ ) CYRILLIC CAPITAL LETTER KOMI NJE → LATIN CAPITAL LETTER HWAIR # 
+
+13B0 ; 2C75 ;  MA      # ( Ꮀ → Ⱶ ) CHEROKEE LETTER HO → LATIN CAPITAL LETTER HALF H    # 
+
+02DB ; 0069 ;  MA      #* ( ˛ → i ) OGONEK → LATIN SMALL LETTER I # →ͺ→→ι→→ι→
+2373 ; 0069 ;  MA      #* ( ⍳ → i ) APL FUNCTIONAL SYMBOL IOTA → LATIN SMALL LETTER I    # →ι→
+FF49 ; 0069 ;  MA      # ( i → i ) FULLWIDTH LATIN SMALL LETTER I → LATIN SMALL LETTER I # →і→
+2170 ; 0069 ;  MA      # ( ⅰ → i ) SMALL ROMAN NUMERAL ONE → LATIN SMALL LETTER I        # 
+2139 ; 0069 ;  MA      # ( ℹ → i ) INFORMATION SOURCE → LATIN SMALL LETTER I     # 
+2148 ; 0069 ;  MA      # ( ⅈ → i ) DOUBLE-STRUCK ITALIC SMALL I → LATIN SMALL LETTER I   # 
+1D422 ;        0069 ;  MA      # ( 𝐢 → i ) MATHEMATICAL BOLD SMALL I → LATIN SMALL LETTER I     # 
+1D456 ;        0069 ;  MA      # ( 𝑖 → i ) MATHEMATICAL ITALIC SMALL I → LATIN SMALL LETTER I   # 
+1D48A ;        0069 ;  MA      # ( 𝒊 → i ) MATHEMATICAL BOLD ITALIC SMALL I → LATIN SMALL LETTER I      # 
+1D4BE ;        0069 ;  MA      # ( 𝒾 → i ) MATHEMATICAL SCRIPT SMALL I → LATIN SMALL LETTER I   # 
+1D4F2 ;        0069 ;  MA      # ( 𝓲 → i ) MATHEMATICAL BOLD SCRIPT SMALL I → LATIN SMALL LETTER I      # 
+1D526 ;        0069 ;  MA      # ( 𝔦 → i ) MATHEMATICAL FRAKTUR SMALL I → LATIN SMALL LETTER I  # 
+1D55A ;        0069 ;  MA      # ( 𝕚 → i ) MATHEMATICAL DOUBLE-STRUCK SMALL I → LATIN SMALL LETTER I    # 
+1D58E ;        0069 ;  MA      # ( 𝖎 → i ) MATHEMATICAL BOLD FRAKTUR SMALL I → LATIN SMALL LETTER I     # 
+1D5C2 ;        0069 ;  MA      # ( 𝗂 → i ) MATHEMATICAL SANS-SERIF SMALL I → LATIN SMALL LETTER I       # 
+1D5F6 ;        0069 ;  MA      # ( 𝗶 → i ) MATHEMATICAL SANS-SERIF BOLD SMALL I → LATIN SMALL LETTER I  # 
+1D62A ;        0069 ;  MA      # ( 𝘪 → i ) MATHEMATICAL SANS-SERIF ITALIC SMALL I → LATIN SMALL LETTER I        # 
+1D65E ;        0069 ;  MA      # ( 𝙞 → i ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I → LATIN SMALL LETTER I   # 
+1D692 ;        0069 ;  MA      # ( 𝚒 → i ) MATHEMATICAL MONOSPACE SMALL I → LATIN SMALL LETTER I        # 
+0131 ; 0069 ;  MA      # ( ı → i ) LATIN SMALL LETTER DOTLESS I → LATIN SMALL LETTER I    # 
+1D6A4 ;        0069 ;  MA      # ( 𝚤 → i ) MATHEMATICAL ITALIC SMALL DOTLESS I → LATIN SMALL LETTER I   # →ı→
+026A ; 0069 ;  MA      # ( ɪ → i ) LATIN LETTER SMALL CAPITAL I → LATIN SMALL LETTER I    # →ı→
+0269 ; 0069 ;  MA      # ( ɩ → i ) LATIN SMALL LETTER IOTA → LATIN SMALL LETTER I # 
+03B9 ; 0069 ;  MA      # ( ι → i ) GREEK SMALL LETTER IOTA → LATIN SMALL LETTER I # 
+1FBE ; 0069 ;  MA      # ( ι → i ) GREEK PROSGEGRAMMENI → LATIN SMALL LETTER I   # →ι→
+037A ; 0069 ;  MA      #* ( ͺ → i ) GREEK YPOGEGRAMMENI → LATIN SMALL LETTER I    # →ι→→ι→
+1D6CA ;        0069 ;  MA      # ( 𝛊 → i ) MATHEMATICAL BOLD SMALL IOTA → LATIN SMALL LETTER I  # →ι→
+1D704 ;        0069 ;  MA      # ( 𝜄 → i ) MATHEMATICAL ITALIC SMALL IOTA → LATIN SMALL LETTER I        # →ι→
+1D73E ;        0069 ;  MA      # ( 𝜾 → i ) MATHEMATICAL BOLD ITALIC SMALL IOTA → LATIN SMALL LETTER I   # →ι→
+1D778 ;        0069 ;  MA      # ( 𝝸 → i ) MATHEMATICAL SANS-SERIF BOLD SMALL IOTA → LATIN SMALL LETTER I       # →ι→
+1D7B2 ;        0069 ;  MA      # ( 𝞲 → i ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA → LATIN SMALL LETTER I        # →ι→
+0456 ; 0069 ;  MA      # ( і → i ) CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I → LATIN SMALL LETTER I  # 
+04CF ; 0069 ;  MA      # ( ӏ → i ) CYRILLIC SMALL LETTER PALOCHKA → LATIN SMALL LETTER I  # →ı→
+13A5 ; 0069 ;  MA      # ( Ꭵ → i ) CHEROKEE LETTER V → LATIN SMALL LETTER I      # 
+
+24DB ; 24BE ;  MA      #* ( ⓛ → Ⓘ ) CIRCLED LATIN SMALL LETTER L → CIRCLED LATIN CAPITAL LETTER I      # 
+
+01D0 ; 012D ;  MA      # ( ǐ → ĭ ) LATIN SMALL LETTER I WITH CARON → LATIN SMALL LETTER I WITH BREVE     # 
+
+01CF ; 012C ;  MA      # ( Ǐ → Ĭ ) LATIN CAPITAL LETTER I WITH CARON → LATIN CAPITAL LETTER I WITH BREVE # 
+
+0268 ; 0069 0335 ;     MA      # ( ɨ → i̵ ) LATIN SMALL LETTER I WITH STROKE → LATIN SMALL LETTER I, COMBINING SHORT STROKE OVERLAY      # 
+
+2171 ; 0069 0069 ;     MA      # ( ⅱ → ii ) SMALL ROMAN NUMERAL TWO → LATIN SMALL LETTER I, LATIN SMALL LETTER I # 
+
+2172 ; 0069 0069 0069 ;        MA      # ( ⅲ → iii ) SMALL ROMAN NUMERAL THREE → LATIN SMALL LETTER I, LATIN SMALL LETTER I, LATIN SMALL LETTER I        # 
+
+0133 ; 0069 006A ;     MA      # ( ij → ij ) LATIN SMALL LIGATURE IJ → LATIN SMALL LETTER I, LATIN SMALL LETTER J  # 
+
+0132 ; 0049 004A ;     MA      # ( IJ → IJ ) LATIN CAPITAL LIGATURE IJ → LATIN CAPITAL LETTER I, LATIN CAPITAL LETTER J    # 
+
+2173 ; 0069 0076 ;     MA      # ( ⅳ → iv ) SMALL ROMAN NUMERAL FOUR → LATIN SMALL LETTER I, LATIN SMALL LETTER V        # 
+
+2163 ; 0049 0056 ;     MA      # ( Ⅳ → IV ) ROMAN NUMERAL FOUR → LATIN CAPITAL LETTER I, LATIN CAPITAL LETTER V  # 
+
+2178 ; 0069 0078 ;     MA      # ( ⅸ → ix ) SMALL ROMAN NUMERAL NINE → LATIN SMALL LETTER I, LATIN SMALL LETTER X        # 
+
+2168 ; 0049 0058 ;     MA      # ( Ⅸ → IX ) ROMAN NUMERAL NINE → LATIN CAPITAL LETTER I, LATIN CAPITAL LETTER X  # 
+
+FF4A ; 006A ;  MA      # ( j → j ) FULLWIDTH LATIN SMALL LETTER J → LATIN SMALL LETTER J # →ј→
+2149 ; 006A ;  MA      # ( ⅉ → j ) DOUBLE-STRUCK ITALIC SMALL J → LATIN SMALL LETTER J   # 
+1D423 ;        006A ;  MA      # ( 𝐣 → j ) MATHEMATICAL BOLD SMALL J → LATIN SMALL LETTER J     # 
+1D457 ;        006A ;  MA      # ( 𝑗 → j ) MATHEMATICAL ITALIC SMALL J → LATIN SMALL LETTER J   # 
+1D48B ;        006A ;  MA      # ( 𝒋 → j ) MATHEMATICAL BOLD ITALIC SMALL J → LATIN SMALL LETTER J      # 
+1D4BF ;        006A ;  MA      # ( 𝒿 → j ) MATHEMATICAL SCRIPT SMALL J → LATIN SMALL LETTER J   # 
+1D4F3 ;        006A ;  MA      # ( 𝓳 → j ) MATHEMATICAL BOLD SCRIPT SMALL J → LATIN SMALL LETTER J      # 
+1D527 ;        006A ;  MA      # ( 𝔧 → j ) MATHEMATICAL FRAKTUR SMALL J → LATIN SMALL LETTER J  # 
+1D55B ;        006A ;  MA      # ( 𝕛 → j ) MATHEMATICAL DOUBLE-STRUCK SMALL J → LATIN SMALL LETTER J    # 
+1D58F ;        006A ;  MA      # ( 𝖏 → j ) MATHEMATICAL BOLD FRAKTUR SMALL J → LATIN SMALL LETTER J     # 
+1D5C3 ;        006A ;  MA      # ( 𝗃 → j ) MATHEMATICAL SANS-SERIF SMALL J → LATIN SMALL LETTER J       # 
+1D5F7 ;        006A ;  MA      # ( 𝗷 → j ) MATHEMATICAL SANS-SERIF BOLD SMALL J → LATIN SMALL LETTER J  # 
+1D62B ;        006A ;  MA      # ( 𝘫 → j ) MATHEMATICAL SANS-SERIF ITALIC SMALL J → LATIN SMALL LETTER J        # 
+1D65F ;        006A ;  MA      # ( 𝙟 → j ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J → LATIN SMALL LETTER J   # 
+1D693 ;        006A ;  MA      # ( 𝚓 → j ) MATHEMATICAL MONOSPACE SMALL J → LATIN SMALL LETTER J        # 
+0237 ; 006A ;  MA      # ( ȷ → j ) LATIN SMALL LETTER DOTLESS J → LATIN SMALL LETTER J    # →յ→
+1D6A5 ;        006A ;  MA      # ( 𝚥 → j ) MATHEMATICAL ITALIC SMALL DOTLESS J → LATIN SMALL LETTER J   # →ȷ→→յ→
+03F3 ; 006A ;  MA      # ( ϳ → j ) GREEK LETTER YOT → LATIN SMALL LETTER J        # 
+0458 ; 006A ;  MA      # ( ј → j ) CYRILLIC SMALL LETTER JE → LATIN SMALL LETTER J        # 
+0575 ; 006A ;  MA      # ( յ → j ) ARMENIAN SMALL LETTER YI → LATIN SMALL LETTER J        # 
+
+FF2A ; 004A ;  MA      # ( J → J ) FULLWIDTH LATIN CAPITAL LETTER J → LATIN CAPITAL LETTER J     # →Ј→
+1D409 ;        004A ;  MA      # ( 𝐉 → J ) MATHEMATICAL BOLD CAPITAL J → LATIN CAPITAL LETTER J # 
+1D43D ;        004A ;  MA      # ( 𝐽 → J ) MATHEMATICAL ITALIC CAPITAL J → LATIN CAPITAL LETTER J       # 
+1D471 ;        004A ;  MA      # ( 𝑱 → J ) MATHEMATICAL BOLD ITALIC CAPITAL J → LATIN CAPITAL LETTER J  # 
+1D4A5 ;        004A ;  MA      # ( 𝒥 → J ) MATHEMATICAL SCRIPT CAPITAL J → LATIN CAPITAL LETTER J       # 
+1D4D9 ;        004A ;  MA      # ( 𝓙 → J ) MATHEMATICAL BOLD SCRIPT CAPITAL J → LATIN CAPITAL LETTER J  # 
+1D50D ;        004A ;  MA      # ( 𝔍 → J ) MATHEMATICAL FRAKTUR CAPITAL J → LATIN CAPITAL LETTER J      # 
+1D541 ;        004A ;  MA      # ( 𝕁 → J ) MATHEMATICAL DOUBLE-STRUCK CAPITAL J → LATIN CAPITAL LETTER J        # 
+1D575 ;        004A ;  MA      # ( 𝕵 → J ) MATHEMATICAL BOLD FRAKTUR CAPITAL J → LATIN CAPITAL LETTER J # 
+1D5A9 ;        004A ;  MA      # ( 𝖩 → J ) MATHEMATICAL SANS-SERIF CAPITAL J → LATIN CAPITAL LETTER J   # 
+1D5DD ;        004A ;  MA      # ( 𝗝 → J ) MATHEMATICAL SANS-SERIF BOLD CAPITAL J → LATIN CAPITAL LETTER J      # 
+1D611 ;        004A ;  MA      # ( 𝘑 → J ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL J → LATIN CAPITAL LETTER J    # 
+1D645 ;        004A ;  MA      # ( 𝙅 → J ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J → LATIN CAPITAL LETTER J       # 
+1D679 ;        004A ;  MA      # ( 𝙹 → J ) MATHEMATICAL MONOSPACE CAPITAL J → LATIN CAPITAL LETTER J    # 
+0408 ; 004A ;  MA      # ( Ј → J ) CYRILLIC CAPITAL LETTER JE → LATIN CAPITAL LETTER J    # 
+13AB ; 004A ;  MA      # ( Ꭻ → J ) CHEROKEE LETTER GU → LATIN CAPITAL LETTER J   # 
+13E7 ; 004A ;  MA      # ( Ꮷ → J ) CHEROKEE LETTER TSU → LATIN CAPITAL LETTER J  # 
+148D ; 004A ;  MA      # ( ᒍ → J ) CANADIAN SYLLABICS CO → LATIN CAPITAL LETTER J        # 
+A4D9 ; 004A ;  MA      # ( ꓙ → J ) LISU LETTER JA → LATIN CAPITAL LETTER J       # 
+
+1499 ; 004A 00B7 ;     MA      # ( ᒙ → J· ) CANADIAN SYLLABICS WEST-CREE CWO → LATIN CAPITAL LETTER J, MIDDLE DOT       # →ᒍᐧ→
+
+1D424 ;        006B ;  MA      # ( 𝐤 → k ) MATHEMATICAL BOLD SMALL K → LATIN SMALL LETTER K     # 
+1D458 ;        006B ;  MA      # ( 𝑘 → k ) MATHEMATICAL ITALIC SMALL K → LATIN SMALL LETTER K   # 
+1D48C ;        006B ;  MA      # ( 𝒌 → k ) MATHEMATICAL BOLD ITALIC SMALL K → LATIN SMALL LETTER K      # 
+1D4C0 ;        006B ;  MA      # ( 𝓀 → k ) MATHEMATICAL SCRIPT SMALL K → LATIN SMALL LETTER K   # 
+1D4F4 ;        006B ;  MA      # ( 𝓴 → k ) MATHEMATICAL BOLD SCRIPT SMALL K → LATIN SMALL LETTER K      # 
+1D528 ;        006B ;  MA      # ( 𝔨 → k ) MATHEMATICAL FRAKTUR SMALL K → LATIN SMALL LETTER K  # 
+1D55C ;        006B ;  MA      # ( 𝕜 → k ) MATHEMATICAL DOUBLE-STRUCK SMALL K → LATIN SMALL LETTER K    # 
+1D590 ;        006B ;  MA      # ( 𝖐 → k ) MATHEMATICAL BOLD FRAKTUR SMALL K → LATIN SMALL LETTER K     # 
+1D5C4 ;        006B ;  MA      # ( 𝗄 → k ) MATHEMATICAL SANS-SERIF SMALL K → LATIN SMALL LETTER K       # 
+1D5F8 ;        006B ;  MA      # ( 𝗸 → k ) MATHEMATICAL SANS-SERIF BOLD SMALL K → LATIN SMALL LETTER K  # 
+1D62C ;        006B ;  MA      # ( 𝘬 → k ) MATHEMATICAL SANS-SERIF ITALIC SMALL K → LATIN SMALL LETTER K        # 
+1D660 ;        006B ;  MA      # ( 𝙠 → k ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K → LATIN SMALL LETTER K   # 
+1D694 ;        006B ;  MA      # ( 𝚔 → k ) MATHEMATICAL MONOSPACE SMALL K → LATIN SMALL LETTER K        # 
+1D0B ; 006B ;  MA      # ( ᴋ → k ) LATIN LETTER SMALL CAPITAL K → LATIN SMALL LETTER K   # →к→
+0138 ; 006B ;  MA      # ( ĸ → k ) LATIN SMALL LETTER KRA → LATIN SMALL LETTER K  # →к→
+03BA ; 006B ;  MA      # ( κ → k ) GREEK SMALL LETTER KAPPA → LATIN SMALL LETTER K        # →к→
+03F0 ; 006B ;  MA      # ( ϰ → k ) GREEK KAPPA SYMBOL → LATIN SMALL LETTER K      # →κ→→к→
+1D6CB ;        006B ;  MA      # ( 𝛋 → k ) MATHEMATICAL BOLD SMALL KAPPA → LATIN SMALL LETTER K # →κ→→к→
+1D6DE ;        006B ;  MA      # ( 𝛞 → k ) MATHEMATICAL BOLD KAPPA SYMBOL → LATIN SMALL LETTER K        # →κ→→к→
+1D705 ;        006B ;  MA      # ( 𝜅 → k ) MATHEMATICAL ITALIC SMALL KAPPA → LATIN SMALL LETTER K       # →κ→→к→
+1D718 ;        006B ;  MA      # ( 𝜘 → k ) MATHEMATICAL ITALIC KAPPA SYMBOL → LATIN SMALL LETTER K      # →κ→→к→
+1D73F ;        006B ;  MA      # ( 𝜿 → k ) MATHEMATICAL BOLD ITALIC SMALL KAPPA → LATIN SMALL LETTER K  # →κ→→к→
+1D752 ;        006B ;  MA      # ( 𝝒 → k ) MATHEMATICAL BOLD ITALIC KAPPA SYMBOL → LATIN SMALL LETTER K # →κ→→к→
+1D779 ;        006B ;  MA      # ( 𝝹 → k ) MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA → LATIN SMALL LETTER K      # →κ→→к→
+1D78C ;        006B ;  MA      # ( 𝞌 → k ) MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL → LATIN SMALL LETTER K     # →κ→→к→
+1D7B3 ;        006B ;  MA      # ( 𝞳 → k ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA → LATIN SMALL LETTER K       # →κ→→к→
+1D7C6 ;        006B ;  MA      # ( 𝟆 → k ) MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL → LATIN SMALL LETTER K      # →κ→→к→
+2C95 ; 006B ;  MA      # ( ⲕ → k ) COPTIC SMALL LETTER KAPA → LATIN SMALL LETTER K       # →κ→→к→
+043A ; 006B ;  MA      # ( к → k ) CYRILLIC SMALL LETTER KA → LATIN SMALL LETTER K        # 
+
+212A ; 004B ;  MA      # ( K → K ) KELVIN SIGN → LATIN CAPITAL LETTER K  # 
+FF2B ; 004B ;  MA      # ( K → K ) FULLWIDTH LATIN CAPITAL LETTER K → LATIN CAPITAL LETTER K     # →Κ→
+1D40A ;        004B ;  MA      # ( 𝐊 → K ) MATHEMATICAL BOLD CAPITAL K → LATIN CAPITAL LETTER K # 
+1D43E ;        004B ;  MA      # ( 𝐾 → K ) MATHEMATICAL ITALIC CAPITAL K → LATIN CAPITAL LETTER K       # 
+1D472 ;        004B ;  MA      # ( 𝑲 → K ) MATHEMATICAL BOLD ITALIC CAPITAL K → LATIN CAPITAL LETTER K  # 
+1D4A6 ;        004B ;  MA      # ( 𝒦 → K ) MATHEMATICAL SCRIPT CAPITAL K → LATIN CAPITAL LETTER K       # 
+1D4DA ;        004B ;  MA      # ( 𝓚 → K ) MATHEMATICAL BOLD SCRIPT CAPITAL K → LATIN CAPITAL LETTER K  # 
+1D50E ;        004B ;  MA      # ( 𝔎 → K ) MATHEMATICAL FRAKTUR CAPITAL K → LATIN CAPITAL LETTER K      # 
+1D542 ;        004B ;  MA      # ( 𝕂 → K ) MATHEMATICAL DOUBLE-STRUCK CAPITAL K → LATIN CAPITAL LETTER K        # 
+1D576 ;        004B ;  MA      # ( 𝕶 → K ) MATHEMATICAL BOLD FRAKTUR CAPITAL K → LATIN CAPITAL LETTER K # 
+1D5AA ;        004B ;  MA      # ( 𝖪 → K ) MATHEMATICAL SANS-SERIF CAPITAL K → LATIN CAPITAL LETTER K   # 
+1D5DE ;        004B ;  MA      # ( 𝗞 → K ) MATHEMATICAL SANS-SERIF BOLD CAPITAL K → LATIN CAPITAL LETTER K      # 
+1D612 ;        004B ;  MA      # ( 𝘒 → K ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL K → LATIN CAPITAL LETTER K    # 
+1D646 ;        004B ;  MA      # ( 𝙆 → K ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K → LATIN CAPITAL LETTER K       # 
+1D67A ;        004B ;  MA      # ( 𝙺 → K ) MATHEMATICAL MONOSPACE CAPITAL K → LATIN CAPITAL LETTER K    # 
+039A ; 004B ;  MA      # ( Κ → K ) GREEK CAPITAL LETTER KAPPA → LATIN CAPITAL LETTER K    # 
+1D6B1 ;        004B ;  MA      # ( 𝚱 → K ) MATHEMATICAL BOLD CAPITAL KAPPA → LATIN CAPITAL LETTER K     # →Κ→
+1D6EB ;        004B ;  MA      # ( 𝛫 → K ) MATHEMATICAL ITALIC CAPITAL KAPPA → LATIN CAPITAL LETTER K   # →Κ→
+1D725 ;        004B ;  MA      # ( 𝜥 → K ) MATHEMATICAL BOLD ITALIC CAPITAL KAPPA → LATIN CAPITAL LETTER K      # →Κ→
+1D75F ;        004B ;  MA      # ( 𝝟 → K ) MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA → LATIN CAPITAL LETTER K  # →Κ→
+1D799 ;        004B ;  MA      # ( 𝞙 → K ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA → LATIN CAPITAL LETTER K   # →Κ→
+2C94 ; 004B ;  MA      # ( Ⲕ → K ) COPTIC CAPITAL LETTER KAPA → LATIN CAPITAL LETTER K   # →Κ→
+041A ; 004B ;  MA      # ( К → K ) CYRILLIC CAPITAL LETTER KA → LATIN CAPITAL LETTER K    # 
+13E6 ; 004B ;  MA      # ( Ꮶ → K ) CHEROKEE LETTER TSO → LATIN CAPITAL LETTER K  # 
+A4D7 ; 004B ;  MA      # ( ꓗ → K ) LISU LETTER KA → LATIN CAPITAL LETTER K       # 
+
+0199 ; 006B 0314 ;     MA      # ( ƙ → k̔ ) LATIN SMALL LETTER K WITH HOOK → LATIN SMALL LETTER K, COMBINING REVERSED COMMA ABOVE        # 
+
+049B ; 006B 0329 ;     MA      # ( қ → k̩ ) CYRILLIC SMALL LETTER KA WITH DESCENDER → LATIN SMALL LETTER K, COMBINING VERTICAL LINE BELOW        # →к̩→
+
+2C69 ; 004B 0329 ;     MA      # ( Ⱪ → K̩ ) LATIN CAPITAL LETTER K WITH DESCENDER → LATIN CAPITAL LETTER K, COMBINING VERTICAL LINE BELOW       # →Қ→→К̩→
+049A ; 004B 0329 ;     MA      # ( Қ → K̩ ) CYRILLIC CAPITAL LETTER KA WITH DESCENDER → LATIN CAPITAL LETTER K, COMBINING VERTICAL LINE BELOW    # →К̩→
+
+049F ; 006B 0335 ;     MA      # ( ҟ → k̵ ) CYRILLIC SMALL LETTER KA WITH STROKE → LATIN SMALL LETTER K, COMBINING SHORT STROKE OVERLAY  # →к̵→
+
+049E ; 004B 0335 ;     MA      # ( Ҟ → K̵ ) CYRILLIC CAPITAL LETTER KA WITH STROKE → LATIN CAPITAL LETTER K, COMBINING SHORT STROKE OVERLAY      # →К̵→
+
+0198 ; 004B 0027 ;     MA      # ( Ƙ → K' ) LATIN CAPITAL LETTER K WITH HOOK → LATIN CAPITAL LETTER K, APOSTROPHE # →Kʽ→
+
+007C ; 006C ;  MA      #* ( | → l ) VERTICAL LINE → LATIN SMALL LETTER L   # 
+2223 ; 006C ;  MA      #* ( ∣ → l ) DIVIDES → LATIN SMALL LETTER L       # →|→
+FFE8 ; 006C ;  MA      #* ( │ → l ) HALFWIDTH FORMS LIGHT VERTICAL → LATIN SMALL LETTER L        # →|→
+0031 ; 006C ;  MA      # ( 1 → l ) DIGIT ONE → LATIN SMALL LETTER L        # 
+1D7CF ;        006C ;  MA      # ( 𝟏 → l ) MATHEMATICAL BOLD DIGIT ONE → LATIN SMALL LETTER L   # →1→
+1D7D9 ;        006C ;  MA      # ( 𝟙 → l ) MATHEMATICAL DOUBLE-STRUCK DIGIT ONE → LATIN SMALL LETTER L  # →1→
+1D7E3 ;        006C ;  MA      # ( 𝟣 → l ) MATHEMATICAL SANS-SERIF DIGIT ONE → LATIN SMALL LETTER L     # →1→
+1D7ED ;        006C ;  MA      # ( 𝟭 → l ) MATHEMATICAL SANS-SERIF BOLD DIGIT ONE → LATIN SMALL LETTER L        # →1→
+1D7F7 ;        006C ;  MA      # ( 𝟷 → l ) MATHEMATICAL MONOSPACE DIGIT ONE → LATIN SMALL LETTER L      # →1→
+0049 ; 006C ;  MA      # ( I → l ) LATIN CAPITAL LETTER I → LATIN SMALL LETTER L   # 
+FF29 ; 006C ;  MA      # ( I → l ) FULLWIDTH LATIN CAPITAL LETTER I → LATIN SMALL LETTER L       # →Ӏ→
+2160 ; 006C ;  MA      # ( Ⅰ → l ) ROMAN NUMERAL ONE → LATIN SMALL LETTER L      # →Ӏ→
+2110 ; 006C ;  MA      # ( ℐ → l ) SCRIPT CAPITAL I → LATIN SMALL LETTER L       # →I→
+2111 ; 006C ;  MA      # ( ℑ → l ) BLACK-LETTER CAPITAL I → LATIN SMALL LETTER L # →I→
+1D408 ;        006C ;  MA      # ( 𝐈 → l ) MATHEMATICAL BOLD CAPITAL I → LATIN SMALL LETTER L   # →I→
+1D43C ;        006C ;  MA      # ( 𝐼 → l ) MATHEMATICAL ITALIC CAPITAL I → LATIN SMALL LETTER L # →I→
+1D470 ;        006C ;  MA      # ( 𝑰 → l ) MATHEMATICAL BOLD ITALIC CAPITAL I → LATIN SMALL LETTER L    # →I→
+1D4D8 ;        006C ;  MA      # ( 𝓘 → l ) MATHEMATICAL BOLD SCRIPT CAPITAL I → LATIN SMALL LETTER L    # →I→
+1D540 ;        006C ;  MA      # ( 𝕀 → l ) MATHEMATICAL DOUBLE-STRUCK CAPITAL I → LATIN SMALL LETTER L  # →I→
+1D574 ;        006C ;  MA      # ( 𝕴 → l ) MATHEMATICAL BOLD FRAKTUR CAPITAL I → LATIN SMALL LETTER L   # →I→
+1D5A8 ;        006C ;  MA      # ( 𝖨 → l ) MATHEMATICAL SANS-SERIF CAPITAL I → LATIN SMALL LETTER L     # →I→
+1D5DC ;        006C ;  MA      # ( 𝗜 → l ) MATHEMATICAL SANS-SERIF BOLD CAPITAL I → LATIN SMALL LETTER L        # →I→
+1D610 ;        006C ;  MA      # ( 𝘐 → l ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL I → LATIN SMALL LETTER L      # →I→
+1D644 ;        006C ;  MA      # ( 𝙄 → l ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I → LATIN SMALL LETTER L # →I→
+1D678 ;        006C ;  MA      # ( 𝙸 → l ) MATHEMATICAL MONOSPACE CAPITAL I → LATIN SMALL LETTER L      # →I→
+0196 ; 006C ;  MA      # ( Ɩ → l ) LATIN CAPITAL LETTER IOTA → LATIN SMALL LETTER L       # 
+FF4C ; 006C ;  MA      # ( l → l ) FULLWIDTH LATIN SMALL LETTER L → LATIN SMALL LETTER L # →Ⅰ→→Ӏ→
+217C ; 006C ;  MA      # ( ⅼ → l ) SMALL ROMAN NUMERAL FIFTY → LATIN SMALL LETTER L      # 
+2113 ; 006C ;  MA      # ( ℓ → l ) SCRIPT SMALL L → LATIN SMALL LETTER L # 
+1D425 ;        006C ;  MA      # ( 𝐥 → l ) MATHEMATICAL BOLD SMALL L → LATIN SMALL LETTER L     # 
+1D459 ;        006C ;  MA      # ( 𝑙 → l ) MATHEMATICAL ITALIC SMALL L → LATIN SMALL LETTER L   # 
+1D48D ;        006C ;  MA      # ( 𝒍 → l ) MATHEMATICAL BOLD ITALIC SMALL L → LATIN SMALL LETTER L      # 
+1D4C1 ;        006C ;  MA      # ( 𝓁 → l ) MATHEMATICAL SCRIPT SMALL L → LATIN SMALL LETTER L   # 
+1D4F5 ;        006C ;  MA      # ( 𝓵 → l ) MATHEMATICAL BOLD SCRIPT SMALL L → LATIN SMALL LETTER L      # 
+1D529 ;        006C ;  MA      # ( 𝔩 → l ) MATHEMATICAL FRAKTUR SMALL L → LATIN SMALL LETTER L  # 
+1D55D ;        006C ;  MA      # ( 𝕝 → l ) MATHEMATICAL DOUBLE-STRUCK SMALL L → LATIN SMALL LETTER L    # 
+1D591 ;        006C ;  MA      # ( 𝖑 → l ) MATHEMATICAL BOLD FRAKTUR SMALL L → LATIN SMALL LETTER L     # 
+1D5C5 ;        006C ;  MA      # ( 𝗅 → l ) MATHEMATICAL SANS-SERIF SMALL L → LATIN SMALL LETTER L       # 
+1D5F9 ;        006C ;  MA      # ( 𝗹 → l ) MATHEMATICAL SANS-SERIF BOLD SMALL L → LATIN SMALL LETTER L  # 
+1D62D ;        006C ;  MA      # ( 𝘭 → l ) MATHEMATICAL SANS-SERIF ITALIC SMALL L → LATIN SMALL LETTER L        # 
+1D661 ;        006C ;  MA      # ( 𝙡 → l ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L → LATIN SMALL LETTER L   # 
+1D695 ;        006C ;  MA      # ( 𝚕 → l ) MATHEMATICAL MONOSPACE SMALL L → LATIN SMALL LETTER L        # 
+01C0 ; 006C ;  MA      # ( ǀ → l ) LATIN LETTER DENTAL CLICK → LATIN SMALL LETTER L       # 
+0399 ; 006C ;  MA      # ( Ι → l ) GREEK CAPITAL LETTER IOTA → LATIN SMALL LETTER L       # 
+1D6B0 ;        006C ;  MA      # ( 𝚰 → l ) MATHEMATICAL BOLD CAPITAL IOTA → LATIN SMALL LETTER L        # →Ι→
+1D6EA ;        006C ;  MA      # ( 𝛪 → l ) MATHEMATICAL ITALIC CAPITAL IOTA → LATIN SMALL LETTER L      # →Ι→
+1D724 ;        006C ;  MA      # ( 𝜤 → l ) MATHEMATICAL BOLD ITALIC CAPITAL IOTA → LATIN SMALL LETTER L # →Ι→
+1D75E ;        006C ;  MA      # ( 𝝞 → l ) MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA → LATIN SMALL LETTER L     # →Ι→
+1D798 ;        006C ;  MA      # ( 𝞘 → l ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA → LATIN SMALL LETTER L      # →Ι→
+2C92 ; 006C ;  MA      # ( Ⲓ → l ) COPTIC CAPITAL LETTER IAUDA → LATIN SMALL LETTER L    # →Ӏ→
+0406 ; 006C ;  MA      # ( І → l ) CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I → LATIN SMALL LETTER L        # 
+04C0 ; 006C ;  MA      # ( Ӏ → l ) CYRILLIC LETTER PALOCHKA → LATIN SMALL LETTER L        # 
+05D5 ; 006C ;  MA      # ( ‎ו‎ → l ) HEBREW LETTER VAV → LATIN SMALL LETTER L # 
+05DF ; 006C ;  MA      # ( ‎ן‎ → l ) HEBREW LETTER FINAL NUN → LATIN SMALL LETTER L   # 
+07CA ; 006C ;  MA      # ( ‎ߊ‎ → l ) NKO LETTER A → LATIN SMALL LETTER L      # →∣→→|→
+2D4F ; 006C ;  MA      # ( ⵏ → l ) TIFINAGH LETTER YAN → LATIN SMALL LETTER L    # →Ӏ→
+A4F2 ; 006C ;  MA      # ( ꓲ → l ) LISU LETTER I → LATIN SMALL LETTER L  # →I→
+
+216C ; 004C ;  MA      # ( Ⅼ → L ) ROMAN NUMERAL FIFTY → LATIN CAPITAL LETTER L  # 
+2112 ; 004C ;  MA      # ( ℒ → L ) SCRIPT CAPITAL L → LATIN CAPITAL LETTER L     # 
+1D40B ;        004C ;  MA      # ( 𝐋 → L ) MATHEMATICAL BOLD CAPITAL L → LATIN CAPITAL LETTER L # 
+1D43F ;        004C ;  MA      # ( 𝐿 → L ) MATHEMATICAL ITALIC CAPITAL L → LATIN CAPITAL LETTER L       # 
+1D473 ;        004C ;  MA      # ( 𝑳 → L ) MATHEMATICAL BOLD ITALIC CAPITAL L → LATIN CAPITAL LETTER L  # 
+1D4DB ;        004C ;  MA      # ( 𝓛 → L ) MATHEMATICAL BOLD SCRIPT CAPITAL L → LATIN CAPITAL LETTER L  # 
+1D50F ;        004C ;  MA      # ( 𝔏 → L ) MATHEMATICAL FRAKTUR CAPITAL L → LATIN CAPITAL LETTER L      # 
+1D543 ;        004C ;  MA      # ( 𝕃 → L ) MATHEMATICAL DOUBLE-STRUCK CAPITAL L → LATIN CAPITAL LETTER L        # 
+1D577 ;        004C ;  MA      # ( 𝕷 → L ) MATHEMATICAL BOLD FRAKTUR CAPITAL L → LATIN CAPITAL LETTER L # 
+1D5AB ;        004C ;  MA      # ( 𝖫 → L ) MATHEMATICAL SANS-SERIF CAPITAL L → LATIN CAPITAL LETTER L   # 
+1D5DF ;        004C ;  MA      # ( 𝗟 → L ) MATHEMATICAL SANS-SERIF BOLD CAPITAL L → LATIN CAPITAL LETTER L      # 
+1D613 ;        004C ;  MA      # ( 𝘓 → L ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL L → LATIN CAPITAL LETTER L    # 
+1D647 ;        004C ;  MA      # ( 𝙇 → L ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L → LATIN CAPITAL LETTER L       # 
+1D67B ;        004C ;  MA      # ( 𝙻 → L ) MATHEMATICAL MONOSPACE CAPITAL L → LATIN CAPITAL LETTER L    # 
+2CD0 ; 004C ;  MA      # ( Ⳑ → L ) COPTIC CAPITAL LETTER L-SHAPED HA → LATIN CAPITAL LETTER L    # 
+13DE ; 004C ;  MA      # ( Ꮮ → L ) CHEROKEE LETTER TLE → LATIN CAPITAL LETTER L  # 
+14AA ; 004C ;  MA      # ( ᒪ → L ) CANADIAN SYLLABICS MA → LATIN CAPITAL LETTER L        # 
+A4E1 ; 004C ;  MA      # ( ꓡ → L ) LISU LETTER LA → LATIN CAPITAL LETTER L       # 
+
+0142 ; 006C 0338 ;     MA      # ( ł → l̸ ) LATIN SMALL LETTER L WITH STROKE → LATIN SMALL LETTER L, COMBINING LONG SOLIDUS OVERLAY      # →l̷→
+
+0141 ; 004C 0338 ;     MA      # ( Ł → L̸ ) LATIN CAPITAL LETTER L WITH STROKE → LATIN CAPITAL LETTER L, COMBINING LONG SOLIDUS OVERLAY  # →L̷→
+
+026D ; 006C 0328 ;     MA      # ( ɭ → l̨ ) LATIN SMALL LETTER L WITH RETROFLEX HOOK → LATIN SMALL LETTER L, COMBINING OGONEK    # →l̢→
+
+026B ; 006C 0334 ;     MA      # ( ɫ → l̴ ) LATIN SMALL LETTER L WITH MIDDLE TILDE → LATIN SMALL LETTER L, COMBINING TILDE OVERLAY       # 
+
+0197 ; 006C 0335 ;     MA      # ( Ɨ → l̵ ) LATIN CAPITAL LETTER I WITH STROKE → LATIN SMALL LETTER L, COMBINING SHORT STROKE OVERLAY    # →ƚ→
+019A ; 006C 0335 ;     MA      # ( ƚ → l̵ ) LATIN SMALL LETTER L WITH BAR → LATIN SMALL LETTER L, COMBINING SHORT STROKE OVERLAY # 
+
+0140 ; 006C 00B7 ;     MA      # ( ŀ → l· ) LATIN SMALL LETTER L WITH MIDDLE DOT → LATIN SMALL LETTER L, MIDDLE DOT      # 
+013F ; 006C 00B7 ;     MA      # ( Ŀ → l· ) LATIN CAPITAL LETTER L WITH MIDDLE DOT → LATIN SMALL LETTER L, MIDDLE DOT    # →L·→→ᒪ·→→ᒪᐧ→→ᒷ→→1ᐧ→
+14B7 ; 006C 00B7 ;     MA      # ( ᒷ → l· ) CANADIAN SYLLABICS WEST-CREE MWA → LATIN SMALL LETTER L, MIDDLE DOT # →1ᐧ→
+
+1F102 ;        006C 002C ;     MA      #* ( 🄂 → l, ) DIGIT ONE COMMA → LATIN SMALL LETTER L, COMMA      # →1,→
+
+2488 ; 006C 002E ;     MA      #* ( ⒈ → l. ) DIGIT ONE FULL STOP → LATIN SMALL LETTER L, FULL STOP       # →1.→
+
+05F1 ; 006C 0027 ;     MA      # ( ‎ױ‎ → l' ) HEBREW LIGATURE YIDDISH VAV YOD → LATIN SMALL LETTER L, APOSTROPHE      # →‎וי‎→
+
+2493 ; 006C 0032 002E ;        MA      #* ( ⒓ → l2. ) NUMBER TWELVE FULL STOP → LATIN SMALL LETTER L, DIGIT TWO, FULL STOP       # →12.→
+
+33EB ; 006C 0032 65E5 ;        MA      #* ( ㏫ → l2日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE → LATIN SMALL LETTER L, DIGIT TWO, CJK UNIFIED IDEOGRAPH-65E5        # →12日→
+
+32CB ; 006C 0032 6708 ;        MA      #* ( ㋋ → l2月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER → LATIN SMALL LETTER L, DIGIT TWO, CJK UNIFIED IDEOGRAPH-6708  # →12月→
+
+3364 ; 006C 0032 70B9 ;        MA      #* ( ㍤ → l2点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE → LATIN SMALL LETTER L, DIGIT TWO, CJK UNIFIED IDEOGRAPH-70B9       # →12点→
+
+2494 ; 006C 0033 002E ;        MA      #* ( ⒔ → l3. ) NUMBER THIRTEEN FULL STOP → LATIN SMALL LETTER L, DIGIT THREE, FULL STOP   # →13.→
+
+33EC ; 006C 0033 65E5 ;        MA      #* ( ㏬ → l3日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN → LATIN SMALL LETTER L, DIGIT THREE, CJK UNIFIED IDEOGRAPH-65E5    # →13日→
+
+3365 ; 006C 0033 70B9 ;        MA      #* ( ㍥ → l3点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN → LATIN SMALL LETTER L, DIGIT THREE, CJK UNIFIED IDEOGRAPH-70B9   # →13点→
+
+2495 ; 006C 0034 002E ;        MA      #* ( ⒕ → l4. ) NUMBER FOURTEEN FULL STOP → LATIN SMALL LETTER L, DIGIT FOUR, FULL STOP    # →14.→
+
+33ED ; 006C 0034 65E5 ;        MA      #* ( ㏭ → l4日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN → LATIN SMALL LETTER L, DIGIT FOUR, CJK UNIFIED IDEOGRAPH-65E5     # →14日→
+
+3366 ; 006C 0034 70B9 ;        MA      #* ( ㍦ → l4点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN → LATIN SMALL LETTER L, DIGIT FOUR, CJK UNIFIED IDEOGRAPH-70B9    # →14点→
+
+2496 ; 006C 0035 002E ;        MA      #* ( ⒖ → l5. ) NUMBER FIFTEEN FULL STOP → LATIN SMALL LETTER L, DIGIT FIVE, FULL STOP     # →15.→
+
+33EE ; 006C 0035 65E5 ;        MA      #* ( ㏮ → l5日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN → LATIN SMALL LETTER L, DIGIT FIVE, CJK UNIFIED IDEOGRAPH-65E5      # →15日→
+
+3367 ; 006C 0035 70B9 ;        MA      #* ( ㍧ → l5点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN → LATIN SMALL LETTER L, DIGIT FIVE, CJK UNIFIED IDEOGRAPH-70B9     # →15点→
+
+2497 ; 006C 0036 002E ;        MA      #* ( ⒗ → l6. ) NUMBER SIXTEEN FULL STOP → LATIN SMALL LETTER L, DIGIT SIX, FULL STOP      # →16.→
+
+33EF ; 006C 0036 65E5 ;        MA      #* ( ㏯ → l6日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN → LATIN SMALL LETTER L, DIGIT SIX, CJK UNIFIED IDEOGRAPH-65E5       # →16日→
+
+3368 ; 006C 0036 70B9 ;        MA      #* ( ㍨ → l6点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN → LATIN SMALL LETTER L, DIGIT SIX, CJK UNIFIED IDEOGRAPH-70B9      # →16点→
+
+2498 ; 006C 0037 002E ;        MA      #* ( ⒘ → l7. ) NUMBER SEVENTEEN FULL STOP → LATIN SMALL LETTER L, DIGIT SEVEN, FULL STOP  # →17.→
+
+33F0 ; 006C 0037 65E5 ;        MA      #* ( ㏰ → l7日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN → LATIN SMALL LETTER L, DIGIT SEVEN, CJK UNIFIED IDEOGRAPH-65E5   # →17日→
+
+3369 ; 006C 0037 70B9 ;        MA      #* ( ㍩ → l7点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN → LATIN SMALL LETTER L, DIGIT SEVEN, CJK UNIFIED IDEOGRAPH-70B9  # →17点→
+
+2499 ; 006C 0038 002E ;        MA      #* ( ⒙ → l8. ) NUMBER EIGHTEEN FULL STOP → LATIN SMALL LETTER L, DIGIT EIGHT, FULL STOP   # →18.→
+
+33F1 ; 006C 0038 65E5 ;        MA      #* ( ㏱ → l8日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN → LATIN SMALL LETTER L, DIGIT EIGHT, CJK UNIFIED IDEOGRAPH-65E5    # →18日→
+
+336A ; 006C 0038 70B9 ;        MA      #* ( ㍪ → l8点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN → LATIN SMALL LETTER L, DIGIT EIGHT, CJK UNIFIED IDEOGRAPH-70B9   # →18点→
+
+249A ; 006C 0039 002E ;        MA      #* ( ⒚ → l9. ) NUMBER NINETEEN FULL STOP → LATIN SMALL LETTER L, DIGIT NINE, FULL STOP    # →19.→
+
+33F2 ; 006C 0039 65E5 ;        MA      #* ( ㏲ → l9日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN → LATIN SMALL LETTER L, DIGIT NINE, CJK UNIFIED IDEOGRAPH-65E5     # →19日→
+
+336B ; 006C 0039 70B9 ;        MA      #* ( ㍫ → l9点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN → LATIN SMALL LETTER L, DIGIT NINE, CJK UNIFIED IDEOGRAPH-70B9    # →19点→
+
+01C9 ; 006C 006A ;     MA      # ( lj → lj ) LATIN SMALL LETTER LJ → LATIN SMALL LETTER L, LATIN SMALL LETTER J    # 
+
+01C8 ; 004C 006A ;     MA      # ( Lj → Lj ) LATIN CAPITAL LETTER L WITH SMALL LETTER J → LATIN CAPITAL LETTER L, LATIN SMALL LETTER J     # 
+
+01C7 ; 004C 004A ;     MA      # ( LJ → LJ ) LATIN CAPITAL LETTER LJ → LATIN CAPITAL LETTER L, LATIN CAPITAL LETTER J      # 
+
+2016 ; 006C 006C ;     MA      #* ( ‖ → ll ) DOUBLE VERTICAL LINE → LATIN SMALL LETTER L, LATIN SMALL LETTER L   # →∥→→||→
+2225 ; 006C 006C ;     MA      #* ( ∥ → ll ) PARALLEL TO → LATIN SMALL LETTER L, LATIN SMALL LETTER L    # →||→
+2161 ; 006C 006C ;     MA      # ( Ⅱ → ll ) ROMAN NUMERAL TWO → LATIN SMALL LETTER L, LATIN SMALL LETTER L       # →II→
+01C1 ; 006C 006C ;     MA      # ( ǁ → ll ) LATIN LETTER LATERAL CLICK → LATIN SMALL LETTER L, LATIN SMALL LETTER L       # →‖→→∥→→||→
+05F0 ; 006C 006C ;     MA      # ( ‎װ‎ → ll ) HEBREW LIGATURE YIDDISH DOUBLE VAV → LATIN SMALL LETTER L, LATIN SMALL LETTER L # →‎וו‎→
+
+2492 ; 006C 006C 002E ;        MA      #* ( ⒒ → ll. ) NUMBER ELEVEN FULL STOP → LATIN SMALL LETTER L, LATIN SMALL LETTER L, FULL STOP    # →11.→
+
+2162 ; 006C 006C 006C ;        MA      # ( Ⅲ → lll ) ROMAN NUMERAL THREE → LATIN SMALL LETTER L, LATIN SMALL LETTER L, LATIN SMALL LETTER L      # →III→
+
+33EA ; 006C 006C 65E5 ;        MA      #* ( ㏪ → ll日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN → LATIN SMALL LETTER L, LATIN SMALL LETTER L, CJK UNIFIED IDEOGRAPH-65E5     # →11日→
+
+32CA ; 006C 006C 6708 ;        MA      #* ( ㋊ → ll月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER → LATIN SMALL LETTER L, LATIN SMALL LETTER L, CJK UNIFIED IDEOGRAPH-6708       # →11月→
+
+3363 ; 006C 006C 70B9 ;        MA      #* ( ㍣ → ll点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN → LATIN SMALL LETTER L, LATIN SMALL LETTER L, CJK UNIFIED IDEOGRAPH-70B9    # →11点→
+
+2491 ; 006C 004F 002E ;        MA      #* ( ⒑ → lO. ) NUMBER TEN FULL STOP → LATIN SMALL LETTER L, LATIN CAPITAL LETTER O, FULL STOP     # →10.→
+
+33E9 ; 006C 004F 65E5 ;        MA      #* ( ㏩ → lO日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN → LATIN SMALL LETTER L, LATIN CAPITAL LETTER O, CJK UNIFIED IDEOGRAPH-65E5      # →10日→
+
+32C9 ; 006C 004F 6708 ;        MA      #* ( ㋉ → lO月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER → LATIN SMALL LETTER L, LATIN CAPITAL LETTER O, CJK UNIFIED IDEOGRAPH-6708      # →10月→
+
+3362 ; 006C 004F 70B9 ;        MA      #* ( ㍢ → lO点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN → LATIN SMALL LETTER L, LATIN CAPITAL LETTER O, CJK UNIFIED IDEOGRAPH-70B9     # →10点→
+
+33E0 ; 006C 65E5 ;     MA      #* ( ㏠ → l日 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE → LATIN SMALL LETTER L, CJK UNIFIED IDEOGRAPH-65E5       # →1日→
+
+32C0 ; 006C 6708 ;     MA      #* ( ㋀ → l月 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY → LATIN SMALL LETTER L, CJK UNIFIED IDEOGRAPH-6708       # →1月→
+
+3359 ; 006C 70B9 ;     MA      #* ( ㍙ → l点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE → LATIN SMALL LETTER L, CJK UNIFIED IDEOGRAPH-70B9      # →1点→
+
+2CD1 ; 029F ;  MA      # ( ⳑ → ʟ ) COPTIC SMALL LETTER L-SHAPED HA → LATIN LETTER SMALL CAPITAL L       # 
+
+FF2D ; 004D ;  MA      # ( M → M ) FULLWIDTH LATIN CAPITAL LETTER M → LATIN CAPITAL LETTER M     # →Μ→
+216F ; 004D ;  MA      # ( Ⅿ → M ) ROMAN NUMERAL ONE THOUSAND → LATIN CAPITAL LETTER M   # 
+2133 ; 004D ;  MA      # ( ℳ → M ) SCRIPT CAPITAL M → LATIN CAPITAL LETTER M     # 
+1D40C ;        004D ;  MA      # ( 𝐌 → M ) MATHEMATICAL BOLD CAPITAL M → LATIN CAPITAL LETTER M # 
+1D440 ;        004D ;  MA      # ( 𝑀 → M ) MATHEMATICAL ITALIC CAPITAL M → LATIN CAPITAL LETTER M       # 
+1D474 ;        004D ;  MA      # ( 𝑴 → M ) MATHEMATICAL BOLD ITALIC CAPITAL M → LATIN CAPITAL LETTER M  # 
+1D4DC ;        004D ;  MA      # ( 𝓜 → M ) MATHEMATICAL BOLD SCRIPT CAPITAL M → LATIN CAPITAL LETTER M  # 
+1D510 ;        004D ;  MA      # ( 𝔐 → M ) MATHEMATICAL FRAKTUR CAPITAL M → LATIN CAPITAL LETTER M      # 
+1D544 ;        004D ;  MA      # ( 𝕄 → M ) MATHEMATICAL DOUBLE-STRUCK CAPITAL M → LATIN CAPITAL LETTER M        # 
+1D578 ;        004D ;  MA      # ( 𝕸 → M ) MATHEMATICAL BOLD FRAKTUR CAPITAL M → LATIN CAPITAL LETTER M # 
+1D5AC ;        004D ;  MA      # ( 𝖬 → M ) MATHEMATICAL SANS-SERIF CAPITAL M → LATIN CAPITAL LETTER M   # 
+1D5E0 ;        004D ;  MA      # ( 𝗠 → M ) MATHEMATICAL SANS-SERIF BOLD CAPITAL M → LATIN CAPITAL LETTER M      # 
+1D614 ;        004D ;  MA      # ( 𝘔 → M ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL M → LATIN CAPITAL LETTER M    # 
+1D648 ;        004D ;  MA      # ( 𝙈 → M ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M → LATIN CAPITAL LETTER M       # 
+1D67C ;        004D ;  MA      # ( 𝙼 → M ) MATHEMATICAL MONOSPACE CAPITAL M → LATIN CAPITAL LETTER M    # 
+039C ; 004D ;  MA      # ( Μ → M ) GREEK CAPITAL LETTER MU → LATIN CAPITAL LETTER M       # 
+1D6B3 ;        004D ;  MA      # ( 𝚳 → M ) MATHEMATICAL BOLD CAPITAL MU → LATIN CAPITAL LETTER M        # →Μ→
+1D6ED ;        004D ;  MA      # ( 𝛭 → M ) MATHEMATICAL ITALIC CAPITAL MU → LATIN CAPITAL LETTER M      # →Μ→
+1D727 ;        004D ;  MA      # ( 𝜧 → M ) MATHEMATICAL BOLD ITALIC CAPITAL MU → LATIN CAPITAL LETTER M # →Μ→
+1D761 ;        004D ;  MA      # ( 𝝡 → M ) MATHEMATICAL SANS-SERIF BOLD CAPITAL MU → LATIN CAPITAL LETTER M     # →Μ→
+1D79B ;        004D ;  MA      # ( 𝞛 → M ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU → LATIN CAPITAL LETTER M      # →Μ→
+03FA ; 004D ;  MA      # ( Ϻ → M ) GREEK CAPITAL LETTER SAN → LATIN CAPITAL LETTER M      # 
+2C98 ; 004D ;  MA      # ( Ⲙ → M ) COPTIC CAPITAL LETTER MI → LATIN CAPITAL LETTER M     # 
+041C ; 004D ;  MA      # ( М → M ) CYRILLIC CAPITAL LETTER EM → LATIN CAPITAL LETTER M    # 
+13B7 ; 004D ;  MA      # ( Ꮇ → M ) CHEROKEE LETTER LU → LATIN CAPITAL LETTER M   # 
+15F0 ; 004D ;  MA      # ( ᗰ → M ) CANADIAN SYLLABICS CARRIER GO → LATIN CAPITAL LETTER M        # 
+A4DF ; 004D ;  MA      # ( ꓟ → M ) LISU LETTER MA → LATIN CAPITAL LETTER M       # 
+
+04CD ; 004D 0326 ;     MA      # ( Ӎ → M̦ ) CYRILLIC CAPITAL LETTER EM WITH TAIL → LATIN CAPITAL LETTER M, COMBINING COMMA BELOW # →М̡→
+
+043C ; 1D0D ;  MA      # ( м → ᴍ ) CYRILLIC SMALL LETTER EM → LATIN LETTER SMALL CAPITAL M      # 
+
+04CE ; 1D0D 0326 ;     MA      # ( ӎ → ᴍ̦ ) CYRILLIC SMALL LETTER EM WITH TAIL → LATIN LETTER SMALL CAPITAL M, COMBINING COMMA BELOW   # →м̡→
+
+1D427 ;        006E ;  MA      # ( 𝐧 → n ) MATHEMATICAL BOLD SMALL N → LATIN SMALL LETTER N     # 
+1D45B ;        006E ;  MA      # ( 𝑛 → n ) MATHEMATICAL ITALIC SMALL N → LATIN SMALL LETTER N   # 
+1D48F ;        006E ;  MA      # ( 𝒏 → n ) MATHEMATICAL BOLD ITALIC SMALL N → LATIN SMALL LETTER N      # 
+1D4C3 ;        006E ;  MA      # ( 𝓃 → n ) MATHEMATICAL SCRIPT SMALL N → LATIN SMALL LETTER N   # 
+1D4F7 ;        006E ;  MA      # ( 𝓷 → n ) MATHEMATICAL BOLD SCRIPT SMALL N → LATIN SMALL LETTER N      # 
+1D52B ;        006E ;  MA      # ( 𝔫 → n ) MATHEMATICAL FRAKTUR SMALL N → LATIN SMALL LETTER N  # 
+1D55F ;        006E ;  MA      # ( 𝕟 → n ) MATHEMATICAL DOUBLE-STRUCK SMALL N → LATIN SMALL LETTER N    # 
+1D593 ;        006E ;  MA      # ( 𝖓 → n ) MATHEMATICAL BOLD FRAKTUR SMALL N → LATIN SMALL LETTER N     # 
+1D5C7 ;        006E ;  MA      # ( 𝗇 → n ) MATHEMATICAL SANS-SERIF SMALL N → LATIN SMALL LETTER N       # 
+1D5FB ;        006E ;  MA      # ( 𝗻 → n ) MATHEMATICAL SANS-SERIF BOLD SMALL N → LATIN SMALL LETTER N  # 
+1D62F ;        006E ;  MA      # ( 𝘯 → n ) MATHEMATICAL SANS-SERIF ITALIC SMALL N → LATIN SMALL LETTER N        # 
+1D663 ;        006E ;  MA      # ( 𝙣 → n ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N → LATIN SMALL LETTER N   # 
+1D697 ;        006E ;  MA      # ( 𝚗 → n ) MATHEMATICAL MONOSPACE SMALL N → LATIN SMALL LETTER N        # 
+03C0 ; 006E ;  MA      # ( π → n ) GREEK SMALL LETTER PI → LATIN SMALL LETTER N   # 
+03D6 ; 006E ;  MA      # ( ϖ → n ) GREEK PI SYMBOL → LATIN SMALL LETTER N # →π→
+213C ; 006E ;  MA      # ( ℼ → n ) DOUBLE-STRUCK SMALL PI → LATIN SMALL LETTER N # →π→
+1D6D1 ;        006E ;  MA      # ( 𝛑 → n ) MATHEMATICAL BOLD SMALL PI → LATIN SMALL LETTER N    # →π→
+1D6E1 ;        006E ;  MA      # ( 𝛡 → n ) MATHEMATICAL BOLD PI SYMBOL → LATIN SMALL LETTER N   # →π→
+1D70B ;        006E ;  MA      # ( 𝜋 → n ) MATHEMATICAL ITALIC SMALL PI → LATIN SMALL LETTER N  # →π→
+1D71B ;        006E ;  MA      # ( 𝜛 → n ) MATHEMATICAL ITALIC PI SYMBOL → LATIN SMALL LETTER N # →π→
+1D745 ;        006E ;  MA      # ( 𝝅 → n ) MATHEMATICAL BOLD ITALIC SMALL PI → LATIN SMALL LETTER N     # →π→
+1D755 ;        006E ;  MA      # ( 𝝕 → n ) MATHEMATICAL BOLD ITALIC PI SYMBOL → LATIN SMALL LETTER N    # →π→
+1D77F ;        006E ;  MA      # ( 𝝿 → n ) MATHEMATICAL SANS-SERIF BOLD SMALL PI → LATIN SMALL LETTER N # →π→
+1D78F ;        006E ;  MA      # ( 𝞏 → n ) MATHEMATICAL SANS-SERIF BOLD PI SYMBOL → LATIN SMALL LETTER N        # →π→
+1D7B9 ;        006E ;  MA      # ( 𝞹 → n ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI → LATIN SMALL LETTER N  # →π→
+1D7C9 ;        006E ;  MA      # ( 𝟉 → n ) MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL → LATIN SMALL LETTER N # →π→
+1D28 ; 006E ;  MA      # ( ᴨ → n ) GREEK LETTER SMALL CAPITAL PI → LATIN SMALL LETTER N  # →п→
+043F ; 006E ;  MA      # ( п → n ) CYRILLIC SMALL LETTER PE → LATIN SMALL LETTER N        # 
+0578 ; 006E ;  MA      # ( ո → n ) ARMENIAN SMALL LETTER VO → LATIN SMALL LETTER N        # 
+057C ; 006E ;  MA      # ( ռ → n ) ARMENIAN SMALL LETTER RA → LATIN SMALL LETTER N        # 
+
+FF2E ; 004E ;  MA      # ( N → N ) FULLWIDTH LATIN CAPITAL LETTER N → LATIN CAPITAL LETTER N     # →Ν→
+2115 ; 004E ;  MA      # ( ℕ → N ) DOUBLE-STRUCK CAPITAL N → LATIN CAPITAL LETTER N      # 
+1D40D ;        004E ;  MA      # ( 𝐍 → N ) MATHEMATICAL BOLD CAPITAL N → LATIN CAPITAL LETTER N # 
+1D441 ;        004E ;  MA      # ( 𝑁 → N ) MATHEMATICAL ITALIC CAPITAL N → LATIN CAPITAL LETTER N       # 
+1D475 ;        004E ;  MA      # ( 𝑵 → N ) MATHEMATICAL BOLD ITALIC CAPITAL N → LATIN CAPITAL LETTER N  # 
+1D4A9 ;        004E ;  MA      # ( 𝒩 → N ) MATHEMATICAL SCRIPT CAPITAL N → LATIN CAPITAL LETTER N       # 
+1D4DD ;        004E ;  MA      # ( 𝓝 → N ) MATHEMATICAL BOLD SCRIPT CAPITAL N → LATIN CAPITAL LETTER N  # 
+1D511 ;        004E ;  MA      # ( 𝔑 → N ) MATHEMATICAL FRAKTUR CAPITAL N → LATIN CAPITAL LETTER N      # 
+1D579 ;        004E ;  MA      # ( 𝕹 → N ) MATHEMATICAL BOLD FRAKTUR CAPITAL N → LATIN CAPITAL LETTER N # 
+1D5AD ;        004E ;  MA      # ( 𝖭 → N ) MATHEMATICAL SANS-SERIF CAPITAL N → LATIN CAPITAL LETTER N   # 
+1D5E1 ;        004E ;  MA      # ( 𝗡 → N ) MATHEMATICAL SANS-SERIF BOLD CAPITAL N → LATIN CAPITAL LETTER N      # 
+1D615 ;        004E ;  MA      # ( 𝘕 → N ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL N → LATIN CAPITAL LETTER N    # 
+1D649 ;        004E ;  MA      # ( 𝙉 → N ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N → LATIN CAPITAL LETTER N       # 
+1D67D ;        004E ;  MA      # ( 𝙽 → N ) MATHEMATICAL MONOSPACE CAPITAL N → LATIN CAPITAL LETTER N    # 
+039D ; 004E ;  MA      # ( Ν → N ) GREEK CAPITAL LETTER NU → LATIN CAPITAL LETTER N       # 
+1D6B4 ;        004E ;  MA      # ( 𝚴 → N ) MATHEMATICAL BOLD CAPITAL NU → LATIN CAPITAL LETTER N        # →𝐍→
+1D6EE ;        004E ;  MA      # ( 𝛮 → N ) MATHEMATICAL ITALIC CAPITAL NU → LATIN CAPITAL LETTER N      # →Ν→
+1D728 ;        004E ;  MA      # ( 𝜨 → N ) MATHEMATICAL BOLD ITALIC CAPITAL NU → LATIN CAPITAL LETTER N # →𝑵→
+1D762 ;        004E ;  MA      # ( 𝝢 → N ) MATHEMATICAL SANS-SERIF BOLD CAPITAL NU → LATIN CAPITAL LETTER N     # →Ν→
+1D79C ;        004E ;  MA      # ( 𝞜 → N ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU → LATIN CAPITAL LETTER N      # →Ν→
+2C9A ; 004E ;  MA      # ( Ⲛ → N ) COPTIC CAPITAL LETTER NI → LATIN CAPITAL LETTER N     # 
+A4E0 ; 004E ;  MA      # ( ꓠ → N ) LISU LETTER NA → LATIN CAPITAL LETTER N       # 
+
+0272 ; 0146 ;  MA      # ( ɲ → ņ ) LATIN SMALL LETTER N WITH LEFT HOOK → LATIN SMALL LETTER N WITH CEDILLA       # 
+
+0273 ; 006E 0328 ;     MA      # ( ɳ → n̨ ) LATIN SMALL LETTER N WITH RETROFLEX HOOK → LATIN SMALL LETTER N, COMBINING OGONEK    # →n̢→
+
+019E ; 006E 0329 ;     MA      # ( ƞ → n̩ ) LATIN SMALL LETTER N WITH LONG RIGHT LEG → LATIN SMALL LETTER N, COMBINING VERTICAL LINE BELOW       # 
+03B7 ; 006E 0329 ;     MA      # ( η → n̩ ) GREEK SMALL LETTER ETA → LATIN SMALL LETTER N, COMBINING VERTICAL LINE BELOW # →ƞ→
+1D6C8 ;        006E 0329 ;     MA      # ( 𝛈 → n̩ ) MATHEMATICAL BOLD SMALL ETA → LATIN SMALL LETTER N, COMBINING VERTICAL LINE BELOW  # →η→→ƞ→
+1D702 ;        006E 0329 ;     MA      # ( 𝜂 → n̩ ) MATHEMATICAL ITALIC SMALL ETA → LATIN SMALL LETTER N, COMBINING VERTICAL LINE BELOW        # →η→→ƞ→
+1D73C ;        006E 0329 ;     MA      # ( 𝜼 → n̩ ) MATHEMATICAL BOLD ITALIC SMALL ETA → LATIN SMALL LETTER N, COMBINING VERTICAL LINE BELOW   # →η→→ƞ→
+1D776 ;        006E 0329 ;     MA      # ( 𝝶 → n̩ ) MATHEMATICAL SANS-SERIF BOLD SMALL ETA → LATIN SMALL LETTER N, COMBINING VERTICAL LINE BELOW       # →η→→ƞ→
+1D7B0 ;        006E 0329 ;     MA      # ( 𝞰 → n̩ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA → LATIN SMALL LETTER N, COMBINING VERTICAL LINE BELOW        # →η→→ƞ→
+
+019D ; 004E 0326 ;     MA      # ( Ɲ → N̦ ) LATIN CAPITAL LETTER N WITH LEFT HOOK → LATIN CAPITAL LETTER N, COMBINING COMMA BELOW        # →N̡→
+
+01CC ; 006E 006A ;     MA      # ( nj → nj ) LATIN SMALL LETTER NJ → LATIN SMALL LETTER N, LATIN SMALL LETTER J    # 
+
+01CB ; 004E 006A ;     MA      # ( Nj → Nj ) LATIN CAPITAL LETTER N WITH SMALL LETTER J → LATIN CAPITAL LETTER N, LATIN SMALL LETTER J     # 
+
+01CA ; 004E 004A ;     MA      # ( NJ → NJ ) LATIN CAPITAL LETTER NJ → LATIN CAPITAL LETTER N, LATIN CAPITAL LETTER J      # 
+
+2116 ; 004E 006F ;     MA      #* ( № → No ) NUMERO SIGN → LATIN CAPITAL LETTER N, LATIN SMALL LETTER O  # 
+
+0438 ; 1D0E ;  MA      # ( и → ᴎ ) CYRILLIC SMALL LETTER I → LATIN LETTER SMALL CAPITAL REVERSED N      # 
+
+0C02 ; 006F ;  MA      # ( ం → o ) TELUGU SIGN ANUSVARA → LATIN SMALL LETTER O   # 
+0C82 ; 006F ;  MA      # ( ಂ → o ) KANNADA SIGN ANUSVARA → LATIN SMALL LETTER O  # 
+0D02 ; 006F ;  MA      # ( ം → o ) MALAYALAM SIGN ANUSVARA → LATIN SMALL LETTER O        # 
+0D82 ; 006F ;  MA      # ( ං → o ) SINHALA SIGN ANUSVARAYA → LATIN SMALL LETTER O        # 
+0966 ; 006F ;  MA      # ( ० → o ) DEVANAGARI DIGIT ZERO → LATIN SMALL LETTER O  # 
+0A66 ; 006F ;  MA      # ( ੦ → o ) GURMUKHI DIGIT ZERO → LATIN SMALL LETTER O    # 
+0AE6 ; 006F ;  MA      # ( ૦ → o ) GUJARATI DIGIT ZERO → LATIN SMALL LETTER O    # 
+0BE6 ; 006F ;  MA      # ( ௦ → o ) TAMIL DIGIT ZERO → LATIN SMALL LETTER O       # 
+0C66 ; 006F ;  MA      # ( ౦ → o ) TELUGU DIGIT ZERO → LATIN SMALL LETTER O      # 
+0CE6 ; 006F ;  MA      # ( ೦ → o ) KANNADA DIGIT ZERO → LATIN SMALL LETTER O     # →౦→
+0D66 ; 006F ;  MA      # ( ൦ → o ) MALAYALAM DIGIT ZERO → LATIN SMALL LETTER O   # 
+0E50 ; 006F ;  MA      # ( ๐ → o ) THAI DIGIT ZERO → LATIN SMALL LETTER O        # 
+0ED0 ; 006F ;  MA      # ( ໐ → o ) LAO DIGIT ZERO → LATIN SMALL LETTER O # 
+1040 ; 006F ;  MA      # ( ၀ → o ) MYANMAR DIGIT ZERO → LATIN SMALL LETTER O     # 
+0665 ; 006F ;  MA      # ( ‎٥‎ → o ) ARABIC-INDIC DIGIT FIVE → LATIN SMALL LETTER O   # 
+FF4F ; 006F ;  MA      # ( o → o ) FULLWIDTH LATIN SMALL LETTER O → LATIN SMALL LETTER O # →ο→
+2134 ; 006F ;  MA      # ( ℴ → o ) SCRIPT SMALL O → LATIN SMALL LETTER O # 
+1D428 ;        006F ;  MA      # ( 𝐨 → o ) MATHEMATICAL BOLD SMALL O → LATIN SMALL LETTER O     # 
+1D45C ;        006F ;  MA      # ( 𝑜 → o ) MATHEMATICAL ITALIC SMALL O → LATIN SMALL LETTER O   # 
+1D490 ;        006F ;  MA      # ( 𝒐 → o ) MATHEMATICAL BOLD ITALIC SMALL O → LATIN SMALL LETTER O      # 
+1D4F8 ;        006F ;  MA      # ( 𝓸 → o ) MATHEMATICAL BOLD SCRIPT SMALL O → LATIN SMALL LETTER O      # 
+1D52C ;        006F ;  MA      # ( 𝔬 → o ) MATHEMATICAL FRAKTUR SMALL O → LATIN SMALL LETTER O  # 
+1D560 ;        006F ;  MA      # ( 𝕠 → o ) MATHEMATICAL DOUBLE-STRUCK SMALL O → LATIN SMALL LETTER O    # 
+1D594 ;        006F ;  MA      # ( 𝖔 → o ) MATHEMATICAL BOLD FRAKTUR SMALL O → LATIN SMALL LETTER O     # 
+1D5C8 ;        006F ;  MA      # ( 𝗈 → o ) MATHEMATICAL SANS-SERIF SMALL O → LATIN SMALL LETTER O       # 
+1D5FC ;        006F ;  MA      # ( 𝗼 → o ) MATHEMATICAL SANS-SERIF BOLD SMALL O → LATIN SMALL LETTER O  # 
+1D630 ;        006F ;  MA      # ( 𝘰 → o ) MATHEMATICAL SANS-SERIF ITALIC SMALL O → LATIN SMALL LETTER O        # 
+1D664 ;        006F ;  MA      # ( 𝙤 → o ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O → LATIN SMALL LETTER O   # 
+1D698 ;        006F ;  MA      # ( 𝚘 → o ) MATHEMATICAL MONOSPACE SMALL O → LATIN SMALL LETTER O        # 
+1D0F ; 006F ;  MA      # ( ᴏ → o ) LATIN LETTER SMALL CAPITAL O → LATIN SMALL LETTER O   # 
+1D11 ; 006F ;  MA      # ( ᴑ → o ) LATIN SMALL LETTER SIDEWAYS O → LATIN SMALL LETTER O  # 
+03BF ; 006F ;  MA      # ( ο → o ) GREEK SMALL LETTER OMICRON → LATIN SMALL LETTER O      # 
+1D6D0 ;        006F ;  MA      # ( 𝛐 → o ) MATHEMATICAL BOLD SMALL OMICRON → LATIN SMALL LETTER O       # →ο→
+1D70A ;        006F ;  MA      # ( 𝜊 → o ) MATHEMATICAL ITALIC SMALL OMICRON → LATIN SMALL LETTER O     # →ο→
+1D744 ;        006F ;  MA      # ( 𝝄 → o ) MATHEMATICAL BOLD ITALIC SMALL OMICRON → LATIN SMALL LETTER O        # →ο→
+1D77E ;        006F ;  MA      # ( 𝝾 → o ) MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON → LATIN SMALL LETTER O    # →ο→
+1D7B8 ;        006F ;  MA      # ( 𝞸 → o ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON → LATIN SMALL LETTER O     # →ο→
+03C3 ; 006F ;  MA      # ( σ → o ) GREEK SMALL LETTER SIGMA → LATIN SMALL LETTER O        # 
+1D6D4 ;        006F ;  MA      # ( 𝛔 → o ) MATHEMATICAL BOLD SMALL SIGMA → LATIN SMALL LETTER O # →σ→
+1D70E ;        006F ;  MA      # ( 𝜎 → o ) MATHEMATICAL ITALIC SMALL SIGMA → LATIN SMALL LETTER O       # →σ→
+1D748 ;        006F ;  MA      # ( 𝝈 → o ) MATHEMATICAL BOLD ITALIC SMALL SIGMA → LATIN SMALL LETTER O  # →σ→
+1D782 ;        006F ;  MA      # ( 𝞂 → o ) MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA → LATIN SMALL LETTER O      # →σ→
+1D7BC ;        006F ;  MA      # ( 𝞼 → o ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA → LATIN SMALL LETTER O       # →σ→
+2C9F ; 006F ;  MA      # ( ⲟ → o ) COPTIC SMALL LETTER O → LATIN SMALL LETTER O  # 
+043E ; 006F ;  MA      # ( о → o ) CYRILLIC SMALL LETTER O → LATIN SMALL LETTER O # 
+0585 ; 006F ;  MA      # ( օ → o ) ARMENIAN SMALL LETTER OH → LATIN SMALL LETTER O        # 
+05E1 ; 006F ;  MA      # ( ‎ס‎ → o ) HEBREW LETTER SAMEKH → LATIN SMALL LETTER O      # 
+101D ; 006F ;  MA      # ( ဝ → o ) MYANMAR LETTER WA → LATIN SMALL LETTER O      # 
+
+0030 ; 004F ;  MA      # ( 0 → O ) DIGIT ZERO → LATIN CAPITAL LETTER O     # 
+1D7CE ;        004F ;  MA      # ( 𝟎 → O ) MATHEMATICAL BOLD DIGIT ZERO → LATIN CAPITAL LETTER O        # →0→
+1D7D8 ;        004F ;  MA      # ( 𝟘 → O ) MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO → LATIN CAPITAL LETTER O       # →0→
+1D7E2 ;        004F ;  MA      # ( 𝟢 → O ) MATHEMATICAL SANS-SERIF DIGIT ZERO → LATIN CAPITAL LETTER O  # →0→
+1D7EC ;        004F ;  MA      # ( 𝟬 → O ) MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO → LATIN CAPITAL LETTER O     # →0→
+1D7F6 ;        004F ;  MA      # ( 𝟶 → O ) MATHEMATICAL MONOSPACE DIGIT ZERO → LATIN CAPITAL LETTER O   # →0→
+07C0 ; 004F ;  MA      # ( ‎߀‎ → O ) NKO DIGIT ZERO → LATIN CAPITAL LETTER O  # →0→
+09E6 ; 004F ;  MA      # ( ০ → O ) BENGALI DIGIT ZERO → LATIN CAPITAL LETTER O   # →0→
+0B66 ; 004F ;  MA      # ( ୦ → O ) ORIYA DIGIT ZERO → LATIN CAPITAL LETTER O     # →0→
+3007 ; 004F ;  MA      # ( 〇 → O ) IDEOGRAPHIC NUMBER ZERO → LATIN CAPITAL LETTER O      # 
+FF2F ; 004F ;  MA      # ( O → O ) FULLWIDTH LATIN CAPITAL LETTER O → LATIN CAPITAL LETTER O     # →Ο→
+1D40E ;        004F ;  MA      # ( 𝐎 → O ) MATHEMATICAL BOLD CAPITAL O → LATIN CAPITAL LETTER O # 
+1D442 ;        004F ;  MA      # ( 𝑂 → O ) MATHEMATICAL ITALIC CAPITAL O → LATIN CAPITAL LETTER O       # 
+1D476 ;        004F ;  MA      # ( 𝑶 → O ) MATHEMATICAL BOLD ITALIC CAPITAL O → LATIN CAPITAL LETTER O  # 
+1D4AA ;        004F ;  MA      # ( 𝒪 → O ) MATHEMATICAL SCRIPT CAPITAL O → LATIN CAPITAL LETTER O       # 
+1D4DE ;        004F ;  MA      # ( 𝓞 → O ) MATHEMATICAL BOLD SCRIPT CAPITAL O → LATIN CAPITAL LETTER O  # 
+1D512 ;        004F ;  MA      # ( 𝔒 → O ) MATHEMATICAL FRAKTUR CAPITAL O → LATIN CAPITAL LETTER O      # 
+1D546 ;        004F ;  MA      # ( 𝕆 → O ) MATHEMATICAL DOUBLE-STRUCK CAPITAL O → LATIN CAPITAL LETTER O        # 
+1D57A ;        004F ;  MA      # ( 𝕺 → O ) MATHEMATICAL BOLD FRAKTUR CAPITAL O → LATIN CAPITAL LETTER O # 
+1D5AE ;        004F ;  MA      # ( 𝖮 → O ) MATHEMATICAL SANS-SERIF CAPITAL O → LATIN CAPITAL LETTER O   # 
+1D5E2 ;        004F ;  MA      # ( 𝗢 → O ) MATHEMATICAL SANS-SERIF BOLD CAPITAL O → LATIN CAPITAL LETTER O      # 
+1D616 ;        004F ;  MA      # ( 𝘖 → O ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL O → LATIN CAPITAL LETTER O    # 
+1D64A ;        004F ;  MA      # ( 𝙊 → O ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O → LATIN CAPITAL LETTER O       # 
+1D67E ;        004F ;  MA      # ( 𝙾 → O ) MATHEMATICAL MONOSPACE CAPITAL O → LATIN CAPITAL LETTER O    # 
+039F ; 004F ;  MA      # ( Ο → O ) GREEK CAPITAL LETTER OMICRON → LATIN CAPITAL LETTER O  # 
+1D6B6 ;        004F ;  MA      # ( 𝚶 → O ) MATHEMATICAL BOLD CAPITAL OMICRON → LATIN CAPITAL LETTER O   # →Ο→
+1D6F0 ;        004F ;  MA      # ( 𝛰 → O ) MATHEMATICAL ITALIC CAPITAL OMICRON → LATIN CAPITAL LETTER O # →Ο→
+1D72A ;        004F ;  MA      # ( 𝜪 → O ) MATHEMATICAL BOLD ITALIC CAPITAL OMICRON → LATIN CAPITAL LETTER O    # →Ο→
+1D764 ;        004F ;  MA      # ( 𝝤 → O ) MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON → LATIN CAPITAL LETTER O        # →Ο→
+1D79E ;        004F ;  MA      # ( 𝞞 → O ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON → LATIN CAPITAL LETTER O # →Ο→
+2C9E ; 004F ;  MA      # ( Ⲟ → O ) COPTIC CAPITAL LETTER O → LATIN CAPITAL LETTER O      # 
+041E ; 004F ;  MA      # ( О → O ) CYRILLIC CAPITAL LETTER O → LATIN CAPITAL LETTER O     # 
+0555 ; 004F ;  MA      # ( Օ → O ) ARMENIAN CAPITAL LETTER OH → LATIN CAPITAL LETTER O    # 
+2D54 ; 004F ;  MA      # ( ⵔ → O ) TIFINAGH LETTER YAR → LATIN CAPITAL LETTER O  # 
+0B20 ; 004F ;  MA      # ( ଠ → O ) ORIYA LETTER TTHA → LATIN CAPITAL LETTER O    # →୦→→0→
+0D20 ; 004F ;  MA      # ( ഠ → O ) MALAYALAM LETTER TTHA → LATIN CAPITAL LETTER O        # 
+A4F3 ; 004F ;  MA      # ( ꓳ → O ) LISU LETTER O → LATIN CAPITAL LETTER O        # 
+
+2070 ; 00BA ;  MA      #* ( ⁰ → º ) SUPERSCRIPT ZERO → MASCULINE ORDINAL INDICATOR      # 
+1D52 ; 00BA ;  MA      # ( ᵒ → º ) MODIFIER LETTER SMALL O → MASCULINE ORDINAL INDICATOR        # →⁰→
+
+01D2 ; 014F ;  MA      # ( ǒ → ŏ ) LATIN SMALL LETTER O WITH CARON → LATIN SMALL LETTER O WITH BREVE     # 
+
+01D1 ; 014E ;  MA      # ( Ǒ → Ŏ ) LATIN CAPITAL LETTER O WITH CARON → LATIN CAPITAL LETTER O WITH BREVE # 
+
+0629 ; 00F6 ;  MA      # ( ‎ة‎ → ö ) ARABIC LETTER TEH MARBUTA → LATIN SMALL LETTER O WITH DIAERESIS # 
+FE94 ; 00F6 ;  MA      # ( ‎ﺔ‎ → ö ) ARABIC LETTER TEH MARBUTA FINAL FORM → LATIN SMALL LETTER O WITH DIAERESIS     # →‎ة‎→
+FE93 ; 00F6 ;  MA      # ( ‎ﺓ‎ → ö ) ARABIC LETTER TEH MARBUTA ISOLATED FORM → LATIN SMALL LETTER O WITH DIAERESIS  # →‎ة‎→
+06C3 ; 00F6 ;  MA      # ( ‎ۃ‎ → ö ) ARABIC LETTER TEH MARBUTA GOAL → LATIN SMALL LETTER O WITH DIAERESIS    # 
+
+0150 ; 00D6 ;  MA      # ( Ő → Ö ) LATIN CAPITAL LETTER O WITH DOUBLE ACUTE → LATIN CAPITAL LETTER O WITH DIAERESIS      # 
+
+00F8 ; 006F 0338 ;     MA      # ( ø → o̸ ) LATIN SMALL LETTER O WITH STROKE → LATIN SMALL LETTER O, COMBINING LONG SOLIDUS OVERLAY      # →o̷→
+
+00D8 ; 004F 0338 ;     MA      # ( Ø → O̸ ) LATIN CAPITAL LETTER O WITH STROKE → LATIN CAPITAL LETTER O, COMBINING LONG SOLIDUS OVERLAY  # 
+
+01FE ; 004F 0338 0301 ;        MA      # ( Ǿ → Ó̸ ) LATIN CAPITAL LETTER O WITH STROKE AND ACUTE → LATIN CAPITAL LETTER O, COMBINING LONG SOLIDUS OVERLAY, COMBINING ACUTE ACCENT      # 
+
+0275 ; 006F 0335 ;     MA      # ( ɵ → o̵ ) LATIN SMALL LETTER BARRED O → LATIN SMALL LETTER O, COMBINING SHORT STROKE OVERLAY   # 
+04E9 ; 006F 0335 ;     MA      # ( ө → o̵ ) CYRILLIC SMALL LETTER BARRED O → LATIN SMALL LETTER O, COMBINING SHORT STROKE OVERLAY        # →ɵ→
+0473 ; 006F 0335 ;     MA      # ( ѳ → o̵ ) CYRILLIC SMALL LETTER FITA → LATIN SMALL LETTER O, COMBINING SHORT STROKE OVERLAY    # 
+
+2296 ; 004F 0335 ;     MA      #* ( ⊖ → O̵ ) CIRCLED MINUS → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY     # →Θ→→Ɵ→→O̶→
+229D ; 004F 0335 ;     MA      #* ( ⊝ → O̵ ) CIRCLED DASH → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY      # →⊖→→Θ→→Ɵ→→O̶→
+236C ; 004F 0335 ;     MA      #* ( ⍬ → O̵ ) APL FUNCTIONAL SYMBOL ZILDE → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY       # →θ→→⊖→→Θ→→Ɵ→→O̶→
+019F ; 004F 0335 ;     MA      # ( Ɵ → O̵ ) LATIN CAPITAL LETTER O WITH MIDDLE TILDE → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY    # →O̶→
+03B8 ; 004F 0335 ;     MA      # ( θ → O̵ ) GREEK SMALL LETTER THETA → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY    # →⊖→→Θ→→Ɵ→→O̶→
+03D1 ; 004F 0335 ;     MA      # ( ϑ → O̵ ) GREEK THETA SYMBOL → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY  # →⊖→→Θ→→Ɵ→→O̶→
+1D6C9 ;        004F 0335 ;     MA      # ( 𝛉 → O̵ ) MATHEMATICAL BOLD SMALL THETA → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY     # →θ→→⊖→→Θ→→Ɵ→→O̶→
+1D6DD ;        004F 0335 ;     MA      # ( 𝛝 → O̵ ) MATHEMATICAL BOLD THETA SYMBOL → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY    # →θ→→⊖→→Θ→→Ɵ→→O̶→
+1D703 ;        004F 0335 ;     MA      # ( 𝜃 → O̵ ) MATHEMATICAL ITALIC SMALL THETA → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY   # →θ→→⊖→→Θ→→Ɵ→→O̶→
+1D717 ;        004F 0335 ;     MA      # ( 𝜗 → O̵ ) MATHEMATICAL ITALIC THETA SYMBOL → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY  # →θ→→⊖→→Θ→→Ɵ→→O̶→
+1D73D ;        004F 0335 ;     MA      # ( 𝜽 → O̵ ) MATHEMATICAL BOLD ITALIC SMALL THETA → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY      # →θ→→⊖→→Θ→→Ɵ→→O̶→
+1D751 ;        004F 0335 ;     MA      # ( 𝝑 → O̵ ) MATHEMATICAL BOLD ITALIC THETA SYMBOL → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY     # →θ→→⊖→→Θ→→Ɵ→→O̶→
+1D777 ;        004F 0335 ;     MA      # ( 𝝷 → O̵ ) MATHEMATICAL SANS-SERIF BOLD SMALL THETA → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY  # →θ→→⊖→→Θ→→Ɵ→→O̶→
+1D78B ;        004F 0335 ;     MA      # ( 𝞋 → O̵ ) MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # →θ→→⊖→→Θ→→Ɵ→→O̶→
+1D7B1 ;        004F 0335 ;     MA      # ( 𝞱 → O̵ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY   # →θ→→⊖→→Θ→→Ɵ→→O̶→
+1D7C5 ;        004F 0335 ;     MA      # ( 𝟅 → O̵ ) MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY  # →θ→→⊖→→Θ→→Ɵ→→O̶→
+0398 ; 004F 0335 ;     MA      # ( Θ → O̵ ) GREEK CAPITAL LETTER THETA → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY  # →Ɵ→→O̶→
+03F4 ; 004F 0335 ;     MA      # ( ϴ → O̵ ) GREEK CAPITAL THETA SYMBOL → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY  # →Ɵ→→O̶→
+1D6AF ;        004F 0335 ;     MA      # ( 𝚯 → O̵ ) MATHEMATICAL BOLD CAPITAL THETA → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY   # →Θ→→Ɵ→→O̶→
+1D6B9 ;        004F 0335 ;     MA      # ( 𝚹 → O̵ ) MATHEMATICAL BOLD CAPITAL THETA SYMBOL → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY    # →Θ→→Ɵ→→O̶→
+1D6E9 ;        004F 0335 ;     MA      # ( 𝛩 → O̵ ) MATHEMATICAL ITALIC CAPITAL THETA → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # →Θ→→Ɵ→→O̶→
+1D6F3 ;        004F 0335 ;     MA      # ( 𝛳 → O̵ ) MATHEMATICAL ITALIC CAPITAL THETA SYMBOL → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY  # →Θ→→Ɵ→→O̶→
+1D723 ;        004F 0335 ;     MA      # ( 𝜣 → O̵ ) MATHEMATICAL BOLD ITALIC CAPITAL THETA → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY    # →Θ→→Ɵ→→O̶→
+1D72D ;        004F 0335 ;     MA      # ( 𝜭 → O̵ ) MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY     # →Θ→→Ɵ→→O̶→
+1D75D ;        004F 0335 ;     MA      # ( 𝝝 → O̵ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY        # →Θ→→Ɵ→→O̶→
+1D767 ;        004F 0335 ;     MA      # ( 𝝧 → O̵ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # →Θ→→Ɵ→→O̶→
+1D797 ;        004F 0335 ;     MA      # ( 𝞗 → O̵ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # →Θ→→Ɵ→→O̶→
+1D7A1 ;        004F 0335 ;     MA      # ( 𝞡 → O̵ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY  # →Θ→→Ɵ→→O̶→
+04E8 ; 004F 0335 ;     MA      # ( Ө → O̵ ) CYRILLIC CAPITAL LETTER BARRED O → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY    # →Ɵ→→O̶→
+0472 ; 004F 0335 ;     MA      # ( Ѳ → O̵ ) CYRILLIC CAPITAL LETTER FITA → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY        # →О̵→
+2D31 ; 004F 0335 ;     MA      # ( ⴱ → O̵ ) TIFINAGH LETTER YAB → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY        # →Ɵ→→O̶→
+13BE ; 004F 0335 ;     MA      # ( Ꮎ → O̵ ) CHEROKEE LETTER NA → LATIN CAPITAL LETTER O, COMBINING SHORT STROKE OVERLAY # 
+
+1F101 ;        004F 002C ;     MA      #* ( 🄁 → O, ) DIGIT ZERO COMMA → LATIN CAPITAL LETTER O, COMMA   # →0,→
+
+1F100 ;        004F 002E ;     MA      #* ( 🄀 → O. ) DIGIT ZERO FULL STOP → LATIN CAPITAL LETTER O, FULL STOP   # →0.→
+
+01A1 ; 006F 0027 ;     MA      # ( ơ → o' ) LATIN SMALL LETTER O WITH HORN → LATIN SMALL LETTER O, APOSTROPHE     # →oʼ→
+
+01A0 ; 004F 0027 ;     MA      # ( Ơ → O' ) LATIN CAPITAL LETTER O WITH HORN → LATIN CAPITAL LETTER O, APOSTROPHE # →Oʼ→
+
+0025 ; 00BA 002F 2080 2080 ;   MA      #* ( % → º/₀₀ ) PERCENT SIGN → MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO    # →‰→→⁰/₀₀→
+066A ; 00BA 002F 2080 2080 ;   MA      #* ( ٪ → º/₀₀ ) ARABIC PERCENT SIGN → MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO    # →%→→‰→→⁰/₀₀→
+2030 ; 00BA 002F 2080 2080 ;   MA      #* ( ‰ → º/₀₀ ) PER MILLE SIGN → MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO        # →⁰/₀₀→
+0609 ; 00BA 002F 2080 2080 ;   MA      #* ( ؉ → º/₀₀ ) ARABIC-INDIC PER MILLE SIGN → MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO    # →%→→‰→→⁰/₀₀→
+060A ; 00BA 002F 2080 2080 ;   MA      #* ( ؊ → º/₀₀ ) ARABIC-INDIC PER TEN THOUSAND SIGN → MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO     # →%→→‰→→⁰/₀₀→
+2052 ; 00BA 002F 2080 2080 ;   MA      #* ( ⁒ → º/₀₀ ) COMMERCIAL MINUS SIGN → MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO # →%→→‰→→⁰/₀₀→
+2100 ; 00BA 002F 2080 2080 ;   MA      #* ( ℀ → º/₀₀ ) ACCOUNT OF → MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO    # →%→→‰→→⁰/₀₀→
+2101 ; 00BA 002F 2080 2080 ;   MA      #* ( ℁ → º/₀₀ ) ADDRESSED TO THE SUBJECT → MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO      # →%→→‰→→⁰/₀₀→
+2105 ; 00BA 002F 2080 2080 ;   MA      #* ( ℅ → º/₀₀ ) CARE OF → MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO       # →%→→‰→→⁰/₀₀→
+2106 ; 00BA 002F 2080 2080 ;   MA      #* ( ℆ → º/₀₀ ) CADA UNA → MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO      # →%→→‰→→⁰/₀₀→
+
+2031 ; 00BA 002F 2080 2080 2080 ;      MA      #* ( ‱ → º/₀₀₀ ) PER TEN THOUSAND SIGN → MASCULINE ORDINAL INDICATOR, SOLIDUS, SUBSCRIPT ZERO, SUBSCRIPT ZERO, SUBSCRIPT ZERO      # →⁰/₀₀₀→
+
+0153 ; 006F 0065 ;     MA      # ( œ → oe ) LATIN SMALL LIGATURE OE → LATIN SMALL LETTER O, LATIN SMALL LETTER E  # 
+
+0152 ; 004F 0045 ;     MA      # ( Œ → OE ) LATIN CAPITAL LIGATURE OE → LATIN CAPITAL LETTER O, LATIN CAPITAL LETTER E    # 
+
+0276 ; 006F 1D07 ;     MA      # ( ɶ → oᴇ ) LATIN LETTER SMALL CAPITAL OE → LATIN SMALL LETTER O, LATIN LETTER SMALL CAPITAL E  # 
+
+A74F ; 006F 006F ;     MA      # ( ꝏ → oo ) LATIN SMALL LETTER OO → LATIN SMALL LETTER O, LATIN SMALL LETTER O   # 
+
+A74E ; 004F 004F ;     MA      # ( Ꝏ → OO ) LATIN CAPITAL LETTER OO → LATIN CAPITAL LETTER O, LATIN CAPITAL LETTER O     # 
+
+3358 ; 004F 70B9 ;     MA      #* ( ㍘ → O点 ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO → LATIN CAPITAL LETTER O, CJK UNIFIED IDEOGRAPH-70B9   # →0点→
+
+2184 ; 0254 ;  MA      # ( ↄ → ɔ ) LATIN SMALL LETTER REVERSED C → LATIN SMALL LETTER OPEN O    # 
+1D10 ; 0254 ;  MA      # ( ᴐ → ɔ ) LATIN LETTER SMALL CAPITAL OPEN O → LATIN SMALL LETTER OPEN O        # 
+037B ; 0254 ;  MA      # ( ͻ → ɔ ) GREEK SMALL REVERSED LUNATE SIGMA SYMBOL → LATIN SMALL LETTER OPEN O  # 
+
+2183 ; 0186 ;  MA      # ( Ↄ → Ɔ ) ROMAN NUMERAL REVERSED ONE HUNDRED → LATIN CAPITAL LETTER OPEN O     # 
+03FD ; 0186 ;  MA      # ( Ͻ → Ɔ ) GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL → LATIN CAPITAL LETTER OPEN O      # 
+A4DB ; 0186 ;  MA      # ( ꓛ → Ɔ ) LISU LETTER CHA → LATIN CAPITAL LETTER OPEN O        # 
+
+2374 ; 0070 ;  MA      #* ( ⍴ → p ) APL FUNCTIONAL SYMBOL RHO → LATIN SMALL LETTER P     # →ρ→
+FF50 ; 0070 ;  MA      # ( p → p ) FULLWIDTH LATIN SMALL LETTER P → LATIN SMALL LETTER P # →р→
+1D429 ;        0070 ;  MA      # ( 𝐩 → p ) MATHEMATICAL BOLD SMALL P → LATIN SMALL LETTER P     # 
+1D45D ;        0070 ;  MA      # ( 𝑝 → p ) MATHEMATICAL ITALIC SMALL P → LATIN SMALL LETTER P   # 
+1D491 ;        0070 ;  MA      # ( 𝒑 → p ) MATHEMATICAL BOLD ITALIC SMALL P → LATIN SMALL LETTER P      # 
+1D4C5 ;        0070 ;  MA      # ( 𝓅 → p ) MATHEMATICAL SCRIPT SMALL P → LATIN SMALL LETTER P   # 
+1D4F9 ;        0070 ;  MA      # ( 𝓹 → p ) MATHEMATICAL BOLD SCRIPT SMALL P → LATIN SMALL LETTER P      # 
+1D52D ;        0070 ;  MA      # ( 𝔭 → p ) MATHEMATICAL FRAKTUR SMALL P → LATIN SMALL LETTER P  # 
+1D561 ;        0070 ;  MA      # ( 𝕡 → p ) MATHEMATICAL DOUBLE-STRUCK SMALL P → LATIN SMALL LETTER P    # 
+1D595 ;        0070 ;  MA      # ( 𝖕 → p ) MATHEMATICAL BOLD FRAKTUR SMALL P → LATIN SMALL LETTER P     # 
+1D5C9 ;        0070 ;  MA      # ( 𝗉 → p ) MATHEMATICAL SANS-SERIF SMALL P → LATIN SMALL LETTER P       # 
+1D5FD ;        0070 ;  MA      # ( 𝗽 → p ) MATHEMATICAL SANS-SERIF BOLD SMALL P → LATIN SMALL LETTER P  # 
+1D631 ;        0070 ;  MA      # ( 𝘱 → p ) MATHEMATICAL SANS-SERIF ITALIC SMALL P → LATIN SMALL LETTER P        # 
+1D665 ;        0070 ;  MA      # ( 𝙥 → p ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P → LATIN SMALL LETTER P   # 
+1D699 ;        0070 ;  MA      # ( 𝚙 → p ) MATHEMATICAL MONOSPACE SMALL P → LATIN SMALL LETTER P        # 
+03C1 ; 0070 ;  MA      # ( ρ → p ) GREEK SMALL LETTER RHO → LATIN SMALL LETTER P  # 
+03F1 ; 0070 ;  MA      # ( ϱ → p ) GREEK RHO SYMBOL → LATIN SMALL LETTER P        # →ρ→
+1D6D2 ;        0070 ;  MA      # ( 𝛒 → p ) MATHEMATICAL BOLD SMALL RHO → LATIN SMALL LETTER P   # →ρ→
+1D6E0 ;        0070 ;  MA      # ( 𝛠 → p ) MATHEMATICAL BOLD RHO SYMBOL → LATIN SMALL LETTER P  # →ρ→
+1D70C ;        0070 ;  MA      # ( 𝜌 → p ) MATHEMATICAL ITALIC SMALL RHO → LATIN SMALL LETTER P # →ρ→
+1D71A ;        0070 ;  MA      # ( 𝜚 → p ) MATHEMATICAL ITALIC RHO SYMBOL → LATIN SMALL LETTER P        # →ρ→
+1D746 ;        0070 ;  MA      # ( 𝝆 → p ) MATHEMATICAL BOLD ITALIC SMALL RHO → LATIN SMALL LETTER P    # →ρ→
+1D754 ;        0070 ;  MA      # ( 𝝔 → p ) MATHEMATICAL BOLD ITALIC RHO SYMBOL → LATIN SMALL LETTER P   # →ρ→
+1D780 ;        0070 ;  MA      # ( 𝞀 → p ) MATHEMATICAL SANS-SERIF BOLD SMALL RHO → LATIN SMALL LETTER P        # →ρ→
+1D78E ;        0070 ;  MA      # ( 𝞎 → p ) MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL → LATIN SMALL LETTER P       # →ρ→
+1D7BA ;        0070 ;  MA      # ( 𝞺 → p ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO → LATIN SMALL LETTER P # →ρ→
+1D7C8 ;        0070 ;  MA      # ( 𝟈 → p ) MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL → LATIN SMALL LETTER P        # →ρ→
+2CA3 ; 0070 ;  MA      # ( ⲣ → p ) COPTIC SMALL LETTER RO → LATIN SMALL LETTER P # →ρ→
+0440 ; 0070 ;  MA      # ( р → p ) CYRILLIC SMALL LETTER ER → LATIN SMALL LETTER P        # 
+
+FF30 ; 0050 ;  MA      # ( P → P ) FULLWIDTH LATIN CAPITAL LETTER P → LATIN CAPITAL LETTER P     # →Р→
+2119 ; 0050 ;  MA      # ( ℙ → P ) DOUBLE-STRUCK CAPITAL P → LATIN CAPITAL LETTER P      # 
+1D40F ;        0050 ;  MA      # ( 𝐏 → P ) MATHEMATICAL BOLD CAPITAL P → LATIN CAPITAL LETTER P # 
+1D443 ;        0050 ;  MA      # ( 𝑃 → P ) MATHEMATICAL ITALIC CAPITAL P → LATIN CAPITAL LETTER P       # 
+1D477 ;        0050 ;  MA      # ( 𝑷 → P ) MATHEMATICAL BOLD ITALIC CAPITAL P → LATIN CAPITAL LETTER P  # 
+1D4AB ;        0050 ;  MA      # ( 𝒫 → P ) MATHEMATICAL SCRIPT CAPITAL P → LATIN CAPITAL LETTER P       # 
+1D4DF ;        0050 ;  MA      # ( 𝓟 → P ) MATHEMATICAL BOLD SCRIPT CAPITAL P → LATIN CAPITAL LETTER P  # 
+1D513 ;        0050 ;  MA      # ( 𝔓 → P ) MATHEMATICAL FRAKTUR CAPITAL P → LATIN CAPITAL LETTER P      # 
+1D57B ;        0050 ;  MA      # ( 𝕻 → P ) MATHEMATICAL BOLD FRAKTUR CAPITAL P → LATIN CAPITAL LETTER P # 
+1D5AF ;        0050 ;  MA      # ( 𝖯 → P ) MATHEMATICAL SANS-SERIF CAPITAL P → LATIN CAPITAL LETTER P   # 
+1D5E3 ;        0050 ;  MA      # ( 𝗣 → P ) MATHEMATICAL SANS-SERIF BOLD CAPITAL P → LATIN CAPITAL LETTER P      # 
+1D617 ;        0050 ;  MA      # ( 𝘗 → P ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL P → LATIN CAPITAL LETTER P    # 
+1D64B ;        0050 ;  MA      # ( 𝙋 → P ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P → LATIN CAPITAL LETTER P       # 
+1D67F ;        0050 ;  MA      # ( 𝙿 → P ) MATHEMATICAL MONOSPACE CAPITAL P → LATIN CAPITAL LETTER P    # 
+03A1 ; 0050 ;  MA      # ( Ρ → P ) GREEK CAPITAL LETTER RHO → LATIN CAPITAL LETTER P      # 
+1D6B8 ;        0050 ;  MA      # ( 𝚸 → P ) MATHEMATICAL BOLD CAPITAL RHO → LATIN CAPITAL LETTER P       # →𝐏→
+1D6F2 ;        0050 ;  MA      # ( 𝛲 → P ) MATHEMATICAL ITALIC CAPITAL RHO → LATIN CAPITAL LETTER P     # →𝑃→
+1D72C ;        0050 ;  MA      # ( 𝜬 → P ) MATHEMATICAL BOLD ITALIC CAPITAL RHO → LATIN CAPITAL LETTER P        # →𝑷→
+1D766 ;        0050 ;  MA      # ( 𝝦 → P ) MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO → LATIN CAPITAL LETTER P    # →Ρ→
+1D7A0 ;        0050 ;  MA      # ( 𝞠 → P ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO → LATIN CAPITAL LETTER P     # →Ρ→
+2CA2 ; 0050 ;  MA      # ( Ⲣ → P ) COPTIC CAPITAL LETTER RO → LATIN CAPITAL LETTER P     # 
+0420 ; 0050 ;  MA      # ( Р → P ) CYRILLIC CAPITAL LETTER ER → LATIN CAPITAL LETTER P    # 
+13E2 ; 0050 ;  MA      # ( Ꮲ → P ) CHEROKEE LETTER TLV → LATIN CAPITAL LETTER P  # 
+146D ; 0050 ;  MA      # ( ᑭ → P ) CANADIAN SYLLABICS KI → LATIN CAPITAL LETTER P        # 
+A4D1 ; 0050 ;  MA      # ( ꓑ → P ) LISU LETTER PA → LATIN CAPITAL LETTER P       # 
+
+01A5 ; 0070 0314 ;     MA      # ( ƥ → p̔ ) LATIN SMALL LETTER P WITH HOOK → LATIN SMALL LETTER P, COMBINING REVERSED COMMA ABOVE        # 
+
+1477 ; 0070 00B7 ;     MA      # ( ᑷ → p· ) CANADIAN SYLLABICS WEST-CREE KWI → LATIN SMALL LETTER P, MIDDLE DOT # →pᐧ→
+
+1486 ; 0050 144A ;     MA      # ( ᒆ → Pᑊ ) CANADIAN SYLLABICS SOUTH-SLAVEY KIH → LATIN CAPITAL LETTER P, CANADIAN SYLLABICS WEST-CREE P       # →ᑭᑊ→
+
+1D29 ; 1D18 ;  MA      # ( ᴩ → ᴘ ) GREEK LETTER SMALL CAPITAL RHO → LATIN LETTER SMALL CAPITAL P       # 
+
+03C6 ; 0278 ;  MA      # ( φ → ɸ ) GREEK SMALL LETTER PHI → LATIN SMALL LETTER PHI       # 
+03D5 ; 0278 ;  MA      # ( ϕ → ɸ ) GREEK PHI SYMBOL → LATIN SMALL LETTER PHI     # 
+1D6D7 ;        0278 ;  MA      # ( 𝛗 → ɸ ) MATHEMATICAL BOLD SMALL PHI → LATIN SMALL LETTER PHI        # →φ→
+1D6DF ;        0278 ;  MA      # ( 𝛟 → ɸ ) MATHEMATICAL BOLD PHI SYMBOL → LATIN SMALL LETTER PHI       # →φ→
+1D711 ;        0278 ;  MA      # ( 𝜑 → ɸ ) MATHEMATICAL ITALIC SMALL PHI → LATIN SMALL LETTER PHI      # →φ→
+1D719 ;        0278 ;  MA      # ( 𝜙 → ɸ ) MATHEMATICAL ITALIC PHI SYMBOL → LATIN SMALL LETTER PHI     # →φ→
+1D74B ;        0278 ;  MA      # ( 𝝋 → ɸ ) MATHEMATICAL BOLD ITALIC SMALL PHI → LATIN SMALL LETTER PHI # →φ→
+1D753 ;        0278 ;  MA      # ( 𝝓 → ɸ ) MATHEMATICAL BOLD ITALIC PHI SYMBOL → LATIN SMALL LETTER PHI        # →φ→
+1D785 ;        0278 ;  MA      # ( 𝞅 → ɸ ) MATHEMATICAL SANS-SERIF BOLD SMALL PHI → LATIN SMALL LETTER PHI     # →φ→
+1D78D ;        0278 ;  MA      # ( 𝞍 → ɸ ) MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL → LATIN SMALL LETTER PHI    # →φ→
+1D7BF ;        0278 ;  MA      # ( 𝞿 → ɸ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI → LATIN SMALL LETTER PHI      # →φ→
+1D7C7 ;        0278 ;  MA      # ( 𝟇 → ɸ ) MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL → LATIN SMALL LETTER PHI     # →φ→
+2CAB ; 0278 ;  MA      # ( ⲫ → ɸ ) COPTIC SMALL LETTER FI → LATIN SMALL LETTER PHI      # →ϕ→
+0444 ; 0278 ;  MA      # ( ф → ɸ ) CYRILLIC SMALL LETTER EF → LATIN SMALL LETTER PHI     # 
+
+1D42A ;        0071 ;  MA      # ( 𝐪 → q ) MATHEMATICAL BOLD SMALL Q → LATIN SMALL LETTER Q     # 
+1D45E ;        0071 ;  MA      # ( 𝑞 → q ) MATHEMATICAL ITALIC SMALL Q → LATIN SMALL LETTER Q   # 
+1D492 ;        0071 ;  MA      # ( 𝒒 → q ) MATHEMATICAL BOLD ITALIC SMALL Q → LATIN SMALL LETTER Q      # 
+1D4C6 ;        0071 ;  MA      # ( 𝓆 → q ) MATHEMATICAL SCRIPT SMALL Q → LATIN SMALL LETTER Q   # 
+1D4FA ;        0071 ;  MA      # ( 𝓺 → q ) MATHEMATICAL BOLD SCRIPT SMALL Q → LATIN SMALL LETTER Q      # 
+1D52E ;        0071 ;  MA      # ( 𝔮 → q ) MATHEMATICAL FRAKTUR SMALL Q → LATIN SMALL LETTER Q  # 
+1D562 ;        0071 ;  MA      # ( 𝕢 → q ) MATHEMATICAL DOUBLE-STRUCK SMALL Q → LATIN SMALL LETTER Q    # 
+1D596 ;        0071 ;  MA      # ( 𝖖 → q ) MATHEMATICAL BOLD FRAKTUR SMALL Q → LATIN SMALL LETTER Q     # 
+1D5CA ;        0071 ;  MA      # ( 𝗊 → q ) MATHEMATICAL SANS-SERIF SMALL Q → LATIN SMALL LETTER Q       # 
+1D5FE ;        0071 ;  MA      # ( 𝗾 → q ) MATHEMATICAL SANS-SERIF BOLD SMALL Q → LATIN SMALL LETTER Q  # 
+1D632 ;        0071 ;  MA      # ( 𝘲 → q ) MATHEMATICAL SANS-SERIF ITALIC SMALL Q → LATIN SMALL LETTER Q        # 
+1D666 ;        0071 ;  MA      # ( 𝙦 → q ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q → LATIN SMALL LETTER Q   # 
+1D69A ;        0071 ;  MA      # ( 𝚚 → q ) MATHEMATICAL MONOSPACE SMALL Q → LATIN SMALL LETTER Q        # 
+051B ; 0071 ;  MA      # ( ԛ → q ) CYRILLIC SMALL LETTER QA → LATIN SMALL LETTER Q        # 
+0563 ; 0071 ;  MA      # ( գ → q ) ARMENIAN SMALL LETTER GIM → LATIN SMALL LETTER Q       # 
+0566 ; 0071 ;  MA      # ( զ → q ) ARMENIAN SMALL LETTER ZA → LATIN SMALL LETTER Q        # 
+
+211A ; 0051 ;  MA      # ( ℚ → Q ) DOUBLE-STRUCK CAPITAL Q → LATIN CAPITAL LETTER Q      # 
+1D410 ;        0051 ;  MA      # ( 𝐐 → Q ) MATHEMATICAL BOLD CAPITAL Q → LATIN CAPITAL LETTER Q # 
+1D444 ;        0051 ;  MA      # ( 𝑄 → Q ) MATHEMATICAL ITALIC CAPITAL Q → LATIN CAPITAL LETTER Q       # 
+1D478 ;        0051 ;  MA      # ( 𝑸 → Q ) MATHEMATICAL BOLD ITALIC CAPITAL Q → LATIN CAPITAL LETTER Q  # 
+1D4AC ;        0051 ;  MA      # ( 𝒬 → Q ) MATHEMATICAL SCRIPT CAPITAL Q → LATIN CAPITAL LETTER Q       # 
+1D4E0 ;        0051 ;  MA      # ( 𝓠 → Q ) MATHEMATICAL BOLD SCRIPT CAPITAL Q → LATIN CAPITAL LETTER Q  # 
+1D514 ;        0051 ;  MA      # ( 𝔔 → Q ) MATHEMATICAL FRAKTUR CAPITAL Q → LATIN CAPITAL LETTER Q      # 
+1D57C ;        0051 ;  MA      # ( 𝕼 → Q ) MATHEMATICAL BOLD FRAKTUR CAPITAL Q → LATIN CAPITAL LETTER Q # 
+1D5B0 ;        0051 ;  MA      # ( 𝖰 → Q ) MATHEMATICAL SANS-SERIF CAPITAL Q → LATIN CAPITAL LETTER Q   # 
+1D5E4 ;        0051 ;  MA      # ( 𝗤 → Q ) MATHEMATICAL SANS-SERIF BOLD CAPITAL Q → LATIN CAPITAL LETTER Q      # 
+1D618 ;        0051 ;  MA      # ( 𝘘 → Q ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q → LATIN CAPITAL LETTER Q    # 
+1D64C ;        0051 ;  MA      # ( 𝙌 → Q ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q → LATIN CAPITAL LETTER Q       # 
+1D680 ;        0051 ;  MA      # ( 𝚀 → Q ) MATHEMATICAL MONOSPACE CAPITAL Q → LATIN CAPITAL LETTER Q    # 
+
+02A0 ; 0071 0314 ;     MA      # ( ʠ → q̔ ) LATIN SMALL LETTER Q WITH HOOK → LATIN SMALL LETTER Q, COMBINING REVERSED COMMA ABOVE        # 
+
+1D42B ;        0072 ;  MA      # ( 𝐫 → r ) MATHEMATICAL BOLD SMALL R → LATIN SMALL LETTER R     # 
+1D45F ;        0072 ;  MA      # ( 𝑟 → r ) MATHEMATICAL ITALIC SMALL R → LATIN SMALL LETTER R   # 
+1D493 ;        0072 ;  MA      # ( 𝒓 → r ) MATHEMATICAL BOLD ITALIC SMALL R → LATIN SMALL LETTER R      # 
+1D4C7 ;        0072 ;  MA      # ( 𝓇 → r ) MATHEMATICAL SCRIPT SMALL R → LATIN SMALL LETTER R   # 
+1D4FB ;        0072 ;  MA      # ( 𝓻 → r ) MATHEMATICAL BOLD SCRIPT SMALL R → LATIN SMALL LETTER R      # 
+1D52F ;        0072 ;  MA      # ( 𝔯 → r ) MATHEMATICAL FRAKTUR SMALL R → LATIN SMALL LETTER R  # 
+1D563 ;        0072 ;  MA      # ( 𝕣 → r ) MATHEMATICAL DOUBLE-STRUCK SMALL R → LATIN SMALL LETTER R    # 
+1D597 ;        0072 ;  MA      # ( 𝖗 → r ) MATHEMATICAL BOLD FRAKTUR SMALL R → LATIN SMALL LETTER R     # 
+1D5CB ;        0072 ;  MA      # ( 𝗋 → r ) MATHEMATICAL SANS-SERIF SMALL R → LATIN SMALL LETTER R       # 
+1D5FF ;        0072 ;  MA      # ( 𝗿 → r ) MATHEMATICAL SANS-SERIF BOLD SMALL R → LATIN SMALL LETTER R  # 
+1D633 ;        0072 ;  MA      # ( 𝘳 → r ) MATHEMATICAL SANS-SERIF ITALIC SMALL R → LATIN SMALL LETTER R        # 
+1D667 ;        0072 ;  MA      # ( 𝙧 → r ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R → LATIN SMALL LETTER R   # 
+1D69B ;        0072 ;  MA      # ( 𝚛 → r ) MATHEMATICAL MONOSPACE SMALL R → LATIN SMALL LETTER R        # 
+1D26 ; 0072 ;  MA      # ( ᴦ → r ) GREEK LETTER SMALL CAPITAL GAMMA → LATIN SMALL LETTER R       # →г→
+2C85 ; 0072 ;  MA      # ( ⲅ → r ) COPTIC SMALL LETTER GAMMA → LATIN SMALL LETTER R      # →г→
+0433 ; 0072 ;  MA      # ( г → r ) CYRILLIC SMALL LETTER GHE → LATIN SMALL LETTER R       # 
+
+211B ; 0052 ;  MA      # ( ℛ → R ) SCRIPT CAPITAL R → LATIN CAPITAL LETTER R     # 
+211C ; 0052 ;  MA      # ( ℜ → R ) BLACK-LETTER CAPITAL R → LATIN CAPITAL LETTER R       # 
+211D ; 0052 ;  MA      # ( ℝ → R ) DOUBLE-STRUCK CAPITAL R → LATIN CAPITAL LETTER R      # 
+1D411 ;        0052 ;  MA      # ( 𝐑 → R ) MATHEMATICAL BOLD CAPITAL R → LATIN CAPITAL LETTER R # 
+1D445 ;        0052 ;  MA      # ( 𝑅 → R ) MATHEMATICAL ITALIC CAPITAL R → LATIN CAPITAL LETTER R       # 
+1D479 ;        0052 ;  MA      # ( 𝑹 → R ) MATHEMATICAL BOLD ITALIC CAPITAL R → LATIN CAPITAL LETTER R  # 
+1D4E1 ;        0052 ;  MA      # ( 𝓡 → R ) MATHEMATICAL BOLD SCRIPT CAPITAL R → LATIN CAPITAL LETTER R  # 
+1D57D ;        0052 ;  MA      # ( 𝕽 → R ) MATHEMATICAL BOLD FRAKTUR CAPITAL R → LATIN CAPITAL LETTER R # 
+1D5B1 ;        0052 ;  MA      # ( 𝖱 → R ) MATHEMATICAL SANS-SERIF CAPITAL R → LATIN CAPITAL LETTER R   # 
+1D5E5 ;        0052 ;  MA      # ( 𝗥 → R ) MATHEMATICAL SANS-SERIF BOLD CAPITAL R → LATIN CAPITAL LETTER R      # 
+1D619 ;        0052 ;  MA      # ( 𝘙 → R ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL R → LATIN CAPITAL LETTER R    # 
+1D64D ;        0052 ;  MA      # ( 𝙍 → R ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R → LATIN CAPITAL LETTER R       # 
+1D681 ;        0052 ;  MA      # ( 𝚁 → R ) MATHEMATICAL MONOSPACE CAPITAL R → LATIN CAPITAL LETTER R    # 
+01A6 ; 0052 ;  MA      # ( Ʀ → R ) LATIN LETTER YR → LATIN CAPITAL LETTER R       # 
+13A1 ; 0052 ;  MA      # ( Ꭱ → R ) CHEROKEE LETTER E → LATIN CAPITAL LETTER R    # 
+13D2 ; 0052 ;  MA      # ( Ꮢ → R ) CHEROKEE LETTER SV → LATIN CAPITAL LETTER R   # →Ꭱ→
+1587 ; 0052 ;  MA      # ( ᖇ → R ) CANADIAN SYLLABICS TLHI → LATIN CAPITAL LETTER R      # 
+A4E3 ; 0052 ;  MA      # ( ꓣ → R ) LISU LETTER ZHA → LATIN CAPITAL LETTER R      # 
+
+027D ; 0072 0328 ;     MA      # ( ɽ → r̨ ) LATIN SMALL LETTER R WITH TAIL → LATIN SMALL LETTER R, COMBINING OGONEK      # 
+
+027C ; 0072 0329 ;     MA      # ( ɼ → r̩ ) LATIN SMALL LETTER R WITH LONG LEG → LATIN SMALL LETTER R, COMBINING VERTICAL LINE BELOW     # 
+
+0493 ; 0072 0335 ;     MA      # ( ғ → r̵ ) CYRILLIC SMALL LETTER GHE WITH STROKE → LATIN SMALL LETTER R, COMBINING SHORT STROKE OVERLAY # →г̵→
+
+006D ; 0072 006E ;     MA      # ( m → rn ) LATIN SMALL LETTER M → LATIN SMALL LETTER R, LATIN SMALL LETTER N      # 
+217F ; 0072 006E ;     MA      # ( ⅿ → rn ) SMALL ROMAN NUMERAL ONE THOUSAND → LATIN SMALL LETTER R, LATIN SMALL LETTER N        # →m→
+1D426 ;        0072 006E ;     MA      # ( 𝐦 → rn ) MATHEMATICAL BOLD SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N      # →m→
+1D45A ;        0072 006E ;     MA      # ( 𝑚 → rn ) MATHEMATICAL ITALIC SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N    # →m→
+1D48E ;        0072 006E ;     MA      # ( 𝒎 → rn ) MATHEMATICAL BOLD ITALIC SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N       # →m→
+1D4C2 ;        0072 006E ;     MA      # ( 𝓂 → rn ) MATHEMATICAL SCRIPT SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N    # →m→
+1D4F6 ;        0072 006E ;     MA      # ( 𝓶 → rn ) MATHEMATICAL BOLD SCRIPT SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N       # →m→
+1D52A ;        0072 006E ;     MA      # ( 𝔪 → rn ) MATHEMATICAL FRAKTUR SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N   # →m→
+1D55E ;        0072 006E ;     MA      # ( 𝕞 → rn ) MATHEMATICAL DOUBLE-STRUCK SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N     # →m→
+1D592 ;        0072 006E ;     MA      # ( 𝖒 → rn ) MATHEMATICAL BOLD FRAKTUR SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N      # →m→
+1D5C6 ;        0072 006E ;     MA      # ( 𝗆 → rn ) MATHEMATICAL SANS-SERIF SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N        # →m→
+1D5FA ;        0072 006E ;     MA      # ( 𝗺 → rn ) MATHEMATICAL SANS-SERIF BOLD SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N   # →m→
+1D62E ;        0072 006E ;     MA      # ( 𝘮 → rn ) MATHEMATICAL SANS-SERIF ITALIC SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N # →m→
+1D662 ;        0072 006E ;     MA      # ( 𝙢 → rn ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N    # →m→
+1D696 ;        0072 006E ;     MA      # ( 𝚖 → rn ) MATHEMATICAL MONOSPACE SMALL M → LATIN SMALL LETTER R, LATIN SMALL LETTER N # →m→
+028D ; 0072 006E ;     MA      # ( ʍ → rn ) LATIN SMALL LETTER TURNED W → LATIN SMALL LETTER R, LATIN SMALL LETTER N      # →m→
+
+0271 ; 0072 006E 0326 ;        MA      # ( ɱ → rn̦ ) LATIN SMALL LETTER M WITH HOOK → LATIN SMALL LETTER R, LATIN SMALL LETTER N, COMBINING COMMA BELOW  # →m̡→
+
+20A8 ; 0052 0073 ;     MA      #* ( ₨ → Rs ) RUPEE SIGN → LATIN CAPITAL LETTER R, LATIN SMALL LETTER S   # 
+
+0491 ; 0072 144A ;     MA      # ( ґ → rᑊ ) CYRILLIC SMALL LETTER GHE WITH UPTURN → LATIN SMALL LETTER R, CANADIAN SYLLABICS WEST-CREE P        # →гˈ→
+
+044F ; 1D19 ;  MA      # ( я → ᴙ ) CYRILLIC SMALL LETTER YA → LATIN LETTER SMALL CAPITAL REVERSED R     # 
+
+A4E4 ; 1D1A ;  MA      # ( ꓤ → ᴚ ) LISU LETTER ZA → LATIN LETTER SMALL CAPITAL TURNED R        # 
+
+2129 ; 027F ;  MA      #* ( ℩ → ɿ ) TURNED GREEK SMALL LETTER IOTA → LATIN SMALL LETTER REVERSED R WITH FISHHOOK        # 
+
+FF53 ; 0073 ;  MA      # ( s → s ) FULLWIDTH LATIN SMALL LETTER S → LATIN SMALL LETTER S # →ѕ→
+1D42C ;        0073 ;  MA      # ( 𝐬 → s ) MATHEMATICAL BOLD SMALL S → LATIN SMALL LETTER S     # 
+1D460 ;        0073 ;  MA      # ( 𝑠 → s ) MATHEMATICAL ITALIC SMALL S → LATIN SMALL LETTER S   # 
+1D494 ;        0073 ;  MA      # ( 𝒔 → s ) MATHEMATICAL BOLD ITALIC SMALL S → LATIN SMALL LETTER S      # 
+1D4C8 ;        0073 ;  MA      # ( 𝓈 → s ) MATHEMATICAL SCRIPT SMALL S → LATIN SMALL LETTER S   # 
+1D4FC ;        0073 ;  MA      # ( 𝓼 → s ) MATHEMATICAL BOLD SCRIPT SMALL S → LATIN SMALL LETTER S      # 
+1D530 ;        0073 ;  MA      # ( 𝔰 → s ) MATHEMATICAL FRAKTUR SMALL S → LATIN SMALL LETTER S  # 
+1D564 ;        0073 ;  MA      # ( 𝕤 → s ) MATHEMATICAL DOUBLE-STRUCK SMALL S → LATIN SMALL LETTER S    # 
+1D598 ;        0073 ;  MA      # ( 𝖘 → s ) MATHEMATICAL BOLD FRAKTUR SMALL S → LATIN SMALL LETTER S     # 
+1D5CC ;        0073 ;  MA      # ( 𝗌 → s ) MATHEMATICAL SANS-SERIF SMALL S → LATIN SMALL LETTER S       # 
+1D600 ;        0073 ;  MA      # ( 𝘀 → s ) MATHEMATICAL SANS-SERIF BOLD SMALL S → LATIN SMALL LETTER S  # 
+1D634 ;        0073 ;  MA      # ( 𝘴 → s ) MATHEMATICAL SANS-SERIF ITALIC SMALL S → LATIN SMALL LETTER S        # 
+1D668 ;        0073 ;  MA      # ( 𝙨 → s ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S → LATIN SMALL LETTER S   # 
+1D69C ;        0073 ;  MA      # ( 𝚜 → s ) MATHEMATICAL MONOSPACE SMALL S → LATIN SMALL LETTER S        # 
+A731 ; 0073 ;  MA      # ( ꜱ → s ) LATIN LETTER SMALL CAPITAL S → LATIN SMALL LETTER S   # 
+01BD ; 0073 ;  MA      # ( ƽ → s ) LATIN SMALL LETTER TONE FIVE → LATIN SMALL LETTER S    # 
+0455 ; 0073 ;  MA      # ( ѕ → s ) CYRILLIC SMALL LETTER DZE → LATIN SMALL LETTER S       # 
+
+FF33 ; 0053 ;  MA      # ( S → S ) FULLWIDTH LATIN CAPITAL LETTER S → LATIN CAPITAL LETTER S     # →Ѕ→
+1D412 ;        0053 ;  MA      # ( 𝐒 → S ) MATHEMATICAL BOLD CAPITAL S → LATIN CAPITAL LETTER S # 
+1D446 ;        0053 ;  MA      # ( 𝑆 → S ) MATHEMATICAL ITALIC CAPITAL S → LATIN CAPITAL LETTER S       # 
+1D47A ;        0053 ;  MA      # ( 𝑺 → S ) MATHEMATICAL BOLD ITALIC CAPITAL S → LATIN CAPITAL LETTER S  # 
+1D4AE ;        0053 ;  MA      # ( 𝒮 → S ) MATHEMATICAL SCRIPT CAPITAL S → LATIN CAPITAL LETTER S       # 
+1D4E2 ;        0053 ;  MA      # ( 𝓢 → S ) MATHEMATICAL BOLD SCRIPT CAPITAL S → LATIN CAPITAL LETTER S  # 
+1D516 ;        0053 ;  MA      # ( 𝔖 → S ) MATHEMATICAL FRAKTUR CAPITAL S → LATIN CAPITAL LETTER S      # 
+1D54A ;        0053 ;  MA      # ( 𝕊 → S ) MATHEMATICAL DOUBLE-STRUCK CAPITAL S → LATIN CAPITAL LETTER S        # 
+1D57E ;        0053 ;  MA      # ( 𝕾 → S ) MATHEMATICAL BOLD FRAKTUR CAPITAL S → LATIN CAPITAL LETTER S # 
+1D5B2 ;        0053 ;  MA      # ( 𝖲 → S ) MATHEMATICAL SANS-SERIF CAPITAL S → LATIN CAPITAL LETTER S   # 
+1D5E6 ;        0053 ;  MA      # ( 𝗦 → S ) MATHEMATICAL SANS-SERIF BOLD CAPITAL S → LATIN CAPITAL LETTER S      # 
+1D61A ;        0053 ;  MA      # ( 𝘚 → S ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL S → LATIN CAPITAL LETTER S    # 
+1D64E ;        0053 ;  MA      # ( 𝙎 → S ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S → LATIN CAPITAL LETTER S       # 
+1D682 ;        0053 ;  MA      # ( 𝚂 → S ) MATHEMATICAL MONOSPACE CAPITAL S → LATIN CAPITAL LETTER S    # 
+0405 ; 0053 ;  MA      # ( Ѕ → S ) CYRILLIC CAPITAL LETTER DZE → LATIN CAPITAL LETTER S   # 
+054F ; 0053 ;  MA      # ( Տ → S ) ARMENIAN CAPITAL LETTER TIWN → LATIN CAPITAL LETTER S  # 
+13D5 ; 0053 ;  MA      # ( Ꮥ → S ) CHEROKEE LETTER DE → LATIN CAPITAL LETTER S   # →Ꮪ→
+13DA ; 0053 ;  MA      # ( Ꮪ → S ) CHEROKEE LETTER DU → LATIN CAPITAL LETTER S   # 
+A4E2 ; 0053 ;  MA      # ( ꓢ → S ) LISU LETTER SA → LATIN CAPITAL LETTER S       # 
+
+0282 ; 0073 0328 ;     MA      # ( ʂ → s̨ ) LATIN SMALL LETTER S WITH HOOK → LATIN SMALL LETTER S, COMBINING OGONEK      # 
+
+03B2 ; 00DF ;  MA      # ( β → ß ) GREEK SMALL LETTER BETA → LATIN SMALL LETTER SHARP S  # 
+03D0 ; 00DF ;  MA      # ( ϐ → ß ) GREEK BETA SYMBOL → LATIN SMALL LETTER SHARP S        # →β→
+1D6C3 ;        00DF ;  MA      # ( 𝛃 → ß ) MATHEMATICAL BOLD SMALL BETA → LATIN SMALL LETTER SHARP S   # →β→
+1D6FD ;        00DF ;  MA      # ( 𝛽 → ß ) MATHEMATICAL ITALIC SMALL BETA → LATIN SMALL LETTER SHARP S # →β→
+1D737 ;        00DF ;  MA      # ( 𝜷 → ß ) MATHEMATICAL BOLD ITALIC SMALL BETA → LATIN SMALL LETTER SHARP S    # →β→
+1D771 ;        00DF ;  MA      # ( 𝝱 → ß ) MATHEMATICAL SANS-SERIF BOLD SMALL BETA → LATIN SMALL LETTER SHARP S        # →β→
+1D7AB ;        00DF ;  MA      # ( 𝞫 → ß ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA → LATIN SMALL LETTER SHARP S # →β→
+
+FB06 ; 0073 0074 ;     MA      # ( st → st ) LATIN SMALL LIGATURE ST → LATIN SMALL LETTER S, LATIN SMALL LETTER T # 
+
+222B ; 0283 ;  MA      #* ( ∫ → ʃ ) INTEGRAL → LATIN SMALL LETTER ESH   # 
+
+2211 ; 01A9 ;  MA      #* ( ∑ → Ʃ ) N-ARY SUMMATION → LATIN CAPITAL LETTER ESH  # 
+2140 ; 01A9 ;  MA      #* ( ⅀ → Ʃ ) DOUBLE-STRUCK N-ARY SUMMATION → LATIN CAPITAL LETTER ESH    # →∑→
+03A3 ; 01A9 ;  MA      # ( Σ → Ʃ ) GREEK CAPITAL LETTER SIGMA → LATIN CAPITAL LETTER ESH # 
+1D6BA ;        01A9 ;  MA      # ( 𝚺 → Ʃ ) MATHEMATICAL BOLD CAPITAL SIGMA → LATIN CAPITAL LETTER ESH  # →Σ→
+1D6F4 ;        01A9 ;  MA      # ( 𝛴 → Ʃ ) MATHEMATICAL ITALIC CAPITAL SIGMA → LATIN CAPITAL LETTER ESH        # →Σ→
+1D72E ;        01A9 ;  MA      # ( 𝜮 → Ʃ ) MATHEMATICAL BOLD ITALIC CAPITAL SIGMA → LATIN CAPITAL LETTER ESH   # →Σ→
+1D768 ;        01A9 ;  MA      # ( 𝝨 → Ʃ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA → LATIN CAPITAL LETTER ESH       # →Σ→
+1D7A2 ;        01A9 ;  MA      # ( 𝞢 → Ʃ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA → LATIN CAPITAL LETTER ESH        # →Σ→
+2D49 ; 01A9 ;  MA      # ( ⵉ → Ʃ ) TIFINAGH LETTER YI → LATIN CAPITAL LETTER ESH        # 
+
+222C ; 0283 0283 ;     MA      #* ( ∬ → ʃʃ ) DOUBLE INTEGRAL → LATIN SMALL LETTER ESH, LATIN SMALL LETTER ESH  # →∫∫→
+
+222D ; 0283 0283 0283 ;        MA      #* ( ∭ → ʃʃʃ ) TRIPLE INTEGRAL → LATIN SMALL LETTER ESH, LATIN SMALL LETTER ESH, LATIN SMALL LETTER ESH        # →∫∫∫→
+
+2A0C ; 0283 0283 0283 0283 ;   MA      #* ( ⨌ → ʃʃʃʃ ) QUADRUPLE INTEGRAL OPERATOR → LATIN SMALL LETTER ESH, LATIN SMALL LETTER ESH, LATIN SMALL LETTER ESH, LATIN SMALL LETTER ESH  # →∫∫∫∫→
+
+1D42D ;        0074 ;  MA      # ( 𝐭 → t ) MATHEMATICAL BOLD SMALL T → LATIN SMALL LETTER T     # 
+1D461 ;        0074 ;  MA      # ( 𝑡 → t ) MATHEMATICAL ITALIC SMALL T → LATIN SMALL LETTER T   # 
+1D495 ;        0074 ;  MA      # ( 𝒕 → t ) MATHEMATICAL BOLD ITALIC SMALL T → LATIN SMALL LETTER T      # 
+1D4C9 ;        0074 ;  MA      # ( 𝓉 → t ) MATHEMATICAL SCRIPT SMALL T → LATIN SMALL LETTER T   # 
+1D4FD ;        0074 ;  MA      # ( 𝓽 → t ) MATHEMATICAL BOLD SCRIPT SMALL T → LATIN SMALL LETTER T      # 
+1D531 ;        0074 ;  MA      # ( 𝔱 → t ) MATHEMATICAL FRAKTUR SMALL T → LATIN SMALL LETTER T  # 
+1D565 ;        0074 ;  MA      # ( 𝕥 → t ) MATHEMATICAL DOUBLE-STRUCK SMALL T → LATIN SMALL LETTER T    # 
+1D599 ;        0074 ;  MA      # ( 𝖙 → t ) MATHEMATICAL BOLD FRAKTUR SMALL T → LATIN SMALL LETTER T     # 
+1D5CD ;        0074 ;  MA      # ( 𝗍 → t ) MATHEMATICAL SANS-SERIF SMALL T → LATIN SMALL LETTER T       # 
+1D601 ;        0074 ;  MA      # ( 𝘁 → t ) MATHEMATICAL SANS-SERIF BOLD SMALL T → LATIN SMALL LETTER T  # 
+1D635 ;        0074 ;  MA      # ( 𝘵 → t ) MATHEMATICAL SANS-SERIF ITALIC SMALL T → LATIN SMALL LETTER T        # 
+1D669 ;        0074 ;  MA      # ( 𝙩 → t ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T → LATIN SMALL LETTER T   # 
+1D69D ;        0074 ;  MA      # ( 𝚝 → t ) MATHEMATICAL MONOSPACE SMALL T → LATIN SMALL LETTER T        # 
+1D1B ; 0074 ;  MA      # ( ᴛ → t ) LATIN LETTER SMALL CAPITAL T → LATIN SMALL LETTER T   # →т→→τ→
+03C4 ; 0074 ;  MA      # ( τ → t ) GREEK SMALL LETTER TAU → LATIN SMALL LETTER T  # 
+1D6D5 ;        0074 ;  MA      # ( 𝛕 → t ) MATHEMATICAL BOLD SMALL TAU → LATIN SMALL LETTER T   # →τ→
+1D70F ;        0074 ;  MA      # ( 𝜏 → t ) MATHEMATICAL ITALIC SMALL TAU → LATIN SMALL LETTER T # →τ→
+1D749 ;        0074 ;  MA      # ( 𝝉 → t ) MATHEMATICAL BOLD ITALIC SMALL TAU → LATIN SMALL LETTER T    # →τ→
+1D783 ;        0074 ;  MA      # ( 𝞃 → t ) MATHEMATICAL SANS-SERIF BOLD SMALL TAU → LATIN SMALL LETTER T        # →τ→
+1D7BD ;        0074 ;  MA      # ( 𝞽 → t ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU → LATIN SMALL LETTER T # →τ→
+0442 ; 0074 ;  MA      # ( т → t ) CYRILLIC SMALL LETTER TE → LATIN SMALL LETTER T        # →τ→
+
+27D9 ; 0054 ;  MA      #* ( ⟙ → T ) LARGE DOWN TACK → LATIN CAPITAL LETTER T     # 
+FF34 ; 0054 ;  MA      # ( T → T ) FULLWIDTH LATIN CAPITAL LETTER T → LATIN CAPITAL LETTER T     # →Т→
+1D413 ;        0054 ;  MA      # ( 𝐓 → T ) MATHEMATICAL BOLD CAPITAL T → LATIN CAPITAL LETTER T # 
+1D447 ;        0054 ;  MA      # ( 𝑇 → T ) MATHEMATICAL ITALIC CAPITAL T → LATIN CAPITAL LETTER T       # 
+1D47B ;        0054 ;  MA      # ( 𝑻 → T ) MATHEMATICAL BOLD ITALIC CAPITAL T → LATIN CAPITAL LETTER T  # 
+1D4AF ;        0054 ;  MA      # ( 𝒯 → T ) MATHEMATICAL SCRIPT CAPITAL T → LATIN CAPITAL LETTER T       # 
+1D4E3 ;        0054 ;  MA      # ( 𝓣 → T ) MATHEMATICAL BOLD SCRIPT CAPITAL T → LATIN CAPITAL LETTER T  # 
+1D517 ;        0054 ;  MA      # ( 𝔗 → T ) MATHEMATICAL FRAKTUR CAPITAL T → LATIN CAPITAL LETTER T      # 
+1D54B ;        0054 ;  MA      # ( 𝕋 → T ) MATHEMATICAL DOUBLE-STRUCK CAPITAL T → LATIN CAPITAL LETTER T        # 
+1D57F ;        0054 ;  MA      # ( 𝕿 → T ) MATHEMATICAL BOLD FRAKTUR CAPITAL T → LATIN CAPITAL LETTER T # 
+1D5B3 ;        0054 ;  MA      # ( 𝖳 → T ) MATHEMATICAL SANS-SERIF CAPITAL T → LATIN CAPITAL LETTER T   # 
+1D5E7 ;        0054 ;  MA      # ( 𝗧 → T ) MATHEMATICAL SANS-SERIF BOLD CAPITAL T → LATIN CAPITAL LETTER T      # 
+1D61B ;        0054 ;  MA      # ( 𝘛 → T ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL T → LATIN CAPITAL LETTER T    # 
+1D64F ;        0054 ;  MA      # ( 𝙏 → T ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T → LATIN CAPITAL LETTER T       # 
+1D683 ;        0054 ;  MA      # ( 𝚃 → T ) MATHEMATICAL MONOSPACE CAPITAL T → LATIN CAPITAL LETTER T    # 
+03A4 ; 0054 ;  MA      # ( Τ → T ) GREEK CAPITAL LETTER TAU → LATIN CAPITAL LETTER T      # 
+1D6BB ;        0054 ;  MA      # ( 𝚻 → T ) MATHEMATICAL BOLD CAPITAL TAU → LATIN CAPITAL LETTER T       # →𝐓→
+1D6F5 ;        0054 ;  MA      # ( 𝛵 → T ) MATHEMATICAL ITALIC CAPITAL TAU → LATIN CAPITAL LETTER T     # →𝑇→
+1D72F ;        0054 ;  MA      # ( 𝜯 → T ) MATHEMATICAL BOLD ITALIC CAPITAL TAU → LATIN CAPITAL LETTER T        # →𝑻→
+1D769 ;        0054 ;  MA      # ( 𝝩 → T ) MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU → LATIN CAPITAL LETTER T    # →Τ→
+1D7A3 ;        0054 ;  MA      # ( 𝞣 → T ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU → LATIN CAPITAL LETTER T     # →Τ→
+2CA6 ; 0054 ;  MA      # ( Ⲧ → T ) COPTIC CAPITAL LETTER TAU → LATIN CAPITAL LETTER T    # 
+0422 ; 0054 ;  MA      # ( Т → T ) CYRILLIC CAPITAL LETTER TE → LATIN CAPITAL LETTER T    # 
+13A2 ; 0054 ;  MA      # ( Ꭲ → T ) CHEROKEE LETTER I → LATIN CAPITAL LETTER T    # 
+A4D4 ; 0054 ;  MA      # ( ꓔ → T ) LISU LETTER TA → LATIN CAPITAL LETTER T       # 
+
+01AD ; 0074 0314 ;     MA      # ( ƭ → t̔ ) LATIN SMALL LETTER T WITH HOOK → LATIN SMALL LETTER T, COMBINING REVERSED COMMA ABOVE        # 
+
+021B ; 0163 ;  MA      # ( ț → ţ ) LATIN SMALL LETTER T WITH COMMA BELOW → LATIN SMALL LETTER T WITH CEDILLA     # 
+01AB ; 0163 ;  MA      # ( ƫ → ţ ) LATIN SMALL LETTER T WITH PALATAL HOOK → LATIN SMALL LETTER T WITH CEDILLA    # 
+
+021A ; 0162 ;  MA      # ( Ț → Ţ ) LATIN CAPITAL LETTER T WITH COMMA BELOW → LATIN CAPITAL LETTER T WITH CEDILLA # 
+
+01AE ; 0054 0328 ;     MA      # ( Ʈ → T̨ ) LATIN CAPITAL LETTER T WITH RETROFLEX HOOK → LATIN CAPITAL LETTER T, COMBINING OGONEK        # 
+
+04AD ; 0074 0329 ;     MA      # ( ҭ → t̩ ) CYRILLIC SMALL LETTER TE WITH DESCENDER → LATIN SMALL LETTER T, COMBINING VERTICAL LINE BELOW        # →т̩→
+
+04AC ; 0054 0329 ;     MA      # ( Ҭ → T̩ ) CYRILLIC CAPITAL LETTER TE WITH DESCENDER → LATIN CAPITAL LETTER T, COMBINING VERTICAL LINE BELOW    # →Т̩→
+
+0167 ; 0074 0335 ;     MA      # ( ŧ → t̵ ) LATIN SMALL LETTER T WITH STROKE → LATIN SMALL LETTER T, COMBINING SHORT STROKE OVERLAY      # 
+
+0166 ; 0054 0335 ;     MA      # ( Ŧ → T̵ ) LATIN CAPITAL LETTER T WITH STROKE → LATIN CAPITAL LETTER T, COMBINING SHORT STROKE OVERLAY  # 
+
+10A0 ; A786 ;  MA      # ( Ⴀ → Ꞇ ) GEORGIAN CAPITAL LETTER AN → LATIN CAPITAL LETTER INSULAR T # 
+
+A728 ; 0054 0033 ;     MA      # ( Ꜩ → T3 ) LATIN CAPITAL LETTER TZ → LATIN CAPITAL LETTER T, DIGIT THREE        # →TƷ→
+
+02A8 ; 0074 0255 ;     MA      # ( ʨ → tɕ ) LATIN SMALL LETTER TC DIGRAPH WITH CURL → LATIN SMALL LETTER T, LATIN SMALL LETTER C WITH CURL       # 
+
+2121 ; 0054 0045 004C ;        MA      #* ( ℡ → TEL ) TELEPHONE SIGN → LATIN CAPITAL LETTER T, LATIN CAPITAL LETTER E, LATIN CAPITAL LETTER L    # 
+
+A777 ; 0074 0066 ;     MA      # ( ꝷ → tf ) LATIN SMALL LETTER TUM → LATIN SMALL LETTER T, LATIN SMALL LETTER F  # 
+
+02A6 ; 0074 0073 ;     MA      # ( ʦ → ts ) LATIN SMALL LETTER TS DIGRAPH → LATIN SMALL LETTER T, LATIN SMALL LETTER S    # 
+
+02A7 ; 0074 0283 ;     MA      # ( ʧ → tʃ ) LATIN SMALL LETTER TESH DIGRAPH → LATIN SMALL LETTER T, LATIN SMALL LETTER ESH       # 
+
+A729 ; 0074 021D ;     MA      # ( ꜩ → tȝ ) LATIN SMALL LETTER TZ → LATIN SMALL LETTER T, LATIN SMALL LETTER YOGH       # 
+
+1D42E ;        0075 ;  MA      # ( 𝐮 → u ) MATHEMATICAL BOLD SMALL U → LATIN SMALL LETTER U     # 
+1D462 ;        0075 ;  MA      # ( 𝑢 → u ) MATHEMATICAL ITALIC SMALL U → LATIN SMALL LETTER U   # 
+1D496 ;        0075 ;  MA      # ( 𝒖 → u ) MATHEMATICAL BOLD ITALIC SMALL U → LATIN SMALL LETTER U      # 
+1D4CA ;        0075 ;  MA      # ( 𝓊 → u ) MATHEMATICAL SCRIPT SMALL U → LATIN SMALL LETTER U   # 
+1D4FE ;        0075 ;  MA      # ( 𝓾 → u ) MATHEMATICAL BOLD SCRIPT SMALL U → LATIN SMALL LETTER U      # 
+1D532 ;        0075 ;  MA      # ( 𝔲 → u ) MATHEMATICAL FRAKTUR SMALL U → LATIN SMALL LETTER U  # 
+1D566 ;        0075 ;  MA      # ( 𝕦 → u ) MATHEMATICAL DOUBLE-STRUCK SMALL U → LATIN SMALL LETTER U    # 
+1D59A ;        0075 ;  MA      # ( 𝖚 → u ) MATHEMATICAL BOLD FRAKTUR SMALL U → LATIN SMALL LETTER U     # 
+1D5CE ;        0075 ;  MA      # ( 𝗎 → u ) MATHEMATICAL SANS-SERIF SMALL U → LATIN SMALL LETTER U       # 
+1D602 ;        0075 ;  MA      # ( 𝘂 → u ) MATHEMATICAL SANS-SERIF BOLD SMALL U → LATIN SMALL LETTER U  # 
+1D636 ;        0075 ;  MA      # ( 𝘶 → u ) MATHEMATICAL SANS-SERIF ITALIC SMALL U → LATIN SMALL LETTER U        # 
+1D66A ;        0075 ;  MA      # ( 𝙪 → u ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U → LATIN SMALL LETTER U   # 
+1D69E ;        0075 ;  MA      # ( 𝚞 → u ) MATHEMATICAL MONOSPACE SMALL U → LATIN SMALL LETTER U        # 
+1D1C ; 0075 ;  MA      # ( ᴜ → u ) LATIN LETTER SMALL CAPITAL U → LATIN SMALL LETTER U   # 
+028B ; 0075 ;  MA      # ( ʋ → u ) LATIN SMALL LETTER V WITH HOOK → LATIN SMALL LETTER U  # 
+03C5 ; 0075 ;  MA      # ( υ → u ) GREEK SMALL LETTER UPSILON → LATIN SMALL LETTER U      # →ʋ→
+1D6D6 ;        0075 ;  MA      # ( 𝛖 → u ) MATHEMATICAL BOLD SMALL UPSILON → LATIN SMALL LETTER U       # →υ→→ʋ→
+1D710 ;        0075 ;  MA      # ( 𝜐 → u ) MATHEMATICAL ITALIC SMALL UPSILON → LATIN SMALL LETTER U     # →υ→→ʋ→
+1D74A ;        0075 ;  MA      # ( 𝝊 → u ) MATHEMATICAL BOLD ITALIC SMALL UPSILON → LATIN SMALL LETTER U        # →υ→→ʋ→
+1D784 ;        0075 ;  MA      # ( 𝞄 → u ) MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON → LATIN SMALL LETTER U    # →υ→→ʋ→
+1D7BE ;        0075 ;  MA      # ( 𝞾 → u ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON → LATIN SMALL LETTER U     # →υ→→ʋ→
+0446 ; 0075 ;  MA      # ( ц → u ) CYRILLIC SMALL LETTER TSE → LATIN SMALL LETTER U       # 
+057D ; 0075 ;  MA      # ( ս → u ) ARMENIAN SMALL LETTER SEH → LATIN SMALL LETTER U       # 
+
+1D414 ;        0055 ;  MA      # ( 𝐔 → U ) MATHEMATICAL BOLD CAPITAL U → LATIN CAPITAL LETTER U # 
+1D448 ;        0055 ;  MA      # ( 𝑈 → U ) MATHEMATICAL ITALIC CAPITAL U → LATIN CAPITAL LETTER U       # 
+1D47C ;        0055 ;  MA      # ( 𝑼 → U ) MATHEMATICAL BOLD ITALIC CAPITAL U → LATIN CAPITAL LETTER U  # 
+1D4B0 ;        0055 ;  MA      # ( 𝒰 → U ) MATHEMATICAL SCRIPT CAPITAL U → LATIN CAPITAL LETTER U       # 
+1D4E4 ;        0055 ;  MA      # ( 𝓤 → U ) MATHEMATICAL BOLD SCRIPT CAPITAL U → LATIN CAPITAL LETTER U  # 
+1D518 ;        0055 ;  MA      # ( 𝔘 → U ) MATHEMATICAL FRAKTUR CAPITAL U → LATIN CAPITAL LETTER U      # 
+1D54C ;        0055 ;  MA      # ( 𝕌 → U ) MATHEMATICAL DOUBLE-STRUCK CAPITAL U → LATIN CAPITAL LETTER U        # 
+1D580 ;        0055 ;  MA      # ( 𝖀 → U ) MATHEMATICAL BOLD FRAKTUR CAPITAL U → LATIN CAPITAL LETTER U # 
+1D5B4 ;        0055 ;  MA      # ( 𝖴 → U ) MATHEMATICAL SANS-SERIF CAPITAL U → LATIN CAPITAL LETTER U   # 
+1D5E8 ;        0055 ;  MA      # ( 𝗨 → U ) MATHEMATICAL SANS-SERIF BOLD CAPITAL U → LATIN CAPITAL LETTER U      # 
+1D61C ;        0055 ;  MA      # ( 𝘜 → U ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL U → LATIN CAPITAL LETTER U    # 
+1D650 ;        0055 ;  MA      # ( 𝙐 → U ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U → LATIN CAPITAL LETTER U       # 
+1D684 ;        0055 ;  MA      # ( 𝚄 → U ) MATHEMATICAL MONOSPACE CAPITAL U → LATIN CAPITAL LETTER U    # 
+054D ; 0055 ;  MA      # ( Ս → U ) ARMENIAN CAPITAL LETTER SEH → LATIN CAPITAL LETTER U   # 
+144C ; 0055 ;  MA      # ( ᑌ → U ) CANADIAN SYLLABICS TE → LATIN CAPITAL LETTER U        # 
+A4F4 ; 0055 ;  MA      # ( ꓴ → U ) LISU LETTER U → LATIN CAPITAL LETTER U        # 
+
+01D4 ; 016D ;  MA      # ( ǔ → ŭ ) LATIN SMALL LETTER U WITH CARON → LATIN SMALL LETTER U WITH BREVE     # 
+
+01D3 ; 016C ;  MA      # ( Ǔ → Ŭ ) LATIN CAPITAL LETTER U WITH CARON → LATIN CAPITAL LETTER U WITH BREVE # 
+
+1458 ; 0055 00B7 ;     MA      # ( ᑘ → U· ) CANADIAN SYLLABICS WEST-CREE TWE → LATIN CAPITAL LETTER U, MIDDLE DOT       # →ᑌᐧ→→ᑌ·→
+
+1467 ; 0055 144A ;     MA      # ( ᑧ → Uᑊ ) CANADIAN SYLLABICS TTE → LATIN CAPITAL LETTER U, CANADIAN SYLLABICS WEST-CREE P    # →ᑌᑊ→
+
+057A ; 0270 ;  MA      # ( պ → ɰ ) ARMENIAN SMALL LETTER PEH → LATIN SMALL LETTER TURNED M WITH LONG LEG # 
+
+2127 ; 01B1 ;  MA      #* ( ℧ → Ʊ ) INVERTED OHM SIGN → LATIN CAPITAL LETTER UPSILON    # 
+162E ; 01B1 ;  MA      # ( ᘮ → Ʊ ) CANADIAN SYLLABICS CARRIER LHU → LATIN CAPITAL LETTER UPSILON        # →℧→
+1634 ; 01B1 ;  MA      # ( ᘴ → Ʊ ) CANADIAN SYLLABICS CARRIER TLHU → LATIN CAPITAL LETTER UPSILON       # →ᘮ→→℧→
+
+2228 ; 0076 ;  MA      #* ( ∨ → v ) LOGICAL OR → LATIN SMALL LETTER V    # 
+22C1 ; 0076 ;  MA      #* ( ⋁ → v ) N-ARY LOGICAL OR → LATIN SMALL LETTER V      # →∨→
+FF56 ; 0076 ;  MA      # ( v → v ) FULLWIDTH LATIN SMALL LETTER V → LATIN SMALL LETTER V # →ν→
+2174 ; 0076 ;  MA      # ( ⅴ → v ) SMALL ROMAN NUMERAL FIVE → LATIN SMALL LETTER V       # 
+1D42F ;        0076 ;  MA      # ( 𝐯 → v ) MATHEMATICAL BOLD SMALL V → LATIN SMALL LETTER V     # 
+1D463 ;        0076 ;  MA      # ( 𝑣 → v ) MATHEMATICAL ITALIC SMALL V → LATIN SMALL LETTER V   # 
+1D497 ;        0076 ;  MA      # ( 𝒗 → v ) MATHEMATICAL BOLD ITALIC SMALL V → LATIN SMALL LETTER V      # 
+1D4CB ;        0076 ;  MA      # ( 𝓋 → v ) MATHEMATICAL SCRIPT SMALL V → LATIN SMALL LETTER V   # 
+1D4FF ;        0076 ;  MA      # ( 𝓿 → v ) MATHEMATICAL BOLD SCRIPT SMALL V → LATIN SMALL LETTER V      # 
+1D533 ;        0076 ;  MA      # ( 𝔳 → v ) MATHEMATICAL FRAKTUR SMALL V → LATIN SMALL LETTER V  # 
+1D567 ;        0076 ;  MA      # ( 𝕧 → v ) MATHEMATICAL DOUBLE-STRUCK SMALL V → LATIN SMALL LETTER V    # 
+1D59B ;        0076 ;  MA      # ( 𝖛 → v ) MATHEMATICAL BOLD FRAKTUR SMALL V → LATIN SMALL LETTER V     # 
+1D5CF ;        0076 ;  MA      # ( 𝗏 → v ) MATHEMATICAL SANS-SERIF SMALL V → LATIN SMALL LETTER V       # 
+1D603 ;        0076 ;  MA      # ( 𝘃 → v ) MATHEMATICAL SANS-SERIF BOLD SMALL V → LATIN SMALL LETTER V  # 
+1D637 ;        0076 ;  MA      # ( 𝘷 → v ) MATHEMATICAL SANS-SERIF ITALIC SMALL V → LATIN SMALL LETTER V        # 
+1D66B ;        0076 ;  MA      # ( 𝙫 → v ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V → LATIN SMALL LETTER V   # 
+1D69F ;        0076 ;  MA      # ( 𝚟 → v ) MATHEMATICAL MONOSPACE SMALL V → LATIN SMALL LETTER V        # 
+1D20 ; 0076 ;  MA      # ( ᴠ → v ) LATIN LETTER SMALL CAPITAL V → LATIN SMALL LETTER V   # 
+03BD ; 0076 ;  MA      # ( ν → v ) GREEK SMALL LETTER NU → LATIN SMALL LETTER V   # 
+1D6CE ;        0076 ;  MA      # ( 𝛎 → v ) MATHEMATICAL BOLD SMALL NU → LATIN SMALL LETTER V    # →ν→
+1D708 ;        0076 ;  MA      # ( 𝜈 → v ) MATHEMATICAL ITALIC SMALL NU → LATIN SMALL LETTER V  # →ν→
+1D742 ;        0076 ;  MA      # ( 𝝂 → v ) MATHEMATICAL BOLD ITALIC SMALL NU → LATIN SMALL LETTER V     # →ν→
+1D77C ;        0076 ;  MA      # ( 𝝼 → v ) MATHEMATICAL SANS-SERIF BOLD SMALL NU → LATIN SMALL LETTER V # →ν→
+1D7B6 ;        0076 ;  MA      # ( 𝞶 → v ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU → LATIN SMALL LETTER V  # →ν→
+0475 ; 0076 ;  MA      # ( ѵ → v ) CYRILLIC SMALL LETTER IZHITSA → LATIN SMALL LETTER V   # 
+05D8 ; 0076 ;  MA      # ( ‎ט‎ → v ) HEBREW LETTER TET → LATIN SMALL LETTER V # 
+
+2164 ; 0056 ;  MA      # ( Ⅴ → V ) ROMAN NUMERAL FIVE → LATIN CAPITAL LETTER V   # 
+1D415 ;        0056 ;  MA      # ( 𝐕 → V ) MATHEMATICAL BOLD CAPITAL V → LATIN CAPITAL LETTER V # 
+1D449 ;        0056 ;  MA      # ( 𝑉 → V ) MATHEMATICAL ITALIC CAPITAL V → LATIN CAPITAL LETTER V       # 
+1D47D ;        0056 ;  MA      # ( 𝑽 → V ) MATHEMATICAL BOLD ITALIC CAPITAL V → LATIN CAPITAL LETTER V  # 
+1D4B1 ;        0056 ;  MA      # ( 𝒱 → V ) MATHEMATICAL SCRIPT CAPITAL V → LATIN CAPITAL LETTER V       # 
+1D4E5 ;        0056 ;  MA      # ( 𝓥 → V ) MATHEMATICAL BOLD SCRIPT CAPITAL V → LATIN CAPITAL LETTER V  # 
+1D519 ;        0056 ;  MA      # ( 𝔙 → V ) MATHEMATICAL FRAKTUR CAPITAL V → LATIN CAPITAL LETTER V      # 
+1D54D ;        0056 ;  MA      # ( 𝕍 → V ) MATHEMATICAL DOUBLE-STRUCK CAPITAL V → LATIN CAPITAL LETTER V        # 
+1D581 ;        0056 ;  MA      # ( 𝖁 → V ) MATHEMATICAL BOLD FRAKTUR CAPITAL V → LATIN CAPITAL LETTER V # 
+1D5B5 ;        0056 ;  MA      # ( 𝖵 → V ) MATHEMATICAL SANS-SERIF CAPITAL V → LATIN CAPITAL LETTER V   # 
+1D5E9 ;        0056 ;  MA      # ( 𝗩 → V ) MATHEMATICAL SANS-SERIF BOLD CAPITAL V → LATIN CAPITAL LETTER V      # 
+1D61D ;        0056 ;  MA      # ( 𝘝 → V ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL V → LATIN CAPITAL LETTER V    # 
+1D651 ;        0056 ;  MA      # ( 𝙑 → V ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V → LATIN CAPITAL LETTER V       # 
+1D685 ;        0056 ;  MA      # ( 𝚅 → V ) MATHEMATICAL MONOSPACE CAPITAL V → LATIN CAPITAL LETTER V    # 
+0474 ; 0056 ;  MA      # ( Ѵ → V ) CYRILLIC CAPITAL LETTER IZHITSA → LATIN CAPITAL LETTER V       # 
+2D38 ; 0056 ;  MA      # ( ⴸ → V ) TIFINAGH LETTER YADH → LATIN CAPITAL LETTER V # 
+13D9 ; 0056 ;  MA      # ( Ꮩ → V ) CHEROKEE LETTER DO → LATIN CAPITAL LETTER V   # 
+142F ; 0056 ;  MA      # ( ᐯ → V ) CANADIAN SYLLABICS PE → LATIN CAPITAL LETTER V        # 
+A4E6 ; 0056 ;  MA      # ( ꓦ → V ) LISU LETTER HA → LATIN CAPITAL LETTER V       # 
+
+2175 ; 0076 0069 ;     MA      # ( ⅵ → vi ) SMALL ROMAN NUMERAL SIX → LATIN SMALL LETTER V, LATIN SMALL LETTER I # 
+
+2165 ; 0056 0049 ;     MA      # ( Ⅵ → VI ) ROMAN NUMERAL SIX → LATIN CAPITAL LETTER V, LATIN CAPITAL LETTER I   # 
+
+2176 ; 0076 0069 0069 ;        MA      # ( ⅶ → vii ) SMALL ROMAN NUMERAL SEVEN → LATIN SMALL LETTER V, LATIN SMALL LETTER I, LATIN SMALL LETTER I        # 
+
+2166 ; 0056 0049 0049 ;        MA      # ( Ⅶ → VII ) ROMAN NUMERAL SEVEN → LATIN CAPITAL LETTER V, LATIN CAPITAL LETTER I, LATIN CAPITAL LETTER I        # 
+
+2177 ; 0076 0069 0069 0069 ;   MA      # ( ⅷ → viii ) SMALL ROMAN NUMERAL EIGHT → LATIN SMALL LETTER V, LATIN SMALL LETTER I, LATIN SMALL LETTER I, LATIN SMALL LETTER I # 
+
+2167 ; 0056 0049 0049 0049 ;   MA      # ( Ⅷ → VIII ) ROMAN NUMERAL EIGHT → LATIN CAPITAL LETTER V, LATIN CAPITAL LETTER I, LATIN CAPITAL LETTER I, LATIN CAPITAL LETTER I       # 
+
+026F ; 0076 0076 ;     MA      # ( ɯ → vv ) LATIN SMALL LETTER TURNED M → LATIN SMALL LETTER V, LATIN SMALL LETTER V      # →w→
+0077 ; 0076 0076 ;     MA      # ( w → vv ) LATIN SMALL LETTER W → LATIN SMALL LETTER V, LATIN SMALL LETTER V      # 
+1D430 ;        0076 0076 ;     MA      # ( 𝐰 → vv ) MATHEMATICAL BOLD SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V      # →w→
+1D464 ;        0076 0076 ;     MA      # ( 𝑤 → vv ) MATHEMATICAL ITALIC SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V    # →w→
+1D498 ;        0076 0076 ;     MA      # ( 𝒘 → vv ) MATHEMATICAL BOLD ITALIC SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V       # →w→
+1D4CC ;        0076 0076 ;     MA      # ( 𝓌 → vv ) MATHEMATICAL SCRIPT SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V    # →w→
+1D500 ;        0076 0076 ;     MA      # ( 𝔀 → vv ) MATHEMATICAL BOLD SCRIPT SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V       # →w→
+1D534 ;        0076 0076 ;     MA      # ( 𝔴 → vv ) MATHEMATICAL FRAKTUR SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V   # →w→
+1D568 ;        0076 0076 ;     MA      # ( 𝕨 → vv ) MATHEMATICAL DOUBLE-STRUCK SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V     # →w→
+1D59C ;        0076 0076 ;     MA      # ( 𝖜 → vv ) MATHEMATICAL BOLD FRAKTUR SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V      # →w→
+1D5D0 ;        0076 0076 ;     MA      # ( 𝗐 → vv ) MATHEMATICAL SANS-SERIF SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V        # →w→
+1D604 ;        0076 0076 ;     MA      # ( 𝘄 → vv ) MATHEMATICAL SANS-SERIF BOLD SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V   # →w→
+1D638 ;        0076 0076 ;     MA      # ( 𝘸 → vv ) MATHEMATICAL SANS-SERIF ITALIC SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→
+1D66C ;        0076 0076 ;     MA      # ( 𝙬 → vv ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V    # →w→
+1D6A0 ;        0076 0076 ;     MA      # ( 𝚠 → vv ) MATHEMATICAL MONOSPACE SMALL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→
+1D21 ; 0076 0076 ;     MA      # ( ᴡ → vv ) LATIN LETTER SMALL CAPITAL W → LATIN SMALL LETTER V, LATIN SMALL LETTER V    # →w→
+0461 ; 0076 0076 ;     MA      # ( ѡ → vv ) CYRILLIC SMALL LETTER OMEGA → LATIN SMALL LETTER V, LATIN SMALL LETTER V      # →w→
+051D ; 0076 0076 ;     MA      # ( ԝ → vv ) CYRILLIC SMALL LETTER WE → LATIN SMALL LETTER V, LATIN SMALL LETTER V # →w→
+0561 ; 0076 0076 ;     MA      # ( ա → vv ) ARMENIAN SMALL LETTER AYB → LATIN SMALL LETTER V, LATIN SMALL LETTER V        # →ɯ→→w→
+
+047D ; 0076 0076 0483 ;        MA      # ( ѽ → vv҃ ) CYRILLIC SMALL LETTER OMEGA WITH TITLO → LATIN SMALL LETTER V, LATIN SMALL LETTER V, COMBINING CYRILLIC TITLO       # →ѡ҃→
+
+A761 ; 0076 0079 ;     MA      # ( ꝡ → vy ) LATIN SMALL LETTER VY → LATIN SMALL LETTER V, LATIN SMALL LETTER Y   # 
+
+1D27 ; 028C ;  MA      # ( ᴧ → ʌ ) GREEK LETTER SMALL CAPITAL LAMDA → LATIN SMALL LETTER TURNED V       # 
+
+039B ; 0245 ;  MA      # ( Λ → Ʌ ) GREEK CAPITAL LETTER LAMDA → LATIN CAPITAL LETTER TURNED V    # 
+1D6B2 ;        0245 ;  MA      # ( 𝚲 → Ʌ ) MATHEMATICAL BOLD CAPITAL LAMDA → LATIN CAPITAL LETTER TURNED V     # →Λ→
+1D6EC ;        0245 ;  MA      # ( 𝛬 → Ʌ ) MATHEMATICAL ITALIC CAPITAL LAMDA → LATIN CAPITAL LETTER TURNED V   # →Λ→
+1D726 ;        0245 ;  MA      # ( 𝜦 → Ʌ ) MATHEMATICAL BOLD ITALIC CAPITAL LAMDA → LATIN CAPITAL LETTER TURNED V      # →Λ→
+1D760 ;        0245 ;  MA      # ( 𝝠 → Ʌ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA → LATIN CAPITAL LETTER TURNED V  # →Λ→
+1D79A ;        0245 ;  MA      # ( 𝞚 → Ʌ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA → LATIN CAPITAL LETTER TURNED V   # →Λ→
+041B ; 0245 ;  MA      # ( Л → Ʌ ) CYRILLIC CAPITAL LETTER EL → LATIN CAPITAL LETTER TURNED V    # →Λ→
+2D37 ; 0245 ;  MA      # ( ⴷ → Ʌ ) TIFINAGH LETTER YAD → LATIN CAPITAL LETTER TURNED V  # 
+1431 ; 0245 ;  MA      # ( ᐱ → Ʌ ) CANADIAN SYLLABICS PI → LATIN CAPITAL LETTER TURNED V        # 
+A4E5 ; 0245 ;  MA      # ( ꓥ → Ʌ ) LISU LETTER NGA → LATIN CAPITAL LETTER TURNED V      # 
+
+04C5 ; 0245 0326 ;     MA      # ( Ӆ → Ʌ̦ ) CYRILLIC CAPITAL LETTER EL WITH TAIL → LATIN CAPITAL LETTER TURNED V, COMBINING COMMA BELOW # →Л̡→
+
+1D416 ;        0057 ;  MA      # ( 𝐖 → W ) MATHEMATICAL BOLD CAPITAL W → LATIN CAPITAL LETTER W # 
+1D44A ;        0057 ;  MA      # ( 𝑊 → W ) MATHEMATICAL ITALIC CAPITAL W → LATIN CAPITAL LETTER W       # 
+1D47E ;        0057 ;  MA      # ( 𝑾 → W ) MATHEMATICAL BOLD ITALIC CAPITAL W → LATIN CAPITAL LETTER W  # 
+1D4B2 ;        0057 ;  MA      # ( 𝒲 → W ) MATHEMATICAL SCRIPT CAPITAL W → LATIN CAPITAL LETTER W       # 
+1D4E6 ;        0057 ;  MA      # ( 𝓦 → W ) MATHEMATICAL BOLD SCRIPT CAPITAL W → LATIN CAPITAL LETTER W  # 
+1D51A ;        0057 ;  MA      # ( 𝔚 → W ) MATHEMATICAL FRAKTUR CAPITAL W → LATIN CAPITAL LETTER W      # 
+1D54E ;        0057 ;  MA      # ( 𝕎 → W ) MATHEMATICAL DOUBLE-STRUCK CAPITAL W → LATIN CAPITAL LETTER W        # 
+1D582 ;        0057 ;  MA      # ( 𝖂 → W ) MATHEMATICAL BOLD FRAKTUR CAPITAL W → LATIN CAPITAL LETTER W # 
+1D5B6 ;        0057 ;  MA      # ( 𝖶 → W ) MATHEMATICAL SANS-SERIF CAPITAL W → LATIN CAPITAL LETTER W   # 
+1D5EA ;        0057 ;  MA      # ( 𝗪 → W ) MATHEMATICAL SANS-SERIF BOLD CAPITAL W → LATIN CAPITAL LETTER W      # 
+1D61E ;        0057 ;  MA      # ( 𝘞 → W ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL W → LATIN CAPITAL LETTER W    # 
+1D652 ;        0057 ;  MA      # ( 𝙒 → W ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W → LATIN CAPITAL LETTER W       # 
+1D686 ;        0057 ;  MA      # ( 𝚆 → W ) MATHEMATICAL MONOSPACE CAPITAL W → LATIN CAPITAL LETTER W    # 
+051C ; 0057 ;  MA      # ( Ԝ → W ) CYRILLIC CAPITAL LETTER WE → LATIN CAPITAL LETTER W    # 
+13B3 ; 0057 ;  MA      # ( Ꮃ → W ) CHEROKEE LETTER LA → LATIN CAPITAL LETTER W   # 
+13D4 ; 0057 ;  MA      # ( Ꮤ → W ) CHEROKEE LETTER TA → LATIN CAPITAL LETTER W   # →Ꮃ→
+A4EA ; 0057 ;  MA      # ( ꓪ → W ) LISU LETTER WA → LATIN CAPITAL LETTER W       # 
+
+20A9 ; 0057 0335 ;     MA      #* ( ₩ → W̵ ) WON SIGN → LATIN CAPITAL LETTER W, COMBINING SHORT STROKE OVERLAY  # 
+
+166E ; 0078 ;  MA      #* ( ᙮ → x ) CANADIAN SYLLABICS FULL STOP → LATIN SMALL LETTER X  # 
+00D7 ; 0078 ;  MA      #* ( × → x ) MULTIPLICATION SIGN → LATIN SMALL LETTER X    # 
+2573 ; 0078 ;  MA      #* ( ╳ → x ) BOX DRAWINGS LIGHT DIAGONAL CROSS → LATIN SMALL LETTER X     # 
+292B ; 0078 ;  MA      #* ( ⤫ → x ) RISING DIAGONAL CROSSING FALLING DIAGONAL → LATIN SMALL LETTER X     # 
+292C ; 0078 ;  MA      #* ( ⤬ → x ) FALLING DIAGONAL CROSSING RISING DIAGONAL → LATIN SMALL LETTER X     # 
+2A2F ; 0078 ;  MA      #* ( ⨯ → x ) VECTOR OR CROSS PRODUCT → LATIN SMALL LETTER X       # →×→
+FF58 ; 0078 ;  MA      # ( x → x ) FULLWIDTH LATIN SMALL LETTER X → LATIN SMALL LETTER X # →х→
+2179 ; 0078 ;  MA      # ( ⅹ → x ) SMALL ROMAN NUMERAL TEN → LATIN SMALL LETTER X        # 
+1D431 ;        0078 ;  MA      # ( 𝐱 → x ) MATHEMATICAL BOLD SMALL X → LATIN SMALL LETTER X     # 
+1D465 ;        0078 ;  MA      # ( 𝑥 → x ) MATHEMATICAL ITALIC SMALL X → LATIN SMALL LETTER X   # 
+1D499 ;        0078 ;  MA      # ( 𝒙 → x ) MATHEMATICAL BOLD ITALIC SMALL X → LATIN SMALL LETTER X      # 
+1D4CD ;        0078 ;  MA      # ( 𝓍 → x ) MATHEMATICAL SCRIPT SMALL X → LATIN SMALL LETTER X   # 
+1D501 ;        0078 ;  MA      # ( 𝔁 → x ) MATHEMATICAL BOLD SCRIPT SMALL X → LATIN SMALL LETTER X      # 
+1D535 ;        0078 ;  MA      # ( 𝔵 → x ) MATHEMATICAL FRAKTUR SMALL X → LATIN SMALL LETTER X  # 
+1D569 ;        0078 ;  MA      # ( 𝕩 → x ) MATHEMATICAL DOUBLE-STRUCK SMALL X → LATIN SMALL LETTER X    # 
+1D59D ;        0078 ;  MA      # ( 𝖝 → x ) MATHEMATICAL BOLD FRAKTUR SMALL X → LATIN SMALL LETTER X     # 
+1D5D1 ;        0078 ;  MA      # ( 𝗑 → x ) MATHEMATICAL SANS-SERIF SMALL X → LATIN SMALL LETTER X       # 
+1D605 ;        0078 ;  MA      # ( 𝘅 → x ) MATHEMATICAL SANS-SERIF BOLD SMALL X → LATIN SMALL LETTER X  # 
+1D639 ;        0078 ;  MA      # ( 𝘹 → x ) MATHEMATICAL SANS-SERIF ITALIC SMALL X → LATIN SMALL LETTER X        # 
+1D66D ;        0078 ;  MA      # ( 𝙭 → x ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X → LATIN SMALL LETTER X   # 
+1D6A1 ;        0078 ;  MA      # ( 𝚡 → x ) MATHEMATICAL MONOSPACE SMALL X → LATIN SMALL LETTER X        # 
+0445 ; 0078 ;  MA      # ( х → x ) CYRILLIC SMALL LETTER HA → LATIN SMALL LETTER X        # 
+1541 ; 0078 ;  MA      # ( ᕁ → x ) CANADIAN SYLLABICS SAYISI YI → LATIN SMALL LETTER X   # →᙮→
+157D ; 0078 ;  MA      # ( ᕽ → x ) CANADIAN SYLLABICS HK → LATIN SMALL LETTER X  # →ᕁ→→᙮→
+
+166D ; 0058 ;  MA      #* ( ᙭ → X ) CANADIAN SYLLABICS CHI SIGN → LATIN CAPITAL LETTER X # 
+FF38 ; 0058 ;  MA      # ( X → X ) FULLWIDTH LATIN CAPITAL LETTER X → LATIN CAPITAL LETTER X     # →Χ→
+2169 ; 0058 ;  MA      # ( Ⅹ → X ) ROMAN NUMERAL TEN → LATIN CAPITAL LETTER X    # 
+1D417 ;        0058 ;  MA      # ( 𝐗 → X ) MATHEMATICAL BOLD CAPITAL X → LATIN CAPITAL LETTER X # 
+1D44B ;        0058 ;  MA      # ( 𝑋 → X ) MATHEMATICAL ITALIC CAPITAL X → LATIN CAPITAL LETTER X       # 
+1D47F ;        0058 ;  MA      # ( 𝑿 → X ) MATHEMATICAL BOLD ITALIC CAPITAL X → LATIN CAPITAL LETTER X  # 
+1D4B3 ;        0058 ;  MA      # ( 𝒳 → X ) MATHEMATICAL SCRIPT CAPITAL X → LATIN CAPITAL LETTER X       # 
+1D4E7 ;        0058 ;  MA      # ( 𝓧 → X ) MATHEMATICAL BOLD SCRIPT CAPITAL X → LATIN CAPITAL LETTER X  # 
+1D51B ;        0058 ;  MA      # ( 𝔛 → X ) MATHEMATICAL FRAKTUR CAPITAL X → LATIN CAPITAL LETTER X      # 
+1D54F ;        0058 ;  MA      # ( 𝕏 → X ) MATHEMATICAL DOUBLE-STRUCK CAPITAL X → LATIN CAPITAL LETTER X        # 
+1D583 ;        0058 ;  MA      # ( 𝖃 → X ) MATHEMATICAL BOLD FRAKTUR CAPITAL X → LATIN CAPITAL LETTER X # 
+1D5B7 ;        0058 ;  MA      # ( 𝖷 → X ) MATHEMATICAL SANS-SERIF CAPITAL X → LATIN CAPITAL LETTER X   # 
+1D5EB ;        0058 ;  MA      # ( 𝗫 → X ) MATHEMATICAL SANS-SERIF BOLD CAPITAL X → LATIN CAPITAL LETTER X      # 
+1D61F ;        0058 ;  MA      # ( 𝘟 → X ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL X → LATIN CAPITAL LETTER X    # 
+1D653 ;        0058 ;  MA      # ( 𝙓 → X ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X → LATIN CAPITAL LETTER X       # 
+1D687 ;        0058 ;  MA      # ( 𝚇 → X ) MATHEMATICAL MONOSPACE CAPITAL X → LATIN CAPITAL LETTER X    # 
+03A7 ; 0058 ;  MA      # ( Χ → X ) GREEK CAPITAL LETTER CHI → LATIN CAPITAL LETTER X      # 
+1D6BE ;        0058 ;  MA      # ( 𝚾 → X ) MATHEMATICAL BOLD CAPITAL CHI → LATIN CAPITAL LETTER X       # →𝐗→
+1D6F8 ;        0058 ;  MA      # ( 𝛸 → X ) MATHEMATICAL ITALIC CAPITAL CHI → LATIN CAPITAL LETTER X     # →𝑋→
+1D732 ;        0058 ;  MA      # ( 𝜲 → X ) MATHEMATICAL BOLD ITALIC CAPITAL CHI → LATIN CAPITAL LETTER X        # →𝑿→
+1D76C ;        0058 ;  MA      # ( 𝝬 → X ) MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI → LATIN CAPITAL LETTER X    # →Χ→
+1D7A6 ;        0058 ;  MA      # ( 𝞦 → X ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI → LATIN CAPITAL LETTER X     # →Χ→
+2CAC ; 0058 ;  MA      # ( Ⲭ → X ) COPTIC CAPITAL LETTER KHI → LATIN CAPITAL LETTER X    # →Χ→
+0425 ; 0058 ;  MA      # ( Х → X ) CYRILLIC CAPITAL LETTER HA → LATIN CAPITAL LETTER X    # 
+2D5D ; 0058 ;  MA      # ( ⵝ → X ) TIFINAGH LETTER YATH → LATIN CAPITAL LETTER X # 
+A4EB ; 0058 ;  MA      # ( ꓫ → X ) LISU LETTER SHA → LATIN CAPITAL LETTER X      # 
+
+2A30 ; 0078 0307 ;     MA      #* ( ⨰ → ẋ ) MULTIPLICATION SIGN WITH DOT ABOVE → LATIN SMALL LETTER X, COMBINING DOT ABOVE     # →×̇→
+
+04B2 ; 0058 0329 ;     MA      # ( Ҳ → X̩ ) CYRILLIC CAPITAL LETTER HA WITH DESCENDER → LATIN CAPITAL LETTER X, COMBINING VERTICAL LINE BELOW    # →Х̩→
+
+217A ; 0078 0069 ;     MA      # ( ⅺ → xi ) SMALL ROMAN NUMERAL ELEVEN → LATIN SMALL LETTER X, LATIN SMALL LETTER I      # 
+
+216A ; 0058 0049 ;     MA      # ( Ⅺ → XI ) ROMAN NUMERAL ELEVEN → LATIN CAPITAL LETTER X, LATIN CAPITAL LETTER I        # 
+
+217B ; 0078 0069 0069 ;        MA      # ( ⅻ → xii ) SMALL ROMAN NUMERAL TWELVE → LATIN SMALL LETTER X, LATIN SMALL LETTER I, LATIN SMALL LETTER I       # 
+
+216B ; 0058 0049 0049 ;        MA      # ( Ⅻ → XII ) ROMAN NUMERAL TWELVE → LATIN CAPITAL LETTER X, LATIN CAPITAL LETTER I, LATIN CAPITAL LETTER I       # 
+
+1D8C ; 0079 ;  MA      # ( ᶌ → y ) LATIN SMALL LETTER V WITH PALATAL HOOK → LATIN SMALL LETTER Y # 
+FF59 ; 0079 ;  MA      # ( y → y ) FULLWIDTH LATIN SMALL LETTER Y → LATIN SMALL LETTER Y # →у→
+1D432 ;        0079 ;  MA      # ( 𝐲 → y ) MATHEMATICAL BOLD SMALL Y → LATIN SMALL LETTER Y     # 
+1D466 ;        0079 ;  MA      # ( 𝑦 → y ) MATHEMATICAL ITALIC SMALL Y → LATIN SMALL LETTER Y   # 
+1D49A ;        0079 ;  MA      # ( 𝒚 → y ) MATHEMATICAL BOLD ITALIC SMALL Y → LATIN SMALL LETTER Y      # 
+1D4CE ;        0079 ;  MA      # ( 𝓎 → y ) MATHEMATICAL SCRIPT SMALL Y → LATIN SMALL LETTER Y   # 
+1D502 ;        0079 ;  MA      # ( 𝔂 → y ) MATHEMATICAL BOLD SCRIPT SMALL Y → LATIN SMALL LETTER Y      # 
+1D536 ;        0079 ;  MA      # ( 𝔶 → y ) MATHEMATICAL FRAKTUR SMALL Y → LATIN SMALL LETTER Y  # 
+1D56A ;        0079 ;  MA      # ( 𝕪 → y ) MATHEMATICAL DOUBLE-STRUCK SMALL Y → LATIN SMALL LETTER Y    # 
+1D59E ;        0079 ;  MA      # ( 𝖞 → y ) MATHEMATICAL BOLD FRAKTUR SMALL Y → LATIN SMALL LETTER Y     # 
+1D5D2 ;        0079 ;  MA      # ( 𝗒 → y ) MATHEMATICAL SANS-SERIF SMALL Y → LATIN SMALL LETTER Y       # 
+1D606 ;        0079 ;  MA      # ( 𝘆 → y ) MATHEMATICAL SANS-SERIF BOLD SMALL Y → LATIN SMALL LETTER Y  # 
+1D63A ;        0079 ;  MA      # ( 𝘺 → y ) MATHEMATICAL SANS-SERIF ITALIC SMALL Y → LATIN SMALL LETTER Y        # 
+1D66E ;        0079 ;  MA      # ( 𝙮 → y ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y → LATIN SMALL LETTER Y   # 
+1D6A2 ;        0079 ;  MA      # ( 𝚢 → y ) MATHEMATICAL MONOSPACE SMALL Y → LATIN SMALL LETTER Y        # 
+028F ; 0079 ;  MA      # ( ʏ → y ) LATIN LETTER SMALL CAPITAL Y → LATIN SMALL LETTER Y    # →ү→→у→
+1EFF ; 0079 ;  MA      # ( ỿ → y ) LATIN SMALL LETTER Y WITH LOOP → LATIN SMALL LETTER Y # 
+03B3 ; 0079 ;  MA      # ( γ → y ) GREEK SMALL LETTER GAMMA → LATIN SMALL LETTER Y        # 
+213D ; 0079 ;  MA      # ( ℽ → y ) DOUBLE-STRUCK SMALL GAMMA → LATIN SMALL LETTER Y      # →γ→
+1D6C4 ;        0079 ;  MA      # ( 𝛄 → y ) MATHEMATICAL BOLD SMALL GAMMA → LATIN SMALL LETTER Y # →γ→
+1D6FE ;        0079 ;  MA      # ( 𝛾 → y ) MATHEMATICAL ITALIC SMALL GAMMA → LATIN SMALL LETTER Y       # →γ→
+1D738 ;        0079 ;  MA      # ( 𝜸 → y ) MATHEMATICAL BOLD ITALIC SMALL GAMMA → LATIN SMALL LETTER Y  # →γ→
+1D772 ;        0079 ;  MA      # ( 𝝲 → y ) MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA → LATIN SMALL LETTER Y      # →γ→
+1D7AC ;        0079 ;  MA      # ( 𝞬 → y ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA → LATIN SMALL LETTER Y       # →γ→
+0443 ; 0079 ;  MA      # ( у → y ) CYRILLIC SMALL LETTER U → LATIN SMALL LETTER Y # 
+04AF ; 0079 ;  MA      # ( ү → y ) CYRILLIC SMALL LETTER STRAIGHT U → LATIN SMALL LETTER Y        # →у→
+10E7 ; 0079 ;  MA      # ( ყ → y ) GEORGIAN LETTER QAR → LATIN SMALL LETTER Y    # 
+
+FF39 ; 0059 ;  MA      # ( Y → Y ) FULLWIDTH LATIN CAPITAL LETTER Y → LATIN CAPITAL LETTER Y     # →Υ→
+1D418 ;        0059 ;  MA      # ( 𝐘 → Y ) MATHEMATICAL BOLD CAPITAL Y → LATIN CAPITAL LETTER Y # 
+1D44C ;        0059 ;  MA      # ( 𝑌 → Y ) MATHEMATICAL ITALIC CAPITAL Y → LATIN CAPITAL LETTER Y       # 
+1D480 ;        0059 ;  MA      # ( 𝒀 → Y ) MATHEMATICAL BOLD ITALIC CAPITAL Y → LATIN CAPITAL LETTER Y  # 
+1D4B4 ;        0059 ;  MA      # ( 𝒴 → Y ) MATHEMATICAL SCRIPT CAPITAL Y → LATIN CAPITAL LETTER Y       # 
+1D4E8 ;        0059 ;  MA      # ( 𝓨 → Y ) MATHEMATICAL BOLD SCRIPT CAPITAL Y → LATIN CAPITAL LETTER Y  # 
+1D51C ;        0059 ;  MA      # ( 𝔜 → Y ) MATHEMATICAL FRAKTUR CAPITAL Y → LATIN CAPITAL LETTER Y      # 
+1D550 ;        0059 ;  MA      # ( 𝕐 → Y ) MATHEMATICAL DOUBLE-STRUCK CAPITAL Y → LATIN CAPITAL LETTER Y        # 
+1D584 ;        0059 ;  MA      # ( 𝖄 → Y ) MATHEMATICAL BOLD FRAKTUR CAPITAL Y → LATIN CAPITAL LETTER Y # 
+1D5B8 ;        0059 ;  MA      # ( 𝖸 → Y ) MATHEMATICAL SANS-SERIF CAPITAL Y → LATIN CAPITAL LETTER Y   # 
+1D5EC ;        0059 ;  MA      # ( 𝗬 → Y ) MATHEMATICAL SANS-SERIF BOLD CAPITAL Y → LATIN CAPITAL LETTER Y      # 
+1D620 ;        0059 ;  MA      # ( 𝘠 → Y ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y → LATIN CAPITAL LETTER Y    # 
+1D654 ;        0059 ;  MA      # ( 𝙔 → Y ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y → LATIN CAPITAL LETTER Y       # 
+1D688 ;        0059 ;  MA      # ( 𝚈 → Y ) MATHEMATICAL MONOSPACE CAPITAL Y → LATIN CAPITAL LETTER Y    # 
+03A5 ; 0059 ;  MA      # ( Υ → Y ) GREEK CAPITAL LETTER UPSILON → LATIN CAPITAL LETTER Y  # 
+03D2 ; 0059 ;  MA      # ( ϒ → Y ) GREEK UPSILON WITH HOOK SYMBOL → LATIN CAPITAL LETTER Y        # 
+1D6BC ;        0059 ;  MA      # ( 𝚼 → Y ) MATHEMATICAL BOLD CAPITAL UPSILON → LATIN CAPITAL LETTER Y   # →Υ→
+1D6F6 ;        0059 ;  MA      # ( 𝛶 → Y ) MATHEMATICAL ITALIC CAPITAL UPSILON → LATIN CAPITAL LETTER Y # →Υ→
+1D730 ;        0059 ;  MA      # ( 𝜰 → Y ) MATHEMATICAL BOLD ITALIC CAPITAL UPSILON → LATIN CAPITAL LETTER Y    # →Υ→
+1D76A ;        0059 ;  MA      # ( 𝝪 → Y ) MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON → LATIN CAPITAL LETTER Y        # →Υ→
+1D7A4 ;        0059 ;  MA      # ( 𝞤 → Y ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON → LATIN CAPITAL LETTER Y # →Υ→
+2CA8 ; 0059 ;  MA      # ( Ⲩ → Y ) COPTIC CAPITAL LETTER UA → LATIN CAPITAL LETTER Y     # 
+04AE ; 0059 ;  MA      # ( Ү → Y ) CYRILLIC CAPITAL LETTER STRAIGHT U → LATIN CAPITAL LETTER Y    # 
+13A9 ; 0059 ;  MA      # ( Ꭹ → Y ) CHEROKEE LETTER GI → LATIN CAPITAL LETTER Y   # 
+13BD ; 0059 ;  MA      # ( Ꮍ → Y ) CHEROKEE LETTER MU → LATIN CAPITAL LETTER Y   # →Ꭹ→
+A4EC ; 0059 ;  MA      # ( ꓬ → Y ) LISU LETTER YA → LATIN CAPITAL LETTER Y       # 
+
+01B4 ; 0079 0314 ;     MA      # ( ƴ → y̔ ) LATIN SMALL LETTER Y WITH HOOK → LATIN SMALL LETTER Y, COMBINING REVERSED COMMA ABOVE        # 
+
+04B1 ; 0079 0335 ;     MA      # ( ұ → y̵ ) CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE → LATIN SMALL LETTER Y, COMBINING SHORT STROKE OVERLAY  # →ү̵→
+
+00A5 ; 0059 0335 ;     MA      #* ( ¥ → Y̵ ) YEN SIGN → LATIN CAPITAL LETTER Y, COMBINING SHORT STROKE OVERLAY   # 
+04B0 ; 0059 0335 ;     MA      # ( Ұ → Y̵ ) CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE → LATIN CAPITAL LETTER Y, COMBINING SHORT STROKE OVERLAY      # →Ү̵→
+
+1D433 ;        007A ;  MA      # ( 𝐳 → z ) MATHEMATICAL BOLD SMALL Z → LATIN SMALL LETTER Z     # 
+1D467 ;        007A ;  MA      # ( 𝑧 → z ) MATHEMATICAL ITALIC SMALL Z → LATIN SMALL LETTER Z   # 
+1D49B ;        007A ;  MA      # ( 𝒛 → z ) MATHEMATICAL BOLD ITALIC SMALL Z → LATIN SMALL LETTER Z      # 
+1D4CF ;        007A ;  MA      # ( 𝓏 → z ) MATHEMATICAL SCRIPT SMALL Z → LATIN SMALL LETTER Z   # 
+1D503 ;        007A ;  MA      # ( 𝔃 → z ) MATHEMATICAL BOLD SCRIPT SMALL Z → LATIN SMALL LETTER Z      # 
+1D537 ;        007A ;  MA      # ( 𝔷 → z ) MATHEMATICAL FRAKTUR SMALL Z → LATIN SMALL LETTER Z  # 
+1D56B ;        007A ;  MA      # ( 𝕫 → z ) MATHEMATICAL DOUBLE-STRUCK SMALL Z → LATIN SMALL LETTER Z    # 
+1D59F ;        007A ;  MA      # ( 𝖟 → z ) MATHEMATICAL BOLD FRAKTUR SMALL Z → LATIN SMALL LETTER Z     # 
+1D5D3 ;        007A ;  MA      # ( 𝗓 → z ) MATHEMATICAL SANS-SERIF SMALL Z → LATIN SMALL LETTER Z       # 
+1D607 ;        007A ;  MA      # ( 𝘇 → z ) MATHEMATICAL SANS-SERIF BOLD SMALL Z → LATIN SMALL LETTER Z  # 
+1D63B ;        007A ;  MA      # ( 𝘻 → z ) MATHEMATICAL SANS-SERIF ITALIC SMALL Z → LATIN SMALL LETTER Z        # 
+1D66F ;        007A ;  MA      # ( 𝙯 → z ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z → LATIN SMALL LETTER Z   # 
+1D6A3 ;        007A ;  MA      # ( 𝚣 → z ) MATHEMATICAL MONOSPACE SMALL Z → LATIN SMALL LETTER Z        # 
+1D22 ; 007A ;  MA      # ( ᴢ → z ) LATIN LETTER SMALL CAPITAL Z → LATIN SMALL LETTER Z   # 
+
+FF3A ; 005A ;  MA      # ( Z → Z ) FULLWIDTH LATIN CAPITAL LETTER Z → LATIN CAPITAL LETTER Z     # →Ζ→
+2124 ; 005A ;  MA      # ( ℤ → Z ) DOUBLE-STRUCK CAPITAL Z → LATIN CAPITAL LETTER Z      # 
+2128 ; 005A ;  MA      # ( ℨ → Z ) BLACK-LETTER CAPITAL Z → LATIN CAPITAL LETTER Z       # 
+1D419 ;        005A ;  MA      # ( 𝐙 → Z ) MATHEMATICAL BOLD CAPITAL Z → LATIN CAPITAL LETTER Z # 
+1D44D ;        005A ;  MA      # ( 𝑍 → Z ) MATHEMATICAL ITALIC CAPITAL Z → LATIN CAPITAL LETTER Z       # 
+1D481 ;        005A ;  MA      # ( 𝒁 → Z ) MATHEMATICAL BOLD ITALIC CAPITAL Z → LATIN CAPITAL LETTER Z  # 
+1D4B5 ;        005A ;  MA      # ( 𝒵 → Z ) MATHEMATICAL SCRIPT CAPITAL Z → LATIN CAPITAL LETTER Z       # 
+1D4E9 ;        005A ;  MA      # ( 𝓩 → Z ) MATHEMATICAL BOLD SCRIPT CAPITAL Z → LATIN CAPITAL LETTER Z  # 
+1D585 ;        005A ;  MA      # ( 𝖅 → Z ) MATHEMATICAL BOLD FRAKTUR CAPITAL Z → LATIN CAPITAL LETTER Z # 
+1D5B9 ;        005A ;  MA      # ( 𝖹 → Z ) MATHEMATICAL SANS-SERIF CAPITAL Z → LATIN CAPITAL LETTER Z   # 
+1D5ED ;        005A ;  MA      # ( 𝗭 → Z ) MATHEMATICAL SANS-SERIF BOLD CAPITAL Z → LATIN CAPITAL LETTER Z      # 
+1D621 ;        005A ;  MA      # ( 𝘡 → Z ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z → LATIN CAPITAL LETTER Z    # 
+1D655 ;        005A ;  MA      # ( 𝙕 → Z ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z → LATIN CAPITAL LETTER Z       # 
+1D689 ;        005A ;  MA      # ( 𝚉 → Z ) MATHEMATICAL MONOSPACE CAPITAL Z → LATIN CAPITAL LETTER Z    # 
+0396 ; 005A ;  MA      # ( Ζ → Z ) GREEK CAPITAL LETTER ZETA → LATIN CAPITAL LETTER Z     # 
+1D6AD ;        005A ;  MA      # ( 𝚭 → Z ) MATHEMATICAL BOLD CAPITAL ZETA → LATIN CAPITAL LETTER Z      # →𝐙→
+1D6E7 ;        005A ;  MA      # ( 𝛧 → Z ) MATHEMATICAL ITALIC CAPITAL ZETA → LATIN CAPITAL LETTER Z    # →Ζ→
+1D721 ;        005A ;  MA      # ( 𝜡 → Z ) MATHEMATICAL BOLD ITALIC CAPITAL ZETA → LATIN CAPITAL LETTER Z       # →Ζ→
+1D75B ;        005A ;  MA      # ( 𝝛 → Z ) MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA → LATIN CAPITAL LETTER Z   # →Ζ→
+1D795 ;        005A ;  MA      # ( 𝞕 → Z ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA → LATIN CAPITAL LETTER Z    # →Ζ→
+13C3 ; 005A ;  MA      # ( Ꮓ → Z ) CHEROKEE LETTER NO → LATIN CAPITAL LETTER Z   # 
+A4DC ; 005A ;  MA      # ( ꓜ → Z ) LISU LETTER DZA → LATIN CAPITAL LETTER Z      # 
+
+0290 ; 007A 0328 ;     MA      # ( ʐ → z̨ ) LATIN SMALL LETTER Z WITH RETROFLEX HOOK → LATIN SMALL LETTER Z, COMBINING OGONEK    # →z̢→
+
+0225 ; 007A 0326 ;     MA      # ( ȥ → z̦ ) LATIN SMALL LETTER Z WITH HOOK → LATIN SMALL LETTER Z, COMBINING COMMA BELOW # →z̡→
+
+0224 ; 005A 0326 ;     MA      # ( Ȥ → Z̦ ) LATIN CAPITAL LETTER Z WITH HOOK → LATIN CAPITAL LETTER Z, COMBINING COMMA BELOW     # →Z̧→
+
+01B6 ; 007A 0335 ;     MA      # ( ƶ → z̵ ) LATIN SMALL LETTER Z WITH STROKE → LATIN SMALL LETTER Z, COMBINING SHORT STROKE OVERLAY      # 
+
+01B5 ; 005A 0335 ;     MA      # ( Ƶ → Z̵ ) LATIN CAPITAL LETTER Z WITH STROKE → LATIN CAPITAL LETTER Z, COMBINING SHORT STROKE OVERLAY  # 
+
+0292 ; 021D ;  MA      # ( ʒ → ȝ ) LATIN SMALL LETTER EZH → LATIN SMALL LETTER YOGH      # 
+A76B ; 021D ;  MA      # ( ꝫ → ȝ ) LATIN SMALL LETTER ET → LATIN SMALL LETTER YOGH      # 
+2CCD ; 021D ;  MA      # ( ⳍ → ȝ ) COPTIC SMALL LETTER OLD COPTIC HORI → LATIN SMALL LETTER YOGH        # 
+04E1 ; 021D ;  MA      # ( ӡ → ȝ ) CYRILLIC SMALL LETTER ABKHASIAN DZE → LATIN SMALL LETTER YOGH # →ʒ→
+10F3 ; 021D ;  MA      # ( ჳ → ȝ ) GEORGIAN LETTER WE → LATIN SMALL LETTER YOGH # →ʒ→
+
+01BF ; 00FE ;  MA      # ( ƿ → þ ) LATIN LETTER WYNN → LATIN SMALL LETTER THORN  # 
+03F8 ; 00FE ;  MA      # ( ϸ → þ ) GREEK SMALL LETTER SHO → LATIN SMALL LETTER THORN     # 
+
+03F7 ; 00DE ;  MA      # ( Ϸ → Þ ) GREEK CAPITAL LETTER SHO → LATIN CAPITAL LETTER THORN # 
+
+1D24 ; 01A8 ;  MA      # ( ᴤ → ƨ ) LATIN LETTER VOICED LARYNGEAL SPIRANT → LATIN SMALL LETTER TONE TWO  # 
+03E9 ; 01A8 ;  MA      # ( ϩ → ƨ ) COPTIC SMALL LETTER HORI → LATIN SMALL LETTER TONE TWO        # 
+A645 ; 01A8 ;  MA      # ( ꙅ → ƨ ) CYRILLIC SMALL LETTER REVERSED DZE → LATIN SMALL LETTER TONE TWO     # 
+
+044C ; 0185 ;  MA      # ( ь → ƅ ) CYRILLIC SMALL LETTER SOFT SIGN → LATIN SMALL LETTER TONE SIX # 
+
+02C1 ; 02E4 ;  MA      # ( ˁ → ˤ ) MODIFIER LETTER REVERSED GLOTTAL STOP → MODIFIER LETTER SMALL REVERSED GLOTTAL STOP   # 
+
+1D7CB ;        03DD ;  MA      # ( 𝟋 → ϝ ) MATHEMATICAL BOLD SMALL DIGAMMA → GREEK SMALL LETTER DIGAMMA        # 
+
+1D6C7 ;        03B6 ;  MA      # ( 𝛇 → ζ ) MATHEMATICAL BOLD SMALL ZETA → GREEK SMALL LETTER ZETA      # 
+1D701 ;        03B6 ;  MA      # ( 𝜁 → ζ ) MATHEMATICAL ITALIC SMALL ZETA → GREEK SMALL LETTER ZETA    # 
+1D73B ;        03B6 ;  MA      # ( 𝜻 → ζ ) MATHEMATICAL BOLD ITALIC SMALL ZETA → GREEK SMALL LETTER ZETA       # 
+1D775 ;        03B6 ;  MA      # ( 𝝵 → ζ ) MATHEMATICAL SANS-SERIF BOLD SMALL ZETA → GREEK SMALL LETTER ZETA   # 
+1D7AF ;        03B6 ;  MA      # ( 𝞯 → ζ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA → GREEK SMALL LETTER ZETA    # 
+
+2CE4 ; 03D7 ;  MA      # ( ⳤ → ϗ ) COPTIC SYMBOL KAI → GREEK KAI SYMBOL # 
+
+1D6CC ;        03BB ;  MA      # ( 𝛌 → λ ) MATHEMATICAL BOLD SMALL LAMDA → GREEK SMALL LETTER LAMDA    # 
+1D706 ;        03BB ;  MA      # ( 𝜆 → λ ) MATHEMATICAL ITALIC SMALL LAMDA → GREEK SMALL LETTER LAMDA  # 
+1D740 ;        03BB ;  MA      # ( 𝝀 → λ ) MATHEMATICAL BOLD ITALIC SMALL LAMDA → GREEK SMALL LETTER LAMDA     # 
+1D77A ;        03BB ;  MA      # ( 𝝺 → λ ) MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA → GREEK SMALL LETTER LAMDA # 
+1D7B4 ;        03BB ;  MA      # ( 𝞴 → λ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA → GREEK SMALL LETTER LAMDA  # 
+2C96 ; 03BB ;  MA      # ( Ⲗ → λ ) COPTIC CAPITAL LETTER LAULA → GREEK SMALL LETTER LAMDA       # 
+
+00B5 ; 03BC ;  MA      # ( µ → μ ) MICRO SIGN → GREEK SMALL LETTER MU    # 
+1D6CD ;        03BC ;  MA      # ( 𝛍 → μ ) MATHEMATICAL BOLD SMALL MU → GREEK SMALL LETTER MU  # 
+1D707 ;        03BC ;  MA      # ( 𝜇 → μ ) MATHEMATICAL ITALIC SMALL MU → GREEK SMALL LETTER MU        # 
+1D741 ;        03BC ;  MA      # ( 𝝁 → μ ) MATHEMATICAL BOLD ITALIC SMALL MU → GREEK SMALL LETTER MU   # 
+1D77B ;        03BC ;  MA      # ( 𝝻 → μ ) MATHEMATICAL SANS-SERIF BOLD SMALL MU → GREEK SMALL LETTER MU       # 
+1D7B5 ;        03BC ;  MA      # ( 𝞵 → μ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU → GREEK SMALL LETTER MU        # 
+
+1D6CF ;        03BE ;  MA      # ( 𝛏 → ξ ) MATHEMATICAL BOLD SMALL XI → GREEK SMALL LETTER XI  # 
+1D709 ;        03BE ;  MA      # ( 𝜉 → ξ ) MATHEMATICAL ITALIC SMALL XI → GREEK SMALL LETTER XI        # 
+1D743 ;        03BE ;  MA      # ( 𝝃 → ξ ) MATHEMATICAL BOLD ITALIC SMALL XI → GREEK SMALL LETTER XI   # 
+1D77D ;        03BE ;  MA      # ( 𝝽 → ξ ) MATHEMATICAL SANS-SERIF BOLD SMALL XI → GREEK SMALL LETTER XI       # 
+1D7B7 ;        03BE ;  MA      # ( 𝞷 → ξ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI → GREEK SMALL LETTER XI        # 
+
+1D6B5 ;        039E ;  MA      # ( 𝚵 → Ξ ) MATHEMATICAL BOLD CAPITAL XI → GREEK CAPITAL LETTER XI      # 
+1D6EF ;        039E ;  MA      # ( 𝛯 → Ξ ) MATHEMATICAL ITALIC CAPITAL XI → GREEK CAPITAL LETTER XI    # 
+1D729 ;        039E ;  MA      # ( 𝜩 → Ξ ) MATHEMATICAL BOLD ITALIC CAPITAL XI → GREEK CAPITAL LETTER XI       # 
+1D763 ;        039E ;  MA      # ( 𝝣 → Ξ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL XI → GREEK CAPITAL LETTER XI   # 
+1D79D ;        039E ;  MA      # ( 𝞝 → Ξ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI → GREEK CAPITAL LETTER XI    # 
+
+220F ; 03A0 ;  MA      #* ( ∏ → Π ) N-ARY PRODUCT → GREEK CAPITAL LETTER PI     # 
+213F ; 03A0 ;  MA      # ( ℿ → Π ) DOUBLE-STRUCK CAPITAL PI → GREEK CAPITAL LETTER PI   # 
+1D6B7 ;        03A0 ;  MA      # ( 𝚷 → Π ) MATHEMATICAL BOLD CAPITAL PI → GREEK CAPITAL LETTER PI      # 
+1D6F1 ;        03A0 ;  MA      # ( 𝛱 → Π ) MATHEMATICAL ITALIC CAPITAL PI → GREEK CAPITAL LETTER PI    # 
+1D72B ;        03A0 ;  MA      # ( 𝜫 → Π ) MATHEMATICAL BOLD ITALIC CAPITAL PI → GREEK CAPITAL LETTER PI       # 
+1D765 ;        03A0 ;  MA      # ( 𝝥 → Π ) MATHEMATICAL SANS-SERIF BOLD CAPITAL PI → GREEK CAPITAL LETTER PI   # 
+1D79F ;        03A0 ;  MA      # ( 𝞟 → Π ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI → GREEK CAPITAL LETTER PI    # 
+2CA0 ; 03A0 ;  MA      # ( Ⲡ → Π ) COPTIC CAPITAL LETTER PI → GREEK CAPITAL LETTER PI   # 
+041F ; 03A0 ;  MA      # ( П → Π ) CYRILLIC CAPITAL LETTER PE → GREEK CAPITAL LETTER PI  # 
+
+1D6D3 ;        03C2 ;  MA      # ( 𝛓 → ς ) MATHEMATICAL BOLD SMALL FINAL SIGMA → GREEK SMALL LETTER FINAL SIGMA        # 
+1D70D ;        03C2 ;  MA      # ( 𝜍 → ς ) MATHEMATICAL ITALIC SMALL FINAL SIGMA → GREEK SMALL LETTER FINAL SIGMA      # 
+1D747 ;        03C2 ;  MA      # ( 𝝇 → ς ) MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA → GREEK SMALL LETTER FINAL SIGMA # 
+1D781 ;        03C2 ;  MA      # ( 𝞁 → ς ) MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA → GREEK SMALL LETTER FINAL SIGMA     # 
+1D7BB ;        03C2 ;  MA      # ( 𝞻 → ς ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA → GREEK SMALL LETTER FINAL SIGMA      # 
+
+1D6BD ;        03A6 ;  MA      # ( 𝚽 → Φ ) MATHEMATICAL BOLD CAPITAL PHI → GREEK CAPITAL LETTER PHI    # 
+1D6F7 ;        03A6 ;  MA      # ( 𝛷 → Φ ) MATHEMATICAL ITALIC CAPITAL PHI → GREEK CAPITAL LETTER PHI  # 
+1D731 ;        03A6 ;  MA      # ( 𝜱 → Φ ) MATHEMATICAL BOLD ITALIC CAPITAL PHI → GREEK CAPITAL LETTER PHI     # 
+1D76B ;        03A6 ;  MA      # ( 𝝫 → Φ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI → GREEK CAPITAL LETTER PHI # 
+1D7A5 ;        03A6 ;  MA      # ( 𝞥 → Φ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI → GREEK CAPITAL LETTER PHI  # 
+2CAA ; 03A6 ;  MA      # ( Ⲫ → Φ ) COPTIC CAPITAL LETTER FI → GREEK CAPITAL LETTER PHI  # 
+0424 ; 03A6 ;  MA      # ( Ф → Φ ) CYRILLIC CAPITAL LETTER EF → GREEK CAPITAL LETTER PHI # 
+0553 ; 03A6 ;  MA      # ( Փ → Φ ) ARMENIAN CAPITAL LETTER PIWR → GREEK CAPITAL LETTER PHI       # 
+
+1D6D8 ;        03C7 ;  MA      # ( 𝛘 → χ ) MATHEMATICAL BOLD SMALL CHI → GREEK SMALL LETTER CHI        # 
+1D712 ;        03C7 ;  MA      # ( 𝜒 → χ ) MATHEMATICAL ITALIC SMALL CHI → GREEK SMALL LETTER CHI      # 
+1D74C ;        03C7 ;  MA      # ( 𝝌 → χ ) MATHEMATICAL BOLD ITALIC SMALL CHI → GREEK SMALL LETTER CHI # 
+1D786 ;        03C7 ;  MA      # ( 𝞆 → χ ) MATHEMATICAL SANS-SERIF BOLD SMALL CHI → GREEK SMALL LETTER CHI     # 
+1D7C0 ;        03C7 ;  MA      # ( 𝟀 → χ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI → GREEK SMALL LETTER CHI      # 
+2CAD ; 03C7 ;  MA      # ( ⲭ → χ ) COPTIC SMALL LETTER KHI → GREEK SMALL LETTER CHI     # 
+
+1D6D9 ;        03C8 ;  MA      # ( 𝛙 → ψ ) MATHEMATICAL BOLD SMALL PSI → GREEK SMALL LETTER PSI        # 
+1D713 ;        03C8 ;  MA      # ( 𝜓 → ψ ) MATHEMATICAL ITALIC SMALL PSI → GREEK SMALL LETTER PSI      # 
+1D74D ;        03C8 ;  MA      # ( 𝝍 → ψ ) MATHEMATICAL BOLD ITALIC SMALL PSI → GREEK SMALL LETTER PSI # 
+1D787 ;        03C8 ;  MA      # ( 𝞇 → ψ ) MATHEMATICAL SANS-SERIF BOLD SMALL PSI → GREEK SMALL LETTER PSI     # 
+1D7C1 ;        03C8 ;  MA      # ( 𝟁 → ψ ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI → GREEK SMALL LETTER PSI      # 
+0471 ; 03C8 ;  MA      # ( ѱ → ψ ) CYRILLIC SMALL LETTER PSI → GREEK SMALL LETTER PSI    # 
+
+1D6BF ;        03A8 ;  MA      # ( 𝚿 → Ψ ) MATHEMATICAL BOLD CAPITAL PSI → GREEK CAPITAL LETTER PSI    # 
+1D6F9 ;        03A8 ;  MA      # ( 𝛹 → Ψ ) MATHEMATICAL ITALIC CAPITAL PSI → GREEK CAPITAL LETTER PSI  # 
+1D733 ;        03A8 ;  MA      # ( 𝜳 → Ψ ) MATHEMATICAL BOLD ITALIC CAPITAL PSI → GREEK CAPITAL LETTER PSI     # 
+1D76D ;        03A8 ;  MA      # ( 𝝭 → Ψ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI → GREEK CAPITAL LETTER PSI # 
+1D7A7 ;        03A8 ;  MA      # ( 𝞧 → Ψ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI → GREEK CAPITAL LETTER PSI  # 
+2CAE ; 03A8 ;  MA      # ( Ⲯ → Ψ ) COPTIC CAPITAL LETTER PSI → GREEK CAPITAL LETTER PSI # 
+0470 ; 03A8 ;  MA      # ( Ѱ → Ψ ) CYRILLIC CAPITAL LETTER PSI → GREEK CAPITAL LETTER PSI        # 
+
+2375 ; 03C9 ;  MA      #* ( ⍵ → ω ) APL FUNCTIONAL SYMBOL OMEGA → GREEK SMALL LETTER OMEGA      # 
+1D6DA ;        03C9 ;  MA      # ( 𝛚 → ω ) MATHEMATICAL BOLD SMALL OMEGA → GREEK SMALL LETTER OMEGA    # 
+1D714 ;        03C9 ;  MA      # ( 𝜔 → ω ) MATHEMATICAL ITALIC SMALL OMEGA → GREEK SMALL LETTER OMEGA  # 
+1D74E ;        03C9 ;  MA      # ( 𝝎 → ω ) MATHEMATICAL BOLD ITALIC SMALL OMEGA → GREEK SMALL LETTER OMEGA     # 
+1D788 ;        03C9 ;  MA      # ( 𝞈 → ω ) MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA → GREEK SMALL LETTER OMEGA # 
+1D7C2 ;        03C9 ;  MA      # ( 𝟂 → ω ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA → GREEK SMALL LETTER OMEGA  # 
+2CB1 ; 03C9 ;  MA      # ( ⲱ → ω ) COPTIC SMALL LETTER OOU → GREEK SMALL LETTER OMEGA   # 
+
+1F7D ; 1FF4 ;  MA      # ( ώ → ῴ ) GREEK SMALL LETTER OMEGA WITH OXIA → GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI   # 
+
+2630 ; 2CB6 ;  MA      #* ( ☰ → Ⲷ ) TRIGRAM FOR HEAVEN → COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE       # 
+
+2CDC ; 03EC ;  MA      # ( Ⳝ → Ϭ ) COPTIC CAPITAL LETTER OLD NUBIAN SHIMA → COPTIC CAPITAL LETTER SHIMA # 
+
+0497 ; 0436 0329 ;     MA      # ( җ → ж̩ ) CYRILLIC SMALL LETTER ZHE WITH DESCENDER → CYRILLIC SMALL LETTER ZHE, COMBINING VERTICAL LINE BELOW # 
+
+0496 ; 0416 0329 ;     MA      # ( Җ → Ж̩ ) CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER → CYRILLIC CAPITAL LETTER ZHE, COMBINING VERTICAL LINE BELOW     # 
+
+0419 ; 040D ;  MA      # ( Й → Ѝ ) CYRILLIC CAPITAL LETTER SHORT I → CYRILLIC CAPITAL LETTER I WITH GRAVE        # 
+
+048A ; 040D 0326 ;     MA      # ( Ҋ → Ѝ̦ ) CYRILLIC CAPITAL LETTER SHORT I WITH TAIL → CYRILLIC CAPITAL LETTER I WITH GRAVE, COMBINING COMMA BELOW     # →Й̡→
+
+045D ; 0439 ;  MA      # ( ѝ → й ) CYRILLIC SMALL LETTER I WITH GRAVE → CYRILLIC SMALL LETTER SHORT I    # 
+
+048B ; 0439 0326 ;     MA      # ( ҋ → й̦ ) CYRILLIC SMALL LETTER SHORT I WITH TAIL → CYRILLIC SMALL LETTER SHORT I, COMBINING COMMA BELOW      # →й̡→
+
+1D2B ; 043B ;  MA      # ( ᴫ → л ) CYRILLIC LETTER SMALL CAPITAL EL → CYRILLIC SMALL LETTER EL  # 
+
+04C6 ; 043B 0326 ;     MA      # ( ӆ → л̦ ) CYRILLIC SMALL LETTER EL WITH TAIL → CYRILLIC SMALL LETTER EL, COMBINING COMMA BELOW        # →л̡→
+
+047C ; 0460 0483 ;     MA      # ( Ѽ → Ѡ҃ ) CYRILLIC CAPITAL LETTER OMEGA WITH TITLO → CYRILLIC CAPITAL LETTER OMEGA, COMBINING CYRILLIC TITLO  # 
+
+04CC ; 04B7 ;  MA      # ( ӌ → ҷ ) CYRILLIC SMALL LETTER KHAKASSIAN CHE → CYRILLIC SMALL LETTER CHE WITH DESCENDER       # 
+
+04CB ; 04B6 ;  MA      # ( Ӌ → Ҷ ) CYRILLIC CAPITAL LETTER KHAKASSIAN CHE → CYRILLIC CAPITAL LETTER CHE WITH DESCENDER   # 
+
+04BF ; 04BD 0328 ;     MA      # ( ҿ → ҽ̨ ) CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER → CYRILLIC SMALL LETTER ABKHASIAN CHE, COMBINING OGONEK  # →ҽ̢→
+
+04BE ; 04BC 0328 ;     MA      # ( Ҿ → Ҽ̨ ) CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER → CYRILLIC CAPITAL LETTER ABKHASIAN CHE, COMBINING OGONEK      # 
+
+2CBD ; 0448 ;  MA      # ( ⲽ → ш ) COPTIC SMALL LETTER CRYPTOGRAMMIC NI → CYRILLIC SMALL LETTER SHA     # 
+
+2CBC ; 0428 ;  MA      # ( Ⲽ → Ш ) COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI → CYRILLIC CAPITAL LETTER SHA # 
+
+044B ; 044C 0131 ;     MA      # ( ы → ьı ) CYRILLIC SMALL LETTER YERU → CYRILLIC SMALL LETTER SOFT SIGN, LATIN SMALL LETTER DOTLESS I  # 
+
+2108 ; 042D ;  MA      #* ( ℈ → Э ) SCRUPLE → CYRILLIC CAPITAL LETTER E # 
+
+0587 ; 0565 0582 ;     MA      # ( և → եւ ) ARMENIAN SMALL LIGATURE ECH YIWN → ARMENIAN SMALL LETTER ECH, ARMENIAN SMALL LETTER YIWN    # 
+
+FB14 ; 0574 0565 ;     MA      # ( ﬔ → մե ) ARMENIAN SMALL LIGATURE MEN ECH → ARMENIAN SMALL LETTER MEN, ARMENIAN SMALL LETTER ECH     # 
+
+FB15 ; 0574 056B ;     MA      # ( ﬕ → մի ) ARMENIAN SMALL LIGATURE MEN INI → ARMENIAN SMALL LETTER MEN, ARMENIAN SMALL LETTER INI     # 
+
+FB17 ; 0574 056D ;     MA      # ( ﬗ → մխ ) ARMENIAN SMALL LIGATURE MEN XEH → ARMENIAN SMALL LETTER MEN, ARMENIAN SMALL LETTER XEH     # 
+
+FB13 ; 0574 0576 ;     MA      # ( ﬓ → մն ) ARMENIAN SMALL LIGATURE MEN NOW → ARMENIAN SMALL LETTER MEN, ARMENIAN SMALL LETTER NOW     # 
+
+FB16 ; 057E 0576 ;     MA      # ( ﬖ → վն ) ARMENIAN SMALL LIGATURE VEW NOW → ARMENIAN SMALL LETTER VEW, ARMENIAN SMALL LETTER NOW     # 
+
+02D3 ; 0559 ;  MA      #* ( ˓ → ՙ ) MODIFIER LETTER CENTRED LEFT HALF RING → ARMENIAN MODIFIER LETTER LEFT HALF RING     # 
+02BF ; 0559 ;  MA      # ( ʿ → ՙ ) MODIFIER LETTER LEFT HALF RING → ARMENIAN MODIFIER LETTER LEFT HALF RING      # 
+
+2135 ; 05D0 ;  MA      # ( ℵ → ‎א‎ ) ALEF SYMBOL → HEBREW LETTER ALEF       # 
+FB21 ; 05D0 ;  MA      # ( ‎ﬡ‎ → ‎א‎ ) HEBREW LETTER WIDE ALEF → HEBREW LETTER ALEF     # 
+
+FB2F ; FB2E ;  MA      # ( ‎אָ‎ → ‎אַ‎ ) HEBREW LETTER ALEF WITH QAMATS → HEBREW LETTER ALEF WITH PATAH  # 
+FB30 ; FB2E ;  MA      # ( ‎אּ‎ → ‎אַ‎ ) HEBREW LETTER ALEF WITH MAPIQ → HEBREW LETTER ALEF WITH PATAH   # 
+
+FB4F ; 05D0 05DC ;     MA      # ( ‎ﭏ‎ → ‎אל‎ ) HEBREW LIGATURE ALEF LAMED → HEBREW LETTER ALEF, HEBREW LETTER LAMED   # 
+
+2136 ; 05D1 ;  MA      # ( ℶ → ‎ב‎ ) BET SYMBOL → HEBREW LETTER BET # 
+
+2137 ; 05D2 ;  MA      # ( ℷ → ‎ג‎ ) GIMEL SYMBOL → HEBREW LETTER GIMEL     # 
+
+2138 ; 05D3 ;  MA      # ( ℸ → ‎ד‎ ) DALET SYMBOL → HEBREW LETTER DALET     # 
+FB22 ; 05D3 ;  MA      # ( ‎ﬢ‎ → ‎ד‎ ) HEBREW LETTER WIDE DALET → HEBREW LETTER DALET   # 
+
+FB23 ; 05D4 ;  MA      # ( ‎ﬣ‎ → ‎ה‎ ) HEBREW LETTER WIDE HE → HEBREW LETTER HE # 
+
+FB39 ; FB1D ;  MA      # ( ‎יּ‎ → ‎יִ‎ ) HEBREW LETTER YOD WITH DAGESH → HEBREW LETTER YOD WITH HIRIQ    # 
+
+FB24 ; 05DB ;  MA      # ( ‎ﬤ‎ → ‎כ‎ ) HEBREW LETTER WIDE KAF → HEBREW LETTER KAF       # 
+
+FB25 ; 05DC ;  MA      # ( ‎ﬥ‎ → ‎ל‎ ) HEBREW LETTER WIDE LAMED → HEBREW LETTER LAMED   # 
+
+FB26 ; 05DD ;  MA      # ( ‎ﬦ‎ → ‎ם‎ ) HEBREW LETTER WIDE FINAL MEM → HEBREW LETTER FINAL MEM   # 
+
+FB20 ; 05E2 ;  MA      # ( ‎ﬠ‎ → ‎ע‎ ) HEBREW LETTER ALTERNATIVE AYIN → HEBREW LETTER AYIN      # 
+
+FB27 ; 05E8 ;  MA      # ( ‎ﬧ‎ → ‎ר‎ ) HEBREW LETTER WIDE RESH → HEBREW LETTER RESH     # 
+
+FB2B ; FB2A ;  MA      # ( ‎שׂ‎ → ‎שׁ‎ ) HEBREW LETTER SHIN WITH SIN DOT → HEBREW LETTER SHIN WITH SHIN DOT      # 
+FB49 ; FB2A ;  MA      # ( ‎שּ‎ → ‎שׁ‎ ) HEBREW LETTER SHIN WITH DAGESH → HEBREW LETTER SHIN WITH SHIN DOT       # 
+
+FB2D ; FB2C ;  MA      # ( ‎שּׂ‎ → ‎שּׁ‎ ) HEBREW LETTER SHIN WITH DAGESH AND SIN DOT → HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT        # 
+
+FB28 ; 05EA ;  MA      # ( ‎ﬨ‎ → ‎ת‎ ) HEBREW LETTER WIDE TAV → HEBREW LETTER TAV       # 
+
+FE80 ; 0621 ;  MA      # ( ‎ﺀ‎ → ‎ء‎ ) ARABIC LETTER HAMZA ISOLATED FORM → ARABIC LETTER HAMZA  # 
+
+FE82 ; 0622 ;  MA      # ( ‎ﺂ‎ → ‎آ‎ ) ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM → ARABIC LETTER ALEF WITH MADDA ABOVE     # 
+FE81 ; 0622 ;  MA      # ( ‎ﺁ‎ → ‎آ‎ ) ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM → ARABIC LETTER ALEF WITH MADDA ABOVE  # 
+
+FB51 ; 0671 ;  MA      # ( ‎ﭑ‎ → ‎ٱ‎ ) ARABIC LETTER ALEF WASLA FINAL FORM → ARABIC LETTER ALEF WASLA   # 
+FB50 ; 0671 ;  MA      # ( ‎ﭐ‎ → ‎ٱ‎ ) ARABIC LETTER ALEF WASLA ISOLATED FORM → ARABIC LETTER ALEF WASLA        # 
+
+FE88 ; 0625 ;  MA      # ( ‎ﺈ‎ → ‎إ‎ ) ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM → ARABIC LETTER ALEF WITH HAMZA BELOW     # 
+FE87 ; 0625 ;  MA      # ( ‎ﺇ‎ → ‎إ‎ ) ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM → ARABIC LETTER ALEF WITH HAMZA BELOW  # 
+
+FE8E ; 0627 ;  MA      # ( ‎ﺎ‎ → ‎ا‎ ) ARABIC LETTER ALEF FINAL FORM → ARABIC LETTER ALEF       # 
+FE8D ; 0627 ;  MA      # ( ‎ﺍ‎ → ‎ا‎ ) ARABIC LETTER ALEF ISOLATED FORM → ARABIC LETTER ALEF    # 
+
+FD3C ; 0627 064B ;     MA      # ( ‎ﴼ‎ → ‎اً‎ ) ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM → ARABIC LETTER ALEF, ARABIC FATHATAN    # 
+FD3D ; 0627 064B ;     MA      # ( ‎ﴽ‎ → ‎اً‎ ) ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM → ARABIC LETTER ALEF, ARABIC FATHATAN # 
+
+0623 ; 0627 0674 ;     MA      # ( ‎أ‎ → ‎اٴ‎ ) ARABIC LETTER ALEF WITH HAMZA ABOVE → ARABIC LETTER ALEF, ARABIC LETTER HIGH HAMZA      # →‎ٵ‎→
+FE84 ; 0627 0674 ;     MA      # ( ‎ﺄ‎ → ‎اٴ‎ ) ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM → ARABIC LETTER ALEF, ARABIC LETTER HIGH HAMZA  # →‎أ‎→→‎ٵ‎→
+FE83 ; 0627 0674 ;     MA      # ( ‎ﺃ‎ → ‎اٴ‎ ) ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM → ARABIC LETTER ALEF, ARABIC LETTER HIGH HAMZA       # →‎ٵ‎→
+0675 ; 0627 0674 ;     MA      # ( ‎ٵ‎ → ‎اٴ‎ ) ARABIC LETTER HIGH HAMZA ALEF → ARABIC LETTER ALEF, ARABIC LETTER HIGH HAMZA    # 
+
+FDF3 ; 0627 0643 0628 0631 ;   MA      # ( ‎ﷳ‎ → ‎اكبر‎ ) ARABIC LIGATURE AKBAR ISOLATED FORM → ARABIC LETTER ALEF, ARABIC LETTER KAF, ARABIC LETTER BEH, ARABIC LETTER REH  # 
+
+FDF2 ; 0627 0644 0644 0647 ;   MA      # ( ‎ﷲ‎ → ‎الله‎ ) ARABIC LIGATURE ALLAH ISOLATED FORM → ARABIC LETTER ALEF, ARABIC LETTER LAM, ARABIC LETTER LAM, ARABIC LETTER HEH  # 
+
+FE91 ; 0628 ;  MA      # ( ‎ﺑ‎ → ‎ب‎ ) ARABIC LETTER BEH INITIAL FORM → ARABIC LETTER BEH       # 
+FE92 ; 0628 ;  MA      # ( ‎ﺒ‎ → ‎ب‎ ) ARABIC LETTER BEH MEDIAL FORM → ARABIC LETTER BEH        # 
+FE90 ; 0628 ;  MA      # ( ‎ﺐ‎ → ‎ب‎ ) ARABIC LETTER BEH FINAL FORM → ARABIC LETTER BEH # 
+FE8F ; 0628 ;  MA      # ( ‎ﺏ‎ → ‎ب‎ ) ARABIC LETTER BEH ISOLATED FORM → ARABIC LETTER BEH      # 
+0646 ; 0628 ;  MA      # ( ‎ن‎ → ‎ب‎ ) ARABIC LETTER NOON → ARABIC LETTER BEH    # →‎ﻨ‎→→‎ﺒ‎→
+FEE7 ; 0628 ;  MA      # ( ‎ﻧ‎ → ‎ب‎ ) ARABIC LETTER NOON INITIAL FORM → ARABIC LETTER BEH      # →‎ﺒ‎→
+FEE8 ; 0628 ;  MA      # ( ‎ﻨ‎ → ‎ب‎ ) ARABIC LETTER NOON MEDIAL FORM → ARABIC LETTER BEH       # →‎ﺒ‎→
+FEE6 ; 0628 ;  MA      # ( ‎ﻦ‎ → ‎ب‎ ) ARABIC LETTER NOON FINAL FORM → ARABIC LETTER BEH        # →‎ن‎→→‎ﻨ‎→→‎ﺒ‎→
+FEE5 ; 0628 ;  MA      # ( ‎ﻥ‎ → ‎ب‎ ) ARABIC LETTER NOON ISOLATED FORM → ARABIC LETTER BEH     # →‎ن‎→→‎ﻨ‎→→‎ﺒ‎→
+
+FC6D ; 0628 0628 ;     MA      # ( ‎ﱭ‎ → ‎بب‎ ) ARABIC LIGATURE BEH WITH NOON FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER BEH        # →‎بن‎→
+FC8D ; 0628 0628 ;     MA      # ( ‎ﲍ‎ → ‎بب‎ ) ARABIC LIGATURE NOON WITH NOON FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER BEH       # →‎نن‎→
+
+FC9C ; 0628 062C ;     MA      # ( ‎ﲜ‎ → ‎بج‎ ) ARABIC LIGATURE BEH WITH JEEM INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM     # 
+FC05 ; 0628 062C ;     MA      # ( ‎ﰅ‎ → ‎بج‎ ) ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM    # 
+FC9E ; 0628 062C ;     MA      # ( ‎ﲞ‎ → ‎بج‎ ) ARABIC LIGATURE BEH WITH KHAH INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM     # →‎بخ‎→→‎ﰇ‎→→‎ﰅ‎→
+FC07 ; 0628 062C ;     MA      # ( ‎ﰇ‎ → ‎بج‎ ) ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM    # →‎ﰅ‎→
+FCD2 ; 0628 062C ;     MA      # ( ‎ﳒ‎ → ‎بج‎ ) ARABIC LIGATURE NOON WITH JEEM INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM    # →‎ﲞ‎→→‎بخ‎→→‎ﰇ‎→→‎ﰅ‎→
+FC4B ; 0628 062C ;     MA      # ( ‎ﱋ‎ → ‎بج‎ ) ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM   # →‎نج‎→→‎ﳒ‎→→‎ﲞ‎→→‎بخ‎→→‎ﰇ‎→→‎ﰅ‎→
+FCD4 ; 0628 062C ;     MA      # ( ‎ﳔ‎ → ‎بج‎ ) ARABIC LIGATURE NOON WITH KHAH INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM    # →‎نخ‎→→‎ﱍ‎→→‎ﱋ‎→→‎نج‎→→‎ﳒ‎→→‎ﲞ‎→→‎بخ‎→→‎ﰇ‎→→‎ﰅ‎→
+FC4D ; 0628 062C ;     MA      # ( ‎ﱍ‎ → ‎بج‎ ) ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM   # →‎ﱋ‎→→‎نج‎→→‎ﳒ‎→→‎ﲞ‎→→‎بخ‎→→‎ﰇ‎→→‎ﰅ‎→
+
+FDB8 ; 0628 062C 062D ;        MA      # ( ‎ﶸ‎ → ‎بجح‎ ) ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM, ARABIC LETTER HAH      # →‎نجح‎→
+FDBD ; 0628 062C 062D ;        MA      # ( ‎ﶽ‎ → ‎بجح‎ ) ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM, ARABIC LETTER HAH        # →‎نجح‎→
+
+FD98 ; 0628 062C 0645 ;        MA      # ( ‎ﶘ‎ → ‎بجم‎ ) ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM, ARABIC LETTER MEEM    # →‎نجم‎→
+FD97 ; 0628 062C 0645 ;        MA      # ( ‎ﶗ‎ → ‎بجم‎ ) ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM, ARABIC LETTER MEEM      # →‎نجم‎→
+
+FD9E ; 0628 062C 0649 ;        MA      # ( ‎ﶞ‎ → ‎بجى‎ ) ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA        # →‎بخي‎→
+FD99 ; 0628 062C 0649 ;        MA      # ( ‎ﶙ‎ → ‎بجى‎ ) ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA      # →‎نجى‎→
+FDC7 ; 0628 062C 0649 ;        MA      # ( ‎ﷇ‎ → ‎بجى‎ ) ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA       # →‎نجي‎→
+
+FC9D ; 0628 062D ;     MA      # ( ‎ﲝ‎ → ‎بح‎ ) ARABIC LIGATURE BEH WITH HAH INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER HAH       # 
+FC06 ; 0628 062D ;     MA      # ( ‎ﰆ‎ → ‎بح‎ ) ARABIC LIGATURE BEH WITH HAH ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER HAH      # 
+FCD3 ; 0628 062D ;     MA      # ( ‎ﳓ‎ → ‎بح‎ ) ARABIC LIGATURE NOON WITH HAH INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER HAH      # →‎نح‎→
+FC4C ; 0628 062D ;     MA      # ( ‎ﱌ‎ → ‎بح‎ ) ARABIC LIGATURE NOON WITH HAH ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER HAH     # →‎نح‎→
+
+FD95 ; 0628 062D 0645 ;        MA      # ( ‎ﶕ‎ → ‎بحم‎ ) ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER HAH, ARABIC LETTER MEEM      # →‎نحم‎→
+
+FDC2 ; 0628 062D 0649 ;        MA      # ( ‎ﷂ‎ → ‎بحى‎ ) ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA  # →‎بحي‎→
+FD96 ; 0628 062D 0649 ;        MA      # ( ‎ﶖ‎ → ‎بحى‎ ) ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA        # →‎نحى‎→
+FDB3 ; 0628 062D 0649 ;        MA      # ( ‎ﶳ‎ → ‎بحى‎ ) ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA # →‎نحي‎→
+
+FC6A ; 0628 0631 ;     MA      # ( ‎ﱪ‎ → ‎بر‎ ) ARABIC LIGATURE BEH WITH REH FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER REH # 
+FC8A ; 0628 0631 ;     MA      # ( ‎ﲊ‎ → ‎بر‎ ) ARABIC LIGATURE NOON WITH REH FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER REH        # →‎نر‎→
+
+FC6B ; 0628 0632 ;     MA      # ( ‎ﱫ‎ → ‎بز‎ ) ARABIC LIGATURE BEH WITH ZAIN FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER ZAIN       # 
+FC8B ; 0628 0632 ;     MA      # ( ‎ﲋ‎ → ‎بز‎ ) ARABIC LIGATURE NOON WITH ZAIN FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER ZAIN      # →‎نز‎→
+
+FC9F ; 0628 0645 ;     MA      # ( ‎ﲟ‎ → ‎بم‎ ) ARABIC LIGATURE BEH WITH MEEM INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER MEEM     # 
+FCE1 ; 0628 0645 ;     MA      # ( ‎ﳡ‎ → ‎بم‎ ) ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM → ARABIC LETTER BEH, ARABIC LETTER MEEM      # 
+FC6C ; 0628 0645 ;     MA      # ( ‎ﱬ‎ → ‎بم‎ ) ARABIC LIGATURE BEH WITH MEEM FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER MEEM       # 
+FC08 ; 0628 0645 ;     MA      # ( ‎ﰈ‎ → ‎بم‎ ) ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER MEEM    # 
+FCD5 ; 0628 0645 ;     MA      # ( ‎ﳕ‎ → ‎بم‎ ) ARABIC LIGATURE NOON WITH MEEM INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER MEEM    # →‎نم‎→
+FCEE ; 0628 0645 ;     MA      # ( ‎ﳮ‎ → ‎بم‎ ) ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM → ARABIC LETTER BEH, ARABIC LETTER MEEM     # →‎نم‎→
+FC8C ; 0628 0645 ;     MA      # ( ‎ﲌ‎ → ‎بم‎ ) ARABIC LIGATURE NOON WITH MEEM FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER MEEM      # →‎نم‎→
+FC4E ; 0628 0645 ;     MA      # ( ‎ﱎ‎ → ‎بم‎ ) ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER MEEM   # →‎نم‎→
+
+FD9B ; 0628 0645 0649 ;        MA      # ( ‎ﶛ‎ → ‎بمى‎ ) ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA      # →‎نمى‎→
+FD9A ; 0628 0645 0649 ;        MA      # ( ‎ﶚ‎ → ‎بمى‎ ) ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA       # →‎نمي‎→
+
+FCA0 ; 0628 0647 ;     MA      # ( ‎ﲠ‎ → ‎به‎ ) ARABIC LIGATURE BEH WITH HEH INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER HEH       # 
+FCE2 ; 0628 0647 ;     MA      # ( ‎ﳢ‎ → ‎به‎ ) ARABIC LIGATURE BEH WITH HEH MEDIAL FORM → ARABIC LETTER BEH, ARABIC LETTER HEH        # 
+FCD6 ; 0628 0647 ;     MA      # ( ‎ﳖ‎ → ‎به‎ ) ARABIC LIGATURE NOON WITH HEH INITIAL FORM → ARABIC LETTER BEH, ARABIC LETTER HEH      # →‎نه‎→
+FCEF ; 0628 0647 ;     MA      # ( ‎ﳯ‎ → ‎به‎ ) ARABIC LIGATURE NOON WITH HEH MEDIAL FORM → ARABIC LETTER BEH, ARABIC LETTER HEH       # →‎نه‎→
+
+FC6E ; 0628 0649 ;     MA      # ( ‎ﱮ‎ → ‎بى‎ ) ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER ALEF MAKSURA       # 
+FC09 ; 0628 0649 ;     MA      # ( ‎ﰉ‎ → ‎بى‎ ) ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER ALEF MAKSURA    # 
+FC6F ; 0628 0649 ;     MA      # ( ‎ﱯ‎ → ‎بى‎ ) ARABIC LIGATURE BEH WITH YEH FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER ALEF MAKSURA        # →‎بي‎→
+FC0A ; 0628 0649 ;     MA      # ( ‎ﰊ‎ → ‎بى‎ ) ARABIC LIGATURE BEH WITH YEH ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER ALEF MAKSURA     # →‎بي‎→
+FC8E ; 0628 0649 ;     MA      # ( ‎ﲎ‎ → ‎بى‎ ) ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER ALEF MAKSURA      # →‎نى‎→
+FC4F ; 0628 0649 ;     MA      # ( ‎ﱏ‎ → ‎بى‎ ) ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER ALEF MAKSURA   # →‎نى‎→
+FC8F ; 0628 0649 ;     MA      # ( ‎ﲏ‎ → ‎بى‎ ) ARABIC LIGATURE NOON WITH YEH FINAL FORM → ARABIC LETTER BEH, ARABIC LETTER ALEF MAKSURA       # →‎ني‎→
+FC50 ; 0628 0649 ;     MA      # ( ‎ﱐ‎ → ‎بى‎ ) ARABIC LIGATURE NOON WITH YEH ISOLATED FORM → ARABIC LETTER BEH, ARABIC LETTER ALEF MAKSURA    # →‎ني‎→
+
+FB58 ; 067E ;  MA      # ( ‎ﭘ‎ → ‎پ‎ ) ARABIC LETTER PEH INITIAL FORM → ARABIC LETTER PEH       # 
+FB59 ; 067E ;  MA      # ( ‎ﭙ‎ → ‎پ‎ ) ARABIC LETTER PEH MEDIAL FORM → ARABIC LETTER PEH        # 
+FB57 ; 067E ;  MA      # ( ‎ﭗ‎ → ‎پ‎ ) ARABIC LETTER PEH FINAL FORM → ARABIC LETTER PEH # 
+FB56 ; 067E ;  MA      # ( ‎ﭖ‎ → ‎پ‎ ) ARABIC LETTER PEH ISOLATED FORM → ARABIC LETTER PEH      # 
+
+FE97 ; 062A ;  MA      # ( ‎ﺗ‎ → ‎ت‎ ) ARABIC LETTER TEH INITIAL FORM → ARABIC LETTER TEH       # 
+FE98 ; 062A ;  MA      # ( ‎ﺘ‎ → ‎ت‎ ) ARABIC LETTER TEH MEDIAL FORM → ARABIC LETTER TEH        # 
+FE96 ; 062A ;  MA      # ( ‎ﺖ‎ → ‎ت‎ ) ARABIC LETTER TEH FINAL FORM → ARABIC LETTER TEH # 
+FE95 ; 062A ;  MA      # ( ‎ﺕ‎ → ‎ت‎ ) ARABIC LETTER TEH ISOLATED FORM → ARABIC LETTER TEH      # 
+
+FC73 ; 062A 0628 ;     MA      # ( ‎ﱳ‎ → ‎تب‎ ) ARABIC LIGATURE TEH WITH NOON FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER BEH        # →‎تن‎→
+
+FCA1 ; 062A 062C ;     MA      # ( ‎ﲡ‎ → ‎تج‎ ) ARABIC LIGATURE TEH WITH JEEM INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM     # 
+FC0B ; 062A 062C ;     MA      # ( ‎ﰋ‎ → ‎تج‎ ) ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM    # 
+FCA3 ; 062A 062C ;     MA      # ( ‎ﲣ‎ → ‎تج‎ ) ARABIC LIGATURE TEH WITH KHAH INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM     # →‎تخ‎→→‎ﰍ‎→→‎ﰋ‎→
+FC0D ; 062A 062C ;     MA      # ( ‎ﰍ‎ → ‎تج‎ ) ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM    # →‎ﰋ‎→
+FCDA ; 062A 062C ;     MA      # ( ‎ﳚ‎ → ‎تج‎ ) ARABIC LIGATURE YEH WITH JEEM INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM     # →‎ﲡ‎→
+FC55 ; 062A 062C ;     MA      # ( ‎ﱕ‎ → ‎تج‎ ) ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM    # →‎يج‎→→‎ﳚ‎→→‎ﲡ‎→
+FCDC ; 062A 062C ;     MA      # ( ‎ﳜ‎ → ‎تج‎ ) ARABIC LIGATURE YEH WITH KHAH INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM     # →‎ﲣ‎→→‎تخ‎→→‎ﰍ‎→→‎ﰋ‎→
+FC57 ; 062A 062C ;     MA      # ( ‎ﱗ‎ → ‎تج‎ ) ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM    # →‎ﱕ‎→→‎يج‎→→‎ﳚ‎→→‎ﲡ‎→
+
+FD50 ; 062A 062C 0645 ;        MA      # ( ‎ﵐ‎ → ‎تجم‎ ) ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM, ARABIC LETTER MEEM     # 
+FD54 ; 062A 062C 0645 ;        MA      # ( ‎ﵔ‎ → ‎تجم‎ ) ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM, ARABIC LETTER MEEM     # →‎تخم‎→
+
+FDA0 ; 062A 062C 0649 ;        MA      # ( ‎ﶠ‎ → ‎تجى‎ ) ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA       # 
+FD9F ; 062A 062C 0649 ;        MA      # ( ‎ﶟ‎ → ‎تجى‎ ) ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA        # →‎تجي‎→
+FDA2 ; 062A 062C 0649 ;        MA      # ( ‎ﶢ‎ → ‎تجى‎ ) ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA       # →‎تخى‎→
+FDA1 ; 062A 062C 0649 ;        MA      # ( ‎ﶡ‎ → ‎تجى‎ ) ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA        # →‎تخي‎→
+
+FCA2 ; 062A 062D ;     MA      # ( ‎ﲢ‎ → ‎تح‎ ) ARABIC LIGATURE TEH WITH HAH INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER HAH       # 
+FC0C ; 062A 062D ;     MA      # ( ‎ﰌ‎ → ‎تح‎ ) ARABIC LIGATURE TEH WITH HAH ISOLATED FORM → ARABIC LETTER TEH, ARABIC LETTER HAH      # 
+FCDB ; 062A 062D ;     MA      # ( ‎ﳛ‎ → ‎تح‎ ) ARABIC LIGATURE YEH WITH HAH INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER HAH       # →‎ﲢ‎→
+FC56 ; 062A 062D ;     MA      # ( ‎ﱖ‎ → ‎تح‎ ) ARABIC LIGATURE YEH WITH HAH ISOLATED FORM → ARABIC LETTER TEH, ARABIC LETTER HAH      # →‎يح‎→→‎ﳛ‎→→‎ﲢ‎→
+
+FD52 ; 062A 062D 062C ;        MA      # ( ‎ﵒ‎ → ‎تحج‎ ) ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER HAH, ARABIC LETTER JEEM       # 
+FD51 ; 062A 062D 062C ;        MA      # ( ‎ﵑ‎ → ‎تحج‎ ) ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER HAH, ARABIC LETTER JEEM # 
+
+FD53 ; 062A 062D 0645 ;        MA      # ( ‎ﵓ‎ → ‎تحم‎ ) ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER HAH, ARABIC LETTER MEEM       # 
+
+FC70 ; 062A 0631 ;     MA      # ( ‎ﱰ‎ → ‎تر‎ ) ARABIC LIGATURE TEH WITH REH FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER REH # 
+
+FC71 ; 062A 0632 ;     MA      # ( ‎ﱱ‎ → ‎تز‎ ) ARABIC LIGATURE TEH WITH ZAIN FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER ZAIN       # 
+
+FCA4 ; 062A 0645 ;     MA      # ( ‎ﲤ‎ → ‎تم‎ ) ARABIC LIGATURE TEH WITH MEEM INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER MEEM     # 
+FCE3 ; 062A 0645 ;     MA      # ( ‎ﳣ‎ → ‎تم‎ ) ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM → ARABIC LETTER TEH, ARABIC LETTER MEEM      # 
+FC72 ; 062A 0645 ;     MA      # ( ‎ﱲ‎ → ‎تم‎ ) ARABIC LIGATURE TEH WITH MEEM FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER MEEM       # 
+FC0E ; 062A 0645 ;     MA      # ( ‎ﰎ‎ → ‎تم‎ ) ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM → ARABIC LETTER TEH, ARABIC LETTER MEEM    # 
+
+FD55 ; 062A 0645 062C ;        MA      # ( ‎ﵕ‎ → ‎تمج‎ ) ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER MEEM, ARABIC LETTER JEEM     # 
+FD57 ; 062A 0645 062C ;        MA      # ( ‎ﵗ‎ → ‎تمج‎ ) ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER MEEM, ARABIC LETTER JEEM     # →‎تمخ‎→
+
+FD56 ; 062A 0645 062D ;        MA      # ( ‎ﵖ‎ → ‎تمح‎ ) ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER MEEM, ARABIC LETTER HAH       # 
+
+FDA4 ; 062A 0645 0649 ;        MA      # ( ‎ﶤ‎ → ‎تمى‎ ) ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA       # 
+FDA3 ; 062A 0645 0649 ;        MA      # ( ‎ﶣ‎ → ‎تمى‎ ) ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA        # →‎تمي‎→
+
+FCA5 ; 062A 0647 ;     MA      # ( ‎ﲥ‎ → ‎ته‎ ) ARABIC LIGATURE TEH WITH HEH INITIAL FORM → ARABIC LETTER TEH, ARABIC LETTER HEH       # 
+FCE4 ; 062A 0647 ;     MA      # ( ‎ﳤ‎ → ‎ته‎ ) ARABIC LIGATURE TEH WITH HEH MEDIAL FORM → ARABIC LETTER TEH, ARABIC LETTER HEH        # 
+
+FC74 ; 062A 0649 ;     MA      # ( ‎ﱴ‎ → ‎تى‎ ) ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER ALEF MAKSURA       # 
+FC0F ; 062A 0649 ;     MA      # ( ‎ﰏ‎ → ‎تى‎ ) ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER TEH, ARABIC LETTER ALEF MAKSURA    # 
+FC75 ; 062A 0649 ;     MA      # ( ‎ﱵ‎ → ‎تى‎ ) ARABIC LIGATURE TEH WITH YEH FINAL FORM → ARABIC LETTER TEH, ARABIC LETTER ALEF MAKSURA        # →‎تي‎→
+FC10 ; 062A 0649 ;     MA      # ( ‎ﰐ‎ → ‎تى‎ ) ARABIC LIGATURE TEH WITH YEH ISOLATED FORM → ARABIC LETTER TEH, ARABIC LETTER ALEF MAKSURA     # →‎تي‎→
+
+FE9B ; 062B ;  MA      # ( ‎ﺛ‎ → ‎ث‎ ) ARABIC LETTER THEH INITIAL FORM → ARABIC LETTER THEH     # 
+FE9C ; 062B ;  MA      # ( ‎ﺜ‎ → ‎ث‎ ) ARABIC LETTER THEH MEDIAL FORM → ARABIC LETTER THEH      # 
+FE9A ; 062B ;  MA      # ( ‎ﺚ‎ → ‎ث‎ ) ARABIC LETTER THEH FINAL FORM → ARABIC LETTER THEH       # 
+FE99 ; 062B ;  MA      # ( ‎ﺙ‎ → ‎ث‎ ) ARABIC LETTER THEH ISOLATED FORM → ARABIC LETTER THEH    # 
+
+FC79 ; 062B 0628 ;     MA      # ( ‎ﱹ‎ → ‎ثب‎ ) ARABIC LIGATURE THEH WITH NOON FINAL FORM → ARABIC LETTER THEH, ARABIC LETTER BEH      # →‎ثن‎→
+
+FC11 ; 062B 062C ;     MA      # ( ‎ﰑ‎ → ‎ثج‎ ) ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM → ARABIC LETTER THEH, ARABIC LETTER JEEM  # 
+
+FC76 ; 062B 0631 ;     MA      # ( ‎ﱶ‎ → ‎ثر‎ ) ARABIC LIGATURE THEH WITH REH FINAL FORM → ARABIC LETTER THEH, ARABIC LETTER REH       # 
+
+FC77 ; 062B 0632 ;     MA      # ( ‎ﱷ‎ → ‎ثز‎ ) ARABIC LIGATURE THEH WITH ZAIN FINAL FORM → ARABIC LETTER THEH, ARABIC LETTER ZAIN     # 
+
+FCA6 ; 062B 0645 ;     MA      # ( ‎ﲦ‎ → ‎ثم‎ ) ARABIC LIGATURE THEH WITH MEEM INITIAL FORM → ARABIC LETTER THEH, ARABIC LETTER MEEM   # 
+FCE5 ; 062B 0645 ;     MA      # ( ‎ﳥ‎ → ‎ثم‎ ) ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM → ARABIC LETTER THEH, ARABIC LETTER MEEM    # 
+FC78 ; 062B 0645 ;     MA      # ( ‎ﱸ‎ → ‎ثم‎ ) ARABIC LIGATURE THEH WITH MEEM FINAL FORM → ARABIC LETTER THEH, ARABIC LETTER MEEM     # 
+FC12 ; 062B 0645 ;     MA      # ( ‎ﰒ‎ → ‎ثم‎ ) ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM → ARABIC LETTER THEH, ARABIC LETTER MEEM  # 
+
+FCE6 ; 062B 0647 ;     MA      # ( ‎ﳦ‎ → ‎ثه‎ ) ARABIC LIGATURE THEH WITH HEH MEDIAL FORM → ARABIC LETTER THEH, ARABIC LETTER HEH      # 
+
+FC7A ; 062B 0649 ;     MA      # ( ‎ﱺ‎ → ‎ثى‎ ) ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER THEH, ARABIC LETTER ALEF MAKSURA     # 
+FC13 ; 062B 0649 ;     MA      # ( ‎ﰓ‎ → ‎ثى‎ ) ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER THEH, ARABIC LETTER ALEF MAKSURA  # 
+FC7B ; 062B 0649 ;     MA      # ( ‎ﱻ‎ → ‎ثى‎ ) ARABIC LIGATURE THEH WITH YEH FINAL FORM → ARABIC LETTER THEH, ARABIC LETTER ALEF MAKSURA      # →‎ثي‎→
+FC14 ; 062B 0649 ;     MA      # ( ‎ﰔ‎ → ‎ثى‎ ) ARABIC LIGATURE THEH WITH YEH ISOLATED FORM → ARABIC LETTER THEH, ARABIC LETTER ALEF MAKSURA   # →‎ثي‎→
+
+FB68 ; 0679 ;  MA      # ( ‎ﭨ‎ → ‎ٹ‎ ) ARABIC LETTER TTEH INITIAL FORM → ARABIC LETTER TTEH     # 
+FB69 ; 0679 ;  MA      # ( ‎ﭩ‎ → ‎ٹ‎ ) ARABIC LETTER TTEH MEDIAL FORM → ARABIC LETTER TTEH      # 
+FB67 ; 0679 ;  MA      # ( ‎ﭧ‎ → ‎ٹ‎ ) ARABIC LETTER TTEH FINAL FORM → ARABIC LETTER TTEH       # 
+FB66 ; 0679 ;  MA      # ( ‎ﭦ‎ → ‎ٹ‎ ) ARABIC LETTER TTEH ISOLATED FORM → ARABIC LETTER TTEH    # 
+06BB ; 0679 ;  MA      # ( ‎ڻ‎ → ‎ٹ‎ ) ARABIC LETTER RNOON → ARABIC LETTER TTEH  # →‎ﮢ‎→→‎ﭩ‎→
+FBA2 ; 0679 ;  MA      # ( ‎ﮢ‎ → ‎ٹ‎ ) ARABIC LETTER RNOON INITIAL FORM → ARABIC LETTER TTEH    # →‎ﭩ‎→
+FBA3 ; 0679 ;  MA      # ( ‎ﮣ‎ → ‎ٹ‎ ) ARABIC LETTER RNOON MEDIAL FORM → ARABIC LETTER TTEH     # →‎ﭩ‎→
+FBA1 ; 0679 ;  MA      # ( ‎ﮡ‎ → ‎ٹ‎ ) ARABIC LETTER RNOON FINAL FORM → ARABIC LETTER TTEH      # →‎ڻ‎→→‎ﮢ‎→→‎ﭩ‎→
+FBA0 ; 0679 ;  MA      # ( ‎ﮠ‎ → ‎ٹ‎ ) ARABIC LETTER RNOON ISOLATED FORM → ARABIC LETTER TTEH   # →‎ڻ‎→→‎ﮢ‎→→‎ﭩ‎→
+
+067B ; 067A ;  MA      # ( ‎ٻ‎ → ‎ٺ‎ ) ARABIC LETTER BEEH → ARABIC LETTER TTEHEH # →‎ﭞ‎→
+FB54 ; 067A ;  MA      # ( ‎ﭔ‎ → ‎ٺ‎ ) ARABIC LETTER BEEH INITIAL FORM → ARABIC LETTER TTEHEH   # →‎ﭡ‎→
+FB55 ; 067A ;  MA      # ( ‎ﭕ‎ → ‎ٺ‎ ) ARABIC LETTER BEEH MEDIAL FORM → ARABIC LETTER TTEHEH    # →‎ﭡ‎→
+FB53 ; 067A ;  MA      # ( ‎ﭓ‎ → ‎ٺ‎ ) ARABIC LETTER BEEH FINAL FORM → ARABIC LETTER TTEHEH     # 
+FB52 ; 067A ;  MA      # ( ‎ﭒ‎ → ‎ٺ‎ ) ARABIC LETTER BEEH ISOLATED FORM → ARABIC LETTER TTEHEH  # 
+FB60 ; 067A ;  MA      # ( ‎ﭠ‎ → ‎ٺ‎ ) ARABIC LETTER TTEHEH INITIAL FORM → ARABIC LETTER TTEHEH # 
+FB61 ; 067A ;  MA      # ( ‎ﭡ‎ → ‎ٺ‎ ) ARABIC LETTER TTEHEH MEDIAL FORM → ARABIC LETTER TTEHEH  # 
+FB5F ; 067A ;  MA      # ( ‎ﭟ‎ → ‎ٺ‎ ) ARABIC LETTER TTEHEH FINAL FORM → ARABIC LETTER TTEHEH   # 
+FB5E ; 067A ;  MA      # ( ‎ﭞ‎ → ‎ٺ‎ ) ARABIC LETTER TTEHEH ISOLATED FORM → ARABIC LETTER TTEHEH        # 
+06D0 ; 067A ;  MA      # ( ‎ې‎ → ‎ٺ‎ ) ARABIC LETTER E → ARABIC LETTER TTEHEH    # →‎ﯦ‎→→‎ﭡ‎→
+FBE6 ; 067A ;  MA      # ( ‎ﯦ‎ → ‎ٺ‎ ) ARABIC LETTER E INITIAL FORM → ARABIC LETTER TTEHEH      # →‎ﭡ‎→
+FBE7 ; 067A ;  MA      # ( ‎ﯧ‎ → ‎ٺ‎ ) ARABIC LETTER E MEDIAL FORM → ARABIC LETTER TTEHEH       # →‎ﭡ‎→
+FBE5 ; 067A ;  MA      # ( ‎ﯥ‎ → ‎ٺ‎ ) ARABIC LETTER E FINAL FORM → ARABIC LETTER TTEHEH        # →‎ې‎→→‎ﯦ‎→→‎ﭡ‎→
+FBE4 ; 067A ;  MA      # ( ‎ﯤ‎ → ‎ٺ‎ ) ARABIC LETTER E ISOLATED FORM → ARABIC LETTER TTEHEH     # →‎ې‎→→‎ﯦ‎→→‎ﭡ‎→
+
+0680 ; 067F ;  MA      # ( ‎ڀ‎ → ‎ٿ‎ ) ARABIC LETTER BEHEH → ARABIC LETTER TEHEH # →‎ﭚ‎→
+FB5C ; 067F ;  MA      # ( ‎ﭜ‎ → ‎ٿ‎ ) ARABIC LETTER BEHEH INITIAL FORM → ARABIC LETTER TEHEH   # →‎ﭥ‎→
+FB5D ; 067F ;  MA      # ( ‎ﭝ‎ → ‎ٿ‎ ) ARABIC LETTER BEHEH MEDIAL FORM → ARABIC LETTER TEHEH    # →‎ﭥ‎→
+FB5B ; 067F ;  MA      # ( ‎ﭛ‎ → ‎ٿ‎ ) ARABIC LETTER BEHEH FINAL FORM → ARABIC LETTER TEHEH     # 
+FB5A ; 067F ;  MA      # ( ‎ﭚ‎ → ‎ٿ‎ ) ARABIC LETTER BEHEH ISOLATED FORM → ARABIC LETTER TEHEH  # 
+FB64 ; 067F ;  MA      # ( ‎ﭤ‎ → ‎ٿ‎ ) ARABIC LETTER TEHEH INITIAL FORM → ARABIC LETTER TEHEH   # 
+FB65 ; 067F ;  MA      # ( ‎ﭥ‎ → ‎ٿ‎ ) ARABIC LETTER TEHEH MEDIAL FORM → ARABIC LETTER TEHEH    # 
+FB63 ; 067F ;  MA      # ( ‎ﭣ‎ → ‎ٿ‎ ) ARABIC LETTER TEHEH FINAL FORM → ARABIC LETTER TEHEH     # 
+FB62 ; 067F ;  MA      # ( ‎ﭢ‎ → ‎ٿ‎ ) ARABIC LETTER TEHEH ISOLATED FORM → ARABIC LETTER TEHEH  # 
+
+FE9F ; 062C ;  MA      # ( ‎ﺟ‎ → ‎ج‎ ) ARABIC LETTER JEEM INITIAL FORM → ARABIC LETTER JEEM     # 
+FEA0 ; 062C ;  MA      # ( ‎ﺠ‎ → ‎ج‎ ) ARABIC LETTER JEEM MEDIAL FORM → ARABIC LETTER JEEM      # 
+FE9E ; 062C ;  MA      # ( ‎ﺞ‎ → ‎ج‎ ) ARABIC LETTER JEEM FINAL FORM → ARABIC LETTER JEEM       # 
+FE9D ; 062C ;  MA      # ( ‎ﺝ‎ → ‎ج‎ ) ARABIC LETTER JEEM ISOLATED FORM → ARABIC LETTER JEEM    # 
+062E ; 062C ;  MA      # ( ‎خ‎ → ‎ج‎ ) ARABIC LETTER KHAH → ARABIC LETTER JEEM   # 
+FEA7 ; 062C ;  MA      # ( ‎ﺧ‎ → ‎ج‎ ) ARABIC LETTER KHAH INITIAL FORM → ARABIC LETTER JEEM     # →‎خ‎→
+FEA8 ; 062C ;  MA      # ( ‎ﺨ‎ → ‎ج‎ ) ARABIC LETTER KHAH MEDIAL FORM → ARABIC LETTER JEEM      # →‎خ‎→
+FEA6 ; 062C ;  MA      # ( ‎ﺦ‎ → ‎ج‎ ) ARABIC LETTER KHAH FINAL FORM → ARABIC LETTER JEEM       # →‎خ‎→
+FEA5 ; 062C ;  MA      # ( ‎ﺥ‎ → ‎ج‎ ) ARABIC LETTER KHAH ISOLATED FORM → ARABIC LETTER JEEM    # 
+
+FCAB ; 062C 062C ;     MA      # ( ‎ﲫ‎ → ‎جج‎ ) ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM → ARABIC LETTER JEEM, ARABIC LETTER JEEM   # →‎خج‎→
+FC19 ; 062C 062C ;     MA      # ( ‎ﰙ‎ → ‎جج‎ ) ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM → ARABIC LETTER JEEM, ARABIC LETTER JEEM  # →‎خج‎→
+
+FCA7 ; 062C 062D ;     MA      # ( ‎ﲧ‎ → ‎جح‎ ) ARABIC LIGATURE JEEM WITH HAH INITIAL FORM → ARABIC LETTER JEEM, ARABIC LETTER HAH     # 
+FC15 ; 062C 062D ;     MA      # ( ‎ﰕ‎ → ‎جح‎ ) ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM → ARABIC LETTER JEEM, ARABIC LETTER HAH    # 
+FC1A ; 062C 062D ;     MA      # ( ‎ﰚ‎ → ‎جح‎ ) ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM → ARABIC LETTER JEEM, ARABIC LETTER HAH    # →‎ﰕ‎→
+
+FDA6 ; 062C 062D 0649 ;        MA      # ( ‎ﶦ‎ → ‎جحى‎ ) ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER JEEM, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA       # 
+FDBE ; 062C 062D 0649 ;        MA      # ( ‎ﶾ‎ → ‎جحى‎ ) ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM → ARABIC LETTER JEEM, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA        # →‎جحي‎→
+
+FDFB ; 062C 0644 0020 062C 0644 0627 0644 0647 ;       MA      #* ( ‎ﷻ‎ → ‎جل جلاله‎ ) ARABIC LIGATURE JALLAJALALOUHOU → ARABIC LETTER JEEM, ARABIC LETTER LAM, SPACE, ARABIC LETTER JEEM, ARABIC LETTER LAM, ARABIC LETTER ALEF, ARABIC LETTER LAM, ARABIC LETTER HEH    # 
+
+FCA8 ; 062C 0645 ;     MA      # ( ‎ﲨ‎ → ‎جم‎ ) ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM → ARABIC LETTER JEEM, ARABIC LETTER MEEM   # 
+FC16 ; 062C 0645 ;     MA      # ( ‎ﰖ‎ → ‎جم‎ ) ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM → ARABIC LETTER JEEM, ARABIC LETTER MEEM  # 
+FCAC ; 062C 0645 ;     MA      # ( ‎ﲬ‎ → ‎جم‎ ) ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM → ARABIC LETTER JEEM, ARABIC LETTER MEEM   # →‎ﲨ‎→
+FC1B ; 062C 0645 ;     MA      # ( ‎ﰛ‎ → ‎جم‎ ) ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM → ARABIC LETTER JEEM, ARABIC LETTER MEEM  # →‎ﰖ‎→
+
+FD59 ; 062C 0645 062D ;        MA      # ( ‎ﵙ‎ → ‎جمح‎ ) ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM → ARABIC LETTER JEEM, ARABIC LETTER MEEM, ARABIC LETTER HAH     # 
+FD58 ; 062C 0645 062D ;        MA      # ( ‎ﵘ‎ → ‎جمح‎ ) ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM → ARABIC LETTER JEEM, ARABIC LETTER MEEM, ARABIC LETTER HAH       # 
+
+FDA7 ; 062C 0645 0649 ;        MA      # ( ‎ﶧ‎ → ‎جمى‎ ) ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER JEEM, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA     # 
+FDA5 ; 062C 0645 0649 ;        MA      # ( ‎ﶥ‎ → ‎جمى‎ ) ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER JEEM, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA      # →‎جمي‎→
+
+FD1D ; 062C 0649 ;     MA      # ( ‎ﴝ‎ → ‎جى‎ ) ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA     # 
+FD01 ; 062C 0649 ;     MA      # ( ‎ﴁ‎ → ‎جى‎ ) ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA  # 
+FD1E ; 062C 0649 ;     MA      # ( ‎ﴞ‎ → ‎جى‎ ) ARABIC LIGATURE JEEM WITH YEH FINAL FORM → ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA      # →‎جي‎→
+FD02 ; 062C 0649 ;     MA      # ( ‎ﴂ‎ → ‎جى‎ ) ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM → ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA   # →‎جي‎→
+FD1F ; 062C 0649 ;     MA      # ( ‎ﴟ‎ → ‎جى‎ ) ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA     # →‎خى‎→→‎ﴃ‎→→‎ﴁ‎→
+FD03 ; 062C 0649 ;     MA      # ( ‎ﴃ‎ → ‎جى‎ ) ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA  # →‎ﴁ‎→
+FD20 ; 062C 0649 ;     MA      # ( ‎ﴠ‎ → ‎جى‎ ) ARABIC LIGATURE KHAH WITH YEH FINAL FORM → ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA      # →‎خي‎→→‎ﴄ‎→→‎ﴂ‎→→‎جي‎→
+FD04 ; 062C 0649 ;     MA      # ( ‎ﴄ‎ → ‎جى‎ ) ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM → ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA   # →‎ﴂ‎→→‎جي‎→
+
+FB78 ; 0683 ;  MA      # ( ‎ﭸ‎ → ‎ڃ‎ ) ARABIC LETTER NYEH INITIAL FORM → ARABIC LETTER NYEH     # 
+FB79 ; 0683 ;  MA      # ( ‎ﭹ‎ → ‎ڃ‎ ) ARABIC LETTER NYEH MEDIAL FORM → ARABIC LETTER NYEH      # 
+FB77 ; 0683 ;  MA      # ( ‎ﭷ‎ → ‎ڃ‎ ) ARABIC LETTER NYEH FINAL FORM → ARABIC LETTER NYEH       # 
+FB76 ; 0683 ;  MA      # ( ‎ﭶ‎ → ‎ڃ‎ ) ARABIC LETTER NYEH ISOLATED FORM → ARABIC LETTER NYEH    # 
+
+FB7C ; 0686 ;  MA      # ( ‎ﭼ‎ → ‎چ‎ ) ARABIC LETTER TCHEH INITIAL FORM → ARABIC LETTER TCHEH   # 
+FB7D ; 0686 ;  MA      # ( ‎ﭽ‎ → ‎چ‎ ) ARABIC LETTER TCHEH MEDIAL FORM → ARABIC LETTER TCHEH    # 
+FB7B ; 0686 ;  MA      # ( ‎ﭻ‎ → ‎چ‎ ) ARABIC LETTER TCHEH FINAL FORM → ARABIC LETTER TCHEH     # 
+FB7A ; 0686 ;  MA      # ( ‎ﭺ‎ → ‎چ‎ ) ARABIC LETTER TCHEH ISOLATED FORM → ARABIC LETTER TCHEH  # 
+
+FB80 ; 0687 ;  MA      # ( ‎ﮀ‎ → ‎ڇ‎ ) ARABIC LETTER TCHEHEH INITIAL FORM → ARABIC LETTER TCHEHEH       # 
+FB81 ; 0687 ;  MA      # ( ‎ﮁ‎ → ‎ڇ‎ ) ARABIC LETTER TCHEHEH MEDIAL FORM → ARABIC LETTER TCHEHEH        # 
+FB7F ; 0687 ;  MA      # ( ‎ﭿ‎ → ‎ڇ‎ ) ARABIC LETTER TCHEHEH FINAL FORM → ARABIC LETTER TCHEHEH # 
+FB7E ; 0687 ;  MA      # ( ‎ﭾ‎ → ‎ڇ‎ ) ARABIC LETTER TCHEHEH ISOLATED FORM → ARABIC LETTER TCHEHEH      # 
+
+FEA3 ; 062D ;  MA      # ( ‎ﺣ‎ → ‎ح‎ ) ARABIC LETTER HAH INITIAL FORM → ARABIC LETTER HAH       # 
+FEA4 ; 062D ;  MA      # ( ‎ﺤ‎ → ‎ح‎ ) ARABIC LETTER HAH MEDIAL FORM → ARABIC LETTER HAH        # 
+FEA2 ; 062D ;  MA      # ( ‎ﺢ‎ → ‎ح‎ ) ARABIC LETTER HAH FINAL FORM → ARABIC LETTER HAH # 
+FEA1 ; 062D ;  MA      # ( ‎ﺡ‎ → ‎ح‎ ) ARABIC LETTER HAH ISOLATED FORM → ARABIC LETTER HAH      # 
+
+FCA9 ; 062D 062C ;     MA      # ( ‎ﲩ‎ → ‎حج‎ ) ARABIC LIGATURE HAH WITH JEEM INITIAL FORM → ARABIC LETTER HAH, ARABIC LETTER JEEM     # 
+FC17 ; 062D 062C ;     MA      # ( ‎ﰗ‎ → ‎حج‎ ) ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM → ARABIC LETTER HAH, ARABIC LETTER JEEM    # 
+
+FDBF ; 062D 062C 0649 ;        MA      # ( ‎ﶿ‎ → ‎حجى‎ ) ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM → ARABIC LETTER HAH, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA        # →‎حجي‎→
+
+FCAA ; 062D 0645 ;     MA      # ( ‎ﲪ‎ → ‎حم‎ ) ARABIC LIGATURE HAH WITH MEEM INITIAL FORM → ARABIC LETTER HAH, ARABIC LETTER MEEM     # 
+FC18 ; 062D 0645 ;     MA      # ( ‎ﰘ‎ → ‎حم‎ ) ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM → ARABIC LETTER HAH, ARABIC LETTER MEEM    # 
+
+FD5B ; 062D 0645 0649 ;        MA      # ( ‎ﵛ‎ → ‎حمى‎ ) ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER HAH, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA       # 
+FD5A ; 062D 0645 0649 ;        MA      # ( ‎ﵚ‎ → ‎حمى‎ ) ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER HAH, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA        # →‎حمي‎→
+
+FD1B ; 062D 0649 ;     MA      # ( ‎ﴛ‎ → ‎حى‎ ) ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA       # 
+FCFF ; 062D 0649 ;     MA      # ( ‎ﳿ‎ → ‎حى‎ ) ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA    # 
+FD1C ; 062D 0649 ;     MA      # ( ‎ﴜ‎ → ‎حى‎ ) ARABIC LIGATURE HAH WITH YEH FINAL FORM → ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA        # →‎حي‎→
+FD00 ; 062D 0649 ;     MA      # ( ‎ﴀ‎ → ‎حى‎ ) ARABIC LIGATURE HAH WITH YEH ISOLATED FORM → ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA     # →‎حي‎→
+
+0684 ; 0682 ;  MA      # ( ‎ڄ‎ → ‎ڂ‎ ) ARABIC LETTER DYEH → ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE       # 
+FB74 ; 0682 ;  MA      # ( ‎ﭴ‎ → ‎ڂ‎ ) ARABIC LETTER DYEH INITIAL FORM → ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE # →‎ڄ‎→
+FB75 ; 0682 ;  MA      # ( ‎ﭵ‎ → ‎ڂ‎ ) ARABIC LETTER DYEH MEDIAL FORM → ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE  # →‎ڄ‎→
+FB73 ; 0682 ;  MA      # ( ‎ﭳ‎ → ‎ڂ‎ ) ARABIC LETTER DYEH FINAL FORM → ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE   # →‎ڄ‎→
+FB72 ; 0682 ;  MA      # ( ‎ﭲ‎ → ‎ڂ‎ ) ARABIC LETTER DYEH ISOLATED FORM → ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE        # 
+
+FEAA ; 062F ;  MA      # ( ‎ﺪ‎ → ‎د‎ ) ARABIC LETTER DAL FINAL FORM → ARABIC LETTER DAL # 
+FEA9 ; 062F ;  MA      # ( ‎ﺩ‎ → ‎د‎ ) ARABIC LETTER DAL ISOLATED FORM → ARABIC LETTER DAL      # 
+
+FEAC ; 0630 ;  MA      # ( ‎ﺬ‎ → ‎ذ‎ ) ARABIC LETTER THAL FINAL FORM → ARABIC LETTER THAL       # 
+FEAB ; 0630 ;  MA      # ( ‎ﺫ‎ → ‎ذ‎ ) ARABIC LETTER THAL ISOLATED FORM → ARABIC LETTER THAL    # 
+
+FC5B ; 0630 0670 ;     MA      # ( ‎ﱛ‎ → ‎ذٰ‎ ) ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM → ARABIC LETTER THAL, ARABIC LETTER SUPERSCRIPT ALEF  # 
+
+FB89 ; 0688 ;  MA      # ( ‎ﮉ‎ → ‎ڈ‎ ) ARABIC LETTER DDAL FINAL FORM → ARABIC LETTER DDAL       # 
+FB88 ; 0688 ;  MA      # ( ‎ﮈ‎ → ‎ڈ‎ ) ARABIC LETTER DDAL ISOLATED FORM → ARABIC LETTER DDAL    # 
+
+FB85 ; 068C ;  MA      # ( ‎ﮅ‎ → ‎ڌ‎ ) ARABIC LETTER DAHAL FINAL FORM → ARABIC LETTER DAHAL     # 
+FB84 ; 068C ;  MA      # ( ‎ﮄ‎ → ‎ڌ‎ ) ARABIC LETTER DAHAL ISOLATED FORM → ARABIC LETTER DAHAL  # 
+
+FB83 ; 068D ;  MA      # ( ‎ﮃ‎ → ‎ڍ‎ ) ARABIC LETTER DDAHAL FINAL FORM → ARABIC LETTER DDAHAL   # 
+FB82 ; 068D ;  MA      # ( ‎ﮂ‎ → ‎ڍ‎ ) ARABIC LETTER DDAHAL ISOLATED FORM → ARABIC LETTER DDAHAL        # 
+
+FB87 ; 068E ;  MA      # ( ‎ﮇ‎ → ‎ڎ‎ ) ARABIC LETTER DUL FINAL FORM → ARABIC LETTER DUL # 
+FB86 ; 068E ;  MA      # ( ‎ﮆ‎ → ‎ڎ‎ ) ARABIC LETTER DUL ISOLATED FORM → ARABIC LETTER DUL      # 
+
+FEAE ; 0631 ;  MA      # ( ‎ﺮ‎ → ‎ر‎ ) ARABIC LETTER REH FINAL FORM → ARABIC LETTER REH # 
+FEAD ; 0631 ;  MA      # ( ‎ﺭ‎ → ‎ر‎ ) ARABIC LETTER REH ISOLATED FORM → ARABIC LETTER REH      # 
+
+FC5C ; 0631 0670 ;     MA      # ( ‎ﱜ‎ → ‎رٰ‎ ) ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM → ARABIC LETTER REH, ARABIC LETTER SUPERSCRIPT ALEF    # 
+
+FDF6 ; 0631 0633 0648 0644 ;   MA      # ( ‎ﷶ‎ → ‎رسول‎ ) ARABIC LIGATURE RASOUL ISOLATED FORM → ARABIC LETTER REH, ARABIC LETTER SEEN, ARABIC LETTER WAW, ARABIC LETTER LAM # 
+
+FDFC ; 0631 0649 0627 0644 ;   MA      #* ( ‎﷼‎ → ‎رىال‎ ) RIAL SIGN → ARABIC LETTER REH, ARABIC LETTER ALEF MAKSURA, ARABIC LETTER ALEF, ARABIC LETTER LAM  # →‎ریال‎→
+
+FEB0 ; 0632 ;  MA      # ( ‎ﺰ‎ → ‎ز‎ ) ARABIC LETTER ZAIN FINAL FORM → ARABIC LETTER ZAIN       # 
+FEAF ; 0632 ;  MA      # ( ‎ﺯ‎ → ‎ز‎ ) ARABIC LETTER ZAIN ISOLATED FORM → ARABIC LETTER ZAIN    # 
+0694 ; 0632 ;  MA      # ( ‎ڔ‎ → ‎ز‎ ) ARABIC LETTER REH WITH DOT BELOW → ARABIC LETTER ZAIN     # 
+
+FB8D ; 0691 ;  MA      # ( ‎ﮍ‎ → ‎ڑ‎ ) ARABIC LETTER RREH FINAL FORM → ARABIC LETTER RREH       # 
+FB8C ; 0691 ;  MA      # ( ‎ﮌ‎ → ‎ڑ‎ ) ARABIC LETTER RREH ISOLATED FORM → ARABIC LETTER RREH    # 
+
+FB8B ; 0698 ;  MA      # ( ‎ﮋ‎ → ‎ژ‎ ) ARABIC LETTER JEH FINAL FORM → ARABIC LETTER JEH # 
+FB8A ; 0698 ;  MA      # ( ‎ﮊ‎ → ‎ژ‎ ) ARABIC LETTER JEH ISOLATED FORM → ARABIC LETTER JEH      # 
+
+FEB3 ; 0633 ;  MA      # ( ‎ﺳ‎ → ‎س‎ ) ARABIC LETTER SEEN INITIAL FORM → ARABIC LETTER SEEN     # 
+FEB4 ; 0633 ;  MA      # ( ‎ﺴ‎ → ‎س‎ ) ARABIC LETTER SEEN MEDIAL FORM → ARABIC LETTER SEEN      # 
+FEB2 ; 0633 ;  MA      # ( ‎ﺲ‎ → ‎س‎ ) ARABIC LETTER SEEN FINAL FORM → ARABIC LETTER SEEN       # 
+FEB1 ; 0633 ;  MA      # ( ‎ﺱ‎ → ‎س‎ ) ARABIC LETTER SEEN ISOLATED FORM → ARABIC LETTER SEEN    # 
+
+FCAD ; 0633 062C ;     MA      # ( ‎ﲭ‎ → ‎سج‎ ) ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER JEEM   # 
+FD34 ; 0633 062C ;     MA      # ( ‎ﴴ‎ → ‎سج‎ ) ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER JEEM    # 
+FC1C ; 0633 062C ;     MA      # ( ‎ﰜ‎ → ‎سج‎ ) ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM → ARABIC LETTER SEEN, ARABIC LETTER JEEM  # 
+FCAF ; 0633 062C ;     MA      # ( ‎ﲯ‎ → ‎سج‎ ) ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER JEEM   # →‎سخ‎→→‎ﰞ‎→→‎ﰜ‎→
+FD36 ; 0633 062C ;     MA      # ( ‎ﴶ‎ → ‎سج‎ ) ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER JEEM    # →‎سخ‎→→‎ﰞ‎→→‎ﰜ‎→
+FC1E ; 0633 062C ;     MA      # ( ‎ﰞ‎ → ‎سج‎ ) ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM → ARABIC LETTER SEEN, ARABIC LETTER JEEM  # →‎ﰜ‎→
+
+FD5D ; 0633 062C 062D ;        MA      # ( ‎ﵝ‎ → ‎سجح‎ ) ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER JEEM, ARABIC LETTER HAH     # 
+
+FD5E ; 0633 062C 0649 ;        MA      # ( ‎ﵞ‎ → ‎سجى‎ ) ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER SEEN, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA     # 
+FDA8 ; 0633 062C 0649 ;        MA      # ( ‎ﶨ‎ → ‎سجى‎ ) ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER SEEN, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA     # →‎سخى‎→
+FDC6 ; 0633 062C 0649 ;        MA      # ( ‎ﷆ‎ → ‎سجى‎ ) ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM → ARABIC LETTER SEEN, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA      # →‎سخي‎→
+
+FCAE ; 0633 062D ;     MA      # ( ‎ﲮ‎ → ‎سح‎ ) ARABIC LIGATURE SEEN WITH HAH INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER HAH     # 
+FD35 ; 0633 062D ;     MA      # ( ‎ﴵ‎ → ‎سح‎ ) ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER HAH      # 
+FC1D ; 0633 062D ;     MA      # ( ‎ﰝ‎ → ‎سح‎ ) ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM → ARABIC LETTER SEEN, ARABIC LETTER HAH    # 
+
+FD5C ; 0633 062D 062C ;        MA      # ( ‎ﵜ‎ → ‎سحج‎ ) ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER HAH, ARABIC LETTER JEEM     # 
+
+FD2A ; 0633 0631 ;     MA      # ( ‎ﴪ‎ → ‎سر‎ ) ARABIC LIGATURE SEEN WITH REH FINAL FORM → ARABIC LETTER SEEN, ARABIC LETTER REH       # 
+FD0E ; 0633 0631 ;     MA      # ( ‎ﴎ‎ → ‎سر‎ ) ARABIC LIGATURE SEEN WITH REH ISOLATED FORM → ARABIC LETTER SEEN, ARABIC LETTER REH    # 
+
+FCB0 ; 0633 0645 ;     MA      # ( ‎ﲰ‎ → ‎سم‎ ) ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER MEEM   # 
+FCE7 ; 0633 0645 ;     MA      # ( ‎ﳧ‎ → ‎سم‎ ) ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER MEEM    # 
+FC1F ; 0633 0645 ;     MA      # ( ‎ﰟ‎ → ‎سم‎ ) ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM → ARABIC LETTER SEEN, ARABIC LETTER MEEM  # 
+
+FD61 ; 0633 0645 062C ;        MA      # ( ‎ﵡ‎ → ‎سمج‎ ) ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER MEEM, ARABIC LETTER JEEM   # 
+
+FD60 ; 0633 0645 062D ;        MA      # ( ‎ﵠ‎ → ‎سمح‎ ) ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER MEEM, ARABIC LETTER HAH     # 
+FD5F ; 0633 0645 062D ;        MA      # ( ‎ﵟ‎ → ‎سمح‎ ) ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM → ARABIC LETTER SEEN, ARABIC LETTER MEEM, ARABIC LETTER HAH       # 
+
+FD63 ; 0633 0645 0645 ;        MA      # ( ‎ﵣ‎ → ‎سمم‎ ) ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER MEEM, ARABIC LETTER MEEM   # 
+FD62 ; 0633 0645 0645 ;        MA      # ( ‎ﵢ‎ → ‎سمم‎ ) ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM → ARABIC LETTER SEEN, ARABIC LETTER MEEM, ARABIC LETTER MEEM     # 
+
+FD31 ; 0633 0647 ;     MA      # ( ‎ﴱ‎ → ‎سه‎ ) ARABIC LIGATURE SEEN WITH HEH INITIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER HEH     # 
+FCE8 ; 0633 0647 ;     MA      # ( ‎ﳨ‎ → ‎سه‎ ) ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM → ARABIC LETTER SEEN, ARABIC LETTER HEH      # 
+
+FD17 ; 0633 0649 ;     MA      # ( ‎ﴗ‎ → ‎سى‎ ) ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER SEEN, ARABIC LETTER ALEF MAKSURA     # 
+FCFB ; 0633 0649 ;     MA      # ( ‎ﳻ‎ → ‎سى‎ ) ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER SEEN, ARABIC LETTER ALEF MAKSURA  # 
+FD18 ; 0633 0649 ;     MA      # ( ‎ﴘ‎ → ‎سى‎ ) ARABIC LIGATURE SEEN WITH YEH FINAL FORM → ARABIC LETTER SEEN, ARABIC LETTER ALEF MAKSURA      # →‎سي‎→
+FCFC ; 0633 0649 ;     MA      # ( ‎ﳼ‎ → ‎سى‎ ) ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM → ARABIC LETTER SEEN, ARABIC LETTER ALEF MAKSURA   # →‎سي‎→
+
+FEB7 ; 0634 ;  MA      # ( ‎ﺷ‎ → ‎ش‎ ) ARABIC LETTER SHEEN INITIAL FORM → ARABIC LETTER SHEEN   # 
+FEB8 ; 0634 ;  MA      # ( ‎ﺸ‎ → ‎ش‎ ) ARABIC LETTER SHEEN MEDIAL FORM → ARABIC LETTER SHEEN    # 
+FEB6 ; 0634 ;  MA      # ( ‎ﺶ‎ → ‎ش‎ ) ARABIC LETTER SHEEN FINAL FORM → ARABIC LETTER SHEEN     # 
+FEB5 ; 0634 ;  MA      # ( ‎ﺵ‎ → ‎ش‎ ) ARABIC LETTER SHEEN ISOLATED FORM → ARABIC LETTER SHEEN  # 
+
+FD2D ; 0634 062C ;     MA      # ( ‎ﴭ‎ → ‎شج‎ ) ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER JEEM # 
+FD37 ; 0634 062C ;     MA      # ( ‎ﴷ‎ → ‎شج‎ ) ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER JEEM  # 
+FD25 ; 0634 062C ;     MA      # ( ‎ﴥ‎ → ‎شج‎ ) ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER JEEM   # 
+FD09 ; 0634 062C ;     MA      # ( ‎ﴉ‎ → ‎شج‎ ) ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM → ARABIC LETTER SHEEN, ARABIC LETTER JEEM        # 
+FD2F ; 0634 062C ;     MA      # ( ‎ﴯ‎ → ‎شج‎ ) ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER JEEM # →‎شخ‎→→‎ﴧ‎→→‎ﴥ‎→
+FD39 ; 0634 062C ;     MA      # ( ‎ﴹ‎ → ‎شج‎ ) ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER JEEM  # →‎شخ‎→→‎ﴧ‎→→‎ﴥ‎→
+FD27 ; 0634 062C ;     MA      # ( ‎ﴧ‎ → ‎شج‎ ) ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER JEEM   # →‎ﴥ‎→
+FD0B ; 0634 062C ;     MA      # ( ‎ﴋ‎ → ‎شج‎ ) ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM → ARABIC LETTER SHEEN, ARABIC LETTER JEEM        # →‎ﴉ‎→
+
+FD69 ; 0634 062C 0649 ;        MA      # ( ‎ﵩ‎ → ‎شجى‎ ) ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA    # →‎شجي‎→
+
+FD2E ; 0634 062D ;     MA      # ( ‎ﴮ‎ → ‎شح‎ ) ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER HAH   # 
+FD38 ; 0634 062D ;     MA      # ( ‎ﴸ‎ → ‎شح‎ ) ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER HAH    # 
+FD26 ; 0634 062D ;     MA      # ( ‎ﴦ‎ → ‎شح‎ ) ARABIC LIGATURE SHEEN WITH HAH FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER HAH     # 
+FD0A ; 0634 062D ;     MA      # ( ‎ﴊ‎ → ‎شح‎ ) ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM → ARABIC LETTER SHEEN, ARABIC LETTER HAH  # 
+
+FD68 ; 0634 062D 0645 ;        MA      # ( ‎ﵨ‎ → ‎شحم‎ ) ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER HAH, ARABIC LETTER MEEM   # 
+FD67 ; 0634 062D 0645 ;        MA      # ( ‎ﵧ‎ → ‎شحم‎ ) ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER HAH, ARABIC LETTER MEEM     # 
+
+FDAA ; 0634 062D 0649 ;        MA      # ( ‎ﶪ‎ → ‎شحى‎ ) ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA      # →‎شحي‎→
+
+FD29 ; 0634 0631 ;     MA      # ( ‎ﴩ‎ → ‎شر‎ ) ARABIC LIGATURE SHEEN WITH REH FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER REH     # 
+FD0D ; 0634 0631 ;     MA      # ( ‎ﴍ‎ → ‎شر‎ ) ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM → ARABIC LETTER SHEEN, ARABIC LETTER REH  # 
+
+FD30 ; 0634 0645 ;     MA      # ( ‎ﴰ‎ → ‎شم‎ ) ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER MEEM # 
+FCE9 ; 0634 0645 ;     MA      # ( ‎ﳩ‎ → ‎شم‎ ) ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER MEEM  # 
+FD28 ; 0634 0645 ;     MA      # ( ‎ﴨ‎ → ‎شم‎ ) ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER MEEM   # 
+FD0C ; 0634 0645 ;     MA      # ( ‎ﴌ‎ → ‎شم‎ ) ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM → ARABIC LETTER SHEEN, ARABIC LETTER MEEM        # 
+
+FD6B ; 0634 0645 062C ;        MA      # ( ‎ﵫ‎ → ‎شمج‎ ) ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER MEEM, ARABIC LETTER JEEM # →‎شمخ‎→
+FD6A ; 0634 0645 062C ;        MA      # ( ‎ﵪ‎ → ‎شمج‎ ) ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER MEEM, ARABIC LETTER JEEM   # →‎شمخ‎→
+
+FD6D ; 0634 0645 0645 ;        MA      # ( ‎ﵭ‎ → ‎شمم‎ ) ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER MEEM, ARABIC LETTER MEEM # 
+FD6C ; 0634 0645 0645 ;        MA      # ( ‎ﵬ‎ → ‎شمم‎ ) ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER MEEM, ARABIC LETTER MEEM   # 
+
+FD32 ; 0634 0647 ;     MA      # ( ‎ﴲ‎ → ‎شه‎ ) ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER HEH   # 
+FCEA ; 0634 0647 ;     MA      # ( ‎ﳪ‎ → ‎شه‎ ) ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER HEH    # 
+
+FD19 ; 0634 0649 ;     MA      # ( ‎ﴙ‎ → ‎شى‎ ) ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER ALEF MAKSURA   # 
+FCFD ; 0634 0649 ;     MA      # ( ‎ﳽ‎ → ‎شى‎ ) ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER SHEEN, ARABIC LETTER ALEF MAKSURA        # 
+FD1A ; 0634 0649 ;     MA      # ( ‎ﴚ‎ → ‎شى‎ ) ARABIC LIGATURE SHEEN WITH YEH FINAL FORM → ARABIC LETTER SHEEN, ARABIC LETTER ALEF MAKSURA    # →‎شي‎→
+FCFE ; 0634 0649 ;     MA      # ( ‎ﳾ‎ → ‎شى‎ ) ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM → ARABIC LETTER SHEEN, ARABIC LETTER ALEF MAKSURA # →‎شي‎→
+
+FEBB ; 0635 ;  MA      # ( ‎ﺻ‎ → ‎ص‎ ) ARABIC LETTER SAD INITIAL FORM → ARABIC LETTER SAD       # 
+FEBC ; 0635 ;  MA      # ( ‎ﺼ‎ → ‎ص‎ ) ARABIC LETTER SAD MEDIAL FORM → ARABIC LETTER SAD        # 
+FEBA ; 0635 ;  MA      # ( ‎ﺺ‎ → ‎ص‎ ) ARABIC LETTER SAD FINAL FORM → ARABIC LETTER SAD # 
+FEB9 ; 0635 ;  MA      # ( ‎ﺹ‎ → ‎ص‎ ) ARABIC LETTER SAD ISOLATED FORM → ARABIC LETTER SAD      # 
+
+FCB2 ; 0635 062C ;     MA      # ( ‎ﲲ‎ → ‎صج‎ ) ARABIC LIGATURE SAD WITH KHAH INITIAL FORM → ARABIC LETTER SAD, ARABIC LETTER JEEM     # →‎صخ‎→
+
+FCB1 ; 0635 062D ;     MA      # ( ‎ﲱ‎ → ‎صح‎ ) ARABIC LIGATURE SAD WITH HAH INITIAL FORM → ARABIC LETTER SAD, ARABIC LETTER HAH       # 
+FC20 ; 0635 062D ;     MA      # ( ‎ﰠ‎ → ‎صح‎ ) ARABIC LIGATURE SAD WITH HAH ISOLATED FORM → ARABIC LETTER SAD, ARABIC LETTER HAH      # 
+
+FD65 ; 0635 062D 062D ;        MA      # ( ‎ﵥ‎ → ‎صحح‎ ) ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM → ARABIC LETTER SAD, ARABIC LETTER HAH, ARABIC LETTER HAH # 
+FD64 ; 0635 062D 062D ;        MA      # ( ‎ﵤ‎ → ‎صحح‎ ) ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM → ARABIC LETTER SAD, ARABIC LETTER HAH, ARABIC LETTER HAH   # 
+
+FDA9 ; 0635 062D 0649 ;        MA      # ( ‎ﶩ‎ → ‎صحى‎ ) ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM → ARABIC LETTER SAD, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA  # →‎صحي‎→
+
+FD2B ; 0635 0631 ;     MA      # ( ‎ﴫ‎ → ‎صر‎ ) ARABIC LIGATURE SAD WITH REH FINAL FORM → ARABIC LETTER SAD, ARABIC LETTER REH # 
+FD0F ; 0635 0631 ;     MA      # ( ‎ﴏ‎ → ‎صر‎ ) ARABIC LIGATURE SAD WITH REH ISOLATED FORM → ARABIC LETTER SAD, ARABIC LETTER REH      # 
+
+FDF5 ; 0635 0644 0639 0645 ;   MA      # ( ‎ﷵ‎ → ‎صلعم‎ ) ARABIC LIGATURE SALAM ISOLATED FORM → ARABIC LETTER SAD, ARABIC LETTER LAM, ARABIC LETTER AIN, ARABIC LETTER MEEM  # 
+
+FDF9 ; 0635 0644 0649 ;        MA      # ( ‎ﷹ‎ → ‎صلى‎ ) ARABIC LIGATURE SALLA ISOLATED FORM → ARABIC LETTER SAD, ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA       # 
+
+FDFA ; 0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 0649 0647 0020 0648 0633 0644 0645 ;     MA      #* ( ‎ﷺ‎ → ‎صلى الله علىه وسلم‎ ) ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM → ARABIC LETTER SAD, ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA, SPACE, ARABIC LETTER ALEF, ARABIC LETTER LAM, ARABIC LETTER LAM, ARABIC LETTER HEH, SPACE, ARABIC LETTER AIN, ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HEH, SPACE, ARABIC LETTER WAW, ARABIC LETTER SEEN, ARABIC LETTER LAM, ARABIC LETTER MEEM      # →‎صلى الله عليه وسلم‎→
+
+FDF0 ; 0635 0644 06D2 ;        MA      # ( ‎ﷰ‎ → ‎صلے‎ ) ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM → ARABIC LETTER SAD, ARABIC LETTER LAM, ARABIC LETTER YEH BARREE       # 
+
+FCB3 ; 0635 0645 ;     MA      # ( ‎ﲳ‎ → ‎صم‎ ) ARABIC LIGATURE SAD WITH MEEM INITIAL FORM → ARABIC LETTER SAD, ARABIC LETTER MEEM     # 
+FC21 ; 0635 0645 ;     MA      # ( ‎ﰡ‎ → ‎صم‎ ) ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM → ARABIC LETTER SAD, ARABIC LETTER MEEM    # 
+
+FDC5 ; 0635 0645 0645 ;        MA      # ( ‎ﷅ‎ → ‎صمم‎ ) ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM → ARABIC LETTER SAD, ARABIC LETTER MEEM, ARABIC LETTER MEEM     # 
+FD66 ; 0635 0645 0645 ;        MA      # ( ‎ﵦ‎ → ‎صمم‎ ) ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM → ARABIC LETTER SAD, ARABIC LETTER MEEM, ARABIC LETTER MEEM       # 
+
+FD21 ; 0635 0649 ;     MA      # ( ‎ﴡ‎ → ‎صى‎ ) ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER SAD, ARABIC LETTER ALEF MAKSURA       # 
+FD05 ; 0635 0649 ;     MA      # ( ‎ﴅ‎ → ‎صى‎ ) ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER SAD, ARABIC LETTER ALEF MAKSURA    # 
+FD22 ; 0635 0649 ;     MA      # ( ‎ﴢ‎ → ‎صى‎ ) ARABIC LIGATURE SAD WITH YEH FINAL FORM → ARABIC LETTER SAD, ARABIC LETTER ALEF MAKSURA        # →‎صي‎→
+FD06 ; 0635 0649 ;     MA      # ( ‎ﴆ‎ → ‎صى‎ ) ARABIC LIGATURE SAD WITH YEH ISOLATED FORM → ARABIC LETTER SAD, ARABIC LETTER ALEF MAKSURA     # →‎صي‎→
+
+FEBF ; 0636 ;  MA      # ( ‎ﺿ‎ → ‎ض‎ ) ARABIC LETTER DAD INITIAL FORM → ARABIC LETTER DAD       # 
+FEC0 ; 0636 ;  MA      # ( ‎ﻀ‎ → ‎ض‎ ) ARABIC LETTER DAD MEDIAL FORM → ARABIC LETTER DAD        # 
+FEBE ; 0636 ;  MA      # ( ‎ﺾ‎ → ‎ض‎ ) ARABIC LETTER DAD FINAL FORM → ARABIC LETTER DAD # 
+FEBD ; 0636 ;  MA      # ( ‎ﺽ‎ → ‎ض‎ ) ARABIC LETTER DAD ISOLATED FORM → ARABIC LETTER DAD      # 
+
+FCB4 ; 0636 062C ;     MA      # ( ‎ﲴ‎ → ‎ضج‎ ) ARABIC LIGATURE DAD WITH JEEM INITIAL FORM → ARABIC LETTER DAD, ARABIC LETTER JEEM     # 
+FC22 ; 0636 062C ;     MA      # ( ‎ﰢ‎ → ‎ضج‎ ) ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM → ARABIC LETTER DAD, ARABIC LETTER JEEM    # 
+FCB6 ; 0636 062C ;     MA      # ( ‎ﲶ‎ → ‎ضج‎ ) ARABIC LIGATURE DAD WITH KHAH INITIAL FORM → ARABIC LETTER DAD, ARABIC LETTER JEEM     # →‎ضخ‎→→‎ﰤ‎→→‎ﰢ‎→
+FC24 ; 0636 062C ;     MA      # ( ‎ﰤ‎ → ‎ضج‎ ) ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM → ARABIC LETTER DAD, ARABIC LETTER JEEM    # →‎ﰢ‎→
+
+FD70 ; 0636 062C 0645 ;        MA      # ( ‎ﵰ‎ → ‎ضجم‎ ) ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM → ARABIC LETTER DAD, ARABIC LETTER JEEM, ARABIC LETTER MEEM     # →‎ضخم‎→
+FD6F ; 0636 062C 0645 ;        MA      # ( ‎ﵯ‎ → ‎ضجم‎ ) ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM → ARABIC LETTER DAD, ARABIC LETTER JEEM, ARABIC LETTER MEEM       # →‎ضخم‎→
+
+FCB5 ; 0636 062D ;     MA      # ( ‎ﲵ‎ → ‎ضح‎ ) ARABIC LIGATURE DAD WITH HAH INITIAL FORM → ARABIC LETTER DAD, ARABIC LETTER HAH       # 
+FC23 ; 0636 062D ;     MA      # ( ‎ﰣ‎ → ‎ضح‎ ) ARABIC LIGATURE DAD WITH HAH ISOLATED FORM → ARABIC LETTER DAD, ARABIC LETTER HAH      # 
+
+FD6E ; 0636 062D 0649 ;        MA      # ( ‎ﵮ‎ → ‎ضحى‎ ) ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER DAD, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA # 
+FDAB ; 0636 062D 0649 ;        MA      # ( ‎ﶫ‎ → ‎ضحى‎ ) ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM → ARABIC LETTER DAD, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA  # →‎ضحي‎→
+
+FD2C ; 0636 0631 ;     MA      # ( ‎ﴬ‎ → ‎ضر‎ ) ARABIC LIGATURE DAD WITH REH FINAL FORM → ARABIC LETTER DAD, ARABIC LETTER REH # 
+FD10 ; 0636 0631 ;     MA      # ( ‎ﴐ‎ → ‎ضر‎ ) ARABIC LIGATURE DAD WITH REH ISOLATED FORM → ARABIC LETTER DAD, ARABIC LETTER REH      # 
+
+FCB7 ; 0636 0645 ;     MA      # ( ‎ﲷ‎ → ‎ضم‎ ) ARABIC LIGATURE DAD WITH MEEM INITIAL FORM → ARABIC LETTER DAD, ARABIC LETTER MEEM     # 
+FC25 ; 0636 0645 ;     MA      # ( ‎ﰥ‎ → ‎ضم‎ ) ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM → ARABIC LETTER DAD, ARABIC LETTER MEEM    # 
+
+FD23 ; 0636 0649 ;     MA      # ( ‎ﴣ‎ → ‎ضى‎ ) ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER DAD, ARABIC LETTER ALEF MAKSURA       # 
+FD07 ; 0636 0649 ;     MA      # ( ‎ﴇ‎ → ‎ضى‎ ) ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER DAD, ARABIC LETTER ALEF MAKSURA    # 
+FD24 ; 0636 0649 ;     MA      # ( ‎ﴤ‎ → ‎ضى‎ ) ARABIC LIGATURE DAD WITH YEH FINAL FORM → ARABIC LETTER DAD, ARABIC LETTER ALEF MAKSURA        # →‎ضي‎→
+FD08 ; 0636 0649 ;     MA      # ( ‎ﴈ‎ → ‎ضى‎ ) ARABIC LIGATURE DAD WITH YEH ISOLATED FORM → ARABIC LETTER DAD, ARABIC LETTER ALEF MAKSURA     # →‎ضي‎→
+
+FEC3 ; 0637 ;  MA      # ( ‎ﻃ‎ → ‎ط‎ ) ARABIC LETTER TAH INITIAL FORM → ARABIC LETTER TAH       # 
+FEC4 ; 0637 ;  MA      # ( ‎ﻄ‎ → ‎ط‎ ) ARABIC LETTER TAH MEDIAL FORM → ARABIC LETTER TAH        # 
+FEC2 ; 0637 ;  MA      # ( ‎ﻂ‎ → ‎ط‎ ) ARABIC LETTER TAH FINAL FORM → ARABIC LETTER TAH # 
+FEC1 ; 0637 ;  MA      # ( ‎ﻁ‎ → ‎ط‎ ) ARABIC LETTER TAH ISOLATED FORM → ARABIC LETTER TAH      # 
+
+FCB8 ; 0637 062D ;     MA      # ( ‎ﲸ‎ → ‎طح‎ ) ARABIC LIGATURE TAH WITH HAH INITIAL FORM → ARABIC LETTER TAH, ARABIC LETTER HAH       # 
+FC26 ; 0637 062D ;     MA      # ( ‎ﰦ‎ → ‎طح‎ ) ARABIC LIGATURE TAH WITH HAH ISOLATED FORM → ARABIC LETTER TAH, ARABIC LETTER HAH      # 
+
+FD33 ; 0637 0645 ;     MA      # ( ‎ﴳ‎ → ‎طم‎ ) ARABIC LIGATURE TAH WITH MEEM INITIAL FORM → ARABIC LETTER TAH, ARABIC LETTER MEEM     # 
+FD3A ; 0637 0645 ;     MA      # ( ‎ﴺ‎ → ‎طم‎ ) ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM → ARABIC LETTER TAH, ARABIC LETTER MEEM      # 
+FC27 ; 0637 0645 ;     MA      # ( ‎ﰧ‎ → ‎طم‎ ) ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM → ARABIC LETTER TAH, ARABIC LETTER MEEM    # 
+
+FD72 ; 0637 0645 062D ;        MA      # ( ‎ﵲ‎ → ‎طمح‎ ) ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM → ARABIC LETTER TAH, ARABIC LETTER MEEM, ARABIC LETTER HAH       # 
+FD71 ; 0637 0645 062D ;        MA      # ( ‎ﵱ‎ → ‎طمح‎ ) ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM → ARABIC LETTER TAH, ARABIC LETTER MEEM, ARABIC LETTER HAH # 
+
+FD73 ; 0637 0645 0645 ;        MA      # ( ‎ﵳ‎ → ‎طمم‎ ) ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM → ARABIC LETTER TAH, ARABIC LETTER MEEM, ARABIC LETTER MEEM     # 
+
+FD74 ; 0637 0645 0649 ;        MA      # ( ‎ﵴ‎ → ‎طمى‎ ) ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER TAH, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA        # →‎طمي‎→
+
+FD11 ; 0637 0649 ;     MA      # ( ‎ﴑ‎ → ‎طى‎ ) ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER TAH, ARABIC LETTER ALEF MAKSURA       # 
+FCF5 ; 0637 0649 ;     MA      # ( ‎ﳵ‎ → ‎طى‎ ) ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER TAH, ARABIC LETTER ALEF MAKSURA    # 
+FD12 ; 0637 0649 ;     MA      # ( ‎ﴒ‎ → ‎طى‎ ) ARABIC LIGATURE TAH WITH YEH FINAL FORM → ARABIC LETTER TAH, ARABIC LETTER ALEF MAKSURA        # →‎طي‎→
+FCF6 ; 0637 0649 ;     MA      # ( ‎ﳶ‎ → ‎طى‎ ) ARABIC LIGATURE TAH WITH YEH ISOLATED FORM → ARABIC LETTER TAH, ARABIC LETTER ALEF MAKSURA     # →‎طي‎→
+
+FEC7 ; 0638 ;  MA      # ( ‎ﻇ‎ → ‎ظ‎ ) ARABIC LETTER ZAH INITIAL FORM → ARABIC LETTER ZAH       # 
+FEC8 ; 0638 ;  MA      # ( ‎ﻈ‎ → ‎ظ‎ ) ARABIC LETTER ZAH MEDIAL FORM → ARABIC LETTER ZAH        # 
+FEC6 ; 0638 ;  MA      # ( ‎ﻆ‎ → ‎ظ‎ ) ARABIC LETTER ZAH FINAL FORM → ARABIC LETTER ZAH # 
+FEC5 ; 0638 ;  MA      # ( ‎ﻅ‎ → ‎ظ‎ ) ARABIC LETTER ZAH ISOLATED FORM → ARABIC LETTER ZAH      # 
+
+FCB9 ; 0638 0645 ;     MA      # ( ‎ﲹ‎ → ‎ظم‎ ) ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM → ARABIC LETTER ZAH, ARABIC LETTER MEEM     # 
+FD3B ; 0638 0645 ;     MA      # ( ‎ﴻ‎ → ‎ظم‎ ) ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM → ARABIC LETTER ZAH, ARABIC LETTER MEEM      # 
+FC28 ; 0638 0645 ;     MA      # ( ‎ﰨ‎ → ‎ظم‎ ) ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM → ARABIC LETTER ZAH, ARABIC LETTER MEEM    # 
+
+FECB ; 0639 ;  MA      # ( ‎ﻋ‎ → ‎ع‎ ) ARABIC LETTER AIN INITIAL FORM → ARABIC LETTER AIN       # 
+FECC ; 0639 ;  MA      # ( ‎ﻌ‎ → ‎ع‎ ) ARABIC LETTER AIN MEDIAL FORM → ARABIC LETTER AIN        # 
+FECA ; 0639 ;  MA      # ( ‎ﻊ‎ → ‎ع‎ ) ARABIC LETTER AIN FINAL FORM → ARABIC LETTER AIN # 
+FEC9 ; 0639 ;  MA      # ( ‎ﻉ‎ → ‎ع‎ ) ARABIC LETTER AIN ISOLATED FORM → ARABIC LETTER AIN      # 
+
+FCBA ; 0639 062C ;     MA      # ( ‎ﲺ‎ → ‎عج‎ ) ARABIC LIGATURE AIN WITH JEEM INITIAL FORM → ARABIC LETTER AIN, ARABIC LETTER JEEM     # 
+FC29 ; 0639 062C ;     MA      # ( ‎ﰩ‎ → ‎عج‎ ) ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM → ARABIC LETTER AIN, ARABIC LETTER JEEM    # 
+
+FDC4 ; 0639 062C 0645 ;        MA      # ( ‎ﷄ‎ → ‎عجم‎ ) ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM → ARABIC LETTER AIN, ARABIC LETTER JEEM, ARABIC LETTER MEEM     # 
+FD75 ; 0639 062C 0645 ;        MA      # ( ‎ﵵ‎ → ‎عجم‎ ) ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM → ARABIC LETTER AIN, ARABIC LETTER JEEM, ARABIC LETTER MEEM       # 
+
+FDF7 ; 0639 0644 0649 0647 ;   MA      # ( ‎ﷷ‎ → ‎علىه‎ ) ARABIC LIGATURE ALAYHE ISOLATED FORM → ARABIC LETTER AIN, ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HEH # →‎عليه‎→
+
+FCBB ; 0639 0645 ;     MA      # ( ‎ﲻ‎ → ‎عم‎ ) ARABIC LIGATURE AIN WITH MEEM INITIAL FORM → ARABIC LETTER AIN, ARABIC LETTER MEEM     # 
+FC2A ; 0639 0645 ;     MA      # ( ‎ﰪ‎ → ‎عم‎ ) ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM → ARABIC LETTER AIN, ARABIC LETTER MEEM    # 
+
+FD77 ; 0639 0645 0645 ;        MA      # ( ‎ﵷ‎ → ‎عمم‎ ) ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM → ARABIC LETTER AIN, ARABIC LETTER MEEM, ARABIC LETTER MEEM     # 
+FD76 ; 0639 0645 0645 ;        MA      # ( ‎ﵶ‎ → ‎عمم‎ ) ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM → ARABIC LETTER AIN, ARABIC LETTER MEEM, ARABIC LETTER MEEM       # 
+
+FD78 ; 0639 0645 0649 ;        MA      # ( ‎ﵸ‎ → ‎عمى‎ ) ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER AIN, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA       # 
+FDB6 ; 0639 0645 0649 ;        MA      # ( ‎ﶶ‎ → ‎عمى‎ ) ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER AIN, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA        # →‎عمي‎→
+
+FD13 ; 0639 0649 ;     MA      # ( ‎ﴓ‎ → ‎عى‎ ) ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER AIN, ARABIC LETTER ALEF MAKSURA       # 
+FCF7 ; 0639 0649 ;     MA      # ( ‎ﳷ‎ → ‎عى‎ ) ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER AIN, ARABIC LETTER ALEF MAKSURA    # 
+FD14 ; 0639 0649 ;     MA      # ( ‎ﴔ‎ → ‎عى‎ ) ARABIC LIGATURE AIN WITH YEH FINAL FORM → ARABIC LETTER AIN, ARABIC LETTER ALEF MAKSURA        # →‎عي‎→
+FCF8 ; 0639 0649 ;     MA      # ( ‎ﳸ‎ → ‎عى‎ ) ARABIC LIGATURE AIN WITH YEH ISOLATED FORM → ARABIC LETTER AIN, ARABIC LETTER ALEF MAKSURA     # →‎عي‎→
+
+FECF ; 063A ;  MA      # ( ‎ﻏ‎ → ‎غ‎ ) ARABIC LETTER GHAIN INITIAL FORM → ARABIC LETTER GHAIN   # 
+FED0 ; 063A ;  MA      # ( ‎ﻐ‎ → ‎غ‎ ) ARABIC LETTER GHAIN MEDIAL FORM → ARABIC LETTER GHAIN    # 
+FECE ; 063A ;  MA      # ( ‎ﻎ‎ → ‎غ‎ ) ARABIC LETTER GHAIN FINAL FORM → ARABIC LETTER GHAIN     # 
+FECD ; 063A ;  MA      # ( ‎ﻍ‎ → ‎غ‎ ) ARABIC LETTER GHAIN ISOLATED FORM → ARABIC LETTER GHAIN  # 
+
+FCBC ; 063A 062C ;     MA      # ( ‎ﲼ‎ → ‎غج‎ ) ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM → ARABIC LETTER GHAIN, ARABIC LETTER JEEM # 
+FC2B ; 063A 062C ;     MA      # ( ‎ﰫ‎ → ‎غج‎ ) ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM → ARABIC LETTER GHAIN, ARABIC LETTER JEEM        # 
+
+FCBD ; 063A 0645 ;     MA      # ( ‎ﲽ‎ → ‎غم‎ ) ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM → ARABIC LETTER GHAIN, ARABIC LETTER MEEM # 
+FC2C ; 063A 0645 ;     MA      # ( ‎ﰬ‎ → ‎غم‎ ) ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM → ARABIC LETTER GHAIN, ARABIC LETTER MEEM        # 
+
+FD79 ; 063A 0645 0645 ;        MA      # ( ‎ﵹ‎ → ‎غمم‎ ) ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM → ARABIC LETTER GHAIN, ARABIC LETTER MEEM, ARABIC LETTER MEEM   # 
+
+FD7B ; 063A 0645 0649 ;        MA      # ( ‎ﵻ‎ → ‎غمى‎ ) ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER GHAIN, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA   # 
+FD7A ; 063A 0645 0649 ;        MA      # ( ‎ﵺ‎ → ‎غمى‎ ) ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER GHAIN, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA    # →‎غمي‎→
+
+FD15 ; 063A 0649 ;     MA      # ( ‎ﴕ‎ → ‎غى‎ ) ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER GHAIN, ARABIC LETTER ALEF MAKSURA   # 
+FCF9 ; 063A 0649 ;     MA      # ( ‎ﳹ‎ → ‎غى‎ ) ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER GHAIN, ARABIC LETTER ALEF MAKSURA        # 
+FD16 ; 063A 0649 ;     MA      # ( ‎ﴖ‎ → ‎غى‎ ) ARABIC LIGATURE GHAIN WITH YEH FINAL FORM → ARABIC LETTER GHAIN, ARABIC LETTER ALEF MAKSURA    # →‎غي‎→
+FCFA ; 063A 0649 ;     MA      # ( ‎ﳺ‎ → ‎غى‎ ) ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM → ARABIC LETTER GHAIN, ARABIC LETTER ALEF MAKSURA # →‎غي‎→
+
+FED3 ; 0641 ;  MA      # ( ‎ﻓ‎ → ‎ف‎ ) ARABIC LETTER FEH INITIAL FORM → ARABIC LETTER FEH       # 
+FED4 ; 0641 ;  MA      # ( ‎ﻔ‎ → ‎ف‎ ) ARABIC LETTER FEH MEDIAL FORM → ARABIC LETTER FEH        # 
+FED2 ; 0641 ;  MA      # ( ‎ﻒ‎ → ‎ف‎ ) ARABIC LETTER FEH FINAL FORM → ARABIC LETTER FEH # 
+FED1 ; 0641 ;  MA      # ( ‎ﻑ‎ → ‎ف‎ ) ARABIC LETTER FEH ISOLATED FORM → ARABIC LETTER FEH      # 
+
+FCBE ; 0641 062C ;     MA      # ( ‎ﲾ‎ → ‎فج‎ ) ARABIC LIGATURE FEH WITH JEEM INITIAL FORM → ARABIC LETTER FEH, ARABIC LETTER JEEM     # 
+FC2D ; 0641 062C ;     MA      # ( ‎ﰭ‎ → ‎فج‎ ) ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM → ARABIC LETTER FEH, ARABIC LETTER JEEM    # 
+FCC0 ; 0641 062C ;     MA      # ( ‎ﳀ‎ → ‎فج‎ ) ARABIC LIGATURE FEH WITH KHAH INITIAL FORM → ARABIC LETTER FEH, ARABIC LETTER JEEM     # →‎فخ‎→→‎ﰯ‎→→‎ﰭ‎→
+FC2F ; 0641 062C ;     MA      # ( ‎ﰯ‎ → ‎فج‎ ) ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM → ARABIC LETTER FEH, ARABIC LETTER JEEM    # →‎ﰭ‎→
+
+FD7D ; 0641 062C 0645 ;        MA      # ( ‎ﵽ‎ → ‎فجم‎ ) ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM → ARABIC LETTER FEH, ARABIC LETTER JEEM, ARABIC LETTER MEEM     # →‎فخم‎→
+FD7C ; 0641 062C 0645 ;        MA      # ( ‎ﵼ‎ → ‎فجم‎ ) ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM → ARABIC LETTER FEH, ARABIC LETTER JEEM, ARABIC LETTER MEEM       # →‎فخم‎→
+
+FCBF ; 0641 062D ;     MA      # ( ‎ﲿ‎ → ‎فح‎ ) ARABIC LIGATURE FEH WITH HAH INITIAL FORM → ARABIC LETTER FEH, ARABIC LETTER HAH       # 
+FC2E ; 0641 062D ;     MA      # ( ‎ﰮ‎ → ‎فح‎ ) ARABIC LIGATURE FEH WITH HAH ISOLATED FORM → ARABIC LETTER FEH, ARABIC LETTER HAH      # 
+
+FCC1 ; 0641 0645 ;     MA      # ( ‎ﳁ‎ → ‎فم‎ ) ARABIC LIGATURE FEH WITH MEEM INITIAL FORM → ARABIC LETTER FEH, ARABIC LETTER MEEM     # 
+FC30 ; 0641 0645 ;     MA      # ( ‎ﰰ‎ → ‎فم‎ ) ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM → ARABIC LETTER FEH, ARABIC LETTER MEEM    # 
+
+FDC1 ; 0641 0645 0649 ;        MA      # ( ‎ﷁ‎ → ‎فمى‎ ) ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER FEH, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA        # →‎فمي‎→
+
+FC7C ; 0641 0649 ;     MA      # ( ‎ﱼ‎ → ‎فى‎ ) ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER FEH, ARABIC LETTER ALEF MAKSURA       # 
+FC31 ; 0641 0649 ;     MA      # ( ‎ﰱ‎ → ‎فى‎ ) ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER FEH, ARABIC LETTER ALEF MAKSURA    # 
+FC7D ; 0641 0649 ;     MA      # ( ‎ﱽ‎ → ‎فى‎ ) ARABIC LIGATURE FEH WITH YEH FINAL FORM → ARABIC LETTER FEH, ARABIC LETTER ALEF MAKSURA        # →‎في‎→
+FC32 ; 0641 0649 ;     MA      # ( ‎ﰲ‎ → ‎فى‎ ) ARABIC LIGATURE FEH WITH YEH ISOLATED FORM → ARABIC LETTER FEH, ARABIC LETTER ALEF MAKSURA     # →‎في‎→
+
+FB6C ; 06A4 ;  MA      # ( ‎ﭬ‎ → ‎ڤ‎ ) ARABIC LETTER VEH INITIAL FORM → ARABIC LETTER VEH       # 
+FB6D ; 06A4 ;  MA      # ( ‎ﭭ‎ → ‎ڤ‎ ) ARABIC LETTER VEH MEDIAL FORM → ARABIC LETTER VEH        # 
+FB6B ; 06A4 ;  MA      # ( ‎ﭫ‎ → ‎ڤ‎ ) ARABIC LETTER VEH FINAL FORM → ARABIC LETTER VEH # 
+FB6A ; 06A4 ;  MA      # ( ‎ﭪ‎ → ‎ڤ‎ ) ARABIC LETTER VEH ISOLATED FORM → ARABIC LETTER VEH      # 
+
+FB70 ; 06A6 ;  MA      # ( ‎ﭰ‎ → ‎ڦ‎ ) ARABIC LETTER PEHEH INITIAL FORM → ARABIC LETTER PEHEH   # 
+FB71 ; 06A6 ;  MA      # ( ‎ﭱ‎ → ‎ڦ‎ ) ARABIC LETTER PEHEH MEDIAL FORM → ARABIC LETTER PEHEH    # 
+FB6F ; 06A6 ;  MA      # ( ‎ﭯ‎ → ‎ڦ‎ ) ARABIC LETTER PEHEH FINAL FORM → ARABIC LETTER PEHEH     # 
+FB6E ; 06A6 ;  MA      # ( ‎ﭮ‎ → ‎ڦ‎ ) ARABIC LETTER PEHEH ISOLATED FORM → ARABIC LETTER PEHEH  # 
+
+FED7 ; 0642 ;  MA      # ( ‎ﻗ‎ → ‎ق‎ ) ARABIC LETTER QAF INITIAL FORM → ARABIC LETTER QAF       # 
+FED8 ; 0642 ;  MA      # ( ‎ﻘ‎ → ‎ق‎ ) ARABIC LETTER QAF MEDIAL FORM → ARABIC LETTER QAF        # 
+FED6 ; 0642 ;  MA      # ( ‎ﻖ‎ → ‎ق‎ ) ARABIC LETTER QAF FINAL FORM → ARABIC LETTER QAF # 
+FED5 ; 0642 ;  MA      # ( ‎ﻕ‎ → ‎ق‎ ) ARABIC LETTER QAF ISOLATED FORM → ARABIC LETTER QAF      # 
+
+FCC2 ; 0642 062D ;     MA      # ( ‎ﳂ‎ → ‎قح‎ ) ARABIC LIGATURE QAF WITH HAH INITIAL FORM → ARABIC LETTER QAF, ARABIC LETTER HAH       # 
+FC33 ; 0642 062D ;     MA      # ( ‎ﰳ‎ → ‎قح‎ ) ARABIC LIGATURE QAF WITH HAH ISOLATED FORM → ARABIC LETTER QAF, ARABIC LETTER HAH      # 
+
+FDF1 ; 0642 0644 06D2 ;        MA      # ( ‎ﷱ‎ → ‎قلے‎ ) ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM → ARABIC LETTER QAF, ARABIC LETTER LAM, ARABIC LETTER YEH BARREE        # 
+
+FCC3 ; 0642 0645 ;     MA      # ( ‎ﳃ‎ → ‎قم‎ ) ARABIC LIGATURE QAF WITH MEEM INITIAL FORM → ARABIC LETTER QAF, ARABIC LETTER MEEM     # 
+FC34 ; 0642 0645 ;     MA      # ( ‎ﰴ‎ → ‎قم‎ ) ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM → ARABIC LETTER QAF, ARABIC LETTER MEEM    # 
+
+FDB4 ; 0642 0645 062D ;        MA      # ( ‎ﶴ‎ → ‎قمح‎ ) ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM → ARABIC LETTER QAF, ARABIC LETTER MEEM, ARABIC LETTER HAH       # 
+FD7E ; 0642 0645 062D ;        MA      # ( ‎ﵾ‎ → ‎قمح‎ ) ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM → ARABIC LETTER QAF, ARABIC LETTER MEEM, ARABIC LETTER HAH # 
+
+FD7F ; 0642 0645 0645 ;        MA      # ( ‎ﵿ‎ → ‎قمم‎ ) ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM → ARABIC LETTER QAF, ARABIC LETTER MEEM, ARABIC LETTER MEEM       # 
+
+FDB2 ; 0642 0645 0649 ;        MA      # ( ‎ﶲ‎ → ‎قمى‎ ) ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER QAF, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA        # →‎قمي‎→
+
+FC7E ; 0642 0649 ;     MA      # ( ‎ﱾ‎ → ‎قى‎ ) ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER QAF, ARABIC LETTER ALEF MAKSURA       # 
+FC35 ; 0642 0649 ;     MA      # ( ‎ﰵ‎ → ‎قى‎ ) ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER QAF, ARABIC LETTER ALEF MAKSURA    # 
+FC7F ; 0642 0649 ;     MA      # ( ‎ﱿ‎ → ‎قى‎ ) ARABIC LIGATURE QAF WITH YEH FINAL FORM → ARABIC LETTER QAF, ARABIC LETTER ALEF MAKSURA        # →‎قي‎→
+FC36 ; 0642 0649 ;     MA      # ( ‎ﰶ‎ → ‎قى‎ ) ARABIC LIGATURE QAF WITH YEH ISOLATED FORM → ARABIC LETTER QAF, ARABIC LETTER ALEF MAKSURA     # →‎قي‎→
+
+FEDB ; 0643 ;  MA      # ( ‎ﻛ‎ → ‎ك‎ ) ARABIC LETTER KAF INITIAL FORM → ARABIC LETTER KAF       # 
+FEDC ; 0643 ;  MA      # ( ‎ﻜ‎ → ‎ك‎ ) ARABIC LETTER KAF MEDIAL FORM → ARABIC LETTER KAF        # 
+FEDA ; 0643 ;  MA      # ( ‎ﻚ‎ → ‎ك‎ ) ARABIC LETTER KAF FINAL FORM → ARABIC LETTER KAF # 
+FED9 ; 0643 ;  MA      # ( ‎ﻙ‎ → ‎ك‎ ) ARABIC LETTER KAF ISOLATED FORM → ARABIC LETTER KAF      # 
+06A9 ; 0643 ;  MA      # ( ‎ک‎ → ‎ك‎ ) ARABIC LETTER KEHEH → ARABIC LETTER KAF   # 
+FB90 ; 0643 ;  MA      # ( ‎ﮐ‎ → ‎ك‎ ) ARABIC LETTER KEHEH INITIAL FORM → ARABIC LETTER KAF     # →‎ﻜ‎→
+FB91 ; 0643 ;  MA      # ( ‎ﮑ‎ → ‎ك‎ ) ARABIC LETTER KEHEH MEDIAL FORM → ARABIC LETTER KAF      # →‎ﻜ‎→
+FB8F ; 0643 ;  MA      # ( ‎ﮏ‎ → ‎ك‎ ) ARABIC LETTER KEHEH FINAL FORM → ARABIC LETTER KAF       # →‎ﻚ‎→
+FB8E ; 0643 ;  MA      # ( ‎ﮎ‎ → ‎ك‎ ) ARABIC LETTER KEHEH ISOLATED FORM → ARABIC LETTER KAF    # →‎ک‎→
+
+FC80 ; 0643 0627 ;     MA      # ( ‎ﲀ‎ → ‎كا‎ ) ARABIC LIGATURE KAF WITH ALEF FINAL FORM → ARABIC LETTER KAF, ARABIC LETTER ALEF       # 
+FC37 ; 0643 0627 ;     MA      # ( ‎ﰷ‎ → ‎كا‎ ) ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM → ARABIC LETTER KAF, ARABIC LETTER ALEF    # 
+
+FCC4 ; 0643 062C ;     MA      # ( ‎ﳄ‎ → ‎كج‎ ) ARABIC LIGATURE KAF WITH JEEM INITIAL FORM → ARABIC LETTER KAF, ARABIC LETTER JEEM     # 
+FC38 ; 0643 062C ;     MA      # ( ‎ﰸ‎ → ‎كج‎ ) ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM → ARABIC LETTER KAF, ARABIC LETTER JEEM    # 
+FCC6 ; 0643 062C ;     MA      # ( ‎ﳆ‎ → ‎كج‎ ) ARABIC LIGATURE KAF WITH KHAH INITIAL FORM → ARABIC LETTER KAF, ARABIC LETTER JEEM     # →‎كخ‎→→‎ﰺ‎→→‎ﰸ‎→
+FC3A ; 0643 062C ;     MA      # ( ‎ﰺ‎ → ‎كج‎ ) ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM → ARABIC LETTER KAF, ARABIC LETTER JEEM    # →‎ﰸ‎→
+
+FCC5 ; 0643 062D ;     MA      # ( ‎ﳅ‎ → ‎كح‎ ) ARABIC LIGATURE KAF WITH HAH INITIAL FORM → ARABIC LETTER KAF, ARABIC LETTER HAH       # 
+FC39 ; 0643 062D ;     MA      # ( ‎ﰹ‎ → ‎كح‎ ) ARABIC LIGATURE KAF WITH HAH ISOLATED FORM → ARABIC LETTER KAF, ARABIC LETTER HAH      # 
+
+FCC7 ; 0643 0644 ;     MA      # ( ‎ﳇ‎ → ‎كل‎ ) ARABIC LIGATURE KAF WITH LAM INITIAL FORM → ARABIC LETTER KAF, ARABIC LETTER LAM       # 
+FCEB ; 0643 0644 ;     MA      # ( ‎ﳫ‎ → ‎كل‎ ) ARABIC LIGATURE KAF WITH LAM MEDIAL FORM → ARABIC LETTER KAF, ARABIC LETTER LAM        # 
+FC81 ; 0643 0644 ;     MA      # ( ‎ﲁ‎ → ‎كل‎ ) ARABIC LIGATURE KAF WITH LAM FINAL FORM → ARABIC LETTER KAF, ARABIC LETTER LAM # 
+FC3B ; 0643 0644 ;     MA      # ( ‎ﰻ‎ → ‎كل‎ ) ARABIC LIGATURE KAF WITH LAM ISOLATED FORM → ARABIC LETTER KAF, ARABIC LETTER LAM      # 
+
+FCC8 ; 0643 0645 ;     MA      # ( ‎ﳈ‎ → ‎كم‎ ) ARABIC LIGATURE KAF WITH MEEM INITIAL FORM → ARABIC LETTER KAF, ARABIC LETTER MEEM     # 
+FCEC ; 0643 0645 ;     MA      # ( ‎ﳬ‎ → ‎كم‎ ) ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM → ARABIC LETTER KAF, ARABIC LETTER MEEM      # 
+FC82 ; 0643 0645 ;     MA      # ( ‎ﲂ‎ → ‎كم‎ ) ARABIC LIGATURE KAF WITH MEEM FINAL FORM → ARABIC LETTER KAF, ARABIC LETTER MEEM       # 
+FC3C ; 0643 0645 ;     MA      # ( ‎ﰼ‎ → ‎كم‎ ) ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM → ARABIC LETTER KAF, ARABIC LETTER MEEM    # 
+
+FDC3 ; 0643 0645 0645 ;        MA      # ( ‎ﷃ‎ → ‎كمم‎ ) ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM → ARABIC LETTER KAF, ARABIC LETTER MEEM, ARABIC LETTER MEEM     # 
+FDBB ; 0643 0645 0645 ;        MA      # ( ‎ﶻ‎ → ‎كمم‎ ) ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM → ARABIC LETTER KAF, ARABIC LETTER MEEM, ARABIC LETTER MEEM       # 
+
+FDB7 ; 0643 0645 0649 ;        MA      # ( ‎ﶷ‎ → ‎كمى‎ ) ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER KAF, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA        # →‎كمي‎→
+
+FC83 ; 0643 0649 ;     MA      # ( ‎ﲃ‎ → ‎كى‎ ) ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER KAF, ARABIC LETTER ALEF MAKSURA       # 
+FC3D ; 0643 0649 ;     MA      # ( ‎ﰽ‎ → ‎كى‎ ) ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER KAF, ARABIC LETTER ALEF MAKSURA    # 
+FC84 ; 0643 0649 ;     MA      # ( ‎ﲄ‎ → ‎كى‎ ) ARABIC LIGATURE KAF WITH YEH FINAL FORM → ARABIC LETTER KAF, ARABIC LETTER ALEF MAKSURA        # →‎كي‎→
+FC3E ; 0643 0649 ;     MA      # ( ‎ﰾ‎ → ‎كى‎ ) ARABIC LIGATURE KAF WITH YEH ISOLATED FORM → ARABIC LETTER KAF, ARABIC LETTER ALEF MAKSURA     # →‎كي‎→
+
+FBD5 ; 06AD ;  MA      # ( ‎ﯕ‎ → ‎ڭ‎ ) ARABIC LETTER NG INITIAL FORM → ARABIC LETTER NG # 
+FBD6 ; 06AD ;  MA      # ( ‎ﯖ‎ → ‎ڭ‎ ) ARABIC LETTER NG MEDIAL FORM → ARABIC LETTER NG  # 
+FBD4 ; 06AD ;  MA      # ( ‎ﯔ‎ → ‎ڭ‎ ) ARABIC LETTER NG FINAL FORM → ARABIC LETTER NG   # 
+FBD3 ; 06AD ;  MA      # ( ‎ﯓ‎ → ‎ڭ‎ ) ARABIC LETTER NG ISOLATED FORM → ARABIC LETTER NG        # 
+
+FB94 ; 06AF ;  MA      # ( ‎ﮔ‎ → ‎گ‎ ) ARABIC LETTER GAF INITIAL FORM → ARABIC LETTER GAF       # 
+FB95 ; 06AF ;  MA      # ( ‎ﮕ‎ → ‎گ‎ ) ARABIC LETTER GAF MEDIAL FORM → ARABIC LETTER GAF        # 
+FB93 ; 06AF ;  MA      # ( ‎ﮓ‎ → ‎گ‎ ) ARABIC LETTER GAF FINAL FORM → ARABIC LETTER GAF # 
+FB92 ; 06AF ;  MA      # ( ‎ﮒ‎ → ‎گ‎ ) ARABIC LETTER GAF ISOLATED FORM → ARABIC LETTER GAF      # 
+
+FB9C ; 06B1 ;  MA      # ( ‎ﮜ‎ → ‎ڱ‎ ) ARABIC LETTER NGOEH INITIAL FORM → ARABIC LETTER NGOEH   # 
+FB9D ; 06B1 ;  MA      # ( ‎ﮝ‎ → ‎ڱ‎ ) ARABIC LETTER NGOEH MEDIAL FORM → ARABIC LETTER NGOEH    # 
+FB9B ; 06B1 ;  MA      # ( ‎ﮛ‎ → ‎ڱ‎ ) ARABIC LETTER NGOEH FINAL FORM → ARABIC LETTER NGOEH     # 
+FB9A ; 06B1 ;  MA      # ( ‎ﮚ‎ → ‎ڱ‎ ) ARABIC LETTER NGOEH ISOLATED FORM → ARABIC LETTER NGOEH  # 
+
+FB98 ; 06B3 ;  MA      # ( ‎ﮘ‎ → ‎ڳ‎ ) ARABIC LETTER GUEH INITIAL FORM → ARABIC LETTER GUEH     # 
+FB99 ; 06B3 ;  MA      # ( ‎ﮙ‎ → ‎ڳ‎ ) ARABIC LETTER GUEH MEDIAL FORM → ARABIC LETTER GUEH      # 
+FB97 ; 06B3 ;  MA      # ( ‎ﮗ‎ → ‎ڳ‎ ) ARABIC LETTER GUEH FINAL FORM → ARABIC LETTER GUEH       # 
+FB96 ; 06B3 ;  MA      # ( ‎ﮖ‎ → ‎ڳ‎ ) ARABIC LETTER GUEH ISOLATED FORM → ARABIC LETTER GUEH    # 
+
+FEDF ; 0644 ;  MA      # ( ‎ﻟ‎ → ‎ل‎ ) ARABIC LETTER LAM INITIAL FORM → ARABIC LETTER LAM       # 
+FEE0 ; 0644 ;  MA      # ( ‎ﻠ‎ → ‎ل‎ ) ARABIC LETTER LAM MEDIAL FORM → ARABIC LETTER LAM        # 
+FEDE ; 0644 ;  MA      # ( ‎ﻞ‎ → ‎ل‎ ) ARABIC LETTER LAM FINAL FORM → ARABIC LETTER LAM # 
+FEDD ; 0644 ;  MA      # ( ‎ﻝ‎ → ‎ل‎ ) ARABIC LETTER LAM ISOLATED FORM → ARABIC LETTER LAM      # 
+
+FEF6 ; 0644 0622 ;     MA      # ( ‎ﻶ‎ → ‎لآ‎ ) ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF WITH MADDA ABOVE     # 
+FEF5 ; 0644 0622 ;     MA      # ( ‎ﻵ‎ → ‎لآ‎ ) ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF WITH MADDA ABOVE  # 
+
+FEFA ; 0644 0625 ;     MA      # ( ‎ﻺ‎ → ‎لإ‎ ) ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF WITH HAMZA BELOW     # 
+FEF9 ; 0644 0625 ;     MA      # ( ‎ﻹ‎ → ‎لإ‎ ) ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF WITH HAMZA BELOW  # 
+
+FEFC ; 0644 0627 ;     MA      # ( ‎ﻼ‎ → ‎لا‎ ) ARABIC LIGATURE LAM WITH ALEF FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF       # 
+FEFB ; 0644 0627 ;     MA      # ( ‎ﻻ‎ → ‎لا‎ ) ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF    # 
+
+FEF8 ; 0644 0627 0674 ;        MA      # ( ‎ﻸ‎ → ‎لاٴ‎ ) ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF, ARABIC LETTER HIGH HAMZA  # →‎لأ‎→
+FEF7 ; 0644 0627 0674 ;        MA      # ( ‎ﻷ‎ → ‎لاٴ‎ ) ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF, ARABIC LETTER HIGH HAMZA       # →‎لأ‎→
+
+FCC9 ; 0644 062C ;     MA      # ( ‎ﳉ‎ → ‎لج‎ ) ARABIC LIGATURE LAM WITH JEEM INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM     # 
+FC3F ; 0644 062C ;     MA      # ( ‎ﰿ‎ → ‎لج‎ ) ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM    # 
+FCCB ; 0644 062C ;     MA      # ( ‎ﳋ‎ → ‎لج‎ ) ARABIC LIGATURE LAM WITH KHAH INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM     # →‎لخ‎→→‎ﱁ‎→→‎ﰿ‎→
+FC41 ; 0644 062C ;     MA      # ( ‎ﱁ‎ → ‎لج‎ ) ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM    # →‎ﰿ‎→
+
+FD83 ; 0644 062C 062C ;        MA      # ( ‎ﶃ‎ → ‎لجج‎ ) ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM, ARABIC LETTER JEEM     # 
+FD84 ; 0644 062C 062C ;        MA      # ( ‎ﶄ‎ → ‎لجج‎ ) ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM, ARABIC LETTER JEEM       # 
+
+FDBA ; 0644 062C 0645 ;        MA      # ( ‎ﶺ‎ → ‎لجم‎ ) ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM, ARABIC LETTER MEEM     # 
+FDBC ; 0644 062C 0645 ;        MA      # ( ‎ﶼ‎ → ‎لجم‎ ) ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM, ARABIC LETTER MEEM       # 
+FD86 ; 0644 062C 0645 ;        MA      # ( ‎ﶆ‎ → ‎لجم‎ ) ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM, ARABIC LETTER MEEM     # →‎لخم‎→
+FD85 ; 0644 062C 0645 ;        MA      # ( ‎ﶅ‎ → ‎لجم‎ ) ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM, ARABIC LETTER MEEM       # →‎لخم‎→
+
+FDAC ; 0644 062C 0649 ;        MA      # ( ‎ﶬ‎ → ‎لجى‎ ) ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA        # →‎لجي‎→
+
+FCCA ; 0644 062D ;     MA      # ( ‎ﳊ‎ → ‎لح‎ ) ARABIC LIGATURE LAM WITH HAH INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER HAH       # 
+FC40 ; 0644 062D ;     MA      # ( ‎ﱀ‎ → ‎لح‎ ) ARABIC LIGATURE LAM WITH HAH ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER HAH      # 
+
+FDB5 ; 0644 062D 0645 ;        MA      # ( ‎ﶵ‎ → ‎لحم‎ ) ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER HAH, ARABIC LETTER MEEM       # 
+FD80 ; 0644 062D 0645 ;        MA      # ( ‎ﶀ‎ → ‎لحم‎ ) ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER HAH, ARABIC LETTER MEEM # 
+
+FD82 ; 0644 062D 0649 ;        MA      # ( ‎ﶂ‎ → ‎لحى‎ ) ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA # 
+FD81 ; 0644 062D 0649 ;        MA      # ( ‎ﶁ‎ → ‎لحى‎ ) ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA  # →‎لحي‎→
+
+FCCC ; 0644 0645 ;     MA      # ( ‎ﳌ‎ → ‎لم‎ ) ARABIC LIGATURE LAM WITH MEEM INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER MEEM     # 
+FCED ; 0644 0645 ;     MA      # ( ‎ﳭ‎ → ‎لم‎ ) ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM → ARABIC LETTER LAM, ARABIC LETTER MEEM      # 
+FC85 ; 0644 0645 ;     MA      # ( ‎ﲅ‎ → ‎لم‎ ) ARABIC LIGATURE LAM WITH MEEM FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER MEEM       # 
+FC42 ; 0644 0645 ;     MA      # ( ‎ﱂ‎ → ‎لم‎ ) ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER MEEM    # 
+
+FD88 ; 0644 0645 062D ;        MA      # ( ‎ﶈ‎ → ‎لمح‎ ) ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER MEEM, ARABIC LETTER HAH       # 
+FD87 ; 0644 0645 062D ;        MA      # ( ‎ﶇ‎ → ‎لمح‎ ) ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER MEEM, ARABIC LETTER HAH # 
+
+FDAD ; 0644 0645 0649 ;        MA      # ( ‎ﶭ‎ → ‎لمى‎ ) ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA        # →‎لمي‎→
+
+FCCD ; 0644 0647 ;     MA      # ( ‎ﳍ‎ → ‎له‎ ) ARABIC LIGATURE LAM WITH HEH INITIAL FORM → ARABIC LETTER LAM, ARABIC LETTER HEH       # 
+
+FC86 ; 0644 0649 ;     MA      # ( ‎ﲆ‎ → ‎لى‎ ) ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA       # 
+FC43 ; 0644 0649 ;     MA      # ( ‎ﱃ‎ → ‎لى‎ ) ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA    # 
+FC87 ; 0644 0649 ;     MA      # ( ‎ﲇ‎ → ‎لى‎ ) ARABIC LIGATURE LAM WITH YEH FINAL FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA        # →‎لي‎→
+FC44 ; 0644 0649 ;     MA      # ( ‎ﱄ‎ → ‎لى‎ ) ARABIC LIGATURE LAM WITH YEH ISOLATED FORM → ARABIC LETTER LAM, ARABIC LETTER ALEF MAKSURA     # →‎لي‎→
+
+FEE3 ; 0645 ;  MA      # ( ‎ﻣ‎ → ‎م‎ ) ARABIC LETTER MEEM INITIAL FORM → ARABIC LETTER MEEM     # 
+FEE4 ; 0645 ;  MA      # ( ‎ﻤ‎ → ‎م‎ ) ARABIC LETTER MEEM MEDIAL FORM → ARABIC LETTER MEEM      # 
+FEE2 ; 0645 ;  MA      # ( ‎ﻢ‎ → ‎م‎ ) ARABIC LETTER MEEM FINAL FORM → ARABIC LETTER MEEM       # 
+FEE1 ; 0645 ;  MA      # ( ‎ﻡ‎ → ‎م‎ ) ARABIC LETTER MEEM ISOLATED FORM → ARABIC LETTER MEEM    # 
+
+FC88 ; 0645 0627 ;     MA      # ( ‎ﲈ‎ → ‎ما‎ ) ARABIC LIGATURE MEEM WITH ALEF FINAL FORM → ARABIC LETTER MEEM, ARABIC LETTER ALEF     # 
+
+FCCE ; 0645 062C ;     MA      # ( ‎ﳎ‎ → ‎مج‎ ) ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM   # 
+FC45 ; 0645 062C ;     MA      # ( ‎ﱅ‎ → ‎مج‎ ) ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM  # 
+FCD0 ; 0645 062C ;     MA      # ( ‎ﳐ‎ → ‎مج‎ ) ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM   # →‎مخ‎→→‎ﱇ‎→→‎ﱅ‎→
+FC47 ; 0645 062C ;     MA      # ( ‎ﱇ‎ → ‎مج‎ ) ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM  # →‎ﱅ‎→
+
+FD92 ; 0645 062C 062C ;        MA      # ( ‎ﶒ‎ → ‎مجج‎ ) ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM, ARABIC LETTER JEEM   # →‎مجخ‎→
+FD8E ; 0645 062C 062C ;        MA      # ( ‎ﶎ‎ → ‎مجج‎ ) ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM, ARABIC LETTER JEEM   # →‎مخج‎→
+
+FD8C ; 0645 062C 062D ;        MA      # ( ‎ﶌ‎ → ‎مجح‎ ) ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM, ARABIC LETTER HAH     # 
+
+FD8D ; 0645 062C 0645 ;        MA      # ( ‎ﶍ‎ → ‎مجم‎ ) ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM, ARABIC LETTER MEEM   # 
+FD8F ; 0645 062C 0645 ;        MA      # ( ‎ﶏ‎ → ‎مجم‎ ) ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM, ARABIC LETTER MEEM   # →‎مخم‎→
+
+FDC0 ; 0645 062C 0649 ;        MA      # ( ‎ﷀ‎ → ‎مجى‎ ) ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA      # →‎مجي‎→
+FDB9 ; 0645 062C 0649 ;        MA      # ( ‎ﶹ‎ → ‎مجى‎ ) ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM → ARABIC LETTER MEEM, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA      # →‎مخي‎→
+
+FCCF ; 0645 062D ;     MA      # ( ‎ﳏ‎ → ‎مح‎ ) ARABIC LIGATURE MEEM WITH HAH INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER HAH     # 
+FC46 ; 0645 062D ;     MA      # ( ‎ﱆ‎ → ‎مح‎ ) ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM → ARABIC LETTER MEEM, ARABIC LETTER HAH    # 
+
+FD89 ; 0645 062D 062C ;        MA      # ( ‎ﶉ‎ → ‎محج‎ ) ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER HAH, ARABIC LETTER JEEM     # 
+
+FD8A ; 0645 062D 0645 ;        MA      # ( ‎ﶊ‎ → ‎محم‎ ) ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER HAH, ARABIC LETTER MEEM     # 
+
+FDF4 ; 0645 062D 0645 062F ;   MA      # ( ‎ﷴ‎ → ‎محمد‎ ) ARABIC LIGATURE MOHAMMAD ISOLATED FORM → ARABIC LETTER MEEM, ARABIC LETTER HAH, ARABIC LETTER MEEM, ARABIC LETTER DAL      # 
+
+FD8B ; 0645 062D 0649 ;        MA      # ( ‎ﶋ‎ → ‎محى‎ ) ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM → ARABIC LETTER MEEM, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA        # →‎محي‎→
+
+FCD1 ; 0645 0645 ;     MA      # ( ‎ﳑ‎ → ‎مم‎ ) ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM → ARABIC LETTER MEEM, ARABIC LETTER MEEM   # 
+FC89 ; 0645 0645 ;     MA      # ( ‎ﲉ‎ → ‎مم‎ ) ARABIC LIGATURE MEEM WITH MEEM FINAL FORM → ARABIC LETTER MEEM, ARABIC LETTER MEEM     # 
+FC48 ; 0645 0645 ;     MA      # ( ‎ﱈ‎ → ‎مم‎ ) ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM → ARABIC LETTER MEEM, ARABIC LETTER MEEM  # 
+
+FDB1 ; 0645 0645 0649 ;        MA      # ( ‎ﶱ‎ → ‎ممى‎ ) ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER MEEM, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA      # →‎ممي‎→
+
+FC49 ; 0645 0649 ;     MA      # ( ‎ﱉ‎ → ‎مى‎ ) ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA  # 
+FC4A ; 0645 0649 ;     MA      # ( ‎ﱊ‎ → ‎مى‎ ) ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM → ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA   # →‎مي‎→
+
+FB9F ; 06BA ;  MA      # ( ‎ﮟ‎ → ‎ں‎ ) ARABIC LETTER NOON GHUNNA FINAL FORM → ARABIC LETTER NOON GHUNNA # 
+FB9E ; 06BA ;  MA      # ( ‎ﮞ‎ → ‎ں‎ ) ARABIC LETTER NOON GHUNNA ISOLATED FORM → ARABIC LETTER NOON GHUNNA      # 
+
+FEEB ; 0647 ;  MA      # ( ‎ﻫ‎ → ‎ه‎ ) ARABIC LETTER HEH INITIAL FORM → ARABIC LETTER HEH       # 
+FEEC ; 0647 ;  MA      # ( ‎ﻬ‎ → ‎ه‎ ) ARABIC LETTER HEH MEDIAL FORM → ARABIC LETTER HEH        # 
+FEEA ; 0647 ;  MA      # ( ‎ﻪ‎ → ‎ه‎ ) ARABIC LETTER HEH FINAL FORM → ARABIC LETTER HEH # 
+FEE9 ; 0647 ;  MA      # ( ‎ﻩ‎ → ‎ه‎ ) ARABIC LETTER HEH ISOLATED FORM → ARABIC LETTER HEH      # 
+06BE ; 0647 ;  MA      # ( ‎ھ‎ → ‎ه‎ ) ARABIC LETTER HEH DOACHASHMEE → ARABIC LETTER HEH # 
+FBAC ; 0647 ;  MA      # ( ‎ﮬ‎ → ‎ه‎ ) ARABIC LETTER HEH DOACHASHMEE INITIAL FORM → ARABIC LETTER HEH   # →‎ﻫ‎→
+FBAD ; 0647 ;  MA      # ( ‎ﮭ‎ → ‎ه‎ ) ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM → ARABIC LETTER HEH    # →‎ﻬ‎→
+FBAB ; 0647 ;  MA      # ( ‎ﮫ‎ → ‎ه‎ ) ARABIC LETTER HEH DOACHASHMEE FINAL FORM → ARABIC LETTER HEH     # →‎ﻬ‎→
+FBAA ; 0647 ;  MA      # ( ‎ﮪ‎ → ‎ه‎ ) ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM → ARABIC LETTER HEH  # 
+06C1 ; 0647 ;  MA      # ( ‎ہ‎ → ‎ه‎ ) ARABIC LETTER HEH GOAL → ARABIC LETTER HEH        # →‎ﮦ‎→
+FBA8 ; 0647 ;  MA      # ( ‎ﮨ‎ → ‎ه‎ ) ARABIC LETTER HEH GOAL INITIAL FORM → ARABIC LETTER HEH  # →‎ہ‎→→‎ﮦ‎→
+FBA9 ; 0647 ;  MA      # ( ‎ﮩ‎ → ‎ه‎ ) ARABIC LETTER HEH GOAL MEDIAL FORM → ARABIC LETTER HEH   # →‎ہ‎→→‎ﮦ‎→
+FBA7 ; 0647 ;  MA      # ( ‎ﮧ‎ → ‎ه‎ ) ARABIC LETTER HEH GOAL FINAL FORM → ARABIC LETTER HEH    # →‎ہ‎→→‎ﮦ‎→
+FBA6 ; 0647 ;  MA      # ( ‎ﮦ‎ → ‎ه‎ ) ARABIC LETTER HEH GOAL ISOLATED FORM → ARABIC LETTER HEH # 
+06D5 ; 0647 ;  MA      # ( ‎ە‎ → ‎ه‎ ) ARABIC LETTER AE → ARABIC LETTER HEH      # 
+
+FCD9 ; 0647 0670 ;     MA      # ( ‎ﳙ‎ → ‎هٰ‎ ) ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM → ARABIC LETTER HEH, ARABIC LETTER SUPERSCRIPT ALEF     # 
+
+FCD7 ; 0647 062C ;     MA      # ( ‎ﳗ‎ → ‎هج‎ ) ARABIC LIGATURE HEH WITH JEEM INITIAL FORM → ARABIC LETTER HEH, ARABIC LETTER JEEM     # 
+FC51 ; 0647 062C ;     MA      # ( ‎ﱑ‎ → ‎هج‎ ) ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM → ARABIC LETTER HEH, ARABIC LETTER JEEM    # 
+
+FCD8 ; 0647 0645 ;     MA      # ( ‎ﳘ‎ → ‎هم‎ ) ARABIC LIGATURE HEH WITH MEEM INITIAL FORM → ARABIC LETTER HEH, ARABIC LETTER MEEM     # 
+FC52 ; 0647 0645 ;     MA      # ( ‎ﱒ‎ → ‎هم‎ ) ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM → ARABIC LETTER HEH, ARABIC LETTER MEEM    # 
+
+FD93 ; 0647 0645 062C ;        MA      # ( ‎ﶓ‎ → ‎همج‎ ) ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM → ARABIC LETTER HEH, ARABIC LETTER MEEM, ARABIC LETTER JEEM     # 
+
+FD94 ; 0647 0645 0645 ;        MA      # ( ‎ﶔ‎ → ‎همم‎ ) ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM → ARABIC LETTER HEH, ARABIC LETTER MEEM, ARABIC LETTER MEEM     # 
+
+FC53 ; 0647 0649 ;     MA      # ( ‎ﱓ‎ → ‎هى‎ ) ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER HEH, ARABIC LETTER ALEF MAKSURA    # 
+FC54 ; 0647 0649 ;     MA      # ( ‎ﱔ‎ → ‎هى‎ ) ARABIC LIGATURE HEH WITH YEH ISOLATED FORM → ARABIC LETTER HEH, ARABIC LETTER ALEF MAKSURA     # →‎هي‎→
+
+06C2 ; 06C0 ;  MA      # ( ‎ۂ‎ → ‎ۀ‎ ) ARABIC LETTER HEH GOAL WITH HAMZA ABOVE → ARABIC LETTER HEH WITH YEH ABOVE        # →‎ﮤ‎→
+FBA5 ; 06C0 ;  MA      # ( ‎ﮥ‎ → ‎ۀ‎ ) ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM → ARABIC LETTER HEH WITH YEH ABOVE   # 
+FBA4 ; 06C0 ;  MA      # ( ‎ﮤ‎ → ‎ۀ‎ ) ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM → ARABIC LETTER HEH WITH YEH ABOVE        # 
+
+FEEE ; 0648 ;  MA      # ( ‎ﻮ‎ → ‎و‎ ) ARABIC LETTER WAW FINAL FORM → ARABIC LETTER WAW # 
+FEED ; 0648 ;  MA      # ( ‎ﻭ‎ → ‎و‎ ) ARABIC LETTER WAW ISOLATED FORM → ARABIC LETTER WAW      # 
+
+0624 ; 0648 0674 ;     MA      # ( ‎ؤ‎ → ‎وٴ‎ ) ARABIC LETTER WAW WITH HAMZA ABOVE → ARABIC LETTER WAW, ARABIC LETTER HIGH HAMZA        # →‎ٶ‎→
+FE86 ; 0648 0674 ;     MA      # ( ‎ﺆ‎ → ‎وٴ‎ ) ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM → ARABIC LETTER WAW, ARABIC LETTER HIGH HAMZA    # →‎ٶ‎→
+FE85 ; 0648 0674 ;     MA      # ( ‎ﺅ‎ → ‎وٴ‎ ) ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM → ARABIC LETTER WAW, ARABIC LETTER HIGH HAMZA # →‎ٶ‎→
+0676 ; 0648 0674 ;     MA      # ( ‎ٶ‎ → ‎وٴ‎ ) ARABIC LETTER HIGH HAMZA WAW → ARABIC LETTER WAW, ARABIC LETTER HIGH HAMZA      # 
+
+FDF8 ; 0648 0633 0644 0645 ;   MA      # ( ‎ﷸ‎ → ‎وسلم‎ ) ARABIC LIGATURE WASALLAM ISOLATED FORM → ARABIC LETTER WAW, ARABIC LETTER SEEN, ARABIC LETTER LAM, ARABIC LETTER MEEM      # 
+
+FBE1 ; 06C5 ;  MA      # ( ‎ﯡ‎ → ‎ۅ‎ ) ARABIC LETTER KIRGHIZ OE FINAL FORM → ARABIC LETTER KIRGHIZ OE   # 
+FBE0 ; 06C5 ;  MA      # ( ‎ﯠ‎ → ‎ۅ‎ ) ARABIC LETTER KIRGHIZ OE ISOLATED FORM → ARABIC LETTER KIRGHIZ OE        # 
+
+FBDA ; 06C6 ;  MA      # ( ‎ﯚ‎ → ‎ۆ‎ ) ARABIC LETTER OE FINAL FORM → ARABIC LETTER OE   # 
+FBD9 ; 06C6 ;  MA      # ( ‎ﯙ‎ → ‎ۆ‎ ) ARABIC LETTER OE ISOLATED FORM → ARABIC LETTER OE        # 
+
+FBD8 ; 06C7 ;  MA      # ( ‎ﯘ‎ → ‎ۇ‎ ) ARABIC LETTER U FINAL FORM → ARABIC LETTER U     # 
+FBD7 ; 06C7 ;  MA      # ( ‎ﯗ‎ → ‎ۇ‎ ) ARABIC LETTER U ISOLATED FORM → ARABIC LETTER U  # 
+
+0677 ; 06C7 0674 ;     MA      # ( ‎ٷ‎ → ‎ۇٴ‎ ) ARABIC LETTER U WITH HAMZA ABOVE → ARABIC LETTER U, ARABIC LETTER HIGH HAMZA    # 
+FBDD ; 06C7 0674 ;     MA      # ( ‎ﯝ‎ → ‎ۇٴ‎ ) ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM → ARABIC LETTER U, ARABIC LETTER HIGH HAMZA     # 
+
+FBDC ; 06C8 ;  MA      # ( ‎ﯜ‎ → ‎ۈ‎ ) ARABIC LETTER YU FINAL FORM → ARABIC LETTER YU   # 
+FBDB ; 06C8 ;  MA      # ( ‎ﯛ‎ → ‎ۈ‎ ) ARABIC LETTER YU ISOLATED FORM → ARABIC LETTER YU        # 
+
+FBE3 ; 06C9 ;  MA      # ( ‎ﯣ‎ → ‎ۉ‎ ) ARABIC LETTER KIRGHIZ YU FINAL FORM → ARABIC LETTER KIRGHIZ YU   # 
+FBE2 ; 06C9 ;  MA      # ( ‎ﯢ‎ → ‎ۉ‎ ) ARABIC LETTER KIRGHIZ YU ISOLATED FORM → ARABIC LETTER KIRGHIZ YU        # 
+
+FBDF ; 06CB ;  MA      # ( ‎ﯟ‎ → ‎ۋ‎ ) ARABIC LETTER VE FINAL FORM → ARABIC LETTER VE   # 
+FBDE ; 06CB ;  MA      # ( ‎ﯞ‎ → ‎ۋ‎ ) ARABIC LETTER VE ISOLATED FORM → ARABIC LETTER VE        # 
+
+FBE8 ; 0649 ;  MA      # ( ‎ﯨ‎ → ‎ى‎ ) ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM → ARABIC LETTER ALEF MAKSURA       # 
+FBE9 ; 0649 ;  MA      # ( ‎ﯩ‎ → ‎ى‎ ) ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM → ARABIC LETTER ALEF MAKSURA        # 
+FEF0 ; 0649 ;  MA      # ( ‎ﻰ‎ → ‎ى‎ ) ARABIC LETTER ALEF MAKSURA FINAL FORM → ARABIC LETTER ALEF MAKSURA       # 
+FEEF ; 0649 ;  MA      # ( ‎ﻯ‎ → ‎ى‎ ) ARABIC LETTER ALEF MAKSURA ISOLATED FORM → ARABIC LETTER ALEF MAKSURA    # 
+064A ; 0649 ;  MA      # ( ‎ي‎ → ‎ى‎ ) ARABIC LETTER YEH → ARABIC LETTER ALEF MAKSURA    # →‎ﻴ‎→→‎ﯿ‎→→‎ی‎→
+FEF3 ; 0649 ;  MA      # ( ‎ﻳ‎ → ‎ى‎ ) ARABIC LETTER YEH INITIAL FORM → ARABIC LETTER ALEF MAKSURA      # →‎ﯿ‎→→‎ی‎→
+FEF4 ; 0649 ;  MA      # ( ‎ﻴ‎ → ‎ى‎ ) ARABIC LETTER YEH MEDIAL FORM → ARABIC LETTER ALEF MAKSURA       # →‎ﯿ‎→→‎ی‎→
+FEF2 ; 0649 ;  MA      # ( ‎ﻲ‎ → ‎ى‎ ) ARABIC LETTER YEH FINAL FORM → ARABIC LETTER ALEF MAKSURA        # →‎ي‎→→‎ﻴ‎→→‎ﯿ‎→→‎ی‎→
+FEF1 ; 0649 ;  MA      # ( ‎ﻱ‎ → ‎ى‎ ) ARABIC LETTER YEH ISOLATED FORM → ARABIC LETTER ALEF MAKSURA     # →‎ي‎→→‎ﻴ‎→→‎ﯿ‎→→‎ی‎→
+06CC ; 0649 ;  MA      # ( ‎ی‎ → ‎ى‎ ) ARABIC LETTER FARSI YEH → ARABIC LETTER ALEF MAKSURA      # 
+FBFE ; 0649 ;  MA      # ( ‎ﯾ‎ → ‎ى‎ ) ARABIC LETTER FARSI YEH INITIAL FORM → ARABIC LETTER ALEF MAKSURA        # →‎ی‎→
+FBFF ; 0649 ;  MA      # ( ‎ﯿ‎ → ‎ى‎ ) ARABIC LETTER FARSI YEH MEDIAL FORM → ARABIC LETTER ALEF MAKSURA # →‎ی‎→
+FBFD ; 0649 ;  MA      # ( ‎ﯽ‎ → ‎ى‎ ) ARABIC LETTER FARSI YEH FINAL FORM → ARABIC LETTER ALEF MAKSURA  # →‎ی‎→
+FBFC ; 0649 ;  MA      # ( ‎ﯼ‎ → ‎ى‎ ) ARABIC LETTER FARSI YEH ISOLATED FORM → ARABIC LETTER ALEF MAKSURA       # 
+
+FC90 ; 0649 0670 ;     MA      # ( ‎ﲐ‎ → ‎ىٰ‎ ) ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER SUPERSCRIPT ALEF     # 
+FC5D ; 0649 0670 ;     MA      # ( ‎ﱝ‎ → ‎ىٰ‎ ) ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER SUPERSCRIPT ALEF  # 
+
+0626 ; 0649 0674 ;     MA      # ( ‎ئ‎ → ‎ىٴ‎ ) ARABIC LETTER YEH WITH HAMZA ABOVE → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA       # →‎ٸ‎→→‎يٴ‎→
+FE8B ; 0649 0674 ;     MA      # ( ‎ﺋ‎ → ‎ىٴ‎ ) ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA # →‎ئ‎→→‎ٸ‎→→‎يٴ‎→
+FE8C ; 0649 0674 ;     MA      # ( ‎ﺌ‎ → ‎ىٴ‎ ) ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA  # →‎ئ‎→→‎ٸ‎→→‎يٴ‎→
+FE8A ; 0649 0674 ;     MA      # ( ‎ﺊ‎ → ‎ىٴ‎ ) ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA   # →‎ئ‎→→‎ٸ‎→→‎يٴ‎→
+FE89 ; 0649 0674 ;     MA      # ( ‎ﺉ‎ → ‎ىٴ‎ ) ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA        # →‎ٸ‎→→‎يٴ‎→
+0678 ; 0649 0674 ;     MA      # ( ‎ٸ‎ → ‎ىٴ‎ ) ARABIC LETTER HIGH HAMZA YEH → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA     # →‎يٴ‎→
+
+FBEB ; 0649 0674 0627 ;        MA      # ( ‎ﯫ‎ → ‎ىٴا‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF # →‎ئا‎→
+FBEA ; 0649 0674 0627 ;        MA      # ( ‎ﯪ‎ → ‎ىٴا‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF      # →‎ئا‎→
+
+FC67 ; 0649 0674 0628 ;        MA      # ( ‎ﱧ‎ → ‎ىٴب‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER BEH  # →‎ئن‎→
+
+FBF8 ; 0649 0674 067A ;        MA      # ( ‎ﯸ‎ → ‎ىٴٺ‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER TTEHEH        # →‎ئې‎→
+FBF7 ; 0649 0674 067A ;        MA      # ( ‎ﯷ‎ → ‎ىٴٺ‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER TTEHEH  # →‎ئې‎→
+FBF6 ; 0649 0674 067A ;        MA      # ( ‎ﯶ‎ → ‎ىٴٺ‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER TTEHEH       # →‎ئې‎→
+
+FC97 ; 0649 0674 062C ;        MA      # ( ‎ﲗ‎ → ‎ىٴج‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER JEEM       # →‎ئج‎→
+FC00 ; 0649 0674 062C ;        MA      # ( ‎ﰀ‎ → ‎ىٴج‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER JEEM      # →‎ئج‎→
+FC99 ; 0649 0674 062C ;        MA      # ( ‎ﲙ‎ → ‎ىٴج‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER JEEM       # →‎ئخ‎→→‎يٴج‎→→‎ئج‎→
+
+FC98 ; 0649 0674 062D ;        MA      # ( ‎ﲘ‎ → ‎ىٴح‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER HAH # →‎ئح‎→
+FC01 ; 0649 0674 062D ;        MA      # ( ‎ﰁ‎ → ‎ىٴح‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER HAH        # →‎ئح‎→
+
+FC64 ; 0649 0674 0631 ;        MA      # ( ‎ﱤ‎ → ‎ىٴر‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER REH   # →‎ئر‎→
+
+FC65 ; 0649 0674 0632 ;        MA      # ( ‎ﱥ‎ → ‎ىٴز‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ZAIN # →‎ئز‎→
+
+FC9A ; 0649 0674 0645 ;        MA      # ( ‎ﲚ‎ → ‎ىٴم‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER MEEM       # →‎ئم‎→
+FCDF ; 0649 0674 0645 ;        MA      # ( ‎ﳟ‎ → ‎ىٴم‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER MEEM        # →‎ئم‎→
+FC66 ; 0649 0674 0645 ;        MA      # ( ‎ﱦ‎ → ‎ىٴم‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER MEEM # →‎ئم‎→
+FC02 ; 0649 0674 0645 ;        MA      # ( ‎ﰂ‎ → ‎ىٴم‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER MEEM      # →‎ئم‎→
+
+FC9B ; 0649 0674 0647 ;        MA      # ( ‎ﲛ‎ → ‎ىٴه‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER HEH # →‎ئه‎→
+FCE0 ; 0649 0674 0647 ;        MA      # ( ‎ﳠ‎ → ‎ىٴه‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER HEH  # →‎ئه‎→
+FBED ; 0649 0674 0647 ;        MA      # ( ‎ﯭ‎ → ‎ىٴه‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER HEH    # →‎ئە‎→→‎يٴه‎→→‎ئه‎→
+FBEC ; 0649 0674 0647 ;        MA      # ( ‎ﯬ‎ → ‎ىٴه‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER HEH # →‎ئە‎→→‎يٴه‎→→‎ئه‎→
+
+FBEF ; 0649 0674 0648 ;        MA      # ( ‎ﯯ‎ → ‎ىٴو‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER WAW   # →‎ئو‎→
+FBEE ; 0649 0674 0648 ;        MA      # ( ‎ﯮ‎ → ‎ىٴو‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER WAW        # →‎ئو‎→
+
+FBF3 ; 0649 0674 06C6 ;        MA      # ( ‎ﯳ‎ → ‎ىٴۆ‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER OE     # →‎ئۆ‎→
+FBF2 ; 0649 0674 06C6 ;        MA      # ( ‎ﯲ‎ → ‎ىٴۆ‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER OE  # →‎ئۆ‎→
+
+FBF1 ; 0649 0674 06C7 ;        MA      # ( ‎ﯱ‎ → ‎ىٴۇ‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER U       # →‎ئۇ‎→
+FBF0 ; 0649 0674 06C7 ;        MA      # ( ‎ﯰ‎ → ‎ىٴۇ‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER U    # →‎ئۇ‎→
+
+FBF5 ; 0649 0674 06C8 ;        MA      # ( ‎ﯵ‎ → ‎ىٴۈ‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER YU     # →‎ئۈ‎→
+FBF4 ; 0649 0674 06C8 ;        MA      # ( ‎ﯴ‎ → ‎ىٴۈ‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER YU  # →‎ئۈ‎→
+
+FBFB ; 0649 0674 0649 ;        MA      # ( ‎ﯻ‎ → ‎ىٴى‎ ) ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF MAKSURA        # →‎ئى‎→
+FBFA ; 0649 0674 0649 ;        MA      # ( ‎ﯺ‎ → ‎ىٴى‎ ) ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF MAKSURA  # →‎ئى‎→
+FC68 ; 0649 0674 0649 ;        MA      # ( ‎ﱨ‎ → ‎ىٴى‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF MAKSURA # →‎ئى‎→
+FBF9 ; 0649 0674 0649 ;        MA      # ( ‎ﯹ‎ → ‎ىٴى‎ ) ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF MAKSURA       # →‎ئى‎→
+FC03 ; 0649 0674 0649 ;        MA      # ( ‎ﰃ‎ → ‎ىٴى‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF MAKSURA      # →‎ئى‎→
+FC69 ; 0649 0674 0649 ;        MA      # ( ‎ﱩ‎ → ‎ىٴى‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF MAKSURA  # →‎ئي‎→→‎يٴى‎→→‎ئى‎→
+FC04 ; 0649 0674 0649 ;        MA      # ( ‎ﰄ‎ → ‎ىٴى‎ ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HIGH HAMZA, ARABIC LETTER ALEF MAKSURA       # →‎ئي‎→→‎يٴى‎→→‎ئى‎→
+
+FC94 ; 0649 0628 ;     MA      # ( ‎ﲔ‎ → ‎ىب‎ ) ARABIC LIGATURE YEH WITH NOON FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER BEH       # →‎ين‎→
+
+FDAF ; 0649 062C 0649 ;        MA      # ( ‎ﶯ‎ → ‎ىجى‎ ) ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER JEEM, ARABIC LETTER ALEF MAKSURA       # →‎يجي‎→
+
+FDAE ; 0649 062D 0649 ;        MA      # ( ‎ﶮ‎ → ‎ىحى‎ ) ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HAH, ARABIC LETTER ALEF MAKSURA # →‎يحي‎→
+
+FC91 ; 0649 0631 ;     MA      # ( ‎ﲑ‎ → ‎ىر‎ ) ARABIC LIGATURE YEH WITH REH FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER REH        # →‎ير‎→
+
+FC92 ; 0649 0632 ;     MA      # ( ‎ﲒ‎ → ‎ىز‎ ) ARABIC LIGATURE YEH WITH ZAIN FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER ZAIN      # →‎يز‎→
+
+FCDD ; 0649 0645 ;     MA      # ( ‎ﳝ‎ → ‎ىم‎ ) ARABIC LIGATURE YEH WITH MEEM INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER MEEM    # →‎يم‎→
+FCF0 ; 0649 0645 ;     MA      # ( ‎ﳰ‎ → ‎ىم‎ ) ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER MEEM     # →‎يم‎→
+FC93 ; 0649 0645 ;     MA      # ( ‎ﲓ‎ → ‎ىم‎ ) ARABIC LIGATURE YEH WITH MEEM FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER MEEM      # →‎يم‎→
+FC58 ; 0649 0645 ;     MA      # ( ‎ﱘ‎ → ‎ىم‎ ) ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER MEEM   # →‎يم‎→
+
+FD9D ; 0649 0645 0645 ;        MA      # ( ‎ﶝ‎ → ‎ىمم‎ ) ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER MEEM, ARABIC LETTER MEEM    # →‎يمم‎→
+FD9C ; 0649 0645 0645 ;        MA      # ( ‎ﶜ‎ → ‎ىمم‎ ) ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER MEEM, ARABIC LETTER MEEM      # →‎يمم‎→
+
+FDB0 ; 0649 0645 0649 ;        MA      # ( ‎ﶰ‎ → ‎ىمى‎ ) ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER MEEM, ARABIC LETTER ALEF MAKSURA       # →‎يمي‎→
+
+FCDE ; 0649 0647 ;     MA      # ( ‎ﳞ‎ → ‎ىه‎ ) ARABIC LIGATURE YEH WITH HEH INITIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HEH      # →‎يه‎→
+FCF1 ; 0649 0647 ;     MA      # ( ‎ﳱ‎ → ‎ىه‎ ) ARABIC LIGATURE YEH WITH HEH MEDIAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER HEH       # →‎يه‎→
+
+FC95 ; 0649 0649 ;     MA      # ( ‎ﲕ‎ → ‎ىى‎ ) ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER ALEF MAKSURA      # →‎يى‎→
+FC59 ; 0649 0649 ;     MA      # ( ‎ﱙ‎ → ‎ىى‎ ) ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER ALEF MAKSURA   # →‎يى‎→
+FC96 ; 0649 0649 ;     MA      # ( ‎ﲖ‎ → ‎ىى‎ ) ARABIC LIGATURE YEH WITH YEH FINAL FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER ALEF MAKSURA       # →‎يي‎→
+FC5A ; 0649 0649 ;     MA      # ( ‎ﱚ‎ → ‎ىى‎ ) ARABIC LIGATURE YEH WITH YEH ISOLATED FORM → ARABIC LETTER ALEF MAKSURA, ARABIC LETTER ALEF MAKSURA    # →‎يي‎→
+
+FBAF ; 06D2 ;  MA      # ( ‎ﮯ‎ → ‎ے‎ ) ARABIC LETTER YEH BARREE FINAL FORM → ARABIC LETTER YEH BARREE   # 
+FBAE ; 06D2 ;  MA      # ( ‎ﮮ‎ → ‎ے‎ ) ARABIC LETTER YEH BARREE ISOLATED FORM → ARABIC LETTER YEH BARREE        # 
+
+FBB1 ; 06D3 ;  MA      # ( ‎ﮱ‎ → ‎ۓ‎ ) ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM → ARABIC LETTER YEH BARREE WITH HAMZA ABOVE # 
+FBB0 ; 06D3 ;  MA      # ( ‎ﮰ‎ → ‎ۓ‎ ) ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM → ARABIC LETTER YEH BARREE WITH HAMZA ABOVE      # 
+
+079A ; 0799 ;  MA      # ( ‎ޚ‎ → ‎ޙ‎ ) THAANA LETTER KHAA → THAANA LETTER HHAA   # 
+
+07A3 ; 07A2 ;  MA      # ( ‎ޣ‎ → ‎ޢ‎ ) THAANA LETTER GHAINU → THAANA LETTER AINU # 
+
+07A1 ; 07A0 ;  MA      # ( ‎ޡ‎ → ‎ޠ‎ ) THAANA LETTER ZO → THAANA LETTER TO       # 
+
+079F ; 079E ;  MA      # ( ‎ޟ‎ → ‎ޞ‎ ) THAANA LETTER DAADHU → THAANA LETTER SAADHU       # 
+
+0418 ; 2D4D ;  MA      # ( И → ⵍ ) CYRILLIC CAPITAL LETTER I → TIFINAGH LETTER YAL      # 
+
+0906 ; 0905 093E ;     MA      # ( आ → अा ) DEVANAGARI LETTER AA → DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN AA     # 
+
+0912 ; 0905 093E 0946 ;        MA      # ( ऒ → अाॆ ) DEVANAGARI LETTER SHORT O → DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN AA, DEVANAGARI VOWEL SIGN SHORT E      # →अॊ→→आॆ→
+
+0913 ; 0905 093E 0947 ;        MA      # ( ओ → अाे ) DEVANAGARI LETTER O → DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN AA, DEVANAGARI VOWEL SIGN E  # →अो→→आे→
+
+0914 ; 0905 093E 0948 ;        MA      # ( औ → अाै ) DEVANAGARI LETTER AU → DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN AA, DEVANAGARI VOWEL SIGN AI        # →अौ→→आै→
+
+0904 ; 0905 0946 ;     MA      # ( ऄ → अॆ ) DEVANAGARI LETTER SHORT A → DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN SHORT E   # 
+
+0911 ; 0905 0949 ;     MA      # ( ऑ → अॉ ) DEVANAGARI LETTER CANDRA O → DEVANAGARI LETTER A, DEVANAGARI VOWEL SIGN CANDRA O # 
+
+090D ; 090F 0945 ;     MA      # ( ऍ → एॅ ) DEVANAGARI LETTER CANDRA E → DEVANAGARI LETTER E, DEVANAGARI VOWEL SIGN CANDRA E # 
+
+090E ; 090F 0946 ;     MA      # ( ऎ → एॆ ) DEVANAGARI LETTER SHORT E → DEVANAGARI LETTER E, DEVANAGARI VOWEL SIGN SHORT E   # 
+
+0910 ; 090F 0947 ;     MA      # ( ऐ → एे ) DEVANAGARI LETTER AI → DEVANAGARI LETTER E, DEVANAGARI VOWEL SIGN E      # 
+
+0908 ; 0930 094D 0907 ;        MA      # ( ई → र्इ ) DEVANAGARI LETTER II → DEVANAGARI LETTER RA, DEVANAGARI SIGN VIRAMA, DEVANAGARI LETTER I      # 
+
+0ABD ; 093D ;  MA      # ( ઽ → ऽ ) GUJARATI SIGN AVAGRAHA → DEVANAGARI SIGN AVAGRAHA   # 
+
+0AC1 ; 0941 ;  MA      # ( ુ → ु ) GUJARATI VOWEL SIGN U → DEVANAGARI VOWEL SIGN U     # 
+
+0AC2 ; 0942 ;  MA      # ( ૂ → ू ) GUJARATI VOWEL SIGN UU → DEVANAGARI VOWEL SIGN UU   # 
+
+0A4B ; 0946 ;  MA      # ( ੋ → ॆ ) GURMUKHI VOWEL SIGN OO → DEVANAGARI VOWEL SIGN SHORT E      # 
+
+0A4D ; 094D ;  MA      # ( ੍ → ् ) GURMUKHI SIGN VIRAMA → DEVANAGARI SIGN VIRAMA       # 
+0ACD ; 094D ;  MA      # ( ્ → ् ) GUJARATI SIGN VIRAMA → DEVANAGARI SIGN VIRAMA       # 
+
+0986 ; 0985 09BE ;     MA      # ( আ → অা ) BENGALI LETTER AA → BENGALI LETTER A, BENGALI VOWEL SIGN AA      # 
+
+09E0 ; 098B 09C3 ;     MA      # ( ৠ → ঋৃ ) BENGALI LETTER VOCALIC RR → BENGALI LETTER VOCALIC R, BENGALI VOWEL SIGN VOCALIC R       # 
+09E1 ; 098B 09C3 ;     MA      # ( ৡ → ঋৃ ) BENGALI LETTER VOCALIC LL → BENGALI LETTER VOCALIC R, BENGALI VOWEL SIGN VOCALIC R       # →ঌৢ→→ৠ→
+
+0A09 ; 0A73 0A41 ;     MA      # ( ਉ → ੳੁ ) GURMUKHI LETTER U → GURMUKHI URA, GURMUKHI VOWEL SIGN U  # 
+
+0A0A ; 0A73 0A42 ;     MA      # ( ਊ → ੳੂ ) GURMUKHI LETTER UU → GURMUKHI URA, GURMUKHI VOWEL SIGN UU        # 
+
+0A06 ; 0A05 0A3E ;     MA      # ( ਆ → ਅਾ ) GURMUKHI LETTER AA → GURMUKHI LETTER A, GURMUKHI VOWEL SIGN AA   # 
+
+0A10 ; 0A05 0A48 ;     MA      # ( ਐ → ਅੈ ) GURMUKHI LETTER AI → GURMUKHI LETTER A, GURMUKHI VOWEL SIGN AI   # 
+
+0A14 ; 0A05 0A4C ;     MA      # ( ਔ → ਅੌ ) GURMUKHI LETTER AU → GURMUKHI LETTER A, GURMUKHI VOWEL SIGN AU   # 
+
+0A07 ; 0A72 0A3F ;     MA      # ( ਇ → ੲਿ ) GURMUKHI LETTER I → GURMUKHI IRI, GURMUKHI VOWEL SIGN I  # 
+
+0A08 ; 0A72 0A40 ;     MA      # ( ਈ → ੲੀ ) GURMUKHI LETTER II → GURMUKHI IRI, GURMUKHI VOWEL SIGN II        # 
+
+0A0F ; 0A72 0A47 ;     MA      # ( ਏ → ੲੇ ) GURMUKHI LETTER EE → GURMUKHI IRI, GURMUKHI VOWEL SIGN EE        # 
+
+0A86 ; 0A85 0ABE ;     MA      # ( આ → અા ) GUJARATI LETTER AA → GUJARATI LETTER A, GUJARATI VOWEL SIGN AA   # 
+
+0A91 ; 0A85 0ABE 0AC5 ;        MA      # ( ઑ → અાૅ ) GUJARATI VOWEL CANDRA O → GUJARATI LETTER A, GUJARATI VOWEL SIGN AA, GUJARATI VOWEL SIGN CANDRA E     # →અૉ→→આૅ→
+
+0A93 ; 0A85 0ABE 0AC7 ;        MA      # ( ઓ → અાે ) GUJARATI LETTER O → GUJARATI LETTER A, GUJARATI VOWEL SIGN AA, GUJARATI VOWEL SIGN E  # →અો→→આે→
+
+0A94 ; 0A85 0ABE 0AC8 ;        MA      # ( ઔ → અાૈ ) GUJARATI LETTER AU → GUJARATI LETTER A, GUJARATI VOWEL SIGN AA, GUJARATI VOWEL SIGN AI        # →અૌ→→આૈ→
+
+0A8D ; 0A85 0AC5 ;     MA      # ( ઍ → અૅ ) GUJARATI VOWEL CANDRA E → GUJARATI LETTER A, GUJARATI VOWEL SIGN CANDRA E        # 
+
+0A8F ; 0A85 0AC7 ;     MA      # ( એ → અે ) GUJARATI LETTER E → GUJARATI LETTER A, GUJARATI VOWEL SIGN E     # 
+
+0A90 ; 0A85 0AC8 ;     MA      # ( ઐ → અૈ ) GUJARATI LETTER AI → GUJARATI LETTER A, GUJARATI VOWEL SIGN AI   # 
+
+0B06 ; 0B05 0B3E ;     MA      # ( ଆ → ଅା ) ORIYA LETTER AA → ORIYA LETTER A, ORIYA VOWEL SIGN AA    # 
+
+0BEE ; 0B85 ;  MA      # ( ௮ → அ ) TAMIL DIGIT EIGHT → TAMIL LETTER A  # 
+
+0BB0 ; 0B88 ;  MA      # ( ர → ஈ ) TAMIL LETTER RA → TAMIL LETTER II   # →ா→
+0BBE ; 0B88 ;  MA      # ( ா → ஈ ) TAMIL VOWEL SIGN AA → TAMIL LETTER II       # 
+
+0BEB ; 0B88 0BC1 ;     MA      # ( ௫ → ஈு ) TAMIL DIGIT FIVE → TAMIL LETTER II, TAMIL VOWEL SIGN U   # →ரு→
+
+0BE8 ; 0B89 ;  MA      # ( ௨ → உ ) TAMIL DIGIT TWO → TAMIL LETTER U    # 
+0D09 ; 0B89 ;  MA      # ( ഉ → உ ) MALAYALAM LETTER U → TAMIL LETTER U # 
+
+0B8A ; 0B89 0BB3 ;     MA      # ( ஊ → உள ) TAMIL LETTER UU → TAMIL LETTER U, TAMIL LETTER LLA       # 
+
+0D0A ; 0B89 0D57 ;     MA      # ( ഊ → உൗ ) MALAYALAM LETTER UU → TAMIL LETTER U, MALAYALAM AU LENGTH MARK   # →ഉൗ→
+
+0BED ; 0B8E ;  MA      # ( ௭ → எ ) TAMIL DIGIT SEVEN → TAMIL LETTER E  # 
+
+0BF7 ; 0B8E 0BB5 ;     MA      #* ( ௷ → எவ ) TAMIL CREDIT SIGN → TAMIL LETTER E, TAMIL LETTER VA     # 
+
+0B9C ; 0B90 ;  MA      # ( ஜ → ஐ ) TAMIL LETTER JA → TAMIL LETTER AI   # 
+0D1C ; 0B90 ;  MA      # ( ജ → ஐ ) MALAYALAM LETTER JA → TAMIL LETTER AI       # →ஜ→
+
+0BE7 ; 0B95 ;  MA      # ( ௧ → க ) TAMIL DIGIT ONE → TAMIL LETTER KA   # 
+
+0BEA ; 0B9A ;  MA      # ( ௪ → ச ) TAMIL DIGIT FOUR → TAMIL LETTER CA  # 
+
+0BEC ; 0B9A 0BC1 ;     MA      # ( ௬ → சு ) TAMIL DIGIT SIX → TAMIL LETTER CA, TAMIL VOWEL SIGN U    # 
+
+0BF2 ; 0B9A 0BC2 ;     MA      #* ( ௲ → சூ ) TAMIL NUMBER ONE THOUSAND → TAMIL LETTER CA, TAMIL VOWEL SIGN UU        # 
+
+0D23 ; 0BA3 ;  MA      # ( ണ → ண ) MALAYALAM LETTER NNA → TAMIL LETTER NNA     # 
+
+0BFA ; 0BA8 0BC0 ;     MA      #* ( ௺ → நீ ) TAMIL NUMBER SIGN → TAMIL LETTER NA, TAMIL VOWEL SIGN II        # 
+
+0BF4 ; 0BAE 0BC0 ;     MA      #* ( ௴ → மீ ) TAMIL MONTH SIGN → TAMIL LETTER MA, TAMIL VOWEL SIGN II # 
+
+0BF0 ; 0BAF ;  MA      #* ( ௰ → ய ) TAMIL NUMBER TEN → TAMIL LETTER YA # 
+
+0D34 ; 0BB4 ;  MA      # ( ഴ → ழ ) MALAYALAM LETTER LLLA → TAMIL LETTER LLLA   # 
+
+0BD7 ; 0BB3 ;  MA      # ( ௗ → ள ) TAMIL AU LENGTH MARK → TAMIL LETTER LLA     # 
+
+0BC8 ; 0BA9 ;  MA      # ( ை → ன ) TAMIL VOWEL SIGN AI → TAMIL LETTER NNNA     # 
+
+0D36 ; 0BB6 ;  MA      # ( ശ → ஶ ) MALAYALAM LETTER SHA → TAMIL LETTER SHA     # 
+
+0BF8 ; 0BB7 ;  MA      #* ( ௸ → ஷ ) TAMIL AS ABOVE SIGN → TAMIL LETTER SSA     # 
+
+0D3F ; 0BBF ;  MA      # ( ി → ி ) MALAYALAM VOWEL SIGN I → TAMIL VOWEL SIGN I # 
+0D40 ; 0BBF ;  MA      # ( ീ → ி ) MALAYALAM VOWEL SIGN II → TAMIL VOWEL SIGN I        # 
+
+0BCA ; 0BC6 0B88 ;     MA      # ( ொ → ெஈ ) TAMIL VOWEL SIGN O → TAMIL VOWEL SIGN E, TAMIL LETTER II # →ெர→
+
+0BCC ; 0BC6 0BB3 ;     MA      # ( ௌ → ெள ) TAMIL VOWEL SIGN AU → TAMIL VOWEL SIGN E, TAMIL LETTER LLA       # 
+
+0BCB ; 0BC7 0B88 ;     MA      # ( ோ → ேஈ ) TAMIL VOWEL SIGN OO → TAMIL VOWEL SIGN EE, TAMIL LETTER II       # →ேர→
+
+0C85 ; 0C05 ;  MA      # ( ಅ → అ ) KANNADA LETTER A → TELUGU LETTER A  # 
+
+0C86 ; 0C06 ;  MA      # ( ಆ → ఆ ) KANNADA LETTER AA → TELUGU LETTER AA        # 
+
+0C87 ; 0C07 ;  MA      # ( ಇ → ఇ ) KANNADA LETTER I → TELUGU LETTER I  # 
+
+0C60 ; 0C0B 0C3E ;     MA      # ( ౠ → ఋా ) TELUGU LETTER VOCALIC RR → TELUGU LETTER VOCALIC R, TELUGU VOWEL SIGN AA # 
+
+0C61 ; 0C0C 0C3E ;     MA      # ( ౡ → ఌా ) TELUGU LETTER VOCALIC LL → TELUGU LETTER VOCALIC L, TELUGU VOWEL SIGN AA # 
+
+0C92 ; 0C12 ;  MA      # ( ಒ → ఒ ) KANNADA LETTER O → TELUGU LETTER O  # 
+
+0C14 ; 0C12 0C4C ;     MA      # ( ఔ → ఒౌ ) TELUGU LETTER AU → TELUGU LETTER O, TELUGU VOWEL SIGN AU # 
+0C94 ; 0C12 0C4C ;     MA      # ( ಔ → ఒౌ ) KANNADA LETTER AU → TELUGU LETTER O, TELUGU VOWEL SIGN AU        # →ఔ→
+
+0C13 ; 0C12 0C55 ;     MA      # ( ఓ → ఒౕ ) TELUGU LETTER OO → TELUGU LETTER O, TELUGU LENGTH MARK   # 
+0C93 ; 0C12 0C55 ;     MA      # ( ಓ → ఒౕ ) KANNADA LETTER OO → TELUGU LETTER O, TELUGU LENGTH MARK  # →ఓ→
+
+0C9C ; 0C1C ;  MA      # ( ಜ → జ ) KANNADA LETTER JA → TELUGU LETTER JA        # 
+
+0C9E ; 0C1E ;  MA      # ( ಞ → ఞ ) KANNADA LETTER NYA → TELUGU LETTER NYA      # 
+
+0C22 ; 0C21 0323 ;     MA      # ( ఢ → డ̣ ) TELUGU LETTER DDHA → TELUGU LETTER DDA, COMBINING DOT BELOW       # 
+
+0CA3 ; 0C23 ;  MA      # ( ಣ → ణ ) KANNADA LETTER NNA → TELUGU LETTER NNA      # 
+
+0C25 ; 0C27 05BC ;     MA      # ( థ → ధּ ) TELUGU LETTER THA → TELUGU LETTER DHA, HEBREW POINT DAGESH OR MAPIQ       # 
+
+0C2D ; 0C2C 0323 ;     MA      # ( భ → బ̣ ) TELUGU LETTER BHA → TELUGU LETTER BA, COMBINING DOT BELOW # 
+
+0CAF ; 0C2F ;  MA      # ( ಯ → య ) KANNADA LETTER YA → TELUGU LETTER YA        # 
+
+0C20 ; 0C30 05BC ;     MA      # ( ఠ → రּ ) TELUGU LETTER TTHA → TELUGU LETTER RA, HEBREW POINT DAGESH OR MAPIQ       # 
+
+0CB1 ; 0C31 ;  MA      # ( ಱ → ఱ ) KANNADA LETTER RRA → TELUGU LETTER RRA      # 
+
+0CB2 ; 0C32 ;  MA      # ( ಲ → ల ) KANNADA LETTER LA → TELUGU LETTER LA        # 
+
+0C37 ; 0C35 0323 ;     MA      # ( ష → వ̣ ) TELUGU LETTER SSA → TELUGU LETTER VA, COMBINING DOT BELOW # 
+
+0C39 ; 0C35 0C3E ;     MA      # ( హ → వా ) TELUGU LETTER HA → TELUGU LETTER VA, TELUGU VOWEL SIGN AA        # 
+
+0C2E ; 0C35 0C41 ;     MA      # ( మ → వు ) TELUGU LETTER MA → TELUGU LETTER VA, TELUGU VOWEL SIGN U # 
+
+0C42 ; 0C41 0C3E ;     MA      # ( ూ → ుా ) TELUGU VOWEL SIGN UU → TELUGU VOWEL SIGN U, TELUGU VOWEL SIGN AA # 
+
+0C44 ; 0C43 0C3E ;     MA      # ( ౄ → ృా ) TELUGU VOWEL SIGN VOCALIC RR → TELUGU VOWEL SIGN VOCALIC R, TELUGU VOWEL SIGN AA # 
+
+0CE1 ; 0C8C 0CBE ;     MA      # ( ೡ → ಌಾ ) KANNADA LETTER VOCALIC LL → KANNADA LETTER VOCALIC L, KANNADA VOWEL SIGN AA      # 
+
+0D08 ; 0D07 0D57 ;     MA      # ( ഈ → ഇൗ ) MALAYALAM LETTER II → MALAYALAM LETTER I, MALAYALAM AU LENGTH MARK       # 
+
+0D10 ; 0D0E 0D46 ;     MA      # ( ഐ → എെ ) MALAYALAM LETTER AI → MALAYALAM LETTER E, MALAYALAM VOWEL SIGN E # 
+
+0D13 ; 0D12 0D3E ;     MA      # ( ഓ → ഒാ ) MALAYALAM LETTER OO → MALAYALAM LETTER O, MALAYALAM VOWEL SIGN AA        # 
+
+0D14 ; 0D12 0D57 ;     MA      # ( ഔ → ഒൗ ) MALAYALAM LETTER AU → MALAYALAM LETTER O, MALAYALAM AU LENGTH MARK       # 
+
+0D61 ; 0D1E ;  MA      # ( ൡ → ഞ ) MALAYALAM LETTER VOCALIC LL → MALAYALAM LETTER NYA  # 
+
+0D6B ; 0D26 0D4D 0D30 ;        MA      # ( ൫ → ദ്ര ) MALAYALAM DIGIT FIVE → MALAYALAM LETTER DA, MALAYALAM SIGN VIRAMA, MALAYALAM LETTER RA        # 
+
+0D0C ; 0D28 0D41 ;     MA      # ( ഌ → നു ) MALAYALAM LETTER VOCALIC L → MALAYALAM LETTER NA, MALAYALAM VOWEL SIGN U # 
+0D19 ; 0D28 0D41 ;     MA      # ( ങ → നു ) MALAYALAM LETTER NGA → MALAYALAM LETTER NA, MALAYALAM VOWEL SIGN U       # →ഌ→
+
+0D6F ; 0D28 0D4D ;     MA      # ( ൯ → ന് ) MALAYALAM DIGIT NINE → MALAYALAM LETTER NA, MALAYALAM SIGN VIRAMA        # 
+
+0D8C ; 0D28 0D4D 0D28 ;        MA      # ( ඌ → ന്ന ) SINHALA LETTER UUYANNA → MALAYALAM LETTER NA, MALAYALAM SIGN VIRAMA, MALAYALAM LETTER NA      # 
+
+0D31 ; 0D30 ;  MA      # ( റ → ര ) MALAYALAM LETTER RRA → MALAYALAM LETTER RA  # 
+
+0D6A ; 0D30 0D4D ;     MA      # ( ൪ → ര് ) MALAYALAM DIGIT FOUR → MALAYALAM LETTER RA, MALAYALAM SIGN VIRAMA        # 
+
+0D6E ; 0D35 0D4D ;     MA      # ( ൮ → വ് ) MALAYALAM DIGIT EIGHT → MALAYALAM LETTER VA, MALAYALAM SIGN VIRAMA       # 
+
+0D42 ; 0D41 ;  MA      # ( ൂ → ു ) MALAYALAM VOWEL SIGN UU → MALAYALAM VOWEL SIGN U    # 
+0D43 ; 0D41 ;  MA      # ( ൃ → ു ) MALAYALAM VOWEL SIGN VOCALIC R → MALAYALAM VOWEL SIGN U     # →ൂ→
+
+0D48 ; 0D46 0D46 ;     MA      # ( ൈ → െെ ) MALAYALAM VOWEL SIGN AI → MALAYALAM VOWEL SIGN E, MALAYALAM VOWEL SIGN E # 
+
+0E03 ; 0E02 ;  MA      # ( ฃ → ข ) THAI CHARACTER KHO KHUAT → THAI CHARACTER KHO KHAI  # 
+
+0E14 ; 0E04 ;  MA      # ( ด → ค ) THAI CHARACTER DO DEK → THAI CHARACTER KHO KHWAI    # 
+0E15 ; 0E04 ;  MA      # ( ต → ค ) THAI CHARACTER TO TAO → THAI CHARACTER KHO KHWAI    # →ด→
+
+0E21 ; 0E06 ;  MA      # ( ม → ฆ ) THAI CHARACTER MO MA → THAI CHARACTER KHO RAKHANG   # 
+
+0E88 ; 0E08 ;  MA      # ( ຈ → จ ) LAO LETTER CO → THAI CHARACTER CHO CHAN     # 
+
+0E0B ; 0E0A ;  MA      # ( ซ → ช ) THAI CHARACTER SO SO → THAI CHARACTER CHO CHANG     # 
+
+0E0F ; 0E0E ;  MA      # ( ฏ → ฎ ) THAI CHARACTER TO PATAK → THAI CHARACTER DO CHADA   # 
+
+0E17 ; 0E11 ;  MA      # ( ท → ฑ ) THAI CHARACTER THO THAHAN → THAI CHARACTER THO NANGMONTHO   # 
+
+0E9A ; 0E1A ;  MA      # ( ບ → บ ) LAO LETTER BO → THAI CHARACTER BO BAIMAI    # 
+
+0E9B ; 0E1B ;  MA      # ( ປ → ป ) LAO LETTER PO → THAI CHARACTER PO PLA       # 
+
+0E9D ; 0E1D ;  MA      # ( ຝ → ฝ ) LAO LETTER FO TAM → THAI CHARACTER FO FA    # 
+
+0E9E ; 0E1E ;  MA      # ( ພ → พ ) LAO LETTER PHO TAM → THAI CHARACTER PHO PHAN        # 
+
+0E9F ; 0E1F ;  MA      # ( ຟ → ฟ ) LAO LETTER FO SUNG → THAI CHARACTER FO FAN  # 
+
+0E26 ; 0E20 ;  MA      # ( ฦ → ภ ) THAI CHARACTER LU → THAI CHARACTER PHO SAMPHAO      # 
+
+0E8D ; 0E22 ;  MA      # ( ຍ → ย ) LAO LETTER NYO → THAI CHARACTER YO YAK      # 
+
+17D4 ; 0E2F ;  MA      #* ( ។ → ฯ ) KHMER SIGN KHAN → THAI CHARACTER PAIYANNOI # 
+
+0E45 ; 0E32 ;  MA      # ( ๅ → า ) THAI CHARACTER LAKKHANGYAO → THAI CHARACTER SARA AA # 
+
+0E33 ; 030A 0E32 ;     MA      # ( ำ → ̊า ) THAI CHARACTER SARA AM → COMBINING RING ABOVE, THAI CHARACTER SARA AA     # →ํา→
+
+17B7 ; 0E34 ;  MA      # ( ិ → ิ ) KHMER VOWEL SIGN I → THAI CHARACTER SARA I  # 
+
+17B8 ; 0E35 ;  MA      # ( ី → ี ) KHMER VOWEL SIGN II → THAI CHARACTER SARA II        # 
+
+17B9 ; 0E36 ;  MA      # ( ឹ → ึ ) KHMER VOWEL SIGN Y → THAI CHARACTER SARA UE # 
+
+17BA ; 0E37 ;  MA      # ( ឺ → ื ) KHMER VOWEL SIGN YY → THAI CHARACTER SARA UEE       # 
+
+0EB8 ; 0E38 ;  MA      # ( ຸ → ุ ) LAO VOWEL SIGN U → THAI CHARACTER SARA U    # 
+
+0EB9 ; 0E39 ;  MA      # ( ູ → ู ) LAO VOWEL SIGN UU → THAI CHARACTER SARA UU  # 
+
+0E41 ; 0E40 0E40 ;     MA      # ( แ → เเ ) THAI CHARACTER SARA AE → THAI CHARACTER SARA E, THAI CHARACTER SARA E    # 
+
+0EDC ; 0EAB 0E99 ;     MA      # ( ໜ → ຫນ ) LAO HO NO → LAO LETTER HO SUNG, LAO LETTER NO    # 
+
+0EDD ; 0EAB 0EA1 ;     MA      # ( ໝ → ຫມ ) LAO HO MO → LAO LETTER HO SUNG, LAO LETTER MO    # 
+
+0EB3 ; 030A 0EB2 ;     MA      # ( ຳ → ̊າ ) LAO VOWEL SIGN AM → COMBINING RING ABOVE, LAO VOWEL SIGN AA       # →ໍາ→
+
+0F6A ; 0F62 ;  MA      # ( ཪ → ར ) TIBETAN LETTER FIXED-FORM RA → TIBETAN LETTER RA    # 
+
+0F77 ; 0FB2 0F71 0F80 ;        MA      # ( ཷ → ྲཱྀ ) TIBETAN VOWEL SIGN VOCALIC RR → TIBETAN SUBJOINED LETTER RA, TIBETAN VOWEL SIGN AA, TIBETAN VOWEL SIGN REVERSED I     # 
+
+0F79 ; 0FB3 0F71 0F80 ;        MA      # ( ཹ → ླཱྀ ) TIBETAN VOWEL SIGN VOCALIC LL → TIBETAN SUBJOINED LETTER LA, TIBETAN VOWEL SIGN AA, TIBETAN VOWEL SIGN REVERSED I     # 
+
+17A3 ; 17A2 ;  MA      # ( ឣ → អ ) KHMER INDEPENDENT VOWEL QAQ → KHMER LETTER QA       # 
+
+19D0 ; 199E ;  MA      # ( ᧐ → ᦞ ) NEW TAI LUE DIGIT ZERO → NEW TAI LUE LETTER LOW VA  # 
+
+19D1 ; 19B1 ;  MA      # ( ᧑ → ᦱ ) NEW TAI LUE DIGIT ONE → NEW TAI LUE VOWEL SIGN AA   # 
+
+1A80 ; 1A45 ;  MA      # ( ᪀ → ᩅ ) TAI THAM HORA DIGIT ZERO → TAI THAM LETTER WA       # 
+1A90 ; 1A45 ;  MA      # ( ᪐ → ᩅ ) TAI THAM THAM DIGIT ZERO → TAI THAM LETTER WA       # 
+
+AA53 ; AA01 ;  MA      # ( ꩓ → ꨁ ) CHAM DIGIT THREE → CHAM LETTER I    # 
+
+AA56 ; AA23 ;  MA      # ( ꩖ → ꨣ ) CHAM DIGIT SIX → CHAM LETTER RA     # 
+
+1B52 ; 1B0D ;  MA      # ( ᭒ → ᬍ ) BALINESE DIGIT TWO → BALINESE LETTER LA LENGA       # 
+
+1B53 ; 1B11 ;  MA      # ( ᭓ → ᬑ ) BALINESE DIGIT THREE → BALINESE LETTER OKARA        # 
+
+1B58 ; 1B28 ;  MA      # ( ᭘ → ᬨ ) BALINESE DIGIT EIGHT → BALINESE LETTER PA KAPAL     # 
+
+1896 ; 185C ;  MA      # ( ᢖ → ᡜ ) MONGOLIAN LETTER ALI GALI ZA → MONGOLIAN LETTER TODO DZA    # 
+
+1855 ; 1835 ;  MA      # ( ᡕ → ᠵ ) MONGOLIAN LETTER TODO YA → MONGOLIAN LETTER JA      # 
+
+140D ; 1401 00B7 ;     MA      # ( ᐍ → ᐁ· ) CANADIAN SYLLABICS WEST-CREE WE → CANADIAN SYLLABICS E, MIDDLE DOT        # →ᐁᐧ→
+
+2206 ; 1403 ;  MA      #* ( ∆ → ᐃ ) INCREMENT → CANADIAN SYLLABICS I   # →Δ→
+0394 ; 1403 ;  MA      # ( Δ → ᐃ ) GREEK CAPITAL LETTER DELTA → CANADIAN SYLLABICS I    # 
+1D6AB ;        1403 ;  MA      # ( 𝚫 → ᐃ ) MATHEMATICAL BOLD CAPITAL DELTA → CANADIAN SYLLABICS I     # →Δ→
+1D6E5 ;        1403 ;  MA      # ( 𝛥 → ᐃ ) MATHEMATICAL ITALIC CAPITAL DELTA → CANADIAN SYLLABICS I   # →Δ→
+1D71F ;        1403 ;  MA      # ( 𝜟 → ᐃ ) MATHEMATICAL BOLD ITALIC CAPITAL DELTA → CANADIAN SYLLABICS I      # →Δ→
+1D759 ;        1403 ;  MA      # ( 𝝙 → ᐃ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA → CANADIAN SYLLABICS I  # →Δ→
+1D793 ;        1403 ;  MA      # ( 𝞓 → ᐃ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA → CANADIAN SYLLABICS I   # →Δ→
+2C86 ; 1403 ;  MA      # ( Ⲇ → ᐃ ) COPTIC CAPITAL LETTER DALDA → CANADIAN SYLLABICS I  # →Δ→
+2D60 ; 1403 ;  MA      # ( ⵠ → ᐃ ) TIFINAGH LETTER YAV → CANADIAN SYLLABICS I  # 
+
+140F ; 1403 00B7 ;     MA      # ( ᐏ → ᐃ· ) CANADIAN SYLLABICS WEST-CREE WI → CANADIAN SYLLABICS I, MIDDLE DOT        # →ᐃᐧ→
+
+1411 ; 1404 00B7 ;     MA      # ( ᐑ → ᐄ· ) CANADIAN SYLLABICS WEST-CREE WII → CANADIAN SYLLABICS II, MIDDLE DOT      # →ᐄᐧ→
+
+1413 ; 1405 00B7 ;     MA      # ( ᐓ → ᐅ· ) CANADIAN SYLLABICS WEST-CREE WO → CANADIAN SYLLABICS O, MIDDLE DOT        # →ᐅᐧ→
+
+1415 ; 1406 00B7 ;     MA      # ( ᐕ → ᐆ· ) CANADIAN SYLLABICS WEST-CREE WOO → CANADIAN SYLLABICS OO, MIDDLE DOT      # →ᐆᐧ→
+
+1418 ; 140A 00B7 ;     MA      # ( ᐘ → ᐊ· ) CANADIAN SYLLABICS WEST-CREE WA → CANADIAN SYLLABICS A, MIDDLE DOT        # →ᐊᐧ→
+
+141A ; 140B 00B7 ;     MA      # ( ᐚ → ᐋ· ) CANADIAN SYLLABICS WEST-CREE WAA → CANADIAN SYLLABICS AA, MIDDLE DOT      # →ᐋᐧ→
+
+14D1 ; 1421 ;  MA      # ( ᓑ → ᐡ ) CANADIAN SYLLABICS CARRIER NG → CANADIAN SYLLABICS FINAL BOTTOM HALF RING   # 
+
+1540 ; 1429 ;  MA      # ( ᕀ → ᐩ ) CANADIAN SYLLABICS WEST-CREE Y → CANADIAN SYLLABICS FINAL PLUS      # 
+
+1441 ; 1433 00B7 ;     MA      # ( ᑁ → ᐳ· ) CANADIAN SYLLABICS WEST-CREE PWO → CANADIAN SYLLABICS PO, MIDDLE DOT      # →ᐳᐧ→
+
+1443 ; 1434 00B7 ;     MA      # ( ᑃ → ᐴ· ) CANADIAN SYLLABICS WEST-CREE PWOO → CANADIAN SYLLABICS POO, MIDDLE DOT    # →ᐴᐧ→
+
+2CB4 ; 1438 00B7 ;     MA      # ( Ⲵ → ᐸ· ) COPTIC CAPITAL LETTER OLD COPTIC AIN → CANADIAN SYLLABICS PA, MIDDLE DOT  # →ᑅ→→ᐸᐧ→
+1445 ; 1438 00B7 ;     MA      # ( ᑅ → ᐸ· ) CANADIAN SYLLABICS WEST-CREE PWA → CANADIAN SYLLABICS PA, MIDDLE DOT      # →ᐸᐧ→
+
+1447 ; 1439 00B7 ;     MA      # ( ᑇ → ᐹ· ) CANADIAN SYLLABICS WEST-CREE PWAA → CANADIAN SYLLABICS PAA, MIDDLE DOT    # →ᐹᐧ→
+
+02C8 ; 144A ;  MA      # ( ˈ → ᑊ ) MODIFIER LETTER VERTICAL LINE → CANADIAN SYLLABICS WEST-CREE P       # 
+
+0548 ; 144E ;  MA      # ( Ո → ᑎ ) ARMENIAN CAPITAL LETTER VO → CANADIAN SYLLABICS TI   # 
+
+145A ; 144E 00B7 ;     MA      # ( ᑚ → ᑎ· ) CANADIAN SYLLABICS WEST-CREE TWI → CANADIAN SYLLABICS TI, MIDDLE DOT      # →ᑎᐧ→
+
+1468 ; 144E 144A ;     MA      # ( ᑨ → ᑎᑊ ) CANADIAN SYLLABICS TTI → CANADIAN SYLLABICS TI, CANADIAN SYLLABICS WEST-CREE P   # 
+
+145C ; 144F 00B7 ;     MA      # ( ᑜ → ᑏ· ) CANADIAN SYLLABICS WEST-CREE TWII → CANADIAN SYLLABICS TII, MIDDLE DOT    # →ᑏᐧ→
+
+145E ; 1450 00B7 ;     MA      # ( ᑞ → ᑐ· ) CANADIAN SYLLABICS WEST-CREE TWO → CANADIAN SYLLABICS TO, MIDDLE DOT      # →ᑐᐧ→
+
+1469 ; 1450 144A ;     MA      # ( ᑩ → ᑐᑊ ) CANADIAN SYLLABICS TTO → CANADIAN SYLLABICS TO, CANADIAN SYLLABICS WEST-CREE P   # 
+
+1460 ; 1451 00B7 ;     MA      # ( ᑠ → ᑑ· ) CANADIAN SYLLABICS WEST-CREE TWOO → CANADIAN SYLLABICS TOO, MIDDLE DOT    # →ᑑᐧ→
+
+1462 ; 1455 00B7 ;     MA      # ( ᑢ → ᑕ· ) CANADIAN SYLLABICS WEST-CREE TWA → CANADIAN SYLLABICS TA, MIDDLE DOT      # →ᑕᐧ→
+
+146A ; 1455 144A ;     MA      # ( ᑪ → ᑕᑊ ) CANADIAN SYLLABICS TTA → CANADIAN SYLLABICS TA, CANADIAN SYLLABICS WEST-CREE P   # 
+
+1464 ; 1456 00B7 ;     MA      # ( ᑤ → ᑖ· ) CANADIAN SYLLABICS WEST-CREE TWAA → CANADIAN SYLLABICS TAA, MIDDLE DOT    # →ᑖᐧ→
+
+1475 ; 146B 00B7 ;     MA      # ( ᑵ → ᑫ· ) CANADIAN SYLLABICS WEST-CREE KWE → CANADIAN SYLLABICS KE, MIDDLE DOT      # →ᑫᐧ→
+
+1485 ; 146B 144A ;     MA      # ( ᒅ → ᑫᑊ ) CANADIAN SYLLABICS SOUTH-SLAVEY KEH → CANADIAN SYLLABICS KE, CANADIAN SYLLABICS WEST-CREE P      # 
+
+1479 ; 146E 00B7 ;     MA      # ( ᑹ → ᑮ· ) CANADIAN SYLLABICS WEST-CREE KWII → CANADIAN SYLLABICS KII, MIDDLE DOT    # →ᑮᐧ→
+
+147D ; 1470 00B7 ;     MA      # ( ᑽ → ᑰ· ) CANADIAN SYLLABICS WEST-CREE KWOO → CANADIAN SYLLABICS KOO, MIDDLE DOT    # →ᑰᐧ→
+
+147F ; 1472 00B7 ;     MA      # ( ᑿ → ᑲ· ) CANADIAN SYLLABICS WEST-CREE KWA → CANADIAN SYLLABICS KA, MIDDLE DOT      # →ᑲᐧ→
+
+1488 ; 1472 144A ;     MA      # ( ᒈ → ᑲᑊ ) CANADIAN SYLLABICS SOUTH-SLAVEY KAH → CANADIAN SYLLABICS KA, CANADIAN SYLLABICS WEST-CREE P      # 
+
+1481 ; 1473 00B7 ;     MA      # ( ᒁ → ᑳ· ) CANADIAN SYLLABICS WEST-CREE KWAA → CANADIAN SYLLABICS KAA, MIDDLE DOT    # →ᑳᐧ→
+
+1603 ; 1489 ;  MA      # ( ᘃ → ᒉ ) CANADIAN SYLLABICS CARRIER NO → CANADIAN SYLLABICS CE       # 
+
+1493 ; 1489 00B7 ;     MA      # ( ᒓ → ᒉ· ) CANADIAN SYLLABICS WEST-CREE CWE → CANADIAN SYLLABICS CE, MIDDLE DOT      # →ᒉᐧ→
+
+1495 ; 148B 00B7 ;     MA      # ( ᒕ → ᒋ· ) CANADIAN SYLLABICS WEST-CREE CWI → CANADIAN SYLLABICS CI, MIDDLE DOT      # →ᒋᐧ→
+
+1497 ; 148C 00B7 ;     MA      # ( ᒗ → ᒌ· ) CANADIAN SYLLABICS WEST-CREE CWII → CANADIAN SYLLABICS CII, MIDDLE DOT    # →ᒌᐧ→
+
+149B ; 148E 00B7 ;     MA      # ( ᒛ → ᒎ· ) CANADIAN SYLLABICS WEST-CREE CWOO → CANADIAN SYLLABICS COO, MIDDLE DOT    # →ᒎᐧ→
+
+1602 ; 1490 ;  MA      # ( ᘂ → ᒐ ) CANADIAN SYLLABICS CARRIER NU → CANADIAN SYLLABICS CA       # 
+
+149D ; 1490 00B7 ;     MA      # ( ᒝ → ᒐ· ) CANADIAN SYLLABICS WEST-CREE CWA → CANADIAN SYLLABICS CA, MIDDLE DOT      # →ᒐᐧ→
+
+149F ; 1491 00B7 ;     MA      # ( ᒟ → ᒑ· ) CANADIAN SYLLABICS WEST-CREE CWAA → CANADIAN SYLLABICS CAA, MIDDLE DOT    # →ᒑᐧ→
+
+14AD ; 14A3 00B7 ;     MA      # ( ᒭ → ᒣ· ) CANADIAN SYLLABICS WEST-CREE MWE → CANADIAN SYLLABICS ME, MIDDLE DOT      # →ᒣᐧ→
+
+0393 ; 14A5 ;  MA      # ( Γ → ᒥ ) GREEK CAPITAL LETTER GAMMA → CANADIAN SYLLABICS MI   # 
+213E ; 14A5 ;  MA      # ( ℾ → ᒥ ) DOUBLE-STRUCK CAPITAL GAMMA → CANADIAN SYLLABICS MI # →Γ→
+1D6AA ;        14A5 ;  MA      # ( 𝚪 → ᒥ ) MATHEMATICAL BOLD CAPITAL GAMMA → CANADIAN SYLLABICS MI    # →Γ→
+1D6E4 ;        14A5 ;  MA      # ( 𝛤 → ᒥ ) MATHEMATICAL ITALIC CAPITAL GAMMA → CANADIAN SYLLABICS MI  # →Γ→
+1D71E ;        14A5 ;  MA      # ( 𝜞 → ᒥ ) MATHEMATICAL BOLD ITALIC CAPITAL GAMMA → CANADIAN SYLLABICS MI     # →Γ→
+1D758 ;        14A5 ;  MA      # ( 𝝘 → ᒥ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA → CANADIAN SYLLABICS MI # →Γ→
+1D792 ;        14A5 ;  MA      # ( 𝞒 → ᒥ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA → CANADIAN SYLLABICS MI  # →Γ→
+2C84 ; 14A5 ;  MA      # ( Ⲅ → ᒥ ) COPTIC CAPITAL LETTER GAMMA → CANADIAN SYLLABICS MI # →Г→
+0413 ; 14A5 ;  MA      # ( Г → ᒥ ) CYRILLIC CAPITAL LETTER GHE → CANADIAN SYLLABICS MI  # 
+13B1 ; 14A5 ;  MA      # ( Ꮁ → ᒥ ) CHEROKEE LETTER HU → CANADIAN SYLLABICS MI  # →Γ→
+
+0492 ; 14A5 0335 ;     MA      # ( Ғ → ᒥ̵ ) CYRILLIC CAPITAL LETTER GHE WITH STROKE → CANADIAN SYLLABICS MI, COMBINING SHORT STROKE OVERLAY    # →Г̵→→Γ̵→
+
+14AF ; 14A5 00B7 ;     MA      # ( ᒯ → ᒥ· ) CANADIAN SYLLABICS WEST-CREE MWI → CANADIAN SYLLABICS MI, MIDDLE DOT      # →ᒥᐧ→
+
+0490 ; 14A5 144A ;     MA      # ( Ґ → ᒥᑊ ) CYRILLIC CAPITAL LETTER GHE WITH UPTURN → CANADIAN SYLLABICS MI, CANADIAN SYLLABICS WEST-CREE P   # →Гˈ→→Γᑊ→
+
+14B1 ; 14A6 00B7 ;     MA      # ( ᒱ → ᒦ· ) CANADIAN SYLLABICS WEST-CREE MWII → CANADIAN SYLLABICS MII, MIDDLE DOT    # →ᒦᐧ→
+
+14B3 ; 14A7 00B7 ;     MA      # ( ᒳ → ᒧ· ) CANADIAN SYLLABICS WEST-CREE MWO → CANADIAN SYLLABICS MO, MIDDLE DOT      # →ᒧᐧ→
+
+14B5 ; 14A8 00B7 ;     MA      # ( ᒵ → ᒨ· ) CANADIAN SYLLABICS WEST-CREE MWOO → CANADIAN SYLLABICS MOO, MIDDLE DOT    # →ᒨᐧ→
+
+14B9 ; 14AB 00B7 ;     MA      # ( ᒹ → ᒫ· ) CANADIAN SYLLABICS WEST-CREE MWAA → CANADIAN SYLLABICS MAA, MIDDLE DOT    # →ᒫᐧ→
+
+14CA ; 14C0 00B7 ;     MA      # ( ᓊ → ᓀ· ) CANADIAN SYLLABICS WEST-CREE NWE → CANADIAN SYLLABICS NE, MIDDLE DOT      # →ᓀᐧ→
+
+14CC ; 14C7 00B7 ;     MA      # ( ᓌ → ᓇ· ) CANADIAN SYLLABICS WEST-CREE NWA → CANADIAN SYLLABICS NA, MIDDLE DOT      # →ᓇᐧ→
+
+14CE ; 14C8 14AB ;     MA      # ( ᓎ → ᓈᒫ ) CANADIAN SYLLABICS WEST-CREE NWAA → CANADIAN SYLLABICS NAA, CANADIAN SYLLABICS MAA       # 
+
+1604 ; 14D3 ;  MA      # ( ᘄ → ᓓ ) CANADIAN SYLLABICS CARRIER NE → CANADIAN SYLLABICS LE       # 
+
+14DD ; 14D3 00B7 ;     MA      # ( ᓝ → ᓓ· ) CANADIAN SYLLABICS WEST-CREE LWE → CANADIAN SYLLABICS LE, MIDDLE DOT      # →ᓓᐧ→
+
+14DF ; 14D5 00B7 ;     MA      # ( ᓟ → ᓕ· ) CANADIAN SYLLABICS WEST-CREE LWI → CANADIAN SYLLABICS LI, MIDDLE DOT      # →ᓕᐧ→
+
+14E1 ; 14D6 00B7 ;     MA      # ( ᓡ → ᓖ· ) CANADIAN SYLLABICS WEST-CREE LWII → CANADIAN SYLLABICS LII, MIDDLE DOT    # →ᓖᐧ→
+
+14E3 ; 14D7 00B7 ;     MA      # ( ᓣ → ᓗ· ) CANADIAN SYLLABICS WEST-CREE LWO → CANADIAN SYLLABICS LO, MIDDLE DOT      # →ᓗᐧ→
+
+14E5 ; 14D8 00B7 ;     MA      # ( ᓥ → ᓘ· ) CANADIAN SYLLABICS WEST-CREE LWOO → CANADIAN SYLLABICS LOO, MIDDLE DOT    # →ᓘᐧ→
+
+1607 ; 14DA ;  MA      # ( ᘇ → ᓚ ) CANADIAN SYLLABICS CARRIER NA → CANADIAN SYLLABICS LA       # 
+
+14E7 ; 14DA 00B7 ;     MA      # ( ᓧ → ᓚ· ) CANADIAN SYLLABICS WEST-CREE LWA → CANADIAN SYLLABICS LA, MIDDLE DOT      # →ᓚᐧ→
+
+14E9 ; 14DB 00B7 ;     MA      # ( ᓩ → ᓛ· ) CANADIAN SYLLABICS WEST-CREE LWAA → CANADIAN SYLLABICS LAA, MIDDLE DOT    # →ᓛᐧ→
+
+14F7 ; 14ED 00B7 ;     MA      # ( ᓷ → ᓭ· ) CANADIAN SYLLABICS WEST-CREE SWE → CANADIAN SYLLABICS SE, MIDDLE DOT      # →ᓭᐧ→
+
+14F9 ; 14EF 00B7 ;     MA      # ( ᓹ → ᓯ· ) CANADIAN SYLLABICS WEST-CREE SWI → CANADIAN SYLLABICS SI, MIDDLE DOT      # →ᓯᐧ→
+
+14FB ; 14F0 00B7 ;     MA      # ( ᓻ → ᓰ· ) CANADIAN SYLLABICS WEST-CREE SWII → CANADIAN SYLLABICS SII, MIDDLE DOT    # →ᓰᐧ→
+
+14FD ; 14F1 00B7 ;     MA      # ( ᓽ → ᓱ· ) CANADIAN SYLLABICS WEST-CREE SWO → CANADIAN SYLLABICS SO, MIDDLE DOT      # →ᓱᐧ→
+
+14FF ; 14F2 00B7 ;     MA      # ( ᓿ → ᓲ· ) CANADIAN SYLLABICS WEST-CREE SWOO → CANADIAN SYLLABICS SOO, MIDDLE DOT    # →ᓲᐧ→
+
+1501 ; 14F4 00B7 ;     MA      # ( ᔁ → ᓴ· ) CANADIAN SYLLABICS WEST-CREE SWA → CANADIAN SYLLABICS SA, MIDDLE DOT      # →ᓴᐧ→
+
+1503 ; 14F5 00B7 ;     MA      # ( ᔃ → ᓵ· ) CANADIAN SYLLABICS WEST-CREE SWAA → CANADIAN SYLLABICS SAA, MIDDLE DOT    # →ᓵᐧ→
+
+150C ; 150B 1438 ;     MA      # ( ᔌ → ᔋᐸ ) CANADIAN SYLLABICS NASKAPI SPWA → CANADIAN SYLLABICS NASKAPI S-W, CANADIAN SYLLABICS PA  # 
+
+150D ; 150B 1455 ;     MA      # ( ᔍ → ᔋᑕ ) CANADIAN SYLLABICS NASKAPI STWA → CANADIAN SYLLABICS NASKAPI S-W, CANADIAN SYLLABICS TA  # 
+
+150E ; 150B 1472 ;     MA      # ( ᔎ → ᔋᑲ ) CANADIAN SYLLABICS NASKAPI SKWA → CANADIAN SYLLABICS NASKAPI S-W, CANADIAN SYLLABICS KA  # 
+
+150F ; 150B 1490 ;     MA      # ( ᔏ → ᔋᒐ ) CANADIAN SYLLABICS NASKAPI SCWA → CANADIAN SYLLABICS NASKAPI S-W, CANADIAN SYLLABICS CA  # 
+
+1518 ; 1510 00B7 ;     MA      # ( ᔘ → ᔐ· ) CANADIAN SYLLABICS WEST-CREE SHWE → CANADIAN SYLLABICS SHE, MIDDLE DOT    # →ᔐᐧ→
+
+151A ; 1511 00B7 ;     MA      # ( ᔚ → ᔑ· ) CANADIAN SYLLABICS WEST-CREE SHWI → CANADIAN SYLLABICS SHI, MIDDLE DOT    # →ᔑᐧ→
+
+151C ; 1512 00B7 ;     MA      # ( ᔜ → ᔒ· ) CANADIAN SYLLABICS WEST-CREE SHWII → CANADIAN SYLLABICS SHII, MIDDLE DOT  # →ᔒᐧ→
+
+151E ; 1513 00B7 ;     MA      # ( ᔞ → ᔓ· ) CANADIAN SYLLABICS WEST-CREE SHWO → CANADIAN SYLLABICS SHO, MIDDLE DOT    # →ᔓᐧ→
+
+1520 ; 1514 00B7 ;     MA      # ( ᔠ → ᔔ· ) CANADIAN SYLLABICS WEST-CREE SHWOO → CANADIAN SYLLABICS SHOO, MIDDLE DOT  # →ᔔᐧ→
+
+1522 ; 1515 00B7 ;     MA      # ( ᔢ → ᔕ· ) CANADIAN SYLLABICS WEST-CREE SHWA → CANADIAN SYLLABICS SHA, MIDDLE DOT    # →ᔕᐧ→
+
+1524 ; 1516 00B7 ;     MA      # ( ᔤ → ᔖ· ) CANADIAN SYLLABICS WEST-CREE SHWAA → CANADIAN SYLLABICS SHAA, MIDDLE DOT  # →ᔖᐧ→
+
+1532 ; 1528 00B7 ;     MA      # ( ᔲ → ᔨ· ) CANADIAN SYLLABICS WEST-CREE YWI → CANADIAN SYLLABICS YI, MIDDLE DOT      # →ᔨᐧ→
+
+1534 ; 1529 00B7 ;     MA      # ( ᔴ → ᔩ· ) CANADIAN SYLLABICS WEST-CREE YWII → CANADIAN SYLLABICS YII, MIDDLE DOT    # →ᔩᐧ→
+
+1536 ; 152A 00B7 ;     MA      # ( ᔶ → ᔪ· ) CANADIAN SYLLABICS WEST-CREE YWO → CANADIAN SYLLABICS YO, MIDDLE DOT      # →ᔪᐧ→
+
+1538 ; 152B 00B7 ;     MA      # ( ᔸ → ᔫ· ) CANADIAN SYLLABICS WEST-CREE YWOO → CANADIAN SYLLABICS YOO, MIDDLE DOT    # →ᔫᐧ→
+
+153A ; 152D 00B7 ;     MA      # ( ᔺ → ᔭ· ) CANADIAN SYLLABICS WEST-CREE YWA → CANADIAN SYLLABICS YA, MIDDLE DOT      # →ᔭᐧ→
+
+153C ; 152E 00B7 ;     MA      # ( ᔼ → ᔮ· ) CANADIAN SYLLABICS WEST-CREE YWAA → CANADIAN SYLLABICS YAA, MIDDLE DOT    # →ᔮᐧ→
+
+1622 ; 1543 ;  MA      # ( ᘢ → ᕃ ) CANADIAN SYLLABICS CARRIER LU → CANADIAN SYLLABICS R-CREE RE        # 
+
+1623 ; 1546 ;  MA      # ( ᘣ → ᕆ ) CANADIAN SYLLABICS CARRIER LO → CANADIAN SYLLABICS RI       # 
+
+1624 ; 154A ;  MA      # ( ᘤ → ᕊ ) CANADIAN SYLLABICS CARRIER LE → CANADIAN SYLLABICS WEST-CREE LO     # 
+
+154F ; 154C 00B7 ;     MA      # ( ᕏ → ᕌ· ) CANADIAN SYLLABICS WEST-CREE RWAA → CANADIAN SYLLABICS RAA, MIDDLE DOT    # →ᕌᐧ→
+
+1581 ; 1550 0064 ;     MA      # ( ᖁ → ᕐd ) CANADIAN SYLLABICS QO → CANADIAN SYLLABICS R, LATIN SMALL LETTER D # →ᕐᑯ→
+
+157F ; 1550 0050 ;     MA      # ( ᕿ → ᕐP ) CANADIAN SYLLABICS QI → CANADIAN SYLLABICS R, LATIN CAPITAL LETTER P       # →ᕐᑭ→
+
+166F ; 1550 146B ;     MA      # ( ᙯ → ᕐᑫ ) CANADIAN SYLLABICS QAI → CANADIAN SYLLABICS R, CANADIAN SYLLABICS KE     # 
+
+157E ; 1550 146C ;     MA      # ( ᕾ → ᕐᑬ ) CANADIAN SYLLABICS QAAI → CANADIAN SYLLABICS R, CANADIAN SYLLABICS KAAI  # 
+
+1580 ; 1550 146E ;     MA      # ( ᖀ → ᕐᑮ ) CANADIAN SYLLABICS QII → CANADIAN SYLLABICS R, CANADIAN SYLLABICS KII    # 
+
+1582 ; 1550 1470 ;     MA      # ( ᖂ → ᕐᑰ ) CANADIAN SYLLABICS QOO → CANADIAN SYLLABICS R, CANADIAN SYLLABICS KOO    # 
+
+1583 ; 1550 1472 ;     MA      # ( ᖃ → ᕐᑲ ) CANADIAN SYLLABICS QA → CANADIAN SYLLABICS R, CANADIAN SYLLABICS KA      # 
+
+1584 ; 1550 1473 ;     MA      # ( ᖄ → ᕐᑳ ) CANADIAN SYLLABICS QAA → CANADIAN SYLLABICS R, CANADIAN SYLLABICS KAA    # 
+
+1585 ; 1550 1483 ;     MA      # ( ᖅ → ᕐᒃ ) CANADIAN SYLLABICS Q → CANADIAN SYLLABICS R, CANADIAN SYLLABICS K        # 
+
+155C ; 155A 00B7 ;     MA      # ( ᕜ → ᕚ· ) CANADIAN SYLLABICS WEST-CREE FWAA → CANADIAN SYLLABICS FAA, MIDDLE DOT    # →ᕚᐧ→
+
+1569 ; 1567 00B7 ;     MA      # ( ᕩ → ᕧ· ) CANADIAN SYLLABICS WEST-CREE THWAA → CANADIAN SYLLABICS THAA, MIDDLE DOT  # →ᕧᐧ→
+
+1591 ; 1595 004A ;     MA      # ( ᖑ → ᖕJ ) CANADIAN SYLLABICS NGO → CANADIAN SYLLABICS NG, LATIN CAPITAL LETTER J     # →ᖕᒍ→
+
+1670 ; 1595 1489 ;     MA      # ( ᙰ → ᖕᒉ ) CANADIAN SYLLABICS NGAI → CANADIAN SYLLABICS NG, CANADIAN SYLLABICS CE   # 
+
+158E ; 1595 148A ;     MA      # ( ᖎ → ᖕᒊ ) CANADIAN SYLLABICS NGAAI → CANADIAN SYLLABICS NG, CANADIAN SYLLABICS CAAI        # 
+
+158F ; 1595 148B ;     MA      # ( ᖏ → ᖕᒋ ) CANADIAN SYLLABICS NGI → CANADIAN SYLLABICS NG, CANADIAN SYLLABICS CI    # 
+
+1590 ; 1595 148C ;     MA      # ( ᖐ → ᖕᒌ ) CANADIAN SYLLABICS NGII → CANADIAN SYLLABICS NG, CANADIAN SYLLABICS CII  # 
+
+1592 ; 1595 148E ;     MA      # ( ᖒ → ᖕᒎ ) CANADIAN SYLLABICS NGOO → CANADIAN SYLLABICS NG, CANADIAN SYLLABICS COO  # 
+
+1593 ; 1595 1490 ;     MA      # ( ᖓ → ᖕᒐ ) CANADIAN SYLLABICS NGA → CANADIAN SYLLABICS NG, CANADIAN SYLLABICS CA    # 
+
+1594 ; 1595 1491 ;     MA      # ( ᖔ → ᖕᒑ ) CANADIAN SYLLABICS NGAA → CANADIAN SYLLABICS NG, CANADIAN SYLLABICS CAA  # 
+
+1673 ; 1596 004A ;     MA      # ( ᙳ → ᖖJ ) CANADIAN SYLLABICS NNGO → CANADIAN SYLLABICS NNG, LATIN CAPITAL LETTER J   # →ᖖᒍ→
+
+1671 ; 1596 148B ;     MA      # ( ᙱ → ᖖᒋ ) CANADIAN SYLLABICS NNGI → CANADIAN SYLLABICS NNG, CANADIAN SYLLABICS CI  # 
+
+1672 ; 1596 148C ;     MA      # ( ᙲ → ᖖᒌ ) CANADIAN SYLLABICS NNGII → CANADIAN SYLLABICS NNG, CANADIAN SYLLABICS CII        # 
+
+1674 ; 1596 148E ;     MA      # ( ᙴ → ᖖᒎ ) CANADIAN SYLLABICS NNGOO → CANADIAN SYLLABICS NNG, CANADIAN SYLLABICS COO        # 
+
+1675 ; 1596 1490 ;     MA      # ( ᙵ → ᖖᒐ ) CANADIAN SYLLABICS NNGA → CANADIAN SYLLABICS NNG, CANADIAN SYLLABICS CA  # 
+
+1676 ; 1596 1491 ;     MA      # ( ᙶ → ᖖᒑ ) CANADIAN SYLLABICS NNGAA → CANADIAN SYLLABICS NNG, CANADIAN SYLLABICS CAA        # 
+
+A4F7 ; 15E1 ;  MA      # ( ꓷ → ᗡ ) LISU LETTER OE → CANADIAN SYLLABICS CARRIER THA     # 
+
+0460 ; 15EF ;  MA      # ( Ѡ → ᗯ ) CYRILLIC CAPITAL LETTER OMEGA → CANADIAN SYLLABICS CARRIER GU        # 
+
+03A9 ; 162F ;  MA      # ( Ω → ᘯ ) GREEK CAPITAL LETTER OMEGA → CANADIAN SYLLABICS CARRIER LHO  # 
+2126 ; 162F ;  MA      # ( Ω → ᘯ ) OHM SIGN → CANADIAN SYLLABICS CARRIER LHO   # →Ω→
+1D6C0 ;        162F ;  MA      # ( 𝛀 → ᘯ ) MATHEMATICAL BOLD CAPITAL OMEGA → CANADIAN SYLLABICS CARRIER LHO   # →Ω→
+1D6FA ;        162F ;  MA      # ( 𝛺 → ᘯ ) MATHEMATICAL ITALIC CAPITAL OMEGA → CANADIAN SYLLABICS CARRIER LHO # →Ω→
+1D734 ;        162F ;  MA      # ( 𝜴 → ᘯ ) MATHEMATICAL BOLD ITALIC CAPITAL OMEGA → CANADIAN SYLLABICS CARRIER LHO    # →Ω→
+1D76E ;        162F ;  MA      # ( 𝝮 → ᘯ ) MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA → CANADIAN SYLLABICS CARRIER LHO        # →Ω→
+1D7A8 ;        162F ;  MA      # ( 𝞨 → ᘯ ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA → CANADIAN SYLLABICS CARRIER LHO # →Ω→
+1635 ; 162F ;  MA      # ( ᘵ → ᘯ ) CANADIAN SYLLABICS CARRIER TLHO → CANADIAN SYLLABICS CARRIER LHO    # 
+
+A4ED ; 1660 ;  MA      # ( ꓭ → ᙠ ) LISU LETTER GHA → CANADIAN SYLLABICS CARRIER TSA    # 
+
+3131 ; 1100 ;  MA      # ( ㄱ → ᄀ ) HANGUL LETTER KIYEOK → HANGUL CHOSEONG KIYEOK       # 
+11A8 ; 1100 ;  MA      # ( ᆨ → ᄀ ) HANGUL JONGSEONG KIYEOK → HANGUL CHOSEONG KIYEOK    # 
+
+1101 ; 1100 1100 ;     MA      # ( ᄁ → ᄀᄀ ) HANGUL CHOSEONG SSANGKIYEOK → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG KIYEOK     # 
+3132 ; 1100 1100 ;     MA      # ( ㄲ → ᄀᄀ ) HANGUL LETTER SSANGKIYEOK → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG KIYEOK       # →ᄁ→
+11A9 ; 1100 1100 ;     MA      # ( ᆩ → ᄀᄀ ) HANGUL JONGSEONG SSANGKIYEOK → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG KIYEOK    # →ᄁ→
+
+11FA ; 1100 1102 ;     MA      # ( ᇺ → ᄀᄂ ) HANGUL JONGSEONG KIYEOK-NIEUN → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG NIEUN    # →ᆨᆫ→
+
+115A ; 1100 1103 ;     MA      # ( ᅚ → ᄀᄃ ) HANGUL CHOSEONG KIYEOK-TIKEUT → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG TIKEUT   # 
+
+11C3 ; 1100 1105 ;     MA      # ( ᇃ → ᄀᄅ ) HANGUL JONGSEONG KIYEOK-RIEUL → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG RIEUL    # →ᆨᆯ→
+
+11FB ; 1100 1107 ;     MA      # ( ᇻ → ᄀᄇ ) HANGUL JONGSEONG KIYEOK-PIEUP → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG PIEUP    # →ᆨᆸ→
+
+11AA ; 1100 1109 ;     MA      # ( ᆪ → ᄀᄉ ) HANGUL JONGSEONG KIYEOK-SIOS → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG SIOS      # →ᆨᆺ→
+3133 ; 1100 1109 ;     MA      # ( ㄳ → ᄀᄉ ) HANGUL LETTER KIYEOK-SIOS → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG SIOS # →ᆪ→→ᆨᆺ→
+
+11C4 ; 1100 1109 1100 ;        MA      # ( ᇄ → ᄀᄉᄀ ) HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK    # →ᆨᆺᆨ→
+
+11FC ; 1100 110E ;     MA      # ( ᇼ → ᄀᄎ ) HANGUL JONGSEONG KIYEOK-CHIEUCH → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG CHIEUCH        # →ᆨᆾ→
+
+11FD ; 1100 110F ;     MA      # ( ᇽ → ᄀᄏ ) HANGUL JONGSEONG KIYEOK-KHIEUKH → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG KHIEUKH        # →ᆨᆿ→
+
+11FE ; 1100 1112 ;     MA      # ( ᇾ → ᄀᄒ ) HANGUL JONGSEONG KIYEOK-HIEUH → HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG HIEUH    # →ᆨᇂ→
+
+3134 ; 1102 ;  MA      # ( ㄴ → ᄂ ) HANGUL LETTER NIEUN → HANGUL CHOSEONG NIEUN # 
+11AB ; 1102 ;  MA      # ( ᆫ → ᄂ ) HANGUL JONGSEONG NIEUN → HANGUL CHOSEONG NIEUN      # 
+
+1113 ; 1102 1100 ;     MA      # ( ᄓ → ᄂᄀ ) HANGUL CHOSEONG NIEUN-KIYEOK → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG KIYEOK     # 
+11C5 ; 1102 1100 ;     MA      # ( ᇅ → ᄂᄀ ) HANGUL JONGSEONG NIEUN-KIYEOK → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG KIYEOK    # →ᄓ→
+
+1114 ; 1102 1102 ;     MA      # ( ᄔ → ᄂᄂ ) HANGUL CHOSEONG SSANGNIEUN → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG NIEUN        # 
+3165 ; 1102 1102 ;     MA      # ( ㅥ → ᄂᄂ ) HANGUL LETTER SSANGNIEUN → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG NIEUN  # →ᄔ→
+11FF ; 1102 1102 ;     MA      # ( ᇿ → ᄂᄂ ) HANGUL JONGSEONG SSANGNIEUN → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG NIEUN       # →ᆫᆫ→
+
+1115 ; 1102 1103 ;     MA      # ( ᄕ → ᄂᄃ ) HANGUL CHOSEONG NIEUN-TIKEUT → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG TIKEUT     # 
+3166 ; 1102 1103 ;     MA      # ( ㅦ → ᄂᄃ ) HANGUL LETTER NIEUN-TIKEUT → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG TIKEUT       # →ᄕ→
+11C6 ; 1102 1103 ;     MA      # ( ᇆ → ᄂᄃ ) HANGUL JONGSEONG NIEUN-TIKEUT → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG TIKEUT    # →ᄕ→
+
+D7CB ; 1102 1105 ;     MA      # ( ퟋ → ᄂᄅ ) HANGUL JONGSEONG NIEUN-RIEUL → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG RIEUL      # →ᆫᆯ→
+
+1116 ; 1102 1107 ;     MA      # ( ᄖ → ᄂᄇ ) HANGUL CHOSEONG NIEUN-PIEUP → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG PIEUP       # 
+
+115B ; 1102 1109 ;     MA      # ( ᅛ → ᄂᄉ ) HANGUL CHOSEONG NIEUN-SIOS → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG SIOS # 
+11C7 ; 1102 1109 ;     MA      # ( ᇇ → ᄂᄉ ) HANGUL JONGSEONG NIEUN-SIOS → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG SIOS        # →ᆫᆺ→
+3167 ; 1102 1109 ;     MA      # ( ㅧ → ᄂᄉ ) HANGUL LETTER NIEUN-SIOS → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG SIOS   # →ᇇ→→ᆫᆺ→
+
+115C ; 1102 110C ;     MA      # ( ᅜ → ᄂᄌ ) HANGUL CHOSEONG NIEUN-CIEUC → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG CIEUC       # 
+11AC ; 1102 110C ;     MA      # ( ᆬ → ᄂᄌ ) HANGUL JONGSEONG NIEUN-CIEUC → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG CIEUC      # →ᆫᆽ→
+3135 ; 1102 110C ;     MA      # ( ㄵ → ᄂᄌ ) HANGUL LETTER NIEUN-CIEUC → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG CIEUC # →ᆬ→→ᆫᆽ→
+
+D7CC ; 1102 110E ;     MA      # ( ퟌ → ᄂᄎ ) HANGUL JONGSEONG NIEUN-CHIEUCH → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG CHIEUCH  # →ᆫᆾ→
+
+11C9 ; 1102 1110 ;     MA      # ( ᇉ → ᄂᄐ ) HANGUL JONGSEONG NIEUN-THIEUTH → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG THIEUTH  # →ᆫᇀ→
+
+115D ; 1102 1112 ;     MA      # ( ᅝ → ᄂᄒ ) HANGUL CHOSEONG NIEUN-HIEUH → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG HIEUH       # 
+11AD ; 1102 1112 ;     MA      # ( ᆭ → ᄂᄒ ) HANGUL JONGSEONG NIEUN-HIEUH → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG HIEUH      # →ᆫᇂ→
+3136 ; 1102 1112 ;     MA      # ( ㄶ → ᄂᄒ ) HANGUL LETTER NIEUN-HIEUH → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG HIEUH # →ᆭ→→ᆫᇂ→
+
+11C8 ; 1102 1140 ;     MA      # ( ᇈ → ᄂᅀ ) HANGUL JONGSEONG NIEUN-PANSIOS → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG PANSIOS  # →ᆫᇫ→
+3168 ; 1102 1140 ;     MA      # ( ㅨ → ᄂᅀ ) HANGUL LETTER NIEUN-PANSIOS → HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG PANSIOS     # →ᇈ→→ᆫᇫ→
+
+3137 ; 1103 ;  MA      # ( ㄷ → ᄃ ) HANGUL LETTER TIKEUT → HANGUL CHOSEONG TIKEUT       # 
+11AE ; 1103 ;  MA      # ( ᆮ → ᄃ ) HANGUL JONGSEONG TIKEUT → HANGUL CHOSEONG TIKEUT    # 
+
+1117 ; 1103 1100 ;     MA      # ( ᄗ → ᄃᄀ ) HANGUL CHOSEONG TIKEUT-KIYEOK → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG KIYEOK   # 
+11CA ; 1103 1100 ;     MA      # ( ᇊ → ᄃᄀ ) HANGUL JONGSEONG TIKEUT-KIYEOK → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG KIYEOK  # →ᄗ→
+
+1104 ; 1103 1103 ;     MA      # ( ᄄ → ᄃᄃ ) HANGUL CHOSEONG SSANGTIKEUT → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG TIKEUT     # 
+3138 ; 1103 1103 ;     MA      # ( ㄸ → ᄃᄃ ) HANGUL LETTER SSANGTIKEUT → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG TIKEUT       # →ᄄ→
+D7CD ; 1103 1103 ;     MA      # ( ퟍ → ᄃᄃ ) HANGUL JONGSEONG SSANGTIKEUT → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG TIKEUT    # →ᆮᆮ→
+
+D7CE ; 1103 1103 1107 ;        MA      # ( ퟎ → ᄃᄃᄇ ) HANGUL JONGSEONG SSANGTIKEUT-PIEUP → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG PIEUP    # →ᆮᆮᆸ→
+
+115E ; 1103 1105 ;     MA      # ( ᅞ → ᄃᄅ ) HANGUL CHOSEONG TIKEUT-RIEUL → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG RIEUL     # 
+11CB ; 1103 1105 ;     MA      # ( ᇋ → ᄃᄅ ) HANGUL JONGSEONG TIKEUT-RIEUL → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG RIEUL    # →ᆮᆯ→
+
+A960 ; 1103 1106 ;     MA      # ( ꥠ → ᄃᄆ ) HANGUL CHOSEONG TIKEUT-MIEUM → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG MIEUM     # 
+
+A961 ; 1103 1107 ;     MA      # ( ꥡ → ᄃᄇ ) HANGUL CHOSEONG TIKEUT-PIEUP → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG PIEUP     # 
+D7CF ; 1103 1107 ;     MA      # ( ퟏ → ᄃᄇ ) HANGUL JONGSEONG TIKEUT-PIEUP → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG PIEUP    # →ᆮᆸ→
+
+A962 ; 1103 1109 ;     MA      # ( ꥢ → ᄃᄉ ) HANGUL CHOSEONG TIKEUT-SIOS → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG SIOS       # 
+D7D0 ; 1103 1109 ;     MA      # ( ퟐ → ᄃᄉ ) HANGUL JONGSEONG TIKEUT-SIOS → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG SIOS      # →ᆮᆺ→
+
+D7D1 ; 1103 1109 1100 ;        MA      # ( ퟑ → ᄃᄉᄀ ) HANGUL JONGSEONG TIKEUT-SIOS-KIYEOK → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK    # →ᆮᆺᆨ→
+
+A963 ; 1103 110C ;     MA      # ( ꥣ → ᄃᄌ ) HANGUL CHOSEONG TIKEUT-CIEUC → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG CIEUC     # 
+D7D2 ; 1103 110C ;     MA      # ( ퟒ → ᄃᄌ ) HANGUL JONGSEONG TIKEUT-CIEUC → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG CIEUC    # →ᆮᆽ→
+
+D7D3 ; 1103 110E ;     MA      # ( ퟓ → ᄃᄎ ) HANGUL JONGSEONG TIKEUT-CHIEUCH → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG CHIEUCH        # →ᆮᆾ→
+
+D7D4 ; 1103 1110 ;     MA      # ( ퟔ → ᄃᄐ ) HANGUL JONGSEONG TIKEUT-THIEUTH → HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG THIEUTH        # →ᆮᇀ→
+
+3139 ; 1105 ;  MA      # ( ㄹ → ᄅ ) HANGUL LETTER RIEUL → HANGUL CHOSEONG RIEUL # 
+11AF ; 1105 ;  MA      # ( ᆯ → ᄅ ) HANGUL JONGSEONG RIEUL → HANGUL CHOSEONG RIEUL      # 
+
+A964 ; 1105 1100 ;     MA      # ( ꥤ → ᄅᄀ ) HANGUL CHOSEONG RIEUL-KIYEOK → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK     # 
+11B0 ; 1105 1100 ;     MA      # ( ᆰ → ᄅᄀ ) HANGUL JONGSEONG RIEUL-KIYEOK → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK    # →ᆯᆨ→
+313A ; 1105 1100 ;     MA      # ( ㄺ → ᄅᄀ ) HANGUL LETTER RIEUL-KIYEOK → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK       # →ᆰ→→ᆯᆨ→
+
+A965 ; 1105 1100 1100 ;        MA      # ( ꥥ → ᄅᄀᄀ ) HANGUL CHOSEONG RIEUL-SSANGKIYEOK → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG KIYEOK     # 
+D7D5 ; 1105 1100 1100 ;        MA      # ( ퟕ → ᄅᄀᄀ ) HANGUL JONGSEONG RIEUL-SSANGKIYEOK → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG KIYEOK    # →ᆯᆨᆨ→
+
+11CC ; 1105 1100 1109 ;        MA      # ( ᇌ → ᄅᄀᄉ ) HANGUL JONGSEONG RIEUL-KIYEOK-SIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG SIOS      # →ᆯᆨᆺ→
+3169 ; 1105 1100 1109 ;        MA      # ( ㅩ → ᄅᄀᄉ ) HANGUL LETTER RIEUL-KIYEOK-SIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG SIOS # →ᇌ→→ᆯᆨᆺ→
+
+D7D6 ; 1105 1100 1112 ;        MA      # ( ퟖ → ᄅᄀᄒ ) HANGUL JONGSEONG RIEUL-KIYEOK-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG HIEUH    # →ᆯᆨᇂ→
+
+1118 ; 1105 1102 ;     MA      # ( ᄘ → ᄅᄂ ) HANGUL CHOSEONG RIEUL-NIEUN → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG NIEUN       # 
+11CD ; 1105 1102 ;     MA      # ( ᇍ → ᄅᄂ ) HANGUL JONGSEONG RIEUL-NIEUN → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG NIEUN      # →ᄘ→
+
+A966 ; 1105 1103 ;     MA      # ( ꥦ → ᄅᄃ ) HANGUL CHOSEONG RIEUL-TIKEUT → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG TIKEUT     # 
+11CE ; 1105 1103 ;     MA      # ( ᇎ → ᄅᄃ ) HANGUL JONGSEONG RIEUL-TIKEUT → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG TIKEUT    # →ᆯᆮ→
+316A ; 1105 1103 ;     MA      # ( ㅪ → ᄅᄃ ) HANGUL LETTER RIEUL-TIKEUT → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG TIKEUT       # →ᇎ→→ᆯᆮ→
+
+A967 ; 1105 1103 1103 ;        MA      # ( ꥧ → ᄅᄃᄃ ) HANGUL CHOSEONG RIEUL-SSANGTIKEUT → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG TIKEUT     # 
+
+11CF ; 1105 1103 1112 ;        MA      # ( ᇏ → ᄅᄃᄒ ) HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG TIKEUT, HANGUL CHOSEONG HIEUH    # →ᆯᆮᇂ→
+
+1119 ; 1105 1105 ;     MA      # ( ᄙ → ᄅᄅ ) HANGUL CHOSEONG SSANGRIEUL → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG RIEUL        # 
+11D0 ; 1105 1105 ;     MA      # ( ᇐ → ᄅᄅ ) HANGUL JONGSEONG SSANGRIEUL → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG RIEUL       # →ᄙ→
+
+D7D7 ; 1105 1105 110F ;        MA      # ( ퟗ → ᄅᄅᄏ ) HANGUL JONGSEONG SSANGRIEUL-KHIEUKH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KHIEUKH   # →ᆯᆯᆿ→
+
+A968 ; 1105 1106 ;     MA      # ( ꥨ → ᄅᄆ ) HANGUL CHOSEONG RIEUL-MIEUM → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG MIEUM       # 
+11B1 ; 1105 1106 ;     MA      # ( ᆱ → ᄅᄆ ) HANGUL JONGSEONG RIEUL-MIEUM → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG MIEUM      # →ᆯᆷ→
+313B ; 1105 1106 ;     MA      # ( ㄻ → ᄅᄆ ) HANGUL LETTER RIEUL-MIEUM → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG MIEUM # →ᆱ→→ᆯᆷ→
+
+11D1 ; 1105 1106 1100 ;        MA      # ( ᇑ → ᄅᄆᄀ ) HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG KIYEOK    # →ᆯᆷᆨ→
+
+11D2 ; 1105 1106 1109 ;        MA      # ( ᇒ → ᄅᄆᄉ ) HANGUL JONGSEONG RIEUL-MIEUM-SIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG SIOS        # →ᆯᆷᆺ→
+
+D7D8 ; 1105 1106 1112 ;        MA      # ( ퟘ → ᄅᄆᄒ ) HANGUL JONGSEONG RIEUL-MIEUM-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG HIEUH      # →ᆯᆷᇂ→
+
+A969 ; 1105 1107 ;     MA      # ( ꥩ → ᄅᄇ ) HANGUL CHOSEONG RIEUL-PIEUP → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP       # 
+11B2 ; 1105 1107 ;     MA      # ( ᆲ → ᄅᄇ ) HANGUL JONGSEONG RIEUL-PIEUP → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP      # →ᆯᆸ→
+313C ; 1105 1107 ;     MA      # ( ㄼ → ᄅᄇ ) HANGUL LETTER RIEUL-PIEUP → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP # →ᆲ→→ᆯᆸ→
+
+D7D9 ; 1105 1107 1103 ;        MA      # ( ퟙ → ᄅᄇᄃ ) HANGUL JONGSEONG RIEUL-PIEUP-TIKEUT → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG TIKEUT    # →ᆯᆸᆮ→
+
+A96A ; 1105 1107 1107 ;        MA      # ( ꥪ → ᄅᄇᄇ ) HANGUL CHOSEONG RIEUL-SSANGPIEUP → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PIEUP        # 
+
+11D3 ; 1105 1107 1109 ;        MA      # ( ᇓ → ᄅᄇᄉ ) HANGUL JONGSEONG RIEUL-PIEUP-SIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS        # →ᆯᆸᆺ→
+316B ; 1105 1107 1109 ;        MA      # ( ㅫ → ᄅᄇᄉ ) HANGUL LETTER RIEUL-PIEUP-SIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS   # →ᇓ→→ᆯᆸᆺ→
+
+A96B ; 1105 1107 110B ;        MA      # ( ꥫ → ᄅᄇᄋ ) HANGUL CHOSEONG RIEUL-KAPYEOUNPIEUP → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG     # 
+11D5 ; 1105 1107 110B ;        MA      # ( ᇕ → ᄅᄇᄋ ) HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG    # →ᆯᆸᆼ→
+
+D7DA ; 1105 1107 1111 ;        MA      # ( ퟚ → ᄅᄇᄑ ) HANGUL JONGSEONG RIEUL-PIEUP-PHIEUPH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PHIEUPH  # →ᆯᆸᇁ→
+
+11D4 ; 1105 1107 1112 ;        MA      # ( ᇔ → ᄅᄇᄒ ) HANGUL JONGSEONG RIEUL-PIEUP-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG HIEUH      # →ᆯᆸᇂ→
+
+A96C ; 1105 1109 ;     MA      # ( ꥬ → ᄅᄉ ) HANGUL CHOSEONG RIEUL-SIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG SIOS # 
+11B3 ; 1105 1109 ;     MA      # ( ᆳ → ᄅᄉ ) HANGUL JONGSEONG RIEUL-SIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG SIOS        # →ᆯᆺ→
+313D ; 1105 1109 ;     MA      # ( ㄽ → ᄅᄉ ) HANGUL LETTER RIEUL-SIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG SIOS   # →ᆳ→→ᆯᆺ→
+
+11D6 ; 1105 1109 1109 ;        MA      # ( ᇖ → ᄅᄉᄉ ) HANGUL JONGSEONG RIEUL-SSANGSIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS  # →ᆯᆺᆺ→
+
+111B ; 1105 110B ;     MA      # ( ᄛ → ᄅᄋ ) HANGUL CHOSEONG KAPYEOUNRIEUL → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG IEUNG     # 
+D7DD ; 1105 110B ;     MA      # ( ퟝ → ᄅᄋ ) HANGUL JONGSEONG KAPYEOUNRIEUL → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG IEUNG    # →ᆯᆼ→
+
+A96D ; 1105 110C ;     MA      # ( ꥭ → ᄅᄌ ) HANGUL CHOSEONG RIEUL-CIEUC → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG CIEUC       # 
+
+A96E ; 1105 110F ;     MA      # ( ꥮ → ᄅᄏ ) HANGUL CHOSEONG RIEUL-KHIEUKH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KHIEUKH   # 
+11D8 ; 1105 110F ;     MA      # ( ᇘ → ᄅᄏ ) HANGUL JONGSEONG RIEUL-KHIEUKH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG KHIEUKH  # →ᆯᆿ→
+
+11B4 ; 1105 1110 ;     MA      # ( ᆴ → ᄅᄐ ) HANGUL JONGSEONG RIEUL-THIEUTH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG THIEUTH  # →ᆯᇀ→
+313E ; 1105 1110 ;     MA      # ( ㄾ → ᄅᄐ ) HANGUL LETTER RIEUL-THIEUTH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG THIEUTH     # →ᆴ→→ᆯᇀ→
+
+11B5 ; 1105 1111 ;     MA      # ( ᆵ → ᄅᄑ ) HANGUL JONGSEONG RIEUL-PHIEUPH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PHIEUPH  # →ᆯᇁ→
+313F ; 1105 1111 ;     MA      # ( ㄿ → ᄅᄑ ) HANGUL LETTER RIEUL-PHIEUPH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PHIEUPH     # →ᆵ→→ᆯᇁ→
+
+111A ; 1105 1112 ;     MA      # ( ᄚ → ᄅᄒ ) HANGUL CHOSEONG RIEUL-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG HIEUH       # 
+3140 ; 1105 1112 ;     MA      # ( ㅀ → ᄅᄒ ) HANGUL LETTER RIEUL-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG HIEUH # →ᄚ→
+113B ; 1105 1112 ;     MA      # ( ᄻ → ᄅᄒ ) HANGUL CHOSEONG SIOS-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG HIEUH        # →ᄚ→
+11B6 ; 1105 1112 ;     MA      # ( ᆶ → ᄅᄒ ) HANGUL JONGSEONG RIEUL-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG HIEUH      # →ᄚ→
+D7F2 ; 1105 1112 ;     MA      # ( ퟲ → ᄅᄒ ) HANGUL JONGSEONG SIOS-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG HIEUH       # →ᆺᇂ→→ᄉᄒ→→ᄻ→→ᄚ→
+
+11D7 ; 1105 1140 ;     MA      # ( ᇗ → ᄅᅀ ) HANGUL JONGSEONG RIEUL-PANSIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PANSIOS  # →ᆯᇫ→
+316C ; 1105 1140 ;     MA      # ( ㅬ → ᄅᅀ ) HANGUL LETTER RIEUL-PANSIOS → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PANSIOS     # →ᇗ→→ᆯᇫ→
+
+D7DB ; 1105 114C ;     MA      # ( ퟛ → ᄅᅌ ) HANGUL JONGSEONG RIEUL-YESIEUNG → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG YESIEUNG        # →ᆯᇰ→
+
+11D9 ; 1105 1159 ;     MA      # ( ᇙ → ᄅᅙ ) HANGUL JONGSEONG RIEUL-YEORINHIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG YEORINHIEUH  # →ᆯᇹ→
+316D ; 1105 1159 ;     MA      # ( ㅭ → ᄅᅙ ) HANGUL LETTER RIEUL-YEORINHIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG YEORINHIEUH     # →ᇙ→→ᆯᇹ→
+
+D7DC ; 1105 1159 1112 ;        MA      # ( ퟜ → ᄅᅙᄒ ) HANGUL JONGSEONG RIEUL-YEORINHIEUH-HIEUH → HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG YEORINHIEUH, HANGUL CHOSEONG HIEUH  # →ᆯᇹᇂ→
+
+3141 ; 1106 ;  MA      # ( ㅁ → ᄆ ) HANGUL LETTER MIEUM → HANGUL CHOSEONG MIEUM # 
+11B7 ; 1106 ;  MA      # ( ᆷ → ᄆ ) HANGUL JONGSEONG MIEUM → HANGUL CHOSEONG MIEUM      # 
+
+A96F ; 1106 1100 ;     MA      # ( ꥯ → ᄆᄀ ) HANGUL CHOSEONG MIEUM-KIYEOK → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG KIYEOK     # 
+11DA ; 1106 1100 ;     MA      # ( ᇚ → ᄆᄀ ) HANGUL JONGSEONG MIEUM-KIYEOK → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG KIYEOK    # →ᆷᆨ→
+
+D7DE ; 1106 1102 ;     MA      # ( ퟞ → ᄆᄂ ) HANGUL JONGSEONG MIEUM-NIEUN → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG NIEUN      # →ᆷᆫ→
+
+D7DF ; 1106 1102 1102 ;        MA      # ( ퟟ → ᄆᄂᄂ ) HANGUL JONGSEONG MIEUM-SSANGNIEUN → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG NIEUN, HANGUL CHOSEONG NIEUN       # →ᆷᆫᆫ→
+
+A970 ; 1106 1103 ;     MA      # ( ꥰ → ᄆᄃ ) HANGUL CHOSEONG MIEUM-TIKEUT → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG TIKEUT     # 
+
+11DB ; 1106 1105 ;     MA      # ( ᇛ → ᄆᄅ ) HANGUL JONGSEONG MIEUM-RIEUL → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG RIEUL      # →ᆷᆯ→
+
+D7E0 ; 1106 1106 ;     MA      # ( ퟠ → ᄆᄆ ) HANGUL JONGSEONG SSANGMIEUM → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG MIEUM       # →ᆷᆷ→
+
+111C ; 1106 1107 ;     MA      # ( ᄜ → ᄆᄇ ) HANGUL CHOSEONG MIEUM-PIEUP → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG PIEUP       # 
+316E ; 1106 1107 ;     MA      # ( ㅮ → ᄆᄇ ) HANGUL LETTER MIEUM-PIEUP → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG PIEUP # →ᄜ→
+11DC ; 1106 1107 ;     MA      # ( ᇜ → ᄆᄇ ) HANGUL JONGSEONG MIEUM-PIEUP → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG PIEUP      # →ᄜ→
+
+D7E1 ; 1106 1107 1109 ;        MA      # ( ퟡ → ᄆᄇᄉ ) HANGUL JONGSEONG MIEUM-PIEUP-SIOS → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS        # →ᆷᆸᆺ→
+
+A971 ; 1106 1109 ;     MA      # ( ꥱ → ᄆᄉ ) HANGUL CHOSEONG MIEUM-SIOS → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG SIOS # 
+11DD ; 1106 1109 ;     MA      # ( ᇝ → ᄆᄉ ) HANGUL JONGSEONG MIEUM-SIOS → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG SIOS        # →ᆷᆺ→
+316F ; 1106 1109 ;     MA      # ( ㅯ → ᄆᄉ ) HANGUL LETTER MIEUM-SIOS → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG SIOS   # →ᇝ→→ᆷᆺ→
+
+11DE ; 1106 1109 1109 ;        MA      # ( ᇞ → ᄆᄉᄉ ) HANGUL JONGSEONG MIEUM-SSANGSIOS → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS  # →ᆷᆺᆺ→
+
+111D ; 1106 110B ;     MA      # ( ᄝ → ᄆᄋ ) HANGUL CHOSEONG KAPYEOUNMIEUM → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG IEUNG     # 
+3171 ; 1106 110B ;     MA      # ( ㅱ → ᄆᄋ ) HANGUL LETTER KAPYEOUNMIEUM → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG IEUNG       # →ᄝ→
+11E2 ; 1106 110B ;     MA      # ( ᇢ → ᄆᄋ ) HANGUL JONGSEONG KAPYEOUNMIEUM → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG IEUNG    # →ᄝ→
+
+D7E2 ; 1106 110C ;     MA      # ( ퟢ → ᄆᄌ ) HANGUL JONGSEONG MIEUM-CIEUC → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG CIEUC      # →ᆷᆽ→
+
+11E0 ; 1106 110E ;     MA      # ( ᇠ → ᄆᄎ ) HANGUL JONGSEONG MIEUM-CHIEUCH → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG CHIEUCH  # →ᆷᆾ→
+
+11E1 ; 1106 1112 ;     MA      # ( ᇡ → ᄆᄒ ) HANGUL JONGSEONG MIEUM-HIEUH → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG HIEUH      # →ᆷᇂ→
+
+11DF ; 1106 1140 ;     MA      # ( ᇟ → ᄆᅀ ) HANGUL JONGSEONG MIEUM-PANSIOS → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG PANSIOS  # →ᆷᇫ→
+3170 ; 1106 1140 ;     MA      # ( ㅰ → ᄆᅀ ) HANGUL LETTER MIEUM-PANSIOS → HANGUL CHOSEONG MIEUM, HANGUL CHOSEONG PANSIOS     # →ᇟ→→ᆷᇫ→
+
+3142 ; 1107 ;  MA      # ( ㅂ → ᄇ ) HANGUL LETTER PIEUP → HANGUL CHOSEONG PIEUP # 
+11B8 ; 1107 ;  MA      # ( ᆸ → ᄇ ) HANGUL JONGSEONG PIEUP → HANGUL CHOSEONG PIEUP      # 
+
+111E ; 1107 1100 ;     MA      # ( ᄞ → ᄇᄀ ) HANGUL CHOSEONG PIEUP-KIYEOK → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG KIYEOK     # 
+3172 ; 1107 1100 ;     MA      # ( ㅲ → ᄇᄀ ) HANGUL LETTER PIEUP-KIYEOK → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG KIYEOK       # →ᄞ→
+
+111F ; 1107 1102 ;     MA      # ( ᄟ → ᄇᄂ ) HANGUL CHOSEONG PIEUP-NIEUN → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG NIEUN       # 
+
+1120 ; 1107 1103 ;     MA      # ( ᄠ → ᄇᄃ ) HANGUL CHOSEONG PIEUP-TIKEUT → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG TIKEUT     # 
+3173 ; 1107 1103 ;     MA      # ( ㅳ → ᄇᄃ ) HANGUL LETTER PIEUP-TIKEUT → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG TIKEUT       # →ᄠ→
+D7E3 ; 1107 1103 ;     MA      # ( ퟣ → ᄇᄃ ) HANGUL JONGSEONG PIEUP-TIKEUT → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG TIKEUT    # →ᆸᆮ→
+
+11E3 ; 1107 1105 ;     MA      # ( ᇣ → ᄇᄅ ) HANGUL JONGSEONG PIEUP-RIEUL → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG RIEUL      # →ᆸᆯ→
+
+D7E4 ; 1107 1105 1111 ;        MA      # ( ퟤ → ᄇᄅᄑ ) HANGUL JONGSEONG PIEUP-RIEUL-PHIEUPH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG RIEUL, HANGUL CHOSEONG PHIEUPH  # →ᆸᆯᇁ→
+
+D7E5 ; 1107 1106 ;     MA      # ( ퟥ → ᄇᄆ ) HANGUL JONGSEONG PIEUP-MIEUM → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG MIEUM      # →ᆸᆷ→
+
+1108 ; 1107 1107 ;     MA      # ( ᄈ → ᄇᄇ ) HANGUL CHOSEONG SSANGPIEUP → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PIEUP        # 
+3143 ; 1107 1107 ;     MA      # ( ㅃ → ᄇᄇ ) HANGUL LETTER SSANGPIEUP → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PIEUP  # →ᄈ→
+D7E6 ; 1107 1107 ;     MA      # ( ퟦ → ᄇᄇ ) HANGUL JONGSEONG SSANGPIEUP → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PIEUP       # →ᆸᆸ→
+
+112C ; 1107 1107 110B ;        MA      # ( ᄬ → ᄇᄇᄋ ) HANGUL CHOSEONG KAPYEOUNSSANGPIEUP → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG      # 
+3179 ; 1107 1107 110B ;        MA      # ( ㅹ → ᄇᄇᄋ ) HANGUL LETTER KAPYEOUNSSANGPIEUP → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG        # →ᄬ→
+
+1121 ; 1107 1109 ;     MA      # ( ᄡ → ᄇᄉ ) HANGUL CHOSEONG PIEUP-SIOS → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS # 
+3144 ; 1107 1109 ;     MA      # ( ㅄ → ᄇᄉ ) HANGUL LETTER PIEUP-SIOS → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS   # →ᄡ→
+11B9 ; 1107 1109 ;     MA      # ( ᆹ → ᄇᄉ ) HANGUL JONGSEONG PIEUP-SIOS → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS        # →ᄡ→
+
+1122 ; 1107 1109 1100 ;        MA      # ( ᄢ → ᄇᄉᄀ ) HANGUL CHOSEONG PIEUP-SIOS-KIYEOK → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK       # 
+3174 ; 1107 1109 1100 ;        MA      # ( ㅴ → ᄇᄉᄀ ) HANGUL LETTER PIEUP-SIOS-KIYEOK → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK # →ᄢ→
+
+1123 ; 1107 1109 1103 ;        MA      # ( ᄣ → ᄇᄉᄃ ) HANGUL CHOSEONG PIEUP-SIOS-TIKEUT → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG TIKEUT       # 
+3175 ; 1107 1109 1103 ;        MA      # ( ㅵ → ᄇᄉᄃ ) HANGUL LETTER PIEUP-SIOS-TIKEUT → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG TIKEUT # →ᄣ→
+D7E7 ; 1107 1109 1103 ;        MA      # ( ퟧ → ᄇᄉᄃ ) HANGUL JONGSEONG PIEUP-SIOS-TIKEUT → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG TIKEUT      # →ᆸᆺᆮ→
+
+1124 ; 1107 1109 1107 ;        MA      # ( ᄤ → ᄇᄉᄇ ) HANGUL CHOSEONG PIEUP-SIOS-PIEUP → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PIEUP # 
+
+1125 ; 1107 1109 1109 ;        MA      # ( ᄥ → ᄇᄉᄉ ) HANGUL CHOSEONG PIEUP-SSANGSIOS → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS   # 
+
+1126 ; 1107 1109 110C ;        MA      # ( ᄦ → ᄇᄉᄌ ) HANGUL CHOSEONG PIEUP-SIOS-CIEUC → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG CIEUC # 
+
+A972 ; 1107 1109 1110 ;        MA      # ( ꥲ → ᄇᄉᄐ ) HANGUL CHOSEONG PIEUP-SIOS-THIEUTH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG THIEUTH     # 
+
+112B ; 1107 110B ;     MA      # ( ᄫ → ᄇᄋ ) HANGUL CHOSEONG KAPYEOUNPIEUP → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG     # 
+3178 ; 1107 110B ;     MA      # ( ㅸ → ᄇᄋ ) HANGUL LETTER KAPYEOUNPIEUP → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG       # →ᄫ→
+11E6 ; 1107 110B ;     MA      # ( ᇦ → ᄇᄋ ) HANGUL JONGSEONG KAPYEOUNPIEUP → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG    # →ᄫ→
+
+1127 ; 1107 110C ;     MA      # ( ᄧ → ᄇᄌ ) HANGUL CHOSEONG PIEUP-CIEUC → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG CIEUC       # 
+3176 ; 1107 110C ;     MA      # ( ㅶ → ᄇᄌ ) HANGUL LETTER PIEUP-CIEUC → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG CIEUC # →ᄧ→
+D7E8 ; 1107 110C ;     MA      # ( ퟨ → ᄇᄌ ) HANGUL JONGSEONG PIEUP-CIEUC → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG CIEUC      # →ᆸᆽ→
+
+1128 ; 1107 110E ;     MA      # ( ᄨ → ᄇᄎ ) HANGUL CHOSEONG PIEUP-CHIEUCH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG CHIEUCH   # 
+D7E9 ; 1107 110E ;     MA      # ( ퟩ → ᄇᄎ ) HANGUL JONGSEONG PIEUP-CHIEUCH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG CHIEUCH  # →ᆸᆾ→
+
+A973 ; 1107 110F ;     MA      # ( ꥳ → ᄇᄏ ) HANGUL CHOSEONG PIEUP-KHIEUKH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG KHIEUKH   # 
+
+1129 ; 1107 1110 ;     MA      # ( ᄩ → ᄇᄐ ) HANGUL CHOSEONG PIEUP-THIEUTH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG THIEUTH   # 
+3177 ; 1107 1110 ;     MA      # ( ㅷ → ᄇᄐ ) HANGUL LETTER PIEUP-THIEUTH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG THIEUTH     # →ᄩ→
+
+112A ; 1107 1111 ;     MA      # ( ᄪ → ᄇᄑ ) HANGUL CHOSEONG PIEUP-PHIEUPH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PHIEUPH   # 
+11E4 ; 1107 1111 ;     MA      # ( ᇤ → ᄇᄑ ) HANGUL JONGSEONG PIEUP-PHIEUPH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PHIEUPH  # →ᆸᇁ→
+
+A974 ; 1107 1112 ;     MA      # ( ꥴ → ᄇᄒ ) HANGUL CHOSEONG PIEUP-HIEUH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG HIEUH       # 
+11E5 ; 1107 1112 ;     MA      # ( ᇥ → ᄇᄒ ) HANGUL JONGSEONG PIEUP-HIEUH → HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG HIEUH      # →ᆸᇂ→
+
+3145 ; 1109 ;  MA      # ( ㅅ → ᄉ ) HANGUL LETTER SIOS → HANGUL CHOSEONG SIOS   # 
+11BA ; 1109 ;  MA      # ( ᆺ → ᄉ ) HANGUL JONGSEONG SIOS → HANGUL CHOSEONG SIOS        # 
+
+112D ; 1109 1100 ;     MA      # ( ᄭ → ᄉᄀ ) HANGUL CHOSEONG SIOS-KIYEOK → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK       # 
+317A ; 1109 1100 ;     MA      # ( ㅺ → ᄉᄀ ) HANGUL LETTER SIOS-KIYEOK → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK # →ᄭ→
+11E7 ; 1109 1100 ;     MA      # ( ᇧ → ᄉᄀ ) HANGUL JONGSEONG SIOS-KIYEOK → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK      # →ᄭ→
+
+112E ; 1109 1102 ;     MA      # ( ᄮ → ᄉᄂ ) HANGUL CHOSEONG SIOS-NIEUN → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG NIEUN # 
+317B ; 1109 1102 ;     MA      # ( ㅻ → ᄉᄂ ) HANGUL LETTER SIOS-NIEUN → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG NIEUN   # →ᄮ→
+
+112F ; 1109 1103 ;     MA      # ( ᄯ → ᄉᄃ ) HANGUL CHOSEONG SIOS-TIKEUT → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG TIKEUT       # 
+317C ; 1109 1103 ;     MA      # ( ㅼ → ᄉᄃ ) HANGUL LETTER SIOS-TIKEUT → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG TIKEUT # →ᄯ→
+11E8 ; 1109 1103 ;     MA      # ( ᇨ → ᄉᄃ ) HANGUL JONGSEONG SIOS-TIKEUT → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG TIKEUT      # →ᄯ→
+
+1130 ; 1109 1105 ;     MA      # ( ᄰ → ᄉᄅ ) HANGUL CHOSEONG SIOS-RIEUL → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG RIEUL # 
+11E9 ; 1109 1105 ;     MA      # ( ᇩ → ᄉᄅ ) HANGUL JONGSEONG SIOS-RIEUL → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG RIEUL        # →ᄰ→
+
+1131 ; 1109 1106 ;     MA      # ( ᄱ → ᄉᄆ ) HANGUL CHOSEONG SIOS-MIEUM → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG MIEUM # 
+D7EA ; 1109 1106 ;     MA      # ( ퟪ → ᄉᄆ ) HANGUL JONGSEONG SIOS-MIEUM → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG MIEUM        # →ᆺᆷ→
+
+1132 ; 1109 1107 ;     MA      # ( ᄲ → ᄉᄇ ) HANGUL CHOSEONG SIOS-PIEUP → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PIEUP # 
+317D ; 1109 1107 ;     MA      # ( ㅽ → ᄉᄇ ) HANGUL LETTER SIOS-PIEUP → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PIEUP   # →ᄲ→
+11EA ; 1109 1107 ;     MA      # ( ᇪ → ᄉᄇ ) HANGUL JONGSEONG SIOS-PIEUP → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PIEUP        # →ᄲ→
+
+1133 ; 1109 1107 1100 ;        MA      # ( ᄳ → ᄉᄇᄀ ) HANGUL CHOSEONG SIOS-PIEUP-KIYEOK → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG KIYEOK       # 
+
+D7EB ; 1109 1107 110B ;        MA      # ( ퟫ → ᄉᄇᄋ ) HANGUL JONGSEONG SIOS-KAPYEOUNPIEUP → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG      # →ᆺᆸᆼ→
+
+110A ; 1109 1109 ;     MA      # ( ᄊ → ᄉᄉ ) HANGUL CHOSEONG SSANGSIOS → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS   # 
+3146 ; 1109 1109 ;     MA      # ( ㅆ → ᄉᄉ ) HANGUL LETTER SSANGSIOS → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS     # →ᄊ→
+11BB ; 1109 1109 ;     MA      # ( ᆻ → ᄉᄉ ) HANGUL JONGSEONG SSANGSIOS → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS  # →ᄊ→
+
+D7EC ; 1109 1109 1100 ;        MA      # ( ퟬ → ᄉᄉᄀ ) HANGUL JONGSEONG SSANGSIOS-KIYEOK → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KIYEOK        # →ᆺᆺᆨ→
+
+D7ED ; 1109 1109 1103 ;        MA      # ( ퟭ → ᄉᄉᄃ ) HANGUL JONGSEONG SSANGSIOS-TIKEUT → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG TIKEUT        # →ᆺᆺᆮ→
+
+A975 ; 1109 1109 1107 ;        MA      # ( ꥵ → ᄉᄉᄇ ) HANGUL CHOSEONG SSANGSIOS-PIEUP → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PIEUP   # 
+
+1134 ; 1109 1109 1109 ;        MA      # ( ᄴ → ᄉᄉᄉ ) HANGUL CHOSEONG SIOS-SSANGSIOS → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS, HANGUL CHOSEONG SIOS     # 
+
+1135 ; 1109 110B ;     MA      # ( ᄵ → ᄉᄋ ) HANGUL CHOSEONG SIOS-IEUNG → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG IEUNG # 
+
+1136 ; 1109 110C ;     MA      # ( ᄶ → ᄉᄌ ) HANGUL CHOSEONG SIOS-CIEUC → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG CIEUC # 
+317E ; 1109 110C ;     MA      # ( ㅾ → ᄉᄌ ) HANGUL LETTER SIOS-CIEUC → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG CIEUC   # →ᄶ→
+D7EF ; 1109 110C ;     MA      # ( ퟯ → ᄉᄌ ) HANGUL JONGSEONG SIOS-CIEUC → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG CIEUC        # →ᆺᆽ→
+
+1137 ; 1109 110E ;     MA      # ( ᄷ → ᄉᄎ ) HANGUL CHOSEONG SIOS-CHIEUCH → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG CHIEUCH     # 
+D7F0 ; 1109 110E ;     MA      # ( ퟰ → ᄉᄎ ) HANGUL JONGSEONG SIOS-CHIEUCH → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG CHIEUCH    # →ᆺᆾ→
+
+1138 ; 1109 110F ;     MA      # ( ᄸ → ᄉᄏ ) HANGUL CHOSEONG SIOS-KHIEUKH → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG KHIEUKH     # 
+
+1139 ; 1109 1110 ;     MA      # ( ᄹ → ᄉᄐ ) HANGUL CHOSEONG SIOS-THIEUTH → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG THIEUTH     # 
+D7F1 ; 1109 1110 ;     MA      # ( ퟱ → ᄉᄐ ) HANGUL JONGSEONG SIOS-THIEUTH → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG THIEUTH    # →ᆺᇀ→
+
+113A ; 1109 1111 ;     MA      # ( ᄺ → ᄉᄑ ) HANGUL CHOSEONG SIOS-PHIEUPH → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PHIEUPH     # 
+
+D7EE ; 1109 1140 ;     MA      # ( ퟮ → ᄉᅀ ) HANGUL JONGSEONG SIOS-PANSIOS → HANGUL CHOSEONG SIOS, HANGUL CHOSEONG PANSIOS    # →ᆺᇫ→
+
+3147 ; 110B ;  MA      # ( ㅇ → ᄋ ) HANGUL LETTER IEUNG → HANGUL CHOSEONG IEUNG # 
+11BC ; 110B ;  MA      # ( ᆼ → ᄋ ) HANGUL JONGSEONG IEUNG → HANGUL CHOSEONG IEUNG      # 
+
+1141 ; 110B 1100 ;     MA      # ( ᅁ → ᄋᄀ ) HANGUL CHOSEONG IEUNG-KIYEOK → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG KIYEOK     # 
+11EC ; 110B 1100 ;     MA      # ( ᇬ → ᄋᄀ ) HANGUL JONGSEONG IEUNG-KIYEOK → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG KIYEOK    # →ᅁ→
+
+11ED ; 110B 1100 1100 ;        MA      # ( ᇭ → ᄋᄀᄀ ) HANGUL JONGSEONG IEUNG-SSANGKIYEOK → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG KIYEOK, HANGUL CHOSEONG KIYEOK    # →ᆼᆨᆨ→
+
+1142 ; 110B 1103 ;     MA      # ( ᅂ → ᄋᄃ ) HANGUL CHOSEONG IEUNG-TIKEUT → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG TIKEUT     # 
+
+A976 ; 110B 1105 ;     MA      # ( ꥶ → ᄋᄅ ) HANGUL CHOSEONG IEUNG-RIEUL → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG RIEUL       # 
+
+1143 ; 110B 1106 ;     MA      # ( ᅃ → ᄋᄆ ) HANGUL CHOSEONG IEUNG-MIEUM → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG MIEUM       # 
+
+1144 ; 110B 1107 ;     MA      # ( ᅄ → ᄋᄇ ) HANGUL CHOSEONG IEUNG-PIEUP → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG PIEUP       # 
+
+1145 ; 110B 1109 ;     MA      # ( ᅅ → ᄋᄉ ) HANGUL CHOSEONG IEUNG-SIOS → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG SIOS # 
+11F1 ; 110B 1109 ;     MA      # ( ᇱ → ᄋᄉ ) HANGUL JONGSEONG YESIEUNG-SIOS → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG SIOS     # →ᅅ→
+3182 ; 110B 1109 ;     MA      # ( ㆂ → ᄋᄉ ) HANGUL LETTER YESIEUNG-SIOS → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG SIOS        # →ᇱ→→ᅅ→
+
+1147 ; 110B 110B ;     MA      # ( ᅇ → ᄋᄋ ) HANGUL CHOSEONG SSANGIEUNG → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG IEUNG        # 
+3180 ; 110B 110B ;     MA      # ( ㆀ → ᄋᄋ ) HANGUL LETTER SSANGIEUNG → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG IEUNG  # →ᅇ→
+11EE ; 110B 110B ;     MA      # ( ᇮ → ᄋᄋ ) HANGUL JONGSEONG SSANGIEUNG → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG IEUNG       # →ᅇ→
+
+1148 ; 110B 110C ;     MA      # ( ᅈ → ᄋᄌ ) HANGUL CHOSEONG IEUNG-CIEUC → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG CIEUC       # 
+
+1149 ; 110B 110E ;     MA      # ( ᅉ → ᄋᄎ ) HANGUL CHOSEONG IEUNG-CHIEUCH → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG CHIEUCH   # 
+
+11EF ; 110B 110F ;     MA      # ( ᇯ → ᄋᄏ ) HANGUL JONGSEONG IEUNG-KHIEUKH → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG KHIEUKH  # →ᆼᆿ→
+
+114A ; 110B 1110 ;     MA      # ( ᅊ → ᄋᄐ ) HANGUL CHOSEONG IEUNG-THIEUTH → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG THIEUTH   # 
+
+114B ; 110B 1111 ;     MA      # ( ᅋ → ᄋᄑ ) HANGUL CHOSEONG IEUNG-PHIEUPH → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG PHIEUPH   # 
+
+A977 ; 110B 1112 ;     MA      # ( ꥷ → ᄋᄒ ) HANGUL CHOSEONG IEUNG-HIEUH → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG HIEUH       # 
+
+1146 ; 110B 1140 ;     MA      # ( ᅆ → ᄋᅀ ) HANGUL CHOSEONG IEUNG-PANSIOS → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG PANSIOS   # 
+11F2 ; 110B 1140 ;     MA      # ( ᇲ → ᄋᅀ ) HANGUL JONGSEONG YESIEUNG-PANSIOS → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG PANSIOS       # →ᅆ→
+3183 ; 110B 1140 ;     MA      # ( ㆃ → ᄋᅀ ) HANGUL LETTER YESIEUNG-PANSIOS → HANGUL CHOSEONG IEUNG, HANGUL CHOSEONG PANSIOS  # →ᇲ→→ᅆ→
+
+3148 ; 110C ;  MA      # ( ㅈ → ᄌ ) HANGUL LETTER CIEUC → HANGUL CHOSEONG CIEUC # 
+11BD ; 110C ;  MA      # ( ᆽ → ᄌ ) HANGUL JONGSEONG CIEUC → HANGUL CHOSEONG CIEUC      # 
+
+D7F7 ; 110C 1107 ;     MA      # ( ퟷ → ᄌᄇ ) HANGUL JONGSEONG CIEUC-PIEUP → HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG PIEUP      # →ᆽᆸ→
+
+D7F8 ; 110C 1107 1107 ;        MA      # ( ퟸ → ᄌᄇᄇ ) HANGUL JONGSEONG CIEUC-SSANGPIEUP → HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG PIEUP       # →ᆽᆸᆸ→
+
+114D ; 110C 110B ;     MA      # ( ᅍ → ᄌᄋ ) HANGUL CHOSEONG CIEUC-IEUNG → HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG IEUNG       # 
+
+110D ; 110C 110C ;     MA      # ( ᄍ → ᄌᄌ ) HANGUL CHOSEONG SSANGCIEUC → HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG CIEUC        # 
+3149 ; 110C 110C ;     MA      # ( ㅉ → ᄌᄌ ) HANGUL LETTER SSANGCIEUC → HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG CIEUC  # →ᄍ→
+D7F9 ; 110C 110C ;     MA      # ( ퟹ → ᄌᄌ ) HANGUL JONGSEONG SSANGCIEUC → HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG CIEUC       # →ᆽᆽ→
+
+A978 ; 110C 110C 1112 ;        MA      # ( ꥸ → ᄌᄌᄒ ) HANGUL CHOSEONG SSANGCIEUC-HIEUH → HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG CIEUC, HANGUL CHOSEONG HIEUH        # 
+
+314A ; 110E ;  MA      # ( ㅊ → ᄎ ) HANGUL LETTER CHIEUCH → HANGUL CHOSEONG CHIEUCH     # 
+11BE ; 110E ;  MA      # ( ᆾ → ᄎ ) HANGUL JONGSEONG CHIEUCH → HANGUL CHOSEONG CHIEUCH  # 
+
+1152 ; 110E 110F ;     MA      # ( ᅒ → ᄎᄏ ) HANGUL CHOSEONG CHIEUCH-KHIEUKH → HANGUL CHOSEONG CHIEUCH, HANGUL CHOSEONG KHIEUKH       # 
+
+1153 ; 110E 1112 ;     MA      # ( ᅓ → ᄎᄒ ) HANGUL CHOSEONG CHIEUCH-HIEUH → HANGUL CHOSEONG CHIEUCH, HANGUL CHOSEONG HIEUH   # 
+
+314B ; 110F ;  MA      # ( ㅋ → ᄏ ) HANGUL LETTER KHIEUKH → HANGUL CHOSEONG KHIEUKH     # 
+11BF ; 110F ;  MA      # ( ᆿ → ᄏ ) HANGUL JONGSEONG KHIEUKH → HANGUL CHOSEONG KHIEUKH  # 
+
+314C ; 1110 ;  MA      # ( ㅌ → ᄐ ) HANGUL LETTER THIEUTH → HANGUL CHOSEONG THIEUTH     # 
+11C0 ; 1110 ;  MA      # ( ᇀ → ᄐ ) HANGUL JONGSEONG THIEUTH → HANGUL CHOSEONG THIEUTH  # 
+
+A979 ; 1110 1110 ;     MA      # ( ꥹ → ᄐᄐ ) HANGUL CHOSEONG SSANGTHIEUTH → HANGUL CHOSEONG THIEUTH, HANGUL CHOSEONG THIEUTH  # 
+
+314D ; 1111 ;  MA      # ( ㅍ → ᄑ ) HANGUL LETTER PHIEUPH → HANGUL CHOSEONG PHIEUPH     # 
+11C1 ; 1111 ;  MA      # ( ᇁ → ᄑ ) HANGUL JONGSEONG PHIEUPH → HANGUL CHOSEONG PHIEUPH  # 
+
+1156 ; 1111 1107 ;     MA      # ( ᅖ → ᄑᄇ ) HANGUL CHOSEONG PHIEUPH-PIEUP → HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG PIEUP   # 
+11F3 ; 1111 1107 ;     MA      # ( ᇳ → ᄑᄇ ) HANGUL JONGSEONG PHIEUPH-PIEUP → HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG PIEUP  # →ᅖ→
+
+D7FA ; 1111 1109 ;     MA      # ( ퟺ → ᄑᄉ ) HANGUL JONGSEONG PHIEUPH-SIOS → HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG SIOS    # →ᇁᆺ→
+
+1157 ; 1111 110B ;     MA      # ( ᅗ → ᄑᄋ ) HANGUL CHOSEONG KAPYEOUNPHIEUPH → HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG IEUNG # 
+3184 ; 1111 110B ;     MA      # ( ㆄ → ᄑᄋ ) HANGUL LETTER KAPYEOUNPHIEUPH → HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG IEUNG   # →ᅗ→
+11F4 ; 1111 110B ;     MA      # ( ᇴ → ᄑᄋ ) HANGUL JONGSEONG KAPYEOUNPHIEUPH → HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG IEUNG        # →ᅗ→
+
+D7FB ; 1111 1110 ;     MA      # ( ퟻ → ᄑᄐ ) HANGUL JONGSEONG PHIEUPH-THIEUTH → HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG THIEUTH      # →ᇁᇀ→
+
+A97A ; 1111 1112 ;     MA      # ( ꥺ → ᄑᄒ ) HANGUL CHOSEONG PHIEUPH-HIEUH → HANGUL CHOSEONG PHIEUPH, HANGUL CHOSEONG HIEUH   # 
+
+314E ; 1112 ;  MA      # ( ㅎ → ᄒ ) HANGUL LETTER HIEUH → HANGUL CHOSEONG HIEUH # 
+11C2 ; 1112 ;  MA      # ( ᇂ → ᄒ ) HANGUL JONGSEONG HIEUH → HANGUL CHOSEONG HIEUH      # 
+
+11F5 ; 1112 1102 ;     MA      # ( ᇵ → ᄒᄂ ) HANGUL JONGSEONG HIEUH-NIEUN → HANGUL CHOSEONG HIEUH, HANGUL CHOSEONG NIEUN      # →ᇂᆫ→
+
+11F6 ; 1112 1105 ;     MA      # ( ᇶ → ᄒᄅ ) HANGUL JONGSEONG HIEUH-RIEUL → HANGUL CHOSEONG HIEUH, HANGUL CHOSEONG RIEUL      # →ᇂᆯ→
+
+11F7 ; 1112 1106 ;     MA      # ( ᇷ → ᄒᄆ ) HANGUL JONGSEONG HIEUH-MIEUM → HANGUL CHOSEONG HIEUH, HANGUL CHOSEONG MIEUM      # →ᇂᆷ→
+
+11F8 ; 1112 1107 ;     MA      # ( ᇸ → ᄒᄇ ) HANGUL JONGSEONG HIEUH-PIEUP → HANGUL CHOSEONG HIEUH, HANGUL CHOSEONG PIEUP      # →ᇂᆸ→
+
+A97B ; 1112 1109 ;     MA      # ( ꥻ → ᄒᄉ ) HANGUL CHOSEONG HIEUH-SIOS → HANGUL CHOSEONG HIEUH, HANGUL CHOSEONG SIOS # 
+
+1158 ; 1112 1112 ;     MA      # ( ᅘ → ᄒᄒ ) HANGUL CHOSEONG SSANGHIEUH → HANGUL CHOSEONG HIEUH, HANGUL CHOSEONG HIEUH        # 
+3185 ; 1112 1112 ;     MA      # ( ㆅ → ᄒᄒ ) HANGUL LETTER SSANGHIEUH → HANGUL CHOSEONG HIEUH, HANGUL CHOSEONG HIEUH  # →ᅘ→
+
+113D ; 113C 113C ;     MA      # ( ᄽ → ᄼᄼ ) HANGUL CHOSEONG CHITUEUMSSANGSIOS → HANGUL CHOSEONG CHITUEUMSIOS, HANGUL CHOSEONG CHITUEUMSIOS   # 
+
+113F ; 113E 113E ;     MA      # ( ᄿ → ᄾᄾ ) HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS → HANGUL CHOSEONG CEONGCHIEUMSIOS, HANGUL CHOSEONG CEONGCHIEUMSIOS  # 
+
+317F ; 1140 ;  MA      # ( ㅿ → ᅀ ) HANGUL LETTER PANSIOS → HANGUL CHOSEONG PANSIOS     # 
+11EB ; 1140 ;  MA      # ( ᇫ → ᅀ ) HANGUL JONGSEONG PANSIOS → HANGUL CHOSEONG PANSIOS  # 
+
+D7F3 ; 1140 1107 ;     MA      # ( ퟳ → ᅀᄇ ) HANGUL JONGSEONG PANSIOS-PIEUP → HANGUL CHOSEONG PANSIOS, HANGUL CHOSEONG PIEUP  # →ᇫᆸ→
+
+D7F4 ; 1140 1107 110B ;        MA      # ( ퟴ → ᅀᄇᄋ ) HANGUL JONGSEONG PANSIOS-KAPYEOUNPIEUP → HANGUL CHOSEONG PANSIOS, HANGUL CHOSEONG PIEUP, HANGUL CHOSEONG IEUNG        # →ᇫᆸᆼ→
+
+3181 ; 114C ;  MA      # ( ㆁ → ᅌ ) HANGUL LETTER YESIEUNG → HANGUL CHOSEONG YESIEUNG   # 
+11F0 ; 114C ;  MA      # ( ᇰ → ᅌ ) HANGUL JONGSEONG YESIEUNG → HANGUL CHOSEONG YESIEUNG        # 
+
+D7F5 ; 114C 1106 ;     MA      # ( ퟵ → ᅌᄆ ) HANGUL JONGSEONG YESIEUNG-MIEUM → HANGUL CHOSEONG YESIEUNG, HANGUL CHOSEONG MIEUM        # →ᇰᆷ→
+
+D7F6 ; 114C 1112 ;     MA      # ( ퟶ → ᅌᄒ ) HANGUL JONGSEONG YESIEUNG-HIEUH → HANGUL CHOSEONG YESIEUNG, HANGUL CHOSEONG HIEUH        # →ᇰᇂ→
+
+114F ; 114E 114E ;     MA      # ( ᅏ → ᅎᅎ ) HANGUL CHOSEONG CHITUEUMSSANGCIEUC → HANGUL CHOSEONG CHITUEUMCIEUC, HANGUL CHOSEONG CHITUEUMCIEUC        # 
+
+1151 ; 1150 1150 ;     MA      # ( ᅑ → ᅐᅐ ) HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC → HANGUL CHOSEONG CEONGCHIEUMCIEUC, HANGUL CHOSEONG CEONGCHIEUMCIEUC       # 
+
+3186 ; 1159 ;  MA      # ( ㆆ → ᅙ ) HANGUL LETTER YEORINHIEUH → HANGUL CHOSEONG YEORINHIEUH     # 
+11F9 ; 1159 ;  MA      # ( ᇹ → ᅙ ) HANGUL JONGSEONG YEORINHIEUH → HANGUL CHOSEONG YEORINHIEUH  # 
+
+A97C ; 1159 1159 ;     MA      # ( ꥼ → ᅙᅙ ) HANGUL CHOSEONG SSANGYEORINHIEUH → HANGUL CHOSEONG YEORINHIEUH, HANGUL CHOSEONG YEORINHIEUH      # 
+
+3164 ; 1160 ;  MA      # (  →  ) HANGUL FILLER → HANGUL JUNGSEONG FILLER   # 
+
+314F ; 1161 ;  MA      # ( ㅏ → ᅡ ) HANGUL LETTER A → HANGUL JUNGSEONG A        # 
+
+1176 ; 1161 1169 ;     MA      # ( ᅶ → ᅡᅩ ) HANGUL JUNGSEONG A-O → HANGUL JUNGSEONG A, HANGUL JUNGSEONG O    # 
+
+1177 ; 1161 116E ;     MA      # ( ᅷ → ᅡᅮ ) HANGUL JUNGSEONG A-U → HANGUL JUNGSEONG A, HANGUL JUNGSEONG U    # 
+
+11A3 ; 1161 1173 ;     MA      # ( ᆣ → ᅡᅳ ) HANGUL JUNGSEONG A-EU → HANGUL JUNGSEONG A, HANGUL JUNGSEONG EU  # 
+
+1162 ; 1161 1175 ;     MA      # ( ᅢ → ᅡᅵ ) HANGUL JUNGSEONG AE → HANGUL JUNGSEONG A, HANGUL JUNGSEONG I     # 
+3150 ; 1161 1175 ;     MA      # ( ㅐ → ᅡᅵ ) HANGUL LETTER AE → HANGUL JUNGSEONG A, HANGUL JUNGSEONG I        # →ᅢ→
+
+3151 ; 1163 ;  MA      # ( ㅑ → ᅣ ) HANGUL LETTER YA → HANGUL JUNGSEONG YA      # 
+
+1178 ; 1163 1169 ;     MA      # ( ᅸ → ᅣᅩ ) HANGUL JUNGSEONG YA-O → HANGUL JUNGSEONG YA, HANGUL JUNGSEONG O  # 
+
+1179 ; 1163 116D ;     MA      # ( ᅹ → ᅣᅭ ) HANGUL JUNGSEONG YA-YO → HANGUL JUNGSEONG YA, HANGUL JUNGSEONG YO        # 
+
+11A4 ; 1163 116E ;     MA      # ( ᆤ → ᅣᅮ ) HANGUL JUNGSEONG YA-U → HANGUL JUNGSEONG YA, HANGUL JUNGSEONG U  # 
+
+1164 ; 1163 1175 ;     MA      # ( ᅤ → ᅣᅵ ) HANGUL JUNGSEONG YAE → HANGUL JUNGSEONG YA, HANGUL JUNGSEONG I   # 
+3152 ; 1163 1175 ;     MA      # ( ㅒ → ᅣᅵ ) HANGUL LETTER YAE → HANGUL JUNGSEONG YA, HANGUL JUNGSEONG I      # →ᅤ→
+
+3153 ; 1165 ;  MA      # ( ㅓ → ᅥ ) HANGUL LETTER EO → HANGUL JUNGSEONG EO      # 
+
+117A ; 1165 1169 ;     MA      # ( ᅺ → ᅥᅩ ) HANGUL JUNGSEONG EO-O → HANGUL JUNGSEONG EO, HANGUL JUNGSEONG O  # 
+
+117B ; 1165 116E ;     MA      # ( ᅻ → ᅥᅮ ) HANGUL JUNGSEONG EO-U → HANGUL JUNGSEONG EO, HANGUL JUNGSEONG U  # 
+
+117C ; 1165 1173 ;     MA      # ( ᅼ → ᅥᅳ ) HANGUL JUNGSEONG EO-EU → HANGUL JUNGSEONG EO, HANGUL JUNGSEONG EU        # 
+
+1166 ; 1165 1175 ;     MA      # ( ᅦ → ᅥᅵ ) HANGUL JUNGSEONG E → HANGUL JUNGSEONG EO, HANGUL JUNGSEONG I     # 
+3154 ; 1165 1175 ;     MA      # ( ㅔ → ᅥᅵ ) HANGUL LETTER E → HANGUL JUNGSEONG EO, HANGUL JUNGSEONG I        # →ᅦ→
+
+3155 ; 1167 ;  MA      # ( ㅕ → ᅧ ) HANGUL LETTER YEO → HANGUL JUNGSEONG YEO    # 
+
+11A5 ; 1167 1163 ;     MA      # ( ᆥ → ᅧᅣ ) HANGUL JUNGSEONG YEO-YA → HANGUL JUNGSEONG YEO, HANGUL JUNGSEONG YA      # 
+
+117D ; 1167 1169 ;     MA      # ( ᅽ → ᅧᅩ ) HANGUL JUNGSEONG YEO-O → HANGUL JUNGSEONG YEO, HANGUL JUNGSEONG O        # 
+
+117E ; 1167 116E ;     MA      # ( ᅾ → ᅧᅮ ) HANGUL JUNGSEONG YEO-U → HANGUL JUNGSEONG YEO, HANGUL JUNGSEONG U        # 
+
+1168 ; 1167 1175 ;     MA      # ( ᅨ → ᅧᅵ ) HANGUL JUNGSEONG YE → HANGUL JUNGSEONG YEO, HANGUL JUNGSEONG I   # 
+3156 ; 1167 1175 ;     MA      # ( ㅖ → ᅧᅵ ) HANGUL LETTER YE → HANGUL JUNGSEONG YEO, HANGUL JUNGSEONG I      # →ᅨ→
+
+3157 ; 1169 ;  MA      # ( ㅗ → ᅩ ) HANGUL LETTER O → HANGUL JUNGSEONG O        # 
+
+116A ; 1169 1161 ;     MA      # ( ᅪ → ᅩᅡ ) HANGUL JUNGSEONG WA → HANGUL JUNGSEONG O, HANGUL JUNGSEONG A     # 
+3158 ; 1169 1161 ;     MA      # ( ㅘ → ᅩᅡ ) HANGUL LETTER WA → HANGUL JUNGSEONG O, HANGUL JUNGSEONG A        # →ᅪ→
+
+116B ; 1169 1161 1175 ;        MA      # ( ᅫ → ᅩᅡᅵ ) HANGUL JUNGSEONG WAE → HANGUL JUNGSEONG O, HANGUL JUNGSEONG A, HANGUL JUNGSEONG I     # 
+3159 ; 1169 1161 1175 ;        MA      # ( ㅙ → ᅩᅡᅵ ) HANGUL LETTER WAE → HANGUL JUNGSEONG O, HANGUL JUNGSEONG A, HANGUL JUNGSEONG I        # →ᅫ→
+
+11A6 ; 1169 1163 ;     MA      # ( ᆦ → ᅩᅣ ) HANGUL JUNGSEONG O-YA → HANGUL JUNGSEONG O, HANGUL JUNGSEONG YA  # 
+
+11A7 ; 1169 1163 1175 ;        MA      # ( ᆧ → ᅩᅣᅵ ) HANGUL JUNGSEONG O-YAE → HANGUL JUNGSEONG O, HANGUL JUNGSEONG YA, HANGUL JUNGSEONG I  # 
+
+117F ; 1169 1165 ;     MA      # ( ᅿ → ᅩᅥ ) HANGUL JUNGSEONG O-EO → HANGUL JUNGSEONG O, HANGUL JUNGSEONG EO  # 
+
+1180 ; 1169 1165 1175 ;        MA      # ( ᆀ → ᅩᅥᅵ ) HANGUL JUNGSEONG O-E → HANGUL JUNGSEONG O, HANGUL JUNGSEONG EO, HANGUL JUNGSEONG I    # 
+
+D7B0 ; 1169 1167 ;     MA      # ( ힰ → ᅩᅧ ) HANGUL JUNGSEONG O-YEO → HANGUL JUNGSEONG O, HANGUL JUNGSEONG YEO        # 
+
+1181 ; 1169 1167 1175 ;        MA      # ( ᆁ → ᅩᅧᅵ ) HANGUL JUNGSEONG O-YE → HANGUL JUNGSEONG O, HANGUL JUNGSEONG YEO, HANGUL JUNGSEONG I  # 
+
+1182 ; 1169 1169 ;     MA      # ( ᆂ → ᅩᅩ ) HANGUL JUNGSEONG O-O → HANGUL JUNGSEONG O, HANGUL JUNGSEONG O    # 
+
+D7B1 ; 1169 1169 1175 ;        MA      # ( ힱ → ᅩᅩᅵ ) HANGUL JUNGSEONG O-O-I → HANGUL JUNGSEONG O, HANGUL JUNGSEONG O, HANGUL JUNGSEONG I   # 
+
+1183 ; 1169 116E ;     MA      # ( ᆃ → ᅩᅮ ) HANGUL JUNGSEONG O-U → HANGUL JUNGSEONG O, HANGUL JUNGSEONG U    # 
+
+116C ; 1169 1175 ;     MA      # ( ᅬ → ᅩᅵ ) HANGUL JUNGSEONG OE → HANGUL JUNGSEONG O, HANGUL JUNGSEONG I     # 
+315A ; 1169 1175 ;     MA      # ( ㅚ → ᅩᅵ ) HANGUL LETTER OE → HANGUL JUNGSEONG O, HANGUL JUNGSEONG I        # →ᅬ→
+
+315B ; 116D ;  MA      # ( ㅛ → ᅭ ) HANGUL LETTER YO → HANGUL JUNGSEONG YO      # 
+
+D7B2 ; 116D 1161 ;     MA      # ( ힲ → ᅭᅡ ) HANGUL JUNGSEONG YO-A → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG A  # 
+
+D7B3 ; 116D 1161 1175 ;        MA      # ( ힳ → ᅭᅡᅵ ) HANGUL JUNGSEONG YO-AE → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG A, HANGUL JUNGSEONG I  # 
+
+1184 ; 116D 1163 ;     MA      # ( ᆄ → ᅭᅣ ) HANGUL JUNGSEONG YO-YA → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG YA        # 
+3187 ; 116D 1163 ;     MA      # ( ㆇ → ᅭᅣ ) HANGUL LETTER YO-YA → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG YA   # →ᆄ→
+1186 ; 116D 1163 ;     MA      # ( ᆆ → ᅭᅣ ) HANGUL JUNGSEONG YO-YEO → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG YA       # →ᆄ→
+
+1185 ; 116D 1163 1175 ;        MA      # ( ᆅ → ᅭᅣᅵ ) HANGUL JUNGSEONG YO-YAE → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG YA, HANGUL JUNGSEONG I        # 
+3188 ; 116D 1163 1175 ;        MA      # ( ㆈ → ᅭᅣᅵ ) HANGUL LETTER YO-YAE → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG YA, HANGUL JUNGSEONG I   # →ᆅ→
+
+D7B4 ; 116D 1165 ;     MA      # ( ힴ → ᅭᅥ ) HANGUL JUNGSEONG YO-EO → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG EO        # 
+
+1187 ; 116D 1169 ;     MA      # ( ᆇ → ᅭᅩ ) HANGUL JUNGSEONG YO-O → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG O  # 
+
+1188 ; 116D 1175 ;     MA      # ( ᆈ → ᅭᅵ ) HANGUL JUNGSEONG YO-I → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG I  # 
+3189 ; 116D 1175 ;     MA      # ( ㆉ → ᅭᅵ ) HANGUL LETTER YO-I → HANGUL JUNGSEONG YO, HANGUL JUNGSEONG I     # →ᆈ→
+
+315C ; 116E ;  MA      # ( ㅜ → ᅮ ) HANGUL LETTER U → HANGUL JUNGSEONG U        # 
+
+1189 ; 116E 1161 ;     MA      # ( ᆉ → ᅮᅡ ) HANGUL JUNGSEONG U-A → HANGUL JUNGSEONG U, HANGUL JUNGSEONG A    # 
+
+118A ; 116E 1161 1175 ;        MA      # ( ᆊ → ᅮᅡᅵ ) HANGUL JUNGSEONG U-AE → HANGUL JUNGSEONG U, HANGUL JUNGSEONG A, HANGUL JUNGSEONG I    # 
+
+116F ; 116E 1165 ;     MA      # ( ᅯ → ᅮᅥ ) HANGUL JUNGSEONG WEO → HANGUL JUNGSEONG U, HANGUL JUNGSEONG EO   # 
+315D ; 116E 1165 ;     MA      # ( ㅝ → ᅮᅥ ) HANGUL LETTER WEO → HANGUL JUNGSEONG U, HANGUL JUNGSEONG EO      # →ᅯ→
+
+118B ; 116E 1165 1173 ;        MA      # ( ᆋ → ᅮᅥᅳ ) HANGUL JUNGSEONG U-EO-EU → HANGUL JUNGSEONG U, HANGUL JUNGSEONG EO, HANGUL JUNGSEONG EU       # 
+
+1170 ; 116E 1165 1175 ;        MA      # ( ᅰ → ᅮᅥᅵ ) HANGUL JUNGSEONG WE → HANGUL JUNGSEONG U, HANGUL JUNGSEONG EO, HANGUL JUNGSEONG I     # 
+315E ; 116E 1165 1175 ;        MA      # ( ㅞ → ᅮᅥᅵ ) HANGUL LETTER WE → HANGUL JUNGSEONG U, HANGUL JUNGSEONG EO, HANGUL JUNGSEONG I        # →ᅰ→
+
+D7B5 ; 116E 1167 ;     MA      # ( ힵ → ᅮᅧ ) HANGUL JUNGSEONG U-YEO → HANGUL JUNGSEONG U, HANGUL JUNGSEONG YEO        # 
+
+118C ; 116E 1167 1175 ;        MA      # ( ᆌ → ᅮᅧᅵ ) HANGUL JUNGSEONG U-YE → HANGUL JUNGSEONG U, HANGUL JUNGSEONG YEO, HANGUL JUNGSEONG I  # 
+
+118D ; 116E 116E ;     MA      # ( ᆍ → ᅮᅮ ) HANGUL JUNGSEONG U-U → HANGUL JUNGSEONG U, HANGUL JUNGSEONG U    # 
+
+1171 ; 116E 1175 ;     MA      # ( ᅱ → ᅮᅵ ) HANGUL JUNGSEONG WI → HANGUL JUNGSEONG U, HANGUL JUNGSEONG I     # 
+315F ; 116E 1175 ;     MA      # ( ㅟ → ᅮᅵ ) HANGUL LETTER WI → HANGUL JUNGSEONG U, HANGUL JUNGSEONG I        # →ᅱ→
+
+D7B6 ; 116E 1175 1175 ;        MA      # ( ힶ → ᅮᅵᅵ ) HANGUL JUNGSEONG U-I-I → HANGUL JUNGSEONG U, HANGUL JUNGSEONG I, HANGUL JUNGSEONG I   # 
+
+3160 ; 1172 ;  MA      # ( ㅠ → ᅲ ) HANGUL LETTER YU → HANGUL JUNGSEONG YU      # 
+
+118E ; 1172 1161 ;     MA      # ( ᆎ → ᅲᅡ ) HANGUL JUNGSEONG YU-A → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG A  # 
+
+D7B7 ; 1172 1161 1175 ;        MA      # ( ힷ → ᅲᅡᅵ ) HANGUL JUNGSEONG YU-AE → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG A, HANGUL JUNGSEONG I  # 
+
+118F ; 1172 1165 ;     MA      # ( ᆏ → ᅲᅥ ) HANGUL JUNGSEONG YU-EO → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG EO        # 
+
+1190 ; 1172 1165 1175 ;        MA      # ( ᆐ → ᅲᅥᅵ ) HANGUL JUNGSEONG YU-E → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG EO, HANGUL JUNGSEONG I  # 
+
+1191 ; 1172 1167 ;     MA      # ( ᆑ → ᅲᅧ ) HANGUL JUNGSEONG YU-YEO → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG YEO      # 
+318A ; 1172 1167 ;     MA      # ( ㆊ → ᅲᅧ ) HANGUL LETTER YU-YEO → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG YEO # →ᆑ→
+
+1192 ; 1172 1167 1175 ;        MA      # ( ᆒ → ᅲᅧᅵ ) HANGUL JUNGSEONG YU-YE → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG YEO, HANGUL JUNGSEONG I        # 
+318B ; 1172 1167 1175 ;        MA      # ( ㆋ → ᅲᅧᅵ ) HANGUL LETTER YU-YE → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG YEO, HANGUL JUNGSEONG I   # →ᆒ→
+
+D7B8 ; 1172 1169 ;     MA      # ( ힸ → ᅲᅩ ) HANGUL JUNGSEONG YU-O → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG O  # 
+
+1193 ; 1172 116E ;     MA      # ( ᆓ → ᅲᅮ ) HANGUL JUNGSEONG YU-U → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG U  # 
+
+1194 ; 1172 1175 ;     MA      # ( ᆔ → ᅲᅵ ) HANGUL JUNGSEONG YU-I → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG I  # 
+318C ; 1172 1175 ;     MA      # ( ㆌ → ᅲᅵ ) HANGUL LETTER YU-I → HANGUL JUNGSEONG YU, HANGUL JUNGSEONG I     # →ᆔ→
+
+D7B9 ; 1173 1161 ;     MA      # ( ힹ → ᅳᅡ ) HANGUL JUNGSEONG EU-A → HANGUL JUNGSEONG EU, HANGUL JUNGSEONG A  # 
+
+D7BA ; 1173 1165 ;     MA      # ( ힺ → ᅳᅥ ) HANGUL JUNGSEONG EU-EO → HANGUL JUNGSEONG EU, HANGUL JUNGSEONG EO        # 
+
+D7BB ; 1173 1165 1175 ;        MA      # ( ힻ → ᅳᅥᅵ ) HANGUL JUNGSEONG EU-E → HANGUL JUNGSEONG EU, HANGUL JUNGSEONG EO, HANGUL JUNGSEONG I  # 
+
+D7BC ; 1173 1169 ;     MA      # ( ힼ → ᅳᅩ ) HANGUL JUNGSEONG EU-O → HANGUL JUNGSEONG EU, HANGUL JUNGSEONG O  # 
+
+1195 ; 1173 116E ;     MA      # ( ᆕ → ᅳᅮ ) HANGUL JUNGSEONG EU-U → HANGUL JUNGSEONG EU, HANGUL JUNGSEONG U  # 
+
+1197 ; 1173 1175 116E ;        MA      # ( ᆗ → ᅳᅵᅮ ) HANGUL JUNGSEONG YI-U → HANGUL JUNGSEONG EU, HANGUL JUNGSEONG I, HANGUL JUNGSEONG U   # 
+
+1198 ; 1175 1161 ;     MA      # ( ᆘ → ᅵᅡ ) HANGUL JUNGSEONG I-A → HANGUL JUNGSEONG I, HANGUL JUNGSEONG A    # 
+
+1199 ; 1175 1163 ;     MA      # ( ᆙ → ᅵᅣ ) HANGUL JUNGSEONG I-YA → HANGUL JUNGSEONG I, HANGUL JUNGSEONG YA  # 
+
+D7BD ; 1175 1163 1169 ;        MA      # ( ힽ → ᅵᅣᅩ ) HANGUL JUNGSEONG I-YA-O → HANGUL JUNGSEONG I, HANGUL JUNGSEONG YA, HANGUL JUNGSEONG O # 
+
+D7BE ; 1175 1163 1175 ;        MA      # ( ힾ → ᅵᅣᅵ ) HANGUL JUNGSEONG I-YAE → HANGUL JUNGSEONG I, HANGUL JUNGSEONG YA, HANGUL JUNGSEONG I  # 
+
+D7BF ; 1175 1167 ;     MA      # ( ힿ → ᅵᅧ ) HANGUL JUNGSEONG I-YEO → HANGUL JUNGSEONG I, HANGUL JUNGSEONG YEO        # 
+
+D7C0 ; 1175 1167 1175 ;        MA      # ( ퟀ → ᅵᅧᅵ ) HANGUL JUNGSEONG I-YE → HANGUL JUNGSEONG I, HANGUL JUNGSEONG YEO, HANGUL JUNGSEONG I  # 
+
+119A ; 1175 1169 ;     MA      # ( ᆚ → ᅵᅩ ) HANGUL JUNGSEONG I-O → HANGUL JUNGSEONG I, HANGUL JUNGSEONG O    # 
+
+D7C1 ; 1175 1169 1175 ;        MA      # ( ퟁ → ᅵᅩᅵ ) HANGUL JUNGSEONG I-O-I → HANGUL JUNGSEONG I, HANGUL JUNGSEONG O, HANGUL JUNGSEONG I   # 
+
+D7C2 ; 1175 116D ;     MA      # ( ퟂ → ᅵᅭ ) HANGUL JUNGSEONG I-YO → HANGUL JUNGSEONG I, HANGUL JUNGSEONG YO  # 
+
+119B ; 1175 116E ;     MA      # ( ᆛ → ᅵᅮ ) HANGUL JUNGSEONG I-U → HANGUL JUNGSEONG I, HANGUL JUNGSEONG U    # 
+
+D7C3 ; 1175 1172 ;     MA      # ( ퟃ → ᅵᅲ ) HANGUL JUNGSEONG I-YU → HANGUL JUNGSEONG I, HANGUL JUNGSEONG YU  # 
+
+119D ; 1175 119E ;     MA      # ( ᆝ → ᅵᆞ ) HANGUL JUNGSEONG I-ARAEA → HANGUL JUNGSEONG I, HANGUL JUNGSEONG ARAEA    # 
+
+318D ; 119E ;  MA      # ( ㆍ → ᆞ ) HANGUL LETTER ARAEA → HANGUL JUNGSEONG ARAEA        # 
+
+D7C5 ; 119E 1161 ;     MA      # ( ퟅ → ᆞᅡ ) HANGUL JUNGSEONG ARAEA-A → HANGUL JUNGSEONG ARAEA, HANGUL JUNGSEONG A    # 
+
+119F ; 119E 1165 ;     MA      # ( ᆟ → ᆞᅥ ) HANGUL JUNGSEONG ARAEA-EO → HANGUL JUNGSEONG ARAEA, HANGUL JUNGSEONG EO  # 
+
+D7C6 ; 119E 1165 1175 ;        MA      # ( ퟆ → ᆞᅥᅵ ) HANGUL JUNGSEONG ARAEA-E → HANGUL JUNGSEONG ARAEA, HANGUL JUNGSEONG EO, HANGUL JUNGSEONG I    # 
+
+11A0 ; 119E 116E ;     MA      # ( ᆠ → ᆞᅮ ) HANGUL JUNGSEONG ARAEA-U → HANGUL JUNGSEONG ARAEA, HANGUL JUNGSEONG U    # 
+
+11A1 ; 119E 1175 ;     MA      # ( ᆡ → ᆞᅵ ) HANGUL JUNGSEONG ARAEA-I → HANGUL JUNGSEONG ARAEA, HANGUL JUNGSEONG I    # 
+318E ; 119E 1175 ;     MA      # ( ㆎ → ᆞᅵ ) HANGUL LETTER ARAEAE → HANGUL JUNGSEONG ARAEA, HANGUL JUNGSEONG I        # →ᆡ→
+
+11A2 ; 119E 119E ;     MA      # ( ᆢ → ᆞᆞ ) HANGUL JUNGSEONG SSANGARAEA → HANGUL JUNGSEONG ARAEA, HANGUL JUNGSEONG ARAEA     # 
+
+30D8 ; 3078 ;  MA      # ( ヘ → へ ) KATAKANA LETTER HE → HIRAGANA LETTER HE     # 
+
+29C4 ; 303C ;  MA      #* ( ⧄ → 〼 ) SQUARED RISING DIAGONAL SLASH → MASU MARK  # 
+
+A49E ; A04A ;  MA      #* ( ꒞ → ꁊ ) YI RADICAL PUT → YI SYLLABLE PUT   # 
+
+A4AC ; A050 ;  MA      #* ( ꒬ → ꁐ ) YI RADICAL PYT → YI SYLLABLE PYT   # 
+
+A49C ; A0C0 ;  MA      #* ( ꒜ → ꃀ ) YI RADICAL MOP → YI SYLLABLE MOP   # 
+
+A4A8 ; A132 ;  MA      #* ( ꒨ → ꄲ ) YI RADICAL TU → YI SYLLABLE TU     # 
+
+A4BF ; A259 ;  MA      #* ( ꒿ → ꉙ ) YI RADICAL HXOP → YI SYLLABLE HXOP # 
+
+A4BE ; A2B1 ;  MA      #* ( ꒾ → ꊱ ) YI RADICAL CIP → YI SYLLABLE CIP   # 
+
+A494 ; A2CD ;  MA      #* ( ꒔ → ꋍ ) YI RADICAL CYP → YI SYLLABLE CYP   # 
+
+A4C0 ; A3AB ;  MA      #* ( ꓀ → ꎫ ) YI RADICAL SHAT → YI SYLLABLE SHAT # 
+
+A4C2 ; A3B5 ;  MA      #* ( ꓂ → ꎵ ) YI RADICAL SHOP → YI SYLLABLE SHOP # 
+
+A4BA ; A3BF ;  MA      #* ( ꒺ → ꎿ ) YI RADICAL SHUR → YI SYLLABLE SHUR # 
+
+A4B0 ; A3C2 ;  MA      #* ( ꒰ → ꏂ ) YI RADICAL SHY → YI SYLLABLE SHY   # 
+
+A4A7 ; A458 ;  MA      #* ( ꒧ → ꑘ ) YI RADICAL NYOP → YI SYLLABLE NYOP # 
+
+22A5 ; A4D5 ;  MA      #* ( ⊥ → ꓕ ) UP TACK → LISU LETTER THA  # 
+27C2 ; A4D5 ;  MA      #* ( ⟂ → ꓕ ) PERPENDICULAR → LISU LETTER THA    # →⊥→
+
+2141 ; A4E8 ;  MA      #* ( ⅁ → ꓨ ) TURNED SANS-SERIF CAPITAL G → LISU LETTER HHA      # 
+
+2200 ; A4EF ;  MA      #* ( ∀ → ꓯ ) FOR ALL → LISU LETTER AE   # 
+
+2229 ; A4F5 ;  MA      #* ( ∩ → ꓵ ) INTERSECTION → LISU LETTER UE      # 
+22C2 ; A4F5 ;  MA      #* ( ⋂ → ꓵ ) N-ARY INTERSECTION → LISU LETTER UE        # →∩→
+
+2142 ; A4F6 ;  MA      #* ( ⅂ → ꓶ ) TURNED SANS-SERIF CAPITAL L → LISU LETTER UH       # 
+
+104A0 ;        10486 ; MA      # ( 𐒠 → 𐒆 ) OSMANYA DIGIT ZERO → OSMANYA LETTER DEEL  # 
+
+103D1 ;        10382 ; MA      # ( 𐏑 → 𐎂 ) OLD PERSIAN NUMBER ONE → UGARITIC LETTER GAMLA    # 
+
+103D3 ;        10393 ; MA      # ( 𐏓 → 𐎓 ) OLD PERSIAN NUMBER TEN → UGARITIC LETTER AIN      # 
+
+12038 ;        1039A ; MA      # ( 𒀸 → 𐎚 ) CUNEIFORM SIGN ASH → UGARITIC LETTER TO   # 
+
+F967 ; 4E0D ;  MA      # ( 不 → 不 ) CJK COMPATIBILITY IDEOGRAPH-F967 → CJK UNIFIED IDEOGRAPH-4E0D       # 
+
+FA70 ; 4E26 ;  MA      # ( 並 → 並 ) CJK COMPATIBILITY IDEOGRAPH-FA70 → CJK UNIFIED IDEOGRAPH-4E26       # 
+
+239C ; 4E28 ;  MA      #* ( ⎜ → 丨 ) LEFT PARENTHESIS EXTENSION → CJK UNIFIED IDEOGRAPH-4E28    # →⎥→→⎮→
+239F ; 4E28 ;  MA      #* ( ⎟ → 丨 ) RIGHT PARENTHESIS EXTENSION → CJK UNIFIED IDEOGRAPH-4E28   # →⎥→→⎮→
+23A2 ; 4E28 ;  MA      #* ( ⎢ → 丨 ) LEFT SQUARE BRACKET EXTENSION → CJK UNIFIED IDEOGRAPH-4E28 # →⎥→→⎮→
+23A5 ; 4E28 ;  MA      #* ( ⎥ → 丨 ) RIGHT SQUARE BRACKET EXTENSION → CJK UNIFIED IDEOGRAPH-4E28        # →⎮→
+23AA ; 4E28 ;  MA      #* ( ⎪ → 丨 ) CURLY BRACKET EXTENSION → CJK UNIFIED IDEOGRAPH-4E28       # →⎥→→⎮→
+23AE ; 4E28 ;  MA      #* ( ⎮ → 丨 ) INTEGRAL EXTENSION → CJK UNIFIED IDEOGRAPH-4E28    # 
+31D1 ; 4E28 ;  MA      #* ( ㇑ → 丨 ) CJK STROKE S → CJK UNIFIED IDEOGRAPH-4E28  # 
+1175 ; 4E28 ;  MA      # ( ᅵ → 丨 ) HANGUL JUNGSEONG I → CJK UNIFIED IDEOGRAPH-4E28     # →ㅣ→
+3163 ; 4E28 ;  MA      # ( ㅣ → 丨 ) HANGUL LETTER I → CJK UNIFIED IDEOGRAPH-4E28        # 
+2F01 ; 4E28 ;  MA      #* ( ⼁ → 丨 ) KANGXI RADICAL LINE → CJK UNIFIED IDEOGRAPH-4E28   # 
+
+119C ; 4E28 30FC ;     MA      # ( ᆜ → 丨ー ) HANGUL JUNGSEONG I-EU → CJK UNIFIED IDEOGRAPH-4E28, KATAKANA-HIRAGANA PROLONGED SOUND MARK       # →ᅵᅳ→
+
+D7C4 ; 4E28 4E28 ;     MA      # ( ퟄ → 丨丨 ) HANGUL JUNGSEONG I-I → CJK UNIFIED IDEOGRAPH-4E28, CJK UNIFIED IDEOGRAPH-4E28    # →ᅵᅵ→
+
+2EA6 ; 4E2C ;  MA      #* ( ⺦ → 丬 ) CJK RADICAL SIMPLIFIED HALF TREE TRUNK → CJK UNIFIED IDEOGRAPH-4E2C        # 
+
+F905 ; 4E32 ;  MA      # ( 串 → 串 ) CJK COMPATIBILITY IDEOGRAPH-F905 → CJK UNIFIED IDEOGRAPH-4E32       # 
+
+2F801 ;        4E38 ;  MA      # ( 丸 → 丸 ) CJK COMPATIBILITY IDEOGRAPH-2F801 → CJK UNIFIED IDEOGRAPH-4E38     # 
+
+F95E ; 4E39 ;  MA      # ( 丹 → 丹 ) CJK COMPATIBILITY IDEOGRAPH-F95E → CJK UNIFIED IDEOGRAPH-4E39       # 
+
+2F800 ;        4E3D ;  MA      # ( 丽 → 丽 ) CJK COMPATIBILITY IDEOGRAPH-2F800 → CJK UNIFIED IDEOGRAPH-4E3D     # 
+
+2F802 ;        4E41 ;  MA      # ( 乁 → 乁 ) CJK COMPATIBILITY IDEOGRAPH-2F802 → CJK UNIFIED IDEOGRAPH-4E41     # 
+
+31E0 ; 4E59 ;  MA      #* ( ㇠ → 乙 ) CJK STROKE HXWG → CJK UNIFIED IDEOGRAPH-4E59       # 
+2F04 ; 4E59 ;  MA      #* ( ⼄ → 乙 ) KANGXI RADICAL SECOND → CJK UNIFIED IDEOGRAPH-4E59 # 
+
+31DF ; 4E5A ;  MA      #* ( ㇟ → 乚 ) CJK STROKE SWG → CJK UNIFIED IDEOGRAPH-4E5A        # 
+2E83 ; 4E5A ;  MA      #* ( ⺃ → 乚 ) CJK RADICAL SECOND TWO → CJK UNIFIED IDEOGRAPH-4E5A        # 
+
+31D6 ; 4E5B ;  MA      #* ( ㇖ → 乛 ) CJK STROKE HG → CJK UNIFIED IDEOGRAPH-4E5B # 
+
+2EF2 ; 4E80 ;  MA      #* ( ⻲ → 亀 ) CJK RADICAL J-SIMPLIFIED TURTLE → CJK UNIFIED IDEOGRAPH-4E80       # 
+
+F91B ; 4E82 ;  MA      # ( 亂 → 亂 ) CJK COMPATIBILITY IDEOGRAPH-F91B → CJK UNIFIED IDEOGRAPH-4E82       # 
+
+31DA ; 4E85 ;  MA      #* ( ㇚ → 亅 ) CJK STROKE SG → CJK UNIFIED IDEOGRAPH-4E85 # 
+2F05 ; 4E85 ;  MA      #* ( ⼅ → 亅 ) KANGXI RADICAL HOOK → CJK UNIFIED IDEOGRAPH-4E85   # 
+
+F9BA ; 4E86 ;  MA      # ( 了 → 了 ) CJK COMPATIBILITY IDEOGRAPH-F9BA → CJK UNIFIED IDEOGRAPH-4E86       # 
+
+2F06 ; 4E8C ;  MA      #* ( ⼆ → 二 ) KANGXI RADICAL TWO → CJK UNIFIED IDEOGRAPH-4E8C    # 
+
+2F07 ; 4EA0 ;  MA      #* ( ⼇ → 亠 ) KANGXI RADICAL LID → CJK UNIFIED IDEOGRAPH-4EA0    # 
+
+F977 ; 4EAE ;  MA      # ( 亮 → 亮 ) CJK COMPATIBILITY IDEOGRAPH-F977 → CJK UNIFIED IDEOGRAPH-4EAE       # 
+
+2F08 ; 4EBA ;  MA      #* ( ⼈ → 人 ) KANGXI RADICAL MAN → CJK UNIFIED IDEOGRAPH-4EBA    # 
+
+2E85 ; 4EBB ;  MA      #* ( ⺅ → 亻 ) CJK RADICAL PERSON → CJK UNIFIED IDEOGRAPH-4EBB    # 
+
+F9FD ; 4EC0 ;  MA      # ( 什 → 什 ) CJK COMPATIBILITY IDEOGRAPH-F9FD → CJK UNIFIED IDEOGRAPH-4EC0       # 
+
+2F819 ;        4ECC ;  MA      # ( 仌 → 仌 ) CJK COMPATIBILITY IDEOGRAPH-2F819 → CJK UNIFIED IDEOGRAPH-4ECC     # 
+
+F9A8 ; 4EE4 ;  MA      # ( 令 → 令 ) CJK COMPATIBILITY IDEOGRAPH-F9A8 → CJK UNIFIED IDEOGRAPH-4EE4       # 
+
+2F804 ;        4F60 ;  MA      # ( 你 → 你 ) CJK COMPATIBILITY IDEOGRAPH-2F804 → CJK UNIFIED IDEOGRAPH-4F60     # 
+
+5002 ; 4F75 ;  MA      # ( 倂 → 併 ) CJK UNIFIED IDEOGRAPH-5002 → CJK UNIFIED IDEOGRAPH-4F75     # 
+2F807 ;        4F75 ;  MA      # ( 倂 → 併 ) CJK COMPATIBILITY IDEOGRAPH-2F807 → CJK UNIFIED IDEOGRAPH-4F75     # →倂→
+
+FA73 ; 4F80 ;  MA      # ( 侀 → 侀 ) CJK COMPATIBILITY IDEOGRAPH-FA73 → CJK UNIFIED IDEOGRAPH-4F80       # 
+
+F92D ; 4F86 ;  MA      # ( 來 → 來 ) CJK COMPATIBILITY IDEOGRAPH-F92D → CJK UNIFIED IDEOGRAPH-4F86       # 
+
+F9B5 ; 4F8B ;  MA      # ( 例 → 例 ) CJK COMPATIBILITY IDEOGRAPH-F9B5 → CJK UNIFIED IDEOGRAPH-4F8B       # 
+
+FA30 ; 4FAE ;  MA      # ( 侮 → 侮 ) CJK COMPATIBILITY IDEOGRAPH-FA30 → CJK UNIFIED IDEOGRAPH-4FAE       # 
+2F805 ;        4FAE ;  MA      # ( 侮 → 侮 ) CJK COMPATIBILITY IDEOGRAPH-2F805 → CJK UNIFIED IDEOGRAPH-4FAE     # 
+
+2F806 ;        4FBB ;  MA      # ( 侻 → 侻 ) CJK COMPATIBILITY IDEOGRAPH-2F806 → CJK UNIFIED IDEOGRAPH-4FBB     # 
+
+F965 ; 4FBF ;  MA      # ( 便 → 便 ) CJK COMPATIBILITY IDEOGRAPH-F965 → CJK UNIFIED IDEOGRAPH-4FBF       # 
+
+503C ; 5024 ;  MA      # ( 值 → 値 ) CJK UNIFIED IDEOGRAPH-503C → CJK UNIFIED IDEOGRAPH-5024     # 
+
+F9D4 ; 502B ;  MA      # ( 倫 → 倫 ) CJK COMPATIBILITY IDEOGRAPH-F9D4 → CJK UNIFIED IDEOGRAPH-502B       # 
+
+2F808 ;        507A ;  MA      # ( 偺 → 偺 ) CJK COMPATIBILITY IDEOGRAPH-2F808 → CJK UNIFIED IDEOGRAPH-507A     # 
+
+2F809 ;        5099 ;  MA      # ( 備 → 備 ) CJK COMPATIBILITY IDEOGRAPH-2F809 → CJK UNIFIED IDEOGRAPH-5099     # 
+
+2F80B ;        50CF ;  MA      # ( 像 → 像 ) CJK COMPATIBILITY IDEOGRAPH-2F80B → CJK UNIFIED IDEOGRAPH-50CF     # 
+
+F9BB ; 50DA ;  MA      # ( 僚 → 僚 ) CJK COMPATIBILITY IDEOGRAPH-F9BB → CJK UNIFIED IDEOGRAPH-50DA       # 
+
+FA31 ; 50E7 ;  MA      # ( 僧 → 僧 ) CJK COMPATIBILITY IDEOGRAPH-FA31 → CJK UNIFIED IDEOGRAPH-50E7       # 
+2F80A ;        50E7 ;  MA      # ( 僧 → 僧 ) CJK COMPATIBILITY IDEOGRAPH-2F80A → CJK UNIFIED IDEOGRAPH-50E7     # 
+
+2F09 ; 513F ;  MA      #* ( ⼉ → 儿 ) KANGXI RADICAL LEGS → CJK UNIFIED IDEOGRAPH-513F   # 
+
+FA0C ; 5140 ;  MA      # ( 兀 → 兀 ) CJK COMPATIBILITY IDEOGRAPH-FA0C → CJK UNIFIED IDEOGRAPH-5140       # 
+2E8E ; 5140 ;  MA      #* ( ⺎ → 兀 ) CJK RADICAL LAME ONE → CJK UNIFIED IDEOGRAPH-5140  # 
+
+FA74 ; 5145 ;  MA      # ( 充 → 充 ) CJK COMPATIBILITY IDEOGRAPH-FA74 → CJK UNIFIED IDEOGRAPH-5145       # 
+
+FA32 ; 514D ;  MA      # ( 免 → 免 ) CJK COMPATIBILITY IDEOGRAPH-FA32 → CJK UNIFIED IDEOGRAPH-514D       # 
+2F80E ;        514D ;  MA      # ( 免 → 免 ) CJK COMPATIBILITY IDEOGRAPH-2F80E → CJK UNIFIED IDEOGRAPH-514D     # 
+
+2F80F ;        5154 ;  MA      # ( 兔 → 兔 ) CJK COMPATIBILITY IDEOGRAPH-2F80F → CJK UNIFIED IDEOGRAPH-5154     # 
+
+2F810 ;        5164 ;  MA      # ( 兤 → 兤 ) CJK COMPATIBILITY IDEOGRAPH-2F810 → CJK UNIFIED IDEOGRAPH-5164     # 
+
+2F0A ; 5165 ;  MA      #* ( ⼊ → 入 ) KANGXI RADICAL ENTER → CJK UNIFIED IDEOGRAPH-5165  # 
+
+2F814 ;        5167 ;  MA      # ( 內 → 內 ) CJK COMPATIBILITY IDEOGRAPH-2F814 → CJK UNIFIED IDEOGRAPH-5167     # 
+
+FA72 ; 5168 ;  MA      # ( 全 → 全 ) CJK COMPATIBILITY IDEOGRAPH-FA72 → CJK UNIFIED IDEOGRAPH-5168       # 
+
+F978 ; 5169 ;  MA      # ( 兩 → 兩 ) CJK COMPATIBILITY IDEOGRAPH-F978 → CJK UNIFIED IDEOGRAPH-5169       # 
+
+2F0B ; 516B ;  MA      #* ( ⼋ → 八 ) KANGXI RADICAL EIGHT → CJK UNIFIED IDEOGRAPH-516B  # 
+
+F9D1 ; 516D ;  MA      # ( 六 → 六 ) CJK COMPATIBILITY IDEOGRAPH-F9D1 → CJK UNIFIED IDEOGRAPH-516D       # 
+
+2F811 ;        5177 ;  MA      # ( 具 → 具 ) CJK COMPATIBILITY IDEOGRAPH-2F811 → CJK UNIFIED IDEOGRAPH-5177     # 
+
+FA75 ; 5180 ;  MA      # ( 冀 → 冀 ) CJK COMPATIBILITY IDEOGRAPH-FA75 → CJK UNIFIED IDEOGRAPH-5180       # 
+
+2F0C ; 5182 ;  MA      #* ( ⼌ → 冂 ) KANGXI RADICAL DOWN BOX → CJK UNIFIED IDEOGRAPH-5182       # 
+
+2F815 ;        518D ;  MA      # ( 再 → 再 ) CJK COMPATIBILITY IDEOGRAPH-2F815 → CJK UNIFIED IDEOGRAPH-518D     # 
+
+2F8D2 ;        5192 ;  MA      # ( 冒 → 冒 ) CJK COMPATIBILITY IDEOGRAPH-2F8D2 → CJK UNIFIED IDEOGRAPH-5192     # 
+
+2F8D3 ;        5195 ;  MA      # ( 冕 → 冕 ) CJK COMPATIBILITY IDEOGRAPH-2F8D3 → CJK UNIFIED IDEOGRAPH-5195     # 
+
+2F0D ; 5196 ;  MA      #* ( ⼍ → 冖 ) KANGXI RADICAL COVER → CJK UNIFIED IDEOGRAPH-5196  # 
+
+2F817 ;        5197 ;  MA      # ( 冗 → 冗 ) CJK COMPATIBILITY IDEOGRAPH-2F817 → CJK UNIFIED IDEOGRAPH-5197     # 
+
+2F818 ;        51A4 ;  MA      # ( 冤 → 冤 ) CJK COMPATIBILITY IDEOGRAPH-2F818 → CJK UNIFIED IDEOGRAPH-51A4     # 
+
+2F0E ; 51AB ;  MA      #* ( ⼎ → 冫 ) KANGXI RADICAL ICE → CJK UNIFIED IDEOGRAPH-51AB    # 
+
+2F81A ;        51AC ;  MA      # ( 冬 → 冬 ) CJK COMPATIBILITY IDEOGRAPH-2F81A → CJK UNIFIED IDEOGRAPH-51AC     # 
+
+FA71 ; 51B5 ;  MA      # ( 况 → 况 ) CJK COMPATIBILITY IDEOGRAPH-FA71 → CJK UNIFIED IDEOGRAPH-51B5       # 
+2F81B ;        51B5 ;  MA      # ( 况 → 况 ) CJK COMPATIBILITY IDEOGRAPH-2F81B → CJK UNIFIED IDEOGRAPH-51B5     # 
+
+F92E ; 51B7 ;  MA      # ( 冷 → 冷 ) CJK COMPATIBILITY IDEOGRAPH-F92E → CJK UNIFIED IDEOGRAPH-51B7       # 
+
+F979 ; 51C9 ;  MA      # ( 凉 → 凉 ) CJK COMPATIBILITY IDEOGRAPH-F979 → CJK UNIFIED IDEOGRAPH-51C9       # 
+
+F955 ; 51CC ;  MA      # ( 凌 → 凌 ) CJK COMPATIBILITY IDEOGRAPH-F955 → CJK UNIFIED IDEOGRAPH-51CC       # 
+
+F954 ; 51DC ;  MA      # ( 凜 → 凜 ) CJK COMPATIBILITY IDEOGRAPH-F954 → CJK UNIFIED IDEOGRAPH-51DC       # 
+
+FA15 ; 51DE ;  MA      # ( 凞 → 凞 ) CJK COMPATIBILITY IDEOGRAPH-FA15 → CJK UNIFIED IDEOGRAPH-51DE       # 
+
+2F0F ; 51E0 ;  MA      #* ( ⼏ → 几 ) KANGXI RADICAL TABLE → CJK UNIFIED IDEOGRAPH-51E0  # 
+
+2F81D ;        51F5 ;  MA      # ( 凵 → 凵 ) CJK COMPATIBILITY IDEOGRAPH-2F81D → CJK UNIFIED IDEOGRAPH-51F5     # 
+2F10 ; 51F5 ;  MA      #* ( ⼐ → 凵 ) KANGXI RADICAL OPEN BOX → CJK UNIFIED IDEOGRAPH-51F5       # 
+
+2F11 ; 5200 ;  MA      #* ( ⼑ → 刀 ) KANGXI RADICAL KNIFE → CJK UNIFIED IDEOGRAPH-5200  # 
+
+2E89 ; 5202 ;  MA      #* ( ⺉ → 刂 ) CJK RADICAL KNIFE TWO → CJK UNIFIED IDEOGRAPH-5202 # 
+
+2F81E ;        5203 ;  MA      # ( 刃 → 刃 ) CJK COMPATIBILITY IDEOGRAPH-2F81E → CJK UNIFIED IDEOGRAPH-5203     # 
+
+FA00 ; 5207 ;  MA      # ( 切 → 切 ) CJK COMPATIBILITY IDEOGRAPH-FA00 → CJK UNIFIED IDEOGRAPH-5207       # 
+2F850 ;        5207 ;  MA      # ( 切 → 切 ) CJK COMPATIBILITY IDEOGRAPH-2F850 → CJK UNIFIED IDEOGRAPH-5207     # 
+
+F99C ; 5217 ;  MA      # ( 列 → 列 ) CJK COMPATIBILITY IDEOGRAPH-F99C → CJK UNIFIED IDEOGRAPH-5217       # 
+
+F9DD ; 5229 ;  MA      # ( 利 → 利 ) CJK COMPATIBILITY IDEOGRAPH-F9DD → CJK UNIFIED IDEOGRAPH-5229       # 
+
+F9FF ; 523A ;  MA      # ( 刺 → 刺 ) CJK COMPATIBILITY IDEOGRAPH-F9FF → CJK UNIFIED IDEOGRAPH-523A       # 
+
+2F820 ;        523B ;  MA      # ( 刻 → 刻 ) CJK COMPATIBILITY IDEOGRAPH-2F820 → CJK UNIFIED IDEOGRAPH-523B     # 
+
+2F821 ;        5246 ;  MA      # ( 剆 → 剆 ) CJK COMPATIBILITY IDEOGRAPH-2F821 → CJK UNIFIED IDEOGRAPH-5246     # 
+
+2F822 ;        5272 ;  MA      # ( 割 → 割 ) CJK COMPATIBILITY IDEOGRAPH-2F822 → CJK UNIFIED IDEOGRAPH-5272     # 
+
+2F823 ;        5277 ;  MA      # ( 剷 → 剷 ) CJK COMPATIBILITY IDEOGRAPH-2F823 → CJK UNIFIED IDEOGRAPH-5277     # 
+
+F9C7 ; 5289 ;  MA      # ( 劉 → 劉 ) CJK COMPATIBILITY IDEOGRAPH-F9C7 → CJK UNIFIED IDEOGRAPH-5289       # 
+
+F98A ; 529B ;  MA      # ( 力 → 力 ) CJK COMPATIBILITY IDEOGRAPH-F98A → CJK UNIFIED IDEOGRAPH-529B       # 
+2F12 ; 529B ;  MA      #* ( ⼒ → 力 ) KANGXI RADICAL POWER → CJK UNIFIED IDEOGRAPH-529B  # 
+
+F99D ; 52A3 ;  MA      # ( 劣 → 劣 ) CJK COMPATIBILITY IDEOGRAPH-F99D → CJK UNIFIED IDEOGRAPH-52A3       # 
+
+2F992 ;        52B3 ;  MA      # ( 劳 → 劳 ) CJK COMPATIBILITY IDEOGRAPH-2F992 → CJK UNIFIED IDEOGRAPH-52B3     # 
+
+FA76 ; 52C7 ;  MA      # ( 勇 → 勇 ) CJK COMPATIBILITY IDEOGRAPH-FA76 → CJK UNIFIED IDEOGRAPH-52C7       # 
+2F825 ;        52C7 ;  MA      # ( 勇 → 勇 ) CJK COMPATIBILITY IDEOGRAPH-2F825 → CJK UNIFIED IDEOGRAPH-52C7     # 
+
+FA33 ; 52C9 ;  MA      # ( 勉 → 勉 ) CJK COMPATIBILITY IDEOGRAPH-FA33 → CJK UNIFIED IDEOGRAPH-52C9       # 
+2F826 ;        52C9 ;  MA      # ( 勉 → 勉 ) CJK COMPATIBILITY IDEOGRAPH-2F826 → CJK UNIFIED IDEOGRAPH-52C9     # 
+
+F952 ; 52D2 ;  MA      # ( 勒 → 勒 ) CJK COMPATIBILITY IDEOGRAPH-F952 → CJK UNIFIED IDEOGRAPH-52D2       # 
+
+F92F ; 52DE ;  MA      # ( 勞 → 勞 ) CJK COMPATIBILITY IDEOGRAPH-F92F → CJK UNIFIED IDEOGRAPH-52DE       # 
+
+FA34 ; 52E4 ;  MA      # ( 勤 → 勤 ) CJK COMPATIBILITY IDEOGRAPH-FA34 → CJK UNIFIED IDEOGRAPH-52E4       # 
+2F827 ;        52E4 ;  MA      # ( 勤 → 勤 ) CJK COMPATIBILITY IDEOGRAPH-2F827 → CJK UNIFIED IDEOGRAPH-52E4     # 
+
+F97F ; 52F5 ;  MA      # ( 勵 → 勵 ) CJK COMPATIBILITY IDEOGRAPH-F97F → CJK UNIFIED IDEOGRAPH-52F5       # 
+
+2F13 ; 52F9 ;  MA      #* ( ⼓ → 勹 ) KANGXI RADICAL WRAP → CJK UNIFIED IDEOGRAPH-52F9   # 
+
+FA77 ; 52FA ;  MA      # ( 勺 → 勺 ) CJK COMPATIBILITY IDEOGRAPH-FA77 → CJK UNIFIED IDEOGRAPH-52FA       # 
+2F828 ;        52FA ;  MA      # ( 勺 → 勺 ) CJK COMPATIBILITY IDEOGRAPH-2F828 → CJK UNIFIED IDEOGRAPH-52FA     # 
+
+2F829 ;        5305 ;  MA      # ( 包 → 包 ) CJK COMPATIBILITY IDEOGRAPH-2F829 → CJK UNIFIED IDEOGRAPH-5305     # 
+
+2F82A ;        5306 ;  MA      # ( 匆 → 匆 ) CJK COMPATIBILITY IDEOGRAPH-2F82A → CJK UNIFIED IDEOGRAPH-5306     # 
+
+2F14 ; 5315 ;  MA      #* ( ⼔ → 匕 ) KANGXI RADICAL SPOON → CJK UNIFIED IDEOGRAPH-5315  # 
+
+F963 ; 5317 ;  MA      # ( 北 → 北 ) CJK COMPATIBILITY IDEOGRAPH-F963 → CJK UNIFIED IDEOGRAPH-5317       # 
+2F82B ;        5317 ;  MA      # ( 北 → 北 ) CJK COMPATIBILITY IDEOGRAPH-2F82B → CJK UNIFIED IDEOGRAPH-5317     # 
+
+2F15 ; 531A ;  MA      #* ( ⼕ → 匚 ) KANGXI RADICAL RIGHT OPEN BOX → CJK UNIFIED IDEOGRAPH-531A # 
+
+2F16 ; 5338 ;  MA      #* ( ⼖ → 匸 ) KANGXI RADICAL HIDING ENCLOSURE → CJK UNIFIED IDEOGRAPH-5338       # 
+
+F9EB ; 533F ;  MA      # ( 匿 → 匿 ) CJK COMPATIBILITY IDEOGRAPH-F9EB → CJK UNIFIED IDEOGRAPH-533F       # 
+
+2F17 ; 5341 ;  MA      #* ( ⼗ → 十 ) KANGXI RADICAL TEN → CJK UNIFIED IDEOGRAPH-5341    # 
+3038 ; 5341 ;  MA      # ( 〸 → 十 ) HANGZHOU NUMERAL TEN → CJK UNIFIED IDEOGRAPH-5341   # 
+
+3039 ; 5344 ;  MA      # ( 〹 → 卄 ) HANGZHOU NUMERAL TWENTY → CJK UNIFIED IDEOGRAPH-5344        # 
+
+303A ; 5345 ;  MA      # ( 〺 → 卅 ) HANGZHOU NUMERAL THIRTY → CJK UNIFIED IDEOGRAPH-5345        # 
+
+2F82C ;        5349 ;  MA      # ( 卉 → 卉 ) CJK COMPATIBILITY IDEOGRAPH-2F82C → CJK UNIFIED IDEOGRAPH-5349     # 
+
+FA35 ; 5351 ;  MA      # ( 卑 → 卑 ) CJK COMPATIBILITY IDEOGRAPH-FA35 → CJK UNIFIED IDEOGRAPH-5351       # 
+2F82D ;        5351 ;  MA      # ( 卑 → 卑 ) CJK COMPATIBILITY IDEOGRAPH-2F82D → CJK UNIFIED IDEOGRAPH-5351     # 
+
+2F82E ;        535A ;  MA      # ( 博 → 博 ) CJK COMPATIBILITY IDEOGRAPH-2F82E → CJK UNIFIED IDEOGRAPH-535A     # 
+
+2F18 ; 535C ;  MA      #* ( ⼘ → 卜 ) KANGXI RADICAL DIVINATION → CJK UNIFIED IDEOGRAPH-535C     # 
+
+2F19 ; 5369 ;  MA      #* ( ⼙ → 卩 ) KANGXI RADICAL SEAL → CJK UNIFIED IDEOGRAPH-5369   # 
+
+2F82F ;        5373 ;  MA      # ( 即 → 即 ) CJK COMPATIBILITY IDEOGRAPH-2F82F → CJK UNIFIED IDEOGRAPH-5373     # 
+
+F91C ; 5375 ;  MA      # ( 卵 → 卵 ) CJK COMPATIBILITY IDEOGRAPH-F91C → CJK UNIFIED IDEOGRAPH-5375       # 
+
+2F830 ;        537D ;  MA      # ( 卽 → 卽 ) CJK COMPATIBILITY IDEOGRAPH-2F830 → CJK UNIFIED IDEOGRAPH-537D     # 
+
+2F831 ;        537F ;  MA      # ( 卿 → 卿 ) CJK COMPATIBILITY IDEOGRAPH-2F831 → CJK UNIFIED IDEOGRAPH-537F     # 
+2F832 ;        537F ;  MA      # ( 卿 → 卿 ) CJK COMPATIBILITY IDEOGRAPH-2F832 → CJK UNIFIED IDEOGRAPH-537F     # 
+2F833 ;        537F ;  MA      # ( 卿 → 卿 ) CJK COMPATIBILITY IDEOGRAPH-2F833 → CJK UNIFIED IDEOGRAPH-537F     # 
+
+2F1A ; 5382 ;  MA      #* ( ⼚ → 厂 ) KANGXI RADICAL CLIFF → CJK UNIFIED IDEOGRAPH-5382  # 
+
+2F1B ; 53B6 ;  MA      #* ( ⼛ → 厶 ) KANGXI RADICAL PRIVATE → CJK UNIFIED IDEOGRAPH-53B6        # 
+
+F96B ; 53C3 ;  MA      # ( 參 → 參 ) CJK COMPATIBILITY IDEOGRAPH-F96B → CJK UNIFIED IDEOGRAPH-53C3       # 
+
+2F1C ; 53C8 ;  MA      #* ( ⼜ → 又 ) KANGXI RADICAL AGAIN → CJK UNIFIED IDEOGRAPH-53C8  # 
+
+2F836 ;        53CA ;  MA      # ( 及 → 及 ) CJK COMPATIBILITY IDEOGRAPH-2F836 → CJK UNIFIED IDEOGRAPH-53CA     # 
+
+2F837 ;        53DF ;  MA      # ( 叟 → 叟 ) CJK COMPATIBILITY IDEOGRAPH-2F837 → CJK UNIFIED IDEOGRAPH-53DF     # 
+
+2F1D ; 53E3 ;  MA      #* ( ⼝ → 口 ) KANGXI RADICAL MOUTH → CJK UNIFIED IDEOGRAPH-53E3  # 
+
+F906 ; 53E5 ;  MA      # ( 句 → 句 ) CJK COMPATIBILITY IDEOGRAPH-F906 → CJK UNIFIED IDEOGRAPH-53E5       # 
+
+2F839 ;        53EB ;  MA      # ( 叫 → 叫 ) CJK COMPATIBILITY IDEOGRAPH-2F839 → CJK UNIFIED IDEOGRAPH-53EB     # 
+
+2F83A ;        53F1 ;  MA      # ( 叱 → 叱 ) CJK COMPATIBILITY IDEOGRAPH-2F83A → CJK UNIFIED IDEOGRAPH-53F1     # 
+
+2F83B ;        5406 ;  MA      # ( 吆 → 吆 ) CJK COMPATIBILITY IDEOGRAPH-2F83B → CJK UNIFIED IDEOGRAPH-5406     # 
+
+F9DE ; 540F ;  MA      # ( 吏 → 吏 ) CJK COMPATIBILITY IDEOGRAPH-F9DE → CJK UNIFIED IDEOGRAPH-540F       # 
+
+F9ED ; 541D ;  MA      # ( 吝 → 吝 ) CJK COMPATIBILITY IDEOGRAPH-F9ED → CJK UNIFIED IDEOGRAPH-541D       # 
+
+2F83D ;        5438 ;  MA      # ( 吸 → 吸 ) CJK COMPATIBILITY IDEOGRAPH-2F83D → CJK UNIFIED IDEOGRAPH-5438     # 
+
+F980 ; 5442 ;  MA      # ( 呂 → 呂 ) CJK COMPATIBILITY IDEOGRAPH-F980 → CJK UNIFIED IDEOGRAPH-5442       # 
+
+2F83E ;        5448 ;  MA      # ( 呈 → 呈 ) CJK COMPATIBILITY IDEOGRAPH-2F83E → CJK UNIFIED IDEOGRAPH-5448     # 
+
+2F83F ;        5468 ;  MA      # ( 周 → 周 ) CJK COMPATIBILITY IDEOGRAPH-2F83F → CJK UNIFIED IDEOGRAPH-5468     # 
+
+2F83C ;        549E ;  MA      # ( 咞 → 咞 ) CJK COMPATIBILITY IDEOGRAPH-2F83C → CJK UNIFIED IDEOGRAPH-549E     # 
+
+2F840 ;        54A2 ;  MA      # ( 咢 → 咢 ) CJK COMPATIBILITY IDEOGRAPH-2F840 → CJK UNIFIED IDEOGRAPH-54A2     # 
+
+F99E ; 54BD ;  MA      # ( 咽 → 咽 ) CJK COMPATIBILITY IDEOGRAPH-F99E → CJK UNIFIED IDEOGRAPH-54BD       # 
+
+2F841 ;        54F6 ;  MA      # ( 哶 → 哶 ) CJK COMPATIBILITY IDEOGRAPH-2F841 → CJK UNIFIED IDEOGRAPH-54F6     # 
+
+2F842 ;        5510 ;  MA      # ( 唐 → 唐 ) CJK COMPATIBILITY IDEOGRAPH-2F842 → CJK UNIFIED IDEOGRAPH-5510     # 
+
+2F843 ;        5553 ;  MA      # ( 啓 → 啓 ) CJK COMPATIBILITY IDEOGRAPH-2F843 → CJK UNIFIED IDEOGRAPH-5553     # 
+555F ; 5553 ;  MA      # ( 啟 → 啓 ) CJK UNIFIED IDEOGRAPH-555F → CJK UNIFIED IDEOGRAPH-5553     # 
+
+FA79 ; 5555 ;  MA      # ( 啕 → 啕 ) CJK COMPATIBILITY IDEOGRAPH-FA79 → CJK UNIFIED IDEOGRAPH-5555       # 
+
+2F844 ;        5563 ;  MA      # ( 啣 → 啣 ) CJK COMPATIBILITY IDEOGRAPH-2F844 → CJK UNIFIED IDEOGRAPH-5563     # 
+
+2F845 ;        5584 ;  MA      # ( 善 → 善 ) CJK COMPATIBILITY IDEOGRAPH-2F845 → CJK UNIFIED IDEOGRAPH-5584     # 
+2F846 ;        5584 ;  MA      # ( 善 → 善 ) CJK COMPATIBILITY IDEOGRAPH-2F846 → CJK UNIFIED IDEOGRAPH-5584     # 
+
+F90B ; 5587 ;  MA      # ( 喇 → 喇 ) CJK COMPATIBILITY IDEOGRAPH-F90B → CJK UNIFIED IDEOGRAPH-5587       # 
+
+FA7A ; 5599 ;  MA      # ( 喙 → 喙 ) CJK COMPATIBILITY IDEOGRAPH-FA7A → CJK UNIFIED IDEOGRAPH-5599       # 
+2F847 ;        5599 ;  MA      # ( 喙 → 喙 ) CJK COMPATIBILITY IDEOGRAPH-2F847 → CJK UNIFIED IDEOGRAPH-5599     # 
+
+FA36 ; 559D ;  MA      # ( 喝 → 喝 ) CJK COMPATIBILITY IDEOGRAPH-FA36 → CJK UNIFIED IDEOGRAPH-559D       # 
+FA78 ; 559D ;  MA      # ( 喝 → 喝 ) CJK COMPATIBILITY IDEOGRAPH-FA78 → CJK UNIFIED IDEOGRAPH-559D       # 
+
+2F848 ;        55AB ;  MA      # ( 喫 → 喫 ) CJK COMPATIBILITY IDEOGRAPH-2F848 → CJK UNIFIED IDEOGRAPH-55AB     # 
+
+2F849 ;        55B3 ;  MA      # ( 喳 → 喳 ) CJK COMPATIBILITY IDEOGRAPH-2F849 → CJK UNIFIED IDEOGRAPH-55B3     # 
+
+FA0D ; 55C0 ;  MA      # ( 嗀 → 嗀 ) CJK COMPATIBILITY IDEOGRAPH-FA0D → CJK UNIFIED IDEOGRAPH-55C0       # 
+
+2F84A ;        55C2 ;  MA      # ( 嗂 → 嗂 ) CJK COMPATIBILITY IDEOGRAPH-2F84A → CJK UNIFIED IDEOGRAPH-55C2     # 
+
+FA7B ; 55E2 ;  MA      # ( 嗢 → 嗢 ) CJK COMPATIBILITY IDEOGRAPH-FA7B → CJK UNIFIED IDEOGRAPH-55E2       # 
+
+FA37 ; 5606 ;  MA      # ( 嘆 → 嘆 ) CJK COMPATIBILITY IDEOGRAPH-FA37 → CJK UNIFIED IDEOGRAPH-5606       # 
+2F84C ;        5606 ;  MA      # ( 嘆 → 嘆 ) CJK COMPATIBILITY IDEOGRAPH-2F84C → CJK UNIFIED IDEOGRAPH-5606     # 
+
+2F84E ;        5651 ;  MA      # ( 噑 → 噑 ) CJK COMPATIBILITY IDEOGRAPH-2F84E → CJK UNIFIED IDEOGRAPH-5651     # 
+
+FA38 ; 5668 ;  MA      # ( 器 → 器 ) CJK COMPATIBILITY IDEOGRAPH-FA38 → CJK UNIFIED IDEOGRAPH-5668       # 
+
+2F84F ;        5674 ;  MA      # ( 噴 → 噴 ) CJK COMPATIBILITY IDEOGRAPH-2F84F → CJK UNIFIED IDEOGRAPH-5674     # 
+
+2F1E ; 56D7 ;  MA      #* ( ⼞ → 囗 ) KANGXI RADICAL ENCLOSURE → CJK UNIFIED IDEOGRAPH-56D7      # 
+
+F9A9 ; 56F9 ;  MA      # ( 囹 → 囹 ) CJK COMPATIBILITY IDEOGRAPH-F9A9 → CJK UNIFIED IDEOGRAPH-56F9       # 
+
+2F84B ;        5716 ;  MA      # ( 圖 → 圖 ) CJK COMPATIBILITY IDEOGRAPH-2F84B → CJK UNIFIED IDEOGRAPH-5716     # 
+
+2F84D ;        5717 ;  MA      # ( 圗 → 圗 ) CJK COMPATIBILITY IDEOGRAPH-2F84D → CJK UNIFIED IDEOGRAPH-5717     # 
+
+2F1F ; 571F ;  MA      #* ( ⼟ → 土 ) KANGXI RADICAL EARTH → CJK UNIFIED IDEOGRAPH-571F  # 
+
+2F855 ;        578B ;  MA      # ( 型 → 型 ) CJK COMPATIBILITY IDEOGRAPH-2F855 → CJK UNIFIED IDEOGRAPH-578B     # 
+
+2F852 ;        57CE ;  MA      # ( 城 → 城 ) CJK COMPATIBILITY IDEOGRAPH-2F852 → CJK UNIFIED IDEOGRAPH-57CE     # 
+
+2F853 ;        57F4 ;  MA      # ( 埴 → 埴 ) CJK COMPATIBILITY IDEOGRAPH-2F853 → CJK UNIFIED IDEOGRAPH-57F4     # 
+
+2F854 ;        580D ;  MA      # ( 堍 → 堍 ) CJK COMPATIBILITY IDEOGRAPH-2F854 → CJK UNIFIED IDEOGRAPH-580D     # 
+
+2F857 ;        5831 ;  MA      # ( 報 → 報 ) CJK COMPATIBILITY IDEOGRAPH-2F857 → CJK UNIFIED IDEOGRAPH-5831     # 
+
+2F856 ;        5832 ;  MA      # ( 堲 → 堲 ) CJK COMPATIBILITY IDEOGRAPH-2F856 → CJK UNIFIED IDEOGRAPH-5832     # 
+
+FA39 ; 5840 ;  MA      # ( 塀 → 塀 ) CJK COMPATIBILITY IDEOGRAPH-FA39 → CJK UNIFIED IDEOGRAPH-5840       # 
+
+FA10 ; 585A ;  MA      # ( 塚 → 塚 ) CJK COMPATIBILITY IDEOGRAPH-FA10 → CJK UNIFIED IDEOGRAPH-585A       # 
+FA7C ; 585A ;  MA      # ( 塚 → 塚 ) CJK COMPATIBILITY IDEOGRAPH-FA7C → CJK UNIFIED IDEOGRAPH-585A       # 
+
+F96C ; 585E ;  MA      # ( 塞 → 塞 ) CJK COMPATIBILITY IDEOGRAPH-F96C → CJK UNIFIED IDEOGRAPH-585E       # 
+
+586B ; 5861 ;  MA      # ( 填 → 塡 ) CJK UNIFIED IDEOGRAPH-586B → CJK UNIFIED IDEOGRAPH-5861     # 
+
+FA3A ; 58A8 ;  MA      # ( 墨 → 墨 ) CJK COMPATIBILITY IDEOGRAPH-FA3A → CJK UNIFIED IDEOGRAPH-58A8       # 
+
+58FF ; 58AB ;  MA      # ( 壿 → 墫 ) CJK UNIFIED IDEOGRAPH-58FF → CJK UNIFIED IDEOGRAPH-58AB     # 
+
+2F858 ;        58AC ;  MA      # ( 墬 → 墬 ) CJK COMPATIBILITY IDEOGRAPH-2F858 → CJK UNIFIED IDEOGRAPH-58AC     # 
+
+FA7D ; 58B3 ;  MA      # ( 墳 → 墳 ) CJK COMPATIBILITY IDEOGRAPH-FA7D → CJK UNIFIED IDEOGRAPH-58B3       # 
+
+F94A ; 58D8 ;  MA      # ( 壘 → 壘 ) CJK COMPATIBILITY IDEOGRAPH-F94A → CJK UNIFIED IDEOGRAPH-58D8       # 
+
+F942 ; 58DF ;  MA      # ( 壟 → 壟 ) CJK COMPATIBILITY IDEOGRAPH-F942 → CJK UNIFIED IDEOGRAPH-58DF       # 
+
+2F20 ; 58EB ;  MA      #* ( ⼠ → 士 ) KANGXI RADICAL SCHOLAR → CJK UNIFIED IDEOGRAPH-58EB        # 
+
+2F851 ;        58EE ;  MA      # ( 壮 → 壮 ) CJK COMPATIBILITY IDEOGRAPH-2F851 → CJK UNIFIED IDEOGRAPH-58EE     # 
+
+2F85A ;        58F2 ;  MA      # ( 売 → 売 ) CJK COMPATIBILITY IDEOGRAPH-2F85A → CJK UNIFIED IDEOGRAPH-58F2     # 
+
+2F85B ;        58F7 ;  MA      # ( 壷 → 壷 ) CJK COMPATIBILITY IDEOGRAPH-2F85B → CJK UNIFIED IDEOGRAPH-58F7     # 
+
+2F21 ; 5902 ;  MA      #* ( ⼡ → 夂 ) KANGXI RADICAL GO → CJK UNIFIED IDEOGRAPH-5902     # 
+
+2F85C ;        5906 ;  MA      # ( 夆 → 夆 ) CJK COMPATIBILITY IDEOGRAPH-2F85C → CJK UNIFIED IDEOGRAPH-5906     # 
+
+2F22 ; 590A ;  MA      #* ( ⼢ → 夊 ) KANGXI RADICAL GO SLOWLY → CJK UNIFIED IDEOGRAPH-590A      # 
+
+2F23 ; 5915 ;  MA      #* ( ⼣ → 夕 ) KANGXI RADICAL EVENING → CJK UNIFIED IDEOGRAPH-5915        # 
+
+2F85D ;        591A ;  MA      # ( 多 → 多 ) CJK COMPATIBILITY IDEOGRAPH-2F85D → CJK UNIFIED IDEOGRAPH-591A     # 
+
+2F85E ;        5922 ;  MA      # ( 夢 → 夢 ) CJK COMPATIBILITY IDEOGRAPH-2F85E → CJK UNIFIED IDEOGRAPH-5922     # 
+
+2F24 ; 5927 ;  MA      #* ( ⼤ → 大 ) KANGXI RADICAL BIG → CJK UNIFIED IDEOGRAPH-5927    # 
+
+FA7E ; 5944 ;  MA      # ( 奄 → 奄 ) CJK COMPATIBILITY IDEOGRAPH-FA7E → CJK UNIFIED IDEOGRAPH-5944       # 
+
+F90C ; 5948 ;  MA      # ( 奈 → 奈 ) CJK COMPATIBILITY IDEOGRAPH-F90C → CJK UNIFIED IDEOGRAPH-5948       # 
+
+F909 ; 5951 ;  MA      # ( 契 → 契 ) CJK COMPATIBILITY IDEOGRAPH-F909 → CJK UNIFIED IDEOGRAPH-5951       # 
+
+FA7F ; 5954 ;  MA      # ( 奔 → 奔 ) CJK COMPATIBILITY IDEOGRAPH-FA7F → CJK UNIFIED IDEOGRAPH-5954       # 
+
+2F85F ;        5962 ;  MA      # ( 奢 → 奢 ) CJK COMPATIBILITY IDEOGRAPH-2F85F → CJK UNIFIED IDEOGRAPH-5962     # 
+
+F981 ; 5973 ;  MA      # ( 女 → 女 ) CJK COMPATIBILITY IDEOGRAPH-F981 → CJK UNIFIED IDEOGRAPH-5973       # 
+2F25 ; 5973 ;  MA      #* ( ⼥ → 女 ) KANGXI RADICAL WOMAN → CJK UNIFIED IDEOGRAPH-5973  # 
+
+2F865 ;        59D8 ;  MA      # ( 姘 → 姘 ) CJK COMPATIBILITY IDEOGRAPH-2F865 → CJK UNIFIED IDEOGRAPH-59D8     # 
+
+2F862 ;        59EC ;  MA      # ( 姬 → 姬 ) CJK COMPATIBILITY IDEOGRAPH-2F862 → CJK UNIFIED IDEOGRAPH-59EC     # 
+
+2F863 ;        5A1B ;  MA      # ( 娛 → 娛 ) CJK COMPATIBILITY IDEOGRAPH-2F863 → CJK UNIFIED IDEOGRAPH-5A1B     # 
+
+2F864 ;        5A27 ;  MA      # ( 娧 → 娧 ) CJK COMPATIBILITY IDEOGRAPH-2F864 → CJK UNIFIED IDEOGRAPH-5A27     # 
+
+FA80 ; 5A62 ;  MA      # ( 婢 → 婢 ) CJK COMPATIBILITY IDEOGRAPH-FA80 → CJK UNIFIED IDEOGRAPH-5A62       # 
+
+2F866 ;        5A66 ;  MA      # ( 婦 → 婦 ) CJK COMPATIBILITY IDEOGRAPH-2F866 → CJK UNIFIED IDEOGRAPH-5A66     # 
+
+5B00 ; 5AAF ;  MA      # ( 嬀 → 媯 ) CJK UNIFIED IDEOGRAPH-5B00 → CJK UNIFIED IDEOGRAPH-5AAF     # 
+
+2F986 ;        5AB5 ;  MA      # ( 媵 → 媵 ) CJK COMPATIBILITY IDEOGRAPH-2F986 → CJK UNIFIED IDEOGRAPH-5AB5     # 
+
+2F869 ;        5B08 ;  MA      # ( 嬈 → 嬈 ) CJK COMPATIBILITY IDEOGRAPH-2F869 → CJK UNIFIED IDEOGRAPH-5B08     # 
+
+FA81 ; 5B28 ;  MA      # ( 嬨 → 嬨 ) CJK COMPATIBILITY IDEOGRAPH-FA81 → CJK UNIFIED IDEOGRAPH-5B28       # 
+
+2F86A ;        5B3E ;  MA      # ( 嬾 → 嬾 ) CJK COMPATIBILITY IDEOGRAPH-2F86A → CJK UNIFIED IDEOGRAPH-5B3E     # 
+2F86B ;        5B3E ;  MA      # ( 嬾 → 嬾 ) CJK COMPATIBILITY IDEOGRAPH-2F86B → CJK UNIFIED IDEOGRAPH-5B3E     # 
+
+2F26 ; 5B50 ;  MA      #* ( ⼦ → 子 ) KANGXI RADICAL CHILD → CJK UNIFIED IDEOGRAPH-5B50  # 
+
+2F27 ; 5B80 ;  MA      #* ( ⼧ → 宀 ) KANGXI RADICAL ROOF → CJK UNIFIED IDEOGRAPH-5B80   # 
+
+FA04 ; 5B85 ;  MA      # ( 宅 → 宅 ) CJK COMPATIBILITY IDEOGRAPH-FA04 → CJK UNIFIED IDEOGRAPH-5B85       # 
+
+2F86D ;        5BC3 ;  MA      # ( 寃 → 寃 ) CJK COMPATIBILITY IDEOGRAPH-2F86D → CJK UNIFIED IDEOGRAPH-5BC3     # 
+
+2F86E ;        5BD8 ;  MA      # ( 寘 → 寘 ) CJK COMPATIBILITY IDEOGRAPH-2F86E → CJK UNIFIED IDEOGRAPH-5BD8     # 
+
+F95F ; 5BE7 ;  MA      # ( 寧 → 寧 ) CJK COMPATIBILITY IDEOGRAPH-F95F → CJK UNIFIED IDEOGRAPH-5BE7       # 
+F9AA ; 5BE7 ;  MA      # ( 寧 → 寧 ) CJK COMPATIBILITY IDEOGRAPH-F9AA → CJK UNIFIED IDEOGRAPH-5BE7       # 
+2F86F ;        5BE7 ;  MA      # ( 寧 → 寧 ) CJK COMPATIBILITY IDEOGRAPH-2F86F → CJK UNIFIED IDEOGRAPH-5BE7     # 
+
+F9BC ; 5BEE ;  MA      # ( 寮 → 寮 ) CJK COMPATIBILITY IDEOGRAPH-F9BC → CJK UNIFIED IDEOGRAPH-5BEE       # 
+
+2F870 ;        5BF3 ;  MA      # ( 寳 → 寳 ) CJK COMPATIBILITY IDEOGRAPH-2F870 → CJK UNIFIED IDEOGRAPH-5BF3     # 
+
+2F28 ; 5BF8 ;  MA      #* ( ⼨ → 寸 ) KANGXI RADICAL INCH → CJK UNIFIED IDEOGRAPH-5BF8   # 
+
+2F872 ;        5BFF ;  MA      # ( 寿 → 寿 ) CJK COMPATIBILITY IDEOGRAPH-2F872 → CJK UNIFIED IDEOGRAPH-5BFF     # 
+
+2F873 ;        5C06 ;  MA      # ( 将 → 将 ) CJK COMPATIBILITY IDEOGRAPH-2F873 → CJK UNIFIED IDEOGRAPH-5C06     # 
+
+2F29 ; 5C0F ;  MA      #* ( ⼩ → 小 ) KANGXI RADICAL SMALL → CJK UNIFIED IDEOGRAPH-5C0F  # 
+
+2F875 ;        5C22 ;  MA      # ( 尢 → 尢 ) CJK COMPATIBILITY IDEOGRAPH-2F875 → CJK UNIFIED IDEOGRAPH-5C22     # 
+2E90 ; 5C22 ;  MA      #* ( ⺐ → 尢 ) CJK RADICAL LAME THREE → CJK UNIFIED IDEOGRAPH-5C22        # 
+2F2A ; 5C22 ;  MA      #* ( ⼪ → 尢 ) KANGXI RADICAL LAME → CJK UNIFIED IDEOGRAPH-5C22   # 
+
+2E8F ; 5C23 ;  MA      #* ( ⺏ → 尣 ) CJK RADICAL LAME TWO → CJK UNIFIED IDEOGRAPH-5C23  # 
+
+2F2B ; 5C38 ;  MA      #* ( ⼫ → 尸 ) KANGXI RADICAL CORPSE → CJK UNIFIED IDEOGRAPH-5C38 # 
+
+F9BD ; 5C3F ;  MA      # ( 尿 → 尿 ) CJK COMPATIBILITY IDEOGRAPH-F9BD → CJK UNIFIED IDEOGRAPH-5C3F       # 
+
+2F877 ;        5C60 ;  MA      # ( 屠 → 屠 ) CJK COMPATIBILITY IDEOGRAPH-2F877 → CJK UNIFIED IDEOGRAPH-5C60     # 
+
+F94B ; 5C62 ;  MA      # ( 屢 → 屢 ) CJK COMPATIBILITY IDEOGRAPH-F94B → CJK UNIFIED IDEOGRAPH-5C62       # 
+
+FA3B ; 5C64 ;  MA      # ( 層 → 層 ) CJK COMPATIBILITY IDEOGRAPH-FA3B → CJK UNIFIED IDEOGRAPH-5C64       # 
+
+F9DF ; 5C65 ;  MA      # ( 履 → 履 ) CJK COMPATIBILITY IDEOGRAPH-F9DF → CJK UNIFIED IDEOGRAPH-5C65       # 
+
+FA3C ; 5C6E ;  MA      # ( 屮 → 屮 ) CJK COMPATIBILITY IDEOGRAPH-FA3C → CJK UNIFIED IDEOGRAPH-5C6E       # 
+2F878 ;        5C6E ;  MA      # ( 屮 → 屮 ) CJK COMPATIBILITY IDEOGRAPH-2F878 → CJK UNIFIED IDEOGRAPH-5C6E     # 
+2F2C ; 5C6E ;  MA      #* ( ⼬ → 屮 ) KANGXI RADICAL SPROUT → CJK UNIFIED IDEOGRAPH-5C6E # 
+
+2F2D ; 5C71 ;  MA      #* ( ⼭ → 山 ) KANGXI RADICAL MOUNTAIN → CJK UNIFIED IDEOGRAPH-5C71       # 
+
+2F87A ;        5C8D ;  MA      # ( 岍 → 岍 ) CJK COMPATIBILITY IDEOGRAPH-2F87A → CJK UNIFIED IDEOGRAPH-5C8D     # 
+
+2F879 ;        5CC0 ;  MA      # ( 峀 → 峀 ) CJK COMPATIBILITY IDEOGRAPH-2F879 → CJK UNIFIED IDEOGRAPH-5CC0     # 
+
+F9D5 ; 5D19 ;  MA      # ( 崙 → 崙 ) CJK COMPATIBILITY IDEOGRAPH-F9D5 → CJK UNIFIED IDEOGRAPH-5D19       # 
+
+2F87C ;        5D43 ;  MA      # ( 嵃 → 嵃 ) CJK COMPATIBILITY IDEOGRAPH-2F87C → CJK UNIFIED IDEOGRAPH-5D43     # 
+
+F921 ; 5D50 ;  MA      # ( 嵐 → 嵐 ) CJK COMPATIBILITY IDEOGRAPH-F921 → CJK UNIFIED IDEOGRAPH-5D50       # 
+
+2F87F ;        5D6B ;  MA      # ( 嵫 → 嵫 ) CJK COMPATIBILITY IDEOGRAPH-2F87F → CJK UNIFIED IDEOGRAPH-5D6B     # 
+
+2F87E ;        5D6E ;  MA      # ( 嵮 → 嵮 ) CJK COMPATIBILITY IDEOGRAPH-2F87E → CJK UNIFIED IDEOGRAPH-5D6E     # 
+
+2F880 ;        5D7C ;  MA      # ( 嵼 → 嵼 ) CJK COMPATIBILITY IDEOGRAPH-2F880 → CJK UNIFIED IDEOGRAPH-5D7C     # 
+
+2F9F4 ;        5DB2 ;  MA      # ( 嶲 → 嶲 ) CJK COMPATIBILITY IDEOGRAPH-2F9F4 → CJK UNIFIED IDEOGRAPH-5DB2     # 
+
+F9AB ; 5DBA ;  MA      # ( 嶺 → 嶺 ) CJK COMPATIBILITY IDEOGRAPH-F9AB → CJK UNIFIED IDEOGRAPH-5DBA       # 
+
+2F2E ; 5DDB ;  MA      #* ( ⼮ → 巛 ) KANGXI RADICAL RIVER → CJK UNIFIED IDEOGRAPH-5DDB  # 
+
+2F881 ;        5DE1 ;  MA      # ( 巡 → 巡 ) CJK COMPATIBILITY IDEOGRAPH-2F881 → CJK UNIFIED IDEOGRAPH-5DE1     # 
+
+2F882 ;        5DE2 ;  MA      # ( 巢 → 巢 ) CJK COMPATIBILITY IDEOGRAPH-2F882 → CJK UNIFIED IDEOGRAPH-5DE2     # 
+
+2F2F ; 5DE5 ;  MA      #* ( ⼯ → 工 ) KANGXI RADICAL WORK → CJK UNIFIED IDEOGRAPH-5DE5   # 
+
+2F30 ; 5DF1 ;  MA      #* ( ⼰ → 己 ) KANGXI RADICAL ONESELF → CJK UNIFIED IDEOGRAPH-5DF1        # 
+
+2E92 ; 5DF3 ;  MA      #* ( ⺒ → 巳 ) CJK RADICAL SNAKE → CJK UNIFIED IDEOGRAPH-5DF3     # 
+
+2F884 ;        5DFD ;  MA      # ( 巽 → 巽 ) CJK COMPATIBILITY IDEOGRAPH-2F884 → CJK UNIFIED IDEOGRAPH-5DFD     # 
+
+2F31 ; 5DFE ;  MA      #* ( ⼱ → 巾 ) KANGXI RADICAL TURBAN → CJK UNIFIED IDEOGRAPH-5DFE # 
+
+5E32 ; 5E21 ;  MA      # ( 帲 → 帡 ) CJK UNIFIED IDEOGRAPH-5E32 → CJK UNIFIED IDEOGRAPH-5E21     # 
+
+2F885 ;        5E28 ;  MA      # ( 帨 → 帨 ) CJK COMPATIBILITY IDEOGRAPH-2F885 → CJK UNIFIED IDEOGRAPH-5E28     # 
+
+2F886 ;        5E3D ;  MA      # ( 帽 → 帽 ) CJK COMPATIBILITY IDEOGRAPH-2F886 → CJK UNIFIED IDEOGRAPH-5E3D     # 
+
+2F887 ;        5E69 ;  MA      # ( 幩 → 幩 ) CJK COMPATIBILITY IDEOGRAPH-2F887 → CJK UNIFIED IDEOGRAPH-5E69     # 
+
+2F32 ; 5E72 ;  MA      #* ( ⼲ → 干 ) KANGXI RADICAL DRY → CJK UNIFIED IDEOGRAPH-5E72    # 
+
+F98E ; 5E74 ;  MA      # ( 年 → 年 ) CJK COMPATIBILITY IDEOGRAPH-F98E → CJK UNIFIED IDEOGRAPH-5E74       # 
+
+2E93 ; 5E7A ;  MA      #* ( ⺓ → 幺 ) CJK RADICAL THREAD → CJK UNIFIED IDEOGRAPH-5E7A    # 
+2F33 ; 5E7A ;  MA      #* ( ⼳ → 幺 ) KANGXI RADICAL SHORT THREAD → CJK UNIFIED IDEOGRAPH-5E7A   # 
+
+2F34 ; 5E7F ;  MA      #* ( ⼴ → 广 ) KANGXI RADICAL DOTTED CLIFF → CJK UNIFIED IDEOGRAPH-5E7F   # 
+
+FA01 ; 5EA6 ;  MA      # ( 度 → 度 ) CJK COMPATIBILITY IDEOGRAPH-FA01 → CJK UNIFIED IDEOGRAPH-5EA6       # 
+
+2F88B ;        5EB0 ;  MA      # ( 庰 → 庰 ) CJK COMPATIBILITY IDEOGRAPH-2F88B → CJK UNIFIED IDEOGRAPH-5EB0     # 
+
+2F88C ;        5EB3 ;  MA      # ( 庳 → 庳 ) CJK COMPATIBILITY IDEOGRAPH-2F88C → CJK UNIFIED IDEOGRAPH-5EB3     # 
+
+2F88D ;        5EB6 ;  MA      # ( 庶 → 庶 ) CJK COMPATIBILITY IDEOGRAPH-2F88D → CJK UNIFIED IDEOGRAPH-5EB6     # 
+
+F9A2 ; 5EC9 ;  MA      # ( 廉 → 廉 ) CJK COMPATIBILITY IDEOGRAPH-F9A2 → CJK UNIFIED IDEOGRAPH-5EC9       # 
+
+F928 ; 5ECA ;  MA      # ( 廊 → 廊 ) CJK COMPATIBILITY IDEOGRAPH-F928 → CJK UNIFIED IDEOGRAPH-5ECA       # 
+2F88E ;        5ECA ;  MA      # ( 廊 → 廊 ) CJK COMPATIBILITY IDEOGRAPH-2F88E → CJK UNIFIED IDEOGRAPH-5ECA     # 
+
+FA82 ; 5ED2 ;  MA      # ( 廒 → 廒 ) CJK COMPATIBILITY IDEOGRAPH-FA82 → CJK UNIFIED IDEOGRAPH-5ED2       # 
+
+FA0B ; 5ED3 ;  MA      # ( 廓 → 廓 ) CJK COMPATIBILITY IDEOGRAPH-FA0B → CJK UNIFIED IDEOGRAPH-5ED3       # 
+
+FA83 ; 5ED9 ;  MA      # ( 廙 → 廙 ) CJK COMPATIBILITY IDEOGRAPH-FA83 → CJK UNIFIED IDEOGRAPH-5ED9       # 
+
+F982 ; 5EEC ;  MA      # ( 廬 → 廬 ) CJK COMPATIBILITY IDEOGRAPH-F982 → CJK UNIFIED IDEOGRAPH-5EEC       # 
+
+2F35 ; 5EF4 ;  MA      #* ( ⼵ → 廴 ) KANGXI RADICAL LONG STRIDE → CJK UNIFIED IDEOGRAPH-5EF4    # 
+
+2F890 ;        5EFE ;  MA      # ( 廾 → 廾 ) CJK COMPATIBILITY IDEOGRAPH-2F890 → CJK UNIFIED IDEOGRAPH-5EFE     # 
+2F36 ; 5EFE ;  MA      #* ( ⼶ → 廾 ) KANGXI RADICAL TWO HANDS → CJK UNIFIED IDEOGRAPH-5EFE      # 
+
+F943 ; 5F04 ;  MA      # ( 弄 → 弄 ) CJK COMPATIBILITY IDEOGRAPH-F943 → CJK UNIFIED IDEOGRAPH-5F04       # 
+
+2F37 ; 5F0B ;  MA      #* ( ⼷ → 弋 ) KANGXI RADICAL SHOOT → CJK UNIFIED IDEOGRAPH-5F0B  # 
+
+2F38 ; 5F13 ;  MA      #* ( ⼸ → 弓 ) KANGXI RADICAL BOW → CJK UNIFIED IDEOGRAPH-5F13    # 
+
+2F894 ;        5F22 ;  MA      # ( 弢 → 弢 ) CJK COMPATIBILITY IDEOGRAPH-2F894 → CJK UNIFIED IDEOGRAPH-5F22     # 
+2F895 ;        5F22 ;  MA      # ( 弢 → 弢 ) CJK COMPATIBILITY IDEOGRAPH-2F895 → CJK UNIFIED IDEOGRAPH-5F22     # 
+
+2F39 ; 5F50 ;  MA      #* ( ⼹ → 彐 ) KANGXI RADICAL SNOUT → CJK UNIFIED IDEOGRAPH-5F50  # 
+
+2E94 ; 5F51 ;  MA      #* ( ⺔ → 彑 ) CJK RADICAL SNOUT ONE → CJK UNIFIED IDEOGRAPH-5F51 # 
+
+2F874 ;        5F53 ;  MA      # ( 当 → 当 ) CJK COMPATIBILITY IDEOGRAPH-2F874 → CJK UNIFIED IDEOGRAPH-5F53     # 
+
+2F3A ; 5F61 ;  MA      #* ( ⼺ → 彡 ) KANGXI RADICAL BRISTLE → CJK UNIFIED IDEOGRAPH-5F61        # 
+
+2F899 ;        5F62 ;  MA      # ( 形 → 形 ) CJK COMPATIBILITY IDEOGRAPH-2F899 → CJK UNIFIED IDEOGRAPH-5F62     # 
+
+FA84 ; 5F69 ;  MA      # ( 彩 → 彩 ) CJK COMPATIBILITY IDEOGRAPH-FA84 → CJK UNIFIED IDEOGRAPH-5F69       # 
+
+2F89A ;        5F6B ;  MA      # ( 彫 → 彫 ) CJK COMPATIBILITY IDEOGRAPH-2F89A → CJK UNIFIED IDEOGRAPH-5F6B     # 
+
+2F3B ; 5F73 ;  MA      #* ( ⼻ → 彳 ) KANGXI RADICAL STEP → CJK UNIFIED IDEOGRAPH-5F73   # 
+
+F9D8 ; 5F8B ;  MA      # ( 律 → 律 ) CJK COMPATIBILITY IDEOGRAPH-F9D8 → CJK UNIFIED IDEOGRAPH-5F8B       # 
+
+2F89C ;        5F9A ;  MA      # ( 徚 → 徚 ) CJK COMPATIBILITY IDEOGRAPH-2F89C → CJK UNIFIED IDEOGRAPH-5F9A     # 
+
+F966 ; 5FA9 ;  MA      # ( 復 → 復 ) CJK COMPATIBILITY IDEOGRAPH-F966 → CJK UNIFIED IDEOGRAPH-5FA9       # 
+
+FA85 ; 5FAD ;  MA      # ( 徭 → 徭 ) CJK COMPATIBILITY IDEOGRAPH-FA85 → CJK UNIFIED IDEOGRAPH-5FAD       # 
+
+2F3C ; 5FC3 ;  MA      #* ( ⼼ → 心 ) KANGXI RADICAL HEART → CJK UNIFIED IDEOGRAPH-5FC3  # 
+
+2E96 ; 5FC4 ;  MA      #* ( ⺖ → 忄 ) CJK RADICAL HEART ONE → CJK UNIFIED IDEOGRAPH-5FC4 # 
+
+2F89D ;        5FCD ;  MA      # ( 忍 → 忍 ) CJK COMPATIBILITY IDEOGRAPH-2F89D → CJK UNIFIED IDEOGRAPH-5FCD     # 
+
+2F89E ;        5FD7 ;  MA      # ( 志 → 志 ) CJK COMPATIBILITY IDEOGRAPH-2F89E → CJK UNIFIED IDEOGRAPH-5FD7     # 
+
+F9A3 ; 5FF5 ;  MA      # ( 念 → 念 ) CJK COMPATIBILITY IDEOGRAPH-F9A3 → CJK UNIFIED IDEOGRAPH-5FF5       # 
+
+2F89F ;        5FF9 ;  MA      # ( 忹 → 忹 ) CJK COMPATIBILITY IDEOGRAPH-2F89F → CJK UNIFIED IDEOGRAPH-5FF9     # 
+
+F960 ; 6012 ;  MA      # ( 怒 → 怒 ) CJK COMPATIBILITY IDEOGRAPH-F960 → CJK UNIFIED IDEOGRAPH-6012       # 
+
+F9AC ; 601C ;  MA      # ( 怜 → 怜 ) CJK COMPATIBILITY IDEOGRAPH-F9AC → CJK UNIFIED IDEOGRAPH-601C       # 
+
+FA6B ; 6075 ;  MA      # ( 恵 → 恵 ) CJK COMPATIBILITY IDEOGRAPH-FA6B → CJK UNIFIED IDEOGRAPH-6075       # 
+
+2F8A0 ;        6081 ;  MA      # ( 悁 → 悁 ) CJK COMPATIBILITY IDEOGRAPH-2F8A0 → CJK UNIFIED IDEOGRAPH-6081     # 
+
+FA3D ; 6094 ;  MA      # ( 悔 → 悔 ) CJK COMPATIBILITY IDEOGRAPH-FA3D → CJK UNIFIED IDEOGRAPH-6094       # 
+2F8A3 ;        6094 ;  MA      # ( 悔 → 悔 ) CJK COMPATIBILITY IDEOGRAPH-2F8A3 → CJK UNIFIED IDEOGRAPH-6094     # 
+
+2F8A5 ;        60C7 ;  MA      # ( 惇 → 惇 ) CJK COMPATIBILITY IDEOGRAPH-2F8A5 → CJK UNIFIED IDEOGRAPH-60C7     # 
+
+FA86 ; 60D8 ;  MA      # ( 惘 → 惘 ) CJK COMPATIBILITY IDEOGRAPH-FA86 → CJK UNIFIED IDEOGRAPH-60D8       # 
+
+F9B9 ; 60E1 ;  MA      # ( 惡 → 惡 ) CJK COMPATIBILITY IDEOGRAPH-F9B9 → CJK UNIFIED IDEOGRAPH-60E1       # 
+
+FA88 ; 6108 ;  MA      # ( 愈 → 愈 ) CJK COMPATIBILITY IDEOGRAPH-FA88 → CJK UNIFIED IDEOGRAPH-6108       # 
+
+F9D9 ; 6144 ;  MA      # ( 慄 → 慄 ) CJK COMPATIBILITY IDEOGRAPH-F9D9 → CJK UNIFIED IDEOGRAPH-6144       # 
+
+2F8A6 ;        6148 ;  MA      # ( 慈 → 慈 ) CJK COMPATIBILITY IDEOGRAPH-2F8A6 → CJK UNIFIED IDEOGRAPH-6148     # 
+
+2F8A7 ;        614C ;  MA      # ( 慌 → 慌 ) CJK COMPATIBILITY IDEOGRAPH-2F8A7 → CJK UNIFIED IDEOGRAPH-614C     # 
+2F8A9 ;        614C ;  MA      # ( 慌 → 慌 ) CJK COMPATIBILITY IDEOGRAPH-2F8A9 → CJK UNIFIED IDEOGRAPH-614C     # 
+
+FA87 ; 614E ;  MA      # ( 慎 → 慎 ) CJK COMPATIBILITY IDEOGRAPH-FA87 → CJK UNIFIED IDEOGRAPH-614E       # 
+2F8A8 ;        614E ;  MA      # ( 慎 → 慎 ) CJK COMPATIBILITY IDEOGRAPH-2F8A8 → CJK UNIFIED IDEOGRAPH-614E     # 
+
+FA8A ; 6160 ;  MA      # ( 慠 → 慠 ) CJK COMPATIBILITY IDEOGRAPH-FA8A → CJK UNIFIED IDEOGRAPH-6160       # 
+
+FA3E ; 6168 ;  MA      # ( 慨 → 慨 ) CJK COMPATIBILITY IDEOGRAPH-FA3E → CJK UNIFIED IDEOGRAPH-6168       # 
+
+2F8AA ;        617A ;  MA      # ( 慺 → 慺 ) CJK COMPATIBILITY IDEOGRAPH-2F8AA → CJK UNIFIED IDEOGRAPH-617A     # 
+
+FA3F ; 618E ;  MA      # ( 憎 → 憎 ) CJK COMPATIBILITY IDEOGRAPH-FA3F → CJK UNIFIED IDEOGRAPH-618E       # 
+FA89 ; 618E ;  MA      # ( 憎 → 憎 ) CJK COMPATIBILITY IDEOGRAPH-FA89 → CJK UNIFIED IDEOGRAPH-618E       # 
+2F8AB ;        618E ;  MA      # ( 憎 → 憎 ) CJK COMPATIBILITY IDEOGRAPH-2F8AB → CJK UNIFIED IDEOGRAPH-618E     # 
+
+F98F ; 6190 ;  MA      # ( 憐 → 憐 ) CJK COMPATIBILITY IDEOGRAPH-F98F → CJK UNIFIED IDEOGRAPH-6190       # 
+
+2F8AD ;        61A4 ;  MA      # ( 憤 → 憤 ) CJK COMPATIBILITY IDEOGRAPH-2F8AD → CJK UNIFIED IDEOGRAPH-61A4     # 
+
+2F8AE ;        61AF ;  MA      # ( 憯 → 憯 ) CJK COMPATIBILITY IDEOGRAPH-2F8AE → CJK UNIFIED IDEOGRAPH-61AF     # 
+
+2F8AC ;        61B2 ;  MA      # ( 憲 → 憲 ) CJK COMPATIBILITY IDEOGRAPH-2F8AC → CJK UNIFIED IDEOGRAPH-61B2     # 
+
+2F8AF ;        61DE ;  MA      # ( 懞 → 懞 ) CJK COMPATIBILITY IDEOGRAPH-2F8AF → CJK UNIFIED IDEOGRAPH-61DE     # 
+
+FA40 ; 61F2 ;  MA      # ( 懲 → 懲 ) CJK COMPATIBILITY IDEOGRAPH-FA40 → CJK UNIFIED IDEOGRAPH-61F2       # 
+FA8B ; 61F2 ;  MA      # ( 懲 → 懲 ) CJK COMPATIBILITY IDEOGRAPH-FA8B → CJK UNIFIED IDEOGRAPH-61F2       # 
+2F8B0 ;        61F2 ;  MA      # ( 懲 → 懲 ) CJK COMPATIBILITY IDEOGRAPH-2F8B0 → CJK UNIFIED IDEOGRAPH-61F2     # 
+
+F90D ; 61F6 ;  MA      # ( 懶 → 懶 ) CJK COMPATIBILITY IDEOGRAPH-F90D → CJK UNIFIED IDEOGRAPH-61F6       # 
+2F8B1 ;        61F6 ;  MA      # ( 懶 → 懶 ) CJK COMPATIBILITY IDEOGRAPH-2F8B1 → CJK UNIFIED IDEOGRAPH-61F6     # 
+
+F990 ; 6200 ;  MA      # ( 戀 → 戀 ) CJK COMPATIBILITY IDEOGRAPH-F990 → CJK UNIFIED IDEOGRAPH-6200       # 
+
+2F3D ; 6208 ;  MA      #* ( ⼽ → 戈 ) KANGXI RADICAL HALBERD → CJK UNIFIED IDEOGRAPH-6208        # 
+
+2F8B2 ;        6210 ;  MA      # ( 成 → 成 ) CJK COMPATIBILITY IDEOGRAPH-2F8B2 → CJK UNIFIED IDEOGRAPH-6210     # 
+
+2F8B3 ;        621B ;  MA      # ( 戛 → 戛 ) CJK COMPATIBILITY IDEOGRAPH-2F8B3 → CJK UNIFIED IDEOGRAPH-621B     # 
+
+F9D2 ; 622E ;  MA      # ( 戮 → 戮 ) CJK COMPATIBILITY IDEOGRAPH-F9D2 → CJK UNIFIED IDEOGRAPH-622E       # 
+
+FA8C ; 6234 ;  MA      # ( 戴 → 戴 ) CJK COMPATIBILITY IDEOGRAPH-FA8C → CJK UNIFIED IDEOGRAPH-6234       # 
+
+2F3E ; 6236 ;  MA      #* ( ⼾ → 戶 ) KANGXI RADICAL DOOR → CJK UNIFIED IDEOGRAPH-6236   # 
+6238 ; 6236 ;  MA      # ( 戸 → 戶 ) CJK UNIFIED IDEOGRAPH-6238 → CJK UNIFIED IDEOGRAPH-6236     # →⼾→
+
+2F3F ; 624B ;  MA      #* ( ⼿ → 手 ) KANGXI RADICAL HAND → CJK UNIFIED IDEOGRAPH-624B   # 
+
+2E98 ; 624C ;  MA      #* ( ⺘ → 扌 ) CJK RADICAL HAND → CJK UNIFIED IDEOGRAPH-624C      # 
+
+2F8B4 ;        625D ;  MA      # ( 扝 → 扝 ) CJK COMPATIBILITY IDEOGRAPH-2F8B4 → CJK UNIFIED IDEOGRAPH-625D     # 
+
+2F8B5 ;        62B1 ;  MA      # ( 抱 → 抱 ) CJK COMPATIBILITY IDEOGRAPH-2F8B5 → CJK UNIFIED IDEOGRAPH-62B1     # 
+
+F925 ; 62C9 ;  MA      # ( 拉 → 拉 ) CJK COMPATIBILITY IDEOGRAPH-F925 → CJK UNIFIED IDEOGRAPH-62C9       # 
+
+F95B ; 62CF ;  MA      # ( 拏 → 拏 ) CJK COMPATIBILITY IDEOGRAPH-F95B → CJK UNIFIED IDEOGRAPH-62CF       # 
+
+FA02 ; 62D3 ;  MA      # ( 拓 → 拓 ) CJK COMPATIBILITY IDEOGRAPH-FA02 → CJK UNIFIED IDEOGRAPH-62D3       # 
+
+2F8B6 ;        62D4 ;  MA      # ( 拔 → 拔 ) CJK COMPATIBILITY IDEOGRAPH-2F8B6 → CJK UNIFIED IDEOGRAPH-62D4     # 
+
+2F8BA ;        62FC ;  MA      # ( 拼 → 拼 ) CJK COMPATIBILITY IDEOGRAPH-2F8BA → CJK UNIFIED IDEOGRAPH-62FC     # 
+
+F973 ; 62FE ;  MA      # ( 拾 → 拾 ) CJK COMPATIBILITY IDEOGRAPH-F973 → CJK UNIFIED IDEOGRAPH-62FE       # 
+
+2F8B9 ;        633D ;  MA      # ( 挽 → 挽 ) CJK COMPATIBILITY IDEOGRAPH-2F8B9 → CJK UNIFIED IDEOGRAPH-633D     # 
+
+2F8B7 ;        6350 ;  MA      # ( 捐 → 捐 ) CJK COMPATIBILITY IDEOGRAPH-2F8B7 → CJK UNIFIED IDEOGRAPH-6350     # 
+
+2F8BB ;        6368 ;  MA      # ( 捨 → 捨 ) CJK COMPATIBILITY IDEOGRAPH-2F8BB → CJK UNIFIED IDEOGRAPH-6368     # 
+
+F9A4 ; 637B ;  MA      # ( 捻 → 捻 ) CJK COMPATIBILITY IDEOGRAPH-F9A4 → CJK UNIFIED IDEOGRAPH-637B       # 
+
+2F8BC ;        6383 ;  MA      # ( 掃 → 掃 ) CJK COMPATIBILITY IDEOGRAPH-2F8BC → CJK UNIFIED IDEOGRAPH-6383     # 
+
+F975 ; 63A0 ;  MA      # ( 掠 → 掠 ) CJK COMPATIBILITY IDEOGRAPH-F975 → CJK UNIFIED IDEOGRAPH-63A0       # 
+
+2F8C1 ;        63A9 ;  MA      # ( 掩 → 掩 ) CJK COMPATIBILITY IDEOGRAPH-2F8C1 → CJK UNIFIED IDEOGRAPH-63A9     # 
+
+FA8D ; 63C4 ;  MA      # ( 揄 → 揄 ) CJK COMPATIBILITY IDEOGRAPH-FA8D → CJK UNIFIED IDEOGRAPH-63C4       # 
+
+2F8C0 ;        63C5 ;  MA      # ( 揅 → 揅 ) CJK COMPATIBILITY IDEOGRAPH-2F8C0 → CJK UNIFIED IDEOGRAPH-63C5     # 
+
+2F8BD ;        63E4 ;  MA      # ( 揤 → 揤 ) CJK COMPATIBILITY IDEOGRAPH-2F8BD → CJK UNIFIED IDEOGRAPH-63E4     # 
+
+FA8E ; 641C ;  MA      # ( 搜 → 搜 ) CJK COMPATIBILITY IDEOGRAPH-FA8E → CJK UNIFIED IDEOGRAPH-641C       # 
+
+2F8BF ;        6422 ;  MA      # ( 搢 → 搢 ) CJK COMPATIBILITY IDEOGRAPH-2F8BF → CJK UNIFIED IDEOGRAPH-6422     # 
+
+FA8F ; 6452 ;  MA      # ( 摒 → 摒 ) CJK COMPATIBILITY IDEOGRAPH-FA8F → CJK UNIFIED IDEOGRAPH-6452       # 
+
+2F8C3 ;        6469 ;  MA      # ( 摩 → 摩 ) CJK COMPATIBILITY IDEOGRAPH-2F8C3 → CJK UNIFIED IDEOGRAPH-6469     # 
+
+2F8C6 ;        6477 ;  MA      # ( 摷 → 摷 ) CJK COMPATIBILITY IDEOGRAPH-2F8C6 → CJK UNIFIED IDEOGRAPH-6477     # 
+
+2F8C4 ;        647E ;  MA      # ( 摾 → 摾 ) CJK COMPATIBILITY IDEOGRAPH-2F8C4 → CJK UNIFIED IDEOGRAPH-647E     # 
+
+F991 ; 649A ;  MA      # ( 撚 → 撚 ) CJK COMPATIBILITY IDEOGRAPH-F991 → CJK UNIFIED IDEOGRAPH-649A       # 
+
+2F8C5 ;        649D ;  MA      # ( 撝 → 撝 ) CJK COMPATIBILITY IDEOGRAPH-2F8C5 → CJK UNIFIED IDEOGRAPH-649D     # 
+
+F930 ; 64C4 ;  MA      # ( 擄 → 擄 ) CJK COMPATIBILITY IDEOGRAPH-F930 → CJK UNIFIED IDEOGRAPH-64C4       # 
+
+2F40 ; 652F ;  MA      #* ( ⽀ → 支 ) KANGXI RADICAL BRANCH → CJK UNIFIED IDEOGRAPH-652F # 
+
+2F41 ; 6534 ;  MA      #* ( ⽁ → 攴 ) KANGXI RADICAL RAP → CJK UNIFIED IDEOGRAPH-6534    # 
+
+2E99 ; 6535 ;  MA      #* ( ⺙ → 攵 ) CJK RADICAL RAP → CJK UNIFIED IDEOGRAPH-6535       # 
+
+FA41 ; 654F ;  MA      # ( 敏 → 敏 ) CJK COMPATIBILITY IDEOGRAPH-FA41 → CJK UNIFIED IDEOGRAPH-654F       # 
+2F8C8 ;        654F ;  MA      # ( 敏 → 敏 ) CJK COMPATIBILITY IDEOGRAPH-2F8C8 → CJK UNIFIED IDEOGRAPH-654F     # 
+
+FA90 ; 6556 ;  MA      # ( 敖 → 敖 ) CJK COMPATIBILITY IDEOGRAPH-FA90 → CJK UNIFIED IDEOGRAPH-6556       # 
+
+2F8C9 ;        656C ;  MA      # ( 敬 → 敬 ) CJK COMPATIBILITY IDEOGRAPH-2F8C9 → CJK UNIFIED IDEOGRAPH-656C     # 
+
+F969 ; 6578 ;  MA      # ( 數 → 數 ) CJK COMPATIBILITY IDEOGRAPH-F969 → CJK UNIFIED IDEOGRAPH-6578       # 
+
+2F42 ; 6587 ;  MA      #* ( ⽂ → 文 ) KANGXI RADICAL SCRIPT → CJK UNIFIED IDEOGRAPH-6587 # 
+
+2EEB ; 6589 ;  MA      #* ( ⻫ → 斉 ) CJK RADICAL J-SIMPLIFIED EVEN → CJK UNIFIED IDEOGRAPH-6589 # 
+
+2F43 ; 6597 ;  MA      #* ( ⽃ → 斗 ) KANGXI RADICAL DIPPER → CJK UNIFIED IDEOGRAPH-6597 # 
+
+F9BE ; 6599 ;  MA      # ( 料 → 料 ) CJK COMPATIBILITY IDEOGRAPH-F9BE → CJK UNIFIED IDEOGRAPH-6599       # 
+
+2F44 ; 65A4 ;  MA      #* ( ⽄ → 斤 ) KANGXI RADICAL AXE → CJK UNIFIED IDEOGRAPH-65A4    # 
+
+2F45 ; 65B9 ;  MA      #* ( ⽅ → 方 ) KANGXI RADICAL SQUARE → CJK UNIFIED IDEOGRAPH-65B9 # 
+
+F983 ; 65C5 ;  MA      # ( 旅 → 旅 ) CJK COMPATIBILITY IDEOGRAPH-F983 → CJK UNIFIED IDEOGRAPH-65C5       # 
+
+2F46 ; 65E0 ;  MA      #* ( ⽆ → 无 ) KANGXI RADICAL NOT → CJK UNIFIED IDEOGRAPH-65E0    # 
+
+2E9B ; 65E1 ;  MA      #* ( ⺛ → 旡 ) CJK RADICAL CHOKE → CJK UNIFIED IDEOGRAPH-65E1     # 
+
+FA42 ; 65E2 ;  MA      # ( 既 → 既 ) CJK COMPATIBILITY IDEOGRAPH-FA42 → CJK UNIFIED IDEOGRAPH-65E2       # 
+
+2F8CB ;        65E3 ;  MA      # ( 旣 → 旣 ) CJK COMPATIBILITY IDEOGRAPH-2F8CB → CJK UNIFIED IDEOGRAPH-65E3     # 
+
+2F47 ; 65E5 ;  MA      #* ( ⽇ → 日 ) KANGXI RADICAL SUN → CJK UNIFIED IDEOGRAPH-65E5    # 
+
+F9E0 ; 6613 ;  MA      # ( 易 → 易 ) CJK COMPATIBILITY IDEOGRAPH-F9E0 → CJK UNIFIED IDEOGRAPH-6613       # 
+
+2F8CD ;        6649 ;  MA      # ( 晉 → 晉 ) CJK COMPATIBILITY IDEOGRAPH-2F8CD → CJK UNIFIED IDEOGRAPH-6649     # 
+
+6669 ; 665A ;  MA      # ( 晩 → 晚 ) CJK UNIFIED IDEOGRAPH-6669 → CJK UNIFIED IDEOGRAPH-665A     # 
+
+FA12 ; 6674 ;  MA      # ( 晴 → 晴 ) CJK COMPATIBILITY IDEOGRAPH-FA12 → CJK UNIFIED IDEOGRAPH-6674       # 
+FA91 ; 6674 ;  MA      # ( 晴 → 晴 ) CJK COMPATIBILITY IDEOGRAPH-FA91 → CJK UNIFIED IDEOGRAPH-6674       # 
+
+F9C5 ; 6688 ;  MA      # ( 暈 → 暈 ) CJK COMPATIBILITY IDEOGRAPH-F9C5 → CJK UNIFIED IDEOGRAPH-6688       # 
+
+FA43 ; 6691 ;  MA      # ( 暑 → 暑 ) CJK COMPATIBILITY IDEOGRAPH-FA43 → CJK UNIFIED IDEOGRAPH-6691       # 
+2F8CF ;        6691 ;  MA      # ( 暑 → 暑 ) CJK COMPATIBILITY IDEOGRAPH-2F8CF → CJK UNIFIED IDEOGRAPH-6691     # 
+
+2F8D5 ;        669C ;  MA      # ( 暜 → 暜 ) CJK COMPATIBILITY IDEOGRAPH-2F8D5 → CJK UNIFIED IDEOGRAPH-669C     # 
+
+FA06 ; 66B4 ;  MA      # ( 暴 → 暴 ) CJK COMPATIBILITY IDEOGRAPH-FA06 → CJK UNIFIED IDEOGRAPH-66B4       # 
+
+F98B ; 66C6 ;  MA      # ( 曆 → 曆 ) CJK COMPATIBILITY IDEOGRAPH-F98B → CJK UNIFIED IDEOGRAPH-66C6       # 
+
+2F48 ; 66F0 ;  MA      #* ( ⽈ → 曰 ) KANGXI RADICAL SAY → CJK UNIFIED IDEOGRAPH-66F0    # 
+
+F901 ; 66F4 ;  MA      # ( 更 → 更 ) CJK COMPATIBILITY IDEOGRAPH-F901 → CJK UNIFIED IDEOGRAPH-66F4       # 
+
+2F8CC ;        66F8 ;  MA      # ( 書 → 書 ) CJK COMPATIBILITY IDEOGRAPH-2F8CC → CJK UNIFIED IDEOGRAPH-66F8     # 
+
+2F8D4 ;        6700 ;  MA      # ( 最 → 最 ) CJK COMPATIBILITY IDEOGRAPH-2F8D4 → CJK UNIFIED IDEOGRAPH-6700     # 
+
+2F49 ; 6708 ;  MA      #* ( ⽉ → 月 ) KANGXI RADICAL MOON → CJK UNIFIED IDEOGRAPH-6708   # 
+
+80A6 ; 670C ;  MA      # ( 肦 → 朌 ) CJK UNIFIED IDEOGRAPH-80A6 → CJK UNIFIED IDEOGRAPH-670C     # 
+
+80D0 ; 670F ;  MA      # ( 胐 → 朏 ) CJK UNIFIED IDEOGRAPH-80D0 → CJK UNIFIED IDEOGRAPH-670F     # 
+
+80CA ; 6710 ;  MA      # ( 胊 → 朐 ) CJK UNIFIED IDEOGRAPH-80CA → CJK UNIFIED IDEOGRAPH-6710     # 
+
+8101 ; 6713 ;  MA      # ( 脁 → 朓 ) CJK UNIFIED IDEOGRAPH-8101 → CJK UNIFIED IDEOGRAPH-6713     # 
+
+F929 ; 6717 ;  MA      # ( 朗 → 朗 ) CJK COMPATIBILITY IDEOGRAPH-F929 → CJK UNIFIED IDEOGRAPH-6717       # 
+FA92 ; 6717 ;  MA      # ( 朗 → 朗 ) CJK COMPATIBILITY IDEOGRAPH-FA92 → CJK UNIFIED IDEOGRAPH-6717       # 
+2F8D8 ;        6717 ;  MA      # ( 朗 → 朗 ) CJK COMPATIBILITY IDEOGRAPH-2F8D8 → CJK UNIFIED IDEOGRAPH-6717     # 
+
+8127 ; 6718 ;  MA      # ( 脧 → 朘 ) CJK UNIFIED IDEOGRAPH-8127 → CJK UNIFIED IDEOGRAPH-6718     # 
+
+FA93 ; 671B ;  MA      # ( 望 → 望 ) CJK COMPATIBILITY IDEOGRAPH-FA93 → CJK UNIFIED IDEOGRAPH-671B       # 
+2F8D9 ;        671B ;  MA      # ( 望 → 望 ) CJK COMPATIBILITY IDEOGRAPH-2F8D9 → CJK UNIFIED IDEOGRAPH-671B     # 
+
+2F8DA ;        6721 ;  MA      # ( 朡 → 朡 ) CJK COMPATIBILITY IDEOGRAPH-2F8DA → CJK UNIFIED IDEOGRAPH-6721     # 
+
+81A7 ; 6723 ;  MA      # ( 膧 → 朣 ) CJK UNIFIED IDEOGRAPH-81A7 → CJK UNIFIED IDEOGRAPH-6723     # 
+
+2F4A ; 6728 ;  MA      #* ( ⽊ → 木 ) KANGXI RADICAL TREE → CJK UNIFIED IDEOGRAPH-6728   # 
+
+F9E1 ; 674E ;  MA      # ( 李 → 李 ) CJK COMPATIBILITY IDEOGRAPH-F9E1 → CJK UNIFIED IDEOGRAPH-674E       # 
+
+2F8DC ;        6753 ;  MA      # ( 杓 → 杓 ) CJK COMPATIBILITY IDEOGRAPH-2F8DC → CJK UNIFIED IDEOGRAPH-6753     # 
+
+FA94 ; 6756 ;  MA      # ( 杖 → 杖 ) CJK COMPATIBILITY IDEOGRAPH-FA94 → CJK UNIFIED IDEOGRAPH-6756       # 
+
+2F8DB ;        675E ;  MA      # ( 杞 → 杞 ) CJK COMPATIBILITY IDEOGRAPH-2F8DB → CJK UNIFIED IDEOGRAPH-675E     # 
+
+67FF ; 676E ;  MA      # ( 柿 → 杮 ) CJK UNIFIED IDEOGRAPH-67FF → CJK UNIFIED IDEOGRAPH-676E     # 
+
+F9C8 ; 677B ;  MA      # ( 杻 → 杻 ) CJK COMPATIBILITY IDEOGRAPH-F9C8 → CJK UNIFIED IDEOGRAPH-677B       # 
+
+2F8E0 ;        6785 ;  MA      # ( 枅 → 枅 ) CJK COMPATIBILITY IDEOGRAPH-2F8E0 → CJK UNIFIED IDEOGRAPH-6785     # 
+
+F9F4 ; 6797 ;  MA      # ( 林 → 林 ) CJK COMPATIBILITY IDEOGRAPH-F9F4 → CJK UNIFIED IDEOGRAPH-6797       # 
+
+F9C9 ; 67F3 ;  MA      # ( 柳 → 柳 ) CJK COMPATIBILITY IDEOGRAPH-F9C9 → CJK UNIFIED IDEOGRAPH-67F3       # 
+
+2F8DF ;        67FA ;  MA      # ( 柺 → 柺 ) CJK COMPATIBILITY IDEOGRAPH-2F8DF → CJK UNIFIED IDEOGRAPH-67FA     # 
+
+F9DA ; 6817 ;  MA      # ( 栗 → 栗 ) CJK COMPATIBILITY IDEOGRAPH-F9DA → CJK UNIFIED IDEOGRAPH-6817       # 
+
+2F8E5 ;        681F ;  MA      # ( 栟 → 栟 ) CJK COMPATIBILITY IDEOGRAPH-2F8E5 → CJK UNIFIED IDEOGRAPH-681F     # 
+
+2F8E1 ;        6852 ;  MA      # ( 桒 → 桒 ) CJK COMPATIBILITY IDEOGRAPH-2F8E1 → CJK UNIFIED IDEOGRAPH-6852     # 
+
+F97A ; 6881 ;  MA      # ( 梁 → 梁 ) CJK COMPATIBILITY IDEOGRAPH-F97A → CJK UNIFIED IDEOGRAPH-6881       # 
+
+FA44 ; 6885 ;  MA      # ( 梅 → 梅 ) CJK COMPATIBILITY IDEOGRAPH-FA44 → CJK UNIFIED IDEOGRAPH-6885       # 
+2F8E2 ;        6885 ;  MA      # ( 梅 → 梅 ) CJK COMPATIBILITY IDEOGRAPH-2F8E2 → CJK UNIFIED IDEOGRAPH-6885     # 
+
+2F8E4 ;        688E ;  MA      # ( 梎 → 梎 ) CJK COMPATIBILITY IDEOGRAPH-2F8E4 → CJK UNIFIED IDEOGRAPH-688E     # 
+
+F9E2 ; 68A8 ;  MA      # ( 梨 → 梨 ) CJK COMPATIBILITY IDEOGRAPH-F9E2 → CJK UNIFIED IDEOGRAPH-68A8       # 
+
+2F8E6 ;        6914 ;  MA      # ( 椔 → 椔 ) CJK COMPATIBILITY IDEOGRAPH-2F8E6 → CJK UNIFIED IDEOGRAPH-6914     # 
+
+2F8E8 ;        6942 ;  MA      # ( 楂 → 楂 ) CJK COMPATIBILITY IDEOGRAPH-2F8E8 → CJK UNIFIED IDEOGRAPH-6942     # 
+
+6A27 ; 699D ;  MA      # ( 樧 → 榝 ) CJK UNIFIED IDEOGRAPH-6A27 → CJK UNIFIED IDEOGRAPH-699D     # 
+
+2F8E9 ;        69A3 ;  MA      # ( 榣 → 榣 ) CJK COMPATIBILITY IDEOGRAPH-2F8E9 → CJK UNIFIED IDEOGRAPH-69A3     # 
+
+2F8EA ;        69EA ;  MA      # ( 槪 → 槪 ) CJK COMPATIBILITY IDEOGRAPH-2F8EA → CJK UNIFIED IDEOGRAPH-69EA     # 
+
+F914 ; 6A02 ;  MA      # ( 樂 → 樂 ) CJK COMPATIBILITY IDEOGRAPH-F914 → CJK UNIFIED IDEOGRAPH-6A02       # 
+F95C ; 6A02 ;  MA      # ( 樂 → 樂 ) CJK COMPATIBILITY IDEOGRAPH-F95C → CJK UNIFIED IDEOGRAPH-6A02       # 
+F9BF ; 6A02 ;  MA      # ( 樂 → 樂 ) CJK COMPATIBILITY IDEOGRAPH-F9BF → CJK UNIFIED IDEOGRAPH-6A02       # 
+
+F94C ; 6A13 ;  MA      # ( 樓 → 樓 ) CJK COMPATIBILITY IDEOGRAPH-F94C → CJK UNIFIED IDEOGRAPH-6A13       # 
+
+2F8EB ;        6AA8 ;  MA      # ( 檨 → 檨 ) CJK COMPATIBILITY IDEOGRAPH-2F8EB → CJK UNIFIED IDEOGRAPH-6AA8     # 
+
+F931 ; 6AD3 ;  MA      # ( 櫓 → 櫓 ) CJK COMPATIBILITY IDEOGRAPH-F931 → CJK UNIFIED IDEOGRAPH-6AD3       # 
+
+2F8ED ;        6ADB ;  MA      # ( 櫛 → 櫛 ) CJK COMPATIBILITY IDEOGRAPH-2F8ED → CJK UNIFIED IDEOGRAPH-6ADB     # 
+
+F91D ; 6B04 ;  MA      # ( 欄 → 欄 ) CJK COMPATIBILITY IDEOGRAPH-F91D → CJK UNIFIED IDEOGRAPH-6B04       # 
+
+2F4B ; 6B20 ;  MA      #* ( ⽋ → 欠 ) KANGXI RADICAL LACK → CJK UNIFIED IDEOGRAPH-6B20   # 
+
+2F8EF ;        6B21 ;  MA      # ( 次 → 次 ) CJK COMPATIBILITY IDEOGRAPH-2F8EF → CJK UNIFIED IDEOGRAPH-6B21     # 
+
+2F8F1 ;        6B54 ;  MA      # ( 歔 → 歔 ) CJK COMPATIBILITY IDEOGRAPH-2F8F1 → CJK UNIFIED IDEOGRAPH-6B54     # 
+
+2F4C ; 6B62 ;  MA      #* ( ⽌ → 止 ) KANGXI RADICAL STOP → CJK UNIFIED IDEOGRAPH-6B62   # 
+
+2EED ; 6B6F ;  MA      #* ( ⻭ → 歯 ) CJK RADICAL J-SIMPLIFIED TOOTH → CJK UNIFIED IDEOGRAPH-6B6F        # 
+
+2F8F3 ;        6B72 ;  MA      # ( 歲 → 歲 ) CJK COMPATIBILITY IDEOGRAPH-2F8F3 → CJK UNIFIED IDEOGRAPH-6B72     # 
+
+F98C ; 6B77 ;  MA      # ( 歷 → 歷 ) CJK COMPATIBILITY IDEOGRAPH-F98C → CJK UNIFIED IDEOGRAPH-6B77       # 
+
+FA95 ; 6B79 ;  MA      # ( 歹 → 歹 ) CJK COMPATIBILITY IDEOGRAPH-FA95 → CJK UNIFIED IDEOGRAPH-6B79       # 
+2F4D ; 6B79 ;  MA      #* ( ⽍ → 歹 ) KANGXI RADICAL DEATH → CJK UNIFIED IDEOGRAPH-6B79  # 
+
+2E9E ; 6B7A ;  MA      #* ( ⺞ → 歺 ) CJK RADICAL DEATH → CJK UNIFIED IDEOGRAPH-6B7A     # 
+
+2F8F4 ;        6B9F ;  MA      # ( 殟 → 殟 ) CJK COMPATIBILITY IDEOGRAPH-2F8F4 → CJK UNIFIED IDEOGRAPH-6B9F     # 
+
+F9A5 ; 6BAE ;  MA      # ( 殮 → 殮 ) CJK COMPATIBILITY IDEOGRAPH-F9A5 → CJK UNIFIED IDEOGRAPH-6BAE       # 
+
+2F4E ; 6BB3 ;  MA      #* ( ⽎ → 殳 ) KANGXI RADICAL WEAPON → CJK UNIFIED IDEOGRAPH-6BB3 # 
+
+F970 ; 6BBA ;  MA      # ( 殺 → 殺 ) CJK COMPATIBILITY IDEOGRAPH-F970 → CJK UNIFIED IDEOGRAPH-6BBA       # 
+FA96 ; 6BBA ;  MA      # ( 殺 → 殺 ) CJK COMPATIBILITY IDEOGRAPH-FA96 → CJK UNIFIED IDEOGRAPH-6BBA       # 
+2F8F5 ;        6BBA ;  MA      # ( 殺 → 殺 ) CJK COMPATIBILITY IDEOGRAPH-2F8F5 → CJK UNIFIED IDEOGRAPH-6BBA     # 
+
+2F8F6 ;        6BBB ;  MA      # ( 殻 → 殻 ) CJK COMPATIBILITY IDEOGRAPH-2F8F6 → CJK UNIFIED IDEOGRAPH-6BBB     # 
+
+2F4F ; 6BCB ;  MA      #* ( ⽏ → 毋 ) KANGXI RADICAL DO NOT → CJK UNIFIED IDEOGRAPH-6BCB # 
+
+2E9F ; 6BCD ;  MA      #* ( ⺟ → 母 ) CJK RADICAL MOTHER → CJK UNIFIED IDEOGRAPH-6BCD    # 
+
+2F50 ; 6BD4 ;  MA      #* ( ⽐ → 比 ) KANGXI RADICAL COMPARE → CJK UNIFIED IDEOGRAPH-6BD4        # 
+
+2F51 ; 6BDB ;  MA      #* ( ⽑ → 毛 ) KANGXI RADICAL FUR → CJK UNIFIED IDEOGRAPH-6BDB    # 
+
+2F52 ; 6C0F ;  MA      #* ( ⽒ → 氏 ) KANGXI RADICAL CLAN → CJK UNIFIED IDEOGRAPH-6C0F   # 
+
+2EA0 ; 6C11 ;  MA      #* ( ⺠ → 民 ) CJK RADICAL CIVILIAN → CJK UNIFIED IDEOGRAPH-6C11  # 
+
+2F53 ; 6C14 ;  MA      #* ( ⽓ → 气 ) KANGXI RADICAL STEAM → CJK UNIFIED IDEOGRAPH-6C14  # 
+
+2F54 ; 6C34 ;  MA      #* ( ⽔ → 水 ) KANGXI RADICAL WATER → CJK UNIFIED IDEOGRAPH-6C34  # 
+
+2EA1 ; 6C35 ;  MA      #* ( ⺡ → 氵 ) CJK RADICAL WATER ONE → CJK UNIFIED IDEOGRAPH-6C35 # 
+
+2EA2 ; 6C3A ;  MA      #* ( ⺢ → 氺 ) CJK RADICAL WATER TWO → CJK UNIFIED IDEOGRAPH-6C3A # 
+
+2F8FA ;        6C4E ;  MA      # ( 汎 → 汎 ) CJK COMPATIBILITY IDEOGRAPH-2F8FA → CJK UNIFIED IDEOGRAPH-6C4E     # 
+
+2F8FE ;        6C67 ;  MA      # ( 汧 → 汧 ) CJK COMPATIBILITY IDEOGRAPH-2F8FE → CJK UNIFIED IDEOGRAPH-6C67     # 
+
+F972 ; 6C88 ;  MA      # ( 沈 → 沈 ) CJK COMPATIBILITY IDEOGRAPH-F972 → CJK UNIFIED IDEOGRAPH-6C88       # 
+
+2F8FC ;        6CBF ;  MA      # ( 沿 → 沿 ) CJK COMPATIBILITY IDEOGRAPH-2F8FC → CJK UNIFIED IDEOGRAPH-6CBF     # 
+
+F968 ; 6CCC ;  MA      # ( 泌 → 泌 ) CJK COMPATIBILITY IDEOGRAPH-F968 → CJK UNIFIED IDEOGRAPH-6CCC       # 
+
+2F8FD ;        6CCD ;  MA      # ( 泍 → 泍 ) CJK COMPATIBILITY IDEOGRAPH-2F8FD → CJK UNIFIED IDEOGRAPH-6CCD     # 
+
+F9E3 ; 6CE5 ;  MA      # ( 泥 → 泥 ) CJK COMPATIBILITY IDEOGRAPH-F9E3 → CJK UNIFIED IDEOGRAPH-6CE5       # 
+
+2F8FF ;        6D16 ;  MA      # ( 洖 → 洖 ) CJK COMPATIBILITY IDEOGRAPH-2F8FF → CJK UNIFIED IDEOGRAPH-6D16     # 
+
+F915 ; 6D1B ;  MA      # ( 洛 → 洛 ) CJK COMPATIBILITY IDEOGRAPH-F915 → CJK UNIFIED IDEOGRAPH-6D1B       # 
+
+FA05 ; 6D1E ;  MA      # ( 洞 → 洞 ) CJK COMPATIBILITY IDEOGRAPH-FA05 → CJK UNIFIED IDEOGRAPH-6D1E       # 
+
+2F907 ;        6D34 ;  MA      # ( 洴 → 洴 ) CJK COMPATIBILITY IDEOGRAPH-2F907 → CJK UNIFIED IDEOGRAPH-6D34     # 
+
+2F900 ;        6D3E ;  MA      # ( 派 → 派 ) CJK COMPATIBILITY IDEOGRAPH-2F900 → CJK UNIFIED IDEOGRAPH-6D3E     # 
+
+F9CA ; 6D41 ;  MA      # ( 流 → 流 ) CJK COMPATIBILITY IDEOGRAPH-F9CA → CJK UNIFIED IDEOGRAPH-6D41       # 
+FA97 ; 6D41 ;  MA      # ( 流 → 流 ) CJK COMPATIBILITY IDEOGRAPH-FA97 → CJK UNIFIED IDEOGRAPH-6D41       # 
+2F902 ;        6D41 ;  MA      # ( 流 → 流 ) CJK COMPATIBILITY IDEOGRAPH-2F902 → CJK UNIFIED IDEOGRAPH-6D41     # 
+
+2F903 ;        6D69 ;  MA      # ( 浩 → 浩 ) CJK COMPATIBILITY IDEOGRAPH-2F903 → CJK UNIFIED IDEOGRAPH-6D69     # 
+
+F92A ; 6D6A ;  MA      # ( 浪 → 浪 ) CJK COMPATIBILITY IDEOGRAPH-F92A → CJK UNIFIED IDEOGRAPH-6D6A       # 
+
+FA45 ; 6D77 ;  MA      # ( 海 → 海 ) CJK COMPATIBILITY IDEOGRAPH-FA45 → CJK UNIFIED IDEOGRAPH-6D77       # 
+2F901 ;        6D77 ;  MA      # ( 海 → 海 ) CJK COMPATIBILITY IDEOGRAPH-2F901 → CJK UNIFIED IDEOGRAPH-6D77     # 
+
+2F904 ;        6D78 ;  MA      # ( 浸 → 浸 ) CJK COMPATIBILITY IDEOGRAPH-2F904 → CJK UNIFIED IDEOGRAPH-6D78     # 
+
+2F905 ;        6D85 ;  MA      # ( 涅 → 涅 ) CJK COMPATIBILITY IDEOGRAPH-2F905 → CJK UNIFIED IDEOGRAPH-6D85     # 
+
+F9F5 ; 6DCB ;  MA      # ( 淋 → 淋 ) CJK COMPATIBILITY IDEOGRAPH-F9F5 → CJK UNIFIED IDEOGRAPH-6DCB       # 
+
+F94D ; 6DDA ;  MA      # ( 淚 → 淚 ) CJK COMPATIBILITY IDEOGRAPH-F94D → CJK UNIFIED IDEOGRAPH-6DDA       # 
+
+F9D6 ; 6DEA ;  MA      # ( 淪 → 淪 ) CJK COMPATIBILITY IDEOGRAPH-F9D6 → CJK UNIFIED IDEOGRAPH-6DEA       # 
+
+2F90E ;        6DF9 ;  MA      # ( 淹 → 淹 ) CJK COMPATIBILITY IDEOGRAPH-2F90E → CJK UNIFIED IDEOGRAPH-6DF9     # 
+
+FA46 ; 6E1A ;  MA      # ( 渚 → 渚 ) CJK COMPATIBILITY IDEOGRAPH-FA46 → CJK UNIFIED IDEOGRAPH-6E1A       # 
+
+2F908 ;        6E2F ;  MA      # ( 港 → 港 ) CJK COMPATIBILITY IDEOGRAPH-2F908 → CJK UNIFIED IDEOGRAPH-6E2F     # 
+
+2F909 ;        6E6E ;  MA      # ( 湮 → 湮 ) CJK COMPATIBILITY IDEOGRAPH-2F909 → CJK UNIFIED IDEOGRAPH-6E6E     # 
+
+6F59 ; 6E88 ;  MA      # ( 潙 → 溈 ) CJK UNIFIED IDEOGRAPH-6F59 → CJK UNIFIED IDEOGRAPH-6E88     # 
+
+F9CB ; 6E9C ;  MA      # ( 溜 → 溜 ) CJK COMPATIBILITY IDEOGRAPH-F9CB → CJK UNIFIED IDEOGRAPH-6E9C       # 
+
+F9EC ; 6EBA ;  MA      # ( 溺 → 溺 ) CJK COMPATIBILITY IDEOGRAPH-F9EC → CJK UNIFIED IDEOGRAPH-6EBA       # 
+
+2F90C ;        6EC7 ;  MA      # ( 滇 → 滇 ) CJK COMPATIBILITY IDEOGRAPH-2F90C → CJK UNIFIED IDEOGRAPH-6EC7     # 
+
+FA99 ; 6ECB ;  MA      # ( 滋 → 滋 ) CJK COMPATIBILITY IDEOGRAPH-FA99 → CJK UNIFIED IDEOGRAPH-6ECB       # 
+2F90B ;        6ECB ;  MA      # ( 滋 → 滋 ) CJK COMPATIBILITY IDEOGRAPH-2F90B → CJK UNIFIED IDEOGRAPH-6ECB     # 
+
+F904 ; 6ED1 ;  MA      # ( 滑 → 滑 ) CJK COMPATIBILITY IDEOGRAPH-F904 → CJK UNIFIED IDEOGRAPH-6ED1       # 
+
+FA98 ; 6EDB ;  MA      # ( 滛 → 滛 ) CJK COMPATIBILITY IDEOGRAPH-FA98 → CJK UNIFIED IDEOGRAPH-6EDB       # 
+
+F94E ; 6F0F ;  MA      # ( 漏 → 漏 ) CJK COMPATIBILITY IDEOGRAPH-F94E → CJK UNIFIED IDEOGRAPH-6F0F       # 
+
+FA47 ; 6F22 ;  MA      # ( 漢 → 漢 ) CJK COMPATIBILITY IDEOGRAPH-FA47 → CJK UNIFIED IDEOGRAPH-6F22       # 
+FA9A ; 6F22 ;  MA      # ( 漢 → 漢 ) CJK COMPATIBILITY IDEOGRAPH-FA9A → CJK UNIFIED IDEOGRAPH-6F22       # 
+
+F992 ; 6F23 ;  MA      # ( 漣 → 漣 ) CJK COMPATIBILITY IDEOGRAPH-F992 → CJK UNIFIED IDEOGRAPH-6F23       # 
+
+2F90F ;        6F6E ;  MA      # ( 潮 → 潮 ) CJK COMPATIBILITY IDEOGRAPH-2F90F → CJK UNIFIED IDEOGRAPH-6F6E     # 
+
+2F912 ;        6FC6 ;  MA      # ( 濆 → 濆 ) CJK COMPATIBILITY IDEOGRAPH-2F912 → CJK UNIFIED IDEOGRAPH-6FC6     # 
+
+F922 ; 6FEB ;  MA      # ( 濫 → 濫 ) CJK COMPATIBILITY IDEOGRAPH-F922 → CJK UNIFIED IDEOGRAPH-6FEB       # 
+
+F984 ; 6FFE ;  MA      # ( 濾 → 濾 ) CJK COMPATIBILITY IDEOGRAPH-F984 → CJK UNIFIED IDEOGRAPH-6FFE       # 
+
+2F915 ;        701B ;  MA      # ( 瀛 → 瀛 ) CJK COMPATIBILITY IDEOGRAPH-2F915 → CJK UNIFIED IDEOGRAPH-701B     # 
+
+FA9B ; 701E ;  MA      # ( 瀞 → 瀞 ) CJK COMPATIBILITY IDEOGRAPH-FA9B → CJK UNIFIED IDEOGRAPH-701E       # 
+2F914 ;        701E ;  MA      # ( 瀞 → 瀞 ) CJK COMPATIBILITY IDEOGRAPH-2F914 → CJK UNIFIED IDEOGRAPH-701E     # 
+
+2F913 ;        7039 ;  MA      # ( 瀹 → 瀹 ) CJK COMPATIBILITY IDEOGRAPH-2F913 → CJK UNIFIED IDEOGRAPH-7039     # 
+
+2F917 ;        704A ;  MA      # ( 灊 → 灊 ) CJK COMPATIBILITY IDEOGRAPH-2F917 → CJK UNIFIED IDEOGRAPH-704A     # 
+
+2F55 ; 706B ;  MA      #* ( ⽕ → 火 ) KANGXI RADICAL FIRE → CJK UNIFIED IDEOGRAPH-706B   # 
+
+2EA3 ; 706C ;  MA      #* ( ⺣ → 灬 ) CJK RADICAL FIRE → CJK UNIFIED IDEOGRAPH-706C      # 
+
+2F835 ;        7070 ;  MA      # ( 灰 → 灰 ) CJK COMPATIBILITY IDEOGRAPH-2F835 → CJK UNIFIED IDEOGRAPH-7070     # 
+
+2F919 ;        7077 ;  MA      # ( 灷 → 灷 ) CJK COMPATIBILITY IDEOGRAPH-2F919 → CJK UNIFIED IDEOGRAPH-7077     # 
+
+2F918 ;        707D ;  MA      # ( 災 → 災 ) CJK COMPATIBILITY IDEOGRAPH-2F918 → CJK UNIFIED IDEOGRAPH-707D     # 
+
+F9FB ; 7099 ;  MA      # ( 炙 → 炙 ) CJK COMPATIBILITY IDEOGRAPH-F9FB → CJK UNIFIED IDEOGRAPH-7099       # 
+
+2F91A ;        70AD ;  MA      # ( 炭 → 炭 ) CJK COMPATIBILITY IDEOGRAPH-2F91A → CJK UNIFIED IDEOGRAPH-70AD     # 
+
+F99F ; 70C8 ;  MA      # ( 烈 → 烈 ) CJK COMPATIBILITY IDEOGRAPH-F99F → CJK UNIFIED IDEOGRAPH-70C8       # 
+
+F916 ; 70D9 ;  MA      # ( 烙 → 烙 ) CJK COMPATIBILITY IDEOGRAPH-F916 → CJK UNIFIED IDEOGRAPH-70D9       # 
+
+2F91C ;        7145 ;  MA      # ( 煅 → 煅 ) CJK COMPATIBILITY IDEOGRAPH-2F91C → CJK UNIFIED IDEOGRAPH-7145     # 
+
+F993 ; 7149 ;  MA      # ( 煉 → 煉 ) CJK COMPATIBILITY IDEOGRAPH-F993 → CJK UNIFIED IDEOGRAPH-7149       # 
+
+FA48 ; 716E ;  MA      # ( 煮 → 煮 ) CJK COMPATIBILITY IDEOGRAPH-FA48 → CJK UNIFIED IDEOGRAPH-716E       # 
+FA9C ; 716E ;  MA      # ( 煮 → 煮 ) CJK COMPATIBILITY IDEOGRAPH-FA9C → CJK UNIFIED IDEOGRAPH-716E       # 
+
+2F91E ;        719C ;  MA      # ( 熜 → 熜 ) CJK COMPATIBILITY IDEOGRAPH-2F91E → CJK UNIFIED IDEOGRAPH-719C     # 
+
+F9C0 ; 71CE ;  MA      # ( 燎 → 燎 ) CJK COMPATIBILITY IDEOGRAPH-F9C0 → CJK UNIFIED IDEOGRAPH-71CE       # 
+
+F9EE ; 71D0 ;  MA      # ( 燐 → 燐 ) CJK COMPATIBILITY IDEOGRAPH-F9EE → CJK UNIFIED IDEOGRAPH-71D0       # 
+
+F932 ; 7210 ;  MA      # ( 爐 → 爐 ) CJK COMPATIBILITY IDEOGRAPH-F932 → CJK UNIFIED IDEOGRAPH-7210       # 
+
+F91E ; 721B ;  MA      # ( 爛 → 爛 ) CJK COMPATIBILITY IDEOGRAPH-F91E → CJK UNIFIED IDEOGRAPH-721B       # 
+
+2F920 ;        7228 ;  MA      # ( 爨 → 爨 ) CJK COMPATIBILITY IDEOGRAPH-2F920 → CJK UNIFIED IDEOGRAPH-7228     # 
+
+2F56 ; 722A ;  MA      #* ( ⽖ → 爪 ) KANGXI RADICAL CLAW → CJK UNIFIED IDEOGRAPH-722A   # 
+
+FA49 ; 722B ;  MA      # ( 爫 → 爫 ) CJK COMPATIBILITY IDEOGRAPH-FA49 → CJK UNIFIED IDEOGRAPH-722B       # 
+2EA4 ; 722B ;  MA      #* ( ⺤ → 爫 ) CJK RADICAL PAW ONE → CJK UNIFIED IDEOGRAPH-722B   # 
+
+FA9E ; 7235 ;  MA      # ( 爵 → 爵 ) CJK COMPATIBILITY IDEOGRAPH-FA9E → CJK UNIFIED IDEOGRAPH-7235       # 
+2F921 ;        7235 ;  MA      # ( 爵 → 爵 ) CJK COMPATIBILITY IDEOGRAPH-2F921 → CJK UNIFIED IDEOGRAPH-7235     # 
+
+2F57 ; 7236 ;  MA      #* ( ⽗ → 父 ) KANGXI RADICAL FATHER → CJK UNIFIED IDEOGRAPH-7236 # 
+
+2F58 ; 723B ;  MA      #* ( ⽘ → 爻 ) KANGXI RADICAL DOUBLE X → CJK UNIFIED IDEOGRAPH-723B       # 
+
+2F59 ; 723F ;  MA      #* ( ⽙ → 爿 ) KANGXI RADICAL HALF TREE TRUNK → CJK UNIFIED IDEOGRAPH-723F        # 
+
+2F5A ; 7247 ;  MA      #* ( ⽚ → 片 ) KANGXI RADICAL SLICE → CJK UNIFIED IDEOGRAPH-7247  # 
+
+2F922 ;        7250 ;  MA      # ( 牐 → 牐 ) CJK COMPATIBILITY IDEOGRAPH-2F922 → CJK UNIFIED IDEOGRAPH-7250     # 
+
+2F5B ; 7259 ;  MA      #* ( ⽛ → 牙 ) KANGXI RADICAL FANG → CJK UNIFIED IDEOGRAPH-7259   # 
+
+2F5C ; 725B ;  MA      #* ( ⽜ → 牛 ) KANGXI RADICAL COW → CJK UNIFIED IDEOGRAPH-725B    # 
+
+F946 ; 7262 ;  MA      # ( 牢 → 牢 ) CJK COMPATIBILITY IDEOGRAPH-F946 → CJK UNIFIED IDEOGRAPH-7262       # 
+
+2F924 ;        7280 ;  MA      # ( 犀 → 犀 ) CJK COMPATIBILITY IDEOGRAPH-2F924 → CJK UNIFIED IDEOGRAPH-7280     # 
+
+2F925 ;        7295 ;  MA      # ( 犕 → 犕 ) CJK COMPATIBILITY IDEOGRAPH-2F925 → CJK UNIFIED IDEOGRAPH-7295     # 
+
+2F5D ; 72AC ;  MA      #* ( ⽝ → 犬 ) KANGXI RADICAL DOG → CJK UNIFIED IDEOGRAPH-72AC    # 
+
+2EA8 ; 72AD ;  MA      #* ( ⺨ → 犭 ) CJK RADICAL DOG → CJK UNIFIED IDEOGRAPH-72AD       # 
+
+FA9F ; 72AF ;  MA      # ( 犯 → 犯 ) CJK COMPATIBILITY IDEOGRAPH-FA9F → CJK UNIFIED IDEOGRAPH-72AF       # 
+
+F9FA ; 72C0 ;  MA      # ( 狀 → 狀 ) CJK COMPATIBILITY IDEOGRAPH-F9FA → CJK UNIFIED IDEOGRAPH-72C0       # 
+
+F92B ; 72FC ;  MA      # ( 狼 → 狼 ) CJK COMPATIBILITY IDEOGRAPH-F92B → CJK UNIFIED IDEOGRAPH-72FC       # 
+
+FA16 ; 732A ;  MA      # ( 猪 → 猪 ) CJK COMPATIBILITY IDEOGRAPH-FA16 → CJK UNIFIED IDEOGRAPH-732A       # 
+FAA0 ; 732A ;  MA      # ( 猪 → 猪 ) CJK COMPATIBILITY IDEOGRAPH-FAA0 → CJK UNIFIED IDEOGRAPH-732A       # 
+
+F9A7 ; 7375 ;  MA      # ( 獵 → 獵 ) CJK COMPATIBILITY IDEOGRAPH-F9A7 → CJK UNIFIED IDEOGRAPH-7375       # 
+
+2F928 ;        737A ;  MA      # ( 獺 → 獺 ) CJK COMPATIBILITY IDEOGRAPH-2F928 → CJK UNIFIED IDEOGRAPH-737A     # 
+
+2F5E ; 7384 ;  MA      #* ( ⽞ → 玄 ) KANGXI RADICAL PROFOUND → CJK UNIFIED IDEOGRAPH-7384       # 
+
+F961 ; 7387 ;  MA      # ( 率 → 率 ) CJK COMPATIBILITY IDEOGRAPH-F961 → CJK UNIFIED IDEOGRAPH-7387       # 
+F9DB ; 7387 ;  MA      # ( 率 → 率 ) CJK COMPATIBILITY IDEOGRAPH-F9DB → CJK UNIFIED IDEOGRAPH-7387       # 
+
+2F5F ; 7389 ;  MA      #* ( ⽟ → 玉 ) KANGXI RADICAL JADE → CJK UNIFIED IDEOGRAPH-7389   # 
+
+2F929 ;        738B ;  MA      # ( 王 → 王 ) CJK COMPATIBILITY IDEOGRAPH-2F929 → CJK UNIFIED IDEOGRAPH-738B     # 
+
+2F92B ;        73A5 ;  MA      # ( 玥 → 玥 ) CJK COMPATIBILITY IDEOGRAPH-2F92B → CJK UNIFIED IDEOGRAPH-73A5     # 
+
+F9AD ; 73B2 ;  MA      # ( 玲 → 玲 ) CJK COMPATIBILITY IDEOGRAPH-F9AD → CJK UNIFIED IDEOGRAPH-73B2       # 
+
+F917 ; 73DE ;  MA      # ( 珞 → 珞 ) CJK COMPATIBILITY IDEOGRAPH-F917 → CJK UNIFIED IDEOGRAPH-73DE       # 
+
+F9E4 ; 7406 ;  MA      # ( 理 → 理 ) CJK COMPATIBILITY IDEOGRAPH-F9E4 → CJK UNIFIED IDEOGRAPH-7406       # 
+
+F9CC ; 7409 ;  MA      # ( 琉 → 琉 ) CJK COMPATIBILITY IDEOGRAPH-F9CC → CJK UNIFIED IDEOGRAPH-7409       # 
+
+FA4A ; 7422 ;  MA      # ( 琢 → 琢 ) CJK COMPATIBILITY IDEOGRAPH-FA4A → CJK UNIFIED IDEOGRAPH-7422       # 
+
+2F92E ;        7447 ;  MA      # ( 瑇 → 瑇 ) CJK COMPATIBILITY IDEOGRAPH-2F92E → CJK UNIFIED IDEOGRAPH-7447     # 
+
+2F92F ;        745C ;  MA      # ( 瑜 → 瑜 ) CJK COMPATIBILITY IDEOGRAPH-2F92F → CJK UNIFIED IDEOGRAPH-745C     # 
+
+F9AE ; 7469 ;  MA      # ( 瑩 → 瑩 ) CJK COMPATIBILITY IDEOGRAPH-F9AE → CJK UNIFIED IDEOGRAPH-7469       # 
+
+FAA1 ; 7471 ;  MA      # ( 瑱 → 瑱 ) CJK COMPATIBILITY IDEOGRAPH-FAA1 → CJK UNIFIED IDEOGRAPH-7471       # 
+2F930 ;        7471 ;  MA      # ( 瑱 → 瑱 ) CJK COMPATIBILITY IDEOGRAPH-2F930 → CJK UNIFIED IDEOGRAPH-7471     # 
+
+2F931 ;        7485 ;  MA      # ( 璅 → 璅 ) CJK COMPATIBILITY IDEOGRAPH-2F931 → CJK UNIFIED IDEOGRAPH-7485     # 
+
+F994 ; 7489 ;  MA      # ( 璉 → 璉 ) CJK COMPATIBILITY IDEOGRAPH-F994 → CJK UNIFIED IDEOGRAPH-7489       # 
+
+F9EF ; 7498 ;  MA      # ( 璘 → 璘 ) CJK COMPATIBILITY IDEOGRAPH-F9EF → CJK UNIFIED IDEOGRAPH-7498       # 
+
+2F932 ;        74CA ;  MA      # ( 瓊 → 瓊 ) CJK COMPATIBILITY IDEOGRAPH-2F932 → CJK UNIFIED IDEOGRAPH-74CA     # 
+
+2F60 ; 74DC ;  MA      #* ( ⽠ → 瓜 ) KANGXI RADICAL MELON → CJK UNIFIED IDEOGRAPH-74DC  # 
+
+2F61 ; 74E6 ;  MA      #* ( ⽡ → 瓦 ) KANGXI RADICAL TILE → CJK UNIFIED IDEOGRAPH-74E6   # 
+
+FAA2 ; 7506 ;  MA      # ( 甆 → 甆 ) CJK COMPATIBILITY IDEOGRAPH-FAA2 → CJK UNIFIED IDEOGRAPH-7506       # 
+
+2F62 ; 7518 ;  MA      #* ( ⽢ → 甘 ) KANGXI RADICAL SWEET → CJK UNIFIED IDEOGRAPH-7518  # 
+
+2F63 ; 751F ;  MA      #* ( ⽣ → 生 ) KANGXI RADICAL LIFE → CJK UNIFIED IDEOGRAPH-751F   # 
+
+2F934 ;        7524 ;  MA      # ( 甤 → 甤 ) CJK COMPATIBILITY IDEOGRAPH-2F934 → CJK UNIFIED IDEOGRAPH-7524     # 
+
+2F64 ; 7528 ;  MA      #* ( ⽤ → 用 ) KANGXI RADICAL USE → CJK UNIFIED IDEOGRAPH-7528    # 
+
+2F65 ; 7530 ;  MA      #* ( ⽥ → 田 ) KANGXI RADICAL FIELD → CJK UNIFIED IDEOGRAPH-7530  # 
+
+FAA3 ; 753B ;  MA      # ( 画 → 画 ) CJK COMPATIBILITY IDEOGRAPH-FAA3 → CJK UNIFIED IDEOGRAPH-753B       # 
+
+2F936 ;        753E ;  MA      # ( 甾 → 甾 ) CJK COMPATIBILITY IDEOGRAPH-2F936 → CJK UNIFIED IDEOGRAPH-753E     # 
+
+F9CD ; 7559 ;  MA      # ( 留 → 留 ) CJK COMPATIBILITY IDEOGRAPH-F9CD → CJK UNIFIED IDEOGRAPH-7559       # 
+
+F976 ; 7565 ;  MA      # ( 略 → 略 ) CJK COMPATIBILITY IDEOGRAPH-F976 → CJK UNIFIED IDEOGRAPH-7565       # 
+
+F962 ; 7570 ;  MA      # ( 異 → 異 ) CJK COMPATIBILITY IDEOGRAPH-F962 → CJK UNIFIED IDEOGRAPH-7570       # 
+2F938 ;        7570 ;  MA      # ( 異 → 異 ) CJK COMPATIBILITY IDEOGRAPH-2F938 → CJK UNIFIED IDEOGRAPH-7570     # 
+
+2F66 ; 758B ;  MA      #* ( ⽦ → 疋 ) KANGXI RADICAL BOLT OF CLOTH → CJK UNIFIED IDEOGRAPH-758B  # 
+
+2F67 ; 7592 ;  MA      #* ( ⽧ → 疒 ) KANGXI RADICAL SICKNESS → CJK UNIFIED IDEOGRAPH-7592       # 
+
+F9E5 ; 75E2 ;  MA      # ( 痢 → 痢 ) CJK COMPATIBILITY IDEOGRAPH-F9E5 → CJK UNIFIED IDEOGRAPH-75E2       # 
+
+2F93A ;        7610 ;  MA      # ( 瘐 → 瘐 ) CJK COMPATIBILITY IDEOGRAPH-2F93A → CJK UNIFIED IDEOGRAPH-7610     # 
+
+FAA4 ; 761D ;  MA      # ( 瘝 → 瘝 ) CJK COMPATIBILITY IDEOGRAPH-FAA4 → CJK UNIFIED IDEOGRAPH-761D       # 
+
+FAA5 ; 761F ;  MA      # ( 瘟 → 瘟 ) CJK COMPATIBILITY IDEOGRAPH-FAA5 → CJK UNIFIED IDEOGRAPH-761F       # 
+
+F9C1 ; 7642 ;  MA      # ( 療 → 療 ) CJK COMPATIBILITY IDEOGRAPH-F9C1 → CJK UNIFIED IDEOGRAPH-7642       # 
+
+F90E ; 7669 ;  MA      # ( 癩 → 癩 ) CJK COMPATIBILITY IDEOGRAPH-F90E → CJK UNIFIED IDEOGRAPH-7669       # 
+
+2F68 ; 7676 ;  MA      #* ( ⽨ → 癶 ) KANGXI RADICAL DOTTED TENT → CJK UNIFIED IDEOGRAPH-7676    # 
+
+2F69 ; 767D ;  MA      #* ( ⽩ → 白 ) KANGXI RADICAL WHITE → CJK UNIFIED IDEOGRAPH-767D  # 
+
+2F6A ; 76AE ;  MA      #* ( ⽪ → 皮 ) KANGXI RADICAL SKIN → CJK UNIFIED IDEOGRAPH-76AE   # 
+
+2F6B ; 76BF ;  MA      #* ( ⽫ → 皿 ) KANGXI RADICAL DISH → CJK UNIFIED IDEOGRAPH-76BF   # 
+
+FA17 ; 76CA ;  MA      # ( 益 → 益 ) CJK COMPATIBILITY IDEOGRAPH-FA17 → CJK UNIFIED IDEOGRAPH-76CA       # 
+FAA6 ; 76CA ;  MA      # ( 益 → 益 ) CJK COMPATIBILITY IDEOGRAPH-FAA6 → CJK UNIFIED IDEOGRAPH-76CA       # 
+
+FAA7 ; 76DB ;  MA      # ( 盛 → 盛 ) CJK COMPATIBILITY IDEOGRAPH-FAA7 → CJK UNIFIED IDEOGRAPH-76DB       # 
+
+F933 ; 76E7 ;  MA      # ( 盧 → 盧 ) CJK COMPATIBILITY IDEOGRAPH-F933 → CJK UNIFIED IDEOGRAPH-76E7       # 
+
+2F6C ; 76EE ;  MA      #* ( ⽬ → 目 ) KANGXI RADICAL EYE → CJK UNIFIED IDEOGRAPH-76EE    # 
+
+FAA8 ; 76F4 ;  MA      # ( 直 → 直 ) CJK COMPATIBILITY IDEOGRAPH-FAA8 → CJK UNIFIED IDEOGRAPH-76F4       # 
+2F940 ;        76F4 ;  MA      # ( 直 → 直 ) CJK COMPATIBILITY IDEOGRAPH-2F940 → CJK UNIFIED IDEOGRAPH-76F4     # 
+
+F96D ; 7701 ;  MA      # ( 省 → 省 ) CJK COMPATIBILITY IDEOGRAPH-F96D → CJK UNIFIED IDEOGRAPH-7701       # 
+
+2F945 ;        771E ;  MA      # ( 眞 → 眞 ) CJK COMPATIBILITY IDEOGRAPH-2F945 → CJK UNIFIED IDEOGRAPH-771E     # 
+
+2F946 ;        771F ;  MA      # ( 真 → 真 ) CJK COMPATIBILITY IDEOGRAPH-2F946 → CJK UNIFIED IDEOGRAPH-771F     # 
+2F947 ;        771F ;  MA      # ( 真 → 真 ) CJK COMPATIBILITY IDEOGRAPH-2F947 → CJK UNIFIED IDEOGRAPH-771F     # 
+
+FAAA ; 7740 ;  MA      # ( 着 → 着 ) CJK COMPATIBILITY IDEOGRAPH-FAAA → CJK UNIFIED IDEOGRAPH-7740       # 
+
+FAA9 ; 774A ;  MA      # ( 睊 → 睊 ) CJK COMPATIBILITY IDEOGRAPH-FAA9 → CJK UNIFIED IDEOGRAPH-774A       # 
+2F948 ;        774A ;  MA      # ( 睊 → 睊 ) CJK COMPATIBILITY IDEOGRAPH-2F948 → CJK UNIFIED IDEOGRAPH-774A     # 
+
+2F94A ;        778B ;  MA      # ( 瞋 → 瞋 ) CJK COMPATIBILITY IDEOGRAPH-2F94A → CJK UNIFIED IDEOGRAPH-778B     # 
+
+FA9D ; 77A7 ;  MA      # ( 瞧 → 瞧 ) CJK COMPATIBILITY IDEOGRAPH-FA9D → CJK UNIFIED IDEOGRAPH-77A7       # 
+
+2F6D ; 77DB ;  MA      #* ( ⽭ → 矛 ) KANGXI RADICAL SPEAR → CJK UNIFIED IDEOGRAPH-77DB  # 
+
+2F6E ; 77E2 ;  MA      #* ( ⽮ → 矢 ) KANGXI RADICAL ARROW → CJK UNIFIED IDEOGRAPH-77E2  # 
+
+2F6F ; 77F3 ;  MA      #* ( ⽯ → 石 ) KANGXI RADICAL STONE → CJK UNIFIED IDEOGRAPH-77F3  # 
+
+784F ; 7814 ;  MA      # ( 硏 → 研 ) CJK UNIFIED IDEOGRAPH-784F → CJK UNIFIED IDEOGRAPH-7814     # 
+
+2F94E ;        784E ;  MA      # ( 硎 → 硎 ) CJK COMPATIBILITY IDEOGRAPH-2F94E → CJK UNIFIED IDEOGRAPH-784E     # 
+
+F9CE ; 786B ;  MA      # ( 硫 → 硫 ) CJK COMPATIBILITY IDEOGRAPH-F9CE → CJK UNIFIED IDEOGRAPH-786B       # 
+
+F93B ; 788C ;  MA      # ( 碌 → 碌 ) CJK COMPATIBILITY IDEOGRAPH-F93B → CJK UNIFIED IDEOGRAPH-788C       # 
+2F94F ;        788C ;  MA      # ( 碌 → 碌 ) CJK COMPATIBILITY IDEOGRAPH-2F94F → CJK UNIFIED IDEOGRAPH-788C     # 
+
+FA4B ; 7891 ;  MA      # ( 碑 → 碑 ) CJK COMPATIBILITY IDEOGRAPH-FA4B → CJK UNIFIED IDEOGRAPH-7891       # 
+
+F947 ; 78CA ;  MA      # ( 磊 → 磊 ) CJK COMPATIBILITY IDEOGRAPH-F947 → CJK UNIFIED IDEOGRAPH-78CA       # 
+
+FAAB ; 78CC ;  MA      # ( 磌 → 磌 ) CJK COMPATIBILITY IDEOGRAPH-FAAB → CJK UNIFIED IDEOGRAPH-78CC       # 
+2F950 ;        78CC ;  MA      # ( 磌 → 磌 ) CJK COMPATIBILITY IDEOGRAPH-2F950 → CJK UNIFIED IDEOGRAPH-78CC     # 
+
+F964 ; 78FB ;  MA      # ( 磻 → 磻 ) CJK COMPATIBILITY IDEOGRAPH-F964 → CJK UNIFIED IDEOGRAPH-78FB       # 
+
+F985 ; 792A ;  MA      # ( 礪 → 礪 ) CJK COMPATIBILITY IDEOGRAPH-F985 → CJK UNIFIED IDEOGRAPH-792A       # 
+
+2F70 ; 793A ;  MA      #* ( ⽰ → 示 ) KANGXI RADICAL SPIRIT → CJK UNIFIED IDEOGRAPH-793A # 
+
+2EAD ; 793B ;  MA      #* ( ⺭ → 礻 ) CJK RADICAL SPIRIT TWO → CJK UNIFIED IDEOGRAPH-793B        # 
+
+FA18 ; 793C ;  MA      # ( 礼 → 礼 ) CJK COMPATIBILITY IDEOGRAPH-FA18 → CJK UNIFIED IDEOGRAPH-793C       # 
+
+FA4C ; 793E ;  MA      # ( 社 → 社 ) CJK COMPATIBILITY IDEOGRAPH-FA4C → CJK UNIFIED IDEOGRAPH-793E       # 
+
+FA4E ; 7948 ;  MA      # ( 祈 → 祈 ) CJK COMPATIBILITY IDEOGRAPH-FA4E → CJK UNIFIED IDEOGRAPH-7948       # 
+
+FA4D ; 7949 ;  MA      # ( 祉 → 祉 ) CJK COMPATIBILITY IDEOGRAPH-FA4D → CJK UNIFIED IDEOGRAPH-7949       # 
+
+FA4F ; 7950 ;  MA      # ( 祐 → 祐 ) CJK COMPATIBILITY IDEOGRAPH-FA4F → CJK UNIFIED IDEOGRAPH-7950       # 
+
+FA50 ; 7956 ;  MA      # ( 祖 → 祖 ) CJK COMPATIBILITY IDEOGRAPH-FA50 → CJK UNIFIED IDEOGRAPH-7956       # 
+2F953 ;        7956 ;  MA      # ( 祖 → 祖 ) CJK COMPATIBILITY IDEOGRAPH-2F953 → CJK UNIFIED IDEOGRAPH-7956     # 
+
+FA51 ; 795D ;  MA      # ( 祝 → 祝 ) CJK COMPATIBILITY IDEOGRAPH-FA51 → CJK UNIFIED IDEOGRAPH-795D       # 
+
+FA19 ; 795E ;  MA      # ( 神 → 神 ) CJK COMPATIBILITY IDEOGRAPH-FA19 → CJK UNIFIED IDEOGRAPH-795E       # 
+
+FA1A ; 7965 ;  MA      # ( 祥 → 祥 ) CJK COMPATIBILITY IDEOGRAPH-FA1A → CJK UNIFIED IDEOGRAPH-7965       # 
+
+F93C ; 797F ;  MA      # ( 祿 → 祿 ) CJK COMPATIBILITY IDEOGRAPH-F93C → CJK UNIFIED IDEOGRAPH-797F       # 
+
+FA52 ; 798D ;  MA      # ( 禍 → 禍 ) CJK COMPATIBILITY IDEOGRAPH-FA52 → CJK UNIFIED IDEOGRAPH-798D       # 
+
+FA53 ; 798E ;  MA      # ( 禎 → 禎 ) CJK COMPATIBILITY IDEOGRAPH-FA53 → CJK UNIFIED IDEOGRAPH-798E       # 
+
+FA1B ; 798F ;  MA      # ( 福 → 福 ) CJK COMPATIBILITY IDEOGRAPH-FA1B → CJK UNIFIED IDEOGRAPH-798F       # 
+2F956 ;        798F ;  MA      # ( 福 → 福 ) CJK COMPATIBILITY IDEOGRAPH-2F956 → CJK UNIFIED IDEOGRAPH-798F     # 
+
+F9B6 ; 79AE ;  MA      # ( 禮 → 禮 ) CJK COMPATIBILITY IDEOGRAPH-F9B6 → CJK UNIFIED IDEOGRAPH-79AE       # 
+
+2F71 ; 79B8 ;  MA      #* ( ⽱ → 禸 ) KANGXI RADICAL TRACK → CJK UNIFIED IDEOGRAPH-79B8  # 
+
+2F72 ; 79BE ;  MA      #* ( ⽲ → 禾 ) KANGXI RADICAL GRAIN → CJK UNIFIED IDEOGRAPH-79BE  # 
+
+F995 ; 79CA ;  MA      # ( 秊 → 秊 ) CJK COMPATIBILITY IDEOGRAPH-F995 → CJK UNIFIED IDEOGRAPH-79CA       # 
+
+2F957 ;        79EB ;  MA      # ( 秫 → 秫 ) CJK COMPATIBILITY IDEOGRAPH-2F957 → CJK UNIFIED IDEOGRAPH-79EB     # 
+
+F956 ; 7A1C ;  MA      # ( 稜 → 稜 ) CJK COMPATIBILITY IDEOGRAPH-F956 → CJK UNIFIED IDEOGRAPH-7A1C       # 
+
+FA54 ; 7A40 ;  MA      # ( 穀 → 穀 ) CJK COMPATIBILITY IDEOGRAPH-FA54 → CJK UNIFIED IDEOGRAPH-7A40       # 
+2F959 ;        7A40 ;  MA      # ( 穀 → 穀 ) CJK COMPATIBILITY IDEOGRAPH-2F959 → CJK UNIFIED IDEOGRAPH-7A40     # 
+
+2F95A ;        7A4A ;  MA      # ( 穊 → 穊 ) CJK COMPATIBILITY IDEOGRAPH-2F95A → CJK UNIFIED IDEOGRAPH-7A4A     # 
+
+2F95B ;        7A4F ;  MA      # ( 穏 → 穏 ) CJK COMPATIBILITY IDEOGRAPH-2F95B → CJK UNIFIED IDEOGRAPH-7A4F     # 
+
+2F73 ; 7A74 ;  MA      #* ( ⽳ → 穴 ) KANGXI RADICAL CAVE → CJK UNIFIED IDEOGRAPH-7A74   # 
+
+FA55 ; 7A81 ;  MA      # ( 突 → 突 ) CJK COMPATIBILITY IDEOGRAPH-FA55 → CJK UNIFIED IDEOGRAPH-7A81       # 
+
+FAAC ; 7AB1 ;  MA      # ( 窱 → 窱 ) CJK COMPATIBILITY IDEOGRAPH-FAAC → CJK UNIFIED IDEOGRAPH-7AB1       # 
+
+F9F7 ; 7ACB ;  MA      # ( 立 → 立 ) CJK COMPATIBILITY IDEOGRAPH-F9F7 → CJK UNIFIED IDEOGRAPH-7ACB       # 
+2F74 ; 7ACB ;  MA      #* ( ⽴ → 立 ) KANGXI RADICAL STAND → CJK UNIFIED IDEOGRAPH-7ACB  # 
+
+2EEF ; 7ADC ;  MA      #* ( ⻯ → 竜 ) CJK RADICAL J-SIMPLIFIED DRAGON → CJK UNIFIED IDEOGRAPH-7ADC       # 
+
+2F95F ;        7AEE ;  MA      # ( 竮 → 竮 ) CJK COMPATIBILITY IDEOGRAPH-2F95F → CJK UNIFIED IDEOGRAPH-7AEE     # 
+
+2F75 ; 7AF9 ;  MA      #* ( ⽵ → 竹 ) KANGXI RADICAL BAMBOO → CJK UNIFIED IDEOGRAPH-7AF9 # 
+
+F9F8 ; 7B20 ;  MA      # ( 笠 → 笠 ) CJK COMPATIBILITY IDEOGRAPH-F9F8 → CJK UNIFIED IDEOGRAPH-7B20       # 
+
+FA56 ; 7BC0 ;  MA      # ( 節 → 節 ) CJK COMPATIBILITY IDEOGRAPH-FA56 → CJK UNIFIED IDEOGRAPH-7BC0       # 
+FAAD ; 7BC0 ;  MA      # ( 節 → 節 ) CJK COMPATIBILITY IDEOGRAPH-FAAD → CJK UNIFIED IDEOGRAPH-7BC0       # 
+
+2F962 ;        7BC6 ;  MA      # ( 篆 → 篆 ) CJK COMPATIBILITY IDEOGRAPH-2F962 → CJK UNIFIED IDEOGRAPH-7BC6     # 
+
+2F963 ;        7BC9 ;  MA      # ( 築 → 築 ) CJK COMPATIBILITY IDEOGRAPH-2F963 → CJK UNIFIED IDEOGRAPH-7BC9     # 
+
+F9A6 ; 7C3E ;  MA      # ( 簾 → 簾 ) CJK COMPATIBILITY IDEOGRAPH-F9A6 → CJK UNIFIED IDEOGRAPH-7C3E       # 
+
+F944 ; 7C60 ;  MA      # ( 籠 → 籠 ) CJK COMPATIBILITY IDEOGRAPH-F944 → CJK UNIFIED IDEOGRAPH-7C60       # 
+
+2F76 ; 7C73 ;  MA      #* ( ⽶ → 米 ) KANGXI RADICAL RICE → CJK UNIFIED IDEOGRAPH-7C73   # 
+
+FAAE ; 7C7B ;  MA      # ( 类 → 类 ) CJK COMPATIBILITY IDEOGRAPH-FAAE → CJK UNIFIED IDEOGRAPH-7C7B       # 
+
+F9F9 ; 7C92 ;  MA      # ( 粒 → 粒 ) CJK COMPATIBILITY IDEOGRAPH-F9F9 → CJK UNIFIED IDEOGRAPH-7C92       # 
+
+FA1D ; 7CBE ;  MA      # ( 精 → 精 ) CJK COMPATIBILITY IDEOGRAPH-FA1D → CJK UNIFIED IDEOGRAPH-7CBE       # 
+
+2F966 ;        7CD2 ;  MA      # ( 糒 → 糒 ) CJK COMPATIBILITY IDEOGRAPH-2F966 → CJK UNIFIED IDEOGRAPH-7CD2     # 
+
+FA03 ; 7CD6 ;  MA      # ( 糖 → 糖 ) CJK COMPATIBILITY IDEOGRAPH-FA03 → CJK UNIFIED IDEOGRAPH-7CD6       # 
+
+2F969 ;        7CE3 ;  MA      # ( 糣 → 糣 ) CJK COMPATIBILITY IDEOGRAPH-2F969 → CJK UNIFIED IDEOGRAPH-7CE3     # 
+
+F97B ; 7CE7 ;  MA      # ( 糧 → 糧 ) CJK COMPATIBILITY IDEOGRAPH-F97B → CJK UNIFIED IDEOGRAPH-7CE7       # 
+
+2F968 ;        7CE8 ;  MA      # ( 糨 → 糨 ) CJK COMPATIBILITY IDEOGRAPH-2F968 → CJK UNIFIED IDEOGRAPH-7CE8     # 
+
+2F77 ; 7CF8 ;  MA      #* ( ⽷ → 糸 ) KANGXI RADICAL SILK → CJK UNIFIED IDEOGRAPH-7CF8   # 
+
+2EAF ; 7CF9 ;  MA      #* ( ⺯ → 糹 ) CJK RADICAL SILK → CJK UNIFIED IDEOGRAPH-7CF9      # 
+
+2F96A ;        7D00 ;  MA      # ( 紀 → 紀 ) CJK COMPATIBILITY IDEOGRAPH-2F96A → CJK UNIFIED IDEOGRAPH-7D00     # 
+
+F9CF ; 7D10 ;  MA      # ( 紐 → 紐 ) CJK COMPATIBILITY IDEOGRAPH-F9CF → CJK UNIFIED IDEOGRAPH-7D10       # 
+
+F96A ; 7D22 ;  MA      # ( 索 → 索 ) CJK COMPATIBILITY IDEOGRAPH-F96A → CJK UNIFIED IDEOGRAPH-7D22       # 
+
+F94F ; 7D2F ;  MA      # ( 累 → 累 ) CJK COMPATIBILITY IDEOGRAPH-F94F → CJK UNIFIED IDEOGRAPH-7D2F       # 
+
+7D76 ; 7D55 ;  MA      # ( 絶 → 絕 ) CJK UNIFIED IDEOGRAPH-7D76 → CJK UNIFIED IDEOGRAPH-7D55     # 
+
+FAAF ; 7D5B ;  MA      # ( 絛 → 絛 ) CJK COMPATIBILITY IDEOGRAPH-FAAF → CJK UNIFIED IDEOGRAPH-7D5B       # 
+
+2F96C ;        7D63 ;  MA      # ( 絣 → 絣 ) CJK COMPATIBILITY IDEOGRAPH-2F96C → CJK UNIFIED IDEOGRAPH-7D63     # 
+
+F93D ; 7DA0 ;  MA      # ( 綠 → 綠 ) CJK COMPATIBILITY IDEOGRAPH-F93D → CJK UNIFIED IDEOGRAPH-7DA0       # 
+
+F957 ; 7DBE ;  MA      # ( 綾 → 綾 ) CJK COMPATIBILITY IDEOGRAPH-F957 → CJK UNIFIED IDEOGRAPH-7DBE       # 
+
+2F96E ;        7DC7 ;  MA      # ( 緇 → 緇 ) CJK COMPATIBILITY IDEOGRAPH-2F96E → CJK UNIFIED IDEOGRAPH-7DC7     # 
+
+F996 ; 7DF4 ;  MA      # ( 練 → 練 ) CJK COMPATIBILITY IDEOGRAPH-F996 → CJK UNIFIED IDEOGRAPH-7DF4       # 
+FA57 ; 7DF4 ;  MA      # ( 練 → 練 ) CJK COMPATIBILITY IDEOGRAPH-FA57 → CJK UNIFIED IDEOGRAPH-7DF4       # 
+FAB0 ; 7DF4 ;  MA      # ( 練 → 練 ) CJK COMPATIBILITY IDEOGRAPH-FAB0 → CJK UNIFIED IDEOGRAPH-7DF4       # 
+
+2F96F ;        7E02 ;  MA      # ( 縂 → 縂 ) CJK COMPATIBILITY IDEOGRAPH-2F96F → CJK UNIFIED IDEOGRAPH-7E02     # 
+
+FA58 ; 7E09 ;  MA      # ( 縉 → 縉 ) CJK COMPATIBILITY IDEOGRAPH-FA58 → CJK UNIFIED IDEOGRAPH-7E09       # 
+
+F950 ; 7E37 ;  MA      # ( 縷 → 縷 ) CJK COMPATIBILITY IDEOGRAPH-F950 → CJK UNIFIED IDEOGRAPH-7E37       # 
+
+FA59 ; 7E41 ;  MA      # ( 繁 → 繁 ) CJK COMPATIBILITY IDEOGRAPH-FA59 → CJK UNIFIED IDEOGRAPH-7E41       # 
+
+2F970 ;        7E45 ;  MA      # ( 繅 → 繅 ) CJK COMPATIBILITY IDEOGRAPH-2F970 → CJK UNIFIED IDEOGRAPH-7E45     # 
+
+2F78 ; 7F36 ;  MA      #* ( ⽸ → 缶 ) KANGXI RADICAL JAR → CJK UNIFIED IDEOGRAPH-7F36    # 
+
+FAB1 ; 7F3E ;  MA      # ( 缾 → 缾 ) CJK COMPATIBILITY IDEOGRAPH-FAB1 → CJK UNIFIED IDEOGRAPH-7F3E       # 
+
+2F79 ; 7F51 ;  MA      #* ( ⽹ → 网 ) KANGXI RADICAL NET → CJK UNIFIED IDEOGRAPH-7F51    # 
+
+2EAB ; 7F52 ;  MA      #* ( ⺫ → 罒 ) CJK RADICAL EYE → CJK UNIFIED IDEOGRAPH-7F52       # 
+2EB2 ; 7F52 ;  MA      #* ( ⺲ → 罒 ) CJK RADICAL NET TWO → CJK UNIFIED IDEOGRAPH-7F52   # 
+
+2EB1 ; 7F53 ;  MA      #* ( ⺱ → 罓 ) CJK RADICAL NET ONE → CJK UNIFIED IDEOGRAPH-7F53   # 
+
+FA5A ; 7F72 ;  MA      # ( 署 → 署 ) CJK COMPATIBILITY IDEOGRAPH-FA5A → CJK UNIFIED IDEOGRAPH-7F72       # 
+
+F9E6 ; 7F79 ;  MA      # ( 罹 → 罹 ) CJK COMPATIBILITY IDEOGRAPH-F9E6 → CJK UNIFIED IDEOGRAPH-7F79       # 
+
+2F976 ;        7F7A ;  MA      # ( 罺 → 罺 ) CJK COMPATIBILITY IDEOGRAPH-2F976 → CJK UNIFIED IDEOGRAPH-7F7A     # 
+
+F90F ; 7F85 ;  MA      # ( 羅 → 羅 ) CJK COMPATIBILITY IDEOGRAPH-F90F → CJK UNIFIED IDEOGRAPH-7F85       # 
+
+2F7A ; 7F8A ;  MA      #* ( ⽺ → 羊 ) KANGXI RADICAL SHEEP → CJK UNIFIED IDEOGRAPH-7F8A  # 
+
+2F978 ;        7F95 ;  MA      # ( 羕 → 羕 ) CJK COMPATIBILITY IDEOGRAPH-2F978 → CJK UNIFIED IDEOGRAPH-7F95     # 
+
+F9AF ; 7F9A ;  MA      # ( 羚 → 羚 ) CJK COMPATIBILITY IDEOGRAPH-F9AF → CJK UNIFIED IDEOGRAPH-7F9A       # 
+
+FA1E ; 7FBD ;  MA      # ( 羽 → 羽 ) CJK COMPATIBILITY IDEOGRAPH-FA1E → CJK UNIFIED IDEOGRAPH-7FBD       # 
+2F7B ; 7FBD ;  MA      #* ( ⽻ → 羽 ) KANGXI RADICAL FEATHER → CJK UNIFIED IDEOGRAPH-7FBD        # 
+
+2F979 ;        7FFA ;  MA      # ( 翺 → 翺 ) CJK COMPATIBILITY IDEOGRAPH-2F979 → CJK UNIFIED IDEOGRAPH-7FFA     # 
+
+F934 ; 8001 ;  MA      # ( 老 → 老 ) CJK COMPATIBILITY IDEOGRAPH-F934 → CJK UNIFIED IDEOGRAPH-8001       # 
+2F7C ; 8001 ;  MA      #* ( ⽼ → 老 ) KANGXI RADICAL OLD → CJK UNIFIED IDEOGRAPH-8001    # 
+
+2EB9 ; 8002 ;  MA      #* ( ⺹ → 耂 ) CJK RADICAL OLD → CJK UNIFIED IDEOGRAPH-8002       # 
+
+FA5B ; 8005 ;  MA      # ( 者 → 者 ) CJK COMPATIBILITY IDEOGRAPH-FA5B → CJK UNIFIED IDEOGRAPH-8005       # 
+FAB2 ; 8005 ;  MA      # ( 者 → 者 ) CJK COMPATIBILITY IDEOGRAPH-FAB2 → CJK UNIFIED IDEOGRAPH-8005       # 
+2F97A ;        8005 ;  MA      # ( 者 → 者 ) CJK COMPATIBILITY IDEOGRAPH-2F97A → CJK UNIFIED IDEOGRAPH-8005     # 
+
+2F7D ; 800C ;  MA      #* ( ⽽ → 而 ) KANGXI RADICAL AND → CJK UNIFIED IDEOGRAPH-800C    # 
+
+2F7E ; 8012 ;  MA      #* ( ⽾ → 耒 ) KANGXI RADICAL PLOW → CJK UNIFIED IDEOGRAPH-8012   # 
+
+2F7F ; 8033 ;  MA      #* ( ⽿ → 耳 ) KANGXI RADICAL EAR → CJK UNIFIED IDEOGRAPH-8033    # 
+
+F9B0 ; 8046 ;  MA      # ( 聆 → 聆 ) CJK COMPATIBILITY IDEOGRAPH-F9B0 → CJK UNIFIED IDEOGRAPH-8046       # 
+
+2F97D ;        8060 ;  MA      # ( 聠 → 聠 ) CJK COMPATIBILITY IDEOGRAPH-2F97D → CJK UNIFIED IDEOGRAPH-8060     # 
+
+F997 ; 806F ;  MA      # ( 聯 → 聯 ) CJK COMPATIBILITY IDEOGRAPH-F997 → CJK UNIFIED IDEOGRAPH-806F       # 
+
+2F97F ;        8070 ;  MA      # ( 聰 → 聰 ) CJK COMPATIBILITY IDEOGRAPH-2F97F → CJK UNIFIED IDEOGRAPH-8070     # 
+
+F945 ; 807E ;  MA      # ( 聾 → 聾 ) CJK COMPATIBILITY IDEOGRAPH-F945 → CJK UNIFIED IDEOGRAPH-807E       # 
+
+2F80 ; 807F ;  MA      #* ( ⾀ → 聿 ) KANGXI RADICAL BRUSH → CJK UNIFIED IDEOGRAPH-807F  # 
+
+2EBA ; 8080 ;  MA      #* ( ⺺ → 肀 ) CJK RADICAL BRUSH ONE → CJK UNIFIED IDEOGRAPH-8080 # 
+
+2F81 ; 8089 ;  MA      #* ( ⾁ → 肉 ) KANGXI RADICAL MEAT → CJK UNIFIED IDEOGRAPH-8089   # 
+
+F953 ; 808B ;  MA      # ( 肋 → 肋 ) CJK COMPATIBILITY IDEOGRAPH-F953 → CJK UNIFIED IDEOGRAPH-808B       # 
+
+2F8D6 ;        80AD ;  MA      # ( 肭 → 肭 ) CJK COMPATIBILITY IDEOGRAPH-2F8D6 → CJK UNIFIED IDEOGRAPH-80AD     # 
+
+2F982 ;        80B2 ;  MA      # ( 育 → 育 ) CJK COMPATIBILITY IDEOGRAPH-2F982 → CJK UNIFIED IDEOGRAPH-80B2     # 
+
+8141 ; 80FC ;  MA      # ( 腁 → 胼 ) CJK UNIFIED IDEOGRAPH-8141 → CJK UNIFIED IDEOGRAPH-80FC     # 
+
+2F983 ;        8103 ;  MA      # ( 脃 → 脃 ) CJK COMPATIBILITY IDEOGRAPH-2F983 → CJK UNIFIED IDEOGRAPH-8103     # 
+
+2F985 ;        813E ;  MA      # ( 脾 → 脾 ) CJK COMPATIBILITY IDEOGRAPH-2F985 → CJK UNIFIED IDEOGRAPH-813E     # 
+
+F926 ; 81D8 ;  MA      # ( 臘 → 臘 ) CJK COMPATIBILITY IDEOGRAPH-F926 → CJK UNIFIED IDEOGRAPH-81D8       # 
+
+2F82 ; 81E3 ;  MA      #* ( ⾂ → 臣 ) KANGXI RADICAL MINISTER → CJK UNIFIED IDEOGRAPH-81E3       # 
+
+F9F6 ; 81E8 ;  MA      # ( 臨 → 臨 ) CJK COMPATIBILITY IDEOGRAPH-F9F6 → CJK UNIFIED IDEOGRAPH-81E8       # 
+
+2F83 ; 81EA ;  MA      #* ( ⾃ → 自 ) KANGXI RADICAL SELF → CJK UNIFIED IDEOGRAPH-81EA   # 
+
+FA5C ; 81ED ;  MA      # ( 臭 → 臭 ) CJK COMPATIBILITY IDEOGRAPH-FA5C → CJK UNIFIED IDEOGRAPH-81ED       # 
+
+2F84 ; 81F3 ;  MA      #* ( ⾄ → 至 ) KANGXI RADICAL ARRIVE → CJK UNIFIED IDEOGRAPH-81F3 # 
+
+2F85 ; 81FC ;  MA      #* ( ⾅ → 臼 ) KANGXI RADICAL MORTAR → CJK UNIFIED IDEOGRAPH-81FC # 
+
+2F893 ;        8201 ;  MA      # ( 舁 → 舁 ) CJK COMPATIBILITY IDEOGRAPH-2F893 → CJK UNIFIED IDEOGRAPH-8201     # 
+2F98B ;        8201 ;  MA      # ( 舁 → 舁 ) CJK COMPATIBILITY IDEOGRAPH-2F98B → CJK UNIFIED IDEOGRAPH-8201     # 
+
+2F98C ;        8204 ;  MA      # ( 舄 → 舄 ) CJK COMPATIBILITY IDEOGRAPH-2F98C → CJK UNIFIED IDEOGRAPH-8204     # 
+
+2F86 ; 820C ;  MA      #* ( ⾆ → 舌 ) KANGXI RADICAL TONGUE → CJK UNIFIED IDEOGRAPH-820C # 
+
+FA6D ; 8218 ;  MA      # ( 舘 → 舘 ) CJK COMPATIBILITY IDEOGRAPH-FA6D → CJK UNIFIED IDEOGRAPH-8218       # 
+
+2F87 ; 821B ;  MA      #* ( ⾇ → 舛 ) KANGXI RADICAL OPPOSE → CJK UNIFIED IDEOGRAPH-821B # 
+
+2F88 ; 821F ;  MA      #* ( ⾈ → 舟 ) KANGXI RADICAL BOAT → CJK UNIFIED IDEOGRAPH-821F   # 
+
+2F89 ; 826E ;  MA      #* ( ⾉ → 艮 ) KANGXI RADICAL STOPPING → CJK UNIFIED IDEOGRAPH-826E       # 
+
+F97C ; 826F ;  MA      # ( 良 → 良 ) CJK COMPATIBILITY IDEOGRAPH-F97C → CJK UNIFIED IDEOGRAPH-826F       # 
+
+2F8A ; 8272 ;  MA      #* ( ⾊ → 色 ) KANGXI RADICAL COLOR → CJK UNIFIED IDEOGRAPH-8272  # 
+
+2F8B ; 8278 ;  MA      #* ( ⾋ → 艸 ) KANGXI RADICAL GRASS → CJK UNIFIED IDEOGRAPH-8278  # 
+
+FA5D ; 8279 ;  MA      # ( 艹 → 艹 ) CJK COMPATIBILITY IDEOGRAPH-FA5D → CJK UNIFIED IDEOGRAPH-8279       # 
+FA5E ; 8279 ;  MA      # ( 艹 → 艹 ) CJK COMPATIBILITY IDEOGRAPH-FA5E → CJK UNIFIED IDEOGRAPH-8279       # 
+2EBE ; 8279 ;  MA      #* ( ⺾ → 艹 ) CJK RADICAL GRASS ONE → CJK UNIFIED IDEOGRAPH-8279 # 
+2EBF ; 8279 ;  MA      #* ( ⺿ → 艹 ) CJK RADICAL GRASS TWO → CJK UNIFIED IDEOGRAPH-8279 # →艹→
+2EC0 ; 8279 ;  MA      #* ( ⻀ → 艹 ) CJK RADICAL GRASS THREE → CJK UNIFIED IDEOGRAPH-8279       # →艹→
+
+2F990 ;        828B ;  MA      # ( 芋 → 芋 ) CJK COMPATIBILITY IDEOGRAPH-2F990 → CJK UNIFIED IDEOGRAPH-828B     # 
+
+2F98F ;        8291 ;  MA      # ( 芑 → 芑 ) CJK COMPATIBILITY IDEOGRAPH-2F98F → CJK UNIFIED IDEOGRAPH-8291     # 
+
+2F991 ;        829D ;  MA      # ( 芝 → 芝 ) CJK COMPATIBILITY IDEOGRAPH-2F991 → CJK UNIFIED IDEOGRAPH-829D     # 
+
+2F993 ;        82B1 ;  MA      # ( 花 → 花 ) CJK COMPATIBILITY IDEOGRAPH-2F993 → CJK UNIFIED IDEOGRAPH-82B1     # 
+
+2F994 ;        82B3 ;  MA      # ( 芳 → 芳 ) CJK COMPATIBILITY IDEOGRAPH-2F994 → CJK UNIFIED IDEOGRAPH-82B3     # 
+
+2F995 ;        82BD ;  MA      # ( 芽 → 芽 ) CJK COMPATIBILITY IDEOGRAPH-2F995 → CJK UNIFIED IDEOGRAPH-82BD     # 
+
+F974 ; 82E5 ;  MA      # ( 若 → 若 ) CJK COMPATIBILITY IDEOGRAPH-F974 → CJK UNIFIED IDEOGRAPH-82E5       # 
+2F998 ;        82E5 ;  MA      # ( 若 → 若 ) CJK COMPATIBILITY IDEOGRAPH-2F998 → CJK UNIFIED IDEOGRAPH-82E5     # 
+
+2F996 ;        82E6 ;  MA      # ( 苦 → 苦 ) CJK COMPATIBILITY IDEOGRAPH-2F996 → CJK UNIFIED IDEOGRAPH-82E6     # 
+
+2F999 ;        831D ;  MA      # ( 茝 → 茝 ) CJK COMPATIBILITY IDEOGRAPH-2F999 → CJK UNIFIED IDEOGRAPH-831D     # 
+
+2F99C ;        8323 ;  MA      # ( 茣 → 茣 ) CJK COMPATIBILITY IDEOGRAPH-2F99C → CJK UNIFIED IDEOGRAPH-8323     # 
+
+F9FE ; 8336 ;  MA      # ( 茶 → 茶 ) CJK COMPATIBILITY IDEOGRAPH-F9FE → CJK UNIFIED IDEOGRAPH-8336       # 
+
+FAB3 ; 8352 ;  MA      # ( 荒 → 荒 ) CJK COMPATIBILITY IDEOGRAPH-FAB3 → CJK UNIFIED IDEOGRAPH-8352       # 
+
+2F9A0 ;        8353 ;  MA      # ( 荓 → 荓 ) CJK COMPATIBILITY IDEOGRAPH-2F9A0 → CJK UNIFIED IDEOGRAPH-8353     # 
+
+2F99A ;        8363 ;  MA      # ( 荣 → 荣 ) CJK COMPATIBILITY IDEOGRAPH-2F99A → CJK UNIFIED IDEOGRAPH-8363     # 
+
+2F99B ;        83AD ;  MA      # ( 莭 → 莭 ) CJK COMPATIBILITY IDEOGRAPH-2F99B → CJK UNIFIED IDEOGRAPH-83AD     # 
+
+2F99D ;        83BD ;  MA      # ( 莽 → 莽 ) CJK COMPATIBILITY IDEOGRAPH-2F99D → CJK UNIFIED IDEOGRAPH-83BD     # 
+
+F93E ; 83C9 ;  MA      # ( 菉 → 菉 ) CJK COMPATIBILITY IDEOGRAPH-F93E → CJK UNIFIED IDEOGRAPH-83C9       # 
+
+2F9A1 ;        83CA ;  MA      # ( 菊 → 菊 ) CJK COMPATIBILITY IDEOGRAPH-2F9A1 → CJK UNIFIED IDEOGRAPH-83CA     # 
+
+2F9A2 ;        83CC ;  MA      # ( 菌 → 菌 ) CJK COMPATIBILITY IDEOGRAPH-2F9A2 → CJK UNIFIED IDEOGRAPH-83CC     # 
+
+2F9A3 ;        83DC ;  MA      # ( 菜 → 菜 ) CJK COMPATIBILITY IDEOGRAPH-2F9A3 → CJK UNIFIED IDEOGRAPH-83DC     # 
+
+2F99E ;        83E7 ;  MA      # ( 菧 → 菧 ) CJK COMPATIBILITY IDEOGRAPH-2F99E → CJK UNIFIED IDEOGRAPH-83E7     # 
+
+FAB4 ; 83EF ;  MA      # ( 華 → 華 ) CJK COMPATIBILITY IDEOGRAPH-FAB4 → CJK UNIFIED IDEOGRAPH-83EF       # 
+
+F958 ; 83F1 ;  MA      # ( 菱 → 菱 ) CJK COMPATIBILITY IDEOGRAPH-F958 → CJK UNIFIED IDEOGRAPH-83F1       # 
+
+F918 ; 843D ;  MA      # ( 落 → 落 ) CJK COMPATIBILITY IDEOGRAPH-F918 → CJK UNIFIED IDEOGRAPH-843D       # 
+
+F96E ; 8449 ;  MA      # ( 葉 → 葉 ) CJK COMPATIBILITY IDEOGRAPH-F96E → CJK UNIFIED IDEOGRAPH-8449       # 
+
+FA5F ; 8457 ;  MA      # ( 著 → 著 ) CJK COMPATIBILITY IDEOGRAPH-FA5F → CJK UNIFIED IDEOGRAPH-8457       # 
+2F99F ;        8457 ;  MA      # ( 著 → 著 ) CJK COMPATIBILITY IDEOGRAPH-2F99F → CJK UNIFIED IDEOGRAPH-8457     # 
+
+853F ; 848D ;  MA      # ( 蔿 → 蒍 ) CJK UNIFIED IDEOGRAPH-853F → CJK UNIFIED IDEOGRAPH-848D     # 
+
+F999 ; 84EE ;  MA      # ( 蓮 → 蓮 ) CJK COMPATIBILITY IDEOGRAPH-F999 → CJK UNIFIED IDEOGRAPH-84EE       # 
+
+2F9A8 ;        84F1 ;  MA      # ( 蓱 → 蓱 ) CJK COMPATIBILITY IDEOGRAPH-2F9A8 → CJK UNIFIED IDEOGRAPH-84F1     # 
+
+2F9A9 ;        84F3 ;  MA      # ( 蓳 → 蓳 ) CJK COMPATIBILITY IDEOGRAPH-2F9A9 → CJK UNIFIED IDEOGRAPH-84F3     # 
+
+F9C2 ; 84FC ;  MA      # ( 蓼 → 蓼 ) CJK COMPATIBILITY IDEOGRAPH-F9C2 → CJK UNIFIED IDEOGRAPH-84FC       # 
+
+2F9AA ;        8516 ;  MA      # ( 蔖 → 蔖 ) CJK COMPATIBILITY IDEOGRAPH-2F9AA → CJK UNIFIED IDEOGRAPH-8516     # 
+
+2F9AC ;        8564 ;  MA      # ( 蕤 → 蕤 ) CJK COMPATIBILITY IDEOGRAPH-2F9AC → CJK UNIFIED IDEOGRAPH-8564     # 
+
+F923 ; 85CD ;  MA      # ( 藍 → 藍 ) CJK COMPATIBILITY IDEOGRAPH-F923 → CJK UNIFIED IDEOGRAPH-85CD       # 
+
+F9F0 ; 85FA ;  MA      # ( 藺 → 藺 ) CJK COMPATIBILITY IDEOGRAPH-F9F0 → CJK UNIFIED IDEOGRAPH-85FA       # 
+
+F935 ; 8606 ;  MA      # ( 蘆 → 蘆 ) CJK COMPATIBILITY IDEOGRAPH-F935 → CJK UNIFIED IDEOGRAPH-8606       # 
+
+FA20 ; 8612 ;  MA      # ( 蘒 → 蘒 ) CJK COMPATIBILITY IDEOGRAPH-FA20 → CJK UNIFIED IDEOGRAPH-8612       # 
+
+F91F ; 862D ;  MA      # ( 蘭 → 蘭 ) CJK COMPATIBILITY IDEOGRAPH-F91F → CJK UNIFIED IDEOGRAPH-862D       # 
+
+8641 ; 8637 ;  MA      # ( 虁 → 蘷 ) CJK UNIFIED IDEOGRAPH-8641 → CJK UNIFIED IDEOGRAPH-8637     # 
+
+F910 ; 863F ;  MA      # ( 蘿 → 蘿 ) CJK COMPATIBILITY IDEOGRAPH-F910 → CJK UNIFIED IDEOGRAPH-863F       # 
+
+2F8C ; 864D ;  MA      #* ( ⾌ → 虍 ) KANGXI RADICAL TIGER → CJK UNIFIED IDEOGRAPH-864D  # 
+
+2EC1 ; 864E ;  MA      #* ( ⻁ → 虎 ) CJK RADICAL TIGER → CJK UNIFIED IDEOGRAPH-864E     # 
+
+2F9B3 ;        8650 ;  MA      # ( 虐 → 虐 ) CJK COMPATIBILITY IDEOGRAPH-2F9B3 → CJK UNIFIED IDEOGRAPH-8650     # 
+
+F936 ; 865C ;  MA      # ( 虜 → 虜 ) CJK COMPATIBILITY IDEOGRAPH-F936 → CJK UNIFIED IDEOGRAPH-865C       # 
+2F9B4 ;        865C ;  MA      # ( 虜 → 虜 ) CJK COMPATIBILITY IDEOGRAPH-2F9B4 → CJK UNIFIED IDEOGRAPH-865C     # 
+
+2F9B5 ;        8667 ;  MA      # ( 虧 → 虧 ) CJK COMPATIBILITY IDEOGRAPH-2F9B5 → CJK UNIFIED IDEOGRAPH-8667     # 
+
+2F9B6 ;        8669 ;  MA      # ( 虩 → 虩 ) CJK COMPATIBILITY IDEOGRAPH-2F9B6 → CJK UNIFIED IDEOGRAPH-8669     # 
+
+2F8D ; 866B ;  MA      #* ( ⾍ → 虫 ) KANGXI RADICAL INSECT → CJK UNIFIED IDEOGRAPH-866B # 
+
+2F9B8 ;        8688 ;  MA      # ( 蚈 → 蚈 ) CJK COMPATIBILITY IDEOGRAPH-2F9B8 → CJK UNIFIED IDEOGRAPH-8688     # 
+
+2F9B7 ;        86A9 ;  MA      # ( 蚩 → 蚩 ) CJK COMPATIBILITY IDEOGRAPH-2F9B7 → CJK UNIFIED IDEOGRAPH-86A9     # 
+
+2F9BA ;        86E2 ;  MA      # ( 蛢 → 蛢 ) CJK COMPATIBILITY IDEOGRAPH-2F9BA → CJK UNIFIED IDEOGRAPH-86E2     # 
+
+2F9B9 ;        870E ;  MA      # ( 蜎 → 蜎 ) CJK COMPATIBILITY IDEOGRAPH-2F9B9 → CJK UNIFIED IDEOGRAPH-870E     # 
+
+2F9BC ;        8728 ;  MA      # ( 蜨 → 蜨 ) CJK COMPATIBILITY IDEOGRAPH-2F9BC → CJK UNIFIED IDEOGRAPH-8728     # 
+
+2F9BD ;        876B ;  MA      # ( 蝫 → 蝫 ) CJK COMPATIBILITY IDEOGRAPH-2F9BD → CJK UNIFIED IDEOGRAPH-876B     # 
+
+FAB5 ; 8779 ;  MA      # ( 蝹 → 蝹 ) CJK COMPATIBILITY IDEOGRAPH-FAB5 → CJK UNIFIED IDEOGRAPH-8779       # 
+2F9BB ;        8779 ;  MA      # ( 蝹 → 蝹 ) CJK COMPATIBILITY IDEOGRAPH-2F9BB → CJK UNIFIED IDEOGRAPH-8779     # 
+
+2F9BE ;        8786 ;  MA      # ( 螆 → 螆 ) CJK COMPATIBILITY IDEOGRAPH-2F9BE → CJK UNIFIED IDEOGRAPH-8786     # 
+
+F911 ; 87BA ;  MA      # ( 螺 → 螺 ) CJK COMPATIBILITY IDEOGRAPH-F911 → CJK UNIFIED IDEOGRAPH-87BA       # 
+
+2F9C0 ;        87E1 ;  MA      # ( 蟡 → 蟡 ) CJK COMPATIBILITY IDEOGRAPH-2F9C0 → CJK UNIFIED IDEOGRAPH-87E1     # 
+
+2F9C1 ;        8801 ;  MA      # ( 蠁 → 蠁 ) CJK COMPATIBILITY IDEOGRAPH-2F9C1 → CJK UNIFIED IDEOGRAPH-8801     # 
+
+F927 ; 881F ;  MA      # ( 蠟 → 蠟 ) CJK COMPATIBILITY IDEOGRAPH-F927 → CJK UNIFIED IDEOGRAPH-881F       # 
+
+2F8E ; 8840 ;  MA      #* ( ⾎ → 血 ) KANGXI RADICAL BLOOD → CJK UNIFIED IDEOGRAPH-8840  # 
+
+FA08 ; 884C ;  MA      # ( 行 → 行 ) CJK COMPATIBILITY IDEOGRAPH-FA08 → CJK UNIFIED IDEOGRAPH-884C       # 
+2F8F ; 884C ;  MA      #* ( ⾏ → 行 ) KANGXI RADICAL WALK ENCLOSURE → CJK UNIFIED IDEOGRAPH-884C # 
+
+2F9C3 ;        8860 ;  MA      # ( 衠 → 衠 ) CJK COMPATIBILITY IDEOGRAPH-2F9C3 → CJK UNIFIED IDEOGRAPH-8860     # 
+
+2F9C4 ;        8863 ;  MA      # ( 衣 → 衣 ) CJK COMPATIBILITY IDEOGRAPH-2F9C4 → CJK UNIFIED IDEOGRAPH-8863     # 
+2F90 ; 8863 ;  MA      #* ( ⾐ → 衣 ) KANGXI RADICAL CLOTHES → CJK UNIFIED IDEOGRAPH-8863        # 
+
+2EC2 ; 8864 ;  MA      #* ( ⻂ → 衤 ) CJK RADICAL CLOTHES → CJK UNIFIED IDEOGRAPH-8864   # 
+
+F9A0 ; 88C2 ;  MA      # ( 裂 → 裂 ) CJK COMPATIBILITY IDEOGRAPH-F9A0 → CJK UNIFIED IDEOGRAPH-88C2       # 
+
+F9E7 ; 88CF ;  MA      # ( 裏 → 裏 ) CJK COMPATIBILITY IDEOGRAPH-F9E7 → CJK UNIFIED IDEOGRAPH-88CF       # 
+
+2F9C6 ;        88D7 ;  MA      # ( 裗 → 裗 ) CJK COMPATIBILITY IDEOGRAPH-2F9C6 → CJK UNIFIED IDEOGRAPH-88D7     # 
+
+2F9C7 ;        88DE ;  MA      # ( 裞 → 裞 ) CJK COMPATIBILITY IDEOGRAPH-2F9C7 → CJK UNIFIED IDEOGRAPH-88DE     # 
+
+F9E8 ; 88E1 ;  MA      # ( 裡 → 裡 ) CJK COMPATIBILITY IDEOGRAPH-F9E8 → CJK UNIFIED IDEOGRAPH-88E1       # 
+
+F912 ; 88F8 ;  MA      # ( 裸 → 裸 ) CJK COMPATIBILITY IDEOGRAPH-F912 → CJK UNIFIED IDEOGRAPH-88F8       # 
+
+2F9C9 ;        88FA ;  MA      # ( 裺 → 裺 ) CJK COMPATIBILITY IDEOGRAPH-2F9C9 → CJK UNIFIED IDEOGRAPH-88FA     # 
+
+FA60 ; 8910 ;  MA      # ( 褐 → 褐 ) CJK COMPATIBILITY IDEOGRAPH-FA60 → CJK UNIFIED IDEOGRAPH-8910       # 
+
+FAB6 ; 8941 ;  MA      # ( 襁 → 襁 ) CJK COMPATIBILITY IDEOGRAPH-FAB6 → CJK UNIFIED IDEOGRAPH-8941       # 
+
+F924 ; 8964 ;  MA      # ( 襤 → 襤 ) CJK COMPATIBILITY IDEOGRAPH-F924 → CJK UNIFIED IDEOGRAPH-8964       # 
+
+2F91 ; 897E ;  MA      #* ( ⾑ → 襾 ) KANGXI RADICAL WEST → CJK UNIFIED IDEOGRAPH-897E   # 
+
+2EC4 ; 897F ;  MA      #* ( ⻄ → 西 ) CJK RADICAL WEST TWO → CJK UNIFIED IDEOGRAPH-897F  # 
+
+2EC3 ; 8980 ;  MA      #* ( ⻃ → 覀 ) CJK RADICAL WEST ONE → CJK UNIFIED IDEOGRAPH-8980  # 
+
+FAB7 ; 8986 ;  MA      # ( 覆 → 覆 ) CJK COMPATIBILITY IDEOGRAPH-FAB7 → CJK UNIFIED IDEOGRAPH-8986       # 
+
+FA0A ; 898B ;  MA      # ( 見 → 見 ) CJK COMPATIBILITY IDEOGRAPH-FA0A → CJK UNIFIED IDEOGRAPH-898B       # 
+2F92 ; 898B ;  MA      #* ( ⾒ → 見 ) KANGXI RADICAL SEE → CJK UNIFIED IDEOGRAPH-898B    # 
+
+FA61 ; 8996 ;  MA      # ( 視 → 視 ) CJK COMPATIBILITY IDEOGRAPH-FA61 → CJK UNIFIED IDEOGRAPH-8996       # 
+FAB8 ; 8996 ;  MA      # ( 視 → 視 ) CJK COMPATIBILITY IDEOGRAPH-FAB8 → CJK UNIFIED IDEOGRAPH-8996       # 
+
+2EC5 ; 89C1 ;  MA      #* ( ⻅ → 见 ) CJK RADICAL C-SIMPLIFIED SEE → CJK UNIFIED IDEOGRAPH-89C1  # 
+
+2F93 ; 89D2 ;  MA      #* ( ⾓ → 角 ) KANGXI RADICAL HORN → CJK UNIFIED IDEOGRAPH-89D2   # 
+
+2F94 ; 8A00 ;  MA      #* ( ⾔ → 言 ) KANGXI RADICAL SPEECH → CJK UNIFIED IDEOGRAPH-8A00 # 
+
+8A7D ; 8A2E ;  MA      # ( 詽 → 訮 ) CJK UNIFIED IDEOGRAPH-8A7D → CJK UNIFIED IDEOGRAPH-8A2E     # 
+
+2F9CF ;        8AA0 ;  MA      # ( 誠 → 誠 ) CJK COMPATIBILITY IDEOGRAPH-2F9CF → CJK UNIFIED IDEOGRAPH-8AA0     # 
+
+F96F ; 8AAA ;  MA      # ( 說 → 說 ) CJK COMPATIBILITY IDEOGRAPH-F96F → CJK UNIFIED IDEOGRAPH-8AAA       # 
+F9A1 ; 8AAA ;  MA      # ( 說 → 說 ) CJK COMPATIBILITY IDEOGRAPH-F9A1 → CJK UNIFIED IDEOGRAPH-8AAA       # 
+
+FAB9 ; 8ABF ;  MA      # ( 調 → 調 ) CJK COMPATIBILITY IDEOGRAPH-FAB9 → CJK UNIFIED IDEOGRAPH-8ABF       # 
+
+FABB ; 8ACB ;  MA      # ( 請 → 請 ) CJK COMPATIBILITY IDEOGRAPH-FABB → CJK UNIFIED IDEOGRAPH-8ACB       # 
+
+F97D ; 8AD2 ;  MA      # ( 諒 → 諒 ) CJK COMPATIBILITY IDEOGRAPH-F97D → CJK UNIFIED IDEOGRAPH-8AD2       # 
+
+F941 ; 8AD6 ;  MA      # ( 論 → 論 ) CJK COMPATIBILITY IDEOGRAPH-F941 → CJK UNIFIED IDEOGRAPH-8AD6       # 
+
+FABE ; 8AED ;  MA      # ( 諭 → 諭 ) CJK COMPATIBILITY IDEOGRAPH-FABE → CJK UNIFIED IDEOGRAPH-8AED       # 
+2F9D0 ;        8AED ;  MA      # ( 諭 → 諭 ) CJK COMPATIBILITY IDEOGRAPH-2F9D0 → CJK UNIFIED IDEOGRAPH-8AED     # 
+
+FA22 ; 8AF8 ;  MA      # ( 諸 → 諸 ) CJK COMPATIBILITY IDEOGRAPH-FA22 → CJK UNIFIED IDEOGRAPH-8AF8       # 
+FABA ; 8AF8 ;  MA      # ( 諸 → 諸 ) CJK COMPATIBILITY IDEOGRAPH-FABA → CJK UNIFIED IDEOGRAPH-8AF8       # 
+
+F95D ; 8AFE ;  MA      # ( 諾 → 諾 ) CJK COMPATIBILITY IDEOGRAPH-F95D → CJK UNIFIED IDEOGRAPH-8AFE       # 
+FABD ; 8AFE ;  MA      # ( 諾 → 諾 ) CJK COMPATIBILITY IDEOGRAPH-FABD → CJK UNIFIED IDEOGRAPH-8AFE       # 
+
+FA62 ; 8B01 ;  MA      # ( 謁 → 謁 ) CJK COMPATIBILITY IDEOGRAPH-FA62 → CJK UNIFIED IDEOGRAPH-8B01       # 
+FABC ; 8B01 ;  MA      # ( 謁 → 謁 ) CJK COMPATIBILITY IDEOGRAPH-FABC → CJK UNIFIED IDEOGRAPH-8B01       # 
+
+FA63 ; 8B39 ;  MA      # ( 謹 → 謹 ) CJK COMPATIBILITY IDEOGRAPH-FA63 → CJK UNIFIED IDEOGRAPH-8B39       # 
+FABF ; 8B39 ;  MA      # ( 謹 → 謹 ) CJK COMPATIBILITY IDEOGRAPH-FABF → CJK UNIFIED IDEOGRAPH-8B39       # 
+
+F9FC ; 8B58 ;  MA      # ( 識 → 識 ) CJK COMPATIBILITY IDEOGRAPH-F9FC → CJK UNIFIED IDEOGRAPH-8B58       # 
+
+F95A ; 8B80 ;  MA      # ( 讀 → 讀 ) CJK COMPATIBILITY IDEOGRAPH-F95A → CJK UNIFIED IDEOGRAPH-8B80       # 
+
+8B8F ; 8B86 ;  MA      # ( 讏 → 讆 ) CJK UNIFIED IDEOGRAPH-8B8F → CJK UNIFIED IDEOGRAPH-8B86     # 
+
+FAC0 ; 8B8A ;  MA      # ( 變 → 變 ) CJK COMPATIBILITY IDEOGRAPH-FAC0 → CJK UNIFIED IDEOGRAPH-8B8A       # 
+2F9D1 ;        8B8A ;  MA      # ( 變 → 變 ) CJK COMPATIBILITY IDEOGRAPH-2F9D1 → CJK UNIFIED IDEOGRAPH-8B8A     # 
+
+2EC8 ; 8BA0 ;  MA      #* ( ⻈ → 讠 ) CJK RADICAL C-SIMPLIFIED SPEECH → CJK UNIFIED IDEOGRAPH-8BA0       # 
+
+2F95 ; 8C37 ;  MA      #* ( ⾕ → 谷 ) KANGXI RADICAL VALLEY → CJK UNIFIED IDEOGRAPH-8C37 # 
+
+2F96 ; 8C46 ;  MA      #* ( ⾖ → 豆 ) KANGXI RADICAL BEAN → CJK UNIFIED IDEOGRAPH-8C46   # 
+
+F900 ; 8C48 ;  MA      # ( 豈 → 豈 ) CJK COMPATIBILITY IDEOGRAPH-F900 → CJK UNIFIED IDEOGRAPH-8C48       # 
+
+2F9D2 ;        8C55 ;  MA      # ( 豕 → 豕 ) CJK COMPATIBILITY IDEOGRAPH-2F9D2 → CJK UNIFIED IDEOGRAPH-8C55     # 
+2F97 ; 8C55 ;  MA      #* ( ⾗ → 豕 ) KANGXI RADICAL PIG → CJK UNIFIED IDEOGRAPH-8C55    # 
+
+8C63 ; 8C5C ;  MA      # ( 豣 → 豜 ) CJK UNIFIED IDEOGRAPH-8C63 → CJK UNIFIED IDEOGRAPH-8C5C     # 
+
+2F98 ; 8C78 ;  MA      #* ( ⾘ → 豸 ) KANGXI RADICAL BADGER → CJK UNIFIED IDEOGRAPH-8C78 # 
+
+2F99 ; 8C9D ;  MA      #* ( ⾙ → 貝 ) KANGXI RADICAL SHELL → CJK UNIFIED IDEOGRAPH-8C9D  # 
+
+2F9D4 ;        8CAB ;  MA      # ( 貫 → 貫 ) CJK COMPATIBILITY IDEOGRAPH-2F9D4 → CJK UNIFIED IDEOGRAPH-8CAB     # 
+
+2F9D5 ;        8CC1 ;  MA      # ( 賁 → 賁 ) CJK COMPATIBILITY IDEOGRAPH-2F9D5 → CJK UNIFIED IDEOGRAPH-8CC1     # 
+
+F948 ; 8CC2 ;  MA      # ( 賂 → 賂 ) CJK COMPATIBILITY IDEOGRAPH-F948 → CJK UNIFIED IDEOGRAPH-8CC2       # 
+
+F903 ; 8CC8 ;  MA      # ( 賈 → 賈 ) CJK COMPATIBILITY IDEOGRAPH-F903 → CJK UNIFIED IDEOGRAPH-8CC8       # 
+
+FA64 ; 8CD3 ;  MA      # ( 賓 → 賓 ) CJK COMPATIBILITY IDEOGRAPH-FA64 → CJK UNIFIED IDEOGRAPH-8CD3       # 
+
+FA65 ; 8D08 ;  MA      # ( 贈 → 贈 ) CJK COMPATIBILITY IDEOGRAPH-FA65 → CJK UNIFIED IDEOGRAPH-8D08       # 
+FAC1 ; 8D08 ;  MA      # ( 贈 → 贈 ) CJK COMPATIBILITY IDEOGRAPH-FAC1 → CJK UNIFIED IDEOGRAPH-8D08       # 
+
+2F9D6 ;        8D1B ;  MA      # ( 贛 → 贛 ) CJK COMPATIBILITY IDEOGRAPH-2F9D6 → CJK UNIFIED IDEOGRAPH-8D1B     # 
+
+2EC9 ; 8D1D ;  MA      #* ( ⻉ → 贝 ) CJK RADICAL C-SIMPLIFIED SHELL → CJK UNIFIED IDEOGRAPH-8D1D        # 
+
+2F9A ; 8D64 ;  MA      #* ( ⾚ → 赤 ) KANGXI RADICAL RED → CJK UNIFIED IDEOGRAPH-8D64    # 
+
+2F9B ; 8D70 ;  MA      #* ( ⾛ → 走 ) KANGXI RADICAL RUN → CJK UNIFIED IDEOGRAPH-8D70    # 
+
+2F9D7 ;        8D77 ;  MA      # ( 起 → 起 ) CJK COMPATIBILITY IDEOGRAPH-2F9D7 → CJK UNIFIED IDEOGRAPH-8D77     # 
+
+8D86 ; 8D7F ;  MA      # ( 趆 → 赿 ) CJK UNIFIED IDEOGRAPH-8D86 → CJK UNIFIED IDEOGRAPH-8D7F     # 
+
+2F9C ; 8DB3 ;  MA      #* ( ⾜ → 足 ) KANGXI RADICAL FOOT → CJK UNIFIED IDEOGRAPH-8DB3   # 
+
+2F9DB ;        8DBC ;  MA      # ( 趼 → 趼 ) CJK COMPATIBILITY IDEOGRAPH-2F9DB → CJK UNIFIED IDEOGRAPH-8DBC     # 
+
+2F9DA ;        8DCB ;  MA      # ( 跋 → 跋 ) CJK COMPATIBILITY IDEOGRAPH-2F9DA → CJK UNIFIED IDEOGRAPH-8DCB     # 
+
+8DFA ; 8DE5 ;  MA      # ( 跺 → 跥 ) CJK UNIFIED IDEOGRAPH-8DFA → CJK UNIFIED IDEOGRAPH-8DE5     # 
+
+F937 ; 8DEF ;  MA      # ( 路 → 路 ) CJK COMPATIBILITY IDEOGRAPH-F937 → CJK UNIFIED IDEOGRAPH-8DEF       # 
+
+2F9DC ;        8DF0 ;  MA      # ( 跰 → 跰 ) CJK COMPATIBILITY IDEOGRAPH-2F9DC → CJK UNIFIED IDEOGRAPH-8DF0     # 
+
+8E9B ; 8E97 ;  MA      # ( 躛 → 躗 ) CJK UNIFIED IDEOGRAPH-8E9B → CJK UNIFIED IDEOGRAPH-8E97     # 
+
+2F9D ; 8EAB ;  MA      #* ( ⾝ → 身 ) KANGXI RADICAL BODY → CJK UNIFIED IDEOGRAPH-8EAB   # 
+
+F902 ; 8ECA ;  MA      # ( 車 → 車 ) CJK COMPATIBILITY IDEOGRAPH-F902 → CJK UNIFIED IDEOGRAPH-8ECA       # 
+2F9E ; 8ECA ;  MA      #* ( ⾞ → 車 ) KANGXI RADICAL CART → CJK UNIFIED IDEOGRAPH-8ECA   # 
+
+2F9DE ;        8ED4 ;  MA      # ( 軔 → 軔 ) CJK COMPATIBILITY IDEOGRAPH-2F9DE → CJK UNIFIED IDEOGRAPH-8ED4     # 
+
+8F27 ; 8EFF ;  MA      # ( 輧 → 軿 ) CJK UNIFIED IDEOGRAPH-8F27 → CJK UNIFIED IDEOGRAPH-8EFF     # 
+
+F998 ; 8F26 ;  MA      # ( 輦 → 輦 ) CJK COMPATIBILITY IDEOGRAPH-F998 → CJK UNIFIED IDEOGRAPH-8F26       # 
+
+F9D7 ; 8F2A ;  MA      # ( 輪 → 輪 ) CJK COMPATIBILITY IDEOGRAPH-F9D7 → CJK UNIFIED IDEOGRAPH-8F2A       # 
+
+FAC2 ; 8F38 ;  MA      # ( 輸 → 輸 ) CJK COMPATIBILITY IDEOGRAPH-FAC2 → CJK UNIFIED IDEOGRAPH-8F38       # 
+2F9DF ;        8F38 ;  MA      # ( 輸 → 輸 ) CJK COMPATIBILITY IDEOGRAPH-2F9DF → CJK UNIFIED IDEOGRAPH-8F38     # 
+
+FA07 ; 8F3B ;  MA      # ( 輻 → 輻 ) CJK COMPATIBILITY IDEOGRAPH-FA07 → CJK UNIFIED IDEOGRAPH-8F3B       # 
+
+F98D ; 8F62 ;  MA      # ( 轢 → 轢 ) CJK COMPATIBILITY IDEOGRAPH-F98D → CJK UNIFIED IDEOGRAPH-8F62       # 
+
+2ECB ; 8F66 ;  MA      #* ( ⻋ → 车 ) CJK RADICAL C-SIMPLIFIED CART → CJK UNIFIED IDEOGRAPH-8F66 # 
+
+2F9F ; 8F9B ;  MA      #* ( ⾟ → 辛 ) KANGXI RADICAL BITTER → CJK UNIFIED IDEOGRAPH-8F9B # 
+
+2F98D ;        8F9E ;  MA      # ( 辞 → 辞 ) CJK COMPATIBILITY IDEOGRAPH-2F98D → CJK UNIFIED IDEOGRAPH-8F9E     # 
+
+F971 ; 8FB0 ;  MA      # ( 辰 → 辰 ) CJK COMPATIBILITY IDEOGRAPH-F971 → CJK UNIFIED IDEOGRAPH-8FB0       # 
+2FA0 ; 8FB0 ;  MA      #* ( ⾠ → 辰 ) KANGXI RADICAL MORNING → CJK UNIFIED IDEOGRAPH-8FB0        # 
+
+2FA1 ; 8FB5 ;  MA      #* ( ⾡ → 辵 ) KANGXI RADICAL WALK → CJK UNIFIED IDEOGRAPH-8FB5   # 
+
+FA66 ; 8FB6 ;  MA      # ( 辶 → 辶 ) CJK COMPATIBILITY IDEOGRAPH-FA66 → CJK UNIFIED IDEOGRAPH-8FB6       # 
+2ECC ; 8FB6 ;  MA      #* ( ⻌ → 辶 ) CJK RADICAL SIMPLIFIED WALK → CJK UNIFIED IDEOGRAPH-8FB6   # 
+2ECD ; 8FB6 ;  MA      #* ( ⻍ → 辶 ) CJK RADICAL WALK ONE → CJK UNIFIED IDEOGRAPH-8FB6  # 
+
+F99A ; 9023 ;  MA      # ( 連 → 連 ) CJK COMPATIBILITY IDEOGRAPH-F99A → CJK UNIFIED IDEOGRAPH-9023       # 
+
+FA25 ; 9038 ;  MA      # ( 逸 → 逸 ) CJK COMPATIBILITY IDEOGRAPH-FA25 → CJK UNIFIED IDEOGRAPH-9038       # 
+FA67 ; 9038 ;  MA      # ( 逸 → 逸 ) CJK COMPATIBILITY IDEOGRAPH-FA67 → CJK UNIFIED IDEOGRAPH-9038       # 
+
+FAC3 ; 9072 ;  MA      # ( 遲 → 遲 ) CJK COMPATIBILITY IDEOGRAPH-FAC3 → CJK UNIFIED IDEOGRAPH-9072       # 
+
+F9C3 ; 907C ;  MA      # ( 遼 → 遼 ) CJK COMPATIBILITY IDEOGRAPH-F9C3 → CJK UNIFIED IDEOGRAPH-907C       # 
+
+F913 ; 908F ;  MA      # ( 邏 → 邏 ) CJK COMPATIBILITY IDEOGRAPH-F913 → CJK UNIFIED IDEOGRAPH-908F       # 
+
+2FA2 ; 9091 ;  MA      #* ( ⾢ → 邑 ) KANGXI RADICAL CITY → CJK UNIFIED IDEOGRAPH-9091   # 
+
+2F9E2 ;        9094 ;  MA      # ( 邔 → 邔 ) CJK COMPATIBILITY IDEOGRAPH-2F9E2 → CJK UNIFIED IDEOGRAPH-9094     # 
+
+F92C ; 90CE ;  MA      # ( 郎 → 郎 ) CJK COMPATIBILITY IDEOGRAPH-F92C → CJK UNIFIED IDEOGRAPH-90CE       # 
+90DE ; 90CE ;  MA      # ( 郞 → 郎 ) CJK UNIFIED IDEOGRAPH-90DE → CJK UNIFIED IDEOGRAPH-90CE     # →郎→
+
+2F9E3 ;        90F1 ;  MA      # ( 郱 → 郱 ) CJK COMPATIBILITY IDEOGRAPH-2F9E3 → CJK UNIFIED IDEOGRAPH-90F1     # 
+
+FA26 ; 90FD ;  MA      # ( 都 → 都 ) CJK COMPATIBILITY IDEOGRAPH-FA26 → CJK UNIFIED IDEOGRAPH-90FD       # 
+
+2F9E4 ;        9111 ;  MA      # ( 鄑 → 鄑 ) CJK COMPATIBILITY IDEOGRAPH-2F9E4 → CJK UNIFIED IDEOGRAPH-9111     # 
+
+2F9E6 ;        911B ;  MA      # ( 鄛 → 鄛 ) CJK COMPATIBILITY IDEOGRAPH-2F9E6 → CJK UNIFIED IDEOGRAPH-911B     # 
+
+2FA3 ; 9149 ;  MA      #* ( ⾣ → 酉 ) KANGXI RADICAL WINE → CJK UNIFIED IDEOGRAPH-9149   # 
+
+F919 ; 916A ;  MA      # ( 酪 → 酪 ) CJK COMPATIBILITY IDEOGRAPH-F919 → CJK UNIFIED IDEOGRAPH-916A       # 
+
+FAC4 ; 9199 ;  MA      # ( 醙 → 醙 ) CJK COMPATIBILITY IDEOGRAPH-FAC4 → CJK UNIFIED IDEOGRAPH-9199       # 
+
+F9B7 ; 91B4 ;  MA      # ( 醴 → 醴 ) CJK COMPATIBILITY IDEOGRAPH-F9B7 → CJK UNIFIED IDEOGRAPH-91B4       # 
+
+2FA4 ; 91C6 ;  MA      #* ( ⾤ → 釆 ) KANGXI RADICAL DISTINGUISH → CJK UNIFIED IDEOGRAPH-91C6    # 
+
+F9E9 ; 91CC ;  MA      # ( 里 → 里 ) CJK COMPATIBILITY IDEOGRAPH-F9E9 → CJK UNIFIED IDEOGRAPH-91CC       # 
+2FA5 ; 91CC ;  MA      #* ( ⾥ → 里 ) KANGXI RADICAL VILLAGE → CJK UNIFIED IDEOGRAPH-91CC        # 
+
+F97E ; 91CF ;  MA      # ( 量 → 量 ) CJK COMPATIBILITY IDEOGRAPH-F97E → CJK UNIFIED IDEOGRAPH-91CF       # 
+
+F90A ; 91D1 ;  MA      # ( 金 → 金 ) CJK COMPATIBILITY IDEOGRAPH-F90A → CJK UNIFIED IDEOGRAPH-91D1       # 
+2FA6 ; 91D1 ;  MA      #* ( ⾦ → 金 ) KANGXI RADICAL GOLD → CJK UNIFIED IDEOGRAPH-91D1   # 
+
+F9B1 ; 9234 ;  MA      # ( 鈴 → 鈴 ) CJK COMPATIBILITY IDEOGRAPH-F9B1 → CJK UNIFIED IDEOGRAPH-9234       # 
+
+2F9E7 ;        9238 ;  MA      # ( 鈸 → 鈸 ) CJK COMPATIBILITY IDEOGRAPH-2F9E7 → CJK UNIFIED IDEOGRAPH-9238     # 
+
+FAC5 ; 9276 ;  MA      # ( 鉶 → 鉶 ) CJK COMPATIBILITY IDEOGRAPH-FAC5 → CJK UNIFIED IDEOGRAPH-9276       # 
+
+2F9EA ;        927C ;  MA      # ( 鉼 → 鉼 ) CJK COMPATIBILITY IDEOGRAPH-2F9EA → CJK UNIFIED IDEOGRAPH-927C     # 
+
+2F9E8 ;        92D7 ;  MA      # ( 鋗 → 鋗 ) CJK COMPATIBILITY IDEOGRAPH-2F9E8 → CJK UNIFIED IDEOGRAPH-92D7     # 
+
+2F9E9 ;        92D8 ;  MA      # ( 鋘 → 鋘 ) CJK COMPATIBILITY IDEOGRAPH-2F9E9 → CJK UNIFIED IDEOGRAPH-92D8     # 
+
+F93F ; 9304 ;  MA      # ( 錄 → 錄 ) CJK COMPATIBILITY IDEOGRAPH-F93F → CJK UNIFIED IDEOGRAPH-9304       # 
+
+F99B ; 934A ;  MA      # ( 鍊 → 鍊 ) CJK COMPATIBILITY IDEOGRAPH-F99B → CJK UNIFIED IDEOGRAPH-934A       # 
+
+93AE ; 93AD ;  MA      # ( 鎮 → 鎭 ) CJK UNIFIED IDEOGRAPH-93AE → CJK UNIFIED IDEOGRAPH-93AD     # 
+
+2F9EB ;        93F9 ;  MA      # ( 鏹 → 鏹 ) CJK COMPATIBILITY IDEOGRAPH-2F9EB → CJK UNIFIED IDEOGRAPH-93F9     # 
+
+2F9EC ;        9415 ;  MA      # ( 鐕 → 鐕 ) CJK COMPATIBILITY IDEOGRAPH-2F9EC → CJK UNIFIED IDEOGRAPH-9415     # 
+
+2ED0 ; 9485 ;  MA      #* ( ⻐ → 钅 ) CJK RADICAL C-SIMPLIFIED GOLD → CJK UNIFIED IDEOGRAPH-9485 # 
+
+2ED1 ; 9577 ;  MA      #* ( ⻑ → 長 ) CJK RADICAL LONG ONE → CJK UNIFIED IDEOGRAPH-9577  # 
+2FA7 ; 9577 ;  MA      #* ( ⾧ → 長 ) KANGXI RADICAL LONG → CJK UNIFIED IDEOGRAPH-9577   # 
+
+2ED2 ; 9578 ;  MA      #* ( ⻒ → 镸 ) CJK RADICAL LONG TWO → CJK UNIFIED IDEOGRAPH-9578  # 
+
+2ED3 ; 957F ;  MA      #* ( ⻓ → 长 ) CJK RADICAL C-SIMPLIFIED LONG → CJK UNIFIED IDEOGRAPH-957F # 
+
+2FA8 ; 9580 ;  MA      #* ( ⾨ → 門 ) KANGXI RADICAL GATE → CJK UNIFIED IDEOGRAPH-9580   # 
+
+2F9EE ;        958B ;  MA      # ( 開 → 開 ) CJK COMPATIBILITY IDEOGRAPH-2F9EE → CJK UNIFIED IDEOGRAPH-958B     # 
+
+F986 ; 95AD ;  MA      # ( 閭 → 閭 ) CJK COMPATIBILITY IDEOGRAPH-F986 → CJK UNIFIED IDEOGRAPH-95AD       # 
+
+2F9F0 ;        95B7 ;  MA      # ( 閷 → 閷 ) CJK COMPATIBILITY IDEOGRAPH-2F9F0 → CJK UNIFIED IDEOGRAPH-95B7     # 
+
+2ED4 ; 95E8 ;  MA      #* ( ⻔ → 门 ) CJK RADICAL C-SIMPLIFIED GATE → CJK UNIFIED IDEOGRAPH-95E8 # 
+
+2FA9 ; 961C ;  MA      #* ( ⾩ → 阜 ) KANGXI RADICAL MOUND → CJK UNIFIED IDEOGRAPH-961C  # 
+
+2ECF ; 961D ;  MA      #* ( ⻏ → 阝 ) CJK RADICAL CITY → CJK UNIFIED IDEOGRAPH-961D      # 
+2ED6 ; 961D ;  MA      #* ( ⻖ → 阝 ) CJK RADICAL MOUND TWO → CJK UNIFIED IDEOGRAPH-961D # 
+
+F9C6 ; 962E ;  MA      # ( 阮 → 阮 ) CJK COMPATIBILITY IDEOGRAPH-F9C6 → CJK UNIFIED IDEOGRAPH-962E       # 
+
+F951 ; 964B ;  MA      # ( 陋 → 陋 ) CJK COMPATIBILITY IDEOGRAPH-F951 → CJK UNIFIED IDEOGRAPH-964B       # 
+
+FA09 ; 964D ;  MA      # ( 降 → 降 ) CJK COMPATIBILITY IDEOGRAPH-FA09 → CJK UNIFIED IDEOGRAPH-964D       # 
+
+F959 ; 9675 ;  MA      # ( 陵 → 陵 ) CJK COMPATIBILITY IDEOGRAPH-F959 → CJK UNIFIED IDEOGRAPH-9675       # 
+
+F9D3 ; 9678 ;  MA      # ( 陸 → 陸 ) CJK COMPATIBILITY IDEOGRAPH-F9D3 → CJK UNIFIED IDEOGRAPH-9678       # 
+
+FAC6 ; 967C ;  MA      # ( 陼 → 陼 ) CJK COMPATIBILITY IDEOGRAPH-FAC6 → CJK UNIFIED IDEOGRAPH-967C       # 
+
+F9DC ; 9686 ;  MA      # ( 隆 → 隆 ) CJK COMPATIBILITY IDEOGRAPH-F9DC → CJK UNIFIED IDEOGRAPH-9686       # 
+
+F9F1 ; 96A3 ;  MA      # ( 隣 → 隣 ) CJK COMPATIBILITY IDEOGRAPH-F9F1 → CJK UNIFIED IDEOGRAPH-96A3       # 
+
+2FAA ; 96B6 ;  MA      #* ( ⾪ → 隶 ) KANGXI RADICAL SLAVE → CJK UNIFIED IDEOGRAPH-96B6  # 
+
+96B8 ; 96B7 ;  MA      # ( 隸 → 隷 ) CJK UNIFIED IDEOGRAPH-96B8 → CJK UNIFIED IDEOGRAPH-96B7     # →隸→
+F9B8 ; 96B7 ;  MA      # ( 隸 → 隷 ) CJK COMPATIBILITY IDEOGRAPH-F9B8 → CJK UNIFIED IDEOGRAPH-96B7       # 
+
+2FAB ; 96B9 ;  MA      #* ( ⾫ → 隹 ) KANGXI RADICAL SHORT TAILED BIRD → CJK UNIFIED IDEOGRAPH-96B9      # 
+
+2F9F3 ;        96C3 ;  MA      # ( 雃 → 雃 ) CJK COMPATIBILITY IDEOGRAPH-2F9F3 → CJK UNIFIED IDEOGRAPH-96C3     # 
+
+F9EA ; 96E2 ;  MA      # ( 離 → 離 ) CJK COMPATIBILITY IDEOGRAPH-F9EA → CJK UNIFIED IDEOGRAPH-96E2       # 
+
+FA68 ; 96E3 ;  MA      # ( 難 → 難 ) CJK COMPATIBILITY IDEOGRAPH-FA68 → CJK UNIFIED IDEOGRAPH-96E3       # 
+FAC7 ; 96E3 ;  MA      # ( 難 → 難 ) CJK COMPATIBILITY IDEOGRAPH-FAC7 → CJK UNIFIED IDEOGRAPH-96E3       # 
+
+2FAC ; 96E8 ;  MA      #* ( ⾬ → 雨 ) KANGXI RADICAL RAIN → CJK UNIFIED IDEOGRAPH-96E8   # 
+
+F9B2 ; 96F6 ;  MA      # ( 零 → 零 ) CJK COMPATIBILITY IDEOGRAPH-F9B2 → CJK UNIFIED IDEOGRAPH-96F6       # 
+
+F949 ; 96F7 ;  MA      # ( 雷 → 雷 ) CJK COMPATIBILITY IDEOGRAPH-F949 → CJK UNIFIED IDEOGRAPH-96F7       # 
+
+2F9F5 ;        9723 ;  MA      # ( 霣 → 霣 ) CJK COMPATIBILITY IDEOGRAPH-2F9F5 → CJK UNIFIED IDEOGRAPH-9723     # 
+
+F938 ; 9732 ;  MA      # ( 露 → 露 ) CJK COMPATIBILITY IDEOGRAPH-F938 → CJK UNIFIED IDEOGRAPH-9732       # 
+
+F9B3 ; 9748 ;  MA      # ( 靈 → 靈 ) CJK COMPATIBILITY IDEOGRAPH-F9B3 → CJK UNIFIED IDEOGRAPH-9748       # 
+
+2FAD ; 9751 ;  MA      #* ( ⾭ → 靑 ) KANGXI RADICAL BLUE → CJK UNIFIED IDEOGRAPH-9751   # 
+
+2ED8 ; 9752 ;  MA      #* ( ⻘ → 青 ) CJK RADICAL BLUE → CJK UNIFIED IDEOGRAPH-9752      # 
+
+FA1C ; 9756 ;  MA      # ( 靖 → 靖 ) CJK COMPATIBILITY IDEOGRAPH-FA1C → CJK UNIFIED IDEOGRAPH-9756       # 
+FAC8 ; 9756 ;  MA      # ( 靖 → 靖 ) CJK COMPATIBILITY IDEOGRAPH-FAC8 → CJK UNIFIED IDEOGRAPH-9756       # 
+
+2FAE ; 975E ;  MA      #* ( ⾮ → 非 ) KANGXI RADICAL WRONG → CJK UNIFIED IDEOGRAPH-975E  # 
+
+2FAF ; 9762 ;  MA      #* ( ⾯ → 面 ) KANGXI RADICAL FACE → CJK UNIFIED IDEOGRAPH-9762   # 
+
+2FB0 ; 9769 ;  MA      #* ( ⾰ → 革 ) KANGXI RADICAL LEATHER → CJK UNIFIED IDEOGRAPH-9769        # 
+
+2FB1 ; 97CB ;  MA      #* ( ⾱ → 韋 ) KANGXI RADICAL TANNED LEATHER → CJK UNIFIED IDEOGRAPH-97CB # 
+
+FAC9 ; 97DB ;  MA      # ( 韛 → 韛 ) CJK COMPATIBILITY IDEOGRAPH-FAC9 → CJK UNIFIED IDEOGRAPH-97DB       # 
+
+2F9FA ;        97E0 ;  MA      # ( 韠 → 韠 ) CJK COMPATIBILITY IDEOGRAPH-2F9FA → CJK UNIFIED IDEOGRAPH-97E0     # 
+
+2ED9 ; 97E6 ;  MA      #* ( ⻙ → 韦 ) CJK RADICAL C-SIMPLIFIED TANNED LEATHER → CJK UNIFIED IDEOGRAPH-97E6       # 
+
+2FB2 ; 97ED ;  MA      #* ( ⾲ → 韭 ) KANGXI RADICAL LEEK → CJK UNIFIED IDEOGRAPH-97ED   # 
+
+2FB3 ; 97F3 ;  MA      #* ( ⾳ → 音 ) KANGXI RADICAL SOUND → CJK UNIFIED IDEOGRAPH-97F3  # 
+
+FA69 ; 97FF ;  MA      # ( 響 → 響 ) CJK COMPATIBILITY IDEOGRAPH-FA69 → CJK UNIFIED IDEOGRAPH-97FF       # 
+FACA ; 97FF ;  MA      # ( 響 → 響 ) CJK COMPATIBILITY IDEOGRAPH-FACA → CJK UNIFIED IDEOGRAPH-97FF       # 
+
+2FB4 ; 9801 ;  MA      #* ( ⾴ → 頁 ) KANGXI RADICAL LEAF → CJK UNIFIED IDEOGRAPH-9801   # 
+
+FACB ; 980B ;  MA      # ( 頋 → 頋 ) CJK COMPATIBILITY IDEOGRAPH-FACB → CJK UNIFIED IDEOGRAPH-980B       # 
+2F9FE ;        980B ;  MA      # ( 頋 → 頋 ) CJK COMPATIBILITY IDEOGRAPH-2F9FE → CJK UNIFIED IDEOGRAPH-980B     # 
+2F9FF ;        980B ;  MA      # ( 頋 → 頋 ) CJK COMPATIBILITY IDEOGRAPH-2F9FF → CJK UNIFIED IDEOGRAPH-980B     # 
+
+F9B4 ; 9818 ;  MA      # ( 領 → 領 ) CJK COMPATIBILITY IDEOGRAPH-F9B4 → CJK UNIFIED IDEOGRAPH-9818       # 
+
+2FA00 ;        9829 ;  MA      # ( 頩 → 頩 ) CJK COMPATIBILITY IDEOGRAPH-2FA00 → CJK UNIFIED IDEOGRAPH-9829     # 
+
+FA6A ; 983B ;  MA      # ( 頻 → 頻 ) CJK COMPATIBILITY IDEOGRAPH-FA6A → CJK UNIFIED IDEOGRAPH-983B       # 
+FACC ; 983B ;  MA      # ( 頻 → 頻 ) CJK COMPATIBILITY IDEOGRAPH-FACC → CJK UNIFIED IDEOGRAPH-983B       # 
+
+F9D0 ; 985E ;  MA      # ( 類 → 類 ) CJK COMPATIBILITY IDEOGRAPH-F9D0 → CJK UNIFIED IDEOGRAPH-985E       # 
+
+2EDA ; 9875 ;  MA      #* ( ⻚ → 页 ) CJK RADICAL C-SIMPLIFIED LEAF → CJK UNIFIED IDEOGRAPH-9875 # 
+
+2FB5 ; 98A8 ;  MA      #* ( ⾵ → 風 ) KANGXI RADICAL WIND → CJK UNIFIED IDEOGRAPH-98A8   # 
+
+2EDB ; 98CE ;  MA      #* ( ⻛ → 风 ) CJK RADICAL C-SIMPLIFIED WIND → CJK UNIFIED IDEOGRAPH-98CE # 
+
+2FB6 ; 98DB ;  MA      #* ( ⾶ → 飛 ) KANGXI RADICAL FLY → CJK UNIFIED IDEOGRAPH-98DB    # 
+
+2EDC ; 98DE ;  MA      #* ( ⻜ → 飞 ) CJK RADICAL C-SIMPLIFIED FLY → CJK UNIFIED IDEOGRAPH-98DE  # 
+
+2EDD ; 98DF ;  MA      #* ( ⻝ → 食 ) CJK RADICAL EAT ONE → CJK UNIFIED IDEOGRAPH-98DF   # 
+2FB7 ; 98DF ;  MA      #* ( ⾷ → 食 ) KANGXI RADICAL EAT → CJK UNIFIED IDEOGRAPH-98DF    # 
+
+2EDF ; 98E0 ;  MA      #* ( ⻟ → 飠 ) CJK RADICAL EAT THREE → CJK UNIFIED IDEOGRAPH-98E0 # 
+
+2FA02 ;        98E2 ;  MA      # ( 飢 → 飢 ) CJK COMPATIBILITY IDEOGRAPH-2FA02 → CJK UNIFIED IDEOGRAPH-98E2     # 
+
+FA2A ; 98EF ;  MA      # ( 飯 → 飯 ) CJK COMPATIBILITY IDEOGRAPH-FA2A → CJK UNIFIED IDEOGRAPH-98EF       # 
+
+FA2B ; 98FC ;  MA      # ( 飼 → 飼 ) CJK COMPATIBILITY IDEOGRAPH-FA2B → CJK UNIFIED IDEOGRAPH-98FC       # 
+
+FA2C ; 9928 ;  MA      # ( 館 → 館 ) CJK COMPATIBILITY IDEOGRAPH-FA2C → CJK UNIFIED IDEOGRAPH-9928       # 
+
+2FA04 ;        9929 ;  MA      # ( 餩 → 餩 ) CJK COMPATIBILITY IDEOGRAPH-2FA04 → CJK UNIFIED IDEOGRAPH-9929     # 
+
+2EE0 ; 9963 ;  MA      #* ( ⻠ → 饣 ) CJK RADICAL C-SIMPLIFIED EAT → CJK UNIFIED IDEOGRAPH-9963  # 
+
+2FB8 ; 9996 ;  MA      #* ( ⾸ → 首 ) KANGXI RADICAL HEAD → CJK UNIFIED IDEOGRAPH-9996   # 
+
+2FB9 ; 9999 ;  MA      #* ( ⾹ → 香 ) KANGXI RADICAL FRAGRANT → CJK UNIFIED IDEOGRAPH-9999       # 
+
+2FA05 ;        99A7 ;  MA      # ( 馧 → 馧 ) CJK COMPATIBILITY IDEOGRAPH-2FA05 → CJK UNIFIED IDEOGRAPH-99A7     # 
+
+2FBA ; 99AC ;  MA      #* ( ⾺ → 馬 ) KANGXI RADICAL HORSE → CJK UNIFIED IDEOGRAPH-99AC  # 
+
+2FA06 ;        99C2 ;  MA      # ( 駂 → 駂 ) CJK COMPATIBILITY IDEOGRAPH-2FA06 → CJK UNIFIED IDEOGRAPH-99C2     # 
+
+F91A ; 99F1 ;  MA      # ( 駱 → 駱 ) CJK COMPATIBILITY IDEOGRAPH-F91A → CJK UNIFIED IDEOGRAPH-99F1       # 
+
+2FA07 ;        99FE ;  MA      # ( 駾 → 駾 ) CJK COMPATIBILITY IDEOGRAPH-2FA07 → CJK UNIFIED IDEOGRAPH-99FE     # 
+
+F987 ; 9A6A ;  MA      # ( 驪 → 驪 ) CJK COMPATIBILITY IDEOGRAPH-F987 → CJK UNIFIED IDEOGRAPH-9A6A       # 
+
+2EE2 ; 9A6C ;  MA      #* ( ⻢ → 马 ) CJK RADICAL C-SIMPLIFIED HORSE → CJK UNIFIED IDEOGRAPH-9A6C        # 
+
+2FBB ; 9AA8 ;  MA      #* ( ⾻ → 骨 ) KANGXI RADICAL BONE → CJK UNIFIED IDEOGRAPH-9AA8   # 
+
+2FBC ; 9AD8 ;  MA      #* ( ⾼ → 高 ) KANGXI RADICAL TALL → CJK UNIFIED IDEOGRAPH-9AD8   # 
+
+2FBD ; 9ADF ;  MA      #* ( ⾽ → 髟 ) KANGXI RADICAL HAIR → CJK UNIFIED IDEOGRAPH-9ADF   # 
+
+FACD ; 9B12 ;  MA      # ( 鬒 → 鬒 ) CJK COMPATIBILITY IDEOGRAPH-FACD → CJK UNIFIED IDEOGRAPH-9B12       # 
+2FA0A ;        9B12 ;  MA      # ( 鬒 → 鬒 ) CJK COMPATIBILITY IDEOGRAPH-2FA0A → CJK UNIFIED IDEOGRAPH-9B12     # 
+
+2FBE ; 9B25 ;  MA      #* ( ⾾ → 鬥 ) KANGXI RADICAL FIGHT → CJK UNIFIED IDEOGRAPH-9B25  # 
+
+2FBF ; 9B2F ;  MA      #* ( ⾿ → 鬯 ) KANGXI RADICAL SACRIFICIAL WINE → CJK UNIFIED IDEOGRAPH-9B2F       # 
+
+2FC0 ; 9B32 ;  MA      #* ( ⿀ → 鬲 ) KANGXI RADICAL CAULDRON → CJK UNIFIED IDEOGRAPH-9B32       # 
+
+2FC1 ; 9B3C ;  MA      #* ( ⿁ → 鬼 ) KANGXI RADICAL GHOST → CJK UNIFIED IDEOGRAPH-9B3C  # 
+2EE4 ; 9B3C ;  MA      #* ( ⻤ → 鬼 ) CJK RADICAL GHOST → CJK UNIFIED IDEOGRAPH-9B3C     # 
+
+2FC2 ; 9B5A ;  MA      #* ( ⿂ → 魚 ) KANGXI RADICAL FISH → CJK UNIFIED IDEOGRAPH-9B5A   # 
+
+F939 ; 9B6F ;  MA      # ( 魯 → 魯 ) CJK COMPATIBILITY IDEOGRAPH-F939 → CJK UNIFIED IDEOGRAPH-9B6F       # 
+
+2FA0B ;        9C40 ;  MA      # ( 鱀 → 鱀 ) CJK COMPATIBILITY IDEOGRAPH-2FA0B → CJK UNIFIED IDEOGRAPH-9C40     # 
+
+F9F2 ; 9C57 ;  MA      # ( 鱗 → 鱗 ) CJK COMPATIBILITY IDEOGRAPH-F9F2 → CJK UNIFIED IDEOGRAPH-9C57       # 
+
+2EE5 ; 9C7C ;  MA      #* ( ⻥ → 鱼 ) CJK RADICAL C-SIMPLIFIED FISH → CJK UNIFIED IDEOGRAPH-9C7C # 
+
+2FC3 ; 9CE5 ;  MA      #* ( ⿃ → 鳥 ) KANGXI RADICAL BIRD → CJK UNIFIED IDEOGRAPH-9CE5   # 
+
+2FA0C ;        9CFD ;  MA      # ( 鳽 → 鳽 ) CJK COMPATIBILITY IDEOGRAPH-2FA0C → CJK UNIFIED IDEOGRAPH-9CFD     # 
+
+2FA0F ;        9D67 ;  MA      # ( 鵧 → 鵧 ) CJK COMPATIBILITY IDEOGRAPH-2FA0F → CJK UNIFIED IDEOGRAPH-9D67     # 
+
+FA2D ; 9DB4 ;  MA      # ( 鶴 → 鶴 ) CJK COMPATIBILITY IDEOGRAPH-FA2D → CJK UNIFIED IDEOGRAPH-9DB4       # 
+
+F93A ; 9DFA ;  MA      # ( 鷺 → 鷺 ) CJK COMPATIBILITY IDEOGRAPH-F93A → CJK UNIFIED IDEOGRAPH-9DFA       # 
+
+F920 ; 9E1E ;  MA      # ( 鸞 → 鸞 ) CJK COMPATIBILITY IDEOGRAPH-F920 → CJK UNIFIED IDEOGRAPH-9E1E       # 
+
+9E43 ; 9E42 ;  MA      # ( 鹃 → 鹂 ) CJK UNIFIED IDEOGRAPH-9E43 → CJK UNIFIED IDEOGRAPH-9E42     # 
+
+2FC4 ; 9E75 ;  MA      #* ( ⿄ → 鹵 ) KANGXI RADICAL SALT → CJK UNIFIED IDEOGRAPH-9E75   # 
+
+F940 ; 9E7F ;  MA      # ( 鹿 → 鹿 ) CJK COMPATIBILITY IDEOGRAPH-F940 → CJK UNIFIED IDEOGRAPH-9E7F       # 
+2FC5 ; 9E7F ;  MA      #* ( ⿅ → 鹿 ) KANGXI RADICAL DEER → CJK UNIFIED IDEOGRAPH-9E7F   # 
+
+F988 ; 9E97 ;  MA      # ( 麗 → 麗 ) CJK COMPATIBILITY IDEOGRAPH-F988 → CJK UNIFIED IDEOGRAPH-9E97       # 
+
+F9F3 ; 9E9F ;  MA      # ( 麟 → 麟 ) CJK COMPATIBILITY IDEOGRAPH-F9F3 → CJK UNIFIED IDEOGRAPH-9E9F       # 
+
+2FC6 ; 9EA5 ;  MA      #* ( ⿆ → 麥 ) KANGXI RADICAL WHEAT → CJK UNIFIED IDEOGRAPH-9EA5  # 
+
+2EE8 ; 9EA6 ;  MA      #* ( ⻨ → 麦 ) CJK RADICAL SIMPLIFIED WHEAT → CJK UNIFIED IDEOGRAPH-9EA6  # 
+
+2FA15 ;        9EBB ;  MA      # ( 麻 → 麻 ) CJK COMPATIBILITY IDEOGRAPH-2FA15 → CJK UNIFIED IDEOGRAPH-9EBB     # 
+2FC7 ; 9EBB ;  MA      #* ( ⿇ → 麻 ) KANGXI RADICAL HEMP → CJK UNIFIED IDEOGRAPH-9EBB   # 
+
+2FC8 ; 9EC3 ;  MA      #* ( ⿈ → 黃 ) KANGXI RADICAL YELLOW → CJK UNIFIED IDEOGRAPH-9EC3 # 
+
+2EE9 ; 9EC4 ;  MA      #* ( ⻩ → 黄 ) CJK RADICAL SIMPLIFIED YELLOW → CJK UNIFIED IDEOGRAPH-9EC4 # 
+
+2FC9 ; 9ECD ;  MA      #* ( ⿉ → 黍 ) KANGXI RADICAL MILLET → CJK UNIFIED IDEOGRAPH-9ECD # 
+
+F989 ; 9ECE ;  MA      # ( 黎 → 黎 ) CJK COMPATIBILITY IDEOGRAPH-F989 → CJK UNIFIED IDEOGRAPH-9ECE       # 
+
+2FCA ; 9ED1 ;  MA      #* ( ⿊ → 黑 ) KANGXI RADICAL BLACK → CJK UNIFIED IDEOGRAPH-9ED1  # 
+9ED2 ; 9ED1 ;  MA      # ( 黒 → 黑 ) CJK UNIFIED IDEOGRAPH-9ED2 → CJK UNIFIED IDEOGRAPH-9ED1     # →⿊→
+
+2FA17 ;        9EF9 ;  MA      # ( 黹 → 黹 ) CJK COMPATIBILITY IDEOGRAPH-2FA17 → CJK UNIFIED IDEOGRAPH-9EF9     # 
+2FCB ; 9EF9 ;  MA      #* ( ⿋ → 黹 ) KANGXI RADICAL EMBROIDERY → CJK UNIFIED IDEOGRAPH-9EF9     # 
+
+2FCC ; 9EFD ;  MA      #* ( ⿌ → 黽 ) KANGXI RADICAL FROG → CJK UNIFIED IDEOGRAPH-9EFD   # 
+
+2FA18 ;        9EFE ;  MA      # ( 黾 → 黾 ) CJK COMPATIBILITY IDEOGRAPH-2FA18 → CJK UNIFIED IDEOGRAPH-9EFE     # 
+
+2FA19 ;        9F05 ;  MA      # ( 鼅 → 鼅 ) CJK COMPATIBILITY IDEOGRAPH-2FA19 → CJK UNIFIED IDEOGRAPH-9F05     # 
+
+2FCD ; 9F0E ;  MA      #* ( ⿍ → 鼎 ) KANGXI RADICAL TRIPOD → CJK UNIFIED IDEOGRAPH-9F0E # 
+
+2FA1A ;        9F0F ;  MA      # ( 鼏 → 鼏 ) CJK COMPATIBILITY IDEOGRAPH-2FA1A → CJK UNIFIED IDEOGRAPH-9F0F     # 
+
+2FCE ; 9F13 ;  MA      #* ( ⿎ → 鼓 ) KANGXI RADICAL DRUM → CJK UNIFIED IDEOGRAPH-9F13   # 
+
+2FA1B ;        9F16 ;  MA      # ( 鼖 → 鼖 ) CJK COMPATIBILITY IDEOGRAPH-2FA1B → CJK UNIFIED IDEOGRAPH-9F16     # 
+
+2FCF ; 9F20 ;  MA      #* ( ⿏ → 鼠 ) KANGXI RADICAL RAT → CJK UNIFIED IDEOGRAPH-9F20    # 
+
+2FA1C ;        9F3B ;  MA      # ( 鼻 → 鼻 ) CJK COMPATIBILITY IDEOGRAPH-2FA1C → CJK UNIFIED IDEOGRAPH-9F3B     # 
+2FD0 ; 9F3B ;  MA      #* ( ⿐ → 鼻 ) KANGXI RADICAL NOSE → CJK UNIFIED IDEOGRAPH-9F3B   # 
+
+FAD8 ; 9F43 ;  MA      # ( 齃 → 齃 ) CJK COMPATIBILITY IDEOGRAPH-FAD8 → CJK UNIFIED IDEOGRAPH-9F43       # 
+
+2FD1 ; 9F4A ;  MA      #* ( ⿑ → 齊 ) KANGXI RADICAL EVEN → CJK UNIFIED IDEOGRAPH-9F4A   # 
+
+2EEC ; 9F50 ;  MA      #* ( ⻬ → 齐 ) CJK RADICAL C-SIMPLIFIED EVEN → CJK UNIFIED IDEOGRAPH-9F50 # 
+
+2FD2 ; 9F52 ;  MA      #* ( ⿒ → 齒 ) KANGXI RADICAL TOOTH → CJK UNIFIED IDEOGRAPH-9F52  # 
+
+2EEE ; 9F7F ;  MA      #* ( ⻮ → 齿 ) CJK RADICAL C-SIMPLIFIED TOOTH → CJK UNIFIED IDEOGRAPH-9F7F        # 
+
+F9C4 ; 9F8D ;  MA      # ( 龍 → 龍 ) CJK COMPATIBILITY IDEOGRAPH-F9C4 → CJK UNIFIED IDEOGRAPH-9F8D       # 
+2FD3 ; 9F8D ;  MA      #* ( ⿓ → 龍 ) KANGXI RADICAL DRAGON → CJK UNIFIED IDEOGRAPH-9F8D # 
+
+FAD9 ; 9F8E ;  MA      # ( 龎 → 龎 ) CJK COMPATIBILITY IDEOGRAPH-FAD9 → CJK UNIFIED IDEOGRAPH-9F8E       # 
+
+2EF0 ; 9F99 ;  MA      #* ( ⻰ → 龙 ) CJK RADICAL C-SIMPLIFIED DRAGON → CJK UNIFIED IDEOGRAPH-9F99       # 
+
+F907 ; 9F9C ;  MA      # ( 龜 → 龜 ) CJK COMPATIBILITY IDEOGRAPH-F907 → CJK UNIFIED IDEOGRAPH-9F9C       # 
+F908 ; 9F9C ;  MA      # ( 龜 → 龜 ) CJK COMPATIBILITY IDEOGRAPH-F908 → CJK UNIFIED IDEOGRAPH-9F9C       # 
+FACE ; 9F9C ;  MA      # ( 龜 → 龜 ) CJK COMPATIBILITY IDEOGRAPH-FACE → CJK UNIFIED IDEOGRAPH-9F9C       # 
+2FD4 ; 9F9C ;  MA      #* ( ⿔ → 龜 ) KANGXI RADICAL TURTLE → CJK UNIFIED IDEOGRAPH-9F9C # 
+
+2EF3 ; 9F9F ;  MA      #* ( ⻳ → 龟 ) CJK RADICAL C-SIMPLIFIED TURTLE → CJK UNIFIED IDEOGRAPH-9F9F       # 
+
+2FD5 ; 9FA0 ;  MA      #* ( ⿕ → 龠 ) KANGXI RADICAL FLUTE → CJK UNIFIED IDEOGRAPH-9FA0  # 
+
+2F80C ;        349E ;  MA      # ( 㒞 → 㒞 ) CJK COMPATIBILITY IDEOGRAPH-2F80C → CJK UNIFIED IDEOGRAPH-349E     # 
+
+2F813 ;        34B9 ;  MA      # ( 㒹 → 㒹 ) CJK COMPATIBILITY IDEOGRAPH-2F813 → CJK UNIFIED IDEOGRAPH-34B9     # 
+
+2F9CA ;        34BB ;  MA      # ( 㒻 → 㒻 ) CJK COMPATIBILITY IDEOGRAPH-2F9CA → CJK UNIFIED IDEOGRAPH-34BB     # 
+
+2F81F ;        34DF ;  MA      # ( 㓟 → 㓟 ) CJK COMPATIBILITY IDEOGRAPH-2F81F → CJK UNIFIED IDEOGRAPH-34DF     # 
+
+2F824 ;        3515 ;  MA      # ( 㔕 → 㔕 ) CJK COMPATIBILITY IDEOGRAPH-2F824 → CJK UNIFIED IDEOGRAPH-3515     # 
+
+2E8B ; 353E ;  MA      #* ( ⺋ → 㔾 ) CJK RADICAL SEAL → CJK UNIFIED IDEOGRAPH-353E      # 
+
+439B ; 3588 ;  MA      # ( 䎛 → 㖈 ) CJK UNIFIED IDEOGRAPH-439B → CJK UNIFIED IDEOGRAPH-3588     # 
+
+39B3 ; 363D ;  MA      # ( 㦳 → 㘽 ) CJK UNIFIED IDEOGRAPH-39B3 → CJK UNIFIED IDEOGRAPH-363D     # 
+
+2F867 ;        36EE ;  MA      # ( 㛮 → 㛮 ) CJK COMPATIBILITY IDEOGRAPH-2F867 → CJK UNIFIED IDEOGRAPH-36EE     # 
+
+2F868 ;        36FC ;  MA      # ( 㛼 → 㛼 ) CJK COMPATIBILITY IDEOGRAPH-2F868 → CJK UNIFIED IDEOGRAPH-36FC     # 
+
+2F876 ;        3781 ;  MA      # ( 㞁 → 㞁 ) CJK COMPATIBILITY IDEOGRAPH-2F876 → CJK UNIFIED IDEOGRAPH-3781     # 
+
+2F883 ;        382F ;  MA      # ( 㠯 → 㠯 ) CJK COMPATIBILITY IDEOGRAPH-2F883 → CJK UNIFIED IDEOGRAPH-382F     # 
+
+2F888 ;        3862 ;  MA      # ( 㡢 → 㡢 ) CJK COMPATIBILITY IDEOGRAPH-2F888 → CJK UNIFIED IDEOGRAPH-3862     # 
+
+2F88A ;        387C ;  MA      # ( 㡼 → 㡼 ) CJK COMPATIBILITY IDEOGRAPH-2F88A → CJK UNIFIED IDEOGRAPH-387C     # 
+
+2F896 ;        38C7 ;  MA      # ( 㣇 → 㣇 ) CJK COMPATIBILITY IDEOGRAPH-2F896 → CJK UNIFIED IDEOGRAPH-38C7     # 
+
+2F89B ;        38E3 ;  MA      # ( 㣣 → 㣣 ) CJK COMPATIBILITY IDEOGRAPH-2F89B → CJK UNIFIED IDEOGRAPH-38E3     # 
+
+2E97 ; 38FA ;  MA      #* ( ⺗ → 㣺 ) CJK RADICAL HEART TWO → CJK UNIFIED IDEOGRAPH-38FA # 
+
+2F8A2 ;        391C ;  MA      # ( 㤜 → 㤜 ) CJK COMPATIBILITY IDEOGRAPH-2F8A2 → CJK UNIFIED IDEOGRAPH-391C     # 
+
+2F8A1 ;        393A ;  MA      # ( 㤺 → 㤺 ) CJK COMPATIBILITY IDEOGRAPH-2F8A1 → CJK UNIFIED IDEOGRAPH-393A     # 
+
+2F8C2 ;        3A2E ;  MA      # ( 㨮 → 㨮 ) CJK COMPATIBILITY IDEOGRAPH-2F8C2 → CJK UNIFIED IDEOGRAPH-3A2E     # 
+
+6409 ; 3A41 ;  MA      # ( 搉 → 㩁 ) CJK UNIFIED IDEOGRAPH-6409 → CJK UNIFIED IDEOGRAPH-3A41     # 
+
+2F8C7 ;        3A6C ;  MA      # ( 㩬 → 㩬 ) CJK COMPATIBILITY IDEOGRAPH-2F8C7 → CJK UNIFIED IDEOGRAPH-3A6C     # 
+
+66F6 ; 3ADA ;  MA      # ( 曶 → 㫚 ) CJK UNIFIED IDEOGRAPH-66F6 → CJK UNIFIED IDEOGRAPH-3ADA     # 
+
+2F8D1 ;        3AE4 ;  MA      # ( 㫤 → 㫤 ) CJK COMPATIBILITY IDEOGRAPH-2F8D1 → CJK UNIFIED IDEOGRAPH-3AE4     # 
+
+2F8D0 ;        3B08 ;  MA      # ( 㬈 → 㬈 ) CJK COMPATIBILITY IDEOGRAPH-2F8D0 → CJK UNIFIED IDEOGRAPH-3B08     # 
+
+2F8CE ;        3B19 ;  MA      # ( 㬙 → 㬙 ) CJK COMPATIBILITY IDEOGRAPH-2F8CE → CJK UNIFIED IDEOGRAPH-3B19     # 
+
+80F6 ; 3B35 ;  MA      # ( 胶 → 㬵 ) CJK UNIFIED IDEOGRAPH-80F6 → CJK UNIFIED IDEOGRAPH-3B35     # 
+
+5E50 ; 3B3A ;  MA      # ( 幐 → 㬺 ) CJK UNIFIED IDEOGRAPH-5E50 → CJK UNIFIED IDEOGRAPH-3B3A     # 
+
+4420 ; 3B3B ;  MA      # ( 䐠 → 㬻 ) CJK UNIFIED IDEOGRAPH-4420 → CJK UNIFIED IDEOGRAPH-3B3B     # 
+
+2F8DE ;        3B49 ;  MA      # ( 㭉 → 㭉 ) CJK COMPATIBILITY IDEOGRAPH-2F8DE → CJK UNIFIED IDEOGRAPH-3B49     # 
+
+FAD2 ; 3B9D ;  MA      # ( 㮝 → 㮝 ) CJK COMPATIBILITY IDEOGRAPH-FAD2 → CJK UNIFIED IDEOGRAPH-3B9D       # 
+2F8E7 ;        3B9D ;  MA      # ( 㮝 → 㮝 ) CJK COMPATIBILITY IDEOGRAPH-2F8E7 → CJK UNIFIED IDEOGRAPH-3B9D     # 
+
+69E9 ; 3BA3 ;  MA      # ( 槩 → 㮣 ) CJK UNIFIED IDEOGRAPH-69E9 → CJK UNIFIED IDEOGRAPH-3BA3     # 
+
+2F8EE ;        3C18 ;  MA      # ( 㰘 → 㰘 ) CJK COMPATIBILITY IDEOGRAPH-2F8EE → CJK UNIFIED IDEOGRAPH-3C18     # 
+
+2F8F2 ;        3C4E ;  MA      # ( 㱎 → 㱎 ) CJK COMPATIBILITY IDEOGRAPH-2F8F2 → CJK UNIFIED IDEOGRAPH-3C4E     # 
+
+2F90A ;        3D33 ;  MA      # ( 㴳 → 㴳 ) CJK COMPATIBILITY IDEOGRAPH-2F90A → CJK UNIFIED IDEOGRAPH-3D33     # 
+
+2F916 ;        3D96 ;  MA      # ( 㶖 → 㶖 ) CJK COMPATIBILITY IDEOGRAPH-2F916 → CJK UNIFIED IDEOGRAPH-3D96     # 
+
+2F92A ;        3EAC ;  MA      # ( 㺬 → 㺬 ) CJK COMPATIBILITY IDEOGRAPH-2F92A → CJK UNIFIED IDEOGRAPH-3EAC     # 
+
+2F92C ;        3EB8 ;  MA      # ( 㺸 → 㺸 ) CJK COMPATIBILITY IDEOGRAPH-2F92C → CJK UNIFIED IDEOGRAPH-3EB8     # 
+2F92D ;        3EB8 ;  MA      # ( 㺸 → 㺸 ) CJK COMPATIBILITY IDEOGRAPH-2F92D → CJK UNIFIED IDEOGRAPH-3EB8     # 
+
+2F933 ;        3F1B ;  MA      # ( 㼛 → 㼛 ) CJK COMPATIBILITY IDEOGRAPH-2F933 → CJK UNIFIED IDEOGRAPH-3F1B     # 
+
+2F93E ;        3FFC ;  MA      # ( 㿼 → 㿼 ) CJK COMPATIBILITY IDEOGRAPH-2F93E → CJK UNIFIED IDEOGRAPH-3FFC     # 
+
+2F93F ;        4008 ;  MA      # ( 䀈 → 䀈 ) CJK COMPATIBILITY IDEOGRAPH-2F93F → CJK UNIFIED IDEOGRAPH-4008     # 
+
+FAD3 ; 4018 ;  MA      # ( 䀘 → 䀘 ) CJK COMPATIBILITY IDEOGRAPH-FAD3 → CJK UNIFIED IDEOGRAPH-4018       # 
+
+9FC3 ; 4039 ;  MA      # ( 鿃 → 䀹 ) CJK UNIFIED IDEOGRAPH-9FC3 → CJK UNIFIED IDEOGRAPH-4039     # →䀹→
+FAD4 ; 4039 ;  MA      # ( 䀹 → 䀹 ) CJK COMPATIBILITY IDEOGRAPH-FAD4 → CJK UNIFIED IDEOGRAPH-4039       # 
+2F949 ;        4039 ;  MA      # ( 䀹 → 䀹 ) CJK COMPATIBILITY IDEOGRAPH-2F949 → CJK UNIFIED IDEOGRAPH-4039     # 
+
+6663 ; 403F ;  MA      # ( 晣 → 䀿 ) CJK UNIFIED IDEOGRAPH-6663 → CJK UNIFIED IDEOGRAPH-403F     # 
+
+2F94B ;        4046 ;  MA      # ( 䁆 → 䁆 ) CJK COMPATIBILITY IDEOGRAPH-2F94B → CJK UNIFIED IDEOGRAPH-4046     # 
+
+2F94C ;        4096 ;  MA      # ( 䂖 → 䂖 ) CJK COMPATIBILITY IDEOGRAPH-2F94C → CJK UNIFIED IDEOGRAPH-4096     # 
+
+2F951 ;        40E3 ;  MA      # ( 䃣 → 䃣 ) CJK COMPATIBILITY IDEOGRAPH-2F951 → CJK UNIFIED IDEOGRAPH-40E3     # 
+
+2F958 ;        412F ;  MA      # ( 䄯 → 䄯 ) CJK COMPATIBILITY IDEOGRAPH-2F958 → CJK UNIFIED IDEOGRAPH-412F     # 
+
+2F960 ;        4202 ;  MA      # ( 䈂 → 䈂 ) CJK COMPATIBILITY IDEOGRAPH-2F960 → CJK UNIFIED IDEOGRAPH-4202     # 
+
+2F964 ;        4227 ;  MA      # ( 䈧 → 䈧 ) CJK COMPATIBILITY IDEOGRAPH-2F964 → CJK UNIFIED IDEOGRAPH-4227     # 
+
+2F967 ;        42A0 ;  MA      # ( 䊠 → 䊠 ) CJK COMPATIBILITY IDEOGRAPH-2F967 → CJK UNIFIED IDEOGRAPH-42A0     # 
+
+2F96D ;        4301 ;  MA      # ( 䌁 → 䌁 ) CJK COMPATIBILITY IDEOGRAPH-2F96D → CJK UNIFIED IDEOGRAPH-4301     # 
+
+2F971 ;        4334 ;  MA      # ( 䌴 → 䌴 ) CJK COMPATIBILITY IDEOGRAPH-2F971 → CJK UNIFIED IDEOGRAPH-4334     # 
+
+2F974 ;        4359 ;  MA      # ( 䍙 → 䍙 ) CJK COMPATIBILITY IDEOGRAPH-2F974 → CJK UNIFIED IDEOGRAPH-4359     # 
+
+2F981 ;        43D5 ;  MA      # ( 䏕 → 䏕 ) CJK COMPATIBILITY IDEOGRAPH-2F981 → CJK UNIFIED IDEOGRAPH-43D5     # 
+
+2F8D7 ;        43D9 ;  MA      # ( 䏙 → 䏙 ) CJK COMPATIBILITY IDEOGRAPH-2F8D7 → CJK UNIFIED IDEOGRAPH-43D9     # 
+
+2F984 ;        440B ;  MA      # ( 䐋 → 䐋 ) CJK COMPATIBILITY IDEOGRAPH-2F984 → CJK UNIFIED IDEOGRAPH-440B     # 
+
+6726 ; 4443 ;  MA      # ( 朦 → 䑃 ) CJK UNIFIED IDEOGRAPH-6726 → CJK UNIFIED IDEOGRAPH-4443     # 
+
+2F98E ;        446B ;  MA      # ( 䑫 → 䑫 ) CJK COMPATIBILITY IDEOGRAPH-2F98E → CJK UNIFIED IDEOGRAPH-446B     # 
+
+2F9A7 ;        452B ;  MA      # ( 䔫 → 䔫 ) CJK COMPATIBILITY IDEOGRAPH-2F9A7 → CJK UNIFIED IDEOGRAPH-452B     # 
+
+2F9AE ;        455D ;  MA      # ( 䕝 → 䕝 ) CJK COMPATIBILITY IDEOGRAPH-2F9AE → CJK UNIFIED IDEOGRAPH-455D     # 
+
+2F9AF ;        4561 ;  MA      # ( 䕡 → 䕡 ) CJK COMPATIBILITY IDEOGRAPH-2F9AF → CJK UNIFIED IDEOGRAPH-4561     # 
+
+2F9B2 ;        456B ;  MA      # ( 䕫 → 䕫 ) CJK COMPATIBILITY IDEOGRAPH-2F9B2 → CJK UNIFIED IDEOGRAPH-456B     # 
+
+2F9BF ;        45D7 ;  MA      # ( 䗗 → 䗗 ) CJK COMPATIBILITY IDEOGRAPH-2F9BF → CJK UNIFIED IDEOGRAPH-45D7     # 
+
+2F9C2 ;        45F9 ;  MA      # ( 䗹 → 䗹 ) CJK COMPATIBILITY IDEOGRAPH-2F9C2 → CJK UNIFIED IDEOGRAPH-45F9     # 
+
+2F9C8 ;        4635 ;  MA      # ( 䘵 → 䘵 ) CJK COMPATIBILITY IDEOGRAPH-2F9C8 → CJK UNIFIED IDEOGRAPH-4635     # 
+
+8A1E ; 46B6 ;  MA      # ( 訞 → 䚶 ) CJK UNIFIED IDEOGRAPH-8A1E → CJK UNIFIED IDEOGRAPH-46B6     # 
+
+2F9CD ;        46BE ;  MA      # ( 䚾 → 䚾 ) CJK COMPATIBILITY IDEOGRAPH-2F9CD → CJK UNIFIED IDEOGRAPH-46BE     # 
+
+2F9CE ;        46C7 ;  MA      # ( 䛇 → 䛇 ) CJK COMPATIBILITY IDEOGRAPH-2F9CE → CJK UNIFIED IDEOGRAPH-46C7     # 
+
+2F9EF ;        4995 ;  MA      # ( 䦕 → 䦕 ) CJK COMPATIBILITY IDEOGRAPH-2F9EF → CJK UNIFIED IDEOGRAPH-4995     # 
+
+2F9F2 ;        49E6 ;  MA      # ( 䧦 → 䧦 ) CJK COMPATIBILITY IDEOGRAPH-2F9F2 → CJK UNIFIED IDEOGRAPH-49E6     # 
+
+2F9F8 ;        4A6E ;  MA      # ( 䩮 → 䩮 ) CJK COMPATIBILITY IDEOGRAPH-2F9F8 → CJK UNIFIED IDEOGRAPH-4A6E     # 
+
+2F9F9 ;        4A76 ;  MA      # ( 䩶 → 䩶 ) CJK COMPATIBILITY IDEOGRAPH-2F9F9 → CJK UNIFIED IDEOGRAPH-4A76     # 
+
+2F9FC ;        4AB2 ;  MA      # ( 䪲 → 䪲 ) CJK COMPATIBILITY IDEOGRAPH-2F9FC → CJK UNIFIED IDEOGRAPH-4AB2     # 
+
+2FA03 ;        4B33 ;  MA      # ( 䬳 → 䬳 ) CJK COMPATIBILITY IDEOGRAPH-2FA03 → CJK UNIFIED IDEOGRAPH-4B33     # 
+
+2FA08 ;        4BCE ;  MA      # ( 䯎 → 䯎 ) CJK COMPATIBILITY IDEOGRAPH-2FA08 → CJK UNIFIED IDEOGRAPH-4BCE     # 
+
+2FA0D ;        4CCE ;  MA      # ( 䳎 → 䳎 ) CJK COMPATIBILITY IDEOGRAPH-2FA0D → CJK UNIFIED IDEOGRAPH-4CCE     # 
+
+2FA0E ;        4CED ;  MA      # ( 䳭 → 䳭 ) CJK COMPATIBILITY IDEOGRAPH-2FA0E → CJK UNIFIED IDEOGRAPH-4CED     # 
+
+2FA11 ;        4CF8 ;  MA      # ( 䳸 → 䳸 ) CJK COMPATIBILITY IDEOGRAPH-2FA11 → CJK UNIFIED IDEOGRAPH-4CF8     # 
+
+2FA16 ;        4D56 ;  MA      # ( 䵖 → 䵖 ) CJK COMPATIBILITY IDEOGRAPH-2FA16 → CJK UNIFIED IDEOGRAPH-4D56     # 
+
+2F803 ;        20122 ; MA      # ( 𠄢 → 𠄢 ) CJK COMPATIBILITY IDEOGRAPH-2F803 → CJK UNIFIED IDEOGRAPH-20122   # 
+
+2F812 ;        2051C ; MA      # ( 𠔜 → 𠔜 ) CJK COMPATIBILITY IDEOGRAPH-2F812 → CJK UNIFIED IDEOGRAPH-2051C   # 
+
+2F91B ;        20525 ; MA      # ( 𠔥 → 𠔥 ) CJK COMPATIBILITY IDEOGRAPH-2F91B → CJK UNIFIED IDEOGRAPH-20525   # 
+
+2F816 ;        2054B ; MA      # ( 𠕋 → 𠕋 ) CJK COMPATIBILITY IDEOGRAPH-2F816 → CJK UNIFIED IDEOGRAPH-2054B   # 
+
+2F80D ;        2063A ; MA      # ( 𠘺 → 𠘺 ) CJK COMPATIBILITY IDEOGRAPH-2F80D → CJK UNIFIED IDEOGRAPH-2063A   # 
+
+2F9D9 ;        20804 ; MA      # ( 𠠄 → 𠠄 ) CJK COMPATIBILITY IDEOGRAPH-2F9D9 → CJK UNIFIED IDEOGRAPH-20804   # 
+
+2F9DD ;        208DE ; MA      # ( 𠣞 → 𠣞 ) CJK COMPATIBILITY IDEOGRAPH-2F9DD → CJK UNIFIED IDEOGRAPH-208DE   # 
+
+2F834 ;        20A2C ; MA      # ( 𠨬 → 𠨬 ) CJK COMPATIBILITY IDEOGRAPH-2F834 → CJK UNIFIED IDEOGRAPH-20A2C   # 
+
+2F838 ;        20B63 ; MA      # ( 𠭣 → 𠭣 ) CJK COMPATIBILITY IDEOGRAPH-2F838 → CJK UNIFIED IDEOGRAPH-20B63   # 
+
+2F859 ;        214E4 ; MA      # ( 𡓤 → 𡓤 ) CJK COMPATIBILITY IDEOGRAPH-2F859 → CJK UNIFIED IDEOGRAPH-214E4   # 
+
+2F860 ;        216A8 ; MA      # ( 𡚨 → 𡚨 ) CJK COMPATIBILITY IDEOGRAPH-2F860 → CJK UNIFIED IDEOGRAPH-216A8   # 
+
+2F861 ;        216EA ; MA      # ( 𡛪 → 𡛪 ) CJK COMPATIBILITY IDEOGRAPH-2F861 → CJK UNIFIED IDEOGRAPH-216EA   # 
+
+2F86C ;        219C8 ; MA      # ( 𡧈 → 𡧈 ) CJK COMPATIBILITY IDEOGRAPH-2F86C → CJK UNIFIED IDEOGRAPH-219C8   # 
+
+2F871 ;        21B18 ; MA      # ( 𡬘 → 𡬘 ) CJK COMPATIBILITY IDEOGRAPH-2F871 → CJK UNIFIED IDEOGRAPH-21B18   # 
+
+2F8F8 ;        21D0B ; MA      # ( 𡴋 → 𡴋 ) CJK COMPATIBILITY IDEOGRAPH-2F8F8 → CJK UNIFIED IDEOGRAPH-21D0B   # 
+
+2F87B ;        21DE4 ; MA      # ( 𡷤 → 𡷤 ) CJK COMPATIBILITY IDEOGRAPH-2F87B → CJK UNIFIED IDEOGRAPH-21DE4   # 
+
+2F87D ;        21DE6 ; MA      # ( 𡷦 → 𡷦 ) CJK COMPATIBILITY IDEOGRAPH-2F87D → CJK UNIFIED IDEOGRAPH-21DE6   # 
+
+2F889 ;        22183 ; MA      # ( 𢆃 → 𢆃 ) CJK COMPATIBILITY IDEOGRAPH-2F889 → CJK UNIFIED IDEOGRAPH-22183   # 
+
+2F939 ;        2219F ; MA      # ( 𢆟 → 𢆟 ) CJK COMPATIBILITY IDEOGRAPH-2F939 → CJK UNIFIED IDEOGRAPH-2219F   # 
+
+2F891 ;        22331 ; MA      # ( 𢌱 → 𢌱 ) CJK COMPATIBILITY IDEOGRAPH-2F891 → CJK UNIFIED IDEOGRAPH-22331   # 
+2F892 ;        22331 ; MA      # ( 𢌱 → 𢌱 ) CJK COMPATIBILITY IDEOGRAPH-2F892 → CJK UNIFIED IDEOGRAPH-22331   # 
+
+2F8A4 ;        226D4 ; MA      # ( 𢛔 → 𢛔 ) CJK COMPATIBILITY IDEOGRAPH-2F8A4 → CJK UNIFIED IDEOGRAPH-226D4   # 
+
+FAD0 ; 22844 ; MA      # ( 𢡄 → 𢡄 ) CJK COMPATIBILITY IDEOGRAPH-FAD0 → CJK UNIFIED IDEOGRAPH-22844     # 
+
+FACF ; 2284A ; MA      # ( 𢡊 → 𢡊 ) CJK COMPATIBILITY IDEOGRAPH-FACF → CJK UNIFIED IDEOGRAPH-2284A     # 
+
+2F8B8 ;        22B0C ; MA      # ( 𢬌 → 𢬌 ) CJK COMPATIBILITY IDEOGRAPH-2F8B8 → CJK UNIFIED IDEOGRAPH-22B0C   # 
+
+2F8BE ;        22BF1 ; MA      # ( 𢯱 → 𢯱 ) CJK COMPATIBILITY IDEOGRAPH-2F8BE → CJK UNIFIED IDEOGRAPH-22BF1   # 
+
+2F8CA ;        2300A ; MA      # ( 𣀊 → 𣀊 ) CJK COMPATIBILITY IDEOGRAPH-2F8CA → CJK UNIFIED IDEOGRAPH-2300A   # 
+
+2F897 ;        232B8 ; MA      # ( 𣊸 → 𣊸 ) CJK COMPATIBILITY IDEOGRAPH-2F897 → CJK UNIFIED IDEOGRAPH-232B8   # 
+
+2F980 ;        2335F ; MA      # ( 𣍟 → 𣍟 ) CJK COMPATIBILITY IDEOGRAPH-2F980 → CJK UNIFIED IDEOGRAPH-2335F   # 
+
+2F989 ;        23393 ; MA      # ( 𣎓 → 𣎓 ) CJK COMPATIBILITY IDEOGRAPH-2F989 → CJK UNIFIED IDEOGRAPH-23393   # 
+
+2F98A ;        2339C ; MA      # ( 𣎜 → 𣎜 ) CJK COMPATIBILITY IDEOGRAPH-2F98A → CJK UNIFIED IDEOGRAPH-2339C   # 
+
+2F8DD ;        233C3 ; MA      # ( 𣏃 → 𣏃 ) CJK COMPATIBILITY IDEOGRAPH-2F8DD → CJK UNIFIED IDEOGRAPH-233C3   # 
+
+FAD1 ; 233D5 ; MA      # ( 𣏕 → 𣏕 ) CJK COMPATIBILITY IDEOGRAPH-FAD1 → CJK UNIFIED IDEOGRAPH-233D5     # 
+
+2F8E3 ;        2346D ; MA      # ( 𣑭 → 𣑭 ) CJK COMPATIBILITY IDEOGRAPH-2F8E3 → CJK UNIFIED IDEOGRAPH-2346D   # 
+
+2F8EC ;        236A3 ; MA      # ( 𣚣 → 𣚣 ) CJK COMPATIBILITY IDEOGRAPH-2F8EC → CJK UNIFIED IDEOGRAPH-236A3   # 
+
+2F8F0 ;        238A7 ; MA      # ( 𣢧 → 𣢧 ) CJK COMPATIBILITY IDEOGRAPH-2F8F0 → CJK UNIFIED IDEOGRAPH-238A7   # 
+
+2F8F7 ;        23A8D ; MA      # ( 𣪍 → 𣪍 ) CJK COMPATIBILITY IDEOGRAPH-2F8F7 → CJK UNIFIED IDEOGRAPH-23A8D   # 
+
+2F8F9 ;        23AFA ; MA      # ( 𣫺 → 𣫺 ) CJK COMPATIBILITY IDEOGRAPH-2F8F9 → CJK UNIFIED IDEOGRAPH-23AFA   # 
+
+2F8FB ;        23CBC ; MA      # ( 𣲼 → 𣲼 ) CJK COMPATIBILITY IDEOGRAPH-2F8FB → CJK UNIFIED IDEOGRAPH-23CBC   # 
+
+2F906 ;        23D1E ; MA      # ( 𣴞 → 𣴞 ) CJK COMPATIBILITY IDEOGRAPH-2F906 → CJK UNIFIED IDEOGRAPH-23D1E   # 
+
+2F90D ;        23ED1 ; MA      # ( 𣻑 → 𣻑 ) CJK COMPATIBILITY IDEOGRAPH-2F90D → CJK UNIFIED IDEOGRAPH-23ED1   # 
+
+2F910 ;        23F5E ; MA      # ( 𣽞 → 𣽞 ) CJK COMPATIBILITY IDEOGRAPH-2F910 → CJK UNIFIED IDEOGRAPH-23F5E   # 
+
+2F911 ;        23F8E ; MA      # ( 𣾎 → 𣾎 ) CJK COMPATIBILITY IDEOGRAPH-2F911 → CJK UNIFIED IDEOGRAPH-23F8E   # 
+
+2F91D ;        24263 ; MA      # ( 𤉣 → 𤉣 ) CJK COMPATIBILITY IDEOGRAPH-2F91D → CJK UNIFIED IDEOGRAPH-24263   # 
+
+FA6C ; 242EE ; MA      # ( 𤋮 → 𤋮 ) CJK COMPATIBILITY IDEOGRAPH-FA6C → CJK UNIFIED IDEOGRAPH-242EE     # 
+
+2F91F ;        243AB ; MA      # ( 𤎫 → 𤎫 ) CJK COMPATIBILITY IDEOGRAPH-2F91F → CJK UNIFIED IDEOGRAPH-243AB   # 
+
+2F923 ;        24608 ; MA      # ( 𤘈 → 𤘈 ) CJK COMPATIBILITY IDEOGRAPH-2F923 → CJK UNIFIED IDEOGRAPH-24608   # 
+
+2F926 ;        24735 ; MA      # ( 𤜵 → 𤜵 ) CJK COMPATIBILITY IDEOGRAPH-2F926 → CJK UNIFIED IDEOGRAPH-24735   # 
+
+2F927 ;        24814 ; MA      # ( 𤠔 → 𤠔 ) CJK COMPATIBILITY IDEOGRAPH-2F927 → CJK UNIFIED IDEOGRAPH-24814   # 
+
+2F935 ;        24C36 ; MA      # ( 𤰶 → 𤰶 ) CJK COMPATIBILITY IDEOGRAPH-2F935 → CJK UNIFIED IDEOGRAPH-24C36   # 
+
+2F937 ;        24C92 ; MA      # ( 𤲒 → 𤲒 ) CJK COMPATIBILITY IDEOGRAPH-2F937 → CJK UNIFIED IDEOGRAPH-24C92   # 
+
+2F93B ;        24FA1 ; MA      # ( 𤾡 → 𤾡 ) CJK COMPATIBILITY IDEOGRAPH-2F93B → CJK UNIFIED IDEOGRAPH-24FA1   # 
+
+2F93C ;        24FB8 ; MA      # ( 𤾸 → 𤾸 ) CJK COMPATIBILITY IDEOGRAPH-2F93C → CJK UNIFIED IDEOGRAPH-24FB8   # 
+
+2F93D ;        25044 ; MA      # ( 𥁄 → 𥁄 ) CJK COMPATIBILITY IDEOGRAPH-2F93D → CJK UNIFIED IDEOGRAPH-25044   # 
+
+2F942 ;        250F2 ; MA      # ( 𥃲 → 𥃲 ) CJK COMPATIBILITY IDEOGRAPH-2F942 → CJK UNIFIED IDEOGRAPH-250F2   # 
+
+2F941 ;        250F3 ; MA      # ( 𥃳 → 𥃳 ) CJK COMPATIBILITY IDEOGRAPH-2F941 → CJK UNIFIED IDEOGRAPH-250F3   # 
+
+2F943 ;        25119 ; MA      # ( 𥄙 → 𥄙 ) CJK COMPATIBILITY IDEOGRAPH-2F943 → CJK UNIFIED IDEOGRAPH-25119   # 
+
+2F944 ;        25133 ; MA      # ( 𥄳 → 𥄳 ) CJK COMPATIBILITY IDEOGRAPH-2F944 → CJK UNIFIED IDEOGRAPH-25133   # 
+
+FAD5 ; 25249 ; MA      # ( 𥉉 → 𥉉 ) CJK COMPATIBILITY IDEOGRAPH-FAD5 → CJK UNIFIED IDEOGRAPH-25249     # 
+
+2F94D ;        2541D ; MA      # ( 𥐝 → 𥐝 ) CJK COMPATIBILITY IDEOGRAPH-2F94D → CJK UNIFIED IDEOGRAPH-2541D   # 
+
+2F952 ;        25626 ; MA      # ( 𥘦 → 𥘦 ) CJK COMPATIBILITY IDEOGRAPH-2F952 → CJK UNIFIED IDEOGRAPH-25626   # 
+
+2F954 ;        2569A ; MA      # ( 𥚚 → 𥚚 ) CJK COMPATIBILITY IDEOGRAPH-2F954 → CJK UNIFIED IDEOGRAPH-2569A   # 
+
+2F955 ;        256C5 ; MA      # ( 𥛅 → 𥛅 ) CJK COMPATIBILITY IDEOGRAPH-2F955 → CJK UNIFIED IDEOGRAPH-256C5   # 
+
+2F95C ;        2597C ; MA      # ( 𥥼 → 𥥼 ) CJK COMPATIBILITY IDEOGRAPH-2F95C → CJK UNIFIED IDEOGRAPH-2597C   # 
+
+2F95D ;        25AA7 ; MA      # ( 𥪧 → 𥪧 ) CJK COMPATIBILITY IDEOGRAPH-2F95D → CJK UNIFIED IDEOGRAPH-25AA7   # 
+2F95E ;        25AA7 ; MA      # ( 𥪧 → 𥪧 ) CJK COMPATIBILITY IDEOGRAPH-2F95E → CJK UNIFIED IDEOGRAPH-25AA7   # 
+
+2F961 ;        25BAB ; MA      # ( 𥮫 → 𥮫 ) CJK COMPATIBILITY IDEOGRAPH-2F961 → CJK UNIFIED IDEOGRAPH-25BAB   # 
+
+2F965 ;        25C80 ; MA      # ( 𥲀 → 𥲀 ) CJK COMPATIBILITY IDEOGRAPH-2F965 → CJK UNIFIED IDEOGRAPH-25C80   # 
+
+FAD6 ; 25CD0 ; MA      # ( 𥳐 → 𥳐 ) CJK COMPATIBILITY IDEOGRAPH-FAD6 → CJK UNIFIED IDEOGRAPH-25CD0     # 
+
+2F96B ;        25F86 ; MA      # ( 𥾆 → 𥾆 ) CJK COMPATIBILITY IDEOGRAPH-2F96B → CJK UNIFIED IDEOGRAPH-25F86   # 
+
+2F898 ;        261DA ; MA      # ( 𦇚 → 𦇚 ) CJK COMPATIBILITY IDEOGRAPH-2F898 → CJK UNIFIED IDEOGRAPH-261DA   # 
+
+2F972 ;        26228 ; MA      # ( 𦈨 → 𦈨 ) CJK COMPATIBILITY IDEOGRAPH-2F972 → CJK UNIFIED IDEOGRAPH-26228   # 
+
+2F973 ;        26247 ; MA      # ( 𦉇 → 𦉇 ) CJK COMPATIBILITY IDEOGRAPH-2F973 → CJK UNIFIED IDEOGRAPH-26247   # 
+
+2F975 ;        262D9 ; MA      # ( 𦋙 → 𦋙 ) CJK COMPATIBILITY IDEOGRAPH-2F975 → CJK UNIFIED IDEOGRAPH-262D9   # 
+
+2F977 ;        2633E ; MA      # ( 𦌾 → 𦌾 ) CJK COMPATIBILITY IDEOGRAPH-2F977 → CJK UNIFIED IDEOGRAPH-2633E   # 
+
+2F97B ;        264DA ; MA      # ( 𦓚 → 𦓚 ) CJK COMPATIBILITY IDEOGRAPH-2F97B → CJK UNIFIED IDEOGRAPH-264DA   # 
+
+2F97C ;        26523 ; MA      # ( 𦔣 → 𦔣 ) CJK COMPATIBILITY IDEOGRAPH-2F97C → CJK UNIFIED IDEOGRAPH-26523   # 
+
+2F97E ;        265A8 ; MA      # ( 𦖨 → 𦖨 ) CJK COMPATIBILITY IDEOGRAPH-2F97E → CJK UNIFIED IDEOGRAPH-265A8   # 
+
+2F987 ;        267A7 ; MA      # ( 𦞧 → 𦞧 ) CJK COMPATIBILITY IDEOGRAPH-2F987 → CJK UNIFIED IDEOGRAPH-267A7   # 
+
+2F988 ;        267B5 ; MA      # ( 𦞵 → 𦞵 ) CJK COMPATIBILITY IDEOGRAPH-2F988 → CJK UNIFIED IDEOGRAPH-267B5   # 
+
+2F997 ;        26B3C ; MA      # ( 𦬼 → 𦬼 ) CJK COMPATIBILITY IDEOGRAPH-2F997 → CJK UNIFIED IDEOGRAPH-26B3C   # 
+
+2F9A4 ;        26C36 ; MA      # ( 𦰶 → 𦰶 ) CJK COMPATIBILITY IDEOGRAPH-2F9A4 → CJK UNIFIED IDEOGRAPH-26C36   # 
+
+2F9A6 ;        26CD5 ; MA      # ( 𦳕 → 𦳕 ) CJK COMPATIBILITY IDEOGRAPH-2F9A6 → CJK UNIFIED IDEOGRAPH-26CD5   # 
+
+2F9A5 ;        26D6B ; MA      # ( 𦵫 → 𦵫 ) CJK COMPATIBILITY IDEOGRAPH-2F9A5 → CJK UNIFIED IDEOGRAPH-26D6B   # 
+
+2F9AD ;        26F2C ; MA      # ( 𦼬 → 𦼬 ) CJK COMPATIBILITY IDEOGRAPH-2F9AD → CJK UNIFIED IDEOGRAPH-26F2C   # 
+
+2F9B0 ;        26FB1 ; MA      # ( 𦾱 → 𦾱 ) CJK COMPATIBILITY IDEOGRAPH-2F9B0 → CJK UNIFIED IDEOGRAPH-26FB1   # 
+
+2F9B1 ;        270D2 ; MA      # ( 𧃒 → 𧃒 ) CJK COMPATIBILITY IDEOGRAPH-2F9B1 → CJK UNIFIED IDEOGRAPH-270D2   # 
+
+2F9AB ;        273CA ; MA      # ( 𧏊 → 𧏊 ) CJK COMPATIBILITY IDEOGRAPH-2F9AB → CJK UNIFIED IDEOGRAPH-273CA   # 
+
+2F9C5 ;        27667 ; MA      # ( 𧙧 → 𧙧 ) CJK COMPATIBILITY IDEOGRAPH-2F9C5 → CJK UNIFIED IDEOGRAPH-27667   # 
+
+2F9CB ;        278AE ; MA      # ( 𧢮 → 𧢮 ) CJK COMPATIBILITY IDEOGRAPH-2F9CB → CJK UNIFIED IDEOGRAPH-278AE   # 
+
+2F9CC ;        27966 ; MA      # ( 𧥦 → 𧥦 ) CJK COMPATIBILITY IDEOGRAPH-2F9CC → CJK UNIFIED IDEOGRAPH-27966   # 
+
+2F9D3 ;        27CA8 ; MA      # ( 𧲨 → 𧲨 ) CJK COMPATIBILITY IDEOGRAPH-2F9D3 → CJK UNIFIED IDEOGRAPH-27CA8   # 
+
+FAD7 ; 27ED3 ; MA      # ( 𧻓 → 𧻓 ) CJK COMPATIBILITY IDEOGRAPH-FAD7 → CJK UNIFIED IDEOGRAPH-27ED3     # 
+
+2F9D8 ;        27F2F ; MA      # ( 𧼯 → 𧼯 ) CJK COMPATIBILITY IDEOGRAPH-2F9D8 → CJK UNIFIED IDEOGRAPH-27F2F   # 
+
+2F9E0 ;        285D2 ; MA      # ( 𨗒 → 𨗒 ) CJK COMPATIBILITY IDEOGRAPH-2F9E0 → CJK UNIFIED IDEOGRAPH-285D2   # 
+
+2F9E1 ;        285ED ; MA      # ( 𨗭 → 𨗭 ) CJK COMPATIBILITY IDEOGRAPH-2F9E1 → CJK UNIFIED IDEOGRAPH-285ED   # 
+
+2F9E5 ;        2872E ; MA      # ( 𨜮 → 𨜮 ) CJK COMPATIBILITY IDEOGRAPH-2F9E5 → CJK UNIFIED IDEOGRAPH-2872E   # 
+
+2F9ED ;        28BFA ; MA      # ( 𨯺 → 𨯺 ) CJK COMPATIBILITY IDEOGRAPH-2F9ED → CJK UNIFIED IDEOGRAPH-28BFA   # 
+
+2F9F1 ;        28D77 ; MA      # ( 𨵷 → 𨵷 ) CJK COMPATIBILITY IDEOGRAPH-2F9F1 → CJK UNIFIED IDEOGRAPH-28D77   # 
+
+2F9F6 ;        29145 ; MA      # ( 𩅅 → 𩅅 ) CJK COMPATIBILITY IDEOGRAPH-2F9F6 → CJK UNIFIED IDEOGRAPH-29145   # 
+
+2F81C ;        291DF ; MA      # ( 𩇟 → 𩇟 ) CJK COMPATIBILITY IDEOGRAPH-2F81C → CJK UNIFIED IDEOGRAPH-291DF   # 
+
+2F9F7 ;        2921A ; MA      # ( 𩈚 → 𩈚 ) CJK COMPATIBILITY IDEOGRAPH-2F9F7 → CJK UNIFIED IDEOGRAPH-2921A   # 
+
+2F9FB ;        2940A ; MA      # ( 𩐊 → 𩐊 ) CJK COMPATIBILITY IDEOGRAPH-2F9FB → CJK UNIFIED IDEOGRAPH-2940A   # 
+
+2F9FD ;        29496 ; MA      # ( 𩒖 → 𩒖 ) CJK COMPATIBILITY IDEOGRAPH-2F9FD → CJK UNIFIED IDEOGRAPH-29496   # 
+
+2FA01 ;        295B6 ; MA      # ( 𩖶 → 𩖶 ) CJK COMPATIBILITY IDEOGRAPH-2FA01 → CJK UNIFIED IDEOGRAPH-295B6   # 
+
+2FA09 ;        29B30 ; MA      # ( 𩬰 → 𩬰 ) CJK COMPATIBILITY IDEOGRAPH-2FA09 → CJK UNIFIED IDEOGRAPH-29B30   # 
+
+2FA10 ;        2A0CE ; MA      # ( 𪃎 → 𪃎 ) CJK COMPATIBILITY IDEOGRAPH-2FA10 → CJK UNIFIED IDEOGRAPH-2A0CE   # 
+
+2FA12 ;        2A105 ; MA      # ( 𪄅 → 𪄅 ) CJK COMPATIBILITY IDEOGRAPH-2FA12 → CJK UNIFIED IDEOGRAPH-2A105   # 
+
+2FA13 ;        2A20E ; MA      # ( 𪈎 → 𪈎 ) CJK COMPATIBILITY IDEOGRAPH-2FA13 → CJK UNIFIED IDEOGRAPH-2A20E   # 
+
+2FA14 ;        2A291 ; MA      # ( 𪊑 → 𪊑 ) CJK COMPATIBILITY IDEOGRAPH-2FA14 → CJK UNIFIED IDEOGRAPH-2A291   # 
+
+2F88F ;        2A392 ; MA      # ( 𪎒 → 𪎒 ) CJK COMPATIBILITY IDEOGRAPH-2F88F → CJK UNIFIED IDEOGRAPH-2A392   # 
+
+2FA1D ;        2A600 ; MA      # ( 𪘀 → 𪘀 ) CJK COMPATIBILITY IDEOGRAPH-2FA1D → CJK UNIFIED IDEOGRAPH-2A600   # 
+
+# total for (MA): 5313
+
diff --git a/packages/uni-confusables/gen-confusables.el b/packages/uni-confusables/gen-confusables.el
new file mode 100644 (file)
index 0000000..b3c2f02
--- /dev/null
@@ -0,0 +1,110 @@
+;;; gen-confusables.el --- generate uni-confusables.el from confusables.txt
+
+;; Copyright (C) 2011, 2012  Free Software Foundation, Inc.
+
+;; Author: Teodor Zlatanov <tzz@lifelogs.com>
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;; Code:
+
+(require 'cl)
+
+(defvar gen-confusables-char-table-single)
+(defvar gen-confusables-char-table-multiple)
+
+(defun gen-confusables-read (file)
+  (interactive "fConfusables filename: \n")
+  (flet ((reader (h) (string-to-number h 16)))
+    (let ((stable (make-char-table 'confusables-single-script))
+          (mtable (make-char-table 'confusables-multiple-script))
+          (count 0)
+          (confusable-line-regexp (concat "^\\([[:xdigit:]]+\\)" ; \x+
+                                          " ;\t"
+                                          ;; \x+ separated by spaces
+                                          "\\([[:space:][:xdigit:]]+\\)"
+                                          " ;\t"
+                                          "\\([SM]\\)[LA]"))) ; SL, SA, ML, MA
+      (setq gen-confusables-char-table-single stable)
+      (setq gen-confusables-char-table-multiple mtable)
+      (with-temp-buffer
+        (insert-file-contents file)
+        (goto-char (point-min))
+        (while (re-search-forward confusable-line-regexp nil t)
+          (incf count)
+          (when (and (called-interactively-p)
+                     (zerop (mod count 100)))
+            (message "processed %d lines" count))
+          (let* ((from (match-string 1))
+                 (to (match-string 2))
+                 (class (match-string 3))
+                 (table (if (string-equal "S" class) stable mtable)))
+            (set-char-table-range
+             table
+             (reader from)
+             (concat (mapcar 'reader (split-string to))))))))))
+
+(defun gen-confusables-write (file)
+  (interactive "FDumped filename: \n")
+  (let ((coding-system-for-write 'utf-8-emacs))
+    (with-temp-file file
+      (insert ";; Copyright (C) 1991-2009, 2010 Unicode, Inc.
+;; This file was generated from the Unicode confusables list at
+;; http://www.unicode.org/Public/security/revision-04/confusables.txt.
+;; See lisp/international/README in the Emacs trunk
+;; for the copyright and permission notice.\n\n")
+      (dolist (type '(single multiple))
+        (let* ((tablesym (intern (format "uni-confusables-char-table-%s" type)))
+               (oursym (intern (format "gen-confusables-char-table-%s" type)))
+               (ourtable (symbol-value oursym))
+               (ourtablename (symbol-name oursym))
+               (tablename (symbol-name tablesym))
+               (prop (format "confusables-%s-script" type))
+               props)
+          (insert (format "(defvar %s (make-char-table '%s))\n\n"
+                          tablename prop))
+          (map-char-table
+           (lambda (k v) (setq props (cons k (cons v props))))
+           ourtable)
+
+          (insert (format "(let ((k nil) (v nil) (ranges '%S))\n" props))
+          (insert (format "
+  (while ranges
+     (setq k (pop ranges)
+           v (pop ranges))
+     (set-char-table-range %s k v)))\n\n" tablename))
+
+          (insert (format "(ert-deftest uni-confusables-test-%s ()\n" type))
+
+          (dolist (offset '(100 200 800 3000 3500))
+            (insert (format "
+  (should (string-equal
+           (char-table-range %s %d)
+           %S))\n"
+                            tablename
+                            (nth (* 2 offset) props)
+                            (nth (1+ (* 2 offset)) props))))
+          (insert ")\n\n")))
+      (insert "
+;; Local Variables:
+;; coding: utf-8
+;; no-byte-compile: t
+;; End:
+
+;; uni-confusables.el ends here"))))
+
+(provide 'gen-confusables)
+;;; gen-confusables.el ends here
diff --git a/packages/uni-confusables/uni-confusables-pkg.el b/packages/uni-confusables/uni-confusables-pkg.el
new file mode 100644 (file)
index 0000000..53a0295
--- /dev/null
@@ -0,0 +1 @@
+(define-package "uni-confusables" "0.1" "Unicode confusables table")
diff --git a/packages/uni-confusables/uni-confusables.el b/packages/uni-confusables/uni-confusables.el
new file mode 100644 (file)
index 0000000..b324f46
--- /dev/null
@@ -0,0 +1,77 @@
+;; Copyright (C) 1991-2009, 2010 Unicode, Inc.
+;; This file was generated from the Unicode confusables list at
+;; http://www.unicode.org/Public/security/revision-04/confusables.txt.
+;; See lisp/international/README in the Emacs trunk
+;; for the copyright and permission notice.
+
+(defvar uni-confusables-char-table-single (make-char-table 'confusables-single-script))
+
+(let ((k nil) (v nil) (ranges '(195101 "𪘀" 195100 "鼻" 195099 "鼖" 195098 "鼏" 195097 "鼅" 195096 "黾" 195095 "黹" 195094 "䵖" 195093 "麻" 195092 "𪊑" 195091 "𪈎" 195090 "𪄅" 195089 "䳸" 195088 "𪃎" 195087 "鵧" 195086 "䳭" 195085 "䳎" 195084 "鳽" 195083 "鱀" 195082 "鬒" 195081 "𩬰" 195080 "䯎" 195079 "駾" 195078 "駂" 195077 "馧" 195076 "餩" 195075 "䬳" 195074 "飢" 195073 "𩖶" 195072 "頩" 195071 "頋" 195070 "頋" 195069 "𩒖" 195068 "䪲" 195067 "𩐊" 195066 "韠" 195065 "䩶" 195064 "䩮" 195063 "𩈚" 195062 "𩅅" 195061 "霣" 195060 "嶲" 195059 "雃" 195058 "䧦" 195057 "𨵷" 195056 "閷" 195055 "䦕" 195054 "開" 195053 "𨯺" 195052 "鐕" 195051 "鏹" 195050 "鉼" 195049 "鋘" 195048 "鋗" 195047 "鈸" 195046 "鄛" 195045 "𨜮" 195044 "鄑" 195043 "郱" 195042 "邔" 195041 "𨗭" 195040 "𨗒" 195039 "輸" 195038 "軔" 195037 "𠣞" 195036 "跰" 195035 "趼" 195034 "跋" 195033 "𠠄" 195032 "𧼯" 195031 "起" 195030 "贛" 195029 "賁" 195028 "貫" 195027 "𧲨" 195026 "豕" 195025 "變" 195024 "諭" 195023 "誠" 195022 "䛇" 195021 "䚾" 195020 "𧥦" 195019 "𧢮" 195018 "㒻" 195017 "裺" 195016 "䘵" 195015 "裞" 195014 "裗" 195013 "𧙧" 195012 "衣" 195011 "衠" 195010 "䗹" 195009 "蠁" 195008 "蟡" 195007 "䗗" 195006 "螆" 195005 "蝫" 195004 "蜨" 195003 "蝹" 195002 "蛢" 195001 "蜎" 195000 "蚈" 194999 "蚩" 194998 "虩" 194997 "虧" 194996 "虜" 194995 "虐" 194994 "䕫" 194993 "𧃒" 194992 "𦾱" 194991 "䕡" 194990 "䕝" 194989 "𦼬" 194988 "蕤" 194987 "𧏊" 194986 "蔖" 194985 "蓳" 194984 "蓱" 194983 "䔫" 194982 "𦳕" 194981 "𦵫" 194980 "𦰶" 194979 "菜" 194978 "菌" 194977 "菊" 194976 "荓" 194975 "著" 194974 "菧" 194973 "莽" 194972 "茣" 194971 "莭" 194970 "荣" 194969 "茝" 194968 "若" 194967 "𦬼" 194966 "苦" 194965 "芽" 194964 "芳" 194963 "花" 194962 "劳" 194961 "芝" 194960 "芋" 194959 "芑" 194958 "䑫" 194957 "辞" 194956 "舄" 194955 "舁" 194954 "𣎜" 194953 "𣎓" 194952 "𦞵" 194951 "𦞧" 194950 "媵" 194949 "脾" 194948 "䐋" 194947 "脃" 194946 "育" 194945 "䏕" 194944 "𣍟" 194943 "聰" 194942 "𦖨" 194941 "聠" 194940 "𦔣" 194939 "𦓚" 194938 "者" 194937 "翺" 194936 "羕" 194935 "𦌾" 194934 "罺" 194933 "𦋙" 194932 "䍙" 194931 "𦉇" 194930 "𦈨" 194929 "䌴" 194928 "繅" 194927 "縂" 194926 "緇" 194925 "䌁" 194924 "絣" 194923 "𥾆" 194922 "紀" 194921 "糣" 194920 "糨" 194919 "䊠" 194918 "糒" 194917 "𥲀" 194916 "䈧" 194915 "築" 194914 "篆" 194913 "𥮫" 194912 "䈂" 194911 "竮" 194910 "𥪧" 194909 "𥪧" 194908 "𥥼" 194907 "穏" 194906 "穊" 194905 "穀" 194904 "䄯" 194903 "秫" 194902 "福" 194901 "𥛅" 194900 "𥚚" 194899 "祖" 194898 "𥘦" 194897 "䃣" 194896 "磌" 194895 "碌" 194894 "硎" 194893 "𥐝" 194892 "䂖" 194891 "䁆" 194890 "瞋" 194889 "䀹" 194888 "睊" 194887 "真" 194886 "真" 194885 "眞" 194884 "𥄳" 194883 "𥄙" 194882 "𥃲" 194881 "𥃳" 194880 "直" 194879 "䀈" 194878 "㿼" 194877 "𥁄" 194876 "𤾸" 194875 "𤾡" 194874 "瘐" 194873 "𢆟" 194872 "異" 194871 "𤲒" 194870 "甾" 194869 "𤰶" 194868 "甤" 194867 "㼛" 194866 "瓊" 194865 "璅" 194864 "瑱" 194863 "瑜" 194862 "瑇" 194861 "㺸" 194860 "㺸" 194859 "玥" 194858 "㺬" 194857 "王" 194856 "獺" 194855 "𤠔" 194854 "𤜵" 194853 "犕" 194852 "犀" 194851 "𤘈" 194850 "牐" 194849 "爵" 194848 "爨" 194847 "𤎫" 194846 "熜" 194845 "𤉣" 194844 "煅" 194843 "𠔥" 194842 "炭" 194841 "灷" 194840 "災" 194839 "灊" 194838 "㶖" 194837 "瀛" 194836 "瀞" 194835 "瀹" 194834 "濆" 194833 "𣾎" 194832 "𣽞" 194831 "潮" 194830 "淹" 194829 "𣻑" 194828 "滇" 194827 "滋" 194826 "㴳" 194825 "湮" 194824 "港" 194823 "洴" 194822 "𣴞" 194821 "涅" 194820 "浸" 194819 "浩" 194818 "流" 194817 "海" 194816 "派" 194815 "洖" 194814 "汧" 194813 "泍" 194812 "沿" 194811 "𣲼" 194810 "汎" 194809 "𣫺" 194808 "𡴋" 194807 "𣪍" 194806 "殻" 194805 "殺" 194804 "殟" 194803 "歲" 194802 "㱎" 194801 "歔" 194800 "𣢧" 194799 "次" 194798 "㰘" 194797 "櫛" 194796 "𣚣" 194795 "檨" 194794 "槪" 194793 "榣" 194792 "楂" 194791 "㮝" 194790 "椔" 194789 "栟" 194788 "梎" 194787 "𣑭" 194786 "梅" 194785 "桒" 194784 "枅" 194783 "柺" 194782 "㭉" 194781 "𣏃" 194780 "杓" 194779 "杞" 194778 "朡" 194777 "望" 194776 "朗" 194775 "䏙" 194774 "肭" 194773 "暜" 194772 "最" 194771 "冕" 194770 "冒" 194769 "㫤" 194768 "㬈" 194767 "暑" 194766 "㬙" 194765 "晉" 194764 "書" 194763 "旣" 194762 "𣀊" 194761 "敬" 194760 "敏" 194759 "㩬" 194758 "摷" 194757 "撝" 194756 "摾" 194755 "摩" 194754 "㨮" 194753 "掩" 194752 "揅" 194751 "搢" 194750 "𢯱" 194749 "揤" 194748 "掃" 194747 "捨" 194746 "拼" 194745 "挽" 194744 "𢬌" 194743 "捐" 194742 "拔" 194741 "抱" 194740 "扝" 194739 "戛" 194738 "成" 194737 "懶" 194736 "懲" 194735 "懞" 194734 "憯" 194733 "憤" 194732 "憲" 194731 "憎" 194730 "慺" 194729 "慌" 194728 "慎" 194727 "慌" 194726 "慈" 194725 "惇" 194724 "𢛔" 194723 "悔" 194722 "㤜" 194721 "㤺" 194720 "悁" 194719 "忹" 194718 "志" 194717 "忍" 194716 "徚" 194715 "㣣" 194714 "彫" 194713 "形" 194712 "𦇚" 194711 "𣊸" 194710 "㣇" 194709 "弢" 194708 "弢" 194707 "舁" 194706 "𢌱" 194705 "𢌱" 194704 "廾" 194703 "𪎒" 194702 "廊" 194701 "庶" 194700 "庳" 194699 "庰" 194698 "㡼" 194697 "𢆃" 194696 "㡢" 194695 "幩" 194694 "帽" 194693 "帨" 194692 "巽" 194691 "㠯" 194690 "巢" 194689 "巡" 194688 "嵼" 194687 "嵫" 194686 "嵮" 194685 "𡷦" 194684 "嵃" 194683 "𡷤" 194682 "岍" 194681 "峀" 194680 "屮" 194679 "屠" 194678 "㞁" 194677 "尢" 194676 "当" 194675 "将" 194674 "寿" 194673 "𡬘" 194672 "寳" 194671 "寧" 194670 "寘" 194669 "寃" 194668 "𡧈" 194667 "嬾" 194666 "嬾" 194665 "嬈" 194664 "㛼" 194663 "㛮" 194662 "婦" 194661 "姘" 194660 "娧" 194659 "娛" 194658 "姬" 194657 "𡛪" 194656 "𡚨" 194655 "奢" 194654 "夢" 194653 "多" 194652 "夆" 194651 "壷" 194650 "売" 194649 "𡓤" 194648 "墬" 194647 "報" 194646 "堲" 194645 "型" 194644 "堍" 194643 "埴" 194642 "城" 194641 "壮" 194640 "切" 194639 "噴" 194638 "噑" 194637 "圗" 194636 "嘆" 194635 "圖" 194634 "嗂" 194633 "喳" 194632 "喫" 194631 "喙" 194630 "善" 194629 "善" 194628 "啣" 194627 "啓" 194626 "唐" 194625 "哶" 194624 "咢" 194623 "周" 194622 "呈" 194621 "吸" 194620 "咞" 194619 "吆" 194618 "叱" 194617 "叫" 194616 "𠭣" 194615 "叟" 194614 "及" 194613 "灰" 194612 "𠨬" 194611 "卿" 194610 "卿" 194609 "卿" 194608 "卽" 194607 "即" 194606 "博" 194605 "卑" 194604 "卉" 194603 "北" 194602 "匆" 194601 "包" 194600 "勺" 194599 "勤" 194598 "勉" 194597 "勇" 194596 "㔕" 194595 "剷" 194594 "割" 194593 "剆" 194592 "刻" 194591 "㓟" 194590 "刃" 194589 "凵" 194588 "𩇟" 194587 "况" 194586 "冬" 194585 "仌" 194584 "冤" 194583 "冗" 194582 "𠕋" 194581 "再" 194580 "內" 194579 "㒹" 194578 "𠔜" 194577 "具" 194576 "兤" 194575 "兔" 194574 "免" 194573 "𠘺" 194572 "㒞" 194571 "像" 194570 "僧" 194569 "備" 194568 "偺" 194567 "併" 194566 "侻" 194565 "侮" 194564 "你" 194563 "𠄢" 194562 "乁" 194561 "丸" 194560 "丽" 127560 "(敗)" 127559 "(勝)" 127558 "(盗)" 127557 "(打)" 127556 "(点)" 127555 "(安)" 127554 "(二)" 127553 "(三)" 127552 "(本)" 127274 "(S)" 127273 "(Z)" 127272 "(Y)" 127271 "(X)" 127270 "(W)" 127269 "(V)" 127268 "(U)" 127267 "(T)" 127266 "(S)" 127265 "(R)" 127264 "(Q)" 127263 "(P)" 127262 "(O)" 127261 "(N)" 127260 "(M)" 127259 "(L)" 127258 "(K)" 127257 "(J)" 127256 "(I)" 127255 "(H)" 127254 "(G)" 127253 "(F)" 127252 "(E)" 127251 "(D)" 127250 "(C)" 127249 "(B)" 127248 "(A)" 127242 "9," 127241 "8," 127240 "7," 127239 "6," 127238 "5," 127237 "4," 127236 "3," 127235 "2," 127234 "l," 127233 "O," 127232 "O." 120831 "9" 120830 "8" 120829 "7" 120828 "6" 120827 "5" 120826 "4" 120825 "3" 120824 "2" 120823 "l" 120822 "O" 120821 "9" 120820 "8" 120819 "7" 120818 "6" 120817 "5" 120816 "4" 120815 "3" 120814 "2" 120813 "l" 120812 "O" 120811 "9" 120810 "8" 120809 "7" 120808 "6" 120807 "5" 120806 "4" 120805 "3" 120804 "2" 120803 "l" 120802 "O" 120801 "9" 120800 "8" 120799 "7" 120798 "6" 120797 "5" 120796 "4" 120795 "3" 120794 "2" 120793 "l" 120792 "O" 120791 "9" 120790 "8" 120789 "7" 120788 "6" 120787 "5" 120786 "4" 120785 "3" 120784 "2" 120783 "l" 120782 "O" 120779 "ϝ" 120778 "F" 120777 "n" 120776 "p" 120775 "ɸ" 120774 "k" 120773 "O̵" 120772 "ɛ" 120771 "∂" 120770 "ω" 120769 "ψ" 120768 "χ" 120767 "ɸ" 120766 "u" 120765 "t" 120764 "o" 120763 "ς" 120762 "p" 120761 "n" 120760 "o" 120759 "ξ" 120758 "v" 120757 "μ" 120756 "λ" 120755 "k" 120754 "i" 120753 "O̵" 120752 "n̩" 120751 "ζ" 120750 "ɛ" 120749 "ẟ" 120748 "y" 120747 "ß" 120746 "a" 120745 "∇" 120744 "ᘯ" 120743 "Ψ" 120742 "X" 120741 "Φ" 120740 "Y" 120739 "T" 120738 "Ʃ" 120737 "O̵" 120736 "P" 120735 "Π" 120734 "O" 120733 "Ξ" 120732 "N" 120731 "M" 120730 "Ʌ" 120729 "K" 120728 "l" 120727 "O̵" 120726 "H" 120725 "Z" 120724 "E" 120723 "ᐃ" 120722 "ᒥ" 120721 "B" 120720 "A" 120719 "n" 120718 "p" 120717 "ɸ" 120716 "k" 120715 "O̵" 120714 "ɛ" 120713 "∂" 120712 "ω" 120711 "ψ" 120710 "χ" 120709 "ɸ" 120708 "u" 120707 "t" 120706 "o" 120705 "ς" 120704 "p" 120703 "n" 120702 "o" 120701 "ξ" 120700 "v" 120699 "μ" 120698 "λ" 120697 "k" 120696 "i" 120695 "O̵" 120694 "n̩" 120693 "ζ" 120692 "ɛ" 120691 "ẟ" 120690 "y" 120689 "ß" 120688 "a" 120687 "∇" 120686 "ᘯ" 120685 "Ψ" 120684 "X" 120683 "Φ" 120682 "Y" 120681 "T" 120680 "Ʃ" 120679 "O̵" 120678 "P" 120677 "Π" 120676 "O" 120675 "Ξ" 120674 "N" 120673 "M" 120672 "Ʌ" 120671 "K" 120670 "l" 120669 "O̵" 120668 "H" 120667 "Z" 120666 "E" 120665 "ᐃ" 120664 "ᒥ" 120663 "B" 120662 "A" 120661 "n" 120660 "p" 120659 "ɸ" 120658 "k" 120657 "O̵" 120656 "ɛ" 120655 "∂" 120654 "ω" 120653 "ψ" 120652 "χ" 120651 "ɸ" 120650 "u" 120649 "t" 120648 "o" 120647 "ς" 120646 "p" 120645 "n" 120644 "o" 120643 "ξ" 120642 "v" 120641 "μ" 120640 "λ" 120639 "k" 120638 "i" 120637 "O̵" 120636 "n̩" 120635 "ζ" 120634 "ɛ" 120633 "ẟ" 120632 "y" 120631 "ß" 120630 "a" 120629 "∇" 120628 "ᘯ" 120627 "Ψ" 120626 "X" 120625 "Φ" 120624 "Y" 120623 "T" 120622 "Ʃ" 120621 "O̵" 120620 "P" 120619 "Π" 120618 "O" 120617 "Ξ" 120616 "N" 120615 "M" 120614 "Ʌ" 120613 "K" 120612 "l" 120611 "O̵" 120610 "H" 120609 "Z" 120608 "E" 120607 "ᐃ" 120606 "ᒥ" 120605 "B" 120604 "A" 120603 "n" 120602 "p" 120601 "ɸ" 120600 "k" 120599 "O̵" 120598 "ɛ" 120597 "∂" 120596 "ω" 120595 "ψ" 120594 "χ" 120593 "ɸ" 120592 "u" 120591 "t" 120590 "o" 120589 "ς" 120588 "p" 120587 "n" 120586 "o" 120585 "ξ" 120584 "v" 120583 "μ" 120582 "λ" 120581 "k" 120580 "i" 120579 "O̵" 120578 "n̩" 120577 "ζ" 120576 "ɛ" 120575 "ẟ" 120574 "y" 120573 "ß" 120572 "a" 120571 "∇" 120570 "ᘯ" 120569 "Ψ" 120568 "X" 120567 "Φ" 120566 "Y" 120565 "T" 120564 "Ʃ" 120563 "O̵" 120562 "P" 120561 "Π" 120560 "O" 120559 "Ξ" 120558 "N" 120557 "M" 120556 "Ʌ" 120555 "K" 120554 "l" 120553 "O̵" 120552 "H" 120551 "Z" 120550 "E" 120549 "ᐃ" 120548 "ᒥ" 120547 "B" 120546 "A" 120545 "n" 120544 "p" 120543 "ɸ" 120542 "k" 120541 "O̵" 120540 "ɛ" 120539 "∂" 120538 "ω" 120537 "ψ" 120536 "χ" 120535 "ɸ" 120534 "u" 120533 "t" 120532 "o" 120531 "ς" 120530 "p" 120529 "n" 120528 "o" 120527 "ξ" 120526 "v" 120525 "μ" 120524 "λ" 120523 "k" 120522 "i" 120521 "O̵" 120520 "n̩" 120519 "ζ" 120518 "ɛ" 120517 "ẟ" 120516 "y" 120515 "ß" 120514 "a" 120513 "∇" 120512 "ᘯ" 120511 "Ψ" 120510 "X" 120509 "Φ" 120508 "Y" 120507 "T" 120506 "Ʃ" 120505 "O̵" 120504 "P" 120503 "Π" 120502 "O" 120501 "Ξ" 120500 "N" 120499 "M" 120498 "Ʌ" 120497 "K" 120496 "l" 120495 "O̵" 120494 "H" 120493 "Z" 120492 "E" 120491 "ᐃ" 120490 "ᒥ" 120489 "B" 120488 "A" 120485 "j" 120484 "i" 120483 "z" 120482 "y" 120481 "x" 120480 "vv" 120479 "v" 120478 "u" 120477 "t" 120476 "s" 120475 "r" 120474 "q" 120473 "p" 120472 "o" 120471 "n" 120470 "rn" 120469 "l" 120468 "k" 120467 "j" 120466 "i" 120465 "h" 120464 "g" 120463 "f" 120462 "e" 120461 "d" 120460 "c" 120459 "b" 120458 "a" 120457 "Z" 120456 "Y" 120455 "X" 120454 "W" 120453 "V" 120452 "U" 120451 "T" 120450 "S" 120449 "R" 120448 "Q" 120447 "P" 120446 "O" 120445 "N" 120444 "M" 120443 "L" 120442 "K" 120441 "J" 120440 "l" 120439 "H" 120438 "G" 120437 "F" 120436 "E" 120435 "D" 120434 "C" 120433 "B" 120432 "A" 120431 "z" 120430 "y" 120429 "x" 120428 "vv" 120427 "v" 120426 "u" 120425 "t" 120424 "s" 120423 "r" 120422 "q" 120421 "p" 120420 "o" 120419 "n" 120418 "rn" 120417 "l" 120416 "k" 120415 "j" 120414 "i" 120413 "h" 120412 "g" 120411 "f" 120410 "e" 120409 "d" 120408 "c" 120407 "b" 120406 "a" 120405 "Z" 120404 "Y" 120403 "X" 120402 "W" 120401 "V" 120400 "U" 120399 "T" 120398 "S" 120397 "R" 120396 "Q" 120395 "P" 120394 "O" 120393 "N" 120392 "M" 120391 "L" 120390 "K" 120389 "J" 120388 "l" 120387 "H" 120386 "G" 120385 "F" 120384 "E" 120383 "D" 120382 "C" 120381 "B" 120380 "A" 120379 "z" 120378 "y" 120377 "x" 120376 "vv" 120375 "v" 120374 "u" 120373 "t" 120372 "s" 120371 "r" 120370 "q" 120369 "p" 120368 "o" 120367 "n" 120366 "rn" 120365 "l" 120364 "k" 120363 "j" 120362 "i" 120361 "h" 120360 "g" 120359 "f" 120358 "e" 120357 "d" 120356 "c" 120355 "b" 120354 "a" 120353 "Z" 120352 "Y" 120351 "X" 120350 "W" 120349 "V" 120348 "U" 120347 "T" 120346 "S" 120345 "R" 120344 "Q" 120343 "P" 120342 "O" 120341 "N" 120340 "M" 120339 "L" 120338 "K" 120337 "J" 120336 "l" 120335 "H" 120334 "G" 120333 "F" 120332 "E" 120331 "D" 120330 "C" 120329 "B" 120328 "A" 120327 "z" 120326 "y" 120325 "x" 120324 "vv" 120323 "v" 120322 "u" 120321 "t" 120320 "s" 120319 "r" 120318 "q" 120317 "p" 120316 "o" 120315 "n" 120314 "rn" 120313 "l" 120312 "k" 120311 "j" 120310 "i" 120309 "h" 120308 "g" 120307 "f" 120306 "e" 120305 "d" 120304 "c" 120303 "b" 120302 "a" 120301 "Z" 120300 "Y" 120299 "X" 120298 "W" 120297 "V" 120296 "U" 120295 "T" 120294 "S" 120293 "R" 120292 "Q" 120291 "P" 120290 "O" 120289 "N" 120288 "M" 120287 "L" 120286 "K" 120285 "J" 120284 "l" 120283 "H" 120282 "G" 120281 "F" 120280 "E" 120279 "D" 120278 "C" 120277 "B" 120276 "A" 120275 "z" 120274 "y" 120273 "x" 120272 "vv" 120271 "v" 120270 "u" 120269 "t" 120268 "s" 120267 "r" 120266 "q" 120265 "p" 120264 "o" 120263 "n" 120262 "rn" 120261 "l" 120260 "k" 120259 "j" 120258 "i" 120257 "h" 120256 "g" 120255 "f" 120254 "e" 120253 "d" 120252 "c" 120251 "b" 120250 "a" 120249 "Z" 120248 "Y" 120247 "X" 120246 "W" 120245 "V" 120244 "U" 120243 "T" 120242 "S" 120241 "R" 120240 "Q" 120239 "P" 120238 "O" 120237 "N" 120236 "M" 120235 "L" 120234 "K" 120233 "J" 120232 "l" 120231 "H" 120230 "G" 120229 "F" 120228 "E" 120227 "D" 120226 "C" 120225 "B" 120224 "A" 120223 "z" 120222 "y" 120221 "x" 120220 "vv" 120219 "v" 120218 "u" 120217 "t" 120216 "s" 120215 "r" 120214 "q" 120213 "p" 120212 "o" 120211 "n" 120210 "rn" 120209 "l" 120208 "k" 120207 "j" 120206 "i" 120205 "h" 120204 "g" 120203 "f" 120202 "e" 120201 "d" 120200 "c" 120199 "b" 120198 "a" 120197 "Z" 120196 "Y" 120195 "X" 120194 "W" 120193 "V" 120192 "U" 120191 "T" 120190 "S" 120189 "R" 120188 "Q" 120187 "P" 120186 "O" 120185 "N" 120184 "M" 120183 "L" 120182 "K" 120181 "J" 120180 "l" 120179 "H" 120178 "G" 120177 "F" 120176 "E" 120175 "D" 120174 "C" 120173 "B" 120172 "A" 120171 "z" 120170 "y" 120169 "x" 120168 "vv" 120167 "v" 120166 "u" 120165 "t" 120164 "s" 120163 "r" 120162 "q" 120161 "p" 120160 "o" 120159 "n" 120158 "rn" 120157 "l" 120156 "k" 120155 "j" 120154 "i" 120153 "h" 120152 "g" 120151 "f" 120150 "e" 120149 "d" 120148 "c" 120147 "b" 120146 "a" 120144 "Y" 120143 "X" 120142 "W" 120141 "V" 120140 "U" 120139 "T" 120138 "S" 120134 "O" 120132 "M" 120131 "L" 120130 "K" 120129 "J" 120128 "l" 120126 "G" 120125 "F" 120124 "E" 120123 "D" 120121 "B" 120120 "A" 120119 "z" 120118 "y" 120117 "x" 120116 "vv" 120115 "v" 120114 "u" 120113 "t" 120112 "s" 120111 "r" 120110 "q" 120109 "p" 120108 "o" 120107 "n" 120106 "rn" 120105 "l" 120104 "k" 120103 "j" 120102 "i" 120101 "h" 120100 "g" 120099 "f" 120098 "e" 120097 "d" 120096 "c" 120095 "b" 120094 "a" 120092 "Y" 120091 "X" 120090 "W" 120089 "V" 120088 "U" 120087 "T" 120086 "S" 120084 "Q" 120083 "P" 120082 "O" 120081 "N" 120080 "M" 120079 "L" 120078 "K" 120077 "J" 120074 "G" 120073 "F" 120072 "E" 120071 "D" 120069 "B" 120068 "A" 120067 "z" 120066 "y" 120065 "x" 120064 "vv" 120063 "v" 120062 "u" 120061 "t" 120060 "s" 120059 "r" 120058 "q" 120057 "p" 120056 "o" 120055 "n" 120054 "rn" 120053 "l" 120052 "k" 120051 "j" 120050 "i" 120049 "h" 120048 "g" 120047 "f" 120046 "e" 120045 "d" 120044 "c" 120043 "b" 120042 "a" 120041 "Z" 120040 "Y" 120039 "X" 120038 "W" 120037 "V" 120036 "U" 120035 "T" 120034 "S" 120033 "R" 120032 "Q" 120031 "P" 120030 "O" 120029 "N" 120028 "M" 120027 "L" 120026 "K" 120025 "J" 120024 "l" 120023 "H" 120022 "G" 120021 "F" 120020 "E" 120019 "D" 120018 "C" 120017 "B" 120016 "A" 120015 "z" 120014 "y" 120013 "x" 120012 "vv" 120011 "v" 120010 "u" 120009 "t" 120008 "s" 120007 "r" 120006 "q" 120005 "p" 120003 "n" 120002 "rn" 120001 "l" 120000 "k" 119999 "j" 119998 "i" 119997 "h" 119995 "f" 119993 "d" 119992 "c" 119991 "b" 119990 "a" 119989 "Z" 119988 "Y" 119987 "X" 119986 "W" 119985 "V" 119984 "U" 119983 "T" 119982 "S" 119980 "Q" 119979 "P" 119978 "O" 119977 "N" 119974 "K" 119973 "J" 119970 "G" 119967 "D" 119966 "C" 119964 "A" 119963 "z" 119962 "y" 119961 "x" 119960 "vv" 119959 "v" 119958 "u" 119957 "t" 119956 "s" 119955 "r" 119954 "q" 119953 "p" 119952 "o" 119951 "n" 119950 "rn" 119949 "l" 119948 "k" 119947 "j" 119946 "i" 119945 "h" 119944 "g" 119943 "f" 119942 "e" 119941 "d" 119940 "c" 119939 "b" 119938 "a" 119937 "Z" 119936 "Y" 119935 "X" 119934 "W" 119933 "V" 119932 "U" 119931 "T" 119930 "S" 119929 "R" 119928 "Q" 119927 "P" 119926 "O" 119925 "N" 119924 "M" 119923 "L" 119922 "K" 119921 "J" 119920 "l" 119919 "H" 119918 "G" 119917 "F" 119916 "E" 119915 "D" 119914 "C" 119913 "B" 119912 "A" 119911 "z" 119910 "y" 119909 "x" 119908 "vv" 119907 "v" 119906 "u" 119905 "t" 119904 "s" 119903 "r" 119902 "q" 119901 "p" 119900 "o" 119899 "n" 119898 "rn" 119897 "l" 119896 "k" 119895 "j" 119894 "i" 119892 "g" 119891 "f" 119890 "e" 119889 "d" 119888 "c" 119887 "b" 119886 "a" 119885 "Z" 119884 "Y" 119883 "X" 119882 "W" 119881 "V" 119880 "U" 119879 "T" 119878 "S" 119877 "R" 119876 "Q" 119875 "P" 119874 "O" 119873 "N" 119872 "M" 119871 "L" 119870 "K" 119869 "J" 119868 "l" 119867 "H" 119866 "G" 119865 "F" 119864 "E" 119863 "D" 119862 "C" 119861 "B" 119860 "A" 119859 "z" 119858 "y" 119857 "x" 119856 "vv" 119855 "v" 119854 "u" 119853 "t" 119852 "s" 119851 "r" 119850 "q" 119849 "p" 119848 "o" 119847 "n" 119846 "rn" 119845 "l" 119844 "k" 119843 "j" 119842 "i" 119841 "h" 119840 "g" 119839 "f" 119838 "e" 119837 "d" 119836 "c" 119835 "b" 119834 "a" 119833 "Z" 119832 "Y" 119831 "X" 119830 "W" 119829 "V" 119828 "U" 119827 "T" 119826 "S" 119825 "R" 119824 "Q" 119823 "P" 119822 "O" 119821 "N" 119820 "M" 119819 "L" 119818 "K" 119817 "J" 119816 "l" 119815 "H" 119814 "G" 119813 "F" 119812 "E" 119811 "D" 119810 "C" 119809 "B" 119808 "A" 119149 "." 69819 "॰" 68176 "." 68154 "̣" 66720 "𐒆" 65793 "·" 65517 "▪" 65512 "l" 65507 "ˉ" 65381 "·" 65374 "〜" 65372 "│" 65369 "y" 65368 "x" 65366 "v" 65363 "s" 65360 "p" 65359 "o" 65356 "l" 65354 "j" 65353 "i" 65352 "h" 65351 "g" 65349 "e" 65347 "c" 65345 "a" 65344 "'" 65342 "︿" 65341 ")" 65340 "\\" 65339 "(" 65338 "Z" 65337 "Y" 65336 "X" 65332 "T" 65331 "S" 65328 "P" 65327 "O" 65326 "N" 65325 "M" 65323 "K" 65322 "J" 65321 "l" 65320 "H" 65317 "E" 65315 "C" 65314 "B" 65313 "A" 65306 ":" 65293 "ー" 65287 "'" 65282 "''" 65281 "!" 65276 "لا" 65275 "لا" 65274 "لإ" 65273 "لإ" 65272 "لاٴ" 65271 "لاٴ" 65270 "لآ" 65269 "لآ" 65268 "ى" 65267 "ى" 65266 "ى" 65265 "ى" 65264 "ى" 65263 "ى" 65262 "و" 65261 "و" 65260 "ه" 65259 "ه" 65258 "ه" 65257 "ه" 65256 "ب" 65255 "ب" 65254 "ب" 65253 "ب" 65252 "م" 65251 "م" 65250 "م" 65249 "م" 65248 "ل" 65247 "ل" 65246 "ل" 65245 "ل" 65244 "ك" 65243 "ك" 65242 "ك" 65241 "ك" 65240 "ق" 65239 "ق" 65238 "ق" 65237 "ق" 65236 "ف" 65235 "ف" 65234 "ف" 65233 "ف" 65232 "غ" 65231 "غ" 65230 "غ" 65229 "غ" 65228 "ع" 65227 "ع" 65226 "ع" 65225 "ع" 65224 "ظ" 65223 "ظ" 65222 "ظ" 65221 "ظ" 65220 "ط" 65219 "ط" 65218 "ط" 65217 "ط" 65216 "ض" 65215 "ض" 65214 "ض" 65213 "ض" 65212 "ص" 65211 "ص" 65210 "ص" 65209 "ص" 65208 "ش" 65207 "ش" 65206 "ش" 65205 "ش" 65204 "س" 65203 "س" 65202 "س" 65201 "س" 65200 "ز" 65199 "ز" 65198 "ر" 65197 "ر" 65196 "ذ" 65195 "ذ" 65194 "د" 65193 "د" 65192 "ج" 65191 "ج" 65190 "ج" 65189 "ج" 65188 "ح" 65187 "ح" 65186 "ح" 65185 "ح" 65184 "ج" 65183 "ج" 65182 "ج" 65181 "ج" 65180 "ث" 65179 "ث" 65178 "ث" 65177 "ث" 65176 "ت" 65175 "ت" 65174 "ت" 65173 "ت" 65172 "ة" 65171 "ة" 65170 "ب" 65169 "ب" 65168 "ب" 65167 "ب" 65166 "ا" 65165 "ا" 65164 "ىٴ" 65163 "ىٴ" 65162 "ىٴ" 65161 "ىٴ" 65160 "إ" 65159 "إ" 65158 "وٴ" 65157 "وٴ" 65156 "اٴ" 65155 "اٴ" 65154 "آ" 65153 "آ" 65152 "ء" 65128 "\\" 65112 "-" 65103 "_" 65102 "_" 65101 "_" 65100 "ˉ" 65099 "ˉ" 65098 "ˉ" 65097 "ˉ" 65082 "⏡" 65081 "⏠" 65080 "⏟" 65079 "⏞" 65078 "⏝" 65077 "⏜" 65073 "│" 65072 ":" 65049 "⁝" 65020 "رىال" 65019 "جل جلاله" 65018 "صلى الله علىه وسلم" 65017 "صلى" 65016 "وسلم" 65015 "علىه" 65014 "رسول" 65013 "صلعم" 65012 "محمد" 65011 "اكبر" 65010 "الله" 65009 "قلے" 65008 "صلے" 64967 "بجى" 64966 "سجى" 64965 "صمم" 64964 "عجم" 64963 "كمم" 64962 "بحى" 64961 "فمى" 64960 "مجى" 64959 "حجى" 64958 "جحى" 64957 "بجح" 64956 "لجم" 64955 "كمم" 64954 "لجم" 64953 "مجى" 64952 "بجح" 64951 "كمى" 64950 "عمى" 64949 "لحم" 64948 "قمح" 64947 "بحى" 64946 "قمى" 64945 "ممى" 64944 "ىمى" 64943 "ىجى" 64942 "ىحى" 64941 "لمى" 64940 "لجى" 64939 "ضحى" 64938 "شحى" 64937 "صحى" 64936 "سجى" 64935 "جمى" 64934 "جحى" 64933 "جمى" 64932 "تمى" 64931 "تمى" 64930 "تجى" 64929 "تجى" 64928 "تجى" 64927 "تجى" 64926 "بجى" 64925 "ىمم" 64924 "ىمم" 64923 "بمى" 64922 "بمى" 64921 "بجى" 64920 "بجم" 64919 "بجم" 64918 "بحى" 64917 "بحم" 64916 "همم" 64915 "همج" 64914 "مجج" 64911 "مجم" 64910 "مجج" 64909 "مجم" 64908 "مجح" 64907 "محى" 64906 "محم" 64905 "محج" 64904 "لمح" 64903 "لمح" 64902 "لجم" 64901 "لجم" 64900 "لجج" 64899 "لجج" 64898 "لحى" 64897 "لحى" 64896 "لحم" 64895 "قمم" 64894 "قمح" 64893 "فجم" 64892 "فجم" 64891 "غمى" 64890 "غمى" 64889 "غمم" 64888 "عمى" 64887 "عمم" 64886 "عمم" 64885 "عجم" 64884 "طمى" 64883 "طمم" 64882 "طمح" 64881 "طمح" 64880 "ضجم" 64879 "ضجم" 64878 "ضحى" 64877 "شمم" 64876 "شمم" 64875 "شمج" 64874 "شمج" 64873 "شجى" 64872 "شحم" 64871 "شحم" 64870 "صمم" 64869 "صحح" 64868 "صحح" 64867 "سمم" 64866 "سمم" 64865 "سمج" 64864 "سمح" 64863 "سمح" 64862 "سجى" 64861 "سجح" 64860 "سحج" 64859 "حمى" 64858 "حمى" 64857 "جمح" 64856 "جمح" 64855 "تمج" 64854 "تمح" 64853 "تمج" 64852 "تجم" 64851 "تحم" 64850 "تحج" 64849 "تحج" 64848 "تجم" 64831 ")" 64830 "(" 64829 "اً" 64828 "اً" 64827 "ظم" 64826 "طم" 64825 "شج" 64824 "شح" 64823 "شج" 64822 "سج" 64821 "سح" 64820 "سج" 64819 "طم" 64818 "شه" 64817 "سه" 64816 "شم" 64815 "شج" 64814 "شح" 64813 "شج" 64812 "ضر" 64811 "صر" 64810 "سر" 64809 "شر" 64808 "شم" 64807 "شج" 64806 "شح" 64805 "شج" 64804 "ضى" 64803 "ضى" 64802 "صى" 64801 "صى" 64800 "جى" 64799 "جى" 64798 "جى" 64797 "جى" 64796 "حى" 64795 "حى" 64794 "شى" 64793 "شى" 64792 "سى" 64791 "سى" 64790 "غى" 64789 "غى" 64788 "عى" 64787 "عى" 64786 "طى" 64785 "طى" 64784 "ضر" 64783 "صر" 64782 "سر" 64781 "شر" 64780 "شم" 64779 "شج" 64778 "شح" 64777 "شج" 64776 "ضى" 64775 "ضى" 64774 "صى" 64773 "صى" 64772 "جى" 64771 "جى" 64770 "جى" 64769 "جى" 64768 "حى" 64767 "حى" 64766 "شى" 64765 "شى" 64764 "سى" 64763 "سى" 64762 "غى" 64761 "غى" 64760 "عى" 64759 "عى" 64758 "طى" 64757 "طى" 64756 "ﹻّ" 64755 "ﹹّ" 64754 "ﹷّ" 64753 "ىه" 64752 "ىم" 64751 "به" 64750 "بم" 64749 "لم" 64748 "كم" 64747 "كل" 64746 "شه" 64745 "شم" 64744 "سه" 64743 "سم" 64742 "ثه" 64741 "ثم" 64740 "ته" 64739 "تم" 64738 "به" 64737 "بم" 64736 "ىٴه" 64735 "ىٴم" 64734 "ىه" 64733 "ىم" 64732 "تج" 64731 "تح" 64730 "تج" 64729 "هٰ" 64728 "هم" 64727 "هج" 64726 "به" 64725 "بم" 64724 "بج" 64723 "بح" 64722 "بج" 64721 "مم" 64720 "مج" 64719 "مح" 64718 "مج" 64717 "له" 64716 "لم" 64715 "لج" 64714 "لح" 64713 "لج" 64712 "كم" 64711 "كل" 64710 "كج" 64709 "كح" 64708 "كج" 64707 "قم" 64706 "قح" 64705 "فم" 64704 "فج" 64703 "فح" 64702 "فج" 64701 "غم" 64700 "غج" 64699 "عم" 64698 "عج" 64697 "ظم" 64696 "طح" 64695 "ضم" 64694 "ضج" 64693 "ضح" 64692 "ضج" 64691 "صم" 64690 "صج" 64689 "صح" 64688 "سم" 64687 "سج" 64686 "سح" 64685 "سج" 64684 "جم" 64683 "جج" 64682 "حم" 64681 "حج" 64680 "جم" 64679 "جح" 64678 "ثم" 64677 "ته" 64676 "تم" 64675 "تج" 64674 "تح" 64673 "تج" 64672 "به" 64671 "بم" 64670 "بج" 64669 "بح" 64668 "بج" 64667 "ىٴه" 64666 "ىٴم" 64665 "ىٴج" 64664 "ىٴح" 64663 "ىٴج" 64662 "ىى" 64661 "ىى" 64660 "ىب" 64659 "ىم" 64658 "ىز" 64657 "ىر" 64656 "ىٰ" 64655 "بى" 64654 "بى" 64653 "بب" 64652 "بم" 64651 "بز" 64650 "بر" 64649 "مم" 64648 "ما" 64647 "لى" 64646 "لى" 64645 "لم" 64644 "كى" 64643 "كى" 64642 "كم" 64641 "كل" 64640 "كا" 64639 "قى" 64638 "قى" 64637 "فى" 64636 "فى" 64635 "ثى" 64634 "ثى" 64633 "ثب" 64632 "ثم" 64631 "ثز" 64630 "ثر" 64629 "تى" 64628 "تى" 64627 "تب" 64626 "تم" 64625 "تز" 64624 "تر" 64623 "بى" 64622 "بى" 64621 "بب" 64620 "بم" 64619 "بز" 64618 "بر" 64617 "ىٴى" 64616 "ىٴى" 64615 "ىٴب" 64614 "ىٴم" 64613 "ىٴز" 64612 "ىٴر" 64611 "ﹼٰ" 64610 "ﹶّ" 64609 "ﹸّ" 64608 "ﹶّ" 64607 "ﹴّ" 64606 "ﹲّ" 64605 "ىٰ" 64604 "رٰ" 64603 "ذٰ" 64602 "ىى" 64601 "ىى" 64600 "ىم" 64599 "تج" 64598 "تح" 64597 "تج" 64596 "هى" 64595 "هى" 64594 "هم" 64593 "هج" 64592 "بى" 64591 "بى" 64590 "بم" 64589 "بج" 64588 "بح" 64587 "بج" 64586 "مى" 64585 "مى" 64584 "مم" 64583 "مج" 64582 "مح" 64581 "مج" 64580 "لى" 64579 "لى" 64578 "لم" 64577 "لج" 64576 "لح" 64575 "لج" 64574 "كى" 64573 "كى" 64572 "كم" 64571 "كل" 64570 "كج" 64569 "كح" 64568 "كج" 64567 "كا" 64566 "قى" 64565 "قى" 64564 "قم" 64563 "قح" 64562 "فى" 64561 "فى" 64560 "فم" 64559 "فج" 64558 "فح" 64557 "فج" 64556 "غم" 64555 "غج" 64554 "عم" 64553 "عج" 64552 "ظم" 64551 "طم" 64550 "طح" 64549 "ضم" 64548 "ضج" 64547 "ضح" 64546 "ضج" 64545 "صم" 64544 "صح" 64543 "سم" 64542 "سج" 64541 "سح" 64540 "سج" 64539 "جم" 64538 "جح" 64537 "جج" 64536 "حم" 64535 "حج" 64534 "جم" 64533 "جح" 64532 "ثى" 64531 "ثى" 64530 "ثم" 64529 "ثج" 64528 "تى" 64527 "تى" 64526 "تم" 64525 "تج" 64524 "تح" 64523 "تج" 64522 "بى" 64521 "بى" 64520 "بم" 64519 "بج" 64518 "بح" 64517 "بج" 64516 "ىٴى" 64515 "ىٴى" 64514 "ىٴم" 64513 "ىٴح" 64512 "ىٴج" 64511 "ى" 64510 "ى" 64509 "ى" 64508 "ى" 64507 "ىٴى" 64506 "ىٴى" 64505 "ىٴى" 64504 "ىٴٺ" 64503 "ىٴٺ" 64502 "ىٴٺ" 64501 "ىٴۈ" 64500 "ىٴۈ" 64499 "ىٴۆ" 64498 "ىٴۆ" 64497 "ىٴۇ" 64496 "ىٴۇ" 64495 "ىٴو" 64494 "ىٴو" 64493 "ىٴه" 64492 "ىٴه" 64491 "ىٴا" 64490 "ىٴا" 64489 "ى" 64488 "ى" 64487 "ٺ" 64486 "ٺ" 64485 "ٺ" 64484 "ٺ" 64483 "ۉ" 64482 "ۉ" 64481 "ۅ" 64480 "ۅ" 64479 "ۋ" 64478 "ۋ" 64477 "ۇٴ" 64476 "ۈ" 64475 "ۈ" 64474 "ۆ" 64473 "ۆ" 64472 "ۇ" 64471 "ۇ" 64470 "ڭ" 64469 "ڭ" 64468 "ڭ" 64467 "ڭ" 64433 "ۓ" 64432 "ۓ" 64431 "ے" 64430 "ے" 64429 "ه" 64428 "ه" 64427 "ه" 64426 "ه" 64425 "ه" 64424 "ه" 64423 "ه" 64422 "ه" 64421 "ۀ" 64420 "ۀ" 64419 "ٹ" 64418 "ٹ" 64417 "ٹ" 64416 "ٹ" 64415 "ں" 64414 "ں" 64413 "ڱ" 64412 "ڱ" 64411 "ڱ" 64410 "ڱ" 64409 "ڳ" 64408 "ڳ" 64407 "ڳ" 64406 "ڳ" 64405 "گ" 64404 "گ" 64403 "گ" 64402 "گ" 64401 "ك" 64400 "ك" 64399 "ك" 64398 "ك" 64397 "ڑ" 64396 "ڑ" 64395 "ژ" 64394 "ژ" 64393 "ڈ" 64392 "ڈ" 64391 "ڎ" 64390 "ڎ" 64389 "ڌ" 64388 "ڌ" 64387 "ڍ" 64386 "ڍ" 64385 "ڇ" 64384 "ڇ" 64383 "ڇ" 64382 "ڇ" 64381 "چ" 64380 "چ" 64379 "چ" 64378 "چ" 64377 "ڃ" 64376 "ڃ" 64375 "ڃ" 64374 "ڃ" 64373 "ڂ" 64372 "ڂ" 64371 "ڂ" 64370 "ڂ" 64369 "ڦ" 64368 "ڦ" 64367 "ڦ" 64366 "ڦ" 64365 "ڤ" 64364 "ڤ" 64363 "ڤ" 64362 "ڤ" 64361 "ٹ" 64360 "ٹ" 64359 "ٹ" 64358 "ٹ" 64357 "ٿ" 64356 "ٿ" 64355 "ٿ" 64354 "ٿ" 64353 "ٺ" 64352 "ٺ" 64351 "ٺ" 64350 "ٺ" 64349 "ٿ" 64348 "ٿ" 64347 "ٿ" 64346 "ٿ" 64345 "پ" 64344 "پ" 64343 "پ" 64342 "پ" 64341 "ٺ" 64340 "ٺ" 64339 "ٺ" 64338 "ٺ" 64337 "ٱ" 64336 "ٱ" 64335 "אל" 64329 "שׁ" 64313 "יִ" 64304 "אַ" 64303 "אַ" 64301 "שּׁ" 64299 "שׁ" 64297 "+" 64296 "ת" 64295 "ר" 64294 "ם" 64293 "ל" 64292 "כ" 64291 "ה" 64290 "ד" 64289 "א" 64288 "ע" 64279 "մխ" 64278 "վն" 64277 "մի" 64276 "մե" 64275 "մն" 64262 "st" 64260 "ffl" 64259 "ffi" 64258 "fl" 64257 "fi" 64256 "ff" 64217 "龎" 64216 "齃" 64215 "𧻓" 64214 "𥳐" 64213 "𥉉" 64212 "䀹" 64211 "䀘" 64210 "㮝" 64209 "𣏕" 64208 "𢡄" 64207 "𢡊" 64206 "龜" 64205 "鬒" 64204 "頻" 64203 "頋" 64202 "響" 64201 "韛" 64200 "靖" 64199 "難" 64198 "陼" 64197 "鉶" 64196 "醙" 64195 "遲" 64194 "輸" 64193 "贈" 64192 "變" 64191 "謹" 64190 "諭" 64189 "諾" 64188 "謁" 64187 "請" 64186 "諸" 64185 "調" 64184 "視" 64183 "覆" 64182 "襁" 64181 "蝹" 64180 "華" 64179 "荒" 64178 "者" 64177 "缾" 64176 "練" 64175 "絛" 64174 "类" 64173 "節" 64172 "窱" 64171 "磌" 64170 "着" 64169 "睊" 64168 "直" 64167 "盛" 64166 "益" 64165 "瘟" 64164 "瘝" 64163 "画" 64162 "甆" 64161 "瑱" 64160 "猪" 64159 "犯" 64158 "爵" 64157 "瞧" 64156 "煮" 64155 "瀞" 64154 "漢" 64153 "滋" 64152 "滛" 64151 "流" 64150 "殺" 64149 "歹" 64148 "杖" 64147 "望" 64146 "朗" 64145 "晴" 64144 "敖" 64143 "摒" 64142 "搜" 64141 "揄" 64140 "戴" 64139 "懲" 64138 "慠" 64137 "憎" 64136 "愈" 64135 "慎" 64134 "惘" 64133 "徭" 64132 "彩" 64131 "廙" 64130 "廒" 64129 "嬨" 64128 "婢" 64127 "奔" 64126 "奄" 64125 "墳" 64124 "塚" 64123 "嗢" 64122 "喙" 64121 "啕" 64120 "喝" 64119 "勺" 64118 "勇" 64117 "冀" 64116 "充" 64115 "侀" 64114 "全" 64113 "况" 64112 "並" 64109 "舘" 64108 "𤋮" 64107 "恵" 64106 "頻" 64105 "響" 64104 "難" 64103 "逸" 64102 "辶" 64101 "贈" 64100 "賓" 64099 "謹" 64098 "謁" 64097 "視" 64096 "褐" 64095 "著" 64094 "艹" 64093 "艹" 64092 "臭" 64091 "者" 64090 "署" 64089 "繁" 64088 "縉" 64087 "練" 64086 "節" 64085 "突" 64084 "穀" 64083 "禎" 64082 "禍" 64081 "祝" 64080 "祖" 64079 "祐" 64078 "祈" 64077 "祉" 64076 "社" 64075 "碑" 64074 "琢" 64073 "爫" 64072 "煮" 64071 "漢" 64070 "渚" 64069 "海" 64068 "梅" 64067 "暑" 64066 "既" 64065 "敏" 64064 "懲" 64063 "憎" 64062 "慨" 64061 "悔" 64060 "屮" 64059 "層" 64058 "墨" 64057 "塀" 64056 "器" 64055 "嘆" 64054 "喝" 64053 "卑" 64052 "勤" 64051 "勉" 64050 "免" 64049 "僧" 64048 "侮" 64045 "鶴" 64044 "館" 64043 "飼" 64042 "飯" 64038 "都" 64037 "逸" 64034 "諸" 64032 "蘒" 64030 "羽" 64029 "精" 64028 "靖" 64027 "福" 64026 "祥" 64025 "神" 64024 "礼" 64023 "益" 64022 "猪" 64021 "凞" 64018 "晴" 64016 "塚" 64013 "嗀" 64012 "兀" 64011 "廓" 64010 "見" 64009 "降" 64008 "行" 64007 "輻" 64006 "暴" 64005 "洞" 64004 "宅" 64003 "糖" 64002 "拓" 64001 "度" 64000 "切" 63999 "刺" 63998 "茶" 63997 "什" 63996 "識" 63995 "炙" 63994 "狀" 63993 "粒" 63992 "笠" 63991 "立" 63990 "臨" 63989 "淋" 63988 "林" 63987 "麟" 63986 "鱗" 63985 "隣" 63984 "藺" 63983 "璘" 63982 "燐" 63981 "吝" 63980 "溺" 63979 "匿" 63978 "離" 63977 "里" 63976 "裡" 63975 "裏" 63974 "罹" 63973 "痢" 63972 "理" 63971 "泥" 63970 "梨" 63969 "李" 63968 "易" 63967 "履" 63966 "吏" 63965 "利" 63964 "隆" 63963 "率" 63962 "栗" 63961 "慄" 63960 "律" 63959 "輪" 63958 "淪" 63957 "崙" 63956 "倫" 63955 "陸" 63954 "戮" 63953 "六" 63952 "類" 63951 "紐" 63950 "硫" 63949 "留" 63948 "琉" 63947 "溜" 63946 "流" 63945 "柳" 63944 "杻" 63943 "劉" 63942 "阮" 63941 "暈" 63940 "龍" 63939 "遼" 63938 "蓼" 63937 "療" 63936 "燎" 63935 "樂" 63934 "料" 63933 "尿" 63932 "寮" 63931 "僚" 63930 "了" 63929 "惡" 63928 "隷" 63927 "醴" 63926 "禮" 63925 "例" 63924 "領" 63923 "靈" 63922 "零" 63921 "鈴" 63920 "聆" 63919 "羚" 63918 "瑩" 63917 "玲" 63916 "怜" 63915 "嶺" 63914 "寧" 63913 "囹" 63912 "令" 63911 "獵" 63910 "簾" 63909 "殮" 63908 "捻" 63907 "念" 63906 "廉" 63905 "說" 63904 "裂" 63903 "烈" 63902 "咽" 63901 "劣" 63900 "列" 63899 "鍊" 63898 "連" 63897 "蓮" 63896 "輦" 63895 "聯" 63894 "練" 63893 "秊" 63892 "璉" 63891 "煉" 63890 "漣" 63889 "撚" 63888 "戀" 63887 "憐" 63886 "年" 63885 "轢" 63884 "歷" 63883 "曆" 63882 "力" 63881 "黎" 63880 "麗" 63879 "驪" 63878 "閭" 63877 "礪" 63876 "濾" 63875 "旅" 63874 "廬" 63873 "女" 63872 "呂" 63871 "勵" 63870 "量" 63869 "諒" 63868 "良" 63867 "糧" 63866 "梁" 63865 "凉" 63864 "兩" 63863 "亮" 63862 "略" 63861 "掠" 63860 "若" 63859 "拾" 63858 "沈" 63857 "辰" 63856 "殺" 63855 "說" 63854 "葉" 63853 "省" 63852 "塞" 63851 "參" 63850 "索" 63849 "數" 63848 "泌" 63847 "不" 63846 "復" 63845 "便" 63844 "磻" 63843 "北" 63842 "異" 63841 "率" 63840 "怒" 63839 "寧" 63838 "丹" 63837 "諾" 63836 "樂" 63835 "拏" 63834 "讀" 63833 "陵" 63832 "菱" 63831 "綾" 63830 "稜" 63829 "凌" 63828 "凜" 63827 "肋" 63826 "勒" 63825 "陋" 63824 "縷" 63823 "累" 63822 "漏" 63821 "淚" 63820 "樓" 63819 "屢" 63818 "壘" 63817 "雷" 63816 "賂" 63815 "磊" 63814 "牢" 63813 "聾" 63812 "籠" 63811 "弄" 63810 "壟" 63809 "論" 63808 "鹿" 63807 "錄" 63806 "菉" 63805 "綠" 63804 "祿" 63803 "碌" 63802 "鷺" 63801 "魯" 63800 "露" 63799 "路" 63798 "虜" 63797 "蘆" 63796 "老" 63795 "盧" 63794 "爐" 63793 "櫓" 63792 "擄" 63791 "勞" 63790 "冷" 63789 "來" 63788 "郎" 63787 "狼" 63786 "浪" 63785 "朗" 63784 "廊" 63783 "蠟" 63782 "臘" 63781 "拉" 63780 "襤" 63779 "藍" 63778 "濫" 63777 "嵐" 63776 "鸞" 63775 "蘭" 63774 "爛" 63773 "欄" 63772 "卵" 63771 "亂" 63770 "駱" 63769 "酪" 63768 "落" 63767 "珞" 63766 "烙" 63765 "洛" 63764 "樂" 63763 "邏" 63762 "裸" 63761 "螺" 63760 "蘿" 63759 "羅" 63758 "癩" 63757 "懶" 63756 "奈" 63755 "喇" 63754 "金" 63753 "契" 63752 "龜" 63751 "龜" 63750 "句" 63749 "串" 63748 "滑" 63747 "賈" 63746 "車" 63745 "更" 63744 "豈" 55291 "ᄑᄐ" 55290 "ᄑᄉ" 55289 "ᄌᄌ" 55288 "ᄌᄇᄇ" 55287 "ᄌᄇ" 55286 "ᅌᄒ" 55285 "ᅌᄆ" 55284 "ᅀᄇᄋ" 55283 "ᅀᄇ" 55282 "ᄅᄒ" 55281 "ᄉᄐ" 55280 "ᄉᄎ" 55279 "ᄉᄌ" 55278 "ᄉᅀ" 55277 "ᄉᄉᄃ" 55276 "ᄉᄉᄀ" 55275 "ᄉᄇᄋ" 55274 "ᄉᄆ" 55273 "ᄇᄎ" 55272 "ᄇᄌ" 55271 "ᄇᄉᄃ" 55270 "ᄇᄇ" 55269 "ᄇᄆ" 55268 "ᄇᄅᄑ" 55267 "ᄇᄃ" 55266 "ᄆᄌ" 55265 "ᄆᄇᄉ" 55264 "ᄆᄆ" 55263 "ᄆᄂᄂ" 55262 "ᄆᄂ" 55261 "ᄅᄋ" 55260 "ᄅᅙᄒ" 55259 "ᄅᅌ" 55258 "ᄅᄇᄑ" 55257 "ᄅᄇᄃ" 55256 "ᄅᄆᄒ" 55255 "ᄅᄅᄏ" 55254 "ᄅᄀᄒ" 55253 "ᄅᄀᄀ" 55252 "ᄃᄐ" 55251 "ᄃᄎ" 55250 "ᄃᄌ" 55249 "ᄃᄉᄀ" 55248 "ᄃᄉ" 55247 "ᄃᄇ" 55246 "ᄃᄃᄇ" 55245 "ᄃᄃ" 55244 "ᄂᄎ" 55243 "ᄂᄅ" 55238 "ᆞᅥᅵ" 55237 "ᆞᅡ" 55236 "ᅵᅵ" 55235 "ᅵᅲ" 55234 "ᅵᅭ" 55233 "ᅵᅩᅵ" 55232 "ᅵᅧᅵ" 55231 "ᅵᅧ" 55230 "ᅵᅣᅵ" 55229 "ᅵᅣᅩ" 55228 "ᅳᅩ" 55227 "ᅳᅥᅵ" 55226 "ᅳᅥ" 55225 "ᅳᅡ" 55224 "ᅲᅩ" 55223 "ᅲᅡᅵ" 55222 "ᅮᅵᅵ" 55221 "ᅮᅧ" 55220 "ᅭᅥ" 55219 "ᅭᅡᅵ" 55218 "ᅭᅡ" 55217 "ᅩᅩᅵ" 55216 "ᅩᅧ" 43606 "ꨣ" 43603 "ꨁ" 43462 "꧐" 43388 "ᅙᅙ" 43387 "ᄒᄉ" 43386 "ᄑᄒ" 43385 "ᄐᄐ" 43384 "ᄌᄌᄒ" 43383 "ᄋᄒ" 43382 "ᄋᄅ" 43381 "ᄉᄉᄇ" 43380 "ᄇᄒ" 43379 "ᄇᄏ" 43378 "ᄇᄉᄐ" 43377 "ᄆᄉ" 43376 "ᄆᄃ" 43375 "ᄆᄀ" 43374 "ᄅᄏ" 43373 "ᄅᄌ" 43372 "ᄅᄉ" 43371 "ᄅᄇᄋ" 43370 "ᄅᄇᄇ" 43369 "ᄅᄇ" 43368 "ᄅᄆ" 43367 "ᄅᄃᄃ" 43366 "ᄅᄃ" 43365 "ᄅᄀᄀ" 43364 "ᄅᄀ" 43363 "ᄃᄌ" 43362 "ᄃᄉ" 43361 "ᄃᄇ" 43360 "ᄃᄆ" 42892 "'" 42889 ":" 42874 "Ꝺ" 42872 "&" 42871 "tf" 42862 "9" 42859 "ȝ" 42858 "3" 42849 "vy" 42842 "2" 42831 "oo" 42830 "OO" 42813 "ay" 42812 "AY" 42811 "av" 42810 "AV" 42809 "av" 42808 "AV" 42807 "au" 42806 "AU" 42805 "ao" 42804 "AO" 42803 "aa" 42802 "AA" 42801 "s" 42793 "tȝ" 42792 "T3" 42774 "˪" 42772 "˫" 42622 "ˇ" 42564 "2" 42510 "." 42239 "=" 42238 "-." 42237 ":" 42235 "." 42234 ".." 42232 "." 42227 "0" 42226 "1" 42178 "ꎵ" 42176 "ꎫ" 42175 "ꉙ" 42174 "ꊱ" 42170 "ꎿ" 42160 "ꏂ" 42156 "ꁐ" 42152 "ꄲ" 42151 "ꑘ" 42142 "ꁊ" 42140 "ꃀ" 42132 "ꋍ" 40899 "䀹" 40658 "黑" 40515 "鹂" 38584 "隷" 37806 "鎭" 37086 "郎" 36647 "軿" 36507 "躗" 36346 "跥" 36230 "赿" 35939 "豜" 35727 "讆" 35453 "訮" 35358 "䚶" 34369 "蘷" 34111 "蒍" 33191 "朣" 33089 "胼" 33063 "朘" 33025 "朓" 33014 "㬵" 32976 "朏" 32970 "朐" 32934 "朌" 32118 "絕" 30799 "研" 28505 "溈" 27175 "榝" 27113 "㮣" 26623 "杮" 26406 "䑃" 26358 "㫚" 26217 "晚" 26211 "䀿" 25609 "㩁" 25144 "戶" 24144 "㬺" 24114 "帡" 23296 "媯" 22783 "墫" 22635 "塡" 21855 "啓" 20540 "値" 20482 "併" 20031 "/" 20022 "\\" 19968 "ー" 17440 "㬻" 17307 "㖈" 14771 "㘽" 13310 "31日" 13309 "30日" 13308 "29日" 13307 "28日" 13306 "27日" 13305 "26日" 13304 "25日" 13303 "24日" 13302 "23日" 13301 "22日" 13300 "21日" 13299 "20日" 13298 "19日" 13297 "18日" 13296 "17日" 13295 "16日" 13294 "15日" 13293 "14日" 13292 "13日" 13291 "12日" 13290 "11日" 13289 "10日" 13288 "9日" 13287 "8日" 13286 "7日" 13285 "6日" 13284 "5日" 13283 "4日" 13282 "3日" 13281 "2日" 13280 "1日" 13168 "24点" 13167 "23点" 13166 "22点" 13165 "21点" 13164 "20点" 13163 "19点" 13162 "18点" 13161 "17点" 13160 "16点" 13159 "15点" 13158 "14点" 13157 "13点" 13156 "12点" 13155 "11点" 13154 "10点" 13153 "9点" 13152 "8点" 13151 "7点" 13150 "6点" 13149 "5点" 13148 "4点" 13147 "3点" 13146 "2点" 13145 "1点" 13144 "0点" 13003 "12月" 13002 "11月" 13001 "10月" 13000 "9月" 12999 "8月" 12998 "7月" 12997 "6月" 12996 "5月" 12995 "4月" 12994 "3月" 12993 "2月" 12992 "1月" 12867 "(至)" 12866 "(自)" 12865 "(休)" 12864 "(祭)" 12863 "(協)" 12862 "(資)" 12861 "(企)" 12860 "(監)" 12859 "(学)" 12858 "(呼)" 12857 "(代)" 12856 "(労)" 12855 "(祝)" 12854 "(財)" 12853 "(特)" 12852 "(名)" 12851 "(社)" 12850 "(有)" 12849 "(株)" 12848 "(日)" 12847 "(土)" 12846 "(金)" 12845 "(木)" 12844 "(水)" 12843 "(火)" 12842 "(月)" 12841 "(十)" 12840 "(九)" 12839 "(八)" 12838 "(七)" 12837 "(六)" 12836 "(五)" 12835 "(四)" 12834 "(三)" 12833 "(二)" 12832 "(ー)" 12830 "(오후)" 12829 "(오전)" 12828 "(주)" 12827 "(하)" 12826 "(파)" 12825 "(타)" 12824 "(카)" 12823 "(차)" 12822 "(자)" 12821 "(아)" 12820 "(사)" 12819 "(바)" 12818 "(마)" 12817 "(라)" 12816 "(다)" 12815 "(나)" 12814 "(가)" 12813 "(ᄒ)" 12812 "(ᄑ)" 12811 "(ᄐ)" 12810 "(ᄏ)" 12809 "(ᄎ)" 12808 "(ᄌ)" 12807 "(ᄋ)" 12806 "(ᄉ)" 12805 "(ᄇ)" 12804 "(ᄆ)" 12803 "(ᄅ)" 12802 "(ᄃ)" 12801 "(ᄂ)" 12800 "(ᄀ)" 12768 "乙" 12767 "乚" 12762 "亅" 12758 "乛" 12756 "\\" 12755 "/" 12753 "丨" 12752 "ー" 12686 "ᆞᅵ" 12685 "ᆞ" 12684 "ᅲᅵ" 12683 "ᅲᅧᅵ" 12682 "ᅲᅧ" 12681 "ᅭᅵ" 12680 "ᅭᅣᅵ" 12679 "ᅭᅣ" 12678 "ᅙ" 12677 "ᄒᄒ" 12676 "ᄑᄋ" 12675 "ᄋᅀ" 12674 "ᄋᄉ" 12673 "ᅌ" 12672 "ᄋᄋ" 12671 "ᅀ" 12670 "ᄉᄌ" 12669 "ᄉᄇ" 12668 "ᄉᄃ" 12667 "ᄉᄂ" 12666 "ᄉᄀ" 12665 "ᄇᄇᄋ" 12664 "ᄇᄋ" 12663 "ᄇᄐ" 12662 "ᄇᄌ" 12661 "ᄇᄉᄃ" 12660 "ᄇᄉᄀ" 12659 "ᄇᄃ" 12658 "ᄇᄀ" 12657 "ᄆᄋ" 12656 "ᄆᅀ" 12655 "ᄆᄉ" 12654 "ᄆᄇ" 12653 "ᄅᅙ" 12652 "ᄅᅀ" 12651 "ᄅᄇᄉ" 12650 "ᄅᄃ" 12649 "ᄅᄀᄉ" 12648 "ᄂᅀ" 12647 "ᄂᄉ" 12646 "ᄂᄃ" 12645 "ᄂᄂ" 12644 "ᅠ" 12643 "ᅵ" 12642 "ᅳᅵ" 12641 "ー" 12640 "ᅲ" 12639 "ᅮᅵ" 12638 "ᅮᅥᅵ" 12637 "ᅮᅥ" 12636 "ᅮ" 12635 "ᅭ" 12634 "ᅩᅵ" 12633 "ᅩᅡᅵ" 12632 "ᅩᅡ" 12631 "ᅩ" 12630 "ᅧᅵ" 12629 "ᅧ" 12628 "ᅥᅵ" 12627 "ᅥ" 12626 "ᅣᅵ" 12625 "ᅣ" 12624 "ᅡᅵ" 12623 "ᅡ" 12622 "ᄒ" 12621 "ᄑ" 12620 "ᄐ" 12619 "ᄏ" 12618 "ᄎ" 12617 "ᄌᄌ" 12616 "ᄌ" 12615 "ᄋ" 12614 "ᄉᄉ" 12613 "ᄉ" 12612 "ᄇᄉ" 12611 "ᄇᄇ" 12610 "ᄇ" 12609 "ᄆ" 12608 "ᄅᄒ" 12607 "ᄅᄑ" 12606 "ᄅᄐ" 12605 "ᄅᄉ" 12604 "ᄅᄇ" 12603 "ᄅᄆ" 12602 "ᄅᄀ" 12601 "ᄅ" 12600 "ᄃᄃ" 12599 "ᄃ" 12598 "ᄂᄒ" 12597 "ᄂᄌ" 12596 "ᄂ" 12595 "ᄀᄉ" 12594 "ᄀᄀ" 12593 "ᄀ" 12539 "·" 12444 "゚" 12443 "゙" 12442 "̊" 12346 "卅" 12345 "卄" 12344 "十" 12342 "〒" 12339 "/" 12333 "̥" 12332 "̉" 12315 "⟧" 12309 ")" 12308 "(" 12297 "❭" 12296 "❬" 12295 "0" 12291 "''" 12290 "˳" 12245 "龠" 12244 "龜" 12243 "龍" 12242 "齒" 12241 "齊" 12240 "鼻" 12239 "鼠" 12238 "鼓" 12237 "鼎" 12236 "黽" 12235 "黹" 12234 "黑" 12233 "黍" 12232 "黃" 12231 "麻" 12230 "麥" 12229 "鹿" 12228 "鹵" 12227 "鳥" 12226 "魚" 12225 "鬼" 12224 "鬲" 12223 "鬯" 12222 "鬥" 12221 "髟" 12220 "高" 12219 "骨" 12218 "馬" 12217 "香" 12216 "首" 12215 "食" 12214 "飛" 12213 "風" 12212 "頁" 12211 "音" 12210 "韭" 12209 "韋" 12208 "革" 12207 "面" 12206 "非" 12205 "靑" 12204 "雨" 12203 "隹" 12202 "隶" 12201 "阜" 12200 "門" 12199 "長" 12198 "金" 12197 "里" 12196 "釆" 12195 "酉" 12194 "邑" 12193 "辵" 12192 "辰" 12191 "辛" 12190 "車" 12189 "身" 12188 "足" 12187 "走" 12186 "赤" 12185 "貝" 12184 "豸" 12183 "豕" 12182 "豆" 12181 "谷" 12180 "言" 12179 "角" 12178 "見" 12177 "襾" 12176 "衣" 12175 "行" 12174 "血" 12173 "虫" 12172 "虍" 12171 "艸" 12170 "色" 12169 "艮" 12168 "舟" 12167 "舛" 12166 "舌" 12165 "臼" 12164 "至" 12163 "自" 12162 "臣" 12161 "肉" 12160 "聿" 12159 "耳" 12158 "耒" 12157 "而" 12156 "老" 12155 "羽" 12154 "羊" 12153 "网" 12152 "缶" 12151 "糸" 12150 "米" 12149 "竹" 12148 "立" 12147 "穴" 12146 "禾" 12145 "禸" 12144 "示" 12143 "石" 12142 "矢" 12141 "矛" 12140 "目" 12139 "皿" 12138 "皮" 12137 "白" 12136 "癶" 12135 "疒" 12134 "疋" 12133 "田" 12132 "用" 12131 "生" 12130 "甘" 12129 "瓦" 12128 "瓜" 12127 "玉" 12126 "玄" 12125 "犬" 12124 "牛" 12123 "牙" 12122 "片" 12121 "爿" 12120 "爻" 12119 "父" 12118 "爪" 12117 "火" 12116 "水" 12115 "气" 12114 "氏" 12113 "毛" 12112 "比" 12111 "毋" 12110 "殳" 12109 "歹" 12108 "止" 12107 "欠" 12106 "木" 12105 "月" 12104 "曰" 12103 "日" 12102 "无" 12101 "方" 12100 "斤" 12099 "斗" 12098 "文" 12097 "攴" 12096 "支" 12095 "手" 12094 "戶" 12093 "戈" 12092 "心" 12091 "彳" 12090 "彡" 12089 "彐" 12088 "弓" 12087 "弋" 12086 "廾" 12085 "廴" 12084 "广" 12083 "幺" 12082 "干" 12081 "巾" 12080 "己" 12079 "工" 12078 "巛" 12077 "山" 12076 "屮" 12075 "尸" 12074 "尢" 12073 "小" 12072 "寸" 12071 "宀" 12070 "子" 12069 "女" 12068 "大" 12067 "夕" 12066 "夊" 12065 "夂" 12064 "士" 12063 "土" 12062 "囗" 12061 "口" 12060 "又" 12059 "厶" 12058 "厂" 12057 "卩" 12056 "卜" 12055 "十" 12054 "匸" 12053 "匚" 12052 "匕" 12051 "勹" 12050 "力" 12049 "刀" 12048 "凵" 12047 "几" 12046 "冫" 12045 "冖" 12044 "冂" 12043 "八" 12042 "入" 12041 "儿" 12040 "人" 12039 "亠" 12038 "二" 12037 "亅" 12036 "乙" 12035 "/" 12034 "\\" 12033 "丨" 12032 "ー" 12019 "龟" 12018 "亀" 12016 "龙" 12015 "竜" 12014 "齿" 12013 "歯" 12012 "齐" 12011 "斉" 12009 "黄" 12008 "麦" 12005 "鱼" 12004 "鬼" 12002 "马" 12000 "饣" 11999 "飠" 11997 "食" 11996 "飞" 11995 "风" 11994 "页" 11993 "韦" 11992 "青" 11990 "阝" 11988 "门" 11987 "长" 11986 "镸" 11985 "長" 11984 "钅" 11983 "阝" 11981 "辶" 11980 "辶" 11979 "车" 11977 "贝" 11976 "讠" 11973 "见" 11972 "西" 11971 "覀" 11970 "衤" 11969 "虎" 11968 "艹" 11967 "艹" 11966 "艹" 11962 "肀" 11961 "耂" 11954 "罒" 11953 "罓" 11951 "糹" 11949 "礻" 11947 "罒" 11944 "犭" 11942 "丬" 11940 "爫" 11939 "灬" 11938 "氺" 11937 "氵" 11936 "民" 11935 "母" 11934 "歺" 11931 "旡" 11929 "攵" 11928 "扌" 11927 "㣺" 11926 "忄" 11924 "彑" 11923 "幺" 11922 "巳" 11920 "尢" 11919 "尣" 11918 "兀" 11915 "㔾" 11913 "刂" 11909 "亻" 11907 "乚" 11824 "˳" 11604 "0" 11599 "1" 11513 "\\\\" 11497 "☧" 11484 "Ϭ" 11474 "6" 11468 "3" 11466 "9" 11462 "/" 11450 "-" 11423 "٥" 11422 "0" 11410 "1" 11369 "K̩" 11367 "H̩" 11005 "//" 11003 "///" 10870 "===" 10869 "==" 10868 "::=" 10815 "∐" 10814 "⨟" 10813 "⌙" 10800 "ẋ" 10799 "x" 10785 "↾" 10784 "≫" 10781 "⋈" 10764 "ʃʃʃʃ" 10758 "⊔" 10757 "⊓" 10756 "⊎" 10755 "⊍" 10754 "⊗" 10753 "⊕" 10752 "⊙" 10745 "\\" 10744 "/" 10742 "/̄" 10741 "\\" 10713 "⦚" 10692 "〼" 10686 "◎" 10540 "x" 10539 "x" 10217 "❭" 10216 "❬" 10201 "T" 10178 "ꓕ" 10101 "}" 10100 "{" 10099 ")" 10098 "(" 10095 ">" 10094 "<" 10089 ")" 10088 "(" 9900 "॰" 9826 "⋄" 9793 "⊕" 9784 "⎈" 9776 "Ⲷ" 9744 "□" 9737 "⊙" 9702 "°" 9696 "⌒" 9675 "°" 9674 "⋄" 9671 "⋄" 9658 "▶" 9656 "▶" 9655 "⊲" 9649 "⏥" 9632 "∎" 9629 "▘" 9623 "▖" 9620 "ˉ" 9616 "▌" 9608 "∎" 9587 "x" 9585 "/" 9507 "├" 9487 "┌" 9475 "│" 9473 "ー" 9472 "ー" 9435 "Ⓘ" 9413 "℗" 9397 "(z)" 9396 "(y)" 9395 "(x)" 9394 "(vv)" 9393 "(v)" 9392 "(u)" 9391 "(t)" 9390 "(s)" 9389 "(r)" 9388 "(q)" 9387 "(p)" 9386 "(o)" 9385 "(n)" 9384 "(rn)" 9383 "(I)" 9382 "(k)" 9381 "(j)" 9380 "(i)" 9379 "(h)" 9378 "(g)" 9377 "(f)" 9376 "(e)" 9375 "(d)" 9374 "(c)" 9373 "(b)" 9372 "(a)" 9371 "2O." 9370 "l9." 9369 "l8." 9368 "l7." 9367 "l6." 9366 "l5." 9365 "l4." 9364 "l3." 9363 "l2." 9362 "ll." 9361 "lO." 9360 "9." 9359 "8." 9358 "7." 9357 "6." 9356 "5." 9355 "4." 9354 "3." 9353 "2." 9352 "l." 9351 "(2O)" 9350 "(l9)" 9349 "(l8)" 9348 "(l7)" 9347 "(l6)" 9346 "(l5)" 9345 "(l4)" 9344 "(l3)" 9343 "(l2)" 9342 "(ll)" 9341 "(lO)" 9340 "(9)" 9339 "(8)" 9338 "(7)" 9337 "(6)" 9336 "(5)" 9335 "(4)" 9334 "(3)" 9333 "(2)" 9332 "(I)" 9321 "➉" 9320 "➈" 9319 "➇" 9318 "➆" 9317 "➅" 9316 "➄" 9315 "➃" 9314 "➂" 9313 "➁" 9312 "➀" 9290 "\\\\" 9134 "丨" 9130 "丨" 9125 "丨" 9122 "丨" 9119 "丨" 9116 "丨" 9082 "a" 9077 "ω" 9076 "p" 9075 "i" 9068 "O̵" 9002 "❭" 9001 "❬" 8997 "⌤" 8967 "︴" 8960 "∅" 8959 "E" 8948 "ɛ" 8943 "···" 8942 "⁝" 8901 "·" 8899 "∪" 8898 "ꓵ" 8897 "v" 8896 "∧" 8869 "ꓕ" 8861 "O̵" 8854 "O̵" 8803 "≡" 8764 "~" 8758 ":" 8752 "∮∮∮" 8751 "∮∮" 8749 "ʃʃʃ" 8748 "ʃʃ" 8747 "ʃ" 8745 "ꓵ" 8744 "v" 8741 "ll" 8739 "l" 8729 "·" 8728 "°" 8727 "*" 8726 "\\" 8725 "/" 8722 "-" 8721 "Ʃ" 8719 "Π" 8710 "ᐃ" 8707 "Ǝ" 8704 "ꓯ" 8629 "↲" 8580 "ɔ" 8579 "Ɔ" 8575 "rn" 8574 "d" 8573 "c" 8572 "l" 8571 "xii" 8570 "xi" 8569 "x" 8568 "ix" 8567 "viii" 8566 "vii" 8565 "vi" 8564 "v" 8563 "iv" 8562 "iii" 8561 "ii" 8560 "i" 8559 "M" 8558 "D" 8557 "C" 8556 "L" 8555 "XII" 8554 "XI" 8553 "X" 8552 "IX" 8551 "VIII" 8550 "VII" 8549 "VI" 8548 "V" 8547 "IV" 8546 "lll" 8545 "ll" 8544 "l" 8521 "j" 8520 "i" 8519 "e" 8518 "d" 8517 "D" 8514 "ꓶ" 8513 "ꓨ" 8512 "Ʃ" 8511 "Π" 8510 "ᒥ" 8509 "y" 8508 "n" 8507 "FAX" 8505 "i" 8504 "ד" 8503 "ג" 8502 "ב" 8501 "א" 8500 "o" 8499 "M" 8497 "F" 8496 "E" 8495 "e" 8494 "e" 8493 "C" 8492 "B" 8490 "K" 8489 "ɿ" 8488 "Z" 8487 "Ʊ" 8486 "Ω" 8484 "Z" 8481 "TEL" 8477 "R" 8476 "R" 8475 "R" 8474 "Q" 8473 "P" 8470 "No" 8469 "N" 8467 "l" 8466 "L" 8465 "l" 8464 "l" 8463 "h̵" 8462 "h" 8461 "H" 8460 "H" 8459 "H" 8458 "g" 8457 "°F" 8456 "Э" 8455 "Ɛ" 8454 "º/₀₀" 8453 "º/₀₀" 8451 "°C" 8450 "C" 8449 "º/₀₀" 8448 "º/₀₀" 8364 "Ɛ" 8363 "ḏ̵" 8361 "W̵" 8360 "Rs" 8356 "£" 8304 "º" 8287 " " 8282 ":" 8279 "''''" 8275 "~" 8274 "º/₀₀" 8270 "*" 8265 "!?" 8264 "?!" 8263 "??" 8260 "/" 8259 "-" 8257 "/" 8254 "ˉ" 8252 "!!" 8250 ">" 8249 "<" 8247 "'''" 8246 "''" 8245 "'" 8244 "'''" 8243 "''" 8242 "'" 8241 "º/₀₀₀" 8240 "º/₀₀" 8239 " " 8233 " " 8232 " " 8231 "·" 8230 "..." 8229 ".." 8228 "." 8226 "·" 8223 "''" 8221 "''" 8220 "''" 8219 "'" 8218 "," 8217 "'" 8216 "'" 8214 "ll" 8213 "ー" 8212 "ー" 8211 "-" 8210 "-" 8209 "-" 8208 "-" 8202 " " 8201 " " 8200 " " 8199 " " 8198 " " 8197 " " 8196 " " 8195 " " 8194 " " 8193 " " 8192 " " 8190 "'" 8189 "'" 8175 "'" 8128 "~" 8127 "'" 8126 "ι" 8125 "'" 8061 "ῴ" 7935 "y" 7837 "f" 7834 "ả" 7586 "ᵍ" 7583 "ᵋ" 7564 "y" 7555 "g" 7506 "º" 7467 "л" 7464 "π" 7460 "ƨ" 7458 "z" 7457 "vv" 7456 "v" 7452 "u" 7451 "t" 7444 "ǝo" 7441 "o" 7440 "ɔ" 7439 "o" 7435 "k" 7432 "ɜ" 7428 "c" 7004 "᭐" 7000 "ᬨ" 6995 "ᬑ" 6994 "ᬍ" 6800 "ᩅ" 6784 "ᩅ" 6609 "ᦱ" 6608 "ᦞ" 6294 "ᡜ" 6229 "ᠵ" 6158 " " 6153 ":" 6147 ":" 6099 "̊" 6086 "̊" 6051 "អ" 5941 "/" 5760 " " 5750 "ᖖᒑ" 5749 "ᖖᒐ" 5748 "ᖖᒎ" 5747 "ᖖᒍ" 5746 "ᖖᒌ" 5745 "ᖖᒋ" 5744 "ᖕᒉ" 5743 "ᕐᑫ" 5742 "ᕁ" 5741 "𝐗" 5685 "ᘯ" 5684 "ᘮ" 5668 "ᕊ" 5667 "ᕆ" 5666 "ᕃ" 5639 "ᓚ" 5636 "ᓓ" 5635 "ᒉ" 5634 "ᒐ" 5610 "ᗞ" 5524 "ᖕᒑ" 5523 "ᖕᒐ" 5522 "ᖕᒎ" 5521 "ᖕᒍ" 5520 "ᖕᒌ" 5519 "ᖕᒋ" 5518 "ᖕᒊ" 5509 "ᕐᒃ" 5508 "ᕐᑳ" 5507 "ᕐᑲ" 5506 "ᕐᑰ" 5505 "ᕐᑯ" 5504 "ᕐᑮ" 5503 "ᕐᑭ" 5502 "ᕐᑬ" 5501 "ᕁ" 5481 "ᕧ·" 5480 "·ᕧ" 5468 "ᕚ·" 5467 "·ᕚ" 5455 "ᕌ·" 5454 "·ᕌ" 5440 "ᐩ" 5436 "ᔮ·" 5435 "·ᔮ" 5434 "ᔭ·" 5433 "·ᔭ" 5432 "ᔫ·" 5431 "·ᔫ" 5430 "ᔪ·" 5429 "·ᔪ" 5428 "ᔩ·" 5427 "·ᔩ" 5426 "ᔨ·" 5425 "·ᔨ" 5424 "4·" 5423 "·4" 5412 "ᔖ·" 5411 "·ᔖ" 5410 "ᔕ·" 5409 "·ᔕ" 5408 "ᔔ·" 5407 "·ᔔ" 5406 "ᔓ·" 5405 "·ᔓ" 5404 "ᔒ·" 5403 "·ᔒ" 5402 "ᔑ·" 5401 "·ᔑ" 5400 "ᔐ·" 5399 "·ᔐ" 5391 "ᔋᒐ" 5390 "ᔋᑲ" 5389 "ᔋᑕ" 5388 "ᔋᐸ" 5379 "ᓵ·" 5378 "·ᓵ" 5377 "ᓴ·" 5376 "·ᓴ" 5375 "ᓲ·" 5374 "·ᓲ" 5373 "ᓱ·" 5372 "·ᓱ" 5371 "ᓰ·" 5370 "·ᓰ" 5369 "ᓯ·" 5368 "·ᓯ" 5367 "ᓭ·" 5366 "·ᓭ" 5353 "ᓛ·" 5352 "·ᓛ" 5351 "ᓚ·" 5350 "·ᓚ" 5349 "ᓘ·" 5348 "·ᓘ" 5347 "ᓗ·" 5346 "·ᓗ" 5345 "ᓖ·" 5344 "·ᓖ" 5343 "ᓕ·" 5342 "·ᓕ" 5341 "ᓓ·" 5340 "·ᓓ" 5329 "ᐡ" 5326 "ᓈᒫ" 5325 "·ᓈ" 5324 "ᓇ·" 5323 "·ᓇ" 5322 "ᓀ·" 5321 "·ᓀ" 5311 "2" 5305 "ᒫ·" 5304 "·ᒫ" 5303 "1ᐧ" 5302 "·ᒪ" 5301 "ᒨ·" 5300 "·ᒨ" 5299 "ᒧ·" 5298 "·ᒧ" 5297 "ᒦ·" 5296 "·ᒦ" 5295 "ᒥ·" 5294 "·ᒥ" 5293 "ᒣ·" 5292 "·ᒣ" 5279 "ᒑ·" 5278 "·ᒑ" 5277 "ᒐ·" 5276 "·ᒐ" 5275 "ᒎ·" 5274 "·ᒎ" 5273 "ᒍᐧ" 5272 "ᐧᒍ" 5271 "ᒌ·" 5270 "·ᒌ" 5269 "ᒋ·" 5268 "·ᒋ" 5267 "ᒉ·" 5266 "·ᒉ" 5256 "ᑲᑊ" 5255 "ᑯᑊ" 5254 "ᑭᑊ" 5253 "ᑫᑊ" 5249 "ᑳ·" 5248 "·ᑳ" 5247 "ᑲ·" 5246 "·ᑲ" 5245 "ᑰ·" 5244 "·ᑰ" 5243 "ᑯᐧ" 5242 "ᐧᑯ" 5241 "ᑮ·" 5240 "·ᑮ" 5239 "ᑭᐧ" 5238 "ᐧᑭ" 5237 "ᑫ·" 5236 "·ᑫ" 5226 "ᑕᑊ" 5225 "ᑐᑊ" 5224 "ᑎᑊ" 5223 "ᑌᑊ" 5220 "ᑖ·" 5219 "·ᑖ" 5218 "ᑕ·" 5217 "·ᑕ" 5216 "ᑑ·" 5215 "·ᑑ" 5214 "ᑐ·" 5213 "·ᑐ" 5212 "ᑏ·" 5211 "·ᑏ" 5210 "ᑎ·" 5209 "·ᑎ" 5208 "ᑌ·" 5207 "·ᑌ" 5204 "·ᑐ" 5191 "ᐹ·" 5190 "·ᐹ" 5189 "ᐸ·" 5188 "·ᐸ" 5187 "ᐴ·" 5186 "·ᐴ" 5185 "ᐳ·" 5184 "·ᐳ" 5175 "·ᐳ" 5159 "·" 5146 "ᐋ·" 5145 "·ᐋ" 5144 "ᐊ·" 5143 "·ᐊ" 5141 "ᐆ·" 5140 "·ᐆ" 5139 "ᐅ·" 5138 "·ᐅ" 5137 "ᐄ·" 5136 "·ᐄ" 5135 "ᐃ·" 5134 "·ᐃ" 5133 "ᐁ·" 5132 "·ᐁ" 5107 "Ꮐ" 5095 "Ꭻ" 5082 "Ꮥ" 5076 "Ꮃ" 5074 "Ꭱ" 5070 "4" 5053 "Ꭹ" 4607 "ᄂᄂ" 4606 "ᄀᄒ" 4605 "ᄀᄏ" 4604 "ᄀᄎ" 4603 "ᄀᄇ" 4602 "ᄀᄂ" 4601 "ᅙ" 4600 "ᄒᄇ" 4599 "ᄒᄆ" 4598 "ᄒᄅ" 4597 "ᄒᄂ" 4596 "ᄑᄋ" 4595 "ᄑᄇ" 4594 "ᄋᅀ" 4593 "ᄋᄉ" 4592 "ᅌ" 4591 "ᄋᄏ" 4590 "ᄋᄋ" 4589 "ᄋᄀᄀ" 4588 "ᄋᄀ" 4587 "ᅀ" 4586 "ᄉᄇ" 4585 "ᄉᄅ" 4584 "ᄉᄃ" 4583 "ᄉᄀ" 4582 "ᄇᄋ" 4581 "ᄇᄒ" 4580 "ᄇᄑ" 4579 "ᄇᄅ" 4578 "ᄆᄋ" 4577 "ᄆᄒ" 4576 "ᄆᄎ" 4575 "ᄆᅀ" 4574 "ᄆᄉᄉ" 4573 "ᄆᄉ" 4572 "ᄆᄇ" 4571 "ᄆᄅ" 4570 "ᄆᄀ" 4569 "ᄅᅙ" 4568 "ᄅᄏ" 4567 "ᄅᅀ" 4566 "ᄅᄉᄉ" 4565 "ᄅᄇᄋ" 4564 "ᄅᄇᄒ" 4563 "ᄅᄇᄉ" 4562 "ᄅᄆᄉ" 4561 "ᄅᄆᄀ" 4560 "ᄅᄅ" 4559 "ᄅᄃᄒ" 4558 "ᄅᄃ" 4557 "ᄅᄂ" 4556 "ᄅᄀᄉ" 4555 "ᄃᄅ" 4554 "ᄃᄀ" 4553 "ᄂᄐ" 4552 "ᄂᅀ" 4551 "ᄂᄉ" 4550 "ᄂᄃ" 4549 "ᄂᄀ" 4548 "ᄀᄉᄀ" 4547 "ᄀᄅ" 4546 "ᄒ" 4545 "ᄑ" 4544 "ᄐ" 4543 "ᄏ" 4542 "ᄎ" 4541 "ᄌ" 4540 "ᄋ" 4539 "ᄉᄉ" 4538 "ᄉ" 4537 "ᄇᄉ" 4536 "ᄇ" 4535 "ᄆ" 4534 "ᄅᄒ" 4533 "ᄅᄑ" 4532 "ᄅᄐ" 4531 "ᄅᄉ" 4530 "ᄅᄇ" 4529 "ᄅᄆ" 4528 "ᄅᄀ" 4527 "ᄅ" 4526 "ᄃ" 4525 "ᄂᄒ" 4524 "ᄂᄌ" 4523 "ᄂ" 4522 "ᄀᄉ" 4521 "ᄀᄀ" 4520 "ᄀ" 4519 "ᅩᅣᅵ" 4518 "ᅩᅣ" 4517 "ᅧᅣ" 4516 "ᅣᅮ" 4515 "ᅡᅳ" 4514 "ᆞᆞ" 4513 "ᆞᅵ" 4512 "ᆞᅮ" 4511 "ᆞᅥ" 4509 "ᅵᆞ" 4508 "ᅵᅳ" 4507 "ᅵᅮ" 4506 "ᅵᅩ" 4505 "ᅵᅣ" 4504 "ᅵᅡ" 4503 "ᅳᅵᅮ" 4502 "ーー" 4501 "ᅳᅮ" 4500 "ᅲᅵ" 4499 "ᅲᅮ" 4498 "ᅲᅧᅵ" 4497 "ᅲᅧ" 4496 "ᅲᅥᅵ" 4495 "ᅲᅥ" 4494 "ᅲᅡ" 4493 "ᅮᅮ" 4492 "ᅮᅧᅵ" 4491 "ᅮᅥᅳ" 4490 "ᅮᅡᅵ" 4489 "ᅮᅡ" 4488 "ᅭᅵ" 4487 "ᅭᅩ" 4486 "ᅭᅣ" 4485 "ᅭᅣᅵ" 4484 "ᅭᅣ" 4483 "ᅩᅮ" 4482 "ᅩᅩ" 4481 "ᅩᅧᅵ" 4480 "ᅩᅥᅵ" 4479 "ᅩᅥ" 4478 "ᅧᅮ" 4477 "ᅧᅩ" 4476 "ᅥᅳ" 4475 "ᅥᅮ" 4474 "ᅥᅩ" 4473 "ᅣᅭ" 4472 "ᅣᅩ" 4471 "ᅡᅮ" 4470 "ᅡᅩ" 4468 "ᅳᅵ" 4467 "ー" 4465 "ᅮᅵ" 4464 "ᅮᅥᅵ" 4463 "ᅮᅥ" 4460 "ᅩᅵ" 4459 "ᅩᅡᅵ" 4458 "ᅩᅡ" 4456 "ᅧᅵ" 4454 "ᅥᅵ" 4452 "ᅣᅵ" 4450 "ᅡᅵ" 4446 "ᄃᄅ" 4445 "ᄂᄒ" 4444 "ᄂᄌ" 4443 "ᄂᄉ" 4442 "ᄀᄃ" 4440 "ᄒᄒ" 4439 "ᄑᄋ" 4438 "ᄑᄇ" 4435 "ᄎᄒ" 4434 "ᄎᄏ" 4433 "ᅐᅐ" 4431 "ᅎᅎ" 4429 "ᄌᄋ" 4427 "ᄋᄑ" 4426 "ᄋᄐ" 4425 "ᄋᄎ" 4424 "ᄋᄌ" 4423 "ᄋᄋ" 4422 "ᄋᅀ" 4421 "ᄋᄉ" 4420 "ᄋᄇ" 4419 "ᄋᄆ" 4418 "ᄋᄃ" 4417 "ᄋᄀ" 4415 "ᄾᄾ" 4413 "ᄼᄼ" 4411 "ᄅᄒ" 4410 "ᄉᄑ" 4409 "ᄉᄐ" 4408 "ᄉᄏ" 4407 "ᄉᄎ" 4406 "ᄉᄌ" 4405 "ᄉᄋ" 4404 "ᄉᄉᄉ" 4403 "ᄉᄇᄀ" 4402 "ᄉᄇ" 4401 "ᄉᄆ" 4400 "ᄉᄅ" 4399 "ᄉᄃ" 4398 "ᄉᄂ" 4397 "ᄉᄀ" 4396 "ᄇᄇᄋ" 4395 "ᄇᄋ" 4394 "ᄇᄑ" 4393 "ᄇᄐ" 4392 "ᄇᄎ" 4391 "ᄇᄌ" 4390 "ᄇᄉᄌ" 4389 "ᄇᄉᄉ" 4388 "ᄇᄉᄇ" 4387 "ᄇᄉᄃ" 4386 "ᄇᄉᄀ" 4385 "ᄇᄉ" 4384 "ᄇᄃ" 4383 "ᄇᄂ" 4382 "ᄇᄀ" 4381 "ᄆᄋ" 4380 "ᄆᄇ" 4379 "ᄅᄋ" 4378 "ᄅᄒ" 4377 "ᄅᄅ" 4376 "ᄅᄂ" 4375 "ᄃᄀ" 4374 "ᄂᄇ" 4373 "ᄂᄃ" 4372 "ᄂᄂ" 4371 "ᄂᄀ" 4365 "ᄌᄌ" 4362 "ᄉᄉ" 4360 "ᄇᄇ" 4356 "ᄃᄃ" 4353 "ᄀᄀ" 4197 "၁" 4160 "٥" 4150 "̊" 4125 "٥" 3961 "ླཱྀ" 3959 "ྲཱྀ" 3946 "ར" 3852 "་" 3805 "ຫມ" 3804 "ຫນ" 3792 "٥" 3789 "̊" 3763 "̊າ" 3664 "٥" 3661 "̊" 3653 "า" 3649 "เเ" 3635 "̊า" 3622 "ภ" 3617 "ฆ" 3607 "ฑ" 3605 "ค" 3604 "ค" 3599 "ฎ" 3595 "ช" 3587 "ข" 3458 "٥" 3439 "ന്" 3438 "വ്" 3435 "ദ്ര" 3434 "ര്" 3430 "٥" 3425 "ഞ" 3400 "െെ" 3395 "ു" 3394 "ു" 3392 "ി" 3377 "ര" 3360 "0" 3353 "നു" 3348 "ഒൗ" 3347 "ഒാ" 3344 "എെ" 3340 "നു" 3338 "ഉൗ" 3336 "ഇൗ" 3330 "٥" 3302 "٥" 3297 "ಌಾ" 3220 "ಒೌ" 3202 "٥" 3174 "٥" 3169 "ఌా" 3168 "ఋా" 3140 "ృా" 3138 "ుా" 3129 "వా" 3127 "వ̣" 3118 "వు" 3117 "బ̣" 3106 "డ̣" 3092 "ఒౌ" 3091 "ఒౕ" 3074 "٥" 3066 "நீ" 3064 "ஷ" 3063 "எவ" 3061 "௳" 3060 "மீ" 3058 "சூ" 3056 "ய" 3054 "அ" 3053 "எ" 3052 "சு" 3051 "ஈு" 3050 "ச" 3048 "உ" 3047 "க" 3046 "٥" 3031 "ள" 3021 "̇" 3020 "ெள" 3019 "ேஈ" 3018 "ெஈ" 3016 "ன" 3006 "ஈ" 2992 "ஈ" 2972 "ஐ" 2954 "உள" 2946 "̊" 2920 "9" 2918 "0" 2876 "̣" 2848 "0" 2822 "ଅା" 2819 "8" 2817 "̆̇" 2790 "٥" 2748 "̣" 2708 "અાૈ" 2707 "અાે" 2705 "અાૅ" 2704 "અૈ" 2703 "અે" 2701 "અૅ" 2694 "અા" 2691 ":" 2690 "̇" 2689 "̆̇" 2666 "8" 2663 "9" 2662 "٥" 2620 "̣" 2580 "ਅੌ" 2576 "ਅੈ" 2575 "ੲੇ" 2570 "ੳੂ" 2569 "ੳੁ" 2568 "ੲੀ" 2567 "ੲਿ" 2566 "ਅਾ" 2562 "̇" 2541 "9" 2538 "8" 2534 "0" 2529 "ঋৃ" 2528 "ঋৃ" 2492 "̣" 2438 "অা" 2433 "̆̇" 2429 "?" 2406 "٥" 2388 "́" 2387 "̀" 2386 "̱" 2364 "̣" 2324 "अाै" 2323 "अाे" 2322 "अाॆ" 2321 "अॉ" 2320 "एे" 2318 "एॆ" 2317 "एॅ" 2312 "र्इ" 2310 "अा" 2308 "अॆ" 2307 ":" 2306 "̇" 2305 "̆̇" 2042 "_" 2037 "'" 2036 "'" 2035 "̈" 2030 "̂" 2029 "̇" 2027 "̄" 1994 "1" 1984 "0" 1955 "ޢ" 1953 "ޠ" 1951 "ޞ" 1946 "ޙ" 1863 "́" 1858 "ܼ" 1857 "̇" 1856 "̇" 1796 ":" 1795 ":" 1794 "." 1793 "." 1785 "٩" 1784 "٨" 1783 "٧" 1779 "٣" 1778 "٢" 1777 "١" 1776 "." 1772 "۟" 1749 "ه" 1748 "." 1744 "ٺ" 1740 "ى" 1731 "ة" 1730 "ۀ" 1729 "ه" 1726 "ه" 1723 "ٹ" 1705 "ك" 1684 "ز" 1668 "ڂ" 1664 "ٿ" 1659 "ٺ" 1656 "ىٴ" 1655 "ۇٴ" 1654 "وٴ" 1653 "اٴ" 1645 "*" 1644 "،" 1643 "," 1642 "⁰/₀₀" 1637 "o" 1632 "." 1615 "̓" 1610 "ى" 1606 "ب" 1582 "ج" 1574 "ىٴ" 1572 "وٴ" 1571 "اٴ" 1562 "ِ" 1561 "̓" 1560 "َ" 1546 "⁰/₀₀" 1545 "⁰/₀₀" 1524 "''" 1523 "'" 1522 "''" 1521 "וי" 1520 "||" 1503 "1" 1497 "'" 1493 "1" 1477 "̣" 1476 "̇" 1475 ":" 1474 "̇" 1473 "̇" 1466 "̇" 1465 "̇" 1460 "̣" 1455 "̊" 1454 "֘" 1453 "֖" 1448 "֙" 1444 "֚" 1437 "́" 1436 "́" 1417 ":" 1415 "եւ" 1404 "ո" 1382 "գ" 1373 "'" 1370 "'" 1365 "0" 1349 "3" 1297 "є" 1296 "Є" 1257 "о̵" 1256 "О̵" 1248 "3" 1237 "ае" 1231 "і" 1230 "м̡" 1229 "М̡" 1228 "ҷ" 1227 "Ҷ" 1226 "н̡" 1225 "Н̡" 1224 "н̡" 1223 "Н̡" 1222 "л̦" 1221 "Л̦" 1216 "1" 1215 "ҽ̨" 1214 "Ҽ̨" 1202 "Х̩" 1201 "ү̵" 1200 "Ү̵" 1199 "у" 1197 "т̩" 1196 "Т̩" 1195 "с̡" 1194 "С̡" 1187 "н̩" 1186 "Н̩" 1183 "к̵" 1182 "К̵" 1179 "к̩" 1178 "К̩" 1177 "з̡" 1176 "3̦" 1175 "ж̩" 1174 "Ж̩" 1171 "г̵" 1170 "Г̵" 1169 "гˈ" 1168 "Гˈ" 1165 "Ь̵" 1164 "Ь̵" 1163 "й̦" 1162 "Ѝ̦" 1149 "ѡ҃" 1148 "Ѡ҃" 1139 "о̵" 1138 "О̵" 1123 "Ь̵" 1122 "Ь̵" 1121 "ԝ" 1117 "й" 1115 "һ̵" 1073 "6" 1067 "ЬІ" 1054 "0" 1049 "Ѝ" 1047 "3" 1030 "1" 1018 "Μ" 1013 "ε" 1012 "θ" 1009 "ρ" 1008 "κ" 1000 "2" 982 "π" 981 "φ" 978 "Υ" 977 "θ" 976 "β" 963 "ο" 927 "0" 921 "1" 920 "θ" 903 "·" 900 "'" 894 ";" 890 "ι" 885 "ˏ" 884 "'" 878 "̆" 870 "̊" 856 "̇" 839 "̳" 837 "̨" 835 "̓" 834 "̃" 833 "́" 832 "̀" 825 "̦" 823 "̸" 822 "̵" 807 "̦" 802 "̨" 801 "̦" 800 "̱" 789 "̓" 785 "̂" 784 "̆̇" 780 "̆" 773 "̄" 763 "˪" 760 ":" 758 "''" 756 "'" 750 "''" 733 "''" 732 "~" 731 "i" 730 "°" 729 "ॱ" 728 "ˇ" 727 "-" 723 "ՙ" 720 ":" 715 "'" 714 "'" 712 "ᑊ" 710 "^" 708 "^" 707 ">" 706 "<" 705 "ˤ" 703 "ՙ" 702 "'" 701 "'" 700 "'" 699 "'" 698 "''" 697 "'" 681 "fŋ" 680 "tɕ" 679 "tʃ" 678 "ts" 677 "dʑ" 676 "dȝ" 675 "dz" 672 "q̔" 660 "?" 658 "ȝ" 656 "z̨" 655 "y" 653 "rn" 651 "u" 642 "s̨" 637 "r̨" 636 "r̩" 630 "oᴇ" 629 "o̵" 627 "n̨" 626 "ņ" 625 "rn̦" 623 "vv" 621 "l̨" 619 "l̴" 618 "i" 617 "i" 616 "i̵" 614 "h̔" 609 "g" 608 "g̔" 602 "ǝ˞" 601 "ǝ" 599 "d̔" 598 "d̨" 595 "b̔" 593 "a" 577 "?" 567 "j" 551 "å" 550 "Å" 549 "z̦" 548 "Z̦" 547 "8" 546 "8" 540 "3" 539 "ţ" 538 "Ţ" 510 "Ó̸" 501 "ģ" 499 "dz" 498 "Dz" 497 "DZ" 487 "ğ" 486 "Ğ" 485 "g̵" 484 "G̵" 468 "ŭ" 467 "Ŭ" 466 "ŏ" 465 "Ŏ" 464 "ĭ" 463 "Ĭ" 462 "ă" 461 "Ă" 460 "nj" 459 "Nj" 458 "NJ" 457 "lj" 456 "Lj" 455 "LJ" 454 "dž" 453 "Dž" 452 "DŽ" 451 "!" 449 "ll" 448 "l" 447 "þ" 445 "s" 444 "5" 439 "3" 438 "z̵" 437 "Z̵" 436 "y̔" 435 "'Y" 430 "T̨" 429 "t̔" 428 "'T" 427 "ţ" 423 "2" 422 "R" 421 "p̔" 420 "'P" 417 "o'" 416 "O'" 415 "O̵" 414 "n̩" 413 "N̦" 410 "l̵" 409 "k̔" 408 "K'" 407 "l̵" 406 "l" 403 "G'" 402 "f̦" 401 "F̦" 397 "g" 396 "d̄" 394 "'D" 393 "D̵" 391 "C'" 388 "b" 387 "b̄" 386 "b̄" 385 "'B" 384 "b̵" 383 "f" 359 "t̵" 358 "T̵" 339 "oe" 338 "OE" 336 "Ö" 329 "'n" 322 "l̸" 321 "L̸" 320 "l·" 319 "l·" 312 "k" 307 "ij" 306 "IJ" 305 "i" 295 "h̵" 294 "H̵" 283 "ĕ" 282 "Ĕ" 273 "d̵" 272 "D̵" 248 "o̸" 240 "∂̵" 231 "c̦" 230 "ae" 216 "O̸" 215 "x" 208 "D̵" 199 "C̦" 198 "AE" 184 "," 181 "μ" 180 "'" 175 "ˉ" 165 "Y̵" 162 "c̸" 160 " " 124 "l" 119 "vv" 109 "rn" 96 "'" 73 "l" 49 "l" 48 "O" 37 "º/₀₀" 34 "''")))
+
+  (while ranges
+     (setq k (pop ranges)
+           v (pop ranges))
+     (set-char-table-range uni-confusables-char-table-single k v)))
+
+(ert-deftest uni-confusables-test-single ()
+
+  (should (string-equal
+           (char-table-range uni-confusables-char-table-single 195001)
+           "蜎"))
+
+  (should (string-equal
+           (char-table-range uni-confusables-char-table-single 194901)
+           "𥛅"))
+
+  (should (string-equal
+           (char-table-range uni-confusables-char-table-single 120618)
+           "O"))
+
+  (should (string-equal
+           (char-table-range uni-confusables-char-table-single 42235)
+           "."))
+
+  (should (string-equal
+           (char-table-range uni-confusables-char-table-single 12068)
+           "大"))
+)
+
+(defvar uni-confusables-char-table-multiple (make-char-table 'confusables-multiple-script))
+
+(let ((k nil) (v nil) (ranges '(195101 "𪘀" 195100 "鼻" 195099 "鼖" 195098 "鼏" 195097 "鼅" 195096 "黾" 195095 "黹" 195094 "䵖" 195093 "麻" 195092 "𪊑" 195091 "𪈎" 195090 "𪄅" 195089 "䳸" 195088 "𪃎" 195087 "鵧" 195086 "䳭" 195085 "䳎" 195084 "鳽" 195083 "鱀" 195082 "鬒" 195081 "𩬰" 195080 "䯎" 195079 "駾" 195078 "駂" 195077 "馧" 195076 "餩" 195075 "䬳" 195074 "飢" 195073 "𩖶" 195072 "頩" 195071 "頋" 195070 "頋" 195069 "𩒖" 195068 "䪲" 195067 "𩐊" 195066 "韠" 195065 "䩶" 195064 "䩮" 195063 "𩈚" 195062 "𩅅" 195061 "霣" 195060 "嶲" 195059 "雃" 195058 "䧦" 195057 "𨵷" 195056 "閷" 195055 "䦕" 195054 "開" 195053 "𨯺" 195052 "鐕" 195051 "鏹" 195050 "鉼" 195049 "鋘" 195048 "鋗" 195047 "鈸" 195046 "鄛" 195045 "𨜮" 195044 "鄑" 195043 "郱" 195042 "邔" 195041 "𨗭" 195040 "𨗒" 195039 "輸" 195038 "軔" 195037 "𠣞" 195036 "跰" 195035 "趼" 195034 "跋" 195033 "𠠄" 195032 "𧼯" 195031 "起" 195030 "贛" 195029 "賁" 195028 "貫" 195027 "𧲨" 195026 "豕" 195025 "變" 195024 "諭" 195023 "誠" 195022 "䛇" 195021 "䚾" 195020 "𧥦" 195019 "𧢮" 195018 "㒻" 195017 "裺" 195016 "䘵" 195015 "裞" 195014 "裗" 195013 "𧙧" 195012 "衣" 195011 "衠" 195010 "䗹" 195009 "蠁" 195008 "蟡" 195007 "䗗" 195006 "螆" 195005 "蝫" 195004 "蜨" 195003 "蝹" 195002 "蛢" 195001 "蜎" 195000 "蚈" 194999 "蚩" 194998 "虩" 194997 "虧" 194996 "虜" 194995 "虐" 194994 "䕫" 194993 "𧃒" 194992 "𦾱" 194991 "䕡" 194990 "䕝" 194989 "𦼬" 194988 "蕤" 194987 "𧏊" 194986 "蔖" 194985 "蓳" 194984 "蓱" 194983 "䔫" 194982 "𦳕" 194981 "𦵫" 194980 "𦰶" 194979 "菜" 194978 "菌" 194977 "菊" 194976 "荓" 194975 "著" 194974 "菧" 194973 "莽" 194972 "茣" 194971 "莭" 194970 "荣" 194969 "茝" 194968 "若" 194967 "𦬼" 194966 "苦" 194965 "芽" 194964 "芳" 194963 "花" 194962 "劳" 194961 "芝" 194960 "芋" 194959 "芑" 194958 "䑫" 194957 "辞" 194956 "舄" 194955 "舁" 194954 "𣎜" 194953 "𣎓" 194952 "𦞵" 194951 "𦞧" 194950 "媵" 194949 "脾" 194948 "䐋" 194947 "脃" 194946 "育" 194945 "䏕" 194944 "𣍟" 194943 "聰" 194942 "𦖨" 194941 "聠" 194940 "𦔣" 194939 "𦓚" 194938 "者" 194937 "翺" 194936 "羕" 194935 "𦌾" 194934 "罺" 194933 "𦋙" 194932 "䍙" 194931 "𦉇" 194930 "𦈨" 194929 "䌴" 194928 "繅" 194927 "縂" 194926 "緇" 194925 "䌁" 194924 "絣" 194923 "𥾆" 194922 "紀" 194921 "糣" 194920 "糨" 194919 "䊠" 194918 "糒" 194917 "𥲀" 194916 "䈧" 194915 "築" 194914 "篆" 194913 "𥮫" 194912 "䈂" 194911 "竮" 194910 "𥪧" 194909 "𥪧" 194908 "𥥼" 194907 "穏" 194906 "穊" 194905 "穀" 194904 "䄯" 194903 "秫" 194902 "福" 194901 "𥛅" 194900 "𥚚" 194899 "祖" 194898 "𥘦" 194897 "䃣" 194896 "磌" 194895 "碌" 194894 "硎" 194893 "𥐝" 194892 "䂖" 194891 "䁆" 194890 "瞋" 194889 "䀹" 194888 "睊" 194887 "真" 194886 "真" 194885 "眞" 194884 "𥄳" 194883 "𥄙" 194882 "𥃲" 194881 "𥃳" 194880 "直" 194879 "䀈" 194878 "㿼" 194877 "𥁄" 194876 "𤾸" 194875 "𤾡" 194874 "瘐" 194873 "𢆟" 194872 "異" 194871 "𤲒" 194870 "甾" 194869 "𤰶" 194868 "甤" 194867 "㼛" 194866 "瓊" 194865 "璅" 194864 "瑱" 194863 "瑜" 194862 "瑇" 194861 "㺸" 194860 "㺸" 194859 "玥" 194858 "㺬" 194857 "王" 194856 "獺" 194855 "𤠔" 194854 "𤜵" 194853 "犕" 194852 "犀" 194851 "𤘈" 194850 "牐" 194849 "爵" 194848 "爨" 194847 "𤎫" 194846 "熜" 194845 "𤉣" 194844 "煅" 194843 "𠔥" 194842 "炭" 194841 "灷" 194840 "災" 194839 "灊" 194838 "㶖" 194837 "瀛" 194836 "瀞" 194835 "瀹" 194834 "濆" 194833 "𣾎" 194832 "𣽞" 194831 "潮" 194830 "淹" 194829 "𣻑" 194828 "滇" 194827 "滋" 194826 "㴳" 194825 "湮" 194824 "港" 194823 "洴" 194822 "𣴞" 194821 "涅" 194820 "浸" 194819 "浩" 194818 "流" 194817 "海" 194816 "派" 194815 "洖" 194814 "汧" 194813 "泍" 194812 "沿" 194811 "𣲼" 194810 "汎" 194809 "𣫺" 194808 "𡴋" 194807 "𣪍" 194806 "殻" 194805 "殺" 194804 "殟" 194803 "歲" 194802 "㱎" 194801 "歔" 194800 "𣢧" 194799 "次" 194798 "㰘" 194797 "櫛" 194796 "𣚣" 194795 "檨" 194794 "槪" 194793 "榣" 194792 "楂" 194791 "㮝" 194790 "椔" 194789 "栟" 194788 "梎" 194787 "𣑭" 194786 "梅" 194785 "桒" 194784 "枅" 194783 "柺" 194782 "㭉" 194781 "𣏃" 194780 "杓" 194779 "杞" 194778 "朡" 194777 "望" 194776 "朗" 194775 "䏙" 194774 "肭" 194773 "暜" 194772 "最" 194771 "冕" 194770 "冒" 194769 "㫤" 194768 "㬈" 194767 "暑" 194766 "㬙" 194765 "晉" 194764 "書" 194763 "旣" 194762 "𣀊" 194761 "敬" 194760 "敏" 194759 "㩬" 194758 "摷" 194757 "撝" 194756 "摾" 194755 "摩" 194754 "㨮" 194753 "掩" 194752 "揅" 194751 "搢" 194750 "𢯱" 194749 "揤" 194748 "掃" 194747 "捨" 194746 "拼" 194745 "挽" 194744 "𢬌" 194743 "捐" 194742 "拔" 194741 "抱" 194740 "扝" 194739 "戛" 194738 "成" 194737 "懶" 194736 "懲" 194735 "懞" 194734 "憯" 194733 "憤" 194732 "憲" 194731 "憎" 194730 "慺" 194729 "慌" 194728 "慎" 194727 "慌" 194726 "慈" 194725 "惇" 194724 "𢛔" 194723 "悔" 194722 "㤜" 194721 "㤺" 194720 "悁" 194719 "忹" 194718 "志" 194717 "忍" 194716 "徚" 194715 "㣣" 194714 "彫" 194713 "形" 194712 "𦇚" 194711 "𣊸" 194710 "㣇" 194709 "弢" 194708 "弢" 194707 "舁" 194706 "𢌱" 194705 "𢌱" 194704 "廾" 194703 "𪎒" 194702 "廊" 194701 "庶" 194700 "庳" 194699 "庰" 194698 "㡼" 194697 "𢆃" 194696 "㡢" 194695 "幩" 194694 "帽" 194693 "帨" 194692 "巽" 194691 "㠯" 194690 "巢" 194689 "巡" 194688 "嵼" 194687 "嵫" 194686 "嵮" 194685 "𡷦" 194684 "嵃" 194683 "𡷤" 194682 "岍" 194681 "峀" 194680 "屮" 194679 "屠" 194678 "㞁" 194677 "尢" 194676 "当" 194675 "将" 194674 "寿" 194673 "𡬘" 194672 "寳" 194671 "寧" 194670 "寘" 194669 "寃" 194668 "𡧈" 194667 "嬾" 194666 "嬾" 194665 "嬈" 194664 "㛼" 194663 "㛮" 194662 "婦" 194661 "姘" 194660 "娧" 194659 "娛" 194658 "姬" 194657 "𡛪" 194656 "𡚨" 194655 "奢" 194654 "夢" 194653 "多" 194652 "夆" 194651 "壷" 194650 "売" 194649 "𡓤" 194648 "墬" 194647 "報" 194646 "堲" 194645 "型" 194644 "堍" 194643 "埴" 194642 "城" 194641 "壮" 194640 "切" 194639 "噴" 194638 "噑" 194637 "圗" 194636 "嘆" 194635 "圖" 194634 "嗂" 194633 "喳" 194632 "喫" 194631 "喙" 194630 "善" 194629 "善" 194628 "啣" 194627 "啓" 194626 "唐" 194625 "哶" 194624 "咢" 194623 "周" 194622 "呈" 194621 "吸" 194620 "咞" 194619 "吆" 194618 "叱" 194617 "叫" 194616 "𠭣" 194615 "叟" 194614 "及" 194613 "灰" 194612 "𠨬" 194611 "卿" 194610 "卿" 194609 "卿" 194608 "卽" 194607 "即" 194606 "博" 194605 "卑" 194604 "卉" 194603 "北" 194602 "匆" 194601 "包" 194600 "勺" 194599 "勤" 194598 "勉" 194597 "勇" 194596 "㔕" 194595 "剷" 194594 "割" 194593 "剆" 194592 "刻" 194591 "㓟" 194590 "刃" 194589 "凵" 194588 "𩇟" 194587 "况" 194586 "冬" 194585 "仌" 194584 "冤" 194583 "冗" 194582 "𠕋" 194581 "再" 194580 "內" 194579 "㒹" 194578 "𠔜" 194577 "具" 194576 "兤" 194575 "兔" 194574 "免" 194573 "𠘺" 194572 "㒞" 194571 "像" 194570 "僧" 194569 "備" 194568 "偺" 194567 "併" 194566 "侻" 194565 "侮" 194564 "你" 194563 "𠄢" 194562 "乁" 194561 "丸" 194560 "丽" 127560 "(敗)" 127559 "(勝)" 127558 "(盗)" 127557 "(打)" 127556 "(点)" 127555 "(安)" 127554 "(二)" 127553 "(三)" 127552 "(本)" 127274 "(S)" 127273 "(Z)" 127272 "(Y)" 127271 "(X)" 127270 "(W)" 127269 "(V)" 127268 "(U)" 127267 "(T)" 127266 "(S)" 127265 "(R)" 127264 "(Q)" 127263 "(P)" 127262 "(O)" 127261 "(N)" 127260 "(M)" 127259 "(L)" 127258 "(K)" 127257 "(J)" 127256 "(I)" 127255 "(H)" 127254 "(G)" 127253 "(F)" 127252 "(E)" 127251 "(D)" 127250 "(C)" 127249 "(B)" 127248 "(A)" 127242 "9," 127241 "8," 127240 "7," 127239 "6," 127238 "5," 127237 "4," 127236 "3," 127235 "2," 127234 "l," 127233 "O," 127232 "O." 120831 "9" 120830 "8" 120829 "7" 120828 "6" 120827 "5" 120826 "4" 120825 "3" 120824 "2" 120823 "l" 120822 "O" 120821 "9" 120820 "8" 120819 "7" 120818 "6" 120817 "5" 120816 "4" 120815 "3" 120814 "2" 120813 "l" 120812 "O" 120811 "9" 120810 "8" 120809 "7" 120808 "6" 120807 "5" 120806 "4" 120805 "3" 120804 "2" 120803 "l" 120802 "O" 120801 "9" 120800 "8" 120799 "7" 120798 "6" 120797 "5" 120796 "4" 120795 "3" 120794 "2" 120793 "l" 120792 "O" 120791 "9" 120790 "8" 120789 "7" 120788 "6" 120787 "5" 120786 "4" 120785 "3" 120784 "2" 120783 "l" 120782 "O" 120779 "ϝ" 120778 "F" 120777 "n" 120776 "p" 120775 "ɸ" 120774 "k" 120773 "O̵" 120772 "ɛ" 120771 "∂" 120770 "ω" 120769 "ψ" 120768 "χ" 120767 "ɸ" 120766 "u" 120765 "t" 120764 "o" 120763 "ς" 120762 "p" 120761 "n" 120760 "o" 120759 "ξ" 120758 "v" 120757 "μ" 120756 "λ" 120755 "k" 120754 "i" 120753 "O̵" 120752 "n̩" 120751 "ζ" 120750 "ɛ" 120749 "ẟ" 120748 "y" 120747 "ß" 120746 "a" 120745 "∇" 120744 "ᘯ" 120743 "Ψ" 120742 "X" 120741 "Φ" 120740 "Y" 120739 "T" 120738 "Ʃ" 120737 "O̵" 120736 "P" 120735 "Π" 120734 "O" 120733 "Ξ" 120732 "N" 120731 "M" 120730 "Ʌ" 120729 "K" 120728 "l" 120727 "O̵" 120726 "H" 120725 "Z" 120724 "E" 120723 "ᐃ" 120722 "ᒥ" 120721 "B" 120720 "A" 120719 "n" 120718 "p" 120717 "ɸ" 120716 "k" 120715 "O̵" 120714 "ɛ" 120713 "∂" 120712 "ω" 120711 "ψ" 120710 "χ" 120709 "ɸ" 120708 "u" 120707 "t" 120706 "o" 120705 "ς" 120704 "p" 120703 "n" 120702 "o" 120701 "ξ" 120700 "v" 120699 "μ" 120698 "λ" 120697 "k" 120696 "i" 120695 "O̵" 120694 "n̩" 120693 "ζ" 120692 "ɛ" 120691 "ẟ" 120690 "y" 120689 "ß" 120688 "a" 120687 "∇" 120686 "ᘯ" 120685 "Ψ" 120684 "X" 120683 "Φ" 120682 "Y" 120681 "T" 120680 "Ʃ" 120679 "O̵" 120678 "P" 120677 "Π" 120676 "O" 120675 "Ξ" 120674 "N" 120673 "M" 120672 "Ʌ" 120671 "K" 120670 "l" 120669 "O̵" 120668 "H" 120667 "Z" 120666 "E" 120665 "ᐃ" 120664 "ᒥ" 120663 "B" 120662 "A" 120661 "n" 120660 "p" 120659 "ɸ" 120658 "k" 120657 "O̵" 120656 "ɛ" 120655 "∂" 120654 "ω" 120653 "ψ" 120652 "χ" 120651 "ɸ" 120650 "u" 120649 "t" 120648 "o" 120647 "ς" 120646 "p" 120645 "n" 120644 "o" 120643 "ξ" 120642 "v" 120641 "μ" 120640 "λ" 120639 "k" 120638 "i" 120637 "O̵" 120636 "n̩" 120635 "ζ" 120634 "ɛ" 120633 "ẟ" 120632 "y" 120631 "ß" 120630 "a" 120629 "∇" 120628 "ᘯ" 120627 "Ψ" 120626 "X" 120625 "Φ" 120624 "Y" 120623 "T" 120622 "Ʃ" 120621 "O̵" 120620 "P" 120619 "Π" 120618 "O" 120617 "Ξ" 120616 "N" 120615 "M" 120614 "Ʌ" 120613 "K" 120612 "l" 120611 "O̵" 120610 "H" 120609 "Z" 120608 "E" 120607 "ᐃ" 120606 "ᒥ" 120605 "B" 120604 "A" 120603 "n" 120602 "p" 120601 "ɸ" 120600 "k" 120599 "O̵" 120598 "ɛ" 120597 "∂" 120596 "ω" 120595 "ψ" 120594 "χ" 120593 "ɸ" 120592 "u" 120591 "t" 120590 "o" 120589 "ς" 120588 "p" 120587 "n" 120586 "o" 120585 "ξ" 120584 "v" 120583 "μ" 120582 "λ" 120581 "k" 120580 "i" 120579 "O̵" 120578 "n̩" 120577 "ζ" 120576 "ɛ" 120575 "ẟ" 120574 "y" 120573 "ß" 120572 "a" 120571 "∇" 120570 "ᘯ" 120569 "Ψ" 120568 "X" 120567 "Φ" 120566 "Y" 120565 "T" 120564 "Ʃ" 120563 "O̵" 120562 "P" 120561 "Π" 120560 "O" 120559 "Ξ" 120558 "N" 120557 "M" 120556 "Ʌ" 120555 "K" 120554 "l" 120553 "O̵" 120552 "H" 120551 "Z" 120550 "E" 120549 "ᐃ" 120548 "ᒥ" 120547 "B" 120546 "A" 120545 "n" 120544 "p" 120543 "ɸ" 120542 "k" 120541 "O̵" 120540 "ɛ" 120539 "∂" 120538 "ω" 120537 "ψ" 120536 "χ" 120535 "ɸ" 120534 "u" 120533 "t" 120532 "o" 120531 "ς" 120530 "p" 120529 "n" 120528 "o" 120527 "ξ" 120526 "v" 120525 "μ" 120524 "λ" 120523 "k" 120522 "i" 120521 "O̵" 120520 "n̩" 120519 "ζ" 120518 "ɛ" 120517 "ẟ" 120516 "y" 120515 "ß" 120514 "a" 120513 "∇" 120512 "ᘯ" 120511 "Ψ" 120510 "X" 120509 "Φ" 120508 "Y" 120507 "T" 120506 "Ʃ" 120505 "O̵" 120504 "P" 120503 "Π" 120502 "O" 120501 "Ξ" 120500 "N" 120499 "M" 120498 "Ʌ" 120497 "K" 120496 "l" 120495 "O̵" 120494 "H" 120493 "Z" 120492 "E" 120491 "ᐃ" 120490 "ᒥ" 120489 "B" 120488 "A" 120485 "j" 120484 "i" 120483 "z" 120482 "y" 120481 "x" 120480 "vv" 120479 "v" 120478 "u" 120477 "t" 120476 "s" 120475 "r" 120474 "q" 120473 "p" 120472 "o" 120471 "n" 120470 "rn" 120469 "l" 120468 "k" 120467 "j" 120466 "i" 120465 "h" 120464 "g" 120463 "f" 120462 "e" 120461 "d" 120460 "c" 120459 "b" 120458 "a" 120457 "Z" 120456 "Y" 120455 "X" 120454 "W" 120453 "V" 120452 "U" 120451 "T" 120450 "S" 120449 "R" 120448 "Q" 120447 "P" 120446 "O" 120445 "N" 120444 "M" 120443 "L" 120442 "K" 120441 "J" 120440 "l" 120439 "H" 120438 "G" 120437 "F" 120436 "E" 120435 "D" 120434 "C" 120433 "B" 120432 "A" 120431 "z" 120430 "y" 120429 "x" 120428 "vv" 120427 "v" 120426 "u" 120425 "t" 120424 "s" 120423 "r" 120422 "q" 120421 "p" 120420 "o" 120419 "n" 120418 "rn" 120417 "l" 120416 "k" 120415 "j" 120414 "i" 120413 "h" 120412 "g" 120411 "f" 120410 "e" 120409 "d" 120408 "c" 120407 "b" 120406 "a" 120405 "Z" 120404 "Y" 120403 "X" 120402 "W" 120401 "V" 120400 "U" 120399 "T" 120398 "S" 120397 "R" 120396 "Q" 120395 "P" 120394 "O" 120393 "N" 120392 "M" 120391 "L" 120390 "K" 120389 "J" 120388 "l" 120387 "H" 120386 "G" 120385 "F" 120384 "E" 120383 "D" 120382 "C" 120381 "B" 120380 "A" 120379 "z" 120378 "y" 120377 "x" 120376 "vv" 120375 "v" 120374 "u" 120373 "t" 120372 "s" 120371 "r" 120370 "q" 120369 "p" 120368 "o" 120367 "n" 120366 "rn" 120365 "l" 120364 "k" 120363 "j" 120362 "i" 120361 "h" 120360 "g" 120359 "f" 120358 "e" 120357 "d" 120356 "c" 120355 "b" 120354 "a" 120353 "Z" 120352 "Y" 120351 "X" 120350 "W" 120349 "V" 120348 "U" 120347 "T" 120346 "S" 120345 "R" 120344 "Q" 120343 "P" 120342 "O" 120341 "N" 120340 "M" 120339 "L" 120338 "K" 120337 "J" 120336 "l" 120335 "H" 120334 "G" 120333 "F" 120332 "E" 120331 "D" 120330 "C" 120329 "B" 120328 "A" 120327 "z" 120326 "y" 120325 "x" 120324 "vv" 120323 "v" 120322 "u" 120321 "t" 120320 "s" 120319 "r" 120318 "q" 120317 "p" 120316 "o" 120315 "n" 120314 "rn" 120313 "l" 120312 "k" 120311 "j" 120310 "i" 120309 "h" 120308 "g" 120307 "f" 120306 "e" 120305 "d" 120304 "c" 120303 "b" 120302 "a" 120301 "Z" 120300 "Y" 120299 "X" 120298 "W" 120297 "V" 120296 "U" 120295 "T" 120294 "S" 120293 "R" 120292 "Q" 120291 "P" 120290 "O" 120289 "N" 120288 "M" 120287 "L" 120286 "K" 120285 "J" 120284 "l" 120283 "H" 120282 "G" 120281 "F" 120280 "E" 120279 "D" 120278 "C" 120277 "B" 120276 "A" 120275 "z" 120274 "y" 120273 "x" 120272 "vv" 120271 "v" 120270 "u" 120269 "t" 120268 "s" 120267 "r" 120266 "q" 120265 "p" 120264 "o" 120263 "n" 120262 "rn" 120261 "l" 120260 "k" 120259 "j" 120258 "i" 120257 "h" 120256 "g" 120255 "f" 120254 "e" 120253 "d" 120252 "c" 120251 "b" 120250 "a" 120249 "Z" 120248 "Y" 120247 "X" 120246 "W" 120245 "V" 120244 "U" 120243 "T" 120242 "S" 120241 "R" 120240 "Q" 120239 "P" 120238 "O" 120237 "N" 120236 "M" 120235 "L" 120234 "K" 120233 "J" 120232 "l" 120231 "H" 120230 "G" 120229 "F" 120228 "E" 120227 "D" 120226 "C" 120225 "B" 120224 "A" 120223 "z" 120222 "y" 120221 "x" 120220 "vv" 120219 "v" 120218 "u" 120217 "t" 120216 "s" 120215 "r" 120214 "q" 120213 "p" 120212 "o" 120211 "n" 120210 "rn" 120209 "l" 120208 "k" 120207 "j" 120206 "i" 120205 "h" 120204 "g" 120203 "f" 120202 "e" 120201 "d" 120200 "c" 120199 "b" 120198 "a" 120197 "Z" 120196 "Y" 120195 "X" 120194 "W" 120193 "V" 120192 "U" 120191 "T" 120190 "S" 120189 "R" 120188 "Q" 120187 "P" 120186 "O" 120185 "N" 120184 "M" 120183 "L" 120182 "K" 120181 "J" 120180 "l" 120179 "H" 120178 "G" 120177 "F" 120176 "E" 120175 "D" 120174 "C" 120173 "B" 120172 "A" 120171 "z" 120170 "y" 120169 "x" 120168 "vv" 120167 "v" 120166 "u" 120165 "t" 120164 "s" 120163 "r" 120162 "q" 120161 "p" 120160 "o" 120159 "n" 120158 "rn" 120157 "l" 120156 "k" 120155 "j" 120154 "i" 120153 "h" 120152 "g" 120151 "f" 120150 "e" 120149 "d" 120148 "c" 120147 "b" 120146 "a" 120144 "Y" 120143 "X" 120142 "W" 120141 "V" 120140 "U" 120139 "T" 120138 "S" 120134 "O" 120132 "M" 120131 "L" 120130 "K" 120129 "J" 120128 "l" 120126 "G" 120125 "F" 120124 "E" 120123 "D" 120121 "B" 120120 "A" 120119 "z" 120118 "y" 120117 "x" 120116 "vv" 120115 "v" 120114 "u" 120113 "t" 120112 "s" 120111 "r" 120110 "q" 120109 "p" 120108 "o" 120107 "n" 120106 "rn" 120105 "l" 120104 "k" 120103 "j" 120102 "i" 120101 "h" 120100 "g" 120099 "f" 120098 "e" 120097 "d" 120096 "c" 120095 "b" 120094 "a" 120092 "Y" 120091 "X" 120090 "W" 120089 "V" 120088 "U" 120087 "T" 120086 "S" 120084 "Q" 120083 "P" 120082 "O" 120081 "N" 120080 "M" 120079 "L" 120078 "K" 120077 "J" 120074 "G" 120073 "F" 120072 "E" 120071 "D" 120069 "B" 120068 "A" 120067 "z" 120066 "y" 120065 "x" 120064 "vv" 120063 "v" 120062 "u" 120061 "t" 120060 "s" 120059 "r" 120058 "q" 120057 "p" 120056 "o" 120055 "n" 120054 "rn" 120053 "l" 120052 "k" 120051 "j" 120050 "i" 120049 "h" 120048 "g" 120047 "f" 120046 "e" 120045 "d" 120044 "c" 120043 "b" 120042 "a" 120041 "Z" 120040 "Y" 120039 "X" 120038 "W" 120037 "V" 120036 "U" 120035 "T" 120034 "S" 120033 "R" 120032 "Q" 120031 "P" 120030 "O" 120029 "N" 120028 "M" 120027 "L" 120026 "K" 120025 "J" 120024 "l" 120023 "H" 120022 "G" 120021 "F" 120020 "E" 120019 "D" 120018 "C" 120017 "B" 120016 "A" 120015 "z" 120014 "y" 120013 "x" 120012 "vv" 120011 "v" 120010 "u" 120009 "t" 120008 "s" 120007 "r" 120006 "q" 120005 "p" 120003 "n" 120002 "rn" 120001 "l" 120000 "k" 119999 "j" 119998 "i" 119997 "h" 119995 "f" 119993 "d" 119992 "c" 119991 "b" 119990 "a" 119989 "Z" 119988 "Y" 119987 "X" 119986 "W" 119985 "V" 119984 "U" 119983 "T" 119982 "S" 119980 "Q" 119979 "P" 119978 "O" 119977 "N" 119974 "K" 119973 "J" 119970 "G" 119967 "D" 119966 "C" 119964 "A" 119963 "z" 119962 "y" 119961 "x" 119960 "vv" 119959 "v" 119958 "u" 119957 "t" 119956 "s" 119955 "r" 119954 "q" 119953 "p" 119952 "o" 119951 "n" 119950 "rn" 119949 "l" 119948 "k" 119947 "j" 119946 "i" 119945 "h" 119944 "g" 119943 "f" 119942 "e" 119941 "d" 119940 "c" 119939 "b" 119938 "a" 119937 "Z" 119936 "Y" 119935 "X" 119934 "W" 119933 "V" 119932 "U" 119931 "T" 119930 "S" 119929 "R" 119928 "Q" 119927 "P" 119926 "O" 119925 "N" 119924 "M" 119923 "L" 119922 "K" 119921 "J" 119920 "l" 119919 "H" 119918 "G" 119917 "F" 119916 "E" 119915 "D" 119914 "C" 119913 "B" 119912 "A" 119911 "z" 119910 "y" 119909 "x" 119908 "vv" 119907 "v" 119906 "u" 119905 "t" 119904 "s" 119903 "r" 119902 "q" 119901 "p" 119900 "o" 119899 "n" 119898 "rn" 119897 "l" 119896 "k" 119895 "j" 119894 "i" 119892 "g" 119891 "f" 119890 "e" 119889 "d" 119888 "c" 119887 "b" 119886 "a" 119885 "Z" 119884 "Y" 119883 "X" 119882 "W" 119881 "V" 119880 "U" 119879 "T" 119878 "S" 119877 "R" 119876 "Q" 119875 "P" 119874 "O" 119873 "N" 119872 "M" 119871 "L" 119870 "K" 119869 "J" 119868 "l" 119867 "H" 119866 "G" 119865 "F" 119864 "E" 119863 "D" 119862 "C" 119861 "B" 119860 "A" 119859 "z" 119858 "y" 119857 "x" 119856 "vv" 119855 "v" 119854 "u" 119853 "t" 119852 "s" 119851 "r" 119850 "q" 119849 "p" 119848 "o" 119847 "n" 119846 "rn" 119845 "l" 119844 "k" 119843 "j" 119842 "i" 119841 "h" 119840 "g" 119839 "f" 119838 "e" 119837 "d" 119836 "c" 119835 "b" 119834 "a" 119833 "Z" 119832 "Y" 119831 "X" 119830 "W" 119829 "V" 119828 "U" 119827 "T" 119826 "S" 119825 "R" 119824 "Q" 119823 "P" 119822 "O" 119821 "N" 119820 "M" 119819 "L" 119818 "K" 119817 "J" 119816 "l" 119815 "H" 119814 "G" 119813 "F" 119812 "E" 119811 "D" 119810 "C" 119809 "B" 119808 "A" 119149 "." 73784 "𐎚" 69819 "॰" 68176 "." 68154 "̣" 66720 "𐒆" 66515 "𐎓" 66513 "𐎂" 65793 "·" 65517 "▪" 65512 "l" 65507 "ˉ" 65381 "·" 65374 "〜" 65372 "│" 65369 "y" 65368 "x" 65366 "v" 65363 "s" 65360 "p" 65359 "o" 65356 "l" 65354 "j" 65353 "i" 65352 "h" 65351 "g" 65349 "e" 65347 "c" 65345 "a" 65344 "'" 65342 "︿" 65341 ")" 65340 "\\" 65339 "(" 65338 "Z" 65337 "Y" 65336 "X" 65332 "T" 65331 "S" 65328 "P" 65327 "O" 65326 "N" 65325 "M" 65323 "K" 65322 "J" 65321 "l" 65320 "H" 65317 "E" 65315 "C" 65314 "B" 65313 "A" 65306 ":" 65293 "ー" 65287 "'" 65282 "''" 65281 "!" 65276 "لا" 65275 "لا" 65274 "لإ" 65273 "لإ" 65272 "لاٴ" 65271 "لاٴ" 65270 "لآ" 65269 "لآ" 65268 "ى" 65267 "ى" 65266 "ى" 65265 "ى" 65264 "ى" 65263 "ى" 65262 "و" 65261 "و" 65260 "ه" 65259 "ه" 65258 "ه" 65257 "ه" 65256 "ب" 65255 "ب" 65254 "ب" 65253 "ب" 65252 "م" 65251 "م" 65250 "م" 65249 "م" 65248 "ل" 65247 "ل" 65246 "ل" 65245 "ل" 65244 "ك" 65243 "ك" 65242 "ك" 65241 "ك" 65240 "ق" 65239 "ق" 65238 "ق" 65237 "ق" 65236 "ف" 65235 "ف" 65234 "ف" 65233 "ف" 65232 "غ" 65231 "غ" 65230 "غ" 65229 "غ" 65228 "ع" 65227 "ع" 65226 "ع" 65225 "ع" 65224 "ظ" 65223 "ظ" 65222 "ظ" 65221 "ظ" 65220 "ط" 65219 "ط" 65218 "ط" 65217 "ط" 65216 "ض" 65215 "ض" 65214 "ض" 65213 "ض" 65212 "ص" 65211 "ص" 65210 "ص" 65209 "ص" 65208 "ش" 65207 "ش" 65206 "ش" 65205 "ش" 65204 "س" 65203 "س" 65202 "س" 65201 "س" 65200 "ز" 65199 "ز" 65198 "ر" 65197 "ر" 65196 "ذ" 65195 "ذ" 65194 "د" 65193 "د" 65192 "ج" 65191 "ج" 65190 "ج" 65189 "ج" 65188 "ح" 65187 "ح" 65186 "ح" 65185 "ح" 65184 "ج" 65183 "ج" 65182 "ج" 65181 "ج" 65180 "ث" 65179 "ث" 65178 "ث" 65177 "ث" 65176 "ت" 65175 "ت" 65174 "ت" 65173 "ت" 65172 "ö" 65171 "ö" 65170 "ب" 65169 "ب" 65168 "ب" 65167 "ب" 65166 "ا" 65165 "ا" 65164 "ىٴ" 65163 "ىٴ" 65162 "ىٴ" 65161 "ىٴ" 65160 "إ" 65159 "إ" 65158 "وٴ" 65157 "وٴ" 65156 "اٴ" 65155 "اٴ" 65154 "آ" 65153 "آ" 65152 "ء" 65128 "\\" 65112 "-" 65103 "_" 65102 "_" 65101 "_" 65100 "ˉ" 65099 "ˉ" 65098 "ˉ" 65097 "ˉ" 65082 "⏡" 65081 "⏠" 65080 "⏟" 65079 "⏞" 65078 "⏝" 65077 "⏜" 65073 "│" 65072 ":" 65049 "⁝" 65020 "رىال" 65019 "جل جلاله" 65018 "صلى الله علىه وسلم" 65017 "صلى" 65016 "وسلم" 65015 "علىه" 65014 "رسول" 65013 "صلعم" 65012 "محمد" 65011 "اكبر" 65010 "الله" 65009 "قلے" 65008 "صلے" 64967 "بجى" 64966 "سجى" 64965 "صمم" 64964 "عجم" 64963 "كمم" 64962 "بحى" 64961 "فمى" 64960 "مجى" 64959 "حجى" 64958 "جحى" 64957 "بجح" 64956 "لجم" 64955 "كمم" 64954 "لجم" 64953 "مجى" 64952 "بجح" 64951 "كمى" 64950 "عمى" 64949 "لحم" 64948 "قمح" 64947 "بحى" 64946 "قمى" 64945 "ممى" 64944 "ىمى" 64943 "ىجى" 64942 "ىحى" 64941 "لمى" 64940 "لجى" 64939 "ضحى" 64938 "شحى" 64937 "صحى" 64936 "سجى" 64935 "جمى" 64934 "جحى" 64933 "جمى" 64932 "تمى" 64931 "تمى" 64930 "تجى" 64929 "تجى" 64928 "تجى" 64927 "تجى" 64926 "بجى" 64925 "ىمم" 64924 "ىمم" 64923 "بمى" 64922 "بمى" 64921 "بجى" 64920 "بجم" 64919 "بجم" 64918 "بحى" 64917 "بحم" 64916 "همم" 64915 "همج" 64914 "مجج" 64911 "مجم" 64910 "مجج" 64909 "مجم" 64908 "مجح" 64907 "محى" 64906 "محم" 64905 "محج" 64904 "لمح" 64903 "لمح" 64902 "لجم" 64901 "لجم" 64900 "لجج" 64899 "لجج" 64898 "لحى" 64897 "لحى" 64896 "لحم" 64895 "قمم" 64894 "قمح" 64893 "فجم" 64892 "فجم" 64891 "غمى" 64890 "غمى" 64889 "غمم" 64888 "عمى" 64887 "عمم" 64886 "عمم" 64885 "عجم" 64884 "طمى" 64883 "طمم" 64882 "طمح" 64881 "طمح" 64880 "ضجم" 64879 "ضجم" 64878 "ضحى" 64877 "شمم" 64876 "شمم" 64875 "شمج" 64874 "شمج" 64873 "شجى" 64872 "شحم" 64871 "شحم" 64870 "صمم" 64869 "صحح" 64868 "صحح" 64867 "سمم" 64866 "سمم" 64865 "سمج" 64864 "سمح" 64863 "سمح" 64862 "سجى" 64861 "سجح" 64860 "سحج" 64859 "حمى" 64858 "حمى" 64857 "جمح" 64856 "جمح" 64855 "تمج" 64854 "تمح" 64853 "تمج" 64852 "تجم" 64851 "تحم" 64850 "تحج" 64849 "تحج" 64848 "تجم" 64831 ")" 64830 "(" 64829 "اً" 64828 "اً" 64827 "ظم" 64826 "طم" 64825 "شج" 64824 "شح" 64823 "شج" 64822 "سج" 64821 "سح" 64820 "سج" 64819 "طم" 64818 "شه" 64817 "سه" 64816 "شم" 64815 "شج" 64814 "شح" 64813 "شج" 64812 "ضر" 64811 "صر" 64810 "سر" 64809 "شر" 64808 "شم" 64807 "شج" 64806 "شح" 64805 "شج" 64804 "ضى" 64803 "ضى" 64802 "صى" 64801 "صى" 64800 "جى" 64799 "جى" 64798 "جى" 64797 "جى" 64796 "حى" 64795 "حى" 64794 "شى" 64793 "شى" 64792 "سى" 64791 "سى" 64790 "غى" 64789 "غى" 64788 "عى" 64787 "عى" 64786 "طى" 64785 "طى" 64784 "ضر" 64783 "صر" 64782 "سر" 64781 "شر" 64780 "شم" 64779 "شج" 64778 "شح" 64777 "شج" 64776 "ضى" 64775 "ضى" 64774 "صى" 64773 "صى" 64772 "جى" 64771 "جى" 64770 "جى" 64769 "جى" 64768 "حى" 64767 "حى" 64766 "شى" 64765 "شى" 64764 "سى" 64763 "سى" 64762 "غى" 64761 "غى" 64760 "عى" 64759 "عى" 64758 "طى" 64757 "طى" 64756 "ﹻّ" 64755 "ﹹّ" 64754 "ﹷّ" 64753 "ىه" 64752 "ىم" 64751 "به" 64750 "بم" 64749 "لم" 64748 "كم" 64747 "كل" 64746 "شه" 64745 "شم" 64744 "سه" 64743 "سم" 64742 "ثه" 64741 "ثم" 64740 "ته" 64739 "تم" 64738 "به" 64737 "بم" 64736 "ىٴه" 64735 "ىٴم" 64734 "ىه" 64733 "ىم" 64732 "تج" 64731 "تح" 64730 "تج" 64729 "هٰ" 64728 "هم" 64727 "هج" 64726 "به" 64725 "بم" 64724 "بج" 64723 "بح" 64722 "بج" 64721 "مم" 64720 "مج" 64719 "مح" 64718 "مج" 64717 "له" 64716 "لم" 64715 "لج" 64714 "لح" 64713 "لج" 64712 "كم" 64711 "كل" 64710 "كج" 64709 "كح" 64708 "كج" 64707 "قم" 64706 "قح" 64705 "فم" 64704 "فج" 64703 "فح" 64702 "فج" 64701 "غم" 64700 "غج" 64699 "عم" 64698 "عج" 64697 "ظم" 64696 "طح" 64695 "ضم" 64694 "ضج" 64693 "ضح" 64692 "ضج" 64691 "صم" 64690 "صج" 64689 "صح" 64688 "سم" 64687 "سج" 64686 "سح" 64685 "سج" 64684 "جم" 64683 "جج" 64682 "حم" 64681 "حج" 64680 "جم" 64679 "جح" 64678 "ثم" 64677 "ته" 64676 "تم" 64675 "تج" 64674 "تح" 64673 "تج" 64672 "به" 64671 "بم" 64670 "بج" 64669 "بح" 64668 "بج" 64667 "ىٴه" 64666 "ىٴم" 64665 "ىٴج" 64664 "ىٴح" 64663 "ىٴج" 64662 "ىى" 64661 "ىى" 64660 "ىب" 64659 "ىم" 64658 "ىز" 64657 "ىر" 64656 "ىٰ" 64655 "بى" 64654 "بى" 64653 "بب" 64652 "بم" 64651 "بز" 64650 "بر" 64649 "مم" 64648 "ما" 64647 "لى" 64646 "لى" 64645 "لم" 64644 "كى" 64643 "كى" 64642 "كم" 64641 "كل" 64640 "كا" 64639 "قى" 64638 "قى" 64637 "فى" 64636 "فى" 64635 "ثى" 64634 "ثى" 64633 "ثب" 64632 "ثم" 64631 "ثز" 64630 "ثر" 64629 "تى" 64628 "تى" 64627 "تب" 64626 "تم" 64625 "تز" 64624 "تر" 64623 "بى" 64622 "بى" 64621 "بب" 64620 "بم" 64619 "بز" 64618 "بر" 64617 "ىٴى" 64616 "ىٴى" 64615 "ىٴب" 64614 "ىٴم" 64613 "ىٴز" 64612 "ىٴر" 64611 "ﹼٰ" 64610 "ﹶّ" 64609 "ﹸّ" 64608 "ﹶّ" 64607 "ﹴّ" 64606 "ﹲّ" 64605 "ىٰ" 64604 "رٰ" 64603 "ذٰ" 64602 "ىى" 64601 "ىى" 64600 "ىم" 64599 "تج" 64598 "تح" 64597 "تج" 64596 "هى" 64595 "هى" 64594 "هم" 64593 "هج" 64592 "بى" 64591 "بى" 64590 "بم" 64589 "بج" 64588 "بح" 64587 "بج" 64586 "مى" 64585 "مى" 64584 "مم" 64583 "مج" 64582 "مح" 64581 "مج" 64580 "لى" 64579 "لى" 64578 "لم" 64577 "لج" 64576 "لح" 64575 "لج" 64574 "كى" 64573 "كى" 64572 "كم" 64571 "كل" 64570 "كج" 64569 "كح" 64568 "كج" 64567 "كا" 64566 "قى" 64565 "قى" 64564 "قم" 64563 "قح" 64562 "فى" 64561 "فى" 64560 "فم" 64559 "فج" 64558 "فح" 64557 "فج" 64556 "غم" 64555 "غج" 64554 "عم" 64553 "عج" 64552 "ظم" 64551 "طم" 64550 "طح" 64549 "ضم" 64548 "ضج" 64547 "ضح" 64546 "ضج" 64545 "صم" 64544 "صح" 64543 "سم" 64542 "سج" 64541 "سح" 64540 "سج" 64539 "جم" 64538 "جح" 64537 "جج" 64536 "حم" 64535 "حج" 64534 "جم" 64533 "جح" 64532 "ثى" 64531 "ثى" 64530 "ثم" 64529 "ثج" 64528 "تى" 64527 "تى" 64526 "تم" 64525 "تج" 64524 "تح" 64523 "تج" 64522 "بى" 64521 "بى" 64520 "بم" 64519 "بج" 64518 "بح" 64517 "بج" 64516 "ىٴى" 64515 "ىٴى" 64514 "ىٴم" 64513 "ىٴح" 64512 "ىٴج" 64511 "ى" 64510 "ى" 64509 "ى" 64508 "ى" 64507 "ىٴى" 64506 "ىٴى" 64505 "ىٴى" 64504 "ىٴٺ" 64503 "ىٴٺ" 64502 "ىٴٺ" 64501 "ىٴۈ" 64500 "ىٴۈ" 64499 "ىٴۆ" 64498 "ىٴۆ" 64497 "ىٴۇ" 64496 "ىٴۇ" 64495 "ىٴو" 64494 "ىٴو" 64493 "ىٴه" 64492 "ىٴه" 64491 "ىٴا" 64490 "ىٴا" 64489 "ى" 64488 "ى" 64487 "ٺ" 64486 "ٺ" 64485 "ٺ" 64484 "ٺ" 64483 "ۉ" 64482 "ۉ" 64481 "ۅ" 64480 "ۅ" 64479 "ۋ" 64478 "ۋ" 64477 "ۇٴ" 64476 "ۈ" 64475 "ۈ" 64474 "ۆ" 64473 "ۆ" 64472 "ۇ" 64471 "ۇ" 64470 "ڭ" 64469 "ڭ" 64468 "ڭ" 64467 "ڭ" 64433 "ۓ" 64432 "ۓ" 64431 "ے" 64430 "ے" 64429 "ه" 64428 "ه" 64427 "ه" 64426 "ه" 64425 "ه" 64424 "ه" 64423 "ه" 64422 "ه" 64421 "ۀ" 64420 "ۀ" 64419 "ٹ" 64418 "ٹ" 64417 "ٹ" 64416 "ٹ" 64415 "ں" 64414 "ں" 64413 "ڱ" 64412 "ڱ" 64411 "ڱ" 64410 "ڱ" 64409 "ڳ" 64408 "ڳ" 64407 "ڳ" 64406 "ڳ" 64405 "گ" 64404 "گ" 64403 "گ" 64402 "گ" 64401 "ك" 64400 "ك" 64399 "ك" 64398 "ك" 64397 "ڑ" 64396 "ڑ" 64395 "ژ" 64394 "ژ" 64393 "ڈ" 64392 "ڈ" 64391 "ڎ" 64390 "ڎ" 64389 "ڌ" 64388 "ڌ" 64387 "ڍ" 64386 "ڍ" 64385 "ڇ" 64384 "ڇ" 64383 "ڇ" 64382 "ڇ" 64381 "چ" 64380 "چ" 64379 "چ" 64378 "چ" 64377 "ڃ" 64376 "ڃ" 64375 "ڃ" 64374 "ڃ" 64373 "ڂ" 64372 "ڂ" 64371 "ڂ" 64370 "ڂ" 64369 "ڦ" 64368 "ڦ" 64367 "ڦ" 64366 "ڦ" 64365 "ڤ" 64364 "ڤ" 64363 "ڤ" 64362 "ڤ" 64361 "ٹ" 64360 "ٹ" 64359 "ٹ" 64358 "ٹ" 64357 "ٿ" 64356 "ٿ" 64355 "ٿ" 64354 "ٿ" 64353 "ٺ" 64352 "ٺ" 64351 "ٺ" 64350 "ٺ" 64349 "ٿ" 64348 "ٿ" 64347 "ٿ" 64346 "ٿ" 64345 "پ" 64344 "پ" 64343 "پ" 64342 "پ" 64341 "ٺ" 64340 "ٺ" 64339 "ٺ" 64338 "ٺ" 64337 "ٱ" 64336 "ٱ" 64335 "אל" 64329 "שׁ" 64313 "יִ" 64304 "אַ" 64303 "אַ" 64301 "שּׁ" 64299 "שׁ" 64297 "+" 64296 "ת" 64295 "ר" 64294 "ם" 64293 "ל" 64292 "כ" 64291 "ה" 64290 "ד" 64289 "א" 64288 "ע" 64279 "մխ" 64278 "վն" 64277 "մի" 64276 "մե" 64275 "մն" 64262 "st" 64260 "ffl" 64259 "ffi" 64258 "fl" 64257 "fi" 64256 "ff" 64217 "龎" 64216 "齃" 64215 "𧻓" 64214 "𥳐" 64213 "𥉉" 64212 "䀹" 64211 "䀘" 64210 "㮝" 64209 "𣏕" 64208 "𢡄" 64207 "𢡊" 64206 "龜" 64205 "鬒" 64204 "頻" 64203 "頋" 64202 "響" 64201 "韛" 64200 "靖" 64199 "難" 64198 "陼" 64197 "鉶" 64196 "醙" 64195 "遲" 64194 "輸" 64193 "贈" 64192 "變" 64191 "謹" 64190 "諭" 64189 "諾" 64188 "謁" 64187 "請" 64186 "諸" 64185 "調" 64184 "視" 64183 "覆" 64182 "襁" 64181 "蝹" 64180 "華" 64179 "荒" 64178 "者" 64177 "缾" 64176 "練" 64175 "絛" 64174 "类" 64173 "節" 64172 "窱" 64171 "磌" 64170 "着" 64169 "睊" 64168 "直" 64167 "盛" 64166 "益" 64165 "瘟" 64164 "瘝" 64163 "画" 64162 "甆" 64161 "瑱" 64160 "猪" 64159 "犯" 64158 "爵" 64157 "瞧" 64156 "煮" 64155 "瀞" 64154 "漢" 64153 "滋" 64152 "滛" 64151 "流" 64150 "殺" 64149 "歹" 64148 "杖" 64147 "望" 64146 "朗" 64145 "晴" 64144 "敖" 64143 "摒" 64142 "搜" 64141 "揄" 64140 "戴" 64139 "懲" 64138 "慠" 64137 "憎" 64136 "愈" 64135 "慎" 64134 "惘" 64133 "徭" 64132 "彩" 64131 "廙" 64130 "廒" 64129 "嬨" 64128 "婢" 64127 "奔" 64126 "奄" 64125 "墳" 64124 "塚" 64123 "嗢" 64122 "喙" 64121 "啕" 64120 "喝" 64119 "勺" 64118 "勇" 64117 "冀" 64116 "充" 64115 "侀" 64114 "全" 64113 "况" 64112 "並" 64109 "舘" 64108 "𤋮" 64107 "恵" 64106 "頻" 64105 "響" 64104 "難" 64103 "逸" 64102 "辶" 64101 "贈" 64100 "賓" 64099 "謹" 64098 "謁" 64097 "視" 64096 "褐" 64095 "著" 64094 "艹" 64093 "艹" 64092 "臭" 64091 "者" 64090 "署" 64089 "繁" 64088 "縉" 64087 "練" 64086 "節" 64085 "突" 64084 "穀" 64083 "禎" 64082 "禍" 64081 "祝" 64080 "祖" 64079 "祐" 64078 "祈" 64077 "祉" 64076 "社" 64075 "碑" 64074 "琢" 64073 "爫" 64072 "煮" 64071 "漢" 64070 "渚" 64069 "海" 64068 "梅" 64067 "暑" 64066 "既" 64065 "敏" 64064 "懲" 64063 "憎" 64062 "慨" 64061 "悔" 64060 "屮" 64059 "層" 64058 "墨" 64057 "塀" 64056 "器" 64055 "嘆" 64054 "喝" 64053 "卑" 64052 "勤" 64051 "勉" 64050 "免" 64049 "僧" 64048 "侮" 64045 "鶴" 64044 "館" 64043 "飼" 64042 "飯" 64038 "都" 64037 "逸" 64034 "諸" 64032 "蘒" 64030 "羽" 64029 "精" 64028 "靖" 64027 "福" 64026 "祥" 64025 "神" 64024 "礼" 64023 "益" 64022 "猪" 64021 "凞" 64018 "晴" 64016 "塚" 64013 "嗀" 64012 "兀" 64011 "廓" 64010 "見" 64009 "降" 64008 "行" 64007 "輻" 64006 "暴" 64005 "洞" 64004 "宅" 64003 "糖" 64002 "拓" 64001 "度" 64000 "切" 63999 "刺" 63998 "茶" 63997 "什" 63996 "識" 63995 "炙" 63994 "狀" 63993 "粒" 63992 "笠" 63991 "立" 63990 "臨" 63989 "淋" 63988 "林" 63987 "麟" 63986 "鱗" 63985 "隣" 63984 "藺" 63983 "璘" 63982 "燐" 63981 "吝" 63980 "溺" 63979 "匿" 63978 "離" 63977 "里" 63976 "裡" 63975 "裏" 63974 "罹" 63973 "痢" 63972 "理" 63971 "泥" 63970 "梨" 63969 "李" 63968 "易" 63967 "履" 63966 "吏" 63965 "利" 63964 "隆" 63963 "率" 63962 "栗" 63961 "慄" 63960 "律" 63959 "輪" 63958 "淪" 63957 "崙" 63956 "倫" 63955 "陸" 63954 "戮" 63953 "六" 63952 "類" 63951 "紐" 63950 "硫" 63949 "留" 63948 "琉" 63947 "溜" 63946 "流" 63945 "柳" 63944 "杻" 63943 "劉" 63942 "阮" 63941 "暈" 63940 "龍" 63939 "遼" 63938 "蓼" 63937 "療" 63936 "燎" 63935 "樂" 63934 "料" 63933 "尿" 63932 "寮" 63931 "僚" 63930 "了" 63929 "惡" 63928 "隷" 63927 "醴" 63926 "禮" 63925 "例" 63924 "領" 63923 "靈" 63922 "零" 63921 "鈴" 63920 "聆" 63919 "羚" 63918 "瑩" 63917 "玲" 63916 "怜" 63915 "嶺" 63914 "寧" 63913 "囹" 63912 "令" 63911 "獵" 63910 "簾" 63909 "殮" 63908 "捻" 63907 "念" 63906 "廉" 63905 "說" 63904 "裂" 63903 "烈" 63902 "咽" 63901 "劣" 63900 "列" 63899 "鍊" 63898 "連" 63897 "蓮" 63896 "輦" 63895 "聯" 63894 "練" 63893 "秊" 63892 "璉" 63891 "煉" 63890 "漣" 63889 "撚" 63888 "戀" 63887 "憐" 63886 "年" 63885 "轢" 63884 "歷" 63883 "曆" 63882 "力" 63881 "黎" 63880 "麗" 63879 "驪" 63878 "閭" 63877 "礪" 63876 "濾" 63875 "旅" 63874 "廬" 63873 "女" 63872 "呂" 63871 "勵" 63870 "量" 63869 "諒" 63868 "良" 63867 "糧" 63866 "梁" 63865 "凉" 63864 "兩" 63863 "亮" 63862 "略" 63861 "掠" 63860 "若" 63859 "拾" 63858 "沈" 63857 "辰" 63856 "殺" 63855 "說" 63854 "葉" 63853 "省" 63852 "塞" 63851 "參" 63850 "索" 63849 "數" 63848 "泌" 63847 "不" 63846 "復" 63845 "便" 63844 "磻" 63843 "北" 63842 "異" 63841 "率" 63840 "怒" 63839 "寧" 63838 "丹" 63837 "諾" 63836 "樂" 63835 "拏" 63834 "讀" 63833 "陵" 63832 "菱" 63831 "綾" 63830 "稜" 63829 "凌" 63828 "凜" 63827 "肋" 63826 "勒" 63825 "陋" 63824 "縷" 63823 "累" 63822 "漏" 63821 "淚" 63820 "樓" 63819 "屢" 63818 "壘" 63817 "雷" 63816 "賂" 63815 "磊" 63814 "牢" 63813 "聾" 63812 "籠" 63811 "弄" 63810 "壟" 63809 "論" 63808 "鹿" 63807 "錄" 63806 "菉" 63805 "綠" 63804 "祿" 63803 "碌" 63802 "鷺" 63801 "魯" 63800 "露" 63799 "路" 63798 "虜" 63797 "蘆" 63796 "老" 63795 "盧" 63794 "爐" 63793 "櫓" 63792 "擄" 63791 "勞" 63790 "冷" 63789 "來" 63788 "郎" 63787 "狼" 63786 "浪" 63785 "朗" 63784 "廊" 63783 "蠟" 63782 "臘" 63781 "拉" 63780 "襤" 63779 "藍" 63778 "濫" 63777 "嵐" 63776 "鸞" 63775 "蘭" 63774 "爛" 63773 "欄" 63772 "卵" 63771 "亂" 63770 "駱" 63769 "酪" 63768 "落" 63767 "珞" 63766 "烙" 63765 "洛" 63764 "樂" 63763 "邏" 63762 "裸" 63761 "螺" 63760 "蘿" 63759 "羅" 63758 "癩" 63757 "懶" 63756 "奈" 63755 "喇" 63754 "金" 63753 "契" 63752 "龜" 63751 "龜" 63750 "句" 63749 "串" 63748 "滑" 63747 "賈" 63746 "車" 63745 "更" 63744 "豈" 55291 "ᄑᄐ" 55290 "ᄑᄉ" 55289 "ᄌᄌ" 55288 "ᄌᄇᄇ" 55287 "ᄌᄇ" 55286 "ᅌᄒ" 55285 "ᅌᄆ" 55284 "ᅀᄇᄋ" 55283 "ᅀᄇ" 55282 "ᄅᄒ" 55281 "ᄉᄐ" 55280 "ᄉᄎ" 55279 "ᄉᄌ" 55278 "ᄉᅀ" 55277 "ᄉᄉᄃ" 55276 "ᄉᄉᄀ" 55275 "ᄉᄇᄋ" 55274 "ᄉᄆ" 55273 "ᄇᄎ" 55272 "ᄇᄌ" 55271 "ᄇᄉᄃ" 55270 "ᄇᄇ" 55269 "ᄇᄆ" 55268 "ᄇᄅᄑ" 55267 "ᄇᄃ" 55266 "ᄆᄌ" 55265 "ᄆᄇᄉ" 55264 "ᄆᄆ" 55263 "ᄆᄂᄂ" 55262 "ᄆᄂ" 55261 "ᄅᄋ" 55260 "ᄅᅙᄒ" 55259 "ᄅᅌ" 55258 "ᄅᄇᄑ" 55257 "ᄅᄇᄃ" 55256 "ᄅᄆᄒ" 55255 "ᄅᄅᄏ" 55254 "ᄅᄀᄒ" 55253 "ᄅᄀᄀ" 55252 "ᄃᄐ" 55251 "ᄃᄎ" 55250 "ᄃᄌ" 55249 "ᄃᄉᄀ" 55248 "ᄃᄉ" 55247 "ᄃᄇ" 55246 "ᄃᄃᄇ" 55245 "ᄃᄃ" 55244 "ᄂᄎ" 55243 "ᄂᄅ" 55238 "ᆞᅥᅵ" 55237 "ᆞᅡ" 55236 "丨丨" 55235 "ᅵᅲ" 55234 "ᅵᅭ" 55233 "ᅵᅩᅵ" 55232 "ᅵᅧᅵ" 55231 "ᅵᅧ" 55230 "ᅵᅣᅵ" 55229 "ᅵᅣᅩ" 55228 "ᅳᅩ" 55227 "ᅳᅥᅵ" 55226 "ᅳᅥ" 55225 "ᅳᅡ" 55224 "ᅲᅩ" 55223 "ᅲᅡᅵ" 55222 "ᅮᅵᅵ" 55221 "ᅮᅧ" 55220 "ᅭᅥ" 55219 "ᅭᅡᅵ" 55218 "ᅭᅡ" 55217 "ᅩᅩᅵ" 55216 "ᅩᅧ" 43606 "ꨣ" 43603 "ꨁ" 43462 "꧐" 43388 "ᅙᅙ" 43387 "ᄒᄉ" 43386 "ᄑᄒ" 43385 "ᄐᄐ" 43384 "ᄌᄌᄒ" 43383 "ᄋᄒ" 43382 "ᄋᄅ" 43381 "ᄉᄉᄇ" 43380 "ᄇᄒ" 43379 "ᄇᄏ" 43378 "ᄇᄉᄐ" 43377 "ᄆᄉ" 43376 "ᄆᄃ" 43375 "ᄆᄀ" 43374 "ᄅᄏ" 43373 "ᄅᄌ" 43372 "ᄅᄉ" 43371 "ᄅᄇᄋ" 43370 "ᄅᄇᄇ" 43369 "ᄅᄇ" 43368 "ᄅᄆ" 43367 "ᄅᄃᄃ" 43366 "ᄅᄃ" 43365 "ᄅᄀᄀ" 43364 "ᄅᄀ" 43363 "ᄃᄌ" 43362 "ᄃᄉ" 43361 "ᄃᄇ" 43360 "ᄃᄆ" 42892 "'" 42889 ":" 42874 "Ꝺ" 42872 "&" 42871 "tf" 42862 "9" 42859 "ȝ" 42858 "3" 42849 "vy" 42842 "2" 42831 "oo" 42830 "OO" 42813 "ay" 42812 "AY" 42811 "av" 42810 "AV" 42809 "av" 42808 "AV" 42807 "au" 42806 "AU" 42805 "ao" 42804 "AO" 42803 "aa" 42802 "AA" 42801 "s" 42793 "tȝ" 42792 "T3" 42774 "˪" 42772 "˫" 42622 "ˇ" 42565 "ƨ" 42564 "2" 42510 "." 42239 "=" 42238 "-." 42237 ":" 42235 "." 42234 ".." 42232 "." 42231 "ᗡ" 42228 "U" 42227 "O" 42226 "l" 42225 "Ǝ" 42224 "E" 42222 "A" 42221 "ᙠ" 42220 "Y" 42219 "X" 42218 "W" 42215 "H" 42214 "V" 42213 "Ʌ" 42212 "ᴚ" 42211 "R" 42210 "S" 42209 "L" 42208 "N" 42207 "M" 42206 "Ⅎ" 42205 "F" 42204 "Z" 42203 "Ɔ" 42202 "C" 42201 "J" 42199 "K" 42198 "G" 42196 "T" 42195 "D" 42194 "d" 42193 "P" 42192 "B" 42178 "ꎵ" 42176 "ꎫ" 42175 "ꉙ" 42174 "ꊱ" 42170 "ꎿ" 42160 "ꏂ" 42156 "ꁐ" 42152 "ꄲ" 42151 "ꑘ" 42142 "ꁊ" 42140 "ꃀ" 42132 "ꋍ" 40899 "䀹" 40658 "黑" 40515 "鹂" 38584 "隷" 37806 "鎭" 37086 "郎" 36647 "軿" 36507 "躗" 36346 "跥" 36230 "赿" 35939 "豜" 35727 "讆" 35453 "訮" 35358 "䚶" 34369 "蘷" 34111 "蒍" 33191 "朣" 33089 "胼" 33063 "朘" 33025 "朓" 33014 "㬵" 32976 "朏" 32970 "朐" 32934 "朌" 32118 "絕" 30799 "研" 28505 "溈" 27175 "榝" 27113 "㮣" 26623 "杮" 26406 "䑃" 26358 "㫚" 26217 "晚" 26211 "䀿" 25609 "㩁" 25144 "戶" 24144 "㬺" 24114 "帡" 23296 "媯" 22783 "墫" 22635 "塡" 21855 "啓" 20540 "値" 20482 "併" 20031 "/" 20022 "\\" 19968 "ー" 17440 "㬻" 17307 "㖈" 14771 "㘽" 13310 "3l日" 13309 "3O日" 13308 "29日" 13307 "28日" 13306 "27日" 13305 "26日" 13304 "25日" 13303 "24日" 13302 "23日" 13301 "22日" 13300 "2l日" 13299 "2O日" 13298 "l9日" 13297 "l8日" 13296 "l7日" 13295 "l6日" 13294 "l5日" 13293 "l4日" 13292 "l3日" 13291 "l2日" 13290 "ll日" 13289 "lO日" 13288 "9日" 13287 "8日" 13286 "7日" 13285 "6日" 13284 "5日" 13283 "4日" 13282 "3日" 13281 "2日" 13280 "l日" 13168 "24点" 13167 "23点" 13166 "22点" 13165 "2l点" 13164 "2O点" 13163 "l9点" 13162 "l8点" 13161 "l7点" 13160 "l6点" 13159 "l5点" 13158 "l4点" 13157 "l3点" 13156 "l2点" 13155 "ll点" 13154 "lO点" 13153 "9点" 13152 "8点" 13151 "7点" 13150 "6点" 13149 "5点" 13148 "4点" 13147 "3点" 13146 "2点" 13145 "l点" 13144 "O点" 13003 "l2月" 13002 "ll月" 13001 "lO月" 13000 "9月" 12999 "8月" 12998 "7月" 12997 "6月" 12996 "5月" 12995 "4月" 12994 "3月" 12993 "2月" 12992 "l月" 12867 "(至)" 12866 "(自)" 12865 "(休)" 12864 "(祭)" 12863 "(協)" 12862 "(資)" 12861 "(企)" 12860 "(監)" 12859 "(学)" 12858 "(呼)" 12857 "(代)" 12856 "(労)" 12855 "(祝)" 12854 "(財)" 12853 "(特)" 12852 "(名)" 12851 "(社)" 12850 "(有)" 12849 "(株)" 12848 "(日)" 12847 "(土)" 12846 "(金)" 12845 "(木)" 12844 "(水)" 12843 "(火)" 12842 "(月)" 12841 "(十)" 12840 "(九)" 12839 "(八)" 12838 "(七)" 12837 "(六)" 12836 "(五)" 12835 "(四)" 12834 "(三)" 12833 "(二)" 12832 "(ー)" 12830 "(오후)" 12829 "(오전)" 12828 "(주)" 12827 "(하)" 12826 "(파)" 12825 "(타)" 12824 "(카)" 12823 "(차)" 12822 "(자)" 12821 "(아)" 12820 "(사)" 12819 "(바)" 12818 "(마)" 12817 "(라)" 12816 "(다)" 12815 "(나)" 12814 "(가)" 12813 "(ᄒ)" 12812 "(ᄑ)" 12811 "(ᄐ)" 12810 "(ᄏ)" 12809 "(ᄎ)" 12808 "(ᄌ)" 12807 "(ᄋ)" 12806 "(ᄉ)" 12805 "(ᄇ)" 12804 "(ᄆ)" 12803 "(ᄅ)" 12802 "(ᄃ)" 12801 "(ᄂ)" 12800 "(ᄀ)" 12768 "乙" 12767 "乚" 12762 "亅" 12758 "乛" 12756 "\\" 12755 "/" 12753 "丨" 12752 "ー" 12686 "ᆞᅵ" 12685 "ᆞ" 12684 "ᅲᅵ" 12683 "ᅲᅧᅵ" 12682 "ᅲᅧ" 12681 "ᅭᅵ" 12680 "ᅭᅣᅵ" 12679 "ᅭᅣ" 12678 "ᅙ" 12677 "ᄒᄒ" 12676 "ᄑᄋ" 12675 "ᄋᅀ" 12674 "ᄋᄉ" 12673 "ᅌ" 12672 "ᄋᄋ" 12671 "ᅀ" 12670 "ᄉᄌ" 12669 "ᄉᄇ" 12668 "ᄉᄃ" 12667 "ᄉᄂ" 12666 "ᄉᄀ" 12665 "ᄇᄇᄋ" 12664 "ᄇᄋ" 12663 "ᄇᄐ" 12662 "ᄇᄌ" 12661 "ᄇᄉᄃ" 12660 "ᄇᄉᄀ" 12659 "ᄇᄃ" 12658 "ᄇᄀ" 12657 "ᄆᄋ" 12656 "ᄆᅀ" 12655 "ᄆᄉ" 12654 "ᄆᄇ" 12653 "ᄅᅙ" 12652 "ᄅᅀ" 12651 "ᄅᄇᄉ" 12650 "ᄅᄃ" 12649 "ᄅᄀᄉ" 12648 "ᄂᅀ" 12647 "ᄂᄉ" 12646 "ᄂᄃ" 12645 "ᄂᄂ" 12644 "ᅠ" 12643 "丨" 12642 "ー丨" 12641 "ー" 12640 "ᅲ" 12639 "ᅮᅵ" 12638 "ᅮᅥᅵ" 12637 "ᅮᅥ" 12636 "ᅮ" 12635 "ᅭ" 12634 "ᅩᅵ" 12633 "ᅩᅡᅵ" 12632 "ᅩᅡ" 12631 "ᅩ" 12630 "ᅧᅵ" 12629 "ᅧ" 12628 "ᅥᅵ" 12627 "ᅥ" 12626 "ᅣᅵ" 12625 "ᅣ" 12624 "ᅡᅵ" 12623 "ᅡ" 12622 "ᄒ" 12621 "ᄑ" 12620 "ᄐ" 12619 "ᄏ" 12618 "ᄎ" 12617 "ᄌᄌ" 12616 "ᄌ" 12615 "ᄋ" 12614 "ᄉᄉ" 12613 "ᄉ" 12612 "ᄇᄉ" 12611 "ᄇᄇ" 12610 "ᄇ" 12609 "ᄆ" 12608 "ᄅᄒ" 12607 "ᄅᄑ" 12606 "ᄅᄐ" 12605 "ᄅᄉ" 12604 "ᄅᄇ" 12603 "ᄅᄆ" 12602 "ᄅᄀ" 12601 "ᄅ" 12600 "ᄃᄃ" 12599 "ᄃ" 12598 "ᄂᄒ" 12597 "ᄂᄌ" 12596 "ᄂ" 12595 "ᄀᄉ" 12594 "ᄀᄀ" 12593 "ᄀ" 12539 "·" 12504 "へ" 12444 "゚" 12443 "゙" 12442 "̊" 12346 "卅" 12345 "卄" 12344 "十" 12342 "〒" 12339 "/" 12333 "̥" 12332 "̉" 12315 "⟧" 12309 ")" 12308 "(" 12297 "❭" 12296 "❬" 12295 "O" 12291 "''" 12290 "˳" 12245 "龠" 12244 "龜" 12243 "龍" 12242 "齒" 12241 "齊" 12240 "鼻" 12239 "鼠" 12238 "鼓" 12237 "鼎" 12236 "黽" 12235 "黹" 12234 "黑" 12233 "黍" 12232 "黃" 12231 "麻" 12230 "麥" 12229 "鹿" 12228 "鹵" 12227 "鳥" 12226 "魚" 12225 "鬼" 12224 "鬲" 12223 "鬯" 12222 "鬥" 12221 "髟" 12220 "高" 12219 "骨" 12218 "馬" 12217 "香" 12216 "首" 12215 "食" 12214 "飛" 12213 "風" 12212 "頁" 12211 "音" 12210 "韭" 12209 "韋" 12208 "革" 12207 "面" 12206 "非" 12205 "靑" 12204 "雨" 12203 "隹" 12202 "隶" 12201 "阜" 12200 "門" 12199 "長" 12198 "金" 12197 "里" 12196 "釆" 12195 "酉" 12194 "邑" 12193 "辵" 12192 "辰" 12191 "辛" 12190 "車" 12189 "身" 12188 "足" 12187 "走" 12186 "赤" 12185 "貝" 12184 "豸" 12183 "豕" 12182 "豆" 12181 "谷" 12180 "言" 12179 "角" 12178 "見" 12177 "襾" 12176 "衣" 12175 "行" 12174 "血" 12173 "虫" 12172 "虍" 12171 "艸" 12170 "色" 12169 "艮" 12168 "舟" 12167 "舛" 12166 "舌" 12165 "臼" 12164 "至" 12163 "自" 12162 "臣" 12161 "肉" 12160 "聿" 12159 "耳" 12158 "耒" 12157 "而" 12156 "老" 12155 "羽" 12154 "羊" 12153 "网" 12152 "缶" 12151 "糸" 12150 "米" 12149 "竹" 12148 "立" 12147 "穴" 12146 "禾" 12145 "禸" 12144 "示" 12143 "石" 12142 "矢" 12141 "矛" 12140 "目" 12139 "皿" 12138 "皮" 12137 "白" 12136 "癶" 12135 "疒" 12134 "疋" 12133 "田" 12132 "用" 12131 "生" 12130 "甘" 12129 "瓦" 12128 "瓜" 12127 "玉" 12126 "玄" 12125 "犬" 12124 "牛" 12123 "牙" 12122 "片" 12121 "爿" 12120 "爻" 12119 "父" 12118 "爪" 12117 "火" 12116 "水" 12115 "气" 12114 "氏" 12113 "毛" 12112 "比" 12111 "毋" 12110 "殳" 12109 "歹" 12108 "止" 12107 "欠" 12106 "木" 12105 "月" 12104 "曰" 12103 "日" 12102 "无" 12101 "方" 12100 "斤" 12099 "斗" 12098 "文" 12097 "攴" 12096 "支" 12095 "手" 12094 "戶" 12093 "戈" 12092 "心" 12091 "彳" 12090 "彡" 12089 "彐" 12088 "弓" 12087 "弋" 12086 "廾" 12085 "廴" 12084 "广" 12083 "幺" 12082 "干" 12081 "巾" 12080 "己" 12079 "工" 12078 "巛" 12077 "山" 12076 "屮" 12075 "尸" 12074 "尢" 12073 "小" 12072 "寸" 12071 "宀" 12070 "子" 12069 "女" 12068 "大" 12067 "夕" 12066 "夊" 12065 "夂" 12064 "士" 12063 "土" 12062 "囗" 12061 "口" 12060 "又" 12059 "厶" 12058 "厂" 12057 "卩" 12056 "卜" 12055 "十" 12054 "匸" 12053 "匚" 12052 "匕" 12051 "勹" 12050 "力" 12049 "刀" 12048 "凵" 12047 "几" 12046 "冫" 12045 "冖" 12044 "冂" 12043 "八" 12042 "入" 12041 "儿" 12040 "人" 12039 "亠" 12038 "二" 12037 "亅" 12036 "乙" 12035 "/" 12034 "\\" 12033 "丨" 12032 "ー" 12019 "龟" 12018 "亀" 12016 "龙" 12015 "竜" 12014 "齿" 12013 "歯" 12012 "齐" 12011 "斉" 12009 "黄" 12008 "麦" 12005 "鱼" 12004 "鬼" 12002 "马" 12000 "饣" 11999 "飠" 11997 "食" 11996 "飞" 11995 "风" 11994 "页" 11993 "韦" 11992 "青" 11990 "阝" 11988 "门" 11987 "长" 11986 "镸" 11985 "長" 11984 "钅" 11983 "阝" 11981 "辶" 11980 "辶" 11979 "车" 11977 "贝" 11976 "讠" 11973 "见" 11972 "西" 11971 "覀" 11970 "衤" 11969 "虎" 11968 "艹" 11967 "艹" 11966 "艹" 11962 "肀" 11961 "耂" 11954 "罒" 11953 "罓" 11951 "糹" 11949 "礻" 11947 "罒" 11944 "犭" 11942 "丬" 11940 "爫" 11939 "灬" 11938 "氺" 11937 "氵" 11936 "民" 11935 "母" 11934 "歺" 11931 "旡" 11929 "攵" 11928 "扌" 11927 "㣺" 11926 "忄" 11924 "彑" 11923 "幺" 11922 "巳" 11920 "尢" 11919 "尣" 11918 "兀" 11915 "㔾" 11913 "刂" 11909 "亻" 11907 "乚" 11824 "˳" 11616 "ᐃ" 11613 "X" 11604 "O" 11599 "l" 11593 "Ʃ" 11578 "Ǝ" 11577 "E" 11576 "V" 11575 "Ʌ" 11569 "O̵" 11518 "·ᐳ" 11513 "\\\\" 11497 "☧" 11492 "ϗ" 11484 "Ϭ" 11474 "6" 11473 "ʟ" 11472 "L" 11469 "ȝ" 11468 "3" 11466 "9" 11462 "/" 11453 "ш" 11452 "Ш" 11450 "-" 11444 "ᐸ·" 11441 "ω" 11438 "Ψ" 11437 "χ" 11436 "X" 11435 "ɸ" 11434 "Φ" 11432 "Y" 11430 "T" 11429 "c" 11428 "C" 11427 "p" 11426 "P" 11424 "Π" 11423 "o" 11422 "O" 11418 "N" 11416 "M" 11414 "λ" 11413 "k" 11412 "K" 11410 "l" 11406 "H" 11401 "ɛ" 11400 "Ɛ" 11398 "ᐃ" 11397 "r" 11396 "ᒥ" 11369 "K̩" 11367 "H̩" 11005 "//" 11003 "///" 10870 "===" 10869 "==" 10868 "::=" 10815 "∐" 10814 "⨟" 10813 "⌙" 10800 "ẋ" 10799 "x" 10785 "↾" 10784 "≫" 10781 "⋈" 10764 "ʃʃʃʃ" 10758 "⊔" 10757 "⊓" 10756 "⊎" 10755 "⊍" 10754 "⊗" 10753 "⊕" 10752 "⊙" 10745 "\\" 10744 "/" 10742 "/̄" 10741 "\\" 10713 "⦚" 10692 "〼" 10686 "◎" 10540 "x" 10539 "x" 10217 "❭" 10216 "❬" 10201 "T" 10178 "ꓕ" 10101 "}" 10100 "{" 10099 ")" 10098 "(" 10095 ">" 10094 "<" 10089 ")" 10088 "(" 9900 "॰" 9826 "⋄" 9793 "⊕" 9784 "⎈" 9776 "Ⲷ" 9744 "□" 9737 "⊙" 9702 "°" 9696 "⌒" 9675 "°" 9674 "⋄" 9671 "⋄" 9658 "▶" 9656 "▶" 9655 "⊲" 9649 "⏥" 9632 "∎" 9629 "▘" 9623 "▖" 9620 "ˉ" 9616 "▌" 9608 "∎" 9587 "x" 9585 "/" 9507 "├" 9487 "┌" 9475 "│" 9473 "ー" 9472 "ー" 9435 "Ⓘ" 9413 "℗" 9397 "(z)" 9396 "(y)" 9395 "(x)" 9394 "(vv)" 9393 "(v)" 9392 "(u)" 9391 "(t)" 9390 "(s)" 9389 "(r)" 9388 "(q)" 9387 "(p)" 9386 "(o)" 9385 "(n)" 9384 "(rn)" 9383 "(I)" 9382 "(k)" 9381 "(j)" 9380 "(i)" 9379 "(h)" 9378 "(g)" 9377 "(f)" 9376 "(e)" 9375 "(d)" 9374 "(c)" 9373 "(b)" 9372 "(a)" 9371 "2O." 9370 "l9." 9369 "l8." 9368 "l7." 9367 "l6." 9366 "l5." 9365 "l4." 9364 "l3." 9363 "l2." 9362 "ll." 9361 "lO." 9360 "9." 9359 "8." 9358 "7." 9357 "6." 9356 "5." 9355 "4." 9354 "3." 9353 "2." 9352 "l." 9351 "(2O)" 9350 "(l9)" 9349 "(l8)" 9348 "(l7)" 9347 "(l6)" 9346 "(l5)" 9345 "(l4)" 9344 "(l3)" 9343 "(l2)" 9342 "(ll)" 9341 "(lO)" 9340 "(9)" 9339 "(8)" 9338 "(7)" 9337 "(6)" 9336 "(5)" 9335 "(4)" 9334 "(3)" 9333 "(2)" 9332 "(I)" 9321 "➉" 9320 "➈" 9319 "➇" 9318 "➆" 9317 "➅" 9316 "➄" 9315 "➃" 9314 "➂" 9313 "➁" 9312 "➀" 9290 "\\\\" 9134 "丨" 9130 "丨" 9125 "丨" 9122 "丨" 9119 "丨" 9116 "丨" 9082 "a" 9077 "ω" 9076 "p" 9075 "i" 9068 "O̵" 9002 "❭" 9001 "❬" 8997 "⌤" 8967 "︴" 8960 "∅" 8959 "E" 8948 "ɛ" 8943 "···" 8942 "⁝" 8901 "·" 8899 "∪" 8898 "ꓵ" 8897 "v" 8896 "∧" 8869 "ꓕ" 8861 "O̵" 8854 "O̵" 8803 "≡" 8764 "~" 8758 ":" 8752 "∮∮∮" 8751 "∮∮" 8749 "ʃʃʃ" 8748 "ʃʃ" 8747 "ʃ" 8745 "ꓵ" 8744 "v" 8741 "ll" 8739 "l" 8729 "·" 8728 "°" 8727 "*" 8726 "\\" 8725 "/" 8722 "-" 8721 "Ʃ" 8719 "Π" 8710 "ᐃ" 8707 "Ǝ" 8704 "ꓯ" 8629 "↲" 8580 "ɔ" 8579 "Ɔ" 8575 "rn" 8574 "d" 8573 "c" 8572 "l" 8571 "xii" 8570 "xi" 8569 "x" 8568 "ix" 8567 "viii" 8566 "vii" 8565 "vi" 8564 "v" 8563 "iv" 8562 "iii" 8561 "ii" 8560 "i" 8559 "M" 8558 "D" 8557 "C" 8556 "L" 8555 "XII" 8554 "XI" 8553 "X" 8552 "IX" 8551 "VIII" 8550 "VII" 8549 "VI" 8548 "V" 8547 "IV" 8546 "lll" 8545 "ll" 8544 "l" 8521 "j" 8520 "i" 8519 "e" 8518 "d" 8517 "D" 8514 "ꓶ" 8513 "ꓨ" 8512 "Ʃ" 8511 "Π" 8510 "ᒥ" 8509 "y" 8508 "n" 8507 "FAX" 8505 "i" 8504 "ד" 8503 "ג" 8502 "ב" 8501 "א" 8500 "o" 8499 "M" 8497 "F" 8496 "E" 8495 "e" 8494 "e" 8493 "C" 8492 "B" 8490 "K" 8489 "ɿ" 8488 "Z" 8487 "Ʊ" 8486 "ᘯ" 8484 "Z" 8481 "TEL" 8477 "R" 8476 "R" 8475 "R" 8474 "Q" 8473 "P" 8470 "No" 8469 "N" 8467 "l" 8466 "L" 8465 "l" 8464 "l" 8463 "h̵" 8462 "h" 8461 "H" 8460 "H" 8459 "H" 8458 "g" 8457 "°F" 8456 "Э" 8455 "Ɛ" 8454 "º/₀₀" 8453 "º/₀₀" 8451 "°C" 8450 "C" 8449 "º/₀₀" 8448 "º/₀₀" 8364 "Ɛ" 8363 "ḏ̵" 8361 "W̵" 8360 "Rs" 8356 "£" 8304 "º" 8287 " " 8282 ":" 8279 "''''" 8275 "~" 8274 "º/₀₀" 8270 "*" 8265 "!?" 8264 "?!" 8263 "??" 8260 "/" 8259 "-" 8257 "/" 8254 "ˉ" 8252 "!!" 8250 ">" 8249 "<" 8247 "'''" 8246 "''" 8245 "'" 8244 "'''" 8243 "''" 8242 "'" 8241 "º/₀₀₀" 8240 "º/₀₀" 8239 " " 8233 " " 8232 " " 8231 "·" 8230 "..." 8229 ".." 8228 "." 8226 "·" 8223 "''" 8221 "''" 8220 "''" 8219 "'" 8218 "," 8217 "'" 8216 "'" 8214 "ll" 8213 "ー" 8212 "ー" 8211 "-" 8210 "-" 8209 "-" 8208 "-" 8202 " " 8201 " " 8200 " " 8199 " " 8198 " " 8197 " " 8196 " " 8195 " " 8194 " " 8193 " " 8192 " " 8190 "'" 8189 "'" 8175 "'" 8128 "~" 8127 "'" 8126 "i" 8125 "'" 8061 "ῴ" 7935 "y" 7837 "f" 7834 "ả" 7586 "ᵍ" 7583 "ᵋ" 7564 "y" 7555 "g" 7544 "ᴴ" 7506 "º" 7467 "л" 7465 "ᴘ" 7464 "n" 7463 "ʌ" 7462 "r" 7460 "ƨ" 7458 "z" 7457 "vv" 7456 "v" 7452 "u" 7451 "t" 7444 "ǝo" 7441 "o" 7440 "ɔ" 7439 "o" 7435 "k" 7432 "ɜ" 7428 "c" 7004 "᭐" 7000 "ᬨ" 6995 "ᬑ" 6994 "ᬍ" 6800 "ᩅ" 6784 "ᩅ" 6609 "ᦱ" 6608 "ᦞ" 6294 "ᡜ" 6229 "ᠵ" 6158 " " 6153 ":" 6147 ":" 6106 "๛" 6105 "๏" 6101 "๚" 6100 "ฯ" 6099 "̊" 6091 "่" 6086 "̊" 6074 "ื" 6073 "ึ" 6072 "ี" 6071 "ิ" 6051 "អ" 5941 "/" 5760 " " 5750 "ᖖᒑ" 5749 "ᖖᒐ" 5748 "ᖖᒎ" 5747 "ᖖJ" 5746 "ᖖᒌ" 5745 "ᖖᒋ" 5744 "ᖕᒉ" 5743 "ᕐᑫ" 5742 "x" 5741 "X" 5685 "ᘯ" 5684 "Ʊ" 5678 "Ʊ" 5668 "ᕊ" 5667 "ᕆ" 5666 "ᕃ" 5639 "ᓚ" 5636 "ᓓ" 5635 "ᒉ" 5634 "ᒐ" 5623 "B" 5616 "M" 5610 "D" 5598 "D" 5573 "A" 5556 "F" 5551 "b" 5524 "ᖕᒑ" 5523 "ᖕᒐ" 5522 "ᖕᒎ" 5521 "ᖕJ" 5520 "ᖕᒌ" 5519 "ᖕᒋ" 5518 "ᖕᒊ" 5511 "R" 5509 "ᕐᒃ" 5508 "ᕐᑳ" 5507 "ᕐᑲ" 5506 "ᕐᑰ" 5505 "ᕐd" 5504 "ᕐᑮ" 5503 "ᕐP" 5502 "ᕐᑬ" 5501 "x" 5500 "H" 5495 "ẟ" 5481 "ᕧ·" 5480 "·ᕧ" 5468 "ᕚ·" 5467 "·ᕚ" 5455 "ᕌ·" 5454 "·ᕌ" 5441 "x" 5440 "ᐩ" 5436 "ᔮ·" 5435 "·ᔮ" 5434 "ᔭ·" 5433 "·ᔭ" 5432 "ᔫ·" 5431 "·ᔫ" 5430 "ᔪ·" 5429 "·ᔪ" 5428 "ᔩ·" 5427 "·ᔩ" 5426 "ᔨ·" 5425 "·ᔨ" 5424 "4·" 5423 "·4" 5412 "ᔖ·" 5411 "·ᔖ" 5410 "ᔕ·" 5409 "·ᔕ" 5408 "ᔔ·" 5407 "·ᔔ" 5406 "ᔓ·" 5405 "·ᔓ" 5404 "ᔒ·" 5403 "·ᔒ" 5402 "ᔑ·" 5401 "·ᔑ" 5400 "ᔐ·" 5399 "·ᔐ" 5391 "ᔋᒐ" 5390 "ᔋᑲ" 5389 "ᔋᑕ" 5388 "ᔋᐸ" 5379 "ᓵ·" 5378 "·ᓵ" 5377 "ᓴ·" 5376 "·ᓴ" 5375 "ᓲ·" 5374 "·ᓲ" 5373 "ᓱ·" 5372 "·ᓱ" 5371 "ᓰ·" 5370 "·ᓰ" 5369 "ᓯ·" 5368 "·ᓯ" 5367 "ᓭ·" 5366 "·ᓭ" 5353 "ᓛ·" 5352 "·ᓛ" 5351 "ᓚ·" 5350 "·ᓚ" 5349 "ᓘ·" 5348 "·ᓘ" 5347 "ᓗ·" 5346 "·ᓗ" 5345 "ᓖ·" 5344 "·ᓖ" 5343 "ᓕ·" 5342 "·ᓕ" 5341 "ᓓ·" 5340 "·ᓓ" 5329 "ᐡ" 5326 "ᓈᒫ" 5325 "·ᓈ" 5324 "ᓇ·" 5323 "·ᓇ" 5322 "ᓀ·" 5321 "·ᓀ" 5311 "2" 5305 "ᒫ·" 5304 "·ᒫ" 5303 "l·" 5302 "·L" 5301 "ᒨ·" 5300 "·ᒨ" 5299 "ᒧ·" 5298 "·ᒧ" 5297 "ᒦ·" 5296 "·ᒦ" 5295 "ᒥ·" 5294 "·ᒥ" 5293 "ᒣ·" 5292 "·ᒣ" 5290 "L" 5279 "ᒑ·" 5278 "·ᒑ" 5277 "ᒐ·" 5276 "·ᒐ" 5275 "ᒎ·" 5274 "·ᒎ" 5273 "J·" 5272 "·J" 5271 "ᒌ·" 5270 "·ᒌ" 5269 "ᒋ·" 5268 "·ᒋ" 5267 "ᒉ·" 5266 "·ᒉ" 5261 "J" 5256 "ᑲᑊ" 5255 "dᑊ" 5254 "Pᑊ" 5253 "ᑫᑊ" 5249 "ᑳ·" 5248 "·ᑳ" 5247 "ᑲ·" 5246 "·ᑲ" 5245 "ᑰ·" 5244 "·ᑰ" 5243 "d·" 5242 "·d" 5241 "ᑮ·" 5240 "·ᑮ" 5239 "p·" 5238 "·P" 5237 "ᑫ·" 5236 "·ᑫ" 5231 "d" 5229 "P" 5226 "ᑕᑊ" 5225 "ᑐᑊ" 5224 "ᑎᑊ" 5223 "Uᑊ" 5220 "ᑖ·" 5219 "·ᑖ" 5218 "ᑕ·" 5217 "·ᑕ" 5216 "ᑑ·" 5215 "·ᑑ" 5214 "ᑐ·" 5213 "·ᑐ" 5212 "ᑏ·" 5211 "·ᑏ" 5210 "ᑎ·" 5209 "·ᑎ" 5208 "U·" 5207 "·U" 5204 "·ᑐ" 5196 "U" 5191 "ᐹ·" 5190 "·ᐹ" 5189 "ᐸ·" 5188 "·ᐸ" 5187 "ᐴ·" 5186 "·ᐴ" 5185 "ᐳ·" 5184 "·ᐳ" 5175 "·ᐳ" 5169 "Ʌ" 5167 "V" 5159 "·" 5146 "ᐋ·" 5145 "·ᐋ" 5144 "ᐊ·" 5143 "·ᐊ" 5141 "ᐆ·" 5140 "·ᐆ" 5139 "ᐅ·" 5138 "·ᐅ" 5137 "ᐄ·" 5136 "·ᐄ" 5135 "ᐃ·" 5134 "·ᐃ" 5133 "ᐁ·" 5132 "·ᐁ" 5108 "B" 5107 "G" 5106 "h̔" 5095 "J" 5094 "K" 5090 "P" 5087 "C" 5086 "L" 5082 "S" 5081 "V" 5077 "S" 5076 "W" 5074 "R" 5071 "b" 5070 "4" 5059 "Z" 5058 "h" 5056 "G" 5054 "O̵" 5053 "Y" 5051 "H" 5047 "M" 5043 "W" 5041 "ᒥ" 5040 "Ⱶ" 5036 "E" 5035 "J" 5034 "A" 5033 "Y" 5029 "i" 5026 "T" 5025 "R" 5024 "D" 4607 "ᄂᄂ" 4606 "ᄀᄒ" 4605 "ᄀᄏ" 4604 "ᄀᄎ" 4603 "ᄀᄇ" 4602 "ᄀᄂ" 4601 "ᅙ" 4600 "ᄒᄇ" 4599 "ᄒᄆ" 4598 "ᄒᄅ" 4597 "ᄒᄂ" 4596 "ᄑᄋ" 4595 "ᄑᄇ" 4594 "ᄋᅀ" 4593 "ᄋᄉ" 4592 "ᅌ" 4591 "ᄋᄏ" 4590 "ᄋᄋ" 4589 "ᄋᄀᄀ" 4588 "ᄋᄀ" 4587 "ᅀ" 4586 "ᄉᄇ" 4585 "ᄉᄅ" 4584 "ᄉᄃ" 4583 "ᄉᄀ" 4582 "ᄇᄋ" 4581 "ᄇᄒ" 4580 "ᄇᄑ" 4579 "ᄇᄅ" 4578 "ᄆᄋ" 4577 "ᄆᄒ" 4576 "ᄆᄎ" 4575 "ᄆᅀ" 4574 "ᄆᄉᄉ" 4573 "ᄆᄉ" 4572 "ᄆᄇ" 4571 "ᄆᄅ" 4570 "ᄆᄀ" 4569 "ᄅᅙ" 4568 "ᄅᄏ" 4567 "ᄅᅀ" 4566 "ᄅᄉᄉ" 4565 "ᄅᄇᄋ" 4564 "ᄅᄇᄒ" 4563 "ᄅᄇᄉ" 4562 "ᄅᄆᄉ" 4561 "ᄅᄆᄀ" 4560 "ᄅᄅ" 4559 "ᄅᄃᄒ" 4558 "ᄅᄃ" 4557 "ᄅᄂ" 4556 "ᄅᄀᄉ" 4555 "ᄃᄅ" 4554 "ᄃᄀ" 4553 "ᄂᄐ" 4552 "ᄂᅀ" 4551 "ᄂᄉ" 4550 "ᄂᄃ" 4549 "ᄂᄀ" 4548 "ᄀᄉᄀ" 4547 "ᄀᄅ" 4546 "ᄒ" 4545 "ᄑ" 4544 "ᄐ" 4543 "ᄏ" 4542 "ᄎ" 4541 "ᄌ" 4540 "ᄋ" 4539 "ᄉᄉ" 4538 "ᄉ" 4537 "ᄇᄉ" 4536 "ᄇ" 4535 "ᄆ" 4534 "ᄅᄒ" 4533 "ᄅᄑ" 4532 "ᄅᄐ" 4531 "ᄅᄉ" 4530 "ᄅᄇ" 4529 "ᄅᄆ" 4528 "ᄅᄀ" 4527 "ᄅ" 4526 "ᄃ" 4525 "ᄂᄒ" 4524 "ᄂᄌ" 4523 "ᄂ" 4522 "ᄀᄉ" 4521 "ᄀᄀ" 4520 "ᄀ" 4519 "ᅩᅣᅵ" 4518 "ᅩᅣ" 4517 "ᅧᅣ" 4516 "ᅣᅮ" 4515 "ᅡᅳ" 4514 "ᆞᆞ" 4513 "ᆞᅵ" 4512 "ᆞᅮ" 4511 "ᆞᅥ" 4509 "ᅵᆞ" 4508 "丨ー" 4507 "ᅵᅮ" 4506 "ᅵᅩ" 4505 "ᅵᅣ" 4504 "ᅵᅡ" 4503 "ᅳᅵᅮ" 4502 "ーー" 4501 "ᅳᅮ" 4500 "ᅲᅵ" 4499 "ᅲᅮ" 4498 "ᅲᅧᅵ" 4497 "ᅲᅧ" 4496 "ᅲᅥᅵ" 4495 "ᅲᅥ" 4494 "ᅲᅡ" 4493 "ᅮᅮ" 4492 "ᅮᅧᅵ" 4491 "ᅮᅥᅳ" 4490 "ᅮᅡᅵ" 4489 "ᅮᅡ" 4488 "ᅭᅵ" 4487 "ᅭᅩ" 4486 "ᅭᅣ" 4485 "ᅭᅣᅵ" 4484 "ᅭᅣ" 4483 "ᅩᅮ" 4482 "ᅩᅩ" 4481 "ᅩᅧᅵ" 4480 "ᅩᅥᅵ" 4479 "ᅩᅥ" 4478 "ᅧᅮ" 4477 "ᅧᅩ" 4476 "ᅥᅳ" 4475 "ᅥᅮ" 4474 "ᅥᅩ" 4473 "ᅣᅭ" 4472 "ᅣᅩ" 4471 "ᅡᅮ" 4470 "ᅡᅩ" 4469 "丨" 4468 "ー丨" 4467 "ー" 4465 "ᅮᅵ" 4464 "ᅮᅥᅵ" 4463 "ᅮᅥ" 4460 "ᅩᅵ" 4459 "ᅩᅡᅵ" 4458 "ᅩᅡ" 4456 "ᅧᅵ" 4454 "ᅥᅵ" 4452 "ᅣᅵ" 4450 "ᅡᅵ" 4446 "ᄃᄅ" 4445 "ᄂᄒ" 4444 "ᄂᄌ" 4443 "ᄂᄉ" 4442 "ᄀᄃ" 4440 "ᄒᄒ" 4439 "ᄑᄋ" 4438 "ᄑᄇ" 4435 "ᄎᄒ" 4434 "ᄎᄏ" 4433 "ᅐᅐ" 4431 "ᅎᅎ" 4429 "ᄌᄋ" 4427 "ᄋᄑ" 4426 "ᄋᄐ" 4425 "ᄋᄎ" 4424 "ᄋᄌ" 4423 "ᄋᄋ" 4422 "ᄋᅀ" 4421 "ᄋᄉ" 4420 "ᄋᄇ" 4419 "ᄋᄆ" 4418 "ᄋᄃ" 4417 "ᄋᄀ" 4415 "ᄾᄾ" 4413 "ᄼᄼ" 4411 "ᄅᄒ" 4410 "ᄉᄑ" 4409 "ᄉᄐ" 4408 "ᄉᄏ" 4407 "ᄉᄎ" 4406 "ᄉᄌ" 4405 "ᄉᄋ" 4404 "ᄉᄉᄉ" 4403 "ᄉᄇᄀ" 4402 "ᄉᄇ" 4401 "ᄉᄆ" 4400 "ᄉᄅ" 4399 "ᄉᄃ" 4398 "ᄉᄂ" 4397 "ᄉᄀ" 4396 "ᄇᄇᄋ" 4395 "ᄇᄋ" 4394 "ᄇᄑ" 4393 "ᄇᄐ" 4392 "ᄇᄎ" 4391 "ᄇᄌ" 4390 "ᄇᄉᄌ" 4389 "ᄇᄉᄉ" 4388 "ᄇᄉᄇ" 4387 "ᄇᄉᄃ" 4386 "ᄇᄉᄀ" 4385 "ᄇᄉ" 4384 "ᄇᄃ" 4383 "ᄇᄂ" 4382 "ᄇᄀ" 4381 "ᄆᄋ" 4380 "ᄆᄇ" 4379 "ᄅᄋ" 4378 "ᄅᄒ" 4377 "ᄅᄅ" 4376 "ᄅᄂ" 4375 "ᄃᄀ" 4374 "ᄂᄇ" 4373 "ᄂᄃ" 4372 "ᄂᄂ" 4371 "ᄂᄀ" 4365 "ᄌᄌ" 4362 "ᄉᄉ" 4360 "ᄇᄇ" 4356 "ᄃᄃ" 4353 "ᄀᄀ" 4339 "ȝ" 4327 "y" 4256 "Ꞇ" 4197 "၁" 4160 "o" 4152 "ঃ" 4150 "̊" 4125 "o" 3961 "ླཱྀ" 3959 "ྲཱྀ" 3946 "ར" 3852 "་" 3805 "ຫມ" 3804 "ຫນ" 3792 "o" 3789 "̊" 3787 "๋" 3786 "๊" 3785 "้" 3784 "่" 3769 "ู" 3768 "ุ" 3763 "̊າ" 3743 "ฟ" 3742 "พ" 3741 "ฝ" 3739 "ป" 3738 "บ" 3725 "ย" 3720 "จ" 3664 "o" 3661 "̊" 3653 "า" 3649 "เเ" 3635 "̊า" 3622 "ภ" 3617 "ฆ" 3607 "ฑ" 3605 "ค" 3604 "ค" 3599 "ฎ" 3595 "ช" 3587 "ข" 3468 "ന്ന" 3459 "ঃ" 3458 "o" 3439 "ന്" 3438 "വ്" 3435 "ദ്ര" 3434 "ര്" 3430 "o" 3425 "ഞ" 3400 "െെ" 3395 "ു" 3394 "ു" 3392 "ி" 3391 "ி" 3382 "ஶ" 3380 "ழ" 3377 "ര" 3363 "ண" 3360 "O" 3356 "ஐ" 3353 "നു" 3348 "ഒൗ" 3347 "ഒാ" 3344 "എെ" 3340 "നു" 3338 "உൗ" 3337 "உ" 3336 "ഇൗ" 3331 "ঃ" 3330 "o" 3311 "౯" 3304 "౨" 3303 "౧" 3302 "o" 3297 "ಌಾ" 3250 "ల" 3249 "ఱ" 3247 "య" 3235 "ణ" 3230 "ఞ" 3228 "జ" 3220 "ఒౌ" 3219 "ఒౕ" 3218 "ఒ" 3207 "ఇ" 3206 "ఆ" 3205 "అ" 3203 "ঃ" 3202 "o" 3174 "o" 3169 "ఌా" 3168 "ఋా" 3140 "ృా" 3138 "ుా" 3129 "వా" 3127 "వ̣" 3118 "వు" 3117 "బ̣" 3109 "ధּ" 3106 "డ̣" 3104 "రּ" 3092 "ఒౌ" 3091 "ఒౕ" 3075 "ঃ" 3074 "o" 3066 "நீ" 3064 "ஷ" 3063 "எவ" 3061 "௳" 3060 "மீ" 3058 "சூ" 3056 "ய" 3054 "அ" 3053 "எ" 3052 "சு" 3051 "ஈு" 3050 "ச" 3048 "உ" 3047 "க" 3046 "o" 3031 "ள" 3024 "C" 3021 "̇" 3020 "ெள" 3019 "ேஈ" 3018 "ெஈ" 3016 "ன" 3006 "ஈ" 2992 "ஈ" 2972 "ஐ" 2954 "உள" 2946 "̊" 2920 "9" 2918 "O" 2876 "̣" 2848 "O" 2822 "ଅା" 2819 "8" 2817 "̆̇" 2798 "८" 2794 "४" 2793 "३" 2792 "२" 2790 "o" 2765 "्" 2754 "ू" 2753 "ु" 2749 "ऽ" 2748 "̣" 2708 "અાૈ" 2707 "અાે" 2705 "અાૅ" 2704 "અૈ" 2703 "અે" 2701 "અૅ" 2694 "અા" 2691 ":" 2690 "̇" 2689 "̆̇" 2666 "8" 2663 "9" 2662 "o" 2637 "्" 2635 "ॆ" 2620 "̣" 2580 "ਅੌ" 2576 "ਅੈ" 2575 "ੲੇ" 2570 "ੳੂ" 2569 "ੳੁ" 2568 "ੲੀ" 2567 "ੲਿ" 2566 "ਅਾ" 2563 "ঃ" 2562 "̇" 2541 "9" 2538 "8" 2534 "O" 2529 "ঋৃ" 2528 "ঋৃ" 2492 "̣" 2438 "অা" 2433 "̆̇" 2429 "?" 2406 "o" 2388 "́" 2387 "̀" 2386 "̱" 2364 "̣" 2324 "अाै" 2323 "अाे" 2322 "अाॆ" 2321 "अॉ" 2320 "एे" 2318 "एॆ" 2317 "एॅ" 2312 "र्इ" 2310 "अा" 2308 "अॆ" 2307 ":" 2306 "̇" 2305 "̆̇" 2042 "_" 2037 "'" 2036 "'" 2035 "̈" 2030 "̂" 2029 "̇" 2027 "̄" 1994 "l" 1984 "O" 1955 "ޢ" 1953 "ޠ" 1951 "ޞ" 1946 "ޙ" 1863 "́" 1858 "ܼ" 1857 "̇" 1856 "̇" 1796 ":" 1795 ":" 1794 "." 1793 "." 1785 "٩" 1784 "٨" 1783 "٧" 1779 "٣" 1778 "٢" 1777 "١" 1776 "." 1772 "۟" 1749 "ه" 1748 "." 1744 "ٺ" 1740 "ى" 1731 "ö" 1730 "ۀ" 1729 "ه" 1726 "ه" 1723 "ٹ" 1705 "ك" 1684 "ز" 1668 "ڂ" 1664 "ٿ" 1659 "ٺ" 1656 "ىٴ" 1655 "ۇٴ" 1654 "وٴ" 1653 "اٴ" 1645 "*" 1644 "،" 1643 "," 1642 "º/₀₀" 1637 "o" 1632 "." 1615 "̓" 1610 "ى" 1606 "ب" 1582 "ج" 1577 "ö" 1574 "ىٴ" 1572 "وٴ" 1571 "اٴ" 1562 "ِ" 1561 "̓" 1560 "َ" 1546 "º/₀₀" 1545 "º/₀₀" 1524 "''" 1523 "'" 1522 "''" 1521 "l'" 1520 "ll" 1505 "o" 1503 "l" 1497 "'" 1496 "v" 1493 "l" 1477 "̣" 1476 "̇" 1475 ":" 1474 "̇" 1473 "̇" 1466 "̇" 1465 "̇" 1460 "̣" 1455 "̊" 1454 "֘" 1453 "֖" 1448 "֙" 1444 "֚" 1437 "́" 1436 "́" 1417 ":" 1415 "եւ" 1413 "o" 1412 "f" 1409 "g" 1405 "u" 1404 "n" 1402 "ɰ" 1400 "n" 1397 "j" 1392 "h" 1390 "ẟ" 1382 "q" 1379 "q" 1377 "vv" 1373 "'" 1370 "'" 1365 "O" 1363 "Φ" 1359 "S" 1357 "U" 1352 "ᑎ" 1349 "3" 1309 "vv" 1308 "W" 1307 "q" 1297 "ɛ" 1296 "Ɛ" 1293 "ɢ" 1292 "G" 1290 "Ƕ" 1281 "d" 1257 "o̵" 1256 "O̵" 1249 "ȝ" 1248 "3" 1241 "ǝ" 1240 "Ə" 1237 "ae" 1236 "AE" 1231 "i" 1230 "ᴍ̦" 1229 "M̦" 1228 "ҷ" 1227 "Ҷ" 1226 "ʜ̦" 1225 "H̦" 1224 "ʜ̦" 1223 "H̦" 1222 "л̦" 1221 "Ʌ̦" 1216 "l" 1215 "ҽ̨" 1214 "Ҽ̨" 1211 "h" 1202 "X̩" 1201 "y̵" 1200 "Y̵" 1199 "y" 1198 "Y" 1197 "t̩" 1196 "T̩" 1195 "c̦" 1194 "C̦" 1187 "ʜ̩" 1186 "H̩" 1183 "k̵" 1182 "K̵" 1179 "k̩" 1178 "K̩" 1177 "ɜ̦" 1176 "3̦" 1175 "ж̩" 1174 "Ж̩" 1171 "r̵" 1170 "ᒥ̵" 1169 "rᑊ" 1168 "ᒥᑊ" 1165 "b̵" 1164 "b̵" 1163 "й̦" 1162 "Ѝ̦" 1149 "vv҃" 1148 "Ѡ҃" 1141 "v" 1140 "V" 1139 "o̵" 1138 "O̵" 1137 "ψ" 1136 "Ψ" 1123 "b̵" 1122 "b̵" 1121 "vv" 1120 "ᗯ" 1117 "й" 1115 "h̵" 1112 "j" 1110 "i" 1109 "s" 1108 "ɛ" 1103 "ᴙ" 1100 "ƅ" 1099 "ьı" 1098 "ˉb" 1094 "u" 1093 "x" 1092 "ɸ" 1091 "y" 1090 "t" 1089 "c" 1088 "p" 1087 "n" 1086 "o" 1085 "ʜ" 1084 "ᴍ" 1082 "k" 1080 "ᴎ" 1079 "ɜ" 1077 "e" 1075 "r" 1074 "ʙ" 1073 "6" 1072 "a" 1068 "b" 1067 "bl" 1061 "X" 1060 "Φ" 1058 "T" 1057 "C" 1056 "P" 1055 "Π" 1054 "O" 1053 "H" 1052 "M" 1051 "Ʌ" 1050 "K" 1049 "Ѝ" 1048 "ⵍ" 1047 "3" 1045 "E" 1043 "ᒥ" 1042 "B" 1041 "b̄" 1040 "A" 1032 "J" 1030 "l" 1029 "S" 1028 "Ɛ" 1021 "Ɔ" 1018 "M" 1017 "C" 1016 "þ" 1015 "Þ" 1013 "ɛ" 1012 "O̵" 1011 "j" 1010 "c" 1009 "p" 1008 "k" 1001 "ƨ" 1000 "2" 988 "F" 982 "n" 981 "ɸ" 978 "Y" 977 "O̵" 976 "ß" 966 "ɸ" 965 "u" 964 "t" 963 "o" 961 "p" 960 "n" 959 "o" 957 "v" 954 "k" 953 "i" 952 "O̵" 951 "n̩" 949 "ɛ" 948 "ẟ" 947 "y" 946 "ß" 945 "a" 937 "ᘯ" 935 "X" 933 "Y" 932 "T" 931 "Ʃ" 929 "P" 927 "O" 925 "N" 924 "M" 923 "Ʌ" 922 "K" 921 "l" 920 "O̵" 919 "H" 918 "Z" 917 "E" 916 "ᐃ" 915 "ᒥ" 914 "B" 913 "A" 903 "·" 900 "'" 894 ";" 891 "ɔ" 890 "i" 885 "ˏ" 884 "'" 878 "̆" 870 "̊" 856 "̇" 839 "̳" 837 "̨" 835 "̓" 834 "̃" 833 "́" 832 "̀" 825 "̦" 823 "̸" 822 "̵" 807 "̦" 802 "̨" 801 "̦" 800 "̱" 789 "̓" 785 "̂" 784 "̆̇" 780 "̆" 773 "̄" 763 "˪" 760 ":" 758 "''" 756 "'" 750 "''" 733 "''" 732 "~" 731 "i" 730 "°" 729 "ॱ" 728 "ˇ" 727 "-" 723 "ՙ" 720 ":" 715 "'" 714 "'" 712 "ᑊ" 710 "^" 708 "^" 707 ">" 706 "<" 705 "ˤ" 703 "ՙ" 702 "'" 701 "'" 700 "'" 699 "'" 698 "''" 697 "'" 681 "fŋ" 680 "tɕ" 679 "tʃ" 678 "ts" 677 "dʑ" 676 "dȝ" 675 "dz" 672 "q̔" 660 "?" 658 "ȝ" 656 "z̨" 655 "y" 653 "rn" 651 "u" 642 "s̨" 637 "r̨" 636 "r̩" 630 "oᴇ" 629 "o̵" 627 "n̨" 626 "ņ" 625 "rn̦" 623 "vv" 621 "l̨" 619 "l̴" 618 "i" 617 "i" 616 "i̵" 614 "h̔" 609 "g" 608 "g̔" 602 "ǝ˞" 601 "ǝ" 599 "d̔" 598 "d̨" 595 "b̔" 593 "a" 577 "?" 567 "j" 551 "å" 550 "Å" 549 "z̦" 548 "Z̦" 547 "8" 546 "8" 540 "3" 539 "ţ" 538 "Ţ" 510 "Ó̸" 501 "ģ" 499 "dz" 498 "Dz" 497 "DZ" 487 "ğ" 486 "Ğ" 485 "g̵" 484 "G̵" 468 "ŭ" 467 "Ŭ" 466 "ŏ" 465 "Ŏ" 464 "ĭ" 463 "Ĭ" 462 "ă" 461 "Ă" 460 "nj" 459 "Nj" 458 "NJ" 457 "lj" 456 "Lj" 455 "LJ" 454 "dž" 453 "Dž" 452 "DŽ" 451 "!" 449 "ll" 448 "l" 447 "þ" 445 "s" 444 "5" 439 "3" 438 "z̵" 437 "Z̵" 436 "y̔" 435 "'Y" 430 "T̨" 429 "t̔" 428 "'T" 427 "ţ" 423 "2" 422 "R" 421 "p̔" 420 "'P" 417 "o'" 416 "O'" 415 "O̵" 414 "n̩" 413 "N̦" 410 "l̵" 409 "k̔" 408 "K'" 407 "l̵" 406 "l" 403 "G'" 402 "f̦" 401 "F̦" 397 "g" 396 "d̄" 394 "'D" 393 "D̵" 391 "C'" 388 "b" 387 "b̄" 386 "b̄" 385 "'B" 384 "b̵" 383 "f" 359 "t̵" 358 "T̵" 339 "oe" 338 "OE" 336 "Ö" 329 "'n" 322 "l̸" 321 "L̸" 320 "l·" 319 "l·" 312 "k" 307 "ij" 306 "IJ" 305 "i" 295 "h̵" 294 "H̵" 283 "ĕ" 282 "Ĕ" 273 "d̵" 272 "D̵" 248 "o̸" 240 "∂̵" 231 "c̦" 230 "ae" 216 "O̸" 215 "x" 208 "D̵" 199 "C̦" 198 "AE" 184 "," 181 "μ" 180 "'" 175 "ˉ" 165 "Y̵" 162 "c̸" 160 " " 124 "l" 119 "vv" 109 "rn" 96 "'" 73 "l" 49 "l" 48 "O" 37 "º/₀₀" 34 "''")))
+
+  (while ranges
+     (setq k (pop ranges)
+           v (pop ranges))
+     (set-char-table-range uni-confusables-char-table-multiple k v)))
+
+(ert-deftest uni-confusables-test-multiple ()
+
+  (should (string-equal
+           (char-table-range uni-confusables-char-table-multiple 195001)
+           "蜎"))
+
+  (should (string-equal
+           (char-table-range uni-confusables-char-table-multiple 194901)
+           "𥛅"))
+
+  (should (string-equal
+           (char-table-range uni-confusables-char-table-multiple 120618)
+           "O"))
+
+  (should (string-equal
+           (char-table-range uni-confusables-char-table-multiple 42510)
+           "."))
+
+  (should (string-equal
+           (char-table-range uni-confusables-char-table-multiple 12104)
+           "曰"))
+)
+
+
+;; Local Variables:
+;; coding: utf-8
+;; no-byte-compile: t
+;; End:
+
+;; uni-confusables.el ends here
\ No newline at end of file
diff --git a/packages/vlf/vlf.el b/packages/vlf/vlf.el
new file mode 100644 (file)
index 0000000..43e70f8
--- /dev/null
@@ -0,0 +1,874 @@
+;;; vlf.el --- View Large Files  -*- lexical-binding: t -*-
+
+;; Copyright (C) 2006, 2012, 2013  Free Software Foundation, Inc.
+
+;; Version: 0.9.1
+;; Keywords: large files, utilities
+;; Maintainer: Andrey Kotlarski <m00naticus@gmail.com>
+;; Authors: 2006 Mathias Dahl <mathias.dahl@gmail.com>
+;;          2012 Sam Steingold <sds@gnu.org>
+;;          2013 Andrey Kotlarski <m00naticus@gmail.com>
+;; URL: https://github.com/m00natic/vlf
+
+;; This file 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 2, or (at your option)
+;; any later version.
+
+;; This file 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; see the file COPYING.  If not, write to
+;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;; This package provides the M-x vlf command, which visits part of a
+;; large file without loading the entire file.
+;; The buffer uses VLF mode, which defines several commands for
+;; moving around, searching and editing selected part of file.
+
+;; This package was inspired by a snippet posted by Kevin Rodgers,
+;; showing how to use `insert-file-contents' to extract part of a
+;; file.
+
+;;; Code:
+
+(defgroup vlf nil
+  "View Large Files in Emacs."
+  :prefix "vlf-"
+  :group 'files)
+
+(defcustom vlf-batch-size 1024
+  "Defines how large each batch of file data is (in bytes)."
+  :type 'integer
+  :group 'vlf)
+(put 'vlf-batch-size 'permanent-local t)
+
+;;; Keep track of file position.
+(defvar vlf-start-pos 0
+  "Absolute position of the visible chunk start.")
+(put 'vlf-start-pos 'permanent-local t)
+
+(defvar vlf-end-pos 0 "Absolute position of the visible chunk end.")
+(put 'vlf-end-pos 'permanent-local t)
+
+(defvar vlf-file-size 0 "Total size of presented file.")
+(put 'vlf-file-size 'permanent-local t)
+
+(defvar vlf-encode-size 0 "Size in bytes of current batch decoded.")
+(put 'vlf-encode-size 'permanent-local t)
+
+(defvar vlf-mode-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map [M-next] 'vlf-next-batch)
+    (define-key map [M-prior] 'vlf-prev-batch)
+    (define-key map "+" 'vlf-change-batch-size)
+    (define-key map "-"
+      (lambda () "Decrease vlf batch size by factor of 2."
+        (interactive)
+        (vlf-change-batch-size t)))
+    (define-key map "s" 'vlf-re-search-forward)
+    (define-key map "r" 'vlf-re-search-backward)
+    (define-key map "o" 'vlf-occur)
+    (define-key map "[" 'vlf-beginning-of-file)
+    (define-key map "]" 'vlf-end-of-file)
+    (define-key map "e" 'vlf-edit-mode)
+    (define-key map "j" 'vlf-jump-to-chunk)
+    (define-key map "l" 'vlf-goto-line)
+    map)
+  "Keymap for `vlf-mode'.")
+
+(define-derived-mode vlf-mode special-mode "VLF"
+  "Mode to browse large files in."
+  (setq buffer-read-only t)
+  (set-buffer-modified-p nil)
+  (buffer-disable-undo)
+  (add-hook 'write-file-functions 'vlf-write nil t)
+  (make-local-variable 'revert-buffer-function)
+  (setq revert-buffer-function 'vlf-revert)
+  (make-local-variable 'vlf-batch-size)
+  (make-local-variable 'vlf-start-pos)
+  (make-local-variable 'vlf-end-pos)
+  (make-local-variable 'vlf-file-size)
+  (make-local-variable 'vlf-encode-size))
+
+;;;###autoload
+(defun vlf (file)
+  "View Large FILE.
+Batches of the file data from FILE will be displayed in a read-only
+buffer.  You can customize number of bytes displayed by customizing
+`vlf-batch-size'."
+  (interactive "fFile to open: ")
+  (with-current-buffer (generate-new-buffer "*vlf*")
+    (set-visited-file-name file)
+    (vlf-mode)
+    (setq vlf-file-size (vlf-get-file-size buffer-file-name))
+    (vlf-insert-file)
+    (switch-to-buffer (current-buffer))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; integration with other packages
+
+;;;###autoload
+(defun dired-vlf ()
+  "In Dired, visit the file on this line in VLF mode."
+  (interactive)
+  (vlf (dired-get-file-for-visit)))
+
+;;;###autoload
+(eval-after-load "dired"
+  '(define-key dired-mode-map "V" 'dired-vlf))
+
+;;;###autoload
+(defadvice abort-if-file-too-large (around vlf-if-file-too-large
+                                           (size op-type
+                                                 &optional filename)
+                                           compile activate)
+  "If file SIZE larger than `large-file-warning-threshold', \
+allow user to view file with `vlf', open it normally, or abort.
+OP-TYPE specifies the file operation being performed over FILENAME."
+  (and large-file-warning-threshold size
+       (> size large-file-warning-threshold)
+       (let ((char nil))
+         (while (not (memq (setq char
+                                 (read-event
+                                  (propertize
+                                   (format
+                                    "File %s is large (%s): \
+%s normally (o), %s with vlf (v) or abort (a)"
+                                    (if filename
+                                        (file-name-nondirectory filename)
+                                      "")
+                                    (file-size-human-readable size)
+                                    op-type op-type)
+                                   'face 'minibuffer-prompt)))
+                           '(?o ?O ?v ?V ?a ?A))))
+         (cond ((memq char '(?o ?O)))
+               ((memq char '(?v ?V))
+                (vlf filename)
+                (error ""))
+               ((memq char '(?a ?A))
+                (error "Aborted"))))))
+
+
+;; scroll auto batching
+(defadvice scroll-up (around vlf-scroll-up
+                             activate compile)
+  "Slide to next batch if at end of buffer in `vlf-mode'."
+  (if (and (derived-mode-p 'vlf-mode)
+           (eobp))
+      (progn (vlf-next-batch 1)
+             (goto-char (point-min)))
+    ad-do-it))
+
+(defadvice scroll-down (around vlf-scroll-down
+                               activate compile)
+  "Slide to previous batch if at beginning of buffer  in `vlf-mode'."
+  (if (and (derived-mode-p 'vlf-mode)
+           (bobp))
+      (progn (vlf-prev-batch 1)
+             (goto-char (point-max)))
+    ad-do-it))
+
+;; non-recent Emacs
+;;;###autoload
+(unless (fboundp 'file-size-human-readable)
+  (defun file-size-human-readable (file-size)
+    "Print FILE-SIZE in MB."
+    (format "%.1fMB" (/ file-size 1048576.0))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; utilities
+
+(defun vlf-change-batch-size (decrease)
+  "Change the buffer-local value of `vlf-batch-size'.
+Normally, the value is doubled;
+with the prefix argument DECREASE it is halved."
+  (interactive "P")
+  (setq vlf-batch-size (if decrease
+                            (/ vlf-batch-size 2)
+                          (* vlf-batch-size 2)))
+  (vlf-move-to-batch vlf-start-pos))
+
+(defun vlf-format-buffer-name ()
+  "Return format for vlf buffer name."
+  (format "%s(%s)[%d/%d](%d)"
+          (file-name-nondirectory buffer-file-name)
+          (file-size-human-readable vlf-file-size)
+          (/ vlf-end-pos vlf-batch-size)
+          (/ vlf-file-size vlf-batch-size)
+          vlf-batch-size))
+
+(defun vlf-update-buffer-name ()
+  "Update the current buffer name."
+  (rename-buffer (vlf-format-buffer-name) t))
+
+(defun vlf-get-file-size (file)
+  "Get size in bytes of FILE."
+  (nth 7 (file-attributes file)))
+
+(defun vlf-verify-size ()
+  "Update file size information if necessary and visited file time."
+  (unless (verify-visited-file-modtime (current-buffer))
+    (setq vlf-file-size (vlf-get-file-size buffer-file-name))
+    (set-visited-file-modtime)))
+
+(defun vlf-insert-file (&optional from-end)
+  "Insert first chunk of current file contents in current buffer.
+With FROM-END prefix, start from the back."
+  (if from-end
+      (setq vlf-start-pos (max 0 (- vlf-file-size vlf-batch-size))
+            vlf-end-pos vlf-file-size)
+    (setq vlf-start-pos 0
+          vlf-end-pos (min vlf-batch-size vlf-file-size)))
+  (vlf-move-to-chunk vlf-start-pos vlf-end-pos))
+
+(defun vlf-beginning-of-file ()
+  "Jump to beginning of file content."
+  (interactive)
+  (vlf-insert-file))
+
+(defun vlf-end-of-file ()
+  "Jump to end of file content."
+  (interactive)
+  (vlf-insert-file t))
+
+(defun vlf-revert (&optional _ignore-auto noconfirm)
+  "Revert current chunk.  Ignore _IGNORE-AUTO.
+Ask for confirmation if NOCONFIRM is nil."
+  (if (or noconfirm
+          (yes-or-no-p (format "Revert buffer from file %s? "
+                               buffer-file-name)))
+      (vlf-move-to-chunk vlf-start-pos vlf-end-pos)))
+
+(defun vlf-jump-to-chunk (n)
+  "Go to to chunk N."
+  (interactive "nGoto to chunk: ")
+  (vlf-move-to-batch (* (1- n) vlf-batch-size)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; batch movement
+
+(defun vlf-next-batch (append)
+  "Display the next batch of file data.
+When prefix argument is supplied and positive
+ jump over APPEND number of batches.
+When prefix argument is negative
+ append next APPEND number of batches to the existing buffer."
+  (interactive "p")
+  (vlf-verify-size)
+  (let ((end (min (+ vlf-end-pos (* vlf-batch-size
+                                     (abs append)))
+                  vlf-file-size)))
+    (let ((inhibit-read-only t)
+          (do-append (< append 0))
+          (pos (position-bytes (point))))
+      (if do-append
+          (goto-char (point-max))
+        (setq vlf-start-pos (- end vlf-batch-size))
+        (erase-buffer))
+      (insert-file-contents buffer-file-name nil (if do-append
+                                                     vlf-end-pos
+                                                   vlf-start-pos)
+                            end)
+      (setq vlf-end-pos end)
+      (goto-char (or (byte-to-position (+ pos (vlf-adjust-chunk)))
+                     (point-max)))))
+  (set-visited-file-modtime)
+  (set-buffer-modified-p nil)
+  (vlf-update-buffer-name))
+
+(defun vlf-prev-batch (prepend)
+  "Display the previous batch of file data.
+When prefix argument is supplied and positive
+ jump over PREPEND number of batches.
+When prefix argument is negative
+ append previous PREPEND number of batches to the existing buffer."
+  (interactive "p")
+  (if (zerop vlf-start-pos)
+      (error "Already at BOF"))
+  (vlf-verify-size)
+  (let ((inhibit-read-only t)
+        (start (max 0 (- vlf-start-pos (* vlf-batch-size
+                                           (abs prepend)))))
+        (do-prepend (< prepend 0))
+        (pos (- (position-bytes (point-max))
+                (position-bytes (point)))))
+    (if do-prepend
+        (goto-char (point-min))
+      (setq vlf-end-pos (min (+ start vlf-batch-size)
+                              vlf-file-size))
+      (erase-buffer))
+    (insert-file-contents buffer-file-name nil start
+                          (if do-prepend
+                              vlf-start-pos
+                            vlf-end-pos))
+    (setq vlf-start-pos start
+          pos (+ pos (vlf-adjust-chunk)))
+    (goto-char (or (byte-to-position (- (position-bytes (point-max))
+                                        pos))
+                   (point-max))))
+  (set-visited-file-modtime)
+  (set-buffer-modified-p nil)
+  (vlf-update-buffer-name))
+
+(defun vlf-move-to-batch (start &optional minimal)
+  "Move to batch determined by START.
+Adjust according to file start/end and show `vlf-batch-size' bytes.
+When given MINIMAL flag, skip non important operations."
+  (vlf-verify-size)
+  (setq vlf-start-pos (max 0 start)
+        vlf-end-pos (min (+ vlf-start-pos vlf-batch-size)
+                          vlf-file-size))
+  (if (= vlf-file-size vlf-end-pos)   ; re-check file size
+      (setq vlf-start-pos (max 0 (- vlf-end-pos vlf-batch-size))))
+  (let ((inhibit-read-only t)
+        (pos (position-bytes (point))))
+    (erase-buffer)
+    (insert-file-contents buffer-file-name nil
+                          vlf-start-pos vlf-end-pos)
+    (goto-char (or (byte-to-position (+ pos (vlf-adjust-chunk)))
+                   (point-max))))
+  (set-buffer-modified-p nil)
+  (set-visited-file-modtime)
+  (or minimal(vlf-update-buffer-name)))
+
+(defun vlf-move-to-chunk (start end &optional minimal)
+  "Move to chunk determined by START END.
+When given MINIMAL flag, skip non important operations."
+  (vlf-verify-size)
+  (setq vlf-start-pos (max 0 start)
+        vlf-end-pos (min end vlf-file-size))
+  (let ((inhibit-read-only t)
+        (pos (position-bytes (point))))
+    (erase-buffer)
+    (insert-file-contents buffer-file-name nil
+                          vlf-start-pos vlf-end-pos)
+    (goto-char (or (byte-to-position (+ pos (vlf-adjust-chunk)))
+                   (point-max))))
+  (set-buffer-modified-p nil)
+  (set-visited-file-modtime)
+  (or minimal (vlf-update-buffer-name)))
+
+(defun vlf-adjust-chunk ()
+  "Adjust chunk beginning until content can be properly decoded.
+Set `vlf-encode-size' to size of buffer when encoded.
+Return number of bytes moved back for this to happen."
+  (let ((shift 0)
+        (chunk-size (- vlf-end-pos vlf-start-pos)))
+    (while (and (< shift 4)
+                (< 4 (abs (- chunk-size
+                             (setq vlf-encode-size
+                                   (length (encode-coding-region
+                                            (point-min) (point-max)
+                                            buffer-file-coding-system
+                                            t))))))
+                (not (zerop vlf-start-pos)))
+      (setq shift (1+ shift)
+            vlf-start-pos (1- vlf-start-pos)
+            chunk-size (1+ chunk-size))
+      (let ((inhibit-read-only t))
+        (erase-buffer)
+        (insert-file-contents buffer-file-name nil
+                              vlf-start-pos vlf-end-pos)))
+    (set-buffer-modified-p nil)
+    shift))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; search
+
+(defun vlf-re-search (regexp count backward batch-step)
+  "Search for REGEXP COUNT number of times forward or BACKWARD.
+BATCH-STEP is amount of overlap between successive chunks."
+  (assert (< 0 count))
+  (let* ((match-chunk-start vlf-start-pos)
+         (match-chunk-end vlf-end-pos)
+         (match-start-pos (+ vlf-start-pos (position-bytes (point))))
+         (match-end-pos match-start-pos)
+         (to-find count)
+         (reporter (make-progress-reporter
+                    (concat "Searching for " regexp "...")
+                    (if backward
+                        (- vlf-file-size vlf-end-pos)
+                      vlf-start-pos)
+                    vlf-file-size)))
+    (unwind-protect
+        (catch 'end-of-file
+          (if backward
+              (while (not (zerop to-find))
+                (cond ((re-search-backward regexp nil t)
+                       (setq to-find (1- to-find)
+                             match-chunk-start vlf-start-pos
+                             match-chunk-end vlf-end-pos
+                             match-start-pos (+ vlf-start-pos
+                                                (position-bytes
+                                                 (match-beginning 0)))
+                             match-end-pos (+ vlf-start-pos
+                                              (position-bytes
+                                               (match-end 0)))))
+                      ((zerop vlf-start-pos)
+                       (throw 'end-of-file nil))
+                      (t (let ((batch-move (- vlf-start-pos
+                                              (- vlf-batch-size
+                                                 batch-step))))
+                           (vlf-move-to-batch
+                            (if (< match-start-pos batch-move)
+                                (- match-start-pos vlf-batch-size)
+                              batch-move) t))
+                         (goto-char (if (< match-start-pos
+                                           vlf-end-pos)
+                                        (or (byte-to-position
+                                             (- match-start-pos
+                                                vlf-start-pos))
+                                            (point-max))
+                                      (point-max)))
+                         (progress-reporter-update
+                          reporter (- vlf-file-size
+                                      vlf-start-pos)))))
+            (while (not (zerop to-find))
+              (cond ((re-search-forward regexp nil t)
+                     (setq to-find (1- to-find)
+                           match-chunk-start vlf-start-pos
+                           match-chunk-end vlf-end-pos
+                           match-start-pos (+ vlf-start-pos
+                                              (position-bytes
+                                               (match-beginning 0)))
+                           match-end-pos (+ vlf-start-pos
+                                            (position-bytes
+                                             (match-end 0)))))
+                    ((= vlf-end-pos vlf-file-size)
+                     (throw 'end-of-file nil))
+                    (t (let ((batch-move (- vlf-end-pos batch-step)))
+                         (vlf-move-to-batch
+                          (if (< batch-move match-end-pos)
+                              match-end-pos
+                            batch-move) t))
+                       (goto-char (if (< vlf-start-pos match-end-pos)
+                                      (or (byte-to-position
+                                           (- match-end-pos
+                                              vlf-start-pos))
+                                          (point-min))
+                                    (point-min)))
+                       (progress-reporter-update reporter
+                                                 vlf-end-pos)))))
+          (progress-reporter-done reporter))
+      (if backward
+          (vlf-goto-match match-chunk-start match-chunk-end
+                           match-end-pos match-start-pos
+                           count to-find)
+        (vlf-goto-match match-chunk-start match-chunk-end
+                         match-start-pos match-end-pos
+                         count to-find)))))
+
+(defun vlf-goto-match (match-chunk-start match-chunk-end
+                                          match-pos-start
+                                          match-pos-end
+                                          count to-find)
+  "Move to MATCH-CHUNK-START MATCH-CHUNK-END surrounding \
+MATCH-POS-START and MATCH-POS-END.
+According to COUNT and left TO-FIND, show if search has been
+successful.  Return nil if nothing found."
+  (if (= count to-find)
+      (progn (vlf-move-to-chunk match-chunk-start match-chunk-end)
+             (goto-char (or (byte-to-position (- match-pos-start
+                                                 vlf-start-pos))
+                            (point-max)))
+             (message "Not found")
+             nil)
+    (let ((success (zerop to-find)))
+      (if success
+          (vlf-update-buffer-name)
+        (vlf-move-to-chunk match-chunk-start match-chunk-end))
+      (let* ((match-end (or (byte-to-position (- match-pos-end
+                                                 vlf-start-pos))
+                            (point-max)))
+             (overlay (make-overlay (byte-to-position
+                                     (- match-pos-start
+                                        vlf-start-pos))
+                                    match-end)))
+        (overlay-put overlay 'face 'match)
+        (unless success
+          (goto-char match-end)
+          (message "Moved to the %d match which is last"
+                   (- count to-find)))
+        (sit-for 0.1)
+        (delete-overlay overlay)
+        t))))
+
+(defun vlf-re-search-forward (regexp count)
+  "Search forward for REGEXP prefix COUNT number of times.
+Search is performed chunk by chunk in `vlf-batch-size' memory."
+  (interactive (list (read-regexp "Search whole file"
+                                  (if regexp-history
+                                      (car regexp-history)))
+                     (or current-prefix-arg 1)))
+  (vlf-re-search regexp count nil (/ vlf-batch-size 8)))
+
+(defun vlf-re-search-backward (regexp count)
+  "Search backward for REGEXP prefix COUNT number of times.
+Search is performed chunk by chunk in `vlf-batch-size' memory."
+  (interactive (list (read-regexp "Search whole file backward"
+                                  (if regexp-history
+                                      (car regexp-history)))
+                     (or current-prefix-arg 1)))
+  (vlf-re-search regexp count t (/ vlf-batch-size 8)))
+
+(defun vlf-goto-line (n)
+  "Go to line N.  If N is negative, count from the end of file."
+  (interactive "nGo to line: ")
+  (let ((start-pos vlf-start-pos)
+        (end-pos vlf-end-pos)
+        (pos (point))
+        (success nil))
+    (unwind-protect
+        (if (< 0 n)
+            (progn (vlf-beginning-of-file)
+                   (goto-char (point-min))
+                   (setq success (vlf-re-search "[\n\C-m]" (1- n)
+                                                 nil 0)))
+          (vlf-end-of-file)
+          (goto-char (point-max))
+          (setq success (vlf-re-search "[\n\C-m]" (- n) t 0)))
+      (if success
+          (message "Onto line %s" n)
+        (vlf-move-to-chunk start-pos end-pos)
+        (goto-char pos)))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; occur
+
+(defvar vlf-occur-mode-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map "n" 'vlf-occur-next-match)
+    (define-key map "p" 'vlf-occur-prev-match)
+    (define-key map "\C-m" 'vlf-occur-visit)
+    (define-key map [mouse-1] 'vlf-occur-visit)
+    (define-key map "o" 'vlf-occur-show)
+    map)
+  "Keymap for command `vlf-occur-mode'.")
+
+(define-derived-mode vlf-occur-mode special-mode "VLF[occur]"
+  "Major mode for showing occur matches of VLF opened files.")
+
+(defun vlf-occur-next-match ()
+  "Move cursor to next match."
+  (interactive)
+  (if (eq (get-char-property (point) 'face) 'match)
+      (goto-char (next-single-property-change (point) 'face)))
+  (goto-char (or (text-property-any (point) (point-max) 'face 'match)
+                 (text-property-any (point-min) (point)
+                                    'face 'match))))
+
+(defun vlf-occur-prev-match ()
+  "Move cursor to previous match."
+  (interactive)
+  (if (eq (get-char-property (point) 'face) 'match)
+      (goto-char (previous-single-property-change (point) 'face)))
+  (while (not (eq (get-char-property (point) 'face) 'match))
+    (goto-char (or (previous-single-property-change (point) 'face)
+                   (point-max)))))
+
+(defun vlf-occur-show (&optional event)
+  "Visit current `vlf-occur' link in a vlf buffer but stay in the \
+occur buffer.  If original VLF buffer has been killed,
+open new VLF session each time.
+EVENT may hold details of the invocation."
+  (interactive (list last-nonmenu-event))
+  (let ((occur-buffer (if event
+                          (window-buffer (posn-window
+                                          (event-end event)))
+                        (current-buffer))))
+    (vlf-occur-visit event)
+    (pop-to-buffer occur-buffer)))
+
+(defun vlf-occur-visit (&optional event)
+  "Visit current `vlf-occur' link in a vlf buffer.
+If original VLF buffer has been killed,
+open new VLF session each time.
+EVENT may hold details of the invocation."
+  (interactive (list last-nonmenu-event))
+  (when event
+    (set-buffer (window-buffer (posn-window (event-end event))))
+    (goto-char (posn-point (event-end event))))
+  (let* ((pos (point))
+         (pos-relative (- pos (line-beginning-position) 1))
+         (file (get-char-property pos 'file)))
+    (if file
+        (let ((chunk-start (get-char-property pos 'chunk-start))
+              (chunk-end (get-char-property pos 'chunk-end))
+              (buffer (get-char-property pos 'buffer))
+              (match-pos (+ (get-char-property pos 'line-pos)
+                            pos-relative)))
+          (or (buffer-live-p buffer)
+              (let ((occur-buffer (current-buffer)))
+                (setq buffer (vlf file))
+                (switch-to-buffer occur-buffer)))
+          (pop-to-buffer buffer)
+          (if (buffer-modified-p)
+              (cond ((and (= vlf-start-pos chunk-start)
+                          (= vlf-end-pos chunk-end))
+                     (goto-char match-pos))
+                    ((y-or-n-p "VLF buffer has been modified.  \
+Really jump to new chunk? ")
+                     (vlf-move-to-chunk chunk-start chunk-end)
+                     (goto-char match-pos)))
+            (vlf-move-to-chunk chunk-start chunk-end)
+            (goto-char match-pos))))))
+
+(defun vlf-occur (regexp)
+  "Make whole file occur style index for REGEXP.
+Prematurely ending indexing will still show what's found so far."
+  (interactive (list (read-regexp "List lines matching regexp"
+                                  (if regexp-history
+                                      (car regexp-history)))))
+  (let ((start-pos vlf-start-pos)
+        (end-pos vlf-end-pos)
+        (pos (point)))
+    (vlf-beginning-of-file)
+    (goto-char (point-min))
+    (unwind-protect (vlf-build-occur regexp)
+      (vlf-move-to-chunk start-pos end-pos)
+      (goto-char pos))))
+
+(defun vlf-build-occur (regexp)
+  "Build occur style index for REGEXP."
+  (let ((line 1)
+        (last-match-line 0)
+        (last-line-pos (point-min))
+        (file buffer-file-name)
+        (total-matches 0)
+        (match-end-pos (+ vlf-start-pos (position-bytes (point))))
+        (occur-buffer (generate-new-buffer
+                       (concat "*VLF-occur " (file-name-nondirectory
+                                               buffer-file-name)
+                               "*")))
+        (line-regexp (concat "\\(?5:[\n\C-m]\\)\\|\\(?10:"
+                             regexp "\\)"))
+        (batch-step (/ vlf-batch-size 8))
+        (end-of-file nil)
+        (reporter (make-progress-reporter
+                   (concat "Building index for " regexp "...")
+                   vlf-start-pos vlf-file-size)))
+    (unwind-protect
+        (progn
+          (while (not end-of-file)
+            (if (re-search-forward line-regexp nil t)
+                (progn
+                  (setq match-end-pos (+ vlf-start-pos
+                                         (position-bytes
+                                          (match-end 0))))
+                  (if (match-string 5)
+                      (setq line (1+ line) ; line detected
+                            last-line-pos (point))
+                    (let* ((chunk-start vlf-start-pos)
+                           (chunk-end vlf-end-pos)
+                           (vlf-buffer (current-buffer))
+                           (line-pos (line-beginning-position))
+                           (line-text (buffer-substring
+                                       line-pos (line-end-position))))
+                      (with-current-buffer occur-buffer
+                        (unless (= line last-match-line) ;new match line
+                          (insert "\n:") ; insert line number
+                          (let* ((overlay-pos (1- (point)))
+                                 (overlay (make-overlay
+                                           overlay-pos
+                                           (1+ overlay-pos))))
+                            (overlay-put overlay 'before-string
+                                         (propertize
+                                          (number-to-string line)
+                                          'face 'shadow)))
+                          (insert (propertize line-text ; insert line
+                                              'file file
+                                              'buffer vlf-buffer
+                                              'chunk-start chunk-start
+                                              'chunk-end chunk-end
+                                              'mouse-face '(highlight)
+                                              'line-pos line-pos
+                                              'help-echo
+                                              (format "Move to line %d"
+                                                      line))))
+                        (setq last-match-line line
+                              total-matches (1+ total-matches))
+                        (let ((line-start (1+
+                                           (line-beginning-position)))
+                              (match-pos (match-beginning 10)))
+                          (add-text-properties ; mark match
+                           (+ line-start match-pos (- last-line-pos))
+                           (+ line-start (match-end 10)
+                              (- last-line-pos))
+                           (list 'face 'match
+                                 'help-echo
+                                 (format "Move to match %d"
+                                         total-matches))))))))
+              (setq end-of-file (= vlf-end-pos vlf-file-size))
+              (unless end-of-file
+                (let ((batch-move (- vlf-end-pos batch-step)))
+                  (vlf-move-to-batch (if (< batch-move match-end-pos)
+                                          match-end-pos
+                                        batch-move) t))
+                (goto-char (if (< vlf-start-pos match-end-pos)
+                               (or (byte-to-position (- match-end-pos
+                                                        vlf-start-pos))
+                                   (point-min))
+                             (point-min)))
+                (setq last-match-line 0
+                      last-line-pos (line-beginning-position))
+                (progress-reporter-update reporter vlf-end-pos))))
+          (progress-reporter-done reporter))
+      (if (zerop total-matches)
+          (progn (with-current-buffer occur-buffer
+                   (set-buffer-modified-p nil))
+                 (kill-buffer occur-buffer)
+                 (message "No matches for \"%s\"" regexp))
+        (with-current-buffer occur-buffer
+          (goto-char (point-min))
+          (insert (propertize
+                   (format "%d matches from %d lines for \"%s\" \
+in file: %s" total-matches line regexp file)
+                   'face 'underline))
+          (set-buffer-modified-p nil)
+          (forward-char 2)
+          (vlf-occur-mode))
+        (display-buffer occur-buffer)))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; editing
+
+(defvar vlf-edit-mode-map
+  (let ((map (make-sparse-keymap)))
+    (set-keymap-parent map text-mode-map)
+    (define-key map "\C-c\C-c" 'vlf-write)
+    (define-key map "\C-c\C-q" 'vlf-discard-edit)
+    (define-key map "\C-v" vlf-mode-map)
+    map)
+  "Keymap for command `vlf-edit-mode'.")
+
+(define-derived-mode vlf-edit-mode vlf-mode "VLF[edit]"
+  "Major mode for editing large file chunks."
+  (setq buffer-read-only nil)
+  (buffer-enable-undo)
+  (message (substitute-command-keys
+            "Editing: Type \\[vlf-write] to write chunk \
+or \\[vlf-discard-edit] to discard changes.")))
+
+(defun vlf-discard-edit ()
+  "Discard edit and refresh chunk from file."
+  (interactive)
+  (set-buffer-modified-p nil)
+  (vlf-move-to-chunk vlf-start-pos vlf-end-pos)
+  (vlf-mode)
+  (message "Switched to VLF mode."))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; saving
+
+(defun vlf-write ()
+  "Write current chunk to file.  Always return true to disable save.
+If changing size of chunk, shift remaining file content."
+  (interactive)
+  (when (and (buffer-modified-p)
+             (or (verify-visited-file-modtime (current-buffer))
+                 (y-or-n-p "File has changed since visited or saved.  \
+Save anyway? ")))
+    (let ((pos (point))
+          (size-change (- vlf-encode-size
+                          (setq vlf-encode-size
+                                (length (encode-coding-region
+                                         (point-min) (point-max)
+                                         buffer-file-coding-system
+                                         t))))))
+      (cond ((zerop size-change)
+             (write-region nil nil buffer-file-name vlf-start-pos t))
+            ((< 0 size-change)
+             (vlf-file-shift-back size-change))
+            (t (vlf-file-shift-forward (- size-change))))
+      (vlf-move-to-chunk vlf-start-pos vlf-end-pos)
+      (goto-char pos))
+    (vlf-mode))
+  t)
+
+(defun vlf-file-shift-back (size-change)
+  "Shift file contents SIZE-CHANGE bytes back."
+  (write-region nil nil buffer-file-name vlf-start-pos t)
+  (buffer-disable-undo)
+  (let ((read-start-pos vlf-end-pos)
+        (coding-system-for-write 'no-conversion)
+        (reporter (make-progress-reporter "Adjusting file content..."
+                                          vlf-end-pos
+                                          vlf-file-size)))
+    (while (vlf-shift-batch read-start-pos (- read-start-pos
+                                               size-change))
+      (setq read-start-pos (+ read-start-pos vlf-batch-size))
+      (progress-reporter-update reporter read-start-pos))
+    ;; pad end with space
+    (erase-buffer)
+    (vlf-verify-size)
+    (insert-char 32 size-change)
+    (write-region nil nil buffer-file-name (- vlf-file-size
+                                              size-change) t)
+    (progress-reporter-done reporter)))
+
+(defun vlf-shift-batch (read-pos write-pos)
+  "Read `vlf-batch-size' bytes from READ-POS and write them \
+back at WRITE-POS.  Return nil if EOF is reached, t otherwise."
+  (erase-buffer)
+  (vlf-verify-size)
+  (let ((read-end (+ read-pos vlf-batch-size)))
+    (insert-file-contents-literally buffer-file-name nil
+                                    read-pos
+                                    (min vlf-file-size read-end))
+    (write-region nil nil buffer-file-name write-pos 0)
+    (< read-end vlf-file-size)))
+
+(defun vlf-file-shift-forward (size-change)
+  "Shift file contents SIZE-CHANGE bytes forward.
+Done by saving content up front and then writing previous batch."
+  (buffer-disable-undo)
+  (let ((size (+ vlf-batch-size size-change))
+        (read-pos vlf-end-pos)
+        (write-pos vlf-start-pos)
+        (reporter (make-progress-reporter "Adjusting file content..."
+                                          vlf-start-pos
+                                          vlf-file-size)))
+    (when (vlf-shift-batches size read-pos write-pos t)
+      (setq write-pos (+ read-pos size-change)
+            read-pos (+ read-pos size))
+      (progress-reporter-update reporter write-pos)
+      (let ((coding-system-for-write 'no-conversion))
+        (while (vlf-shift-batches size read-pos write-pos nil)
+          (setq write-pos (+ read-pos size-change)
+                read-pos (+ read-pos size))
+          (progress-reporter-update reporter write-pos))))
+    (progress-reporter-done reporter)))
+
+(defun vlf-shift-batches (size read-pos write-pos hide-read)
+  "Append SIZE bytes of file starting at READ-POS.
+Then write initial buffer content to file at WRITE-POS.
+If HIDE-READ is non nil, temporarily hide literal read content.
+Return nil if EOF is reached, t otherwise."
+  (vlf-verify-size)
+  (let ((read-more (< read-pos vlf-file-size))
+        (start-write-pos (point-min))
+        (end-write-pos (point-max)))
+    (when read-more
+      (goto-char end-write-pos)
+      (insert-file-contents-literally buffer-file-name nil read-pos
+                                      (min vlf-file-size (+ read-pos
+                                                             size))))
+    ;; write
+    (if hide-read ; hide literal region if user has to choose encoding
+        (narrow-to-region start-write-pos end-write-pos))
+    (write-region start-write-pos end-write-pos
+                  buffer-file-name write-pos 0)
+    (delete-region start-write-pos end-write-pos)
+    (if hide-read (widen))
+    read-more))
+
+(provide 'vlf)
+
+;;; vlf.el ends here
diff --git a/packages/websocket/COPYING b/packages/websocket/COPYING
new file mode 100644 (file)
index 0000000..ecbc059
--- /dev/null
@@ -0,0 +1,339 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                            NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    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 2 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, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
\ No newline at end of file
diff --git a/packages/websocket/README.org b/packages/websocket/README.org
new file mode 100644 (file)
index 0000000..ee20381
--- /dev/null
@@ -0,0 +1,31 @@
+* Description
+This is a elisp library for websocket clients to talk to websocket
+servers, and for websocket servers to accept connections from
+websocket clients. This library is designed to be used by other
+library writers, to write apps that use websockets, and is not useful
+by itself.
+
+An example of how to use the library is in the
+[[https://github.com/ahyatt/emacs-websocket/blob/master/websocket-functional-test.el][websocket-functional-test.el]] file.
+
+This library is compatible with emacs 23 and 24, although only emacs
+24 support secure websockets.
+
+* Version release checklist
+
+Each version that is released should be checked with this checklist:
+
+- [ ] All ert test passing
+- [ ] Functional test passing on emacs 23 and 24
+- [ ] websocket.el byte compiling cleanly.
+
+* Existing clients:
+
+- [[https://github.com/tkf/emacs-ipython-notebook][Emacs IPython Notebook]]
+- [[https://github.com/syohex/emacs-realtime-markdown-viewer][Emacs Realtime Markdown Viewer]]
+- [[https://github.com/jscheid/kite][Kite]]
+
+If you are using this module for your own emacs package, please let me
+know by editing this file, adding your project, and sending a pull
+request to this repository.
+
diff --git a/packages/websocket/testserver.py b/packages/websocket/testserver.py
new file mode 100644 (file)
index 0000000..5cfcb96
--- /dev/null
@@ -0,0 +1,34 @@
+import logging
+import tornado
+import tornado.web
+from tornado import httpserver
+from tornado import ioloop
+from tornado import websocket
+
+
+class EchoWebSocket(websocket.WebSocketHandler):
+
+    def open(self):
+        logging.info("OPEN")
+
+    def on_message(self, message):
+        logging.info(u"ON_MESSAGE: {0}".format(message))
+        self.write_message(u"You said: {0}".format(message))
+
+    def on_close(self):
+        logging.info("ON_CLOSE")
+
+    def allow_draft76(self):
+        return False
+
+
+if __name__ == "__main__":
+    import tornado.options
+    tornado.options.parse_command_line()
+    application = tornado.web.Application([
+        (r"/", EchoWebSocket),
+    ])
+    server = httpserver.HTTPServer(application)
+    server.listen(9999)
+    logging.info("STARTED: Server start listening")
+    ioloop.IOLoop.instance().start()
diff --git a/packages/websocket/websocket-functional-test.el b/packages/websocket/websocket-functional-test.el
new file mode 100644 (file)
index 0000000..af1a4ee
--- /dev/null
@@ -0,0 +1,151 @@
+;;; websocket-functional-test.el --- Simple functional testing
+
+;; Copyright (c) 2013  Free Software Foundation, Inc.
+
+;; 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 GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Usage: emacs -batch -Q -L . -l websocket-functional-test.el
+;;
+;; Note: this functional tests requires that you have python with the
+;; Tornado web server.  See http://www.tornadoweb.org/en/stable/ for
+;; information on aquiring.
+
+(require 'tls)   ;; tests a particular bug we had on emacs 23
+(setq debug-on-error t)
+(require 'websocket)
+(eval-when-compile (require 'cl))
+
+;;;;;;;;;;;;;;;;;;;;;;;
+;; Local server test ;;
+;;;;;;;;;;;;;;;;;;;;;;;
+
+(message "Testing with local server")
+
+(setq websocket-debug t)
+
+(defvar wstest-server-buffer (get-buffer-create "*wstest-server*"))
+(defvar wstest-server-name "wstest-server")
+(defvar wstest-server-proc
+  (start-process wstest-server-name wstest-server-buffer
+                 "python" "testserver.py" "--log_to_stderr" "--logging=debug"))
+(sleep-for 1)
+
+(defvar wstest-msgs nil)
+(defvar wstest-closed nil)
+
+(message "Opening the websocket")
+
+(defvar wstest-ws
+  (websocket-open
+   "ws://127.0.0.1:9999"
+   :on-message (lambda (websocket frame)
+                 (push (websocket-frame-payload frame) wstest-msgs)
+                 (message "ws frame: %S" (websocket-frame-payload frame))
+                 (error "Test error (expected)"))
+   :on-close (lambda (websocket) (setq wstest-closed t))))
+
+(defun wstest-pop-to-debug ()
+  "Open websocket log buffer. Not used in testing. Just for debugging."
+  (interactive)
+  (pop-to-buffer (websocket-get-debug-buffer-create wstest-ws)))
+
+(sleep-for 0.1)
+(assert (websocket-openp wstest-ws))
+
+(assert (null wstest-msgs))
+
+(websocket-send-text wstest-ws "Hi!")
+
+(sleep-for 0.1)
+(assert (equal (car wstest-msgs) "You said: Hi!"))
+(setf (websocket-on-error wstest-ws) (lambda (ws type err)))
+(websocket-send-text wstest-ws "Hi after error!")
+(sleep-for 0.1)
+(assert (equal (car wstest-msgs) "You said: Hi after error!"))
+
+(websocket-close wstest-ws)
+(assert (null (websocket-openp wstest-ws)))
+
+(stop-process wstest-server-proc)
+(kill-process wstest-server-proc)
+
+;; Make sure the processes are closed.  This happens asynchronously,
+;; so let's wait for it.
+(sleep-for 1)
+(assert (null (process-list)) t)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Remote server test, with wss ;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(when (>= (string-to-int (substring emacs-version 0 2)) 24)
+  (message "Testing with wss://echo.websocket.org")
+  (setq wstest-ws
+        (websocket-open
+         "wss://echo.websocket.org"
+         :on-open (lambda (websocket)
+                    (message "Websocket opened"))
+         :on-message (lambda (websocket frame)
+                       (push (websocket-frame-payload frame) wstest-msgs)
+                       (message "ws frame: %S" (websocket-frame-payload frame)))
+         :on-close (lambda (websocket)
+                     (message "Websocket closed")
+                     (setq wstest-closed t)))
+        wstest-msgs nil)
+  (sleep-for 0.3)
+  (assert (websocket-openp wstest-ws))
+  (assert (null wstest-msgs))
+  (websocket-send-text wstest-ws "Hi!")
+  (sleep-for 0.3)
+  (assert (equal (car wstest-msgs) "Hi!"))
+  (websocket-close wstest-ws))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Local client and server ;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(message "Testing with emacs websocket server.")
+(message "If this does not pass, make sure your firewall allows the connection.")
+(setq wstest-closed nil)
+(setq server-conn (websocket-server
+                   9998
+                   :on-message (lambda (ws frame)
+                                 (message "Server received text!")
+                                 (websocket-send-text ws
+                                  (websocket-frame-payload frame)))
+                   :on-open (lambda (websocket) "Client connection opened!")
+                   :on-close (lambda (websocket)
+                               (setq wstest-closed t))))
+
+(setq wstest-msgs nil
+      wstest-ws
+      (websocket-open
+       "ws://localhost:9998"
+       :on-message (lambda (websocket frame)
+                     (push (websocket-frame-payload frame) wstest-msgs)
+                     (message "ws frame: %S" (websocket-frame-payload frame)))))
+
+(assert (websocket-openp wstest-ws))
+(websocket-send-text wstest-ws "Hi to self!")
+(sleep-for 0.3)
+(assert (equal (car wstest-msgs) "Hi to self!"))
+(websocket-server-close server-conn)
+(assert wstest-closed)
+(websocket-close wstest-ws)
+
+(sleep-for 1)
+(assert (null (process-list)) t)
+(message "\nAll tests passed!\n")
diff --git a/packages/websocket/websocket-test.el b/packages/websocket/websocket-test.el
new file mode 100644 (file)
index 0000000..3cc51f9
--- /dev/null
@@ -0,0 +1,594 @@
+;;; websocket-test.el --- Unit tests for the websocket layer
+
+;; Copyright (c) 2013  Free Software Foundation, Inc.
+;;
+;; Author: Andrew Hyatt <ahyatt at gmail dot com>
+;; Maintainer: Andrew Hyatt <ahyatt at gmail dot com>
+;;
+;; 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 GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; This defines and runs ert unit tests.  You can download ert from:
+;; http://github.com/ohler/ert, it also comes with Emacs 24 and above.
+
+(require 'ert)
+(require 'websocket)
+(eval-when-compile (require 'cl))
+
+(ert-deftest websocket-genbytes-length ()
+  (loop repeat 100
+        do (should (= (string-bytes (websocket-genbytes 16)) 16))))
+
+(ert-deftest websocket-calculate-accept ()
+  ;; This example comes straight from RFC 6455
+  (should
+   (equal "s3pPLMBiTxaQ9kYGzzhZRbK+xOo="
+          (websocket-calculate-accept "dGhlIHNhbXBsZSBub25jZQ=="))))
+
+(defconst websocket-test-hello "\x81\x05\x48\x65\x6c\x6c\x6f"
+  "'Hello' string example, taken from the RFC.")
+
+(defconst websocket-test-masked-hello
+  "\x81\x85\x37\xfa\x21\x3d\x7f\x9f\x4d\x51\x58"
+  "'Hello' masked string example, taken from the RFC.")
+
+(ert-deftest websocket-get-bytes ()
+  (should (equal #x5 (websocket-get-bytes "\x5" 1)))
+  (should (equal #x101 (websocket-get-bytes "\x1\x1" 2)))
+  (should (equal #xffffff
+                 (websocket-get-bytes "\x0\x0\x0\x0\x0\xFF\xFF\xFF" 8)))
+  (should-error (websocket-get-bytes "\x0\x0\x0\x1\x0\x0\x0\x1" 8)
+                :type 'websocket-unparseable-frame)
+  (should-error (websocket-get-bytes "\x0\x0\x0" 3))
+  (should-error (websocket-get-bytes "\x0" 2) :type 'websocket-unparseable-frame))
+
+(ert-deftest websocket-get-opcode ()
+  (should (equal 'text (websocket-get-opcode websocket-test-hello))))
+
+(ert-deftest websocket-get-payload-len ()
+  (should (equal '(5 . 1)
+                 (websocket-get-payload-len
+                  (substring websocket-test-hello 1))))
+  (should (equal '(200 . 3)
+                 (websocket-get-payload-len
+                  (bindat-pack '((:len u8) (:val u16))
+                               `((:len . 126)
+                                 (:val . 200))))))
+  ;; we don't want to hit up any limits even on strange emacs builds,
+  ;; so this test has a pretty small test value
+  (should (equal '(70000 . 9)
+                 (websocket-get-payload-len
+                  (bindat-pack '((:len u8) (:val vec 2 u32))
+                               `((:len . 127)
+                                 (:val . [0 70000])))))))
+
+(ert-deftest websocket-read-frame ()
+  (should (equal (make-websocket-frame :opcode 'text :payload "Hello"
+                                       :length (length websocket-test-hello)
+                                       :completep t)
+                 (websocket-read-frame websocket-test-hello)))
+  (should (equal (make-websocket-frame :opcode 'text :payload "Hello"
+                                       :length (length websocket-test-hello)
+                                       :completep t)
+                 (websocket-read-frame (concat websocket-test-hello
+                                               "should-not-be-read"))))
+  (should (equal (make-websocket-frame :opcode 'text :payload "Hello"
+                                       :length (length websocket-test-masked-hello)
+                                       :completep t)
+                 (websocket-read-frame websocket-test-masked-hello)))
+  (should (equal (make-websocket-frame :opcode 'text :payload "Hello"
+                                       :length (length websocket-test-hello)
+                                       :completep nil)
+                 (websocket-read-frame
+                  (concat (unibyte-string
+                           (logand (string-to-char
+                                    (substring websocket-test-hello 0 1))
+                                   127))
+                          (substring websocket-test-hello 1)))))
+  (dotimes (i (- (length websocket-test-hello) 1))
+    (should-not (websocket-read-frame
+                 (substring websocket-test-hello 0
+                            (- (length websocket-test-hello) (+ i 1))))))
+  (dotimes (i (- (length websocket-test-masked-hello) 1))
+    (should-not (websocket-read-frame
+                 (substring websocket-test-masked-hello 0
+                            (- (length websocket-test-masked-hello) (+ i 1)))))))
+
+(defun websocket-test-header-with-lines (&rest lines)
+  (mapconcat 'identity (append lines '("\r\n")) "\r\n"))
+
+(ert-deftest websocket-verify-response-code ()
+  (should (websocket-verify-response-code "HTTP/1.1 101"))
+  (should
+   (eq 400 (cdr (should-error (websocket-verify-response-code "HTTP/1.1 400")
+                          :type 'websocket-received-error-http-response))))
+  (should
+   (eq 200 (cdr (should-error (websocket-verify-response-code "HTTP/1.1 200"))))))
+
+(ert-deftest websocket-verify-headers ()
+  (let ((accept "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=")
+        (invalid-accept "Sec-WebSocket-Accept: bad")
+        (upgrade "Upgrade: websocket")
+        (connection "Connection: upgrade")
+        (ws (websocket-inner-create
+             :conn "fake-conn" :url "ws://foo/bar"
+             :accept-string "s3pPLMBiTxaQ9kYGzzhZRbK+xOo="))
+        (ws-with-protocol
+         (websocket-inner-create
+             :conn "fake-conn" :url "ws://foo/bar"
+             :accept-string "s3pPLMBiTxaQ9kYGzzhZRbK+xOo="
+             :protocols '("myprotocol")))
+        (ws-with-extensions
+         (websocket-inner-create
+             :conn "fake-conn" :url "ws://foo/bar"
+             :accept-string "s3pPLMBiTxaQ9kYGzzhZRbK+xOo="
+             :extensions '("ext1" "ext2"))))
+    (should (websocket-verify-headers
+             ws
+             (websocket-test-header-with-lines accept upgrade connection)))
+    (should-error
+     (websocket-verify-headers
+      ws
+      (websocket-test-header-with-lines invalid-accept upgrade connection))
+     :type 'websocket-invalid-header)
+    (should-error (websocket-verify-headers
+                   ws
+                   (websocket-test-header-with-lines upgrade connection))
+                  :type 'websocket-invalid-header)
+    (should-error (websocket-verify-headers
+                   ws
+                   (websocket-test-header-with-lines accept connection))
+                  :type 'websocket-invalid-header)
+    (should-error (websocket-verify-headers
+                   ws
+                   (websocket-test-header-with-lines accept upgrade))
+                  :type 'websocket-invalid-header)
+    (should-error (websocket-verify-headers
+                   ws-with-protocol
+                   (websocket-test-header-with-lines accept upgrade connection))
+                  :type 'websocket-invalid-header)
+    (should-error
+     (websocket-verify-headers
+      ws-with-protocol
+      (websocket-test-header-with-lines accept upgrade connection
+                                        "Sec-Websocket-Protocol: foo"))
+     :type 'websocket-invalid-header)
+    (should
+     (websocket-verify-headers
+      ws-with-protocol
+      (websocket-test-header-with-lines accept upgrade connection
+                                        "Sec-Websocket-Protocol: myprotocol")))
+    (should (equal '("myprotocol")
+                   (websocket-negotiated-protocols ws-with-protocol)))
+    (should-error
+     (websocket-verify-headers
+      ws-with-extensions
+      (websocket-test-header-with-lines accept upgrade connection
+                                        "Sec-Websocket-Extensions: foo")))
+    (should
+     (websocket-verify-headers
+      ws-with-extensions
+      (websocket-test-header-with-lines
+       accept upgrade connection "Sec-Websocket-Extensions: ext1, ext2; a=1")))
+    (should (equal '("ext1" "ext2; a=1")
+                   (websocket-negotiated-extensions ws-with-extensions)))
+    (should
+     (websocket-verify-headers
+      ws-with-extensions
+      (websocket-test-header-with-lines accept upgrade connection
+                                        "Sec-Websocket-Extensions: ext1"
+                                        "Sec-Websocket-Extensions: ext2; a=1")))
+    (should (equal '("ext1" "ext2; a=1")
+                   (websocket-negotiated-extensions ws-with-extensions)))))
+
+(ert-deftest websocket-create-headers ()
+  (let ((system-name "mysystem")
+        (base-headers (concat "Host: www.example.com\r\n"
+                              "Upgrade: websocket\r\n"
+                              "Connection: Upgrade\r\n"
+                              "Sec-WebSocket-Key: key\r\n"
+                              "Origin: mysystem\r\n"
+                              "Sec-WebSocket-Version: 13\r\n")))
+    (should (equal (concat base-headers "\r\n")
+                   (websocket-create-headers "ws://www.example.com/path"
+                                             "key" nil nil)))
+    (should (equal (concat base-headers
+                           "Sec-WebSocket-Protocol: protocol\r\n\r\n")
+                   (websocket-create-headers "ws://www.example.com/path"
+                                             "key" '("protocol") nil)))
+    (should (equal
+             (concat base-headers
+                     "Sec-WebSocket-Extensions: ext1; a; b=2, ext2\r\n\r\n")
+             (websocket-create-headers "ws://www.example.com/path"
+                                       "key" nil
+                                       '(("ext1" . ("a" "b=2"))
+                                         ("ext2")))))))
+
+(ert-deftest websocket-process-frame ()
+  (let* ((sent)
+         (processed)
+         (deleted)
+         (websocket (websocket-inner-create
+                     :conn t :url t
+                     :on-message (lambda (websocket frame)
+                                   (setq
+                                    processed
+                                    (websocket-frame-payload frame)))
+                     :accept-string t)))
+    (dolist (opcode '(text binary continuation))
+      (setq processed nil)
+      (should (equal
+               "hello"
+               (progn
+                 (funcall (websocket-process-frame
+                   websocket
+                   (make-websocket-frame :opcode opcode :payload "hello")))
+                 processed))))
+    (setq sent nil)
+    (flet ((websocket-send (websocket content) (setq sent content)))
+      (should (equal
+               (make-websocket-frame :opcode 'pong :completep t)
+               (progn
+                 (funcall (websocket-process-frame websocket
+                                           (make-websocket-frame :opcode 'ping)))
+                 sent))))
+    (flet ((delete-process (conn) (setq deleted t)))
+      (should (progn
+                (funcall
+                 (websocket-process-frame websocket
+                                          (make-websocket-frame :opcode 'close)))
+                deleted)))))
+
+(ert-deftest websocket-process-frame-error-handling ()
+  (let* ((error-called)
+         (websocket (websocket-inner-create
+                     :conn t :url t :accept-string t
+                     :on-message (lambda (websocket frame)
+                                   (message "In on-message")
+                                   (error "err"))
+                     :on-error (lambda (ws type err)
+                                 (should (eq 'on-message type))
+                                 (setq error-called t)))))
+    (funcall (websocket-process-frame websocket
+                                      (make-websocket-frame :opcode 'text
+                                                            :payload "hello")))
+    (should error-called)))
+
+(ert-deftest websocket-to-bytes ()
+  ;; We've tested websocket-get-bytes by itself, now we can use it to
+  ;; help test websocket-to-bytes.
+  (should (equal 30 (websocket-get-bytes (websocket-to-bytes 30 1) 1)))
+  (should (equal 300 (websocket-get-bytes (websocket-to-bytes 300 2) 2)))
+  (should (equal 70000 (websocket-get-bytes (websocket-to-bytes 70000 8) 8)))
+  (should-error (websocket-to-bytes 536870912 8) :type 'websocket-frame-too-large)
+  (should-error (websocket-to-bytes 30 3))
+  (should-error (websocket-to-bytes 300 1))
+  ;; I'd like to test the error for 32-byte systems on 8-byte lengths,
+  ;; but elisp does not allow us to temporarily set constants such as
+  ;; most-positive-fixnum.
+  )
+
+(ert-deftest websocket-encode-frame ()
+  ;; We've tested websocket-read-frame, now we can use that to help
+  ;; test websocket-encode-frame.
+  (let ((websocket-mask-frames nil))
+    (should (equal
+             websocket-test-hello
+             (websocket-encode-frame
+              (make-websocket-frame :opcode 'text :payload "Hello" :completep t))))
+    (dolist (len '(200 70000))
+      (let ((long-string (make-string len ?x)))
+        (should (equal long-string
+                       (websocket-frame-payload
+                        (websocket-read-frame
+                         (websocket-encode-frame
+                          (make-websocket-frame :opcode 'text
+                                                :payload long-string)))))))))
+  (let ((websocket-mask-frames t))
+    (flet ((websocket-genbytes (n) (substring websocket-test-masked-hello 2 6)))
+      (should (equal websocket-test-masked-hello
+                     (websocket-encode-frame
+                      (make-websocket-frame :opcode 'text :payload "Hello"
+                                            :completep t))))))
+  (should-not
+   (websocket-frame-completep
+    (websocket-read-frame
+     (websocket-encode-frame (make-websocket-frame :opcode 'text
+                                                   :payload "Hello"
+                                                   :completep nil)))))
+  (dolist (opcode '(close ping pong))
+    (should (equal
+             opcode
+             (websocket-frame-opcode
+              (websocket-read-frame
+               (websocket-encode-frame (make-websocket-frame :opcode opcode
+                                                             :completep t))))))))
+
+(ert-deftest websocket-close ()
+  (let ((sent-frames)
+        (processes-deleted))
+    (flet ((websocket-send (websocket frame) (push frame sent-frames))
+           (websocket-openp (websocket) t)
+           (kill-buffer (buffer))
+           (delete-process (proc))
+           (process-buffer (conn) (add-to-list 'processes-deleted conn)))
+      (websocket-close (websocket-inner-create
+                        :conn "fake-conn"
+                        :url t
+                        :accept-string t))
+      (should (equal sent-frames (list
+                                  (make-websocket-frame :opcode 'close
+                                                        :completep t))))
+      (should (equal processes-deleted '("fake-conn"))))))
+
+(ert-deftest websocket-outer-filter ()
+  (let* ((fake-ws (websocket-inner-create
+                   :conn t :url t :accept-string t
+                   :on-open (lambda (websocket)
+                              (should (eq (websocket-ready-state websocket)
+                                          'open))
+                              (setq open-callback-called t)
+                              (error "Ignore me!"))
+                   :on-error (lambda (ws type err))))
+         (processed-frames)
+         (frame1 (make-websocket-frame :opcode 'text :payload "foo" :completep t
+                                       :length 9))
+         (frame2 (make-websocket-frame :opcode 'text :payload "bar" :completep t
+                                       :length 9))
+         (open-callback-called)
+         (websocket-frames
+          (concat
+           (websocket-encode-frame frame1)
+           (websocket-encode-frame frame2))))
+    (flet ((websocket-process-frame
+            (websocket frame)
+            (lexical-let ((frame frame))
+              (lambda () (push frame processed-frames))))
+           (websocket-verify-response-code (output) t)
+           (websocket-verify-headers (websocket output) t))
+      (websocket-outer-filter fake-ws "Sec-")
+      (should (eq (websocket-ready-state fake-ws) 'connecting))
+      (should-not open-callback-called)
+      (websocket-outer-filter fake-ws "WebSocket-Accept: acceptstring")
+      (should-not open-callback-called)
+      (websocket-outer-filter fake-ws (concat
+                                       "\r\n\r\n"
+                                       (substring websocket-frames 0 2)))
+      (should open-callback-called)
+      (websocket-outer-filter fake-ws (substring websocket-frames 2))
+      (should (equal (list frame2 frame1) processed-frames))
+      (should-not (websocket-inflight-input fake-ws)))
+    (flet ((websocket-close (websocket)))
+      (setf (websocket-ready-state fake-ws) 'connecting)
+      (should (eq 500 (cdr (should-error
+                                (websocket-outer-filter fake-ws "HTTP/1.1 500\r\n\r\n")
+                                :type 'websocket-received-error-http-response)))))))
+
+(ert-deftest websocket-outer-filter-bad-connection ()
+  (let* ((on-open-calledp)
+         (websocket-closed-calledp)
+         (fake-ws (websocket-inner-create
+                   :conn t :url t :accept-string t
+                   :on-open (lambda (websocket)
+                              (setq on-open-calledp t)))))
+    (flet ((websocket-verify-response-code (output) t)
+           (websocket-verify-headers (websocket output) (error "Bad headers!"))
+           (websocket-close (websocket) (setq websocket-closed-calledp t)))
+      (condition-case err
+          (progn (websocket-outer-filter fake-ws "HTTP/1.1 101\r\n\r\n")
+                 (error "Should have thrown an error!"))
+        (error
+         (should-not on-open-calledp)
+         (should websocket-closed-calledp))))))
+
+(ert-deftest websocket-send-text ()
+  (flet ((websocket-send (ws frame)
+                         (should (equal
+                                  (websocket-frame-payload frame)
+                                  "\344\275\240\345\245\275"))))
+    (websocket-send-text nil "你好")))
+
+(ert-deftest websocket-send ()
+  (let ((ws (websocket-inner-create :conn t :url t :accept-string t)))
+    (flet ((websocket-ensure-connected (websocket))
+           (websocket-openp (websocket) t)
+           (process-send-string (conn string)))
+      ;; Just make sure there is no error.
+      (websocket-send ws (make-websocket-frame :opcode 'ping
+                                                       :completep t)))
+    (should-error (websocket-send ws
+                                  (make-websocket-frame :opcode 'text)))
+    (should-error (websocket-send ws
+                                  (make-websocket-frame :opcode 'close
+                                                        :payload "bye!"
+                                                        :completep t))
+                  :type 'websocket-illegal-frame)
+    (should-error (websocket-send ws
+                                  (make-websocket-frame :opcode :close))
+                  :type 'websocket-illegal-frame)))
+
+(ert-deftest websocket-verify-client-headers ()
+  (let* ((http "HTTP/1.1")
+         (host "Host: authority")
+         (upgrade "Upgrade: websocket")
+         (key (format "Sec-Websocket-Key: %s" "key"))
+         (version "Sec-Websocket-Version: 13")
+         (origin "Origin: origin")
+         (protocol "Sec-Websocket-Protocol: protocol")
+         (extensions1 "Sec-Websocket-Extensions: foo")
+         (extensions2 "Sec-Websocket-Extensions: bar; baz=2")
+         (all-required-headers (list host upgrade key version)))
+    ;; Test that all these headers are necessary
+    (should (equal
+             '(:key "key" :protocols ("protocol") :extensions ("foo" "bar; baz=2"))
+             (websocket-verify-client-headers
+              (mapconcat 'identity (append (list http "" protocol extensions1 extensions2)
+                                           all-required-headers) "\r\n"))))
+    (should (websocket-verify-client-headers
+              (mapconcat 'identity
+                         (mapcar 'upcase
+                                 (append (list http "" protocol extensions1 extensions2)
+                                         all-required-headers)) "\r\n")))
+    (dolist (header all-required-headers)
+      (should-not (websocket-verify-client-headers
+                   (mapconcat 'identity (append (list http "")
+                                                (remove header all-required-headers))
+                              "\r\n"))))
+    (should-not (websocket-verify-client-headers
+                 (mapconcat 'identity (append (list "HTTP/1.0" "") all-required-headers)
+                            "\r\n")))))
+
+(ert-deftest websocket-intersect ()
+  (should (equal '(2) (websocket-intersect '(1 2) '(2 3))))
+  (should (equal nil (websocket-intersect '(1 2) '(3 4))))
+  (should (equal '(1 2) (websocket-intersect '(1 2) '(1 2)))))
+
+(ert-deftest websocket-get-server-response ()
+  (let ((ws (websocket-inner-create :conn t :url t :accept-string "key"
+                                    :protocols '("spa" "spb")
+                                    :extensions '("sea" "seb"))))
+    (should (equal (concat
+                    "HTTP/1.1 101 Switching Protocols\r\n"
+                    "Upgrade: websocket\r\n"
+                    "Connection: Upgrade\r\n"
+                    "Sec-WebSocket-Accept: key\r\n\r\n")
+                   (websocket-get-server-response ws nil nil)))
+    (should (string-match "Sec-Websocket-Protocol: spb\r\n"
+                          (websocket-get-server-response ws '("spb" "spc") nil)))
+    (should-not (string-match "Sec-Websocket-Protocol:"
+                              (websocket-get-server-response ws '("spc") nil)))
+    (let ((output (websocket-get-server-response ws '("spa" "spb") nil)))
+      (should (string-match "Sec-Websocket-Protocol: spa\r\n" output))
+      (should (string-match "Sec-Websocket-Protocol: spb\r\n" output)))
+    (should (string-match "Sec-Websocket-Extensions: sea"
+                          (websocket-get-server-response ws nil '("sea" "sec"))))
+    (should-not (string-match "Sec-Websocket-Extensions:"
+                              (websocket-get-server-response ws nil '("sec"))))
+    (let ((output (websocket-get-server-response ws nil '("sea" "seb"))))
+      (should (string-match "Sec-Websocket-Extensions: sea\r\n" output))
+      (should (string-match "Sec-Websocket-Extensions: seb\r\n" output)))))
+
+(ert-deftest websocket-server-filter ()
+  (let ((on-open-called)
+        (ws (websocket-inner-create :conn t :url t :accept-string "key"
+                                    :on-open (lambda (ws) (setq on-open-called t))))
+        (closed)
+        (response)
+        (processed))
+    (flet ((process-send-string (p text) (setq response text))
+           (websocket-close (ws) (setq closed t))
+           (process-get (process sym) ws))
+     ;; Bad request, in two parts
+     (flet ((websocket-verify-client-headers (text) nil))
+       (websocket-server-filter nil "HTTP/1.0 GET /foo \r\n")
+       (should-not closed)
+       (websocket-server-filter nil "\r\n")
+       (should (equal response "HTTP/1.1 400 Bad Request\r\n\r\n"))
+       (should-not (websocket-inflight-input ws)))
+    ;; Good request, followed by packet
+     (setq closed nil
+           response nil)
+     (setf (websocket-inflight-input ws) nil)
+     (flet ((websocket-verify-client-headers (text) t)
+            (websocket-get-server-response (ws protocols extensions)
+                                           "response")
+            (websocket-process-input-on-open-ws (ws text)
+                                                (setq processed t)
+                                                (should
+                                                 (equal text websocket-test-hello))))
+       (websocket-server-filter nil
+                                (concat "\r\n\r\n" websocket-test-hello))
+       (should (equal (websocket-ready-state ws) 'open))
+       (should-not closed)
+       (should (equal response "response"))
+       (should processed)))))
+
+(ert-deftest websocket-complete-server-response-test ()
+  ;; Example taken from RFC
+  (should (equal
+           (concat "HTTP/1.1 101 Switching Protocols\r\n"
+                   "Upgrade: websocket\r\n"
+                   "Connection: Upgrade\r\n"
+                   "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=\r\n"
+                   "Sec-WebSocket-Protocol: chat\r\n\r\n"
+                   )
+           (let ((header-info
+                          (websocket-verify-client-headers
+                           (concat "GET /chat HTTP/1.1\r\n"
+                                   "Host: server.example.com\r\n"
+                                   "Upgrade: websocket\r\n"
+                                   "Connection: Upgrade\r\n"
+                                   "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
+                                   "Origin: http://example.com\r\n"
+                                   "Sec-WebSocket-Protocol: chat, superchat\r\n"
+                                   "Sec-WebSocket-Version: 13\r\n"))))
+                     (should header-info)
+                     (let ((ws (websocket-inner-create
+                                :conn t :url t
+                                :accept-string (websocket-calculate-accept
+                                                (plist-get header-info :key))
+                                :protocols '("chat"))))
+                       (websocket-get-server-response
+                        ws
+                        (plist-get header-info :protocols)
+                        (plist-get header-info :extension)))))))
+
+(ert-deftest websocket-server-close ()
+  (let ((websocket-server-websockets
+         (list (websocket-inner-create :conn 'conn-a :url t :accept-string t
+                                       :server-conn 'a
+                                       :ready-state 'open)
+               (websocket-inner-create :conn 'conn-b :url t :accept-string t
+                                       :server-conn 'b
+                                       :ready-state 'open)
+               (websocket-inner-create :conn 'conn-c :url t :accept-string t
+                                       :server-conn 'b
+                                       :ready-state 'closed)))
+        (deleted-processes)
+        (closed-websockets))
+    (flet ((delete-process (conn) (add-to-list 'deleted-processes conn))
+           (websocket-close (ws)
+                            ;; we always remove on closing in the
+                            ;; actual code.
+                            (setq websocket-server-websockets
+                                  (remove ws websocket-server-websockets))
+                            (should-not (eq (websocket-ready-state ws) 'closed))
+                            (add-to-list 'closed-websockets ws)))
+      (websocket-server-close 'b))
+    (should (equal deleted-processes '(b)))
+    (should (eq 1 (length closed-websockets)))
+    (should (eq 'conn-b (websocket-conn (car closed-websockets))))
+    (should (eq 1 (length websocket-server-websockets)))
+    (should (eq 'conn-a (websocket-conn (car websocket-server-websockets))))))
+
+(ert-deftest websocket-default-error-handler ()
+  (flet ((try-error
+          (callback-type err expected-message)
+          (flet ((display-warning
+                  (type message &optional level buffer-name)
+                  (should (eq type 'websocket))
+                  (should (eq level :error))
+                  (should (string= message expected-message))))
+            (websocket-default-error-handler nil
+                                             callback-type
+                                             err))))
+    (try-error
+     'on-message
+     '(end-of-buffer)
+     "in callback `on-message': End of buffer")
+
+    (try-error
+     'on-close
+     '(wrong-number-of-arguments 1 2)
+     "in callback `on-close': Wrong number of arguments: 1, 2")))
diff --git a/packages/websocket/websocket.el b/packages/websocket/websocket.el
new file mode 100644 (file)
index 0000000..7ea9c93
--- /dev/null
@@ -0,0 +1,988 @@
+;;; websocket.el --- Emacs WebSocket client and server
+
+;; Copyright (c) 2013  Free Software Foundation, Inc.
+
+;; Author: Andrew Hyatt <ahyatt at gmail dot com>
+;; Maintainer: Andrew Hyatt <ahyatt at gmail dot com>
+;; Keywords: Communication, Websocket, Server
+;; Version: 1.1
+;;
+;; 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 GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; This implements RFC 6455, which can be found at
+;; http://tools.ietf.org/html/rfc6455.
+;;
+;; This library contains code to connect Emacs as a client to a
+;; websocket server, and for Emacs to act as a server for websocket
+;; connections.
+;;
+;; Websockets clients are created by calling `websocket-open', which
+;; returns a `websocket' struct.  Users of this library use the
+;; websocket struct, and can call methods `websocket-send-text', which
+;; sends text over the websocket, or `websocket-send', which sends a
+;; `websocket-frame' struct, enabling finer control of what is sent.
+;; A callback is passed to `websocket-open' that will retrieve
+;; websocket frames called from the websocket.  Websockets are
+;; eventually closed with `websocket-close'.
+;;
+;; Server functionality is similar.  A server is started with
+;; `websocket-server' called with a port and the callbacks to use,
+;; which returns a process.  The process can later be closed with
+;; `websocket-server-close'.  A `websocket' struct is also created
+;; for every connection, and is exposed through the callbacks.
+
+(require 'bindat)
+(require 'url-parse)
+(eval-when-compile (require 'cl))
+
+;;; Code:
+
+(defstruct (websocket
+            (:constructor nil)
+            (:constructor websocket-inner-create))
+  "A websocket structure.
+This follows the W3C Websocket API, except translated to elisp
+idioms.  The API is implemented in both the websocket struct and
+additional methods.  Due to how defstruct slots are accessed, all
+API methods are prefixed with \"websocket-\" and take a websocket
+as an argument, so the distrinction between the struct API and
+the additional helper APIs are not visible to the caller.
+
+A websocket struct is created with `websocket-open'.
+
+`ready-state' contains one of 'connecting, 'open, or
+'closed, depending on the state of the websocket.
+
+The W3C API \"bufferedAmount\" call is not currently implemented,
+since there is no elisp API to get the buffered amount from the
+subprocess.  There may, in fact, be output data buffered,
+however, when the `on-message' or `on-close' callbacks are
+called.
+
+`on-open', `on-message', `on-close', and `on-error' are described
+in `websocket-open'.
+
+The `negotiated-extensions' slot lists the extensions accepted by
+both the client and server, and `negotiated-protocols' does the
+same for the protocols.
+"
+  ;; API
+  (ready-state 'connecting)
+  client-data
+  on-open
+  on-message
+  on-close
+  on-error
+  negotiated-protocols
+  negotiated-extensions
+  (server-p nil :read-only t)
+
+  ;; Other data - clients should not have to access this.
+  (url (assert nil) :read-only t)
+  (protocols nil :read-only t)
+  (extensions nil :read-only t)
+  (conn (assert nil) :read-only t)
+  ;; Only populated for servers, this is the server connection.
+  server-conn
+  accept-string
+  (inflight-input nil))
+
+(defvar websocket-version "1.1"
+  "Version numbers of this version of websocket.el.")
+
+(defvar websocket-debug nil
+  "Set to true to output debugging info to a per-websocket buffer.
+The buffer is ` *websocket URL debug*' where URL is the
+URL of the connection.")
+
+(defconst websocket-guid "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
+  "The websocket GUID as defined in RFC 6455.
+Do not change unless the RFC changes.")
+
+(defvar websocket-mask-frames t
+  "If true, we mask frames as defined in the spec.
+This is recommended to be true, and some servers will refuse to
+communicate with unmasked clients.")
+
+(defvar websocket-callback-debug-on-error nil
+  "If true, when an error happens in a client callback, invoke the debugger.
+Having this on can cause issues with missing frames if the debugger is
+exited by quitting instead of continuing, so it's best to have this set
+to nil unless it is especially needed.")
+
+(defmacro websocket-document-function (function docstring)
+  "Document FUNCTION with DOCSTRING.  Use this for defstruct accessor etc."
+  (declare (indent defun)
+           (doc-string 2))
+  `(put ',function 'function-documentation ,docstring))
+
+(websocket-document-function websocket-on-open
+  "Accessor for websocket on-open callback.
+See `websocket-open' for details.
+
+\(fn WEBSOCKET)")
+
+(websocket-document-function websocket-on-message
+  "Accessor for websocket on-message callback.
+See `websocket-open' for details.
+
+\(fn WEBSOCKET)")
+
+(websocket-document-function websocket-on-close
+  "Accessor for websocket on-close callback.
+See `websocket-open' for details.
+
+\(fn WEBSOCKET)")
+
+(websocket-document-function websocket-on-error
+  "Accessor for websocket on-error callback.
+See `websocket-open' for details.
+
+\(fn WEBSOCKET)")
+
+(defun websocket-genbytes (nbytes)
+  "Generate NBYTES random bytes."
+  (let ((s (make-string nbytes ?\s)))
+    (dotimes (i nbytes)
+      (aset s i (random 256)))
+    s))
+
+(defun websocket-try-callback (websocket-callback callback-type websocket
+                                                  &rest rest)
+  "Invoke function WEBSOCKET-CALLBACK with WEBSOCKET and REST args.
+If an error happens, it is handled according to
+`websocket-callback-debug-on-error'."
+  ;; This looks like it should be able to done more efficiently, but
+  ;; I'm not sure that's the case.  We can't do it as a macro, since
+  ;; we want it to change whenever websocket-callback-debug-on-error
+  ;; changes.
+  (let ((args rest)
+        (debug-on-error websocket-callback-debug-on-error))
+    (push websocket args)
+    (if websocket-callback-debug-on-error
+        (condition-case err
+            (apply (funcall websocket-callback websocket) args)
+          ((debug error) (funcall (websocket-on-error websocket)
+                                  websocket callback-type err)))
+      (condition-case err
+          (apply (funcall websocket-callback websocket) args)
+        (error (funcall (websocket-on-error websocket) websocket
+                        callback-type err))))))
+
+(defun websocket-genkey ()
+  "Generate a key suitable for the websocket handshake."
+  (base64-encode-string (websocket-genbytes 16)))
+
+(defun websocket-calculate-accept (key)
+  "Calculate the expect value of the accept header.
+This is based on the KEY from the Sec-WebSocket-Key header."
+  (base64-encode-string
+   (sha1 (concat key websocket-guid) nil nil t)))
+
+(defun websocket-get-bytes (s n)
+  "From string S, retrieve the value of N bytes.
+Return the value as an unsigned integer.  The value N must be a
+power of 2, up to 8.
+
+We support getting frames up to 536870911 bytes (2^29 - 1),
+approximately 537M long."
+  (if (= n 8)
+    (let* ((32-bit-parts
+            (bindat-get-field (bindat-unpack '((:val vec 2 u32)) s) :val))
+           (cval
+            (logior (lsh (aref 32-bit-parts 0) 32) (aref 32-bit-parts 1))))
+      (if (and (= (aref 32-bit-parts 0) 0)
+               (= (lsh (aref 32-bit-parts 1) -29) 0))
+          cval
+        (signal 'websocket-unparseable-frame
+                "Frame value found too large to parse!")))
+    ;; n is not 8
+    (bindat-get-field
+     (condition-case _
+         (bindat-unpack
+          `((:val
+             ,(cond ((= n 1) 'u8)
+                    ((= n 2) 'u16)
+                    ((= n 4) 'u32)
+                    ;; This is an error with the library,
+                    ;; not a user-facing, meaningful error.
+                    (t (error
+                        "websocket-get-bytes: Unknown N: %s" n)))))
+          s)
+       (args-out-of-range (signal 'websocket-unparseable-frame
+                                  (format "Frame unexpectedly shortly: %s" s))))
+     :val)))
+
+(defun websocket-to-bytes (val nbytes)
+  "Encode the integer VAL in NBYTES of data.
+NBYTES much be a power of 2, up to 8.
+
+This supports encoding values up to 536870911 bytes (2^29 - 1),
+approximately 537M long."
+  (when (and (< nbytes 8)
+             (> val (expt 2 (* 8 nbytes))))
+    ;; not a user-facing error, this must be caused from an error in
+    ;; this library
+    (error "websocket-to-bytes: Value %d could not be expressed in %d bytes"
+           val nbytes))
+  (if (= nbytes 8)
+      (progn
+        (let ((hi-32bits (lsh val -32))
+              (low-32bits (logand #xffffffff val)))
+          (when (or (> hi-32bits 0) (> (lsh low-32bits -29) 0))
+            (signal 'websocket-frame-too-large val))
+          (bindat-pack `((:val vec 2 u32))
+                       `((:val . [,hi-32bits ,low-32bits])))))
+    (bindat-pack
+     `((:val ,(cond ((= nbytes 1) 'u8)
+                    ((= nbytes 2) 'u16)
+                    ((= nbytes 4) 'u32)
+                    ;; Library error, not system error
+                    (t (error "websocket-to-bytes: Unknown NBYTES: %s" nbytes)))))
+     `((:val . ,val)))))
+
+(defun websocket-get-opcode (s)
+  "Retrieve the opcode from first byte of string S."
+  (websocket-ensure-length s 1)
+  (let ((opcode (logand #xf (websocket-get-bytes s 1))))
+    (cond ((= opcode 0) 'continuation)
+          ((= opcode 1) 'text)
+          ((= opcode 2) 'binary)
+          ((= opcode 8) 'close)
+          ((= opcode 9) 'ping)
+          ((= opcode 10) 'pong))))
+
+(defun websocket-get-payload-len (s)
+  "Parse out the payload length from the string S.
+We start at position 0, and return a cons of the payload length and how
+many bytes were consumed from the string."
+  (websocket-ensure-length s 1)
+  (let* ((initial-val (logand 127 (websocket-get-bytes s 1))))
+    (cond ((= initial-val 127)
+           (websocket-ensure-length s 9)
+           (cons (websocket-get-bytes (substring s 1) 8) 9))
+          ((= initial-val 126)
+           (websocket-ensure-length s 3)
+           (cons (websocket-get-bytes (substring s 1) 2) 3))
+          (t (cons initial-val 1)))))
+
+(defstruct websocket-frame opcode payload length completep)
+
+(defun websocket-mask (key data)
+  "Using string KEY, mask string DATA according to the RFC.
+This is used to both mask and unmask data."
+  (apply
+   'string
+   (loop for b across data
+         for i from 0 to (length data)
+         collect (logxor (websocket-get-bytes (substring key (mod i 4)) 1) b))))
+
+(defun websocket-ensure-length (s n)
+  "Ensure the string S has at most N bytes.
+Otherwise we throw the error `websocket-incomplete-frame'."
+  (when (< (length s) n)
+    (throw 'websocket-incomplete-frame nil)))
+
+(defun websocket-encode-frame (frame)
+  "Encode the FRAME struct to the binary representation."
+  (let* ((opcode (websocket-frame-opcode frame))
+         (payload (websocket-frame-payload frame))
+         (fin (websocket-frame-completep frame))
+         (payloadp (memq opcode '(continuation text binary)))
+         (mask-key (when websocket-mask-frames  (websocket-genbytes 4))))
+    (apply 'unibyte-string
+           (append (list
+                    (logior (cond ((eq opcode 'continuation) 0)
+                                  ((eq opcode 'text) 1)
+                                  ((eq opcode 'binary) 2)
+                                  ((eq opcode 'close) 8)
+                                  ((eq opcode 'ping) 9)
+                                  ((eq opcode 'pong) 10))
+                            (if fin 128 0)))
+                   (when payloadp
+                     (list
+                      (logior
+                       (if websocket-mask-frames 128 0)
+                       (cond ((< (length payload) 126) (length payload))
+                             ((< (length payload) 65536) 126)
+                             (t 127)))))
+                   (when (and payloadp (>= (length payload) 126))
+                     (append (websocket-to-bytes (length payload)
+                                          (cond ((< (length payload) 126) 1)
+                                                ((< (length payload) 65536) 2)
+                                                (t 8))) nil))
+                   (when (and payloadp websocket-mask-frames)
+                     (append mask-key nil))
+                   (when payloadp
+                     (append (if websocket-mask-frames
+                                 (websocket-mask mask-key payload)
+                               payload)
+                             nil))))))
+
+(defun websocket-read-frame (s)
+  "Read from string S a `websocket-frame' struct with the contents.
+This only gets complete frames.  Partial frames need to wait until
+the frame finishes.  If the frame is not completed, return NIL."
+  (catch 'websocket-incomplete-frame
+    (websocket-ensure-length s 1)
+    (let* ((opcode (websocket-get-opcode s))
+           (fin (logand 128 (websocket-get-bytes s 1)))
+           (payloadp (memq opcode '(continuation text binary)))
+           (payload-len (when payloadp
+                          (websocket-get-payload-len (substring s 1))))
+           (maskp (and
+                   payloadp
+                   (= 128 (logand 128 (websocket-get-bytes (substring s 1) 1)))))
+           (payload-start (when payloadp (+ (if maskp 5 1) (cdr payload-len))))
+           (payload-end (when payloadp (+ payload-start (car payload-len))))
+           (unmasked-payload (when payloadp
+                               (websocket-ensure-length s payload-end)
+                               (substring s payload-start payload-end))))
+      (make-websocket-frame
+       :opcode opcode
+       :payload
+       (if maskp
+           (let ((masking-key (substring s (+ 1 (cdr payload-len))
+                                         (+ 5 (cdr payload-len)))))
+             (websocket-mask masking-key unmasked-payload))
+         unmasked-payload)
+       :length (if payloadp payload-end 1)
+       :completep (> fin 0)))))
+
+(defun websocket-format-error (err)
+  "Format an error message like command level does.
+ERR should be a cons of error symbol and error data."
+
+  ;; Formatting code adapted from `edebug-report-error'
+  (concat (or (get (car err) 'error-message)
+              (format "peculiar error (%s)" (car err)))
+          (when (cdr err)
+            (format ": %s"
+                    (mapconcat #'prin1-to-string
+                               (cdr err) ", ")))))
+
+(defun websocket-default-error-handler (_websocket type err)
+  "The default error handler used to handle errors in callbacks."
+  (display-warning 'websocket
+                   (format "in callback `%S': %s"
+                           type
+                           (websocket-format-error err))
+                   :error))
+
+;; Error symbols in use by the library
+(put 'websocket-unsupported-protocol 'error-conditions
+     '(error websocket-error websocket-unsupported-protocol))
+(put 'websocket-unsupported-protocol 'error-message "Unsupported websocket protocol")
+(put 'websocket-wss-needs-emacs-24 'error-conditions
+     '(error websocket-error websocket-unsupported-protocol
+             websocket-wss-needs-emacs-24))
+(put 'websocket-wss-needs-emacs-24 'error-message
+     "wss protocol is not supported for Emacs before version 24.")
+(put 'websocket-received-error-http-response 'error-conditions
+     '(error websocket-error websocket-received-error-http-response))
+(put 'websocket-received-error-http-response 'error-message
+     "Error response received from websocket server")
+(put 'websocket-invalid-header 'error-conditions
+     '(error websocket-error websocket-invalid-header))
+(put 'websocket-invalid-header 'error-message
+     "Invalid HTTP header sent")
+(put 'websocket-illegal-frame 'error-conditions
+     '(error websocket-error websocket-illegal-frame))
+(put 'websocket-illegal-frame 'error-message
+     "Cannot send illegal frame to websocket")
+(put 'websocket-closed 'error-conditions
+     '(error websocket-error websocket-closed))
+(put 'websocket-closed 'error-message
+     "Cannot send message to a closed websocket")
+(put 'websocket-unparseable-frame 'error-conditions
+     '(error websocket-error websocket-unparseable-frame))
+(put 'websocket-unparseable-frame 'error-message
+     "Received an unparseable frame")
+(put 'websocket-frame-too-large 'error-conditions
+     '(error websocket-error websocket-frame-too-large))
+(put 'websocket-frame-too-large 'error-message
+     "The frame being sent is too large for this emacs to handle")
+
+(defun websocket-intersect (a b)
+  "Simple list intersection, should function like Common Lisp's `intersection'."
+  (let ((result))
+    (dolist (elem a (nreverse result))
+      (when (member elem b)
+        (push elem result)))))
+
+(defun websocket-get-debug-buffer-create (websocket)
+  "Get or create the buffer corresponding to WEBSOCKET."
+  (let ((buf (get-buffer-create (format "*websocket %s debug*"
+                                    (websocket-url websocket)))))
+    (when (= 0 (buffer-size buf))
+      (buffer-disable-undo buf))
+    buf))
+
+(defun websocket-debug (websocket msg &rest args)
+  "In the WEBSOCKET's debug buffer, send MSG, with format ARGS."
+  (when websocket-debug
+    (let ((buf (websocket-get-debug-buffer-create websocket)))
+      (save-excursion
+        (with-current-buffer buf
+          (goto-char (point-max))
+          (insert "[WS] ")
+          (insert (apply 'format (append (list msg) args)))
+          (insert "\n"))))))
+
+(defun websocket-verify-response-code (output)
+  "Verify that OUTPUT contains a valid HTTP response code.
+The only acceptable one to websocket is responce code 101.
+A t value will be returned on success, and an error thrown
+if not."
+  (string-match "HTTP/1.1 \\([[:digit:]]+\\)" output)
+  (unless (equal "101" (match-string 1 output))
+       (signal 'websocket-received-error-http-response
+               (string-to-number (match-string 1 output))))
+  t)
+
+(defun websocket-parse-repeated-field (output field)
+  "From header-containing OUTPUT, parse out the list from a
+possibly repeated field."
+  (let ((pos 0)
+        (extensions))
+    (while (and pos
+                (string-match (format "\r\n%s: \\(.*\\)\r\n" field)
+                              output pos))
+      (when (setq pos (match-end 1))
+        (setq extensions (append extensions (split-string
+                                             (match-string 1 output) ", ?")))))
+    extensions))
+
+(defun websocket-process-frame (websocket frame)
+  "Using the WEBSOCKET's filter and connection, process the FRAME.
+This returns a lambda that should be executed when all frames have
+been processed.  If the frame has a payload, the lambda has the frame
+passed to the filter slot of WEBSOCKET.  If the frame is a ping,
+the lambda has a reply with a pong.  If the frame is a close, the lambda
+has connection termination."
+  (let ((opcode (websocket-frame-opcode frame)))
+    (lexical-let ((lex-ws websocket)
+                  (lex-frame frame))
+      (cond ((memq opcode '(continuation text binary))
+             (lambda () (websocket-try-callback 'websocket-on-message 'on-message
+                                           lex-ws lex-frame)))
+            ((eq opcode 'ping)
+             (lambda () (websocket-send lex-ws
+                                   (make-websocket-frame :opcode 'pong :completep t))))
+            ((eq opcode 'close)
+             (lambda () (delete-process (websocket-conn lex-ws))))
+            (t (lambda ()))))))
+
+(defun websocket-process-input-on-open-ws (websocket text)
+  "This handles input processing for both the client and server filters."
+  (let ((current-frame)
+        (processing-queue)
+        (start-point 0))
+    (while (setq current-frame (websocket-read-frame
+                                (substring text start-point)))
+      (push (websocket-process-frame websocket current-frame) processing-queue)
+      (incf start-point (websocket-frame-length current-frame)))
+    (when (> (length text) start-point)
+      (setf (websocket-inflight-input websocket)
+            (substring text start-point)))
+    (dolist (to-process (nreverse processing-queue))
+      (funcall to-process))))
+
+(defun websocket-send-text (websocket text)
+  "To the WEBSOCKET, send TEXT as a complete frame."
+  (websocket-send
+   websocket
+   (make-websocket-frame :opcode 'text
+                         :payload (encode-coding-string
+                                   text 'raw-text)
+                         :completep t)))
+
+(defun websocket-check (frame)
+  "Check FRAME for correctness, returning true if correct."
+  (and (equal (not (memq (websocket-frame-opcode frame)
+                         '(continuation text binary)))
+              (and (not (websocket-frame-payload frame))
+                   (websocket-frame-completep frame)))))
+
+(defun websocket-send (websocket frame)
+  "To the WEBSOCKET server, send the FRAME.
+This will raise an error if the frame is illegal.
+
+The error signaled may be of type `websocket-illegal-frame' if
+the frame is malformed in some way, also having the condition
+type of `websocket-error'.  The data associated with the signal
+is the frame being sent.
+
+If the websocket is closed a signal `websocket-closed' is sent,
+also with `websocket-error' condition.  The data in the signal is
+also the frame.
+
+The frame may be too large for this buid of Emacs, in which case
+`websocket-frame-too-large' is returned, with the data of the
+size of the frame which was too large to process.  This also has
+the `websocket-error' condition."
+  (unless (websocket-check frame)
+    (signal 'websocket-illegal-frame frame))
+  (websocket-debug websocket "Sending frame, opcode: %s payload: %s"
+                   (websocket-frame-opcode frame)
+                   (websocket-frame-payload frame))
+  (websocket-ensure-connected websocket)
+  (unless (websocket-openp websocket)
+    (signal 'websocket-closed frame))
+  (process-send-string (websocket-conn websocket)
+                       (websocket-encode-frame frame)))
+
+(defun websocket-openp (websocket)
+  "Check WEBSOCKET and return non-nil if it is open, and either
+connecting or open."
+  (and websocket
+       (not (eq 'close (websocket-ready-state websocket)))
+       (member (process-status (websocket-conn websocket)) '(open run))))
+
+(defun websocket-close (websocket)
+  "Close WEBSOCKET and erase all the old websocket data."
+  (websocket-debug websocket "Closing websocket")
+  (when (websocket-openp websocket)
+    (websocket-send websocket
+                    (make-websocket-frame :opcode 'close
+                                          :completep t))
+    (setf (websocket-ready-state websocket) 'closed))
+  (let ((buf (process-buffer (websocket-conn websocket))))
+    (delete-process (websocket-conn websocket))
+    (kill-buffer buf)))
+
+(defun websocket-ensure-connected (websocket)
+  "If the WEBSOCKET connection is closed, open it."
+  (unless (and (websocket-conn websocket)
+               (ecase (process-status (websocket-conn websocket))
+                 ((run open listen) t)
+                 ((stop exit signal closed connect failed nil) nil)))
+    (websocket-close websocket)
+    (websocket-open (websocket-url websocket)
+                    :protocols (websocket-protocols websocket)
+                    :extensions (websocket-extensions websocket)
+                    :on-open (websocket-on-open websocket)
+                    :on-message (websocket-on-message websocket)
+                    :on-close (websocket-on-close websocket)
+                    :on-error (websocket-on-error websocket))))
+
+;;;;;;;;;;;;;;;;;;;;;;
+;; Websocket client ;;
+;;;;;;;;;;;;;;;;;;;;;;
+
+(defun* websocket-open (url &key protocols extensions (on-open 'identity)
+                            (on-message (lambda (_w _f))) (on-close 'identity)
+                            (on-error 'websocket-default-error-handler))
+  "Open a websocket connection to URL, returning the `websocket' struct.
+The PROTOCOL argument is optional, and setting it will declare to
+the server that this client supports the protocols in the list
+given.  We will require that the server also has to support that
+protocols.
+
+Similar logic applies to EXTENSIONS, which is a list of conses,
+the car of which is a string naming the extension, and the cdr of
+which is the list of parameter strings to use for that extension.
+The parameter strings are of the form \"key=value\" or \"value\".
+EXTENSIONS can be NIL if none are in use.  An example value would
+be '(\"deflate-stream\" . (\"mux\" \"max-channels=4\")).
+
+Optionally you can specify
+ON-OPEN, ON-MESSAGE and ON-CLOSE callbacks as well.
+
+The ON-OPEN callback is called after the connection is
+established with the websocket as the only argument.  The return
+value is unused.
+
+The ON-MESSAGE callback is called after receiving a frame, and is
+called with the websocket as the first argument and
+`websocket-frame' struct as the second.  The return value is
+unused.
+
+The ON-CLOSE callback is called after the connection is closed, or
+failed to open.  It is called with the websocket as the only
+argument, and the return value is unused.
+
+The ON-ERROR callback is called when any of the other callbacks
+have an error.  It takes the websocket as the first argument, and
+a symbol as the second argument either `on-open', `on-message',
+or `on-close', and the error as the third argument. Do NOT
+rethrow the error, or else you may miss some websocket messages.
+You similarly must not generate any other errors in this method.
+If you want to debug errors, set
+`websocket-callback-debug-on-error' to `t', but this also can be
+dangerous is the debugger is quit out of.  If not specified,
+`websocket-default-error-handler' is used.
+
+For each of these event handlers, the client code can store
+arbitrary data in the `client-data' slot in the returned
+websocket.
+
+The following errors might be thrown in this method or in
+websocket processing, all of them having the error-condition
+`websocket-error' in addition to their own symbol:
+
+`websocket-unsupported-protocol': Data in the error signal is the
+protocol that is unsupported.  For example, giving a URL starting
+with http by mistake raises this error.
+
+`websocket-wss-needs-emacs-24': Trying to connect wss protocol
+using Emacs < 24 raises this error.  You can catch this error
+also by `websocket-unsupported-protocol'.
+
+`websocket-received-error-http-response': Data in the error
+signal is the integer error number.
+
+`websocket-invalid-header': Data in the error is a string
+describing the invalid header received from the server.
+
+`websocket-unparseable-frame': Data in the error is a string
+describing the problem with the frame.
+"
+  (let* ((name (format "websocket to %s" url))
+         (url-struct (url-generic-parse-url url))
+         (key (websocket-genkey))
+         (buf-name (format " *%s*" name))
+         (coding-system-for-read 'binary)
+         (coding-system-for-write 'binary)
+         (conn (if (member (url-type url-struct) '("ws" "wss"))
+                   (let* ((type (if (equal (url-type url-struct) "ws")
+                                    'plain 'tls))
+                          (port (if (= 0 (url-port url-struct))
+                                    (if (eq type 'tls) 443 80)
+                                  (url-port url-struct)))
+                          (host (url-host url-struct))
+                          (buf (get-buffer-create buf-name)))
+                       (if (eq type 'plain)
+                           (make-network-process :name name :buffer buf :host host
+                                                 :service port :nowait nil)
+                         (condition-case-unless-debug nil
+                             (open-network-stream name buf host port :type type :nowait nil)
+                           (wrong-number-of-arguments
+                            (signal 'websocket-wss-needs-emacs-24 "wss")))))
+                 (signal 'websocket-unsupported-protocol (url-type url-struct))))
+         (websocket (websocket-inner-create
+                     :conn conn
+                     :url url
+                     :on-open on-open
+                     :on-message on-message
+                     :on-close on-close
+                     :on-error on-error
+                     :protocols protocols
+                     :extensions (mapcar 'car extensions)
+                     :accept-string
+                     (websocket-calculate-accept key))))
+    (process-put conn :websocket websocket)
+    (set-process-filter conn
+                        (lambda (process output)
+                          (let ((websocket (process-get process :websocket)))
+                            (websocket-outer-filter websocket output))))
+    (set-process-sentinel
+     conn
+     (lambda (process change)
+       (let ((websocket (process-get process :websocket)))
+         (websocket-debug websocket
+                          "State change to %s" change)
+         (unless (eq 'closed (websocket-ready-state websocket))
+           (websocket-try-callback 'websocket-on-close 'on-close websocket)))))
+    (set-process-query-on-exit-flag conn nil)
+    (process-send-string conn
+                         (format "GET %s HTTP/1.1\r\n"
+                                 (let ((path (url-filename url-struct)))
+                                   (if (> (length path) 0) path "/"))))
+    (websocket-debug websocket "Sending handshake, key: %s, acceptance: %s"
+                     key (websocket-accept-string websocket))
+    (process-send-string conn
+                         (websocket-create-headers url key protocols extensions))
+    (websocket-debug websocket "Websocket opened")
+    websocket))
+
+(defun websocket-outer-filter (websocket output)
+  "Filter the WEBSOCKET server's OUTPUT.
+This will parse headers and process frames repeatedly until there
+is no more output or the connection closes.  If the websocket
+connection is invalid, the connection will be closed."
+  (websocket-debug websocket "Received: %s" output)
+  (let ((start-point)
+        (text (concat (websocket-inflight-input websocket) output))
+        (header-end-pos))
+    (setf (websocket-inflight-input websocket) nil)
+    ;; If we've received the complete header, check to see if we've
+    ;; received the desired handshake.
+    (when (and (eq 'connecting (websocket-ready-state websocket))
+               (setq header-end-pos (string-match "\r\n\r\n" text))
+               (setq start-point (+ 4 header-end-pos)))
+      (condition-case err
+          (progn
+            (websocket-verify-response-code text)
+            (websocket-verify-headers websocket text))
+        (error
+         (websocket-close websocket)
+         (signal (car err) (cdr err))))
+      (setf (websocket-ready-state websocket) 'open)
+      (websocket-try-callback 'websocket-on-open 'on-open websocket))
+    (when (eq 'open (websocket-ready-state websocket))
+      (websocket-process-input-on-open-ws
+       websocket (substring text (or start-point 0))))))
+
+(defun websocket-verify-headers (websocket output)
+  "Based on WEBSOCKET's data, ensure the headers in OUTPUT are valid.
+The output is assumed to have complete headers.  This function
+will either return t or call `error'.  This has the side-effect
+of populating the list of server extensions to WEBSOCKET."
+  (let ((accept-string
+         (concat "Sec-WebSocket-Accept: " (websocket-accept-string websocket))))
+    (websocket-debug websocket "Checking for accept header: %s" accept-string)
+    (unless (string-match (regexp-quote accept-string) output)
+      (signal 'websocket-invalid-header
+              "Incorrect handshake from websocket: is this really a websocket connection?")))
+  (let ((case-fold-search t))
+    (websocket-debug websocket "Checking for upgrade header")
+    (unless (string-match "\r\nUpgrade: websocket\r\n" output)
+      (signal 'websocket-invalid-header
+              "No 'Upgrade: websocket' header found"))
+    (websocket-debug websocket "Checking for connection header")
+    (unless (string-match "\r\nConnection: upgrade\r\n" output)
+      (signal 'websocket-invalid-header
+              "No 'Connection: upgrade' header found"))
+    (when (websocket-protocols websocket)
+      (dolist (protocol (websocket-protocols websocket))
+        (websocket-debug websocket "Checking for protocol match: %s"
+                         protocol)
+        (let ((protocols
+               (if (string-match (format "\r\nSec-Websocket-Protocol: %s\r\n"
+                                         protocol)
+                                 output)
+                   (list protocol)
+                 (signal 'websocket-invalid-header
+                         "Incorrect or missing protocol returned by the server."))))
+          (setf (websocket-negotiated-protocols websocket) protocols))))
+    (let* ((extensions (websocket-parse-repeated-field
+                        output
+                        "Sec-WebSocket-Extensions"))
+           (extra-extensions))
+      (dolist (ext extensions)
+        (let ((x (first (split-string ext "; ?"))))
+          (unless (or (member x (websocket-extensions websocket))
+                      (member x extra-extensions))
+            (push x extra-extensions))))
+      (when extra-extensions
+        (signal 'websocket-invalid-header
+                (format "Non-requested extensions returned by server: %S"
+                        extra-extensions)))
+      (setf (websocket-negotiated-extensions websocket) extensions)))
+  t)
+
+;;;;;;;;;;;;;;;;;;;;;;
+;; Websocket server ;;
+;;;;;;;;;;;;;;;;;;;;;;
+
+(defvar websocket-server-websockets nil
+  "A list of current websockets live on any server.")
+
+(defun* websocket-server (port &rest plist)
+  "Open a websocket server on PORT.
+This also takes a plist of callbacks: `:on-open', `:on-message',
+`:on-close' and `:on-error', which operate exactly as documented
+in the websocket client function `websocket-open'.  Returns the
+connection, which should be kept in order to pass to
+`websocket-server-close'."
+  (let* ((conn (make-network-process
+                :name (format "websocket server on port %d" port)
+                :server t
+                :family 'ipv4
+                :log 'websocket-server-accept
+                :filter-multibyte nil
+                :plist plist
+                :service port)))
+    conn))
+
+(defun websocket-server-close (conn)
+  "Closes the websocket, as well as all open websockets for this server."
+  (let ((to-delete))
+    (dolist (ws websocket-server-websockets)
+      (when (eq (websocket-server-conn ws) conn)
+        (if (eq (websocket-ready-state ws) 'closed)
+            (unless (member ws to-delete)
+              (push ws to-delete))
+          (websocket-close ws))))
+    (dolist (ws to-delete)
+      (setq websocket-server-websockets (remove ws websocket-server-websockets))))
+  (delete-process conn))
+
+(defun websocket-server-accept (server client message)
+  "Accept a new websocket connection from a client."
+  (let ((ws (websocket-inner-create
+             :server-conn server
+             :conn client
+             :url client
+             :on-open (or (process-get server :on-open) 'identity)
+             :on-message (or (process-get server :on-message) (lambda (_ws _frame)))
+             :on-close (lexical-let ((user-method
+                                      (or (process-get server :on-close) 'identity)))
+                         (lambda (ws)
+                           (setq websocket-server-websockets
+                                 (remove ws websocket-server-websockets))
+                           (funcall user-method ws)))
+             :on-error (or (process-get server :on-error)
+                           'websocket-default-error-handler)
+             :protocols (process-get server :protocol)
+             :extensions (mapcar 'car (process-get server :extensions)))))
+    (unless (member ws websocket-server-websockets)
+      (push ws websocket-server-websockets))
+    (set-process-coding-system client 'unix 'unix)
+    (process-put client :websocket ws)
+    (set-process-filter client 'websocket-server-filter)
+    (set-process-coding-system client 'binary)
+    (set-process-sentinel client
+     (lambda (process change)
+       (let ((websocket (process-get process :websocket)))
+         (websocket-debug websocket "State change to %s" change)
+         (unless (eq 'closed (websocket-ready-state websocket))
+           (websocket-try-callback 'websocket-on-close 'on-close websocket)))))))
+
+(defun websocket-create-headers (url key protocol extensions)
+  "Create connections headers for the given URL, KEY, PROTOCOL and EXTENSIONS.
+These are defined as in `websocket-open'."
+  (format (concat "Host: %s\r\n"
+                  "Upgrade: websocket\r\n"
+                  "Connection: Upgrade\r\n"
+                  "Sec-WebSocket-Key: %s\r\n"
+                  "Origin: %s\r\n"
+                  "Sec-WebSocket-Version: 13\r\n"
+                  (when protocol
+                    (concat
+                     (mapconcat (lambda (protocol)
+                                  (format "Sec-WebSocket-Protocol: %s" protocol))
+                                protocol "\r\n")
+                     "\r\n"))
+                  (when extensions
+                    (format "Sec-WebSocket-Extensions: %s\r\n"
+                            (mapconcat
+                             (lambda (ext)
+                               (concat (car ext)
+                                       (when (cdr ext) "; ")
+                                       (when (cdr ext)
+                                         (mapconcat 'identity (cdr ext) "; "))))
+                             extensions ", ")))
+                  "\r\n")
+          (url-host (url-generic-parse-url url))
+          key
+          system-name
+          protocol))
+
+(defun websocket-get-server-response (websocket client-protocols client-extensions)
+  "Get the websocket response from client WEBSOCKET."
+  (let ((separator "\r\n"))
+      (concat "HTTP/1.1 101 Switching Protocols" separator
+              "Upgrade: websocket" separator
+              "Connection: Upgrade" separator
+              "Sec-WebSocket-Accept: "
+              (websocket-accept-string websocket) separator
+              (let ((protocols
+                         (websocket-intersect client-protocols
+                                              (websocket-protocols websocket))))
+                    (when protocols
+                      (concat
+                       (mapconcat
+                        (lambda (protocol) (format "Sec-WebSocket-Protocol: %s"
+                                              protocol)) protocols separator)
+                       separator)))
+              (let ((extensions (websocket-intersect
+                                   client-extensions
+                                   (websocket-extensions websocket))))
+                  (when extensions
+                    (concat
+                     (mapconcat
+                      (lambda (extension) (format "Sec-Websocket-Extensions: %s"
+                                             extension)) extensions separator)
+                     separator)))
+              separator)))
+
+(defun websocket-server-filter (process output)
+  "This acts on all OUTPUT from websocket clients PROCESS."
+  (let* ((ws (process-get process :websocket))
+         (text (concat (websocket-inflight-input ws) output)))
+    (setf (websocket-inflight-input ws) nil)
+    (cond ((eq (websocket-ready-state ws) 'connecting)
+           ;; check for connection string
+           (let ((end-of-header-pos
+                  (let ((pos (string-match "\r\n\r\n" text)))
+                    (when pos (+ 4 pos)))))
+               (if end-of-header-pos
+                   (progn
+                     (let ((header-info (websocket-verify-client-headers text)))
+                       (if header-info
+                           (progn (setf (websocket-accept-string ws)
+                                        (websocket-calculate-accept
+                                         (plist-get header-info :key)))
+                                  (process-send-string
+                                   process
+                                   (websocket-get-server-response
+                                    ws (plist-get header-info :protocols)
+                                    (plist-get header-info :extensions)))
+                                  (setf (websocket-ready-state ws) 'open)
+                                  (websocket-try-callback 'websocket-on-open
+                                                          'on-open ws))
+                         (message "Invalid client headers found in: %s" output)
+                         (process-send-string process "HTTP/1.1 400 Bad Request\r\n\r\n")
+                         (websocket-close ws)))
+                     (when (> (length text) (+ 1 end-of-header-pos))
+                       (websocket-server-filter process (substring
+                                                           text
+                                                           end-of-header-pos))))
+                 (setf (websocket-inflight-input ws) text))))
+          ((eq (websocket-ready-state ws) 'open)
+           (websocket-process-input-on-open-ws ws text))
+          ((eq (websocket-ready-state ws) 'closed)
+           (message "WARNING: Should not have received further input on closed websocket")))))
+
+(defun websocket-verify-client-headers (output)
+  "Verify the headers from the WEBSOCKET client connection in OUTPUT.
+Unlike `websocket-verify-headers', this is a quieter routine.  We
+don't want to error due to a bad client, so we just print out
+messages and a plist containing `:key', the websocket key,
+`:protocols' and `:extensions'."
+  (block nil
+    (let ((case-fold-search t)
+          (plist))
+      (unless (string-match "HTTP/1.1" output)
+        (message "Websocket client connection: HTTP/1.1 not found")
+        (return nil))
+      (unless (string-match "^Host: " output)
+        (message "Websocket client connection: Host header not found")
+        (return nil))
+      (unless (string-match "^Upgrade: websocket\r\n" output)
+        (message "Websocket client connection: Upgrade: websocket not found")
+        (return nil))
+      (if (string-match "^Sec-WebSocket-Key: \\([[:graph:]]+\\)\r\n" output)
+          (setq plist (plist-put plist :key (match-string 1 output)))
+        (message "Websocket client connect: No key sent")
+        (return nil))
+      (unless (string-match "^Sec-WebSocket-Version: 13" output)
+        (message "Websocket client connect: Websocket version 13 not found")
+        (return nil))
+      (when (string-match "^Sec-WebSocket-Protocol:" output)
+        (setq plist (plist-put plist :protocols (websocket-parse-repeated-field
+                                                 output
+                                                 "Sec-Websocket-Protocol"))))
+      (when (string-match "^Sec-WebSocket-Extensions:" output)
+        (setq plist (plist-put plist :extensions (websocket-parse-repeated-field
+                                                  output
+                                                  "Sec-Websocket-Extensions"))))
+      plist)))
+
+(provide 'websocket)
+
+;;; websocket.el ends here
diff --git a/packages/windresize/windresize.el b/packages/windresize/windresize.el
new file mode 100755 (executable)
index 0000000..e13dd3f
--- /dev/null
@@ -0,0 +1,939 @@
+;;; windresize.el --- Resize windows interactively
+;;
+;; Copyright (C) 2011  Free Software Foundation, Inc.
+;;
+;; Filename: windresize.el
+;; Author: Bastien <bzg AT altern DOT org>
+;; Maintainer: Bastien <bzg AT altern DOT org>
+;; Keywords: window
+;; Description: Set window configuration with keystrokes
+;; Version: 0.1
+;;
+;; 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, 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, write to the Free Software
+;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+;;
+;; This is not part of GNU Emacs.
+
+;;; Commentary:
+
+;; This mode lets you edit the window configuration interactively just
+;; by using the keyboard.
+;;
+;; To use it, type M-x windresize; this puts Emacs in a state
+;; where the up/down and left/right arrow keys resize the window
+;; dimensions.  To return Emacs to its ordinary state, type RET.
+;;
+;; See the docstring of `windresize' for a detailed description of the
+;; other commands that are available while windresize is active.
+
+;;; History:
+;;
+;; This was largely inspired by Hirose Yuuji and Bob Wiener original
+;; `resize-window' as posted on the emacs-devel mailing list by Juanma.
+;; This was also inspired by Lennart Borgman's bw-interactive.el (now
+;; winsize.el). See related discussions on the emacs-devel mailing
+;; list. Special thanks to Drew Adams, Juri Linkov, Stefan Monnier and
+;; JunJie Nan for useful suggestions.
+;;
+;; Also check http://www.emacswiki.org/cgi-bin/wiki/WindowResize for
+;; general hints on window resizing.
+;;
+;; Put this file into your load-path and the following into your
+;;   ~/.emacs: (require 'windresize)
+;;
+;;; Todo:
+;;
+;; - better help window
+;; - register key sequences as macros
+;; - maybe add numbers to window configurations in the ring
+;;
+;;; Code:
+
+(require 'ring)      ; for storing window configuration
+(require 'windmove)  ; for selecting adjacent window
+
+;;; User variables:
+
+(defconst windresize-version "0.6"
+  "The version number of the file windresize.el.")
+
+(defcustom windresize-move-borders t
+  "Default method for resizing windows.
+\\<windresize-map>Non-nil means that windresize will move borders.
+For example, \\[windresize-left] will move the first movable border to the
+left, trying to move the right border then the left border.  \\[windresize-up]
+will move the first movable border up, trying to move the bottom border then
+the upper border.
+
+Nil means that it will shrink or enlarge the window instead.
+\\[windresize-down] and  \\[windresize-up] will shrink and enlarge the window
+vertically.  \\[windresize-left] and \\[windresize-right] will shrink and
+enlarge the window horizontally."
+  :type 'boolean
+  :group 'convenience)
+
+(defcustom windresize-default-increment 1
+  "The default number of lines for resizing windows."
+  :type 'integer
+  :group 'convenience)
+
+(defcustom windresize-verbose 2
+  "Integer that say how verbose Windresize should be.
+The higher the number, the more feedback Windresize will give.
+A value of 0 will prevent any message to be displayed.
+A value of 1 will display errors only.
+A value of 2 will display errors and messages."
+  :type 'integer
+  :group 'convenience)
+
+(defcustom windresize-ring-size 10
+  "The size of the ring for storing window configurations."
+  :type 'integer
+  :group 'convenience)
+
+(defcustom windresize-windmove-relative-to-point 0
+  "Nil means select adjacent window relatively to the point position.
+Non-nil means select adjacent window relatively to the window
+edges.  See the docstring of `windmove-up' for details."
+  :group 'convenience
+  :type 'integer)
+
+(defcustom windresize-modifiers '((meta shift) meta
+                                 (control meta) control)
+  "A list of modifiers for arrow keys commands.
+Each element can be a modifier or a list of modifiers.
+
+The first modifier is for selecting windows with `windmove'.
+The second modifier is for moving the up/left border instead of
+the bottom/right border when there are two movable borders.
+The third modifier is to move borders and keep the width/height
+size fixed.
+The fourth modifier is to move boder or resize window while
+temporarily negating the increment value.
+
+Make sure the four elements of this list are distinct to avoid
+conflicts between keybindings."
+  :group 'convenience
+  :type '(list
+         (choice :tag "Modifier for selecting the adjacent windows"
+                 (symbol :tag "Single modifier")
+                 (repeat :tag "Multiple modifiers"
+                         (symbol :tag "Modifier")))
+         (choice :tag "Modifier for moving the left/up border instead of the right/bottom border"
+                 (symbol :tag "Single modifier")
+                 (repeat :tag "Multiple modifiers"
+                         (symbol :tag "Modifier")))
+         (choice :tag "Modifier for moving borders with fixed width/height"
+                 (symbol :tag "Single modifier")
+                 (repeat :tag "Multiple modifiers"
+                         (symbol :tag "Modifier")))
+         (choice :tag "Modifier for negating increment temporarily"
+                 (symbol :tag "Single modifier")
+                 (repeat :tag "Multiple modifiers"
+                         (symbol :tag "Modifier")))))
+
+;;; Variables and keymap:
+
+(defvar windresize-msg '("" . 0))
+(defvar windresize-buffer nil)
+(defvar windresize-increment nil)
+(defvar windresize-resizing nil)
+(defvar windresize-configuration-ring nil)
+(defvar windresize-window-configuration-0 nil)
+(defvar windresize-overriding-terminal-local-map-0 nil)
+(defvar windresize-overriding-menu-flag-0 nil)
+
+(defvar windresize-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map [remap self-insert-command] 'windresize-other-char)
+    (define-key map (kbd "M-x") 'windresize-other-char)
+    (define-key map (kbd "C-h") 'windresize-other-char)
+    ;; move borders outwards or shrink/enlarge
+    (define-key map [left] 'windresize-left)
+    (define-key map [right] 'windresize-right)
+    (define-key map [up] 'windresize-up)
+    (define-key map [down] 'windresize-down)
+    ;; Use windmove to select adjacent window. The default keybindings
+    ;; in `windresize-modifiers' should match those of windmove
+    (let ((mod (nth 0 windresize-modifiers)))
+      (if (symbolp mod) (setq mod (list mod)))
+      (define-key map (vector (append mod '(left))) 'windresize-select-left)
+      (define-key map (vector (append mod '(right))) 'windresize-select-right)
+      (define-key map (vector (append mod '(up))) 'windresize-select-up)
+      (define-key map (vector (append mod '(down))) 'windresize-select-down))
+    ;; Move the up/left border instead of bottom/right when there are
+    ;; two movable borders
+    (let ((mod (nth 1 windresize-modifiers)))
+      (if (symbolp mod) (setq mod (list mod)))
+      (define-key map (vector (append mod '(left))) 'windresize-left-force-left)
+      (define-key map (vector (append mod '(right))) 'windresize-right-force-left)
+      (define-key map (vector (append mod '(up))) 'windresize-up-force-up)
+      (define-key map (vector (append mod '(down))) 'windresize-down-force-up))
+    ;; Move borders with fixed width/height
+    (let ((mod (nth 2 windresize-modifiers)))
+      (if (symbolp mod) (setq mod (list mod)))
+      (define-key map (vector (append mod '(left))) 'windresize-left-fixed)
+      (define-key map (vector (append mod '(right))) 'windresize-right-fixed)
+      (define-key map (vector (append mod '(up))) 'windresize-up-fixed)
+      (define-key map (vector (append mod '(down))) 'windresize-down-fixed))
+    ;; Negate increment temporarily
+    (let ((mod (nth 3 windresize-modifiers)))
+      (if (symbolp mod) (setq mod (list mod)))
+      (define-key map (vector (append mod '(left))) 'windresize-left-minus)
+      (define-key map (vector (append mod '(right))) 'windresize-right-minus)
+      (define-key map (vector (append mod '(up))) 'windresize-up-minus)
+      (define-key map (vector (append mod '(down))) 'windresize-down-minus))
+    ;; Set the increment
+    (define-key map "~" 'windresize-negate-increment)
+    (define-key map "+" 'windresize-increase-increment)
+    (define-key map "-" 'windresize-decrease-increment)
+    ;; FIXME
+    (define-key map "i" 'windresize-set-increment)
+    ;; other keys
+    (define-key map " " 'windresize-toggle-method)
+    (define-key map "s" 'windresize-save-window-configuration)
+    (define-key map "r" 'windresize-restore-window-configuration)
+    ;; shorcut keys for manipulating windows
+    (define-key map "0" 'delete-window)
+    (define-key map "o" 'windresize-other-window)
+    (define-key map "n" 'windresize-next-window)
+    (define-key map "p" 'windresize-previous-window)
+    (define-key map "/" 'windresize-bottom-right)
+    (define-key map "\M-/" 'windresize-up-left)
+    (define-key map (kbd "\\") 'windresize-up-right)
+    (define-key map (kbd "M-\\") 'windresize-bottom-left)
+    (define-key map "1" 'windresize-delete-other-windows)
+    (define-key map "2" 'windresize-split-window-vertically)
+    (define-key map "3" 'windresize-split-window-horizontally)
+    (define-key map "=" 'windresize-balance-windows)
+    (define-key map "\C-xo" 'windresize-other-window)
+    (define-key map "\C-x0" 'windresize-delete-window)
+    (define-key map "\C-x1" 'windresize-delete-other-windows)
+    (define-key map "\C-x2" 'windresize-split-window-vertically)
+    (define-key map "\C-x3" 'windresize-split-window-horizontally)
+    (define-key map "\C-x+" 'windresize-balance-windows)
+    (define-key map (kbd "C-a")
+      (lambda() (interactive) (move-beginning-of-line 1)))
+    (define-key map (kbd "C-e")
+      (lambda() (interactive) (move-end-of-line 1)))
+    (define-key map "=" 'windresize-balance-windows)
+    (define-key map [mouse-1] 'mouse-set-point)
+    ;; help, save and exit
+    (define-key map (kbd "RET") 'windresize-exit)
+    (define-key map "x" 'windresize-exit)
+    (define-key map "\C-c\C-c" 'windresize-exit)
+    (define-key map "?" 'windresize-help)
+    (define-key map "q" 'windresize-cancel-and-quit)
+    (define-key map "c" 'windresize-cancel-and-quit)
+    (define-key map (kbd "C-g") 'windresize-cancel-and-quit)
+    map)
+  "Keymap for `windresize'.")
+
+(defun windresize-other-char ()
+  "Show a message instead of processing `self-insert-command'."
+  (interactive)
+  (let* ((key (if current-prefix-arg
+                 (substring (this-command-keys)
+                            universal-argument-num-events)
+               (this-command-keys))))
+    (cond ((vectorp key) (ding))
+         ((stringp key)
+          ;; send warning for only no warning for complex keys and
+          ;; mouse events
+          (setq windresize-msg
+                (cons (format "[`%s' not bound]" key) 1))))))
+
+;;; Aliases:
+
+(defun windresize-other-window ()
+  "Select other window."
+  (interactive)
+  (if (one-window-p)
+      (setq windresize-msg (cons "[No other window]" 1))
+    (other-window 1)
+    (setq windresize-msg (cons (format "Now in %s" (buffer-name)) 2))))
+
+(defalias 'windresize-next-window 'windresize-other-window)
+
+(defun windresize-previous-window ()
+  "Select the previous window."
+  (interactive)
+  (if (one-window-p)
+      (setq windresize-msg (cons "[No previous window]" 1))
+    (other-window -1)
+    (setq windresize-msg (cons (format "Now in %s" (buffer-name)) 2))))
+
+(defun windresize-delete-window ()
+  "Delete window."
+  (interactive)
+  (if (one-window-p)
+      (setq windresize-msg (cons "[Can't delete sole window]" 1))
+    (other-window 1)
+    (setq windresize-msg (cons "Window deleted" 2))))
+
+(defun windresize-delete-other-windows ()
+  "Delete other windows."
+  (interactive)
+  (if (one-window-p)
+      (setq windresize-msg (cons "[No other window]" 1))
+    (delete-other-windows)
+    (setq windresize-msg (cons "Windows deleted" 2))))
+
+(defun windresize-split-window-horizontally ()
+  "Split window horizontally."
+  (interactive)
+  (split-window-horizontally)
+  (setq windresize-msg (cons "Window horizontally split" 2)))
+
+(defun windresize-split-window-vertically ()
+  "Split window vertically."
+  (interactive)
+  (split-window-vertically)
+  (setq windresize-msg (cons "Window vertically split" 2)))
+
+(defun windresize-balance-windows ()
+  "Balance windows."
+  (interactive)
+  (balance-windows)
+  (setq windresize-msg (cons "Windows balanced" 2)))
+
+;;; Windresize:
+
+;;;###autoload
+(defun windresize (&optional increment)
+  "Resize windows interactively.
+INCREMENT is the number of lines by which borders should move.
+
+By default, the method for resizing is by moving the borders.
+The left/right key will move the only movable vertical border to
+the left/right and the up/down key will move the only horizontal
+movable border up/down.  If there are two movable borders, the
+right and the bottom border will have priority over the left and
+upper border.  You can reverse this priority by using \\[windresize-left-force-left],
+\\[windresize-right-force-left], etc.
+
+Resizing can also be done by increasing/decreasing the window
+width and height.  The up and down arrow keys will enlarge or
+shrink the window vertically and the right and left arrow keys
+will enlarge or shrink the window horizontally.
+
+You can toggle the method with \\[windresize-toggle-method].
+
+You can set the number of line by which a border should move by
+calling \\[windresize-set-increment] with a numeric prefix.
+You can temporarily negate the number of lines by which the
+windows are resized by using \\[windresize-left-minus], \\[windresize-right-minus], etc.
+If you want to permanently negate this increment value,
+use `\\[windresize-negate-increment]' instead.
+
+You can also save window configurations with `\\[windresize-save-window-configuration]' in a ring,
+and restore them with `\\[windresize-restore-window-configuration]'.
+
+`\\[windresize-cancel-and-quit]' will quit `windresize' and cancel any change.  `\\[windresize-exit]'
+will set the new window configuration and exit.
+
+\\{windresize-map}"
+  (interactive "P")
+  (if windresize-resizing
+      (windresize-exit)
+    ;; FIXME shall we exit we calling again `windresize'?
+;;       (progn (windresize-message '("[Already resizing]" . 0))
+;;          (sit-for 2))
+    (setq windresize-overriding-terminal-local-map-0
+         overriding-terminal-local-map)
+    (setq windresize-overriding-menu-flag-0
+         overriding-local-map-menu-flag)
+    (setq windresize-window-configuration-0
+         (current-window-configuration))
+    ;; set increment, window configuration ring, initial buffer
+    (setq windresize-increment windresize-default-increment)
+    (setq windresize-configuration-ring
+       (make-ring windresize-ring-size))
+    (ring-insert windresize-configuration-ring
+                (current-window-configuration))
+    (setq windresize-buffer (current-buffer))
+    ;; set overriding map and pre/post-command hooks
+    (setq overriding-terminal-local-map windresize-map)
+    (setq overriding-local-map-menu-flag t)
+    (windresize-add-command-hooks)
+    ;; set the initial message
+    (setq windresize-msg
+         (if (one-window-p)
+             (setq windresize-msg (cons "Split window with [23]" 2))
+           (setq windresize-msg (cons "" 0))))
+    (setq windresize-resizing t)
+    (windresize-message)))
+
+(defun windresize-message (&optional msg)
+  "Display a message at the bottom of the screen.
+If MSG is nil, use `windresize-msg' instead."
+  (let* ((msg0 (or msg windresize-msg))
+        (msg-l (cdr msg0))
+        (msg-t (car msg0))
+        (method (if windresize-move-borders
+                    "move borders " "resize window")))
+    (cond ((< msg-l 2) ; information
+          (add-text-properties 0 (length msg-t) '(face bold) msg-t))
+         ((< msg-l 3) ; warnings
+          (add-text-properties 0 (length msg-t) '(face shadow) msg-t)))
+    (add-text-properties 0 (length method) '(face bold) method)
+    (message "Use arrow keys to %s by %d %s  RET:set  ?:help  %s"
+            method windresize-increment
+            (if (not (equal (abs windresize-increment) 1))
+                "lines" "line ")
+            (if (<= (cdr windresize-msg) windresize-verbose)
+                msg-t ""))))
+
+(defun windresize-add-command-hooks ()
+  "Add hooks to commands when entering `windresize'."
+  (add-hook 'pre-command-hook 'windresize-pre-command)
+  (add-hook 'post-command-hook 'windresize-post-command))
+
+(defun windresize-remove-command-hooks ()
+  "Remove hooks to commands when exiting `windresize'."
+  (remove-hook 'pre-command-hook 'windresize-pre-command)
+  (remove-hook 'post-command-hook 'windresize-post-command))
+
+(defun windresize-pre-command ()
+  "Pre-command in `windresize'."
+  (setq windresize-msg (cons "" 0)))
+
+(defun windresize-post-command ()
+  "Post-command in `windresize'."
+  (windresize-message))
+
+(defun windresize-toggle-method ()
+  "Toggle resizing method."
+  (interactive)
+  (setq windresize-move-borders
+       (not windresize-move-borders))
+  (setq windresize-msg
+       (cons (format
+              "Method: %s"
+              (if (not windresize-move-borders)
+                  "resize window" "move borders")) 2)))
+
+;;; Use windmove to select the adjacent window:
+
+(defun windresize-select-down (&optional arg)
+  "Select the window below the current one.
+If ARG is nil or zero, select the window relatively to the point
+position.  If ARG is positive, select relatively to the left edge
+and select relatively to the right edge otherwise."
+  (interactive "P")
+  (condition-case nil
+      (windmove-down
+       (or arg windresize-windmove-relative-to-point))
+    (error (setq windresize-msg
+                (cons "[Can't select window below this one]" 1)))))
+
+(defun windresize-select-up (&optional arg)
+  "Select the window above the current one.
+If ARG is nil or zero, select the window relatively to the point
+position.  If ARG is positive, select relatively to the left edge
+and select relatively to the right edge otherwise."
+  (interactive "P")
+  (condition-case nil
+      (windmove-up
+       (or arg windresize-windmove-relative-to-point))
+    (error (setq windresize-msg
+                (cons "[Can't select window above this one]" 1)))))
+
+(defun windresize-select-left (&optional arg)
+  "Select the window to the left of the current one.
+If ARG is nil or zero, select the window relatively to the point
+position.  If ARG is positive, select relatively to the top edge
+and select relatively to the bottom edge otherwise."
+  (interactive "P")
+  (condition-case nil
+      (windmove-left
+       (or arg windresize-windmove-relative-to-point))
+    (error (setq windresize-msg
+                (cons "[Can't select window left this one]" 1)))))
+
+(defun windresize-select-right (&optional arg)
+  "Select the window to the right of the current one.
+If ARG is nil or zero, select the window relatively to the point
+position.  If ARG is positive, select relatively to the top edge
+and select relatively to the bottom edge otherwise."
+  (interactive "P")
+  (condition-case nil
+      (windmove-right
+       (or arg windresize-windmove-relative-to-point))
+    (error (setq windresize-msg
+                (cons "[Can't select window right this one]" 1)))))
+
+;;; Increase/decrease/set the increment value:
+
+(defun windresize-set-increment (&optional n)
+  "Set the increment value to N."
+  (interactive "p")
+  (setq windresize-increment n)
+  (setq windresize-msg (cons "Increment set" 2)))
+
+(defun windresize-negate-increment (&optional silent)
+  "Negate the increment value.
+If SILENT, dont output a message."
+  (interactive)
+  (setq windresize-increment (- windresize-increment))
+  (unless silent (setq windresize-msg (cons "Negated increment" 2))))
+
+(defun windresize-increase-increment (&optional silent)
+  "Increase the increment.
+If SILENT is non-nil, don't output a message."
+  (interactive)
+  (let ((i windresize-increment))
+    (if (eq i -1) (setq i (- i)) (setq i (1+ i)))
+    (setq windresize-increment i))
+  (unless silent (setq windresize-msg (cons "Increased increment" 2))))
+
+(defun windresize-decrease-increment (&optional silent)
+  "Decrease the increment.
+If SILENT is non-nil, don't output a message."
+  (interactive)
+  (let ((i windresize-increment))
+    (if (eq i 1) (setq i (- 1)) (setq i (1- i)))
+    (setq windresize-increment i))
+  (unless silent (setq windresize-msg (cons "Decreased increment" 2))))
+
+;;; Window configuration ring:
+
+(defun windresize-save-window-configuration ()
+  "Save the current window configuration in the ring."
+  (interactive)
+  (if (equal (ring-ref windresize-configuration-ring 0)
+            (current-window-configuration))
+      (setq windresize-msg
+           (cons "[Same window configuration: not saved]" 1))
+    (ring-insert windresize-configuration-ring
+                (current-window-configuration))
+    (setq windresize-msg
+         (cons "Configuration saved -- use `r' to restore" 2))))
+
+(defun windresize-restore-window-configuration ()
+  "Restore the previous window configuration in the ring."
+  (interactive)
+  (let ((wcf (ring-remove windresize-configuration-ring 0)))
+    (set-window-configuration wcf)
+    (ring-insert-at-beginning windresize-configuration-ring wcf))
+  (setq windresize-msg (cons "Previous configuration restored" 2)))
+
+;;; Commands for arrow keys:
+
+(defun windresize-left (&optional n left-border fixed-width)
+  "Main function for handling left commands.
+N is the number of lines by which moving borders.
+In the move-border method, move the right border to the left.
+If LEFT-BORDER is non-nil, move the left border to the left.
+In the resize-window method, shrink the window horizontally.
+
+If FIXED-WIDTH is non-nil and both left and right borders are
+movable, move the window to the left and preserve its width."
+  (interactive "P")
+  (let* ((left-w (windmove-find-other-window 'left))
+        (right-w (windmove-find-other-window 'right))
+        (i (if n (prefix-numeric-value n) windresize-increment))
+        (shrink-ok (> (- (window-width) i) window-min-width))
+        (w (selected-window)))
+    (if (not windresize-move-borders)
+       (if (not shrink-ok)
+           (setq windresize-msg
+                 (cons "[Can't shrink window horizontally]" 1))
+         (condition-case nil
+             (if shrink-ok (shrink-window-horizontally i)
+               (error t))
+           (error (setq windresize-msg
+                        (cons "[Can't shrink window horizontally]" 1)))))
+      (cond ((equal (frame-width) (window-width))
+            (setq windresize-msg (cons "No vertical split" 2)))
+           ((and left-w right-w)
+            (if left-border
+                (progn (windmove-left windresize-windmove-relative-to-point)
+                       (adjust-window-trailing-edge (selected-window) (- i) t)
+                       (select-window w)
+                       (if fixed-width (windresize-left)))
+              (condition-case nil
+                  (progn (adjust-window-trailing-edge w (- i) t)
+                         (if fixed-width (windresize-left nil t)))
+                (error (setq windresize-msg
+                             (cons "[Can't move right border left]" 1))))))
+           (left-w
+            (condition-case nil
+                (adjust-window-trailing-edge left-w (- i) t)
+              (error (setq windresize-msg (cons "[Can't move left border left]" 1)))))
+           (right-w (windresize-left-inwards))
+           (t (setq windresize-msg (cons "[Can't move border]" 1)))))))
+
+(defun windresize-right (&optional n left-border fixed-width)
+  "Main function for handling right commands.
+N is the number of lines by which moving borders.
+In the move-border method, move the right border to the right.
+If LEFT-BORDER is non-nil, move the left border to the right.
+In the resize-window method, enlarge the window horizontally.
+
+If FIXED-WIDTH is non-nil and both left and right borders are
+movable, move the window to the right and preserve its width."
+  (interactive "P")
+  (let ((right-w (windmove-find-other-window 'right))
+       (left-w (windmove-find-other-window 'left))
+       (i (if n (prefix-numeric-value n) windresize-increment))
+       (wcf (current-window-configuration))
+       (w (selected-window)))
+    (if (not windresize-move-borders)
+       (progn (ignore-errors (enlarge-window-horizontally i))
+              (if (equal wcf (current-window-configuration))
+                  (setq windresize-msg
+                        (cons "[Can't enlarge window horizontally]" 1))))
+      (cond ((equal (frame-width) (window-width))
+            (setq windresize-msg (cons "No vertical split" 2)))
+           ((and right-w left-w left-border)
+            (progn (windmove-left windresize-windmove-relative-to-point)
+                   (adjust-window-trailing-edge left-w i t)
+                   (select-window w)
+                   (if fixed-width (windresize-right))))
+           (right-w
+            (condition-case nil
+                (adjust-window-trailing-edge w i t)
+              (error (setq windresize-msg
+                           (cons "[Can't move right border right]" 1)))))
+           (left-w (windresize-right-inwards))
+           (t (setq windresize-msg (cons "[Can't move border]" 1)))))))
+
+(defun windresize-up (&optional n upper-border fixed-height)
+  "Main function for handling up commands.
+N is the number of lines by which moving borders.
+In the move-border method, move the bottom border upwards.
+If UPPER-BORDER is non-nil, move the upper border upwards.
+In the resize-window method, enlarge the window vertically.
+
+If FIXED-HEIGHT is non-nil and both the upper and lower borders
+are movable, move the window up and preserve its height."
+  (interactive "P")
+  (let ((up-w (windmove-find-other-window 'up))
+       (down-w (windmove-find-other-window 'down))
+       (i (if n (prefix-numeric-value n) windresize-increment))
+       (wcf (current-window-configuration))
+       (w (selected-window)))
+    (if (not windresize-move-borders)
+       (progn (ignore-errors (enlarge-window i))
+              (if (equal wcf (current-window-configuration))
+                  (setq windresize-msg
+                        (cons "[Can't enlarge window vertically]" 1))))
+      (cond ((equal (frame-height) (1+ (window-height)))
+            (setq windresize-msg (cons "No horizontal split" 2)))
+           ((and up-w down-w (not (window-minibuffer-p down-w)))
+            (if upper-border
+                (progn (windmove-up windresize-windmove-relative-to-point)
+                       (adjust-window-trailing-edge (selected-window) (- i) nil)
+                       (select-window w)
+                       (if fixed-height (windresize-up)))
+              (condition-case nil
+                  (adjust-window-trailing-edge w (- i) nil)
+                (error
+                 (setq windresize-msg
+                       (cons "[Can't move bottom border up]" 1))))))
+           (up-w (condition-case nil
+                     (adjust-window-trailing-edge up-w (- i) nil)
+                   (error (setq windresize-msg
+                                (cons "[Can't move upper border up]" 1)))))
+           ((and down-w (not (window-minibuffer-p down-w)))
+            (windresize-up-inwards))
+           (t (setq windresize-msg (cons "[Can't move border]" 1)))))))
+
+(defun windresize-down (&optional n upper-border fixed-height)
+  "Main function for handling down commands.
+N is the number of lines by which moving borders.
+In the move-border method, move the bottom border down.
+If UPPER-BORDER is non-nil, move the upper border down.
+In the resize-window method, shrink the window vertically.
+
+If FIXED-HEIGHT is non-nil and both the upper and lower borders
+are movable, move the window down and preserve its height."
+  (interactive "P")
+  (let* ((down-w (windmove-find-other-window 'down))
+        (up-w (windmove-find-other-window 'up))
+        (i (if n (prefix-numeric-value n) windresize-increment))
+        (shrink-ok (> (- (window-width) i) window-min-width))
+        (wcf (current-window-configuration))
+        (w (selected-window)))
+    (if (not windresize-move-borders)
+       (if (or (and (window-minibuffer-p down-w) (not up-w))
+               (< (- (window-height) i) window-min-height))
+           (setq windresize-msg (cons "[Can't shrink window vertically]" 1))
+         (if shrink-ok (shrink-window i)
+             (setq windresize-msg (cons "[Can't shrink window vertically]" 1))))
+      (cond ((equal (frame-height) (1+ (window-height)))
+            (setq windresize-msg (cons "No horizontal split" 2)))
+           ((and up-w down-w (not (window-minibuffer-p down-w))
+                 upper-border)
+            (progn (windmove-up windresize-windmove-relative-to-point)
+                   (adjust-window-trailing-edge (selected-window) i nil)
+                   (select-window w)
+                   (if fixed-height (windresize-down))))
+           ((and down-w (not (window-minibuffer-p down-w)))
+            (condition-case nil
+                (adjust-window-trailing-edge w i nil)
+              (error (setq windresize-msg (cons "[Can't move bottom border down]" 1)))))
+           (up-w (windresize-down-inwards))
+           (t (setq windresize-msg (cons "[Can't move border]" 1)))))))
+
+;;; Moving the opposite border inwards:
+
+(defun windresize-left-inwards (&optional n)
+  "Move the right border left by N lines."
+  (interactive "P")
+  (let ((i (if n (prefix-numeric-value n) windresize-increment)))
+    (condition-case nil
+       (adjust-window-trailing-edge (selected-window) (- i) t)
+      (error (setq windresize-msg
+                  (cons "[Can't move right border to the left]" 1))))))
+
+(defun windresize-right-inwards (&optional n)
+  "Move the left border right by N lines."
+  (interactive "P")
+  (let ((i (if n (prefix-numeric-value n) windresize-increment))
+       (left-w (windmove-find-other-window 'left)))
+    (condition-case nil
+       (if left-w (adjust-window-trailing-edge left-w i t) (error t))
+      (error (setq windresize-msg
+                  (cons "[Can't move left border right]" 1))))))
+
+(defun windresize-up-inwards (&optional n)
+  "Move the bottom border up by N lines."
+  (interactive "P")
+  (let ((i (if n (prefix-numeric-value n) windresize-increment))
+       (down-w (windmove-find-other-window 'down)))
+    (condition-case nil
+       (progn (if (window-minibuffer-p down-w)
+                  (setq windresize-msg
+                        (cons "[Can't move bottom border up]" 1)))
+              (adjust-window-trailing-edge
+               (selected-window) (- i) nil))
+      (error (setq windresize-msg
+                  (cons "[Can't move bottom border up]" 1))))))
+
+(defun windresize-down-inwards (&optional n)
+  "Move the upper border down by N lines."
+  (interactive "P")
+  (let ((i (if n (prefix-numeric-value n) windresize-increment))
+       (wcf (current-window-configuration))
+       (up-w (windmove-find-other-window 'up)))
+    (condition-case nil
+       (if up-w (adjust-window-trailing-edge up-w i nil)
+         (error t))
+      (error (setq windresize-msg
+                  (cons "[Can't move upper border down]" 1))))))
+
+;;; Arrow keys temoporarily negating the increment value:
+
+(defun windresize-down-minus ()
+  "Same as `windresize-left' but negate `windresize-increment'."
+  (interactive)
+  (let ((i windresize-increment))
+    (windresize-decrease-increment t)
+    (windresize-down)
+    (windresize-increase-increment t)))
+
+(defun windresize-right-minus ()
+  "Same as `windresize-left' but negate `windresize-increment'."
+  (interactive)
+  (let ((i windresize-increment))
+    (windresize-decrease-increment t)
+    (windresize-right)
+    (windresize-increase-increment t)))
+
+(defun windresize-up-minus ()
+  "Same as `windresize-left' but negate `windresize-increment'."
+  (interactive)
+  (let ((i windresize-increment))
+    (windresize-decrease-increment t)
+    (windresize-up)
+    (windresize-increase-increment t)))
+
+(defun windresize-left-minus ()
+  "Same as `windresize-left' but negate `windresize-increment'."
+  (interactive)
+  (let ((i windresize-increment))
+    (windresize-decrease-increment t)
+    (windresize-left)
+    (windresize-increase-increment t)))
+
+;;; Let's left/up borders have priority over right/bottom borders:
+
+(defun windresize-left-force-left (&optional n)
+  "If two movable borders, move the left border.
+N is the number of lines by which moving borders."
+  (interactive "P")
+  (let ((i (if n (prefix-numeric-value n)
+            windresize-increment)))
+    (windresize-left i t)))
+
+(defun windresize-right-force-left (&optional n)
+  "If two movable borders, move the left border.
+N is the number of lines by which moving borders."
+  (interactive "P")
+  (let ((i (if n (prefix-numeric-value n)
+            windresize-increment)))
+    (windresize-right i t)))
+
+(defun windresize-up-force-up (n)
+  "If two movable borders, move the upper border.
+N is the number of lines by which moving borders."
+  (interactive "P")
+  (let ((i (if n (prefix-numeric-value n)
+            windresize-increment)))
+    (windresize-up i t)))
+
+(defun windresize-down-force-up (n)
+  "If two movable borders, move the upper border.
+N is the number of lines by which moving borders."
+  (interactive)
+  (let ((i (if n (prefix-numeric-value n)
+            windresize-increment)))
+    (windresize-down i t)))
+
+;;; Move the whole window, with fixed width/height:
+
+(defun windresize-left-fixed ()
+  "Move the window left, keeping its width constant."
+  (interactive)
+  (windresize-left nil t t))
+
+(defun windresize-right-fixed ()
+  "Move the window right, keeping its width constant."
+  (interactive)
+  (windresize-right nil t t))
+
+(defun windresize-up-fixed ()
+  "Move the window up, keeping its height constant."
+  (interactive)
+  (windresize-up nil t t))
+
+(defun windresize-down-fixed ()
+  "Move the window down, keeping its height constant."
+  (interactive)
+  (windresize-down nil t t))
+
+;;; Move edges:
+
+(defun windresize-bottom-right ()
+  "Call `windresize-right' and `windresize-down' successively.
+In move-borders method, move the bottom-right edge of the window
+outwards.  In resize-window method, enlarge the window
+horizontally and shrink it vertically."
+  (interactive)
+  (windresize-right)
+  (windresize-down))
+
+(defun windresize-up-left ()
+  "Call `windresize-left' and `windresize-up' successively.
+In move-borders method, move the upper-left edge of the window
+outwards.  In resize-window method, shrink the window
+horizontally and enlarge it vertically."
+  (interactive)
+  (windresize-left nil t)
+  (windresize-up nil t))
+
+(defun windresize-up-right ()
+  "Call `windresize-right' and `windresize-up' successively.
+In move-borders method, move the upper-right edge of the window
+outwards.  In resize-window method, enlarge the window both
+horizontally and horizontally."
+  (interactive)
+  (windresize-right)
+  (windresize-up nil t))
+
+(defun windresize-bottom-left ()
+  "Call `windresize-left' and `windresize-up' successively.
+In move-borders method, move the bottom-left edge of the window
+outwards.  In resize-window method, shrink the window both
+horizontally and vertically."
+  (interactive)
+  (windresize-left nil t)
+  (windresize-down))
+
+;;; Cancel, exit and help:
+
+(defun windresize-cancel-and-quit ()
+  "Cancel window resizing and quit `windresize'."
+  (interactive)
+  (if (derived-mode-p 'help-mode)
+      (progn (View-quit)
+            (setq windresize-msg '("Help quit" . 2)))
+    (switch-to-buffer windresize-buffer)
+    (set-window-configuration windresize-window-configuration-0)
+    (setq overriding-local-map-menu-flag
+         windresize-overriding-terminal-local-map-0)
+    (setq overriding-terminal-local-map
+         windresize-overriding-menu-flag-0)
+    (message "Window resizing quit (not saved)")
+    (windresize-remove-command-hooks)
+    (setq windresize-resizing nil)))
+
+(defun windresize-exit ()
+  "Keep this window configuration and exit `windresize'."
+  (interactive)
+  (setq overriding-local-map-menu-flag
+       windresize-overriding-terminal-local-map-0)
+  (setq overriding-terminal-local-map
+       windresize-overriding-menu-flag-0)
+  (message "Window configuration set")
+  (windresize-remove-command-hooks)
+  (setq windresize-resizing nil))
+
+(defun windresize-help ()
+  "Display a help window for `windresize'."
+  (interactive)
+  (let ((pop-up-frames nil) ; otherwise we exit the loop
+       (temp-buffer-show-hook
+        '(lambda ()
+           (fit-window-to-buffer)
+           (shrink-window-if-larger-than-buffer)
+           (goto-char (point-min))
+           (save-excursion
+             (while (re-search-forward
+                     "^[ M][^\n:]+:\\|[0123~=oq]:\\|RET:" nil t)
+               (add-text-properties (match-beginning 0)
+                                    (match-end 0) '(face bold))))))
+       (help
+"Use the arrow keys to move a border into the arrow direction.
+Right and bottom borders have priority over left and up borders.
+Press SPC to toggle between moving borders and resizing windows,
+where arrow keys mean shrink/enlarge.
+
+Here is a list of default keybindings:
+
+    arrows:  move border or resize windows         =:  balance windows
+M-S-arrows:  select adjacent window                o:  other-window
+C-M-arrows:  move window with fixed width/height   0:  delete current window
+  C-arrows:  temporarilly negate INCREMENT         ~:  negate INCREMENT
+  M-arrows:  move with priority to left/up         1:  delete other windows
+         i:  set INCREMENT (to numeric prefix)     2:  split window vertically
+       +/-:  increase/decrease INCREMENT           3:  split window horizontally
+         s:  save window configuration             q:  cancel and quit
+         r:  restore window configuration          ?:  show this help window
+       SPC:  toggle method: move border, resize  RET:  set and exit
+
+         /:  move right-bottom edge outwards or left-upper edge inwards
+       M-/:  move left-upper edge outwards or right-bottom edge inwards
+         \\:  move right-upper edge outwards or left-bottom edge inwards
+       M-\\:  move left-bottom edge outwards or right-upper edge inwards
+
+See the docstring of `windresize' for detailed description."))
+    (with-output-to-temp-buffer "*Help*"
+      (princ help))))
+
+(provide 'windresize)
+
+;;; windresize.el ends here
diff --git a/packages/xclip/xclip.el b/packages/xclip/xclip.el
new file mode 100644 (file)
index 0000000..27512f3
--- /dev/null
@@ -0,0 +1,113 @@
+;;; xclip.el --- Emacs Interface to XClip
+
+;; Copyright (C) 2007, 2012  Free Software Foundation, Inc.
+
+;; Author: Leo Liu <sdl.web@gmail.com>
+;; Keywords: convenience, tools
+;; Created: 2007-12-30
+;; Version: 1.0
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This code provides an Emacs interface to the tool with the same
+;; name on http://people.debian.org/~kims/xclip/.
+;; Just add (xclip-mode 1) to your ~/.emacs.
+
+;;; Code:
+(defvar xclip-program "xclip"
+  "Name of XClip program tool.")
+
+(defvar xclip-select-enable-clipboard t
+  "Non-nil means cutting and pasting uses the clipboard.
+This is in addition to, but in preference to, the primary selection.")
+
+(defvar xclip-last-selected-text-clipboard nil
+  "The value of the CLIPBOARD X selection from xclip.")
+
+(defvar xclip-last-selected-text-primary nil
+  "The value of the PRIMARY X selection from xclip.")
+
+(defun xclip-set-selection (type data)
+  "TYPE is a symbol: primary, secondary and clipboard.
+
+See `x-set-selection'."
+  (when (and (executable-find xclip-program) (getenv "DISPLAY"))
+    (let* ((process-connection-type nil)
+           (proc (start-process "xclip" nil xclip-program
+                                "-selection" (symbol-name type))))
+      (process-send-string proc data)
+      (process-send-eof proc))))
+
+(defun xclip-select-text (text &optional push)
+  "See `x-select-text'."
+  (xclip-set-selection 'primary text)
+  (setq xclip-last-selected-text-primary text)
+  (when xclip-select-enable-clipboard
+    (xclip-set-selection 'clipboard text)
+    (setq xclip-last-selected-text-clipboard text)))
+
+(defun xclip-selection-value ()
+  "See `x-cut-buffer-or-selection-value'."
+  (when (and (executable-find xclip-program) (getenv "DISPLAY"))
+    (let (clip-text primary-text)
+      (when xclip-select-enable-clipboard
+        (setq clip-text (shell-command-to-string
+                         (concat (shell-quote-argument xclip-program)
+                                 " -o -selection clipboard")))
+        (setq clip-text
+              (cond ;; check clipboard selection
+               ((or (not clip-text) (string= clip-text ""))
+                (setq xclip-last-selected-text-primary nil))
+               ((eq      clip-text xclip-last-selected-text-clipboard) nil)
+               ((string= clip-text xclip-last-selected-text-clipboard)
+                ;; Record the newer string,
+                ;; so subsequent calls can use the `eq' test.
+                (setq xclip-last-selected-text-clipboard clip-text)
+                nil)
+               (t (setq xclip-last-selected-text-clipboard clip-text)))))
+      (setq primary-text (shell-command-to-string
+                          (concat (shell-quote-argument xclip-program) " -o")))
+      (setq primary-text
+            (cond ;; check primary selection
+             ((or (not primary-text) (string= primary-text ""))
+              (setq xclip-last-selected-text-primary nil))
+             ((eq      primary-text xclip-last-selected-text-primary) nil)
+             ((string= primary-text xclip-last-selected-text-primary)
+              ;; Record the newer string,
+              ;; so subsequent calls can use the `eq' test.
+              (setq xclip-last-selected-text-primary primary-text)
+              nil)
+             (t (setq xclip-last-selected-text-primary primary-text))))
+      (or clip-text primary-text))))
+
+(defun turn-on-xclip ()
+  (setq interprogram-cut-function 'xclip-select-text)
+  (setq interprogram-paste-function 'xclip-selection-value))
+
+(defun turn-off-xclip ()
+  (setq interprogram-cut-function nil)
+  (setq interprogram-paste-function nil))
+
+;;;###autoload
+(define-minor-mode xclip-mode
+  "Minor mode to use the `xclip' program to copy&paste."
+  :global t
+  (if xclip-mode
+      (add-hook 'terminal-init-xterm-hook 'turn-on-xclip)
+    (remove-hook 'terminal-init-xterm-hook 'turn-on-xclip)))
+
+(provide 'xclip)
+;;; xclip.el ends here
diff --git a/packages/yasnippet/README b/packages/yasnippet/README
new file mode 100644 (file)
index 0000000..2dd107b
--- /dev/null
@@ -0,0 +1,28 @@
+YASnippet is a code template system for Emacs.  To enable it in all
+buffers, add the following line to your init file:
+
+   (yas-global-mode 1)
+
+Alternatively, you can enable `yas-minor-mode' in individual buffers.
+When YASnippet is active, the following commands can be used:
+
+TAB (`yas-expand')
+   Attempt to expand a snippet before point.  For example, typing TAB
+   after `if' may expand a snippet beginning with `if', if one exists.
+   If no snippet expansion is possible, run the usual binding of TAB.
+
+`C-c & C-s' (`yas-insert-snippet')
+   Prompts for a snippet, and inserts it.
+
+`C-c & C-n' (`yas-new-snippet')
+   Opens a *new snippet* buffer where you can define a new snippet.
+   Typing C-c C-c in this buffer saves and invokes the definition.
+   The variable `yas-snippet-dirs' determines where snippet
+   definitions are stored.
+
+`C-c & C-v' (`yas-visit-snippet-file')
+   Prompt for, and visit an existing snippet definition.
+
+For more information and detailed usage, refer to the project page:
+
+     http://github.com/capitaomorte/yasnippet
diff --git a/packages/yasnippet/dropdown-list.el b/packages/yasnippet/dropdown-list.el
new file mode 100644 (file)
index 0000000..ed4e3dd
--- /dev/null
@@ -0,0 +1,253 @@
+;;; dropdown-list.el --- Drop-down menu interface
+;;
+;; Filename: dropdown-list.el
+;; Description: Drop-down menu interface
+;; Copyright (C) 2008-2012 Free Software Foundation, Inc.
+;; Author: Jaeyoun Chung [jay.chung@gmail.com]
+;; Maintainer:
+;; Authors: pluskid <pluskid@gmail.com>,  João Távora <joaotavora@gmail.com>
+;; Created: Sun Mar 16 11:20:45 2008 (Pacific Daylight Time)
+;; Version:
+;; Last-Updated: Sun Mar 16 12:19:49 2008 (Pacific Daylight Time)
+;;           By: dradams
+;;     Update #: 43
+;; URL: http://www.emacswiki.org/cgi-bin/wiki/dropdown-list.el
+;; Keywords: convenience menu
+;; Compatibility: GNU Emacs 21.x, GNU Emacs 22.x
+;;
+;; Features that might be required by this library:
+;;
+;;   `cl'.
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;;; Commentary:
+;;
+;;  According to Jaeyoun Chung, "overlay code stolen from company-mode.el."
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;;; Change log:
+;;
+;; 2008/03/16 dadams
+;;     Clean-up - e.g. use char-to-string for control chars removed by email posting.
+;;     Moved example usage code (define-key*, command-selector) inside the library.
+;;     Require cl.el at byte-compile time.
+;;     Added GPL statement.
+;; 2008/01/06 Jaeyoun Chung
+;;     Posted to gnu-emacs-sources@gnu.org at 9:10 p.m.
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; 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 <http://www.gnu.org/licenses/>.
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;;; Code:
+
+(eval-when-compile (require 'cl)) ;; decf, fourth, incf, loop, mapcar*
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defface dropdown-list-face
+  '((t :inherit default :background "lightyellow" :foreground "black"))
+  "*Bla." :group 'dropdown-list)
+
+(defface dropdown-list-selection-face
+  '((t :inherit dropdown-list-face :background "purple"))
+  "*Bla." :group 'dropdown-list)
+
+(defvar dropdown-list-overlays nil)
+
+(defun dropdown-list-hide ()
+  (while dropdown-list-overlays
+    (delete-overlay (pop dropdown-list-overlays))))
+
+(defun dropdown-list-put-overlay (beg end &optional prop value prop2 value2)
+  (let ((ov (make-overlay beg end)))
+    (overlay-put ov 'window t)
+    (when prop
+      (overlay-put ov prop value)
+      (when prop2 (overlay-put ov prop2 value2)))
+    ov))
+
+(defun dropdown-list-line (start replacement &optional no-insert)
+  ;; start might be in the middle of a tab, which means we need to hide the
+  ;; tab and add spaces
+  (let ((end (+ start (length replacement)))
+        beg-point end-point
+        before-string after-string)
+    (goto-char (point-at-eol))
+    (if (< (current-column) start)
+        (progn (setq before-string (make-string (- start (current-column)) ? ))
+               (setq beg-point (point)))
+      (goto-char (point-at-bol)) ;; Emacs bug, move-to-column is wrong otherwise
+      (move-to-column start)
+      (setq beg-point (point))
+      (when (> (current-column) start)
+        (goto-char (1- (point)))
+        (setq beg-point (point))
+        (setq before-string (make-string (- start (current-column)) ? ))))
+    (move-to-column end)
+    (setq end-point (point))
+    (let ((end-offset (- (current-column) end)))
+      (when (> end-offset 0) (setq after-string (make-string end-offset ?b))))
+    (when no-insert
+      ;; prevent inheriting of faces
+      (setq before-string (when before-string (propertize before-string 'face 'default)))
+      (setq after-string (when after-string (propertize after-string 'face 'default))))
+    (let ((string (concat before-string replacement after-string)))
+      (if no-insert
+          string
+        (push (dropdown-list-put-overlay beg-point end-point 'invisible t
+                                         'after-string string)
+              dropdown-list-overlays)))))
+
+(defun dropdown-list-start-column (display-width)
+  (let ((column (mod (current-column) (window-width)))
+        (width (window-width)))
+    (cond ((<= (+ column display-width) width) column)
+          ((> column display-width) (- column display-width))
+          ((>= width display-width) (- width display-width))
+          (t nil))))
+
+(defun dropdown-list-move-to-start-line (candidate-count)
+  (decf candidate-count)
+  (let ((above-line-count (save-excursion (- (vertical-motion (- candidate-count)))))
+        (below-line-count (save-excursion (vertical-motion candidate-count))))
+    (cond ((= below-line-count candidate-count)
+           t)
+          ((= above-line-count candidate-count)
+           (vertical-motion (- candidate-count))
+           t)
+          ((>= (+ below-line-count above-line-count) candidate-count)
+           (vertical-motion (- (- candidate-count below-line-count)))
+           t)
+          (t nil))))
+
+(defun dropdown-list-at-point (candidates &optional selidx)
+  (dropdown-list-hide)
+  (let* ((lengths (mapcar #'length candidates))
+         (max-length (apply #'max lengths))
+         (start (dropdown-list-start-column (+ max-length 3)))
+         (i -1)
+         (candidates (mapcar* (lambda (candidate length)
+                                (let ((diff (- max-length length)))
+                                  (propertize
+                                   (concat (if (> diff 0)
+                                               (concat candidate (make-string diff ? ))
+                                             (substring candidate 0 max-length))
+                                           (format "%3d" (+ 2 i)))
+                                   'face (if (eql (incf i) selidx)
+                                             'dropdown-list-selection-face
+                                           'dropdown-list-face))))
+                              candidates
+                              lengths)))
+    (save-excursion
+      (and start
+           (dropdown-list-move-to-start-line (length candidates))
+           (loop initially (vertical-motion 0)
+                 for candidate in candidates
+                 do (dropdown-list-line (+ (current-column) start) candidate)
+                 while (/= (vertical-motion 1) 0)
+                 finally return t)))))
+
+(defun dropdown-list (candidates)
+  (let ((selection)
+        (temp-buffer))
+    (save-window-excursion
+      (unwind-protect
+          (let ((candidate-count (length candidates))
+                done key (selidx 0))
+            (while (not done)
+              (unless (dropdown-list-at-point candidates selidx)
+                (switch-to-buffer (setq temp-buffer (get-buffer-create "*selection*"))
+                                  'norecord)
+                (delete-other-windows)
+                (delete-region (point-min) (point-max))
+                (insert (make-string (length candidates) ?\n))
+                (goto-char (point-min))
+                (dropdown-list-at-point candidates selidx))
+              (setq key (read-key-sequence ""))
+              (cond ((and (stringp key)
+                          (>= (aref key 0) ?1)
+                          (<= (aref key 0) (+ ?0 (min 9 candidate-count))))
+                     (setq selection (- (aref key 0) ?1)
+                           done      t))
+                    ((member key `(,(char-to-string ?\C-p) [up] "p"))
+                     (setq selidx (mod (+ candidate-count (1- (or selidx 0)))
+                                       candidate-count)))
+                    ((member key `(,(char-to-string ?\C-n) [down] "n"))
+                     (setq selidx (mod (1+ (or selidx -1)) candidate-count)))
+                    ((member key `(,(char-to-string ?\f))))
+                    ((member key `(,(char-to-string ?\r) [return]))
+                     (setq selection selidx
+                           done      t))
+                    (t (setq done t)))))
+        (dropdown-list-hide)
+        (and temp-buffer (kill-buffer temp-buffer)))
+      ;;     (when selection
+      ;;       (message "your selection => %d: %s" selection (nth selection candidates))
+      ;;       (sit-for 1))
+      selection)))
+
+(defun define-key* (keymap key command)
+  "Add COMMAND to the multiple-command binding of KEY in KEYMAP.
+Use multiple times to bind different COMMANDs to the same KEY."
+  (define-key keymap key (combine-command command (lookup-key keymap key))))
+
+(defun combine-command (command defs)
+  "$$$$$ FIXME - no doc string"
+  (cond ((null defs) command)
+        ((and (listp defs)
+              (eq 'lambda (car defs))
+              (= (length defs) 4)
+              (listp (fourth defs))
+              (eq 'command-selector (car (fourth defs))))
+         (unless (member `',command (cdr (fourth defs)))
+           (setcdr (fourth defs) (nconc (cdr (fourth defs)) `(',command))))
+         defs)
+        (t
+         `(lambda () (interactive) (command-selector ',defs ',command)))))
+
+(defvar command-selector-last-command nil "$$$$$ FIXME - no doc string")
+
+(defun command-selector (&rest candidates)
+  "$$$$$ FIXME - no doc string"
+  (if (and (eq last-command this-command) command-selector-last-command)
+      (call-interactively command-selector-last-command)
+    (let* ((candidate-strings
+            (mapcar (lambda (candidate)
+                      (format "%s" (if (symbolp candidate)
+                                       candidate
+                                     (let ((s (format "%s" candidate)))
+                                       (if (>= (length s) 7)
+                                           (concat (substring s 0 7) "...")
+                                         s)))))
+                    candidates))
+           (selection (dropdown-list candidate-strings)))
+      (when selection
+        (let ((cmd (nth selection candidates)))
+          (call-interactively cmd)
+          (setq command-selector-last-command cmd))))))
+
+;;;;;;;;;;;;;;;;;;;;
+
+(provide 'dropdown-list)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; dropdown-list.el ends here
+;; Local Variables:
+;; coding: utf-8
+;; End:
diff --git a/packages/yasnippet/snippets/c++-mode/.yas-parents b/packages/yasnippet/snippets/c++-mode/.yas-parents
new file mode 100644 (file)
index 0000000..ce9828b
--- /dev/null
@@ -0,0 +1 @@
+cc-mode
diff --git a/packages/yasnippet/snippets/c++-mode/beginend b/packages/yasnippet/snippets/c++-mode/beginend
new file mode 100644 (file)
index 0000000..4af416f
--- /dev/null
@@ -0,0 +1,4 @@
+# name: v.begin(), v.end()
+# key: beginend
+# --
+${1:v}.begin(), $1.end
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/c++-mode/class b/packages/yasnippet/snippets/c++-mode/class
new file mode 100644 (file)
index 0000000..f33f8b4
--- /dev/null
@@ -0,0 +1,9 @@
+# name: class ... { ... }
+# key: class
+# --
+class ${1:Name}
+{
+public:
+    ${1:$(yas-substr text "[^: ]*")}($2);
+    virtual ~${1:$(yas-substr text "[^: ]*")}();
+};
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/c++-mode/ns b/packages/yasnippet/snippets/c++-mode/ns
new file mode 100644 (file)
index 0000000..a343964
--- /dev/null
@@ -0,0 +1,4 @@
+# name: namespace ...
+# key: ns
+# --
+namespace 
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/c++-mode/template b/packages/yasnippet/snippets/c++-mode/template
new file mode 100644 (file)
index 0000000..ed36b08
--- /dev/null
@@ -0,0 +1,4 @@
+# name: template <typename ...>
+# key: template
+# --
+template <typename ${T}>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/c++-mode/using b/packages/yasnippet/snippets/c++-mode/using
new file mode 100644 (file)
index 0000000..f28937f
--- /dev/null
@@ -0,0 +1,5 @@
+# name: using namespace ... 
+# key: using
+# --
+using namespace ${std};
+$0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/c-mode/.yas-parents b/packages/yasnippet/snippets/c-mode/.yas-parents
new file mode 100644 (file)
index 0000000..ce9828b
--- /dev/null
@@ -0,0 +1 @@
+cc-mode
diff --git a/packages/yasnippet/snippets/c-mode/fopen b/packages/yasnippet/snippets/c-mode/fopen
new file mode 100644 (file)
index 0000000..b3339e4
--- /dev/null
@@ -0,0 +1,4 @@
+# name: FILE *fp = fopen(..., ...);
+# key: fopen
+# --
+FILE *${fp} = fopen(${"file"}, "${r}");
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/c-mode/printf b/packages/yasnippet/snippets/c-mode/printf
new file mode 100644 (file)
index 0000000..035d07e
--- /dev/null
@@ -0,0 +1,7 @@
+# -*- mode: snippet -*-
+# name: printf 
+# contributor: joaotavora
+# key: printf
+# --
+printf ("${1:%s}\\n"${1:$(if (string-match "%" text) "," "\);")
+}$2${1:$(if (string-match "%" text) "\);" "")}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/cc-mode/.yas-parents b/packages/yasnippet/snippets/cc-mode/.yas-parents
new file mode 100644 (file)
index 0000000..eed5b44
--- /dev/null
@@ -0,0 +1 @@
+text-mode
diff --git a/packages/yasnippet/snippets/cc-mode/do b/packages/yasnippet/snippets/cc-mode/do
new file mode 100644 (file)
index 0000000..a42d27f
--- /dev/null
@@ -0,0 +1,7 @@
+# name: do { ... } while (...)
+# key: do
+# --
+do
+{
+    $0
+} while (${1:condition});
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/cc-mode/for b/packages/yasnippet/snippets/cc-mode/for
new file mode 100644 (file)
index 0000000..1e1d4bf
--- /dev/null
@@ -0,0 +1,7 @@
+# name: for (...; ...; ...) { ... }
+# key: for
+# --
+for (${1:int i = 0}; ${2:i < N}; ${3:++i})
+{
+    $0
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/cc-mode/if b/packages/yasnippet/snippets/cc-mode/if
new file mode 100644 (file)
index 0000000..5c6a121
--- /dev/null
@@ -0,0 +1,7 @@
+# name: if (...) { ... }
+# key: if
+# --
+if (${1:condition})
+{
+    $0
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/cc-mode/inc b/packages/yasnippet/snippets/cc-mode/inc
new file mode 100644 (file)
index 0000000..9c9ed76
--- /dev/null
@@ -0,0 +1,4 @@
+# name: #include "..."
+# key: inc
+# --
+#include "$1"
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/cc-mode/inc.1 b/packages/yasnippet/snippets/cc-mode/inc.1
new file mode 100644 (file)
index 0000000..649cbd9
--- /dev/null
@@ -0,0 +1,4 @@
+# name: #include <...>
+# key: inc
+# --
+#include <$1>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/cc-mode/main b/packages/yasnippet/snippets/cc-mode/main
new file mode 100644 (file)
index 0000000..dab1cad
--- /dev/null
@@ -0,0 +1,8 @@
+# name: int main(argc, argv) { ... }
+# key: main
+# --
+int main(int argc, char *argv[])
+{
+    $0
+    return 0;
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/cc-mode/once b/packages/yasnippet/snippets/cc-mode/once
new file mode 100644 (file)
index 0000000..ea14f9a
--- /dev/null
@@ -0,0 +1,9 @@
+# name: #ifndef XXX; #define XXX; #endif
+# key: once
+# --
+#ifndef ${1:_`(upcase (file-name-nondirectory (file-name-sans-extension (buffer-file-name))))`_H_}
+#define $1
+
+$0
+
+#endif /* $1 */
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/cc-mode/struct b/packages/yasnippet/snippets/cc-mode/struct
new file mode 100644 (file)
index 0000000..39ddfa8
--- /dev/null
@@ -0,0 +1,7 @@
+# name: struct ... { ... }
+# key: struct
+# --
+struct ${1:name}
+{
+    $0
+};
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/cperl-mode/.yas-parents b/packages/yasnippet/snippets/cperl-mode/.yas-parents
new file mode 100644 (file)
index 0000000..bfa2993
--- /dev/null
@@ -0,0 +1 @@
+perl-mode
diff --git a/packages/yasnippet/snippets/csharp-mode/.yas-parents b/packages/yasnippet/snippets/csharp-mode/.yas-parents
new file mode 100644 (file)
index 0000000..ce9828b
--- /dev/null
@@ -0,0 +1 @@
+cc-mode
diff --git a/packages/yasnippet/snippets/csharp-mode/attrib b/packages/yasnippet/snippets/csharp-mode/attrib
new file mode 100644 (file)
index 0000000..f617cee
--- /dev/null
@@ -0,0 +1,8 @@
+# contributor: Alejandro Espinoza Esparza <aespinoza@structum.com.mx>
+# name: private attribute ....;
+# key: attrib
+# --
+/// <summary>
+/// $3
+/// </summary>
+private $1 $2;
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/csharp-mode/attrib.1 b/packages/yasnippet/snippets/csharp-mode/attrib.1
new file mode 100644 (file)
index 0000000..ac967ad
--- /dev/null
@@ -0,0 +1,22 @@
+# contributor: Alejandro Espinoza Esparza <aespinoza@structum.com.mx>
+# name: private attribute ....; public property ... ... { ... }
+# key: attrib
+# --
+/// <summary>
+/// $3
+/// </summary>
+private $1 $2;
+
+/// <summary>
+/// $4
+/// </summary>
+/// <value>$5</value>
+public $1 $2
+{
+    get {
+        return this.$2;
+    }
+    set {
+        this.$2 = value;
+    }
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/csharp-mode/attrib.2 b/packages/yasnippet/snippets/csharp-mode/attrib.2
new file mode 100644 (file)
index 0000000..20f1263
--- /dev/null
@@ -0,0 +1,22 @@
+# contributor: Alejandro Espinoza Esparza <aespinoza@structum.com.mx>
+# name: private _attribute ....; public Property ... ... { ... }
+# key: attrib
+# --
+/// <summary>
+/// $3
+/// </summary>
+private $1 ${2:$(if (> (length text) 0) (format "_%s%s" (downcase (substring text 0 1)) (substring text 1 (length text))) "")};
+
+/// <summary>
+/// ${3:Description}
+/// </summary>
+/// <value><c>$1</c></value>
+public ${1:Type} ${2:Name}
+{
+    get {
+        return this.${2:$(if (> (length text) 0) (format "_%s%s" (downcase (substring text 0 1)) (substring text 1 (length text))) "")};
+    }
+    set {
+        this.${2:$(if (> (length text) 0) (format "_%s%s" (downcase (substring text 0 1)) (substring text 1 (length text))) "")} = value;
+    }
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/csharp-mode/class b/packages/yasnippet/snippets/csharp-mode/class
new file mode 100644 (file)
index 0000000..6c74c37
--- /dev/null
@@ -0,0 +1,22 @@
+# contributor: Alejandro Espinoza Esparza <aespinoza@structum.com.mx>
+# name: class ... { ... }
+# key: class
+# --
+${5:public} class ${1:Name}
+{
+    #region Ctor & Destructor
+    /// <summary>
+    /// ${3:Standard Constructor}
+    /// </summary>
+    public $1($2)
+    {
+    }
+
+    /// <summary>
+    /// ${4:Default Destructor}
+    /// </summary>    
+    public ~$1()
+    {
+    }
+    #endregion
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/csharp-mode/comment b/packages/yasnippet/snippets/csharp-mode/comment
new file mode 100644 (file)
index 0000000..562689b
--- /dev/null
@@ -0,0 +1,7 @@
+# contributor: Alejandro Espinoza Esparza <aespinoza@structum.com.mx>
+# name: /// <summary> ... </summary>
+# key: comment
+# --
+/// <summary>
+/// $1
+/// </summary>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/csharp-mode/comment.1 b/packages/yasnippet/snippets/csharp-mode/comment.1
new file mode 100644 (file)
index 0000000..856189d
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Alejandro Espinoza Esparza <aespinoza@structum.com.mx>
+# name: /// <param name="..."> ... </param>
+# key: comment
+# --
+/// <param name="$1">$2</param>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/csharp-mode/comment.2 b/packages/yasnippet/snippets/csharp-mode/comment.2
new file mode 100644 (file)
index 0000000..e890f1c
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Alejandro Espinoza Esparza <aespinoza@structum.com.mx>
+# name: /// <param name="..."> ... </param>
+# key: comment
+# --
+/// <returns>$1</returns>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/csharp-mode/comment.3 b/packages/yasnippet/snippets/csharp-mode/comment.3
new file mode 100644 (file)
index 0000000..13e6057
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Alejandro Espinoza Esparza <aespinoza@structum.com.mx>
+# name: /// <exception cref="..."> ... </exception>
+# key: comment
+# --
+/// <exception cref="$1">$2</exception>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/csharp-mode/method b/packages/yasnippet/snippets/csharp-mode/method
new file mode 100644 (file)
index 0000000..e5ea465
--- /dev/null
@@ -0,0 +1,11 @@
+# contributor: Alejandro Espinoza Esparza <aespinoza@structum.com.mx>
+# name: public void Method { ... }
+# key: method
+# --
+/// <summary>
+/// ${5:Description}
+/// </summary>${2:$(if (string= (upcase text) "VOID") "" (format "%s%s%s" "\n/// <returns><c>" text "</c></returns>"))}
+${1:public} ${2:void} ${3:MethodName}($4)
+{
+$0
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/csharp-mode/namespace b/packages/yasnippet/snippets/csharp-mode/namespace
new file mode 100644 (file)
index 0000000..56c5d99
--- /dev/null
@@ -0,0 +1,8 @@
+# contributor: Alejandro Espinoza Esparza <aespinoza@structum.com.mx>
+# name: namespace .. { ... }
+# key: namespace
+# --
+namespace $1
+{
+$0
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/csharp-mode/prop b/packages/yasnippet/snippets/csharp-mode/prop
new file mode 100644 (file)
index 0000000..c711d23
--- /dev/null
@@ -0,0 +1,17 @@
+# contributor: Alejandro Espinoza Esparza <aespinoza@structum.com.mx>
+# name: property ... ... { ... }
+# key: prop
+# --
+/// <summary>
+/// $5
+/// </summary>
+/// <value>$6</value>
+$1 $2 $3
+{
+    get {
+        return this.$4;
+    }
+    set {
+        this.$4 = value;
+    }
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/csharp-mode/region b/packages/yasnippet/snippets/csharp-mode/region
new file mode 100644 (file)
index 0000000..a155730
--- /dev/null
@@ -0,0 +1,7 @@
+# contributor: Alejandro Espinoza Esparza <aespinoza@structum.com.mx>
+# name: #region ... #endregion
+# key: region
+# --
+#region $1
+$0
+#endregion
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/csharp-mode/using b/packages/yasnippet/snippets/csharp-mode/using
new file mode 100644 (file)
index 0000000..4103995
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Alejandro Espinoza Esparza <aespinoza@structum.com.mx>
+# name: using ...;
+# key: using
+# --
+using $1;
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/csharp-mode/using.1 b/packages/yasnippet/snippets/csharp-mode/using.1
new file mode 100644 (file)
index 0000000..452b07b
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Alejandro Espinoza Esparza <aespinoza@structum.com.mx>
+# name: using System;
+# key: using
+# --
+using System;
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/csharp-mode/using.2 b/packages/yasnippet/snippets/csharp-mode/using.2
new file mode 100644 (file)
index 0000000..d3a8980
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Alejandro Espinoza Esparza <aespinoza@structum.com.mx>
+# name: using System....;
+# key: using
+# --
+using System.$1;
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/css-mode/.yas-parents b/packages/yasnippet/snippets/css-mode/.yas-parents
new file mode 100644 (file)
index 0000000..eed5b44
--- /dev/null
@@ -0,0 +1 @@
+text-mode
diff --git a/packages/yasnippet/snippets/css-mode/bg b/packages/yasnippet/snippets/css-mode/bg
new file mode 100644 (file)
index 0000000..89597cb
--- /dev/null
@@ -0,0 +1,4 @@
+# name: background-color: ...
+# key: bg
+# --
+background-color: #${1:DDD};
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/css-mode/bg.1 b/packages/yasnippet/snippets/css-mode/bg.1
new file mode 100644 (file)
index 0000000..f74f6e4
--- /dev/null
@@ -0,0 +1,4 @@
+# name: background-image: ...
+# key: bg
+# --
+background-image: url($1);
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/css-mode/bor b/packages/yasnippet/snippets/css-mode/bor
new file mode 100644 (file)
index 0000000..b2a1bf2
--- /dev/null
@@ -0,0 +1,4 @@
+# name: border size style color
+# key: bor
+# --
+border: ${1:1px} ${2:solid} #${3:999};
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/css-mode/cl b/packages/yasnippet/snippets/css-mode/cl
new file mode 100644 (file)
index 0000000..fcfd345
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: rejeep <johan.rejeep@gmail.com>
+# name: clear: ...
+# key: cl
+# --
+clear: $1;
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/css-mode/disp.block b/packages/yasnippet/snippets/css-mode/disp.block
new file mode 100644 (file)
index 0000000..2571ba4
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: rejeep <johan.rejeep@gmail.com>
+# name: display: block
+# key: disp
+# --
+display: block;
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/css-mode/disp.inline b/packages/yasnippet/snippets/css-mode/disp.inline
new file mode 100644 (file)
index 0000000..0be30e3
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: rejeep <johan.rejeep@gmail.com>
+# name: display: inline
+# key: disp
+# --
+display: inline;
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/css-mode/disp.none b/packages/yasnippet/snippets/css-mode/disp.none
new file mode 100644 (file)
index 0000000..58c40d0
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: rejeep <johan.rejeep@gmail.com>
+# name: display: none
+# key: disp
+# --
+display: none;
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/css-mode/ff b/packages/yasnippet/snippets/css-mode/ff
new file mode 100644 (file)
index 0000000..4218908
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: rejeep <johan.rejeep@gmail.com>
+# name: font-family: ...
+# key: ff
+# --
+font-family: $1;
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/css-mode/fs b/packages/yasnippet/snippets/css-mode/fs
new file mode 100644 (file)
index 0000000..98a050a
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: rejeep <johan.rejeep@gmail.com>
+# name: font-size: ...
+# key: fs
+# --
+font-size: ${12px};
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/css-mode/mar.bottom b/packages/yasnippet/snippets/css-mode/mar.bottom
new file mode 100644 (file)
index 0000000..6dbe9f8
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: rejeep <johan.rejeep@gmail.com>
+# name: margin-bottom: ...
+# key: mar
+# --
+margin-bottom: $1;
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/css-mode/mar.left b/packages/yasnippet/snippets/css-mode/mar.left
new file mode 100644 (file)
index 0000000..0ba7b3b
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: rejeep <johan.rejeep@gmail.com>
+# name: margin-left: ...
+# key: mar
+# --
+margin-left: $1;
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/css-mode/mar.mar b/packages/yasnippet/snippets/css-mode/mar.mar
new file mode 100644 (file)
index 0000000..e45a33c
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: rejeep <johan.rejeep@gmail.com>
+# name: margin: ...
+# key: mar
+# --
+margin: $1;
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/css-mode/mar.margin b/packages/yasnippet/snippets/css-mode/mar.margin
new file mode 100644 (file)
index 0000000..0716fc8
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: rejeep <johan.rejeep@gmail.com>
+# name: margin top right bottom left
+# key: mar
+# --
+margin: ${top} ${right} ${bottom} ${left};
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/css-mode/mar.right b/packages/yasnippet/snippets/css-mode/mar.right
new file mode 100644 (file)
index 0000000..49f05d7
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: rejeep <johan.rejeep@gmail.com>
+# name: margin-right: ...
+# key: mar
+# --
+margin-right: $1;
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/css-mode/mar.top b/packages/yasnippet/snippets/css-mode/mar.top
new file mode 100644 (file)
index 0000000..168f458
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: rejeep <johan.rejeep@gmail.com>
+# name: margin-top: ...
+# key: mar
+# --
+margin-top: $1;
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/css-mode/pad.bottom b/packages/yasnippet/snippets/css-mode/pad.bottom
new file mode 100644 (file)
index 0000000..3e4c665
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: rejeep <johan.rejeep@gmail.com>
+# name: padding-bottom: ...
+# key: pad
+# --
+padding-bottom: $1;
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/css-mode/pad.left b/packages/yasnippet/snippets/css-mode/pad.left
new file mode 100644 (file)
index 0000000..5e49b28
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: rejeep <johan.rejeep@gmail.com>
+# name: padding-left: ...
+# key: pad
+# --
+padding-left: $1;
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/css-mode/pad.pad b/packages/yasnippet/snippets/css-mode/pad.pad
new file mode 100644 (file)
index 0000000..ce81c36
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: rejeep <johan.rejeep@gmail.com>
+# name: padding: ...
+# key: pad
+# --
+padding: $1;
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/css-mode/pad.padding b/packages/yasnippet/snippets/css-mode/pad.padding
new file mode 100644 (file)
index 0000000..0be7890
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: rejeep <johan.rejeep@gmail.com>
+# name: padding: top right bottom left
+# key: pad
+# --
+padding: ${top} ${right} ${bottom} ${left};
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/css-mode/pad.right b/packages/yasnippet/snippets/css-mode/pad.right
new file mode 100644 (file)
index 0000000..a244b94
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: rejeep <johan.rejeep@gmail.com>
+# name: padding-right: ...
+# key: pad
+# --
+padding-right: $1;
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/css-mode/pad.top b/packages/yasnippet/snippets/css-mode/pad.top
new file mode 100644 (file)
index 0000000..d315e46
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: rejeep <johan.rejeep@gmail.com>
+# name: padding-top: ...
+# key: pad
+# --
+padding-top: $1;
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/.read_me b/packages/yasnippet/snippets/emacs-lisp-mode/.read_me
new file mode 100644 (file)
index 0000000..49c8e00
--- /dev/null
@@ -0,0 +1,7 @@
+-*- coding: utf-8 -*-
+Originally started by Xah Lee (xahlee.org) on 2009-02-22
+Released under GPL 3.
+
+Feel free to add missing ones or modify existing ones to improve.
+
+Those starting with “x-” are supposed to be idiom templates. Not sure it's very useful. They might start with “i-” or "id-" in the future.
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/.yas-parents b/packages/yasnippet/snippets/emacs-lisp-mode/.yas-parents
new file mode 100644 (file)
index 0000000..eed5b44
--- /dev/null
@@ -0,0 +1 @@
+text-mode
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/add-hook.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/add-hook.yasnippet
new file mode 100644 (file)
index 0000000..04f1f01
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: add-hook
+# key: add-hook
+# key: ah
+# --
+(add-hook HOOK$0 FUNCTION)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/and.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/and.yasnippet
new file mode 100644 (file)
index 0000000..cfc7dfc
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: and
+# key: and
+# key: a
+# --
+(and $0)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/append.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/append.yasnippet
new file mode 100644 (file)
index 0000000..585dfdc
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: append
+# key: append
+# --
+(append $0 )
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/apply.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/apply.yasnippet
new file mode 100644 (file)
index 0000000..2cfe695
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: apply
+# key: apply
+# --
+(apply $0 )
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/aref.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/aref.yasnippet
new file mode 100644 (file)
index 0000000..0df3b8e
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: aref
+# key: aref
+# --
+(aref ARRAY$0 INDEX)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/aset.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/aset.yasnippet
new file mode 100644 (file)
index 0000000..0813e7e
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: aset
+# key: aset
+# --
+(aset ARRAY$0 IDX NEWELT)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/assq.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/assq.yasnippet
new file mode 100644 (file)
index 0000000..61609c8
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: assq
+# key: assq
+# --
+(assq KEY$0 LIST)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/autoload.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/autoload.yasnippet
new file mode 100644 (file)
index 0000000..20052f5
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: autoload
+# key: autoload
+# --
+(autoload 'FUNCNAME$0 "FILENAME" &optional "DOCSTRING" INTERACTIVE TYPE)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/backward-char.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/backward-char.yasnippet
new file mode 100644 (file)
index 0000000..782b35c
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: backward-char
+# key: backward-char
+# key: bc
+# --
+(backward-char $0)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/beginning-of-line.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/beginning-of-line.yasnippet
new file mode 100644 (file)
index 0000000..cd75859
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: beginning-of-line
+# key: beginning-of-line
+# key: bol
+# --
+(beginning-of-line)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/bounds-of-thing-at-point.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/bounds-of-thing-at-point.yasnippet
new file mode 100644 (file)
index 0000000..507457c
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: bounds-of-thing-at-point
+# key: bounds-of-thing-at-point
+# key: botap
+# --
+(bounds-of-thing-at-point '$0) ; symbol, list, sexp, defun, filename, url, email, word, sentence, whitespace, line, page ...
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/buffer-file-name.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/buffer-file-name.yasnippet
new file mode 100644 (file)
index 0000000..726c508
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: buffer-file-name
+# key: buffer-file-name
+# key: bfn
+# --
+(buffer-file-name)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/buffer-modified-p.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/buffer-modified-p.yasnippet
new file mode 100644 (file)
index 0000000..87ff31e
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: buffer-modified-p
+# key: buffer-modified-p
+# key: bmp
+# --
+(buffer-modified-p $0)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/buffer-substring-no-properties.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/buffer-substring-no-properties.yasnippet
new file mode 100644 (file)
index 0000000..1b04019
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: buffer-substring-no-properties
+# key: buffer-substring-no-properties
+# key: bsnp
+# --
+(buffer-substring-no-properties START$0 END)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/buffer-substring.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/buffer-substring.yasnippet
new file mode 100644 (file)
index 0000000..002a4f0
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: buffer-substring
+# key: buffer-substring
+# key: bs
+# --
+(buffer-substring START$0 END)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/car.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/car.yasnippet
new file mode 100644 (file)
index 0000000..5406d94
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: car
+# key: car
+# --
+(car $0)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/cdr.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/cdr.yasnippet
new file mode 100644 (file)
index 0000000..0afd31f
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: cdr
+# key: cdr
+# --
+(cdr $0)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/concat.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/concat.yasnippet
new file mode 100644 (file)
index 0000000..42436b4
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: concat
+# key: concat
+# --
+(concat $0)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/cond.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/cond.yasnippet
new file mode 100644 (file)
index 0000000..4c40194
--- /dev/null
@@ -0,0 +1,8 @@
+# contributor: Xah Lee (XahLee.org)
+# name: cond
+# key: cond
+# --
+(cond
+(CONDITION$0 BODY)
+(CONDITION BODY)
+)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/condition-case.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/condition-case.yasnippet
new file mode 100644 (file)
index 0000000..80d09ad
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: condition-case
+# key: condition-case
+# key: cc
+# --
+(condition-case $0 )
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/cons.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/cons.yasnippet
new file mode 100644 (file)
index 0000000..a0f90ce
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: cons
+# key: cons
+# --
+(cons $0)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/consp.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/consp.yasnippet
new file mode 100644 (file)
index 0000000..f4b3f99
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: consp
+# key: consp
+# --
+(consp $0 )
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/copy-directory.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/copy-directory.yasnippet
new file mode 100644 (file)
index 0000000..4c47d2f
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: copy-directory
+# key: copy-directory
+# key: cd
+# --
+(copy-directory $0 NEWNAME &optional KEEP-TIME PARENTS)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/copy-file.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/copy-file.yasnippet
new file mode 100644 (file)
index 0000000..021c60e
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: copy-file
+# key: copy-file
+# key: cf
+# --
+(copy-file FILE$0 NEWNAME &optional OK-IF-ALREADY-EXISTS KEEP-TIME PRESERVE-UID-GID)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/current-buffer.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/current-buffer.yasnippet
new file mode 100644 (file)
index 0000000..59859be
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: current-buffer
+# key: current-buffer
+# key: cb
+# --
+(current-buffer)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/custom-autoload.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/custom-autoload.yasnippet
new file mode 100644 (file)
index 0000000..7961f9e
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: custom-autoload
+# key: custom-autoload
+# key: ca
+# --
+(custom-autoload$0 SYMBOL LOAD &optional NOSET)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/defalias.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/defalias.yasnippet
new file mode 100644 (file)
index 0000000..56d5855
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: defalias
+# key: defalias
+# --
+(defalias 'SYMBOL$0 'DEFINITION &optional DOCSTRING)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/defcustom.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/defcustom.yasnippet
new file mode 100644 (file)
index 0000000..db709be
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: defcustom
+# key: defcustom
+# --
+(defcustom $0 VALUE "DOC" &optional ARGS)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/define-key.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/define-key.yasnippet
new file mode 100644 (file)
index 0000000..a04e5d7
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: define-key
+# key: define-key
+# key: dk
+# --
+(define-key KEYMAPNAME$0 (kbd "M-b") 'FUNCNAME)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/defsubst.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/defsubst.yasnippet
new file mode 100644 (file)
index 0000000..5535af1
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: defsubst
+# key: defsubst
+# --
+(defsubst $0 )
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/defun.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/defun.yasnippet
new file mode 100644 (file)
index 0000000..0f3644b
--- /dev/null
@@ -0,0 +1,12 @@
+# contributor: Xah Lee (XahLee.org)
+# name: defun
+# key: defun
+# key: d
+# --
+(defun $1 ()
+  "DOCSTRING"
+  (interactive)
+  (let (var1)
+    (setq var1 some)
+    $0
+  ))
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/defvar.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/defvar.yasnippet
new file mode 100644 (file)
index 0000000..1148472
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: defvar
+# key: defvar
+# --
+(defvar $0 &optional INITVALUE "DOCSTRING")
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/delete-char.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/delete-char.yasnippet
new file mode 100644 (file)
index 0000000..02585fa
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: delete-char
+# key: delete-char
+# key: dc
+# --
+(delete-char $0)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/delete-directory.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/delete-directory.yasnippet
new file mode 100644 (file)
index 0000000..5033240
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: delete-directory
+# key: delete-directory
+# key: dd
+# --
+(delete-directory $0 &optional RECURSIVE)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/delete-file.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/delete-file.yasnippet
new file mode 100644 (file)
index 0000000..6b47f0d
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: delete-file
+# key: delete-file
+# key: df
+# --
+(delete-file $0)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/delete-region.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/delete-region.yasnippet
new file mode 100644 (file)
index 0000000..054b40d
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: delete-region
+# key: delete-region
+# key: dr
+# --
+(delete-region $0 )
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/directory-files.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/directory-files.yasnippet
new file mode 100644 (file)
index 0000000..449e016
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: directory-files
+# key: directory-files
+# key: df
+# --
+(directory-files $0 &optional FULL MATCH NOSORT)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/dolist.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/dolist.yasnippet
new file mode 100644 (file)
index 0000000..13be2fb
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: dolist
+# key: dolist
+# --
+(dolist $0 )
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/end-of-line.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/end-of-line.yasnippet
new file mode 100644 (file)
index 0000000..dcefc48
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: end-of-line
+# key: end-of-line
+# key: eol
+# --
+(end-of-line)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/eq.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/eq.yasnippet
new file mode 100644 (file)
index 0000000..b05f968
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: eq
+# key: eq
+# --
+(eq $0)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/equal.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/equal.yasnippet
new file mode 100644 (file)
index 0000000..f2dec47
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: equal
+# key: equal
+# --
+(equal $0)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/error.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/error.yasnippet
new file mode 100644 (file)
index 0000000..93314dd
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: error
+# key: error
+# --
+(error "$0" &optional ARGS)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/expand-file-name.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/expand-file-name.yasnippet
new file mode 100644 (file)
index 0000000..c8b5253
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: expand-file-name
+# key: expand-file-name
+# key: efn
+# --
+(expand-file-name $0 )
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/f.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/f.yasnippet
new file mode 100644 (file)
index 0000000..220a1af
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: format
+# key: format
+# --
+(format "$0" &optional OBJECTS)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/fboundp.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/fboundp.yasnippet
new file mode 100644 (file)
index 0000000..f6e8907
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: fboundp
+# key: fboundp
+# --
+(fboundp '$0 )
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/file-name-directory.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/file-name-directory.yasnippet
new file mode 100644 (file)
index 0000000..1264a25
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: file-name-directory
+# key: file-name-directory
+# key: fnd
+# --
+(file-name-directory $0)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/file-name-extension.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/file-name-extension.yasnippet
new file mode 100644 (file)
index 0000000..87886d4
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: file-name-extension
+# key: file-name-extension
+# key: fne
+# --
+(file-name-extension $0 &optional PERIOD)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/file-name-nondirectory.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/file-name-nondirectory.yasnippet
new file mode 100644 (file)
index 0000000..0a824a5
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: file-name-nondirectory
+# key: file-name-nondirectory
+# key: fnn
+# --
+(file-name-nondirectory $0 )
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/file-name-sans-extension.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/file-name-sans-extension.yasnippet
new file mode 100644 (file)
index 0000000..491c7e4
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: file-name-sans-extension
+# key: file-name-sans-extension
+# key: fnse
+# --
+(file-name-sans-extension $0)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/file-relative-name.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/file-relative-name.yasnippet
new file mode 100644 (file)
index 0000000..8f773aa
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: file-relative-name
+# key: file-relative-name
+# key: frn
+# --
+(file-relative-name $0 )
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/find-file.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/find-file.yasnippet
new file mode 100644 (file)
index 0000000..7a64537
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: find-file
+# key: find-file
+# key: ff
+# --
+(find-file $0 )
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/format.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/format.yasnippet
new file mode 100644 (file)
index 0000000..220a1af
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: format
+# key: format
+# --
+(format "$0" &optional OBJECTS)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/forward-char.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/forward-char.yasnippet
new file mode 100644 (file)
index 0000000..198cca2
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: forward-char
+# key: forward-char
+# key: fc
+# --
+(forward-char $0)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/forward-line.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/forward-line.yasnippet
new file mode 100644 (file)
index 0000000..10456d3
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: forward-line
+# key: forward-line
+# key: fl
+# --
+(forward-line $0 )
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/funcall.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/funcall.yasnippet
new file mode 100644 (file)
index 0000000..4f67029
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: funcall
+# key: funcall
+# --
+(funcall $0)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/function.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/function.yasnippet
new file mode 100644 (file)
index 0000000..3ff84fc
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: function
+# key: function
+# --
+(function $0 )
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/get.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/get.yasnippet
new file mode 100644 (file)
index 0000000..df20cce
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: get
+# key: get
+# --
+(get SYMBOL$0 PROPNAME)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/global-set-key.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/global-set-key.yasnippet
new file mode 100644 (file)
index 0000000..8895053
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: global-set-key
+# key: global-set-key
+# key: gsk
+# --
+(global-set-key (kbd "C-$0") 'COMMAND)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/goto-char.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/goto-char.yasnippet
new file mode 100644 (file)
index 0000000..1caa88e
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: goto-char
+# key: goto-char
+# key: gc
+# --
+(goto-char $0)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/if.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/if.yasnippet
new file mode 100644 (file)
index 0000000..db90fe3
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: if
+# key: if
+# --
+(if $0)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/insert-file-contents.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/insert-file-contents.yasnippet
new file mode 100644 (file)
index 0000000..6189cfa
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: insert-file-contents
+# key: insert-file-contents
+# key: ifc
+# --
+(insert-file-contents $0 &optional VISIT BEG END REPLACE)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/insert.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/insert.yasnippet
new file mode 100644 (file)
index 0000000..b3de98c
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: insert
+# key: insert
+# key: i
+# --
+(insert $0)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/interactive.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/interactive.yasnippet
new file mode 100644 (file)
index 0000000..f63e489
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: interactive
+# key: interactive
+# --
+(interactive)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/kbd.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/kbd.yasnippet
new file mode 100644 (file)
index 0000000..811ef6b
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: kbd
+# key: kbd
+# --
+(kbd "$0")
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/kill-buffer.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/kill-buffer.yasnippet
new file mode 100644 (file)
index 0000000..615f74d
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: kill-buffer
+# key: kill-buffer
+# key: kb
+# --
+(kill-buffer $0)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/lambda.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/lambda.yasnippet
new file mode 100644 (file)
index 0000000..63ac70a
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: lambda
+# key: lambda
+# --
+(lambda ($0) "DOCSTRING" (interactive) BODY)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/length.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/length.yasnippet
new file mode 100644 (file)
index 0000000..ecd1b6d
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: length
+# key: length
+# --
+(length $0)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/let.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/let.yasnippet
new file mode 100644 (file)
index 0000000..e198254
--- /dev/null
@@ -0,0 +1,8 @@
+# contributor: Xah Lee (XahLee.org)
+# name: let
+# key: let
+# key: l
+# --
+(let ($1 )
+ $0
+)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/line-beginning-position.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/line-beginning-position.yasnippet
new file mode 100644 (file)
index 0000000..5edd9e3
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: line-beginning-position
+# key: line-beginning-position
+# key: lbp
+# --
+(line-beginning-position)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/line-end-position.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/line-end-position.yasnippet
new file mode 100644 (file)
index 0000000..a8fa3d0
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: line-end-position
+# key: line-end-position
+# key: lep
+# --
+(line-end-position)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/list.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/list.yasnippet
new file mode 100644 (file)
index 0000000..b8532a9
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: list
+# key: list
+# --
+(list $0)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/looking-at.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/looking-at.yasnippet
new file mode 100644 (file)
index 0000000..da85f01
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: looking-at
+# key: looking-at
+# key: la
+# --
+(looking-at $0)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/make-directory.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/make-directory.yasnippet
new file mode 100644 (file)
index 0000000..4f83d94
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: make-directory
+# key: make-directory
+# key: md
+# --
+(make-directory $0 &optional PARENTS)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/make-local-variable.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/make-local-variable.yasnippet
new file mode 100644 (file)
index 0000000..223fa55
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: make-local-variable
+# key: make-local-variable
+# key: mlv
+# --
+(make-local-variable $0)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/mapc.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/mapc.yasnippet
new file mode 100644 (file)
index 0000000..e8b0c52
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: mapc
+# key: mapc
+# --
+(mapc '$0 SEQUENCE)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/mapcar.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/mapcar.yasnippet
new file mode 100644 (file)
index 0000000..1f398ec
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: mapcar
+# key: mapcar
+# --
+(mapcar $0 )
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/match-beginning.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/match-beginning.yasnippet
new file mode 100644 (file)
index 0000000..8407602
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: match-beginning
+# key: match-beginning
+# key: mb
+# --
+(match-beginning N$0)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/match-end.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/match-end.yasnippet
new file mode 100644 (file)
index 0000000..60923a4
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: match-end
+# key: match-end
+# key: me
+# --
+(match-end N$0)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/match-string.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/match-string.yasnippet
new file mode 100644 (file)
index 0000000..83eb5fe
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: match-string
+# key: match-string
+# key: ms
+# --
+(match-string $0 )
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/memq.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/memq.yasnippet
new file mode 100644 (file)
index 0000000..513fd25
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: memq
+# key: memq
+# --
+(memq ELT$0 LIST)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/message.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/message.yasnippet
new file mode 100644 (file)
index 0000000..38bbab6
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: message
+# key: message
+# key: m
+# --
+(message "FORMATSTRING$0" &optional ARGS)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/not.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/not.yasnippet
new file mode 100644 (file)
index 0000000..80d3694
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: not
+# key: not
+# key: n
+# --
+(not $0 )
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/nth.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/nth.yasnippet
new file mode 100644 (file)
index 0000000..de81812
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: nth
+# key: nth
+# --
+(nth N$0 LIST)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/null.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/null.yasnippet
new file mode 100644 (file)
index 0000000..6b4010b
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: null
+# key: null
+# --
+(null $0)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/number-to-string.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/number-to-string.yasnippet
new file mode 100644 (file)
index 0000000..c57a930
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: number-to-string
+# key: number-to-string
+# key: nts
+# --
+(number-to-string $0)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/or.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/or.yasnippet
new file mode 100644 (file)
index 0000000..86eea32
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: or
+# key: or
+# key: o
+# --
+(or $0 )
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/point-max.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/point-max.yasnippet
new file mode 100644 (file)
index 0000000..5df439d
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: point-max
+# key: point-max
+# --
+(point-max)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/point-min.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/point-min.yasnippet
new file mode 100644 (file)
index 0000000..b5e58f7
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: point-min
+# key: point-min
+# key: pm
+# --
+(point-min)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/point.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/point.yasnippet
new file mode 100644 (file)
index 0000000..95b3dab
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: point
+# key: point
+# key: p
+# --
+(point)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/princ.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/princ.yasnippet
new file mode 100644 (file)
index 0000000..5c5f7db
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: princ
+# key: princ
+# --
+(princ $0)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/print.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/print.yasnippet
new file mode 100644 (file)
index 0000000..dc156e8
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: print
+# key: print
+# --
+(print $0)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/progn.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/progn.yasnippet
new file mode 100644 (file)
index 0000000..4ae43ed
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: progn
+# key: progn
+# --
+(progn $0)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/push.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/push.yasnippet
new file mode 100644 (file)
index 0000000..080e615
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: push
+# key: push
+# --
+(push $0 )
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/put.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/put.yasnippet
new file mode 100644 (file)
index 0000000..85f8869
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: put
+# key: put
+# --
+(put $0 PROPNAME VALUE)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/re-search-backward.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/re-search-backward.yasnippet
new file mode 100644 (file)
index 0000000..c4e82cc
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: re-search-backward
+# key: re-search-backward
+# key: rsb
+# --
+(re-search-backward REGEXP$0 &optional BOUND NOERROR COUNT)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/re-search-forward.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/re-search-forward.yasnippet
new file mode 100644 (file)
index 0000000..6e86e33
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: re-search-forward
+# key: re-search-forward
+# key: rsf
+# --
+(re-search-forward REGEXP$0 &optional BOUND NOERROR COUNT)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/region-active-p.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/region-active-p.yasnippet
new file mode 100644 (file)
index 0000000..c689118
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: region-active-p
+# key: region-active-p
+# key: rap
+# --
+(region-active-p)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/region-beginning.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/region-beginning.yasnippet
new file mode 100644 (file)
index 0000000..b696fdc
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: region-beginning
+# key: region-beginning
+# key: rb
+# --
+(region-beginning)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/region-end.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/region-end.yasnippet
new file mode 100644 (file)
index 0000000..9fe0ea8
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: region-end
+# key: region-end
+# key: re
+# --
+(region-end)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/rename-file.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/rename-file.yasnippet
new file mode 100644 (file)
index 0000000..6c47c7e
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: rename-file
+# key: rename-file
+# key: rf
+# --
+(rename-file FILE$0 NEWNAME &optional OK-IF-ALREADY-EXISTS)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/repeat.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/repeat.yasnippet
new file mode 100644 (file)
index 0000000..a46e63b
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: repeat
+# key: repeat
+# --
+(repeat $0 )
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/replace-regexp-in-string.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/replace-regexp-in-string.yasnippet
new file mode 100644 (file)
index 0000000..694717b
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: replace-regexp-in-string
+# key: replace-regexp-in-string
+# key: rris
+# --
+(replace-regexp-in-string REGEXP$0 REP STRING &optional FIXEDCASE LITERAL SUBEXP START)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/replace-regexp.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/replace-regexp.yasnippet
new file mode 100644 (file)
index 0000000..96823d6
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: replace-regexp
+# key: replace-regexp
+# key: rr
+# --
+(replace-regexp REGEXP$0 TO-STRING &optional DELIMITED START END)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/require.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/require.yasnippet
new file mode 100644 (file)
index 0000000..d26ffd6
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: require
+# key: require
+# --
+(require $0 )
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/save-buffer.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/save-buffer.yasnippet
new file mode 100644 (file)
index 0000000..009e4af
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: save-buffer
+# key: save-buffer
+# key: sb
+# --
+(save-buffer $0)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/save-excursion.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/save-excursion.yasnippet
new file mode 100644 (file)
index 0000000..799d2f0
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: save-excursion
+# key: save-excursion
+# key: se
+# --
+(save-excursion $0)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/search-backward-regexp.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/search-backward-regexp.yasnippet
new file mode 100644 (file)
index 0000000..299f2df
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: search-backward-regexp
+# key: search-backward-regexp
+# key: sbr
+# --
+(search-backward-regexp "$0" &optional BOUND NOERROR COUNT)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/search-backward.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/search-backward.yasnippet
new file mode 100644 (file)
index 0000000..27ab571
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: search-backward
+# key: search-backward
+# key: sb
+# --
+(search-backward "$0" &optional BOUND NOERROR COUNT)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/search-forward-regexp.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/search-forward-regexp.yasnippet
new file mode 100644 (file)
index 0000000..d7860d6
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: search-forward-regexp
+# key: search-forward-regexp
+# key: sfr
+# --
+(search-forward-regexp "$0" &optional BOUND NOERROR COUNT)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/search-forward.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/search-forward.yasnippet
new file mode 100644 (file)
index 0000000..09f1216
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: search-forward
+# key: search-forward
+# key: sf
+# --
+(search-forward "$0" &optional BOUND NOERROR COUNT)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/set-buffer.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/set-buffer.yasnippet
new file mode 100644 (file)
index 0000000..402ab84
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: set-buffer
+# key: set-buffer
+# key: sb
+# --
+(set-buffer $0 )
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/set-file-modes.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/set-file-modes.yasnippet
new file mode 100644 (file)
index 0000000..b64d593
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: set-file-modes
+# key: set-file-modes
+# key: sfm
+# --
+(set-file-modes $0 MODE)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/set-mark.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/set-mark.yasnippet
new file mode 100644 (file)
index 0000000..fe7a206
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: set-mark
+# key: set-mark
+# key: sm
+# --
+(set-mark $0)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/set.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/set.yasnippet
new file mode 100644 (file)
index 0000000..f7e83a4
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: set
+# key: set
+# --
+(set $0 )
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/setq.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/setq.yasnippet
new file mode 100644 (file)
index 0000000..3a263c6
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: setq
+# key: setq
+# key: s
+# --
+(setq $0 )
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/skip-chars-backward.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/skip-chars-backward.yasnippet
new file mode 100644 (file)
index 0000000..17c33d4
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: skip-chars-backward
+# key: skip-chars-backward
+# key: scb
+# --
+(skip-chars-backward "$0" &optional LIM)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/skip-chars-forward.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/skip-chars-forward.yasnippet
new file mode 100644 (file)
index 0000000..7b93987
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: skip-chars-forward
+# key: skip-chars-forward
+# key: scf
+# --
+(skip-chars-forward "$0" &optional LIM)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/split-string.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/split-string.yasnippet
new file mode 100644 (file)
index 0000000..9e03740
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: split-string
+# key: split-string
+# key: ss
+# --
+(split-string $0 &optional SEPARATORS OMIT-NULLS)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/string-match.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/string-match.yasnippet
new file mode 100644 (file)
index 0000000..f39c69e
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: string-match
+# key: string-match
+# key: sm
+# --
+(string-match "REGEXP$0" "STRING" &optional START)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/string-to-number.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/string-to-number.yasnippet
new file mode 100644 (file)
index 0000000..f47c9d4
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: string-to-number
+# key: string-to-number
+# key: stn
+# --
+(string-to-number "$0")
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/string.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/string.yasnippet
new file mode 100644 (file)
index 0000000..07c17f1
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: string
+# key: string
+# --
+(string $0 )
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/string=.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/string=.yasnippet
new file mode 100644 (file)
index 0000000..3a458e8
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: string=
+# key: string=
+# --
+(string= $0 )
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/stringp.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/stringp.yasnippet
new file mode 100644 (file)
index 0000000..432f6e0
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: stringp
+# key: stringp
+# --
+(stringp $0)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/substring.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/substring.yasnippet
new file mode 100644 (file)
index 0000000..eeb0c02
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: substring
+# key: substring
+# --
+(substring STRING$0 FROM &optional TO)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/thing-at-point.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/thing-at-point.yasnippet
new file mode 100644 (file)
index 0000000..6b78e03
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: thing-at-point
+# key: thing-at-point
+# key: tap
+# --
+(thing-at-point '$0) ; symbol, list, sexp, defun, filename, url, email, word, sentence, whitespace, line, page ...
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/unless.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/unless.yasnippet
new file mode 100644 (file)
index 0000000..bdde0cf
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: unless
+# key: unless
+# --
+(unless $0)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/vector.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/vector.yasnippet
new file mode 100644 (file)
index 0000000..5aea79a
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: vector
+# key: vector
+# key: v
+# --
+(vector $0)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/when.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/when.yasnippet
new file mode 100644 (file)
index 0000000..86d31d9
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: when
+# key: when
+# --
+(when $0)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/while.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/while.yasnippet
new file mode 100644 (file)
index 0000000..1802e1b
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: while
+# key: while
+# --
+(while $0)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/widget-get.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/widget-get.yasnippet
new file mode 100644 (file)
index 0000000..f183569
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: widget-get
+# key: widget-get
+# key: wg
+# --
+(widget-get $0 )
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/with-current-buffer.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/with-current-buffer.yasnippet
new file mode 100644 (file)
index 0000000..1e6a94e
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: with-current-buffer
+# key: with-current-buffer
+# key: wcb
+# --
+(with-current-buffer $0 )
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/x-dired.process_marked.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/x-dired.process_marked.yasnippet
new file mode 100644 (file)
index 0000000..710657c
--- /dev/null
@@ -0,0 +1,17 @@
+# contributor: Xah Lee (XahLee.org)
+# name: process marked files in dired
+# key: x-dired
+# --
+;; idiom for processing a list of files in dired's marked files
+;; suppose myProcessFile is your function that takes a file path
+;; and do some processing on the file
+
+(defun dired-myProcessFile ()
+  "apply myProcessFile function to marked files in dired."
+  (interactive)
+  (require 'dired)
+  (mapc 'myProcessFile (dired-get-marked-files))
+)
+
+;; to use it, type M-x dired-myProcessFile
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/x-file.process.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/x-file.process.yasnippet
new file mode 100644 (file)
index 0000000..dc60b17
--- /dev/null
@@ -0,0 +1,18 @@
+# contributor: Xah Lee (XahLee.org)
+# name: a function that process a file
+# key: x-file
+# --
+(defun doThisFile (fpath)
+  "Process the file at path FPATH ..."
+  (let ()
+    ;; create temp buffer without undo record or font lock. (more efficient)
+    ;; first space in temp buff name is necessary
+    (set-buffer (get-buffer-create " myTemp"))
+    (insert-file-contents fpath nil nil nil t)
+
+    ;; process it ...
+    ;; (goto-char 0) ; move to begining of file's content (in case it was open)
+    ;; ... do something here
+    ;; (write-file fpath) ;; write back to the file
+
+    (kill-buffer " myTemp")))
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/x-file.read-lines.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/x-file.read-lines.yasnippet
new file mode 100644 (file)
index 0000000..f85fe4e
--- /dev/null
@@ -0,0 +1,18 @@
+# contributor: Xah Lee (XahLee.org)
+# name: read lines of a file
+# key: x-file
+# --
+(defun read-lines (filePath)
+  "Return a list of lines in FILEPATH."
+  (with-temp-buffer
+    (insert-file-contents filePath)
+    (split-string
+     (buffer-string) "\n" t)) )
+
+;; process all lines
+(mapc 
+ (lambda (aLine) 
+   (message aLine) ; do your stuff here
+   )
+ (read-lines "inputFilePath")
+)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/x-find-replace.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/x-find-replace.yasnippet
new file mode 100644 (file)
index 0000000..e5a1d6c
--- /dev/null
@@ -0,0 +1,18 @@
+# contributor: Xah Lee (XahLee.org)
+# name: find and replace on region
+# key: x-find-replace
+# --
+(defun replace-html-chars-region (start end)
+  "Replace “<” to “&lt;” and other chars in HTML.
+This works on the current region."
+  (interactive "r")
+  (save-restriction 
+    (narrow-to-region start end)
+    (goto-char (point-min))
+    (while (search-forward "&" nil t) (replace-match "&amp;" nil t))
+    (goto-char (point-min))
+    (while (search-forward "<" nil t) (replace-match "&lt;" nil t))
+    (goto-char (point-min))
+    (while (search-forward ">" nil t) (replace-match "&gt;" nil t))
+    )
+  )
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/x-grabstring.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/x-grabstring.yasnippet
new file mode 100644 (file)
index 0000000..d194f2a
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: grab buffer substring
+# key: x-grabstring
+# --
+(setq $0 (buffer-substring-no-properties myStartPos myEndPos))
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/x-grabthing.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/x-grabthing.yasnippet
new file mode 100644 (file)
index 0000000..d65c1fd
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: grab word under cursor
+# key: x-grabthing
+# --
+(setq $0 (thing-at-point 'symbol))
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/x-traverse_dir.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/x-traverse_dir.yasnippet
new file mode 100644 (file)
index 0000000..df0261d
--- /dev/null
@@ -0,0 +1,7 @@
+# name: traversing a directory
+# contributor: Xah Lee (XahLee.org)
+# key: x-traverse_dir
+# --
+;; apply a function to all files in a dir
+(require 'find-lisp)
+(mapc 'my-process-file (find-lisp-find-files "~/myweb/" "\\.html$"))
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/x-word-or-region.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/x-word-or-region.yasnippet
new file mode 100644 (file)
index 0000000..b72f8b8
--- /dev/null
@@ -0,0 +1,28 @@
+# contributor: Xah Lee (XahLee.org)
+# name: Command that works on region or word
+# key: x-word-or-region
+# --
+;; example of a command that works on current word or text selection
+(defun down-case-word-or-region ()
+  "Lower case the current word or text selection."
+(interactive)
+(let (pos1 pos2 meat)
+  (if (and transient-mark-mode mark-active)
+      (setq pos1 (region-beginning)
+            pos2 (region-end))
+    (setq pos1 (car (bounds-of-thing-at-point 'symbol))
+          pos2 (cdr (bounds-of-thing-at-point 'symbol))))
+
+  ; now, pos1 and pos2 are the starting and ending positions
+  ; of the current word, or current text selection if exists
+
+  ;; put your code here.
+  $0
+  ;; Some example of things you might want to do
+  (downcase-region pos1 pos2) ; example of a func that takes region as args
+  (setq meat (buffer-substring-no-properties pos1 pos2)) ; grab the text.
+  (delete-region pos1 pos2) ; get rid of it
+  (insert "newText") ; insert your new text
+
+  )
+)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/y-or-n-p.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/y-or-n-p.yasnippet
new file mode 100644 (file)
index 0000000..7ebc503
--- /dev/null
@@ -0,0 +1,6 @@
+# contributor: Xah Lee (XahLee.org)
+# name: y-or-n-p
+# key: y-or-n-p
+# key: yonp
+# --
+(yes-or-no-p "PROMPT$0 ")
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/emacs-lisp-mode/yes-or-no-p.yasnippet b/packages/yasnippet/snippets/emacs-lisp-mode/yes-or-no-p.yasnippet
new file mode 100644 (file)
index 0000000..fe85e77
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee (XahLee.org)
+# name: yes-or-no-p
+# key: yes-or-no-p
+# --
+(yes-or-no-p "PROMPT$0 ")
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/erlang-mode/.yas-parents b/packages/yasnippet/snippets/erlang-mode/.yas-parents
new file mode 100644 (file)
index 0000000..eed5b44
--- /dev/null
@@ -0,0 +1 @@
+text-mode
diff --git a/packages/yasnippet/snippets/erlang-mode/after b/packages/yasnippet/snippets/erlang-mode/after
new file mode 100644 (file)
index 0000000..4b2eab2
--- /dev/null
@@ -0,0 +1,5 @@
+# name: after ... ->
+# key: after
+# --
+after
+    $1 -> $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/erlang-mode/begin b/packages/yasnippet/snippets/erlang-mode/begin
new file mode 100644 (file)
index 0000000..ad9a68b
--- /dev/null
@@ -0,0 +1,6 @@
+# name: begin ... end
+# key: begin
+# --
+begin
+    $0
+end
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/erlang-mode/beh b/packages/yasnippet/snippets/erlang-mode/beh
new file mode 100644 (file)
index 0000000..b7696ff
--- /dev/null
@@ -0,0 +1,5 @@
+# name: -behaviour(...).
+# key: beh
+# --
+-behaviour(${1:gen_server}).
+$0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/erlang-mode/case b/packages/yasnippet/snippets/erlang-mode/case
new file mode 100644 (file)
index 0000000..f5326fa
--- /dev/null
@@ -0,0 +1,6 @@
+# name: case ... of ... end
+# key: case
+# --
+case $1 of
+    $0
+end
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/erlang-mode/compile b/packages/yasnippet/snippets/erlang-mode/compile
new file mode 100644 (file)
index 0000000..4622aa2
--- /dev/null
@@ -0,0 +1,5 @@
+# name: -compile(...).
+# key: compile
+# --
+-compile([${1:export_all}]).
+$0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/erlang-mode/def b/packages/yasnippet/snippets/erlang-mode/def
new file mode 100644 (file)
index 0000000..bea99c3
--- /dev/null
@@ -0,0 +1,5 @@
+# name: -define(...,...).
+# key: def
+# --
+-define($1,$2).
+$0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/erlang-mode/exp b/packages/yasnippet/snippets/erlang-mode/exp
new file mode 100644 (file)
index 0000000..dcef789
--- /dev/null
@@ -0,0 +1,6 @@
+# name: -export([]).
+# contributor: hitesh <hitesh.jasani@gmail.com>
+# key: exp
+# --
+-export([${1:start/0}]).
+$0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/erlang-mode/fun b/packages/yasnippet/snippets/erlang-mode/fun
new file mode 100644 (file)
index 0000000..1665ef6
--- /dev/null
@@ -0,0 +1,4 @@
+# name: fun (...) -> ... end
+# key: fun
+# --
+fun ($1) -> $0 end
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/erlang-mode/if b/packages/yasnippet/snippets/erlang-mode/if
new file mode 100644 (file)
index 0000000..dae3cc7
--- /dev/null
@@ -0,0 +1,7 @@
+# name: if ... -> ... ; true -> ... end
+# key: if
+# --
+if
+    $1 -> $2;
+    true -> $0
+end
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/erlang-mode/ifdef b/packages/yasnippet/snippets/erlang-mode/ifdef
new file mode 100644 (file)
index 0000000..feacf74
--- /dev/null
@@ -0,0 +1,6 @@
+# name: -ifdef(...). ... -endif.
+# key: ifdef
+# --
+-ifdef($1).
+$0
+-endif.
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/erlang-mode/ifndef b/packages/yasnippet/snippets/erlang-mode/ifndef
new file mode 100644 (file)
index 0000000..7c5d931
--- /dev/null
@@ -0,0 +1,6 @@
+# name: -ifndef(...). ... -endif.
+# key: ifndef
+# --
+-ifndef($1).
+$0
+-endif.
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/erlang-mode/imp b/packages/yasnippet/snippets/erlang-mode/imp
new file mode 100644 (file)
index 0000000..5db8aaf
--- /dev/null
@@ -0,0 +1,6 @@
+# name: -import([]).
+# contributor: hitesh <hitesh.jasani@gmail.com>
+# key: imp
+# --
+-import(${1:lists}, [${2:map/2, sum/1}]).
+$0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/erlang-mode/inc b/packages/yasnippet/snippets/erlang-mode/inc
new file mode 100644 (file)
index 0000000..47f4008
--- /dev/null
@@ -0,0 +1,5 @@
+# name: -include("...").
+# key: inc
+# --
+-include("$1").
+$0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/erlang-mode/inc.lib b/packages/yasnippet/snippets/erlang-mode/inc.lib
new file mode 100644 (file)
index 0000000..5ca0631
--- /dev/null
@@ -0,0 +1,5 @@
+# name: -include_lib("...").
+# key: inc
+# --
+-include_lib("$1").
+$0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/erlang-mode/loop b/packages/yasnippet/snippets/erlang-mode/loop
new file mode 100644 (file)
index 0000000..86f92a4
--- /dev/null
@@ -0,0 +1,9 @@
+# name: loop(...) -> receive _ -> loop(...) end.
+# key: loop
+# --
+${1:loop}($2) ->
+    receive
+       ${3:_} ->
+           $1($2)
+    end.
+$0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/erlang-mode/mod b/packages/yasnippet/snippets/erlang-mode/mod
new file mode 100644 (file)
index 0000000..8cb747a
--- /dev/null
@@ -0,0 +1,7 @@
+# name: -module().
+# contributor: hitesh <hitesh.jasani@gmail.com>
+# key: mod
+# --
+-module(${1:`(file-name-nondirectory
+              (file-name-sans-extension (or (buffer-file-name) (buffer-name))))`}).
+$0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/erlang-mode/rcv b/packages/yasnippet/snippets/erlang-mode/rcv
new file mode 100644 (file)
index 0000000..f5bdaa2
--- /dev/null
@@ -0,0 +1,6 @@
+# name: receive ... -> ... end
+# key: rcv
+# --
+receive
+    $1 -> $0
+end
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/erlang-mode/rcv.after b/packages/yasnippet/snippets/erlang-mode/rcv.after
new file mode 100644 (file)
index 0000000..687b78d
--- /dev/null
@@ -0,0 +1,7 @@
+# name: receive after ... -> ... end
+# key: rcv
+# --
+receive
+after
+    $1 -> $0
+end
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/erlang-mode/rec b/packages/yasnippet/snippets/erlang-mode/rec
new file mode 100644 (file)
index 0000000..b3819a6
--- /dev/null
@@ -0,0 +1,5 @@
+# name: -record(...,{...}).
+# key: rec
+# --
+-record($1,{$2}).
+$0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/erlang-mode/try b/packages/yasnippet/snippets/erlang-mode/try
new file mode 100644 (file)
index 0000000..0ff10a8
--- /dev/null
@@ -0,0 +1,8 @@
+# name: try ... of ... catch after end
+# key: try
+# --
+try $1 of
+    $0
+catch
+after
+end
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/erlang-mode/undef b/packages/yasnippet/snippets/erlang-mode/undef
new file mode 100644 (file)
index 0000000..bd51fe6
--- /dev/null
@@ -0,0 +1,5 @@
+# name: -undef(...).
+# key: undef
+# --
+-undef($1).
+$0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/f90-mode/.yas-parents b/packages/yasnippet/snippets/f90-mode/.yas-parents
new file mode 100644 (file)
index 0000000..eed5b44
--- /dev/null
@@ -0,0 +1 @@
+text-mode
diff --git a/packages/yasnippet/snippets/f90-mode/au b/packages/yasnippet/snippets/f90-mode/au
new file mode 100644 (file)
index 0000000..e402b21
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Li Zhu <http://www.zhuli.name>
+# name: automatic
+# key: au
+# --
+automatic $0 
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/f90-mode/bd b/packages/yasnippet/snippets/f90-mode/bd
new file mode 100644 (file)
index 0000000..081b039
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Li Zhu <http://www.zhuli.name>
+# name: block data
+# key: bd
+# --
+block data $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/f90-mode/c b/packages/yasnippet/snippets/f90-mode/c
new file mode 100644 (file)
index 0000000..cf28d36
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Li Zhu <http://www.zhuli.name>
+# name: continue
+# key: c
+# --
+continue $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/f90-mode/ch b/packages/yasnippet/snippets/f90-mode/ch
new file mode 100644 (file)
index 0000000..db43003
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Li Zhu <http://www.zhuli.name>
+# name: character
+# key: ch
+# --
+character $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/f90-mode/cx b/packages/yasnippet/snippets/f90-mode/cx
new file mode 100644 (file)
index 0000000..70e9163
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Li Zhu <http://www.zhuli.name>
+# name: complex
+# key: cx
+# --
+complex $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/f90-mode/dc b/packages/yasnippet/snippets/f90-mode/dc
new file mode 100644 (file)
index 0000000..df5f026
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Li Zhu <http://www.zhuli.name>
+# name: double complex
+# key: dc
+# --
+double complex $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/f90-mode/do b/packages/yasnippet/snippets/f90-mode/do
new file mode 100644 (file)
index 0000000..c3aa1f2
--- /dev/null
@@ -0,0 +1,7 @@
+# contributor: Li Zhu <http://www.zhuli.name>
+# name: do while (...) end do
+# key: do
+# --
+do while (${1:condition})
+   $0
+end do
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/f90-mode/dp b/packages/yasnippet/snippets/f90-mode/dp
new file mode 100644 (file)
index 0000000..e705b7c
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Li Zhu <http://www.zhuli.name>
+# name: double precision
+# key: dp
+# --
+double precision $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/f90-mode/eq b/packages/yasnippet/snippets/f90-mode/eq
new file mode 100644 (file)
index 0000000..1ace4ce
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Li Zhu <http://www.zhuli.name>
+# name: equivalence
+# key: eq
+# --
+equivalence $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/f90-mode/ib b/packages/yasnippet/snippets/f90-mode/ib
new file mode 100644 (file)
index 0000000..3fd8fbd
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Li Zhu <http://www.zhuli.name>
+# name: implicit byte
+# key: ib
+# --
+implicit byte $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/f90-mode/ic b/packages/yasnippet/snippets/f90-mode/ic
new file mode 100644 (file)
index 0000000..516d139
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Li Zhu <http://www.zhuli.name>
+# name: implicit complex
+# key: ic
+# --
+implicit complex $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/f90-mode/ich b/packages/yasnippet/snippets/f90-mode/ich
new file mode 100644 (file)
index 0000000..f6b1f80
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Li Zhu <http://www.zhuli.name>
+# name: implicit character
+# key: ich
+# --
+implicit character $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/f90-mode/if b/packages/yasnippet/snippets/f90-mode/if
new file mode 100644 (file)
index 0000000..f4a42e1
--- /dev/null
@@ -0,0 +1,7 @@
+# contributor: Li Zhu <http://www.zhuli.name>
+# name: if then end if
+# key: if
+# --
+if ( ${1:condition} ) then
+   $0
+end if
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/f90-mode/ii b/packages/yasnippet/snippets/f90-mode/ii
new file mode 100644 (file)
index 0000000..7317cc3
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Li Zhu <http://www.zhuli.name>
+# name: implicit integer 
+# key: ii
+# --
+implicit integer $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/f90-mode/il b/packages/yasnippet/snippets/f90-mode/il
new file mode 100644 (file)
index 0000000..0ce006e
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Li Zhu <http://www.zhuli.name>
+# name: implicit logical
+# key: il
+# --
+implicit logical $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/f90-mode/in b/packages/yasnippet/snippets/f90-mode/in
new file mode 100644 (file)
index 0000000..a9d84a1
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Li Zhu <http://www.zhuli.name>
+# name: implicit none
+# key: in
+# --
+implicit none
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/f90-mode/inc b/packages/yasnippet/snippets/f90-mode/inc
new file mode 100644 (file)
index 0000000..cc761bb
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Li Zhu <http://www.zhuli.name>
+# name: include
+# key: inc
+# --
+include $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/f90-mode/intr b/packages/yasnippet/snippets/f90-mode/intr
new file mode 100644 (file)
index 0000000..689f20a
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Li Zhu <http://www.zhuli.name>
+# name: intrinsic
+# key: intr
+# --
+intrinsic $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/f90-mode/ir b/packages/yasnippet/snippets/f90-mode/ir
new file mode 100644 (file)
index 0000000..77ddea9
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Li Zhu <http://www.zhuli.name>
+# name: implicit real
+# key: ir
+# --
+implicit real $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/f90-mode/l b/packages/yasnippet/snippets/f90-mode/l
new file mode 100644 (file)
index 0000000..c48b11e
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Li Zhu <http://www.zhuli.name>
+# name: logical
+# key: l
+# --
+logical $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/f90-mode/pa b/packages/yasnippet/snippets/f90-mode/pa
new file mode 100644 (file)
index 0000000..d92f75b
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Li Zhu <http://www.zhuli.name>
+# name: parameter
+# key: pa
+# --
+parameter $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/f90-mode/pr b/packages/yasnippet/snippets/f90-mode/pr
new file mode 100644 (file)
index 0000000..f570d5f
--- /dev/null
@@ -0,0 +1,7 @@
+# contributor: Li Zhu <http://www.zhuli.name>
+# name: program ... end program ...
+# key: pr
+# --
+program ${1:name}
+  $0
+end program ${1:name}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/f90-mode/re b/packages/yasnippet/snippets/f90-mode/re
new file mode 100644 (file)
index 0000000..a42e5a9
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Li Zhu <http://www.zhuli.name>
+# name: read (*,*)
+# key: re
+# --
+read (${1:*},${2:*}) $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/f90-mode/st b/packages/yasnippet/snippets/f90-mode/st
new file mode 100644 (file)
index 0000000..eda6f2e
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Li Zhu <http://www.zhuli.name>
+# name: structure
+# key: st
+# --
+structure $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/f90-mode/su b/packages/yasnippet/snippets/f90-mode/su
new file mode 100644 (file)
index 0000000..5b3e3cf
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Li Zhu <http://www.zhuli.name>
+# name: subroutine
+# key: su
+# --
+subroutine $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/f90-mode/wr b/packages/yasnippet/snippets/f90-mode/wr
new file mode 100644 (file)
index 0000000..0c9b4e6
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Li Zhu <http://www.zhuli.name>
+# name: write (*,*)
+# key: wr
+# --
+write (${1:*},${2:*}) $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/.yas-make-groups b/packages/yasnippet/snippets/html-mode/.yas-make-groups
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/packages/yasnippet/snippets/html-mode/.yas-parents b/packages/yasnippet/snippets/html-mode/.yas-parents
new file mode 100644 (file)
index 0000000..eed5b44
--- /dev/null
@@ -0,0 +1 @@
+text-mode
diff --git a/packages/yasnippet/snippets/html-mode/b.yasnippet b/packages/yasnippet/snippets/html-mode/b.yasnippet
new file mode 100644 (file)
index 0000000..c7873ca
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee xahlee.org
+# name: <b>...</b>
+# key: b
+# --
+<b>$0</b>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/body b/packages/yasnippet/snippets/html-mode/body
new file mode 100644 (file)
index 0000000..d6c5db3
--- /dev/null
@@ -0,0 +1,7 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+# name: <body>...</body>
+# key: body
+# --
+<body$1>
+  $0
+</body>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/br b/packages/yasnippet/snippets/html-mode/br
new file mode 100644 (file)
index 0000000..9305a50
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+# name: <br />
+# key: br
+# --
+<br />
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/code b/packages/yasnippet/snippets/html-mode/code
new file mode 100644 (file)
index 0000000..96d47e0
--- /dev/null
@@ -0,0 +1,7 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+# name: <code>...</code>
+# key: code
+# --
+<code>
+  $0
+</code>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/code.class b/packages/yasnippet/snippets/html-mode/code.class
new file mode 100644 (file)
index 0000000..2d18af7
--- /dev/null
@@ -0,0 +1,7 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+# name: <code class="...">...</code>
+# key: code
+# --
+<code class="$1">
+  $0
+</code>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/div b/packages/yasnippet/snippets/html-mode/div
new file mode 100644 (file)
index 0000000..8b97ed1
--- /dev/null
@@ -0,0 +1,4 @@
+# name: <div...>...</div>
+# key: div
+# --
+<div${1: id="${2:some_id}"}${3: class="${4:some_class}"}>$0</div> 
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/div.class b/packages/yasnippet/snippets/html-mode/div.class
new file mode 100644 (file)
index 0000000..e1a4b03
--- /dev/null
@@ -0,0 +1,7 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+# name: <div class="...">...</div>
+# key: div
+# --
+<div class="$1">
+  $0
+</div>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/div.id b/packages/yasnippet/snippets/html-mode/div.id
new file mode 100644 (file)
index 0000000..8682aa1
--- /dev/null
@@ -0,0 +1,7 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+# name: <div id="...">...</div>
+# key: div
+# --
+<div id="$1">
+  $0
+</div>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/div.id-class b/packages/yasnippet/snippets/html-mode/div.id-class
new file mode 100644 (file)
index 0000000..452cd9a
--- /dev/null
@@ -0,0 +1,7 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+# name: <div id="..." class="...">...</div>
+# key: div
+# --
+<div id="$1" class="$2">
+  $0
+</div>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/dov b/packages/yasnippet/snippets/html-mode/dov
new file mode 100644 (file)
index 0000000..d3bdc17
--- /dev/null
@@ -0,0 +1,12 @@
+# name: <dov...>...</dov>
+# key: dov
+# --
+a mirror up here $3
+
+
+<dov ${1:id="${2:some_id and here comes another nested field: ${3:nested_shit}}"}>
+    $0
+</dov>
+<dov $1>
+    actually some other shit and $3
+</dov>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/form b/packages/yasnippet/snippets/html-mode/form
new file mode 100644 (file)
index 0000000..de06267
--- /dev/null
@@ -0,0 +1,7 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+#name :<form method="..." id="..." action="..."></form>
+# key: form
+# --
+<form method="$1" id="$2" action="$3">
+  $0
+</form>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/head b/packages/yasnippet/snippets/html-mode/head
new file mode 100644 (file)
index 0000000..c5c0d0e
--- /dev/null
@@ -0,0 +1,7 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+# name: <head>...</head>
+# key: head
+# --
+<head>
+  $0
+</head>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/header/h1 b/packages/yasnippet/snippets/html-mode/header/h1
new file mode 100644 (file)
index 0000000..4d21764
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+# name: <h1>...</h1>
+# key: h1
+# --
+<h1>$1</h1>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/header/h2 b/packages/yasnippet/snippets/html-mode/header/h2
new file mode 100644 (file)
index 0000000..1cca1d5
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+# name: <h2>...</h2>
+# key: h2
+# --
+<h2>$1</h2>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/header/h3 b/packages/yasnippet/snippets/html-mode/header/h3
new file mode 100644 (file)
index 0000000..8e50a6d
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+# name: <h3>...</h3>
+# key: h3
+# --
+<h3>$1</h3>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/header/h4 b/packages/yasnippet/snippets/html-mode/header/h4
new file mode 100644 (file)
index 0000000..08c853e
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+# name: <h4>...</h4>
+# key: h4
+# --
+<h4>$1</h4>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/header/h5 b/packages/yasnippet/snippets/html-mode/header/h5
new file mode 100644 (file)
index 0000000..951122e
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+# name: <h5>...</h5>
+# key: h5
+# --
+<h5>$1</h5>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/header/h6 b/packages/yasnippet/snippets/html-mode/header/h6
new file mode 100644 (file)
index 0000000..f7da2ee
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+# name: <h6>...</h6>
+# key: h6
+# --
+<h6>$1</h6>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/hr b/packages/yasnippet/snippets/html-mode/hr
new file mode 100644 (file)
index 0000000..a6eb0ea
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+# name: <hr />
+# key: hr
+# --
+<hr />
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/href b/packages/yasnippet/snippets/html-mode/href
new file mode 100644 (file)
index 0000000..b384653
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+# name: <a href="...">...</a>
+# key: href
+# --
+<a href="$1">$2</a>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/html b/packages/yasnippet/snippets/html-mode/html
new file mode 100644 (file)
index 0000000..0484de0
--- /dev/null
@@ -0,0 +1,7 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+# name: <html>...</html>
+# key: html
+# --
+<html>
+  $0
+</html>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/html.xmlns b/packages/yasnippet/snippets/html-mode/html.xmlns
new file mode 100644 (file)
index 0000000..1b11f35
--- /dev/null
@@ -0,0 +1,7 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+# name: <html xmlns="...">...</html>
+# key: html
+# --
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="${1:en}" lang="${2:en}">
+  $0
+</html>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/i.yasnippet b/packages/yasnippet/snippets/html-mode/i.yasnippet
new file mode 100644 (file)
index 0000000..ffd051f
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Xah Lee xahlee.org
+# name: <i>...</i>
+# key: i
+# --
+<i>$0</i>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/img b/packages/yasnippet/snippets/html-mode/img
new file mode 100644 (file)
index 0000000..e726c00
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+# name: <img src="..." class="..." alt="..." />
+# key: img
+# --
+<img src="$1" class="$2" alt="$3" />
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/input b/packages/yasnippet/snippets/html-mode/input
new file mode 100644 (file)
index 0000000..2f8c79a
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+# name: <input ... />
+# key: input
+# --
+<input type="$1" name="$2" value="$3" />
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/link.stylesheet b/packages/yasnippet/snippets/html-mode/link.stylesheet
new file mode 100644 (file)
index 0000000..e10ee8b
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+# name: <link stylesheet="..." />
+# key: link
+# --
+<link rel="${1:stylesheet}" href="${2:url}" type="${3:text/css}" media="${4:screen}" />
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/link.stylesheet-ie b/packages/yasnippet/snippets/html-mode/link.stylesheet-ie
new file mode 100644 (file)
index 0000000..752f9e9
--- /dev/null
@@ -0,0 +1,7 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+# name: <!--[if IE]><link stylesheet="..." /><![endif]-->
+# key: link
+# --
+<!--[if IE]>
+<link rel="${1:stylesheet}" href="${2:url}" type="${3:text/css}" media="${4:screen}" />
+<![endif]-->
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/list/dd b/packages/yasnippet/snippets/html-mode/list/dd
new file mode 100644 (file)
index 0000000..e48a644
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Rodrigo Setti <rodrigosetti@gmail.com>
+# name: <dd> ... </dd>
+# key: dd
+# --
+<dd>$1</dd>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/list/dl b/packages/yasnippet/snippets/html-mode/list/dl
new file mode 100644 (file)
index 0000000..67792ad
--- /dev/null
@@ -0,0 +1,7 @@
+# contributor: Rodrigo Setti <rodrigosetti@gmail.com>
+# name: <dl> ... </dl>
+# key: dl
+# --
+<dl>
+    $0
+</dl>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/list/dl.id b/packages/yasnippet/snippets/html-mode/list/dl.id
new file mode 100644 (file)
index 0000000..b4b92cb
--- /dev/null
@@ -0,0 +1,7 @@
+# contributor: Rodrigo Setti <rodrigosetti@gmail.com>
+# name: <dl> ... </dl>
+# key: dl
+# --
+<dl id="$1">
+    $0
+</dl>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/list/dt b/packages/yasnippet/snippets/html-mode/list/dt
new file mode 100644 (file)
index 0000000..85d62e4
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Rodrigo Setti <rodrigosetti@gmail.com>
+# name: <dt> ... </dt>
+# key: dt
+# --
+<dt>$1</dt>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/list/li b/packages/yasnippet/snippets/html-mode/list/li
new file mode 100644 (file)
index 0000000..fe7a1f1
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+# name: <li>...</li>
+# key: li
+# --
+<li>$1</li>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/list/li.class b/packages/yasnippet/snippets/html-mode/list/li.class
new file mode 100644 (file)
index 0000000..7ff0b12
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+# name: <li class="...">...</li>
+# key: li
+# --
+<li class="$1">$2</li>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/list/ol b/packages/yasnippet/snippets/html-mode/list/ol
new file mode 100644 (file)
index 0000000..d4b74ac
--- /dev/null
@@ -0,0 +1,7 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+# name: <ol>...</ol>
+# key: ol
+# --
+<ol>
+  $0
+</ol>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/list/ol.class b/packages/yasnippet/snippets/html-mode/list/ol.class
new file mode 100644 (file)
index 0000000..1c037da
--- /dev/null
@@ -0,0 +1,7 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+# name: <ol class="...">...</ol>
+# key: ol
+# --
+<ol class="$1">
+  $0
+</ol>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/list/ol.id b/packages/yasnippet/snippets/html-mode/list/ol.id
new file mode 100644 (file)
index 0000000..d20101e
--- /dev/null
@@ -0,0 +1,7 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+# name: <ol id="...">...</ol>
+# key: ol
+# --
+<ol id="$1">
+  $0
+</ol>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/list/ul b/packages/yasnippet/snippets/html-mode/list/ul
new file mode 100644 (file)
index 0000000..4f0a9ae
--- /dev/null
@@ -0,0 +1,7 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+# name: <ul>...</ul>
+# key: ul
+# --
+<ul>
+  $0
+</ul>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/list/ul.class b/packages/yasnippet/snippets/html-mode/list/ul.class
new file mode 100644 (file)
index 0000000..e11c736
--- /dev/null
@@ -0,0 +1,7 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+# name: <ul class="...">...</ul>
+# key: ul
+# --
+<ul class="$1">
+  $0
+</ul>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/list/ul.id b/packages/yasnippet/snippets/html-mode/list/ul.id
new file mode 100644 (file)
index 0000000..014f2d0
--- /dev/null
@@ -0,0 +1,7 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+# name: <ul id="...">...</ul>
+# key: ul
+# --
+<ul id="$1">
+  $0
+</ul>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/mailto b/packages/yasnippet/snippets/html-mode/mailto
new file mode 100644 (file)
index 0000000..0f1b9aa
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+# name: <a href="mailto:...@...">...</a>
+# key: mailto
+# --
+<a href="mailto:$1@$2">$0</a>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/meta/doctype b/packages/yasnippet/snippets/html-mode/meta/doctype
new file mode 100644 (file)
index 0000000..ab34905
--- /dev/null
@@ -0,0 +1,4 @@
+# name: Doctype HTML 4.01 Strict
+# key: doctype
+# --
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/meta/doctype.xhml1 b/packages/yasnippet/snippets/html-mode/meta/doctype.xhml1
new file mode 100644 (file)
index 0000000..3671cf5
--- /dev/null
@@ -0,0 +1,4 @@
+# name: DocType XHTML 1.0 frameset
+# key: doctype
+# --
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/meta/doctype.xhtml1_1 b/packages/yasnippet/snippets/html-mode/meta/doctype.xhtml1_1
new file mode 100644 (file)
index 0000000..bb3e709
--- /dev/null
@@ -0,0 +1,4 @@
+# name: DocType XHTML 1.1
+# key: doctype
+# --
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/meta/doctype.xhtml1_strict b/packages/yasnippet/snippets/html-mode/meta/doctype.xhtml1_strict
new file mode 100644 (file)
index 0000000..4e4c567
--- /dev/null
@@ -0,0 +1,4 @@
+# name: DocType XHTML 1.0 Strict
+# key: doctype
+# --
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/meta/doctype.xhtml1_transitional b/packages/yasnippet/snippets/html-mode/meta/doctype.xhtml1_transitional
new file mode 100644 (file)
index 0000000..d1ae7f9
--- /dev/null
@@ -0,0 +1,4 @@
+# name: DocType XHTML 1.0 Transitional
+# key: doctype
+# --
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/meta/meta b/packages/yasnippet/snippets/html-mode/meta/meta
new file mode 100644 (file)
index 0000000..235eb76
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+# name: <meta name="..." content="..." />
+# key: meta
+# --
+<meta name="${1:generator}" content="${2:content}" />
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/meta/meta.http-equiv b/packages/yasnippet/snippets/html-mode/meta/meta.http-equiv
new file mode 100644 (file)
index 0000000..ef38ed8
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+# name: <meta http-equiv="..." content="..." />
+# key: meta
+# --
+<meta http-equiv="${1:Content-Type}" content="${2:text/html; charset=UTF-8}" />
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/p b/packages/yasnippet/snippets/html-mode/p
new file mode 100644 (file)
index 0000000..69fca09
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+# name: <p>...</p>
+# key: p
+# --
+<p>$1</p>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/pre b/packages/yasnippet/snippets/html-mode/pre
new file mode 100644 (file)
index 0000000..040b8f5
--- /dev/null
@@ -0,0 +1,7 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+# name: <pre>...</pre>
+# key: pre
+# --
+<pre>
+  $0
+</pre>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/q.yasnippet b/packages/yasnippet/snippets/html-mode/q.yasnippet
new file mode 100644 (file)
index 0000000..dbaab06
--- /dev/null
@@ -0,0 +1,7 @@
+# contributor: Xah Lee xahlee.org
+# name: <blockquote>...</blockquote>
+# key: q
+# --
+<blockquote>
+$0
+</blockquote>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/quote b/packages/yasnippet/snippets/html-mode/quote
new file mode 100644 (file)
index 0000000..a579067
--- /dev/null
@@ -0,0 +1,7 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+# name: <blockquote>...</blockquote>
+# key: quote
+# --
+<blockquote>
+  $1
+</blockquote>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/script.javascript b/packages/yasnippet/snippets/html-mode/script.javascript
new file mode 100644 (file)
index 0000000..9b77e43
--- /dev/null
@@ -0,0 +1,7 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+#name :<script type="text/javascript">...</script> 
+# key: script
+# --
+<script type="text/javascript">
+  $0
+</script>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/script.javascript-src b/packages/yasnippet/snippets/html-mode/script.javascript-src
new file mode 100644 (file)
index 0000000..a090e72
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+#name :<script type="text/javascript" src="..."></script> 
+# key: script
+# --
+<script type="text/javascript" src="$1"></script>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/span b/packages/yasnippet/snippets/html-mode/span
new file mode 100644 (file)
index 0000000..14c2ca7
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+# name: <span>...</span>
+# key: span
+# --
+<span>$1</span>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/span.class b/packages/yasnippet/snippets/html-mode/span.class
new file mode 100644 (file)
index 0000000..a496aaa
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+# name: <span class="...">...</span>
+# key: span
+# --
+<span class="$1">$2</span>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/span.id b/packages/yasnippet/snippets/html-mode/span.id
new file mode 100644 (file)
index 0000000..0dc1ee1
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+# name: <span id="...">...</span>
+# key: span
+# --
+<span id="$1">$2</span>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/style b/packages/yasnippet/snippets/html-mode/style
new file mode 100644 (file)
index 0000000..e159a34
--- /dev/null
@@ -0,0 +1,7 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+# name: <style type="text/css" media="...">...</style>
+# key: style
+# --
+<style type="text/css" media="${1:screen}">
+  $0
+</style>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/table/table b/packages/yasnippet/snippets/html-mode/table/table
new file mode 100644 (file)
index 0000000..b3a180f
--- /dev/null
@@ -0,0 +1,7 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+# name: <table ...>...</table>
+# key: table
+# --
+<table width="$1" cellspacing="$2" cellpadding="$3" border="$4">
+  $0
+</table>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/table/td b/packages/yasnippet/snippets/html-mode/table/td
new file mode 100644 (file)
index 0000000..a87892e
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+# name: <td>...</td>
+# key: td
+# --
+<td$1>$2</td>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/table/th b/packages/yasnippet/snippets/html-mode/table/th
new file mode 100644 (file)
index 0000000..0a07ac1
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+# name: <th>...</th>
+# key: th
+# --
+<th$1>$2</th>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/table/tr b/packages/yasnippet/snippets/html-mode/table/tr
new file mode 100644 (file)
index 0000000..15e8fc3
--- /dev/null
@@ -0,0 +1,7 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+# name: <tr>...</tr>
+# key: tr
+# --
+<tr>
+  $0
+</tr>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/textarea b/packages/yasnippet/snippets/html-mode/textarea
new file mode 100644 (file)
index 0000000..650cc51
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+# name: <textarea ...></textarea>
+# key: textarea
+# --
+<textarea name="$1" id="$2" rows="$3" cols="$4" tabindex="$5"></textarea>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/html-mode/title b/packages/yasnippet/snippets/html-mode/title
new file mode 100644 (file)
index 0000000..d9d0ddb
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Jimmy Wu <frozenthrone88@gmail.com>
+# name: <title>...</title>
+# key: title
+# --
+<title>$1</title>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/latex-mode/.yas-parents b/packages/yasnippet/snippets/latex-mode/.yas-parents
new file mode 100644 (file)
index 0000000..eed5b44
--- /dev/null
@@ -0,0 +1 @@
+text-mode
diff --git a/packages/yasnippet/snippets/latex-mode/begin b/packages/yasnippet/snippets/latex-mode/begin
new file mode 100644 (file)
index 0000000..cb08546
--- /dev/null
@@ -0,0 +1,8 @@
+# contributor: Rodrigo Setti <rodrigosetti@gmail.com>
+# name: \begin{environment} ... \end{environment}
+# key: begin
+# --
+
+\begin{${1:environment}}
+$0
+\end{$1}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/markdown-mode/+ b/packages/yasnippet/snippets/markdown-mode/+
new file mode 100644 (file)
index 0000000..129ce8e
--- /dev/null
@@ -0,0 +1,6 @@
+# name: Unordered List
+# contributor: Peng Deng <dengpeng@gmail.com>
+# key: +
+# --
++ ${1:Text}
++$0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/markdown-mode/- b/packages/yasnippet/snippets/markdown-mode/-
new file mode 100644 (file)
index 0000000..d652207
--- /dev/null
@@ -0,0 +1,6 @@
+# name: Unordered List
+# contributor: Peng Deng <dengpeng@gmail.com>
+# key: -
+# --
+- ${1:Text}
+-$0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/markdown-mode/.yas-parents b/packages/yasnippet/snippets/markdown-mode/.yas-parents
new file mode 100644 (file)
index 0000000..eed5b44
--- /dev/null
@@ -0,0 +1 @@
+text-mode
diff --git a/packages/yasnippet/snippets/markdown-mode/_ b/packages/yasnippet/snippets/markdown-mode/_
new file mode 100644 (file)
index 0000000..7dc839a
--- /dev/null
@@ -0,0 +1,5 @@
+# name: Emphasis
+# contributor: Peng Deng <dengpeng@gmail.com>
+# key: _
+# --
+_${1:Text}_ $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/markdown-mode/__ b/packages/yasnippet/snippets/markdown-mode/__
new file mode 100644 (file)
index 0000000..c8c14a6
--- /dev/null
@@ -0,0 +1,5 @@
+# name: Strong
+# contributor: Peng Deng <dengpeng@gmail.com>
+# key: __
+# --
+**${1:Text}** $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/markdown-mode/` b/packages/yasnippet/snippets/markdown-mode/`
new file mode 100644 (file)
index 0000000..d28b42c
--- /dev/null
@@ -0,0 +1,5 @@
+# name: Inline Code
+# contributor: Peng Deng <dengpeng@gmail.com>
+# key: `
+# --
+\`${1:Code}\` $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/markdown-mode/h1.1 b/packages/yasnippet/snippets/markdown-mode/h1.1
new file mode 100644 (file)
index 0000000..a5f49c4
--- /dev/null
@@ -0,0 +1,7 @@
+# name: Header 1 (#)
+# contributor: Peng Deng <dengpeng@gmail.com>
+# key: h1
+# --
+# ${1:Header 1} #
+
+$0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/markdown-mode/h1.2 b/packages/yasnippet/snippets/markdown-mode/h1.2
new file mode 100644 (file)
index 0000000..050963c
--- /dev/null
@@ -0,0 +1,8 @@
+# name: Header 1 (=)
+# contributor: Peng Deng <dengpeng@gmail.com>
+# key: h1
+# --
+${1:Header 1}
+${1:$(make-string (string-width text) ?\=)}
+
+$0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/markdown-mode/h2.1 b/packages/yasnippet/snippets/markdown-mode/h2.1
new file mode 100644 (file)
index 0000000..c8b3fc1
--- /dev/null
@@ -0,0 +1,7 @@
+# name: Header 2 (##)
+# contributor: Peng Deng <dengpeng@gmail.com>
+# key: h2
+# --
+## ${1:Header 1} ##
+
+$0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/markdown-mode/h2.2 b/packages/yasnippet/snippets/markdown-mode/h2.2
new file mode 100644 (file)
index 0000000..d173bbc
--- /dev/null
@@ -0,0 +1,8 @@
+# name: Header 2 (-)
+# contributor: Peng Deng <dengpeng@gmail.com>
+# key: h2
+# --
+${1:Header 2}
+${1:$(make-string (string-width text) ?\-)}
+
+$0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/markdown-mode/h3 b/packages/yasnippet/snippets/markdown-mode/h3
new file mode 100644 (file)
index 0000000..4daca1e
--- /dev/null
@@ -0,0 +1,7 @@
+# name: Header 3
+# contributor: Peng Deng <dengpeng@gmail.com>
+# key: h3
+# --
+### ${1:Header 3} ###
+
+$0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/markdown-mode/h4 b/packages/yasnippet/snippets/markdown-mode/h4
new file mode 100644 (file)
index 0000000..513a100
--- /dev/null
@@ -0,0 +1,7 @@
+# name: Header 4
+# contributor: Peng Deng <dengpeng@gmail.com>
+# key: h4
+# --
+#### ${1:Header 4} ####
+
+$0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/markdown-mode/h5 b/packages/yasnippet/snippets/markdown-mode/h5
new file mode 100644 (file)
index 0000000..51ebc39
--- /dev/null
@@ -0,0 +1,7 @@
+# name: Header 5
+# contributor: Peng Deng <dengpeng@gmail.com>
+# key: h5
+# --
+##### ${1:Header 5} #####
+
+$0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/markdown-mode/h6 b/packages/yasnippet/snippets/markdown-mode/h6
new file mode 100644 (file)
index 0000000..ebe9eca
--- /dev/null
@@ -0,0 +1,7 @@
+# name: Header 6
+# contributor: Peng Deng <dengpeng@gmail.com>
+# key: h6
+# --
+###### ${1:Header 6} ######
+
+$0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/markdown-mode/hr.1 b/packages/yasnippet/snippets/markdown-mode/hr.1
new file mode 100644 (file)
index 0000000..3c57bac
--- /dev/null
@@ -0,0 +1,8 @@
+# name: Horizontal Rule (-)
+# contributor: Peng Deng <dengpeng@gmail.com>
+# key: hr
+# --
+
+----------
+
+$0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/markdown-mode/hr.2 b/packages/yasnippet/snippets/markdown-mode/hr.2
new file mode 100644 (file)
index 0000000..9b9545c
--- /dev/null
@@ -0,0 +1,8 @@
+# name: Horizontal Rule (*)
+# contributor: Peng Deng <dengpeng@gmail.com>
+# key: hr
+# --
+
+*******
+
+$0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/markdown-mode/img b/packages/yasnippet/snippets/markdown-mode/img
new file mode 100644 (file)
index 0000000..29b2650
--- /dev/null
@@ -0,0 +1,5 @@
+# name: Image
+# contributor: Peng Deng <dengpeng@gmail.com>
+# key: img
+# --
+![${1:Alt Text}](${2:URL} $3) $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/markdown-mode/link b/packages/yasnippet/snippets/markdown-mode/link
new file mode 100644 (file)
index 0000000..c45ee19
--- /dev/null
@@ -0,0 +1,5 @@
+# name: Link
+# contributor: Peng Deng <dengpeng@gmail.com>
+# key: link
+# --
+[${1:Link Text}](${2:URL} $3) $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/markdown-mode/ol b/packages/yasnippet/snippets/markdown-mode/ol
new file mode 100644 (file)
index 0000000..ad1cdd8
--- /dev/null
@@ -0,0 +1,6 @@
+# name: Ordered List
+# contributor: Peng Deng <dengpeng@gmail.com>
+# key: ol
+# --
+${1:1}. ${2:Text}
+${1:$(number-to-string (1+ (string-to-number text)))}. $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/markdown-mode/rimg b/packages/yasnippet/snippets/markdown-mode/rimg
new file mode 100644 (file)
index 0000000..5fedc3a
--- /dev/null
@@ -0,0 +1,5 @@
+# name: Referenced Image
+# contributor: Peng Deng <dengpeng@gmail.com>
+# key: rimg
+# --
+![${1:Alt Text}][$2] $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/markdown-mode/rlb b/packages/yasnippet/snippets/markdown-mode/rlb
new file mode 100644 (file)
index 0000000..0bb37e9
--- /dev/null
@@ -0,0 +1,6 @@
+# name: Reference Label
+# contributor: Peng Deng <dengpeng@gmail.com>
+# key: rlb
+# --
+[${1:Reference}]: ${2:URL} $3
+$0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/markdown-mode/rlink b/packages/yasnippet/snippets/markdown-mode/rlink
new file mode 100644 (file)
index 0000000..97f41f0
--- /dev/null
@@ -0,0 +1,5 @@
+# name: Reference Link
+# contributor: Peng Deng <dengpeng@gmail.com>
+# key: rlink
+# --
+[${1:Link Text}][$2] $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/nxml-mode/.yas-make-groups b/packages/yasnippet/snippets/nxml-mode/.yas-make-groups
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/packages/yasnippet/snippets/nxml-mode/.yas-parents b/packages/yasnippet/snippets/nxml-mode/.yas-parents
new file mode 100644 (file)
index 0000000..eed5b44
--- /dev/null
@@ -0,0 +1 @@
+text-mode
diff --git a/packages/yasnippet/snippets/nxml-mode/body b/packages/yasnippet/snippets/nxml-mode/body
new file mode 100644 (file)
index 0000000..2ed3fcc
--- /dev/null
@@ -0,0 +1,7 @@
+# contributor: Anders Bach Nielsen <abachn@abachn.net>
+# name: <body>...</body>
+# key: body
+# --
+<body$1>
+  $0
+</body>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/nxml-mode/br b/packages/yasnippet/snippets/nxml-mode/br
new file mode 100644 (file)
index 0000000..621bc6c
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Anders Bach Nielsen <abachn@abachn.net>
+# name: <br />
+# key: br
+# --
+<br />
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/nxml-mode/code b/packages/yasnippet/snippets/nxml-mode/code
new file mode 100644 (file)
index 0000000..36bd62b
--- /dev/null
@@ -0,0 +1,7 @@
+# contributor: Anders Bach Nielsen <abachn@abachn.net>
+# name: <code>...</code>
+# key: code
+# --
+<code>
+  $0
+</code>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/nxml-mode/div b/packages/yasnippet/snippets/nxml-mode/div
new file mode 100644 (file)
index 0000000..07c2526
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Anders Bach Nielsen <abachn@abachn.net>
+# name: <div...>...</div>
+# key: div
+# --
+<div$1>$0</div>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/nxml-mode/form b/packages/yasnippet/snippets/nxml-mode/form
new file mode 100644 (file)
index 0000000..7767006
--- /dev/null
@@ -0,0 +1,7 @@
+# contributor: Anders Bach Nielsen <abachn@abachn.net>
+#name :<form method="..." action="..."></form>
+# key: form
+# --
+<form method="$1" action="$2">
+  $0
+</form>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/nxml-mode/head b/packages/yasnippet/snippets/nxml-mode/head
new file mode 100644 (file)
index 0000000..eb6b96b
--- /dev/null
@@ -0,0 +1,7 @@
+# contributor: Anders Bach Nielsen <abachn@abachn.net>
+# name: <head>...</head>
+# key: head
+# --
+<head>
+  $0
+</head>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/nxml-mode/header/h1 b/packages/yasnippet/snippets/nxml-mode/header/h1
new file mode 100644 (file)
index 0000000..328fb89
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Anders Bach Nielsen <abachn@abachn.net>
+# name: <h1>...</h1>
+# key: h1
+# --
+<h1>$1</h1>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/nxml-mode/header/h2 b/packages/yasnippet/snippets/nxml-mode/header/h2
new file mode 100644 (file)
index 0000000..3248435
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Anders Bach Nielsen <abachn@abachn.net>
+# name: <h2>...</h2>
+# key: h2
+# --
+<h2>$1</h2>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/nxml-mode/header/h3 b/packages/yasnippet/snippets/nxml-mode/header/h3
new file mode 100644 (file)
index 0000000..fe21a71
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Anders Bach Nielsen <abachn@abachn.net>
+# name: <h3>...</h3>
+# key: h3
+# --
+<h3>$1</h3>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/nxml-mode/header/h4 b/packages/yasnippet/snippets/nxml-mode/header/h4
new file mode 100644 (file)
index 0000000..bb2c983
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Anders Bach Nielsen <abachn@abachn.net>
+# name: <h4>...</h4>
+# key: h4
+# --
+<h4>$1</h4>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/nxml-mode/header/h5 b/packages/yasnippet/snippets/nxml-mode/header/h5
new file mode 100644 (file)
index 0000000..f11e62c
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Anders Bach Nielsen <abachn@abachn.net>
+# name: <h5>...</h5>
+# key: h5
+# --
+<h5>$1</h5>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/nxml-mode/header/h6 b/packages/yasnippet/snippets/nxml-mode/header/h6
new file mode 100644 (file)
index 0000000..46f035a
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Anders Bach Nielsen <abachn@abachn.net>
+# name: <h6>...</h6>
+# key: h6
+# --
+<h6>$1</h6>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/nxml-mode/hr b/packages/yasnippet/snippets/nxml-mode/hr
new file mode 100644 (file)
index 0000000..b649012
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Anders Bach Nielsen <abachn@abachn.net>
+# name: <hr />
+# key: hr
+# --
+<hr />
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/nxml-mode/href b/packages/yasnippet/snippets/nxml-mode/href
new file mode 100644 (file)
index 0000000..8fea09c
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Anders Bach Nielsen <abachn@abachn.net>
+# name: <a href="...">...</a>
+# key: href
+# --
+<a href="$1">$2</a>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/nxml-mode/html b/packages/yasnippet/snippets/nxml-mode/html
new file mode 100644 (file)
index 0000000..27a19ca
--- /dev/null
@@ -0,0 +1,7 @@
+# contributor: Anders Bach Nielsen <abachn@abachn.net>
+# name: <html xmlns="...">...</html>
+# key: html
+# --
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="${1:en}" lang="${2:en}">
+  $0
+</html>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/nxml-mode/img b/packages/yasnippet/snippets/nxml-mode/img
new file mode 100644 (file)
index 0000000..ec62027
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Anders Bach Nielsen <abachn@abachn.net>
+# name: <img src="..." alt="..." />
+# key: img
+# --
+<img src="$1" alt="$2" />
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/nxml-mode/input b/packages/yasnippet/snippets/nxml-mode/input
new file mode 100644 (file)
index 0000000..8745e33
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Anders Bach Nielsen <abachn@abachn.net>
+# name: <input ... />
+# key: input
+# --
+<input type="$1" name="$2" value="$3" />
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/nxml-mode/li b/packages/yasnippet/snippets/nxml-mode/li
new file mode 100644 (file)
index 0000000..dc5e8a4
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Anders Bach Nielsen <abachn@abachn.net>
+# name: <li>...</li>
+# key: li
+# --
+<li>$1</li>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/nxml-mode/link b/packages/yasnippet/snippets/nxml-mode/link
new file mode 100644 (file)
index 0000000..4102f54
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Anders Bach Nielsen <abachn@abachn.net>
+# name: <link stylesheet="..." />
+# key: link
+# --
+<link rel="${1:stylesheet}" href="${2:url}" type="${3:text/css}" media="${4:screen}" />
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/nxml-mode/meta/doctype b/packages/yasnippet/snippets/nxml-mode/meta/doctype
new file mode 100644 (file)
index 0000000..041cca3
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Anders Bach Nielsen <abachn@abachn.net>
+# name: DocType XHTML 1.1
+# key: doctype
+# --
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/nxml-mode/meta/doctype.xhtml1_strict b/packages/yasnippet/snippets/nxml-mode/meta/doctype.xhtml1_strict
new file mode 100644 (file)
index 0000000..775cb1f
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Anders Bach Nielsen <abachn@abachn.net>
+# name: DocType XHTML 1.0 Strict
+# key: doctype
+# --
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/nxml-mode/meta/doctype.xhtml1_transitional b/packages/yasnippet/snippets/nxml-mode/meta/doctype.xhtml1_transitional
new file mode 100644 (file)
index 0000000..e09447a
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Anders Bach Nielsen <abachn@abachn.net>
+# name: DocType XHTML 1.0 Transitional
+# key: doctype
+# --
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/nxml-mode/meta/meta b/packages/yasnippet/snippets/nxml-mode/meta/meta
new file mode 100644 (file)
index 0000000..b94b7c3
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Anders Bach Nielsen <abachn@abachn.net>
+# name: <meta name="..." content="..." />
+# key: meta
+# --
+<meta name="${1:generator}" content="${2:content}" />
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/nxml-mode/name b/packages/yasnippet/snippets/nxml-mode/name
new file mode 100644 (file)
index 0000000..754da4b
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Anders Bach Nielsen <abachn@abachn.net>
+# name: <a name="..."></a>
+# key: name
+# --
+<a name="$1"></a>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/nxml-mode/ol b/packages/yasnippet/snippets/nxml-mode/ol
new file mode 100644 (file)
index 0000000..b08a5ad
--- /dev/null
@@ -0,0 +1,7 @@
+# contributor: Anders Bach Nielsen <abachn@abachn.net>
+# name: <ol>...</ol>
+# key: ol
+# --
+<ol>
+  $0
+</ol>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/nxml-mode/p b/packages/yasnippet/snippets/nxml-mode/p
new file mode 100644 (file)
index 0000000..4cb9efe
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Anders Bach Nielsen <abachn@abachn.net>
+# name: <p>...</p>
+# key: p
+# --
+<p>$1</p>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/nxml-mode/pre b/packages/yasnippet/snippets/nxml-mode/pre
new file mode 100644 (file)
index 0000000..97b9519
--- /dev/null
@@ -0,0 +1,7 @@
+# contributor: Anders Bach Nielsen <abachn@abachn.net>
+# name: <pre>...</pre>
+# key: pre
+# --
+<pre>
+  $0
+</pre>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/nxml-mode/quote b/packages/yasnippet/snippets/nxml-mode/quote
new file mode 100644 (file)
index 0000000..81fb5d3
--- /dev/null
@@ -0,0 +1,7 @@
+# contributor: Anders Bach Nielsen <abachn@abachn.net>
+# name: <blockquote>...</blockquote>
+# key: quote
+# --
+<blockquote>
+  $1
+</blockquote>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/nxml-mode/span b/packages/yasnippet/snippets/nxml-mode/span
new file mode 100644 (file)
index 0000000..d31a222
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Anders Bach Nielsen <abachn@abachn.net>
+# name: <span>...</span>
+# key: span
+# --
+<span>$1</span>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/nxml-mode/style b/packages/yasnippet/snippets/nxml-mode/style
new file mode 100644 (file)
index 0000000..d3b1f87
--- /dev/null
@@ -0,0 +1,7 @@
+# contributor: Anders Bach Nielsen <abachn@abachn.net>
+# name: <style type="text/css" media="...">...</style>
+# key: style
+# --
+<style type="text/css" media="${1:screen}">
+  $0
+</style>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/nxml-mode/table b/packages/yasnippet/snippets/nxml-mode/table
new file mode 100644 (file)
index 0000000..11f8d0c
--- /dev/null
@@ -0,0 +1,7 @@
+# contributor: Anders Bach Nielsen <abachn@abachn.net>
+# name: <table>...</table>
+# key: table
+# --
+<table>
+  $0
+</table>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/nxml-mode/tag.1l b/packages/yasnippet/snippets/nxml-mode/tag.1l
new file mode 100644 (file)
index 0000000..5a7268e
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Anders Bach Nielsen <abachn@abachn.net>
+# name: <tag>...</tag>
+# key: tag
+# --
+<${1:tag}>$2</$1>$0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/nxml-mode/tag.2l b/packages/yasnippet/snippets/nxml-mode/tag.2l
new file mode 100644 (file)
index 0000000..0b58b0d
--- /dev/null
@@ -0,0 +1,7 @@
+# contributor: Anders Bach Nielsen <abachn@abachn.net>
+# name: <tag> \n...\n</tag>
+# key: tag
+# --
+<${1:tag}>
+  $2
+</$1>$0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/nxml-mode/td b/packages/yasnippet/snippets/nxml-mode/td
new file mode 100644 (file)
index 0000000..23af321
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Anders Bach Nielsen <abachn@abachn.net>
+# name: <td>...</td>
+# key: td
+# --
+<td$1>$2</td>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/nxml-mode/th b/packages/yasnippet/snippets/nxml-mode/th
new file mode 100644 (file)
index 0000000..115882e
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Anders Bach Nielsen <abachn@abachn.net>
+# name: <th>...</th>
+# key: th
+# --
+<th$1>$2</th>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/nxml-mode/title b/packages/yasnippet/snippets/nxml-mode/title
new file mode 100644 (file)
index 0000000..22c9b01
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Anders Bach Nielsen <abachn@abachn.net>
+# name: <title>...</title>
+# key: title
+# --
+<title>$1</title>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/nxml-mode/tr b/packages/yasnippet/snippets/nxml-mode/tr
new file mode 100644 (file)
index 0000000..2689e8c
--- /dev/null
@@ -0,0 +1,7 @@
+# contributor: Anders Bach Nielsen <abachn@abachn.net>
+# name: <tr>...</tr>
+# key: tr
+# --
+<tr>
+  $0
+</tr>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/nxml-mode/ul b/packages/yasnippet/snippets/nxml-mode/ul
new file mode 100644 (file)
index 0000000..f6f5fba
--- /dev/null
@@ -0,0 +1,7 @@
+# contributor: Anders Bach Nielsen <abachn@abachn.net>
+# name: <ul>...</ul>
+# key: ul
+# --
+<ul>
+  $0
+</ul>
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/objc-mode/.yas-parents b/packages/yasnippet/snippets/objc-mode/.yas-parents
new file mode 100644 (file)
index 0000000..ce9828b
--- /dev/null
@@ -0,0 +1 @@
+cc-mode
diff --git a/packages/yasnippet/snippets/objc-mode/prop b/packages/yasnippet/snippets/objc-mode/prop
new file mode 100644 (file)
index 0000000..1a74edb
--- /dev/null
@@ -0,0 +1,14 @@
+# name: foo { ... } ; setFoo { ... }
+# key: prop
+# --
+- (${1:id})${2:foo}
+{
+    return $2;
+}
+
+- (void)set${2:$(capitalize text)}:($1)aValue
+{
+    [$2 autorelease];
+    $2 = [aValue retain];
+}
+$0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/perl-mode/.yas-parents b/packages/yasnippet/snippets/perl-mode/.yas-parents
new file mode 100644 (file)
index 0000000..eed5b44
--- /dev/null
@@ -0,0 +1 @@
+text-mode
diff --git a/packages/yasnippet/snippets/perl-mode/eval b/packages/yasnippet/snippets/perl-mode/eval
new file mode 100644 (file)
index 0000000..a484014
--- /dev/null
@@ -0,0 +1,9 @@
+# name: eval { ... } if ($@) { ... }
+# key: eval
+# --
+eval {
+    ${1:# do something risky...}
+};
+if (\$@) {
+    ${2:# handle failure...}
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/perl-mode/for b/packages/yasnippet/snippets/perl-mode/for
new file mode 100644 (file)
index 0000000..1ba240f
--- /dev/null
@@ -0,0 +1,6 @@
+# name: for (...) { ... }
+# key: for
+# --
+for (my \$${1:var} = 0; \$$1 < ${2:expression}; \$$1++) {
+    ${3:# body...}
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/perl-mode/fore b/packages/yasnippet/snippets/perl-mode/fore
new file mode 100644 (file)
index 0000000..c3b81d5
--- /dev/null
@@ -0,0 +1,6 @@
+# name: foreach ... { ... }
+# key: fore
+# --
+foreach my \$${1:x} (@${2:array}) {
+    ${3:# body...}
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/perl-mode/if b/packages/yasnippet/snippets/perl-mode/if
new file mode 100644 (file)
index 0000000..567db90
--- /dev/null
@@ -0,0 +1,6 @@
+# name: if (...) { ... }
+# key: if
+# --
+if ($1) {
+    $0
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/perl-mode/ife b/packages/yasnippet/snippets/perl-mode/ife
new file mode 100644 (file)
index 0000000..f278f21
--- /dev/null
@@ -0,0 +1,8 @@
+# name: if (...) { ... } else { ... }
+# key: ife
+# --
+if ($1) {
+    $2
+} else {
+    $3
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/perl-mode/ifee b/packages/yasnippet/snippets/perl-mode/ifee
new file mode 100644 (file)
index 0000000..d1bf237
--- /dev/null
@@ -0,0 +1,10 @@
+# name: if, elsif, else ...
+# key: ifee
+# --
+if ($1) {
+       ${2:# body...}
+} elsif ($3) {
+       ${4:# elsif...}
+} else {
+       ${5:# else...}
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/perl-mode/sub b/packages/yasnippet/snippets/perl-mode/sub
new file mode 100644 (file)
index 0000000..05607d6
--- /dev/null
@@ -0,0 +1,6 @@
+# name: sub ... { ... }
+# key: sub
+# --
+sub ${1:function_name} {
+    $0
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/perl-mode/unless b/packages/yasnippet/snippets/perl-mode/unless
new file mode 100644 (file)
index 0000000..f91a652
--- /dev/null
@@ -0,0 +1,6 @@
+# name: unless (...) { ... }
+# key: unless
+# --
+unless ($1) {
+    $0
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/perl-mode/while b/packages/yasnippet/snippets/perl-mode/while
new file mode 100644 (file)
index 0000000..2744530
--- /dev/null
@@ -0,0 +1,6 @@
+# name: while (...) { ... }
+# key: while
+# --
+while ($1) {
+    $0
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/perl-mode/xfore b/packages/yasnippet/snippets/perl-mode/xfore
new file mode 100644 (file)
index 0000000..018e140
--- /dev/null
@@ -0,0 +1,4 @@
+# name: ... foreach ...
+# key: xfore
+# --
+${1:expression} foreach @${2:array};
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/perl-mode/xif b/packages/yasnippet/snippets/perl-mode/xif
new file mode 100644 (file)
index 0000000..ca8b563
--- /dev/null
@@ -0,0 +1,4 @@
+# name: ... if ...
+# key: xif
+# --
+${1:expression} if ${2:condition}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/perl-mode/xunless b/packages/yasnippet/snippets/perl-mode/xunless
new file mode 100644 (file)
index 0000000..dbb7d7d
--- /dev/null
@@ -0,0 +1,4 @@
+# name: ... unless ...
+# key: xunless
+# --
+${1:expression} unless ${2:condition}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/perl-mode/xwhile b/packages/yasnippet/snippets/perl-mode/xwhile
new file mode 100644 (file)
index 0000000..14c6308
--- /dev/null
@@ -0,0 +1,4 @@
+# name: ... while ...
+# key: xwhile
+# --
+${1:expression} while ${2:condition};
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/python-mode/.yas-parents b/packages/yasnippet/snippets/python-mode/.yas-parents
new file mode 100644 (file)
index 0000000..eed5b44
--- /dev/null
@@ -0,0 +1 @@
+text-mode
diff --git a/packages/yasnippet/snippets/python-mode/__ b/packages/yasnippet/snippets/python-mode/__
new file mode 100644 (file)
index 0000000..0253b02
--- /dev/null
@@ -0,0 +1,4 @@
+# name: __...__
+# key: __
+# --
+__${init}__
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/python-mode/class b/packages/yasnippet/snippets/python-mode/class
new file mode 100644 (file)
index 0000000..69a088e
--- /dev/null
@@ -0,0 +1,55 @@
+# -*- coding: utf-8 -*-
+# name: class
+# contributor: Orestis Markou
+# contributor: Nishio Hirokazu
+# contributor: Yasser González Fernández <yglez@uh.cu>
+# key: class
+# --
+class ${1:ClassName}(${2:object}):
+    """$3
+    """
+
+    def __init__(self, $4):
+        """$5
+        ${4:$
+        (let* ((indent
+                (concat "\n" (make-string (current-column) 32)))
+               (args
+                (mapconcat
+                 '(lambda (x)
+                    (if (not (string= (nth 0 x) ""))
+                        (concat "- " (char-to-string 96) (nth 0 x)
+                                (char-to-string 96) ":")))
+                 (mapcar
+                  '(lambda (x)
+                     (mapcar
+                      (lambda (x)
+                        (replace-regexp-in-string "[[:blank:]]*$" ""
+                         (replace-regexp-in-string "^[[:blank:]]*" "" x))) x))
+                  (mapcar '(lambda (x) (split-string x "="))
+                          (split-string text ",")))
+                 indent)))
+          (if (string= args "")
+              (make-string 3 34)
+            (mapconcat
+             'identity
+             (list "" "Arguments:" args (make-string 3 34))
+             indent)))
+        }
+        ${4:$
+        (mapconcat
+         '(lambda (x)
+            (if (not (string= (nth 0 x) ""))
+                (concat "self._" (nth 0 x) " = " (nth 0 x))))
+         (mapcar
+          '(lambda (x)
+             (mapcar
+              '(lambda (x)
+                 (replace-regexp-in-string "[[:blank:]]*$" ""
+                  (replace-regexp-in-string "^[[:blank:]]*" "" x)))
+              x))
+          (mapcar '(lambda (x) (split-string x "="))
+                  (split-string text ",")))
+         (concat "\n" (make-string (current-column) 32)))
+        }
+        $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/python-mode/def b/packages/yasnippet/snippets/python-mode/def
new file mode 100644 (file)
index 0000000..ca0ba66
--- /dev/null
@@ -0,0 +1,36 @@
+# -*- coding: utf-8 -*-
+# name: def
+# contributor: Orestis Markou
+# contributor: Yasser González Fernández <yglez@uh.cu>
+# key: def
+# --
+def ${1:name}($2):
+    """$3
+    ${2:$
+      (let* 
+        ((indent
+            (concat "\n" (make-string (current-column) 32)))
+           (args
+            (mapconcat
+             '(lambda (x)
+                (if (not (string= (nth 0 x) ""))
+                    (concat "- " (char-to-string 96) (nth 0 x)
+                            (char-to-string 96) ":")))
+             (mapcar
+              '(lambda (x)
+                 (mapcar
+                  '(lambda (x)
+                     (replace-regexp-in-string "[[:blank:]]*$" ""
+                      (replace-regexp-in-string "^[[:blank:]]*" "" x)))
+                  x))
+              (mapcar '(lambda (x) (split-string x "="))
+                      (split-string text ",")))
+             indent)))
+      (if (string= args "")
+          (make-string 3 34)
+        (mapconcat
+         'identity
+         (list "" "Arguments:" args (make-string 3 34))
+         indent)))
+    }
+    $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/python-mode/defm b/packages/yasnippet/snippets/python-mode/defm
new file mode 100644 (file)
index 0000000..a2fb5a0
--- /dev/null
@@ -0,0 +1,34 @@
+# -*- coding: utf-8 -*-
+# name: defm
+# contributor: Yasser Gonz¨¢lez Fern¨¢ndez <yglez@uh.cu>
+# key: defm
+# --
+def ${1:name}(self, $2):
+    """$3
+    ${2:$
+    (let* ((indent
+            (concat "\n" (make-string (current-column) 32)))
+           (args
+            (mapconcat
+             '(lambda (x)
+                (if (not (string= (nth 0 x) ""))
+                    (concat "- " (char-to-string 96) (nth 0 x)
+                            (char-to-string 96) ":")))
+             (mapcar
+              '(lambda (x)
+                 (mapcar
+                  '(lambda (x)
+                     (replace-regexp-in-string "[[:blank:]]*$" ""
+                      (replace-regexp-in-string "^[[:blank:]]*" "" x)))
+                  x))
+              (mapcar '(lambda (x) (split-string x "="))
+                      (split-string text ",")))
+             indent)))
+      (if (string= args "")
+          (make-string 3 34)
+        (mapconcat
+         'identity
+         (list "" "Arguments:" args (make-string 3 34))
+         indent)))
+    }
+    $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/python-mode/for b/packages/yasnippet/snippets/python-mode/for
new file mode 100644 (file)
index 0000000..7c78b5e
--- /dev/null
@@ -0,0 +1,5 @@
+# name: for ... in ... : ...
+# key: for
+# --
+for ${var} in ${collection}:
+    $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/python-mode/ifmain b/packages/yasnippet/snippets/python-mode/ifmain
new file mode 100644 (file)
index 0000000..68ed20b
--- /dev/null
@@ -0,0 +1,5 @@
+# name: if __name__ == '__main__': ...
+# key: ifmain
+# --
+if __name__ == '__main__':
+    $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/python-mode/prop b/packages/yasnippet/snippets/python-mode/prop
new file mode 100644 (file)
index 0000000..ec96633
--- /dev/null
@@ -0,0 +1,16 @@
+# contributor: Mads D. Kristensen <madsdk@gmail.com>
+# name: prop
+# key: prop
+# --
+def ${1:foo}():
+   doc = """${2:Doc string}"""
+   def fget(self):
+       return self._$1
+   def fset(self, value):
+       self._$1 = value
+   def fdel(self):
+       del self._$1
+   return locals()
+$1 = property(**$1())
+
+$0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/python-mode/propg b/packages/yasnippet/snippets/python-mode/propg
new file mode 100644 (file)
index 0000000..e89d4e4
--- /dev/null
@@ -0,0 +1,10 @@
+# contributor: Julio Carlos Menendez <godinblack@gmail.com>
+# name: _get_foo ... foo=property(...)
+# key: propg
+# --
+def _get_${1:foo}(self):
+    return self._$1
+
+$1 = property(_get_$1)
+
+$0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/python-mode/propsg b/packages/yasnippet/snippets/python-mode/propsg
new file mode 100644 (file)
index 0000000..876c139
--- /dev/null
@@ -0,0 +1,13 @@
+# contributor: Julio Carlos Menendez <godinblack@gmail.com>
+# name: _get_foo ... _set_foo ... foo=property(...)
+# key: propsg
+# --
+def _set_${1:foo}(self, value):
+    self._$1 = value
+
+def _get_$1(self):
+    return self._$1
+
+$1 = property(_get_$1, _set_$1)
+
+$0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/python-mode/while b/packages/yasnippet/snippets/python-mode/while
new file mode 100644 (file)
index 0000000..39452bb
--- /dev/null
@@ -0,0 +1,5 @@
+# name: while ... : ...
+# key: while
+# --
+while ${condition}:
+    $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/rst-mode/.yas-parents b/packages/yasnippet/snippets/rst-mode/.yas-parents
new file mode 100644 (file)
index 0000000..eed5b44
--- /dev/null
@@ -0,0 +1 @@
+text-mode
diff --git a/packages/yasnippet/snippets/rst-mode/chap b/packages/yasnippet/snippets/rst-mode/chap
new file mode 100644 (file)
index 0000000..593fc0f
--- /dev/null
@@ -0,0 +1,7 @@
+# name: Chapter title
+# key: chap
+# --
+${1:Chapter}
+${1:$(make-string (string-width text) ?\=)}
+
+$0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/rst-mode/sec b/packages/yasnippet/snippets/rst-mode/sec
new file mode 100644 (file)
index 0000000..c5a60bb
--- /dev/null
@@ -0,0 +1,7 @@
+# name: Section title
+# key: sec
+# --
+${1:Section}
+${1:$(make-string (string-width text) ?\-)}
+
+$0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/rst-mode/tit b/packages/yasnippet/snippets/rst-mode/tit
new file mode 100644 (file)
index 0000000..46ac6b1
--- /dev/null
@@ -0,0 +1,8 @@
+# name: Document title
+# key: tit
+# --
+${1:$(make-string (string-width text) ?\=)}
+${1:Title}
+${1:$(make-string (string-width text) ?\=)}
+
+$0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/ruby-mode/.yas-make-groups b/packages/yasnippet/snippets/ruby-mode/.yas-make-groups
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/packages/yasnippet/snippets/ruby-mode/.yas-parents b/packages/yasnippet/snippets/ruby-mode/.yas-parents
new file mode 100644 (file)
index 0000000..eed5b44
--- /dev/null
@@ -0,0 +1 @@
+text-mode
diff --git a/packages/yasnippet/snippets/ruby-mode/collections/all b/packages/yasnippet/snippets/ruby-mode/collections/all
new file mode 100644 (file)
index 0000000..c1e3089
--- /dev/null
@@ -0,0 +1,4 @@
+# name: all? { |...| ... }
+# key: all
+# --
+all? { |${e}| $0 }
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/ruby-mode/collections/any b/packages/yasnippet/snippets/ruby-mode/collections/any
new file mode 100644 (file)
index 0000000..c2d3a4b
--- /dev/null
@@ -0,0 +1,4 @@
+# name: any? { |...| ... }
+# key: any
+# --
+any? { |${e}| $0 }
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/ruby-mode/collections/classify b/packages/yasnippet/snippets/ruby-mode/collections/classify
new file mode 100644 (file)
index 0000000..363746f
--- /dev/null
@@ -0,0 +1,4 @@
+# name: classify { |...| ... }
+# key: classify
+# --
+classify { |${e}| $0 }
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/ruby-mode/collections/collect b/packages/yasnippet/snippets/ruby-mode/collections/collect
new file mode 100644 (file)
index 0000000..fb6aefa
--- /dev/null
@@ -0,0 +1,4 @@
+# name: collect { |...| ... }
+# key: collect
+# --
+collect { |${e}| $0 }
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/ruby-mode/collections/deli b/packages/yasnippet/snippets/ruby-mode/collections/deli
new file mode 100644 (file)
index 0000000..2fb3749
--- /dev/null
@@ -0,0 +1,4 @@
+# name: delete_if { |...| ... }
+# key: deli
+# --
+delete_if { |${e} $0 }
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/ruby-mode/collections/det b/packages/yasnippet/snippets/ruby-mode/collections/det
new file mode 100644 (file)
index 0000000..5964efb
--- /dev/null
@@ -0,0 +1,4 @@
+# name: detect { |...| ... }
+# key: det
+# --
+detect { |${e}| $0 }
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/ruby-mode/collections/ea b/packages/yasnippet/snippets/ruby-mode/collections/ea
new file mode 100644 (file)
index 0000000..9f8cf90
--- /dev/null
@@ -0,0 +1,4 @@
+# name: each { |...| ... }
+# key: ea
+# --
+each { |${e}| $0 }
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/ruby-mode/collections/eac b/packages/yasnippet/snippets/ruby-mode/collections/eac
new file mode 100644 (file)
index 0000000..9a45e24
--- /dev/null
@@ -0,0 +1,4 @@
+# name: each_cons(...) { |...| ... }
+# key: eac
+# --
+each_cons(${1:2}) { |${group}| $0 }
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/ruby-mode/collections/eai b/packages/yasnippet/snippets/ruby-mode/collections/eai
new file mode 100644 (file)
index 0000000..3ad66a7
--- /dev/null
@@ -0,0 +1,4 @@
+# name: each_index { |i| ... }
+# key: eai
+# --
+each_index { |${i}| $0 }
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/ruby-mode/collections/eav b/packages/yasnippet/snippets/ruby-mode/collections/eav
new file mode 100644 (file)
index 0000000..cb2ebdc
--- /dev/null
@@ -0,0 +1,4 @@
+# name: each_value { |val| ... }
+# key: eav
+# --
+each_value { |${val}| $0 }
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/ruby-mode/collections/eawi b/packages/yasnippet/snippets/ruby-mode/collections/eawi
new file mode 100644 (file)
index 0000000..c3b689a
--- /dev/null
@@ -0,0 +1,4 @@
+# name: each_with_index { |e, i| ... }
+# key: eawi
+# --
+each_with_index { |${e}, ${i}| $0 }
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/ruby-mode/collections/inject b/packages/yasnippet/snippets/ruby-mode/collections/inject
new file mode 100644 (file)
index 0000000..71adb00
--- /dev/null
@@ -0,0 +1,4 @@
+# name: inject(...) { |...| ... }
+# key: inject
+# --
+inject(${1:0}) { |${2:injection}, ${3:element}| $0 }
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/ruby-mode/collections/reject b/packages/yasnippet/snippets/ruby-mode/collections/reject
new file mode 100644 (file)
index 0000000..8ba6518
--- /dev/null
@@ -0,0 +1,4 @@
+# name: reject { |...| ... }
+# key: reject
+# --
+reject { |${1:element}| $0 }
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/ruby-mode/collections/select b/packages/yasnippet/snippets/ruby-mode/collections/select
new file mode 100644 (file)
index 0000000..ce30ac5
--- /dev/null
@@ -0,0 +1,4 @@
+# name: select { |...| ... }
+# key: select
+# --
+select { |${1:element}| $0 }
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/ruby-mode/collections/zip b/packages/yasnippet/snippets/ruby-mode/collections/zip
new file mode 100644 (file)
index 0000000..9db20ed
--- /dev/null
@@ -0,0 +1,4 @@
+#name : zip(...) { |...| ... }
+# key: collectionszip
+# --
+zip(${enums}) { |${row}| $0 }
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/ruby-mode/control structure/forin b/packages/yasnippet/snippets/ruby-mode/control structure/forin
new file mode 100644 (file)
index 0000000..c69f8d6
--- /dev/null
@@ -0,0 +1,6 @@
+# name: for ... in ...; ... end
+# key: forin
+# --
+for ${1:element} in ${2:collection}
+  $0
+end
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/ruby-mode/control structure/if b/packages/yasnippet/snippets/ruby-mode/control structure/if
new file mode 100644 (file)
index 0000000..b1ad4fc
--- /dev/null
@@ -0,0 +1,6 @@
+# name: if ... end
+# key: if
+# --
+if ${1:condition}
+  $0
+end
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/ruby-mode/control structure/ife b/packages/yasnippet/snippets/ruby-mode/control structure/ife
new file mode 100644 (file)
index 0000000..946b71c
--- /dev/null
@@ -0,0 +1,8 @@
+# name: if ... else ... end
+# key: ife
+# --
+if ${1:condition}
+  $2
+else
+  $3
+end
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/ruby-mode/control structure/tim b/packages/yasnippet/snippets/ruby-mode/control structure/tim
new file mode 100644 (file)
index 0000000..5844974
--- /dev/null
@@ -0,0 +1,4 @@
+# name: times { |n| ... }
+# key: tim
+# --
+times { |${n}| $0 }
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/ruby-mode/control structure/until b/packages/yasnippet/snippets/ruby-mode/control structure/until
new file mode 100644 (file)
index 0000000..99d34b5
--- /dev/null
@@ -0,0 +1,6 @@
+# name: until ... end
+# key: until
+# --
+until ${condition}
+  $0
+end
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/ruby-mode/control structure/upt b/packages/yasnippet/snippets/ruby-mode/control structure/upt
new file mode 100644 (file)
index 0000000..cadc40d
--- /dev/null
@@ -0,0 +1,6 @@
+# name: upto(...) { |n| ... }
+# key: upt
+# --
+upto(${n}) { |${i}|
+  $0
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/ruby-mode/control structure/when b/packages/yasnippet/snippets/ruby-mode/control structure/when
new file mode 100644 (file)
index 0000000..c11b6a5
--- /dev/null
@@ -0,0 +1,6 @@
+# name: when ... end
+# key: when
+# --
+when ${condition}
+  $0
+end
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/ruby-mode/control structure/while b/packages/yasnippet/snippets/ruby-mode/control structure/while
new file mode 100644 (file)
index 0000000..920a08a
--- /dev/null
@@ -0,0 +1,6 @@
+# name: while ... end
+# key: while
+# --
+while ${condition}
+  $0
+end
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/ruby-mode/definitions/Comp b/packages/yasnippet/snippets/ruby-mode/definitions/Comp
new file mode 100644 (file)
index 0000000..112ebae
--- /dev/null
@@ -0,0 +1,8 @@
+# name: include Comparable; def <=> ... end
+# key: Comp
+# --
+include Comparable
+
+def <=> other
+  $0
+end
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/ruby-mode/definitions/am b/packages/yasnippet/snippets/ruby-mode/definitions/am
new file mode 100644 (file)
index 0000000..c6b846d
--- /dev/null
@@ -0,0 +1,4 @@
+# name: alias_method new, old
+# key: am
+# --
+alias_method :${new_name}, :${old_name}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/ruby-mode/definitions/cla b/packages/yasnippet/snippets/ruby-mode/definitions/cla
new file mode 100644 (file)
index 0000000..d2c8ff8
--- /dev/null
@@ -0,0 +1,6 @@
+# name: class << self ... end
+# key: cla
+# --
+class << ${self}
+  $0
+end
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/ruby-mode/definitions/cls b/packages/yasnippet/snippets/ruby-mode/definitions/cls
new file mode 100644 (file)
index 0000000..19754a7
--- /dev/null
@@ -0,0 +1,13 @@
+# name: class ... end
+# contributor: hitesh <hitesh.jasani@gmail.com>
+# key: cls
+# --
+class ${1:`(let ((fn (capitalize (file-name-nondirectory
+                                 (file-name-sans-extension
+                                (or (buffer-file-name)
+                                    (buffer-name (current-buffer))))))))
+           (cond
+             ((string-match "_" fn) (replace-match "" nil nil fn))
+              (t fn)))`}
+  $0
+end
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/ruby-mode/definitions/mm b/packages/yasnippet/snippets/ruby-mode/definitions/mm
new file mode 100644 (file)
index 0000000..752b3ce
--- /dev/null
@@ -0,0 +1,6 @@
+# name: def method_missing ... end
+# key: mm
+# --
+def method_missing(method, *args)
+  $0
+end
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/ruby-mode/definitions/r b/packages/yasnippet/snippets/ruby-mode/definitions/r
new file mode 100644 (file)
index 0000000..5f9c093
--- /dev/null
@@ -0,0 +1,4 @@
+# name: attr_reader ...
+# key: r
+# --
+attr_reader :
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/ruby-mode/definitions/rw b/packages/yasnippet/snippets/ruby-mode/definitions/rw
new file mode 100644 (file)
index 0000000..ac72bcf
--- /dev/null
@@ -0,0 +1,4 @@
+# name: attr_accessor ...
+# key: rw
+# --
+attr_accessor :
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/ruby-mode/definitions/w b/packages/yasnippet/snippets/ruby-mode/definitions/w
new file mode 100644 (file)
index 0000000..a2f95c8
--- /dev/null
@@ -0,0 +1,4 @@
+# name: attr_writer ...
+# key: w
+# --
+attr_writer :
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/ruby-mode/general/# b/packages/yasnippet/snippets/ruby-mode/general/#
new file mode 100644 (file)
index 0000000..491ca39
--- /dev/null
@@ -0,0 +1,4 @@
+# name: # =>
+# key: #
+# --
+# => 
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/ruby-mode/general/=b b/packages/yasnippet/snippets/ruby-mode/general/=b
new file mode 100644 (file)
index 0000000..4334e9b
--- /dev/null
@@ -0,0 +1,6 @@
+# name: =begin rdoc ... =end
+# key: =b
+# --
+=begin rdoc
+  $0
+=end
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/ruby-mode/general/app b/packages/yasnippet/snippets/ruby-mode/general/app
new file mode 100644 (file)
index 0000000..6d5f488
--- /dev/null
@@ -0,0 +1,6 @@
+# name: if __FILE__ == $PROGRAM_NAME ... end
+# key: app
+# --
+if __FILE__ == $PROGRAM_NAME
+  $0
+end
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/ruby-mode/general/bm b/packages/yasnippet/snippets/ruby-mode/general/bm
new file mode 100644 (file)
index 0000000..83907d2
--- /dev/null
@@ -0,0 +1,6 @@
+# name: Benchmark.bmbm(...) do ... end
+# key: bm
+# --
+Benchmark.bmbm(${1:10}) do |x|
+  $0
+end
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/ruby-mode/general/case b/packages/yasnippet/snippets/ruby-mode/general/case
new file mode 100644 (file)
index 0000000..f7ecb21
--- /dev/null
@@ -0,0 +1,7 @@
+# name: case ... end
+# key: case
+# --
+case ${1:object}
+when ${2:condition}
+  $0
+end
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/ruby-mode/general/dee b/packages/yasnippet/snippets/ruby-mode/general/dee
new file mode 100644 (file)
index 0000000..d3bf695
--- /dev/null
@@ -0,0 +1,4 @@
+# name: deep_copy(...)
+# key: dee
+# --
+Marshal.load(Marshal.dump($0))
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/ruby-mode/general/rb b/packages/yasnippet/snippets/ruby-mode/general/rb
new file mode 100644 (file)
index 0000000..55a5ac6
--- /dev/null
@@ -0,0 +1,4 @@
+# name: /usr/bin/ruby -wKU
+# key: rb
+# --
+#!/usr/bin/ruby -wKU
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/ruby-mode/general/req b/packages/yasnippet/snippets/ruby-mode/general/req
new file mode 100644 (file)
index 0000000..464b521
--- /dev/null
@@ -0,0 +1,4 @@
+# name: require "..."
+# key: req
+# --
+require "$0"
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/ruby-mode/general/rreq b/packages/yasnippet/snippets/ruby-mode/general/rreq
new file mode 100644 (file)
index 0000000..b676648
--- /dev/null
@@ -0,0 +1,4 @@
+# name: require File.join(File.dirname(__FILE__), ...)
+# key: rreq
+# --
+require File.join(File.dirname(__FILE__), $0)
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/ruby-mode/general/y b/packages/yasnippet/snippets/ruby-mode/general/y
new file mode 100644 (file)
index 0000000..0085c9e
--- /dev/null
@@ -0,0 +1,4 @@
+# name: :yields: arguments (rdoc)
+# key: y
+# --
+:yields: $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/.yas-parents b/packages/yasnippet/snippets/scala-mode/.yas-parents
new file mode 100644 (file)
index 0000000..eed5b44
--- /dev/null
@@ -0,0 +1 @@
+text-mode
diff --git a/packages/yasnippet/snippets/scala-mode/act b/packages/yasnippet/snippets/scala-mode/act
new file mode 100644 (file)
index 0000000..d3fc196
--- /dev/null
@@ -0,0 +1,11 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: def act = { ..}
+# key: act
+# --
+def act = {
+  loop {
+    react {
+      $0
+    }
+  }
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/act.arg b/packages/yasnippet/snippets/scala-mode/act.arg
new file mode 100644 (file)
index 0000000..45369ab
--- /dev/null
@@ -0,0 +1,11 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: def act(arg: T) = { ..}
+# key: act
+# --
+def act(${1:arg}: ${2:type}) = {
+  loop {
+    react {
+      $0
+    }
+  }
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/actor b/packages/yasnippet/snippets/scala-mode/actor
new file mode 100644 (file)
index 0000000..eb1ecef
--- /dev/null
@@ -0,0 +1,11 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: val a = actor { ..}
+# key: actor
+# --
+val a = actor {
+  loop {
+    react {
+      $0
+    }
+  }
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/ano b/packages/yasnippet/snippets/scala-mode/ano
new file mode 100644 (file)
index 0000000..6c78812
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: (args) => ...
+# key: ano
+# --
+($1) => ${2:body} $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/app b/packages/yasnippet/snippets/scala-mode/app
new file mode 100644 (file)
index 0000000..f177cd1
--- /dev/null
@@ -0,0 +1,7 @@
+# Author: Anders Bach Nielsen <andersbach.nielsen@epfl.ch>
+# name: object name extends Application
+# key: app
+# --
+object ${1:name} extends Application {
+  $0
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/arr.new b/packages/yasnippet/snippets/scala-mode/arr.new
new file mode 100644 (file)
index 0000000..6e17e73
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: Array[T](..)
+# key: arr
+# --
+Array[${1:value}](${2:args}) $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/arr.val-new b/packages/yasnippet/snippets/scala-mode/arr.val-new
new file mode 100644 (file)
index 0000000..2736b5f
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: val a = Array[T](..)
+# key: arr
+# --
+val ${1:arr} = Array[${2:value}](${3:args}) $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/asof b/packages/yasnippet/snippets/scala-mode/asof
new file mode 100644 (file)
index 0000000..0736fd6
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: asInstanceOf[T] 
+# key: asof
+# --
+asInstanceOf[${1:type}] $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/ass b/packages/yasnippet/snippets/scala-mode/ass
new file mode 100644 (file)
index 0000000..b4640a3
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: assert(x === y)
+# key: ass
+# --
+assert(${1:x} === ${2:y}) $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/ass.true b/packages/yasnippet/snippets/scala-mode/ass.true
new file mode 100644 (file)
index 0000000..76f8226
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: assert(true)
+# key: ass
+# --
+assert(true) $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/at.author b/packages/yasnippet/snippets/scala-mode/at.author
new file mode 100644 (file)
index 0000000..ba70f63
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Anders Bach Nielsen <andersbach.nielsen@epfl.ch>
+# name: @author name
+# key: at
+# --
+@author ${1:name} $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/at.param b/packages/yasnippet/snippets/scala-mode/at.param
new file mode 100644 (file)
index 0000000..89a5b0b
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Anders Bach Nielsen <andersbach.nielsen@epfl.ch>
+# name: @param name description
+# key: at
+# --
+@param ${1:name} ${2:description} $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/at.return b/packages/yasnippet/snippets/scala-mode/at.return
new file mode 100644 (file)
index 0000000..a027516
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Anders Bach Nielsen <andersbach.nielsen@epfl.ch>
+# name: @return description
+# key: at
+# --
+@return ${1:description} $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/at.version b/packages/yasnippet/snippets/scala-mode/at.version
new file mode 100644 (file)
index 0000000..a202706
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Anders Bach Nielsen <andersbach.nielsen@epfl.ch>
+# name: @version number
+# key: at
+# --
+@version ${1:0.1} $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/bang b/packages/yasnippet/snippets/scala-mode/bang
new file mode 100644 (file)
index 0000000..b5c94ad
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: actor ! message
+# key: bang
+# --
+${1:actor} ! ${2:message} $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/case b/packages/yasnippet/snippets/scala-mode/case
new file mode 100644 (file)
index 0000000..c09c17a
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: case pattern => 
+# key: case
+# --
+case ${1:pattern} => $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/case.match-all b/packages/yasnippet/snippets/scala-mode/case.match-all
new file mode 100644 (file)
index 0000000..b481c9f
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: case _ => 
+# key: case
+# --
+case _ => $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/cast b/packages/yasnippet/snippets/scala-mode/cast
new file mode 100644 (file)
index 0000000..659436d
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: asInstanceOf[T] 
+# key: cast
+# --
+asInstanceOf[${1:type}] $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/cc b/packages/yasnippet/snippets/scala-mode/cc
new file mode 100644 (file)
index 0000000..cfc727c
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: case class T(arg: A)
+# key: cc
+# --
+case class ${1:name}(${2:arg}: ${3:type}) $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/cl b/packages/yasnippet/snippets/scala-mode/cl
new file mode 100644 (file)
index 0000000..d597400
--- /dev/null
@@ -0,0 +1,7 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: class T { .. }
+# key: cl
+# --
+class ${1:name} {
+  $0
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/cl.abs b/packages/yasnippet/snippets/scala-mode/cl.abs
new file mode 100644 (file)
index 0000000..9ea9fe2
--- /dev/null
@@ -0,0 +1,7 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: abstract class T { .. }
+# key: cl
+# --
+abstract class ${1:name} {
+  $0
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/cl.abs-arg b/packages/yasnippet/snippets/scala-mode/cl.abs-arg
new file mode 100644 (file)
index 0000000..98cf760
--- /dev/null
@@ -0,0 +1,7 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: abstract class T(args) { .. }
+# key: cl
+# --
+abstract class ${1:name}(${2:args}) {
+  $0
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/cl.arg b/packages/yasnippet/snippets/scala-mode/cl.arg
new file mode 100644 (file)
index 0000000..1b9d729
--- /dev/null
@@ -0,0 +1,7 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: class T(args) { .. }
+# key: cl
+# --
+class ${1:name}(${2:args}) {
+  $0
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/clof b/packages/yasnippet/snippets/scala-mode/clof
new file mode 100644 (file)
index 0000000..63fe191
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: classOf[T] 
+# key: clof
+# --
+classOf[${1:type}] $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/co b/packages/yasnippet/snippets/scala-mode/co
new file mode 100644 (file)
index 0000000..3ad6f79
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: case object T
+# key: co
+# --
+case object ${1:name} $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/cons b/packages/yasnippet/snippets/scala-mode/cons
new file mode 100644 (file)
index 0000000..601a1a4
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: element1 :: element2
+# key: cons
+# --
+${1:element1} :: ${2:element2} $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/cons.nil b/packages/yasnippet/snippets/scala-mode/cons.nil
new file mode 100644 (file)
index 0000000..60ac028
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: element1 :: Nil
+# key: cons
+# --
+${1:element1} :: Nil $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/def.arg b/packages/yasnippet/snippets/scala-mode/def.arg
new file mode 100644 (file)
index 0000000..be5403b
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: def f(arg: T) = ...
+# key: def
+# --
+def ${1:name}(${2:args}) = $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/def.arg-body b/packages/yasnippet/snippets/scala-mode/def.arg-body
new file mode 100644 (file)
index 0000000..8dcbb81
--- /dev/null
@@ -0,0 +1,7 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: def f(arg: T) = {...}
+# key: def
+# --
+def ${1:name}(${2:args}) = {
+  $0
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/def.arg-ret b/packages/yasnippet/snippets/scala-mode/def.arg-ret
new file mode 100644 (file)
index 0000000..4ad27ce
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: def f(arg: T): R = ...
+# key: def
+# --
+def ${1:name}(${2:args}): ${3:Unit} = $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/def.arg-ret-body b/packages/yasnippet/snippets/scala-mode/def.arg-ret-body
new file mode 100644 (file)
index 0000000..2ffcf4b
--- /dev/null
@@ -0,0 +1,7 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: def f(arg: T): R = {...}
+# key: def
+# --
+def ${1:name}(${2:args}): ${3:Unit} = {
+  $0
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/def.body b/packages/yasnippet/snippets/scala-mode/def.body
new file mode 100644 (file)
index 0000000..c43aea4
--- /dev/null
@@ -0,0 +1,7 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: def f = {...}
+# key: def
+# --
+def ${1:name} = {
+  $0
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/def.ret b/packages/yasnippet/snippets/scala-mode/def.ret
new file mode 100644 (file)
index 0000000..719dc69
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: def f: R = ...
+# key: def
+# --
+def ${1:name}: ${2:Unit} = $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/def.ret-body b/packages/yasnippet/snippets/scala-mode/def.ret-body
new file mode 100644 (file)
index 0000000..d8ee456
--- /dev/null
@@ -0,0 +1,7 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: def f: R = {...}
+# key: def
+# --
+def ${1:name}: ${3:Unit} = {
+  $0
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/def.simple b/packages/yasnippet/snippets/scala-mode/def.simple
new file mode 100644 (file)
index 0000000..c956bbf
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: def f = ...
+# key: def
+# --
+def ${1:name} = $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/doc.class b/packages/yasnippet/snippets/scala-mode/doc.class
new file mode 100644 (file)
index 0000000..a5c9962
--- /dev/null
@@ -0,0 +1,9 @@
+# Author: Anders Bach Nielsen <andersbach.nielsen@epfl.ch>
+# name: /** cls/trt/obj name */
+# key: doc
+# --
+/** 
+ * `(scala-mode-find-clstrtobj-name-doc)`
+ * ${1:description}
+ * $0  
+ */
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/doc.def b/packages/yasnippet/snippets/scala-mode/doc.def
new file mode 100644 (file)
index 0000000..4944d8e
--- /dev/null
@@ -0,0 +1,7 @@
+# Author: Anders Bach Nielsen <andersbach.nielsen@epfl.ch>
+# name: /** method name */
+# key: doc
+# --
+/** 
+ * `(scala-mode-def-and-args-doc)`
+ */ 
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/doc.file b/packages/yasnippet/snippets/scala-mode/doc.file
new file mode 100644 (file)
index 0000000..5f02a9e
--- /dev/null
@@ -0,0 +1,10 @@
+# Author: Anders Bach Nielsen <andersbach.nielsen@epfl.ch>
+# name: /** file name */
+# key: doc
+# --
+/**
+ * `(scala-mode-file-doc)`
+ * $0
+ * @author ${1:name}
+ * @version ${2:0.1} 
+ */
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/doc.file-scala b/packages/yasnippet/snippets/scala-mode/doc.file-scala
new file mode 100644 (file)
index 0000000..6c21919
--- /dev/null
@@ -0,0 +1,17 @@
+# Author: Anders Bach Nielsen <andersbach.nielsen@epfl.ch>
+# name: /** scala file */
+# key: doc
+# --
+/*                     __                                               *\
+**     ________ ___   / /  ___     Scala $3                               **
+**    / __/ __// _ | / /  / _ |    (c) 2005-`(format-time-string "%Y")` , LAMP/EPFL             **
+**  __\ \/ /__/ __ |/ /__/ __ |    http://scala-lang.org/               **
+** /____/\___/_/ |_/____/_/ | |                                         **
+**                          |/                                          **
+\*                                                                      */
+/** 
+ * $0
+ * @author ${1:name} 
+ * @version ${2:0.1}
+ * $Id$
+ */
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/doc.file-scala-api b/packages/yasnippet/snippets/scala-mode/doc.file-scala-api
new file mode 100644 (file)
index 0000000..bb306de
--- /dev/null
@@ -0,0 +1,17 @@
+# Author: Anders Bach Nielsen <andersbach.nielsen@epfl.ch>
+# name: /** scala api file */
+# key: doc
+# --
+/*                     __                                               *\
+**     ________ ___   / /  ___     Scala API                            **
+**    / __/ __// _ | / /  / _ |    (c) 2005-`(format-time-string "%Y")`, LAMP/EPFL             **
+**  __\ \/ /__/ __ |/ /__/ __ |    http://scala-lang.org/               **
+** /____/\___/_/ |_/____/_/ | |                                         **
+**                          |/                                          **
+\*                                                                      */
+/** 
+ * $0
+ * @author ${1:name} 
+ * @version ${2:0.1}
+ * $Id$
+ */
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/doc.scaladoc b/packages/yasnippet/snippets/scala-mode/doc.scaladoc
new file mode 100644 (file)
index 0000000..3d96279
--- /dev/null
@@ -0,0 +1,8 @@
+# Author: Anders Bach Nielsen <andersbach.nielsen@epfl.ch>
+# name: /** ... */
+# key: doc
+# --
+/**
+ * ${1:description}
+ * $0
+ */
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/expect b/packages/yasnippet/snippets/scala-mode/expect
new file mode 100644 (file)
index 0000000..b34b4d9
--- /dev/null
@@ -0,0 +1,7 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: expect(value) { ..}
+# key: expect
+# --
+expect(${1:reply}) {
+  $0
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/ext b/packages/yasnippet/snippets/scala-mode/ext
new file mode 100644 (file)
index 0000000..06ba476
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: extends T
+# key: ext
+# --
+extends $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/for.extract b/packages/yasnippet/snippets/scala-mode/for.extract
new file mode 100644 (file)
index 0000000..bc6666d
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: x <- xs
+# key: for
+# --
+${1:x} <- ${2:xs}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/for.if b/packages/yasnippet/snippets/scala-mode/for.if
new file mode 100644 (file)
index 0000000..f812c2c
--- /dev/null
@@ -0,0 +1,7 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: for (x <- xs if guard) { ... }
+# key: for
+# --
+for (${1:x} <- ${2:xs} if ${3:guard}) {
+  $0
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/for.loop b/packages/yasnippet/snippets/scala-mode/for.loop
new file mode 100644 (file)
index 0000000..9b538f7
--- /dev/null
@@ -0,0 +1,7 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: for (x <- xs) { ... }
+# key: for
+# --
+for (${1:x} <- ${2:xs}) {
+  $0
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/for.multi b/packages/yasnippet/snippets/scala-mode/for.multi
new file mode 100644 (file)
index 0000000..6a1866d
--- /dev/null
@@ -0,0 +1,10 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: for {x <- xs \ y <- ys} { yield }
+# key: for
+# --
+for {
+  ${1:x} <- ${2:xs}
+  ${3:x} <- ${4:xs}
+} {
+  yield $0
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/foreach b/packages/yasnippet/snippets/scala-mode/foreach
new file mode 100644 (file)
index 0000000..7061201
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: foreach(x => ..)
+# key: foreach
+# --
+foreach(${1:x} => ${2:body}) $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/hmap.new b/packages/yasnippet/snippets/scala-mode/hmap.new
new file mode 100644 (file)
index 0000000..a675336
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: new HashMap[K, V]
+# key: hmap
+# --
+new HashMap[${1:key}, ${2:value}] $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/hmap.val-new b/packages/yasnippet/snippets/scala-mode/hmap.val-new
new file mode 100644 (file)
index 0000000..6f53fc6
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: val m = new HashMap[K, V]
+# key: hmap
+# --
+val ${1:m} = new HashMap[${2:key}, ${3:value}] $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/hset.new b/packages/yasnippet/snippets/scala-mode/hset.new
new file mode 100644 (file)
index 0000000..79e4348
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: new HashSet[K]
+# key: hset
+# --
+new HashSet[${1:key}] $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/hset.val-new b/packages/yasnippet/snippets/scala-mode/hset.val-new
new file mode 100644 (file)
index 0000000..9b9cde2
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: val m = new HashSet[K]
+# key: hset
+# --
+val ${1:m} = new HashSet[${2:key}] $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/if b/packages/yasnippet/snippets/scala-mode/if
new file mode 100644 (file)
index 0000000..d1724ef
--- /dev/null
@@ -0,0 +1,7 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: if (cond) { .. }
+# key: if
+# --
+if (${1:condition}) {
+  $0
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/if.else b/packages/yasnippet/snippets/scala-mode/if.else
new file mode 100644 (file)
index 0000000..f0210cb
--- /dev/null
@@ -0,0 +1,9 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: if (cond) { .. } else { .. }
+# key: if
+# --
+if (${1:condition}) {
+  $2
+} else {
+  $0
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/imp b/packages/yasnippet/snippets/scala-mode/imp
new file mode 100644 (file)
index 0000000..f5fdee0
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: import ..
+# key: imp
+# --
+import $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/intercept b/packages/yasnippet/snippets/scala-mode/intercept
new file mode 100644 (file)
index 0000000..06eed8d
--- /dev/null
@@ -0,0 +1,7 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: intercept(classOf[T]) { ..}
+# key: intercept
+# --
+intercept(classOf[${1:Exception]}) {
+  $0
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/isof b/packages/yasnippet/snippets/scala-mode/isof
new file mode 100644 (file)
index 0000000..bfb421f
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: isInstanceOf[T] 
+# key: isof
+# --
+isInstanceOf[${1:type}] $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/ls.new b/packages/yasnippet/snippets/scala-mode/ls.new
new file mode 100644 (file)
index 0000000..f231019
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: List(..)
+# key: ls
+# --
+List(${1:args}, ${2:args}) $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/ls.val-new b/packages/yasnippet/snippets/scala-mode/ls.val-new
new file mode 100644 (file)
index 0000000..ea660bf
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: val l = List(..)
+# key: ls
+# --
+val ${1:l} = List(${2:args}, ${3:args}) $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/main b/packages/yasnippet/snippets/scala-mode/main
new file mode 100644 (file)
index 0000000..a9c67e3
--- /dev/null
@@ -0,0 +1,7 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: def main(args: Array[String]) = { ... }
+# key: main
+# --
+def main(args: Array[String]) = {
+  $0
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/map b/packages/yasnippet/snippets/scala-mode/map
new file mode 100644 (file)
index 0000000..43e2a0b
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: map(x => ..)
+# key: map
+# --
+map(${1:x} => ${2:body}) $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/map.new b/packages/yasnippet/snippets/scala-mode/map.new
new file mode 100644 (file)
index 0000000..6c71fce
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: Map(key -> value)
+# key: map
+# --
+Map(${1:key} -> ${2:value}) $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/match b/packages/yasnippet/snippets/scala-mode/match
new file mode 100644 (file)
index 0000000..44bc725
--- /dev/null
@@ -0,0 +1,7 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: cc match { .. }
+# key: match
+# --
+${1:cc} match {
+  case ${2:pattern} => $0
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/match.can b/packages/yasnippet/snippets/scala-mode/match.can
new file mode 100644 (file)
index 0000000..72798c5
--- /dev/null
@@ -0,0 +1,12 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: can match { case Full(res) => .. }
+# key: match
+# --
+${1:option} match {
+  case Full(res) => $0
+
+  case Empty => 
+
+  case Failure(msg, _, _) => 
+
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/match.option b/packages/yasnippet/snippets/scala-mode/match.option
new file mode 100644 (file)
index 0000000..01186e3
--- /dev/null
@@ -0,0 +1,9 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: option match { case None => .. }
+# key: match
+# --
+${1:option} match {
+  case None => $0
+  case Some(res) => 
+
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/mix b/packages/yasnippet/snippets/scala-mode/mix
new file mode 100644 (file)
index 0000000..bc78100
--- /dev/null
@@ -0,0 +1,7 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: trait T { .. }
+# key: mix
+# --
+trait ${1:name} {
+  $0
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/ob b/packages/yasnippet/snippets/scala-mode/ob
new file mode 100644 (file)
index 0000000..ec4d3a9
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: object name extends T
+# key: ob
+# --
+object ${1:name} extends ${2:type} $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/pac b/packages/yasnippet/snippets/scala-mode/pac
new file mode 100644 (file)
index 0000000..2c51176
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: package ..
+# key: pac
+# --
+package $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/pr.newline b/packages/yasnippet/snippets/scala-mode/pr.newline
new file mode 100644 (file)
index 0000000..093027a
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: println(..)
+# key: pr
+# --
+println(${1:obj}) $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/pr.simple b/packages/yasnippet/snippets/scala-mode/pr.simple
new file mode 100644 (file)
index 0000000..a624140
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: print(..)
+# key: pr
+# --
+print(${1:obj}) $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/pr.string b/packages/yasnippet/snippets/scala-mode/pr.string
new file mode 100644 (file)
index 0000000..130474a
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: println("..")
+# key: pr
+# --
+println("${1:msg}") $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/pr.trace b/packages/yasnippet/snippets/scala-mode/pr.trace
new file mode 100644 (file)
index 0000000..8ad92b0
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: println("obj: " + obj)
+# key: pr
+# --
+println("${1:obj}: " + ${1:obj}) $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/pri b/packages/yasnippet/snippets/scala-mode/pri
new file mode 100644 (file)
index 0000000..12dbd45
--- /dev/null
@@ -0,0 +1,5 @@
+#Author : Jonas Bonèr <jonas@jonasboner.com>
+#name : private
+# key: pri
+# --
+private $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/pri.param b/packages/yasnippet/snippets/scala-mode/pri.param
new file mode 100644 (file)
index 0000000..90ae3ba
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: private[this]
+# key: pri
+# --
+private[${1:this}] $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/pro b/packages/yasnippet/snippets/scala-mode/pro
new file mode 100644 (file)
index 0000000..d5612b4
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: protected
+# key: pro
+# --
+protected $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/pro.param b/packages/yasnippet/snippets/scala-mode/pro.param
new file mode 100644 (file)
index 0000000..ae82305
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: protected[this]
+# key: pro
+# --
+protected[${1:this}] $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/suite b/packages/yasnippet/snippets/scala-mode/suite
new file mode 100644 (file)
index 0000000..942fbad
--- /dev/null
@@ -0,0 +1,9 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: class T extends Suite { .. }
+# key: suite
+# --
+import org.scalatest._
+
+class ${1:name} extends Suite {
+  $0
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/test b/packages/yasnippet/snippets/scala-mode/test
new file mode 100644 (file)
index 0000000..d4819ac
--- /dev/null
@@ -0,0 +1,8 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: @Test def testX = ...
+# key: test
+# --
+//@Test
+def test${1:name} = {
+  $0
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/throw b/packages/yasnippet/snippets/scala-mode/throw
new file mode 100644 (file)
index 0000000..e303c25
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: throw new Exception
+# key: throw
+# --
+throw new ${1:Exception}(${2:msg}) $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/tr b/packages/yasnippet/snippets/scala-mode/tr
new file mode 100644 (file)
index 0000000..2381bdc
--- /dev/null
@@ -0,0 +1,7 @@
+# Author: Anders Bach Nielsen <andersbach.nielsen@epfl.ch>
+# name: trait T { .. }
+# key: tr
+# --
+trait ${1:name} {
+  $0
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/tr.ext b/packages/yasnippet/snippets/scala-mode/tr.ext
new file mode 100644 (file)
index 0000000..15fb8aa
--- /dev/null
@@ -0,0 +1,7 @@
+# Author: Anders Bach Nielsen <andersbach.nielsen@epfl.ch>
+# name: trait T extends C { .. }
+# key: tr
+# --
+trait ${1:name} extends ${2:class} {
+  $0
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/tr.ext-with b/packages/yasnippet/snippets/scala-mode/tr.ext-with
new file mode 100644 (file)
index 0000000..c971ebb
--- /dev/null
@@ -0,0 +1,7 @@
+# Author: Anders Bach Nielsen <andersbach.nielsen@epfl.ch>
+# name: trait T1 extends C with T2 { .. }
+# key: tr
+# --
+trait ${1:name} extends ${2:class} with ${3:trait} {
+  $0
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/tr.with b/packages/yasnippet/snippets/scala-mode/tr.with
new file mode 100644 (file)
index 0000000..732dfb3
--- /dev/null
@@ -0,0 +1,7 @@
+# Author: Anders Bach Nielsen <andersbach.nielsen@epfl.ch>
+# name: trait T1 with T2 { .. }
+# key: tr
+# --
+trait ${1:name} with ${2:trait} {
+  $0
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/try b/packages/yasnippet/snippets/scala-mode/try
new file mode 100644 (file)
index 0000000..0b65a6f
--- /dev/null
@@ -0,0 +1,10 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: try { .. } catch { case e => ..}
+# key: try
+# --
+try {
+  $0
+} catch {
+  case ${1:e}: ${2:Exception} => 
+    ${1:println(\"ERROR: \" + e) // TODO: handle exception}\n}
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/try.catch-finally b/packages/yasnippet/snippets/scala-mode/try.catch-finally
new file mode 100644 (file)
index 0000000..e431b98
--- /dev/null
@@ -0,0 +1,12 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: try { .. } catch { case e => ..} finally { ..}
+# key: try
+# --
+try {
+  $0
+} catch {
+  case ${1:e}: ${2:Exception} => 
+    ${1:println(\"ERROR: \" + e) // TODO: handle exception}\n}
+} finally {
+
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/try.finally b/packages/yasnippet/snippets/scala-mode/try.finally
new file mode 100644 (file)
index 0000000..6f8d88f
--- /dev/null
@@ -0,0 +1,9 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: try { .. } finally { .. }
+# key: try
+# --
+try {
+
+} finally {
+  $0
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/tup.arrow b/packages/yasnippet/snippets/scala-mode/tup.arrow
new file mode 100644 (file)
index 0000000..7b77907
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: element1 -> element2
+# key: tup
+# --
+${1:element1} -> ${2:element2} $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/tup.paren b/packages/yasnippet/snippets/scala-mode/tup.paren
new file mode 100644 (file)
index 0000000..ebe94a8
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: (element1, element2)
+# key: tup
+# --
+(${1:element1}, ${2:element2}) $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/val b/packages/yasnippet/snippets/scala-mode/val
new file mode 100644 (file)
index 0000000..b299add
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: val name = ..
+# key: val
+# --
+val ${1:name} = ${2:obj} $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/val.new b/packages/yasnippet/snippets/scala-mode/val.new
new file mode 100644 (file)
index 0000000..9bd2b7d
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: val name = new ..
+# key: val
+# --
+val ${1:name} = new ${2:obj} $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/val.ret b/packages/yasnippet/snippets/scala-mode/val.ret
new file mode 100644 (file)
index 0000000..4af1192
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: val name: T = ..
+# key: val
+# --
+val ${1:name}: ${2:T} = ${3:obj} $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/var b/packages/yasnippet/snippets/scala-mode/var
new file mode 100644 (file)
index 0000000..2c6158b
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: var name = ..
+# key: var
+# --
+var ${1:name} = ${2:obj} $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/var.new b/packages/yasnippet/snippets/scala-mode/var.new
new file mode 100644 (file)
index 0000000..5dff6bc
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: var name = new ..
+# key: var
+# --
+var ${1:name} = new ${2:obj} $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/var.ret b/packages/yasnippet/snippets/scala-mode/var.ret
new file mode 100644 (file)
index 0000000..60b3fdc
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: var name: T = ..
+# key: var
+# --
+var ${1:name}: ${2:T} = ${3:obj} $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/whi b/packages/yasnippet/snippets/scala-mode/whi
new file mode 100644 (file)
index 0000000..233cf1e
--- /dev/null
@@ -0,0 +1,7 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: while(cond) { .. }
+# key: whi
+# --
+while (${1:condition}) {
+  $0
+}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/scala-mode/with b/packages/yasnippet/snippets/scala-mode/with
new file mode 100644 (file)
index 0000000..aa924af
--- /dev/null
@@ -0,0 +1,5 @@
+# Author: Jonas Bonèr <jonas@jonasboner.com>
+# name: with T
+# key: with
+# --
+with $0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/snippet-mode/.yas-parents b/packages/yasnippet/snippets/snippet-mode/.yas-parents
new file mode 100644 (file)
index 0000000..eed5b44
--- /dev/null
@@ -0,0 +1 @@
+text-mode
diff --git a/packages/yasnippet/snippets/snippet-mode/field b/packages/yasnippet/snippets/snippet-mode/field
new file mode 100644 (file)
index 0000000..f969a00
--- /dev/null
@@ -0,0 +1,6 @@
+# name: ${ ...  } field
+# contributor: joaotavora
+# key: $f
+# key: field
+# --
+\${${1:${2:n}:}$3${4:\$(${5:lisp-fn})}\}$0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/snippet-mode/mirror b/packages/yasnippet/snippets/snippet-mode/mirror
new file mode 100644 (file)
index 0000000..2d43450
--- /dev/null
@@ -0,0 +1,6 @@
+# name: ${n:$(...)} mirror
+# key: $m
+# contributor: joaotavora
+# key: mirror
+# --
+\${${2:n}:${4:\$(${5:reflection-fn})}\}$0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/snippet-mode/vars b/packages/yasnippet/snippets/snippet-mode/vars
new file mode 100644 (file)
index 0000000..d617002
--- /dev/null
@@ -0,0 +1,12 @@
+# -*- mode: snippet -*-
+# name: Snippet header
+# contributor: joaotavora
+# key: vars
+# --
+# name: $1${2:
+# key: ${3:trigger-key}}${4:
+# keybinding: ${5:keybinding}}${6:
+# expand-env: (${7:})}
+# contributor: $6
+# --
+$0
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/sql-mode/.yas-parents b/packages/yasnippet/snippets/sql-mode/.yas-parents
new file mode 100644 (file)
index 0000000..eed5b44
--- /dev/null
@@ -0,0 +1 @@
+text-mode
diff --git a/packages/yasnippet/snippets/sql-mode/column b/packages/yasnippet/snippets/sql-mode/column
new file mode 100644 (file)
index 0000000..5817296
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Alejandro Espinoza Esparza <aespinoza@structum.com.mx>
+# name: , ColumnName ColumnType NOT NULL...
+# key: column
+# --
+       ,       ${1:Name}               ${2:Type}                       ${3:NOT NULL}
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/sql-mode/constraint b/packages/yasnippet/snippets/sql-mode/constraint
new file mode 100644 (file)
index 0000000..5bb1902
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Alejandro Espinoza Esparza <aespinoza@structum.com.mx>
+# name: CONSTRAINT [..] PRIMARY KEY ...
+# key: constraint
+# --
+CONSTRAINT [${1:PK_Name}] PRIMARY KEY ${2:CLUSTERED} ([${3:ColumnName}]) 
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/sql-mode/constraint.1 b/packages/yasnippet/snippets/sql-mode/constraint.1
new file mode 100644 (file)
index 0000000..245903f
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Alejandro Espinoza Esparza <aespinoza@structum.com.mx>
+# name: CONSTRAINT [..] FOREIGN KEY ...
+# key: constraint
+# --
+CONSTRAINT [${1:FK_Name}] FOREIGN KEY ${2:CLUSTERED} ([${3:ColumnName}]) 
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/sql-mode/create b/packages/yasnippet/snippets/sql-mode/create
new file mode 100644 (file)
index 0000000..1678ed2
--- /dev/null
@@ -0,0 +1,11 @@
+# contributor: Alejandro Espinoza Esparza <aespinoza@structum.com.mx>
+# name: create table ...
+# key: create
+# --
+CREATE TABLE [${1:dbo}].[${2:TableName}] 
+(
+               ${3:Id}         ${4:INT IDENTITY(1,1)}          ${5:NOT NULL}
+$0
+       CONSTRAINT [${6:PK_}] PRIMARY KEY ${7:CLUSTERED} ([$3]) 
+)
+GO
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/sql-mode/create.1 b/packages/yasnippet/snippets/sql-mode/create.1
new file mode 100644 (file)
index 0000000..10b30a4
--- /dev/null
@@ -0,0 +1,13 @@
+# contributor: Alejandro Espinoza Esparza <aespinoza@structum.com.mx>
+# name: create procedure ...
+# key: create
+# --
+CREATE PROCEDURE [${1:dbo}].[${2:Name}] 
+(
+               $3              $4              = ${5:NULL}             ${6:OUTPUT}
+)
+AS
+BEGIN
+$0
+END
+GO
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/sql-mode/references b/packages/yasnippet/snippets/sql-mode/references
new file mode 100644 (file)
index 0000000..ff6d12f
--- /dev/null
@@ -0,0 +1,5 @@
+# contributor: Alejandro Espinoza Esparza <aespinoza@structum.com.mx>
+# name: REFERENCES ...
+# key: references
+# --
+REFERENCES ${1:TableName}([${2:ColumnName}])
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/text-mode/email b/packages/yasnippet/snippets/text-mode/email
new file mode 100644 (file)
index 0000000..95fad03
--- /dev/null
@@ -0,0 +1,4 @@
+# name: (user's email)
+# key: email
+# --
+`(replace-regexp-in-string "@" "@NOSPAM." user-mail-address)`
\ No newline at end of file
diff --git a/packages/yasnippet/snippets/text-mode/time b/packages/yasnippet/snippets/text-mode/time
new file mode 100644 (file)
index 0000000..814ed5f
--- /dev/null
@@ -0,0 +1,4 @@
+# name: (current time)
+# key: time
+# --
+`(current-time-string)`
\ No newline at end of file
diff --git a/packages/yasnippet/yasnippet-pkg.el b/packages/yasnippet/yasnippet-pkg.el
new file mode 100644 (file)
index 0000000..dc387f6
--- /dev/null
@@ -0,0 +1,3 @@
+(define-package "yasnippet"
+                "0.8.0"
+                "A template system for Emacs")
diff --git a/packages/yasnippet/yasnippet.el b/packages/yasnippet/yasnippet.el
new file mode 100644 (file)
index 0000000..d932f5b
--- /dev/null
@@ -0,0 +1,4490 @@
+;;; yasnippet.el --- Yet another snippet extension for Emacs.
+
+;; Copyright (C) 2008-2012 Free Software Foundation, Inc.
+;; Authors: pluskid <pluskid@gmail.com>,  João Távora <joaotavora@gmail.com>
+;; Version: 0.8.0
+;; Package-version: 0.8.0
+;; X-URL: http://github.com/capitaomorte/yasnippet
+;; Keywords: convenience, emulation
+;; URL: http://github.com/capitaomorte/yasnippet
+;; EmacsWiki: YaSnippetMode
+
+;; 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 <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;
+;;   Basic steps to setup:
+;;
+;;    (add-to-list 'load-path
+;;                 "~/path-to-yasnippet")
+;;    (require 'yasnippet)
+;;    (yas-global-mode 1)
+;;
+;;
+;;   Interesting variables are:
+;;
+;;       `yas-snippet-dirs'
+;;
+;;           The directory where user-created snippets are to be
+;;           stored. Can also be a list of directories. In that case,
+;;           when used for bulk (re)loading of snippets (at startup or
+;;           via `yas-reload-all'), directories appearing earlier in
+;;           the list shadow other dir's snippets. Also, the first
+;;           directory is taken as the default for storing the user's
+;;           new snippets.
+;;
+;;           The deprecated `yas/root-directory' aliases this variable
+;;           for backward-compatibility.
+;;
+;;       `yas-extra-modes'
+;;
+;;           A local variable that you can set in a hook to override
+;;           snippet-lookup based on major mode. It is a a symbol (or
+;;           list of symbols) that correspond to subdirectories of
+;;           `yas-snippet-dirs' and is used for deciding which
+;;           snippets to consider for the active buffer.
+;;
+;;           Deprecated `yas/mode-symbol' aliases this variable for
+;;           backward-compatibility.
+;;
+;;   Major commands are:
+;;
+;;       M-x yas-expand
+;;
+;;           Try to expand snippets before point.  In `yas-minor-mode',
+;;           this is bound to `yas-trigger-key' which you can customize.
+;;
+;;       M-x yas-load-directory
+;;
+;;           Prompts you for a directory hierarchy of snippets to load.
+;;
+;;       M-x yas-insert-snippet
+;;
+;;           Prompts you for possible snippet expansion if that is
+;;           possible according to buffer-local and snippet-local
+;;           expansion conditions.  With prefix argument, ignore these
+;;           conditions.
+;;
+;;       M-x yas-visit-snippet-file
+;;
+;;           Prompts you for possible snippet expansions like
+;;           `yas-insert-snippet', but instead of expanding it, takes
+;;           you directly to the snippet definition's file, if it
+;;           exists.
+;;
+;;       M-x yas-new-snippet
+;;
+;;           Lets you create a new snippet file in the correct
+;;           subdirectory of `yas-snippet-dirs', according to the
+;;           active major mode.
+;;
+;;       M-x yas-load-snippet-buffer
+;;
+;;           When editing a snippet, this loads the snippet.  This is
+;;           bound to "C-c C-c" while in the `snippet-mode' editing
+;;           mode.
+;;
+;;       M-x yas-tryout-snippet
+;;
+;;           When editing a snippet, this opens a new empty buffer,
+;;           sets it to the appropriate major mode and inserts the
+;;           snippet there, so you can see what it looks like.  This is
+;;           bound to "C-c C-t" while in `snippet-mode'.
+;;
+;;       M-x yas-describe-tables
+;;
+;;           Lists known snippets in a separate buffer. User is
+;;           prompted as to whether only the currently active tables
+;;           are to be displayed, or all the tables for all major
+;;           modes.
+;;
+;;   The `dropdown-list.el' extension is bundled with YASnippet, you
+;;   can optionally use it the preferred "prompting method", puting in
+;;   your .emacs file, for example:
+;;
+;;       (require 'dropdown-list)
+;;       (setq yas-prompt-functions '(yas-dropdown-prompt
+;;                                    yas-ido-prompt
+;;                                    yas-completing-prompt))
+;;
+;;   Also check out the customization group
+;;
+;;        M-x customize-group RET yasnippet RET
+;;
+;;   If you use the customization group to set variables
+;;   `yas-snippet-dirs' or `yas-global-mode', make sure the path to
+;;   "yasnippet.el" is present in the `load-path' *before* the
+;;   `custom-set-variables' is executed in your .emacs file.
+;;
+;;   For more information and detailed usage, refer to the project page:
+;;      http://github.com/capitaomorte/yasnippet
+
+;;; Code:
+
+(require 'cl)
+(require 'easymenu)
+(require 'help-mode)
+
+\f
+;;; User customizable variables
+
+(defgroup yasnippet nil
+  "Yet Another Snippet extension"
+  :group 'editing)
+
+(defvar yas--load-file-name load-file-name
+  "Store the filename that yasnippet.el was originally loaded from.")
+
+(defcustom yas-snippet-dirs (remove nil
+                                    (list "~/.emacs.d/snippets"
+                                          (when yas--load-file-name
+                                            (concat (file-name-directory yas--load-file-name) "snippets"))))
+  "Directory or list of snippet dirs for each major mode.
+
+The directory where user-created snippets are to be stored. Can
+also be a list of directories. In that case, when used for
+bulk (re)loading of snippets (at startup or via
+`yas-reload-all'), directories appearing earlier in the list
+shadow other dir's snippets. Also, the first directory is taken
+as the default for storing the user's new snippets."
+  :type '(choice (string :tag "Single directory (string)")
+                 (repeat :args (string) :tag "List of directories (strings)"))
+  :group 'yasnippet
+  :require 'yasnippet
+  :set #'(lambda (symbol new)
+           (let ((old (and (boundp symbol)
+                           (symbol-value symbol))))
+             (set-default symbol new)
+             (unless (or (not (fboundp 'yas-reload-all))
+                         (equal old new))
+               (yas-reload-all)))))
+
+(defun yas-snippet-dirs ()
+  "Returns `yas-snippet-dirs' (which see) as a list."
+  (if (listp yas-snippet-dirs) yas-snippet-dirs (list yas-snippet-dirs)))
+
+(defvaralias 'yas/root-directory 'yas-snippet-dirs)
+
+(defcustom yas-prompt-functions '(yas-x-prompt
+                                  yas-dropdown-prompt
+                                  yas-completing-prompt
+                                  yas-ido-prompt
+                                  yas-no-prompt)
+  "Functions to prompt for keys, templates, etc interactively.
+
+These functions are called with the following arguments:
+
+- PROMPT: A string to prompt the user
+
+- CHOICES: a list of strings or objects.
+
+- optional DISPLAY-FN : A function that, when applied to each of
+the objects in CHOICES will return a string.
+
+The return value of any function you put here should be one of
+the objects in CHOICES, properly formatted with DISPLAY-FN (if
+that is passed).
+
+- To signal that your particular style of prompting is
+unavailable at the moment, you can also have the function return
+nil.
+
+- To signal that the user quit the prompting process, you can
+signal `quit' with
+
+  (signal 'quit \"user quit!\")."
+  :type '(repeat function)
+  :group 'yasnippet)
+
+(defcustom yas-indent-line 'auto
+  "Controls indenting applied to a recent snippet expansion.
+
+The following values are possible:
+
+- `fixed' Indent the snippet to the current column;
+
+- `auto' Indent each line of the snippet with `indent-according-to-mode'
+
+Every other value means don't apply any snippet-side indendation
+after expansion (the manual per-line \"$>\" indentation still
+applies)."
+  :type '(choice (const :tag "Nothing"  nothing)
+                 (const :tag "Fixed"    fixed)
+                 (const :tag "Auto"     auto))
+  :group 'yasnippet)
+
+(defcustom yas-also-auto-indent-first-line nil
+  "Non-nil means also auto indent first line according to mode.
+
+Naturally this is only valid when `yas-indent-line' is `auto'"
+  :type 'boolean
+  :group 'yasnippet)
+
+(defcustom yas-snippet-revival t
+  "Non-nil means re-activate snippet fields after undo/redo."
+  :type 'boolean
+  :group 'yasnippet)
+
+(defcustom yas-trigger-key "TAB"
+  "The key bound to `yas-expand' when function `yas-minor-mode' is active.
+
+Value is a string that is converted to the internal Emacs key
+representation using `read-kbd-macro'."
+  :type 'string
+  :group 'yasnippet
+  :set #'(lambda (symbol key)
+           (let ((old (and (boundp symbol)
+                           (symbol-value symbol))))
+             (set-default symbol key)
+             ;; On very first loading of this defcustom,
+             ;; `yas-trigger-key' is *not* loaded.
+             (if (fboundp 'yas--trigger-key-reload)
+                 (yas--trigger-key-reload old)))))
+
+(defcustom yas-next-field-key '("TAB" "<tab>")
+  "The key to navigate to next field when a snippet is active.
+
+Value is a string that is converted to the internal Emacs key
+representation using `read-kbd-macro'.
+
+Can also be a list of strings."
+  :type '(choice (string :tag "String")
+                 (repeat :args (string) :tag "List of strings"))
+  :group 'yasnippet
+  :set #'(lambda (symbol val)
+           (set-default symbol val)
+           (if (fboundp 'yas--init-yas-in-snippet-keymap)
+               (yas--init-yas-in-snippet-keymap))))
+
+
+(defcustom yas-prev-field-key '("<backtab>" "<S-tab>")
+  "The key to navigate to previous field when a snippet is active.
+
+Value is a string that is converted to the internal Emacs key
+representation using `read-kbd-macro'.
+
+Can also be a list of strings."
+  :type '(choice (string :tag "String")
+                 (repeat :args (string) :tag "List of strings"))
+  :group 'yasnippet
+  :set #'(lambda (symbol val)
+           (set-default symbol val)
+           (if (fboundp 'yas--init-yas-in-snippet-keymap)
+               (yas--init-yas-in-snippet-keymap))))
+
+(defcustom yas-skip-and-clear-key '("C-d" "<delete>" "<deletechar>")
+  "The key to clear the currently active field.
+
+Value is a string that is converted to the internal Emacs key
+representation using `read-kbd-macro'.
+
+Can also be a list of strings."
+  :type '(choice (string :tag "String")
+                 (repeat :args (string) :tag "List of strings"))
+  :group 'yasnippet
+  :set #'(lambda (symbol val)
+           (set-default symbol val)
+           (if (fboundp 'yas--init-yas-in-snippet-keymap)
+               (yas--init-yas-in-snippet-keymap))))
+
+(defcustom yas-triggers-in-field nil
+  "If non-nil, `yas-next-field-key' can trigger stacked expansions.
+
+Otherwise, `yas-next-field-key' just tries to move on to the next
+field"
+  :type 'boolean
+  :group 'yasnippet)
+
+(defcustom yas-fallback-behavior 'call-other-command
+  "How to act when `yas-trigger-key' does *not* expand a snippet.
+
+- `call-other-command' means try to temporarily disable YASnippet
+    and call the next command bound to `yas-trigger-key'.
+
+- nil or the symbol `return-nil' mean do nothing. (and
+  `yas-expand' returns nil)
+
+- A lisp form (apply COMMAND . ARGS) means interactively call
+  COMMAND, if ARGS is non-nil, call COMMAND non-interactively
+  with ARGS as arguments."
+  :type '(choice (const :tag "Call previous command"  call-other-command)
+                 (const :tag "Do nothing"             return-nil))
+  :group 'yasnippet)
+
+(defcustom yas-choose-keys-first nil
+  "If non-nil, prompt for snippet key first, then for template.
+
+Otherwise prompts for all possible snippet names.
+
+This affects `yas-insert-snippet' and `yas-visit-snippet-file'."
+  :type 'boolean
+  :group 'yasnippet)
+
+(defcustom yas-choose-tables-first nil
+  "If non-nil, and multiple eligible snippet tables, prompts user for tables first.
+
+Otherwise, user chooses between the merging together of all
+eligible tables.
+
+This affects `yas-insert-snippet', `yas-visit-snippet-file'"
+  :type 'boolean
+  :group 'yasnippet)
+
+(defcustom yas-use-menu 'abbreviate
+  "Display a YASnippet menu in the menu bar.
+
+When non-nil, submenus for each snippet table will be listed
+under the menu \"Yasnippet\".
+
+- If set to `abbreviate', only the current major-mode
+menu and the modes set in `yas-extra-modes' are listed.
+
+- If set to `full', every submenu is listed
+
+- It set to nil, don't display a menu at all (this requires a
+  `yas-reload-all' call if the menu is already visible).
+
+Any other non-nil value, every submenu is listed."
+  :type '(choice (const :tag "Full"  full)
+                 (const :tag "Abbreviate" abbreviate)
+                 (const :tag "No menu" nil))
+  :group 'yasnippet)
+
+(defcustom yas-trigger-symbol (if (eq window-system 'mac)
+                                  (char-to-string ?\x21E5) ;; little ->| sign
+                                  " =>")
+  "The text that will be used in menu to represent the trigger."
+  :type 'string
+  :group 'yasnippet)
+
+(defcustom yas-wrap-around-region nil
+  "If non-nil, snippet expansion wraps around selected region.
+
+The wrapping occurs just before the snippet's exit marker.  This
+can be overriden on a per-snippet basis."
+  :type 'boolean
+  :group 'yasnippet)
+
+(defcustom yas-good-grace t
+  "If non-nil, don't raise errors in inline elisp evaluation.
+
+An error string \"[yas] error\" is returned instead."
+  :type 'boolean
+  :group 'yasnippet)
+
+(defcustom yas-visit-from-menu nil
+  "If non-nil visit snippets's files from menu, instead of expanding them.
+
+This cafn only work when snippets are loaded from files."
+  :type 'boolean
+  :group 'yasnippet)
+
+(defcustom yas-expand-only-for-last-commands nil
+  "List of `last-command' values to restrict tab-triggering to, or nil.
+
+Leave this set at nil (the default) to be able to trigger an
+expansion simply by placing the cursor after a valid tab trigger,
+using whichever commands.
+
+Optionallly, set this to something like '(self-insert-command) if
+you to wish restrict expansion to only happen when the last
+letter of the snippet tab trigger was typed immediately before
+the trigger key itself."
+  :type '(repeat function)
+  :group 'yasnippet)
+
+;; Only two faces, and one of them shouldn't even be used...
+;;
+(defface yas-field-highlight-face
+  '((t (:inherit 'region)))
+  "The face used to highlight the currently active field of a snippet"
+  :group 'yasnippet)
+
+(defface yas--field-debug-face
+  '()
+  "The face used for debugging some overlays normally hidden"
+  :group 'yasnippet)
+
+\f
+;;; User can also customize the next defvars
+
+(defun yas--define-some-keys (keys keymap definition)
+  "Bind KEYS to DEFINITION in KEYMAP, read with `read-kbd-macro'."
+  (let ((keys (or (and (listp keys) keys)
+                  (list keys))))
+    (dolist (key keys)
+      (define-key keymap (read-kbd-macro key) definition))))
+
+(defvar yas-keymap
+  (let ((map (make-sparse-keymap)))
+    (mapc #'(lambda (binding)
+              (yas--define-some-keys (car binding) map (cdr binding)))
+          `((,yas-next-field-key     . yas-next-field-or-maybe-expand)
+            (,yas-prev-field-key     . yas-prev-field)
+            ("C-g"                   . yas-abort-snippet)
+            (,yas-skip-and-clear-key . yas-skip-and-clear-or-delete-char)))
+    map)
+  "The keymap active while a snippet expansion is in progress.")
+
+(defvar yas-key-syntaxes (list "w" "w_" "w_." "w_.()" "^ ")
+  "List of character syntaxes used to find a trigger key before point.
+The list is tried in the order while scanning characters
+backwards from point. For example, if the list is '(\"w\" \"w_\")
+first look for trigger keys which are composed exclusively of
+\"word\"-syntax characters, and then, if that fails, look for
+keys which are either of \"word\" or \"symbol\"
+syntax. Triggering after
+
+foo-bar
+
+will, according to the \"w\" element first try \"bar\". If that
+isn't a trigger key, \"foo-bar\" is tried, respecting a second
+\"w_\" element.")
+
+(defvar yas-after-exit-snippet-hook
+  '()
+  "Hooks to run after a snippet exited.
+
+The hooks will be run in an environment where some variables bound to
+proper values:
+
+`yas-snippet-beg' : The beginning of the region of the snippet.
+
+`yas-snippet-end' : Similar to beg.
+
+Attention: These hooks are not run when exiting nested/stackd snippet expansion!")
+
+(defvar yas-before-expand-snippet-hook
+  '()
+  "Hooks to run just before expanding a snippet.")
+
+(defvar yas-buffer-local-condition
+  '(if (and (or (fourth (syntax-ppss))
+                (fifth (syntax-ppss)))
+            (eq (symbol-function this-command) 'yas-expand-from-trigger-key))
+       '(require-snippet-condition . force-in-comment)
+     t)
+  "Snippet expanding condition.
+
+This variable is a lisp form which is evaluated everytime a
+snippet expansion is attemped:
+
+    * If it evaluates to nil, no snippets can be expanded.
+
+    * If it evaluates to the a cons (require-snippet-condition
+      . REQUIREMENT)
+
+       * Snippets bearing no \"# condition:\" directive are not
+         considered
+
+       * Snippets bearing conditions that evaluate to nil (or
+         produce an error) won't be onsidered.
+
+       * If the snippet has a condition that evaluates to non-nil
+         RESULT:
+
+          * If REQUIREMENT is t, the snippet is considered
+
+          * If REQUIREMENT is `eq' RESULT, the snippet is
+            considered
+
+          * Otherwise, the snippet is not considered.
+
+    * If it evaluates to the symbol 'always, all snippets are
+      considered for expansion, regardless of any conditions.
+
+    * If it evaluates to t or some other non-nil value
+
+       * Snippet bearing no conditions, or conditions that
+         evaluate to non-nil, are considered for expansion.
+
+       * Otherwise, the snippet is not considered.
+
+Here's an example preventing snippets from being expanded from
+inside comments, in `python-mode' only, with the exception of
+snippets returning the symbol 'force-in-comment in their
+conditions.
+
+ (add-hook 'python-mode-hook
+           '(lambda ()
+              (setq yas-buffer-local-condition
+                    '(if (python-in-string/comment)
+                         '(require-snippet-condition . force-in-comment)
+                       t))))
+
+The default value is similar, it filters out potential snippet
+expansions inside comments and string literals, unless the
+snippet itself contains a condition that returns the symbol
+`force-in-comment'.")
+
+\f
+;;; Internal variables
+
+(defvar yas--version "0.8.0 (beta)")
+
+(defvar yas--menu-table (make-hash-table)
+  "A hash table of MAJOR-MODE symbols to menu keymaps.")
+
+(defvar yas--known-modes
+  '(ruby-mode rst-mode markdown-mode)
+  "A list of mode which is well known but not part of emacs.")
+
+(defvar yas--escaped-characters
+  '(?\\ ?` ?\" ?' ?$ ?} ?{ ?\( ?\))
+  "List of characters which *might* need to be escaped.")
+
+(defconst yas--field-regexp
+  "${\\([0-9]+:\\)?\\([^}]*\\)}"
+  "A regexp to *almost* recognize a field.")
+
+(defconst yas--multi-dollar-lisp-expression-regexp
+  "$+[ \t\n]*\\(([^)]*)\\)"
+  "A regexp to *almost* recognize a \"$(...)\" expression.")
+
+(defconst yas--backquote-lisp-expression-regexp
+  "`\\([^`]*\\)`"
+  "A regexp to recognize a \"`lisp-expression`\" expression." )
+
+(defconst yas--transform-mirror-regexp
+  "${\\(?:\\([0-9]+\\):\\)?$\\([ \t\n]*([^}]*\\)"
+  "A regexp to *almost* recognize a mirror with a transform.")
+
+(defconst yas--simple-mirror-regexp
+  "$\\([0-9]+\\)"
+  "A regexp to recognize a simple mirror.")
+
+(defvar yas--snippet-id-seed 0
+  "Contains the next id for a snippet.")
+
+(defun yas--snippet-next-id ()
+  (let ((id yas--snippet-id-seed))
+    (incf yas--snippet-id-seed)
+    id))
+
+\f
+;;; Minor mode stuff
+
+;; XXX: `last-buffer-undo-list' is somehow needed in Carbon Emacs for MacOSX
+(defvar last-buffer-undo-list nil)
+
+(defvar yas--minor-mode-menu nil
+  "Holds the YASnippet menu")
+
+(defun yas--init-minor-keymap ()
+  (let ((map (make-sparse-keymap)))
+    (when yas-use-menu
+      (easy-menu-define yas--minor-mode-menu
+      map
+      "Menu used when `yas-minor-mode' is active."
+      '("YASnippet"
+        "----"
+        ["Expand trigger" yas-expand
+         :help "Possibly expand tab trigger before point"]
+        ["Insert at point..." yas-insert-snippet
+         :help "Prompt for an expandable snippet and expand it at point"]
+        ["New snippet..." yas-new-snippet
+         :help "Create a new snippet in an appropriate directory"]
+        ["Visit snippet file..." yas-visit-snippet-file
+         :help "Prompt for an expandable snippet and find its file"]
+        "----"
+        ("Snippet menu behaviour"
+         ["Visit snippets" (setq yas-visit-from-menu t)
+          :help "Visit snippets from the menu"
+          :active t :style radio   :selected yas-visit-from-menu]
+         ["Expand snippets" (setq yas-visit-from-menu nil)
+          :help "Expand snippets from the menu"
+          :active t :style radio :selected (not yas-visit-from-menu)]
+         "----"
+         ["Show all known modes" (setq yas-use-menu 'full)
+          :help "Show one snippet submenu for each loaded table"
+          :active t :style radio   :selected (eq yas-use-menu 'full)]
+         ["Abbreviate according to current mode" (setq yas-use-menu 'abbreviate)
+          :help "Show only snippet submenus for the current active modes"
+          :active t :style radio   :selected (eq yas-use-menu 'abbreviate)])
+        ("Indenting"
+         ["Auto" (setq yas-indent-line 'auto)
+          :help "Indent each line of the snippet with `indent-according-to-mode'"
+          :active t :style radio   :selected (eq yas-indent-line 'auto)]
+         ["Fixed" (setq yas-indent-line 'fixed)
+          :help "Indent the snippet to the current column"
+          :active t :style radio   :selected (eq yas-indent-line 'fixed)]
+         ["None" (setq yas-indent-line 'none)
+          :help "Don't apply any particular snippet indentation after expansion"
+          :active t :style radio   :selected (not (member yas-indent-line '(fixed auto)))]
+         "----"
+         ["Also auto indent first line" (setq yas-also-auto-indent-first-line
+                                              (not yas-also-auto-indent-first-line))
+          :help "When auto-indenting also, auto indent the first line menu"
+          :active (eq yas-indent-line 'auto)
+          :style toggle :selected yas-also-auto-indent-first-line]
+         )
+        ("Prompting method"
+         ["System X-widget" (setq yas-prompt-functions
+                                  (cons 'yas-x-prompt
+                                        (remove 'yas-x-prompt
+                                                yas-prompt-functions)))
+          :help "Use your windowing system's (gtk, mac, windows, etc...) default menu"
+          :active t :style radio   :selected (eq (car yas-prompt-functions)
+                                                 'yas-x-prompt)]
+         ["Dropdown-list" (setq yas-prompt-functions
+                                (cons 'yas-dropdown-prompt
+                                      (remove 'yas-dropdown-prompt
+                                              yas-prompt-functions)))
+          :help "Use a special dropdown list"
+          :active t :style radio   :selected (eq (car yas-prompt-functions)
+                                                 'yas-dropdown-prompt)]
+         ["Ido" (setq yas-prompt-functions
+                      (cons 'yas-ido-prompt
+                            (remove 'yas-ido-prompt
+                                    yas-prompt-functions)))
+          :help "Use an ido-style minibuffer prompt"
+          :active t :style radio   :selected (eq (car yas-prompt-functions)
+                                                 'yas-ido-prompt)]
+         ["Completing read" (setq yas-prompt-functions
+                                  (cons 'yas-completing-prompt
+                                        (remove 'yas-completing-prompt
+                                                yas-prompt-functions)))
+          :help "Use a normal minibuffer prompt"
+          :active t :style radio   :selected (eq (car yas-prompt-functions)
+                                                 'yas-completing-prompt)]
+         )
+        ("Misc"
+         ["Wrap region in exit marker"
+          (setq yas-wrap-around-region
+                (not yas-wrap-around-region))
+          :help "If non-nil automatically wrap the selected text in the $0 snippet exit"
+          :style toggle :selected yas-wrap-around-region]
+         ["Allow stacked expansions "
+          (setq yas-triggers-in-field
+                (not yas-triggers-in-field))
+          :help "If non-nil allow snippets to be triggered inside other snippet fields"
+          :style toggle :selected yas-triggers-in-field]
+         ["Revive snippets on undo "
+          (setq yas-snippet-revival
+                (not yas-snippet-revival))
+          :help "If non-nil allow snippets to become active again after undo"
+          :style toggle :selected yas-snippet-revival]
+         ["Good grace "
+          (setq yas-good-grace
+                (not yas-good-grace))
+          :help "If non-nil don't raise errors in bad embedded eslip in snippets"
+          :style toggle :selected yas-good-grace]
+         )
+        "----"
+        ["Load snippets..."  yas-load-directory
+         :help "Load snippets from a specific directory"]
+        ["Reload everything" yas-reload-all
+         :help "Cleanup stuff, reload snippets, rebuild menus"]
+        ["About"            yas-about
+         :help "Display some information about YASsnippet"])))
+
+    ;; Now for the stuff that has direct keybindings
+    ;;
+    (define-key map "\C-c&\C-s" 'yas-insert-snippet)
+    (define-key map "\C-c&\C-n" 'yas-new-snippet)
+    (define-key map "\C-c&\C-v" 'yas-visit-snippet-file)
+    map))
+
+(defvar yas-minor-mode-map (yas--init-minor-keymap)
+  "The keymap used when `yas-minor-mode' is active.")
+
+(defun yas--trigger-key-reload (&optional unbind-key)
+  "Rebind `yas-expand' to the new value of `yas-trigger-key'.
+
+With optional UNBIND-KEY, try to unbind that key from
+`yas-minor-mode-map'."
+  (when (and unbind-key
+             (stringp unbind-key)
+             (not (string= unbind-key "")))
+    (define-key yas-minor-mode-map (read-kbd-macro unbind-key) nil))
+  (when  (and yas-trigger-key
+              (stringp yas-trigger-key)
+              (not (string= yas-trigger-key "")))
+    (define-key yas-minor-mode-map (read-kbd-macro yas-trigger-key) 'yas-expand)))
+
+(defvar yas--tables (make-hash-table)
+  "A hash table of mode symbols to `yas--table' objects.")
+
+(defvar yas--parents (make-hash-table)
+  "A hash table of mode symbols do lists of direct parent mode symbols.
+
+This list is populated when reading the \".yas-parents\" files
+found when traversing snippet directories with
+`yas-load-directory'.
+
+There might be additionalal parenting information stored in the
+`derived-mode-parent' property of some mode symbols, but that is
+not recorded here.")
+
+(defvar yas--direct-keymaps (list)
+  "Keymap alist supporting direct snippet keybindings.
+
+This variable is is placed in `emulation-mode-map-alists'.
+
+Its elements looks like (TABLE-NAME . KEYMAP). They're
+instantiated on `yas-reload-all' but KEYMAP is added to only when
+loading snippets. `yas--direct-TABLE-NAME' is then a variable set
+buffer-locally when entering `yas-minor-mode'. KEYMAP binds all
+defined direct keybindings to the command
+`yas-expand-from-keymap' which then which snippet to expand.")
+
+(defun yas-direct-keymaps-reload ()
+  "Force reload the direct keybinding for active snippet tables."
+  (interactive)
+  (setq yas--direct-keymaps nil)
+  (maphash #'(lambda (name table)
+               (push (cons (intern (format "yas--direct-%s" name))
+                           (yas--table-direct-keymap table))
+                     yas--direct-keymaps))
+           yas--tables))
+
+(defun yas--modes-to-activate ()
+  "Compute list of mode symbols that are active for `yas-expand'
+and friends."
+  (let ((modes-to-activate (list major-mode))
+        (mode major-mode))
+    (while (setq mode (get mode 'derived-mode-parent))
+      (push mode modes-to-activate))
+    (dolist (mode (yas-extra-modes))
+      (push mode modes-to-activate))
+    (remove-duplicates
+     (append modes-to-activate
+             (mapcan #'(lambda (mode)
+                         (yas--all-parents mode))
+                     modes-to-activate)))))
+
+(defvar yas-minor-mode-hook nil
+  "Hook run when yas-minor-mode is turned on")
+
+;;;###autoload
+(define-minor-mode yas-minor-mode
+  "Toggle YASnippet mode.
+
+When YASnippet mode is enabled, the `yas-trigger-key' key expands
+snippets of code depending on the major mode.
+
+With no argument, this command toggles the mode.
+positive prefix argument turns on the mode.
+Negative prefix argument turns off the mode.
+
+You can customize the key through `yas-trigger-key'.
+
+Key bindings:
+\\{yas-minor-mode-map}"
+  nil
+  ;; The indicator for the mode line.
+  " yas"
+  :group 'yasnippet
+  (cond (yas-minor-mode
+         ;; Reload the trigger key
+         ;;
+         (yas--trigger-key-reload)
+         ;; Install the direct keymaps in `emulation-mode-map-alists'
+         ;; (we use `add-hook' even though it's not technically a hook,
+         ;; but it works). Then define variables named after modes to
+         ;; index `yas--direct-keymaps'.
+         ;;
+         ;; Also install the post-command-hook.
+         ;;
+         (add-hook 'emulation-mode-map-alists 'yas--direct-keymaps)
+         (add-hook 'post-command-hook 'yas--post-command-handler nil t)
+         ;; Set the `yas--direct-%s' vars for direct keymap expansion
+         ;;
+         (dolist (mode (yas--modes-to-activate))
+           (let ((name (intern (format "yas--direct-%s" mode))))
+             (set-default name nil)
+             (set (make-local-variable name) t)))
+         ;; Perform JIT loads
+         ;;
+         (yas--load-pending-jits))
+        (t
+         ;; Uninstall the direct keymaps and the post-command hook
+         ;;
+         (remove-hook 'post-command-hook 'yas--post-command-handler t)
+         (remove-hook 'emulation-mode-map-alists 'yas--direct-keymaps))))
+
+(defvar yas--dont-activate '(minibufferp)
+  "If non-nil don't let `yas-minor-mode-on' active yas for this buffer.
+
+If a function, then its result is used.
+
+If a list of functions, then all functions must return nil to
+activate yas for this buffer.
+
+`yas-minor-mode-on' is usually called by `yas-global-mode' so
+this effectively lets you define exceptions to the \"global\"
+behaviour. Can also be a function of zero arguments.")
+(make-variable-buffer-local 'yas--dont-activate)
+
+(defun yas-minor-mode-on ()
+  "Turn on YASnippet minor mode.
+
+Do this unless `yas--dont-activate' is truish "
+  (interactive)
+  (unless (cond ((functionp yas--dont-activate)
+                 (funcall yas--dont-activate))
+                ((consp yas--dont-activate)
+                 (some #'funcall yas--dont-activate))
+                (yas--dont-activate))
+    ;; Load all snippets definitions unless we still don't have a
+    ;; root-directory or some snippets have already been loaded.
+    ;;
+    (yas-minor-mode 1)))
+
+;;;###autoload
+(define-globalized-minor-mode yas-global-mode yas-minor-mode yas-minor-mode-on
+  :group 'yasnippet
+  :require 'yasnippet)
+
+(defadvice yas-global-mode (before yas--reload-with-jit (arg) activate)
+  (cond ((and arg
+              (numberp arg)
+              (> arg 1))
+         ;; explicitly enabling
+         (yas-reload-all))
+        ((not yas-global-mode)
+         ;; toggling
+         (yas-reload-all))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Major mode stuff
+;;
+(defvar yas--font-lock-keywords
+  (append '(("^#.*$" . font-lock-comment-face))
+          lisp-font-lock-keywords
+          lisp-font-lock-keywords-1
+          lisp-font-lock-keywords-2
+          '(("$\\([0-9]+\\)"
+             (0 font-lock-keyword-face)
+             (1 font-lock-string-face t))
+            ("${\\([0-9]+\\):?"
+             (0 font-lock-keyword-face)
+             (1 font-lock-warning-face t))
+            ("${" font-lock-keyword-face)
+            ("$[0-9]+?" font-lock-preprocessor-face)
+            ("\\(\\$(\\)" 1 font-lock-preprocessor-face)
+            ("}"
+             (0 font-lock-keyword-face)))))
+
+(defun yas--init-major-keymap ()
+  (let ((map (make-sparse-keymap)))
+    (easy-menu-define nil
+      map
+      "Menu used when snippet-mode is active."
+      (cons "Snippet"
+            (mapcar #'(lambda (ent)
+                        (when (third ent)
+                          (define-key map (third ent) (second ent)))
+                        (vector (first ent) (second ent) t))
+                    (list
+                     (list "Load this snippet" 'yas-load-snippet-buffer "\C-c\C-c")
+                     (list "Try out this snippet" 'yas-tryout-snippet "\C-c\C-t")))))
+    map))
+
+(defvar snippet-mode-map
+  (yas--init-major-keymap)
+  "The keymap used when `snippet-mode' is active")
+
+
+(define-derived-mode snippet-mode text-mode "Snippet"
+  "A mode for editing yasnippets"
+  (setq font-lock-defaults '(yas--font-lock-keywords))
+  (set (make-local-variable 'require-final-newline) nil)
+  (set (make-local-variable 'comment-start) "#")
+  (set (make-local-variable 'comment-start-skip) "#+[\t ]*"))
+
+
+\f
+;;; Internal structs for template management
+
+(defstruct (yas--template (:constructor yas--make-blank-template))
+  "A template for a snippet."
+  key
+  content
+  name
+  condition
+  expand-env
+  file
+  keybinding
+  uuid
+  menu-binding-pair
+  group      ;; as dictated by the #group: directive or .yas-make-groups
+  perm-group ;; as dictated by `yas-define-menu'
+  table
+  )
+
+(defun yas--populate-template (template &rest args)
+  "Helper function to populate a template with properties"
+  (let (p v)
+    (while args
+      (aset template
+            (position (intern (substring (symbol-name (car args)) 1))
+                      (mapcar #'car (get 'yas--template 'cl-struct-slots)))
+            (second args))
+      (setq args (cddr args)))
+    template))
+
+(defstruct (yas--table (:constructor yas--make-snippet-table (name)))
+  "A table to store snippets for a particular mode.
+
+Has the following fields:
+
+`yas--table-name'
+
+  A symbol name normally corresponding to a major mode, but can
+  also be a pseudo major-mode to be referenced in
+  `yas-extra-modes', for example.
+
+`yas--table-hash'
+
+  A hash table (KEY . NAMEHASH), known as the \"keyhash\". KEY is
+  a string or a vector, where the former is the snippet's trigger
+  and the latter means it's a direct keybinding. NAMEHASH is yet
+  another hash of (NAME . TEMPLATE) where NAME is the snippet's
+  name and TEMPLATE is a `yas--template' object.
+
+`yas--table-direct-keymap'
+
+  A keymap for the snippets in this table that have direct
+  keybindings. This is kept in sync with the keyhash, i.e., all
+  the elements of the keyhash that are vectors appear here as
+  bindings to `yas-expand-from-keymap'.
+
+`yas--table-uuidhash'
+
+  A hash table mapping snippets uuid's to the same `yas--template'
+  objects. A snippet uuid defaults to the snippet's name.
+"
+  name
+  (hash (make-hash-table :test 'equal))
+  (uuidhash (make-hash-table :test 'equal))
+  (parents nil)
+  (direct-keymap (make-sparse-keymap)))
+
+(defun yas--get-template-by-uuid (mode uuid)
+  "Find the snippet template in MODE by its UUID."
+  (let* ((table (gethash mode yas--tables mode)))
+    (when table
+      (gethash uuid (yas--table-uuidhash table)))))
+
+;; Apropos storing/updating in TABLE, this works in two steps:
+;;
+;; 1. `yas--remove-template-by-uuid' removes any
+;;    keyhash-namehash-template mappings from TABLE, grabing the
+;;    snippet by its uuid. Also removes mappings from TABLE's
+;;    `yas--table-direct-keymap' (FIXME: and should probably take care
+;;    of potentially stale menu bindings right?.)
+;;
+;; 2. `yas--add-template' adds this all over again.
+;;
+;;    Create a new or add to an existing keyhash-namehash mapping.
+;;
+;;  For reference on understanding this, consider three snippet
+;;  definitions:
+;;
+;;  A:   # name: The Foo
+;;       # key: foo
+;;       # binding: C-c M-l
+;;
+;;  B:   # name: Mrs Foo
+;;       # key: foo
+;;
+;;  C:   # name: The Bar
+;;       # binding: C-c M-l
+;;
+;;  D:   # name: Baz
+;;       # key: baz
+;;
+;;  keyhash       namehashes(3)      yas--template structs(4)
+;;  -----------------------------------------------------
+;;                                            __________
+;;                                           /          \
+;;  "foo"      --->  "The Foo" --->  [yas--template A]   |
+;;                   "Mrs Foo" --->  [yas--template B]   |
+;;                                                      |
+;;  [C-c M-l]  --->  "The Foo" -------------------------/
+;;                   "The Bar" --->  [yas--template C]
+;;
+;;  "baz"      --->  "Baz"     --->  [yas--template D]
+;;
+;; Additionally, since uuid defaults to the name, we have a
+;; `yas--table-uuidhash' for TABLE
+;;
+;; uuidhash       yas--template structs
+;; -------------------------------
+;; "The Foo" ---> [yas--template A]
+;; "Mrs Foo" ---> [yas--template B]
+;; "The Bar" ---> [yas--template C]
+;; "Baz"     ---> [yas--template D]
+;;
+;; FIXME: the more I look at this data-structure the more I think I'm
+;; stupid. There has to be an easier way (but beware lots of code
+;; depends on this).
+;;
+(defun yas--remove-template-by-uuid (table uuid)
+  "Remove from TABLE a template identified by UUID."
+  (let ((template (gethash uuid (yas--table-uuidhash table))))
+    (when template
+      (let* ((name                (yas--template-name template))
+             (empty-keys          nil))
+        ;; Remove the name from each of the targeted namehashes
+        ;;
+        (maphash #'(lambda (k v)
+                     (let ((template (gethash name v)))
+                       (when (and template
+                                  (eq uuid (yas--template-uuid template)))
+                         (remhash name v)
+                         (when (zerop (hash-table-count v))
+                           (push k empty-keys)))))
+                 (yas--table-hash table))
+        ;; Remove the namehash themselves if they've become empty
+        ;;
+        (dolist (key empty-keys)
+          (when (vectorp key)
+            (define-key (yas--table-direct-keymap table) key nil))
+          (remhash key (yas--table-hash table)))
+
+        ;; Finally, remove the uuid from the uuidhash
+        ;;
+        (remhash uuid (yas--table-uuidhash table))))))
+
+(defun yas--add-template (table template)
+  "Store in TABLE the snippet template TEMPLATE.
+
+KEY can be a string (trigger key) of a vector (direct
+keybinding)."
+  (let ((name (yas--template-name template))
+        (key (yas--template-key template))
+        (keybinding (yas--template-keybinding template))
+        (menu-binding-pair (yas--template-menu-binding-pair-get-create template)))
+    (dolist (k (remove nil (list key keybinding)))
+      (puthash name
+               template
+               (or (gethash k
+                            (yas--table-hash table))
+                   (puthash k
+                            (make-hash-table :test 'equal)
+                            (yas--table-hash table))))
+      (when (vectorp k)
+        (define-key (yas--table-direct-keymap table) k 'yas-expand-from-keymap)))
+
+    ;; Update TABLE's `yas--table-uuidhash'
+    (puthash (yas--template-uuid template)
+             template
+             (yas--table-uuidhash table))))
+
+(defun yas--update-template (table template)
+  "Add or update TEMPLATE in TABLE.
+
+Also takes care of adding and updating to the associated menu."
+  ;; Remove from table by uuid
+  ;;
+  (yas--remove-template-by-uuid table (yas--template-uuid template))
+  ;; Add to table again
+  ;;
+  (yas--add-template table template)
+  ;; Take care of the menu
+  ;;
+  (when yas-use-menu
+    (yas--update-template-menu table template)))
+
+(defun yas--update-template-menu (table template)
+  "Update every menu-related for TEMPLATE"
+  (let ((menu-binding-pair (yas--template-menu-binding-pair-get-create template))
+        (key (yas--template-key template))
+        (keybinding (yas--template-keybinding template)))
+    ;; The snippet might have changed name or keys, so update
+    ;; user-visible strings
+    ;;
+    (unless (eq (cdr menu-binding-pair) :none)
+      ;; the menu item name
+      ;;
+      (setf (cadar menu-binding-pair) (yas--template-name template))
+      ;; the :keys information (also visible to the user)
+      (setf (getf (cdr (car menu-binding-pair)) :keys)
+            (or (and keybinding (key-description keybinding))
+                (and key (concat key yas-trigger-symbol))))))
+  (unless (yas--template-menu-managed-by-yas-define-menu template)
+    (let ((menu-keymap
+           (yas--menu-keymap-get-create (yas--table-mode table)
+                                        (mapcar #'yas--table-mode
+                                                (yas--table-parents table))))
+          (group (yas--template-group template)))
+      ;; Remove from menu keymap
+      ;;
+      (assert menu-keymap)
+      (yas--delete-from-keymap menu-keymap (yas--template-uuid template))
+
+      ;; Add necessary subgroups as necessary.
+      ;;
+      (dolist (subgroup group)
+        (let ((subgroup-keymap (lookup-key menu-keymap (vector (make-symbol subgroup)))))
+          (unless (and subgroup-keymap
+                       (keymapp subgroup-keymap))
+            (setq subgroup-keymap (make-sparse-keymap))
+            (define-key menu-keymap (vector (make-symbol subgroup))
+              `(menu-item ,subgroup ,subgroup-keymap)))
+          (setq menu-keymap subgroup-keymap)))
+
+      ;; Add this entry to the keymap
+      ;;
+      (define-key menu-keymap
+        (vector (make-symbol (yas--template-uuid template)))
+        (car (yas--template-menu-binding-pair template))))))
+
+(defun yas--namehash-templates-alist (namehash)
+  (let (alist)
+    (maphash #'(lambda (k v)
+                 (push (cons k v) alist))
+             namehash)
+    alist))
+
+(defun yas--fetch (table key)
+  "Fetch templates in TABLE by KEY.
+
+Return a list of cons (NAME . TEMPLATE) where NAME is a
+string and TEMPLATE is a `yas--template' structure."
+  (let* ((keyhash (yas--table-hash table))
+         (namehash (and keyhash (gethash key keyhash))))
+    (when namehash
+      (yas--filter-templates-by-condition (yas--namehash-templates-alist namehash)))))
+
+\f
+;;; Filtering/condition logic
+
+(defun yas--eval-condition (condition)
+  (condition-case err
+      (save-excursion
+        (save-restriction
+          (save-match-data
+            (eval condition))))
+    (error (progn
+             (yas--message 1 "Error in condition evaluation: %s" (error-message-string err))
+             nil))))
+
+
+(defun yas--filter-templates-by-condition (templates)
+  "Filter the templates using the applicable condition.
+
+TEMPLATES is a list of cons (NAME . TEMPLATE) where NAME is a
+string and TEMPLATE is a `yas--template' structure.
+
+This function implements the rules described in
+`yas-buffer-local-condition'.  See that variables documentation."
+  (let ((requirement (yas--require-template-specific-condition-p)))
+    (if (eq requirement 'always)
+        templates
+      (remove-if-not #'(lambda (pair)
+                         (yas--template-can-expand-p
+                          (yas--template-condition (cdr pair)) requirement))
+                     templates))))
+
+(defun yas--require-template-specific-condition-p ()
+  "Decides if this buffer requests/requires snippet-specific
+conditions to filter out potential expansions."
+  (if (eq 'always yas-buffer-local-condition)
+      'always
+    (let ((local-condition (or (and (consp yas-buffer-local-condition)
+                                    (yas--eval-condition yas-buffer-local-condition))
+                               yas-buffer-local-condition)))
+      (when local-condition
+        (if (eq local-condition t)
+            t
+          (and (consp local-condition)
+               (eq 'require-snippet-condition (car local-condition))
+               (symbolp (cdr local-condition))
+               (cdr local-condition)))))))
+
+(defun yas--template-can-expand-p (condition requirement)
+  "Evaluates CONDITION and REQUIREMENT and returns a boolean"
+  (let* ((result (or (null condition)
+                     (yas--eval-condition condition))))
+    (cond ((eq requirement t)
+           result)
+          (t
+           (eq requirement result)))))
+
+(defun yas--all-parents (mode)
+  "Returns a list of all parent modes of MODE"
+  (let ((parents (gethash mode yas--parents)))
+    (append parents
+            (mapcan #'yas--all-parents parents))))
+
+(defun yas--table-templates (table)
+  (when table
+    (let ((acc (list)))
+      (maphash #'(lambda (key namehash)
+                   (maphash #'(lambda (name template)
+                                (push (cons name template) acc))
+                            namehash))
+               (yas--table-hash table))
+      (yas--filter-templates-by-condition acc))))
+
+(defun yas--current-key ()
+  "Get the key under current position. A key is used to find
+the template of a snippet in the current snippet-table."
+  (let ((start (point))
+        (end (point))
+        (syntaxes yas-key-syntaxes)
+        syntax
+        done
+        templates)
+    (while (and (not done) syntaxes)
+      (setq syntax (car syntaxes))
+      (setq syntaxes (cdr syntaxes))
+      (save-excursion
+        (skip-syntax-backward syntax)
+        (setq start (point)))
+      (setq templates
+            (mapcan #'(lambda (table)
+                        (yas--fetch table (buffer-substring-no-properties start end)))
+                    (yas--get-snippet-tables)))
+      (if templates
+          (setq done t)
+        (setq start end)))
+    (list templates
+          start
+          end)))
+
+
+(defun yas--table-all-keys (table)
+  (when table
+    (let ((acc))
+      (maphash #'(lambda (key namehash)
+                   (when (yas--filter-templates-by-condition (yas--namehash-templates-alist namehash))
+                     (push key acc)))
+               (yas--table-hash table))
+      acc)))
+
+(defun yas--table-mode (table)
+  (intern (yas--table-name table)))
+
+\f
+;;; Internal functions:
+
+(defun yas--real-mode? (mode)
+  "Try to find out if MODE is a real mode. The MODE bound to
+a function (like `c-mode') is considered real mode. Other well
+known mode like `ruby-mode' which is not part of Emacs might
+not bound to a function until it is loaded. So yasnippet keeps
+a list of modes like this to help the judgement."
+  (or (fboundp mode)
+      (find mode yas--known-modes)))
+
+(defun yas--eval-lisp (form)
+  "Evaluate FORM and convert the result to string."
+  (let ((retval (catch 'yas--exception
+                  (condition-case err
+                      (save-excursion
+                        (save-restriction
+                          (save-match-data
+                            (widen)
+                            (let ((result (eval form)))
+                              (when result
+                                (format "%s" result))))))
+                    (error (if yas-good-grace
+                               (yas--format "elisp error! %s" (error-message-string err))
+                             (error (yas--format "elisp error: %s"
+                                            (error-message-string err)))))))))
+    (when (and (consp retval)
+               (eq 'yas--exception (car retval)))
+      (error (cdr retval)))
+    retval))
+
+(defun yas--eval-lisp-no-saves (form)
+  (condition-case err
+      (eval form)
+    (error (if yas-good-grace
+               (yas--format "elisp error! %s" (error-message-string err))
+             (error (yas--format "elisp error: %s"
+                            (error-message-string err)))))))
+
+(defun yas--read-lisp (string &optional nil-on-error)
+  "Read STRING as a elisp expression and return it.
+
+In case STRING in an invalid expression and NIL-ON-ERROR is nil,
+return an expression that when evaluated will issue an error."
+  (condition-case err
+      (read string)
+    (error (and (not nil-on-error)
+                `(error (error-message-string ,err))))))
+
+(defun yas--read-keybinding (keybinding)
+  "Read KEYBINDING as a snippet keybinding, return a vector."
+  (when (and keybinding
+             (not (string-match "keybinding" keybinding)))
+    (condition-case err
+        (let ((res (or (and (string-match "^\\[.*\\]$" keybinding)
+                            (read keybinding))
+                       (read-kbd-macro keybinding 'need-vector))))
+          res)
+      (error
+       (yas--message 3 "warning: keybinding \"%s\" invalid since %s."
+                keybinding (error-message-string err))
+       nil))))
+
+(defvar yas-extra-modes nil
+  "If non-nil, also lookup snippets for this/these modes.
+
+Can be a symbol or a list of symbols.
+
+This variable probably makes more sense as buffer-local, so
+ensure your use `make-local-variable' when you set it.")
+(defun yas-extra-modes ()
+  (if (listp yas-extra-modes) yas-extra-modes (list yas-extra-modes)))
+(defvaralias 'yas/mode-symbol 'yas-extra-modes)
+
+(defun yas--table-get-create (mode)
+  "Get or create the snippet table corresponding to MODE."
+  (let ((table (gethash mode
+                        yas--tables)))
+    (unless table
+      (setq table (yas--make-snippet-table (symbol-name mode)))
+      (puthash mode table yas--tables)
+      (push (cons (intern (format "yas--direct-%s" mode))
+                  (yas--table-direct-keymap table))
+            yas--direct-keymaps))
+    table))
+
+(defun yas--get-snippet-tables ()
+  "Get snippet tables for current buffer.
+
+Return a list of `yas--table' objects. The list of modes to
+consider is returned by `yas--modes-to-activate'"
+  (remove nil
+          (mapcar #'(lambda (mode-name)
+                      (gethash mode-name yas--tables))
+                  (yas--modes-to-activate))))
+
+(defun yas--menu-keymap-get-create (mode &optional parents)
+  "Get or create the menu keymap for MODE and its PARENTS.
+
+This may very well create a plethora of menu keymaps and arrange
+them all in `yas--menu-table'"
+  (let* ((menu-keymap (or (gethash mode yas--menu-table)
+                          (puthash mode (make-sparse-keymap) yas--menu-table))))
+    (mapc #'yas--menu-keymap-get-create parents)
+    (define-key yas--minor-mode-menu (vector mode)
+        `(menu-item ,(symbol-name mode) ,menu-keymap
+                    :visible (yas--show-menu-p ',mode)))
+    menu-keymap))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Template-related and snippet loading functions
+
+(defun yas--parse-template (&optional file)
+  "Parse the template in the current buffer.
+
+Optional FILE is the absolute file name of the file being
+parsed.
+
+Optional GROUP is the group where the template is to go,
+otherwise we attempt to calculate it from FILE.
+
+Return a snippet-definition, i.e. a list
+
+ (KEY TEMPLATE NAME CONDITION GROUP VARS FILE KEYBINDING UUID)
+
+If the buffer contains a line of \"# --\" then the contents above
+this line are ignored. Directives can set most of these with the syntax:
+
+# directive-name : directive-value
+
+Here's a list of currently recognized directives:
+
+ * type
+ * name
+ * contributor
+ * condition
+ * group
+ * key
+ * expand-env
+ * binding
+ * uuid"
+  (goto-char (point-min))
+  (let* ((type 'snippet)
+         (name (and file
+                    (file-name-nondirectory file)))
+         (key nil)
+         template
+         bound
+         condition
+         (group (and file
+                     (yas--calculate-group file)))
+         expand-env
+         binding
+         uuid)
+    (if (re-search-forward "^# --\n" nil t)
+        (progn (setq template
+                     (buffer-substring-no-properties (point)
+                                                     (point-max)))
+               (setq bound (point))
+               (goto-char (point-min))
+               (while (re-search-forward "^# *\\([^ ]+?\\) *: *\\(.*\\)$" bound t)
+                 (when (string= "uuid" (match-string-no-properties 1))
+                   (setq uuid (match-string-no-properties 2)))
+                 (when (string= "type" (match-string-no-properties 1))
+                   (setq type (if (string= "command" (match-string-no-properties 2))
+                                  'command
+                                'snippet)))
+                 (when (string= "key" (match-string-no-properties 1))
+                   (setq key (match-string-no-properties 2)))
+                 (when (string= "name" (match-string-no-properties 1))
+                   (setq name (match-string-no-properties 2)))
+                 (when (string= "condition" (match-string-no-properties 1))
+                   (setq condition (yas--read-lisp (match-string-no-properties 2))))
+                 (when (string= "group" (match-string-no-properties 1))
+                   (setq group (match-string-no-properties 2)))
+                 (when (string= "expand-env" (match-string-no-properties 1))
+                   (setq expand-env (yas--read-lisp (match-string-no-properties 2)
+                                                   'nil-on-error)))
+                 (when (string= "binding" (match-string-no-properties 1))
+                   (setq binding (match-string-no-properties 2)))))
+      (setq template
+            (buffer-substring-no-properties (point-min) (point-max))))
+    (unless (or key binding)
+      (setq key (and file (file-name-nondirectory file))))
+    (when (eq type 'command)
+      (setq template (yas--read-lisp (concat "(progn" template ")"))))
+    (when group
+      (setq group (split-string group "\\.")))
+    (list key template name condition group expand-env file binding uuid)))
+
+(defun yas--calculate-group (file)
+  "Calculate the group for snippet file path FILE."
+  (let* ((dominating-dir (locate-dominating-file file
+                                                 ".yas-make-groups"))
+         (extra-path (and dominating-dir
+                          (replace-regexp-in-string (concat "^"
+                                                            (expand-file-name dominating-dir))
+                                                    ""
+                                                    (expand-file-name file))))
+         (extra-dir (and extra-path
+                         (file-name-directory extra-path)))
+         (group (and extra-dir
+                     (replace-regexp-in-string "/"
+                                               "."
+                                               (directory-file-name extra-dir)))))
+    group))
+
+(defun yas--subdirs (directory &optional filep)
+  "Return subdirs or files of DIRECTORY according to FILEP."
+  (remove-if (lambda (file)
+               (or (string-match "^\\."
+                                 (file-name-nondirectory file))
+                   (string-match "^#.*#$"
+                                 (file-name-nondirectory file))
+                   (string-match "~$"
+                                 (file-name-nondirectory file))
+                   (if filep
+                       (file-directory-p file)
+                     (not (file-directory-p file)))))
+             (directory-files directory t)))
+
+(defun yas--make-menu-binding (template)
+  (let ((mode (yas--table-mode (yas--template-table template))))
+    `(lambda () (interactive) (yas--expand-or-visit-from-menu ',mode ,(yas--template-uuid template)))))
+
+(defun yas--expand-or-visit-from-menu (mode uuid)
+  (let* ((table (yas--table-get-create mode))
+         (yas--current-template (and table
+                                    (gethash uuid (yas--table-uuidhash table)))))
+    (when yas--current-template
+      (if yas-visit-from-menu
+          (yas--visit-snippet-file-1 yas--current-template)
+        (let ((where (if (region-active-p)
+                         (cons (region-beginning) (region-end))
+                       (cons (point) (point)))))
+          (yas-expand-snippet (yas--template-content yas--current-template)
+                              (car where)
+                              (cdr where)
+                              (yas--template-expand-env yas--current-template)))))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Popping up for keys and templates
+;;
+(defvar yas--x-pretty-prompt-templates nil
+  "If non-nil, attempt to prompt for templates like TextMate.")
+
+
+(defun yas--prompt-for-template (templates &optional prompt)
+  "Interactively choose a template from the list TEMPLATES.
+
+TEMPLATES is a list of `yas--template'."
+  (when templates
+    (setq templates
+          (sort templates #'(lambda (t1 t2)
+                              (< (length (yas--template-name t1))
+                                 (length (yas--template-name t2))))))
+    (if yas--x-pretty-prompt-templates
+        (yas--x-pretty-prompt-templates "Choose a snippet" templates)
+      (some #'(lambda (fn)
+                (funcall fn (or prompt "Choose a snippet: ")
+                         templates
+                         #'yas--template-name))
+            yas-prompt-functions))))
+
+(defun yas--prompt-for-keys (keys &optional prompt)
+  "Interactively choose a template key from the list KEYS."
+  (when keys
+    (some #'(lambda (fn)
+              (funcall fn (or prompt "Choose a snippet key: ") keys))
+          yas-prompt-functions)))
+
+(defun yas--prompt-for-table (tables &optional prompt)
+  (when tables
+    (some #'(lambda (fn)
+              (funcall fn (or prompt "Choose a snippet table: ")
+                       tables
+                       #'yas--table-name))
+          yas-prompt-functions)))
+
+(defun yas-x-prompt (prompt choices &optional display-fn)
+  "Display choices in a x-window prompt."
+  ;; FIXME: HACK: if we notice that one of the objects in choices is
+  ;; actually a `yas--template', defer to `yas--x-prompt-pretty-templates'
+  ;;
+  ;; This would be better implemented by passing CHOICES as a
+  ;; strucutred tree rather than a list. Modifications would go as far
+  ;; up as `yas--all-templates' I think.
+  ;;
+  (when (and window-system choices)
+    (let ((chosen
+           (let (menu d) ;; d for display
+             (dolist (c choices)
+               (setq d (or (and display-fn (funcall display-fn c))
+                           c))
+               (cond ((stringp d)
+                      (push (cons (concat "   " d) c) menu))
+                     ((listp d)
+                      (push (car d) menu))))
+             (setq menu (list prompt (push "title" menu)))
+             (x-popup-menu (if (fboundp 'posn-at-point)
+                               (let ((x-y (posn-x-y (posn-at-point (point)))))
+                                 (list (list (+ (car x-y) 10)
+                                             (+ (cdr x-y) 20))
+                                       (selected-window)))
+                             t)
+                           menu))))
+      (or chosen
+          (keyboard-quit)))))
+
+(defun yas--x-pretty-prompt-templates (prompt templates)
+  "Display TEMPLATES, grouping neatly by table name."
+  (let ((organized (make-hash-table :test #'equal))
+        menu
+        more-than-one-table
+        prefix)
+    (dolist (tl templates)
+      (puthash (yas--template-table tl)
+               (cons tl
+                     (gethash (yas--template-table tl) organized))
+               organized))
+    (setq more-than-one-table (> (hash-table-count organized) 1))
+    (setq prefix (if more-than-one-table
+                     "   " ""))
+    (if more-than-one-table
+        (maphash #'(lambda (table templates)
+                     (push (yas--table-name table) menu)
+                     (dolist (tl templates)
+                       (push (cons (concat prefix (yas--template-name tl)) tl) menu))) organized)
+      (setq menu (mapcar #'(lambda (tl) (cons (concat prefix (yas--template-name tl)) tl)) templates)))
+
+    (setq menu (nreverse menu))
+    (or (x-popup-menu (if (fboundp 'posn-at-point)
+                          (let ((x-y (posn-x-y (posn-at-point (point)))))
+                            (list (list (+ (car x-y) 10)
+                                        (+ (cdr x-y) 20))
+                                  (selected-window)))
+                        t)
+                      (list prompt (push "title" menu)))
+        (keyboard-quit))))
+
+(defun yas-ido-prompt (prompt choices &optional display-fn)
+  (when (and (fboundp 'ido-completing-read)
+            (or (>= emacs-major-version 24)
+                ido-mode))
+    (yas-completing-prompt prompt choices display-fn #'ido-completing-read)))
+
+(eval-when-compile (require 'dropdown-list nil t))
+(defun yas-dropdown-prompt (prompt choices &optional display-fn)
+  (when (featurep 'dropdown-list)
+    (let (formatted-choices
+          filtered-choices
+          d
+          n)
+      (dolist (choice choices)
+        (setq d (or (and display-fn (funcall display-fn choice))
+                      choice))
+        (when (stringp d)
+          (push d formatted-choices)
+          (push choice filtered-choices)))
+
+      (setq n (and formatted-choices (dropdown-list formatted-choices)))
+      (if n
+          (nth n filtered-choices)
+        (keyboard-quit)))))
+
+(defun yas-completing-prompt (prompt choices &optional display-fn completion-fn)
+  (let (formatted-choices
+        filtered-choices
+        chosen
+        d
+        (completion-fn (or completion-fn
+                           #'completing-read)))
+    (dolist (choice choices)
+      (setq d (or (and display-fn (funcall display-fn choice))
+                    choice))
+      (when (stringp d)
+        (push d formatted-choices)
+        (push choice filtered-choices)))
+    (setq chosen (and formatted-choices
+                      (funcall completion-fn prompt
+                               formatted-choices
+                               nil
+                               'require-match
+                               nil
+                               nil)))
+    (let ((position (or (and chosen
+                             (position chosen formatted-choices :test #'string=))
+                        0)))
+      (nth position filtered-choices))))
+
+(defun yas-no-prompt (prompt choices &optional display-fn)
+  (first choices))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Loading snippets from files
+;;
+(defun yas--load-yas-setup-file (file)
+  (load file 'noerror))
+
+(defun yas-load-directory (top-level-dir &optional use-jit)
+  "Load snippets in directory hierarchy TOP-LEVEL-DIR.
+
+Below TOP-LEVEL-DIR each directory should be a mode name.
+
+Optional USE-JIT use jit-loading of snippets."
+  (interactive "DSelect the root directory: ")
+  (unless yas-snippet-dirs
+    (setq yas-snippet-dirs top-level-dir))
+  (dolist (dir (yas--subdirs top-level-dir))
+    (let* ((major-mode-and-parents (yas--compute-major-mode-and-parents
+                                    (concat dir "/dummy")))
+           (mode-sym (car major-mode-and-parents))
+           (parents (cdr major-mode-and-parents)))
+      ;; Attention: The parents and the menus are already defined
+      ;; here, even if the snippets are later jit-loaded.
+      ;;
+      ;; * We need to know the parents at this point since entering a
+      ;;   given mode should jit load for its parents
+      ;;   immediately. This could be reviewed, the parents could be
+      ;;   discovered just-in-time-as well
+      ;;
+      ;; * We need to create the menus here to support the `full'
+      ;;   option to `yas-use-menu' (all known snippet menus are shown to the user)
+      ;;
+      (yas--define-parents mode-sym parents)
+      (yas--menu-keymap-get-create mode-sym)
+      (let ((form `(yas--load-directory-1 ,dir
+                                         ',mode-sym
+                                         ',parents)))
+        (if use-jit
+            (yas--schedule-jit mode-sym form)
+            (eval form)))))
+  (when (interactive-p)
+    (yas--message 3 "Loaded snippets from %s." top-level-dir)))
+
+(defun yas--load-directory-1 (directory mode-sym parents &optional no-compiled-snippets)
+  "Recursively load snippet templates from DIRECTORY."
+  (unless (file-exists-p (concat directory "/" ".yas-skip"))
+    (if (and (not no-compiled-snippets)
+             (progn (yas--message 2 "Loading compiled snippets from %s" directory) t)
+             (load (expand-file-name ".yas-compiled-snippets" directory) 'noerror (<= yas-verbosity 3)))
+      (yas--message 2 "Loading snippet files from %s" directory)
+      (yas--load-directory-2 directory mode-sym))))
+
+(defun yas--load-directory-2 (directory mode-sym)
+  ;; Load .yas-setup.el files wherever we find them
+  ;;
+  (yas--load-yas-setup-file (expand-file-name ".yas-setup" directory))
+  (let* ((default-directory directory)
+         (snippet-defs nil))
+    ;; load the snippet files
+    ;;
+    (with-temp-buffer
+      (dolist (file (yas--subdirs directory 'no-subdirs-just-files))
+        (when (file-readable-p file)
+          (insert-file-contents file nil nil nil t)
+          (push (yas--parse-template file)
+                snippet-defs))))
+    (when snippet-defs
+      (yas-define-snippets mode-sym
+                           snippet-defs))
+    ;; now recurse to a lower level
+    ;;
+    (dolist (subdir (yas--subdirs directory))
+      (yas--load-directory-2 subdir
+                            mode-sym))))
+
+(defun yas--load-snippet-dirs (&optional nojit)
+  "Reload the directories listed in `yas-snippet-dirs' or
+   prompt the user to select one."
+  (let (errors)
+    (if yas-snippet-dirs
+        (dolist (directory (reverse (yas-snippet-dirs)))
+          (cond ((file-directory-p directory)
+                 (yas-load-directory directory (not nojit))
+                 (if nojit
+                     (yas--message 3 "Loaded %s" directory)
+                   (yas--message 3 "Prepared just-in-time loading for %s" directory)))
+                (t
+                 (push (yas--message 0 "Check your `yas-snippet-dirs': %s is not a directory" directory) errors))))
+      (call-interactively 'yas-load-directory))
+    errors))
+
+(defun yas-reload-all (&optional interactive)
+  "Reload all snippets and rebuild the YASnippet menu.
+
+When called interactively force immediate reload of all known
+snippets under `yas-snippet-dirs', otherwise use just-in-time
+loading."
+  (interactive "p")
+  (catch 'abort
+    (let ((errors)
+          (snippet-editing-buffers
+           (remove-if-not #'(lambda (buffer)
+                              (with-current-buffer buffer yas--editing-template))
+                          (buffer-list))))
+      ;; Warn if there are buffers visiting snippets, since reloading will break
+      ;; any on-line editing of those buffers.
+      ;;
+      (when snippet-editing-buffers
+          (if interactive
+              (if (y-or-n-p "Some buffers editing live snippets, close them and proceed with reload?")
+                  (mapc #'kill-buffer snippet-editing-buffers)
+                (yas--message 1 "Aborted reload...")
+                (throw 'abort nil))
+            ;; in a non-interactive use, at least set
+            ;; `yas--editing-template' to nil, make it guess it next time around
+            (mapc #'(lambda (buffer) (setq yas--editing-template nil)) (buffer-list))))
+
+      ;; Empty all snippet tables, parenting info and all menu tables
+      ;;
+      (setq yas--tables (make-hash-table))
+      (setq yas--parents (make-hash-table))
+      (setq yas--menu-table (make-hash-table))
+
+      ;; Cancel all pending 'yas--scheduled-jit-loads'
+      ;;
+      (setq yas--scheduled-jit-loads (make-hash-table))
+
+      ;; Init the `yas-minor-mode-map', taking care not to break the
+      ;; menu....
+      ;;
+      (setcdr yas-minor-mode-map (cdr (yas--init-minor-keymap)))
+
+      ;; Reload the directories listed in `yas-snippet-dirs' or prompt
+      ;; the user to select one.
+      ;;
+      (setq errors (yas--load-snippet-dirs interactive))
+      ;; Reload the direct keybindings
+      ;;
+      (yas-direct-keymaps-reload)
+      ;; Reload the trigger-key (shoudn't be needed, but see issue #237)
+      ;;
+      (yas--trigger-key-reload)
+
+      (yas--message 3 "Reloaded everything%s...%s."
+                   (if interactive "" " (snippets will load just-in-time)")
+                   (if errors " (some errors, check *Messages*)" "")))))
+
+(defun yas--load-pending-jits ()
+  (when yas-minor-mode
+    (dolist (mode (yas--modes-to-activate))
+      (let ((forms (gethash mode yas--scheduled-jit-loads)))
+        (dolist (form forms)
+          (yas--message  3 "Loading for `%s', just-in-time: %s!" mode form)
+          (eval form))
+        (remhash mode yas--scheduled-jit-loads)))))
+
+;; (when (<= emacs-major-version 22)
+;;   (add-hook 'after-change-major-mode-hook 'yas--load-pending-jits))
+
+(defun yas--quote-string (string)
+  "Escape and quote STRING.
+foo\"bar\\! -> \"foo\\\"bar\\\\!\""
+  (concat "\""
+          (replace-regexp-in-string "[\\\"]"
+                                    "\\\\\\&"
+                                    string
+                                    t)
+          "\""))
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Snippet compilation function
+
+(defun yas--initialize ()
+  "For backward compatibility, enable `yas-minor-mode' globally"
+  (yas-global-mode 1))
+
+(defun yas-compile-directory (top-level-dir)
+  "Create .yas-compiled-snippets.el files under subdirs of TOP-LEVEL-DIR.
+
+This works by stubbing a few functions, then calling
+`yas-load-directory'."
+  (interactive "DTop level snippet directory?")
+  (flet ((yas--load-yas-setup-file
+          (file)
+          (let ((elfile (concat file ".el")))
+            (when (file-exists-p elfile)
+              (insert ";;; .yas-setup.el support file if any:\n;;;\n")
+              (insert-file-contents elfile)
+              (end-of-buffer)
+              )))
+         (yas-define-snippets
+          (mode snippets)
+          (insert ";;; Snippet definitions:\n;;;\n")
+          (let ((literal-snippets (list))
+                (print-length nil))
+            (dolist (snippet snippets)
+              (let ((key                    (first   snippet))
+                    (template-content       (second  snippet))
+                    (name                   (third   snippet))
+                    (condition              (fourth  snippet))
+                    (group                  (fifth   snippet))
+                    (expand-env             (sixth   snippet))
+                    (file                   nil) ;; (seventh snippet)) ;; omit on purpose
+                    (binding                (eighth  snippet))
+                    (uuid                    (ninth   snippet)))
+                (push `(,key
+                        ,template-content
+                        ,name
+                        ,condition
+                        ,group
+                        ,expand-env
+                        ,file
+                        ,binding
+                        ,uuid)
+                      literal-snippets)))
+            (insert (pp-to-string `(yas-define-snippets ',mode ',literal-snippets)))
+            (insert "\n\n")))
+         (yas--load-directory-1
+          (dir mode parents &rest ignore)
+          (let ((output-file (concat (file-name-as-directory dir) ".yas-compiled-snippets.el")))
+            (with-temp-file output-file
+              (insert (format ";;; Compiled snippets and support files for `%s'\n" mode))
+              (yas--load-directory-2 dir mode)
+              (insert (format ";;; Do not edit! File generated at %s\n" (current-time-string)))))))
+    (yas-load-directory top-level-dir nil)))
+
+(defun yas-recompile-all ()
+  "Compile every dir in `yas-snippet-dirs'."
+  (interactive)
+  (mapc #'yas-compile-directory (yas-snippet-dirs)))
+
+
+;;; JIT loading
+;;;
+
+(defvar yas--scheduled-jit-loads (make-hash-table)
+  "Alist of mode-symbols to forms to be evaled when `yas-minor-mode' kicks in.")
+
+(defun yas--schedule-jit (mode form)
+  (puthash mode
+           (cons form
+                 (gethash mode yas--scheduled-jit-loads))
+           yas--scheduled-jit-loads))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Some user level functions
+;;;
+
+(defun yas-about ()
+  (interactive)
+  (message (concat "yasnippet (version "
+                   yas--version
+                   ") -- pluskid <pluskid@gmail.com>/joaotavora <joaotavora@gmail.com>")))
+
+(defun yas--define-parents (mode parents)
+  "Add PARENTS to the list of MODE's parents"
+  (puthash mode (remove-duplicates
+                 (append parents
+                         (gethash mode yas--parents)))
+           yas--parents))
+
+(defun yas-define-snippets (mode snippets)
+  "Define SNIPPETS for MODE.
+
+SNIPPETS is a list of snippet definitions, each taking the
+following form
+
+ (KEY TEMPLATE NAME CONDITION GROUP EXPAND-ENV FILE KEYBINDING UUID)
+
+Within these, only KEY and TEMPLATE are actually mandatory.
+
+TEMPLATE might be a lisp form or a string, depending on whether
+this is a snippet or a snippet-command.
+
+CONDITION, EXPAND-ENV and KEYBINDING are lisp forms, they have
+been `yas--read-lisp'-ed and will eventually be
+`yas--eval-lisp'-ed.
+
+The remaining elements are strings.
+
+FILE is probably of very little use if you're programatically
+defining snippets.
+
+UUID is the snippets \"unique-id\". Loading a second snippet file
+with the same uuid replaced the previous snippet.
+
+You can use `yas--parse-template' to return such lists based on
+the current buffers contents."
+  (let ((snippet-table (yas--table-get-create mode))
+        (template nil))
+    (dolist (snippet snippets)
+      (setq template (yas-define-snippets-1 snippet
+                                            snippet-table)))
+    template))
+
+(defun yas-define-snippets-1 (snippet snippet-table)
+  "Helper for `yas-define-snippets'."
+  ;; X) Calculate some more defaults on the values returned by
+  ;; `yas--parse-template'.
+  ;;
+  (let* ((file (seventh snippet))
+         (key (car snippet))
+         (name (or (third snippet)
+                   (and file
+                        (file-name-directory file))))
+         (condition (fourth snippet))
+         (group (fifth snippet))
+         (keybinding (yas--read-keybinding (eighth snippet)))
+         (uuid (or (ninth snippet)
+                  name))
+         (template (or (gethash uuid (yas--table-uuidhash snippet-table))
+                       (yas--make-blank-template))))
+    ;; X) populate the template object
+    ;;
+    (yas--populate-template template
+                           :table       snippet-table
+                           :key         key
+                           :content     (second snippet)
+                           :name        (or name key)
+                           :group       group
+                           :condition   condition
+                           :expand-env  (sixth snippet)
+                           :file        (seventh snippet)
+                           :keybinding  keybinding
+                           :uuid         uuid)
+    ;; X) Update this template in the appropriate table. This step
+    ;;    also will take care of adding the key indicators in the
+    ;;    templates menu entry, if any
+    ;;
+    (yas--update-template snippet-table template)
+    ;; X) Return the template
+    ;;
+    ;;
+    template))
+
+\f
+;;; Apropos snippet menu:
+;;
+;; The snippet menu keymaps are store by mode in hash table called
+;; `yas--menu-table'. They are linked to the main menu in
+;; `yas--menu-keymap-get-create' and are initially created empty,
+;; reflecting the table hierarchy.
+;;
+;; They can be populated in two mutually exclusive ways: (1) by
+;; reading `yas--template-group', which in turn is populated by the "#
+;; group:" directives of the snippets or the ".yas-make-groups" file
+;; or (2) by using a separate `yas-define-menu' call, which declares a
+;; menu structure based on snippets uuids.
+;;
+;; Both situations are handled in `yas--update-template-menu', which
+;; uses the predicate `yas--template-menu-managed-by-yas-define-menu'
+;; that can tell between the two situations.
+;;
+;; Note:
+;;
+;; * if `yas-define-menu' is used it must run before
+;;   `yas-define-snippets' and the UUIDS must match, otherwise we get
+;;   duplicate entries. The `yas--template' objects are created in
+;;   `yas-define-menu', holding nothing but the menu entry,
+;;   represented by a pair of ((menu-item NAME :keys KEYS) TYPE) and
+;;   stored in `yas--template-menu-binding-pair'. The (menu-item ...)
+;;   part is then stored in the menu keymap itself which make the item
+;;   appear to the user. These limitations could probably be revised.
+;;
+;; * The `yas--template-perm-group' slot is only used in
+;;   `yas-describe-tables'.
+;;
+(defun yas--template-menu-binding-pair-get-create (template &optional type)
+  "Get TEMPLATE's menu binding or assign it a new one.
+
+TYPE may be `:stay', signalling this menu binding should be
+static in the menu."
+  (or (yas--template-menu-binding-pair template)
+      (let ((key (yas--template-key template))
+            (keybinding (yas--template-keybinding template)))
+        (setf (yas--template-menu-binding-pair template)
+              (cons `(menu-item ,(or (yas--template-name template)
+                                     (yas--template-uuid template))
+                                ,(yas--make-menu-binding template)
+                                :keys ,nil)
+                    type)))))
+(defun yas--template-menu-managed-by-yas-define-menu (template)
+  "Non-nil if TEMPLATE's menu entry was included in a `yas-define-menu' call."
+  (cdr (yas--template-menu-binding-pair template)))
+
+
+(defun yas--show-menu-p (mode)
+  (cond ((eq yas-use-menu 'abbreviate)
+         (find mode
+               (mapcar #'(lambda (table)
+                           (yas--table-mode table))
+                       (yas--get-snippet-tables))))
+        ((eq yas-use-menu 'full)
+         t)
+        ((eq yas-use-menu t)
+         t)))
+
+(defun yas--delete-from-keymap (keymap uuid)
+  "Recursively delete items with UUID from KEYMAP and its submenus."
+
+  ;; XXX: This used to skip any submenus named \"parent mode\"
+  ;;
+  ;; First of all, recursively enter submenus, i.e. the tree is
+  ;; searched depth first so that stale submenus can be found in the
+  ;; higher passes.
+  ;;
+  (mapc #'(lambda (item)
+            (when (and (listp (cdr item))
+                       (keymapp (third (cdr item))))
+              (yas--delete-from-keymap (third (cdr item)) uuid)))
+        (rest keymap))
+  ;; Set the uuid entry to nil
+  ;;
+  (define-key keymap (vector (make-symbol uuid)) nil)
+  ;; Destructively modify keymap
+  ;;
+  (setcdr keymap (delete-if #'(lambda (item)
+                                (or (null (cdr item))
+                                    (and (keymapp (third (cdr item)))
+                                         (null (cdr (third (cdr item)))))))
+                            (rest keymap))))
+
+(defun yas-define-menu (mode menu &optional omit-items)
+  "Define a snippet menu for MODE according to MENU, ommitting OMIT-ITEMS.
+
+MENU is a list, its elements can be:
+
+- (yas-item UUID) : Creates an entry the snippet identified with
+  UUID. The menu entry for a snippet thus identified is
+  permanent, i.e. it will never move (be reordered) in the menu.
+
+- (yas-separator) : Creates a separator
+
+- (yas-submenu NAME SUBMENU) : Creates a submenu with NAME,
+  SUBMENU has the same form as MENU. NAME is also added to the
+  list of groups of the snippets defined thereafter.
+
+OMIT-ITEMS is a list of snippet uuid's that will always be
+ommited from MODE's menu, even if they're manually loaded.
+
+This function does nothing if `yas-use-menu' is nil.
+"
+  (when yas-use-menu
+    (let* ((table (yas--table-get-create mode))
+           (hash (yas--table-uuidhash table)))
+      (yas--define-menu-1 table
+                          (yas--menu-keymap-get-create mode)
+                          menu
+                          hash)
+      (dolist (uuid omit-items)
+        (let ((template (or (gethash uuid hash)
+                            (yas--populate-template (puthash uuid
+                                                             (yas--make-blank-template)
+                                                             hash)
+                                                    :table table
+                                                    :uuid uuid))))
+          (setf (yas--template-menu-binding-pair template) (cons nil :none)))))))
+
+(defun yas--define-menu-1 (table menu-keymap menu uuidhash &optional group-list)
+  (dolist (e (reverse menu))
+    (cond ((eq (first e) 'yas-item)
+           (let ((template (or (gethash (second e) uuidhash)
+                               (yas--populate-template (puthash (second e)
+                                                               (yas--make-blank-template)
+                                                               uuidhash)
+                                                      :table table
+                                                      :perm-group group-list
+                                                      :uuid (second e)))))
+             (define-key menu-keymap (vector (gensym))
+               (car (yas--template-menu-binding-pair-get-create template :stay)))))
+          ((eq (first e) 'yas-submenu)
+           (let ((subkeymap (make-sparse-keymap)))
+             (define-key menu-keymap (vector (gensym))
+               `(menu-item ,(second e) ,subkeymap))
+             (yas--define-menu-1 table
+                                subkeymap
+                                (third e)
+                                uuidhash
+                                (append group-list (list (second e))))))
+          ((eq (first e) 'yas-separator)
+           (define-key menu-keymap (vector (gensym))
+             '(menu-item "----")))
+          (t
+           (yas--message 3 "Don't know anything about menu entry %s" (first e))))))
+\f
+(defun yas--define (mode key template &optional name condition group)
+  "Define a snippet.  Expanding KEY into TEMPLATE.
+
+NAME is a description to this template.  Also update the menu if
+`yas-use-menu' is t.  CONDITION is the condition attached to
+this snippet.  If you attach a condition to a snippet, then it
+will only be expanded when the condition evaluated to non-nil."
+  (yas-define-snippets mode
+                       (list (list key template name condition group))))
+
+(defun yas-hippie-try-expand (first-time?)
+  "Integrate with hippie expand.  Just put this function in
+`hippie-expand-try-functions-list'."
+  (when yas-minor-mode
+    (if (not first-time?)
+        (let ((yas-fallback-behavior 'return-nil))
+          (yas-expand))
+      (undo 1)
+      nil)))
+
+
+;;; Apropos condition-cache:
+;;;
+;;;
+;;;
+;;;
+(defvar yas--condition-cache-timestamp nil)
+(defmacro yas-define-condition-cache (func doc &rest body)
+  "Define a function FUNC with doc DOC and body BODY, BODY is
+executed at most once every snippet expansion attempt, to check
+expansion conditions.
+
+It doesn't make any sense to call FUNC programatically."
+  `(defun ,func () ,(if (and doc
+                             (stringp doc))
+                        (concat doc
+"\n\nFor use in snippets' conditions. Within each
+snippet-expansion routine like `yas-expand', computes actual
+value for the first time then always returns a cached value.")
+                      (setq body (cons doc body))
+                      nil)
+     (let ((timestamp-and-value (get ',func 'yas--condition-cache)))
+       (if (equal (car timestamp-and-value) yas--condition-cache-timestamp)
+           (cdr timestamp-and-value)
+         (let ((new-value (progn
+                            ,@body
+                            )))
+           (put ',func 'yas--condition-cache (cons yas--condition-cache-timestamp new-value))
+           new-value)))))
+
+(defalias 'yas-expand 'yas-expand-from-trigger-key)
+(defun yas-expand-from-trigger-key (&optional field)
+  "Expand a snippet before point.
+
+If no snippet expansion is possible, fall back to the behaviour
+defined in `yas-fallback-behavior'.
+
+Optional argument FIELD is for non-interactive use and is an
+object satisfying `yas--field-p' to restrict the expansion to."
+  (interactive)
+  (setq yas--condition-cache-timestamp (current-time))
+  (let (templates-and-pos)
+    (unless (and yas-expand-only-for-last-commands
+                 (not (member last-command yas-expand-only-for-last-commands)))
+      (setq templates-and-pos (if field
+                                  (save-restriction
+                                    (narrow-to-region (yas--field-start field)
+                                                      (yas--field-end field))
+                                    (yas--current-key))
+                                (yas--current-key))))
+    (if (and templates-and-pos
+             (first templates-and-pos))
+        (yas--expand-or-prompt-for-template (first templates-and-pos)
+                                           (second templates-and-pos)
+                                           (third templates-and-pos))
+      (yas--fallback 'trigger-key))))
+
+(defun yas-expand-from-keymap ()
+  "Directly expand some snippets, searching `yas--direct-keymaps'.
+
+If expansion fails, execute the previous binding for this key"
+  (interactive)
+  (setq yas--condition-cache-timestamp (current-time))
+  (let* ((yas--prefix current-prefix-arg)
+         (vec (subseq (this-command-keys-vector) (if current-prefix-arg
+                                                     universal-argument-num-events
+                                                   0)))
+         (templates (mapcan #'(lambda (table)
+                                (yas--fetch table vec))
+                            (yas--get-snippet-tables))))
+    (if templates
+        (yas--expand-or-prompt-for-template templates)
+      (let ((yas-fallback-behavior 'call-other-command))
+        (yas--fallback)))))
+
+(defun yas--expand-or-prompt-for-template (templates &optional start end)
+  "Expand one of TEMPLATES from START to END.
+
+Prompt the user if TEMPLATES has more than one element, else
+expand immediately. Common gateway for
+`yas-expand-from-trigger-key' and `yas-expand-from-keymap'."
+  (let ((yas--current-template (or (and (rest templates) ;; more than one
+                                       (yas--prompt-for-template (mapcar #'cdr templates)))
+                                  (cdar templates))))
+    (when yas--current-template
+      (yas-expand-snippet (yas--template-content yas--current-template)
+                          start
+                          end
+                          (yas--template-expand-env yas--current-template)))))
+
+(defun yas--fallback (&optional from-trigger-key-p)
+  "Fallback after expansion has failed.
+
+Common gateway for `yas-expand-from-trigger-key' and
+`yas-expand-from-keymap'."
+  (cond ((eq yas-fallback-behavior 'return-nil)
+         ;; return nil
+         nil)
+        ((eq yas-fallback-behavior 'call-other-command)
+         (let* ((yas-minor-mode nil)
+                (yas--direct-keymaps nil)
+                (keys-1 (this-command-keys-vector))
+                (keys-2 (and yas-trigger-key
+                             from-trigger-key-p
+                             (stringp yas-trigger-key)
+                             (read-kbd-macro yas-trigger-key)))
+                (command-1 (and keys-1 (key-binding keys-1)))
+                (command-2 (and keys-2 (key-binding keys-2)))
+                ;; An (ugly) safety: prevents infinite recursion of
+                ;; yas-expand* calls.
+                (command (or (and (symbolp command-1)
+                                  (not (string-match "yas-expand" (symbol-name command-1)))
+                                  command-1)
+                             (and (symbolp command-2)
+                                  command-2))))
+           (when (and (commandp command)
+                      (not (string-match "yas-expand" (symbol-name command))))
+             (setq this-command command)
+             (call-interactively command))))
+        ((and (listp yas-fallback-behavior)
+              (cdr yas-fallback-behavior)
+              (eq 'apply (car yas-fallback-behavior)))
+         (if (cddr yas-fallback-behavior)
+             (apply (cadr yas-fallback-behavior)
+                    (cddr yas-fallback-behavior))
+           (when (commandp (cadr yas-fallback-behavior))
+             (setq this-command (cadr yas-fallback-behavior))
+             (call-interactively (cadr yas-fallback-behavior)))))
+        (t
+         ;; also return nil if all the other fallbacks have failed
+         nil)))
+
+
+\f
+;;; Utils for snippet development:
+
+(defun yas--all-templates (tables)
+  "Return all snippet tables applicable for the current buffer.
+
+Honours `yas-choose-tables-first', `yas-choose-keys-first' and
+`yas-buffer-local-condition'"
+  (when yas-choose-tables-first
+    (setq tables (list (yas--prompt-for-table tables))))
+  (mapcar #'cdr
+          (if yas-choose-keys-first
+              (let ((key (yas--prompt-for-keys
+                          (mapcan #'yas--table-all-keys tables))))
+                (when key
+                  (mapcan #'(lambda (table)
+                              (yas--fetch table key))
+                          tables)))
+            (remove-duplicates (mapcan #'yas--table-templates tables)
+                               :test #'equal))))
+
+(defun yas-insert-snippet (&optional no-condition)
+  "Choose a snippet to expand, pop-up a list of choices according
+to `yas--prompt-function'.
+
+With prefix argument NO-CONDITION, bypass filtering of snippets
+by condition."
+  (interactive "P")
+  (setq yas--condition-cache-timestamp (current-time))
+  (let* ((yas-buffer-local-condition (or (and no-condition
+                                              'always)
+                                         yas-buffer-local-condition))
+         (templates (yas--all-templates (yas--get-snippet-tables)))
+         (yas--current-template (and templates
+                                    (or (and (rest templates) ;; more than one template for same key
+                                             (yas--prompt-for-template templates))
+                                        (car templates))))
+         (where (if (region-active-p)
+                    (cons (region-beginning) (region-end))
+                  (cons (point) (point)))))
+    (if yas--current-template
+        (yas-expand-snippet (yas--template-content yas--current-template)
+                            (car where)
+                            (cdr where)
+                            (yas--template-expand-env yas--current-template))
+      (yas--message 3 "No snippets can be inserted here!"))))
+
+(defun yas-visit-snippet-file ()
+  "Choose a snippet to edit, selection like `yas-insert-snippet'.
+
+Only success if selected snippet was loaded from a file.  Put the
+visited file in `snippet-mode'."
+  (interactive)
+  (let* ((yas-buffer-local-condition 'always)
+         (templates (yas--all-templates (yas--get-snippet-tables)))
+         (yas-prompt-functions '(yas-ido-prompt yas-completing-prompt))
+         (template (and templates
+                        (or (yas--prompt-for-template templates
+                                                     "Choose a snippet template to edit: ")
+                            (car templates)))))
+
+    (if template
+        (yas--visit-snippet-file-1 template)
+      (message "No snippets tables active!"))))
+
+(defun yas--visit-snippet-file-1 (template)
+  (let ((file (yas--template-file template)))
+    (cond ((and file (file-readable-p file))
+           (find-file-other-window file)
+           (snippet-mode)
+           (set (make-local-variable 'yas--editing-template) template))
+          (file
+           (message "Original file %s no longer exists!" file))
+          (t
+           (switch-to-buffer (format "*%s*"(yas--template-name template)))
+           (let ((type 'snippet))
+             (when (listp (yas--template-content template))
+               (insert (format "# type: command\n"))
+               (setq type 'command))
+             (insert (format "# key: %s\n" (yas--template-key template)))
+             (insert (format "# name: %s\n" (yas--template-name template)))
+             (when (yas--template-keybinding template)
+               (insert (format "# binding: %s\n" (yas--template-keybinding template))))
+             (when (yas--template-expand-env template)
+               (insert (format "# expand-env: %s\n" (yas--template-expand-env template))))
+             (when (yas--template-condition template)
+               (insert (format "# condition: %s\n" (yas--template-condition template))))
+             (insert "# --\n")
+             (insert (if (eq type 'command)
+                         (pp-to-string (yas--template-content template))
+                       (yas--template-content template))))
+           (snippet-mode)
+           (set (make-local-variable 'yas--editing-template) template)))))
+
+(defun yas--guess-snippet-directories-1 (table)
+  "Guesses possible snippet subdirectories for TABLE."
+  (cons (yas--table-name table)
+        (mapcan #'(lambda (parent)
+                    (yas--guess-snippet-directories-1
+                     parent))
+                (yas--table-parents table))))
+
+(defun yas--guess-snippet-directories (&optional table)
+  "Try to guess suitable directories based on the current active
+tables (or optional TABLE).
+
+Returns a list of elemts (TABLE . DIRS) where TABLE is a
+`yas--table' object and DIRS is a list of all possible directories
+where snippets of table might exist."
+  (let ((main-dir (replace-regexp-in-string
+                   "/+$" ""
+                   (or (first (or (yas-snippet-dirs)
+                                  (setq yas-snippet-dirs '("~/.emacs.d/snippets")))))))
+        (tables (or (and table
+                         (list table))
+                    (yas--get-snippet-tables))))
+    ;; HACK! the snippet table created here is actually registered!
+    ;;
+    (unless (or table (gethash major-mode yas--tables))
+      (push (yas--table-get-create major-mode)
+            tables))
+
+    (mapcar #'(lambda (table)
+                (cons table
+                      (mapcar #'(lambda (subdir)
+                                  (concat main-dir "/" subdir))
+                              (yas--guess-snippet-directories-1 table))))
+            tables)))
+
+(defun yas--make-directory-maybe (table-and-dirs &optional main-table-string)
+  "Returns a dir inside  TABLE-AND-DIRS, prompts for creation if none exists."
+  (or (some #'(lambda (dir) (when (file-directory-p dir) dir)) (cdr table-and-dirs))
+      (let ((candidate (first (cdr table-and-dirs))))
+        (unless (file-writable-p (file-name-directory candidate))
+          (error (yas--format "%s is not writable." candidate)))
+        (if (y-or-n-p (format "Guessed directory (%s) for%s%s table \"%s\" does not exist! Create? "
+                              candidate
+                              (if (gethash (yas--table-mode (car table-and-dirs))
+                                           yas--tables)
+                                  ""
+                                " brand new")
+                              (or main-table-string
+                                  "")
+                              (yas--table-name (car table-and-dirs))))
+            (progn
+              (make-directory candidate 'also-make-parents)
+              ;; create the .yas-parents file here...
+              candidate)))))
+
+(defun yas-new-snippet (&optional no-template)
+  "Pops a new buffer for writing a snippet.
+
+Expands a snippet-writing snippet, unless the optional prefix arg
+NO-TEMPLATE is non-nil."
+  (interactive "P")
+  (let ((guessed-directories (yas--guess-snippet-directories)))
+
+    (switch-to-buffer "*new snippet*")
+    (erase-buffer)
+    (kill-all-local-variables)
+    (snippet-mode)
+    (yas-minor-mode 1)
+    (set (make-local-variable 'yas--guessed-modes) (mapcar #'(lambda (d)
+                                                              (yas--table-mode (car d)))
+                                                          guessed-directories))
+    (unless no-template (yas-expand-snippet "\
+# -*- mode: snippet -*-
+# name: $1
+# key: ${2:${1:$(replace-regexp-in-string \"\\\\\\\\(\\\\\\\\w+\\\\\\\\).*\" \"\\\\\\\\1\" yas-text)}}${3:
+# binding: ${4:direct-keybinding}}${5:
+# expand-env: ((${6:some-var} ${7:some-value}))}${8:
+# type: command}
+# --
+$0"))))
+
+(defun yas--compute-major-mode-and-parents (file)
+  "Given FILE, find the nearest snippet directory for a given
+mode, then return a list (MODE-SYM PARENTS), the mode's symbol and a list
+representing one or more of the mode's parents.
+
+Note that MODE-SYM need not be the symbol of a real major mode,
+neither do the elements of PARENTS."
+  (let* ((file-dir (and file
+                        (directory-file-name (or (some #'(lambda (special)
+                                                           (locate-dominating-file file special))
+                                                       '(".yas-setup.el"
+                                                         ".yas-make-groups"
+                                                         ".yas-parents"))
+                                                 (directory-file-name (file-name-directory file))))))
+         (parents-file-name (concat file-dir "/.yas-parents"))
+         (major-mode-name (and file-dir
+                               (file-name-nondirectory file-dir)))
+         (major-mode-sym (or (and major-mode-name
+                                  (intern major-mode-name))))
+         (parents (when (file-readable-p parents-file-name)
+                         (mapcar #'intern
+                                 (split-string
+                                  (with-temp-buffer
+                                    (insert-file-contents parents-file-name)
+                                    (buffer-substring-no-properties (point-min)
+                                                                    (point-max))))))))
+    (when major-mode-sym
+      (cons major-mode-sym parents))))
+
+(defvar yas--editing-template nil
+  "Supporting variable for `yas-load-snippet-buffer' and `yas--visit-snippet'")
+
+(defvar yas--current-template nil
+  "Holds the current template being expanded into a snippet.")
+
+(defvar yas--guessed-modes nil
+  "List of guessed modes supporting `yas-load-snippet-buffer'.")
+
+(defun yas-load-snippet-buffer (&optional kill)
+  "Parse and load current buffer's snippet definition.
+
+With optional prefix argument KILL quit the window and buffer."
+  (interactive "P")
+  (cond
+   ;;  We have `yas--editing-template', this buffer's
+   ;;  content comes from a template which is already loaded and
+   ;;  neatly positioned,...
+   ;;
+   (yas--editing-template
+    (yas-define-snippets-1 (yas--parse-template (yas--template-file yas--editing-template))
+                           (yas--template-table yas--editing-template)))
+   ;; Try to use `yas--guessed-modes'. If we don't have that use the
+   ;; value from `yas--compute-major-mode-and-parents'
+   ;;
+   (t
+    (unless yas--guessed-modes
+      (set (make-local-variable 'yas--guessed-modes) (or (yas--compute-major-mode-and-parents buffer-file-name))))
+    (let* ((prompt (if (and (featurep 'ido)
+                            ido-mode)
+                       'ido-completing-read 'completing-read))
+           (table (yas--table-get-create
+                   (intern
+                    (funcall prompt (format "Choose or enter a table (yas guesses %s): "
+                                            (if yas--guessed-modes
+                                                (first yas--guessed-modes)
+                                              "nothing"))
+                             (mapcar #'symbol-name yas--guessed-modes)
+                             nil
+                             nil
+                             nil
+                             nil
+                             (if (first yas--guessed-modes)
+                                 (symbol-name (first yas--guessed-modes))))))))
+      (set (make-local-variable 'yas--editing-template)
+           (yas-define-snippets-1 (yas--parse-template buffer-file-name)
+                                  table)))))
+  ;; Now, offer to save this iff:
+  ;;
+  ;; 1) `yas-snippet-dirs' is a list and its first element does not
+  ;; match this template's file (i.e. this is a library snippet, not
+  ;; a user snippet) OR
+  ;;
+  ;; 2) yas--editing-template comes from a file that we cannot write to...
+  ;;
+  (when (or (not (yas--template-file yas--editing-template))
+            (not (file-writable-p (yas--template-file yas--editing-template)))
+            (and (listp yas-snippet-dirs)
+                 (second yas-snippet-dirs)
+                 (not (string-match (expand-file-name (first yas-snippet-dirs))
+                                    (yas--template-file yas--editing-template)))))
+
+    (when (y-or-n-p (yas--format "Looks like a library or new snippet. Save to new file? "))
+      (let* ((option (first (yas--guess-snippet-directories (yas--template-table yas--editing-template))))
+             (chosen (and option
+                          (yas--make-directory-maybe option))))
+        (when chosen
+          (let ((default-file-name (or (and (yas--template-file yas--editing-template)
+                                            (file-name-nondirectory (yas--template-file yas--editing-template)))
+                                       (yas--template-name yas--editing-template))))
+            (write-file (concat chosen "/"
+                                (read-from-minibuffer (format "File name to create in %s? " chosen)
+                                                      default-file-name)))
+            (setf (yas--template-file yas--editing-template) buffer-file-name))))))
+  (when kill
+    (quit-window kill))
+  (yas--message 3 "Snippet \"%s\" loaded for %s."
+           (yas--template-name yas--editing-template)
+           (yas--table-name (yas--template-table yas--editing-template))))
+
+
+(defun yas-tryout-snippet (&optional debug)
+  "Test current buffers's snippet template in other buffer."
+  (interactive "P")
+  (let* ((major-mode-and-parent (yas--compute-major-mode-and-parents buffer-file-name))
+         (parsed (yas--parse-template))
+         (test-mode (or (and (car major-mode-and-parent)
+                             (fboundp (car major-mode-and-parent))
+                             (car major-mode-and-parent))
+                        (first yas--guessed-modes)
+                        (intern (read-from-minibuffer (yas--format "Please input a mode: ")))))
+         (yas--current-template
+          (and parsed
+               (fboundp test-mode)
+               (yas--populate-template (yas--make-blank-template)
+                                      :table       nil ;; no tables for ephemeral snippets
+                                      :key         (first parsed)
+                                      :content     (second parsed)
+                                      :name        (third parsed)
+                                      :expand-env  (sixth parsed)))))
+    (cond (yas--current-template
+           (let ((buffer-name (format "*testing snippet: %s*" (yas--template-name yas--current-template))))
+             (kill-buffer (get-buffer-create buffer-name))
+             (switch-to-buffer (get-buffer-create buffer-name))
+             (setq buffer-undo-list nil)
+             (condition-case nil (funcall test-mode) (error nil))
+             (setq buffer-read-only nil)
+             (yas-expand-snippet (yas--template-content yas--current-template)
+                                 (point-min)
+                                 (point-max)
+                                 (yas--template-expand-env yas--current-template))
+             (when (and debug
+                        (require 'yasnippet-debug nil t))
+               (add-hook 'post-command-hook 'yas-debug-snippet-vars nil t))))
+          (t
+           (yas--message 3 "Cannot test snippet for unknown major mode")))))
+
+(defun yas--template-fine-group (template)
+  (car (last (or (yas--template-group template)
+                 (yas--template-perm-group template)))))
+
+(defun yas-describe-tables (&optional choose)
+  "Display snippets for each table."
+  (interactive "P")
+  (let* ((by-name-hash (and choose
+                            (y-or-n-p "Show by namehash? ")))
+         (buffer (get-buffer-create "*YASnippet tables*"))
+         (active-tables (yas--get-snippet-tables))
+         (remain-tables (let ((all))
+                          (maphash #'(lambda (k v)
+                                       (unless (find v active-tables)
+                                         (push v all)))
+                                   yas--tables)
+                          all))
+         (table-lists (list active-tables remain-tables))
+         (original-buffer (current-buffer))
+         (continue t)
+         (yas--condition-cache-timestamp (current-time)))
+    (with-current-buffer buffer
+      (setq buffer-read-only nil)
+      (erase-buffer)
+      (cond ((not by-name-hash)
+             (insert "YASnippet tables: \n")
+             (while (and table-lists
+                         continue)
+               (dolist (table (car table-lists))
+                 (yas--describe-pretty-table table original-buffer))
+               (setq table-lists (cdr table-lists))
+               (when table-lists
+                 (yas--create-snippet-xrefs)
+                 (display-buffer buffer)
+                 (setq continue (and choose (y-or-n-p "Show also non-active tables? ")))))
+             (yas--create-snippet-xrefs)
+             (help-mode)
+             (goto-char 1))
+            (t
+             (insert "\n\nYASnippet tables by NAMEHASH: \n")
+             (dolist (table (append active-tables remain-tables))
+               (insert (format "\nSnippet table `%s':\n\n" (yas--table-name table)))
+               (let ((keys))
+                 (maphash #'(lambda (k v)
+                              (push k keys))
+                          (yas--table-hash table))
+                 (dolist (key keys)
+                   (insert (format "   key %s maps snippets: %s\n" key
+                                   (let ((names))
+                                     (maphash #'(lambda (k v)
+                                                  (push k names))
+                                              (gethash key (yas--table-hash table)))
+                                     names))))))))
+      (goto-char 1)
+      (setq buffer-read-only t))
+    (display-buffer buffer)))
+
+(defun yas--describe-pretty-table (table &optional original-buffer)
+  (insert (format "\nSnippet table `%s'"
+                  (yas--table-name table)))
+  (if (yas--table-parents table)
+      (insert (format " parents: %s\n"
+                      (mapcar #'yas--table-name
+                              (yas--table-parents table))))
+    (insert "\n"))
+  (insert (make-string 100 ?-) "\n")
+  (insert "group                   state name                                    key             binding\n")
+  (let ((groups-hash (make-hash-table :test #'equal)))
+    (maphash #'(lambda (k v)
+                 (let ((group (or (yas--template-fine-group v)
+                                  "(top level)")))
+                   (when (yas--template-name v)
+                     (puthash group
+                              (cons v (gethash group groups-hash))
+                              groups-hash))))
+             (yas--table-uuidhash table))
+    (maphash
+     #'(lambda (group templates)
+         (setq group (truncate-string-to-width group 25 0 ?  "..."))
+         (insert (make-string 100 ?-) "\n")
+         (dolist (p templates)
+           (let ((name (truncate-string-to-width (propertize (format "\\\\snippet `%s'" (yas--template-name p))
+                                                             'yasnippet p)
+                                                 50 0 ? "..."))
+                 (group (prog1 group
+                          (setq group (make-string (length group) ? ))))
+                 (condition-string (let ((condition (yas--template-condition p)))
+                                     (if (and condition
+                                              original-buffer)
+                                         (with-current-buffer original-buffer
+                                           (if (yas--eval-condition condition)
+                                               "(y)"
+                                             "(s)"))
+                                       "(a)"))))
+             (insert group " ")
+             (insert condition-string " ")
+             (insert name
+                     (if (string-match "\\.\\.\\.$" name)
+                         "'"
+                       " ")
+                     " ")
+             (insert (truncate-string-to-width (or (yas--template-key p) "")
+                                               15 0 ?  "...") " ")
+             (insert (truncate-string-to-width (key-description (yas--template-keybinding p))
+                                               15 0 ?  "...") " ")
+             (insert "\n"))))
+     groups-hash)))
+
+
+\f
+;;; User convenience functions, for using in snippet definitions
+
+(defvar yas-modified-p nil
+  "Non-nil if field has been modified by user or transformation.")
+
+(defvar yas-moving-away-p nil
+  "Non-nil if user is about to exit field.")
+
+(defvar yas-text nil
+  "Contains current field text.")
+
+(defun yas-substr (str pattern &optional subexp)
+  "Search PATTERN in STR and return SUBEXPth match.
+
+If found, the content of subexp group SUBEXP (default 0) is
+  returned, or else the original STR will be returned."
+  (let ((grp (or subexp 0)))
+    (save-match-data
+      (if (string-match pattern str)
+          (match-string-no-properties grp str)
+        str))))
+
+(defun yas-choose-value (possibilities)
+  "Prompt for a string in the list POSSIBILITIES and return it."
+  (unless (or yas-moving-away-p
+              yas-modified-p)
+    (some #'(lambda (fn)
+              (funcall fn "Choose: " possibilities))
+          yas-prompt-functions)))
+
+(defun yas-key-to-value (alist)
+  "Prompt for a string in the list POSSIBILITIES and return it."
+  (unless (or yas-moving-away-p
+              yas-modified-p)
+    (let ((key (read-key-sequence "")))
+      (when (stringp key)
+        (or (cdr (find key alist :key #'car :test #'string=))
+            key)))))
+
+(defun yas-throw (text)
+  "Throw a yas--exception with TEXT as the reason."
+  (throw 'yas--exception (cons 'yas--exception text)))
+
+(defun yas-verify-value (possibilities)
+  "Verify that the current field value is in POSSIBILITIES
+
+Otherwise throw exception."
+  (when (and yas-moving-away-p (notany #'(lambda (pos) (string= pos yas-text)) possibilities))
+    (yas-throw (yas--format "Field only allows %s" possibilities))))
+
+(defun yas-field-value (number)
+  "Get the string for field with NUMBER.
+
+Use this in primary and mirror transformations to tget."
+  (let* ((snippet (car (yas--snippets-at-point)))
+         (field (and snippet
+                     (yas--snippet-find-field snippet number))))
+    (when field
+      (yas--field-text-for-display field))))
+
+(defun yas-text ()
+  "Return `yas-text' if that exists and is non-empty, else nil."
+  (if (and yas-text
+           (not (string= "" yas-text)))
+      yas-text))
+
+;; (defun yas-selected-text ()
+;;   "Return `yas-selected-text' if that exists and is non-empty, else nil."
+;;   (if (and yas-selected-text
+;;            (not (string= "" yas-selected-text)))
+;;       yas-selected-text))
+
+(defun yas--get-field-once (number &optional transform-fn)
+  (unless yas-modified-p
+    (if transform-fn
+        (funcall transform-fn (yas-field-value number))
+      (yas-field-value number))))
+
+(defun yas-default-from-field (number)
+  (unless yas-modified-p
+    (yas-field-value number)))
+
+(defun yas-inside-string ()
+  (equal 'font-lock-string-face (get-char-property (1- (point)) 'face)))
+
+(defun yas-unimplemented (&optional missing-feature)
+  (if yas--current-template
+      (if (y-or-n-p (format "This snippet is unimplemented (missing %s) Visit the snippet definition? "
+                            (or missing-feature
+                                "something")))
+          (yas--visit-snippet-file-1 yas--current-template))
+    (message "No implementation. Missing %s" (or missing-feature "something"))))
+
+\f
+;;; Snippet expansion and field management
+
+(defvar yas--active-field-overlay nil
+  "Overlays the currently active field.")
+
+(defvar yas--field-protection-overlays nil
+  "Two overlays protect the current active field ")
+
+(defconst yas--prefix nil
+  "A prefix argument for expansion direct from keybindings")
+
+(defvar yas-selected-text nil
+  "The selected region deleted on the last snippet expansion.")
+
+(defvar yas--start-column nil
+  "The column where the snippet expansion started.")
+
+(make-variable-buffer-local 'yas--active-field-overlay)
+(make-variable-buffer-local 'yas--field-protection-overlays)
+(put 'yas--active-field-overlay 'permanent-local t)
+(put 'yas--field-protection-overlays 'permanent-local t)
+
+(defstruct (yas--snippet (:constructor yas--make-snippet ()))
+  "A snippet.
+
+..."
+  (fields '())
+  (exit nil)
+  (id (yas--snippet-next-id) :read-only t)
+  (control-overlay nil)
+  active-field
+  ;; stacked expansion: the `previous-active-field' slot saves the
+  ;; active field where the child expansion took place
+  previous-active-field
+  force-exit)
+
+(defstruct (yas--field (:constructor yas--make-field (number start end parent-field)))
+  "A field."
+  number
+  start end
+  parent-field
+  (mirrors '())
+  (transform nil)
+  (modified-p nil)
+  next)
+
+(defstruct (yas--mirror (:constructor yas--make-mirror (start end transform)))
+  "A mirror."
+  start end
+  (transform nil)
+  parent-field
+  next)
+
+(defstruct (yas--exit (:constructor yas--make-exit (marker)))
+  marker
+  next)
+
+(defun yas--apply-transform (field-or-mirror field &optional empty-on-nil-p)
+  "Calculate transformed string for FIELD-OR-MIRROR from FIELD.
+
+If there is no transform for ht field, return nil.
+
+If there is a transform but it returns nil, return the empty
+string iff EMPTY-ON-NIL-P is true."
+  (let* ((yas-text (yas--field-text-for-display field))
+         (text yas-text)
+         (yas-modified-p (yas--field-modified-p field))
+         (yas-moving-away-p nil)
+         (transform (if (yas--mirror-p field-or-mirror)
+                        (yas--mirror-transform field-or-mirror)
+                      (yas--field-transform field-or-mirror)))
+         (start-point (if (yas--mirror-p field-or-mirror)
+                          (yas--mirror-start field-or-mirror)
+                        (yas--field-start field-or-mirror)))
+         (transformed (and transform
+                           (save-excursion
+                             (goto-char start-point)
+                             (let ((ret (yas--eval-lisp transform)))
+                               (or ret (and empty-on-nil-p "")))))))
+    transformed))
+
+(defsubst yas--replace-all (from to &optional text)
+  "Replace all occurance from FROM to TO.
+
+With optional string TEXT do it in that string."
+  (if text
+      (replace-regexp-in-string (regexp-quote from) to text t t)
+    (goto-char (point-min))
+    (while (search-forward from nil t)
+      (replace-match to t t text))))
+
+(defun yas--snippet-find-field (snippet number)
+  (find-if #'(lambda (field)
+               (eq number (yas--field-number field)))
+           (yas--snippet-fields snippet)))
+
+(defun yas--snippet-sort-fields (snippet)
+  "Sort the fields of SNIPPET in navigation order."
+  (setf (yas--snippet-fields snippet)
+        (sort (yas--snippet-fields snippet)
+              #'yas--snippet-field-compare)))
+
+(defun yas--snippet-field-compare (field1 field2)
+  "Compare two fields. The field with a number is sorted first.
+If they both have a number, compare through the number. If neither
+have, compare through the field's start point"
+  (let ((n1 (yas--field-number field1))
+        (n2 (yas--field-number field2)))
+    (if n1
+        (if n2
+            (or (zerop n2) (and (not (zerop n1))
+                                (< n1 n2)))
+          (not (zerop n1)))
+      (if n2
+          (zerop n2)
+        (< (yas--field-start field1)
+           (yas--field-start field2))))))
+
+(defun yas--field-probably-deleted-p (snippet field)
+  "Guess if SNIPPET's FIELD should be skipped."
+  (and
+   ;; field must be zero lentgh
+   ;;
+   (zerop (- (yas--field-start field) (yas--field-end field)))
+   ;; skip if:
+   (or
+    ;;  1) is a nested field and it's been modified
+    ;;
+    (and (yas--field-parent-field field)
+         (yas--field-modified-p field))
+    ;;  2) ends just before the snippet end
+    ;;
+    (and (eq field (car (last (yas--snippet-fields snippet))))
+         (= (yas--field-start field) (overlay-end (yas--snippet-control-overlay snippet)))))
+   ;; the field numbered 0, just before the exit marker, should
+   ;; never be skipped
+   ;;
+   (not (zerop (yas--field-number field)))))
+
+(defun yas--snippets-at-point (&optional all-snippets)
+  "Return a sorted list of snippets at point, most recently
+inserted first."
+  (sort
+   (remove nil (remove-duplicates (mapcar #'(lambda (ov)
+                                              (overlay-get ov 'yas--snippet))
+                                          (if all-snippets
+                                              (overlays-in (point-min) (point-max))
+                                            (nconc (overlays-at (point)) (overlays-at (1- (point))))))))
+   #'(lambda (s1 s2)
+       (<= (yas--snippet-id s2) (yas--snippet-id s1)))))
+
+(defun yas-next-field-or-maybe-expand ()
+  "Try to expand a snippet at a key before point, otherwise
+delegate to `yas-next-field'."
+  (interactive)
+  (if yas-triggers-in-field
+      (let ((yas-fallback-behavior 'return-nil)
+            (active-field (overlay-get yas--active-field-overlay 'yas--field)))
+        (when active-field
+          (unless (yas-expand-from-trigger-key active-field)
+            (yas-next-field))))
+    (yas-next-field)))
+
+(defun yas-next-field (&optional arg)
+  "Navigate to next field.  If there's none, exit the snippet."
+  (interactive)
+  (let* ((arg (or arg
+                  1))
+         (snippet (first (yas--snippets-at-point)))
+         (active-field (overlay-get yas--active-field-overlay 'yas--field))
+         (live-fields (remove-if #'(lambda (field)
+                                     (and (not (eq field active-field))
+                                          (yas--field-probably-deleted-p snippet field)))
+                                 (yas--snippet-fields snippet)))
+         (active-field-pos (position active-field live-fields))
+         (target-pos (and active-field-pos (+ arg active-field-pos)))
+         (target-field (and target-pos (nth target-pos live-fields))))
+    ;; First check if we're moving out of a field with a transform
+    ;;
+    (when (and active-field
+               (yas--field-transform active-field))
+      (let* ((yas-moving-away-p t)
+             (yas-text (yas--field-text-for-display active-field))
+             (text yas-text)
+             (yas-modified-p (yas--field-modified-p active-field)))
+        ;; primary field transform: exit call to field-transform
+        (yas--eval-lisp (yas--field-transform active-field))))
+    ;; Now actually move...
+    (cond ((and target-pos (>= target-pos (length live-fields)))
+           (yas-exit-snippet snippet))
+          (target-field
+           (yas--move-to-field snippet target-field))
+          (t
+           nil))))
+
+(defun yas--place-overlays (snippet field)
+  "Correctly place overlays for SNIPPET's FIELD"
+  (yas--make-move-field-protection-overlays snippet field)
+  (yas--make-move-active-field-overlay snippet field))
+
+(defun yas--move-to-field (snippet field)
+  "Update SNIPPET to move to field FIELD.
+
+Also create some protection overlays"
+  (goto-char (yas--field-start field))
+  (yas--place-overlays snippet field)
+  (overlay-put yas--active-field-overlay 'yas--field field)
+  (let ((number (yas--field-number field)))
+    ;; check for the special ${0: ...} field
+    (if (and number (zerop number))
+        (progn
+          (set-mark (yas--field-end field))
+          (setf (yas--snippet-force-exit snippet)
+                (or (yas--field-transform field)
+                    t)))
+      ;; make this field active
+      (setf (yas--snippet-active-field snippet) field)
+      ;; primary field transform: first call to snippet transform
+      (unless (yas--field-modified-p field)
+        (if (yas--field-update-display field snippet)
+            (yas--update-mirrors snippet)
+          (setf (yas--field-modified-p field) nil))))))
+
+(defun yas-prev-field ()
+  "Navigate to prev field.  If there's none, exit the snippet."
+  (interactive)
+  (yas-next-field -1))
+
+(defun yas-abort-snippet (&optional snippet)
+  (interactive)
+  (let ((snippet (or snippet
+                     (car (yas--snippets-at-point)))))
+    (when snippet
+      (setf (yas--snippet-force-exit snippet) t))))
+
+(defun yas-exit-snippet (snippet)
+  "Goto exit-marker of SNIPPET."
+  (interactive (list (first (yas--snippets-at-point))))
+  (when snippet
+    (setf (yas--snippet-force-exit snippet) t)
+    (goto-char (if (yas--snippet-exit snippet)
+                   (yas--exit-marker (yas--snippet-exit snippet))
+                 (overlay-end (yas--snippet-control-overlay snippet))))))
+
+(defun yas-exit-all-snippets ()
+  "Exit all snippets."
+  (interactive)
+  (mapc #'(lambda (snippet)
+            (yas-exit-snippet snippet)
+            (yas--check-commit-snippet))
+        (yas--snippets-at-point 'all-snippets)))
+
+\f
+;;; Some low level snippet-routines:
+
+(defmacro yas--inhibit-overlay-hooks (&rest body)
+  "Run BODY with `yas--inhibit-overlay-hooks' set to t."
+  (declare (indent 0))
+  `(let ((yas--inhibit-overlay-hooks t))
+     (progn ,@body)))
+
+(defvar yas-snippet-beg nil "Beginning position of the last snippet commited.")
+(defvar yas-snippet-end nil "End position of the last snippet commited.")
+
+(defun yas--commit-snippet (snippet)
+  "Commit SNIPPET, but leave point as it is.  This renders the
+snippet as ordinary text."
+
+  (let ((control-overlay (yas--snippet-control-overlay snippet)))
+    ;;
+    ;; Save the end of the moribund snippet in case we need to revive it
+    ;; its original expansion.
+    ;;
+    (when (and control-overlay
+               (overlay-buffer control-overlay))
+      (setq yas-snippet-beg (overlay-start control-overlay))
+      (setq yas-snippet-end (overlay-end control-overlay))
+      (delete-overlay control-overlay))
+
+    (yas--inhibit-overlay-hooks
+      (when yas--active-field-overlay
+        (delete-overlay yas--active-field-overlay))
+      (when yas--field-protection-overlays
+        (mapc #'delete-overlay yas--field-protection-overlays)))
+
+    ;; stacked expansion: if the original expansion took place from a
+    ;; field, make sure we advance it here at least to
+    ;; `yas-snippet-end'...
+    ;;
+    (let ((previous-field (yas--snippet-previous-active-field snippet)))
+      (when (and yas-snippet-end previous-field)
+        (yas--advance-end-maybe previous-field yas-snippet-end)))
+
+    ;; Convert all markers to points,
+    ;;
+    (yas--markers-to-points snippet)
+
+    ;; Take care of snippet revival
+    ;;
+    (if yas-snippet-revival
+        (push `(apply yas--snippet-revive ,yas-snippet-beg ,yas-snippet-end ,snippet)
+              buffer-undo-list)
+      ;; Dismember the snippet... this is useful if we get called
+      ;; again from `yas--take-care-of-redo'....
+      (setf (yas--snippet-fields snippet) nil)))
+
+  (yas--message 3 "Snippet %s exited." (yas--snippet-id snippet)))
+
+(defun yas--safely-run-hooks (hook-var)
+  (condition-case error
+      (run-hooks hook-var)
+    (error
+     (yas--message 3 "%s error: %s" hook-var (error-message-string error)))))
+
+
+(defun yas--check-commit-snippet ()
+  "Checks if point exited the currently active field of the
+snippet, if so cleans up the whole snippet up."
+  (let* ((snippets (yas--snippets-at-point 'all-snippets))
+         (snippets-left snippets)
+         (snippet-exit-transform))
+    (dolist (snippet snippets)
+      (let ((active-field (yas--snippet-active-field snippet)))
+        (setq snippet-exit-transform (yas--snippet-force-exit snippet))
+        (cond ((or snippet-exit-transform
+                   (not (and active-field (yas--field-contains-point-p active-field))))
+               (setq snippets-left (delete snippet snippets-left))
+               (setf (yas--snippet-force-exit snippet) nil)
+               (yas--commit-snippet snippet))
+              ((and active-field
+                    (or (not yas--active-field-overlay)
+                        (not (overlay-buffer yas--active-field-overlay))))
+               ;;
+               ;; stacked expansion: this case is mainly for recent
+               ;; snippet exits that place us back int the field of
+               ;; another snippet
+               ;;
+               (save-excursion
+                 (yas--move-to-field snippet active-field)
+                 (yas--update-mirrors snippet)))
+              (t
+               nil))))
+    (unless (or (null snippets) snippets-left)
+      (if snippet-exit-transform
+          (yas--eval-lisp-no-saves snippet-exit-transform))
+      (yas--safely-run-hooks 'yas-after-exit-snippet-hook))))
+
+;; Apropos markers-to-points:
+;;
+;; This was found useful for performance reasons, so that an
+;; excessive number of live markers aren't kept around in the
+;; `buffer-undo-list'. However, in `markers-to-points', the
+;; set-to-nil markers can't simply be discarded and replaced with
+;; fresh ones in `points-to-markers'. The original marker that was
+;; just set to nil has to be reused.
+;;
+;; This shouldn't bring horrible problems with undo/redo, but it
+;; you never know
+;;
+(defun yas--markers-to-points (snippet)
+  "Convert all markers in SNIPPET to a cons (POINT . MARKER)
+where POINT is the original position of the marker and MARKER is
+the original marker object with the position set to nil."
+  (dolist (field (yas--snippet-fields snippet))
+    (let ((start (marker-position (yas--field-start field)))
+          (end (marker-position (yas--field-end field))))
+      (set-marker (yas--field-start field) nil)
+      (set-marker (yas--field-end field) nil)
+      (setf (yas--field-start field) (cons start (yas--field-start field)))
+      (setf (yas--field-end field) (cons end (yas--field-end field))))
+    (dolist (mirror (yas--field-mirrors field))
+      (let ((start (marker-position (yas--mirror-start mirror)))
+            (end (marker-position (yas--mirror-end mirror))))
+        (set-marker (yas--mirror-start mirror) nil)
+        (set-marker (yas--mirror-end mirror) nil)
+        (setf (yas--mirror-start mirror) (cons start (yas--mirror-start mirror)))
+        (setf (yas--mirror-end mirror) (cons end (yas--mirror-end mirror))))))
+  (let ((snippet-exit (yas--snippet-exit snippet)))
+    (when snippet-exit
+      (let ((exit (marker-position (yas--exit-marker snippet-exit))))
+        (set-marker (yas--exit-marker snippet-exit) nil)
+        (setf (yas--exit-marker snippet-exit) (cons exit (yas--exit-marker snippet-exit)))))))
+
+(defun yas--points-to-markers (snippet)
+  "Convert all cons (POINT . MARKER) in SNIPPET to markers. This
+is done by setting MARKER to POINT with `set-marker'."
+  (dolist (field (yas--snippet-fields snippet))
+    (setf (yas--field-start field) (set-marker (cdr (yas--field-start field))
+                                              (car (yas--field-start field))))
+    (setf (yas--field-end field) (set-marker (cdr (yas--field-end field))
+                                            (car (yas--field-end field))))
+    (dolist (mirror (yas--field-mirrors field))
+      (setf (yas--mirror-start mirror) (set-marker (cdr (yas--mirror-start mirror))
+                                                  (car (yas--mirror-start mirror))))
+      (setf (yas--mirror-end mirror) (set-marker (cdr (yas--mirror-end mirror))
+                                                (car (yas--mirror-end mirror))))))
+  (let ((snippet-exit (yas--snippet-exit snippet)))
+    (when snippet-exit
+      (setf (yas--exit-marker snippet-exit) (set-marker (cdr (yas--exit-marker snippet-exit))
+                                                       (car (yas--exit-marker snippet-exit)))))))
+
+(defun yas--field-contains-point-p (field &optional point)
+  (let ((point (or point
+                   (point))))
+    (and (>= point (yas--field-start field))
+         (<= point (yas--field-end field)))))
+
+(defun yas--field-text-for-display (field)
+  "Return the propertized display text for field FIELD.  "
+  (buffer-substring (yas--field-start field) (yas--field-end field)))
+
+(defun yas--undo-in-progress ()
+  "True if some kind of undo is in progress"
+  (or undo-in-progress
+      (eq this-command 'undo)
+      (eq this-command 'redo)))
+
+(defun yas--make-control-overlay (snippet start end)
+  "Creates the control overlay that surrounds the snippet and
+holds the keymap."
+  (let ((overlay (make-overlay start
+                               end
+                               nil
+                               nil
+                               t)))
+    (overlay-put overlay 'keymap yas-keymap)
+    (overlay-put overlay 'priority 100)
+    (overlay-put overlay 'yas--snippet snippet)
+    overlay))
+
+(defun yas-skip-and-clear-or-delete-char (&optional field)
+  "Clears unmodified field if at field start, skips to next tab.
+
+Otherwise deletes a character normally by calling `delete-char'."
+  (interactive)
+  (let ((field (or field
+                   (and yas--active-field-overlay
+                        (overlay-buffer yas--active-field-overlay)
+                        (overlay-get yas--active-field-overlay 'yas--field)))))
+    (cond ((and field
+                (not (yas--field-modified-p field))
+                (eq (point) (marker-position (yas--field-start field))))
+           (yas--skip-and-clear field)
+           (yas-next-field 1))
+          (t
+           (call-interactively 'delete-char)))))
+
+(defun yas--skip-and-clear (field)
+  "Deletes the region of FIELD and sets it modified state to t"
+  ;; Just before skipping-and-clearing the field, mark its children
+  ;; fields as modified, too. If the childen have mirrors-in-fields
+  ;; this prevents them from updating erroneously (we're skipping and
+  ;; deleting!).
+  ;;
+  (yas--mark-this-and-children-modified field)
+  (delete-region (yas--field-start field) (yas--field-end field)))
+
+(defun yas--mark-this-and-children-modified (field)
+  (setf (yas--field-modified-p field) t)
+  (let ((fom (yas--field-next field)))
+    (while (and fom
+                (yas--fom-parent-field fom))
+      (when (and (eq (yas--fom-parent-field fom) field)
+                 (yas--field-p fom))
+        (yas--mark-this-and-children-modified fom))
+      (setq fom (yas--fom-next fom)))))
+
+(defun yas--make-move-active-field-overlay (snippet field)
+  "Place the active field overlay in SNIPPET's FIELD.
+
+Move the overlay, or create it if it does not exit."
+  (if (and yas--active-field-overlay
+           (overlay-buffer yas--active-field-overlay))
+      (move-overlay yas--active-field-overlay
+                    (yas--field-start field)
+                    (yas--field-end field))
+    (setq yas--active-field-overlay
+          (make-overlay (yas--field-start field)
+                        (yas--field-end field)
+                        nil nil t))
+    (overlay-put yas--active-field-overlay 'priority 100)
+    (overlay-put yas--active-field-overlay 'face 'yas-field-highlight-face)
+    (overlay-put yas--active-field-overlay 'yas--snippet snippet)
+    (overlay-put yas--active-field-overlay 'modification-hooks '(yas--on-field-overlay-modification))
+    (overlay-put yas--active-field-overlay 'insert-in-front-hooks
+                 '(yas--on-field-overlay-modification))
+    (overlay-put yas--active-field-overlay 'insert-behind-hooks
+                 '(yas--on-field-overlay-modification))))
+
+(defvar yas--inhibit-overlay-hooks nil
+  "Bind this temporarity to non-nil to prevent running `yas--on-*-modification'.")
+
+(defun yas--on-field-overlay-modification (overlay after? beg end &optional length)
+  "Clears the field and updates mirrors, conditionally.
+
+Only clears the field if it hasn't been modified and it point it
+at field start. This hook doesn't do anything if an undo is in
+progress."
+  (unless (or yas--inhibit-overlay-hooks
+              (yas--undo-in-progress))
+    (let* ((field (overlay-get overlay 'yas--field))
+           (number (and field (yas--field-number field)))
+           (snippet (overlay-get yas--active-field-overlay 'yas--snippet)))
+      (cond (after?
+             (yas--advance-end-maybe field (overlay-end overlay))
+             (save-excursion
+               (yas--field-update-display field snippet))
+             (yas--update-mirrors snippet))
+            (field
+             (when (and (not after?)
+                        (not (yas--field-modified-p field))
+                        (eq (point) (if (markerp (yas--field-start field))
+                                        (marker-position (yas--field-start field))
+                                      (yas--field-start field))))
+               (yas--skip-and-clear field))
+             (setf (yas--field-modified-p field) t))))))
+\f
+;;; Apropos protection overlays:
+;;
+;; These exist for nasty users who will try to delete parts of the
+;; snippet outside the active field. Actual protection happens in
+;; `yas--on-protection-overlay-modification'.
+;;
+;; Currently this signals an error which inhibits the command. For
+;; commands that move point (like `kill-line'), point is restored in
+;; the `yas--post-command-handler' using a global
+;; `yas--protection-violation' variable.
+;;
+;; Alternatively, I've experimented with an implementation that
+;; commits the snippet before actually calling `this-command'
+;; interactively, and then signals an eror, which is ignored. but
+;; blocks all other million modification hooks. This presented some
+;; problems with stacked expansion.
+;;
+(defun yas--make-move-field-protection-overlays (snippet field)
+  "Place protection overlays surrounding SNIPPET's FIELD.
+
+Move the overlays, or create them if they do not exit."
+  (let ((start (yas--field-start field))
+        (end (yas--field-end field)))
+    ;; First check if the (1+ end) is contained in the buffer,
+    ;; otherwise we'll have to do a bit of cheating and silently
+    ;; insert a newline. the `(1+ (buffer-size))' should prevent this
+    ;; when using stacked expansion
+    ;;
+    (when (< (buffer-size) end)
+      (save-excursion
+        (yas--inhibit-overlay-hooks
+          (goto-char (point-max))
+          (newline))))
+    ;; go on to normal overlay creation/moving
+    ;;
+    (cond ((and yas--field-protection-overlays
+                (every #'overlay-buffer yas--field-protection-overlays))
+           (move-overlay (first yas--field-protection-overlays) (1- start) start)
+           (move-overlay (second yas--field-protection-overlays) end (1+ end)))
+          (t
+           (setq yas--field-protection-overlays
+                 (list (make-overlay (1- start) start nil t nil)
+                       (make-overlay end (1+ end) nil t nil)))
+           (dolist (ov yas--field-protection-overlays)
+             (overlay-put ov 'face 'yas--field-debug-face)
+             (overlay-put ov 'yas--snippet snippet)
+             ;; (overlay-put ov 'evaporate t)
+             (overlay-put ov 'modification-hooks '(yas--on-protection-overlay-modification)))))))
+
+(defvar yas--protection-violation nil
+  "When non-nil, signals attempts to erronesly exit or modify the snippet.
+
+Functions in the `post-command-hook', for example
+`yas--post-command-handler' can check it and reset its value to
+nil. The variables value is the point where the violation
+originated")
+
+(defun yas--on-protection-overlay-modification (overlay after? beg end &optional length)
+  "Signals a snippet violation, then issues error.
+
+The error should be ignored in `debug-ignored-errors'"
+  (unless yas--inhibit-overlay-hooks
+    (cond ((not (or after?
+                    (yas--undo-in-progress)))
+           (setq yas--protection-violation (point))
+           (error "Exit the snippet first!")))))
+
+(add-to-list 'debug-ignored-errors "^Exit the snippet first!$")
+
+\f
+;; Snippet expansion and "stacked" expansion:
+;;
+;; Stacked expansion is when you try to expand a snippet when already
+;; inside a snippet expansion.
+;;
+;; The parent snippet does not run its fields modification hooks
+;; (`yas--on-field-overlay-modification' and
+;; `yas--on-protection-overlay-modification') while the child snippet
+;; is active. This means, among other things, that the mirrors of the
+;; parent snippet are not updated, this only happening when one exits
+;; the child snippet.
+;;
+;; Unfortunately, this also puts some ugly (and not fully-tested)
+;; bits of code in `yas-expand-snippet' and
+;; `yas--commit-snippet'. I've tried to mark them with "stacked
+;; expansion:".
+;;
+;; This was thought to be safer in in an undo/redo perpective, but
+;; maybe the correct implementation is to make the globals
+;; `yas--active-field-overlay' and `yas--field-protection-overlays' be
+;; snippet-local and be active even while the child snippet is
+;; running. This would mean a lot of overlay modification hooks
+;; running, but if managed correctly (including overlay priorities)
+;; they should account for all situations...
+;;
+(defun yas-expand-snippet (content &optional start end expand-env)
+  "Expand snippet CONTENT at current point.
+
+Text between START and END will be deleted before inserting
+template. EXPAND-ENV is are let-style variable to value bindings
+considered when expanding the snippet."
+  (run-hooks 'yas-before-expand-snippet-hook)
+
+  ;; If a region is active, set `yas-selected-text'
+  (setq yas-selected-text
+        (when (region-active-p)
+          (prog1 (buffer-substring-no-properties (region-beginning)
+                                                 (region-end))
+            (unless start (setq start (region-beginning))
+                    (unless end (setq end (region-end)))))))
+
+  (when start
+    (goto-char start))
+
+  ;;
+  (let ((to-delete (and start end (buffer-substring-no-properties start end)))
+        (start (or start (point)))
+        (end (or end (point)))
+        snippet)
+    (setq yas--indent-original-column (current-column))
+    ;; Delete the region to delete, this *does* get undo-recorded.
+    ;;
+    (when (and to-delete
+               (> end start))
+      (delete-region start end))
+
+    (cond ((listp content)
+           ;; x) This is a snippet-command
+           ;;
+           (yas--eval-lisp-no-saves content))
+          (t
+           ;; x) This is a snippet-snippet :-)
+           ;;
+           ;;    Narrow the region down to the content, shoosh the
+           ;;    `buffer-undo-list', and create the snippet, the new
+           ;;    snippet updates its mirrors once, so we are left with
+           ;;    some plain text.  The undo action for deleting this
+           ;;    plain text will get recorded at the end.
+           ;;
+           ;;    stacked expansion: also shoosh the overlay modification hooks
+           (save-restriction
+             (narrow-to-region start start)
+             (let ((buffer-undo-list t))
+               ;; snippet creation might evaluate users elisp, which
+               ;; might generate errors, so we have to be ready to catch
+               ;; them mostly to make the undo information
+               ;;
+               (setq yas--start-column (save-restriction (widen) (current-column)))
+               (yas--inhibit-overlay-hooks
+                 (setq snippet
+                       (if expand-env
+                           (eval `(let* ,expand-env
+                                    (insert content)
+                                    (yas--snippet-create (point-min) (point-max))))
+                         (insert content)
+                         (yas--snippet-create (point-min) (point-max)))))))
+
+           ;; stacked-expansion: This checks for stacked expansion, save the
+           ;; `yas--previous-active-field' and advance its boudary.
+           ;;
+           (let ((existing-field (and yas--active-field-overlay
+                                      (overlay-buffer yas--active-field-overlay)
+                                      (overlay-get yas--active-field-overlay 'yas--field))))
+             (when existing-field
+               (setf (yas--snippet-previous-active-field snippet) existing-field)
+               (yas--advance-end-maybe existing-field (overlay-end yas--active-field-overlay))))
+
+           ;; Exit the snippet immediately if no fields
+           ;;
+           (unless (yas--snippet-fields snippet)
+             (yas-exit-snippet snippet))
+
+           ;; Push two undo actions: the deletion of the inserted contents of
+           ;; the new snippet (without the "key") followed by an apply of
+           ;; `yas--take-care-of-redo' on the newly inserted snippet boundaries
+           ;;
+           ;; A small exception, if `yas-also-auto-indent-first-line'
+           ;; is t and `yas--indent' decides to indent the line to a
+           ;; point before the actual expansion point, undo would be
+           ;; messed up. We call the early point "newstart"".  case,
+           ;; and attempt to fix undo.
+           ;;
+           (let ((newstart (overlay-start (yas--snippet-control-overlay snippet)))
+                 (end (overlay-end (yas--snippet-control-overlay snippet))))
+             (when (< newstart start)
+               (push (cons (make-string (- start newstart) ? ) newstart) buffer-undo-list))
+             (push (cons newstart end) buffer-undo-list)
+             (push `(apply yas--take-care-of-redo ,start ,end ,snippet)
+                   buffer-undo-list))
+           ;; Now, schedule a move to the first field
+           ;;
+           (let ((first-field (car (yas--snippet-fields snippet))))
+             (when first-field
+               (sit-for 0) ;; fix issue 125
+               (yas--move-to-field snippet first-field)))
+           (yas--message 3 "snippet expanded.")
+           t))))
+
+(defun yas--take-care-of-redo (beg end snippet)
+  "Commits SNIPPET, which in turn pushes an undo action for
+reviving it.
+
+Meant to exit in the `buffer-undo-list'."
+  ;; slightly optimize: this action is only needed for snippets with
+  ;; at least one field
+  (when (yas--snippet-fields snippet)
+    (yas--commit-snippet snippet)))
+
+(defun yas--snippet-revive (beg end snippet)
+  "Revives the SNIPPET and creates a control overlay from BEG to
+END.
+
+BEG and END are, we hope, the original snippets boudaries. All
+the markers/points exiting existing inside SNIPPET should point
+to their correct locations *at the time the snippet is revived*.
+
+After revival, push the `yas--take-care-of-redo' in the
+`buffer-undo-list'"
+  ;; Reconvert all the points to markers
+  ;;
+  (yas--points-to-markers snippet)
+  ;; When at least one editable field existed in the zombie snippet,
+  ;; try to revive the whole thing...
+  ;;
+  (let ((target-field (or (yas--snippet-active-field snippet)
+                          (car (yas--snippet-fields snippet)))))
+    (when target-field
+      (setf (yas--snippet-control-overlay snippet) (yas--make-control-overlay snippet beg end))
+      (overlay-put (yas--snippet-control-overlay snippet) 'yas--snippet snippet)
+
+      (yas--move-to-field snippet target-field)
+
+      (push `(apply yas--take-care-of-redo ,beg ,end ,snippet)
+            buffer-undo-list))))
+
+(defun yas--snippet-create (begin end)
+  "Creates a snippet from an template inserted between BEGIN and END.
+
+Returns the newly created snippet."
+  (let ((snippet (yas--make-snippet)))
+    (goto-char begin)
+    (yas--snippet-parse-create snippet)
+
+    ;; Sort and link each field
+    (yas--snippet-sort-fields snippet)
+
+    ;; Create keymap overlay for snippet
+    (setf (yas--snippet-control-overlay snippet)
+          (yas--make-control-overlay snippet (point-min) (point-max)))
+
+    ;; Move to end
+    (goto-char (point-max))
+
+    snippet))
+
+\f
+;;; Apropos adjacencies and "fom's":
+;;
+;; Once the $-constructs bits like "$n" and "${:n" are deleted in the
+;; recently expanded snippet, we might actually have many fields,
+;; mirrors (and the snippet exit) in the very same position in the
+;; buffer. Therefore we need to single-link the
+;; fields-or-mirrors-or-exit (which I have abbreviated to "fom")
+;; according to their original positions in the buffer.
+;;
+;; Then we have operation `yas--advance-end-maybe' and
+;; `yas--advance-start-maybe', which conditionally push the starts and
+;; ends of these foms down the chain.
+;;
+;; This allows for like the printf with the magic ",":
+;;
+;;   printf ("${1:%s}\\n"${1:$(if (string-match "%" text) "," "\);")}  \
+;;   $2${1:$(if (string-match "%" text) "\);" "")}$0
+;;
+(defun yas--fom-start (fom)
+  (cond ((yas--field-p fom)
+         (yas--field-start fom))
+        ((yas--mirror-p fom)
+         (yas--mirror-start fom))
+        (t
+         (yas--exit-marker fom))))
+
+(defun yas--fom-end (fom)
+  (cond ((yas--field-p fom)
+         (yas--field-end fom))
+        ((yas--mirror-p fom)
+         (yas--mirror-end fom))
+        (t
+         (yas--exit-marker fom))))
+
+(defun yas--fom-next (fom)
+  (cond ((yas--field-p fom)
+         (yas--field-next fom))
+        ((yas--mirror-p fom)
+         (yas--mirror-next fom))
+        (t
+         (yas--exit-next fom))))
+
+(defun yas--fom-parent-field (fom)
+  (cond ((yas--field-p fom)
+         (yas--field-parent-field fom))
+        ((yas--mirror-p fom)
+         (yas--mirror-parent-field fom))
+        (t
+         nil)))
+
+(defun yas--calculate-adjacencies (snippet)
+  "Calculate adjacencies for fields or mirrors of SNIPPET.
+
+This is according to their relative positions in the buffer, and
+has to be called before the $-constructs are deleted."
+  (flet ((yas--fom-set-next-fom (fom nextfom)
+                               (cond ((yas--field-p fom)
+                                      (setf (yas--field-next fom) nextfom))
+                                     ((yas--mirror-p fom)
+                                      (setf (yas--mirror-next fom) nextfom))
+                                     (t
+                                      (setf (yas--exit-next fom) nextfom))))
+         (yas--compare-fom-begs (fom1 fom2)
+                               (if (= (yas--fom-start fom2) (yas--fom-start fom1))
+                                   (yas--mirror-p fom2)
+                                 (>= (yas--fom-start fom2) (yas--fom-start fom1))))
+         (yas--link-foms (fom1 fom2)
+                        (yas--fom-set-next-fom fom1 fom2)))
+    ;; make some yas--field, yas--mirror and yas--exit soup
+    (let ((soup))
+      (when (yas--snippet-exit snippet)
+        (push (yas--snippet-exit snippet) soup))
+      (dolist (field (yas--snippet-fields snippet))
+        (push field soup)
+        (dolist (mirror (yas--field-mirrors field))
+          (push mirror soup)))
+      (setq soup
+            (sort soup
+                  #'yas--compare-fom-begs))
+      (when soup
+        (reduce #'yas--link-foms soup)))))
+
+(defun yas--calculate-mirrors-in-fields (snippet mirror)
+  "Attempt to assign a parent field of SNIPPET to the mirror MIRROR.
+
+Use the tighest containing field if more than one field contains
+the mirror. Intended to be called *before* the dollar-regions are
+deleted."
+  (let ((min (point-min))
+        (max (point-max)))
+    (dolist (field (yas--snippet-fields snippet))
+      (when (and (<= (yas--field-start field) (yas--mirror-start mirror))
+                 (<= (yas--mirror-end mirror) (yas--field-end field))
+               (< min (yas--field-start field))
+               (< (yas--field-end field) max))
+          (setq min (yas--field-start field)
+                max (yas--field-end field))
+          (setf (yas--mirror-parent-field mirror) field)))))
+
+(defun yas--advance-end-maybe (fom newend)
+  "Maybe advance FOM's end to NEWEND if it needs it.
+
+If it does, also:
+
+* call `yas--advance-start-maybe' on FOM's next fom.
+
+* in case FOM is field call `yas--advance-end-maybe' on its parent
+  field
+
+Also, if FOM is an exit-marker, always call
+`yas--advance-start-maybe' on its next fom. This is beacuse
+exit-marker have identical start and end markers.
+
+"
+  (cond ((and fom (< (yas--fom-end fom) newend))
+         (set-marker (yas--fom-end fom) newend)
+         (yas--advance-start-maybe (yas--fom-next fom) newend)
+         (yas--advance-end-of-parents-maybe (yas--fom-parent-field fom) newend))
+        ((yas--exit-p fom)
+         (yas--advance-start-maybe (yas--fom-next fom) newend))))
+
+(defun yas--advance-start-maybe (fom newstart)
+  "Maybe advance FOM's start to NEWSTART if it needs it.
+
+If it does, also call `yas--advance-end-maybe' on FOM."
+  (when (and fom (< (yas--fom-start fom) newstart))
+    (set-marker (yas--fom-start fom) newstart)
+    (yas--advance-end-maybe fom newstart)))
+
+(defun yas--advance-end-of-parents-maybe (field newend)
+  "Like `yas--advance-end-maybe' but for parent fields.
+
+Only works for fields and doesn't care about the start of the
+next FOM. Works its way up recursively for parents of parents."
+  (when (and field
+             (< (yas--field-end field) newend))
+    (set-marker (yas--field-end field) newend)
+    (yas--advance-end-of-parents-maybe (yas--field-parent-field field) newend)))
+
+(defvar yas--dollar-regions nil
+  "When expanding the snippet the \"parse-create\" functions add
+  cons cells to this var")
+
+(defun yas--snippet-parse-create (snippet)
+  "Parse a recently inserted snippet template, creating all
+necessary fields, mirrors and exit points.
+
+Meant to be called in a narrowed buffer, does various passes"
+  (let ((parse-start (point)))
+    ;; Reset the yas--dollar-regions
+    ;;
+    (setq yas--dollar-regions nil)
+    ;; protect escaped quote, backquotes and backslashes
+    ;;
+    (yas--protect-escapes nil `(?\\ ?` ?'))
+    ;; replace all backquoted expressions
+    ;;
+    (goto-char parse-start)
+    (yas--replace-backquotes)
+    ;; protect escapes again since previous steps might have generated
+    ;; more characters needing escaping
+    ;;
+    (goto-char parse-start)
+    (yas--protect-escapes)
+    ;; parse fields with {}
+    ;;
+    (goto-char parse-start)
+    (yas--field-parse-create snippet)
+    ;; parse simple mirrors and fields
+    ;;
+    (goto-char parse-start)
+    (yas--simple-mirror-parse-create snippet)
+    ;; parse mirror transforms
+    ;;
+    (goto-char parse-start)
+    (yas--transform-mirror-parse-create snippet)
+    ;; calculate adjacencies of fields and mirrors
+    ;;
+    (yas--calculate-adjacencies snippet)
+    ;; Delete $-constructs
+    ;;
+    (yas--delete-regions yas--dollar-regions)
+    ;; restore escapes
+    ;;
+    (goto-char parse-start)
+    (yas--restore-escapes)
+    ;; update mirrors for the first time
+    ;;
+    (yas--update-mirrors snippet)
+    ;; indent the best we can
+    ;;
+    (goto-char parse-start)
+    (yas--indent snippet)))
+
+(defun yas--indent-according-to-mode (snippet-markers)
+  "Indent current line according to mode, preserving
+SNIPPET-MARKERS."
+  ;;; Apropos indenting problems....
+  ;;
+  ;; `indent-according-to-mode' uses whatever `indent-line-function'
+  ;; is available. Some implementations of these functions delete text
+  ;; before they insert. If there happens to be a marker just after
+  ;; the text being deleted, the insertion actually happens after the
+  ;; marker, which misplaces it.
+  ;;
+  ;; This would also happen if we had used overlays with the
+  ;; `front-advance' property set to nil.
+  ;;
+  ;; This is why I have these `trouble-markers', they are the ones at
+  ;; they are the ones at the first non-whitespace char at the line
+  ;; (i.e. at `yas--real-line-beginning'. After indentation takes place
+  ;; we should be at the correct to restore them to. All other
+  ;; non-trouble-markers have been *pushed* and don't need special
+  ;; attention.
+  ;;
+  (goto-char (yas--real-line-beginning))
+  (let ((trouble-markers (remove-if-not #'(lambda (marker)
+                                            (= marker (point)))
+                                        snippet-markers)))
+    (save-restriction
+      (widen)
+      (condition-case err
+          (indent-according-to-mode)
+        (error (yas--message 3 "Warning: `yas--indent-according-to-mode' having problems running %s" indent-line-function)
+               nil)))
+    (mapc #'(lambda (marker)
+              (set-marker marker (point)))
+          trouble-markers)))
+
+(defvar yas--indent-original-column nil)
+(defun yas--indent (snippet)
+  (let ((snippet-markers (yas--collect-snippet-markers snippet)))
+    ;; Look for those $>
+    (save-excursion
+      (while (re-search-forward "$>" nil t)
+        (delete-region (match-beginning 0) (match-end 0))
+        (when (not (eq yas-indent-line 'auto))
+          (yas--indent-according-to-mode snippet-markers))))
+    ;; Now do stuff for 'fixed and 'auto
+    (save-excursion
+      (cond ((eq yas-indent-line 'fixed)
+             (while (and (zerop (forward-line))
+                         (zerop (current-column)))
+               (indent-to-column yas--indent-original-column)))
+            ((eq yas-indent-line 'auto)
+             (let ((end (set-marker (make-marker) (point-max)))
+                   (indent-first-line-p yas-also-auto-indent-first-line))
+               (while (and (zerop (if indent-first-line-p
+                                      (prog1
+                                          (forward-line 0)
+                                        (setq indent-first-line-p nil))
+                                    (forward-line 1)))
+                           (not (eobp))
+                           (<= (point) end))
+                 (yas--indent-according-to-mode snippet-markers))))
+            (t
+             nil)))))
+
+(defun yas--collect-snippet-markers (snippet)
+  "Make a list of all the markers used by SNIPPET."
+  (let (markers)
+    (dolist (field (yas--snippet-fields snippet))
+      (push (yas--field-start field) markers)
+      (push (yas--field-end field) markers)
+      (dolist (mirror (yas--field-mirrors field))
+        (push (yas--mirror-start mirror) markers)
+        (push (yas--mirror-end mirror) markers)))
+    (let ((snippet-exit (yas--snippet-exit snippet)))
+      (when (and snippet-exit
+                 (marker-buffer (yas--exit-marker snippet-exit)))
+        (push (yas--exit-marker snippet-exit) markers)))
+    markers))
+
+(defun yas--real-line-beginning ()
+  (let ((c (char-after (line-beginning-position)))
+        (n (line-beginning-position)))
+    (while (or (eql c ?\ )
+               (eql c ?\t))
+      (incf n)
+      (setq c (char-after n)))
+    n))
+
+(defun yas--escape-string (escaped)
+  (concat "YASESCAPE" (format "%d" escaped) "PROTECTGUARD"))
+
+(defun yas--protect-escapes (&optional text escaped)
+  "Protect all escaped characters with their numeric ASCII value.
+
+With optional string TEXT do it in string instead of buffer."
+  (let ((changed-text text)
+        (text-provided-p text))
+    (mapc #'(lambda (escaped)
+              (setq changed-text
+                    (yas--replace-all (concat "\\" (char-to-string escaped))
+                                     (yas--escape-string escaped)
+                                     (when text-provided-p changed-text))))
+          (or escaped yas--escaped-characters))
+    changed-text))
+
+(defun yas--restore-escapes (&optional text escaped)
+  "Restore all escaped characters from their numeric ASCII value.
+
+With optional string TEXT do it in string instead of the buffer."
+  (let ((changed-text text)
+        (text-provided-p text))
+    (mapc #'(lambda (escaped)
+              (setq changed-text
+                    (yas--replace-all (yas--escape-string escaped)
+                                     (char-to-string escaped)
+                                     (when text-provided-p changed-text))))
+          (or escaped yas--escaped-characters))
+    changed-text))
+
+(defun yas--replace-backquotes ()
+  "Replace all the \"`(lisp-expression)`\"-style expression
+       with their evaluated value"
+  (while (re-search-forward yas--backquote-lisp-expression-regexp nil t)
+    (let ((current-string (match-string 1)) transformed)
+      (delete-region (match-beginning 0) (match-end 0))
+      (setq transformed (yas--eval-lisp (yas--read-lisp (yas--restore-escapes current-string))))
+      (goto-char (match-beginning 0))
+      (when transformed (insert transformed)))))
+
+(defun yas--scan-sexps (from count)
+  (condition-case err
+      (with-syntax-table (standard-syntax-table)
+        (scan-sexps from count))
+    (error
+     nil)))
+
+(defun yas--make-marker (pos)
+  "Create a marker at POS with `nil' `marker-insertion-type'"
+  (let ((marker (set-marker (make-marker) pos)))
+    (set-marker-insertion-type marker nil)
+    marker))
+
+(defun yas--field-parse-create (snippet &optional parent-field)
+  "Parse most field expressions, except for the simple one \"$n\".
+
+The following count as a field:
+
+* \"${n: text}\", for a numbered field with default text, as long as N is not 0;
+
+* \"${n: text$(expression)}, the same with a lisp expression;
+  this is caught with the curiously named `yas--multi-dollar-lisp-expression-regexp'
+
+* the same as above but unnumbered, (no N:) and number is calculated automatically.
+
+When multiple expressions are found, only the last one counts."
+  ;;
+  (save-excursion
+    (while (re-search-forward yas--field-regexp nil t)
+      (let* ((real-match-end-0 (yas--scan-sexps (1+ (match-beginning 0)) 1))
+             (number (and (match-string-no-properties 1)
+                          (string-to-number (match-string-no-properties 1))))
+             (brand-new-field (and real-match-end-0
+                                   ;; break if on "$(" immediately
+                                   ;; after the ":", this will be
+                                   ;; caught as a mirror with
+                                   ;; transform later.
+                                   (not (save-match-data
+                                          (eq (string-match "$[ \t\n]*("
+                                                            (match-string-no-properties 2)) 0)))
+                                   ;; allow ${0: some exit text}
+                                   ;; (not (and number (zerop number)))
+                                   (yas--make-field number
+                                                   (yas--make-marker (match-beginning 2))
+                                                   (yas--make-marker (1- real-match-end-0))
+                                                   parent-field))))
+        (when brand-new-field
+          (goto-char real-match-end-0)
+          (push (cons (1- real-match-end-0) real-match-end-0)
+                yas--dollar-regions)
+          (push (cons (match-beginning 0) (match-beginning 2))
+                yas--dollar-regions)
+          (push brand-new-field (yas--snippet-fields snippet))
+          (save-excursion
+            (save-restriction
+              (narrow-to-region (yas--field-start brand-new-field) (yas--field-end brand-new-field))
+              (goto-char (point-min))
+              (yas--field-parse-create snippet brand-new-field)))))))
+  ;; if we entered from a parent field, now search for the
+  ;; `yas--multi-dollar-lisp-expression-regexp'. THis is used for
+  ;; primary field transformations
+  ;;
+  (when parent-field
+    (save-excursion
+      (while (re-search-forward yas--multi-dollar-lisp-expression-regexp nil t)
+        (let* ((real-match-end-1 (yas--scan-sexps (match-beginning 1) 1)))
+          ;; commit the primary field transformation if:
+          ;;
+          ;; 1. we don't find it in yas--dollar-regions (a subnested
+          ;; field) might have already caught it.
+          ;;
+          ;; 2. we really make sure we have either two '$' or some
+          ;; text and a '$' after the colon ':'. This is a FIXME: work
+          ;; my regular expressions and end these ugly hacks.
+          ;;
+          (when (and real-match-end-1
+                     (not (member (cons (match-beginning 0)
+                                        real-match-end-1)
+                                  yas--dollar-regions))
+                     (not (eq ?:
+                              (char-before (1- (match-beginning 1))))))
+            (let ((lisp-expression-string (buffer-substring-no-properties (match-beginning 1)
+                                                                          real-match-end-1)))
+              (setf (yas--field-transform parent-field)
+                    (yas--read-lisp (yas--restore-escapes lisp-expression-string))))
+            (push (cons (match-beginning 0) real-match-end-1)
+                  yas--dollar-regions)))))))
+
+(defun yas--transform-mirror-parse-create (snippet)
+  "Parse the \"${n:$(lisp-expression)}\" mirror transformations."
+  (while (re-search-forward yas--transform-mirror-regexp nil t)
+    (let* ((real-match-end-0 (yas--scan-sexps (1+ (match-beginning 0)) 1))
+           (number (string-to-number (match-string-no-properties 1)))
+           (field (and number
+                       (not (zerop number))
+                       (yas--snippet-find-field snippet number)))
+           (brand-new-mirror
+            (and real-match-end-0
+                 field
+                 (yas--make-mirror (yas--make-marker (match-beginning 0))
+                                  (yas--make-marker (match-beginning 0))
+                                  (yas--read-lisp
+                                   (yas--restore-escapes
+                                    (buffer-substring-no-properties (match-beginning 2)
+                                                                    (1- real-match-end-0))))))))
+      (when brand-new-mirror
+        (push brand-new-mirror
+              (yas--field-mirrors field))
+        (yas--calculate-mirrors-in-fields snippet brand-new-mirror)
+        (push (cons (match-beginning 0) real-match-end-0) yas--dollar-regions)))))
+
+(defun yas--simple-mirror-parse-create (snippet)
+  "Parse the simple \"$n\" fields/mirrors/exitmarkers."
+  (while (re-search-forward yas--simple-mirror-regexp nil t)
+    (let ((number (string-to-number (match-string-no-properties 1))))
+      (cond ((zerop number)
+
+             (setf (yas--snippet-exit snippet)
+                   (yas--make-exit (yas--make-marker (match-end 0))))
+             (save-excursion
+               (goto-char (match-beginning 0))
+               (when yas-wrap-around-region
+                 (cond (yas-selected-text
+                        (insert yas-selected-text))
+                       ((and (eq yas-wrap-around-region 'cua)
+                             cua-mode
+                             (get-register ?0))
+                        (insert (prog1 (get-register ?0)
+                                  (set-register ?0 nil))))))
+               (push (cons (point) (yas--exit-marker (yas--snippet-exit snippet)))
+                     yas--dollar-regions)))
+            (t
+             (let ((field (yas--snippet-find-field snippet number)))
+               (if field
+                   (let ((brand-new-mirror (yas--make-mirror
+                                            (yas--make-marker (match-beginning 0))
+                                            (yas--make-marker (match-beginning 0))
+                                            nil)))
+                     (push brand-new-mirror
+                           (yas--field-mirrors field))
+                     (yas--calculate-mirrors-in-fields snippet brand-new-mirror))
+                 (push (yas--make-field number
+                                       (yas--make-marker (match-beginning 0))
+                                       (yas--make-marker (match-beginning 0))
+                                       nil)
+                       (yas--snippet-fields snippet))))
+             (push (cons (match-beginning 0) (match-end 0))
+                   yas--dollar-regions))))))
+
+(defun yas--delete-regions (regions)
+  "Sort disjuct REGIONS by start point, then delete from the back."
+  (mapc #'(lambda (reg)
+            (delete-region (car reg) (cdr reg)))
+        (sort regions
+              #'(lambda (r1 r2)
+                  (>= (car r1) (car r2))))))
+
+(defun yas--update-mirrors (snippet)
+  "Updates all the mirrors of SNIPPET."
+  (save-excursion
+    (let* ((fields (copy-list (yas--snippet-fields snippet)))
+           (field (car fields)))
+      (while field
+        (dolist (mirror (yas--field-mirrors field))
+          (let ((mirror-parent-field (yas--mirror-parent-field mirror)))
+            ;; updatte this mirror
+            ;;
+            (yas--mirror-update-display mirror field)
+            ;; for mirrors-in-fields: schedule a possible
+            ;; parent field for reupdting later on
+            ;;
+            (when mirror-parent-field
+              (add-to-list 'fields mirror-parent-field 'append #'eq))
+            ;; `yas--place-overlays' is needed if the active field and
+            ;; protected overlays have been changed because of insertions
+            ;; in `yas--mirror-update-display'
+            ;;
+            (when (eq field (yas--snippet-active-field snippet))
+              (yas--place-overlays snippet field))))
+        (setq fields (cdr fields))
+        (setq field (car fields))))))
+
+(defun yas--mirror-update-display (mirror field)
+  "Update MIRROR according to FIELD (and mirror transform)."
+
+  (let* ((mirror-parent-field (yas--mirror-parent-field mirror))
+         (reflection (and (not (and mirror-parent-field
+                                    (yas--field-modified-p mirror-parent-field)))
+                          (or (yas--apply-transform mirror field 'empty-on-nil)
+                              (yas--field-text-for-display field)))))
+    (when (and reflection
+               (not (string= reflection (buffer-substring-no-properties (yas--mirror-start mirror)
+                                                                        (yas--mirror-end mirror)))))
+      (goto-char (yas--mirror-start mirror))
+      (yas--inhibit-overlay-hooks
+        (insert reflection))
+      (if (> (yas--mirror-end mirror) (point))
+          (delete-region (point) (yas--mirror-end mirror))
+        (set-marker (yas--mirror-end mirror) (point))
+        (yas--advance-start-maybe (yas--mirror-next mirror) (point))
+        ;; super-special advance
+        (yas--advance-end-of-parents-maybe mirror-parent-field (point))))))
+
+(defun yas--field-update-display (field snippet)
+  "Much like `yas--mirror-update-display', but for fields"
+  (when (yas--field-transform field)
+    (let ((transformed (and (not (eq (yas--field-number field) 0))
+                            (yas--apply-transform field field)))
+          (point (point)))
+      (when (and transformed
+                 (not (string= transformed (buffer-substring-no-properties (yas--field-start field)
+                                                                           (yas--field-end field)))))
+        (setf (yas--field-modified-p field) t)
+        (goto-char (yas--field-start field))
+        (yas--inhibit-overlay-hooks
+          (insert transformed)
+          (if (> (yas--field-end field) (point))
+              (delete-region (point) (yas--field-end field))
+            (set-marker (yas--field-end field) (point))
+            (yas--advance-start-maybe (yas--field-next field) (point)))
+          t)))))
+
+\f
+;;; Post-command hook:
+
+(defun yas--post-command-handler ()
+  "Handles various yasnippet conditions after each command."
+  (cond (yas--protection-violation
+         (goto-char yas--protection-violation)
+         (setq yas--protection-violation nil))
+        ((eq 'undo this-command)
+         ;;
+         ;; After undo revival the correct field is sometimes not
+         ;; restored correctly, this condition handles that
+         ;;
+         (let* ((snippet (car (yas--snippets-at-point)))
+                (target-field (and snippet
+                                   (find-if-not #'(lambda (field)
+                                                    (yas--field-probably-deleted-p snippet field))
+                                                (remove nil
+                                                        (cons (yas--snippet-active-field snippet)
+                                                              (yas--snippet-fields snippet)))))))
+           (when target-field
+             (yas--move-to-field snippet target-field))))
+        ((not (yas--undo-in-progress))
+         ;; When not in an undo, check if we must commit the snippet
+         ;; (user exited it).
+         (yas--check-commit-snippet))))
+\f
+;;; Fancy docs:
+;;
+;; The docstrings for some functions are generated dynamically
+;; depending on the context.
+;;
+(put 'yas-expand  'function-documentation
+     '(yas--expand-from-trigger-key-doc))
+(defun yas--expand-from-trigger-key-doc ()
+  "A doc synthethizer for `yas--expand-from-trigger-key-doc'."
+  (let ((fallback-description
+         (cond ((eq yas-fallback-behavior 'call-other-command)
+                (let* ((yas-minor-mode nil)
+                       (fallback (key-binding (read-kbd-macro yas-trigger-key))))
+                  (or (and fallback
+                           (format " call command `%s'." (pp-to-string fallback)))
+                      " do nothing.")))
+               ((eq yas-fallback-behavior 'return-nil)
+                ", do nothing.")
+               (t
+                ", defer to `yas--fallback-behaviour' :-)"))))
+    (concat "Expand a snippet before point. If no snippet
+expansion is possible,"
+            fallback-description
+            "\n\nOptional argument FIELD is for non-interactive use and is an
+object satisfying `yas--field-p' to restrict the expansion to.")))
+
+(put 'yas-expand-from-keymap  'function-documentation '(yas--expand-from-keymap-doc))
+(defun yas--expand-from-keymap-doc ()
+  "A doc synthethizer for `yas--expand-from-keymap-doc'."
+  (add-hook 'temp-buffer-show-hook 'yas--snippet-description-finish-runonce)
+  (concat "Expand/run snippets from keymaps, possibly falling back to original binding.\n"
+          (when (eq this-command 'describe-key)
+            (let* ((vec (this-single-command-keys))
+                   (templates (mapcan #'(lambda (table)
+                                          (yas--fetch table vec))
+                                      (yas--get-snippet-tables)))
+                   (yas--direct-keymaps nil)
+                   (fallback (key-binding vec)))
+              (concat "In this case, "
+                      (when templates
+                        (concat "these snippets are bound to this key:\n"
+                                (yas--template-pretty-list templates)
+                                "\n\nIf none of these expands, "))
+                      (or (and fallback
+                               (format "fallback `%s' will be called." (pp-to-string fallback)))
+                          "no fallback keybinding is called."))))))
+
+(defun yas--template-pretty-list (templates)
+  (let ((acc)
+        (yas-buffer-local-condition 'always))
+    (dolist (plate templates)
+      (setq acc (concat acc "\n*) "
+                        (propertize (concat "\\\\snippet `" (car plate) "'")
+                                    'yasnippet (cdr plate)))))
+    acc))
+
+(define-button-type 'help-snippet-def
+  :supertype 'help-xref
+  'help-function (lambda (template) (yas--visit-snippet-file-1 template))
+  'help-echo (purecopy "mouse-2, RET: find snippets's definition"))
+
+(defun yas--snippet-description-finish-runonce ()
+  "Final adjustments for the help buffer when snippets are concerned."
+  (yas--create-snippet-xrefs)
+  (remove-hook 'temp-buffer-show-hook 'yas--snippet-description-finish-runonce))
+
+(defun yas--create-snippet-xrefs ()
+  (save-excursion
+    (goto-char (point-min))
+    (while (search-forward-regexp "\\\\\\\\snippet[ \s\t]+`\\([^']+\\)'" nil t)
+      (let ((template (get-text-property (match-beginning 1)
+                                         'yasnippet)))
+        (when template
+          (help-xref-button 1 'help-snippet-def template)
+          (kill-region (match-end 1) (match-end 0))
+          (kill-region (match-beginning 0) (match-beginning 1)))))))
+
+(defun yas--expand-uuid (mode-symbol uuid &optional start end expand-env)
+  "Expand a snippet registered in MODE-SYMBOL's table with UUID.
+
+Remaining args as in `yas-expand-snippet'."
+  (let* ((table (gethash mode-symbol yas--tables))
+         (yas--current-template (and table
+                                    (gethash uuid (yas--table-uuidhash table)))))
+    (when yas--current-template
+      (yas-expand-snippet (yas--template-content yas--current-template)))))
+\f
+;;; Utils
+
+(defvar yas-verbosity 4
+  "Log level for `yas--message' 4 means trace most anything, 0 means nothing.")
+
+(defun yas--message (level message &rest args)
+  (when (> yas-verbosity level)
+    (message (apply #'yas--format message args))))
+
+(defun yas--format (format-control &rest format-args)
+  (apply #'format (concat "[yas] " format-control) format-args))
+
+\f
+;;; Some hacks:
+;;
+;; The functions
+;;
+;; `locate-dominating-file'
+;; `region-active-p'
+;;
+;; added for compatibility in emacsen < 23
+(unless (>= emacs-major-version 23)
+  (unless (fboundp 'region-active-p)
+    (defun region-active-p ()  (and transient-mark-mode mark-active)))
+
+  (unless (fboundp 'locate-dominating-file)
+    (defvar locate-dominating-stop-dir-regexp
+      "\\`\\(?:[\\/][\\/][^\\/]+[\\/]\\|/\\(?:net\\|afs\\|\\.\\.\\.\\)/\\)\\'"
+      "Regexp of directory names which stop the search in `locate-dominating-file'.
+Any directory whose name matches this regexp will be treated like
+a kind of root directory by `locate-dominating-file' which will stop its search
+when it bumps into it.
+The default regexp prevents fruitless and time-consuming attempts to find
+special files in directories in which filenames are interpreted as hostnames,
+or mount points potentially requiring authentication as a different user.")
+
+    (defun locate-dominating-file (file name)
+      "Look up the directory hierarchy from FILE for a file named NAME.
+Stop at the first parent directory containing a file NAME,
+and return the directory.  Return nil if not found."
+      ;; We used to use the above locate-dominating-files code, but the
+      ;; directory-files call is very costly, so we're much better off doing
+      ;; multiple calls using the code in here.
+      ;;
+      ;; Represent /home/luser/foo as ~/foo so that we don't try to look for
+      ;; `name' in /home or in /.
+      (setq file (abbreviate-file-name file))
+      (let ((root nil)
+            (prev-file file)
+            ;; `user' is not initialized outside the loop because
+            ;; `file' may not exist, so we may have to walk up part of the
+            ;; hierarchy before we find the "initial UUID".
+            (user nil)
+            try)
+        (while (not (or root
+                        (null file)
+                        ;; FIXME: Disabled this heuristic because it is sometimes
+                        ;; inappropriate.
+                        ;; As a heuristic, we stop looking up the hierarchy of
+                        ;; directories as soon as we find a directory belonging
+                        ;; to another user.  This should save us from looking in
+                        ;; things like /net and /afs.  This assumes that all the
+                        ;; files inside a project belong to the same user.
+                        ;; (let ((prev-user user))
+                        ;;   (setq user (nth 2 (file-attributes file)))
+                        ;;   (and prev-user (not (equal user prev-user))))
+                        (string-match locate-dominating-stop-dir-regexp file)))
+          (setq try (file-exists-p (expand-file-name name file)))
+          (cond (try (setq root file))
+                ((equal file (setq prev-file file
+                                   file (file-name-directory
+                                         (directory-file-name file))))
+                 (setq file nil))))
+        root))))
+
+;; `c-neutralize-syntax-in-CPP` sometimes fires "End of Buffer" error
+;; (when it execute forward-char) and interrupt the after change
+;; hook. Thus prevent the insert-behind hook of yasnippet to be
+;; invoked. Here's a way to reproduce it:
+
+;; # open a *new* Emacs.
+;; # load yasnippet.
+;; # open a *new* .cpp file.
+;; # input "inc" and press TAB to expand the snippet.
+;; # select the `#include <...>` snippet.
+;; # type inside `<>`
+
+(defadvice c-neutralize-syntax-in-CPP
+  (around yas--mp/c-neutralize-syntax-in-CPP activate)
+  "Adviced `c-neutralize-syntax-in-CPP' to properly
+handle the end-of-buffer error fired in it by calling
+`forward-char' at the end of buffer."
+  (condition-case err
+      ad-do-it
+    (error (message (error-message-string err)))))
+
+;; disable c-electric-* serial command in YAS fields
+(add-hook 'c-mode-common-hook
+          '(lambda ()
+             (dolist (k '(":" ">" ";" "<" "{" "}"))
+               (define-key (symbol-value (make-local-variable 'yas-keymap))
+                 k 'self-insert-command))))
+\f
+;;; Backward compatibility to to yasnippet <= 0.7
+(defvar yas--exported-syms '(;; `defcustom's
+                             ;;
+                             yas-snippet-dirs
+                             yas-prompt-functions
+                             yas-indent-line
+                             yas-also-auto-indent-first-line
+                             yas-snippet-revival
+                             yas-trigger-key
+                             yas-next-field-key
+                             yas-prev-field-key
+                             yas-skip-and-clear-key
+                             yas-triggers-in-field
+                             yas-fallback-behavior
+                             yas-choose-keys-first
+                             yas-choose-tables-first
+                             yas-use-menu
+                             yas-trigger-symbol
+                             yas-wrap-around-region
+                             yas-good-grace
+                             yas-visit-from-menu
+                             yas-expand-only-for-last-commands
+                             yas-field-highlight-face
+
+                             ;; these vars can be customized as well
+                             ;;
+                             yas-keymap
+                             yas-verbosity
+                             yas-extra-modes
+                             yas-key-syntaxes
+                             yas-after-exit-snippet-hook
+                             yas-before-expand-snippet-hook
+                             yas-buffer-local-condition
+
+                             ;; prompting functions
+                             ;;
+                             yas-x-prompt
+                             yas-ido-prompt
+                             yas-no-prompt
+                             yas-completing-prompt
+                             yas-dropdown-prompt
+
+                             ;; interactive functions
+                             ;;
+                             yas-expand
+                             yas-minor-mode
+                             yas-global-mode
+                             yas-direct-keymaps-reload
+                             yas-minor-mode-on
+                             yas-load-directory
+                             yas-reload-all
+                             yas-compile-directory
+                             yas-recompile-all
+                             yas-about
+                             yas-expand-from-trigger-key
+                             yas-expand-from-keymap
+                             yas-insert-snippet
+                             yas-visit-snippet-file
+                             yas-new-snippet
+                             yas-load-snippet-buffer
+                             yas-tryout-snippet
+                             yas-describe-tables
+                             yas-next-field-or-maybe-expand
+                             yas-next-field
+                             yas-prev-field
+                             yas-abort-snippet
+                             yas-exit-snippet
+                             yas-exit-all-snippets
+                             yas-skip-and-clear-or-delete-char
+
+                             ;; symbols that I "exported" for use
+                             ;; in snippets and hookage
+                             ;;
+                             yas-expand-snippet
+                             yas-define-snippets
+                             yas-define-menu
+                             yas-snippet-beg
+                             yas-snippet-end
+                             yas-modified-p
+                             yas-moving-away-p
+                             yas-text
+                             yas-substr
+                             yas-choose-value
+                             yas-key-to-value
+                             yas-throw
+                             yas-verify-value
+                             yas-field-value
+                             yas-text
+                             yas-selected-text
+                             yas-default-from-field
+                             yas-inside-string
+                             yas-unimplemented
+                             yas-define-condition-cache
+                             yas-hippie-try-expand
+
+                             ;; debug definitions
+                             ;; yas-debug-snippet-vars
+                             ;; yas-exterminate-package
+                             ;; yas-debug-test
+
+                             ;; testing definitions
+                             ;; yas-should-expand
+                             ;; yas-should-not-expand
+                             ;; yas-mock-insert
+                             ;; yas-make-file-or-dirs
+                             ;; yas-variables
+                             ;; yas-saving-variables
+                             ;; yas-call-with-snippet-dirs
+                             ;; yas-with-snippet-dirs
+))
+
+(dolist (sym yas--exported-syms)
+  (let ((backported (intern (replace-regexp-in-string "^yas-" "yas/" (symbol-name sym)))))
+    (when (boundp sym)
+      (make-obsolete-variable backported sym "yasnippet 0.8")
+      (defvaralias backported sym))
+    (when (fboundp sym)
+      (make-obsolete backported sym "yasnippet 0.8")
+      (defalias backported sym))))
+
+\f
+(provide 'yasnippet)
+
+;;; yasnippet.el ends here
+;; Local Variables:
+;; coding: utf-8
+;; End: